diff --git a/dist/resources.json b/dist/resources.json index 0637a088..4b303984 100644 --- a/dist/resources.json +++ b/dist/resources.json @@ -1 +1 @@ -[] \ No newline at end of file +[{"name":"sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b","aliases":["sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfNDI2NjM4Nzc3ZTM2OGQzNiA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBsZXQgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICBjbGFzcyBTdG9yYWdlIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5KGluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0SXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywga2V5KSA/IHRoaXNba2V5XSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0SXRlbShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBTdG9yYWdlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLmxvY2FsU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5zZXNzaW9uU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlzU2VhbGVkID0gdHJ1ZTsKICAgIH0pKCRfX19tb2NrXzQyNjYzODc3N2UzNjhkMzYpOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICBCb290c3RyYXBwZXIuYmluZERPTVBhcnNlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEJvb3RzdHJhcHBlci5lbnNFdmVudC5hZGQoWydHbG9iYWw6IE5vbiBTaG9wcGluZyBGbG93J10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlbnNFdmVudENvbnRleHQgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKGVuc0V2ZW50Q29udGV4dCA9PSB3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgZW5zRXZlbnRDb250ZXh0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdmFyIEJvb3RzdHJhcHBlciA9IHdpbmRvd1snQm9vdHN0cmFwcGVyJ107CiAgICAgICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmRhdGEucmVzb2x2ZShbCiAgICAgICAgICAgICAgICAgICAgJzEzOTE5JywKICAgICAgICAgICAgICAgICAgICAnNTk5NDYnLAogICAgICAgICAgICAgICAgICAgICc1OTk0NycsCiAgICAgICAgICAgICAgICAgICAgJzE2MzM2JywKICAgICAgICAgICAgICAgICAgICAnMTM2NDInLAogICAgICAgICAgICAgICAgICAgICc1NTQxNScKICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChtYW5hZ2VfMTM5MTksIG1hbmFnZV81OTk0NiwgbWFuYWdlXzU5OTQ3LCBtYW5hZ2VfMTYzMzYsIG1hbmFnZV8xMzY0MiwgbWFuYWdlXzU1NDE1KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuc1ZhcjAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYW5hZ2VfMTM5MTk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5zVmFyMSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hbmFnZV81OTk0NjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBlbnNWYXIyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFuYWdlXzU5OTQ3OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuc1ZhcjMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYW5hZ2VfMTYzMzY7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5zVmFyNCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hbmFnZV8xMzY0MjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBlbnNWYXI1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFuYWdlXzU1NDE1OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIG9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9jNWI0Y2E5MDZkMzBkZTUzID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYzViNGNhOTA2ZDMwZGU1MykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfNDI2NjM4Nzc3ZTM2OGQzNi5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmNyaXRlb19xID0gd2luZG93LmNyaXRlb19xIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NvdW50X2lkID0gJycuc3BsaXQoJywnKSwgbG9jYWxfYWNjb3VudHNfYXJyYXkgPSBbXSwgZW1haWxUeXBlID0gJ2hhc2hlZCcsIGN1c3RvbURhdGFPYmogPSB7fSwgc2V0RGF0YU9iaiA9IHVuZGVmaW5lZCwgY3VzdE9iaiA9IHVuZGVmaW5lZCwgZW1haWxPYmogPSB1bmRlZmluZWQsIGxvZ2luT2JqID0gdW5kZWZpbmVkLCBhY2NvdW50VHlwZSA9ICduYW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhT2JqWyd0YXJnZXQnXSA9IGVuc1ZhcjMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhT2JqWydwYWdldHlwZSddID0gZW5zVmFyNC5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGFPYmpbJ2V4dHJhX2NyaXRlbyddID0gZW5zVmFyNS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NvdW50T2JqID0geyAnZXZlbnQnOiAnc2V0QWNjb3VudCcgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjb3VudFR5cGUgPT0gJ25hbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRPYmouYWNjb3VudCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50T2JqLmFjY291bnQuYW4gPSBlbnNWYXIwLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRPYmouYWNjb3VudC5jbiA9IGVuc1ZhcjEuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudE9iai5hY2NvdW50LmxuID0gZW5zVmFyMi5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjb3VudF9pZC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FjY291bnRzX2FycmF5W2ldID0gcGFyc2VJbnQoYWNjb3VudF9pZFtpXSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50T2JqLmFjY291bnQgPSBsb2NhbF9hY2NvdW50c19hcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpdGVUeXBlT2JqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnQnOiAnc2V0U2l0ZVR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdkJyA/ICdkJyA6ICdkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0T2JqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50JzogJ3NldEN1c3RvbWVySWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsT2JqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50JzogZW1haWxUeXBlID09PSAncGxhaW50ZXh0JyA/ICdzZXRFbWFpbCcgOiAnc2V0SGFzaGVkRW1haWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJzogJycuc3BsaXQoJywnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW5PYmogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnQnOiBlbWFpbFR5cGUgPT09ICdwbGFpbnRleHQnID8gJ3NldExvZ2luJyA6ICdzZXRIYXNoZWRMb2dpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9naW4nOiAnJy5zcGxpdCgnLCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpZXdPYmogPSB7ICdldmVudCc6ICd2aWV3SG9tZScgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdPYmoudXNlcl9zZWdtZW50ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3T2JqLm5icmEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdPYmoubmJyYyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld09iai5uYnJiID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCBpbiBjdXN0b21EYXRhT2JqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VzdG9tRGF0YU9iai5oYXNPd25Qcm9wZXJ0eShkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YU9iaiA9IGN1c3RvbURhdGFPYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhT2JqLmV2ZW50ID0gJ3NldERhdGEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZW9fcS5wdXNoKGFjY291bnRPYmosIHNldERhdGFPYmosIHNpdGVUeXBlT2JqLCBjdXN0T2JqLCBlbWFpbE9iaiwgbG9naW5PYmosIHZpZXdPYmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYzViNGNhOTA2ZDMwZGU1MykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF9jNWI0Y2E5MDZkMzBkZTUzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIEJvb3RzdHJhcHBlci5sb2FkU2NyaXB0Q2FsbGJhY2soJy8vc3RhdGljLmNyaXRlby5uZXQvanMvbGQvbGQuanMnLCBvbmxvYWQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIDI5MTU0MDYsIDYwMzg4Nyk7CiAgICB9KCkpCn0="},{"name":"sugarcoat-5e95376640055da26becf35ea98d15e6","aliases":["sugarcoat-5e95376640055da26becf35ea98d15e6"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfZDEzZThmOWM5MTA5ZDU1ZSA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19kMTNlOGY5YzkxMDlkNTVlKTsKICAgIGNvbnN0ICRfX19tb2NrXzQyNjYzODc3N2UzNjhkMzYgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgbGV0IGlzU2VhbGVkID0gZmFsc2U7CiAgICAgICAgY2xhc3MgU3RvcmFnZSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgaWYgKGlzU2VhbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGtleShpbmRleCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGtleXNbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldEl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGtleSkgPyB0aGlzW2tleV0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1trZXldID0gU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1vdmVJdGVtKGtleSkgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogU3RvcmFnZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5sb2NhbFN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMuc2Vzc2lvblN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICB9KSgkX19fbW9ja180MjY2Mzg3NzdlMzY4ZDM2KTsKICAgIGNvbnN0ICRfX19tb2NrX2I0YmExNTYwN2I1MDEzN2IgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgZmV0Y2ggPSBhc3luYyAocmVzb3VyY2UsIGluaXQgPSBudWxsKSA9PiB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCcpOwogICAgICAgIH07CiAgICAgICAgZXhwb3J0cy5mZXRjaCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogZmV0Y2gsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgIH0pKCRfX19tb2NrX2I0YmExNTYwN2I1MDEzN2IpOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICBCb290c3RyYXBwZXIuYmluZEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICBCb290c3RyYXBwZXIucmVnaXN0ZXJEYXRhRGVmaW5pdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBCb290c3RyYXBwZXIuZGF0YS5kZWZpbmUoewogICAgICAgICAgICAgICAgICAgIGV4dHJhY3Q6IGZ1bmN0aW9uIGZhY2Vib29rX3BpeGVsX2lkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2luID0gd2luZG93LCBhZGwgPSB3aW4uYW5hbHl0aWNzZGF0YWxheWVyLCBmYWNlYm9va1BpeGVsSWQgPSAnNzgxMDg3NTkxOTE0ODMzJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkbC5hcHBlbnZpcm9ubWVudCA9PT0gJ3Rlc3QnIHx8IGFkbC5hcHBlbnZpcm9ubWVudCA9PT0gJ3N0YWdlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2Vib29rUGl4ZWxJZCA9ICczNTM1ODI0NDg0MTc0NzcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjZWJvb2tQaXhlbElkOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPyB2YWwgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGxvYWQ6ICdwYWdlJywKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBCb290c3RyYXBwZXIuZGF0YS5ib3R0b21PZkJvZHlUcmlnZ2VyLAogICAgICAgICAgICAgICAgICAgIGRhdGFEZWZOYW1lOiAnZmFjZWJvb2stcGl4ZWwtaWQnLAogICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246ICdjb21wdXRlZCcsCiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTWFuYWdlJywKICAgICAgICAgICAgICAgICAgICBwcml2OiAnZmFsc2UnCiAgICAgICAgICAgICAgICB9LCB7IGlkOiAnNjIzNTknIH0pOwogICAgICAgICAgICB9LCA2MjM1OSk7CiAgICAgICAgfSwgLTEsIC0xKTsKICAgICAgICBCb290c3RyYXBwZXIuYmluZEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICBCb290c3RyYXBwZXIucmVnaXN0ZXJEYXRhRGVmaW5pdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBCb290c3RyYXBwZXIuZGF0YS5kZWZpbmUoewogICAgICAgICAgICAgICAgICAgIGV4dHJhY3Q6IGZ1bmN0aW9uIGRpc3BsYXlsb2NhbGVfbGFuZ3VhZ2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3csIHV0aWxzID0gd2luLmhhRW5zaWdodGVuVXRpbHMsIGRpc3BsYXlMb2NhbGUgPSB1dGlscy5hZGxFeHRyYWN0b3IoJ2Rpc3BsYXlsb2NhbGUnKSwgbG9jYWxlUGFydHMgPSBkaXNwbGF5TG9jYWxlLnNwbGl0KCdfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5TG9jYWxlICYmIGxvY2FsZVBhcnRzLmxlbmd0aCA9PT0gMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGVQYXJ0c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPyB2YWwgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGxvYWQ6ICdwYWdlJywKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBCb290c3RyYXBwZXIuZGF0YS5ib3R0b21PZkJvZHlUcmlnZ2VyLAogICAgICAgICAgICAgICAgICAgIGRhdGFEZWZOYW1lOiAnZGlzcGxheWxvY2FsZS1sYW5ndWFnZScsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogJ2NvbXB1dGVkJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdNYW5hZ2UnLAogICAgICAgICAgICAgICAgICAgIHByaXY6ICdmYWxzZScKICAgICAgICAgICAgICAgIH0sIHsgaWQ6ICc1OTk0NycgfSk7CiAgICAgICAgICAgIH0sIDU5OTQ3KTsKICAgICAgICB9LCAtMSwgLTEpOwogICAgICAgIEJvb3RzdHJhcHBlci5iaW5kRGVwZW5kZW5jeURPTUxvYWRlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEJvb3RzdHJhcHBlci5lbnNFdmVudC5hZGQoWydHbG9iYWw6IFBhZ2V2aWV3J10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlbnNFdmVudENvbnRleHQgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKGVuc0V2ZW50Q29udGV4dCA9PSB3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgZW5zRXZlbnRDb250ZXh0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdmFyIEJvb3RzdHJhcHBlciA9IHdpbmRvd1snQm9vdHN0cmFwcGVyJ107CiAgICAgICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uICh3aW4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYnMgPSB3aW4uQm9vdHN0cmFwcGVyLCB1dGlscyA9IHdpbi5oYUVuc2lnaHRlblV0aWxzLCBzaG91bGRTeW5jQ29va2llID0gJ3RhX3RpbWVvdXQnLCBzeW5jQ29va2llVmFsdWUgPSB1dGlscy5nZXRDb29raWUoc2hvdWxkU3luY0Nvb2tpZSksIHRpbWVvdXQgPSA2MCwgdGFwQWRVcmwsIGV2ZW50TmFtZSwgdmlzaXRvcklkLCByZXBsYWNlbWVudFN0cmluZywgbW9uaWtlcmJyYW5kLCBzeW5jUGF5bG9hZCwgZW5jb2RlZFN5bmNVcmwsIHJlcVVybDsKICAgICAgICAgICAgICAgICAgICBpZiAoc3luY0Nvb2tpZVZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcEFkVXJsID0gJ2h0dHBzOi8vcGl4ZWwudGFwYWQuY29tL2lkc3luYy9leC9yZWNlaXZlP3BhcnRuZXJfaWQ9MjQ4NSZwYXJ0bmVyX2RldmljZV9pZD17SEFWX0lEfSZwYXJ0bmVyX3VybD17RU5DT0RFRF9DQl9VUkx9JzsKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gJ3N5bmM6dGFwYWQuc2VuZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JJZCA9IHV0aWxzLmdldFZpc2l0b3JJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudFN0cmluZyA9ICdSWUFOUkVQTEFDRU1FMTIzJzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9uaWtlcmJyYW5kID0gdXRpbHMuYWRsRXh0cmFjdG9yKCdtb25pa2VyYnJhbmQnLCAnLTEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3luY1BheWxvYWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXBhZGlkOiByZXBsYWNlbWVudFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbmlrZXJicmFuZDogbW9uaWtlcmJyYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRTeW5jVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHV0aWxzLmdlbmVyYXRlQ2xpZW50TG9nZ2luZ1JlcXVlc3QoZXZlbnROYW1lLCBzeW5jUGF5bG9hZCwgZmFsc2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxVXJsID0gdGFwQWRVcmwucmVwbGFjZSgne0hBVl9JRH0nLCB2aXNpdG9ySWQpLnJlcGxhY2UoJ3tFTkNPREVEX0NCX1VSTH0nLCBlbmNvZGVkU3luY1VybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcVVybCA9IHJlcVVybC5yZXBsYWNlKHJlcGxhY2VtZW50U3RyaW5nLCAnJHtUQV9ERVZJQ0VfSUR9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJzLmltYWdlUmVxdWVzdChyZXFVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRDb29raWUoc2hvdWxkU3luY0Nvb2tpZSwgJzEnLCB1dGlscy5nZXRMb2NhdGlvbkhvc3RuYW1lKCksIHRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0od2luZG93KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIDI1OTczNDgsIFszMzgzMzc0XSwgNDkwMzQyLCBbMzQ5OTM4XSk7CiAgICAgICAgQm9vdHN0cmFwcGVyLmJpbmRET01QYXJzZWQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBCb290c3RyYXBwZXIuZW5zRXZlbnQuYWRkKFsnR2xvYmFsOiBQYWdldmlldyddLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5zRXZlbnRDb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgICAgIGlmIChlbnNFdmVudENvbnRleHQgPT0gd2luZG93KQogICAgICAgICAgICAgICAgICAgIGVuc0V2ZW50Q29udGV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICAgICAgdmFyIGVuc2lnaHRlbk9wdGlvbnMgPSBCb290c3RyYXBwZXIuZW5zaWdodGVuT3B0aW9uczsKICAgICAgICAgICAgICAgIHZhciBwYXJhbV90aSA9ICc1NjY4OTc1JzsKICAgICAgICAgICAgICAgIHZhciBwYXJhbV9ndiA9ICcnOwogICAgICAgICAgICAgICAgdmFyIHBhcmFtX2VhID0gJyc7CiAgICAgICAgICAgICAgICB2YXIgcGFyYW1fZWMgPSAnJzsKICAgICAgICAgICAgICAgIHZhciBwYXJhbV9lbCA9ICcnOwogICAgICAgICAgICAgICAgdmFyIHBhcmFtX2V2ID0gJyc7CiAgICAgICAgICAgICAgICB2YXIgcGFnZUxvYWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIGFycmF5TmFtZSA9ICcnOwogICAgICAgICAgICAgICAgdmFyIG9ubG9hZF9mdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzNlMGJlYTZjZjE5OWFkZWYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKSwgJF9fX29sZF80ZjIzZTI0ODc3ZmY1NmQzID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfYzE4M2EwMGMxOThjNTc3MSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8zZTBiZWE2Y2YxOTlhZGVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfZDEzZThmOWM5MTA5ZDU1ZS5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80ZjIzZTI0ODc3ZmY1NmQzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfZDEzZThmOWM5MTA5ZDU1ZS5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9jMTgzYTAwYzE5OGM1NzcxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrXzQyNjYzODc3N2UzNjhkMzYubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5TmFtZSA9PT0gJ3VldHEnIHx8IGFycmF5TmFtZSA9PT0gJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHdpbmRvdy51ZXRxIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJyYXlOYW1lICE9PSB1bmRlZmluZWQgJiYgYXJyYXlOYW1lICE9ICd1ZXRxJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gd2luZG93LmFycmF5TmFtZSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0geyB0aTogcGFyYW1fdGkgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucSA9IG5hbWUsIG5hbWUgPSBuZXcgVUVUKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VMb2FkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUucHVzaCgncGFnZUxvYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhbF9vYmplY3QgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2d2ID8gbG9jYWxfb2JqZWN0WydndiddID0gKygrcGFyYW1fZ3YpLnRvRml4ZWQoMykgOiAnJywgcGFyYW1fZWEgPyBsb2NhbF9vYmplY3RbJ2VhJ10gPSBwYXJhbV9lYSA6ICcnLCBwYXJhbV9lYyA/IGxvY2FsX29iamVjdFsnZWMnXSA9IHBhcmFtX2VjIDogJycsIHBhcmFtX2VsID8gbG9jYWxfb2JqZWN0WydlbCddID0gcGFyYW1fZWwgOiAnJywgcGFyYW1fZXYgPyBsb2NhbF9vYmplY3RbJ2V2J10gPSBwYXJhbV9ldiA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGxvY2FsX29iamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8zZTBiZWE2Y2YxOTlhZGVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8zZTBiZWE2Y2YxOTlhZGVmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzRmMjNlMjQ4NzdmZjU2ZDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzRmMjNlMjQ4NzdmZjU2ZDMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYzE4M2EwMGMxOThjNTc3MSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2MxODNhMDBjMTk4YzU3NzEpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGxvY2FsX3Njcl91cmwgPSAnLy8nICsgJ2JhdC5iaW5nLmNvbS9iYXQuanMnOwogICAgICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmxvYWRTY3JpcHRDYWxsYmFjayhsb2NhbF9zY3JfdXJsLCBvbmxvYWRfZnVuY3Rpb24pOwogICAgICAgICAgICB9KTsKICAgICAgICB9LCAyNDg2OTExLCA1MTM5NzgpOwogICAgICAgIEJvb3RzdHJhcHBlci5iaW5kRE9NTG9hZGVkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmVuc0V2ZW50LmFkZChbJ0dsb2JhbDogUGFnZXZpZXcgW2Vzc2VudGlhbF0nXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGVuc0V2ZW50Q29udGV4dCA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoZW5zRXZlbnRDb250ZXh0ID09IHdpbmRvdykKICAgICAgICAgICAgICAgICAgICBlbnNFdmVudENvbnRleHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB2YXIgQm9vdHN0cmFwcGVyID0gd2luZG93WydCb290c3RyYXBwZXInXTsKICAgICAgICAgICAgICAgIHZhciBlbnNpZ2h0ZW5PcHRpb25zID0gQm9vdHN0cmFwcGVyLmVuc2lnaHRlbk9wdGlvbnM7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciBicyA9IHdpbi5Cb290c3RyYXBwZXIsIHV0aWxzID0gd2luLmhhRW5zaWdodGVuVXRpbHMsIHZpc2l0b3JJZCA9IHV0aWxzLmdldFZpc2l0b3JJZCgpLCBob3N0bmFtZSA9IHV0aWxzLmdldExvY2F0aW9uSG9zdG5hbWUoKSwgaGFBcHBFbnYgPSB1dGlscy5hZGxFeHRyYWN0b3IoJ2FwcGVudmlyb25tZW50JywgJycpLCBlbnZNYXBwaW5nID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDogJ2RldicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uOiAncHJvZCcKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdHJhdmVsUGl4ZWxQYXJhbXMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkOiB2aXNpdG9ySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQbGF0Zm9ybTogJ2hvbWVhd2F5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwaWQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFwaWQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwVXNlcklkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtY3Y6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdXRoSWQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxIYXNoOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlZ0VudiA9IGVudk1hcHBpbmdbaGFBcHBFbnZdOwogICAgICAgICAgICAgICAgICAgIGlmICghZWdFbnYpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBicy5pbnNlcnRTY3JpcHQoJ2h0dHBzOi8vYi50cmF2ZWwtYXNzZXRzLmNvbS90cmF2ZWwtcGl4ZWwtanMvMS4wLjAvYXBwLmpzJyk7CiAgICAgICAgICAgICAgICAgICAgd2luLnRyYXZlbFBpeGVsID0gd2luLnRyYXZlbFBpeGVsIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHdpbi50cmF2ZWxQaXhlbC5wdXNoKGZ1bmN0aW9uIChUcmF2ZWxQaXhlbFdhaXRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzA2YjJiOWY5YWVmYjcyODAgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZmV0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzA2YjJiOWY5YWVmYjcyODApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2ZldGNoJywgJF9fX21vY2tfYjRiYTE1NjA3YjUwMTM3Yi5mZXRjaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2FpdGVyID0gbmV3IFRyYXZlbFBpeGVsV2FpdGVyKGhvc3RuYW1lLCBlZ0Vudik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGVyLmxvYWRYZGlkQXBpKHRyYXZlbFBpeGVsUGFyYW1zKS50aGVuKGZ1bmN0aW9uICh4ZGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luLmVkYXAucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3hkaWQuc2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB4ZGlkOiB4ZGlkIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMDZiMmI5ZjlhZWZiNzI4MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnZmV0Y2gnLCAkX19fb2xkXzA2YjJiOWY5YWVmYjcyODApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSh3aW5kb3cpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgMzI1NTkwOCwgNTkxNDUzKTsKICAgICAgICBCb290c3RyYXBwZXIuYmluZEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICBCb290c3RyYXBwZXIucmVnaXN0ZXJEYXRhRGVmaW5pdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBCb290c3RyYXBwZXIuZGF0YS5kZWZpbmUoewogICAgICAgICAgICAgICAgICAgIGV4dHJhY3Q6IGZ1bmN0aW9uIGdhX21hcmtldGluZ190cmFja2luZ19pZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdywgYWRsID0gd2luLmFuYWx5dGljc2RhdGFsYXllciwgdHJhY2tpbmdJZCA9ICdVQS0xNjA3MDUzOTQtMic7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGwuYXBwZW52aXJvbm1lbnQgPT09ICdwcm9kdWN0aW9uJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nSWQgPSAnVUEtMTYwNzA1Mzk0LTEnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tpbmdJZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsID8gdmFsIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBsb2FkOiAncGFnZScsCiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogQm9vdHN0cmFwcGVyLmRhdGEuYm90dG9tT2ZCb2R5VHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBkYXRhRGVmTmFtZTogJ2dhLW1hcmtldGluZy10cmFja2luZy1pZCcsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogJ2NvbXB1dGVkJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdNYW5hZ2UnLAogICAgICAgICAgICAgICAgICAgIHByaXY6ICdmYWxzZScKICAgICAgICAgICAgICAgIH0sIHsgaWQ6ICc2MjQ5NycgfSk7CiAgICAgICAgICAgIH0sIDYyNDk3KTsKICAgICAgICB9LCAtMSwgLTEpOwogICAgICAgIEJvb3RzdHJhcHBlci5iaW5kSW1tZWRpYXRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIEJvb3RzdHJhcHBlciA9IHdpbmRvd1snQm9vdHN0cmFwcGVyJ107CiAgICAgICAgICAgIHZhciBlbnNpZ2h0ZW5PcHRpb25zID0gQm9vdHN0cmFwcGVyLmVuc2lnaHRlbk9wdGlvbnM7CiAgICAgICAgICAgIEJvb3RzdHJhcHBlci5yZWdpc3RlckRhdGFEZWZpbml0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIEJvb3RzdHJhcHBlci5kYXRhLmRlZmluZSh7CiAgICAgICAgICAgICAgICAgICAgZXh0cmFjdDogZnVuY3Rpb24gY3JpdGVvX2luY3JlbWVudGFsaXR5X3Rlc3RfYnVja2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gd2luZG93Ll9fQUJBQ1VTX18uSEFfSU5DUl9DUklURU8uYnVja2V0LmJ1Y2tldFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgKyByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsID8gdmFsIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBsb2FkOiAnaW5zdGFuY2UnLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IEJvb3RzdHJhcHBlci5kYXRhLmJvdHRvbU9mQm9keVRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgZGF0YURlZk5hbWU6ICdjcml0ZW8taW5jcmVtZW50YWxpdHktdGVzdC1idWNrZXQnLAogICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb246ICdjb21wdXRlZCcsCiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTWFuYWdlJywKICAgICAgICAgICAgICAgICAgICBwcml2OiAnZmFsc2UnCiAgICAgICAgICAgICAgICB9LCB7IGlkOiAnNTU0MTUnIH0pOwogICAgICAgICAgICB9LCA1NTQxNSk7CiAgICAgICAgfSwgLTEsIC0xKTsKICAgICAgICBCb290c3RyYXBwZXIuYmluZEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEJvb3RzdHJhcHBlci5lbnNFdmVudC5hZGQoWydHbG9iYWw6IFBhZ2V2aWV3J10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlbnNFdmVudENvbnRleHQgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKGVuc0V2ZW50Q29udGV4dCA9PSB3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgZW5zRXZlbnRDb250ZXh0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdmFyIEJvb3RzdHJhcHBlciA9IHdpbmRvd1snQm9vdHN0cmFwcGVyJ107CiAgICAgICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uICh3aW4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdXRpbHMgPSB3aW4uaGFFbnNpZ2h0ZW5VdGlscywgYnMgPSB3aW4uQm9vdHN0cmFwcGVyLCBkYXRhX2RlZmluaXRpb25fZGNfYWN0aXZpdHlfaWQgPSA0ODA4MiwgZGF0YV9kZWZpbml0aW9uX3Zpc2l0b3JpZCA9IDQzNDYzLCBkYXRhX2RlZmluaXRpb25fZ2FfdHJhY2tpbmdfaWQgPSA2MjQ5NywgbG9jYWxfcGFyYW1zID0ge30sIGhvdGVsQWRzQWNjb3VudElkID0gdXRpbHMuYWRsRXh0cmFjdG9yKCdtb25pa2VyYnJhbmQnKSA9PT0gJ3ZyYm8nID8gJ0hBLTExNzM3ODI3ODQnIDogJ0hBLTE5OTU4NTg4NTMnLCBob3RlbEFkc0FjY291bnRJZDIgPSAnSEEtMTg1MDYwMDY0OCcsIGFkV29yZHNBY2NvdW50SWQgPSAnQVctOTU2NDUxNTQ2JywgYWRXb3Jkc0FjY291bnRJZDIgPSAnQVctODM4NDQ2NjIxJywgYWRXb3Jkc0FjY291bnRJZDMgPSAnQVctNjE5ODAwNTM0JywgYWRXb3Jkc0RhdGFMYXllciA9ICdhZHdvcmRzRGF0YUxheWVyJywgZG91YmxlQ2xpY2tBY2NvdW50SWQgPSAnREMtJyArIGJzLmRhdGEucmVzb2x2ZShkYXRhX2RlZmluaXRpb25fZGNfYWN0aXZpdHlfaWQpLCBnYVRyYWNraW5nSWQgPSBicy5kYXRhLnJlc29sdmUoZGF0YV9kZWZpbml0aW9uX2dhX3RyYWNraW5nX2lkKSwgdXJsID0gJy8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9JyArIGFkV29yZHNBY2NvdW50SWQgKyAnJmw9JyArIGFkV29yZHNEYXRhTGF5ZXIsIGRvbWFpbnMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWJyaXRlbC5mcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWx1Z3VldGVtcG9yYWRhLmNvbS5icicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zld28tZGlyZWt0LmRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5jYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuYXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LmNhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5jby5ueicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuY28udWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuY29tLmFyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5jb20uYXUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LmNvbS5teCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuY29tLnBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5kaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LmZpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5ncicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LmxrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5ubCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkubm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVhd2F5LnBsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lYXdheS5wdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9tZWF3YXkuc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVsaWRheXMuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF5ei5jb20uYXUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhY2F0aW9ucmVudGFscy5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZyYm8uY29tJwogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhcmFtcy51c2VyX2lkID0gYnMuZGF0YS5yZXNvbHZlKGRhdGFfZGVmaW5pdGlvbl92aXNpdG9yaWQpOwogICAgICAgICAgICAgICAgICAgIHdpblthZFdvcmRzRGF0YUxheWVyXSA9IHdpblthZFdvcmRzRGF0YUxheWVyXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYWxsYmFja0Z1bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbi5ndGFnKCdjb25maWcnLCBhZFdvcmRzQWNjb3VudElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2NvbmZpZycsIGFkV29yZHNBY2NvdW50SWQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2NvbmZpZycsIGFkV29yZHNBY2NvdW50SWQzKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2NvbmZpZycsIGRvdWJsZUNsaWNrQWNjb3VudElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2NvbmZpZycsIGhvdGVsQWRzQWNjb3VudElkLCB7ICdjb252ZXJzaW9uX2Nvb2tpZV9wcmVmaXgnOiAnX2hhJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2NvbmZpZycsIGhvdGVsQWRzQWNjb3VudElkMiwgeyAnY29udmVyc2lvbl9jb29raWVfcHJlZml4JzogJ19oYTInIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB3aW4uZ3RhZygnY29uZmlnJywgZ2FUcmFja2luZ0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2V2ZW50JywgJ2NvbnZlcnNpb24nLCBsb2NhbF9wYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbi5ndGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbi5ndGFnID0gd2luLmd0YWcgfHwgZnVuY3Rpb24gZ3RhZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpblthZFdvcmRzRGF0YUxheWVyXS5wdXNoKGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbi5ndGFnKCdzZXQnLCAnbGlua2VyJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvbWFpbnMnOiBkb21haW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlY29yYXRlX2Zvcm1zJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luLmd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJzLmxvYWRTY3JpcHRDYWxsYmFjayh1cmwsIGNhbGxiYWNrRnVuYyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRnVuYygpOwogICAgICAgICAgICAgICAgfSh3aW5kb3cpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgMzI5MzkzNSwgNTYyMzc5KTsKICAgICAgICBCb290c3RyYXBwZXIuYmluZERPTUxvYWRlZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICAoZnVuY3Rpb24gKHdpbikgewogICAgICAgICAgICAgICAgdmFyIFRBR0dJTkdfUkVRVUVTVF9USU1FT1VUID0gMjAwMCwgR0xPQkFMX0VWRU5UX1BSRUZJWCA9ICdHbG9iYWwnLCBFU1NFTlRJQUxfVEFHX0VWRU5UX1NVRkZJWCA9ICcgW2Vzc2VudGlhbF0nLCB1dGlscyA9IHdpbi5oYUVuc2lnaHRlblV0aWxzLCBicyA9IHdpbi5Cb290c3RyYXBwZXIsIG1vbmlrZXJicmFuZCA9IHV0aWxzLmFkbEV4dHJhY3RvcignbW9uaWtlcmJyYW5kJywgJycpLCBhbmFseXRpY3NicmFuZCA9IHV0aWxzLmFkbEV4dHJhY3RvcignYW5hbHl0aWNzYnJhbmQnLCAnJyksIHJlZmVycmVyID0gdXRpbHMuZ2V0RG9jdW1lbnRSZWZlcnJlcigpLCBicmFuZDsKICAgICAgICAgICAgICAgIGJyYW5kID0gYW5hbHl0aWNzYnJhbmQgfHwgbW9uaWtlcmJyYW5kOwogICAgICAgICAgICAgICAgYnJhbmQgPSBicmFuZC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKCFicmFuZCB8fCBicmFuZCA9PT0gJy0xJykgewogICAgICAgICAgICAgICAgICAgIGJzLnJlcG9ydEV4Y2VwdGlvbignZWRhcCBldmVudCB0cmFuc2xhdG9yIHJlcXVpcmVzIGFuYWx5dGljc2JyYW5kIG9yIG1vbmlrZXJicmFuZCB0byBiZSBzZXQgaW4gdGhlIEFETCcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpbi5lZGFwID0gd2luLmVkYXAgfHwgW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsaXN0ZW5lckNvbXBsZXRlKGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIFRBR0dJTkdfUkVRVUVTVF9USU1FT1VUKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyaWdnZXJBbGxFdmVudHMoZXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgIHV0aWxzLnJ1bklmRnVuY3Rpb25hbENvb2tpZXNBbGxvd2VkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGo7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBldmVudE5hbWVzLmxlbmd0aDsgaisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMuZW5zRXZlbnQudHJpZ2dlcihldmVudE5hbWVzW2pdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgYnMuZW5zRXZlbnQudHJpZ2dlcihldmVudE5hbWVzW2ldICsgRVNTRU5USUFMX1RBR19FVkVOVF9TVUZGSVgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2luLmVkYXAucHVzaChmdW5jdGlvbiAoZWRhcCkgewogICAgICAgICAgICAgICAgICAgIGVkYXAub24oJ3Jlc2VydmF0aW9uLnJlcXVlc3Quc3VibWl0JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFN0ciA9ICc6IEJvb2tpbmcgUmVxdWVzdCBTdWJtaXQnLCBhbnlTdHIgPSAnIChBbnkpJywgZXZlbnROYW1lcywgbGlzdGluZ1R5cGUsIGxpc3RpbmdUeXBlU3RyLCBicmFuZEV2ZW50TmFtZSwgZ2xvYmFsRXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zdG9yZUV2ZW50RGF0YSgncmVzZXJ2YXRpb25pZCcsIGRhdGEucmVzZXJ2YXRpb25pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdiaWR0YXJnZXQnLCBkYXRhLmJpZHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdmdWxsb3JkZXJyZW50YWxyYXRlJywgZGF0YS5mdWxsb3JkZXJyZW50YWxyYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc3RvcmVFdmVudERhdGEoJ2N1cnJlbmN5JywgZGF0YS5jdXJyZW5jeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdvcmRlcnRvdGFsJywgZGF0YS5vcmRlcnRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc3RvcmVFdmVudERhdGEoJ2xlbmd0aG9mc3RheScsIGRhdGEubGVuZ3Rob2ZzdGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc3RvcmVFdmVudERhdGEoJ29ubGluZXBheW1lbnRzJywgZGF0YS5vbmxpbmVwYXltZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdlZGFwZXZlbnRpZCcsIGRhdGEuZWRhcGV2ZW50aWQpOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0aW5nVHlwZSA9IHV0aWxzLmdldExpc3RpbmdUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RpbmdUeXBlU3RyID0gJyAoJyArIGxpc3RpbmdUeXBlLnRvVXBwZXJDYXNlKCkgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kRXZlbnROYW1lID0gYnJhbmQgKyBldmVudFN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnROYW1lID0gR0xPQkFMX0VWRU5UX1BSRUZJWCArIGV2ZW50U3RyOwogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRFdmVudE5hbWUgKyBhbnlTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZEV2ZW50TmFtZSArIGxpc3RpbmdUeXBlU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnROYW1lICsgYW55U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRXZlbnROYW1lICsgbGlzdGluZ1R5cGVTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhldmVudE5hbWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJDb21wbGV0ZShkb25lKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlZGFwLm9uKCdpbnF1aXJ5LnN1Y2Nlc3MnLCBmdW5jdGlvbiAoZGF0YSwgc2V0QXN5bmMsIGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50U3RyID0gJzogSW5xdWlyeSBTdWNjZXNzJywgZXZlbnROYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhldmVudE5hbWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJDb21wbGV0ZShkb25lKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlZGFwLm9uKCdsaXN0aW5nLm9uYm9hcmRpbmcuc3VibWl0JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdPckV4aXN0aW5nLCBicmFuZEV2ZW50TmFtZSwgZ2xvYmFsRXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5uZXdzdXBwbGllciA9PT0gJ3RydWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3JFeGlzdGluZyA9ICdOZXcnOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhLm5ld3N1cHBsaWVyID09PSAnZmFsc2UnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3JFeGlzdGluZyA9ICdFeGlzdGluZyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdPckV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zdG9yZUV2ZW50RGF0YSgnYmlkdGFyZ2V0JywgZGF0YS5iaWR0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc3RvcmVFdmVudERhdGEoJ2JpZHRhcmdldHV1aWQnLCBkYXRhLmJpZHRhcmdldHV1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc3RvcmVFdmVudERhdGEoJ25ld3N1cHBsaWVyJywgZGF0YS5uZXdzdXBwbGllcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxFdmVudE5hbWUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0VWRU5UX1BSRUZJWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yRXhpc3RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBTdXBwbGllciBPbmJvYXJkaW5nIENvbXBsZXRpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRFdmVudE5hbWUgPSBnbG9iYWxFdmVudE5hbWUucmVwbGFjZShHTE9CQUxfRVZFTlRfUFJFRklYLCBicmFuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZEV2ZW50TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxFdmVudE5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ29tcGxldGUoZG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZWRhcC5vbigndXNlci5hY2NvdW50LmNyZWF0ZWQnLCBmdW5jdGlvbiAoZGF0YSwgc2V0QXN5bmMsIGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50RGF0YVByb3BzVG9TdGFzaCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV3dXNlcnR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHViYWNjb3VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcmtldGluZ29wdG91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1YmxpY3V1aWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBldmVudE5hbWVzID0gW10sIGJyYW5kRXZlbnROYW1lLCBnbG9iYWxFdmVudE5hbWUsIGN1cnJlbnRQcm9wLCBzdHViT3JGdWxsLCBhY2NvdW50VHlwZVN0ciwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGV2ZW50RGF0YVByb3BzVG9TdGFzaC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFByb3AgPSBldmVudERhdGFQcm9wc1RvU3Rhc2hbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zdG9yZUV2ZW50RGF0YShjdXJyZW50UHJvcCwgZGF0YVtjdXJyZW50UHJvcF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbEV2ZW50TmFtZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9FVkVOVF9QUkVGSVgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY291bnQgQ3JlYXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmRFdmVudE5hbWUgPSBnbG9iYWxFdmVudE5hbWUucmVwbGFjZShHTE9CQUxfRVZFTlRfUFJFRklYLCBicmFuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZEV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChnbG9iYWxFdmVudE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdHViYWNjb3VudCA9PT0gJ3RydWUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1Yk9yRnVsbCA9ICdzdHViJzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R1Yk9yRnVsbCA9ICdmdWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubmV3dXNlcnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRUeXBlU3RyID0gJyAoJyArIHN0dWJPckZ1bGwgKyAnICcgKyBkYXRhLm5ld3VzZXJ0eXBlICsgJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kRXZlbnROYW1lICsgYWNjb3VudFR5cGVTdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGdsb2JhbEV2ZW50TmFtZSArIGFjY291bnRUeXBlU3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKGV2ZW50TmFtZXMpOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckNvbXBsZXRlKGRvbmUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGVkYXAub24oJ2dlbmVyaWMubW9kYWwnLCBmdW5jdGlvbiAoZGF0YSwgc2V0QXN5bmMsIGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGFsTmFtZSwgZXZlbnRUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RhbGFjdGlvbiA9PT0gJ29wZW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbE5hbWUgPSBkYXRhLm1vZGFsbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RhbE5hbWUgPT09ICdib29raW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGV4dCA9ICc6IEJvb2tpbmcgTW9kYWwgT3BlbmVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQgKyBldmVudFRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9FVkVOVF9QUkVGSVggKyBldmVudFRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobW9kYWxOYW1lID09PSAnaW5xdWlyeScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRleHQgPSAnOiBJbnF1aXJ5IE1vZGFsIE9wZW5lZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJDb21wbGV0ZShkb25lKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlZGFwLm9uKCdkYXRlZC5zZWFyY2guc3VibWl0JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFN0ciA9ICc6IERhdGVkIFNlYXJjaCBTdWJtaXQnOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ29tcGxldGUoZG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZWRhcC5vbignY2FydC5uZXdzdWJzY3JpcHRpb24uc3VibWl0JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFN0ciA9ICc6IENhcnQgTmV3IFN1YnNjcmlwdGlvbiBDb21wbGV0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZCArIGV2ZW50U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0VWRU5UX1BSRUZJWCArIGV2ZW50U3RyCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckNvbXBsZXRlKGRvbmUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGVkYXAub24oJ2NhcnQuc2lnbnVwLnN1Ym1pdCcsIGZ1bmN0aW9uIChkYXRhLCBzZXRBc3luYywgZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRTdHIgPSAnOiBDYXJ0IFNpZ251cCBDb21wbGV0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZCArIGV2ZW50U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0VWRU5UX1BSRUZJWCArIGV2ZW50U3RyCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckNvbXBsZXRlKGRvbmUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGVkYXAub24oJ2hlYXJ0aW5nLmhlYXJ0JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudFN0ciA9ICc6IExpc3RpbmcgRmF2b3JpdGUnOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ29tcGxldGUoZG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZWRhcC5vbignb3duZXIucmVnaXN0cmF0aW9uLnN1Ym1pdCcsIGZ1bmN0aW9uIChkYXRhLCBzZXRBc3luYywgZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRTdHIgPSAnOiBPd25lciBSZWdpc3RyYXRpb24nOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ29tcGxldGUoZG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZWRhcC5vbigncGF5bWVudC5zdWJtaXQnLCBmdW5jdGlvbiAoZGF0YSwgc2V0QXN5bmMsIGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50U3RyID0gJzogUGF5bWVudCBDb21wbGV0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZCArIGV2ZW50U3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0VWRU5UX1BSRUZJWCArIGV2ZW50U3RyCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckNvbXBsZXRlKGRvbmUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGVkYXAub24oJ3BhZ2V2aWV3JywgZnVuY3Rpb24gKGRhdGEsIHNldEFzeW5jLCBkb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdldHlwZSA9IGRhdGEucGFnZXR5cGUgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlbmFtZSA9IGRhdGEucGFnZW5hbWUgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudE5hbWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdlZGFwZXZlbnRpZCcsIGRhdGEuZWRhcGV2ZW50aWQpOwogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSAmJiBwYWdldHlwZSAhPT0gJ3Byb3BlcnR5JyAmJiBwYWdldHlwZSAhPT0gJ3NlYXJjaCcgJiYgcGFnZXR5cGUgIT09ICdjaGVja291dCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFBhZ2V2aWV3IE5PVCBTZWFyY2gtUHJvcGVydHktQ2hlY2tvdXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzLmdldEVkYXBTY29wZURhdGEoJ2lzTmV3U2Vzc2lvbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBOZXcgU2Vzc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBOZXcgU2Vzc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW4uZWRhcC5nZXRTY29wZURhdGEoJ3VhJykuaXNOZXdVc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBOZXcgVUEgVmlzaXRvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBOZXcgVUEgVmlzaXRvcicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ2hvbWUnIHx8IHBhZ2V0eXBlID09PSAnbWFya2V0aW5nJyB8fCBwYWdldHlwZSA9PT0gJ3RyYXZlbC1pZGVhcycgfHwgcGFnZXR5cGUgPT09ICdseXAnIHx8IHBhZ2V0eXBlID09PSAnb3duZXJkYXNoJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogQ3JpdGVvIEhvbWVwYWdlIFRhZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBDcml0ZW8gSG9tZXBhZ2UgVGFnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlICE9PSAnc2VhcmNoJyAmJiBwYWdldHlwZSAhPT0gJ3Byb3BlcnR5JyAmJiBwYWdldHlwZSAhPT0gJ2Jvb2tpbmcnICYmIHBhZ2V0eXBlICE9PSAnY2FydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IE5vbiBTaG9wcGluZyBGbG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IE5vbiBTaG9wcGluZyBGbG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAncHBiJyAmJiBwYWdlbmFtZSA9PT0gJ2hhOiBwcGIgc2lnbnVwOiBhY2NvdW50IGluZm8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBQUEI6IEZsb3cgU3RhcnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogUFBCOiBGbG93IFN0YXJ0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAnY2FydCcgJiYgcGFnZW5hbWUgPT09ICdoYTogbGlzdCB5b3VyIHByb3BlcnR5OiBjb25maXJtJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogU2lnbnVwIENhcnQ6IENvbmZpcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogU2lnbnVwIENhcnQ6IENvbmZpcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdjYXJ0JyAmJiBwYWdlbmFtZSA9PT0gJ2hhOiBsaXN0IHlvdXIgcHJvcGVydHk6IHNlYXJjaCBwb3NpdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFNpZ251cCBDYXJ0OiBUaWVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFNpZ251cCBDYXJ0OiBUaWVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYWdldHlwZSA9PT0gJ2lucXVpcnkgY29uZmlybWF0aW9uJyB8fCBwYWdldHlwZSA9PT0gJ2lucXVpcnknKSAmJiBwYWdlbmFtZSA9PT0gJ2lucXVpcnkgY29uZmlybWF0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogSW5xdWlyeSBDb25maXJtYXRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogSW5xdWlyeSBDb25maXJtYXRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdwcGInICYmIHBhZ2VuYW1lID09PSAnaGE6IHBwYiBzaWdudXA6IGFjY291bnQgaW5mbycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFBQQjogRmxvdyBTdGFydCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBQUEI6IEZsb3cgU3RhcnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgIT09ICdwbWRhc2gnICYmIHR5cGVvZiByZWZlcnJlciA9PT0gJ3N0cmluZycgJiYgcmVmZXJyZXIuaW5kZXhPZih1dGlscy5nZXRMb2NhdGlvbk9yaWdpbigpKSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogTm90IFNlbGYtUmVmZXJyYWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogTm90IFNlbGYtUmVmZXJyYWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMuZ2V0TG9jYXRpb25Qcm90b2NvbCgpID09PSAnaHR0cHM6JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogSFRUUFMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogSFRUUFMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMuZ2V0TG9jYXRpb25Qcm90b2NvbCgpID09PSAnaHR0cDonKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBIVFRQJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IEhUVFAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdtYXJrZXRpbmcnICYmIHBhZ2VuYW1lLnNlYXJjaCgvdHJhdmVsZXItc2VydmljZS1mZWUvKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFRyYXZlbGVyIFNlcnZpY2UgRmVlL0hBMy4wIE1pY3Jvc2l0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdtYXJrZXRpbmcnICYmIHBhZ2VuYW1lID09PSAnZGlzY292ZXJ5aHViOiBkaXNjb3ZlcnlodWInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBFbG9xdWE6IERpc2NvdmVyeSBIdWInKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlICE9PSAnaG9tZScgJiYgcGFnZXR5cGUgIT09ICdmYXZvcml0ZXMnICYmIHBhZ2V0eXBlICE9PSAnc2VhcmNoJyAmJiBwYWdldHlwZSAhPT0gJ3Byb3BlcnR5JyAmJiBwYWdldHlwZSAhPT0gJ1RyYXZlbGVyJyAmJiBwYWdldHlwZSAhPT0gJ2Rhc2hib2FyZCcgJiYgcGFnZXR5cGUuc2VhcmNoKC9pbnRlcnN0aXRpYWwvKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IEVsb3F1YSBDb25kaXRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogRWxvcXVhIENvbmRpdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ2NhcmVlcnMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBDYXJlZXJzIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IENhcmVlcnMgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdib29raW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogQm9va2luZyBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBUcmF2ZWxlciBDaGVja291dCBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ2NhcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBDYXJ0IFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IENhcnQgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IEVycm9yIFBhZ2UgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogRXJyb3IgUGFnZSBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ2hhb2xiJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogSEFPTEIgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogSEFPTEIgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUuc2VhcmNoKC9oZWxwIGNlbnRlci8pICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogSGVscCBDZW50ZXIgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogSGVscCBDZW50ZXIgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdob21lJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogSG9tZSBQYWdlIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IEhvbWUgUGFnZSBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ2xhbmRpbmcgcGFnZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IExhbmRpbmcgUGFnZSBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBMYW5kaW5nIFBhZ2UgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdseXAnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBMWVAgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogTFlQIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAnbWFya2V0aW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogTWFya2V0aW5nIFBhZ2VzIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IE1hcmtldGluZyBQYWdlcyBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ293bmVyIHByb2ZpbGUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBPd25lciBQcm9maWxlIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IE93bmVyIFByb2ZpbGUgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdwYXltZW50IHNldHVwJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogUGF5bWVudCBTZXR1cCBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBQYXltZW50IFNldHVwIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAncG1kYXNoJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogUE0gRGFzaCBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBQTSBEYXNoIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAncHBiJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogUFBCIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFBQQiBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogUHJvcGVydHkgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogUHJvcGVydHkgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdvd25lcmRhc2gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBPd25lcmRhc2ggUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogT3duZXJkYXNoIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAncmV2aWV3cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFJldmlld3MgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogUmV2aWV3cyBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ3NlYXJjaCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFNlYXJjaCBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBTZWFyY2ggUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICdzZWFyY2ggbGFuZGluZyBwYWdlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogU2VhcmNoIExhbmRpbmcgUGFnZSBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBTZWFyY2ggTGFuZGluZyBQYWdlIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlID09PSAndHJhdmVsLWlkZWFzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKGJyYW5kICsgJzogVHJhdmVsIElkZWFzIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFRyYXZlbCBJZGVhcyBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdldHlwZSA9PT0gJ3RyYXZlbGVyZGFzaCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFRyYXZlbGVyZGFzaCBQYWdldmlldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lcy5wdXNoKEdMT0JBTF9FVkVOVF9QUkVGSVggKyAnOiBUcmF2ZWxlcmRhc2ggUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZXR5cGUgPT09ICd1bXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goYnJhbmQgKyAnOiBVTVMgUGFnZXZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChHTE9CQUxfRVZFTlRfUFJFRklYICsgJzogVU1TIFBhZ2V2aWV3Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2V0eXBlICYmIHBhZ2V0eXBlICE9PSAnYm9va2luZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZXMucHVzaChicmFuZCArICc6IFBhZ2V2aWV3IE5PVCBCb29raW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWVzLnB1c2goR0xPQkFMX0VWRU5UX1BSRUZJWCArICc6IFBhZ2V2aWV3IE5PVCBCb29raW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXN5bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckFsbEV2ZW50cyhldmVudE5hbWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJDb21wbGV0ZShkb25lKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBlZGFwLm9uKCdlbWFpbC5mb3JtLnN1Ym1pdCcsIGZ1bmN0aW9uIChkYXRhLCBzZXRBc3luYywgZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnRTdHIgPSAnOiBFbWFpbCBGb3JtIFN1Ym1pdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldEFzeW5jKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnN0b3JlRXZlbnREYXRhKCdmb3JtdXVpZCcsIGRhdGEuZm9ybXV1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQWxsRXZlbnRzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kICsgZXZlbnRTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfRVZFTlRfUFJFRklYICsgZXZlbnRTdHIKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyQ29tcGxldGUoZG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgYnMuYmluZFBhZ2VTcGVjaWZpY0NvbXBsZXRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBlZGFwWydwdWJsaWMnXS5wbGF5YmFjay5yZXBsYXkoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KHdpbmRvdykpOwogICAgICAgIH0sIDM1MDY0NDIsIDQzMTgwNyk7CiAgICAgICAgQm9vdHN0cmFwcGVyLmJpbmRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgQm9vdHN0cmFwcGVyID0gd2luZG93WydCb290c3RyYXBwZXInXTsKICAgICAgICAgICAgdmFyIGVuc2lnaHRlbk9wdGlvbnMgPSBCb290c3RyYXBwZXIuZW5zaWdodGVuT3B0aW9uczsKICAgICAgICAgICAgQm9vdHN0cmFwcGVyLnJlZ2lzdGVyRGF0YURlZmluaXRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmRhdGEuZGVmaW5lKHsKICAgICAgICAgICAgICAgICAgICBleHRyYWN0OiBmdW5jdGlvbiBlZGFwZXZlbnRpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdywgdXRpbHMgPSB3aW4uaGFFbnNpZ2h0ZW5VdGlsczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmdldEV2ZW50RGF0YSgnZWRhcGV2ZW50aWQnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA/IHZhbCA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbG9hZDogJ3BhZ2UnLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IEJvb3RzdHJhcHBlci5kYXRhLmJvdHRvbU9mQm9keVRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgZGF0YURlZk5hbWU6ICdlZGFwZXZlbnRpZCcsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogJ2V2ZW50ZGF0YScsCiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnTWFuYWdlJywKICAgICAgICAgICAgICAgICAgICBwcml2OiAnZmFsc2UnCiAgICAgICAgICAgICAgICB9LCB7IGlkOiAnNjMxNzEnIH0pOwogICAgICAgICAgICB9LCA2MzE3MSk7CiAgICAgICAgfSwgLTEsIC0xKTsKICAgICAgICBCb290c3RyYXBwZXIuYmluZEltbWVkaWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICB2YXIgZW5zaWdodGVuT3B0aW9ucyA9IEJvb3RzdHJhcHBlci5lbnNpZ2h0ZW5PcHRpb25zOwogICAgICAgICAgICBCb290c3RyYXBwZXIucmVnaXN0ZXJEYXRhRGVmaW5pdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBCb290c3RyYXBwZXIuZGF0YS5kZWZpbmUoewogICAgICAgICAgICAgICAgICAgIGV4dHJhY3Q6IGZ1bmN0aW9uIGRjX2FjdGl2aXR5X2lkX2d0YWcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3csIGFkbCA9IHdpbi5hbmFseXRpY3NkYXRhbGF5ZXIsIGFjdGl2aXR5SWQgPSAnREMtNjUxOTExMyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGwuYXBwZW52aXJvbm1lbnQgPT09ICd0ZXN0JyB8fCBhZGwuYXBwZW52aXJvbm1lbnQgPT09ICdzdGFnZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eUlkID0gJ0RDLTY2NDY1MTQnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZpdHlJZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsID8gdmFsIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBsb2FkOiAnaW5zdGFuY2UnLAogICAgICAgICAgICAgICAgICAgIHRyaWdnZXI6IEJvb3RzdHJhcHBlci5kYXRhLmJvdHRvbU9mQm9keVRyaWdnZXIsCiAgICAgICAgICAgICAgICAgICAgZGF0YURlZk5hbWU6ICdkYy1hY3Rpdml0eS1pZC1ndGFnJywKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiAnRG91YmxlQ2xpY2snLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ01hbmFnZScsCiAgICAgICAgICAgICAgICAgICAgcHJpdjogJ2ZhbHNlJwogICAgICAgICAgICAgICAgfSwgeyBpZDogJzU1NDI2JyB9KTsKICAgICAgICAgICAgfSwgNTU0MjYpOwogICAgICAgIH0sIC0xLCAtMSk7CiAgICAgICAgQm9vdHN0cmFwcGVyLmJpbmRJbW1lZGlhdGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgQm9vdHN0cmFwcGVyID0gd2luZG93WydCb290c3RyYXBwZXInXTsKICAgICAgICAgICAgdmFyIGVuc2lnaHRlbk9wdGlvbnMgPSBCb290c3RyYXBwZXIuZW5zaWdodGVuT3B0aW9uczsKICAgICAgICAgICAgQm9vdHN0cmFwcGVyLnJlZ2lzdGVyRGF0YURlZmluaXRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmRhdGEuZGVmaW5lKHsKICAgICAgICAgICAgICAgICAgICBleHRyYWN0OiBmdW5jdGlvbiBkaXNwbGF5bG9jYWxlX2NvdW50cnkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3csIHV0aWxzID0gd2luLmhhRW5zaWdodGVuVXRpbHMsIGRpc3BsYXlMb2NhbGUgPSB1dGlscy5hZGxFeHRyYWN0b3IoJ2Rpc3BsYXlsb2NhbGUnKSwgbG9jYWxlUGFydHMgPSBkaXNwbGF5TG9jYWxlLnNwbGl0KCdfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5TG9jYWxlICYmIGxvY2FsZVBhcnRzLmxlbmd0aCA9PT0gMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbGVQYXJ0c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAodmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwgPyB2YWwgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGxvYWQ6ICdpbnN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogQm9vdHN0cmFwcGVyLmRhdGEuYm90dG9tT2ZCb2R5VHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICBkYXRhRGVmTmFtZTogJ2Rpc3BsYXlsb2NhbGUtY291bnRyeScsCiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbjogJ2NvbXB1dGVkJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdNYW5hZ2UnLAogICAgICAgICAgICAgICAgICAgIHByaXY6ICdmYWxzZScKICAgICAgICAgICAgICAgIH0sIHsgaWQ6ICc1OTk0NicgfSk7CiAgICAgICAgICAgIH0sIDU5OTQ2KTsKICAgICAgICB9LCAtMSwgLTEpOwogICAgICAgIEJvb3RzdHJhcHBlci5iaW5kRE9NUGFyc2VkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQm9vdHN0cmFwcGVyLmVuc0V2ZW50LmFkZChbJ0dsb2JhbDogUGFnZXZpZXcnXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGVuc0V2ZW50Q29udGV4dCA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoZW5zRXZlbnRDb250ZXh0ID09IHdpbmRvdykKICAgICAgICAgICAgICAgICAgICBlbnNFdmVudENvbnRleHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB2YXIgQm9vdHN0cmFwcGVyID0gd2luZG93WydCb290c3RyYXBwZXInXTsKICAgICAgICAgICAgICAgIHZhciBlbnNpZ2h0ZW5PcHRpb25zID0gQm9vdHN0cmFwcGVyLmVuc2lnaHRlbk9wdGlvbnM7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciB1dGlscyA9IHdpbi5oYUVuc2lnaHRlblV0aWxzLCBicyA9IHdpbi5Cb290c3RyYXBwZXIsIGxvY2FsZSA9ICdlbl9VUycsIGRhdGFfZGVmaW5pdGlvbl9mYWNlYm9va19waXhlbF9pZCA9IDYyMzU5LCBwaXhlbElkID0gYnMuZGF0YS5yZXNvbHZlKGRhdGFfZGVmaW5pdGlvbl9mYWNlYm9va19waXhlbF9pZCksIG1hdGNoaW5nID0ge307CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmcuZXh0ZXJuYWxfaWQgPSB1dGlscy5nZXRWaXNpdG9ySWQoKTsKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5mYnEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB3aW5kb3cuZmJxID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uY2FsbE1ldGhvZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNhbGxNZXRob2QuYXBwbHkobiwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnF1ZXVlLnB1c2goYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuX2ZicSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fZmJxID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgbi5sb2FkZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgbi52ZXJzaW9uID0gJzIuMCc7CiAgICAgICAgICAgICAgICAgICAgICAgIG4ucXVldWUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgYnMuaW5zZXJ0U2NyaXB0KCdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0LycgKyBsb2NhbGUgKyAnL2ZiZXZlbnRzLmpzJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZmJxLmFnZW50ID0gJ3RtZW5zaWdodGVuJzsKICAgICAgICAgICAgICAgICAgICBmYnEoJ3NldCcsICdhdXRvQ29uZmlnJywgZmFsc2UsIHBpeGVsSWQpOwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5mYnEoJ2luaXQnLCBwaXhlbElkLCBtYXRjaGluZyk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmZicSgndHJhY2snLCAnUGFnZVZpZXcnKTsKICAgICAgICAgICAgICAgIH0od2luZG93KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sIDMzODM0OTQsIDYzNTk1Nik7CiAgICAgICAgQm9vdHN0cmFwcGVyLmJpbmRET01QYXJzZWQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBCb290c3RyYXBwZXIuZW5zRXZlbnQuYWRkKFsnR2xvYmFsOiBQYWdldmlldyddLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZW5zRXZlbnRDb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgICAgIGlmIChlbnNFdmVudENvbnRleHQgPT0gd2luZG93KQogICAgICAgICAgICAgICAgICAgIGVuc0V2ZW50Q29udGV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHZhciBCb290c3RyYXBwZXIgPSB3aW5kb3dbJ0Jvb3RzdHJhcHBlciddOwogICAgICAgICAgICAgICAgdmFyIGVuc2lnaHRlbk9wdGlvbnMgPSBCb290c3RyYXBwZXIuZW5zaWdodGVuT3B0aW9uczsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAod2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGJzID0gd2luLkJvb3RzdHJhcHBlciwgdXRpbHMgPSB3aW4uaGFFbnNpZ2h0ZW5VdGlscywgcGl4ZWxJZCA9IGJzLmRhdGEucmVzb2x2ZSg2MjM1OSksIG1vbmlrZXJCcmFuZCA9IGJzLmRhdGEucmVzb2x2ZSgxMzkxOSksIGVkYXBFdmVudElkID0gYnMuZGF0YS5yZXNvbHZlKDYzMTcxKSwgcGFnZVR5cGUgPSBicy5kYXRhLnJlc29sdmUoMTM2NDIpLCBldmVudFR5cGUgPSAnUGFnZVZpZXcnLCB2aXNpdG9ySWRTaGEyNTZQcm9taXNlID0gdXRpbHMudmlzaXRvcklkU2hhMjU2KCksIHJlcVVybDsKICAgICAgICAgICAgICAgICAgICBpZiAodmlzaXRvcklkU2hhMjU2UHJvbWlzZSkKICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRvcklkU2hhMjU2UHJvbWlzZS50aGVuKGZ1bmN0aW9uIChzaGEyNTZWaXNpdG9ySWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcVVybCA9ICdodHRwczovL3d3dy5mYWNlYm9vay5jb20vdHI/aWQ9JyArIHBpeGVsSWQgKyAnJmV2PScgKyBldmVudFR5cGUgKyAnJm5vc2NyaXB0PTEnICsgJyZlaWQ9JyArIGVkYXBFdmVudElkICsgJyZ1ZFtleHRlcm5hbF9pZF09JyArIHNoYTI1NlZpc2l0b3JJZCArICcmY2RbbW9uaWtlcmJyYW5kXT0nICsgbW9uaWtlckJyYW5kICsgJyZjZFtwYWdldHlwZV09JyArIHBhZ2VUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMuaW1hZ2VSZXF1ZXN0KHJlcVVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSh3aW5kb3cpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgMzM4MzQ5NiwgNjYyNDQyKTsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min","aliases":["sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min"],"kind":{"mime":"application/javascript"},"content":"dmFyIGZkeF9pbml0U0NWYXJzLCBmZHhfZGVidWcsIGZkeF9zZXRDb29raWUsIGZkeF9nZXRDb29raWUsIGZkeF9jYW1wYWlnbiwgZmR4X2d1cCwgZmR4X2ZpcmVTRG90VCwgZmR4X2ZpcmVTRG90VEwsIGZkeF9zcFNyY2gsIGxvZ0xpbmtWaWV3LCBmZHhfbG9nTGlua1ZpZXcsIHNldExpbmtWaWV3LCBmZHhfc2V0TGlua1ZpZXcsIGZkeF9nZXRMaW5rVmlldywgZmR4X2xpbmtGb3JtYXQsIGZkeF90cmFja01hcHBpbmcsIGZkeF9sb2dEb3dubG9hZCwgbG9nUGFnZVZpZXcsIGZkeF9sb2dQYWdlVmlldywgbG9nUHVyY2hhc2UsIGZkeF9sb2dQdXJjaGFzZSwgZmR4X2xvZ1B1cmNoYXNlTUFHUywgaXNPYmplY3QsIGZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWwsIGZkeF9sb2dQdXJjaGFzZU1BR1IsIGZkeF9sb2dQdXJjaGFzZVdSRUcsIHByb2Nlc3NEYXRhLCBmZHhfY29udmVydFRvU3RyLCBmZHhfbG9nQ2hhdCwgc19kb1BsdWdpbnMsIGZkeF9pbml0UGx1Z2lucywgQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0ludGVncmF0ZSwgQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0F1ZGllbmNlTWFuYWdlbWVudCwgQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0FjdGl2aXR5TWFwLCBBcHBNZWFzdXJlbWVudCwgc19naSwgc19wZ2ljcSwgZmR4X3J1blNDb2RlLCBmZHhfaW5pdFNDb2RlLCBmZHhfY3JlYXRlQ3VzdG9tRXZlbnQsIGZkeF9kaXNwYXRjaEN1c3RvbUV2ZW50LCBmZHhfZmlyZUN1c3RvbUV2ZW50LCBNQUdTRXZhck1hcHBpbmc7CnsKICAgIGNvbnN0ICRfX19tb2NrX2M3Y2FlYzUwMWRjYTIzODcgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgbGV0IGlzU2VhbGVkID0gZmFsc2U7CiAgICAgICAgY2xhc3MgU3RvcmFnZSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgaWYgKGlzU2VhbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGtleShpbmRleCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGtleXNbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldEl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGtleSkgPyB0aGlzW2tleV0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1trZXldID0gU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1vdmVJdGVtKGtleSkgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogU3RvcmFnZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5sb2NhbFN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMuc2Vzc2lvblN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICB9KSgkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3KTsKICAgIGNvbnN0ICRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgeGhyVW5zZW50ID0gMDsKICAgICAgICBjb25zdCB4aHJPcGVuZWQgPSAxOwogICAgICAgIGNvbnN0IHhockhlYWRlcnNSZWNlaXZlZCA9IDI7CiAgICAgICAgY29uc3QgeGhyTG9hZGluZyA9IDM7CiAgICAgICAgY29uc3QgeGhyRG9uZSA9IDQ7CiAgICAgICAgY29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wgPSBTeW1ib2woJ2RlZmVycmVkSGFuZGxlJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZHN0YXJ0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Qcm9ncmVzc1N5bWJvbCA9IFN5bWJvbCgnb25wcm9ncmVzcycpOwogICAgICAgIGNvbnN0IHhock9uQWJvcnRTeW1ib2wgPSBTeW1ib2woJ29uYWJvcnQnKTsKICAgICAgICBjb25zdCB4aHJPbkVycm9yU3ltYm9sID0gU3ltYm9sKCdvbmVycm9yJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3ltYm9sID0gU3ltYm9sKCdvbmxvYWQnKTsKICAgICAgICBjb25zdCB4aHJPblRpbWVvdXRTeW1ib2wgPSBTeW1ib2woJ29udGltZW91dCcpOwogICAgICAgIGNvbnN0IHhock9uTG9hZEVuZFN5bWJvbCA9IFN5bWJvbCgnb25sb2FkZW5kJyk7CiAgICAgICAgY29uc3QgeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sID0gU3ltYm9sKCdvbnJlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICBjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sID0gU3ltYm9sKCdyZWFkeVN0YXRlJyk7CiAgICAgICAgY29uc3QgeGhyVGltZW91dFN5bWJvbCA9IFN5bWJvbCgndGltZW91dCcpOwogICAgICAgIGNvbnN0IHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCA9IFN5bWJvbCgnd2l0aENyZWRlbnRpYWxzJyk7CiAgICAgICAgY29uc3QgeGhyVXBsb2FkU3ltYm9sID0gU3ltYm9sKCd1cGxvYWQnKTsKICAgICAgICBjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2wgPSBTeW1ib2woJ3Jlc3BvbnNlVHlwZScpOwogICAgICAgIGNvbnN0IGRlZmluZUV2ZW50ID0gKG9iaiwgc3ltYm9sKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW1ib2wsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbc3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBjaGFuZ2VSZWFkeVN0YXRlID0gKHhociwgcmVhZHlTdGF0ZSkgPT4gewogICAgICAgICAgICB4aHJbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPSByZWFkeVN0YXRlOwogICAgICAgICAgICB4aHIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnKSk7CiAgICAgICAgfTsKICAgICAgICBsZXQgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgIGNsYXNzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkgJiYgISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3RhcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Qcm9ncmVzc1N5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkFib3J0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uRXJyb3JTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uVGltZW91dFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRFbmRTeW1ib2wpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmxvYWRzdGFydCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2Fkc3RhcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucHJvZ3Jlc3MoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25wcm9ncmVzcyh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmFib3J0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25BYm9ydFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uYWJvcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25BYm9ydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25lcnJvcigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmVycm9yKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uRXJyb3JTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9udGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9udGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZGVuZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ubG9hZGVuZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0VXBsb2FkLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNvbnN0IHhoclVwbG9hZCA9IG5ldyBYTUxIdHRwUmVxdWVzdFVwbG9hZCgpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhockRlZmVycmVkSGFuZGxlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclJlYWR5U3RhdGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclRpbWVvdXRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVXBsb2FkU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeGhyVXBsb2FkLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVzcG9uc2VUeXBlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbnJlYWR5c3RhdGVjaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnJlYWR5c3RhdGVjaGFuZ2UodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZWFkeVN0YXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlbihtZXRob2QsIHVybCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhock9wZW5lZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJUaW1lb3V0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB3aXRoQ3JlZGVudGlhbHMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB3aXRoQ3JlZGVudGlhbHModmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJVbnNlbnQ6CiAgICAgICAgICAgICAgICBjYXNlIHhock9wZW5lZDogewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwnd2l0aENyZWRlbnRpYWxzXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF0gPSAhIXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB1cGxvYWQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmQoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSA9PT0geGhyT3BlbmVkICYmIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhockRvbmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlIFwnc2VuZFwnIG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIG9iamVjdFwncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhYm9ydCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0pOwogICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhoclVuc2VudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCdhYm9ydCcpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVVJMKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgc3RhdHVzVGV4dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlKG1pbWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUeXBlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgcmVzcG9uc2VUeXBlKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gc2V0IHRoZSBcJ3Jlc3BvbnNlVHlwZVwnIHByb3BlcnR5IG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0XCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgY2FzZSAnYXJyYXlidWZmZXInOgogICAgICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6CiAgICAgICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlKCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyAnJyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICcnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhZCB0aGUgXCdyZXNwb25zZVRleHRcJyBwcm9wZXJ0eSBmcm9tIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0XCdzIFwncmVzcG9uc2VUeXBlXCcgaXMgXCdcJyBvciBcJ3RleHRcJyAod2FzIFwnYXJyYXlidWZmZXJcJykuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlWE1MKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnVU5TRU5UJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyVW5zZW50CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnT1BFTkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyT3BlbmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnSEVBREVSU19SRUNFSVZFRCcsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockhlYWRlcnNSZWNlaXZlZAogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwgJ0xPQURJTkcnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJMb2FkaW5nCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnRE9ORScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockRvbmUKICAgICAgICB9KTsKICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdCwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgfSkoJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NCk7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIGZkeF9pbml0U0NWYXJzID0gJF9fX3Zhcl8xMGZmMzEzNDlkNmU2ZWNjOwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfaW5pdFNDVmFycywgJ25hbWUnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlOiAnZmR4X2luaXRTQ1ZhcnMnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2RlYnVnID0gJF9fX3Zhcl83MzY5NzZkMzczZTk5OTg3OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZGVidWcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9kZWJ1ZycsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfc2V0Q29va2llID0gJF9fX3Zhcl9jODE4NWE4YzA0ZmY1Y2M1OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfc2V0Q29va2llLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfc2V0Q29va2llJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9nZXRDb29raWUgPSAkX19fdmFyXzRiMzZmMmU1N2FlNTg4YjM7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9nZXRDb29raWUsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9nZXRDb29raWUnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2NhbXBhaWduID0gJF9fX3Zhcl8zZTU4YWQ2MWJmMjU2OTdiOwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfY2FtcGFpZ24sICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9jYW1wYWlnbicsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfZ3VwID0gJF9fX3Zhcl84MTZmNGQwNzBhZjAwMDc4OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZ3VwLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfZ3VwJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9maXJlU0RvdFQgPSAkX19fdmFyXzBlMzBiZGFmYjU3YzVlNmM7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9maXJlU0RvdFQsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9maXJlU0RvdFQnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2ZpcmVTRG90VEwgPSAkX19fdmFyXzA4MjhjMThhYzNlMWE3OTg7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9maXJlU0RvdFRMLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfZmlyZVNEb3RUTCcsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfc3BTcmNoID0gJF9fX3Zhcl81Mzg3YzA2ZDBlMmQ3ZmE2OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfc3BTcmNoLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfc3BTcmNoJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGxvZ0xpbmtWaWV3ID0gJF9fX3Zhcl8zZTMxY2JiNzZkZGNhYzYwOwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShsb2dMaW5rVmlldywgJ25hbWUnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlOiAnbG9nTGlua1ZpZXcnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2xvZ0xpbmtWaWV3ID0gJF9fX3Zhcl9iYmRmMzY1ZDc4OTk1OWI3OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nTGlua1ZpZXcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9sb2dMaW5rVmlldycsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBzZXRMaW5rVmlldyA9ICRfX192YXJfMzE3Y2MzNGM0YzYxOTBkMjsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoc2V0TGlua1ZpZXcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ3NldExpbmtWaWV3JywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9zZXRMaW5rVmlldyA9ICRfX192YXJfMDlhZDliMjc1ZDYxMGMxYjsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X3NldExpbmtWaWV3LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfc2V0TGlua1ZpZXcnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2dldExpbmtWaWV3ID0gJF9fX3Zhcl83MDhmMzlhZjIxY2IzM2I3OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfZ2V0TGlua1ZpZXcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9nZXRMaW5rVmlldycsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfbGlua0Zvcm1hdCA9ICRfX192YXJfZDlkYWYzOTc4NDhlNjhhNzsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xpbmtGb3JtYXQsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9saW5rRm9ybWF0JywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF90cmFja01hcHBpbmcgPSAkX19fdmFyXzI5OWM1NTkzMmFkMGE5ZGU7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF90cmFja01hcHBpbmcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF90cmFja01hcHBpbmcnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2xvZ0Rvd25sb2FkID0gJF9fX3Zhcl9iOThkNGZjZDJlMWY0YWNjOwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nRG93bmxvYWQsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9sb2dEb3dubG9hZCcsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBsb2dQYWdlVmlldyA9ICRfX192YXJfOWRhNTU3NDBkM2NkM2QwZDsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkobG9nUGFnZVZpZXcsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2xvZ1BhZ2VWaWV3JywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9sb2dQYWdlVmlldyA9ICRfX192YXJfMWJmYmJhYTU4NTA5ZmE5NTsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xvZ1BhZ2VWaWV3LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfbG9nUGFnZVZpZXcnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgbG9nUHVyY2hhc2UgPSAkX19fdmFyXzU5OTMxYTJlMWVlOWI1MDc7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGxvZ1B1cmNoYXNlLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdsb2dQdXJjaGFzZScsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfbG9nUHVyY2hhc2UgPSAkX19fdmFyX2E4OGRjYTEzNTgxYjc2Yzk7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dQdXJjaGFzZSwgJ25hbWUnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlOiAnZmR4X2xvZ1B1cmNoYXNlJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9sb2dQdXJjaGFzZU1BR1MgPSAkX19fdmFyXzg1Y2U5OWJiMTgyOTAyNTQ7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dQdXJjaGFzZU1BR1MsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9sb2dQdXJjaGFzZU1BR1MnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgaXNPYmplY3QgPSAkX19fdmFyX2I0Yzc0ZDFkZjJhNTk0Mjk7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGlzT2JqZWN0LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdpc09iamVjdCcsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfbG9nUHVyY2hhc2VfUGFnZUxldmVsID0gJF9fX3Zhcl85MWYxZjgwM2Q5MTY4OGY4OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfbG9nUHVyY2hhc2VfUGFnZUxldmVsLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfbG9nUHVyY2hhc2VfUGFnZUxldmVsJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9sb2dQdXJjaGFzZU1BR1IgPSAkX19fdmFyX2I1ZTNjZjM0YWNmMTNmM2M7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dQdXJjaGFzZU1BR1IsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9sb2dQdXJjaGFzZU1BR1InLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2xvZ1B1cmNoYXNlV1JFRyA9ICRfX192YXJfOTkyODcwZDYwMzgwNjgxNzsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2xvZ1B1cmNoYXNlV1JFRywgJ25hbWUnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlOiAnZmR4X2xvZ1B1cmNoYXNlV1JFRycsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBwcm9jZXNzRGF0YSA9ICRfX192YXJfNjQzYzk5NDcyNzgzZjRhMjsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkocHJvY2Vzc0RhdGEsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ3Byb2Nlc3NEYXRhJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9jb252ZXJ0VG9TdHIgPSAkX19fdmFyXzI5YWNiNmRkZWE2OWM0MTA7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9jb252ZXJ0VG9TdHIsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9jb252ZXJ0VG9TdHInLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X2xvZ0NoYXQgPSAkX19fdmFyXzhjZTYyZGExMzM4OTVjZTk7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KGZkeF9sb2dDaGF0LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfbG9nQ2hhdCcsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBzX2RvUGx1Z2lucyA9ICRfX192YXJfMmE4ZmY4MGVlMGYzY2U1NDsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoc19kb1BsdWdpbnMsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ3NfZG9QbHVnaW5zJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZkeF9pbml0UGx1Z2lucyA9ICRfX192YXJfNzQ3ZjdhYzI0Y2ZmOWU1OTsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoZmR4X2luaXRQbHVnaW5zLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfaW5pdFBsdWdpbnMnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0ludGVncmF0ZSA9ICRfX192YXJfODQ1OTU2YTU4ZjA0ODFkODsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0ludGVncmF0ZSwgJ25hbWUnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIHZhbHVlOiAnQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0ludGVncmF0ZScsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQXVkaWVuY2VNYW5hZ2VtZW50ID0gJF9fX3Zhcl9mZGNiMmI1ZmY4OGNkZDk2OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQXVkaWVuY2VNYW5hZ2VtZW50LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQXVkaWVuY2VNYW5hZ2VtZW50JywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIEFwcE1lYXN1cmVtZW50X01vZHVsZV9BY3Rpdml0eU1hcCA9ICRfX192YXJfMTM4MjJhNDNlZWRkYWZhYzsKICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkoQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0FjdGl2aXR5TWFwLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQWN0aXZpdHlNYXAnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgQXBwTWVhc3VyZW1lbnQgPSAkX19fdmFyXzJkZjgwMDUzODQzOWI4MTE7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KEFwcE1lYXN1cmVtZW50LCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdBcHBNZWFzdXJlbWVudCcsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBzX2dpID0gJF9fX3Zhcl8xNDExYmNlOWUyYmM2Yjg1OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShzX2dpLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdzX2dpJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIHNfcGdpY3EgPSAkX19fdmFyXzM4NTE4OWRjN2U1NThlYjA7CiAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHNfcGdpY3EsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ3NfcGdpY3EnLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgICB9KSk7CiAgICAgICAgZmR4X3J1blNDb2RlID0gJF9fX3Zhcl84YmYxYWI3ZWQyOTdiMmM4OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfcnVuU0NvZGUsICduYW1lJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB2YWx1ZTogJ2ZkeF9ydW5TQ29kZScsCiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgIH0pKTsKICAgICAgICBmZHhfaW5pdFNDb2RlID0gJF9fX3Zhcl85YjJhNGMyZjc2ZTczYTE2OwogICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eShmZHhfaW5pdFNDb2RlLCAnbmFtZScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgdmFsdWU6ICdmZHhfaW5pdFNDb2RlJywKICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgfSkpOwogICAgICAgIGZ1bmN0aW9uICRfX192YXJfMTBmZjMxMzQ5ZDZlNmVjYygpIHsKICAgICAgICAgICAgd2luZG93LnNjX2NvZGVfdmVyID0gJzMuMC40MCcsIHdpbmRvdy5zY19jb2RlX3Zlcl9kYXRlID0gJzA2MTUyMDIxLjAxJywgd2luZG93LnNfdmVyc2lvbiA9ICdBTS4yLjIyLjAnLCB3aW5kb3cuc19hY2NvdW50ID0gJ2ZlZGV4Z2xibGRldicsICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpLCB3aW5kb3cud3d3SG9zdCA9IF9mZHgucGNmVXRpbCgpLCAnd3d3LmZlZGV4LmNvbScgPT0gd3d3SG9zdCAmJiAoc19hY2NvdW50ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3NBY2NvdW50JykpLCB3aW5kb3cucyA9IHNfZ2koc19hY2NvdW50KSwgcy5wYWdlTG9hZENvbXBsZXRlID0gITEsIHMudHJhY2tEb3dubG9hZExpbmtzID0gITAsIHMudHJhY2tFeHRlcm5hbExpbmtzID0gITAsIHMudHJhY2tJbmxpbmVTdGF0cyA9ICEwLCBzLmxpbmtEb3dubG9hZEZpbGVUeXBlcyA9ICdleGUsemlwLHdhdixtcDMsbXA0LG1vdixtcGcsYXZpLHdtdixwZGYsZG9jLGRvY3gseGxzLHhsc3gscHB0LHBwdHgscG5nJywgcy5saW5rTGVhdmVRdWVyeVN0cmluZyA9ICExLCBzLmxpbmtUcmFja1ZhcnMgPSAnTm9uZScsIHMubGlua1RyYWNrRXZlbnRzID0gJ05vbmUnLCBzLnVzZVBsdWdpbnMgPSAhMCwgcy5saW5rSW50ZXJuYWxGaWx0ZXJzID0gJ2phdmFzY3JpcHQ6LGZlZGV4LmNvbSxpYW1mZWRleC5jb20sZmVkZXhhZHMuZGVzaWduY2R0LmNvbSxraW5rb3NkZXYuY29tLGtpbmtvc3Rlc3QuY29tLHNlbnNlYXdhcmUuY29tLGZlZGV4c2FtZWRheS5jb20sZmVkZXgucC5kZWxpdmVyeS5uZXQsZmVkZXguY28uanAscHNnLmtpbmtvcy5jb20sZmVkZXhjYXJlcy5jb20sYm9uZ291cy5jb20nLCB3aW5kb3cubmx0cmsgPSAnJzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl83MzY5NzZkMzczZTk5OTg3KGUsIHQsIG4pIHsKICAgICAgICAgICAgdCA9IHZvaWQgMCAhPT0gdCA/ICdbJyArIHQgKyAnXSAnIDogJycsIG4gPSB2b2lkIDAgIT09IG4gPyAnWycgKyBuICsgJ10gJyA6ICcnLCB3aW5kb3cuY29uc29sZSAmJiBjb25zb2xlLmxvZyA/IGNvbnNvbGUubG9nKHQgKyBuICsgZSkgOiB3aW5kb3cub3BlcmEgJiYgb3BlcmEucG9zdEVycm9yICYmIG9wZXJhLnBvc3RFcnJvcih0ICsgbiArIGUpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGkgPSB2b2lkIDAgIT09IGZkeF9nZXRDb29raWUoJ2ZkeF9kZWJ1ZycpID8gZmR4X2dldENvb2tpZSgnZmR4X2RlYnVnJykuc3BsaXQoJywnKSA6IFtdLCByID0gX2ZkeC5nZXRUZXN0TGV2ZWwoKSwgYSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgJ3wnICsgdCArIG4gKyBlICsgJ3wnICsgciArICd8JyArICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgcyAmJiBzLnBhZ2VOYW1lID8gcy5wYWdlTmFtZSA6IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgICAgICAgaS5wdXNoKGEucmVwbGFjZSgvLC9nLCAnIyMnKSksIGZkeF9zZXRDb29raWUoJ2ZkeF9kZWJ1ZycsIGksIDEsICcvJywgJy5mZWRleC5jb20nKTsKICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfYzgxODVhOGMwNGZmNWNjNShlLCB0LCBuLCBpLCByKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gZXNjYXBlKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICgnJyAhPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2V0RGF0ZShzLmdldERhdGUoKSArIG4pLCBhICs9IG51bGwgPT09IG4gPyAnJyA6ICc7IGV4cGlyZXM9JyArIHMudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYSArPSBudWxsICE9IGkgPyAnOyBwYXRoPScgKyBpIDogJycsIGEgKz0gbnVsbCAhPSByID8gJzsgZG9tYWluPScgKyByIDogJycsIGRvY3VtZW50LmNvb2tpZSA9IGUgKyAnPScgKyBhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgICAgICAgICBmZHhfZGVidWcobywgJ0NJTScsICdmZHhfc2V0Q29va2llJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl80YjM2ZjJlNTdhZTU4OGIzKGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIG4gPSB7fSwgaSA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSwgciA9IDA7IHIgPCBpLmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgIG5bKHQgPSBpW3JdLnNwbGl0KCc9JykpWzBdXSA9IHVuZXNjYXBlKHRbMV0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5bZV07CiAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhhLCAnQ0lNJywgJ2ZkeF9nZXRDb29raWUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzNlNThhZDYxYmYyNTY5N2IoKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmR4X2d1cCh3aW5kb3cubG9jYXRpb24gIT0gd2luZG93LnBhcmVudC5sb2NhdGlvbiA/IGRvY3VtZW50LnJlZmVycmVyIDogZG9jdW1lbnQubG9jYXRpb24sICdjbXAnKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZkeF9kZWJ1ZyhlLCAnU0MnLCAnZmR4X2NhbXBhaWduJyksICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfODE2ZjRkMDcwYWYwMDA3OChlLCB0KSB7CiAgICAgICAgICAgIHQgPSB0LnJlcGxhY2UoL1tcW10vLCAnXFxbJykucmVwbGFjZSgvW1xdXS8sICdcXF0nKTsKICAgICAgICAgICAgdmFyIG4gPSBuZXcgUmVnRXhwKCdbXFw/Jl0nICsgdCArICc9KFteJiNdKiknLCAnaScpLmV4ZWMoZSk7CiAgICAgICAgICAgIHJldHVybiBudWxsID09IG4gPyAnJyA6IG5bMV07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfMGUzMGJkYWZiNTdjNWU2YygpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHMuZGVsYXlWID0gITE7CiAgICAgICAgICAgICAgICBzLnQoKTsKICAgICAgICAgICAgICAgIHMuZXZlbnRzID0gJycsIHMubGlzdDEgPSAnJywgcy5saXN0MiA9ICcnLCBzLmxpc3QzID0gJycsIHNFdm50c09uY2UgPSAnJywgcy5jX3coJ1NDX0xJTktTJywgJycpLCBzLmNfdygnc2V0TGluaycsICcnKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgZmR4X2RlYnVnKGUsICdTQycsICdmZHhfZmlyZVNEb3RUJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl8wODI4YzE4YWMzZTFhNzk4KGUsIHQsIG4pIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHMubGlua1RyYWNrVmFycyA9IHMuYXBsKHMubGlua1RyYWNrVmFycywgJ3Byb3A1MCcsICcsJywgMiksIHMudGwoZSwgdCwgbiksIHMubGlua1RyYWNrVmFycyA9ICdOb25lJywgcy5saW5rVHJhY2tFdmVudHMgPSAnTm9uZScsIHMuZXZlbnRzID0gJycsIHMubGlzdDEgPSAnJywgcy5saXN0MiA9ICcnLCBzLmxpc3QzID0gJycsIHMuY193KCdTQ19MSU5LUycsICcnKSwgcy5jX3coJ3NldExpbmsnLCAnJyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhpLCAnU0MnLCAnZmR4X2ZpcmVTRG90VEwnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzUzODdjMDZkMGUyZDdmYTYoZSkgewogICAgICAgICAgICB2YXIgdCA9IHMuVXRpbC5nZXRRdWVyeVBhcmFtKCdxJyksIG4gPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpsb2NhbGUnKSwgciA9ICgwIDwgZS50b3RhbFJlc3VsdENvdW50ID8gJ1N1Y2Nlc3MnIDogJ0ZhaWx1cmUnKSArICc6JyArIGUudG90YWxSZXN1bHRDb3VudCArICc6JyArIG47CiAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICBzLnByb3A0OSA9IHQsIHMucHJvcDQ5ID0gcy5wcm9wNDkudG9Mb3dlckNhc2UoKSwgMCA9PSBzLnByb3A0OS5pbmRleE9mKCcrJykgJiYgKHMucHJvcDQ5ID0gcy5wcm9wNDkucmVwbGFjZSgnKycsICcgICcpKSwgcy5wcm9wNDkgPSBzLnJlcGwocy5wcm9wNDksICcrJywgJyAnKSwgcy5wcm9wNDkgPSBzLnJlcGwocy5wcm9wNDksICcgICcsICcgKycpLnJlcGxhY2UoL15ccysvLCAnJyksIDAgPCBlLnRvdGFsUmVzdWx0Q291bnQgPyAocy5wcm9wMSA9IHMuZVZhcjEgPSBzLnByb3A0OSwgcy5ldmVudHMgPSBzLmFwbChzLmV2ZW50cywgJ2V2ZW50MTE4JywgJywnLCAyKSkgOiAocy5wcm9wMSA9IHMuZVZhcjEgPSAnMDonICsgcy5wcm9wNDksIHMuZXZlbnRzID0gcy5hcGwocy5ldmVudHMsICdldmVudDExOScsICcsJywgMikpLCB2b2lkIDAgIT09IHIgJiYgJycgIT09IHIgJiYgKHMucHJvcDQ5ID0gciArICc6JyArIHMucHJvcDQ5KTsKICAgICAgICAgICAgICAgIHZhciBhID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIEZEWC5EQVRBTEFZRVIuc2VhcmNoLnJlc3VsdC5iYW5uZXIgJiYgJycgIT0gRkRYLkRBVEFMQVlFUi5zZWFyY2gucmVzdWx0LmJhbm5lciAmJiBGRFguREFUQUxBWUVSLnNlYXJjaC5yZXN1bHQuYmFubmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjcS1zZWFyY2hwcm9tb3RlLWJhbm5lcnMnKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBvW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z4Zy1pbWFnZS1jb21wb25lbnRfX2ltYWdlJyA9PSBjLmNsYXNzTmFtZSAmJiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGMuY2hpbGRyZW5bMF0uYXR0cmlidXRlc1snZGF0YS1hbmFseXRpY3MnXSAmJiAoYSArPSAnJCcgKyBjLmNoaWxkcmVuWzBdLmF0dHJpYnV0ZXNbJ2RhdGEtYW5hbHl0aWNzJ10udmFsdWUpLCAwIDw9IGEuaW5kZXhPZignU1BCfFJlc3VsdHMgTm90IEZvdW5kIEltYWdlJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gJ1NQQnxSZXN1bHRzIE5vdCBGb3VuZCBJbWFnZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAnJyAhPT0gYSAmJiBhICYmIChhID0gYS5yZXBsYWNlKCckJywgJycpLCBzLnByb3A0OSA9IHMucHJvcDQ5ICsgJzonICsgYSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzLmVWYXI0OSA9ICdEPWM0OSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl8zZTMxY2JiNzZkZGNhYzYwKGUsIHQsIG4sIGkpIHsKICAgICAgICAgICAgZmR4X2xvZ0xpbmtWaWV3KGUsIHQsIG4sIGkpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyX2JiZGYzNjVkNzg5OTU5YjcoZSwgdCkgewogICAgICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAnJyksIC0xIDwgcy5ldmVudHMuaW5kZXhPZignZXZlbnQ5MDQnKSAmJiAocy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cyA9IHMuZXZlbnRzID0gcy5yZmwocy5ldmVudHMsICdldmVudDkwNCcpKTsKICAgICAgICAgICAgdmFyIG4gPSBbCiAgICAgICAgICAgICAgICAndHJrLWxhbmRpbmdQYWdlMVRyYWNraW5nTnVtYmVyc1ByZXNlbnQnLAogICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1UcmFja0J0bicsCiAgICAgICAgICAgICAgICAndHJrLXRyYWNrQnlSZWZlcmVuY2UtVHJhY2tCdG4nLAogICAgICAgICAgICAgICAgJ3Ryay10cmFja0J5VENOLVRyYWNrQnRuJywKICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ1BhZ2UtdHJhY2staGVscExpbmsnLAogICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1tdWxpdGlwbGVUcmFja2luZ051bWJlckxpbmsnLAogICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1zaW5nbGVUcmFja2luZ051bWJlckxpbmsnLAogICAgICAgICAgICAgICAgJ3Ryay10cmFja0J5UmVmZXJlbmNlLURlc3RpbmF0aW9uQ291bnRyeScsCiAgICAgICAgICAgICAgICAndHJrLWxhbmRpbmdQYWdlLXByb21wdFRvTG9naW5mb3JCT0wnLAogICAgICAgICAgICAgICAgJ3Ryay1PUE9ELWNhbmNlbCcsCiAgICAgICAgICAgICAgICAndHJrLU9QT0QtUHJpbnRMZXR0ZXItU3VibWl0JywKICAgICAgICAgICAgICAgICd0cmstT1BPRC1FbWFpbExldHRlci1TdWJtaXQnLAogICAgICAgICAgICAgICAgJ3Ryay1PUE9ELUZheC1TdWJtaXQnLAogICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5ncGFnZS1ib2xEb3dubG9hZEJ1dHRvbicsCiAgICAgICAgICAgICAgICAndHJrLWxhbmRpbmdQYWdlLXRyYWNrLWhlbHBMaW5rJwogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoMSA9PSAhIShfc2F0ZWxsaXRlLmdldFZhcignY2xpY2s6YmxvY2tGbGFnJykoZSwgJ2NsaWNrOmJsb2NrTGlzdCcpIHx8IC0xIDwgZS5pbmRleE9mKCd2YVBvcGluQXNrJykpKQogICAgICAgICAgICAgICAgcmV0dXJuIC0xIDwgbi5pbmRleE9mKGUudHJpbSgpKSAmJiBmZHhfc2V0TGlua1ZpZXcoZSksICEwOwogICAgICAgICAgICBpZiAobnVsbCAhPSBlKSB7CiAgICAgICAgICAgICAgICAtMSA8IChlID0gZmR4X2xpbmtGb3JtYXQoZSkpLmluZGV4T2YoJ3Ryay0nKSAmJiAoZSA9IGZkeF90cmFja01hcHBpbmcoZSkpOwogICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgRGF0ZSgpLCByID0gKGkuZ2V0TW9udGgoKSwgaS5nZXREYXRlKCksIGkuZ2V0RnVsbFllYXIoKSwgaS5nZXRIb3VycygpLCBpLmdldE1pbnV0ZXMoKSk7CiAgICAgICAgICAgICAgICByIDwgMTAgJiYgKHIgPSAnMCcgKyByKTsKICAgICAgICAgICAgICAgIHZhciBhID0gaS5nZXRTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICBhIDwgMTAgJiYgKGEgPSAnMCcgKyBhKTsKICAgICAgICAgICAgICAgIHMubGlua1RyYWNrVmFycyA9ICdwcm9wMixwcm9wMyxwcm9wNCxwcm9wNSxwcm9wNixwcm9wMTgscHJvcDE5LHByb3AyMCxwcm9wMzEscHJvcDMzLHByb3AzNSxwcm9wNDEscHJvcDQ4LHByb3A1Mixwcm9wNTQscHJvcDU1LHByb3A1Nixwcm9wNzAscHJvcDcxLGVWYXI0LGVWYXI2LGVWYXIxMSxlVmFyMTMsZVZhcjQzLGVWYXI1MCxlVmFyNTIsZVZhcjU2LGVWYXI1MyxldmVudHMnLCBzLmVWYXI0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2xvZ2luOnN0YXR1cycpLCAnaGRyfExvZ2luJyA9PSBlICYmICh0ICs9ICdldmVudDMnKSwgJ2hkcnxTSUdOIE9VVCcgPT0gZSAmJiAodCArPSAnZXZlbnQxMCcsIHMuZVZhcjQgPSAnTG9nZ2VkIE91dCcpLCB0ICYmIChzLmxpbmtUcmFja0V2ZW50cyA9IHQsIHMuZXZlbnRzID0gdCksIHMucHJvcDQgPSAnRD12NCcsIHMucHJvcDUgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpyZWdpb24nKSwgcy5wcm9wNiA9ICdEPXY2Jywgcy5wcm9wMTggPSBzLnBhZ2VOYW1lLCBzLnByb3AxOSA9IGUsIHMucHJvcDIwID0gcy5wYWdlTmFtZSArICc6JyArIGUsIHMucHJvcDMxID0gJycgIT09IHMudmlzaXRvci5nZXRBbmFseXRpY3NWaXNpdG9ySUQoKSA/ICdbQ1NddjF8JyArIHMudmlzaXRvci5nZXRBbmFseXRpY3NWaXNpdG9ySUQoKSArICdbQ0VdJyA6IHMudmlzaXRvci5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLCBzLnByb3AzMyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OnBhZ2UgdHlwZScpLCBzLnByb3A0MSA9ICdEPXY0MScsIHMucHJvcDQzID0gJ0Q9djQzJzsKICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IERhdGUoKSwgYyA9IG8uZ2V0TW9udGgoKSArIDEsIGwgPSBvLmdldERhdGUoKSwgdSA9IG8uZ2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiBzLnByb3A1MiA9IHMuZVZhcjUyID0gdSArICctJyArIGMgKyAnLScgKyBsLCBzLnByb3A1NCA9ICdEPXY1NCcsIHMucHJvcDU1ID0gJ0Q9djU1Jywgcy5lVmFyNiA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdsb2dpbjp1c2VyLWlkJyksIHMuZVZhcjQzID0gJ0w6JyArIGUsIHMuZVZhcjU2ID0gcy5wcm9wNTYgPSBlLCBzLmVWYXI1MyA9ICcrMScsIG5sdHJrID0gJ3knLCBmZHhfZmlyZVNEb3RUTCh0aGlzLCAnbycsIGUpLCAhMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzMxN2NjMzRjNGM2MTkwZDIoZSkgewogICAgICAgICAgICBmZHhfc2V0TGlua1ZpZXcoZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfMDlhZDliMjc1ZDYxMGMxYihlKSB7CiAgICAgICAgICAgIC0xIDwgKGUgPSBmZHhfbGlua0Zvcm1hdChlKSkuaW5kZXhPZigndHJrLScpICYmIChlID0gZmR4X3RyYWNrTWFwcGluZyhlKSk7CiAgICAgICAgICAgIHZhciB0ID0gcy5wYWdlTmFtZSArICdeXicgKyBlICsgJ15eJyArIHMucGFnZU5hbWUgKyAnIHwgJyArIGUgKyAnXl4nOwogICAgICAgICAgICByZXR1cm4gcy5jX3coJ3NldExpbmsnLCB0LCAwKSwgITA7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfNzA4ZjM5YWYyMWNiMzNiNygpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBlID0gcy5jX3IoJ3NldExpbmsnKTsKICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUgJiYgJycgIT0gZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zcGxpdCgnXl4nKTsKICAgICAgICAgICAgICAgICAgICBzLnByb3AxOCA9IHRbMF0sIHMucHJvcDE5ID0gdFsxXSwgcy5wcm9wMjAgPSB0WzJdLCBzLmNfdygnU0NfTElOS1MnLCAnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhuLCAnU0MnLCAnZmR4X2dldExpbmtWaWV3Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl9kOWRhZjM5Nzg0OGU2OGE3KGUpIHsKICAgICAgICAgICAgZm9yICh2YXIgdCA9IGUuc3BsaXQoJ3wnKSwgbiA9ICcnLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAnJyAhPSBuICYmIChuICs9ICd8JyksIG4gKz0gdFtpXS50cmltKCk7CiAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzI5OWM1NTkzMmFkMGE5ZGUoZSkgewogICAgICAgICAgICB2YXIgdCA9IF9zYXRlbGxpdGUuZ2V0VmFyKCd0cmFjazpidG5NYXBwaW5nJyk7CiAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyA9PSB0eXBlb2YgdFtlXSA/IGUgOiB0W2VdOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyX2I5OGQ0ZmNkMmUxZjRhY2MoZSwgdCkgewogICAgICAgICAgICBzLmxpbmtUcmFja1ZhcnMgPSAnZVZhcjYsZVZhcjExMCxlVmFyNDMscHJvcDM3LHByb3A3MCxwcm9wNzEsZXZlbnRzJzsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocy5wcm9wMzcgPSBlLnRvU3RyaW5nKCksICdzaW5nbGUnID09IHQudG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgcy5ldmVudHMgPSBzLmFwbChzLmV2ZW50cywgJ2V2ZW50MTInLCAnLCcsIDIpLCBzLmxpbmtUcmFja0V2ZW50cyA9ICdldmVudDEyJzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnbXVsdGlwbGUnID09IHQudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICdmYWlsZWQnICE9IGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICYmIChuID0gZS5sZW5ndGgpLCBzLmV2ZW50cyA9IHMuYXBsKHMuZXZlbnRzLCAnZXZlbnQxODE9JyArIG4sICcsJywgMiksIHMubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50MTgxJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZkeF9maXJlU0RvdFRMKHRoaXMsICdkJyksICEwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICBmZHhfZGVidWcoaSwgJ1NDJywgJ2ZkeF9sb2dEb3dubG9hZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfOWRhNTU3NDBkM2NkM2QwZChlLCB0LCBuLCBpLCByLCBhKSB7CiAgICAgICAgICAgIGZkeF9sb2dQYWdlVmlldyhlLCB0LCBuLCBpLCByLCBhKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl8xYmZiYmFhNTg1MDlmYTk1KGUsIHQsIG4sIGksIHIpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBhID0gJyc7CiAgICAgICAgICAgICAgICB3d3dIb3N0Lm1hdGNoKC93d3coc2JveC5pZGV2fGJhc2UuaWRldnxkZXYuaWRldnxkcnQuaWRldnxzdHJlc3MuZG16LmlkZXZ8Yml0LmlkZXZ8dGVzdHwpLmZlZGV4LmNvbS9naSkgJiYgKGEgPSAnZmVkZXgvJyksIGEgIT0gZS5zbGljZSgwLCBhLmxlbmd0aCkgJiYgKGUgPSBhICsgZSksIHMucGFnZU5hbWUgPSBlLCBmZHhfZ2V0TGlua1ZpZXcoKSwgdCA/IChzLmxpbmtUcmFja0V2ZW50cyA9IHQsIHMuZXZlbnRzID0gdCkgOiAocy5saW5rVHJhY2tFdmVudHMgPSAnJywgcy5ldmVudHMgPSAnJyk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdzZWFyY2g6c3BEYXRhJyk7CiAgICAgICAgICAgICAgICB2b2lkIDAgIT09IG8gJiYgJycgIT0gbyAmJiBmZHhfc3BTcmNoKG8pLCBuICYmIChzLnByb3A0ID0gbiksIGkgJiYgKHMucHJvcDc0ID0gaSk7CiAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBEYXRlKCksIGwgPSAoYy5nZXRNb250aCgpLCBjLmdldERhdGUoKSwgYy5nZXRGdWxsWWVhcigpLCBjLmdldEhvdXJzKCksIGMuZ2V0TWludXRlcygpKTsKICAgICAgICAgICAgICAgIGwgPCAxMCAmJiAobCA9ICcwJyArIGwpOwogICAgICAgICAgICAgICAgdmFyIHUgPSBjLmdldFNlY29uZHMoKTsKICAgICAgICAgICAgICAgIHUgPCAxMCAmJiAodSA9ICcwJyArIHUpOwogICAgICAgICAgICAgICAgcy5lVmFyNDMgPSAnVjonICsgcy5wYWdlTmFtZSwgcy5wcm9wNDMgPSAnRD12NDMnOwogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpLCBwID0gZC5nZXRNb250aCgpICsgMSwgZiA9IGQuZ2V0RGF0ZSgpLCBnID0gZC5nZXRGdWxsWWVhcigpOwogICAgICAgICAgICAgICAgcy5wcm9wNTIgPSBzLmVWYXI1MiA9IGcgKyAnLScgKyBwICsgJy0nICsgZiwgciA/IChzLmRlbGF5ViA9ICEwLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBmZHhfZmlyZVNEb3RUKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3I6JyArIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIDIwMDApKSA6IGZkeF9maXJlU0RvdFQoKTsKICAgICAgICAgICAgfSBjYXRjaCAodikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yOicgKyB2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzU5OTMxYTJlMWVlOWI1MDcoZSwgdCkgewogICAgICAgICAgICB2b2lkIDAgIT09IGUgJiYgZmR4X2xvZ1B1cmNoYXNlKGUsIHQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyX2E4OGRjYTEzNTgxYjc2YzkoZSwgdCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBzLmV2ZW50cyA9ICcnOwogICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBlLkxvZ1B1cmNoYXNlUmVxdWVzdCAmJiBudWxsICE9PSBlLkxvZ1B1cmNoYXNlUmVxdWVzdCAmJiAoZS5Mb2dQdXJjaGFzZVJlcXVlc3QuY2xpZW50SWQgJiYgKGUuTG9nUHVyY2hhc2VSZXF1ZXN0LmNsaWVudElkID0gZS5Mb2dQdXJjaGFzZVJlcXVlc3QuY2xpZW50SWQudG9VcHBlckNhc2UoKSksICdNQUdTJyA9PSBlLkxvZ1B1cmNoYXNlUmVxdWVzdC5jbGllbnRJZCAmJiAoZmR4X2xvZ1B1cmNoYXNlTUFHUyhlLkxvZ1B1cmNoYXNlUmVxdWVzdCwgdCksIG4gPSAnTUFHU1NoaXBCdG4nKSwgJ01BR1InID09IGUuTG9nUHVyY2hhc2VSZXF1ZXN0LmNsaWVudElkICYmIChmZHhfbG9nUHVyY2hhc2VNQUdSKGUuTG9nUHVyY2hhc2VSZXF1ZXN0LCB0KSwgbiA9ICdNQUdSUmF0ZUJ0bicpKSwgbnVsbCAhPSBlICYmICdNQUdTJyA9PSBlLmNsaWVudElkICYmICd1bmRlZmluZWQnICE9PSBlLnBhZ2VOYW1lICYmIG51bGwgIT09IGUucGFnZU5hbWUgJiYgJycgIT09IGUucGFnZU5hbWUgJiYgKGZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWwoZSwgdCksIG4gPSBlLnBhZ2VOYW1lKSwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUuYXBwSWQgJiYgbnVsbCAhPT0gZS5hcHBJZCAmJiAnV1JFRycgPT0gZS5hcHBJZCAmJiAoZmR4X2xvZ1B1cmNoYXNlV1JFRyhlLCB0KSwgbiA9ICdXUkVHUmVnaXN0ZXJCdG4nKSwgJycgIT09IHMuZXZlbnRzICYmIChubHRyayA9ICd5Jywgcy5lVmFyNDAgPSAnRD1ldmVudHMnLCBzLnByb3A0MCA9ICdEPWV2ZW50cycsIHMucHJvcDQzID0gJ0Q9djQzJywgcy5wcm9wMTggPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpwYWdlIG5hbWUnKSwgcy5wcm9wMTkgPSBuLCBzLnByb3AyMCA9IHMucGFnZU5hbWUgKyAnOicgKyBuLCBzLmxpbmtUcmFja1ZhcnMgPSBzLmFwbChzLmxpbmtUcmFja1ZhcnMsICdwcm9wNixlVmFyNixwcm9wMTgscHJvcDE5LHByb3AyMCxwcm9wMzEsZVZhcjM4LHByb3A0MCxlVmFyNDAscHJvcDQzLGVWYXI0Myxwcm9wNDYsZVZhcjQ2LGVWYXI3MyxlVmFyNzUscHJvcDc0LGVWYXIxMTIsZVZhcjExMyxlVmFyMTE0LGVWYXIxMTUsZVZhcjExNixlVmFyMTE3LGVWYXIxMTgsZVZhcjExOSxlVmFyMTIwLGVWYXIxMjEsZVZhcjEzNixlVmFyMTM4LGVWYXIxMzksZVZhcjE0MixlVmFyMTQzLGVWYXIxNDUscHJvZHVjdHMscHVyY2hhc2VJRCxldmVudHMnLCAnLCcsIDIpLCBzLmxpbmtUcmFja0V2ZW50cyA9IHMuZXZlbnRzLCBmZHhfZmlyZVNEb3RUTCh0aGlzLCAnbycsIG4pLCBzLnByb2R1Y3RzID0gJycsIHMucHVyY2hhc2VJRCA9ICcnLCBzLmV2ZW50cyA9ICcnLCBzLmVWYXI3MyA9ICcnLCBzLmVWYXI3NSA9ICcnLCBzLnByb3A3NCA9ICcnLCAhKHMuZVZhcjQzID0gJycpKTsKICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZkeF9kZWJ1ZyhpLCAnU0MnLCAnZmR4X2xvZ1B1cmNoYXNlJyksICExOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfODVjZTk5YmIxODI5MDI1NChlLCB0KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9ICcnLCBpID0gZS5jbGllbnRJZCArICc6SU5UXycgKyBlLklOVDsKICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5jbGllbnRJZCAmJiAnJyAhPT0gZS5jbGllbnRJZCkgewogICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5zaGlwRGF0YSAmJiBudWxsICE9PSBlLnNoaXBEYXRhKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUuc2hpcERhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gJzonICsgciArICdfJyArIGUuc2hpcERhdGFbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuID0gJ1knID09IGUuSU5UID8gJ2V2ZW50NjgnIDogJ2V2ZW50NjcnLCBzLmV2ZW50cyA9ICdwdXJjaGFzZSwnICsgbiwgcy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cywgcy5lVmFyMTQzID0gaSwgcy5wcm9kdWN0cyA9ICc7TUFHUzs7OycgKyBuICsgJztlVmFyMTQzPScgKyBzLmVWYXIxNDMsIHMuZVZhcjQzID0gJ1M6TUFHUyc7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgdChlKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhhLCAnU0MnLCAnZmR4X2xvZ1B1cmNoYXNlTUFHUzpjYWxsYmFjaycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgZmR4X2RlYnVnKGEsICdTQycsICdmZHhfbG9nUHVyY2hhc2VNQUdTJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl9iNGM3NGQxZGYyYTU5NDI5KGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUgIT09IHVuZGVmaW5lZCAmJiBudWxsICE9PSBlICYmIGUuY29uc3RydWN0b3IgPT0gT2JqZWN0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzkxZjFmODAzZDkxNjg4ZjgoZSwgdCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIG4gPSAnJzsKICAgICAgICAgICAgICAgIGlmIChzLmxpbmtUcmFja1ZhcnMgPSBzLmFwbChzLmxpbmtUcmFja1ZhcnMsIE1BR1NFdmFyTWFwcGluZ1tlLnBhZ2VOYW1lXVswXSwgJywnLCAyKSwgaXNPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUuU1JDICYmICcnICE9IGUuU1JDICYmIChzLmxpbmtUcmFja1ZhcnMgPSBzLmFwbChzLmxpbmtUcmFja1ZhcnMsICdlVmFyMTY2JywgJywnLCAyKSwgcy5lVmFyMTY2ID0gZS5TUkMpLCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gaSArICdfJyArIHJbaV0gKyAnOic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbi5zdWJzdHJpbmcoMCwgbi5sZW5ndGggLSAxKSArICc6JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBhID0gbi5zdWJzdHJpbmcoMCwgbi5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIHMuZXZlbnRzID0gJ1NjQWRkLCcgKyBbTUFHU0V2YXJNYXBwaW5nW2UucGFnZU5hbWVdWzFdXSwgcy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cywgc1tbTUFHU0V2YXJNYXBwaW5nW2UucGFnZU5hbWVdWzBdXV0gPSBhLCBzLnByb2R1Y3RzID0gJztNQUdTOzs7OycgKyBNQUdTRXZhck1hcHBpbmdbZS5wYWdlTmFtZV1bMF0gKyAnPScgKyBzW01BR1NFdmFyTWFwcGluZ1tlLnBhZ2VOYW1lXVswXV0sIHMuZVZhcjQzID0gJ1M6JyArIGUucGFnZU5hbWU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0ICYmIHQob2JqKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG8pIHsKICAgICAgICAgICAgICAgICAgICBmZHhfZGVidWcobywgJ1NDJywgJ2ZkeF9sb2dQdXJjaGFzZV9QYWdlTGV2ZWw6Y2FsbGJhY2snKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgZmR4X2RlYnVnKG8sICdTQycsICdmZHhfbG9nUHVyY2hhc2VfUGFnZUxldmVsJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl9iNWUzY2YzNGFjZjEzZjNjKGUsIHQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBuID0gZS5jbGllbnRJZCArICc6SU5UXycgKyBlLklOVCwgaSA9IGUuY2xpZW50SWQ7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmICcnICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlLnNoaXBEYXRhICYmIG51bGwgIT09IGUuc2hpcERhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZS5zaGlwRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAnOicgKyByICsgJ18nICsgZS5zaGlwRGF0YVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5jb21EYXRhICYmIG51bGwgIT09IGUuY29tRGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBlLmNvbURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gJzonICsgciArICdfJyArIGUuY29tRGF0YVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHMuZXZlbnRzID0gJ3NjQWRkLGV2ZW50MTEwJywgcy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cywgcy5lVmFyMTM2ID0gbiwgcy5lVmFyMTQyID0gaSwgcy5wcm9kdWN0cyA9ICc7TUFHUjs7OztlVmFyMTM2PScgKyBzLmVWYXIxMzYgKyAnfGVWYXIxNDI9JyArIHMuZVZhcjE0Miwgcy5lVmFyNDMgPSAnUzpSYXRlTUFHUic7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgdChlKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhhLCAnU0MnLCAnZmR4X2xvZ1B1cmNoYXNlTUFHUjpjYWxsYmFjaycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgZmR4X2RlYnVnKGEsICdTQycsICdmZHhfbG9nUHVyY2hhc2VNQUdSJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl85OTI4NzBkNjAzODA2ODE3KGUsIHQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciBuID0gJycsIGkgPSAnJzsKICAgICAgICAgICAgICAgIG51bGwgIT0gZSAmJiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUucHJvZmlsZSAmJiAobiA9IHByb2Nlc3NEYXRhKGUucHJvZmlsZSkpLCAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5hZGR0RGF0YSAmJiAoaSA9IHByb2Nlc3NEYXRhKGUuYWRkdERhdGEpKSwgcy5lVmFyMTQ1ID0gbiArICd8JyArIGkpLCBzLmV2ZW50cyA9ICdzY0FkZCcsIHMubGlua1RyYWNrRXZlbnRzID0gcy5ldmVudHMsIHMucHJvZHVjdHMgPSAnOycgKyBlLmFwcElkICsgJzs7OztlVmFyMTQ1PScgKyBzLmVWYXIxNDUsIHMuZVZhcjQzID0gJ1M6JyArIGUuYXBwSWQ7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0ICYmIHQoZSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgZmR4X2RlYnVnKHIsICdTQycsICdmZHhfbG9nUHVyY2hhc2VXUkVHOmNhbGxiYWNrJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgIGZkeF9kZWJ1ZyhyLCAnU0MnLCAnZmR4X2xvZ1B1cmNoYXNlV1JFRycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfNjQzYzk5NDcyNzgzZjRhMihlKSB7CiAgICAgICAgICAgIHZhciB0ID0gJyc7CiAgICAgICAgICAgIGlmIChudWxsICE9IGUpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICB0ICs9ICc6JyArIG4gKyAnXycgKyBlW25dOwogICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgnOicsICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl8yOWFjYjZkZGVhNjljNDEwKGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgZS5qb2luID09IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCAmJiAnJyAhPSBwcm9wICYmIGVbcHJvcF0gJiYgJycgIT0gZVtwcm9wXSAmJiB0LnB1c2gocHJvcCwgJzonLCBmZHhfY29udmVydFRvU3RyKGVbcHJvcF0pLCAnLCcpOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgZS5qb2luICE9IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICBmb3IgKHByb3AgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCAmJiAnJyAhPSBwcm9wICYmIGVbcHJvcF0gJiYgJycgIT0gZVtwcm9wXSAmJiB0LnB1c2goZmR4X2NvbnZlcnRUb1N0cihlW3Byb3BdKSwgJywnKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nICE9IHR5cGVvZiBlICYmICcnICE9IGUudG9TdHJpbmcoKSAmJiB0LnB1c2goZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgIHJldHVybiB0LmpvaW4oJycpOwogICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICBmZHhfZGVidWcobiwgJ1NDJywgJ2ZkeF9jb252ZXJ0VG9TdHInKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzhjZTYyZGExMzM4OTVjZTkoZSwgdCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgaWYgKHMubGlua1RyYWNrVmFycyA9ICdwcm9wNixlVmFyNixwcm9wMzEsZVZhcjQzLHByb3A1MixlVmFyNTIscHJvcDU2LGVWYXI1NixlVmFyNTMscHJvcDE4LHByb3AxOSxwcm9wMjAscHJvcDQxLGV2ZW50cycsIGwgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5zdGF0dXMgJiYgZS5zdGF0dXMgPyBlLnN0YXR1cyA6ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhUG9waW5Bc2s6ICdldmVudDExMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnN0b0xBOiAnZXZlbnQxMTQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gKGEgPSBuW2xdLCBzLnByb3AxOCA9IHMucGFnZU5hbWUsIHMucHJvcDE5ID0gbCwgcy5wcm9wMjAgPSBzLnBhZ2VOYW1lICsgJzonICsgbCwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3JdICYmIChpICs9ICc6JyArIGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICBzLmVWYXIxNCA9IHQgKyAnOicgKyBzLnBhZ2VOYW1lICsgaSwgcy5saW5rVHJhY2tWYXJzID0gcy5hcGwocy5saW5rVHJhY2tWYXJzLCAnZVZhcjE0JywgJywnLCAyKSwgcy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cyA9IGEsIG5sdHJrID0gJ3knLCBmZHhfZmlyZVNEb3RUTCh0aGlzLCAnbycsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5jaGF0UmVxdWVzdCAmJiBudWxsICE9PSBlLmNoYXRSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAnJywgbyA9ICh0ID0gJycsICcnKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIChzLmxpbmtUcmFja1ZhcnMgPSAncHJvcDYsZVZhcjYscHJvcDMxLGVWYXI0Myxwcm9wNTIsZVZhcjUyLHByb3A1NixlVmFyNTYsZVZhcjUzLHByb3AxOCxwcm9wMTkscHJvcDIwLHByb3A0MSxldmVudHMnLCBlLmNoYXRSZXF1ZXN0WzBdLmNoYXREYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICcnICsgZS5jaGF0UmVxdWVzdFswXS5jaGF0RGF0YVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgbyArPSAnfCcgKyAociA9IHIucmVwbGFjZSgnfCcsICctJykpICsgJ18nICsgKGMgPSBjLnJlcGxhY2UoJ3wnLCAnLScpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCdDSEFUJyA9PSBlLmNoYXRSZXF1ZXN0WzBdLmNsaWVudElkKQogICAgICAgICAgICAgICAgICAgICAgICB0ID0gJ2xpdmVhZ2VudF9DSEFUJywgYSA9ICdldmVudDQ1Jywgcy5wcm9wNTkgPSBzLmVWYXI1OSA9IG8ucmVwbGFjZSgnfCcsICcnKSwgcy5saW5rVHJhY2tWYXJzID0gcy5hcGwocy5saW5rVHJhY2tWYXJzLCAnZVZhcjU5LHByb3A1OScsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ05JTkEnID09IGUuY2hhdFJlcXVlc3RbMF0uY2xpZW50SWQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gJ3ZhX05JTkEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBlLmNoYXRSZXF1ZXN0WzBdLmNoYXREYXRhLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAobiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YVBvcGluT3BlbjogJ2V2ZW50MTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YVBvcGluQ2xvc2U6ICdldmVudDExMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnN0b0xBOiAnZXZlbnQxMTQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVtsXSwgcy5lVmFyMTQgPSBvLnJlcGxhY2UoJ3wnLCAnJykucmVwbGFjZSgndmFQb3Bpbk9wZW4nLCAndmFQb3BpbicpLnJlcGxhY2UoJ3ZhUG9waW5DbG9zZScsICd2YVBvcGluJyksIHMubGlua1RyYWNrVmFycyA9IHMuYXBsKHMubGlua1RyYWNrVmFycywgJ2VWYXIxNCcsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkeF9kZWJ1Zyh1LCAnU0MnLCAnZmR4X2xvZ0NoYXQ6TklOQScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cyA9IGEsIG5sdHJrID0gJ3knLCBmZHhfZmlyZVNEb3RUTCh0aGlzLCAnbycsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoICh1KSB7CiAgICAgICAgICAgICAgICBmZHhfZGVidWcodSwgJ1NDJywgJ2ZkeF9sb2dDaGF0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl8yYThmZjgwZWUwZjNjZTU0KGUpIHsKICAgICAgICAgICAgY29uc3QgJF9fX29sZF9iYTIzYjRiMjVkN2Y2YmEwID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpLCAkX19fb2xkXzI1NjUyOTA4YmE5YTYxY2MgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnc2Vzc2lvblN0b3JhZ2UnKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JhMjNiNGIyNWQ3ZjZiYTApCiAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrX2M3Y2FlYzUwMWRjYTIzODcubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yNTY1MjkwOGJhOWE2MWNjKQogICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdzZXNzaW9uU3RvcmFnZScsICRfX19tb2NrX2M3Y2FlYzUwMWRjYTIzODcuc2Vzc2lvblN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmZkeF9jb250cm9sbGVyVmVyc2lvbiwgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIGUucGFnZU5hbWUgJiYgJycgPT0gZS5wYWdlTmFtZSAmJiAoX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6cGFnZSBuYW1lJyksIDEpICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OnBhZ2UgbmFtZScpICYmIChlLnBhZ2VOYW1lID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6cGFnZSBuYW1lJykpLCBlLnBhZ2VOYW1lID0gZS5wYWdlTmFtZS50b0xvd2VyQ2FzZSgpLCBlLmVWYXIzOCA9ICdEPXBhZ2VOYW1lJywgZS5lVmFyNTAgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcnKSwgZS5wcm9wNDYgPSBlLmVWYXI0NiA9ICdEPXBhZ2VOYW1lJzsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSwgbiA9IGUuZ2V0VGltZVBhcnRpbmcoJ2gnLCAnLTYnLCB0KSwgaSA9IGUuZ2V0VGltZVBhcnRpbmcoJ2QnLCAnLTYnLCB0KTsKICAgICAgICAgICAgICAgICAgICBlLmVWYXI3ID0gZS5wcm9wNyA9IG4gKyAnfCcgKyBpOwogICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IERhdGUoKSwgYSA9IHIuZ2V0TW9udGgoKSArIDEsIHMgPSByLmdldERhdGUoKSwgbyA9IHIuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgICAgICAgICBlLnByb3A1MiA9IGUuZVZhcjUyID0gbyArICctJyArIGEgKyAnLScgKyBzOwogICAgICAgICAgICAgICAgICAgIHZhciBjID0gZS5nZXRQcmV2aW91c1ZhbHVlKGUucGFnZU5hbWUsICdncHZfcGFnZU5hbWUnKTsKICAgICAgICAgICAgICAgICAgICBjICYmIChlLnByb3AxMiA9IGMsIGUuZVZhcjIgPSAnRD1jMTInKSwgZS5wcm9wMzUgPSAnRD1BY2NlcHQtTGFuZ3VhZ2UnLCBlLmVWYXI1MyA9ICcrMScsIGUuZVZhcjQwID0gJ0Q9ZXZlbnRzJzsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGUuZ2V0UGVyY2VudFBhZ2VWaWV3ZWQoZS5wYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gbCAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgbCAmJiA0ID09PSBsLmxlbmd0aCAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgbFsyXSAmJiAoZS5wcm9wNjAgPSBsWzJdICsgJzonICsgbFsxXSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICBmZHhfZGVidWcoZywgJ1NDJywgJ3NfZG9QbHVnaW5zOnBwdkFycmF5Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgnZCcgPT0gZS5saW5rVHlwZSAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5saW5rT2JqZWN0LmRhdGFzZXQuYWx0ICYmIChlLmxpbmtUeXBlID0gJycpLCAnZCcgPT0gZS5saW5rVHlwZSAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5saW5rT2JqZWN0ICYmIDAgIT09IGUubGlua09iamVjdCAmJiB2b2lkIDAgIT09IGUubGlua09iamVjdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSAmJiAoZS51cmwgPSBlLmxpbmtPYmplY3QuZ2V0QXR0cmlidXRlKCdocmVmJyksIGUucHJvcDM3ID0gZS5lVmFyMzcgPSBlLnVybC5zdWJzdHJpbmcoZS51cmwubGFzdEluZGV4T2YoJy8nKSArIDEsIGUudXJsLmxlbmd0aCksIGUuZVZhcjQzID0gJ0Q6JyArIGUucHJvcDM3LCBlLmV2ZW50cyA9IGUuYXBsKGUuZXZlbnRzLCAnZXZlbnQxMicsICcsJywgMiksIGUubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50MTInLCBlLmxpbmtUcmFja1ZhcnMgPSAncHJvcDE4LHByb3AxOSxwcm9wMjAsZVZhcjM3LGVWYXI0MyxldmVudHMnKSwgJ3knICE9IG5sdHJrICYmIChlLmVWYXI2ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2xvZ2luOnVzZXItaWQnKSwgZS5wcm9wNiA9ICdEPXY2JywgZS5saW5rVHJhY2tWYXJzID0gZS5hcGwoZS5saW5rVHJhY2tWYXJzLCAncHJvcDIscHJvcDMscHJvcDQscHJvcDUscHJvcDYscHJvcDE4LHByb3AxOSxwcm9wMjAscHJvcDMxLHByb3AzMyxwcm9wMzUscHJvcDQ4LHByb3A1MCxlVmFyNCxlVmFyNixlVmFyMTMsZVZhcjUwJywgJywnLCAyKSwgZS5zZXR1cExpbmtUcmFjaygncHJvcDE4LHByb3AxOSxwcm9wMjAnLCAnU0NfTElOS1MnKSwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUucHJvcDE5ICYmICcnICE9PSBlLnByb3AxOSAmJiAoLTEgPCBlLnByb3AxOS5pbmRleE9mKCdzcHJpdGUtcGxhY2Vob2xkZXIucG5nJykgJiYgKGUucHJvcDE5ID0gJ2hkcnxTZWFyY2gnKSwgZS5wcm9wMjAgPSBlLnByb3AxOCArICcgfCAnICsgZS5wcm9wMTkpKSwgZS5lVmFyNDUgfHwgKGUuZVZhcjQ1ID0gZS5VdGlsLmdldFF1ZXJ5UGFyYW0oJ0lOVENNUCcpLCBlLmVWYXI0NSA9IGUuZ2V0VmFsT25jZShlLmVWYXI0NSwgJ3NfaW50Y2FtcGFpZ24nLCAwKSwgZS5jbGlja1Bhc3QoZS5lVmFyNDUsICdldmVudDgyJywgJ2V2ZW50ODMnLCAnc19jcC1iYWcnKSksIGUuZVZhcjQ1ICYmIChlLmxpc3QxID0gZS5lVmFyNDUsIGUuZXZlbnRzID0gZS5hcGwoZS5ldmVudHMsICdldmVudDQ0JywgJywnLCAyKSksICFlLmNhbXBhaWduKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FtcGFpZ24gPSBlLlV0aWwuZ2V0UXVlcnlQYXJhbSgnQ01QJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gZS5VdGlsLmdldFF1ZXJ5UGFyYW0oJ0xJTksnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5jYW1wYWlnbiAmJiB1ICYmIChlLmVWYXI1OCA9IHUpLCAnJyA9PSBlLmNhbXBhaWduICYmIChlLmNhbXBhaWduID0gZmR4X2NhbXBhaWduKCkpLCBlLmNhbXBhaWduID0gZS5nZXRWYWxPbmNlKGUuY2FtcGFpZ24sICdzX2NhbXBhaWduJywgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUuY2xpY2tQYXN0KGUuY2FtcGFpZ24sICdldmVudDIzJywgJ2V2ZW50MjQnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGUuZ2V0QWFtU2VnbWVudHMoJ2FhbV9zYycsICdhYW1zYycpLnJlcGxhY2UoL1x8L2csICcsJyk7CiAgICAgICAgICAgICAgICAgICAgZS5saXN0MiA9IGUuYXBsKGUubGlzdDIsIGQsICcsJywgMiksIGUucHJvcDQ4ID0gc192ZXJzaW9uICsgJ18nICsgc2NfY29kZV92ZXIgKyAnXycgKyBzY19jb2RlX3Zlcl9kYXRlLCBlLnByb3A1MCA9IHNfYWNjb3VudDsKICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IF9mZHguZ2V0VGVzdExldmVsKCk7CiAgICAgICAgICAgICAgICAgICAgcCAmJiAoZS5wcm9wNTAgKz0gJ19MYXVuY2hfJyArIHApLCBlLmVWYXI0MSA9IGUuZ2V0VmlzaXROdW0oJ2QnKSwgZS5wcm9wMzEgPSAnJyAhPT0gZS52aXNpdG9yLmdldEFuYWx5dGljc1Zpc2l0b3JJRCgpID8gJ1tDU112MXwnICsgZS52aXNpdG9yLmdldEFuYWx5dGljc1Zpc2l0b3JJRCgpICsgJ1tDRV0nIDogZS52aXNpdG9yLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCksIG5sdHJrID0gJycsICd1bmRlZmluZWQnICE9IHR5cGVvZiBwcnA3MiAmJiAnJyAhPSBwcnA3MiAmJiAoZS5wcm9wNzIgPSBwcnA3Mik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAnJzsKICAgICAgICAgICAgICAgICAgICAoZiA9IF9zYXRlbGxpdGUuY29va2llLmdldCgnUmJ0JykpICE9IHVuZGVmaW5lZCAmJiAnJyAhPSBmICYmICdmMScgPT09IGYgJiYgKGUuYWJvcnQgPSAhMCk7CiAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9iYTIzYjRiMjVkN2Y2YmEwKQogICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2JhMjNiNGIyNWQ3ZjZiYTApKTsKICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzI1NjUyOTA4YmE5YTYxY2MpCiAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJywgJF9fX29sZF8yNTY1MjkwOGJhOWE2MWNjKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl83NDdmN2FjMjRjZmY5ZTU5KCkgewogICAgICAgICAgICBmdW5jdGlvbiBlKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0LCBuLCBpLCByID0gdGhpcywgYSA9IChuZXcgRGF0ZSgpLCByLmNfcnIoZSkpLCBzID0gci5jX3JzcGVycygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGEgfHwgKGUgPSByLlV0aWwudXJsRGVjb2RlKGUpLCBuID0gKHQgPSAocyA9ICh0ID0gcy5pbmRleE9mKCcgJyArIGUgKyAnPScpKSA8IDAgPyByLmNfcnIoJ3Nfc2VzcycpIDogcykuaW5kZXhPZignICcgKyBlICsgJz0nKSkgPCAwID8gdCA6IHMuaW5kZXhPZignfCcsIHQpLCBpID0gdCA8IDAgPyB0IDogcy5pbmRleE9mKCc7JywgdCksIG4gPSAwIDwgbiA/IG4gOiBpLCBhID0gdCA8IDAgPyAnJyA6IHIuVXRpbC51cmxEZWNvZGUocy5zdWJzdHJpbmcodCArIDIgKyBlLmxlbmd0aCwgbiA8IDAgPyBzLmxlbmd0aCA6IG4pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gcy5jX3JyKCdzX3BlcnMnKSwgdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBuID0gbnVsbCwgaSA9IFtdLCByID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gMCwgbyA9IChpID0gZS5zcGxpdCgnOycpKS5sZW5ndGg7IGEgPCBvOyBhKyspCiAgICAgICAgICAgICAgICAgICAgKG4gPSBpW2FdLm1hdGNoKC9cfChbMC05XSspJC8pKSAmJiBwYXJzZUludChuWzFdKSA+PSB0ICYmIChyICs9IGlbYV0gKyAnOycpOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgaSwgciwgYSwgcywgbyA9IHRoaXMsIGMgPSBuZXcgRGF0ZSgpLCBsID0gMCwgdSA9ICdzX3BlcnMnLCBkID0gJ3Nfc2VzcycsIHAgPSAwLCBmID0gMDsKICAgICAgICAgICAgICAgIGlmIChjLnNldFRpbWUoYy5nZXRUaW1lKCkgLSA2MDAwMCksIG8uY19ycihlKSAmJiBvLmNfd3IoZSwgJycsIGMpLCBlID0gby5VdGlsLnVybEVuY29kZShlKSwgLTEgPCAoYSA9IChpID0gby5jX3JzcGVycygpKS5pbmRleE9mKCcgJyArIGUgKyAnPScpKSAmJiAoaSA9IGkuc3Vic3RyaW5nKDAsIGEpICsgaS5zdWJzdHJpbmcoaS5pbmRleE9mKCc7JywgYSkgKyAxKSwgcCA9IDEpLCAtMSA8IChhID0gKHIgPSBvLmNfcnIoZCkpLmluZGV4T2YoJyAnICsgZSArICc9JykpICYmIChyID0gci5zdWJzdHJpbmcoMCwgYSkgKyByLnN1YnN0cmluZyhyLmluZGV4T2YoJzsnLCBhKSArIDEpLCBmID0gMSksIGMgPSBuZXcgRGF0ZSgpLCBuID8gbi5nZXRUaW1lKCkgPiBjLmdldFRpbWUoKSAmJiAoaSArPSAnICcgKyBlICsgJz0nICsgby5VdGlsLnVybEVuY29kZSh0KSArICd8JyArIG4uZ2V0VGltZSgpICsgJzsnLCBwID0gMSkgOiAociArPSAnICcgKyBlICsgJz0nICsgby5VdGlsLnVybEVuY29kZSh0KSArICc7JywgZiA9IDEpLCByID0gci5yZXBsYWNlKC8lMDAvZywgJycpLCBpID0gaS5yZXBsYWNlKC8lMDAvZywgJycpLCBmICYmIG8uY193cihkLCByLCAwKSwgcCkgewogICAgICAgICAgICAgICAgICAgIGZvciAocyA9IGk7IHMgJiYgLTEgIT0gcy5pbmRleE9mKCc7Jyk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gcGFyc2VJbnQocy5zdWJzdHJpbmcocy5pbmRleE9mKCd8JykgKyAxLCBzLmluZGV4T2YoJzsnKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcocy5pbmRleE9mKCc7JykgKyAxKSwgbCA9IGwgPCBnID8gZyA6IGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGMuc2V0VGltZShsKSwgby5jX3dyKHUsIGksIGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHQgPT0gby5jX3Ioby5VdGlsLnVybEVuY29kZShlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcy5kb1BsdWdpbnMgPSBzX2RvUGx1Z2lucywgcy5wX2NoZWNrSW50ZXJ2YWwgPSBuZXcgQXJyYXkoKSwgcy5wX2NiY3QgPSAwLCBzLnRfY2IgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgIGUgPSA0MDAwOwogICAgICAgICAgICAgICAgdCB8fCAodCA9ICdzX3BfY2FsbEJhY2tDb2RlJyksIGludGVydmFsID0gMTAwLCBuLnBfY2J3YWl0ID0gMDsKICAgICAgICAgICAgICAgIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBuLnJjICYmIChpID0gbi5yY1tuLnZpc2l0b3JOYW1lc3BhY2VdKSwgaSA+IG4ucF9jYmN0ICYmIChuLnBfY2JjdCsrLCBuLnBfY2hlY2tJbnRlcnZhbFtpXSA9IHNldEludGVydmFsKCdzLnBfY2FsbEJhY2soJyArIGUgKyAnLCAnICsgaSArICcsIFwnJyArIHQgKyAnXCcpJywgaW50ZXJ2YWwpKTsKICAgICAgICAgICAgfSwgcy5wX2NhbGxCYWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gdGhpczsKICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBuLnZpc2l0b3JOYW1lc3BhY2UgJiYgKG4udmlzaXRvck5hbWVzcGFjZSA9IHNfYWNjb3VudCk7CiAgICAgICAgICAgICAgICB2YXIgaSA9ICcnOwogICAgICAgICAgICAgICAgMSA8IHQgJiYgKGkgPSAnXycgKyAodCAtIDEpKTsKICAgICAgICAgICAgICAgIHZhciByID0gJ3NfaV8nICsgbi52aXNpdG9yTmFtZXNwYWNlICsgaTsKICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93W3JdICYmIDAgPCB3aW5kb3dbcl0uaGVpZ2h0ID8gKGNsZWFySW50ZXJ2YWwobi5wX2NoZWNrSW50ZXJ2YWxbdF0pLCAhMCkgOiAobi5wX2Nid2FpdCArPSBpbnRlcnZhbCwgbi5wX2Nid2FpdCA+IGUgJiYgKGNsZWFySW50ZXJ2YWwobi5wX2NoZWNrSW50ZXJ2YWxbdF0pLCAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93W3JdICYmICh3aW5kb3dbcl0uc3JjID0gJ2h0dHBzOi8vd3d3LmZlZGV4LmNvbS9pbWFnZXMvYXNjZW5kL3NoYXJlZC9oZWFkZXJzL2NvcnBfbG9nby5naWY/c2NfcmVzcG9uc2VfZmFpbHVyZScpKSwgITEpOwogICAgICAgICAgICB9LCBzLmxvb2t1cGxvb2t1cCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciwgYSwgcywgbywgYywgbCwgdSA9IHRoaXMsIGQgPSAwLCBwID0gZSA/IGUubGVuZ3RoIDogMCwgZiA9IG5ldyBBcnJheSgpLCBnID0gbmV3IEFycmF5KCk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcDsgaSsrKQogICAgICAgICAgICAgICAgICAgIC0xIDwgKHQgPSBlLmluZGV4T2YoJ3wnLCBpKSkgJiYgKGZbZF0gPSBlLnN1YnN0cmluZyhpLCB0KSwgZCsrLCBpID0gdCk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMCwgYSA9IGZbaV0gPyBmW2ldLmxlbmd0aCA6IDAsIGogPSAwOyBqIDwgYTsgaisrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPCAociA9IGZbaV0uaW5kZXhPZignficsIGopKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdbbl0gPSBmW2ldLnN1YnN0cmluZyhqLCByKSwgbisrLCBqID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT0gciAmJiBuIDwgMyB8fCAzIDwgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PSByICYmIDMgPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdbbl0gPSBmW2ldLnN1YnN0cmluZyhqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PSByICYmIDMgPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9IGdbMF0sIHMgPSBnWzFdLCBjID0gZ1syXSwgbCA9IGdbM10sIG8gJiYgJ2MnID09IGMgJiYgLTEgPCB1LnBhZ2VOYW1lLmluZGV4T2YobykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuZXZlbnRzID0gdS5hcGwodS5ldmVudHMsIGwsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAmJiAnZScgPT0gYyAmJiB1LnBhZ2VOYW1lID09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuZXZlbnRzID0gdS5hcGwodS5ldmVudHMsIGwsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiAnYycgPT0gYyAmJiAtMSA8IGRvY3VtZW50LlVSTC5pbmRleE9mKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmV2ZW50cyA9IHUuYXBsKHUuZXZlbnRzLCBsLCAnLCcsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgJ2UnID09IGMgJiYgZG9jdW1lbnQuVVJMID09IHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuZXZlbnRzID0gdS5hcGwodS5ldmVudHMsIGwsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgcy5mYWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbjsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5hY3RpdmVFbGVtZW50IHx8ICFlLmFjdGl2ZUVsZW1lbnQudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICh0ID0gZS5hY3RpdmVFbGVtZW50KS50eXBlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB8fCAhZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBuID0gKHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KS50eXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ3RleHQnID09IG4gfHwgJ3RleHRhcmVhJyA9PSBuIHx8ICdjaGVja2JveCcgPT0gbiB8fCAncmFkaW8nID09IG4gfHwgJ3NlbGVjdC1vbmUnID09IG4gfHwgJ2J1dHRvbicgPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyA9PSAoaSA9ICcnID09PSBpID8gdC5uYW1lIDogaSkgJiYgdC5vdXRlckhUTUwgJiYgJycgIT09IHQub3V0ZXJIVE1MICYmIChpID0gdC5vdXRlckhUTUwuc3Vic3RyaW5nKDAsIDg1KSksICcnID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZkeF9nZXRDb29raWUoJ3NfbGZmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gKGkgPSB2b2lkIDAgIT09IHIgPyByIDogJ1tQTjonICsgcy5wYWdlTmFtZSArICddJykucmVwbGFjZShzLmZvcm1OYW1lICsgJ3wnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZmR4X3NldENvb2tpZSgnc19sZmYnLCBzLmZvcm1OYW1lICsgJ3wnICsgaSwgMzAsICcvJywgJy5mZWRleC5jb20nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZmR4X2RlYnVnKGEsICdTQycsICdzLmZhZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBzLnBhcnRuZXJERkFDaGVjayA9IG5ldyBGdW5jdGlvbignY2ZnJywgJ3ZhciBzPXRoaXMsYz1jZmcudmlzaXRDb29raWUsc3JjPWNmZy5jbGlja1Rocm91Z2hQYXJhbSxzY3A9Y2ZnLnNlYXJjaENlbnRlclBhcmFtLHA9Y2ZnLm5ld1JzaWRzUHJvcCx0dj1jZmcudEV2YXIsZGw9XCcsXCcsY3IsbmMscSxnLGdzLGksaixrLGZuZCx2PTEsdD1uZXcgRGF0ZSxjbj0wLGNhPW5ldyBBcnJheSxhYT1uZXcgQXJyYXksY3M9bmV3IEFycmF5O3Quc2V0VGltZSh0LmdldFRpbWUoKSsxODAwMDAwKTtjcj1zLmNfcihjKTtpZihjcil7dj0wO31jYT1zLnNwbGl0KGNyLGRsKTtpZihzLnVuKWFhPXMuc3BsaXQocy51bixkbCk7ZWxzZSBhYT1zLnNwbGl0KHMuYWNjb3VudCxkbCk7Zm9yKGk9MDtpPGFhLmxlbmd0aDtpKyspe2ZuZCA9IDA7Zm9yKGo9MDtqPGNhLmxlbmd0aDtqKyspe2lmKGFhW2ldID09IGNhW2pdKXtmbmQ9MTt9fWlmKCFmbmQpe2NzW2NuXT1hYVtpXTtjbisrO319aWYoY3MubGVuZ3RoKXtmb3Ioaz0wO2s8Y3MubGVuZ3RoO2srKyl7bmM9KG5jP25jK2RsOlwnXCcpK2NzW2tdO31jcj0oY3I/Y3IrZGw6XCdcJykrbmM7cy52cHIocCxuYyk7dj0xO31pZihzLndkKXE9cy53ZC5sb2NhdGlvbi5zZWFyY2gudG9Mb3dlckNhc2UoKTtlbHNlIHE9cy53LmxvY2F0aW9uLnNlYXJjaC50b0xvd2VyQ2FzZSgpO3E9cy5yZXBsKHEsXCc/XCcsXCcmXCcpO2c9cS5pbmRleE9mKFwnJlwnK3NyYy50b0xvd2VyQ2FzZSgpK1wnPVwnKTtncz0oc2NwKT9xLmluZGV4T2YoXCcmXCcrc2NwLnRvTG93ZXJDYXNlKCkrXCc9XCcpOi0xO2lmKGc+LTEpe3MudnByKHAsY3IpO3Y9MTt9ZWxzZSBpZihncz4tMSl7dj0wO3MudnByKHR2LFwnU2VhcmNoQ2VudGVyIFZpc2l0b3JzXCcpO31pZighcy5jX3coYyxjcix0KSl7cy5jX3coYyxjciwwKTt9aWYoIXMuY19yKGMpKXt2PTA7fXJldHVybiB2Pj0xOycpLCBzLnZwciA9IG5ldyBGdW5jdGlvbigndnMnLCAndicsICdpZih0eXBlb2YodikhPVwndW5kZWZpbmVkXCcgJiYgdnMpe3ZhciBzPXRoaXM7IGV2YWwoXCdzLlwnK3ZzK1wnPSJcJyt2K1wnIlwnKX0nKSwgcy5nZXRBY3Rpb25EZXB0aCA9IG5ldyBGdW5jdGlvbignYycsICd2YXIgcz10aGlzLHY9MSx0PW5ldyBEYXRlO3Quc2V0VGltZSh0LmdldFRpbWUoKSsxODAwMDAwKTtpZighcy5jX3IoYykpe3Y9MX1pZihzLmNfcihjKSl7dj1zLmNfcihjKTt2Kyt9aWYoIXMuY193KGMsdix0KSl7cy5jX3coYyx2LDApfXJldHVybiB2OycpLCBzLmdldFZpc2l0TnVtID0gbmV3IEZ1bmN0aW9uKCd0cCcsICdjJywgJ2MyJywgJ3ZhciBzPXRoaXMsZT1uZXcgRGF0ZSxjdmFsLGN2aXNpdCxjdD1lLmdldFRpbWUoKSxkO2lmKCF0cCl7dHA9XCdtXCc7fWlmKHRwPT1cJ21cJ3x8dHA9PVwnd1wnfHx0cD09XCdkXCcpe2VvPXMuZW5kb2YodHApLHk9ZW8uZ2V0VGltZSgpO2Uuc2V0VGltZSh5KTt9ZWxzZSB7ZD10cCo4NjQwMDAwMDtlLnNldFRpbWUoY3QrZCk7fWlmKCFjKXtjPVwnc192bnVtXCc7fWlmKCFjMil7YzI9XCdzX2ludmlzaXRcJzt9Y3ZhbD1zLmNfcihjKTtpZihjdmFsKXt2YXIgaT1jdmFsLmluZGV4T2YoXCcmdm49XCcpLHN0cj1jdmFsLnN1YnN0cmluZyhpKzQsY3ZhbC5sZW5ndGgpLGs7fWN2aXNpdD1zLmNfcihjMik7aWYoY3Zpc2l0KXtpZihzdHIpe2Uuc2V0VGltZShjdCsxODAwMDAwKTtzLmNfdyhjMixcJ3RydWVcJyxlKTtyZXR1cm4gc3RyO31lbHNlIHtyZXR1cm4gXCd1bmtub3duIHZpc2l0IG51bWJlclwnO319ZWxzZSB7aWYoc3RyKXtzdHIrKztrPWN2YWwuc3Vic3RyaW5nKDAsaSk7ZS5zZXRUaW1lKGspO3MuY193KGMsaytcJyZ2bj1cJytzdHIsZSk7ZS5zZXRUaW1lKGN0KzE4MDAwMDApO3MuY193KGMyLFwndHJ1ZVwnLGUpO3JldHVybiBzdHI7fWVsc2Uge3MuY193KGMsZS5nZXRUaW1lKCkrXCcmdm49MVwnLGUpO2Uuc2V0VGltZShjdCsxODAwMDAwKTtzLmNfdyhjMixcJ3RydWVcJyxlKTtyZXR1cm4gMTt9fScpLCBzLmRpbW8gPSBuZXcgRnVuY3Rpb24oJ20nLCAneScsICd2YXIgZD1uZXcgRGF0ZSh5LG0rMSwwKTtyZXR1cm4gZC5nZXREYXRlKCk7JyksIHMuZW5kb2YgPSBuZXcgRnVuY3Rpb24oJ3gnLCAndmFyIHQ9bmV3IERhdGU7dC5zZXRIb3VycygwKTt0LnNldE1pbnV0ZXMoMCk7dC5zZXRTZWNvbmRzKDApO2lmKHg9PVwnbVwnKXtkPXMuZGltbyh0LmdldE1vbnRoKCksdC5nZXRGdWxsWWVhcigpKS10LmdldERhdGUoKSsxO31lbHNlIGlmKHg9PVwnd1wnKXtkPTctdC5nZXREYXkoKTt9ZWxzZSB7ZD0xO310LnNldERhdGUodC5nZXREYXRlKCkrZCk7cmV0dXJuIHQ7JyksIHMuZ2V0VmlzaXRTdGFydCA9IG5ldyBGdW5jdGlvbignYycsICd2YXIgcz10aGlzLHY9MSx0PW5ldyBEYXRlO3Quc2V0VGltZSh0LmdldFRpbWUoKSsxODAwMDAwKTtpZihzLmNfcihjKSl7dj0wfWlmKCFzLmNfdyhjLDEsdCkpe3MuY193KGMsMSwwKX1pZighcy5jX3IoYykpe3Y9MH1yZXR1cm4gdjsnKSwgcy5jcm9zc1Zpc2l0UGFydGljaXBhdGlvbiA9IG5ldyBGdW5jdGlvbigndicsICdjbicsICdleCcsICdjdCcsICdkbCcsICdldicsICdkdicsICd2YXIgcz10aGlzLGNlO2lmKHR5cGVvZihkdik9PT1cJ3VuZGVmaW5lZFwnKWR2PTA7aWYocy5ldmVudHMmJmV2KXt2YXIgYXk9cy5zcGxpdChldixcJyxcJyk7dmFyIGVhPXMuc3BsaXQocy5ldmVudHMsXCcsXCcpO2Zvcih2YXIgdT0wO3U8YXkubGVuZ3RoO3UrKyl7Zm9yKHZhciB4PTA7eDxlYS5sZW5ndGg7eCsrKXtpZihheVt1XT09ZWFbeF0pe2NlPTE7fX19fWlmKCF2fHx2PT1cJ1wnKXtpZihjZSl7cy5jX3coY24sXCdcJyk7cmV0dXJuXCdcJzt9ZWxzZSByZXR1cm5cJ1wnO312PWVzY2FwZSh2KTt2YXIgYXJyeT1uZXcgQXJyYXkoKSxhPW5ldyBBcnJheSgpLGM9cy5jX3IoY24pLGc9MCxoPW5ldyBBcnJheSgpO2lmKGMmJmMhPVwnXCcpe2Fycnk9cy5zcGxpdChjLFwnXSxbXCcpO2ZvcihxPTA7cTxhcnJ5Lmxlbmd0aDtxKyspe3o9YXJyeVtxXTt6PXMucmVwbCh6LFwnW1wnLFwnXCcpO3o9cy5yZXBsKHosXCddXCcsXCdcJyk7ej1zLnJlcGwoeiwiXCciLFwnXCcpO2FycnlbcV09cy5zcGxpdCh6LFwnLFwnKX19dmFyIGU9bmV3IERhdGUoKTtlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSs1KTtpZihkdj09MCYmYXJyeS5sZW5ndGg+MCYmYXJyeVthcnJ5Lmxlbmd0aC0xXVswXT09dilhcnJ5W2FycnkubGVuZ3RoLTFdPVt2LG5ldyBEYXRlKCkuZ2V0VGltZSgpXTtlbHNlIGFycnlbYXJyeS5sZW5ndGhdPVt2LG5ldyBEYXRlKCkuZ2V0VGltZSgpXTt2YXIgc3RhcnQ9YXJyeS5sZW5ndGgtY3Q8MD8wOmFycnkubGVuZ3RoLWN0O3ZhciB0ZD1uZXcgRGF0ZSgpO2Zvcih2YXIgeD1zdGFydDt4PGFycnkubGVuZ3RoO3grKyl7dmFyIGRpZmY9TWF0aC5yb3VuZCgodGQuZ2V0VGltZSgpLWFycnlbeF1bMV0pLzg2NDAwMDAwKTtpZihkaWZmPGV4KXtoW2ddPXVuZXNjYXBlKGFycnlbeF1bMF0pO2FbZ109W2FycnlbeF1bMF0sYXJyeVt4XVsxXV07ZysrO319dmFyIGRhdGE9cy5qb2luKGEse2RlbGltOlwnLFwnLGZyb250OlwnW1wnLGJhY2s6XCddXCcsd3JhcDoiXCcifSk7cy5jX3coY24sZGF0YSxlKTt2YXIgcj1zLmpvaW4oaCx7ZGVsaW06ZGx9KTtpZihjZSlzLmNfdyhjbixcJ1wnKTtyZXR1cm4gcjsnKSwgcy5wX2dwdm5lID0gbmV3IEZ1bmN0aW9uKCdrJywgJ3UnLCAndmFyIHM9dGhpcyx2PVwnXCcsaT11LmluZGV4T2YoXCc/XCcpLHE7aWYoayYmaT4tMSl7cT11LnN1YnN0cmluZyhpKzEpO3Y9cy5wdChxLFwnJlwnLFwncF9ndmZuZVwnLGspfXJldHVybiB2JyksIHMucF9ndmZuZSA9IG5ldyBGdW5jdGlvbigndCcsICdrJywgJ2lmKHQpe3ZhciBzPXRoaXMsaT10LmluZGV4T2YoXCc9XCcpLHA9aTwwP3Q6dC5zdWJzdHJpbmcoMCxpKSx2PWk8MD9cJ1RydWVcJzp0LnN1YnN0cmluZyhpKzEpO2lmKHAudG9Mb3dlckNhc2UoKT09ay50b0xvd2VyQ2FzZSgpKXJldHVybiB2O31yZXR1cm4gXCdcJycpLCBzLnB0ID0gbmV3IEZ1bmN0aW9uKCd4JywgJ2QnLCAnZicsICdhJywgJ3ZhciBzPXRoaXMsdD14LHo9MCx5LHI7d2hpbGUodCl7eT10LmluZGV4T2YoZCk7eT15PDA/dC5sZW5ndGg6eTt0PXQuc3Vic3RyaW5nKDAseSk7cj1zW2ZdKHQsYSk7aWYocilyZXR1cm4gcjt6Kz15K2QubGVuZ3RoO3Q9eC5zdWJzdHJpbmcoeix4Lmxlbmd0aCk7dD16PHgubGVuZ3RoP3Q6XCdcJ31yZXR1cm5cJ1wnOycpLCBzLmdldFF1ZXJ5UGFyYW1Ob0VuY29kZSA9IG5ldyBGdW5jdGlvbigncCcsICdkJywgJ3UnLCAndmFyIHM9dGhpcyx2PVwnXCcsaSx0O2Q9ZD9kOlwnXCc7dT11P3U6KHMucGFnZVVSTD9zLnBhZ2VVUkw6d2luZG93LmxvY2F0aW9uKTtpZih1PT1cJ2ZcJyl1PXMuZ3RmcygpLmxvY2F0aW9uO3doaWxlKHApe2k9cC5pbmRleE9mKFwnLFwnKTtpPWk8MD9wLmxlbmd0aDppO3Q9cy5wX2dwdm5lKHAuc3Vic3RyaW5nKDAsaSksdStcJ1wnKTtpZih0KXYrPXY/ZCt0OnQ7cD1wLnN1YnN0cmluZyhpPT1wLmxlbmd0aD9pOmkrMSl9cmV0dXJuIHYnKSwgcy5nZXROZXdSZXBlYXQgPSBuZXcgRnVuY3Rpb24oJ2QnLCAnY24nLCAndmFyIHM9dGhpcyxlPW5ldyBEYXRlKCksY3ZhbCxzdmFsLGN0PWUuZ2V0VGltZSgpO2Q9ZD9kOjMwO2NuPWNuP2NuOlwnc19uclwnO2Uuc2V0VGltZShjdCtkKjI0KjYwKjYwKjEwMDApO2N2YWw9cy5jX3IoY24pO2lmKGN2YWwubGVuZ3RoPT0wKXtzLmNfdyhjbixjdCtcJy1OZXdcJyxlKTtyZXR1cm5cJ05ld1wnO31zdmFsPXMuc3BsaXQoY3ZhbCxcJy1cJyk7aWYoY3Qtc3ZhbFswXTwzMCo2MCoxMDAwJiZzdmFsWzFdPT1cJ05ld1wnKXtzLmNfdyhjbixjdCtcJy1OZXdcJyxlKTtyZXR1cm5cJ05ld1wnO31lbHNle3MuY193KGNuLGN0K1wnLVJlcGVhdFwnLGUpO3JldHVyblwnUmVwZWF0XCc7fScpLCBzLmdldFZhbE9uY2UgPSBuZXcgRnVuY3Rpb24oJ3YnLCAnYycsICdlJywgJ3ZhciBzPXRoaXMsaz1zLmNfcihjKSxhPW5ldyBEYXRlO2U9ZT9lOjA7aWYodil7YS5zZXRUaW1lKGEuZ2V0VGltZSgpK2UqODY0MDAwMDApO3MuY193KGMsdixlP2E6MCk7fXJldHVybiB2PT1rP1wnXCc6dicpLCBzLmdldFByZXZpb3VzVmFsdWUgPSBuZXcgRnVuY3Rpb24oJ3YnLCAnYycsICdlbCcsICd2YXIgcz10aGlzLHQ9bmV3IERhdGUsaSxqLHI9XCdcJzt0LnNldFRpbWUodC5nZXRUaW1lKCkrMTgwMDAwMCk7aWYoZWwpe2lmKHMuZXZlbnRzKXtpPXMuc3BsaXQoZWwsXCcsXCcpO2o9cy5zcGxpdChzLmV2ZW50cyxcJyxcJyk7Zm9yKHggaW4gaSl7Zm9yKHkgaW4gail7aWYoaVt4XT09alt5XSl7aWYocy5jX3IoYykpIHI9cy5jX3IoYyk7dj9zLmNfdyhjLHYsdCk6cy5jX3coYyxcJ25vIHZhbHVlXCcsdCk7cmV0dXJuIHJ9fX19fWVsc2V7aWYocy5jX3IoYykpIHI9cy5jX3IoYyk7dj9zLmNfdyhjLHYsdCk6cy5jX3coYyxcJ25vIHZhbHVlXCcsdCk7cmV0dXJuIHJ9JyksIHMuZ2V0VGltZVBhcnRpbmcgPSBuZXcgRnVuY3Rpb24oJ3QnLCAneicsICd5JywgJ2RjPW5ldyBEYXRlKFwnMS8xLzIwMDBcJyk7Zj0xNTtuZT04O2lmKGRjLmdldERheSgpIT02fHxkYy5nZXRNb250aCgpIT0wKXtyZXR1cm5cJ0RhdGEgTm90IEF2YWlsYWJsZVwnfWVsc2V7O3o9cGFyc2VJbnQoeik7aWYoeT09XCcyMDA5XCcpe2Y9ODtuZT0xfTtnbWFyPW5ldyBEYXRlKFwnMy8xL1wnK3kpO2RzdHM9Zi1nbWFyLmdldERheSgpO2dub3Y9bmV3IERhdGUoXCcxMS8xL1wnK3kpO2RzdGU9bmUtZ25vdi5nZXREYXkoKTtzcHI9bmV3IERhdGUoXCczL1wnK2RzdHMrXCcvXCcreSk7Zmw9bmV3IERhdGUoXCcxMS9cJytkc3RlK1wnL1wnK3kpO2NkPW5ldyBEYXRlKCk7aWYoY2Q+c3ByJiZjZDxmbCl7ej16KzF9ZWxzZXt6PXp9O3V0Yz1jZC5nZXRUaW1lKCkrKGNkLmdldFRpbWV6b25lT2Zmc2V0KCkqNjAwMDApO3R6PW5ldyBEYXRlKHV0YyArICgzNjAwMDAwKnopKTt0aGlzeT10ei5nZXRGdWxsWWVhcigpO3ZhciBkYXlzPVtcJ1N1bmRheVwnLFwnTW9uZGF5XCcsXCdUdWVzZGF5XCcsXCdXZWRuZXNkYXlcJyxcJ1RodXJzZGF5XCcsXCdGcmlkYXlcJyxcJ1NhdHVyZGF5XCddO2lmKHRoaXN5IT15KXtyZXR1cm5cJ0RhdGEgTm90IEF2YWlsYWJsZVwnfWVsc2V7O3RoaXNoPXR6LmdldEhvdXJzKCk7dGhpc21pbj10ei5nZXRNaW51dGVzKCk7dGhpc2Q9dHouZ2V0RGF5KCk7dmFyIGRvdz1kYXlzW3RoaXNkXTt2YXIgYXA9XCdBTVwnO3ZhciBkdD1cJ1dlZWtkYXlcJzt2YXIgbWludD1cJzAwXCc7aWYodGhpc21pbj4zMCl7bWludD1cJzMwXCd9aWYodGhpc2g+PTEyKXthcD1cJ1BNXCc7dGhpc2g9dGhpc2gtMTJ9O2lmICh0aGlzaD09MCl7dGhpc2g9MTJ9O2lmKHRoaXNkPT02fHx0aGlzZD09MCl7ZHQ9XCdXZWVrZW5kXCd9O3ZhciB0aW1lc3RyaW5nPXRoaXNoK1wnOlwnK21pbnQrYXA7dmFyIGRheXN0cmluZz1kb3c7dmFyIGVuZHN0cmluZz1kdDtpZih0PT1cJ2hcJyl7cmV0dXJuIHRpbWVzdHJpbmd9aWYodD09XCdkXCcpe3JldHVybiBkYXlzdHJpbmd9O2lmKHQ9PVwnd1wnKXtyZXR1cm4gZW5kc3RyaW5nfX19OycpLCBzLnNldHVwTGlua1RyYWNrID0gbmV3IEZ1bmN0aW9uKCd2bCcsICdjJywgJ2UnLCAndmFyIHM9dGhpczt2YXIgY3Y9cy5jX3IoYyk7aWYodmwpe3ZhciB2bGE9dmwuc3BsaXQoXCcsXCcpO31pZihjdiE9XCdcJyl7dmFyIGN2YT1zLnNwbGl0KGN2LFwnXl5cJyk7aWYoY3ZhWzFdIT1cJ1wnKXtmb3IoeCBpbiB2bGEpe3NbdmxhW3hdXT1jdmFbeF07aWYoZSl7cy5ldmVudHM9cy5hcGwocy5ldmVudHMsZSxcJyxcJywyKTt9fX19cy5jX3coYyxcJ1wnLDApO2lmKHR5cGVvZiBzLmxpbmtPYmplY3QhPVwndW5kZWZpbmVkXCcmJnMuaGJ4X2x0IT1cJ21hbnVhbFwnKXtzLmx0YT1bXTtpZih0eXBlb2Ygcy5saW5rT2JqZWN0IT1udWxsKXtzbG89cy5saW5rT2JqZWN0O2lmKHMubGlua09iamVjdCE9MCl7aWYocy5saW5rT2JqZWN0LmdldEF0dHJpYnV0ZShcJ25hbWVcJykhPW51bGwpe3ZhciBiPXMubGlua09iamVjdC5nZXRBdHRyaWJ1dGUoXCduYW1lXCcpO2lmKGIuaW5kZXhPZihcJyZscG9zPVwnKT4tMSl7cy5sdGFbM109Yi5tYXRjaChcJyZscG9zPShbXiZdKilcJylbMV07fWlmKGIuaW5kZXhPZihcJyZsaWQ9XCcpPi0xKXtzLmx0YVsxXT1iLm1hdGNoKFwnJmxpZD0oW14mXSopXCcpWzFdO319fWlmKHR5cGVvZiBzLmx0YVsxXT09XCd1bmRlZmluZWRcJyl7aWYocy5saW5rTmFtZSE9MCl7cy5sdGFbMV09cy5saW5rTmFtZTt9ZWxzZSBpZihzLmxpbmtPYmplY3QhPTApe2lmKHMubGlua09iamVjdC5pbm5lckhUTUwuaW5kZXhPZihcJzxpbWdcJyk+LTEpe3MubHRhWzFdPXMubGlua09iamVjdC5pbm5lckhUTUwubWF0Y2goXCdzcmM9IihbXiJdKilcJylbMV07fWVsc2V7cy5sdGFbMV09cy5saW5rT2JqZWN0LmlubmVySFRNTDt9fWVsc2UgaWYocy5saW5rVVJMKXtzLmx0YVsxXT1zLmxpbmtVUkw7fWVsc2V7cy5sdGFbMV09bnVsbDt9fWlmKHMubHRhWzFdIT1udWxsKXtpZih0eXBlb2Ygcy5wYWdlTmFtZSE9XCd1bmRlZmluZWRcJylzLmx0YVswXT1zLnBhZ2VOYW1lO3MubHRhWzJdPXMucGFnZU5hbWUrXCcgfCBcJytzLmx0YVsxXTt9fWlmKHMubGlua1R5cGUhPTApe2Zvcih2YXIgeD0wO3g8dmxhLmxlbmd0aDt4Kyspe3NbdmxhW3hdXT1zLmNsZWFuU3RyKHMubHRhW3hdKTtpZihlKXtzLmV2ZW50cz1zLmFwbChzLmV2ZW50cyxlLFwnLFwnLDIpO3MubGlua1RyYWNrVmFycz1zLmFwbChzLmxpbmtUcmFja1ZhcnMsXCdldmVudHNcJyxcJyxcJywyKTt9fXMubGlua1RyYWNrVmFycz1zLmFwbChzLmxpbmtUcmFja1ZhcnMsdmwsXCcsXCcsMik7fWVsc2V7aWYocy5sdGFbMV0pe3ZhciB0Y3Y9XCdcJztmb3IodmFyIHg9MDt4PHMubHRhLmxlbmd0aDt4Kyspe3Rjdis9cy5jbGVhblN0cihzLmx0YVt4XSkrXCdeXlwnO31zLmNfdyhjLHRjdik7fX1zLmx0YT1udWxsO30nKSwgcy5jbGVhblN0ciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gKGUgPSBlLnJlcGxhY2UoLzxcLz9bXj5dKyg+fCQpL2csICcnKSkucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKICAgICAgICAgICAgfSwgcy5zcGxpdCA9IG5ldyBGdW5jdGlvbignbCcsICdkJywgJ3ZhciBpLHg9MCxhPW5ldyBBcnJheTt3aGlsZShsKXtpPWwuaW5kZXhPZihkKTtpPWk+LTE/aTpsLmxlbmd0aDthW3grK109bC5zdWJzdHJpbmcoMCxpKTtsPWwuc3Vic3RyaW5nKGkrZC5sZW5ndGgpO31yZXR1cm4gYScpLCBzLmFwbCA9IG5ldyBGdW5jdGlvbignTCcsICd2JywgJ2QnLCAndScsICd2YXIgcz10aGlzLG09MDtpZighTClMPVwnXCc7aWYodSl7dmFyIGksbixhPXMuc3BsaXQoTCxkKTtmb3IoaT0wO2k8YS5sZW5ndGg7aSsrKXtuPWFbaV07bT1tfHwodT09MT8obj09dik6KG4udG9Mb3dlckNhc2UoKT09di50b0xvd2VyQ2FzZSgpKSk7fX1pZighbSlMPUw/TCtkK3Y6djtyZXR1cm4gTCcpLCBzLnJmbCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpLCByKSB7CiAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIXQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgdmFyIGEgPSBbXSwgcyA9ICcnOwogICAgICAgICAgICAgICAgaSA9IGkgfHwgbiwgciA9ICEhciwgbiA9IChlID0gZS5zcGxpdChuIHx8ICcsJykpLmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgbjsgbysrKQogICAgICAgICAgICAgICAgICAgIC0xIDwgZVtvXS5pbmRleE9mKCc6JykgJiYgKChzID0gZVtvXS5zcGxpdCgnOicpKVsxXSA9IHNbMF0gKyAnOicgKyBzWzFdLCBlW29dID0gc1swXSksIC0xIDwgZVtvXS5pbmRleE9mKCc9JykgJiYgKChzID0gZVtvXS5zcGxpdCgnPScpKVsxXSA9IHNbMF0gKyAnPScgKyBzWzFdLCBlW29dID0gc1swXSksIGVbb10gIT09IHQgJiYgcyA/IGEucHVzaChzWzFdKSA6IGVbb10gIT09IHQgPyBhLnB1c2goZVtvXSkgOiBlW29dID09PSB0ICYmIHIgJiYgKHMgPyBhLnB1c2goc1sxXSkgOiBhLnB1c2goZVtvXSksIHIgPSAhMSksIHMgPSAnJzsKICAgICAgICAgICAgICAgIHJldHVybiBhLmpvaW4oaSk7CiAgICAgICAgICAgIH0sIHMuZ2V0QW5kUGVyc2lzdFZhbHVlID0gbmV3IEZ1bmN0aW9uKCd2JywgJ2MnLCAnZScsICd2YXIgcz10aGlzLGE9bmV3IERhdGU7ZT1lP2U6MDthLnNldFRpbWUoYS5nZXRUaW1lKCkrZSo4NjQwMDAwMCk7aWYodilzLmNfdyhjLHYsZT9hOjApO3JldHVybiBzLmNfcihjKTsnKSwgcy5qb2luID0gbmV3IEZ1bmN0aW9uKCd2JywgJ3AnLCAndmFyIHMgPSB0aGlzO3ZhciBmLGIsZCx3O2lmKHApe2Y9cC5mcm9udD9wLmZyb250OlwnXCc7Yj1wLmJhY2s/cC5iYWNrOlwnXCc7ZD1wLmRlbGltP3AuZGVsaW06XCdcJzt3PXAud3JhcD9wLndyYXA6XCdcJzt9dmFyIHN0cj1cJ1wnO2Zvcih2YXIgeD0wO3g8di5sZW5ndGg7eCsrKXtpZih0eXBlb2Yodlt4XSk9PVwnb2JqZWN0XCcgKXN0cis9cy5qb2luKCB2W3hdLHApO2Vsc2Ugc3RyKz13K3ZbeF0rdztpZih4PHYubGVuZ3RoLTEpc3RyKz1kO31yZXR1cm4gZitzdHIrYjsnKSwgcy5zb2NpYWxQbGF0Zm9ybXMgPSBuZXcgRnVuY3Rpb24oJ2EnLCAndmFyIHM9dGhpcyxnLEssRCxFLEYsaTtnPXMucmVmZXJyZXI/cy5yZWZlcnJlcjpkb2N1bWVudC5yZWZlcnJlcjtnPWcudG9Mb3dlckNhc2UoKTtLPXMuc3BsaXQocy5zb2NQbGF0TGlzdCxcJ3xcJyk7Zm9yKGk9MDtpPEsubGVuZ3RoO2krKyl7RD1zLnNwbGl0KEtbaV0sXCc+XCcpO2lmKGcuaW5kZXhPZihEWzBdKSE9LTEpe3MuY29udGV4dERhdGFbXCdhLnNvY2lhbGNvbnRlbnRwcm92aWRlclwnXT1EWzFdO319JyksIHMuc29jUGxhdExpc3QgPSAnZmFjZWJvb2suY29tPkZhY2Vib29rfHR3aXR0ZXIuY29tPlR3aXR0ZXJ8dC5jby8+VHdpdHRlcnx5b3V0dWJlLmNvbT5Zb3V0dWJlfGNsaXBtYXJrcy5jb20+Q2xpcG1hcmtzfGRhaWx5bW90aW9uLmNvbT5EYWlseW1vdGlvbnxkZWxpY2lvdXMuY29tPkRlbGljaW91c3xkaWdnLmNvbT5EaWdnfGRpaWdvLmNvbT5EaWlnb3xmbGlja3IuY29tPkZsaWNrcnxmbGl4c3Rlci5jb20+RmxpeHN0ZXJ8Zm90b2xvZy5jb20+Rm90b2xvZ3xmcmllbmRmZWVkLmNvbT5GcmllbmRGZWVkfGdvb2dsZS5jb20vYnV6ej5Hb29nbGUgQnV6enxidXp6Lmdvb2dsZWFwaXMuY29tPkdvb2dsZSBCdXp6fHBsdXMuZ29vZ2xlLmNvbT5Hb29nbGUrfGh1bHUuY29tPkh1bHV8aWRlbnRpLmNhPmlkZW50aS5jYXxpbGlrZS5jb20+aUxpa2V8aW50ZW5zZWRlYmF0ZS5jb20+SW50ZW5zZURlYmF0ZXxteXNwYWNlLmNvbT5NeVNwYWNlfG5ld3NnYXRvci5jb20+TmV3c2dhdG9yfHBob3RvYnVja2V0LmNvbT5QaG90b2J1Y2tldHxwbHVyay5jb20+UGx1cmt8c2xpZGVzaGFyZS5uZXQ+U2xpZGVTaGFyZXxzbXVnbXVnLmNvbT5TbXVnTXVnfHN0dW1ibGV1cG9uLmNvbT5TdHVtYmxlVXBvbnx0dW1ibHIuY29tPlR1bWJscnx2aW1lby5jb20+VmltZW98d29yZHByZXNzLmNvbT5Xb3JkUHJlc3N8eGFuZ2EuY29tPlhhbmdhfG1ldGFjYWZlLmNvbT5NZXRhY2FmZXxwaW50ZXJlc3QuY29tPlBpbnRlcmVzdCcsIHMuc29jaWFsQXV0aG9ycyA9IG5ldyBGdW5jdGlvbignJywgJ3ZhciBzPXRoaXMsZztnPXMucmVmZXJyZXI/cy5yZWZlcnJlcjpkb2N1bWVudC5yZWZlcnJlcjtpZihnLmluZGV4T2YoXCdodHRwOi8vdC5jby9cJyk9PT0wfHxnLmluZGV4T2YoXCdodHRwczovL3QuY28vXCcpPT09MHx8Zy5pbmRleE9mKFwncGludGVyZXN0LmNvbS9waW5cJykhPT0tMXx8Zy5pbmRleE9mKFwndHVtYmxyLmNvbVwnKSE9PS0xfHxnLmluZGV4T2YoXCd5b3V0dWJlLmNvbVwnKSE9PS0xKXtzLkludGVncmF0ZS5hZGQoXCdTb2NpYWxBdXRob3JcJyk7cy5JbnRlZ3JhdGUuU29jaWFsQXV0aG9yLmdldChcJ2h0dHA6Ly9zYS1zZXJ2aWNlcy5zb2NpYWwub21uaXR1cmUuY29tL2F1dGhvci9uYW1lP3Zhcj1bVkFSXSZjYWxsYmFjaz1zLnNvY2lhbEF1dGhvclNlYXJjaCZycz1cJytlbmNvZGVVUklDb21wb25lbnQocy5hY2NvdW50KStcJyZxPVwnK2VuY29kZVVSSUNvbXBvbmVudChnKSk7cy5JbnRlZ3JhdGUuU29jaWFsQXV0aG9yLmRlbGF5KCk7cy5JbnRlZ3JhdGUuU29jaWFsQXV0aG9yLnNldFZhcnM9ZnVuY3Rpb24ocyxwKXtzLmNvbnRleHREYXRhW1wnYS5zb2NpYWxhdXRob3JcJ109cy51c2VyO319JyksIHMuc29jaWFsQXV0aG9yU2VhcmNoID0gbmV3IEZ1bmN0aW9uKCdvYmonLCAndmFyIHM9dGhpcztpZih0eXBlb2Ygb2JqPT09XCd1bmRlZmluZWRcJ3x8dHlwZW9mIG9iai5hdXRob3I9PT1cJ3VuZGVmaW5lZFwnKXtzLnVzZXI9XCdOb3QgRm91bmRcJzt9ZWxzZXtzLnVzZXI9b2JqLmF1dGhvcjt9cy5JbnRlZ3JhdGUuU29jaWFsQXV0aG9yLnJlYWR5KCk7JyksIHMuX19jY3VjciB8fCAocy5jX3JyID0gcy5jX3IsIHMuX19jY3VjciA9ICEwLCBzLmNfcnNwZXJzID0gdCwgcy5jX3IgPSBlKSwgcy5fX2NjdWN3IHx8IChzLmNfd3IgPSBzLmNfdywgcy5fX2NjdWN3ID0gITAsIHMuY193ID0gbiksIHMucF9mbyA9IG5ldyBGdW5jdGlvbignbicsICd2YXIgcz10aGlzO2lmKCFzLl9fZm8pe3MuX19mbz1uZXcgT2JqZWN0O31pZighcy5fX2ZvW25dKXtzLl9fZm9bbl09bmV3IE9iamVjdDtyZXR1cm4gMTt9ZWxzZSB7cmV0dXJuIDA7fScpLCBzLnJlcGwgPSBuZXcgRnVuY3Rpb24oJ3gnLCAnbycsICduJywgJ3ZhciBpPXguaW5kZXhPZihvKSxsPW4ubGVuZ3RoO3doaWxlKHgmJmk+PTApe3g9eC5zdWJzdHJpbmcoMCxpKStuK3guc3Vic3RyaW5nKGkrby5sZW5ndGgpO2k9eC5pbmRleE9mKG8saStsKX1yZXR1cm4geCcpLCBzLmNsaWNrUGFzdCA9IG5ldyBGdW5jdGlvbignc2NwJywgJ2N0X2V2JywgJ2NwX2V2JywgJ2NwYycsICd2YXIgcz10aGlzLHNjcCxjdF9ldixjcF9ldixjcGMsZXYsdGN0O2lmKHMucF9mbyhjdF9ldik9PTEpe2lmKCFjcGMpe2NwYz1cJ3NfY3BjXCc7fWV2PXMuZXZlbnRzP3MuZXZlbnRzK1wnLFwnOlwnXCc7aWYoc2NwKXtzLmV2ZW50cz1lditjdF9ldjtzLmNfdyhjcGMsMSwwKTt9ZWxzZXtpZihzLmNfcihjcGMpPj0xKXtzLmV2ZW50cz1lditjcF9ldjtzLmNfdyhjcGMsMCwwKTt9fX0nKSwgcy5tYW5hZ2VRdWVyeVBhcmFtID0gbmV3IEZ1bmN0aW9uKCdwJywgJ3cnLCAnZScsICd1JywgJ3ZhciBzPXRoaXMseCx5LGkscXMscXAscXYsZixiO3U9dT91OihzLnBhZ2VVUkw/cy5wYWdlVVJMOlwnXCcrd2luZG93LmxvY2F0aW9uKTt4PXUuaW5kZXhPZihcJz9cJyk7cXM9eD4tMT91LnN1YnN0cmluZyh4LHUubGVuZ3RoKTpcJ1wnO3U9eD4tMT91LnN1YnN0cmluZygwLHgpOnU7eD1xcy5pbmRleE9mKFwnP1wnK3ArXCc9XCcpO2lmKHg+LTEpe3k9cXMuaW5kZXhPZihcJyZcJyk7Zj1cJ1wnO2lmKHk+LTEpe3FwPXFzLnN1YnN0cmluZyh4KzEseSk7Yj1xcy5zdWJzdHJpbmcoeSsxLHFzLmxlbmd0aCk7fWVsc2V7cXA9cXMuc3Vic3RyaW5nKDEscXMubGVuZ3RoKTtiPVwnXCc7fX1lbHNle3g9cXMuaW5kZXhPZihcJyZcJytwK1wnPVwnKTtpZih4Pi0xKXtmPXFzLnN1YnN0cmluZygxLHgpO2I9cXMuc3Vic3RyaW5nKHgrMSxxcy5sZW5ndGgpO3k9Yi5pbmRleE9mKFwnJlwnKTtpZih5Pi0xKXtxcD1iLnN1YnN0cmluZygwLHkpO2I9Yi5zdWJzdHJpbmcoeSxiLmxlbmd0aCk7fWVsc2V7cXA9YjtiPVwnXCc7fX19aWYoZSYmcXApe3k9cXAuaW5kZXhPZihcJz1cJyk7cXY9eT4tMT9xcC5zdWJzdHJpbmcoeSsxLHFwLmxlbmd0aCk6XCdcJzt2YXIgZXVpPTA7d2hpbGUocXYuaW5kZXhPZihcJyUyNVwnKT4tMSl7cXY9dW5lc2NhcGUocXYpO2V1aSsrO2lmKGV1aT09MTApYnJlYWs7fXF2PXMucmVwbGFjZShxdixcJytcJyxcJyBcJyk7cXY9ZXNjYXBlKHF2KTtxdj1zLnJlcGxhY2UocXYsXCclMjVcJyxcJyVcJyk7cXY9cy5yZXBsYWNlKHF2LFwnJTdDXCcsXCd8XCcpO3F2PXMucmVwbGFjZShxdixcJyU3Y1wnLFwnfFwnKTtxcD1xcC5zdWJzdHJpbmcoMCx5KzEpK3F2O31pZih3JiZxcCl7aWYoZilxcz1cJz9cJytxcCtcJyZcJytmK2I7ZWxzZSBpZihiKXFzPVwnP1wnK3FwK1wnJlwnK2I7ZWxzZSBxcz1cJz9cJytxcH1lbHNlIGlmKGYpcXM9XCc/XCcrZitcJyZcJytxcCtiO2Vsc2UgaWYoYilxcz1cJz9cJytxcCtcJyZcJytiO2Vsc2UgaWYocXApcXM9XCc/XCcrcXA7cmV0dXJuIHUrcXM7JyksIHMuaGFuZGxlUFBWZXZlbnRzID0gbmV3IEZ1bmN0aW9uKCcnLCAndmFyIFc9d2luZG93LHM9Vy5zX25hbWUmJnR5cGVvZiBXW3NfbmFtZV09PVwnb2JqZWN0XCc/V1tzX25hbWVdOjA7aWYoIXN8fCFzLmdldFBQVmlkKXJldHVybjt2YXIgQj1kb2N1bWVudC5ib2R5LEU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LEQ9d2luZG93LmRvY3VtZW50O2Q9TWF0aC5tYXgoQi5zY3JvbGxIZWlnaHQsRS5zY3JvbGxIZWlnaHQsQi5vZmZzZXRIZWlnaHQsRS5vZmZzZXRIZWlnaHQsQi5jbGllbnRIZWlnaHQsRS5jbGllbnRIZWlnaHQpLHY9d2luZG93LmlubmVySGVpZ2h0fHxFLmNsaWVudEhlaWdodHx8Qi5jbGllbnRIZWlnaHQsdD13aW5kb3cucGFnZVlPZmZzZXR8fEQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8RC5ib2R5LnNjcm9sbFRvcCxoPXQrdixwPU1hdGgubWluKE1hdGgucm91bmQoaC9kKjEwMCksMTAwKSxjPXMuY19yKFwnc19wcHZcJyksYT1jLmluZGV4T2YoXCcsXCcpPi0xP2Muc3BsaXQoXCcsXCcsNCk6W10sbD1hLmxlbmd0aCxuPWw+MD9hWzBdOmVzY2FwZShzLmdldFBQVmlkKSxQPWw+MT9wYXJzZUludChhWzFdKTowLGY9bD4yP3BhcnNlSW50KGFbMl0pOnAsSD1sPjM/cGFyc2VJbnQoYVszXSk6MCxjbj1wPjA/bitcJyxcJysocD5QP3A6UCkrXCcsXCcrZitcJyxcJysoaD5IP2g6SCk6XCdcJztzLmNfdyhcJ3NfcHB2XCcsY24pJyksIHMuZ2V0UGVyY2VudFBhZ2VWaWV3ZWQgPSBuZXcgRnVuY3Rpb24oJ24nLCAnaWYodHlwZW9mIHRoaXMubGlua1R5cGUhPVwndW5kZWZpbmVkXCcpcmV0dXJuXCdcJzt2YXIgcz10aGlzLHc9d2luZG93LEY9ZmFsc2UsZT13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcnx8d2luZG93LmF0dGFjaEV2ZW50fHxcJ1wnO2k9Myx2PXMuY19yKFwnc19wcHZcJyksYT12LmluZGV4T2YoXCcsXCcpPi0xP3Yuc3BsaXQoXCcsXCcsNCk6W107aWYoYS5sZW5ndGg8NCl7d2hpbGUoaT4wKWFbaS0tXT1pPGEubGVuZ3RoP2FbaS0xXTpcJ1wnO2FbMF09XCdcJ31hWzBdPXVuZXNjYXBlKGFbMF0pO3MuZ2V0UFBWaWQ9bj1ufHxzLnBhZ2VOYW1lfHxkb2N1bWVudC5sb2NhdGlvbi5ocmVmO3MuY193KFwnc19wcHZcJyxlc2NhcGUobikpO2lmKCFzLmdldFBQVmV2ZW50cyl7cy5nZXRQUFZldmVudHM9MTtpZighdy5zX25hbWUpe2ZvcihpIGluIHcpaWYod1tpXT09PXMpe3NfbmFtZT1pO2JyZWFrfX1mb3IoaSBpbntcJ2xvYWRcJzpcJ1wnLFwnc2Nyb2xsXCc6XCdcJyxcJ3Jlc2l6ZVwnOlwnXCd9KWUoKHdpbmRvdy5hdHRhY2hFdmVudD9cJ29uXCc6XCdcJykraSxzLmhhbmRsZVBQVmV2ZW50cyxGKX1yZXR1cm4gYScpLCBzLnRyYWNrVE5UID0gbmV3IEZ1bmN0aW9uKCd2JywgJ3AnLCAnYicsICd2YXIgcz10aGlzLG49XCdzX3RudFwnLHE9XCdzX3RudHJlZlwnLHA9KHApP3A6bix2PSh2KT92Om4scj1cJ1wnLHBtPWZhbHNlLGI9KGIpP2I6dHJ1ZTtpZihzLlV0aWwuZ2V0UXVlcnlQYXJhbShxKSE9XCdcJyl7cy5yZWZlcnJlcj1zLlV0aWwuZ2V0UXVlcnlQYXJhbShxKTt9ZWxzZSBpZihzLmNfcihxKSE9XCdcJyl7cy5yZWZlcnJlcj1zLmNfcihxKTtkb2N1bWVudC5jb29raWU9cStcJz07cGF0aD0vO2V4cGlyZXM9VGh1LCAwMS1KYW4tMTk3MCAwMDowMDowMSBHTVQ7XCc7fWVsc2UgaWYoKGRvY3VtZW50LmNvb2tpZS5pbmRleE9mKHEpIT0tMSYmcy5jX3IocSk9PVwnXCcpfHwobG9jYXRpb24uc2VhcmNoLmluZGV4T2YocStcJz1cJykhPS0xJiZzLlV0aWwuZ2V0UXVlcnlQYXJhbShxKT09XCdcJykpe3MucmVmZXJyZXI9XCdUeXBlZC9Cb29rbWFya2VkXCc7ZG9jdW1lbnQuY29va2llPXErXCc9O3BhdGg9LztleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UO1wnO31pZihzLlV0aWwuZ2V0UXVlcnlQYXJhbShwKSE9XCdcJyl7cG09cy5VdGlsLmdldFF1ZXJ5UGFyYW0ocCk7fWVsc2UgaWYocy5jX3IocCkpe3BtPXMuY19yKHApO2RvY3VtZW50LmNvb2tpZT1wK1wnPTtwYXRoPS87ZXhwaXJlcz1UaHUsIDAxLUphbi0xOTcwIDAwOjAwOjAxIEdNVDtcJzt9ZWxzZSBpZihzLmNfcihwKT09XCdcJyYmcy5VdGlsLmdldFF1ZXJ5UGFyYW0ocCk9PVwnXCcpe3BtPVwnXCc7fWlmKHBtKXIrPShwbStcJyxcJyk7aWYod2luZG93W3ZdIT11bmRlZmluZWQpcis9d2luZG93W3ZdO2lmKGIpd2luZG93W3ZdPVwnXCc7cmV0dXJuIHI7JyksIHMuZ2V0QWFtU2VnbWVudHMgPSBuZXcgRnVuY3Rpb24oJ2EnLCAnYicsICd2YXIgcz10aGlzO3ZhciBjPXMuY19yKGEpO2lmKGMpe2M9cy5yZXBsKGMsYitcJz1cJyxcJ1wnKTt9cmV0dXJuIGMnKSwgcy5hcGwgPSBuZXcgRnVuY3Rpb24oJ0wnLCAndicsICdkJywgJ3UnLCAndmFyIHM9dGhpcyxtPTA7aWYoIUwpTD1cJ1wnO2lmKHUpe3ZhciBpLG4sYT1zLnNwbGl0KEwsZCk7Zm9yKGk9MDtpPGEubGVuZ3RoO2krKyl7bj1hW2ldO209bXx8KHU9PTE/KG49PXYpOihuLnRvTG93ZXJDYXNlKCk9PXYudG9Mb3dlckNhc2UoKSkpO319aWYoIW0pTD1MP0wrZCt2OnY7cmV0dXJuIEwnKSwgd2luZG93LnMgJiYgJ29iamVjdCcgPT0gdHlwZW9mIHdpbmRvdy5zICYmIChzLlV0aWwsIDEpICYmICdvYmplY3QnID09IHR5cGVvZiBzLlV0aWwgJiYgKHdpbmRvdy5zLlV0aWwuZ2V0UXVlcnlQYXJhbSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgaSwgciA9IHdpbmRvdzsKICAgICAgICAgICAgICAgIHJldHVybiB0IHx8ICh0ID0gcy5wYWdlVVJMID8gcy5wYWdlVVJMIDogci5sb2NhdGlvbiksIG4gfHwgKG4gPSAnJicpLCBlICYmIHQgJiYgKDAgPD0gKGkgPSAodCA9ICcnICsgdCkuaW5kZXhPZignPycpKSAmJiAoMCA8PSAoaSA9ICh0ID0gbiArIHQuc3Vic3RyaW5nKGkgKyAxKSArIG4pLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKG4gKyBlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSArICc9JykpICYmICgwIDw9IChpID0gKHQgPSB0LnN1YnN0cmluZyhpICsgbi5sZW5ndGggKyBlLmxlbmd0aCArIDEpKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpICYmICh0ID0gdC5zdWJzdHJpbmcoMCwgaSkpLCAwIDwgdC5sZW5ndGgpKSkgPyBzLnVuZXNjYXBlKHQpIDogJyc7CiAgICAgICAgICAgIH0pLCBzLm9uY2VQZXJQYWdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHMub3BwLnNwbGl0KCcsJyksIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgcy5ldmVudHMgJiYgKHYgPSBuZXcgUmVnRXhwKCcsKj8nICsgdFtuXSArICdcXGInKSwgbnVsbCAhPSBzLmV2ZW50cy5tYXRjaCh2KSAmJiAocy5ldmVudHMgPSBzLmV2ZW50cy5yZXBsYWNlKHYsICcnKSwgJywnID09IHMuZXZlbnRzLnN1YnN0cmluZygwLCAxKSAmJiAocy5ldmVudHMgPSBzLmV2ZW50cy5zdWJzdHJpbmcoMSwgcy5ldmVudHMubGVuZ3RoKSkpKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gZS5zcGxpdCgnLCcpLCByID0gMDsgciA8IGkubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHMub3BwID0gcy5hcGwocy5vcHAsIGlbcl0sICcsJywgMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHMubG9hZE1vZHVsZSgnTWVkaWEnKSwgcy5NZWRpYS5hdXRvVHJhY2sgPSAhMCwgcy5NZWRpYS50cmFja1doaWxlUGxheWluZyA9ICEwLCBzLk1lZGlhLnRyYWNrVmFycyA9ICdOb25lJywgcy5NZWRpYS50cmFja0V2ZW50cyA9ICdOb25lJywgJ3VzJyA9PSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpyZWdpb24nKS50b0xvd2VyQ2FzZSgpICYmIC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignL2ZlZGV4dHJhY2snKSAmJiAocy5jb250ZXh0RGF0YVsnY20uc3NmJ10gPSAxKTsKICAgICAgICAgICAgdmFyIHIgPSAnJyAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2FhbTpyZWdpb25GbGFnJykgJiYgMCAhPSBfc2F0ZWxsaXRlLmdldFZhcignYWFtOnJlZ2lvbkZsYWcnKSwgYSA9ICcnICE9PSBfc2F0ZWxsaXRlLmdldFZhcignYWFtOmNvdW50cnlGbGFnJykgJiYgMCAhPSBfc2F0ZWxsaXRlLmdldFZhcignYWFtOmNvdW50cnlGbGFnJyksIG8gPSAnZmFsc2UnICE9PSBfc2F0ZWxsaXRlLmdldFZhcignYWFtOklkU3luY0Rpc2FibGUnKSwgYyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdhYW06UmVnaW9uQ29udGFpbmVyTlNJRCcpOwogICAgICAgICAgICAociB8fCBhKSAmJiAocy5sb2FkTW9kdWxlKCdBdWRpZW5jZU1hbmFnZW1lbnQnKSwgcy5BdWRpZW5jZU1hbmFnZW1lbnQuc2V0dXAoewogICAgICAgICAgICAgICAgcGFydG5lcjogJ2ZlZGV4JywKICAgICAgICAgICAgICAgIGNvbnRhaW5lck5TSUQ6IGMsCiAgICAgICAgICAgICAgICB2aXNpdG9yU2VydmljZTogeyBuYW1lc3BhY2U6ICcxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcnIH0sCiAgICAgICAgICAgICAgICBkaXNhYmxlRGVmYXVsdFJlcXVlc3Q6ICEwLAogICAgICAgICAgICAgICAgZGlzYWJsZVNjcmlwdEF0dGFjaG1lbnQ6ICEwLAogICAgICAgICAgICAgICAgZGlzYWJsZURlc3RpbmF0aW9uUHVibGlzaGluZ0lmcmFtZTogbwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHZhciBsID0gewogICAgICAgICAgICAgICAgQ1NJRDogJycsCiAgICAgICAgICAgICAgICBTUE9USUQ6ICc0MTkxMjYzJywKICAgICAgICAgICAgICAgIHRFdmFyOiAnZVZhcjYyJywKICAgICAgICAgICAgICAgIGVycm9yRXZhcjogJ2VWYXI2MycsCiAgICAgICAgICAgICAgICB0aW1lb3V0RXZlbnQ6ICdldmVudDgxJywKICAgICAgICAgICAgICAgIHJlcXVlc3RVUkw6ICdodHRwOi8vZmxzLmRvdWJsZWNsaWNrLm5ldC9qc29uP3Nwb3Q9W1NQT1RJRF0mc3JjPVtDU0lEXSZ2YXI9W1ZBUl0maG9zdD1pbnRlZ3JhdGUuMTEyLjJvNy5uZXQlMkZkZmFfZWNobyUzRnZhciUzRFtWQVJdJTI2QVFFJTNEMSUyNkEyUyUzRDEmb3JkPVtSQU5EXScsCiAgICAgICAgICAgICAgICBtYXhEZWxheTogJzc1MCcsCiAgICAgICAgICAgICAgICB2aXNpdENvb2tpZTogJ3NfZGZhJywKICAgICAgICAgICAgICAgIGNsaWNrVGhyb3VnaFBhcmFtOiAnQ0lEJywKICAgICAgICAgICAgICAgIHNlYXJjaENlbnRlclBhcmFtOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBuZXdSc2lkc1Byb3A6IHVuZGVmaW5lZAogICAgICAgICAgICB9OwogICAgICAgICAgICBzLm1heERlbGF5ID0gbC5tYXhEZWxheSwgcy5sb2FkTW9kdWxlKCdJbnRlZ3JhdGUnKSwgcy5JbnRlZ3JhdGUub25Mb2FkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuc29jaWFsQXV0aG9ycygpLCBlLnBhcnRuZXJERkFDaGVjayhsKSAmJiAoZS5JbnRlZ3JhdGUuYWRkKCdERkEnKSwgZS5JbnRlZ3JhdGUuREZBLnRFdmFyID0gbC50RXZhciwgZS5JbnRlZ3JhdGUuREZBLmVycm9yRXZhciA9IGwuZXJyb3JFdmFyLCBlLkludGVncmF0ZS5ERkEudGltZW91dEV2ZW50ID0gbC50aW1lb3V0RXZlbnQsIGUuSW50ZWdyYXRlLkRGQS5DU0lEID0gbC5DU0lELCBlLkludGVncmF0ZS5ERkEuU1BPVElEID0gbC5TUE9USUQsIGUuSW50ZWdyYXRlLkRGQS5nZXQobC5yZXF1ZXN0VVJMKSwgZS5JbnRlZ3JhdGUuREZBLnNldFZhcnMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvd1t0LlZBUl0gPyB0LmVjID8gdC5lcnJvckV2YXIgJiYgKGVbdC5lcnJvckV2YXJdID0gdC5lYykgOiBlW3QudEV2YXJdID0gJ0RGQS0nICsgKHQubGlzID8gdC5saXMgOiAwKSArICctJyArICh0LmxpcCA/IHQubGlwIDogMCkgKyAnLScgKyAodC5sYXN0aW1wID8gdC5sYXN0aW1wIDogMCkgKyAnLScgKyAodC5sYXN0aW1wdGltZSA/IHQubGFzdGltcHRpbWUgOiAwKSArICctJyArICh0LmxjcyA/IHQubGNzIDogMCkgKyAnLScgKyAodC5sY3AgPyB0LmxjcCA6IDApICsgJy0nICsgKHQubGFzdGNsayA/IHQubGFzdGNsayA6IDApICsgJy0nICsgKHQubGFzdGNsa3RpbWUgPyB0Lmxhc3RjbGt0aW1lIDogMCkgOiB0LnRpbWVvdXRFdmVudCAmJiAoZS5ldmVudHMgPSAoZS5ldmVudHMgJiYgJycgIT0gZS5ldmVudHMgPyBlLmV2ZW50cyArICcsJyA6ICcnKSArIHQudGltZW91dEV2ZW50KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzg0NTk1NmE1OGYwNDgxZDgocykgewogICAgICAgICAgICB2YXIgbyA9IHRoaXM7CiAgICAgICAgICAgIG8ucyA9IHM7CiAgICAgICAgICAgIHZhciBjID0gd2luZG93OwogICAgICAgICAgICBjLnNfY19pbiB8fCAoYy5zX2NfaWwgPSBbXSwgYy5zX2NfaW4gPSAwKSwgby5faWwgPSBjLnNfY19pbCwgby5faW4gPSBjLnNfY19pbiwgby5faWxbby5faW5dID0gbywgYy5zX2NfaW4rKywgby5fYyA9ICdzX20nLCBvLmxpc3QgPSBbXSwgby5hZGQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICB0IHx8ICh0ID0gJ3NfSW50ZWdyYXRlXycgKyBlKSwgY1t0XSB8fCAoY1t0XSA9IHt9KSwgKGEgPSBvW2VdID0gY1t0XSkuYSA9IGUsIGEuZSA9IG8sIGEuX2MgPSAwLCBhLl9kID0gMCwgbnVsbCA9PSBhLmRpc2FibGUgJiYgKGEuZGlzYWJsZSA9IDApLCBhLmdldCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGkgPSBkb2N1bWVudCwgciA9IGkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0hFQUQnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWEuZGlzYWJsZSAmJiAodCB8fCAodiA9ICdzXycgKyBvLl9pbiArICdfSW50ZWdyYXRlXycgKyBhLmEgKyAnX2dldF8nICsgYS5fYyksIGEuX2MrKywgYS5WQVIgPSB2LCBhLkNBTExCQUNLID0gJ3NfY19pbFsnICsgby5faW4gKyAnXS4nICsgYS5hICsgJy5jYWxsYmFjaycsIGEuZGVsYXkoKSwgciA9IHIgJiYgMCA8IHIubGVuZ3RoID8gclswXSA6IGkuYm9keSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiA9IGkuY3JlYXRlRWxlbWVudCgnU0NSSVBUJykpLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0Jywgbi5zZXRBdHRyaWJ1dGUoJ2FzeW5jJywgJ2FzeW5jJyksIG4uc3JjID0gby5jKGEsIGUpLCBlLmluZGV4T2YoJ1tDQUxMQkFDS10nKSA8IDAgJiYgKG4ub25sb2FkID0gbi5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jYWxsYmFjayhjW3ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLmZpcnN0Q2hpbGQgPyByLmluc2VydEJlZm9yZShuLCByLmZpcnN0Q2hpbGQpIDogci5hcHBlbmRDaGlsZChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBhLmNhbGxiYWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlW3RdIHx8IChhW3RdID0gZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgYS5yZWFkeSgpOwogICAgICAgICAgICAgICAgfSwgYS5iZWFjb24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ3NfaV8nICsgby5faW4gKyAnX0ludGVncmF0ZV8nICsgYS5hICsgJ18nICsgYS5fYzsKICAgICAgICAgICAgICAgICAgICBhLmRpc2FibGUgfHwgKGEuX2MrKywgKHQgPSBjW3RdID0gbmV3IEltYWdlKCkpLnNyYyA9IG8uYyhhLCBlKSk7CiAgICAgICAgICAgICAgICB9LCBhLnNjcmlwdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgYS5nZXQoZSwgMSk7CiAgICAgICAgICAgICAgICB9LCBhLmRlbGF5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGEuX2QrKzsKICAgICAgICAgICAgICAgIH0sIGEucmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgYS5fZC0tLCBhLmRpc2FibGUgfHwgcy5kZWxheVJlYWR5KCk7CiAgICAgICAgICAgICAgICB9LCBvLmxpc3QucHVzaChlKTsKICAgICAgICAgICAgfSwgby5fZyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IChlID8gJ3VzZScgOiAnc2V0JykgKyAnVmFycyc7CiAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgby5saXN0Lmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgIGlmICgodCA9IG9bby5saXN0W2VdXSkgJiYgIXQuZGlzYWJsZSAmJiB0W25dKQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXShzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIG8uX3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBvLl9nKDEpOwogICAgICAgICAgICB9LCBvLl9kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGUsIHQ7CiAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgby5saXN0Lmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgIGlmICgodCA9IG9bby5saXN0W2VdXSkgJiYgIXQuZGlzYWJsZSAmJiAwIDwgdC5fZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfSwgby5jID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciBuLCBpLCByLCBhOwogICAgICAgICAgICAgICAgZm9yICgnaHR0cCcgIT0gdC50b0xvd2VyQ2FzZSgpLnN1YnN0cmluZygwLCA0KSAmJiAodCA9ICdodHRwOi8vJyArIHQpLCBzLnNzbCAmJiAodCA9IHMucmVwbGFjZSh0LCAnaHR0cDonLCAnaHR0cHM6JykpLCBlLlJBTkQgPSBNYXRoLmZsb29yKDEwMDAwMDAwMDAwMDAwICogTWF0aC5yYW5kb20oKSksIG4gPSAwOyAwIDw9IG47KQogICAgICAgICAgICAgICAgICAgIDAgPD0gKG4gPSB0LmluZGV4T2YoJ1snLCBuKSkgJiYgKG4gPCAoaSA9IHQuaW5kZXhPZignXScsIG4pKSAmJiAoMiA8IChyID0gdC5zdWJzdHJpbmcobiArIDEsIGkpKS5sZW5ndGggJiYgJ3MuJyA9PSByLnN1YnN0cmluZygwLCAyKSA/IChhID0gc1tyLnN1YnN0cmluZygyKV0pIHx8IChhID0gJycpIDogKGEgPSAnJyArIGVbcl0pICE9IGVbcl0gJiYgcGFyc2VGbG9hdChhKSAhPSBlW3JdICYmIChyID0gMCksIHIgJiYgKHQgPSB0LnN1YnN0cmluZygwLCBuKSArIGVuY29kZVVSSUNvbXBvbmVudChhKSArIHQuc3Vic3RyaW5nKGkgKyAxKSksIG4gPSBpKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl9mZGNiMmI1ZmY4OGNkZDk2KGUpIHsKICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICB0LnMgPSBlOwogICAgICAgICAgICB2YXIgbiA9IHdpbmRvdzsKICAgICAgICAgICAgbi5zX2NfaW4gfHwgKG4uc19jX2lsID0gW10sIG4uc19jX2luID0gMCksIHQuX2lsID0gbi5zX2NfaWwsIHQuX2luID0gbi5zX2NfaW4sIHQuX2lsW3QuX2luXSA9IHQsIG4uc19jX2luKyssIHQuX2MgPSAnc19tJywgdC5zZXR1cCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBuLkRJTCAmJiBlICYmIChlLmRpc2FibGVEZWZhdWx0UmVxdWVzdCA9ICEwLCBlLmRpc2FibGVDT1JTID0gITAsIGUuc2VjdXJlRGF0YUNvbGxlY3Rpb24gPSAhMSwgdC5pbnN0YW5jZSA9IG4uRElMLmNyZWF0ZShlKSwgdC50b29scyA9IG4uRElMLnRvb2xzKTsKICAgICAgICAgICAgfSwgdC5pc1JlYWR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICEhdC5pbnN0YW5jZTsKICAgICAgICAgICAgfSwgdC5nZXRFdmVudENhbGxDb25maWdQYXJhbXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdC5pbnN0YW5jZSAmJiB0Lmluc3RhbmNlLmFwaSAmJiB0Lmluc3RhbmNlLmFwaS5nZXRFdmVudENhbGxDb25maWdQYXJhbXMgPyB0Lmluc3RhbmNlLmFwaS5nZXRFdmVudENhbGxDb25maWdQYXJhbXMoKSA6IHt9OwogICAgICAgICAgICB9LCB0LnBhc3NEYXRhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHQuaW5zdGFuY2UgJiYgdC5pbnN0YW5jZS5hcGkgJiYgdC5pbnN0YW5jZS5hcGkucGFzc0RhdGEgJiYgdC5pbnN0YW5jZS5hcGkucGFzc0RhdGEoZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfMTM4MjJhNDNlZWRkYWZhYyhjKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IHQucGFnZVlPZmZzZXQgKyAodC5pbm5lckhlaWdodCB8fCAwKTsKICAgICAgICAgICAgICAgIGUgJiYgK3AgPCBlICYmIChwID0gZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgIGlmIChkLnNjcm9sbFJlYWNoU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGMuZC5xdWVyeVNlbGVjdG9yICYmIGMuZC5xdWVyeVNlbGVjdG9yKGQuc2Nyb2xsUmVhY2hTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgdCA/IChwID0gdC5zY3JvbGxUb3AgfHwgMCwgdC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAoZSA9IHQgJiYgdC5zY3JvbGxUb3AgKyB0LmNsaWVudEhlaWdodCB8fCAwKSA+IHAgJiYgKHAgPSBlKTsKICAgICAgICAgICAgICAgICAgICB9KSkgOiAwIDwgci0tICYmIHNldFRpbWVvdXQobiwgMTAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSwgcjsKICAgICAgICAgICAgICAgIGlmIChlICYmIHQgJiYgKG4gPSBkLmNbdF0gfHwgKGQuY1t0XSA9IHQuc3BsaXQoJywnKSkpKQogICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBuLmxlbmd0aCAmJiAoaSA9IG5bcisrXSk7KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPCBlLmluZGV4T2YoaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSwgdCwgbiwgaSwgcikgewogICAgICAgICAgICAgICAgdmFyIGEsIHM7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhc2V0ICYmIChzID0gZS5kYXRhc2V0W3RdKSA/IGEgPSBzIDogZS5nZXRBdHRyaWJ1dGUgJiYgKChzID0gZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtJyArIG4pKSA/IGEgPSBzIDogKHMgPSBlLmdldEF0dHJpYnV0ZShuKSkgJiYgKGEgPSBzKSksICFhICYmIGMudXNlRm9yY2VkTGlua1RyYWNraW5nICYmIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbzsKICAgICAgICAgICAgICAgICAgICBpZiAoZSA9IGUub25jbGljayA/ICcnICsgZS5vbmNsaWNrIDogJycsIHZhclZhbHVlID0gJycsIGkgJiYgZSAmJiAwIDw9ICh0ID0gZS5pbmRleE9mKGkpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgKz0gaS5sZW5ndGg7IHQgPCBlLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9IGUuY2hhckF0KHQrKyksIDAgPD0gJ1wnIicuaW5kZXhPZihuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAhMTsgdCA8IGUubGVuZ3RoICYmIG8gJiYgKG4gPSBlLmNoYXJBdCh0KSwgcyB8fCBuICE9PSBvKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXFwnID09PSBuID8gcyA9ICEwIDogKHZhclZhbHVlICs9IG4sIHMgPSAhMSksIHQrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKG8gPSB2YXJWYWx1ZSkgJiYgKGMud1tpXSA9IG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGEgfHwgciAmJiBjLndbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgIHJldHVybiAoaSA9IGRbdF0oZSwgbikpICYmIGEodShpKSwgZFt0ICsgJ0V4Y2x1c2lvbnMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgIGlmIChlICYmICEoMSA9PT0gKGkgPSBlLm5vZGVUeXBlKSAmJiAoaSA9IGUubm9kZU5hbWUpICYmIChpID0gaS50b1VwcGVyQ2FzZSgpKSAmJiBmW2ldKSAmJiAoMSA9PT0gZS5ub2RlVHlwZSAmJiAoaSA9IGUubm9kZVZhbHVlKSAmJiAodFt0Lmxlbmd0aF0gPSBpKSwgbi5hIHx8IG4udCB8fCBuLnMgfHwgIWUuZ2V0QXR0cmlidXRlIHx8ICgoaSA9IGUuZ2V0QXR0cmlidXRlKCdhbHQnKSkgPyBuLmEgPSBpIDogKGkgPSBlLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkgPyBuLnQgPSBpIDogJ0lNRycgPT0gKCcnICsgZS5ub2RlTmFtZSkudG9VcHBlckNhc2UoKSAmJiAoaSA9IGUuZ2V0QXR0cmlidXRlKCdzcmMnKSB8fCBlLnNyYykgJiYgKG4ucyA9IGkpKSwgKGkgPSBlLmNoaWxkTm9kZXMpICYmIGkubGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgaS5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgbChpW2VdLCB0LCBuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUgfHwgbnVsbCA9PSBlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKFJlZ0V4cCgnXltcXHNcXG5cXGZcXHJcXHRcdC1cciBceEEwXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAwQVx1MjAyOFx1MjAyOVx1MjA1Rlx1MzAwMFx1RkVGRl0rJywgJ21nJyksICcnKS5yZXBsYWNlKFJlZ0V4cCgnW1xcc1xcblxcZlxcclxcdFx0LVxyIFx4QTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDI4XHUyMDI5XHUyMDVGXHUzMDAwXHVGRUZGXSskJywgJ21nJyksICcnKS5yZXBsYWNlKFJlZ0V4cCgnW1xcc1xcblxcZlxcclxcdFx0LVxyIFx4QTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBBXHUyMDI4XHUyMDI5XHUyMDVGXHUzMDAwXHVGRUZGXXsxLH0nLCAnbWcnKSwgJyAnKS5zdWJzdHJpbmcoMCwgMjU0KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZCA9IHRoaXM7CiAgICAgICAgICAgIGQucyA9IGM7CiAgICAgICAgICAgIHZhciB0ID0gd2luZG93OwogICAgICAgICAgICB0LnNfY19pbiB8fCAodC5zX2NfaWwgPSBbXSwgdC5zX2NfaW4gPSAwKSwgZC5faWwgPSB0LnNfY19pbCwgZC5faW4gPSB0LnNfY19pbiwgZC5faWxbZC5faW5dID0gZCwgdC5zX2NfaW4rKywgZC5fYyA9ICdzX20nOwogICAgICAgICAgICB2YXIgaSwgcCA9IDAsIHIgPSA2MDsKICAgICAgICAgICAgZC5jID0ge307CiAgICAgICAgICAgIHZhciBmID0gewogICAgICAgICAgICAgICAgU0NSSVBUOiAxLAogICAgICAgICAgICAgICAgU1RZTEU6IDEsCiAgICAgICAgICAgICAgICBMSU5LOiAxLAogICAgICAgICAgICAgICAgQ0FOVkFTOiAxCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGQuX2cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSwgdCwgbiwgaSA9IGMuY29udGV4dERhdGEsIHIgPSBjLmxpbmtPYmplY3Q7CiAgICAgICAgICAgICAgICAoZSA9IGMucGFnZU5hbWUgfHwgYy5wYWdlVVJMKSAmJiAodCA9IG8ociwgJ2xpbmsnLCBjLmxpbmtOYW1lKSkgJiYgKG4gPSBvKHIsICdyZWdpb24nKSkgJiYgKGlbJ2EuYWN0aXZpdHltYXAucGFnZSddID0gZS5zdWJzdHJpbmcoMCwgMjU1KSwgaVsnYS5hY3Rpdml0eW1hcC5saW5rJ10gPSAxMjggPCB0Lmxlbmd0aCA/IHQuc3Vic3RyaW5nKDAsIDEyOCkgOiB0LCBpWydhLmFjdGl2aXR5bWFwLnJlZ2lvbiddID0gMTI3IDwgbi5sZW5ndGggPyBuLnN1YnN0cmluZygwLCAxMjcpIDogbiwgMCA8IHAgJiYgKGlbJ2EuYWN0aXZpdHltYXAueHknXSA9IDEwICogTWF0aC5mbG9vcihwIC8gMTApKSwgaVsnYS5hY3Rpdml0eW1hcC5wYWdlSURUeXBlJ10gPSBjLnBhZ2VOYW1lID8gMSA6IDApOwogICAgICAgICAgICB9LCBkLl9kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZC50cmFja1Njcm9sbFJlYWNoICYmICFpICYmIChkLnNjcm9sbFJlYWNoU2VsZWN0b3IgPyBuKCkgOiAoZSgpLCB0LmFkZEV2ZW50TGlzdGVuZXIgJiYgdC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBlLCAhMSkpLCBpID0gITApOwogICAgICAgICAgICB9LCBkLmxpbmsgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICBuID0gYSh1KHQpLCBkLmxpbmtFeGNsdXNpb25zKTsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKChuID0gZSkgJiYgIShuID0gcyhlLCAnc09iamVjdElkJywgJ3Mtb2JqZWN0LWlkJywgJ3Nfb2JqZWN0SUQnLCAxKSkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSwgcjsKICAgICAgICAgICAgICAgICAgICAociA9IGEodShlLmlubmVyVGV4dCB8fCBlLnRleHRDb250ZW50KSwgZC5saW5rRXhjbHVzaW9ucykpIHx8IChsKGUsIGkgPSBbXSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYTogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICB0OiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHM6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgIH0pLCAociA9IGEodShpLmpvaW4oJycpKSkpIHx8IChyID0gYSh1KG4uYSA/IG4uYSA6IG4udCA/IG4udCA6IG4ucyA/IG4ucyA6IHZvaWQgMCkpKSB8fCAhKGkgPSAoaSA9IGUudGFnTmFtZSkgJiYgaS50b1VwcGVyQ2FzZSA/IGkudG9VcHBlckNhc2UoKSA6ICcnKSB8fCAoJ0lOUFVUJyA9PSBpIHx8ICdTVUJNSVQnID09IGkgJiYgZS52YWx1ZSA/IHIgPSBhKHUoZS52YWx1ZSkpIDogJ0lNQUdFJyA9PSBpICYmIGUuc3JjICYmIChyID0gYSh1KGUuc3JjKSkpKSksIG4gPSByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0sIGQucmVnaW9uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIG4gPSBkLnJlZ2lvbklEQXR0cmlidXRlIHx8ICdpZCc7IGUgJiYgKGUgPSBlLnBhcmVudE5vZGUpOykgewogICAgICAgICAgICAgICAgICAgIGlmICh0ID0gcyhlLCBuLCBuLCBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdCT0RZJyA9PSBlLm5vZGVOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0JPRFknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzJkZjgwMDUzODQzOWI4MTEoZCkgewogICAgICAgICAgICB2YXIgZiA9IHRoaXM7CiAgICAgICAgICAgIGYudmVyc2lvbiA9ICcyLjIyLjAnOwogICAgICAgICAgICB2YXIgcCA9IHdpbmRvdzsKICAgICAgICAgICAgcC5zX2NfaW4gfHwgKHAuc19jX2lsID0gW10sIHAuc19jX2luID0gMCksIGYuX2lsID0gcC5zX2NfaWwsIGYuX2luID0gcC5zX2NfaW4sIGYuX2lsW2YuX2luXSA9IGYsIHAuc19jX2luKyssIGYuX2MgPSAnc19jJzsKICAgICAgICAgICAgdmFyIGcgPSBwLkFwcE1lYXN1cmVtZW50LmljOwogICAgICAgICAgICBnIHx8IChnID0gbnVsbCk7CiAgICAgICAgICAgIHZhciBsLCBoLCBtLCBiID0gcDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZvciAobCA9IGIucGFyZW50LCBoID0gYi5sb2NhdGlvbjsgbCAmJiBsLmxvY2F0aW9uICYmIGggJiYgJycgKyBsLmxvY2F0aW9uICE9ICcnICsgaCAmJiBiLmxvY2F0aW9uICYmICcnICsgbC5sb2NhdGlvbiAhPSAnJyArIGIubG9jYXRpb24gJiYgbC5sb2NhdGlvbi5ob3N0ID09PSBoLmhvc3Q7KQogICAgICAgICAgICAgICAgICAgIGwgPSAoYiA9IGwpLnBhcmVudDsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGYuQyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBmLlJhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJyArIHBhcnNlSW50KGUpID09ICcnICsgZTsKICAgICAgICAgICAgfSwgZi5yZXBsYWNlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHJldHVybiAhZSB8fCBlLmluZGV4T2YodCkgPCAwID8gZSA6IGUuc3BsaXQodCkuam9pbihuKTsKICAgICAgICAgICAgfSwgZi5lc2NhcGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHQsIG47CiAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICBmb3IgKGUgPSBlbmNvZGVVUklDb21wb25lbnQoZSksIHQgPSAwOyB0IDwgNzsgdCsrKQogICAgICAgICAgICAgICAgICAgIG4gPSAnK34hKigpXCcnLnN1YnN0cmluZyh0LCB0ICsgMSksIDAgPD0gZS5pbmRleE9mKG4pICYmIChlID0gZi5yZXBsYWNlKGUsIG4sICclJyArIG4uY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgIH0sIGYudW5lc2NhcGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgZSA9IDAgPD0gZS5pbmRleE9mKCcrJykgPyBmLnJlcGxhY2UoZSwgJysnLCAnICcpIDogZTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB1bmVzY2FwZShlKTsKICAgICAgICAgICAgfSwgZi5OYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlLCB0ID0gcC5sb2NhdGlvbi5ob3N0bmFtZSwgbiA9IGYuZnBDb29raWVEb21haW5QZXJpb2RzOwogICAgICAgICAgICAgICAgaWYgKG4gfHwgKG4gPSBmLmNvb2tpZURvbWFpblBlcmlvZHMpLCB0ICYmICFmLkthICYmICEvXlswLTkuXSskLy50ZXN0KHQpICYmIChuID0gMiA8IChuID0gbiA/IHBhcnNlSW50KG4pIDogMikgPyBuIDogMiwgMCA8PSAoZSA9IHQubGFzdEluZGV4T2YoJy4nKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IDAgPD0gZSAmJiAxIDwgbjspCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0Lmxhc3RJbmRleE9mKCcuJywgZSAtIDEpLCBuLS07CiAgICAgICAgICAgICAgICAgICAgZi5LYSA9IDAgPCBlID8gdC5zdWJzdHJpbmcoZSkgOiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGYuS2E7CiAgICAgICAgICAgIH0sIGYuY19yID0gZi5jb29raWVSZWFkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUgPSBmLmVzY2FwZShlKTsKICAgICAgICAgICAgICAgIHZhciB0ID0gJyAnICsgZi5kLmNvb2tpZSwgbiA9IHQuaW5kZXhPZignICcgKyBlICsgJz0nKSwgaSA9IG4gPCAwID8gbiA6IHQuaW5kZXhPZignOycsIG4pOwogICAgICAgICAgICAgICAgcmV0dXJuICdbW0JdXScgIT0gKGUgPSBuIDwgMCA/ICcnIDogZi51bmVzY2FwZSh0LnN1YnN0cmluZyhuICsgMiArIGUubGVuZ3RoLCBpIDwgMCA/IHQubGVuZ3RoIDogaSkpKSA/IGUgOiAnJzsKICAgICAgICAgICAgfSwgZi5jX3cgPSBmLmNvb2tpZVdyaXRlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciBpLCByID0gZi5OYigpLCBhID0gZi5jb29raWVMaWZldGltZTsKICAgICAgICAgICAgICAgIHJldHVybiB0ID0gJycgKyB0LCBhID0gYSA/ICgnJyArIGEpLnRvVXBwZXJDYXNlKCkgOiAnJywgbiAmJiAnU0VTU0lPTicgIT0gYSAmJiAnTk9ORScgIT0gYSAmJiAoKGkgPSAnJyAhPSB0ID8gcGFyc2VJbnQoYSB8fCAwKSA6IC02MCkgPyAobiA9IG5ldyBEYXRlKCkpLnNldFRpbWUobi5nZXRUaW1lKCkgKyAxMDAwICogaSkgOiAxID09PSBuICYmIChpID0gKG4gPSBuZXcgRGF0ZSgpKS5nZXRZZWFyKCksIG4uc2V0WWVhcihpICsgMiArIChpIDwgMTkwMCA/IDE5MDAgOiAwKSkpKSwgZSAmJiAnTk9ORScgIT0gYSA/IChmLmQuY29va2llID0gZi5lc2NhcGUoZSkgKyAnPScgKyBmLmVzY2FwZSgnJyAhPSB0ID8gdCA6ICdbW0JdXScpICsgJzsgcGF0aD0vOycgKyAobiAmJiAnU0VTU0lPTicgIT0gYSA/ICcgZXhwaXJlcz0nICsgbi50b1VUQ1N0cmluZygpICsgJzsnIDogJycpICsgKHIgPyAnIGRvbWFpbj0nICsgciArICc7JyA6ICcnKSArIChmLndyaXRlU2VjdXJlQ29va2llcyA/ICcgc2VjdXJlOycgOiAnJyksIGYuY29va2llUmVhZChlKSA9PSB0KSA6IDA7CiAgICAgICAgICAgIH0sIGYuS2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGYuVXRpbC5nZXRJZVZlcnNpb24oKTsKICAgICAgICAgICAgICAgICdudW1iZXInID09IHR5cGVvZiBlICYmIGUgPCAxMCAmJiAoZi51bnN1cHBvcnRlZEJyb3dzZXIgPSAhMCwgZi54YihmLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0sIGYueWEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gJ01pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlcicgPT09IG5hdmlnYXRvci5hcHBOYW1lIHx8IDAgPD0gZS5pbmRleE9mKCdNU0lFICcpIHx8IDAgPD0gZS5pbmRleE9mKCdUcmlkZW50LycpICYmIDAgPD0gZS5pbmRleE9mKCdXaW5kb3dzIE5UIDYnKTsKICAgICAgICAgICAgfSwgZi54YiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGVbbl0gJiYgKGVbbl0gPSB0KTsKICAgICAgICAgICAgfSwgZi5LID0gW10sIGYuZmEgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgaWYgKGYuTGEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICBmLm1heERlbGF5IHx8IChmLm1heERlbGF5ID0gMjUwKTsKICAgICAgICAgICAgICAgIHZhciBpID0gMCwgciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgZi5tYXhEZWxheSwgYSA9IGYuZC52aXNpYmlsaXR5U3RhdGUsIHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3Zpc2liaWxpdHljaGFuZ2UnCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGlmIChhIHx8IChhID0gZi5kLndlYmtpdFZpc2liaWxpdHlTdGF0ZSksIGEgJiYgJ3ByZXJlbmRlcicgPT0gYSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZi5nYSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmLmdhID0gMSwgbiA9IDA7IG4gPCBzLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5kLmFkZEV2ZW50TGlzdGVuZXIoc1tuXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZi5kLnZpc2liaWxpdHlTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIHx8IChlID0gZi5kLndlYmtpdFZpc2liaWxpdHlTdGF0ZSksICd2aXNpYmxlJyA9PSBlICYmIChmLmdhID0gMCwgZi5kZWxheVJlYWR5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaSA9IDEsIHIgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgbiB8fCBmLnUoJ19kJykgJiYgKGkgPSAxKTsKICAgICAgICAgICAgICAgIHJldHVybiBpICYmIChmLksucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgbTogZSwKICAgICAgICAgICAgICAgICAgICBhOiB0LAogICAgICAgICAgICAgICAgICAgIHQ6IHIKICAgICAgICAgICAgICAgIH0pLCBmLmdhIHx8IHNldFRpbWVvdXQoZi5kZWxheVJlYWR5LCBmLm1heERlbGF5KSksIGk7CiAgICAgICAgICAgIH0sIGYuZGVsYXlSZWFkeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlLCB0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIG4gPSAwOwogICAgICAgICAgICAgICAgZm9yIChmLnUoJ19kJykgPyBuID0gMSA6IGYuQWEoKTsgMCA8IGYuSy5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSBmLksuc2hpZnQoKSwgbiAmJiAhZS50ICYmIGUudCA+IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZi5LLnVuc2hpZnQoZSksIHNldFRpbWVvdXQoZi5kZWxheVJlYWR5LCBwYXJzZUludChmLm1heERlbGF5IC8gMikpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZi5MYSA9IDEsIGZbZS5tXS5hcHBseShmLCBlLmEpLCBmLkxhID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZi5zZXRBY2NvdW50ID0gZi5zYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbjsKICAgICAgICAgICAgICAgIGlmICghZi5mYSgnc2V0QWNjb3VudCcsIGFyZ3VtZW50cykpCiAgICAgICAgICAgICAgICAgICAgaWYgKGYuYWNjb3VudCA9IGUsIGYuYWxsQWNjb3VudHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCA9IGYuYWxsQWNjb3VudHMuY29uY2F0KGUuc3BsaXQoJywnKSksIGYuYWxsQWNjb3VudHMgPSBbXSwgdC5zb3J0KCksIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIT0gbiAmJiB0W24gLSAxXSA9PSB0W25dIHx8IGYuYWxsQWNjb3VudHMucHVzaCh0W25dKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGYuYWxsQWNjb3VudHMgPSBlLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0sIGYuZm9yZWFjaFZhciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSwgciwgYSwgcyA9ICcnOwogICAgICAgICAgICAgICAgZm9yIChyID0gaSA9ICcnLCBmLmxpZ2h0UHJvZmlsZUlEID8gKG4gPSBmLk8sIChzID0gZi5saWdodFRyYWNrVmFycykgJiYgKHMgPSAnLCcgKyBzICsgJywnICsgZi5sYS5qb2luKCcsJykgKyAnLCcpKSA6IChuID0gZi5nLCAoZi5wZSB8fCBmLmxpbmtUeXBlKSAmJiAocyA9IGYubGlua1RyYWNrVmFycywgaSA9IGYubGlua1RyYWNrRXZlbnRzLCBmLnBlICYmIChyID0gZi5wZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGYucGUuc3Vic3RyaW5nKDEpLCBmW3JdICYmIChzID0gZltyXS5lYywgaSA9IGZbcl0uY2MpKSksIHMgJiYgKHMgPSAnLCcgKyBzICsgJywnICsgZi5GLmpvaW4oJywnKSArICcsJyksIGkgJiYgcyAmJiAocyArPSAnLGV2ZW50cywnKSksIHQgJiYgKHQgPSAnLCcgKyB0ICsgJywnKSwgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgIHIgPSBuW2ldLCAoYSA9IGZbcl0pICYmICghcyB8fCAwIDw9IHMuaW5kZXhPZignLCcgKyByICsgJywnKSkgJiYgKCF0IHx8IDAgPD0gdC5pbmRleE9mKCcsJyArIHIgKyAnLCcpKSAmJiBlKHIsIGEpOwogICAgICAgICAgICB9LCBmLm8gPSBmdW5jdGlvbiAoZSwgdCwgbiwgaSwgcikgewogICAgICAgICAgICAgICAgdmFyIGEsIHMsIG8sIGMsIGwgPSAnJywgdSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJ2NvbnRleHREYXRhJyA9PSBlICYmIChlID0gJ2MnKSwgdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoYSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShPYmplY3QucHJvdG90eXBlW2FdIHx8IHIgJiYgYS5zdWJzdHJpbmcoMCwgci5sZW5ndGgpICE9IHIpICYmIHRbYV0gJiYgKCFuIHx8IDAgPD0gbi5pbmRleE9mKCcsJyArIChpID8gaSArICcuJyA6ICcnKSArIGEgKyAnLCcpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPSAhMSwgdSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdS5sZW5ndGg7IHMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuc3Vic3RyaW5nKDAsIHVbc10ubGVuZ3RoKSA9PSB1W3NdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvICYmICgnJyA9PSBsICYmIChsICs9ICcmJyArIGUgKyAnLicpLCBzID0gdFthXSwgciAmJiAoYSA9IGEuc3Vic3RyaW5nKHIubGVuZ3RoKSksIDAgPCBhLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCAobyA9IGEuaW5kZXhPZignLicpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IChyIHx8ICcnKSArIChzID0gYS5zdWJzdHJpbmcoMCwgbykpICsgJy4nLCB1IHx8ICh1ID0gW10pLCB1LnB1c2gobyksIGwgKz0gZi5vKHMsIHQsIG4sIGksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdib29sZWFuJyA9PSB0eXBlb2YgcyAmJiAocyA9IHMgPyAndHJ1ZScgOiAnZmFsc2UnKSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3JldHJpZXZlTGlnaHREYXRhJyA9PSBpICYmIHIuaW5kZXhPZignLmNvbnRleHREYXRhLicpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobyA9IGEuc3Vic3RyaW5nKDAsIDQpLCBjID0gYS5zdWJzdHJpbmcoNCksIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RyYW5zYWN0aW9uSUQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAneGFjdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjaGFubmVsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gJ2NoJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NhbXBhaWduJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gJ3YwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5SYShjKSAmJiAoJ3Byb3AnID09IG8gPyBhID0gJ2MnICsgYyA6ICdlVmFyJyA9PSBvID8gYSA9ICd2JyArIGMgOiAnbGlzdCcgPT0gbyA/IGEgPSAnbCcgKyBjIDogJ2hpZXInID09IG8gJiYgKGEgPSAnaCcgKyBjLCBzID0gcy5zdWJzdHJpbmcoMCwgMjU1KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9ICcmJyArIGYuZXNjYXBlKGEpICsgJz0nICsgZi5lc2NhcGUocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJycgIT0gbCAmJiAobCArPSAnJi4nICsgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgfSwgZi51c2VQb3N0YmFja3MgPSAwLCBmLlFiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGUsIHQsIG4sIGksIHIsIGEsIHMsIG8sIGMgPSAnJywgbCA9ICcnLCB1ID0gJycsIGQgPSBpID0gJycsIHAgPSBmLlQoKTsKICAgICAgICAgICAgICAgIGlmIChmLmxpZ2h0UHJvZmlsZUlEID8gKGUgPSBmLk8sIChsID0gZi5saWdodFRyYWNrVmFycykgJiYgKGwgPSAnLCcgKyBsICsgJywnICsgZi5sYS5qb2luKCcsJykgKyAnLCcpKSA6IChlID0gZi5nLCAoZi5wZSB8fCBmLmxpbmtUeXBlKSAmJiAobCA9IGYubGlua1RyYWNrVmFycywgdSA9IGYubGlua1RyYWNrRXZlbnRzLCBmLnBlICYmIChpID0gZi5wZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIGYucGUuc3Vic3RyaW5nKDEpLCBmW2ldICYmIChsID0gZltpXS5lYywgdSA9IGZbaV0uY2MpKSksIGwgJiYgKGwgPSAnLCcgKyBsICsgJywnICsgZi5GLmpvaW4oJywnKSArICcsJyksIHUgJiYgKHUgPSAnLCcgKyB1ICsgJywnLCBsICYmIChsICs9ICcsZXZlbnRzLCcpKSwgZi5ldmVudHMyICYmIChkICs9ICgnJyAhPSBkID8gJywnIDogJycpICsgZi5ldmVudHMyKSksIHAgJiYgcC5nZXRDdXN0b21lcklEcykgewogICAgICAgICAgICAgICAgICAgIGlmIChpID0gZywgciA9IHAuZ2V0Q3VzdG9tZXJJRHMoKSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlW3RdIHx8ICdvYmplY3QnID09IHR5cGVvZiAobiA9IHJbdF0pICYmIChpIHx8IChpID0ge30pLCBuLmlkICYmIChpW3QgKyAnLmlkJ10gPSBuLmlkKSwgbi5hdXRoU3RhdGUgJiYgKGlbdCArICcuYXMnXSA9IG4uYXV0aFN0YXRlKSk7CiAgICAgICAgICAgICAgICAgICAgaSAmJiAoYyArPSBmLm8oJ2NpZCcsIGkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAoZi5BdWRpZW5jZU1hbmFnZW1lbnQgJiYgZi5BdWRpZW5jZU1hbmFnZW1lbnQuaXNSZWFkeSgpICYmIChjICs9IGYubygnZCcsIGYuQXVkaWVuY2VNYW5hZ2VtZW50LmdldEV2ZW50Q2FsbENvbmZpZ1BhcmFtcygpKSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChpID0gZVt0XSwgciA9IGZbaV0sIG4gPSBpLnN1YnN0cmluZygwLCA0KSwgYSA9IGkuc3Vic3RyaW5nKDQpLCByIHx8ICgnZXZlbnRzJyA9PSBpICYmIGQgPyAociA9IGQsIGQgPSAnJykgOiAnbWFya2V0aW5nQ2xvdWRPcmdJRCcgPT0gaSAmJiBwICYmIGYuVignRUNJRCcpICYmIChyID0gcC5tYXJrZXRpbmdDbG91ZE9yZ0lEKSksIHIgJiYgKCFsIHx8IDAgPD0gbC5pbmRleE9mKCcsJyArIGkgKyAnLCcpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY3VzdG9tZXJQZXJzcGVjdGl2ZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2NwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtYXJrZXRpbmdDbG91ZE9yZ0lEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnbWNvcmdpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3VwcGxlbWVudGFsRGF0YUlEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnc2RpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGltZXN0YW1wJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAndHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2R5bmFtaWNWYXJpYWJsZVByZWZpeCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ0QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2l0b3JJRCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ3ZpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdtaWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FuYWx5dGljc1Zpc2l0b3JJRCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2FpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnYWFtbGgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGllbmNlTWFuYWdlckJsb2InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdhYW1iJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhdXRoU3RhdGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdhcyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFnZVVSTCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2cnLCAyNTUgPCByLmxlbmd0aCAmJiAoZi5wYWdlVVJMUmVzdCA9IHIuc3Vic3RyaW5nKDI1NSksIHIgPSByLnN1YnN0cmluZygwLCAyNTUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwYWdlVVJMUmVzdCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJy1nJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZWZlcnJlcic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ3InOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Ztayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2l0b3JNaWdyYXRpb25LZXknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICd2bXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Zpc2l0b3JNaWdyYXRpb25TZXJ2ZXInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICd2bWYnLCBmLnNzbCAmJiBmLnZpc2l0b3JNaWdyYXRpb25TZXJ2ZXJTZWN1cmUgJiYgKHIgPSAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndmlzaXRvck1pZ3JhdGlvblNlcnZlclNlY3VyZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ3ZtZicsICFmLnNzbCAmJiBmLnZpc2l0b3JNaWdyYXRpb25TZXJ2ZXIgJiYgKHIgPSAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2hhclNldCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2NlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd2aXNpdG9yTmFtZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnbnMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nvb2tpZURvbWFpblBlcmlvZHMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdjZHAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nvb2tpZUxpZmV0aW1lJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnY2wnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhcmlhYmxlUHJvdmlkZXInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICd2dnAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2N1cnJlbmN5Q29kZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2NjJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjaGFubmVsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnY2gnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3RyYW5zYWN0aW9uSUQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICd4YWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjYW1wYWlnbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ3YwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXRpdHVkZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2xhdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbG9uZ2l0dWRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnbG9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXNvbHV0aW9uJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAncyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29sb3JEZXB0aCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2phdmFzY3JpcHRWZXJzaW9uJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnaic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnamF2YUVuYWJsZWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICd2JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb29raWVzRW5hYmxlZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jyb3dzZXJXaWR0aCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2J3JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdicm93c2VySGVpZ2h0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnYmgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3Rpb25UeXBlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2hvbWVwYWdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnaHAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2V2ZW50cyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCAmJiAociArPSAoJycgIT0gciA/ICcsJyA6ICcnKSArIGQpLCB1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IHIuc3BsaXQoJywnKSwgciA9ICcnLCBuID0gMDsgbiA8IGEubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gKG8gPSAocyA9IGFbbl0pLmluZGV4T2YoJz0nKSkgJiYgKHMgPSBzLnN1YnN0cmluZygwLCBvKSksIDAgPD0gKG8gPSBzLmluZGV4T2YoJzonKSkgJiYgKHMgPSBzLnN1YnN0cmluZygwLCBvKSksIDAgPD0gdS5pbmRleE9mKCcsJyArIHMgKyAnLCcpICYmIChyICs9IChyID8gJywnIDogJycpICsgYVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZXZlbnRzMic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGV4dERhdGEnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBmLm8oJ2MnLCBmW2ldLCBsLCBpKSwgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZ2h0UHJvZmlsZUlEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnbXRwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsaWdodFN0b3JlRm9yU2Vjb25kcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ210c3MnLCBmLmxpZ2h0UHJvZmlsZUlEIHx8IChyID0gJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpZ2h0SW5jcmVtZW50QnknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdtdGknLCBmLmxpZ2h0UHJvZmlsZUlEIHx8IChyID0gJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JldHJpZXZlTGlnaHRQcm9maWxlcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ210c3InOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUxpZ2h0UHJvZmlsZXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdtdHNkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyZXRyaWV2ZUxpZ2h0RGF0YSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJldHJpZXZlTGlnaHRQcm9maWxlcyAmJiAoYyArPSBmLm8oJ210cycsIGZbaV0sIGwsIGkpKSwgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLlJhKGEpICYmICgncHJvcCcgPT0gbiA/IGkgPSAnYycgKyBhIDogJ2VWYXInID09IG4gPyBpID0gJ3YnICsgYSA6ICdsaXN0JyA9PSBuID8gaSA9ICdsJyArIGEgOiAnaGllcicgPT0gbiAmJiAoaSA9ICdoJyArIGEsIHIgPSByLnN1YnN0cmluZygwLCAyNTUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAoYyArPSAnJicgKyBpICsgJz0nICsgKCdwZXYnICE9IGkuc3Vic3RyaW5nKDAsIDMpID8gZi5lc2NhcGUocikgOiByKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICdwZXYzJyA9PSBpICYmIGYuZSAmJiAoYyArPSBmLmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGYua2EgJiYgKGMgKz0gJyZscnQ9JyArIGYua2EsIGYua2EgPSBudWxsKSwgYzsKICAgICAgICAgICAgfSwgZi5CID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gZS50YWdOYW1lOwogICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9ICcnICsgZS5sYyB8fCAndW5kZWZpbmVkJyAhPSAnJyArIGUuWmIgJiYgJ0hUTUwnICE9ICgnJyArIGUuWmIpLnRvVXBwZXJDYXNlKCkgPyAnJyA6ICgnU0hBUEUnID09ICh0ID0gdCAmJiB0LnRvVXBwZXJDYXNlID8gdC50b1VwcGVyQ2FzZSgpIDogJycpICYmICh0ID0gJycpLCB0ICYmICgoJ0lOUFVUJyA9PSB0IHx8ICdCVVRUT04nID09IHQpICYmIGUudHlwZSAmJiBlLnR5cGUudG9VcHBlckNhc2UgPyB0ID0gZS50eXBlLnRvVXBwZXJDYXNlKCkgOiAhdCAmJiBlLmhyZWYgJiYgKHQgPSAnQScpKSwgdCk7CiAgICAgICAgICAgIH0sIGYuTmEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIgPSBwLmxvY2F0aW9uLCBhID0gZS5ocmVmID8gZS5ocmVmIDogJyc7CiAgICAgICAgICAgICAgICByZXR1cm4gdCA9IGEuaW5kZXhPZignOicpLCBuID0gYS5pbmRleE9mKCc/JyksIGkgPSBhLmluZGV4T2YoJy8nKSwgYSAmJiAodCA8IDAgfHwgMCA8PSBuICYmIG4gPCB0IHx8IDAgPD0gaSAmJiBpIDwgdCkgJiYgKG4gPSBlLnByb3RvY29sICYmIDEgPCBlLnByb3RvY29sLmxlbmd0aCA/IGUucHJvdG9jb2wgOiByLnByb3RvY29sID8gci5wcm90b2NvbCA6ICcnLCB0ID0gci5wYXRobmFtZS5sYXN0SW5kZXhPZignLycpLCBhID0gKG4gPyBuICsgJy8vJyA6ICcnKSArIChlLmhvc3QgPyBlLmhvc3QgOiByLmhvc3QgPyByLmhvc3QgOiAnJykgKyAoJy8nICE9IGEuc3Vic3RyaW5nKDAsIDEpID8gci5wYXRobmFtZS5zdWJzdHJpbmcoMCwgdCA8IDAgPyAwIDogdCkgKyAnLycgOiAnJykgKyBhKSwgYTsKICAgICAgICAgICAgfSwgZi5MID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0LCBuLCBpID0gZi5CKGUpLCByID0gJycsIGEgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgKHQgPSBlLnByb3RvY29sLCBuID0gZS5vbmNsaWNrLCAhZS5ocmVmIHx8ICdBJyAhPSBpICYmICdBUkVBJyAhPSBpIHx8IG4gJiYgdCAmJiAhKHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdqYXZhc2NyaXB0JykgPCAwKSA/IG4gPyAociA9IGYucmVwbGFjZShmLnJlcGxhY2UoZi5yZXBsYWNlKGYucmVwbGFjZSgnJyArIG4sICdccicsICcnKSwgJ1xuJywgJycpLCAnXHQnLCAnJyksICcgJywgJycpLCBhID0gMikgOiAnSU5QVVQnID09IGkgfHwgJ1NVQk1JVCcgPT0gaSA/IChlLnZhbHVlID8gciA9IGUudmFsdWUgOiBlLmlubmVyVGV4dCA/IHIgPSBlLmlubmVyVGV4dCA6IGUudGV4dENvbnRlbnQgJiYgKHIgPSBlLnRleHRDb250ZW50KSwgYSA9IDMpIDogJ0lNQUdFJyA9PSBpICYmIGUuc3JjICYmIChyID0gZS5zcmMpIDogciA9IGYuTmEoZSksIHIpID8gewogICAgICAgICAgICAgICAgICAgIGlkOiByLnN1YnN0cmluZygwLCAxMDApLAogICAgICAgICAgICAgICAgICAgIHR5cGU6IGEKICAgICAgICAgICAgICAgIH0gOiAwOwogICAgICAgICAgICB9LCBmLmpjID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBmLkIoZSksIG4gPSBmLkwoZSk7IGUgJiYgIW4gJiYgJ0JPRFknICE9IHQ7KQogICAgICAgICAgICAgICAgICAgIChlID0gZS5wYXJlbnRFbGVtZW50ID8gZS5wYXJlbnRFbGVtZW50IDogZS5wYXJlbnROb2RlKSAmJiAodCA9IGYuQihlKSwgbiA9IGYuTChlKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAnQk9EWScgIT0gdCB8fCAoZSA9IDApLCBlICYmICgwIDw9ICh0ID0gZS5vbmNsaWNrID8gJycgKyBlLm9uY2xpY2sgOiAnJykuaW5kZXhPZignLnRsKCcpIHx8IDAgPD0gdC5pbmRleE9mKCcudHJhY2tMaW5rKCcpKSAmJiAoZSA9IDApLCBlOwogICAgICAgICAgICB9LCBmLlliID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGUsIHQsIG4sIGksIHIgPSBmLmxpbmtPYmplY3QsIGEgPSBmLmxpbmtUeXBlLCBzID0gZi5saW5rVVJMOwogICAgICAgICAgICAgICAgaWYgKGYubWEgPSAxLCByIHx8IChmLm1hID0gMCwgciA9IGYuY2xpY2tPYmplY3QpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gZi5CKHIpLCB0ID0gZi5MKHIpOyByICYmICF0ICYmICdCT0RZJyAhPSBlOykKICAgICAgICAgICAgICAgICAgICAgICAgKHIgPSByLnBhcmVudEVsZW1lbnQgPyByLnBhcmVudEVsZW1lbnQgOiByLnBhcmVudE5vZGUpICYmIChlID0gZi5CKHIpLCB0ID0gZi5MKHIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAnQk9EWScgIT0gZSB8fCAociA9IDApLCByICYmICFmLmxpbmtPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLm9uY2xpY2sgPyAnJyArIHIub25jbGljayA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAoMCA8PSBvLmluZGV4T2YoJy50bCgnKSB8fCAwIDw9IG8uaW5kZXhPZignLnRyYWNrTGluaygnKSkgJiYgKHIgPSAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICBmLm1hID0gMTsKICAgICAgICAgICAgICAgIGlmICghcyAmJiByICYmIChzID0gZi5OYShyKSksIHMgJiYgIWYubGlua0xlYXZlUXVlcnlTdHJpbmcgJiYgKDAgPD0gKG4gPSBzLmluZGV4T2YoJz8nKSkgJiYgKHMgPSBzLnN1YnN0cmluZygwLCBuKSkpLCAhYSAmJiBzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMsIGwgPSAwLCB1ID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoZi50cmFja0Rvd25sb2FkTGlua3MgJiYgZi5saW5rRG93bmxvYWRGaWxlVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IChvID0gcy50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCc/JyksIGkgPSBvLmluZGV4T2YoJyMnKSwgMCA8PSBuID8gMCA8PSBpICYmIGkgPCBuICYmIChuID0gaSkgOiBuID0gaSwgMCA8PSBuICYmIChvID0gby5zdWJzdHJpbmcoMCwgbikpLCBuID0gZi5saW5rRG93bmxvYWRGaWxlVHlwZXMudG9Mb3dlckNhc2UoKS5zcGxpdCgnLCcpLCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA9IG5baV0pICYmIG8uc3Vic3RyaW5nKG8ubGVuZ3RoIC0gKGMubGVuZ3RoICsgMSkpID09ICcuJyArIGMgJiYgKGEgPSAnZCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChmLnRyYWNrRXh0ZXJuYWxMaW5rcyAmJiAhYSAmJiAobyA9IHMudG9Mb3dlckNhc2UoKSwgZi5RYShvKSAmJiAoZi5saW5rSW50ZXJuYWxGaWx0ZXJzIHx8IChmLmxpbmtJbnRlcm5hbEZpbHRlcnMgPSBwLmxvY2F0aW9uLmhvc3RuYW1lKSwgbiA9IDAsIGYubGlua0V4dGVybmFsRmlsdGVycyA/IChuID0gZi5saW5rRXh0ZXJuYWxGaWx0ZXJzLnRvTG93ZXJDYXNlKCkuc3BsaXQoJywnKSwgbCA9IDEpIDogZi5saW5rSW50ZXJuYWxGaWx0ZXJzICYmIChuID0gZi5saW5rSW50ZXJuYWxGaWx0ZXJzLnRvTG93ZXJDYXNlKCkuc3BsaXQoJywnKSksIG4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbi5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBuW2ldLCAwIDw9IG8uaW5kZXhPZihjKSAmJiAodSA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICB1ID8gbCAmJiAoYSA9ICdlJykgOiBsIHx8IChhID0gJ2UnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmLmxpbmtPYmplY3QgPSByLCBmLmxpbmtVUkwgPSBzLCBmLmxpbmtUeXBlID0gYSwgKGYudHJhY2tDbGlja01hcCB8fCBmLnRyYWNrSW5saW5lU3RhdHMpICYmIChmLmUgPSAnJywgciAmJiAoYSA9IGYucGFnZU5hbWUsIHMgPSAxLCByID0gci5zb3VyY2VJbmRleCwgYSB8fCAoYSA9IGYucGFnZVVSTCwgcyA9IDApLCBwLnNfb2JqZWN0SUQgJiYgKHQuaWQgPSBwLnNfb2JqZWN0SUQsIHIgPSB0LnR5cGUgPSAxKSwgYSAmJiB0ICYmIHQuaWQgJiYgZSAmJiAoZi5lID0gJyZwaWQ9JyArIGYuZXNjYXBlKGEuc3Vic3RyaW5nKDAsIDI1NSkpICsgKHMgPyAnJnBpZHQ9JyArIHMgOiAnJykgKyAnJm9pZD0nICsgZi5lc2NhcGUodC5pZC5zdWJzdHJpbmcoMCwgMTAwKSkgKyAodC50eXBlID8gJyZvaWR0PScgKyB0LnR5cGUgOiAnJykgKyAnJm90PScgKyBlICsgKHIgPyAnJm9pPScgKyByIDogJycpKSkpOwogICAgICAgICAgICB9LCBmLlJiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGUgPSBmLm1hLCB0ID0gZi5saW5rVHlwZSwgbiA9IGYubGlua1VSTCwgaSA9IGYubGlua05hbWU7CiAgICAgICAgICAgICAgICBpZiAodCAmJiAobiB8fCBpKSAmJiAoJ2QnICE9ICh0ID0gdC50b0xvd2VyQ2FzZSgpKSAmJiAnZScgIT0gdCAmJiAodCA9ICdvJyksIGYucGUgPSAnbG5rXycgKyB0LCBmLnBldjEgPSBuID8gZi5lc2NhcGUobikgOiAnJywgZi5wZXYyID0gaSA/IGYuZXNjYXBlKGkpIDogJycsIGUgPSAxKSwgZi5hYm9ydCAmJiAoZSA9IDApLCBmLnRyYWNrQ2xpY2tNYXAgfHwgZi50cmFja0lubGluZVN0YXRzIHx8IGYuVWIoKSkgewogICAgICAgICAgICAgICAgICAgIHQgPSB7fSwgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGEsIHMsIG8gPSAoYyA9IGYucmIoKSkgPyBjLnNwbGl0KCcmJykgOiAwLCBjID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAobykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IG8ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gb1tyXS5zcGxpdCgnPScpLCBpID0gZi51bmVzY2FwZShhWzBdKS5zcGxpdCgnLCcpLCB0W2EgPSBmLnVuZXNjYXBlKGFbMV0pXSA9IGk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChzIGluIChpID0gZi5hY2NvdW50LnNwbGl0KCcsJyksIHIgPSB7fSwgZi5jb250ZXh0RGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgIU9iamVjdC5wcm90b3R5cGVbc10gJiYgJ2EuYWN0aXZpdHltYXAuJyA9PSBzLnN1YnN0cmluZygwLCAxNCkgJiYgKHJbc10gPSBmLmNvbnRleHREYXRhW3NdLCBmLmNvbnRleHREYXRhW3NdID0gJycpOwogICAgICAgICAgICAgICAgICAgIGlmIChmLmUgPSBmLm8oJ2MnLCByKSArIChmLmUgPyBmLmUgOiAnJyksIGUgfHwgZi5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSBpbiAoZSAmJiAhZi5lICYmIChjID0gMSksIHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlW2FdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCBpLmxlbmd0aDsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgJiYgKChvID0gdFthXS5qb2luKCcsJykpID09IGYuYWNjb3VudCAmJiAoZi5lICs9ICgnJicgIT0gYS5jaGFyQXQoMCkgPyAnJicgOiAnJykgKyBhLCB0W2FdID0gW10sIG4gPSAxKSksIHIgPSAwOyByIDwgdFthXS5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvID0gdFthXVtyXSkgPT0gaVtzXSAmJiAoYyAmJiAoZi5lICs9ICcmdT0nICsgZi5lc2NhcGUobykgKyAoJyYnICE9IGEuY2hhckF0KDApID8gJyYnIDogJycpICsgYSArICcmdT0wJyksIHRbYV0uc3BsaWNlKHIsIDEpLCBuID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIHx8IChuID0gMSksIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSBpbiAoYyA9ICcnLCByID0gMiwgIWUgJiYgZi5lICYmIChjID0gZi5lc2NhcGUoaS5qb2luKCcsJykpICsgJz0nICsgZi5lc2NhcGUoZi5lKSwgciA9IDEpLCB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZVthXSAmJiAwIDwgciAmJiAwIDwgdFthXS5sZW5ndGggJiYgKGMgKz0gKGMgPyAnJicgOiAnJykgKyBmLmVzY2FwZSh0W2FdLmpvaW4oJywnKSkgKyAnPScgKyBmLmVzY2FwZShhKSwgci0tKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuemIoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgfSwgZi5yYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmLnVzZUxpbmtUcmFja1Nlc3Npb25TdG9yYWdlID8gZi5FYSgpID8gcC5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGYuUCkgOiB2b2lkIDAgOiBmLmNvb2tpZVJlYWQoZi5QKTsKICAgICAgICAgICAgfSwgZi5FYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhIXAuc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0sIGYuemIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZi51c2VMaW5rVHJhY2tTZXNzaW9uU3RvcmFnZSA/IGYuRWEoKSAmJiBwLnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZi5QLCBlKSA6IGYuY29va2llV3JpdGUoZi5QLCBlKTsKICAgICAgICAgICAgfSwgZi5TYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICghZi5iYykgewogICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCBuID0gbmV3IERhdGUoKSwgaSA9IGIubG9jYXRpb24sIHIgPSB0ID0gZSA9ICcnLCBhID0gJycsIHMgPSAnJywgbyA9ICcxLjInLCBjID0gZi5jb29raWVXcml0ZSgnc19jYycsICd0cnVlJywgMCkgPyAnWScgOiAnTicsIGwgPSAnJywgdSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmIChuLnNldFVUQ0RhdGUgJiYgKG8gPSAnMS4zJywgMCAudG9QcmVjaXNpb24gJiYgKG8gPSAnMS41JywgKG4gPSBbXSkuZm9yRWFjaCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnMS42JywgdCA9IDAsIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ID0gbmV3IEl0ZXJhdG9yKGUpKS5uZXh0ICYmIChvID0gJzEuNycsIG4ucmVkdWNlICYmICgobyA9ICcxLjgnKS50cmltICYmIChvID0gJzEuOC4xJywgRGF0ZS5wYXJzZSAmJiAobyA9ICcxLjguMicsIE9iamVjdC5jcmVhdGUgJiYgKG8gPSAnMS44LjUnKSkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlID0gc2NyZWVuLndpZHRoICsgJ3gnICsgc2NyZWVuLmhlaWdodCwgciA9IG5hdmlnYXRvci5qYXZhRW5hYmxlZCgpID8gJ1knIDogJ04nLCB0ID0gc2NyZWVuLnBpeGVsRGVwdGggPyBzY3JlZW4ucGl4ZWxEZXB0aCA6IHNjcmVlbi5jb2xvckRlcHRoLCBhID0gZi53LmlubmVyV2lkdGggPyBmLncuaW5uZXJXaWR0aCA6IGYuZC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgsIHMgPSBmLncuaW5uZXJIZWlnaHQgPyBmLncuaW5uZXJIZWlnaHQgOiBmLmQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBmLmIuYWRkQmVoYXZpb3IoJyNkZWZhdWx0I2hvbWVQYWdlJyksIGwgPSBmLmIua2MoaSkgPyAnWScgOiAnTic7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBmLmIuYWRkQmVoYXZpb3IoJyNkZWZhdWx0I2NsaWVudENhcHMnKSwgdSA9IGYuYi5jb25uZWN0aW9uVHlwZTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChtKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYucmVzb2x1dGlvbiA9IGUsIGYuY29sb3JEZXB0aCA9IHQsIGYuamF2YXNjcmlwdFZlcnNpb24gPSBvLCBmLmphdmFFbmFibGVkID0gciwgZi5jb29raWVzRW5hYmxlZCA9IGMsIGYuYnJvd3NlcldpZHRoID0gYSwgZi5icm93c2VySGVpZ2h0ID0gcywgZi5jb25uZWN0aW9uVHlwZSA9IHUsIGYuaG9tZXBhZ2UgPSBsLCBmLmJjID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZi5RID0ge30sIGYubG9hZE1vZHVsZSA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGYuUVt0XTsKICAgICAgICAgICAgICAgIGlmICghbikgewogICAgICAgICAgICAgICAgICAgIG4gPSBwWydBcHBNZWFzdXJlbWVudF9Nb2R1bGVfJyArIHRdID8gbmV3IHBbJ0FwcE1lYXN1cmVtZW50X01vZHVsZV8nICsgdF0oZikgOiB7fSwgZi5RW3RdID0gZlt0XSA9IG4sIG4ua2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnViOwogICAgICAgICAgICAgICAgICAgIH0sIG4uQWIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAobi51YiA9IGUpICYmIChmW3QgKyAnX29uTG9hZCddID0gZSwgZi5mYSh0ICsgJ19vbkxvYWQnLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbgogICAgICAgICAgICAgICAgICAgICAgICBdLCAxKSB8fCBlKGYsIG4pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnb25Mb2FkJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBuLmtiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBuLkFiCiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbi5fb2xjID0gMTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4uX29sYyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZSAmJiAoZlt0ICsgJ19vbkxvYWQnXSA9IGUsIGYuZmEodCArICdfb25Mb2FkJywgWwogICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgbgogICAgICAgICAgICAgICAgXSwgMSkgfHwgZShmLCBuKSk7CiAgICAgICAgICAgIH0sIGYudSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbjsKICAgICAgICAgICAgICAgIGZvciAodCBpbiBmLlEpCiAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlW3RdICYmIChuID0gZi5RW3RdKSAmJiAobi5fb2xjICYmIG4ub25Mb2FkICYmIChuLl9vbGMgPSAwLCBuLm9uTG9hZChmLCBuKSksIG5bZV0gJiYgbltlXSgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfSwgZi5VYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhKCFmLkFjdGl2aXR5TWFwIHx8ICFmLkFjdGl2aXR5TWFwLl9jKTsKICAgICAgICAgICAgfSwgZi5WYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gTWF0aC5mbG9vcigxMDAwMDAwMDAwMDAwMCAqIE1hdGgucmFuZG9tKCkpLCB0ID0gZi52aXNpdG9yU2FtcGxpbmcsIG4gPSBmLnZpc2l0b3JTYW1wbGluZ0dyb3VwLCBpID0gKG4gPSAnc192c25fJyArIChmLnZpc2l0b3JOYW1lc3BhY2UgPyBmLnZpc2l0b3JOYW1lc3BhY2UgOiBmLmFjY291bnQpICsgKG4gPyAnXycgKyBuIDogJycpLCBmLmNvb2tpZVJlYWQobikpOwogICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCAqPSAxMDAsIGkgJiYgKGkgPSBwYXJzZUludChpKSksICFpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5jb29raWVXcml0ZShuLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICBpID0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCBpICUgMTAwMDApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0sIGYuUyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSwgciwgYSwgcywgbywgYzsKICAgICAgICAgICAgICAgIGZvciAoYyA9IHt9LCBuID0gMDsgbiA8IDI7IG4rKykKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwIDwgbiA/IGYuR2EgOiBmLmcsIHIgPSAwOyByIDwgaS5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzID0gZVthID0gaVtyXV0pIHx8IGVbJyEnICsgYV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICYmICF0ICYmICgnY29udGV4dERhdGEnID09IGEgfHwgJ3JldHJpZXZlTGlnaHREYXRhJyA9PSBhKSAmJiBmW2FdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobyBpbiBmW2FdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW29dIHx8IChzW29dID0gZlthXVtvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW2FdIHx8IChjWychJyArIGFdID0gMSksIGNbYV0gPSBmW2FdLCBmW2FdID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgIH0sIGYuaGMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHI7CiAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgMjsgdCsrKQogICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDAgPCB0ID8gZi5HYSA6IGYuZywgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICBlW3IgPSBuW2ldXSA9IGZbcl0sIGVbcl0gfHwgJ3Byb3AnICE9PSByLnN1YnN0cmluZygwLCA0KSAmJiAnZVZhcicgIT09IHIuc3Vic3RyaW5nKDAsIDQpICYmICdoaWVyJyAhPT0gci5zdWJzdHJpbmcoMCwgNCkgJiYgJ2xpc3QnICE9PSByLnN1YnN0cmluZygwLCA0KSAmJiAnY2hhbm5lbCcgIT09IHIgJiYgJ2V2ZW50cycgIT09IHIgJiYgJ2V2ZW50TGlzdCcgIT09IHIgJiYgJ3Byb2R1Y3RzJyAhPT0gciAmJiAncHJvZHVjdExpc3QnICE9PSByICYmICdwdXJjaGFzZUlEJyAhPT0gciAmJiAndHJhbnNhY3Rpb25JRCcgIT09IHIgJiYgJ3N0YXRlJyAhPT0gciAmJiAnemlwJyAhPT0gciAmJiAnY2FtcGFpZ24nICE9PSByICYmICdldmVudHMyJyAhPT0gciAmJiAnbGF0aXR1ZGUnICE9PSByICYmICdsb25naXR1ZGUnICE9PSByICYmICdtc19hJyAhPT0gciAmJiAnY29udGV4dERhdGEnICE9PSByICYmICdzdXBwbGVtZW50YWxEYXRhSUQnICE9PSByICYmICd0bnQnICE9PSByICYmICd0aW1lc3RhbXAnICE9PSByICYmICdhYm9ydCcgIT09IHIgJiYgJ3VzZUJlYWNvbicgIT09IHIgJiYgJ2xpbmtPYmplY3QnICE9PSByICYmICdjbGlja09iamVjdCcgIT09IHIgJiYgJ2xpbmtUeXBlJyAhPT0gciAmJiAnbGlua05hbWUnICE9PSByICYmICdsaW5rVVJMJyAhPT0gciAmJiAnYm9keUNsaWNrVGFyZ2V0JyAhPT0gciAmJiAnYm9keUNsaWNrRnVuY3Rpb24nICE9PSByIHx8IChlWychJyArIHJdID0gMSk7CiAgICAgICAgICAgIH0sIGYuTWIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIsIGEsIHMsIG8gPSAwLCBjID0gJycsIGwgPSAnJzsKICAgICAgICAgICAgICAgIGlmIChlICYmIDI1NSA8IGUubGVuZ3RoICYmICgwIDwgKG4gPSAodCA9ICcnICsgZSkuaW5kZXhPZignPycpKSAmJiAocyA9IHQuc3Vic3RyaW5nKG4gKyAxKSwgaSA9IDAsICdodHRwOi8vJyA9PSAociA9ICh0ID0gdC5zdWJzdHJpbmcoMCwgbikpLnRvTG93ZXJDYXNlKCkpLnN1YnN0cmluZygwLCA3KSA/IGkgKz0gNyA6ICdodHRwczovLycgPT0gci5zdWJzdHJpbmcoMCwgOCkgJiYgKGkgKz0gOCksIDAgPCAobiA9IHIuaW5kZXhPZignLycsIGkpKSAmJiAociA9IHIuc3Vic3RyaW5nKGksIG4pLCBhID0gdC5zdWJzdHJpbmcobiksIHQgPSB0LnN1YnN0cmluZygwLCBuKSwgMCA8PSByLmluZGV4T2YoJ2dvb2dsZScpID8gbyA9ICcscSxpZSxzdGFydCxzZWFyY2hfa2V5LHdvcmQsa3csY2QsJyA6IDAgPD0gci5pbmRleE9mKCd5YWhvby5jbycpID8gbyA9ICcscCxlaSwnIDogMCA8PSByLmluZGV4T2YoJ2JhaWR1LicpICYmIChvID0gJyx3ZCx3b3JkLCcpLCBvICYmIHMpKSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSBzLnNwbGl0KCcmJykpICYmIDEgPCBlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCAobiA9IChyID0gZVtpXSkuaW5kZXhPZignPScpKSAmJiAwIDw9IG8uaW5kZXhPZignLCcgKyByLnN1YnN0cmluZygwLCBuKSArICcsJykgPyBjICs9IChjID8gJyYnIDogJycpICsgciA6IGwgKz0gKGwgPyAnJicgOiAnJykgKyByOwogICAgICAgICAgICAgICAgICAgICAgICBjICYmIGwgPyBzID0gYyArICcmJyArIGwgOiBsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUgPSB0ICsgKDAgPCAobiA9IDI1MyAtIChzLmxlbmd0aCAtIGwubGVuZ3RoKSAtIHQubGVuZ3RoKSA/IGEuc3Vic3RyaW5nKDAsIG4pIDogJycpICsgJz8nICsgczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICB9LCBmLmViID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gZi5kLnZpc2liaWxpdHlTdGF0ZSwgbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAndmlzaWJpbGl0eWNoYW5nZScKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgaWYgKGUgfHwgKGUgPSBmLmQud2Via2l0VmlzaWJpbGl0eVN0YXRlKSwgZSAmJiAncHJlcmVuZGVyJyA9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCBuLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5kLmFkZEV2ZW50TGlzdGVuZXIobltlXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZi5kLnZpc2liaWxpdHlTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIHx8IChlID0gZi5kLndlYmtpdFZpc2liaWxpdHlTdGF0ZSksICd2aXNpYmxlJyA9PSBlICYmIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfSwgZi5jYSA9ICExLCBmLkggPSAhMSwgZi5DYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYuSCA9ICEwLCBmLnAoKTsKICAgICAgICAgICAgfSwgZi5JID0gITEsIGYuRGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZi5tYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCA9IGUuTUNNSUQsIGYudmlzaXRvck9wdGVkT3V0ID0gZS5NQ09QVE9VVCwgZi5hbmFseXRpY3NWaXNpdG9ySUQgPSBlLk1DQUlELCBmLmF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCA9IGUuTUNBQU1MSCwgZi5hdWRpZW5jZU1hbmFnZXJCbG9iID0gZS5NQ0FBTUIsIGYuSSA9ICExLCBmLnAoKTsKICAgICAgICAgICAgfSwgZi5jYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5tYXhEZWxheSB8fCAoZi5tYXhEZWxheSA9IDI1MCksICFmLnUoJ19kJykgfHwgKGUgJiYgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZSgpOwogICAgICAgICAgICAgICAgfSwgZi5tYXhEZWxheSksICExKTsKICAgICAgICAgICAgfSwgZi5hYSA9ICExLCBmLkcgPSAhMSwgZi5BYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYuRyA9ICEwLCBmLnAoKTsKICAgICAgICAgICAgfSwgZi5pc1JlYWR5VG9UcmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gITA7CiAgICAgICAgICAgICAgICByZXR1cm4gISghZi5vYigpIHx8ICFmLm1iKCkpICYmIChmLnFiKCkgfHwgKGUgPSAhMSksIGYudGIoKSB8fCAoZSA9ICExKSwgZSk7CiAgICAgICAgICAgIH0sIGYub2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5jYSB8fCBmLkggfHwgKGYuZWIoZi5DYikgPyBmLkggPSAhMCA6IGYuY2EgPSAhMCksICEoZi5jYSAmJiAhZi5IKTsKICAgICAgICAgICAgfSwgZi5tYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gZi53YSgpOwogICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWYudGEgJiYgIWYuYmEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZldGNoUGVybWlzc2lvbnMoZi52YiwgITApLCAhKGYuYmEgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmLnRhKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmlzQXBwcm92ZWQoZS5DYXRlZ29yaWVzLkFOQUxZVElDUykpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgfSwgZi5WID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gZi53YSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICEodCAmJiAhdC5pc0FwcHJvdmVkKHQuQ2F0ZWdvcmllc1tlXSkpOwogICAgICAgICAgICB9LCBmLndhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHAuYWRvYmUgJiYgcC5hZG9iZS5vcHRJbiA/IHAuYWRvYmUub3B0SW4gOiBudWxsOwogICAgICAgICAgICB9LCBmLlkgPSAhMCwgZi5xYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gZi5UKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgIWUuZ2V0VmlzaXRvclZhbHVlcyB8fCAoZi5ZICYmIChmLlkgPSAhMSwgZi5JIHx8IChmLkkgPSAhMCwgZS5nZXRWaXNpdG9yVmFsdWVzKGYuRGIpKSksICFmLkkpOwogICAgICAgICAgICB9LCBmLlQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGYudmlzaXRvcjsKICAgICAgICAgICAgICAgIHJldHVybiBlICYmICFlLmlzQWxsb3dlZCgpICYmIChlID0gbnVsbCksIGU7CiAgICAgICAgICAgIH0sIGYudGIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5hYSB8fCBmLkcgfHwgKGYuY2IoZi5BYSkgPyBmLkcgPSAhMCA6IGYuYWEgPSAhMCksICEoZi5hYSAmJiAhZi5HKTsKICAgICAgICAgICAgfSwgZi5iYSA9ICExLCBmLnZiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZi5iYSA9ICExLCBmLnRhID0gITA7CiAgICAgICAgICAgIH0sIGYuaiA9IGcsIGYucSA9IDAsIGYuY2FsbGJhY2tXaGVuUmVhZHlUb1RyYWNrID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgKGkgPSB7fSkuSGIgPSBlLCBpLkdiID0gdCwgaS5FYiA9IG4sIGYuaiA9PSBnICYmIChmLmogPSBbXSksIGYuai5wdXNoKGkpLCAwID09IGYucSAmJiAoZi5xID0gc2V0SW50ZXJ2YWwoZi5wLCAxMDApKTsKICAgICAgICAgICAgfSwgZi5wID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICBpZiAoZi5pc1JlYWR5VG9UcmFjaygpICYmIChmLkJiKCksIGYuaiAhPSBnKSkKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IGYuai5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICAoZSA9IGYuai5zaGlmdCgpKS5HYi5hcHBseShlLkhiLCBlLkViKTsKICAgICAgICAgICAgfSwgZi5CYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYucSAmJiAoY2xlYXJJbnRlcnZhbChmLnEpLCBmLnEgPSAwKTsKICAgICAgICAgICAgfSwgZi51YSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IHt9OwogICAgICAgICAgICAgICAgaWYgKGYuaGMobiksIGUgIT0gZykKICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgblt0XSA9IGVbdF07CiAgICAgICAgICAgICAgICBmLmNhbGxiYWNrV2hlblJlYWR5VG9UcmFjayhmLCBmLkZhLCBbbl0pLCBmLkRhKCk7CiAgICAgICAgICAgIH0sIGYuT2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IGYuY29va2llUmVhZCgnc19maWQnKSwgbiA9ICcnLCBpID0gJyc7CiAgICAgICAgICAgICAgICBlID0gODsKICAgICAgICAgICAgICAgIHZhciByID0gNDsKICAgICAgICAgICAgICAgIGlmICghdCB8fCB0LmluZGV4T2YoJy0nKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgMTY7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGUpLCBuICs9ICcwMTIzNDU2Nzg5QUJDREVGJy5zdWJzdHJpbmcoZSwgZSArIDEpLCBlID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogciksIGkgKz0gJzAxMjM0NTY3ODlBQkNERUYnLnN1YnN0cmluZyhlLCBlICsgMSksIGUgPSByID0gMTY7CiAgICAgICAgICAgICAgICAgICAgdCA9IG4gKyAnLScgKyBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGYuY29va2llV3JpdGUoJ3NfZmlkJywgdCwgMSkgfHwgKHQgPSAwKSwgdDsKICAgICAgICAgICAgfSwgZi5GYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IG5ldyBEYXRlKCksIGkgPSAncycgKyBNYXRoLmZsb29yKG4uZ2V0VGltZSgpIC8gMTA4MDAwMDApICUgMTAgKyBNYXRoLmZsb29yKDEwMDAwMDAwMDAwMDAwICogTWF0aC5yYW5kb20oKSksIHIgPSBuLmdldFllYXIoKSwgYSA9IChyID0gJ3Q9JyArIGYuZXNjYXBlKG4uZ2V0RGF0ZSgpICsgJy8nICsgbi5nZXRNb250aCgpICsgJy8nICsgKHIgPCAxOTAwID8gciArIDE5MDAgOiByKSArICcgJyArIG4uZ2V0SG91cnMoKSArICc6JyArIG4uZ2V0TWludXRlcygpICsgJzonICsgbi5nZXRTZWNvbmRzKCkgKyAnICcgKyBuLmdldERheSgpICsgJyAnICsgbi5nZXRUaW1lem9uZU9mZnNldCgpKSwgZi5UKCkpOwogICAgICAgICAgICAgICAgZSAmJiAodCA9IGYuUyhlLCAxKSksIGYuVmIoKSAmJiAhZi52aXNpdG9yT3B0ZWRPdXQgJiYgKGYueGEoKSB8fCAoZi5maWQgPSBmLk9iKCkpLCBmLlliKCksIGYudXNlUGx1Z2lucyAmJiBmLmRvUGx1Z2lucyAmJiBmLmRvUGx1Z2lucyhmKSwgZi5hY2NvdW50ICYmIChmLmFib3J0IHx8IChmLnRyYWNrT2ZmbGluZSAmJiAhZi50aW1lc3RhbXAgJiYgKGYudGltZXN0YW1wID0gTWF0aC5mbG9vcihuLmdldFRpbWUoKSAvIDEwMDApKSwgZSA9IHAubG9jYXRpb24sIGYucGFnZVVSTCB8fCAoZi5wYWdlVVJMID0gZS5ocmVmID8gZS5ocmVmIDogZSksIGYucmVmZXJyZXIgfHwgZi4kYSB8fCAoZSA9IGYuVXRpbC5nZXRRdWVyeVBhcmFtKCdhZG9iZV9tY19yZWYnLCBudWxsLCBudWxsLCAhMCksIGYucmVmZXJyZXIgPSBlIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA9PT0gZSA/ICcnIDogZSA6IGIuZG9jdW1lbnQucmVmZXJyZXIpLCBmLiRhID0gMSwgIWYucmVmZXJyZXIgJiYgZi5aICYmIChmLnJlZmVycmVyID0gZi5aKSwgZi5aID0gMCwgZi5yZWZlcnJlciA9IGYuTWIoZi5yZWZlcnJlciksIGYudSgnX2cnKSksIGYuUmIoKSAmJiAhZi5hYm9ydCAmJiAoYSAmJiBmLlYoJ1RBUkdFVCcpICYmICFmLnN1cHBsZW1lbnRhbERhdGFJRCAmJiBhLmdldFN1cHBsZW1lbnRhbERhdGFJRCAmJiAoZi5zdXBwbGVtZW50YWxEYXRhSUQgPSBhLmdldFN1cHBsZW1lbnRhbERhdGFJRCgnQXBwTWVhc3VyZW1lbnQ6JyArIGYuX2luLCAhZi5leHBlY3RTdXBwbGVtZW50YWxEYXRhKSksIGYuVignQUFNJykgfHwgKGYuY29udGV4dERhdGFbJ2NtLnNzZiddID0gMSksIGYuU2IoKSwgZi53YigpLCByICs9IGYuUWIoKSwgZi5zYihpLCByKSwgZi51KCdfdCcpLCBmLnJlZmVycmVyID0gJycpKSksIGYucmVmZXJyZXIgJiYgKGYuWiA9IGYucmVmZXJyZXIpLCBmLkRhKCksIHQgJiYgZi5TKHQsIDEpOwogICAgICAgICAgICB9LCBmLnQgPSBmLnRyYWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHQgJiYgZi5TKHQpLCBmLlkgPSAhMCwgZi5pc1JlYWR5VG9UcmFjaygpID8gbnVsbCAhPSBmLmogJiYgMCA8IGYuai5sZW5ndGggPyAoZi51YShlKSwgZi5wKCkpIDogZi5GYShlKSA6IGYudWEoZSk7CiAgICAgICAgICAgIH0sIGYud2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBmLndyaXRlU2VjdXJlQ29va2llcyAmJiAhZi5zc2wgJiYgZi5hYigpOwogICAgICAgICAgICB9LCBmLmFiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZi5jb250ZXh0RGF0YS5leGNDb2RlcyA9IGYuY29udGV4dERhdGEuZXhjQ29kZXMgPyBmLmNvbnRleHREYXRhLmV4Y0NvZGVzIDogW10sIGYuY29udGV4dERhdGEuZXhjQ29kZXMucHVzaCgxKTsKICAgICAgICAgICAgfSwgZi5EYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYuYWJvcnQgPSBmLnN1cHBsZW1lbnRhbERhdGFJRCA9IGYudGltZXN0YW1wID0gZi5wYWdlVVJMUmVzdCA9IGYubGlua09iamVjdCA9IGYuY2xpY2tPYmplY3QgPSBmLmxpbmtVUkwgPSBmLmxpbmtOYW1lID0gZi5saW5rVHlwZSA9IHAuc19vYmplY3RJRCA9IGYucGUgPSBmLnBldjEgPSBmLnBldjIgPSBmLnBldjMgPSBmLmUgPSBmLmxpZ2h0UHJvZmlsZUlEID0gZi51c2VCZWFjb24gPSBmLnJlZmVycmVyID0gMCwgZi5jb250ZXh0RGF0YSAmJiBmLmNvbnRleHREYXRhLmV4Y0NvZGVzICYmIChmLmNvbnRleHREYXRhLmV4Y0NvZGVzID0gMCk7CiAgICAgICAgICAgIH0sIGYuQ2EgPSBbXSwgZi5yZWdpc3RlclByZVRyYWNrQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFtdLCBuID0gMTsgbiA8IGFyZ3VtZW50cy5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICB0LnB1c2goYXJndW1lbnRzW25dKTsKICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBmLkNhLnB1c2goWwogICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgXSkgOiBmLmRlYnVnVHJhY2tpbmcgJiYgZi5DKCdERUJVRzogTm9uIGZ1bmN0aW9uIHR5cGUgcGFzc2VkIHRvIHJlZ2lzdGVyUHJlVHJhY2tDYWxsYmFjaycpOwogICAgICAgICAgICB9LCBmLmhiID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGYudmEoZi5DYSwgZSk7CiAgICAgICAgICAgIH0sIGYuQmEgPSBbXSwgZi5yZWdpc3RlclBvc3RUcmFja0NhbGxiYWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGFyZ3VtZW50c1tuXSk7CiAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gZi5CYS5wdXNoKFsKICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgIF0pIDogZi5kZWJ1Z1RyYWNraW5nICYmIGYuQygnREVCVUc6IE5vbiBmdW5jdGlvbiB0eXBlIHBhc3NlZCB0byByZWdpc3RlclBvc3RUcmFja0NhbGxiYWNrJyk7CiAgICAgICAgICAgIH0sIGYuZ2IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZi52YShmLkJhLCBlKTsKICAgICAgICAgICAgfSwgZi52YSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVtuXVswXSwgciA9IGVbbl1bMV0uc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIudW5zaGlmdCh0KSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hcHBseShudWxsLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmRlYnVnVHJhY2tpbmcgJiYgZi5DKGEubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBmLnRsID0gZi50cmFja0xpbmsgPSBmdW5jdGlvbiAoZSwgdCwgbiwgaSwgcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGYubGlua09iamVjdCA9IGUsIGYubGlua1R5cGUgPSB0LCBmLmxpbmtOYW1lID0gbiwgciAmJiAoZi5ib2R5Q2xpY2tUYXJnZXQgPSBlLCBmLmJvZHlDbGlja0Z1bmN0aW9uID0gciksIGYudHJhY2soaSk7CiAgICAgICAgICAgIH0sIGYudHJhY2tMaWdodCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5saWdodFByb2ZpbGVJRCA9IGUsIGYubGlnaHRTdG9yZUZvclNlY29uZHMgPSB0LCBmLmxpZ2h0SW5jcmVtZW50QnkgPSBuLCBmLnRyYWNrKGkpOwogICAgICAgICAgICB9LCBmLmNsZWFyVmFycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlLCB0OwogICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IGYuZy5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAoJ3Byb3AnID09ICh0ID0gZi5nW2VdKS5zdWJzdHJpbmcoMCwgNCkgfHwgJ2VWYXInID09IHQuc3Vic3RyaW5nKDAsIDQpIHx8ICdoaWVyJyA9PSB0LnN1YnN0cmluZygwLCA0KSB8fCAnbGlzdCcgPT0gdC5zdWJzdHJpbmcoMCwgNCkgfHwgJ2NoYW5uZWwnID09IHQgfHwgJ2V2ZW50cycgPT0gdCB8fCAnZXZlbnRMaXN0JyA9PSB0IHx8ICdwcm9kdWN0cycgPT0gdCB8fCAncHJvZHVjdExpc3QnID09IHQgfHwgJ3B1cmNoYXNlSUQnID09IHQgfHwgJ3RyYW5zYWN0aW9uSUQnID09IHQgfHwgJ3N0YXRlJyA9PSB0IHx8ICd6aXAnID09IHQgfHwgJ2NhbXBhaWduJyA9PSB0KSAmJiAoZlt0XSA9IHZvaWQgMCk7CiAgICAgICAgICAgIH0sIGYudGFnQ29udGFpbmVyTWFya2VyID0gJycsIGYuc2IgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBmLmliKCkgKyAnLycgKyBlICsgJz9BUUI9MSZuZGg9MSZwZj0xJicgKyAoZi56YSgpID8gJ2NhbGxiYWNrPXNfY19pbFsnICsgZi5faW4gKyAnXS5kb1Bvc3RiYWNrcyZldD0xJicgOiAnJykgKyB0ICsgJyZBUUU9MSc7CiAgICAgICAgICAgICAgICBmLmhiKG4pLCBmLmZiKG4pLCBmLlUoKTsKICAgICAgICAgICAgfSwgZi5pYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gZi5qYigpOwogICAgICAgICAgICAgICAgcmV0dXJuICdodHRwJyArIChmLnNzbCA/ICdzJyA6ICcnKSArICc6Ly8nICsgZSArICcvYi9zcy8nICsgZi5hY2NvdW50ICsgJy8nICsgKGYubW9iaWxlID8gJzUuJyA6ICcnKSArIChmLnphKCkgPyAnMTAnIDogJzEnKSArICcvSlMtJyArIGYudmVyc2lvbiArIChmLmFjID8gJ1QnIDogJycpICsgKGYudGFnQ29udGFpbmVyTWFya2VyID8gJy0nICsgZi50YWdDb250YWluZXJNYXJrZXIgOiAnJyk7CiAgICAgICAgICAgIH0sIGYuemEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZi5BdWRpZW5jZU1hbmFnZW1lbnQgJiYgZi5BdWRpZW5jZU1hbmFnZW1lbnQuaXNSZWFkeSgpIHx8IDAgIT0gZi51c2VQb3N0YmFja3M7CiAgICAgICAgICAgIH0sIGYuamIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGYuZGMsIHQgPSBmLnRyYWNraW5nU2VydmVyOwogICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBmLnRyYWNraW5nU2VydmVyU2VjdXJlICYmIGYuc3NsICYmICh0ID0gZi50cmFja2luZ1NlcnZlclNlY3VyZSkgOiAoJ2QxJyA9PSAoZSA9IGUgPyAoJycgKyBlKS50b0xvd2VyQ2FzZSgpIDogJ2QxJykgPyBlID0gJzExMicgOiAnZDInID09IGUgJiYgKGUgPSAnMTIyJyksIHQgPSBmLmxiKCkgKyAnLicgKyBlICsgJy4ybzcubmV0JyksIHQ7CiAgICAgICAgICAgIH0sIGYubGIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9IGYudmlzaXRvck5hbWVzcGFjZTsKICAgICAgICAgICAgICAgIHJldHVybiBlIHx8IChlID0gKGUgPSBmLmFjY291bnQuc3BsaXQoJywnKVswXSkucmVwbGFjZSgvW14wLTlhLXpdL2dpLCAnJykpLCBlOwogICAgICAgICAgICB9LCBmLlphID0gL3soJT8pKC4qPykoJT8pfS8sIGYuZ2MgPSBSZWdFeHAoZi5aYS5zb3VyY2UsICdnJyksIGYuTGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09IHR5cGVvZiBlLmRlc3RzKQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5kZXN0cy5sZW5ndGg7ICsrdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZGVzdHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2Ygbi5jICYmICdhYS4nID09IG4uaWQuc3Vic3RyKDAsIDMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IG4uYy5tYXRjaChmLmdjKSwgciA9IDA7IHIgPCBpLmxlbmd0aDsgKytyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpW3JdLCBzID0gYS5tYXRjaChmLlphKSwgbyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclJyA9PSBzWzFdICYmICd0aW1lem9uZV9vZmZzZXQnID09IHNbMl0gPyBvID0gbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpIDogJyUnID09IHNbMV0gJiYgJ3RpbWVzdGFtcHonID09IHNbMl0gJiYgKG8gPSBmLlBiKCkpLCBuLmMgPSBuLmMucmVwbGFjZShhLCBmLmVzY2FwZShvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBmLlBiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgRGF0ZSgpLCB0ID0gbmV3IERhdGUoNjAwMDAgKiBNYXRoLmFicyhlLmdldFRpbWV6b25lT2Zmc2V0KCkpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmLmsoNCwgZS5nZXRGdWxsWWVhcigpKSArICctJyArIGYuaygyLCBlLmdldE1vbnRoKCkgKyAxKSArICctJyArIGYuaygyLCBlLmdldERhdGUoKSkgKyAnVCcgKyBmLmsoMiwgZS5nZXRIb3VycygpKSArICc6JyArIGYuaygyLCBlLmdldE1pbnV0ZXMoKSkgKyAnOicgKyBmLmsoMiwgZS5nZXRTZWNvbmRzKCkpICsgKDAgPCBlLmdldFRpbWV6b25lT2Zmc2V0KCkgPyAnLScgOiAnKycpICsgZi5rKDIsIHQuZ2V0VVRDSG91cnMoKSkgKyAnOicgKyBmLmsoMiwgdC5nZXRVVENNaW51dGVzKCkpOwogICAgICAgICAgICB9LCBmLmsgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChBcnJheShlICsgMSkuam9pbigwKSArIHQpLnNsaWNlKC1lKTsKICAgICAgICAgICAgfSwgZi5xYSA9IHt9LCBmLmRvUG9zdGJhY2tzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICBpZiAoZi5MYihlKSwgJ29iamVjdCcgPT0gdHlwZW9mIGYuQXVkaWVuY2VNYW5hZ2VtZW50ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGYuQXVkaWVuY2VNYW5hZ2VtZW50LmlzUmVhZHkgJiYgZi5BdWRpZW5jZU1hbmFnZW1lbnQuaXNSZWFkeSgpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGYuQXVkaWVuY2VNYW5hZ2VtZW50LnBhc3NEYXRhKQogICAgICAgICAgICAgICAgICAgICAgICBmLkF1ZGllbmNlTWFuYWdlbWVudC5wYXNzRGF0YShlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZS5kZXN0cykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmRlc3RzLmxlbmd0aDsgKyt0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZGVzdHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2YgbiAmJiAnc3RyaW5nJyA9PSB0eXBlb2Ygbi5jICYmICdzdHJpbmcnID09IHR5cGVvZiBuLmlkICYmICdhYS4nID09IG4uaWQuc3Vic3RyKDAsIDMpICYmIChmLnFhW24uaWRdID0gbmV3IEltYWdlKCksIGYucWFbbi5pZF0uYWx0ID0gJycsIGYucWFbbi5pZF0uc3JjID0gbi5jKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBmLmZiID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGYuaSB8fCBmLlRiKCksIGYuaS5wdXNoKGUpLCBmLmphID0gZi5BKCksIGYuWWEoKTsKICAgICAgICAgICAgfSwgZi5UYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYuaSA9IGYuV2IoKSwgZi5pIHx8IChmLmkgPSBbXSk7CiAgICAgICAgICAgIH0sIGYuV2IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSwgdDsKICAgICAgICAgICAgICAgIGlmIChmLnBhKCkpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAodCA9IHAubG9jYWxTdG9yYWdlLmdldEl0ZW0oZi5uYSgpKSkgJiYgKGUgPSBwLkpTT04ucGFyc2UodCkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGYucGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgZSA9ICEwOwogICAgICAgICAgICAgICAgcmV0dXJuIGYudHJhY2tPZmZsaW5lICYmIGYub2ZmbGluZUZpbGVuYW1lICYmIHAubG9jYWxTdG9yYWdlICYmIHAuSlNPTiB8fCAoZSA9ICExKSwgZTsKICAgICAgICAgICAgfSwgZi5PYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gMDsKICAgICAgICAgICAgICAgIHJldHVybiBmLmkgJiYgKGUgPSBmLmkubGVuZ3RoKSwgZi5sICYmIGUrKywgZTsKICAgICAgICAgICAgfSwgZi5VID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCFmLmwgfHwgKGYudiAmJiBmLnYuY29tcGxldGUgJiYgZi52LkQgJiYgZi52LlIoKSwgIWYubCkpCiAgICAgICAgICAgICAgICAgICAgaWYgKGYuUGEgPSBnLCBmLm9hKQogICAgICAgICAgICAgICAgICAgICAgICBmLmphID4gZi5OICYmIGYuV2EoZi5pKSwgZi5yYSg1MDApOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGYuRmIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgMCA8IGUgPyBmLnJhKGUpIDogKGUgPSBmLk1hKCkpICYmIChmLmwgPSAxLCBmLlhiKGUpLCBmLiRiKGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIGYucmEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZi5QYSB8fCAoZSB8fCAoZSA9IDApLCBmLlBhID0gc2V0VGltZW91dChmLlUsIGUpKTsKICAgICAgICAgICAgfSwgZi5GYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgcmV0dXJuICFmLnRyYWNrT2ZmbGluZSB8fCBmLm9mZmxpbmVUaHJvdHRsZURlbGF5IDw9IDAgPyAwIDogKGUgPSBmLkEoKSAtIGYuVWEsIGYub2ZmbGluZVRocm90dGxlRGVsYXkgPCBlID8gMCA6IGYub2ZmbGluZVRocm90dGxlRGVsYXkgLSBlKTsKICAgICAgICAgICAgfSwgZi5NYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgwIDwgZi5pLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5pLnNoaWZ0KCk7CiAgICAgICAgICAgIH0sIGYuWGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKGYuZGVidWdUcmFja2luZykgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gJ0FwcE1lYXN1cmVtZW50IERlYnVnOiAnICsgZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSBlLnNwbGl0KCcmJyksIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAnXG5cdCcgKyBmLnVuZXNjYXBlKGVbdF0pOwogICAgICAgICAgICAgICAgICAgIGYuQyhuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgZi54YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmLm1hcmtldGluZ0Nsb3VkVmlzaXRvcklEIHx8IGYuYW5hbHl0aWNzVmlzaXRvcklEOwogICAgICAgICAgICB9LCBmLlggPSAhMTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG0gPSBKU09OLnBhcnNlKCd7IngiOiJ5In0nKTsKICAgICAgICAgICAgfSBjYXRjaCAodikgewogICAgICAgICAgICAgICAgbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChtICYmICd5JyA9PSBtLnggPyAoZi5YID0gITAsIGYuVyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICB9KSA6IHAuJCAmJiBwLiQucGFyc2VKU09OID8gKGYuVyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuJC5wYXJzZUpTT04oZSk7CiAgICAgICAgICAgICAgICB9LCBmLlggPSAhMCkgOiBmLlcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9LCBmLiRiID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgaTsKICAgICAgICAgICAgICAgICAgICBpZiAoZi5uYihlKSAmJiAobiA9IDEsIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYudXNlQmVhY29uID0gITEsIG5hdmlnYXRvci5zZW5kQmVhY29uKGUpID8gdC5SKCkgOiB0LmhhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhdCAmJiBmLnhhKCkgJiYgMjA0NyA8IGUubGVuZ3RoICYmIChmLmJiKCkgJiYgKG4gPSAyLCB0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkpLCB0ICYmIChmLkF1ZGllbmNlTWFuYWdlbWVudCAmJiBmLkF1ZGllbmNlTWFuYWdlbWVudC5pc1JlYWR5KCkgfHwgMCAhPSBmLnVzZVBvc3RiYWNrcykgJiYgKGYuWCA/IHQuSGEgPSAhMCA6IHQgPSAwKSksICF0ICYmIGYuZmMgJiYgKGUgPSBlLnN1YnN0cmluZygwLCAyMDQ3KSksICF0ICYmIGYuZC5jcmVhdGVFbGVtZW50ICYmICgwICE9IGYudXNlUG9zdGJhY2tzIHx8IGYuQXVkaWVuY2VNYW5hZ2VtZW50ICYmIGYuQXVkaWVuY2VNYW5hZ2VtZW50LmlzUmVhZHkoKSkgJiYgKHQgPSBmLmQuY3JlYXRlRWxlbWVudCgnU0NSSVBUJykpICYmICdhc3luYycgaW4gdCAmJiAoKGkgPSAoaSA9IGYuZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnSEVBRCcpKSAmJiBpWzBdID8gaVswXSA6IGYuZC5ib2R5KSA/ICh0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JywgdC5zZXRBdHRyaWJ1dGUoJ2FzeW5jJywgJ2FzeW5jJyksIG4gPSAzKSA6IHQgPSAwKSwgdCB8fCAoKHQgPSBuZXcgSW1hZ2UoKSkuYWx0ID0gJycsIHQuYWJvcnQgfHwgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIHAuSW5zdGFsbFRyaWdnZXIgfHwgKHQuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNyYyA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdC5WYSA9IERhdGUubm93KCksIHQuSmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuRCAmJiAoY2xlYXJUaW1lb3V0KHQuRCksIHQuRCA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm9ubG9hZCA9IHQuUiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LlZhICYmIChmLmthID0gRGF0ZS5ub3coKSAtIHQuVmEpLCBmLmdiKGUpLCB0LkphKCksIGYuSmIoKSwgZi5kYSgpLCBmLmwgPSAwLCBmLlUoKSwgdC5IYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuSGEgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmRvUG9zdGJhY2tzKGYuVyh0LnJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQub25hYm9ydCA9IHQub25lcnJvciA9IHQuaGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LkphKCksIChmLnRyYWNrT2ZmbGluZSB8fCBmLm9hKSAmJiBmLmwgJiYgZi5pLnVuc2hpZnQoZi5JYiksIGYubCA9IDAsIGYuamEgPiBmLk4gJiYgZi5XYShmLmkpLCBmLmRhKCksIGYucmEoNTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ID09IHQucmVhZHlTdGF0ZSAmJiAoMjAwID09IHQuc3RhdHVzID8gdC5SKCkgOiB0LmhhKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmLlVhID0gZi5BKCksIDEgPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2VuZChlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgyID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICBpID0gZS5pbmRleE9mKCc/JyksIG4gPSBlLnN1YnN0cmluZygwLCBpKSwgaSA9IChpID0gZS5zdWJzdHJpbmcoaSArIDEpKS5yZXBsYWNlKC8mY2FsbGJhY2s9W2EtekEtWjAtOV8uXFtcXV0rLywgJycpLCB0Lm9wZW4oJ1BPU1QnLCBuLCAhMCksIHQud2l0aENyZWRlbnRpYWxzID0gITAsIHQuc2VuZChpKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0LnNyYyA9IGUsIDMgPT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuU2EpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlQ2hpbGQoZi5TYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGkuZmlyc3RDaGlsZCA/IGkuaW5zZXJ0QmVmb3JlKHQsIGkuZmlyc3RDaGlsZCkgOiBpLmFwcGVuZENoaWxkKHQpLCBmLlNhID0gZi52OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LkQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5EICYmICh0LmNvbXBsZXRlID8gdC5SKCkgOiAoZi50cmFja09mZmxpbmUgJiYgdC5hYm9ydCAmJiB0LmFib3J0KCksIHQuaGEoKSkpOwogICAgICAgICAgICAgICAgICAgIH0sIDUwMDApLCBmLkliID0gZSwgZi52ID0gcFsnc19pXycgKyBmLnJlcGxhY2UoZi5hY2NvdW50LCAnLCcsICdfJyldID0gdCwgKGYudXNlRm9yY2VkTGlua1RyYWNraW5nICYmIGYuSiB8fCBmLmJvZHlDbGlja0Z1bmN0aW9uKSAmJiAoZi5mb3JjZWRMaW5rVHJhY2tpbmdUaW1lb3V0IHx8IChmLmZvcmNlZExpbmtUcmFja2luZ1RpbWVvdXQgPSAyNTApLCBmLmVhID0gc2V0VGltZW91dChmLmRhLCBmLmZvcmNlZExpbmtUcmFja2luZ1RpbWVvdXQpKTsKICAgICAgICAgICAgICAgIH0sIGYubmIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5zZW5kQmVhY29uICYmIChmLnBiKGUpID8gdCA9ICEwIDogZi51c2VCZWFjb24gJiYgKHQgPSAhMCkpLCBmLnliKGUpICYmICh0ID0gITEpLCB0OwogICAgICAgICAgICAgICAgfSwgZi5wYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKGUgJiYgMCA8IGUuaW5kZXhPZigncGU9bG5rX2UnKSk7CiAgICAgICAgICAgICAgICB9LCBmLnliID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQwMDAgPD0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LCBmLmJiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgJiYgJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB9LCBmLkpiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChmLnBhKCkgJiYgIShmLlRhID4gZi5OKSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZi5uYSgpKSwgZi5UYSA9IGYuQSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGYuV2EgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChmLnBhKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZi5ZYSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShmLm5hKCksIHAuSlNPTi5zdHJpbmdpZnkoZSkpLCBmLk4gPSBmLkEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZi5ZYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZi50cmFja09mZmxpbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoKCFmLm9mZmxpbmVMaW1pdCB8fCBmLm9mZmxpbmVMaW1pdCA8PSAwKSAmJiAoZi5vZmZsaW5lTGltaXQgPSAxMCk7IGYuaS5sZW5ndGggPiBmLm9mZmxpbmVMaW1pdDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLk1hKCk7CiAgICAgICAgICAgICAgICB9LCBmLmZvcmNlT2ZmbGluZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmLm9hID0gITA7CiAgICAgICAgICAgICAgICB9LCBmLmZvcmNlT25saW5lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGYub2EgPSAhMTsKICAgICAgICAgICAgICAgIH0sIGYubmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYub2ZmbGluZUZpbGVuYW1lICsgJy0nICsgZi52aXNpdG9yTmFtZXNwYWNlICsgZi5hY2NvdW50OwogICAgICAgICAgICAgICAgfSwgZi5BID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIH0sIGYuUWEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9IChlID0gZS50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCcjJykgJiYgMCAhPSBlLmluZGV4T2YoJ2Fib3V0OicpICYmIDAgIT0gZS5pbmRleE9mKCdvcGVyYTonKSAmJiAwICE9IGUuaW5kZXhPZignamF2YXNjcmlwdDonKTsKICAgICAgICAgICAgICAgIH0sIGYuc2V0VGFnQ29udGFpbmVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgaTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGYuYWMgPSBlLCB0ID0gMDsgdCA8IGYuX2lsLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG4gPSBmLl9pbFt0XSkgJiYgJ3NfbCcgPT0gbi5fYyAmJiBuLnRhZ0NvbnRhaW5lck5hbWUgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuUyhuKSwgbi5sbXEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IG4ubG1xLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gbi5sbXFbdF0sIGYubG9hZE1vZHVsZShpLm4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4ubWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIG4ubWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmW2ldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIChlID0gZltpXSwgaSA9IG4ubWxbaV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlW3RdICYmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBpW3RdIHx8ICgnJyArIGlbdF0pLmluZGV4T2YoJ3NfY19pbCcpIDwgMCkgJiYgKGVbdF0gPSBpW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLm1tcSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbi5tbXEubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBuLm1tcVt0XSwgZltpLm1dICYmICgoZSA9IGZbaS5tXSlbaS5mXSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBlW2kuZl0gJiYgKGkuYSA/IGVbaS5mXS5hcHBseShlLCBpLmEpIDogZVtpLmZdLmFwcGx5KGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi50cSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgbi50cS5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi50cmFjayhuLnRxW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucyA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZi5VdGlsID0gewogICAgICAgICAgICAgICAgICAgIHVybEVuY29kZTogZi5lc2NhcGUsCiAgICAgICAgICAgICAgICAgICAgdXJsRGVjb2RlOiBmLnVuZXNjYXBlLAogICAgICAgICAgICAgICAgICAgIGNvb2tpZVJlYWQ6IGYuY29va2llUmVhZCwKICAgICAgICAgICAgICAgICAgICBjb29raWVXcml0ZTogZi5jb29raWVXcml0ZSwKICAgICAgICAgICAgICAgICAgICBnZXRRdWVyeVBhcmFtOiBmdW5jdGlvbiAoZSwgdCwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgYSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCAodCA9IGYucGFnZVVSTCA/IGYucGFnZVVSTCA6IHAubG9jYXRpb24pLCBuID0gbiB8fCAnJicsIGUgJiYgdCA/IChyID0gKHQgPSAnJyArIHQpLmluZGV4T2YoJz8nKSkgPCAwID8gYSA6ICh0ID0gbiArIHQuc3Vic3RyaW5nKHIgKyAxKSArIG4sIGkgJiYgKDAgPD0gdC5pbmRleE9mKG4gKyBlICsgbikgfHwgMCA8PSB0LmluZGV4T2YobiArIGUgKyAnPScgKyBuKSkgPyB2b2lkIDAgOiAoMCA8PSAociA9IHQuaW5kZXhPZignIycpKSAmJiAodCA9IHQuc3Vic3RyKDAsIHIpICsgbiksIChyID0gdC5pbmRleE9mKG4gKyBlICsgJz0nKSkgPCAwIHx8ICgwIDw9IChyID0gKHQgPSB0LnN1YnN0cmluZyhyICsgbi5sZW5ndGggKyBlLmxlbmd0aCArIDEpKS5pbmRleE9mKG4pKSAmJiAodCA9IHQuc3Vic3RyaW5nKDAsIHIpKSwgMCA8IHQubGVuZ3RoICYmIChhID0gZi51bmVzY2FwZSh0KSkpLCBhKSkgOiBhOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0SWVWZXJzaW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBmLnlhKCkgPyA3IDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBmLkYgPSAnc3VwcGxlbWVudGFsRGF0YUlEIHRpbWVzdGFtcCBkeW5hbWljVmFyaWFibGVQcmVmaXggdmlzaXRvcklEIG1hcmtldGluZ0Nsb3VkVmlzaXRvcklEIGFuYWx5dGljc1Zpc2l0b3JJRCBhdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQgYXV0aFN0YXRlIGZpZCB2bWsgdmlzaXRvck1pZ3JhdGlvbktleSB2aXNpdG9yTWlncmF0aW9uU2VydmVyIHZpc2l0b3JNaWdyYXRpb25TZXJ2ZXJTZWN1cmUgY2hhclNldCB2aXNpdG9yTmFtZXNwYWNlIGNvb2tpZURvbWFpblBlcmlvZHMgZnBDb29raWVEb21haW5QZXJpb2RzIGNvb2tpZUxpZmV0aW1lIHBhZ2VOYW1lIHBhZ2VVUkwgY3VzdG9tZXJQZXJzcGVjdGl2ZSByZWZlcnJlciBjb250ZXh0RGF0YSBjdXJyZW5jeUNvZGUgbGlnaHRQcm9maWxlSUQgbGlnaHRTdG9yZUZvclNlY29uZHMgbGlnaHRJbmNyZW1lbnRCeSByZXRyaWV2ZUxpZ2h0UHJvZmlsZXMgZGVsZXRlTGlnaHRQcm9maWxlcyByZXRyaWV2ZUxpZ2h0RGF0YScuc3BsaXQoJyAnKSwgZi5nID0gZi5GLmNvbmNhdCgncHVyY2hhc2VJRCB2YXJpYWJsZVByb3ZpZGVyIGNoYW5uZWwgc2VydmVyIHBhZ2VUeXBlIHRyYW5zYWN0aW9uSUQgY2FtcGFpZ24gc3RhdGUgemlwIGV2ZW50cyBldmVudHMyIHByb2R1Y3RzIGF1ZGllbmNlTWFuYWdlckJsb2IgdG50Jy5zcGxpdCgnICcpKSwgZi5sYSA9ICd0aW1lc3RhbXAgY2hhclNldCB2aXNpdG9yTmFtZXNwYWNlIGNvb2tpZURvbWFpblBlcmlvZHMgY29va2llTGlmZXRpbWUgY29udGV4dERhdGEgbGlnaHRQcm9maWxlSUQgbGlnaHRTdG9yZUZvclNlY29uZHMgbGlnaHRJbmNyZW1lbnRCeScuc3BsaXQoJyAnKSwgZi5PID0gZi5sYS5zbGljZSgwKSwgZi5HYSA9ICdhY2NvdW50IGFsbEFjY291bnRzIGRlYnVnVHJhY2tpbmcgdmlzaXRvciB2aXNpdG9yT3B0ZWRPdXQgdHJhY2tPZmZsaW5lIG9mZmxpbmVMaW1pdCBvZmZsaW5lVGhyb3R0bGVEZWxheSBvZmZsaW5lRmlsZW5hbWUgdXNlUGx1Z2lucyBkb1BsdWdpbnMgY29uZmlnVVJMIHZpc2l0b3JTYW1wbGluZyB2aXNpdG9yU2FtcGxpbmdHcm91cCBsaW5rT2JqZWN0IGNsaWNrT2JqZWN0IGxpbmtVUkwgbGlua05hbWUgbGlua1R5cGUgdHJhY2tEb3dubG9hZExpbmtzIHRyYWNrRXh0ZXJuYWxMaW5rcyB0cmFja0NsaWNrTWFwIHRyYWNrSW5saW5lU3RhdHMgbGlua0xlYXZlUXVlcnlTdHJpbmcgbGlua1RyYWNrVmFycyBsaW5rVHJhY2tFdmVudHMgbGlua0Rvd25sb2FkRmlsZVR5cGVzIGxpbmtFeHRlcm5hbEZpbHRlcnMgbGlua0ludGVybmFsRmlsdGVycyB1c2VGb3JjZWRMaW5rVHJhY2tpbmcgZm9yY2VkTGlua1RyYWNraW5nVGltZW91dCB3cml0ZVNlY3VyZUNvb2tpZXMgdXNlTGlua1RyYWNrU2Vzc2lvblN0b3JhZ2UgdHJhY2tpbmdTZXJ2ZXIgdHJhY2tpbmdTZXJ2ZXJTZWN1cmUgc3NsIGFib3J0IG1vYmlsZSBkYyBsaWdodFRyYWNrVmFycyBtYXhEZWxheSBleHBlY3RTdXBwbGVtZW50YWxEYXRhIHVzZUJlYWNvbiB1c2VQb3N0YmFja3MgcmVnaXN0ZXJQcmVUcmFja0NhbGxiYWNrIHJlZ2lzdGVyUG9zdFRyYWNrQ2FsbGJhY2sgYm9keUNsaWNrVGFyZ2V0IGJvZHlDbGlja0Z1bmN0aW9uIEF1ZGllbmNlTWFuYWdlbWVudCcuc3BsaXQoJyAnKSwgbCA9IDA7IGwgPD0gMjUwOyBsKyspCiAgICAgICAgICAgICAgICBsIDwgNzYgJiYgKGYuZy5wdXNoKCdwcm9wJyArIGwpLCBmLk8ucHVzaCgncHJvcCcgKyBsKSksIGYuZy5wdXNoKCdlVmFyJyArIGwpLCBmLk8ucHVzaCgnZVZhcicgKyBsKSwgbCA8IDYgJiYgZi5nLnB1c2goJ2hpZXInICsgbCksIGwgPCA0ICYmIGYuZy5wdXNoKCdsaXN0JyArIGwpOwogICAgICAgICAgICBsID0gJ3BlIHBldjEgcGV2MiBwZXYzIGxhdGl0dWRlIGxvbmdpdHVkZSByZXNvbHV0aW9uIGNvbG9yRGVwdGggamF2YXNjcmlwdFZlcnNpb24gamF2YUVuYWJsZWQgY29va2llc0VuYWJsZWQgYnJvd3NlcldpZHRoIGJyb3dzZXJIZWlnaHQgY29ubmVjdGlvblR5cGUgaG9tZXBhZ2UgcGFnZVVSTFJlc3QgbWFya2V0aW5nQ2xvdWRPcmdJRCBtc19hJy5zcGxpdCgnICcpLCBmLmcgPSBmLmcuY29uY2F0KGwpLCBmLkYgPSBmLkYuY29uY2F0KGwpLCBmLnNzbCA9IDAgPD0gcC5sb2NhdGlvbi5wcm90b2NvbC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2h0dHBzJyksIGYuY2hhclNldCA9ICdVVEYtOCcsIGYuY29udGV4dERhdGEgPSB7fSwgZi53cml0ZVNlY3VyZUNvb2tpZXMgPSAhMSwgZi5vZmZsaW5lVGhyb3R0bGVEZWxheSA9IDAsIGYub2ZmbGluZUZpbGVuYW1lID0gJ0FwcE1lYXN1cmVtZW50Lm9mZmxpbmUnLCBmLlAgPSAnc19zcScsIGYuVWEgPSAwLCBmLmphID0gMCwgZi5OID0gMCwgZi5UYSA9IDAsIGYubGlua0Rvd25sb2FkRmlsZVR5cGVzID0gJ2V4ZSx6aXAsd2F2LG1wMyxtb3YsbXBnLGF2aSx3bXYscGRmLGRvYyxkb2N4LHhscyx4bHN4LHBwdCxwcHR4JywgZi53ID0gcCwgZi5kID0gcC5kb2N1bWVudCwgZi5kYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGYuZWEgJiYgKHAuY2xlYXJUaW1lb3V0KGYuZWEpLCBmLmVhID0gZyksIGYuYm9keUNsaWNrVGFyZ2V0ICYmIGYuSiAmJiBmLmJvZHlDbGlja1RhcmdldC5kaXNwYXRjaEV2ZW50KGYuSiksIGYuYm9keUNsaWNrRnVuY3Rpb24gJiYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGYuYm9keUNsaWNrRnVuY3Rpb24gPyBmLmJvZHlDbGlja0Z1bmN0aW9uKCkgOiBmLmJvZHlDbGlja1RhcmdldCAmJiBmLmJvZHlDbGlja1RhcmdldC5ocmVmICYmIChmLmQubG9jYXRpb24gPSBmLmJvZHlDbGlja1RhcmdldC5ocmVmKSksIGYuYm9keUNsaWNrVGFyZ2V0ID0gZi5KID0gZi5ib2R5Q2xpY2tGdW5jdGlvbiA9IDA7CiAgICAgICAgICAgIH0sIGYuWGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBmLmIgPSBmLmQuYm9keSwgZi5iID8gKGYuciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIsIGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZi5kICYmIGYuZC5nZXRFbGVtZW50QnlJZCgnY3BwWFljdG5yJykgfHwgZSAmJiBlWydzX2ZlXycgKyBmLl9pbl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLklhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYudXNlRm9yY2VkTGlua1RyYWNraW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmLnIsICEwKSwgdm9pZCAoZi5JYSA9IGYudXNlRm9yY2VkTGlua1RyYWNraW5nID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmLnIsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnVzZUZvcmNlZExpbmtUcmFja2luZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xpY2tPYmplY3QgPSBlLnNyY0VsZW1lbnQgPyBlLnNyY0VsZW1lbnQgOiBlLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZi5jbGlja09iamVjdCB8fCBmLk0gJiYgZi5NID09IGYuY2xpY2tPYmplY3QgfHwgIShmLmNsaWNrT2JqZWN0LnRhZ05hbWUgfHwgZi5jbGlja09iamVjdC5wYXJlbnRFbGVtZW50IHx8IGYuY2xpY2tPYmplY3QucGFyZW50Tm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbGlja09iamVjdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGYuTSA9IGYuY2xpY2tPYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuaWEgJiYgKGNsZWFyVGltZW91dChmLmlhKSwgZi5pYSA9IDApLCBmLmlhID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLk0gPT0gcyAmJiAoZi5NID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDAwKSwgaSA9IGYuT2EoKSwgZi50cmFjaygpLCBpIDwgZi5PYSgpICYmIGYudXNlRm9yY2VkTGlua1RyYWNraW5nICYmIGUudGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IGUudGFyZ2V0OyByICYmIHIgIT0gZi5iICYmICdBJyAhPSByLnRhZ05hbWUudG9VcHBlckNhc2UoKSAmJiAnQVJFQScgIT0gci50YWdOYW1lLnRvVXBwZXJDYXNlKCk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHIucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgKGEgPSByLmhyZWYsIGYuUWEoYSkgfHwgKGEgPSAwKSwgbiA9IHIudGFyZ2V0LCBlLnRhcmdldC5kaXNwYXRjaEV2ZW50ICYmIGEgJiYgKCFuIHx8ICdfc2VsZicgPT0gbiB8fCAnX3RvcCcgPT0gbiB8fCAnX3BhcmVudCcgPT0gbiB8fCBwLm5hbWUgJiYgbiA9PSBwLm5hbWUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZi5kLmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgcC5Nb3VzZUV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW5pdE1vdXNlRXZlbnQoJ2NsaWNrJywgZS5idWJibGVzLCBlLmNhbmNlbGFibGUsIGUudmlldywgZS5kZXRhaWwsIGUuc2NyZWVuWCwgZS5zY3JlZW5ZLCBlLmNsaWVudFgsIGUuY2xpZW50WSwgZS5jdHJsS2V5LCBlLmFsdEtleSwgZS5zaGlmdEtleSwgZS5tZXRhS2V5LCBlLmJ1dHRvbiwgZS5yZWxhdGVkVGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh0WydzX2ZlXycgKyBmLl9pbl0gPSB0LnNfZmUgPSAxLCBlLnN0b3BQcm9wYWdhdGlvbigpLCBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiAmJiBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCBlLnByZXZlbnREZWZhdWx0KCksIGYuYm9keUNsaWNrVGFyZ2V0ID0gZS50YXJnZXQsIGYuSiA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsaWNrT2JqZWN0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGYuYiAmJiBmLmIuYXR0YWNoRXZlbnQgPyBmLmIuYXR0YWNoRXZlbnQoJ29uY2xpY2snLCBmLnIpIDogZi5iICYmIGYuYi5hZGRFdmVudExpc3RlbmVyICYmIChuYXZpZ2F0b3IgJiYgKDAgPD0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdXZWJLaXQnKSAmJiBmLmQuY3JlYXRlRXZlbnQgfHwgMCA8PSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gvMicpICYmIHAuTW91c2VFdmVudCkgJiYgKGYuSWEgPSAxLCBmLnVzZUZvcmNlZExpbmtUcmFja2luZyA9IDEsIGYuYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGYuciwgITApKSwgZi5iLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZi5yLCAhMSkpKSA6IHNldFRpbWVvdXQoZi5YYSwgMzApOwogICAgICAgICAgICB9LCBmLmZjID0gZi55YSgpLCBmLktiKCksIGYubWMgfHwgKGQgPyBmLnNldEFjY291bnQoZCkgOiBmLkMoJ0Vycm9yLCBtaXNzaW5nIFJlcG9ydCBTdWl0ZSBJRCBpbiBBcHBNZWFzdXJlbWVudCBpbml0aWFsaXphdGlvbicpLCBmLlhhKCksIGYubG9hZE1vZHVsZSgnQWN0aXZpdHlNYXAnKSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uICRfX192YXJfMTQxMWJjZTllMmJjNmI4NShlKSB7CiAgICAgICAgICAgIHZhciB0LCBuLCBpLCByLCBhLCBzID0gd2luZG93LnNfY19pbCwgbyA9IGUuc3BsaXQoJywnKSwgYyA9IDA7CiAgICAgICAgICAgIGlmIChzKQogICAgICAgICAgICAgICAgZm9yIChuID0gMDsgIWMgJiYgbiA8IHMubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgIGlmICgnc19jJyA9PSAodCA9IHNbbl0pLl9jICYmICh0LmFjY291bnQgfHwgdC5vdW4pKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5hY2NvdW50ICYmIHQuYWNjb3VudCA9PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHQuYWNjb3VudCA/IHQuYWNjb3VudCA6IHQub3VuLCBpID0gdC5hbGxBY2NvdW50cyA/IHQuYWxsQWNjb3VudHMgOiBpLnNwbGl0KCcsJyksIHIgPSAwOyByIDwgby5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1tyXSA9PSBpW2FdICYmIChjID0gMSk7CiAgICAgICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYyA/IHQuc2V0QWNjb3VudCAmJiB0LnNldEFjY291bnQoZSkgOiB0ID0gbmV3IEFwcE1lYXN1cmVtZW50KGUpLCB0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiAkX19fdmFyXzM4NTE4OWRjN2U1NThlYjAoKSB7CiAgICAgICAgICAgIHZhciBlLCB0LCBuLCBpID0gd2luZG93LCByID0gaS5zX2dpcTsKICAgICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgci5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAobiA9IHNfZ2koKHQgPSByW2VdKS5vdW4pKS5zZXRBY2NvdW50KHQudW4pLCBuLnNldFRhZ0NvbnRhaW5lcih0LnRhZ0NvbnRhaW5lck5hbWUpOwogICAgICAgICAgICBpLnNfZ2lxID0gMDsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl84YmYxYWI3ZWQyOTdiMmM4KCkgewogICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIHBnTHZsKSB7CiAgICAgICAgICAgICAgICBmZHhfZ2V0TGlua1ZpZXcoKSwgKCd1bmRlZmluZWQnID09IHR5cGVvZiBzLnBhZ2VOYW1lIHx8ICcnID09IHMucGFnZU5hbWUpICYmIChfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpwYWdlIG5hbWUnKSwgMSkgJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6cGFnZSBuYW1lJykgJiYgKHMucGFnZU5hbWUgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpwYWdlIG5hbWUnKSksIHMucGFnZU5hbWUgPSBzLnBhZ2VOYW1lLnRvTG93ZXJDYXNlKCksICd1bmRlZmluZWQnICE9IHR5cGVvZiBzLmVWYXI0MyAmJiAnJyAhPSBzLmVWYXI0MyB8fCAocy5lVmFyNDMgPSAnUDonICsgcy5wYWdlTmFtZSksIHMucHJvcDQzID0gJ0Q9djQzJzsKICAgICAgICAgICAgICAgIHZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnYnJpZ2h0Y292ZS1jb250YWluZXInKTsKICAgICAgICAgICAgICAgIHMuZVZhcjMxID0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gJycsIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICBzLmVWYXIzMSArPSAnfCcgKyBlW25dLmdldEF0dHJpYnV0ZSgnZGF0YS12aWRlby1pZCcpLCB0ID0gJ2V2ZW50MjAyJzsKICAgICAgICAgICAgICAgIHMubGlua1RyYWNrRXZlbnRzID0gcy5ldmVudHMgPSBzLmFwbChzLmV2ZW50cywgdCwgJywnLCAyKTsKICAgICAgICAgICAgICAgIHZhciBpID0gZmR4X2dldENvb2tpZSgneGFjYycpLnRvTG93ZXJDYXNlKCksIHIgPSBmZHhfZ2V0Q29va2llKCdmZHhfbG9jYWxlJykudG9Mb3dlckNhc2UoKS5zcGxpdCgnXycpLCBhID0gZmR4X2dldENvb2tpZSgnZmR4X2dlb19zZWxlY3QnKTsKICAgICAgICAgICAgICAgIGZkeF9nZXRDb29raWUoJ2ZkeF9nZW9faGlkZScpICE9PSByWzFdICYmIGkgIT09IHJbMV0gJiYgYSAhPT0gclsxXSAmJiAocy5saW5rVHJhY2tFdmVudHMgPSBzLmV2ZW50cyA9ICdldmVudDkwNCcpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGZkeF9nZXRDb29raWUoJ2ZkeF9kZWJ1ZycpOwogICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG8uc3BsaXQoJywnKS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAnREJHXycgKyBvLnNwbGl0KCcsJylbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKGMgPSBjLnNwbGl0KCd8Jykuc2xpY2UoMSkuam9pbignfCcpKS5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMjU1LCBjLmxlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHMuZXZlbnRzID0gcy5hcGwocy5ldmVudHMsICdldmVudDEwMCcsICcsJywgMiksIGZkeF9zZXRDb29raWUoJ2ZkeF9kZWJ1ZycsICcnLCAtMSwgJy8nLCAnLmZlZGV4LmNvbScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICBmZHhfZGVidWcoZiwgJ1NDJywgJ2ZkeF9ydW5TQ29kZTpsb2cgZGVidWcgZXJyb3JzJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzLmVWYXI2MCA9IHMuVXRpbC5nZXRRdWVyeVBhcmFtKCdldF9yaWQnKSwgcy5lVmFyNjAgPSBzLmdldFZhbE9uY2Uocy5lVmFyNjAsICdzX2V0cmlkJywgMCk7CiAgICAgICAgICAgICAgICB2YXIgbCA9IHMuY19yKCdzX2V0cmlkJyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nfc19ldHJpZCA9ICcnLCBudWxsICE9IGwgJiYgJycgIT09IGwgPyAocy5nZXRBbmRQZXJzaXN0VmFsdWUobCwgJ3NjX3NfZXRyaWQnLCA5MCksIHdpbmRvdy5zY19zX2V0cmlkID0gbCkgOiB3aW5kb3cuc2Nfc19ldHJpZCA9IHMuY19yKCdzY19zX2V0cmlkJyksIHMuZVZhcjgwID0gcy5VdGlsLmdldFF1ZXJ5UGFyYW0oJ2V0X2NpZCcpLCBzLmVWYXI4MCA9IHMuZ2V0VmFsT25jZShzLmVWYXI4MCwgJ3NfZXRjaWQnLCAwKTsKICAgICAgICAgICAgICAgIHZhciB1ID0gcy5jX3IoJ3NfYWN4cmlkJyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuc2Nfc19hY3hyaWQgPSAnJywgbnVsbCAhPSB1ICYmICcnICE9PSB1ID8gKHMuZ2V0QW5kUGVyc2lzdFZhbHVlKHUsICdzY19zX2FjeHJpZCcsIDkwKSwgd2luZG93LnNjX3NfYWN4cmlkID0gdSkgOiB3aW5kb3cuc2Nfc19hY3hyaWQgPSBzLmNfcignc2Nfc19hY3hyaWQnKTsKICAgICAgICAgICAgICAgIHZhciBkID0gZmR4X2dldENvb2tpZSgnZmNsX3V1aWQnKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5zY19mY2xfdXVpZCA9ICcnOwogICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBkIHx8IG51bGwgPT0gZCkgewogICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuc2NfZmNsX3V1aWQgPSBzLmNfcignc2NfZmNsX3V1aWQnKSwgJycgIT09IHdpbmRvdy5zY19mY2xfdXVpZCkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjX2ZjbF91dWlkLmluZGV4T2YoJ0AnKSA8IDAgJiYgKHMuZVZhcjYgPSB3aW5kb3cuc2NfZmNsX3V1aWQsIHMucHJvcDYgPSAnRD12NicsIHAuZmVkZXhjdXN0aWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcy5lVmFyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhTdGF0ZTogVmlzaXRvci5BdXRoU3RhdGUuTE9HR0VEX09VVAogICAgICAgICAgICAgICAgICAgICAgICB9LCBwLkYzZUR4ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHMuZVZhcjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoU3RhdGU6IFZpc2l0b3IuQXV0aFN0YXRlLkxPR0dFRF9PVVQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjX3NfZXRyaWQgJiYgKHAuZXRfcmlkID0gewogICAgICAgICAgICAgICAgICAgICAgICBpZDogd2luZG93LnNjX3NfZXRyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhTdGF0ZTogVmlzaXRvci5BdXRoU3RhdGUuTE9HR0VEX09VVAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgZC5pbmRleE9mKCdAJykgPCAwICYmIChzLmVWYXI2ID0gZCwgcy5wcm9wNiA9ICdEPXY2Jywgcy5nZXRBbmRQZXJzaXN0VmFsdWUoZCwgJ3NjX2ZjbF91dWlkJywgOTApLCB3aW5kb3cuc2NfZmNsX3V1aWQgPSBkLCBwLmZlZGV4Y3VzdGlkID0gewogICAgICAgICAgICAgICAgICAgICAgICBpZDogcy5lVmFyNiwKICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFN0YXRlOiBWaXNpdG9yLkF1dGhTdGF0ZS5BVVRIRU5USUNBVEVECiAgICAgICAgICAgICAgICAgICAgfSwgcC5GM2VEeCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHMuZVZhcjYsCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhTdGF0ZTogVmlzaXRvci5BdXRoU3RhdGUuQVVUSEVOVElDQVRFRAogICAgICAgICAgICAgICAgICAgIH0pLCB3aW5kb3cuc2Nfc19ldHJpZCAmJiAocC5ldF9yaWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB3aW5kb3cuc2Nfc19ldHJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgYXV0aFN0YXRlOiBWaXNpdG9yLkF1dGhTdGF0ZS5BVVRIRU5USUNBVEVECiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBzLnZpc2l0b3IgfHwgKHMudmlzaXRvciA9IFZpc2l0b3IuZ2V0SW5zdGFuY2UoX3NhdGVsbGl0ZS5nZXRWYXIoJ21jb3JnSUQnKSkpLCBzLnZpc2l0b3Iuc2V0Q3VzdG9tZXJJRHMocCksIHMudmlzaXRvci5fc2V0RmllbGRFeHBpcmUoJ01DQUFNQicsIC0xKSwgcy52aXNpdG9yLmdldEF1ZGllbmNlTWFuYWdlckJsb2IoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICBmZHhfZGVidWcoZiwgJ1NDJywgJ2ZkeF9ydW5TQ29kZTpJRCBzeW5jIGZvciBBQU0gJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gJF9fX3Zhcl85YjJhNGMyZjc2ZTczYTE2KCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZmR4X2luaXRTQ1ZhcnMoKSwgZmR4X2luaXRQbHVnaW5zKCksIGZkeF9ydW5TQ29kZSgpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBmZHhfZGVidWcoZSwgJ1NDJywgJ2ZkeF9pbml0U0NvZGUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgJF9fX3Zhcl82NmJlN2Q0M2IyOGYwMTYyID0gZmR4X2NyZWF0ZUN1c3RvbUV2ZW50IHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFdmVudCA/ICh0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JykpLmluaXRFdmVudChlLCAhMSwgITEpIDogdCA9IGUsIHQ7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgZmR4X2RlYnVnKG4sICdDSU0nLCAnZmR4X2NyZWF0ZUN1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICRfX192YXJfY2VmOWI3YTQ4YjQxMjNkYSA9IGZkeF9kaXNwYXRjaEN1c3RvbUV2ZW50IHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID8gZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChlKSA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV0gPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZV0rKyA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtlXSA9IDA7CiAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgZmR4X2RlYnVnKHQsICdDSU0nLCAnZmR4X2Rpc3BhdGNoQ3VzdG9tRXZlbnQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgJF9fX3Zhcl8wZTljMzljMmE1YmIxYmUzID0gZmR4X2ZpcmVDdXN0b21FdmVudCB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZkeF9jcmVhdGVDdXN0b21FdmVudChlKTsKICAgICAgICAgICAgICAgICAgICBmZHhfZGlzcGF0Y2hDdXN0b21FdmVudCh0KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICBmZHhfZGVidWcobiwgJ0NJTScsICdmZHhfZmlyZUN1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICRfX192YXJfZGJmYTMzNGIzZmE3MjMyNyA9IHsKICAgICAgICAgICAgICAgICdtYWdzLWFkZHJlc3MnOiBbCiAgICAgICAgICAgICAgICAgICAgJ2VWYXIxNTEnLAogICAgICAgICAgICAgICAgICAgICdldmVudDIxMScKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAnbWFncy1wYWNrYWdlJzogWwogICAgICAgICAgICAgICAgICAgICdlVmFyMTUyJywKICAgICAgICAgICAgICAgICAgICAnZXZlbnQyMTInCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgJ21hZ3MtY3VzdG9tJzogWwogICAgICAgICAgICAgICAgICAgICdlVmFyMTU1JywKICAgICAgICAgICAgICAgICAgICAnZXZlbnQyMTQnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgJ21hZ3MtcmF0ZXNkaXNwbGF5JzogWwogICAgICAgICAgICAgICAgICAgICdlVmFyMTUzJywKICAgICAgICAgICAgICAgICAgICAnZXZlbnQyMTYnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgJ21hZ3MtcGF5bWVudCc6IFsKICAgICAgICAgICAgICAgICAgICAnZVZhcjE1NCcsCiAgICAgICAgICAgICAgICAgICAgJ2V2ZW50MjE4JwogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9OwogICAgICAgIGZkeF9jcmVhdGVDdXN0b21FdmVudCA9ICRfX192YXJfNjZiZTdkNDNiMjhmMDE2MjsKICAgICAgICBmZHhfZGlzcGF0Y2hDdXN0b21FdmVudCA9ICRfX192YXJfY2VmOWI3YTQ4YjQxMjNkYTsKICAgICAgICBmZHhfZmlyZUN1c3RvbUV2ZW50ID0gJF9fX3Zhcl8wZTljMzljMmE1YmIxYmUzOwogICAgICAgIE1BR1NFdmFyTWFwcGluZyA9ICRfX192YXJfZGJmYTMzNGIzZmE3MjMyNzsKICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgIHZhciBhLCBzLCBvOwogICAgICAgICAgICAnZnVuY3Rpb24nICE9IHR5cGVvZiB3aW5kb3cuRElMICYmICh3aW5kb3cuRElMID0gZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfZTMzNWUwYzg3ZmE3NWNjOSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkXzEzN2JhZThlNDcxMmVmZTIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZTMzNWUwYzg3ZmE3NWNjOSkKICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzEzN2JhZThlNDcxMmVmZTIpCiAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgfHwgITAgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcgfHwgKFcgPSAhMCwgUC5yZWdpc3RlclJlcXVlc3QoKSwgWSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSwgciwgbSwgYSwgbCwgZywgcywgbywgYywgZCwgcCwgZiwgYiwgdiwgaCwgXywgaywgeSwgdywgeCwgRCwgSSA9IFtdLCBDID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG4gIT09IE9iamVjdChuKSAmJiAobiA9IHt9KSwgbSA9IG4ucGFydG5lciwgYSA9IG4uY29udGFpbmVyTlNJRCwgbCA9IG4ubWFwcGluZ3MsIGcgPSBuLnV1aWRDb29raWUsIHMgPSAhMCA9PT0gbi5lbmFibGVFcnJvclJlcG9ydGluZywgbyA9IG4udmlzaXRvclNlcnZpY2UsIGMgPSBuLmRlY2xhcmVkSWQsIGQgPSAhMCA9PT0gbi5kZWxheUFsbFVudGlsV2luZG93TG9hZCwgcCA9IHQobi5zZWN1cmVEYXRhQ29sbGVjdGlvbiksIGYgPSAnYm9vbGVhbicgPT0gdHlwZW9mIG4uaXNDb29wU2FmZSA/IG4uaXNDb29wU2FmZSA6IG51bGwsIGIgPSB0KG4uZW5hYmxlSHJlZmVyZXJQYXJhbSksIHYgPSB0KG4uZW5hYmxlTG9nZ2luZyksIGggPSB0KG4uZW5hYmxlVXJsRGVzdGluYXRpb25zKSwgXyA9IHQobi5lbmFibGVDb29raWVEZXN0aW5hdGlvbnMpLCBrID0gITAgPT09IG4uZGlzYWJsZURlZmF1bHRSZXF1ZXN0LCB5ID0gbi5hZnRlclJlc3VsdEZvckRlZmF1bHRSZXF1ZXN0LCB3ID0gbi52aXNpdG9yQ29uc3RydWN0b3IsIHggPSAhMCA9PT0gbi5kaXNhYmxlQ09SUywgRCA9ICEwID09PSBuLmlnbm9yZUhhcmREZXBlbmRlbmN5T25WaXNpdG9yQVBJLCBzICYmIERJTC5lcnJvck1vZHVsZS5hY3RpdmF0ZSgpLCBEICYmIEkucHVzaCgnV2FybmluZzogdGhpcyBpbnN0YW5jZSBpcyBjb25maWd1cmVkIHRvIGlnbm9yZSB0aGUgaGFyZCBkZXBlbmRlbmN5IG9uIHRoZSBWaXNpdG9yQVBJIHNlcnZpY2UuIFRoaXMgbWVhbnMgdGhhdCBubyBVUkwgZGVzdGluYXRpb25zIHdpbGwgYmUgZmlyZWQgaWYgdGhlIGluc3RhbmNlIGhhcyBubyBjb25uZWN0aW9uIHRvIFZpc2l0b3JBUEkuIElmIHRoZSBWaXNpdG9yQVBJIHNlcnZpY2UgaXMgbm90IGluc3RhbnRpYXRlZCwgSUQgc3luY3Mgd2lsbCBub3QgYmUgZmlyZWQgZWl0aGVyLicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTyA9ICEwID09PSB3aW5kb3cuX2RpbF91bml0X3Rlc3RzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUgPSBlKSAmJiBJLnB1c2godSArICcnKSwgIW0gfHwgJ3N0cmluZycgIT0gdHlwZW9mIG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdSA9ICdESUwgcGFydG5lciBpcyBpbnZhbGlkIG9yIG5vdCBzcGVjaWZpZWQgaW4gaW5pdENvbmZpZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6ICdkaWwuanMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJTC5lcnJvck1vZHVsZS5oYW5kbGVFcnJvcihTKSwgbmV3IEVycm9yKHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ID0gJ0RJTCBjb250YWluZXJOU0lEIGlzIGludmFsaWQgb3Igbm90IHNwZWNpZmllZCBpbiBpbml0Q29uZmlnLCBzZXR0aW5nIHRvIGRlZmF1bHQgb2YgMCcsICFhICYmICdudW1iZXInICE9IHR5cGVvZiBhIHx8IChhID0gcGFyc2VJbnQoYSwgMTApLCAhaXNOYU4oYSkgJiYgMCA8PSBhICYmICh1ID0gJycpKSwgdSAmJiAoYSA9IDAsIEkucHVzaCh1KSwgdSA9ICcnKSwgKHIgPSBESUwuZ2V0RGlsKG0sIGEpKSBpbnN0YW5jZW9mIERJTCAmJiByLmFwaS5nZXRQYXJ0bmVyKCkgPT09IG0gJiYgci5hcGkuZ2V0Q29udGFpbmVyTlNJRCgpID09PSBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBESUwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBESUwobiwgJ0RJTCB3YXMgbm90IGluc3RhbnRpYXRlZCB3aXRoIHRoZSBcJ25ld1wnIG9wZXJhdG9yLCByZXR1cm5pbmcgYSB2YWxpZCBpbnN0YW5jZSB3aXRoIHBhcnRuZXIgPSAnICsgbSArICcgYW5kIGNvbnRhaW5lck5TSUQgPSAnICsgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERJTC5yZWdpc3RlckRpbCh0aGlzLCBtLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc0NvbnNvbGVMb2dFeGlzdDogd2luZG93LmNvbnNvbGUgPT09IE9iamVjdCh3aW5kb3cuY29uc29sZSkgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygd2luZG93LmNvbnNvbGUubG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lbW86IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5wdXNoKGUpLCB2ICYmIHRoaXMuZG9lc0NvbnNvbGVMb2dFeGlzdCAmJiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKHdpbmRvdy5jb25zb2xlLmxvZywgd2luZG93LmNvbnNvbGUpLmFwcGx5KHdpbmRvdy5jb25zb2xlLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nT25jZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dNZW1vW2VdIHx8ICh0aGlzLmxvZ01lbW9bZV0gPSAhMCwgVC5sb2coZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfSFRUUFM6IHAgfHwgJ2h0dHBzOicgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWF9NT05USFNfSU5fTUlOVVRFUzogMjU5MjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFX1ZFUlNJT046IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmRvY3VtZW50TW9kZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSA3OyA0IDwgZTsgZS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaW5uZXJIVE1MID0gJzwhLS1baWYgSUUgJyArIGUgKyAnXT48c3Bhbj48L3NwYW4+PCFbZW5kaWZdLS0+JywgdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3BhbicpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IG51bGwsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBWLklTX0lFX0xFU1NfVEhBTl8xMCA9ICdudW1iZXInID09IHR5cGVvZiBWLklFX1ZFUlNJT04gJiYgVi5JRV9WRVJTSU9OIDwgMTA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBMID0geyBzdHVmZmVkOiB7fSB9LCBBID0ge30sIFAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyaW5nUXVldWU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJpbmc6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkS2V5czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRhdGE6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dkYXRhOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0Q2FsbGJhY2tGbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUltYWdlUmVxdWVzdDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0UmVxdWVzdEhhc0ZpcmVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydFJlcXVlc3RzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fb2ZfY29yc19yZXNwb25zZXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29mX2NvcnNfZXJyb3JzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNFcnJvclNvdXJjZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vZl9pbWdfcmVzcG9uc2VzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vZl9pbWdfZXJyb3JzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtUGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfbnNpZDogYSArICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX3J0YmQ6ICdqc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9qc29udjogRElMLmpzb25WZXJzaW9uICsgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfZHN0OiAnMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbk1vZFN0YXRzUGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfcnRiZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfZHN0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9jdHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX3JzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kU3RhdHNQYXJhbXM6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX1RPX0NBVENIX0FMTF9SRVFVRVNUU19SRUxFQVNFOiAzMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkQmFjazogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9WaXNpdG9yQVBJOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdG9yQVBJOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVR5cGU6ICdubyBWaXNpdG9yQVBJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPcHRlZE91dDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkbXNQcm9jZXNzaW5nU3RhcnRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkbXNQcm9jZXNzaW5nU3RhcnRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRtc1Byb2Nlc3NpbmdTdGFydGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIgPSBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBlIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGUuZ2V0SW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubm9WaXNpdG9yQVBJID0gITAsIG5ldyBFcnJvcignVmlzaXRvciBkb2VzIG5vdCBleGlzdC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociAhPT0gT2JqZWN0KHIpIHx8ICEodCA9IHIubmFtZXNwYWNlKSB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5yZWxlYXNlVHlwZSA9ICdubyBuYW1lc3BhY2UnLCBuZXcgRXJyb3IoJ0RJTC5jcmVhdGUoKSBuZWVkcyB0aGUgaW5pdENvbmZpZyBwcm9wZXJ0eSBgdmlzaXRvclNlcnZpY2VgOntuYW1lc3BhY2U6XCc8RXhwZXJpZW5jZSBDbG91ZCBPcmcgSUQ+XCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuID0gZS5nZXRJbnN0YW5jZSh0LCB7IGlkU3luY0NvbnRhaW5lcklEOiBhIH0pKSAhPT0gT2JqZWN0KG4pIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIG4uaXNBbGxvd2VkIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIG4uZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygbi5nZXRDdXN0b21lcklEcyB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiBuLmlzT3B0ZWRPdXQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygbi5wdWJsaXNoRGVzdGluYXRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnJlbGVhc2VUeXBlID0gJ2ludmFsaWQgaW5zdGFuY2UnLCBpID0gJ0ludmFsaWQgVmlzaXRvciBpbnN0YW5jZS4nLCBuID09PSBPYmplY3QobikgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygbi5wdWJsaXNoRGVzdGluYXRpb25zICYmIChpICs9ICcgSW4gcGFydGljdWxhciwgdmlzaXRvckluc3RhbmNlLnB1Ymxpc2hEZXN0aW5hdGlvbnMgaXMgbm90IGEgZnVuY3Rpb24uIFRoaXMgaXMgbmVlZGVkIHRvIGZpcmUgVVJMIGRlc3RpbmF0aW9ucyBpbiBESUwgdjguMCsgYW5kIHNob3VsZCBiZSBwcmVzZW50IGluIFZpc2l0b3IgdjMuMy4wKyAuJyksIG5ldyBFcnJvcihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5WaXNpdG9yQVBJID0gZSwgIW4uaXNBbGxvd2VkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbGVhc2VUeXBlID0gJ1Zpc2l0b3JBUEkgaXMgbm90IGFsbG93ZWQgdG8gd3JpdGUgY29va2llcycsIHZvaWQgdGhpcy5yZWxlYXNlUmVxdWVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gbiwgdGhpcy53YWl0Rm9yTWlkVG9SZWxlYXNlUmVxdWVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgaW4gcHJvY2Vzc2luZyBWaXNpdG9yIEFQSSwgd2hpY2ggaXMgYSBoYXJkIGRlcGVuZGVuY3kgZm9yIERJTCB2OC4wKzogJyArIGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlUmVxdWVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdEZvck1pZFRvUmVsZWFzZVJlcXVlc3RzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluc3RhbmNlICYmICh0aGlzLmluc3RhbmNlLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5taWQgPSBlLCB0LnJlbGVhc2VUeXBlID0gJ1Zpc2l0b3JBUEknLCB0LnJlbGVhc2VSZXF1ZXN0cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApLCAoIVUuZXhpc3RzIHx8ICFVLmlzSWFiQ29udGV4dCAmJiBVLmlzQXBwcm92ZWQoKSB8fCBVLmlzSWFiQ29udGV4dCAmJiB6Lmhhc0dvU2lnbmFsKCkpICYmIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWaXNpdG9yQVBJJyAhPT0gdC5yZWxlYXNlVHlwZSAmJiAodC5yZWxlYXNlVHlwZSA9ICd0aW1lb3V0JywgdC5yZWxlYXNlUmVxdWVzdHMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmdldExvYWRUaW1lb3V0KCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVJlcXVlc3RzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxlZEJhY2sgPSAhMCwgUC5yZWdpc3RlclJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlID8gdGhpcy5pbnN0YW5jZS5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TUlEUXVlcnlTdHJpbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gTi5pc1BvcHVsYXRlZFN0cmluZywgdCA9IHRoaXMuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHRoaXMubWlkKSAmJiB0aGlzLm1pZCA9PT0gdCB8fCAodGhpcy5taWQgPSB0KSwgZSh0aGlzLm1pZCkgPyAnZF9taWQ9JyArIHRoaXMubWlkICsgJyYnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1c3RvbWVySURzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZSA/IHRoaXMuaW5zdGFuY2UuZ2V0Q3VzdG9tZXJJRHMoKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1c3RvbWVySURzUXVlcnlTdHJpbmc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPT0gT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBpLCByLCBhID0gJycsIHMgPSBbXSwgbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eSh0KSAmJiAobiA9IGVbb1swXSA9IHRdKSA9PT0gT2JqZWN0KG4pICYmIChvWzFdID0gbi5pZCB8fCAnJywgb1syXSA9IG4uYXV0aFN0YXRlIHx8IDAsIHMucHVzaChvKSwgbyA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSArPSAnJmRfY2lkX2ljPScgKyBGLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChzW2ldLCAnJTAxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SXNPcHRlZE91dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA/IHRoaXMuaW5zdGFuY2UuaXNPcHRlZE91dChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3B0ZWRPdXRDYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy5WaXNpdG9yQVBJLk9wdE91dC5HTE9CQUwsICEwKSA6ICh0aGlzLmlzT3B0ZWRPdXQgPSAhMSwgdGhpcy5pc09wdGVkT3V0Q2FsbGJhY2tDYWxsZWQgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3B0ZWRPdXRDYWxsYmFjazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcHRlZE91dCA9IGUsIHRoaXMuaXNPcHRlZE91dENhbGxiYWNrQ2FsbGVkID0gITAsIFAucmVnaXN0ZXJSZXF1ZXN0KCksIFUuaXNJYWJDb250ZXh0KCkgJiYgei5jaGVja1F1ZXJ5U3RyaW5nT2JqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvYWRUaW1lb3V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuaW5zdGFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBlLmdldExvYWRUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRMb2FkVGltZW91dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUubG9hZFRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxvYWRUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVElNRV9UT19DQVRDSF9BTExfUkVRVUVTVFNfUkVMRUFTRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZElkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZElkQ29tYm9zOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVjbGFyZWRJZDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTi5pc1BvcHVsYXRlZFN0cmluZywgaSA9IGVuY29kZVVSSUNvbXBvbmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSBPYmplY3QoZSkgJiYgbih0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5kcGlkLCBhID0gZS5kcHV1aWQsIHMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKHIpICYmIG4oYSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gaShyKSArICckJyArIGkoYSksICEwID09PSB0aGlzLmRlY2xhcmVkSWRDb21ib3Nbc10gPyAnc2V0RGVjbGFyZWRJZDogY29tYm8gZXhpc3RzIGZvciB0eXBlIFwnJyArIHQgKyAnXCcnIDogKHRoaXMuZGVjbGFyZWRJZENvbWJvc1tzXSA9ICEwLCB0aGlzLmRlY2xhcmVkSWRbdF0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcGlkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHB1dWlkOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdzZXREZWNsYXJlZElkOiBzdWNjZWVkZWQgZm9yIHR5cGUgXCcnICsgdCArICdcJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzZXREZWNsYXJlZElkOiBmYWlsZWQgZm9yIHR5cGUgXCcnICsgdCArICdcJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY2xhcmVkSWRRdWVyeVN0cmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmRlY2xhcmVkSWQucmVxdWVzdCwgdCA9IHRoaXMuZGVjbGFyZWRJZC5pbml0LCBuID0gZW5jb2RlVVJJQ29tcG9uZW50LCBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSA/IGkgPSAnJmRfZHBpZD0nICsgbihlLmRwaWQpICsgJyZkX2RwdXVpZD0nICsgbihlLmRwdXVpZCkgOiBudWxsICE9PSB0ICYmIChpID0gJyZkX2RwaWQ9JyArIG4odC5kcGlkKSArICcmZF9kcHV1aWQ9JyArIG4odC5kcHV1aWQpKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJSZXF1ZXN0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IHRoaXMuZmlyaW5nUXVldWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT09IE9iamVjdChlKSAmJiAobi5wdXNoKGUpLCBlLmlzRGVmYXVsdFJlcXVlc3QgfHwgKGsgPSAhMCkpLCB0aGlzLmZpcmluZyB8fCAhbi5sZW5ndGggfHwgZCAmJiAhRElMLndpbmRvd0xvYWRlZCB8fCAodGhpcy5hZG1zLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZCB8fCB0aGlzLmFkbXMuZ2V0SXNPcHRlZE91dCgpLCB0aGlzLmFkbXMuY2FsbGVkQmFjayAmJiAhdGhpcy5hZG1zLmlzT3B0ZWRPdXQgJiYgdGhpcy5hZG1zLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZCAmJiAoVS5pc0FwcHJvdmVkKCkgfHwgei5oYXNHb1NpZ25hbCgpKSAmJiAodGhpcy5hZG1zLmlzT3B0ZWRPdXRDYWxsYmFja0NhbGxlZCA9ICExLCAodCA9IG4uc2hpZnQoKSkuc3JjID0gdC5zcmMucmVwbGFjZSgvJmRfbnNpZD0vLCAnJicgKyB0aGlzLmFkbXMuZ2V0TUlEUXVlcnlTdHJpbmcoKSArIHouZ2V0UXVlcnlTdHJpbmcoKSArICdkX25zaWQ9JyksIE4uaXNQb3B1bGF0ZWRTdHJpbmcodC5jb3JzUG9zdERhdGEpICYmICh0LmNvcnNQb3N0RGF0YSA9IHQuY29yc1Bvc3REYXRhLnJlcGxhY2UoL15kX25zaWQ9LywgdGhpcy5hZG1zLmdldE1JRFF1ZXJ5U3RyaW5nKCkgKyB6LmdldFF1ZXJ5U3RyaW5nKCkgKyAnZF9uc2lkPScpKSwgcS5maXJlUmVxdWVzdCh0KSwgdGhpcy5maXJzdFJlcXVlc3RIYXNGaXJlZCB8fCAnc2NyaXB0JyAhPT0gdC50YWcgJiYgJ2NvcnMnICE9PSB0LnRhZyB8fCAodGhpcy5maXJzdFJlcXVlc3RIYXNGaXJlZCA9ICEwKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Zpc2l0b3JBUEk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZG1zLnByb2Nlc3ModyB8fCB3aW5kb3cuVmlzaXRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb29wUXVlcnlTdHJpbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBmID8gZSA9ICcmZF9jb29wX3NhZmU9MScgOiAhMSA9PT0gZiAmJiAoZSA9ICcmZF9jb29wX3Vuc2FmZT0xJyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgQy5yZXF1ZXN0Q29udHJvbGxlciA9IFA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFLCBNLCBSID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRpbmdNZXNzYWdlczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzUG9zdGVkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uc1Bvc3RlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbkZvckNvbXBhcmlzb246IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EdXBsaWNhdGVzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uV2FpdGluZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvblByb2Nlc3NlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb246IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRvUHJvY2VzczogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuanNvbkZvckNvbXBhcmlzb24ucHVzaChlKSwgci5qc29uV2FpdGluZy5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgIU4uaXNFbXB0eU9iamVjdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID0gSlNPTi5zdHJpbmdpZnkoZS5kZXN0cyB8fCBbXSksIHRoaXMuanNvbkZvckNvbXBhcmlzb24ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHMsIG8sIGMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwLCBzID0gdGhpcy5qc29uRm9yQ29tcGFyaXNvbi5sZW5ndGg7IGEgPCBzOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvID0gdGhpcy5qc29uRm9yQ29tcGFyaXNvblthXSwgaSA9PT0gSlNPTi5zdHJpbmdpZnkoby5kZXN0cyB8fCBbXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA/IHRoaXMuanNvbkR1cGxpY2F0ZXMucHVzaChlKSA6IG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuanNvbldhaXRpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHRoaXMuanNvbldhaXRpbmcuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcyhsWzBdLCBsWzFdKSwgdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5sZW5ndGggJiYgIXRoaXMuc2VuZGluZ01lc3NhZ2VzICYmIHRoaXMuc2VuZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIsIGEsIHMsIG8gPSBlbmNvZGVVUklDb21wb25lbnQsIGMgPSB0aGlzLmdldFB1Ymxpc2hEZXN0aW5hdGlvbnNWZXJzaW9uKCksIGwgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSAhPT0gYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodCA9IGUuZGVzdHMpICYmIHQgaW5zdGFuY2VvZiBBcnJheSAmJiAobiA9IHQubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHRbaV0sIHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbygnZGVzdHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHIuaWQgfHwgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oci55IHx8ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHIuYyB8fCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpLCB0aGlzLmFkZE1lc3NhZ2UocyksIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiByLmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZVJlZmVycmVyOiB2b2lkIDAgPT09IHIuaHIgfHwgISFyLmhyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuYWRkRGVzdGluYXRpb24oYSksIHZvaWQgMCAhPT0gci5ociAmJiAobCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9PT0gYyAmJiBsICYmIFQubG9nT25jZSgnV2FybmluZzogdmlzaXRvckluc3RhbmNlLnB1Ymxpc2hEZXN0aW5hdGlvbnMgdmVyc2lvbiBpcyBvbGQgKFZpc2l0b3IgdjMuMy4wIHRvIHY0LjAuMCkuIFVSTCBkZXN0aW5hdGlvbnMgd2lsbCBub3QgaGF2ZSB0aGUgb3B0aW9uIG9mIGJlaW5nIGZpcmVkIG9uIHBhZ2UsIG9ubHkgaW4gdGhlIGlmcmFtZS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qc29uUHJvY2Vzc2VkLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZERlc3RpbmF0aW9uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9ucy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZGluZ01lc3NhZ2VzIHx8ICh0aGlzLnNlbmRpbmdNZXNzYWdlcyA9ICEwLCBoICYmIHRoaXMubWVzc2FnZXMubGVuZ3RoICYmIHRoaXMucHVibGlzaERlc3RpbmF0aW9ucygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hEZXN0aW5hdGlvbnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULmxvZygndmlzaXRvci5wdWJsaXNoRGVzdGluYXRpb25zKCkgcmVzdWx0OiAnICsgKGUuZXJyb3IgfHwgZS5tZXNzYWdlKSksIG4uc2VuZGluZ01lc3NhZ2VzID0gITEsIG4ucmVxdWVzdFRvUHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm1lc3NhZ2VzID0gW10sIG4uZGVzdGluYXRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCBpID0gUC5hZG1zLmluc3RhbmNlLCByID0gW10sIGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgPT09IHRoaXMucHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb24gPyAoRi5leHRlbmRBcnJheShyLCB0aGlzLm1lc3NhZ2VzKSwgRi5leHRlbmRBcnJheSh0aGlzLm1lc3NhZ2VzUG9zdGVkLCB0aGlzLm1lc3NhZ2VzKSwgdCgpLCBpLnB1Ymxpc2hEZXN0aW5hdGlvbnMobSwgciwgZSksICdDYWxsZWQgdmlzaXRvci5wdWJsaXNoRGVzdGluYXRpb25zKCkgdmVyc2lvbiAxJykgOiAxIDwgdGhpcy5wdWJsaXNoRGVzdGluYXRpb25zVmVyc2lvbiA/IChGLmV4dGVuZEFycmF5KGEsIHRoaXMuZGVzdGluYXRpb25zKSwgRi5leHRlbmRBcnJheSh0aGlzLmRlc3RpbmF0aW9uc1Bvc3RlZCwgdGhpcy5kZXN0aW5hdGlvbnMpLCB0KCksIGkucHVibGlzaERlc3RpbmF0aW9ucyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkb21haW46IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybERlc3RpbmF0aW9uczogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgJ0NhbGxlZCB2aXNpdG9yLnB1Ymxpc2hEZXN0aW5hdGlvbnMoKSB2ZXJzaW9uID4gMScpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHRoaXMucHVibGlzaERlc3RpbmF0aW9uc1ZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdWJsaXNoRGVzdGluYXRpb25zVmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBQLmFkbXMuaW5zdGFuY2UsIG4gPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHVibGlzaERlc3RpbmF0aW9ucyhudWxsLCBudWxsLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWluIGlzIG5vdCBhIHBvcHVsYXRlZCBzdHJpbmcuJyA9PT0gdCA/IG4gPSAxIDogJ0ludmFsaWQgcGFyYW1ldGVycyBwYXNzZWQuJyA9PT0gdCAmJiAobiA9IDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5wdWJsaXNoRGVzdGluYXRpb25zVmVyc2lvbiA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOLmlzVmFsaWRQZGF0YShlKSAmJiAoQS5zaWRzIGluc3RhbmNlb2YgQXJyYXkgfHwgKEEuc2lkcyA9IFtdKSwgRi5leHRlbmRBcnJheShBLnNpZHMsIGUpKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE4uaXNWYWxpZFBkYXRhKGUpICYmIChBLnBkYXRhIGluc3RhbmNlb2YgQXJyYXkgfHwgKEEucGRhdGEgPSBbXSksIEYuZXh0ZW5kQXJyYXkoQS5wZGF0YSwgZSkpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE4uaXNWYWxpZExvZ2RhdGEoZSkgJiYgKEEubG9nZGF0YSAhPT0gT2JqZWN0KEEubG9nZGF0YSkgJiYgKEEubG9nZGF0YSA9IHt9KSwgRi5leHRlbmRPYmplY3QoQS5sb2dkYXRhLCBlKSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21RdWVyeVBhcmFtczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE4uaXNFbXB0eU9iamVjdChlKSB8fCBGLmV4dGVuZE9iamVjdChBLCBlLCBQLnJlc2VydmVkS2V5cyksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTi5pc0VtcHR5T2JqZWN0KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gKGkgPSB7fSwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkobikgJiYgKGlbdCArIG5dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLmV4dGVuZE9iamVjdChBLCBpLCBQLnJlc2VydmVkS2V5cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZElkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUC5kZWNsYXJlZElkLnNldERlY2xhcmVkSWQoZSwgJ3JlcXVlc3QnKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgKEEuY2FsbGJhY2sgPSBlKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUmVzdWx0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiAoQS5wb3N0Q2FsbGJhY2tGbiA9IGUpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW1hZ2VSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBLnVzZUltYWdlUmVxdWVzdCA9ICEwLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJEYXRhOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBID0ge30sIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBLmlzRGVmYXVsdFJlcXVlc3QgPSAhIWUsIHEuc3VibWl0UmVxdWVzdChBKSwgQSA9IHt9LCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFydG5lcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lck5TSUQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFdmVudExvZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEYuZXh0ZW5kT2JqZWN0KGUsIFAsIHsgcmVnaXN0ZXJSZXF1ZXN0OiAhMCB9KSwgRi5leHRlbmRPYmplY3QodCwgUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRvUHJvY2VzczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWc6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdDogQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUmVxdWVzdEluZm86IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblB1Ymxpc2hpbmdJbmZvOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nOiBJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgdXNlIHRoZSBgaWRTeW5jQnlVUkxgIG1ldGhvZCBvZiB0aGUgRXhwZXJpZW5jZSBDbG91ZCBJRCBTZXJ2aWNlIChWaXNpdG9yKSBpbnN0YW5jZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFtSWRTeW5jOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHVzZSB0aGUgYGlkU3luY0J5RGF0YVNvdXJjZWAgbWV0aG9kIG9mIHRoZSBFeHBlcmllbmNlIENsb3VkIElEIFNlcnZpY2UgKFZpc2l0b3IpIGluc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzRGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE4uaXNFbXB0eU9iamVjdChlKSA/ICdFcnJvcjoganNvbiBpcyBlbXB0eSBvciBub3QgYW4gb2JqZWN0JyA6IChxLmRlZmF1bHRDYWxsYmFjayhlKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQbGF0Zm9ybVBhcmFtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUC5wbGF0Zm9ybVBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEV2ZW50Q2FsbENvbmZpZ1BhcmFtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IFAsIG4gPSB0Lm1vZFN0YXRzUGFyYW1zLCBpID0gdC5wbGF0Zm9ybVBhcmFtczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgaW4gKG4gPSB7fSwgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAhdC5ub25Nb2RTdGF0c1BhcmFtc1tlXSAmJiAobltlLnJlcGxhY2UoL15kXy8sICcnKV0gPSBpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSBmID8gbi5jb29wX3NhZmUgPSAxIDogITEgPT09IGYgJiYgKG4uY29vcF91bnNhZmUgPSAxKSwgdC5tb2RTdGF0c1BhcmFtcyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBc0Nvb3BTYWZlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gITAsIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBc0Nvb3BVbnNhZmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgPSAhMSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEV2ZW50Q2FsbElhYlNpZ25hbHM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAhPT0gT2JqZWN0KGUpID8gJ0Vycm9yOiBjb25maWcgaXMgbm90IGFuIG9iamVjdCcgOiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlLmNhbGxiYWNrID8gJ0Vycm9yOiBjb25maWcuY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24nIDogKHQgPSBwYXJzZUludChlLnRpbWVvdXQsIDEwKSwgaXNOYU4odCkgJiYgKHQgPSBudWxsKSwgdm9pZCB6LmdldFF1ZXJ5U3RyaW5nT2JqZWN0KGUuY2FsbGJhY2ssIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBxID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNNZXRhZGF0YTogKEUgPSAnbm9uZScsICd1bmRlZmluZWQnICE9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAmJiBYTUxIdHRwUmVxdWVzdCA9PT0gT2JqZWN0KFhNTEh0dHBSZXF1ZXN0KSAmJiAnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSAmJiAoRSA9ICdYTUxIdHRwUmVxdWVzdCcpLCB7IGNvcnNUeXBlOiBFIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENPUlNJbnN0YW5jZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbmUnID09PSB0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSA/IG51bGwgOiBuZXcgd2luZG93W3RoaXMuY29yc01ldGFkYXRhLmNvcnNUeXBlXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0UmVxdWVzdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAucmVnaXN0ZXJSZXF1ZXN0KHEuY3JlYXRlUXVldWVkUmVxdWVzdChlKSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUXVldWVkUmVxdWVzdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIsIGEsIHMgPSBlLmNhbGxiYWNrLCBvID0gJ2ltZycsIGMgPSBlLmlzRGVmYXVsdFJlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxldGUgZS5pc0RlZmF1bHRSZXF1ZXN0LCAhTi5pc0VtcHR5T2JqZWN0KGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gKHIgPSBsW2ldKSB8fCAnJyA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSBpbiBlICYmICEociBpbiBlKSAmJiAhKHIgaW4gUC5yZXNlcnZlZEtleXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSAoYSA9IGVbaV0pIHx8ICcnID09PSBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtyXSA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOLmlzVmFsaWRQZGF0YShlLnNpZHMpIHx8IChlLnNpZHMgPSBbXSksIE4uaXNWYWxpZFBkYXRhKGUucGRhdGEpIHx8IChlLnBkYXRhID0gW10pLCBOLmlzVmFsaWRMb2dkYXRhKGUubG9nZGF0YSkgfHwgKGUubG9nZGF0YSA9IHt9KSwgZS5sb2dkYXRhQXJyYXkgPSBGLmNvbnZlcnRPYmplY3RUb0tleVZhbHVlUGFpcnMoZS5sb2dkYXRhLCAnPScsICEwKSwgZS5sb2dkYXRhQXJyYXkucHVzaCgnX3RzPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSksICdmdW5jdGlvbicgIT0gdHlwZW9mIHMgJiYgKHMgPSB0aGlzLmRlZmF1bHRDYWxsYmFjayksIHQgPSB0aGlzLm1ha2VSZXF1ZXN0U3JjRGF0YShlKSwgKG4gPSB0aGlzLmdldENPUlNJbnN0YW5jZSgpKSAmJiAhMCAhPT0gZS51c2VJbWFnZVJlcXVlc3QgJiYgKG8gPSAnY29ycycpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHQuc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc1NyYzogdC5jb3JzU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tGbjogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RDYWxsYmFja0ZuOiBlLnBvc3RDYWxsYmFja0ZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW1hZ2VSZXF1ZXN0OiAhIWUudXNlSW1hZ2VSZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzSW5zdGFuY2U6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzUG9zdERhdGE6IHQuY29yc1Bvc3REYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZhdWx0UmVxdWVzdDogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENhbGxiYWNrOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSwgciwgYSwgcywgbywgYywgbCwgdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF8gJiYgKG4gPSBlLnN0dWZmKSAmJiBuIGluc3RhbmNlb2YgQXJyYXkgJiYgKGkgPSBuLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSAwOyByIDwgaTsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gbltyXSkgJiYgYSA9PT0gT2JqZWN0KGEpICYmIChzID0gYS5jbiwgbyA9IGEuY3YsIHZvaWQgMCAhPT0gKGMgPSBhLnR0bCkgJiYgJycgIT09IGMgfHwgKGMgPSBNYXRoLmZsb29yKEYuZ2V0TWF4Q29va2llRXhwaXJlc0luTWludXRlcygpIC8gNjAgLyAyNCkpLCBsID0gYS5kbW4gfHwgJy4nICsgZG9jdW1lbnQuZG9tYWluLnJlcGxhY2UoL153d3dcLi8sICcnKSwgdSA9IGEudHlwZSwgcyAmJiAobyB8fCAnbnVtYmVyJyA9PSB0eXBlb2YgbykgJiYgKCd2YXInICE9PSB1ICYmIChjID0gcGFyc2VJbnQoYywgMTApKSAmJiAhaXNOYU4oYykgJiYgRi5zZXRDb29raWUocywgbywgMjQgKiBjICogNjAsICcvJywgbCwgITEpLCBMLnN0dWZmZWRbc10gPSBvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkLCBwLCBmID0gZS51dWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmlzUG9wdWxhdGVkU3RyaW5nKGYpICYmIChOLmlzRW1wdHlPYmplY3QoZykgfHwgKCdzdHJpbmcnID09IHR5cGVvZiAoZCA9IGcucGF0aCkgJiYgZC5sZW5ndGggfHwgKGQgPSAnLycpLCBwID0gcGFyc2VJbnQoZy5kYXlzLCAxMCksIGlzTmFOKHApICYmIChwID0gMTAwKSwgRi5zZXRDb29raWUoZy5uYW1lIHx8ICdhYW1fZGlkJywgZiwgMjQgKiBwICogNjAsIGQsIGcuZG9tYWluIHx8ICcuJyArIGRvY3VtZW50LmRvbWFpbi5yZXBsYWNlKC9ed3d3XC4vLCAnJyksICEwID09PSBnLnNlY3VyZSkpKSwgUC5hYm9ydFJlcXVlc3RzIHx8IFIucmVxdWVzdFRvUHJvY2VzcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VSZXF1ZXN0U3JjRGF0YTogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zaWRzID0gTi5yZW1vdmVFbXB0eUFycmF5VmFsdWVzKGEuc2lkcyB8fCBbXSksIGEucGRhdGEgPSBOLnJlbW92ZUVtcHR5QXJyYXlWYWx1ZXMoYS5wZGF0YSB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gUCwgZSA9IHMucGxhdGZvcm1QYXJhbXMsIHQgPSBGLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChhLnNpZHMsICcsJyksIG4gPSBGLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChhLnBkYXRhLCAnLCcpLCBpID0gKGEubG9nZGF0YUFycmF5IHx8IFtdKS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhLmxvZ2RhdGFBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGMgPSBlbmNvZGVVUklDb21wb25lbnQsIGwgPSBWLklTX0hUVFBTID8gJ2h0dHBzOi8vJyA6ICdodHRwOi8vJywgdSA9IHMuZGVjbGFyZWRJZC5nZXREZWNsYXJlZElkUXVlcnlTdHJpbmcoKSwgZCA9IHMuYWRtcy5pbnN0YW5jZSA/IHMuYWRtcy5nZXRDdXN0b21lcklEc1F1ZXJ5U3RyaW5nKHMuYWRtcy5nZXRDdXN0b21lcklEcygpKSA6ICcnLCBwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCBuLCBpLCByID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlIGluIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW4gcy5yZXNlcnZlZEtleXMpICYmIGEuaGFzT3duUHJvcGVydHkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IGFbZV0sIGUgPSBjKGUpLCB0IGluc3RhbmNlb2YgQXJyYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMCwgaSA9IHQubGVuZ3RoOyBuIDwgaTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goZSArICc9JyArIGModFtuXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaChlICsgJz0nICsgYyh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubGVuZ3RoID8gJyYnICsgci5qb2luKCcmJykgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgZiA9ICdkX2RpbF92ZXI9JyArIGMoRElMLnZlcnNpb24pLCBnID0gJ2RfbnNpZD0nICsgZS5kX25zaWQgKyBzLmdldENvb3BRdWVyeVN0cmluZygpICsgdSArIGQgKyAodC5sZW5ndGggPyAnJmRfc2lkPScgKyB0IDogJycpICsgKG4ubGVuZ3RoID8gJyZkX3B4PScgKyBuIDogJycpICsgKGkubGVuZ3RoID8gJyZkX2xkPScgKyBjKGkpIDogJycpLCB2ID0gJyZkX3J0YmQ9JyArIGUuZF9ydGJkICsgJyZkX2pzb252PScgKyBlLmRfanNvbnYgKyAnJmRfZHN0PScgKyBlLmRfZHN0LCBoID0gYiA/ICcmaF9yZWZlcmVyPScgKyBjKGxvY2F0aW9uLmhyZWYpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gKHIgPSBsICsgbSArICcuZGVtZGV4Lm5ldC9ldmVudCcpICsgJz8nICsgZiArICcmJyArIGcgKyB2ICsgcCArIGgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNTcmM6IHIgKyAnPycgKyBmICsgJyZfdHM9JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc1Bvc3REYXRhOiBnICsgdiArIHAgKyBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWNsYXJlZElkQ2FsbDogJycgIT09IHUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVSZXF1ZXN0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2ltZycgPT09IGUudGFnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlSW1hZ2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBQLmRlY2xhcmVkSWQsIG4gPSB0LmRlY2xhcmVkSWQucmVxdWVzdCB8fCB0LmRlY2xhcmVkSWQuaW5pdCB8fCB7fSwgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBpZDogbi5kcGlkIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHV1aWQ6IG4uZHB1dWlkIHx8ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNPUlMoZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVJbWFnZTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIG4sIGkgPSBQOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFib3J0UmVxdWVzdHMgfHwgKGkuZmlyaW5nID0gITAsIGUgPSBuZXcgSW1hZ2UoMCwgMCksIGkuc2VudC5wdXNoKHQpLCBlLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZmlyaW5nID0gITEsIGkuZmlyZWQucHVzaCh0KSwgaS5udW1fb2ZfaW1nX3Jlc3BvbnNlcysrLCBpLnJlZ2lzdGVyUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAnaW1nQWJvcnRPckVycm9ySGFuZGxlciByZWNlaXZlZCB0aGUgZXZlbnQgb2YgdHlwZSAnICsgZS50eXBlLCBULmxvZyh1KSwgaS5hYm9ydFJlcXVlc3RzID0gITAsIGkuZmlyaW5nID0gITEsIGkuZXJyb3JlZC5wdXNoKHQpLCBpLm51bV9vZl9pbWdfZXJyb3JzKyssIGkucmVnaXN0ZXJSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBuKSwgZS5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIG4pLCBlLnNyYyA9IHQuc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVDT1JTOiBmdW5jdGlvbiAoaSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMsIHMgPSBQLCBlID0gdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGUsIHQgPSBpLmNvcnNTcmMsIG4gPSBpLmNvcnNJbnN0YW5jZSwgbyA9IGkuY29yc1Bvc3REYXRhLCBjID0gaS5wb3N0Q2FsbGJhY2tGbiwgbCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5hYm9ydFJlcXVlc3RzICYmICF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZpcmluZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm9wZW4oJ3Bvc3QnLCB0LCAhMCksICdYTUxIdHRwUmVxdWVzdCcgPT09IGUgJiYgKG4ud2l0aENyZWRlbnRpYWxzID0gITAsIG4uc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpLCBuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIDIwMCA9PT0gdGhpcy5zdGF0dXMgJiYgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBKU09OLnBhcnNlKGUpKSAhPT0gT2JqZWN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5oYW5kbGVDT1JTRXJyb3IoaSwgciwgJ1Jlc3BvbnNlIGlzIG5vdCBKU09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaGFuZGxlQ09SU0Vycm9yKGksIHIsICdFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGFzIEpTT04nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLmNhbGxiYWNrRm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5maXJpbmcgPSAhMSwgcy5maXJlZC5wdXNoKGkpLCBzLm51bV9vZl9jb3JzX3Jlc3BvbnNlcysrLCBuKHQsIHIpLCBsICYmIGModCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5tZXNzYWdlID0gJ0RJTCBoYW5kbGVDT1JTUmVzcG9uc2UgY2F1Z2h0IGVycm9yIHdpdGggbWVzc2FnZSAnICsgZS5tZXNzYWdlLCB1ID0gZS5tZXNzYWdlLCBULmxvZyh1KSwgZS5maWxlbmFtZSA9IGUuZmlsZW5hbWUgfHwgJ2RpbC5qcycsIGUucGFydG5lciA9IG0sIERJTC5lcnJvck1vZHVsZS5oYW5kbGVFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKHsgZXJyb3I6IGUubmFtZSArICd8JyArIGUubWVzc2FnZSB9LCByKSwgbCAmJiBjKHsgZXJyb3I6IGUubmFtZSArICd8JyArIGUubWVzc2FnZSB9LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlZ2lzdGVyUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhbmRsZUNPUlNFcnJvcihpLCByLCAnb25lcnJvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub250aW1lb3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhbmRsZUNPUlNFcnJvcihpLCByLCAnb250aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5zZW5kKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ09SU0Vycm9yKGksIHIsICd0cnktY2F0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VudC5wdXNoKGkpLCBzLmRlY2xhcmVkSWQuZGVjbGFyZWRJZC5yZXF1ZXN0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ09SU0Vycm9yOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLm51bV9vZl9jb3JzX2Vycm9ycysrLCBQLmNvcnNFcnJvclNvdXJjZXMucHVzaChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBOID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWRQZGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKGUgaW5zdGFuY2VvZiBBcnJheSAmJiB0aGlzLnJlbW92ZUVtcHR5QXJyYXlWYWx1ZXMoZSkubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmFsaWRMb2dkYXRhOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNFbXB0eU9iamVjdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9PSBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW1wdHlBcnJheVZhbHVlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSAwLCBpID0gZS5sZW5ndGgsIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGk7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gKHQgPSBlW25dKSAmJiAnJyAhPT0gdCAmJiByLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQb3B1bGF0ZWRTdHJpbmc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBGID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRPYmplY3RUb0tleVZhbHVlUGFpcnM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCByLCBhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiAodCA9IHQgfHwgJz0nLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoaSkgJiYgbnVsbCAhPSAociA9IGVbaV0pICYmICcnICE9PSByICYmIGEucHVzaChpICsgdCArIChuID8gZW5jb2RlVVJJQ29tcG9uZW50KHIpIDogcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUFuZEJ1aWxkUmVxdWVzdDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29va2llOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgaSwgciA9IGUgKyAnPScsIGEgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMCwgbiA9IGEubGVuZ3RoOyB0IDwgbjsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBhW3RdOyAnICcgPT09IGkuY2hhckF0KDApOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS5zdWJzdHJpbmcoMSwgaS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGkuaW5kZXhPZihyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGkuc3Vic3RyaW5nKHIubGVuZ3RoLCBpLmxlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29va2llOiBmdW5jdGlvbiAoZSwgdCwgbiwgaSwgciwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuICYmIDEwMDAgKiBuICogNjAsIGRvY3VtZW50LmNvb2tpZSA9IGUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodCkgKyAobiA/ICc7ZXhwaXJlcz0nICsgbmV3IERhdGUocy5nZXRUaW1lKCkgKyBuKS50b1VUQ1N0cmluZygpIDogJycpICsgKGkgPyAnO3BhdGg9JyArIGkgOiAnJykgKyAociA/ICc7ZG9tYWluPScgKyByIDogJycpICsgKGEgPyAnO3NlY3VyZScgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRBcnJheTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSAmJiB0IGluc3RhbmNlb2YgQXJyYXkgJiYgKEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsIHQpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRPYmplY3Q6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPT0gT2JqZWN0KGUpIHx8IHQgIT09IE9iamVjdCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTi5pc0VtcHR5T2JqZWN0KG4pICYmIGkgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtpXSA9IHRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1heENvb2tpZUV4cGlyZXNJbk1pbnV0ZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFYuU0lYX01PTlRIU19JTl9NSU5VVEVTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZU1ldGhvZHNXaXRoRnVuY3Rpb246IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gT2JqZWN0KGUpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KG4pICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGVbbl0gJiYgKGVbbl0gPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBVID0gKE0gPSBDLnJlcXVlc3RDb250cm9sbGVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhbUlzQXBwcm92ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJZkV4aXN0cygpID8gKHRoaXMuZXhpc3RzID0gITAsIHRoaXMuaW5zdGFuY2UgPSB3aW5kb3cuYWRvYmUub3B0SW4sIHRoaXMuaW5zdGFuY2UuZmV0Y2hQZXJtaXNzaW9ucyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSkgOiB0aGlzLmV4aXN0cyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJZkV4aXN0czogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmFkb2JlID09PSBPYmplY3Qod2luZG93LmFkb2JlKSAmJiB3aW5kb3cuYWRvYmUub3B0SW4gPT09IE9iamVjdCh3aW5kb3cuYWRvYmUub3B0SW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hYW1Jc0FwcHJvdmVkID0gdGhpcy5pbnN0YW5jZS5pc0FwcHJvdmVkKFt0aGlzLmluc3RhbmNlLkNhdGVnb3JpZXMuQUFNXSksIE0uYWRtcy53YWl0Rm9yTWlkVG9SZWxlYXNlUmVxdWVzdHMoKSwgTS5hZG1zLmdldElzT3B0ZWRPdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXBwcm92ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzSWFiQ29udGV4dCgpICYmICFNLmFkbXMuaXNPcHRlZE91dCAmJiAoIXRoaXMuZXhpc3RzIHx8IHRoaXMuYWFtSXNBcHByb3ZlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lhYkNvbnRleHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5pc0lhYkNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIEMub3B0SW4gPSBVOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgQiwgSCwgRywgUSwgeiA9IChIID0gKEIgPSBDKS5yZXF1ZXN0Q29udHJvbGxlciwgRyA9IEIub3B0SW4sIFEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZW5kb3JDb25zZW50ZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc0dkcHJBcHBseTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U3RyaW5nOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nT2JqZWN0Q2FsbGJhY2tzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hDb25zZW50RGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzR29TaWduYWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIShHLmlzSWFiQ29udGV4dCgpICYmIHRoaXMuaXNWZW5kb3JDb25zZW50ZWQgJiYgdGhpcy5kb2VzR2RwckFwcGx5ICYmICdzdHJpbmcnID09IHR5cGVvZiB0aGlzLmNvbnNlbnRTdHJpbmcgJiYgdGhpcy5jb25zZW50U3RyaW5nLmxlbmd0aCkgfHwgSC5hZG1zLmlzT3B0ZWRPdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hDb25zZW50RGF0YTogZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgIT0gdHlwZW9mIG4gJiYgKG4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBHLmluc3RhbmNlICYmIEcuaXNJYWJDb250ZXh0KCkgPyAoZSAmJiAodC50aW1lb3V0ID0gZSksIEcuaW5zdGFuY2UuZXhlY3V0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAnaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9PT0gT2JqZWN0KHQpID8gKGkuZG9lc0dkcHJBcHBseSA9ICEhdC5nZHByQXBwbGllcywgaS5jb25zZW50U3RyaW5nID0gdC5jb25zZW50U3RyaW5nIHx8ICcnKSA6IChpLmRvZXNHZHByQXBwbHkgPSAhMSwgaS5jb25zZW50U3RyaW5nID0gJycpLCBpLmlzVmVuZG9yQ29uc2VudGVkID0gRy5pbnN0YW5jZS5pc0FwcHJvdmVkKEcuaW5zdGFuY2UuQ2F0ZWdvcmllcy5BQU0pLCBlID8gbih7fSkgOiBpLmNoZWNrUXVlcnlTdHJpbmdPYmplY3QobiksIEguYWRtcy53YWl0Rm9yTWlkVG9SZWxlYXNlUmVxdWVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogbih7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWVyeVN0cmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRy5pc0lhYkNvbnRleHQoKSA/ICdnZHByPScgKyAodGhpcy5kb2VzR2RwckFwcGx5ID8gMSA6IDApICsgJyZnZHByX2NvbnNlbnQ9JyArIHRoaXMuY29uc2VudFN0cmluZyArICcmJyA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UXVlcnlTdHJpbmdPYmplY3Q6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hDb25zZW50RGF0YShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrUXVlcnlTdHJpbmdPYmplY3Q6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEuaGFzR29TaWduYWwoKSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBlICYmIGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwcjogdGhpcy5kb2VzR2RwckFwcGx5ID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZHByX2NvbnNlbnQ6IHRoaXMuY29uc2VudFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgQy5pYWIgPSB6LCAnZXJyb3InID09PSBtICYmIDAgPT09IGEgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUwud2luZG93TG9hZGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgVyA9ICExLCBZID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrIHx8IFAuZmlyc3RSZXF1ZXN0SGFzRmlyZWQgfHwgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHkgPyBqLmFmdGVyUmVzdWx0KHkpLnN1Ym1pdCghMCkgOiBqLnN1Ym1pdCghMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIERJTC5jb25zdGFudHMuVElNRV9UT19ERUZBVUxUX1JFUVVFU1QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSyA9IGRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InICE9PSBtICYmIChESUwud2luZG93TG9hZGVkID8gaSgpIDogJ2NvbXBsZXRlJyAhPT0gSy5yZWFkeVN0YXRlICYmICdsb2FkZWQnICE9PSBLLnJlYWR5U3RhdGUgPyB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTC53aW5kb3dMb2FkZWQgPSAhMCwgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IChESUwud2luZG93TG9hZGVkID0gITAsIGkoKSkpLCBQLmRlY2xhcmVkSWQuc2V0RGVjbGFyZWRJZChjLCAnaW5pdCcpLCBVLmluaXQoKSwgei5pbml0KCksIFAucHJvY2Vzc1Zpc2l0b3JBUEkoKSwgVi5JU19JRV9MRVNTX1RIQU5fMTAgJiYgRi5yZXBsYWNlTWV0aG9kc1dpdGhGdW5jdGlvbihqLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYXBpID0gaiwgdGhpcy5nZXRTdHVmZmVkVmFyaWFibGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBMLnN0dWZmZWRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCAnbnVtYmVyJyA9PSB0eXBlb2YgdCB8fCAodCA9IEYuZ2V0Q29va2llKGUpKSB8fCAnbnVtYmVyJyA9PSB0eXBlb2YgdCB8fCAodCA9ICcnKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy52YWxpZGF0b3JzID0gTiwgdGhpcy5oZWxwZXJzID0gRiwgdGhpcy5jb25zdGFudHMgPSBWLCB0aGlzLmxvZyA9IEksIHRoaXMucGVuZGluZ1JlcXVlc3QgPSBBLCB0aGlzLnJlcXVlc3RDb250cm9sbGVyID0gUCwgdGhpcy5kZXN0aW5hdGlvblB1Ymxpc2hpbmcgPSBSLCB0aGlzLnJlcXVlc3RQcm9jcyA9IHEsIHRoaXMudW5pdHMgPSBDLCB0aGlzLmluaXRDb25maWcgPSBuLCB0aGlzLmxvZ2dlciA9IFQsIE8gJiYgKHRoaXMudmFyaWFibGVzID0gTCwgdGhpcy5jYWxsV2luZG93TG9hZEZ1bmN0aW9ucyA9IGkpOwogICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZTMzNWUwYzg3ZmE3NWNjOSkKICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF9lMzM1ZTBjODdmYTc1Y2M5KSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMTM3YmFlOGU0NzEyZWZlMikKICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8xMzdiYWU4ZTQ3MTJlZmUyKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIERJTC5leHRlbmRTdGF0aWNQcm9wZXJ0aWVzQW5kTWV0aG9kcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgIGlmIChlID09PSBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkodCkgJiYgKHRoaXNbdF0gPSBlW3RdKTsKICAgICAgICAgICAgfSwgRElMLmV4dGVuZFN0YXRpY1Byb3BlcnRpZXNBbmRNZXRob2RzKHsKICAgICAgICAgICAgICAgIHZlcnNpb246ICc5LjQnLAogICAgICAgICAgICAgICAganNvblZlcnNpb246IDEsCiAgICAgICAgICAgICAgICBjb25zdGFudHM6IHsgVElNRV9UT19ERUZBVUxUX1JFUVVFU1Q6IDUwMCB9LAogICAgICAgICAgICAgICAgdmFyaWFibGVzOiB7IHNjcmlwdE5vZGVMaXN0OiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JykgfSwKICAgICAgICAgICAgICAgIHdpbmRvd0xvYWRlZDogITEsCiAgICAgICAgICAgICAgICBkaWxzOiB7fSwKICAgICAgICAgICAgICAgIGlzQWRkZWRQb3N0V2luZG93TG9hZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy53aW5kb3dMb2FkZWQgPSAnZnVuY3Rpb24nID09IHR5cGVvZiB0ID8gISF0KCkgOiAnYm9vbGVhbicgIT0gdHlwZW9mIHQgfHwgdDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBESUwoZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGluIGF0dGVtcHQgdG8gY3JlYXRlIERJTCBpbnN0YW5jZSB3aXRoIERJTC5jcmVhdGUoKTogJyArIGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHJlZ2lzdGVyRGlsOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gdCArICckJyArIG47CiAgICAgICAgICAgICAgICAgICAgaSBpbiB0aGlzLmRpbHMgfHwgKHRoaXMuZGlsc1tpXSA9IGUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGdldERpbDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgIT0gdHlwZW9mIGUgJiYgKGUgPSAnJyksIChuID0gZSArICckJyArICh0ID0gdCB8fCAwKSkgaW4gdGhpcy5kaWxzID8gdGhpcy5kaWxzW25dIDogbmV3IEVycm9yKCdUaGUgRElMIGluc3RhbmNlIHdpdGggcGFydG5lciA9ICcgKyBlICsgJyBhbmQgY29udGFpbmVyTlNJRCA9ICcgKyB0ICsgJyB3YXMgbm90IGZvdW5kJyk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZGV4R2V0UVNWYXJzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5nZXREaWwodCwgbik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgaW5zdGFuY2VvZiB0aGlzID8gaS5nZXRTdHVmZmVkVmFyaWFibGUoZSkgOiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSksIERJTC5lcnJvck1vZHVsZSA9IChhID0gRElMLmNyZWF0ZSh7CiAgICAgICAgICAgICAgICBwYXJ0bmVyOiAnZXJyb3InLAogICAgICAgICAgICAgICAgY29udGFpbmVyTlNJRDogMCwKICAgICAgICAgICAgICAgIGlnbm9yZUhhcmREZXBlbmRlbmN5T25WaXNpdG9yQVBJOiAhMAogICAgICAgICAgICB9KSwgbyA9ICEocyA9IHsKICAgICAgICAgICAgICAgIGhhcnZlc3RlcmVycm9yOiAxNDEzOCwKICAgICAgICAgICAgICAgIGRlc3RwdWJlcnJvcjogMTQxMzksCiAgICAgICAgICAgICAgICBkcG1lcnJvcjogMTQxNDAsCiAgICAgICAgICAgICAgICBnZW5lcmFsZXJyb3I6IDE0MTM3LAogICAgICAgICAgICAgICAgZXJyb3I6IDE0MTM3LAogICAgICAgICAgICAgICAgbm9lcnJvcnR5cGVkZWZpbmVkOiAxNTAyMSwKICAgICAgICAgICAgICAgIGV2YWxlcnJvcjogMTUwMTYsCiAgICAgICAgICAgICAgICByYW5nZWVycm9yOiAxNTAxNywKICAgICAgICAgICAgICAgIHJlZmVyZW5jZWVycm9yOiAxNTAxOCwKICAgICAgICAgICAgICAgIHR5cGVlcnJvcjogMTUwMTksCiAgICAgICAgICAgICAgICB1cmllcnJvcjogMTUwMjAKICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgIGFjdGl2YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgbyA9ICEwOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghbykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdESUwgZXJyb3IgbW9kdWxlIGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQnOwogICAgICAgICAgICAgICAgICAgIGUgIT09IE9iamVjdChlKSAmJiAoZSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUubmFtZSA/IChlLm5hbWUgKyAnJykudG9Mb3dlckNhc2UoKSA6ICcnLCBuID0gdCBpbiBzID8gc1t0XSA6IHMubm9lcnJvcnR5cGVkZWZpbmVkLCBpID0gW10sIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IGUuZmlsZW5hbWUgPyBlLmZpbGVuYW1lICsgJycgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6IGUucGFydG5lciA/IGUucGFydG5lciArICcnIDogJ25vX3BhcnRuZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogZS5zaXRlID8gZS5zaXRlICsgJycgOiBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlID8gZS5tZXNzYWdlICsgJycgOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnB1c2gobiksIGEuYXBpLnBpeGVscyhpKS5sb2dzKHIpLnVzZUltYWdlUmVxdWVzdCgpLnN1Ym1pdCgpLCAnRElMIGVycm9yIHJlcG9ydCBzZW50JzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBwaXhlbE1hcDogcwogICAgICAgICAgICB9KSwgRElMLnRvb2xzID0ge30sIERJTC5tb2R1bGVzID0geyBoZWxwZXJzOiB7fSB9KTsKICAgICAgICB9KCksIEFwcE1lYXN1cmVtZW50LmdldEluc3RhbmNlID0gc19naSwgd2luZG93LnNfb2JqZWN0SUQgfHwgKHdpbmRvdy5zX29iamVjdElEID0gMCksIHNfcGdpY3EoKSwgZmR4X2luaXRTQ29kZSgpOwogICAgfSgpKQp9"},{"name":"sugarcoat-apstag","aliases":["sugarcoat-apstag"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfYmExYzZiYTU1ZGZlNjZmMSA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBsZXQgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICBjbGFzcyBTdG9yYWdlIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5KGluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0SXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywga2V5KSA/IHRoaXNba2V5XSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0SXRlbShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBTdG9yYWdlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLmxvY2FsU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5zZXNzaW9uU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlzU2VhbGVkID0gdHJ1ZTsKICAgIH0pKCRfX19tb2NrX2JhMWM2YmE1NWRmZTY2ZjEpOwogICAgY29uc3QgJF9fX21vY2tfYzQ2MDdkMTBiMGFjYmY2YiA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19jNDYwN2QxMGIwYWNiZjZiKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIG4ocikgewogICAgICAgICAgICAgICAgaWYgKGVbcl0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbcl0uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciBpID0gZVtyXSA9IHsKICAgICAgICAgICAgICAgICAgICBpOiByLAogICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHRbcl0uY2FsbChpLmV4cG9ydHMsIGksIGkuZXhwb3J0cywgbiksIGkubCA9ICEwLCBpLmV4cG9ydHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbi5tID0gdCwgbi5jID0gZSwgbi5kID0gZnVuY3Rpb24gKHQsIGUsIHIpIHsKICAgICAgICAgICAgICAgIG4ubyh0LCBlKSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogcgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIG4uciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgIH0sIG4udCA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICBpZiAoMSAmIGUgJiYgKHQgPSBuKHQpKSwgOCAmIGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICBpZiAoNCAmIGUgJiYgJ29iamVjdCcgPT0gdHlwZW9mIHQgJiYgdCAmJiB0Ll9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgICBpZiAobi5yKHIpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ2RlZmF1bHQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgICAgICAgICAgIH0pLCAyICYgZSAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgIG4uZChyLCBpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBpKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgfSwgbi5uID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gdCAmJiB0Ll9fZXNNb2R1bGUgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdDsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG4uZChlLCAnYScsIGUpLCBlOwogICAgICAgICAgICB9LCBuLm8gPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBlKTsKICAgICAgICAgICAgfSwgbi5wID0gJycsIG4obi5zID0gMjYpOwogICAgICAgIH0oWwogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiB0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgdCAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHBhcnNlSW50KHQsIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGUgPD0gMCkgJiYgKDEwMCA8PSBlIHx8IDEwMCAqIE1hdGgucmFuZG9tKCkgPD0gZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHBhcnNlSW50KGUsIDEwKSwgciA9IFtdLCBpID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXUodCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihuKSB8fCBuIDwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0XTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gdC5sZW5ndGg7IGkgPCBvOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gbiwgci5wdXNoKHQuc2xpY2UoYywgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChNYXRoLnJvdW5kKDEwMDAwMDAwMDAwMDAgKiBNYXRoLnJhbmRvbSgpKSkuY29uY2F0KERhdGUubm93KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScsIG4gPSBuZXcgQXJyYXkodCksIHIgPSAwOyByIDwgdDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlLmxlbmd0aCldOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmpvaW4oJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnID09PSByKHQpICYmIG51bGwgIT09IHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXldJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModCkgJiYgdm9pZCAwICE9PSB0W2VdICYmICcnICE9PSB0W2VdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzcyZGY3MTM3YTNiMjQyYzUgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNzJkZjcxMzdhM2IyNDJjNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19iYTFjNmJhNTVkZmU2NmYxLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnYW16bl9sc1Rlc3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHQsIHQpLCB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzcyZGY3MTM3YTNiMjQyYzUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF83MmRmNzEzN2EzYjI0MmM1KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSB0LmluZGV4T2YoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUuc3BsaXQoJzsgJykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2V0RGF0ZShlLmdldERhdGUoKSArIHQpLCBlLnRvVVRDU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuaW5uZXJXaWR0aCB8fCB0LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCB0LmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsIG4gPSB0LmlubmVySGVpZ2h0IHx8IHQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fCB0LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGUsICd4JykuY29uY2F0KG4pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd4JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodCkuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdID09PSBkZWNvZGVVUklDb21wb25lbnQoZSkuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geSh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBPYmplY3Qua2V5cyh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV07CiAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG4uZChlLCAnbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2wnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnbScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdqJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZChlLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDApLCBpID0gbigzKSwgbyA9IG4oMiksIGMgPSBuKDUpLCBhID0gbig2KSwgcyA9IE9iamVjdChyLm4pKDEwKSwgdSA9IFtdOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgKG4gfHwgT2JqZWN0KGMuZCkoJ2Vycm9ycycpKSAmJiBjb25zb2xlLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBlbmNvZGVVUklDb21wb25lbnQoT2JqZWN0KGEuZykod2luZG93KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByOiBlbmNvZGVVUklDb21wb25lbnQoT2JqZWN0KGEuaCkod2luZG93KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ2Fwc0xpYnJhcnlFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXQ6IHQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c6IHQubWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5wdXNoKHIpLCBvLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0xPR19FUlJPUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogcgogICAgICAgICAgICAgICAgICAgICAgICB9KSwgISFzICYmIChPYmplY3QoaS5iKShyKSwgITApOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZih0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhKDMgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdKSB8fCBhcmd1bWVudHNbM107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnJy5jb25jYXQodCwgJyB3YXMgb2YgdHlwZSBcJycpLmNvbmNhdChlLCAnXCcgaW5zdGVhZCBvZiBcJycpLmNvbmNhdChuLCAnXCcnKQogICAgICAgICAgICAgICAgICAgIH0sICdUeXBlRXJyb3ItJy5jb25jYXQodCksIHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKHQsIGUsICEwKSwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKHQpIHsKICAgICAgICAgICAgICAgICAgICAoMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdIHx8IE9iamVjdChjLmQpKCdlcnJvcnMnKSkgJiYgY29uc29sZS53YXJuKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgITAgPT09IE9iamVjdChjLmMpKCdleHBvc2VFcnJvcnMnKSAmJiAod2luZG93LmFwc3RhZ0Vycm9ycyA9IHUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciwgaSA9IG4oNCksIG8gPSBuKDApLCBjID0gbig1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmtleXModCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBlICYmIChyID0gci5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbi5wdXNoLmFwcGx5KG4sIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHModCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbCAhPSBhcmd1bWVudHNbZV0gPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAlIDIgPyBhKE9iamVjdChuKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUodCwgZSwgbltlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSkgOiBhKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobiwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBpbiB0ID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IHRbZV0gPSBuLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYodCk7CiAgICAgICAgICAgICAgICAgICAgfSh0KSB8fCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odCk7CiAgICAgICAgICAgICAgICAgICAgfSh0KSB8fCBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSBuICYmIHQuY29uc3RydWN0b3IgJiYgKG4gPSB0LmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbiA/IEFycmF5LmZyb20odCkgOiAnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSA/IGYodCwgZSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gZSB8fCBlID4gdC5sZW5ndGgpICYmIChlID0gdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KGUpOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gdFtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBWFJlcXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF4Vmlld2FiaWxpdHlFbmFibGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZENvbmZpZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkUmVxczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBic1BpeGVsczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU01fSlM6ICcvL2MuYW1hem9uLWFkc3lzdGVtLmNvbS9hYXgyL2NzbS5qcy5neicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NNX1JUQl9DT01NVU5JQ0FUT1JfSlM6ICcvL2MuYW1hem9uLWFkc3lzdGVtLmNvbS9iYW8tY3NtL2Fwcy1jb21tL2Fwc19jc20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0FQUF9IVE1MOiAnLy9jLmFtYXpvbi1hZHN5c3RlbS5jb20vYWF4Mi9kZWJ1Z0FwcC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19BUFBfSFRNTF9WMjogJy8vYy5hbWF6b24tYWRzeXN0ZW0uY29tL2FheDIvZGVidWdfYXBwX3YyLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVElNRU9VVDogMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVEJfUEFUSDogJy9lL2R0YicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9QQVRIX0ZSRVFVRU5DWTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0JJRF9FTkRQT0lOVDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1BBVEhfTEFURU5DWV9TQU1QTEVfUkFURTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVhFTF9QQVRIOiAnL3gvcHgvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVRFTkNZX1NBTVBMSU5HX1JBVEU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09PS0lFX01BVENIX0RFTEFZOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TTE9UU19QRVJfUkVRVUVTVDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRl9ST1VUSU5HX1JBVEU6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTE9UX1JFTkRFUl9TQU1QTElOR19SQVRFOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFQVRVUkVfU0FNUExJTkdfUkFURTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfQ0FMTF9FTkFCTEVEOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJfQ09ORklHX1BBVEg6ICcvY2RuL3Byb2QvY29uZmlnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcEZpcmVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogeyBwdWJJRDogJycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlBZFNlcnZlcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkU2xvdElEczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2FtcGxlUmVuZGVyOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90UmVuZGVyRW5kZWRTZXQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbVNsb3RGZXRjaExvZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1TbG90UmVuZGVyUGl4ZWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXhSZXFPZmZzZXQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtU2xvdEZldGNoTG9nT2Zmc2V0OiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FBWF9CSURfSE9TVDogJ2FheC5hbWF6b24tYWRzeXN0ZW0uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0FBWF9QSVhFTF9IT1NUOiAnYWF4LmFtYXpvbi1hZHN5c3RlbS5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlTdGF0ZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5TG9hZENhbGxMYXRlbmN5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90Qmlkczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SWRNYXA6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYzkxNzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdLZXlzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LCBlID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggPyBhcmd1bWVudHNbMV0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgQUFYUmVxczogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNPUkRfQUFYX1JFUVVFU1QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoZCh0KSwgW2UuZGF0YV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUkVDT1JEX0FBWF9SRVFfUFJPUCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodCA9IHMoe30sIHQpKS5iaWRSZXFJRCA9PT0gZS5iaWRSZXFJRCAmJiAodFtlLmtleV0gPSBlLnZhbHVlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odC5BQVhSZXFzLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWF4Vmlld2FiaWxpdHlFbmFibGVkOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NFVF9WSUVXQUJJTElUWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmlld2FiaWxpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuYWF4Vmlld2FiaWxpdHlFbmFibGVkLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgYmlkQ29uZmlnczogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNPUkRfT1JJR0lOQUxfQklEX0NPTkZJRyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB1KHt9LCBlLmJpZENvbmZpZy5iaWRSZXFJRCwgZS5iaWRDb25maWcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuYmlkQ29uZmlncywgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXM6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBRERfQ0hVTktFRF9SRVFVRVNUUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB1KHt9LCBlLmZpZCwgcyhzKHt9LCB0W2UuZmlkXSksIHt9LCB7IG5ldHdvcmtSZXFzOiBuZXcgQXJyYXkoZS5udW1DaHVua3MpIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdORVdfRkVUQ0hfQklEX1JFUVVFU1QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgdSh7fSwgZS5maWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRvOiBlLnB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2tFeGVjdXRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtSZXFzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JFQ09SRF9DQUxMQkFDSyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB1KHt9LCBlLmZpZCwgcyhzKHt9LCB0W2UuZmlkXSksIHt9LCB7IGhhc0NhbGxiYWNrRXhlY3V0ZWQ6ICEwIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNPUkRfTkVUV09SS19FWENIQU5HRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0W2UuZmlkXS5uZXR3b3JrUmVxczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltlLm5ldHdvcmtJRF0gPSBzKHMoe30sIHJbZS5uZXR3b3JrSURdKSwge30sICh1KG4gPSB7fSwgJycuY29uY2F0KGUuZXhjaGFuZ2VUeXBlLCAnVGltZScpLCBlLnRpbWVzdGFtcCksIHUobiwgJ2luRmxpZ2h0JywgJ3JlcXVlc3QnID09PSBlLmV4Y2hhbmdlVHlwZSksIG4pKSwgcyhzKHt9LCB0KSwge30sIHUoe30sIGUuZmlkLCBzKHMoe30sIHRbZS5maWRdKSwge30sIHsgbmV0d29ya1JlcXM6IHIgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JFQ09SRF9USU1FT1VUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhzKHt9LCB0KSwge30sIHUoe30sIGUuZmlkLCBzKHMoe30sIHRbZS5maWRdKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya1JlcXM6IHRbZS5maWRdLm5ldHdvcmtSZXFzLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5GbGlnaHQgPyBzKHMoe30sIHQpLCB7fSwgeyB0aW1lT3V0OiBlLnRpbWVPdXQgfSkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0LmJpZFJlcXMsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBic1BpeGVsczogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNPUkRfQklEX0lORk9fU0VOVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB1KHt9LCBlLmJpZEluZm8uaWlkLCBlLmJpZEluZm8uc3RhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuYnNQaXhlbHMsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBjZmc6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0VUX0NGRyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIGUuY2ZnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuY2ZnLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgY21wRmlyZWQ6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ01QX0ZJUkVEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuY21wRmlyZWQsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0VUX0NPTkZJRyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgZS5jb25maWcpLCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZHByOiBzKHsgY21wVGltZW91dDogZS5kZWZhdWx0Q21wVGltZW91dCB9LCBlLmNvbmZpZy5nZHByKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxmU2VydmVQdWI6IHZvaWQgMCAhPT0gZS5jb25maWcucHViSUQgJiYgNSA8PSBlLmNvbmZpZy5wdWJJRC5sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuY29uZmlnLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUFkU2VydmVyOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NMT1RfUkVOREVSX0VOREVEX1NFVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB7IHNsb3RSZW5kZXJFbmRlZFNldDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOT19CSURfT05fQURTRVJWRVJfU0xPVFMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgeyBub0JpZFNsb3RJRHM6IHQubm9CaWRTbG90SURzLmNvbmNhdChlLnNsb3RJRHMpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUkVRVUVTVEVEX0JJRF9GT1JfQURTRVJWRVJfU0xPVFMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZFNsb3RJRHM6IHQubm9CaWRTbG90SURzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3Qoby5qKShlLnNsb3RJRHMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0hPVUxEX1NBTVBMRV9TTE9UX1JFTkRFUic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB7IHNob3VsZFNhbXBsZVJlbmRlcjogZS52YWx1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIHt9LCB7IG5vQmlkU2xvdElEczogZCh0Lm5vQmlkU2xvdElEcykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odC5kaXNwbGF5QWRTZXJ2ZXIsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTE9HX0VSUk9SJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10uY29uY2F0KGQodCksIFtzKHt9LCBlLmVycm9yKV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0LmVycm9ycywgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TG9nOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xPR19FVkVOVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChkKHQpLCBbcyh7fSwgZS5ldmVudCldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odC5ldmVudExvZywgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRzOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NIT1VMRF9DSFVOS19SRVFVRVNUUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoeyBjaHVua1JlcXVlc3RzOiAhMCA9PT0gdC5zaG91bGRTYW1wbGVMYXRlbmN5ICYmIGUudmFsdWUgfSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTSE9VTERfQ0ZfUk9VVEUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgeyBzaG91bGRDRlJvdXRlOiBlLnZhbHVlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0hPVUxEX1NBTVBMRV9MQVRFTkNZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhzKHt9LCB0KSwge30sIHsgc2hvdWxkU2FtcGxlTGF0ZW5jeTogZS52YWx1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NIT1VMRF9TQU1QTEVfRkVBVFVSRVMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgeyBzaG91bGRTYW1wbGVGZWF0dXJlczogZS52YWx1ZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NIT1VMRF9VU0VfVEVTVF9CSURfRU5EUE9JTlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgeyBzaG91bGRVc2VUZXN0QmlkRW5kcG9pbnQ6IGUudmFsdWUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0LmV4cGVyaW1lbnRzLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2FtU2xvdEZldGNoTG9nOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xPR19HQU1fRVZFTlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQoZCh0KSwgW3Moe30sIGUuZXZlbnQpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuZ2FtU2xvdEZldGNoTG9nLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2FtU2xvdFJlbmRlclBpeGVsOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VQREFURV9SRU5ERVJfT0ZGU0VUUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIGUub2Zmc2V0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0LmdhbVNsb3RSZW5kZXJQaXhlbCwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RzOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NFVF9IT1NUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhzKHt9LCB0KSwge30sIHUoe30sIGUuaG9zdE5hbWUsIGUuaG9zdFZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0Lmhvc3RzLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlTdGF0ZTogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdSRUNPUkRfSURFTlRJVFlfU1RBVEUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgdSh7fSwgZS52ZW5kb3IsIE9iamVjdChvLm0pKHQsIGUudmVuZG9yKSA/IHRbZS52ZW5kb3JdIDogZS5pZGVudGl0eVN0YXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuaWRlbnRpdHlTdGF0ZSwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlMb2FkQ2FsbExhdGVuY3k6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUkVDT1JEX0xJQlJBUllfTE9BRF9DQUxMX0xBVEVOQ1knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxhdGVuY3k7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQubGlicmFyeUxvYWRDYWxsTGF0ZW5jeSwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIFE6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0VUX1EnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUuUSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuUSwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCaWRzOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0JJRF9TVEFURV9DSEFOR0UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHMoe30sIHQpLCB7fSwgdSh7fSwgZS5zbG90SUQsIHRbZS5zbG90SURdLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fdGFyZ2V0aW5nU2V0SUQgPT09IGUuX3RhcmdldGluZ1NldElEICYmICh0LmJpZFN0YXRlID0gZS5iaWRTdGF0ZSwgZS5iaWRTdGF0ZSA9PT0gaS5iLnJlbmRlcmVkID8gdC50aW1pbmcucmVuZGVyVGltZSA9IGUudHMgOiBlLmJpZFN0YXRlID09PSBpLmIuc2V0ICYmIHQudGltaW5nLnNldEF0VGltZXMucHVzaChlLnRzKSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VQREFURV9CSURfSU5GT19QUk9QJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0W2Uuc2xvdElEXSB8fCB0W2Uuc2xvdElEXS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWF0Y2hlc0JpZENhY2hlSWQoZS5paWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCA8IDEgPyBzKHt9LCB0KSA6IHMocyh7fSwgdCksIHt9LCB1KHt9LCBlLnNsb3RJRCwgdFtlLnNsb3RJRF0ubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hdGNoZXNCaWRDYWNoZUlkKGUuaWlkKSAmJiAodFtlLmtleV0gPSBlLnZhbHVlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVVBEQVRFX1NMT1RfQklEUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIGUuYmlkcy5yZWR1Y2UoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLm0pKGUsIG4uc2xvdElEKSA/IGVbbi5zbG90SURdID0gW10uY29uY2F0KGQoZVtuLnNsb3RJRF0pLCBbbl0pIDogT2JqZWN0KG8ubSkodCwgbi5zbG90SUQpID8gZVtuLnNsb3RJRF0gPSBbXS5jb25jYXQoZCh0W24uc2xvdElEXSksIFtuXSkgOiBlW24uc2xvdElEXSA9IFtuXSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyh7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odC5zbG90QmlkcywgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJZE1hcDogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBRERfU0xPVF9JRCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSB0LmluZGV4T2YoZS5zbG90SUQpID8gW10uY29uY2F0KGQodCksIFtlLnNsb3RJRF0pIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odC5zbG90SWRNYXAsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBzeW5jOTE3OiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NFVF9TWU5DXzkxNyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQuc3luYzkxNywgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZ0tleXM6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVVBEQVRFX1NMT1RfQklEUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocyh7fSwgdCksIGUuYmlkcy5yZWR1Y2UoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLm0pKHQsIG4uc2xvdElEKSA/IGVbbi5zbG90SURdID0gW10uY29uY2F0KGQodFtuLnNsb3RJRF0pLCBkKChuLmJpZENvbmZpZy50YXJnZXRpbmcgPyBuLmJpZENvbmZpZy50YXJnZXRpbmcgOiBpLmcpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSB0W24uc2xvdElEXS5pbmRleE9mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpIDogZVtuLnNsb3RJRF0gPSBuLmJpZENvbmZpZy50YXJnZXRpbmcgPyBuLmJpZENvbmZpZy50YXJnZXRpbmcgOiBpLmcsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KHQudGFyZ2V0aW5nS2V5cywgZSkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGIociwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdChjLmQpKCdyZWR1eCcpICYmIE9iamVjdChvLmkpKCkgJiYgT2JqZWN0KG8ubSkod2luZG93LCAnX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXycpICYmIChsID0gd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX18oYikpLCBsLmRpc3BhdGNoKHsgdHlwZTogJ05PT1AnIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRTsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQ7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig0KSwgaSA9IG4oMiksIG8gPSBuKDUpLCBjID0gbigwKSwgYSA9IG4oMSksIHMgPSBuKDYpLCB1ID0gbigxMSksIGQgPSBuKDEwKSwgZiA9IFtdLCBiID0gITEsIGwgPSBbXTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IEltYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3JjID0gdCwgbC5wdXNoKGUpLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgITAgPT09IE9iamVjdChvLmMpKCdleHBvc2VQaXhlbHMnKSAmJiAod2luZG93LmFwc3RhZ1BpeGVsUXVldWUgPSBmLCB3aW5kb3cuYXBzdGFnUGl4ZWxzU2VudCA9IGwpOwogICAgICAgICAgICAgICAgdmFyIG0sIGcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkU2VydmVyOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgYW1wQWRDb250ZXh0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBBYXhTbG90U2l6ZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRSZW5kZXI6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRSZW5kZXJTdGF0ZTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGJpZFR5cGU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAnYmxvY2tlZEJpZGRlcnMtZmV0Y2hCaWRzJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdibG9ja2VkQmlkZGVycy1pbml0JzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGNjcGE6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBjbXBWYXI6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZVNpemU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBkZWFsczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQmlkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGZpZkZsb3c6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GbG9vcjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGdkcHI6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBpZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGlkUmVtYXA6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJGb290cHJpbnQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICByZXNpemVJZnJhbWU6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hhaW46IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVyR3B0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBzbG90VHlwZTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHRjZlZhcjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZERlYWw6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VTYWZlRnJhbWVzOiBbXQogICAgICAgICAgICAgICAgICAgIH0sIHkgPSBbXSwgaCA9ICExOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTygpIHsKICAgICAgICAgICAgICAgICAgICBoICYmIChjbGVhclRpbWVvdXQobSksIGggPSAhMSksIE9iamVjdChjLmMpKHksIDUpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgXyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ2ZlYXR1cmVVc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTogT2JqZWN0KHMuZykod2luZG93KQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgeSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaigpIHsKICAgICAgICAgICAgICAgICAgICBoIHx8IChoID0gITAsIG0gPSBzZXRUaW1lb3V0KE8sIDIwMDApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWkuYS5nZXRTdGF0ZSgpLmV4cGVyaW1lbnRzLnNob3VsZFNhbXBsZUZlYXR1cmVzICYmICh2b2lkIDAgIT09IGdbdF0gJiYgIU9iamVjdChjLmopKGdbdF0sIGUpICYmIChnW3RdLnB1c2goZSksIHkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBiICYmIGooKSwgITApKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoYS5iKSh0LCAnc2VuZEZlYXR1cmVQaXhlbCcpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaS5hLmdldFN0YXRlKCkubGlicmFyeUxvYWRDYWxsTGF0ZW5jeSwgZSA9IE9iamVjdCh1LmMpKHdpbmRvdywgbmV3IFJlZ0V4cCgnYWF4Mi9hcHN0YWcuanMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlIHx8IDAgIT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0KHUuZSkod2luZG93LCAnbmF2aWdhdGlvblN0YXJ0JyksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlOiAnbGliTGF0ZW5jeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZDogZC5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZnMgPSBPYmplY3QodS5hKShlLCAnZmV0Y2hTdGFydCcpLCByLnJlID0gT2JqZWN0KHUuYSkoZSwgJ3Jlc3BvbnNlRW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBPYmplY3QodS5mKShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBvICYmIChyLmMgPSBvID8gMSA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAhPT0gdCAmJiAoci50Y2MgPSB0KSwgXyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGEuYikodCwgJ3NlbmRJbml0TGF0ZW5jeVBpeGVsJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaS5hLmdldFN0YXRlKCksIGUgPSB0LmNmZy5QSVhFTF9QQVRILCBuID0gdC5ob3N0cy5ERUZBVUxUX0FBWF9QSVhFTF9IT1NULCBjID0gT2JqZWN0KG8uYykoJ3BpeGVsSG9zdCcsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KHIucikuY29uY2F0KGMpLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoYS5iKSh0LCAnYnVpbGRQaXhlbEJhc2VVcmwnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdC5iaWRJZCA/IGUgKz0gJ3AvUEgvJyA6IGUgKz0gJycuY29uY2F0KHQuYmlkSWQsICcvJyksIHAoZSArPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX3RsID0gJ2Fwcy10YWcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuYS5nZXRTdGF0ZSgpLCBuID0gbnVsbCwgbyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5tKShlLCAnY29uZmlnJykgJiYgT2JqZWN0KGMubSkoZS5jb25maWcsICdwdWJJRCcpICYmICcnICE9PSBlLmNvbmZpZy5wdWJJRCAmJiAobiA9IGUuY29uZmlnLmlzU2VsZlNlcnZlUHViLCBvID0gZS5jb25maWcucHViSUQpLCBudWxsICE9PSBuICYmIChuID8gKHQuc3JjID0gci5zLCB0LnB1YmlkID0gbykgOiB0LnNyYyA9IG8pLCB0Lmx2ID0gci5rOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnJlcGxhY2UoL1xcLnsxfS9nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChhLmIpKHQsICdlc2NhcGVKc29uRm9yQWF4JyksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHMpLCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChhLmIpKHQsICdvYmplY3RUb1VybFBhdGgnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LnBheWxvYWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5wdXNoKHQpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoYS5iKSh0LCAnc2VuZFBpeGVsJyksICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8odCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3KHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3KHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IHQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQoKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAhMCwgZi5mb3JFYWNoKHcpLCAwIDwgeS5sZW5ndGggJiYgaigpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGEuYikodCwgJ3NlbmRQaXhlbHMnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhMCA9PT0gT2JqZWN0KG8uYykoJ2V4cG9zZVBpeGVscycpICYmICh3aW5kb3cuYXBzdGFnRmVhdHVyZVBpeGVsUXVldWUgPSB5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfOWZkODYyZjdiOWYwZWQzMiA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkXzA2YWViZGE2YjVjZTcwOTkgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfOWZkODYyZjdiOWYwZWQzMikKICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYzQ2MDdkMTBiMGFjYmY2Yi5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzA2YWViZGE2YjVjZTcwOTkpCiAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2M0NjA3ZDEwYjBhY2JmNmIuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIG4uZChlLCAnZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICd3JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICd2JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2onLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAnbycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdtJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ24nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAnbCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICd1JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAndCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdzJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXzsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAncicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZChlLCAncScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdwJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ3gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUjsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpuYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmlpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5zeicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5wJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5paWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpucCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JfYW16bmJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JfYW16bmlpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JfYW16bnAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAoaSA9IHIgPSByIHx8IHt9KS5uZXcgPSAnTkVXJywgaS5leHBvc2VkID0gJ0VYUE9TRUQnLCBpLnNldCA9ICdTRVQnLCBpLnJlbmRlcmVkID0gJ1JFTkRFUkVEJzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHMsIHUsIGQgPSAnYXBzdGFnRGVidWcnLCBmID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWR1eCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zha2VfYmlkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zb2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uc29sZV92MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGIgPSAnYXBzdGFnRGVidWdIZWlnaHQnLCBsID0gJ2Fwc3RhZ0RFQlVHJywgcCA9ICdhcHN0YWdDZmcnLCBtID0gJ2FwczNQSWRzJywgZyA9IDAsIHkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAocyA9IGEgPSBhIHx8IHt9KS5hbXpuYmlkID0gJ3Rlc3RCaWQnLCBzLmFtem5paWQgPSAndGVzdEltcHJlc3Npb24nLCBzLmFtem5wID0gJ3Rlc3RQJywgcy5jcmlkID0gJ3Rlc3RDcmlkJywgKHUgfHwgKHUgPSB7fSkpLnZpZGVvID0gJ3YnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgTywgaiwgdiwgUyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5wJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgKE8gPSBoID0gaCB8fCB7fSkuX19hcHNpZCA9ICdjaycsIE8uX19hcHNfaWRfcCA9ICdja3AnLCBPLmFwc19leHRfOTE3ID0gJ3N0JywgKHYgPSBqID0gaiB8fCB7fSkubm9SZXF1ZXN0ID0gJzAnLCB2LmJpZEluRmxpZ2h0ID0gJzEnLCB2Lm5vQmlkID0gJzInOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9ICc2MDAnLCBfID0gJzcuNjcuMDAnLCBFID0gJ2h0dHBzOi8vJywgRCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICYmIHZvaWQgMCAhPT0gbmV3IFhNTEh0dHBSZXF1ZXN0KCkud2l0aENyZWRlbnRpYWxzLCBUID0gJ2Fwc3RhZ0xPQURFRCcsIEkgPSAxMywgQSA9IDEwMDAwLCBSID0gL14xW05ZXC1dezN9JC87CiAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF85ZmQ4NjJmN2I5ZjBlZDMyKQogICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzlmZDg2MmY3YjlmMGVkMzIpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wNmFlYmRhNmI1Y2U3MDk5KQogICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzA2YWViZGE2YjVjZTcwOTkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigyKSwgaSA9IG4oMCksIG8gPSBuKDQpLCBjID0gbig4KSwgYSA9IG4oMyksIHMgPSBuKDEpLCB1ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnZ2V0TG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2dldFN0YXRlJwogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKE9iamVjdChpLmopKHUsIHQpICYmIChPYmplY3Qocy5iKShuZXcgRXJyb3IoJ0RlYnVnIGNhbGwgbWFkZTogJy5jb25jYXQodCkpLCAnZGVidWdQdWJsaWNBcGktY2FsbC0nLmNvbmNhdCh0KSksIHUgPSB1LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICE9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dldExvZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hLmdldFN0YXRlKCkuZXZlbnRMb2c7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2dldFN0YXRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmEuZ2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5hYmxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFKCdmYWtlX2JpZHMnLCAhMCksICdERUJVRyBNT0RFIEVOQUJMRUQnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaXNhYmxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFKCdmYWtlX2JpZHMnLCAhMSksICdERUJVRyBNT0RFIERJU0FCTEVEJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5hYmxlQ29uc29sZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyghMSwgJ2NvbW1hbmQnKSwgJ0RlYnVnIGNvbnNvbGUgZW5hYmxlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuYWJsZUNvbnNvbGVWMic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyghMCwgJ2NvbW1hbmQnKSwgJ0RlYnVnIGNvbnNvbGUgdjIgZW5hYmxlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2FibGVDb25zb2xlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSgnY29uc29sZScsICExKSwgRSgnY29uc29sZV92MicsICExKSwgbnVsbCAhPT0gZiAmJiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpLCBtID0gITEsIE9iamVjdChpLmkpKCkgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG8uZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKSh0LCAnZGlzYWJsZURlYnVnQ29uc29sZScsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksICdEZWJ1ZyBjb25zb2xlIGRpc2FibGVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2V0RGVidWcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSwgbikgPyAnU2V0IGRlYnVnIG1vZGUgXCcnLmNvbmNhdChlLCAnXCcgdG8gXCcnKS5jb25jYXQobiwgJ1wnJykgOiAnRmFpbGVkIHRvIHNldCBkZWJ1ZyBtb2RlIFwnJy5jb25jYXQoZSwgJ1wnIHRvIFwnJykuY29uY2F0KG4sICdcJycpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmtub3duIGRlYnVnIGFyZ3VtZW50JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKGUsICdkZWJ1Z1B1YmxpY0FwaScsICEwKSwgJ2Vycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiwgYiwgbCwgcCwgbSA9ICExOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdICYmIGFyZ3VtZW50c1swXSwgZSA9IDEgPCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzFdIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFKHQgPyAnY29uc29sZV92MicgOiAnY29uc29sZScsICEwKSwgbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQgPyByLmEuZ2V0U3RhdGUoKS5jZmcuREVCVUdfQVBQX0hUTUxfVjIgOiByLmEuZ2V0U3RhdGUoKS5jZmcuREVCVUdfQVBQX0hUTUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKG5ldyBFcnJvcignRXJyb3IgTG9hZGluZyBEZWJ1ZyBDb25zb2xlJyksICdlbmFibGVEZWJ1Z0NvbnNvbGUtJy5jb25jYXQodCA/ICd2MicgOiAndjEnLCAnLW9uZXJyb3InKSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5kKShuKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ2RlYnVnTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IHQgPyAyIDogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGkubSkoci5hLmdldFN0YXRlKCkuY29uZmlnLCAncHViSUQnKSAmJiAobi5zcmMgPSByLmEuZ2V0U3RhdGUoKS5jb25maWcucHViSUQpLCBudWxsICE9PSBlICYmIChuLm1ldGhvZCA9IGUpLCBPYmplY3QoYS5iKShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKShuLCAnZW5hYmxlRGVidWdDb25zb2xlLXNldFRpbWVvdXQnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMDApOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMuYikobiwgJ2VuYWJsZURlYnVnQ29uc29sZScsICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwgbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgXygnY29uc29sZV92MicpICYmIChuID0gMzMwKSwgT2JqZWN0KGkuaSkoKSAmJiBudWxsICE9PSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oby5kKSAmJiAobiA9IHBhcnNlSW50KHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShvLmQpLCAxMCkpLCAoaXNOYU4obikgfHwgbiA+IHdpbmRvdy5pbm5lckhlaWdodCkgJiYgKG4gPSAyMDApLCBmLnN0eWxlLmJhY2tncm91bmQgPSAnI2VhZWRlZCcsIGYuc3R5bGUuekluZGV4ID0gJzIxNDc0ODM2NDcnLCBmLnN0eWxlLmJvdHRvbSA9ICcwJywgZi5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCAhaW1wb3J0YW50JywgZi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrICFpbXBvcnRhbnQnLCBmLnN0eWxlLmxlZnQgPSAnMCcsIGYuc3R5bGUucmlnaHQgPSAnMCcsIGYuc3R5bGUuaGVpZ2h0ID0gJycuY29uY2F0KG4sICdweCcpLCBiLnN0eWxlLmN1cnNvciA9ICdyb3ctcmVzaXplJywgYi5zdHlsZS5oZWlnaHQgPSAnMnB4JywgYi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZScsIGIuc3R5bGUudG9wID0gJzAnLCBiLnN0eWxlLmxlZnQgPSAnMCcsIGIuc3R5bGUucmlnaHQgPSAnMCcsIGIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ1JHQkEoMCwwLDAsMCknLCBmLmFwcGVuZENoaWxkKGIpLCBsLmZyYW1lQm9yZGVyID0gJzAnLCBsLm1hcmdpbkhlaWdodCA9ICcwJywgbC5tYXJnaW5XaWR0aCA9ICcwJywgbC5zY3JvbGxpbmcgPSAnbm8nLCBsLmlkID0gJ2Fwc3RhZy1kZWJ1Zy1pZnJhbWUnLCBsLnNyYyA9ICdhYm91dDpibGFuaycsIGwuc3R5bGUuZGlzcGxheSA9ICdibG9jaycsIGwuc3R5bGUud2lkdGggPSAnMTAwJScsIGwuc3R5bGUuaGVpZ2h0ID0gJycuY29uY2F0KG4sICdweCcpLCBmLmFwcGVuZENoaWxkKGwpLCBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpLCBudWxsICE9PSBsLmNvbnRlbnREb2N1bWVudCAmJiAobC5jb250ZW50RG9jdW1lbnQub3BlbigpLCBsLmNvbnRlbnREb2N1bWVudC53cml0ZShlKSwgbC5jb250ZW50RG9jdW1lbnQuY2xvc2UoKSksIGIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaik7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKSh0LCAncmVuZGVyRGVidWdDb25zb2xlJywgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gd2luZG93LmlubmVySGVpZ2h0IC0gdC5jbGllbnRZOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA8IDIwMCAmJiAoZSA9IDIwMCksIGYuc3R5bGUuaGVpZ2h0ID0gJycuY29uY2F0KGUsICdweCcpLCBsLnN0eWxlLmhlaWdodCA9ICcnLmNvbmNhdChlLCAncHgnKSwgZTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAncmVzaXplRGVidWdDb25zb2xlJywgITApLCAyMDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc3RvcFByb3BhZ2F0aW9uICYmIHQuc3RvcFByb3BhZ2F0aW9uKCksIHQucHJldmVudERlZmF1bHQgJiYgdC5wcmV2ZW50RGVmYXVsdCgpLCB0LmNhbmNlbEJ1YmJsZSA9ICEwLCB0LnJldHVyblZhbHVlID0gITE7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuYikodCwgJ3ByZXZlbnRFdmVudCcsICEwKSwgITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaigpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHAgJiYgKChwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJywgcC5zdHlsZS5sZWZ0ID0gJzAnLCBwLnN0eWxlLnJpZ2h0ID0gJzAnLCBwLnN0eWxlLnRvcCA9ICcwJywgcC5zdHlsZS5ib3R0b20gPSAnMCcsIHAuc3R5bGUuekluZGV4ID0gJzk5OTk5OTk5OTknKSwgZi5hcHBlbmRDaGlsZChwKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBTKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHYpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMuYikodCwgJ3Jlc2l6ZUJhck1vdXNlRG93bkxpc3RlbmVyJywgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoKHQpLCBPKHQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKHQsICdyZXNpemVCYXJNb3VzZU1vdmVMaXN0ZW5lcicsICEwKSwgITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcCAmJiBmLnJlbW92ZUNoaWxkKHApLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdiksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChpLmkpKCkgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG8uZCwgJycuY29uY2F0KGUpKSwgTyh0KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAncmVzaXplQmFyTW91c2VVcExpc3RlbmVyJywgITApLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfMGRmYzVmYTMwMjYzNzI1MiA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wZGZjNWZhMzAyNjM3MjUyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrX2JhMWM2YmE1NWRmZTY2ZjEubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KGkuaSkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG8uZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gdCB8fCAnZmFsc2UnID09PSB0ID8gdCA9ICdbXScgOiAndHJ1ZScgPT09IHQgJiYgKHQgPSAnWyJmYWtlX2JpZHMiXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEpTT04ucGFyc2UodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGkuaykoZSkgfHwgKGUgPSBbXSksIGUuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5qKShvLnYsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAnZ2V0Q3VycmVudERlYnVnQXJyYXknKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wZGZjNWZhMzAyNjM3MjUyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfMGRmYzVmYTMwMjYzNzI1MikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8odCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5qKSh3KCksIHQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKHQsICdpc0RlYnVnRW5hYmxlZCcpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChpLmkpKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gby52LmluZGV4T2YodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAtMSA9PT0gbi5pbmRleE9mKHQpID8gbi5wdXNoKHQpIDogZSB8fCAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAwID09PSBuLmxlbmd0aCA/IHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShvLmYpIDogd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG8uZiwgSlNPTi5zdHJpbmdpZnkobikpLCBJKCksIDE7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3Qocy5iKShlLCAnc2V0RGVidWdNb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRCh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChpLm0pKHdpbmRvdywgby5lKSAmJiBPYmplY3QoaS5tKSh3aW5kb3dbby5lXSwgdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93W28uZV1bdF07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKSh0LCAnZ2V0RGVidWdWYWx1ZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBUID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHcoKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gVC5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKShuZXcgRXJyb3IoJ0RlYnVnIG1ldGhvZCBlbmFibGVkOiAnLmNvbmNhdCh0KSksICdkZWJ1Z1B1YmxpY0FwaS1lbmFibGVkLScuY29uY2F0KHQpLCAhMCksIFQucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5iKSh0LCAncGl4ZWxEZWJ1Z01vZGVzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnaicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnaScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBqOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDUpLCBpID0gbigwKSwgbyA9IG4oMSksIGMgPSBuKDQpLCBhID0gbigyKSwgcyA9IG4oMyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIHQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiB0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCdfJykucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikodCwgJ2dldEFtcEFtem5CaWRWYWx1ZScpLCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIU9iamVjdChpLm0pKHQsICdzbG90cycpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmIpKHQsICdpc0FBWFB1bnQnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIG4gPSBPYmplY3Qoci5jKSgndXJsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYodCwgITEpID8gKE9iamVjdChzLmMpKCdhbXBBZENvbnRleHQnLCAnZ2V0Q3VycmVudFVybCcpLCBlID0gbnVsbCwgdC5jb250ZXh0ICYmIChlID0gdC5jb250ZXh0LmNhbm9uaWNhbFVybCB8fCB0LmNvbnRleHQuc291cmNlVXJsKSkgOiBlID0gdC50b3AubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgIWUgfHwgdm9pZCAwID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9wICE9PSB0LnNlbGYgJiYgKGUgPSB0LmRvY3VtZW50LnJlZmVycmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmIpKHQsICdnZXRDdXJyZW50VXJsJyksICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuID0gJycsIGkgPSBPYmplY3Qoci5jKSgndXJsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHYodCwgITEpID8gKE9iamVjdChzLmMpKCdhbXBBZENvbnRleHQnLCAnZ2V0UmVmZXJyZXJVcmwnKSwgdC5jb250ZXh0ID8gdC5jb250ZXh0LnJlZmVycmVyIDogdC50b3AuZG9jdW1lbnQucmVmZXJyZXIpIDogdC50b3AuZG9jdW1lbnQucmVmZXJyZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQuZG9jdW1lbnQucmVmZXJyZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZW5jb2RlVVJJQ29tcG9uZW50KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikobiwgJ2dldFJlZmVycmVyVXJsJyksICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IGNvb2tpZXNQYXJhbXM6ICcnIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5kKSgpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlWzBdIGluIGMuaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGVbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhcHNfZXh0XzkxNyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZmIgPSBlWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNvb2tpZXNQYXJhbXMgKz0gJyYnLmNvbmNhdChjLmhbZVswXV0sICc9JykuY29uY2F0KGVbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuZmIgfHwgYS5hLmdldFN0YXRlKCkuc3luYzkxNyB8fCBhLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9TWU5DXzkxNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikodCwgJ2dldEFwc0ZpcnN0UGFydHlDb29raWVzJyksIHsgY29va2llc1BhcmFtczogJycgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuYS5nZXRTdGF0ZSgpLmNvbmZpZy5ibG9ja2VkQmlkZGVyczsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGkubSkodCwgJ2Jsb2NrZWRCaWRkZXJzJykgJiYgT2JqZWN0KGkuaykodC5ibG9ja2VkQmlkZGVycykgJiYgKGUgPSB0LmJsb2NrZWRCaWRkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChpLmspKGUpICYmIChuID0gSlNPTi5zdHJpbmdpZnkoZSkpLCBuOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmIpKHQsICdnZXRCbG9ja2VkQmlkZGVycycsICEwKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChpLmkpKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5vOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGEuYS5nZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGkubSkodCwgJ2NmZycpICYmIE9iamVjdChpLm0pKHQuY2ZnLCAndicpICYmIC0xICE9PSB0LmNmZy52ID8gdC5jZmcudiA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikodCwgJ2dldENmZ1ZlcnNpb24nKSwgbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKHUodCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE1hdGguZmxvb3IoTnVtYmVyKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPiBjLm0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmIpKHQsICdwYXJzZVRpbWVvdXQnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geSh0LnRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IG4gJiYgKG4gPSB5KGUuY29uZmlnLmJpZFRpbWVvdXQpKSwgITEgPT09IG4gJiYgKG4gPSB5KGUuY2ZnLkRFRkFVTFRfVElNRU9VVCkpLCBuOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmIpKHQsICdnZXRUaW1lb3V0JywgITApLCAyMDAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8odCwgZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gITE7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoby5iKShlLCAnZXhlY3V0ZUZ1bmN0aW9uT25jZVdpdGhUaW1lb3V0LXdyYXBwZWRGdW5jdGlvbicsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4pLCByID0gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gc2V0VGltZW91dChpLCBlLCAhMCksIGkuYmluZChudWxsLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikoZSwgJ2V4ZWN1dGVGdW5jdGlvbk9uY2VXaXRoVGltZW91dCcsICEwKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGoodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG8uYikodCwgJ2V4ZWN1dGVGdW5jdGlvbk9uY2VXaXRoVGltZW91dC13cmFwcGVkRnVuY3Rpb24nLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlID8gdC5BTVBfQ09OVEVYVF9EQVRBIDogdC5jb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihuICYmIE9iamVjdChpLm0pKG4sICd0YWdOYW1lJykgJiYgJ0FNUC1BRCcgPT09IG4udGFnTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uYikodCwgJ2lzSW5BbXBBZCcpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQ7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBUOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMCksIGkgPSBuKDEzKSwgbyA9IG4oMSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIHQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiB0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCwgZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW25dOwogICAgICAgICAgICAgICAgICAgICAgICByLmVudW1lcmFibGUgPSByLmVudW1lcmFibGUgfHwgITEsIHIuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gciAmJiAoci53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHIua2V5LCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBzKHQucHJvdG90eXBlLCBlKSwgbiAmJiBzKHQsIG4pLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZSAmJiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9KHQsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZih0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgUmVmbGVjdCB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBvID0gbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbCh0aGlzKS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBSZWZsZWN0LmNvbnN0cnVjdChvLCBhcmd1bWVudHMsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gdGhpcywgIShpID0gbikgfHwgJ29iamVjdCcgIT09IGMoaSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgaSA/IGIocikgOiBpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ3RoaXMgaGFzblwndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuXCd0IGJlZW4gY2FsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGwgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpOwogICAgICAgICAgICAgICAgICAgIH0pKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW4gdCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiB0W2VdID0gbiwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkKGUsIGkuYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKHRoaXMsIGUpLCBwKGIoaSA9IHQuY2FsbCh0aGlzLCBuLnRhcmdldElkLCBPYmplY3Qoci5tKShuLCAnaW52Q29kZScpID8gbi5pbnZDb2RlIDogT2JqZWN0KHIubSkobiwgJ3RhZ0lkJykgPyBuLnRhZ0lkIDogbi50YXJnZXRJZCkpLCAncmF3U2xvdCcsIHZvaWQgMCksIHAoYihpKSwgJ21lZGlhVHlwZScsICdkaXNwbGF5JyksIGkucmF3U2xvdCA9IG4sIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3JlcG9ydEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IG4gJiYgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG8uYikodCwgJ0FwblNsb3QtJy5jb25jYXQoZSksIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnaW5pdEtleXdvcmRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIubSkodGhpcy5yYXdTbG90LCAna2V5d29yZHMnKSB8fCAodGhpcy5yYXdTbG90LmtleXdvcmRzID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdpbml0S2V5d29yZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0VGFyZ2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEtleXdvcmRzKCksIHRoaXMucmF3U2xvdC5rZXl3b3Jkc1t0XSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IodCwgJ3NldFRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdEtleXdvcmRzKCksIE9iamVjdChyLm0pKHRoaXMucmF3U2xvdC5rZXl3b3JkcywgdCkgPyBbdGhpcy5yYXdTbG90LmtleXdvcmRzW3RdXSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnZ2V0VGFyZ2V0aW5nJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbGVhclRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRLZXl3b3JkcygpLCBkZWxldGUgdGhpcy5yYXdTbG90LmtleXdvcmRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdjbGVhclRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzaXplcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYXdTbG90LnNpemVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnc2l6ZXMnKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZChlLCBpLmIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgaSA9IG5ldyBBcnJheShyKSwgbyA9IDA7IG8gPCByOyBvKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtvXSA9IGFyZ3VtZW50c1tvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGIobiA9IHQuY2FsbC5hcHBseSh0LCBbdGhpc10uY29uY2F0KGkpKSksICdpc1N1cHBvcnRlZCcsICEwKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncmVwb3J0RXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoby5iKSh0LCAnQXBwTmV4dXNBZFNlcnZlci0nLmNvbmNhdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbWRRdWV1ZVB1c2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFwbnRhZy5hbnEucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcih0LCAnY21kUXVldWVQdXNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChyLm0pKHdpbmRvdywgJ2FwbnRhZycpIHx8ICFPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLCAncmVxdWVzdHMnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLnJlcXVlc3RzLCAna2V5d29yZHMnKSB8fCAod2luZG93LmFwbnRhZy5yZXF1ZXN0cy5rZXl3b3JkcyA9IHt9KSwgd2luZG93LmFwbnRhZy5yZXF1ZXN0cy5rZXl3b3Jkc1t0XSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IodCwgJ3NldFRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qoci5tKSh3aW5kb3csICdhcG50YWcnKSB8fCAhT2JqZWN0KHIubSkod2luZG93LmFwbnRhZywgJ3JlcXVlc3RzJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIubSkod2luZG93LmFwbnRhZy5yZXF1ZXN0cywgJ2tleXdvcmRzJykgfHwgKHdpbmRvdy5hcG50YWcucmVxdWVzdHMua2V5d29yZHMgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHdpbmRvdy5hcG50YWcucmVxdWVzdHMua2V5d29yZHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlID8gW10gOiBbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICdnZXRUYXJnZXRpbmcnKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NsZWFyVGFyZ2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLm0pKHdpbmRvdywgJ2FwbnRhZycpICYmIE9iamVjdChyLm0pKHdpbmRvdy5hcG50YWcsICdyZXF1ZXN0cycpICYmIE9iamVjdChyLm0pKHdpbmRvdy5hcG50YWcucmVxdWVzdHMsICdrZXl3b3JkcycpICYmIGRlbGV0ZSB3aW5kb3cuYXBudGFnLnJlcXVlc3RzLmtleXdvcmRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdjbGVhclRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdoYXNBZFNlcnZlck9iamVjdExvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5tKSh3aW5kb3csICdhcG50YWcnKSAmJiBPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLCAnbG9hZGVkJykgJiYgITAgPT09IHdpbmRvdy5hcG50YWcubG9hZGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnaGFzQWRTZXJ2ZXJPYmplY3RMb2FkZWQnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2lzQ29tbWFuZFF1ZXVlRGVmaW5lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5tKSh3aW5kb3csICdhcG50YWcnKSAmJiBPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLCAnYW5xJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICdpc0NvbW1hbmRRdWV1ZURlZmluZWQnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldFNsb3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5tKSh3aW5kb3csICdhcG50YWcnKSAmJiBPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLCAncmVxdWVzdHMnKSAmJiBPYmplY3Qoci5tKSh3aW5kb3cuYXBudGFnLnJlcXVlc3RzLCAndGFncycpICYmIE9iamVjdChyLmwpKHdpbmRvdy5hcG50YWcucmVxdWVzdHMudGFncykgJiYgT2JqZWN0LmtleXMod2luZG93LmFwbnRhZy5yZXF1ZXN0cy50YWdzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB3aW5kb3cuYXBudGFnLnJlcXVlc3RzLnRhZ3NbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKG5ldyBtKG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnZ2V0U2xvdHMnKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgeSA9IG4oMTYpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChoID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiB0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgdCAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW25dOwogICAgICAgICAgICAgICAgICAgICAgICByLmVudW1lcmFibGUgPSByLmVudW1lcmFibGUgfHwgITEsIHIuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gciAmJiAoci53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHIua2V5LCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGogPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0LCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCkgewogICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigndGhpcyBoYXNuXCd0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc25cJ3QgYmVlbiBjYWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFModCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoUyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBpbiB0ID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IHRbZV0gPSBuLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIF8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgJiYgaih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShjLCBpLmIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgZSwgbiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgUmVmbGVjdCB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBvID0gUyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gUyh0aGlzKS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBSZWZsZWN0LmNvbnN0cnVjdChvLCBhcmd1bWVudHMsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gdGhpcywgIShpID0gbikgfHwgJ29iamVjdCcgIT09IGgoaSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgaSA/IHYocikgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGMpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gbmV3IEFycmF5KGUpLCBpID0gMDsgaSA8IGU7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW2ldID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcodih0ID0gbi5jYWxsLmFwcGx5KG4sIFt0aGlzXS5jb25jYXQocikpKSwgJ2lzU3VwcG9ydGVkJywgITApLCB3KHYodCksICduZWVkTmV3QmlkT2JqZWN0JywgITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gYywgKGUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncmVwb3J0RXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoby5iKSh0LCAnU21hcnRBZFNlcnZlci0nLmNvbmNhdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbWRRdWV1ZVB1c2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNhcy5jbWQucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcih0LCAnY21kUXVldWVQdXNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2hhc0FkU2VydmVyT2JqZWN0TG9hZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLm0pKHdpbmRvdywgJ3NhcycpICYmIE9iamVjdChyLm0pKHdpbmRvdy5zYXMsICdfX3NtYXJ0TG9hZGVkJykgJiYgITAgPT09IHdpbmRvdy5zYXMuX19zbWFydExvYWRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ2hhc0FkU2VydmVyT2JqZWN0TG9hZGVkJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpc0NvbW1hbmRRdWV1ZURlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIubSkod2luZG93LCAnc2FzJykgJiYgT2JqZWN0KHIubSkod2luZG93LnNhcywgJ2NtZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnaXNDb21tYW5kUXVldWVEZWZpbmVkJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSAmJiBPKHQucHJvdG90eXBlLCBlKSwgYzsKICAgICAgICAgICAgICAgICAgICB9KCksIEUgPSBuKDMpLCBEID0gbmV3IGkuYigpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FwcG5leHVzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChFLmMpKCdhZFNlcnZlcicsIHQpLCBEID0gbmV3IGcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdnb29nbGV0YWcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEUuYykoJ2FkU2VydmVyJywgdCksIEQgPSBuZXcgeS5hKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2FzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChFLmMpKCdhZFNlcnZlcicsIHQpLCBEID0gbmV3IF8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHQgPyBPYmplY3QoRS5jKSgnYWRTZXJ2ZXInLCAnaW52YWxpZC0nLmNvbmNhdCh0KSkgOiBPYmplY3QoRS5jKSgnYWRTZXJ2ZXInLCAnbm9uZScpLCBEID0gbmV3IGkuYigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoby5iKSh0LCAnc2V0RGlzcGxheUFkU2VydmVyJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIHQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiB0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNGQ5ODliNjJjNmIxZGE1ZCA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkXzI5YmY3MWY3MzA0MjljYmMgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80ZDk4OWI2MmM2YjFkYTVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYzQ2MDdkMTBiMGFjYmY2Yi5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yOWJmNzFmNzMwNDI5Y2JjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYzQ2MDdkMTBiMGFjYmY2Yi5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnVybCwgbiA9IHQub25sb2FkLCBvID0gdC5vbmVycm9yLCBjID0gdC5vbnRpbWVvdXQsIGEgPSB0LndpdGhDcmVkZW50aWFscywgcyA9IHQuYm9keSwgdSA9IHZvaWQgMCA9PT0gcyA/IG51bGwgOiBzLCBkID0gdC5oZWFkZXJzLCBmID0gdm9pZCAwID09PSBkID8gbnVsbCA6IGQsIGIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKHZvaWQgMCAhPT0gbyAmJiBvLmNhbGwoYiwgJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIub25sb2FkID0gbi5iaW5kKG51bGwsIGIpLCB2b2lkIDAgIT09IG8gJiYgKGIub25lcnJvciA9IG8pLCB2b2lkIDAgIT09IGMgJiYgKGIub250aW1lb3V0ID0gYyksIHZvaWQgMCAhPT0gYSAmJiAoYi53aXRoQ3JlZGVudGlhbHMgPSBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICdHRVQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHUgJiYgKGwgPSAnUE9TVCcpLCBiLm9wZW4obCwgZSksIG51bGwgIT09IGYgJiYgJ29iamVjdCcgPT09IGkoZikgJiYgT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnNldFJlcXVlc3RIZWFkZXIodCwgZlt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGIuc2VuZCh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IG8gJiYgby5jYWxsKGIsICdlcnJvcicpLCBPYmplY3Qoci5iKSh0LCAneGhyUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNGQ5ODliNjJjNmIxZGE1ZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfNGQ5ODliNjJjNmIxZGE1ZCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yOWJmNzFmNzMwNDI5Y2JjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8yOWJmNzFmNzMwNDI5Y2JjKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0LCBlLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gbiAmJiAobiA9IGRvY3VtZW50KSwgdm9pZCAwID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgZSghMCksICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdIHx8IG4uYm9keS5maXJzdENoaWxkLCBjID0gbi5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnLCBjLmFzeW5jID0gITAsIGMuc3JjID0gdCwgZSAmJiBhKGMsIGUpLCBhKGMsIGkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmIpKG5ldyBFcnJvcignRXJyb3IgTG9hZGluZyBTY3JpcHQgVGFnJyksICdsb2FkU2NyaXB0VGFnLW9uZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdLCAnb25lcnJvcicpLCBudWxsICE9PSBvLnBhcmVudE5vZGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjLCBvKSwgITA7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5iKSh0LCAnbG9hZFNjcmlwdFRhZycsICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IFtdLCBpID0gMyA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiAnb25sb2FkJzsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiAodFtpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXBwbHkobnVsbCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnYWRkQ2FsbGJhY2tGdW5jdGlvbicpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHQpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnb2JqVG9VcmxQYXJhbScpLCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMSksIGkgPSBuKDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiB0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgdCAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhKHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgPT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHBhcnNlSW50KHQsIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnaXNOdW1iZXInKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgfHwgdm9pZCAwID09PSB0OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmIpKHQsICdpc051bWJlck9yVW5kZWZpbmVkJyksICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5qKShlLCBvKHQpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnaXNWYXJPZlR5cGVzJyksICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3OwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gXzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEU7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBEOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEk7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMiksIGkgPSBuKDUpLCBvID0gbig0KSwgYyA9IG4oMCksIGEgPSBuKDgpLCBzID0gbigxKSwgdSA9IG4oNiksIGQgPSBuKDEyKSwgZiA9IG4oMyksIGIgPSBuKDkpLCBsID0gbigxNCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCh0KTsKICAgICAgICAgICAgICAgICAgICB9KHQpIHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0KTsKICAgICAgICAgICAgICAgICAgICB9KHQpIHx8IHkodCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5rZXlzKHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAociA9IHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIG4ucHVzaC5hcHBseShuLCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG51bGwgIT0gYXJndW1lbnRzW2VdID8gYXJndW1lbnRzW2VdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJSAyID8gbShPYmplY3QobiksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKHQsIGUsIG5bZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpIDogbShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSBuICYmIHQuY29uc3RydWN0b3IgJiYgKG4gPSB0LmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbiA/IEFycmF5LmZyb20odCkgOiAnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSA/IGgodCwgZSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gZSB8fCBlID4gdC5sZW5ndGgpICYmIChlID0gdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KGUpOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gdFtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8odCwgZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZW51bWVyYWJsZSA9IHIuZW51bWVyYWJsZSB8fCAhMSwgci5jb25maWd1cmFibGUgPSAhMCwgJ3ZhbHVlJyBpbiByICYmIChyLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgci5rZXksIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGoodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogdFtlXSA9IG4sIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCB0KSwgaih0aGlzLCAnYmlkQ29uZmlnJywgdm9pZCAwKSwgaih0aGlzLCAnYmlkU3RhdGUnLCBvLmIubmV3KSwgaih0aGlzLCAnX3RhcmdldGluZ1NldElEJywgdm9pZCAwKSwgaih0aGlzLCAndGltaW5nJywgeyBzZXRBdFRpbWVzOiBbXSB9KSwgaih0aGlzLCAncGl4ZWxTZW50JywgITEpLCBqKHRoaXMsICd1c2VTYWZlRnJhbWVzJywgITEpLCBqKHRoaXMsICdiaWRSZXFJRCcsICcnKSwgaih0aGlzLCAnaG9zdCcsIHZvaWQgMCksIGoodGhpcywgJ2V2Jywgdm9pZCAwKSwgaih0aGlzLCAnY2ZlJywgdm9pZCAwKSwgaih0aGlzLCAnaXNBbXAnLCAhMSksIGoodGhpcywgJ2RvYycsIHZvaWQgMCksIGoodGhpcywgJ2luaGVyaXRTaXplJywgdm9pZCAwKSwgdGhpcy5iaWRDb25maWcgPSBlLCB0aGlzLl90YXJnZXRpbmdTZXRJRCA9IE9iamVjdChjLmUpKCksIHIuYS5nZXRTdGF0ZSgpLmNvbmZpZy51c2VTYWZlRnJhbWVzICYmICh0aGlzLnVzZVNhZmVGcmFtZXMgPSAhMCksIHRoaXMudXNlU2FmZUZyYW1lcyAmJiBPYmplY3QoYy5tKShlLCAndGFyZ2V0aW5nJykgJiYgZS50YXJnZXRpbmcucHVzaCgnYW16bmhvc3QnKSwgT2JqZWN0KGMubSkoZSwgJ21ldGEnKSA/IE9iamVjdChjLmspKGUubWV0YSkgfHwgKHRoaXMucmVwb3J0RXJyb3IoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUeXBlRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdcJ21ldGFcJyBpcyBub3QgYW4gXCdhcnJheVwnOiAnLmNvbmNhdChKU09OLnN0cmluZ2lmeShlLm1ldGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2NvbnN0cnVjdG9yLW1ldGEnKSwgZS5tZXRhID0gW10pIDogZS5tZXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ2QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycgIT09IHRoaXMuYmlkQ29uZmlnLm1lZGlhVHlwZSAmJiAndicgIT09IHRoaXMuYmlkQ29uZmlnLm1lZGlhVHlwZSB8fCAobiA9ICd2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5tKSh0aGlzLmJpZENvbmZpZywgJ2Ftem5kZWFscycpICYmIChPYmplY3QoZi5jKSgnYmlkVHlwZScsICcnLmNvbmNhdChuLCAnLWFtem5kZWFscycpKSwgaSA9IHRoaXMuYmlkQ29uZmlnLmFtem5kZWFscy5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdCh0LCAnYW16bmlpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5iaWRDb25maWcudGFyZ2V0aW5nLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IHQuaW5kZXhPZignYW16bmlpZCcpICYmICFPYmplY3QoYy5qKShpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoZi5jKSgnYmlkVHlwZScsICcnLmNvbmNhdChuLCAnLScpLmNvbmNhdCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChjLm0pKHRoaXMuYmlkQ29uZmlnLCAnZmlmJykgJiYgJzEnID09PSB0aGlzLmJpZENvbmZpZy5maWYgPyBPYmplY3QoZi5jKSgnYmlkUmVuZGVyJywgJ2ZyaWVuZGx5JykgOiBPYmplY3QoZi5jKSgnYmlkUmVuZGVyJywgJ3VuZnJpZW5kbHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKGUsICdwaXhlbGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IHQsIChuID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3JlcG9ydEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IG4gJiYgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMuYikodCwgJ0JpZC0nLmNvbmNhdChlKSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYXRjaGVzQmlkQ2FjaGVJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpZENvbmZpZy50YXJnZXRpbmcucmVkdWNlKGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gfHwgLTEgIT09IHIuaW5kZXhPZignYW16bmlpZCcpICYmIGUuYmlkQ29uZmlnW3JdID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnbWF0Y2hlc0JpZENhY2hlSWQnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21lZGlhVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ2QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3ZpZGVvJyAhPT0gdGhpcy5iaWRDb25maWcubWVkaWFUeXBlICYmICd2JyAhPT0gdGhpcy5iaWRDb25maWcubWVkaWFUeXBlICYmICd2JyAhPT0gdGhpcy5iaWRDb25maWcubWVkaWFUeXBlX3NwIHx8ICh0ID0gJ3ZpZGVvJyksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd0YXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iaWRDb25maWcudGFyZ2V0aW5nLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYW16bmhvc3QnID09PSBlID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodC5ob3N0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiBPYmplY3QoYy5tKSh0LmJpZENvbmZpZywgZSkgJiYgT2JqZWN0KGMuaykodC5iaWRDb25maWdbZV0pID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQodC5iaWRDb25maWdbZV0uam9pbignLCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiBPYmplY3QoYy5tKSh0LmJpZENvbmZpZywgZSkgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCh0LmJpZENvbmZpZ1tlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpIHx8IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdLCByID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMsIGEgPSB0W1N5bWJvbC5pdGVyYXRvcl0oKTsgIShyID0gKGMgPSBhLm5leHQoKSkuZG9uZSkgJiYgKG4ucHVzaChjLnZhbHVlKSwgIWUgfHwgbi5sZW5ndGggIT09IGUpOyByID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIHx8IG51bGwgPT0gYS5yZXR1cm4gfHwgYS5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBlKSB8fCB5KHQsIGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIDIpLCBuID0gZVswXSwgciA9IGVbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcmJy5jb25jYXQobiwgJz0nKS5jb25jYXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ3RhcmdldGluZycpLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYmlkT2JqZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogdGhpcy5iaWRDb25maWcuc2xvdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5paWQ6IHRoaXMuYmlkQ29uZmlnLmFtem5paWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bmJpZDogdGhpcy5iaWRDb25maWcuYW16bmJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpucDogdGhpcy5iaWRDb25maWcuYW16bnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnN6OiB0aGlzLmJpZENvbmZpZy5hbXpuc3osCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogdGhpcy5iaWRDb25maWcuYW16bnN6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aWRlbycgPT09IHRoaXMubWVkaWFUeXBlICYmICh0Lm1lZGlhVHlwZSA9ICd2aWRlbycsIHQucXNQYXJhbXMgPSB0aGlzLnRhcmdldGluZywgdC5lbmNvZGVkUXNQYXJhbXMgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy50YXJnZXRpbmcpLCB0LnJfYW16bmJpZCA9IHRoaXMuYmlkQ29uZmlnLnJfYW16bmJpZCwgdC5yX2Ftem5paWQgPSB0aGlzLmJpZENvbmZpZy5yX2Ftem5paWQsIHQucl9hbXpucCA9IHRoaXMuYmlkQ29uZmlnLnJfYW16bnApLCB0aGlzLnVzZVNhZmVGcmFtZXMgJiYgKHQuYW16bmhvc3QgPSB0aGlzLmhvc3QpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnYmlkT2JqZWN0JywgITApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElEOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuaWlkOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5iaWQ6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnA6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnN6OiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdlcnJvcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ25ld0JpZE9iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHRoaXMuYmlkQ29uZmlnLnNsb3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogdGhpcy5iaWRDb25maWcuYW16bnN6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IHRoaXMubWVkaWFUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdLZXlzOiB0aGlzLmJpZENvbmZpZy50YXJnZXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxc1BhcmFtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRhcmdldGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkUXNQYXJhbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQudGFyZ2V0aW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbG90SUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWRpYVR5cGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpZENvbmZpZy5tZXRhLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gbi5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbbl0gPSB0LmJpZENvbmZpZ1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmJpZENvbmZpZy50YXJnZXRpbmcuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0aW5nW25dID0gJ2Ftem5ob3N0JyA9PT0gbiA/IHQuaG9zdCA6IHQuYmlkQ29uZmlnW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZvaWQgMCAhPT0gdGhpcy5zbG90SUQgJiYgLTEgIT09IHRoaXMuc2xvdElELmluZGV4T2YoJ18nKSAmJiAoZS5zYXNUYXJnZXRpbmcgPSBlLmhlbHBlcnMudGFyZ2V0aW5nS2V5cy5tYXAoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KG4sICdfJykuY29uY2F0KHQuc2xvdElELnNwbGl0KCdfJylbMV0sICc9JykuY29uY2F0KGUudGFyZ2V0aW5nW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJzsnKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICduZXdCaWRPYmplY3QnLCAhMCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdLZXlzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNQYXJhbXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFFzUGFyYW1zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzbG90SUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmlkQ29uZmlnLnNsb3RJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ3Nsb3RJRCcpLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSkgJiYgTyhlLnByb3RvdHlwZSwgbiksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBTID0gT2JqZWN0KGMuZikoby5xKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gJ3ZhbGlkYXRlU3VwcGx5Q2hhaW5PYmplY3QnLCBuID0gITE7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVHlwZUVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJycuY29uY2F0KGUsICctJykuY29uY2F0KHQpLCAhMCksICEobiA9ICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChjLmwpKHQpID8gKE9iamVjdChjLm0pKHQsICdjb21wbGV0ZScpID8gLTEgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZih0LmNvbXBsZXRlKSAmJiByKCdzY2hhaW4tY29tcGxldGUtdHlwZScsICdUaGUgYHNjaGFpbi5jb21wbGV0ZWAgcHJvcGVydHkgbXVzdCBiZSBhIGAxYCBvciBgMGAnKSA6IHIoJ3NjaGFpbi1jb21wbGV0ZScsICdUaGUgYHNjaGFpbi5jb21wbGV0ZWAgcHJvcGVydHkgbXVzdCBiZSBwcm92aWRlZCcpLCBPYmplY3QoYy5tKSh0LCAndmVyJykgPyBPYmplY3QoYi5iKSh0LnZlciwgWydzdHJpbmcnXSkgfHwgcignc2NoYWluLXZlci10eXBlJywgJ1RoZSBgc2NoYWluLnZlcmAgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZycpIDogcignc2NoYWluLXZlcicsICdUaGUgYHNjaGFpbi52ZXJgIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQnKSwgT2JqZWN0KGMubSkodCwgJ25vZGVzJykgPyBPYmplY3QoYy5rKSh0Lm5vZGVzKSA/IHQubm9kZXMucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGMubCkoZSkgPyAoT2JqZWN0KGMubSkoZSwgJ2FzaScpID8gT2JqZWN0KGIuYikoZS5hc2ksIFsnc3RyaW5nJ10pIHx8IHIoJ3NjaGFpbi1ub2RlLWFzaS10eXBlJywgJ0FsbCBgc2NoYWluLm5vZGVzYCBpdGVtcyBtdXN0IGhhdmUgYW4gYGFzaWAgcHJvcGVydHkgb2YgdHlwZSBgc3RyaW5nYCcpIDogcignc2NoYWluLW5vZGUtYXNpJywgJ0FsbCBgc2NoYWluLm5vZGVzYCBpdGVtcyBtdXN0IGhhdmUgYW4gYGFzaWAgcHJvcGVydHknKSwgT2JqZWN0KGMubSkoZSwgJ3NpZCcpID8gT2JqZWN0KGIuYikoZS5zaWQsIFsnc3RyaW5nJ10pIHx8IHIoJ3NjaGFpbi1ub2RlLXNpZC10eXBlJywgJ0FsbCBgc2NoYWluLm5vZGVzYCBpdGVtcyBtdXN0IGhhdmUgYW4gYHNpZGAgcHJvcGVydHkgb2YgdHlwZSBgc3RyaW5nYCcpIDogcignc2NoYWluLW5vZGUtc2lkJywgJ0FsbCBgc2NoYWluLm5vZGVzYCBpdGVtcyBtdXN0IGhhdmUgYW4gYHNpZGAgcHJvcGVydHknKSwgT2JqZWN0KGMubSkoZSwgJ2hwJykgPyAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUuaHApICYmIHIoJ3NjaGFpbi1ub2RlLWhwLXR5cGUnLCAnQWxsIGBzY2hhaW4ubm9kZXNgIGl0ZW1zIG11c3QgaGF2ZSBhbiBgaHBgIHByb3BlcnR5IHdoaWNoIGlzIGAxYCBvciBgMGAnKSA6IHIoJ3NjaGFpbi1ub2RlLWhwJywgJ0FsbCBgc2NoYWluLm5vZGVzYCBpdGVtcyBtdXN0IGhhdmUgYW4gYGhwYCBwcm9wZXJ0eScpLCBPYmplY3QoYi5iKShlLnJpZCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCByKCdzY2hhaW4tbm9kZS1yaWQtdHlwZScsICdJZiBwcm92aWRlZCwgdGhlIGByaWRgIHByb3BlcnR5IG9uIGFuIGBzY2hhaW4ubm9kZXNgIGl0ZW0gbXVzdCBiZSBvZiB0eXBlIGBzdHJpbmdgJyksIE9iamVjdChiLmIpKGUubmFtZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCByKCdzY2hhaW4tbm9kZS1uYW1lLXR5cGUnLCAnSWYgcHJvdmlkZWQsIHRoZSBgbmFtZWAgcHJvcGVydHkgb24gYW4gYHNjaGFpbi5ub2Rlc2AgaXRlbSBtdXN0IGJlIG9mIHR5cGUgYHN0cmluZ2AnKSwgT2JqZWN0KGIuYikoZS5kb21haW4sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgfHwgcignc2NoYWluLW5vZGUtZG9tYWluLXR5cGUnLCAnSWYgcHJvdmlkZWQsIHRoZSBgZG9tYWluYCBwcm9wZXJ0eSBvbiBhbiBgc2NoYWluLm5vZGVzYCBpdGVtIG11c3QgYmUgb2YgdHlwZSBgc3RyaW5nYCcpLCB0ICYmICFuKSA6IHIoJ3NjaGFpbi1ub2RlLXR5cGUnLCAnQWxsIGBzY2hhaW4ubm9kZXNgIGl0ZW1zIG11c3QgYmUgb2JqZWN0cycpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAhbikgOiByKCdzY2hhaW4tbm9kZXMtdHlwZScsICdUaGUgYHNjaGFpbi5ub2Rlc2AgcHJvcGVydHkgbXVzdCBiZSBhbiBgQXJyYXlgJykgOiByKCdzY2hhaW4tbm9kZXMnLCAnVGhlIGBzY2hhaW4ubm9kZXNgIHByb3BlcnR5IG11c3QgYmUgcHJvdmlkZWQnKSkgOiByKCdzY2hhaW4nLCAnVGhlIGBzY2hhaW5gIHZhbHVlIG11c3QgYmUgYW4gb2JqZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuYikodCwgZSwgITApLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKHQsIGUsIG4sIGQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IHIuYS5nZXRTdGF0ZSgpLCBtID0ge30sIHkgPSBPYmplY3QoaS5jKSgnaG9zdCcsIGIuaG9zdHMuREVGQVVMVF9BQVhfQklEX0hPU1QpLCBoID0gYi5jZmcuRFRCX1BBVEgsIE8gPSAnYmlkJzsKICAgICAgICAgICAgICAgICAgICAgICAgYi5leHBlcmltZW50cy5zaG91bGRVc2VUZXN0QmlkRW5kcG9pbnQgJiYgbnVsbCAhPT0gYi5jZmcuVEVTVF9CSURfRU5EUE9JTlQgJiYgKE8gPSBiLmNmZy5URVNUX0JJRF9FTkRQT0lOVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBiLmNvbmZpZy5wdWJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU6IE9iamVjdCh1LmcpKHdpbmRvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcjogT2JqZWN0KHUuaCkod2luZG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZDogUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiOiB0LmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3M6IE9iamVjdChjLmgpKHdpbmRvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiBvLmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHM6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChhLmMpKHQubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYy5tKSh0LCAnbWVkaWFUeXBlJykgJiYgJ3ZpZGVvJyA9PT0gdC5tZWRpYVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQuYWF4U2xvdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKE9iamVjdChjLm0pKHQsICdzaXplcycpICYmIDAgPCB0LnNpemVzLmxlbmd0aCAmJiBPYmplY3QoYy5tKSh0LCAnc2xvdElEJykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1Nsb3RFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2xvdDogJy5jb25jYXQoSlNPTi5zdHJpbmdpZnkodC5yYXdTbG90KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2J1aWxkU2xvdHNVcmxQYXJhbS1pbnZhbGlkU2xvdCcsICEwKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdFUlJPUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdDogby5sLnZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmFheFNsb3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGMubSkodCwgJ3Nsb3ROYW1lJykgJiYgdC5zbG90TmFtZSAhPT0gdC5zbG90SUQgPyAoT2JqZWN0KGYuYykoJ2lkUmVtYXAnLCAneScpLCByLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQUREX1NMT1RfSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHQuc2xvdElECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uc2QgPSAnJy5jb25jYXQoci5hLmdldFN0YXRlKCkuc2xvdElkTWFwLmluZGV4T2YodC5zbG90SUQpKSwgbi5zbiA9IHQuc2xvdE5hbWUpIDogT2JqZWN0KGYuYykoJ2lkUmVtYXAnLCAnbicpLCBlID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCAhPT0gdC5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKHQsICdidWlsZFNsb3RzVXJsUGFyYW0nLCAhMCksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC52YWxpZFNsb3RzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBqOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0KGMubCkodC5jb25maWcucGFyYW1zKSA/IHQuY29uZmlnLnBhcmFtcyA6IHt9LCByID0gT2JqZWN0KGMubCkoZS5wYXJhbXMpID8gZS5wYXJhbXMgOiB7fSwgaSA9IGcoZyh7fSwgbiksIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gT2JqZWN0LmtleXMoaSkubGVuZ3RoID8gJycgOiBPYmplY3QoYS5jKShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAnZ2V0QmlkUGFyYW1zJywgITApLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGIsIHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZndjogT2JqZWN0KHUuZikoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJiOiBPYmplY3QodS5lKSh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGFpbjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChjLm0pKHQuY29uZmlnLCAnc2NoYWluJykgPyAoZSA9IHQuY29uZmlnLnNjaGFpbiwgZW5jb2RlVVJJQ29tcG9uZW50KFsnJy5jb25jYXQoZS52ZXIsICcsJykuY29uY2F0KGUuY29tcGxldGUpXS5jb25jYXQocChlLm5vZGVzLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWluJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGMubSkodCwgZSkgPyB0W2VdIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucmVwbGFjZSgvXCEvZywgJyUyMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLmpvaW4oJyEnKSkpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuYikodCwgJ2dldFN1cHBseUNoYWluT2JqZWN0JywgITApLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGIpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnW10nID09PSBqLnNsb3RzIHx8ICcnID09PSBqLnNsb3RzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzbG90cyBhdmFpbGFibGUgZm9yIGJpZCByZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfQUFYX1JFUVVFU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkQ29uZmlnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXFJRDogdC5iaWRSZXFJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3M6IGoud3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogai51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycVRzOiBEYXRlLm5vdygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGIuZXhwZXJpbWVudHMuY2h1bmtSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LmJpZFJlcUlELnNwbGl0KCctJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfTkVUV09SS19FWENIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiB2WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJRDogcGFyc2VJbnQodlsxXSwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNoYW5nZVR5cGU6ICdyZXF1ZXN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYi5jb25maWcuaXNTZWxmU2VydmVQdWIgJiYgKGoucHViaWQgPSBqLnNyYywgai5zcmMgPSA2MDApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IE9iamVjdCh1LmQpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHcuZmIgJiYgKG1bOTE3XSA9IHcuZmIsIGpbby5oLmFwc19leHRfOTE3XSA9IE9iamVjdChhLmMpKG0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSBPYmplY3QoaS5jKSgnYmlkUGFyYW1zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChjLmwpKF8pICYmIChqID0gZyhnKHt9LCBqKSwgXykpLCBPYmplY3QoYy5sKShuKSAmJiAoT2JqZWN0KGMubSkobiwgJ2VuYWJsZWQnKSAmJiAoai5nZHByZSA9IGVuY29kZVVSSUNvbXBvbmVudChuLmVuYWJsZWQpKSwgT2JqZWN0KGMubSkobiwgJ2NvbnNlbnQnKSAmJiAoai5nZHByYyA9IGVuY29kZVVSSUNvbXBvbmVudChuLmNvbnNlbnQpKSwgT2JqZWN0KGMubSkobiwgJ2xvZycpICYmIChqLmdkcHJsID0gT2JqZWN0KGEuYykobi5sb2cpKSksIE9iamVjdChjLm0pKGIuY29uZmlnLCAndXNlU2FmZUZyYW1lcycpICYmIGIuY29uZmlnLnVzZVNhZmVGcmFtZXMgJiYgKGouc2YgPSAnMScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSA9IE9iamVjdChsLmIpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEUgJiYgKE9iamVjdChmLmMpKCdpZCcsICdiaWRSZXEtYXR0YWNoVG9rZW4nKSwgZC5hdCA9IEUpLCBqLnZtID0gZCAmJiAwICE9PSBPYmplY3Qua2V5cyhkKS5sZW5ndGggPyBPYmplY3QoYS5jKSh7IGlkczogZCB9KSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRCA9IE9iamVjdC5rZXlzKGopLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChjLm0pKGosIHQpICYmICd1bmRlZmluZWQnICE9PSBqW3RdICYmICcnICE9PSBqW3RdICYmIG51bGwgIT09IGpbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdCh0LCAnPScpLmNvbmNhdChqW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJicpOwogICAgICAgICAgICAgICAgICAgICAgICB3LmNvb2tpZXNQYXJhbXMgJiYgKEQgKz0gdy5jb29raWVzUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSAnJy5jb25jYXQoby5yKS5jb25jYXQoeSkuY29uY2F0KGgsICcvJykuY29uY2F0KE8sICc/JykuY29uY2F0KEQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfQUFYX1JFUV9QUk9QJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcUlEOiB0LmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXJsTGVuZ3RoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBULmxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgVDsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAnYnVpbGRCaWRVcmwnLCAhMCksICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoYy5tKSh0LCAnY29uZmlnJykgJiYgT2JqZWN0KGMubSkodC5jb25maWcsICdkZWFscycpICYmICEwID09PSB0LmNvbmZpZy5kZWFscyB8fCAhMCA9PT0gZS5uZWVkTmV3QmlkT2JqZWN0OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmIpKHQsICdpc05ld0JpZE9iamVjdFJlcXVpcmVkJyksICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpID0gdC5tYXAoZC5jKSwgYSA9IGUuc2xvdHMuZmlsdGVyKGQuZCkubWFwKGQuYykuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3QoYy5qKShpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IG4gPyBvLnQuYmlkSW5GbGlnaHQgOiBvLnQubm9CaWQsIHQuY29uY2F0KGEubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHYoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICcweDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaWQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICdkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbG90SUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVkaWFUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuYmlkOiBlID0gciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuaWlkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpucDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuc3o6ICcweDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmlpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpuYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5zeicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuYikoZSwgJ2FkZFN0YXRlVHJhY2tpbmdCaWRzVG9SZWFsQmlkcycpLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYy5tKSh0LCAnc2xvdHMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByLmEuZ2V0U3RhdGUoKS5zbG90SWRNYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNsb3RzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0LnNsb3RJRC5tYXRjaCgvXlxkKyQvKSAmJiBwYXJzZUludCh0LnNsb3RJRCwgMTApIDwgZS5sZW5ndGggJiYgKHQuc2xvdElEID0gZVtwYXJzZUludCh0LnNsb3RJRCwgMTApXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMuYikodCwgJ21hcFNsb3RJRFZhbHVlcycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYy5qKShyLmEuZ2V0U3RhdGUoKS5kaXNwbGF5QWRTZXJ2ZXIubm9CaWRTbG90SURzLCB0LnNsb3RJRCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gci5hLmdldFN0YXRlKCkuQUFYUmVxcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZFJlcUlEID09PSB0LmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICB9KVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoT2JqZWN0KGMubSkoZSwgJ3JxVHMnKSAmJiBEYXRlLm5vdygpIC0gZS5ycVRzID4gMjQwMDAwKSAmJiAoIShPYmplY3QoYy5tKShlLCAndXJsJykgJiYgIU9iamVjdChjLmIpKGUudXJsLCBPYmplY3QodS5nKSh3aW5kb3cpKSkgJiYgdC5iaWRTdGF0ZSAhPT0gby5iLnJlbmRlcmVkKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKShlLCAnaXNCaWRFbGlnaWJsZScpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQubWFwKGQuYyksIG4gPSByLmEuZ2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG4uc2xvdEJpZHMpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChjLmopKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi5zbG90Qmlkc1tlXS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaWRTdGF0ZSA9PT0gby5iLm5ldzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGlbaS5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQklEX1NUQVRFX0NIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldGluZ1NldElEOiBjLl90YXJnZXRpbmdTZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU3RhdGU6IG8uYi5leHBvc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRbZV0gPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5iKSh0LCAnZ2V0TmV3U2xvdEJpZHNBbmRFeHBvc2VGb3JSZXF1ZXN0ZWRTbG90cycpLCB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInICE9IHR5cGVvZiB0W2VdID8gMCA6IE1hdGgucm91bmQodFtlXSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG8odCwgZSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgncmVzb3VyY2UnKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRlc3QodC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnBlcmZvcm1hbmNlLnRpbWluZ1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gbiA/IDAgOiBuOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVkaXJlY3RTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZGlyZWN0RW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWluTG9va3VwU3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW5Mb29rdXBFbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25uZWN0U3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25uZWN0RW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWVzdFN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2VTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlY3VyZUNvbm5lY3Rpb25TdGFydCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0ucmVkdWNlKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgKyByKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByKHQsICdmZXRjaFN0YXJ0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWluTG9va3VwU3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvbWFpbkxvb2t1cEVuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29ubmVjdFN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25uZWN0RW5kJwogICAgICAgICAgICAgICAgICAgICAgICBdLnJlZHVjZShmdW5jdGlvbiAobiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgcih0LCBpKSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1lT3JpZ2luOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0ICYmICh0ID0gd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQpLCB0OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMSksIGkgPSBuKDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc0FkU2VydmVyT2JqZWN0TG9hZGVkKCkgJiYgKGUgPSB0LmdldFNsb3RzKCkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIuYikodCwgJ2dldERpc3BsYXlBZFNlcnZlclNsb3RzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChpLm0pKHQsICdzaXplcycpICYmIE9iamVjdChpLmspKHQuc2l6ZXMpICYmIDAgIT09IHQuc2l6ZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmIpKHQsICdkb2VzU2xvdEhhdmVTaXplcycpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3ZpZGVvJyAhPT0gdC5tZWRpYVR5cGU7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuYikodCwgJ2lzRGlzcGxheVNsb3QnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2xvdElEOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmIpKHQsICdnZXRTbG90SUQnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geTsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigwKSwgaSA9IG4oMSksIG8gPSBuKDMpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiB0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgdCAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5rZXlzKHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAociA9IHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBlKS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIG4ucHVzaC5hcHBseShuLCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgUmVmbGVjdCAmJiBSZWZsZWN0LmdldCA/IFJlZmxlY3QuZ2V0IDogZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgZSkgJiYgbnVsbCAhPT0gKHQgPSBmKHQpKTspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IociwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5nZXQgPyBpLmdldC5jYWxsKG4pIDogaS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKHQsIGUsIG4gfHwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuX19wcm90b19fID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0LCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigndGhpcyBoYXNuXCd0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc25cJ3QgYmVlbiBjYWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YodCk7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgci5lbnVtZXJhYmxlID0gci5lbnVtZXJhYmxlIHx8ICExLCByLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIHIgJiYgKHIud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCByLmtleSwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgbCh0LnByb3RvdHlwZSwgZSksIG4gJiYgbCh0LCBuKSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0odCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogdFtlXSA9IG4sIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIodGhpcywgdCksIG0odGhpcywgJ2lzU3VwcG9ydGVkJywgITEpLCBtKHRoaXMsICduZWVkTmV3QmlkT2JqZWN0JywgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbWRRdWV1ZVB1c2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzbG90UmVuZGVyRW5kZWRFdmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY2xlYXJUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdoYXNBZFNlcnZlck9iamVjdExvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnaXNDb21tYW5kUXVldWVEZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRTbG90cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCB5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIodGhpcywgdCksIG0odGhpcywgJ21lZGlhVHlwZScsICdkaXNwbGF5JyksIG0odGhpcywgJ3Nsb3RJRCcsIHZvaWQgMCksIG0odGhpcywgJ3Nsb3ROYW1lJywgdm9pZCAwKSwgbSh0aGlzLCAnc2xvdFBhcmFtcycsIHZvaWQgMCksIG0odGhpcywgJ3Jhd1Nsb3QnLCB2b2lkIDApLCB0aGlzLnNsb3RJRCA9IGUsIHRoaXMuc2xvdE5hbWUgPSBuLCB0aGlzLnNsb3RQYXJhbXMgPSByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXBvcnRFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBuICYmIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChpLmIpKHQsICdTbG90LScuY29uY2F0KGUpLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY2xlYXJUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpc1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnVGhlcmUgd2FzIGFuIGlzc3VlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgc2xvdDogJy5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZSksICdcbicpICsgdC5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy0gJy5jb25jYXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFtdLCBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0aGlzLnNsb3RJRCA/IGUucHVzaCgnXCdzbG90SURcJyBtdXN0IGJlIHByb3ZpZGVkIGFuZCBhIHN0cmluZycpIDogJ3N0cmluZycgIT0gdHlwZW9mIHRoaXMuc2xvdElEICYmIG4ucHVzaCgnXCdzbG90SURcJyBtdXN0IGJlIGEgc3RyaW5nJyksICdkaXNwbGF5JyA9PT0gdGhpcy5tZWRpYVR5cGUgJiYgMCA9PT0gdGhpcy5zaXplcy5sZW5ndGggJiYgZS5wdXNoKCdcJ3NpemVzXCcgbXVzdCBoYXZlIGF0IGxlYXN0IDEgdmFsaWQgaXRlbScpLCBPYmplY3Qoci5tKSh0aGlzLnJhd1Nsb3QsICdmbG9vcicpICYmIE9iamVjdChyLmwpKHRoaXMucmF3U2xvdC5mbG9vcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMucmF3U2xvdC5mbG9vciwgbyA9IGkuY3VycmVuY3ksIGMgPSBpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVU0QnICE9PSBvICYmIG4ucHVzaCgnXCdmbG9vclwnIGN1cnJlbmN5IG9ubHkgc3VwcG9ydHMgVVNEJyksIFMoYykgfHwgbi5wdXNoKCdcJ2Zsb29yXCcgdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgZS5sZW5ndGggPyAodGhpcy5yZXBvcnRFcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1Nsb3RWYWxpZGF0aW9uRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHQoW10uY29uY2F0KGUsIG4pLCB0aGlzLnJhd1Nsb3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAndmFsaWRhdGlvbi1lcnJvcicsICEwKSwgITEpIDogKDAgPCBuLmxlbmd0aCAmJiB0aGlzLnJlcG9ydEVycm9yKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2xvdFZhbGlkYXRpb25FcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdChuLCB0aGlzLnJhd1Nsb3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAndmFsaWRhdGlvbi13YXJuJywgITApLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICdpc1ZhbGlkJywgITApLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2l6ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmbG9vcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzbG90Q29uZmlnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElEOiB0aGlzLnNsb3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90TmFtZTogdGhpcy5zbG90TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogdGhpcy5zaXplcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ3Nsb3RDb25maWcnKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdE5hbWU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYWF4U2xvdFBhcmFtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5tKSh0aGlzLCAnc2xvdFBhcmFtcycpICYmIE9iamVjdChyLmwpKHRoaXMuc2xvdFBhcmFtcykgPyBPYmplY3Qua2V5cyh0aGlzLnNsb3RQYXJhbXMpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5rKShlKSA/IDAgPCBlLmxlbmd0aCAmJiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIHQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCkgOiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAwIDwgZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5iKShlLCAndmFsaWRhdGVTbG90UGFyYW1WYWx1ZScpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5zbG90UGFyYW1zW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW25dID0gdC5zbG90UGFyYW1zW25dLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnYWF4U2xvdFBhcmFtcycpLCB0aGlzLnNsb3RQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2FheFNsb3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG8uYykoJ3Nsb3RUeXBlJywgJ2Rpc3BsYXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkOiB0aGlzLnNsb3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiB0aGlzLnNpemVzLmZpbHRlcihyLmspLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5qb2luKCd4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Y6IHRoaXMuYWF4U2xvdFBhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNsb3RJRCAhPT0gdGhpcy5zbG90TmFtZSAmJiAodC5zbiA9IHRoaXMuc2xvdE5hbWUpLCB0aGlzLmZsb29yICYmICh0LmZjID0gdGhpcy5mbG9vci5jdXJyZW5jeSwgdC5mcCA9IHRoaXMuZmxvb3IudmFsdWUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnYWF4U2xvdCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Q6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt2OiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBoID0gW10sIE8gPSAvXlswLTldK3hbMC05XSskLywgaiA9IC9eWzAtOV0rJC8sIHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUgJiYgZS5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgJiYgdSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCB5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBSZWZsZWN0IHx8ICFSZWZsZWN0LmNvbnN0cnVjdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIFByb3h5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBvID0gZih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGYodGhpcykuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBSZWZsZWN0LmNvbnN0cnVjdChvLCBhcmd1bWVudHMsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gby5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gdGhpcywgIShpID0gbikgfHwgJ29iamVjdCcgIT09IGMoaSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgaSA/IGQocikgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIodGhpcywgZSksIG0oZChpID0gdC5jYWxsKHRoaXMsIG4uc2xvdElELCBuLnNsb3ROYW1lLCBuLnNsb3RQYXJhbXMpKSwgJ3Jhd1Nsb3QnLCB2b2lkIDApLCBtKGQoaSksICdoYXNSZXBvcnRlZFdvcmtpbmdJbnZhbGlkU2l6ZUVycm9yJywgITEpLCBpLm1lZGlhVHlwZSA9ICd2aWRlbycgPT09IG4ubWVkaWFUeXBlID8gJ3ZpZGVvJyA6ICdkaXNwbGF5JywgaS5yYXdTbG90ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG51bGwgIT0gYXJndW1lbnRzW2VdID8gYXJndW1lbnRzW2VdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJSAyID8gYShPYmplY3QobiksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKHQsIGUsIG5bZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpIDogYShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh7fSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLm0pKGkucmF3U2xvdCwgJ3NpemVzJykgJiYgT2JqZWN0KHIuaykoaS5yYXdTbG90LnNpemVzKSAmJiAoaS5yYXdTbG90LnNpemVzID0gaS5yYXdTbG90LnNpemVzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2ZsdWlkJyAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZXBvcnRFcnJvcihuLCAnc2l6ZUZpbHRlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3JlcG9ydEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IG4gJiYgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGkuYikodCwgJ0FheFNsb3QtJy5jb25jYXQoZSksIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYWF4U2xvdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3ZpZGVvJyAhPT0gdGhpcy5yYXdTbG90Lm1lZGlhVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhmKGUucHJvdG90eXBlKSwgJ2FheFNsb3QnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmMpKCdzbG90VHlwZScsICd2aWRlbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2xvdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG10OiAndicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3Y6IHRoaXMuYWF4U2xvdFBhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgdGhpcy5zaXplcy5sZW5ndGggJiYgKHQucyA9IHRoaXMuc2l6ZXMuZmlsdGVyKHIuaykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuam9pbigneCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLmZsb29yICYmICh0LmZjID0gdGhpcy5mbG9vci5jdXJyZW5jeSwgdC5mcCA9IHRoaXMuZmxvb3IudmFsdWUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnYWF4U2xvdCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Q6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzaXplcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChyLm0pKHRoaXMucmF3U2xvdCwgJ3NpemVzJykgJiYgT2JqZWN0KHIuaykodGhpcy5yYXdTbG90LnNpemVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJzJkJywgbiA9IHRoaXMucmF3U2xvdC5zaXplczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKDAgPCBuLmxlbmd0aCkgfHwgT2JqZWN0KHIuaykoblswXSkgfHwgJ3N0cmluZycgPT0gdHlwZW9mIG5bMF0gJiYgTy50ZXN0KG5bMF0pIHx8IChlID0gJzFkJywgbiA9IFtuXSksIHQgPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gSlNPTi5zdHJpbmdpZnkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IGguaW5kZXhPZihuKSAmJiAoaC5wdXNoKG4pLCBPYmplY3QoaS5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBYXhTbG90LUludmFsaWRTaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgU2xvdCBTaXplOiAnLmNvbmNhdChKU09OLnN0cmluZ2lmeShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnaXNWYWxpZFNpemUtaW52YWxpZCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlICYmIE8udGVzdChlKSA/IChPYmplY3Qoby5jKSgnQWF4U2xvdFNpemVzJywgJycuY29uY2F0KHQsICctY29tcGlsZWQnKSksICEwKSA6IE9iamVjdChyLmspKGUpICYmIDEgIT09IGUubGVuZ3RoID8gKDIgPCBlLmxlbmd0aCAmJiBuKGUpLCBlLnNsaWNlKDAsIDIpLnJlZHVjZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/ICEoJ251bWJlcicgIT0gdHlwZW9mIG4gJiYgJ3N0cmluZycgIT0gdHlwZW9mIG4gfHwgJ3N0cmluZycgPT0gdHlwZW9mIG4gJiYgIWoudGVzdChuKSB8fCAoJ3N0cmluZycgPT0gdHlwZW9mIG4gPyBPYmplY3Qoby5jKSgnQWF4U2xvdFNpemVzJywgJycuY29uY2F0KHQsICctc3RyaW5nJykpIDogT2JqZWN0KG8uYykoJ0FheFNsb3RTaXplcycsICcnLmNvbmNhdCh0LCAnLW51bWJlcicpKSwgMCkpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCkpIDogKG4oZSksICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGkuYikobiwgJ2lzVmFsaWRTaXplJyksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuaykodCkgPyB0IDogdC5zcGxpdCgneCcpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHQsIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ3NpemVzJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmbG9vcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIubSkodGhpcy5yYXdTbG90LCAnZmxvb3InKSAmJiAnVVNEJyA9PT0gdGhpcy5yYXdTbG90LmZsb29yLmN1cnJlbmN5ICYmIFModGhpcy5yYXdTbG90LmZsb29yLnZhbHVlKSA/ICh0ID0gdGhpcy5yYXdTbG90LmZsb29yLCBPYmplY3Qoby5jKSgnY3VzdG9tRmxvb3InLCAneScpKSA6IE9iamVjdChvLmMpKCdjdXN0b21GbG9vcicsICduJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IodCwgJ2Zsb29yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgPT0gdHlwZW9mIHQgJiYgMCA8IHQgJiYgdCAlIDEgPT0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZChlLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geTsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBqOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDEpLCBpID0gbigxNSksIG8gPSBuKDgpLCBjID0gbigzKSwgYSA9IG4oMiksIHMgPSBuKDYpLCB1ID0gbigwKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgdC5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIHQgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0pKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGYgPSBbJ2VtYWlsJ10sIGIgPSAvQC8sIGwgPSAvXlswLTlhLWZBLUZdezY0fSQvLCBwID0gJ25vY29uc2VudCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gcCA/ICdBTVpOLU5vQ29va2llQ29uc2VudCcgOiAnQU1aTi1Ub2tlbic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IHQgOiAnJywgbyA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZSA/IGUgOiAwLCBjID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBuID8gbiA6ICd0b2tlbic7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuZXcgRGF0ZShvKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSAnJy5jb25jYXQobShjKSwgJz0nKS5jb25jYXQoaSwgJzsgZXhwaXJlcz0nKS5jb25jYXQoYSwgJzsgcGF0aD0vOycpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIuYikodCwgJ3NldEFtem5Ub2tlbi0nLmNvbmNhdChjKSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6ICd0b2tlbic7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBPYmplY3QodS5kKSgpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbMF0gPT09IG0odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5sZW5ndGggPyAnJyA6IGVbMF1bMV07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuYikoZSwgJ2dldEFtem5Ub2tlbi0nLmNvbmNhdCh0KSwgITApLCAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogJ2FwaSc7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdCAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsYmFjayBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24sICcuY29uY2F0KGQodCksICcgcHJvdmlkZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgIT0gdHlwZW9mIHQgJiYgKHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnKCksIGcoJycsIDAsICdub2NvbnNlbnQnKSwgT2JqZWN0KGMuYykoJ2lkJywgJ2QtJy5jb25jYXQoZSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHIuYikodCwgJ2RlbGV0ZUlkZW50aXR5JywgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gT2JqZWN0KHMuYSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYS5hLmdldFN0YXRlKCkuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdCh1Lm0pKGksICdwdWJJRCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcHN0YWcuaW5pdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgSUQgZnVuY3Rpb25zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly90ay5hbWF6b24tYWRzeXN0ZW0uY29tL2VudmVsb3BlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIDIwMCA9PT0gdC5zdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gSlNPTi5wYXJzZSh0LnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIG4uQUlQVG9rZW4gfHwgJ251bWJlcicgIT0gdHlwZW9mIG4uY29va2llRXhwaXJ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCksIHZvaWQgT2JqZWN0KHIuYikobmV3IEVycm9yKCdJbnZhbGlkIEFJUEVTIHJlc3BvbnNlJyksICdjYWxsQWlwZXMtcmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnID09PSBuLkFJUFRva2VuID8gKE9iamVjdChjLmMpKCdpZCcsICdlbmRSZXFBaXBlcy10b2tlbkVtcHR5JyksIGcoJzEnLCBuLmNvb2tpZUV4cGlyeSwgcCkpIDogKE9iamVjdChjLmMpKCdpZCcsICdlbmRSZXFBaXBlcy10b2tlbkF2YWlsYWJsZScpLCBnKG4uQUlQVG9rZW4sIG4uY29va2llRXhwaXJ5KSwgT2JqZWN0KGMuZikoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIE9iamVjdChyLmIpKG5ldyBFcnJvcignQUlQRVMgcmVzcG9uc2UgY29kZTogJy5jb25jYXQodC5zdGF0dXMpKSwgJ2NhbGxBaXBlcy1vbmxvYWQnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5iKSh0LCAnY2FsbEFpcGVzLW9ubG9hZCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5iKShuZXcgRXJyb3IoJ0FJUEVTIHJlc3BvbnNlIGNvZGU6ICcuY29uY2F0KHRoaXMuc3RhdHVzKSksICdjYWxsQWlwZXMtb25lcnJvcicsICEwKSwgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udGltZW91dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmIpKG5ldyBFcnJvcignQUlQRVMgcmVxdWVzdCB0aW1lb3V0JyksICdjYWxsQWlwZXMtb250aW1lb3V0JywgITApLCBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVySWQ6IGUucHViSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZWRSZWNvcmRzOiB0Lmhhc2hlZFJlY29yZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZW5hYmxlZCA/IChpLmdkcHIgPSAxLCB2b2lkIDAgIT09IG4uY29uc2VudCAmJiAoaS5nZHByQ29uc2VudCA9IG4uY29uc2VudCkpIDogMCA9PT0gbi5lbmFibGVkICYmIChpLmdkcHIgPSAwKSwgdm9pZCAwICE9PSB0LnR0bCAmJiAoaS50dGwgPSB0LnR0bCksIEpTT04uc3RyaW5naWZ5KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmIpKHQsICdidWlsZEFpcGVzQm9keScsICEwKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBpLCBuKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5jKSgnaWQnLCAnc3RhcnRSZXFBaXBlcycpLCBPYmplY3Qoby5kKShkKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmIpKHQsICdjYWxsQWlwZXMnLCAhMCksIGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDIgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogJ2FwaSc7CiAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSAmJiAoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdCh1LmwpKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdcJ3Rva2VuQ29uZmlnXCcgbXVzdCBiZSBhbiBvYmplY3QsICcuY29uY2F0KCdvYmplY3QnID09PSBkKHQpID8gJ251bGwnIDogZCh0KSwgJyBwcm92aWRlZCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQub3B0T3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgaChlLCAndS1vbycpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAndScpLCBPYmplY3QoYy5jKSgnaWQnLCAndS0nLmNvbmNhdChuKSksICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhT2JqZWN0KHUubSkodCwgJ2dkcHInKSB8fCBPYmplY3QodS5sKSh0LmdkcHIpICYmICFPYmplY3QodS5rKSh0LmdkcHIpID8gT2JqZWN0KHUubSkodCwgJ2dkcHInKSAmJiAoT2JqZWN0KHUubSkodC5nZHByLCAnZW5hYmxlZCcpICYmIC0xID09PSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZih0LmdkcHIuZW5hYmxlZCkgJiYgZS5wdXNoKCdgZ2Rwci5lbmFibGVkYCBtdXN0IGJlIGEgYm9vbGVhbicpLCBPYmplY3QodS5tKSh0LmdkcHIsICdjb25zZW50JykgJiYgJ3N0cmluZycgIT0gdHlwZW9mIHQuZ2Rwci5jb25zZW50ICYmIGUucHVzaCgnXCdnZHByLmNvbnNlbnRcJyBtdXN0IGJlIGEgdmFsaWQgSUFCLWZvcm1hdHRlZCBzdHJpbmcnKSkgOiBlLnB1c2goJ2BnZHByYCBtdXN0IGJlIGFuIE9iamVjdCcpLCBPYmplY3QodS5tKSh0LCAnb3B0T3V0JykgJiYgLTEgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKHQub3B0T3V0KSAmJiBlLnB1c2goJ1wnb3B0T3V0XCcgbXVzdCBiZSBhIGJvb2xlYW4nKSwgT2JqZWN0KHUubSkodCwgJ2hhc2hlZFJlY29yZHMnKSAmJiBPYmplY3QodS5rKSh0Lmhhc2hlZFJlY29yZHMpID8gMSAhPT0gdC5oYXNoZWRSZWNvcmRzLmxlbmd0aCA/IGUucHVzaCgnXCdoYXNoZWRSZWNvcmRzXCcgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGl0ZW0nKSA6IHQuaGFzaGVkUmVjb3Jkcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QodS5tKSh0LCAndHlwZScpICYmIC0xICE9PSBmLmluZGV4T2YodC50eXBlKSB8fCBlLnB1c2goJ1wndHlwZVwnIG11c3QgYmUgXCdlbWFpbFwnIGluIGl0ZW0gXCcnLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0KSwgJ1wnJykpLCBPYmplY3QodS5tKSh0LCAnZW5jcnlwdGVkJykgJiYgJ2Jvb2xlYW4nICE9IHR5cGVvZiB0LmVuY3J5cHRlZCAmJiBlLnB1c2goJ1wnZW5jcnlwdGVkXCcgbXVzdCBiZSBhIGJvb2xlYW4gaW4gaXRlbSBcJycuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCAnXCcnKSksIE9iamVjdCh1Lm0pKHQsICdyZWNvcmQnKSAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgdC5yZWNvcmQgPyB0LmVuY3J5cHRlZCB8fCBsLnRlc3QodC5yZWNvcmQpID8gdC5lbmNyeXB0ZWQgJiYgYi50ZXN0KHQucmVjb3JkKSAmJiBlLnB1c2goJ1wncmVjb3JkXCcgbXVzdCBOT1QgYmUgYW4gdW4taGFzaGVkLCB1bi1lbmNyeXB0ZWQgZW1haWwnKSA6IGUucHVzaCgnXCdyZWNvcmRcJyBtdXN0IGJlIGEgU0hBMjU2IGhhc2ggaW4gaXRlbSBcJycuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCAnXCcnKSkgOiBlLnB1c2goJ1wncmVjb3JkXCcgbXVzdCBiZSBhIHN0cmluZyBpbiBpdGVtIFwnJy5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCksICdcJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlLnB1c2goJ1wnaGFzaGVkUmVjb3Jkc1wnIG11c3QgYmUgYW4gYXJyYXknKSwgT2JqZWN0KHUubSkodCwgJ3R0bCcpICYmICgnbnVtYmVyJyAhPSB0eXBlb2YgdC50dGwgfHwgaXNOYU4odC50dGwpIHx8IHQudHRsIDw9IDAgfHwgdC50dGwgJSAxICE9IDApICYmIGUucHVzaCgnXCd0dGxcJyBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpLCAwIDwgZS5sZW5ndGggPyB2b2lkIE9iamVjdChyLmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUb2tlbkNvbmZpZ1ZhbGlkYXRpb25FcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVGhlcmUgd2FzIGFuIGlzc3VlIHdpdGggdGhlIFRva2VuQ29uZmlnIHByb3ZpZGVkICcuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCAnOlxuJykgKyBlLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnLSAnLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJ1xuJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ3ZhbGlkYXRlVG9rZW5Db25maWctaW52YWxpZCcsICEwKSA6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3Qoci5iKSh0LCAndmFsaWRhdGVUb2tlbkNvbmZpZycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoaS5hKSh0LmdkcHIsIE8uYmluZChudWxsLCB0LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5iKSh0LCAndXBkYXRlSWRlbnRpdHknLCAhMCksIGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nICE9IHR5cGVvZiBlICYmIChlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KHUubCkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wndG9rZW5Db25maWdcJyBtdXN0IGJlIGFuIG9iamVjdCwgJy5jb25jYXQoJ29iamVjdCcgPT09IGQodCkgPyAnbnVsbCcgOiBkKHQpLCAnIHByb3ZpZGVkJykpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5vcHRPdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBoKGUsICdyLW9vJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyAhPT0geSgnbm9jb25zZW50JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyAhPT0geSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKSwgdm9pZCBPYmplY3QoYy5jKSgnaWQnLCAnci1ub29wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGoodCwgZSwgJ3InKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmIpKHQsICdyZW5ld0lkZW50aXR5JywgITApLCBlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMSksIGkgPSBuKDMpLCBvID0gbigwKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGModCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYyA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgdC5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIHQgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0pKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3Qua2V5cyh0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZSkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuLnB1c2guYXBwbHkobiwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBudWxsICE9IGFyZ3VtZW50c1tlXSA/IGFyZ3VtZW50c1tlXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBlICUgMiA/IGEoT2JqZWN0KG4pLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdSh0LCBlLCBuW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKSA6IGEoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogdFtlXSA9IG4sIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBOdW1iZXIuaXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgdCAmJiBpc0Zpbml0ZSh0KSAmJiBNYXRoLmZsb29yKHQpID09PSB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBkID0gJ19fY21wJywgZiA9ICdfX3RjZmFwaSc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICExLCBhID0geyBsb2c6IHsgc3RhdHVzOiAnbm8tc3RhdHVzJyB9IH0sIHUgPSA1MCwgYiA9ICdnbG9iYWwtZnVuYy1lcnJvcic7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCAobiA9ICEwLCBlKHMocyh7fSwgYSksIHt9LCB7IGxvZzogcyh7fSwgYS5sb2cpIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUgPSBPYmplY3Qoci5kKShlLCAnR2RwckNhbGxiYWNrJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAnbnVsbCc7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIU9iamVjdChvLmwpKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmxvZy5zdGF0dXMgPSAnJy5jb25jYXQocCwgJy1lcnJvcicpLCB2b2lkIGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nLnN0YXR1cyA9ICcnLmNvbmNhdChwLCAnLXN1Y2Nlc3MnKSwgT2JqZWN0KG8ubSkodCwgJ3RjU3RyaW5nJykgPyBhLmNvbnNlbnQgPSB0LnRjU3RyaW5nIDogT2JqZWN0KG8ubSkodCwgJ2NvbnNlbnREYXRhJykgJiYgKGEuY29uc2VudCA9IHQuY29uc2VudERhdGEpLCBhLmVuYWJsZWQgPSB0LmdkcHJBcHBsaWVzID8gMSA6IDAsIDAgPT09IGEuZW5hYmxlZCAmJiBkZWxldGUgYS5jb25zZW50LCBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nLnN0YXR1cyA9ICdmdW5jLWVycm9yJywgbCgpLCBPYmplY3Qoci5iKSh0LCAnY21wQ2FsbGJhY2stJy5jb25jYXQocCksICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgPT09ICh0ID0gT2JqZWN0KG8ubCkodCkgPyBzKHt9LCB0KSA6IHt9KS5lbmFibGVkIHx8IDAgPT09IHQuZW5hYmxlZCA/IChhLmxvZy5zdGF0dXMgPSAnZXhwbGljaXQtbm8tZ2RwcicsIGEuZW5hYmxlZCA9IDApIDogITAgPT09IHQuZW5hYmxlZCB8fCAxID09PSB0LmVuYWJsZWQgPyAoYS5sb2cuc3RhdHVzID0gT2JqZWN0KG8ubSkodCwgJ2NvbnNlbnQnKSA/ICdleHBsaWNpdC1jb25zZW50LXBhc3NlZCcgOiAnZXhwbGljaXQtbm8tY29uc2VudC1wYXNzZWQnLCBhLmVuYWJsZWQgPSAxLCBhLmNvbnNlbnQgPSB0LmNvbnNlbnQpIDogT2JqZWN0KG8ubSkodCwgJ2VuYWJsZWQnKSAmJiAoYS5sb2cuc3RhdHVzID0gT2JqZWN0KG8ubSkodCwgJ2NvbnNlbnQnKSA/ICdtYWxmb3JtZWQtd2l0aC1jb25zZW50JyA6ICdtYWxmb3JtZWQtd2l0aG91dC1jb25zZW50JywgYS5jb25zZW50ID0gdC5jb25zZW50LCBOdW1iZXIuaXNJbnRlZ2VyKHQuZW5hYmxlZCkgPyBhLmVuYWJsZWQgPSB0LmVuYWJsZWQgOiBhLmVuYWJsZWQgPSAxKSwgT2JqZWN0KG8ubSkodCwgJ2VuYWJsZWQnKSAmJiAoYS5sb2cuZW5hYmxlZCA9IHQuZW5hYmxlZCksIE9iamVjdChvLm0pKHQsICdjbXBUaW1lb3V0JykgJiYgTnVtYmVyLmlzSW50ZWdlcih0LmNtcFRpbWVvdXQpICYmICh1ID0gdC5jbXBUaW1lb3V0LCBhLmxvZy5jbXBUaW1lb3V0ID0gdSksIHZvaWQgMCAhPT0gYS5lbmFibGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChpLmMpKCdnZHByJywgJ3B1Yi1hcGknKSwgT2JqZWN0KG8ubSkoYSwgJ2NvbnNlbnQnKSAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgYS5jb25zZW50ICYmIChkZWxldGUgYS5jb25zZW50LCBPYmplY3Qoci5iKShuZXcgRXJyb3IoJ0ludmFsaWQgY29uc2VudDogbXVzdCBiZSBzdHJpbmcsIGdpdmVuICcuY29uY2F0KGMoYS5jb25zZW50KSkpLCAnZ2V0R2RwckNvbmZpZy1wdWItY29uc2VudC1pbnZhbGlkJywgITApKSwgdm9pZCBsKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoci5iKSh0LCAnZ2V0R2RwckNvbmZpZy1wYXJzZUNvbmZpZycsICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChvLm0pKHdpbmRvdywgZikgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygd2luZG93W2ZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9ICd0Y2Z2Mic7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qoby5tKSh3aW5kb3csIGQpIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIHdpbmRvd1tkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGkuYykoJ2dkcHInLCAnbm8tY21wJyksIGEubG9nLnN0YXR1cyA9ICduby1jbXAnLCB2b2lkIGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAnY21wJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoaS5jKSgnZ2RwcicsIHApLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nLnN0YXR1cyA9ICcnLmNvbmNhdChwLCAnLXRpbWVvdXQnKSwgbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB1KSwgYiA9ICcnLmNvbmNhdChwLCAnLWludGVybmFsLWVycm9yJyksICdjbXAnID09PSBwID8gd2luZG93W2RdKCdnZXRDb25zZW50RGF0YScsIG51bGwsIG0pIDogd2luZG93W2ZdKCdnZXRUQ0RhdGEnLCAyLCBtKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nLnN0YXR1cyA9IGIsIGwoKSwgT2JqZWN0KHIuYikodCwgJ2dldEdkcHJDb25maWctJy5jb25jYXQoYiksICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMCksIGkgPSBuKDEzKSwgbyA9IG4oMSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIHQuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiB0ICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9KSh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCwgZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghKHQgaW5zdGFuY2VvZiBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW25dOwogICAgICAgICAgICAgICAgICAgICAgICByLmVudW1lcmFibGUgPSByLmVudW1lcmFibGUgfHwgITEsIHIuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gciAmJiAoci53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHIua2V5LCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBzKHQucHJvdG90eXBlLCBlKSwgbiAmJiBzKHQsIG4pLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGUgJiYgbnVsbCAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZSAmJiBlLnByb3RvdHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZSAmJiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAoT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fX3Byb3RvX18gPSBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9KHQsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZih0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgUmVmbGVjdCB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWZsZWN0LmNvbnN0cnVjdC5zaGFtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBvID0gbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbCh0aGlzKS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBSZWZsZWN0LmNvbnN0cnVjdChvLCBhcmd1bWVudHMsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gdGhpcywgIShpID0gbikgfHwgJ29iamVjdCcgIT09IGMoaSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgaSA/IGIocikgOiBpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoJ3RoaXMgaGFzblwndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuXCd0IGJlZW4gY2FsbGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGwgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpOwogICAgICAgICAgICAgICAgICAgIH0pKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW4gdCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiB0W2VdID0gbiwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkKGUsIGkuYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKHRoaXMsIGUpLCBwKGIociA9IHQuY2FsbCh0aGlzLCBuLmdldFNsb3RFbGVtZW50SWQoKSwgbi5nZXRBZFVuaXRQYXRoKCkpKSwgJ3Jhd1Nsb3QnLCB2b2lkIDApLCBwKGIociksICdtZWRpYVR5cGUnLCAnZGlzcGxheScpLCByLnJhd1Nsb3QgPSBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXBvcnRFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBuICYmIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmIpKHQsICdHcHRTbG90LScuY29uY2F0KGUpLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhd1Nsb3Quc2V0VGFyZ2V0aW5nKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdzZXRUYXJnZXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0VGFyZ2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJhd1Nsb3QuZ2V0VGFyZ2V0aW5nKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnZ2V0VGFyZ2V0aW5nJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbGVhclRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhd1Nsb3QuY2xlYXJUYXJnZXRpbmcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IodCwgJ2NsZWFyVGFyZ2V0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NpemVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KHIuaCkod2luZG93KS5zcGxpdCgneCcpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlID0gdGhpcy5yYXdTbG90LmdldFNpemVzKHRbMF0sIHRbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IGUgPyBbXSA6IGUuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmbHVpZCcgIT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0SGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICdzaXplcycpLCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBnID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkKGUsIGkuYik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoLCBpID0gbmV3IEFycmF5KHIpLCBvID0gMDsgbyA8IHI7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW29dID0gYXJndW1lbnRzW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAoYihuID0gdC5jYWxsLmFwcGx5KHQsIFt0aGlzXS5jb25jYXQoaSkpKSwgJ2lzU3VwcG9ydGVkJywgITApLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXBvcnRFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmIpKHQsICdHb29nbGV0YWdBZFNlcnZlci0nLmNvbmNhdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbWRRdWV1ZVB1c2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmdvb2dsZXRhZy5jbWQucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRFcnJvcih0LCAnY21kUXVldWVQdXNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3Nsb3RSZW5kZXJFbmRlZEV2ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcignc2xvdFJlbmRlckVuZGVkJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBtKGUuc2xvdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdzbG90UmVuZGVyRW5kZWRFdmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZXRUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmdvb2dsZXRhZy5wdWJhZHMoKS5zZXRUYXJnZXRpbmcodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IodCwgJ3NldFRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0VGFyZ2V0aW5nKHQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnZ2V0VGFyZ2V0aW5nJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjbGVhclRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZ29vZ2xldGFnLnB1YmFkcygpLmNsZWFyVGFyZ2V0aW5nKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydEVycm9yKHQsICdjbGVhclRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdoYXNBZFNlcnZlck9iamVjdExvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5tKSh3aW5kb3csICdnb29nbGV0YWcnKSAmJiBPYmplY3Qoci5tKSh3aW5kb3cuZ29vZ2xldGFnLCAnYXBpUmVhZHknKSAmJiAhMCA9PT0gd2luZG93Lmdvb2dsZXRhZy5hcGlSZWFkeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVwb3J0RXJyb3IodCwgJ2hhc0FkU2VydmVyT2JqZWN0TG9hZGVkJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpc0NvbW1hbmRRdWV1ZURlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIubSkod2luZG93LCAnZ29vZ2xldGFnJykgJiYgT2JqZWN0KHIubSkod2luZG93Lmdvb2dsZXRhZywgJ2NtZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBvcnRFcnJvcih0LCAnaXNDb21tYW5kUXVldWVEZWZpbmVkJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRTbG90cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZ29vZ2xldGFnLnB1YmFkcygpLmdldFNsb3RzKCkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBtKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydEVycm9yKHQsICdnZXRTbG90cycpLCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKGUsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigxKSwgaSA9IG4oMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghT2JqZWN0KGkubSkodCwgJyRzZicpIHx8ICFPYmplY3QoaS5tKSh0LiRzZiwgJ2V4dCcpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnaXNTYWZlRnJhbWUnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlubmVyV2lkdGgsIGkgPSBlLmlubmVySGVpZ2h0LCBvID0gcGFyc2VJbnQodFswXSwgMTApLCBjID0gcGFyc2VJbnQodFsxXSwgMTApLCBhID0gbyAtIG4sIHMgPSBjIC0gaSwgdSA9IGUuc2ZBUEkgfHwgZS4kc2YuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChuID09PSBvICYmIGkgPT09IGMgfHwgKHUucmVnaXN0ZXIobywgYyksIHUuZXhwYW5kKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmIpKHQsICdleHBhbmRTZicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxID09PSB0LmlubmVyV2lkdGggJiYgMSA9PT0gdC5pbm5lckhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci5iKSh0LCAnaXMxeDFDcmVhdGl2ZScpLCAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfSksIG4uZChlLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pLCBuLmQoZSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbig4KSwgYyA9IG4oMSksIGEgPSBuKDQpLCBzID0gbig1KSwgdSA9IG4oMiksIGQgPSBuKDYpLCBiID0gbigwKSwgcCA9IG4oMTApLCBtID0gbigzKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9mN2VjYjUxYWJiZGE5NTYyID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2Y3ZWNiNTFhYmJkYTk1NjIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfYmExYzZiYTU1ZGZlNjZmMS5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5hLmdldFN0YXRlKCkuZXhwZXJpbWVudHMuc2hvdWxkU2FtcGxlTGF0ZW5jeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYi5pKSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYS5qKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh3aW5kb3cuYXBzdGFnLnRoaXJkUGFydHlEYXRhLmlkcyA9IEpTT04ucGFyc2UodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBEYXRlLm5vdygpLCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGYoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyMDAgPT09IGUuc3RhdHVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX0xJQlJBUllfTE9BRF9DQUxMX0xBVEVOQ1knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeTogRGF0ZS5ub3coKSAtIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgJiYgc2V0VGltZW91dChtLmQsIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEpTT04ucGFyc2UoZS5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoblsnM3B2ZW5kb3InXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5iKSh0LCAnbG9hZDNQTGlicmFyeUNvbmZpZy1vbmxvYWQnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qoby5kKShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYy5iKSh0LCAnbG9hZDNQTGlicmFyeUNvbmZpZycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgc2V0VGltZW91dChtLmQsIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZjdlY2I1MWFiYmRhOTU2MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2Y3ZWNiNTFhYmJkYTk1NjIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBlID0gdS5hLmdldFN0YXRlKCksIG4gPSBlLmNvbmZpZywgciA9IE9iamVjdChzLmMpKCdob3N0JywgZS5ob3N0cy5ERUZBVUxUX0FBWF9CSURfSE9TVCksIGkgPSBlLmNmZy5MSUJfQ09ORklHX1BBVEg7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IG4uaXNTZWxmU2VydmVQdWIgPyBhLnMgOiBuLnB1YklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdTogT2JqZWN0KGQuZykod2luZG93KQogICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmlzU2VsZlNlcnZlUHViICYmICh0LnB1YmlkID0gbi5wdWJJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGUsICc9JykuY29uY2F0KHRbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQoYS5yKS5jb25jYXQocikuY29uY2F0KGksICc/JykuY29uY2F0KG8pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChjLmIpKGUsICdidWlsZExpYnJhcnlDb25maWdVcmwnLCAhMCksICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChiLm0pKHdpbmRvdywgJ2NyZWF0aXZlVmVuZG9yTGlicmFyeUxvYWRlZCcpICYmICEwID09PSB3aW5kb3cuY3JlYXRpdmVWZW5kb3JMaWJyYXJ5TG9hZGVkIHx8IE9iamVjdChiLm0pKHdpbmRvdywgJ2NvbmZpYW50Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgIHQgPSB7IHJlbmRlclRpbWVzOiB7fSB9LCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYi5sKShlLmRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYi5tKShlLmRhdGEsICdiaWRJbmZvJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChiLm0pKGUuZGF0YS5iaWRJbmZvLCAnc3JjJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmRhdGEuYmlkSW5mby5zcmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuZXcgVVJMKHIpLnNlYXJjaFBhcmFtcy5nZXQoJ2InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE9iamVjdChiLm0pKGUuZGF0YS5iaWRJbmZvLCAnanNvbnAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuZGF0YS5iaWRJbmZvLmpzb25wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gSlNPTi5wYXJzZShpLnN1YnN0cigxNywgaS5sZW5ndGggLSAyMCkpLmFtem5paWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChiLm0pKGUuZGF0YSwgJ3JlbmRlckRhdGEnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5kYXRhLnJlbmRlckRhdGEsIGMgPSBvLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYi5tKShvLCAncmVuZGVyU3RhcnQnKSB8fCBPYmplY3QoYi5tKShvLCAncmVuZGVyRW5kJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvLnJlbmRlclN0YXJ0LCBzID0gby5yZW5kZXJFbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZW5kZXJUaW1lc1tjXSA9IHsgdGltZVN0YW1wOiBhIH0sIG4gJiYgKHQucmVuZGVyVGltZXNbY10uYmlkSWQgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocyAmJiBPYmplY3QoYi5tKSh0LnJlbmRlclRpbWVzLCBjKSAmJiAwICE9PSB0LnJlbmRlclRpbWVzW2NdLnRpbWVTdGFtcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBzIC0gdC5yZW5kZXJUaW1lc1tjXS50aW1lU3RhbXAsIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlOiAnaWZyYW1lUmVuZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogJ2R0YicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZDogcC5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnQ6IHUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZW5kZXJUaW1lc1tjXS5iaWRJZCAmJiAobiA9IHQucmVuZGVyVGltZXNbY10uYmlkSWQpLCBuID8gT2JqZWN0KG0uYSkobiwgZCkgOiBPYmplY3QobS5iKShkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYi5tKShlLmRhdGEsICdibG9ja0RhdGEnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZS5kYXRhLmJsb2NrRGF0YS5ibG9ja0luZm8sIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ21hbHdhcmVCbG9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiAnZHRiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwYnI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQ6IHAuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm86IGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID8gT2JqZWN0KG0uYSkobiwgbCkgOiBPYmplY3QobS5iKShsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hcHN0YWcudGhpcmRQYXJ0eURhdGEuaWRzID8gZSh3aW5kb3cuYXBzdGFnLnRoaXJkUGFydHlEYXRhLmlkcykgOiBlKHt9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQuYW16bmlpZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQua3ZNYXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQoZSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgbi5kKGUsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNCksIGkgPSBuKDApLCBvID0gbigxKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGModCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaS5tKSh0LCAnZGVidWcnKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoby5iKSh0LCAnaXNBcHN0YWdMaWJyYXJ5JyksICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIU9iamVjdChpLm0pKHQsIHIuYSkgJiYgITAgPT09IHRbci5hXTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoby5iKSh0LCAnaGFzQXBzdGFnSnNMb2FkZWQnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IG4oMjcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5yKGUpOwogICAgICAgICAgICAgICAgdmFyIHp0ID0gbigxNSksIHh0ID0gbigyKSwgQnQgPSBuKDYpLCBMdCA9IG4oMCksIE50ID0gbigxMiksIHF0ID0gbig1KSwgRnQgPSBuKDQpLCBVdCA9IG4oMTEpLCBNdCA9IG4oMTcpLCBIdCA9IG4oMyksIFF0ID0gbigxKSwgWHQgPSBuKDgpLCBHdCA9IG4oMTYpLCByID0gbigyMCksIFZ0ID0gbig3KSwgS3QgPSBuKDEwKSwgSnQgPSBuKDEzKSwgWXQgPSBuKDE5KSwgV3QgPSBuKDkpLCAkdCA9IG4oMTgpLCBadCA9IG4oMTQpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdGUodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhKHQpIHx8IGModCkgfHwgbyh0KSB8fCBpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSBuICYmIHQuY29uc3RydWN0b3IgJiYgKG4gPSB0LmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbiA/IEFycmF5LmZyb20odCkgOiAnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSA/IHModCwgZSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBlIHx8IGUgPiB0Lmxlbmd0aCkgJiYgKGUgPSB0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDAsIHIgPSBuZXcgQXJyYXkoZSk7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHJbbl0gPSB0W25dOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3Qua2V5cyh0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZSkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuLnB1c2guYXBwbHkobiwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZWUodCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbCAhPSBhcmd1bWVudHNbZV0gPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAlIDIgPyB1KE9iamVjdChuKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lKHQsIGUsIG5bZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpIDogdShPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbmUodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgZSwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogdFtlXSA9IG4sIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgdC5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIHQgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0pKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IE9iamVjdChyLmIpKHdpbmRvdy5hcHN0YWcpOwogICAgICAgICAgICAgICAgICAgIGQgPyBPYmplY3QoUXQuYikobmV3IEVycm9yKCdhcHN0YWcgaGFzIGFscmVhZHkgbG9hZGVkIC0gcHJldmVudGluZyBkdXBsaWNhdGUgbG9hZCcpLCAnYXBzdGFnLWR1cGxpY2F0ZUxvYWQnLCAhMCkgOiAoT2JqZWN0KHIuYSkod2luZG93KSAmJiBPYmplY3QoUXQuYikobmV3IEVycm9yKCdhcHN0YWcgd2FzIGxvYWRlZCBhbmQgdGhlbiBkZXN0cm95ZWQnKSwgJ2Fwc3RhZy1kZXN0cm95UmVsb2FkJywgITApLCB3aW5kb3cuYXBzdGFnTE9BREVEID0gITAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBPYmplY3QoVXQuZSkod2luZG93LCAnbmF2aWdhdGlvblN0YXJ0JyksIHQgPSAnbHMnLCBlID0gT2JqZWN0KHF0LmQpKCdjb25zb2xlJykgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYW16bl9kZWJ1Z19jb25zb2xlPTEnKSAmJiAodCA9ICd1cmwnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBuID0gT2JqZWN0KHF0LmQpKCdjb25zb2xlX3YyJykgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYW16bl9kZWJ1Z19jb25zb2xlPTInKSAmJiAodCA9ICd1cmwnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50cyA9IERhdGUubm93KCksIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnTE9HX0VWRU5UJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19sb2dFdmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4dC5hLmdldFN0YXRlKCkuY21wRmlyZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goeyB0eXBlOiAnQ01QX0ZJUkVEJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIGUuc3JjID0gdCwgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfZG9Db29raWVNYXRjaC1yZWFkeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvYWRpbmcnID09PSBkb2N1bWVudC5yZWFkeVN0YXRlID8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICExKSA6IGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfZG9Db29raWVNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHh0LmEuZ2V0U3RhdGUoKS5jZmcuQ09PS0lFX01BVENIX0RFTEFZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEx0Lm0pKHQsICdjbXAnKSA/IGkodC5jbXApIDogT2JqZWN0KEx0Lm0pKHQsICdjbXBqcycpICYmIE9iamVjdChYdC5iKSh0LmNtcGpzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfdHJ5Q29va2llTWF0Y2gtc2V0VGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfdHJ5Q29va2llTWF0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF4dC5hLmdldFN0YXRlKCkuZXhwZXJpbWVudHMuY2h1bmtSZXF1ZXN0cyB8fCAwID09PSB4dC5hLmdldFN0YXRlKCkuYmlkUmVxc1t0LnNwbGl0KCctJylbMF1dLm5ldHdvcmtSZXFzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbkZsaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChRdC5iKSh0LCAnX2lzUmVxdWVzdENvbXBsZXRlJyksIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF4dC5hLmdldFN0YXRlKCkuYmlkUmVxc1t0XS5oYXNDYWxsYmFja0V4ZWN1dGVkICYmIGModCkgJiYgKHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX0NBTExCQUNLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfY2hlY2tBbmRDYWxsQ2FsbGJhY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5nZXRTdGF0ZSgpLmV4cGVyaW1lbnRzLmNodW5rUmVxdWVzdHMgJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfTkVUV09SS19FWENIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZDogdFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNoYW5nZVR5cGU6ICdyZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJRDogcGFyc2VJbnQodFsxXSwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfcmVjb3JkUmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKHQsIHIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5zcGxpdCgnLScpLCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnJlc3BvbnNlVGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKG4pLCBhKGlbMF0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX3hockJpZC1vbmxvYWQnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhpKSwgYShpWzBdLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ194aHJCaWQtb25lcnJvcicsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChYdC5kKShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ194aHJCaWQnLCAhMCksIHMoaSksIGEoaVswXSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZXRUaW1lKGUuZ2V0VGltZSgpICsgMTAwMCAqIHQpLCBlLnRvVVRDU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChRdC5iKSh0LCAnX2dldENvb2tpZUV4cGlyeScpLCAnVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoTHQubSkodCwgJ2NyJykgJiYgdC5jci5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICcnLmNvbmNhdCh0LmssICc9JykuY29uY2F0KHQudiwgJztleHBpcmVzPScpLmNvbmNhdCgtMSAhPT0gdC5leHAgPyB1KHQuZXhwKSA6IE9iamVjdChMdC5nKSgzNjUpLCAnO3BhdGg9LzsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19zZXRGaXJzdFBhcnR5Q29va2llcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KEx0Lm0pKHQsICdjYicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1JFQ09SRF9BQVhfUkVRX1BST1AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkUmVxSUQ6IHQuY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXNUcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRGF0ZS5ub3coKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgUmVnRXhwKCdlL2R0Yi9iaWQuKmNiPScuY29uY2F0KHQuY2IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX0FBWF9SRVFfUFJPUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXFJRDogdC5jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3BlcmYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE9iamVjdChVdC5jKSh3aW5kb3csIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoTHQubSkodCwgJ2NmZycpICYmIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0VUX0NGRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZzogdC5jZmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgSyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19kb09uQWF4UmVzcG9uc2UnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzNiMTQ4MTY3YmVjMjZjMDYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzNiMTQ4MTY3YmVjMjZjMDYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19iYTFjNmJhNTVkZmU2NmYxLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyh0KSwgZCh0KSwgT2JqZWN0KEx0Lm0pKHQsICdjZmcnKSAmJiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShGdC5jLCBKU09OLnN0cmluZ2lmeSh0LmNmZykpLCBPYmplY3QoTHQubSkodCwgJ3N0JykgJiYgT2JqZWN0KEx0LmopKHQuc3QsIDkxNykgJiYgeHQuYS5nZXRTdGF0ZSgpLnN5bmM5MTcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9TWU5DXzkxNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX19lcnJvci1kb0ZiU3luY19fJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSh0KSwgT2JqZWN0KEJ0LmopKHQpIHx8IE9iamVjdChIdC5mKSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19kb0FmdGVyQWF4UmVzcG9uc2UnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzNiMTQ4MTY3YmVjMjZjMDYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzNiMTQ4MTY3YmVjMjZjMDYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChMdC5tKSh0LCAnZnAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuZnA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChMdC5tKShlLCAnbGVuZ3RoJykgJiYgZS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuZCA/IHQuZCA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoSHQuZSkodC5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdmaXJlQUFYUGl4ZWxzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5nZXRTdGF0ZSgpLlEuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICdpbml0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0WzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICdpbml0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAnZmV0Y2hCaWRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gJ2RlbGV0ZUlkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdyaSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gJ3JlbmV3SWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VpJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAndXBkYXRlSWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFwc3RhZ1tlXS5hcHBseShudWxsLCB0WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19RSGFuZGxlcicsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEx0LmwpKHQpIHx8IChPYmplY3QoUXQuYykoJ2luaXQuY29uZmlnJywgcmUodCksICdvYmplY3QnKSwgdCA9IHsgcHViSUQ6ICdlcnInIH0pLCBPYmplY3QoV3QuYikodC5wdWJJRCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSA/ICdudW1iZXInID09IHR5cGVvZiB0LnB1YklEICYmICh0LnB1YklEID0gJycuY29uY2F0KHQucHViSUQpKSA6IE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcucHViSUQnLCByZSh0LnB1YklEKSwgJ3N0cmluZycpLCBPYmplY3QoV3QuYikodC5hZFNlcnZlciwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCBPYmplY3QoUXQuYykoJ2luaXQuY29uZmlnLmFkU2VydmVyJywgcmUodC5hZFNlcnZlciksICdzdHJpbmcnKSwgT2JqZWN0KFd0LmEpKHQuYmlkVGltZW91dCkgfHwgKCdzdHJpbmcnID09IHR5cGVvZiB0LmJpZFRpbWVvdXQgPyBPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc3RyaW5nLScuY29uY2F0KHQuYmlkVGltZW91dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpbml0LmNvbmZpZy5iaWRUaW1lb3V0IHdhcyBhIG5vbi1udW1lcmljIHN0cmluZyBcJycuY29uY2F0KHQuYmlkVGltZW91dCwgJ1wnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnVHlwZUVycm9yLWluaXQuY29uZmlnLmJpZFRpbWVvdXQnLCAhMCkgOiBPYmplY3QoUXQuYykoJ2luaXQuY29uZmlnLmJpZFRpbWVvdXQnLCByZSh0LmJpZFRpbWVvdXQpLCAnbnVtYmVyJykpLCBPYmplY3QoV3QuYikodC5nZHByLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pID8gJ29iamVjdCcgPT09IHJlKHQuZ2RwcikgJiYgKE9iamVjdChXdC5hKSh0LmdkcHIuY21wVGltZW91dCkgfHwgKE9iamVjdChXdC5iKSh0LmdkcHIuY21wVGltZW91dCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSA/IE9iamVjdChRdC5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdHJpbmctJy5jb25jYXQodC5iaWRUaW1lb3V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2luaXQuY29uZmlnLmdkcHIuY21wVGltZW91dCB3YXMgYSBub24tbnVtZXJpYyBzdHJpbmcgXCcnLmNvbmNhdCh0LmdkcHIuY21wVGltZW91dCwgJ1wnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnVHlwZUVycm9yLWluaXQuY29uZmlnLmdkcHIuY21wVGltZW91dCcsICEwKSA6IE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcuZ2Rwci5jbXBUaW1lb3V0JywgcmUodC5nZHByLmNtcFRpbWVvdXQpLCAnbnVtYmVyJykpKSA6IE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcuZ2RwcicsIHJlKHQuZ2RwciksICdvYmplY3QnKSwgT2JqZWN0KEx0Lm0pKHQsICdwYXJhbXMnKSAmJiAhT2JqZWN0KEx0LmwpKHQucGFyYW1zKSA/IE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcucGFyYW1zJywgcmUodC5wYXJhbXMpLCAnb2JqZWN0JykgOiBPYmplY3QoTHQubSkodCwgJ3BhcmFtcycpICYmIE9iamVjdC5rZXlzKHQucGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFPYmplY3QoTHQubSkodCwgJ3BhcmFtcycpIHx8ICdzdHJpbmcnICE9IHR5cGVvZiB0LnBhcmFtc1tlXSAmJiAnbnVtYmVyJyAhPSB0eXBlb2YgdC5wYXJhbXNbZV0gJiYgKE9iamVjdChMdC5rKSh0LnBhcmFtc1tlXSkgPyAhdC5wYXJhbXNbZV0ucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAoJ3N0cmluZycgPT0gdHlwZW9mIGUgfHwgJ251bWJlcicgPT0gdHlwZW9mIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCkgJiYgKE9iamVjdChRdC5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbm9uLXN0cmluZyBhcnJheSBpdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdcJ2luaXQuY29uZmlnLnBhcmFtcy4nLmNvbmNhdChlLCAnIGNvbnRhaW5zIGEgbm9uLXN0cmluZyBpdGVtJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ1R5cGVFcnJvci1pbml0LmNvbmZpZy5wYXJhbXMuJy5jb25jYXQoZSksICEwKSwgMSkgOiAoT2JqZWN0KFF0LmMpKCdpbml0LmNvbmZpZy5wYXJhbXMuJy5jb25jYXQoZSksIHJlKHQucGFyYW1zW2VdKSwgJ3N0cmluZ1wnIG9yIFwnYXJyYXknKSwgMSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KEx0Lm0pKHQsICdwYXJhbXMnKSAmJiBPYmplY3QoTHQubSkodC5wYXJhbXMsICd1c19wcml2YWN5JykgJiYgJ3N0cmluZycgPT0gdHlwZW9mIHQucGFyYW1zLnVzX3ByaXZhY3kgJiYgRnQueC50ZXN0KHQucGFyYW1zLnVzX3ByaXZhY3kpID8gT2JqZWN0KEh0LmMpKCdjY3BhJywgJ3knKSA6IE9iamVjdChMdC5tKSh0LCAncGFyYW1zJykgJiYgT2JqZWN0KEx0Lm0pKHQucGFyYW1zLCAndXNfcHJpdmFjeScpID8gT2JqZWN0KEh0LmMpKCdjY3BhJywgJ2knKSA6IE9iamVjdChIdC5jKSgnY2NwYScsICduJyksIE9iamVjdChMdC5tKSh0LCAnYmxvY2tlZEJpZGRlcnMnKSAmJiAhT2JqZWN0KEx0LmspKHQuYmxvY2tlZEJpZGRlcnMpID8gT2JqZWN0KFF0LmMpKCdpbml0LmNvbmZpZy5ibG9ja2VkQmlkZGVycycsIHJlKHQuYmxvY2tlZEJpZGRlcnMpLCAnYXJyYXknKSA6IE9iamVjdChMdC5tKSh0LCAnYmxvY2tlZEJpZGRlcnMnKSAmJiBPYmplY3QoTHQuaykodC5ibG9ja2VkQmlkZGVycykgJiYgKHQuYmxvY2tlZEJpZGRlcnMucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSB8fCAnbnVtYmVyJyA9PSB0eXBlb2YgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApIHx8IE9iamVjdChRdC5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdub24tc3RyaW5nIGFycmF5IGl0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnXCdpbml0LmNvbmZpZy5ibG9ja2VkQmlkZGVycyBjb250YWlucyBhIG5vbi1zdHJpbmcgaXRlbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnVHlwZUVycm9yLWluaXQuY29uZmlnLmJsb2NrZWRCaWRkZXJzJywgITApKSwgT2JqZWN0KEx0Lm0pKHQsICdibG9ja2VkQmlkZGVycycpID8gT2JqZWN0KEh0LmMpKCdibG9ja2VkQmlkZGVycy1pbml0JywgJ3knKSA6IE9iamVjdChIdC5jKSgnYmxvY2tlZEJpZGRlcnMtaW5pdCcsICduJyksIE9iamVjdChXdC5iKSh0LnNpbXBsZXJHUFQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib29sZWFuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pIHx8IE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcuc2ltcGxlckdQVCcsIHJlKHQuc2ltcGxlckdQVCksICdib29sZWFuJyksIHQuc2ltcGxlckdQVCA/IE9iamVjdChIdC5jKSgnc2ltcGxlckdwdCcsICd5JykgOiBPYmplY3QoSHQuYykoJ3NpbXBsZXJHcHQnLCAnbicpLCBPYmplY3QoV3QuYikodC5kZWFscywgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb2xlYW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgfHwgT2JqZWN0KFF0LmMpKCdpbml0LmNvbmZpZy5kZWFscycsIHJlKHQuZGVhbHMpLCAnYm9vbGVhbicpLCB0LmRlYWxzID8gT2JqZWN0KEh0LmMpKCdkZWFscycsICd5JykgOiBPYmplY3QoSHQuYykoJ2RlYWxzJywgJ24nKSwgT2JqZWN0KFd0LmIpKHQuc2NoYWluLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pICYmIG51bGwgIT09IHQuc2NoYWluID8gT2JqZWN0KEx0Lm0pKHQsICdzY2hhaW4nKSAmJiAhT2JqZWN0KEt0LmkpKHQuc2NoYWluKSAmJiBkZWxldGUgdC5zY2hhaW4gOiAoT2JqZWN0KFF0LmMpKCdpbml0LmNvbmZpZy5zY2hhaW4nLCByZSh0LnNjaGFpbiksICdvYmplY3QnKSwgZGVsZXRlIHQuc2NoYWluKSwgT2JqZWN0KEx0Lm0pKHQsICdzY2hhaW4nKSA/IE9iamVjdChIdC5jKSgnc2NoYWluJywgJ3knKSA6IE9iamVjdChIdC5jKSgnc2NoYWluJywgJ24nKSwgT2JqZWN0KFd0LmIpKHQudXNlU2FmZUZyYW1lcywgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb2xlYW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgfHwgKE9iamVjdChRdC5jKSgnaW5pdC5jb25maWcudXNlU2FmZUZyYW1lcycsIHJlKHQudXNlU2FmZUZyYW1lcyksICdib29sZWFuJyksIGRlbGV0ZSB0LnVzZVNhZmVGcmFtZXMpLCB0LnVzZVNhZmVGcmFtZXMgPyBPYmplY3QoSHQuYykoJ3VzZVNhZmVGcmFtZXMnLCAneScpIDogT2JqZWN0KEh0LmMpKCd1c2VTYWZlRnJhbWVzJywgJ24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikoZSwgJ192YWxpZGF0ZUFuZFN0b3JlQ29uZmlnLXZhbGlkYXRlQ29uZmlnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geHQuYS5nZXRTdGF0ZSgpLmNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoTHQubSkoZSwgJ3B1YklEJykgJiYgT2JqZWN0KEx0Lm0pKHQsICdwdWJJRCcpICYmIGUucHViSUQgIT09IHQucHViSUQgJiYgT2JqZWN0KFF0LmIpKG5ldyBFcnJvcignYGFwc3RhZy5pbml0YCB3YXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IHB1YklEcyAoJy5jb25jYXQoZS5wdWJJRCwgJyB0aGVuICcpLmNvbmNhdCh0LnB1YklELCAnKScpKSwgJ192YWxpZGF0ZUFuZFN0b3JlQ29uZmlnLWRpZmZQdWJJZCcsICEwKSwgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ09ORklHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q21wVGltZW91dDogeHQuYS5nZXRTdGF0ZSgpLmNmZy5HRFBSX0NNUF9USU1FT1VUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKGUsICdfdmFsaWRhdGVBbmRTdG9yZUNvbmZpZycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNsb3RJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KEx0Lm0pKHQuYmlkQ29uZmlnLCAnbWVkaWFUeXBlJykgJiYgJ3YnID09PSB0LmJpZENvbmZpZy5tZWRpYVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVZ0LmEuaGFzQWRTZXJ2ZXJPYmplY3RMb2FkZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgT2JqZWN0KFF0LmEpKCdkaXNwbGF5QWRTZXJ2ZXIgT2JqZWN0IGhhc25cJ3QgYmVlbiBkZWZpbmVkJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVnQuYS5pc0NvbW1hbmRRdWV1ZURlZmluZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgT2JqZWN0KFF0LmEpKCdkaXNwbGF5QWRTZXJ2ZXIgT2JqZWN0XCdzIGNtZCBxdWV1ZSBoYXNuXCd0IGJlZW4gZGVmaW5lZCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdC5hLmhhc0FkU2VydmVyT2JqZWN0TG9hZGVkKCkgPyBudWxsICE9PSBPKGUpID8gQSh0KSA6IE9iamVjdChRdC5hKSgnJy5jb25jYXQoZSwgJyBpc25cJ3QgZGVmaW5lZCB3aGVuIHRyeWluZyB0byBzZXQgYW1hem9uIGJpZCEnKSkgOiBWdC5hLmNtZFF1ZXVlUHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfc2FmZUFwcGx5U2xvdFRhcmdldGluZycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE9iamVjdChOdC5iKShWdC5hKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2xvdElEID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWzBdIHx8IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKGUsICdfZ2V0QWRTZXJ2ZXJTbG90Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB4dC5hLmdldFN0YXRlKCkudGFyZ2V0aW5nS2V5c1t0LnNsb3RJRF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVnQuYS5oYXNBZFNlcnZlck9iamVjdExvYWRlZCgpICYmIE9iamVjdChMdC5rKShlKSAmJiBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCB0LmdldFRhcmdldGluZyhlKS5sZW5ndGggJiYgdC5jbGVhclRhcmdldGluZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikoZSwgJ19jbGVhclRhcmdldGluZ0Zyb21TbG90JywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KEx0Lm0pKHh0LmEuZ2V0U3RhdGUoKS5zbG90QmlkcywgdC5zbG90SUQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geHQuYS5nZXRTdGF0ZSgpLnNsb3RCaWRzW3Quc2xvdElEXS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJpZFN0YXRlID09PSBGdC5iLnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5iaWRTdGF0ZSA9PT0gRnQuYi5zZXQgJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQklEX1NUQVRFX0NIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHQuc2xvdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldGluZ1NldElEOiBlLl90YXJnZXRpbmdTZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFN0YXRlOiBGdC5iLmV4cG9zZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2NsZWFyQmlkU2V0T25TbG90JywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFModCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChMdC5qKShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSB0Lmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3QoUXQuYikodCwgJ19oYXNBbGxJdGVtc0luQXJyYXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoeHQuYS5nZXRTdGF0ZSgpLnNsb3RCaWRzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geHQuYS5nZXRTdGF0ZSgpLnNsb3RCaWRzW2VdLmZpbHRlcihLdC5mKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IG4ubGVuZ3RoICYmICh0W2VdID0gbi5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geHQuYS5nZXRTdGF0ZSgpLkFBWFJlcXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZFJlcUlEID09PSB0LmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGVbMF0ucnFUczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0geHQuYS5nZXRTdGF0ZSgpLkFBWFJlcXMubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0JpZEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1JlcXVlc3Qgbm90IGZvdW5kOiAnLmNvbmNhdCh0LmJpZFJlcUlELCAnIG5vdCBmb3VuZCBpbiAnKS5jb25jYXQocikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX2dldEN1cnJlbnRTbG90Qmlkcy1ub1JlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnFUczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucnFUcyA+IGUucnFUcyA/IHQgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5iaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2dldEN1cnJlbnRTbG90QmlkcycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8odCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEx0LmspKHh0LmEuZ2V0U3RhdGUoKS50YXJnZXRpbmdLZXlzW3RdKSA/IGUgPyBbJ2Ftem5paWRfc3AnXSA6IHh0LmEuZ2V0U3RhdGUoKS50YXJnZXRpbmdLZXlzW3RdLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPCB0LmluZGV4T2YoJ2Ftem5paWQnKSAmJiB0LmluZGV4T2YoJ2Ftem5paWRfc3AnKSA8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBbJ2Ftem5paWQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdfZ2V0QWxsQmlkSWRLZXlzJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0geHQuYS5nZXRTdGF0ZSgpLnNsb3RCaWRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtvXS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKG8sIGUpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJpZENvbmZpZ1tlXSA9PT0gdCAmJiAobiA9IGksICdhbXpuaWlkX3NwJyA9PT0gZSA/IHIgPSAnc3AnIDogJ2Ftem5paWQnICE9PSBlICYmIChyID0gZS5zdWJzdHIoMCwgZS5pbmRleE9mKCdhbXpuaWlkJykpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfZmluZFNsb3RCaWRCeUJpZElEJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QmlkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxJZDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkQ29uZmlnW24gKyAnYW16bmlpZCddID09PSB0ICYmIChyID0gbi5zcGxpdCgnXycpLnBvcCgpLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfZ2V0UE1QQmlkU2l6ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQuc2xvdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsb3RzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvJyAhPT0gdC5tZWRpYVR5cGUgJiYgJ3YnICE9PSB0Lm1lZGlhVHlwZSAmJiAndicgIT09IHQubWVkaWFUeXBlX3NwID8gZVt0LnNsb3RJRF0gPSBuZXcgS3QuYSh0KSA6ICgwIDw9IHQuc2xvdElELmluZGV4T2YoJ3Jzdi0nKSAmJiAodCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogdC5zbG90SUQuc3Vic3RyaW5nKDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9hbXpuYmlkOiB0LmFtem5iaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX2Ftem5paWQ6IHQuYW16bmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfYW16bnA6IHQuYW16bnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICd2aWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncl9hbXpuYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncl9hbXpuaWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncl9hbXpucCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuc3o6IHQuYW16bnN6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogdC5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpZDogdC5jcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTogdC5tZXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QoTHQubSkoZSwgdC5zbG90SUQpID8gdC50YXJnZXRpbmcuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0LnNsb3RJRF0uYmlkQ29uZmlnW25dID0gdFtuXSwgLTEgPT09IGVbdC5zbG90SURdLmJpZENvbmZpZy50YXJnZXRpbmcuaW5kZXhPZihuKSAmJiBlW3Quc2xvdElEXS5iaWRDb25maWcudGFyZ2V0aW5nLnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZVt0LnNsb3RJRF0gPSBuZXcgS3QuYSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdfbWVyZ2VWaWRlb0JpZHMnKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFQodCksIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZFJlcUlEID0gdC5jYiwgZS5ob3N0ID0gdC5ob3N0LCBlLmV2ID0gdC5ldiwgZS5jZmUgPSB0LmNmZSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikoZSwgJ19jb252ZXJ0QWF4UmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuc2xvdElELCBuID0gdC5fdGFyZ2V0aW5nU2V0SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuYmlkU3RhdGUgPT09IEZ0LmIuc2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5uZXdCaWRPYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGkudGFyZ2V0aW5nKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5zZXRUYXJnZXRpbmcodCwgaS50YXJnZXRpbmdbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQklEX1NUQVRFX0NIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFyZ2V0aW5nU2V0SUQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTdGF0ZTogRnQuYi5zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czogRGF0ZS5ub3coKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfYXBwbHlUYXJnZXRpbmdUb0FkU2VydmVyU2xvdCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gJiYgeShlW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19hcHBseVN1cHBsaWVkU2xvdEJpZHNUb0FkU2VydmVyT2JqZWN0JywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkodFtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfYXBwbHlBbGxDdXJyZW50U2xvdEJpZHNUYXJnZXRpbmdUb0FkU2VydmVyT2JqZWN0JywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gKE9iamVjdChIdC5jKSgndGFyZ2V0aW5nJywgJ3NldERpc3BsYXlCaWRzLWxpc3QnKSwgUih0KSkgOiAoT2JqZWN0KEh0LmMpKCd0YXJnZXRpbmcnLCAnc2V0RGlzcGxheUJpZHMtYWxsJyksIEMoKSksIHh0LmEuZ2V0U3RhdGUoKS5kaXNwbGF5QWRTZXJ2ZXIuc2xvdFJlbmRlckVuZGVkU2V0IHx8IChWdC5hLmNtZFF1ZXVlUHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWdC5hLnNsb3RSZW5kZXJFbmRlZEV2ZW50KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaih0KSwgdih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2FwcGx5U2xvdFRhcmdldGluZy1jbWRRdWV1ZS1zbG90Q2InLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2FwcGx5U2xvdFRhcmdldGluZy1jbWRRdWV1ZScsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4dC5hLmRpc3BhdGNoKHsgdHlwZTogJ1NMT1RfUkVOREVSX0VOREVEX1NFVCcgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2FwcGx5U2xvdFRhcmdldGluZycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknLCBlID0gJzE4ODExNDEzODIxNjYxODMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBKU09OLnBhcnNlKHQpLCBuID0gZS5mYlRva2VuLCByID0gbmV3IERhdGUocGFyc2VJbnQoZS5leHBBZnRlciwgMTApKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSAnYXBzX2V4dF85MTc9Jy5jb25jYXQobiwgJzsgZXhwaXJlcz0nKS5jb25jYXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19kb0ZiU3luYy1zZXRGYkNvb2tpZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodC5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoWHQuZCkobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2RvRmJTeW5jLXNlbmRUb2tlblJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQoJ2h0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9hdWRpZW5jZW5ldHdvcmsvdG9rZW4vdXBkYXRlJywgJz9wYXJ0bmVyPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodCksICcmdnJfdG9rZW49JykuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19kb0ZiU3luYy1nZXRVcGRhdGVVcmwnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIGUpLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19kb0ZiU3luYy1nZXRWNFRva2VuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gJ1ZSXycsIG4gPSAwOyBuIDwgMTk3OyArK24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gdC5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdC5sZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKGUsICdfZG9GYlN5bmMtZ2V0VnJUb2tlbicpLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShlLCAnX2RvRmJTeW5jLWdldFRva2VuUmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV0ZScgPT09IGRvY3VtZW50LnJlYWR5U3RhdGUgPyByKGUpIDogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKGUsICdfZG9GYlN5bmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMjAgPD0gbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTG9vcEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVG9vIG1hbnkgYXR0ZW1wdHMgdG8gYXBwZW5kIHRvIGRvY3VtZW50LmJvZHknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX3NhZmVEb2N1bWVudEJvZHlBcHBlbmRDaGlsZC1jYWxsYmFjay1sb29wcycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuYm9keSAmJiBudWxsICE9PSB0LmJvZHkgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdC5ib2R5LmFwcGVuZENoaWxkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ib2R5LmFwcGVuZENoaWxkKGUpLCByKCksIHZvaWQgKGkgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfc2FmZURvY3VtZW50Qm9keUFwcGVuZENoaWxkLWNhbGxiYWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG4sIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9ICExLCBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBsZXRlJyA9PT0gdC5yZWFkeVN0YXRlIHx8ICdpbnRlcmFjdGl2ZScgPT09IHQucmVhZHlTdGF0ZSA/IChPYmplY3QoSHQuYykoJ2FwcGVuZGVkJywgJ3N5bmMnKSwgbigpKSA6IChPYmplY3QoSHQuYykoJ2FwcGVuZGVkJywgJ2FzeW5jJyksIHQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19zYWZlRG9jdW1lbnRCb2R5QXBwZW5kQ2hpbGQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSAnJy5jb25jYXQodC5ob3N0KS5jb25jYXQoeHQuYS5nZXRTdGF0ZSgpLmNmZy5EVEJfUEFUSCwgJy9pbXAnKSwgbiA9ICcnLmNvbmNhdCh0Lmhvc3QpLmNvbmNhdCh4dC5hLmdldFN0YXRlKCkuY2ZnLkRUQl9QQVRILCAnL2FkbScpLCB0LmNmZSB8fCB0LmlzQW1wIHx8IHQuaXNTZiA/IG4gOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ2RldGVybWluZUNyZWF0aXZlRmV0Y2hFbmRwb2ludCcpLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIG4gPSAnP2I9Jy5jb25jYXQodC5iaWRJRCwgJyZybmQ9JykuY29uY2F0KE9iamVjdChMdC5lKSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEx0Lm0pKHQsICdwcCcpICYmIChuICs9ICcmcHA9Jy5jb25jYXQodC5wcCkpLCBPYmplY3QoTHQubSkodCwgJ2Ftem5wJykgJiYgKG4gKz0gJyZwPScuY29uY2F0KHQuYW16bnApKSwgT2JqZWN0KEx0Lm0pKHQsICdjcklEJykgJiYgKG4gKz0gJyZjcmlkPScuY29uY2F0KHQuY3JJRCkpLCBPYmplY3QoTHQubSkodCwgJ2lzU2hhcmVkUE1QJykgJiYgITAgPT09IHQuaXNTaGFyZWRQTVAgJiYgKG4gKz0gJyZzcD10cnVlJyksIE9iamVjdCgkdC5kKSgpICYmIChuICs9ICcmZXA9JTdCJTIyY2UlMjIlM0ElMjIxJTIyJTdEJyksIGUgPSB4KHQpLCB0LmZpZiA/ICcnLmNvbmNhdChlLCAnaicpLmNvbmNhdChuKSA6ICcnLmNvbmNhdChlLCAnaScpLmNvbmNhdChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdfY3JlYXRpdmVVUkwnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5kb2MuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZnJhbWVCb3JkZXIgPSAnMCcsIGUubWFyZ2luSGVpZ2h0ID0gJzAnLCBlLm1hcmdpbldpZHRoID0gJzAnLCBlLnN0eWxlLm1hcmdpblRvcCA9ICcwJywgZS5zdHlsZS5tYXJnaW5MZWZ0ID0gJzAnLCBlLnNjcm9sbGluZyA9ICdubycsIHQuaW5oZXJpdFNpemUgPyAoZS5zdHlsZS53aWR0aCA9ICcxMDAlJywgZS5zdHlsZS5oZWlnaHQgPSAnMTAwJScpIDogKGUuc3R5bGUud2lkdGggPSAnJy5jb25jYXQodC5zaXplc1swXSwgJ3B4JyksIGUuc3R5bGUuaGVpZ2h0ID0gJycuY29uY2F0KHQuc2l6ZXNbMV0sICdweCcpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdfYmFzZUlmcmFtZScpLCB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoTHQubSkodCwgJ2JpZFR5cGUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQua3ZNYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5iaWRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NoYXJlZFBNUCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiBlLmFtem5paWRfc3BbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6IGUuYW16bmJpZF9zcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogZS5hbXpuc3pfc3BbMF0uc3BsaXQoJ3gnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpucDogZS5hbXpucF9zcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0U2l6ZTogdC5pbmhlcml0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NoYXJlZFBNUDogdC5pc1NoYXJlZFBNUAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncHJlZmVycmVkUE1QJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoWXQuYSkodCkgJiYgT2JqZWN0KEx0Lm0pKHQsICdhbXpuZGVhbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmFtem5kZWFsLnNwbGl0KCdfJykucG9wKCkudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiBlWycnLmNvbmNhdCh0LmFtem5kZWFsLCAnYW16bmlpZCcpXVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IGp0KG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvcGVuQXVjdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KFl0LmEpKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiBlLmFtem5paWRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOiBPYmplY3QoQnQuYykoZS5hbXpuYmlkWzBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnA6IGUuYW16bnBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXRTaXplOiB0LmluaGVyaXRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogZS5hbXpuc3pbMF0uc3BsaXQoJ3gnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KFl0LmIpKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiB0LmFtem5paWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwOiBPYmplY3QoQnQuYykodC5hbXpuYmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnA6IHQuYW16bnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiB0LmFtem5zei5zcGxpdCgneCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSW52YWxpZCBBTVAgQmlkIFR5cGU6ICcuY29uY2F0KHQuYmlkVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05vIHZhbGlkIEFNUCBiaWQgdHlwZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdnZXRBbXBBZERhdGEtaW52YWxpZEJpZFR5cGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ2dldEFtcEFkRGF0YScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRJRDogJ0VSUk9SJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmIChPYmplY3QoTHQubSkoZSwgJ2FtcEVudicpICYmIGUuYW1wRW52IHx8IE9iamVjdChMdC5tKShlLCAnc2ZFbnYnKSAmJiBlLnNmRW52KSAmJiAobiA9IGUsIE9iamVjdChMdC5tKShlLCAnYmlkVHlwZScpICYmICdzaGFyZWRQTVAnID09PSBlLmJpZFR5cGUgPyBuLmlzU2hhcmVkUE1QID0gITAgOiBuLmlzU2hhcmVkUE1QID0gITEsIG4uZG9jdW1lbnQgPSB0LCBuLmFtem5ob3N0ID0gbi5rdk1hcC5hbXpuaG9zdFswXSksIHl0KHQpICYmICgobiA9IHQpLmJpZFR5cGUgPSAnb3BlbkF1Y3Rpb24nLCBuLmFtcEVudiA9ICEwKSwgbnVsbCA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgT2JqZWN0KFF0LmIpKG5ldyBFcnJvcignSW52YWxpZCBBTVAgcGFyYW1ldGVycycpLCAnX3JlbmRlckFtcEltcHJlc3Npb24taW52YWxpZFBhcmFtcycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE4obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdFUlJPUicgPT09IHIuYmlkSUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5kb2MgPSBuLmRvY3VtZW50LCByLmhvc3QgPSBuLmFtem5ob3N0LnJlcGxhY2UoJ2h0dHA6Ly8nLCAnaHR0cHM6Ly8nKSwgci5hZElEID0gJ2Ftem5hZCcuY29uY2F0KE9iamVjdChMdC5lKSgpKSwgci5pc0FtcCA9IG4uYW1wRW52LCByLmlzU2YgPSBPYmplY3QoTXQuYykod2luZG93KSwgeHQuYS5nZXRTdGF0ZSgpLmFheFZpZXdhYmlsaXR5RW5hYmxlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgd3Qociwgci5kb2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfcmVuZGVyQW1wSW1wcmVzc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIG4gPSAndW5rbm93bic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociAmJiAodC5oYXNUaW1lZE91dCA9ICEwKSwgciAmJiAhdC5oYXNSZW5kZXJlZCAmJiBPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdSZW5kZXJUaW1lb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAncmVuZGVyQWQgd2FzIGNhbGxlZCBmcm9tIHRpbWVvdXQuIGZpZkZsb3dNZXRob2Q6ICcuY29uY2F0KG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX19sb2FkQWRJbnRvRnJpZW5kbHlJZnJhbWUtcmVuZGVyQWQtdGltZW91dCcpLCBudWxsID09PSBlLmNvbnRlbnREb2N1bWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE9iamVjdChRdC5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ05vRG9jdW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpZnJhbWUuY29udGVudERvY3VtZW50IHdhcyBudWxsIGluc2lkZSByZW5kZXJBZC4gaXNGcm9tVGltZW91dDogJy5jb25jYXQociwgJy4gZmlmRmxvd01ldGhvZDogJykuY29uY2F0KG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX19sb2FkQWRJbnRvRnJpZW5kbHlJZnJhbWUtcmVuZGVyQWQtbm9Eb2N1bWVudCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaGFzUmVuZGVyZWQgJiYgIXQuaGFzVGltZWRPdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEdXBlUmVuZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVuZGVyIHdhcyBjYWxsZWQgdHdpY2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX19sb2FkQWRJbnRvRnJpZW5kbHlJZnJhbWUtcmVuZGVyQWQtcmVyZW5kZXInLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmhhc1JlbmRlcmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc1JlbmRlcmVkID0gITAsIGUuY29udGVudERvY3VtZW50Lm9wZW4oKSwgZS5jb250ZW50RG9jdW1lbnQud3JpdGUodC5odG1sKSwgZS5jb250ZW50RG9jdW1lbnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShyLCAnX19sb2FkQWRJbnRvRnJpZW5kbHlJZnJhbWUtcmVuZGVyQWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoSHQuYykoJ2lmcmFtZScsICdmcmllbmRseScpLCB2b2lkIDAgPT09IHQuaHRtbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBIVE1MIGF2YWlsYWJsZSBmb3IgYWQsIG1vc3QgbGlrZWx5IHRoZSBjcmVhdGl2ZSBoYXMgZXhwaXJlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JlbmRlcmVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVGltZWRPdXQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCksIChlID0gTCh0KSkuaWQgPSAnYXBzdGFnLWYtaWZyYW1lLScuY29uY2F0KE9iamVjdChMdC5lKSgpKSwgeih0LmRvYywgZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHIuYmluZChudWxsLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbnVsbCAhPT0gZS5jb250ZW50RG9jdW1lbnQgJiYgT2JqZWN0KEx0LmopKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGUuY29udGVudERvY3VtZW50LnJlYWR5U3RhdGUpID8gKHQoKSwgJ2RvYy1yZWFkeScpIDogbnVsbCAhPT0gZS5jb250ZW50RG9jdW1lbnQgJiYgJ3VuaW5pdGlhbGl6ZWQnICE9PSBlLmNvbnRlbnREb2N1bWVudC5yZWFkeVN0YXRlID8gKGUuY29udGVudERvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB0KSwgJ2RvbS1saXN0ZW5lcicpIDogKGUuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHQpLCAnaWZyYW1lLWxpc3RlbmVyJyksIE9iamVjdChIdC5jKSgnZmlmRmxvdycsIG4pLCBzZXRUaW1lb3V0KHIsIDEwMDAsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfbG9hZEFkSW50b0ZyaWVuZGx5SWZyYW1lLXNldEF0dHJpYnV0ZXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2xvYWRBZEludG9GcmllbmRseUlmcmFtZScsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NtTG9hZGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUxvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSdW5WaWV3YWJpbGl0eTogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSAyIDwgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEh0LmMpKCdpZnJhbWUnLCAndW5mcmllbmRseScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5pZCA9IHQuYWRJRCwgci5zZXRBdHRyaWJ1dGUoJ3NhbmRib3gnLCAnYWxsb3ctZm9ybXMgYWxsb3ctcG9pbnRlci1sb2NrIGFsbG93LXBvcHVwcyBhbGxvdy1wb3B1cHMtdG8tZXNjYXBlLXNhbmRib3ggYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctc2NyaXB0cyBhbGxvdy10b3AtbmF2aWdhdGlvbi1ieS11c2VyLWFjdGl2YXRpb24nKSwgT2JqZWN0KHF0LmQpKCdmYWtlX2JpZHMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICc8Ym9keSBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGOTkwMDsiPicuY29uY2F0KDUwIDwgcGFyc2VJbnQodC5zaXplc1sxXSwgMTApID8gJzxoMz5hcHN0YWcgVGVzdCBDcmVhdGl2ZTwvaDM+JyA6ICcnLCAnPGg0PmFtem5paWQgLSAnKS5jb25jYXQodC5iaWRJRCwgJyB8IGFtem5iaWQ6ICcpLmNvbmNhdCh0LnBwLCAnIHwgc2l6ZTogJykuY29uY2F0KHQuc2l6ZXMuam9pbigneCcpLCAnPC9oND48L2JvZHk+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3JjID0gJ2phdmFzY3JpcHQ6XCcnLmNvbmNhdChpLCAnXCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zcmMgPSBCKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEodC5pc0FtcCAmJiB0LmlzU2YgJiYgT2JqZWN0KE10LmIpKHdpbmRvdykpICYmICghdC5pc1NmIHx8IHQuaXNBbXAgfHwgdC5pbmhlcml0U2l6ZSkgfHwgT2JqZWN0KE10LmEpKHQuc2l6ZXMsIHdpbmRvdyksIHoodC5kb2MsIHIpLCAoZS5pZnJhbWUgPSByKS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RhdGVzLmlmcmFtZUxvYWRlZCA9ICEwLCBuICYmIG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2xvYWRBZEludG9VbmZyaWVuZGx5SWZyYW1lJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnN0YXRlcywgbiA9IHQuZG9jLCByID0gdC5iaWRJRCwgaSA9IHQuaWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KEx0LmEpKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zaG91bGRSdW5WaWV3YWJpbGl0eSA9ICExLCBPYmplY3QoTHQubSkod2luZG93LCAnYW16bmNzbScpID8gbyA9IHdpbmRvdy5hbXpuY3NtIDogdm9pZCAwICE9PSBuICYmIG51bGwgIT09IG4uZGVmYXVsdFZpZXcgJiYgT2JqZWN0KEx0Lm0pKG4uZGVmYXVsdFZpZXcsICdhbXpuY3NtJykgJiYgKG8gPSBuLmRlZmF1bHRWaWV3LmFtem5jc20pLCB2b2lkIDAgIT09IG4gJiYgdm9pZCAwICE9PSBvICYmIE9iamVjdChMdC5tKShvLCAncm1EJykgJiYgKG8uaG9zdCA9IE9iamVjdChxdC5jKSgnaG9zdCcsIHh0LmEuZ2V0U3RhdGUoKS5ob3N0cy5ERUZBVUxUX0FBWF9QSVhFTF9IT1NUKSwgby5ybUQoaSwgciwgbi5kZWZhdWx0VmlldywgbiwgeHQuYS5nZXRTdGF0ZSgpLmNvbmZpZy5wdWJJRCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX3RyaWdnZXJWaWV3YWJpbGl0eScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEgodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QoS3QuZSkoZS5zbG90cyksIGkgPSBPYmplY3Qua2V5cyhyKSwgbyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICh4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfQUFYX1JFUV9QUk9QJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcUlEOiBlLmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndGltZWRPdXRBdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRGF0ZS5ub3coKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeHQuYS5nZXRTdGF0ZSgpLmV4cGVyaW1lbnRzLmNodW5rUmVxdWVzdHMgJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX1RJTUVPVVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiBlLmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU91dDogRGF0ZS5ub3coKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChMdC5tKShyLCB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gclt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoS3QuZykoeHQuYS5nZXRTdGF0ZSgpLCBWdC5hKSB8fCBPYmplY3QoTHQubSkoZS5iaWRDb25maWcsICdhbXpuYmlkJykgPyBPYmplY3QoTHQubSkoZS5iaWRDb25maWcsICdhbXpucCcpIHx8IChlLmJpZENvbmZpZy5hbXpucCA9ICcnKSA6IChPYmplY3QoSHQuYykoJ3VudXNlZERlYWwnLCBlLm1lZGlhVHlwZSksICd2aWRlbycgIT09IGUubWVkaWFUeXBlICYmIChlLmJpZENvbmZpZy50YXJnZXRpbmcudW5zaGlmdCgnYW16bnN6JyksIGUuYmlkQ29uZmlnLmFtem5zeiA9ICcweDAnKSwgZS5iaWRDb25maWcudGFyZ2V0aW5nLnVuc2hpZnQoJ2Ftem5paWQnLCAnYW16bmJpZCcsICdhbXpucCcpLCBlLmJpZENvbmZpZy5hbXpuaWlkID0gJycsIGUuYmlkQ29uZmlnLmFtem5iaWQgPSBGdC50Lm5vQmlkLCBlLmJpZENvbmZpZy5hbXpucCA9IEZ0LnQubm9CaWQpLCBvLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBWdC5hLmlzU3VwcG9ydGVkICYmIChvID0gT2JqZWN0KEt0LmMpKG8sIGUsIG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IGZyb21UaW1lb3V0OiBuIH0sIGEgPSBPYmplY3QoS3QuZykoeHQuYS5nZXRTdGF0ZSgpLCBWdC5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoby5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA/IHQubmV3QmlkT2JqZWN0IDogdC5iaWRPYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShpLCAnX2JpZENhbGxiYWNrSGFuZGxlcicsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoW10sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tVGltZW91dDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tRXJyb3I6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5oZXJpdFNpemUgPyBPYmplY3QoSHQuYykoJ2NyZWF0aXZlU2l6ZScsICdpbmhlcml0ZWQnKSA6IChyID0gdC5kZWZhdWx0VmlldyAmJiB0LmRlZmF1bHRWaWV3LmZyYW1lRWxlbWVudCA/IChuID0gdC5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQsICdkZWZhdWx0VmlldycpIDogKG4gPSB3aW5kb3cuZnJhbWVFbGVtZW50LCAnZnJhbWVFbGVtZW50JyksIE9iamVjdChIdC5jKSgncmVzaXplSWZyYW1lJywgciksIE9iamVjdChIdC5jKSgnY3JlYXRpdmVTaXplJywgJ3Jlc2l6ZWQnKSwgbnVsbCAhPT0gbiA/IChuLnN0eWxlLndpZHRoID0gJycuY29uY2F0KGUuc2l6ZXNbMF0sICdweCcpLCBuLnN0eWxlLmhlaWdodCA9ICcnLmNvbmNhdChlLnNpemVzWzFdLCAncHgnKSkgOiBPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRnJhbWVOb3RGb3VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdcJ3dpblwnIGlzIFwnbnVsbFwnLiBNZXRob2QgdXNlZDogJy5jb25jYXQocikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnX3Jlc2l6ZUlmcmFtZS13aW4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfcmVzaXplSWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQodFswXSwgJ3gnKS5jb25jYXQodFsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChRdC5iKSh0LCAnX3NpemVBcnJheVRvU3JpbmcnKSwgJ3gnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEcodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gdC5sZW5ndGggPyBYKHRbMF0pIDogWCh0W01hdGguZmxvb3IodC5sZW5ndGggKiBNYXRoLnJhbmRvbSgpKV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19waWNrUmFuZG9tU2l6ZUZvck1vY2tCaWQnLCAhMCksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFYodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgbiA9IE9iamVjdChxdC5jKSgnaG9zdCcsIHh0LmEuZ2V0U3RhdGUoKS5ob3N0cy5ERUZBVUxUX0FBWF9CSURfSE9TVCksIHIgPSBPYmplY3QoQnQuZykod2luZG93KSwgaSA9IHQuYmlkUmVxSUQsIG8gPSBPYmplY3QoTHQuaCkod2luZG93KSwgYyA9IE9iamVjdChxdC5jKSgndGVzdEJpZFRpbWVvdXQnLCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX0FBWF9SRVFVRVNUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkQ29uZmlnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcUlEOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3M6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycVRzOiBEYXRlLm5vdygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSA9IHQuc2xvdHMubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuID0gRyh0LnNpemVzKSwgciA9ICd0ZXN0RGVhbCcuY29uY2F0KE9iamVjdChMdC5lKSgpLCAnXycpLmNvbmNhdChuKSwgaSA9ICd0ZXN0RGVhbElpLScuY29uY2F0KE9iamVjdChMdC5lKSgpKSwgbyA9IEcodC5zaXplcyksIGMgPSAobmUoZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHQuc2xvdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaWQ6ICcnLmNvbmNhdChGdC5uLmNyaWQsICctJykuY29uY2F0KE9iamVjdChMdC5lKSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5paWQ6ICcnLmNvbmNhdChGdC5uLmFtem5paWQsICctJykuY29uY2F0KE9iamVjdChMdC5lKSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuYmlkOiBGdC5uLmFtem5iaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnA6IEZ0Lm4uYW16bnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW16bnN6OiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5paWRfc3A6ICcnLmNvbmNhdChGdC5uLmFtem5paWQsICctJykuY29uY2F0KE9iamVjdChMdC5lKSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuYmlkX3NwOiAnJy5jb25jYXQoRnQubi5hbXpuYmlkLCAnU1AnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpucF9zcDogJycuY29uY2F0KEZ0Lm4uYW16bnAsICdTUCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5zel9zcDogRyh0LnNpemVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbXpuZGVhbHM6IFtyXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJycuY29uY2F0KHIsICdhbXpuaWlkJyksIGkpLCBuZShlLCAnbWVkaWFUeXBlJywgJ2QnKSwgbmUoZSwgJ21ldGEnLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nsb3RJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lZGlhVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgbmUoZSwgJ3RhcmdldGluZycsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmlpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5iaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpucCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5zeicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5paWRfc3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpuYmlkX3NwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bnBfc3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpuc3pfc3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbXpuZGVhbF9zcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Ftem5kZWFscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KHIsICdhbXpuaWlkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aWRlbycgPT09IHQubWVkaWFUeXBlICYmIChjLm1lZGlhVHlwZSA9ICd2aWRlbycsIGMuYW16bmJpZCA9ICd2XycuY29uY2F0KGMuYW16bmJpZCkpLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFwc3RhZy5iaWRzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ29rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2RvTW9ja0JpZCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBLKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkUmVxSUQgPT09IHQuY2I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5iaWRDb25maWcgJiYgZS5iaWRDb25maWcuc2xvdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmJpZENvbmZpZy5zbG90cy5maWx0ZXIoTnQuZCkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2xvdElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSBPYmplY3QoTHQubSkodCwgJ3Nsb3RzJykgPyB0LnNsb3RzLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsb3RJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogW10sIGkgPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhT2JqZWN0KEx0LmopKHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ05PX0JJRF9PTl9BRFNFUlZFUl9TTE9UUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SURzOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBWdC5hLmhhc0FkU2VydmVyT2JqZWN0TG9hZGVkKCkgPyBXKCkgOiBWdC5hLmlzQ29tbWFuZFF1ZXVlRGVmaW5lZCgpICYmIFZ0LmEuY21kUXVldWVQdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShlLCAnX2RldGVybWluZU5vQmlkU3RhdGVGb3JBZFNlcnZlck9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEoodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChMdC5qKSh4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQucmVzVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaWRDb25maWcuc2xvdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkubWFwKE50LmMpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmdldFRhcmdldGluZygnYW16bmJpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgZS5sZW5ndGggJiYgMiA8IGVbMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19pc1JlYWxBbXpuYmlkVGFyZ2V0aW5nU2V0T25TbG90JyksIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVnQuYS5oYXNBZFNlcnZlck9iamVjdExvYWRlZCgpICYmICcxJyA9PT0gVnQuYS5nZXRUYXJnZXRpbmcoJ2Ftem5iaWQnKVswXSAmJiBaKCksIE9iamVjdChOdC5iKShWdC5hKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFPYmplY3QoTHQuaikoeHQuYS5nZXRTdGF0ZSgpLmRpc3BsYXlBZFNlcnZlci5ub0JpZFNsb3RJRHMsIHQuc2xvdElEKSB8fCBKKHQuc2xvdElEKSB8fCBZKHQpIHx8ICcyJyA9PT0gdC5nZXRUYXJnZXRpbmcoJ2Ftem5iaWQnKVswXSB8fCAkKCdub0JpZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2FwcGx5Tm9CaWRGcm9tQUFYU3RhdGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAkKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ0LnUuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNldFRhcmdldGluZyhuLCBGdC50W3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFooKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdC51LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVnQuYS5jbGVhclRhcmdldGluZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHR0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlOiAnZHVwZVBpeGVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQ6IERhdGUubm93KCkgLSB0LnRpbWluZy5yZW5kZXJUaW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoSHQuYSkodC5iaWRDb25maWcuYW16bmlpZCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfc2VuZER1cGVCaWRQaXhlbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzdlOWMzZmJhMTViZjFkYjcgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzdlOWMzZmJhMTViZjFkYjcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19iYTFjNmJhNTVkZmU2NmYxLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoTHQuaSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShGdC5jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBKU09OLnBhcnNlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGUgJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ0ZHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzdlOWMzZmJhMTViZjFkYjcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzdlOWMzZmJhMTViZjFkYjcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBPYmplY3QoJHQuYykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV0ID0gMCwgbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChMdC5tKSh3aW5kb3csICdnb29nbGV0YWcnKSB8fCAhT2JqZWN0KEx0Lm0pKHdpbmRvdy5nb29nbGV0YWcsICdjbWQnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKCsrZXQgPCA1ICYmIHNldFRpbWVvdXQocnQsIDEwMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHdC5hKCkuY21kUXVldWVQdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcignc2xvdFJlcXVlc3RlZCcsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNsb3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0xPR19HQU1fRVZFTlQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGVlKGVlKHt9LCBuZXcgR3QuYihlKS5zbG90Q29uZmlnKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmc6IGUuZ2V0VGFyZ2V0aW5nTWFwKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfaW5pdGlhbGl6ZVNsb3RSZXF1ZXN0ZWRFdmVudExpc3RlbmVyLWNtZFF1ZXVlLWxpc3RlbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2luaXRpYWxpemVTbG90UmVxdWVzdGVkRXZlbnRMaXN0ZW5lci1jbWRRdWV1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfaW5pdGlhbGl6ZVNsb3RSZXF1ZXN0ZWRFdmVudExpc3RlbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuQUFYUmVxcy5zbGljZSh0LmdhbVNsb3RSZW5kZXJQaXhlbC5hYXhSZXFPZmZzZXQpLnJlZHVjZShmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY29uY2F0KGUuYmlkQ29uZmlnLnNsb3RzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVlKGVlKHt9LCB0KSwge30sIHsgdHlwZTogJ2EnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndmlkZW8nICE9PSB0Lm1lZGlhVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4gPSB0LmdhbVNsb3RGZXRjaExvZy5zbGljZSh0LmdhbVNsb3RSZW5kZXJQaXhlbC5nYW1TbG90RmV0Y2hMb2dPZmZzZXQpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVlKGVlKHt9LCB0KSwge30sIHsgdHlwZTogJ2cnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgciA9IFtdLmNvbmNhdCh0ZShlKSwgdGUobikpLnJlZHVjZShmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdFtlLnNsb3RJRF0gJiYgKHRbZS5zbG90SURdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkOiBlLnNsb3RJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiB7IGM6IDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnOiB7IGM6IDAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRbZS5zbG90SURdW2UudHlwZV0uYysrLCB0W2Uuc2xvdElEXVtlLnR5cGVdLnMgPSBlLnNpemVzLCB0W2Uuc2xvdElEXVtlLnR5cGVdLnNuID0gZS5zbG90TmFtZSB8fCAnJywgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSB0LmEuYyB8fCAwICE9PSB0LmcuYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdnZXRTbG90RmV0Y2hDb3VudHMnKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geHQuYS5nZXRTdGF0ZSgpLCBlID0gaXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IE9iamVjdC5rZXlzKGUpLmxlbmd0aCAmJiAoT2JqZWN0KEx0LmMpKGUsIDUpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90czogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZDogS3QuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogT2JqZWN0KEJ0LmcpKHdpbmRvdykuc3BsaXQoJz8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzOiBPYmplY3QoTHQuaCkod2luZG93KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmlkOiB0LmNvbmZpZy5wdWJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlOiAnc2xvdFJlbmRlcnMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChIdC5iKShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVUERBVEVfUkVOREVSX09GRlNFVFMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXhSZXFPZmZzZXQ6IHQuQUFYUmVxcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1TbG90RmV0Y2hMb2dPZmZzZXQ6IHQuZ2FtU2xvdEZldGNoTG9nLmxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShlLCAnc2VuZERpc3BsYXlBZFNlcnZlclJlbmRlclBpeGVsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGF0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnQoKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIU9iamVjdChMdC5tKSh4dC5hLmdldFN0YXRlKCkuYnNQaXhlbHMsIHQuaWlkKSB8fCB0LnN0YXRlICE9PSB4dC5hLmdldFN0YXRlKCkuYnNQaXhlbHNbdC5paWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQubGVuZ3RoICYmIDAgPCB0Lmxlbmd0aCAmJiAodC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChIdC5hKSh0LmlpZCwgdXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHN0KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoU3RhcnQ6ICdhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5Mb29rdXBTdGFydDogJ2InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbkxvb2t1cEVuZDogJ2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RTdGFydDogJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvbm5lY3Rpb25TdGFydDogJ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFbmQ6ICdmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQ6ICdnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVN0YXJ0OiAnaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbmQ6ICdpJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHh0LmEuZ2V0U3RhdGUoKS5zbG90QmlkcykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZ2V0U3RhdGUoKS5zbG90Qmlkc1t0XS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoTHQubSkobi5iaWRDb25maWcsICdhbXpuaWlkJykgJiYgIW4ucGl4ZWxTZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHh0LmEuZ2V0U3RhdGUoKS5BQVhSZXFzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJpZFJlcUlEID09PSBuLmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHJlKHIpICYmIG51bGwgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIucnFUcyAtIE9iamVjdChVdC5kKSgpLCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkOiBLdC5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnM6IHIuYmlkQ29uZmlnLnZhbGlkU2xvdHMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiBuLmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJycTogci5ycVRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3R5cGU6ICdsYXRlbmN5QmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHJlKHIucGVyZikgJiYgbnVsbCAhPT0gci5wZXJmICYmIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEx0Lm0pKHIsICdwZXJmJykgJiYgMCAhPT0gT2JqZWN0KFV0LmEpKHIucGVyZiwgdCkgJiYgKG9bZVt0XV0gPSBPYmplY3QoVXQuYSkoci5wZXJmLCB0KSAtIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvLmogPSByLnJlc1RzIC0gci5ycVRzLCBPYmplY3QoSHQuYSkobi5iaWRDb25maWcuYW16bmlpZCwgbyksIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVVBEQVRFX0JJRF9JTkZPX1BST1AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZDogbi5iaWRDb25maWcuYW16bmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncGl4ZWxTZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19zZW5kQmlkc1NldE9uREZQUGl4ZWwtdGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfc2VuZEJpZHNTZXRPbkRGUFBpeGVsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUkVDT1JEX0JJRF9JTkZPX1NFTlQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRJbmZvOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1dCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZHQodC5maWQpLCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LnN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHViaWQ6IHh0LmEuZ2V0U3RhdGUoKS5jb25maWcucHViSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ2JpZFNldFBpeGVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYTogT2JqZWN0KEx0Lm0pKGUucmVxLCAndGltZWRPdXRBdCcpID8gZS5yZXEudGltZWRPdXRBdCA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYnJxOiBlLnJlcS5ycVRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRvOiBlLnJlcS50aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnM6IGUucmVxLmJpZENvbmZpZy52YWxpZFNsb3RzLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYTogZS5yZXEucmVzVHMgLSBlLnJlcS5ycVRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxaW5kZXg6IGUuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWQ6IHQuZmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogJ2R0YicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dC5hLmdldFN0YXRlKCkuY2ZnLkNIVU5LX0JJRF9SRVFVRVNUU19QUk9QT1JUSU9OICYmIChuLmVpZCA9IHh0LmEuZ2V0U3RhdGUoKS5leHBlcmltZW50cy5jaHVua1JlcXVlc3RzID8gMiA6IDEsIG4uZmJpbmRleCA9IGUuZmJJbmRleCwgbi5mYm5zID0geHQuYS5nZXRTdGF0ZSgpLmJpZENvbmZpZ3NbcGFyc2VJbnQodC5maWQuc3BsaXQoJy0nKVswXSwgMTApXS5zbG90cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0geHQuYS5nZXRTdGF0ZSgpLmV4cGVyaW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChMdC5tKShyLCAnc2hvdWxkVXNlVGVzdEJpZEVuZHBvaW50JykgJiYgKG4udGJzID0gci5zaG91bGRVc2VUZXN0QmlkRW5kcG9pbnQgPyAyIDogMSksIHQuZGVsdGEgJiYgKG4uZGVsYXkgPSB0LmRlbHRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUucmVxLnBlcmY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaSAmJiAobi51bCA9IGUucmVxLnVybExlbmd0aCwgbi5lcyA9IE9iamVjdChVdC5hKShpLCAnZW5jb2RlZEJvZHlTaXplJykpLCAwIDwgT2JqZWN0LmtleXMoeHQuYS5nZXRTdGF0ZSgpLmlkZW50aXR5U3RhdGUpLmxlbmd0aCAmJiAobi5pZHMgPSBKU09OLnN0cmluZ2lmeSh4dC5hLmdldFN0YXRlKCkuaWRlbnRpdHlTdGF0ZSkpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19tYXBCaWRJbmZvVG9QaXhlbCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlOiAnYmlkU2V0UGl4ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJpZDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJycTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRvOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFpbmRleDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGJzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiAnZHRiJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkUmVxSUQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF0sIG4gPSB4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5pbmRleE9mKGUpICsgMSwgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJJbmRleDogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pbmRleCA9IHh0LmEuZ2V0U3RhdGUoKS5BQVhSZXFzLmluZGV4T2Yoci5yZXEpICsgMSwgeHQuYS5nZXRTdGF0ZSgpLmV4cGVyaW1lbnRzLmNodW5rUmVxdWVzdHMgJiYgKHIuZmJJbmRleCA9IHh0LmEuZ2V0U3RhdGUoKS5BQVhSZXFzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gdC5iaWRSZXFJRC5pbmRleE9mKCctJykgfHwgJzAnID09PSB0LmJpZFJlcUlELnNwbGl0KCctJylbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaWRSZXFJRC5zcGxpdCgnLScpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih0LnNwbGl0KCctJylbMF0pICsgMSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbXQoKSwgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSB0IHx8IE9iamVjdC5rZXlzKHh0LmEuZ2V0U3RhdGUoKS5zbG90QmlkcykuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8nICE9PSB4dC5hLmdldFN0YXRlKCkuc2xvdEJpZHNbbl1bMF0uYmlkQ29uZmlnLm1lZGlhVHlwZSAmJiB4dC5hLmdldFN0YXRlKCkuc2xvdEJpZHNbbl0uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEx0Lm0pKHQuYmlkQ29uZmlnLCAnYW16bmlpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElEOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkOiByLmJpZENvbmZpZy5hbXpuaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiByLmJpZFJlcUlECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSBbXSwgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIGluIHQgJiYgKG8gPSB0W25dLmZldGNoZWRBdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LkFBWFJlcUluZm8gJiYgdC5BQVhSZXFJbmZvLmJpZFJlcUlEID09PSByLmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyA9IHRbbl0udGFyZ2V0ZWRBdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRhcmdldGluZyA9PT0gci5iaWRDb25maWcuYW16bmlpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAwIDwgby5sZW5ndGggPyAwIDwgby5sZW5ndGggJiYgYy5sZW5ndGggPj0gby5sZW5ndGggJiYgby5zbGljZShvLmxlbmd0aCAtIDEpWzBdLnRzID4gYy5zbGljZShvLmxlbmd0aCAtIDEpWzBdLnRzID8gMSA9PT0gdFtuXS5mZXRjaFdpdGhJSUQuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gci5iaWRDb25maWcuYW16bmlpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID8gaS5zdGF0ZSA9IDEgOiBpLnN0YXRlID0gNCA6IE9iamVjdChMdC5qKSh0W25dLmZldGNoV2l0aElJRCwgci5iaWRDb25maWcuYW16bmlpZCkgPyBpLnN0YXRlID0gMyA6IGkuc3RhdGUgPSAyIDogaS5zdGF0ZSA9IDAsIDEgPT09IGkuc3RhdGUgfHwgMiA9PT0gaS5zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHh0LmEuZ2V0U3RhdGUoKS5BQVhSZXFzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJpZFJlcUlEID09PSByLmJpZFJlcUlEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF0ucmVzVHMsIHMgPSBsdChhLCB0W25dLmZldGNoZWRBdCwgMiA9PT0gaS5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgT2JqZWN0KEx0Lm0pKHMsICd0cycpICYmIChpLmRlbHRhID0gYSAtIHMudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19nZXRCaWRTZXRJbmZvJyksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGx0KHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQgLSBlLnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbiAmJiByIDw9IDAgPyAtciA6IG4gJiYgMCA8PSByID8gciA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2J0KHIpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBidCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gLTEsIG4gPSAtMSwgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHRbcl0gJiYgKC0xID09PSBuIHx8IHRbcl0gPCBlKSAmJiAoZSA9IHRbbiA9IHJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHB0KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEx0LmopKHQuYmlkQ29uZmlnLnNsb3RzLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zbG90SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVnQuYS5oYXNBZFNlcnZlck9iamVjdExvYWRlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHh0LmEuZ2V0U3RhdGUoKS5nYW1TbG90RmV0Y2hMb2cucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChMdC5tKSh0LCBlLnNsb3RJRCkgfHwgKHRbZS5zbG90SURdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZEF0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGVkQXQ6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbZS5zbG90SURdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5mZXRjaGVkQXQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czogZS50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBWFJlcUluZm86IHB0KG4uZmV0Y2hlZEF0Lmxlbmd0aCwgZS5zbG90SUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QoTHQubSkoZS50YXJnZXRpbmcsICdhbXpuaWlkJykgJiYgMCA8IGUudGFyZ2V0aW5nLmFtem5paWQubGVuZ3RoID8gbi50YXJnZXRlZEF0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHM6IGUudHMgLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aW5nOiBlLnRhcmdldGluZy5hbXpuaWlkWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbi50YXJnZXRlZEF0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHM6IGUudHMgLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aW5nOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChMdC5tKSh0LCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mZXRjaFdpdGhJSUQgPSBuLmZldGNoZWRBdC5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGx0KHQudHMsIG4udGFyZ2V0ZWRBdCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gZS50YXJnZXRpbmcgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRbZV0gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChRdC5iKSh0LCAnX2dldERGUFNsb3RGZXRjaGVzJyksIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZ0LmEuaGFzQWRTZXJ2ZXJPYmplY3RMb2FkZWQoKSA/ICQoJ25vUmVxdWVzdCcsIFZ0LmEpIDogVnQuYS5pc0NvbW1hbmRRdWV1ZURlZmluZWQoKSAmJiBWdC5hLmNtZFF1ZXVlUHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ25vUmVxdWVzdCcsIFZ0LmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX2FwcGx5Tm9SZXF1ZXN0VG9BQVhTdGF0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGh0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRVFVRVNURURfQklEX0ZPUl9BRFNFUlZFUl9TTE9UUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRHM6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgVnQuYS5pc0NvbW1hbmRRdWV1ZURlZmluZWQoKSAmJiBWdC5hLmNtZFF1ZXVlUHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE9iamVjdChOdC5iKShWdC5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwJyA9PT0gVnQuYS5nZXRUYXJnZXRpbmcoJ2Ftem5iaWQnKVswXSAmJiBaKCksIFModC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2xvdElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpID8gZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEx0LmopKHQsIGUuc2xvdElEKSAmJiAhWShlKSAmJiAkKCdiaWRJbkZsaWdodCcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBWdC5hLmNtZFF1ZXVlUHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYmlkSW5GbGlnaHQnLCBWdC5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX3NldFJlcXVlc3RUb0FBWEluRmxpZ2h0U3RhdGUtY21kUXVldWUtY21kUXVldWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKGUsICdfc2V0UmVxdWVzdFRvQUFYSW5GbGlnaHRTdGF0ZS1jbWRRdWV1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfc2V0UmVxdWVzdFRvQUFYSW5GbGlnaHRTdGF0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHl0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChMdC5tKSh0LCAndHlwZScpICYmICEodCBpbnN0YW5jZW9mIERvY3VtZW50KSAmJiAnYW1wJyA9PT0gdC50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19pc0xlZ2FjeUFtcENyZWF0aXZlJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE90KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZSAmJiBPYmplY3QoTHQubSkoZSwgJ2FtcEVudicpICYmIGUuYW1wRW52IHx8IHl0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE9iamVjdChRdC5iKSh0LCAnX2lzQW1wSW1wcmVzc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGp0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCd4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdnQodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoSHQuZikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19yZW5kZXJJbXAtcGl4ZWxzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdm9pZCAwID09PSBuID8gJzAuMC4wJyA6IG4uY3Y7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE90KHQsIG4pICYmIE9iamVjdChCdC5rKSh3aW5kb3csICEwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHl0KHQpID8gT2JqZWN0KEh0LmMpKCdyZW5kZXJGb290cHJpbnQnLCAnYW1wJykgOiBPYmplY3QoSHQuYykoJ3JlbmRlckZvb3RwcmludCcsICdtdWx0aS1hbXAtJy5jb25jYXQocikpLCB2b2lkIHEodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChNdC5jKSh3aW5kb3cpICYmIHZvaWQgMCAhPT0gbiAmJiBPYmplY3QoTHQubSkobiwgJ2t2TWFwJykgJiYgT2JqZWN0KEx0Lm0pKG4ua3ZNYXAsICdhbXpuaG9zdCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEh0LmMpKCdyZW5kZXJGb290cHJpbnQnLCAnbXVsdGktc2YtJy5jb25jYXQocikpLCB2b2lkIHEodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAwID09PSBlLmluZGV4T2YoJ3NwfCcpICYmIChlID0gZS5zdWJzdHJpbmcoMyksIGkgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGMgPSBlIHx8IHQuYW16bmlpZCwgYSA9IEUoYywgaSksIHMgPSBhLnNsb3RCaWQsIHUgPSBhLmRlYWxJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9IHUgJiYgMSA8PSB1Lmxlbmd0aCA/IGp0KCdzcCcgPT09IHUgPyBzLmJpZENvbmZpZy5hbXpuc3pfc3AgOiBEKGMsIHMsIHUpKSA6IGp0KHMuYmlkQ29uZmlnLmFtem5zeiksIDEgPT09IGFyZ3VtZW50cy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEh0LmMpKCdyZW5kZXJGb290cHJpbnQnLCAnSlNPTnAnKSwgdm9pZCBGKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M6IHMuZG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiBzLmJpZENvbmZpZy5hbXpuaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IHQuaHRtbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0U2l6ZTogcy5pbmhlcml0U2l6ZSB8fCAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChIdC5jKSgnYmlkUmVuZGVyU3RhdGUnLCBzLmJpZFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBpID8gJ3NoYXJlZHBtcCcgOiAnb3Blbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gbiA/IE9iamVjdChIdC5jKSgncmVuZGVyRm9vdHByaW50JywgJ211bHRpLScuY29uY2F0KGQsICctJykuY29uY2F0KHIpKSA6IE9iamVjdChIdC5jKSgncmVuZGVyRm9vdHByaW50JywgJ3N0YW5kYXJkLScuY29uY2F0KGQsICctJykuY29uY2F0KHIpKSwgcy5iaWRTdGF0ZSA9PT0gRnQuYi5yZW5kZXJlZCAmJiB0dChzKSwgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQklEX1NUQVRFX0NIQU5HRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SUQ6IHMuc2xvdElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhcmdldGluZ1NldElEOiBzLl90YXJnZXRpbmdTZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFN0YXRlOiBGdC5iLnJlbmRlcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHM6IERhdGUubm93KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gcy5ob3N0LCBiID0gJ2Ftem5hZCcuY29uY2F0KE1hdGgucm91bmQoMTAwMDAwMCAqIE1hdGgucmFuZG9tKCkpKSwgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRJRDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHA6IFN0KCdhbXpuYmlkJywgcywgdSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZElEOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtem5wOiBTdCgnYW16bnAnLCBzLCB1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcklEOiBTdCgnY3JpZCcsIHMsIHUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbElkOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2hhcmVkUE1QOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZTogcy5jZmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFNpemU6IE9iamVjdChMdC5sKShuKSAmJiBPYmplY3QoTHQubSkobiwgJ2luaGVyaXRTaXplJykgJiYgITAgPT09IG4uaW5oZXJpdFNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJyA9PT0gcy5iaWRDb25maWcuZmlmID8gKGwuZmlmID0gITAsIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1VQREFURV9CSURfSU5GT19QUk9QJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogcy5zbG90SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkb2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1VQREFURV9CSURfSU5GT19QUk9QJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogcy5zbG90SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpbmhlcml0U2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbC5pbmhlcml0U2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KFh0LmIpKEIobCksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZG9jdW1lbnQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikobmV3IEVycm9yKCdFcnJvciBMb2FkaW5nIEpTT05QIFJlbmRlciBDYWxsYmFjaycpLCAncmVuZGVySW1wLWZpZi1jYWxsYmFjay1sb2FkJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiB4dC5hLmdldFN0YXRlKCkuYWF4Vmlld2FiaWxpdHlFbmFibGVkID8gd3QobCwgdCkgOiBVKGwpLCBRKHQsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikobmV3IEVycm9yKCdJbnZhbGlkIGJpZCBJRCB0cmllZCB0byByZW5kZXInKSwgJ19yZW5kZXJJbXAtaW52YWxpZElkJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX3JlbmRlckltcCcsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTdCh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbiAmJiAxIDw9IG4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJycuY29uY2F0KHQsICdfc3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwJyA9PT0gbiAmJiBPYmplY3QoTHQubSkoZS5iaWRDb25maWcsIGkpICYmIChyID0gZS5iaWRDb25maWdbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoTHQubSkoZS5iaWRDb25maWcsIHQpICYmIChyID0gZS5iaWRDb25maWdbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikodCwgJ19nZXRQcm9wZXJCaWRJbmZvVmFsdWUnKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd3QodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi50eXBlID0gJ3RleHQvamF2YXNjcmlwdCcsIG4uYXN5bmMgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEOiB0LmJpZElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NtTG9hZGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVMb2FkZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJ1blZpZXdhYmlsaXR5OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gTS5iaW5kKG51bGwsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChYdC5hKShuLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3RhdGVzLmNzbUxvYWRlZCA9ICEwLCBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEh0LmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdHlwZTogJ2NzbV9mYWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0czogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c6IHQubWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfbG9hZFZpZXdhYmlsaXR5QWQtY3NtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUodCwgciwgaSksIG4uc3JjID0geHQuYS5nZXRTdGF0ZSgpLmNmZy5DU01fSlMsIHooZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfbG9hZFZpZXdhYmlsaXR5QWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChLdC5oKSh0KSwgZih0KSwgT2JqZWN0KEx0Lm0pKHQsICdzbG90cycpICYmICh4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1VQREFURV9TTE9UX0JJRFMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBJKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChMdC5tKSh0LCAnZXYnKSAmJiB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9WSUVXQUJJTElUWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5OiB0LmV2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChMdC5tKSh0LCAnY2ZuJykgJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTRVRfQ0ZHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnOiB7IENTTV9KUzogJy8vJyA9PT0gdC5jZm4uc3Vic3RyaW5nKDAsIDIpID8gdC5jZm4gOiAnLy9jLmFtYXpvbi1hZHN5c3RlbS5jb20vJy5jb25jYXQodC5jZm4pIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdfYmlkcycsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgeHQuYS5nZXRTdGF0ZSgpLmNmZy5NQVhfU0xPVFNfUEVSX1JFUVVFU1QgJiYgMCA8IHh0LmEuZ2V0U3RhdGUoKS5jZmcuTUFYX1NMT1RTX1BFUl9SRVFVRVNUOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIER0KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gITEsIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6dC5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHQuYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBvID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5nZXRTdGF0ZSgpLmNvbmZpZy5nZHByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBjID0gaS5tYXAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLm1hcChmdW5jdGlvbiAoaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShvW2FdLCBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclthXSA9IGksIGNbYV0gPSAhMCwgIW4gJiYgYy5ldmVyeShCb29sZWFuKSAmJiAobiA9ICEwLCBUdCh0LCBlLCByWzBdLCByWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShpLCAnX2dldENvbmZpZ3NBbmRGZXRjaEJpZHMnLCAhMCksIG4gfHwgKG4gPSAhMCwgVHQodCwgZSwgclswXSwgclsxXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFR0KHQsIGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFd0LmIpKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCBPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5jYWxsYmFjaycsIHJlKGUpLCAnZnVuY3Rpb24nKSwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSAmJiAoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KEx0LmwpKHQpIHx8IChPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5iaWRDb25maWcnLCByZSh0KSwgJ29iamVjdCcpLCB0ID0ge30pLCBPYmplY3QoV3QuYSkodC50aW1lb3V0KSB8fCAoJ3N0cmluZycgPT0gdHlwZW9mIHQudGltZW91dCA/IE9iamVjdChRdC5iKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdHJpbmctJy5jb25jYXQodC50aW1lb3V0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2ZldGNoQmlkcy5iaWRDb25maWcudGltZW91dCB3YXMgYSBub24tbnVtZXJpYyBzdHJpbmcgXCcnLmNvbmNhdCh0LnRpbWVvdXQsICdcJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ1R5cGVFcnJvci1mZXRjaEJpZHMuYmlkQ29uZmlnLnRpbWVvdXQnLCAhMCkgOiBPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5iaWRDb25maWcudGltZW91dCcsIHJlKHQudGltZW91dCksICdudW1iZXInKSksIE9iamVjdChMdC5tKSh0LCAncGFyYW1zJykgJiYgIU9iamVjdChMdC5sKSh0LnBhcmFtcykgPyBPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5iaWRDb25maWcucGFyYW1zJywgcmUodC5wYXJhbXMpLCAnb2JqZWN0JykgOiBPYmplY3QoTHQubSkodCwgJ3BhcmFtcycpICYmIE9iamVjdChMdC5sKSh0LnBhcmFtcykgJiYgT2JqZWN0LmtleXModC5wYXJhbXMpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodm9pZCAwID09PSB0LnBhcmFtcyB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgdC5wYXJhbXNbZV0gJiYgJ251bWJlcicgIT0gdHlwZW9mIHQucGFyYW1zW2VdICYmIChPYmplY3QoTHQuaykodC5wYXJhbXNbZV0pID8gIXQucGFyYW1zW2VdLnJlZHVjZShmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKCdzdHJpbmcnID09IHR5cGVvZiBlIHx8ICdudW1iZXInID09IHR5cGVvZiBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApICYmIChPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ25vbi1zdHJpbmcgYXJyYXkgaXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnXCdmZXRjaEJpZHMuYmlkQ29uZmlnLnBhcmFtcy4nLmNvbmNhdChlLCAnIGNvbnRhaW5zIGEgbm9uLXN0cmluZyBpdGVtJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ1R5cGVFcnJvci1mZXRjaEJpZHMuYmlkQ29uZmlnLnBhcmFtcy4nLmNvbmNhdChlKSwgITApLCAxKSA6IChPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5iaWRDb25maWcucGFyYW1zLicuY29uY2F0KGUpLCByZSh0LnBhcmFtc1tlXSksICdzdHJpbmdcJyBvciBcJ2FycmF5JyksIDEpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChMdC5tKSh0LCAnYmxvY2tlZEJpZGRlcnMnKSAmJiAhT2JqZWN0KEx0LmspKHQuYmxvY2tlZEJpZGRlcnMpID8gT2JqZWN0KFF0LmMpKCdmZXRjaEJpZHMuYmlkQ29uZmlnLmJsb2NrZWRCaWRkZXJzJywgcmUodC5ibG9ja2VkQmlkZGVycyksICdhcnJheScpIDogT2JqZWN0KEx0Lm0pKHQsICdibG9ja2VkQmlkZGVycycpICYmIE9iamVjdChMdC5rKSh0LmJsb2NrZWRCaWRkZXJzKSAmJiAodC5ibG9ja2VkQmlkZGVycy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKCdzdHJpbmcnID09IHR5cGVvZiBlIHx8ICdudW1iZXInID09IHR5cGVvZiBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCkgfHwgT2JqZWN0KFF0LmIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ25vbi1zdHJpbmcgYXJyYXkgaXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdcJ2ZldGNoQmlkcy5iaWRDb25maWcuYmxvY2tlZEJpZGRlcnMgY29udGFpbnMgYSBub24tc3RyaW5nIGl0ZW0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ1R5cGVFcnJvci1mZXRjaEJpZHMuYmlkQ29uZmlnLmJsb2NrZWRCaWRkZXJzJywgITApKSwgT2JqZWN0KEx0Lm0pKHQsICdibG9ja2VkQmlkZGVycycpID8gT2JqZWN0KEh0LmMpKCdibG9ja2VkQmlkZGVycy1mZXRjaEJpZHMnLCAneScpIDogT2JqZWN0KEh0LmMpKCdibG9ja2VkQmlkZGVycy1mZXRjaEJpZHMnLCAnbicpLCBPYmplY3QoTHQubSkodCwgJ3Nsb3RzJykgJiYgIU9iamVjdChMdC5rKSh0LnNsb3RzKSAmJiBPYmplY3QoUXQuYykoJ2ZldGNoQmlkcy5iaWRDb25maWcuc2xvdHMnLCByZSh0LnNsb3RzKSwgJ2FycmF5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKGksICdfZmV0Y2hCaWRzLXZhbGlkYXRpb24nLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHh0LmEuZ2V0U3RhdGUoKS5jb25maWcuc2ltcGxlckdQVCwgbyA9IGVlKGVlKHt9LCB0KSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkUmVxSUQ6ICcnLmNvbmNhdCh4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5sZW5ndGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90czogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkU2xvdHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrUmVxczogW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gaSAmJiAoIU9iamVjdChMdC5tKSh0LCAnc2xvdHMnKSB8fCBPYmplY3QoTHQubSkodCwgJ3Nsb3RzJykgJiYgT2JqZWN0KEx0LmspKHQuc2xvdHMpICYmIDAgPCB0LnNsb3RzLmxlbmd0aCAmJiBPYmplY3QoTHQubSkodC5zbG90c1swXSwgJ2dldFNsb3RFbGVtZW50SWQnKSkgPyAwID09PSBPYmplY3QoTnQuYikoVnQuYSkubGVuZ3RoID8gKE9iamVjdChRdC5iKShuZXcgRXJyb3IoJ2ZldGNoQmlkcyB3YXMgY2FsbGVkIGluIHNpbXBsZXJHUFQgbW9kZSBiZWZvcmUgYW55IHNsb3RzIHdlcmUgZGVmaW5lZCBpbiBHUFQnKSwgJ19mZXRjaEJpZHMtc2ltcGxlckdwdC1Ob1Nsb3RzJywgITApLCBjID0gITAsIG8uc2xvdHMgPSBbXSkgOiAodC5zbG90cyA/IChPYmplY3QoSHQuYykoJ3Nsb3RzJywgJ2dwdC1wcm92aWRlZCcpLCBvLnNsb3RzID0gdC5zbG90cy5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHdC5iKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IChPYmplY3QoSHQuYykoJ3Nsb3RzJywgJ2dwdC1mZXRjaCcpLCBvLnNsb3RzID0gT2JqZWN0KE50LmIpKFZ0LmEpKSwgby5zbG90cyA9IG8uc2xvdHMuZmlsdGVyKE50LmEpLCAwID09PSBvLnNsb3RzLmxlbmd0aCAmJiAoT2JqZWN0KFF0LmIpKG5ldyBFcnJvcignTm8gR1BUIHNsb3RzIHByb3ZpZGVkIHRvIGFwc3RhZy5mZXRjaEJpZHMoKSBoYWQgdmFsaWQgc2l6ZXMnKSwgJ19mZXRjaEJpZHMtc2ltcGxlckdwdC1Ob1ZhbGlkU2l6ZXMnLCAhMCksIGMgPSAhMCkpIDogT2JqZWN0KEx0Lm0pKHQsICdzbG90cycpICYmIE9iamVjdChMdC5rKSh0LnNsb3RzKSAmJiAoaSA/IE9iamVjdChIdC5jKSgnc2xvdHMnLCAnZ3B0LWFwcycpIDogT2JqZWN0KEh0LmMpKCdzbG90cycsICdhcHMnKSwgby5zbG90cyA9IHQuc2xvdHMubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSnQuYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIG8udmFsaWRTbG90cyA9IG8uc2xvdHMuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlzVmFsaWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikoaSwgJ19mZXRjaEJpZHMtZ2V0U2xvdHMnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE9iamVjdChCdC5pKShvLCB4dC5hLmdldFN0YXRlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gT2JqZWN0KEJ0LmIpKEgoZSwgbyksIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShpLCAnX2ZldGNoQmlkcy13cmFwQ2FsbGJhY2snLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBvLnZhbGlkU2xvdHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IGMgJiYgT2JqZWN0KFF0LmIpKG5ldyBFcnJvcignTm8gdmFsaWQgc2xvdHMgcHJvdmlkZWQgdG8gYXBzdGFnLmZldGNoQmlkcycpLCAnX2ZldGNoQmlkcy1ub1Nsb3RzJywgITApLCB2b2lkIHNldFRpbWVvdXQoZS5iaW5kKG51bGwsIFtdKSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gMSA9PT0gby5zbG90cy5sZW5ndGggPyAnc2luZ2xlJyA6ICdtdWx0aScsIHUgPSBEYXRlLm5vdygpIC0gYiA8PSBGdC5wID8gJ29ubG9hZCcgOiAnb25kZWxheScsIGQgPSB4dC5hLmdldFN0YXRlKCkuQUFYUmVxcy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRDb25maWcuc2xvdHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoTHQuaikodCwgZS5zbG90SUQpIHx8IHQucHVzaChlLnNsb3RJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc2xvdHMubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zbG90SUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChMdC5qKShkLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/ICdyZWZyZXNoJyA6ICdpbml0aWFsJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5pbmRleE9mKHQpID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEh0LmMpKCdmZXRjaEJpZHMnLCAnJy5jb25jYXQocywgJy0nKS5jb25jYXQodSwgJy0nKS5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKShpLCAnX2ZldGNoQmlkcy1mZWF0dXJlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChodChvLnNsb3RzLmZpbHRlcihOdC5kKS5tYXAoTnQuYykpLCB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdORVdfRkVUQ0hfQklEX1JFUVVFU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiBvLmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRvOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdSRUNPUkRfT1JJR0lOQUxfQklEX0NPTkZJRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRDb25maWc6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChxdC5kKSgnZmFrZV9iaWRzJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoRnQuaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTSE9VTERfQ0hVTktfUkVRVUVTVFMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBPYmplY3QoTHQubikoeHQuYS5nZXRTdGF0ZSgpLmNmZy5DSFVOS19CSURfUkVRVUVTVFNfUFJPUE9SVElPTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4dC5hLmdldFN0YXRlKCkuZXhwZXJpbWVudHMuY2h1bmtSZXF1ZXN0cyAmJiBFdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gSXQobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGYubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltsXS5iaWRSZXFJRCA9ICcnLmNvbmNhdChvLmJpZFJlcUlELCAnLScpLmNvbmNhdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdBRERfQ0hVTktFRF9SRVFVRVNUUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlkOiBvLmJpZFJlcUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNodW5rczogZi5sZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKE9iamVjdChLdC5kKSh0LCBhLCBuLCByKSwgZSwgdC5iaWRSZXFJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKE9iamVjdChLdC5kKShvLCBhLCBuLCByKSwgZSwgby5iaWRSZXFJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoWHQuYikoT2JqZWN0KEt0LmQpKG8sIGEsIG4sIHIpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikoaSwgJ19mZXRjaEJpZHMnLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSXQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gTWF0aC5jZWlsKHQudmFsaWRTbG90cy5sZW5ndGggLyB4dC5hLmdldFN0YXRlKCkuY2ZnLk1BWF9TTE9UU19QRVJfUkVRVUVTVCksIG4gPSBuZXcgQXJyYXkoZSksIHIgPSAwOyByIDwgZTsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gciAqIHh0LmEuZ2V0U3RhdGUoKS5jZmcuTUFYX1NMT1RTX1BFUl9SRVFVRVNUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0geyBzbG90czogdC52YWxpZFNsb3RzLnNsaWNlKGksIGkgKyB4dC5hLmdldFN0YXRlKCkuY2ZnLk1BWF9TTE9UU19QRVJfUkVRVUVTVCkgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlZShlZSh7fSwgdCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoUXQuYikoZSwgJ2NodW5rQ29uZmlnJywgITApLCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChMdC5tKSh4dC5hLmdldFN0YXRlKCkuY29uZmlnLCAnYWRTZXJ2ZXInKSA/IFZ0LmEuaXNTdXBwb3J0ZWQgPyAoayh0KSwgVygpKSA6IE9iamVjdChRdC5iKShuZXcgRXJyb3IoJ2Fwc3RhZy5zZXREaXNwbGF5QmlkcyBjYWxsZWQgd2l0aCB1bnN1cHBvcnRlZCBhZCBzZXJ2ZXI6ICcuY29uY2F0KHh0LmEuZ2V0U3RhdGUoKS5jb25maWcuYWRTZXJ2ZXIpKSwgJ19zZXREaXNwbGF5Qmlkcy1pbnZhbGlkQWRTZXJ2ZXInLCAhMCkgOiBPYmplY3QoUXQuYikobmV3IEVycm9yKCdhcHN0YWcuc2V0RGlzcGxheUJpZHMgY2FsbGVkIHdpdGhvdXQgc3BlY2lmeWluZyBhZCBzZXJ2ZXInKSwgJ19zZXREaXNwbGF5Qmlkcy1ub0FkU2VydmVyJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX3NldERpc3BsYXlCaWRzJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJ0KHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCh0KSwgT2JqZWN0KFZ0LmIpKHQuYWRTZXJ2ZXIpLCBndCgpLCBPYmplY3QoJHQuYikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ19pbml0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlICYmIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAnZGlzcGxheScsIGUgPSB4dC5hLmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc3BsYXknOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEh0LmMpKCd0YXJnZXRpbmcnLCAndGFyZ2V0aW5nS2V5cy1kaXNwbGF5JyksIGUuY29uZmlnLnVzZVNhZmVGcmFtZXMgPyBbXS5jb25jYXQodGUoRnQuZyksIFsnYW16bmhvc3QnXSkgOiBGdC5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChIdC5jKSgndGFyZ2V0aW5nJywgJ3RhcmdldGluZ0tleXMtdmlkZW8nKSwgZS5jb25maWcudXNlU2FmZUZyYW1lcyA/IFtdLmNvbmNhdCh0ZShGdC53KSwgWydhbXpuaG9zdCddKSA6IEZ0Lnc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChLdC5nKSh4dC5hLmdldFN0YXRlKCksIFZ0LmEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KEh0LmMpKCd0YXJnZXRpbmcnLCAndGFyZ2V0aW5nS2V5cy1uZXdCaWQnKSwgT2JqZWN0KEx0LmspKHh0LmEuZ2V0U3RhdGUoKS50YXJnZXRpbmdLZXlzW3RdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geHQuYS5nZXRTdGF0ZSgpLnRhcmdldGluZ0tleXNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEh0LmMpKCd0YXJnZXRpbmcnLCAndGFyZ2V0aW5nS2V5cy1pbnZhbGlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChRdC5iKSh0LCAnX3RhcmdldGluZ0tleXMnLCAhMCksIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGt0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geHQuYS5nZXRTdGF0ZSgpLkFBWFJlcXMucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZENvbmZpZy5zbG90cy5yZWR1Y2UoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2Uuc2xvdElEXSA9IGUuc2xvdE5hbWUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KFF0LmIpKHQsICdfZ2V0U2xvdElkVG9OYW1lTWFwcGluZycsICEwKSwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUHQodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogYXJndW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEx0Lm0pKHdpbmRvdywgJ2Fwc3RhZycpICYmIE9iamVjdChMdC5tKSh3aW5kb3cuYXBzdGFnLCAnX1EnKSAmJiAwIDwgd2luZG93LmFwc3RhZy5fUS5sZW5ndGggJiYgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9RJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBROiB3aW5kb3cuYXBzdGFnLl9RCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFF0LmIpKHQsICdhcHN0YWctc3RvcmVRJywgITApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hcHN0YWcgPSAobnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdW50OiBfdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IFJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc6IHF0LmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2V0U2xvdElkVG9OYW1lTWFwcGluZzoga3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdLZXlzOiBDdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQmlkczogRHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5QmlkczogQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJJbXA6IHZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogX3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVJZDogWnQuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUlkOiBadC5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZXdJZDogWnQuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwYTogWnQuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYTogWnQuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJwYTogWnQuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkUGFydHlEYXRhOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3Qua2V5cyhudCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgIT09IHJlKG50W3RdKSAmJiAobnRbdF0gPSBQdCh0LCBudFt0XSksIG50W3RdID0gT2JqZWN0KFF0LmQpKG50W3RdLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID8gT2JqZWN0KHF0LmIpKCEwLCB0KSA6IGUgJiYgT2JqZWN0KHF0LmIpKCExLCB0KSwgITAgPT09IE9iamVjdChxdC5jKSgnZXhwb3NlQXBpJykgJiYgKG50Ll9hcGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZ2V0QmlkU2V0SW5mbzogZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXBwbHlUYXJnZXRpbmdUb0dQVFNsb3Q6IEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaDogeHQuYS5kaXNwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbGVhclRhcmdldGluZ0Zyb21HUFRTbG90OiBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NsZWFyQmlkU2V0T25TbG90OiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RvRmJTeW5jOiBQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2dldEN1cnJlbnRTbG90QmlkczogdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jcmVhdGl2ZVVSTDogQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNsb3RGZXRjaENvdW50czogaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEJpZFVybDogS3QuZAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbnQpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTSE9VTERfU0FNUExFX0ZFQVRVUkVTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBPYmplY3QoTHQubikoeHQuYS5nZXRTdGF0ZSgpLmNmZy5GRUFUVVJFX1NBTVBMSU5HX1JBVEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTSE9VTERfQ0ZfUk9VVEUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE9iamVjdChMdC5uKSh4dC5hLmdldFN0YXRlKCkuY2ZnLkNGX1JPVVRJTkdfUkFURSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHh0LmEuZ2V0U3RhdGUoKS5leHBlcmltZW50cy5zaG91bGRDRlJvdXRlICYmIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NFVF9IT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lOiAnREVGQVVMVF9BQVhfQklEX0hPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdFZhbHVlOiAnYy5hbWF6b24tYWRzeXN0ZW0uY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnU0hPVUxEX1NBTVBMRV9MQVRFTkNZJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBPYmplY3QoTHQubikoeHQuYS5nZXRTdGF0ZSgpLmNmZy5MQVRFTkNZX1NBTVBMSU5HX1JBVEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsICE9PSB4dC5hLmdldFN0YXRlKCkuY2ZnLlRFU1RfQklEX0VORFBPSU5UKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KEx0Lm4pKHh0LmEuZ2V0U3RhdGUoKS5jZmcuVEVTVF9QQVRIX0ZSRVFVRU5DWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0LmEuZGlzcGF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1NIT1VMRF9VU0VfVEVTVF9CSURfRU5EUE9JTlQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgJiYgbnVsbCAhPT0geHQuYS5nZXRTdGF0ZSgpLmNmZy5URVNUX1BBVEhfTEFURU5DWV9TQU1QTEVfUkFURSAmJiB4dC5hLmRpc3BhdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTSE9VTERfU0FNUExFX0xBVEVOQ1knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE9iamVjdChMdC5uKSh4dC5hLmdldFN0YXRlKCkuY2ZnLlRFU1RfUEFUSF9MQVRFTkNZX1NBTVBMRV9SQVRFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHQuYS5kaXNwYXRjaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdTSE9VTERfU0FNUExFX1NMT1RfUkVOREVSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE9iamVjdChMdC5uKSh4dC5hLmdldFN0YXRlKCkuY2ZnLlNMT1RfUkVOREVSX1NBTVBMSU5HX1JBVEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB4dC5hLmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZXhwZXJpbWVudHMuc2hvdWxkU2FtcGxlTGF0ZW5jeSB8fCBlLmRpc3BsYXlBZFNlcnZlci5zaG91bGRTYW1wbGVSZW5kZXIpICYmIHJ0KCksIGUuZGlzcGxheUFkU2VydmVyLnNob3VsZFNhbXBsZVJlbmRlciAmJiBjdCgpLCBlLmV4cGVyaW1lbnRzLnNob3VsZFNhbXBsZUxhdGVuY3kgJiYgYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ2Fwc3RhZy1zYW1wbGVMYXRlbmN5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoUXQuYikodCwgJ2Fwc3RhZy1kb0xhc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KEJ0LmspKHdpbmRvdywgITApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgJ29iamVjdCcgIT09IHJlKHQpIHx8ICh0ID0gJ1JlcXVlc3QgVGltZW91dCBvciBFcnJvcicpLCBPYmplY3QoUXQuYikoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdjc20tcnRiLWNvbW0tanMgbG9hZGluZyBmYWlsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdfX2NzbS1ydGItY29tbS1qc19fJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChYdC5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHh0LmEuZ2V0U3RhdGUoKS5jZmcuQ1NNX1JUQl9DT01NVU5JQ0FUT1JfSlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNjRiZDU5MWYyY2E2OTc4MCA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzY0YmQ1OTFmMmNhNjk3ODApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19jNDYwN2QxMGIwYWNiZjZiLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlYWR5U3RhdGUgPT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUgJiYgMjAwID09PSBlLnN0YXR1cyA/IGV2YWwoZS5yZXNwb25zZVRleHQpIDogbihKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBlLnN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGUucmVzcG9uc2VYTUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzY0YmQ1OTFmMmNhNjk3ODApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzY0YmQ1OTFmMmNhNjk3ODApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9udGltZW91dDogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnX19sb2FkLWNzbS1ydGItY29tbS1qc19fJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHF0LmUpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICB9KCkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdChRdC5iKSh0LCAnYXBzdGFnJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-bidbarrel-metacritic-rv.min","aliases":["sugarcoat-bidbarrel-metacritic-rv.min"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfNDM2ZDZmNmY5NDc2MzI1MyA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBsZXQgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICBjbGFzcyBTdG9yYWdlIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5KGluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0SXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywga2V5KSA/IHRoaXNba2V5XSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0SXRlbShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBTdG9yYWdlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLmxvY2FsU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5zZXNzaW9uU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlzU2VhbGVkID0gdHJ1ZTsKICAgIH0pKCRfX19tb2NrXzQzNmQ2ZjZmOTQ3NjMyNTMpOwogICAgY29uc3QgJF9fX21vY2tfNmJmMjhmZGFkNmM2MzEzNyA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja182YmYyOGZkYWQ2YzYzMTM3KTsKICAgIGNvbnN0ICRfX19tb2NrX2EyNjMxOWI1ODAxMDlkMmUgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgZmV0Y2ggPSBhc3luYyAocmVzb3VyY2UsIGluaXQgPSBudWxsKSA9PiB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCcpOwogICAgICAgIH07CiAgICAgICAgZXhwb3J0cy5mZXRjaCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogZmV0Y2gsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgIH0pKCRfX19tb2NrX2EyNjMxOWI1ODAxMDlkMmUpOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gcihuKSB7CiAgICAgICAgICAgICAgICBpZiAodFtuXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0W25dLmV4cG9ydHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaSA9IHRbbl0gPSB7CiAgICAgICAgICAgICAgICAgICAgaTogbiwKICAgICAgICAgICAgICAgICAgICBsOiAhMSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiB7fQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBlW25dLmNhbGwoaS5leHBvcnRzLCBpLCBpLmV4cG9ydHMsIHIpLCBpLmwgPSAhMCwgaS5leHBvcnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHIubSA9IGUsIHIuYyA9IHQsIHIuZCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICByLm8oZSwgdCkgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICBnZXQ6IG4KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCByLnIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICB9LCByLnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgaWYgKDEgJiB0ICYmIChlID0gcihlKSksIDggJiB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoNCAmIHQgJiYgJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgIGlmIChyLnIobiksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnZGVmYXVsdCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlCiAgICAgICAgICAgICAgICAgICAgfSksIDIgJiB0ICYmICdzdHJpbmcnICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZChuLCBpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgIH0sIHIubiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IGUgJiYgZS5fX2VzTW9kdWxlID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRlZmF1bHQ7CiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiByLmQodCwgJ2EnLCB0KSwgdDsKICAgICAgICAgICAgfSwgci5vID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgdCk7CiAgICAgICAgICAgIH0sIHIucCA9ICcnLCByKHIucyA9IDIyNSk7CiAgICAgICAgfShbCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOTIpLCBpID0ge307CiAgICAgICAgICAgICAgICBpW3IoMTkpKCd0b1N0cmluZ1RhZycpXSA9ICd6JywgaSArICcnICE9ICdbb2JqZWN0IHpdJyAmJiByKDQxKShPYmplY3QucHJvdG90eXBlLCAndG9TdHJpbmcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0ICcgKyBuKHRoaXMpICsgJ10nOwogICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHIoMyksIGkgPSByKDcwKSwgbyA9IHIoNDEpLCBhID0gcigxOCksIHMgPSByKDQ2KSwgdSA9IHIoODEpLCBjID0gcigxOSksIGQgPSBjKCdpdGVyYXRvcicpLCBsID0gYygndG9TdHJpbmdUYWcnKSwgZiA9IHUuQXJyYXksIHAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1NSdWxlTGlzdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU1NTdHlsZURlY2xhcmF0aW9uOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTU1ZhbHVlTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRSZWN0TGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01SZWN0TGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBET01TdHJpbmdMaXN0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVRva2VuTGlzdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MQWxsQ29sbGVjdGlvbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MQ29sbGVjdGlvbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MRm9ybUVsZW1lbnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFMaXN0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlQXJyYXk6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50UmVxdWVzdExpc3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbkFycmF5OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWR0xlbmd0aExpc3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHTnVtYmVyTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdQYXRoU2VnTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdQb2ludExpc3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1ZHU3RyaW5nTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVkdUcmFuc2Zvcm1MaXN0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUJ1ZmZlckxpc3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGVTaGVldExpc3Q6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFRyYWNrQ3VlTGlzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VHJhY2tMaXN0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdWNoTGlzdDogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IGkocCksIG0gPSAwOyBtIDwgZy5sZW5ndGg7IG0rKykgewogICAgICAgICAgICAgICAgICAgIHZhciB2LCBiID0gZ1ttXSwgeSA9IHBbYl0sIGggPSBhW2JdLCBTID0gaCAmJiBoLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICBpZiAoUyAmJiAoU1tkXSB8fCBzKFMsIGQsIGYpLCBTW2xdIHx8IHMoUywgbCwgYiksIHVbYl0gPSBmLCB5KSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHYgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU1t2XSB8fCBvKFMsIHYsIG5bdl0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDUwKSwgbyA9IHIoMjgpLCBhID0gcigxNCksIHMgPSByKDQxKSwgdSA9IHIoNzgpLktFWSwgYyA9IHIoMjQpLCBkID0gcigxMDQpLCBsID0gcig3OSksIGYgPSByKDYzKSwgcCA9IHIoMTkpLCBnID0gcigxNjApLCBtID0gcigxNjEpLCB2ID0gcigyMjgpLCBiID0gcigxNjIpLCB5ID0gcigyNyksIGggPSByKDIzKSwgUyA9IHIoNDcpLCBPID0gcig1NyksIF8gPSByKDg5KSwgRSA9IHIoNzcpLCBJID0gcig4MCksIHcgPSByKDIzMCksIEEgPSByKDkwKSwgVCA9IHIoMTA2KSwgeCA9IHIoMzIpLCBDID0gcig3MCksIFAgPSBBLmYsIGogPSB4LmYsIFIgPSB3LmYsIEQgPSBuLlN5bWJvbCwgayA9IG4uSlNPTiwgTiA9IGsgJiYgay5zdHJpbmdpZnksIE0gPSBwKCdfaGlkZGVuJyksIFUgPSBwKCd0b1ByaW1pdGl2ZScpLCBCID0ge30ucHJvcGVydHlJc0VudW1lcmFibGUsIEwgPSBkKCdzeW1ib2wtcmVnaXN0cnknKSwgeiA9IGQoJ3N5bWJvbHMnKSwgViA9IGQoJ29wLXN5bWJvbHMnKSwgRiA9IE9iamVjdC5wcm90b3R5cGUsIHEgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBEICYmICEhVC5mLCBHID0gbi5RT2JqZWN0LCBXID0gIUcgfHwgIUcucHJvdG90eXBlIHx8ICFHLnByb3RvdHlwZS5maW5kQ2hpbGQsIEggPSBvICYmIGMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNyAhPSBJKGooe30sICdhJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5hOwogICAgICAgICAgICAgICAgICAgIH0pID8gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBQKEYsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICBuICYmIGRlbGV0ZSBGW3RdLCBqKGUsIHQsIHIpLCBuICYmIGUgIT09IEYgJiYgaihGLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9IDogaiwgWSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geltlXSA9IEkoRC5wcm90b3R5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fayA9IGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgSyA9IHEgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIEQuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N5bWJvbCcgPT0gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRDsKICAgICAgICAgICAgICAgICAgICB9LCBKID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IEYgJiYgSihWLCB0LCByKSwgeShlKSwgdCA9IF8odCwgITApLCB5KHIpLCBpKHosIHQpID8gKHIuZW51bWVyYWJsZSA/IChpKGUsIE0pICYmIGVbTV1bdF0gJiYgKGVbTV1bdF0gPSAhMSksIHIgPSBJKHIsIHsgZW51bWVyYWJsZTogRSgwLCAhMSkgfSkpIDogKGkoZSwgTSkgfHwgaihlLCBNLCBFKDEsIHt9KSksIGVbTV1bdF0gPSAhMCksIEgoZSwgdCwgcikpIDogaihlLCB0LCByKTsKICAgICAgICAgICAgICAgICAgICB9LCBRID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciwgbiA9IHYodCA9IE8odCkpLCBpID0gMCwgbyA9IG4ubGVuZ3RoOyBvID4gaTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooZSwgciA9IG5baSsrXSwgdFtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgWCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQi5jYWxsKHRoaXMsIGUgPSBfKGUsICEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHRoaXMgPT09IEYgJiYgaSh6LCBlKSAmJiAhaShWLCBlKSkgJiYgKCEodCB8fCAhaSh0aGlzLCBlKSB8fCAhaSh6LCBlKSB8fCBpKHRoaXMsIE0pICYmIHRoaXNbTV1bZV0pIHx8IHQpOwogICAgICAgICAgICAgICAgICAgIH0sICQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9IE8oZSksIHQgPSBfKHQsICEwKSwgZSAhPT0gRiB8fCAhaSh6LCB0KSB8fCBpKFYsIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFAoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXIgfHwgIWkoeiwgdCkgfHwgaShlLCBNKSAmJiBlW01dW3RdIHx8IChyLmVudW1lcmFibGUgPSAhMCksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBaID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgciA9IFIoTyhlKSksIG4gPSBbXSwgbyA9IDA7IHIubGVuZ3RoID4gbzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoeiwgdCA9IHJbbysrXSkgfHwgdCA9PSBNIHx8IHQgPT0gdSB8fCBuLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfSwgZWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCByID0gZSA9PT0gRiwgbiA9IFIociA/IFYgOiBPKGUpKSwgbyA9IFtdLCBhID0gMDsgbi5sZW5ndGggPiBhOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIWkoeiwgdCA9IG5bYSsrXSkgfHwgciAmJiAhaShGLCB0KSB8fCBvLnB1c2goelt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHEgfHwgKHMoKEQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGYoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB2b2lkIDApLCB0ID0gZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgPT09IEYgJiYgdC5jYWxsKFYsIHIpLCBpKHRoaXMsIE0pICYmIGkodGhpc1tNXSwgZSkgJiYgKHRoaXNbTV1bZV0gPSAhMSksIEgodGhpcywgZSwgRSgxLCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gJiYgVyAmJiBIKEYsIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiB0CiAgICAgICAgICAgICAgICAgICAgfSksIFkoZSk7CiAgICAgICAgICAgICAgICB9KS5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fazsKICAgICAgICAgICAgICAgIH0pLCBBLmYgPSAkLCB4LmYgPSBKLCByKDY2KS5mID0gdy5mID0gWiwgcig5MSkuZiA9IFgsIFQuZiA9IGVlLCBvICYmICFyKDY0KSAmJiBzKEYsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsIFgsICEwKSwgZy5mID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWShwKGUpKTsKICAgICAgICAgICAgICAgIH0pLCBhKGEuRyArIGEuVyArIGEuRiAqICFxLCB7IFN5bWJvbDogRCB9KTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHRlID0gJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJy5zcGxpdCgnLCcpLCByZSA9IDA7IHRlLmxlbmd0aCA+IHJlOykgewogICAgICAgICAgICAgICAgICAgIHAodGVbcmUrK10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgbmUgPSBDKHAuc3RvcmUpLCBpZSA9IDA7IG5lLmxlbmd0aCA+IGllOykgewogICAgICAgICAgICAgICAgICAgIG0obmVbaWUrK10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYShhLlMgKyBhLkYgKiAhcSwgJ1N5bWJvbCcsIHsKICAgICAgICAgICAgICAgICAgICBmb3I6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKEwsIGUgKz0gJycpID8gTFtlXSA6IExbZV0gPSBEKGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAga2V5Rm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUsoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihlICsgJyBpcyBub3QgYSBzeW1ib2whJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTFt0XSA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB1c2VTZXR0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVyA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdXNlU2ltcGxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFcgPSAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgYShhLlMgKyBhLkYgKiAhcSwgJ09iamVjdCcsIHsKICAgICAgICAgICAgICAgICAgICBjcmVhdGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHQgPyBJKGUpIDogUShJKGUpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5OiBKLAogICAgICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXM6IFEsCiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkLAogICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5TmFtZXM6IFosCiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBlZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgb2UgPSBjKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBULmYoMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGEoYS5TICsgYS5GICogb2UsICdPYmplY3QnLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVC5mKFMoZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBrICYmIGEoYS5TICsgYS5GICogKCFxIHx8IGMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gRCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnW251bGxdJyAhPSBOKFtlXSkgfHwgJ3t9JyAhPSBOKHsgYTogZSB9KSB8fCAne30nICE9IE4oT2JqZWN0KGUpKTsKICAgICAgICAgICAgICAgIH0pKSwgJ0pTT04nLCB7CiAgICAgICAgICAgICAgICAgICAgc3RyaW5naWZ5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCByLCBuID0gW2VdLCBpID0gMTsgYXJndW1lbnRzLmxlbmd0aCA+IGk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goYXJndW1lbnRzW2krK10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gdCA9IG5bMV0sIChoKHQpIHx8IHZvaWQgMCAhPT0gZSkgJiYgIUsoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKHQpIHx8ICh0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgciAmJiAodCA9IHIuY2FsbCh0aGlzLCBlLCB0KSksICFLKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuWzFdID0gdCwgTi5hcHBseShrLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBELnByb3RvdHlwZVtVXSB8fCByKDQ2KShELnByb3RvdHlwZSwgVSwgRC5wcm90b3R5cGUudmFsdWVPZiksIGwoRCwgJ1N5bWJvbCcpLCBsKE1hdGgsICdNYXRoJywgITApLCBsKG4uSlNPTiwgJ0pTT04nLCAhMCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTA3KSwgaSA9IHIoMTY1KSwgbyA9IHIoODEpLCBhID0gcig1Nyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKDEzMykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdCA9IGEoZSksIHRoaXMuX2kgPSAwLCB0aGlzLl9rID0gdDsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX3QsIHQgPSB0aGlzLl9rLCByID0gdGhpcy5faSsrOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhZSB8fCByID49IGUubGVuZ3RoID8gKHRoaXMuX3QgPSB2b2lkIDAsIGkoMSkpIDogaSgwLCAna2V5cycgPT0gdCA/IHIgOiAndmFsdWVzJyA9PSB0ID8gZVtyXSA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgZVtyXQogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgfSwgJ3ZhbHVlcycpLCBvLkFyZ3VtZW50cyA9IG8uQXJyYXksIG4oJ2tleXMnKSwgbigndmFsdWVzJyksIG4oJ2VudHJpZXMnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHIoMTYxKSgnYXN5bmNJdGVyYXRvcicpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDQ3KSwgaSA9IHIoNzApOwogICAgICAgICAgICAgICAgcigxNjcpKCdrZXlzJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShuKGUpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTY4KSghMCk7CiAgICAgICAgICAgICAgICByKDEzMykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90ID0gU3RyaW5nKGUpLCB0aGlzLl9pID0gMDsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IHRoaXMuX3QsIHIgPSB0aGlzLl9pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByID49IHQubGVuZ3RoID8gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgIH0gOiAoZSA9IG4odCwgciksIHRoaXMuX2kgKz0gZS5sZW5ndGgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIoMzI4KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0VW5pcXVlSWRlbnRpZmllclN0ciA9IFIsIHQuZ2VuZXJhdGVVVUlEID0gZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyAodCBeICh3aW5kb3cgJiYgd2luZG93LmNyeXB0byAmJiB3aW5kb3cuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA/IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICUgMTYgOiAxNiAqIE1hdGgucmFuZG9tKCkpID4+IHQgLyA0KS50b1N0cmluZygxNikgOiAoWzEwMDAwMDAwXSArIC0xMDAwICsgLTQwMDAgKyAtODAwMCArIC0xMDAwMDAwMDAwMDApLnJlcGxhY2UoL1swMThdL2csIGUpOwogICAgICAgICAgICAgICAgfSwgdC5nZXRCaWRJZFBhcmFtZXRlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdFtlXSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfSwgdC50cnlBcHBlbmRRdWVyeVN0cmluZyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgKyB0ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHIpICsgJyYnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIHQucGFyc2VRdWVyeVN0cmluZ1BhcmFtZXRlcnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkocikgJiYgKHQgKz0gciArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChlW3JdKSArICcmJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gdC5yZXBsYWNlKC8mJC8sICcnKTsKICAgICAgICAgICAgICAgIH0sIHQudHJhbnNmb3JtQWRTZXJ2ZXJUYXJnZXRpbmdPYmogPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmxlbmd0aCA+IDAgPyBlZShlKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdCh0LCAnPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodGUoZSwgdCkpKTsKICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcmJykgOiAnJzsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0QWRVbml0U2l6ZXMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKGUubWVkaWFUeXBlcyAmJiBlLm1lZGlhVHlwZXMuYmFubmVyICYmIEFycmF5LmlzQXJyYXkoZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzOwogICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHJbMF0pID8gdCA9IHIgOiB0LnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShlLnNpemVzKSAmJiAoQXJyYXkuaXNBcnJheShlLnNpemVzWzBdKSA/IHQgPSBlLnNpemVzIDogdC5wdXNoKGUuc2l6ZXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9LCB0LnBhcnNlU2l6ZXNJbnB1dCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnNwbGl0KCcsJyksIG4gPSAvXihcZCkreChcZCkrJC9pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSChyLCBpKSAmJiByW2ldLm1hdGNoKG4pICYmIHQucHVzaChyW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ29iamVjdCcgPT09IGIoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiA9PT0gbyAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgZVswXSAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgZVsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChEKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBvOyBhKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKEQoZVthXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0sIHQucGFyc2VHUFRTaW5nbGVTaXplQXJyYXkgPSBELCB0LnBhcnNlR1BUU2luZ2xlU2l6ZUFycmF5VG9SdGJTaXplID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoayhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB0LmdldFdpbmRvd1RvcCA9IE4sIHQuZ2V0V2luZG93U2VsZiA9IE0sIHQuZ2V0V2luZG93TG9jYXRpb24gPSBVLCB0Lmhhc0NvbnNvbGVMb2dnZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9LCB0LmRlYnVnVHVybmVkT24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhbi5jb25maWcuZ2V0Q29uZmlnKCdkZWJ1ZycpOwogICAgICAgICAgICAgICAgfSwgdC5jcmVhdGVJbnZpc2libGVJZnJhbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pZCA9IFIoKSwgZS5oZWlnaHQgPSAwLCBlLndpZHRoID0gMCwgZS5ib3JkZXIgPSAnMHB4JywgZS5oc3BhY2UgPSAnMCcsIGUudnNwYWNlID0gJzAnLCBlLm1hcmdpbldpZHRoID0gJzAnLCBlLm1hcmdpbkhlaWdodCA9ICcwJywgZS5zdHlsZS5ib3JkZXIgPSAnMCcsIGUuc2Nyb2xsaW5nID0gJ25vJywgZS5mcmFtZUJvcmRlciA9ICcwJywgZS5zcmMgPSAnYWJvdXQ6YmxhbmsnLCBlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIGU7CiAgICAgICAgICAgICAgICB9LCB0LmdldFBhcmFtZXRlckJ5TmFtZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZlKFUoKS5zZWFyY2gpW2VdIHx8ICcnOwogICAgICAgICAgICAgICAgfSwgdC5pc0EgPSBCLCB0LmlzRm4gPSBMLCB0LmlzU3RyID0geiwgdC5pc0FycmF5ID0gViwgdC5pc051bWJlciA9IEYsIHQuaXNQbGFpbk9iamVjdCA9IHEsIHQuaXNCb29sZWFuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihlLCAnQm9vbGVhbicpOwogICAgICAgICAgICAgICAgfSwgdC5pc0VtcHR5ID0gRywgdC5pc0VtcHR5U3RyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geihlKSAmJiAoIWUgfHwgMCA9PT0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgfSwgdC5fZWFjaCA9IFcsIHQuY29udGFpbnMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChHKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKEwoZS5pbmRleE9mKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IGUuaW5kZXhPZih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgci0tOykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVtyXSA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0sIHQuX21hcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEcoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoTChlLm1hcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXKGUsIGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh0KG4sIGksIGUpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0sIHQuaGFzT3duID0gSCwgdC5pbnNlcnRFbGVtZW50ID0gWSwgdC50cmlnZ2VyUGl4ZWwgPSBLLCB0LmNhbGxCdXJsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc291cmNlLCByID0gZS5idXJsOwogICAgICAgICAgICAgICAgICAgIHQgPT09IHkuUzJTLlNSQyAmJiByICYmIFQudHJpZ2dlclBpeGVsKHIpOwogICAgICAgICAgICAgICAgfSwgdC5pbnNlcnRIdG1sSW50b0lmcmFtZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICB0LmlkID0gUigpLCB0LndpZHRoID0gMCwgdC5oZWlnaHQgPSAwLCB0LmhzcGFjZSA9ICcwJywgdC52c3BhY2UgPSAnMCcsIHQubWFyZ2luV2lkdGggPSAnMCcsIHQubWFyZ2luSGVpZ2h0ID0gJzAnLCB0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIHQuc3R5bGUuaGVpZ2h0ID0gJzBweCcsIHQuc3R5bGUud2lkdGggPSAnMHB4JywgdC5zY3JvbGxpbmcgPSAnbm8nLCB0LmZyYW1lQm9yZGVyID0gJzAnLCB0LmFsbG93dHJhbnNwYXJlbmN5ID0gJ3RydWUnLCBULmluc2VydEVsZW1lbnQodCwgZG9jdW1lbnQsICdib2R5JyksIHQuY29udGVudFdpbmRvdy5kb2N1bWVudC5vcGVuKCksIHQuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShlKSwgdC5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9LCB0Lmluc2VydFVzZXJTeW5jSWZyYW1lID0gSiwgdC5jcmVhdGVUcmFja1BpeGVsSHRtbCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlbmNvZGVVUkkoZSksIHIgPSAnPGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7bGVmdDowcHg7dG9wOjBweDt2aXNpYmlsaXR5OmhpZGRlbjsiPic7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgKz0gJzxpbWcgc3JjPSInICsgdCArICciPjwvZGl2Pic7CiAgICAgICAgICAgICAgICB9LCB0LmNyZWF0ZVRyYWNrUGl4ZWxJZnJhbWVIdG1sID0gUSwgdC5nZXRWYWx1ZVN0cmluZyA9IFgsIHQudW5pcXVlcyA9ICQsIHQuZmxhdHRlbiA9IFosIHQuZ2V0QmlkUmVxdWVzdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc29tZShmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICgwLCBvLmRlZmF1bHQpKHQuYmlkcywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpZElkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpZF9pZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uc29tZShmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3JdID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAociA9IG4pLCBuOwogICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgfSwgdC5nZXRLZXlzID0gZWUsIHQuZ2V0VmFsdWUgPSB0ZSwgdC5nZXRLZXlCeVZhbHVlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzT3duUHJvcGVydHkocikgJiYgZVtyXSA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB0LmdldEJpZGRlckNvZGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiBwYmpzLmFkVW5pdHM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZHMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShaLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKFopLmZpbHRlcigkKTsKICAgICAgICAgICAgICAgIH0sIHQuaXNHcHRQdWJhZHNEZWZpbmVkID0gcmUsIHQuc2h1ZmZsZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdCA+IDA7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQtLTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBlW3RdID0gZVtyXSwgZVtyXSA9IG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSwgdC5hZFVuaXRzRmlsdGVyID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGEuZGVmYXVsdCkoZSwgdCAmJiB0LmFkVW5pdENvZGUpOwogICAgICAgICAgICAgICAgfSwgdC5kZWVwQ2xvbmUgPSBzZSwgdC5pbklmcmFtZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVC5nZXRXaW5kb3dTZWxmKCkgIT09IFQuZ2V0V2luZG93VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgdC5pc1NhZmFyaUJyb3dzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eKCg/IWNocm9tZXxhbmRyb2lkfGNyaW9zfGZ4aW9zKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICB9LCB0LnJlcGxhY2VBdWN0aW9uUHJpY2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL1wkXHtBVUNUSU9OX1BSSUNFXH0vZywgdCk7CiAgICAgICAgICAgICAgICB9LCB0LnJlcGxhY2VDbGlja1Rocm91Z2ggPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhdCB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL1wke0NMSUNLVEhST1VHSH0vZywgdCk7CiAgICAgICAgICAgICAgICB9LCB0LnRpbWVzdGFtcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICB9LCB0LmdldFBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgfHwgMDsKICAgICAgICAgICAgICAgIH0sIHQuaGFzRGV2aWNlQWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMSAhPT0gbi5jb25maWcuZ2V0Q29uZmlnKCdkZXZpY2VBY2Nlc3MnKTsKICAgICAgICAgICAgICAgIH0sIHQuY2hlY2tDb29raWVTdXBwb3J0ID0gdWUsIHQuZGVsYXlFeGVjdXRpb24gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0IDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bVJlcXVpcmVkQ2FsbHMgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4gR290ICcuY29uY2F0KHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICsrciA9PT0gdCAmJiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHQuZ3JvdXBCeSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVtyW3RdXSA9IGVbclt0XV0gfHwgW10pLnB1c2gociksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgfSwgdC5nZXREZWZpbmVkUGFyYW1zID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2KHQsIG0oe30sIHIsIGVbcl0pKTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICB9LCB0LmlzVmFsaWRNZWRpYVR5cGVzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYXRpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8nCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5rZXlzKGUpLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGEuZGVmYXVsdCkodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGUudmlkZW8gJiYgZS52aWRlby5jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5kZWZhdWx0KShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5zdHJlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dHN0cmVhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRwb2QnCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIGUudmlkZW8uY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0QmlkZGVyUmVxdWVzdCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBvLmRlZmF1bHQpKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXIgPT09IHQgJiYgZS5hZFVuaXRDb2RlID09PSByOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgICAgIH0pIHx8IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogbnVsbAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmdldFVzZXJDb25maWd1cmVkUGFyYW1zID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29kZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkczsKICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoWiwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXIgPT09IHI7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmFtcyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0T3JpZ2luID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luID8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiA6IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgKyAod2luZG93LmxvY2F0aW9uLnBvcnQgPyAnOicgKyB3aW5kb3cubG9jYXRpb24ucG9ydCA6ICcnKTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0RE5UID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnMScgPT09IG5hdmlnYXRvci5kb05vdFRyYWNrIHx8ICcxJyA9PT0gd2luZG93LmRvTm90VHJhY2sgfHwgJzEnID09PSBuYXZpZ2F0b3IubXNEb05vdFRyYWNrIHx8ICd5ZXMnID09PSBuYXZpZ2F0b3IuZG9Ob3RUcmFjazsKICAgICAgICAgICAgICAgIH0sIHQuaXNBZFVuaXRDb2RlTWF0Y2hpbmdTbG90ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmlzU2xvdE1hdGNoaW5nQWRVbml0Q29kZSA9IGRlLCB0LmdldEdwdFNsb3RJbmZvRm9yQWRVbml0Q29kZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgcmUoKSAmJiAodCA9ICgwLCBvLmRlZmF1bHQpKHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0U2xvdHMoKSwgZGUoZSkpKTsKICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B0U2xvdDogdC5nZXRBZFVuaXRQYXRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZJZDogdC5nZXRTbG90RWxlbWVudElkKCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgfSwgdC51bnN1cHBvcnRlZEJpZGRlck1lc3NhZ2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXMoZS5tZWRpYVR5cGVzIHx8IHsgYmFubmVyOiAnYmFubmVyJyB9KS5qb2luKCcsICcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXG4gICAgJy5jb25jYXQoZS5jb2RlLCAnIGlzIGEgJykuY29uY2F0KHIsICcgYWQgdW5pdFxuICAgIGNvbnRhaW5pbmcgYmlkZGVycyB0aGF0IGRvblwndCBzdXBwb3J0ICcpLmNvbmNhdChyLCAnOiAnKS5jb25jYXQodCwgJy5cbiAgICBUaGlzIGJpZGRlciB3b25cJ3QgZmV0Y2ggZGVtYW5kLlxuICAnKTsKICAgICAgICAgICAgICAgIH0sIHQuaXNJbnRlZ2VyID0gbGUsIHQuY29udmVydENhbWVsVG9VbmRlcnNjb3JlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8oPzpefFwuPykoW0EtWl0pL2csIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXycgKyB0LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSkucmVwbGFjZSgvXl8vLCAnJyk7CiAgICAgICAgICAgICAgICB9LCB0LmNsZWFuT2JqID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkucmVkdWNlKGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGVbcl0gJiYgKHRbcl0gPSBlW3JdKSwgdDsKICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICB9LCB0LnBpY2sgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gYihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnJlZHVjZShmdW5jdGlvbiAociwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuLCBhID0gbi5tYXRjaCgvXiguKz8pXHNhc1xzKC4rPykkL2kpOwogICAgICAgICAgICAgICAgICAgICAgICBhICYmIChuID0gYVsxXSwgbyA9IGFbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiB0W2kgKyAxXSAmJiAocyA9IHRbaSArIDFdKHMsIHIpKSwgdm9pZCAwICE9PSBzICYmIChyW29dID0gcyksIHI7CiAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgfSwgdC50cmFuc2Zvcm1CaWRkZXJQYXJhbUtleXdvcmRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogJ2tleXdvcmRzJywgciA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXKGUsIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChWKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVyhlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZSA9IFgodCArICcuJyArIG4sIGUpKSB8fCAnJyA9PT0gZSkgJiYgaS5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF6KGUgPSBYKHQgKyAnLicgKyBuLCBlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0sIHQuY29udmVydFR5cGVzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdFtyXSAmJiAoTChlW3JdKSA/IHRbcl0gPSBlW3JdKHRbcl0pIDogdFtyXSA9IChuID0gZVtyXSwgaSA9IHRbcl0sICdzdHJpbmcnID09PSBuID8gaSAmJiBpLnRvU3RyaW5nKCkgOiAnbnVtYmVyJyA9PT0gbiA/IE51bWJlcihpKSA6IGkpLCBpc05hTih0W3JdKSAmJiBkZWxldGUgdC5rZXkpOwogICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgfSwgdC5pc0FycmF5T2ZOdW1zID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVihlKSAmJiAoIXQgfHwgZS5sZW5ndGggPT09IHQpICYmIGUuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlKGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgdC5maWxsID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gW10sIG4gPSAwOyBuIDwgdDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcShlKSA/IHNlKGUpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0sIHQuY2h1bmsgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBbXSwgbiA9IDA7IG4gPCBNYXRoLmNlaWwoZS5sZW5ndGggLyB0KTsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbiAqIHQsIG8gPSBpICsgdDsKICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGUuc2xpY2UoaSwgbykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0TWluVmFsdWVGcm9tQXJyYXkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLCBmKGUpKTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0TWF4VmFsdWVGcm9tQXJyYXkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBmKGUpKTsKICAgICAgICAgICAgICAgIH0sIHQuY29tcGFyZU9uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV0gPCByW2VdID8gMSA6IHRbZV0gPiByW2VdID8gLTEgOiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LnBhcnNlUVMgPSBmZSwgdC5mb3JtYXRRUyA9IHBlLCB0LnBhcnNlVXJsID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICB0ICYmICdub0RlY29kZVdob2xlVVJMJyBpbiB0ICYmIHQubm9EZWNvZGVXaG9sZVVSTCA/IHIuaHJlZiA9IGUgOiByLmhyZWYgPSBkZWNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0ICYmICdkZWNvZGVTZWFyY2hBc1N0cmluZycgaW4gdCAmJiB0LmRlY29kZVNlYXJjaEFzU3RyaW5nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHIuaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2w6IChyLnByb3RvY29sIHx8ICcnKS5yZXBsYWNlKC86JC8sICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IHIuaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6ICtyLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lOiByLnBhdGhuYW1lLnJlcGxhY2UoL14oPyFcLykvLCAnLycpLAogICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IG4gPyByLnNlYXJjaCA6IFQucGFyc2VRUyhyLnNlYXJjaCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IChyLmhhc2ggfHwgJycpLnJlcGxhY2UoL14jLywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICBob3N0OiByLmhvc3QgfHwgd2luZG93LmxvY2F0aW9uLmhvc3QKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgdC5idWlsZFVybCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlLnByb3RvY29sIHx8ICdodHRwJykgKyAnOi8vJyArIChlLmhvc3QgfHwgZS5ob3N0bmFtZSArIChlLnBvcnQgPyAnOicuY29uY2F0KGUucG9ydCkgOiAnJykpICsgKGUucGF0aG5hbWUgfHwgJycpICsgKGUuc2VhcmNoID8gJz8nLmNvbmNhdChULmZvcm1hdFFTKGUuc2VhcmNoIHx8ICcnKSkgOiAnJykgKyAoZS5oYXNoID8gJyMnLmNvbmNhdChlLmhhc2gpIDogJycpOwogICAgICAgICAgICAgICAgfSwgdC5kZWVwRXF1YWwgPSBnZSwgdC5tZXJnZURlZXAgPSBmdW5jdGlvbiBlKHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5baSAtIDFdID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIW4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAocSh0KSAmJiBxKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcShvW2FdKSA/ICh0W2FdIHx8IHYodCwgbSh7fSwgYSwge30pKSwgZSh0W2FdLCBvW2FdKSkgOiBWKG9bYV0pICYmIHRbYV0gPyBWKHRbYV0pICYmICh0W2FdID0gdFthXS5jb25jYXQob1thXSkpIDogdih0LCBtKHt9LCBhLCBvW2FdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodm9pZCAwLCBbdF0uY29uY2F0KG4pKTsKICAgICAgICAgICAgICAgIH0sIHQuY3lyYjUzSGFzaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogMCwgbiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEwoTWF0aC5pbXVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5pbXVsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICg0MTk0MzAzICYgZSkgKiAodCB8PSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDI5MDc3Mjk5MiAmIGUgJiYgKHIgKz0gKDQyOTA3NzI5OTIgJiBlKSAqIHQgfCAwKSwgMCB8IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gMzczNTkyODU1OSBeIHIsIG8gPSAxMTAzNTQ3OTkxIF4gciwgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlLmNoYXJDb2RlQXQoYSksIGkgPSBuKGkgXiB0LCAyNjU0NDM1NzYxKSwgbyA9IG4obyBeIHQsIDE1OTczMzQ2NzcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9IG4oaSBeIGkgPj4+IDE2LCAyMjQ2ODIyNTA3KSBeIG4obyBeIG8gPj4+IDEzLCAzMjY2NDg5OTA5KSwgKDQyOTQ5NjcyOTYgKiAoMjA5NzE1MSAmIChvID0gbihvIF4gbyA+Pj4gMTYsIDIyNDY4MjI1MDcpIF4gbihpIF4gaSA+Pj4gMTMsIDMyNjY0ODk5MDkpKSkgKyAoaSA+Pj4gMCkpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ2RlZXBBY2Nlc3MnLCB7CiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmRlZmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnZGVlcFNldFZhbHVlJywgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5kZWZhdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCB0LmdldExhdGVzdEhpZ2hlc3RDcG1CaWQgPSB0LmdldE9sZGVzdEhpZ2hlc3RDcG1CaWQgPSB0LmdldEhpZ2hlc3RDcG0gPSB0LmJpbmQgPSB0LmludGVybmFsID0gdC5sb2dFcnJvciA9IHQubG9nV2FybiA9IHQubG9nSW5mbyA9IHQubG9nTWVzc2FnZSA9IHZvaWQgMCwgcig5KSwgcig2KSwgcigxMyksIHIoMjYpLCByKDQpLCByKDIpLCByKDMyOSksIHIoNDApLCByKDMzMCksIHIoMSksIHIoMyksIHIoNSksIHIoMTAyKSwgcig0MyksIHIoMTYpLCByKDIxNCksIHIoMzMpLCByKDExKSwgcigwKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMiksIGkgPSBkKHIoMzM2KSksIG8gPSBkKHIoMzcpKSwgYSA9IGQocigzMSkpLCBzID0gZChyKDMzNykpLCB1ID0gZChyKDMzOCkpLCBjID0gcig4KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShuID0gKGEgPSBzLm5leHQoKSkuZG9uZSkgJiYgKHIucHVzaChhLnZhbHVlKSwgIXQgfHwgci5sZW5ndGggIT09IHQpOyBuID0gITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBudWxsID09IHMucmV0dXJuIHx8IHMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgcChlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IHAoZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gciA/IEFycmF5LmZyb20ocikgOiAnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSA/IGcoZSwgdCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHkgPSByKDM2KSwgaCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIFMgPSBCb29sZWFuKHdpbmRvdy5jb25zb2xlKSwgTyA9IEJvb2xlYW4oUyAmJiB3aW5kb3cuY29uc29sZS5sb2cpLCBfID0gKEJvb2xlYW4oUyAmJiB3aW5kb3cuY29uc29sZS5pbmZvKSwgQm9vbGVhbihTICYmIHdpbmRvdy5jb25zb2xlLndhcm4pLCBCb29sZWFuKFMgJiYgd2luZG93LmNvbnNvbGUuZXJyb3IpLCByKDYwKSwgKDAsIGMubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdQcmViaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yOiAnIzNiODhjMycsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogJyNGRkYnCiAgICAgICAgICAgICAgICAgICAgfSkuYXRWZXJib3NpdHkoMykpLCBFID0gXy5sb2dNZXNzYWdlOwogICAgICAgICAgICAgICAgdC5sb2dNZXNzYWdlID0gRTsKICAgICAgICAgICAgICAgIHZhciBJID0gXy5sb2dJbmZvOwogICAgICAgICAgICAgICAgdC5sb2dJbmZvID0gSTsKICAgICAgICAgICAgICAgIHZhciB3ID0gXy5sb2dXYXJuOwogICAgICAgICAgICAgICAgdC5sb2dXYXJuID0gdzsKICAgICAgICAgICAgICAgIHZhciBBID0gXy5sb2dFcnJvcjsKICAgICAgICAgICAgICAgIHQubG9nRXJyb3IgPSBBOwogICAgICAgICAgICAgICAgdmFyIFQgPSB7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tDb29raWVTdXBwb3J0OiB1ZSwKICAgICAgICAgICAgICAgICAgICBjcmVhdGVUcmFja1BpeGVsSWZyYW1lSHRtbDogUSwKICAgICAgICAgICAgICAgICAgICBnZXRXaW5kb3dTZWxmOiBNLAogICAgICAgICAgICAgICAgICAgIGdldFdpbmRvd1RvcDogTiwKICAgICAgICAgICAgICAgICAgICBnZXRXaW5kb3dMb2NhdGlvbjogVSwKICAgICAgICAgICAgICAgICAgICBpbnNlcnRVc2VyU3luY0lmcmFtZTogSiwKICAgICAgICAgICAgICAgICAgICBpbnNlcnRFbGVtZW50OiBZLAogICAgICAgICAgICAgICAgICAgIGlzRm46IEwsCiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclBpeGVsOiBLLAogICAgICAgICAgICAgICAgICAgIHBhcnNlUVM6IGZlLAogICAgICAgICAgICAgICAgICAgIGZvcm1hdFFTOiBwZSwKICAgICAgICAgICAgICAgICAgICBkZWVwRXF1YWw6IGdlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5pbnRlcm5hbCA9IFQ7CiAgICAgICAgICAgICAgICB2YXIgeCA9IHt9LCBDID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwsIDEsIHgpKCkgPT09IHggPyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hcHBseShlLCByLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQuYmluZCA9IEM7CiAgICAgICAgICAgICAgICB2YXIgUCwgaiA9IChQID0gMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKytQOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaigpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc3Vic3RyKDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbMF0gKyAneCcgKyBlWzFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBWKGUpICYmIDIgPT09IGUubGVuZ3RoICYmICFpc05hTihlWzBdKSAmJiAhaXNOYU4oZVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cudG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LnNlbGY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5jYWxsKGUpID09PSAnW29iamVjdCAnICsgdCArICddJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBCKGUsICdGdW5jdGlvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIoZSwgJ1N0cmluZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIoZSwgJ0FycmF5Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihlLCAnTnVtYmVyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihlLCAnT2JqZWN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoVihlKSB8fCB6KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGUubGVuZ3RoID4gMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghRyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoTChlLmZvckVhY2gpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKHQsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMCwgbiA9IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyByIDwgbjsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlW3JdLCByLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbChlLCByKSAmJiB0LmNhbGwodGhpcywgZVtyXSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBIKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSA/IGUuaGFzT3duUHJvcGVydHkodCkgOiB2b2lkIDAgIT09IGVbdF0gJiYgZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbdF0gIT09IGVbdF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICB0ID0gdCB8fCBkb2N1bWVudCwgaSA9IHIgPyB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKHIpIDogdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSA9IGkubGVuZ3RoID8gaSA6IHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbiA/IG51bGwgOiBpLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pbnNlcnRCZWZvcmUoZSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgICAgICAgICB0ICYmIFQuaXNGbih0KSAmJiAoci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdCksIHIuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0KSksIHIuc3JjID0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gVC5jcmVhdGVUcmFja1BpeGVsSWZyYW1lSHRtbChlLCAhMSwgJ2FsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4nKSwgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIG4uaW5uZXJIVE1MID0gcjsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4uZmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgICAgICB0ICYmIFQuaXNGbih0KSAmJiAoaS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdCksIGkuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0KSksIFQuaW5zZXJ0RWxlbWVudChpLCBkb2N1bWVudCwgJ2h0bWwnLCAhMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBRKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0pIHx8IGFyZ3VtZW50c1sxXSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyAodCAmJiAoZSA9IGVuY29kZVVSSShlKSksIHIgJiYgKHIgPSAnc2FuZGJveD0iJy5jb25jYXQociwgJyInKSksICc8aWZyYW1lICcuY29uY2F0KHIsICcgaWQ9IicpLmNvbmNhdChSKCksICciXG4gICAgICBmcmFtZWJvcmRlcj0iMCJcbiAgICAgIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIlxuICAgICAgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCJcbiAgICAgIHdpZHRoPSIwIiBoc3BhY2U9IjAiIHZzcGFjZT0iMCIgaGVpZ2h0PSIwIlxuICAgICAgc3R5bGU9ImhlaWdodDowcHg7d2lkdGg6MHB4O2Rpc3BsYXk6bm9uZTsiXG4gICAgICBzY3JvbGxpbmc9Im5vIlxuICAgICAgc3JjPSInKS5jb25jYXQoZSwgJyI+XG4gICAgPC9pZnJhbWU+JykpIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBYKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSB0ID8gciA6IHoodCkgPyB0IDogRih0KSA/IHQudG9TdHJpbmcoKSA6IHZvaWQgdygnVW5zdXBvcnRlZCB0eXBlIGZvciBwYXJhbTogJyArIGUgKyAnIHJlcXVpcmVkIHR5cGU6IFN0cmluZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gJChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0ZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZSgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lmdvb2dsZXRhZyAmJiBMKHdpbmRvdy5nb29nbGV0YWcucHViYWRzKSAmJiBMKHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0U2xvdHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbmUgPSBhZSgndGltZVRvUmVzcG9uZCcsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPiB0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmdldEhpZ2hlc3RDcG0gPSBuZTsKICAgICAgICAgICAgICAgIHZhciBpZSA9IGFlKCdyZXNwb25zZVRpbWVzdGFtcCcsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPiB0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmdldE9sZGVzdEhpZ2hlc3RDcG1CaWQgPSBpZTsKICAgICAgICAgICAgICAgIHZhciBvZSA9IGFlKCdyZXNwb25zZVRpbWVzdGFtcCcsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPCB0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNwbSA9PT0gbi5jcG0gPyB0KHJbZV0sIG5bZV0pID8gbiA6IHIgOiByLmNwbSA8IG4uY3BtID8gbiA6IHI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuZGVmYXVsdCkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1ZSgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5jb29raWVFbmFibGVkIHx8IGRvY3VtZW50LmNvb2tpZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZ2V0TGF0ZXN0SGlnaGVzdENwbUJpZCA9IG9lOwogICAgICAgICAgICAgICAgdmFyIGNlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBZFVuaXRQYXRoKCkgPT09IHQgfHwgZS5nZXRTbG90RWxlbWVudElkKCkgPT09IHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZGUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2UodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlciA/IE51bWJlci5pc0ludGVnZXIoZSkgOiAnbnVtYmVyJyA9PSB0eXBlb2YgZSAmJiBpc0Zpbml0ZShlKSAmJiBNYXRoLmZsb29yKGUpID09PSBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZmUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gZS5yZXBsYWNlKC9eXD8vLCAnJykuc3BsaXQoJyYnKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBsKHQuc3BsaXQoJz0nKSwgMiksIG4gPSByWzBdLCBpID0gclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9cW1xdJC8udGVzdChuKSA/IChlW24gPSBuLnJlcGxhY2UoJ1tdJywgJycpXSA9IGVbbl0gfHwgW10sIGVbbl0ucHVzaChpKSkgOiBlW25dID0gaSB8fCAnJywgZTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSkgOiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGVbdF0pID8gZVt0XS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQodCwgJ1tdPScpLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJicpIDogJycuY29uY2F0KHQsICc9JykuY29uY2F0KGVbdF0pOwogICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyYnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PT0gYihlKSAmJiBudWxsICE9PSBlICYmICdvYmplY3QnID09PSBiKHQpICYmIG51bGwgIT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGUpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModCkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQuaGFzT3duUHJvcGVydHkocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdlKGVbcl0sIHRbcl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0TG9nU3RhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9LCB0LmdldFZlcmJvc2l0eUxldmVsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChtW2RdIHx8IDMpOwogICAgICAgICAgICAgICAgfSwgdC5zZXREZWZhdWx0Q29uZmlnID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB5ID0gKDAsIGkuZGVmYXVsdCkoe30sIGUsIHkpOwogICAgICAgICAgICAgICAgfSwgdC50dXJuT25EZWJ1ZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBiID0gITAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmhhc093blByb3BlcnR5KGUpICYmIHBbZV0ucmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0sIHQuZGVidWdPbiA9IEksIHQuYmJMb2dnZXIgPSB0LmxvZ2dlciA9IHZvaWQgMCwgcigzMyksIHIoMSksIHIoMyksIHIoMCksIHIoNSksIHIoOSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNTgpLCBpID0gdShyKDI5KSksIG8gPSByKDI2MyksIGEgPSByKDEyKSwgcyA9IHUocigxMCkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGMgPSBzLmRlZmF1bHQuUVVFUllfUEFSQU1TLCBkID0gYy5MT0dfVkVSQk9TSVRZLCBsID0gYy5QQkpTX0RFQlVHLCBmID0gcy5kZWZhdWx0LkxPR1MuQklEQkFSUkVMLCBwID0ge30sIGcgPSBbXSwgbSA9ICgwLCBuLnVybFF1ZXJ5QXNPYmplY3QpKCksIHYgPSBtW2xdLCBiID0gISF2ICYmIFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAndHJhY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAndGltZScKICAgICAgICAgICAgICAgICAgICBdLmluZGV4T2Yodi50b0xvd2VyQ2FzZSgpKSA+PSAwLCB5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBmLkxBQkVMLAogICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yOiBmLkNPTE9SLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjRkZGJwogICAgICAgICAgICAgICAgICAgIH0sIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6IHsgY29uc29sZU1ldGhvZDogJ2xvZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9nSW5mbzogeyBjb25zb2xlTWV0aG9kOiAnaW5mbycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9nV2FybjogeyBjb25zb2xlTWV0aG9kOiAnd2FybicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6IHsgY29uc29sZU1ldGhvZDogJ2Vycm9yJyB9CiAgICAgICAgICAgICAgICAgICAgfSwgUyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5kb20pKCkud2luZG93LmRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCAvRWRnZS8udGVzdCgoMCwgYS5kb20pKCkud2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICcnLmNvbmNhdCh0Lm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcjogJycuY29uY2F0KGUudG9VcHBlckNhc2UoKSwgJzonKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclYycuY29uY2F0KHQubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yOiAnJy5jb25jYXQoZS50b1VwcGVyQ2FzZSgpLCAnOicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGNvbG9yOiAnLmNvbmNhdCh0LnRleHRDb2xvciwgJzsgYmFja2dyb3VuZDogJykuY29uY2F0KHQuYmdDb2xvciwgJzsgcGFkZGluZzogMXB4IDRweDsgYm9yZGVyLXJhZGl1czogM3B4OycpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBPID0gMCwgXyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5uYW1lLCByID0gZS50ZXh0Q29sb3IsIG4gPSBlLmJnQ29sb3IsIGkgPSB7fSwgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpWydAJy5jb25jYXQoZSldIHx8IChpWydAJy5jb25jYXQoZSldID0gT2JqZWN0LmtleXMoaCkucmVkdWNlKGZ1bmN0aW9uIChpLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBoW3VdLmNvbnNvbGVNZXRob2QsIGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmNvbnNvbGVNZXRob2QsIHIgPSBlLmxldmVsLCBuID0gcy5hbGxvdyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmNvbnNvbGVNZXRob2RzICYmIG4uY29uc29sZU1ldGhvZHNbdF0gfHwgbi52ZXJib3NpdHkgJiYgbi52ZXJib3NpdHlbJ0AnLmNvbmNhdChyKV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFJKCkgJiYgcGFyc2VJbnQobVtkXSB8fCAzKSA+PSBwYXJzZUludChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGVNZXRob2Q6IGMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYgPSB2ID8gdi50b0xvd2VyQ2FzZSgpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0cmFjZScgIT09IGYgJiYgJ3RpbWUnICE9PSBmIHx8ICFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IFMoYywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYiA9IHAubGFiZWwsIHkgPSBwLnN0eWxlLCBfID0gcC5kZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVt1XSA9IHZvaWQgMCA9PT0gY29uc29sZVtjXS5iaW5kID8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChjb25zb2xlW2NdLCBjb25zb2xlLCBiLCB5LCBfKSA6IGNvbnNvbGVbY10uYmluZChjb25zb2xlLCBiLCB5LCBfKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbdV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFID0gUyhjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHcgPSBFLmxhYmVsLCBBID0gRS5zdHlsZSwgVCA9IEUuZGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVt1XSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAsIGEuZG9tKSgpLndpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSwgciA9IHBhcnNlSW50KHQpLCBuID0gdm9pZCAwID09PSBjb25zb2xlW2NdLmJpbmQgPyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKGNvbnNvbGVbY10sIGNvbnNvbGUsIHcsIEEsICcoICcuY29uY2F0KHIsICcgfCArJykuY29uY2F0KHIgLSBPLCAnICknKSwgVCkgOiBjb25zb2xlW2NdLmJpbmQoY29uc29sZSwgdywgQSwgJyggJy5jb25jYXQociwgJyB8ICsnKS5jb25jYXQociAtIE8sICcgKScpLCBUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGgsIHMgPSBuZXcgQXJyYXkoaSksIGQgPSAwOyBkIDwgaTsgZCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tkXSA9IGFyZ3VtZW50c1tkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogJ3RyYWNlJyA9PT0gZiA/ICgwLCBvLmdldFN0YWNrVHJhY2UpKCkgOiAnb21pdHRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmFwcGx5KHZvaWQgMCwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0VmVyYm9zaXR5OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0OiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldExvZ2dlckNvbmZpZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hbGxvdyA9IGUsIGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGlbJ0AnLmNvbmNhdChlKV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKGlbZV0gPSB1KGUucmVwbGFjZSgnQCcsICcnKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwW3RdID0gcFt0XSB8fCB1KDMpLCBwW3RdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LmxvZ2dlciA9IF87CiAgICAgICAgICAgICAgICB2YXIgRSA9IF8oewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGYuTEFCRUwsCiAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogZi5DT0xPUiwKICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjRkZGJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGIgPyB2LnRvTG93ZXJDYXNlKCkgPT09IGUudG9Mb3dlckNhc2UoKSA6IGI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmJiTG9nZ2VyID0gRTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigzMikuZiwgaSA9IEZ1bmN0aW9uLnByb3RvdHlwZSwgbyA9IC9eXHMqZnVuY3Rpb24gKFteIChdKikvOwogICAgICAgICAgICAgICAgJ25hbWUnIGluIGkgfHwgcigyOCkgJiYgbihpLCAnbmFtZScsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnJyArIHRoaXMpLm1hdGNoKG8pWzFdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IEpTT04ucGFyc2UoJ3siU1RBR0VfRU5WSVJPTk1FTlRTIjpbInN0YWdlIiwic3RhZ2luZyIsImRldiJdLCJRVUVSWV9QQVJBTVMiOnsiTE9HX1ZFUkJPU0lUWSI6ImJiX2xvZ1ZlcmJvc2l0eSIsIlBFUkZfTUVBU1VSRSI6ImJiX3BlcmZNZWFzdXJlIiwiRk9SQ0VfUlVOIjoiYmJfZm9yY2VSdW4iLCJBTkFMWVRJQ1MiOiJiYl9hbmFseXRpY3MiLCJQQkpTX0RFQlVHIjoicGJqc19kZWJ1ZyIsIkFEX1NVUFBSRVNTIjoiYWRTdXBwcmVzcyIsIlNJWkVfU1VQUFJFU1MiOiJzaXplU3VwcHJlc3MiLCJCSURfU1VQUFJFU1MiOiJiaWRTdXBwcmVzcyIsIk1PRF9TVVBQUkVTUyI6Im1vZFN1cHByZXNzIiwiQURfU0VTU0lPTiI6ImFkU2Vzc2lvbiIsIkFEX1NVQlNFU1NJT04iOiJhZFN1YnNlcyIsIkFEX1JFR0lPTiI6ImJiX3JlZ2lvbkNvZGUiLCJBRF9DT1VOVFJZIjoiYmJfY291bnRyeUNvZGUiLCJTRVNTSU9OIjoic2Vzc2lvbiIsIlNVQlNFU1NJT04iOiJzdWJzZXNzaW9uIiwiRlRBRyI6ImZ0YWciLCJUVEFHIjoidHRhZyIsIlRBUkdFVElOR19QUkVGSVgiOiJhZFRhcmdldGluZ18ifSwiTE9HUyI6eyJCSURCQVJSRUwiOnsiTEFCRUwiOiJCaWRCYXJyZWwiLCJDT0xPUiI6IiM2QjVDQTUifSwiUkVRVUVTVF9NQU5BR0VSIjp7IkxBQkVMIjoicmVxdWVzdE1hbmFnZXIiLCJDT0xPUiI6IiM3NzcifX0sIkNPTkZJR19SRVNUUklDVEVEX0tFWVMiOlsiYW5hbHl0aWNzVGltaW5ncyIsImNvbnNlbnQiLCJ0aW1lb3V0cyIsImNvb2tpZSIsInByZWJpZCIsImFkanVzdFNsb3REZWZpbml0aW9uIiwicmVmcmVzaE9yZGVyIiwiY29udGVudEFubm90YXRpb24iLCJhcGkiXSwiVU5JVF9DT05GSUdfQUxMT1dFRF9NT0RJRklFUlMiOlsiY2FjaGUiLCJjb2xsYXBzZUVtcHR5RGl2Iiwic2l6ZU1hcHBpbmdzIiwib3V0T2ZQYWdlIiwibGF6eUxvYWQiXSwiQU5BTFlUSUNTX1JFQ09SRF9UWVBFUyI6eyJOT19CSUQiOiJub0JpZCIsIkJJRF9VU0VEIjoidXNlZEJpZCIsIkJJRCI6ImJpZCIsIlRJTUlORyI6InRpbWluZyJ9LCJBTkFMWVRJQ1NfUkVDT1JEX0RFRkFVTFRTIjp7IkZJUlNUX0lOVEVSQUNUSU9OIjp7IlNMVUciOiJ0dGZpIiwiTkFNRSI6IlRpbWUgdG8gRmlyc3QgSW50ZXJhY3Rpb24ifSwiRklSU1RfUEFJTlQiOnsiU0xVRyI6InR0ZnAiLCJOQU1FIjoiVGltZSB0byBGaXJzdCBQYWludCJ9LCJJTlRFUkFDVElWRSI6eyJTTFVHIjoidHRpIiwiTkFNRSI6IlRpbWUgdG8gSW50ZXJhY3RpdmUifSwiRklSU1RfQ09OVEVOVEZVTF9QQUlOVCI6eyJTTFVHIjoidHRmY3AiLCJOQU1FIjoiVGltZSB0byBGaXJzdCBDb250ZW50ZnVsIFBhaW50In0sIlBBR0VfTE9BRCI6eyJTTFVHIjoidHRwbCIsIk5BTUUiOiJUaW1lIHRvIFBhZ2UgTG9hZCJ9LCJGSVJTVF9CWVRFIjp7IlNMVUciOiJ0dGZiIiwiTkFNRSI6IlRpbWUgdG8gRmlyc3QgQnl0ZSJ9LCJWSVNVQUxMWV9SRUFEWSI6eyJTTFVHIjoidHR2ciIsIk5BTUUiOiJUaW1lIHRvIFZpc3VhbGx5IFJlYWR5In19LCJWSURFTyI6eyJQUk9UT0NPTCI6eyJWQVNUMSI6MSwiVkFTVDIiOjIsIlZBU1QzIjozLCJWQVNUMV9XUkFQUEVSIjo0LCJWQVNUMl9XUkFQUEVSIjo1LCJWQVNUM19XUkFQUEVSIjo2LCJWQVNUNCI6NywiVkFTVDRfV1JBUFBFUiI6OCwiREFBU1QxIjo5LCJEQUFTVDFfV1JBUFBFUiI6MTB9LCJTVEFSVF9ERUxBWSI6eyJQUkVST0xMIjowLCJNSURST0xMIjotMSwiUE9TVFJPTEwiOi0yfSwiUExBQ0VNRU5UIjp7IlNUUkVBTSI6MSwiQkFOTkVSIjoyLCJBUlRJQ0xFIjozLCJGRUVEIjo0LCJJTlRFUlNUSVRJQUwiOjV9LCJMSU5FQVJJVFkiOnsiTElORUFSX0lOU1RSRUFNIjoxLCJOT05MSU5FQVJfT1ZFUkxBWSI6Mn0sIkJMT0NLX0FUVFJJQlVURSI6eyJBVVRPUExBWV9BVURJTyI6MSwiTUFOVUFMX0FVRElPIjoyLCJBVVRPX0VYUEFORCI6MywiQ0xJQ0tfRVhQQU5EIjo0LCJST0xMT1ZFUl9FWFBBTkQiOjUsIkFVVE9QTEFZX0lOQkFOTkVSX1ZJREVPIjo2LCJNQU5VQUxfSU5CQU5ORVJfVklERU8iOjcsIlBPUCI6OCwiU1VHR0VTVElWRSI6OSwiRkxJQ0tFUklORyI6MTAsIlNVUlZFWVMiOjExLCJURVhUX09OTFkiOjEyLCJVU0VSX0lOVEVSQUNUSVZFIjoxMywiQUxFUlQiOjE0LCJBVURJT19PTk9GRl9VSSI6MTUsIlBST1ZJREVfU0tJUCI6MTYsIkZMQVNIIjoxN30sIkRFTElWRVJZIjp7IlNUUkVBTUlORyI6MSwiUFJPR1JFU1NJVkUiOjIsIkRPV05MT0FEIjozfSwiQVBJIjp7IlZQQUlEMSI6MSwiVlBBSUQyIjoyLCJNUkFJRDEiOjMsIk9STU1BIjo0LCJNUkFJRDIiOjUsIk1SQUlEMyI6Nn0sIlBPUyI6eyJVTktOT1dOIjowLCJBVEYiOjEsIkFCT1ZFX1RIRV9GT0xEIjoxLCJCVEYiOjMsIkJFTE9XX1RIRV9GT0xEIjozLCJIRUFERVIiOjQsIkZPT1RFUiI6NSwiU0lERUJBUiI6NiwiRlVMTF9TQ1JFRU4iOjd9LCJDT01QQU5JT05fVFlQRSI6eyJTVEFUSUMiOjEsIkhUTUwiOjIsIklGUkFNRSI6M30sIlBMQVlCQUNLX01FVEhPRCI6eyJQQUdFTE9BRF9TT1VORF9PTiI6MSwiUEFHRUxPQURfU09VTkRfT0ZGIjoyLCJDTElDS19TT1VORF9PTiI6MywiTU9VU0VPVkVSX1NPVU5EX09OIjo0LCJTQ1JPTExJTl9TT1VORF9PTiI6NSwiU0NST0xMSU5fU09VTkRfT0ZGIjo2fSwiUExBWUJBQ0tfRU5EIjp7Ik9OX0NPTVBMRVRFIjoxLCJPTl9WUF9MRUFWRSI6MiwiT05fQ09NUExFVEVfV0lUSF9GTE9BVCI6M319LCJNT0RVTEVTIjp7IlBSRUJJRF9IRUFERVJfQklERElORyI6InByZWJpZCIsIlBSRUJJRF9BTkFMWVRJQ1MiOiJwcmViaWRBbmFseXRpY3MiLCJCSURCQVJSRUxfQU5BTFlUSUNTIjoiYWRMaWJBbmFseXRpY3MiLCJBTkFMWVRJQ1NfVElNSU5HUyI6ImFkTGliQW5hbHl0aWNzVGltaW5ncyIsIkFOQUxZVElDU19USU1JTkdTX01BTlVBTCI6ImFkTGliQW5hbHl0aWNzVGltaW5nc01hbnVhbCIsIkFOQUxZVElDU19USU1JTkdTX0JPT01SIjoiYWRMaWJBbmFseXRpY3NUaW1pbmdzQm9vbXIiLCJBTkFMWVRJQ1NfUFJFQklEIjoiYWRMaWJBbmFseXRpY3NQcmViaWQiLCJBTkFMWVRJQ1NfQU1BWk9OIjoiYWRMaWJBbmFseXRpY3NBbWF6b24iLCJEWU5BTUlDX0JJRERFUlMiOiJkeW5hbWljQmlkZGVycyIsIkRZTkFNSUNfVEFSR0VUSU5HIjoiZHluYW1pY1RhcmdldGluZyIsIkdFT0xPQ0FUSU9OIjoiZ2VvIiwiU1RSSU5HX1NJWkVTX0ZJTFRFUiI6InN0cmluZ1NpemVzRmlsdGVyIiwiSVhfSEVBREVSX0JJRERJTkciOiJpeFVuaXZlcnNhbCIsIklYX0lERU5USVRZIjoiaXhJZGVudGl0eSIsIkFNQVpPTl9IRUFERVJfQklERElORyI6ImFtYXpvbiIsIkNPTkZJQU5UX1BSRUJJRCI6ImNvbmZpYW50UHJlYmlkIiwiQ09ORklBTlRfR09PR0xFVEFHIjoiY29uZmlhbnRHb29nbGV0YWciLCJDT05GSUFOVCI6ImNvbmZpYW50IiwiU1RBQ0tTIjoic3RhY2tzIiwiTVlJIjoibXlpIiwiSUFTIjoiaWFzIiwiQklEQkFSUkVMX0ZFQVRVUkVTIjoiZW5mb3JjZUhlYWRlckJpZGRpbmdGZWF0dXJlcyIsIkFVVE9fUFJJT1JJVFkiOiJhdXRvUHJpb3JpdHkiLCJDT05URU5UX0FOTk9UQVRJT04iOiJjb250ZW50QW5ub3RhdGlvbiIsIk9QVEFOT04iOiJjYnNvcHRhbm9uIiwiR09PR0xFX1BVQkxJU0hFUl9UQUciOiJncHQiLCJQUkVCSURfUzJTIjoicHJlYmlkUzJTIiwiUFVCQ09NTU9OX0lEIjoicHViQ29tbW9uSWQiLCJWSURFTyI6InZpZGVvIiwiSURFTlRJVFlMSU5LX0lEIjoiaWRlbnRpdHlMaW5rSWQiLCJQUkVCSURfVVNFUl9JRCI6InByZWJpZFVzZXJJZCIsIkxJVkVJTlRFTlRfSUQiOiJsaXZlSW50ZW50SWQifSwiRVZFTlRTIjp7IkFOQUxZVElDU19SRUNPUkRfQ1JFQVRFRCI6ImFuYWx5dGljc1JlY29yZENyZWF0ZWQiLCJBTkFMWVRJQ1NfUkVQT1JURUQiOiJhbmFseXRpY3NSZXBvcnRlZCIsIkFOQUxZVElDU19DQU5DRUxMRUQiOiJhbmFseXRpY3NDYW5jZWxsZWQiLCJFUlJPUl9SRVBPUlQiOiJlcnJvclJlcG9ydGVkIiwiQkFEX0JJRCI6ImJhZEJpZCIsIkJBRF9BRCI6ImJhZEFkIiwiQklEX1VTRUQiOiJiaWRVc2VkIiwiQklEX1JFQ1lDTEVEIjoiYmlkUmVjeWNsZWQiLCJESVNQTEFZX0NBTExFRCI6ImRpc3BsYXlDYWxsZWQiLCJMT0FEIjoibG9hZCIsIklOSVRJQUxJWkUiOiJpbml0aWFsaXplIiwiSEVBREVSX0JJRERJTkdfUkVRVUVTVCI6ImhlYWRlckJpZGRpbmdSZXF1ZXN0IiwiSEVBREVSX0JJRERJTkdfUkVTUE9OU0UiOiJoZWFkZXJCaWRkaW5nUmVzcG9uc2UiLCJNT0RVTEVfSU5JVElBTElaRUQiOiJtb2R1bGVJbml0aWFsaXplZCIsIklERU5USUZJRUQiOiJpZGVudGlmaWVkIiwiTU9EVUxFX1JFR0lTVEVSRUQiOiJtb2R1bGVSZWdpc3RlcmVkIiwiTU9EVUxFX0RFUkVHSVNURVJFRCI6Im1vZHVsZURlcmVnaXN0ZXJlZCIsIklOU1RBTlRJQVRFRCI6Imluc3RhbnRpYXRlZCIsIlJFRlJFU0giOiJyZWZyZXNoIiwiQVVDVElPTiI6ImF1Y3Rpb24iLCJCSURTX1JFVFVSTkVEIjoiYmlkc1JldHVybmVkIiwiQklEU19SRVFVRVNURUQiOiJiaWRzUmVxdWVzdGVkIiwiU0xPVF9ERUZJTkVEIjoic2xvdERlZmluZWQiLCJCQVRDSF9TTE9UU19ERUZJTkVEIjoiYmF0Y2hTbG90c0RlZmluZWQiLCJBRF9WSUVXQUJMRSI6InZpZXdhYmxlIiwiQURfUkVOREVSRUQiOiJyZW5kZXJlZCIsIkFEX0xPQURFRCI6ImxvYWRlZCIsIkFEX1JFUVVFU1RFRCI6InJlcXVlc3RlZCIsIkFEX1JFQ0VJVkVEIjoicmVzcG9uc2VSZWNlaXZlZCIsIkFEX1ZJU0lCSUxJVFlfQ0hBTkdFRCI6InZpc2liaWxpdHlDaGFuZ2VkIiwiREZQX0VWRU5UUyI6eyJBRF9WSUVXQUJMRSI6ImltcHJlc3Npb25WaWV3YWJsZSIsIkFEX1JFTkRFUkVEIjoic2xvdFJlbmRlckVuZGVkIiwiQURfTE9BREVEIjoic2xvdE9ubG9hZCIsIkFEX1JFUVVFU1RFRCI6InNsb3RSZXF1ZXN0ZWQiLCJBRF9SRUNFSVZFRCI6InNsb3RSZXNwb25zZVJlY2VpdmVkIiwiQURfVklTSUJJTElUWV9DSEFOR0VEIjoic2xvdFZpc2liaWxpdHlDaGFuZ2VkIn19fScpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigxOTkpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI3KSwgaSA9IHIoMTEwKSwgbyA9IHIoMjgpLCBhID0gLy4vLnRvU3RyaW5nLCBzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcig0MSkoUmVnRXhwLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZSwgITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByKDI0KShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvYS9iJyAhPSBhLmNhbGwoewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdhJywKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6ICdiJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkgPyBzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4odGhpcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvJy5jb25jYXQoZS5zb3VyY2UsICcvJywgJ2ZsYWdzJyBpbiBlID8gZS5mbGFncyA6ICFvICYmIGUgaW5zdGFuY2VvZiBSZWdFeHAgPyBpLmNhbGwoZSkgOiB2b2lkIDApOwogICAgICAgICAgICAgICAgfSkgOiAndG9TdHJpbmcnICE9IGEubmFtZSAmJiBzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kb20gPSBkLCB0LmdldEdsb2JhbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGkuZGVmYXVsdCkoZCgpLCAnd2luZG93LkJpZEJhcnJlbCcpIHx8IChkKCkud2luZG93LkJpZEJhcnJlbCA9IHt9LCBkKCkud2luZG93LkJpZEJhcnJlbC5xdWV1ZSA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoKS53aW5kb3cuQmlkQmFycmVsOwogICAgICAgICAgICAgICAgICAgIH0sIHIoMTcpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0gbyhyKDQ4KSksIGkgPSBvKHIoMzQpKTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGEoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZSwgdCwgclt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogYShPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAndW5kZWZpbmVkJyA9PSB0eXBlb2Ygd2luZG93ID8geyB3aW5kb3c6IGUgfSA6IHsgd2luZG93OiB3aW5kb3cgfTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBuLmRlZmF1bHQpKGUpIHx8IChjID0gcyhzKHt9LCBjKSwgZSkpLCBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0uY2FsbCh0aGlzLCByKDE2OSkpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1MyksIGkgPSByKDE0KSwgbyA9IHIoNDcpLCBhID0gcigxOTUpLCBzID0gcigxNDQpLCB1ID0gcigzOCksIGMgPSByKDE1OSksIGQgPSByKDE0NSk7CiAgICAgICAgICAgICAgICBpKGkuUyArIGkuRiAqICFyKDExOSkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgfSksICdBcnJheScsIHsKICAgICAgICAgICAgICAgICAgICBmcm9tOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciwgaSwgbCwgZiA9IG8oZSksIHAgPSAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzID8gdGhpcyA6IEFycmF5LCBnID0gYXJndW1lbnRzLmxlbmd0aCwgbSA9IGcgPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCB2ID0gdm9pZCAwICE9PSBtLCBiID0gMCwgeSA9IGQoZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICYmIChtID0gbihtLCBnID4gMiA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMCwgMikpLCBudWxsID09IHkgfHwgcCA9PSBBcnJheSAmJiBzKHkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSBuZXcgcCh0ID0gdShmLmxlbmd0aCkpOyB0ID4gYjsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhyLCBiLCB2ID8gbShmW2JdLCBiKSA6IGZbYl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0geS5jYWxsKGYpLCByID0gbmV3IHAoKTsgIShpID0gbC5uZXh0KCkpLmRvbmU7IGIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMociwgYiwgdiA/IGEobCwgbSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgITApIDogaS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubGVuZ3RoID0gYiwgcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDYyKSwgbyA9IHIoNDYpLCBhID0gcig0MSksIHMgPSByKDUzKSwgdSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCBkLCBsLCBmLCBwID0gZSAmIHUuRiwgZyA9IGUgJiB1LkcsIG0gPSBlICYgdS5TLCB2ID0gZSAmIHUuUCwgYiA9IGUgJiB1LkIsIHkgPSBnID8gbiA6IG0gPyBuW3RdIHx8IChuW3RdID0ge30pIDogKG5bdF0gfHwge30pLnByb3RvdHlwZSwgaCA9IGcgPyBpIDogaVt0XSB8fCAoaVt0XSA9IHt9KSwgUyA9IGgucHJvdG90eXBlIHx8IChoLnByb3RvdHlwZSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIChnICYmIChyID0gdCksIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gKChkID0gIXAgJiYgeSAmJiB2b2lkIDAgIT09IHlbY10pID8geSA6IHIpW2NdLCBmID0gYiAmJiBkID8gcyhsLCBuKSA6IHYgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbCA/IHMoRnVuY3Rpb24uY2FsbCwgbCkgOiBsLCB5ICYmIGEoeSwgYywgbCwgZSAmIHUuVSksIGhbY10gIT0gbCAmJiBvKGgsIGMsIGYpLCB2ICYmIFNbY10gIT0gbCAmJiAoU1tjXSA9IGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIG4uY29yZSA9IGksIHUuRiA9IDEsIHUuRyA9IDIsIHUuUyA9IDQsIHUuUCA9IDgsIHUuQiA9IDE2LCB1LlcgPSAzMiwgdS5VID0gNjQsIHUuUiA9IDEyOCwgZS5leHBvcnRzID0gdTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNldENvbmZpZ1B1YmxpYyA9IHQuc2V0Q29uZmlnID0gdC5nZXRDb25maWcgPSB0LmNvbmZpZyA9IHZvaWQgMCwgcigxNyksIHIoNCksIHIoMiksIHIoMTYpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDk2KSwgaSA9IHIoOCksIG8gPSByKDM5KSwgYSA9IHIoMjk4KSwgcyA9IHAocig1NikpLCB1ID0gcChyKDMwMSkpLCBjID0gcigyMSksIGQgPSBwKHIoNDgpKSwgbCA9IHIoMjApLCBmID0gcChyKDEwKSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gZyhPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogZyhPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHkgPSB7IHZlcnNpb25Db250cm9sOiAhMSB9LCBoID0gZi5kZWZhdWx0LkVWRU5UUy5FUlJPUl9SRVBPUlQsIFMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogeSwgciA9ICgwLCBuLnJpY2hPYmplY3QpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gKDAsIGEuY29uY2F0Q29uZmlnQXJyYXlzKShlLCByLmdldFZhbHVlKCkpLCByLnNldFZhbHVlKGUpLCByLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0pIHx8IGFyZ3VtZW50c1syXSwgbiA9ICgwLCB1LmRlZmF1bHQpKGYuZGVmYXVsdC5DT05GSUdfUkVTVFJJQ1RFRF9LRVlTLCBlKSwgbyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IG4ubGVuZ3RoICYmIChpLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDIpLmxvZ1dhcm4oJ0RFUFJFQ0FURUQ6IFRoZSBmb2xsb3dpbmcga2V5cyB5b3UgcHJvdmlkZWQgYXJlIG5vdCBhdmFpbGFibGUgdmlhIGltcGxlbWVudGF0aW9uIGluIEJpZEJhcnJlbC4nLCBuKSwgaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgyKS5sb2dXYXJuKCdQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyB0byB5b3VyIHNpdGUgY29uZmlnIGluIHRoZSBCaWRCYXJyZWwgcmVwbyh2aWEgUFIpLiBUaGUgZnVsbCBsaXN0IG9mIGNvbmZpZyByZXN0cmljdGlvbnM6JywgZi5kZWZhdWx0LkNPTkZJR19SRVNUUklDVEVEX0tFWVMpLCBvID0gITEpLCByID8gdCA9ICgwLCBzLmRlZmF1bHQpKHQsIGYuZGVmYXVsdC5DT05GSUdfUkVTVFJJQ1RFRF9LRVlTKSA6IG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IGIoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGQuZGVmYXVsdCkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5iYkxvZ2dlci5sb2dFcnJvcignQXR0ZW1wdGVkIHRvIHNldCBjb25maWcgd2l0aCBlbXB0eSBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgRXJyb3IoJ0F0dGVtcHRlZCB0byBzZXQgY29uZmlnIHdpdGggZW1wdHkgb2JqZWN0LicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBsLmV2ZW50RW1pdHRlci5lbWl0KGgsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZyhPYmplY3Qua2V5cyhlKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCcqJyA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgZC5kZWZhdWx0KSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmxvZ0Vycm9yKCdBdHRlbXB0ZWQgdG8gc2V0IGNvbmZpZyB3aXRoIGVtcHR5IG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIHNldCBjb25maWcgd2l0aCBlbXB0eSBvYmplY3QuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGwuZXZlbnRFbWl0dGVyLmVtaXQoaCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBnKE9iamVjdC5rZXlzKHQpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWcoW2Uuc3BsaXQoJy4nKVswXV0sIHQsICExKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTID0gKDAsIG8uaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PT0gYihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcqJyA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLnNldFZhbHVlKGUsIHQpLCBpID0gci5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIub3B0aW9ucy52ZXJzaW9uQ29udHJvbCAmJiAoaS5fcmV2aXNpb24gPSBuKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogbnVsbCwgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmdldFZhbHVlKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLm9wdGlvbnMudmVyc2lvbkNvbnRyb2wgJiYgYy5leHBvc3VyZUFwaS5leHBvc2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVmVyc2lvbmluZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZG86IHIudW5kbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcnRUbzogci5yZXZlcnRUbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWZXJzaW9uOiByLmdldFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVBdFZlcnNpb246IHIuZ2V0VmFsdWVBdFZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIG0oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnUHVibGljOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnOiBPCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuY29uZmlnID0gUzsKICAgICAgICAgICAgICAgIHZhciBPID0gUy5nZXRDb25maWc7CiAgICAgICAgICAgICAgICB0LmdldENvbmZpZyA9IE87CiAgICAgICAgICAgICAgICB2YXIgXyA9IFMuc2V0Q29uZmlnOwogICAgICAgICAgICAgICAgdC5zZXRDb25maWcgPSBfOwogICAgICAgICAgICAgICAgdmFyIEUgPSBTLnNldENvbmZpZ1B1YmxpYzsKICAgICAgICAgICAgICAgIHQuc2V0Q29uZmlnUHVibGljID0gRSwgYy5leHBvc3VyZUFwaS5yb290U2NvcGUoewogICAgICAgICAgICAgICAgICAgIGdldENvbmZpZzogTywKICAgICAgICAgICAgICAgICAgICBzZXRDb25maWc6IF8KICAgICAgICAgICAgICAgIH0pLCBjLmV4cG9zdXJlQXBpLnJvb3RTY29wZUdldHRlcnMoewogICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBPKCdkZWJ1ZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgJ2Jvb2xlYW4nID09IHR5cGVvZiBlICYmIGUgPyAoMCwgaS50dXJuT25EZWJ1ZykoKSA6ICgoMCwgaS5zZXREZWZhdWx0Q29uZmlnKShlKSwgaS5iYkxvZ2dlci5zZXRMb2dnZXJDb25maWcoZSkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTM2KSwgaSA9IHIoMjcpLCBvID0gcigxMzcpLCBhID0gcigxMzQpLCBzID0gcigzOCksIHUgPSByKDEwOCksIGMgPSByKDEzNSksIGQgPSByKDI0KSwgbCA9IE1hdGgubWluLCBmID0gW10ucHVzaCwgcCA9ICdsZW5ndGgnLCBnID0gIWQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBSZWdFeHAoNDI5NDk2NzI5NSwgJ3knKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHIoMTA5KSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZSwgdCwgciwgZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBtID0gJ2MnID09ICdhYmJjJy5zcGxpdCgvKGIpKi8pWzFdIHx8IDQgIT0gJ3Rlc3QnLnNwbGl0KC8oPzopLywgLTEpW3BdIHx8IDIgIT0gJ2FiJy5zcGxpdCgvKD86YWIpKi8pW3BdIHx8IDQgIT0gJy4nLnNwbGl0KC8oLj8pKC4/KS8pW3BdIHx8ICcuJy5zcGxpdCgvKCkoKS8pW3BdID4gMSB8fCAnJy5zcGxpdCgvLj8vKVtwXSA/IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gU3RyaW5nKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlICYmIDAgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoaSwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbywgYSwgcywgdSA9IFtdLCBkID0gKGUuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArIChlLm11bHRpbGluZSA/ICdtJyA6ICcnKSArIChlLnVuaWNvZGUgPyAndScgOiAnJykgKyAoZS5zdGlja3kgPyAneScgOiAnJyksIGwgPSAwLCBnID0gdm9pZCAwID09PSB0ID8gNDI5NDk2NzI5NSA6IHQgPj4+IDAsIG0gPSBuZXcgUmVnRXhwKGUuc291cmNlLCBkICsgJ2cnKTsgKG8gPSBjLmNhbGwobSwgaSkpICYmICEoKGEgPSBtLmxhc3RJbmRleCkgPiBsICYmICh1LnB1c2goaS5zbGljZShsLCBvLmluZGV4KSksIG9bcF0gPiAxICYmIG8uaW5kZXggPCBpW3BdICYmIGYuYXBwbHkodSwgby5zbGljZSgxKSksIHMgPSBvWzBdW3BdLCBsID0gYSwgdVtwXSA+PSBnKSk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmxhc3RJbmRleCA9PT0gby5pbmRleCAmJiBtLmxhc3RJbmRleCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsID09PSBpW3BdID8gIXMgJiYgbS50ZXN0KCcnKSB8fCB1LnB1c2goJycpIDogdS5wdXNoKGkuc2xpY2UobCkpLCB1W3BdID4gZyA/IHUuc2xpY2UoMCwgZykgOiB1OwogICAgICAgICAgICAgICAgICAgIH0gOiAnMCcuc3BsaXQodm9pZCAwLCAwKVtwXSA/IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgJiYgMCA9PT0gdCA/IFtdIDogci5jYWxsKHRoaXMsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH0gOiByLCBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUodGhpcyksIG8gPSBudWxsID09IHIgPyB2b2lkIDAgOiByW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gbyA/IG8uY2FsbChyLCBpLCBuKSA6IG0uY2FsbChTdHJpbmcoaSksIHIsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkKG0sIGUsIHRoaXMsIHQsIG0gIT09IHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBpKGUpLCBmID0gU3RyaW5nKHRoaXMpLCBwID0gbyhjLCBSZWdFeHApLCB2ID0gYy51bmljb2RlLCBiID0gKGMuaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArIChjLm11bHRpbGluZSA/ICdtJyA6ICcnKSArIChjLnVuaWNvZGUgPyAndScgOiAnJykgKyAoZyA/ICd5JyA6ICdnJyksIHkgPSBuZXcgcChnID8gYyA6ICdeKD86JyArIGMuc291cmNlICsgJyknLCBiKSwgaCA9IHZvaWQgMCA9PT0gdCA/IDQyOTQ5NjcyOTUgOiB0ID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gdSh5LCBmKSA/IFtmXSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgUyA9IDAsIE8gPSAwLCBfID0gW107IE8gPCBmLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Lmxhc3RJbmRleCA9IGcgPyBPIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSwgSSA9IHUoeSwgZyA/IGYgOiBmLnNsaWNlKE8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gSSB8fCAoRSA9IGwocyh5Lmxhc3RJbmRleCArIChnID8gMCA6IE8pKSwgZi5sZW5ndGgpKSA9PT0gUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gYShmLCBPLCB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXy5wdXNoKGYuc2xpY2UoUywgTykpLCBfLmxlbmd0aCA9PT0gaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdyA9IDE7IHcgPD0gSS5sZW5ndGggLSAxOyB3KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLnB1c2goSVt3XSksIF8ubGVuZ3RoID09PSBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFMgPSBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLnB1c2goZi5zbGljZShTKSksIF87CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpLCBpID0gcigyMjcpLCBvID0gcig1NyksIGEgPSByKDkwKSwgcyA9IHIoMTU5KTsKICAgICAgICAgICAgICAgIG4obi5TLCAnT2JqZWN0JywgewogICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIHIsIG4gPSBvKGUpLCB1ID0gYS5mLCBjID0gaShuKSwgZCA9IHt9LCBsID0gMDsgYy5sZW5ndGggPiBsOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSAociA9IHUobiwgdCA9IGNbbCsrXSkpICYmIHMoZCwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IGUuZXhwb3J0cyA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiB3aW5kb3cgJiYgd2luZG93Lk1hdGggPT0gTWF0aCA/IHdpbmRvdyA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBzZWxmICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7CiAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PSB0eXBlb2YgX19nICYmIChfX2cgPSByKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMDQpKCd3a3MnKSwgaSA9IHIoNjMpLCBvID0gcigxOCkuU3ltYm9sLCBhID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbzsKICAgICAgICAgICAgICAgIChlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2VdIHx8IChuW2VdID0gYSAmJiBvW2VdIHx8IChhID8gbyA6IGkpKCdTeW1ib2wuJyArIGUpKTsKICAgICAgICAgICAgICAgIH0pLnN0b3JlID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmV2ZW50RW1pdHRlciA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4KSwgaSA9IHIoNTgpLCBvID0gcigzOSksIGEgPSByKDIxKSwgcyA9IHIoMTIpLCB1ID0gYyhyKDUxKSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZCA9IGMocigxMCkpLmRlZmF1bHQuRVZFTlRTLkVSUk9SX1JFUE9SVCwgbCA9ICgwLCBuLmxvZ2dlcikoewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZXZlbnRFbWl0dGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogJyNGNUYxRUQnLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjMjUyMzIzJwogICAgICAgICAgICAgICAgICAgIH0pLCBmID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIHQgPSAoMCwgaS51cmxRdWVyeUFzT2JqZWN0KSgpLCByID0geyBvbmNlOiB7fSB9OwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvbmNlJyAhPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID8gKHIub25jZVtlXSB8fCAoci5vbmNlW2VdID0gW10pLCByLm9uY2VbZV0ucHVzaCh0KSkgOiAocltlXSB8fCAocltlXSA9IFtdKSwgcltlXS5wdXNoKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IGUubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oYSwgdCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAoMCwgby5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociA+IDEgPyByIC0gMSA6IDApLCBpID0gMTsgaSA8IHI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5baSAtIDFdID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdFtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hcHBseShlLCBbYV0uY29uY2F0KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYXBwbHkoZSwgW3RdLmNvbmNhdChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBpID0gbmV3IEFycmF5KG4gPiAxID8gbiAtIDEgOiAwKSwgbyA9IDE7IG8gPCBuOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW28gLSAxXSA9IGFyZ3VtZW50c1tvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndHJ1ZScgPT09IHQuYmJfZG9tX2Rpc3BhdGNoICYmICgwLCBzLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ19fYmIuJy5jb25jYXQoZSksIHsgZGV0YWlsOiBpIH0pKSwgbC5hdFZlcmJvc2l0eSg1KS5sb2dJbmZvKCdFbWl0dGluZyBFdmVudCcsIGUsICd3aXRoIGFyZ3VtZW50cycsIGkpLCByW2VdICYmIHJbZV0ubGVuZ3RoIHx8IHIub25jZVtlXSAmJiByLm9uY2VbZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCByW2VdLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHJbZV1bYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuYXRWZXJib3NpdHkoNCkubG9nSW5mbyhlLCAnZW1pdHRpbmcgY2FsbGJhY2snLCBmKSwgZi5hcHBseShudWxsLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmF0VmVyYm9zaXR5KDEpLmxvZ0Vycm9yKCdDYWxsYmFjayBmb3IgZXZlbnQnLCBlLCAnd2l0aCBhcmdzJywgaSwgJ3JldHVybmVkIGFuIGVycm9yJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBuZXcgRXJyb3IoJ0NhbGxiYWNrIGZvciBldmVudCAnLmNvbmNhdChlLCAnIHdpdGggYXJncyAnKS5jb25jYXQoaSwgJyByZXR1cm5lZCBhbiBlcnJvci4gJykuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQsIHUuZGVmYXVsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGQsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLm9uY2VbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCByLm9uY2VbZV0ubGVuZ3RoOyBnKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gci5vbmNlW2VdW2ddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmF0VmVyYm9zaXR5KDQpLmxvZ0luZm8oZSwgJ2VtaXR0aW5nIGNhbGxiYWNrJywgbSksIG0uYXBwbHkobnVsbCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5hdFZlcmJvc2l0eSgxKS5sb2dFcnJvcignUnVuIG9uY2UgY2FsbGJhY2sgZm9yIGV2ZW50JywgZSwgJ3JldHVybmVkIGFuIGVycm9yJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBuZXcgRXJyb3IoJ1J1biBvbmNlIGNhbGxiYWNrIGZvciBldmVudCAnLmNvbmNhdChlLCAnIHJldHVybmVkIGFuIGVycm9yLiAnKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCwgdS5kZWZhdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoZCwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5vbmNlW2VdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbiwgZyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmV4cG9zdXJlQXBpLnJvb3RTY29wZSh7IG9uOiBuIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0OiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlOiBnCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5ldmVudEVtaXR0ZXIgPSBmOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZXhwb3NlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmLmV4cG9zZShlKTsKICAgICAgICAgICAgICAgIH0sIHQuZXhwb3N1cmVBcGkgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IChuID0gcigyOSkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfSwgbyA9IHIoNTUpLCBhID0gcig4KSwgcyA9IHIoMTIpLCB1ID0gcigxODgpOwogICAgICAgICAgICAgICAgdmFyIGMgPSAoMCwgYS5sb2dnZXIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0V4cG9zdXJlQXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogJyNGNEI4MzUnCiAgICAgICAgICAgICAgICAgICAgfSksIGQgPSB7fSwgbCA9IHt9LCBmID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0gW10sIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCByKSAmJiAodCA/IGxbcl0gPSBlW3JdIDogZFtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgcikgJiYgcChyLCBlW3JdLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA/ICgwLCB1LnJlYWRPbmx5R2V0dGVyKShsLCBlLCB0LCAnQ2Fubm90IHNldCByZWFkLW9ubHkgcHJvcGVydHkgdmlhY2JzX2F0LicuY29uY2F0KGUsICcuJykpIDogKDAsIHUucmVhZE9ubHlHZXR0ZXIpKGQsIGUsIHQsICdDYW5ub3Qgc2V0IHJlYWQtb25seSBwcm9wZXJ0eSBCaWRCYXJyZWwuJy5jb25jYXQoZSwgJy4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKHsgZXhwb3NlZEFwaTogZyB9KSwgZih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkTWV0aG9kczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3NlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiB0IHx8IG4gPyBuID8gciA9ICgwLCBpLmRlZmF1bHQpKHt9LCB0LCByKSA6IGUgPSAoMCwgaS5kZWZhdWx0KSh7fSwgdCwgZSkgOiAoMCwgby5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA/IHIgPSB0KHIpIDogZSA9IHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMubG9nRXJyb3IpLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIGEpICYmIChsW2FdID0gclthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBzKSAmJiAoZFtzXSA9IGVbc10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTY29wZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RTY29wZUdldHRlcnM6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290U2NvcGVHZXR0ZXI6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVG9XaW5kb3c6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcy5kb20pKCkud2luZG93LkJpZEJhcnJlbCA9IGQsICgwLCBzLmRvbSkoKS53aW5kb3cudmlhY2JzX2F0ID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVNZXRob2RzOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goaSksIGRbaV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmJiTG9nZ2VyLmxvZ1dhcm4oJ0JpZEJhcnJlbC4nLmNvbmNhdChpLCAnIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSByZW1vdmUgYWxsIHJlZmVyZW5jZXMgYmVmb3JlIHZlcnNpb24gJykuY29uY2F0KHIsICcgaXMgcmVsZWFzZWQuIFRvIHNlZSBhbGwgZGVwcmVjYXRlZCBtZXRob2RzIHBsZWFzZSBjaGVjayBCaWRCYXJyZWwuZGVwcmVjYXRlZE1ldGhvZHMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSAwOyBpIDwgZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LmV4cG9zdXJlQXBpID0gZjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lm5ld0NvbmZpZyA9IHYsIHQuY29uZmlnID0gdC5SQU5ET00gPSB2b2lkIDAsIHIoMjYpLCByKDEyMSksIHIoMSksIHIoMyksIHIoMCksIHIoNSksIHIoNiksIHIoMTMpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIxNyksIGkgPSBzKHIoMzcpKSwgbyA9IHMocigzMSkpLCBhID0gcig3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGMgPSBBcnJheS5mcm9tLCBkID0gcig3KSwgbCA9IHIoMzYpLCBmID0gJ1RSVUUnID09PSBkLmdldFBhcmFtZXRlckJ5TmFtZShsLkRFQlVHX01PREUpLnRvVXBwZXJDYXNlKCksIHAgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luOwogICAgICAgICAgICAgICAgdC5SQU5ET00gPSAncmFuZG9tJzsKICAgICAgICAgICAgICAgIHZhciBnID0gewogICAgICAgICAgICAgICAgICAgICAgICByYW5kb206ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBmaXhlZDogITAKICAgICAgICAgICAgICAgICAgICB9LCBtID0gewogICAgICAgICAgICAgICAgICAgICAgICBMT1c6ICdsb3cnLAogICAgICAgICAgICAgICAgICAgICAgICBNRURJVU06ICdtZWRpdW0nLAogICAgICAgICAgICAgICAgICAgICAgICBISUdIOiAnaGlnaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFVVE86ICdhdXRvJywKICAgICAgICAgICAgICAgICAgICAgICAgREVOU0U6ICdkZW5zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTTogJ2N1c3RvbScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgciwgcyA9IFtdLCBsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KCkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RlYnVnOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRlYnVnKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWJ1ZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZGVidWcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYmlkZGVyVGltZW91dDogMzAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBiaWRkZXJUaW1lb3V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iaWRkZXJUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBiaWRkZXJUaW1lb3V0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaWRkZXJUaW1lb3V0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHVibGlzaGVyRG9tYWluOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHB1Ymxpc2hlckRvbWFpbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHVibGlzaGVyRG9tYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBwdWJsaXNoZXJEb21haW4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlckRvbWFpbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ByaWNlR3JhbnVsYXJpdHk6IG0uTUVESVVNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHByaWNlR3JhbnVsYXJpdHkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoZSkgJiYgKCdzdHJpbmcnID09IHR5cGVvZiBlID8gdGhpcy5fcHJpY2VHcmFudWxhcml0eSA9IGEoZSkgPyBlIDogbS5NRURJVU0gOiBkLmlzUGxhaW5PYmplY3QoZSkgJiYgKHRoaXMuX2N1c3RvbVByaWNlQnVja2V0ID0gZSwgdGhpcy5fcHJpY2VHcmFudWxhcml0eSA9IG0uQ1VTVE9NLCBkLmxvZ01lc3NhZ2UoJ1VzaW5nIGN1c3RvbSBwcmljZSBncmFudWxhcml0eScpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHByaWNlR3JhbnVsYXJpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByaWNlR3JhbnVsYXJpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2N1c3RvbVByaWNlQnVja2V0OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBjdXN0b21QcmljZUJ1Y2tldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VzdG9tUHJpY2VCdWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHk6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IG1lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tZWRpYVR5cGVQcmljZUdyYW51bGFyaXR5ID0gT2JqZWN0LmtleXMoZSkucmVkdWNlKGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGVbbl0pID8gJ3N0cmluZycgPT0gdHlwZW9mIGUgPyByW25dID0gYShlW25dKSA/IGVbbl0gOiB0Ll9wcmljZUdyYW51bGFyaXR5IDogZC5pc1BsYWluT2JqZWN0KGUpICYmIChyW25dID0gZVtuXSwgZC5sb2dNZXNzYWdlKCdVc2luZyBjdXN0b20gcHJpY2UgZ3JhbnVsYXJpdHkgZm9yICcuY29uY2F0KG4pKSkgOiBkLmxvZ1dhcm4oJ0ludmFsaWQgcHJpY2UgZ3JhbnVsYXJpdHkgZm9yIG1lZGlhIHR5cGU6ICcuY29uY2F0KG4pKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbmRBbGxCaWRzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGVuYWJsZVNlbmRBbGxCaWRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZW5kQWxsQmlkczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgZW5hYmxlU2VuZEFsbEJpZHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRBbGxCaWRzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdXNlQmlkQ2FjaGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHVzZUJpZENhY2hlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VCaWRDYWNoZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdXNlQmlkQ2FjaGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZUJpZENhY2hlID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGV2aWNlQWNjZXNzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRldmljZUFjY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGV2aWNlQWNjZXNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBkZXZpY2VBY2Nlc3MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RldmljZUFjY2VzcyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JpZGRlclNlcXVlbmNlOiAncmFuZG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBiaWRkZXJTZXF1ZW5jZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmlkZGVyU2VxdWVuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGJpZGRlclNlcXVlbmNlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnW2VdID8gdGhpcy5fYmlkZGVyU2VxdWVuY2UgPSBlIDogZC5sb2dXYXJuKCdJbnZhbGlkIG9yZGVyOiAnLmNvbmNhdChlLCAnLiBCaWRkZXIgU2VxdWVuY2Ugd2FzIG5vdCBzZXQuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aW1lb3V0QnVmZmVyOiA0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGltZW91dEJ1ZmZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGltZW91dEJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGltZW91dEJ1ZmZlcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZW91dEJ1ZmZlciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Rpc2FibGVBamF4VGltZW91dDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGlzYWJsZUFqYXhUaW1lb3V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlQWpheFRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGRpc2FibGVBamF4VGltZW91dChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZUFqYXhUaW1lb3V0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYXVjdGlvbk9wdGlvbnM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGF1Y3Rpb25PcHRpb25zKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdWN0aW9uT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgYXVjdGlvbk9wdGlvbnMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQuaXNQbGFpbk9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubG9nV2FybignQXVjdGlvbiBPcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCByID0gT2JqZWN0LmtleXMoZSk7IHQgPCByLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHJbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NlY29uZGFyeUJpZGRlcnMnICE9PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubG9nV2FybignQXVjdGlvbiBPcHRpb25zIGdpdmVuIGFuIGluY29ycmVjdCBwYXJhbTogJy5jb25jYXQobikpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc2Vjb25kYXJ5QmlkZGVycycgPT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQuaXNBcnJheShlW25dKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5sb2dXYXJuKCdBdWN0aW9uIE9wdGlvbnMgJy5jb25jYXQobiwgJyBtdXN0IGJlIG9mIHR5cGUgQXJyYXknKSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVbbl0uZXZlcnkoZC5pc1N0cikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubG9nV2FybignQXVjdGlvbiBPcHRpb25zICcuY29uY2F0KG4sICcgbXVzdCBiZSBvbmx5IHN0cmluZycpKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpICYmICh0aGlzLl9hdWN0aW9uT3B0aW9ucyA9IGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuZGVmYXVsdCkoT2JqZWN0LmtleXMobSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IG1bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmxvZ0Vycm9yKCdQcmViaWQgRXJyb3I6IG5vIHZhbHVlIHBhc3NlZCB0byBgc2V0UHJpY2VHcmFudWxhcml0eSgpYCcpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoZSkgfHwgZC5sb2dXYXJuKCdQcmViaWQgV2FybmluZzogc2V0UHJpY2VHcmFudWxhcml0eSB3YXMgY2FsbGVkIHdpdGggaW52YWxpZCBzZXR0aW5nLCB1c2luZyBgbWVkaXVtYCBhcyBkZWZhdWx0LicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkLmlzUGxhaW5PYmplY3QoZSkgJiYgISgwLCBuLmlzVmFsaWRQcmljZUNvbmZpZykoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5sb2dFcnJvcignSW52YWxpZCBjdXN0b20gcHJpY2UgdmFsdWUgcGFzc2VkIHRvIGBzZXRQcmljZUdyYW51bGFyaXR5KClgJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgaChPYmplY3Qua2V5cyh0KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3JdICE9PSBvW3JdICYmIChlW3JdID0gb1tyXSB8fCB7fSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KSksIHQgPSBvLCByID0ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsICYmIHIgJiYgZC5pc1BsYWluT2JqZWN0KHJbbF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHJbbF0sIG4gPSBuZXcgU2V0KE9iamVjdC5rZXlzKHQpLmNvbmNhdChPYmplY3Qua2V5cyhlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMobikucmVkdWNlKGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZVtuXSA/IHJbbl0gPSB0W25dIDogdm9pZCAwID09PSB0W25dID8gcltuXSA9IGVbbl0gOiBkLmlzUGxhaW5PYmplY3QoZVtuXSkgPyByW25dID0gKDAsIGEubWVyZ2VEZWVwKSh7fSwgdFtuXSwgZVtuXSkgOiByW25dID0gZVtuXSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSh7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgZSAmJiAociA9IGUsIGUgPSAnKicpLCAnZnVuY3Rpb24nID09IHR5cGVvZiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpYzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnB1c2gobiksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNwbGljZShzLmluZGV4T2YobiksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBkLmxvZ0Vycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIG8uZGVmYXVsdCkodCwgZS50b3BpYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsYmFjaygociA9IHt9LCBuID0gdC50b3BpYywgaSA9IGVbdC50b3BpY10sIG4gaW4gciA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBuLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogcltuXSA9IGksIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyonID09PSBlLnRvcGljOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jYWxsYmFjayhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBsID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdigpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRCaWRkZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDw9IDEgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgKGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHZvaWQgMCA6IGFyZ3VtZW50c1swXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHZvaWQgMCA6IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IGQuZGVlcEFjY2VzcyhiKCksIGUpIDogYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXRDb25maWc6IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5pc1BsYWluT2JqZWN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3Qua2V5cyhyKSwgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHJbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaXNQbGFpbk9iamVjdChlW25dKSAmJiBkLmlzUGxhaW5PYmplY3QobykgJiYgKG8gPSB1KHt9LCBlW25dLCBvKSksIGlbbl0gPSB0W25dID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dFcnJvcignc2V0Q29uZmlnIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdHM6IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmlzUGxhaW5PYmplY3QoZSkgPyAodShlLCByKSwgdSh0LCByKSkgOiBkLmxvZ0Vycm9yKCdkZWZhdWx0cyBtdXN0IGJlIGFuIG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICByZXNldENvbmZpZzogdiwKICAgICAgICAgICAgICAgICAgICAgICAgcnVuV2l0aEJpZGRlcjogUywKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tXaXRoQmlkZGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBpID0gbmV3IEFycmF5KG4pLCBvID0gMDsgbyA8IG47IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbb10gPSBhcmd1bWVudHNbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhlLCAociA9IGQuYmluZCkuY2FsbC5hcHBseShyLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nV2FybignY29uZmlnLmNhbGxiYWNrV2l0aEJpZGRlciBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXRCaWRkZXJDb25maWc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQuaXNQbGFpbk9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ3NldEJpZGRlckNvbmZpZyBiaWRkZXIgb3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuYmlkZGVycykgfHwgIWUuYmlkZGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICdzZXRCaWRkZXJDb25maWcgYmlkZGVyIG9wdGlvbnMgbXVzdCBjb250YWluIGEgYmlkZGVycyBsaXN0IHdpdGggYXQgbGVhc3QgMSBiaWRkZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZC5pc1BsYWluT2JqZWN0KGUuY29uZmlnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ3NldEJpZGRlckNvbmZpZyBiaWRkZXIgb3B0aW9ucyBtdXN0IGNvbnRhaW4gYSBjb25maWcgb2JqZWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIGUuYmlkZGVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbdF0gfHwgKHJbdF0gPSB7fSksIE9iamVjdC5rZXlzKGUuY29uZmlnKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuY29uZmlnW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5pc1BsYWluT2JqZWN0KGkpID8gclt0XVtuXSA9IHUoe30sIHJbdF1bbl0gfHwge30sIGkpIDogclt0XVtuXSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpZGRlckNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGIgPSB2KCk7CiAgICAgICAgICAgICAgICB0LmNvbmZpZyA9IGI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PSB0eXBlb2YgZSA/IG51bGwgIT09IGUgOiAnZnVuY3Rpb24nID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZSgpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5tb2R1bGVNYW5hZ2VyID0gdm9pZCAwLCByKDE3KSwgcigyKSwgcig1NCksIHIoMSksIHIoMyksIHIoMCksIHIoNSksIHIoOSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjApLCBpID0gcig4KSwgbyA9IHIoNTUpLCBhID0gZyhyKDU2KSksIHMgPSBnKHIoMTg5KSksIHUgPSByKDM1KSwgYyA9IHIoMTkzKSwgZCA9IHIoMjEpLCBsID0gcig3MiksIGYgPSByKDUyKSwgcCA9IGcocigxMCkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IG0oT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYihlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IG0oT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeSA9ICgwLCBpLmxvZ2dlcikoewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbW9kdWxlTWFuYWdlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I6ICcjRkY5RTFBJywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAnI0ZGRicKICAgICAgICAgICAgICAgICAgICB9KSwgaCA9IHAuZGVmYXVsdC5FVkVOVFMsIFMgPSBoLk1PRFVMRV9ERVJFR0lTVEVSRUQsIE8gPSBoLkxPQUQsIF8gPSBoLk1PRFVMRV9SRUdJU1RFUkVELCBFID0gaC5NT0RVTEVfSU5JVElBTElaRUQsIEkgPSBoLklOSVRJQUxJWkUsIHcgPSBwLmRlZmF1bHQuUVVFUllfUEFSQU1TLk1PRF9TVVBQUkVTUywgQSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAoMCwgYy5nYXRld2F5KSgnbW9kdWxlTWFuYWdlcicpLCB0ID0gW10sIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXSwgYyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5xdWV1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5xdWV1ZS5wdXNoIHx8IGMucXVldWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShzLCB1LCAoMCwgYS5kZWZhdWx0KShjLCBbJ3F1ZXVlJ10pKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5nYXRlICYmICFlLmlzT3BlbihjLmdhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub25PcGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShzLCB1LCAoMCwgYS5kZWZhdWx0KShjLCBbJ2dhdGUnXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMuZ2F0ZSksIHkubG9nSW5mbygnRGVsYXlpbmcgcmVnaXN0cmF0aW9uIG9mIG1vZHVsZSAnLmNvbmNhdChzLm5hbWUsICcgZm9yIGdhdGV3YXkgJykuY29uY2F0KGMuZ2F0ZSkpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBzLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmRlcGVuZGVuY2llcyA9IHUsIGgodSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobC5mZWF0dXJlcy5nZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQodywgJy4nKS5jb25jYXQoZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdCh3LCAnLmFsbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geS5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdNb2R1bGUgU3VwcmVzc2VkJywgZiwgcyksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocltmXSAmJiByW2ZdLmlzUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbZl0gJiYgKHMgPSByW2ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltmXSA9IHMsIHJbZl0uaXNSZWdpc3RlcmVkID0gITAsIHJbZl0uaW5kZXggPSByW2ZdLmluZGV4IHx8IE9iamVjdC5rZXlzKHIpLmxlbmd0aCAtIDEsIHJbZl0ucmVnaXN0ZXIgJiYgKDAsIG8ubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbZl0ucmVnaXN0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB5LmF0VmVyYm9zaXR5KDEpLmxvZ0Vycm9yKSwgeS5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdSZWdpc3RlcmluZyBNb2R1bGUnLCBmLCByW2ZdKSwgbi5ldmVudEVtaXR0ZXIuZW1pdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChzLm5hbWUsICcuJykuY29uY2F0KF8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZiwgcltmXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCB0Lmxlbmd0aDsgcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gdFtwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyhyW2ZdLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltmXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAoMCwgcy5kZWZhdWx0KShPYmplY3QudmFsdWVzKHIpLCBbJ2luZGV4J10sIFsnYXNjJ10pLCBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHJbaVtvXS5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIGUoYSwgYS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgdC5wdXNoKGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiBlKHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoMCwgdS5jbG9uZURlZXApKHQpLCBuID0gciwgcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmJpZFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgdS5jbG9uZURlZXApKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgby5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGUuYmlkUmVxdWVzdChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeS5hdFZlcmJvc2l0eSgxKS5sb2dFcnJvciwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlKHQgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGVyZWdpc3RlciAmJiAoMCwgby5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlcmVnaXN0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHkuYXRWZXJib3NpdHkoMSkubG9nRXJyb3IpLCBuLmV2ZW50RW1pdHRlci5lbWl0KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChlLCAnLicpLmNvbmNhdChTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZSwgdCksIHIgPSAoMCwgYS5kZWZhdWx0KShyLCBbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLmNvbnN0cnVjdG9yID09PSBBcnJheSA/IGUgOiBbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgYih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZXZlbnRFbWl0dGVyLm9uKFMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCkgfHwgbSh0Lm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIoKSA/IGkodCkgOiAobi5ldmVudEVtaXR0ZXIub24oXywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoKSAmJiBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmV2ZW50RW1pdHRlci5vbihJLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbml0aWFsaXplICYmICgwLCBvLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmluaXRpYWxpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB5LmF0VmVyYm9zaXR5KDEpLmxvZ0Vycm9yKSwgZS5pc0luaXRpYWxpemVkID0gITAsIG4uZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQoZS5uYW1lLCAnLicpLmNvbmNhdChFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGUubmFtZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmV2ZW50RW1pdHRlci5vbihPLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5oZWFkZXJCaWRkZXJSZXF1ZXN0LmJlZm9yZShnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGQuZXhwb3N1cmVBcGkuZXhwb3NlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lzdGVyZWRNb2R1bGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhTW9kdWxlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIoZSkgPyB0KHYodih7fSwgcltlXSksIHt9LCB7IGlzRW5hYmxlZDogITAgfSkpIDogbiAmJiB0KHsgaXNFbmFibGVkOiAhMSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRld2F5czogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaVJlYWR5OiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQubW9kdWxlTWFuYWdlciA9IEE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpOwogICAgICAgICAgICAgICAgbihuLlMgKyBuLkYsICdPYmplY3QnLCB7IGFzc2lnbjogcigyMDEpIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIzKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFuKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihlICsgJyBpcyBub3QgYW4gb2JqZWN0IScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAhcigyNCkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiA3ICE9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KS5hOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgaSA9ICgobiA9IHIoMTcyKSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9KS5kZWZhdWx0OwogICAgICAgICAgICAgICAgdC5kZWZhdWx0ID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gcigxOCksIG8gPSByKDEyNSkoMCksIGEgPSByKDQxKSwgcyA9IHIoNzgpLCB1ID0gcigyMDEpLCBjID0gcigzMjYpLCBkID0gcigyMyksIGwgPSByKDk3KSwgZiA9IHIoOTcpLCBwID0gIWkuQWN0aXZlWE9iamVjdCAmJiAnQWN0aXZlWE9iamVjdCcgaW4gaSwgZyA9IHMuZ2V0V2VhaywgbSA9IE9iamVjdC5pc0V4dGVuc2libGUsIHYgPSBjLnVmc3RvcmUsIGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gdCA/IHYobCh0aGlzLCAnV2Vha01hcCcpKS5nZXQoZSkgOiB0ID8gdFt0aGlzLl9pXSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuZGVmKGwodGhpcywgJ1dlYWtNYXAnKSwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBoID0gZS5leHBvcnRzID0gcigyMDQpKCdXZWFrTWFwJywgYiwgeSwgYywgITAsICEwKTsKICAgICAgICAgICAgICAgIGYgJiYgcCAmJiAodSgobiA9IGMuZ2V0Q29uc3RydWN0b3IoYiwgJ1dlYWtNYXAnKSkucHJvdG90eXBlLCB5KSwgcy5ORUVEID0gITAsIG8oWwogICAgICAgICAgICAgICAgICAgICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICdoYXMnLAogICAgICAgICAgICAgICAgICAgICdnZXQnLAogICAgICAgICAgICAgICAgICAgICdzZXQnCiAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaC5wcm90b3R5cGUsIHIgPSB0W2VdOwogICAgICAgICAgICAgICAgICAgIGEodCwgZSwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQodCkgJiYgIW0odCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2YgfHwgKHRoaXMuX2YgPSBuZXcgbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy5fZltlXSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2V0JyA9PSBlID8gdGhpcyA6IG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuY2FsbCh0aGlzLCB0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbiBpbmNsdWRlcyhhcnIsIGl0ZW0pIGFyciBtdXN0IGJlIGFuIGFycmF5LicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5pbmNsdWRlcyA/IGUuaW5jbHVkZXModCkgOiBlLmluZGV4T2YodCkgPj0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIucih0KSwgci5kKHQsICdkZWZhdWx0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjcpLCBpID0gcigxNTcpLCBvID0gcig4OSksIGEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgICAgICAgICB0LmYgPSByKDI4KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG4oZSksIHQgPSBvKHQsICEwKSwgbihyKSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ2dldCcgaW4gciB8fCAnc2V0JyBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAndmFsdWUnIGluIHIgJiYgKGVbdF0gPSByLnZhbHVlKSwgZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjcpLCBpID0gcig0NyksIG8gPSByKDM4KSwgYSA9IHIoNjkpLCBzID0gcigxMzQpLCB1ID0gcigxMDgpLCBjID0gTWF0aC5tYXgsIGQgPSBNYXRoLm1pbiwgbCA9IE1hdGguZmxvb3IsIGYgPSAvXCQoWyQmYCddfFxkXGQ/fDxbXj5dKj4pL2csIHAgPSAvXCQoWyQmYCddfFxkXGQ/KS9nOwogICAgICAgICAgICAgICAgcigxMDkpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGUsIHQsIHIsIGcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlKHRoaXMpLCBhID0gbnVsbCA9PSBuID8gdm9pZCAwIDogblt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGEgPyBhLmNhbGwobiwgbywgaSkgOiByLmNhbGwoU3RyaW5nKG8pLCBuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZyhyLCBlLCB0aGlzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gbihlKSwgZiA9IFN0cmluZyh0aGlzKSwgcCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIHx8ICh0ID0gU3RyaW5nKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gbC5nbG9iYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbC51bmljb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHkgPSBbXTs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB1KGwsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeS5wdXNoKGgpLCAhdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycgPT09IFN0cmluZyhoWzBdKSAmJiAobC5sYXN0SW5kZXggPSBzKGYsIG8obC5sYXN0SW5kZXgpLCBiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBTLCBPID0gJycsIF8gPSAwLCBFID0gMDsgRSA8IHkubGVuZ3RoOyBFKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0geVtFXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBJID0gU3RyaW5nKGhbMF0pLCB3ID0gYyhkKGEoaC5pbmRleCksIGYubGVuZ3RoKSwgMCksIEEgPSBbXSwgVCA9IDE7IFQgPCBoLmxlbmd0aDsgVCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEucHVzaCh2b2lkIDAgPT09IChTID0gaFtUXSkgPyBTIDogU3RyaW5nKFMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBoLmdyb3VwczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IFtJXS5jb25jYXQoQSwgdywgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0geCAmJiBDLnB1c2goeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQID0gU3RyaW5nKHQuYXBwbHkodm9pZCAwLCBDKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCA9IG0oSSwgZiwgdywgQSwgeCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPj0gXyAmJiAoTyArPSBmLnNsaWNlKF8sIHcpICsgUCwgXyA9IHcgKyBJLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTyArIGYuc2xpY2UoXyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCwgbiwgbywgYSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG4gKyBlLmxlbmd0aCwgYyA9IG8ubGVuZ3RoLCBkID0gcDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gYSAmJiAoYSA9IGkoYSksIGQgPSBmKSwgci5jYWxsKHMsIGQsIGZ1bmN0aW9uIChyLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaS5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2AnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsaWNlKDAsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsaWNlKHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGFbaS5zbGljZSgxLCAtMSldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICtpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBsKGQgLyAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSBmID8gciA6IGYgPD0gYyA/IHZvaWQgMCA9PT0gb1tmIC0gMV0gPyBpLmNoYXJBdCgxKSA6IG9bZiAtIDFdICsgaS5jaGFyQXQoMSkgOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gb1tkIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBzID8gJycgOiBzOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBpLmRlZmF1bHQpKGUsIHQsIHIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDIzNikpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmNsb25lRGVlcFByb3RvID0gdC5jbG9uZURlZXAgPSB0LmNsb25lRGVlcENpcmMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IChuID0gcigyNjcpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH07CiAgICAgICAgICAgICAgICB2YXIgbyA9IGkuZGVmYXVsdDsKICAgICAgICAgICAgICAgIHQuY2xvbmVEZWVwQ2lyYyA9IG87CiAgICAgICAgICAgICAgICB2YXIgYSA9IGkuZGVmYXVsdDsKICAgICAgICAgICAgICAgIHQuY2xvbmVEZWVwID0gYTsKICAgICAgICAgICAgICAgIHZhciBzID0gaS5kZWZhdWx0OwogICAgICAgICAgICAgICAgdC5jbG9uZURlZXBQcm90byA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBKU09OLnBhcnNlKCd7IkpTT05fTUFQUElORyI6eyJQTF9DT0RFIjoiY29kZSIsIlBMX1NJWkUiOiJzaXplcyIsIlBMX0JJRFMiOiJiaWRzIiwiQkRfQklEREVSIjoiYmlkZGVyIiwiQkRfSUQiOiJwYXJhbXNkIiwiQkRfUExfSUQiOiJwbGFjZW1lbnRJZCIsIkFEU0VSVkVSX1RBUkdFVElORyI6ImFkc2VydmVyVGFyZ2V0aW5nIiwiQkRfU0VUVElOR19TVEFOREFSRCI6InN0YW5kYXJkIn0sIkRFQlVHX01PREUiOiJwYmpzX2RlYnVnIiwiU1RBVFVTIjp7IkdPT0QiOjEsIk5PX0JJRCI6Mn0sIkNCIjp7IlRZUEUiOnsiQUxMX0JJRFNfQkFDSyI6ImFsbFJlcXVlc3RlZEJpZHNCYWNrIiwiQURfVU5JVF9CSURTX0JBQ0siOiJhZFVuaXRCaWRzQmFjayIsIkJJRF9XT04iOiJiaWRXb24iLCJSRVFVRVNUX0JJRFMiOiJyZXF1ZXN0QmlkcyJ9fSwiRVZFTlRTIjp7IkFVQ1RJT05fSU5JVCI6ImF1Y3Rpb25Jbml0IiwiQVVDVElPTl9FTkQiOiJhdWN0aW9uRW5kIiwiQklEX0FESlVTVE1FTlQiOiJiaWRBZGp1c3RtZW50IiwiQklEX1RJTUVPVVQiOiJiaWRUaW1lb3V0IiwiQklEX1JFUVVFU1RFRCI6ImJpZFJlcXVlc3RlZCIsIkJJRF9SRVNQT05TRSI6ImJpZFJlc3BvbnNlIiwiTk9fQklEIjoibm9CaWQiLCJCSURfV09OIjoiYmlkV29uIiwiQklEREVSX0RPTkUiOiJiaWRkZXJEb25lIiwiU0VUX1RBUkdFVElORyI6InNldFRhcmdldGluZyIsIkJFRk9SRV9SRVFVRVNUX0JJRFMiOiJiZWZvcmVSZXF1ZXN0QmlkcyIsIlJFUVVFU1RfQklEUyI6InJlcXVlc3RCaWRzIiwiQUREX0FEX1VOSVRTIjoiYWRkQWRVbml0cyIsIkFEX1JFTkRFUl9GQUlMRUQiOiJhZFJlbmRlckZhaWxlZCIsIlRDRjJfRU5GT1JDRU1FTlQiOiJ0Y2YyRW5mb3JjZW1lbnQiLCJBVUNUSU9OX0RFQlVHIjoiYXVjdGlvbkRlYnVnIiwiQklEX1ZJRVdBQkxFIjoiYmlkVmlld2FibGUifSwiQURfUkVOREVSX0ZBSUxFRF9SRUFTT04iOnsiUFJFVkVOVF9XUklUSU5HX09OX01BSU5fRE9DVU1FTlQiOiJwcmV2ZW50V3JpdGluZ09uTWFpbkRvY3VtZW50IiwiTk9fQUQiOiJub0FkIiwiRVhDRVBUSU9OIjoiZXhjZXB0aW9uIiwiQ0FOTk9UX0ZJTkRfQUQiOiJjYW5ub3RGaW5kQWQiLCJNSVNTSU5HX0RPQ19PUl9BRElEIjoibWlzc2luZ0RvY09yQWRpZCJ9LCJFVkVOVF9JRF9QQVRIUyI6eyJiaWRXb24iOiJhZFVuaXRDb2RlIn0sIkdSQU5VTEFSSVRZX09QVElPTlMiOnsiTE9XIjoibG93IiwiTUVESVVNIjoibWVkaXVtIiwiSElHSCI6ImhpZ2giLCJBVVRPIjoiYXV0byIsIkRFTlNFIjoiZGVuc2UiLCJDVVNUT00iOiJjdXN0b20ifSwiVEFSR0VUSU5HX0tFWVMiOnsiQklEREVSIjoiaGJfYmlkZGVyIiwiQURfSUQiOiJoYl9hZGlkIiwiUFJJQ0VfQlVDS0VUIjoiaGJfcGIiLCJTSVpFIjoiaGJfc2l6ZSIsIkRFQUwiOiJoYl9kZWFsIiwiU09VUkNFIjoiaGJfc291cmNlIiwiRk9STUFUIjoiaGJfZm9ybWF0IiwiVVVJRCI6ImhiX3V1aWQiLCJDQUNIRV9JRCI6ImhiX2NhY2hlX2lkIiwiQ0FDSEVfSE9TVCI6ImhiX2NhY2hlX2hvc3QiLCJBRE9NQUlOIjoiaGJfYWRvbWFpbiJ9LCJERUZBVUxUX1RBUkdFVElOR19LRVlTIjp7IkJJRERFUiI6ImhiX2JpZGRlciIsIkFEX0lEIjoiaGJfYWRpZCIsIlBSSUNFX0JVQ0tFVCI6ImhiX3BiIiwiU0laRSI6ImhiX3NpemUiLCJERUFMIjoiaGJfZGVhbCIsIlNPVVJDRSI6ImhiX3NvdXJjZSIsIkZPUk1BVCI6ImhiX2Zvcm1hdCIsIlVVSUQiOiJoYl91dWlkIiwiQ0FDSEVfSUQiOiJoYl9jYWNoZV9pZCIsIkNBQ0hFX0hPU1QiOiJoYl9jYWNoZV9ob3N0In0sIk5BVElWRV9LRVlTIjp7InRpdGxlIjoiaGJfbmF0aXZlX3RpdGxlIiwiYm9keSI6ImhiX25hdGl2ZV9ib2R5IiwiYm9keTIiOiJoYl9uYXRpdmVfYm9keTIiLCJwcml2YWN5TGluayI6ImhiX25hdGl2ZV9wcml2YWN5IiwicHJpdmFjeUljb24iOiJoYl9uYXRpdmVfcHJpdmljb24iLCJzcG9uc29yZWRCeSI6ImhiX25hdGl2ZV9icmFuZCIsImltYWdlIjoiaGJfbmF0aXZlX2ltYWdlIiwiaWNvbiI6ImhiX25hdGl2ZV9pY29uIiwiY2xpY2tVcmwiOiJoYl9uYXRpdmVfbGlua3VybCIsImRpc3BsYXlVcmwiOiJoYl9uYXRpdmVfZGlzcGxheXVybCIsImN0YSI6ImhiX25hdGl2ZV9jdGEiLCJyYXRpbmciOiJoYl9uYXRpdmVfcmF0aW5nIiwiYWRkcmVzcyI6ImhiX25hdGl2ZV9hZGRyZXNzIiwiZG93bmxvYWRzIjoiaGJfbmF0aXZlX2Rvd25sb2FkcyIsImxpa2VzIjoiaGJfbmF0aXZlX2xpa2VzIiwicGhvbmUiOiJoYl9uYXRpdmVfcGhvbmUiLCJwcmljZSI6ImhiX25hdGl2ZV9wcmljZSIsInNhbGVQcmljZSI6ImhiX25hdGl2ZV9zYWxlcHJpY2UiLCJyZW5kZXJlclVybCI6ImhiX3JlbmRlcmVyX3VybCIsImFkVGVtcGxhdGUiOiJoYl9hZFRlbXBsYXRlIn0sIlMyUyI6eyJTUkMiOiJzMnMiLCJERUZBVUxUX0VORFBPSU5UIjoiaHR0cHM6Ly9wcmViaWQuYWRueHMuY29tL3Bicy92MS9vcGVucnRiMi9hdWN0aW9uIiwiU1lOQ0VEX0JJRERFUlNfS0VZIjoicGJqc1N5bmNzIn0sIkJJRF9TVEFUVVMiOnsiQklEX1RBUkdFVElOR19TRVQiOiJ0YXJnZXRpbmdTZXQiLCJSRU5ERVJFRCI6InJlbmRlcmVkIiwiQklEX1JFSkVDVEVEIjoiYmlkUmVqZWN0ZWQifX0nKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbiBmaW5kKGFyciwgY2FsbGJhY2spIGFyciBtdXN0IGJlIGFuIGFycmF5LicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbiBmaW5kKGFyciwgY2FsbGJhY2spIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGUuZmluZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maW5kKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KG4sIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIucih0KSwgci5kKHQsICdkZWZhdWx0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjkpLCBpID0gTWF0aC5taW47CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID4gMCA/IGkobihlKSwgOTAwNzE5OTI1NDc0MDk5MSkgOiAwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lmhvb2tlZEZuID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoMjY0KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9LCBvID0gcigxMik7CiAgICAgICAgICAgICAgICB2YXIgYSA9ICgwLCBpLmRlZmF1bHQpKHsgdXNlUHJveHk6IHZvaWQgMCAhPT0gKDAsIG8uZG9tKSgpLndpbmRvdy5Qcm94eSB9KTsKICAgICAgICAgICAgICAgIHQuaG9va2VkRm4gPSBhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE4KSwgaSA9IHIoNTApLCBvID0gcig2NyksIGEgPSByKDE0NyksIHMgPSByKDg5KSwgdSA9IHIoMjQpLCBjID0gcig2NikuZiwgZCA9IHIoOTApLmYsIGwgPSByKDMyKS5mLCBmID0gcigzMTYpLnRyaW0sIHAgPSBuLk51bWJlciwgZyA9IHAsIG0gPSBwLnByb3RvdHlwZSwgdiA9ICdOdW1iZXInID09IG8ocig4MCkobSkpLCBiID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGUsIHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMoZSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgdC5sZW5ndGggPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSwgbyA9ICh0ID0gYiA/IHQudHJpbSgpIDogZih0LCAzKSkuY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0MyA9PT0gbyB8fCA0NSA9PT0gbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg4OCA9PT0gKHIgPSB0LmNoYXJDb2RlQXQoMikpIHx8IDEyMCA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmFOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoNDggPT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuY2hhckNvZGVBdCgxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5ODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDIsIGkgPSA0OTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDgsIGkgPSA1NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICt0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCB1ID0gdC5zbGljZSgyKSwgYyA9IDAsIGQgPSB1Lmxlbmd0aDsgYyA8IGQ7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPSB1LmNoYXJDb2RlQXQoYykpIDwgNDggfHwgYSA+IGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOYU47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiArdDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKCFwKCcgMG8xJykgfHwgIXAoJzBiMScpIHx8IHAoJysweDEnKSkgewogICAgICAgICAgICAgICAgICAgIHAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPCAxID8gMCA6IGUsIHIgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciBpbnN0YW5jZW9mIHAgJiYgKHYgPyB1KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udmFsdWVPZi5jYWxsKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICdOdW1iZXInICE9IG8ocikpID8gYShuZXcgZyh5KHQpKSwgciwgcCkgOiB5KHQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCwgUyA9IHIoMjgpID8gYyhnKSA6ICdNQVhfVkFMVUUsTUlOX1ZBTFVFLE5hTixORUdBVElWRV9JTkZJTklUWSxQT1NJVElWRV9JTkZJTklUWSxFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcicuc3BsaXQoJywnKSwgTyA9IDA7IFMubGVuZ3RoID4gTzsgTysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkoZywgaCA9IFNbT10pICYmICFpKHAsIGgpICYmIGwocCwgaCwgZChnLCBoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHAucHJvdG90eXBlID0gbSwgbS5jb25zdHJ1Y3RvciA9IHAsIHIoNDEpKG4sICdOdW1iZXInLCBwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDQ2KSwgbyA9IHIoNTApLCBhID0gcig2MykoJ3NyYycpLCBzID0gcigyMjYpLCB1ID0gKCcnICsgcykuc3BsaXQoJ3RvU3RyaW5nJyk7CiAgICAgICAgICAgICAgICByKDYyKS5pbnNwZWN0U291cmNlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5jYWxsKGUpOwogICAgICAgICAgICAgICAgfSwgKGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiByOwogICAgICAgICAgICAgICAgICAgIGMgJiYgKG8ociwgJ25hbWUnKSB8fCBpKHIsICduYW1lJywgdCkpLCBlW3RdICE9PSByICYmIChjICYmIChvKHIsIGEpIHx8IGkociwgYSwgZVt0XSA/ICcnICsgZVt0XSA6IHUuam9pbihTdHJpbmcodCkpKSksIGUgPT09IG4gPyBlW3RdID0gciA6IHMgPyBlW3RdID8gZVt0XSA9IHIgOiBpKGUsIHQsIHIpIDogKGRlbGV0ZSBlW3RdLCBpKGUsIHQsIHIpKSk7CiAgICAgICAgICAgICAgICB9KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdGhpcyAmJiB0aGlzW2FdIHx8IHMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZXJyb3JSZXBvcnRpbmcgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjApLCBpID0gcigzNSksIG8gPSByKDIxKSwgYSA9IHIoNzIpLCBzID0gcigyMDApLCB1ID0gcigxNSksIGMgPSByKDEyMiksIGQgPSByKDIxMCksIGwgPSBnKHIoMTApKSwgZiA9IGcocig1MSkpLCBwID0gcig4KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtID0gbC5kZWZhdWx0LkVWRU5UUy5FUlJPUl9SRVBPUlQsIHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gITEsIHQgPSBbXSwgciA9IFtdLCBsID0gW10sIGcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaSBpbnN0YW5jZW9mIEVycm9yICYmIChpID0gJ3N0cmluZycgPT0gdHlwZW9mIGkgPyBuZXcgRXJyb3IoaSkgOiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoaSkpKSwgIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbC5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaSwgZi5kZWZhdWx0KSkpLmxldmVsIHx8IChpLmxldmVsID0gJ2Vycm9yJyksIHIucHVzaChpKSwgdC5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuYmJMb2dnZXIubG9nRXJyb3IoJ0ZhaWx1cmUgdG8gcmVwb3J0IGVycm9yLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmV4cG9zdXJlQXBpLmV4cG9zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxFcnJvcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuY2xvbmVEZWVwKShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWV1ZWRFcnJvcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuY2xvbmVEZWVwKShsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksICgwLCB1LmdldENvbmZpZykoJ2Vycm9yUmVwb3J0aW5nJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5ldmVudEVtaXR0ZXIub24obSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhLmZlYXR1cmVzLmdldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VSdW4uZXJyb3JSZXBvcnRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlUnVuLmFsbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgfHwgKDAsIHMucGVyY2VudGFnZVNob3VsZFJ1bikoZy5yZXBvcnRpbmdQZXJjZW50YWdlKSkgJiYgKHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBzLnBlcmNlbnRhZ2VSdW5uZXIpKGEuZmVhdHVyZXMuZ2V0KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VSdW4uZXJyb3JSZXBvcnRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZVJ1bi5hbGwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCBnLnJlcG9ydGluZ1BlcmNlbnRhZ2UsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICgwLCBkLmNodW5rKSh0LCBnLmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0OiAncU1vbnlXcjJ3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzOiBlW3JdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hcGkuc2VuZEJlYWNvbignbG9nL2NsaWVudCcsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZy5yZXBvcnRJbnRlcnZhbCksIGUgPSAhMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBsLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdihsW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0OiB2CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5lcnJvclJlcG9ydGluZyA9IHY7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjcpLCBpID0gcigzOCksIG8gPSByKDEzNCksIGEgPSByKDEwOCk7CiAgICAgICAgICAgICAgICByKDEwOSkoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGUsIHQsIHIsIHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlKHRoaXMpLCBpID0gbnVsbCA9PSByID8gdm9pZCAwIDogclt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyBpLmNhbGwociwgbikgOiBuZXcgUmVnRXhwKHIpW3RdKFN0cmluZyhuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMociwgZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5kb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG4oZSksIGMgPSBTdHJpbmcodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUuZ2xvYmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEodSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHUudW5pY29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwsIGYgPSBbXSwgcCA9IDA7IG51bGwgIT09IChsID0gYSh1LCBjKSk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBTdHJpbmcobFswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltwXSA9IGcsICcnID09PSBnICYmICh1Lmxhc3RJbmRleCA9IG8oYywgaSh1Lmxhc3RJbmRleCksIGQpKSwgcCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IHAgPyBudWxsIDogZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmNsZWFyVW5pdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdC5yYXdVbml0cyA9IE8gPSB7fSwgdC51bml0UmVnaXN0cnkgPSBfID0ge30sIHQudW5pdFRlbXBsYXRlcyA9IEUgPSB7fTsKICAgICAgICAgICAgICAgIH0sIHQuc2V0dXBVbml0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlOwogICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocikgJiYgKHIgPSAoMCwgbi5kZWZhdWx0KShlLCAnY29kZScpKTsKICAgICAgICAgICAgICAgICAgICB0LnVuaXRSZWdpc3RyeSA9IF8gPSByLCB0LnVuaXRUZW1wbGF0ZXMgPSBFID0gKDAsIHAuY2xvbmVEZWVwKShfKSwgdC5yYXdVbml0cyA9IE8gPSAoMCwgcC5jbG9uZURlZXApKF8pOwogICAgICAgICAgICAgICAgfSwgdC5tZXJnZVVuaXRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBuLmRlZmF1bHQpKGUsICdjb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgdC51bml0UmVnaXN0cnkgPSBfID0gKDAsIGkuZGVmYXVsdCkociwgXyksIHQudW5pdFRlbXBsYXRlcyA9IEUgPSAoMCwgcC5jbG9uZURlZXApKF8pLCB0LnJhd1VuaXRzID0gTyA9ICgwLCBwLmNsb25lRGVlcCkoXyk7CiAgICAgICAgICAgICAgICB9LCB0LmdldFJhd1VuaXRzID0gSSwgdC5nZXRVbml0cyA9IHcsIHQuZ2V0VW5pdFRlbXBsYXRlcyA9IEEsIHQuZ2V0VW5pdENvZGVzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gW10sIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG4pICYmIG51bGwgPT09IG5bMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChuWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICgwLCBsLmdldENvbmZpZykoJ2dlbmVyYXRlSW5jcmVtZW50YWxVbml0Q29kZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGkoblswXSwgblsxXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIG4gPyB0LnB1c2gobikgOiAnb2JqZWN0JyA9PT0gYihuKSAmJiB0LnB1c2gobi5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0U2l6ZXMgPSBSLCB0LnNldE91dE9mUGFnZSA9IGssIHQuaXNMYXp5TG9hZGVkID0gTSwgdC5kaXNwbGF5VW5pdCA9IHQuc2V0U2l6ZU1hcHBpbmdzID0gdC5zZXRDb2xsYXBzZSA9IHQuc2V0TGF6eUxvYWQgPSB0LmdldFVuaXRDb2xsZWN0aW9uID0gdC51cGRhdGVVbml0ID0gdC5kZWZpbmVVbml0ID0gdC5wb3N0UHJvY2Vzc1VuaXQgPSB0LnVuaXRUZW1wbGF0ZXMgPSB0LnVuaXRSZWdpc3RyeSA9IHQucmF3VW5pdHMgPSB2b2lkIDAsIHIoNCksIHIoMTcpLCByKDIpLCByKDU0KSwgcigxKSwgcigzKSwgcigwKSwgcig1KSwgcigxOTkpOwogICAgICAgICAgICAgICAgdmFyIG4gPSB2KHIoMTQ5KSksIGkgPSB2KHIoMjkpKSwgbyA9IHYocigxNTApKSwgYSA9IHYocigxOTApKSwgcyA9IHIoOCksIHUgPSByKDEyKSwgYyA9IHIoMzkpLCBkID0gcigzMDkpLCBsID0gcigxNSksIGYgPSByKDIxKSwgcCA9IHIoMzUpLCBnID0gdihyKDEwKSksIG0gPSByKDQyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IHkoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUyhlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IHkoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgTyA9IHt9OwogICAgICAgICAgICAgICAgdC5yYXdVbml0cyA9IE87CiAgICAgICAgICAgICAgICB2YXIgXyA9IHt9OwogICAgICAgICAgICAgICAgdC51bml0UmVnaXN0cnkgPSBfOwogICAgICAgICAgICAgICAgdmFyIEUgPSB7fTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQudW5pdFRlbXBsYXRlcyA9IEU7CiAgICAgICAgICAgICAgICB2YXIgVCA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaXNMYXp5TG9hZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTShlLmNvZGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGUuZ2V0U2l6ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSKGUuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5lbGVtZW50ID0gKDAsIHUuZG9tKSgpLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmNvZGUpLCBlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnBvc3RQcm9jZXNzVW5pdCA9IFQ7CiAgICAgICAgICAgICAgICB2YXIgeCA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9bZS5jb2RlXSA9IGUsIF9bZS5jb2RlXTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdC5kZWZpbmVVbml0ID0geDsKICAgICAgICAgICAgICAgIHZhciBDID0gKDAsIGMuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbCwgciA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0pIHx8IGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlICYmICFfW2VdIHx8ICdzdHJpbmcnICE9IHR5cGVvZiBlICYmICFfW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuYmJMb2dnZXIubG9nRXJyb3IoJ0F0dGVtcHRpbmcgdG8gdXBkYXRlIHVuaXQgdGhhdCBkb2VzIG5vdCBleGlzdCcsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG5ldyBFcnJvcignQXR0ZW1wdGluZyB0byB1cGRhdGUgdW5pdCB0aGF0IGRvZXMgbm90IGV4aXN0LicpOwogICAgICAgICAgICAgICAgICAgICAgICBtLmVycm9yUmVwb3J0aW5nLnJlcG9ydChvKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0IHx8ICdzdHJpbmcnID09IHR5cGVvZiBlID8gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgdCAmJiAoX1tlXSA9IGgoaCh7fSwgX1tlXSksIHQpLCByICYmIChFW2VdID0gaChoKHt9LCBFW2VdKSwgdCkpKSA6IChfW2UuY29kZV0gPSBoKGgoe30sIF9bZS5jb2RlXSksIGUpLCByICYmIChFW2UuY29kZV0gPSBoKGgoe30sIEVbZS5jb2RlXSksIGUpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnVwZGF0ZVVuaXQgPSBDOwogICAgICAgICAgICAgICAgdmFyIFAgPSAoMCwgYy5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5yZWR1Y2UoZnVuY3Rpb24gKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJiTG9nZ2VyLmxvZ0Vycm9yKCdTS0lQUElORyBVTklUOiBVbml0IGRlc2lnbmF0aW9uIGlzIG51bGwgb3IgdW5kZWZpbmVkIGF0IGluZGV4JywgbiwgJ3Byb3ZpZGVkOicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBuZXcgRXJyb3IoJ1NLSVBQSU5HIFVOSVQ6IFVuaXQgZGVzaWduYXRpb24gaXMgbnVsbCBvciB1bmRlZmluZWQgYXQgaW5kZXggJy5jb25jYXQobiwgJyBwcm92aWRlZDogJykuY29uY2F0KGUsICcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uZXJyb3JSZXBvcnRpbmcucmVwb3J0KHUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBiKHIpICYmIHIuY29uc3RydWN0b3IgIT09IEFycmF5ID8gYyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub3JkZXJJbmRleCA9IHQsIGUub3JpZ2luYWxDb2RlID0gZS5vcmlnaW5hbENvZGUgfHwgZS5jb2RlLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyLCBuKSA6IHIuY29uc3RydWN0b3IgPT09IEFycmF5ID8gYyA9IG51bGwgPT09IHJbMV0gPyBqKHJbMF0sIG4sIHJbMl0sIHJbM10pIDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDoge30sIGEgPSBhcmd1bWVudHMubGVuZ3RoID4gNCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1s0XSA/IGFyZ3VtZW50c1s0XSA6IHt9LCB1ID0gQXJyYXkuaXNBcnJheSh0KSA/IGUgKyAodFswXSB8fCAnJykgOiBlICsgdCwgYyA9ICgwLCBsLmdldENvbmZpZykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdlbmVyYXRlVmlkZW9Vbml0Q29kZSAmJiBFW2VdICYmIEVbZV0uaXNWaWRlbyA/IHUgPSBjLmdlbmVyYXRlVmlkZW9Vbml0Q29kZShlLCB0LCBFW2VdKSA6IEVbZV0gJiYgIUVbZV0uaW5jcmVtZW50YWwgJiYgRVtlXS5pc1ZpZGVvID8gdSA9IGUgOiBjLmdlbmVyYXRlSW5jcmVtZW50YWxVbml0Q29kZSAmJiAodSA9IGMuZ2VuZXJhdGVJbmNyZW1lbnRhbFVuaXRDb2RlKGUsIHQsIEVbZV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IF9bdV0gPyBfW3VdIDogISghRVtlXSB8fCAhRVtlXS5pbmNyZW1lbnRhbCAmJiAhRVtlXS5pc1ZpZGVvKSAmJiAoMCwgcC5jbG9uZURlZXApKEVbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmNvZGUgPSB1LCBudWxsID09PSB0IHx8IEFycmF5LmlzQXJyYXkodCkgPyBudWxsICE9PSB0ICYmIEFycmF5LmlzQXJyYXkodCkgJiYgMiA9PT0gdC5sZW5ndGggJiYgKGQuaW5kZXggPSB0WzBdLCBkLnNlcXVlbmNlSW5kZXggPSB0WzFdKSA6IChkLmluZGV4ID0gdCwgZC5pc1ZpZGVvICYmIChkLnNlcXVlbmNlSW5kZXggPSAxKSksIGQub3JkZXJJbmRleCA9IHIsIGQub3JpZ2luYWxDb2RlID0gZSwgbiAmJiAoZC50YXJnZXRpbmcgPSAoMCwgaS5kZWZhdWx0KSh7fSwgbiwgZC50YXJnZXRpbmcpKSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAoMCwgby5kZWZhdWx0KShhLCBnLmRlZmF1bHQuVU5JVF9DT05GSUdfQUxMT1dFRF9NT0RJRklFUlMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgwLCBpLmRlZmF1bHQpKHt9LCBmLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmJMb2dnZXIuYXRWZXJib3NpdHkoMikubG9nRXJyb3IoJ1VuaXQgVGVtcGxhdGUgZm9yJywgZSwgJ2RvZXMgbm90IGV4aXN0IG9yIGlzIGNvbmZpZ3VyZWQgaW1wcm9wZXJseShub3QgaW5jcmVtZW50YWw/KS4gU2tpcHBpbmcgZGVmaW5pdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBuZXcgRXJyb3IoJ1VuaXQgVGVtcGxhdGUgZm9yXCcgJy5jb25jYXQoZSwgJyBkb2VzIG5vdCBleGlzdCBvciBpcyBjb25maWd1cmVkIGltcHJvcGVybHkobm90IGluY3JlbWVudGFsPykuIFNraXBwaW5nIGRlZmluaXRpb24uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmVycm9yUmVwb3J0aW5nLnJlcG9ydCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHJbMF0sIHJbMV0sIG4sIHJbMl0sIHJbM10pIDogJ3N0cmluZycgPT0gdHlwZW9mIHIgJiYgKGMgPSBqKHIsIG4pKSwgKGMgPSBjID8gVChjLCByKSA6IGMpICYmICghdC5mbGFnc1tjLmNvZGVdIHx8IGMuaXNWaWRlbykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmdldERlc2lnbmF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmZsYWdzW2MuY29kZV0gPSAhMCwgKDAsIGQudW5pdEhhc0VsZW1lbnQpKGMpIHx8IE0oYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnVuaXRzLnB1c2goeChjLCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmJMb2dnZXIubG9nRXJyb3IoYy5jb2RlLCAnOiBVbml0IGRlc2lnbmF0aW9uIGRvZXMgbm90IGhhdmUgYW4gZWxlbWVudC4gSWYgeW91IGFyZSBsYXp5IGxvYWRpbmcsIHRoaXMgdW5pdCBpcyBub3QgY29uZmlndXJlZCBmb3IgbGF6eSBsb2FkaW5nLicsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEVycm9yKCcnLmNvbmNhdChjLmNvZGUsICcgOiBVbml0IGRlc2lnbmF0aW9uIGRvZXMgbm90IGhhdmUgYW4gZWxlbWVudC4gSWYgeW91IGFyZSBsYXp5IGxvYWRpbmcsIHRoaXMgdW5pdCBpcyBub3QgY29uZmlndXJlZCBmb3IgbGF6eSBsb2FkaW5nLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmVycm9yUmVwb3J0aW5nLnJlcG9ydChmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHM6IFtdCiAgICAgICAgICAgICAgICAgICAgfSkudW5pdHMgOiBQKFtlXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gX1tlXTsKICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5vcmRlckluZGV4ID0gdCwgYS5vcmlnaW5hbENvZGUgPSBhLm9yaWdpbmFsQ29kZSB8fCBlLCByICYmIChhLnRhcmdldGluZyA9ICgwLCBpLmRlZmF1bHQpKHt9LCByLCBhLnRhcmdldGluZykpLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9ICgwLCBvLmRlZmF1bHQpKG4sIGcuZGVmYXVsdC5VTklUX0NPTkZJR19BTExPV0VEX01PRElGSUVSUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gKDAsIGkuZGVmYXVsdCkoYSwgdSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDIpLmxvZ0Vycm9yKCdVbml0JywgZSwgJ2RvZXMgbm90IGV4aXN0LiBTa2lwcGluZyBkZWZpbml0aW9uLicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBFcnJvcignVW5pdCAnLmNvbmNhdChlLCAnIGRvZXMgbm90IGV4aXN0LiBTa2lwcGluZyBkZWZpbml0aW9uLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgbS5lcnJvclJlcG9ydGluZy5yZXBvcnQoYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IF9bZV0gOiBlOwogICAgICAgICAgICAgICAgICAgIGlmICghdC5zaXplTWFwcGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2l6ZXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0Lm1hcHBlZFNpemVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hcHBlZFNpemVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gKDAsIGEuZGVmYXVsdCkodC5zaXplTWFwcGluZ3MsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgKiBlLnZpZXdwb3J0WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICogZS52aWV3cG9ydFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgbiA9IDA7IG4gPCByLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcltuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCB1LmRvbSkoKS53aW5kb3cuaW5uZXJXaWR0aCA+PSBpLnZpZXdwb3J0WzBdICYmIGkudmlld3BvcnRbMV0gPD0gKDAsIHUuZG9tKSgpLndpbmRvdy5pbm5lckhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWFwcGVkU2l6ZXMgPSBpLnNpemVzLCBpLnNpemVzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDMpLmxvZ1dhcm4oJ05vIG1hdGNoaW5nIG1hcHBpbmdzIGZvdW5kIGZvciB2aWV3cG9ydCcsIHQuY29kZSwgciksIHQuc2l6ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmdldFVuaXRDb2xsZWN0aW9uID0gUDsKICAgICAgICAgICAgICAgIHZhciBEID0gKDAsIGMuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gIShhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSkgfHwgYXJndW1lbnRzWzBdLCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBbXSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgICAgICB0ICYmIDAgIT09IHQubGVuZ3RoIHx8ICh0ID0gT2JqZWN0LmtleXMoXykpOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0geyBsYXp5TG9hZDogZSB9OwogICAgICAgICAgICAgICAgICAgIGUgJiYgKG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICBsYXp5TG9hZDogZQogICAgICAgICAgICAgICAgICAgIH0pLCBDKHQsIG4sIHIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGUpIHsKICAgICAgICAgICAgICAgICAgICBDKGUsIHsgb3V0T2ZQYWdlOiAhMCB9LCAhMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnNldExhenlMb2FkID0gRDsKICAgICAgICAgICAgICAgIHZhciBOID0gKDAsIGMuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhlLCB7IGNvbGxhcHNlRW1wdHlEaXY6IHQgfSwgITApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRDb2RlczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgYXJnOiB0CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnb2JqZWN0JyA9PT0gYihlKSA/IGUgOiB3KClbZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2b2lkIDAgPT09IHQubGF6eUxvYWQgPyB0LmNhY2hlIDogdC5sYXp5TG9hZDsKICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICgwLCB1LmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodC5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgbi5zdHlsZSAmJiAnbm9uZScgPT09IG4uc3R5bGUuZGlzcGxheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuYmJMb2dnZXIubG9nTWVzc2FnZSgnJy5jb25jYXQodC5jb2RlLCAnOiBDYW5ub3QgbGF6eSBsb2FkIGFkIHVuaXRzIHdoZXJlIHRoZSBlbGVtZW50IGhhcyBhIHN0eWxlIG9mIGRpc3BsYXk6bm9uZTsuIFRoaXMgdW5pdCB3aWxsIGV2YWx1YXRlIGFzIFwnbm90IGxhenkgbG9hZGVkXCcgdW50aWwgaXQgZG9lcyBub3QgaGF2ZSBhIHN0eWxlIG9mIGRpc3BsYXk6IG5vbmU7JykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuc2V0Q29sbGFwc2UgPSBOOwogICAgICAgICAgICAgICAgdmFyIFUgPSAoMCwgYy5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIEMoZSwgeyBzaXplTWFwcGluZ3M6IHQgfSwgITApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnNldFNpemVNYXBwaW5ncyA9IFU7CiAgICAgICAgICAgICAgICB2YXIgQiA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgKHMuYmJMb2dnZXIuYXRWZXJib3NpdHkoMykubG9nSW5mbygnRGlzcGxheWluZyB1bml0cycsIGUpLCBlLmZvckVhY2goQikpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmRpc3BsYXlVbml0ID0gQiwgZi5leHBvc3VyZUFwaS5yb290U2NvcGUoewogICAgICAgICAgICAgICAgICAgIHNldE91dE9mUGFnZTogaywKICAgICAgICAgICAgICAgICAgICBzZXRMYXp5TG9hZDogRCwKICAgICAgICAgICAgICAgICAgICBpc0xhenlMb2FkZWQ6IE0sCiAgICAgICAgICAgICAgICAgICAgc2V0Q29sbGFwc2U6IE4sCiAgICAgICAgICAgICAgICAgICAgZ2V0U2l6ZXM6IFIsCiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZU1hcHBpbmdzOiBVLAogICAgICAgICAgICAgICAgICAgIGdldFVuaXRDb2xsZWN0aW9uOiBQCiAgICAgICAgICAgICAgICB9KSwgZi5leHBvc3VyZUFwaS5yb290U2NvcGVHZXR0ZXJzKHsKICAgICAgICAgICAgICAgICAgICB1bml0UmVnaXN0cnk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGFkVW5pdHNPYmo6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGFkVW5pdHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModygpKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHVuaXRUZW1wbGF0ZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFVOSVRTOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5BRFBPRCA9IHQuQkFOTkVSID0gdC5WSURFTyA9IHQuTkFUSVZFID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdC5OQVRJVkUgPSAnbmF0aXZlJzsKICAgICAgICAgICAgICAgIHQuVklERU8gPSAndmlkZW8nOwogICAgICAgICAgICAgICAgdC5CQU5ORVIgPSAnYmFubmVyJzsKICAgICAgICAgICAgICAgIHQuQURQT0QgPSAnYWRwb2QnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMyKSwgaSA9IHIoNzcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcigyOCkgPyBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmYoZSwgdCwgaSgxLCByKSk7CiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDY4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuKGUpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kZWZhdWx0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5CiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcygoZSB8fCB7fSkuY29uc3RydWN0b3IpICYmICFPYmplY3QuZW50cmllcyhlIHx8IHt9KS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9LCByKDEpLCByKDMpLCByKDApLCByKDIzMyksIHIoMjM0KSwgcigyMzUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQucmVnaXN0ZXJCaWRkZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQXJyYXkuaXNBcnJheShlLnN1cHBvcnRlZE1lZGlhVHlwZXMpID8geyBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBlLnN1cHBvcnRlZE1lZGlhVHlwZXMgfSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBJKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpLmRlZmF1bHQucmVnaXN0ZXJCaWRBZGFwdGVyKHIsIGUuY29kZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHIoZSksIEFycmF5LmlzQXJyYXkoZS5hbGlhc2VzKSAmJiBlLmFsaWFzZXMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgbywgYSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLmlzUGxhaW5PYmplY3QpKHQpICYmIChhID0gdC5jb2RlLCBuID0gdC5ndmxpZCwgbyA9IHQuc2tpcFBic0FsaWFzaW5nKSwgaS5kZWZhdWx0LmFsaWFzUmVnaXN0cnlbYV0gPSBlLmNvZGUsIHIoTyh7fSwgZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFBic0FsaWFzaW5nOiBvCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHQubmV3QmlkZGVyID0gSSwgdC5wcmVsb2FkQmlkZGVyTWFwcGluZ0ZpbGUgPSBBLCB0LmdldElhYlN1YkNhdGVnb3J5ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkuZGVmYXVsdC5nZXRCaWRBZGFwdGVyKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChyLmdldFNwZWMoKS5nZXRNYXBwaW5nRmlsZUluZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLmdldFNwZWMoKS5nZXRNYXBwaW5nRmlsZUluZm8oKSwgbyA9IG4ubG9jYWxTdG9yYWdlS2V5ID8gbi5sb2NhbFN0b3JhZ2VLZXkgOiByLmdldEJpZGRlckNvZGUoKSwgYSA9IF8uZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2Uobyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBKU09OLnBhcnNlKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLmxvZ0Vycm9yKSgnRmFpbGVkIHRvIHBhcnNlICcuY29uY2F0KGUsICcgbWFwcGluZyBkYXRhIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubWFwcGluZ1t0XSA/IGEubWFwcGluZ1t0XSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB0LmlzVmFsaWQgPSBULCB0LnJlZ2lzdGVyU3luY0lubmVyID0gdC5zdG9yYWdlID0gdm9pZCAwLCByKDYpLCByKDEzKSwgcig5KSwgcigxMSksIHIoNCksIHIoMiksIHIoMjYpLCByKDEpLCByKDMpLCByKDApLCByKDUpLCByKDE2KSwgcigyMTkpOwogICAgICAgICAgICAgICAgdmFyIG4gPSBiKHIoMjEzKSksIGkgPSBiKHIoODcpKSwgbyA9IHIoMjIpLCBhID0gcigxNTQpLCBzID0gcigxMjYpLCB1ID0gcig4OCksIGMgPSByKDE1NiksIGQgPSBiKHIoMzYpKSwgbCA9IGIocig2MCkpLCBmID0gYihyKDMxKSksIHAgPSByKDEwMyksIGcgPSByKDcpLCBtID0gcig0NSksIHYgPSByKDYxKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShuID0gKGEgPSBzLm5leHQoKSkuZG9uZSkgJiYgKHIucHVzaChhLnZhbHVlKSwgIXQgfHwgci5sZW5ndGggIT09IHQpOyBuID0gITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBudWxsID09IHMucmV0dXJuIHx8IHMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHIgfHwgJ1NldCcgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoTyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfID0gKDAsIHIoNzUpLmdldENvcmVTdG9yYWdlTWFuYWdlcikoJ2JpZGRlckZhY3RvcnknKTsKICAgICAgICAgICAgICAgIHQuc3RvcmFnZSA9IF87CiAgICAgICAgICAgICAgICB2YXIgRSA9IFsKICAgICAgICAgICAgICAgICAgICAncmVxdWVzdElkJywKICAgICAgICAgICAgICAgICAgICAnY3BtJywKICAgICAgICAgICAgICAgICAgICAndHRsJywKICAgICAgICAgICAgICAgICAgICAnY3JlYXRpdmVJZCcsCiAgICAgICAgICAgICAgICAgICAgJ25ldFJldmVudWUnLAogICAgICAgICAgICAgICAgICAgICdjdXJyZW5jeScKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTyhuZXcgbi5kZWZhdWx0KGUuY29kZSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3BlYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyU3luY3M6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxCaWRzOiBmdW5jdGlvbiAobiwgaSwgbywgcywgdSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobi5iaWRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0ge30sIHAgPSBbXSwgbSA9IG4uYmlkcy5maWx0ZXIocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IG0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdltlLmJpZElkXSA9IGUsIGUuYWRVbml0Q29kZSB8fCAoZS5hZFVuaXRDb2RlID0gZS5wbGFjZW1lbnRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZS5idWlsZFJlcXVlc3RzKG0sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiAwICE9PSBiLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShiKSB8fCAoYiA9IFtiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9ICgwLCBnLmRlbGF5RXhlY3V0aW9uKShjKGgpLCBiLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnR0VUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcygnJy5jb25jYXQodC51cmwpLmNvbmNhdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJz8nLmNvbmNhdCgnb2JqZWN0JyA9PT0gUyhlKSA/ICgwLCBnLnBhcnNlUXVlcnlTdHJpbmdQYXJhbWV0ZXJzKShlKSA6IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuZGF0YSkpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBjKHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdm9pZCAwLCBPKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQub3B0aW9ucykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQT1NUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0LnVybCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogYyhyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdzdHJpbmcnID09IHR5cGVvZiB0LmRhdGEgPyB0LmRhdGEgOiBKU09OLnN0cmluZ2lmeSh0LmRhdGEpLCBPKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5vcHRpb25zKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLmxvZ1dhcm4pKCdTa2lwcGluZyBpbnZhbGlkIHJlcXVlc3QgZnJvbSAnLmNvbmNhdChlLmNvZGUsICcuIFJlcXVlc3QgdHlwZSAnKS5jb25jYXQodC50eXBlLCAnIG11c3QgYmUgR0VUIG9yIFBPU1QnKSksIHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihyLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZS5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBKU09OLnBhcnNlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyBnZXQ6IG8uZ2V0UmVzcG9uc2VIZWFkZXIuYmluZChvKSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAucHVzaChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBlLmludGVycHJldFJlc3BvbnNlKHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGcubG9nRXJyb3IpKCdCaWRkZXIgJy5jb25jYXQoZS5jb2RlLCAnIGZhaWxlZCB0byBpbnRlcnByZXQgdGhlIHNlcnZlclwncyByZXNwb25zZS4gQ29udGludWluZyB3aXRob3V0IGJpZHMnKSwgbnVsbCwgdCksIHZvaWQgeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGModCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2W3QucmVxdWVzdElkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5vcmlnaW5hbENwbSA9IHQuY3BtLCB0Lm9yaWdpbmFsQ3VycmVuY3kgPSB0LmN1cnJlbmN5LCB0Lm1ldGEgPSB0Lm1ldGEgfHwgTyh7fSwgdFtyLmJpZGRlcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gTygoMCwgYS5jcmVhdGVCaWQpKGQuZGVmYXVsdC5TVEFUVVMuR09PRCwgciksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW2VdID0gITAsIFQoZSwgdCwgW25dKSAmJiBpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oci5hZFVuaXRDb2RlLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGcubG9nV2FybikoJ0JpZGRlciAnLmNvbmNhdChlLmNvZGUsICcgbWFkZSBiaWQgZm9yIHVua25vd24gcmVxdWVzdCBJRDogJykuY29uY2F0KHQucmVxdWVzdElkLCAnLiBJZ25vcmluZy4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiAoKDAsIGcuaXNBcnJheSkocykgPyBzLmZvckVhY2goYykgOiBjKHMpKSwgeShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZS5jb2RlKSwgKDAsIGcubG9nRXJyb3IpKCdTZXJ2ZXIgY2FsbCBmb3IgJy5jb25jYXQoZS5jb2RlLCAnIGZhaWxlZDogJykuY29uY2F0KHQsICcuIENvbnRpbnVpbmcgd2l0aG91dCBiaWRzLicpKSwgeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbygpLCBsLmRlZmF1bHQuZW1pdChkLmRlZmF1bHQuRVZFTlRTLkJJRERFUl9ET05FLCBuKSwgdChwLCBuLmdkcHJDb25zZW50LCBuLnVzcENvbnNlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHcoZSwgdCwgciwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlLmlzQmlkUmVxdWVzdFZhbGlkKHQpIHx8ICgoMCwgZy5sb2dXYXJuKSgnSW52YWxpZCBiaWQgc2VudCB0byBiaWRkZXIgJy5jb25jYXQoZS5jb2RlLCAnOiAnKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCkpKSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB3ID0gKDAsIHYuaG9vaykoJ2FzeW5jJywgZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG8uY29uZmlnLmdldENvbmZpZygndXNlclN5bmMuYWxpYXNTeW5jRW5hYmxlZCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChlLmdldFVzZXJTeW5jcyAmJiAoYSB8fCAhaS5kZWZhdWx0LmFsaWFzUmVnaXN0cnlbZS5jb2RlXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBvLmNvbmZpZy5nZXRDb25maWcoJ3VzZXJTeW5jLmZpbHRlclNldHRpbmdzJyksIGMgPSBlLmdldFVzZXJTeW5jcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lRW5hYmxlZDogISghdSB8fCAhdS5pZnJhbWUgJiYgIXUuYWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEVuYWJsZWQ6ICEoIXUgfHwgIXUuaW1hZ2UgJiYgIXUuYWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCwgciwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKEFycmF5LmlzQXJyYXkoYykgfHwgKGMgPSBbY10pLCBjLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXNlclN5bmMucmVnaXN0ZXJTeW5jKHQudHlwZSwgZS5jb2RlLCB0LnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAncmVnaXN0ZXJTeW5jcycpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvLmNvbmZpZy5nZXRDb25maWcoJ2FkcG9kLmJyYW5kQ2F0ZWdvcnlFeGNsdXNpb24nKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGcuZGVlcEFjY2VzcykoZSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpID09PSBtLkFEUE9EOwogICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRzLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZy5mbGF0dGVuLCBbXSkuZmlsdGVyKGcudW5pcXVlcykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkuZGVmYXVsdC5nZXRCaWRBZGFwdGVyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5nZXRTcGVjKCkuZ2V0TWFwcGluZ0ZpbGVJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuZ2V0U3BlYygpLmdldE1hcHBpbmdGaWxlSW5mbygpLCBuID0gci5yZWZyZXNoSW5EYXlzID8gci5yZWZyZXNoSW5EYXlzIDogMSwgbyA9IHIubG9jYWxTdG9yYWdlS2V5ID8gci5sb2NhbFN0b3JhZ2VLZXkgOiB0LmdldFNwZWMoKS5jb2RlLCBhID0gXy5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoYSA9IGEgPyBKU09OLnBhcnNlKGEpIDogdm9pZCAwKSB8fCAoMCwgZy50aW1lc3RhbXApKCkgPiBhLmxhc3RVcGRhdGVkICsgMjQgKiBuICogNjAgKiA2MCAqIDEwMDApICYmICgwLCBwLmFqYXgpKHIudXJsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBKU09OLnBhcnNlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogKDAsIGcudGltZXN0YW1wKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiB0Lm1hcHBpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uc2V0RGF0YUluTG9jYWxTdG9yYWdlKG8sIEpTT04uc3RyaW5naWZ5KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZy5sb2dFcnJvcikoJ0ZhaWxlZCB0byBwYXJzZSAnLmNvbmNhdChlLCAnIGJpZGRlciB0cmFuc2xhdGlvbiBtYXBwaW5nIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZy5sb2dFcnJvcikoJ0ZhaWxlZCB0byBsb2FkICcuY29uY2F0KGUsICcgYmlkZGVyIHRyYW5zbGF0aW9uIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZy5sb2dFcnJvcikoJ0ZhaWxlZCB0byBwYXJzZSAnLmNvbmNhdChlLCAnIGJpZGRlciB0cmFuc2xhdGlvbiBtYXBwaW5nIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBiaWQgZnJvbSAnLmNvbmNhdCh0LmJpZGRlckNvZGUsICcuIElnbm9yaW5nIGJpZDogJykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IHQgPyAoaSA9IE9iamVjdC5rZXlzKHQpLCBFLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZi5kZWZhdWx0KShpLCBlKSAmJiAhKDAsIGYuZGVmYXVsdCkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0W2VdKTsKICAgICAgICAgICAgICAgICAgICB9KSA/ICduYXRpdmUnICE9PSB0Lm1lZGlhVHlwZSB8fCAoMCwgdS5uYXRpdmVCaWRJc1ZhbGlkKSh0LCByKSA/ICd2aWRlbycgIT09IHQubWVkaWFUeXBlIHx8ICgwLCBjLmlzVmFsaWRWaWRlb0JpZCkodCwgcikgPyAhKCdiYW5uZXInID09PSB0Lm1lZGlhVHlwZSAmJiAhZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0LndpZHRoIHx8IDAgPT09IHBhcnNlSW50KHQud2lkdGgsIDEwKSkgJiYgKHQuaGVpZ2h0IHx8IDAgPT09IHBhcnNlSW50KHQuaGVpZ2h0LCAxMCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC53aWR0aCA9IHBhcnNlSW50KHQud2lkdGgsIDEwKSwgdC5oZWlnaHQgPSBwYXJzZUludCh0LmhlaWdodCwgMTApLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICgwLCBnLmdldEJpZGRlclJlcXVlc3QpKHIsIHQuYmlkZGVyQ29kZSwgZSksIGkgPSBuICYmIG4uYmlkcyAmJiBuLmJpZHNbMF0gJiYgbi5iaWRzWzBdLnNpemVzLCBvID0gKDAsIGcucGFyc2VTaXplc0lucHV0KShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IG8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHkob1swXS5zcGxpdCgneCcpLCAyKSwgcyA9IGFbMF0sIHUgPSBhWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQud2lkdGggPSBwYXJzZUludChzLCAxMCksIHQuaGVpZ2h0ID0gcGFyc2VJbnQodSwgMTApLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0LCByKSkgfHwgKCgwLCBnLmxvZ0Vycm9yKShuKCdCYW5uZXIgYmlkcyByZXF1aXJlIGEgd2lkdGggYW5kIGhlaWdodCcpKSwgITEpIDogKCgwLCBnLmxvZ0Vycm9yKShuKCdWaWRlbyBiaWQgZG9lcyBub3QgaGF2ZSByZXF1aXJlZCB2YXN0VXJsIG9yIHJlbmRlcmVyIHByb3BlcnR5JykpLCAhMSkgOiAoKDAsIGcubG9nRXJyb3IpKG4oJ05hdGl2ZSBiaWQgbWlzc2luZyBzb21lIHJlcXVpcmVkIHByb3BlcnRpZXMuJykpLCAhMSkgOiAoKDAsIGcubG9nRXJyb3IpKG4oJ0JpZGRlciAnLmNvbmNhdCh0LmJpZGRlckNvZGUsICcgaXMgbWlzc2luZyByZXF1aXJlZCBwYXJhbXMuIENoZWNrIGh0dHA6Ly9wcmViaWQub3JnL2Rldi1kb2NzL2JpZGRlci1hZGFwdGVyLTEuaHRtbCBmb3IgbGlzdCBvZiBwYXJhbXMuJykpKSwgITEpKSA6ICgoMCwgZy5sb2dXYXJuKSgnU29tZSBhZGFwdGVyIHRyaWVkIHRvIGFkZCBhbiB1bmRlZmluZWQgYmlkIGZvciAnLmNvbmNhdChlLCAnLicpKSwgITEpIDogKCgwLCBnLmxvZ1dhcm4pKCdObyBhZFVuaXRDb2RlIHdhcyBzdXBwbGllZCB0byBhZGRCaWRSZXNwb25zZS4nKSwgITEpOwogICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5yZWdpc3RlclN5bmNJbm5lciA9IHcsICgwLCB2LmdldEhvb2spKCdjaGVja0FkVW5pdFNldHVwJykuYmVmb3JlKEEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuY2FsbChlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gbihPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogbihPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoaSh7fSwgdCksIHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0Lm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogdC5zdGFjawogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9LCByKDE3KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1KSwgcig5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdldFF1ZXVlID0gWSwgdC5zZXRRdWV1ZSA9IEssIHQuYXVjdGlvbkFsbCA9IGllLCB0LmlzTW9iaWxlID0gb2UsIHQuaW5zdGFudGlhdGVCaWRCYXJyZWwgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfSwgdC5ib290c3RyYXAgPSB0LmhlYWRlckJpZGRlclJlcXVlc3QgPSB0LmdldEFkcyA9IHQucHJvY2Vzc0FkUmVxdWVzdCA9IHQuYXVjdGlvbiA9IHQuYWRTZXJ2ZXJSZXF1ZXN0ID0gdC5sYXp5TG9hZCA9IHQuY2h1bmtBdWN0aW9uID0gdC5pbml0aWFsaXplID0gdm9pZCAwLCByKDMpLCByKDUpLCByKDE5NCksIHIoOTUpLCByKDkpLCByKDExKSwgcigwKSwgcig2KSwgcigxMyksIHIoMSksIHIoNCksIHIoMik7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzkpLCBpID0gcigxNDYpLCBvID0gcigyMCksIGEgPSByKDgpLCBzID0gcig5OSksIHUgPSByKDc0KSwgYyA9IGoocigzNCkpLCBkID0gaihyKDI5KSksIGwgPSBqKHIoMTg1KSksIGYgPSByKDE1KSwgcCA9IHIoNDQpLCBnID0gcig1OSksIG0gPSByKDEyKSwgdiA9IHIoMjEpLCBiID0gcigzNSksIHkgPSByKDEyMiksIGggPSBqKHIoMTQ5KSk7CiAgICAgICAgICAgICAgICByKDIxMSk7CiAgICAgICAgICAgICAgICB2YXIgUyA9IHIoNDIpLCBPID0gaihyKDUxKSksIF8gPSBqKHIoMTQ4KSksIEUgPSBqKHIoMTApKSwgSSA9IHIoNzMpLCB3ID0gaihyKDE1MSkpLCBBID0gcig5OCksIFQgPSByKDEwMCksIHggPSByKDMxNSksIEMgPSByKDIxMiksIFAgPSByKDIxMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG4sIGkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpID0ge30sIG8gPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBvLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG9bbl0sIHQuaW5kZXhPZihyKSA+PSAwIHx8IChpW3JdID0gZVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCB0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBvLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gb1tuXSwgdC5pbmRleE9mKHIpID49IDAgfHwgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIHIpICYmIChpW3JdID0gZVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUsIHQsIHIsIG4sIGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGVbb10oYSksIHUgPSBzLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcy5kb25lID8gdCh1KSA6IFByb21pc2UucmVzb2x2ZSh1KS50aGVuKG4sIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCByID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5hcHBseSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQobywgbiwgaSwgYSwgcywgJ25leHQnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQobywgbiwgaSwgYSwgcywgJ3Rocm93JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEIsIEwgPSBFLmRlZmF1bHQuRVZFTlRTLCB6ID0gTC5MT0FELCBWID0gTC5JTlNUQU5USUFURUQsIEYgPSBMLklOSVRJQUxJWkUsIHEgPSBMLkJJRFNfUkVRVUVTVEVELCBHID0gTC5CSURTX1JFVFVSTkVELCBXID0gTC5SRUZSRVNILCBIID0gTC5BVUNUSU9OOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEsoZSkgewogICAgICAgICAgICAgICAgICAgIEIgPSBCID8gKDAsIHMucHJvbWlzZVF1ZXVlKSgnQmlkQmFycmVsIFByaW1hcnkgUXVldWUnLCBbXS5jb25jYXQoTShCLnJlbWFpbmluZ0l0ZW1zKSwgTShlKSkpIDogKDAsIHMucHJvbWlzZVF1ZXVlKSgnQmlkQmFycmVsIFByaW1hcnkgUXVldWUnLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBKID0gKDAsIG4uaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnF1ZXJ5VGFyZ2V0aW5nICYmIChlLnRhcmdldGluZyA9ICgwLCBkLmRlZmF1bHQpKHt9LCBlLnRhcmdldGluZywgeyBxdWVyeTogZS5xdWVyeVRhcmdldGluZyB9KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgIHQuX2luaXRPdmVycmlkZXMgPSAoMCwgYi5jbG9uZURlZXApKGUpLCBlLmRmcFBhdGggJiYgJ3N0cmluZycgPT0gdHlwZW9mIGUuZGZwUGF0aCAmJiAodC5kZnBQYXRoID0gZS5kZnBQYXRoKSwgKDAsIGYuc2V0Q29uZmlnUHVibGljKSh0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBmLmdldENvbmZpZykoKTsKICAgICAgICAgICAgICAgICAgICBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ01lc3NhZ2UoJ0luaXRpYWxpemluZyBCaWRCYXJyZWwuIENvbmZpZzonLCByKSwgbmUoci5wYWdlVGFyZ2V0aW5nIHx8IHIuc2l0ZVRhcmdldGluZyksIG8uZXZlbnRFbWl0dGVyLmVtaXQoRiksIGEuYmJMb2dnZXIuYXRWZXJib3NpdHkoNCkubG9nSW5mbygnQmlkQmFycmVsIEluaXRpYWxpemVkJyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHQuaW5pdGlhbGl6ZSA9IEo7CiAgICAgICAgICAgICAgICB2YXIgUSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgZi5nZXRDb25maWcpKCdsYXp5TG9hZGluZy5hdWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmNodW5rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBQLmNodW5rKSgoMCwgQy5lbGVtZW50U29ydCkoZSwgKDAsIGYuZ2V0Q29uZmlnKSgncHJpb3JpdHlBeGlzJykpLCB0LmNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmJiTG9nZ2VyLmxvZ0luZm8oJ1NwbGl0dGluZyBhdWN0aW9uIGNhbGwgaW50byBtdWx0aXBsZSBjYWxscy4gQ2h1bmtzOicsIHIsICdDb25maWc6JywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSB7fSwgaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubGF6eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpWzBdLmVsZW1lbnQsIGEgPSBpWzBdLmNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2FdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSAxOyBvIDwgci5sZW5ndGg7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sYXp5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE1hcmdpbjogdC5vZmZzZXQueUF4aXMgKyAncHggJyArIHQub2Zmc2V0LnhBeGlzICsgJ3B4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogMC4wMSAqIHQucGVyY2VudGFnZVZpc2libGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmludGVyc2VjdGlvblJhdGlvID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnVub2JzZXJ2ZShyLnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gci50YXJnZXQuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlKG5baV0udW5pdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyksIGMgPSAxOyBjIDwgci5sZW5ndGg7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gcltjXVswXS5lbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUub2JzZXJ2ZShkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gclswXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LmNodW5rQXVjdGlvbiA9IFE7CiAgICAgICAgICAgICAgICB2YXIgWCA9ICgwLCBuLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgZi5nZXRDb25maWcpKCdsYXp5TG9hZGluZy51bml0cycpIHx8ICgwLCBmLmdldENvbmZpZykoJ2xhenlMb2FkaW5nJyksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TWFyZ2luOiB0Lm9mZnNldC55QXhpcyArICdweCAnICsgdC5vZmZzZXQueEF4aXMgKyAncHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwLjAxICogdC5wZXJjZW50YWdlVmlzaWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmJMb2dnZXIubG9nSW5mbygnU2V0dGluZyB1cCBsYXp5IGxvYWRpbmcgZm9yIHVuaXRzJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBtLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW50ZXJzZWN0aW9uUmF0aW8gPiAwICYmIChpLnVub2JzZXJ2ZShlLnRhcmdldCksICgwLCBnLnNldEJpZFRhcmdldGluZykoW3AudW5pdFJlZ2lzdHJ5W2UudGFyZ2V0LmlkXV0pLCBvLmV2ZW50RW1pdHRlci5lbWl0KCcnLmNvbmNhdChlLnRhcmdldC5pZCwgJy4nKS5jb25jYXQoVyksIHAudW5pdFJlZ2lzdHJ5W2UudGFyZ2V0LmlkXSksIGEuYmJMb2dnZXIubG9nSW5mbygnUmVmcmVzaGluZyBsYXp5IGxvYWRlZCB1bml0JywgcC51bml0UmVnaXN0cnlbZS50YXJnZXQuaWRdKSwgZGVsZXRlIHAudW5pdFJlZ2lzdHJ5W2UudGFyZ2V0LmlkXS5jYW5jZWxMYXp5TG9hZCwgdGUoW2UudGFyZ2V0LmlkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGkub2JzZXJ2ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC51bml0UmVnaXN0cnlbci5jb2RlXS5jYW5jZWxMYXp5TG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS51bm9ic2VydmUoKDAsIG0uZG9tKSgpLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLmNvZGUpKSwgcC51bml0UmVnaXN0cnlbci5jb2RlXS5jYW5jZWxMYXp5TG9hZCAmJiBkZWxldGUgcC51bml0UmVnaXN0cnlbci5jb2RlXS5jYW5jZWxMYXp5TG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IDA7IHUgPCBlLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmJiTG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGxhenkgbG9hZCcsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRXJyb3IoJ0Vycm9yIGVuY291bnRlcmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gbGF6eSBsb2FkLiAnLmNvbmNhdChKU09OLnN0cmluZ2lmeShpLCBPLmRlZmF1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmVycm9yUmVwb3J0aW5nLnJlcG9ydCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmV2ZW50RW1pdHRlci5lbWl0KCcnLmNvbmNhdChuLmNvZGUsICcuJykuY29uY2F0KFcpLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLnNldEJpZFRhcmdldGluZykoZSksIHRlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmxhenlMb2FkID0gWDsKICAgICAgICAgICAgICAgIHZhciAkID0gKDAsIG4uaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgZS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkgfHwgMCA9PT0gZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYmJMb2dnZXIuYXRWZXJib3NpdHkoMikubG9nV2FybignQWQgc2VydmVyIHJlcXVlc3QgYXR0ZW1wdGVkIHdpdGggaW52YWxpZCB1bml0cyBjb2xsZWN0aW9uJywgZSksIHZvaWQgdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGVbMF0gfHwgZVswXS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5iYkxvZ2dlci5sb2dFcnJvcignVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgaW50ZXJuYWwgQmlkQmFycmVsIHVzZSBvbmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IEVycm9yKCdUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciBpbnRlcm5hbCBCaWRCYXJyZWwgdXNlIG9ubHkuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmVycm9yUmVwb3J0aW5nLnJlcG9ydChyKSwgdm9pZCB0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSwgcyA9IG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUuaXNMYXp5TG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1ID0gbi5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlzTGF6eUxvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAoMCwgZy5zZXRCaWRUYXJnZXRpbmcpKHMpLCBvLmV2ZW50RW1pdHRlci5lbWl0KFcsIHMpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHNbY107CiAgICAgICAgICAgICAgICAgICAgICAgIG8uZXZlbnRFbWl0dGVyLmVtaXQoJycuY29uY2F0KGQuY29kZSwgJy4nKS5jb25jYXQoVyksIGQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ0luZm8oJ1JlZnJlc2hpbmcgdW5pdHMnLCBzKSwgdGUocyksIFgodSksIGkucmVxdWVzdE1hbmFnZXIucmVzZXQoKSwgdCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmFkU2VydmVyUmVxdWVzdCA9ICQ7CiAgICAgICAgICAgICAgICB2YXIgWiA9ICgwLCBuLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkgJiYgKGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSksIHZvaWQgMCA9PT0gZSB8fCAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUuY29uc3RydWN0b3IpIHx8IGUuY29uc3RydWN0b3IgPT09IEFycmF5ICYmIDAgPT09IGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYmJMb2dnZXIubG9nRXJyb3IoJ0ludmFsaWQgdW5pdHMgYXJyYXkgcGFzc2VkIHRvIEJpZEJhcnJlbC5hdWN0aW9uJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEVycm9yKCdJbnZhbGlkIHVuaXRzIGFycmF5IHBhc3NlZCB0byBCaWRCYXJyZWwuYXVjdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgUy5lcnJvclJlcG9ydGluZy5yZXBvcnQodCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgxKS5sb2dJbmZvKCdJbnZva2luZyBCaWRCYXJyZWwuYXVjdGlvbicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBwLmdldFVuaXRDb2xsZWN0aW9uKShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IHIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZi5nZXRDb25maWcpKCdsYXp5TG9hZGluZy5hdWN0aW9uLmVuYWJsZWQnKSAmJiAociA9IFEocikpLCBlZShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmJMb2dnZXIubG9nRXJyb3IoJ05vIHZhbGlkIHVuaXQgZGVzaWduYXRpb25zIHByb3ZpZGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBFcnJvcignTm8gdmFsaWQgdW5pdCBkZXNpZ25hdGlvbnMgcHJvdmlkZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmVycm9yUmVwb3J0aW5nLnJlcG9ydChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdC5hdWN0aW9uID0gWjsKICAgICAgICAgICAgICAgIHZhciBlZSA9ICgwLCBuLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICExLCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCB8fCBuLmJpZHMgJiYgbi5iaWRzLmxlbmd0aCA+IDAsIG4uY2FuY2VsTGF6eUxvYWQgJiYgKGEuYmJMb2dnZXIubG9nSW5mbygnQ2FuY2VsbGluZyBMYXp5IExvYWQgZm9yIHVuaXQnLCBuKSwgbi5jYW5jZWxMYXp5TG9hZCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWSgpLnB1c2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYmJMb2dnZXIuYXRWZXJib3NpdHkoMSkubG9nSW5mbygnUnVubmluZyBhdWN0aW9uIGluIHF1ZXVlLiBDb2xsZWN0aW9uOicsIGUpLCBvLmV2ZW50RW1pdHRlci5lbWl0KEgsIGUpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICExLCBzID0gKDAsIGYuZ2V0Q29uZmlnKSgpLCB1ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMCwgYS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgxKS5sb2dJbmZvKCdIaXQgZmFpbHNhZmUgY29uZGl0aW9uJyksICQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy50aW1lb3V0cy5mYWlsc2FmZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlcXVlc3RNYW5hZ2VyLmVucXVldWUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgKGNsZWFyVGltZW91dCh1KSwgby5ldmVudEVtaXR0ZXIuZW1pdChHLCBlKSwgJChlLCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5iYkxvZ2dlci5sb2dJbmZvKCdNYWtpbmcgaGVhZGVyIGJpZGRlciByZXF1ZXN0JywgZSksIHJlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmJMb2dnZXIubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgRXJyb3IoJ0ZhaWxlZCBoZWFkZXIgYmlkZGVyIHJlcXVlc3QuICcuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUsIE8uZGVmYXVsdCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmVycm9yUmVwb3J0aW5nLnJlcG9ydChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZXZlbnRFbWl0dGVyLmVtaXQocSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ1Nob3J0LWNpcmN1aXRpbmcgaGVhZGVyIGJpZGRpbmcgZHVlIHRvIG5vIGJpZGRlcnMgc2NlbmFyaW8nKSwgJChlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnByb2Nlc3NBZFJlcXVlc3QgPSBlZTsKICAgICAgICAgICAgICAgIHZhciB0ZSA9ICgwLCBuLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHQuZ2V0QWRzID0gdGU7CiAgICAgICAgICAgICAgICB2YXIgcmUgPSAoMCwgbi5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmhlYWRlckJpZGRlclJlcXVlc3QgPSByZTsKICAgICAgICAgICAgICAgIHZhciBuZSA9ICgwLCBuLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgZi5nZXRDb25maWcpKCdib290c3RyYXAucmVuZGVyU2NyaXB0cycpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHUucmVuZGVyU2NyaXB0KShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAoMCwgZy5zZXRJbml0aWFsUGFnZVRhcmdldGluZykoZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGllKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gW10sIHQgPSAoMCwgcC5nZXRVbml0cykoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCByKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtyXS5kaXNwbGF5ZWQgJiYgZS5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFooZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvZSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICgwLCBmLmdldENvbmZpZykoJ2RmcFBhdGhPYmonKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ21vYmlsZScgPT09IGUuZGV2aWNlIHx8ICdtJyA9PT0gZS5kZXZpY2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhZSgpIHsKICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PT0gTihfLmRlZmF1bHQuZGVidWcpID8gKCgwLCBhLnNldERlZmF1bHRDb25maWcpKF8uZGVmYXVsdC5kZWJ1ZyksIGEuYmJMb2dnZXIuc2V0TG9nZ2VyQ29uZmlnKF8uZGVmYXVsdC5kZWJ1ZykpIDogXy5kZWZhdWx0LmRlYnVnICYmICgwLCBhLnR1cm5PbkRlYnVnKSgpLCBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ0luZm8oJ0JpZEJhcnJlbCBydjIuMjMuMiAoIGNvcmUgKSBMb2FkZWQnKSwgby5ldmVudEVtaXR0ZXIuZW1pdCh6LCBCaWRCYXJyZWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgdi5leHBvc3VyZUFwaS5yb290U2NvcGUoewogICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uOiBaLAogICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uQWxsOiBpZSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZTogSiwKICAgICAgICAgICAgICAgICAgICAgICAgaXNTdGFnaW5nRW52OiBBLmlzU3RhZ2luZ0VudiwKICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG9lLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dTdGFjazogYS5nZXRMb2dTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaDogWiwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogWgogICAgICAgICAgICAgICAgICAgIH0pLCB2LmV4cG9zdXJlQXBpLmRlcHJlY2F0ZU1ldGhvZHMoWwogICAgICAgICAgICAgICAgICAgICAgICAnYWRTZXJ2ZXJSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlR29vZ2xldGFnU2VydmljZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAnaGVhZGVyQmlkZGVyUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdsYXp5TG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0UHJvY2Vzc1VuaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0SW5pdGlhbFBhZ2VUYXJnZXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0QmlkVGFyZ2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldEdwdFRhcmdldGluZycKICAgICAgICAgICAgICAgICAgICBdLCAndjMuMC4wJyksIHYuZXhwb3N1cmVBcGkucm9vdFNjb3BlR2V0dGVycyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAncnYyLjIzLjInOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyRiaWRiYXJyZWwudmFyaWFudCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFwaVJlYWR5OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclRpbWVvdXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZi5nZXRDb25maWcpKCdoaWdoRnJlcXVlbmN5QWRSZXF1ZXN0cycpID8gKDAsIGYuZ2V0Q29uZmlnKSgndGltZW91dHMuaGZhcicpIDogKDAsIGYuZ2V0Q29uZmlnKSgndGltZW91dHMuYmlkZGVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVlKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodWUgPSBrKHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIGUodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSwgcywgZywgRSwgQywgUCwgaiwgRCwgaywgTiA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgYy5kZWZhdWx0KSgoMCwgbS5kb20pKCkud2luZG93LCAnQmlkQmFycmVsLmNyZWF0ZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMzg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWUoKSwgKDAsIGEuZGVidWdPbikoJ3RydWUnKSAmJiAodC5fc3RhdGljID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsOiAoMCwgYi5jbG9uZURlZXApKF8uZGVmYXVsdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAoMCwgYi5jbG9uZURlZXApKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID0gJ21ldGFjcml0aWMtcnYnLCBpID0gKDAsIGQuZGVmYXVsdCkodCwgXy5kZWZhdWx0KSwgcyA9ICgwLCBoLmRlZmF1bHQpKHIsICdjb2RlJyksIGcgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5iYkxvZ2dlci5sb2dXYXJuKCdGYWlsZWQgdG8gQXBwbHkgUmVtb3RlIENvbmZpZyAoICcuY29uY2F0KG4sICcvJykuY29uY2F0KGUsICcgKScpLCB0IHx8IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wcmV2ID0gNywgZS5uZXh0ID0gMTAsIHkuYXBpLmdldCgnJy5jb25jYXQobiwgJy8nKS5jb25jYXQoKDAsIEEuZ2V0RW52VmFsKSgpLCAnL2NvbmZpZy9kaWZmJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDMwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogeyB2YXJpYW50OiAnY29yZScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gZS5zZW50LCBDID0gRS5wYXlsb2FkLCBFLnN1Y2Nlc3MgPyAoYS5iYkxvZ2dlci5sb2dJbmZvKCdBcHBseWluZyBSZW1vdGUgQ29uZmlnICggJy5jb25jYXQobiwgJy8nKS5jb25jYXQoKDAsIEEuZ2V0RW52VmFsKSgpLCAnICknKSwgQyksIFAgPSBDLnVuaXRzLCBqID0gUihDLCBbJ3VuaXRzJ10pLCBEID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpICYmIEFycmF5LmlzQXJyYXkodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9ICgwLCBsLmRlZmF1bHQpKGksIGosIEQpLCBzID0gKDAsIGwuZGVmYXVsdCkocywgUCwgRCksICgwLCBhLmRlYnVnT24pKCd0cnVlJykgJiYgKGkuX3JlbW90ZSA9IEMpKSA6IGcoKDAsIEEuZ2V0RW52VmFsKSgpLCBFKSwgZS5uZXh0ID0gMjE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldiA9IDE1LCBlLnQwID0gZS5jYXRjaCg3KSwgYS5iYkxvZ2dlci5sb2dFcnJvcihlLnQwKSwgayA9IG5ldyBFcnJvcignRmFpbGVkIHRvIGFwcGx5IHJlbW90ZSBjb25maWcuICcuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUudDAsIE8uZGVmYXVsdCkpKSwgUy5lcnJvclJlcG9ydGluZy5yZXBvcnQoayksIGcoJ3VuZGV0ZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZi5zZXRDb25maWcpKGkpLCBJLnN0b3JhZ2Uuc2V0dXAoKSwgdy5kZWZhdWx0LnNldHVwKCksIFMuZXJyb3JSZXBvcnRpbmcuc2V0dXAoKSwgeC5hZElkZW50aWZpZXIuc2V0dXBMaXN0ZW5lcnMoKSwgVC5iaWRDYWNoZS5zZXR1cExpc3RlbmVycygpLCBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ0luZm8oJ0luc3RhbnRpYXRpbmcgQmlkIEJhcnJlbCcsIE4sICgwLCBjLmRlZmF1bHQpKCgwLCBtLmRvbSkoKS53aW5kb3csICdCaWRCYXJyZWwucXVldWUnKSwgJ3dpdGggY29uZmlnJywgKDAsIGYuZ2V0Q29uZmlnKSgpKSwgSygoMCwgYy5kZWZhdWx0KSgoMCwgbS5kb20pKCkud2luZG93LCAnQmlkQmFycmVsLnF1ZXVlJykgfHwgW10pLCBzZSgpLCBzICYmICgwLCBwLnNldHVwVW5pdHMpKHMpLCAoMCwgZi5nZXRDb25maWcpKCdvbmNyZWF0ZS5yZW5kZXJTY3JpcHRzJykgJiYgKDAsIHUucmVuZGVyU2NyaXB0KSgoMCwgZi5nZXRDb25maWcpKCdvbmNyZWF0ZS5yZW5kZXJTY3JpcHRzJykpLCB2LmV4cG9zdXJlQXBpLmJpbmRUb1dpbmRvdygpLCBvLmV2ZW50RW1pdHRlci5lbWl0KFYsICgwLCBtLmRvbSkoKS53aW5kb3cuQmlkQmFycmVsKSwgWSgpLnJ1bigpLCBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDQpLmxvZ0luZm8oJ0JpZEJhcnJlbCBJbnN0YW50aWF0ZWQnKSwgZS5uZXh0ID0gMzk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmJMb2dnZXIuYXRWZXJib3NpdHkoMSkubG9nV2FybignQmlkQmFycmVsIGF0dGVtcHRlZCB0byBiZSBpbnN0YW50aWF0ZWQgdHdpY2UuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgQmlkQmFycmVsIGJlaW5nIGluY2x1ZGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBwYWdlLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgbnVsbCwgW1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICAgICAgICAgfSkpKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5ib290c3RyYXAgPSBuZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig2NSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGlmIChuKGUpLCB2b2lkIDAgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQsIHIsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQsIHIsIG4sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0LCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0KSwgaSA9IHIoMTY0KSghMSk7CiAgICAgICAgICAgICAgICBuKG4uUywgJ09iamVjdCcsIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQubWFrZVNhZmUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBuLmJiTG9nZ2VyLmxvZ0Vycm9yLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUpLCByKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgaS5kZWZhdWx0KShlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IChuID0gcigyNjUpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTI5KSwgaSA9IHIoNjgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihpKGUpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC51cmxRdWVyeUFzT2JqZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAoMCwgbi5kb20pKCkud2luZG93LmxvY2F0aW9uLmhyZWYsIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoaVtlXSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVtlXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdCA9IEpTT04uc3RyaW5naWZ5KGUpOwogICAgICAgICAgICAgICAgICAgIChlID0gZS5zdWJzdHJpbmcoZS5pbmRleE9mKCc/JykgKyAxKSkuaW5kZXhPZignIycpID49IDAgJiYgKGUgPSBlLnNwbGl0KCcjJylbMF0pOwogICAgICAgICAgICAgICAgICAgIHZhciByLCBvID0gLyhbXiY9XSspPT8oW14mXSopL2csIGEgPSAvXCsvZywgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGUucmVwbGFjZShhLCAnICcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAoOyByID0gby5leGVjKGUpOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHMoclsxXSksIGQgPSBzKHJbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAnW10nID09PSBjLnN1YnN0cmluZyhjLmxlbmd0aCAtIDIpID8gKGMgPSBjLnN1YnN0cmluZygwLCBjLmxlbmd0aCAtIDIpLCAodVtjXSB8fCAodVtjXSA9IFtdKSkucHVzaChkKSkgOiB1W2NdID0gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdC5sZW5ndGggLSAxLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19wcm90b18nICE9PSBvICYmICdfX3Byb3RvX18nICE9PSBvICYmIChvIGluIGUgfHwgKGVbb10gPSB7fSksIGUgPSBlW29dKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dID0gcjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGYgaW4gdSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGYuc3BsaXQoJ1snKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZm9yRWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5yZXBsYWNlKC9bP1tcXVxcIF0vZywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcucHVzaChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBsKHUsIGcsIHVbZl0pLCBkZWxldGUgdVtmXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAnJyAhPT0gdCAmJiAoaVt0XSA9IHUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgfSwgcigzMyksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEyKSwgaSA9IHt9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQucmVzZXRRdWVyeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfID0gKDAsIGEudXJsUXVlcnlBc09iamVjdCkoKTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0UGFnZVRhcmdldGluZyA9IGssIHQuZ2V0Vkd1aWQgPSBOLCB0LmFwcGx5VGFyZ2V0aW5nID0gUSwgdC5yZXNldFRhcmdldGluZyA9IFosIHQucmVzZXRBbGxUYXJnZXRpbmcgPSBlZSwgdC5jbGVhclRhcmdldGluZyA9IHRlLCB0LnNldFRhcmdldGluZyA9IHJlLCB0LmNsZWFyVW5pdFRhcmdldGluZyA9IHQuY2xlYXJQYWdlVGFyZ2V0aW5nID0gdC5zZXRQYWdlVGFyZ2V0aW5nID0gdC5zZXRVbml0VGFyZ2V0aW5nID0gdC5zZXRJbml0aWFsUGFnZVRhcmdldGluZyA9IHQuc2V0QmlkVGFyZ2V0aW5nID0gdC5wYWdlVGFyZ2V0aW5nID0gdm9pZCAwLCByKDQpLCByKDIpLCByKDMzKSwgcigxNik7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTUpLCBpID0gcig4KSwgbyA9IHIoMTIpLCBhID0gcig1OCksIHMgPSBoKHIoMjkpKSwgdSA9IHIoNDQpLCBjID0gcigzOSksIGQgPSByKDk2KSwgbCA9IGgocig1NikpLCBmID0gcigyMSksIHAgPSByKDczKSwgZyA9IGgocigzMTApKSwgbSA9IHIoMjApLCB2ID0gaChyKDEwKSksIGIgPSBoKHIoMjA5KSksIHkgPSByKDQyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE8gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfID0gKDAsIGEudXJsUXVlcnlBc09iamVjdCkoKSwgRSA9ICExLCBJID0gdi5kZWZhdWx0LlFVRVJZX1BBUkFNUywgdyA9IEkuQURfU0VTU0lPTiwgQSA9IEkuQURfU1VCU0VTU0lPTiwgVCA9IEkuU0VTU0lPTiwgeCA9IEkuU1VCU0VTU0lPTiwgQyA9IEkuRlRBRywgUCA9IEkuVFRBRywgaiA9IEkuVEFSR0VUSU5HX1BSRUZJWCwgUiA9IHYuZGVmYXVsdC5FVkVOVFMuQVVDVElPTjsKICAgICAgICAgICAgICAgIHZhciBEID0gKDAsIGQucmljaE9iamVjdCkoe30pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaygpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRC5nZXRWYWx1ZS5hcHBseShELCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaygndmd1aWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQucGFnZVRhcmdldGluZyA9IEQ7CiAgICAgICAgICAgICAgICB2YXIgTSA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYmJMb2dnZXIubG9nSW5mbygnU2V0dGluZyBCaWQgVGFyZ2V0aW5nJywgZSksIGU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHQuc2V0QmlkVGFyZ2V0aW5nID0gTTsKICAgICAgICAgICAgICAgIHZhciBVID0gITEsIEIgPSAhMDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoKSB7CiAgICAgICAgICAgICAgICAgICAgVSB8fCAoVSA9ICEwLCAoMCwgbi5nZXRDb25maWcpKCdzaXRlVGFyZ2V0aW5nJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQiB8fCByZShlKSwgQiA9ICExOwogICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgbi5nZXRDb25maWcpKCdwYWdlVGFyZ2V0aW5nJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQiB8fCByZShlKSwgQiA9ICExOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB6ID0gKDAsIGMuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICByZShYKFEoZSwgITEsIHQpKSksIEsoKSwgTCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnNldEluaXRpYWxQYWdlVGFyZ2V0aW5nID0gejsKICAgICAgICAgICAgICAgIHZhciBWID0gKDAsIGMuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdICYmIGFyZ3VtZW50c1szXTsKICAgICAgICAgICAgICAgICAgICB1LnVuaXRSZWdpc3RyeVtlXS50YXJnZXRpbmcgfHwgKHUudW5pdFJlZ2lzdHJ5W2VdLnRhcmdldGluZyA9IHt9KSwgdS51bml0UmVnaXN0cnlbZV0udGFyZ2V0aW5nW3RdID0gciwgbiAmJiAodS51bml0VGVtcGxhdGVzW2VdLnRhcmdldGluZyB8fCAodS51bml0VGVtcGxhdGVzW2VdLnRhcmdldGluZyA9IHt9KSwgdS51bml0VGVtcGxhdGVzW2VdLnRhcmdldGluZ1t0XSA9IHIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnNldFVuaXRUYXJnZXRpbmcgPSBWOwogICAgICAgICAgICAgICAgdmFyIEYgPSAoMCwgYy5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIEQuc2V0VmFsdWUoZSwgdCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHQuc2V0UGFnZVRhcmdldGluZyA9IEY7CiAgICAgICAgICAgICAgICB2YXIgcSA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBELmdldFZhbHVlKCksIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGUpICYmIGUubGVuZ3RoID4gMCAmJiAociA9ICgwLCBsLmRlZmF1bHQpKHQsIGUpKSwgRC5zZXRWYWx1ZSgnKicsIHIsIHsgZm9yY2VVcGRhdGU6ICEwIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmNsZWFyUGFnZVRhcmdldGluZyA9IHE7CiAgICAgICAgICAgICAgICB2YXIgRywgVywgSCA9ICgwLCBjLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiB1LnVuaXRSZWdpc3RyeTsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0KSAmJiB0Lmxlbmd0aCA+IDAgPyByW2VdLnRhcmdldGluZyA9ICgwLCBsLmRlZmF1bHQpKHUudW5pdFJlZ2lzdHJ5W2VdLnRhcmdldGluZywgdCkgOiByW2VdLnRhcmdldGluZyA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdKSB8fCBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgRSA9ICEwLCB0IHx8ICh0ID0gJCh7fSkpOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gKDAsIG4uZ2V0Q29uZmlnKSgpLCBhID0gby50YXJnZXRpbmcuY29va2llLmNvbnNvbGlkYXRlLCB1ID0gby50YXJnZXRpbmcuY29va2llLmtleU1hcCwgYyA9IHt9LCBkID0gcC5zdG9yYWdlLmdldENvb2tpZSh1LnN1cnJvdW5kIHx8ICdzdXJyb3VuZCcpLCBsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBsID0gZC5zcGxpdCgnfCcpLCBhICYmIHAuc3RvcmFnZS5kZWxldGVDb29raWUodS5zdXJyb3VuZCB8fCAnc3Vycm91bmQnKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3onCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLnNsaWNlKDAsIG8udGFyZ2V0aW5nLnNlYXRzLnNlc3Npb24pLCBnID0gZltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBmLmxlbmd0aCldLCBtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogby50YXJnZXRpbmcuc2VhdHMuc3Vic2Vzc2lvbikgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBsID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0KICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnN0b3JhZ2UuZ2V0Q29va2llKCdicm93c2VyU2Vzc2lvbicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvcmFnZS5nZXRDb29raWUoJ2RhaWx5U2Vzc2lvbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCB5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb246IGxbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VzOiBsWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBoID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaXJzdHBnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Vzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YnNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0dGFnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgUyA9IDA7IFMgPCBoLmxlbmd0aDsgUysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gaFtTXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVbT10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfID0gcC5zdG9yYWdlLmdldENvb2tpZSh1W09dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gJiYgKHlbT10gPSBfLCBhICYmIHAuc3RvcmFnZS5kZWxldGVDb29raWUodVtPXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMikubG9nSW5mbygnSGFuZGxpbmcgYXV0b3RhcmdldGluZy4nLCAnUXVlcnk6JywgdCwgJ1B1Ymxpc2hlciBQcm92aWRlZDonLCBlLCAnQ29va2llczonLCB5KTsKICAgICAgICAgICAgICAgICAgICB2YXIgSSA9IHZbMF0gPyB2WzBdIDoge30sIHcgPSB2WzFdID8gdlsxXSA6IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChhID8gYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0cGc6IHBhcnNlSW50KHQuZmlyc3RwZyB8fCBlLmZpcnN0cGcgfHwgdy5maXJzdHBnIHx8IHkuZmlyc3RwZyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGFnOiB0LnR0YWcgfHwgZS50dGFnIHx8IHcudHRhZyB8fCB5LnR0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFnOiB0LmZ0YWcgfHwgZS5mdGFnIHx8IHcuZnRhZyB8fCB5LmZ0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB0LnNlc3Npb24gfHwgZS5zZXNzaW9uIHx8IEkuc2Vzc2lvbiB8fCB5LnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXM6IHQuc3Vic2VzIHx8IGUuc3Vic2VzIHx8IEkuc3Vic2VzIHx8IHkuc3Vic2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHY6IHBhcnNlSW50KHQucHYgfHwgZS5wdiB8fCB3LnB2IHx8IHkucHYgfHwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgfSA6IChjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RwZzogcGFyc2VJbnQodC5maXJzdHBnIHx8IGUuZmlyc3RwZyB8fCB5LmZpcnN0cGcgfHwgdy5maXJzdHBnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2OiBwYXJzZUludCh0LnB2IHx8IGUucHYgfHwgeS5wdiB8fCB3LnB2IHx8IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogdC5zZXNzaW9uIHx8IGUuc2Vzc2lvbiB8fCB5LnNlc3Npb24gfHwgSS5zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VzOiB0LnN1YnNlcyB8fCBlLnN1YnNlcyB8fCB5LnN1YnNlcyB8fCBJLnN1YnNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0YWc6IHQudHRhZyB8fCBlLnR0YWcgfHwgeS50dGFnIHx8IHcudHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YWc6IHQuZnRhZyB8fCBlLmZ0YWcgfHwgeS5mdGFnIHx8IHcuZnRhZwogICAgICAgICAgICAgICAgICAgICAgICB9LCBwLnN0b3JhZ2UuZGVsZXRlQ29va2llKCdicm93c2VyU2Vzc2lvbicpLCBwLnN0b3JhZ2UuZGVsZXRlQ29va2llKCdkYWlseVNlc3Npb24nKSksIHZvaWQgMCA9PT0gYy5wdiB8fCBlLnB2IHx8IHQucHYgfHwgIXIgfHwgYy5wdisrLCAwICE9PSBjLmZpcnN0cGcgJiYgMSAhPT0gYy5maXJzdHBnICYmIHZvaWQgMCAhPT0gYy5wdiA/IGMuZmlyc3RwZyA9IDEgPT0gYy5wdiA/ICcxJyA6ICcwJyA6IDAgIT09IGMuZmlyc3RwZyAmJiAxICE9PSBjLmZpcnN0cGcgPyBjLmZpcnN0cGcgPSAxIDogMSA9PT0gYy5maXJzdHBnICYmIChjLmZpcnN0cGcgPSAwKSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgQSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiBjLnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VzOiBjLnN1YnNlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdHBnOiBjLmZpcnN0cGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZzogYy50dGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YWc6IGMuZnRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdjogYy5wdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGIuZGVmYXVsdCkodlswXSwgQSkgfHwgcC5zdG9yYWdlLnNldENvb2tpZSgnYnJvd3NlclNlc3Npb24nLCBBKSwgKDAsIGIuZGVmYXVsdCkodlsxXSwgVCkgfHwgcC5zdG9yYWdlLnNldENvb2tpZSgnZGFpbHlTZXNzaW9uJywgVCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1LnN1cnJvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zdWJzZXMKICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCd8Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgIT09IHggJiYgcC5zdG9yYWdlLnNldENvb2tpZSh1LnN1cnJvdW5kIHx8ICdzdXJyb3VuZCcsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc3Vic2VzCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjLnNlc3Npb24gIT09IHkuc2Vzc2lvbiAmJiBwLnN0b3JhZ2Uuc2V0Q29va2llKHUuc2Vzc2lvbiB8fCAnc2Vzc2lvbicsIGMuc2Vzc2lvbiksIGMuc3Vic2VzICE9PSB5LnN1YnNlcyAmJiBwLnN0b3JhZ2Uuc2V0Q29va2llKHUuc3Vic2VzIHx8ICdzdWJzZXMnLCBjLnN1YnNlcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhIHx8IChjLmZ0YWcgIT09IHkuZnRhZyAmJiBwLnN0b3JhZ2Uuc2V0Q29va2llKHUuZnRhZyB8fCAnZnRhZycsIGMuZnRhZyksIGMudHRhZyAhPT0geS50dGFnICYmIHAuc3RvcmFnZS5zZXRDb29raWUodS50dGFnIHx8ICd0dGFnJywgYy50dGFnKSwgYy5maXJzdHBnICE9PSB5LmZpcnN0cGcgJiYgcC5zdG9yYWdlLnNldENvb2tpZSh1LmZpcnN0cGcgfHwgJ2ZpcnN0cGcnLCBjLmZpcnN0cGcpKSwgKDAsIHMuZGVmYXVsdCkoe30sIGMsIHQsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSygpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgbi5nZXRDb25maWcpKCd0YXJnZXRpbmcuYXV0bycpICYmICFXICYmIChXID0gKDAsIGcuZGVmYXVsdCkoJ29iamVjdCcgPT09IE8oKDAsIG8uZG9tKSgpLndpbmRvdy51dGFnX2RhdGEpICYmICgwLCBvLmRvbSkoKS53aW5kb3cudXRhZ19kYXRhLnBhZ2VWaWV3R3VpZCA/ICd1dGFnX2RhdGEucGFnZVZpZXdHdWlkJyA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQuZ2V0VmFsdWUoJ3ZndWlkJyk7CiAgICAgICAgICAgICAgICAgICAgfSksIG0uZXZlbnRFbWl0dGVyLm9uKFIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFcuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICB9KSwgRyA9IFcub25DaGFuZ2UoSiwgeyBza2lwSW5pdGlhbFJ1bjogITAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBuLmdldENvbmZpZykoJ3RhcmdldGluZy5hdXRvJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBELmdldFZhbHVlKCdwdicpIHx8IDAsIHIgPSBwYXJzZUludCh0KSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYmJMb2dnZXIubG9nSW5mbygnSW5jcmVtZW50aW5nIFBWIHRhcmdldGluZyB2YWx1ZSB0bycsIHIsICdOZXcgUGFnZSBWaWV3IEd1aWQgZGV0ZWN0ZWQnLCBlKSwgRigncHYnLCByKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBrKCksIHQgPSBlLmZpcnN0cGcsIHIgPSBlLnR0YWcsIGkgPSBlLmZ0YWcsIG8gPSBlLnB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBuLmdldENvbmZpZykoJ3RhcmdldGluZy5jb29raWUuY29uc29saWRhdGUnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc3RvcmFnZS5zZXRDb29raWUoJ2RhaWx5U2Vzc2lvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RwZzogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRhZzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHY6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdHBnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YWc6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdjogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gKDAsIG4uZ2V0Q29uZmlnKSgndGFyZ2V0aW5nLmNvb2tpZS5rZXlNYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1IGluIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCB1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhW3VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t1XSAmJiBwLnN0b3JhZ2Uuc2V0Q29va2llKHNbdV0sIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV0sIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sIGkgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdKSB8fCBhcmd1bWVudHNbM10sIG8gPSAoMCwgbi5nZXRDb25maWcpKCksIGEgPSBlIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhID0gIW8udGFyZ2V0aW5nLmF1dG8gfHwgRSAmJiAhciA/ICQoYSwgdCkgOiBZKGEsIHQsIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLnZndWlkICYmICFOKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaS5iYkxvZ2dlci5sb2dFcnJvcignTm8gdmd1aWQgcHJvdmlkZWQhIFBsZWFzZSB1cGRhdGUgeW91ciBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGEgdmd1aWQgaW4gaW5pdENvbmZpZy5wYWdlVGFyZ2V0aW5nLnZndWlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEVycm9yKCdObyB2Z3VpZCBwcm92aWRlZCEgUGxlYXNlIHVwZGF0ZSB5b3VyIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYSB2Z3VpZCBpbiBpbml0Q29uZmlnLnBhZ2VUYXJnZXRpbmcudmd1aWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHkuZXJyb3JSZXBvcnRpbmcucmVwb3J0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICQoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdLCBpID0gciB8fCAoMCwgYS51cmxRdWVyeUFzT2JqZWN0KSgoMCwgby5kb20pKCkud2luZG93LmxvY2F0aW9uLmhyZWYpLCBzID0gKDAsIG4uZ2V0Q29uZmlnKSgndGFyZ2V0aW5nLnF1ZXJ5LmR5bmFtaWNQcmVmaXgnKSwgdSA9ICgwLCBuLmdldENvbmZpZykoJ3RhcmdldGluZy5xdWVyeS5rZXlNYXAnKSwgYyA9IChTKHQgPSB7fSwgdywgJ3Nlc3Npb24nKSwgUyh0LCBBLCAnc3Vic2VzJyksIFModCwgVCwgJ3Nlc3Npb24nKSwgUyh0LCB4LCAnc3Vic2VzJyksIFModCwgQywgJ2Z0YWcnKSwgUyh0LCBQLCAndHRhZycpLCB0KSwgZCA9IGU7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCBpbiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSwgbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gaVtsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgbC5pbmRleE9mKHMpID49IDAgJiYgKGRbbC5yZXBsYWNlKHMsICcnKV0gPSBmKSwgdVtsXSAmJiAoZFt1W2xdXSA9IGYpLCBsLmluZGV4T2YoaikgPj0gMCAmJiAoZFtsLnJlcGxhY2UoaiwgJycpXSA9IGYpLCBjW2xdICYmIChkW2NbbF1dID0gZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBaKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSAmJiBhcmd1bWVudHNbM107CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgJ29iamVjdCcgPT09IE8oZSkgJiYgZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaS5iYkxvZ2dlci5sb2dFcnJvcignVGhlIGZpcnN0IGFyZ3VtZW50IG9mIEJpZEJhcnJlbC5yZXNldFRhcmdldGluZyBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGZhbHN5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IEVycm9yKCdUaGUgZmlyc3QgYXJndW1lbnQgb2YgQmlkQmFycmVsLnJlc2V0VGFyZ2V0aW5nIHNob3VsZCBiZSBhbiBvYmplY3Qgb3IgZmFsc3kuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHkuZXJyb3JSZXBvcnRpbmcucmVwb3J0KG8pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodCAmJiB0LmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmxvZ0Vycm9yKCdUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIEJpZEJhcnJlbC5yZXNldFRhcmdldGluZyBzaG91bGQgYmUgYW4gYXJyYXkgb3IgZmFsc3kgdmFsdWUuIEV4aXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEVycm9yKCdUaGUgc2Vjb25kIGFyZ3VtZW50IG9mIEJpZEJhcnJlbC5yZXNldFRhcmdldGluZyBzaG91bGQgYmUgYW4gYXJyYXkgb3IgZmFsc3kgdmFsdWUuIEV4aXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHkuZXJyb3JSZXBvcnRpbmcucmVwb3J0KGEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2Jvb2xlYW4nID09IHR5cGVvZiByIHx8IG51bGwgPT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICB0ZShbXSwgdCwgbiksIHQgJiYgMCAhPT0gdC5sZW5ndGggPyByZShlLCB0LCBuKSA6IChFID0gITEsIHJlKFEoZSwgISFyICYmIF8sICExLCAhMSkpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmxvZ0Vycm9yKCdUaGUgdGhpcmQgYXJndW1lbnQgb2YgQmlkQmFycmVsLnJlc2V0VGFyZ2V0aW5nIHNob3VsZCBiZSBhIGJvb2xlYW4gb3IgZmFsc3kgdmFsdWUuIEV4aXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IEVycm9yKCdUaGUgdGhpcmQgYXJndW1lbnQgb2YgQmlkQmFycmVsLnJlc2V0VGFyZ2V0aW5nIHNob3VsZCBiZSBhIGJvb2xlYW4gb3IgZmFsc3kgdmFsdWUuIEV4aXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHkuZXJyb3JSZXBvcnRpbmcucmVwb3J0KHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdICYmIGFyZ3VtZW50c1syXSwgbiA9IFtdLCBpID0gKDAsIHUuZ2V0VW5pdHMpKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaSwgbykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZGlzcGxheWVkICYmIG4ucHVzaChhLmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRlKFtdLCBuLCByKSwgWihlLCBbXSwgdCwgcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0ZSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogW10sIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IFtdLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMikubG9nSW5mbygnQ2xlYXJpbmcgdGFyZ2V0aW5nIGZvciBzbG90cycsIHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gKDAsIHUuZ2V0VW5pdENvbGxlY3Rpb24pKHQpLCBvID0gMDsgbyA8IG4ubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbltvXS5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSChhLCBlKSwgdS51bml0VGVtcGxhdGVzW2FdICYmIHIgJiYgSChhLCBlLCB1LnVuaXRUZW1wbGF0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcShlKSwgaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdDbGVhcmluZyB0YXJnZXRpbmcgZm9yIHBhZ2UnLCBlIHx8ICdhbGwgdmFsdWVzJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQubGVuZ3RoID8gaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdBcHBseWluZyB0YXJnZXRpbmcgdmFsdWVzJywgZSwgJ3RvIHVuaXRzJywgdCkgOiBpLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDIpLmxvZ0luZm8oJ0FwcGx5aW5nIHRhcmdldGluZyB2YWx1ZXMnLCBlLCAndG8gcGFnZScpLCAnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiAodCA9IFt0XSksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAoMCwgdS5nZXRVbml0Q29sbGVjdGlvbikodCksIGEgPSAwOyBhIDwgby5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gb1thXS5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGVbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IGQgPyAoVihzLCBjLCBkKSwgciAmJiBWKHMsIGMsIGQsIHUudW5pdFRlbXBsYXRlcykpIDogaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgzKS5sb2dXYXJuKCdUYXJnZXRpbmcgdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQgZm9yICcuY29uY2F0KHMsICc6JykuY29uY2F0KGMsICcuIFRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIHRhcmdldGluZyB2YWx1ZSBub3QgYmVpbmcgc2V0LicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gKDAsIG4uZ2V0Q29uZmlnKSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZiBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGVbZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gcCA/IEYoZiwgcCkgOiAtMSAhPT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R0YWcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihmKSAmJiBsLnRhcmdldGluZy5hdXRvIHx8IGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMykubG9nV2FybignVGFyZ2V0aW5nIHZhbHVlIGlzIG51bGwgb3IgdW5kZWZpbmVkIGZvciAnLmNvbmNhdChmLCAnLiBUaGlzIHdpbGwgcmVzdWx0IGluIHRoZSB0YXJnZXRpbmcgdmFsdWUgbm90IGJlaW5nIHNldC4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5jbGVhclVuaXRUYXJnZXRpbmcgPSBILCBmLmV4cG9zdXJlQXBpLnJvb3RTY29wZSh7CiAgICAgICAgICAgICAgICAgICAgc2V0VGFyZ2V0aW5nOiByZSwKICAgICAgICAgICAgICAgICAgICByZXNldFRhcmdldGluZzogWiwKICAgICAgICAgICAgICAgICAgICByZXNldEFsbFRhcmdldGluZzogZWUsCiAgICAgICAgICAgICAgICAgICAgY2xlYXJUYXJnZXRpbmc6IHRlLAogICAgICAgICAgICAgICAgICAgIG5ld1BhZ2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRygpLCBKKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIGYuZXhwb3N1cmVBcGkucm9vdFNjb3BlR2V0dGVycyh7CiAgICAgICAgICAgICAgICAgICAgdmd1aWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE4oKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBhZ2VUYXJnZXRpbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcigyNik7CiAgICAgICAgICAgICAgICB2YXIgaSA9IHIoNyksIG8gPSByKDM2KSwgYSA9IEFycmF5LnByb3RvdHlwZS5zbGljZSwgcyA9IEFycmF5LnByb3RvdHlwZS5wdXNoLCB1ID0gaS5fbWFwKG8uRVZFTlRTLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KSwgYyA9IG8uRVZFTlRfSURfUEFUSFMsIGQgPSBbXTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nTWVzc2FnZSgnRW1pdHRpbmcgZXZlbnQgZm9yOiAnICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gclswXSB8fCB7fSwgbyA9IG5bY1t0XV0sIGEgPSBlW3RdIHx8IHsgcXVlOiBbXSB9LCB1ID0gaS5fbWFwKGEsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZFRpbWU6IGkuZ2V0UGVyZm9ybWFuY2VOb3coKQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyAmJiBpLmNvbnRhaW5zKHUsIG8pICYmIHMuYXBwbHkobCwgYVtvXS5xdWUpLCBzLmFwcGx5KGwsIGEucXVlKSwgaS5fZWFjaChsLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KG51bGwsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dFcnJvcignRXJyb3IgZXhlY3V0aW5nIGhhbmRsZXI6JywgJ2V2ZW50cy5qcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm9uID0gZnVuY3Rpb24gKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY29udGFpbnModSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGVbdF0gfHwgeyBxdWU6IFtdIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID8gKG9bbl0gPSBvW25dIHx8IHsgcXVlOiBbXSB9LCBvW25dLnF1ZS5wdXNoKHIpKSA6IG8ucXVlLnB1c2gociksIGVbdF0gPSBvOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dFcnJvcignV3JvbmcgZXZlbnQgbmFtZSA6ICcgKyB0ICsgJyBWYWxpZCBldmVudCBuYW1lcyA6JyArIHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdC5lbWl0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcihlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCB0Lm9mZiA9IGZ1bmN0aW9uICh0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgaS5pc0VtcHR5KG8pIHx8IGkuaXNFbXB0eShvLnF1ZSkgJiYgaS5pc0VtcHR5KG9bbl0pIHx8IG4gJiYgKGkuaXNFbXB0eShvW25dKSB8fCBpLmlzRW1wdHkob1tuXS5xdWUpKSB8fCAobiA/IGkuX2VhY2gob1tuXS5xdWUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG9bbl0ucXVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PT0gciAmJiB0LnNwbGljZSh0LmluZGV4T2YoZSksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGkuX2VhY2goby5xdWUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG8ucXVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PT0gciAmJiB0LnNwbGljZSh0LmluZGV4T2YoZSksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZVt0XSA9IG8pOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmdldEV2ZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuX2VhY2goZCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbih7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zZXR1cEJlZm9yZUhvb2tGbk9uY2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiAxNSwgbiA9IGUuZ2V0SG9va3MoeyBob29rOiB0IH0pOwogICAgICAgICAgICAgICAgICAgIDAgPT09IG4ubGVuZ3RoICYmIGUuYmVmb3JlKHQsIHIpOwogICAgICAgICAgICAgICAgfSwgdC5tb2R1bGUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGEoJ2FzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hcHBseSh2b2lkIDAsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyID0gZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocikgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gciA/IEFycmF5LmZyb20ocikgOiAnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSA/IG8oZSwgdCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGUpKFtdKTsKICAgICAgICAgICAgICAgIH0sIHQuc3VibW9kdWxlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IG5ldyBBcnJheSh0ID4gMSA/IHQgLSAxIDogMCksIG4gPSAxOyBuIDwgdDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJbbiAtIDFdID0gYXJndW1lbnRzW25dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzKGUpLmJlZm9yZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gociksIGUodCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0LmdldEhvb2sgPSB0Lmhvb2sgPSB2b2lkIDAsIHIoOSksIHIoMTEpLCByKDApLCByKDYpLCByKDEzKSwgcigxKSwgcig0KSwgcigyKTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDMzOSkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYSA9ICgwLCBpLmRlZmF1bHQpKHsgcmVhZHk6IGkuZGVmYXVsdC5TWU5DIHwgaS5kZWZhdWx0LkFTWU5DIHwgaS5kZWZhdWx0LlFVRVVFIH0pOwogICAgICAgICAgICAgICAgdC5ob29rID0gYTsKICAgICAgICAgICAgICAgIHZhciBzID0gYS5nZXQ7CiAgICAgICAgICAgICAgICB0LmdldEhvb2sgPSBzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSBlLmV4cG9ydHMgPSB7IHZlcnNpb246ICcyLjYuMTEnIH07CiAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PSB0eXBlb2YgX19lICYmIChfX2UgPSByKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciByID0gMCwgbiA9IE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KHZvaWQgMCA9PT0gZSA/ICcnIDogZSwgJylfJywgKCsrciArIG4pLnRvU3RyaW5nKDM2KSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gITE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihlICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE1OCksIGkgPSByKDEzMikuY29uY2F0KCdsZW5ndGgnLCAncHJvdG90eXBlJyk7CiAgICAgICAgICAgICAgICB0LmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGUsIGkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciByID0ge30udG9TdHJpbmc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0NhblwndCBjYWxsIG1ldGhvZCBvbiAgJyArIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGguY2VpbCwgbiA9IE1hdGguZmxvb3I7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihlID0gK2UpID8gMCA6IChlID4gMCA/IG4gOiByKShlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTU4KSwgaSA9IHIoMTMyKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgaSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGUgJiYgKCdvYmplY3QnID09IHQgfHwgJ2Z1bmN0aW9uJyA9PSB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5mZWF0dXJlcyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1OCksIGkgPSByKDgpLCBvID0gcigyODEpLCBhID0gZChyKDM0KSksIHMgPSBkKHIoOTQpKSwgdSA9IHIoMzUpLCBjID0gcigyMSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbCA9IGQocigxMCkpLmRlZmF1bHQuUVVFUllfUEFSQU1TLCBmID0gbC5BRF9TVVBQUkVTUywgcCA9IGwuQklEX1NVUFBSRVNTLCBnID0gbC5NT0RfU1VQUFJFU1MsIG0gPSBsLlBFUkZfTUVBU1VSRSwgdiA9IGwuU0laRV9TVVBQUkVTUywgYiA9IGwuRk9SQ0VfUlVOLCB5ID0gbC5BRF9SRUdJT04sIGggPSBsLkFEX0NPVU5UUlksIFMgPSAoMCwgaS5sb2dnZXIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0ZlYXR1cmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogJyNlZWUnLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjREE0MTY3JwogICAgICAgICAgICAgICAgICAgIH0pLCBPID0gewogICAgICAgICAgICAgICAgICAgICAgICBhZFN1cHByZXNzOiBmLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRTdXBwcmVzczogcCwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kU3VwcHJlc3M6IGcsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVTdXBwcmVzczogdiwKICAgICAgICAgICAgICAgICAgICAgICAgcGVyZk1lYXN1cmU6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUnVuOiBiCiAgICAgICAgICAgICAgICAgICAgfSwgXyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZTogeSwKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNvZGU6IGgKICAgICAgICAgICAgICAgICAgICB9LCBFID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0gKDAsIG4udXJsUXVlcnlBc09iamVjdCkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcy5kZWZhdWx0KShuLCAnJy5jb25jYXQodCwgJy4nKS5jb25jYXQoaSksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0Lm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA/IC0xID09PSBuLmluZGV4T2YoITEpIDogbi5pbmRleE9mKCEwKSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAoMCwgYS5kZWZhdWx0KShlLCB0KSB8fCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbicgPT0gdHlwZW9mIG8gJiYgbzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5leHBvc3VyZUFwaS5leHBvc2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxsRmVhdHVyZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHUuY2xvbmVEZWVwKShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGZWF0dXJlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIE8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKE8sIG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gT1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtpXSAmJiByKG4sICgwLCBvLnN0cmluZ0ZsYWdzKSh0W2ldKS5yZXN1bHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluIF8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKF8sIGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gX1thXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFt1XSAmJiAoMCwgcy5kZWZhdWx0KShlLCBhLCB0W3VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgUy5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdGZWF0dXJlcyBvbiBsb2FkJywgZSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5kZWZhdWx0KShlLCB0KSB8fCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuZmVhdHVyZXMgPSBFOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuc3RvcmFnZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMDcpLCBpID0gcigyMDgpLCBvID0gcigyMCksIGEgPSByKDE1KSwgcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9jYWxTdG9yYWdlRW5naW5lLnNldHVwKCksIGkuY29va2llU3RvcmFnZUVuZ2luZS5zZXR1cCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR1cDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAsIGEuZ2V0Q29uZmlnKSgnY29uc2VudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdCB8fCAhMCA9PT0gdCA/IGUoKSA6ICExID09PSB0ICYmIG8uZXZlbnRFbWl0dGVyLm9uKCdjb25zZW50Q2hhbmdlZCcsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2FsU3RvcmFnZTogbi5sb2NhbFN0b3JhZ2VFbmdpbmUuZ2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMczogbi5sb2NhbFN0b3JhZ2VFbmdpbmUuZ2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2NhbFN0b3JhZ2U6IG4ubG9jYWxTdG9yYWdlRW5naW5lLnNldFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0THM6IG4ubG9jYWxTdG9yYWdlRW5naW5lLnNldFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlTHM6IG4ubG9jYWxTdG9yYWdlRW5naW5lLmRlbGV0ZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvb2tpZTogaS5jb29raWVTdG9yYWdlRW5naW5lLmdldFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29va2llOiBpLmNvb2tpZVN0b3JhZ2VFbmdpbmUuc2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVDb29raWU6IGkuY29va2llU3RvcmFnZUVuZ2luZS5kZWxldGVDb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb29raWU6IGkuY29va2llU3RvcmFnZUVuZ2luZS5yYXcuZ2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29va2llOiBpLmNvb2tpZVN0b3JhZ2VFbmdpbmUucmF3LnNldFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExzOiBuLmxvY2FsU3RvcmFnZUVuZ2luZS5yYXcuZ2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0THM6IG4ubG9jYWxTdG9yYWdlRW5naW5lLnJhdy5zZXRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVGcm9tTHM6IG4ubG9jYWxTdG9yYWdlRW5naW5lLnJhdy5kZWxldGVLZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LnN0b3JhZ2UgPSBzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQucmVuZGVyU2NyaXB0ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoNTYpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH0sIG8gPSByKDM5KSwgYSA9IHIoOCksIHMgPSByKDEyKTsKICAgICAgICAgICAgICAgIHZhciB1ID0gYS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvLCBjID0gKDAsIG8uaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgoMCwgcy5kb20pKCkud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUuaWQpIHx8IGUuc2hvdWxkUmVuZGVyICYmICFlLnNob3VsZFJlbmRlcigpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczogKDAsIGkuZGVmYXVsdCkoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdWxkUmVuZGVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGUucGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogZS5jb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNyYyAmJiAociA9IGUuc3JjLnN1YnN0cmluZyhlLnNyYy5sYXN0SW5kZXhPZignLycpICsgMSkpLCAhZS5zcmMgfHwgKDAsIHMuZG9tKSgpLndpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj1cJycgKyBlLnNyYyArICdcJ10nKSB8fCAoMCwgcy5kb20pKCkud2luZG93LmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtzcmMqPVwnJyArIHIgKyAnXCddJykgfHwgKHUoJ1JlbmRlcmluZyBzY3JpcHQgdmlhIEJpZEJhcnJlbCcsIGUpLCBmdW5jdGlvbiAoZSwgdCwgciwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodClbMF0sIHMgPSB2b2lkIDAgIT09IGkgJiYgZS5xdWVyeVNlbGVjdG9yKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIuaWQgfHwgIWUuZ2V0RWxlbWVudEJ5SWQoci5pZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHUgaW4gKChvID0gZS5jcmVhdGVFbGVtZW50KHQpKS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9qYXZhc2NyaXB0JyksIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNPd25Qcm9wZXJ0eSh1KSAmJiBvLnNldEF0dHJpYnV0ZSh1LCAhMCA9PT0gclt1XSA/ICcnIDogclt1XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIChvLmlubmVySFRNTCA9IG4pLCBzID8gcy5hcHBlbmQobykgOiBudWxsICE9PSBzICYmIGEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCgwLCBzLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQsICdzY3JpcHQnLCB0LmF0dHJpYnV0ZXMsIHQuY29udGVudCwgdC5wYXJlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LnJlbmRlclNjcmlwdCA9IGM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIoNCksIHIoMiksIHIoMSksIHIoMyksIHIoMCksIHIoNiksIHIoMzApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5uZXdTdG9yYWdlTWFuYWdlciA9IGwsIHQuZ2V0Q29yZVN0b3JhZ2VNYW5hZ2VyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVR5cGU6ICdjb3JlJwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgdC5nZXRTdG9yYWdlTWFuYWdlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwoewogICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogdAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgdC5yZXNldERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zdG9yYWdlQ2FsbGJhY2tzID0gZCA9IFtdOwogICAgICAgICAgICAgICAgfSwgdC52YWxpZGF0ZVN0b3JhZ2VFbmZvcmNlbWVudCA9IHQuc3RvcmFnZUNhbGxiYWNrcyA9IHZvaWQgMCwgcigzMyksIHIoMTYpLCByKDQzKTsKICAgICAgICAgICAgICAgIHZhciBpLCBvID0gcig2MSksIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBuKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKGEuZ2V0IHx8IGEuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBvLCBhKSA6IHJbb10gPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIHMgPSAoaSA9IHIoMzEpKSAmJiBpLl9fZXNNb2R1bGUgPyBpIDogeyBkZWZhdWx0OiBpIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBXZWFrTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWFrTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUnLAogICAgICAgICAgICAgICAgICAgICAgICAncHJlYmlkLW1vZHVsZScKICAgICAgICAgICAgICAgICAgICBdLCBkID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgdCA9IGUuZ3ZsaWQsIHIgPSBlLm1vZHVsZU5hbWUsIG4gPSBlLm1vZHVsZVR5cGU7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgcy5kZWZhdWx0KShjLCBuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoeyB2YWxpZDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmKHQsIHIsIHsgaGFzRW5mb3JjZW1lbnRIb29rOiAhMSB9LCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXNFbmZvcmNlbWVudEhvb2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0VuZm9yY2VtZW50SG9vazogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiBhLmhhc0RldmljZUFjY2VzcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gKGUsIHQsIHIsIG4sIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAmJiBpLnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbyAmJiAnJyAhPT0gbyA/ICcgO2RvbWFpbj0nLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobykpIDogJycsIHMgPSByICYmICcnICE9PSByID8gJyA7ZXhwaXJlcz0nLmNvbmNhdChyKSA6ICcnLCB1ID0gbnVsbCAhPSBuICYmICdub25lJyA9PSBuLnRvTG93ZXJDYXNlKCkgPyAnOyBTZWN1cmUnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICcnLmNvbmNhdChlLCAnPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodCkpLmNvbmNhdChzLCAnOyBwYXRoPS8nKS5jb25jYXQoYSkuY29uY2F0KG4gPyAnOyBTYW1lU2l0ZT0nLmNvbmNhdChuKSA6ICcnKS5jb25jYXQodSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQudmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llLm1hdGNoKCcoXnw7KVxccyonICsgZSArICdcXHMqPVxccyooW147XSopXFxzKig7fCQpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID8gZGVjb2RlVVJJQ29tcG9uZW50KHJbMl0pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9lYzYwNDRhMDY4MjU3YzVkID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2VjNjA0NGEwNjgyNTdjNWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfNDM2ZDZmNmY5NDc2MzI1My5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3ByZWJpZC5jb29raWVUZXN0JywgJzEnKSwgJzEnID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncHJlYmlkLmNvb2tpZVRlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZWM2MDQ0YTA2ODI1N2M1ZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2VjNjA0NGEwNjgyNTdjNWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgIWUudmFsaWQpICYmICghIWEuY2hlY2tDb29raWVTdXBwb3J0KCkgfHwgKHdpbmRvdy5kb2N1bWVudC5jb29raWUgPSAncHJlYmlkLmNvb2tpZVRlc3QnLCAtMSAhPT0gd2luZG93LmRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCdwcmViaWQuY29va2llVGVzdCcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiByLnZhbGlkICYmIGIoKSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9iYzk2NjEyMzgxNTZiMDZjID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JjOTY2MTIzODE1NmIwNmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfNDM2ZDZmNmY5NDc2MzI1My5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQudmFsaWQgJiYgYigpID8gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JjOTY2MTIzODE1NmIwNmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF9iYzk2NjEyMzgxNTZiMDZjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC52YWxpZCAmJiBiKCkgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNGU5OWY1OTMyYTcwMGViMyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80ZTk5ZjU5MzJhNzAwZWIzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrXzQzNmQ2ZjZmOTQ3NjMyNTMubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhd2luZG93LmxvY2FsU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nRXJyb3IoJ0xvY2FsIHN0b3JhZ2UgYXBpIGRpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNGU5OWY1OTMyYTcwMGViMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzRlOTlmNTkzMmE3MDBlYjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgeSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC52YWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5oYXNEZXZpY2VBY2Nlc3MoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOyBuLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4ucG9wKCksIG8gPSBpLmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gbyA8IDAgPyBpLmxlbmd0aCA6IG8sIGRlY29kZVVSSUNvbXBvbmVudChpLnNsaWNlKDAsIG8pLnJlcGxhY2UoL15ccysvLCAnJykpLmluZGV4T2YoZSkgPj0gMCAmJiByLnB1c2goZGVjb2RlVVJJQ29tcG9uZW50KGkuc2xpY2UobyArIDEpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29va2llOiBvLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb29raWU6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUlzRW5hYmxlZDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llc0FyZUVuYWJsZWQ6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldERhdGFJbkxvY2FsU3RvcmFnZTogZywKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2U6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZURhdGFGcm9tTG9jYWxTdG9yYWdlOiB2LAogICAgICAgICAgICAgICAgICAgICAgICBoYXNMb2NhbFN0b3JhZ2U6IGIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTaW1pbGFyQ29va2llczogeQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnN0b3JhZ2VDYWxsYmFja3MgPSBkOwogICAgICAgICAgICAgICAgdmFyIGYgPSAoMCwgby5ob29rKSgnYXN5bmMnLCBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIG4ocik7CiAgICAgICAgICAgICAgICB9LCAndmFsaWRhdGVTdG9yYWdlRW5mb3JjZW1lbnQnKTsKICAgICAgICAgICAgICAgIHQudmFsaWRhdGVTdG9yYWdlRW5mb3JjZW1lbnQgPSBmOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByKDQpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDYpLCByKDMwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuUmVuZGVyZXIgPSBjLCB0LmlzUmVuZGVyZXJSZXF1aXJlZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgIWUudXJsKTsKICAgICAgICAgICAgICAgIH0sIHQuZXhlY3V0ZVJlbmRlcmVyID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBlLnJlbmRlcih0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgaSwgbyA9IHIoMzQ2KSwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT09IG4oZSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LmhhcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIGkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAoYS5nZXQgfHwgYS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIG8sIGEpIDogcltvXSA9IGVbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShyKDcpKSwgcyA9IChpID0gcigzNykpICYmIGkuX19lc01vZHVsZSA/IGkgOiB7IGRlZmF1bHQ6IGkgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgciA9IGUudXJsLCBuID0gZS5jb25maWcsIGkgPSBlLmlkLCBzID0gZS5jYWxsYmFjaywgdSA9IGUubG9hZGVkLCBjID0gZS5hZFVuaXRDb2RlOwogICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gciwgdGhpcy5jb25maWcgPSBuLCB0aGlzLmhhbmRsZXJzID0ge30sIHRoaXMuaWQgPSBpLCB0aGlzLmxvYWRlZCA9IHUsIHRoaXMuY21kID0gW10sIHRoaXMucHVzaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyB0LmxvYWRlZCA/IGUuY2FsbCgpIDogdC5jbWQucHVzaChlKSA6IGEubG9nRXJyb3IoJ0NvbW1hbmRzIGdpdmVuIHRvIFJlbmRlcmVyLnB1c2ggbXVzdCBiZSB3cmFwcGVkIGluIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmNhbGxiYWNrID0gcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQubG9hZGVkID0gITAsIHQucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkKGMpID8gYS5sb2dXYXJuKCdFeHRlcm5hbCBKcyBub3QgbG9hZGVkIGJ5IFJlbmRlcmVyIHNpbmNlIHJlbmRlcmVyIHVybCBhbmQgY2FsbGJhY2sgaXMgYWxyZWFkeSBkZWZpbmVkIG9uIGFkVW5pdCAnLmNvbmNhdChjKSkgOiAoMCwgby5sb2FkRXh0ZXJuYWxTY3JpcHQpKHIsICdvdXRzdHJlYW0nLCB0aGlzLmNhbGxiYWNrKSwgdGhpcy5fcmVuZGVyID8gdGhpcy5fcmVuZGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBhLmxvZ1dhcm4oJ05vIHJlbmRlciBmdW5jdGlvbiB3YXMgcHJvdmlkZWQsIHBsZWFzZSB1c2UgLnNldFJlbmRlciBvbiB0aGUgcmVuZGVyZXInKTsKICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHBianMuYWRVbml0cywgciA9ICgwLCBzLmRlZmF1bHQpKHQsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jb2RlID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGEuZGVlcEFjY2VzcyhyLCAncmVuZGVyZXInKSwgaSA9ICEhKG4gJiYgbi51cmwgJiYgbi5yZW5kZXIpLCBvID0gYS5kZWVwQWNjZXNzKHIsICdtZWRpYVR5cGVzLnZpZGVvLnJlbmRlcmVyJyksIHUgPSAhIShvICYmIG8udXJsICYmIG8ucmVuZGVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoaSAmJiAhMCAhPT0gbi5iYWNrdXBPbmx5IHx8IHUgJiYgITAgIT09IG8uYmFja3VwT25seSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjLmluc3RhbGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZS51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZS5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZS5jYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBlLmxvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogZS5hZFVuaXRDb2RlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5nZXRDb25maWcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnOwogICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuc2V0UmVuZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXIgPSBlOwogICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuc2V0RXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVycyA9IGU7CiAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5oYW5kbGVWaWRlb0V2ZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaWQsIHIgPSBlLmV2ZW50TmFtZTsKICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzLmhhbmRsZXJzW3JdICYmIHRoaXMuaGFuZGxlcnNbcl0oKSwgYS5sb2dNZXNzYWdlKCdQcmViaWQgUmVuZGVyZXIgZXZlbnQgZm9yIGlkICcuY29uY2F0KHQsICcgdHlwZSAnKS5jb25jYXQocikpOwogICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdGhpcy5jbWQubGVuZ3RoID4gMDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY21kLnNoaWZ0KCkuY2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmxvZ0Vycm9yKCdFcnJvciBwcm9jZXNzaW5nIFJlbmRlcmVyIGNvbW1hbmQ6ICcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogISgxICYgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISgyICYgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhKDQgJiBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig2MykoJ21ldGEnKSwgaSA9IHIoMjMpLCBvID0gcig1MCksIGEgPSByKDMyKS5mLCBzID0gMCwgdSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSwgYyA9ICFyKDI0KShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYShlLCBuLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk6ICdPJyArICsrcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBsID0gZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICBLRVk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgIE5FRUQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBmYXN0S2V5OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzeW1ib2wnID09IHR5cGVvZiBlID8gZSA6ICgnc3RyaW5nJyA9PSB0eXBlb2YgZSA/ICdTJyA6ICdQJykgKyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKGUsIG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0UnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0uaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2VhazogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbyhlLCBuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuXS53OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvbkZyZWV6ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjICYmIGwuTkVFRCAmJiB1KGUpICYmICFvKGUsIG4pICYmIGQoZSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMyKS5mLCBpID0gcig1MCksIG8gPSByKDE5KSgndG9TdHJpbmdUYWcnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgZSAmJiAhaShlID0gciA/IGUgOiBlLnByb3RvdHlwZSwgbykgJiYgbihlLCBvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI3KSwgaSA9IHIoMjI5KSwgbyA9IHIoMTMyKSwgYSA9IHIoMTMxKSgnSUVfUFJPVE8nKSwgcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9LCB1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IHIoMTI4KSgnaWZyYW1lJyksIG4gPSBvLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIHIoMTYzKS5hcHBlbmRDaGlsZCh0KSwgdC5zcmMgPSAnamF2YXNjcmlwdDonLCAoZSA9IHQuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLCBlLndyaXRlKCc8c2NyaXB0PmRvY3VtZW50LkY9T2JqZWN0PC9zY3JpcHQ+JyksIGUuY2xvc2UoKSwgdSA9IGUuRjsgbi0tOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHUucHJvdG90eXBlW29bbl1dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSA/IChzLnByb3RvdHlwZSA9IG4oZSksIHIgPSBuZXcgcygpLCBzLnByb3RvdHlwZSA9IG51bGwsIHJbYV0gPSBlKSA6IHIgPSB1KCksIHZvaWQgMCA9PT0gdCA/IHIgOiBpKHIsIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHt9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE4NCksIGkgPSByKDE0MCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgbykgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gIXI7CiAgICAgICAgICAgICAgICAgICAgciB8fCAociA9IHt9KTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gLTEsIHUgPSB0Lmxlbmd0aDsgKytzIDwgdTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB0W3NdLCBkID0gbyA/IG8ocltjXSwgZVtjXSwgYywgciwgZSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZCAmJiAoZCA9IGVbY10pLCBhID8gaShyLCBjLCBkKSA6IG4ociwgYywgZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSByKDY1KSwgbyA9IHIoNDcpLCBhID0gcigyNCksIHMgPSBbXS5zb3J0LCB1ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIG4obi5QICsgbi5GICogKGEoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHUuc29ydCh2b2lkIDApOwogICAgICAgICAgICAgICAgfSkgfHwgIWEoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHUuc29ydChudWxsKTsKICAgICAgICAgICAgICAgIH0pIHx8ICFyKDI2NikocykpLCAnQXJyYXknLCB7CiAgICAgICAgICAgICAgICAgICAgc29ydDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/IHMuY2FsbChvKHRoaXMpKSA6IHMuY2FsbChvKHRoaXMpLCBpKGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpIHx8IHZvaWQgMCAhPT0gbiAmJiBuIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKHIgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDQxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4oZSwgaSwgdFtpXSwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBuLCByID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbbl0gfHwgKHJbbl0gPSBlLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKSksIHJbbl07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdm9pZCAwIDogYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdldEFsbFMyU0JpZGRlcnMgPSBrLCB0LnNldFMyU1Rlc3RpbmdNb2R1bGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIFMgPSBlOwogICAgICAgICAgICAgICAgfSwgdC5kZWZhdWx0ID0gdC5hbGxTMlNCaWRkZXJzID0gdC5jbGllbnRUZXN0QWRhcHRlcnMgPSB0LnVzcERhdGFIYW5kbGVyID0gdC5nZHByRGF0YUhhbmRsZXIgPSB2b2lkIDAsIHIoOSksIHIoMTEpLCByKDYpLCByKDEzKSwgcig0KSwgcigyKSwgcigyNiksIHIoMSksIHIoMyksIHIoMCksIHIoNSksIHIoNDApOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDcpLCBpID0gcigyMTgpLCBvID0gcig4OCksIGEgPSByKDQ5KSwgcyA9IHIoMTAzKSwgdSA9IHIoMjIpLCBjID0gcig2MSksIGQgPSBnKHIoMzEpKSwgbCA9IGcocigzNykpLCBmID0gcigyMjApLCBwID0gcigzNDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBiKGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgYihlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSksICdNYXAnID09PSByIHx8ICdTZXQnID09PSByID8gQXJyYXkuZnJvbShyKSA6ICdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpID8geShlLCB0KSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgUywgTyA9IHIoNyksIF8gPSByKDM2KSwgRSA9IHIoNjApLCBJID0ge30sIHcgPSBJLmJpZGRlclJlZ2lzdHJ5ID0ge30sIEEgPSBJLmFsaWFzUmVnaXN0cnkgPSB7fSwgVCA9IFtdOwogICAgICAgICAgICAgICAgdS5jb25maWcuZ2V0Q29uZmlnKCdzMnNDb25maWcnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUgJiYgZS5zMnNDb25maWcgJiYgKFQgPSBBcnJheS5pc0FycmF5KGUuczJzQ29uZmlnKSA/IGUuczJzQ29uZmlnIDogW2UuczJzQ29uZmlnXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciB4ID0ge307CiAgICAgICAgICAgICAgICB2YXIgQyA9ICgwLCBjLmhvb2spKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuYmlkZGVyQ29kZSwgciA9IGUuYXVjdGlvbklkLCBhID0gZS5iaWRkZXJSZXF1ZXN0SWQsIHMgPSBlLmFkVW5pdHMsIHUgPSBlLmxhYmVscywgYyA9IGUuc3JjOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlZHVjZShmdW5jdGlvbiAoZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICgwLCBpLnJlc29sdmVTdGF0dXMpKCgwLCBpLmdldExhYmVscykocywgdSksIHMubWVkaWFUeXBlcywgcy5zaXplcyksIGwgPSBkLmFjdGl2ZSwgcCA9IGQubWVkaWFUeXBlcywgZyA9IGQuZmlsdGVyUmVzdWx0czsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwgPyBnICYmIE8ubG9nSW5mbygnU2l6ZSBtYXBwaW5nIGZpbHRlcmVkIGFkVW5pdCAiJy5jb25jYXQocy5jb2RlLCAnIiBiYW5uZXIgc2l6ZXMgZnJvbSAnKSwgZy5iZWZvcmUsICd0byAnLCBnLmFmdGVyKSA6IE8ubG9nSW5mbygnU2l6ZSBtYXBwaW5nIGRpc2FibGVkIGFkVW5pdCAiJy5jb25jYXQocy5jb2RlLCAnIicpKSwgbCAmJiBlLnB1c2gocy5iaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gcy5uYXRpdmVQYXJhbXMgfHwgTy5kZWVwQWNjZXNzKHMsICdtZWRpYVR5cGVzLm5hdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAodCA9IGgoe30sIHQsIHsgbmF0aXZlUGFyYW1zOiAoMCwgby5wcm9jZXNzTmF0aXZlQWRVbml0UGFyYW1zKShkKSB9KSksIHQgPSBoKHt9LCB0LCAoMCwgbi5nZXREZWZpbmVkUGFyYW1zKShzLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZwZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lZGlhVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmRlcmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmVkQXVjdGlvblJlc3BvbnNlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSAoMCwgaS5yZXNvbHZlU3RhdHVzKSgoMCwgaS5nZXRMYWJlbHMpKHQsIHUpLCBwKSwgZyA9IGwuYWN0aXZlLCBtID0gbC5tZWRpYVR5cGVzLCB2ID0gbC5maWx0ZXJSZXN1bHRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcgPyB2ICYmIE8ubG9nSW5mbygnU2l6ZSBtYXBwaW5nIGZpbHRlcmVkIGFkVW5pdCAiJy5jb25jYXQocy5jb2RlLCAnIiBiaWRkZXIgIicpLmNvbmNhdCh0LmJpZGRlciwgJyIgYmFubmVyIHNpemVzIGZyb20gJyksIHYuYmVmb3JlLCAndG8gJywgdi5hZnRlcikgOiBPLmxvZ0luZm8oJ1NpemUgbWFwcGluZyBkZWFjdGl2YXRlZCBhZFVuaXQgIicuY29uY2F0KHMuY29kZSwgJyIgYmlkZGVyICInKS5jb25jYXQodC5iaWRkZXIsICciJykpLCBPLmlzVmFsaWRNZWRpYVR5cGVzKG0pID8gdCA9IGgoe30sIHQsIHsgbWVkaWFUeXBlczogbSB9KSA6IE8ubG9nRXJyb3IoJ21lZGlhVHlwZXMgaXMgbm90IGNvcnJlY3RseSBjb25maWd1cmVkIGZvciBhZHVuaXQgJy5jb25jYXQocy5jb2RlKSksIGcgJiYgZS5wdXNoKGgoe30sIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBzLmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDogcy50cmFuc2FjdGlvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBPLmRlZXBBY2Nlc3MobSwgJ2Jhbm5lci5zaXplcycpIHx8IE8uZGVlcEFjY2VzcyhtLCAndmlkZW8ucGxheWVyU2l6ZScpIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElkOiB0LmJpZF9pZCB8fCBPLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0SWQ6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0c0NvdW50OiBmLmFkdW5pdENvdW50ZXIuZ2V0UmVxdWVzdHNDb3VudGVyKHMuY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdHNDb3VudDogZi5hZHVuaXRDb3VudGVyLmdldEJpZGRlclJlcXVlc3RzQ291bnRlcihzLmNvZGUsIHQuYmlkZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJXaW5zQ291bnQ6IGYuYWR1bml0Q291bnRlci5nZXRCaWRkZXJXaW5zQ291bnRlcihzLmNvZGUsIHQuYmlkZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIFtdKS5yZWR1Y2Uobi5mbGF0dGVuLCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyAhPT0gZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sICdnZXRCaWRzJyk7CiAgICAgICAgICAgICAgICB2YXIgUCA9IHsKICAgICAgICAgICAgICAgICAgICBjb25zZW50RGF0YTogbnVsbCwKICAgICAgICAgICAgICAgICAgICBzZXRDb25zZW50RGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUC5jb25zZW50RGF0YSA9IGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRDb25zZW50RGF0YTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUC5jb25zZW50RGF0YTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5nZHByRGF0YUhhbmRsZXIgPSBQOwogICAgICAgICAgICAgICAgdmFyIGogPSB7CiAgICAgICAgICAgICAgICAgICAgY29uc2VudERhdGE6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgc2V0Q29uc2VudERhdGE6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGouY29uc2VudERhdGEgPSBlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc2VudERhdGE6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGouY29uc2VudERhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQudXNwRGF0YUhhbmRsZXIgPSBqOwogICAgICAgICAgICAgICAgdmFyIFIgPSBbXTsKICAgICAgICAgICAgICAgIHQuY2xpZW50VGVzdEFkYXB0ZXJzID0gUjsKICAgICAgICAgICAgICAgIHZhciBEID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKCkgewogICAgICAgICAgICAgICAgICAgIEkuczJTVGVzdGluZ0VuYWJsZWQgPSAhMSwgVC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5lbmFibGVkICYmIGUuYmlkZGVycyAmJiBlLmJpZGRlcnMubGVuZ3RoICYmIEQucHVzaC5hcHBseShELCB2KGUuYmlkZGVycykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5lbmFibGVkICYmIGUudGVzdGluZyAmJiBTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB3W2VdLmdldFNwZWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpW3RdICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGlbdF0gJiYgKE8ubG9nSW5mbygnSW52b2tpbmcgJy5jb25jYXQoZSwgJy4nKS5jb25jYXQodCkpLCB1LmNvbmZpZy5ydW5XaXRoQmlkZGVyKGUsIG4uYmluZC5jYWxsKGlbdF0sIGksIHIpKSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ1dhcm4oJ0Vycm9yIGNhbGxpbmcgJy5jb25jYXQodCwgJyBvZiAnKS5jb25jYXQoZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuYWxsUzJTQmlkZGVycyA9IEQsIEkubWFrZUJpZFJlcXVlc3RzID0gKDAsIGMuaG9vaykoJ3N5bmMnLCBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbykgewogICAgICAgICAgICAgICAgICAgIEUuZW1pdChfLkVWRU5UUy5CRUZPUkVfUkVRVUVTVF9CSURTLCBlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9ICgwLCBuLmdldEJpZGRlckNvZGVzKShlKTsKICAgICAgICAgICAgICAgICAgICB1LmNvbmZpZy5nZXRDb25maWcoJ2JpZGRlclNlcXVlbmNlJykgPT09IHUuUkFORE9NICYmIChhID0gKDAsIG4uc2h1ZmZsZSkoYSkpOwogICAgICAgICAgICAgICAgICAgIHZhciBzID0gKDAsIHAuZ2V0UmVmZXJlckluZm8pKCksIGMgPSBhLCBmID0gW107CiAgICAgICAgICAgICAgICAgICAgMCA9PT0gRC5sZW5ndGggJiYgaygpLCBULmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmVuYWJsZWQgJiYgKE4odCkgJiYgKFMuY2FsY3VsYXRlQmlkU291cmNlcyh0KSwgUy5nZXRTb3VyY2VCaWRkZXJNYXAoZSwgRClbUy5DTElFTlRdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBkLmRlZmF1bHQpKFIsIGUpIHx8IFIucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgYyA9IGEuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKDAsIGQuZGVmYXVsdCkoRCwgZSkgfHwgKDAsIGQuZGVmYXVsdCkoUiwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBEOwogICAgICAgICAgICAgICAgICAgIFQuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBuLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKE4oZSkgJiYgZS50ZXN0U2VydmVyT25seSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4pICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oKDAsIGwuZGVmYXVsdCkoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBsLmRlZmF1bHQpKGUuYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZS5iaWRTb3VyY2UgfHwgdC5iaWRkZXJDb250cm9sICYmIHQuYmlkZGVyQ29udHJvbFtlLmJpZGRlcl0pICYmIGUuZmluYWxTb3VyY2UgPT09IFMuU0VSVkVSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIG4pICYmIChPLmxvZ1dhcm4oJ3Rlc3RTZXJ2ZXJPbmx5OiBUcnVlLiAgQWxsIGNsaWVudCByZXF1ZXN0cyB3aWxsIGJlIHN1cHByZXNzZWQuJyksIGMubGVuZ3RoID0gMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuYmlkZGVycywgbiA9IE8uZGVlcENsb25lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgPSBlLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkLmRlZmF1bHQpKHIsIGUuYmlkZGVyKSAmJiAoIU4odCkgfHwgZS5maW5hbFNvdXJjZSAhPT0gUy5DTElFTlQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkX2lkID0gTy5nZXRVbmlxdWVJZGVudGlmaWVyU3RyKCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gZS5iaWRzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBuKSwgYSA9IE8uZ2VuZXJhdGVVVUlEKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IE8uZ2V0VW5pcXVlSWRlbnRpZmllclN0cigpLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyQ29kZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RJZDogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IEMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RJZDogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBPLmRlZXBDbG9uZShpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBfLlMyUy5TUkMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblN0YXJ0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogbi50aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBfLlMyUy5TUkMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVySW5mbzogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIT09IGMuYmlkcy5sZW5ndGggJiYgZi5wdXNoKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5iaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGwuZGVmYXVsdCkoZiwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgbC5kZWZhdWx0KSh0LmJpZHMsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYmlkSWQgPT09IGUuYmlkX2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkcyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlLmFkVW5pdHNTMlNDb3B5ICYmIChlLmFkVW5pdHNTMlNDb3B5ID0gaS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkcy5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE8uZGVlcENsb25lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgPSBlLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFSLmxlbmd0aCB8fCBlLmZpbmFsU291cmNlICE9PSBTLlNFUlZFUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSBlLmJpZHMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJDb2RlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0SWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogQyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdElkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBPLmRlZXBDbG9uZShtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6ICdjbGllbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblN0YXJ0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlckluZm86IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUgPSB3W2VdOwogICAgICAgICAgICAgICAgICAgICAgICB1IHx8IE8ubG9nRXJyb3IoJ1RyeWluZyB0byBtYWtlIGEgcmVxdWVzdCBmb3IgYmlkZGVyIHRoYXQgZG9lcyBub3QgZXhpc3Q6ICcuY29uY2F0KGUpKSwgdSAmJiBhLmJpZHMgJiYgMCAhPT0gYS5iaWRzLmxlbmd0aCAmJiBmLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgfSksIFAuZ2V0Q29uc2VudERhdGEoKSAmJiBmLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5nZHByQ29uc2VudCA9IFAuZ2V0Q29uc2VudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICB9KSwgai5nZXRDb25zZW50RGF0YSgpICYmIGYuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnVzcENvbnNlbnQgPSBqLmdldENvbnNlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgfSksIGY7CiAgICAgICAgICAgICAgICB9LCAnbWFrZUJpZFJlcXVlc3RzJyksIEkuY2FsbEJpZHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgYSwgYykgewogICAgICAgICAgICAgICAgICAgIGlmICh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IG0odC5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtOdW1iZXIodm9pZCAwICE9PSB0LnNyYyAmJiB0LnNyYyA9PT0gXy5TMlMuU1JDKV0ucHVzaCh0KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIDIpLCBmID0gbFswXSwgcCA9IGxbMV0sIGcgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gLTEsIHIgPSAwOyByIDwgZy5sZW5ndGg7ICsrcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRpZCA9PT0gZ1tyXS50aWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPD0gLTEgJiYgZy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBULmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGdbdl0gJiYgKDAsIGQuZGVmYXVsdCkoZS5iaWRkZXJzLCBnW3ZdLmJpZGRlckNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgcy5hamF4QnVpbGRlcikoYSwgbyA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG8ucmVxdWVzdC5iaW5kKG51bGwsICdzMnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IG8uZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdm9pZCAwKSwgdSA9IGUuYmlkZGVycywgYyA9IHdbZS5hZGFwdGVyXSwgbCA9IGdbdl0udGlkLCBmID0gZ1t2XS5hZFVuaXRzUzJTQ29weSwgbSA9IHAuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50aWQgPT09IGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfdW5pdHM6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMnNDb25maWc6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuYWRfdW5pdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IG0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0YXJ0ID0gKDAsIG4udGltZXN0YW1wKSgpLCBpLmJpbmQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGggPSBiLmFkX3VuaXRzLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQoKHQuYmlkcyB8fCBbXSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQodC5iaWRkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nTWVzc2FnZSgnQ0FMTElORyBTMlMgSEVBREVSIEJJRERFUlMgPT09PSAnLmNvbmNhdCh1LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZC5kZWZhdWx0KShoLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKSkpLCBtLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLmVtaXQoXy5FVkVOVFMuQklEX1JFUVVFU1RFRCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYy5jYWxsQmlkcyhiLCBwLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gKDAsIG4uZ2V0QmlkZGVyUmVxdWVzdCkocCwgdC5iaWRkZXJDb2RlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHIuY2FsbChpLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nRXJyb3IoJ21pc3NpbmcgJyArIGUuYWRhcHRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdGFydCA9ICgwLCBuLnRpbWVzdGFtcCkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd1tlLmJpZGRlckNvZGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5sb2dNZXNzYWdlKCdDQUxMSU5HIEJJRERFUiA9PT09PT09ICcuY29uY2F0KGUuYmlkZGVyQ29kZSkpLCBFLmVtaXQoXy5FVkVOVFMuQklEX1JFUVVFU1RFRCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICgwLCBzLmFqYXhCdWlsZGVyKShhLCBvID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBvLnJlcXVlc3QuYmluZChudWxsLCBlLmJpZGRlckNvZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBvLmRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdm9pZCAwKSwgbCA9IGkuYmluZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5jb25maWcucnVuV2l0aEJpZGRlcihlLmJpZGRlckNvZGUsIG4uYmluZC5jYWxsKHQuY2FsbEJpZHMsIHQsIGUsIHIuYmluZChlKSwgbCwgZCwgYywgdS5jb25maWcuY2FsbGJhY2tXaXRoQmlkZGVyKGUuYmlkZGVyQ29kZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ0Vycm9yKCcnLmNvbmNhdChlLmJpZGRlckNvZGUsICcgQmlkIEFkYXB0ZXIgZW1pdHRlZCBhbiB1bmNhdWdodCBlcnJvciB3aGVuIHBhcnNpbmcgdGhlaXIgYmlkUmVxdWVzdCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3Q6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ1dhcm4oJ2NhbGxCaWRzIGV4ZWN1dGVkIHdpdGggbm8gYmlkUmVxdWVzdHMuICBXZXJlIHRoZXkgZmlsdGVyZWQgYnkgbGFiZWxzIG9yIHNpemluZz8nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBJLnZpZGVvQWRhcHRlcnMgPSBbXSwgSS5yZWdpc3RlckJpZEFkYXB0ZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiB7fSwgbiA9IHIuc3VwcG9ydGVkTWVkaWFUeXBlcywgaSA9IHZvaWQgMCA9PT0gbiA/IFtdIDogbjsKICAgICAgICAgICAgICAgICAgICBlICYmIHQgPyAnZnVuY3Rpb24nID09IHR5cGVvZiBlLmNhbGxCaWRzID8gKHdbdF0gPSBlLCAoMCwgZC5kZWZhdWx0KShpLCAndmlkZW8nKSAmJiBJLnZpZGVvQWRhcHRlcnMucHVzaCh0KSwgKDAsIGQuZGVmYXVsdCkoaSwgJ25hdGl2ZScpICYmIG8ubmF0aXZlQWRhcHRlcnMucHVzaCh0KSkgOiBPLmxvZ0Vycm9yKCdCaWRkZXIgYWRhcHRvciBlcnJvciBmb3IgYmlkZGVyIGNvZGU6ICcgKyB0ICsgJ2JpZGRlciBtdXN0IGltcGxlbWVudCBhIGNhbGxCaWRzKCkgZnVuY3Rpb24nKSA6IE8ubG9nRXJyb3IoJ2JpZEFkYXB0ZXIgb3IgYmlkZGVyQ29kZSBub3Qgc3BlY2lmaWVkJyk7CiAgICAgICAgICAgICAgICB9LCBJLmFsaWFzQmlkQWRhcHRlciA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gd1t0XSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHdbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBULmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5iaWRkZXJzICYmIHIuYmlkZGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByICYmIHIuYmlkZGVyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAoMCwgZC5kZWZhdWx0KShuLCB0KSA/IEFbdF0gPSBlIDogaS5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ0Vycm9yKCdiaWRkZXJDb2RlICInICsgZSArICciIGlzIG5vdCBhbiBleGlzdGluZyBiaWRkZXIuJywgJ2FkYXB0ZXJNYW5hZ2VyLmFsaWFzQmlkQWRhcHRlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCB1ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGQuZGVmYXVsdCkoSS52aWRlb0FkYXB0ZXJzLCBlKSAmJiB0LnB1c2goJ3ZpZGVvJyksICgwLCBkLmRlZmF1bHQpKG8ubmF0aXZlQWRhcHRlcnMsIGUpICYmIHQucHVzaCgnbmF0aXZlJyksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uY29uc3RydWN0b3IucHJvdG90eXBlICE9IE9iamVjdC5wcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgPSBuZXcgbi5jb25zdHJ1Y3RvcigpKS5zZXRCaWRkZXJDb2RlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbi5nZXRTcGVjKCksIGwgPSByICYmIHIuZ3ZsaWQsIGYgPSByICYmIHIuc2tpcFBic0FsaWFzaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gKDAsIGEubmV3QmlkZGVyKShoKHt9LCBjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwUGJzQWxpYXNpbmc6IGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBBW3RdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5yZWdpc3RlckJpZEFkYXB0ZXIocywgdCwgeyBzdXBwb3J0ZWRNZWRpYVR5cGVzOiB1IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nRXJyb3IoZSArICcgYmlkZGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFsaWFzaW5nLicsICdhZGFwdGVyTWFuYWdlci5hbGlhc0JpZEFkYXB0ZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nTWVzc2FnZSgnYWxpYXMgbmFtZSAiJyArIHQgKyAnIiBoYXMgYmVlbiBhbHJlYWR5IHNwZWNpZmllZC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBJLnJlZ2lzdGVyQW5hbHl0aWNzQWRhcHRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmFkYXB0ZXIsIHIgPSBlLmNvZGUsIG4gPSBlLmd2bGlkOwogICAgICAgICAgICAgICAgICAgIHQgJiYgciA/ICdmdW5jdGlvbicgPT0gdHlwZW9mIHQuZW5hYmxlQW5hbHl0aWNzID8gKHQuY29kZSA9IHIsIHhbcl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXI6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiBuCiAgICAgICAgICAgICAgICAgICAgfSkgOiBPLmxvZ0Vycm9yKCdQcmViaWQgRXJyb3I6IEFuYWx5dGljcyBhZGFwdG9yIGVycm9yIGZvciBhbmFseXRpY3MgIicuY29uY2F0KHIsICciXG4gICAgICAgIGFuYWx5dGljcyBhZGFwdGVyIG11c3QgaW1wbGVtZW50IGFuIGVuYWJsZUFuYWx5dGljcygpIGZ1bmN0aW9uJykpIDogTy5sb2dFcnJvcignUHJlYmlkIEVycm9yOiBhbmFseXRpY3NBZGFwdGVyIG9yIGFuYWx5dGljc0NvZGUgbm90IHNwZWNpZmllZCcpOwogICAgICAgICAgICAgICAgfSwgSS5lbmFibGVBbmFseXRpY3MgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIE8uaXNBcnJheShlKSB8fCAoZSA9IFtlXSksIE8uX2VhY2goZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB4W2UucHJvdmlkZXJdLmFkYXB0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0LmVuYWJsZUFuYWx5dGljcyhlKSA6IE8ubG9nRXJyb3IoJ1ByZWJpZCBFcnJvcjogbm8gYW5hbHl0aWNzIGFkYXB0ZXIgZm91bmQgaW4gcmVnaXN0cnkgZm9yXG4gICAgICAgICcuY29uY2F0KGUucHJvdmlkZXIsICcuJykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgSS5nZXRCaWRBZGFwdGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd1tlXTsKICAgICAgICAgICAgICAgIH0sIEkuZ2V0QW5hbHl0aWNzQWRhcHRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhbZV07CiAgICAgICAgICAgICAgICB9LCBJLmNhbGxUaW1lZE91dEJpZGRlcnMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHQgPSB0Lm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wYXJhbXMgPSBPLmdldFVzZXJDb25maWd1cmVkUGFyYW1zKGUsIHQuYWRVbml0Q29kZSwgdC5iaWRkZXIpLCB0LnRpbWVvdXQgPSByLCB0OwogICAgICAgICAgICAgICAgICAgIH0pLCB0ID0gTy5ncm91cEJ5KHQsICdiaWRkZXInKSwgT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBNKGUsICdvblRpbWVvdXQnLCB0W2VdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIEkuY2FsbEJpZFdvbkJpZGRlciA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdC5wYXJhbXMgPSBPLmdldFVzZXJDb25maWd1cmVkUGFyYW1zKHIsIHQuYWRVbml0Q29kZSwgdC5iaWRkZXIpLCBmLmFkdW5pdENvdW50ZXIuaW5jcmVtZW50QmlkZGVyV2luc0NvdW50ZXIodC5hZFVuaXRDb2RlLCB0LmJpZGRlciksIE0oZSwgJ29uQmlkV29uJywgdCk7CiAgICAgICAgICAgICAgICB9LCBJLmNhbGxTZXRUYXJnZXRpbmdCaWRkZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIE0oZSwgJ29uU2V0VGFyZ2V0aW5nJywgdCk7CiAgICAgICAgICAgICAgICB9LCBJLmNhbGxCaWRWaWV3YWJsZUJpZGRlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgTShlLCAnb25CaWRWaWV3YWJsZScsIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBVID0gSTsKICAgICAgICAgICAgICAgIHQuZGVmYXVsdCA9IFU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5wcm9jZXNzTmF0aXZlQWRVbml0UGFyYW1zID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnR5cGUgJiYgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhKDAsIG8uZGVmYXVsdCkoT2JqZWN0LmtleXMoZCksIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBpLmxvZ0Vycm9yKSgnJy5jb25jYXQoZSwgJyBuYXRpdmVQYXJhbSBpcyBub3Qgc3VwcG9ydGVkJykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkW2UudHlwZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSwgdC5uYXRpdmVCaWRJc1ZhbGlkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBpLmdldEJpZFJlcXVlc3QpKGUucmVxdWVzdElkLCB0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoISgwLCBpLmRlZXBBY2Nlc3MpKGUsICduYXRpdmUuY2xpY2tVcmwnKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaS5kZWVwQWNjZXNzKShlLCAnbmF0aXZlLmltYWdlJykgJiYgKCEoMCwgaS5kZWVwQWNjZXNzKShlLCAnbmF0aXZlLmltYWdlLmhlaWdodCcpIHx8ICEoMCwgaS5kZWVwQWNjZXNzKShlLCAnbmF0aXZlLmltYWdlLndpZHRoJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpLmRlZXBBY2Nlc3MpKGUsICduYXRpdmUuaWNvbicpICYmICghKDAsIGkuZGVlcEFjY2VzcykoZSwgJ25hdGl2ZS5pY29uLmhlaWdodCcpIHx8ICEoMCwgaS5kZWVwQWNjZXNzKShlLCAnbmF0aXZlLmljb24ud2lkdGgnKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIubmF0aXZlUGFyYW1zOwogICAgICAgICAgICAgICAgICAgIGlmICghbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBhID0gT2JqZWN0LmtleXMobikuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltlXS5yZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMgPSBPYmplY3Qua2V5cyhlLm5hdGl2ZSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYXRpdmVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgby5kZWZhdWx0KShzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHQuZmlyZU5hdGl2ZVRyYWNrZXJzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAnY2xpY2snID09PSBlLmFjdGlvbiA/IHIgPSB0Lm5hdGl2ZSAmJiB0Lm5hdGl2ZS5jbGlja1RyYWNrZXJzIDogKHIgPSB0Lm5hdGl2ZSAmJiB0Lm5hdGl2ZS5pbXByZXNzaW9uVHJhY2tlcnMsIHQubmF0aXZlICYmIHQubmF0aXZlLmphdmFzY3JpcHRUcmFja2VycyAmJiAoMCwgaS5pbnNlcnRIdG1sSW50b0lmcmFtZSkodC5uYXRpdmUuamF2YXNjcmlwdFRyYWNrZXJzKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyIHx8IFtdKS5mb3JFYWNoKGkudHJpZ2dlclBpeGVsKSwgZS5hY3Rpb247CiAgICAgICAgICAgICAgICB9LCB0LmdldE5hdGl2ZVRhcmdldGluZyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAoMCwgaS5kZWVwQWNjZXNzKSh0LCAnbmF0aXZlUGFyYW1zLnJlbmRlcmVyVXJsJykgPyBlLm5hdGl2ZS5yZW5kZXJlclVybCA9IGYodC5uYXRpdmVQYXJhbXMucmVuZGVyZXJVcmwpIDogKDAsIGkuZGVlcEFjY2VzcykodCwgJ25hdGl2ZVBhcmFtcy5hZFRlbXBsYXRlJykgJiYgKGUubmF0aXZlLmFkVGVtcGxhdGUgPSBmKHQubmF0aXZlUGFyYW1zLmFkVGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICExICE9PSAoMCwgaS5kZWVwQWNjZXNzKSh0LCAnbmF0aXZlUGFyYW1zLnNlbmRUYXJnZXRpbmdLZXlzJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUubmF0aXZlKS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYWRUZW1wbGF0ZScgIT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcy5OQVRJVkVfS0VZU1tvXSwgdSA9IGYoZS5uYXRpdmVbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpLmRlZXBBY2Nlc3MpKHQsICdtZWRpYVR5cGVzLm5hdGl2ZS4nLmNvbmNhdChvLCAnLnNlbmRJZCcpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAnJy5jb25jYXQoYSwgJzonKS5jb25jYXQoZS5hZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKDAsIGkuZGVlcEFjY2VzcykodCwgJ25hdGl2ZVBhcmFtcy4nLmNvbmNhdChvLCAnLnNlbmRUYXJnZXRpbmdLZXlzJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiB1ICYmICgnYm9vbGVhbicgPT0gdHlwZW9mIGMgPyBjIDogbikgJiYgKHJbYV0gPSB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgfSwgdC5nZXRBc3NldE1lc3NhZ2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnYXNzZXRSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkSWQ6IGUuYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRzOiBbXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdC5uYXRpdmUuaGFzT3duUHJvcGVydHkoJ2FkVGVtcGxhdGUnKSAmJiAoci5hZFRlbXBsYXRlID0gZih0Lm5hdGl2ZS5hZFRlbXBsYXRlKSk7CiAgICAgICAgICAgICAgICAgICAgdC5uYXRpdmUuaGFzT3duUHJvcGVydHkoJ3JlbmRlcmVyVXJsJykgJiYgKHIucmVuZGVyZXJVcmwgPSBmKHQubmF0aXZlLnJlbmRlcmVyVXJsKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXNzZXRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAoMCwgaS5nZXRLZXlCeVZhbHVlKShzLk5BVElWRV9LRVlTLCBlKSwgbyA9IGYodC5uYXRpdmVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICByLmFzc2V0cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgfSwgdC5nZXRBbGxBc3NldHNNZXNzYWdlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Fzc2V0UmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBhZElkOiBlLmFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2V0czogW10KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0Lm5hdGl2ZSkuZm9yRWFjaChmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2FkVGVtcGxhdGUnID09PSBlICYmIHQubmF0aXZlW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmFkVGVtcGxhdGUgPSBmKHQubmF0aXZlW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgncmVuZGVyZXJVcmwnID09PSBlICYmIHQubmF0aXZlW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJlbmRlcmVyVXJsID0gZih0Lm5hdGl2ZVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodC5uYXRpdmVbZV0gJiYgcy5OQVRJVkVfS0VZUy5oYXNPd25Qcm9wZXJ0eShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBmKHQubmF0aXZlW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXNzZXRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0sIHQuaGFzTm9uTmF0aXZlQmlkZGVyID0gdC5uYXRpdmVCaWRkZXIgPSB0Lm5hdGl2ZUFkVW5pdCA9IHQuTkFUSVZFX1RBUkdFVElOR19LRVlTID0gdC5uYXRpdmVBZGFwdGVycyA9IHZvaWQgMCwgcig0KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1KTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gcig3KSwgbyA9IChuID0gcigzMSkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHMgPSByKDM2KSwgdSA9IFtdOwogICAgICAgICAgICAgICAgdC5uYXRpdmVBZGFwdGVycyA9IHU7CiAgICAgICAgICAgICAgICB2YXIgYyA9IE9iamVjdC5rZXlzKHMuTkFUSVZFX0tFWVMpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzLk5BVElWRV9LRVlTW2VdOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0Lk5BVElWRV9UQVJHRVRJTkdfS0VZUyA9IGM7CiAgICAgICAgICAgICAgICB2YXIgZCA9IHsKICAgICAgICAgICAgICAgICAgICBpbWFnZTogewogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogeyByZXF1aXJlZDogITAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHsgcmVxdWlyZWQ6ICEwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNwb25zb3JlZEJ5OiB7IHJlcXVpcmVkOiAhMCB9LAogICAgICAgICAgICAgICAgICAgICAgICBjbGlja1VybDogeyByZXF1aXJlZDogITAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogeyByZXF1aXJlZDogITEgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogeyByZXF1aXJlZDogITEgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0Lm5hdGl2ZUFkVW5pdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnbmF0aXZlJyA9PT0gZS5tZWRpYVR5cGUsIHIgPSAoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy5uYXRpdmUnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIG8uZGVmYXVsdCkodSwgZS5iaWRkZXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQubmF0aXZlQmlkZGVyID0gbDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gYShlKSAmJiBlLnVybCA/IGUudXJsIDogZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuaGFzTm9uTmF0aXZlQmlkZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWwoZSk7CiAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghbihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgKHIgPSBlLnRvU3RyaW5nKSAmJiAhbihpID0gci5jYWxsKGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIChyID0gZS52YWx1ZU9mKSAmJiAhbihpID0gci5jYWxsKGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIChyID0gZS50b1N0cmluZykgJiYgIW4oaSA9IHIuY2FsbChlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignQ2FuXCd0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZScpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig5MSksIGkgPSByKDc3KSwgbyA9IHIoNTcpLCBhID0gcig4OSksIHMgPSByKDUwKSwgdSA9IHIoMTU3KSwgYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICB0LmYgPSByKDI4KSA/IGMgOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlID0gbyhlKSwgdCA9IGEodCwgITApLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzKGUsIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKCFuLmYuY2FsbChlLCB0KSwgZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHQuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDY3KSwgaSA9IHIoMTkpKCd0b1N0cmluZ1RhZycpLCBvID0gJ0FyZ3VtZW50cycgPT0gbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIGE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/ICdVbmRlZmluZWQnIDogbnVsbCA9PT0gZSA/ICdOdWxsJyA6ICdzdHJpbmcnID09IHR5cGVvZiAociA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSh0ID0gT2JqZWN0KGUpLCBpKSkgPyByIDogbyA/IG4odCkgOiAnT2JqZWN0JyA9PSAoYSA9IG4odCkpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQuY2FsbGVlID8gJ0FyZ3VtZW50cycgOiBhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gT2JqZWN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBpLmRlZmF1bHQpKGUsIHQsIHIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDI4NCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvLCBhLCBzID0gcig2NCksIHUgPSByKDE4KSwgYyA9IHIoNTMpLCBkID0gcig5MiksIGwgPSByKDE0KSwgZiA9IHIoMjMpLCBwID0gcig2NSksIGcgPSByKDg0KSwgbSA9IHIoMTE3KSwgdiA9IHIoMTM3KSwgYiA9IHIoMTk2KS5zZXQsIHkgPSByKDI4NSkoKSwgaCA9IHIoMTk4KSwgUyA9IHIoMjg2KSwgTyA9IHIoMjg3KSwgXyA9IHIoMjg4KSwgRSA9IHUuVHlwZUVycm9yLCBJID0gdS5wcm9jZXNzLCB3ID0gSSAmJiBJLnZlcnNpb25zLCBBID0gdyAmJiB3LnY4IHx8ICcnLCBUID0gdS5Qcm9taXNlLCB4ID0gJ3Byb2Nlc3MnID09IGQoSSksIEMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfSwgUCA9IGkgPSBoLmYsIGogPSAhIWZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gVC5yZXNvbHZlKDEpLCB0ID0gKGUuY29uc3RydWN0b3IgPSB7fSlbcigxOSkoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKEMsIEMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHggfHwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50KSAmJiBlLnRoZW4oQykgaW5zdGFuY2VvZiB0ICYmIDAgIT09IEEuaW5kZXhPZignNi42JykgJiYgLTEgPT09IE8uaW5kZXhPZignQ2hyb21lLzY2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oKSwgUiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghZihlKSB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiAodCA9IGUudGhlbikpICYmIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgRCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5fbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fbiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLl9jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGUuX3YsIGkgPSAxID09IGUuX3MsIG8gPSAwLCBhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgYSwgcyA9IGkgPyB0Lm9rIDogdC5mYWlsLCB1ID0gdC5yZXNvbHZlLCBjID0gdC5yZWplY3QsIGQgPSB0LmRvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID8gKGkgfHwgKDIgPT0gZS5faCAmJiBNKGUpLCBlLl9oID0gMSksICEwID09PSBzID8gciA9IG4gOiAoZCAmJiBkLmVudGVyKCksIHIgPSBzKG4pLCBkICYmIChkLmV4aXQoKSwgYSA9ICEwKSksIHIgPT09IHQucHJvbWlzZSA/IGMoRSgnUHJvbWlzZS1jaGFpbiBjeWNsZScpKSA6IChvID0gUihyKSkgPyBvLmNhbGwociwgdSwgYykgOiB1KHIpKSA6IGMobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmICFhICYmIGQuZXhpdCgpLCBjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07IHIubGVuZ3RoID4gbzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShyW28rK10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9jID0gW10sIGUuX24gPSAhMSwgdCAmJiAhZS5faCAmJiBrKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYi5jYWxsKHUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuLCBpID0gZS5fdiwgbyA9IE4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyAmJiAodCA9IFMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID8gSS5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCBpLCBlKSA6IChyID0gdS5vbnVuaGFuZGxlZHJlamVjdGlvbikgPyByKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAobiA9IHUuY29uc29sZSkgJiYgbi5lcnJvciAmJiBuLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5faCA9IHggfHwgTihlKSA/IDIgOiAxKSwgZS5fYSA9IHZvaWQgMCwgbyAmJiB0LmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0LnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIE4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAhPT0gZS5faCAmJiAwID09PSAoZS5fYSB8fCBlLl9jKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSwgTSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuY2FsbCh1LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPyBJLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBlKSA6ICh0ID0gdS5vbnJlamVjdGlvbmhhbmRsZWQpICYmIHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBlLl92CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgVSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgdC5fZCB8fCAodC5fZCA9ICEwLCAodCA9IHQuX3cgfHwgdCkuX3YgPSBlLCB0Ll9zID0gMiwgdC5fYSB8fCAodC5fYSA9IHQuX2Muc2xpY2UoKSksIEQodCwgITApKTsKICAgICAgICAgICAgICAgICAgICB9LCBCID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIuX2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX2QgPSAhMCwgciA9IHIuX3cgfHwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRSgnUHJvbWlzZSBjYW5cJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ID0gUihlKSkgPyB5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsKGUsIGMoQiwgbiwgMSksIGMoVSwgbiwgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLmNhbGwobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IChyLl92ID0gZSwgci5fcyA9IDEsIEQociwgITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLmNhbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Q6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaiB8fCAoVCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZyh0aGlzLCBULCAnUHJvbWlzZScsICdfaCcpLCBwKGUpLCBuLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZShjKEIsIHRoaXMsIDEpLCBjKFUsIHRoaXMsIDEpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFUuY2FsbCh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAobiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYyA9IFtdLCB0aGlzLl9hID0gdm9pZCAwLCB0aGlzLl9zID0gMCwgdGhpcy5fZCA9ICExLCB0aGlzLl92ID0gdm9pZCAwLCB0aGlzLl9oID0gMCwgdGhpcy5fbiA9ICExOwogICAgICAgICAgICAgICAgfSkucHJvdG90eXBlID0gcig4NSkoVC5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFAodih0aGlzLCBUKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLm9rID0gJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSB8fCBlLCByLmZhaWwgPSAnZnVuY3Rpb24nID09IHR5cGVvZiB0ICYmIHQsIHIuZG9tYWluID0geCA/IEkuZG9tYWluIDogdm9pZCAwLCB0aGlzLl9jLnB1c2gociksIHRoaXMuX2EgJiYgdGhpcy5fYS5wdXNoKHIpLCB0aGlzLl9zICYmIEQodGhpcywgITEpLCByLnByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbih2b2lkIDAsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IG4oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UgPSBlLCB0aGlzLnJlc29sdmUgPSBjKEIsIGUsIDEpLCB0aGlzLnJlamVjdCA9IGMoVSwgZSwgMSk7CiAgICAgICAgICAgICAgICB9LCBoLmYgPSBQID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gVCB8fCBlID09PSBhID8gbmV3IG8oZSkgOiBpKGUpOwogICAgICAgICAgICAgICAgfSksIGwobC5HICsgbC5XICsgbC5GICogIWosIHsgUHJvbWlzZTogVCB9KSwgcig3OSkoVCwgJ1Byb21pc2UnKSwgcigxMTgpKCdQcm9taXNlJyksIGEgPSByKDYyKS5Qcm9taXNlLCBsKGwuUyArIGwuRiAqICFqLCAnUHJvbWlzZScsIHsKICAgICAgICAgICAgICAgICAgICByZWplY3Q6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCB0LnJlamVjdCkoZSksIHQucHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgbChsLlMgKyBsLkYgKiAocyB8fCAhaiksICdQcm9taXNlJywgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfKHMgJiYgdGhpcyA9PT0gYSA/IFQgOiB0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgbChsLlMgKyBsLkYgKiAhKGogJiYgcigxMTkpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgVC5hbGwoZSkuY2F0Y2goQyk7CiAgICAgICAgICAgICAgICB9KSksICdQcm9taXNlJywgewogICAgICAgICAgICAgICAgICAgIGFsbDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCByID0gUCh0KSwgbiA9IHIucmVzb2x2ZSwgaSA9IHIucmVqZWN0LCBvID0gUyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbyA9IDAsIGEgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0oZSwgITEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbysrLCB1ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh2b2lkIDApLCBhKyssIHQucmVzb2x2ZShlKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IHx8ICh1ID0gITAsIHJbc10gPSBlLCAtLWEgfHwgbihyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAtLWEgfHwgbihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5lICYmIGkoby52KSwgci5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcmFjZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCByID0gUCh0KSwgbiA9IHIucmVqZWN0LCBpID0gUyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShlLCAhMSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZXNvbHZlKGUpLnRoZW4oci5yZXNvbHZlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5lICYmIG4oaS52KSwgci5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigyNiksIHIoNCksIHIoMiksIHIoMSksIHIoMyksIHIoMCksIHIoNSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOCksIGkgPSBnKHIoMzQpKSwgbyA9IGcocig5NCkpLCBhID0gZyhyKDEyMCkpLCBzID0gcig1NSksIHUgPSByKDM5KSwgYyA9IHIoMzUpLCBkID0gZyhyKDQ4KSksIGwgPSBnKHIoNTYpKSwgZiA9IGcocigyOSkpLCBwID0gcigyOTcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG0gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBiID0geyB2ZXJzaW9uQ29udHJvbDogITEgfTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICByaWNoT2JqZWN0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSB7fSwgciA9IHt9LCBnID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgfHwgJ29iamVjdCcgIT09IHYodCkgPyBuLmJiTG9nZ2VyLmxvZ1dhcm4oJ0luaXRpYWwgdmFsdWUgbm90IHBpY2tlZCB1cCBmb3IgZXZlbnRmdWwgb2JqZWN0LiBJbnZhbGlkIHR5cGUuJywgdCkgOiAoZSA9IHQsIGcgPSBtKGcsIHIpKSwgZy5zeW5jVmFsdWUgJiYgSSgnKicsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZy5zeW5jVmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZy5zeW5jVmFsdWUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLnN5bmNWYWx1ZVt0XSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBnLnN5bmNWYWx1ZSAmJiBnLnN5bmNWYWx1ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBBcnJheS5pc0FycmF5KHIpID8gciA6IFtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gKDAsIGwuZGVmYXVsdCkoZSwgbiksIHQgPSAoMCwgbC5kZWZhdWx0KSh0LCBuKSwgUyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMgPSAoMCwgdS5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAociwgaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gKDAsIGMuY2xvbmVEZWVwKShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHIgJiYgKGkgPSByLCByID0gJyonKSwgJ29iamVjdCcgPT09IHYoaSkgfHwgJyonICE9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnKicgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoMCwgZC5kZWZhdWx0KShpKSA/IHt9IDogYSAmJiBhLmZvcmNlVXBkYXRlID8gaSA6ICgwLCBmLmRlZmF1bHQpKHt9LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgby5kZWZhdWx0KShlLCByLCBpKSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBFKHIsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiAoMCwgby5kZWZhdWx0KSh0LCByLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKHcoZSwgcyksIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYmJMb2dnZXIubG9nRXJyb3IoJ1doZW4gc2V0dGluZyBhbGwgdG9waWNzOiB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUodCwgZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZXhwaXJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gKDAsIHAuZXhwaXJlQWN0aW9uKSh0LmV4cGlyZXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGYuZGVmYXVsdCkodCwgeyBleHBpcmVzOiByIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiBudWxsLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmICcqJyAhPT0gbiA/ICgwLCBpLmRlZmF1bHQpKGUsIG4pIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBKHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHIpLmZpbHRlcihmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKDAsIGEuZGVmYXVsdCkoKDAsIGkuZGVmYXVsdCkoZSwgciksICgwLCBpLmRlZmF1bHQpKHQsIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBlICYmIChpID0gZSwgZSA9ICcqJyksICdmdW5jdGlvbicgPT0gdHlwZW9mIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltlXSB8fCAocltlXSA9IFtdKSwgcltlXS5wdXNoKGkpLCB2b2lkIDAgIT09IEkoZSkgJiYgKDAsIHMubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoSShlKSwgeyBpZDogJ2luaXRpYWxTZXQnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbZV0uc3BsaWNlKHJbZV0uaW5kZXhPZihpKSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYmJMb2dnZXIubG9nRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocltpXSAmJiBBcnJheS5pc0FycmF5KHJbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByW2ldW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gSShpKSAmJiAoMCwgcy5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihJKGkpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEgPSAwOyBhIDwgcltpXS5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyWycqJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHJbJyonXVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcy5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihJKCcqJyksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IDA7IGEgPCByWycqJ10ubGVuZ3RoOyBhKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZTogSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlS2V5OiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YTogTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1ldGE6IF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPcHRpb25zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYy5jbG9uZURlZXApKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBvcHRpb25zKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYy5jbG9uZURlZXApKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjMpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW4oZSkgfHwgZS5fdCAhPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIHQgKyAnIHJlcXVpcmVkIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5nZXRFbnZDZmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gbChlKSB8fCBBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZigpICYmIChlLmRldiB8fCBlLnN0YWdlKSA/IGUuZGV2IHx8IGUuc3RhZ2UgOiBlLnByb2Q7CiAgICAgICAgICAgICAgICB9LCB0LmdldEVudlZhbCA9IHQuaXNTdGFnaW5nRW52ID0gdm9pZCAwLCByKDQpLCByKDIpLCByKDEyMyksIHIoOSksIHIoMTI0KTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNSksIGkgPSByKDEyKSwgbyA9IHIoNTkpLCBhID0gZChyKDg2KSksIHMgPSByKDM5KSwgdSA9IGQocigzMTQpKSwgYyA9IHIoNTgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiA9ICgwLCBzLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0YWdlJyA9PT0gKDAsIGMudXJsUXVlcnlBc09iamVjdCkoKS5hZFRhcmdldGluZ19lbnYgfHwgJ3N0YWdlJyA9PT0gZygpIHx8IChlID0gKDAsIG8uZ2V0UGFnZVRhcmdldGluZykoJ2VudicpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGFnaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RldicKICAgICAgICAgICAgICAgICAgICBdLmluZGV4T2YoZSkgPj0gMCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICgwLCBuLmdldENvbmZpZykoJ3BhZ2VUYXJnZXRpbmcuZW52Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YWdpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RldicKICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmlzU3RhZ2luZ0VudiA9IGY7CiAgICAgICAgICAgICAgICB2YXIgcCA9ICgwLCBhLmRlZmF1bHQpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGMudXJsUXVlcnlBc09iamVjdCkoKS5hZFRhcmdldGluZ19lbnYgfHwgZygpIHx8IChmKCkgPyAnc3RhZ2UnIDogJ3Byb2QnKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISgwLCBpLmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnYmlkYmFycmVsLW1ldGFjcml0aWMtcnYuanMnLnNwbGl0KCcuJylbMF0sIHQgPSAoMCwgaS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoJ3Jlc291cmNlJykuZmluZChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAhdC5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCB1LmRlZmF1bHQpKHQubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIuaG9zdG5hbWUgJiYgci5ob3N0bmFtZS5pbmRleE9mKCdhdC5hZHRlY2gucmVkdmVudHVyZXMuaW8nKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IFJlZ0V4cCgnL2xpYi9kaXN0LyguKikvJy5jb25jYXQoZSksICdnbScpLmV4ZWMoci5wYXRobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIG4ubGVuZ3RoID49IDIgJiYgblsxXSA/IG5bMV0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZ2V0RW52VmFsID0gcDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnJ1blF1ZXVlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogW10sIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl0sIGkgPSBlLCBvID0gciwgYSA9IHQsIHMgPSAhMSwgdSA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5iYkxvZ2dlci5hdFZlcmJvc2l0eSg0KS5sb2dJbmZvKCdSdW4gUXVldWUgSXRlbSBBZGRlZCcsIGUpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdFeGVjdXRpbmcgY2FsbGJhY2snLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBseShudWxsLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIG4uYmJMb2dnZXIubG9nRXJyb3IoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGEubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wdXNoKGUpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5maWx0ZXIoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgcyB8fCAocyA9ICEwLCB1ID0gYXJndW1lbnRzLCBhLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ0V4ZWN1dGluZyBjYWxsYmFjaycsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgbi5iYkxvZ2dlci5sb2dFcnJvcihpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAoZSA9IG4uYmJMb2dnZXIuYXRWZXJib3NpdHkoNSkpLmxvZ0luZm8uYXBwbHkoZSwgW2ldLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBoYXNSYW46IHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JhblN0YXR1czogZiwKICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiBkLAogICAgICAgICAgICAgICAgICAgICAgICBwdXNoOiBjCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHQucHJvbWlzZVF1ZXVlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogW10sIHIgPSB0LCBpID0gMCwgbyA9ICExLCBhID0gITEsIHMgPSAoUHJvbWlzZS5yZXNvbHZlKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDQpLmxvZ0luZm8oJ1Byb21pc2UgUXVldWUgSXRlbSBBZGRlZCcsIGUpLCByLnB1c2goZSksICFvICYmIGEgJiYgZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFvOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBkID0gZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSB8fCAoYSA9ICEwKSwgIXUoKSAmJiByW2ldICYmIG5ldyBQcm9taXNlKGZ1bmN0aW9uICh0LCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDUpLmxvZ01lc3NhZ2UoJ1J1bm5pbmcnLCBlLCAnaXRlbScsIGkpLCBjKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID8gbi5iYkxvZ2dlci5hdFZlcmJvc2l0eSg1KS5sb2dFcnJvcignRXJyb3InLCBlLCAnaXRlbScsIGksIG8sICdDYWxsYmFjazonLCByW2ldKSA6IG4uYmJMb2dnZXIuYXRWZXJib3NpdHkoNSkubG9nTWVzc2FnZSgnRmluaXNoZWQnLCBlLCAnaXRlbScsIGkpLCBpKyssIGMoITEpLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW2ldKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4odCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBnZXQgY3VycmVudEluZGV4KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBpc1J1bm5pbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHJlbWFpbmluZ0l0ZW1zKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc2xpY2UoaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXQgc3RhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogcywKICAgICAgICAgICAgICAgICAgICAgICAgcnVuOiBkCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHIoOTUpLCByKDApOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuYmlkQ2FjaGUgPSB2b2lkIDAsIHIoNiksIHIoMTMpLCByKDkpLCByKDExKSwgcig0KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1NCksIHIoNDMpLCByKDE2KTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMDEpLCBpID0gcigyMCksIG8gPSByKDgpLCBhID0gcigzOSksIHMgPSBiKHIoMTg5KSksIHUgPSBiKHIoODYpKSwgYyA9IHIoMjEpLCBkID0gcigxMiksIGwgPSByKDQ0KSwgZiA9IChyKDE1KSwgYihyKDIwOSkpKSwgcCA9IGIocigxMCkpLCBnID0gYihyKDM2KSksIG0gPSByKDQyKSwgdiA9IGIocig1MSkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh5ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBzID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEobiA9IChhID0gcy5uZXh0KCkpLmRvbmUpICYmIChyLnB1c2goYS52YWx1ZSksICF0IHx8IHIubGVuZ3RoICE9PSB0KTsgbiA9ICEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBPID0gKDAsIG8ubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdiaWRDYWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I6ICcjRjdGRkY2JywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dENvbG9yOiAnIzYzOUM2NycKICAgICAgICAgICAgICAgICAgICB9KSwgXyA9ICgwLCBuLmdldEdsb2JhbCkoKSwgRSA9IGcuZGVmYXVsdC5FVkVOVFMuQklEX1dPTiwgSSA9IHAuZGVmYXVsdC5FVkVOVFMsIHcgPSBJLkFEX1ZJRVdBQkxFLCBBID0gSS5CQURfQklELCBUID0gSS5CSURfVVNFRCwgeCA9IEkuQklEX1JFQ1lDTEVELCBDID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0ge30sIHIgPSB7fSwgbiA9IHt9LCBvID0gW10sIHAgPSBbXSwgZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKG5bZS5hZElkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSAoMCwgdS5kZWZhdWx0KShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBQKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhciAmJiAoISghci5pc1ZpZGVvICYmICFyLmFsbG93ZWRUeXBlcy52aWRlbykgfHwgKHQuY29uc3RydWN0b3IgPT09IEFycmF5ID8gdC5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoITApID49IDAgOiByLmdldFNpemVzKCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlIHx8ICdudW1iZXInID09IHR5cGVvZiBlID8gZSA6IGUuam9pbigneCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZihlKSA+PSAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpLCAnfCcpLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdFtlXSAmJiB0W2VdLnBlbmRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSAoMCwgdS5kZWZhdWx0KShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBQKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIXIuY2FjaGUgJiYgIXIubGF6eUxvYWQgfHwgJ21lZGlhbmV0JyA9PT0gZS5iaWRkZXJDb2RlKSB8fCBlLmFkVW5pdENvZGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGUuYWRJZCwgJ3wnKS5jb25jYXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmluZGV4T2YoJy0tJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gaChlLnNwbGl0KCctLScpLCAyKSwgbyA9IGlbMF0sIGEgPSBpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvLCB0ID0gcGFyc2VJbnQoYSksIChyID0gKDAsIGwuZ2V0VW5pdHMpKClbbl0pLnZpZGVvID0gci5nZXRWaWRlb1NwZWModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAoMCwgbC5nZXRVbml0cykoKVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgJiYgciAmJiAoci5jb2RlSW5kZXggPSB0KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9ICgwLCB1LmRlZmF1bHQpKGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IFAodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHkoci5tYXRjaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFAoZS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gKDAsIGYuZGVmYXVsdCkobywgci5tYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhaS5pc1ZpZGVvIHx8ICFpLmFsbG93ZWRUeXBlcy52aWRlbyB8fCAoaS5pc1ZpZGVvIHx8IGkuYWxsb3dlZFR5cGVzLnZpZGVvKSAmJiAndmlkZW8nID09PSBlLm1lZGlhVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChlLmFkSWQsICd8JykuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA8IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHIuZm9yVGFyZ2V0aW5nID8gIUkoZS5hZElkKSA6IEkoZS5hZElkKSkgJiYgQyhlLCB0KSAmJiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUubWVkaWFUeXBlIHx8ICduYXRpdmUnICE9PSBlLm1lZGlhVHlwZSB8fCAhbi5hbGxvd2VkVHlwZXMubmF0aXZlKSB8fCAoZS5tZWRpYVR5cGUgJiYgJ2Jhbm5lcicgPT09IGUubWVkaWFUeXBlICYmIG4uYWxsb3dlZFR5cGVzLmJhbm5lciA/IFMoZS5zaXplLCB0KSA6ICEoIWUubWVkaWFUeXBlIHx8ICd2aWRlbycgIT09IGUubWVkaWFUeXBlIHx8ICFuLmFsbG93ZWRUeXBlcy52aWRlbyAmJiAhbi5pc1ZpZGVvKSAmJiBqKGUsIHQsIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmxvZ0Vycm9yKGUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQsIHIpICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdrYXJnbycgPT09IGUuYmlkZGVyQ29kZSAmJiAnMzIweDUwJyA9PT0gJycuY29uY2F0KGUud2lkdGgsICd4JykuY29uY2F0KGUuaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub3JpZ2luYWxDb2RlID8gZS5vcmlnaW5hbENvZGUgPT09IHQgOiBlLmFkVW5pdENvZGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KGUsIHYuZGVmYXVsdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5lcnJvclJlcG9ydGluZy5yZXBvcnQociksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gKDAsIGEuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7IGZvclRhcmdldGluZzogITEgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhYihlKSAmJiAodC5mb3JUYXJnZXRpbmcgPyAhSShlLmFkSWQpIDogSShlLmFkSWQpKSAmJiAhUihlLmV4cGlyZVRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBQKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gRGF0ZS5ub3coKSwgbyA9IG4ubGVuZ3RoLCBhID0gMDsgYSA8IG87IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gblthXS50dGwgPiAwID8gblthXS50dGwgOiAzMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJbblthXS5hZElkXSAmJiBuW2FdLmNwbSA+IDAgPyAoblthXS5leHBpcmVUaW1lID0gaSArIDEwMDAgKiBzLCBPLmF0VmVyYm9zaXR5KDUpLmxvZ01lc3NhZ2UoJ0NhY2hpbmcgQmlkJywgblthXSksIHRbblthXS5hZElkXSA9IG5bYV0sIGVbblthXS5hZElkXSA9IG5bYV0sIHJbblthXS5hZElkXSA9ICEwKSA6IG4gPD0gMCAmJiAocltuW2FdLmFkSWRdID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBlLmFkSWQgJiYgKHRbZS5hZElkXS5vcmlnaW5hbENvZGUgfHwgKHRbZS5hZElkXS5vcmlnaW5hbENvZGUgPSB0W2UuYWRJZF0uYWRVbml0Q29kZSksIGdbZS5hZFVuaXRDb2RlXSA9IGUuYWRJZCwgdFtlLmFkSWRdLmFkVW5pdENvZGUgPSByLCB0W2UuYWRJZF0ucGVuZGluZ0ZvciA9IGUuYWRVbml0Q29kZSwgdFtlLmFkSWRdLnBlbmRpbmdUaW1lc3RhbXAgPSBEYXRlLm5vdygpLCB0W2UuYWRJZF0ucGVuZGluZyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgQiA9ICgwLCBhLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBfLnJlbmRlckFkICYmIF8ucmVuZGVyQWQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IEFycmF5LmlzQXJyYXkoZSkgPyBlLm1hcCh6KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkgOiBPYmplY3QudmFsdWVzKHQpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFkVW5pdENvZGUgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC52YWx1ZXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShlKSB8fCAoZSA9IFtlXSwgdCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAoMCwgbC5nZXRVbml0Q29kZXMpKGUpLCBuID0gW10sIGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gRihyW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIG4ucHVzaChvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIG4ubGVuZ3RoID49IDEgPyBuWzBdIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB6KCksIHIgPSBbXSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0W25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGVuZGluZ0ZvciA9PT0gZSAmJiByLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gci5sZW5ndGggPyByWzBdIDogMCA9PT0gci5sZW5ndGggPyB2b2lkIDAgOiAoMCwgcy5kZWZhdWx0KShyLCBbJ3BlbmRpbmdUaW1lc3RhbXAnXSwgWydkZXNjJ10pWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZC5kb20pKCkud2luZG93LmFkRmxvdyA9ICgwLCBkLmRvbSkoKS53aW5kb3cuYWRGbG93IHx8IHt9LCAoMCwgZC5kb20pKCkud2luZG93LmFkRmxvdy5yZW5kZXJBZCA9IEwsIGMuZXhwb3N1cmVBcGkuZXhwb3NlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhY2hlZEJpZHM6IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRXaW5uaW5nQmlkczogZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBBcnJheS5pc0FycmF5KHQpID8gdC5tYXAoZSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkgOiBvLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZFVuaXRDb2RlID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRGaWx0ZXI6IGsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMuZXhwb3N1cmVBcGkucm9vdFNjb3BlKHsgZ2V0Q2FjaGVkQmlkczogeiB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkRmlsdGVyOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQWRVbml0czogTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhY2hlZEJpZHM6IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxCaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVBlbmRpbmc6IFUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmlkczogTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlV2lubmluZ0JpZHM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IFtdLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmZvclRhcmdldGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE4oZSksIGUgPSBCKGUpLCBPLmF0VmVyYm9zaXR5KDUpLmxvZ0luZm8oJ0FkIGNvZGVzIGJ5IEJpZCBQcmlvcml0eSBPcmRlcicsIGUpLCB0ICYmIEFycmF5LmlzQXJyYXkodCkgJiYgdC5sZW5ndGggPiAwICYmIE0odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB6KCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrKGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nSW5mbygnRXZhbHVhdGluZyB3aW5uaW5nIGJpZHMgZm9yJywgZS5qb2luKCcsICcpLCBuKSwgdCA9ICgwLCBzLmRlZmF1bHQpKG4sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NwbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNwb25zZVRpbWVzdGFtcCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzYycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gW10sIG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gZVtvXSwgdSA9IDA7IHUgPCB0Lmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHRbdV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRChjLCBhLCByKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZm9yVGFyZ2V0aW5nICYmIChPLmxvZ01lc3NhZ2UoJ1dpbm5pbmcgQmlkIEZvdW5kIGZvciAnLmNvbmNhdChhLCAnIC0gYWRJZDogJykuY29uY2F0KGMuYWRJZCwgJywgY3BtOiAnKS5jb25jYXQoYy5jcG0sICcsIG1lZGlhVHlwZTogJykuY29uY2F0KGMubWVkaWFUeXBlLCAnLCBiaWRkZXI6ICcpLmNvbmNhdChjLmJpZGRlckNvZGUpKSwgVShjLCBhKSksIGkucHVzaChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVByaW9yaXR5T3JkZXI6IEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCaWRCeUFkSWQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF0ZXN0UGVuZGluZ0JpZHM6IFYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXRlc3RQZW5kaW5nQmlkOiBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGF0ZXN0UGVuZGluZ0JpZFRhcmdldGluZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB0LmFkc2VydmVyVGFyZ2V0aW5nIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBMaXN0ZW5lcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmV2ZW50RW1pdHRlci5vbihBLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBvLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gb1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuYWRJZCA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wdXNoKHIpLCBuW3IuYWRJZF0gPSAhMCwgTy5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdCYWQgYmlkIGFkIHJlbmRlciBhdHRlbXB0ZWQgYW5kIGludGVyY2VwdGVkJywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ldmVudEVtaXR0ZXIub24odywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdbZV0gJiYgdFtnW2VdXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdFtnW2VdXS5hZElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuW3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5hdFZlcmJvc2l0eSgxKS5sb2dNZXNzYWdlKCdSZWN5Y2xpbmcgQmlkJywgdFtyXSksIGkuZXZlbnRFbWl0dGVyLmVtaXQoeCwgdFtyXSksIHRbcl0ucGVuZGluZyA9ICExLCB0W3JdLnBlbmRpbmdGb3IgPSBudWxsLCBkZWxldGUgZ1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBfLnF1ZS5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5vbkV2ZW50KEUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IGUuYWRJZCwgdm9pZCAodFtyXSAmJiAoTy5hdFZlcmJvc2l0eSgxKS5sb2dNZXNzYWdlKCdVc2VkIEJpZCcsIHRbcl0pLCBpLmV2ZW50RW1pdHRlci5lbWl0KFQsIHRbcl0pLCBuW3JdID0gITAsIG8ucHVzaCh0W3JdKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuYmlkQ2FjaGUgPSBDOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0R2xvYmFsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGJqczsKICAgICAgICAgICAgICAgIH0sIHdpbmRvdy5wYmpzID0gd2luZG93LnBianMgfHwge30sIHdpbmRvdy5wYmpzLmNtZCA9IHdpbmRvdy5wYmpzLmNtZCB8fCBbXSwgd2luZG93LnBianMucXVlID0gd2luZG93LnBianMucXVlIHx8IFtdLCB3aW5kb3cuX3BianNHbG9iYWxzID0gd2luZG93Ll9wYmpzR2xvYmFscyB8fCBbXSwgd2luZG93Ll9wYmpzR2xvYmFscy5wdXNoKCdwYmpzJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjcpLCBpID0gcigzMzIpLCBvID0gcigxMDgpOwogICAgICAgICAgICAgICAgcigxMDkpKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoZSwgdCwgciwgYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUodGhpcyksIGkgPSBudWxsID09IHIgPyB2b2lkIDAgOiByW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaSA/IGkuY2FsbChyLCBuKSA6IG5ldyBSZWdFeHAocilbdF0oU3RyaW5nKG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYShyLCBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbihlKSwgdSA9IFN0cmluZyh0aGlzKSwgYyA9IHMubGFzdEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShjLCAwKSB8fCAocy5sYXN0SW5kZXggPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbyhzLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHMubGFzdEluZGV4LCBjKSB8fCAocy5sYXN0SW5kZXggPSBjKSwgbnVsbCA9PT0gZCA/IC0xIDogZC5pbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmFqYXhCdWlsZGVyID0gdSwgdC5hamF4ID0gdm9pZCAwLCByKDI2KSwgcig0KSwgcigyKSwgcigxMDIpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYSA9IHIoNyksIHMgPSB1KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAzMDAwLCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7fSwgciA9IHQucmVxdWVzdCwgcyA9IHQuZG9uZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIHUsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF8wNzk1MzAyYzIyMzkwMmVlID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wNzk1MzAyYzIyMzkwMmVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrXzZiZjI4ZmRhZDZjNjMxMzcuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsLCBmID0gZC5tZXRob2QgfHwgKGMgPyAnUE9TVCcgOiAnR0VUJyksIHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuaHJlZiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gJ29iamVjdCcgPT09IG8odSkgJiYgbnVsbCAhPT0gdSA/IHUgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sb2dNZXNzYWdlKCd4aHIgc3VjY2VzcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nRXJyb3IoJ3hociBlcnJvcicsIG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdSAmJiAoZy5zdWNjZXNzID0gdSksIChsID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQgPT09IGwucmVhZHlTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBzICYmIHMocC5vcmlnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGwuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID49IDIwMCAmJiBlIDwgMzAwIHx8IDMwNCA9PT0gZSA/IGcuc3VjY2VzcyhsLnJlc3BvbnNlVGV4dCwgbCkgOiBnLmVycm9yKGwuc3RhdHVzVGV4dCwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5jb25maWcuZ2V0Q29uZmlnKCdkaXNhYmxlQWpheFRpbWVvdXQnKSB8fCAobC5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sb2dFcnJvcignICB4aHIgdGltZW91dCBhZnRlciAnLCBsLnRpbWVvdXQsICdtcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICdHRVQnID09PSBmICYmIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gYS5wYXJzZVVybCh0LCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobS5zZWFyY2gsIGMpLCB0ID0gYS5idWlsZFVybChtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLm9wZW4oZiwgdCwgITApLCBuLmNvbmZpZy5nZXRDb25maWcoJ2Rpc2FibGVBamF4VGltZW91dCcpIHx8IChsLnRpbWVvdXQgPSBlKSwgZC53aXRoQ3JlZGVudGlhbHMgJiYgKGwud2l0aENyZWRlbnRpYWxzID0gITApLCBhLl9lYWNoKGQuY3VzdG9tSGVhZGVycywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuc2V0UmVxdWVzdEhlYWRlcih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGQucHJlZmxpZ2h0ICYmIGwuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0ZWQtV2l0aCcsICdYTUxIdHRwUmVxdWVzdCcpLCBsLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGQuY29udGVudFR5cGUgfHwgJ3RleHQvcGxhaW4nKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgciAmJiByKHAub3JpZ2luKSwgJ1BPU1QnID09PSBmICYmIGMgPyBsLnNlbmQoYykgOiBsLnNlbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nRXJyb3IoJ3hociBjb25zdHJ1Y3Rpb24nLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wNzk1MzAyYzIyMzkwMmVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfMDc5NTMwMmMyMjM5MDJlZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuYWpheCA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjIpLCBpID0gcigxOCksIG8gPSBpWydfX2NvcmUtanNfc2hhcmVkX18nXSB8fCAoaVsnX19jb3JlLWpzX3NoYXJlZF9fJ10gPSB7fSk7CiAgICAgICAgICAgICAgICAoZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1tlXSB8fCAob1tlXSA9IHZvaWQgMCAhPT0gdCA/IHQgOiB7fSk7CiAgICAgICAgICAgICAgICB9KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbi52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgIG1vZGU6IHIoNjQpID8gJ3B1cmUnIDogJ2dsb2JhbCcsCiAgICAgICAgICAgICAgICAgICAgY29weXJpZ2h0OiAnXHhBOSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjkpLCBpID0gTWF0aC5tYXgsIG8gPSBNYXRoLm1pbjsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gbihlKSkgPCAwID8gaShlICsgdCwgMCkgOiBvKGUsIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHQuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTkpKCd1bnNjb3BhYmxlcycpLCBpID0gQXJyYXkucHJvdG90eXBlOwogICAgICAgICAgICAgICAgbnVsbCA9PSBpW25dICYmIHIoNDYpKGksIG4sIHt9KSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpW25dW2VdID0gITA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDkyKSwgaSA9IFJlZ0V4cC5wcm90b3R5cGUuZXhlYzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmV4ZWM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLmNhbGwoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgnUmVnRXhwJyAhPT0gbihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdSZWdFeHAjZXhlYyBjYWxsZWQgb24gaW5jb21wYXRpYmxlIHJlY2VpdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmNhbGwoZSwgdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigyMzIpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDQxKSwgaSA9IHIoNDYpLCBvID0gcigyNCksIGEgPSByKDY4KSwgcyA9IHIoMTkpLCB1ID0gcigxMzUpLCBjID0gcygnc3BlY2llcycpLCBkID0gIW8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IC8uLzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXhlYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5ncm91cHMgPSB7IGE6ICc3JyB9LCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAnNycgIT09ICcnLnJlcGxhY2UoZSwgJyQ8YT4nKTsKICAgICAgICAgICAgICAgICAgICB9KSwgbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAvKD86KS8sIHQgPSBlLmV4ZWM7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhlYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ2FiJy5zcGxpdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIgPT09IHIubGVuZ3RoICYmICdhJyA9PT0gclswXSAmJiAnYicgPT09IHJbMV07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHMoZSksIHAgPSAhbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA3ICE9ICcnW2VdKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZyA9IHAgPyAhbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExLCByID0gL2EvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZXhlYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9ICEwLCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ3NwbGl0JyA9PT0gZSAmJiAoci5jb25zdHJ1Y3RvciA9IHt9LCByLmNvbnN0cnVjdG9yW2NdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHJbZl0oJycpLCAhdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwIHx8ICFnIHx8ICdyZXBsYWNlJyA9PT0gZSAmJiAhZCB8fCAnc3BsaXQnID09PSBlICYmICFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gLy4vW2ZdLCB2ID0gcihhLCBmLCAnJ1tlXSwgZnVuY3Rpb24gKGUsIHQsIHIsIG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5leGVjID09PSB1ID8gcCAmJiAhaSA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtLmNhbGwodCwgciwgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUuY2FsbChyLCB0LCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB7IGRvbmU6ICExIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYiA9IHZbMF0sIHkgPSB2WzFdOwogICAgICAgICAgICAgICAgICAgICAgICBuKFN0cmluZy5wcm90b3R5cGUsIGUsIGIpLCBpKFJlZ0V4cC5wcm90b3R5cGUsIGYsIDIgPT0gdCA/IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geS5jYWxsKGUsIHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5LmNhbGwoZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbih0aGlzKSwgdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdsb2JhbCAmJiAodCArPSAnZycpLCBlLmlnbm9yZUNhc2UgJiYgKHQgKz0gJ2knKSwgZS5tdWx0aWxpbmUgJiYgKHQgKz0gJ20nKSwgZS51bmljb2RlICYmICh0ICs9ICd1JyksIGUuc3RpY2t5ICYmICh0ICs9ICd5JyksIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI0MSksIGkgPSByKDI0MiksIG8gPSByKDI0MyksIGEgPSByKDI0NCksIHMgPSByKDI0NSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC0xLCByID0gbnVsbCA9PSBlID8gMCA6IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGZvciAodGhpcy5jbGVhcigpOyArK3QgPCByOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KG5bMF0sIG5bMV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHUucHJvdG90eXBlLmNsZWFyID0gbiwgdS5wcm90b3R5cGUuZGVsZXRlID0gaSwgdS5wcm90b3R5cGUuZ2V0ID0gbywgdS5wcm90b3R5cGUuaGFzID0gYSwgdS5wcm90b3R5cGUuc2V0ID0gcywgZS5leHBvcnRzID0gdTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMTMpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gZS5sZW5ndGg7IHItLTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4oZVtyXVswXSwgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSB0IHx8IGUgIT0gZSAmJiB0ICE9IHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSBBcnJheS5pc0FycmF5OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQxKShPYmplY3Qua2V5cywgT2JqZWN0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG47CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNTMpLCBpID0gcigxOTUpLCBvID0gcigxNDQpLCBhID0gcigyNyksIHMgPSByKDM4KSwgdSA9IHIoMTQ1KSwgYyA9IHt9LCBkID0ge307CiAgICAgICAgICAgICAgICAodCA9IGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBsLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHAsIGcsIG0sIHYsIGIgPSBmID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1KGUpLCB5ID0gbihyLCBsLCB0ID8gMiA6IDEpLCBoID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgYikgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoZSArICcgaXMgbm90IGl0ZXJhYmxlIScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobyhiKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgPSBzKGUubGVuZ3RoKTsgcCA+IGg7IGgrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2ID0gdCA/IHkoYShnID0gZVtoXSlbMF0sIGdbMV0pIDogeShlW2hdKSkgPT09IGMgfHwgdiA9PT0gZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gYi5jYWxsKGUpOyAhKGcgPSBtLm5leHQoKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodiA9IGkobSwgeSwgZy52YWx1ZSwgdCkpID09PSBjIHx8IHYgPT09IGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLkJSRUFLID0gYywgdC5SRVRVUk4gPSBkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE4KSwgaSA9IHIoMzIpLCBvID0gcigyOCksIGEgPSByKDE5KSgnc3BlY2llcycpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5bZV07CiAgICAgICAgICAgICAgICAgICAgbyAmJiB0ICYmICF0W2FdICYmIGkuZih0LCBhLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTkpKCdpdGVyYXRvcicpLCBpID0gITE7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gWzddW25dKCk7CiAgICAgICAgICAgICAgICAgICAgby5yZXR1cm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9LCBBcnJheS5mcm9tKG8sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgMjsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ICYmICFpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFs3XSwgYSA9IG9bbl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5uZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogciA9ICEwIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9bbl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZShvKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMDIpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzAwKSwgaSA9IHIoOTcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcigyMDQpKCdTZXQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZGVmKGkodGhpcywgJ1NldCcpLCBlID0gMCA9PT0gZSA/IDAgOiBlLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBuKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmFwaSA9IHZvaWQgMCwgcigxNyksIHIoMiksIHIoMSksIHIoMyksIHIoNSksIHIoOTUpLCByKDApLCByKDE5NCksIHIoMzMpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMwMyksIGkgPSByKDczKSwgbyA9IHIoOCksIGEgPSByKDEyKSwgcyA9IHIoMTUpLCB1ID0gbShyKDI5KSksIGMgPSBtKHIoODYpKSwgZCA9IG0ocigzNCkpLCBsID0gbShyKDE0OCkpLCBmID0gbShyKDUxKSksIHAgPSByKDIwKSwgZyA9IHIoOTgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSA9IHt9LCBvID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvW25dLCB0LmluZGV4T2YocikgPj0gMCB8fCAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG9bbl0sIHQuaW5kZXhPZihyKSA+PSAwIHx8IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCByKSAmJiAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGIoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaChlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGIoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUsIHQsIHIsIG4sIGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGVbb10oYSksIHUgPSBzLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcy5kb25lID8gdCh1KSA6IFByb21pc2UucmVzb2x2ZSh1KS50aGVuKG4sIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCByID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5hcHBseSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMobywgbiwgaSwgYSwgcywgJ25leHQnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMobywgbiwgaSwgYSwgcywgJ3Rocm93JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgXyA9IG0ocigxMCkpLmRlZmF1bHQuRVZFTlRTLkVSUk9SX1JFUE9SVCwgRSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0OiAncU1vbnlXcjJ3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICdydjIuMjMuMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50OiAnY29yZScKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIEkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdDogJ3FNb255V3IydycsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICdydjIuMjMuMicsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ6ICdjb3JlJwogICAgICAgICAgICAgICAgICAgIH0sIHcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKDAsIHMuZ2V0Q29uZmlnKSgnYXBpJykgfHwgbC5kZWZhdWx0LmFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSBlLmluZGV4T2YoJ2h0dHAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZSkgfHwgJy8nID09PSBlLmNoYXJBdCgwKSA/IGUgOiAnLycuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogJycsIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHt9LCBpID0gIShhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSkgfHwgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQocikgPyBBKHIsIG4pIDogQSgoMCwgZy5nZXRFbnZDZmcpKGUuYXBpQmFzZSkgKyAoaSA/ICcvdicuY29uY2F0KGUudmVyc2lvbiB8fCAnMScpIDogJycpICsgciwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWNoZSAmJiBlLmNhY2hlW3RdIHx8IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAoMCwgYy5kZWZhdWx0KShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhcGk6JyArIGUucmVwbGFjZSgvaHR0cHM6XC9cLy9nbSwgJycpLnJlcGxhY2UoL2h0dHA6XC9cLy9nbSwgJycpLnJlcGxhY2UoL1wuL2dtLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBiKGUsIHQpLCBuID0gaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID8gaS5zdG9yYWdlLmdldExvY2FsU3RvcmFnZShuKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHUuZGVmYXVsdCkodCwgRSwgZS5mZXRjaE9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmICd7fScgIT09IEpTT04uc3RyaW5naWZ5KHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdFtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICE9PSByICYmIChyICs9ICcmJyksIGkgJiYgJ251bGwnICE9PSBpICYmICd1bmRlZmluZWQnICE9PSBpICYmIChyICs9ICcnLmNvbmNhdChuLCAnPScpLmNvbmNhdChpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgIT09IHIgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmluZGV4T2YoJz8nKSA+PSAwID8gZSA6ICcnLmNvbmNhdChlLCAnPycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSArIHIgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGEuZG9tKSgpLndpbmRvdy5BYm9ydENvbnRyb2xsZXIgPyBuZXcgQWJvcnRDb250cm9sbGVyKCkgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEMgPSBPKHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIGUodCwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCB1LCBjLCBsLCBnLCBPLCBFLCBJLCBBLCB4LCBDLCBQLCBqLCBSLCBELCBrLCBOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2UxNjZjYmRiY2EyNGFmYTUgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnZmV0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2UxNjZjYmRiY2EyNGFmYTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2ZldGNoJywgJF9fX21vY2tfYTI2MzE5YjU4MDEwOWQyZS5mZXRjaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID0gdyhhKSwgdSA9IHMuZXhwaXJlcywgYyA9IHMudXNlVmVyc2lvbiwgbCA9IHMudGltZW91dCwgZyA9IHMuYWJvcnRIYW5kbGVyLCBPID0gcy5xdWVyeSwgRSA9IHYocywgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VWZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWJvcnRIYW5kbGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1ZXJ5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBJID0gcih0KSwgdSA9IGIoSSwgdSksICdHRVQnICE9PSBFLm1ldGhvZCB8fCAhdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShBID0gUyhJLCB1KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nLCBBKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggPSBtKEksIE8sIGMpLCBsID4gMCAmJiAoUCA9IGcgfHwgVCgpLCBDID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAuYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwpLCBFLnNpZ25hbCA9IFAuc2lnbmFsKSwgZS5wcmV2ID0gOSwgZS5uZXh0ID0gMTIsICgwLCBuLmZldGNoKSh4LCBFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID0gZS5zZW50LCBDICYmIGNsZWFyVGltZW91dChDKSwgJ2FwcGxpY2F0aW9uL2pzb24nID09PSAoMCwgZC5kZWZhdWx0KShFLCAnaGVhZGVycy5BY2NlcHQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nLCBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAxOCwgai5qc29uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUiA9IGUuc2VudCwgJ0dFVCcgPT09IEUubWV0aG9kICYmIChEID0gaChJKSwgayA9IFIsIHUgJiYgai5zdGF0dXMgPj0gMjAwICYmIGouc3RhdHVzIDwgMzAwICYmIGkuc3RvcmFnZS5zZXRMb2NhbFN0b3JhZ2UoRCwgaywgeyBleHBpcmVzOiB1IH0pKSwgby5iYkxvZ2dlci5hdFZlcmJvc2l0eSg1KS5sb2dJbmZvKCdBUEkgUmVxdWVzdCBTdWNjZXNzLiB1cmw9Jy5jb25jYXQoeCksIGEsIFIpLCBlLmFicnVwdCgncmV0dXJuJywgeSh7IF9yZXNwb25zZTogaiB9LCBSKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcmV2ID0gMjQsIGUudDAgPSBlLmNhdGNoKDkpLCBvLmJiTG9nZ2VyLmxvZ0Vycm9yKCdBUEkgY2FsbCBmYWlsZWQuIHVybD0nLmNvbmNhdCh4KSksIE4gPSBuZXcgRXJyb3IoJ0FQSSBjYWxsIGZhaWxlZC4gdXJsPScuY29uY2F0KHgsICcuICcpLmNvbmNhdChKU09OLnN0cmluZ2lmeShlLnQwLCBmLmRlZmF1bHQpKSksIHAuZXZlbnRFbWl0dGVyLmVtaXQoXywgTiksIGUuYWJydXB0KCdyZXR1cm4nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlLnQwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2UxNjZjYmRiY2EyNGFmYTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2ZldGNoJywgJF9fX29sZF9lMTY2Y2JkYmNhMjRhZmE1KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCBudWxsLCBbWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4KHQsIHkoeyBtZXRob2Q6IGUudG9VcHBlckNhc2UoKSB9LCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgcy5nZXRDb25maWcpKCdhcGknLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IFAoJ0dFVCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdDogUCgnUE9TVCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0OiBQKCdQVVQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZTogUCgnREVMRVRFJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaDogeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVybDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0pIHx8IGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbShyKGUpLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kQmVhY29uOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgYS5kb20pKCkud2luZG93Lm5hdmlnYXRvci5zZW5kQmVhY29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbShyKGUpLCBJKSwgaSA9ICdzdHJpbmcnID09IHR5cGVvZiB0ID8gdCA6IEpTT04uc3RyaW5naWZ5KHQpLCBzID0gKDAsIGEuZG9tKSgpLndpbmRvdy5uYXZpZ2F0b3Iuc2VuZEJlYWNvbihuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgJiYgby5iYkxvZ2dlci5hdFZlcmJvc2l0eSg1KS5sb2dJbmZvKCdTZW50IEJlYWNvbiBEYXRhLiB1cmw9Jy5jb25jYXQobiksIGkpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQWJvcnQ6IFQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LmFwaSA9IHc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTgpLCBpID0gcigxNDcpLCBvID0gcigzMikuZiwgYSA9IHIoNjYpLmYsIHMgPSByKDEzNiksIHUgPSByKDExMCksIGMgPSBuLlJlZ0V4cCwgZCA9IGMsIGwgPSBjLnByb3RvdHlwZSwgZiA9IC9hL2csIHAgPSAvYS9nLCBnID0gbmV3IGMoZikgIT09IGY7CiAgICAgICAgICAgICAgICBpZiAocigyOCkgJiYgKCFnIHx8IHIoMjQpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBbcigxOSkoJ21hdGNoJyldID0gITEsIGMoZikgIT0gZiB8fCBjKHApID09IHAgfHwgJy9hL2knICE9IGMoZiwgJ2knKTsKICAgICAgICAgICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgICAgICBjID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzIGluc3RhbmNlb2YgYywgbiA9IHMoZSksIG8gPSB2b2lkIDAgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhciAmJiBuICYmIGUuY29uc3RydWN0b3IgPT09IGMgJiYgbyA/IGUgOiBpKGcgPyBuZXcgZChuICYmICFvID8gZS5zb3VyY2UgOiBlLCB0KSA6IGQoKG4gPSBlIGluc3RhbmNlb2YgYykgPyBlLnNvdXJjZSA6IGUsIG4gJiYgbyA/IHUuY2FsbChlKSA6IHQpLCByID8gdGhpcyA6IGwsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbiBjIHx8IG8oYywgZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW2VdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdiA9IGEoZCksIGIgPSAwOyB2Lmxlbmd0aCA+IGI7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG0odltiKytdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbC5jb25zdHJ1Y3RvciA9IGMsIGMucHJvdG90eXBlID0gbCwgcig0MSkobiwgJ1JlZ0V4cCcsIGMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcigxMTgpKCdSZWdFeHAnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSByKDEyNSkoNSksIG8gPSAhMDsKICAgICAgICAgICAgICAgICdmaW5kJyBpbiBbXSAmJiBBcnJheSgxKS5maW5kKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBvID0gITE7CiAgICAgICAgICAgICAgICB9KSwgbihuLlAgKyBuLkYgKiBvLCAnQXJyYXknLCB7CiAgICAgICAgICAgICAgICAgICAgZmluZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodGhpcywgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCByKDEwNykoJ2ZpbmQnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1MyksIGkgPSByKDEyOSksIG8gPSByKDQ3KSwgYSA9IHIoMzgpLCBzID0gcigzMDYpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDEgPT0gZSwgdSA9IDIgPT0gZSwgYyA9IDMgPT0gZSwgZCA9IDQgPT0gZSwgbCA9IDYgPT0gZSwgZiA9IDUgPT0gZSB8fCBsLCBwID0gdCB8fCBzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgcywgZykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtLCB2LCBiID0gbyh0KSwgeSA9IGkoYiksIGggPSBuKHMsIGcsIDMpLCBTID0gYSh5Lmxlbmd0aCksIE8gPSAwLCBfID0gciA/IHAodCwgUykgOiB1ID8gcCh0LCAwKSA6IHZvaWQgMDsgUyA+IE87IE8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmIHx8IE8gaW4geSkgJiYgKHYgPSBoKG0gPSB5W09dLCBPLCBiKSwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfW09dID0gdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLnB1c2gobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbCA/IC0xIDogYyB8fCBkID8gZCA6IF87CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIoMzApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5uZXdVc2VyU3luYyA9IG0sIHQudXNlclN5bmMgPSB0LlVTRVJTWU5DX0RFRkFVTFRfQ09ORklHID0gdm9pZCAwLCByKDEzKSwgcig5KSwgcigxMSksIHIoNCksIHIoMiksIHIoMjYpLCByKDQwKSwgcigxKSwgcigzKSwgcigwKSwgcig2KSwgcigxMjEpOwogICAgICAgICAgICAgICAgdmFyIGksIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBuKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKGEuZ2V0IHx8IGEuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBvLCBhKSA6IHJbb10gPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIGEgPSByKDIyKSwgcyA9IChpID0gcigzMSkpICYmIGkuX19lc01vZHVsZSA/IGkgOiB7IGRlZmF1bHQ6IGkgfSwgdSA9IHIoNzUpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwID0gewogICAgICAgICAgICAgICAgICAgIHN5bmNFbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyczogJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAnaW5jbHVkZScKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3luY3NQZXJCaWRkZXI6IDUsCiAgICAgICAgICAgICAgICAgICAgc3luY0RlbGF5OiAzMDAwLAogICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25EZWxheTogMAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQuVVNFUlNZTkNfREVGQVVMVF9DT05GSUcgPSBwLCBhLmNvbmZpZy5zZXREZWZhdWx0cyh7IHVzZXJTeW5jOiBvLmRlZXBDbG9uZShwKSB9KTsKICAgICAgICAgICAgICAgIHZhciBnID0gKDAsIHUuZ2V0Q29yZVN0b3JhZ2VNYW5hZ2VyKSgndXNlcnN5bmMnKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBuZXcgU2V0KCksIGkgPSB7fSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyA9IGUuY29uZmlnOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLnN5bmNFbmFibGVkICYmIGUuYnJvd3NlclN1cHBvcnRzQ29va2llcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUuaW1hZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHIuaW1hZ2UsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGQoZSwgMiksIHIgPSB0WzBdLCBuID0gdFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ubG9nTWVzc2FnZSgnSW52b2tpbmcgaW1hZ2UgcGl4ZWwgdXNlciBzeW5jIGZvciBiaWRkZXI6ICcuY29uY2F0KHIpKSwgby50cmlnZ2VyUGl4ZWwobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUuaWZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcChyLmlmcmFtZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZChlLCAyKSwgciA9IHRbMF0sIG4gPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dNZXNzYWdlKCdJbnZva2luZyBpZnJhbWUgdXNlciBzeW5jIGZvciBiaWRkZXI6ICcuY29uY2F0KHIpKSwgby5pbnNlcnRVc2VyU3luY0lmcmFtZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmxvZ0Vycm9yKCdFcnJvciBmaXJpbmcgdXNlciBzeW5jcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgby5zaHVmZmxlKGUpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSksIG4uYWRkKGVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYy5maWx0ZXJTZXR0aW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYWxsICYmIGVbdF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ubG9nV2FybignRGV0ZWN0ZWQgcHJlc2VuY2Ugb2YgdGhlICJmaWx0ZXJTZXR0aW5ncy5hbGwiIGFuZCAiZmlsdGVyU2V0dGluZ3MuJy5jb25jYXQodCwgJyIgaW4gdXNlclN5bmMgY29uZmlnLiAgWW91IGNhbm5vdCBtaXggImFsbCIgd2l0aCAiaWZyYW1lL2ltYWdlIiBjb25maWdzOyB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmFsbCA/IGUuYWxsIDogZVt0XSwgbiA9IGUuYWxsID8gJ2FsbCcgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gci5maWx0ZXIsIGEgPSByLmJpZGRlcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgJ2luY2x1ZGUnICE9PSBpICYmICdleGNsdWRlJyAhPT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5sb2dXYXJuKCdVc2VyU3luYyAiZmlsdGVyU2V0dGluZ3MuJy5jb25jYXQobiwgJy5maWx0ZXIiIHNldHRpbmcgXCcnKS5jb25jYXQoaSwgJ1wnIGlzIG5vdCBhIHZhbGlkIG9wdGlvbjsgdXNlIGVpdGhlciBcJ2luY2x1ZGVcJyBvciBcJ2V4Y2x1ZGVcJy4nKSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJyonICE9PSBhICYmICEoQXJyYXkuaXNBcnJheShhKSAmJiBhLmxlbmd0aCA+IDAgJiYgYS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uaXNTdHIoZSkgJiYgJyonICE9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ubG9nV2FybignRGV0ZWN0ZWQgYW4gaW52YWxpZCBzZXR1cCBpbiB1c2VyU3luYyAiZmlsdGVyU2V0dGluZ3MuJy5jb25jYXQobiwgJy5iaWRkZXJzIjsgdXNlIGVpdGhlciBcJypcJyAodG8gcmVwcmVzZW50IGFsbCBiaWRkZXJzKSBvciBhbiBhcnJheSBvZiBiaWRkZXJzLicpKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ociwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbZV0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5hbGwgPyByLmFsbCA6IHJbZV0sIGkgPSAnKicgPT09IG4uYmlkZGVycyA/IFt0XSA6IG4uYmlkZGVyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoMCwgcy5kZWZhdWx0KShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgcy5kZWZhdWx0KShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9W24uZmlsdGVyIHx8ICdpbmNsdWRlJ10oaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jb25maWcuZ2V0Q29uZmlnKCd1c2VyU3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnVzZXJTeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudXNlclN5bmMuZmlsdGVyU2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmlzUGxhaW5PYmplY3QodCkgJiYgKHQuaW1hZ2UgfHwgdC5hbGwgfHwgKGUudXNlclN5bmMuZmlsdGVyU2V0dGluZ3MuaW1hZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyczogJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogJ2luY2x1ZGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGYoYywgZS51c2VyU3luYyk7CiAgICAgICAgICAgICAgICAgICAgfSksIHQucmVnaXN0ZXJTeW5jID0gZnVuY3Rpb24gKGUsIGEsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaGFzKGEpID8gby5sb2dNZXNzYWdlKCdhbHJlYWR5IGZpcmVkIHN5bmNzIGZvciAiJy5jb25jYXQoYSwgJyIsIGlnbm9yaW5nIHJlZ2lzdGVyU3luYyBjYWxsJykpIDogYy5zeW5jRW5hYmxlZCAmJiBvLmlzQXJyYXkocltlXSkgPyBhID8gMCAhPT0gYy5zeW5jc1BlckJpZGRlciAmJiBOdW1iZXIoaVthXSkgPj0gYy5zeW5jc1BlckJpZGRlciA/IG8ubG9nV2FybignTnVtYmVyIG9mIHVzZXIgc3luY3MgZXhjZWVkZWQgZm9yICInLmNvbmNhdChhLCAnIicpKSA6IHQuY2FuQmlkZGVyUmVnaXN0ZXJTeW5jKGUsIGEpID8gKHJbZV0ucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcwogICAgICAgICAgICAgICAgICAgICAgICBdKSwgdm9pZCAoaSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA/IGVbdF0gKz0gMSA6IGVbdF0gPSAxLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KGksIGEpKSkgOiBvLmxvZ1dhcm4oJ0JpZGRlciAiJy5jb25jYXQoYSwgJyIgbm90IHBlcm1pdHRlZCB0byByZWdpc3RlciB0aGVpciAiJykuY29uY2F0KGUsICciIHVzZXJTeW5jIHBpeGVscy4nKSkgOiBvLmxvZ1dhcm4oJ0JpZGRlciBpcyByZXF1aXJlZCBmb3IgcmVnaXN0ZXJpbmcgc3luYycpIDogby5sb2dXYXJuKCdVc2VyIHN5bmMgdHlwZSAiJy5jb25jYXQoZSwgJyIgbm90IHN1cHBvcnRlZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnN5bmNVc2VycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChsLCBOdW1iZXIoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGwoKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRyaWdnZXJVc2VyU3luY3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuZW5hYmxlT3ZlcnJpZGUgJiYgdC5zeW5jVXNlcnMoKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmNhbkJpZGRlclJlZ2lzdGVyU3luYyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhYy5maWx0ZXJTZXR0aW5ncyB8fCAhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHYgPSAhby5pc1NhZmFyaUJyb3dzZXIoKSAmJiBnLmNvb2tpZXNBcmVFbmFibGVkKCksIGIgPSBtKHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBhLmNvbmZpZy5nZXRDb25maWcoJ3VzZXJTeW5jJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0c0Nvb2tpZXM6IHYKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHQudXNlclN5bmMgPSBiOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQubmV3QXVjdGlvbk1hbmFnZXIgPSB1LCB0LmF1Y3Rpb25NYW5hZ2VyID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDcpLCBvID0gcigyMjEpLCBhID0gKG4gPSByKDM3KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9OwogICAgICAgICAgICAgICAgdmFyIHMgPSByKDM2KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbXSwgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFkZFdpbm5pbmdCaWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBhLmRlZmF1bHQpKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdWN0aW9uSWQoKSA9PT0gdC5hdWN0aW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByID8gKHQuc3RhdHVzID0gcy5CSURfU1RBVFVTLlJFTkRFUkVELCByLmFkZFdpbm5pbmdCaWQodCkpIDogKDAsIGkubG9nV2FybikoJ0F1Y3Rpb24gbm90IGZvdW5kIHdoZW4gYWRkaW5nIHdpbm5pbmcgYmlkJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRBbGxXaW5uaW5nQmlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRXaW5uaW5nQmlkcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoaS5mbGF0dGVuLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRCaWRzUmVxdWVzdGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEJpZFJlcXVlc3RzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShpLmZsYXR0ZW4sIFtdKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmdldE5vQmlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXROb0JpZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGkuZmxhdHRlbiwgW10pOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0Qmlkc1JlY2VpdmVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEF1Y3Rpb25TdGF0dXMoKSA9PT0gby5BVUNUSU9OX0NPTVBMRVRFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEJpZHNSZWNlaXZlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoaS5mbGF0dGVuLCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRBZFVuaXRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEFkVW5pdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGkuZmxhdHRlbiwgW10pOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0QWRVbml0Q29kZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QWRVbml0Q29kZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGkuZmxhdHRlbiwgW10pLmZpbHRlcihpLnVuaXF1ZXMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuY3JlYXRlQXVjdGlvbiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5hZFVuaXRzLCBuID0gdC5hZFVuaXRDb2RlcywgaSA9IHQuY2FsbGJhY2ssIGEgPSB0LmNiVGltZW91dCwgcyA9IHQubGFiZWxzLCB1ID0gdC5hdWN0aW9uSWQsIGMgPSAoMCwgby5uZXdBdWN0aW9uKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0czogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYlRpbWVvdXQ6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGMpLCBjOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZmluZEJpZEJ5QWRJZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5kZWZhdWx0KShlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0Qmlkc1JlY2VpdmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShpLmZsYXR0ZW4sIFtdKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkSWQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0U3RhbmRhcmRCaWRkZXJBZFNlcnZlclRhcmdldGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBvLmdldFN0YW5kYXJkQmlkZGVyU2V0dGluZ3MpKClbcy5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HXTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnNldFN0YXR1c0ZvckJpZHMgPSBmdW5jdGlvbiAociwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZmluZEJpZEJ5QWRJZChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgKGkuc3RhdHVzID0gbiksIGkgJiYgbiA9PT0gcy5CSURfU1RBVFVTLkJJRF9UQVJHRVRJTkdfU0VUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9ICgwLCBhLmRlZmF1bHQpKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QXVjdGlvbklkKCkgPT09IGkuYXVjdGlvbklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIG8uc2V0QmlkVGFyZ2V0aW5nKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRMYXN0QXVjdGlvbklkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZW5ndGggJiYgZVtlLmxlbmd0aCAtIDFdLmdldEF1Y3Rpb25JZCgpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYyA9IHUoKTsKICAgICAgICAgICAgICAgIHQuYXVjdGlvbk1hbmFnZXIgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIzKSwgaSA9IHIoMTgpLmRvY3VtZW50LCBvID0gbihpKSAmJiBuKGkuY3JlYXRlRWxlbWVudCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvID8gaS5jcmVhdGVFbGVtZW50KGUpIDoge307CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDY3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1N0cmluZycgPT0gbihlKSA/IGUuc3BsaXQoJycpIDogT2JqZWN0KGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1NyksIGkgPSByKDM4KSwgbyA9IHIoMTA1KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCByLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCB1ID0gbih0KSwgYyA9IGkodS5sZW5ndGgpLCBkID0gbyhhLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgciAhPSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYyA+IGQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzID0gdVtkKytdKSAhPSBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYyA+IGQ7IGQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSB8fCBkIGluIHUpICYmIHVbZF0gPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwgZCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgJiYgLTE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTA0KSgna2V5cycpLCBpID0gcig2Myk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2VdIHx8IChuW2VdID0gaShlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZicuc3BsaXQoJywnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig2NCksIGkgPSByKDE0KSwgbyA9IHIoNDEpLCBhID0gcig0NiksIHMgPSByKDgxKSwgdSA9IHIoMjMxKSwgYyA9IHIoNzkpLCBkID0gcigxNjYpLCBsID0gcigxOSkoJ2l0ZXJhdG9yJyksIGYgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSksIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgZywgbSwgdiwgYikgewogICAgICAgICAgICAgICAgICAgIHUociwgdCwgZyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHksIGgsIFMsIE8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmICYmIGUgaW4gdykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrZXlzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhbHVlcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyByKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcih0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8gPSB0ICsgJyBJdGVyYXRvcicsIEUgPSAndmFsdWVzJyA9PSBtLCBJID0gITEsIHcgPSBlLnByb3RvdHlwZSwgQSA9IHdbbF0gfHwgd1snQEBpdGVyYXRvciddIHx8IG0gJiYgd1ttXSwgVCA9IEEgfHwgTyhtKSwgeCA9IG0gPyBFID8gTygnZW50cmllcycpIDogVCA6IHZvaWQgMCwgQyA9ICdBcnJheScgPT0gdCAmJiB3LmVudHJpZXMgfHwgQTsKICAgICAgICAgICAgICAgICAgICBpZiAoQyAmJiAoUyA9IGQoQy5jYWxsKG5ldyBlKCkpKSkgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgUy5uZXh0ICYmIChjKFMsIF8sICEwKSwgbiB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiBTW2xdIHx8IGEoUywgbCwgcCkpLCBFICYmIEEgJiYgJ3ZhbHVlcycgIT09IEEubmFtZSAmJiAoSSA9ICEwLCBUID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4gJiYgIWIgfHwgIWYgJiYgIUkgJiYgd1tsXSB8fCBhKHcsIGwsIFQpLCBzW3RdID0gVCwgc1tfXSA9IHAsIG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBFID8gVCA6IE8oJ3ZhbHVlcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IHYgPyBUIDogTygna2V5cycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXM6IHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaCBpbiB5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCBpbiB3IHx8IG8odywgaCwgeVtoXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKGkuUCArIGkuRiAqIChmIHx8IEkpLCB0LCB5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4geTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTY4KSghMCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICsgKHIgPyBuKGUsIHQpLmxlbmd0aCA6IDEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvID0gcigxMTApLCBhID0gUmVnRXhwLnByb3RvdHlwZS5leGVjLCBzID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLCB1ID0gYSwgYyA9IChuID0gL2EvLCBpID0gL2IqL2csIGEuY2FsbChuLCAnYScpLCBhLmNhbGwoaSwgJ2EnKSwgMCAhPT0gbi5sYXN0SW5kZXggfHwgMCAhPT0gaS5sYXN0SW5kZXgpLCBkID0gdm9pZCAwICE9PSAvKCk/Py8uZXhlYygnJylbMV07CiAgICAgICAgICAgICAgICAoYyB8fCBkKSAmJiAodSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG4sIGksIHUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIChyID0gbmV3IFJlZ0V4cCgnXicgKyB1LnNvdXJjZSArICckKD8hXFxzKScsIG8uY2FsbCh1KSkpLCBjICYmICh0ID0gdS5sYXN0SW5kZXgpLCBuID0gYS5jYWxsKHUsIGUpLCBjICYmIG4gJiYgKHUubGFzdEluZGV4ID0gdS5nbG9iYWwgPyBuLmluZGV4ICsgblswXS5sZW5ndGggOiB0KSwgZCAmJiBuICYmIG4ubGVuZ3RoID4gMSAmJiBzLmNhbGwoblswXSwgciwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBhcmd1bWVudHNbaV0gJiYgKG5baV0gPSB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICB9KSwgZS5leHBvcnRzID0gdTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMyksIGkgPSByKDY3KSwgbyA9IHIoMTkpKCdtYXRjaCcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlKSAmJiAodm9pZCAwICE9PSAodCA9IGVbb10pID8gISF0IDogJ1JlZ0V4cCcgPT0gaShlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI3KSwgaSA9IHIoNjUpLCBvID0gcigxOSkoJ3NwZWNpZXMnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGEgPSBuKGUpLmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGEgfHwgbnVsbCA9PSAociA9IG4oYSlbb10pID8gdCA6IGkocik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY2FsbCh0LCByWzBdKTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGwodCwgclswXSwgclsxXSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQsIHJbMF0sIHJbMV0sIHJbMl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0LCByKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjM3KSwgaSA9IHIoMjM4KSwgbyA9IHIoMjM5KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oaShlLCB0LCBuKSwgZSArICcnKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjQ2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgJ19fcHJvdG9fXycgPT0gdCAmJiBuID8gbihlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0KHIpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuY2FsbChlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4MSksIGkgPSByKDE5KSgnaXRlcmF0b3InKSwgbyA9IEFycmF5LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZSAmJiAobi5BcnJheSA9PT0gZSB8fCBvW2ldID09PSBlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOTIpLCBpID0gcigxOSkoJ2l0ZXJhdG9yJyksIG8gPSByKDgxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIoNjIpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2ldIHx8IGVbJ0BAaXRlcmF0b3InXSB8fCBvW24oZSldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5yZXF1ZXN0TWFuYWdlciA9IHZvaWQgMCwgcig1KSwgcigxKSwgcigzKSwgcigwKSwgcig1NCk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOCksIGkgPSByKDIxKSwgbyA9IHUocig0OCkpLCBhID0gdShyKDEwKSksIHMgPSByKDQyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjLCBkLCBsID0gYS5kZWZhdWx0LkxPR1MuUkVRVUVTVF9NQU5BR0VSLCBmID0gKDAsIG4ubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGwuTEFCRUwsCiAgICAgICAgICAgICAgICAgICAgICAgIGJnQ29sb3I6IGwuQ09MT1IsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogJyNGRkYnCiAgICAgICAgICAgICAgICAgICAgfSksIHAgPSAoYyA9IHt9LCBkID0gW10sIGkuZXhwb3N1cmVBcGkuZXhwb3NlKHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGNbZV0gJiYgKGNbZV0gPSAhMSwgZi5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdSZWdpc3RlcmluZyBSZXF1ZXN0ZXInLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIChmLmF0VmVyYm9zaXR5KDIpLmxvZ0luZm8oJ1Jlc2V0aW5nIHJlcXVlc3RzJyksIGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGMsIGUpICYmIChjW2VdID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hdFZlcmJvc2l0eSgyKS5sb2dJbmZvKCdSZXF1ZXN0IGRvbmUnLCBlKSwgY1tlXSA9ICEwLCAoKDAsIG8uZGVmYXVsdCkoYykgfHwgLTEgPT09IE9iamVjdC52YWx1ZXMoYykuaW5kZXhPZighMSkpICYmIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmF0VmVyYm9zaXR5KDIpLmxvZ0luZm8oJ1J1bm5pbmcgUmVxdWVzdCBNYW5hZ2VyIGNhbGxiYWNrcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgZC5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtlXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmF0VmVyYm9zaXR5KDEpLmxvZ0Vycm9yKGUpLCBzLmVycm9yUmVwb3J0aW5nLnJlcG9ydChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgby5kZWZhdWx0KShjKSA/IChmLmxvZ0luZm8oJ05vIHJlZ2lzdGVyZWQgcmVxdWVzdGVycy4gUnVubmluZyBjYWxsYmFjay4nKSwgZSgpKSA6IGQucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdC5yZXF1ZXN0TWFuYWdlciA9IHA7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjMpLCBpID0gcigyMDUpLnNldDsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEgPSB0LmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhICE9PSByICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGEgJiYgKG8gPSBhLnByb3RvdHlwZSkgIT09IHIucHJvdG90eXBlICYmIG4obykgJiYgaSAmJiBpKGUsIG8pLCBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCB1KGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGkoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYShlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGkoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBzID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEobiA9IChhID0gcy5uZXh0KCkpLmRvbmUpICYmIChyLnB1c2goYS52YWx1ZSksICF0IHx8IHIubGVuZ3RoICE9PSB0KTsgbiA9ICEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IHUoZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSksICdNYXAnID09PSByIHx8ICdTZXQnID09PSByID8gQXJyYXkuZnJvbShyKSA6ICdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpID8gYyhlLCB0KSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcigxNyksIHIoMyksIHIoNSksIHIoNiksIHIoMTMpLCByKDkpLCByKDExKSwgcigwKSwgcigxKSwgcig0KSwgcigyKSwgcigzMyksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIGQgPSBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAyLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDgsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC4wNQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAzNSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBkZnBQYXRoRGV2aWNlczogewogICAgICAgICAgICAgICAgICAgICAgICBkZXNrdG9wOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgd2ViOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgbXdlYjogJ20nLAogICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGU6ICdtJywKICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiAnYXBwJywKICAgICAgICAgICAgICAgICAgICAgICAgbTogJ20nLAogICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbjogJ2FwcCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbmZpYW50OiB7IGJhZEFkUmVmcmVzaDogITAgfSwKICAgICAgICAgICAgICAgICAgICBib290c3RyYXA6IHsgcmVuZGVyU2NyaXB0czogW10gfSwKICAgICAgICAgICAgICAgICAgICBkZWJ1ZzogewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlTWV0aG9kczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybjogITAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXBpOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVcmw6ICdodHRwczovL2F0LmFkdGVjaC5yZWR2ZW50dXJlcy5pby9saWIvYXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgYXBpQmFzZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZDogJ2h0dHBzOi8vYXQuYWR0ZWNoLnJlZHZlbnR1cmVzLmlvL2xpYi9hcGknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2U6ICdodHRwczovL2F0LmRldmVsb3BtZW50LmFkdGVjaC5yZWR2ZW50dXJlcy5pby9saWIvYXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjYnNfcHJvZDogJ2h0dHBzOi8vYXQuY2JzaS5jb20vbGliL2FwaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y2JzX3N0YWdlOiAnaHR0cHM6Ly9kZXYuYXQuY2JzaS5jb20vbGliL2FwaScKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VWZXJzaW9uOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvb2tpZTogewogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0T3B0aW9uczogeyBwYXRoOiAnLycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZGFpbHlTZXNzaW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiAnX0JCLmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnM6IHsgZXhwaXJlczogJ21pZG5pZ2h0RXN0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5pbmRleE9mKCd8JykgPj0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdHBnOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRhZzogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0YWc6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdjogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcyhlLnNwbGl0KCd8JyksIDQpLCByID0gdFswXSwgbiA9IHRbMV0sIGkgPSB0WzJdLCBvID0gdFszXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0cGc6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFnOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRhZzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2OiBwYXJzZUludChvKSA9PSBwYXJzZUludChvKSA/IHBhcnNlSW50KG8pIDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZpcnN0cGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZ0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnR0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpLnJlcGxhY2UoL3VuZGVmaW5lZC9nbSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlclNlc3Npb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6ICdfQkIuYnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5pbmRleE9mKCd8JykgPj0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VzOiB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzKGUuc3BsaXQoJ3wnKSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB0WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VzOiB0WzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3Vic2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignfCcpLnJlcGxhY2UoL3VuZGVmaW5lZC9nbSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2FDbGllbnRJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llTmFtZTogJ19nYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkT25seTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWFtVXVpZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llTmFtZTogJ2FhbV91dWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRPbmx5OiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZWc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6ICdhYW1nYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUkkoZSkucmVwbGFjZSgnc2VnaWQ9JywgJycpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSSgnc2VnaWQ9Jy5jb25jYXQoZS5qb2luKCcsJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVycm9yUmVwb3J0aW5nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZTogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydEludGVydmFsOiAxNTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aW5nUGVyY2VudGFnZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJpZGJhcnJlbDogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3J2LWJpZGJhcnJlbC1jb3JlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydDogJ2JlYWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmN5OiAxNTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB7IHJlcG9ydGluZ1BlcmNlbnRhZ2U6IDUwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbFRocmVzaG9sZDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICcvZXZlbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzVGltaW5nczogewogICAgICAgICAgICAgICAgICAgICAgICB1dGFnOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dEdXBsaWNhdGVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogNjAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudC1hZGxpYi1pbml0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnQtYWRsaWItZmlyc3QtYXVjdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50LWFkc3J2ci1maXJzdC1yZXEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudC1maXJzdC1yZW5kZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudC1maXJzdC1pbXAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQtZ3B0JzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoUGFydDogJ3NlY3VyZXB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC90YWcvanMvZ3B0LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2x1ZzogJ3NjcmlwdC1ncHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVGltZSB0byBHUFQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQtcHViYWRzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoUGFydDogJ3NlY3VyZXB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9ncHQvcHViYWRzX2ltcGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiAnc2NyaXB0LXB1YmFkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUaW1lIHRvIHB1YmFkc19pbXBsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0LWFkbGliJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoUGFydDogJ2F0LmFkdGVjaC5yZWR2ZW50dXJlcy5pby9saWIvZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6ICdzY3JpcHQtYWRsaWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVGltZSB0byBBZCBMaWJyYXJ5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy1jYnNvcHRhbm9uJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoUGFydDogJy9hL3ByaXZhY3kvb3B0YW5vbi9vcHRhbm9uLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6ICdzY3JpcHQtY2Jzb3B0YW5vbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUaW1lIHRvIENNUCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiAnZXZlbnQtYWRsaWItaW5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUaW1lIHRvIEFkIExpYnJhcnkgSW5pdGlhbGl6ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiAnZXZlbnQtYWRsaWItZmlyc3QtYXVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUaW1lIHRvIEZpcnN0IEFkIExpYnJhcnkgQXVjdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Nsb3RSZXF1ZXN0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2x1ZzogJ2V2ZW50LWFkc3J2ci1maXJzdC1yZXEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVGltZSB0byBGaXJzdCBBZCBTZXJ2ZXIgUmVxdWVzdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncHQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2xvdFJlbmRlckVuZGVkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6ICdldmVudC1maXJzdC1yZW5kZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVGltZSB0byBGaXJzdCBBZCBSZW5kZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2ltcHJlc3Npb25WaWV3YWJsZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiAnZXZlbnQtZmlyc3QtaW1wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1RpbWUgdG8gRmlyc3QgVmlld2FibGUgSW1wcmVzc2lvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRhcmdldGluZzogewogICAgICAgICAgICAgICAgICAgICAgICBhdXRvOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHsga2V5TWFwOiB7fSB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZWF0czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNlc3Npb246IDQKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZXNpdGU6ICdOb25lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGlkYXRlOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleU1hcDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0YWc6ICdmdGFnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGFnOiAndHRhZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RwZzogJ2ZpcnN0X3BhZ2VfdG9kYXknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVyczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXJzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZXJzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZnBQYXRoOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbjogJ2F3JywKICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazogJzIyMzA5NjEwMTg2JywKICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOiAnJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaGlnaEZyZXF1ZW5jeUFkUmVxdWVzdHM6ICExLAogICAgICAgICAgICAgICAgICAgIHRpbWVvdXRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxzYWZlOiAzMDAwLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXI6IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGhmYXI6IDcwMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYW1hem9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1YklEOiA1MDYyLAogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgYWRTZXJ2ZXI6ICdnb29nbGV0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db25maWc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkU2l6ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlBeGlzOiAneScsCiAgICAgICAgICAgICAgICAgICAgbGF6eUxvYWRpbmc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1NpemU6IDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bms6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF6eTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5QXhpczogMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4QXhpczogMTYwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VWaXNpYmxlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5QXhpczogNDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhBeGlzOiA4MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlVmlzaWJsZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlBeGlzOiA0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4QXhpczogODAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VWaXNpYmxlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBhdXRvUHJpb3JpdHk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2g6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiAhMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY29udGVudEFubm90YXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBlcmNlbnRhZ2U6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXY6ICdBSXphU3lCLWFNbHBlalF1Z2hSUnNkbnUxUFFYQS0xNExxdEcyVlknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZDogJ0FJemFTeUFhRDkxU1JtMmc3Zm5nZkRFNnB3YXQ1RjNJbGtNSk5wYycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXY6ICdodHRwczovL2Rldi1hZG1pcmFsLW10bWwubXQucnZhcHBzLmlvL2FwaS92MS9jb250ZW50X3N1aXRhYmlsaXR5X2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Q6ICdodHRwczovL2FkbWlyYWwtbXRtbC5tdC5ydmFwcHMuaW8vYXBpL3YxL2NvbnRlbnRfc3VpdGFiaWxpdHlfaWQnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9wdGFub246IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0TnBhT25Db25zZW50Q2hhbmdlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU2VydmljZXM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJTY3JpcHQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRVcmxzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXY6ICdodHRwczovL3Byb2R1Y3Rpb24tY21wLmlzZ3ByaXZhY3kuY2JzaS5jb20vZGlzdC9vcHRhbm9uLXYxLjEuMC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kOiAnaHR0cHM6Ly9wcm9kdWN0aW9uLWNtcC5pc2dwcml2YWN5LmNic2kuY29tL2Rpc3Qvb3B0YW5vbi12MS4xLjAuanMnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGR5bmFtaWNUYXJnZXRpbmc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVsZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2xvdCBOYW1lIFN0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlLmlzVmlkZW8gfHwgIWUuYWxsb3dlZFR5cGVzLnZpZGVvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAndW5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9vazogJ3Byb2Nlc3NBZFJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsgTEw6IGUuaXNMYXp5TG9hZGVkKCkgfSwgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW2ldICYmIG4ucHVzaChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaWRkZXJUaW1lb3V0ICYmIG4ucHVzaCgnVC0nLmNvbmNhdCh0LmJpZGRlclRpbWVvdXQpKSwgZS5vcmlnaW5hbENvZGUgKyAobi5sZW5ndGggPiAwID8gJz8nICsgbi5qb2luKCd8JykgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQWRvYmUgU2VnbWVudCBJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2VnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ3BhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2s6ICdwcm9jZXNzQWRSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVJlc3VsdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldENvb2tpZSgnc2VnJykgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBZG9iZSBBdWRpZW5jZSBNYW5hZ2VyIElEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2FhbWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ3BhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2s6ICdwcm9jZXNzQWRSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVJlc3VsdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldENvb2tpZSgnYWFtVXVpZCcpIHx8IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSW1wcmVzc2lvbiBJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAndW5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9vazogJ3NldEJpZFRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5pdD0nLmNvbmNhdChlLmNvZGUsICd8JykuY29uY2F0KGUuZ2VuZXJhdGVJbXByZXNzaW9uSWQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZndWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGJfYWRpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW16bmlpZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHM6IHt9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkeW5hbWljQmlkZGVyczogewogICAgICAgICAgICAgICAgICAgICAgICBzb25vYmk6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaW5jbHVkZWQgfHwgdC5pc1ZpZGVvIHx8IHQuYWxsb3dlZFR5cGVzLnZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIuZGZwUGF0aCwgaSA9IG4ubmV0d29yaywgbyA9IG4uZGV2aWNlLCBhID0gbi5yZWdpb24sIHMgPSBuLnByb3BlcnR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21faWQ6IHQuY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF91bml0OiAnLycuY29uY2F0KGksICcvJykuY29uY2F0KG8pLmNvbmNhdChhLCAnLScpLmNvbmNhdChzLCAnLycpLmNvbmNhdCh0Lm9yaWdpbmFsQ29kZSkgKyAodC5pbmNyZW1lbnRhbCA/IHQuaW5kZXggOiAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ym1hdGljOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmluY2x1ZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pc1ZpZGVvIHx8IHQuYWxsb3dlZFR5cGVzLnZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuZ2V0U2l6ZXMoKSwgbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMwMHgyNTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMzIweDUwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcyOHg5MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5NzB4MjUwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMwMHg2MDAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaSA9IHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyAhPSB0eXBlb2YgZSAmJiBuLmluZGV4T2YoZS5qb2luKCd4JykpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5sZW5ndGggPD0gMCA/IG51bGwgOiBpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlcklkOiAnMTYwNjUxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuQmlkQmFycmVsLmRmcFBhdGhPYmoucHJvcGVydHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm9yaWdpbmFsQ29kZSB8fCB0LmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmpvaW4oJ3gnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ18nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBwbmV4dXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuaXNWaWRlbywgaSA9IHQuZ2V0TGF0ZXN0VmlkZW9TcGVjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbyhvKHt9LCBlKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVzOiBhLm1pbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IGEubWluZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogYS5tYXhkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZGVsYXk6IGEuc3RhcnRkZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwYWJsZTogMSA9PT0gYS5za2lwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfbWV0aG9kOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG9fcGxheV9zb3VuZF9vbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG9fcGxheV9zb3VuZF9vZmYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGlja190b19wbGF5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wbGF5YmFja21ldGhvZC5pbmRleE9mKHQpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1ld29ya3M6IFswXS5jb25jYXQobihhLmFwaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzcG90eDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5pc1ZpZGVvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRTaXplczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIChlID0gbyhvKHt9LCBlKSwge30sIHsgcHJpY2VfZmxvb3I6IDEgfSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBhb2w6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyh7IG5ldHdvcms6ICc1ODkxOCcgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbmV0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oeyBjaWQ6ICc4Q1UxNThMMlknIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvcGVueDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRlbERvbWFpbiA/IGUgOiBvKHsgZGVsRG9tYWluOiAnY2JzaS1kLm9wZW54Lm5ldCcgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGl4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNWaWRlbyB8fCB0LmFsbG93ZWRUeXBlcy52aWRlbyA/IChlLnZpZGVvID0gdC5nZXRMYXRlc3RWaWRlb1NwZWMoKSwgZSkgOiBlLnNpemUgJiYgdC5nZXRTaXplcygpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5qb2luKCd4JykgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZihlLnNpemUuam9pbigneCcpKSA+PSAwID8gZSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0eDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmluY3JlbWVudGFsICYmIDEgIT09IHQuaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5iaWRkZXJDb250ZXh0LmV4dHJhUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuICYmIHIucGFnZVRhcmdldGluZy5zZWcgJiYgci5wYWdlVGFyZ2V0aW5nLnNlZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTYzMTQxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjY1NzI3NzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEzMTAwMjE5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3NDMyNDIyMzMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGEgPSByLnBhZ2VUYXJnZXRpbmcuc2VnLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaW5kZXhPZihlKSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gYS5sZW5ndGggPj0gMCA/IHsga2V5d29yZHM6IHsgdG9waWM6IGEgfSB9IDoge30sIHIuYmlkZGVyQ29udGV4dC5leHRyYVBhcmFtcyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhvKHt9LCBlKSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkbW86IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSByLmJpZGRlckNvbnRleHQuY291bnQgPyByLmJpZGRlckNvbnRleHQuY291bnQgPSAxIDogci5iaWRkZXJDb250ZXh0LmNvdW50KyssIHIuYmlkZGVyQ29udGV4dC5jb3VudCA+IDYgPyBudWxsIDogeyBwbGFjZW1lbnRJZDogJycgKyBlLnBsYWNlbWVudElkIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRlYWRzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGxhY2VtZW50SWQgJiYgZS5wYWdlSWQgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUlkOiBlLnBhZ2VJZCA/IHBhcnNlSW50KGUucGFnZUlkKSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudElkOiBlLnBsYWNlbWVudElkID8gcGFyc2VJbnQoZS5wbGFjZW1lbnRJZCkgOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdlbzogewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHNhZmVSZWdpb25Db2RlOiAndXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmYWlsc2FmZUNvdW50cnlDb2RlOiAndXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmYWlsc2FmZVRpbWVvdXQ6IDIwMDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1vYXQ6IHsgeWllbGRJbnRlbGxpZ2VuY2U6IHsgc2NyaXB0VXJsOiAnaHR0cHM6Ly96Lm1vYXRhZHMuY29tL3JlZHZlbnR1cmVzZ2FtaGVhZGVyNjQ0NzQ3MjgwNzA1L21vYXRoZWFkZXIuanMnIH0gfSwKICAgICAgICAgICAgICAgICAgICBpYXM6IHsgcHVibGlzaGVyT3B0aW1pemF0aW9uOiB7IHNjcmlwdFVybDogJ2h0dHBzOi8vY2RuLmFkc2FmZXByb3RlY3RlZC5jb20vaWFzUEVULjEuanMnIH0gfSwKICAgICAgICAgICAgICAgICAgICB2aWRlbzogewogICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RDYXBhYmlsaXRpZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBzcGVjOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlby9tcDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlby9IMjY0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8vd2VibScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGRlbGF5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogNjQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogNDgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmR1cmF0aW9uOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb246IDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2luc3RyZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhcml0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrbWV0aG9kOiBbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja2VuZDogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRTcGVjOiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LlBMQVlCQUNLX01FVEhPRCwgaSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pc01vYmlsZSgpICYmIChpLmFwaSA9IGkuYXBpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCAoaS5hcGkuaW5kZXhPZigxKSA+PSAwIHx8IGkuYXBpLmluZGV4T2YoMikgPj0gMCkgJiYgKGkubWltZXMgPSBpLm1pbWVzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8vSDI2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlby93ZWJtJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgci5jYW5BdXRvcGxheVVubXV0ZWQgPyBpLnBsYXliYWNrbWV0aG9kID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uUEFHRUxPQURfU09VTkRfT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5QQUdFTE9BRF9TT1VORF9PRkYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiByLmNhbkF1dG9wbGF5TXV0ZWQgPyBpLnBsYXliYWNrbWV0aG9kID0gW24uUEFHRUxPQURfU09VTkRfT0ZGXSA6IGkucGxheWJhY2ttZXRob2QgPSBbbi5DTElDS19TT1VORF9PTl0sIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVuaXRTcGVjOiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5QTEFZQkFDS19NRVRIT0Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyh7IHNlcXVlbmNlOiB0LnNlcXVlbmNlSW5kZXggfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZVNwZWM6IGZ1bmN0aW9uIChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbyA9IHIuUExBWUJBQ0tfTUVUSE9ELCBhID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnNDgwdicgPT09IGEuaCA/IGkgPSBvLlBBR0VMT0FEX1NPVU5EX09OIDogJzQ4M3YnID09PSBhLmggPyBpID0gby5QQUdFTE9BRF9TT1VORF9PRkYgOiBhLnBsYXllclNpemUgJiYgMiA9PT0gYS5wbGF5ZXJTaXplLmxlbmd0aCAmJiAnNDgwdicgPT09IGEucGxheWVyU2l6ZVsxXSA/IGkgPSBvLlBBR0VMT0FEX1NPVU5EX09OIDogYS5wbGF5ZXJTaXplICYmIDIgPT09IGEucGxheWVyU2l6ZS5sZW5ndGggJiYgJzQ4M3YnID09PSBhLnBsYXllclNpemVbMV0gJiYgKGkgPSBvLlBBR0VMT0FEX1NPVU5EX09GRiksIGkgPT09IG8uUEFHRUxPQURfU09VTkRfT0ZGICYmIG4uY2FuQXV0b3BsYXlNdXRlZCA/IGEucGxheWJhY2ttZXRob2QgPSBbby5QQUdFTE9BRF9TT1VORF9PRkZdIDogaSA9PT0gby5QQUdFTE9BRF9TT1VORF9PTiAmJiBuLmNhbkF1dG9wbGF5VW5tdXRlZCA/IGEucGxheWJhY2ttZXRob2QgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5QQUdFTE9BRF9TT1VORF9PTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLlBBR0VMT0FEX1NPVU5EX09GRgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IGkgJiYgKGEucGxheWJhY2ttZXRob2QgPSBbby5DTElDS19TT1VORF9PTl0pLCBpICYmIChhLmggPSA0ODApLCBhLmggJiYgYS53IHx8ICFhLnBsYXllclNpemUgfHwgMiAhPT0gYS5wbGF5ZXJTaXplLmxlbmd0aCA/IGUucGxheWVyU2l6ZSAmJiAyID09PSBhLnBsYXllclNpemUubGVuZ3RoIHx8IChhLnBsYXllclNpemUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS53LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgOiAoYS53IHx8IChhLncgPSBhLnBsYXllclNpemVbMF0pLCBhLmggfHwgKGEuaCA9IGEucGxheWVyU2l6ZVsxXSkpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UGFyYW1PcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYXJhbXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZWxpc3Q6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZndWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpcnN0cGcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Vzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJzZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnRhZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0dGFnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NpZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRQYXJhbU9wdGlvbnM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRTZXJ2ZXJVcmw6ICdodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcHJlYmlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtZWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwYWMnCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlVXJsQ29uZmlnczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4OiAnYmJfdmNhY2hlXycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiB7IGRlZmF1bHQ6IHt9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaWRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJDb21tb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyU3luY0NvbmZpZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHViQ29tbW9uSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdfcHViY2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IDM2NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5TGluazogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0NoYW5nZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlZnJlc2g6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCF0IHx8ICF0LnBhcmFtcykgJiYgKCEhKCFlICYmIHQgfHwgIWUucGFyYW1zICYmIHQucGFyYW1zKSB8fCAoJycgPT09IGUucGFyYW1zLmVpZCAmJiAnJyAhPT0gdC5wYXJhbXMuZWlkIHx8ICcnICE9PSB0LnBhcmFtcy5laWQgJiYgdC5wYXJhbXMuZWlkICE9PSBlLnBhcmFtcy5laWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llczogJzwlPSBjb250ZXh0LmdldFZhbHVlKFwnY29uZmlnLmRmcFBhdGhcJykgJT4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVtb3ZlOiB7IGNvb2tpZXM6IFsnX2xyX3JldHJ5X3JlcXVlc3QnXSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJTeW5jQ29uZmlnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpZGVudGl0eUxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgZWlkOiAnPCU9IGNvbnRleHQuZ2V0VmFsdWUoXCdjb25maWcuZmlyc3RQYXJ0eURhdGEuZWlkXCcpICU+JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdfQkIuaWQuaWRlbnRpdHlMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IDE1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUludGVudDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJTeW5jQ29uZmlnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsaXZlSW50ZW50SWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZXNvbHZlOiBbJ19wdWJjaWQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXI6ICdwcmViaWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ19CQi5pZC5saXZlSW50ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFNpemVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlQnVja2V0czogZCwKICAgICAgICAgICAgICAgICAgICAgICAgcGJqc0NvbmZpZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlclN5bmM6IHsgc3luY0VuYWJsZWQ6ICExIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZUdyYW51bGFyaXR5OiB7IGJ1Y2tldHM6IGQgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjI1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDI1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVNlbmRBbGxCaWRzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMyc0NvbmZpZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRJZDogJzEyODQ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiBbJ2FwcG5leHVzJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyOiAncHJlYmlkU2VydmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludDogJ2h0dHBzOi8vaWIuYWRueHMuY29tL29wZW5ydGIyL3ByZWJpZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdDb250cm9sczogeyBhbHdheXNJbmNsdWRlRGVhbHM6ICEwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZTogeyB1cmw6ICdodHRwczovL3ByZWJpZC5hZG54cy5jb20vcGJjL3YxL2NhY2hlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IG4oT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IG4oT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgfHwgW10pLnJlZHVjZShmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShpKHt9LCBlKSwge30sIG8oe30sIHQgPyByW3RdIDogciwgcikpOwogICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShyKSA/IGEociwgdCkgOiBPYmplY3QudmFsdWVzKGEociwgdCkpOwogICAgICAgICAgICAgICAgfSwgcigxNyksIHIoMiksIHIoNSksIHIoMSksIHIoMyksIHIoMCksIHIoNTQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBpLmRlZmF1bHQpKGUsIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDMwOCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSB2b2lkIDAsIHIoMTcpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE1KSwgaSA9IHIoNTkpLCBvID0gcigxMiksIGEgPSByKDczKSwgcyA9IHIoOTYpLCB1ID0gcig5OCksIGMgPSBnKHIoMzQpKSwgZCA9IGcocig5NCkpLCBsID0gcigyMSksIGYgPSByKDgpLCBwID0gcigyMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gbShPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogbShPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB5ID0gZyhyKDEwKSkuZGVmYXVsdC5FVkVOVFMuQVVDVElPTiwgaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAoMCwgcy5yaWNoT2JqZWN0KSh7fSksIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBjLmRlZmF1bHQpKCgwLCBvLmRvbSkoKS53aW5kb3csICd1dGFnX2RhdGEuX3Rlc3QnKSB8fCAvXCRcJFRFU1RfU1RSXCRcJC9nbS50ZXN0KCckJFRFU1RfU1RSJCQnKSB8fCAoMCwgZC5kZWZhdWx0KSgoMCwgby5kb20pKCkud2luZG93LCAndXRhZ19kYXRhLl90ZXN0JywgJyQkVEVTVF9TVFIkJCcpLCBnKGEuc3RvcmFnZS5nZXRDb29raWUoJyonLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoeyBjb29raWU6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGcoaS5wYWdlVGFyZ2V0aW5nLmdldFZhbHVlKCcqJywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldFZhbHVlKHsgdGFyZ2V0aW5nOiB0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBnKCgwLCBuLmdldENvbmZpZykoJyonLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IHZvaWQgMCAhPT0gKDAsIG4uZ2V0Q29uZmlnKSgnZmlyc3RQYXJ0eURhdGEuZWlkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZS5zZXRWYWx1ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogKDAsIG8uZG9tKSgpLndpbmRvdy5sb2NhdGlvbi5ocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiAoMCwgby5kb20pKCkud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiU3RyOiAoMCwgYy5kZWZhdWx0KSgoMCwgby5kb20pKCkud2luZG93LCAndXRhZ19kYXRhLl90ZXN0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnNldFZhbHVlKCdjbGllbnQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblNwZWVkOiAoMCwgYy5kZWZhdWx0KSgoMCwgby5kb20pKCkud2luZG93LCAnbmF2aWdhdG9yLmNvbm5lY3Rpb24uZG93bmxpbmsnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNZW1vcnk6ICgwLCBjLmRlZmF1bHQpKCgwLCBvLmRvbSkoKS53aW5kb3csICduYXZpZ2F0b3IuZGV2aWNlTWVtb3J5JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRIZWlnaHQ6ICgwLCBjLmRlZmF1bHQpKCgwLCBvLmRvbSkoKS53aW5kb3csICdpbm5lckhlaWdodCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0V2lkdGg6ICgwLCBjLmRlZmF1bHQpKCgwLCBvLmRvbSkoKS53aW5kb3csICdpbm5lcldpZHRoJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Vmlld3BvcnRIZWlnaHQ6ICgwLCBjLmRlZmF1bHQpKCgwLCBvLmRvbSkoKS53aW5kb3csICdzY3JlZW4uaGVpZ2h0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Vmlld3BvcnRXaWR0aDogKDAsIGMuZGVmYXVsdCkoKDAsIG8uZG9tKSgpLndpbmRvdywgJ3NjcmVlbi53aWR0aCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZygoMCwgbi5nZXRDb25maWcpKCdjbGllbnRJbmZvLmRhdGEnLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWUoJ2NsaWVudCcsIHYodih7fSwgZS5nZXRWYWx1ZSgnY2xpZW50JykpLCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5OiAoMCwgYy5kZWZhdWx0KSh0LCAnY291bnRyeScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbXRPZmZzZXQ6ICgwLCBjLmRlZmF1bHQpKHQsICdnbXRPZmZzZXQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVnaW9uOiAoMCwgYy5kZWZhdWx0KSh0LCAncmVnaW9uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RhbENvZGU6ICgwLCBjLmRlZmF1bHQpKHQsICdwb3N0YWxDb2RlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25UeXBlOiAoMCwgYy5kZWZhdWx0KSh0LCAnY29ubmVjdGlvbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBnKCgwLCBuLmdldENvbmZpZykoJ2dlby5yZWdpb25Db2RlJywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldFZhbHVlKCdjbGllbnQucmVnaW9uJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGUuc2V0VmFsdWUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmcFBhdGg6ICgwLCBuLmdldENvbmZpZykoJ2RmcFBhdGhPYmouc3RyaW5nJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkYmFycmVsVmVyc2lvbjogJ3J2Mi4yMy4yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0YWdlOiAoMCwgdS5pc1N0YWdpbmdFbnYpKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmLmJiTG9nZ2VyLmxvZ0luZm8oJ1NldHVwIGNvbnRleHQnLCBlLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbiAmJiBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gW10sIHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5leHBvc3VyZUFwaS5yb290U2NvcGVHZXR0ZXIoJ2NvbnRleHQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbC5leHBvc3VyZUFwaS5leHBvc2UoeyByZWxvYWRDb250ZXh0OiBtIH0pLCBwLmV2ZW50RW1pdHRlci5vbih5LCBtKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXA6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvYWQ6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZTogZS5zZXRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBlLmdldFZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5kZWZhdWx0ID0gaDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdwdE1vZHVsZSA9IHQuZ3B0TW9kdWxlQmFzZSA9IHZvaWQgMCwgcig2KSwgcigxMyksIHIoOSksIHIoMTEpLCByKDQpLCByKDE3KSwgcigyKSwgcig0MyksIHIoMTYpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDQ0KSwgaSA9IHIoOCksIG8gPSByKDIwKSwgYSA9IHIoMTUpLCBzID0gcig1OSksIHUgPSByKDM5KSwgYyA9IHIoOTkpLCBkID0gcigzNSksIGwgPSBfKHIoMjkpKSwgZiA9IF8ocigxNTApKSwgcCA9IHIoNTgpLCBnID0gcig3NCksIG0gPSByKDEyKSwgdiA9IHIoNTIpLCBiID0gcigyNSksIHkgPSByKDE4OCksIGggPSByKDIxKSwgUyA9IHIoNDIpLCBPID0gXyhyKDEwKSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgQShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoSSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBBKGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gciA/IEFycmF5LmZyb20ocikgOiAnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSA/IFQoZSwgdCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChuID0gbi5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgci5wdXNoLmFwcGx5KHIsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbnVsbCAhPSBhcmd1bWVudHNbdF0gPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAlIDIgPyB4KE9iamVjdChyKSwgITApLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAoZSwgdCwgclt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSkgOiB4KE9iamVjdChyKSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IociwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGogPSBPLmRlZmF1bHQuRVZFTlRTLCBSID0gai5ERlBfRVZFTlRTLCBEID0gai5BRF9MT0FERUQsIGsgPSBqLkFEX1JFTkRFUkVELCBOID0gai5BRF9WSUVXQUJMRSwgTSA9IGouQURfUkVDRUlWRUQsIFUgPSBqLkFEX1JFUVVFU1RFRCwgQiA9IGouQURfVklTSUJJTElUWV9DSEFOR0VELCBMID0gai5ESVNQTEFZX0NBTExFRCwgeiA9IGouU0xPVF9ERUZJTkVELCBWID0gai5CQVRDSF9TTE9UU19ERUZJTkVELCBGID0gai5JTklUSUFMSVpFLCBxID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0gITEsIHIgPSAoMCwgYy5ydW5RdWV1ZSkoJ3Bvc3QtaW5pdCBxdWV1ZScsIFtdLCA1ID09PSAoMCwgaS5nZXRWZXJib3NpdHlMZXZlbCkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5kaXNwbGF5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5zbG90IHx8ICgwLCB5Lmhhc0dldHRlcikodCwgJ3Nsb3QnKSB8fCAoMCwgeS5yZWFkT25seUdldHRlcikodCwgJ3Nsb3QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5zbG90VGFyZ2V0aW5nIHx8ICgwLCB5Lmhhc0dldHRlcikodCwgJ3Nsb3RUYXJnZXRpbmcnKSB8fCAoMCwgeS5yZWFkT25seUdldHRlcikodCwgJ3Nsb3RUYXJnZXRpbmcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoodC5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmdlbmVyYXRlSW1wcmVzc2lvbklkIHx8ICh0LmdlbmVyYXRlSW1wcmVzc2lvbklkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEMoQyh7fSwgKDAsIHMuZ2V0UGFnZVRhcmdldGluZykoKSksIGoodC5jb2RlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByW3RdICYmIGUucHVzaCgnJy5jb25jYXQodCwgJz0nKS5jb25jYXQoclt0XSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKS5qb2luKCd8Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9IFtdLCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRbaV0sIGEgPSBBKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgbi5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLmxlbmd0aCA+IDAgJiYgSihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnB1YmFkcygpLnJlZnJlc2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ3N0cmluZycgPT0gdHlwZW9mIHQgPyB0IDogdC5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSAoMCwgdS5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSihmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ0luZm8oJ0RlZmluaW5nIHNsb3RzJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdSA9ICgwLCBhLmdldENvbmZpZykoKSwgYyA9ICgwLCBuLmdldFVuaXRzKSgpLCBsID0gKDAsIGEuZ2V0Q29uZmlnKSgnZGZwUGF0aE9iaicpLnN0cmluZywgcCA9IDA7IHAgPCB0Lmxlbmd0aDsgcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gdFtwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbZy5jb2RlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBPYmplY3Qua2V5cyhnLnRhcmdldGluZyksIHYgPSAoMCwgZi5kZWZhdWx0KShqKGcuY29kZSksIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZy50YXJnZXRpbmcpICE9PSBKU09OLnN0cmluZ2lmeSh2KSAmJiBHKGcudGFyZ2V0aW5nLCBnLmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAoMCwgZC5jbG9uZURlZXApKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5hZGp1c3RTbG90RGVmaW5pdGlvbiAmJiB1LmFkanVzdFNsb3REZWZpbml0aW9uW2IuY29kZV0gJiYgKGIgPSB1LmFkanVzdFNsb3REZWZpbml0aW9uW2IuY29kZV0oYiksIGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMikubG9nSW5mbygnQWRqdXN0aW5nIG9uIHNsb3QgZGVmaW5pdGlvbicsIGcsICd0bycsIGIpKSwgaS5iYkxvZ2dlci5sb2dJbmZvKCdEZWZpbmluZyBzbG90IHBhdGg9Jy5jb25jYXQobCwgJyBlbGVtZW50SWQ9JykuY29uY2F0KGIuY29kZSwgJyBzaXplcz0nKS5jb25jYXQoYi5zaXplcyA/IGIuc2l6ZXMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZSkgPyBlLmpvaW4oJ3gnKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJykgOiAnbm9uZScpKSwgYi5vdXRPZlBhZ2UgPyBlW2IuY29kZV0gPSByLmRlZmluZU91dE9mUGFnZVNsb3QobCwgYi5jb2RlKSA6IGIubWF4U2l6ZSA/IGIubWluU2l6ZSA/IGVbYi5jb2RlXSA9IHIuZGVmaW5lU2xvdChsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQ6IGIuc2l6ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBiLm1pblNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiBiLm1heFNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIuY29kZSkgOiBlW2IuY29kZV0gPSByLmRlZmluZVNsb3QobCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkOiBiLnNpemVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogYi5tYXhTaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBiLmNvZGUpIDogZVtiLmNvZGVdID0gci5kZWZpbmVTbG90KGwsIGIuc2l6ZXMsIGIuY29kZSksIHJlKGIuY29kZSksIGVbYi5jb2RlXS5hZGRTZXJ2aWNlKHIucHViYWRzKCkpLCBpZShiLmNvZGUsIGIuc2l6ZU1hcHBpbmdzKSwgY1tiLmNvZGVdLnNlcnZpY2VzQXBwbGllZCA9ICEwLCBHKGIudGFyZ2V0aW5nLCBiLmNvZGUpLCBzLnB1c2goYiksIG8uZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KGIuY29kZSwgJy4nKS5jb25jYXQoeikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGIsIGVbYi5jb2RlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5ldmVudEVtaXR0ZXIuZW1pdChWLCBzLCBzLm1hcChBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocyksIHgocyksIHQgfHwgKGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMykubG9nSW5mbygnRW5hYmxpbmcgc2VydmljZXMnKSwgdCA9ICEwLCBKKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHViYWRzKCkuZW5hYmxlU2luZ2xlUmVxdWVzdCgpLCBXKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KHRbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSihmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbi5kaXNwbGF5ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKDAsIG0uZG9tKSgpLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChuLmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BsYXkoYSksIG4uZGlzcGxheWVkID0gITAsIG8uZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQobi5jb2RlLCAnLicpLmNvbmNhdChMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIG4sIGVbbi5jb2RlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYmJMb2dnZXIubG9nRXJyb3IoJ0Nhbm5vdCBmaW5kIGVsZW1lbnQgZm9yIHVuaXQuIFBsZWFzZSBlbnN1cmUgYWQgZWxlbWVudCBpcyBvbiB0aGUgcGFnZSBwcmlvciB0byBhZCByZXF1ZXN0IGF0dGVtcHRzJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIGVsZW1lbnQgZm9yIHVuaXQuIFBsZWFzZSBlbnN1cmUgYWQgZWxlbWVudCBpcyBvbiB0aGUgcGFnZSBwcmlvciB0byBhZCByZXF1ZXN0IGF0dGVtcHRzICcuY29uY2F0KG4sICcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuZXJyb3JSZXBvcnRpbmcucmVwb3J0KHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKHQpLCBKKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFtdLCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goaihuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IEEoZSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5iYkxvZ2dlci5sb2dFcnJvcignU2xvdCBub3QgZGVmaW5lZCcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEVycm9yKCdTbG90IG5vdCBkZWZpbmVkICcuY29uY2F0KGUsICcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmVycm9yUmVwb3J0aW5nLnJlcG9ydChhKSwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG8uZ2V0VGFyZ2V0aW5nTWFwKCksIHUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgaW4gcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBzW2NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1W2NdID0gJycgKyBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gKDAsIHUuaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdICYmIChpLmJiTG9nZ2VyLmxvZ0luZm8oJ1NldHRpbmcgdGFyZ2V0aW5nIG9uIHNsb3QgZm9yICcuY29uY2F0KHQsICc6ICcpLmNvbmNhdChyLCAnPScpLmNvbmNhdChuKSksIGVbdF0uc2V0VGFyZ2V0aW5nKHIsICcnICsgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gZVtyXSA/IHEociwgbywgYSkgOiBpLmJiTG9nZ2VyLmxvZ1dhcm4oJ1Nsb3Qgbm90IGF2YWlsYWJsZSBmb3IgdW5pdCwgdW5hYmxlIHRvIHNldCB0YXJnZXRpbmcnLCByLCB0KSA6IFEobywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgVyA9ICgwLCB1Lmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmVuYWJsZVNlcnZpY2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMykubG9nSW5mbygnQ2xlYXJpbmcgc2xvdHMnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBBcnJheS5pc0FycmF5KGUpID8gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IEEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHViYWRzKCkuY2xlYXIocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9ICgwLCBuLmdldFVuaXRDb2xsZWN0aW9uKSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ0Rlc3Ryb3lpbmcgc2xvdHMnLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gby5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgPyBvLm1hcChBKSA6IEEobyksIHIuZGVzdHJveVNsb3RzKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAoMCwgbi5nZXRVbml0cykoKSwgdSA9IDA7IHUgPCBvLmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gb1t1XS5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW2NdICYmIGRlbGV0ZSBlW2NdLCBzW2NdICYmIChzW2NdLmRpc3BsYXllZCA9ICExLCBzW2NdLnNlcnZpY2VzQXBwbGllZCA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBLKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgWShPYmplY3Qua2V5cyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbS5kb20pKCkud2luZG93Lmdvb2dsZXRhZy5jbWQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgoMCwgbS5kb20pKCkud2luZG93Lmdvb2dsZXRhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBRKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJiTG9nZ2VyLmxvZ0luZm8oJ1NldHRpbmcgdGFyZ2V0aW5nIGZvciBwYWdlOiAnLmNvbmNhdChlLCAnPScpLmNvbmNhdCh0KSksIHIucHViYWRzKCkuc2V0VGFyZ2V0aW5nKGUsICcnICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEodCwgciksIGUodCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJChlLCB0LCByLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxKHQsIHIsIG4pLCBlKHQsIHIsIG4sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFooZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHViYWRzKCkuY2xlYXJUYXJnZXRpbmcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlZSh0LCByLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbcl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG5baV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3JdLmNsZWFyVGFyZ2V0aW5nKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQociwgbiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdGUoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUodCksIGUodCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSihmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgdC5sZW5ndGg7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUodFtvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICgwLCBuLmdldFVuaXRzKSgpLCB1ID0gc1t0XS5jb2xsYXBzZUVtcHR5RGl2LCBjID0gKDAsIGEuZ2V0Q29uZmlnKSgnY29sbGFwc2VFbXB0eURpdnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2b2lkIDAgIT09IHUgfHwgdm9pZCAwICE9PSBjKSAmJiBlW3RdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgbCA9IHUgfHwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzW3RdLmlzTGF6eUxvYWRlZCgpICYmIEFycmF5LmlzQXJyYXkobCkgJiYgITAgPT09IGxbMF0gJiYgITAgPT09IGxbMV0gJiYgKGkuYmJMb2dnZXIubG9nSW5mbygnRGlzYWJsaW5nIHByZS1hZCByZXF1ZXN0IGNvbGxhcHNpbmcuIENhbm5vdCBsYXp5IGxvYWQgYW5kIGNvbGxhcHNlIGVtcHR5IGRpdiBiZWZvcmUgdGhlIGFkIHJlcXVlc3QnLCBzW3RdKSwgbCA9ICEwKSwgQXJyYXkuaXNBcnJheShsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkID0gZVt0XSkuc2V0Q29sbGFwc2VFbXB0eURpdi5hcHBseShkLCBFKGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XS5zZXRDb2xsYXBzZUVtcHR5RGl2KGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmUodCwgciwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAoMCwgbi5nZXRVbml0cykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3JdICYmIGFbcl0uc2VydmljZXNBcHBsaWVkICYmIGkuYmJMb2dnZXIuYXRWZXJib3NpdHkoMykubG9nV2FybignVW5hYmxlIHRvIGFwcGx5IHNpemUgbWFwcGluZywgc2xvdCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQnLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQociwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaWUodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiBKKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAoMCwgYS5nZXRDb25maWcpKCksIHMgPSAoMCwgbi5nZXRVbml0cykoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVt0XSAmJiAhc1t0XS5zZXJ2aWNlc0FwcGxpZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdBcHBseWluZyBTaXplIE1hcHBpbmcgdG8gc2xvdCAnLmNvbmNhdCh0KSwgc1t0XS5zaXplTWFwcGluZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gci5zaXplTWFwcGluZygpLCBjID0gby5hZGp1c3RTbG90RGVmaW5pdGlvbiAmJiBvLmFkanVzdFNsb3REZWZpbml0aW9uW3RdID8gby5hZGp1c3RTbG90RGVmaW5pdGlvblt0XSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwgPSAoMCwgZC5jbG9uZURlZXApKHNbdF0pLCBmID0gMDsgZiA8IHNbdF0uc2l6ZU1hcHBpbmdzLmxlbmd0aDsgZisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHNbdF0uc2l6ZU1hcHBpbmdzW2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5zaXplcyA9IHAuc2l6ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGMobCkuc2l6ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmFkZFNpemUocC52aWV3cG9ydCwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XS5kZWZpbmVTaXplTWFwcGluZyh1LmJ1aWxkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gJiYgc1t0XS5zZXJ2aWNlc0FwcGxpZWQgJiYgaS5iYkxvZ2dlci5hdFZlcmJvc2l0eSgzKS5sb2dXYXJuKCdVbmFibGUgdG8gYXBwbHkgc2l6ZSBtYXBwaW5nLCBzbG90IGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9lKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguZXhwb3N1cmVBcGkucm9vdFNjb3BlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU2xvdHM6IEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95U2xvdHM6IFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95QWxsU2xvdHM6IEssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTbG90OiBBCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBoLmV4cG9zdXJlQXBpLnJvb3RTY29wZUdldHRlcnMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZnBQYXRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBhLmdldENvbmZpZykoJ2RmcFBhdGhPYmouc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZwUGF0aE9iajogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5nZXRDb25maWcpKCdkZnBQYXRoT2JqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHAudXJsUXVlcnlBc09iamVjdCkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG0uZG9tKSgpLndpbmRvdy5nb29nbGV0YWcgPSAoMCwgbS5kb20pKCkud2luZG93Lmdvb2dsZXRhZyB8fCB7fSwgKDAsIG0uZG9tKSgpLndpbmRvdy5nb29nbGV0YWcuY21kID0gKDAsIG0uZG9tKSgpLndpbmRvdy5nb29nbGV0YWcuY21kIHx8IFtdLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGcucmVuZGVyU2NyaXB0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2dvb2dsZXRhZy1zY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiAnLy9zZWN1cmVwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvdGFnL2pzL2dwdC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCksIEooZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5BRF9WSUVXQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5BRF9SRU5ERVJFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5BRF9MT0FERUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuQURfVklTSUJJTElUWV9DSEFOR0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLkFEX1JFUVVFU1RFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5BRF9SRUNFSVZFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHIgPSBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHcodFtyXSwgMiksIGEgPSBpWzBdLCBzID0gaVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdWJhZHMoKS5hZGRFdmVudExpc3RlbmVyKGEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICgwLCBuLmdldFVuaXRzKSgpLCByID0gZS5zbG90LmdldFNsb3RFbGVtZW50SWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbcl0gJiYgby5ldmVudEVtaXR0ZXIuZW1pdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChyLCAnLicpLmNvbmNhdChhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQociwgJy4nKS5jb25jYXQocykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRbcl0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5zZXRQYWdlVGFyZ2V0aW5nLmJlZm9yZShYKSwgcy5jbGVhclBhZ2VUYXJnZXRpbmcuYmVmb3JlKFopLCBzLnNldFVuaXRUYXJnZXRpbmcuYmVmb3JlKCQpLCBzLmNsZWFyVW5pdFRhcmdldGluZy5iZWZvcmUoZWUpLCBuLnNldFNpemVNYXBwaW5ncy5iZWZvcmUobmUpLCBuLnNldENvbGxhcHNlLmJlZm9yZSh0ZSksIG4uZGVmaW5lVW5pdC5hZnRlcihiKSwgdi5wcm9jZXNzQWRSZXF1ZXN0LmJlZm9yZShQKSwgdi5nZXRBZHMuYmVmb3JlKF8pLCAoMCwgYS5nZXRDb25maWcpKCdkZnBQYXRoJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUsIHIgPSAoMCwgYS5nZXRDb25maWcpKCdkZnBQYXRoRGV2aWNlcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5zcGxpdCgnLycpLCBpID0gblsyXS5zcGxpdCgnLScpLCBvID0gaVswXS5tYXRjaCgvXihhcHB8bSkvKSwgcyA9IG8gPyBvWzBdIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKDAsIGwuZGVmYXVsdCkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZzogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrOiBuWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZTogdm9pZCAwICE9PSByW3MudG9Mb3dlckNhc2UoKV0gPyByW3MudG9Mb3dlckNhc2UoKV0gOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbjogaVswXS5zdWJzdHJpbmcocy5sZW5ndGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VQYXRoOiBuLnNsaWNlKDMpLmpvaW4oJy8nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKDAsIGEuZ2V0Q29uZmlnKSgnZGZwUGF0aE9iaicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSBJKHQpICYmICgodCA9ICgwLCBsLmRlZmF1bHQpKHt9LCB0LCAoMCwgYS5nZXRDb25maWcpKCdkZnBQYXRoT2JqJykpKS5kZXZpY2UgJiYgdm9pZCAwICE9PSByW3QuZGV2aWNlLnRvTG93ZXJDYXNlKCldICYmICh0LmRldmljZSA9IHJbdC5kZXZpY2UudG9Mb3dlckNhc2UoKV0pLCB0LmlzTW9iaWxlICYmICh0LmRldmljZSA9ICdtJyksIHQuaXNBcHAgJiYgKHQuZGV2aWNlID0gJ2FwcCcpLCB0LmlzRGVza3RvcCAmJiAodC5kZXZpY2UgPSAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIHIgPSAoMCwgcC51cmxRdWVyeUFzT2JqZWN0KSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hZE5ldHdvcmsgJiYgKHQubmV0d29yayA9IHIuYWROZXR3b3JrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWRSZWdpb24gJiYgKHQucmVnaW9uID0gci5hZFJlZ2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0cmluZyA9ICcvJy5jb25jYXQodC5uZXR3b3JrLCAnLycpLmNvbmNhdCh0LmRldmljZSkuY29uY2F0KHQucmVnaW9uLCAnLScpLmNvbmNhdCh0LnByb3BlcnR5KSwgdC5wYWdlUGF0aCAmJiAodC5zdHJpbmcgKz0gJy8nLmNvbmNhdCh0LnBhZ2VQYXRoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGEuc2V0Q29uZmlnKSgnZGZwUGF0aE9iaicsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBKKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHViYWRzKCkuZGlzYWJsZUluaXRpYWxMb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uZXZlbnRFbWl0dGVyLm9uKEYsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIucnVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlR29vZ2xldGFnU2VydmljZXM6IFcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTbG90czogb2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTbG90OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVuaXRUYXJnZXRpbmc6IHEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVBbmREaXNwbGF5OiBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B0QWN0aW9uOiBKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2xvdFRhcmdldGluZzogaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyU2xvdHM6IEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95QWxsU2xvdHM6IEssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95U2xvdHM6IFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBPLmRlZmF1bHQuTU9EVUxFUy5HT09HTEVfUFVCTElTSEVSX1RBRwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuZ3B0TW9kdWxlQmFzZSA9IHE7CiAgICAgICAgICAgICAgICB2YXIgRyA9IGIubW9kdWxlTWFuYWdlci5yZWdpc3RlcihxLCBudWxsKTsKICAgICAgICAgICAgICAgIHQuZ3B0TW9kdWxlID0gRzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIoMzI3KSgnbGluaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHRoaXMsICdhJywgJ2hyZWYnLCB0KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5jcmVhdGVCaWQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaShlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQgJiYgdC5zcmMgfHwgJ2NsaWVudCcsIGkgPSBlIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRkZXJDb2RlID0gdCAmJiB0LmJpZGRlciB8fCAnJywgdGhpcy53aWR0aCA9IDAsIHRoaXMuaGVpZ2h0ID0gMCwgdGhpcy5zdGF0dXNNZXNzYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdQZW5kaW5nJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdCaWQgYXZhaWxhYmxlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdCaWQgcmV0dXJuZWQgZW1wdHkgb3IgZXJyb3IgcmVzcG9uc2UnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0JpZCB0aW1lZCBvdXQnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSgpLCB0aGlzLmFkSWQgPSBuLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwgdGhpcy5yZXF1ZXN0SWQgPSB0ICYmIHQuYmlkSWQsIHRoaXMubWVkaWFUeXBlID0gJ2Jhbm5lcicsIHRoaXMuc291cmNlID0gciwgdGhpcy5nZXRTdGF0dXNDb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3gnICsgdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig0NyksIGkgPSByKDEwNSksIG8gPSByKDM4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IG4odGhpcyksIHIgPSBvKHQubGVuZ3RoKSwgYSA9IGFyZ3VtZW50cy5sZW5ndGgsIHMgPSBpKGEgPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCByKSwgdSA9IGEgPiAyID8gYXJndW1lbnRzWzJdIDogdm9pZCAwLCBjID0gdm9pZCAwID09PSB1ID8gciA6IGkodSwgcik7IGMgPiBzOykgewogICAgICAgICAgICAgICAgICAgICAgICB0W3MrK10gPSBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5pc1ZhbGlkVmlkZW9CaWQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gKDAsIGkuZ2V0QmlkUmVxdWVzdCkoZS5yZXF1ZXN0SWQsIHQpLCBuID0gciAmJiAoMCwgaS5kZWVwQWNjZXNzKShyLCAnbWVkaWFUeXBlcy52aWRlbycpLCBvID0gbiAmJiAoMCwgaS5kZWVwQWNjZXNzKShuLCAnY29udGV4dCcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIHIsIG4sIG8pOwogICAgICAgICAgICAgICAgfSwgdC5jaGVja1ZpZGVvQmlkU2V0dXAgPSB0Lmhhc05vblZpZGVvQmlkZGVyID0gdC52aWRlb0JpZGRlciA9IHQudmlkZW9BZFVuaXQgPSB0LklOU1RSRUFNID0gdC5PVVRTVFJFQU0gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHUocig4NykpLCBpID0gcig3KSwgbyA9IHIoMjIpLCBhID0gdShyKDMxKSksIHMgPSByKDYxKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuT1VUU1RSRUFNID0gJ291dHN0cmVhbSc7CiAgICAgICAgICAgICAgICB0LklOU1RSRUFNID0gJ2luc3RyZWFtJzsKICAgICAgICAgICAgICAgIHQudmlkZW9BZFVuaXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ3ZpZGVvJyA9PT0gZS5tZWRpYVR5cGUsIHIgPSAoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy52aWRlbycpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IHx8IHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5kZWZhdWx0KShuLmRlZmF1bHQudmlkZW9BZGFwdGVycywgZS5iaWRkZXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQudmlkZW9CaWRkZXIgPSBjOwogICAgICAgICAgICAgICAgdC5oYXNOb25WaWRlb0JpZGRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjKGUpOwogICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgZCA9ICgwLCBzLmhvb2spKCdzeW5jJywgZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgciAmJiAnb3V0c3RyZWFtJyAhPT0gbiA/IG8uY29uZmlnLmdldENvbmZpZygnY2FjaGUudXJsJykgfHwgIWUudmFzdFhtbCB8fCBlLnZhc3RVcmwgPyAhKCFlLnZhc3RVcmwgJiYgIWUudmFzdFhtbCkgOiAoKDAsIGkubG9nRXJyb3IpKCdcbiAgICAgICAgVGhpcyBiaWQgY29udGFpbnMgb25seSB2YXN0WG1sIGFuZCB3aWxsIG5vdCB3b3JrIHdoZW4gYSBwcmViaWQgY2FjaGUgdXJsIGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgICAgIFRyeSBlbmFibGluZyBwcmViaWQgY2FjaGUgd2l0aCBwYmpzLnNldENvbmZpZyh7IGNhY2hlOiB7dXJsOiAiLi4uIn0gfSk7XG4gICAgICAnKSwgITEpIDogJ291dHN0cmVhbScgIT09IG4gfHwgISEoZS5yZW5kZXJlciB8fCB0LnJlbmRlcmVyIHx8IHIucmVuZGVyZXIpOwogICAgICAgICAgICAgICAgfSwgJ2NoZWNrVmlkZW9CaWRTZXR1cCcpOwogICAgICAgICAgICAgICAgdC5jaGVja1ZpZGVvQmlkU2V0dXAgPSBkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gIXIoMjgpICYmICFyKDI0KShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcgIT0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIoMTI4KSgnZGl2JyksICdhJywgewogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkuYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDUwKSwgaSA9IHIoNTcpLCBvID0gcigxMzApKCExKSwgYSA9IHIoMTMxKSgnSUVfUFJPVE8nKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIHMgPSBpKGUpLCB1ID0gMCwgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAociBpbiBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIgIT0gYSAmJiBuKHMsIHIpICYmIGMucHVzaChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IHQubGVuZ3RoID4gdTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbihzLCByID0gdFt1KytdKSAmJiAofm8oYywgcikgfHwgYy5wdXNoKHIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMyKSwgaSA9IHIoNzcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB0IGluIGUgPyBuLmYoZSwgdCwgaSgwLCByKSkgOiBlW3RdID0gcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB0LmYgPSByKDE5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDYyKSwgbyA9IHIoNjQpLCBhID0gcigxNjApLCBzID0gcigzMikuZjsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpLlN5bWJvbCB8fCAoaS5TeW1ib2wgPSBvID8ge30gOiBuLlN5bWJvbCB8fCB7fSk7CiAgICAgICAgICAgICAgICAgICAgJ18nID09IGUuY2hhckF0KDApIHx8IGUgaW4gdCB8fCBzKHQsIGUsIHsgdmFsdWU6IGEuZihlKSB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnQXJyYXknID09IG4oZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE4KS5kb2N1bWVudDsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4gJiYgbi5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjgpLCBpID0gcig3MCksIG8gPSByKDU3KSwgYSA9IHIoOTEpLmY7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByLCBzID0gbyh0KSwgdSA9IGkocyksIGMgPSB1Lmxlbmd0aCwgZCA9IDAsIGwgPSBbXTsgYyA+IGQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gdVtkKytdLCBuICYmICFhLmNhbGwocywgcikgfHwgbC5wdXNoKGUgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3JdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogc1tyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhIWUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1MCksIGkgPSByKDQ3KSwgbyA9IHIoMTMxKSgnSUVfUFJPVE8nKSwgYSA9IE9iamVjdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGkoZSksIG4oZSwgbykgPyBlW29dIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5jb25zdHJ1Y3RvciAmJiBlIGluc3RhbmNlb2YgZS5jb25zdHJ1Y3RvciA/IGUuY29uc3RydWN0b3IucHJvdG90eXBlIDogZSBpbnN0YW5jZW9mIE9iamVjdCA/IGEgOiBudWxsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSByKDYyKSwgbyA9IHIoMjQpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IChpLk9iamVjdCB8fCB7fSlbZV0gfHwgT2JqZWN0W2VdLCBhID0ge307CiAgICAgICAgICAgICAgICAgICAgYVtlXSA9IHQociksIG4obi5TICsgbi5GICogbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIoMSk7CiAgICAgICAgICAgICAgICAgICAgfSksICdPYmplY3QnLCBhKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjkpLCBpID0gcig2OCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgcyA9IFN0cmluZyhpKHQpKSwgdSA9IG4ociksIGMgPSBzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUgPCAwIHx8IHUgPj0gYyA/IGUgPyAnJyA6IHZvaWQgMCA6IChvID0gcy5jaGFyQ29kZUF0KHUpKSA8IDU1Mjk2IHx8IG8gPiA1NjMxOSB8fCB1ICsgMSA9PT0gYyB8fCAoYSA9IHMuY2hhckNvZGVBdCh1ICsgMSkpIDwgNTYzMjAgfHwgYSA+IDU3MzQzID8gZSA/IHMuY2hhckF0KHUpIDogbyA6IGUgPyBzLnNsaWNlKHUsIHUgKyAyKSA6IGEgLSA1NjMyMCArIChvIC0gNTUyOTYgPDwgMTApICsgNjU1MzY7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHIgPSByIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiB3aW5kb3cgJiYgKHIgPSB3aW5kb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMzYpLCBpID0gcig2OCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGlmIChuKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyByICsgJyBkb2VzblwndCBhY2NlcHQgcmVnZXghJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoaShlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE5KSgnbWF0Y2gnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAvLi87CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgJy8uLydbZV0odCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbbl0gPSAhMSwgIScvLi8nW2VdKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMzgpLCBpID0gcigxMzkpLCBvID0gcigyNDApLCBhID0gcigxODUpLCBzID0gaShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wdXNoKHZvaWQgMCwgbyksIG4oYSwgdm9pZCAwLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTExKSwgaSA9IHIoMTc0KSwgbyA9IHIoMjQ4KSwgYSA9IHIoMjUwKSwgcyA9IHIoNzEpLCB1ID0gcig5MyksIGMgPSByKDE4Myk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiBlKHQsIHIsIGQsIGwsIGYpIHsKICAgICAgICAgICAgICAgICAgICB0ICE9PSByICYmIG8ociwgZnVuY3Rpb24gKG8sIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgfHwgKGYgPSBuZXcgbigpKSwgcyhvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSh0LCByLCB1LCBkLCBlLCBsLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbCA/IGwoYyh0LCB1KSwgbywgdSArICcnLCB0LCByLCBmKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gcCAmJiAocCA9IG8pLCBpKHQsIHUsIHApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0MCksIGkgPSByKDExMyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICh2b2lkIDAgIT09IHIgJiYgIWkoZVt0XSwgcikgfHwgdm9pZCAwID09PSByICYmICEodCBpbiBlKSkgJiYgbihlLCB0LCByKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTc2KSwgaSA9IHQgJiYgIXQubm9kZVR5cGUgJiYgdCwgbyA9IGkgJiYgJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgZSAmJiAhZS5ub2RlVHlwZSAmJiBlLCBhID0gbyAmJiBvLmV4cG9ydHMgPT09IGkgPyBuLkJ1ZmZlciA6IHZvaWQgMCwgcyA9IGEgPyBhLmFsbG9jVW5zYWZlIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5sZW5ndGgsIG4gPSBzID8gcyhyKSA6IG5ldyBlLmNvbnN0cnVjdG9yKHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb3B5KG4pLCBuOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LmNhbGwodGhpcywgcigyNTEpKGUpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjUyKSwgaSA9ICdvYmplY3QnID09IHR5cGVvZiBzZWxmICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmLCBvID0gbiB8fCBpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IC0xLCBuID0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgZm9yICh0IHx8ICh0ID0gQXJyYXkobikpOyArK3IgPCBuOykgewogICAgICAgICAgICAgICAgICAgICAgICB0W3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI1NiksIGkgPSByKDE3OSksIG8gPSByKDI1Nyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlLmNvbnN0cnVjdG9yIHx8IG8oZSkgPyB7fSA6IG4oaShlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0MSkoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNDIpLCBpID0gcig3MSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghaShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbihlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgRnVuY3Rpb25dJyA9PSB0IHx8ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScgPT0gdCB8fCAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScgPT0gdCB8fCAnW29iamVjdCBQcm94eV0nID09IHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0MiksIGkgPSByKDE3OSksIG8gPSByKDExNSksIGEgPSBGdW5jdGlvbi5wcm90b3R5cGUsIHMgPSBPYmplY3QucHJvdG90eXBlLCB1ID0gYS50b1N0cmluZywgYyA9IHMuaGFzT3duUHJvcGVydHksIGQgPSB1LmNhbGwoT2JqZWN0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvKGUpIHx8ICdbb2JqZWN0IE9iamVjdF0nICE9IG4oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGMuY2FsbCh0LCAnY29uc3RydWN0b3InKSAmJiB0LmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiByICYmIHIgaW5zdGFuY2VvZiByICYmIHUuY2FsbChyKSA9PSBkOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKCdjb25zdHJ1Y3RvcicgIT09IHQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZVt0XSkgJiYgJ19fcHJvdG9fXycgIT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0MCksIGkgPSByKDExMyksIG8gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgby5jYWxsKGUsIHQpICYmIGkoYSwgcikgJiYgKHZvaWQgMCAhPT0gciB8fCB0IGluIGUpIHx8IG4oZSwgdCwgcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE3MyksIGkgPSByKDE4NikoZnVuY3Rpb24gKGUsIHQsIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbihlLCB0LCByLCBpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTM5KSwgaSA9IHIoMTg3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAtMSwgbyA9IHIubGVuZ3RoLCBhID0gbyA+IDEgPyByW28gLSAxXSA6IHZvaWQgMCwgcyA9IG8gPiAyID8gclsyXSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gZS5sZW5ndGggPiAzICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGEgPyAoby0tLCBhKSA6IHZvaWQgMCwgcyAmJiBpKHJbMF0sIHJbMV0sIHMpICYmIChhID0gbyA8IDMgPyB2b2lkIDAgOiBhLCBvID0gMSksIHQgPSBPYmplY3QodCk7ICsrbiA8IG87KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHJbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIGUodCwgdSwgbiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kZWZhdWx0ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICExCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0LnJlYWRPbmx5R2V0dGVyID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzNdID8gYXJndW1lbnRzWzNdIDogJ0Nhbm5vdCBzZXQgcmVhZC1vbmx5IHByb3BlcnR5ICcuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogciwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJiTG9nZ2VyLmxvZ0Vycm9yKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0Lmhhc0dldHRlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXIgJiYgdm9pZCAwICE9PSByLmdldDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kZWZhdWx0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogWydkZXNjJ107CiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0KSB8fCAodCA9IFt0XSk7CiAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyKSB8fCAociA9IFtyXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnJldmVyc2UoKSwgbyA9IHIucmV2ZXJzZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnJlZHVjZShmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuZGVmYXVsdCkoZSwgdCwgb1tyXSB8fCAnZGVzYycpOwogICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDE5MCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiAnZGVzYyc7CiAgICAgICAgICAgICAgICAgICAgciA9ICdkZXNjJyA9PT0gbiA/IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdIDwgclt0XSA/IDEgOiByW3RdIDwgZVt0XSA/IC0xIDogMDsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF0gPiByW3RdID8gMSA6IHJbdF0gPiBlW3RdID8gLTEgOiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc29ydChyKTsKICAgICAgICAgICAgICAgIH0sIHIoODMpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0MSkoT2JqZWN0LmtleXMsIE9iamVjdCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBuOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5jYWxsKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdhdGV3YXkgPSB2b2lkIDAsIHIoMSksIHIoMyksIHIoMCksIHIoNTQpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDU1KSwgbyA9IChuID0gcig0OCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfSwgYSA9IHIoOCk7CiAgICAgICAgICAgICAgICB0LmdhdGV3YXkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBbXSwgciA9IGUsIG4gPSB7fSwgcyA9IHsgYWxsOiBbXSB9OwogICAgICAgICAgICAgICAgICAgIGlmICh0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IDA7IHUgPCB0Lmxlbmd0aDsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHRbdV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuW2VdID0gITEsIHNbZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gbltlXSAmJiAobltlXSA9ICEwLCBhLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDQpLmxvZ0luZm8oJ09wZW5pbmcgZ2F0ZSAnLmNvbmNhdChyLCAnLicpLmNvbmNhdChlKSksIHAoZSksIC0xID09PSBPYmplY3QudmFsdWVzKG4pLmluZGV4T2YoITEpICYmIHAoJ2FsbCcpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAnYWxsJywgdSA9IHQgfHwgJ2FsbCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYWxsJyAhPT0gdSAmJiB2b2lkIDAgPT09IG5bdV0gfHwgJ2FsbCcgPT09IHUgJiYgKDAsIG8uZGVmYXVsdCkobikgfHwgJ2FsbCcgIT09IHUgJiYgdm9pZCAwID09PSBzW3VdIHx8ICEwID09PSBuW3VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5iYkxvZ2dlci5hdFZlcmJvc2l0eSg0KS5sb2dJbmZvKCdSdW5uaW5nIENhbGxiYWNrICcuY29uY2F0KHIsICcuJykuY29uY2F0KHUpKSwgdm9pZCAoMCwgaS5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzW3VdLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAnYWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBzW2VdW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGkubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSAwOyByIDwgc1tlXS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2VdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmhhc093blByb3BlcnR5KGUpICYmIChuW2VdID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgIT09IG5bZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uT3BlbjogZiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46IGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEdhdGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNPcGVuOiBtLAogICAgICAgICAgICAgICAgICAgICAgICByZXNldDogZywKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZSwgbiA9IHIuaGFzT3duUHJvcGVydHksIGkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSwgbyA9IGkuaXRlcmF0b3IgfHwgJ0BAaXRlcmF0b3InLCBhID0gaS5hc3luY0l0ZXJhdG9yIHx8ICdAQGFzeW5jSXRlcmF0b3InLCBzID0gaS50b1N0cmluZ1RhZyB8fCAnQEB0b1N0cmluZ1RhZycsIHUgPSAnb2JqZWN0JyA9PSB0eXBlb2YgZSwgYyA9IHQucmVnZW5lcmF0b3JSdW50aW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHUgJiYgKGUuZXhwb3J0cyA9IGMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChjID0gdC5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1ID8gZS5leHBvcnRzIDoge30pLndyYXAgPSBtOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHt9LCBsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGxbb10gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIHAgPSBmICYmIGYoZihBKFtdKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBwICYmIHAgIT09IHIgJiYgbi5jYWxsKHAsIG8pICYmIChsID0gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gaC5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHkucHJvdG90eXBlID0gZy5jb25zdHJ1Y3RvciA9IGgsIGguY29uc3RydWN0b3IgPSB5LCBoW3NdID0geS5kaXNwbGF5TmFtZSA9ICdHZW5lcmF0b3JGdW5jdGlvbicsIGMuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgZS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQgJiYgKHQgPT09IHkgfHwgJ0dlbmVyYXRvckZ1bmN0aW9uJyA9PT0gKHQuZGlzcGxheU5hbWUgfHwgdC5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMubWFyayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsIGgpIDogKGUuX19wcm90b19fID0gaCwgcyBpbiBlIHx8IChlW3NdID0gJ0dlbmVyYXRvckZ1bmN0aW9uJykpLCBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMuYXdyYXAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19hd2FpdDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LCBTKE8ucHJvdG90eXBlKSwgTy5wcm90b3R5cGVbYV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5Bc3luY0l0ZXJhdG9yID0gTywgYy5hc3luYyA9IGZ1bmN0aW9uIChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBPKG0oZSwgdCwgciwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaXNHZW5lcmF0b3JGdW5jdGlvbih0KSA/IGkgOiBpLm5leHQoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZG9uZSA/IGUudmFsdWUgOiBpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBTKGcpLCBnW3NdID0gJ0dlbmVyYXRvcicsIGdbb10gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZy50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBHZW5lcmF0b3JdJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5rZXlzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yZXZlcnNlKCksIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHQubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnZhbHVlID0gbiwgci5kb25lID0gITEsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZG9uZSA9ICEwLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy52YWx1ZXMgPSBBLCB3LnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAnbmV4dCcsIHRoaXMuYXJnID0gdW5kZWZpbmVkLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChJKSwgIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcgPT09IHQuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCB0KSAmJiAhaXNOYU4oK3Quc2xpY2UoMSkpICYmICh0aGlzW3RdID0gdW5kZWZpbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyA9PT0gZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUuYXJnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIociwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS50eXBlID0gJ3Rocm93JywgYS5hcmcgPSBlLCB0Lm5leHQgPSByLCBuICYmICh0Lm1ldGhvZCA9ICduZXh0JywgdC5hcmcgPSB1bmRlZmluZWQpLCAhIW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzLnRyeUVudHJpZXNbaV0sIGEgPSBvLmNvbXBsZXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncm9vdCcgPT09IG8udHJ5TG9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcignZW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8udHJ5TG9jIDw9IHRoaXMucHJldikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuLmNhbGwobywgJ2NhdGNoTG9jJyksIHUgPSBuLmNhbGwobywgJ2ZpbmFsbHlMb2MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICYmIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgby5jYXRjaExvYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihvLmNhdGNoTG9jLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBvLmZpbmFsbHlMb2MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoby5maW5hbGx5TG9jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgby5jYXRjaExvYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihvLmNhdGNoTG9jLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgby5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKG8uZmluYWxseUxvYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicnVwdDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHIgPj0gMDsgLS1yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy50cnlFbnRyaWVzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmIG4uY2FsbChpLCAnZmluYWxseUxvYycpICYmIHRoaXMucHJldiA8IGkuZmluYWxseUxvYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAoJ2JyZWFrJyA9PT0gZSB8fCAnY29udGludWUnID09PSBlKSAmJiBvLnRyeUxvYyA8PSB0ICYmIHQgPD0gby5maW5hbGx5TG9jICYmIChvID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBvID8gby5jb21wbGV0aW9uIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudHlwZSA9IGUsIGEuYXJnID0gdCwgbyA/ICh0aGlzLm1ldGhvZCA9ICduZXh0JywgdGhpcy5uZXh0ID0gby5maW5hbGx5TG9jLCBkKSA6IHRoaXMuY29tcGxldGUoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdicmVhaycgPT09IGUudHlwZSB8fCAnY29udGludWUnID09PSBlLnR5cGUgPyB0aGlzLm5leHQgPSBlLmFyZyA6ICdyZXR1cm4nID09PSBlLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSBlLmFyZywgdGhpcy5tZXRob2QgPSAncmV0dXJuJywgdGhpcy5uZXh0ID0gJ2VuZCcpIDogJ25vcm1hbCcgPT09IGUudHlwZSAmJiB0ICYmICh0aGlzLm5leHQgPSB0KSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyB0ID49IDA7IC0tdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMudHJ5RW50cmllc1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuZmluYWxseUxvYyA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUoci5jb21wbGV0aW9uLCByLmFmdGVyTG9jKSwgSShyKSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy50cnlFbnRyaWVzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50cnlMb2MgPT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5jb21wbGV0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IG4udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaWxsZWdhbCBjYXRjaCBhdHRlbXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I6IEEoZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5hbWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMb2M6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnbmV4dCcgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHVuZGVmaW5lZCksIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQgJiYgdC5wcm90b3R5cGUgaW5zdGFuY2VvZiBiID8gdCA6IGIsIG8gPSBPYmplY3QuY3JlYXRlKGkucHJvdG90eXBlKSwgYSA9IG5ldyB3KG4gfHwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5faW52b2tlID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ3N1c3BlbmRlZFN0YXJ0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoaSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZXhlY3V0aW5nJyA9PT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdjb21wbGV0ZWQnID09PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndGhyb3cnID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoci5tZXRob2QgPSBpLCByLmFyZyA9IG87OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHIuZGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IF8oYSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ25leHQnID09PSByLm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZW50ID0gci5fc2VudCA9IHIuYXJnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCd0aHJvdycgPT09IHIubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N1c3BlbmRlZFN0YXJ0JyA9PT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG4gPSAnY29tcGxldGVkJywgci5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmRpc3BhdGNoRXhjZXB0aW9uKHIuYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm4nID09PSByLm1ldGhvZCAmJiByLmFicnVwdCgncmV0dXJuJywgci5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAnZXhlY3V0aW5nJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB2KGUsIHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ25vcm1hbCcgPT09IHUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSByLmRvbmUgPyAnY29tcGxldGVkJyA6ICdzdXNwZW5kZWRZaWVsZCcsIHUuYXJnID09PSBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1LmFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiByLmRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rocm93JyA9PT0gdS50eXBlICYmIChuID0gJ2NvbXBsZXRlZCcsIHIubWV0aG9kID0gJ3Rocm93Jywgci5hcmcgPSB1LmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCByLCBhKSwgbzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub3JtYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogZS5jYWxsKHQsIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0aHJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhyb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybicKICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlID0gZnVuY3Rpb24gKHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uICh0LCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiB0KHIsIGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdihlW3JdLCBlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndGhyb3cnICE9PSBzLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHMuYXJnLCBjID0gdS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgYyAmJiBuLmNhbGwoYywgJ19fYXdhaXQnKSA/IFByb21pc2UucmVzb2x2ZShjLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgnbmV4dCcsIGUsIG8sIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoJ3Rocm93JywgZSwgbywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoYykudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnZhbHVlID0gZSwgbyh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEocy5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHIsIGksIHQsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSB0ID8gdC50aGVuKG8sIG8pIDogbygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLml0ZXJhdG9yW3QubWV0aG9kXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZGVsZWdhdGUgPSBudWxsLCAndGhyb3cnID09PSB0Lm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLml0ZXJhdG9yLnJldHVybiAmJiAodC5tZXRob2QgPSAncmV0dXJuJywgdC5hcmcgPSB1bmRlZmluZWQsIF8oZSwgdCksICd0aHJvdycgPT09IHQubWV0aG9kKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tZXRob2QgPSAndGhyb3cnLCB0LmFyZyA9IG5ldyBUeXBlRXJyb3IoJ1RoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgXCd0aHJvd1wnIG1ldGhvZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2KHIsIGUuaXRlcmF0b3IsIHQuYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IG4udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWV0aG9kID0gJ3Rocm93JywgdC5hcmcgPSBuLmFyZywgdC5kZWxlZ2F0ZSA9IG51bGwsIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuLmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyBpLmRvbmUgPyAodFtlLnJlc3VsdE5hbWVdID0gaS52YWx1ZSwgdC5uZXh0ID0gZS5uZXh0TG9jLCAncmV0dXJuJyAhPT0gdC5tZXRob2QgJiYgKHQubWV0aG9kID0gJ25leHQnLCB0LmFyZyA9IHVuZGVmaW5lZCksIHQuZGVsZWdhdGUgPSBudWxsLCBkKSA6IGkgOiAodC5tZXRob2QgPSAndGhyb3cnLCB0LmFyZyA9IG5ldyBUeXBlRXJyb3IoJ2l0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0JyksIHQuZGVsZWdhdGUgPSBudWxsLCBkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geyB0cnlMb2M6IGVbMF0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgMSBpbiBlICYmICh0LmNhdGNoTG9jID0gZVsxXSksIDIgaW4gZSAmJiAodC5maW5hbGx5TG9jID0gZVsyXSwgdC5hZnRlckxvYyA9IGVbM10pLCB0aGlzLnRyeUVudHJpZXMucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jb21wbGV0aW9uIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAnbm9ybWFsJywgZGVsZXRlIHQuYXJnLCBlLmNvbXBsZXRpb24gPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiAncm9vdCcgfV0sIGUuZm9yRWFjaChFLCB0aGlzKSwgdGhpcy5yZXNldCghMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihlLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IC0xLCBpID0gZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyArK3IgPCBlLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5jYWxsKGUsIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlID0gZVtyXSwgdC5kb25lID0gITEsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmFsdWUgPSB1bmRlZmluZWQsIHQuZG9uZSA9ICEwLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLm5leHQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5leHQ6IFQgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfSgpIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyB0KG4ocilbMF0sIHJbMV0pIDogdChyKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5yZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHZvaWQgMCAhPT0gbyAmJiBuKG8uY2FsbChlKSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvLCBhID0gcig1MyksIHMgPSByKDE5NyksIHUgPSByKDE2MyksIGMgPSByKDEyOCksIGQgPSByKDE4KSwgbCA9IGQucHJvY2VzcywgZiA9IGQuc2V0SW1tZWRpYXRlLCBwID0gZC5jbGVhckltbWVkaWF0ZSwgZyA9IGQuTWVzc2FnZUNoYW5uZWwsIG0gPSBkLkRpc3BhdGNoLCB2ID0gMCwgYiA9IHt9LCB5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICt0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBiW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJbZV0sIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB5LmNhbGwoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZiAmJiBwIHx8IChmID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gW10sIHIgPSAxOyBhcmd1bWVudHMubGVuZ3RoID4gcjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGFyZ3VtZW50c1tyKytdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbKyt2XSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcygnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gZSA6IEZ1bmN0aW9uKGUpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCBuKHYpLCB2OwogICAgICAgICAgICAgICAgfSwgcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGJbZV07CiAgICAgICAgICAgICAgICB9LCAncHJvY2VzcycgPT0gcig2NykobCkgPyBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBsLm5leHRUaWNrKGEoeSwgZSwgMSkpOwogICAgICAgICAgICAgICAgfSA6IG0gJiYgbS5ub3cgPyBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBtLm5vdyhhKHksIGUsIDEpKTsKICAgICAgICAgICAgICAgIH0gOiBnID8gKG8gPSAoaSA9IG5ldyBnKCkpLnBvcnQyLCBpLnBvcnQxLm9ubWVzc2FnZSA9IGgsIG4gPSBhKG8ucG9zdE1lc3NhZ2UsIG8sIDEpKSA6IGQuYWRkRXZlbnRMaXN0ZW5lciAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBwb3N0TWVzc2FnZSAmJiAhZC5pbXBvcnRTY3JpcHRzID8gKG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGQucG9zdE1lc3NhZ2UoZSArICcnLCAnKicpOwogICAgICAgICAgICAgICAgfSwgZC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaCwgITEpKSA6IG4gPSAnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiBjKCdzY3JpcHQnKSA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdS5hcHBlbmRDaGlsZChjKCdzY3JpcHQnKSkub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB1LnJlbW92ZUNoaWxkKHRoaXMpLCB5LmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoYSh5LCBlLCAxKSwgMCk7CiAgICAgICAgICAgICAgICB9KSwgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIHNldDogZiwKICAgICAgICAgICAgICAgICAgICBjbGVhcjogcAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2b2lkIDAgPT09IHI7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyBlKCkgOiBlLmNhbGwocik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGUodFswXSkgOiBlLmNhbGwociwgdFswXSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGUodFswXSwgdFsxXSkgOiBlLmNhbGwociwgdFswXSwgdFsxXSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGUodFswXSwgdFsxXSwgdFsyXSkgOiBlLmNhbGwociwgdFswXSwgdFsxXSwgdFsyXSk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGUodFswXSwgdFsxXSwgdFsyXSwgdFszXSkgOiBlLmNhbGwociwgdFswXSwgdFsxXSwgdFsyXSwgdFszXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHIsIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig2NSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgcjsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0IHx8IHZvaWQgMCAhPT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlLCByID0gbjsKICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5yZXNvbHZlID0gbih0KSwgdGhpcy5yZWplY3QgPSBuKHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaShlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICByKDI4KSAmJiAnZycgIT0gLy4vZy5mbGFncyAmJiByKDMyKS5mKFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogcigxMTApCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig1NSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgcGVyY2VudGFnZVJ1bm5lcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICdib29sZWFuJyA9PSB0eXBlb2YgZSAmJiBlID8gdCgpIDogJ251bWJlcicgPT0gdHlwZW9mIGUgPyAxMDAgKiBNYXRoLnJhbmRvbSgpIDw9IGUgJiYgdCgpIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSA/ICgwLCBuLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgdCgpIDogciAmJiB0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlU2hvdWxkUnVuOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJyA9PSB0eXBlb2YgZSAmJiBlID8gZSA6ICdudW1iZXInID09IHR5cGVvZiBlID8gMTAwICogTWF0aC5yYW5kb20oKSA8PSBlIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSA/ICgwLCBuLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjgpLCBpID0gcig3MCksIG8gPSByKDEwNiksIGEgPSByKDkxKSwgcyA9IHIoNDcpLCB1ID0gcigxMjkpLCBjID0gT2JqZWN0LmFzc2lnbjsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9ICFjIHx8IHIoMjQpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0ge30sIHIgPSBTeW1ib2woKSwgbiA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbcl0gPSA3LCBuLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0gPSBlOwogICAgICAgICAgICAgICAgICAgIH0pLCA3ICE9IGMoe30sIGUpW3JdIHx8IE9iamVjdC5rZXlzKGMoe30sIHQpKS5qb2luKCcnKSAhPSBuOwogICAgICAgICAgICAgICAgfSkgPyBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBzKGUpLCBjID0gYXJndW1lbnRzLmxlbmd0aCwgZCA9IDEsIGwgPSBvLmYsIGYgPSBhLmY7IGMgPiBkOykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwLCBnID0gdShhcmd1bWVudHNbZCsrXSksIG0gPSBsID8gaShnKS5jb25jYXQobChnKSkgOiBpKGcpLCB2ID0gbS5sZW5ndGgsIGIgPSAwOyB2ID4gYjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBtW2IrK10sIG4gJiYgIWYuY2FsbChnLCBwKSB8fCAocltwXSA9IGdbcF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSA6IGM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjg5KSwgaSA9IHIoMTE1KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGUodCwgciwgbywgYSwgcykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSByIHx8IChudWxsID09IHQgfHwgbnVsbCA9PSByIHx8ICFpKHQpICYmICFpKHIpID8gdCAhPSB0ICYmIHIgIT0gciA6IG4odCwgciwgbywgYSwgZSwgcykpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdldERhdGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUuZ2V0VGltZSA/IGUgOiBuZXcgRGF0ZShpKGUpKTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0VGltZXN0YW1wID0gaSwgdC5nZXRFeHBpcmF0aW9uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCByID0gZS5leHBpcmVzIHx8IGUgfHwge30sIG4gPSByLmV4cGlyZXNUaW1lc3RhbXA7CiAgICAgICAgICAgICAgICAgICAgbiB8fCAobiA9IGkoZS5hdCB8fCBlLmV4cGlyZXMgfHwgZSksIHIuZXhwaXJlc1RpbWVzdGFtcCA9IG4pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZyb21Ob3dNcyA9IG4gLSB0LCByLmlzRXhwaXJlZCA9IHIuZnJvbU5vd01zIDw9IDAsIHI7CiAgICAgICAgICAgICAgICB9LCB0LmdldFRpbWV6b25lSG91ck9mZnNldCA9IG8sIHQuZ2V0TWlkbmlnaHQgPSBhLCByKDQzKTsKICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgIHNlY29uZHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWNvbmRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VjcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihlKSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRNc0Ftb3VudDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDAwICogZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWludXRlczogewogICAgICAgICAgICAgICAgICAgICAgICBpc01hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5zJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1zQW1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDYwICogZSAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvdXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzTWF0Y2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob3VycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hycycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihlKSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRNc0Ftb3VudDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2MCAqIGUgKiA2MCAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRheXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNNYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXlzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1zQW1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI0ICogZSAqIDYwICogNjAgKiAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB3ZWVrczogewogICAgICAgICAgICAgICAgICAgICAgICBpc01hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3a3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2VlaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlZWtzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1zQW1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDcgKiBlICogMjQgKiA2MCAqIDYwICogMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbW9udGhzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzTWF0Y2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vbnRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9udGhzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1zQW1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMwICogZSAqIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB5ZWFyczogewogICAgICAgICAgICAgICAgICAgICAgICBpc01hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneWVhcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5ZWFyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneXJzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1zQW1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEyICogZSAqIDMwICogNyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1pZG5pZ2h0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzTWF0Y2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ21pZG5pZ2h0JyA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRNc0Ftb3VudDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtaWRuaWdodEVzdDogewogICAgICAgICAgICAgICAgICAgICAgICBpc01hdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdtaWRuaWdodEVzdCcgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TXNBbW91bnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSgtNCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUuZ2V0VGltZSA/IGUuZ2V0VGltZSgpIDogJ3N0cmluZycgPT0gdHlwZW9mIGUgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gZS5tYXRjaCgvKFxkKykvKSwgciA9IGUubWF0Y2goLyhcRCspL2dtKSwgaSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBvID0gMCwgYSA9IDA7IGEgPCByLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHJbYV0sIHUgPSBhIC0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuW2NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5pc01hdGNoKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmFic29sdXRlID8gKGkgPSBkLmdldE1zQW1vdW50KHQgJiYgdFt1XSA/IHBhcnNlSW50KHRbdV0pIDogbnVsbCksIG8rKykgOiBpICs9IGQuZ2V0TXNBbW91bnQodCAmJiB0W3VdID8gcGFyc2VJbnQodFt1XSkgOiBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgOiAnbnVtYmVyJyA9PSB0eXBlb2YgZSAmJiBlID49IDE1MDAwMDAwMDAwMDAgPyBlIDogJ251bWJlcicgPT0gdHlwZW9mIGUgPyBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIGUgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRVVENIb3VycygpIDwgZS5nZXRIb3VycygpID8gZS5nZXRIb3VycygpIC0gKGUuZ2V0VVRDSG91cnMoKSArIDI0KSA6IGUuZ2V0SG91cnMoKSAtIGUuZ2V0VVRDSG91cnMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG8oKSwgdCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPCAwID8gdC5zZXRVVENIb3VycyhNYXRoLmFicyhlKSwgMCwgMCwgMCkgOiB0LnNldFVUQ0hvdXJzKGUsIDAsIDAsIDApLCB0LnNldERhdGUodC5nZXREYXRlKCkgKyAxKSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDE0KSwgbyA9IHIoNDEpLCBhID0gcig4NSksIHMgPSByKDc4KSwgdSA9IHIoMTE3KSwgYyA9IHIoODQpLCBkID0gcigyMyksIGwgPSByKDI0KSwgZiA9IHIoMTE5KSwgcCA9IHIoNzkpLCBnID0gcigxNDcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIsIG0sIHYsIGIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IG5bZV0sIGggPSB5LCBTID0gdiA/ICdzZXQnIDogJ2FkZCcsIE8gPSBoICYmIGgucHJvdG90eXBlLCBfID0ge30sIEUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhPLCBlLCAnZGVsZXRlJyA9PSBlIHx8ICdoYXMnID09IGUgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGIgJiYgIWQoZSkpICYmIHQuY2FsbCh0aGlzLCAwID09PSBlID8gMCA6IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6ICdnZXQnID09IGUgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmICFkKGUpID8gdm9pZCAwIDogdC5jYWxsKHRoaXMsIDAgPT09IGUgPyAwIDogZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogJ2FkZCcgPT0gZSA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbCh0aGlzLCAwID09PSBlID8gMCA6IGUpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbCh0aGlzLCAwID09PSBlID8gMCA6IGUsIHIpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGggJiYgKGIgfHwgTy5mb3JFYWNoICYmICFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBoKCkuZW50cmllcygpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBJID0gbmV3IGgoKSwgdyA9IElbU10oYiA/IHt9IDogLTAsIDEpICE9IEksIEEgPSBsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmhhcygxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBUID0gZihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHggPSAhYiAmJiBsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gbmV3IGgoKSwgdCA9IDU7IHQtLTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtTXSh0LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlLmhhcygtMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgVCB8fCAoKGggPSB0KGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKHQsIGgsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBnKG5ldyB5KCksIHQsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gciAmJiB1KHIsIHYsIG5bU10sIG4pLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkucHJvdG90eXBlID0gTywgTy5jb25zdHJ1Y3RvciA9IGgpLCAoQSB8fCB4KSAmJiAoRSgnZGVsZXRlJyksIEUoJ2hhcycpLCB2ICYmIEUoJ2dldCcpKSwgKHggfHwgdykgJiYgRShTKSwgYiAmJiBPLmNsZWFyICYmIGRlbGV0ZSBPLmNsZWFyOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtLmdldENvbnN0cnVjdG9yKHQsIGUsIHYsIFMpLCBhKGgucHJvdG90eXBlLCByKSwgcy5ORUVEID0gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGgsIGUpLCBfW2VdID0gaCwgaShpLkcgKyBpLlcgKyBpLkYgKiAoaCAhPSB5KSwgXyksIGIgfHwgbS5zZXRTdHJvbmcoaCwgZSwgdiksIGg7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIzKSwgaSA9IHIoMjcpLCBvID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkoZSksICFuKHQpICYmIG51bGwgIT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcih0ICsgJzogY2FuXCd0IHNldCBhcyBwcm90b3R5cGUhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiA9IHIoNTMpKEZ1bmN0aW9uLmNhbGwsIHIoOTApLmYoT2JqZWN0LnByb3RvdHlwZSwgJ19fcHJvdG9fXycpLnNldCwgMikpKGUsIFtdKSwgdCA9ICEoZSBpbnN0YW5jZW9mIEFycmF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oZSwgciksIHQgPyBlLl9fcHJvdG9fXyA9IHIgOiBuKGUsIHIpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oe30sICExKSA6IHZvaWQgMCksCiAgICAgICAgICAgICAgICAgICAgY2hlY2s6IG8KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5yZWR1Y2VNZXJnZXIgPSBtLCB0LmNyZWF0ZVJlZHVjZU1lcmdlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gciAmJiAoQXJyYXkuaXNBcnJheShyKSB8fCAociA9IFtlXSksIHQgPSBBcnJheS5pc0FycmF5KHQpID8gW10uY29uY2F0KHModCksIHMocikpIDogW3RdLmNvbmNhdChzKHIpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NPYmplY3Q6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWVyZ2VTZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHIoOSksIHIoMTEpLCByKDYpLCByKDEzKSwgcig0KSwgcigxNyksIHIoMiksIHIoMSksIHIoMyksIHIoMCksIHIoNSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNTUpLCBpID0gYShyKDI5KSksIG8gPSBhKHIoNDgpKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gZChPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogZChPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG4sIGkgPSB7fSwgbyA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG8ubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gb1tuXSwgdC5pbmRleE9mKHIpID49IDAgfHwgKGlbcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG8ubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvW25dLCB0LmluZGV4T2YocikgPj0gMCB8fCBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgcikgJiYgKGlbcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBnID0gewogICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogITEsCiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzOiBbXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gbChsKHt9LCBnKSwgciksIHUgPSBhLm92ZXJ3cml0ZSwgZCA9IHAoYSwgWydvdmVyd3JpdGUnXSksIGYgPSBlOwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKGYgPSAoMCwgbi5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oZiwgciwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA/ICdicmVhaycgOiB2b2lkIDAgPT09IGYgPyAoZiA9IHZvaWQgMCwgJ2JyZWFrJykgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYiA9IDA7IGIgPCB0Lmxlbmd0aDsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2JyZWFrJyA9PT0gdihiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnb2JqZWN0JyA9PT0gYyh0KSAmJiB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSB0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ29iamVjdCcgPT09IGModCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICgwLCBpLmRlZmF1bHQpKHt9LCBmLCB0KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSAoMCwgbi5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYXBwbHkodm9pZCAwLCBbZl0uY29uY2F0KHMoZC5hcmd1bWVudHMgfHwgW10pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmID0gQXJyYXkuaXNBcnJheSh5KSAmJiAhKDAsIG8uZGVmYXVsdCkoZikgPyBbZl0uY29uY2F0KHMoeSkpIDogeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5sb2NhbFN0b3JhZ2VFbmdpbmUgPSB2b2lkIDAsIHIoMTcpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDM5KSwgbyA9IHIoMTIpLCBhID0gcig5NiksIHMgPSByKDgpLCB1ID0gKG4gPSByKDI5KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGMoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbChlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGMoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBnID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzU1YzA4ZGY2MGY0MmRkYjEgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF81NWMwOGRmNjBmNDJkZGIxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja180MzZkNmY2Zjk0NzYzMjUzLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICgwLCBhLnJpY2hPYmplY3QpKHt9KSwgdCA9IHZvaWQgMCAhPT0gKDAsIG8uZG9tKSgpLndpbmRvdy5sb2NhbFN0b3JhZ2UsIHIgPSAoMCwgby5kb20pKCkud2luZG93LmxvY2FsU3RvcmFnZSwgbiA9ICgwLCBpLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmdldE1ldGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCdfQkIubHMnLCBmKEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5iYkxvZ2dlci5sb2dJbmZvKCdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBsb2NhbFN0b3JhZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGE6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyA9ICgwLCBpLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIG4gJiYgci5zZXRJdGVtKGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbCA9ICgwLCBpLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwKGcoJ19CQi5scycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEpTT04ucGFyc2Uocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gbi52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4udmFsdWUuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4udmFsdWVbaV0sIGEgPSBuLm1ldGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZShpLCBvLCBkKHsgaWQ6ICdsb2NhbFN0b3JhZ2VVcGRhdGUnIH0sIGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZyA9ICgwLCBpLmhvb2tlZEZuKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHIuZ2V0SXRlbShlKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChlLnNldFZhbHVlKCcqJywgdC52YWx1ZSwgeyBpZDogJ2xvY2FsU3RvcmFnZVVwZGF0ZScgfSksIGUuc2V0TWV0YSh0Lm1ldGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2xvY2FsU3RvcmFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0oKSwgZS5nZXRWYWx1ZSgnKicsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAnbG9jYWxTdG9yYWdlVXBkYXRlJyA9PT0gdC5pZCB8fCBuKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICgwLCBvLmRvbSkoKS53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19CQi5scycgPT09IGUua2V5ICYmIG0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB7IGV4cGlyZXM6IHsgaWQ6ICdscy4nLmNvbmNhdCh0KSB9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICgwLCB1LmRlZmF1bHQpKGksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZSh0LCByLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFZhbHVlLmFwcGx5KGUsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUtleTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRlbGV0ZUtleSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0THM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExzOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVLZXk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiByLnJlbW92ZUl0ZW0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNTVjMDhkZjYwZjQyZGRiMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF81NWMwOGRmNjBmNDJkZGIxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LmxvY2FsU3RvcmFnZUVuZ2luZSA9IGc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5jb29raWVTdG9yYWdlRW5naW5lID0gdm9pZCAwLCByKDE3KSwgcigxKSwgcigzKSwgcig1KSwgcig0KSwgcigyKSwgcigxMSksIHIoMCksIHIoNDMpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDM5KSwgaSA9IHIoMTUpLCBvID0gcig5NiksIGEgPSBwKHIoMTQ4KSksIHMgPSBwKHIoMzQpKSwgdSA9IHAocigyOSkpLCBjID0gcChyKDMwNSkpLCBkID0gcigyMDMpLCBsID0gcig4KSwgZiA9IHAocig1NikpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGcoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdihlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGcoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB5LCBoLCBTLCBPLCBfID0gKHkgPSAoMCwgby5yaWNoT2JqZWN0KSh7fSksIGggPSBhLmRlZmF1bHQuY29va2llLCBTID0gKDAsIG4uaG9va2VkRm4pKCdzeW5jJywgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gKDAsIHMuZGVmYXVsdCkoaCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgIW4ucmVhZE9ubHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4gPyBuLmNvb2tpZU5hbWUgOiBlLCBhID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIG4uc2VyaWFsaXplID8gbi5zZXJpYWxpemUubWF0Y2godCkgJiYgKGEgPSBuLnNlcmlhbGl6ZS5wcm9jZXNzKHQpKSA6IGEgPSAnb2JqZWN0JyA9PT0gYihhKSA/IEpTT04uc3RyaW5naWZ5KGEpIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9ICgwLCBpLmdldENvbmZpZykoJ3RhcmdldGluZy5jb29raWUuc2V0dGVycy4nLmNvbmNhdChvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA/IHUobywgYSwgci5leHBpcmVzLCByLnBhdGgsIHIuZG9tYWluKSA6IChsLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ3NldCBjb29raWUga2V5PScuY29uY2F0KG8sICcgdmFsdWU9JykuY29uY2F0KGEpLCByKSwgYy5kZWZhdWx0LnNldChvLCBhLCByKSwgdCAmJiB5LnNldFZhbHVlKGUsIHQsIHsgaWQ6ICdpbnRlcm5hbFNldCcgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIE8gPSAoMCwgbi5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCwgcy5kZWZhdWx0KShoLCBlKSwgciA9IHQgPyB0LmNvb2tpZU5hbWUgOiBlLCBuID0gKDAsIGkuZ2V0Q29uZmlnKSgndGFyZ2V0aW5nLmNvb2tpZS5nZXR0ZXJzLicuY29uY2F0KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGMuZGVmYXVsdC5nZXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0LmRlc2VyaWFsaXplICYmIHQuZGVzZXJpYWxpemUubWF0Y2gobykgJiYgKG8gPSB0LmRlc2VyaWFsaXplLnByb2Nlc3MobykpLCBsLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ2dldCBjb29raWUga2V5PScuY29uY2F0KHIsICcgdmFsdWU9JyksIG8pLCBvICYmIHkuc2V0VmFsdWUoZSwgbywgeyBpZDogJ2ludGVybmFsU2V0JyB9KSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgaS5nZXRDb25maWcpKCdjb29raWUnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKDAsIGYuZGVmYXVsdCkoaCwgWydkZWZhdWx0T3B0aW9ucyddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgdCkgJiYgTyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZTogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7IGV4cGlyZXM6IHsgaWQ6ICdjb29raWVzLicuY29uY2F0KGUpIH0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gKDAsIHUuZGVmYXVsdCkobiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnNldFZhbHVlKGUsIHQsIG4pLCBTKGUsIHQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHkuZ2V0TWV0YSgpLCByID0gKDAsIHMuZGVmYXVsdCkoaCwgZSksIG4gPSAoMCwgdS5kZWZhdWx0KSh7fSwgKDAsIHMuZGVmYXVsdCkociwgJ2RlZmF1bHRPcHRpb25zJywge30pLCBoLmRlZmF1bHRPcHRpb25zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSA9IHRbZV0gfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZXhwaXJlcyAmJiAnW29iamVjdCBEYXRlXScgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuLmV4cGlyZXMpICYmIChuLmV4cGlyZXMgPSAoMCwgZC5nZXREYXRlKShuLmV4cGlyZXMpKSwgaS5leHBpcmVzICYmIChpLmV4cGlyZXMgPSBuZXcgRGF0ZShpLmV4cGlyZXMpKSwgbShtKHt9LCBuKSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5LmdldFZhbHVlLmFwcGx5KHksIGFyZ3VtZW50cykgfHwgTy5hcHBseSh2b2lkIDAsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZTogUywKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29va2llOiBPLAogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVDb29raWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBzLmRlZmF1bHQpKGgsIGUpLCBuID0gciA/IHIuY29va2llTmFtZSA6IGUsIG8gPSAoMCwgaS5nZXRDb25maWcpKCd0YXJnZXRpbmcuY29va2llLmRlbGV0ZXJzLicuY29uY2F0KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPyBvKG4sIHQuZXhwaXJlcywgdC5wYXRoLCB0LmRvbWFpbikgOiAoYy5kZWZhdWx0LnJlbW92ZShuLCB0KSwgeS5kZWxldGVLZXkoZSwgeyBpZDogJ2ludGVybmFsU2V0JyB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZTogUwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmNvb2tpZVN0b3JhZ2VFbmdpbmUgPSBfOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMxMSksIGkgPSByKDMxMik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSB0IHx8IG4oZSwgdCwgaSh0KSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5jaHVuayA9IHZvaWQgMCwgcig5KSwgcigxMSksIHIoMCksIHIoNiksIHIoMTMpLCByKDEpLCByKDQpLCByKDIpOwogICAgICAgICAgICAgICAgdC5jaHVuayA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICUgdCA9PSAwID8gW10uY29uY2F0KG4oZSksIFtbcl1dKSA6IFtdLmNvbmNhdChuKGUuc2xpY2UoMCwgLTEpKSwgW1tdLmNvbmNhdChuKGUuc2xpY2UoLTEpWzBdKSwgW3JdKV0pOwogICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5jbGllbnRJbmZvID0gdm9pZCAwLCByKDE3KSwgcigyKSwgcigxKSwgcigzKSwgcig1KSwgcig5NSksIHIoMCk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGYocig0OCkpLCBpID0gcigyMSksIG8gPSByKDE1KSwgYSA9IHIoNzIpLCBzID0gcigzNSksIHUgPSByKDgpLCBjID0gcigxMjIpLCBkID0gcig0MiksIGwgPSBmKHIoNTEpKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChuID0gbi5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgci5wdXNoLmFwcGx5KHIsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbnVsbCAhPSBhcmd1bWVudHNbdF0gPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAlIDIgPyBwKE9iamVjdChyKSwgITApLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0oZSwgdCwgclt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSkgOiBwKE9iamVjdChyKSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IociwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAoMCwgby5nZXRDb25maWcpKCdjbGllbnRJbmZvLmRhdGEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgbi5kZWZhdWx0KShjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gKDAsIG8uZ2V0Q29uZmlnKSgnY2xpZW50SW5mby5kYXRhJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCgpLCBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKCgwLCBzLmNsb25lRGVlcCkoYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZih0KS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBudWxsLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuYmJMb2dnZXIubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoZSwgbC5kZWZhdWx0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5lcnJvclJlcG9ydGluZy5yZXBvcnQodCksIHIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5OiAndXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiAnbW9iaWxlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG8uc2V0Q29uZmlnKSgnY2xpZW50SW5mbycsIGcoZyh7fSwgKDAsIG8uZ2V0Q29uZmlnKSgnY2xpZW50SW5mbycpKSwge30sIHsgZGF0YTogZyhnKHt9LCBlKSwge30sIHsgY291bnRyeTogYS5mZWF0dXJlcy5nZXRWYWx1ZSgnY291bnRyeUNvZGUnKSB8fCBlLmNvdW50cnkgfSkgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBjLmFwaS5jcmVhdGVBYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBjLmFwaS5nZXQoJ2NsaWVudC1pbmZvJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmVyc2lvbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IHIuc2lnbmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRIYW5kbGVyOiByCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5nZW9Pbmx5ID0gdCwgZS5hYm9ydCA9IHIuYWJvcnQuYmluZChyKSwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZXhwb3N1cmVBcGkuZXhwb3NlKHsgZ2V0Q2xpZW50SW5mbzogdCB9KSwgKDAsIG8uZ2V0Q29uZmlnKSgnY2xpZW50SW5mby5kYXRhLmNvdW50cnknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5nZW9Pbmx5ICYmICh1LmJiTG9nZ2VyLmxvZ0luZm8oJ0Fib3J0aW5nIEluZmxpZ2h0IENsaWVudEluZm8gcmVxdWVzdCcpLCBlLmFib3J0KCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldEluZm86IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvdW50cnlDb2RlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIG8uZ2V0Q29uZmlnKSgnY2xpZW50SW5mby5kYXRhLmNvdW50cnknKSA/IFByb21pc2UucmVzb2x2ZSgoMCwgby5nZXRDb25maWcpKCdjbGllbnRJbmZvLmRhdGEuY291bnRyeScpKSA6IHQoITApLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb3VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5jbGllbnRJbmZvID0gdjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmVsZW1lbnRTb3J0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogJ3knLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBpLmJiTG9nZ2VyLCBvID0gQXJyYXkuZnJvbShlKS5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZWxlbWVudCB8fCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0IHx8ICF0LnN0eWxlIHx8ICdub25lJyA9PT0gdC5zdHlsZS5kaXNwbGF5OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAobykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5sb2dNZXNzYWdlKCdFbGVtZW50IGNvbGxlY3Rpb24gaGFzIHVuZGVmaW5lZCBvciBlbGVtZW50cyB3aXRoIGRpc3BsYXk6IG5vbmU7IHVuYWJsZSB0byBhcHBseSBlbGVtZW50IHNvcnQuJywgZSksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBhID0gKDAsIG4uZG9tKSgpLndpbmRvdy5wYWdlWU9mZnNldCB8fCAoMCwgbi5kb20pKCkud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc29ydChmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZWxlbWVudCB8fCBlLCBpID0gci5lbGVtZW50IHx8IHIsIG8gPSAneScgPT09IHQgPyBuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCA6IG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCwgcyA9ICd5JyA9PT0gdCA/IGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIDogaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyAtIGEgLSAocyAtIGEpID4gMCA/IDEgOiAtMTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHIoODMpLCByKDYpLCByKDEzKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMiksIGkgPSByKDgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxCaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpZGRlckNvZGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmlkZGVyQ29kZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHIoMzMzKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0aGlzLCB0LCByLCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCBpID0gcigxOCksIG8gPSByKDQ2KSwgYSA9IHIoNjMpLCBzID0gYSgndHlwZWRfYXJyYXknKSwgdSA9IGEoJ3ZpZXcnKSwgYyA9ICEoIWkuQXJyYXlCdWZmZXIgfHwgIWkuRGF0YVZpZXcpLCBkID0gYywgbCA9IDAsIGYgPSAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknLnNwbGl0KCcsJyk7IGwgPCA5OykgewogICAgICAgICAgICAgICAgICAgIChuID0gaVtmW2wrK11dKSA/IChvKG4ucHJvdG90eXBlLCBzLCAhMCksIG8obi5wcm90b3R5cGUsIHUsICEwKSkgOiBkID0gITE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgQUJWOiBjLAogICAgICAgICAgICAgICAgICAgIENPTlNUUjogZCwKICAgICAgICAgICAgICAgICAgICBUWVBFRDogcywKICAgICAgICAgICAgICAgICAgICBWSUVXOiB1CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDY5KSwgaSA9IHIoMzgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4oZSksIHIgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIGxlbmd0aCEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0UHJpY2VCdWNrZXRTdHJpbmcgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiAxLCBuID0gcGFyc2VGbG9hdChlKTsKICAgICAgICAgICAgICAgICAgICBpc05hTihuKSAmJiAobiA9ICcnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBsb3c6ICcnID09PSBuID8gJycgOiBsKGUsIGEsIHIpLAogICAgICAgICAgICAgICAgICAgICAgICBtZWQ6ICcnID09PSBuID8gJycgOiBsKGUsIHMsIHIpLAogICAgICAgICAgICAgICAgICAgICAgICBoaWdoOiAnJyA9PT0gbiA/ICcnIDogbChlLCB1LCByKSwKICAgICAgICAgICAgICAgICAgICAgICAgYXV0bzogJycgPT09IG4gPyAnJyA6IGwoZSwgZCwgciksCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnNlOiAnJyA9PT0gbiA/ICcnIDogbChlLCBjLCByKSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tOiAnJyA9PT0gbiA/ICcnIDogbChlLCB0LCByKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmlzVmFsaWRQcmljZUNvbmZpZyA9IGYsIHIoNDApOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoMzcpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH07CiAgICAgICAgICAgICAgICB2YXIgbyA9IHIoNyksIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LCB1ID0gewogICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0czogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIWYodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC5idWNrZXRzLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWF4ID4gdC5tYXggPyBlIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyBtYXg6IDAgfSksIGEgPSAwLCBzID0gKDAsIGkuZGVmYXVsdCkodC5idWNrZXRzLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPiBvLm1heCAqIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJlY2lzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDIpLCBuID0gKHQubWF4ICogcikudG9GaXhlZChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPD0gdC5tYXggKiByICYmIGUgPj0gYSAqIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWluID0gYSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHQubWF4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyAmJiAobiA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdm9pZCAwICE9PSB0LnByZWNpc2lvbiA/IHQucHJlY2lzaW9uIDogMiwgaSA9IHQuaW5jcmVtZW50ICogciwgbyA9IHQubWluICogciwgYSA9IE1hdGgucG93KDEwLCBuICsgMiksIHMgPSAoZSAqIGEgLSBvICogYSkgLyAoaSAqIGEpLCB1ID0gTWF0aC5mbG9vcihzKSAqIGkgKyBvOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgPSBOdW1iZXIodS50b0ZpeGVkKDEwKSkpLnRvRml4ZWQobik7CiAgICAgICAgICAgICAgICAgICAgfShlLCBzLCByKSksIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoby5pc0VtcHR5KGUpIHx8ICFlLmJ1Y2tldHMgfHwgIUFycmF5LmlzQXJyYXkoZS5idWNrZXRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYnVja2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUubWF4ICYmIGUuaW5jcmVtZW50IHx8ICh0ID0gITEpOwogICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuc2V0U2l6ZUNvbmZpZyA9IGMsIHQuZ2V0TGFiZWxzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5sYWJlbEFsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxBbGw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBlLmxhYmVsQWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGFiZWxzOiB0CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQWxsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBlLmxhYmVsQW55LAogICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYWJlbHM6IHQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgdC5zaXplU3VwcG9ydGVkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogdSwgciA9IGQodCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyLnNob3VsZEZpbHRlcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXIuc2l6ZXNTdXBwb3J0ZWRbZV07CiAgICAgICAgICAgICAgICB9LCB0LnJlc29sdmVTdGF0dXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9LCB0ID0gZS5sYWJlbHMsIHIgPSB2b2lkIDAgPT09IHQgPyBbXSA6IHQsIG4gPSBlLmxhYmVsQWxsLCBpID0gdm9pZCAwICE9PSBuICYmIG4sIHMgPSBlLmFjdGl2ZUxhYmVscywgYyA9IHZvaWQgMCA9PT0gcyA/IFtdIDogcywgbCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCBmID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDAsIHAgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IHUsIGcgPSBkKHApOwogICAgICAgICAgICAgICAgICAgIGwgPSAoMCwgby5pc1BsYWluT2JqZWN0KShsKSA/ICgwLCBvLmRlZXBDbG9uZSkobCkgOiBmID8geyBiYW5uZXI6IHsgc2l6ZXM6IGYgfSB9IDoge307CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSAoMCwgby5kZWVwQWNjZXNzKShsLCAnYmFubmVyLnNpemVzJyk7CiAgICAgICAgICAgICAgICAgICAgZy5zaG91bGRGaWx0ZXIgJiYgbSAmJiAobC5iYW5uZXIuc2l6ZXMgPSBtLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5zaXplc1N1cHBvcnRlZFtlXTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBPYmplY3Qua2V5cyhsKSwgYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogdi5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFubmVyJyAhPT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IHYuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFubmVyJyA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmICgwLCBvLmRlZXBBY2Nlc3MpKGwsICdiYW5uZXIuc2l6ZXMubGVuZ3RoJykgPiAwICYmICgwID09PSByLmxlbmd0aCB8fCAhaSAmJiAoci5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcubGFiZWxzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgci5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBhLmRlZmF1bHQpKGMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IGkgJiYgci5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IGcubGFiZWxzW3RdIHx8ICgwLCBhLmRlZmF1bHQpKGMsIHQpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGVzOiBsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbSAmJiBtLmxlbmd0aCAhPT0gbC5iYW5uZXIuc2l6ZXMubGVuZ3RoICYmIChiLmZpbHRlclJlc3VsdHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZTogbSwKICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGwuYmFubmVyLnNpemVzCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICB9LCByKDQpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDIyKSwgbyA9IHIoNyksIGEgPSAobiA9IHIoMzEpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB1ID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICB1ID0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHModCkgJiYgJ3N0cmluZycgPT0gdHlwZW9mIHQubWVkaWFRdWVyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnJyA9PT0gdC5tZWRpYVF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gKDAsIG8uZ2V0V2luZG93VG9wKSgpLm1hdGNoTWVkaWEodC5tZWRpYVF1ZXJ5KS5tYXRjaGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG8ubG9nV2FybikoJ1VuZnJpZW5kbHkgaUZyYW1lIGJsb2NrcyBzaXplQ29uZmlnIGZyb20gYmVpbmcgY29ycmVjdGx5IGV2YWx1YXRlZCcpLCByID0gbWF0Y2hNZWRpYSh0Lm1lZGlhUXVlcnkpLm1hdGNoZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAoQXJyYXkuaXNBcnJheSh0LnNpemVzU3VwcG9ydGVkKSAmJiAoZS5zaG91bGRGaWx0ZXIgPSAhMCksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZXNTdXBwb3J0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRbcl0gfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbcl1bdF0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBvLmxvZ1dhcm4pKCdzaXplQ29uZmlnIHJ1bGUgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0eSAibWVkaWFRdWVyeSInKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzU3VwcG9ydGVkOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmlsdGVyOiAhMQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaS5jb25maWcuZ2V0Q29uZmlnKCdzaXplQ29uZmlnJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhlLnNpemVDb25maWcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjMpLCBpID0gcig3OCkub25GcmVlemU7CiAgICAgICAgICAgICAgICByKDE2NykoJ2ZyZWV6ZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIG4odCkgPyBlKGkodCkpIDogdDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5hZHVuaXRDb3VudGVyID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDcpLCBpID0ge307CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gaVtlXSA9IGlbZV0gfHwgeyBiaWRkZXJzOiB7fSB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHIuYmlkZGVyc1t0XSA9IHIuYmlkZGVyc1t0XSB8fCB7fSA6IHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCByKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gblt0XSA9IChuW3RdIHx8IDApICsgMSwgblt0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBhID0gewogICAgICAgICAgICAgICAgICAgIGluY3JlbWVudFJlcXVlc3RzQ291bnRlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oZSwgJ3JlcXVlc3RzQ291bnRlcicpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50QmlkZGVyUmVxdWVzdHNDb3VudGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhlLCAncmVxdWVzdHNDb3VudGVyJywgdCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRCaWRkZXJXaW5zQ291bnRlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oZSwgJ3dpbnNDb3VudGVyJywgdCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0c0NvdW50ZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgbi5kZWVwQWNjZXNzKShpLCAnJy5jb25jYXQoZSwgJy5yZXF1ZXN0c0NvdW50ZXInKSkgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldEJpZGRlclJlcXVlc3RzQ291bnRlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBuLmRlZXBBY2Nlc3MpKGksICcnLmNvbmNhdChlLCAnLmJpZGRlcnMuJykuY29uY2F0KHQsICcucmVxdWVzdHNDb3VudGVyJykpIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRCaWRkZXJXaW5zQ291bnRlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBuLmRlZXBBY2Nlc3MpKGksICcnLmNvbmNhdChlLCAnLmJpZGRlcnMuJykuY29uY2F0KHQsICcud2luc0NvdW50ZXInKSkgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5hZHVuaXRDb3VudGVyID0gYTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lm5ld0F1Y3Rpb24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBpLCBvLCBhID0gZS5hZFVuaXRzLCBzID0gZS5hZFVuaXRDb2RlcywgYyA9IGUuY2FsbGJhY2ssIGQgPSBlLmNiVGltZW91dCwgbCA9IGUubGFiZWxzLCBmID0gZS5hdWN0aW9uSWQsIHAgPSBhLCBnID0gbCwgbSA9IHMsIHYgPSBbXSwgYiA9IFtdLCBQID0gW10sIGogPSBmIHx8IGguZ2VuZXJhdGVVVUlEKCksIFIgPSBjLCBEID0gZCwgayA9IFtdLCBOID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSWQ6IGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uRW5kOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblN0YXR1czogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdHM6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlczogbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsczogZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RzOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9CaWRzOiBQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc1JlY2VpdmVkOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lubmluZ0JpZHM6IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiBECiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBjbGVhclRpbWVvdXQobyksIHZvaWQgMCA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGgubG9nTWVzc2FnZSgnQXVjdGlvbiAnLmNvbmNhdChqLCAnIHRpbWVkT3V0JykpLCBjID0gTiwgKHMgPSB2Lm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZS5iaWRzIHx8IFtdKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjLmhhcyhlLmJpZGRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2Uobi5mbGF0dGVuLCBbXSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IGUuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogZS5iaWRkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGU6IGUuYWRVbml0Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiBlLmF1Y3Rpb25JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkubGVuZ3RoICYmIE8uZW1pdChfLkVWRU5UUy5CSURfVElNRU9VVCwgcykpLCBpID0gJ2NvbXBsZXRlZCcsIHIgPSBEYXRlLm5vdygpLCBPLmVtaXQoXy5FVkVOVFMuQVVDVElPTl9FTkQsIE0oKSksIHgocCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbSwgciA9IGIuZmlsdGVyKGguYmluZC5jYWxsKG4uYWRVbml0c0ZpbHRlciwgdGhpcywgdCkpLnJlZHVjZShWLCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmFwcGx5KHBianMsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgagogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIFIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxvZ0Vycm9yKCdFcnJvciBleGVjdXRpbmcgYmlkc0JhY2tIYW5kbGVyJywgbnVsbCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sZW5ndGggJiYgUy5jYWxsVGltZWRPdXRCaWRkZXJzKGEsIHMsIEQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHUuY29uZmlnLmdldENvbmZpZygndXNlclN5bmMnKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lbmFibGVPdmVycmlkZSB8fCB5KGkuc3luY0RlbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaC5sb2dJbmZvKCdCaWRzIFJlY2VpdmVkIGZvciBBdWN0aW9uIHdpdGggaWQ6ICcuY29uY2F0KGopLCBiKSwgaSA9ICdjb21wbGV0ZWQnLCBVKCExLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBOLmFkZChlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlLCB2ID0gdi5jb25jYXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3RzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IFUuYmluZChudWxsLCAhMCksIHUgPSBzZXRUaW1lb3V0KG4sIEQpLCBvID0gdSwgaSA9ICdpblByb2dyZXNzJywgTy5lbWl0KF8uRVZFTlRTLkFVQ1RJT05fSU5JVCwgTSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBDKEIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmNhbGxCaWRzKHAsIGUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCB0ID0gbmV3IEFycmF5KGUpLCByID0gMDsgciA8IGU7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbcl0gPSBhcmd1bWVudHNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLmFwcGx5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaDogYy5hZGRCaWRSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0OiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5hZGFwdGVyRG9uZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKEUsIHQpLCBzKHIsIGUpLCBJW2VdIHx8IChJW2VdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUkE6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW46IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcltlXSA+IDEgJiYgKElbZV0uU1JBID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVtlXS0tLCB3WzBdICYmIGEod1swXSkgJiYgdy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBELCBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITAsIHIgPSB1LmNvbmZpZy5nZXRDb25maWcoJ21heFJlcXVlc3RzUGVyT3JpZ2luJykgfHwgNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZFJlcXVlc3RzLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDEsIGkgPSB2b2lkIDAgIT09IGUuc3JjICYmIGUuc3JjID09PSBfLlMyUy5TUkMgPyAnczJzJyA6IGUuYmlkZGVyQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVtpXSAmJiAoITEgPT09IElbaV0uU1JBICYmIChuID0gTWF0aC5taW4oZS5iaWRzLmxlbmd0aCwgcikpLCBFW0lbaV0ub3JpZ2luXSArIG4gPiByICYmICh0ID0gITEpKSwgIXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCAmJiBlLnJ1bigpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlW3RdID8gZVt0XSA9IDEgOiBlW3RdKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYShuKSB8fCAoaC5sb2dXYXJuKCdxdWV1ZWluZyBhdWN0aW9uIGR1ZSB0byBsaW1pdGVkIGVuZHBvaW50IGNhcGFjaXR5JyksIHcucHVzaChuKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEJpZFJlY2VpdmVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBhZGROb0JpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgPSBQLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrOiBVLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsQmlkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdzdGFydGVkJywgdCA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFMubWFrZUJpZFJlcXVlc3RzKHAsIHQsIGosIEQsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sb2dJbmZvKCdCaWRzIFJlcXVlc3RlZCBmb3IgQXVjdGlvbiB3aXRoIGlkOiAnLmNvbmNhdChqKSwgZSksIGUubGVuZ3RoIDwgMSA/IChoLmxvZ1dhcm4oJ05vIHZhbGlkIGJpZCByZXF1ZXN0cyByZXR1cm5lZCBmb3IgYXVjdGlvbicpLCBCKCkpIDogVC5jYWxsKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaDogeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRkV2lubmluZ0JpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrLmNvbmNhdChlKSwgUy5jYWxsQmlkV29uQmlkZGVyKGUuYmlkZGVyLCBlLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmlkVGFyZ2V0aW5nOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5jYWxsU2V0VGFyZ2V0aW5nQmlkZGVyKGUuYmlkZGVyLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lubmluZ0JpZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lb3V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXVjdGlvbklkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gajsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXVjdGlvblN0YXR1czogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEFkVW5pdHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRBZFVuaXRDb2RlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpZFJlcXVlc3RzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Qmlkc1JlY2VpdmVkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmF1Y3Rpb25DYWxsYmFja3MgPSBDLCB0LmRvQ2FsbGJhY2tzSWZUaW1lZG91dCA9IFAsIHQuYWRkQmlkVG9BdWN0aW9uID0gaiwgdC5nZXRNZWRpYVR5cGVHcmFudWxhcml0eSA9IEQsIHQuZ2V0U3RhbmRhcmRCaWRkZXJTZXR0aW5ncyA9IFUsIHQuZ2V0S2V5VmFsdWVUYXJnZXRpbmdQYWlycyA9IEIsIHQuYWRqdXN0QmlkcyA9IHosIHQuZ2V0QWR2ZXJ0aXNlckRvbWFpbiA9IHQuZ2V0UHJpY2VCeUdyYW51bGFyaXR5ID0gdC5nZXRQcmljZUdyYW51bGFyaXR5ID0gdC5jYWxsUHJlYmlkQ2FjaGUgPSB0LmJpZHNCYWNrQ2FsbGJhY2sgPSB0LmFkZEJpZGRlclJlcXVlc3RzID0gdC5hZGRCaWRSZXNwb25zZSA9IHQuQVVDVElPTl9DT01QTEVURUQgPSB0LkFVQ1RJT05fSU5fUFJPR1JFU1MgPSB0LkFVQ1RJT05fU1RBUlRFRCA9IHZvaWQgMCwgcig0KSwgcigyKSwgcigyNiksIHIoMSksIHIoMyksIHIoMCksIHIoNiksIHIoMTIxKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcig3KSwgaSA9IHIoMjE3KSwgbyA9IHIoODgpLCBhID0gcigzNDUpLCBzID0gcig3NiksIHUgPSByKDIyKSwgYyA9IHIoMTI2KSwgZCA9IHIoNjEpLCBsID0gbShyKDM3KSksIGYgPSBtKHIoMzEpKSwgcCA9IHIoMTU2KSwgZyA9IHIoNDUpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB5ID0gYy51c2VyU3luYy5zeW5jVXNlcnMsIGggPSByKDcpLCBTID0gcig4NykuZGVmYXVsdCwgTyA9IHIoNjApLCBfID0gcigzNik7CiAgICAgICAgICAgICAgICB0LkFVQ1RJT05fU1RBUlRFRCA9ICdzdGFydGVkJzsKICAgICAgICAgICAgICAgIHQuQVVDVElPTl9JTl9QUk9HUkVTUyA9ICdpblByb2dyZXNzJzsKICAgICAgICAgICAgICAgIHQuQVVDVElPTl9DT01QTEVURUQgPSAnY29tcGxldGVkJywgTy5vbihfLkVWRU5UUy5CSURfQURKVVNUTUVOVCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB6KGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgRSA9IHt9LCBJID0ge30sIHcgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBBID0gKDAsIGQuaG9vaykoJ2FzeW5jJywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoLmNhbGwodGhpcy5iaWRkZXJSZXF1ZXN0LCBlLCB0KTsKICAgICAgICAgICAgICAgIH0sICdhZGRCaWRSZXNwb25zZScpOwogICAgICAgICAgICAgICAgdC5hZGRCaWRSZXNwb25zZSA9IEE7CiAgICAgICAgICAgICAgICB2YXIgVCA9ICgwLCBkLmhvb2spKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoLmNhbGwodGhpcy5jb250ZXh0LCBlKTsKICAgICAgICAgICAgICAgIH0sICdhZGRCaWRkZXJSZXF1ZXN0cycpOwogICAgICAgICAgICAgICAgdC5hZGRCaWRkZXJSZXF1ZXN0cyA9IFQ7CiAgICAgICAgICAgICAgICB2YXIgeCA9ICgwLCBkLmhvb2spKCdhc3luYycsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiB0KCk7CiAgICAgICAgICAgICAgICB9LCAnYmlkc0JhY2tDYWxsYmFjaycpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwLCBvID0gITEsIGEgPSBuZXcgU2V0KCksIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByLS0sIG8gJiYgMCA9PT0gciAmJiBlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEJpZFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tvLnJlcXVlc3RJZF0gPSAhMCwgcisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5hZFVuaXRDb2RlLCByID0gZS5iaWQsIG8gPSBlLmJpZGRlclJlcXVlc3QsIGEgPSBlLmF1Y3Rpb25JZCwgYyA9IG8uc3RhcnQsIGQgPSBiKHt9LCByLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSWQ6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRpbWVzdGFtcDogKDAsIG4udGltZXN0YW1wKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRpbWVzdGFtcDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogcGFyc2VGbG9hdChyLmNwbSkgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogci5iaWRkZXJDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnRpbWVUb1Jlc3BvbmQgPSBkLnJlc3BvbnNlVGltZXN0YW1wIC0gZC5yZXF1ZXN0VGltZXN0YW1wLCBPLmVtaXQoXy5FVkVOVFMuQklEX0FESlVTVE1FTlQsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gby5iaWRzICYmICgwLCBsLmRlZmF1bHQpKG8uYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkVW5pdENvZGUgPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHAgPSBmICYmIGYucmVuZGVyZXIsIGcgPSBkLm1lZGlhVHlwZSwgbSA9IGYgJiYgZi5tZWRpYVR5cGVzICYmIGYubWVkaWFUeXBlc1tnXSwgeSA9IG0gJiYgbS5yZW5kZXJlciwgaCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXkgfHwgIXkudXJsIHx8ICEwID09PSB5LmJhY2t1cE9ubHkgJiYgeS5yZW5kZXIgPyAhcCB8fCAhcC51cmwgfHwgITAgPT09IHAuYmFja3VwT25seSAmJiByLnJlbmRlcmVyIHx8IChoID0gcCkgOiBoID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICYmIChkLnJlbmRlcmVyID0gcy5SZW5kZXJlci5pbnN0YWxsKHsgdXJsOiBoLnVybCB9KSwgZC5yZW5kZXJlci5zZXRSZW5kZXIoaC5yZW5kZXIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUyA9IEQoci5tZWRpYVR5cGUsIGYsIHUuY29uZmlnLmdldENvbmZpZygnbWVkaWFUeXBlUHJpY2VHcmFudWxhcml0eScpKSwgRSA9ICgwLCBpLmdldFByaWNlQnVja2V0U3RyaW5nKShkLmNwbSwgJ29iamVjdCcgPT09IHYoUykgPyBTIDogdS5jb25maWcuZ2V0Q29uZmlnKCdjdXN0b21QcmljZUJ1Y2tldCcpLCB1LmNvbmZpZy5nZXRDb25maWcoJ2N1cnJlbmN5LmdyYW51bGFyaXR5TXVsdGlwbGllcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5wYkxnID0gRS5sb3csIGQucGJNZyA9IEUubWVkLCBkLnBiSGcgPSBFLmhpZ2gsIGQucGJBZyA9IEUuYXV0bywgZC5wYkRnID0gRS5kZW5zZSwgZC5wYkNnID0gRS5jdXN0b20sIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0OiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogdC5nZXRBdWN0aW9uSWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8nID09PSBhLm1lZGlhVHlwZSA/IGZ1bmN0aW9uIChlLCB0LCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAhMCwgYSA9ICgwLCBuLmdldEJpZFJlcXVlc3QpKHQucmVxdWVzdElkLCBbcl0pLCBzID0gYSAmJiAoMCwgbi5kZWVwQWNjZXNzKShhLCAnbWVkaWFUeXBlcy52aWRlbycpLCBjID0gcyAmJiAoMCwgbi5kZWVwQWNjZXNzKShzLCAnY29udGV4dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuY29uZmlnLmdldENvbmZpZygnY2FjaGUudXJsJykgJiYgYyAhPT0gcC5PVVRTVFJFQU0gJiYgKHQudmlkZW9DYWNoZUtleSA/IHQudmFzdFVybCB8fCAoaC5sb2dFcnJvcigndmlkZW9DYWNoZUtleSBzcGVjaWZpZWQgYnV0IG5vdCByZXF1aXJlZCB2YXN0VXJsIGZvciB2aWRlbyBiaWQnKSwgbyA9ICExKSA6IChvID0gITEsIFIoZSwgdCwgaSwgYSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChqKGUsIHQpLCBpKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBhLCB0aGlzLCBkKSA6IChqKHQsIGEpLCBkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyRG9uZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmdldEJpZFJlcXVlc3RzKCksIGkgPSB1LmNvbmZpZy5nZXRDb25maWcoJ2F1Y3Rpb25PcHRpb25zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hZGQodGhpcyksIGkgJiYgIWguaXNFbXB0eShpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaS5zZWNvbmRhcnlCaWRkZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgIW4uZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBmLmRlZmF1bHQpKHMsIGUuYmlkZGVyQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgwLCBmLmRlZmF1bHQpKHMsIGUuYmlkZGVyQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IG4uZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5oYXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2UuYmlkSWRdIHx8ICh0LmFkZE5vQmlkKGUpLCBPLmVtaXQoXy5FVkVOVFMuTk9fQklELCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyAmJiAwID09PSByICYmIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB0LnRpbWVUb1Jlc3BvbmQgPiBlLmdldFRpbWVvdXQoKSArIHUuY29uZmlnLmdldENvbmZpZygndGltZW91dEJ1ZmZlcicpICYmIGUuZXhlY3V0ZUNhbGxiYWNrKCEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5nZXRCaWRSZXF1ZXN0cygpLCBuID0gKDAsIGwuZGVmYXVsdCkociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZGRlckNvZGUgPT09IHQuYmlkZGVyQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5iaWRkZXJDb2RlICYmIChlLmNwbSA+IDAgfHwgZS5kZWFsSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICgwLCBsLmRlZmF1bHQpKHQuYmlkcywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZFVuaXRDb2RlID09PSBlLmFkVW5pdENvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBCKGUuYmlkZGVyQ29kZSwgZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZS5hZHNlcnZlclRhcmdldGluZyA9IGIoZS5hZHNlcnZlclRhcmdldGluZyB8fCB7fSwgcik7CiAgICAgICAgICAgICAgICAgICAgfSh0LCBuKSwgTy5lbWl0KF8uRVZFTlRTLkJJRF9SRVNQT05TRSwgdCksIGUuYWRkQmlkUmVjZWl2ZWQodCksIFAoZSwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmJpZHNCYWNrQ2FsbGJhY2sgPSB4OwogICAgICAgICAgICAgICAgdmFyIFIgPSAoMCwgZC5ob29rKSgnYXN5bmMnLCBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICgwLCBhLnN0b3JlKShbdF0sIGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPyAoaC5sb2dXYXJuKCdGYWlsZWQgdG8gc2F2ZSB0byB0aGUgdmlkZW8gY2FjaGU6ICcuY29uY2F0KG4sICcuIFZpZGVvIGJpZCBtdXN0IGJlIGRpc2NhcmRlZC4nKSksIFAoZSwgdCkpIDogJycgPT09IGlbMF0udXVpZCA/IChoLmxvZ1dhcm4oJ1N1cHBsaWVkIHZpZGVvIGNhY2hlIGtleSB3YXMgYWxyZWFkeSBpbiB1c2UgYnkgUHJlYmlkIENhY2hlOyBjYWNoaW5nIGF0dGVtcHQgd2FzIHJlamVjdGVkLiBWaWRlbyBiaWQgbXVzdCBiZSBkaXNjYXJkZWQuJyksIFAoZSwgdCkpIDogKHQudmlkZW9DYWNoZUtleSA9IGlbMF0udXVpZCwgdC52YXN0VXJsIHx8ICh0LnZhc3RVcmwgPSAoMCwgYS5nZXRDYWNoZVVybCkodC52aWRlb0NhY2hlS2V5KSksIGooZSwgdCksIHIoKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgbik7CiAgICAgICAgICAgICAgICB9LCAnY2FsbFByZWJpZENhY2hlJyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSBnLlZJREVPKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICgwLCBuLmRlZXBBY2Nlc3MpKHQsICdtZWRpYVR5cGVzLicuY29uY2F0KGcuVklERU8sICcuY29udGV4dCcpLCAnaW5zdHJlYW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyWycnLmNvbmNhdChnLlZJREVPLCAnLScpLmNvbmNhdChpKV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gclsnJy5jb25jYXQoZy5WSURFTywgJy0nKS5jb25jYXQoaSldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByW2VdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuY2FsbFByZWJpZENhY2hlID0gUjsKICAgICAgICAgICAgICAgIHZhciBrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEQoZSwgdCwgdS5jb25maWcuZ2V0Q29uZmlnKCdtZWRpYVR5cGVQcmljZUdyYW51bGFyaXR5JykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiByID8gJ3N0cmluZycgPT0gdHlwZW9mIHIgPyByIDogJ2N1c3RvbScgOiB1LmNvbmZpZy5nZXRDb25maWcoJ3ByaWNlR3JhbnVsYXJpdHknKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LmdldFByaWNlR3JhbnVsYXJpdHkgPSBrOwogICAgICAgICAgICAgICAgdmFyIE4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gXy5HUkFOVUxBUklUWV9PUFRJT05TLkFVVE8gPyB0LnBiQWcgOiBlID09PSBfLkdSQU5VTEFSSVRZX09QVElPTlMuREVOU0UgPyB0LnBiRGcgOiBlID09PSBfLkdSQU5VTEFSSVRZX09QVElPTlMuTE9XID8gdC5wYkxnIDogZSA9PT0gXy5HUkFOVUxBUklUWV9PUFRJT05TLk1FRElVTSA/IHQucGJNZyA6IGUgPT09IF8uR1JBTlVMQVJJVFlfT1BUSU9OUy5ISUdIID8gdC5wYkhnIDogZSA9PT0gXy5HUkFOVUxBUklUWV9PUFRJT05TLkNVU1RPTSA/IHQucGJDZyA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQuZ2V0UHJpY2VCeUdyYW51bGFyaXR5ID0gTjsKICAgICAgICAgICAgICAgIHZhciBNID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tZXRhICYmIGUubWV0YS5hZHZlcnRpc2VyRG9tYWlucyAmJiBlLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMubGVuZ3RoID4gMCA/IGUubWV0YS5hZHZlcnRpc2VyRG9tYWluc1swXSA6ICcnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gVShlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw6ICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBuLmdldFZhbHVlKShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBfLlRBUkdFVElOR19LRVlTLCBhID0gayhlLCByKSwgcyA9IHBianMuYmlkZGVyU2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNbXy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF0gfHwgKHNbXy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF0gPSB7fSksIHNbXy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF1bXy5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HXSB8fCAoc1tfLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXVtfLkpTT05fTUFQUElORy5BRFNFUlZFUl9UQVJHRVRJTkddID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvLkJJRERFUiwgJ2JpZGRlckNvZGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoby5BRF9JRCwgJ2FkSWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoby5QUklDRV9CVUNLRVQsIE4oYSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvLlNJWkUsICdzaXplJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG8uREVBTCwgJ2RlYWxJZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvLlNPVVJDRSwgJ3NvdXJjZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvLkZPUk1BVCwgJ21lZGlhVHlwZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvLkFET01BSU4sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWV0YSAmJiBlLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMgJiYgZS5tZXRhLmFkdmVydGlzZXJEb21haW5zLmxlbmd0aCA+IDAgPyBlLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnNbMF0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCAndmlkZW8nID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gc1tfLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXVtfLkpTT05fTUFQUElORy5BRFNFUlZFUl9UQVJHRVRJTkddOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uVVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLkNBQ0hFX0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09ICgwLCBsLmRlZmF1bHQpKGMsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmtleSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJiBjLnB1c2goaShlLCAndmlkZW9DYWNoZUtleScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1LmNvbmZpZy5nZXRDb25maWcoJ2NhY2hlLnVybCcpICYmICghdCB8fCAhMSAhPT0gaC5kZWVwQWNjZXNzKHMsICcnLmNvbmNhdCh0LCAnLnNlbmRTdGFuZGFyZFRhcmdldGluZycpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gKDAsIG4ucGFyc2VVcmwpKHUuY29uZmlnLmdldENvbmZpZygnY2FjaGUudXJsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSAoMCwgbC5kZWZhdWx0KShjLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmtleSA9PT0gby5DQUNIRV9IT1NUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgYy5wdXNoKGkoby5DQUNIRV9IT1NULCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLmRlZXBBY2Nlc3MoZSwgJ2Fkc2VydmVyVGFyZ2V0aW5nLicuY29uY2F0KG8uQ0FDSEVfSE9TVCkpID8gZS5hZHNlcnZlclRhcmdldGluZ1tvLkNBQ0hFX0hPU1RdIDogZC5ob3N0bmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1tfLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEIoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGlmICghdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBuID0ge30sIGkgPSBwYmpzLmJpZGRlclNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgIGkgJiYgKEwobiwgVSh0Lm1lZGlhVHlwZSwgZSwgciksIHQpLCBlICYmIGlbZV0gJiYgaVtlXVtfLkpTT05fTUFQUElORy5BRFNFUlZFUl9UQVJHRVRJTkddICYmIChMKG4sIGlbZV0sIHQpLCB0LnNlbmRTdGFuZGFyZFRhcmdldGluZyA9IGlbZV0uc2VuZFN0YW5kYXJkVGFyZ2V0aW5nKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmF0aXZlICYmIChuID0gYih7fSwgbiwgKDAsIG8uZ2V0TmF0aXZlVGFyZ2V0aW5nKSh0LCByKSkpLCBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W18uSlNPTl9NQVBQSU5HLkFEU0VSVkVSX1RBUkdFVElOR107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc2l6ZSA9IHIuZ2V0U2l6ZSgpLCBoLl9lYWNoKG4sIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi5rZXksIG8gPSBuLnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbaV0gJiYgaC5sb2dXYXJuKCdUaGUga2V5OiAnICsgaSArICcgaXMgZ2V0dGluZyBvdmV3cml0dGVuJyksIGguaXNGbihvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gbyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxvZ0Vycm9yKCdiaWRtYW5hZ2VyJywgJ0VSUk9SJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgMCA9PT0gdC5zdXBwcmVzc0VtcHR5S2V5cyB8fCAhMCAhPT0gdC5zdXBwcmVzc0VtcHR5S2V5cykgJiYgaSAhPT0gXy5UQVJHRVRJTkdfS0VZUy5ERUFMIHx8ICFoLmlzRW1wdHlTdHIobykgJiYgbnVsbCAhPSBvID8gZVtpXSA9IG8gOiBoLmxvZ0luZm8oJ3N1cHByZXNzaW5nIGVtcHR5IGtleSBcJycgKyBpICsgJ1wnIGZyb20gYWRzZXJ2ZXIgdGFyZ2V0aW5nJyk7CiAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciA9IGUuYmlkZGVyQ29kZSwgbiA9IGUuY3BtOwogICAgICAgICAgICAgICAgICAgIGlmIChwYmpzLmJpZGRlclNldHRpbmdzICYmIChyICYmIHBianMuYmlkZGVyU2V0dGluZ3Nbcl0gJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgcGJqcy5iaWRkZXJTZXR0aW5nc1tyXS5iaWRDcG1BZGp1c3RtZW50ID8gdCA9IHBianMuYmlkZGVyU2V0dGluZ3Nbcl0uYmlkQ3BtQWRqdXN0bWVudCA6IHBianMuYmlkZGVyU2V0dGluZ3NbXy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF0gJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgcGJqcy5iaWRkZXJTZXR0aW5nc1tfLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXS5iaWRDcG1BZGp1c3RtZW50ICYmICh0ID0gcGJqcy5iaWRkZXJTZXR0aW5nc1tfLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXS5iaWRDcG1BZGp1c3RtZW50KSwgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0KGUuY3BtLCBiKHt9LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgubG9nRXJyb3IoJ0Vycm9yIGR1cmluZyBiaWQgYWRqdXN0bWVudCcsICdiaWRtYW5hZ2VyLmpzJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbiA+PSAwICYmIChlLmNwbSA9IG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdC5hZFVuaXRDb2RlXSB8fCAoZVt0LmFkVW5pdENvZGVdID0geyBiaWRzOiBbXSB9KSwgZVt0LmFkVW5pdENvZGVdLmJpZHMucHVzaCh0KSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZ2V0QWR2ZXJ0aXNlckRvbWFpbiA9IE07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQyKSwgaSA9IHIoMTE1KSwgbyA9IHIoMTgxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuKGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBFcnJvcl0nID09IHQgfHwgJ1tvYmplY3QgRE9NRXhjZXB0aW9uXScgPT0gdCB8fCAnc3RyaW5nJyA9PSB0eXBlb2YgZS5tZXNzYWdlICYmICdzdHJpbmcnID09IHR5cGVvZiBlLm5hbWUgJiYgIW8oZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gLzwlPShbXHNcU10rPyklPi9nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICByKDI1KSwgcigzMTkpLCByKDMyMCksIHIoMzIyKSwgcigxNTIpLCByKDMyMyksIHIoMzI0KSwgcigzMjUpLCByKDM0MiksIHIoMzQ5KSwgcigzNTApLCByKDM1MSksIHIoMzU3KSwgcigzNTgpLCByKDM1OSksIHIoMzYwKSwgcigzNjIpLCByKDM2MyksIHIoMzc3KSwgcigzNzgpLCByKDM4MCksIHIoMzgxKSwgcigzODIpLCByKDM4MyksIHIoMzg0KSwgcigzODUpLCByKDM4NyksIHIoMzg5KSwgcigzOTApLCByKDM5MSksIHIoMzkyKSwgcigzOTQpLCBlLmV4cG9ydHMgPSByKDM5Nyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKDEwNCkoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNjYpLCBpID0gcigxMDYpLCBvID0gcigyNyksIGEgPSByKDE4KS5SZWZsZWN0OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gYSAmJiBhLm93bktleXMgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uZihvKGUpKSwgciA9IGkuZjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA/IHQuY29uY2F0KHIoZSkpIDogdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNzApLCBpID0gcigxMDYpLCBvID0gcig5MSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbihlKSwgciA9IGkuZjsKICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBzID0gcihlKSwgdSA9IG8uZiwgYyA9IDA7IHMubGVuZ3RoID4gYzspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2FsbChlLCBhID0gc1tjKytdKSAmJiB0LnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDMyKSwgaSA9IHIoMjcpLCBvID0gcig3MCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKDI4KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpKGUpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIGEgPSBvKHQpLCBzID0gYS5sZW5ndGgsIHUgPSAwOyBzID4gdTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbi5mKGUsIHIgPSBhW3UrK10sIHRbcl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNTcpLCBpID0gcig2NikuZiwgbyA9IHt9LnRvU3RyaW5nLCBhID0gJ29iamVjdCcgPT0gdHlwZW9mIHdpbmRvdyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMuZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgJ1tvYmplY3QgV2luZG93XScgPT0gby5jYWxsKGUpID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSA6IGkobihlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDgwKSwgaSA9IHIoNzcpLCBvID0gcig3OSksIGEgPSB7fTsKICAgICAgICAgICAgICAgIHIoNDYpKGEsIHIoMTkpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9KSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBlLnByb3RvdHlwZSA9IG4oYSwgeyBuZXh0OiBpKDEsIHIpIH0pLCBvKGUsIHQgKyAnIEl0ZXJhdG9yJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEzNSk7CiAgICAgICAgICAgICAgICByKDE0KSh7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnUmVnRXhwJywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBuICE9PSAvLi8uZXhlYwogICAgICAgICAgICAgICAgfSwgeyBleGVjOiBuIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0KSwgaSA9IHIoMTY0KSghMCk7CiAgICAgICAgICAgICAgICBuKG4uUywgJ09iamVjdCcsIHsKICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSByKDEzMCkoITApOwogICAgICAgICAgICAgICAgbihuLlAsICdBcnJheScsIHsKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodGhpcywgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCByKDEwNykoJ2luY2x1ZGVzJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpLCBpID0gcigxNzApOwogICAgICAgICAgICAgICAgbihuLlAgKyBuLkYgKiByKDE3MSkoJ2luY2x1ZGVzJyksICdTdHJpbmcnLCB7CiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIX5pKHRoaXMsIGUsICdpbmNsdWRlcycpLmluZGV4T2YoZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBuLCBpOwogICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgJiYgKG4gPSB0LnNsaWNlKDApKTsKICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiAobiA9IHQuc3BsaXQoJy4nKSk7CiAgICAgICAgICAgICAgICAgICAgJ3N5bWJvbCcgPT0gdHlwZW9mIHQgJiYgKG4gPSBbdF0pOwogICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3BzIGFyZyBtdXN0IGJlIGFuIGFycmF5LCBhIHN0cmluZyBvciBhIHN5bWJvbCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKDsgbi5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID0gbi5zaGlmdCgpLCAhZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gKGUgPSBlW2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTM4KSwgaSA9IE1hdGgubWF4OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IGkodm9pZCAwID09PSB0ID8gZS5sZW5ndGggLSAxIDogdCwgMCksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IGFyZ3VtZW50cywgYSA9IC0xLCBzID0gaShvLmxlbmd0aCAtIHQsIDApLCB1ID0gQXJyYXkocyk7ICsrYSA8IHM7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1W2FdID0gb1t0ICsgYV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYSA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gQXJyYXkodCArIDEpOyArK2EgPCB0OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY1thXSA9IG9bYV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNbdF0gPSByKHUpLCBuKGUsIHRoaXMsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTczKSwgaSA9IHIoNzEpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gZSh0LCByLCBvLCBhLCBzLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodCkgJiYgaShyKSAmJiAodS5zZXQociwgdCksIG4odCwgciwgdm9pZCAwLCBlLCB1KSwgdS5kZWxldGUocikpLCB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YV9fID0gW10sIHRoaXMuc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExMiksIGkgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX19kYXRhX18sIHIgPSBuKHQsIGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHIgPCAwKSAmJiAociA9PSB0Lmxlbmd0aCAtIDEgPyB0LnBvcCgpIDogaS5jYWxsKHQsIHIsIDEpLCAtLXRoaXMuc2l6ZSwgITApOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMTIpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX19kYXRhX18sIHIgPSBuKHQsIGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByIDwgMCA/IHZvaWQgMCA6IHRbcl1bMV07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExMik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKHRoaXMuX19kYXRhX18sIGUpID4gLTE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExMik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5fX2RhdGFfXywgaSA9IG4ociwgZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPCAwID8gKCsrdGhpcy5zaXplLCByLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgXSkpIDogcltpXVsxXSA9IHQsIHRoaXM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI0NyksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4oT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHt9LCAnJywge30pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBlID8gdm9pZCAwIDogZVt0XTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjQ5KSgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAtMSwgbyA9IE9iamVjdCh0KSwgYSA9IG4odCksIHMgPSBhLmxlbmd0aDsgcy0tOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBhW2UgPyBzIDogKytpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSA9PT0gcihvW3VdLCB1LCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE3NCksIGkgPSByKDE3NSksIG8gPSByKDI1MyksIGEgPSByKDE3NyksIHMgPSByKDE3OCksIHUgPSByKDI1OCksIGMgPSByKDExNCksIGQgPSByKDI1OSksIGwgPSByKDE0MyksIGYgPSByKDE4MCksIHAgPSByKDcxKSwgZyA9IHIoMTgxKSwgbSA9IHIoMTgyKSwgdiA9IHIoMTgzKSwgYiA9IHIoMjYyKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCB5LCBoLCBTLCBPKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSB2KGUsIHIpLCBFID0gdih0LCByKSwgSSA9IE8uZ2V0KEUpOwogICAgICAgICAgICAgICAgICAgIGlmIChJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4oZSwgciwgSSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBTID8gUyhfLCBFLCByICsgJycsIGUsIHQsIE8pIDogdm9pZCAwLCBBID0gdm9pZCAwID09PSB3OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSBjKEUpLCB4ID0gIVQgJiYgbChFKSwgQyA9ICFUICYmICF4ICYmIG0oRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gRSwgVCB8fCB4IHx8IEMgPyBjKF8pID8gdyA9IF8gOiBkKF8pID8gdyA9IGEoXykgOiB4ID8gKEEgPSAhMSwgdyA9IGkoRSwgITApKSA6IEMgPyAoQSA9ICExLCB3ID0gbyhFLCAhMCkpIDogdyA9IFtdIDogZyhFKSB8fCB1KEUpID8gKHcgPSBfLCB1KF8pID8gdyA9IGIoXykgOiBwKF8pICYmICFmKF8pIHx8ICh3ID0gcyhFKSkpIDogQSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEEgJiYgKE8uc2V0KEUsIHcpLCBoKHcsIEUsIHksIFMsIE8pLCBPLmRlbGV0ZShFKSksIG4oZSwgciwgdyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUud2VicGFja1BvbHlmaWxsIHx8IChlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9LCBlLnBhdGhzID0gW10sIGUuY2hpbGRyZW4gfHwgKGUuY2hpbGRyZW4gPSBbXSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnbG9hZGVkJywgewogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnaWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZS53ZWJwYWNrUG9seWZpbGwgPSAxKSwgZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdvYmplY3QnID09IHR5cGVvZiB0ICYmIHQgJiYgdC5PYmplY3QgPT09IE9iamVjdCAmJiB0OwogICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgICAgICB9LmNhbGwodGhpcywgcigxNjkpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjU0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0ID8gbihlLmJ1ZmZlcikgOiBlLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUuY29uc3RydWN0b3IociwgZS5ieXRlT2Zmc2V0LCBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI1NSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IGUuY29uc3RydWN0b3IoZS5ieXRlTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG4odCkuc2V0KG5ldyBuKGUpKSwgdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTc2KS5VaW50OEFycmF5OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig3MSksIGkgPSBPYmplY3QuY3JlYXRlLCBvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJvdG90eXBlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZSA9IHZvaWQgMCwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyNjApLCBpID0gcigxMTUpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKSAmJiBuKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxODApLCBpID0gcigyNjEpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSBlICYmIGkoZS5sZW5ndGgpICYmICFuKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09IHR5cGVvZiBlICYmIGUgPiAtMSAmJiBlICUgMSA9PSAwICYmIGUgPD0gOTAwNzE5OTI1NDc0MDk5MTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoODIpLCBpID0gcig5Myk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGUsIGkoZSkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXRTdGFja1RyYWNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdC5zdGFjayArICcnIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB1LlNZTkMgPSAxLCB1LkFTWU5DID0gMiwgdS5RVUVVRSA9IDQ7CiAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICAgICAgICAgICAgICB1c2VQcm94eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiAwCiAgICAgICAgICAgICAgICAgICAgfSksIG4gPSBuZXcgV2Vha01hcCgpLCBpID0gJzIsMSwwJyA9PT0gWzFdLnJlZHVjZShmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfSwgMikudG9TdHJpbmcoKSA/IEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiA9IE9iamVjdCh0aGlzKSwgaSA9IG4ubGVuZ3RoID4+PiAwLCBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IG8gPCBpICYmICEobyBpbiBuKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbltvKytdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBvIDwgaTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gaW4gbiAmJiAociA9IGUociwgbltvXSwgbywgbikpLCBvKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwgbyA9IDQgPT09IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCAxLCA0KSgpID8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMsIHIgPSBhKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hcHBseShlLCByLmNvbmNhdChhKGFyZ3VtZW50cykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY2FsbChhKGFyZ3VtZW50cywgMSksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0gPSB0W3JdOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgYyA9IHt9LCBkID0gW107CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gbS5jYWxsKG51bGwsICdzeW5jJywgZSwgdCkgOiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0ID8gbS5hcHBseShudWxsLCBhcmd1bWVudHMpIDogJ29iamVjdCcgPT0gdHlwZW9mIGUgPyBmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSwgbiA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fSwgbyA9IFsnY29uc3RydWN0b3InXTsKICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCdmdW5jdGlvbicgIT0gdHlwZW9mIGVbdF0gfHwgLTEgIT09IG8uaW5kZXhPZih0KSB8fCB0Lm1hdGNoKC9eXy8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnNwbGl0KCc6JyksIG8gPSBuWzBdLCBhID0gblsxXSB8fCAnc3luYyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpW29dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtvXSA9IGVbb10gPSBtKGEsIHMsIHIgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobiAmJiBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEFycmF5LmlzQXJyYXkoZSkgPyBlIDogZS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jYWxsKHIsIGZ1bmN0aW9uIChuLCBpLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5baV0sIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhIHx8IChvID09PSByLmxlbmd0aCAtIDEgPyAodCB8fCBkLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgfHwgY29uc29sZS53YXJuKCdmdW4taG9va3M6IHJlZmVyZW5jZWQgXCcnICsgZSArICdcJyBidXQgaXQgd2FzIG5ldmVyIGNyZWF0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuW2ldID0gZyhmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5baV0gPSBlLCBzID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBuW2ldID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW10sIHIgPSBbXSwgaSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5jYWxsKHRoaXMsIHQsICdiZWZvcmUnLCBlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5jYWxsKHRoaXMsIHIsICdhZnRlcicsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SG9va3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5jb25jYXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkuZXZlcnkoZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtyXSA9PT0gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHMobiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRIb29rcygpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbDogZnVuY3Rpb24gKG4sIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gbiwgaSA9IGEsIGEodCwgciksIGUgJiYgZShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zZXQoby5hZnRlciwgYSksIG87CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgbiwgbywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9vazogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBhIHx8IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuaW5kZXhPZihzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT09IG4gJiYgKGUuc3BsaWNlKG4sIDEpLCBpKHQsIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHVzaChzKSwgZS5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJpb3JpdHkgLSBlLnByaW9yaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkodCwgciksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbShyLCBpLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gaS5hZnRlciAmJiBuLmdldChpLmFmdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLnR5cGUgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnZnVuLWhvb2tzOiByZWNyZWF0ZWQgaG9va2FibGUgd2l0aCBkaWZmZXJlbnQgdHlwZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiwgbSwgdiA9IGMgPyBwKGMpIDogZygpLCBiID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZbdF0gfHwgUmVmbGVjdC5nZXQuYXBwbHkoUmVmbGVjdCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCBkLnB1c2goeSksIGUudXNlUHJveHkgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkgJiYgUHJveHkucmV2b2NhYmxlID8gbSA9IG5ldyBQcm94eShpLCBiKSA6IHMobSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmFwcGx5ID8gYi5hcHBseShpLCB0aGlzLCBhKGFyZ3VtZW50cykpIDogaS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB2KSwgbi5nZXQobS5hZnRlcikuaW5zdGFsbChyLCBtLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoIHx8IHQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzeW5jJyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgYSA9ICdyPXQuYXBwbHkoaCwnICsgKGUubGVuZ3RoID8gJ2FyZ3VtZW50cycgOiAnZycpICsgJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmxlbmd0aCAmJiAoaSA9IHUodCwgJ2EnLCAnbihmdW5jdGlvbiBleHRyYWN0KHMpe3I9c30sZSknKSksIGUubGVuZ3RoICYmIChhID0gdShlLCAnYicsICduKGZ1bmN0aW9uIGV4dHJhY3QoKXsnICsgYSArICc7JyArIGkgKyAnfSxlKScpLCBpID0gJycpLCBuID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhciByLGU9e2JhaWw6ZnVuY3Rpb24oYSl7cj1hfX0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignOycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycgPT09IHIgJiYgKG4gPSAndC5hcHBseShoLCcgKyAoZS5sZW5ndGggPyAnQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKScgOiAnZycpICsgJy5jb25jYXQoJyArIHUodCwgJ2EnLCAnej9uKHosZSk6W10nKSArICcpKScsIGUubGVuZ3RoICYmIChuID0gJ24oZnVuY3Rpb24gcGFydGlhbCgpeycgKyBuICsgJ30sZSknKSwgbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YXIgeicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZW9mIGdbZy5sZW5ndGgtMV09PT0iZnVuY3Rpb24iJiYoej1pLmNhbGwoZy5wb3AoKSxudWxsKSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhciBlPXtiYWlsOnp9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZSwgJ2InLCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJzsnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvLmNhbGwobmV3IEZ1bmN0aW9uKCdpLGIsYSxuLHQsaCxnJywgbiksIG51bGwsIG8sIGUsIHQsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGUubGVuZ3RoOyBpLS0gPiAwOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICE9PSBpIHx8ICdhc3luYycgPT09IHIgJiYgJ2EnID09PSB0ID8gKG4gPSAnaS5jYWxsKCcgKyB0ICsgJ1snICsgaSArICddLmhvb2ssIGgsJyArIG4gKyAnKScsICdhc3luYycgPT09IHIgJiYgJ2EnID09PSB0ICYmIDAgPT09IGkgfHwgKG4gPSAnbignICsgbiArICcsZSknKSkgOiBuID0gdCArICdbJyArIGkgKyAnXS5ob29rLmFwcGx5KGgsWycgKyBuICsgKCdiJyA9PT0gdCA/ICddLmNvbmNhdChnKSknIDogJyxyXSknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBtOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXQgJiYgKCdzeW5jJyAhPT0gciB8fCBlLnJlYWR5ICYgdS5TWU5DKSAmJiAoJ2FzeW5jJyAhPT0gciB8fCBlLnJlYWR5ICYgdS5BU1lOQykgPyAnc3luYycgIT09IHIgJiYgZS5yZWFkeSAmIHUuUVVFVUUgPyBiLmFwcGx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uYXBwbHkoZVsxXSwgZVsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogYi5hcHBseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnZnVuLWhvb2tzOiBob29rZWQgZnVuY3Rpb24gbm90IHJlYWR5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBiLmFwcGx5ID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBzKHt9LCByLCBlKSkucmVhZHkgPyBsLnJlYWR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gITAsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0OyB0ID0gZS5zaGlmdCgpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfShkKTsKICAgICAgICAgICAgICAgICAgICB9IDogdCA9ICEwLCBsLmdldCA9IHAsIGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB1OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiB0ICYmICh0ID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eSAmJiAhZS5oYXNPd25Qcm9wZXJ0eShuKSB8fCAtMSA9PT0gdC5pbmRleE9mKG4pICYmIChyW25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyNCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyBlLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9LCAxKSA6IGUuY2FsbChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjY4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgNSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExMSksIGkgPSByKDI2OSksIG8gPSByKDE4NCksIGEgPSByKDI3MCksIHMgPSByKDI3MSksIHUgPSByKDE3NSksIGMgPSByKDE3NyksIGQgPSByKDI3MiksIGwgPSByKDI3NCksIGYgPSByKDE5MSksIHAgPSByKDI3NiksIGcgPSByKDE5MiksIG0gPSByKDI3NyksIHYgPSByKDI3OCksIGIgPSByKDE3OCksIHkgPSByKDExNCksIGggPSByKDE0MyksIFMgPSByKDI3OSksIE8gPSByKDcxKSwgXyA9IHIoMjgwKSwgRSA9IHIoMTE2KSwgSSA9IHIoOTMpLCB3ID0ge307CiAgICAgICAgICAgICAgICB3Wydbb2JqZWN0IEFyZ3VtZW50c10nXSA9IHdbJ1tvYmplY3QgQXJyYXldJ10gPSB3Wydbb2JqZWN0IEFycmF5QnVmZmVyXSddID0gd1snW29iamVjdCBEYXRhVmlld10nXSA9IHdbJ1tvYmplY3QgQm9vbGVhbl0nXSA9IHdbJ1tvYmplY3QgRGF0ZV0nXSA9IHdbJ1tvYmplY3QgRmxvYXQzMkFycmF5XSddID0gd1snW29iamVjdCBGbG9hdDY0QXJyYXldJ10gPSB3Wydbb2JqZWN0IEludDhBcnJheV0nXSA9IHdbJ1tvYmplY3QgSW50MTZBcnJheV0nXSA9IHdbJ1tvYmplY3QgSW50MzJBcnJheV0nXSA9IHdbJ1tvYmplY3QgTWFwXSddID0gd1snW29iamVjdCBOdW1iZXJdJ10gPSB3Wydbb2JqZWN0IE9iamVjdF0nXSA9IHdbJ1tvYmplY3QgUmVnRXhwXSddID0gd1snW29iamVjdCBTZXRdJ10gPSB3Wydbb2JqZWN0IFN0cmluZ10nXSA9IHdbJ1tvYmplY3QgU3ltYm9sXSddID0gd1snW29iamVjdCBVaW50OEFycmF5XSddID0gd1snW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nXSA9IHdbJ1tvYmplY3QgVWludDE2QXJyYXldJ10gPSB3Wydbb2JqZWN0IFVpbnQzMkFycmF5XSddID0gITAsIHdbJ1tvYmplY3QgRXJyb3JdJ10gPSB3Wydbb2JqZWN0IEZ1bmN0aW9uXSddID0gd1snW29iamVjdCBXZWFrTWFwXSddID0gITEsIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGUodCwgciwgQSwgVCwgeCwgQykgewogICAgICAgICAgICAgICAgICAgIHZhciBQLCBqID0gMSAmIHIsIFIgPSAyICYgciwgRCA9IDQgJiByOwogICAgICAgICAgICAgICAgICAgIGlmIChBICYmIChQID0geCA/IEEodCwgVCwgeCwgQykgOiBBKHQpKSwgdm9pZCAwICE9PSBQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIU8odCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBrID0geSh0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUCA9IG0odCksICFqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyh0LCBQKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOID0gZyh0KSwgTSA9ICdbb2JqZWN0IEZ1bmN0aW9uXScgPT0gTiB8fCAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nID09IE47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSh0LCBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ1tvYmplY3QgT2JqZWN0XScgPT0gTiB8fCAnW29iamVjdCBBcmd1bWVudHNdJyA9PSBOIHx8IE0gJiYgIXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQID0gUiB8fCBNID8ge30gOiBiKHQpLCAhaikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSID8gbCh0LCBzKFAsIHQpKSA6IGQodCwgYShQLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdbTl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geCA/IHQgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgPSB2KHQsIE4sIGopOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEMgfHwgKEMgPSBuZXcgbigpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgVSA9IEMuZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChVKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDLnNldCh0LCBQKSwgXyh0KSA/IHQuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICBQLmFkZChlKG4sIHIsIEEsIG4sIHQsIEMpKTsKICAgICAgICAgICAgICAgICAgICB9KSA6IFModCkgJiYgdC5mb3JFYWNoKGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFAuc2V0KGksIGUobiwgciwgQSwgaSwgdCwgQykpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciBCID0gayA/IHZvaWQgMCA6IChEID8gUiA/IHAgOiBmIDogUiA/IEkgOiBFKSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShCIHx8IHQsIGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEIgJiYgKG4gPSB0W2kgPSBuXSksIG8oUCwgaSwgZShuLCByLCBBLCBpLCB0LCBDKSk7CiAgICAgICAgICAgICAgICAgICAgfSksIFA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gLTEsIG4gPSBudWxsID09IGUgPyAwIDogZS5sZW5ndGg7ICsrciA8IG4gJiYgITEgIT09IHQoZVtyXSwgciwgZSk7KSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4MiksIGkgPSByKDExNik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIG4odCwgaSh0KSwgZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDgyKSwgaSA9IHIoOTMpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBuKHQsIGkodCksIGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4MiksIGkgPSByKDI3Myk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGUsIGkoZSksIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDgyKSwgaSA9IHIoMjc1KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgaShlKSwgdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmxlbmd0aCwgbiA9IG5ldyBlLmNvbnN0cnVjdG9yKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdzdHJpbmcnID09IHR5cGVvZiBlWzBdICYmIHIuY2FsbChlLCAnaW5kZXgnKSAmJiAobi5pbmRleCA9IGUuaW5kZXgsIG4uaW5wdXQgPSBlLmlucHV0KSwgbjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zdHJpbmdGbGFncyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdKSB8fCBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgKGUgPSAoMCwgaS5kZWZhdWx0KShlKS5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgIGlmIChvW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2VdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBpLmRlZmF1bHQpKGUuc3BsaXQoJywnKSkucmVkdWNlKGEsIHt9KSwgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHUgaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICByLmhhc093blByb3BlcnR5KHUpICYmICgnIScgPT09IHUuY2hhckF0KDApID8gKHUuaW5kZXhPZignZXhwbGljaXQnKSA+PSAwID8gbi5hbGwgPSAhMCA6IHUuaW5kZXhPZignaW1wbGljaXQnKSA+PSAwICYmIChuLmFsbCA9ICExKSwgblt1LnJlcGxhY2UoJyEnLCAnJyldID0gITEpIDogKHUuaW5kZXhPZignZXhwbGljaXQnKSA+PSAwID8gbi5hbGwgPSAhMSA6IHUuaW5kZXhPZignaW1wbGljaXQnKSA+PSAwICYmIChuLmFsbCA9ICEwKSwgblt1XSA9ICEwKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2VdID0gewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmc6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZDogciwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogbiwKICAgICAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSwgbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBvW2VdOwogICAgICAgICAgICAgICAgfSwgcigzMyksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSAobiA9IHIoMjgyKSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9OwogICAgICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdID0gITAsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0pIHx8IGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0W2VdID8gdFtlXSA6IHZvaWQgMCAhPT0gdC5pbXBsaWNpdCA/IHQuaW1wbGljaXQgOiB2b2lkIDAgIT09IHQuZXhwbGljaXQgPyAhdC5leHBsaWNpdCA6IHZvaWQgMCAhPT0gdC5hbGwgPyB0LmFsbCA6IHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kZWZhdWx0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHQuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDI4MykpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYW4gYXJyYXkgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0ICYmICdib29sZWFuJyAhPSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGEgbnVtYmVyIG9yIGJvb2xlYW4gZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gciAmJiAnYm9vbGVhbicgIT0gdHlwZW9mIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhIG51bWJlciBvciBib29sZWFuIGZvciB0aGUgdGhpcmQgYXJndW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0ICYmIHIgJiYgZVswXSAhPT0gT2JqZWN0KGVbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHt9LCByID0gZS5sZW5ndGgsIG4gPSAwOyBuIDwgcjsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlW25dXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCBpLCBvLCBhID0gW10sIHMgPSBlLmxlbmd0aCwgdSA9IDA7IHUgPCBzOyB1KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlW3VdOwogICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PSB0eXBlb2YgYyAmJiBpc05hTihjKSAmJiAobiA9IGksIGkgPSAhMCksIChuID0gbiB8fCBvICYmIG8gPT09IGMpIHx8IHQgfHwgKG4gPSBhLmluZGV4T2YoYykgPiAtMSksIG4gPyBuID0gITEgOiAoYS5wdXNoKGMpLCBvID0gYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgKHQgPSB0LnNwbGl0KCcuJykpOwogICAgICAgICAgICAgICAgICAgICdzeW1ib2wnID09IHR5cGVvZiB0ICYmICh0ID0gW3RdKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHQucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IG4gPSB0LnNoaWZ0KCk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGVbbl0gJiYgKGVbbl0gPSB7fSksICEoZSA9IGVbbl0pIHx8ICdvYmplY3QnICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbaV0gPSByLCAhMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTgpLCBpID0gcigxOTYpLnNldCwgbyA9IG4uTXV0YXRpb25PYnNlcnZlciB8fCBuLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsIGEgPSBuLnByb2Nlc3MsIHMgPSBuLlByb21pc2UsIHUgPSAncHJvY2VzcycgPT0gcig2NykoYSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQsIHIsIGMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodSAmJiAobiA9IGEuZG9tYWluKSAmJiBuLmV4aXQoKTsgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZS5mbiwgZSA9IGUubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlID8gcigpIDogdCA9IHZvaWQgMCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdm9pZCAwLCBuICYmIG4uZW50ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodSkgewogICAgICAgICAgICAgICAgICAgICAgICByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5uZXh0VGljayhjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFvIHx8IG4ubmF2aWdhdG9yICYmIG4ubmF2aWdhdG9yLnN0YW5kYWxvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgcy5yZXNvbHZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHMucmVzb2x2ZSh2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnRoZW4oYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNhbGwobiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSAhMCwgZiA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG8oYykub2JzZXJ2ZShmLCB7IGNoYXJhY3RlckRhdGE6ICEwIH0pLCByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5kYXRhID0gbCA9ICFsOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh0Lm5leHQgPSBpKSwgZSB8fCAoZSA9IGksIHIoKSksIHQgPSBpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE4KS5uYXZpZ2F0b3I7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBuICYmIG4udXNlckFnZW50IHx8ICcnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDI3KSwgaSA9IHIoMjMpLCBvID0gcigxOTgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobihlKSwgaSh0KSAmJiB0LmNvbnN0cnVjdG9yID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG8uZihlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHIucmVzb2x2ZSkodCksIHIucHJvbWlzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTExKSwgaSA9IHIoMjkwKSwgbyA9IHIoMjk1KSwgYSA9IHIoMjk2KSwgcyA9IHIoMTkyKSwgdSA9IHIoMTE0KSwgYyA9IHIoMTQzKSwgZCA9IHIoMTgyKSwgbCA9ICdbb2JqZWN0IE9iamVjdF0nLCBmID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBwLCBnLCBtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB1KGUpLCBiID0gdSh0KSwgeSA9IHYgPyAnW29iamVjdCBBcnJheV0nIDogcyhlKSwgaCA9IGIgPyAnW29iamVjdCBBcnJheV0nIDogcyh0KSwgUyA9ICh5ID0gJ1tvYmplY3QgQXJndW1lbnRzXScgPT0geSA/IGwgOiB5KSA9PSBsLCBPID0gKGggPSAnW29iamVjdCBBcmd1bWVudHNdJyA9PSBoID8gbCA6IGgpID09IGwsIF8gPSB5ID09IGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKF8gJiYgYyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWModCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2ID0gITAsIFMgPSAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKF8gJiYgIVMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0gfHwgKG0gPSBuZXcgbigpKSwgdiB8fCBkKGUpID8gaShlLCB0LCByLCBwLCBnLCBtKSA6IG8oZSwgdCwgeSwgciwgcCwgZywgbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKDEgJiByKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSA9IFMgJiYgZi5jYWxsKGUsICdfX3dyYXBwZWRfXycpLCBJID0gTyAmJiBmLmNhbGwodCwgJ19fd3JhcHBlZF9fJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFIHx8IEkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ID0gRSA/IGUudmFsdWUoKSA6IGUsIEEgPSBJID8gdC52YWx1ZSgpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtIHx8IChtID0gbmV3IG4oKSksIGcodywgQSwgciwgcCwgbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhXyAmJiAobSB8fCAobSA9IG5ldyBuKCkpLCBhKGUsIHQsIHIsIHAsIGcsIG0pKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjkxKSwgaSA9IHIoMjkyKSwgbyA9IHIoMjkzKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBhLCBzLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAxICYgciwgZCA9IGUubGVuZ3RoLCBsID0gdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgaWYgKGQgIT0gbCAmJiAhKGMgJiYgbCA+IGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB1LmdldChlKSwgcCA9IHUuZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChmICYmIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgPT0gdCAmJiBwID09IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBnID0gLTEsIG0gPSAhMCwgdiA9IDIgJiByID8gbmV3IG4oKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHUuc2V0KGUsIHQpLCB1LnNldCh0LCBlKTsgKytnIDwgZDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBlW2ddLCB5ID0gdFtnXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gYyA/IGEoeSwgYiwgZywgdCwgZSwgdSkgOiBhKGIsIHksIGcsIGUsIHQsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKHQsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbyh2LCB0KSAmJiAoYiA9PT0gZSB8fCBzKGIsIGUsIHIsIGEsIHUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGIgIT09IHkgJiYgIXMoYiwgeSwgciwgYSwgdSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmRlbGV0ZShlKSwgdS5kZWxldGUodCksIG07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExNCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSkgPyBlIDogW2VdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IC0xLCBuID0gbnVsbCA9PSBlID8gMCA6IGUubGVuZ3RoOyArK3IgPCBuOykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodChlW3JdLCByLCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjk0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKG51bGwgPT0gZSA/IDAgOiBlLmxlbmd0aCkgJiYgbihlLCB0LCAwKSA+IC0xOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHIgLSAxLCBpID0gZS5sZW5ndGg7ICsrbiA8IGk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlW25dID09PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdCB8fCBlICE9IGUgJiYgdCAhPSB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOTEpLCBpID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByLCBvLCBhLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAxICYgciwgYyA9IG4oZSksIGQgPSBjLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBpZiAoZCAhPSBuKHQpLmxlbmd0aCAmJiAhdSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSBkOyBsLS07KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gY1tsXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodSA/IGYgaW4gdCA6IGkuY2FsbCh0LCBmKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHMuZ2V0KGUpLCBnID0gcy5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHAgJiYgZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcCA9PSB0ICYmIGcgPT0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSAhMDsKICAgICAgICAgICAgICAgICAgICBzLnNldChlLCB0KSwgcy5zZXQodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IHU7ICsrbCA8IGQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZVtmID0gY1tsXV0sIHkgPSB0W2ZdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB1ID8gbyh5LCBiLCBmLCB0LCBlLCBzKSA6IG8oYiwgeSwgZiwgZSwgdCwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodm9pZCAwID09PSBoID8gYiA9PT0geSB8fCBhKGIsIHksIHIsIG8sIHMpIDogaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHYgfHwgKHYgPSAnY29uc3RydWN0b3InID09IGYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiAhdikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUyA9IGUuY29uc3RydWN0b3IsIE8gPSB0LmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBTID09IE8gfHwgISgnY29uc3RydWN0b3InIGluIGUpIHx8ICEoJ2NvbnN0cnVjdG9yJyBpbiB0KSB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiBTICYmIFMgaW5zdGFuY2VvZiBTICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIE8gJiYgTyBpbnN0YW5jZW9mIE8gfHwgKG0gPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmRlbGV0ZShlKSwgcy5kZWxldGUodCksIG07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZXhwaXJlQWN0aW9uID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBuLmdldEV4cGlyYXRpb24pKGUpOwogICAgICAgICAgICAgICAgICAgIHIuaXNFeHBpcmVkID8gdCgpIDogIWUuZm9yY2VVcGRhdGUgJiYgaVtlLmlkXSB8fCAoaVtlLmlkXSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwgci5mcm9tTm93TXMpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjAzKSwgaSA9IHt9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuY29uY2F0Q29uZmlnQXJyYXlzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIG8uZGVmYXVsdCkodCkgJiYgKDAsIG8uZGVmYXVsdCkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIG8uZGVmYXVsdCkodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgoMCwgby5kZWZhdWx0KShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKDAsIGkuZGVmYXVsdCkoZSwgJ2Jvb3RzdHJhcC5yZW5kZXJTY3JpcHRzJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ2Jvb3RzdHJhcC5yZW5kZXJTY3JpcHRzJykgJiYgKGUuYm9vdHN0cmFwLnJlbmRlclNjcmlwdHMgPSAoMCwgbi5kZWZhdWx0KShlLmJvb3RzdHJhcC5yZW5kZXJTY3JpcHRzLmNvbmNhdCh0LmJvb3RzdHJhcC5yZW5kZXJTY3JpcHRzKSwgJ2lkJykpOwogICAgICAgICAgICAgICAgICAgICgwLCBpLmRlZmF1bHQpKGUsICdhbmFseXRpY3MuYmlkYmFycmVsJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ2FuYWx5dGljcy5iaWRiYXJyZWwnKSAmJiAoZS5hbmFseXRpY3MuYmlkYmFycmVsID0gKDAsIG4uZGVmYXVsdCkoZS5hbmFseXRpY3MuYmlkYmFycmVsLmNvbmNhdCh0LmFuYWx5dGljcy5iaWRiYXJyZWwpLCAnaWQnKSk7CiAgICAgICAgICAgICAgICAgICAgKDAsIGkuZGVmYXVsdCkoZSwgJ2FuYWx5dGljcy5wcmViaWQnKSAmJiAoMCwgaS5kZWZhdWx0KSh0LCAnYW5hbHl0aWNzLnByZWJpZCcpICYmIEFycmF5LmlzQXJyYXkoKDAsIGkuZGVmYXVsdCkoZSwgJ2FuYWx5dGljcy5wcmViaWQnKSkgJiYgQXJyYXkuaXNBcnJheSgoMCwgaS5kZWZhdWx0KSh0LCAnYW5hbHl0aWNzLnByZWJpZCcpKSA/IGUuYW5hbHl0aWNzLnByZWJpZCA9ICgwLCBuLmRlZmF1bHQpKGUuYW5hbHl0aWNzLnByZWJpZC5jb25jYXQodC5hbmFseXRpY3MucHJlYmlkKSwgJ3Byb3ZpZGVyJykgOiAoMCwgaS5kZWZhdWx0KShlLCAnYW5hbHl0aWNzLnByZWJpZCcpICYmICgwLCBpLmRlZmF1bHQpKHQsICdhbmFseXRpY3MucHJlYmlkJykgJiYgQXJyYXkuaXNBcnJheSgoMCwgaS5kZWZhdWx0KSh0LCAnYW5hbHl0aWNzLnByZWJpZCcpKSA/IGUuYW5hbHl0aWNzLnByZWJpZCA9ICgwLCBuLmRlZmF1bHQpKFtdLmNvbmNhdCh1KCgwLCBpLmRlZmF1bHQpKHQsICdhbmFseXRpY3MucHJlYmlkJykpLCBbKDAsIGkuZGVmYXVsdCkoZSwgJ2FuYWx5dGljcy5wcmViaWQnKV0pLCAncHJvdmlkZXInKSA6ICgwLCBpLmRlZmF1bHQpKGUsICdhbmFseXRpY3MucHJlYmlkJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ2FuYWx5dGljcy5wcmViaWQnKSAmJiBBcnJheS5pc0FycmF5KCgwLCBpLmRlZmF1bHQpKGUsICdhbmFseXRpY3MucHJlYmlkJykpICYmIChlLmFuYWx5dGljcy5wcmViaWQgPSAoMCwgbi5kZWZhdWx0KShbXS5jb25jYXQodSgoMCwgaS5kZWZhdWx0KShlLCAnYW5hbHl0aWNzLnByZWJpZCcpKSwgWygwLCBpLmRlZmF1bHQpKHQsICdhbmFseXRpY3MucHJlYmlkJyldKSwgJ3Byb3ZpZGVyJykpOwogICAgICAgICAgICAgICAgICAgICgwLCBpLmRlZmF1bHQpKGUsICdkeW5hbWljVGFyZ2V0aW5nLnJ1bGVzJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ2R5bmFtaWNUYXJnZXRpbmcucnVsZXMnKSAmJiAoZS5keW5hbWljVGFyZ2V0aW5nLnJ1bGVzID0gKDAsIG4uZGVmYXVsdCkoZS5keW5hbWljVGFyZ2V0aW5nLnJ1bGVzLmNvbmNhdCh0LmR5bmFtaWNUYXJnZXRpbmcucnVsZXMpLCAnbmFtZScpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGkuZGVmYXVsdCkoZSwgJ3ZpZGVvLmdldFVuaXRTcGVjJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ3ZpZGVvLmdldFVuaXRTcGVjJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAoMCwgYS5jcmVhdGVSZWR1Y2VNZXJnZXIpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuYWRkQ29uZmlnKHQudmlkZW8uZ2V0VW5pdFNwZWMpLCByLmFkZENvbmZpZyhlLnZpZGVvLmdldFVuaXRTcGVjKSwgZS52aWRlby5nZXRVbml0U3BlYyA9IHIuZ2V0TWVyZ2VTZXQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBpLmRlZmF1bHQpKGUsICd2aWRlby5nZXRTcGVjJykgJiYgKDAsIGkuZGVmYXVsdCkodCwgJ3ZpZGVvLmdldFNwZWMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICgwLCBhLmNyZWF0ZVJlZHVjZU1lcmdlcikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGRDb25maWcodC52aWRlby5nZXRTcGVjKSwgcy5hZGRDb25maWcoZS52aWRlby5nZXRTcGVjKSwgZS52aWRlby5nZXRTcGVjID0gcy5nZXRNZXJnZVNldCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGkuZGVmYXVsdCkoZSwgJ3ZpZGVvLnRyYW5zbGF0ZVNwZWMnKSAmJiAoMCwgaS5kZWZhdWx0KSh0LCAndmlkZW8udHJhbnNsYXRlU3BlYycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gKDAsIGEuY3JlYXRlUmVkdWNlTWVyZ2VyKSgpOwogICAgICAgICAgICAgICAgICAgICAgICBjLmFkZENvbmZpZyh0LnZpZGVvLnRyYW5zbGF0ZVNwZWMpLCBjLmFkZENvbmZpZyhlLnZpZGVvLnRyYW5zbGF0ZVNwZWMpLCBlLnZpZGVvLnRyYW5zbGF0ZVNwZWMgPSBjLmdldE1lcmdlU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgoMCwgaS5kZWZhdWx0KShlLCAndmlkZW8uZ2V0RGVmYXVsdFBhcmFtc09wdGlvbnMnKSAmJiAoMCwgaS5kZWZhdWx0KSh0LCAndmlkZW8uZ2V0RGVmYXVsdFBhcmFtc09wdGlvbnMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICgwLCBhLmNyZWF0ZVJlZHVjZU1lcmdlcikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5hZGRDb25maWcodC52aWRlby5nZXREZWZhdWx0UGFyYW1zT3B0aW9ucyksIGQuYWRkQ29uZmlnKGUudmlkZW8uZ2V0RGVmYXVsdFBhcmFtc09wdGlvbnMpLCBlLnZpZGVvLmdldERlZmF1bHRQYXJhbXNPcHRpb25zID0gZC5nZXRNZXJnZVNldCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmR5bmFtaWNCaWRkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgaW4gZS5keW5hbWljQmlkZGVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLmR5bmFtaWNCaWRkZXJzLCBsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYXV0b0FwcGx5QmlkZGVycycgIT09IGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAoMCwgYS5jcmVhdGVSZWR1Y2VNZXJnZXIpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYWRkQ29uZmlnKCgwLCBpLmRlZmF1bHQpKHQsICdkeW5hbWljQmlkZGVycy4nLmNvbmNhdChsKSkgfHwgbnVsbCksIGYuYWRkQ29uZmlnKGUuZHluYW1pY0JpZGRlcnNbbF0pLCBlLmR5bmFtaWNCaWRkZXJzW2xdID0gZi5nZXRNZXJnZVNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgaW4gZS5keW5hbWljQmlkZGVycy5hdXRvQXBwbHlCaWRkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUuZHluYW1pY0JpZGRlcnMuYXV0b0FwcGx5QmlkZGVycywgcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9ICgwLCBhLmNyZWF0ZVJlZHVjZU1lcmdlcikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmFkZENvbmZpZygoMCwgaS5kZWZhdWx0KSh0LCAnZHluYW1pY0JpZGRlcnMuYXV0b0FwcGx5QmlkZGVycy4nLmNvbmNhdChwKSkgfHwgbnVsbCksIGcuYWRkQ29uZmlnKGUuZHluYW1pY0JpZGRlcnMuYXV0b0FwcGx5QmlkZGVyc1twXSksIGUuZHluYW1pY0JpZGRlcnMuYXV0b0FwcGx5QmlkZGVyc1twXSA9IGcuZ2V0TWVyZ2VTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIHIoOSksIHIoMTEpLCByKDApLCByKDYpLCByKDEzKSwgcigxKSwgcig0KSwgcigyKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcyhyKDI5OSkpLCBpID0gcyhyKDM0KSksIG8gPSBzKHIoNDgpKSwgYSA9IHIoMjA2KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiB0ID8gdChlKSA6IGVbdF0sICFyLmhhcyhuKSAmJiByLmFkZChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCByKDEpLCByKDMpLCByKDApLCByKDYpLCByKDEyMSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzIpLmYsIGkgPSByKDgwKSwgbyA9IHIoODUpLCBhID0gcig1MyksIHMgPSByKDg0KSwgdSA9IHIoMTE3KSwgYyA9IHIoMTMzKSwgZCA9IHIoMTY1KSwgbCA9IHIoMTE4KSwgZiA9IHIoMjgpLCBwID0gcig3OCkuZmFzdEtleSwgZyA9IHIoOTcpLCBtID0gZiA/ICdfcycgOiAnc2l6ZScsIHYgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiA9IHAodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnRicgIT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9pW25dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IGUuX2Y7IHI7IHIgPSByLm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmsgPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKGUsIHQsIHIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGUsIGQsIHQsICdfaScpLCBlLl90ID0gdCwgZS5faSA9IGkobnVsbCksIGUuX2YgPSB2b2lkIDAsIGUuX2wgPSB2b2lkIDAsIGVbbV0gPSAwLCBudWxsICE9IG4gJiYgdShuLCByLCBlW2NdLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGQucHJvdG90eXBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBnKHRoaXMsIHQpLCByID0gZS5faSwgbiA9IGUuX2Y7IG47IG4gPSBuLm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5yID0gITAsIG4ucCAmJiAobi5wID0gbi5wLm4gPSB2b2lkIDApLCBkZWxldGUgcltuLmldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9mID0gZS5fbCA9IHZvaWQgMCwgZVttXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZyh0aGlzLCB0KSwgbiA9IHYociwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuLm4sIG8gPSBuLnA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByLl9pW24uaV0sIG4uciA9ICEwLCBvICYmIChvLm4gPSBpKSwgaSAmJiAoaS5wID0gbyksIHIuX2YgPT0gbiAmJiAoci5fZiA9IGkpLCByLl9sID09IG4gJiYgKHIuX2wgPSBvKSwgclttXS0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh0aGlzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByLCBuID0gYShlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCwgMyk7IHIgPSByID8gci5uIDogdGhpcy5fZjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuKHIudiwgci5rLCB0aGlzKTsgciAmJiByLnI7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gci5wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF2KGcodGhpcywgdCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZiAmJiBuKGQucHJvdG90eXBlLCAnc2l6ZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHRoaXMsIHQpW21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlZjogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGksIG8gPSB2KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA/IG8udiA9IHIgOiAoZS5fbCA9IG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBpID0gcCh0LCAhMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdjogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6IG4gPSBlLl9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcjogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5fZiB8fCAoZS5fZiA9IG8pLCBuICYmIChuLm4gPSBvKSwgZVttXSsrLCAnRicgIT09IGkgJiYgKGUuX2lbaV0gPSBvKSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRFbnRyeTogdiwKICAgICAgICAgICAgICAgICAgICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMoZSwgdCwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3QgPSBnKGUsIHQpLCB0aGlzLl9rID0gciwgdGhpcy5fbCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHRoaXMuX2ssIHQgPSB0aGlzLl9sOyB0ICYmIHQucjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3QgJiYgKHRoaXMuX2wgPSB0ID0gdCA/IHQubiA6IHRoaXMuX3QuX2YpID8gZCgwLCAna2V5cycgPT0gZSA/IHQuayA6ICd2YWx1ZXMnID09IGUgPyB0LnYgOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgOiAodGhpcy5fdCA9IHZvaWQgMCwgZCgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPyAnZW50cmllcycgOiAndmFsdWVzJywgIXIsICEwKSwgbCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0LmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IChuID0gcigzMDIpKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlKSB8fCAhQXJyYXkuaXNBcnJheSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIGJvdGggYXJndW1lbnRzIHRvIGJlIGFycmF5cycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gW10sIG4gPSBlLmxlbmd0aCwgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICB0LmluZGV4T2YobykgPiAtMSAmJiAtMSA9PSByLmluZGV4T2YobykgJiYgci5wdXNoKG8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5mZXRjaFdpdGhBYm9ydCA9IHQuZmV0Y2ggPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHIoMTIpLCBvID0gKG4gPSByKDMwNCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgICAgIHZhciBhID0gdm9pZCAwICE9PSAoMCwgaS5kb20pKCkud2luZG93LkFib3J0Q29udHJvbGxlciwgcyA9ICgwLCBpLmRvbSkoKS53aW5kb3cuZmV0Y2ggfHwgby5kZWZhdWx0LmRlZmF1bHQgfHwgby5kZWZhdWx0OwogICAgICAgICAgICAgICAgdC5mZXRjaCA9IHM7CiAgICAgICAgICAgICAgICB0LmZldGNoV2l0aEFib3J0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge30sIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAoMCwgaS5kb20pKCkud2luZG93LkFib3J0Q29udHJvbGxlciwgbyA9IG5ldyBuKCksIHUgPSBvLnNpZ25hbDsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuc2lnbmFsID0gdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmNhbmNlbCA9IHIsIGM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgci5yKHQpLCB0LmRlZmF1bHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gdCB8fCB7fSwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgbyA9IFtdLCBhID0gW10sIHMgPSB7fSwgdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvazogMiA9PSAoaS5zdGF0dXMgLyAxMDAgfCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogaS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGkuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGkucmVzcG9uc2VVUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaS5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKEpTT04ucGFyc2UoaS5yZXNwb25zZVRleHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbaS5yZXNwb25zZV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmU6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2UudG9Mb3dlckNhc2UoKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvTG93ZXJDYXNlKCkgaW4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIChpLm9wZW4odC5tZXRob2QgfHwgJ2dldCcsIGUsICEwKSwgaS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5yZXBsYWNlKC9eKC4qPyk6W15cU1xuXSooW1xzXFNdKj8pJC9nbSwgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKHQgPSB0LnRvTG93ZXJDYXNlKCkpLCBhLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHNbdF0gPSBzW3RdID8gc1t0XSArICcsJyArIHIgOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByKHUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLm9uZXJyb3IgPSBuLCBpLndpdGhDcmVkZW50aWFscyA9ICdpbmNsdWRlJyA9PSB0LmNyZWRlbnRpYWxzLCB0LmhlYWRlcnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldFJlcXVlc3RIZWFkZXIoYywgdC5oZWFkZXJzW2NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpLnNlbmQodC5ib2R5IHx8IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuLCBpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gKGkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiAobiA9IG8pID8gbi5jYWxsKHQsIHIsIHQsIGUpIDogbikgfHwgKGUuZXhwb3J0cyA9IGkpLCAhMCwgZS5leHBvcnRzID0gbygpLCAhITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB3aW5kb3cuQ29va2llcywgcyA9IHdpbmRvdy5Db29raWVzID0gbygpOwogICAgICAgICAgICAgICAgICAgICAgICBzLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LkNvb2tpZXMgPSBhLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCB0ID0ge307IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSA9IHJbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8oJVswLTlBLVpdezJ9KSsvZywgZGVjb2RlVVJJQ29tcG9uZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHIobikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCwgciwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBkb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInID09IHR5cGVvZiAobyA9IGUoeyBwYXRoOiAnLycgfSwgaS5kZWZhdWx0cywgbykpLmV4cGlyZXMgJiYgKG8uZXhwaXJlcyA9IG5ldyBEYXRlKDEgKiBuZXcgRGF0ZSgpICsgODY0MDAwMDAgKiBvLmV4cGlyZXMpKSwgby5leHBpcmVzID0gby5leHBpcmVzID8gby5leHBpcmVzLnRvVVRDU3RyaW5nKCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IEpTT04uc3RyaW5naWZ5KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXltce1xbXS8udGVzdChhKSAmJiAociA9IGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG4ud3JpdGUgPyBuLndyaXRlKHIsIHQpIDogZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhyKSkucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnwzQXwzQ3wzRXwzRHwyRnwzRnw0MHw1Qnw1RHw1RXw2MHw3Qnw3RHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KSwgdCA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodCkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvW1woXCldL2csIGVzY2FwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1IGluIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1t1XSAmJiAocyArPSAnOyAnICsgdSwgITAgIT09IG9bdV0gJiYgKHMgKz0gJz0nICsgb1t1XS5zcGxpdCgnOycpWzBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUgPSB0ICsgJz0nICsgciArIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGRvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHt9LCBvID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW10sIGEgPSAwOyBhIDwgby5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG9bYV0uc3BsaXQoJz0nKSwgdSA9IHMuc2xpY2UoMSkuam9pbignPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIHx8ICciJyAhPT0gdS5jaGFyQXQoMCkgfHwgKHUgPSB1LnNsaWNlKDEsIC0xKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHQoc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSA9IChuLnJlYWQgfHwgbikodSwgYykgfHwgdCh1KSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBKU09OLnBhcnNlKHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVtjXSA9IHUsIGUgPT09IGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gaVtlXSA6IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc2V0ID0gbywgaS5nZXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmdldEpTT04gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlbW92ZSA9IGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHQsICcnLCBlKHIsIHsgZXhwaXJlczogLTEgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlZmF1bHRzID0ge30sIGkud2l0aENvbnZlcnRlciA9IHIsIGk7CiAgICAgICAgICAgICAgICAgICAgfShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigzMDcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IChuKGUpKSh0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjMpLCBpID0gcigxNjIpLCBvID0gcigxOSkoJ3NwZWNpZXMnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZSkgJiYgKCdmdW5jdGlvbicgIT0gdHlwZW9mICh0ID0gZS5jb25zdHJ1Y3RvcikgfHwgdCAhPT0gQXJyYXkgJiYgIWkodC5wcm90b3R5cGUpIHx8ICh0ID0gdm9pZCAwKSwgbih0KSAmJiBudWxsID09PSAodCA9IHRbb10pICYmICh0ID0gdm9pZCAwKSksIHZvaWQgMCA9PT0gdCA/IEFycmF5IDogdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgKHQgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0Lmxlbmd0aCwgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICBvIGluIGUgJiYgKHJbb10gPSBlW29dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQudW5pdEhhc0VsZW1lbnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ3N0cmluZycgPT0gdHlwZW9mIGUgPyBlIDogZS5jb2RlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhISgwLCBuLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEyKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmRlZmF1bHQgPSB2b2lkIDAsIHIoNCksIHIoMik7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTIpLCBpID0gcigzNSksIG8gPSBzKHIoMTIwKSksIGEgPSBzKHIoMzQpKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByID0gW10sIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gJ3N0cmluZycgPT0gdHlwZW9mIGUgPyAoMCwgYS5kZWZhdWx0KSgoMCwgbi5kb20pKCkud2luZG93LCBlKSA6IGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09PSB1IHx8ICgwLCBvLmRlZmF1bHQpKHQsIHUpIHx8ICh0ID0gKDAsIGkuY2xvbmVEZWVwKSh1KSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgci5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcltlXSkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYygpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrOiBjLAogICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7IHNraXBJbml0aWFsUnVuOiAhMSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0IHx8IG4gJiYgKCdvYmplY3QnICE9PSB1KG4pIHx8IG4uc2tpcEluaXRpYWxSdW4pIHx8IGUodCksIHIucHVzaChlKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3VsdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LmRlZmF1bHQgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDExMSksIGkgPSByKDIwMik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgbykgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gci5sZW5ndGgsIHMgPSBhLCB1ID0gIW87CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IE9iamVjdChlKTsgYS0tOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHJbYV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ICYmIGNbMl0gPyBjWzFdICE9PSBlW2NbMF1dIDogIShjWzBdIGluIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICg7ICsrYSA8IHM7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gKGMgPSByW2FdKVswXSwgbCA9IGVbZF0sIGYgPSBjWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodSAmJiBjWzJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBsICYmICEoZCBpbiBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbmV3IG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBvKGwsIGYsIGQsIGUsIHQsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodm9pZCAwID09PSBnID8gaShmLCBsLCAzLCBvLCBwKSA6IGcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzEzKSwgaSA9IHIoMTE2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IGkoZSksIHIgPSB0Lmxlbmd0aDsgci0tOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRbcl0sIGEgPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICB0W3JdID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGEpCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcig3MSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09IGUgJiYgIW4oZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGVmYXVsdCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gKG4gPSByKDg2KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9LCBvID0gcigxMik7CiAgICAgICAgICAgICAgICB2YXIgYSA9ICgwLCBpLmRlZmF1bHQpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoMCwgby5kb20pKCkud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICgwLCBvLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmhyZWYgPSBlLCB0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0LmRlZmF1bHQgPSBhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuYWRJZGVudGlmaWVyID0gdm9pZCAwLCByKDE3KSwgcigyKSwgcigxKSwgcigzKSwgcig1KSwgcigxMSksIHIoMCksIHIoNDApLCByKDE2KTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigyMCksIGkgPSByKDgpLCBvID0gbChyKDMxOCkpLCBhID0gcigxMDApLCBzID0gbChyKDEwKSksIHUgPSBsKHIoNTYpKSwgYyA9IHIoNTUpLCBkID0gcigyMSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gZihPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogZihPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtID0gby5kZWZhdWx0LmdhbS5hZHZlcnRpc2VySWRzLCB2ID0gby5kZWZhdWx0LmFtYXpvbi5wcm92aWRlclRyYW5zbGF0aW9ucywgYiA9IG8uZGVmYXVsdC5tZWRpYW5ldC5wcm92aWRlcklkcywgeSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWJpZC5rYXJnbycsCiAgICAgICAgICAgICAgICAgICAgICAgICdhbWF6b24uZ3VtZ3VtJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2dvb2dsZS4zM2Fjcm9zcycKICAgICAgICAgICAgICAgICAgICBdLCBoID0gewogICAgICAgICAgICAgICAgICAgICAgICBwcmViaWQ6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjcG06IHBhcnNlRmxvYXQodC5zbG90LmdldFRhcmdldGluZygnaGJfcGInKSkgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFMgPSBzLmRlZmF1bHQuRVZFTlRTLklERU5USUZJRUQsIE8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcGFyc2VJbnQodC5hZHZlcnRpc2VySWQpLCBuID0gdC5zbG90LCBpID0gbi5nZXRUYXJnZXRpbmcoJ2hiX2JpZGRlcicpLCBvID0gbi5nZXRUYXJnZXRpbmcoJ2Ftem5wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sZW5ndGggPiAwICYmIChpID0gaVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sZW5ndGggPiAwICYmIChvID0gdltvWzBdXSA/IHZbb1swXV0gOiBvWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICczM2Fjcm9zcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogJ2dvb2dsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvdmlkZXI6ICczM2Fjcm9zcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmViaWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogJ3ByZWJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvdmlkZXI6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWF6b246IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcjogJ2FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvdmlkZXI6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiAnZ29vZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnByb3ZpZGVyOiAndW5rbm93bicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1IGluIG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLCB1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVt1XS5pbmRleE9mKHIpID49IDAgJiYgKHMgPSBhW3VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oMCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlYmlkJyA9PT0gby5wcm92aWRlciAmJiAoby5iaWQgPSBhLmJpZENhY2hlLmdldExhdGVzdFBlbmRpbmdCaWQodC5jb2RlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHAocCh7fSwgbyksIHt9LCB7IGNvZGU6IHQuY29kZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2l6ZSA9ICdwcmViaWQnID09PSBzLnByb3ZpZGVyICYmIHMuYmlkID8gcy5iaWQuc2l6ZS5zcGxpdCgneCcpLm1hcChOdW1iZXIpIDogci5zaXplLCBzLmdwdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VySWQ6IHIuYWR2ZXJ0aXNlcklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVySWQ6IHIuY2FtcGFpZ25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiByLmNyZWF0aXZlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUlkOiByLmxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogci5zaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gPyBhcmd1bWVudHNbM10gOiB7fSwgaSA9ICdkaXNwbGF5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNpemUgJiYgJzV4NScgPT09IHQuc2l6ZS5qb2luKCd4JykgJiYgKGkgPSAnc2t5Ym94Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCduYXRpdmUnID09PSBuLm1lZGlhVHlwZSB8fCB0LnNpemUgJiYgJzExeDExJyA9PT0gdC5zaXplLmpvaW4oJ3gnKSB8fCAncHJlYmlkJyA9PT0gci5wcm92aWRlciAmJiAnbWVkaWFuZXQnID09PSByLnN1YnByb3ZpZGVyKSAmJiAoaSA9ICduYXRpdmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LmluZGV4T2YoJycuY29uY2F0KHIucHJvdmlkZXIsICcuJykuY29uY2F0KHIuc3VicHJvdmlkZXIpKSA+PSAwICYmIChpID0gJ2FkaGVzaW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAnNng2JyA9PT0gbi5zaXplICYmIChpID0gJ2FkaGVzaW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWJpZCcgPT09IHIucHJvdmlkZXIgJiYgJ2d1bWd1bScgPT09IHIuc3VicHJvdmlkZXIgJiYgbi5hZC5pbmRleE9mKCc8Z3VtZ3VtLWFkIHByb2R1Y3Q9IjIiJykgPj0gMCAmJiAoaSA9ICdhZGhlc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2l6ZSAmJiAnN3g3JyA9PT0gdC5zaXplLmpvaW4oJ3gnKSAmJiAoaSA9ICdmbGV4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIHIsIG8sIHMuYmlkIHx8IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgbCwgZiA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbWVkaWFuZXQnID09PSByLnN1YnByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGEuYmlkQ2FjaGUuZ2V0QWxsQmlkcygpW3Quc2xvdC5nZXRUYXJnZXRpbmcoJ2hiX2FkaWQnKV0uY3JlYXRpdmVJZC50b1N0cmluZygpLCBpID0gbi5zdWJzdHIoMywgcGFyc2VJbnQobi5jaGFyQXQoMikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiW2ldIHx8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgwLCByLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZHNwID0gZiwgaFtzLnZlbmRvcl0gJiYgKHMgPSBwKHAoe30sIHMpLCBoW3MudmVuZG9yXSh0LCByLCBzKSkpLCBlW3MuY29kZV0gJiYgKHMgPSBwKHAoe30sIHMpLCBlW3MuY29kZV0pLCBlID0gKDAsIHUuZGVmYXVsdCkoZSwgW3MuY29kZV0pKSwgaS5iYkxvZ2dlci5sb2dJbmZvKCdBZCBJZGVudGlmaWVkJywgdC5jb2RlLCBzKSwgbi5ldmVudEVtaXR0ZXIuZW1pdCgoZCA9IHMsIGwgPSB0LmNvZGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQoUyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KGwsICcuJykuY29uY2F0KFMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChTLCAnLicpLmNvbmNhdChkLnR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChsLCAnLicpLmNvbmNhdChTLCAnLicpLmNvbmNhdChkLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgcywgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZXhwb3N1cmVBcGkuZXhwb3NlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZJZGVudGlmeTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNvZGUgJiYgKDAsIGMubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0LmNvZGVdID0gdCwgbi5ldmVudEVtaXR0ZXIub24oJycuY29uY2F0KHQuY29kZSwgJy5zbG90UmVuZGVyRW5kZWQnKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICgwLCB1LmRlZmF1bHQpKGUsIFt0LmNvZGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHVwTGlzdGVuZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5ldmVudEVtaXR0ZXIub24oJ3JlbmRlcmVkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5hZElkZW50aWZpZXIgPSBPOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0KSwgaSA9IHIoNjgpLCBvID0gcigyNCksIGEgPSByKDMxNyksIHMgPSAnWycgKyBhICsgJ10nLCB1ID0gUmVnRXhwKCdeJyArIHMgKyBzICsgJyonKSwgYyA9IFJlZ0V4cChzICsgcyArICcqJCcpLCBkID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fSwgcyA9IG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWFbZV0oKSB8fCAnXHUyMDBCXHg4NScgIT0gJ1x1MjAwQlx4ODUnW2VdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdSA9IGlbZV0gPSBzID8gdChsKSA6IGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgKGlbcl0gPSB1KSwgbihuLlAgKyBuLkYgKiBzLCAnU3RyaW5nJywgaSk7CiAgICAgICAgICAgICAgICAgICAgfSwgbCA9IGQudHJpbSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gU3RyaW5nKGkoZSkpLCAxICYgdCAmJiAoZSA9IGUucmVwbGFjZSh1LCAnJykpLCAyICYgdCAmJiAoZSA9IGUucmVwbGFjZShjLCAnJykpLCBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBkOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gJ1x0XG5ceDBCXGZcciBceEEwXHUxNjgwXHUxODBFXHUyMDAwXHUyMDAxXHUyMDAyXHUyMDAzXHUyMDA0XHUyMDA1XHUyMDA2XHUyMDA3XHUyMDA4XHUyMDA5XHUyMDBBXHUyMDJGXHUyMDVGXHUzMDAwXHUyMDI4XHUyMDI5XHVGRUZGJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IEpTT04ucGFyc2UoJ3siZ2FtIjp7ImFkdmVydGlzZXJJZHMiOnsiYW1hem9uIjpbNTAyMjY0NTczNyw0MDcwMTI0OV0sIjMzYWNyb3NzIjpbNTAyMzc3NzY3MCw3NDI3MTAwOV0sInByZWJpZCI6WzUwMjQ2MTY4NjgsNDczNjIyMzI0MSw0NzgyMjEwNjU2LDQ2MDExMzUyNTgsNDc3ODA5NzI4MCw0NzgyOTQ1MDQwLDQ2NTA0MzUwMzIsNDcyMzcyMjM5Nyw0Nzc3NDMyMDE5LDQ3ODI5MzUyNDJdfX0sImFtYXpvbiI6eyJwcm92aWRlclRyYW5zbGF0aW9ucyI6eyIxanNwdXJrIjoiYWFya2kiLCIxMjFmdTlzIjoiYWN1aXR5IiwiMXg0NmQ0dyI6ImFkY29sb255IiwidDVzdTB3IjoiYWRjb2xvbnl1YW0iLCJ5czJtMHciOiJhbWF6b24iLCIxYXgydWlvIjoiYW1vYmVlZHNwIiwiMXk4NHFvMCI6ImFwcG5leHVzIiwicXh3MnlvIjoiYmVhY2hmcm9udCIsIjk2bTJndyI6ImNvbnZlcnNhbnQiLCIxc29jdjBnIjoiY29udmVyc2FudHVhbSIsInB0eHBmayI6ImRpc3RyaWN0bSIsIjRxc2tjZyI6ImRteCIsIjFnZ3VxNjgiOiJlbXgiLCIxcWdnM3k4IjoiZ3VtZ3VtIiwiMTZoOWNlOCI6Imd1bWd1bXVhbSIsImJlaXRqNCI6Iml4IiwieGxtYzVjIjoiaW5tb2JpIiwiMWhrdDNwYyI6ImthcmdvIiwiMTM1ZTdzdyI6ImxpZnRvZmYiLCJneWFwNm8iOiJtYWduaXRlIiwieXBrcG9nIjoib3BlbngiLCIxMHhoZ3FvIjoicHVibWF0aWMiLCI4Mm5veHMiOiJwdWxzZXBvaW50IiwiM211NnRjIjoic21hYXRvIiwiZnVjYm5rIjoic21hcnR0cmIrIiwiMXV3OW0ybyI6InNvbm9iaSIsInU5cjdrMCI6InNvdnJuIiwiMWMxMTgxcyI6InNwb3RzIiwiMWt3bzhhbyI6InRyaXBsZWxpZnQiLCJsZTQ3YjQiOiJ1bnJ1bHl4c3NwIiwiYXoyODAiOiJ1bnJ1bHl4X3NzcF9hcHMiLCI2eXBiZW8iOiJ2ZXJpem9uIiwienRqMzdrIjoidmVydmUiLCIxNDljbGMwIjoieWllbGRtbyIsIk9MRFZDQlNCRUxPVyI6Im9sZCIsIjFxbmF6OWMiOiJhcHBuZXh1cyIsImk5M3kwdyI6ImRpc3RyaWN0bSIsIjN0cDI0ZyI6ImRteCIsIjE4dzB5cmsiOiJlbXgiLCIxeWV6bHo0IjoiZ3VtZ3VtIiwiOWRneHMwIjoicnViaWNvbiIsIjF0ejYzdW8iOiJzb25vYmkiLCJsa3oybTgiOiJ2ZXJpem9uIiwiMTZvNDdwYyI6InB1Ym1hdGljIiwiaHR4ajQiOiJwdWxzZXBvaW50IiwiMTNjOTM0MCI6InlpZWxkbW8ifX0sIm1lZGlhbmV0Ijp7InByb3ZpZGVySWRzIjp7IjE5OSI6InNoYXJldGhyb3VnaCJ9fX0nKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lm9wdGFub24gPSB0Lm9wdGFub25CYXNlID0gdm9pZCAwLCByKDYpLCByKDEzKSwgcig5KSwgcigxMSksIHIoMCksIHIoMSksIHIoNCksIHIoMiksIHIoMzMpLCByKDEyNCksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDUyKSwgaSA9IHIoOTkpLCBvID0gcig4KSwgYSA9IHIoMjUpLCBzID0gXyhyKDU2KSksIHUgPSBfKHIoMzQpKSwgYyA9IHIoNzQpLCBkID0gcigxMiksIGwgPSByKDU5KSwgZiA9IHIoMTUyKSwgcCA9IHIoMTUpLCBnID0gcigyMCksIG0gPSBfKHIoNDgpKSwgdiA9IF8ocigyOSkpLCBiID0gcigyMDgpLCB5ID0gcigyMDcpLCBoID0gcig3MyksIFMgPSBfKHIoMTApKSwgTyA9IHIoOTgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBzID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEobiA9IChhID0gcy5uZXh0KCkpLmRvbmUpICYmIChyLnB1c2goYS52YWx1ZSksICF0IHx8IHIubGVuZ3RoICE9PSB0KTsgbiA9ICEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBBID0gUy5kZWZhdWx0Lk1PRFVMRVMuT1BUQU5PTiwgVCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSAhMSwgciA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXgtaWRlbnRpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYi1zaGFyZXRocm91Z2gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBTID0gKDAsIGkucnVuUXVldWUpKCdjb25zZW50R2l2ZW4nKSwgXyA9ICgwLCBpLnJ1blF1ZXVlKSgnbnBhRmxhZ1NldCcpLCB3ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGQuZG9tKSgpLndpbmRvdy5jYnNvcHRhbm9uLmNtZC5wdXNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5vdC5hZGRPbkNvbnNlbnRDaGFuZ2VkSGFuZGxlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRzLmdldE5wYUZsYWcoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoMCA9PSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iYkxvZ2dlci5sb2dJbmZvKCdDb25zZW50IEdpdmVuJywgZSksIHQgPSBlLCAoMCwgcC5zZXRDb25maWcpKCdjb25zZW50JywgdCksIEMoKSwgdCAmJiAhMCAhPT0gYS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLmlzT3BlbignY29uc2VudEdpdmVuJykgJiYgYS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLm9wZW4oJ2NvbnNlbnRHaXZlbicpLCAhMCAhPT0gYS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLmlzT3BlbignbnBhRmxhZ1NldCcpICYmIGEubW9kdWxlTWFuYWdlci5nYXRld2F5cy5vcGVuKCducGFGbGFnU2V0JyksIHIgfHwgKGcuZXZlbnRFbWl0dGVyLmVtaXQoJ2NvbnNlbnRSZWFkeScsIHQpLCBUKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iYkxvZ2dlci5sb2dJbmZvKCdDb25zZW50IENoYW5nZWQnLCBlKSwgdCB8fCB4KGUsICEwKSwgZy5ldmVudEVtaXR0ZXIuZW1pdCgnY29uc2VudENoYW5nZWQnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoMCwgcC5nZXRDb25maWcpKCdjbGllbnRJbmZvLmRhdGEuY291bnRyeScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBoLnN0b3JhZ2UuZ2V0Q29va2llKCdPcHRhbm9uQ29uc2VudCcsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zcGxpdCgnJicpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEkodC5zcGxpdCgnPScpLCAyKSwgbiA9IHJbMF0sIGkgPSByWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuXSA9IGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pLCByID0gdC5nZW9sb2NhdGlvbi50b0xvd2VyQ2FzZSgpLCBuID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmdlb2xvY2F0aW9uLmluZGV4T2YoJzsnKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBJKHQuZ2VvbG9jYXRpb24udG9Mb3dlckNhc2UoKS5zcGxpdCgnOycpLCAyKSwgYSA9IGlbMF0sIHMgPSBpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBhLCBuID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdC5kYXRlc3RhbXAuc3BsaXQoJysnKS5maW5kKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaW5kZXhPZignR01UJykgPj0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICh1ID0gdS5yZXBsYWNlKCdHTVQnLCAnJykpLmNoYXJBdCgwKSwgZCA9IHBhcnNlSW50KHUucmVwbGFjZShjLCAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBjICsgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gKDAsIHAuZ2V0Q29uZmlnKSgnY2xpZW50SW5mby5kYXRhJykgfHwge30sIGYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnk6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdtdE9mZnNldDogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIChmLnJlZ2lvbiA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSAoMCwgdi5kZWZhdWx0KShmLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYmJMb2dnZXIubG9nSW5mbygnRXh0cmFjdGVkIENsaWVudEluZm8gZnJvbSBPcHRhbm9uQ29uc2VudCBjb29raWUnLCBmKSwgKDAsIHAuc2V0Q29uZmlnKSgnY2xpZW50SW5mby5kYXRhJywgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYmJMb2dnZXIubG9nSW5mbygnVW5hYmxlIHRvIHBhcnNlIE9wdGFub25Db25zZW50IGNvb2tpZScsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgJ29iamVjdCcgPT09IEUoZSkgJiYgIUFycmF5LmlzQXJyYXkoZSkgJiYgKDAsIGQuZG9tKSgpLndpbmRvdy5jYnNvcHRhbm9uLmNvbmZpZy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbnNlbnRHaXZlbjogUy5wdXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25OcGFGbGFnU2V0OiBfLnB1c2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbywgZywgbSwgdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcC5zZXRDb25maWcpKCdjb25zZW50JywgITEpLCAoMCwgZC5kb20pKCkud2luZG93Lmdvb2dsZXRhZyA9ICgwLCBkLmRvbSkoKS53aW5kb3cuZ29vZ2xldGFnIHx8IHt9LCAoMCwgZC5kb20pKCkud2luZG93Lmdvb2dsZXRhZy5jbWQgPSAoMCwgZC5kb20pKCkud2luZG93Lmdvb2dsZXRhZy5jbWQgfHwgW10sIGkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbklmcmFtZXNSZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbkZvcm1zUmVhZHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25TY3JpcHRzUmVhZHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb25BZHNSZWFkeScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBvID0gKDAsIGQuZG9tKSgpLndpbmRvdywgbSA9ICdjbWQnLCB2ID0gJ2NvbmZpZycsIG9bZyA9ICdjYnNvcHRhbm9uJ10gPSBvW2ddID8gb1tnXSA6IHt9LCBvW2ddW21dID0gb1tnXVttXSA/IG9bZ11bbV0gOiBbXSwgb1tnXVt2XSA9IG9bZ11bdl0gPyBvW2ddW3ZdIDogW10sIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW2ddW2VdID0gb1tnXVtlXSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bZ11bbV0ucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1tnXVtlXS5hcHBseShvW2ddLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhLm1vZHVsZU1hbmFnZXIuZ2F0ZXdheXMucmVnaXN0ZXIoJ2NvbnNlbnRHaXZlbicpLCBhLm1vZHVsZU1hbmFnZXIuZ2F0ZXdheXMucmVnaXN0ZXIoJ25wYUZsYWdTZXQnKSwgYS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLm9uT3BlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ucnVuKHQgPyAwIDogMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ25wYUZsYWdTZXQnKSwgYS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLm9uT3BlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMucnVuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdjb25zZW50R2l2ZW4nKSwgYy5yZW5kZXJTY3JpcHQuYmVmb3JlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaW5kZXhPZih0LmlkKSA+PSAwID8gUy5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIGIuY29va2llU3RvcmFnZUVuZ2luZS5zZXRDb29raWUuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHZvaWQgMCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIGIuY29va2llU3RvcmFnZUVuZ2luZS5yYXcuc2V0VmFsdWUuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHZvaWQgMCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIGIuY29va2llU3RvcmFnZUVuZ2luZS5nZXRDb29raWUuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHZvaWQgMCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIGIuY29va2llU3RvcmFnZUVuZ2luZS5yYXcuZ2V0VmFsdWUuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHZvaWQgMCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIHkubG9jYWxTdG9yYWdlRW5naW5lLnJhdy5zZXRWYWx1ZS5iZWZvcmUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkociA+IDEgPyByIC0gMSA6IDApLCBpID0gMTsgaSA8IHI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA/IGUuYXBwbHkodm9pZCAwLCBuKSA6IFMucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHkubG9jYWxTdG9yYWdlRW5naW5lLnJhdykuc2V0VmFsdWUuYXBwbHkoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpLCB5LmxvY2FsU3RvcmFnZUVuZ2luZS5yYXcuZ2V0VmFsdWUuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheShyID4gMSA/IHIgLSAxIDogMCksIGkgPSAxOyBpIDwgcjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHZvaWQgMCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSksIGwuc2V0SW5pdGlhbFBhZ2VUYXJnZXRpbmcuYmVmb3JlKGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gJiYgYXJndW1lbnRzWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gcihuLCBpKSA6IChTLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgpLCByKG4sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgPSBfLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIobiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxKSwgZi5ncHRNb2R1bGUuZW5hYmxlR29vZ2xldGFnU2VydmljZXMuYmVmb3JlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxKSwgbi5hdWN0aW9uLmJlZm9yZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpLCAoMCwgZC5kb20pKCkud2luZG93LmNic29wdGFub24uY21kLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICgwLCB1LmRlZmF1bHQpKGUsICdjb25zdGFudHMuVkVSU0lPTi5tYWpvcicpLCByID0gKDAsIHUuZGVmYXVsdCkoZSwgJ2NvbnN0YW50cy5WRVJTSU9OLm1pbm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiByICYmIHQgPj0gMSAmJiByID49IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSkgPyAoMCwgZC5kb20pKCkud2luZG93LmNic29wdGFub24ub25BZHNSZWFkeShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCgwID09IHQubnBhRmxhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKDAsIGQuZG9tKSgpLndpbmRvdy5jYnNvcHRhbm9uLmNtZC5wdXNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm90LnRhcmdldGluZ0FsbG93ZWQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgcC5nZXRDb25maWcpKCdvcHRhbm9uJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IGUsIFAoKDAsIHMuZGVmYXVsdCkoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdFVybHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmRlclNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbS5kZWZhdWx0KSh3KSAmJiAodyA9ICgwLCBwLmdldENvbmZpZykoJ29wdGFub24nKSwgUCgoMCwgcy5kZWZhdWx0KSh3LCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRVcmxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmRlclNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSkpLCAoMCwgcC5nZXRDb25maWcpKCdvcHRhbm9uLnJlbmRlclNjcmlwdCcpICYmICgwLCBjLnJlbmRlclNjcmlwdCkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYmItY2Jzb3B0YW5vbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFJlbmRlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09ICgwLCBkLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0W3NyYyo9XCdjbXAuaXNncHJpdmFjeS5jYnNpLmNvbVwnXScpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiAoMCwgTy5pc1N0YWdpbmdFbnYpKCkgPyB3LnNjcmlwdFVybHMuZGV2IDogdy5zY3JpcHRVcmxzLnByb2QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0Lm9wdGFub25CYXNlID0gVDsKICAgICAgICAgICAgICAgIHZhciB4ID0gYS5tb2R1bGVNYW5hZ2VyLnJlZ2lzdGVyKFQpOwogICAgICAgICAgICAgICAgdC5vcHRhbm9uID0geDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdlbyA9IHZvaWQgMCwgcig0KSwgcigyKSwgcig1KSwgcigxKSwgcigzKSwgcigwKSwgcig1NCk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOCksIGkgPSByKDk5KSwgbyA9IGIocig0OCkpLCBhID0gcigyMSksIHMgPSByKDI1KSwgdSA9IHIoMjExKSwgYyA9IHIoNTIpLCBkID0gcig0NCksIGwgPSByKDE1KSwgZiA9IHIoMTIpLCBwID0gcig3MiksIGcgPSBiKHIoMTApKSwgbSA9IHIoNDIpLCB2ID0gYihyKDMyMSkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh5ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaCA9IGcuZGVmYXVsdC5NT0RVTEVTLkdFT0xPQ0FUSU9OLCBTID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9LCB0ID0gbnVsbCwgciA9IG51bGwsIHMgPSBbXSwgZyA9IFtdLCBiID0ge30sIFMgPSBudWxsLCBPID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdChpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJpZHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IEMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbaSArIGFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtpICsgYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0KSA/IHMgPSB0IDogJ29iamVjdCcgPT09IHkodCkgJiYgdm9pZCAwICE9PSB0W3JdID8gcyA9IHRbcl0gOiAnb2JqZWN0JyA9PT0geSh0KSAmJiB2b2lkIDAgIT09IHRbYi5mYWlsc2FmZVJlZ2lvbkNvZGVdID8gKG4uYmJMb2dnZXIubG9nV2FybihpLCAnUmVnaW9uIG5vdCBjb25maWd1cmVkIGFtb25nIGJpZCBzZXQuJywgciwgJ1VzaW5nIGZhbGxiYWNrJywgYi5mYWlsc2FmZVJlZ2lvbkNvZGUpLCBzID0gdFtiLmZhaWxzYWZlUmVnaW9uQ29kZV0sIGEgPSBiLmZhaWxzYWZlUmVnaW9uQ29kZSkgOiAoJ29iamVjdCcgPT09IHkodCkgJiYgKDAsIG8uZGVmYXVsdCkodCkgfHwgbi5iYkxvZ2dlci5sb2dXYXJuKGksICdVbnJlY29nbml6ZWQgYmlkcyBwcm9wZXJ0eScsIHQpLCBzID0gW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtpICsgYV0gPSBzLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5iaWRzLCB0LmNvZGUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGgsIGkgPSBuZXcgQXJyYXkodCA+IDEgPyB0IC0gMSA6IDApLCBvID0gMTsgbyA8IHQ7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbbyAtIDFdID0gYXJndW1lbnRzW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBNYXRoLnJvdW5kKGIuZmFpbHNhZmVUaW1lb3V0IC0gKCgwLCBmLmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLSBTKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5iYkxvZ2dlci5sb2dJbmZvKCdHZW9sb2NhdGlvbiBkZXRlY3Rpb24gbW9kdWxlIGludGVyY2VwdGluZyBhdWN0aW9uIHJlcXVlc3QuIERlbGF5aW5nIHVudGlsIHJlZ2lvbiBjYW4gYmUgZGV0ZXJtaW5lZC4gRmFpbHNhZmVzIHdpbGwgYmUgYXBwbGllZCBpbicsIGEsICdtaWxsZXNlY29uZHMsIGNvZGU6JywgYi5mYWlsc2FmZUNvdW50cnlDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXBwbHkodm9pZCAwLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIChyIHx8ICFyICYmICF0KSAmJiAodCA9IHAuZmVhdHVyZXMuZ2V0VmFsdWUoJ2NvdW50cnlDb2RlJykgfHwgZSwgbi5iYkxvZ2dlci5sb2dJbmZvKCdDb3VudHJ5IENvZGUgU2V0OicsIHQpLCB3KEEoKSwgciksIHMucnVuKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAodCB8fCAhdCAmJiAhcikgJiYgKHIgPSBwLmZlYXR1cmVzLmdldFZhbHVlKCdyZWdpb25Db2RlJykgfHwgZSwgbi5iYkxvZ2dlci5sb2dJbmZvKCdSZWdpb24gQ29kZSBTZXQ6JywgciksICgwLCBsLnNldENvbmZpZykoJ2dlby5yZWdpb25Db2RlJywgciksIGcucnVuKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gVCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSB8fCAobi5iYkxvZ2dlci5sb2dXYXJuKCdSZWdpb24gY29kZSBmb3IgY291bnRyeSBpcyBub3Qgc2V0ICgnLCB0LCAnKSB1c2luZyBmYWlsc2FmZTonLCBiLmZhaWxzYWZlQ291bnRyeUNvZGUpLCBlID0gVChiLmZhaWxzYWZlQ291bnRyeUNvZGUpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gdi5kZWZhdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2LmRlZmF1bHQsIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmRlZmF1bHRbdF0uaW5kZXhPZihlKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5kZWZhdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRC5sZW5ndGggfHwgKEQgPSBPYmplY3QudmFsdWVzKFAoKSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pKSwgRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5leHBvc3VyZUFwaS5leHBvc2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVnaW9uQ29kZTogQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lvbk1hcHBpbmdzOiBQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFwcGVkQ291bnRyaWVzOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFwcGVkUmVnaW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOLmxlbmd0aCB8fCAoTiA9IE9iamVjdC5rZXlzKFAoKSkpLCBOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvdW50cnlDb2RlOiB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db3VudHJ5U2V0OiBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZWdpb25TZXQ6IFIKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPIHx8IChPID0gITAsIG4uYmJMb2dnZXIubG9nSW5mbygnSW5pdGlhbGl6aW5nIEdlb2xvY2F0aW9uIGRldGVjdGlvbiBtb2R1bGUnLCBiKSwgZyA9ICgwLCBpLnJ1blF1ZXVlKSgnb25SZWdpb25TZXQnLCBnLCAoMCwgbi5kZWJ1Z09uKSgpKSwgYi5vdmVycmlkZUNvdW50cnlDb2RlIHx8IGIub3ZlcnJpZGVSZWdpb25Db2RlID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm92ZXJyaWRlUmVnaW9uQ29kZSAmJiAoUCgpW2Iub3ZlcnJpZGVSZWdpb25Db2RlXSA/IHcoYi5vdmVycmlkZVJlZ2lvbkNvZGUsICEwKSA6IChuLmJiTG9nZ2VyLmxvZ1dhcm4oJ1JlZ2lvbiBjb2RlIGZvciBvdmVycmlkZSBpcyBub3QgbWFwcGVkICgnLCBiLm92ZXJyaWRlUmVnaW9uQ29kZSwgJykgdXNpbmcgZmFpbHNhZmUgYXMgZmFsbGJhY2s6JywgYi5mYWlsc2FmZVJlZ2lvbkNvZGUpLCB3KGIuZmFpbHNhZmVSZWdpb25Db2RlLCAhMCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5vdmVycmlkZUNvdW50cnlDb2RlICYmIChrKCkuaW5kZXhPZihiLm92ZXJyaWRlQ291bnRyeUNvZGUpID49IDAgPyAocyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoYi5vdmVycmlkZUNvdW50cnlDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBJKGIub3ZlcnJpZGVDb3VudHJ5Q29kZSwgITApKSA6IChuLmJiTG9nZ2VyLmxvZ1dhcm4oJ0NvdW50cnkgY29kZSBmb3Igb3ZlcnJpZGUgaXMgbm90IG1hcHBlZCAoJywgYi5vdmVycmlkZUNvdW50cnlDb2RlLCAnKSB1c2luZyBmYWlsc2FmZSBhcyBmYWxsYmFjazonLCBiLmZhaWxzYWZlQ291bnRyeUNvZGUpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShiLmZhaWxzYWZlQ291bnRyeUNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEkoYi5mYWlsc2FmZUNvdW50cnlDb2RlLCAhMCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkgOiAocyA9ICgwLCBpLnJ1blF1ZXVlKSgnb25Db3VudHJ5U2V0JywgcywgKDAsIG4uZGVidWdPbikoKSksIHUuY2xpZW50SW5mby5nZXRDb3VudHJ5Q29kZSgpLCAoMCwgbC5nZXRDb25maWcpKCdjbGllbnRJbmZvLmRhdGEuY291bnRyeScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucnVuKGUudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMucHVzaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJiTG9nZ2VyLmxvZ0luZm8oJ1N1Y2Nlc3NmdWxseSBhcHBsaWVkIHRoZSBsb2NhdGlvbiBjb2RlJywgZSksIEkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuZmFpbHNhZmVDb3VudHJ5Q29kZSAmJiBiLmZhaWxzYWZlVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyA9ICgwLCBmLmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2Uubm93KCksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgfHwgKG4uYmJMb2dnZXIubG9nSW5mbygnVW5hYmxlIHRvIHN1Y2Nlc3NmdWxseSBhcHBseSB0aGUgY291bnRyeSBjb2RlLiBVc2luZyBmYWlsIHNhZmUgY291bnRyeSBjb2RlJywgYi5mYWlsc2FmZUNvdW50cnlDb2RlKSwgSShiLmZhaWxzYWZlQ291bnRyeUNvZGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIuZmFpbHNhZmVUaW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYmJMb2dnZXIubG9nRXJyb3IoJ0dlbyBNb2R1bGUgZmFpbCBzYWZlIHZhbHVlcyBub3Qgc2V0IGNvcnJlY3RseTonLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHNhZmVDb3VudHJ5Q29kZTogYi5mYWlsc2FmZUNvdW50cnlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxzYWZlVGltZW91dDogYi5mYWlsc2FmZVRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IoJ0dlbyBNb2R1bGUgZmFpbCBzYWZlIHZhbHVlcyBub3Qgc2V0IGNvcnJlY3RseTonLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHNhZmVDb3VudHJ5Q29kZTogYi5mYWlsc2FmZUNvdW50cnlDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxzYWZlVGltZW91dDogYi5mYWlsc2FmZVRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5lcnJvclJlcG9ydGluZy5yZXBvcnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkpLCBjLmF1Y3Rpb24uYmVmb3JlKEUpLCBkLmdldFVuaXRDb2xsZWN0aW9uLmFmdGVyKF8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hdWN0aW9uLmdldEhvb2tzKHsgaG9vazogRSB9KS5yZW1vdmUoKSwgZC5nZXRVbml0Q29sbGVjdGlvbi5nZXRIb29rcyh7IGhvb2s6IF8gfSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZWdpb25TZXQ6IFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvdW50cnlTZXQ6IGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWdpb25Db2RlOiBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q291bnRyeUNvZGU6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbC5nZXRDb25maWcpKCdnZW8nLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpLCBPID0gcy5tb2R1bGVNYW5hZ2VyLnJlZ2lzdGVyKFMpOwogICAgICAgICAgICAgICAgdC5nZW8gPSBPOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gSlNPTi5wYXJzZSgneyJ1cyI6WyJhdSIsIm56IiwidXMiXSwiY2EiOlsiY2EiXSwibGF0YW0iOlsiYnIiLCJteCJdLCJlbWVhIjpbImFmIiwiYXgiLCJhbCIsImR6IiwiYWQiLCJhbyIsImFtIiwiYXQiLCJheiIsImJoIiwiYnkiLCJiZSIsImJqIiwiYmEiLCJiYSIsImJ3IiwiYnYiLCJiZyIsImJmIiwiYmkiLCJjbSIsImN2IiwiY2YiLCJ0ZCIsImttIiwiY2kiLCJociIsImN5IiwiY3oiLCJjeiIsImNkIiwiZGsiLCJkaiIsImVnIiwiZ3EiLCJlciIsImVlIiwiZXQiLCJmayIsImZvIiwiZmkiLCJmciIsInRmIiwiZ2EiLCJnbSIsImdlIiwiZGUiLCJnaCIsImdpIiwiZ3IiLCJnbCIsImdnIiwiZ24iLCJndyIsImh1IiwiaXMiLCJpcSIsImllIiwiaW0iLCJpbCIsIml0IiwiY2kiLCJqZSIsImpvIiwia3oiLCJrZSIsInhrIiwia3ciLCJrZyIsImx2IiwibGIiLCJscyIsImxyIiwibHkiLCJsaSIsImx0IiwibHUiLCJtayIsIm1rIiwibWciLCJtdyIsIm1sIiwibXQiLCJtciIsIm11IiwieXQiLCJtZCIsIm1jIiwibWUiLCJtYSIsIm16IiwibmEiLCJubCIsIm5lIiwibmciLCJubyIsIm9tIiwicHMiLCJwbCIsInB0IiwicWEiLCJjZyIsInJlIiwicm8iLCJydSIsInJ3Iiwic2giLCJzbSIsInN0Iiwic2EiLCJzbiIsInJzIiwic2MiLCJzbCIsInNrIiwic2kiLCJzbyIsInphIiwiZ3MiLCJlcyIsInNkIiwic2oiLCJzeiIsInNlIiwiY2giLCJzeSIsInRqIiwidHoiLCJ0ZyIsInRuIiwidHIiLCJ0bSIsInVnIiwidWEiLCJhZSIsImdiIiwidXoiLCJ2YSIsImVoIiwieWUiLCJ6YSIsInptIiwienciXSwiYXBhYyI6WyJhcyIsImFxIiwiYmQiLCJidCIsImlvIiwiYm4iLCJraCIsImNuIiwiY3giLCJjYyIsImNrIiwiZm0iLCJmaiIsInBmIiwiZ3UiLCJobSIsImhrIiwiaW4iLCJpZCIsImlyIiwianAiLCJraSIsImxhIiwibW8iLCJteSIsIm12IiwibWgiLCJmbSIsIm1uIiwibW0iLCJtbSIsIm1yIiwibnAiLCJuYyIsIm51IiwibmYiLCJrcCIsIm1wIiwicGsiLCJwdyIsInBnIiwicGgiLCJwbiIsInBuIiwicG0iLCJ3cyIsInNnIiwic2IiLCJrciIsImxrIiwidHciLCJ0aCIsInRsIiwidGsiLCJ0byIsInR2IiwidW0iLCJ2dSIsInZuIiwid2YiXX0nKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmNvbmZpYW50ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIwKSwgaSA9IHIoMjUpLCBvID0gcig3NCksIGEgPSByKDEyKSwgcyA9IG0ocigxMCkpLCB1ID0gcig0NCksIGMgPSByKDgpLCBkID0gcigxMDApLCBsID0gcigxNSksIGYgPSByKDUyKSwgcCA9IHIoNDIpLCBnID0gbShyKDUxKSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdiwgYiA9IHMuZGVmYXVsdC5FVkVOVFMsIHkgPSBiLkJBRF9CSUQsIGggPSBiLkJBRF9BRCwgUyA9IHMuZGVmYXVsdC5NT0RVTEVTLkNPTkZJQU5ULCBPID0gKHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFMsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAnSjNVWEZlZTF4Y2xZLWJmRmxXaDFtSVpfcGhVJywgKHQgPSAoMCwgYS5kb20pKCkud2luZG93KS5jb25maWFudCA9IHQuY29uZmlhbnQgfHwge30sIHQuY29uZmlhbnRbZV0gPSB0LmNvbmZpYW50W2VdIHx8IHsgY2xpZW50U2V0dGluZ3M6IHt9IH0sICh3aW5kb3cuY29uZmlhbnRbZV0uY2xpZW50U2V0dGluZ3MgfHwgKHdpbmRvdy5jb25maWFudFtlXS5jbGllbnRTZXR0aW5ncyA9IHt9KSkuY2FsbGJhY2sgPSBmdW5jdGlvbiAoZSwgdCwgciwgaSwgbywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBsID0gKDAsIHUuZ2V0VW5pdHMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgYS5wcmViaWQgJiYgYS5wcmViaWQuYWRJZCA/IChzID0gYS5wcmViaWQucywgbi5ldmVudEVtaXR0ZXIuZW1pdC5hcHBseShuLmV2ZW50RW1pdHRlciwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHJlYmlkLmFkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsW2EucHJlYmlkLnNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5iaWRDYWNoZS5nZXRCaWRCeUFkSWQoYS5wcmViaWQuYWRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSkpKSA6IHMgPSBhLmRmcC5zLCBjLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDQpLmxvZ0luZm8oJ0NvbmZpYW50IEJsb2NrZWQgYW4gYWQnLCBsW3NdLCBhcmd1bWVudHMpLCBuLmV2ZW50RW1pdHRlci5lbWl0LmFwcGx5KG4uZXZlbnRFbWl0dGVyLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFtzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmJiTG9nZ2VyLmxvZ0Vycm9yKCdFcnJvciBpbiBjb25maWFudCBiYWQgYWQgZGV0ZWN0ZWQgY2FsbGJhY2snLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBuZXcgRXJyb3IoJ0Vycm9yIGluIGNvbmZpYW50IGJhZCBhZCBkZXRlY3RlZCBjYWxsYmFjay4gJy5jb25jYXQoSlNPTi5zdHJpbmdpZnkoZSwgZy5kZWZhdWx0KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmVycm9yUmVwb3J0aW5nLnJlcG9ydChmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoMCwgby5yZW5kZXJTY3JpcHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6ICdodHRwczovL2NvbmZpYW50LWludGVncmF0aW9ucy5nbG9iYWwuc3NsLmZhc3RseS5uZXQvSjNVWEZlZTF4Y2xZLWJmRmxXaDFtSVpfcGhVL2dwdF9hbmRfcHJlYmlkL2NvbmZpZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYmItY29uZmlhbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGwuZ2V0Q29uZmlnKSgnY29uZmlhbnQuYmFkQWRSZWZyZXNoJykgJiYgKHYgPSBuLmV2ZW50RW1pdHRlci5vbihoLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYmJMb2dnZXIubG9nSW5mbygnUmVmcmVzaGluZyB1bml0IGR1ZSB0byBiYWQgYWQgZGV0ZWN0ZWQnLCBlKSwgKDAsIGYuYXVjdGlvbikoW2UuY29kZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgXyA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3RlcihPKTsKICAgICAgICAgICAgICAgIHQuY29uZmlhbnQgPSBfOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZHluYW1pY0JpZGRlcnMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoOCksIGkgPSByKDIwNiksIG8gPSByKDM1KSwgYSA9IHYocigyOSkpLCBzID0gcigyNSksIHUgPSByKDQ0KSwgYyA9IHIoMTUpLCBkID0gcig1MiksIGwgPSB2KHIoMTApKSwgZiA9IHYocig0OCkpLCBwID0gcig0MiksIGcgPSB2KHIoNTEpKSwgbSA9IHIoNTkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGIgPSBsLmRlZmF1bHQuTU9EVUxFUy5EWU5BTUlDX0JJRERFUlMsIHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSB8fCAoZVt0XSA9IHt9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmcFBhdGg6ICgwLCBjLmdldENvbmZpZykoJ2RmcFBhdGhPYmonKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25Db2RlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYy5nZXRDb25maWcpKCdnZW8ucmVnaW9uQ29kZScpIHx8ICd1cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogZC5pc01vYmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJDb250ZXh0OiBlW3RdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUYXJnZXRpbmc6ICgwLCBtLmdldFBhZ2VUYXJnZXRpbmcpKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3Q6IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSBzLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRzID0gZnVuY3Rpb24gKGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBbXSwgZCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICgwLCBvLmNsb25lRGVlcCkoZVtkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodFtsLmJpZGRlcl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGZ1bmN0aW9uIChlLCB0LCBuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuY3JlYXRlUmVkdWNlTWVyZ2VyKShlKS5wcm9jZXNzT2JqZWN0KG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRbbC5iaWRkZXJdLCAoMCwgdS5nZXRVbml0cykoKVtzXSwgbC5wYXJhbXMsIGwuYmlkZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogbC5iaWRkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6ICgwLCBhLmRlZmF1bHQpKHt9LCBlLCBsLnBhcmFtcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSB0LnBhcmFtcy5pbmNsdWRlZCAmJiBkZWxldGUgdC5wYXJhbXMuaW5jbHVkZWQsICgwLCBmLmRlZmF1bHQpKHQucGFyYW1zKSB8fCBjLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBtLmxlbmd0aDsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYobVtiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5iYkxvZ2dlci5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdFeGNsdWRpbmcgYmlkZGVyJywgbC5iaWRkZXIsICdmcm9tJywgcywgJ2R5bmFtaWMgYmlkZGVyIGV2YWx1YXRlZCB0byBmYWxzeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJiTG9nZ2VyLmF0VmVyYm9zaXR5KDEpLmxvZ0Vycm9yKCdJc3N1ZSBldmFsdWF0aW5nIGR5bmFtaWMgYmlkZGVyIGZvciBhZCB1bml0JywgcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gbmV3IEVycm9yKCdJc3N1ZSBldmFsdWF0aW5nIGR5bmFtaWMgYmlkZGVyIGZvciBhZCB1bml0ICcuY29uY2F0KHMsICcuICcpLmNvbmNhdChKU09OLnN0cmluZ2lmeShlLCBnLmRlZmF1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZXJyb3JSZXBvcnRpbmcucmVwb3J0KHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wdXNoKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsID0gMDsgbCA8IGUubGVuZ3RoOyBsKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZS5iaWRzLCBlLmNvZGUpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmJiTG9nZ2VyLmxvZ0luZm8oJ0JpZGRlciBDb250ZXh0czonLCBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKSksIGUgPSB7fSwgbi5iYkxvZ2dlci5hdFZlcmJvc2l0eSgxKS5sb2dJbmZvKCdBcHBsaWVkIER5bmFtaWMgQmlkZGVycycsIHMpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGMuZ2V0Q29uZmlnKSgnZHluYW1pY0JpZGRlcnMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgaCA9IHMubW9kdWxlTWFuYWdlci5yZWdpc3Rlcih5LCBudWxsLCB7IGdhdGU6ICdjb25zZW50R2l2ZW4nIH0pOwogICAgICAgICAgICAgICAgdC5keW5hbWljQmlkZGVycyA9IGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5hbWF6b24gPSB2b2lkIDAsIHIoNiksIHIoMTMpLCByKDkpLCByKDExKSwgcig0KSwgcigyNiksIHIoMTcpLCByKDIpLCByKDEpLCByKDMpLCByKDUpLCByKDk1KSwgcigwKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcig4KSwgaSA9IHIoMTQ2KSwgbyA9IHIoNzQpLCBhID0gcigzOSksIHMgPSByKDM1KSwgdSA9IHcocig4NikpLCBjID0gcigyMSksIGQgPSByKDI1KSwgbCA9IHIoMjApLCBmID0gcig3MiksIHAgPSByKDE1KSwgZyA9IHIoMTUyKSwgbSA9IHIoMTIpLCB2ID0gdyhyKDEwKSksIGIgPSByKDQ0KSwgeSA9IHIoNTgpLCBoID0gdyhyKDk0KSksIFMgPSB3KHIoMzQpKSwgTyA9IHcocigxNzIpKSwgXyA9IHcocig1NikpLCBFID0gcig0MiksIEkgPSB3KHIoNTEpKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShuID0gKGEgPSBzLm5leHQoKSkuZG9uZSkgJiYgKHIucHVzaChhLnZhbHVlKSwgIXQgfHwgci5sZW5ndGggIT09IHQpOyBuID0gITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBudWxsID09IHMucmV0dXJuIHx8IHMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHIgfHwgJ1NldCcgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHggPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gQyhPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogQyhPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBSID0gKDAsIG4ubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhbWF6b24nLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjRkZGJywKICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogJyNmMDg4MDQnCiAgICAgICAgICAgICAgICAgICAgfSksIEQgPSB2LmRlZmF1bHQuTU9EVUxFUywgayA9IEQuQU1BWk9OX0hFQURFUl9CSURESU5HLCBOID0gRC5HRU9MT0NBVElPTiwgTSA9IEQuVklERU8sIFUgPSB2LmRlZmF1bHQuRVZFTlRTLCBCID0gVS5IRUFERVJfQklERElOR19SRVFVRVNULCBMID0gVS5IRUFERVJfQklERElOR19SRVNQT05TRSwgeiA9IHYuZGVmYXVsdC5RVUVSWV9QQVJBTVMuQklEX1NVUFBSRVNTLCBWID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICExLCB0ID0gITEsIHIgPSBbXSwgbiA9IFtdLCB2ID0ge30sIHcgPSAoMCwgYS5ob29rZWRGbikoJ3N5bmMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdJbml0aWFsaXplZCcpLCBlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBtLmRvbSkoKS53aW5kb3cuYXBzdGFnLl9RLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKDAsIG0uZG9tKSgpLndpbmRvdy5hcHN0YWcgPSAoMCwgbS5kb20pKCkud2luZG93LmFwc3RhZyB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ROiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgnaScsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoQmlkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgnZicsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlCaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoMCwgby5yZW5kZXJTY3JpcHQpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdiYi1hbWF6b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogJy8vYy5hbWF6b24tYWRzeXN0ZW0uY29tL2FheDIvYXBzdGFnLmpzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBkLm1vZHVsZU1hbmFnZXIudmlhTW9kdWxlKE0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VmlkZW9Vbml0UGFyYW1zLmJlZm9yZShDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5yZXF1ZXN0TWFuYWdlci5yZWdpc3RlcignYW1hem9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSAoMCwgdS5kZWZhdWx0KShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmVsZW1lbnRJZCB8fCBlLmNvZGUsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJRDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdE5hbWU6ICgwLCBwLmdldENvbmZpZykoJ2RmcFBhdGhPYmouc3RyaW5nJykgKyAnLycgKyB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlzVmlkZW8gPyByLm1lZGlhVHlwZSA9ICd2aWRlbycgOiByLnNpemVzID0gZS5nZXRTaXplcygpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyAhPSB0eXBlb2YgZSAmJiBuLmluZGV4T2YoZS5qb2luKCd4JykpID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgcC5nZXRDb25maWcpKCdkZnBQYXRoT2JqLnN0cmluZycpICsgKGUuZWxlbWVudElkIHx8IGUuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gKDAsIFMuZGVmYXVsdCkobiwgJ3BhcmFtcy5jdXN0X3BhcmFtcycpIHx8IHt9LCBvID0gKDAsIF8uZGVmYXVsdCkodlt0LmNvZGVdLCBbJ3RpbWVvdXQnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgaC5kZWZhdWx0KShuLCAncGFyYW1zLmN1c3RfcGFyYW1zJywgKDAsIE8uZGVmYXVsdCkobywgaSkpLCBlKHQsIHIsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5leHBvc3VyZUFwaS5leHBvc2UoeyBnZXRBbWF6b25CaWRzOiBqIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplOiB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgcC5nZXRDb25maWcpKCdhbWF6b24uYWxsb3dlZFNpemVzJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5qb2luKCd4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0IHx8IGQubW9kdWxlTWFuYWdlci52aWFNb2R1bGUoTiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLm9uUmVnaW9uU2V0LCBuID0gZS5nZXRSZWdpb25Db2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBwLmdldENvbmZpZykoJ2FtYXpvbi5yZWdpb25Db25maWcuJy5jb25jYXQobigpKSkgJiYgKGUgPSAoMCwgcC5nZXRDb25maWcpKCdhbWF6b24ucmVnaW9uQ29uZmlnLicuY29uY2F0KG4oKSkpLCBSLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ0FwcGx5aW5nIHJlZ2lvbiBiYXNlZCBjb25maWcnLCBlKSksICgwLCBwLnNldENvbmZpZykoJ2FtYXpvbicsIFAoUCh7fSwgKDAsIHAuZ2V0Q29uZmlnKSgnYW1hem9uJykpLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oKSA/IGkoKSA6IChSLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ0xpc3RlbmluZyBmb3IgcmVnaW9uIGNvZGUnKSwgcihpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QW1hem9uQmlkczogaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmZlYXR1cmVzLmdldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQoeiwgJy5hbWF6b24nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdCh6LCAnLmFsbCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnJlcXVlc3RNYW5hZ2VyLmRvbmUoJ2FtYXpvbicpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEEoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgciA9IFtdLCBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVbbl0sIG8gPSAoMCwgcy5jbG9uZURlZXApKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYmlkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgaS5iaWRzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gaS5iaWRzW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uJyAhPT0gdS5iaWRkZXIgfHwgZi5mZWF0dXJlcy5nZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KHosICcuJykuY29uY2F0KGkuY29kZSwgJy5hbWF6b24nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdCh6LCAnLicpLmNvbmNhdChpLmNvZGUsICcuYWxsJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgPyBvLmJpZHMucHVzaCh1KSA6ICcxJyA9PT0gdS5wYXJhbXMuaW5jbHVkZWQgfHwgITAgPT09IHUucGFyYW1zLmluY2x1ZGVkID8gdC5wdXNoKFQoaSkpIDogdC5wdXNoKHgoe30sIFQoaSksIHUucGFyYW1zKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaChvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpLCAyKSwgbyA9IG5bMF0sIGEgPSBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmxlbmd0aCA+IDAgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgfHwgKCgwLCBtLmRvbSkoKS53aW5kb3cuYXBzdGFnLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJJRDogKDAsIHAuZ2V0Q29uZmlnKSgnYW1hem9uLnB1YklEJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6ICgwLCBwLmdldENvbmZpZykoJ2JpZGRlclRpbWVvdXQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTZXJ2ZXI6ICgwLCBwLmdldENvbmZpZykoJ2FtYXpvbi5hZFNlcnZlcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgPSAhMCksIFIuYXRWZXJib3NpdHkoMSkubG9nTWVzc2FnZSgnQW1hem9uIC0gRmV0Y2hpbmcgYmlkcycsIHQpLCAoMCwgbS5kb20pKCkud2luZG93LmFwc3RhZy5mZXRjaEJpZHMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90czogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogKDAsIHAuZ2V0Q29uZmlnKSgnYmlkZGVyVGltZW91dCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goZSksIFIuYXRWZXJib3NpdHkoMSkubG9nSW5mbygnQW1hem9uIC0gQmlkcyBSZXR1cm5lZCcsIGUpLCBnLmdwdE1vZHVsZS5ncHRBY3Rpb24oZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbS5kb20pKCkud2luZG93LmFwc3RhZy5zZXREaXNwbGF5QmlkcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICgwLCBiLmdldFVuaXRzKSgpLCByID0gW10sIG4gPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVbbl0sIG8gPSBpLnNsb3RJRCwgYSA9IGkucXNQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0W29dLmlzVmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gKDAsIHkudXJsUXVlcnlBc09iamVjdCkoJ2E/Jy5jb25jYXQoYSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdltvXSAmJiB2W29dLnRpbWVvdXQgJiYgY2xlYXJUaW1lb3V0KHZbb10udGltZW91dCksIHZbb10gPSBzLCB2W29dLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2W29dLmFtem5paWQgJiYgdltvXS5hbXpuaWlkID09PSBzLmFtem5paWQgJiYgKHZbb10gPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDAwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgci5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcyJyAhPT0gdC5hbXpuYmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBnLmdwdE1vZHVsZS5nZXRTbG90VGFyZ2V0aW5nKHQuc2xvdElEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5hbXpuaWlkID09PSB0LmFtem5paWQgJiYgdC5zbG90SUQgJiYgbi5hbXpuaWlkID09PSB0LmFtem5paWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBnLmdwdE1vZHVsZS5nZXRTbG90KHQuc2xvdElEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAoUi5sb2dJbmZvKCdDbGVhcmluZyBBbWF6b24gVGFyZ2V0aW5nIG9uIHVuaXQnLCB0LnNsb3RJRCwgdCksIGkuY2xlYXJUYXJnZXRpbmcoT2JqZWN0LmtleXModCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA2MDAwMDApLCBpLnJlcXVlc3RNYW5hZ2VyLmRvbmUoJ2FtYXpvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIGwuZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChrLCAnLicpLmNvbmNhdChMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBrLCB0LCBlKSwgbyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbC5ldmVudEVtaXR0ZXIuZW1pdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChrLCAnLicpLmNvbmNhdChCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGssIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXRWZXJib3NpdHkoMSkubG9nRXJyb3IoJ0FtYXpvbiAtJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgRXJyb3IoJ0FtYXpvbiAtICcuY29uY2F0KGUsICcuICcpLmNvbmNhdChKU09OLnN0cmluZ2lmeShlLCBJLmRlZmF1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRS5lcnJvclJlcG9ydGluZy5yZXBvcnQocyksIGkucmVxdWVzdE1hbmFnZXIuZG9uZSgnYW1hem9uJyksIGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obykgOiBpLnJlcXVlc3RNYW5hZ2VyLmRvbmUoJ2FtYXpvbicpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgRiA9IGQubW9kdWxlTWFuYWdlci5yZWdpc3RlcihWLCBudWxsLCB7IGdhdGU6ICdjb25zZW50R2l2ZW4nIH0pOwogICAgICAgICAgICAgICAgdC5hbWF6b24gPSBGOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnJlc2V0U3luY2VkU3RhdHVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIFQgPSAwOwogICAgICAgICAgICAgICAgfSwgdC5yZXNldFd1cmxNYXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgQiA9IHt9OwogICAgICAgICAgICAgICAgfSwgdC5QcmViaWRTZXJ2ZXIgPSBGLCByKDYpLCByKDEzKSwgcig5KSwgcigyNiksIHIoNCksIHIoMiksIHIoMTUzKSwgcigxMSksIHIoMTYpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4gPSB5KHIoMjEzKSksIGkgPSByKDE1NCksIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBFKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgaSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKG8uZ2V0IHx8IG8uc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBpLCBvKSA6IHJbaV0gPSBlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIGEgPSByKDM2KSwgcyA9IHkocig4NykpLCB1ID0gcigyMiksIGMgPSByKDQ1KSwgZCA9IHIoODgpLCBsID0gcig0OSksIGYgPSB5KHIoNjApKSwgcCA9IHkocigzMSkpLCBnID0gcigzNDEpLCBtID0gcigxMDMpLCB2ID0geShyKDM3KSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBXZWFrTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBXZWFrTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoXyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoRSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEksIHcgPSB1LmNvbmZpZy5nZXRDb25maWcsIEEgPSBhLlMyUy5TUkMsIFQgPSAwLCB4ID0gewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4QmlkczogMSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcjogJ3ByZWJpZFNlcnZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJPcHRpb25zOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgc3luY1VybE1vZGlmaWVyOiB7fQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEFycmF5LmlzQXJyYXkoZSkgPyBlIDogW2VdLCByID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmV2ZXJ5KGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgIT09IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmRlZmF1bHRWZW5kb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5kZWZhdWx0VmVuZG9yLCByID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcuUzJTX1ZFTkRPUlNbdF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5sb2dFcnJvcignSW5jb3JyZWN0IG9yIHVuYXZhaWxhYmxlIHByZWJpZCBzZXJ2ZXIgZGVmYXVsdCB2ZW5kb3Igb3B0aW9uOiAnICsgdCksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZy5TMlNfVkVORE9SU1t0XSkuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhbbl0gIT09IGVbbl0gJiYgKDAsIHAuZGVmYXVsdCkociwgbikgfHwgKGVbbl0gPSBnLlMyU19WRU5ET1JTW3RdW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSAmJiAhMSAhPT0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudElkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmlkZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuZHBvaW50JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgwLCBwLmRlZmF1bHQpKHQsIGUpICYmIChvLmxvZ0Vycm9yKGUgKyAnIG1pc3NpbmcgaW4gc2VydmVyIHRvIHNlcnZlciBjb25maWcnKSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUuYmlkZGVycykgJiYgKG5bdF0uYmlkZGVycyA9IGUuYmlkZGVycy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSByLmluZGV4T2YoZSkgJiYgKHIucHVzaChlKSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID8gSSA9IHQgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICByLm5vX2Nvb2tpZSA/IGZ1bmN0aW9uIChlLCB0LCByLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5zeW5jVXJsTW9kaWZpZXIgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaS5zeW5jVXJsTW9kaWZpZXJbcl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKGUsIGkuc3luY1VybE1vZGlmaWVyW3JdKGUsIHQsIHIpLCByLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaihlLCB0LCByLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfShyLnVzZXJzeW5jLnR5cGUsIHIudXNlcnN5bmMudXJsLCByLmJpZGRlciwgby5iaW5kLmNhbGwoUCwgbnVsbCwgZSwgdCksIHQpIDogUChlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0ID8gJ2ltYWdlJyA9PT0gZSB8fCAncmVkaXJlY3QnID09PSBlID8gKG8ubG9nTWVzc2FnZSgnSW52b2tpbmcgaW1hZ2UgcGl4ZWwgdXNlciBzeW5jIGZvciBiaWRkZXI6ICInLmNvbmNhdChyLCAnIicpKSwgby50cmlnZ2VyUGl4ZWwodCwgbikpIDogJ2lmcmFtZScgPT0gZSA/IChvLmxvZ01lc3NhZ2UoJ0ludm9raW5nIGlmcmFtZSB1c2VyIHN5bmMgZm9yIGJpZGRlcjogIicuY29uY2F0KHIsICciJykpLCBvLmluc2VydFVzZXJTeW5jSWZyYW1lKHQsIG4pKSA6IChvLmxvZ0Vycm9yKCdVc2VyIHN5bmMgdHlwZSAiJy5jb25jYXQoZSwgJyIgbm90IHN1cHBvcnRlZCBmb3IgYmlkZGVyOiAiJykuY29uY2F0KHIsICciJykpLCBuKCkpIDogKG8ubG9nRXJyb3IoJ05vIHN5bmMgdXJsIGZvciBiaWRkZXIgIicuY29uY2F0KHIsICciOiAnKS5jb25jYXQodCkpLCBuKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdS5jb25maWcuc2V0RGVmYXVsdHMoeyBzMnNDb25maWc6IHggfSksIHcoJ3Myc0NvbmZpZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoZS5zMnNDb25maWcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgUiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BvbnNvcmVkQnk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZzogMywKICAgICAgICAgICAgICAgICAgICAgICAgbGlrZXM6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkczogNSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IDYsCiAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogNywKICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IDgsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IDksCiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkyOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgY3RhOiAxMgogICAgICAgICAgICAgICAgICAgIH0sIEQgPSBPYmplY3Qua2V5cyhSKSwgayA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IDMKICAgICAgICAgICAgICAgICAgICB9LCBOID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbWc6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAyCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICBSLAogICAgICAgICAgICAgICAgICAgIGssCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAndmlld2FibGUtbXJjNTAnOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAndmlld2FibGUtbXJjMTAwJzogMywKICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZXdhYmxlLXZpZGVvNTAnOiA0CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBOCiAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVbZVt0XV0gPSB0OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgTSA9IHt9LCBVID0ge30sIEIgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBMID0gZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbXSwgYSA9IHt9LCBjID0gdFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByID0gKDAsIGQucHJvY2Vzc05hdGl2ZUFkVW5pdFBhcmFtcykoby5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLm5hdGl2ZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFVbZS5jb2RlXSA9IE9iamVjdC5rZXlzKHIpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gclt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8oeyByZXF1aXJlZDogbi5yZXF1aXJlZCA/IDEgOiAwIH0sIGUgPyBvLmNsZWFuT2JqKGUpIDoge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbWFnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaWNvbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0ga1t0XSwgcyA9IG8uY2xlYW5PYmooewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogby5kZWVwQWNjZXNzKG4sICdzaXplcy4wJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogby5kZWVwQWNjZXNzKG4sICdzaXplcy4xJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21pbjogby5kZWVwQWNjZXNzKG4sICdhc3BlY3RfcmF0aW9zLjAubWluX3dpZHRoJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG1pbjogby5kZWVwQWNjZXNzKG4sICdhc3BlY3RfcmF0aW9zLjAubWluX2hlaWdodCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocy53ICYmIHMuaCB8fCBzLmhtaW4gJiYgcy53bWluKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ2ludmFsaWQgaW1nIHNpemVzIChtdXN0IHByb3ZpZGUgc2l6ZXMgb3IgbWluX2hlaWdodCAmIG1pbl93aWR0aCBpZiB1c2luZyBhc3BlY3RfcmF0aW9zKSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShuLmFzcGVjdF9yYXRpb3MpICYmIChzLmV4dCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcGVjdHJhdGlvczogbi5hc3BlY3RfcmF0aW9zLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQoZS5yYXRpb193aWR0aCwgJzonKS5jb25jYXQoZS5yYXRpb19oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUucHVzaChpKHsgaW1nOiBzIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGl0bGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4ubGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnaW52YWxpZCB0aXRsZS5sZW4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVzaChpKHsgdGl0bGU6IHsgbGVuOiBuLmxlbiB9IH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBSW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIGUucHVzaChpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjogbi5sZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcignZXJyb3IgY3JlYXRpbmcgbmF0aXZlIHJlcXVlc3Q6ICcgKyBTdHJpbmcoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gby5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvJyksIGwgPSBvLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMuYmFubmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5iaWRzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1bJycuY29uY2F0KGUuY29kZSkuY29uY2F0KHQuYmlkZGVyKV0gPSB0LmJpZF9pZCwgcy5kZWZhdWx0LmFsaWFzUmVnaXN0cnlbdC5iaWRkZXJdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHMuZGVmYXVsdC5iaWRkZXJSZWdpc3RyeVt0LmJpZGRlcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmICFyLmdldFNwZWMoKS5za2lwUGJzQWxpYXNpbmcgJiYgKGFbdC5iaWRkZXJdID0gcy5kZWZhdWx0LmFsaWFzUmVnaXN0cnlbdC5iaWRkZXJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgbC5zaXplcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG8ucGFyc2VTaXplc0lucHV0KGwuc2l6ZXMpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBTKGUuc3BsaXQoJ3gnKSwgMiksIHIgPSB0WzBdLCBuID0gdFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogcGFyc2VJbnQociwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IHBhcnNlSW50KG4sIDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYmFubmVyID0geyBmb3JtYXQ6IHAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uaXNFbXB0eSh1KSB8fCAoJ291dHN0cmVhbScgIT09IHUuY29udGV4dCB8fCBlLnJlbmRlcmVyID8gKCdpbnN0cmVhbScgIT09IHUuY29udGV4dCB8fCB1Lmhhc093blByb3BlcnR5KCdwbGFjZW1lbnQnKSB8fCAodS5wbGFjZW1lbnQgPSAxKSwgZi52aWRlbyA9IHUpIDogby5sb2dFcnJvcignT3V0c3RyZWFtIGJpZCB3aXRob3V0IHJlbmRlcmVyIGNhbm5vdCBiZSBzZW50IHRvIFByZWJpZCBTZXJ2ZXIuJykpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm5hdGl2ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsY210dHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnR0cmFja2VyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBbMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NldHM6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXI6ICcxLjInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmxvZ0Vycm9yKCdlcnJvciBjcmVhdGluZyBuYXRpdmUgcmVxdWVzdDogJyArIFN0cmluZyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBlLmJpZHMucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHMuZGVmYXVsdC5iaWRkZXJSZWdpc3RyeVt0LmJpZGRlcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAmJiByLmdldFNwZWMoKS50cmFuc2Zvcm1CaWRQYXJhbXMgJiYgKHQucGFyYW1zID0gci5nZXRTcGVjKCkudHJhbnNmb3JtQmlkUGFyYW1zKHQucGFyYW1zLCAhMCkpLCBlW3QuYmlkZGVyXSA9IG4uYWRhcHRlck9wdGlvbnMgJiYgbi5hZGFwdGVyT3B0aW9uc1t0LmJpZGRlcl0gPyBfKHt9LCB0LnBhcmFtcywgbi5hZGFwdGVyT3B0aW9uc1t0LmJpZGRlcl0pIDogdC5wYXJhbXMsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KSwgbSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmU6IG4uc2VjdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgPSBvLmRlZXBBY2Nlc3MoZSwgJ2ZwZC5jb250ZXh0LnBiQWRTbG90Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGIgJiYgYiAmJiBvLmRlZXBTZXRWYWx1ZShtLCAnZXh0LmNvbnRleHQuZGF0YS5wYmFkc2xvdCcsIGIpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkU2xvdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBvLmRlZXBBY2Nlc3MoZSwgJ2ZwZC5jb250ZXh0LmFkc2VydmVyLicuY29uY2F0KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHIgJiYgciAmJiBvLmRlZXBTZXRWYWx1ZShtLCAnZXh0LmNvbnRleHQuZGF0YS5hZHNlcnZlci4nLmNvbmNhdCh0LnRvTG93ZXJDYXNlKCkpLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgXyhtLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9ICgwLCB2LmRlZmF1bHQpKGMuYmlkcywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWRVbml0Q29kZSA9PT0gZS5jb2RlICYmIHQuc3RvcmVkQXVjdGlvblJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgJiYgby5kZWVwU2V0VmFsdWUobSwgJ2V4dC5wcmViaWQuc3RvcmVkYXVjdGlvbnJlc3BvbnNlLmlkJywgeS5zdG9yZWRBdWN0aW9uUmVzcG9uc2UudG9TdHJpbmcoKSksIChtLmJhbm5lciB8fCBtLnZpZGVvIHx8IG0ubmF0aXZlKSAmJiBpLnB1c2gobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLnRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHsgdGlkOiBlLnRpZCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtYXg6IG4udGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXA6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDogdygnZGVidWcnKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmViaWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb250aW1lc3RhbXA6IGMuYXVjdGlvblN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aW5nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXdpbm5lcnM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGViaWRkZXJrZXlzOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZXh0UHJlYmlkICYmICdvYmplY3QnID09PSBFKG4uZXh0UHJlYmlkKSAmJiAobC5leHQucHJlYmlkID0gXyhsLmV4dC5wcmViaWQsIG4uZXh0UHJlYmlkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHUuY29uZmlnLmdldENvbmZpZygnY3VycmVuY3kuYWRTZXJ2ZXJDdXJyZW5jeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgZiA/IGwuY3VyID0gW2ZdIDogQXJyYXkuaXNBcnJheShmKSAmJiBmLmxlbmd0aCAmJiAobC5jdXIgPSBbZlswXV0pLCBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKCdvYmplY3QnID09PSBFKHUuY29uZmlnLmdldENvbmZpZygnYXBwJykpID8gKGUuYXBwID0gdS5jb25maWcuZ2V0Q29uZmlnKCdhcHAnKSwgZS5hcHAucHVibGlzaGVyID0geyBpZDogciB9KSA6IChlLnNpdGUgPSB7fSwgby5pc1BsYWluT2JqZWN0KHUuY29uZmlnLmdldENvbmZpZygnc2l0ZScpKSAmJiAoZS5zaXRlID0gdS5jb25maWcuZ2V0Q29uZmlnKCdzaXRlJykpLCBvLmRlZXBBY2Nlc3MoZS5zaXRlLCAncHVibGlzaGVyLmlkJykgfHwgby5kZWVwU2V0VmFsdWUoZS5zaXRlLCAncHVibGlzaGVyLmlkJywgciksIGUuc2l0ZS5wYWdlIHx8IChlLnNpdGUucGFnZSA9IHQpKSwgJ29iamVjdCcgPT09IEUodS5jb25maWcuZ2V0Q29uZmlnKCdkZXZpY2UnKSkgJiYgKGUuZGV2aWNlID0gdS5jb25maWcuZ2V0Q29uZmlnKCdkZXZpY2UnKSksIGUuZGV2aWNlIHx8IChlLmRldmljZSA9IHt9KSwgZS5kZXZpY2UudyB8fCAoZS5kZXZpY2UudyA9IHdpbmRvdy5pbm5lcldpZHRoKSwgZS5kZXZpY2UuaCB8fCAoZS5kZXZpY2UuaCA9IHdpbmRvdy5pbm5lckhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShsLCB0WzBdLnJlZmVyZXJJbmZvLnJlZmVyZXIsIG4uYWNjb3VudElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gby5kZWVwQWNjZXNzKHQsICcwLmJpZHMuMC5zY2hhaW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgJiYgKGwuc291cmNlLmV4dCA9IHsgc2NoYWluOiBwIH0pLCBvLmlzRW1wdHkoYSkgfHwgKGwuZXh0LnByZWJpZC5hbGlhc2VzID0gYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IG8uZGVlcEFjY2Vzcyh0LCAnMC5iaWRzLjAudXNlcklkQXNFaWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby5pc0FycmF5KGcpICYmIGcubGVuZ3RoID4gMCAmJiBvLmRlZXBTZXRWYWx1ZShsLCAndXNlci5leHQuZWlkcycsIGcpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuZ2RwckNvbnNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb2xlYW4nID09IHR5cGVvZiBjLmdkcHJDb25zZW50LmdkcHJBcHBsaWVzICYmIChtID0gYy5nZHByQ29uc2VudC5nZHByQXBwbGllcyA/IDEgOiAwKSwgby5kZWVwU2V0VmFsdWUobCwgJ3JlZ3MuZXh0LmdkcHInLCBtKSwgby5kZWVwU2V0VmFsdWUobCwgJ3VzZXIuZXh0LmNvbnNlbnQnLCBjLmdkcHJDb25zZW50LmNvbnNlbnRTdHJpbmcpLCBjLmdkcHJDb25zZW50LmFkZHRsQ29uc2VudCAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgYy5nZHByQ29uc2VudC5hZGR0bENvbnNlbnQgJiYgby5kZWVwU2V0VmFsdWUobCwgJ3VzZXIuZXh0LkNvbnNlbnRlZFByb3ZpZGVyc1NldHRpbmdzLmNvbnNlbnRlZF9wcm92aWRlcnMnLCBjLmdkcHJDb25zZW50LmFkZHRsQ29uc2VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMudXNwQ29uc2VudCAmJiBvLmRlZXBTZXRWYWx1ZShsLCAncmVncy5leHQudXNfcHJpdmFjeScsIGMudXNwQ29uc2VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gdygnY29wcGEnKSAmJiBvLmRlZXBTZXRWYWx1ZShsLCAncmVncy5jb3BwYScsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSB3KCdmcGQnKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmNvbnRleHQgJiYgby5kZWVwU2V0VmFsdWUobCwgJ3NpdGUuZXh0LmRhdGEnLCBiLmNvbnRleHQpLCBiLnVzZXIgJiYgby5kZWVwU2V0VmFsdWUobCwgJ3VzZXIuZXh0LmRhdGEnLCBiLnVzZXIpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5jb25maWcuZ2V0QmlkZGVyQ29uZmlnKCksIHIgPSBPYmplY3Qua2V5cyh0KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmZwZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mcGQuY29udGV4dCAmJiAoaS5zaXRlID0gbi5mcGQuY29udGV4dCksIG4uZnBkLnVzZXIgJiYgKGkudXNlciA9IG4uZnBkLnVzZXIpLCBlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiBbcl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogeyBmcGQ6IGkgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxlbmd0aCAmJiBvLmRlZXBTZXRWYWx1ZShlLCAnZXh0LnByZWJpZC5iaWRkZXJjb25maWcnLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCksIGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcignUmVxdWVzdCB0byBQcmViaWQgU2VydmVyIHJlamVjdGVkIGR1ZSB0byBpbnZhbGlkIG1lZGlhIHR5cGUocykgaW4gYWRVbml0LicpOwogICAgICAgICAgICAgICAgICAgIH0sIHogPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2ZXJFcnJvcnMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNwb25zZXRpbWVtaWxsaXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2ZXJSZXNwb25zZVRpbWVNcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG8uZGVlcEFjY2Vzcyh0LCAnZXh0LicuY29uY2F0KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIE9iamVjdC5rZXlzKGkpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAoMCwgdi5kZWZhdWx0KShlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyQ29kZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgKHJbbl0gPSBpW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgZSwgclswXSwgclsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnNlYXRiaWQgJiYgZS5zZWF0YmlkLmZvckVhY2goZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLmJpZCB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkLCBsID0gJycuY29uY2F0KHUuaW1waWQpLmNvbmNhdChzLnNlYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1bbF0gJiYgKGQgPSBvLmdldEJpZFJlcXVlc3QoTVtsXSwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdS5wcmljZSwgcCA9IDAgIT09IGYgPyBhLlNUQVRVUy5HT09EIDogYS5TVEFUVVMuTk9fQklELCBnID0gKDAsIGkuY3JlYXRlQmlkKShwLCBkIHx8IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogcy5zZWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuY3BtID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IG8uZGVlcEFjY2VzcyhlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2V0aW1lbWlsbGlzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZWF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgbSAmJiAoZC5zZXJ2ZXJSZXNwb25zZVRpbWVNcyA9IG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2LCBiLCB5LCBTID0gby5kZWVwQWNjZXNzKHUsICdleHQucHJlYmlkLmJpZGlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pc1N0cihTKSAmJiAoZy5wYnNCaWRJZCA9IFMpLCBvLmlzU3RyKG8uZGVlcEFjY2Vzcyh1LCAnZXh0LnByZWJpZC5ldmVudHMud2luJykpICYmICh2ID0gZC5hdWN0aW9uSWQsIGIgPSBnLmFkSWQsIHkgPSBvLmRlZXBBY2Nlc3ModSwgJ2V4dC5wcmViaWQuZXZlbnRzLndpbicpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmV2ZXJ5KG8uaXNTdHIpICYmIChCWycnLmNvbmNhdCh2KS5jb25jYXQoYildID0geSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gby5kZWVwQWNjZXNzKHUsICdleHQucHJlYmlkLnRhcmdldGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmlzUGxhaW5PYmplY3QoTykgJiYgKG8uaXNTdHIoby5kZWVwQWNjZXNzKHUsICdleHQucHJlYmlkLmV2ZW50cy53aW4nKSkgJiYgKE8gPSBvLmdldERlZmluZWRQYXJhbXMoTywgT2JqZWN0LmtleXMoTykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IGUuaW5kZXhPZignaGJfd2ludXJsJykgJiYgLTEgPT09IGUuaW5kZXhPZignaGJfYmlkaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwgZy5hZHNlcnZlclRhcmdldGluZyA9IE8pLCBnLnNlYXRCaWRJZCA9IHUuaWQsIG8uZGVlcEFjY2Vzcyh1LCAnZXh0LnByZWJpZC50eXBlJykgPT09IGMuVklERU8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5tZWRpYVR5cGUgPSBjLlZJREVPOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyA9IGQuc2l6ZXMgJiYgZC5zaXplc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5wbGF5ZXJXaWR0aCA9IF9bMF0sIGcucGxheWVySGVpZ2h0ID0gX1sxXSwgdS5leHQucHJlYmlkLmNhY2hlICYmICdvYmplY3QnID09PSBFKHUuZXh0LnByZWJpZC5jYWNoZS52YXN0WG1sKSAmJiB1LmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC5jYWNoZUlkICYmIHUuZXh0LnByZWJpZC5jYWNoZS52YXN0WG1sLnVybCA/IChnLnZpZGVvQ2FjaGVLZXkgPSB1LmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC5jYWNoZUlkLCBnLnZhc3RVcmwgPSB1LmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC51cmwpIDogTyAmJiBPLmhiX3V1aWQgJiYgTy5oYl9jYWNoZV9ob3N0ICYmIE8uaGJfY2FjaGVfcGF0aCAmJiAoZy52aWRlb0NhY2hlS2V5ID0gTy5oYl91dWlkLCBnLnZhc3RVcmwgPSAnaHR0cHM6Ly8nLmNvbmNhdChPLmhiX2NhY2hlX2hvc3QpLmNvbmNhdChPLmhiX2NhY2hlX3BhdGgsICc/dXVpZD0nKS5jb25jYXQoTy5oYl91dWlkKSksIHUuYWRtICYmIChnLnZhc3RYbWwgPSB1LmFkbSksICFnLnZhc3RVcmwgJiYgdS5udXJsICYmIChnLnZhc3RVcmwgPSB1Lm51cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoby5kZWVwQWNjZXNzKHUsICdleHQucHJlYmlkLnR5cGUnKSA9PT0gYy5OQVRJVkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEksIHc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcubWVkaWFUeXBlID0gYy5OQVRJVkUsIHcgPSAnc3RyaW5nJyA9PSB0eXBlb2YgdS5hZG0gPyBnLmFkbSA9IEpTT04ucGFyc2UodS5hZG0pIDogZy5hZG0gPSB1LmFkbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFQgPSAoaChJID0ge30sIE4uaW1nLCB3LmltcHRyYWNrZXJzIHx8IFtdKSwgaChJLCBOLmpzLCB3LmpzdHJhY2tlciA/IFt3LmpzdHJhY2tlcl0gOiBbXSksIEkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAody5ldmVudHRyYWNrZXJzICYmIHcuZXZlbnR0cmFja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTi5pbWc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRbTi5pbWddLnB1c2goZS51cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE4uanM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRbTi5qc10ucHVzaChlLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uaXNQbGFpbk9iamVjdCh3KSAmJiBBcnJheS5pc0FycmF5KHcuYXNzZXRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBVW2QuYWRVbml0Q29kZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLm5hdGl2ZSA9IG8uY2xlYW5PYmoody5hc3NldHMucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB4W3QuaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmlzUGxhaW5PYmplY3QodC5pbWcpID8gZVtyLmltZy50eXBlID8ga1tyLmltZy50eXBlXSA6ICdpbWFnZSddID0gby5waWNrKHQuaW1nLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndyBhcyB3aWR0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoIGFzIGhlaWdodCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSA6IG8uaXNQbGFpbk9iamVjdCh0LnRpdGxlKSA/IGUudGl0bGUgPSB0LnRpdGxlLnRleHQgOiBvLmlzUGxhaW5PYmplY3QodC5kYXRhKSAmJiBELmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUltuXSA9PT0gci5kYXRhLnR5cGUgJiYgKGVbbl0gPSB0LmRhdGEudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5jbGVhbk9iaih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tVcmw6IHcubGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1RyYWNrZXJzOiBvLmRlZXBBY2Nlc3ModywgJ2xpbmsuY2xpY2t0cmFja2VycycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25UcmFja2VyczogVFtOLmltZ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdFRyYWNrZXJzOiBUW04uanNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcigncHJlYmlkIHNlcnZlciBuYXRpdmUgcmVzcG9uc2UgY29udGFpbmVkIG5vIGFzc2V0cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5hZG0gJiYgdS5udXJsID8gKGcuYWQgPSB1LmFkbSwgZy5hZCArPSBvLmNyZWF0ZVRyYWNrUGl4ZWxIdG1sKGRlY29kZVVSSUNvbXBvbmVudCh1Lm51cmwpKSkgOiB1LmFkbSA/IGcuYWQgPSB1LmFkbSA6IHUubnVybCAmJiAoZy5hZFVybCA9IHUubnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcud2lkdGggPSB1LncsIGcuaGVpZ2h0ID0gdS5oLCB1LmRlYWxpZCAmJiAoZy5kZWFsSWQgPSB1LmRlYWxpZCksIGcucmVxdWVzdElkID0gZC5iaWRJZCB8fCBkLmJpZF9JZCwgZy5jcmVhdGl2ZV9pZCA9IHUuY3JpZCwgZy5jcmVhdGl2ZUlkID0gdS5jcmlkLCB1LmJ1cmwgJiYgKGcuYnVybCA9IHUuYnVybCksIGcuY3VycmVuY3kgPSBlLmN1ciA/IGUuY3VyIDogJ1VTRCcsIGcubWV0YSA9IGcubWV0YSB8fCB7fSwgdS5hZG9tYWluICYmIChnLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMgPSB1LmFkb21haW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDID0gci5kZWZhdWx0VHRsIHx8IDYwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcudHRsID0gdS5leHAgPyB1LmV4cCA6IEMsIGcubmV0UmV2ZW51ZSA9ICF1Lm5ldFJldmVudWUgfHwgdS5uZXRSZXZlbnVlLCBuLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXQ6IHUuaW1waWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciwgbiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5ldmVyeShvLmlzU3RyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCWycnLmNvbmNhdChlKS5jb25jYXQodCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KGUuYXVjdGlvbklkLCBlLmFkSWQpOwogICAgICAgICAgICAgICAgICAgIG8uaXNTdHIobikgJiYgKG8ubG9nTWVzc2FnZSgnSW52b2tpbmcgaW1hZ2UgcGl4ZWwgZm9yIHd1cmwgb24gQklEX1dJTjogIicuY29uY2F0KG4sICciJykpLCBvLnRyaWdnZXJQaXhlbChuKSwgdCA9IGUuYXVjdGlvbklkLCByID0gZS5hZElkLCBbCiAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHIKICAgICAgICAgICAgICAgICAgICBdLmV2ZXJ5KG8uaXNTdHIpICYmIChCWycnLmNvbmNhdCh0KS5jb25jYXQocildID0gdm9pZCAwKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IG4uZGVmYXVsdCgncHJlYmlkU2VydmVyJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY2FsbEJpZHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG8uZGVlcENsb25lKGUuYWRfdW5pdHMpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1lZGlhVHlwZXMgJiYgKGUubWVkaWFUeXBlcy5uYXRpdmUgfHwgZS5tZWRpYVR5cGVzLmJhbm5lciAmJiBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzIHx8IGUubWVkaWFUeXBlcy52aWRlbyAmJiBlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyA9IHUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkcy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihvLnVuaXF1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKG8uZmxhdHRlbikuZmlsdGVyKG8udW5pcXVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KEkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnMyc0NvbmZpZyAmJiBlLnMyc0NvbmZpZy5zeW5jRW5kcG9pbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHQpICYmIHQubGVuZ3RoID4gMCAmJiAoZCA9IHRbMF0uZ2RwckNvbnNlbnQsIGcgPSB0WzBdLnVzcENvbnNlbnQpLCBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSS5sZW5ndGggIT09IFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiBvLmdlbmVyYXRlVVVJRCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50OiBuLmFjY291bnRJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEgPSBuLnVzZXJTeW5jTGltaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmlzTnVtYmVyKGEpICYmIGEgPiAwICYmIChpLmxpbWl0ID0gYSksIHQgJiYgKHZvaWQgMCAhPT0gdC5jb25zZW50U3RyaW5nICYmIChpLmdkcHIgPSB0LmdkcHJBcHBsaWVzID8gMSA6IDApLCAhMSAhPT0gdC5nZHByQXBwbGllcyAmJiAoaS5nZHByX2NvbnNlbnQgPSB0LmNvbnNlbnRTdHJpbmcpKSwgciAmJiAoaS51c19wcml2YWN5ID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEpTT04uc3RyaW5naWZ5KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG0uYWpheCkobi5zeW5jRW5kcG9pbnQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUCgoZSA9IEpTT04ucGFyc2UoZSkpLmJpZGRlcl9zdGF0dXMsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZS5zMnNDb25maWcuYmlkZGVycy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZGVmYXVsdC5hbGlhc1JlZ2lzdHJ5W2VdIHx8IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmluZGV4T2YoZSkgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGQsIGcsIGUuczJzQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gTChlLCB0LCB1LCBlLnMyc0NvbmZpZyksIGIgPSB2ICYmIEpTT04uc3RyaW5naWZ5KHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAmJiBiICYmIGkoZS5zMnNDb25maWcuZW5kcG9pbnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIHIsIG4sIGksIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gSlNPTi5wYXJzZShlKSwgeihjLCByLCB1KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5hZFVuaXQsIGkgPSBlLmJpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGwuaXNWYWxpZCkodCwgaSwgcikgJiYgbih0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmLmRlZmF1bHQuZW1pdChhLkVWRU5UUy5CSURERVJfRE9ORSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghYyB8fCBjLnN0YXR1cyAmJiAoMCwgcC5kZWZhdWx0KShjLnN0YXR1cywgJ0Vycm9yJykpICYmIG8ubG9nRXJyb3IoJ2Vycm9yIHBhcnNpbmcgcmVzcG9uc2U6ICcsIGMuc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoKSwgZCA9IHQsIGQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcy5kZWZhdWx0LmdldEJpZEFkYXB0ZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnJlZ2lzdGVyU3luY3MgJiYgdC5yZWdpc3RlclN5bmNzKFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgYywgdCwgciwgbiwgZS5zMnNDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZi5kZWZhdWx0Lm9uKGEuRVZFTlRTLkJJRF9XT04sIFYpLCBfKHRoaXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEJpZHM6IGUuY2FsbEJpZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpZGRlckNvZGU6IGUuc2V0QmlkZGVyQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcy5kZWZhdWx0LnJlZ2lzdGVyQmlkQWRhcHRlcihuZXcgRigpLCAncHJlYmlkU2VydmVyJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoODUpLCBpID0gcig3OCkuZ2V0V2VhaywgbyA9IHIoMjcpLCBhID0gcigyMyksIHMgPSByKDg0KSwgdSA9IHIoMTE3KSwgYyA9IHIoMTI1KSwgZCA9IHIoNTApLCBsID0gcig5NyksIGYgPSBjKDUpLCBwID0gYyg2KSwgZyA9IDAsIG0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fbCB8fCAoZS5fbCA9IG5ldyB2KCkpOwogICAgICAgICAgICAgICAgICAgIH0sIHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYSA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0sIGIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZihlLmEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHYucHJvdG90eXBlID0gewogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBiKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhhczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhYih0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBiKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByID8gclsxXSA9IHQgOiB0aGlzLmEucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlbGV0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwKHRoaXMuYSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIH50ICYmIHRoaXMuYS5zcGxpY2UodCwgMSksICEhfnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAoZSwgdCwgciwgbykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGUoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoZSwgYywgdCwgJ19pJyksIGUuX3QgPSB0LCBlLl9pID0gZysrLCBlLl9sID0gdm9pZCAwLCBudWxsICE9IG4gJiYgdShuLCByLCBlW29dLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGMucHJvdG90eXBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gciA/IG0obCh0aGlzLCB0KSkuZGVsZXRlKGUpIDogciAmJiBkKHIsIHRoaXMuX2kpICYmIGRlbGV0ZSByW3RoaXMuX2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSByID8gbShsKHRoaXMsIHQpKS5oYXMoZSkgOiByICYmIGQociwgdGhpcy5faSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZGVmOiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkobyh0KSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IG4gPyBtKGUpLnNldCh0LCByKSA6IG5bZS5faV0gPSByLCBlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdWZzdG9yZTogbQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSByKDI0KSwgbyA9IHIoNjgpLCBhID0gLyIvZywgcyA9IGZ1bmN0aW9uIChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gU3RyaW5nKG8oZSkpLCBzID0gJzwnICsgdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICE9PSByICYmIChzICs9ICcgJyArIHIgKyAnPSInICsgU3RyaW5nKG4pLnJlcGxhY2UoYSwgJyZxdW90OycpICsgJyInKSwgcyArICc+JyArIGkgKyAnPC8nICsgdCArICc+JzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJbZV0gPSB0KHMpLCBuKG4uUCArIG4uRiAqIGkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICcnW2VdKCciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICE9PSB0LnRvTG93ZXJDYXNlKCkgfHwgdC5zcGxpdCgnIicpLmxlbmd0aCA+IDM7CiAgICAgICAgICAgICAgICAgICAgfSksICdTdHJpbmcnLCByKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpOwogICAgICAgICAgICAgICAgbihuLlAsICdBcnJheScsIHsgZmlsbDogcigxNTUpIH0pLCByKDEwNykoJ2ZpbGwnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNCksIGkgPSBNYXRoLmltdWw7CiAgICAgICAgICAgICAgICBuKG4uUyArIG4uRiAqIHIoMjQpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTUgIT0gaSg0Mjk0OTY3Mjk1LCA1KSB8fCAyICE9IGkubGVuZ3RoOwogICAgICAgICAgICAgICAgfSksICdNYXRoJywgewogICAgICAgICAgICAgICAgICAgIGltdWw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gK2UsIG4gPSArdCwgaSA9IDY1NTM1ICYgciwgbyA9IDY1NTM1ICYgbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgfCBpICogbyArICgoNjU1MzUgJiByID4+PiAxNikgKiBvICsgaSAqICg2NTUzNSAmIG4gPj4+IDE2KSA8PCAxNiA+Pj4gMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpOwogICAgICAgICAgICAgICAgbihuLlMsICdOdW1iZXInLCB7IGlzSW50ZWdlcjogcigzMzEpIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDIzKSwgaSA9IE1hdGguZmxvb3I7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhbihlKSAmJiBpc0Zpbml0ZShlKSAmJiBpKGUpID09PSBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSB0ID8gMCAhPT0gZSB8fCAxIC8gZSA9PSAxIC8gdCA6IGUgIT0gZSAmJiB0ICE9IHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgaWYgKHIoMjgpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByKDY0KSwgaSA9IHIoMTgpLCBvID0gcigyNCksIGEgPSByKDE0KSwgcyA9IHIoMjE1KSwgdSA9IHIoMzM0KSwgYyA9IHIoNTMpLCBkID0gcig4NCksIGwgPSByKDc3KSwgZiA9IHIoNDYpLCBwID0gcig4NSksIGcgPSByKDY5KSwgbSA9IHIoMzgpLCB2ID0gcigyMTYpLCBiID0gcigxMDUpLCB5ID0gcig4OSksIGggPSByKDUwKSwgUyA9IHIoOTIpLCBPID0gcigyMyksIF8gPSByKDQ3KSwgRSA9IHIoMTQ0KSwgSSA9IHIoODApLCB3ID0gcigxNjYpLCBBID0gcig2NikuZiwgVCA9IHIoMTQ1KSwgeCA9IHIoNjMpLCBDID0gcigxOSksIFAgPSByKDEyNSksIGogPSByKDEzMCksIFIgPSByKDEzNyksIEQgPSByKDMpLCBrID0gcig4MSksIE4gPSByKDExOSksIE0gPSByKDExOCksIFUgPSByKDE1NSksIEIgPSByKDMzNSksIEwgPSByKDMyKSwgeiA9IHIoOTApLCBWID0gTC5mLCBGID0gei5mLCBxID0gaS5SYW5nZUVycm9yLCBHID0gaS5UeXBlRXJyb3IsIFcgPSBpLlVpbnQ4QXJyYXksIEggPSBBcnJheS5wcm90b3R5cGUsIFkgPSB1LkFycmF5QnVmZmVyLCBLID0gdS5EYXRhVmlldywgSiA9IFAoMCksIFEgPSBQKDIpLCBYID0gUCgzKSwgJCA9IFAoNCksIFogPSBQKDUpLCBlZSA9IFAoNiksIHRlID0gaighMCksIHJlID0gaighMSksIG5lID0gRC52YWx1ZXMsIGllID0gRC5rZXlzLCBvZSA9IEQuZW50cmllcywgYWUgPSBILmxhc3RJbmRleE9mLCBzZSA9IEgucmVkdWNlLCB1ZSA9IEgucmVkdWNlUmlnaHQsIGNlID0gSC5qb2luLCBkZSA9IEguc29ydCwgbGUgPSBILnNsaWNlLCBmZSA9IEgudG9TdHJpbmcsIHBlID0gSC50b0xvY2FsZVN0cmluZywgZ2UgPSBDKCdpdGVyYXRvcicpLCBtZSA9IEMoJ3RvU3RyaW5nVGFnJyksIHZlID0geCgndHlwZWRfY29uc3RydWN0b3InKSwgYmUgPSB4KCdkZWZfY29uc3RydWN0b3InKSwgeWUgPSBzLkNPTlNUUiwgaGUgPSBzLlRZUEVELCBTZSA9IHMuVklFVywgT2UgPSBQKDEsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWUoUihlLCBlW2JlXSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgX2UgPSBvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxID09PSBuZXcgVyhuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgRWUgPSAhIVcgJiYgISFXLnByb3RvdHlwZS5zZXQgJiYgbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVygxKS5zZXQoe30pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgSWUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPCAwIHx8IHIgJSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcSgnV3Jvbmcgb2Zmc2V0IScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPKGUpICYmIGhlIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEcoZSArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIEFlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTyhlKSB8fCAhKHZlIGluIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRygnSXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFRlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ZShSKGUsIGVbYmVdKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHhlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gdC5sZW5ndGgsIGkgPSBBZShlLCBuKTsgbiA+IHI7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtyXSA9IHRbcisrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBDZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWKGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFBlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuLCBpLCBvLCBhLCBzID0gXyhlKSwgdSA9IGFyZ3VtZW50cy5sZW5ndGgsIGQgPSB1ID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCwgbCA9IHZvaWQgMCAhPT0gZCwgZiA9IFQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBmICYmICFFKGYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gZi5jYWxsKHMpLCBuID0gW10sIHQgPSAwOyAhKG8gPSBhLm5leHQoKSkuZG9uZTsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChvLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgJiYgdSA+IDIgJiYgKGQgPSBjKGQsIGFyZ3VtZW50c1syXSwgMikpLCB0ID0gMCwgciA9IG0ocy5sZW5ndGgpLCBpID0gQWUodGhpcywgcik7IHIgPiB0OyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW3RdID0gbCA/IGQoc1t0XSwgdCkgOiBzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIHQgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gQWUodGhpcywgdCk7IHQgPiBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbZV0gPSBhcmd1bWVudHNbZSsrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBSZSA9ICEhVyAmJiBvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlLmNhbGwobmV3IFcoMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgRGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGUuYXBwbHkoUmUgPyBsZS5jYWxsKHdlKHRoaXMpKSA6IHdlKHRoaXMpLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBrZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIuY2FsbCh3ZSh0aGlzKSwgZSwgdCwgYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZXJ5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKHdlKHRoaXMpLCBlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVS5hcHBseSh3ZSh0aGlzKSwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlKHRoaXMsIFEod2UodGhpcyksIGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWih3ZSh0aGlzKSwgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRJbmRleDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWUod2UodGhpcyksIGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEood2UodGhpcyksIGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZSh3ZSh0aGlzKSwgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZSh3ZSh0aGlzKSwgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW46IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlLmFwcGx5KHdlKHRoaXMpLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZS5hcHBseSh3ZSh0aGlzKSwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9lKHdlKHRoaXMpLCBlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZS5hcHBseSh3ZSh0aGlzKSwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VSaWdodDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWUuYXBwbHkod2UodGhpcyksIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUsIHQgPSB3ZSh0aGlzKS5sZW5ndGgsIHIgPSBNYXRoLmZsb29yKHQgLyAyKSwgbiA9IDA7IG4gPCByOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdGhpc1tuXSwgdGhpc1tuKytdID0gdGhpc1stLXRdLCB0aGlzW3RdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWCh3ZSh0aGlzKSwgZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlLmNhbGwod2UodGhpcyksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmFycmF5OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gd2UodGhpcyksIG4gPSByLmxlbmd0aCwgaSA9IGIoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAoUihyLCByW2JlXSkpKHIuYnVmZmVyLCByLmJ5dGVPZmZzZXQgKyBpICogci5CWVRFU19QRVJfRUxFTUVOVCwgbSgodm9pZCAwID09PSB0ID8gbiA6IGIodCwgbikpIC0gaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBOZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGUodGhpcywgbGUuY2FsbCh3ZSh0aGlzKSwgZSwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBNZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gSWUoYXJndW1lbnRzWzFdLCAxKSwgciA9IHRoaXMubGVuZ3RoLCBuID0gXyhlKSwgaSA9IG0obi5sZW5ndGgpLCBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgdCA+IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBxKCdXcm9uZyBsZW5ndGghJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgbyA8IGk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t0ICsgb10gPSBuW28rK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFVlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZS5jYWxsKHdlKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGllLmNhbGwod2UodGhpcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZS5jYWxsKHdlKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgQmUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8oZSkgJiYgZVtoZV0gJiYgJ3N5bWJvbCcgIT0gdHlwZW9mIHQgJiYgdCBpbiBlICYmIFN0cmluZygrdCkgPT0gU3RyaW5nKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBMZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmUoZSwgdCA9IHkodCwgITApKSA/IGwoMiwgZVt0XSkgOiBGKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB6ZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShCZShlLCB0ID0geSh0LCAhMCkpICYmIE8ocikgJiYgaChyLCAndmFsdWUnKSkgfHwgaChyLCAnZ2V0JykgfHwgaChyLCAnc2V0JykgfHwgci5jb25maWd1cmFibGUgfHwgaChyLCAnd3JpdGFibGUnKSAmJiAhci53cml0YWJsZSB8fCBoKHIsICdlbnVtZXJhYmxlJykgJiYgIXIuZW51bWVyYWJsZSA/IFYoZSwgdCwgcikgOiAoZVt0XSA9IHIudmFsdWUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHllIHx8ICh6LmYgPSBMZSwgTC5mID0gemUpLCBhKGEuUyArIGEuRiAqICF5ZSwgJ09iamVjdCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBMZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHk6IHplCiAgICAgICAgICAgICAgICAgICAgfSksIG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmZS5jYWxsKHt9KTsKICAgICAgICAgICAgICAgICAgICB9KSAmJiAoZmUgPSBwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIFZlID0gcCh7fSwga2UpOwogICAgICAgICAgICAgICAgICAgIHAoVmUsIFVlKSwgZihWZSwgZ2UsIFVlLnZhbHVlcyksIHAoVmUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2U6IE5lLAogICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IE1lLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZzogZmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvTG9jYWxlU3RyaW5nOiBEZQogICAgICAgICAgICAgICAgICAgIH0pLCBDZShWZSwgJ2J1ZmZlcicsICdiJyksIENlKFZlLCAnYnl0ZU9mZnNldCcsICdvJyksIENlKFZlLCAnYnl0ZUxlbmd0aCcsICdsJyksIENlKFZlLCAnbGVuZ3RoJywgJ2UnKSwgVihWZSwgbWUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1toZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIHIsIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlICsgKCh1ID0gISF1KSA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheScsIGwgPSAnZ2V0JyArIGUsIHAgPSAnc2V0JyArIGUsIGcgPSBpW2NdLCBiID0gZyB8fCB7fSwgeSA9IGcgJiYgdyhnKSwgaCA9ICFnIHx8ICFzLkFCViwgXyA9IHt9LCBFID0gZyAmJiBnLnByb3RvdHlwZSwgVCA9IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVihlLCByLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLl9kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnZbbF0ociAqIHQgKyBuLm8sIF9lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odGhpcywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5fZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChuID0gKG4gPSBNYXRoLnJvdW5kKG4pKSA8IDAgPyAwIDogbiA+IDI1NSA/IDI1NSA6IDI1NSAmIG4pLCBpLnZbcF0ociAqIHQgKyBpLm8sIG4sIF9lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odGhpcywgciwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBoID8gKGcgPSByKGZ1bmN0aW9uIChlLCByLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGUsIGcsIGMsICdfZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGEsIHMsIHUsIGwgPSAwLCBwID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEociBpbnN0YW5jZW9mIFkgfHwgJ0FycmF5QnVmZmVyJyA9PSAodSA9IFMocikpIHx8ICdTaGFyZWRBcnJheUJ1ZmZlcicgPT0gdSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlIGluIHIgPyB4ZShnLCByKSA6IFBlLmNhbGwoZywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSByLCBwID0gSWUobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSByLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAlIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHEoJ1dyb25nIGxlbmd0aCEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPSBiIC0gcCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBxKCdXcm9uZyBsZW5ndGghJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChhID0gbShpKSAqIHQpICsgcCA+IGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcSgnV3JvbmcgbGVuZ3RoIScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gYSAvIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB2KHIpLCBvID0gbmV3IFkoYSA9IHMgKiB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZihlLCAnX2QnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY6IG5ldyBLKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IGwgPCBzOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQoZSwgbCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIEUgPSBnLnByb3RvdHlwZSA9IEkoVmUpLCBmKEUsICdjb25zdHJ1Y3RvcicsIGcpKSA6IG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZygxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZygtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIE4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBnKCksIG5ldyBnKG51bGwpLCBuZXcgZygxLjUpLCBuZXcgZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApIHx8IChnID0gcihmdW5jdGlvbiAoZSwgciwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCBnLCBjKSwgTyhyKSA/IHIgaW5zdGFuY2VvZiBZIHx8ICdBcnJheUJ1ZmZlcicgPT0gKG8gPSBTKHIpKSB8fCAnU2hhcmVkQXJyYXlCdWZmZXInID09IG8gPyB2b2lkIDAgIT09IGkgPyBuZXcgYihyLCBJZShuLCB0KSwgaSkgOiB2b2lkIDAgIT09IG4gPyBuZXcgYihyLCBJZShuLCB0KSkgOiBuZXcgYihyKSA6IGhlIGluIHIgPyB4ZShnLCByKSA6IFBlLmNhbGwoZywgcikgOiBuZXcgYih2KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEooeSAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gQShiKS5jb25jYXQoQSh5KSkgOiBBKGIpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSBpbiBnIHx8IGYoZywgZSwgYltlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnLnByb3RvdHlwZSA9IEUsIG4gfHwgKEUuY29uc3RydWN0b3IgPSBnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gRVtnZV0sIEMgPSAhIXggJiYgKCd2YWx1ZXMnID09IHgubmFtZSB8fCBudWxsID09IHgubmFtZSksIFAgPSBVZS52YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGYoZywgdmUsICEwKSwgZihFLCBoZSwgYyksIGYoRSwgU2UsICEwKSwgZihFLCBiZSwgZyksICh1ID8gbmV3IGcoMSlbbWVdID09IGMgOiBtZSBpbiBFKSB8fCBWKEUsIG1lLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIF9bY10gPSBnLCBhKGEuRyArIGEuVyArIGEuRiAqIChnICE9IGIpLCBfKSwgYShhLlMsIGMsIHsgQllURVNfUEVSX0VMRU1FTlQ6IHQgfSksIGEoYS5TICsgYS5GICogbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm9mLmNhbGwoZywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBQZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mOiBqZQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgJ0JZVEVTX1BFUl9FTEVNRU5UJyBpbiBFIHx8IGYoRSwgJ0JZVEVTX1BFUl9FTEVNRU5UJywgdCksIGEoYS5QLCBjLCBrZSksIE0oYyksIGEoYS5QICsgYS5GICogRWUsIGMsIHsgc2V0OiBNZSB9KSwgYShhLlAgKyBhLkYgKiAhQywgYywgVWUpLCBuIHx8IEUudG9TdHJpbmcgPT0gZmUgfHwgKEUudG9TdHJpbmcgPSBmZSksIGEoYS5QICsgYS5GICogbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgZygxKS5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgYywgeyBzbGljZTogTmUgfSksIGEoYS5QICsgYS5GICogKG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0udG9Mb2NhbGVTdHJpbmcoKSAhPSBuZXcgZyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS50b0xvY2FsZVN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCAhbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLnRvTG9jYWxlU3RyaW5nLmNhbGwoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgYywgeyB0b0xvY2FsZVN0cmluZzogRGUgfSksIGtbY10gPSBDID8geCA6IFAsIG4gfHwgQyB8fCBmKEUsIGdlLCBQKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxOCksIGkgPSByKDI4KSwgbyA9IHIoNjQpLCBhID0gcigyMTUpLCBzID0gcig0NiksIHUgPSByKDg1KSwgYyA9IHIoMjQpLCBkID0gcig4NCksIGwgPSByKDY5KSwgZiA9IHIoMzgpLCBwID0gcigyMTYpLCBnID0gcig2NikuZiwgbSA9IHIoMzIpLmYsIHYgPSByKDE1NSksIGIgPSByKDc5KSwgeSA9IG4uQXJyYXlCdWZmZXIsIGggPSBuLkRhdGFWaWV3LCBTID0gbi5NYXRoLCBPID0gbi5SYW5nZUVycm9yLCBfID0gbi5JbmZpbml0eSwgRSA9IHksIEkgPSBTLmFicywgdyA9IFMucG93LCBBID0gUy5mbG9vciwgVCA9IFMubG9nLCB4ID0gUy5MTjIsIEMgPSBpID8gJ19iJyA6ICdidWZmZXInLCBQID0gaSA/ICdfbCcgOiAnYnl0ZUxlbmd0aCcsIGogPSBpID8gJ19vJyA6ICdieXRlT2Zmc2V0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvLCBhID0gbmV3IEFycmF5KHIpLCBzID0gOCAqIHIgLSB0IC0gMSwgdSA9ICgxIDw8IHMpIC0gMSwgYyA9IHUgPj4gMSwgZCA9IDIzID09PSB0ID8gdygyLCAtMjQpIC0gdygyLCAtNzcpIDogMCwgbCA9IDAsIGYgPSBlIDwgMCB8fCAwID09PSBlICYmIDEgLyBlIDwgMCA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgIGZvciAoKGUgPSBJKGUpKSAhPSBlIHx8IGUgPT09IF8gPyAoaSA9IGUgIT0gZSA/IDEgOiAwLCBuID0gdSkgOiAobiA9IEEoVChlKSAvIHgpLCBlICogKG8gPSB3KDIsIC1uKSkgPCAxICYmIChuLS0sIG8gKj0gMiksIChlICs9IG4gKyBjID49IDEgPyBkIC8gbyA6IGQgKiB3KDIsIDEgLSBjKSkgKiBvID49IDIgJiYgKG4rKywgbyAvPSAyKSwgbiArIGMgPj0gdSA/IChpID0gMCwgbiA9IHUpIDogbiArIGMgPj0gMSA/IChpID0gKGUgKiBvIC0gMSkgKiB3KDIsIHQpLCBuICs9IGMpIDogKGkgPSBlICogdygyLCBjIC0gMSkgKiB3KDIsIHQpLCBuID0gMCkpOyB0ID49IDg7IGFbbCsrXSA9IDI1NSAmIGksIGkgLz0gMjU2LCB0IC09IDgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gbiA8PCB0IHwgaSwgcyArPSB0OyBzID4gMDsgYVtsKytdID0gMjU1ICYgbiwgbiAvPSAyNTYsIHMgLT0gOCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVstLWxdIHw9IDEyOCAqIGYsIGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IDggKiByIC0gdCAtIDEsIG8gPSAoMSA8PCBpKSAtIDEsIGEgPSBvID4+IDEsIHMgPSBpIC0gNywgdSA9IHIgLSAxLCBjID0gZVt1LS1dLCBkID0gMTI3ICYgYzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPj49IDc7IHMgPiAwOyBkID0gMjU2ICogZCArIGVbdV0sIHUtLSwgcyAtPSA4KSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAobiA9IGQgJiAoMSA8PCAtcykgLSAxLCBkID4+PSAtcywgcyArPSB0OyBzID4gMDsgbiA9IDI1NiAqIG4gKyBlW3VdLCB1LS0sIHMgLT0gOCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gMSAtIGE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID8gTmFOIDogYyA/IC1fIDogXzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuICs9IHcoMiwgdCksIGQgLT0gYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjID8gLTEgOiAxKSAqIG4gKiB3KDIsIGQgLSB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzNdIDw8IDI0IHwgZVsyXSA8PCAxNiB8IGVbMV0gPDwgOCB8IGVbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzI1NSAmIGVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgZSwKICAgICAgICAgICAgICAgICAgICAgICAgZSA+PiA4ICYgMjU1CiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgZSA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgZSA+PiAyNCAmIDI1NQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUihlLCA1MiwgOCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUihlLCAyMywgNCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBtKGUucHJvdG90eXBlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFYoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gcCgrcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyB0ID4gZVtQXSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPKCdXcm9uZyBpbmRleCEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlW0NdLl9iLCBhID0gaSArIGVbal0sIHMgPSBvLnNsaWNlKGEsIGEgKyB0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHMgOiBzLnJldmVyc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYoZSwgdCwgciwgbiwgaSwgbykgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gcCgrcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgKyB0ID4gZVtQXSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPKCdXcm9uZyBpbmRleCEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IGVbQ10uX2IsIHUgPSBhICsgZVtqXSwgYyA9IG4oK2kpLCBkID0gMDsgZCA8IHQ7IGQrKykgewogICAgICAgICAgICAgICAgICAgICAgICBzW3UgKyBkXSA9IGNbbyA/IGQgOiB0IC0gZCAtIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhLkFCVikgewogICAgICAgICAgICAgICAgICAgIGlmICghYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCAhYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgeSgtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IGMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB5KCksIG5ldyB5KDEuNSksIG5ldyB5KE5hTiksICdBcnJheUJ1ZmZlcicgIT0geS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBxLCBHID0gKHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh0aGlzLCB5KSwgbmV3IEUocChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucHJvdG90eXBlID0gRS5wcm90b3R5cGUsIFcgPSBnKEUpLCBIID0gMDsgVy5sZW5ndGggPiBIOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHEgPSBXW0grK10pIGluIHkgfHwgcyh5LCBxLCBFW3FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvIHx8IChHLmNvbnN0cnVjdG9yID0geSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBZID0gbmV3IGgobmV3IHkoMikpLCBLID0gaC5wcm90b3R5cGUuc2V0SW50ODsKICAgICAgICAgICAgICAgICAgICBZLnNldEludDgoMCwgMjE0NzQ4MzY0OCksIFkuc2V0SW50OCgxLCAyMTQ3NDgzNjQ5KSwgIVkuZ2V0SW50OCgwKSAmJiBZLmdldEludDgoMSkgfHwgdShoLnByb3RvdHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnQ4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSy5jYWxsKHRoaXMsIGUsIHQgPDwgMjQgPj4gMjQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXRVaW50ODogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsuY2FsbCh0aGlzLCBlLCB0IDw8IDI0ID4+IDI0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQodGhpcywgeSwgJ0FycmF5QnVmZmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYiA9IHYuY2FsbChuZXcgQXJyYXkodCksIDApLCB0aGlzW1BdID0gdDsKICAgICAgICAgICAgICAgICAgICB9LCBoID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZCh0aGlzLCBoLCAnRGF0YVZpZXcnKSwgZChlLCB5LCAnRGF0YVZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW1BdLCBpID0gbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPKCdXcm9uZyBvZmZzZXQhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAociA9IHZvaWQgMCA9PT0gciA/IG4gLSBpIDogZihyKSkgPiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPKCdXcm9uZyBsZW5ndGghJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tDXSA9IGUsIHRoaXNbal0gPSBpLCB0aGlzW1BdID0gcjsKICAgICAgICAgICAgICAgICAgICB9LCBpICYmICh6KHksICdieXRlTGVuZ3RoJywgJ19sJyksIHooaCwgJ2J1ZmZlcicsICdfYicpLCB6KGgsICdieXRlTGVuZ3RoJywgJ19sJyksIHooaCwgJ2J5dGVPZmZzZXQnLCAnX28nKSksIHUoaC5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50ODogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWKHRoaXMsIDEsIGUpWzBdIDw8IDI0ID4+IDI0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRVaW50ODogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWKHRoaXMsIDEsIGUpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRJbnQxNjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gVih0aGlzLCAyLCBlLCBhcmd1bWVudHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0WzFdIDw8IDggfCB0WzBdKSA8PCAxNiA+PiAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWludDE2OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBWKHRoaXMsIDIsIGUsIGFyZ3VtZW50c1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFsxXSA8PCA4IHwgdFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50MzI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayhWKHRoaXMsIDQsIGUsIGFyZ3VtZW50c1sxXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayhWKHRoaXMsIDQsIGUsIGFyZ3VtZW50c1sxXSkpID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoVih0aGlzLCA0LCBlLCBhcmd1bWVudHNbMV0pLCAyMywgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChWKHRoaXMsIDgsIGUsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50ODogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYodGhpcywgMSwgZSwgTiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFVpbnQ4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRih0aGlzLCAxLCBlLCBOLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50MTY6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKHRoaXMsIDIsIGUsIE0sIHQsIGFyZ3VtZW50c1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFVpbnQxNjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYodGhpcywgMiwgZSwgTSwgdCwgYXJndW1lbnRzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50MzI6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKHRoaXMsIDQsIGUsIFUsIHQsIGFyZ3VtZW50c1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFVpbnQzMjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYodGhpcywgNCwgZSwgVSwgdCwgYXJndW1lbnRzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYodGhpcywgNCwgZSwgTCwgdCwgYXJndW1lbnRzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYodGhpcywgOCwgZSwgQiwgdCwgYXJndW1lbnRzWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYih5LCAnQXJyYXlCdWZmZXInKSwgYihoLCAnRGF0YVZpZXcnKSwgcyhoLnByb3RvdHlwZSwgYS5WSUVXLCAhMCksIHQuQXJyYXlCdWZmZXIgPSB5LCB0LkRhdGFWaWV3ID0gaDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBuID0gcig0NyksIGkgPSByKDEwNSksIG8gPSByKDM4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IFtdLmNvcHlXaXRoaW4gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4odGhpcyksIGEgPSBvKHIubGVuZ3RoKSwgcyA9IGkoZSwgYSksIHUgPSBpKHQsIGEpLCBjID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDAsIGQgPSBNYXRoLm1pbigodm9pZCAwID09PSBjID8gYSA6IGkoYywgYSkpIC0gdSwgYSAtIHMpLCBsID0gMTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHUgPCBzICYmIHMgPCB1ICsgZCAmJiAobCA9IC0xLCB1ICs9IGQgLSAxLCBzICs9IGQgLSAxKTsgZC0tID4gMDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdSBpbiByID8gcltzXSA9IHJbdV0gOiBkZWxldGUgcltzXSwgcyArPSBsLCB1ICs9IGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gQXJyYXkuaXNBcnJheSh0KSA/IFtdIDoge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdFtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgcltuXSA9IGkgJiYgJ29iamVjdCcgPT0gdHlwZW9mIGkgPyBlKGkpIDogaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0LCByLCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gdC5zcGxpdCA/IHQuc3BsaXQoJy4nKSA6IHQsIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSA/IGVbdFtuXV0gOiBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gaSA/IHIgOiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgci5yKHQpLCByLmQodCwgJ2RlZmF1bHQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIucih0KSwgdC5kZWZhdWx0ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB0LnNwbGl0ICYmICh0ID0gdC5zcGxpdCgnLicpKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCBpID0gMCwgbyA9IHQubGVuZ3RoLCBhID0gZTsgaSA8IG87ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICBuID0gYVt0W2ldXSwgYSA9IGFbdFtpXV0gPSBpID09PSBvIC0gMSA/IHIgOiBudWxsICE9IG4gPyBuIDogIX50W2kgKyAxXS5pbmRleE9mKCcuJykgJiYgK3RbaSArIDFdID4gLTEgPyBbXSA6IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBzLlNZTkMgPSAxLCBzLkFTWU5DID0gMiwgcy5RVUVVRSA9IDQ7CiAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICAgICAgICAgICAgICB1c2VQcm94eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5OiAwCiAgICAgICAgICAgICAgICAgICAgfSksIG4gPSBuZXcgV2Vha01hcCgpLCBpID0gJzIsMSwwJyA9PT0gWzFdLnJlZHVjZShmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfSwgMikudG9TdHJpbmcoKSA/IEFycmF5LnByb3RvdHlwZS5yZWR1Y2UgOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiA9IE9iamVjdCh0aGlzKSwgaSA9IG4ubGVuZ3RoID4+PiAwLCBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IG8gPCBpICYmICEobyBpbiBuKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbltvKytdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBvIDwgaTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gaW4gbiAmJiAociA9IGUociwgbltvXSwgbywgbikpLCBvKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLCB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBhID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmNhbGwobyhhcmd1bWVudHMsIDEpLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3JdID0gdFtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHUgPSB7fSwgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSA/IGcuY2FsbChudWxsLCAnc3luYycsIGUsIHQpIDogJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCA/IGcuYXBwbHkobnVsbCwgYXJndW1lbnRzKSA6ICdvYmplY3QnID09IHR5cGVvZiBlID8gbC5hcHBseShudWxsLCBhcmd1bWVudHMpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSB0ICYmICh0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSksIG4gPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge30sIG8gPSBbJ2NvbnN0cnVjdG9yJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ID0gdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgnZnVuY3Rpb24nICE9IHR5cGVvZiBlW3RdIHx8IC0xICE9PSBvLmluZGV4T2YodCkgfHwgdC5tYXRjaCgvXl8vKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5zcGxpdCgnOicpLCBvID0gblswXSwgYSA9IG5bMV0gfHwgJ3N5bmMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaVtvXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGVbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbb10gPSBlW29dID0gZyhhLCBzLCByID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKG4gJiYgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBBcnJheS5pc0FycmF5KGUpID8gZSA6IGUuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY2FsbChyLCBmdW5jdGlvbiAobiwgaSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuW2ldLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSB8fCAobyA9PT0gci5sZW5ndGggLSAxID8gKHQgfHwgYy5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzIHx8IGNvbnNvbGUud2FybignZnVuLWhvb2tzOiByZWZlcmVuY2VkIFwnJyArIGUgKyAnXCcgYnV0IGl0IHdhcyBuZXZlciBjcmVhdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbltpXSA9IHAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2ldID0gZSwgcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogbltpXSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdLCByID0gW10sIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZTogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuY2FsbCh0aGlzLCB0LCAnYmVmb3JlJywgZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuY2FsbCh0aGlzLCByLCAnYWZ0ZXInLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEhvb2tzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuY29uY2F0KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUpLmV2ZXJ5KGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbcl0gPT09IGVbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBhKG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG9va3MoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGw6IGZ1bmN0aW9uIChuLCBvLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IG4sIGkgPSBhLCBhKHQsIHIpLCBlICYmIGUobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2V0KG8uYWZ0ZXIsIHMpLCBvOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIG4sIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2s6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogYSB8fCAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmluZGV4T2Yocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICE9PSBuICYmIChlLnNwbGljZShuLCAxKSwgaSh0LCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnB1c2gocyksIGUuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByaW9yaXR5IC0gZS5wcmlvcml0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpKHQsIHIpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcociwgaSwgdSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGkuYWZ0ZXIgJiYgbi5nZXQoaS5hZnRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC50eXBlICE9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ2Z1bi1ob29rczogcmVjcmVhdGVkIGhvb2thYmxlIHdpdGggZGlmZmVyZW50IHR5cGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwsIGcsIG0gPSB1ID8gZih1KSA6IHAoKSwgdiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtW3RdIHx8IFJlZmxlY3QuZ2V0LmFwcGx5KFJlZmxlY3QsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgfHwgYy5wdXNoKGIpLCBlLnVzZVByb3h5ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFByb3h5ICYmIFByb3h5LnJldm9jYWJsZSA/IGcgPSBuZXcgUHJveHkoaSwgdikgOiBhKGcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5hcHBseSA/IHYuYXBwbHkoaSwgdGhpcywgbyhhcmd1bWVudHMpKSA6IGkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSksIG4uZ2V0KGcuYWZ0ZXIpLmluc3RhbGwociwgZywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxlbmd0aCB8fCB0Lmxlbmd0aCA/IChlLmZvckVhY2goYSksIG4gPSBpLnB1c2godm9pZCAwKSAtIDEsIHQuZm9yRWFjaChhKSwgbCA9IGZ1bmN0aW9uIChlLCB0LCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIHUgPSAwLCBjID0gJ2FzeW5jJyA9PT0gciAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBhW2EubGVuZ3RoIC0gMV0gJiYgYS5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5bmMnID09PSByID8gcyA9IGUgOiBjICYmIGMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpW3VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG8oYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmJhaWwgPSBkLCBuLnVuc2hpZnQobCksIGlbdSsrXS5hcHBseSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3luYycgPT09IHIgPyBzID0gZSA6IGMgJiYgYy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVtuXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycgPT09IHIgJiYgYyAmJiAoZGVsZXRlIGwuYmFpbCwgbi5wdXNoKGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlLmFwcGx5KHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3luYycgPT09IHIgJiYgbChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLmFwcGx5KG51bGwsIGEpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBsID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKGUuaG9vayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXQgJiYgKCdzeW5jJyAhPT0gciB8fCBlLnJlYWR5ICYgcy5TWU5DKSAmJiAoJ2FzeW5jJyAhPT0gciB8fCBlLnJlYWR5ICYgcy5BU1lOQykgPyAnc3luYycgIT09IHIgJiYgZS5yZWFkeSAmIHMuUVVFVUUgPyB2LmFwcGx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuYXBwbHkoZVsxXSwgZVsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdi5hcHBseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnZnVuLWhvb2tzOiBob29rZWQgZnVuY3Rpb24gbm90IHJlYWR5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB2LmFwcGx5ID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBhKHt9LCByLCBlKSkucmVhZHkgPyBkLnJlYWR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gITAsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0OyB0ID0gZS5zaGlmdCgpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfShjKTsKICAgICAgICAgICAgICAgICAgICB9IDogdCA9ICEwLCBkLmdldCA9IGYsIGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZGV0ZWN0UmVmZXJlciA9IGksIHQuZ2V0UmVmZXJlckluZm8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cJ2Nhbm9uaWNhbFwnXScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvLCBhID0gW10sIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIHUgPSAhMSwgYyA9IDAsIGQgPSAhMSwgbCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHIsIHAgPSBsLCBnID0gdm9pZCAwLCBtID0gITEsIHYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9ICExLCByID0gciA/IHIucGFyZW50IDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHIubG9jYXRpb24uaHJlZiB8fCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBmLmNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdiA9IGIuc291cmNlVXJsLCBkID0gITAsIHIgPT09IGUudG9wICYmICh1ID0gITApLCBiLmNhbm9uaWNhbFVybCAmJiAobyA9IGIuY2Fub25pY2FsVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG4ubG9nV2FybikoJ1RyeWluZyB0byBhY2Nlc3MgY3Jvc3MgZG9tYWluIGlmcmFtZS4gQ29udGludWluZyB3aXRob3V0IHJlZmVycmVyIGFuZCBsb2NhdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBmLmRvY3VtZW50LnJlZmVycmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAmJiAodiA9IHksIHIgPT09IGUudG9wICYmICh1ID0gITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2ICYmIHMgJiYgc1tjIC0gMV0gJiYgKHYgPSBzW2MgLSAxXSksIHYgJiYgIWQgJiYgKGkgPSB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnICYmIChpID0gdiA9IGcsIGQgPSAhMSwgciA9PT0gZS50b3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0KHIuZG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICYmIChvID0gaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY29udGV4dCAmJiByLmNvbnRleHQuc291cmNlVXJsICYmIChsID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHYpLCBjKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHIgIT09IGUudG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucmV2ZXJzZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVyOiBpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGVkVG9wOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbXA6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1JZnJhbWVzOiBjIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsVXJsOiBvIHx8IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG8gPSBpKHdpbmRvdyk7CiAgICAgICAgICAgICAgICB0LmdldFJlZmVyZXJJbmZvID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LlMyU19WRU5ET1JTID0gdm9pZCAwOwogICAgICAgICAgICAgICAgdC5TMlNfVkVORE9SUyA9IHsKICAgICAgICAgICAgICAgICAgICBhcHBuZXh1czogewogICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyOiAncHJlYmlkU2VydmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiAnaHR0cHM6Ly9wcmViaWQuYWRueHMuY29tL3Bicy92MS9vcGVucnRiMi9hdWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgc3luY0VuZHBvaW50OiAnaHR0cHM6Ly9wcmViaWQuYWRueHMuY29tL3Bicy92MS9jb29raWVfc3luYycsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJ1Ymljb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcjogJ3ByZWJpZFNlcnZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludDogJ2h0dHBzOi8vcHJlYmlkLXNlcnZlci5ydWJpY29ucHJvamVjdC5jb20vb3BlbnJ0YjIvYXVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNFbmRwb2ludDogJ2h0dHBzOi8vcHJlYmlkLXNlcnZlci5ydWJpY29ucHJvamVjdC5jb20vY29va2llX3N5bmMnLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiA1MDAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQucnVuUHJlYmlkUXVldWUgPSBSLCB0LnByZWJpZE1vZHVsZSA9IHZvaWQgMCwgcigzNDMpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEwMSksIGkgPSByKDE0NiksIG8gPSByKDI1KSwgYSA9IFMocigyOSkpLCBzID0gUyhyKDg2KSksIHUgPSByKDU4KSwgYyA9IHIoMjEpLCBkID0gcigyMCksIGwgPSByKDgpLCBmID0gUyhyKDk0KSksIHAgPSBTKHIoMzQpKSwgZyA9IHIoMTIpLCBtID0gcigxNSksIHYgPSByKDUyKSwgYiA9IHIoNTkpLCB5ID0gUyhyKDEwKSksIGggPSByKDc0KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBPID0gKDAsIG4uZ2V0R2xvYmFsKSgpLCBfID0geS5kZWZhdWx0Lk1PRFVMRVMsIEUgPSBfLkdFT0xPQ0FUSU9OLCBJID0gXy5QUkVCSURfSEVBREVSX0JJRERJTkcsIHcgPSBfLlZJREVPLCBBID0gXy5HT09HTEVfUFVCTElTSEVSX1RBRywgVCA9IHkuZGVmYXVsdC5FVkVOVFMsIHggPSBULkhFQURFUl9CSURESU5HX1JFUVVFU1QsIEMgPSBULkhFQURFUl9CSURESU5HX1JFU1BPTlNFLCBQID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICgwLCB1LnVybFF1ZXJ5QXNPYmplY3QpKCksIHQgPSAhMSwgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbiwgbyA9ICgwLCBwLmRlZmF1bHQpKGksICdwYXJhbXMuY3VzdF9wYXJhbXMnKSB8fCB7fSwgcyA9IHQuY29kZSArICctLScuY29uY2F0KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5iYkxvZ2dlci5sb2dJbmZvKCdBcHBseWluZyBWaWRlbyBwYXJhbXMgZm9yIHVuaXQgY29kZScsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBPLmdldEFkc2VydmVyVGFyZ2V0aW5nRm9yQWRVbml0Q29kZShzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvclRhcmdldGluZzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiB7IHZpZGVvOiB0LmdldFZpZGVvU3BlYyhyKSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMgPSAoMCwgcC5kZWZhdWx0KSh1LCAnaGJfYmlkZGVyJyksIGQgPSAoMCwgcC5kZWZhdWx0KSh1LCAnaGJfY2FjaGVfaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgZCAmJiAodSA9ICgwLCBhLmRlZmF1bHQpKHt9LCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gKDAsIG0uZ2V0Q29uZmlnKSgncHJlYmlkLmNhY2hlVXJsQ29uZmlncy5iaWRkZXJzJyksIG4gPSAoMCwgbS5nZXRDb25maWcpKCdwcmViaWQuY2FjaGVVcmxDb25maWdzLnByZWZpeCcpLCBpID0gKDAsIGEuZGVmYXVsdCkoe30sIHJbZV0gfHwge30sIHIuZGVmYXVsdCwgeyB2YWx1ZTogdCB9KSwgbyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGksIHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGlbc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvWycnLmNvbmNhdChuKS5jb25jYXQocyldID0gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYywgZCksIHUpKSwgKDAsIGYuZGVmYXVsdCkoaSwgJ3BhcmFtcy5jdXN0X3BhcmFtcycsICgwLCBhLmRlZmF1bHQpKHUsIG8pKSwgZSh0LCByLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9ICgwLCBzLmRlZmF1bHQpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zaXplcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgIT0gdHlwZW9mIGUgJiYgci5pbmRleE9mKGUuam9pbigneCcpKSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHkoZSksIHIgPSBlLmNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hbGxvd2VkVHlwZXMuYmFubmVyICYmICgwLCBmLmRlZmF1bHQpKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycsIHQpLCBlLmFsbG93ZWRUeXBlcy5uYXRpdmUgJiYgKCgwLCBmLmRlZmF1bHQpKGUsICdtZWRpYVR5cGVzLm5hdGl2ZS5zZW5kVGFyZ2V0aW5nS2V5cycsICExKSwgKDAsIGYuZGVmYXVsdCkoZSwgJ21lZGlhVHlwZXMubmF0aXZlLmltYWdlLnJlcXVpcmVkJywgITApLCAoMCwgZi5kZWZhdWx0KShlLCAnbWVkaWFUeXBlcy5uYXRpdmUuaW1hZ2UuYXNwZWN0X3JhdGlvcycsIFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvX3dpZHRoOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb19oZWlnaHQ6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl93aWR0aDogNDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5faGVpZ2h0OiAzMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSksICgwLCBmLmRlZmF1bHQpKGUsICdtZWRpYVR5cGVzLm5hdGl2ZS50aXRsZS5yZXF1aXJlZCcsICEwKSwgKDAsIGYuZGVmYXVsdCkoZSwgJ21lZGlhVHlwZXMubmF0aXZlLnRpdGxlLmxlbicsIDE0MCksICgwLCBmLmRlZmF1bHQpKGUsICdtZWRpYVR5cGVzLm5hdGl2ZS5zcG9uc29yZWRCeS5yZXF1aXJlZCcsICEwKSwgKDAsIGYuZGVmYXVsdCkoZSwgJ21lZGlhVHlwZXMubmF0aXZlLmNsaWNrVXJsLnJlcXVpcmVkJywgITApLCAoMCwgZi5kZWZhdWx0KShlLCAnbWVkaWFUeXBlcy5uYXRpdmUuYm9keS5yZXF1aXJlZCcsICExKSksIChlLmFsbG93ZWRUeXBlcy52aWRlbyB8fCBlLmlzVmlkZW8pICYmICgoMCwgZi5kZWZhdWx0KShlLCAnbWVkaWFUeXBlcy52aWRlbycsICgwLCBhLmRlZmF1bHQpKCgwLCBwLmRlZmF1bHQpKGUsICdtZWRpYVR5cGVzLnZpZGVvJykgfHwge30sIGUuZ2V0TGF0ZXN0VmlkZW9TcGVjKCkpKSwgciArPSAnLS0nLmNvbmNhdChlLmdldFZpZGVvU3BlY0luZGV4KCkpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlczogZS5tZWRpYVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IGUuYmlkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEFueTogZS5sYWJlbEFueSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEFsbDogZS5sYWJlbEFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ucXVlLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uc2V0Q29uZmlnKCgwLCBhLmRlZmF1bHQpKHt9LCB7IGRlYnVnOiAndHJ1ZScgPT09IGUucGJqc19kZWJ1ZyB9LCB0LnBianNDb25maWcpKSwgdC5iaWRkZXJTZXR0aW5ncyAmJiAoTy5iaWRkZXJTZXR0aW5ncyA9IHQuYmlkZGVyU2V0dGluZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuYWxsb3dlZFNpemVzICYmIChyID0gdC5hbGxvd2VkU2l6ZXMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuam9pbigneCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBvLm1vZHVsZU1hbmFnZXIudmlhTW9kdWxlKEUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmlzRW5hYmxlZCwgbiA9IGUub25SZWdpb25TZXQsIGkgPSBlLmdldFJlZ2lvbkNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiB0LmVuYWJsZWRSZWdpb25zICYmIG4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gdC5lbmFibGVkUmVnaW9ucy5pbmRleE9mKGkoKSkgJiYgKGwuYmJMb2dnZXIubG9nSW5mbygnUHJlYmlkIG5vdCBlbmFibGVkIGZvciB0aGlzIHJlZ2lvbiwgZGVyZWdpc3RlcmluZyBtb2R1bGUuJyksIG8ubW9kdWxlTWFuYWdlci5kZXJlZ2lzdGVyKEkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5xdWUucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0Lmxlbmd0aCAmJiBvLm1vZHVsZU1hbmFnZXIudmlhTW9kdWxlKEEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBlLmdwdEFjdGlvbikoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5zZXRUYXJnZXRpbmdGb3JHUFRBc3luYyh0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZHMgJiYgZS5iaWRzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmV4cG9zdXJlQXBpLnJvb3RTY29wZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgcGJqc1VuaXRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmFkVW5pdHMgJiYgTy5hZFVuaXRzLmxlbmd0aCA/IE8uYWRVbml0c1swXS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgPyBPLmFkVW5pdHNbMF0gOiBPLmFkVW5pdHMgOiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBnLmRvbSkoKS53aW5kb3cucGJqcyA9ICgwLCBnLmRvbSkoKS53aW5kb3cucGJqcyB8fCB7fSwgKDAsIGcuZG9tKSgpLndpbmRvdy5wYmpzLnF1ZSA9ICgwLCBnLmRvbSkoKS53aW5kb3cucGJqcy5xdWUgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVxdWVzdE1hbmFnZXIucmVnaXN0ZXIoSSksIGIuc2V0QmlkVGFyZ2V0aW5nLmJlZm9yZShfKSwgby5tb2R1bGVNYW5hZ2VyLnZpYU1vZHVsZSh3LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFZpZGVvVW5pdFBhcmFtcy5iZWZvcmUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgPSAhMCwgKDAsIG0uZ2V0Q29uZmlnKSgncHJlYmlkJywgUyksICgwLCBtLnNldENvbmZpZykoJ2JpZGRlclRpbWVvdXQnLCAoMCwgbS5nZXRDb25maWcpKCd0aW1lb3V0cy5iaWRkZXInKSksICgwLCBtLmdldENvbmZpZykoJ2hpZ2hGcmVxdWVuY3lBZFJlcXVlc3QnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbS5zZXRDb25maWcpKCdiaWRkZXJUaW1lb3V0JywgZSA/ICgwLCBtLmdldENvbmZpZykoJ3RpbWVvdXRzLmhmYXInKSA6ICgwLCBtLmdldENvbmZpZykoJ3RpbWVvdXRzLmJpZGRlcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgKDAsIHYuZ2V0UXVldWUpKCkucHVzaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSKCksIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoYi5zZXRCaWRUYXJnZXRpbmcuZ2V0SG9vayh7IGhvb2s6IF8gfSkucmVtb3ZlKCksIGkucmVxdWVzdE1hbmFnZXIuZGVyZWdpc3RlcihJKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkUmVxdWVzdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTy5xdWUucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uYWRVbml0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmJpZHMgJiYgci5iaWRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmlzVmlkZW8gfHwgci5hbGxvd2VkVHlwZXMudmlkZW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uYWRkQWRVbml0cyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE8ucmVxdWVzdEJpZHMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc0JhY2tIYW5kbGVyOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQoSSwgJy4nKS5jb25jYXQoQykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBJLCB0LCBlLCBvKSwgaS5yZXF1ZXN0TWFuYWdlci5kb25lKEkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6ICgwLCBtLmdldENvbmZpZykoJ2JpZGRlclRpbWVvdXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5ldmVudEVtaXR0ZXIuZW1pdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KEksICcuJykuY29uY2F0KHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIEksIGUsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgaiA9IG8ubW9kdWxlTWFuYWdlci5yZWdpc3RlcihQLCBbQV0sIHsgZ2F0ZTogJ2NvbnNlbnRHaXZlbicgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKCkgewogICAgICAgICAgICAgICAgICAgIE8gJiYgTy5wcm9jZXNzUXVldWUgJiYgTy5wcm9jZXNzUXVldWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQucHJlYmlkTW9kdWxlID0gaiwgZC5ldmVudEVtaXR0ZXIub24oJ2lkZW50aWZpZWQubmF0aXZlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAnc2hhcmV0aHJvdWdoJyA9PT0gZS5kc3AgJiYgKDAsIGgucmVuZGVyU2NyaXB0KSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogJy8vbmF0aXZlLnNoYXJldGhyb3VnaC5jb20vYXNzZXRzL3NmcC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYmItc2hhcmV0aHJvdWdoJywKICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0OiAndXRmLTgnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmV4ZWN1dGVDYWxsYmFja3MgPSBRLCB0LmRlZmF1bHQgPSB0LmNoZWNrQWRVbml0U2V0dXAgPSB0LmFkVW5pdFNldHVwQ2hlY2tzID0gdm9pZCAwLCByKDkpLCByKDExKSwgcig2KSwgcigxMyksIHIoNCksIHIoMiksIHIoMjYpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDEwMSksIG8gPSByKDcpLCBhID0gcigzNDQpLCBzID0gcigxMjYpLCB1ID0gcigyMiksIGMgPSByKDEyNyksIGQgPSByKDM0NyksIGwgPSByKDYxKSwgZiA9IHIoMzQ4KSwgcCA9IChuID0gcigzMSkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfSwgZyA9IHIoMjIwKSwgbSA9IHIoNzYpLCB2ID0gcigxNTQpLCBiID0gcig3NSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTygpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE8gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgXyA9ICgwLCBpLmdldEdsb2JhbCkoKSwgRSA9IHIoMzYpLCBJID0gcig3KSwgdyA9IHIoODcpLmRlZmF1bHQsIEEgPSByKDYwKSwgVCA9IHMudXNlclN5bmMudHJpZ2dlclVzZXJTeW5jcywgeCA9IEUuRVZFTlRTLCBDID0geC5BRERfQURfVU5JVFMsIFAgPSB4LkJJRF9XT04sIGogPSB4LlJFUVVFU1RfQklEUywgUiA9IHguU0VUX1RBUkdFVElORywgRCA9IHguQURfUkVOREVSX0ZBSUxFRCwgayA9IEUuQURfUkVOREVSX0ZBSUxFRF9SRUFTT04sIE4gPSBrLlBSRVZFTlRfV1JJVElOR19PTl9NQUlOX0RPQ1VNRU5ULCBNID0gay5OT19BRCwgVSA9IGsuRVhDRVBUSU9OLCBCID0gay5DQU5OT1RfRklORF9BRCwgTCA9IGsuTUlTU0lOR19ET0NfT1JfQURJRCwgeiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYmlkV29uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjLmF1Y3Rpb25NYW5hZ2VyLmdldEJpZHNSZXF1ZXN0ZWQoKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRzLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZFVuaXRDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKG8uZmxhdHRlbikuZmlsdGVyKG8udW5pcXVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUkuY29udGFpbnModCwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBJLmxvZ0Vycm9yKCdUaGUgIicgKyBlICsgJyIgcGxhY2VtZW50IGlzIG5vdCBkZWZpbmVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFYoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGUuZGVmYXVsdFZpZXcgJiYgZS5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQgJiYgKGUuZGVmYXVsdFZpZXcuZnJhbWVFbGVtZW50LndpZHRoID0gdCwgZS5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQuaGVpZ2h0ID0gcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBJLmlzQXJyYXkoZSkgJiYgKHQgPyBlLmxlbmd0aCA9PT0gdCA6IGUubGVuZ3RoID4gMCkgJiYgKGUuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBvLmlzQXJyYXlPZk51bXMpKGUsIDIpOwogICAgICAgICAgICAgICAgICAgIH0pID8gciA9IGUgOiAoMCwgby5pc0FycmF5T2ZOdW1zKShlLCAyKSAmJiByLnB1c2goZSkpLCByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBJLmRlZXBDbG9uZShlKSwgciA9IHQubWVkaWFUeXBlcy5iYW5uZXIsIG4gPSBGKHIuc2l6ZXMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxlbmd0aCA+IDAgPyAoci5zaXplcyA9IG4sIHQuc2l6ZXMgPSBuKSA6IChJLmxvZ0Vycm9yKCdEZXRlY3RlZCBhIG1lZGlhVHlwZXMuYmFubmVyIG9iamVjdCB3aXRob3V0IGEgcHJvcGVyIHNpemVzIGZpZWxkLiAgUGxlYXNlIGVuc3VyZSB0aGUgc2l6ZXMgYXJlIGxpc3RlZCBsaWtlOiBbWzMwMCwgMjUwXSwgLi4uXS4gIFJlbW92aW5nIGludmFsaWQgbWVkaWFUeXBlcy5iYW5uZXIgb2JqZWN0IGZyb20gcmVxdWVzdC4nKSwgZGVsZXRlIHQubWVkaWFUeXBlcy5iYW5uZXIpLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBJLmRlZXBDbG9uZShlKSwgciA9IHQubWVkaWFUeXBlcy52aWRlbzsKICAgICAgICAgICAgICAgICAgICBpZiAoci5wbGF5ZXJTaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ251bWJlcicgPT0gdHlwZW9mIHIucGxheWVyU2l6ZVswXSA/IDIgOiAxLCBpID0gRihyLnBsYXllclNpemUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICBpLmxlbmd0aCA+IDAgPyAoMiA9PT0gbiAmJiBJLmxvZ0luZm8oJ1RyYW5zZm9ybWluZyB2aWRlby5wbGF5ZXJTaXplIGZyb20gWzY0MCw0ODBdIHRvIFtbNjQwLDQ4MF1dIHNvIGl0XCdzIGluIHRoZSBwcm9wZXIgZm9ybWF0LicpLCByLnBsYXllclNpemUgPSBpLCB0LnNpemVzID0gaSkgOiAoSS5sb2dFcnJvcignRGV0ZWN0ZWQgaW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgbWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplLiAgUGxlYXNlIHNwZWNpZnkgb25seSBvbmUgc2V0IG9mIGRpbWVuc2lvbnMgaW4gYSBmb3JtYXQgbGlrZTogW1s2NDAsIDQ4MF1dLiBSZW1vdmluZyBpbnZhbGlkIG1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZSBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSB0Lm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBJLmRlZXBDbG9uZShlKSwgciA9IHQubWVkaWFUeXBlcy5uYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaW1hZ2UgJiYgci5pbWFnZS5zaXplcyAmJiAhQXJyYXkuaXNBcnJheShyLmltYWdlLnNpemVzKSAmJiAoSS5sb2dFcnJvcignUGxlYXNlIHVzZSBhbiBhcnJheSBvZiBzaXplcyBmb3IgbmF0aXZlLmltYWdlLnNpemVzIGZpZWxkLiAgUmVtb3ZpbmcgaW52YWxpZCBtZWRpYVR5cGVzLm5hdGl2ZS5pbWFnZS5zaXplcyBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSB0Lm1lZGlhVHlwZXMubmF0aXZlLmltYWdlLnNpemVzKSwgci5pbWFnZSAmJiByLmltYWdlLmFzcGVjdF9yYXRpb3MgJiYgIUFycmF5LmlzQXJyYXkoci5pbWFnZS5hc3BlY3RfcmF0aW9zKSAmJiAoSS5sb2dFcnJvcignUGxlYXNlIHVzZSBhbiBhcnJheSBvZiBzaXplcyBmb3IgbmF0aXZlLmltYWdlLmFzcGVjdF9yYXRpb3MgZmllbGQuICBSZW1vdmluZyBpbnZhbGlkIG1lZGlhVHlwZXMubmF0aXZlLmltYWdlLmFzcGVjdF9yYXRpb3MgcHJvcGVydHkgZnJvbSByZXF1ZXN0LicpLCBkZWxldGUgdC5tZWRpYVR5cGVzLm5hdGl2ZS5pbWFnZS5hc3BlY3RfcmF0aW9zKSwgci5pY29uICYmIHIuaWNvbi5zaXplcyAmJiAhQXJyYXkuaXNBcnJheShyLmljb24uc2l6ZXMpICYmIChJLmxvZ0Vycm9yKCdQbGVhc2UgdXNlIGFuIGFycmF5IG9mIHNpemVzIGZvciBuYXRpdmUuaWNvbi5zaXplcyBmaWVsZC4gIFJlbW92aW5nIGludmFsaWQgbWVkaWFUeXBlcy5uYXRpdmUuaWNvbi5zaXplcyBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSB0Lm1lZGlhVHlwZXMubmF0aXZlLmljb24uc2l6ZXMpLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKDAsIGYuc2Vzc2lvbkxvYWRlcikoKSwgXy5iaWRkZXJTZXR0aW5ncyA9IF8uYmlkZGVyU2V0dGluZ3MgfHwge30sIF8ubGliTG9hZGVkID0gITAsIF8udmVyc2lvbiA9ICd2NC4yNi4wJywgSS5sb2dJbmZvKCdQcmViaWQuanMgdjQuMjYuMCBsb2FkZWQnKSwgXy5hZFVuaXRzID0gXy5hZFVuaXRzIHx8IFtdLCBfLnRyaWdnZXJVc2VyU3luY3MgPSBUOwogICAgICAgICAgICAgICAgdmFyIEggPSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVCYW5uZXJNZWRpYVR5cGU6IHEsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVWaWRlb01lZGlhVHlwZTogRywKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZU5hdGl2ZU1lZGlhVHlwZTogVywKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZVNpemVzOiBGCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5hZFVuaXRTZXR1cENoZWNrcyA9IEg7CiAgICAgICAgICAgICAgICB2YXIgWSA9ICgwLCBsLmhvb2spKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG4sIGksIG8gPSBlLm1lZGlhVHlwZXMsIGEgPSBlLmJpZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIEkuaXNBcnJheShhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgMCAhPT0gT2JqZWN0LmtleXMobykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iYW5uZXIgJiYgKHIgPSBxKGUpKSwgby52aWRlbyAmJiAobiA9IEcociB8fCBlKSksIG8ubmF0aXZlICYmIChpID0gVyhuIHx8IChyIHx8IGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBPKHt9LCByLCBuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0RldGVjdGVkIGFkVW5pdC5jb2RlIFwnJy5jb25jYXQoZS5jb2RlLCAnXCcgZGlkIG5vdCBoYXZlIGEgXCdtZWRpYVR5cGVzXCcgb2JqZWN0IGRlZmluZWQuICBUaGlzIGlzIGEgcmVxdWlyZWQgZmllbGQgZm9yIHRoZSBhdWN0aW9uLCBzbyB0aGlzIGFkVW5pdCBoYXMgYmVlbiByZW1vdmVkLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0RldGVjdGVkIGFkVW5pdC5jb2RlIFwnJy5jb25jYXQoZS5jb2RlLCAnXCcgZGlkIG5vdCBoYXZlIFwnYWRVbml0LmJpZHNcJyBkZWZpbmVkIG9yIFwnYWRVbml0LmJpZHNcJyBpcyBub3QgYW4gYXJyYXkuIFJlbW92aW5nIGFkVW5pdCBmcm9tIGF1Y3Rpb24uJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICB9LCAnY2hlY2tBZFVuaXRTZXR1cCcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gSyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjLmF1Y3Rpb25NYW5hZ2VyW2VdKCkuZmlsdGVyKEkuYmluZC5jYWxsKG8uYWRVbml0c0ZpbHRlciwgdGhpcywgYy5hdWN0aW9uTWFuYWdlci5nZXRBZFVuaXRDb2RlcygpKSksIHIgPSBjLmF1Y3Rpb25NYW5hZ2VyLmdldExhc3RBdWN0aW9uSWQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZTsKICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoby51bmlxdWVzKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hdWN0aW9uSWQgPT09IHIgJiYgdC5hZFVuaXRDb2RlID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZVswXSAmJiBlWzBdLmFkVW5pdENvZGU7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oe30sIGVbMF0uYWRVbml0Q29kZSwgeyBiaWRzOiBlIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBKKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucmVhc29uLCByID0gZS5tZXNzYWdlLCBuID0gZS5iaWQsIGkgPSBlLmlkLCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIG4gJiYgKG8uYmlkID0gbiksIGkgJiYgKG8uYWRJZCA9IGkpLCBJLmxvZ0Vycm9yKHIpLCBBLmVtaXQoRCwgbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBRKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdDsgdCA9IGUuc2hpZnQoKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByKGIuc3RvcmFnZUNhbGxiYWNrcyksIHIoWCksIGUuY2FsbCh0aGlzLCB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuY2hlY2tBZFVuaXRTZXR1cCA9IFksIF8uZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlU3RyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoSS5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmdldEFkc2VydmVyVGFyZ2V0aW5nRm9yQWRVbml0Q29kZVN0cicsIGFyZ3VtZW50cyksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBfLmdldEFkc2VydmVyVGFyZ2V0aW5nRm9yQWRVbml0Q29kZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkudHJhbnNmb3JtQWRTZXJ2ZXJUYXJnZXRpbmdPYmoodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEkubG9nTWVzc2FnZSgnTmVlZCB0byBjYWxsIGdldEFkc2VydmVyVGFyZ2V0aW5nRm9yQWRVbml0Q29kZVN0ciB3aXRoIGFkdW5pdENvZGUnKTsKICAgICAgICAgICAgICAgIH0sIF8uZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogeyBmb3JUYXJnZXRpbmc6ICExIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uZ2V0QWRzZXJ2ZXJUYXJnZXRpbmcoZSwgdClbZV07CiAgICAgICAgICAgICAgICB9LCBfLmdldEFkc2VydmVyVGFyZ2V0aW5nID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogeyBmb3JUYXJnZXRpbmc6ICExIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5nZXRBZHNlcnZlclRhcmdldGluZycsIGFyZ3VtZW50cyksIGQudGFyZ2V0aW5nLmdldEFsbFRhcmdldGluZyhlLCBkLnRhcmdldGluZy5nZXRCaWRzUmVjZWl2ZWQoKSwgdCk7CiAgICAgICAgICAgICAgICB9LCBfLmdldE5vQmlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSS5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmdldE5vQmlkcycsIGFyZ3VtZW50cyksIEsoJ2dldE5vQmlkcycpOwogICAgICAgICAgICAgICAgfSwgXy5nZXROb0JpZHNGb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBjLmF1Y3Rpb25NYW5hZ2VyLmdldE5vQmlkcygpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWRVbml0Q29kZSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgXy5nZXRCaWRSZXNwb25zZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5nZXRCaWRSZXNwb25zZXMnLCBhcmd1bWVudHMpLCBLKCdnZXRCaWRzUmVjZWl2ZWQnKTsKICAgICAgICAgICAgICAgIH0sIF8uZ2V0QmlkUmVzcG9uc2VzRm9yQWRVbml0Q29kZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogYy5hdWN0aW9uTWFuYWdlci5nZXRCaWRzUmVjZWl2ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFkVW5pdENvZGUgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIF8uc2V0VGFyZ2V0aW5nRm9yR1BUQXN5bmMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChJLmxvZ0luZm8oJ0ludm9raW5nIHBianMuc2V0VGFyZ2V0aW5nRm9yR1BUQXN5bmMnLCBhcmd1bWVudHMpLCAoMCwgby5pc0dwdFB1YmFkc0RlZmluZWQpKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBkLnRhcmdldGluZy5nZXRBbGxUYXJnZXRpbmcoZSwgZC50YXJnZXRpbmcuZ2V0Qmlkc1JlY2VpdmVkKCksIHsgZm9yVGFyZ2V0aW5nOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZC50YXJnZXRpbmcucmVzZXRQcmVzZXRUYXJnZXRpbmcoZSwgdCksIGQudGFyZ2V0aW5nLnNldFRhcmdldGluZ0ZvckdQVChyLCB0KSwgT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocltlXSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYl9hZGlkJyA9PT0gdCAmJiBjLmF1Y3Rpb25NYW5hZ2VyLnNldFN0YXR1c0ZvckJpZHMocltlXVt0XSwgRS5CSURfU1RBVFVTLkJJRF9UQVJHRVRJTkdfU0VUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgQS5lbWl0KFIsIHIpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ3dpbmRvdy5nb29nbGV0YWcgaXMgbm90IGRlZmluZWQgb24gdGhlIHBhZ2UnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfLnNldFRhcmdldGluZ0ZvckFzdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgSS5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnNldFRhcmdldGluZ0ZvckFuJywgYXJndW1lbnRzKSwgZC50YXJnZXRpbmcuaXNBcG50YWdEZWZpbmVkKCkgPyAoZC50YXJnZXRpbmcuc2V0VGFyZ2V0aW5nRm9yQXN0KGUpLCBBLmVtaXQoUiwgZC50YXJnZXRpbmcuZ2V0QWxsVGFyZ2V0aW5nKCkpKSA6IEkubG9nRXJyb3IoJ3dpbmRvdy5hcG50YWcgaXMgbm90IGRlZmluZWQgb24gdGhlIHBhZ2UnKTsKICAgICAgICAgICAgICAgIH0sIF8ucmVuZGVyQWQgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGlmIChJLmxvZ0luZm8oJ0ludm9raW5nIHBianMucmVuZGVyQWQnLCBhcmd1bWVudHMpLCBJLmxvZ01lc3NhZ2UoJ0NhbGxpbmcgcmVuZGVyQWQgd2l0aCBhZElkIDonICsgdCksIGUgJiYgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjLmF1Y3Rpb25NYW5hZ2VyLmZpbmRCaWRCeUFkSWQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmFkID0gSS5yZXBsYWNlQXVjdGlvblByaWNlKG4uYWQsIG4uY3BtKSwgbi5hZFVybCA9IEkucmVwbGFjZUF1Y3Rpb25QcmljZShuLmFkVXJsLCBuLmNwbSksIHIgJiYgci5jbGlja1Rocm91Z2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSByLmNsaWNrVGhyb3VnaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5hZCA9IEkucmVwbGFjZUNsaWNrVGhyb3VnaChuLmFkLCBpKSwgbi5hZFVybCA9IEkucmVwbGFjZUNsaWNrVGhyb3VnaChuLmFkVXJsLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hdWN0aW9uTWFuYWdlci5hZGRXaW5uaW5nQmlkKG4pLCBBLmVtaXQoUCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuLmhlaWdodCwgYSA9IG4ud2lkdGgsIHMgPSBuLmFkLCB1ID0gbi5tZWRpYVR5cGUsIGQgPSBuLmFkVXJsLCBsID0gbi5yZW5kZXJlciwgZiA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ0NyZWF0aXZlICcuY29uY2F0KG4uY3JlYXRpdmVJZCwgJyBzZXJ2ZWQgYnkgJykuY29uY2F0KG4uYmlkZGVyLCAnIFByZWJpZC5qcyBIZWFkZXIgQmlkZGluZycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSS5pbnNlcnRFbGVtZW50KGYsIGUsICdib2R5JyksICgwLCBtLmlzUmVuZGVyZXJSZXF1aXJlZCkobCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG0uZXhlY3V0ZVJlbmRlcmVyKShsLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUgPT09IGRvY3VtZW50ICYmICFJLmluSWZyYW1lKCkgfHwgJ3ZpZGVvJyA9PT0gdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQuIEFkIHJlbmRlciBjYWxsIGFkIGlkICcuY29uY2F0KHQsICcgd2FzIHByZXZlbnRlZCBmcm9tIHdyaXRpbmcgdG8gdGhlIG1haW4gZG9jdW1lbnQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWKGUsIGEsIG8pLCBlLndyaXRlKHMpLCBlLmNsb3NlKCksIEkuY2FsbEJ1cmwobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gSS5jcmVhdGVJbnZpc2libGVJZnJhbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5oZWlnaHQgPSBvLCBnLndpZHRoID0gYSwgZy5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZScsIGcuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgZy5zcmMgPSBkLCBJLmluc2VydEVsZW1lbnQoZywgZSwgJ2JvZHknKSwgVihlLCBhLCBvKSwgSS5jYWxsQnVybChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQuIE5vIGFkIGZvciBiaWQgcmVzcG9uc2UgaWQ6ICcuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gJ0Vycm9yIHRyeWluZyB0byB3cml0ZSBhZC4gQ2Fubm90IGZpbmQgYWQgYnkgZ2l2ZW4gaWQgOiAnLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQgSWQgOicuY29uY2F0KHQsICcgdG8gdGhlIHBhZ2U6JykuY29uY2F0KGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQgSWQgOicuY29uY2F0KHQsICcgdG8gdGhlIHBhZ2UuIE1pc3NpbmcgZG9jdW1lbnQgb3IgYWRJZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBfLnJlbW92ZUFkVW5pdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgKEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5yZW1vdmVBZFVuaXQnLCBhcmd1bWVudHMpLCBlKSA/IChJLmlzQXJyYXkoZSkgPyBlIDogW2VdKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBfLmFkVW5pdHMubGVuZ3RoIC0gMTsgdCA+PSAwOyB0LS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uYWRVbml0c1t0XS5jb2RlID09PSBlICYmIF8uYWRVbml0cy5zcGxpY2UodCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSA6IF8uYWRVbml0cyA9IFtdOwogICAgICAgICAgICAgICAgfSwgXy5yZXF1ZXN0QmlkcyA9ICgwLCBsLmhvb2spKCdhc3luYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHQgPSBlLmJpZHNCYWNrSGFuZGxlciwgciA9IGUudGltZW91dCwgbiA9IGUuYWRVbml0cywgaSA9IGUuYWRVbml0Q29kZXMsIG8gPSBlLmxhYmVscywgYSA9IGUuYXVjdGlvbklkOwogICAgICAgICAgICAgICAgICAgIEEuZW1pdChqKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHIgfHwgdS5jb25maWcuZ2V0Q29uZmlnKCdiaWRkZXJUaW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgbiA9IG4gfHwgXy5hZFVuaXRzLCBJLmxvZ0luZm8oJ0ludm9raW5nIHBianMucmVxdWVzdEJpZHMnLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIHZhciBsID0gW10sIGYgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAodS5jb25maWcuZ2V0Q29uZmlnKCdzMnNDb25maWcnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLnMyc0NvbmZpZyAmJiAobCA9IEFycmF5LmlzQXJyYXkoZS5zMnNDb25maWcpID8gZS5zMnNDb25maWcgOiBbZS5zMnNDb25maWddKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGwuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5wdXNoLmFwcGx5KGYsIGgoZS5iaWRkZXJzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID0gWShuKSwgaSAmJiBpLmxlbmd0aCA/IG4gPSBuLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBwLmRlZmF1bHQpKGksIGUuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogaSA9IG4gJiYgbi5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmtleXMoZS5tZWRpYVR5cGVzIHx8IHsgYmFubmVyOiAnYmFubmVyJyB9KSwgciA9IGUuYmlkcy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID0gdy5iaWRkZXJSZWdpc3RyeSwgaSA9IGYgPyByLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgwLCBwLmRlZmF1bHQpKGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHJhbnNhY3Rpb25JZCA9IEkuZ2VuZXJhdGVVVUlEKCksIGkuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbltyXSwgbyA9IGkgJiYgaS5nZXRTcGVjICYmIGkuZ2V0U3BlYygpLCBhID0gbyAmJiBvLnN1cHBvcnRlZE1lZGlhVHlwZXMgfHwgWydiYW5uZXInXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBwLmRlZmF1bHQpKGEsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pID8gZy5hZHVuaXRDb3VudGVyLmluY3JlbWVudEJpZGRlclJlcXVlc3RzQ291bnRlcihlLmNvZGUsIHIpIDogKEkubG9nV2FybihJLnVuc3VwcG9ydGVkQmlkZGVyTWVzc2FnZShlLCByKSksIGUuYmlkcyA9IGUuYmlkcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyICE9PSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnLmFkdW5pdENvdW50ZXIuaW5jcmVtZW50UmVxdWVzdHNDb3VudGVyKGUuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuICYmIDAgIT09IG4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gYy5hdWN0aW9uTWFuYWdlci5jcmVhdGVBdWN0aW9uKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGVzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiVGltZW91dDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdiA9IG4ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICB2ID4gMTUgJiYgSS5sb2dJbmZvKCdDdXJyZW50IGF1Y3Rpb24gJy5jb25jYXQobS5nZXRBdWN0aW9uSWQoKSwgJyBjb250YWlucyAnKS5jb25jYXQodiwgJyBhZFVuaXRzLicpLCBuKSwgaS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXRpbmcuc2V0TGF0ZXN0QXVjdGlvbkZvckFkVW5pdChlLCBtLmdldEF1Y3Rpb25JZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG0uY2FsbEJpZHMoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEkubG9nTWVzc2FnZSgnTm8gYWRVbml0cyBjb25maWd1cmVkLiBObyBiaWRzIHJlcXVlc3RlZC4nKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmxvZ0Vycm9yKCdFcnJvciBleGVjdXRpbmcgYmlkc0JhY2tIYW5kbGVyJywgbnVsbCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgXy5yZXF1ZXN0Qmlkcy5iZWZvcmUoUSwgNDkpLCBfLmFkZEFkVW5pdHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5hZGRBZFVuaXRzJywgYXJndW1lbnRzKSwgSS5pc0FycmF5KGUpID8gXy5hZFVuaXRzLnB1c2guYXBwbHkoXy5hZFVuaXRzLCBlKSA6ICdvYmplY3QnID09PSB5KGUpICYmIF8uYWRVbml0cy5wdXNoKGUpLCBBLmVtaXQoQyk7CiAgICAgICAgICAgICAgICB9LCBfLm9uRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5vbkV2ZW50JywgYXJndW1lbnRzKSwgSS5pc0ZuKHQpID8gIXIgfHwgeltlXS5jYWxsKG51bGwsIHIpID8gQS5vbihlLCB0LCByKSA6IEkubG9nRXJyb3IoJ1RoZSBpZCBwcm92aWRlZCBpcyBub3QgdmFsaWQgZm9yIGV2ZW50ICInICsgZSArICciIGFuZCBubyBoYW5kbGVyIHdhcyBzZXQuJykgOiBJLmxvZ0Vycm9yKCdUaGUgZXZlbnQgaGFuZGxlciBwcm92aWRlZCBpcyBub3QgYSBmdW5jdGlvbiBhbmQgd2FzIG5vdCBzZXQgb24gZXZlbnQgIicgKyBlICsgJyIuJyk7CiAgICAgICAgICAgICAgICB9LCBfLm9mZkV2ZW50ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBJLmxvZ0luZm8oJ0ludm9raW5nIHBianMub2ZmRXZlbnQnLCBhcmd1bWVudHMpLCByICYmICF6W2VdLmNhbGwobnVsbCwgcikgfHwgQS5vZmYoZSwgdCwgcik7CiAgICAgICAgICAgICAgICB9LCBfLmdldEV2ZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSS5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmdldEV2ZW50cycpLCBBLmdldEV2ZW50cygpOwogICAgICAgICAgICAgICAgfSwgXy5yZWdpc3RlckJpZEFkYXB0ZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5yZWdpc3RlckJpZEFkYXB0ZXInLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHcucmVnaXN0ZXJCaWRBZGFwdGVyKGUoKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBJLmxvZ0Vycm9yKCdFcnJvciByZWdpc3RlcmluZyBiaWRkZXIgYWRhcHRlciA6ICcgKyBlLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIF8ucmVnaXN0ZXJBbmFseXRpY3NBZGFwdGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBJLmxvZ0luZm8oJ0ludm9raW5nIHBianMucmVnaXN0ZXJBbmFseXRpY3NBZGFwdGVyJywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB3LnJlZ2lzdGVyQW5hbHl0aWNzQWRhcHRlcihlKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0Vycm9yIHJlZ2lzdGVyaW5nIGFuYWx5dGljcyBhZGFwdGVyIDogJyArIGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgXy5jcmVhdGVCaWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBJLmxvZ0luZm8oJ0ludm9raW5nIHBianMuY3JlYXRlQmlkJywgYXJndW1lbnRzKSwgKDAsIHYuY3JlYXRlQmlkKShlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgWCA9IFtdLCAkID0gKDAsIGwuaG9vaykoJ2FzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAhSS5pc0VtcHR5KGUpID8gKEkubG9nSW5mbygnSW52b2tpbmcgcGJqcy5lbmFibGVBbmFseXRpY3MgZm9yOiAnLCBlKSwgdy5lbmFibGVBbmFseXRpY3MoZSkpIDogSS5sb2dFcnJvcigncGJqcy5lbmFibGVBbmFseXRpY3Mgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG9wdGlvbiB7fScpOwogICAgICAgICAgICAgICAgICAgIH0sICdlbmFibGVBbmFseXRpY3NDYicpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWihlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGUuY2FsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbCgpLCBlLmNhbGxlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgY29tbWFuZCA6JywgJ3ByZWJpZC5qcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfLmVuYWJsZUFuYWx5dGljcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgWC5wdXNoKCQuYmluZCh0aGlzLCBlKSk7CiAgICAgICAgICAgICAgICB9LCBfLmFsaWFzQmlkZGVyID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBJLmxvZ0luZm8oJ0ludm9raW5nIHBianMuYWxpYXNCaWRkZXInLCBhcmd1bWVudHMpLCBlICYmIHQgPyB3LmFsaWFzQmlkQWRhcHRlcihlLCB0LCByKSA6IEkubG9nRXJyb3IoJ2JpZGRlckNvZGUgYW5kIGFsaWFzIG11c3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50cycsICdwYmpzLmFsaWFzQmlkZGVyJyk7CiAgICAgICAgICAgICAgICB9LCBfLmdldEFsbFdpbm5pbmdCaWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmF1Y3Rpb25NYW5hZ2VyLmdldEFsbFdpbm5pbmdCaWRzKCk7CiAgICAgICAgICAgICAgICB9LCBfLmdldEFsbFByZWJpZFdpbm5pbmdCaWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmF1Y3Rpb25NYW5hZ2VyLmdldEJpZHNSZWNlaXZlZCgpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdGF0dXMgPT09IEUuQklEX1NUQVRVUy5CSURfVEFSR0VUSU5HX1NFVDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIF8uZ2V0SGlnaGVzdENwbUJpZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnRhcmdldGluZy5nZXRXaW5uaW5nQmlkcyhlKTsKICAgICAgICAgICAgICAgIH0sIF8ubWFya1dpbm5pbmdCaWRBc1VzZWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgZS5hZFVuaXRDb2RlICYmIGUuYWRJZCA/IHQgPSBjLmF1Y3Rpb25NYW5hZ2VyLmdldEJpZHNSZWNlaXZlZCgpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZElkID09PSBlLmFkSWQgJiYgdC5hZFVuaXRDb2RlID09PSBlLmFkVW5pdENvZGU7CiAgICAgICAgICAgICAgICAgICAgfSkgOiBlLmFkVW5pdENvZGUgPyB0ID0gZC50YXJnZXRpbmcuZ2V0V2lubmluZ0JpZHMoZS5hZFVuaXRDb2RlKSA6IGUuYWRJZCA/IHQgPSBjLmF1Y3Rpb25NYW5hZ2VyLmdldEJpZHNSZWNlaXZlZCgpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZElkID09PSBlLmFkSWQ7CiAgICAgICAgICAgICAgICAgICAgfSkgOiBJLmxvZ1dhcm4oJ0ltcHJvcGVyIHVzZSBvZiBtYXJrV2lubmluZ0JpZEFzVXNlZC4gSXQgbmVlZHMgYW4gYWRVbml0Q29kZSBvciBhbiBhZElkIHRvIGZ1bmN0aW9uLicpLCB0Lmxlbmd0aCA+IDAgJiYgKHRbMF0uc3RhdHVzID0gRS5CSURfU1RBVFVTLlJFTkRFUkVEKTsKICAgICAgICAgICAgICAgIH0sIF8uZ2V0Q29uZmlnID0gdS5jb25maWcuZ2V0Q29uZmlnLCBfLnNldENvbmZpZyA9IHUuY29uZmlnLnNldENvbmZpZywgXy5zZXRCaWRkZXJDb25maWcgPSB1LmNvbmZpZy5zZXRCaWRkZXJDb25maWcsIF8ucXVlLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYS5saXN0ZW5NZXNzYWdlc0Zyb21DcmVhdGl2ZSkoKTsKICAgICAgICAgICAgICAgIH0pLCBfLmNtZC5wdXNoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgY29tbWFuZCA6JywgZS5tZXNzYWdlLCBlLnN0YWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEkubG9nRXJyb3IoJ0NvbW1hbmRzIHdyaXR0ZW4gaW50byBwYmpzLmNtZC5wdXNoIG11c3QgYmUgd3JhcHBlZCBpbiBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgXy5xdWUucHVzaCA9IF8uY21kLnB1c2gsIF8ucHJvY2Vzc1F1ZXVlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGwuaG9vay5yZWFkeSgpLCBaKF8ucXVlKSwgWihfLmNtZCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGVlID0gXzsKICAgICAgICAgICAgICAgIHQuZGVmYXVsdCA9IGVlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQubGlzdGVuTWVzc2FnZXNGcm9tQ3JlYXRpdmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBwLCAhMSk7CiAgICAgICAgICAgICAgICB9LCB0Ll9zZW5kQWRUb0NyZWF0aXZlID0gZzsKICAgICAgICAgICAgICAgIHZhciBuID0gbChyKDYwKSksIGkgPSByKDg4KSwgbyA9IGwocigzNikpLCBhID0gcig3KSwgcyA9IHIoMTI3KSwgdSA9IGwocigzNykpLCBjID0gcig3NiksIGQgPSBsKHIoMzEpKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmID0gby5kZWZhdWx0LkVWRU5UUy5CSURfV09OOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm1lc3NhZ2UgPyAnbWVzc2FnZScgOiAnZGF0YScsIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByID0gSlNPTi5wYXJzZShlW3RdKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgci5hZElkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gKDAsIHUuZGVmYXVsdCkocy5hdWN0aW9uTWFuYWdlci5nZXRCaWRzUmVjZWl2ZWQoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkSWQgPT09IHIuYWRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvICYmICdQcmViaWQgUmVxdWVzdCcgPT09IHIubWVzc2FnZSAmJiAoZyhvLCBlKSwgcy5hdWN0aW9uTWFuYWdlci5hZGRXaW5uaW5nQmlkKG8pLCBuLmRlZmF1bHQuZW1pdChmLCBvKSksIG8gJiYgJ1ByZWJpZCBOYXRpdmUnID09PSByLm1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYXNzZXRSZXF1ZXN0JyA9PT0gci5hY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9ICgwLCBpLmdldEFzc2V0TWVzc2FnZSkociwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZS5zb3VyY2UucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSksIGUub3JpZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYWxsQXNzZXRSZXF1ZXN0JyA9PT0gci5hY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICgwLCBpLmdldEFsbEFzc2V0c01lc3NhZ2UpKHIsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc291cmNlLnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGMpLCBlLm9yaWdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNpemVOYXRpdmVIZWlnaHQnID09PSByLmFjdGlvbiAmJiAoby5oZWlnaHQgPSByLmhlaWdodCwgby53aWR0aCA9IHIud2lkdGgsIG0obykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdjbGljaycgPT09ICgwLCBpLmZpcmVOYXRpdmVUcmFja2VycykociwgbykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmF1Y3Rpb25NYW5hZ2VyLmFkZFdpbm5pbmdCaWQobyksIG4uZGVmYXVsdC5lbWl0KGYsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmFkSWQsIG4gPSBlLmFkLCBpID0gZS5hZFVybCwgbyA9IGUud2lkdGgsIHMgPSBlLmhlaWdodCwgdSA9IGUucmVuZGVyZXIsIGQgPSBlLmNwbTsKICAgICAgICAgICAgICAgICAgICAoMCwgYy5pc1JlbmRlcmVyUmVxdWlyZWQpKHUpID8gKDAsIGMuZXhlY3V0ZVJlbmRlcmVyKSh1LCBlKSA6IHIgJiYgKG0oZSksIHQuc291cmNlLnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZCBSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkOiAoMCwgYS5yZXBsYWNlQXVjdGlvblByaWNlKShuLCBkKSwKICAgICAgICAgICAgICAgICAgICAgICAgYWRVcmw6ICgwLCBhLnJlcGxhY2VBdWN0aW9uUHJpY2UpKGksIGQpLAogICAgICAgICAgICAgICAgICAgICAgICBhZElkOiByLAogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbywKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzCiAgICAgICAgICAgICAgICAgICAgfSksIHQub3JpZ2luKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuYWRJZCwgciA9IGUuYWRVbml0Q29kZSwgbiA9IGUud2lkdGgsIGkgPSBlLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICdkaXYnLAogICAgICAgICAgICAgICAgICAgICAgICAnaWZyYW1lJwogICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZ29vZ2xldGFnID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgdS5kZWZhdWx0KSh3aW5kb3cuZ29vZ2xldGFnLnB1YmFkcygpLmdldFNsb3RzKCksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCB1LmRlZmF1bHQpKHQuZ2V0VGFyZ2V0aW5nS2V5cygpLCBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGQuZGVmYXVsdCkodC5nZXRUYXJnZXRpbmcociksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZ2V0U2xvdEVsZW1lbnRJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpIDogd2luZG93LmFwbnRhZyA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdy5hcG50YWcuZ2V0VGFnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgdC50YXJnZXRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0KSA6IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCByKSwgaSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgaS5xdWVyeVNlbGVjdG9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUgKyAnOm5vdChbc3R5bGUqPSJkaXNwbGF5OiBub25lIl0pJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG8uc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLndpZHRoID0gbiArICdweCcsIHMuaGVpZ2h0ID0gaSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgYS5sb2dXYXJuKSgnVW5hYmxlIHRvIGxvY2F0ZSBtYXRjaGluZyBwYWdlIGVsZW1lbnQgZm9yIGFkVW5pdENvZGUgJy5jb25jYXQociwgJy4gIENhblwndCByZXNpemUgaXQgdG8gYWRcJ3MgZGltZW5zaW9ucy4gIFBsZWFzZSByZXZpZXcgc2V0dXAuJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIoNCksIHIoMiksIHIoMSksIHIoMyksIHIoMCksIHIoNiksIHIoMzApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zdG9yZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7IHB1dHM6IGUubWFwKHUsIHIpIH07CiAgICAgICAgICAgICAgICAgICAgKDAsIGkuYWpheCkoby5jb25maWcuZ2V0Q29uZmlnKCdjYWNoZS51cmwnKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IEpTT04ucGFyc2UodCkucmVzcG9uc2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZSh0LCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPyBlKG51bGwsIHIpIDogZShuZXcgRXJyb3IoJ1RoZSBjYWNoZSBzZXJ2ZXIgZGlkblwndCByZXNwb25kIHdpdGggYSByZXNwb25zZXMgcHJvcGVydHkuJyksIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG5ldyBFcnJvcignRXJyb3Igc3RvcmluZyB2aWRlbyBhZCBpbiB0aGUgY2FjaGU6ICcuY29uY2F0KHQsICc6ICcpLmNvbmNhdChKU09OLnN0cmluZ2lmeShyKSkpLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSh0KSwgSlNPTi5zdHJpbmdpZnkobiksIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgdC5nZXRDYWNoZVVybCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChvLmNvbmZpZy5nZXRDb25maWcoJ2NhY2hlLnVybCcpLCAnP3V1aWQ9JykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgfSwgcig0MCk7CiAgICAgICAgICAgICAgICB2YXIgaSA9IHIoMTAzKSwgbyA9IHIoMjIpLCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCAnb2JqZWN0JyAhPT0gbihlKSAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuaGFzKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgaSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGkgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChhLmdldCB8fCBhLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgbywgYSkgOiByW29dID0gZVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KHIoNykpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG4sIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAneG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLnZhc3RYbWwgPyBlLnZhc3RYbWwgOiAodCA9IGUudmFzdFVybCwgciA9IGUudmFzdEltcFVybCwgbiA9IHIgPyAnPCFbQ0RBVEFbJy5jb25jYXQociwgJ11dPicpIDogJycsICc8VkFTVCB2ZXJzaW9uPSIzLjAiPlxuICAgIDxBZD5cbiAgICAgIDxXcmFwcGVyPlxuICAgICAgICA8QWRTeXN0ZW0+cHJlYmlkLm9yZyB3cmFwcGVyPC9BZFN5c3RlbT5cbiAgICAgICAgPFZBU1RBZFRhZ1VSST48IVtDREFUQVsnLmNvbmNhdCh0LCAnXV0+PC9WQVNUQWRUYWdVUkk+XG4gICAgICAgIDxJbXByZXNzaW9uPicpLmNvbmNhdChuLCAnPC9JbXByZXNzaW9uPlxuICAgICAgICA8Q3JlYXRpdmVzPjwvQ3JlYXRpdmVzPlxuICAgICAgPC9XcmFwcGVyPlxuICAgIDwvQWQ+XG4gIDwvVkFTVD4nKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGxzZWNvbmRzOiBOdW1iZXIoZS50dGwpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uY29uZmlnLmdldENvbmZpZygnY2FjaGUudmFzdHRyYWNrJykgJiYgKGkuYmlkZGVyID0gZS5iaWRkZXIsIGkuYmlkaWQgPSBlLnJlcXVlc3RJZCwgYS5pc1BsYWluT2JqZWN0KHRoaXMpICYmIHRoaXMuaGFzT3duUHJvcGVydHkoJ2F1Y3Rpb25TdGFydCcpICYmIChpLnRpbWVzdGFtcCA9IHRoaXMuYXVjdGlvblN0YXJ0KSksICdzdHJpbmcnID09IHR5cGVvZiBlLmN1c3RvbUNhY2hlS2V5ICYmICcnICE9PSBlLmN1c3RvbUNhY2hlS2V5ICYmIChpLmtleSA9IGUuY3VzdG9tQ2FjaGVLZXkpLCBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByKDQpLCByKDIpLCByKDEpLCByKDMpLCByKDApLCByKDYpLCByKDMwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQubG9hZEV4dGVybmFsU2NyaXB0ID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYS5sb2dFcnJvcignY2Fubm90IGxvYWQgZXh0ZXJuYWwgc2NyaXB0IHdpdGhvdXQgdXJsIGFuZCBtb2R1bGVDb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghKDAsIG8uZGVmYXVsdCkoYywgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYS5sb2dFcnJvcignJy5jb25jYXQodCwgJyBub3Qgd2hpdGVsaXN0ZWQgZm9yIGxvYWRpbmcgZXh0ZXJuYWwgSmF2YVNjcmlwdCcpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHVbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgciAmJiAodVtlXS5sb2FkZWQgPyByKCkgOiB1W2VdLmNhbGxiYWNrcy5wdXNoKHIpKSwgdVtlXS50YWc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVbZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBbXQogICAgICAgICAgICAgICAgICAgIH0sIHIgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgciAmJiB1W2VdLmNhbGxiYWNrcy5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmxvZ1dhcm4oJ21vZHVsZSAnLmNvbmNhdCh0LCAnIGlzIGxvYWRpbmcgZXh0ZXJuYWwgSmF2YVNjcmlwdCcpKSwgZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbi50eXBlID0gJ3RleHQvamF2YXNjcmlwdCcsIG4uYXN5bmMgPSAhMCwgdVtlXS50YWcgPSBuLCBuLnJlYWR5U3RhdGUgPyBuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2FkZWQnICE9PSBuLnJlYWR5U3RhdGUgJiYgJ2NvbXBsZXRlJyAhPT0gbi5yZWFkeVN0YXRlIHx8IChuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBuLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc3JjID0gdCwgYS5pbnNlcnRFbGVtZW50KG4pLCBuOwogICAgICAgICAgICAgICAgICAgIH0oZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB1W2VdLmxvYWRlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCB1W2VdLmNhbGxiYWNrcy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbZV0uY2FsbGJhY2tzW3RdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nRXJyb3IoJ0Vycm9yIGV4ZWN1dGluZyBjYWxsYmFjaycsICdhZGxvYWRlci5qczpsb2FkRXh0ZXJuYWxTY3JpcHQnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBpLCBvID0gKGkgPSByKDMxKSkgJiYgaS5fX2VzTW9kdWxlID8gaSA6IHsgZGVmYXVsdDogaSB9LCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCAnb2JqZWN0JyAhPT0gbihlKSAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuaGFzKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgaSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGkgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIG8pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChhLmdldCB8fCBhLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgbywgYSkgOiByW29dID0gZVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KHIoNykpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHUgPSB7fSwgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2NyaXRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICdvdXRzdHJlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAnYWRhZ2lvJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzaScKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0SGlnaGVzdENwbUJpZHNGcm9tQmlkUG9vbCA9IF8sIHQuc29ydEJ5RGVhbEFuZFByaWNlQnVja2V0T3JDcG0gPSBFLCB0Lm5ld1RhcmdldGluZyA9IEksIHQudGFyZ2V0aW5nID0gdC5maWx0ZXJzID0gdC5UQVJHRVRJTkdfS0VZUyA9IHZvaWQgMCwgcigyNiksIHIoOSksIHIoMTEpLCByKDYpLCByKDEzKSwgcig0KSwgcigyKSwgcigxMDIpLCByKDE2KSwgcig4MyksIHIoMSksIHIoMyksIHIoMCksIHIoNSk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoNyksIGkgPSByKDIyKSwgbyA9IHIoODgpLCBhID0gcigxMjcpLCBzID0gcigyMTgpLCB1ID0gcig0NSksIGMgPSBmKHIoMzEpKSwgZCA9IGYocigzNykpLCBsID0gcigxMDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYiA9IHIoNyksIHkgPSByKDM2KSwgaCA9IFtdLCBTID0gT2JqZWN0LmtleXMoeS5UQVJHRVRJTkdfS0VZUykubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5LlRBUkdFVElOR19LRVlTW2VdOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdC5UQVJHRVRJTkdfS0VZUyA9IFM7CiAgICAgICAgICAgICAgICB2YXIgTyA9IHsKICAgICAgICAgICAgICAgICAgICBpc0JpZE5vdEV4cGlyZWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlc3BvbnNlVGltZXN0YW1wICsgMTAwMCAqIGUudHRsICsgMTAwMCA+ICgwLCBuLnRpbWVzdGFtcCkoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzVW51c2VkQmlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAoZS5zdGF0dXMgJiYgISgwLCBjLmRlZmF1bHQpKFt5LkJJRF9TVEFUVVMuUkVOREVSRURdLCBlLnN0YXR1cykgfHwgIWUuc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IDAsIG8gPSBbXSwgYSA9IGkuY29uZmlnLmdldENvbmZpZygnc2VuZEJpZHNDb250cm9sLmRlYWxQcmlvcml0aXphdGlvbicpLCBzID0gKDAsIG4uZ3JvdXBCeSkoZSwgJ2FkVW5pdENvZGUnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdLCB1ID0gKDAsIG4uZ3JvdXBCeSkoc1tlXSwgJ2JpZGRlckNvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucHVzaCh1W2VdLnJlZHVjZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID4gMCA/IChpID0gYSA/IGkuc29ydChFKCEwKSkgOiBpLnNvcnQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNwbSAtIGUuY3BtOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5wdXNoLmFwcGx5KG8sIG0oaS5zbGljZSgwLCByKSkpKSA6IG8ucHVzaC5hcHBseShvLCBtKGkpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSAmJiBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQuYWRzZXJ2ZXJUYXJnZXRpbmcuaGJfZGVhbCAmJiB2b2lkIDAgPT09IHIuYWRzZXJ2ZXJUYXJnZXRpbmcuaGJfZGVhbCA/IC0xIDogdm9pZCAwID09PSB0LmFkc2VydmVyVGFyZ2V0aW5nLmhiX2RlYWwgJiYgdm9pZCAwICE9PSByLmFkc2VydmVyVGFyZ2V0aW5nLmhiX2RlYWwgPyAxIDogZSA/IHIuY3BtIC0gdC5jcG0gOiByLmFkc2VydmVyVGFyZ2V0aW5nLmhiX3BiIC0gdC5hZHNlcnZlclRhcmdldGluZy5oYl9wYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgciA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZHNlcnZlclRhcmdldGluZyAmJiB0ICYmIChiLmlzQXJyYXkodCkgJiYgKDAsIGMuZGVmYXVsdCkodCwgZS5hZFVuaXRDb2RlKSB8fCAnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiBlLmFkVW5pdENvZGUgPT09IHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwID09PSBpLmNvbmZpZy5nZXRDb25maWcoJ3RhcmdldGluZ0NvbnRyb2xzLmFsd2F5c0luY2x1ZGVEZWFscycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFMuY29uY2F0KG8uTkFUSVZFX1RBUkdFVElOR19LRVlTKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfKHQsIG4uZ2V0SGlnaGVzdENwbSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZGVhbElkICYmIGEodCwgZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoe30sIHQuYWRVbml0Q29kZSwgTih0LCByLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdC5hZHNlcnZlclRhcmdldGluZ1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcCh7fSwgeS5UQVJHRVRJTkdfS0VZUywgeS5OQVRJVkVfS0VZUyksIGkgPSBPYmplY3Qua2V5cyhyKSwgbyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAoMCwgbi5sb2dJbmZvKSgnYWxsb3dUYXJnZXRpbmdLZXlzIC0gYWxsb3dlZCBrZXlzIFsgJy5jb25jYXQodC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsICcpLCAnIF0nKSksIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5rZXlzKGUpWzBdLCBhID0gZVtuXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3Qua2V5cyhlKVswXSwgYSA9IDAgPT09IGkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IG4uaW5kZXhPZihyW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCB8fCAoMCwgZC5kZWZhdWx0KSh0LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gbi5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW25dID0gIWEsIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW25dID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gT2JqZWN0LmtleXMobykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgbi5sb2dJbmZvKSgnYWxsb3dUYXJnZXRpbmdLZXlzIC0gcmVtb3ZlZCBrZXlzIFsgJy5jb25jYXQoYS5qb2luKCcsICcpLCAnIF0nKSksIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtPYmplY3Qua2V5cyhlKVswXV0ubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICgwLCBuLmRlZXBDbG9uZSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHNlcnZlclRhcmdldGluZzogcltlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuc29ydChFKCkpLnJlZHVjZShmdW5jdGlvbiAoZSwgaSwgbywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIHUgPSAocyA9IGkuYWRzZXJ2ZXJUYXJnZXRpbmcsIE9iamVjdC5rZXlzKHMpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSArICcnLmNvbmNhdCh0LCAnJTNkJykuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChzW3RdKSwgJyUyNicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICsgMSA9PT0gYS5sZW5ndGggJiYgKHUgPSB1LnNsaWNlKDAsIC0zKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGkuYWRVbml0Q29kZSwgZCA9IHUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPD0gdCA/ICh0IC09IGQsICgwLCBuLmxvZ0luZm8pKCdBZFVuaXQgXCcnLmNvbmNhdChjLCAnXCcgYXVjdGlvbiBrZXlzIGNvbXByaXNlZCBvZiAnKS5jb25jYXQoZCwgJyBjaGFyYWN0ZXJzLiAgRGVkdWN0ZWQgZnJvbSBydW5uaW5nIHRocmVzaG9sZDsgbmV3IGxpbWl0IGlzICcpLmNvbmNhdCh0KSwgcltjXSksIGVbY10gPSByW2NdKSA6ICgwLCBuLmxvZ1dhcm4pKCdUaGUgZm9sbG93aW5nIGtleXMgZm9yIGFkVW5pdENvZGUgXCcnLmNvbmNhdChjLCAnXCcgZXhjZWVkZWQgdGhlIGN1cnJlbnQgbGltaXQgb2YgdGhlIFwnYXVjdGlvbktleU1heENoYXJzXCcgc2V0dGluZy5cblRoZSBrZXktc2V0IHNpemUgd2FzICcpLmNvbmNhdChkLCAnLCB0aGUgY3VycmVudCBhbGxvdHRlZCBhbW91bnQgd2FzICcpLmNvbmNhdCh0LCAnLlxuJyksIHJbY10pLCBvICsgMSA9PT0gYS5sZW5ndGggJiYgMCA9PT0gT2JqZWN0LmtleXMoZSkubGVuZ3RoICYmICgwLCBuLmxvZ0Vycm9yKSgnTm8gYXVjdGlvbiB0YXJnZXRpbmcga2V5cyB3ZXJlIHBlcm1pdHRlZCBkdWUgdG8gdGhlIHNldHRpbmcgaW4gc2V0Q29uZmlnKHRhcmdldGluZ0NvbnRyb2xzLmF1Y3Rpb25LZXlNYXhDaGFycykuICBQbGVhc2UgcmV2aWV3IHNldHVwIGFuZCBjb25zaWRlciBhZGp1c3RpbmcuJyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoe30sIE9iamVjdC5rZXlzKGUpWzBdLCBlW09iamVjdC5rZXlzKGUpWzBdXS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyh7fSwgT2JqZWN0LmtleXMoZSlbMF0sIGVbT2JqZWN0LmtleXMoZSlbMF1dLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXModClbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyXSA9IHAoe30sIGVbcl0sIHRbcl0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIHQgPyBbdF0gOiBiLmlzQXJyYXkodCkgPyB0IDogZS5nZXRBZFVuaXRDb2RlcygpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZ2V0Qmlkc1JlY2VpdmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmNvbmZpZy5nZXRDb25maWcoJ3VzZUJpZENhY2hlJykgfHwgKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbZS5hZFVuaXRDb2RlXSA9PT0gZS5hdWN0aW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdCA9IHQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIG4uZGVlcEFjY2VzcykoZSwgJ3ZpZGVvLmNvbnRleHQnKSAhPT0gdS5BRFBPRDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Jhbm5lcicgIT09IGUubWVkaWFUeXBlIHx8ICgwLCBzLnNpemVTdXBwb3J0ZWQpKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKE8uaXNVbnVzZWRCaWQpLmZpbHRlcihPLmlzQmlkTm90RXhwaXJlZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogeyBmb3JUYXJnZXRpbmc6ICExIH0sIGkgPSB0LmdldFdpbm5pbmdCaWRzKGUsIHIsIG4pLCBvID0gQygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9IGkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyh7fSwgZS5hZFVuaXRDb2RlLCBPYmplY3Qua2V5cyhlLmFkc2VydmVyVGFyZ2V0aW5nKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlLnNlbmRTdGFuZGFyZFRhcmdldGluZyB8fCBlLnNlbmRTdGFuZGFyZFRhcmdldGluZyB8fCAtMSA9PT0gby5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbZS5hZHNlcnZlclRhcmdldGluZ1tyXV0sIGkgPSBnKHt9LCByLnN1YnN0cmluZygwLCAyMCksIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09PSB5LlRBUkdFVElOR19LRVlTLkRFQUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBnKHt9LCAnJy5jb25jYXQociwgJ18nKS5jb25jYXQoZS5iaWRkZXJDb2RlKS5zdWJzdHJpbmcoMCwgMjApLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChtKHQpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChtKHQpLCBbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFN0YW5kYXJkQmlkZGVyQWRTZXJ2ZXJUYXJnZXRpbmcoKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmtleTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY29uY2F0KFMpLmZpbHRlcihuLnVuaXF1ZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQsIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQuYWRzZXJ2ZXJUYXJnZXRpbmcpLmZpbHRlcihqKCkpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubGVuZ3RoICYmIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmFkVW5pdENvZGUgPT09IHQuYWRVbml0Q29kZSAmJiByLmFkc2VydmVyVGFyZ2V0aW5nW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHIpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuaXNBcnJheShyLmFkc2VydmVyVGFyZ2V0aW5nW2VdKSB8fCAoci5hZHNlcnZlclRhcmdldGluZ1tlXSA9IFtyLmFkc2VydmVyVGFyZ2V0aW5nW2VdXSksIHIuYWRzZXJ2ZXJUYXJnZXRpbmdbZV0gPSByLmFkc2VydmVyVGFyZ2V0aW5nW2VdLmNvbmNhdCh0LmFkc2VydmVyVGFyZ2V0aW5nW2VdKS5maWx0ZXIobi51bmlxdWVzKSwgZGVsZXRlIHQuYWRzZXJ2ZXJUYXJnZXRpbmdbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocikpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEMoKS5jb25jYXQoby5OQVRJVkVfVEFSR0VUSU5HX0tFWVMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gZS5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoe30sIGUuYWRVbml0Q29kZSwgT2JqZWN0LmtleXMoZS5hZHNlcnZlclRhcmdldGluZykuZmlsdGVyKGooKSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyh7fSwgdC5zdWJzdHJpbmcoMCwgMjApLCBbZS5hZHNlcnZlclRhcmdldGluZ1t0XV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgYy5kZWZhdWx0KShlLCB0LmFkVW5pdENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKHt9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKFAsIFtdKS5tYXAoUikuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFMuY29uY2F0KG8uTkFUSVZFX1RBUkdFVElOR19LRVlTKSwgcyA9IGkuY29uZmlnLmdldENvbmZpZygnc2VuZEJpZHNDb250cm9sLmJpZExpbWl0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfKHQsIG4uZ2V0SGlnaGVzdENwbSwgcykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSh0LCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHt9LCB0LmFkVW5pdENvZGUsIE4odCwgci5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdC5hZHNlcnZlclRhcmdldGluZ1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoe30sICcnLmNvbmNhdCh0LCAnXycpLmNvbmNhdChlLmJpZGRlckNvZGUpLnN1YnN0cmluZygwLCAyMCksIFtlLmFkc2VydmVyVGFyZ2V0aW5nW3RdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIG4uZGVlcEFjY2VzcykoZSwgeS5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBZFVuaXRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGMuZGVmYXVsdCkodCwgZS5jb2RlKSAmJiByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHt9LCBlLmNvZGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoe30sIGUsIGIuaXNBcnJheSh0W2VdKSA/IHRbZV0gOiB0W2VdLnNwbGl0KCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZXRMYXRlc3RBdWN0aW9uRm9yQWRVbml0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcltlXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5yZXNldFByZXNldFRhcmdldGluZyA9IGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgbi5pc0dwdFB1YmFkc0RlZmluZWQpKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gQSh0KSwgbyA9IGUuZ2V0QWRVbml0cygpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGMuZGVmYXVsdCkoaSwgZS5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0U2xvdHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBiLmlzRm4ocikgJiYgcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobi5jb2RlID09PSBlLmdldEFkVW5pdFBhdGgoKSB8fCBuLmNvZGUgPT09IGUuZ2V0U2xvdEVsZW1lbnRJZCgpIHx8IGIuaXNGbih0KSAmJiB0KG4uY29kZSkpICYmIGUuc2V0VGFyZ2V0aW5nKHIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdC5yZXNldFByZXNldFRhcmdldGluZ0FTVCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEEoZSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB3aW5kb3cuYXBudGFnLmdldFRhZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQua2V5d29yZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKHQua2V5d29yZHMpLCBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBjLmRlZmF1bHQpKGgsIGUudG9Mb3dlckNhc2UoKSkgfHwgKG5bZV0gPSB0LmtleXdvcmRzW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgd2luZG93LmFwbnRhZy5tb2RpZnlUYWcoZSwgeyBrZXl3b3JkczogbiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRBbGxUYXJnZXRpbmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogVCgpLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiB7IGZvclRhcmdldGluZzogITEgfSwgbyA9IEEoZSksIGEgPSB4KG8sIHQsIHIpLmNvbmNhdChEKG8sIHQpKS5jb25jYXQoaS5jb25maWcuZ2V0Q29uZmlnKCdlbmFibGVTZW5kQWxsQmlkcycpID8gayhvLCB0KSA6IGYobywgdCkpLmNvbmNhdChNKG8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBoLmluZGV4T2YoT2JqZWN0LmtleXMoZSlbMF0pICYmIChoID0gT2JqZWN0LmtleXMoZSkuY29uY2F0KGgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3Qua2V5cyhwKHt9LCB5LkRFRkFVTFRfVEFSR0VUSU5HX0tFWVMsIHkuTkFUSVZFX0tFWVMpKSwgdSA9IGkuY29uZmlnLmdldENvbmZpZygndGFyZ2V0aW5nQ29udHJvbHMuYWxsb3dUYXJnZXRpbmdLZXlzJykgfHwgczsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh1KSAmJiB1Lmxlbmd0aCA+IDAgJiYgKGEgPSB2KGEsIHUpKSwgYSA9IHcoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gaS5jb25maWcuZ2V0Q29uZmlnKCd0YXJnZXRpbmdDb250cm9scy5hdWN0aW9uS2V5TWF4Q2hhcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgJiYgKCgwLCBuLmxvZ0luZm8pKCdEZXRlY3RlZCBcJ3RhcmdldGluZ0NvbnRyb2xzLmF1Y3Rpb25LZXlNYXhDaGFyc1wnIHdhcyBhY3RpdmUgZm9yIHRoaXMgYXVjdGlvbjsgc2V0IHdpdGggYSBsaW1pdCBvZiAnLmNvbmNhdChjLCAnIGNoYXJhY3RlcnMuICBSdW5uaW5nIGNoZWNrcyBvbiBhdWN0aW9uIGtleXMuLi4nKSksIGEgPSBJKGEsIGMpKSwgby5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2VdIHx8IChhW2VdID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgYTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnNldFRhcmdldGluZ0ZvckdQVCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0U2xvdHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5maWx0ZXIodCA/IHQocikgOiAoMCwgbi5pc0FkVW5pdENvZGVNYXRjaGluZ1Nsb3QpKHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGVbdF0pLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlW3RdW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgaSAmJiAoaSA9IGkuc3BsaXQoJywnKSksIChpID0gaS5sZW5ndGggPiAxID8gW2ldIDogaSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5sb2dNZXNzYWdlKCdBdHRlbXB0aW5nIHRvIHNldCBrZXkgdmFsdWUgZm9yIHNsb3Q6ICcuY29uY2F0KHIuZ2V0U2xvdEVsZW1lbnRJZCgpLCAnIGtleTogJykuY29uY2F0KG4sICcgdmFsdWU6ICcpLmNvbmNhdChlKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0VGFyZ2V0aW5nKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmdldEJpZHNSZWNlaXZlZCA9IFQsIHQuZ2V0V2lubmluZ0JpZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogVCgpLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiB7IGZvclRhcmdldGluZzogITEgfSwgbiA9IEEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmJpZENhY2hlLmV2YWx1YXRlV2lubmluZ0JpZHMobiwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5zZXRUYXJnZXRpbmdGb3JBc3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuZ2V0QWxsVGFyZ2V0aW5nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5yZXNldFByZXNldFRhcmdldGluZ0FTVChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sb2dFcnJvcigndW5hYmxlIHRvIHJlc2V0IHRhcmdldGluZyBmb3IgQVNUJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyW2VdKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIubG9nTWVzc2FnZSgnQXR0ZW1wdGluZyB0byBzZXQgdGFyZ2V0aW5nIGZvciB0YXJnZXRJZDogJy5jb25jYXQoZSwgJyBrZXk6ICcpLmNvbmNhdCh0LCAnIHZhbHVlOiAnKS5jb25jYXQocltlXVt0XSkpLCBiLmlzU3RyKHJbZV1bdF0pIHx8IGIuaXNBcnJheShyW2VdW3RdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNlYXJjaCgvcHRbMC05XS8pIDwgMCA/IG5bdC50b1VwcGVyQ2FzZSgpXSA9IHJbZV1bdF0gOiBuW3RdID0gcltlXVt0XSwgd2luZG93LmFwbnRhZy5zZXRLZXl3b3JkcyhlLCBuLCB7IG92ZXJyaWRlS2V5VmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQXBudGFnRGVmaW5lZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5hcG50YWcgJiYgYi5pc0ZuKHdpbmRvdy5hcG50YWcuc2V0S2V5d29yZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5maWx0ZXJzID0gTzsKICAgICAgICAgICAgICAgIHZhciB3ID0gSShhLmF1Y3Rpb25NYW5hZ2VyKTsKICAgICAgICAgICAgICAgIHQudGFyZ2V0aW5nID0gdzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmVuYWJsZU92ZXJyaWRlcyA9IGYsIHQuZGlzYWJsZU92ZXJyaWRlcyA9IHAsIHQuYmlkRXhjbHVkZWQgPSBnLCB0LmJpZGRlckV4Y2x1ZGVkID0gbSwgdC5hcHBseUJpZE92ZXJyaWRlcyA9IHYsIHQuYWRkQmlkUmVzcG9uc2VIb29rID0gYiwgdC5hZGRCaWRkZXJSZXF1ZXN0c0hvb2sgPSB5LCB0LmdldENvbmZpZyA9IGgsIHQuc2Vzc2lvbkxvYWRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9kZTJiNGRiYTQ0MzhhNzU4ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZGUyYjRkYmE0NDM4YTc1OCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdzZXNzaW9uU3RvcmFnZScsICRfX19tb2NrXzQzNmQ2ZjZmOTQ3NjMyNTMuc2Vzc2lvblN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsIHQgPSBKU09OLnBhcnNlKGUuZ2V0SXRlbSgncGJqczpkZWJ1Z2dpbmcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIGYodCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZGUyYjRkYmE0NDM4YTc1OCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdzZXNzaW9uU3RvcmFnZScsICRfX19vbGRfZGUyYjRkYmE0NDM4YTc1OCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHQuYWRkQmlkZGVyUmVxdWVzdHNCb3VuZCA9IHQuYWRkQmlkUmVzcG9uc2VCb3VuZCA9IHZvaWQgMCwgcigxKSwgcigzKSwgcigwKSwgcig1KTsKICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvID0gcigyMiksIGEgPSByKDcpLCBzID0gcigyMjEpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgKDAsIGEubG9nTWVzc2FnZSkoJ0RFQlVHOiAnICsgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgYS5sb2dXYXJuKSgnREVCVUc6ICcgKyBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgIHQuYWRkQmlkUmVzcG9uc2VCb3VuZCA9IG4gPSBiLmJpbmQoZSksIHMuYWRkQmlkUmVzcG9uc2UuYmVmb3JlKG4sIDUpLCB0LmFkZEJpZGRlclJlcXVlc3RzQm91bmQgPSBpID0geS5iaW5kKGUpLCBzLmFkZEJpZGRlclJlcXVlc3RzLmJlZm9yZShpLCA1KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgcy5hZGRCaWRSZXNwb25zZS5nZXRIb29rcyh7IGhvb2s6IG4gfSkucmVtb3ZlKCksIHMuYWRkQmlkZGVyUmVxdWVzdHMuZ2V0SG9va3MoeyBob29rOiBpIH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgby5jb25maWcuc2V0Q29uZmlnKHsgZGVidWc6ICEwIH0pLCBsKCksIGQoZSksIHUoJ2JpZGRlciBvdmVycmlkZXMgZW5hYmxlZCcuY29uY2F0KHQgPyAnIGZyb20gc2Vzc2lvbicgOiAnJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICBsKCksIHUoJ2JpZGRlciBvdmVycmlkZXMgZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlLmJpZGRlciB8fCBlLmJpZGRlciA9PT0gdCkgfHwgISghZS5hZFVuaXRDb2RlIHx8IGUuYWRVbml0Q29kZSA9PT0gcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSAmJiAtMSA9PT0gZS5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZFVuaXRDb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaWRkZXInCiAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoJ2JpZGRlciBvdmVycmlkZXMgY2hhbmdlZCBcJycuY29uY2F0KHQuYWRVbml0Q29kZSwgJy8nKS5jb25jYXQodC5iaWRkZXJDb2RlLCAnXCcgJykuY29uY2F0KHIsICcuJykuY29uY2F0KG4sICcgZnJvbSBcJycpLmNvbmNhdCh0W25dLCAnLmpzXCcgdG8gXCcnKS5jb25jYXQoZVtuXSwgJ1wnJykpLCB0W25dID0gZVtuXSwgdDsKICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIG0odGhpcy5iaWRkZXJzLCByLmJpZGRlckNvZGUpID8gYygnYmlkZGVyIFwnJy5jb25jYXQoci5iaWRkZXJDb2RlLCAnXCcgZXhjbHVkZWQgZnJvbSBhdWN0aW9uIGJ5IGJpZGRlciBvdmVycmlkZXMnKSkgOiAoQXJyYXkuaXNBcnJheSh0aGlzLmJpZHMpICYmIHRoaXMuYmlkcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGcoZSwgci5iaWRkZXJDb2RlLCB0KSB8fCB2KGUsIHIsICdiaWRkZXInKTsKICAgICAgICAgICAgICAgICAgICB9KSwgZSh0LCByKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMsIG4gPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtKHIuYmlkZGVycywgZS5iaWRkZXJDb2RlKSB8fCAoYygnYmlkUmVxdWVzdCBcJycuY29uY2F0KGUuYmlkZGVyQ29kZSwgJ1wnIGV4Y2x1ZGVkIGZyb20gYXVjdGlvbiBieSBiaWRkZXIgb3ZlcnJpZGVzJykpLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoci5iaWRSZXF1ZXN0cykgJiYgbi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuYmlkUmVxdWVzdHMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5iaWRzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKHQsIGUuYmlkZGVyQ29kZSwgci5hZFVuaXRDb2RlKSB8fCB2KHQsIHIsICdiaWRSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGUobik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgncGJqczpkZWJ1Z2dpbmcnLCBKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmKGUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdwYmpzOmRlYnVnZ2luZycpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmFkZEJpZFJlc3BvbnNlQm91bmQgPSBuLCB0LmFkZEJpZGRlclJlcXVlc3RzQm91bmQgPSBpLCBvLmNvbmZpZy5nZXRDb25maWcoJ2RlYnVnZ2luZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgoZS5kZWJ1Z2dpbmcpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5teWlNb2R1bGUgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHIoMjUpLCBvID0gcig3NCksIGEgPSByKDIxKSwgcyA9IHIoMjApLCB1ID0gcig4KSwgYyA9IHIoNDQpLCBkID0gcigxMiksIGwgPSByKDE1KSwgZiA9IChuID0gcigxMCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgICAgIHZhciBwID0gKDAsIHUubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteWknLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3I6ICcjRkZGJywKICAgICAgICAgICAgICAgICAgICAgICAgYmdDb2xvcjogJyMwMDU1MDAnCiAgICAgICAgICAgICAgICAgICAgfSksIGcgPSBmLmRlZmF1bHQuTU9EVUxFUy5NWUksIG0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwsIG4gPSAoMCwgZC5kb20pKCkud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSBuID8gcC5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdObyBzdWNoIGVsZW1lbnQgXCcnICsgdC5jb2RlICsgJ1wnLiBDYW5ub3QgYWRkIGRhdGEtYWQgYXR0cmlidXRlIHRvIG5vbi1leGlzdGVudCBlbGVtZW50LicpIDogbnVsbCA9PT0gbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtYWQnKSAmJiAociA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub3JpZ2luYWxDb2RlICsgKGUuaW5jcmVtZW50YWwgPyBlLmluZGV4IDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0KSwgbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWQnLCByKSwgcC5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdBZGRpbmcgYXR0cmlidXRlIFwnZGF0YS1hZFwnIHdpdGggdmFsdWUgXCcnICsgciArICdcJyB0byBlbGVtZW50IFwnJyArIHQuY29kZSArICdcJy4nKSksIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuYXRWZXJib3NpdHkoMykubG9nSW5mbygnbW9hdFlpZWxkUmVhZHkoKSAobXlpUmVhZHkpIGZpcmVkJyksIHQgPSAhMCwgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkLmRvbSkoKS53aW5kb3cubW9hdFByZWJpZEFwaSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiAoMCwgZC5kb20pKCkud2luZG93Lm1vYXRQcmViaWRBcGkuc2xvdERhdGFBdmFpbGFibGUgJiYgKDAsIGQuZG9tKSgpLndpbmRvdy5tb2F0UHJlYmlkQXBpLnNsb3REYXRhQXZhaWxhYmxlKCkgPyB2b2lkIDAgIT09IGUgPyAocC5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdTbG90IGxldmVsIGRhdGEgYWRkZWQgdG8gb25lIHNsb3QhJyksICgwLCBkLmRvbSkoKS53aW5kb3cubW9hdFByZWJpZEFwaS5zZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdChlKSkgOiAocC5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdTbG90IGxldmVsIGRhdGEgYWRkZWQgdG8gYWxsIHNsb3RzIScpLCAoMCwgZC5kb20pKCkud2luZG93Lm1vYXRQcmViaWRBcGkuc2V0TW9hdFRhcmdldGluZ0ZvckFsbFNsb3RzKCkpIDogKCExID09PSB0ID8gcC5hdFZlcmJvc2l0eSgzKS5sb2dJbmZvKCdTbG90IGxldmVsIGRhdGEgbm90IGF2YWlsYWJsZS4gTVlJIHRhZyBoYXMgbm90IHlldCBmdWxseSByZW5kZXJlZC4nKSA6IHAuYXRWZXJib3NpdHkoMykubG9nSW5mbygnU2xvdCBsZXZlbCBkYXRhIG5vdCBhdmFpbGFibGUuIFRoaXMgVVJMIGhhcyBub3QgeWV0IGdvdHRlbiBlbm91Z2ggdHJhZmZpYyB0byBwb3B1bGF0ZSB0aGUgTVlJIHNsb3QgZGF0YS4nKSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmV4cG9zdXJlQXBpLmV4cG9zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWlSZWFkeTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1ZSVNsb3REYXRhOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmV2ZW50RW1pdHRlci5vbignYmF0Y2hTbG90c0RlZmluZWQnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmF0VmVyYm9zaXR5KDMpLmxvZ0luZm8oJ0F0dGVtcHRpbmcgdG8gZ2V0IHNsb3QgbGV2ZWwgdGFyZ2V0aW5nIGZyb20gTVlJJyksIGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgKDAsIGwuZ2V0Q29uZmlnKSgnbW9hdC55aWVsZEludGVsbGlnZW5jZScsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnBvc3RQcm9jZXNzVW5pdC5iZWZvcmUociksICgwLCBvLnJlbmRlclNjcmlwdCkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IGUuc2NyaXB0VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYmItbXlpJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgZC5kb20pKCkud2luZG93Lm1vYXRZaWVsZFJlYWR5ID0gbiwgKDAsIGQuZG9tKSgpLndpbmRvdy5zZXRNb2F0UHJlYmlkRGF0YSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlpUmVhZHk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRNWUlTbG90RGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQcm9jZXNzVW5pdEhvb2s6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCksIHYgPSBpLm1vZHVsZU1hbmFnZXIucmVnaXN0ZXIobSwgbnVsbCk7CiAgICAgICAgICAgICAgICB0Lm15aU1vZHVsZSA9IHY7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5hdXRvUHJpb3JpdHlNb2R1bGUgPSB2b2lkIDAsIHIoODMpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDI1KSwgbyA9IHIoMTAwKSwgYSA9IHIoOCksIHMgPSByKDUyKSwgdSA9IHIoMTUpLCBjID0gcigxMiksIGQgPSAobiA9IHIoMTApKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH0sIGwgPSByKDIxMik7CiAgICAgICAgICAgICAgICB2YXIgZiA9IGQuZGVmYXVsdC5NT0RVTEVTLkFVVE9fUFJJT1JJVFksIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2g6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBsLmVsZW1lbnRTb3J0KShlLCAoMCwgdS5nZXRDb25maWcpKCdwcmlvcml0eUF4aXMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAsIGMuZG9tKSgpLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgJ25vbmUnID09PSB0LnN0eWxlLmRpc3BsYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA/IChhLmJiTG9nZ2VyLmxvZ01lc3NhZ2UoJ0FkIHVuaXQgZGl2IGhhcyBhIHN0eWxlIG9mIGRpc3BsYXk6bm9uZTsuIEF1dG9wcmlvcml0aXphdGlvbiBmb3IgQmlkIFByaW9yaXR5IGhhcyBiZWVuIHR1cm5lZCBvZmYgZm9yIHRoaXMgZXZhbHVhdGlvbi4gUGxlYXNlIGVuc3VyZSB5b3VyIGRpdiBkb2VzIG5vdCBoYXZlIGEgc3R5bGUgb2YgZGlzcGxheTogbm9uZTsuJywgdCksIGUodCkpIDogZSh0LnNvcnQoaSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAoMCwgYy5kb20pKCkud2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLCBpID0gKDAsIGMuZG9tKSgpLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKSwgbyA9IG4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLCBhID0gaS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyAtIHQgLSAoYSAtIHQpID4gMCA/IDEgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHUuZ2V0Q29uZmlnKSgnYXV0b1ByaW9yaXR5JywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICgwLCBjLmRvbSkoKS53aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKDAsIGMuZG9tKSgpLndpbmRvdy5wYWdlWU9mZnNldCB8fCAoMCwgYy5kb20pKCkud2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZW5hYmxlZCAmJiAoZS5yZWZyZXNoICYmIHMuYWRTZXJ2ZXJSZXF1ZXN0LmJlZm9yZShyKSwgZS5iaWRzICYmIG8uYmlkQ2FjaGUuYXBwbHlQcmlvcml0eU9yZGVyLmFmdGVyKG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFNlcnZlclJlcXVlc3QuZ2V0SG9vayh7IGhvb2s6IHIgfSkucmVtb3ZlKCksIG8uYmlkQ2FjaGUuYXBwbHlQcmlvcml0eU9yZGVyLmdldEhvb2soeyBob29rOiBuIH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgZyA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3RlcihwKTsKICAgICAgICAgICAgICAgIHQuYXV0b1ByaW9yaXR5TW9kdWxlID0gZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnRpbWluZ3NBbmFseXRpY3NIYW5kbGVyID0gdm9pZCAwLCByKDM1MiksIHIoMzU0KSwgcigxMSksIHIoNiksIHIoMTMpLCByKDQpLCByKDE3KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1KSwgcigxMjMpLCByKDQzKSwgcigxMjQpLCByKDkpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDI1KSwgbyA9IHIoMjApLCBhID0gKG4gPSByKDEwKSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9LCBzID0gcigxNSksIHUgPSByKDEyKSwgYyA9IHIoMzU1KSwgZCA9IHIoMjEpLCBsID0gcigxOTMpLCBmID0gcig5OSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAgPSBnKCkgPyBSZWZsZWN0LmNvbnN0cnVjdCA6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW251bGxdOwogICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2guYXBwbHkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IChGdW5jdGlvbi5iaW5kLmFwcGx5KGUsIG4pKSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAmJiBtKGksIHIucHJvdG90eXBlKSwgaTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFJlZmxlY3QgfHwgIVJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9KSksICEwOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fX3Byb3RvX18gPSB0LCBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8geShPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogeShPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBPID0gYS5kZWZhdWx0Lk1PRFVMRVMsIF8gPSBPLkJJREJBUlJFTF9BTkFMWVRJQ1MsIEUgPSBPLkFOQUxZVElDU19USU1JTkdTLCBJID0gTy5HT09HTEVfUFVCTElTSEVSX1RBRywgdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSB7IGFsbG93RHVwbGljYXRlczoge30gfSwgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFBhcnRSZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1hbnVhbDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gW10sIGEgPSB7fSwgZyA9IHt9LCBtID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFbnRyeTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgPSB7fSwgeSA9IHt9LCBTID0gKDAsIGYucnVuUXVldWUpKCd0aW1pbmdzUG9zdEluaXRpYWxpemF0aW9uUXVldWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gZSwgbiA9IFtdLCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHJbaV0sIGEgPSB3KG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGEubGVuZ3RoID8gbi5wdXNoKG8pIDogdChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCB1LmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSA/ICgwLCB1LmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZShlKSA6ICduYXZpZ2F0aW9uJyA9PT0gZSAmJiAoMCwgdS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLnRpbWluZyA/IFsoMCwgdS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLnRpbWluZ10gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBlLmdldEVudHJpZXMgPyBlLmdldEVudHJpZXMoKSA6IGUsIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdyZXNvdXJjZScgPT09IGkuZW50cnlUeXBlICYmICdzY3JpcHQnID09PSBpLmluaXRpYXRvclR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5tYXRjaFBhcnRSZSAmJiByLm1hdGNoUGFydFJlLnRlc3QoaS5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodC51dGFnICYmIC8odGFnc1wudGlxY2RuXC5jb21cL3V0YWdcL2Nic2kpL2dtLnRlc3QoaS5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtLnJlcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS50aW1lciAmJiBjbGVhclRpbWVvdXQobS50aW1lcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmxhc3RFbnRyeSA9IGUsIFQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHIubWF0Y2hNYW51YWwubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHIubWF0Y2hNYW51YWwuZmluZChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWF0Y2gudGVzdChpLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiB4KGksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IDA7IG8gPCBuLmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubGFzdEVudHJ5ICYmICh4KG0ubGFzdEVudHJ5LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RpbWluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdUeXBlOiAnbWVhc3VyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVGltZSB0byBVVGFnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6ICdzY3JpcHQtdXRhZycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBtLnJlcG9ydGVkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbCwgbiA9IHQgfHwgci5pdGVtcy5maW5kKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hdGNoLnRlc3QoZS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKEMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0aW1pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ1R5cGU6ICdtYXJrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLnJlY29yZC5uYW1lICsgJyBMb2FkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6IG4ucmVjb3JkLnNsdWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBlLnJlc3BvbnNlRW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgQyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RpbWluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nVHlwZTogJ21lYXN1cmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG4ucmVjb3JkLm5hbWUgKyAnIExvYWQgRHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6ICcnLmNvbmNhdChuLnJlY29yZC5zbHVnLCAnLWR1cmF0aW9uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiBlLmR1cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkuc2x1Z01hcFtlLnNsdWddICYmICFyIHx8IGFbZS5zbHVnXSAmJiAhdC5hbGxvd0R1cGxpY2F0ZXNbZS5zbHVnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeS5zbHVnTWFwW2Uuc2x1Z10gJiYgIXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geS5zbHVnTWFwW2Uuc2x1Z107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnNsdWdSZWNvcmRbZS5zbHVnXSA9IGUsIHkuZ2F0ZXdheXNbbl0ub3BlbihlLnNsdWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlLnNsdWddID0gITAsIGdbZS5zbHVnXSA9ICdudW1iZXInID09IHR5cGVvZiBlLmFtb3VudCA/IE1hdGgucm91bmQoZS5hbW91bnQpIDogZS5hbW91bnQsIGkubW9kdWxlTWFuYWdlci52aWFNb2R1bGUoXywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5hZGRSZWNvcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFtb3VudCA9IGUuYW1vdW50LnRvRml4ZWQoMyksIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmV4cG9zdXJlQXBpLmV4cG9zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmFseXRpY3NUaW1pbmdzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2VxdWVuY2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LmdhdGV3YXlzID0ge30sIHkuc2x1Z01hcCA9IHt9LCB5LnNsdWdSZWNvcmQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5zZXF1ZW5jZXMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuc2VxdWVuY2VzW2VdLCBuID0gJ2FuYWx5dGljc1RpbWluZ1NlcScuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuZ2F0ZXdheXNbbl0gPSAoMCwgbC5nYXRld2F5KShuLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHJbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5zbHVnTWFwW3RdID0gbiwgeS5nYXRld2F5c1tuXS5vbk9wZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKHkuc2x1Z1JlY29yZFt0XSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5ldmVudHMsIHIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW3RdLCBhID0gci5yZWNvcmQsIHMgPSByLm9uY2UsIGMgPSByLmV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjLmdwdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5tb2R1bGVNYW5hZ2VyLnZpYU1vZHVsZShJLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBlLmdwdEFjdGlvbikoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdWJhZHMoKS5hZGRFdmVudExpc3RlbmVyKGMubmFtZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlt0XSB8fCAoQyhoKGgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0aW1pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ1R5cGU6ICdtYXJrJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSksIHt9LCB7IGFtb3VudDogKDAsIHUuZG9tKSgpLndpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSB9KSksIGJbdF0gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IG8uZXZlbnRFbWl0dGVyLm9uKHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKGgoaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0aW1pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdUeXBlOiAnbWFyaycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKSwge30sIHsgYW1vdW50OiAoMCwgdS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLm5vdygpIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMgfHwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCAoMCwgdS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLmdldEVudHJpZXMgJiYgKCFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWNvcmQgPSBoKGgoe30sIHIuZGVmYXVsdFJlY29yZERhdGEpLCBpLnJlY29yZCksIGkubWF0Y2hQYXJ0ID8gKHQucHVzaChpLm1hdGNoUGFydCksIGkubWF0Y2ggPSBuZXcgUmVnRXhwKCcoJy5jb25jYXQoaS5tYXRjaFBhcnQsICcpJyksICdnbScpKSA6IChpLm1hdGNoID0gcChSZWdFeHAsIHYoQXJyYXkuaXNBcnJheShpLm1hdGNoKSA/IGkubWF0Y2ggOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubWF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSksIHIubWF0Y2hNYW51YWwucHVzaChpKSksIHIuaXRlbXMucHVzaChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1hdGNoUGFydFJlID0gbmV3IFJlZ0V4cCgnKCcuY29uY2F0KHQuam9pbignfCcpLCAnKScpLCAnZ20nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuc2NyaXB0cyksIHQudXRhZyAmJiBUKCksIE8oWydyZXNvdXJjZSddLCBBKSwgKGUgPSBuZXcgYy5QZXJmb3JtYW5jZU9ic2VydmVyKEEpKS5vYnNlcnZlKHsgZW50cnlUeXBlczogWydyZXNvdXJjZSddIH0pLCBTLnJ1bigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBzLmdldENvbmZpZykoJ2FuYWx5dGljc1RpbWluZ3MnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBuLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBuW3RdKSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUaW1pbmdSZWNvcmQ6IEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbmNvbXBsZXRlRW50cnlUeXBlczogTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IEUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCksIEEgPSBpLm1vZHVsZU1hbmFnZXIucmVnaXN0ZXIodywgW19dKTsKICAgICAgICAgICAgICAgIHQudGltaW5nc0FuYWx5dGljc0hhbmRsZXIgPSBBOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDE0KSwgaSA9IHIoODApLCBvID0gcig2NSksIGEgPSByKDI3KSwgcyA9IHIoMjMpLCB1ID0gcigyNCksIGMgPSByKDM1MyksIGQgPSAocigxOCkuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0LCBsID0gdShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdLCBlKSBpbnN0YW5jZW9mIGUpOwogICAgICAgICAgICAgICAgICAgIH0pLCBmID0gIXUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBuKG4uUyArIG4uRiAqIChsIHx8IGYpLCAnUmVmbGVjdCcsIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG8oZSksIGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBlIDogbyhhcmd1bWVudHNbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiAhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZSh0WzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUodFswXSwgdFsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKHRbMF0sIHRbMV0sIHRbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZSh0WzBdLCB0WzFdLCB0WzJdLCB0WzNdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW251bGxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucHVzaC5hcHBseShuLCB0KSwgbmV3IChjLmFwcGx5KGUsIG4pKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gci5wcm90b3R5cGUsIHAgPSBpKHModSkgPyB1IDogT2JqZWN0LnByb3RvdHlwZSksIGcgPSBGdW5jdGlvbi5hcHBseS5jYWxsKGUsIHAsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhnKSA/IGcgOiBwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDY1KSwgaSA9IHIoMjMpLCBvID0gcigxOTcpLCBhID0gW10uc2xpY2UsIHMgPSB7fSwgdSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgaW4gcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCB0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2ldID0gJ2FbJyArIGkgKyAnXSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3RdID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1t0XShlLCByKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gRnVuY3Rpb24uYmluZCB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbih0aGlzKSwgciA9IGEuY2FsbChhcmd1bWVudHMsIDEpLCBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLmNvbmNhdChhLmNhbGwoYXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHMgPyB1KHQsIG4ubGVuZ3RoLCBuKSA6IG8odCwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodC5wcm90b3R5cGUpICYmIChzLnByb3RvdHlwZSA9IHQucHJvdG90eXBlKSwgczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpOwogICAgICAgICAgICAgICAgbihuLlMsICdPYmplY3QnLCB7IHNldFByb3RvdHlwZU9mOiByKDIwNSkuc2V0IH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuUGVyZm9ybWFuY2VPYnNlcnZlciA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gcigxMiksIG8gPSAobiA9IHIoMzU2KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9OwogICAgICAgICAgICAgICAgdmFyIGEgPSAoMCwgaS5kb20pKCkud2luZG93LlBlcmZvcm1hbmNlT2JzZXJ2ZXIgfHwgby5kZWZhdWx0OwogICAgICAgICAgICAgICAgdC5QZXJmb3JtYW5jZU9ic2VydmVyID0gYTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbbl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W25dLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0W25dID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0uY2FsbChpLmV4cG9ydHMsIGksIGkuZXhwb3J0cywgciksIGkubCA9ICEwLCBpLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByLm0gPSBlLCByLmMgPSB0LCByLmQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByLm8oZSwgdCkgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBuCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIHIuciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICB9LCByLnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSAmIHQgJiYgKGUgPSByKGUpKSwgOCAmIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0ICYgdCAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5yKG4pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgJ2RlZmF1bHQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAyICYgdCAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5kKG4sIGksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfSwgci5uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlICYmIGUuX19lc01vZHVsZSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRlZmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZCh0LCAnYScsIHQpLCB0OwogICAgICAgICAgICAgICAgICAgIH0sIHIubyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSwgci5wID0gJycsIHIoci5zID0gMCk7CiAgICAgICAgICAgICAgICB9KFtmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCByID0gbmV3IEFycmF5KGUubGVuZ3RoKTsgdCA8IGUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbdF0gPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSB8fCAnW29iamVjdCBBcmd1bWVudHNdJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5lbnVtZXJhYmxlID0gbi5lbnVtZXJhYmxlIHx8ICExLCBuLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIG4gJiYgKG4ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBuLmtleSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCd0aGlzIGhhc25cJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzblwndCBiZWVuIGNhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIE1hcCA/IG5ldyBNYXAoKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgKHIgPSBlLCAtMSA9PT0gRnVuY3Rpb24udG9TdHJpbmcuY2FsbChyKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmhhcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0KGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlLCBhcmd1bWVudHMsIGQodGhpcykuY29uc3RydWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFJlZmxlY3QgfHwgIVJlZmxlY3QuY29uc3RydWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJveHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLCBbXSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSA/IFJlZmxlY3QuY29uc3RydWN0IDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtudWxsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2guYXBwbHkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgKEZ1bmN0aW9uLmJpbmQuYXBwbHkoZSwgbikpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgYyhpLCByLnByb3RvdHlwZSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX19wcm90b19fID0gdCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkID0gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LmdldFByb3RvdHlwZU9mIDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgcywgdSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odGhpcywgdCksIG8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgJ29iamVjdCcgIT09IG4odCkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCA/IGEoZSkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odGhpcywgKHIgPSBkKHQpKS5jYWxsLmFwcGx5KHIsIFt0aGlzXS5jb25jYXQoaShlKSkpKSwgYyA9IHZvaWQgMCwgKHUgPSAnX2VudHJpZXMnKSBpbiAocyA9IGEobykpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIHUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHNbdV0gPSBjLCBvLl9lbnRyaWVzID0gZSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBzLCB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIHQgJiYgbnVsbCAhPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodCAmJiB0LnByb3RvdHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCAmJiBjKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBlKSwgciA9IHQsIChzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0RW50cmllcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRFbnRyaWVzQnlUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lbnRyeVR5cGUgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRFbnRyaWVzQnlOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW50cmllcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5uYW1lID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0IHx8IGUuZW50cnlUeXBlID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSAmJiBvKHIucHJvdG90eXBlLCBzKSwgdSAmJiBvKHIsIHUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KHMoQXJyYXkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5lbnVtZXJhYmxlID0gbi5lbnVtZXJhYmxlIHx8ICExLCBuLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIG4gJiYgKG4ud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCBuLmtleSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmVudW1lcmFibGUgPSBuLmVudW1lcmFibGUgfHwgITEsIG4uY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gbiAmJiAobi53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIG4ua2V5LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVhc3VyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hdmlnYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXNvdXJjZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGIgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgXCdvYnNlcnZlXCcgb24gXCdQZXJmb3JtYW5jZU9ic2VydmVyXCc6IGVpdGhlciBhbiBcJ2VudHJ5VHlwZXNcJyBvciBcJ3R5cGVcJyBtZW1iZXIgbXVzdCBiZSBwcmVzZW50LicsIHkgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgXCdvYnNlcnZlXCcgb24gXCdQZXJmb3JtYW5jZU9ic2VydmVyXCc6IGVpdGhlciBhbiBcJ2VudHJ5VHlwZXNcJyBvciBcJ3R5cGVcJyBtZW1iZXIgbXVzdCBiZSBwcmVzZW50LCBub3QgYm90aC4nLCBoID0gJ0Fib3J0aW5nIFwnb2JzZXJ2ZVwnIG9uIFwnUGVyZm9ybWFuY2VPYnNlcnZlclwnOiBubyB2YWxpZCBlbnRyeSB0eXBlcyBwcmVzZW50IGluIGVpdGhlciBcJ2VudHJ5VHlwZXNcJyBvciBcJ3R5cGVcJyBtZW1iZXIuJywgUyA9ICdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIGVudHJ5IHR5cGVzIHByb3ZpZGVkIHRvIFwnb2JzZXJ2ZVwnIG9uIFwnUGVyZm9ybWFuY2VPYnNlcnZlclwnLicsIE8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LnNvbWUoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfID0gbmV3IChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9LCByID0gdC5yZWdpc3RlcmVkT2JzZXJ2ZXJzLCBuID0gdm9pZCAwID09PSByID8gbmV3IFNldCgpIDogciwgaSA9IHQucHJvY2Vzc2VkRW50cmllcywgbyA9IHZvaWQgMCA9PT0gaSA/IG5ldyBTZXQoKSA6IGksIGEgPSB0LmludGVydmFsLCBzID0gdm9pZCAwID09PSBhID8gMTAwIDogYSwgdSA9IHQuY29udGV4dCwgYyA9IHZvaWQgMCA9PT0gdSA/IHNlbGYgOiB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMsIGUpLCBwKHRoaXMsICdyZWdpc3RlcmVkT2JzZXJ2ZXJzJywgdm9pZCAwKSwgcCh0aGlzLCAncHJvY2Vzc2VkRW50cmllcycsIHZvaWQgMCksIHAodGhpcywgJ2ludGVydmFsJywgdm9pZCAwKSwgcCh0aGlzLCAnaW50ZXJ2YWxJZCcsIHZvaWQgMCksIHAodGhpcywgJ2NvbnRleHQnLCB2b2lkIDApLCB0aGlzLnJlZ2lzdGVyZWRPYnNlcnZlcnMgPSBuLCB0aGlzLnByb2Nlc3NlZEVudHJpZXMgPSBvLCB0aGlzLmludGVydmFsID0gcywgdGhpcy5jb250ZXh0ID0gYywgdGhpcy5pbnRlcnZhbElkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBlLCAociA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0TmV3RW50cmllcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZXh0LnBlcmZvcm1hbmNlLmdldEVudHJpZXMoKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlLnByb2Nlc3NlZEVudHJpZXMuaGFzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRPYnNlcnZlcnNGb3JUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5lbnRyeVR5cGVzLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0J1ZmZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEFycmF5LmZyb20oZS5idWZmZXIpLCByID0gbmV3IGwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5idWZmZXIuY2xlYXIoKSwgdC5sZW5ndGggJiYgZS5jYWxsYmFjayAmJiBlLmNhbGxiYWNrLmNhbGwodm9pZCAwLCByLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncHJvY2Vzc0VudHJpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXROZXdFbnRyaWVzKCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuZW50cnlUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE9ic2VydmVyc0ZvclR5cGUoZS5yZWdpc3RlcmVkT2JzZXJ2ZXJzLCByKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJ1ZmZlci5hZGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnByb2Nlc3NlZEVudHJpZXMuYWRkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZWdpc3RlcmVkT2JzZXJ2ZXJzLmZvckVhY2goZS5wcm9jZXNzQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUnIGluIHRoaXMuY29udGV4dCA/IHRoaXMuY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCkgOiB0aGlzLmNvbnRleHQuc2V0VGltZW91dCh0LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYWRkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZE9ic2VydmVycy5hZGQoZSksIDEgPT09IHRoaXMucmVnaXN0ZXJlZE9ic2VydmVycy5zaXplICYmIHRoaXMub2JzZXJ2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZW1vdmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkT2JzZXJ2ZXJzLmRlbGV0ZShlKSwgdGhpcy5yZWdpc3RlcmVkT2JzZXJ2ZXJzLnNpemUgfHwgdGhpcy5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ29ic2VydmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVydmFsSWQgPSB0aGlzLmNvbnRleHQuc2V0SW50ZXJ2YWwodGhpcy5wcm9jZXNzRW50cmllcy5iaW5kKHRoaXMpLCB0aGlzLmludGVydmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGlzY29ubmVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWxJZCA9IHRoaXMuY29udGV4dC5jbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSAmJiBmKHQucHJvdG90eXBlLCByKSwgbiAmJiBmKHQsIG4pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpKSgpLCBFID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCBlKSwgbSh0aGlzLCAnY2FsbGJhY2snLCB2b2lkIDApLCBtKHRoaXMsICdidWZmZXInLCB2b2lkIDApLCBtKHRoaXMsICdlbnRyeVR5cGVzJywgW10pLCBtKHRoaXMsICd0YXNrUXVldWUnLCB2b2lkIDApLCB0aGlzLmNhbGxiYWNrID0gdCwgdGhpcy5idWZmZXIgPSBuZXcgU2V0KCksIHRoaXMudGFza1F1ZXVlID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBlLCAociA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnb2JzZXJ2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5lbnRyeVR5cGVzICYmIGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmVudHJ5VHlwZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUuZW50cnlUeXBlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBbZS50eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmZpbHRlcihPKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxlbmd0aCA+IDAgJiYgci5sZW5ndGggIT09IHQubGVuZ3RoICYmIGNvbnNvbGUud2FybihTKSwgci5sZW5ndGggPyAodGhpcy5lbnRyeVR5cGVzID0gciwgdGhpcy50YXNrUXVldWUuYWRkKHRoaXMpKSA6IGNvbnNvbGUud2FybihoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGlzY29ubmVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFza1F1ZXVlLnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndGFrZVJlY29yZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEFycmF5LmZyb20odGhpcy5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pICYmIGcodC5wcm90b3R5cGUsIHIpLCBuICYmIGcodCwgbiksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG0oRSwgJ3N1cHBvcnRlZEVudHJ5VHlwZXMnLCB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEkgPSBFLCB3ID0gJ1BlcmZvcm1hbmNlT2JzZXJ2ZXInIGluIHNlbGYgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUGVyZm9ybWFuY2VPYnNlcnZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgdC5kZWZhdWx0ID0gdyA/IFBlcmZvcm1hbmNlT2JzZXJ2ZXIgOiBJOwogICAgICAgICAgICAgICAgICAgIH1dKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnByZWJpZEFuYWx5dGljc0hhbmRsZXIgPSB2b2lkIDAsIHIoMTcpLCByKDIpLCByKDEpLCByKDMpLCByKDUpLCByKDExKSwgcigwKTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMDEpLCBpID0gYyhyKDEwKSksIG8gPSByKDIwKSwgYSA9IHIoMjUpLCBzID0gcig0NCksIHUgPSBjKHIoMTUwKSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gZChPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogZChPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwID0gKDAsIG4uZ2V0R2xvYmFsKSgpLCBnID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnYmlkZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2FkVW5pdENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZGVhbElkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3BiQ2cnLAogICAgICAgICAgICAgICAgICAgICAgICAnYmlkZGVyQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdhZElkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3RUaW1lc3RhbXAnLAogICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2VUaW1lc3RhbXAnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzTWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAndGltZVRvUmVzcG9uZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdtZWRpYVR5cGUnCiAgICAgICAgICAgICAgICAgICAgXSwgbSA9IGkuZGVmYXVsdC5NT0RVTEVTLCB2ID0gbS5QUkVCSURfSEVBREVSX0JJRERJTkcsIGIgPSBtLkJJREJBUlJFTF9BTkFMWVRJQ1MsIHkgPSBtLkFOQUxZVElDU19QUkVCSUQsIGggPSBpLmRlZmF1bHQuQU5BTFlUSUNTX1JFQ09SRF9UWVBFUywgUyA9IGguTk9fQklELCBPID0gaC5CSUQsIF8gPSBoLkJJRF9VU0VELCBFID0gaS5kZWZhdWx0LkVWRU5UUy5SRUZSRVNILCBJID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFtdLCB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJTb3VyY2U6ICdwcmViaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogdC5iaWRkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogdC5hZFVuaXRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdKSB8fCBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vbGVhbicgIT0gdHlwZW9mIHIgJiYgKHIgPSAhMCksIHIgPyBjKGwobCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyU291cmNlOiAncHJlYmlkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKDAsIHUuZGVmYXVsdCkodCwgZykpLCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogdC5jcG0udG9GaXhlZCg1KS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IGUucHVzaChsKGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclNvdXJjZTogJ3ByZWJpZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICgwLCB1LmRlZmF1bHQpKHQsIGcpKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHQuY3BtLnRvRml4ZWQoNSkudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUaW1lc3RhbXA6IHQucmVzcG9uc2VUaW1lc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LmJpZHNSZWNlaXZlZCwgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihyW2ldLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGVbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm1vZHVsZU1hbmFnZXIudmlhTW9kdWxlKGIsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmFkZFJlY29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUudHlwZSkgPyByKGUpIDogZS50eXBlID09PSBPID8gby5ldmVudEVtaXR0ZXIub24oJycuY29uY2F0KGUuYWRVbml0Q29kZSwgJy4nKS5jb25jYXQoRSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIobChsKHt9LCBlKSwge30sIHsgaW1wSWQ6IHQudGFyZ2V0aW5nLmlpZCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApIDogcihsKGwoe30sIGUpLCB7fSwgeyBpbXBJZDogKDAsIHMuZ2V0VW5pdHMpKClbZS5hZFVuaXRDb2RlXS50YXJnZXRpbmcuaWlkIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubW9kdWxlTWFuYWdlci52aWFNb2R1bGUodiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IHx8IChwLnF1ZS5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAub25FdmVudCgnbm9CaWQnLCByKSwgcC5vbkV2ZW50KCdhdWN0aW9uRW5kJywgaSksIHAub25FdmVudCgnYmlkV29uJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChwLnF1ZS5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5vZmZFdmVudCgnbm9CaWQnLCByKSwgcC5vZmZFdmVudCgnYXVjdGlvbkVuZCcsIGkpLCBwLm9mZkV2ZW50KCdiaWRXb24nLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB5CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpLCB3ID0gYS5tb2R1bGVNYW5hZ2VyLnJlZ2lzdGVyKEksIFsKICAgICAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICAgICAgdgogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgdC5wcmViaWRBbmFseXRpY3NIYW5kbGVyID0gdzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmFtYXpvbkFuYWx5dGljc0hhbmRsZXIgPSB0LmFtYXpvbkhhbmRsZXIgPSB2b2lkIDAsIHIoMTcpLCByKDMpLCByKDUpLCByKDYpLCByKDEzKSwgcig5KSwgcigxMSksIHIoMCksIHIoMSksIHIoNCksIHIoMiksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIG4sIGkgPSByKDIwKSwgbyA9IChuID0gcigxMCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfSwgYSA9IHIoMjUpLCBzID0gcigxMiksIHUgPSByKDQ0KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChuID0gbi5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgci5wdXNoLmFwcGx5KHIsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbnVsbCAhPSBhcmd1bWVudHNbdF0gPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAlIDIgPyBjKE9iamVjdChyKSwgITApLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoZSwgdCwgclt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSkgOiBjKE9iamVjdChyKSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IociwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZyA9IG8uZGVmYXVsdC5FVkVOVFMsIG0gPSBnLkhFQURFUl9CSURESU5HX1JFU1BPTlNFLCB2ID0gZy5IRUFERVJfQklERElOR19SRVFVRVNULCBiID0gZy5JREVOVElGSUVELCB5ID0gZy5SRUZSRVNILCBoID0gby5kZWZhdWx0Lk1PRFVMRVMsIFMgPSBoLkJJREJBUlJFTF9BTkFMWVRJQ1MsIE8gPSBoLkFNQVpPTl9IRUFERVJfQklERElORywgXyA9IGguQU5BTFlUSUNTX0FNQVpPTiwgRSA9IG8uZGVmYXVsdC5BTkFMWVRJQ1NfUkVDT1JEX1RZUEVTLCBJID0gRS5OT19CSUQsIHcgPSBFLkJJRCwgQSA9IEUuQklEX1VTRUQsIFQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0ID0ge30sIHIgPSAwLCBuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBudWxsLCBjID0gbywgbCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBwID0gKDAsIHMuZG9tKSgpLndpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSwgZyA9IGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9PSBBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBlW29dLCBtID0gZy5hbXpucCwgdiA9IGcuYW16bmlpZCwgYiA9IGcuYW16bmJpZCwgaCA9IGcuc2l6ZSwgTyA9IGcuc2xvdElELCBfID0gZy5tZWRpYVR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihtKSA+PSAwID8gSSA6IHcpID09PSBJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclNvdXJjZTogJ2FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXI6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGltZXN0YW1wOiBuZXcgRGF0ZSgpLmdldFRpbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFLCBUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3ZpZGVvJyA9PT0gXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IDY0MCwgVCA9IDQ4MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gZihoLnNwbGl0KCd4JykubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IHhbMF0sIFQgPSB4WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclNvdXJjZTogJ2FtYXpvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXI6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyQ29kZTogbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZElkOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogJ0JpZCBBdmFpbGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYkNnOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRpbWVzdGFtcDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVGltZXN0YW1wOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVRvUmVzcG9uZDogcCAtIG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtPXSA9IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzID0gZVtvXSkudHlwZSA9IEE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm1vZHVsZU1hbmFnZXIudmlhTW9kdWxlKFMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmFkZFJlY29yZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT09IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihzLnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLnR5cGUgPT09IHcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5ldmVudEVtaXR0ZXIub24oJycuY29uY2F0KHMuYWRVbml0Q29kZSwgJy4nKS5jb25jYXQoeSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGQoZCh7fSwgcyksIHt9LCB7IGltcElkOiBlLnRhcmdldGluZy5paWQgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAoMCwgdS5nZXRVbml0cykoKVtzLmFkVW5pdENvZGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGQoZCh7fSwgcyksIHt9LCB7IGltcElkOiByLnRhcmdldGluZy5paWQgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBtID0gMDsgbSA8IGUubGVuZ3RoOyBtKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubW9kdWxlTWFuYWdlci52aWFNb2R1bGUoTywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgdSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGkuZXZlbnRFbWl0dGVyLm9uKCcnLmNvbmNhdChPLCAnLicpLmNvbmNhdCh2KSwgZnVuY3Rpb24gKGUsIHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgbiA9ICgwLCBzLmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1ID0gaS5ldmVudEVtaXR0ZXIub24oJycuY29uY2F0KE8sICcuJykuY29uY2F0KG0pLCBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMgPSBpLmV2ZW50RW1pdHRlci5vbihiLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbicgPT09IGUucHJvdmlkZXIgJiYgbyhbdFtlLmNvZGVdXSwgQSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZVt0XSkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IF8KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LmFtYXpvbkhhbmRsZXIgPSBUOwogICAgICAgICAgICAgICAgdmFyIHggPSBhLm1vZHVsZU1hbmFnZXIucmVnaXN0ZXIoVCwgWwogICAgICAgICAgICAgICAgICAgIFMsCiAgICAgICAgICAgICAgICAgICAgTwogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICB0LmFtYXpvbkFuYWx5dGljc0hhbmRsZXIgPSB4OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQudGltaW5nc0Jvb21yID0gdm9pZCAwLCByKDE3KSwgcigyKSwgcig1KSwgcigxKSwgcigzKSwgcigwKSwgcig1NCk7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHIoMjUpLCBvID0gZChyKDEwKSksIGEgPSByKDEyKSwgcyA9IGQocigzNCkpLCB1ID0gcig4KSwgYyA9IHIoMTUpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSA9IHt9LCBvID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvW25dLCB0LmluZGV4T2YocikgPj0gMCB8fCAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG9bbl0sIHQuaW5kZXhPZihyKSA+PSAwIHx8IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCByKSAmJiAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBnID0gby5kZWZhdWx0LkFOQUxZVElDU19SRUNPUkRfREVGQVVMVFMsIG0gPSBnLlZJU1VBTExZX1JFQURZLCB2ID0gZy5JTlRFUkFDVElWRSwgYiA9IGcuRklSU1RfSU5URVJBQ1RJT04sIHkgPSBnLkZJUlNUX1BBSU5ULCBoID0gZy5GSVJTVF9DT05URU5URlVMX1BBSU5ULCBTID0gZy5QQUdFX0xPQUQsIE8gPSBnLkZJUlNUX0JZVEUsIF8gPSBvLmRlZmF1bHQuTU9EVUxFUywgRSA9IF8uQklEQkFSUkVMX0FOQUxZVElDUywgSSA9IF8uQU5BTFlUSUNTX1RJTUlOR1NfQk9PTVIsIHcgPSBfLkFOQUxZVElDU19USU1JTkdTLCBBID0gewogICAgICAgICAgICAgICAgICAgICAgICB0aW1lVG9GaXJzdEludGVyYWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBiLk5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiBiLlNMVUcKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZVRvSW50ZXJhY3RpdmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHYuTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6IHYuU0xVRwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lVG9WaXN1YWxseVJlYWR5OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtLk5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHVnOiBtLlNMVUcKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFQgPSAocChuID0ge30sIHkuU0xVRywgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiAnZmlyc3QtcGFpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB5Lk5BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6IHkuU0xVRwogICAgICAgICAgICAgICAgICAgIH0pLCBwKG4sIHkuU0xVRywgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiAnZmlyc3QtY29udGVudGZ1bC1wYWludCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGguTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgc2x1ZzogaC5TTFVHCiAgICAgICAgICAgICAgICAgICAgfSksIG4pLCB4ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgciwgbiA9IHsgdGltZW91dDogNjAwMDAgfSwgbyA9IChwKGUgPSB7fSwgbS5TTFVHLCAhMSksIHAoZSwgdi5TTFVHLCAhMSksIHAoZSwgYi5TTFVHLCAhMSksIHAoZSwgeS5TTFVHLCAhMSksIHAoZSwgaC5TTFVHLCAhMSksIHAoZSwgUy5TTFVHLCAhMSksIHAoZSwgTy5TTFVHLCAhMSksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9PSBPYmplY3QudmFsdWVzKG8pLmluZGV4T2YoITEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAoMCwgYS5kb20pKCkud2luZG93LkJPT01SOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gKDAsIHMuZGVmYXVsdCkoZSwgJ3BsdWdpbnMuQ29udGludWl0eScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAmJiBpLmlzX2NvbXBsZXRlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gaS5tZXRyaWNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCBpbiBBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChBLCBsKSAmJiAoMCwgcy5kZWZhdWx0KShjLCBsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IEFbbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuYW1vdW50ID0gY1tsXSgpLCBnKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuYmJMb2dnZXIubG9nSW5mbygnQ29udGludHVpdHkgbm90IGNvbXBsZXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0UGVyZm9ybWFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gKDAsIHMuZGVmYXVsdCkoZS5nZXRQZXJmb3JtYW5jZSgpLCAndGltaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdUeXBlOiAnbWVhc3VyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogTy5OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6IE8uU0xVRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IG0ucmVzcG9uc2VTdGFydCAtIG0ucmVxdWVzdFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogUy5OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsdWc6IFMuU0xVRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IG0uZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIC0gbS5kb21haW5Mb29rdXBFbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gKDAsIHMuZGVmYXVsdCkoZSwgJ3BsdWdpbnMuUGFpbnRUaW1pbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgdi5pc19jb21wbGV0ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiIGluIFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFQsIGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gVFtiXSwgaCA9IHkubWV0cmljTmFtZSwgXyA9IGYoeSwgWydtZXRyaWNOYW1lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmFtb3VudCA9IHYuZ2V0VGltaW5nRm9yKGgpLCBnKF8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAhPT0gT2JqZWN0LnZhbHVlcyhvKS5pbmRleE9mKCExKSAmJiAoMCwgYS5kb20pKCkud2luZG93LnBlcmZvcm1hbmNlLm5vdygpIC0gciA8IG4udGltZW91dCAmJiAociB8fCAociA9ICgwLCBhLmRvbSkoKS53aW5kb3cucGVyZm9ybWFuY2Uubm93KCkpLCB0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBjbGVhclRpbWVvdXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGUuYW1vdW50IHx8IG9bZS5zbHVnXSB8fCAob1tlLnNsdWddID0gITAsIGkubW9kdWxlTWFuYWdlci52aWFNb2R1bGUodywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgdC5hZGRUaW1pbmdSZWNvcmQpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGwoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoZSwgdCwgclt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogbChPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3RpbWluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWluZ1R5cGU6ICdtYXJrJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGEuZG9tKSgpLndpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdvbkJlZm9yZUJvb21lcmFuZ0JlYWNvbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7IG9uY2U6ICEwIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGMuZ2V0Q29uZmlnKSgnYW5hbHl0aWNzVGltaW5ncycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICgwLCBzLmRlZmF1bHQpKCgwLCBhLmRvbSkoKS53aW5kb3csICdCT09NUicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKDAsIHMuZGVmYXVsdCkoKDAsIGEuZG9tKSgpLndpbmRvdywgJ0JPT01SLnBsdWdpbnMuQ29udGludWl0eS5pc19jb21wbGV0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUoKSA/IGQoKSA6IF8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgQyA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3Rlcih4LCBbCiAgICAgICAgICAgICAgICAgICAgICAgIEUsCiAgICAgICAgICAgICAgICAgICAgICAgIHcKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgIHQudGltaW5nc0Jvb21yID0gQzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNldFN1Ym1vZHVsZVJlZ2lzdHJ5ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBDID0gZTsKICAgICAgICAgICAgICAgIH0sIHQuc2V0U3RvcmVkVmFsdWUgPSBQLCB0LnNldFN0b3JlZENvbnNlbnREYXRhID0gRCwgdC5maW5kUm9vdERvbWFpbiA9IE0sIHQucmVxdWVzdEJpZHNIb29rID0geiwgdC5hdHRhY2hJZFN5c3RlbSA9IFksIHQuaW5pdCA9IEssIHQudmFsaWRhdGVHZHByRW5mb3JjZW1lbnQgPSB0LmF1Y3Rpb25EZWxheSA9IHQuc3luY0RlbGF5ID0gdC5jb3JlU3RvcmFnZSA9IHQuUEJKU19VU0VSX0lEX09QVE9VVF9OQU1FID0gdm9pZCAwLCByKDQpLCByKDIpLCByKDYpLCByKDEzKSwgcigxMSksIHIoMSksIHIoMyksIHIoMCksIHIoNSksIHIoMTYpLCByKDkpOwogICAgICAgICAgICAgICAgdmFyIGkgPSBtKHIoMzcpKSwgbyA9IHIoMjIpLCBhID0gbShyKDYwKSksIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBuKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKGEuZ2V0IHx8IGEuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBvLCBhKSA6IHJbb10gPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIHUgPSByKDEwMSksIGMgPSByKDg3KSwgZCA9IG0ocigzNikpLCBsID0gcig2MSksIGYgPSByKDM2MSksIHAgPSByKDc1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8IG51bGwgPT0gZVtTeW1ib2wuaXRlcmF0b3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpIHx8IChlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHIgfHwgJ1NldCcgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwLCByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA+PSBlLmxlbmd0aCA/IHsgZG9uZTogITAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVbdCsrXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSwgbyA9ICEwLCBhID0gITE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4ubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gPSBlLmRvbmUsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gITAsIGkgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gfHwgbnVsbCA9PSBuLnJldHVybiB8fCBuLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHkgPSAnX3BianNfdXNlcmlkX2NvbnNlbnRfZGF0YScsIGggPSAzMDsKICAgICAgICAgICAgICAgIHQuUEJKU19VU0VSX0lEX09QVE9VVF9OQU1FID0gJ19wYmpzX2lkX29wdG91dCc7CiAgICAgICAgICAgICAgICB2YXIgUyA9ICgwLCBwLmdldENvcmVTdG9yYWdlTWFuYWdlcikoJ3VzZXJpZCcpOwogICAgICAgICAgICAgICAgdC5jb3JlU3RvcmFnZSA9IFM7CiAgICAgICAgICAgICAgICB2YXIgTywgXywgRSwgSSwgdyA9IFtdLCBBID0gITEsIFQgPSBbXSwgeCA9IFtdLCBDID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuY29uZmlnLnN0b3JhZ2UsIG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnN1Ym1vZHVsZS5kb21haW5PdmVycmlkZSA/IGUuc3VibW9kdWxlLmRvbWFpbk92ZXJyaWRlKCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcy5pc1BsYWluT2JqZWN0KHQpID8gSlNPTi5zdHJpbmdpZnkodCkgOiB0LCBvID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIDg2NDAwMDAwICogci5leHBpcmVzKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAnY29va2llJyA9PT0gci50eXBlID8gKFMuc2V0Q29va2llKHIubmFtZSwgaSwgbywgJ0xheCcsIG4pLCAnbnVtYmVyJyA9PSB0eXBlb2Ygci5yZWZyZXNoSW5TZWNvbmRzICYmIFMuc2V0Q29va2llKCcnLmNvbmNhdChyLm5hbWUsICdfbGFzdCcpLCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksIG8sICdMYXgnLCBuKSkgOiAnaHRtbDUnID09PSByLnR5cGUgJiYgKFMuc2V0RGF0YUluTG9jYWxTdG9yYWdlKCcnLmNvbmNhdChyLm5hbWUsICdfZXhwJyksIG8pLCBTLnNldERhdGFJbkxvY2FsU3RvcmFnZShyLm5hbWUsIGVuY29kZVVSSUNvbXBvbmVudChpKSksICdudW1iZXInID09IHR5cGVvZiByLnJlZnJlc2hJblNlY29uZHMgJiYgUy5zZXREYXRhSW5Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KHIubmFtZSwgJ19sYXN0JyksIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcy5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCBuID0gciA/ICcnLmNvbmNhdChlLm5hbWUsICdfJykuY29uY2F0KHIpIDogZS5uYW1lOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY29va2llJyA9PT0gZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gUy5nZXRDb29raWUobik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2h0bWw1JyA9PT0gZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFMuZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KGUubmFtZSwgJ19leHAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJyA9PT0gaSA/IHQgPSBTLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKG4pIDogaSAmJiBuZXcgRGF0ZShpKS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpID4gMCAmJiAodCA9IGRlY29kZVVSSUNvbXBvbmVudChTLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKG4pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgJ3snID09PSB0LmNoYXJBdCgwKSAmJiAodCA9IEpTT04ucGFyc2UodCkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcy5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudFN0cmluZzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIGdkcHJBcHBsaWVzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBpVmVyc2lvbjogMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKHQuY29uc2VudFN0cmluZyA9IGUuY29uc2VudFN0cmluZywgdC5nZHByQXBwbGllcyA9IGUuZ2RwckFwcGxpZXMsIHQuYXBpVmVyc2lvbiA9IGUuYXBpVmVyc2lvbiksIHMuY3lyYjUzSGFzaChKU09OLnN0cmluZ2lmeSh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCAqIGgpLnRvVVRDU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFMuc2V0Q29va2llKHksIFIoZSksIHQsICdMYXgnKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaygpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5nZXRDb29raWUoeSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE4oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICdib29sZWFuJyA9PSB0eXBlb2YgZS5nZHByQXBwbGllcyAmJiBlLmdkcHJBcHBsaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5jb25zZW50U3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IGUuYXBpVmVyc2lvbiAmJiAhMSA9PT0gcy5kZWVwQWNjZXNzKGUsICd2ZW5kb3JEYXRhLnB1cnBvc2VDb25zZW50cy4xJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiA9PT0gZS5hcGlWZXJzaW9uICYmICExID09PSBzLmRlZXBBY2Nlc3MoZSwgJ3ZlbmRvckRhdGEucHVycG9zZS5jb25zZW50cy4xJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFTLmNvb2tpZXNBcmVFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuID0gZS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgIGlmICgyID09IG4ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IC0yLCBvID0gJ19yZGMnLmNvbmNhdChEYXRlLm5vdygpKSwgYSA9ICd3cml0ZWFibGUnOwogICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG4uc2xpY2UoaSkuam9pbignLicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG5ldyBEYXRlKHMudGltZXN0YW1wKCkgKyAxMDAwMCkudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgUy5zZXRDb29raWUobywgYSwgdSwgJ0xheCcsIHQsIHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gUy5nZXRDb29raWUobywgdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9PT0gYSA/IChyID0gITEsIFMuc2V0Q29va2llKG8sICcnLCAnVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQnLCB2b2lkIDAsIHQsIHZvaWQgMCkpIDogKGkgKz0gLTEsIHIgPSBNYXRoLmFicyhpKSA8PSBuLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHQgJiYgKHIgPSBzLmRlbGF5RXhlY3V0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF8pLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5sZW5ndGgpKSwgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbGJhY2soZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyAoZS5jb25maWcuc3RvcmFnZSAmJiBQKGUsIHQpLCBlLmlkT2JqID0gZS5zdWJtb2R1bGUuZGVjb2RlKHQsIGUuY29uZmlnKSkgOiBzLmxvZ0luZm8oJycuY29uY2F0KCdVc2VyIElEJywgJzogJykuY29uY2F0KGUuc3VibW9kdWxlLm5hbWUsICcgLSByZXF1ZXN0IGlkIHJlc3BvbmRlZCB3aXRoIGFuIGVtcHR5IHZhbHVlJykpLCByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmNhbGxiYWNrID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoZSkgJiYgZS5sZW5ndGggPyBlLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5pc1BsYWluT2JqZWN0KGUuaWRPYmopICYmIE9iamVjdC5rZXlzKGUuaWRPYmopLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQuaWRPYmopLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0gPSB0LmlkT2JqW3JdOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSkgOiB7fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gTyAmJiAoTyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEcoZSwgdCksIGkgPSBuLnVzZXJJZE1vZHVsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4uaGFzVmFsaWRhdGVkICYmICFOKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMubG9nV2FybignJy5jb25jYXQoJ1VzZXIgSUQnLCAnIC0gZ2RwciBwZXJtaXNzaW9uIG5vdCB2YWxpZCBmb3IgbG9jYWwgc3RvcmFnZSBvciBjb29raWVzLCBleGl0IG1vZHVsZScpKSwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5yZWR1Y2UoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVyhuLCB0LCByLCAhMSksIGUucHVzaChuKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShULCBjLmdkcHJEYXRhSGFuZGxlci5nZXRDb25zZW50RGF0YSgpKSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmlzRm4oZS5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIEkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gITEsIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IChuID0gITAsIGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sb2dJbmZvKCcnLmNvbmNhdCgnVXNlciBJRCcsICcgLSBhdWN0aW9uIGRlbGF5ZWQgYnkgJykuY29uY2F0KEksICcgYXQgbW9zdCB0byBmZXRjaCBpZHMnKSksIF8gPSBzZXRUaW1lb3V0KGksIEkpLCBVKHIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmRlZmF1bHQub24oZC5kZWZhdWx0LkVWRU5UUy5BVUNUSU9OX0VORCwgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kZWZhdWx0Lm9mZihkLmRlZmF1bHQuRVZFTlRTLkFVQ1RJT05fRU5ELCBlKSwgRSA+IDAgPyBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEUpIDogVShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlICYmICF0ICYmIGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIEwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghW2VdLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KGUpIHx8ICFlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gQih0KSwgbiA9ICgwLCBmLmNyZWF0ZUVpZHNBcnJheSkocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocikubGVuZ3RoICYmIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgJiYgcy5pc0FycmF5KGUuYmlkcykgJiYgZS5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudXNlcklkID0gciwgZS51c2VySWRBc0VpZHMgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSh0LmFkVW5pdHMgfHwgKDAsIHUuZ2V0R2xvYmFsKSgpLmFkVW5pdHMsIE8pLCBlLmNhbGwodGhpcywgdCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBMKCksIEIoTyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBMKCksICgwLCBmLmNyZWF0ZUVpZHNBcnJheSkoQihPKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUgPyBlLnN1Ym1vZHVsZU5hbWVzIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICByIHx8IChyID0gW10pLCBMKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLmdkcHJEYXRhSGFuZGxlci5nZXRDb25zZW50RGF0YSgpLCBuID0gaygpOwogICAgICAgICAgICAgICAgICAgICAgICBEKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IEcoVCwgZSksIG8gPSBpLnVzZXJJZE1vZHVsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmhhc1ZhbGlkYXRlZCB8fCBOKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgdSA9IFtdLCBkID0gdihvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChkLnMoKTsgIShhID0gZC5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gYS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sZW5ndGggPiAwICYmIC0xID09PSByLmluZGV4T2YobC5zdWJtb2R1bGUubmFtZSkgfHwgKHMubG9nSW5mbygnJy5jb25jYXQoJ1VzZXIgSUQnLCAnIC0gcmVmcmVzaGluZyAnKS5jb25jYXQobC5zdWJtb2R1bGUubmFtZSkpLCBXKGwsIGUsIG4sICEwKSwgcy5pc0ZuKGwuY2FsbGJhY2spICYmIHUucHVzaChsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Lmxlbmd0aCA+IDAgJiYgVSh1KSwgdCAmJiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxvZ1dhcm4oJycuY29uY2F0KCdVc2VyIElEJywgJyAtIGdkcHIgcGVybWlzc2lvbiBub3QgdmFsaWQgZm9yIGxvY2FsIHN0b3JhZ2Ugb3IgY29va2llcywgZXhpdCBtb2R1bGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuc3luY0RlbGF5ID0gRSwgdC5hdWN0aW9uRGVsYXkgPSBJOwogICAgICAgICAgICAgICAgdmFyIEcgPSAoMCwgbC5ob29rKSgnc3luYycsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkTW9kdWxlczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFzVmFsaWRhdGVkOiB0ICYmIHQuaGFzVmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sICd2YWxpZGF0ZUdkcHJFbmZvcmNlbWVudCcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gVyhlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuY29uZmlnLnN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8gPSBqKGUuY29uZmlnLnN0b3JhZ2UpLCBhID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PSB0eXBlb2YgZS5jb25maWcuc3RvcmFnZS5yZWZyZXNoSW5TZWNvbmRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG5ldyBEYXRlKGooZS5jb25maWcuc3RvcmFnZSwgJ2xhc3QnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdSAmJiBEYXRlLm5vdygpIC0gdS5nZXRUaW1lKCkgPiAxMDAwICogZS5jb25maWcuc3RvcmFnZS5yZWZyZXNoSW5TZWNvbmRzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICFvIHx8IGEgfHwgbiB8fCAhZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGUgfHwgZSA9PT0gUih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfShyLCB0KSA/IGkgPSBlLnN1Ym1vZHVsZS5nZXRJZChlLmNvbmZpZywgdCwgbykgOiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnN1Ym1vZHVsZS5leHRlbmRJZCAmJiAoaSA9IGUuc3VibW9kdWxlLmV4dGVuZElkKGUuY29uZmlnLCB0LCBvKSksIHMuaXNQbGFpbk9iamVjdChpKSAmJiAoaS5pZCAmJiAoUChlLCBpLmlkKSwgbyA9IGkuaWQpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBpLmNhbGxiYWNrICYmIChlLmNhbGxiYWNrID0gaS5jYWxsYmFjaykpLCBvICYmIChlLmlkT2JqID0gZS5zdWJtb2R1bGUuZGVjb2RlKG8sIGUuY29uZmlnKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNvbmZpZy52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLmlkT2JqID0gZS5jb25maWcudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlLnN1Ym1vZHVsZS5nZXRJZChlLmNvbmZpZywgdCwgdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcy5pc1BsYWluT2JqZWN0KGMpICYmICgnZnVuY3Rpb24nID09IHR5cGVvZiBjLmNhbGxiYWNrICYmIChlLmNhbGxiYWNrID0gYy5jYWxsYmFjayksIGMuaWQgJiYgKGUuaWRPYmogPSBlLnN1Ym1vZHVsZS5kZWNvZGUoYy5pZCwgZS5jb25maWcpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdCB8fCBzLmlzRW1wdHlTdHIodC5uYW1lKSB8fCAoIXQuc3RvcmFnZSB8fCBzLmlzRW1wdHlTdHIodC5zdG9yYWdlLnR5cGUpIHx8IHMuaXNFbXB0eVN0cih0LnN0b3JhZ2UubmFtZSkgfHwgLTEgPT09IHIuaW5kZXhPZih0LnN0b3JhZ2UudHlwZSkgPyBzLmlzUGxhaW5PYmplY3QodC52YWx1ZSkgPyBlLnB1c2godCkgOiB0LnN0b3JhZ2UgfHwgdC52YWx1ZSB8fCBlLnB1c2godCkgOiBlLnB1c2godCkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkgOiBbXTsKICAgICAgICAgICAgICAgICAgICB9KHgsIDAsIHcpOwogICAgICAgICAgICAgICAgICAgIGlmIChlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgwLCBpLmRlZmF1bHQpKFQsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZSA9PT0gZS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBUID0gdC5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gKDAsIGkuZGVmYXVsdCkoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYW1lID09PSB0Lm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZpbmRSb290RG9tYWluID0gTSwgciA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRPYmo6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhQSAmJiBULmxlbmd0aCAmJiAoKDAsIHUuZ2V0R2xvYmFsKSgpLnJlcXVlc3RCaWRzLmJlZm9yZSh6LCA0MCksIHMubG9nSW5mbygnJy5jb25jYXQoJ1VzZXIgSUQnLCAnIC0gdXNlcnN5bmMgY29uZmlnIHVwZGF0ZWQgZm9yICcpLmNvbmNhdChULmxlbmd0aCwgJyBzdWJtb2R1bGVzOiAnKSwgVC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN1Ym1vZHVsZS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIEEgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWShlKSB7CiAgICAgICAgICAgICAgICAgICAgKDAsIGkuZGVmYXVsdCkoQywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZSA9PT0gZS5uYW1lOwogICAgICAgICAgICAgICAgICAgIH0pIHx8IChDLnB1c2goZSksIEgoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBLKGUpIHsKICAgICAgICAgICAgICAgICAgICBUID0gW10sIHggPSBbXSwgQSA9ICExLCBPID0gdm9pZCAwLCAtMSAhPT0gKHcgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIFMubG9jYWxTdG9yYWdlSXNFbmFibGVkKCkgPyAnaHRtbDUnIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgUy5jb29raWVzQXJlRW5hYmxlZCgpID8gJ2Nvb2tpZScgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGU7CiAgICAgICAgICAgICAgICAgICAgfSkpLmluZGV4T2YoJ2Nvb2tpZScpICYmIFMuZ2V0Q29va2llKCdfcGJqc19pZF9vcHRvdXQnKSA/IHMubG9nSW5mbygnJy5jb25jYXQoJ1VzZXIgSUQnLCAnIC0gb3B0LW91dCBjb29raWUgZm91bmQsIGV4aXQgbW9kdWxlJykpIDogLTEgIT09IHcuaW5kZXhPZignaHRtbDUnKSAmJiBTLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKCdfcGJqc19pZF9vcHRvdXQnKSA/IHMubG9nSW5mbygnJy5jb25jYXQoJ1VzZXIgSUQnLCAnIC0gb3B0LW91dCBsb2NhbFN0b3JhZ2UgZm91bmQsIGV4aXQgbW9kdWxlJykpIDogKGUuZ2V0Q29uZmlnKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS51c2VyU3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgciAmJiByLnVzZXJJZHMgJiYgKHggPSByLnVzZXJJZHMsIHQuc3luY0RlbGF5ID0gRSA9IHMuaXNOdW1iZXIoci5zeW5jRGVsYXkpID8gci5zeW5jRGVsYXkgOiA1MDAsIHQuYXVjdGlvbkRlbGF5ID0gSSA9IHMuaXNOdW1iZXIoci5hdWN0aW9uRGVsYXkpID8gci5hdWN0aW9uRGVsYXkgOiAwLCBIKCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgdS5nZXRHbG9iYWwpKCkuZ2V0VXNlcklkcyA9IFYsICgwLCB1LmdldEdsb2JhbCkoKS5nZXRVc2VySWRzQXNFaWRzID0gRiwgKDAsIHUuZ2V0R2xvYmFsKSgpLnJlZnJlc2hVc2VySWRzID0gcSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnZhbGlkYXRlR2RwckVuZm9yY2VtZW50ID0gRywgSyhvLmNvbmZpZyksICgwLCBsLm1vZHVsZSkoJ3VzZXJJZCcsIFkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByKDQpLCByKDIpLCByKDYpLCByKDMwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuY3JlYXRlRWlkc0FycmF5ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNPd25Qcm9wZXJ0eShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdwdWJQcm92aWRlZElkJyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0LmNvbmNhdChlLnB1YlByb3ZpZGVkSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMoZVtyXSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiB0LnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9LCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT09IG4oZSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbygpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuaGFzKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgaSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGkgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIGEpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgKHMuZ2V0IHx8IHMuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBhLCBzKSA6IHJbYV0gPSBlW2FdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KHIoNykpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgaW50ZW50SXFJZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpbnRlbnRpcS5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcHViY2lkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3B1YmNpZC5vcmcnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdGRpZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdhZHNlcnZlci5vcmcnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlkRXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBydGlQYXJ0bmVyOiAnVERJRCcgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaWQ1aWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51aWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2lkNS1zeW5jLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRVaWRFeHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBhcnJhYmxlSWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAncGFycmFibGUuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZWlkID8gZS5laWQgOiBlLmNjcGFPcHRvdXQgPyAnJyA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVpZEV4dDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaS5waWNrKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWJhT3B0b3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2NwYU9wdG91dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHQpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpZGxfZW52OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2xpdmVyYW1wLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBsaXBiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubGlwYmlkOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdsaXZlaW50ZW50LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRFaWRFeHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlLnNlZ21lbnRzKSAmJiBlLnNlZ21lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNlZ21lbnRzOiBlLnNlZ21lbnRzIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJyaXRlcG9vbGlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2JyaXRlcG9vbC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbG90YW1lUGFub3JhbWFJZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdjcndkY250cmwubmV0JywKICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNyaXRlb0lkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2NyaXRlby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVya2xlSWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnbWVya2xlaW5jLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBuZXRJZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICduZXRpZC5kZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzaGFyZWRpZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdzaGFyZWRpZC5vcmcnLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlkRXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS50aGlyZCA/IHsgdGhpcmQ6IGUudGhpcmQgfSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgSURQOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3plb3RhcC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaGFsb0lkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2F1ZGlnZW50LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBxdWFudGNhc3RJZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdxdWFudGNhc3QuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlkeDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpZHgubGF0JywKICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICd2ZXJpem9ubWVkaWEuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZhYnJpY2tJZDogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICduZXVzdGFyLmJpeicsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0YXBhZElkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3RhcGFkLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gYVt0XTsKICAgICAgICAgICAgICAgICAgICBpZiAociAmJiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIG4uc291cmNlID0gci5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gaS5pc0ZuKHIuZ2V0VmFsdWUpID8gci5nZXRWYWx1ZShlKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmlzU3RyKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogci5hdHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmlzRm4oci5nZXRVaWRFeHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSByLmdldFVpZEV4dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChzLmV4dCA9IHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4udWlkcyA9IFtzXSwgaS5pc0ZuKHIuZ2V0RWlkRXh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gci5nZXRFaWRFeHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiAobi5leHQgPSBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigxKSwgcigzKSwgcigwKSwgcig2KSwgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnB1YkNvbW1vbklkU3VibW9kdWxlID0gdm9pZCAwLCByKDQpLCByKDIpLCByKDE2KSwgcigxMDIpLCByKDkpOwogICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSB1KGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgaSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKG8uZ2V0IHx8IG8uc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBpLCBvKSA6IHJbaV0gPSBlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIGkgPSByKDYxKSwgbyA9IHIoNzUpLCBhID0gcigxMDMpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYyA9ICdQdWJsaXNoZXJDb21tb25JZCcsIGQgPSAoMCwgby5nZXRTdG9yYWdlTWFuYWdlcikoODg3LCAncHViQ29tbW9uSWQnKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuc3RvcmFnZS5uYW1lICsgJ19zaGFyZWRpZCcsIGkgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgODY0MDAwMDAgKiBkLmV4cGlyZXMpLnRvVVRDU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29va2llJyA9PT0gZS5zdG9yYWdlLnR5cGUgPyBkLmNvb2tpZXNBcmVFbmFibGVkKCkgJiYgZC5zZXRDb29raWUociwgdCwgaSwgJ0xBWCcsIG0uZG9tYWluT3ZlcnJpZGUoKSkgOiAnaHRtbDUnID09PSBlLnN0b3JhZ2UudHlwZSAmJiBkLmhhc0xvY2FsU3RvcmFnZSgpICYmIChkLnNldERhdGFJbkxvY2FsU3RvcmFnZSgnJy5jb25jYXQociwgJ19leHAnKSwgaSksIGQuc2V0RGF0YUluTG9jYWxTdG9yYWdlKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbi5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3RvcmFnZS5uYW1lICsgJ19zaGFyZWRpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY29va2llJyA9PT0gZS5zdG9yYWdlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmNvb2tpZXNBcmVFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5nZXRDb29raWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ2h0bWw1JyA9PT0gZS5zdG9yYWdlLnR5cGUgJiYgZC5oYXNMb2NhbFN0b3JhZ2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBkLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKCcnLmNvbmNhdCh0LCAnX2V4cCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKHIpLmdldFRpbWUoKSAtIERhdGUubm93KCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBKU09OLnBhcnNlKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ0luZm8oJ1B1YkNvbW1vbklkOiBHZW5lcmF0ZWQgU2hhcmVkSWQ6ICcgKyBvLnNoYXJlZElkKSwgby5zaGFyZWRJZCAmJiAoJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAhPT0gby5zaGFyZWRJZCA/IGwociwgby5zaGFyZWRJZCkgOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3RvcmFnZS5uYW1lICsgJ19zaGFyZWRpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvb2tpZScgPT09IGUuc3RvcmFnZS50eXBlID8gZC5jb29raWVzQXJlRW5hYmxlZCgpICYmIGQuc2V0Q29va2llKHQsICcnLCAnVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQnKSA6ICdodG1sNScgPT09IGUuc3RvcmFnZS50eXBlICYmIChkLnJlbW92ZURhdGFGcm9tTG9jYWxTdG9yYWdlKCcnLmNvbmNhdCh0LCAnX2V4cCcpKSwgZC5yZW1vdmVEYXRhRnJvbUxvY2FsU3RvcmFnZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyKSksIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ0luZm8oJ1B1YkNvbW1vbklkOiBmYWlsZWQgdG8gZ2V0IHNoYXJlZGlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgdCgpLCAoMCwgYS5hamF4KShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Jvb2xlYW4nID09IHR5cGVvZiBlLmdkcHJBcHBsaWVzICYmIGUuZ2RwckFwcGxpZXMgPyAnJy5jb25jYXQoJ2h0dHBzOi8vaWQuc2hhcmVkaWQub3JnL2lkJywgJz9nZHByPTEmZ2Rwcl9jb25zZW50PScpLmNvbmNhdChlLmNvbnNlbnRTdHJpbmcpIDogJ2h0dHBzOi8vaWQuc2hhcmVkaWQub3JnL2lkJzsKICAgICAgICAgICAgICAgICAgICAgICAgfShuKSwgcChlLCBpLCByKSwgdm9pZCAwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG0gPSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3B1YkNvbW1vbklkJywKICAgICAgICAgICAgICAgICAgICBndmxpZDogODg3LAogICAgICAgICAgICAgICAgICAgIG1ha2VDYWxsYmFjazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLnBhcnNlVXJsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZWFyY2guaWQgPSBlbmNvZGVVUklDb21wb25lbnQoJ3B1YmNpZDonICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4uYnVpbGRVcmwocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udHJpZ2dlclBpeGVsKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsgcHViY2lkOiBlIH0sIG4gPSB0LnBhcmFtcywgaSA9IChuID0gdm9pZCAwID09PSBuID8ge30gOiBuKS5lbmFibGVTaGFyZWRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gaSAmJiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGYodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChyLnNoYXJlZGlkID0geyBpZDogbyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldElkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdm9pZCAwLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDAsIGkgPSBlLnBhcmFtcywgbyA9IChpID0gdm9pZCAwID09PSBpID8ge30gOiBpKS5jcmVhdGUsIGEgPSB2b2lkIDAgPT09IG8gfHwgbywgcyA9IGkucGl4ZWxVcmwsIGQgPSBpLmVuYWJsZVNoYXJlZElkLCBsID0gdm9pZCAwICE9PSBkICYmIGQsIGYgPSByOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHUod2luZG93W2NdKSAmJiAoZiA9IHdpbmRvd1tjXS5nZXRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgfHwgKGYgPSBhICYmIG4uaGFzRGV2aWNlQWNjZXNzKCkgPyBuLmdlbmVyYXRlVVVJRCgpIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMubWFrZUNhbGxiYWNrKHMsIGYpLCBtID0gbCA/IGcoZiwgcCwgZSwgdCkgOiBwOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogbQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kSWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9LCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB2b2lkIDAsIHIgPSBlLnBhcmFtcywgbiA9IChyID0gdm9pZCAwID09PSByID8ge30gOiByKS5leHRlbmQsIGkgPSB2b2lkIDAgIT09IG4gJiYgbiwgbyA9IHIucGl4ZWxVcmwsIGEgPSByLmVuYWJsZVNoYXJlZElkLCBzID0gdm9pZCAwICE9PSBhICYmIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PT0gdSh3aW5kb3dbY10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChzICYmIGwoZSwgZihlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLm1ha2VDYWxsYmFjayhvLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjYWxsYmFjazogZCB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgJiYgbChlLCBmKGUpKSwgeyBpZDogdCB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkb21haW5PdmVycmlkZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlLCB0LCByID0gZG9jdW1lbnQuZG9tYWluLnNwbGl0KCcuJyksIG4gPSAnX2dkJy5jb25jYXQoRGF0ZS5ub3coKSksIGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLnNsaWNlKGkpLmpvaW4oJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLnNldENvb2tpZShuLCAnMScsIHZvaWQgMCwgdm9pZCAwLCBvKSwgdCA9IGQuZ2V0Q29va2llKG4pLCBkLnNldENvb2tpZShuLCAnJywgJ1RodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UJywgdm9pZCAwLCBvKSwgJzEnICE9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LnB1YkNvbW1vbklkU3VibW9kdWxlID0gbSwgKDAsIGkuc3VibW9kdWxlKSgndXNlcklkJywgbSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5wcmViaWRVc2VySWQgPSB2b2lkIDAsIHIoMTEpLCByKDApLCByKDYpLCByKDEzKSwgcigxKSwgcig0KSwgcigyKSwgcig5KTsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxNSksIGkgPSByKDI1KSwgbyA9IHIoMjApLCBhID0gdihyKDE1MSkpLCBzID0gcig3MyksIHUgPSB2KHIoMzY0KSksIGMgPSB2KHIoMjkpKSwgZCA9IHYocigzNCkpLCBsID0gcigzNSksIGYgPSByKDgpLCBwID0gdihyKDEwKSksIGcgPSB2KHIoMTIwKSksIG0gPSByKDU1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGggPSBwLmRlZmF1bHQuTU9EVUxFUywgUyA9IGguT1BUQU5PTiwgTyA9IGguUFJFQklEX1VTRVJfSUQsIF8gPSAoMCwgZi5sb2dnZXIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3VzZXJJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogJyNGRkYnLAogICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yOiAnI0VCNTE2MCcKICAgICAgICAgICAgICAgICAgICB9KSwgRSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gKF8ubG9nSW5mbygnQXBwbHlpbmcgVXNlciBJRCBjb25maWdzJywgZSksIHIoKSkgOiAoXy5sb2dJbmZvKCdSZW1vdmluZyBVc2VyIElEIGNvbmZpZ3MnLCBlKSwgZigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby50ZW1wbGF0ZSAmJiBvLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAoMCwgdS5kZWZhdWx0KShKU09OLnN0cmluZ2lmeShvKSksIGwgPSBKU09OLnBhcnNlKGQoeyBjb250ZXh0OiBhLmRlZmF1bHQgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gKDAsIGMuZGVmYXVsdCkoe30sIGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGkobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZW5hYmxlZCAmJiBwICYmICghMCA9PT0gKDAsIG4uZ2V0Q29uZmlnKSgnY29uc2VudCcpIHx8IHZvaWQgMCA9PT0gKDAsIG4uZ2V0Q29uZmlnKSgnY29uc2VudCcpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby50ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAoMCwgdS5kZWZhdWx0KShKU09OLnN0cmluZ2lmeShvKSksIHkgPSBKU09OLnBhcnNlKHYoeyBjb250ZXh0OiBhLmRlZmF1bHQgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICgwLCBjLmRlZmF1bHQpKHt9LCB5LCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby50cmFja0NoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gcy5zdG9yYWdlLmdldExvY2FsU3RvcmFnZSgnJy5jb25jYXQoby51c2VyU3luY0NvbmZpZy5zdG9yYWdlLm5hbWUsICcubWV0YScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgZy5kZWZhdWx0KShoLCBvLnVzZXJTeW5jQ29uZmlnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggfHwgcy5zdG9yYWdlLnNldExvY2FsU3RvcmFnZSgnJy5jb25jYXQoby51c2VyU3luY0NvbmZpZy5zdG9yYWdlLm5hbWUsICcubWV0YScpLCBvLnVzZXJTeW5jQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSAhby5zaG91bGRSZWZyZXNoIHx8ICgwLCBtLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnNob3VsZFJlZnJlc2goaCwgby51c2VyU3luY0NvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXy5sb2dFcnJvciwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyAmJiAoXy5sb2dJbmZvKCdJZGVudGl0eSBjb25maWcgY2hhbmdlIGRldGVjdGVkLiBSZWZyZXNoaW5nIHVzZXIgaWQgZm9yICcuY29uY2F0KHQpLCBvKSwgZih0LCAhMSksIHMuc3RvcmFnZS5zZXRMb2NhbFN0b3JhZ2UoJycuY29uY2F0KG8udXNlclN5bmNDb25maWcuc3RvcmFnZS5uYW1lLCAnLm1ldGEnKSwgby51c2VyU3luY0NvbmZpZykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gKDAsIG4uZ2V0Q29uZmlnKSgncHJlYmlkLnBianNDb25maWcudXNlclN5bmMudXNlcklkcycpLCBFID0gTyA/IE8uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmFtZSAhPT0gby51c2VyU3luY0NvbmZpZy5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sb2dJbmZvKCdVcGRhdGluZyBVc2VyIElEJywgby51c2VyU3luY0NvbmZpZyksICgwLCBuLnNldENvbmZpZykoJ3ByZWJpZC5wYmpzQ29uZmlnLnVzZXJTeW5jLnVzZXJJZHMnLCBbXS5jb25jYXQoYihFKSwgW28udXNlclN5bmNDb25maWddKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCB8fCBfLmxvZ0luZm8oJ1VzZXIgSUQgZGVwZW5kZW5jaWVzIG5vdCBtZXQgZm9yIFVzZXIgSUQnLCB0LCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBJID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB3IGluIEkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoSSwgdykgJiYgcih3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBlLmRlcGVuZGVuY2llcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUuZGVwZW5kZW5jaWVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5kZXBlbmRlbmNpZXMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmRlcGVuZGVuY2llc1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyIHx8ICcnID09PSByIHx8IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmluZGV4T2YocikgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZGVwZW5kZW5jaWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiB8fCAnJyA9PT0gbiB8fCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKG4pID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGwsIHIgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdKSB8fCBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS50ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9ICgwLCB1LmRlZmF1bHQpKEpTT04uc3RyaW5naWZ5KGkpKSwgbCA9IEpTT04ucGFyc2Uobyh7IGNvbnRleHQ6IGEuZGVmYXVsdCB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoMCwgYy5kZWZhdWx0KSh7fSwgbCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoMCwgZC5kZWZhdWx0KShpLCAndXNlclN5bmNDb25maWcuc3RvcmFnZS5uYW1lJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdjb29raWUnID09PSAoMCwgZC5kZWZhdWx0KShpLCAndXNlclN5bmNDb25maWcuc3RvcmFnZS50eXBlJykgPyBzLnN0b3JhZ2UuZGVsZXRlQ29va2llKGkudXNlclN5bmNDb25maWcuc3RvcmFnZS5uYW1lKSA6ICdodG1sNScgPT09ICgwLCBkLmRlZmF1bHQpKGksICd1c2VyU3luY0NvbmZpZy5zdG9yYWdlLnR5cGUnKSAmJiBzLnN0b3JhZ2UucmF3LmRlbGV0ZUZyb21McyhpLnVzZXJTeW5jQ29uZmlnLnN0b3JhZ2UubmFtZSksIGkub25SZW1vdmUgJiYgaS5vblJlbW92ZS5jb29raWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IGkub25SZW1vdmUuY29va2llcy5sZW5ndGg7IHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gaS5vblJlbW92ZS5jb29raWVzW3BdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RvcmFnZS5kZWxldGVDb29raWUoZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkub25SZW1vdmUgJiYgaS5vblJlbW92ZS5sb2NhbFN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgaS5vblJlbW92ZS5sb2NhbFN0b3JhZ2UubGVuZ3RoOyBtKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGkub25SZW1vdmUubG9jYWxTdG9yYWdlW21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RvcmFnZS5yYXcuZGVsZXRlRnJvbUxzKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3RvcmFnZS5yYXcuZGVsZXRlRnJvbUxzKCcnLmNvbmNhdChpLnVzZXJTeW5jQ29uZmlnLnN0b3JhZ2UubmFtZSwgJy5tZXRhJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9ICgwLCBuLmdldENvbmZpZykoJ3ByZWJpZC5wYmpzQ29uZmlnLnVzZXJTeW5jLnVzZXJJZHMnKSwgeSA9IGIgPyBiLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5hbWUgIT09IGkudXNlclN5bmNDb25maWcubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBuLnNldENvbmZpZykoJ3ByZWJpZC5wYmpzQ29uZmlnLnVzZXJTeW5jLnVzZXJJZHMnLCB5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBTIGluIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoaCwgUykgJiYgZihTKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBuLmdldENvbmZpZykoJ3ByZWJpZC5pZHMnLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gKDAsIGwuY2xvbmVEZWVwKSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KSAmJiAoMCwgbi5nZXRDb25maWcpKCdwcmViaWRzLmlkcy4nLmNvbmNhdCh0LCAnLmVuYWJsZWQnKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gcih0KSA6IGYodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmV2ZW50RW1pdHRlci5vbignY29uc2VudFJlYWR5JywgdCksIG8uZXZlbnRFbWl0dGVyLm9uKCdjb25zZW50Q2hhbmdlZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKDAsIG4uZ2V0Q29uZmlnKSgnY29uc2VudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQodm9pZCAwID09PSBlIHx8IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgSSA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3RlcihFLCBbU10pOwogICAgICAgICAgICAgICAgdC5wcmViaWRVc2VySWQgPSBJOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDM2NSksIGkgPSByKDM2NiksIG8gPSByKDM2NyksIGEgPSByKDM2OSksIHMgPSByKDM3MCksIHUgPSByKDIyMiksIGMgPSByKDE4NyksIGQgPSByKDExNiksIGwgPSByKDIyMyksIGYgPSByKDM3MSksIHAgPSByKDIyNCksIGcgPSAvXGJfX3AgXCs9ICcnOy9nLCBtID0gL1xiKF9fcCBcKz0pICcnIFwrL2csIHYgPSAvKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLCBiID0gL1soKT0se31cW1xdXC9cc10vLCB5ID0gL1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nLCBoID0gLygkXikvLCBTID0gL1snXG5cclx1MjAyOFx1MjAyOVxcXS9nLCBPID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSBmLmltcG9ydHMuXy50ZW1wbGF0ZVNldHRpbmdzIHx8IGY7CiAgICAgICAgICAgICAgICAgICAgciAmJiBjKGUsIHQsIHIpICYmICh0ID0gdm9pZCAwKSwgZSA9IHAoZSksIHQgPSBuKHt9LCB0LCBfLCBhKTsKICAgICAgICAgICAgICAgICAgICB2YXIgRSwgSSwgdyA9IG4oe30sIHQuaW1wb3J0cywgXy5pbXBvcnRzLCBhKSwgQSA9IGQodyksIFQgPSBvKHcsIEEpLCB4ID0gMCwgQyA9IHQuaW50ZXJwb2xhdGUgfHwgaCwgUCA9ICdfX3AgKz0gXCcnLCBqID0gUmVnRXhwKCh0LmVzY2FwZSB8fCBoKS5zb3VyY2UgKyAnfCcgKyBDLnNvdXJjZSArICd8JyArIChDID09PSBsID8geSA6IGgpLnNvdXJjZSArICd8JyArICh0LmV2YWx1YXRlIHx8IGgpLnNvdXJjZSArICd8JCcsICdnJyksIFIgPSBPLmNhbGwodCwgJ3NvdXJjZVVSTCcpID8gJy8vIyBzb3VyY2VVUkw9JyArICh0LnNvdXJjZVVSTCArICcnKS5yZXBsYWNlKC9ccy9nLCAnICcpICsgJ1xuJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIGUucmVwbGFjZShqLCBmdW5jdGlvbiAodCwgciwgbiwgaSwgbywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IGkpLCBQICs9IGUuc2xpY2UoeCwgYSkucmVwbGFjZShTLCBzKSwgciAmJiAoRSA9ICEwLCBQICs9ICdcJyArXG5fX2UoJyArIHIgKyAnKSArXG5cJycpLCBvICYmIChJID0gITAsIFAgKz0gJ1wnO1xuJyArIG8gKyAnO1xuX19wICs9IFwnJyksIG4gJiYgKFAgKz0gJ1wnICtcbigoX190ID0gKCcgKyBuICsgJykpID09IG51bGwgPyBcJ1wnIDogX190KSArXG5cJycpLCB4ID0gYSArIHQubGVuZ3RoLCB0OwogICAgICAgICAgICAgICAgICAgIH0pLCBQICs9ICdcJztcbic7CiAgICAgICAgICAgICAgICAgICAgdmFyIEQgPSBPLmNhbGwodCwgJ3ZhcmlhYmxlJykgJiYgdC52YXJpYWJsZTsKICAgICAgICAgICAgICAgICAgICBpZiAoRCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi50ZXN0KEQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBQID0gJ3dpdGggKG9iaikge1xuJyArIFAgKyAnXG59XG4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBQID0gKEkgPyBQLnJlcGxhY2UoZywgJycpIDogUCkucmVwbGFjZShtLCAnJDEnKS5yZXBsYWNlKHYsICckMTsnKSwgUCA9ICdmdW5jdGlvbignICsgKEQgfHwgJ29iaicpICsgJykge1xuJyArIChEID8gJycgOiAnb2JqIHx8IChvYmogPSB7fSk7XG4nKSArICd2YXIgX190LCBfX3AgPSBcJ1wnJyArIChFID8gJywgX19lID0gXy5lc2NhcGUnIDogJycpICsgKEkgPyAnLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCBcJ1wnKSB9XG4nIDogJztcbicpICsgUCArICdyZXR1cm4gX19wXG59JzsKICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oQSwgUiArICdyZXR1cm4gJyArIFApLmFwcGx5KHZvaWQgMCwgVCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGsuc291cmNlID0gUCwgdShrKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gazsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoODIpLCBpID0gcigxODYpLCBvID0gcig5MyksIGEgPSBpKGZ1bmN0aW9uIChlLCB0LCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4odCwgbyh0KSwgZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEzOCksIGkgPSByKDEzOSksIG8gPSByKDIyMiksIGEgPSBpKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCB2b2lkIDAsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhlKSA/IGUgOiBuZXcgRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzY4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4odCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gLTEsIG4gPSBudWxsID09IGUgPyAwIDogZS5sZW5ndGgsIGkgPSBBcnJheShuKTsgKytyIDwgbjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaVtyXSA9IHQoZVtyXSwgciwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigxMTMpLCBpID0gT2JqZWN0LnByb3RvdHlwZSwgbyA9IGkuaGFzT3duUHJvcGVydHk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgciwgYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgfHwgbihlLCBpW3JdKSAmJiAhby5jYWxsKGEsIHIpID8gdCA6IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgJ1xcJzogJ1xcJywKICAgICAgICAgICAgICAgICAgICAnXCcnOiAnXCcnLAogICAgICAgICAgICAgICAgICAgICdcbic6ICduJywKICAgICAgICAgICAgICAgICAgICAnXHInOiAncicsCiAgICAgICAgICAgICAgICAgICAgJ1x1MjAyOCc6ICd1MjAyOCcsCiAgICAgICAgICAgICAgICAgICAgJ1x1MjAyOSc6ICd1MjAyOScKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXFwnICsgcltlXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMzcyKSwgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlOiByKDM3NSksCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlOiByKDM3NiksCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycG9sYXRlOiByKDIyMyksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogeyBfOiB7IGVzY2FwZTogbiB9IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gcigzNzMpLCBpID0gcigyMjQpLCBvID0gL1smPD4iJ10vZywgYSA9IFJlZ0V4cChvLnNvdXJjZSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IGkoZSkpICYmIGEudGVzdChlKSA/IGUucmVwbGFjZShvLCBuKSA6IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgdmFyIG4gPSByKDM3NCkoewogICAgICAgICAgICAgICAgICAgICcmJzogJyZhbXA7JywKICAgICAgICAgICAgICAgICAgICAnPCc6ICcmbHQ7JywKICAgICAgICAgICAgICAgICAgICAnPic6ICcmZ3Q7JywKICAgICAgICAgICAgICAgICAgICAnIic6ICcmcXVvdDsnLAogICAgICAgICAgICAgICAgICAgICdcJyc6ICcmIzM5OycKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IGUgPyB2b2lkIDAgOiBlW3RdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gLzwlLShbXHNcU10rPyklPi9nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gLzwlKFtcc1xTXSs/KSU+L2c7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5lbmZvcmNlRmVhdHVyZXMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHIoMjUpLCBvID0gcigzNSksIGEgPSByKDcyKSwgcyA9IHIoOCksIHUgPSByKDQ0KSwgYyA9IChuID0gcigxMCkpICYmIG4uX19lc01vZHVsZSA/IG4gOiB7IGRlZmF1bHQ6IG4gfTsKICAgICAgICAgICAgICAgIHZhciBkID0gYy5kZWZhdWx0Lk1PRFVMRVMuQklEQkFSUkVMX0ZFQVRVUkVTLCBsID0gYy5kZWZhdWx0LlFVRVJZX1BBUkFNUy5CSURfU1VQUFJFU1MsIGYgPSAoMCwgcy5sb2dnZXIpKHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0ZlYXR1cmUgRW5mb3JjZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yOiAnI0ZGRicsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRDb2xvcjogJyNEQTQxNjcnCiAgICAgICAgICAgICAgICAgICAgfSksIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB8fCBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zaXplcyA9IHIuc2l6ZXMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IGUgOiBlLmpvaW4oJ3gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWEuZmVhdHVyZXMuZ2V0KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemVTdXBwcmVzcy4nLmNvbmNhdCh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemVTdXBwcmVzcy4nLmNvbmNhdChyLmNvZGUsICcuJykuY29uY2F0KHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5mZWF0dXJlcy5nZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZFN1cHByZXNzLicuY29uY2F0KHIuY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkU3VwcHJlc3MuYWxsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgPyBmLmF0VmVyYm9zaXR5KDIpLmxvZ0luZm8oJ1N1cHByZXNzaW5nIEFkJywgcikgOiBlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtyXSwgaSA9ICgwLCBvLmNsb25lRGVlcCkobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYmlkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IG4uYmlkcy5sZW5ndGg7IHMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBuLmJpZHNbc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmZlYXR1cmVzLmdldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KGwsICcuJykuY29uY2F0KHUuYmlkZGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQobCwgJy4nKS5jb25jYXQoaS5jb2RlLCAnLicpLmNvbmNhdCh1LmJpZGRlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuY29uY2F0KGwsICcuJykuY29uY2F0KGkuY29kZSwgJy5hbGwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQobCwgJy5hbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgPyBmLmF0VmVyYm9zaXR5KDIpLmxvZ0luZm8oJ1N1cHByZXNzaW5nIEJpZGRlcicsIHUsIG4pIDogaS5iaWRzLnB1c2godSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5wb3N0UHJvY2Vzc1VuaXQuYmVmb3JlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnBvc3RQcm9jZXNzVW5pdC5nZXRIb29rcyh7IGhvb2s6IGUgfSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgZyA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3RlcihwKTsKICAgICAgICAgICAgICAgIHQuZW5mb3JjZUZlYXR1cmVzID0gZzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lml4SWRlbnRpdHkgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICB2YXIgbiwgaSA9IHIoMjUpOwogICAgICAgICAgICAgICAgdmFyIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICgobiA9IHIoMTApKSAmJiBuLl9fZXNNb2R1bGUgPyBuIDogeyBkZWZhdWx0OiBuIH0pLmRlZmF1bHQuTU9EVUxFUy5JWF9JREVOVElUWSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoMzc5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGEgPSBpLm1vZHVsZU1hbmFnZXIucmVnaXN0ZXIobywgbnVsbCwgeyBnYXRlOiAnY29uc2VudEdpdmVuJyB9KTsKICAgICAgICAgICAgICAgIHQuaXhJZGVudGl0eSA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByZXF1aXJlLCByZXF1aXJlOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gX3R5cGVvZihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfdHlwZW9mID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyNCksIF9fd2VicGFja19yZXF1aXJlX18oOSksIF9fd2VicGFja19yZXF1aXJlX18oNDApLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSwgX193ZWJwYWNrX3JlcXVpcmVfXyg0MyksIF9fd2VicGFja19yZXF1aXJlX18oMTYpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDApLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLCBmdW5jdGlvbiBlKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGEsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyW2FdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRbYV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgcmVxdWlyZSAmJiByZXF1aXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1aXJlKGEsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oYSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlIFwnJyArIGEgKyAnXCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB1LmNvZGUgPSAnTU9EVUxFX05PVF9GT1VORCcsIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHJbYV0gPSB7IGV4cG9ydHM6IHt9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2FdWzBdLmNhbGwoYy5leHBvcnRzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHRbYV1bMV1bZV0gfHwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLCBjLmV4cG9ydHMsIGUsIHQsIHIsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByW2FdLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAnZnVuY3Rpb24nID09IHR5cGVvZiByZXF1aXJlICYmIHJlcXVpcmUsIGEgPSAwOyBhIDwgbi5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICBpKG5bYV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0oewogICAgICAgICAgICAgICAgICAgIDE6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBpID0gZSg1KSwgbyA9IGUoMiksIGEgPSBlKDEwKSwgcyA9IGUoMjgpLCB1ID0gZSgxNCksIGMgPSBlKDE4KSwgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRzZXJ2ZXJPcmdJcDogZSgxNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmtsZUlwOiBlKDIxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVJhbXBJcDogZSgyMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpdmVJbnRlbnRJcDogZSgxOSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbZV0gPSB5LklOX1BST0dSRVNTLCBuZXcgYShmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5pbnN0YW5jZS5yZXRyaWV2ZSgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbZV0gPSB5LkNPTVBMRVRFLCByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbZV0gPSB5LkNPTVBMRVRFLCByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgciA9IGEuZGVmZXIoKSwgaSA9IE9iamVjdC5rZXlzKG0pOyBpLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdS5yYW5kb21TcGxpY2UoaSksIHMgPSBtW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVzaCh0KG8sIHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmFsbChlKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZW1pdCgncnRpX3BhcnRuZXJfcmVxdWVzdF9jb21wbGV0ZScsIHsgcmVxdWVzdHNDb21wbGV0ZWQ6IGUubGVuZ3RoIH0pLCByLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eShlKSAmJiBiW2VdICE9PSB5LkNPTVBMRVRFICYmIG4uZW1pdCgnaHNfaWRlbnRpdHlfdGltZW91dCcsIHsgc3RhdHNJZDogbVtlXS5pbnN0YW5jZS5nZXRTdGF0c0lkKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiAoaCB8fCAoaCA9ICEwLCBsKCkpLCBtKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0uaGFzT3duUHJvcGVydHkodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG1bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIuaW5zdGFuY2UuZ2V0UmVzdWx0cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW3RdID09PSB5LkNPTVBMRVRFID8gKGVbdF0gPSBuID8geyBkYXRhOiBuIH0gOiB7IGRhdGE6IHt9IH0sIGVbdF0ucmVzcG9uc2VQZW5kaW5nID0gITEpIDogZVt0XSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQZW5kaW5nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9PT0geS5OT1RfU1RBUlRFRCAmJiAocigpLCB2ID0geS5JTl9QUk9HUkVTUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnLCBtLCB2LCBiLCB5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX1NUQVJURUQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTl9QUk9HUkVTUzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVRFOiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGggPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcy5zZXJ2aWNlcy5FdmVudHNTZXJ2aWNlLCBzLnNlcnZpY2VzLlRpbWVyU2VydmljZSwgZyA9IG8oKSwgdiA9IHkuTk9UX1NUQVJURUQsIGIgPSB7fSwgbSA9IGUucGFydG5lcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhtKSwgaSA9IHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdS5yYW5kb21TcGxpY2UodCksIGwgPSBtW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZFthXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXNPYmplY3QoaCkgPyBsLmluc3RhbmNlID0gYyhoLCBsLmNvbmZpZ3MpIDogbC5pbnN0YW5jZSA9IGgobC5jb25maWdzKSwgIWwuaW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuZW5hYmxlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlthXSA9IHkuTk9UX1NUQVJURUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmVuYWJsZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5fc2V0RGlyZWN0SW50ZXJmYWNlKCdJZGVudGl0eUxheWVyJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmU6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxQYXJ0bmVyUmVzdWx0czogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9rZUFsbFBhcnRuZXJzOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgaS5kZXJpdmUoZywgeyByZXRyaWV2ZTogcCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAyOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUoMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgxNSksIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucmVzb2x2ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBudWxsLCByID0gZSwgaSA9IGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NldERpcmVjdEludGVyZmFjZTogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ID0ge30pW2VdID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NldEV4ZWN1dG9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjdXRlTmV4dDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXROZXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERpcmVjdEludGVyZmFjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMzogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgxNSksIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0LCByLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpLCBvID0gd2luZG93LCBhID0gMDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEociAmJiBhIDwgcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgYSA+IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIChpID0gZShvKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG8uZnJhbWVFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgKGkgPSB0KG8pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IG8ucGFyZW50LCBhKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFdpbmRvdzogciA9IHQobnVsbCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvdG9jb2w6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGUgfHwgJ2h0dHA6JywgdCA9IHQgfHwgJ2h0dHBzOicsICdodHRwczonID09PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA/IHQgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvY2FsU3RvcmFnZVN1cHBvcnRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9mNzNiY2FhNTM3YzZkNmNjID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9mNzNiY2FhNTM3YzZkNmNjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfNDM2ZDZmNmY5NDc2MzI1My5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0ZXN0JywgJ3Rlc3QnKSwgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3Rlc3QnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZjczYmNhYTUzN2M2ZDZjYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfZjczYmNhYTUzN2M2ZDZjYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3cG9ydFdpZHRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdDU1MxQ29tcGF0JyA9PT0gci5kb2N1bWVudC5jb21wYXRNb2RlID8gci5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiByLmRvY3VtZW50LmJvZHkpLmNsaWVudFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWV3cG9ydEhlaWdodDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnQ1NTMUNvbXBhdCcgPT09IHIuZG9jdW1lbnQuY29tcGF0TW9kZSA/IHIuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IDogci5kb2N1bWVudC5ib2R5KS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVG9wRnJhbWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNjcmVlbldpZHRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5zY3JlZW4ud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNjcmVlbkhlaWdodDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc2NyZWVuLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmZXJyZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5yZWZlcnJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFnZVVybDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKSA/IGxvY2F0aW9uLmhyZWYgOiBkb2N1bWVudC5yZWZlcnJlciB8fCBsb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIb3N0bmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVzZXJBZ2VudDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhbmd1YWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLmxhbmd1YWdlIHx8IG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3Iuc3lzdGVtTGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhdGhuYW1lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmVhcmVzdEVudGl0eTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaGFzT3duUHJvcGVydHkoZSkgPyB0W2VdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZUNvbnRleHRUcmVlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVIaWRkZW5JRnJhbWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQgfHwgciwgaSA9IG4uZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAoaS5zcmMgPSBlKSwgaS53aWR0aCA9IDAsIGkuaGVpZ2h0ID0gMCwgaS5zY3JvbGxpbmcgPSAnbm8nLCBpLm1hcmdpbldpZHRoID0gMCwgaS5tYXJnaW5IZWlnaHQgPSAwLCBpLmZyYW1lQm9yZGVyID0gMCwgaS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2JvcmRlcjogMHB4OyB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tOyB2aXNpYmlsaXR5OiBoaWRkZW47IGRpc3BsYXk6IG5vbmU7JyksIG4uZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChpKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZENvb2tpZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZSArICc9JywgbiA9IHIuZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5oYXNPd25Qcm9wZXJ0eShpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gbltpXTsgJyAnID09PSBvLmNoYXJBdCgwKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBvLnN1YnN0cmluZygxLCBvLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG8uaW5kZXhPZih0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uc3Vic3RyaW5nKHQubGVuZ3RoLCBvLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGbGFzaFN1cHBvcnRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCdTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCcpICYmIChlID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5taW1lVHlwZXMgJiYgdm9pZCAwICE9PSBuYXZpZ2F0b3IubWltZVR5cGVzWydhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCddICYmIG5hdmlnYXRvci5taW1lVHlwZXNbJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJ10uZW5hYmxlZFBsdWdpbiAmJiAoZSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSgzKSwgaSA9IGUoMTQpLCBvID0gZSgxMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShhICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzAwYTgwMTBmYmViOTEzMmQgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wMGE4MDEwZmJlYjkxMzJkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja180MzZkNmY2Zjk0NzYzMjUzLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKGEgKyB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IG4gPyBudWxsIDogIW4uZSB8fCBuLmUgPCBvLm5vdygpID8gKGUodCksIG51bGwpIDogaS5pc09iamVjdChuLmQpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBuLmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG4udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogbi5lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wMGE4MDEwZmJlYjkxMzJkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzAwYTgwMTBmYmViOTEzMmQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgYSA9ICdJWFdSQVBQRVInLCBzID0gNjA0ODAwMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gbi5pc0xvY2FsU3RvcmFnZVN1cHBvcnRlZCgpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZURhdGE6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVudHJ5OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgci5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA+IHMgJiYgKG4gPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gby5ub3coKSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogaSArIG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShhICsgZSwgSlNPTi5zdHJpbmdpZnkodSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICA1OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKDE1KSwgdC5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkocikgJiYgKG5bcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgaW4gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShyKSAmJiAobltyXSA9IHRbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eSh0KSAmJiAnXycgPT09IHRbMF0gJiYgJ19fJyAhPT0gdC5zbGljZSgwLCAyKSAmJiBkZWxldGUgZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICA2OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUoMTQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uaXNGdW5jdGlvbihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICA3OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9VSURfTEVOR1RIOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTl9CQU5ORVJfRElNRU5TSU9OOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTl9CSURfRkxPT1I6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOX1NJVEVfSUQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9VSURfQ0hBUlNFVDogJ0FMUEhBTlVNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0lEX0xFTkdUSDogOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUJLSVRfQURfSURfTEVOR1RIOiAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU5ERVJfU0VSVklDRV9FWFBJUllfU1dFRVBfVElNRVI6IDMwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFSVE5FUl9QUklPUklUWTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lSXRlbVR5cGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEX0FORF9TSVpFOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRF9BTkRfUFJJQ0U6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTTogMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZU1ldGhvZHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUl9BR0VOVDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGRVJFTkNFOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFX01BUFBJTkc6IDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RBcmNoaXRlY3R1cmVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1SQTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1JBOiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0aWFsTG9hZFN0YXRlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNBQkxFRDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5BQkxFRDogMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWF0aW9uTGV2ZWxzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTkU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUX1NMT1Q6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRORVI6IDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgODogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMubW9iaWxlKCkgPyBuLkRldmljZVR5cGVzLk1PQklMRSA6IChzLnRhYmxldCgpLCBuLkRldmljZVR5cGVzLkRFU0tUT1ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBldmFsKGUuY29uZmlncy5yZWZlcmVuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhKCdJTlRFUk5BTF9FUlJPUicsICdEZXZpY2VUeXBlQ2hlY2tlcjogY291bGQgbm90IGV2YWwoKSBgcmVmZXJlbmNlYC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8uaXNGdW5jdGlvbih0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uaXNTdHJpbmcodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGEoJ0lOVkFMSURfVFlQRScsICdEZXZpY2VUeXBlQ2hlY2tlcjogYHJlZmVyZW5jZWAgbXVzdCByZWZlciB0byBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGEoJ0lOVEVSTkFMX0VSUk9SJywgJ0RldmljZVR5cGVDaGVja2VyOiBjb3VsZCBub3QgZXhlY3V0ZSBgcmVmZXJlbmNlYCBmdW5jdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLkRldmljZVR5cGVNZXRob2RzLlVTRVJfQUdFTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuRGV2aWNlVHlwZU1ldGhvZHMuUkVGRVJFTkNFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgPSBpLkRldmljZVR5cGVNZXRob2RzW2UubWV0aG9kXSB8fCBpLkRldmljZVR5cGVNZXRob2RzLlVTRVJfQUdFTlQsIHsgZ2V0RGV2aWNlVHlwZTogdSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlKDcpLCBvID0gZSgxNCksIGEgPSBlKDE1KSwgcyA9IGUoOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzVmFsaWREZXZpY2VUeXBlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG4uRGV2aWNlVHlwZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uRGV2aWNlVHlwZXMuaGFzT3duUHJvcGVydHkodCkgJiYgJ1RBQkxFVCcgIT09IHQgJiYgZSA9PT0gbi5EZXZpY2VUeXBlc1t0XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uRGV2aWNlVHlwZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTS1RPUDogJ2Rlc2t0b3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PQklMRTogJ21vYmlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFCTEVUOiAndGFibGV0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5leHBvcnRzID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDk6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHt9LCBvID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwgbi5pb3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaXBob25lKCkgfHwgbi5pcG9kKCkgfHwgbi5pcGFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmlwaG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW4ud2luZG93cygpICYmIGkoJ2lwaG9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5pcG9kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKCdpcG9kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmlwYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoJ2lwYWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uYW5kcm9pZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW4ud2luZG93cygpICYmIGkoJ2FuZHJvaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uYW5kcm9pZFBob25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFuZHJvaWQoKSAmJiBpKCdtb2JpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uYW5kcm9pZFRhYmxldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hbmRyb2lkKCkgJiYgIWkoJ21vYmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5ibGFja2JlcnJ5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKCdibGFja2JlcnJ5JykgfHwgaSgnYmIxMCcpIHx8IGkoJ3JpbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5ibGFja2JlcnJ5UGhvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYmxhY2tiZXJyeSgpICYmICFpKCd0YWJsZXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uYmxhY2tiZXJyeVRhYmxldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5ibGFja2JlcnJ5KCkgJiYgaSgndGFibGV0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLndpbmRvd3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoJ3dpbmRvd3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ud2luZG93c1Bob25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLndpbmRvd3MoKSAmJiBpKCdwaG9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi53aW5kb3dzVGFibGV0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLndpbmRvd3MoKSAmJiBpKCd0b3VjaCcpICYmICFuLndpbmRvd3NQaG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5meG9zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaSgnKG1vYmlsZTsnKSB8fCBpKCcodGFibGV0OycpKSAmJiBpKCc7IHJ2OicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5meG9zUGhvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZnhvcygpICYmIGkoJ21vYmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5meG9zVGFibGV0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmZ4b3MoKSAmJiBpKCd0YWJsZXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubWVlZ28gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoJ21lZWdvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm1vYmlsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hbmRyb2lkUGhvbmUoKSB8fCBuLmlwaG9uZSgpIHx8IG4uaXBvZCgpIHx8IG4ud2luZG93c1Bob25lKCkgfHwgbi5ibGFja2JlcnJ5UGhvbmUoKSB8fCBuLmZ4b3NQaG9uZSgpIHx8IG4ubWVlZ28oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4udGFibGV0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmlwYWQoKSB8fCBuLmFuZHJvaWRUYWJsZXQoKSB8fCBuLmJsYWNrYmVycnlUYWJsZXQoKSB8fCBuLndpbmRvd3NUYWJsZXQoKSB8fCBuLmZ4b3NUYWJsZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZGVza3RvcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW4udGFibGV0KCkgJiYgIW4ubW9iaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IG8uaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZXhwb3J0cyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAxMDogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSBfdHlwZW9mKHRoaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDAsIHRoaXMuX2hhbmRsZWQgPSAhMSwgdGhpcy5fdmFsdWUgPSB2b2lkIDAsIHRoaXMuX2RlZmVycmVkcyA9IFtdLCBkKGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IDMgPT09IGUuX3N0YXRlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5fdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9PSBlLl9zdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9oYW5kbGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMSA9PT0gZS5fc3RhdGUgPyB0Lm9uRnVsZmlsbGVkIDogdC5vblJlamVjdGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSByKGUuX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBzKHQucHJvbWlzZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKHQucHJvbWlzZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA9PT0gZS5fc3RhdGUgPyBhIDogcykodC5wcm9taXNlLCBlLl92YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9kZWZlcnJlZHMucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAoJ29iamVjdCcgPT0gX3R5cGVvZih0KSB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LnRoZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fc3RhdGUgPSAzLCBlLl92YWx1ZSA9IHQsIHZvaWQgdShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZChiaW5kKHIsIHQpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zdGF0ZSA9IDEsIGUuX3ZhbHVlID0gdCwgdShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fc3RhdGUgPSAyLCBlLl92YWx1ZSA9IHQsIHUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgciA9IGUuX2RlZmVycmVkcy5sZW5ndGg7IHQgPCByOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhlLCBlLl9kZWZlcnJlZHNbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9kZWZlcnJlZHMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZ1bGZpbGxlZCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBlIDogbnVsbCwgdGhpcy5vblJlamVjdGVkID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCA/IHQgOiBudWxsLCB0aGlzLnByb21pc2UgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIHx8IChyID0gITAsIGEodCwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8fCAociA9ICEwLCBzKHQsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAhMCwgcyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnByb3RvdHlwZS5jYXRjaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8odGhpcywgbmV3IGMoZSwgdCwgcikpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5hbGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiAoJ29iamVjdCcgPT0gX3R5cGVvZihhKSB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiBhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGEudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHMuY2FsbChhLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4obywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W29dID0gYSwgMCA9PSAtLWkgJiYgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSB0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0Lmxlbmd0aCwgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKG8sIHRbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlc29sdmUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdvYmplY3QnID09IF90eXBlb2YoZSkgJiYgZS5jb25zdHJ1Y3RvciA9PT0gaSA/IGUgOiBuZXcgaShmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZWplY3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaShmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5kZWZlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb21pc2UgPSBuZXcgaShmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlc29sdmUgPSB0LCBlLnJlamVjdCA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmV4cG9ydHMgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMTE6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC8oZWRnZSlcLyhbXHcuXSspLy5leGVjKGUpIHx8IC8ob3ByKVtcL10oW1x3Ll0rKS8uZXhlYyhlKSB8fCAvKGNocm9tZSlbIFwvXShbXHcuXSspLy5leGVjKGUpIHx8IC8oaWVtb2JpbGUpW1wvXShbXHcuXSspLy5leGVjKGUpIHx8IC8odmVyc2lvbikoYXBwbGV3ZWJraXQpWyBcL10oW1x3Ll0rKS4qKHNhZmFyaSlbIFwvXShbXHcuXSspLy5leGVjKGUpIHx8IC8od2Via2l0KVsgXC9dKFtcdy5dKykuKih2ZXJzaW9uKVsgXC9dKFtcdy5dKykuKihzYWZhcmkpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKSB8fCAvKHdlYmtpdClbIFwvXShbXHcuXSspLy5leGVjKGUpIHx8IC8ob3BlcmEpKD86Lip2ZXJzaW9ufClbIFwvXShbXHcuXSspLy5leGVjKGUpIHx8IC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSkgfHwgZS5pbmRleE9mKCd0cmlkZW50JykgPj0gMCAmJiAvKHJ2KSg/Ojp8ICkoW1x3Ll0rKS8uZXhlYyhlKSB8fCBlLmluZGV4T2YoJ2NvbXBhdGlibGUnKSA8IDAgJiYgLyhtb3ppbGxhKSg/Oi4qPyBydjooW1x3Ll0rKXwpLy5leGVjKGUpIHx8IFtdLCByID0ge30sIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyOiB0WzVdIHx8IHRbM10gfHwgdFsxXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHRbMl0gfHwgdFs0XSB8fCAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uTnVtYmVyOiB0WzRdIHx8IHRbMl0gfHwgJzAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYnJvd3NlciAmJiAocltuLmJyb3dzZXJdID0gITAsIHIudmVyc2lvbiA9IG4udmVyc2lvbiwgci52ZXJzaW9uTnVtYmVyID0gcGFyc2VJbnQobi52ZXJzaW9uTnVtYmVyLCAxMCkpLCAoci5ydiB8fCByLmllbW9iaWxlKSAmJiAobi5icm93c2VyID0gJ21zaWUnLCByLm1zaWUgPSAhMCksIHIuZWRnZSAmJiAoZGVsZXRlIHIuZWRnZSwgbi5icm93c2VyID0gJ21zZWRnZScsIHIubXNlZGdlID0gITApLCByLm9wciAmJiAobi5icm93c2VyID0gJ29wZXJhJywgci5vcGVyYSA9ICEwKSwgci5zYWZhcmkgJiYgci5hbmRyb2lkICYmIChuLmJyb3dzZXIgPSAnYW5kcm9pZCcsIHIuYW5kcm9pZCA9ICEwKSwgci5zYWZhcmkgJiYgci5raW5kbGUgJiYgKG4uYnJvd3NlciA9ICdraW5kbGUnLCByLmtpbmRsZSA9ICEwKSwgci5zYWZhcmkgJiYgci5zaWxrICYmIChuLmJyb3dzZXIgPSAnc2lsaycsIHIuc2lsayA9ICEwKSwgci5uYW1lID0gbi5icm93c2VyLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAxMjogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlKDI4KSwgaSA9IGUoMTMpLCBvID0gZSgxNCksIGEgPSBlKDE1KSwgcyA9IGUoMTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfYzQzOGI2ZDBhZDQ5YmMzNyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2M0MzhiNmQwYWQ0OWJjMzcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja182YmYyOGZkYWQ2YzYzMTM3LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzT3duUHJvcGVydHkocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmlzT2JqZWN0KGVbcl0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlW3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0uaGFzT3duUHJvcGVydHkobikgJiYgKHQgKz0gciArICclNUInICsgbiArICclNUQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChlW3JdW25dKSArICcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvLmlzQXJyYXkoZVtyXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVbcl0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSByICsgJyU1QiU1RD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGVbcl1baV0pICsgJyYnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSByICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGVbcl0pICsgJyYnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsaWNlKDAsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnLycgIT09IGVbZS5sZW5ndGggLSAxXSAmJiByICYmIChlICs9ICcvJyksIHIgPSByIHx8IFtdLCBvLmlzT2JqZWN0KG4pICYmIChuID0gdChuKSksIG4gPSBuID8gJz8nICsgbiA6ICcnLCBlICsgci5qb2luKCcvJykgKyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHUsIGMgPSBlLnNjb3BlIHx8IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS51c2VJbWdUYWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPSBjLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoJ2FzeW5jJykgJiYgKGQgPSBlLmFzeW5jKSwgYS5hc3luYyA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsLCBmID0gZS51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhICYmIChsID0gby5pc1N0cmluZyhlLmRhdGEpID8gZS5kYXRhIDogdChlLmRhdGEpLCBmID0gcihlLnVybCwgbnVsbCwgbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwLCBnID0gITEsIG0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICEwLCBlLm9uVGltZW91dCAmJiBlLm9uVGltZW91dCgpLCBlLnVzZUltZ1RhZyB8fCBlLmNvbnRpbnVlQWZ0ZXJUaW1lb3V0IHx8IGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdsb2JhbFRpbWVvdXQgJiYgbi5zZXJ2aWNlcy5UaW1lclNlcnZpY2UuYWRkVGltZXJDYWxsYmFjayhlLnNlc3Npb25JZCwgbSksIGUudGltZW91dCAmJiAocCA9IHNldFRpbWVvdXQobSwgZS50aW1lb3V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5jb250aW51ZUFmdGVyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm9uU3VjY2VzcyAmJiBlLm9uU3VjY2VzcyhudWxsLCBpLm5vdygpLCBnKSwgZyA9ICEwLCBlLnVzZUltZ1RhZyB8fCBhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gYS5vbmxvYWQgPyBhLm9ubG9hZCA9IHYgOiBhLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvYWRlZCcgIT09IGEucmVhZHlTdGF0ZSAmJiAnY29tcGxldGUnICE9PSBhLnJlYWR5U3RhdGUgfHwgKGEub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbCwgdigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5jb250aW51ZUFmdGVyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHApLCBnID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUub25GYWlsdXJlICYmIGUub25GYWlsdXJlKCksIGUudXNlSW1nVGFnIHx8IGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IGkubm93KCksIGEuc3JjID0gZiwgIWUudXNlSW1nVGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPyBiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsIGIpIDogcy5tc2llIHx8IHMubXNlZGdlIHx8IHMubW96aWxsYSA/IGMub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogYy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgPSB3aW5kb3cuWE1MSHR0cFJlcXVlc3QgJiYgJ3N0cmluZycgPT0gdHlwZW9mIG5ldyBYTUxIdHRwUmVxdWVzdCgpLnJlc3BvbnNlVHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXg6IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfM2JiMmU3M2E2OWNiMzk2YSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfM2JiMmU3M2E2OWNiMzk2YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja182YmYyOGZkYWQ2YzYzMTM3LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmpzb25wICYmICdHRVQnID09PSBzLm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYSgnSU5URVJOQUxfRVJST1InLCAnWEhSIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgZCA9IG5ldyAocy5zY29wZSB8fCB3aW5kb3cpLlhNTEh0dHBSZXF1ZXN0KCksIGwgPSBzLnVybCwgZiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0dFVCcgPT09IHMubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBvLmlzU3RyaW5nKHMuZGF0YSkgPyBzLmRhdGEgOiB0KHMuZGF0YSksIGwgPSByKHMudXJsLCBudWxsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQT1NUJyA9PT0gcy5tZXRob2QgJiYgKGYgPSBvLmlzU3RyaW5nKHMuZGF0YSkgPyBzLmRhdGEgOiBKU09OLnN0cmluZ2lmeShzLmRhdGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaGFzT3duUHJvcGVydHkoJ2FzeW5jJykgJiYgKGcgPSBzLmFzeW5jKSwgZC5vcGVuKHMubWV0aG9kLCBsLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHMuY29udGVudFR5cGUgJiYgKG0gPSBzLmNvbnRlbnRUeXBlKSwgbSAmJiBkLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIG0pLCBzLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiBpbiAocy5oZWFkZXJzLmhhc093blByb3BlcnR5KCdYLVJlcXVlc3QtV2l0aCcpIHx8IGQuc2V0UmVxdWVzdEhlYWRlcignWC1SZXF1ZXN0LVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKSwgcy5oZWFkZXJzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWFkZXJzLmhhc093blByb3BlcnR5KHYpICYmIGQuc2V0UmVxdWVzdEhlYWRlcih2LCBzLmhlYWRlcnNbdl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud2l0aENyZWRlbnRpYWxzICYmIChkLndpdGhDcmVkZW50aWFscyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiwgeSA9ICExLCBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAhMCwgcy5vblRpbWVvdXQgJiYgcy5vblRpbWVvdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nbG9iYWxUaW1lb3V0ICYmIG4uc2VydmljZXMuVGltZXJTZXJ2aWNlLmFkZFRpbWVyQ2FsbGJhY2socy5zZXNzaW9uSWQsIGgpLCBzLnRpbWVvdXQgJiYgKHMuY29udGludWVBZnRlclRpbWVvdXQgPyBiID0gc2V0VGltZW91dChoLCBzLnRpbWVvdXQpIDogKGQudGltZW91dCA9IHMudGltZW91dCwgZC5vbnRpbWVvdXQgPSBoKSksIChzLm9uU3VjY2VzcyB8fCBzLm9uRmFpbHVyZSkgJiYgKGQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCA9PT0gZC5yZWFkeVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5jb250aW51ZUFmdGVyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoYiksIGQub250aW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyMDAgPT09IGQuc3RhdHVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMub25TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm9uU3VjY2VzcyhkLnJlc3BvbnNlVGV4dCwgaS5ub3coKSwgeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5vbkZhaWx1cmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm9uRmFpbHVyZShkLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjID0gaS5ub3coKSwgZC5zZW5kKGYpLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfM2JiMmU3M2E2OWNiMzk2YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzNiYjJlNzNhNjljYjM5NmEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbnA6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51c2VJbWdUYWcgPSAhMCwgdShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVXJsOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialRvUXVlcnlTdHJpbmc6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNYaHJTdXBwb3J0ZWQ6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9jNDM4YjZkMGFkNDliYzM3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF9jNDM4YjZkMGFkNDliYzM3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMTM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSg3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoMTUpLCB0LmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IG4uREVGQVVMVF9VSURfTEVOR1RILCB0ID0gdCB8fCBuLkRFRkFVTFRfVUlEX0NIQVJTRVQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAnJywgbyA9IDA7IG8gPCBlOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gclt0XS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogclt0XS5sZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQU5VTTogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9VUFBFUjogJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0xPV0VSOiAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVYOiAnMDEyMzQ1Njc4OWFiY2RlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU06ICcwMTIzNDU2Nzg5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gbmV3IERhdGUoKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaWRDaGFyYWN0ZXJTZXRzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVVuaXF1ZUlkOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZVV1aWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKDgsICdIRVgnKSArICctJyArIGUoNCwgJ0hFWCcpICsgJy00JyArIGUoMywgJ0hFWCcpICsgJy0nICsgJzg5YWInLmNoYXJBdChNYXRoLmZsb29yKDQgKiBNYXRoLnJhbmRvbSgpKSkgKyBlKDMsICdIRVgnKSArICctJyArIGUoOCwgJ0hFWCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3c6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGltZXpvbmVPZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50V3JpdGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm9wZW4oJ3RleHQvaHRtbCcsICdyZXBsYWNlJyksIGUud3JpdGUodCksIGUuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9PcDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDE0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUoMTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlID8gJ3VuZGVmaW5lZCcgOiB7fS50b1N0cmluZy5jYWxsKGUpLm1hdGNoKHMpWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT09IGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgPT09IGUodCkgJiYgIWlzTmFOKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnID09PSBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHIsIGksIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdhcnJheScgIT09IGUocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuKCdJTlZBTElEX1RZUEUnLCAnYHR5cGVgIG11c3QgYmUgYSBzdHJpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY2xhc3MnID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG4oJ0lOVkFMSURfVFlQRScsICdgY2xhc3NOYW1lYCBtdXN0IGJlIGEgc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgci5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gX3R5cGVvZihyW2FdKSB8fCByW2FdLl9fdHlwZV9fICE9PSBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgci5sZW5ndGg7IHMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZShyW3NdKSAhPT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJycgKyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSArdCkgIT0gdCAmJiAodCA9IDApLCB0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcGVhdCBjb3VudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09IDEgLyAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigncmVwZWF0IGNvdW50IG11c3QgYmUgbGVzcyB0aGFuIGluZmluaXR5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBNYXRoLmZsb29yKHQpLCAwID09IHIubGVuZ3RoIHx8IDAgPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmxlbmd0aCAqIHQgPj0gMSA8PCAyOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3JlcGVhdCBjb3VudCBtdXN0IG5vdCBvdmVyZmxvdyBtYXhpbXVtIHN0cmluZyBzaXplJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9ICcnLCBpID0gMDsgaSA8IHQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IC9ccyhbYS16QS1aXSspLywgdSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21TcGxpY2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZW5ndGggPyBlLnNwbGljZShNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBlLmxlbmd0aCksIDEpWzBdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1ZmZsZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gZS5sZW5ndGggLSAxOyBuID4gMDsgbi0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChuICsgMSkpLCByID0gZVtuXSwgZVtuXSA9IGVbdF0sIGVbdF0gPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZU9iamVjdHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0ID0ge30sIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZVtyXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3JdLmhhc093blByb3BlcnR5KG4pICYmICh0W25dID0gZVtyXVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlQXJyYXlzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSwgdCA9IFtdLCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGVbcl0ubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGVbcl1bbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FycmF5OiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VtcHR5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNPd25Qcm9wZXJ0eShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbignSU5WQUxJRF9UWVBFJywgJ2BlbnRpdHlgIG11c3QgYmUgZWl0aGVyIGEgc3RyaW5nLCBvYmplY3QsIG9yIGFuIGFycmF5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ludGVnZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihlKSAmJiBlICUgMSA9PSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0cmluZzogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOdW1lcmljOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09PSBlKHQpIHx8ICdzdHJpbmcnID09PSBlKHQpICYmICFpc05hTihOdW1iZXIodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlZ2V4OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdyZWdleHAnID09PSBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bWJlcjogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCb29sZWFuOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdib29sZWFuJyA9PT0gZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09PSBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09iamVjdDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheVN1YnNldDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9IHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9ICExLCBvID0gMDsgbyA8IHQubGVuZ3RoICYmICEoaSA9IHIoZVtuXSwgdFtvXSkpOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeUNhdGNoV3JhcHBlcjogZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gdCB8fCBbXSwgbiA9IG4gfHwgbnVsbCwgciA9IHIgfHwgJ0Vycm9yIG9jY3VycmVkIHdoaWxlIGNhbGxpbmcgZnVuY3Rpb24uJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXBwbHkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5RGVsZXRlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4gLTEgJiYgZS5zcGxpY2UociwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdFN0cmluZzogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkU3RhcnQ6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA+Pj0gMCwgciA9IFN0cmluZyhyIHx8ICcgJyksIGUubGVuZ3RoID4gdCA/IFN0cmluZyhlKSA6ICgodCAtPSBlLmxlbmd0aCkgPiByLmxlbmd0aCAmJiAociArPSBhKHIsIHQgLyByLmxlbmd0aCkpLCByLnNsaWNlKDAsIHQpICsgU3RyaW5nKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkRW5kOiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPj49IDAsIHIgPSBTdHJpbmcociB8fCAnICcpLCBlLmxlbmd0aCA+IHQgPyBTdHJpbmcoZSkgOiAoKHQgLT0gZS5sZW5ndGgpID4gci5sZW5ndGggJiYgKHIgKz0gYShyLCB0IC8gci5sZW5ndGgpKSwgU3RyaW5nKGUpICsgci5zbGljZSgwLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxWYXJpYWJsZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0IHx8IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsLmNhbGwodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbEZ1bmN0aW9uOiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHIgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwuY2FsbChyLCBlICsgJygnICsgdC5qb2luKCkgKyAnKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvQXJyYXk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0ID0gZVswXSwgciA9IDE7IHIgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodCwgZVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG9PYmplY3Q6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0ID0gZVswXSwgciA9IDE7IHIgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmhhc093blByb3BlcnR5KGkpICYmICh0W2ldID0gbltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMTU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoZSArICc6ICcgKyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uRXJyb3JUb2tlbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlTU0lOR19BUkdVTUVOVDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RZUEU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9WQUxVRTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVNTSU5HX1BST1BFUlRZOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUl9PVVRfT0ZfUkFOR0U6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFlfRU5USVRZOiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSTkFMX0VSUk9SOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9FTlRJVFk6IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9BUkdVTUVOVDogOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX0NPTkZJRzogMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZXhwb3J0cyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAxNjogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlKDgpLCBpID0gZSgyOCksIG8gPSBlKDE0KSwgYSA9IChlKDE1KSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRXZlbnRzU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogZSgyMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0dwdFNlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IGUoMjQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdQdWJsaXNoZXJTb25hclNlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IGUoMjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUaW1lclNlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IGUoMjYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDb21wbGlhbmNlU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogZSgyMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBzID0geyBJZGVudGl0eUxheWVyOiBlKDEpIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuRGV2aWNlVHlwZUNoZWNrZXIgPSBuKGUuRGV2aWNlVHlwZUNoZWNrZXIpLCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZXM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXJzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGEubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gYVtyXS5uYW1lLCBjID0gYVtyXS5jb25zdHJ1Y3RvcihlLlNlcnZpY2VzW3VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGkuc2VydmljZXNbdV0gPSBjLCBjLmdldERpcmVjdEludGVyZmFjZSAmJiBjLmdldERpcmVjdEludGVyZmFjZSgpICYmICh0LlNlcnZpY2VzID0gby5tZXJnZU9iamVjdHModC5TZXJ2aWNlcywgYy5nZXREaXJlY3RJbnRlcmZhY2UoKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkLCBsID0gZS5MYXllcnMubGVuZ3RoIC0gMTsgbCA+PSAwOyBsLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZS5MYXllcnNbbF0ubGF5ZXJJZCwgcCA9IHNbZl0oZS5MYXllcnNbbF0uY29uZmlncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmdldERpcmVjdEludGVyZmFjZSgpICYmICh0LkxheWVycyA9IG8ubWVyZ2VPYmplY3RzKHQuTGF5ZXJzLCBwLmdldERpcmVjdEludGVyZmFjZSgpKSksIGQgJiYgcC5zZXROZXh0KGQuZXhlY3V0ZSksIGQgPSBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERpcmVjdEludGVyZmFjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDE3OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRkX3BpZDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA6IGkuY29uZmlncy5wdWJsaXNoZXJJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0gaS5VdGlsaXRpZXMuZ2V0Q29uc2VudCgnZ2RwcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKDEgPT0gdC5hcHBsaWVzID8gZS5nZHByID0gMSA6IDAgPT0gdC5hcHBsaWVzICYmIChlLmdkcHIgPSAwKSwgdC5jb25zZW50U3RyaW5nICYmIChlLmdkcHJfY29uc2VudCA9IHQuY29uc2VudFN0cmluZykpLCBpLlV0aWxpdGllcy5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpLlV0aWxpdGllcy5nZXRQcm90b2NvbCgpICsgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LlRESUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgaS5yZWdpc3RlckVycm9yKCdyZXNwb25zZSBkb2VzIG5vdCBjb250YWluIFRESUQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiByLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRbbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHsgcnRpUGFydG5lcjogbiB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyTWF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHUuc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWdpc3RlckVycm9yKCdyZXNwb25zZSBpcyBub3QgdmFsaWQgSlNPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZhaWx1cmU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyRXJyb3IoJ0FQSSByZXR1cm5lZCBlcnJvciByZXNwb25zZSAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gJy8vbWF0Y2guYWRzcnZyLm9yZy90cmFjay9yaWQnLCBhID0gJ2Nhc2FsZScsIHMgPSAnanNvbicsIHUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJJZDogJ0Fkc2VydmVyT3JnSXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c0lkOiAnQURTT1JHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEuMy4wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnYWRzZXJ2ZXIub3JnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVFeHBpcnk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoOiA2MDQ4MDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzOiA4NjQwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiA4NjQwMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmdLZXlzOiB7IGV4Y2hhbmdlQmlkZGluZzogJ2l4cGlkXzEnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZGVudGl0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPSBlKS5vblJldHJpZXZlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZTogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDE4OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaSwgbywgYSA9IGUoMyksIHMgPSBlKDQpLCB1ID0gZSgxMiksIGMgPSBlKDEwKSwgZCA9IGUoMjgpLCBsID0gZSgxMyksIGYgPSBlKDE0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g6ICdoc19pZGVudGl0eV9yZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzOiAnaHNfaWRlbnRpdHlfcGFzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogJ2hzX2lkZW50aXR5X2Vycm9yJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmVtaXQociwgeyBzdGF0c0lkOiBFIH0pLCBpLmVtaXQoJ2lwX21vZHVsZV9yZXN1bHRfJyArIF8sIGUsIHQpLCAnbWF0Y2gnID09PSBlICYmICh3ID0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQID0gITAsIE8uY2FjaGVFeHBpcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IE8udmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnICE9PSBlICYmIChuLmRhdGEgPSB0KSwgT2JqZWN0LmtleXMoVCkubGVuZ3RoICYmIChuLmNvbnNlbnQgPSBUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE8uY2FjaGVFeHBpcnlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZXREYXRhKEMsIG4sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihlLCB0KSwgeCAmJiB4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbi5pc1ByaXZhY3lFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZ2RwcicgPT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5nZHByLmdldENvbnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuY29uc2VudFN0cmluZyAmJiAoVC5nZHByID0gITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzLmdldERhdGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdtYXRjaCcgPT09IHQucmVzcG9uc2UgJiYgdC5kYXRhID8gdC5kYXRhIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBlLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogZS5tZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbnA6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVBZnRlclRpbWVvdXQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogZS50aW1lb3V0IHx8IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub25TdWNjZXNzICYmICh0Lm9uU3VjY2VzcyA9IGUub25TdWNjZXNzKSwgZS5vblRpbWVvdXQgJiYgKHQub25UaW1lb3V0ID0gZS5vblRpbWVvdXQpLCBlLm9uRmFpbHVyZSAmJiAodC5vbkZhaWx1cmUgPSBlLm9uRmFpbHVyZSksIHZvaWQgMCAhPT0gZS5kYXRhICYmICh0LmRhdGEgPSBlLmRhdGEpLCB2b2lkIDAgIT09IGUuY29udGVudFR5cGUgJiYgKHQuY29udGVudFR5cGUgPSBlLmNvbnRlbnRUeXBlKSwgdS5hamF4KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTy5zb25hciAmJiBPLnNvbmFyLmVuYWJsZWQgPyBvLmdldFNvbmFyUGF5bG9hZChPLnNvbmFyLmVudHJ5cG9pbnRzKSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihPLnNvbmFyICYmIE8uc29uYXIuZW5hYmxlZCAmJiBvLmdldExhc3RVcGRhdGVkKGIoKSkgPiBlLmNyZWF0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGF0YS52ZXJzaW9uICE9PSBPLnZlcnNpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPLCBfLCBFLCBJLCB3LCBBLCBULCB4LCBDLCBQLCBqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIShlICYmIGUudWlkcyAmJiBmLmlzU3RyaW5nKGUuc291cmNlKSAmJiBmLmlzQXJyYXkoZS51aWRzKSkgJiYgZS51aWRzLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oIWYuaXNFbXB0eShlKSAmJiBlLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUuZGF0YS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIU8uY29uc2VudCB8fCAhbi5pc1ByaXZhY3lFbmFibGVkKCkpICYmICghZS5kYXRhLmNvbnNlbnQgfHwgIWYuaXNBcnJheVN1YnNldChPYmplY3Qua2V5cyhPLmNvbnNlbnQpLCBPYmplY3Qua2V5cyhlLmRhdGEuY29uc2VudCkpKSAmJiBuLndhaXQoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhPLmNvbnNlbnQpLnNvbWUoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5kYXRhLmNvbnNlbnQgJiYgZS5kYXRhLmNvbnNlbnRbdF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5bdF0uZ2V0Q29uc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIHIuY29uc2VudFN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogW1NdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFIgPSBbZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmNvbnNlbnQgJiYgbi5pc1ByaXZhY3lFbmFibGVkKCkgPyBuLndhaXQoKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IGQuc2VydmljZXMuQ29tcGxpYW5jZVNlcnZpY2UsIGkgPSBkLnNlcnZpY2VzLkV2ZW50c1NlcnZpY2UsIG8gPSBkLnNlcnZpY2VzLlB1Ymxpc2hlclNvbmFyU2VydmljZSwgTyA9IGUucHJvZmlsZSwgXyA9IE8ucGFydG5lcklkLCBFID0gTy5zdGF0c0lkLCB3ID0gbnVsbCwgQSA9IG51bGwsIHggPSBudWxsLCBDID0gXywgVCA9IHt9LCBJID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVXJsOiB1LmJ1aWxkVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFnZVVybDogYS5nZXRQYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvdG9jb2w6IGEuZ2V0UHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZWZlcnJlcjogYS5nZXRSZWZlcnJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRpbWU6IGwubm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZTogZi5nZXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBcnJheTogZi5pc0FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFbXB0eTogZi5pc0VtcHR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbjogZi5pc0Z1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnRlZ2VyOiBmLmlzSW50ZWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTnVtZXJpYzogZi5pc051bWVyaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0cmluZzogZi5pc1N0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0OiBmLmlzT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUb3BGcmFtZTogYS5pc1RvcEZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNYaHJTdXBwb3J0ZWQ6IHUuaXNYaHJTdXBwb3J0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ29va2llOiBhLnJlYWRDb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4OiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc2VudDogZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkZW50aXR5UmVzdWx0RnJvbTogbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFB1Ymxpc2hlclNvbmFyRGF0YTogYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblJldHJpZXZlOiBpLm9uLmJpbmQobnVsbCwgJ2lwX21vZHVsZV9yZXRyaWV2ZV8nICsgXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVzdWx0OiBpLm9uLmJpbmQobnVsbCwgJ2lwX21vZHVsZV9yZXN1bHRfJyArIF8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3Rlck1hdGNoOiBwLmJpbmQobnVsbCwgJ21hdGNoJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUGFzczogcC5iaW5kKG51bGwsICdwYXNzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRXJyb3I6IHAuYmluZChudWxsLCAnZXJyb3InKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJFYlRhcmdldGluZzogeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnczogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUubWFpbihJKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTdGF0c0lkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzdWx0czogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRhcmdldHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodyAmJiBmLmlzQXJyYXkody51aWRzKSAmJiB3LnVpZHMubGVuZ3RoICYmIHcudWlkc1swXS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbTy50YXJnZXRpbmdLZXlzLmV4Y2hhbmdlQmlkZGluZ10gPSB3LnVpZHNbMF0uaWQsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzLmdldEVudHJ5KEMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGpbZS5kYXRhLnJlc3BvbnNlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBjLmFsbCh0Lm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbChudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdCB8fCB0LmluZGV4T2YoITApID4gLTEgPyBudWxsIDogKGkuZW1pdCgnaHNfaWRlbnRpdHlfY2FjaGVkJywgeyBzdGF0c0lkOiBFIH0pLCByKGUuZGF0YS5yZXNwb25zZSwgZS5kYXRhLmRhdGEpLCBlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IG51bGwgOiBjLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWxsKFIubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmVtaXQoJ2hzX2lkZW50aXR5X3JlcXVlc3QnLCB7IHN0YXRzSWQ6IEUgfSksIFAgPSAhMSwgeCA9IGUsIGkuZW1pdCgnaXBfbW9kdWxlX3JldHJpZXZlXycgKyBfKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMTk6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8ubXNpZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyRXJyb3IoJ0VuY3J5cHRlZCBwaWQgbm90IHN1cHBvcnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF81ODA2YTUyNWUwODYzYTk1ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzU4MDZhNTI1ZTA4NjNhOTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfNDM2ZDZmNmY5NDc2MzI1My5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNTgwNmE1MjVlMDg2M2E5NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzU4MDZhNTI1ZTA4NjNhOTUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKGUuZHVpZCA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaS5VdGlsaXRpZXMuZ2V0SWRlbnRpdHlSZXN1bHRGcm9tKCdBZHNlcnZlck9yZ0lwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLlRESUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuVERJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudWlkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudWlkcy5maW5kKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pZCAmJiBlLmV4dCAmJiAnVERJRCcgPT09IGUuZXh0LnJ0aVBhcnRuZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIChlW2FdID0gciksIGkuVXRpbGl0aWVzLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpLlV0aWxpdGllcy5nZXRQcm90b2NvbCgpICsgdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnVuaWZpZWRJZCA/IHQudW5pZmllZElkLmlkICYmIHQudW5pZmllZElkLmtleUlEID8gaS5yZWdpc3Rlck1hdGNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogYy5zb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdC51bmlmaWVkSWQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SUQ6IHQudW5pZmllZElkLmtleUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRpUGFydG5lcjogJ0xESUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGkucmVnaXN0ZXJFcnJvcigncmVzcG9uc2UgbWlzc2luZyBpZCBhbmQvb3Iga2V5SUQnKSA6IGkucmVnaXN0ZXJFcnJvcigncmVzcG9uc2UgbWlzc2luZyB1bmlmaWVkSWQgb2JqZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyRXJyb3IoJ3Jlc3BvbnNlIGlzIG5vdCB2YWxpZCBKU09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQgPT09IGUgPyBpLnJlZ2lzdGVyUGFzcygpIDogaS5yZWdpc3RlckVycm9yKCdBUEkgcmV0dXJuZWQgZXJyb3IgcmVzcG9uc2UgJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbyA9IGUoMTEpLCBhID0gJzQ0NDg5JywgcyA9ICdfbGlfZHVpZCcsIHUgPSAnLy9pZHgubGlhZG0uY29tL2lkZXgvaWUvYW55JywgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lcklkOiAnTGl2ZUludGVudElwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNJZDogJ0xWSU5UJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEuMS4xJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnbGl2ZWludGVudC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUV4cGlyeTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDI1OTIwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3M6IDg2NDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IDg2NDAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZ0tleXM6IHsgZXhjaGFuZ2VCaWRkaW5nOiAnaXhwaWRfNScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2lkZW50aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IGUpLm9uUmV0cmlldmUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQ6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydDogJ2VudmVsb3BlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0gaS5VdGlsaXRpZXMuZ2V0Q29uc2VudCgnZ2RwcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5jb25zZW50U3RyaW5nICYmIHQudmVyc2lvbiAmJiAoZVtkLmNvbnNlbnQuZ2Rwcl0gPSB0LmNvbnNlbnRTdHJpbmcsIDEgPT0gdC52ZXJzaW9uID8gZVtjXSA9IDEgOiAyID09IHQudmVyc2lvbiAmJiAoZVtjXSA9IDQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gZC5zb25hci5lbnRyeXBvaW50c1swXS5rZXksIGwgPSBpLlV0aWxpdGllcy5nZXRQdWJsaXNoZXJTb25hckRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICYmIGwuaGFzT3duUHJvcGVydHkobikgJiYgKGVbbl0gPSBsW25dLmRhdGEsIGVbc10gPSB1LCByLnB1c2gobFtuXS5tZXRhKSksIGkuVXRpbGl0aWVzLmFqYXgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGkuVXRpbGl0aWVzLmdldFByb3RvY29sKCkgKyBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkuVXRpbGl0aWVzLmlzT2JqZWN0KG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkucmVnaXN0ZXJFcnJvcignaW52YWxpZCByZXNwb25zZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5VdGlsaXRpZXMuaXNFbXB0eShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpLnJlZ2lzdGVyUGFzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4uaGFzT3duUHJvcGVydHkoJ2VudmVsb3BlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgaS5yZWdpc3RlckVycm9yKCdpbnZhbGlkIGVudmVsb3BlIG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5VdGlsaXRpZXMuaXNFbXB0eShuLmVudmVsb3BlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpLnJlZ2lzdGVyUGFzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGQuc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBuLmVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogeyBydGlQYXJ0bmVyOiAnaWRsJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIubGVuZ3RoICYmICh0LmV4dCA9IHsgc29uYXI6IHIgfSksIGkucmVnaXN0ZXJNYXRjaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyRXJyb3IoJ3Jlc3BvbnNlIGlzIG5vdCB2YWxpZCBKU09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNCA9PT0gZSA/IGkucmVnaXN0ZXJQYXNzKCkgOiBpLnJlZ2lzdGVyRXJyb3IoJ0FQSSByZXR1cm5lZCBlcnJvciByZXNwb25zZSAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gJy8vYXBpLnJsY2RuLmNvbS9hcGkvaWRlbnRpdHknLCBhID0gMiwgcyA9ICdpdCcsIHUgPSA0LCBjID0gJ2N0JywgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lcklkOiAnTGl2ZVJhbXBJcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzSWQ6ICdMVlJBTVAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMS4zLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdsaXZlcmFtcC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUV4cGlyeTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g6IDg2NDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczogODY0MDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogODY0MDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudDogeyBnZHByOiAnY3YnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZ0tleXM6IHsgZXhjaGFuZ2VCaWRkaW5nOiAnaXhwaWRfMycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29uYXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlwb2ludHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2l2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnbzogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2lkZW50aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZSwgd2luZG93LmF0cyAmJiB3aW5kb3cuYXRzLnJldHJpZXZlRW52ZWxvcGUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBKU09OLnBhcnNlKGUpLmVudmVsb3BlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlZ2lzdGVyTWF0Y2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBkLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHsgcnRpUGFydG5lcjogJ2lkbCcgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLm9uUmV0cmlldmUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjE6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSBvLlV0aWxpdGllcy5nZXRQdWJsaXNoZXJTb25hckRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8uY29uZmlncy5lbmFibGU0Q2l0ZVRhZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzT3duUHJvcGVydHkoaSkgJiYgKGVbaV0gPSBuW2ldLmRhdGEsIHIucHVzaChuW2ldLm1ldGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLlV0aWxpdGllcy5hamF4KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBvLlV0aWxpdGllcy5nZXRQcm90b2NvbCgpICsgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvLlV0aWxpdGllcy5pc09iamVjdChuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBvLnJlZ2lzdGVyRXJyb3IoJ2ludmFsaWQgcmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jICYmIG4uYy52YWx1ZSAmJiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnX3N2c2lkJywgbi5jLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnBwaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuLnBwaWQuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG8ucmVnaXN0ZXJFcnJvcignaW52YWxpZCBwcGlkIG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbi5wcGlkLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7IGVuYzogMCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5wYW1faWQgJiYgIWEubXNpZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4ucGFtX2lkLmlkIHx8ICFuLnBhbV9pZC5rZXlJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgby5yZWdpc3RlckVycm9yKCdpbnZhbGlkIHBhbV9pZCBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG4ucGFtX2lkLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5SUQ6IG4ucGFtX2lkLmtleUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYzogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sZW5ndGggPyAodCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBkLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkczogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIubGVuZ3RoID4gMCAmJiAodC5leHQgPSB7IHNvbmFyOiByIH0pLCBvLnJlZ2lzdGVyTWF0Y2godCkpIDogby5yZWdpc3RlclBhc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnJlZ2lzdGVyRXJyb3IoJ3Jlc3BvbnNlIGlzIG5vdCB2YWxpZCBKU09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRmFpbHVyZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVnaXN0ZXJFcnJvcignQVBJIHJldHVybmVkIGVycm9yIHJlc3BvbnNlICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2RlODg5MjZkNGQ4NzczNmIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZGU4ODkyNmQ0ZDg3NzM2YikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja180MzZkNmY2Zjk0NzYzMjUzLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnJywgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb25maWdzLmVuYWJsZTRDaXRlVGFnID8gKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdfX3N2c2lkJykgJiYgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ19fc3ZzaWQnKSwgZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdfc3ZzaWQnKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdfc3ZzaWQnKSA6IG51bGwsIHQudmVuZG9yID0gJ2lkc3YyJywgdC5zdl9jaWQgPSAnNTI3NF8wNDUxMicsIHQuc3ZfcHViaWQgPSBvLmNvbmZpZ3MucHViaWQsIHQuc3ZfZG9tYWluID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIGUgJiYgKHQuc3Zfc2Vzc2lvbiA9IGUpLCBuKHQsIHUpKSA6ICh0LnB0ayA9IGMsIHQucHViaWQgPSBvLmNvbmZpZ3MucHViaWQsIG4odCwgcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZGU4ODkyNmQ0ZDg3NzM2YikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2RlODg5MjZkNGQ4NzczNmIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSA9IGUoMTEpLCBzID0gJy8vbWlkLnJrZG1zLmNvbS9pZHN2MicsIHUgPSAnLy9pZC5zdi5ya2Rtcy5jb20vaWRlbnRpdHkvJywgYyA9ICcxN2MxNzg5Yi1lNjYwLTQ5M2ItYWE3NC0zYzhmYjk5MGRjNWYnLCBkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVySWQ6ICdNZXJrbGVJcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzSWQ6ICdNUktMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzEuNC4yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnbWVya2xlaW5jLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlRXhwaXJ5OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDogNjA0ODAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczogODY0MDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogODY0MDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0aW5nS2V5czogeyBleGNoYW5nZUJpZGRpbmc6ICdpeHBpZF80JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb25hcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncXMxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnbzogMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2lkZW50aXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobyA9IGUpLm9uUmV0cmlldmUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSgxMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKDE1KSwgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KGUpIHx8ICh0W2VdID0gW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZ2VuZXJhdGVVbmlxdWVJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiBmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodCwgITEsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiBmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodCwgITAsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5oYXNPd25Qcm9wZXJ0eShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdFtyXS5sZW5ndGggLSAxOyBuID49IDA7IG4tLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbcl1bbl0uaWQgPT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0W3JdLnNwbGljZShuLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLCByID0gZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgdC5oYXNPd25Qcm9wZXJ0eShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0W3JdLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W3JdW25dLmZuLmFwcGx5KG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtyXVtuXS5vbmNlICYmIHRbcl0uc3BsaWNlKG4sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSgxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc2VudDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U3RyaW5nOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXBwbGllczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3A6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3BTdHJpbmc6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcml2YWN5RW5hYmxlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIDI0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKDEzKSwgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAyNTogWwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNvbmFyUGF5bG9hZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0VXBkYXRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNvbmFyRW1haWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjY6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSg3KSwgaSA9IGUoMTMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgxNSksIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0uc3RhdGUgPSByLlRFUk1JTkFURUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHRbZV0uY2JzLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlXS5jYnNbbl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRbZV0uY2JzLCBkZWxldGUgdFtlXS50aW1lcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVc6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVU5OQUJMRTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFUk1JTkFURUQ6IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVyU3RhdGVzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVUaW1lcjogZnVuY3Rpb24gKG8sIGEsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gaS5nZW5lcmF0ZVVuaXF1ZUlkKG4uU0VTU0lPTl9JRF9MRU5HVEgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSAhIWEsIHMgPSBzID8gW3NdIDogW10sIHRbdV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHIuTkVXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiczogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiBvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhICYmICh0W3VdLnN0YXRlID0gci5SVU5OQUJMRSwgdFt1XS50aW1lciA9IHNldFRpbWVvdXQoZSh1KSwgbykpLCB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWVyOiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiB0W25dLnN0YXRlID09PSByLk5FVyAmJiAodFtuXS5zdGF0ZSA9IHIuUlVOTkFCTEUsIHRbbl0udGltZXIgPSBzZXRUaW1lb3V0KGUobiksIHRbbl0udGltZW91dCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRUaW1lckNhbGxiYWNrOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShlKSAmJiB0W2VdLnN0YXRlICE9PSByLlRFUk1JTkFURUQgJiYgdFtlXS5jYnMudW5zaGlmdChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGltZXJTdGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lmhhc093blByb3BlcnR5KGUpID8gdFtlXS5zdGF0ZSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KGUpICYmIHRbZV0uc3RhdGUgIT09IHIuVEVSTUlOQVRFRCAmJiAodFtlXS5zdGF0ZSA9IHIuVEVSTUlOQVRFRCwgY2xlYXJUaW1lb3V0KHRbZV0udGltZXIpLCBkZWxldGUgdFtlXS5jYnMsIGRlbGV0ZSB0W2VdLnRpbWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBpLCBvID0gKGUoMyksIGUoNikpLCBhID0gZSgxNiksIHMgPSBlKDI4KSwgdSA9IGUoMTQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93W3MuTkFNRVNQQUNFXSA9IHdpbmRvd1tzLk5BTUVTUEFDRV0gfHwge30sIHdpbmRvd1tzLk5BTUVTUEFDRV0uY21kID0gd2luZG93W3MuTkFNRVNQQUNFXS5jbWQgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHdpbmRvd1tzLk5BTUVTUEFDRV0uY21kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93W3MuTkFNRVNQQUNFXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdS5pc0Jvb2xlYW4odCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5lbWl0KCdlcnJvcicsICdgb25jZWAgbXVzdCBiZSBhIGJvb2xlYW4nKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdS5pc0Z1bmN0aW9uKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZW1pdCgnZXJyb3InLCAnYGNhbGxiYWNrYCBtdXN0IGJlIGEgZnVuY3Rpb24nKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdS5pc1N0cmluZyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmVtaXQoJ2Vycm9yJywgJ2BldmVudE5hbWVgIG11c3QgYmUgYSBzdHJpbmcnKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5oYXNPd25Qcm9wZXJ0eShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmVtaXQoJ2Vycm9yJywgJ1VucmVjb2duaXplZCBldmVudCAnICsgZSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3J0aV9wYXJ0bmVyX3JlcXVlc3RfY29tcGxldGUnID09PSBlICYmICEwID09PSBvLmVtaXR0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihlLCBvLmFyZ3MpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSwgSlNPTi5zdHJpbmdpZnkodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0ID8gaS5vbmNlKGUsIGEpIDogaS5vbihlLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lbWl0KCdlcnJvcicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciwgbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZzogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0aV9wYXJ0bmVyX3JlcXVlc3RfY29tcGxldGU6IDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVR5cGVDaGVja2VyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdVU0VSX0FHRU5UJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHNTZXJ2aWNlOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVyU2VydmljZToge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVySWQ6ICdJZGVudGl0eUxheWVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHNlcnZlck9yZ0lwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnczogeyBwdWJsaXNoZXJJZDogMTgzNzI4IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJrbGVJcDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHViaWQ6ICdDQlNJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlNENpdGVUYWc6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVJhbXBJcDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVudElwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZ2V0RGlyZWN0SW50ZXJmYWNlKCksIG4gPSBzLnNlcnZpY2VzLkNvbXBsaWFuY2VTZXJ2aWNlLCBpID0gcy5zZXJ2aWNlcy5FdmVudHNTZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoLTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZW1pdCgnaHNfc2Vzc2lvbl9zdGFydCcsIHsgc2Vzc2lvbklkOiB1IH0pLCBlKCdydGlfcGFydG5lcl9yZXF1ZXN0X2NvbXBsZXRlJywgITAsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5lbWl0KCdoc19zZXNzaW9uX2VuZCcsIHsgc2Vzc2lvbklkOiB1IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLndhaXQoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5MYXllcnMuSWRlbnRpdHlMYXllci5yZXRyaWV2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlRXZlbnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmVFdmVudDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3dbcy5OQU1FU1BBQ0VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgaW4gd2luZG93W3MuTkFNRVNQQUNFXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93W3MuTkFNRVNQQUNFXS5oYXNPd25Qcm9wZXJ0eShsKSAmJiAoZFtsXSA9IHdpbmRvd1tzLk5BTUVTUEFDRV1bbF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnN1YnNjcmliZUV2ZW50ID0gZSwgZC51bnN1YnNjcmliZUV2ZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdS5pc1N0cmluZyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkuZW1pdCgnZXJyb3InLCAnYHN1YnNjcmlwdGlvbklkYCBtdXN0IGJlIGEgc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLm9mZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lbWl0KCdlcnJvcicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5nZXRJZGVudGl0eUluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LkxheWVycy5JZGVudGl0eUxheWVyLmdldEFsbFBhcnRuZXJSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5zZXRTb25hckVtYWlsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAociA9IHMuc2VydmljZXMuUHVibGlzaGVyU29uYXJTZXJ2aWNlLnNldFNvbmFyRW1haWwoZSkpLnN0YXR1cyAmJiB0LkxheWVycy5JZGVudGl0eUxheWVyLmludm9rZUFsbFBhcnRuZXJzKCksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgd2luZG93W3MuTkFNRVNQQUNFXS5jbWQgPSBvKGMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgMjg6IFsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FU1BBQ0U6ICdoZWFkZXJ0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVQ1Q6ICdJZGVudGl0eUxpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VUeXBlQ2hlY2tlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFF1ZXVlOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxUaW1lb3V0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlSWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzIuMzcuMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHt9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwge30sIFsyN10pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZHluYW1pY1RhcmdldGluZyA9IHZvaWQgMCwgcig0KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1NCk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGYocigyOSkpLCBpID0gcigyNSksIG8gPSByKDU1KSwgYSA9IHIoMjEpLCBzID0gcigxNSksIHUgPSByKDUyKSwgYyA9IHIoNTkpLCBkID0gcig4KSwgbCA9IHIoNzMpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZyA9IGYocigxMCkpLmRlZmF1bHQuTU9EVUxFUy5EWU5BTUlDX1RBUkdFVElORywgbSA9ICdwYWdlJywgdiA9ICd1bml0JywgYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fSwgdCA9IHt9LCByID0ge30sIGYgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyVGltZW91dDogKDAsIHMuZ2V0Q29uZmlnKSgnaGlnaEZyZXF1ZW5jeUFkUmVxdWVzdHMnKSA/ICgwLCBzLmdldENvbmZpZykoJ3RpbWVvdXRzLmhmYXInKSA6ICgwLCBzLmdldENvbmZpZykoJ3RpbWVvdXRzLmJpZGRlcicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvb2tpZTogbC5zdG9yYWdlLnJhdy5nZXRDb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6ICdwcm9jZXNzQWRSZXF1ZXN0JywgbiA9IHt9LCBpID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZS5ydWxlc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubGV2ZWwgPT09IG0gJiYgYS5ob29rID09PSB0ICYmIChhLmdldFZhbHVlID8gKDAsIG8ubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5tYXRjaGVyKGIoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByWydfcGFnZScgKyBhLmtleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuY2FjaGVSZXN1bHQgJiYgdm9pZCAwICE9PSBlIHx8IChlID0gYS5nZXRWYWx1ZShiKCkpLCByWydfcGFnZScgKyBhLmtleV0gPSBlKSwgbnVsbCAhPT0gZSAmJiAoblthLmtleV0gPSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGEubW9kaWZ5ICYmICgwLCBvLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5tYXRjaGVyKGIoKSkgJiYgKG4gPSBhLm1vZGlmeShuLCBiKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IDA7IGEgPCBlLnJ1bGVzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuYmJMb2dnZXIubG9nSW5mbygnU2V0dGluZyBwYWdlIGxldmVsIGR5bmFtaWMgdGFyZ2V0aW5nJywgbiksICgwLCBjLnNldFRhcmdldGluZykobik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAncHJvY2Vzc0FkUmVxdWVzdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KGUpLCB0KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAncHJvY2Vzc0FkUmVxdWVzdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgIWUucnVsZXMgfHwgIWUucnVsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSBbXSwgcyA9IDA7IHMgPCB0Lmxlbmd0aDsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdFtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKFModSwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuYmJMb2dnZXIubG9nSW5mbygnQXBwbHlpbmcgRHluYW1pYyBUYXJnZXRpbmcgUnVsZXMgbGV2ZWw9dW5pdCwgaG9vaz0nLmNvbmNhdChuKSwgZS5ydWxlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5ydWxlc1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubGV2ZWwgPT09IHYgJiYgaS5ob29rID09PSBuICYmIChpLmdldFZhbHVlID8gKDAsIG8ubWFrZVNhZmUpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5tYXRjaGVyKGwsIGIoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByW2wuY29kZSArIGkua2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jYWNoZVJlc3VsdCAmJiB2b2lkIDAgIT09IGUgfHwgKGUgPSBpLmdldFZhbHVlKGwsIGIoKSksIHJbbC5jb2RlICsgaS5rZXldID0gZSksIGwuZHluYW1pY1RhcmdldGluZyB8fCAobC5keW5hbWljVGFyZ2V0aW5nID0ge30pLCBudWxsICE9PSBlICYmIChsLmR5bmFtaWNUYXJnZXRpbmdbaS5rZXldID0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBpLm1vZGlmeSAmJiAoMCwgby5tYWtlU2FmZSkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubWF0Y2hlcihsKSAmJiAobC5keW5hbWljVGFyZ2V0aW5nID0gaS5tb2RpZnkobCwgYigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG0gPSAwOyBtIDwgZS5ydWxlcy5sZW5ndGg7IG0rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51bml0c1tsLmNvZGVdICYmIChsID0gXyhlLnVuaXRzW2wuY29kZV0sIGwpKSwgZS51bml0c1tsLm9yaWdpbmFsQ29kZV0gJiYgKGwgPSBfKGUudW5pdHNbbC5vcmlnaW5hbENvZGVdLCBsKSksIHZvaWQgMCA9PT0gaS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLmdldEdhdGVzKCkuY29uc2VudEdpdmVuIHx8IHAoaS5tb2R1bGVNYW5hZ2VyLmdhdGV3YXlzLmdldEdhdGVzKCkuY29uc2VudEdpdmVuKSB8fCAoZltsLmNvZGVdID0gbCksIGQuYmJMb2dnZXIubG9nSW5mbygnU2V0dGluZyB1bml0IGxldmVsIGR5bmFtaWMgdGFyZ2V0aW5nJywgbC5jb2RlLCBsLmR5bmFtaWNUYXJnZXRpbmcpLCAoMCwgYy5zZXRUYXJnZXRpbmcpKGwuZHluYW1pY1RhcmdldGluZywgW2wuY29kZV0pLCBsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogJ3Byb2Nlc3NBZFJlcXVlc3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChTKHIsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gXyhhLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSA/ICgwLCBvLm1ha2VTYWZlKShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50YXJnZXRpbmcgPSBlKHQsIGIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICdvYmplY3QnID09PSBwKGUpICYmIChyLnRhcmdldGluZyA9ICgwLCBuLmRlZmF1bHQpKHt9LCBlLCByLnRhcmdldGluZykpLCByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmV4cG9zdXJlQXBpLmV4cG9zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVVuaXRMZXZlbFRhcmdldGluZzogUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5UGFnZUxldmVsVGFyZ2V0aW5nOiB5CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHMuZ2V0Q29uZmlnKSgnZHluYW1pY1RhcmdldGluZycsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoMCwgcy5nZXRDb25maWcpKCdjb25zZW50JywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBlLnJ1bGVzICYmIChkLmJiTG9nZ2VyLmxvZ0luZm8oJ1NldHRpbmcgRHluYW1pYyBUYXJnZXRpbmcgYWZ0ZXIgY29uc2VudCBnaXZlbicpLCB5KCksIFMoT2JqZWN0LnZhbHVlcyhmKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LnBhZ2UgPSB7IHByb2Nlc3NBZFJlcXVlc3Q6IGgoJ3Byb2Nlc3NBZFJlcXVlc3QnKSB9LCB0LnVuaXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NBZFJlcXVlc3Q6IE8oJ3Byb2Nlc3NBZFJlcXVlc3QnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmlkVGFyZ2V0aW5nOiBPKCdzZXRCaWRUYXJnZXRpbmcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUucHJvY2Vzc0FkUmVxdWVzdC5iZWZvcmUodC5wYWdlLnByb2Nlc3NBZFJlcXVlc3QpLCB1LnByb2Nlc3NBZFJlcXVlc3QuYmVmb3JlKHQudW5pdC5wcm9jZXNzQWRSZXF1ZXN0KSwgYy5zZXRCaWRUYXJnZXRpbmcuYWZ0ZXIodC51bml0LnNldEJpZFRhcmdldGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlcjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucHJvY2Vzc0FkUmVxdWVzdC5nZXRIb29rcyh7IGhvb2s6IHQucGFnZS5wcm9jZXNzQWRSZXF1ZXN0IH0pLnJlbW92ZSgpLCB1LnByb2Nlc3NBZFJlcXVlc3QuZ2V0SG9va3MoeyBob29rOiB0LnVuaXQucHJvY2Vzc0FkUmVxdWVzdCB9KS5yZW1vdmUoKSwgYy5zZXRCaWRUYXJnZXRpbmcuZ2V0SG9va3MoeyBob29rOiB0LnVuaXQuc2V0QmlkVGFyZ2V0aW5nIH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgeSA9IGkubW9kdWxlTWFuYWdlci5yZWdpc3RlcihiKTsKICAgICAgICAgICAgICAgIHQuZHluYW1pY1RhcmdldGluZyA9IHk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5hbmFseXRpY3NNb2R1bGUgPSB2b2lkIDAsIHIoMTcpLCByKDMpLCByKDUpLCByKDYpLCByKDEzKSwgcig5KSwgcigxMSksIHIoMCksIHIoMSksIHIoNCksIHIoMik7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMjApLCBpID0gcigyMSksIG8gPSByKDcyKSwgYSA9IHIoMjUpLCBzID0gcig4KSwgdSA9IHIoMjAwKSwgYyA9IFMocigyOSkpLCBkID0gUyhyKDE0OSkpLCBsID0gcigzNSksIGYgPSByKDE1KSwgcCA9IHIoMTIyKSwgZyA9IFMocigxMCkpLCBtID0gUyhyKDE1MSkpLCB2ID0gUyhyKDEyMCkpLCBiID0gcig5OCksIHkgPSByKDQyKSwgaCA9IFMocig1MSkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSA9IHt9LCBvID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvW25dLCB0LmluZGV4T2YocikgPj0gMCB8fCAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgby5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG9bbl0sIHQuaW5kZXhPZihyKSA+PSAwIHx8IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCByKSAmJiAoaVtyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IF8oT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSShlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IF8oT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBzID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEobiA9IChhID0gcy5uZXh0KCkpLmRvbmUpICYmIChyLnB1c2goYS52YWx1ZSksICF0IHx8IHIubGVuZ3RoICE9PSB0KTsgbiA9ICEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBUID0gKDAsIHMubG9nZ2VyKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdCaWRCYXJyZWxBbmFseXRpY3MnLAogICAgICAgICAgICAgICAgICAgICAgICBiZ0NvbG9yOiAnIzhGODM4OScKICAgICAgICAgICAgICAgICAgICB9KSwgeCA9IGcuZGVmYXVsdC5FVkVOVFMsIEMgPSB4LkFOQUxZVElDU19SRUNPUkRfQ1JFQVRFRCwgUCA9IHguQU5BTFlUSUNTX1JFUE9SVEVELCBqID0geC5BTkFMWVRJQ1NfQ0FOQ0VMTEVELCBSID0gZy5kZWZhdWx0Lk1PRFVMRVMuQklEQkFSUkVMX0FOQUxZVElDUywgRCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMSwgdCA9IHt9LCByID0gW10sIGEgPSBbXSwgcyA9IHt9LCBnID0ge30sIFMgPSB7fSwgXyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB3KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUsIHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gZSA/IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogbnVsbCA6ICcnICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2hvc3RuYW1lJykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IG0uZGVmYXVsdC5nZXRWYWx1ZSgncGFnZScpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlN0cjogbS5kZWZhdWx0LmdldFZhbHVlKCdhYlN0cicpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYUNsaWVudElkOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2Nvb2tpZS5nYUNsaWVudElkJykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhbVV1aWQ6IG0uZGVmYXVsdC5nZXRWYWx1ZSgnY29va2llLmFhbVV1aWQnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ3RhcmdldGluZy5lbnYnKSB8fCBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2NvbmZpZy5wYWdlVGFyZ2V0aW5nLmVudicpIHx8ICgoMCwgYi5pc1N0YWdpbmdFbnYpKCkgPyAnc3RhZ2UnIDogJ3Byb2QnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZwUGF0aDogbS5kZWZhdWx0LmdldFZhbHVlKCdjb25maWcuZGZwUGF0aE9iai5zdHJpbmcnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RwZzogdChtLmRlZmF1bHQuZ2V0VmFsdWUoJ3RhcmdldGluZy5maXJzdHBnJyksIG51bGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHY6IHQobS5kZWZhdWx0LmdldFZhbHVlKCd0YXJnZXRpbmcucHYnKSwgbnVsbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGFnOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ3RhcmdldGluZy5mdGFnJykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0YWc6IG0uZGVmYXVsdC5nZXRWYWx1ZSgndGFyZ2V0aW5nLnR0YWcnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbjogbS5kZWZhdWx0LmdldFZhbHVlKCd0YXJnZXRpbmcuc2Vzc2lvbicpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXM6IG0uZGVmYXVsdC5nZXRWYWx1ZSgndGFyZ2V0aW5nLnN1YnNlcycpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHlwZTogbS5kZWZhdWx0LmdldFZhbHVlKCd0YXJnZXRpbmcucHR5cGUnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmd1aWQ6IG0uZGVmYXVsdC5nZXRWYWx1ZSgndGFyZ2V0aW5nLnZndWlkJykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGJhcnJlbFZlcnNpb246IG0uZGVmYXVsdC5nZXRWYWx1ZSgnYmlkYmFycmVsVmVyc2lvbicpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uVHlwZTogbS5kZWZhdWx0LmdldFZhbHVlKCdjbGllbnQuY29ubmVjdGlvblR5cGUnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvblNwZWVkOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2NsaWVudC5jb25uZWN0aW9uU3BlZWQnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZTogbS5kZWZhdWx0LmdldFZhbHVlKCdjbGllbnQucmVnaW9uJykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2NsaWVudC5jb3VudHJ5JykgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNvdW50cnlDb2RlOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2NsaWVudC5zdWJyZWdpb24nKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBXaWR0aDogbS5kZWZhdWx0LmdldFZhbHVlKCdjbGllbnQudmlld3BvcnRXaWR0aCcpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cEhlaWdodDogbS5kZWZhdWx0LmdldFZhbHVlKCdjbGllbnQudmlld3BvcnRIZWlnaHQnKSB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnVmVyc2lvbjogbS5kZWZhdWx0LmdldFZhbHVlKCdjb25maWcuX3JlbW90ZUNvbnRleHQudmVyc2lvbicpIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkOiBtLmRlZmF1bHQuZ2V0VmFsdWUoJ2F1dGhlbnRpY2F0ZWQnKSB8fCAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gMDsgbiA8IF8ubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IF9bbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHYuZGVmYXVsdCkociwgaSkgJiYgKGUgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgJiYgKF8ucHVzaChyKSwgZSA9IF8ubGVuZ3RoIC0gMSksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9bZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgMiksIHMgPSBvWzBdLCB1ID0gb1sxXSwgYyA9IEUoRSh7fSwgaSksIHUpLCBkID0gRShFKHt9LCBpKSwge30sIHsgY29udGV4dEluZGV4OiBzIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgaW4gKHIucHVzaChkKSwgZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcsIGwpICYmICh0W2xdIHx8ICh0W2xdID0gW10pLCB0W2xdLnB1c2goZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmV2ZW50RW1pdHRlci5lbWl0KEMsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gW10sIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtyXSwgaSA9IG4uY29udGV4dEluZGV4LCBvID0gTyhuLCBbJ2NvbnRleHRJbmRleCddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGkgJiYgdC5wdXNoKEUoRSh7fSwgbyksIF9baV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IEVycm9yKCcnLmNvbmNhdChKU09OLnN0cmluZ2lmeShlLCBoLmRlZmF1bHQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5lcnJvclJlcG9ydGluZy5yZXBvcnQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTW3QuaWRdIHx8IChTW3QuaWRdID0gMCksIFNbdC5pZF0rKywgdm9pZCAwICE9PSB0LmZhaWxUaHJlc2hvbGQgJiYgU1t0LmlkXSA+PSB0LmZhaWxUaHJlc2hvbGQgJiYgKFQubG9nSW5mbygnRmFpbCB0aHJlc2hvbGQgcmVhY2hlZCBmb3InLCB0LmlkLCAnY2FuY2VsbGluZy4uJyksIGNsZWFySW50ZXJ2YWwoc1t0LmlkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmV4cG9zdXJlQXBpLmV4cG9zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGxBbmFseXRpY3NSZWNvcmRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdKSB8fCBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBsLmNsb25lRGVlcCkoZSA/IEEocikgOiByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbmFseXRpY3NSZWNvcmRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdKSB8fCBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgbC5jbG9uZURlZXApKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW25dID0gZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxSZXBvcnRpbmc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tlXSAmJiAhZ1tlXS5wcm90ZWN0ZWQgJiYgKG4uZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJy5jb25jYXQoZSwgJy4nKS5jb25jYXQoaiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBnW2VdKSwgY2xlYXJJbnRlcnZhbChzW2VdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcsIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBnW2VdLCBpID0gci5zZXNzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLmZlYXR1cmVzLmdldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZVJ1bi4nLmNvbmNhdChSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlUnVuLmFsbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCB2b2lkIDAgPT09IGkgfHwgKDAsIHUucGVyY2VudGFnZVNob3VsZFJ1bikoaS5zaG91bGRSZXBvcnQgfHwgaS5yZXBvcnRpbmdQZXJjZW50YWdlLCAhMCkpICYmIChzW2VdID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgdS5wZXJjZW50YWdlUnVubmVyKShvLmZlYXR1cmVzLmdldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VSdW4uJy5jb25jYXQoUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VSdW4uYWxsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSB8fCByLnNob3VsZFJlcG9ydCB8fCByLnJlcG9ydGluZ1BlcmNlbnRhZ2UsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZXZlbnRFbWl0dGVyLmVtaXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmNvbmNhdChlLCAnLicpLmNvbmNhdChQKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBBKHRbci5pZF0pLCByKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuaWQsIG4gPSBlLnJlcG9ydCwgaSA9IGUudXJsLCBvID0gZS5mZXRjaE9wdGlvbnMsIGEgPSBlLnRyYW5zcG9ydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodFtyXSAmJiB0W3JdLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBBKHRbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQubG9nSW5mbygnKE1ldGhvZCkgUmVwb3J0aW5nIEV2ZW50cyBmb3IgY29uZmlnJywgciwgJ2V2ZW50czonLCBzW3JdKSwgbihzW3JdKSwgdFtyXSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYmVhY29uJyA9PT0gYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHt9LCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtyXSwgaSA9ICdjdHgnLmNvbmNhdChuLmNvbnRleHRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2ldIHx8ICh0W2ldID0gX1tuLmNvbnRleHRJbmRleF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odFtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5sb2dJbmZvKCcoQmVhY29uKSBSZXBvcnRpbmcgRXZlbnRzIGZvciBjb25maWcnLCByLCAnZXZlbnRzOicsIHRbcl0sIGQpLCBwLmFwaS5zZW5kQmVhY29uKGksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkczogdFtyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHM6IGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA/IHRbcl0gPSBbXSA6IHUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYmVhY29uJyAhPT0gYSB8fCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBBKHRbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQubG9nSW5mbygnKFBvc3QpIFJlcG9ydGluZyBFdmVudHMgZm9yIGNvbmZpZycsIHIsICdldmVudHM6JywgbCksIHAuYXBpLnBvc3QoaSwgKGcgPSBvLCBtID0gbCwgKDAsIGMuZGVmYXVsdCkoe30sIGcgfHwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdjb3JzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkobSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLnRoZW4oZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuLl9yZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zdGF0dXMgPj0gMjAwICYmIGkuc3RhdHVzIDwgMzAwID8gdFtyXSA9IFtdIDogeChudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geCh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQubG9nRXJyb3IoJ011c3QgcHJvdmlkZSBhIFwncmVwb3J0XCcgb3IgXCd1cmxcJyBwcm9wZXJ0eSBmb3IgQmlkQmFycmVsIEFuYWx5dGljcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBuZXcgRXJyb3IoJ011c3QgcHJvdmlkZSBhIFwncmVwb3J0XCcgb3IgXCd1cmxcJyBwcm9wZXJ0eSBmb3IgQmlkQmFycmVsIEFuYWx5dGljcy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuZXJyb3JSZXBvcnRpbmcucmVwb3J0KGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnLCBtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIuZnJlcXVlbmN5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gITAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgYS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkoYVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgZi5nZXRDb25maWcpKCdhbmFseXRpY3MuYmlkYmFycmVsJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICgwLCBkLmRlZmF1bHQpKGUsICdpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlY29yZDogSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCksIGsgPSBhLm1vZHVsZU1hbmFnZXIucmVnaXN0ZXIoRCwgbnVsbCwgeyBnYXRlOiAnY29uc2VudEdpdmVuJyB9KTsKICAgICAgICAgICAgICAgIHQuYW5hbHl0aWNzTW9kdWxlID0gazsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIoMSksIHIoMyksIHIoMCksIHIoNiksIHIoMzApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zcGVjID0gdm9pZCAwLCByKDI2KSwgcig0KSwgcigyKSwgcigyMTkpLCByKDQzKTsKICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCAnb2JqZWN0JyAhPT0gdShlKSAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuaGFzKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIGkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChvLmdldCB8fCBvLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgaSwgbykgOiByW2ldID0gZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KHIoNykpLCBpID0gcig0OSksIG8gPSByKDQ1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZihbCiAgICAgICAgICAgICAgICAgICAgICAgICdkY249JywKICAgICAgICAgICAgICAgICAgICAgICAgJyZwb3M9JywKICAgICAgICAgICAgICAgICAgICAgICAgJyZjbWQ9YmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgJycKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmKFsKICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICcvYmlkUmVxdWVzdD8nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZihbCiAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnL3B1YmFwaS8zLjAvJywKICAgICAgICAgICAgICAgICAgICAgICAgJy8nLAogICAgICAgICAgICAgICAgICAgICAgICAnLycsCiAgICAgICAgICAgICAgICAgICAgICAgICcvJywKICAgICAgICAgICAgICAgICAgICAgICAgJy9BRFRFQ0g7dj0yO2NtZD1iaWQ7Y29ycz15ZXM7YWxpYXM9JywKICAgICAgICAgICAgICAgICAgICAgICAgJzttaXNjPScsCiAgICAgICAgICAgICAgICAgICAgICAgICc7JywKICAgICAgICAgICAgICAgICAgICAgICAgJycKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IHx8ICh0ID0gZS5zbGljZSgwKSksIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgeyByYXc6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUodCkgfSB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcCA9ICdhb2wnLCBnID0gJ3Zlcml6b24nLCBtID0gJ29uZW1vYmlsZScsIHYgPSAnb25lZGlzcGxheScsIGIgPSB7IEdFVDogJ2Rpc3BsYXktZ2V0JyB9LCB5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBHRVQ6ICdtb2JpbGUtZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUE9TVDogJ21vYmlsZS1wb3N0JwogICAgICAgICAgICAgICAgICAgIH0sIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRBRzogJ2lmcmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6ICdpZnJhbWUnCiAgICAgICAgICAgICAgICAgICAgfSwgUyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVEFHOiAnaW1nJywKICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogJ2ltYWdlJwogICAgICAgICAgICAgICAgICAgIH0sIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdhZHNlcnZlci5vcmcnLAogICAgICAgICAgICAgICAgICAgICAgICAnY3JpdGVvLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdpZDUtc3luYy5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAnaW50ZW50aXEuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xpdmVpbnRlbnQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YW50Y2FzdC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAndmVyaXpvbm1lZGlhLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdsaXZlcmFtcC5jb20nCiAgICAgICAgICAgICAgICAgICAgXSwgXyA9IFQobCgpLCAnaG9zdCcsICduZXR3b3JrJywgJ3BsYWNlbWVudCcsICdwYWdlaWQnLCAnc2l6ZWlkJywgJ2FsaWFzJywgJ21pc2MnLCAnZHluYW1pY1BhcmFtcycpLCBFID0gVChkKCksICdob3N0JyksIEkgPSBUKGMoKSwgJ2RjbicsICdwb3MnLCAnZHluYW1pY1BhcmFtcycpLCB3ID0gewogICAgICAgICAgICAgICAgICAgICAgICB1czogJ2Fkc2VydmVyLXVzLmFkdGVjaC5hZHZlcnRpc2luZy5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBldTogJ2Fkc2VydmVyLWV1LmFkdGVjaC5hZHZlcnRpc2luZy5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICBhczogJ2Fkc2VydmVyLWFzLmFkdGVjaC5hZHZlcnRpc2luZy5jb20nCiAgICAgICAgICAgICAgICAgICAgfSwgQSA9IDE7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IG5ldyBBcnJheSh0ID4gMSA/IHQgLSAxIDogMCksIGkgPSAxOyBpIDwgdDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJbaSAtIDFdID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgaSA9IG5ldyBBcnJheSh0KSwgbyA9IDA7IG8gPCB0OyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbb10gPSBhcmd1bWVudHNbb107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpW2kubGVuZ3RoIC0gMV0gfHwge30sIHMgPSBbZVswXV07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbi5pc0ludGVnZXIodCkgPyBpW3RdIDogYVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaChvLCBlW3IgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gcCB8fCBlID09PSBnIHx8IGUgPT09IG07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoeChlLmJpZGRlcikgJiYgZS5wYXJhbXMuaWQgJiYgZS5wYXJhbXMuaW1wICYmIGUucGFyYW1zLmltcFswXSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucGFyYW1zLmltcFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaWQgJiYgdC50YWdpZCAmJiAodC5iYW5uZXIgJiYgdC5iYW5uZXIudyAmJiB0LmJhbm5lci5oIHx8IHQudmlkZW8gJiYgdC52aWRlby5taW1lcyAmJiB0LnZpZGVvLm1pbmR1cmF0aW9uICYmIHQudmlkZW8ubWF4ZHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4KGUuYmlkZGVyKSAmJiBlLnBhcmFtcy5kY24gJiYgZS5wYXJhbXMucG9zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodCA9IGUuYmlkZGVyKSA9PT0gcCB8fCB0ID09PSBnIHx8IHQgPT09IHYpICYmIGUucGFyYW1zLnBsYWNlbWVudCAmJiBlLnBhcmFtcy5uZXR3b3JrOwogICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudXNlcklkQXNFaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IE8uaW5kZXhPZihlLnNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgRCA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiBwLAogICAgICAgICAgICAgICAgICAgIGd2bGlkOiAyNSwKICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIG0sCiAgICAgICAgICAgICAgICAgICAgICAgIHYsCiAgICAgICAgICAgICAgICAgICAgICAgIGcKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZE1lZGlhVHlwZXM6IFtvLkJBTk5FUl0sCiAgICAgICAgICAgICAgICAgICAgaXNCaWRSZXF1ZXN0VmFsaWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqKGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUChlKSB8fCBDKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYnVpbGRSZXF1ZXN0czogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLCBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIChuLmdkcHIgPSB0LmdkcHJDb25zZW50LCBuLnVzcENvbnNlbnQgPSB0LnVzcENvbnNlbnQpLCBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQKGUpID8geS5HRVQgOiBDKGUpID8geS5QT1NUIDogaihlKSA/IGIuR0VUIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm9ybWF0QmlkUmVxdWVzdCh0LCBlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRSZXNwb25zZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuX3BhcnNlQmlkUmVzcG9uc2UociwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5sb2dFcnJvcignRW1wdHkgYmlkIHJlc3BvbnNlJywgdC5iaWRkZXJDb2RlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0VXNlclN5bmNzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICFuLmlzRW1wdHkodCkgJiYgdFswXS5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAmJiByLmV4dCAmJiByLmV4dC5waXhlbHMgPyB0aGlzLnBhcnNlUGl4ZWxJdGVtcyhyLmV4dC5waXhlbHMpIDogW107CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXRCaWRSZXF1ZXN0OiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYi5HRVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5idWlsZE1hcmtldHBsYWNlVXJsKHQsIHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiA2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuR0VUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuYnVpbGRPbmVNb2JpbGVHZXRVcmwodCwgciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDM2MDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LlBPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5idWlsZE9uZU1vYmlsZUJhc2VVcmwodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuYnVpbGRPcGVuUnRiUmVxdWVzdERhdGEodCwgciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21IZWFkZXJzOiB7ICd4LW9wZW5ydGItdmVyc2lvbic6ICcyLjInIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmJpZGRlckNvZGUgPSB0LmJpZGRlciwgbi5iaWRJZCA9IHQuYmlkSWQsIG4udXNlclN5bmNPbiA9IHQucGFyYW1zLnVzZXJTeW5jT24sIG47CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZE1hcmtldHBsYWNlVXJsOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSA9IGUucGFyYW1zLCBvID0gaS5zZXJ2ZXIsIGEgPSBpLnJlZ2lvbiB8fCAndXMnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdy5oYXNPd25Qcm9wZXJ0eShhKSB8fCAobi5sb2dXYXJuKCdVbmtub3duIHJlZ2lvbiBcJycuY29uY2F0KGEsICdcJyBmb3IgQU9MIGJpZGRlci4nKSksIGEgPSAndXMnKSwgciA9IG8gfHwgd1thXSwgaS5yZWdpb24gPSBhLCB0aGlzLmFwcGx5UHJvdG9jb2woXyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0OiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yazogaS5uZXR3b3JrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50OiBwYXJzZUludChpLnBsYWNlbWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlaWQ6IGkucGFnZUlkIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplaWQ6IGkuc2l6ZUlkIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogaS5hbGlhcyB8fCBuLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2M6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1BhcmFtczogdGhpcy5mb3JtYXRNYXJrZXRwbGFjZUR5bmFtaWNQYXJhbXMoaSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYnVpbGRPbmVNb2JpbGVHZXRVcmw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wYXJhbXMsIG4gPSByLmRjbiwgaSA9IHIucG9zLCBvID0gci5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB1KGUudXNlcklkKSAmJiAobyA9IG8gfHwge30sIFIoZSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb1snZWlkJyArIGUuc291cmNlXSA9IGUudWlkc1swXS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMuYnVpbGRPbmVNb2JpbGVCYXNlVXJsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMuZm9ybWF0T25lTW9iaWxlRHluYW1pY1BhcmFtcyhvLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKz0gSSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNuOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUGFyYW1zOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkT25lTW9iaWxlQmFzZVVybDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlQcm90b2NvbChFKHsgaG9zdDogZS5wYXJhbXMuaG9zdCB8fCAnYzJzaGIuc3NwLnlhaG9vLmNvbScgfSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm90b2NvbDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eaHR0cHM/OlwvXC8vaS50ZXN0KGUpID8gZSA6IDAgPT09IGUuaW5kZXhPZignLy8nKSA/ICcnLmNvbmNhdCgnaHR0cHMnLCAnOicpLmNvbmNhdChlKSA6ICcnLmNvbmNhdCgnaHR0cHMnLCAnOi8vJykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0TWFya2V0cGxhY2VEeW5hbWljUGFyYW1zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge30sIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5iaWRGbG9vciAmJiAoci5iaWRmbG9vciA9IGUuYmlkRmxvb3IpLCBzKHIsIHRoaXMuZm9ybWF0S2V5VmFsdWVzKGUua2V5VmFsdWVzKSksIHMociwgdGhpcy5mb3JtYXRDb25zZW50RGF0YSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLl9lYWNoKHIsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9ICcnLmNvbmNhdCh0LCAnPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZSksICc7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0T25lTW9iaWxlRHluYW1pY1BhcmFtczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VjdXJlUHJvdG9jb2woKSAmJiAoZS5zZWN1cmUgPSBBKSwgcyhlLCB0aGlzLmZvcm1hdENvbnNlbnREYXRhKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uX2VhY2goZSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKz0gJyYnLmNvbmNhdCh0LCAnPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkT3BlblJ0YlJlcXVlc3REYXRhOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge30sIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUucGFyYW1zLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcDogZS5wYXJhbXMuaW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0VVQ29uc2VudFJlcXVpcmVkKHQpICYmIChuLmRlZXBTZXRWYWx1ZShyLCAncmVncy5leHQuZ2RwcicsIEEpLCB0LmdkcHIuY29uc2VudFN0cmluZyAmJiBuLmRlZXBTZXRWYWx1ZShyLCAndXNlci5leHQuY29uc2VudCcsIHQuZ2Rwci5jb25zZW50U3RyaW5nKSksIHQudXNwQ29uc2VudCAmJiBuLmRlZXBTZXRWYWx1ZShyLCAncmVncy5leHQudXNfcHJpdmFjeScsIHQudXNwQ29uc2VudCksICdvYmplY3QnID09PSB1KGUudXNlcklkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci51c2VyID0gci51c2VyIHx8IHt9LCByLnVzZXIuZXh0ID0gci51c2VyLmV4dCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gUihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubGVuZ3RoID4gMCAmJiAoci51c2VyLmV4dC5laWRzID0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0VVQ29uc2VudFJlcXVpcmVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoZSAmJiBlLmdkcHIgJiYgZS5nZHByLmdkcHJBcHBsaWVzKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdEtleVZhbHVlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uX2VhY2goZSwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbJ2t2Jy5jb25jYXQocildID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb25zZW50RGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNFVUNvbnNlbnRSZXF1aXJlZChlKSAmJiAodC5nZHByID0gQSwgZS5nZHByLmNvbnNlbnRTdHJpbmcgJiYgKHQuZXVjb25zZW50ID0gZS5nZHByLmNvbnNlbnRTdHJpbmcpKSwgZS51c3BDb25zZW50ICYmICh0LnVzX3ByaXZhY3kgPSBlLnVzcENvbnNlbnQpLCB0OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcGFyc2VQaXhlbEl0ZW1zOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC9cdyooPz1ccykvLCByID0gL3NyYz0oInwnKSguKj8pXDEvLCBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUubWF0Y2goLyhpbWd8aWZyYW1lKVtcc1xTXSo/c3JjXHMqPVxzKigifCcpKC4qPylcMi9naSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5tYXRjaCh0KVswXSwgbyA9IGUubWF0Y2gocilbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpICYmIG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGkgPT09IFMuVEFHID8gUy5UWVBFIDogaC5UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgX3BhcnNlQmlkUmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGUuc2VhdGJpZFswXS5iaWRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5leHQgJiYgci5leHQuZW5jcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHIuZXh0LmVuY3A7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVsbCA9PT0gKGkgPSByLnByaWNlKSB8fCBpc05hTihpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbi5sb2dFcnJvcignSW52YWxpZCBwcmljZSBpbiBiaWQgcmVzcG9uc2UnLCBwLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyQ29kZTogdC5iaWRkZXJDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiB0LmJpZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQ6IHIuYWRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIudywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogci5oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogci5jcmlkIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJhcGlJZDogZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBlLmN1ciB8fCAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxJZDogci5kZWFsaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRSZXZlbnVlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogdC50dGwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzT25lTW9iaWxlQmlkZGVyOiB4LAogICAgICAgICAgICAgICAgICAgIGlzU2VjdXJlUHJvdG9jb2w6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdodHRwczonID09PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5zcGVjID0gRCwgKDAsIGkucmVnaXN0ZXJCaWRkZXIpKEQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigxKSwgcigzKSwgcigwKSwgcig2KSwgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNwZWMgPSB2b2lkIDAsIHIoMjYpLCByKDQpLCByKDIpLCByKDE1MyksIHIoMTIzKSwgcigzMyksIHIoMTYpOwogICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBkKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBuID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbiA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgaSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKG8uZ2V0IHx8IG8uc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBpLCBvKSA6IHJbaV0gPSBlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIGkgPSByKDQ5KSwgbyA9IHIoNDUpLCBhID0gcigyMiksIHMgPSByKDc2KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbCA9ICdodHRwczovL3B1Ym1hdGljLmJidm1zLmNvbS9yLycuY29uY2F0KCckUkVOREVSRVInLCAnLmpzJyksIGYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGthZHBhZ2V1cmw6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBnZW5kZXI6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB5b2I6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBsYXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBsb246ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB3aWlkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZklkOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgdmVySWQ6ICcnCiAgICAgICAgICAgICAgICAgICAgfSwgcCA9ICdudW1iZXInLCBnID0gJ3N0cmluZycsIG0gPSAnYm9vbGVhbicsIHYgPSAnYXJyYXknLCBiID0gewogICAgICAgICAgICAgICAgICAgICAgICBtaW1lczogdiwKICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IHAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uOiBwLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydGRlbGF5OiBwLAogICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja21ldGhvZDogdiwKICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiB2LAogICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgIHc6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgIGg6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgIGJhdHRyOiB2LAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXJpdHk6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogcCwKICAgICAgICAgICAgICAgICAgICAgICAgbWluYml0cmF0ZTogcCwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4Yml0cmF0ZTogcAogICAgICAgICAgICAgICAgICAgIH0sIHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRJVExFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ3RpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnaW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBJQ09OOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2ljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTUE9OU09SRURCWTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdzcG9uc29yZWRCeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJPRFk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnYm9keScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENMSUNLVVJMOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2NsaWNrVXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVklERU86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAndmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBFWFQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgREFUQTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnbG9nbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNQT05TT1JFRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnc3BvbnNvcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgREVTQzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJBVElORzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAncmF0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDMKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTElLRVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2xpa2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDQKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRE9XTkxPQURTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdkb3dubG9hZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogNQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBQUklDRTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAncHJpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogNgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTQUxFUFJJQ0U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ3NhbGVwcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiA3CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBIT05FOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdwaG9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiA4CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFERFJFU1M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2FkZHJlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogOQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBERVNDMjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGVzYzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRElTUExBWVVSTDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGlzcGxheXVybCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDVEE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2N0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxMgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgaCA9IDEsIFMgPSAyLCBPID0gMywgXyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHkuU1BPTlNPUkVEQlkuSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHR5cGU6IDEgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeS5USVRMRS5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeS5JTUFHRS5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwgRSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgMTogJ1BNUCcsCiAgICAgICAgICAgICAgICAgICAgICAgIDU6ICdQUkVGJywKICAgICAgICAgICAgICAgICAgICAgICAgNjogJ1BNUEcnCiAgICAgICAgICAgICAgICAgICAgfSwgSSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwUGxheWVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IGNvZGU6IGUuYWRVbml0Q29kZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudmFzdFhtbCA/IHQudmFzdFhtbCA9IGUudmFzdFhtbCA6IGUudmFzdFVybCAmJiAodC52YXN0VXJsID0gZS52YXN0VXJsKSwgZS52YXN0WG1sIHx8IGUudmFzdFVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIGkgPSBJLmdldFJlbmRlcmVySWQoJ3B1Ym1hdGljJywgZS5yZW5kZXJlckNvZGUpLCBvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5hZFVuaXRDb2RlKSwgYSA9IDA7IGEgPCB3aW5kb3cuYmx1ZWJpbGx5d2lnLnJlbmRlcmVycy5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmJsdWViaWxseXdpZy5yZW5kZXJlcnNbYV0uX2lkID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gd2luZG93LmJsdWViaWxseXdpZy5yZW5kZXJlcnNbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gci5ib290c3RyYXAodCwgbykgOiBuLmxvZ1dhcm4oJycuY29uY2F0KCdQdWJNYXRpYzogJywgJzogQ291bGRuXCd0IGZpbmQgYSByZW5kZXJlciB3aXRoICcpLmNvbmNhdChpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9nV2FybignJy5jb25jYXQoJ1B1Yk1hdGljOiAnLCAnOiBObyB2YXN0WG1sIG9yIHZhc3RVcmwgb24gYmlkLCBiYWlsaW5nLi4uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBuZXdSZW5kZXJlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbC5yZXBsYWNlKCckUkVOREVSRVInLCBlKSwgaSA9IHMuUmVuZGVyZXIuaW5zdGFsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldFJlbmRlcihJLm91dHN0cmVhbVJlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5sb2dXYXJuKCcnLmNvbmNhdCgnUHViTWF0aWM6ICcsICc6IEVycm9yIHR5aW5nIHRvIHNldFJlbmRlciBvbiByZW5kZXJlcicpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW1SZW5kZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbmRlcmVyLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuYm9vdHN0cmFwUGxheWVyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbmRlcmVySWQ6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGUsICctJykuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdyA9IDAsIEEgPSAhMSwgVCA9IHt9LCB4ID0ge307CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobi5pc1N0cih0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncG16b25laWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc3BsaXQoJywnKS5zbGljZSgwLCA1MCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbigpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdrYWRmbG9vcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xhdCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xvbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh0KSB8fCB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3lvYic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodCkgfHwgdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIG4ubG9nV2FybignUHViTWF0aWM6IElnbm9yaW5nIHBhcmFtIGtleTogJyArIGUgKyAnLCBleHBlY3RzIHN0cmluZy12YWx1ZSwgZm91bmQgJyArIGQodCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgIGUucGFyYW1zLmFkVW5pdCA9ICcnLCBlLnBhcmFtcy5hZFVuaXRJbmRleCA9ICcwJywgZS5wYXJhbXMud2lkdGggPSAwLCBlLnBhcmFtcy5oZWlnaHQgPSAwLCBlLnBhcmFtcy5hZFNsb3QgPSAodCA9IGUucGFyYW1zLmFkU2xvdCwgbi5pc1N0cih0KSA/IHQucmVwbGFjZSgvXlxzKy9nLCAnJykucmVwbGFjZSgvXHMrJC9nLCAnJykgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnBhcmFtcy5hZFNsb3QsIGkgPSByLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHIgPSBpWzBdLCAyID09IGkubGVuZ3RoICYmIChlLnBhcmFtcy5hZFVuaXRJbmRleCA9IGlbMV0pLCBpID0gci5zcGxpdCgnQCcpLCBlLnBhcmFtcy5hZFVuaXQgPSBpWzBdLCBpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgIT0gKGkgPSBpWzFdLnNwbGl0KCd4JykpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbi5sb2dXYXJuKCdQdWJNYXRpYzogQWRTbG90IEVycm9yOiBhZFNsb3Qgbm90IGluIHJlcXVpcmVkIGZvcm1hdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUucGFyYW1zLndpZHRoID0gcGFyc2VJbnQoaVswXSwgMTApLCBlLnBhcmFtcy5oZWlnaHQgPSBwYXJzZUludChpWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLmhhc093blByb3BlcnR5KCdtZWRpYVR5cGVzJykgJiYgZS5tZWRpYVR5cGVzLmhhc093blByb3BlcnR5KG8uQkFOTkVSKSAmJiBlLm1lZGlhVHlwZXMuYmFubmVyLmhhc093blByb3BlcnR5KCdzaXplcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBzID0gW107IGEgPCBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID09PSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzW2FdLmxlbmd0aCAmJiBzLnB1c2goZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplc1thXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcyA9IHMsIGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMubGVuZ3RoID49IDEgJiYgKGUucGFyYW1zLndpZHRoID0gZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplc1swXVswXSwgZS5wYXJhbXMuaGVpZ2h0ID0gZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplc1swXVsxXSwgZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcyA9IGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMuc3BsaWNlKDEsIGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMubGVuZ3RoIC0gMSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gJ0lnbm9yaW5nIHBhcmFtIGtleTogJyArIGUgKyAnLCBleHBlY3RzICcgKyByICsgJywgZm91bmQgJyArIGQodCk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBtOgogICAgICAgICAgICAgICAgICAgICAgICBpID0gbi5pc0Jvb2xlYW47CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgcDoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4uaXNOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgZzoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4uaXNTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgdjoKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4uaXNBcnJheTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGkodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG4ubG9nV2FybignUHViTWF0aWM6ICcgKyBvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5LRVk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUuSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0W3JdLnJlcXVpcmVkID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUuVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjogdFtyXS5sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHRbcl0uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IGFzc2V0czogW10gfTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzT3duUHJvcGVydHkocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0LmFzc2V0cyAmJiB0LmFzc2V0cy5sZW5ndGggPiAwICYmIHQuYXNzZXRzLmhhc093blByb3BlcnR5KHIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5USVRMRS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0ubGVuIHx8IGVbcl0ubGVuZ3RoID8gaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB5LlRJVExFLklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVbcl0ucmVxdWlyZWQgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiBlW3JdLmxlbiB8fCBlW3JdLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IGVbcl0uZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBFcnJvcjogVGl0bGUgTGVuZ3RoIGlzIHJlcXVpcmVkIGZvciBuYXRpdmUgYWQ6ICcgKyBKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5JTUFHRS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0uc2l6ZXMgJiYgZVtyXS5zaXplcy5sZW5ndGggPiAwID8gaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB5LklNQUdFLklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVbcl0ucmVxdWlyZWQgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVtyXS53IHx8IGVbcl0ud2lkdGggfHwgKGVbcl0uc2l6ZXMgPyBlW3JdLnNpemVzWzBdIDogdW5kZWZpbmVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlW3JdLmggfHwgZVtyXS5oZWlnaHQgfHwgKGVbcl0uc2l6ZXMgPyBlW3JdLnNpemVzWzFdIDogdW5kZWZpbmVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bWluOiBlW3JdLndtaW4gfHwgZVtyXS5taW5pbXVtV2lkdGggfHwgKGVbcl0ubWluc2l6ZXMgPyBlW3JdLm1pbnNpemVzWzBdIDogdW5kZWZpbmVkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobWluOiBlW3JdLmhtaW4gfHwgZVtyXS5taW5pbXVtSGVpZ2h0IHx8IChlW3JdLm1pbnNpemVzID8gZVtyXS5taW5zaXplc1sxXSA6IHVuZGVmaW5lZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IGVbcl0ubWltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiBlW3JdLmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogbi5sb2dXYXJuKCdQdWJNYXRpYzogRXJyb3I6IEltYWdlIHNpemVzIGlzIHJlcXVpcmVkIGZvciBuYXRpdmUgYWQ6ICcgKyBKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5JQ09OLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtyXS5zaXplcyAmJiBlW3JdLnNpemVzLmxlbmd0aCA+IDAgPyBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHkuSUNPTi5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlW3JdLnJlcXVpcmVkID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGVbcl0udyB8fCBlW3JdLndpZHRoIHx8IChlW3JdLnNpemVzID8gZVtyXS5zaXplc1swXSA6IHVuZGVmaW5lZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZVtyXS5oIHx8IGVbcl0uaGVpZ2h0IHx8IChlW3JdLnNpemVzID8gZVtyXS5zaXplc1sxXSA6IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IG4ubG9nV2FybignUHViTWF0aWM6IEVycm9yOiBJY29uIHNpemVzIGlzIHJlcXVpcmVkIGZvciBuYXRpdmUgYWQ6ICcgKyBKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5WSURFTy5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogeS5WSURFTy5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlW3JdLnJlcXVpcmVkID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmR1cmF0aW9uOiBlW3JdLm1pbmR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uOiBlW3JdLm1heGR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sczogZVtyXS5wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IGVbcl0ubWltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiBlW3JdLmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuRVhULktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB5LkVYVC5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlW3JdLnJlcXVpcmVkID8gMSA6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkxPR08uS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHkuTE9HTy5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlW3JdLnJlcXVpcmVkID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGVbcl0udyB8fCBlW3JdLndpZHRoIHx8IChlW3JdLnNpemVzID8gZVtyXS5zaXplc1swXSA6IHVuZGVmaW5lZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZVtyXS5oIHx8IGVbcl0uaGVpZ2h0IHx8IChlW3JdLnNpemVzID8gZVtyXS5zaXplc1sxXSA6IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LlNQT05TT1JFREJZLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuQk9EWS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LlJBVElORy5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkxJS0VTLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuRE9XTkxPQURTLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUFJJQ0UuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5TQUxFUFJJQ0UuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5QSE9ORS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkFERFJFU1MuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5ERVNDMi5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkRJU1BMQVlVUkwuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5DVEEuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gUih4W3JdLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpLmlkICYmICh0LmFzc2V0c1t0LmFzc2V0cy5sZW5ndGhdID0gaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBvID0gXy5sZW5ndGgsIGEgPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHQuYXNzZXRzLmxlbmd0aCwgbiA9IDA7IG4gPCByOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlkID09IHQuYXNzZXRzW25dLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIEEgPSBvICE9IGEsIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciA9IGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMsIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSByICYmIG4uaXNBcnJheShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IHt9LCBlLnBhcmFtcy53aWR0aCB8fCBlLnBhcmFtcy5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudyA9IGUucGFyYW1zLndpZHRoLCB0LmggPSBlLnBhcmFtcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHVuZGVmaW5lZCwgbi5sb2dXYXJuKCdQdWJNYXRpYzogRXJyb3I6IG1lZGlhVHlwZXMuYmFubmVyLnNpemUgbWlzc2luZyBmb3IgYWR1bml0OiAnICsgZS5wYXJhbXMuYWRVbml0ICsgJy4gSWdub3JpbmcgdGhlIGJhbm5lciBpbXByZXNzaW9uIGluIHRoZSBhZHVuaXQuJyksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LncgPSBwYXJzZUludChyWzBdWzBdLCAxMCksIHQuaCA9IHBhcnNlSW50KHJbMF1bMV0sIDEwKSwgciA9IHIuc3BsaWNlKDEsIHIubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5sZW5ndGggPiAwICYmIChpID0gW10sIHIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5sZW5ndGggPiAxICYmIGkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkubGVuZ3RoID4gMCAmJiAodC5mb3JtYXQgPSBpKSksIHQucG9zID0gMCwgdC50b3BmcmFtZSA9IG4uaW5JZnJhbWUoKSA/IDAgOiAxOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9nV2FybignUHViTWF0aWM6IEVycm9yOiBtZWRpYVR5cGVzLmJhbm5lci5zaXplIG1pc3NpbmcgZm9yIGFkdW5pdDogJyArIGUucGFyYW1zLmFkVW5pdCArICcuIElnbm9yaW5nIHRoZSBiYW5uZXIgaW1wcmVzc2lvbiBpbiB0aGUgYWR1bml0LicpLCB0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE4oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByID0gZS5wYXJhbXMudmlkZW87CiAgICAgICAgICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCAhPT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluICh0ID0ge30sIGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmhhc093blByb3BlcnR5KGkpICYmICh0W2ldID0gaihpLCByW2ldLCBiW2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbi5pc0FycmF5KGUubWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplWzBdKSA/ICh0LncgPSBwYXJzZUludChlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZVswXVswXSwgMTApLCB0LmggPSBwYXJzZUludChlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZVswXVsxXSwgMTApKSA6IG4uaXNOdW1iZXIoZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF0pICYmICh0LncgPSBwYXJzZUludChlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZVswXSwgMTApLCB0LmggPSBwYXJzZUludChlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZVsxXSwgMTApKSwgZS5wYXJhbXMudmlkZW8uaGFzT3duUHJvcGVydHkoJ3NraXBwYWJsZScpICYmICh0LmV4dCA9IHsgdmlkZW9fc2tpcHBhYmxlOiBlLnBhcmFtcy52aWRlby5za2lwcGFibGUgPyAxIDogMCB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gdW5kZWZpbmVkLCBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBFcnJvcjogVmlkZW8gY29uZmlnIHBhcmFtcyBtaXNzaW5nIGZvciBhZHVuaXQ6ICcgKyBlLnBhcmFtcy5hZFVuaXQgKyAnIHdpdGggbWVkaWFUeXBlIHNldCBhcyB2aWRlby4gSWdub3JpbmcgdmlkZW8gaW1wcmVzc2lvbiBpbiB0aGUgYWR1bml0LicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBzID0ge30sIHUgPSB7fSwgYyA9IGUuaGFzT3duUHJvcGVydHkoJ3NpemVzJykgPyBlLnNpemVzIDogW10sIGwgPSAnJywgZiA9IFtdOwogICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wYXJhbXMuZGVhbHMgJiYgKG4uaXNBcnJheSh0LnBhcmFtcy5kZWFscykgPyB0LnBhcmFtcy5kZWFscy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pc1N0cih0KSAmJiB0Lmxlbmd0aCA+IDMgPyAoZS5wbXAgfHwgKGUucG1wID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlX2F1Y3Rpb246IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnBtcC5kZWFscy5wdXNoKHsgaWQ6IHQgfSkpIDogbi5sb2dXYXJuKCdQdWJNYXRpYzogRXJyb3I6IGRlYWwtaWQgcHJlc2VudCBpbiBhcnJheSBiaWQucGFyYW1zLmRlYWxzIHNob3VsZCBiZSBhIHN0cmluZ3Mgd2l0aCBtb3JlIHRoYW4gMyBjaGFyYXRlcnMgbGVuZ3RoLCBkZWFsLWlkIGlnbm9yZWQ6ICcgKyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbi5sb2dXYXJuKCdQdWJNYXRpYzogRXJyb3I6IGJpZC5wYXJhbXMuZGVhbHMgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9KHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZS5iaWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2lkOiBlLnBhcmFtcy5hZFVuaXQgfHwgdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZmxvb3I6IEMoJ2thZGZsb29yJywgZS5wYXJhbXMua2FkZmxvb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7IHBtWm9uZUlkOiBDKCdwbXpvbmVpZCcsIGUucGFyYW1zLnBtem9uZWlkKSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZmxvb3JjdXI6IGUucGFyYW1zLmN1cnJlbmN5ID8gQygnY3VycmVuY3knLCBlLnBhcmFtcy5jdXJyZW5jeSkgOiAnVVNEJwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgZS5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFUeXBlcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCBpbiBlLm1lZGlhVHlwZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvLkJBTk5FUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgIT09IChyID0gayhlKSkgJiYgKHMuYmFubmVyID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG8uTkFUSVZFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KEQoZS5uYXRpdmVQYXJhbXMpKSwgQSA/IG4ubG9nV2FybignUHViTWF0aWM6IEVycm9yOiBFcnJvciBpbiBOYXRpdmUgYWR1bml0ICcgKyBlLnBhcmFtcy5hZFVuaXQgKyAnLiBJZ25vcmluZyB0aGUgYWR1bml0LiBSZWZlciB0byBodHRwOi8vcHJlYmlkLm9yZy9kZXYtZG9jcy9zaG93LW5hdGl2ZS1hZHMuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLicpIDogcy5uYXRpdmUgPSB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvLlZJREVPOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCAhPT0gKGkgPSBOKGUpKSAmJiAocy52aWRlbyA9IGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGUucGFyYW1zLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZS5wYXJhbXMuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wZnJhbWU6IG4uaW5JZnJhbWUoKSA/IDAgOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uaXNBcnJheShjKSAmJiBjLmxlbmd0aCA+IDEgJiYgKChjID0gYy5zcGxpY2UoMSwgYy5sZW5ndGggLSAxKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5mb3JtYXQgPSBmKSwgcy5iYW5uZXIgPSByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdC5nZXRGbG9vciB8fCBhLmNvbmZpZy5nZXRDb25maWcoJ3B1Ym1hdGljLmRpc2FibGVGbG9vcnMnKSB8fCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLkJBTk5FUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uVklERU8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLk5BVElWRQogICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmdldEZsb29yKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGUuYmlkZmxvb3JjdXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBkKGkpICYmIGkuY3VycmVuY3kgPT09IGUuYmlkZmxvb3JjdXIgJiYgIWlzTmFOKHBhcnNlSW50KGkuZmxvb3IpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHBhcnNlRmxvYXQoaS5mbG9vcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSAtMSA9PSByID8gbyA6IE1hdGgubWluKG8sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkZmxvb3IgJiYgKHIgPSBNYXRoLm1heChyLCBlLmJpZGZsb29yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkZmxvb3IgPSAhaXNOYU4ocikgJiYgciA+IDAgPyByIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0ocywgZSksIHMuaGFzT3duUHJvcGVydHkoby5CQU5ORVIpIHx8IHMuaGFzT3duUHJvcGVydHkoby5OQVRJVkUpIHx8IHMuaGFzT3duUHJvcGVydHkoby5WSURFTykgPyBzIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbi5fZWFjaCh5LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIFRbZS5JRF0gPSBlLktFWTsKICAgICAgICAgICAgICAgIH0pLCBuLl9lYWNoKHksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgeFtlLktFWV0gPSBlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgVSA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiAncHVibWF0aWMnLAogICAgICAgICAgICAgICAgICAgIGd2bGlkOiA3NiwKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIG8uQkFOTkVSLAogICAgICAgICAgICAgICAgICAgICAgICBvLlZJREVPLAogICAgICAgICAgICAgICAgICAgICAgICBvLk5BVElWRQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgaXNCaWRSZXF1ZXN0VmFsaWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUucGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4uaXNTdHIoZS5wYXJhbXMucHVibGlzaGVySWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubG9nV2FybignUHViTWF0aWM6IEVycm9yOiBwdWJsaXNoZXJJZCBpcyBtYW5kYXRvcnkgYW5kIGNhbm5vdCBiZSBudW1lcmljICh3cmFwIGl0IGluIHF1b3RlcyBpbiB5b3VyIGNvbmZpZykuIENhbGwgdG8gT3BlbkJpZCB3aWxsIG5vdCBiZSBzZW50IGZvciBhZCB1bml0OiAnICsgSlNPTi5zdHJpbmdpZnkoZSkpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndmlkZW8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5wYXJhbXMudmlkZW8uaGFzT3duUHJvcGVydHkoJ21pbWVzJykgfHwgIW4uaXNBcnJheShlLnBhcmFtcy52aWRlby5taW1lcykgfHwgMCA9PT0gZS5wYXJhbXMudmlkZW8ubWltZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBFcnJvcjogRm9yIHZpZGVvIGFkcywgbWltZXMgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IHNwZWNpZnkgYXRsZWFzZSAxIG1pbWUgdmFsdWUuIENhbGwgdG8gT3BlbkJpZCB3aWxsIG5vdCBiZSBzZW50IGZvciBhZCB1bml0OicgKyBKU09OLnN0cmluZ2lmeShlKSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaGFzT3duUHJvcGVydHkoJ21lZGlhVHlwZXMnKSB8fCAhZS5tZWRpYVR5cGVzLmhhc093blByb3BlcnR5KG8uVklERU8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxvZ0Vycm9yKCcnLmNvbmNhdCgnUHViTWF0aWM6ICcsICc6IG1lZGlhVHlwZXMgb3IgbWVkaWFUeXBlcy52aWRlbyBpcyBub3Qgc3BlY2lmaWVkLiBSZWplY3RpbmcgYmlkOiAnKSwgZSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUubWVkaWFUeXBlc1tvLlZJREVPXS5oYXNPd25Qcm9wZXJ0eSgnY29udGV4dCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxvZ0Vycm9yKCcnLmNvbmNhdCgnUHViTWF0aWM6ICcsICc6IG5vIGNvbnRleHQgc3BlY2lmaWVkIGluIGJpZC4gUmVqZWN0aW5nIGJpZDogJyksIGUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvdXRzdHJlYW0nID09PSBlLm1lZGlhVHlwZXNbby5WSURFT10uY29udGV4dCAmJiAhbi5pc1N0cihlLnBhcmFtcy5vdXRzdHJlYW1BVSkgJiYgIWUuaGFzT3duUHJvcGVydHkoJ3JlbmRlcmVyJykgJiYgIWUubWVkaWFUeXBlc1tvLlZJREVPXS5oYXNPd25Qcm9wZXJ0eSgncmVuZGVyZXInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5sb2dFcnJvcignJy5jb25jYXQoJ1B1Yk1hdGljOiAnLCAnOiBmb3IgIm91dHN0cmVhbSIgYmlkcyBlaXRoZXIgb3V0c3RyZWFtQVUgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgb3IgYWQgdW5pdCBzdXBwbGllZCByZW5kZXJlciBpcyByZXF1aXJlZC4gUmVqZWN0aW5nIGJpZDogJyksIGUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYnVpbGRSZXF1ZXN0czogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5yZWZlcmVySW5mbyAmJiAociA9IHQucmVmZXJlckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgcywgdSwgbCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVSTDogZSAmJiBlLnJlZmVyZXIgPyBlLnJlZmVyZXIgOiB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVVJMOiB3aW5kb3cuZG9jdW1lbnQucmVmZXJyZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyKSwgcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcnICsgbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0OiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXI6IFsnVVNEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IGUucGFnZVVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogZS5yZWZVUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXI6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWE6IG5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqczogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRudDogJ3llcycgPT0gbmF2aWdhdG9yLmRvTm90VHJhY2sgfHwgJzEnID09IG5hdmlnYXRvci5kb05vdFRyYWNrIHx8ICcxJyA9PSBuYXZpZ2F0b3IubXNEb05vdFRyYWNrID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBzY3JlZW4uaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogc2NyZWVuLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IG5hdmlnYXRvci5sYW5ndWFnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpLCBnID0gJycsIG0gPSBbXSwgdiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpID0gbi5kZWVwQ2xvbmUoZSkpLnBhcmFtcy5hZFNsb3QgPSBpLnBhcmFtcy5hZFNsb3QgfHwgJycsIFAoaSksIGkucGFyYW1zLmhhc093blByb3BlcnR5KCd2aWRlbycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGkuaGFzT3duUHJvcGVydHkoJ21lZGlhVHlwZXMnKSAmJiBpLm1lZGlhVHlwZXMuaGFzT3duUHJvcGVydHkoby5OQVRJVkUpIHx8IDAgIT09IGkucGFyYW1zLndpZHRoIHx8IDAgIT09IGkucGFyYW1zLmhlaWdodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbi5sb2dXYXJuKCdQdWJNYXRpYzogU2tpcHBpbmcgdGhlIG5vbi1zdGFuZGFyZCBhZHNsb3Q6ICcsIGkucGFyYW1zLmFkU2xvdCwgSlNPTi5zdHJpbmdpZnkoaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1YklkID0gbC5wdWJJZCB8fCBpLnBhcmFtcy5wdWJsaXNoZXJJZCwgKGwgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyIGluICh0LmthZHBhZ2V1cmwgfHwgKHQua2FkcGFnZXVybCA9IHQucGFnZVVSTCksIGYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmhhc093blByb3BlcnR5KHIpICYmIChpID0gZVtyXSkgJiYgKCdvYmplY3QnID09PSBkKG8gPSBmW3JdKSAmJiAoaSA9IG8uZihpLCB0KSksIG4uaXNTdHIoaSkgPyB0W3JdID0gaSA6IG4ubG9nV2FybignUHViTWF0aWM6IElnbm9yaW5nIHBhcmFtIDogJyArIHIgKyAnIHdpdGggdmFsdWUgOiAnICsgZltyXSArICcsIGV4cGVjdHMgc3RyaW5nLXZhbHVlLCBmb3VuZCAnICsgZChpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaS5wYXJhbXMsIGwpKS50cmFuc2FjdGlvbklkID0gaS50cmFuc2FjdGlvbklkLCAnJyA9PT0gZyA/IGcgPSBpLnBhcmFtcy5jdXJyZW5jeSB8fCB1bmRlZmluZWQgOiBpLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnY3VycmVuY3knKSAmJiBnICE9PSBpLnBhcmFtcy5jdXJyZW5jeSAmJiBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBDdXJyZW5jeSBzcGVjaWZpZXIgaWdub3JlZC4gT25seSBvbmUgY3VycmVuY3kgcGVybWl0dGVkLicpLCBpLnBhcmFtcy5jdXJyZW5jeSA9IGcsIGkucGFyYW1zLmhhc093blByb3BlcnR5KCdkY3RyJykgJiYgbi5pc1N0cihpLnBhcmFtcy5kY3RyKSAmJiBtLnB1c2goaS5wYXJhbXMuZGN0ciksIGkucGFyYW1zLmhhc093blByb3BlcnR5KCdiY2F0JykgJiYgbi5pc0FycmF5KGkucGFyYW1zLmJjYXQpICYmICh2ID0gdi5jb25jYXQoaS5wYXJhbXMuYmNhdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHAuaW1wLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMCAhPSBwLmltcC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLnNpdGUucHVibGlzaGVyLmlkID0gbC5wdWJJZC50cmltKCksIHcgPSBsLnB1YklkLnRyaW0oKSwgcC5leHQud3JhcHBlciA9IHt9LCBwLmV4dC53cmFwcGVyLnByb2ZpbGUgPSBwYXJzZUludChsLnByb2ZJZCkgfHwgdW5kZWZpbmVkLCBwLmV4dC53cmFwcGVyLnZlcnNpb24gPSBwYXJzZUludChsLnZlcklkKSB8fCB1bmRlZmluZWQsIHAuZXh0LndyYXBwZXIud2lpZCA9IGwud2lpZCB8fCB0LmF1Y3Rpb25JZCwgcC5leHQud3JhcHBlci53diA9ICdwcmViaWRfcHJlYmlkXzQuMjYuMCcsIHAuZXh0LndyYXBwZXIudHJhbnNhY3Rpb25JZCA9IGwudHJhbnNhY3Rpb25JZCwgcC5leHQud3JhcHBlci53cCA9ICdwYmpzJywgcC51c2VyLmdlbmRlciA9IGwuZ2VuZGVyID8gbC5nZW5kZXIudHJpbSgpIDogdW5kZWZpbmVkLCBwLnVzZXIuZ2VvID0ge30sIHAudXNlci5nZW8ubGF0ID0gQygnbGF0JywgbC5sYXQpLCBwLnVzZXIuZ2VvLmxvbiA9IEMoJ2xvbicsIGwubG9uKSwgcC51c2VyLnlvYiA9IEMoJ3lvYicsIGwueW9iKSwgcC5kZXZpY2UuZ2VvID0gcC51c2VyLmdlbywgcC5zaXRlLnBhZ2UgPSBsLmthZHBhZ2V1cmwudHJpbSgpIHx8IHAuc2l0ZS5wYWdlLnRyaW0oKSwgcC5zaXRlLmRvbWFpbiA9IChzID0gcC5zaXRlLnBhZ2UsICh1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKS5ocmVmID0gcywgdS5ob3N0bmFtZSksICdvYmplY3QnID09PSBkKGEuY29uZmlnLmdldENvbmZpZygnY29udGVudCcpKSAmJiAocC5zaXRlLmNvbnRlbnQgPSBhLmNvbmZpZy5nZXRDb25maWcoJ2NvbnRlbnQnKSksICdvYmplY3QnID09PSBkKGEuY29uZmlnLmdldENvbmZpZygnZGV2aWNlJykpICYmIChwLmRldmljZSA9IGMocC5kZXZpY2UsIGEuY29uZmlnLmdldENvbmZpZygnZGV2aWNlJykpKSwgbi5kZWVwU2V0VmFsdWUocCwgJ3NvdXJjZS50aWQnLCBsLnRyYW5zYWN0aW9uSWQpLCAtMSAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigncHVibWF0aWNUZXN0PXRydWUnKSAmJiAocC50ZXN0ID0gMSksIGVbMF0uc2NoYWluICYmIG4uZGVlcFNldFZhbHVlKHAsICdzb3VyY2UuZXh0LnNjaGFpbicsIGVbMF0uc2NoYWluKSwgdCAmJiB0LmdkcHJDb25zZW50ICYmIChuLmRlZXBTZXRWYWx1ZShwLCAndXNlci5leHQuY29uc2VudCcsIHQuZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZyksIG4uZGVlcFNldFZhbHVlKHAsICdyZWdzLmV4dC5nZHByJywgdC5nZHByQ29uc2VudC5nZHByQXBwbGllcyA/IDEgOiAwKSksIHQgJiYgdC51c3BDb25zZW50ICYmIG4uZGVlcFNldFZhbHVlKHAsICdyZWdzLmV4dC51c19wcml2YWN5JywgdC51c3BDb25zZW50KSwgITAgPT09IGEuY29uZmlnLmdldENvbmZpZygnY29wcGEnKSAmJiBuLmRlZXBTZXRWYWx1ZShwLCAncmVncy5jb3BwYScsIDEpLCBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoclswXS5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ2RjdHInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPSByWzBdLnBhcmFtcy5kY3RyLCBuLmlzU3RyKG8pICYmIG8ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gby5zcGxpdCgnfCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnJywgYS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gKz0gZS5sZW5ndGggPiAwID8gZS50cmltKCkgKyAnfCcgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSA9IG8ubGVuZ3RoLCAnfCcgPT09IG8uc3Vic3RyaW5nKGksIGkgLSAxKSAmJiAobyA9IG8uc3Vic3RyaW5nKDAsIGkgLSAxKSksIGUuc2l0ZS5leHQgPSB7IGtleV92YWw6IG8udHJpbSgpIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9nV2FybignUHViTWF0aWM6IElnbm9yaW5nIHBhcmFtIDogZGN0ciB3aXRoIHZhbHVlIDogJyArIG8gKyAnLCBleHBlY3RzIHN0cmluZy12YWx1ZSwgZm91bmQgZW1wdHkgb3Igbm9uLXN0cmluZyB2YWx1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5sZW5ndGggPiAxICYmIG4ubG9nV2FybignUHViTWF0aWM6IGRjdHIgdmFsdWUgZm91bmQgaW4gbW9yZSB0aGFuIDEgYWR1bml0cy4gVmFsdWUgZnJvbSAxc3QgYWR1bml0IHdpbGwgYmUgcGlja2VkLiBJZ25vcmluZyB2YWx1ZXMgZnJvbSBzdWJzZXF1ZW50IGFkdW5pdHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubG9nV2FybignUHViTWF0aWM6IGRjdHIgdmFsdWUgbm90IGZvdW5kIGluIDFzdCBhZHVuaXQsIGlnbm9yaW5nIHZhbHVlcyBmcm9tIHN1YnNlcXVlbnQgYWR1bml0cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShwLCBtLCBlKSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4uZGVlcEFjY2Vzcyh0LCAnMC51c2VySWRBc0VpZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzQXJyYXkocikgJiYgci5sZW5ndGggPiAwICYmIG4uZGVlcFNldFZhbHVlKGUsICd1c2VyLmVpZHMnLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocCwgZSksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgfHwgKG4ubG9nV2FybignUHViTWF0aWM6IGJjYXQ6IEVhY2ggY2F0ZWdvcnkgc2hvdWxkIGJlIGEgc3RyaW5nLCBpZ25vcmluZyBjYXRlZ29yeTogJyArIGUpLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoID4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBiY2F0OiBFYWNoIGNhdGVnb3J5IHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgYSBsZW5ndGggb2YgbW9yZSB0aGFuIDMgY2hhcmFjdGVycywgaWdub3JpbmcgY2F0ZWdvcnk6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkubGVuZ3RoID4gMCAmJiAobi5sb2dXYXJuKCdQdWJNYXRpYzogYmNhdDogU2VsZWN0ZWQ6ICcsIHQpLCBlLmJjYXQgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocCwgdiksICdvYmplY3QnID09PSBkKGEuY29uZmlnLmdldENvbmZpZygnYXBwJykpICYmIChwLmFwcCA9IGEuY29uZmlnLmdldENvbmZpZygnYXBwJyksIHAuYXBwLnB1Ymxpc2hlciA9IHAuc2l0ZS5wdWJsaXNoZXIsIHAuYXBwLmV4dCA9IHAuc2l0ZS5leHQgfHwgdW5kZWZpbmVkLCAnb2JqZWN0JyAhPT0gZChwLmFwcC5jb250ZW50KSAmJiAocC5hcHAuY29udGVudCA9IHAuc2l0ZS5jb250ZW50IHx8IHVuZGVmaW5lZCksIGRlbGV0ZSBwLnNpdGUpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9oYm9wZW5iaWQucHVibWF0aWMuY29tL3RyYW5zbGF0b3I/c291cmNlPXByZWJpZC1jbGllbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBpID0gJ1VTRCcsIGEgPSBKU09OLnBhcnNlKHQuZGF0YSksIHMgPSBhLnNpdGUgJiYgYS5zaXRlLnJlZiA/IGEuc2l0ZS5yZWYgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYm9keSAmJiBlLmJvZHkuc2VhdGJpZCAmJiBuLmlzQXJyYXkoZS5ib2R5LnNlYXRiaWQpICYmIChpID0gZS5ib2R5LmN1ciB8fCBpLCBlLmJvZHkuc2VhdGJpZC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5iaWQgJiYgbi5pc0FycmF5KGUuYmlkKSAmJiBlLmJpZC5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiB1LmltcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiAocGFyc2VGbG9hdCh1LnByaWNlKSB8fCAwKS50b0ZpeGVkKDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHUudywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdS5oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogdS5jcmlkIHx8IHUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsSWQ6IHUuZGVhbGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRSZXZlbnVlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXI6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZDogdS5hZG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbV9zZWF0OiBlLnNlYXQgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtX2RzcGlkOiB1LmV4dCAmJiB1LmV4dC5kc3BpZCA/IHUuZXh0LmRzcGlkIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJJbXBJZDogdS5pZCB8fCAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmltcCAmJiBhLmltcC5sZW5ndGggPiAwICYmIGEuaW1wLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1LmltcGlkID09PSBlLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnJywgaSA9IG5ldyBSZWdFeHAoL1ZBU1Rccyt2ZXJzaW9uLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5pbmRleE9mKCdzcGFuIGNsYXNzPSJQdWJBUElBZCInKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tZWRpYVR5cGUgPSBvLkJBTk5FUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaS50ZXN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tZWRpYVR5cGUgPSBvLlZJREVPOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociA9IEpTT04ucGFyc2UoZS5yZXBsYWNlKC9cXC9nLCAnJykpKSAmJiByLm5hdGl2ZSAmJiAodC5tZWRpYVR5cGUgPSBvLk5BVElWRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ1dhcm4oJ1B1Yk1hdGljOiBFcnJvcjogQ2Fubm90IHBhcnNlIG5hdGl2ZSByZXBvbnNlIGZvciBhZCByZXNwb25zZTogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh1LmFkbSwgYyksIGMubWVkaWFUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvLkJBTk5FUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvLlZJREVPOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLndpZHRoID0gdS5oYXNPd25Qcm9wZXJ0eSgndycpID8gdS53IDogZS52aWRlby53LCBjLmhlaWdodCA9IHUuaGFzT3duUHJvcGVydHkoJ2gnKSA/IHUuaCA6IGUudmlkZW8uaCwgYy52YXN0WG1sID0gdS5hZG0sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmJpZGRlclJlcXVlc3QgJiYgdC5iaWRkZXJSZXF1ZXN0LmJpZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gMDsgYSA8IHQuYmlkZGVyUmVxdWVzdC5iaWRzLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYmlkZGVyUmVxdWVzdC5iaWRzW2FdLmJpZElkID09PSBlLnJlcXVlc3RJZCAmJiAociA9IHQuYmlkZGVyUmVxdWVzdC5iaWRzW2FdLnBhcmFtcywgbiA9IHQuYmlkZGVyUmVxdWVzdC5iaWRzW2FdLm1lZGlhVHlwZXNbby5WSURFT10uY29udGV4dCwgaSA9IHQuYmlkZGVyUmVxdWVzdC5iaWRzW2FdLmFkVW5pdENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICdvdXRzdHJlYW0nID09PSBuICYmIHIgJiYgci5vdXRzdHJlYW1BVSAmJiBpICYmIChlLnJlbmRlcmVyQ29kZSA9IHIub3V0c3RyZWFtQVUsIGUucmVuZGVyZXIgPSBJLm5ld1JlbmRlcmVyKGUucmVuZGVyZXJDb2RlLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5OQVRJVkU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubmF0aXZlID0ge30sIGUuaGFzT3duUHJvcGVydHkoJ2FkbScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gSlNPTi5wYXJzZShlLmFkbS5yZXBsYWNlKC9cXC9nLCAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbi5sb2dXYXJuKCdQdWJNYXRpYzogRXJyb3I6IENhbm5vdCBwYXJzZSBuYXRpdmUgcmVwb25zZSBmb3IgYWQgcmVzcG9uc2U6ICcgKyB0LmFkbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICYmIHIubmF0aXZlICYmIHIubmF0aXZlLmFzc2V0cyAmJiByLm5hdGl2ZS5hc3NldHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1lZGlhVHlwZSA9IG8uTkFUSVZFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgYSA9IHIubmF0aXZlLmFzc2V0cy5sZW5ndGg7IGkgPCBhOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoci5uYXRpdmUuYXNzZXRzW2ldLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuVElUTEUuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5uYXRpdmUudGl0bGUgPSByLm5hdGl2ZS5hc3NldHNbaV0udGl0bGUgJiYgci5uYXRpdmUuYXNzZXRzW2ldLnRpdGxlLnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuSU1BR0UuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5uYXRpdmUuaW1hZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogci5uYXRpdmUuYXNzZXRzW2ldLmltZyAmJiByLm5hdGl2ZS5hc3NldHNbaV0uaW1nLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByLm5hdGl2ZS5hc3NldHNbaV0uaW1nICYmIHIubmF0aXZlLmFzc2V0c1tpXS5pbWcuaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIubmF0aXZlLmFzc2V0c1tpXS5pbWcgJiYgci5uYXRpdmUuYXNzZXRzW2ldLmltZy53CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5JQ09OLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubmF0aXZlLmljb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogci5uYXRpdmUuYXNzZXRzW2ldLmltZyAmJiByLm5hdGl2ZS5hc3NldHNbaV0uaW1nLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByLm5hdGl2ZS5hc3NldHNbaV0uaW1nICYmIHIubmF0aXZlLmFzc2V0c1tpXS5pbWcuaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIubmF0aXZlLmFzc2V0c1tpXS5pbWcgJiYgci5uYXRpdmUuYXNzZXRzW2ldLmltZy53CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5TUE9OU09SRURCWS5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5CT0RZLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkxJS0VTLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkRPV05MT0FEUy5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5QUklDRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5TQUxFUFJJQ0UuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUEhPTkUuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuQUREUkVTUy5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5ERVNDMi5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5DVEEuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUkFUSU5HLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LkRJU1BMQVlVUkwuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5uYXRpdmVbVFtyLm5hdGl2ZS5hc3NldHNbaV0uaWRdXSA9IHIubmF0aXZlLmFzc2V0c1tpXS5kYXRhICYmIHIubmF0aXZlLmFzc2V0c1tpXS5kYXRhLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubmF0aXZlLmNsaWNrVXJsID0gci5uYXRpdmUubGluayAmJiByLm5hdGl2ZS5saW5rLnVybCwgdC5uYXRpdmUuY2xpY2tUcmFja2VycyA9IHIubmF0aXZlLmxpbmsgJiYgci5uYXRpdmUubGluay5jbGlja3RyYWNrZXJzIHx8IFtdLCB0Lm5hdGl2ZS5pbXByZXNzaW9uVHJhY2tlcnMgPSByLm5hdGl2ZS5pbXB0cmFja2VycyB8fCBbXSwgdC5uYXRpdmUuanN0cmFja2VyID0gci5uYXRpdmUuanN0cmFja2VyIHx8IFtdLCB0LndpZHRoIHx8ICh0LndpZHRoID0gMCksIHQuaGVpZ2h0IHx8ICh0LmhlaWdodCA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh1LCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1LmV4dCAmJiB1LmV4dC5kZWFsX2NoYW5uZWwgJiYgKGMuZGVhbENoYW5uZWwgPSBFW3UuZXh0LmRlYWxfY2hhbm5lbF0gfHwgbnVsbCksIGMubWV0YSA9IHt9LCB1LmV4dCAmJiB1LmV4dC5kc3BpZCAmJiAoYy5tZXRhLm5ldHdvcmtJZCA9IHUuZXh0LmRzcGlkKSwgdS5leHQgJiYgdS5leHQuYWR2aWQgJiYgKGMubWV0YS5idXllcklkID0gdS5leHQuYWR2aWQpLCB1LmFkb21haW4gJiYgdS5hZG9tYWluLmxlbmd0aCA+IDAgJiYgKGMubWV0YS5hZHZlcnRpc2VyRG9tYWlucyA9IHUuYWRvbWFpbiwgYy5tZXRhLmNsaWNrVXJsID0gdS5hZG9tYWluWzBdKSwgZS5leHQgJiYgZS5leHQuYnV5aWQgJiYgKGMuYWRzZXJ2ZXJUYXJnZXRpbmcgPSB7IGhiX2J1eWlkX3B1Ym1hdGljOiBlLmV4dC5idXlpZCB9KSwgci5wdXNoKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0VXNlclN5bmNzOiBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICcnICsgdzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgKGkgKz0gJyZnZHByPScgKyAoci5nZHByQXBwbGllcyA/IDEgOiAwKSwgaSArPSAnJmdkcHJfY29uc2VudD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHIuY29uc2VudFN0cmluZyB8fCAnJykpLCBuICYmIChpICs9ICcmdXNfcHJpdmFjeT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4pKSwgITAgPT09IGEuY29uZmlnLmdldENvbmZpZygnY29wcGEnKSAmJiAoaSArPSAnJmNvcHBhPTEnKSwgZS5pZnJhbWVFbmFibGVkID8gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaWZyYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2Fkcy5wdWJtYXRpYy5jb20vQWRTZXJ2ZXIvanMvc2hvd2FkLmpzI1BJWCZrZG50dWlkPTEmcD0nICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0gOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9pbWFnZTgucHVibWF0aWMuY29tL0FkU2VydmVyL0ltZ1N5bmM/cD0nICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1CaWRQYXJhbXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNvbnZlcnRUeXBlcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJJZDogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3Q6ICdzdHJpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0LnNwZWMgPSBVLCAoMCwgaS5yZWdpc3RlckJpZGRlcikoVSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICByKDMwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuaGFzVmlkZW9NZWRpYVR5cGUgPSBJLCB0Lm1hc1NpemVPcmRlcmluZyA9IEEsIHQuZGV0ZXJtaW5lUnViaWNvblZpZGVvU2l6ZUlkID0gVCwgdC5nZXRQcmljZUdyYW51bGFyaXR5ID0geCwgdC5oYXNWYWxpZFZpZGVvUGFyYW1zID0gQywgdC5oYXNWYWxpZFN1cHBseUNoYWluUGFyYW1zID0gUCwgdC5lbmNvZGVQYXJhbSA9IGosIHQucmVzZXRVc2VyU3luYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBSID0gITE7CiAgICAgICAgICAgICAgICB9LCB0LnJlc2V0UnViaUNvbmYgPSB0LnNwZWMgPSB2b2lkIDAsIHIoMTcpLCByKDI2KSwgcig2KSwgcigxMyksIHIoOSksIHIoNCksIHIoMiksIHIoMzMpLCByKDE2KSwgcig4MyksIHIoNDApLCByKDQzKSwgcigxMjMpLCByKDEpLCByKDMpLCByKDUpLCByKDExKSwgcigwKTsKICAgICAgICAgICAgICAgIHZhciBuLCBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCAnb2JqZWN0JyAhPT0gdihlKSAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuaGFzKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgbiA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4gPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIGkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICYmIChvLmdldCB8fCBvLnNldCkgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgaSwgbykgOiByW2ldID0gZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByLmRlZmF1bHQgPSBlLCB0ICYmIHQuc2V0KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KHIoNykpLCBvID0gcig0OSksIGEgPSByKDIyKSwgcyA9IHIoNDUpLCB1ID0gKG4gPSByKDM3KSkgJiYgbi5fX2VzTW9kdWxlID8gbiA6IHsgZGVmYXVsdDogbiB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBuLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsICE9IGFyZ3VtZW50c1t0XSA/IGFyZ3VtZW50c1t0XSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0ICUgMiA/IGQoT2JqZWN0KHIpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbShlLCB0LCByW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpKSA6IGQoT2JqZWN0KHIpKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwgbikgJiYgKGVbbl0gPSByW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSByLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYiA9IHt9OwogICAgICAgICAgICAgICAgYS5jb25maWcuZ2V0Q29uZmlnKCdydWJpY29uJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpLm1lcmdlRGVlcChiLCBlLnJ1Ymljb24pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgeSA9IHsKICAgICAgICAgICAgICAgICAgICAxOiAnNDY4eDYwJywKICAgICAgICAgICAgICAgICAgICAyOiAnNzI4eDkwJywKICAgICAgICAgICAgICAgICAgICA1OiAnMTIweDkwJywKICAgICAgICAgICAgICAgICAgICA3OiAnMTI1eDEyNScsCiAgICAgICAgICAgICAgICAgICAgODogJzEyMHg2MDAnLAogICAgICAgICAgICAgICAgICAgIDk6ICcxNjB4NjAwJywKICAgICAgICAgICAgICAgICAgICAxMDogJzMwMHg2MDAnLAogICAgICAgICAgICAgICAgICAgIDEzOiAnMjAweDIwMCcsCiAgICAgICAgICAgICAgICAgICAgMTQ6ICcyNTB4MjUwJywKICAgICAgICAgICAgICAgICAgICAxNTogJzMwMHgyNTAnLAogICAgICAgICAgICAgICAgICAgIDE2OiAnMzM2eDI4MCcsCiAgICAgICAgICAgICAgICAgICAgMTc6ICcyNDB4NDAwJywKICAgICAgICAgICAgICAgICAgICAxOTogJzMwMHgxMDAnLAogICAgICAgICAgICAgICAgICAgIDMxOiAnOTgweDEyMCcsCiAgICAgICAgICAgICAgICAgICAgMzI6ICcyNTB4MzYwJywKICAgICAgICAgICAgICAgICAgICAzMzogJzE4MHg1MDAnLAogICAgICAgICAgICAgICAgICAgIDM1OiAnOTgweDE1MCcsCiAgICAgICAgICAgICAgICAgICAgMzc6ICc0Njh4NDAwJywKICAgICAgICAgICAgICAgICAgICAzODogJzkzMHgxODAnLAogICAgICAgICAgICAgICAgICAgIDM5OiAnNzUweDEwMCcsCiAgICAgICAgICAgICAgICAgICAgNDA6ICc3NTB4MjAwJywKICAgICAgICAgICAgICAgICAgICA0MTogJzc1MHgzMDAnLAogICAgICAgICAgICAgICAgICAgIDQyOiAnMng0JywKICAgICAgICAgICAgICAgICAgICA0MzogJzMyMHg1MCcsCiAgICAgICAgICAgICAgICAgICAgNDQ6ICczMDB4NTAnLAogICAgICAgICAgICAgICAgICAgIDQ4OiAnMzAweDMwMCcsCiAgICAgICAgICAgICAgICAgICAgNTM6ICcxMDI0eDc2OCcsCiAgICAgICAgICAgICAgICAgICAgNTQ6ICczMDB4MTA1MCcsCiAgICAgICAgICAgICAgICAgICAgNTU6ICc5NzB4OTAnLAogICAgICAgICAgICAgICAgICAgIDU3OiAnOTcweDI1MCcsCiAgICAgICAgICAgICAgICAgICAgNTg6ICcxMDAweDkwJywKICAgICAgICAgICAgICAgICAgICA1OTogJzMyMHg4MCcsCiAgICAgICAgICAgICAgICAgICAgNjA6ICczMjB4MTUwJywKICAgICAgICAgICAgICAgICAgICA2MTogJzEwMDB4MTAwMCcsCiAgICAgICAgICAgICAgICAgICAgNjQ6ICc1ODB4NTAwJywKICAgICAgICAgICAgICAgICAgICA2NTogJzY0MHg0ODAnLAogICAgICAgICAgICAgICAgICAgIDY2OiAnOTMweDYwMCcsCiAgICAgICAgICAgICAgICAgICAgNjc6ICczMjB4NDgwJywKICAgICAgICAgICAgICAgICAgICA2ODogJzE4MDB4MTAwMCcsCiAgICAgICAgICAgICAgICAgICAgNzI6ICczMjB4MzIwJywKICAgICAgICAgICAgICAgICAgICA3MzogJzMyMHgxNjAnLAogICAgICAgICAgICAgICAgICAgIDc4OiAnOTgweDI0MCcsCiAgICAgICAgICAgICAgICAgICAgNzk6ICc5ODB4MzAwJywKICAgICAgICAgICAgICAgICAgICA4MDogJzk4MHg0MDAnLAogICAgICAgICAgICAgICAgICAgIDgzOiAnNDgweDMwMCcsCiAgICAgICAgICAgICAgICAgICAgODU6ICczMDB4MTIwJywKICAgICAgICAgICAgICAgICAgICA5MDogJzU0OHgxNTAnLAogICAgICAgICAgICAgICAgICAgIDk0OiAnOTcweDMxMCcsCiAgICAgICAgICAgICAgICAgICAgOTU6ICc5NzB4MTAwJywKICAgICAgICAgICAgICAgICAgICA5NjogJzk3MHgyMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMTogJzQ4MHgzMjAnLAogICAgICAgICAgICAgICAgICAgIDEwMjogJzc2OHgxMDI0JywKICAgICAgICAgICAgICAgICAgICAxMDM6ICc0ODB4MjgwJywKICAgICAgICAgICAgICAgICAgICAxMDU6ICcyNTB4ODAwJywKICAgICAgICAgICAgICAgICAgICAxMDg6ICczMjB4MjQwJywKICAgICAgICAgICAgICAgICAgICAxMTM6ICcxMDAweDMwMCcsCiAgICAgICAgICAgICAgICAgICAgMTE3OiAnMzIweDEwMCcsCiAgICAgICAgICAgICAgICAgICAgMTI1OiAnODAweDI1MCcsCiAgICAgICAgICAgICAgICAgICAgMTI2OiAnMjAweDYwMCcsCiAgICAgICAgICAgICAgICAgICAgMTQ0OiAnOTgweDYwMCcsCiAgICAgICAgICAgICAgICAgICAgMTQ1OiAnOTgweDE1MCcsCiAgICAgICAgICAgICAgICAgICAgMTUyOiAnMTAwMHgyNTAnLAogICAgICAgICAgICAgICAgICAgIDE1NjogJzY0MHgzMjAnLAogICAgICAgICAgICAgICAgICAgIDE1OTogJzMyMHgyNTAnLAogICAgICAgICAgICAgICAgICAgIDE3OTogJzI1MHg2MDAnLAogICAgICAgICAgICAgICAgICAgIDE5NTogJzYwMHgzMDAnLAogICAgICAgICAgICAgICAgICAgIDE5ODogJzY0MHgzNjAnLAogICAgICAgICAgICAgICAgICAgIDE5OTogJzY0MHgyMDAnLAogICAgICAgICAgICAgICAgICAgIDIxMzogJzEwMzB4NTkwJywKICAgICAgICAgICAgICAgICAgICAyMTQ6ICc5ODB4MzYwJywKICAgICAgICAgICAgICAgICAgICAyMjE6ICcxeDEnLAogICAgICAgICAgICAgICAgICAgIDIyOTogJzMyMHgxODAnLAogICAgICAgICAgICAgICAgICAgIDIzMDogJzIwMDB4MTQwMCcsCiAgICAgICAgICAgICAgICAgICAgMjMyOiAnNTgweDQwMCcsCiAgICAgICAgICAgICAgICAgICAgMjM0OiAnNng2JywKICAgICAgICAgICAgICAgICAgICAyNTE6ICcyeDInLAogICAgICAgICAgICAgICAgICAgIDI1NjogJzQ4MHg4MjAnLAogICAgICAgICAgICAgICAgICAgIDI1NzogJzQwMHg2MDAnLAogICAgICAgICAgICAgICAgICAgIDI1ODogJzUwMHgyMDAnLAogICAgICAgICAgICAgICAgICAgIDI1OTogJzk5OHgyMDAnLAogICAgICAgICAgICAgICAgICAgIDI2NDogJzk3MHgxMDAwJywKICAgICAgICAgICAgICAgICAgICAyNjU6ICcxOTIweDEwODAnLAogICAgICAgICAgICAgICAgICAgIDI3NDogJzE4MDB4MjAwJywKICAgICAgICAgICAgICAgICAgICAyNzg6ICczMjB4NTAwJywKICAgICAgICAgICAgICAgICAgICAyODI6ICczMjB4NDAwJywKICAgICAgICAgICAgICAgICAgICAyODg6ICc2NDB4MzgwJywKICAgICAgICAgICAgICAgICAgICA1NDg6ICc1MDB4MTAwMCcKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpLl9lYWNoKHksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlbZV0gPSB0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgaCA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiAncnViaWNvbicsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDUyLAogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZE1lZGlhVHlwZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgcy5CQU5ORVIsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuVklERU8KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGlzQmlkUmVxdWVzdFZhbGlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IHYoZS5wYXJhbXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50SWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZUlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3pvbmVJZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOyB0IDwgci5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucGFyYW1zW3JbdF1dID0gcGFyc2VJbnQoZS5wYXJhbXNbclt0XV0pLCBpc05hTihlLnBhcmFtc1tyW3RdXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5sb2dFcnJvcignUnViaWNvbjogd3JvbmcgZm9ybWF0IG9mIGFjY291bnRJZCBvciBzaXRlSWQgb3Igem9uZUlkLicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHcoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFuICYmICgndmlkZW8nICE9PSBuIHx8IEMoZSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYnVpbGRSZXF1ZXN0czogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aWRlbycgPT09IHcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUudHJhbnNhY3Rpb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IGEuY29uZmlnLmdldENvbmZpZygnZGVidWcnKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyOiBbJ1VTRCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB7IHRpZDogZS50cmFuc2FjdGlvbklkIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWF4OiB0LnRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXA6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cDogYS5jb25maWcuZ2V0Q29uZmlnKCdzMnNDb25maWcuZGVmYXVsdFR0bCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZS5hZFVuaXRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogbSh7fSwgZS5iaWRkZXIsIGUucGFyYW1zKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IGkuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy52aWRlbycpIHx8IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmViaWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGU6IHsgdmFzdHhtbDogeyByZXR1cm5DcmVhdGl2ZTogITAgPT09IGIucmV0dXJuVmFzdCB9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGluZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXdpbm5lcnM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWJpZGRlcmtleXM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2VncmFudWxhcml0eTogeChhLmNvbmZpZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyczogeyBydWJpY29uOiB7IGludGVncmF0aW9uOiBiLmludF90eXBlIHx8ICdwYmpzJyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdydWJpY29uJyAhPT0gZS5iaWRkZXIgJiYgKG8uZXh0LnByZWJpZC5hbGlhc2VzID0gbSh7fSwgZS5iaWRkZXIsICdydWJpY29uJykpLCAnZnVuY3Rpb24nICE9IHR5cGVvZiBlLmdldEZsb29yIHx8IGIuZGlzYWJsZUZsb29ycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gcGFyc2VGbG9hdChpLmRlZXBBY2Nlc3MoZSwgJ3BhcmFtcy5mbG9vcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBlLmdldEZsb29yKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAndmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IE8oZSwgJ3ZpZGVvJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ0Vycm9yKCdSdWJpY29uOiBnZXRGbG9vciB0aHJldyBhbiBlcnJvcjogJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICdvYmplY3QnICE9PSB2KHUpIHx8ICdVU0QnICE9PSB1LmN1cnJlbmN5IHx8IGlzTmFOKHBhcnNlSW50KHUuZmxvb3IpKSA/IHZvaWQgMCA6IHBhcnNlRmxvYXQodS5mbG9vcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc05hTihyKSB8fCAoby5pbXBbMF0uYmlkZmxvb3IgPSByKSwgby5pbXBbMF0uZXh0W2UuYmlkZGVyXS52aWRlby5zaXplX2lkID0gVChlKSwgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHYoYS5jb25maWcuZ2V0Q29uZmlnKCdhcHAnKSkgPyBlLmFwcCA9IGEuY29uZmlnLmdldENvbmZpZygnYXBwJykgOiBlLnNpdGUgPSB7IHBhZ2U6IFModCwgcikgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHYoYS5jb25maWcuZ2V0Q29uZmlnKCdkZXZpY2UnKSkgJiYgKGUuZGV2aWNlID0gYS5jb25maWcuZ2V0Q29uZmlnKCdkZXZpY2UnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGFyYW1zLnZpZGVvLmxhbmd1YWdlICYmIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXZpY2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtyXSAmJiAoZVtyXS5jb250ZW50ID0gZih7IGxhbmd1YWdlOiB0LnBhcmFtcy52aWRlby5sYW5ndWFnZSB9LCBlW3JdLmNvbnRlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShvLCBlLCB0KSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHYoZS5pbXBbMF0udmlkZW8pICYmIHZvaWQgMCA9PT0gZS5pbXBbMF0udmlkZW8uc2tpcCAmJiAoZS5pbXBbMF0udmlkZW8uc2tpcCA9IHQucGFyYW1zLnZpZGVvLnNraXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PT0gdihlLmltcFswXS52aWRlbykgJiYgdm9pZCAwID09PSBlLmltcFswXS52aWRlby5za2lwYWZ0ZXIgJiYgKGUuaW1wWzBdLnZpZGVvLnNraXBhZnRlciA9IHQucGFyYW1zLnZpZGVvLnNraXBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB2KGUuaW1wWzBdLnZpZGVvKSAmJiB2b2lkIDAgPT09IGUuaW1wWzBdLnZpZGVvLnBvcyAmJiAoJ2F0ZicgPT09IHQucGFyYW1zLnBvc2l0aW9uID8gZS5pbXBbMF0udmlkZW8ucG9zID0gMSA6ICdidGYnID09PSB0LnBhcmFtcy5wb3NpdGlvbiAmJiAoZS5pbXBbMF0udmlkZW8ucG9zID0gMykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE8odCwgJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW1wWzBdLnZpZGVvLncgPSByWzBdLCBlLmltcFswXS52aWRlby5oID0gclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG8sIGUpLCB0LmdkcHJDb25zZW50KSAmJiAoJ2Jvb2xlYW4nID09IHR5cGVvZiB0LmdkcHJDb25zZW50LmdkcHJBcHBsaWVzICYmIChuID0gdC5nZHByQ29uc2VudC5nZHByQXBwbGllcyA/IDEgOiAwKSwgaS5kZWVwU2V0VmFsdWUobywgJ3JlZ3MuZXh0LmdkcHInLCBuKSwgaS5kZWVwU2V0VmFsdWUobywgJ3VzZXIuZXh0LmNvbnNlbnQnLCB0LmdkcHJDb25zZW50LmNvbnNlbnRTdHJpbmcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnVzcENvbnNlbnQgJiYgaS5kZWVwU2V0VmFsdWUobywgJ3JlZ3MuZXh0LnVzX3ByaXZhY3knLCB0LnVzcENvbnNlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gaS5kZWVwQWNjZXNzKHQsICdiaWRzLjAudXNlcklkQXNFaWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiBjLmxlbmd0aCAmJiBpLmRlZXBTZXRWYWx1ZShvLCAndXNlci5leHQuZWlkcycsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5jb25maWcuZ2V0Q29uZmlnKCd1c2VyLmlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgJiYgaS5kZWVwU2V0VmFsdWUobywgJ3VzZXIuaWQnLCBkKSwgITAgPT09IGEuY29uZmlnLmdldENvbmZpZygnY29wcGEnKSAmJiBpLmRlZXBTZXRWYWx1ZShvLCAncmVncy5jb3BwYScsIDEpLCBlLnNjaGFpbiAmJiBQKGUuc2NoYWluKSAmJiBpLmRlZXBTZXRWYWx1ZShvLCAnc291cmNlLmV4dC5zY2hhaW4nLCBlLnNjaGFpbiksIF8oZSwgcy5WSURFTywgbyksIGUuc3RvcmVkQXVjdGlvblJlc3BvbnNlICYmIGkuZGVlcFNldFZhbHVlKG8uaW1wWzBdLCAnZXh0LnByZWJpZC5zdG9yZWRhdWN0aW9ucmVzcG9uc2UuaWQnLCBlLnN0b3JlZEF1Y3Rpb25SZXNwb25zZS50b1N0cmluZygpKSwgaS5kZWVwU2V0VmFsdWUoby5pbXBbMF0sICdleHQucHJlYmlkLmF1Y3Rpb250aW1lc3RhbXAnLCB0LmF1Y3Rpb25TdGFydCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vJy5jb25jYXQoYi52aWRlb0hvc3QgfHwgJ3ByZWJpZC1zZXJ2ZXInLCAnLnJ1Ymljb25wcm9qZWN0LmNvbS9vcGVucnRiMi9hdWN0aW9uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3Q6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCAhPT0gYi5zaW5nbGVSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbi5jb25jYXQoZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Jhbm5lcicgPT09IHcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGguY3JlYXRlU2xvdFBhcmFtcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovLycuY29uY2F0KGIuYmFubmVySG9zdCB8fCAnZmFzdGxhbmUnLCAnLnJ1Ymljb25wcm9qZWN0LmNvbS9hL2FwaS9mYXN0bGFuZS5qc29uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGguZ2V0T3JkZXJlZFBhcmFtcyhyKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gclt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmlzU3RyKG4pICYmICcnICE9PSBuIHx8IGkuaXNOdW1iZXIobikgPyAnJy5jb25jYXQoZSkuY29uY2F0KGoodCwgbiksICcmJykgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnJykgKyAnc2xvdHM9MSZyYW5kPScuY29uY2F0KE1hdGgucmFuZG9tKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Jhbm5lcicgPT09IHcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVbdC5wYXJhbXMuc2l0ZUlkXSA9IGVbdC5wYXJhbXMuc2l0ZUlkXSB8fCBbXSkucHVzaCh0KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBuLmNvbmNhdChPYmplY3Qua2V5cyhvKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSBvW3JdLCBhID0gMTAsIG4ubWFwKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICUgYSA9PSAwID8gbi5zbGljZSh0LCB0ICsgYSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGguY29tYmluZVNsb3RVcmxQYXJhbXMoci5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLmNyZWF0ZVNsb3RQYXJhbXMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovLycuY29uY2F0KGIuYmFubmVySG9zdCB8fCAnZmFzdGxhbmUnLCAnLnJ1Ymljb25wcm9qZWN0LmNvbS9hL2FwaS9mYXN0bGFuZS5qc29uJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBoLmdldE9yZGVyZWRQYXJhbXMobikucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmlzU3RyKHIpICYmICcnICE9PSByIHx8IGkuaXNOdW1iZXIocikgPyAnJy5jb25jYXQoZSkuY29uY2F0KGoodCwgciksICcmJykgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJycpICsgJ3Nsb3RzPScuY29uY2F0KHIubGVuZ3RoLCAnJnJhbmQ9JykuY29uY2F0KE1hdGgucmFuZG9tKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkUmVxdWVzdDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRPcmRlcmVkUGFyYW1zOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC9edGdfdi8sIHIgPSAvXnRnX2kvLCBuID0gL15laWRffF50cGlkXy8sIGkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjY291bnRfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlX2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnem9uZV9pZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemVfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbHRfc2l6ZV9pZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwX3BvcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dkcHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZHByX2NvbnNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c19wcml2YWN5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnBfc2NoYWluJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQoT2JqZWN0LmtleXMoZSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udGVzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5jb25jYXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4X2xpdmVyYW1waWRsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHB1aWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BfZ2VvLmxhdGl0dWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncF9nZW8ubG9uZ2l0dWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3cnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS5jb25jYXQoT2JqZWN0LmtleXMoZSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudGVzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5jb25jYXQoT2JqZWN0LmtleXMoZSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIudGVzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5jb25jYXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0a19mbGludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hfc291cmNlLnRpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hfc291cmNlLnBjaGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bfc2NyZWVuX3JlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JwX2Zsb29yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnBfc2VjdXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGtfdXNlcl9rZXknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY29uY2F0KE9iamVjdC5rZXlzKGUpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBpLmluZGV4T2YoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbWJpbmVTbG90VXJsUGFyYW1zOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5yZWR1Y2UoZnVuY3Rpb24gKHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KGkpIHx8ICh0W2ldID0gbmV3IEFycmF5KGUubGVuZ3RoKSksIHRbaV0uc3BsaWNlKG4sIDEsIHJbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pLCByID0gbmV3IFJlZ0V4cCgnXihbXjtdKikoO1xcMSkrJCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W2VdLmpvaW4oJzsnKSwgaSA9IG4ubWF0Y2gocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdID0gaSA/IGlbMV0gOiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNsb3RQYXJhbXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wYXJhbXMsIG4gPSBPKGUsICdiYW5uZXInKSwgbyA9IHAoci5sYXRMb25nIHx8IFtdLCAyKSwgYyA9IG9bMF0sIGQgPSBvWzFdLCBsID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRfaWQ6IHIuYWNjb3VudElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfaWQ6IHIuc2l0ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVfaWQ6IHIuem9uZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfaWQ6IG5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0X3NpemVfaWRzOiBuLnNsaWNlKDEpLmpvaW4oJywnKSB8fCB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfZmxvb3I6IChyLmZsb29yID0gcGFyc2VGbG9hdChyLmZsb29yKSkgPj0gMC4wMSA/IHIuZmxvb3IgOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnBfc2VjdXJlOiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtfZmxpbnQ6ICcnLmNvbmNhdChiLmludF90eXBlIHx8ICdwYmpzX2xpdGUnLCAnX3Y0LjI2LjAnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneF9zb3VyY2UudGlkJzogZS50cmFuc2FjdGlvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4X3NvdXJjZS5wY2hhaW4nOiByLnBjaGFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjcmVlbl9yZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcmVlbi5oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ3gnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0a191c2VyX2tleTogci51c2VySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BfZ2VvLmxhdGl0dWRlJzogaXNOYU4ocGFyc2VGbG9hdChjKSkgPyB2b2lkIDAgOiBwYXJzZUZsb2F0KGMpLnRvRml4ZWQoNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BfZ2VvLmxvbmdpdHVkZSc6IGlzTmFOKHBhcnNlRmxvYXQoZCkpID8gdm9pZCAwIDogcGFyc2VGbG9hdChkKS50b0ZpeGVkKDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0Z19mbC5laWQnOiBlLmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmY6IFMoZSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBlLmdldEZsb29yICYmICFiLmRpc2FibGVGbG9vcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gZS5nZXRGbG9vcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAnYmFubmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dFcnJvcignUnViaWNvbjogZ2V0Rmxvb3IgdGhyZXcgYW4gZXJyb3I6ICcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5ycF9oYXJkX2Zsb29yID0gJ29iamVjdCcgIT09IHYoZikgfHwgJ1VTRCcgIT09IGYuY3VycmVuY3kgfHwgaXNOYU4ocGFyc2VJbnQoZi5mbG9vcikpID8gdm9pZCAwIDogZi5mbG9vcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsLnBfcG9zID0gJ2F0ZicgPT09IHIucG9zaXRpb24gfHwgJ2J0ZicgPT09IHIucG9zaXRpb24gPyByLnBvc2l0aW9uIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5jb25maWcuZ2V0Q29uZmlnKCd1c2VyLmlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnICYmIChsLnBwdWlkID0gZyksIGUudXNlcklkQXNFaWRzICYmIGUudXNlcklkQXNFaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdhZHNlcnZlci5vcmcnID09PSBlLnNvdXJjZSA/IChsLnRwaWRfdGRpZCA9IGUudWlkc1swXS5pZCwgbFsnZWlkX2Fkc2VydmVyLm9yZyddID0gZS51aWRzWzBdLmlkKSA6ICdsaXZlaW50ZW50LmNvbScgPT09IGUuc291cmNlID8gKGxbJ3RwaWRfbGl2ZWludGVudC5jb20nXSA9IGUudWlkc1swXS5pZCwgbFsnZWlkX2xpdmVpbnRlbnQuY29tJ10gPSBlLnVpZHNbMF0uaWQsIGUuZXh0ICYmIEFycmF5LmlzQXJyYXkoZS5leHQuc2VnbWVudHMpICYmIGUuZXh0LnNlZ21lbnRzLmxlbmd0aCAmJiAobFsndGdfdi5MSXNlZyddID0gZS5leHQuc2VnbWVudHMuam9pbignLCcpKSkgOiAnbGl2ZXJhbXAuY29tJyA9PT0gZS5zb3VyY2UgPyBsLnhfbGl2ZXJhbXBpZGwgPSBlLnVpZHNbMF0uaWQgOiAnc2hhcmVkaWQub3JnJyA9PT0gZS5zb3VyY2UgPyBsWydlaWRfc2hhcmVkaWQub3JnJ10gPSAnJy5jb25jYXQoZS51aWRzWzBdLmlkLCAnXicpLmNvbmNhdChlLnVpZHNbMF0uYXR5cGUsICdeJykuY29uY2F0KGUudWlkc1swXS5leHQgJiYgZS51aWRzWzBdLmV4dC50aGlyZCB8fCAnJykgOiAnaWQ1LXN5bmMuY29tJyA9PT0gZS5zb3VyY2UgPyBsWydlaWRfaWQ1LXN5bmMuY29tJ10gPSAnJy5jb25jYXQoZS51aWRzWzBdLmlkLCAnXicpLmNvbmNhdChlLnVpZHNbMF0uYXR5cGUsICdeJykuY29uY2F0KGUudWlkc1swXS5leHQgJiYgZS51aWRzWzBdLmV4dC5saW5rVHlwZSB8fCAnJykgOiBsWydlaWRfJy5jb25jYXQoZS5zb3VyY2UpXSA9ICcnLmNvbmNhdChlLnVpZHNbMF0uaWQsICdeJykuY29uY2F0KGUudWlkc1swXS5hdHlwZSB8fCAnJyksICFsLnBwdWlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAsIHUuZGVmYXVsdCkoZS51aWRzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXh0ICYmICdwcHVpZCcgPT09IGUuZXh0LnN0eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmlkICYmIChsLnBwdWlkID0gdC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nV2FybignUnViaWNvbjogZXJyb3IgcmVhZGluZyBlaWQ6JywgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmdkcHJDb25zZW50ICYmICgnYm9vbGVhbicgPT0gdHlwZW9mIHQuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMgJiYgKGwuZ2RwciA9IE51bWJlcih0LmdkcHJDb25zZW50LmdkcHJBcHBsaWVzKSksIGwuZ2Rwcl9jb25zZW50ID0gdC5nZHByQ29uc2VudC5jb25zZW50U3RyaW5nKSwgdC51c3BDb25zZW50ICYmIChsLnVzX3ByaXZhY3kgPSBlbmNvZGVVUklDb21wb25lbnQodC51c3BDb25zZW50KSksIF8oZSwgcy5CQU5ORVIsIGwpLCAhMCA9PT0gYS5jb25maWcuZ2V0Q29uZmlnKCdjb3BwYScpICYmIChsLmNvcHBhID0gMSksIGUuc2NoYWluICYmIFAoZS5zY2hhaW4pICYmIChsLnJwX3NjaGFpbiA9IGguc2VyaWFsaXplU3VwcGx5Q2hhaW4oZS5zY2hhaW4pKSwgbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVN1cHBseUNoYWluOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVAoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudmVyLCByID0gZS5jb21wbGV0ZSwgbiA9IGUubm9kZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQodCwgJywnKS5jb25jYXQociwgJyEnKS5jb25jYXQoaC5zZXJpYWxpemVTdXBwbHlDaGFpbk5vZGVzKG4pKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVN1cHBseUNoYWluTm9kZXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW4nCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlW3RdIHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignIScpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5iaWRSZXF1ZXN0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlID0gZS5ib2R5KSB8fCAnb2JqZWN0JyAhPT0gdihlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNlYXRiaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gaS5kZWVwQWNjZXNzKGUsICdleHQuZXJyb3JzLnJ1Ymljb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkobikgJiYgbi5sZW5ndGggPiAwICYmIGkubG9nV2FybignUnViaWNvbjogRXJyb3IgaW4gdmlkZW8gcmVzcG9uc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZWF0YmlkLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC5iaWQgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHIuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogZS5jdXIgfHwgJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiBuLmNyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IG4ucHJpY2UgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IHQuc2VhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0UmV2ZW51ZTogITEgIT09IGIubmV0UmV2ZW51ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBuLncgfHwgaS5kZWVwQWNjZXNzKHIsICdtZWRpYVR5cGVzLnZpZGVvLncnKSB8fCBpLmRlZXBBY2Nlc3MociwgJ3BhcmFtcy52aWRlby5wbGF5ZXJXaWR0aCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuLmggfHwgaS5kZWVwQWNjZXNzKHIsICdtZWRpYVR5cGVzLnZpZGVvLmgnKSB8fCBpLmRlZXBBY2Nlc3MociwgJ3BhcmFtcy52aWRlby5wbGF5ZXJIZWlnaHQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlkICYmIChhLnNlYXRCaWRJZCA9IG4uaWQpLCBuLmRlYWxpZCAmJiAoYS5kZWFsSWQgPSBuLmRlYWxpZCksIG4uYWRvbWFpbiAmJiBpLmRlZXBTZXRWYWx1ZShhLCAnbWV0YS5hZHZlcnRpc2VyRG9tYWlucycsIEFycmF5LmlzQXJyYXkobi5hZG9tYWluKSA/IG4uYWRvbWFpbiA6IFtuLmFkb21haW5dKSwgaS5kZWVwQWNjZXNzKG4sICdleHQuYmlkZGVyLnJwLmFkdmlkJykgJiYgaS5kZWVwU2V0VmFsdWUoYSwgJ21ldGEuYWR2ZXJ0aXNlcklkJywgbi5leHQuYmlkZGVyLnJwLmFkdmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBpLmRlZXBBY2Nlc3MoZSwgJ2V4dC5yZXNwb25zZXRpbWVtaWxsaXMucnViaWNvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociAmJiB1ICYmIChyLnNlcnZlclJlc3BvbnNlVGltZU1zID0gdSksIGkuZGVlcEFjY2VzcyhuLCAnZXh0LnByZWJpZC50eXBlJykgPT09IHMuVklERU8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubWVkaWFUeXBlID0gcy5WSURFTywgaS5kZWVwU2V0VmFsdWUoYSwgJ21ldGEubWVkaWFUeXBlJywgcy5WSURFTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGkuZGVlcEFjY2VzcyhuLCAnZXh0LnByZWJpZC50YXJnZXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgJ29iamVjdCcgPT09IHYoYykgJiYgKGEuYWRzZXJ2ZXJUYXJnZXRpbmcgPSBjKSwgbi5leHQucHJlYmlkLmNhY2hlICYmICdvYmplY3QnID09PSB2KG4uZXh0LnByZWJpZC5jYWNoZS52YXN0WG1sKSAmJiBuLmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC5jYWNoZUlkICYmIG4uZXh0LnByZWJpZC5jYWNoZS52YXN0WG1sLnVybCA/IChhLnZpZGVvQ2FjaGVLZXkgPSBuLmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC5jYWNoZUlkLCBhLnZhc3RVcmwgPSBuLmV4dC5wcmViaWQuY2FjaGUudmFzdFhtbC51cmwpIDogYyAmJiBjLmhiX3V1aWQgJiYgYy5oYl9jYWNoZV9ob3N0ICYmIGMuaGJfY2FjaGVfcGF0aCAmJiAoYS52aWRlb0NhY2hlS2V5ID0gYy5oYl91dWlkLCBhLnZhc3RVcmwgPSAnaHR0cHM6Ly8nLmNvbmNhdChjLmhiX2NhY2hlX2hvc3QpLmNvbmNhdChjLmhiX2NhY2hlX3BhdGgsICc/dXVpZD0nKS5jb25jYXQoYy5oYl91dWlkKSksIG4uYWRtICYmIChhLnZhc3RYbWwgPSBuLmFkbSksIG4ubnVybCAmJiAoYS52YXN0VXJsID0gbi5udXJsKSwgIWEudmFzdFVybCAmJiBuLm51cmwgJiYgKGEudmFzdFVybCA9IG4ubnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ1dhcm4oJ1J1Ymljb246IHZpZGVvIHJlc3BvbnNlIHJlY2VpdmVkIG5vbi12aWRlbyBtZWRpYSB0eXBlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlLmFkczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnICE9PSB2KHIpIHx8IEFycmF5LmlzQXJyYXkocikgfHwgJ3ZpZGVvJyAhPT0gdyhyKSB8fCAnb2JqZWN0JyAhPT0gdihhKSB8fCAoYSA9IGFbci5hZFVuaXRDb2RlXSksICFBcnJheS5pc0FycmF5KGEpIHx8IGEubGVuZ3RoIDwgMSA/IFtdIDogYS5yZWR1Y2UoZnVuY3Rpb24gKHQsIG4sIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2snICE9PSBuLnN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHUsIGMgPSBBcnJheS5pc0FycmF5KHIpID8gcltvXSA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiAnb2JqZWN0JyA9PT0gdihjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IGMuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogbi5jcmVhdGl2ZV9pZCB8fCAnJy5jb25jYXQobi5uZXR3b3JrIHx8ICcnLCAnLScpLmNvbmNhdChuLmFkdmVydGlzZXIgfHwgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IG4uY3BtIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxJZDogbi5kZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0UmV2ZW51ZTogITEgIT09IGIubmV0UmV2ZW51ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnViaWNvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlcklkOiBuLmFkdmVydGlzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrSWQ6IG4ubmV0d29yawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VySWQ6IG4uYWR2ZXJ0aXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtJZDogbi5uZXR3b3JrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBzLkJBTk5FUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5jcmVhdGl2ZV90eXBlICYmIChkLm1lZGlhVHlwZSA9IG4uY3JlYXRpdmVfdHlwZSksIG4uYWRvbWFpbiAmJiAoZC5tZXRhLmFkdmVydGlzZXJEb21haW5zID0gQXJyYXkuaXNBcnJheShuLmFkb21haW4pID8gbi5hZG9tYWluIDogW24uYWRvbWFpbl0pLCBuLmNyZWF0aXZlX3R5cGUgPT09IHMuVklERU8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC53aWR0aCA9IGMucGFyYW1zLnZpZGVvLnBsYXllcldpZHRoLCBkLmhlaWdodCA9IGMucGFyYW1zLnZpZGVvLnBsYXllckhlaWdodCwgZC52YXN0VXJsID0gbi5jcmVhdGl2ZV9kZXBvdF91cmwsIGQuaW1wcmVzc2lvbl9pZCA9IG4uaW1wcmVzc2lvbl9pZCwgZC52aWRlb0NhY2hlS2V5ID0gbi5pbXByZXNzaW9uX2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuYWQgPSAoYSA9IG4uc2NyaXB0LCB1ID0gbi5pbXByZXNzaW9uX2lkLCAnPGh0bWw+XG48aGVhZD48c2NyaXB0IHR5cGU9XCd0ZXh0L2phdmFzY3JpcHRcJz5pbkRhcElGPXRydWU7PC9zY3JpcHQ+PC9oZWFkPlxuPGJvZHkgc3R5bGU9XCdtYXJnaW4gOiAwOyBwYWRkaW5nOiAwO1wnPlxuPCEtLSBSdWJpY29uIFByb2plY3QgQWQgVGFnIC0tPlxuPGRpdiBkYXRhLXJwLWltcHJlc3Npb24taWQ9XCcnLmNvbmNhdCh1LCAnXCc+XG48c2NyaXB0IHR5cGU9XCd0ZXh0L2phdmFzY3JpcHRcJz4nKS5jb25jYXQoYSwgJzwvc2NyaXB0PlxuPC9kaXY+XG48L2JvZHk+XG48L2h0bWw+JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHAoeVtuLnNpemVfaWRdLnNwbGl0KCd4JykubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQud2lkdGggPSBsWzBdLCBkLmhlaWdodCA9IGxbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucnViaWNvblRhcmdldGluZyA9IChBcnJheS5pc0FycmF5KG4udGFyZ2V0aW5nKSA/IG4udGFyZ2V0aW5nIDogW10pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0LmtleV0gPSB0LnZhbHVlc1swXSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7IHJwZmxfZWxlbWlkOiBjLmFkVW5pdENvZGUgfSksIHQucHVzaChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dFcnJvcignUnViaWNvbjogYmlkUmVxdWVzdCB1bmRlZmluZWQgYXQgaW5kZXggcG9zaXRpb246Jy5jb25jYXQobyksIHIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKS5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHQuY3BtIHx8IDApIC0gKGUuY3BtIHx8IDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSICYmIGUuaWZyYW1lRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmICdzdHJpbmcnID09IHR5cGVvZiByLmNvbnNlbnRTdHJpbmcgJiYgKCdib29sZWFuJyA9PSB0eXBlb2Ygci5nZHByQXBwbGllcyA/IGkgKz0gJz9nZHByPScuY29uY2F0KE51bWJlcihyLmdkcHJBcHBsaWVzKSwgJyZnZHByX2NvbnNlbnQ9JykuY29uY2F0KHIuY29uc2VudFN0cmluZykgOiBpICs9ICc/Z2Rwcl9jb25zZW50PScuY29uY2F0KHIuY29uc2VudFN0cmluZykpLCBuICYmIChpICs9ICcnLmNvbmNhdChpID8gJyYnIDogJz8nLCAndXNfcHJpdmFjeT0nKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG4pKSksIFIgPSAhMCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vJy5jb25jYXQoYi5zeW5jSG9zdCB8fCAnZXVzJywgJy5ydWJpY29ucHJvamVjdC5jb20vdXN5bmMuaHRtbCcpICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQmlkUGFyYW1zOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jb252ZXJ0VHlwZXMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiAnbnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVJZDogJ251bWJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lSWQ6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEuY29uZmlnLmdldENvbmZpZygncGFnZVVybCcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmFtcy5yZWZlcnJlciA/IHIgPSBlLnBhcmFtcy5yZWZlcnJlciA6IHIgfHwgKHIgPSB0LnJlZmVyZXJJbmZvLnJlZmVyZXIpLCBlLnBhcmFtcy5zZWN1cmUgPyByLnJlcGxhY2UoL15odHRwOi9pLCAnaHR0cHM6JykgOiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnBhcmFtczsKICAgICAgICAgICAgICAgICAgICBpZiAoJ3ZpZGVvJyA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci52aWRlbyAmJiByLnZpZGVvLnBsYXllcldpZHRoICYmIHIudmlkZW8ucGxheWVySGVpZ2h0ID8gbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudmlkZW8ucGxheWVyV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnZpZGVvLnBsYXllckhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICBdIDogQXJyYXkuaXNBcnJheShpLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpKSAmJiAxID09PSBlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZS5sZW5ndGggPyBuID0gZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF0gOiBBcnJheS5pc0FycmF5KGUuc2l6ZXMpICYmIGUuc2l6ZXMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KGUuc2l6ZXNbMF0pICYmIGUuc2l6ZXNbMF0ubGVuZ3RoID4gMSAmJiAobiA9IGUuc2l6ZXNbMF0pLCBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHIuc2l6ZXMpID8gbyA9IHIuc2l6ZXMgOiB2b2lkIDAgIT09IGkuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMnKSA/IG8gPSBFKGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMpIDogQXJyYXkuaXNBcnJheShlLnNpemVzKSAmJiBlLnNpemVzLmxlbmd0aCA+IDAgPyBvID0gRShlLnNpemVzKSA6IGkubG9nV2FybignUnViaWNvbjogbm8gc2l6ZXMgYXJlIHNldHVwIG9yIGZvdW5kJyksIEEobyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcjogbCh7fSwgZS5wYXJhbXMudmlzaXRvciksCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGwoe30sIGUucGFyYW1zLmludmVudG9yeSkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGUucGFyYW1zLmtleXdvcmRzICYmIChuLmNvbnRleHQua2V5d29yZHMgPSBpLmlzQXJyYXkoZS5wYXJhbXMua2V5d29yZHMpID8gZS5wYXJhbXMua2V5d29yZHMuam9pbignLCcpIDogZS5wYXJhbXMua2V5d29yZHMpOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gaS5tZXJnZURlZXAoe30sIGEuY29uZmlnLmdldENvbmZpZygnZnBkJykgfHwge30sIGUuZnBkIHx8IHt9LCBuKSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5uZXI6ICd0Z192LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ3VzZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbm5lcjogJ3RnX2kuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnc2l0ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHNlcnZlcjogJ2RmcF9hZF91bml0X2NvZGUnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMgPSB7fSwgZCA9IHt9LCBmID0gW10sIHAgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9PSB2KGUpIHx8IEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gdihlKSAmJiB2b2lkIDAgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dXYXJuKCdSdWJpY29uOiBGaWx0ZXJlZCB2YWx1ZTogJywgZSwgJ2ZvciBrZXknLCB0LCAnOiBFeHBlY3RlZCB2YWx1ZSB0byBiZSBzdHJpbmcsIGludGVnZXIsIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MvaW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpIDogZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dXYXJuKCdSdWJpY29uOiBGaWx0ZXJlZCBGUEQga2V5OiAnLCB0LCAnOiBFeHBlY3RlZCB2YWx1ZSB0byBiZSBzdHJpbmcsIGludGVnZXIsIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MvaW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhvKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2VdICYmIHVbZV0gJiYgJ29iamVjdCcgPT09IHYob1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjW3VbZV0uY29kZV0gPSBPYmplY3Qua2V5cyhvW2VdKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gb1tlXVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkcycgPT09IG4gPyAoQXJyYXkuaXNBcnJheShvW2VdW25dKSB8fCB0ICE9PSBzLkJBTk5FUiB8fCAob1tlXVtuXSA9IFtvW2VdW25dXSksIHJbbl0gPSBvW2VdW25dLCB0ID09PSBzLkJBTk5FUiAmJiAoZiA9IGYuY29uY2F0KG9bZV1bbl0pKSkgOiAnZGF0YScgPT09IG4gPyBpLm1lcmdlRGVlcChyLCB7IGV4dDogeyBkYXRhOiBvW2VdW25dIH0gfSkgOiAnYWRTZXJ2ZXInID09PSBuIHx8ICdwYkFkU2xvdCcgPT09IG4gPyAnYWRTZXJ2ZXInID09PSBuID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkU2xvdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHAob1tlXVtuXVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIGkuZGVlcFNldFZhbHVlKGQsICdhZHNlcnZlci4nLmNvbmNhdCh0LnRvTG93ZXJDYXNlKCkpLCByLnJlcGxhY2UoL15cLysvLCAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGRbbi50b0xvd2VyQ2FzZSgpXSA9IG9bZV1bbl0ucmVwbGFjZSgvXlwvKy8sICcnKSA6IGkubWVyZ2VEZWVwKHIsIHsgZXh0OiB7IGRhdGE6IG0oe30sIG4sIG9bZV1bbl0pIH0gfSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pLCB0ID09PSBzLkJBTk5FUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ29iamVjdCcgPT09IHYoY1t1W2VdLmNvZGVdLmV4dCkgJiYgY1t1W2VdLmNvZGVdLmV4dC5kYXRhIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnYWRzZXJ2ZXInID09PSB0ID8gbi5hZHNlcnZlci5hZHNsb3QgOiBwKG5bdF0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIChyW3VbdF0gPyAnJy5jb25jYXQodVtlXVtzLkJBTk5FUl0pLmNvbmNhdCh1W3RdKSA6ICcnLmNvbmNhdCh1W2VdW3MuQkFOTkVSXSkuY29uY2F0KHQpXSA9IGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXMoZCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9PT0gcy5CQU5ORVIgPyB1W2VdID8gclsndGdfaS4nLmNvbmNhdCh1W2VdKV0gPSBkW2VdLmFkc2xvdCA6IHJbJ3RnX2kuJy5jb25jYXQoZS50b0xvd2VyQ2FzZSgpKV0gPSBkW2VdIDogaS5tZXJnZURlZXAoci5pbXBbMF0sIHsgZXh0OiB7IGNvbnRleHQ6IHsgZGF0YTogbSh7fSwgZSwgZFtlXSkgfSB9IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCA9PT0gcy5CQU5ORVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBwKGYsICdrZXl3b3JkcycpOwogICAgICAgICAgICAgICAgICAgICAgICBnICYmIChyLmt3ID0gZyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaS5tZXJnZURlZXAociwgYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucGFyc2VTaXplc0lucHV0KGUpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHBhcnNlSW50KHlbdF0sIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgZS5wdXNoKHIpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gdihpLmRlZXBBY2Nlc3MoZSwgJ3BhcmFtcy52aWRlbycpKSAmJiB2b2lkIDAgIT09IGkuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy4nLmNvbmNhdChzLlZJREVPKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSShlKSA/IC0xID09PSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdvdXRzdHJlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAnaW5zdHJlYW0nCiAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGkuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy4nLmNvbmNhdChzLlZJREVPLCAnLmNvbnRleHQnKSkpID8gdm9pZCAodCAmJiBpLmxvZ0Vycm9yKCdSdWJpY29uOiBtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQgbXVzdCBiZSBvdXRzdHJlYW0gb3IgaW5zdHJlYW0nKSkgOiBPKGUsICd2aWRlbycpLmxlbmd0aCA8IDIgPyB2b2lkICh0ICYmIGkubG9nRXJyb3IoJ1J1Ymljb246IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHBsYXllclNpemUgb2YgdGhlIHZpZGVvJykpIDogKHQgJiYgaS5sb2dNZXNzYWdlKCdSdWJpY29uOiBtYWtpbmcgdmlkZW8gcmVxdWVzdCBmb3IgYWRVbml0JywgZS5hZFVuaXRDb2RlKSwgJ3ZpZGVvJykgOiAwID09PSBPKGUsICdiYW5uZXInKS5sZW5ndGggPyB2b2lkICh0ICYmIGkubG9nRXJyb3IoJ1J1Ymljb246IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIHNpemVzIGZvciBiYW5uZXIgcmVxdWVzdCcpKSA6ICh0ICYmIGkubG9nTWVzc2FnZSgnUnViaWNvbjogbWFraW5nIGJhbm5lciByZXF1ZXN0IGZvciBhZFVuaXQnLCBlLmFkVW5pdENvZGUpLCAnYmFubmVyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnNwZWMgPSBoOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIDE1LAogICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICA5CiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zb3J0KGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5pbmRleE9mKGUpLCBpID0gdC5pbmRleE9mKHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA+IC0xIHx8IGkgPiAtMSA/IC0xID09PSBuID8gMSA6IC0xID09PSBpID8gLTEgOiBuIC0gaSA6IGUgLSByOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwYXJzZUludChpLmRlZXBBY2Nlc3MoZSwgJ3BhcmFtcy52aWRlby5zaXplX2lkJykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTih0KSA/ICdvdXRzdHJlYW0nID09PSBpLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMuJy5jb25jYXQocy5WSURFTywgJy5jb250ZXh0JykpID8gMjAzIDogMjAxIDogdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93OiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpdW06IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC4xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG86IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuc2U6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbjogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b206IGUuZ2V0Q29uZmlnKCdjdXN0b21QcmljZUJ1Y2tldCcpICYmIGUuZ2V0Q29uZmlnKCdjdXN0b21QcmljZUJ1Y2tldCcpLmJ1Y2tldHMKICAgICAgICAgICAgICAgICAgICAgICAgfVtlLmdldENvbmZpZygncHJpY2VHcmFudWxhcml0eScpXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICEwLCByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFtdKSwgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgwKSwgbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZHVyYXRpb246IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXJpdHk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaS5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvLicgKyByKSkgIT09IG9bcl0gJiYgKHQgPSAhMSwgaS5sb2dFcnJvcignUnViaWNvbjogbWVkaWFUeXBlcy52aWRlby4nICsgciArICcgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgb2YgdHlwZTogJyArIG9bcl0pKTsKICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITEsIHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hwJwogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5vZGVzID8gKCh0ID0gZS5ub2Rlcy5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyByLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlOwogICAgICAgICAgICAgICAgICAgIH0sICEwKSkgfHwgaS5sb2dFcnJvcignUnViaWNvbjogcmVxdWlyZWQgc2NoYWluIHBhcmFtcyBtaXNzaW5nJyksIHQpIDogdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAncnBfc2NoYWluJyA9PT0gZSA/ICdycF9zY2hhaW49Jy5jb25jYXQodCkgOiAnJy5jb25jYXQoZSwgJz0nKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQucmVzZXRSdWJpQ29uZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiA9IHt9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBSID0gITE7CiAgICAgICAgICAgICAgICAoMCwgby5yZWdpc3RlckJpZGRlcikoaCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5fZ2V0UGxhdGZvcm0gPSBTLCB0Ll9pc0luYm91bmRzID0gdC5zcGVjID0gdm9pZCAwLCByKDYpLCByKDEzKSwgcig5KSwgcigxMSksIHIoNCksIHIoMiksIHIoMjYpLCByKDM4NiksIHIoNDApLCByKDE2KSwgcigxKSwgcigzKSwgcigwKSwgcig1KTsKICAgICAgICAgICAgICAgIHZhciBuID0gcig0OSksIGkgPSByKDcpLCBvID0gcig0NSksIGEgPSByKDIyKSwgcyA9IHIoNzYpLCB1ID0gcigxMjYpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoYSA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGEudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IG51bGwgPT0gcy5yZXR1cm4gfHwgcy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSByIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIG4pICYmIChlW25dID0gcltuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IHIsIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcCA9ICgwLCBpLmdlbmVyYXRlVVVJRCkoKSwgZyA9ICdodHRwczovL210cnguZ28uc29ub2JpLmNvbS9zYmlfb3V0c3RyZWFtX3JlbmRlcmVyLmpzJywgbSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ3Nvbm9iaScsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZE1lZGlhVHlwZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uQkFOTkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5WSURFTwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5wYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUucGFyYW1zLmFkX3VuaXQgJiYgIWUucGFyYW1zLnBsYWNlbWVudF9pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKDAsIGkuZGVlcEFjY2VzcykoZSwgJ21lZGlhVHlwZXMuYmFubmVyJykgJiYgISgwLCBpLmRlZXBBY2Nlc3MpKGUsICdtZWRpYVR5cGVzLnZpZGVvJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDAsIGkuZGVlcEFjY2VzcykoZSwgJ21lZGlhVHlwZXMuYmFubmVyJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgwLCBpLmRlZXBBY2Nlc3MpKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpICYmICFlLnBhcmFtcy5zaXplcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy52aWRlbycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvdXRzdHJlYW0nID09PSAoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy52aWRlby5jb250ZXh0JykgJiYgIWUucGFyYW1zLnNpemVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdpbnN0cmVhbScgPT09ICgwLCBpLmRlZXBBY2Nlc3MpKGUsICdtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQnKSAmJiAhKDAsIGkuZGVlcEFjY2VzcykoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnBhcmFtcy5hZF91bml0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zLmFkX3VuaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJhbXMucGxhY2VtZW50X2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gL15bXC9dP1tcZF0rW1tcL10uK1tcL10/XT8kLy50ZXN0KHQpID8gKHQgPSAnLycgPT09IHQuY2hhckF0KDApID8gdCA6ICcvJyArIHQsIGYoe30sICcnLmNvbmNhdCh0LCAnfCcpLmNvbmNhdChlLmJpZElkKSwgJycuY29uY2F0KHYoZSkpLmNvbmNhdChiKGUpKSkpIDogL15bMC05YS1mQS1GXXsyMH0kLy50ZXN0KHQpICYmIDIwID09PSB0Lmxlbmd0aCA/IGYoe30sIGUuYmlkSWQsICcnLmNvbmNhdCh0LCAnfCcpLmNvbmNhdCh2KGUpKS5jb25jYXQoYihlKSkpIDogdm9pZCAoMCwgaS5sb2dFcnJvcikoJ1RoZSBhZCB1bml0IGNvZGUgb3IgU29ub2JpIFBsYWNlbWVudCBpZCBmb3Igc2xvdCAnLmNvbmNhdChlLmJpZElkLCAnIGlzIGludmFsaWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9tYWtlcjogSlNPTi5zdHJpbmdpZnkobiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB0LnJlZmVyZXJJbmZvLnJlZmVyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczogKDAsIGkuZ2VuZXJhdGVVVUlEKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB2OiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOiBTKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliX25hbWU6ICdwcmViaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYl92OiAnNC4yNi4wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1czogMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuY29uZmlnLmdldENvbmZpZygndXNlclN5bmMnKSAmJiBhLmNvbmZpZy5nZXRDb25maWcoJ3VzZXJTeW5jJykuc3luY3NQZXJCaWRkZXIgJiYgKG8udXMgPSBhLmNvbmZpZy5nZXRDb25maWcoJ3VzZXJTeW5jJykuc3luY3NQZXJCaWRkZXIpLCB1LnVzZXJTeW5jLmNhbkJpZGRlclJlZ2lzdGVyU3luYygnaWZyYW1lJywgJ3Nvbm9iaScpID8gby5pdXMgPSAxIDogby5pdXMgPSAwLCAoMCwgaS5kZWVwQWNjZXNzKShlWzBdLCAncGFyYW1zLmhmYScpICYmIChvLmhmYSA9ICgwLCBpLmRlZXBBY2Nlc3MpKGVbMF0sICdwYXJhbXMuaGZhJykpLCBlWzBdLnBhcmFtcy5yZWZlcnJlciAmJiAoby5yZWYgPSBlWzBdLnBhcmFtcy5yZWZlcnJlciksIHQgJiYgdC5nZHByQ29uc2VudCAmJiAoby5nZHByID0gdC5nZHByQ29uc2VudC5nZHByQXBwbGllcyA/ICd0cnVlJyA6ICdmYWxzZScsIHQuZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZyAmJiAoby5jb25zZW50X3N0cmluZyA9IHQuZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZykpLCBlWzBdLnNjaGFpbiAmJiAoby5zY2hhaW4gPSBKU09OLnN0cmluZ2lmeShlWzBdLnNjaGFpbikpLCAoMCwgaS5kZWVwQWNjZXNzKShlWzBdLCAndXNlcklkJykgJiYgT2JqZWN0LmtleXMoZVswXS51c2VySWQpLmxlbmd0aCA+IDAgJiYgKG8udXNlcmlkID0gSlNPTi5zdHJpbmdpZnkoZVswXS51c2VySWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZVswXS5wYXJhbXMua2V5d29yZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiAoby5rdyA9IHMpLCB0ICYmIHQudXNwQ29uc2VudCAmJiAoby51c19wcml2YWN5ID0gdC51c3BDb25zZW50KSwgKDAsIGkuaXNFbXB0eSkobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gJ2h0dHBzOi8vYXBleC5nby5zb25vYmkuY29tL3RyaW5pdHkuanNvbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkuZGVlcEFjY2VzcykoZVswXSwgJ3BhcmFtcy5iaWRfcmVxdWVzdF91cmwnKSAmJiAoYyA9ICgwLCBpLmRlZXBBY2Nlc3MpKGVbMF0sICdwYXJhbXMuYmlkX3JlcXVlc3RfdXJsJykpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RzOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRSZXNwb25zZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5ib2R5LCBuID0gW10sIG8gPSB0LmRhdGEucmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IE9iamVjdC5rZXlzKHIuc2xvdHMpLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhyLnNsb3RzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByLnNsb3RzW2VdLCB1ID0gZS5zcGxpdCgnfCcpLnNsaWNlKC0xKVswXSwgZCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVtyXS5iaWRJZCA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5iaWRkZXJSZXF1ZXN0cywgdSksIGwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycgPT09IGEuc2JpX2N0ICYmIChsID0gJ3ZpZGVvJywgJ291dHN0cmVhbScgPT09ICgwLCBpLmRlZXBBY2Nlc3MpKGQsICdtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQnKSAmJiAobCA9ICdvdXRzdHJlYW0nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB5KGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnNiaV9haWQgJiYgYS5zYmlfbW91c2UgJiYgYS5zYmlfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGMoYS5zYmlfc2l6ZS5zcGxpdCgneCcpLCAyKSwgbSA9IHBbMF0sIHYgPSB2b2lkIDAgPT09IG0gPyAxIDogbSwgYiA9IHBbMV0sIGggPSB2b2lkIDAgPT09IGIgPyAxIDogYiwgUyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiBOdW1iZXIoYS5zYmlfbW91c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIodiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBOdW1iZXIoaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQ6IGYoci5zYmlfZGMsIGEuc2JpX2FpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiA1MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogYS5zYmlfY3JpZCB8fCBhLnNiaV9haWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkOiBhLnNiaV9haWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0UmV2ZW51ZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6ICdVU0QnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5zYmlfZG96ZXIgJiYgKFMuZGVhbElkID0gYS5zYmlfZG96ZXIpLCAndmlkZW8nID09PSBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLm1lZGlhVHlwZSA9ICd2aWRlbycsIFMudmFzdFVybCA9IGYoci5zYmlfZGMsIGEuc2JpX2FpZCksIGRlbGV0ZSBTLmFkLCBkZWxldGUgUy53aWR0aCwgZGVsZXRlIFMuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCdvdXRzdHJlYW0nID09PSBsICYmIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMubWVkaWFUeXBlID0gJ3ZpZGVvJywgUy52YXN0VXJsID0gZihyLnNiaV9kYywgYS5zYmlfYWlkKSwgUy5yZW5kZXJlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IHt9LCBuID0gcy5SZW5kZXJlci5pbnN0YWxsKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LmFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0UmVuZGVyKE8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIGkubG9nV2FybikoJ1ByZWJpZCBFcnJvciBjYWxsaW5nIHNldFJlbmRlciBvbiByZW5kZXJlcicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zZXRFdmVudEhhbmRsZXJzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBpLmxvZ01lc3NhZ2UpKCdTb25vYmkgb3V0c3RyZWFtIHZpZGVvIGltcHJlc3Npb24gZXZlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGkubG9nTWVzc2FnZSkoJ1Nvbm9iaSBvdXRzdHJlYW0gdmlkZW8gbG9hZGVkIGV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGVkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgaS5sb2dNZXNzYWdlKSgnU29ub2JpIG91dHN0cmVhbSByZW5kZXJlciB2aWRlbyBldmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGQuYWRVbml0Q29kZSwgUywgKDAsIGkuZGVlcEFjY2VzcykoZCwgJ3JlbmRlcmVyLm9wdGlvbnMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgXyA9ICgwLCBpLmRlZXBBY2Nlc3MpKGQsICdwYXJhbXMuc2l6ZXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoXykgJiYgQXJyYXkuaXNBcnJheShfWzBdKSAmJiAoXyA9IF9bMF0pLCBfICYmIChTLndpZHRoID0gX1swXSwgUy5oZWlnaHQgPSBfWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGl4ZWxFbmFibGVkICYmIHRbMF0uYm9keS5zYmlfcHguZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBlLnVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy52aWRlbycpID8gJycgOiBlLnBhcmFtcy5zaXplcyA/ICgwLCBpLnBhcnNlU2l6ZXNJbnB1dCkoZS5wYXJhbXMuc2l6ZXMpLmpvaW4oJywnKSA6ICgwLCBpLmRlZXBBY2Nlc3MpKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpID8gKDAsIGkucGFyc2VTaXplc0lucHV0KSgoMCwgaS5kZWVwQWNjZXNzKShlLCAnbWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMnKSkuam9pbignLCcpIDogZS5zaXplcyA/ICgwLCBpLnBhcnNlU2l6ZXNJbnB1dCkoZS5zaXplcykuam9pbignLCcpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zLmZsb29yID8gJ3xmPScuY29uY2F0KGUucGFyYW1zLmZsb29yKSA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5zcGVjID0gbTsKICAgICAgICAgICAgICAgIHZhciB5ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2aWRlbycgPT09IGUgfHwgJ291dHN0cmVhbScgPT09IGUgPyBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdodHRwczovLycuY29uY2F0KGUsICdhcGV4LmdvLnNvbm9iaS5jb20vdmFzdC54bWw/dmlkPScpLmNvbmNhdCh0LCAnJnJlZj0nKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShyLCBuLCB0KSA6ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInICsgJ2h0dHBzOi8vJy5jb25jYXQociwgJ2FwZXguZ28uc29ub2JpLmNvbS9zYmkuanM/YWlkPScpLmNvbmNhdChuLCAnJmFzPW51bGwmcmVmPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodCkpICsgJyI+PC9zY3JpcHQ+JzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IDAsIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pbm5lcldpZHRoID49IHQgJiYgZS5pbm5lcldpZHRoIDwgcjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHdpbmRvdywgdCA9IGgoZSksIHIgPSB7IGx0OiA3NjggfSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0OiA5OTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZTogNzY4CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoMCwgci5sdCkgPyAnbW9iaWxlJyA6IHQobi5nZSwgbi5sdCkgPyAndGFibGV0JyA6ICdkZXNrdG9wJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSkgewogICAgICAgICAgICAgICAgICAgIGUucmVuZGVyZXIucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYyhlLmdldFNpemUoKS5zcGxpdCgneCcpLCAyKSwgciA9IHRbMF0sIG4gPSB0WzFdLCBpID0gbmV3IHdpbmRvdy5TYmlPdXRzdHJlYW1SZW5kZXJlcigpOwogICAgICAgICAgICAgICAgICAgICAgICBpLmluaXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFzdFVybDogZS52YXN0VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuc2V0Um9vdEVsZW1lbnQoZS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuX2lzSW5ib3VuZHMgPSBoLCAoMCwgbi5yZWdpc3RlckJpZGRlcikobSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpOwogICAgICAgICAgICAgICAgbihuLlMsICdOdW1iZXInLCB7IE1BWF9TQUZFX0lOVEVHRVI6IDkwMDcxOTkyNTQ3NDA5OTEgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICByKDMwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuc3BlYyA9IHZvaWQgMCwgcig5KSwgcigxMSksIHIoNiksIHIoMTMpLCByKDE3KSwgcig0KSwgcigyKSwgcigxKSwgcigzKSwgcigwKSwgcig1KSwgcig0Myk7CiAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT09IHYoZSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LmhhcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBpKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAoby5nZXQgfHwgby5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIGksIG8pIDogcltpXSA9IGVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShyKDcpKSwgaSA9IHIoNDUpLCBvID0gcigyMiksIGEgPSBjKHIoMzcpKSwgcyA9IGMocigzODgpKSwgdSA9IHIoNDkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gciAmJiBlLmNvbnN0cnVjdG9yICYmIChyID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSByIHx8ICdTZXQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbiA9IG5ldyBBcnJheSh0KTsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobiA9IG4uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCB0KS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG51bGwgIT0gYXJndW1lbnRzW3RdID8gYXJndW1lbnRzW3RdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJSAyID8gcChPYmplY3QociksICEwKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKGUsIHQsIHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocikpIDogcChPYmplY3QocikpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIGkuQkFOTkVSLAogICAgICAgICAgICAgICAgICAgICAgICBpLlZJREVPCiAgICAgICAgICAgICAgICAgICAgXSwgeSA9IHsgSlBZOiAxIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE8oZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYmFubmVyID0ge30sIHQuYmFubmVyLncgPSBlLnBhcmFtcy5zaXplWzBdLCB0LmJhbm5lci5oID0gZS5wYXJhbXMuc2l6ZVsxXSwgdC5iYW5uZXIudG9wZnJhbWUgPSBuLmluSWZyYW1lKCkgPyAwIDogMSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTyhlKSwgciA9IG4uZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy52aWRlbycpLCBpID0gbi5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQnKSwgbyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW1lcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWluZHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heGR1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm90b2NvbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFydGRlbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGFjZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmVhcml0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcG1pbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tpcGFmdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmF0dHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heGV4dGVuZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5iaXRyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhiaXRyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3hpbmdhbGxvd2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF5YmFja21ldGhvZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxheWJhY2tlbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGl2ZXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhbmlvbmFkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcGknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhbmlvbnR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dCcKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluICh0LnZpZGVvID0gbi5kZWVwQ2xvbmUoZS5wYXJhbXMudmlkZW8pLCB0LnZpZGVvLncgPSBlLnBhcmFtcy5zaXplWzBdLCB0LnZpZGVvLmggPSBlLnBhcmFtcy5zaXplWzFdLCBpICYmICgnaW5zdHJlYW0nID09PSBpID8gdC52aWRlby5wbGFjZW1lbnQgPSAxIDogJ291dHN0cmVhbScgPT09IGkgPyB0LnZpZGVvLnBsYWNlbWVudCA9IDQgOiBuLmxvZ1dhcm4oJ2l4IGJpZGRlciBwYXJhbXM6IHZpZGVvIGNvbnRleHQgXCcnLmNvbmNhdChpLCAnXCcgaXMgbm90IHN1cHBvcnRlZCcpKSksIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBvLmluZGV4T2YoYSkgfHwgdC52aWRlby5oYXNPd25Qcm9wZXJ0eShhKSB8fCAodC52aWRlb1thXSA9IHJbYV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaWQgPSBlLmJpZElkLCB0LmV4dCA9IHt9LCB0LmV4dC5zaXRlSUQgPSBlLnBhcmFtcy5zaXRlSWQsICFlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnaWQnKSB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgZS5wYXJhbXMuaWQgJiYgJ251bWJlcicgIT0gdHlwZW9mIGUucGFyYW1zLmlkID8gdC5leHQuc2lkID0gJycuY29uY2F0KGUucGFyYW1zLnNpemVbMF0sICd4JykuY29uY2F0KGUucGFyYW1zLnNpemVbMV0pIDogdC5leHQuc2lkID0gU3RyaW5nKGUucGFyYW1zLmlkKSwgZS5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ2JpZEZsb29yJykgJiYgZS5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ2JpZEZsb29yQ3VyJykgJiYgKHQuYmlkZmxvb3IgPSBlLnBhcmFtcy5iaWRGbG9vciwgdC5iaWRmbG9vcmN1ciA9IGUucGFyYW1zLmJpZEZsb29yQ3VyKSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8oZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkuaGFzT3duUHJvcGVydHkodCkgPyBvLmNwbSA9IGUucHJpY2UgLyB5W3RdIDogby5jcG0gPSBlLnByaWNlIC8gMTAwLCBvLnJlcXVlc3RJZCA9IGUuaW1waWQsIG8uZGVhbElkID0gbi5kZWVwQWNjZXNzKGUsICdleHQuZGVhbGlkJyksIG8ubmV0UmV2ZW51ZSA9IHRydWUsIG8uY3VycmVuY3kgPSB0LCBvLmNyZWF0aXZlSWQgPSBlLmhhc093blByb3BlcnR5KCdjcmlkJykgPyBlLmNyaWQgOiAnLScsIG4uZGVlcEFjY2VzcyhlLCAnZXh0LnZhc3R1cmwnKSA/IChvLnZhc3RVcmwgPSBlLmV4dC52YXN0dXJsLCBvLndpZHRoID0gci52aWRlby53LCBvLmhlaWdodCA9IHIudmlkZW8uaCwgby5tZWRpYVR5cGUgPSBpLlZJREVPLCBvLnR0bCA9IDM2MDApIDogKG8uYWQgPSBlLmFkbSwgby53aWR0aCA9IGUudywgby5oZWlnaHQgPSBlLmgsIG8ubWVkaWFUeXBlID0gaS5CQU5ORVIsIG8udHRsID0gMzAwKSwgby5tZXRhID0ge30sIG8ubWV0YS5uZXR3b3JrSWQgPSBuLmRlZXBBY2Nlc3MoZSwgJ2V4dC5kc3BpZCcpLCBvLm1ldGEuYnJhbmRJZCA9IG4uZGVlcEFjY2VzcyhlLCAnZXh0LmFkdmJyYW5kaWQnKSwgby5tZXRhLmJyYW5kTmFtZSA9IG4uZGVlcEFjY2VzcyhlLCAnZXh0LmFkdmJyYW5kJyksIGUuYWRvbWFpbiAmJiBlLmFkb21haW4ubGVuZ3RoID4gMCAmJiAoby5tZXRhLmFkdmVydGlzZXJEb21haW5zID0gZS5hZG9tYWluKSwgbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpICYmIDIgPT09IGUubGVuZ3RoICYmICgwLCBzLmRlZmF1bHQpKGVbMF0pICYmICgwLCBzLmRlZmF1bHQpKGVbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEUoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbMF0gPT09IHRbMF0gJiYgZVsxXSA9PT0gdFsxXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlW3JdWzBdID09PSB0WzBdICYmIGVbcl1bMV0gPT09IHRbMV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGEuZGVmYXVsdCkodCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlkID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUsIHQsIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFtdLCBzID0gJ2h0dHBzOi8vaHRsYi5jYXNhbGVtZWRpYS5jb20vY3lnbnVzJywgdSA9IHt9LCBjID0gZVswXS51c2VySWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgJ29iamVjdCcgPT09IHYoYykgJiYgYy5pZGxfZW52ICYmIGZ1bmN0aW9uIChlLCB0LCByLCBpLCBvLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gKHRbb10gPSAxLCBlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHsgcnRpUGFydG5lcjogYSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBuLmxvZ1dhcm4oJ1RyaWVkIHRvIGFkZCBhIHVzZXIgSUQgZnJvbSBQcmViaWQsIHRoZSBJRCByZWNlaXZlZCB3YXMgbnVsbCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGEsIHUsIGMuaWRsX2VudiwgJ2xpdmVyYW1wLmNvbScsICdMaXZlUmFtcElwJywgJ2lkbCcpLCB3aW5kb3cuaGVhZGVydGFnICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHdpbmRvdy5oZWFkZXJ0YWcuZ2V0SWRlbnRpdHlJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gd2luZG93LmhlYWRlcnRhZy5nZXRJZGVudGl0eUluZm8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgJ29iamVjdCcgPT09IHYoZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGYgaW4gZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmhhc093blByb3BlcnR5KGYpICYmICF1Lmhhc093blByb3BlcnR5KGYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZFtmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXAucmVzcG9uc2VQZW5kaW5nICYmIHAuZGF0YSAmJiAnb2JqZWN0JyA9PT0gdihwLmRhdGEpICYmIE9iamVjdC5rZXlzKHAuZGF0YSkubGVuZ3RoICYmIGEucHVzaChwLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHt9OwogICAgICAgICAgICAgICAgICAgIG0uaWQgPSBlWzBdLmJpZGRlclJlcXVlc3RJZCwgbS5zaXRlID0ge30sIG0uZXh0ID0ge30sIG0uZXh0LnNvdXJjZSA9ICdwcmViaWQnLCBtLmV4dC5peGRpYWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmFuc2FjdGlvbklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pbmRleE9mKGUpID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZnU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxVOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW46ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID0gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmFuc2FjdGlvbklkID09PSB0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF0sIG4uZGVlcEFjY2VzcyhhLCAnbWVkaWFUeXBlcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYS5tZWRpYVR5cGVzKS5sZW5ndGggPiAxICYmIHIubWZ1KyssIG4uZGVlcEFjY2VzcyhhLCAnbWVkaWFUeXBlcy5uYXRpdmUnKSAmJiByLm51KyssIG4uZGVlcEFjY2VzcyhhLCAnbWVkaWFUeXBlcy5iYW5uZXInKSAmJiByLmJ1KyssICdvdXRzdHJlYW0nID09PSBuLmRlZXBBY2Nlc3MoYSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5vdSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gJ29iamVjdCcgPT09IHYobi5kZWVwQWNjZXNzKGEsICdyZW5kZXJlcicpIHx8IG4uZGVlcEFjY2VzcyhhLCAnbWVkaWFUeXBlcy52aWRlby5yZW5kZXJlcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJlbiA9IHIucmVuICYmIG8gPyBuLmRlZXBBY2Nlc3MociwgJ3JlbicpIDogbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0cmVhbScgPT09IG4uZGVlcEFjY2VzcyhhLCAnbWVkaWFUeXBlcy52aWRlby5jb250ZXh0JykgJiYgci5pdSsrLCByLmFsbFUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSAwOyBvIDwgdC5sZW5ndGg7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSBpbiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG0uZXh0Lml4ZGlhZ1t5XSA9IGJbeV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChlWzBdLnNjaGFpbiAmJiAobS5zb3VyY2UgPSB7IGV4dDogeyBzY2hhaW46IGVbMF0uc2NoYWluIH0gfSksIGEubGVuZ3RoID4gMCAmJiAobS51c2VyID0ge30sIG0udXNlci5laWRzID0gYSksIGRvY3VtZW50LnJlZmVycmVyICYmICcnICE9PSBkb2N1bWVudC5yZWZlcnJlciAmJiAobS5zaXRlLnJlZiA9IGRvY3VtZW50LnJlZmVycmVyKSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5nZHByQ29uc2VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0LmdkcHJDb25zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5oYXNPd25Qcm9wZXJ0eSgnZ2RwckFwcGxpZXMnKSAmJiAobS5yZWdzID0geyBleHQ6IHsgZ2RwcjogaC5nZHByQXBwbGllcyA/IDEgOiAwIH0gfSksIGguaGFzT3duUHJvcGVydHkoJ2NvbnNlbnRTdHJpbmcnKSAmJiAobS51c2VyID0gbS51c2VyIHx8IHt9LCBtLnVzZXIuZXh0ID0geyBjb25zZW50OiBoLmNvbnNlbnRTdHJpbmcgfHwgJycgfSwgaC5oYXNPd25Qcm9wZXJ0eSgnYWRkdGxDb25zZW50JykgJiYgaC5hZGR0bENvbnNlbnQgJiYgKG0udXNlci5leHQuY29uc2VudGVkX3Byb3ZpZGVyc19zZXR0aW5ncyA9IHsgY29uc2VudGVkX3Byb3ZpZGVyczogaC5hZGR0bENvbnNlbnQgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQudXNwQ29uc2VudCAmJiBuLmRlZXBTZXRWYWx1ZShtLCAncmVncy5leHQudXNfcHJpdmFjeScsIHQudXNwQ29uc2VudCksIHQucmVmZXJlckluZm8gJiYgKG0uc2l0ZS5wYWdlID0gdC5yZWZlcmVySW5mby5yZWZlcmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSB7fSwgTyA9IHQgJiYgdC5iaWRkZXJDb2RlIHx8ICdpeCcsIF8gPSBvLmNvbmZpZy5nZXRDb25maWcoTyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKF8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSB2KF8uZmlyc3RQYXJ0eURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSA9IF8uZmlyc3RQYXJ0eURhdGEsIEkgPSAnPyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB3IGluIEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLmhhc093blByb3BlcnR5KHcpICYmIChJICs9ICcnLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodyksICc9JykuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChFW3ddKSwgJyYnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gSS5zbGljZSgwLCAtMSksIG0uc2l0ZS5wYWdlICs9IEk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgPT0gdHlwZW9mIF8udGltZW91dCAmJiAoUy50ID0gXy50aW1lb3V0KSwgJ2Jvb2xlYW4nID09IHR5cGVvZiBfLmRldGVjdE1pc3NpbmdTaXplcyA/IG0uZXh0Lml4ZGlhZy5kbXMgPSBfLmRldGVjdE1pc3NpbmdTaXplcyA6IG0uZXh0Lml4ZGlhZy5kbXMgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUy5zID0gZVswXS5wYXJhbXMuc2l0ZUlkLCBTLnYgPSBpLCBTLmFjID0gJ2onLCBTLnNkID0gMSwgOC4xID09PSBpICYmIChTLm5mID0gMSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIEEgPSBbXSwgeCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBTCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIEMgPSBuZXcgQmxvYihbJycuY29uY2F0KHgudXJsKS5jb25jYXQobi5wYXJzZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyhnKGcoe30sIHguZGF0YSksIHt9LCB7IHI6IEpTT04uc3RyaW5naWZ5KG0pIH0pKSldKS5zaXplLCBQID0gQywgaiA9IDAsIFIgPSAwLCBEID0gMDsKICAgICAgICAgICAgICAgICAgICBtLmV4dC5peGRpYWcubXNkID0gMCwgbS5leHQuaXhkaWFnLm1zaSA9IDAsIG0uaW1wID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDAsIE4gPSBPYmplY3Qua2V5cyhyKSwgTSA9IFtdOyBrIDwgTi5sZW5ndGggJiYgQS5sZW5ndGggPCA0OykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocltOW2tdXS5oYXNPd25Qcm9wZXJ0eSgnbWlzc2luZ0NvdW50JykgJiYgKEQgPSByW05ba11dLm1pc3NpbmdDb3VudCksIFQocltOW2tdXSwgODAwMCAtIEMpLCByW05ba11dLmhhc093blByb3BlcnR5KCdtaXNzaW5nSW1wcycpICYmIChSID0gcltOW2tdXS5taXNzaW5nSW1wcy5sZW5ndGgpLCAoUCArPSBuZXcgQmxvYihbZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHJbTltrXV0pKV0pLnNpemUpIDwgODAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFUsIEI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKFUgPSBtLmltcCkucHVzaC5hcHBseShVLCBsKHJbTltrXV0uaXhJbXBzKSksIG0uZXh0Lml4ZGlhZy5tc2QgKz0gRCwgbS5leHQuaXhkaWFnLm1zaSArPSBSLCByW05ba11dLmhhc093blByb3BlcnR5KCdtaXNzaW5nSW1wcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEIgPSBNKS5wdXNoLmFwcGx5KEIsIGwocltOW2tdXS5taXNzaW5nSW1wcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEwsIHogPSBuLmRlZXBDbG9uZShTKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMID0gbS5pbXApLnB1c2guYXBwbHkoTCwgbChNKSksIG0uZXh0Lml4ZGlhZy5zbiA9IGosIHouc24gPSBqLCBqKyssIHouciA9IEpTT04uc3RyaW5naWZ5KG0pLCBBLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBNID0gW10sIFAgPSBDLCBtLmltcCA9IFtdLCBEID0gMCwgUiA9IDAsIG0uZXh0Lml4ZGlhZy5tc2QgPSAwLCBtLmV4dC5peGRpYWcubXNpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoUCA+IEMgJiYgUCA8IDgwMDAgJiYgQS5sZW5ndGggPCA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWLCBGID0gbi5kZWVwQ2xvbmUoUyk7CiAgICAgICAgICAgICAgICAgICAgICAgIChWID0gbS5pbXApLnB1c2guYXBwbHkoViwgbChNKSksIEEubGVuZ3RoID4gMCAmJiAobS5leHQuaXhkaWFnLnNuID0gaiwgRi5zbiA9IGopLCBGLnIgPSBKU09OLnN0cmluZ2lmeShtKSwgQS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBGCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gQTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IEJsb2IoW2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSldKS5zaXplOwogICAgICAgICAgICAgICAgICAgIGlmICghKHIgPCB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgciA+IHQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KCdtaXNzaW5nSW1wcycpICYmIGUubWlzc2luZ0ltcHMubGVuZ3RoID4gMCA/IGUubWlzc2luZ0ltcHMucG9wKCkgOiBlLmhhc093blByb3BlcnR5KCdpeEltcHMnKSAmJiBlLml4SW1wcy5sZW5ndGggPiAwICYmIGUuaXhJbXBzLnBvcCgpLCByID0gbmV3IEJsb2IoW2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSldKS5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0WzBdID09IGVbcl1bMF0gJiYgdFsxXSA9PSBlW3JdWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zcGxpY2UociwgMSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS50cmFuc2FjdGlvbklkOwogICAgICAgICAgICAgICAgICAgIGlmICh0Lmhhc093blByb3BlcnR5KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHRbaV0uaGFzT3duUHJvcGVydHkoJ21pc3NpbmdTaXplcycpICYmIChvID0gdFtpXS5taXNzaW5nU2l6ZXMpLCB4KG8sIGUucGFyYW1zLnNpemUpLCB0W2ldLm1pc3NpbmdTaXplcyA9IG87CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMuYmFubmVyLnNpemVzJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuLmRlZXBDbG9uZShlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgeChhLCBlLnBhcmFtcy5zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nU2l6ZXM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uOiByCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRbaV0gPSBzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5kZWVwQ2xvbmUoZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZXh0LnNpZCA9ICcnLmNvbmNhdCh0WzBdLCAneCcpLmNvbmNhdCh0WzFdKSwgci5iYW5uZXIudyA9IHRbMF0sIHIuYmFubmVyLmggPSB0WzFdLCByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGogPSB7CiAgICAgICAgICAgICAgICAgICAgY29kZTogJ2l4JywKICAgICAgICAgICAgICAgICAgICBndmxpZDogMTAsCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogYiwKICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIGkgPSBuLmRlZXBBY2Nlc3MoZSwgJ3BhcmFtcy52aWRlbycpLCBvID0gbi5kZWVwQWNjZXNzKGUsICdwYXJhbXMuc2l6ZScpLCBhID0gbi5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpLCBzID0gbi5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvJyksIHUgPSBuLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpLCBjID0gZS5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ2JpZEZsb29yJyksIGQgPSBlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnYmlkRmxvb3JDdXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFFKGUucGFyYW1zLnNpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5sb2dFcnJvcignaXggYmlkZGVyIHBhcmFtczogYmlkIHNpemUgaGFzIGludmFsaWQgZm9ybWF0LicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFUeXBlJykgJiYgIW4uY29udGFpbnMoYiwgZS5tZWRpYVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzT3duUHJvcGVydHkoJ21lZGlhVHlwZXMnKSAmJiAhYSAmJiAhdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSShlLnNpemVzLCBvKSAmJiAhKHUgJiYgSSh1LCBvKSB8fCBhICYmIEkoYSwgbykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5sb2dFcnJvcignaXggYmlkZGVyIHBhcmFtczogYmlkIHNpemUgaXMgbm90IGluY2x1ZGVkIGluIGFkIHVuaXQgc2l6ZXMgb3IgcGxheWVyIHNpemUuJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICYmIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAhMCwgZiA9IDAsIHAgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWltZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbmR1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhkdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvdG9jb2xzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOyBmIDwgcC5sZW5ndGg7IGYrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gcFtmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaGFzT3duUHJvcGVydHkoZykgJiYgIWkuaGFzT3duUHJvcGVydHkoZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdwcm90b2NvbHMnID09PSBnICYmIChzLmhhc093blByb3BlcnR5KCdwcm90b2NvbCcpIHx8IGkuaGFzT3duUHJvcGVydHkoJ3Byb3RvY29sJykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvZ0Vycm9yKCdpeCBiaWRkZXIgcGFyYW1zOiAnICsgZyArICcgaXMgbm90IGluY2x1ZGVkIGluIGVpdGhlciB0aGUgYWR1bml0IG9yIHBhcmFtcyBsZXZlbCcpLCBsID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyAhPSB0eXBlb2YgZS5wYXJhbXMuc2l0ZUlkICYmICdudW1iZXInICE9IHR5cGVvZiBlLnBhcmFtcy5zaXRlSWQgPyAobi5sb2dFcnJvcignaXggYmlkZGVyIHBhcmFtczogc2l0ZUlkIG11c3QgYmUgc3RyaW5nIG9yIG51bWJlciB2YWx1ZS4nKSwgITEpIDogISEoIWMgJiYgIWQgfHwgYyAmJiBkICYmICh0ID0gZS5wYXJhbXMuYmlkRmxvb3IsIHIgPSBlLnBhcmFtcy5iaWRGbG9vckN1ciwgQm9vbGVhbignbnVtYmVyJyA9PSB0eXBlb2YgdCAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgciAmJiByLm1hdGNoKC9eW0EtWl17M30kLykpKSkgfHwgKG4ubG9nRXJyb3IoJ2l4IGJpZGRlciBwYXJhbXM6IGJpZEZsb29yIC8gYmlkRmxvb3JDdXIgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIGZvcm1hdC4nKSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYnVpbGRSZXF1ZXN0czogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IFtdLCBhID0ge30sIHMgPSB7fSwgdSA9IG51bGwsIGMgPSB7fSwgZCA9IGcoZyh7fSwgeyBkZXRlY3RNaXNzaW5nU2l6ZXM6ICEwIH0pLCBvLmNvbmZpZy5nZXRDb25maWcoJ2l4JykpLCBmID0gMDsgZiA8IGUubGVuZ3RoOyBmKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKHUgPSBlW2ZdKS5tZWRpYVR5cGUgPT09IGkuVklERU8gfHwgbi5kZWVwQWNjZXNzKHUsICdtZWRpYVR5cGVzLnZpZGVvJykpICYmICh1Lm1lZGlhVHlwZSA9PT0gaS5WSURFTyB8fCBJKHUubWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplLCB1LnBhcmFtcy5zaXplKSkgJiYgKHMuaGFzT3duUHJvcGVydHkodS50cmFuc2FjdGlvbklkKSB8fCAoc1t1LnRyYW5zYWN0aW9uSWRdID0ge30pLCBzW3UudHJhbnNhY3Rpb25JZF0uaGFzT3duUHJvcGVydHkoJ2l4SW1wcycpIHx8IChzW3UudHJhbnNhY3Rpb25JZF0uaXhJbXBzID0gW10pLCBzW3UudHJhbnNhY3Rpb25JZF0uaXhJbXBzLnB1c2goUyh1KSkpLCB1Lm1lZGlhVHlwZSA9PT0gaS5CQU5ORVIgfHwgbi5kZWVwQWNjZXNzKHUsICdtZWRpYVR5cGVzLmJhbm5lcicpICYmIEkobi5kZWVwQWNjZXNzKHUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpLCB1LnBhcmFtcy5zaXplKSB8fCAhdS5tZWRpYVR5cGUgJiYgIXUubWVkaWFUeXBlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gaCh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhc093blByb3BlcnR5KHUudHJhbnNhY3Rpb25JZCkgfHwgKGFbdS50cmFuc2FjdGlvbklkXSA9IHt9KSwgYVt1LnRyYW5zYWN0aW9uSWRdLmhhc093blByb3BlcnR5KCdpeEltcHMnKSB8fCAoYVt1LnRyYW5zYWN0aW9uSWRdLml4SW1wcyA9IFtdKSwgYVt1LnRyYW5zYWN0aW9uSWRdLml4SW1wcy5wdXNoKHApLCBkLmhhc093blByb3BlcnR5KCdkZXRlY3RNaXNzaW5nU2l6ZXMnKSAmJiBkLmRldGVjdE1pc3NpbmdTaXplcyAmJiBDKHUsIGMsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gaW4gYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuaGFzT3duUHJvcGVydHkobSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGNbbV0ubWlzc2luZ1NpemVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaGFzT3duUHJvcGVydHkobSkgfHwgKGFbbV0gPSB7fSksIGFbbV0uaGFzT3duUHJvcGVydHkoJ21pc3NpbmdJbXBzJykgfHwgKGFbbV0ubWlzc2luZ0ltcHMgPSBbXSwgYVttXS5taXNzaW5nQ291bnQgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gY1ttXS5pbXByZXNzaW9uLCB5ID0gMDsgeSA8IHYubGVuZ3RoOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE8gPSBQKGIsIHZbeV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW21dLm1pc3NpbmdJbXBzLnB1c2goTyksIGFbbV0ubWlzc2luZ0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhKS5sZW5ndGggPiAwICYmIHIucHVzaC5hcHBseShyLCBsKEEoZSwgdCwgYSwgNy4yKSkpLCBPYmplY3Qua2V5cyhzKS5sZW5ndGggPiAwICYmIHIucHVzaC5hcHBseShyLCBsKEEoZSwgdCwgcywgOC4xKSkpLCByOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaGFzT3duUHJvcGVydHkoJ2JvZHknKSB8fCAhZS5ib2R5Lmhhc093blByb3BlcnR5KCdzZWF0YmlkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBlLmJvZHksIG8gPSBpLnNlYXRiaWQsIGEgPSAwOyBhIDwgby5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9bYV0uaGFzT3duUHJvcGVydHkoJ2JpZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IG9bYV0uYmlkLCB1ID0gSlNPTi5wYXJzZSh0LmRhdGEuciksIGMgPSAwOyBjIDwgcy5sZW5ndGg7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHcoc1tjXS5pbXBpZCwgdS5pbXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gXyhzW2NdLCBpLmN1ciwgZCksIHIucHVzaChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1CaWRQYXJhbXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNvbnZlcnRUeXBlcyh7IHNpdGVJRDogJ251bWJlcicgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlmcmFtZUVuYWJsZWQgPyBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vanMtc2VjLmluZGV4d3cuY29tL3VtL2l4bWF0Y2guaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dIDogW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQuc3BlYyA9IGosICgwLCB1LnJlZ2lzdGVyQmlkZGVyKShqKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIucih0KTsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBOdW1iZXIuaXNJbnRlZ2VyIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09IHR5cGVvZiBlICYmIGlzRmluaXRlKGUpICYmIE1hdGguZmxvb3IoZSkgPT09IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5kZWZhdWx0ID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNwZWMgPSB0LlVTRVJfSURfQ09ERV9UT19RVUVSWV9BUkcgPSB2b2lkIDAsIHIoNiksIHIoMTMpLCByKDkpLCByKDExKSwgcig0KSwgcigyKSwgcigxMDIpLCByKDEpLCByKDMpLCByKDApLCByKDUpLCByKDMzKSwgcig0MCk7CiAgICAgICAgICAgICAgICB2YXIgaSA9IHIoMjIpLCBvID0gcig0OSksIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBuKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKGEuZ2V0IHx8IGEuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBvLCBhKSA6IHJbb10gPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIHMgPSByKDQ1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShuID0gKGEgPSBzLm5leHQoKSkuZG9uZSkgJiYgKHIucHVzaChhLnZhbHVlKSwgIXQgfHwgci5sZW5ndGggIT09IHQpOyBuID0gITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBudWxsID09IHMucmV0dXJuIHx8IHMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHIgfHwgJ1NldCcgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGVbcl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGwgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHMuQkFOTkVSLAogICAgICAgICAgICAgICAgICAgICAgICBzLlZJREVPCiAgICAgICAgICAgICAgICAgICAgXSwgZiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJpdGVwb29saWQ6ICdicml0ZXBvb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlb0lkOiAnY3JpdGVvaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHJ1c3RpZDogJ2RpZ2l0cnVzdGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgaWQ1aWQ6ICdpZDVpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGlkbF9lbnY6ICdscmUnLAogICAgICAgICAgICAgICAgICAgICAgICBsaXBiOiAnbGlwYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgbmV0SWQ6ICduZXRpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnJhYmxlSWQ6ICdwYXJyYWJsZWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgcHViY2lkOiAncHViY2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgdGRpZDogJ3R0ZHV1aWQnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHQuVVNFUl9JRF9DT0RFX1RPX1FVRVJZX0FSRyA9IGY7CiAgICAgICAgICAgICAgICB2YXIgcCA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiAnb3BlbngnLAogICAgICAgICAgICAgICAgICAgIGd2bGlkOiA2OSwKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBsLAogICAgICAgICAgICAgICAgICAgIGlzQmlkUmVxdWVzdFZhbGlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucGFyYW1zLmRlbERvbWFpbiB8fCBlLnBhcmFtcy5wbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy5iYW5uZXInKSAmJiB0ID8gISFlLnBhcmFtcy51bml0IHx8IGEuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMubGVuZ3RoJykgPiAwIDogISghZS5wYXJhbXMudW5pdCB8fCAhdCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdLCBuID0gYyhmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSB0LCBhLmRlZXBBY2Nlc3MociwgJ21lZGlhVHlwZXMudmlkZW8nKSAmJiAhYS5kZWVwQWNjZXNzKHIsICdtZWRpYVR5cGVzLmJhbm5lcicpIHx8IHIubWVkaWFUeXBlID09PSBzLlZJREVPID8gZVswXS5wdXNoKHQpIDogZVsxXS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpLCAyKSwgbyA9IG5bMF0sIHUgPSBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5sZW5ndGggPiAwICYmIHIucHVzaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXSwgbiA9ICExLCBvID0gbShlLCB0KSwgdSA9IGEuX21hcChlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJhbXMudW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYXVzID0gYS5fbWFwKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucGFyc2VTaXplc0lucHV0KGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMpLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJ3wnKSwgby5kaXZJZHMgPSBhLl9tYXAoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUuYWRVbml0Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJyksIHUuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKG8uYXVpZCA9IHUuam9pbignLCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmFtcy5kb05vdFRyYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKG8ubnMgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICghMCA9PT0gaS5jb25maWcuZ2V0Q29uZmlnKCdjb3BwYScpIHx8IGUuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmFtcy5jb3BwYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSAmJiAoby50ZmNkID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5wYXJhbXMuY3VzdG9tUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYS5fbWFwKE9iamVjdC5rZXlzKGUucGFyYW1zLmN1c3RvbVBhcmFtcyksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pc0FycmF5KHIpICYmIChyID0gci5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUudG9Mb3dlckNhc2UoKSArICc9JyArIHIudG9Mb3dlckNhc2UoKSkucmVwbGFjZSgnKycsICcuJykucmVwbGFjZSgnLycsICdfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBlLnBhcmFtcy5jdXN0b21QYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkgPSB3aW5kb3cuYnRvYSh0LmpvaW4oJyYnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMCwgci5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4gJiYgKG8udHBzID0gci5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBbXSwgZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBuID0gaS5jb25maWcuZ2V0Q29uZmlnKCdjdXJyZW5jeS5hZFNlcnZlckN1cnJlbmN5JykgfHwgJ1VTRCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuZ2V0Rmxvb3IgJiYgKHIgPSBlLmdldEZsb29yKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLmZsb29yIHx8IGUucGFyYW1zLmN1c3RvbUZsb29yIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKDEwMDAgKiBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHMuQkFOTkVSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gKGMucHVzaCh0KSwgZCA9ICEwKSA6IGMucHVzaCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBkICYmIChvLmF1bWZzID0gYy5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogby5waCA/ICdodHRwczovL3Uub3BlbngubmV0L3cvMS4wL2FyaicgOiAnaHR0cHM6Ly8nLmNvbmNhdChlWzBdLnBhcmFtcy5kZWxEb21haW4sICcvdy8xLjAvYXJqJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0odSwgdCkpLCBvLmxlbmd0aCA+IDAgJiYgby5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBpID0gbShbZV0sIHQpLCBvID0gYS5kZWVwQWNjZXNzKGUsICdwYXJhbXMudmlkZW8nKSB8fCB7fSwgcyA9IGEuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy52aWRlby5jb250ZXh0JyksIHUgPSBhLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmlzQXJyYXkoZS5zaXplcykgJiYgMiA9PT0gZS5zaXplcy5sZW5ndGggJiYgIWEuaXNBcnJheShlLnNpemVzWzBdKSA/IChyID0gcGFyc2VJbnQoZS5zaXplc1swXSwgMTApLCBuID0gcGFyc2VJbnQoZS5zaXplc1sxXSwgMTApKSA6IGEuaXNBcnJheShlLnNpemVzKSAmJiBhLmlzQXJyYXkoZS5zaXplc1swXSkgJiYgMiA9PT0gZS5zaXplc1swXS5sZW5ndGggPyAociA9IHBhcnNlSW50KGUuc2l6ZXNbMF1bMF0sIDEwKSwgbiA9IHBhcnNlSW50KGUuc2l6ZXNbMF1bMV0sIDEwKSkgOiBhLmlzQXJyYXkodSkgJiYgMiA9PT0gdS5sZW5ndGggJiYgKHIgPSBwYXJzZUludCh1WzBdLCAxMCksIG4gPSBwYXJzZUludCh1WzFdLCAxMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlbnJ0YicgPT09IGUgPyAob1tlXS53ID0gciB8fCBvW2VdLncsIG9bZV0udiA9IG4gfHwgb1tlXS52LCBpW2VdID0gSlNPTi5zdHJpbmdpZnkob1tlXSkpIDogZSBpbiBpIHx8ICd1cmwnID09PSBlIHx8IChpW2VdID0gb1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmF1aWQgPSBlLnBhcmFtcy51bml0LCBpLnZ3ZCA9IHIgfHwgby52d2QsIGkudmh0ID0gbiB8fCBvLnZodCwgJ291dHN0cmVhbScgPT09IHMgJiYgKGkudm9zID0gJzEwMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm1pbWVzICYmIChpLnZtaW1lcyA9IG8ubWltZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBhcmFtcy50ZXN0ICYmIChpLnZ0ZXN0ID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiByLnBoID8gJ2h0dHBzOi8vdS5vcGVueC5uZXQvdi8xLjAvYXZqcCcgOiAnaHR0cHM6Ly8nLmNvbmNhdChlLnBhcmFtcy5kZWxEb21haW4sICcvdi8xLjAvYXZqcCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRSZXNwb25zZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9hdmpwJC8udGVzdChlLnVybCkgPyBzLlZJREVPIDogcy5CQU5ORVI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgPT09IHMuVklERU8gPyBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmJpZCwgbiA9ICh0LnN0YXJ0VGltZSwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZSAmJiAnJyAhPT0gZS52YXN0VXJsICYmIGUucHViX3JldiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGEucGFyc2VVcmwoZS52YXN0VXJsKS5zZWFyY2ggfHwge30sIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnJlcXVlc3RJZCA9IHIuYmlkSWQsIG8udHRsID0gMzAwLCBvLm5ldFJldmVudWUgPSAhMCwgby5jdXJyZW5jeSA9IGUuY3VycmVuY3ksIG8uY3BtID0gcGFyc2VJbnQoZS5wdWJfcmV2LCAxMCkgLyAxMDAwLCBvLndpZHRoID0gcGFyc2VJbnQoZS53aWR0aCwgMTApLCBvLmhlaWdodCA9IHBhcnNlSW50KGUuaGVpZ2h0LCAxMCksIG8uY3JlYXRpdmVJZCA9IGUuYWRpZCwgby52YXN0VXJsID0gZS52YXN0VXJsLCBvLm1lZGlhVHlwZSA9IHMuVklERU8sIGUucGggPSBpLnBoLCBlLmNvbG8gPSBpLmNvbG8sIGUudHMgPSBpLnRzLCBuLnB1c2gobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfShyLCB0LnBheWxvYWQpIDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LmJpZHMsIG4gPSAodC5zdGFydFRpbWUsIGUuYWRzLmFkKSwgaSA9IFtdLCBvID0gMDsgbyA8IG4ubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5bb10sIHMgPSBwYXJzZUludChhLmlkeCwgMTApLCB1ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUucmVxdWVzdElkID0gcltzXS5iaWRJZCwgYS5wdWJfcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuY3BtID0gTnVtYmVyKGEucHViX3JldikgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuY3JlYXRpdmVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKHUud2lkdGggPSBjLndpZHRoLCB1LmhlaWdodCA9IGMuaGVpZ2h0KSwgdS5jcmVhdGl2ZUlkID0gYy5pZCwgdS5hZCA9IGEuaHRtbCwgYS5kZWFsX2lkICYmICh1LmRlYWxJZCA9IGEuZGVhbF9pZCksIHUudHRsID0gMzAwLCB1Lm5ldFJldmVudWUgPSAhMCwgdS5jdXJyZW5jeSA9IGEuY3VycmVuY3ksIGEudGJkICYmICh1LnRiZCA9IGEudGJkKSwgdS50cyA9IGEudHMsIHUubWV0YSA9IHt9LCBhLmJyYW5kX2lkICYmICh1Lm1ldGEuYnJhbmRJZCA9IGEuYnJhbmRfaWQpLCBhLmFkdl9pZCAmJiAodS5tZXRhLmRzcGlkID0gYS5hZHZfaWQpLCBpLnB1c2godSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0ociwgdC5wYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaWZyYW1lRW5hYmxlZCB8fCBlLnBpeGVsRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUuaWZyYW1lRW5hYmxlZCA/ICdpZnJhbWUnIDogJ2ltYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBhLmRlZXBBY2Nlc3ModCwgJzAuYm9keS5hZHMucGl4ZWxzJykgfHwgYS5kZWVwQWNjZXNzKHQsICcwLmJvZHkucGl4ZWxzJykgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ2h0dHBzOi8vdS5vcGVueC5uZXQvdy8xLjAvcGQnLCBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIChuLnB1c2goJ2dkcHI9JyArIChlLmdkcHJBcHBsaWVzID8gMSA6IDApKSwgbi5wdXNoKCdnZHByX2NvbnNlbnQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChlLmNvbnNlbnRTdHJpbmcgfHwgJycpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIG4ucHVzaCgndXNfcHJpdmFjeT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQocikuY29uY2F0KG4ubGVuZ3RoID4gMCA/ICc/JyArIG4uam9pbignJicpIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHIsIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJpZFBhcmFtczogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuY29udmVydFR5cGVzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmxvb3I6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciwgbiwgaSA9IHdpbmRvdywgbyA9IGRvY3VtZW50LCBhID0gby5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB3aW5kb3cudG9wLCBvID0gd2luZG93LnRvcC5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBvLmRvY3VtZW50RWxlbWVudCwgbiA9IG8uYm9keSwgdCA9IGkuaW5uZXJXaWR0aCB8fCBhLmNsaWVudFdpZHRoIHx8IG4uY2xpZW50V2lkdGgsIHIgPSBpLmlubmVySGVpZ2h0IHx8IGEuY2xpZW50SGVpZ2h0IHx8IG4uY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBvLmRvY3VtZW50RWxlbWVudCwgdCA9IGkuaW5uZXJXaWR0aCB8fCBhLmNsaWVudFdpZHRoLCByID0gaS5pbm5lckhlaWdodCB8fCBhLmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdCh0LCAneCcpLmNvbmNhdChyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBuLCBvLCBzLCB1LCBjLCBkID0gYS5pbklmcmFtZSgpOwogICAgICAgICAgICAgICAgICAgIGlmIChyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAganU6IGkuY29uZmlnLmdldENvbmZpZygncGFnZVVybCcpIHx8IHQucmVmZXJlckluZm8ucmVmZXJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoOiBkb2N1bWVudC5jaGFyU2V0IHx8IGRvY3VtZW50LmNoYXJhY3RlclNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlczogJycuY29uY2F0KHNjcmVlbi53aWR0aCwgJ3gnKS5jb25jYXQoc2NyZWVuLmhlaWdodCwgJ3gnKS5jb25jYXQoc2NyZWVuLmNvbG9yRGVwdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHo6IG5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3czogZyhkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmM6IGVbMF0ucGFyYW1zLmJjIHx8ICcnLmNvbmNhdCgnaGJfcGInLCAnXycpLmNvbmNhdCgnMy4wLjMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkZGlkOiBhLl9tYXAoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmFuc2FjdGlvbklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9jYWNoZTogbmV3IERhdGUoKS5nZXRUaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZVswXS5wYXJhbXMucGxhdGZvcm0gJiYgKHIucGggPSBlWzBdLnBhcmFtcy5wbGF0Zm9ybSksIHQuZ2RwckNvbnNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB0LmdkcHJDb25zZW50OwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGwuY29uc2VudFN0cmluZyAmJiAoci5nZHByX2NvbnNlbnQgPSBsLmNvbnNlbnRTdHJpbmcpLCB2b2lkIDAgIT09IGwuZ2RwckFwcGxpZXMgJiYgKHIuZ2RwciA9IGwuZ2RwckFwcGxpZXMgPyAxIDogMCksICdpYWInID09PSBpLmNvbmZpZy5nZXRDb25maWcoJ2NvbnNlbnRNYW5hZ2VtZW50LmNtcEFwaScpICYmIChyLnhfZ2Rwcl9mID0gMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQudXNwQ29uc2VudCAmJiAoci51c19wcml2YWN5ID0gdC51c3BDb25zZW50KSwgYS5kZWVwQWNjZXNzKGVbMF0sICdjcnVtYnMucHViY2lkJykgJiYgYS5kZWVwU2V0VmFsdWUoZVswXSwgJ3VzZXJJZC5wdWJjaWQnLCBhLmRlZXBBY2Nlc3MoZVswXSwgJ2NydW1icy5wdWJjaWQnKSksIG4gPSByLCBvID0gZVswXS51c2VySWQsIGEuX2VhY2gobywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBmW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5oYXNPd25Qcm9wZXJ0eSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkaWdpdHJ1c3RpZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGEuZGVlcEFjY2VzcyhlLCAnZGF0YS5pZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGlwYic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGUubGlwYmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGFycmFibGVJZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGUuZWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaWQ1aWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlLnVpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgciA9IG4sIGVbMF0uc2NoYWluICYmIChyLnNjaGFpbiA9IChzID0gZVswXS5zY2hhaW4sICcnLmNvbmNhdChzLnZlciwgJywnKS5jb25jYXQocy5jb21wbGV0ZSwgJyEnKS5jb25jYXQoKHUgPSBzLm5vZGVzLCBjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnYXNpJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdocCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdyaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW4nCiAgICAgICAgICAgICAgICAgICAgXSwgdS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyEnKSkpKSksIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnNwZWMgPSBwLCAoMCwgby5yZWdpc3RlckJpZGRlcikocCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIoNCksIHIoMiksIHIoMSksIHIoMyksIHIoMCksIHIoNiksIHIoMzApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zcGVjID0gdm9pZCAwLCByKDMzKSwgcig0MCk7CiAgICAgICAgICAgICAgICB2YXIgaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT09IG4oZSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LmhhcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIGkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBvKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAoYS5nZXQgfHwgYS5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIG8sIGEpIDogcltvXSA9IGVbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShyKDcpKSwgbyA9IHIoNDkpLCBhID0gcig3NiksIHMgPSByKDQ1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjID0gJ0JpZCBmcm9tIHJlc3BvbnNlIGhhcyBubyBhdWlkIHBhcmFtZXRlciAtICcsIGQgPSAnQmlkIGZyb20gcmVzcG9uc2UgaGFzIG5vIGFkbSBwYXJhbWV0ZXIgLSAnLCBsID0gJ0FycmF5IG9mIGJpZCBvYmplY3RzIGlzIGVtcHR5JywgZiA9ICdDYW5cJ3QgZmluZCBpbiByZXF1ZXN0ZWQgYmlkcyB0aGUgYmlkIHdpdGggYXVpZCAtICcsIHAgPSAnU2VhdGJpZCBhcnJheSBmcm9tIHJlc3BvbnNlIGhhcyBlbXB0eSBpdGVtJywgZyA9ICdSZXNwb25zZSBpcyBlbXB0eScsIG0gPSAnUmVzcG9uc2UgaGFzIGVtcHR5IHNlYXRiaWQgYXJyYXknLCB2ID0gJ1NlYXRiaWQgZnJvbSByZXNwb25zZSBoYXMgbm8gYXJyYXkgb2YgYmlkIG9iamVjdHMgLSAnLCBiID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAndHJ1c3R4JywKICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5CQU5ORVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLlZJREVPCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGlzQmlkUmVxdWVzdFZhbGlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZS5wYXJhbXMudWlkOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG4sIG8gPSBbXSwgYSA9IHt9LCBzID0ge30sIHUgPSB7fSwgYyA9ICduZXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgfHwgW10pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3Jvc3MnID09PSBlLnBhcmFtcy5wcmljZVR5cGUgJiYgKGMgPSAnZ3Jvc3MnKSwgbiA9IGUuYmlkZGVyUmVxdWVzdElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5wYXJhbXMudWlkLCBkID0gZS5hZFVuaXRDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGkucGFyc2VTaXplc0lucHV0KGUuc2l6ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghciAmJiAhaS5pc0VtcHR5KGUucGFyYW1zLmtleXdvcmRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGkudHJhbnNmb3JtQmlkZGVyUGFyYW1LZXl3b3JkcyhlLnBhcmFtcy5rZXl3b3Jkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubGVuZ3RoID4gMCAmJiBmLmZvckVhY2goeSksIHIgPSBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3RdIHx8IChzW3RdID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gc1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW2RdID8gcFtkXS5iaWRzLnB1c2goZSkgOiBwW2RdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IHBbZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbZV0gPSAhMCwgYVt0XSB8fCAoYVt0XSA9IHt9KSwgYVt0XVtlXSA/IGFbdF1bZV0ucHVzaChnKSA6IGFbdF1bZV0gPSBbZ10sIGcucGFyZW50cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogYVt0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVpZHM6IG8uam9pbignLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBpLmdldEtleXModSkuam9pbignLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlclR5cGU6ICdQcmViaWRfanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJWZXJzaW9uOiAnNC4yNi4wJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIChkLmtleXdvcmRzID0gSlNPTi5zdHJpbmdpZnkocikpLCB0ICYmICh0LnJlZmVyZXJJbmZvICYmIHQucmVmZXJlckluZm8ucmVmZXJlciAmJiAoZC51ID0gdC5yZWZlcmVySW5mby5yZWZlcmVyKSwgdC50aW1lb3V0ICYmIChkLnd0aW1lb3V0ID0gdC50aW1lb3V0KSwgdC5nZHByQ29uc2VudCAmJiAodC5nZHByQ29uc2VudC5jb25zZW50U3RyaW5nICYmIChkLmdkcHJfY29uc2VudCA9IHQuZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZyksIGQuZ2Rwcl9hcHBsaWVzID0gJ2Jvb2xlYW4nID09IHR5cGVvZiB0LmdkcHJDb25zZW50LmdkcHJBcHBsaWVzID8gTnVtYmVyKHQuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMpIDogMSksIHQudXNwQ29uc2VudCAmJiAoZC51c19wcml2YWN5ID0gdC51c3BDb25zZW50KSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vc29maWEudHJ1c3R4Lm9yZy9oYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaS5wYXJzZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyhkKS5yZXBsYWNlKC9cJiQvLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc01hcDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogYS5SZW5kZXJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlICYmIGUuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBvID0gW10sIHMgPSB0LmJpZHNNYXAsIHUgPSB0LmRhdGEucHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IGUuc2VhdGJpZCAmJiAhZS5zZWF0YmlkLmxlbmd0aCAmJiAobiA9IG0pIDogbiA9IGcsICFuICYmIGUuc2VhdGJpZCAmJiBlLnNlYXRiaWQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMoaChlKSwgcywgdSwgbywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbiAmJiBpLmxvZ0Vycm9yKG4pLCBvOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5waXhlbEVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3NvZmlhLnRydXN0eC5vcmcvcHVzaF9zeW5jJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICB0ID0gZS52YWx1ZSwgaS5pc0FycmF5KHQpICYmIHQubGVuZ3RoID4gMCAmJiAnJyA9PT0gZS52YWx1ZVswXSAmJiBkZWxldGUgZS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gZS5iaWQgPyBlLmJpZFswXSB8fCBpLmxvZ0Vycm9yKGwpIDogaS5sb2dFcnJvcih2ICsgSlNPTi5zdHJpbmdpZnkoZSkpIDogaS5sb2dFcnJvcihwKSwgZSAmJiBlLmJpZCAmJiBlLmJpZFswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoZSwgdCwgciwgbiwgbykgewogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hdWlkIHx8IChhID0gYyArIEpTT04uc3RyaW5naWZ5KGUpKSwgZS5hZG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdFtlLmF1aWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICcnLmNvbmNhdChlLncsICd4JykuY29uY2F0KGUuaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVbbF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB1W2xdWzBdLCBnID0gcC5iaWRzLnNoaWZ0KCksIG0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBnLmJpZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IGIuY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IGUucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGUudywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGUuaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiBlLmF1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldFJldmVudWU6ICdncm9zcycgIT09IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbElkOiBlLmRlYWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvJyA9PT0gZS5jb250ZW50X3R5cGUgPyAobS52YXN0WG1sID0gZS5hZG0sIG0ubWVkaWFUeXBlID0gcy5WSURFTywgbS5hZFJlc3BvbnNlID0geyBjb250ZW50OiBtLnZhc3RYbWwgfSwgZy5yZW5kZXJlciB8fCBnLm1lZGlhVHlwZXMgJiYgZy5tZWRpYVR5cGVzLnZpZGVvICYmICdvdXRzdHJlYW0nICE9PSBnLm1lZGlhVHlwZXMudmlkZW8uY29udGV4dCB8fCAobS5yZW5kZXJlciA9IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIuaW5zdGFsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zZXRSZW5kZXIoTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dXYXJuKCdQcmViaWQgRXJyb3IgY2FsbGluZyBzZXRSZW5kZXIgb24gcmVuZGVyZXInLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnLmJpZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hY2RuLmFkbnhzLmNvbS92aWRlby9vdXRzdHJlYW0vQU5PdXRzdHJlYW1WaWRlby5qcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbykpKSA6IChtLmFkID0gZS5hZG0sIG0ubWVkaWFUeXBlID0gcy5CQU5ORVIpLCBuLnB1c2gobSksIHAuYmlkcy5sZW5ndGggfHwgcC5wYXJlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wYXJlbnQsIG4gPSBlLmtleSwgbyA9IGUudWlkLCBhID0gcltuXS5pbmRleE9mKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA+IC0xICYmIHJbbl0uc3BsaWNlKGEsIDEpLCByW25dLmxlbmd0aCB8fCAoZGVsZXRlIHJbbl0sIGkuZ2V0S2V5cyhyKS5sZW5ndGggfHwgZGVsZXRlIHRbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBmICsgZS5hdWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGQgKyBKU09OLnN0cmluZ2lmeShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhICYmIGkubG9nRXJyb3IoYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5yZW5kZXJlci5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LkFOT3V0c3RyZWFtVmlkZW8ucmVuZGVyQWQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SWQ6IGUuYWRVbml0Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUmVzcG9uc2U6IGUuYWRSZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuc3BlYyA9IGIsICgwLCBvLnJlZ2lzdGVyQmlkZGVyKShiKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcig0KSwgcigyKSwgcig2KSwgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNwZWMgPSB2b2lkIDAsIHIoMjYpLCByKDExKSwgcigyMTQpLCByKDEpLCByKDMpLCByKDApLCByKDUpLCByKDE2KSwgcigzMyksIHIoNDApOwogICAgICAgICAgICAgICAgdmFyIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8ICdvYmplY3QnICE9PSBuKGUpICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5oYXMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9LCBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKGEuZ2V0IHx8IGEuc2V0KSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBvLCBhKSA6IHJbb10gPSBlW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVmYXVsdCA9IGUsIHQgJiYgdC5zZXQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0ocig3KSksIG8gPSByKDIyKSwgYSA9IHIoNDkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgV2Vha01hcCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHUgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYywgZCwgbCwgZiA9ICgwLCByKDc1KS5nZXRTdG9yYWdlTWFuYWdlcikoKSwgcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2thcmdvJywKICAgICAgICAgICAgICAgICAgICAgICAgaXNCaWRSZXF1ZXN0VmFsaWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghZSB8fCAhZS5wYXJhbXMpICYmICEhZS5wYXJhbXMucGxhY2VtZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiA9IG8uY29uZmlnLmdldENvbmZpZygnY3VycmVuY3knKSwgYSA9IG4gJiYgbi5hZFNlcnZlckN1cnJlbmN5IHx8ICdVU0QnLCBzID0ge30sIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX2VhY2goZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2UuYmlkSWRdID0gZS5wYXJhbXMucGxhY2VtZW50SWQsIGNbZS5iaWRJZF0gPSBlLnNpemVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUubGVuZ3RoID4gMCAmJiBlWzBdLnVzZXJJZCAmJiBlWzBdLnVzZXJJZC50ZGlkICYmIChyID0gZVswXS51c2VySWQudGRpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHUoe30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBwLl9nZXRTZXNzaW9uSWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvdW50OiBwLl9nZXRSZXF1ZXN0Q291bnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogdC50aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtR3JhbnVsYXJpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbVJhbmdlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlaWw6IDIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElEczogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2l6ZXM6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZFJhd0JpZFJlcXVlc3RzOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcC5fZ2V0QWxsTWV0YWRhdGEociwgdC51c3BDb25zZW50KSksIGwgPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoe30sIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJycuY29uY2F0KCdodHRwczovL2tyay5rYXJnby5jb20nLCAnL2FwaS92Mi9iaWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAnanNvbj0nLmNvbmNhdChsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmJvZHksIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gcltpXSwgYSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm1ldGFkYXRhICYmIG8ubWV0YWRhdGEubGFuZGluZ1BhZ2VEb21haW4gJiYgKGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVXJsOiBvLm1ldGFkYXRhLmxhbmRpbmdQYWdlRG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyRG9tYWluczogW28ubWV0YWRhdGEubGFuZGluZ1BhZ2VEb21haW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiBOdW1iZXIoby5jcG0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogby53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBvLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQ6IG8uYWRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogby5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbElkOiBvLnRhcmdldGluZ0N1c3RvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0UmV2ZW51ZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiB0LmN1cnJlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXNlclN5bmNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgciA9IHAuX2dlbmVyYXRlUmFuZG9tVXVpZCgpLCBuID0gcC5fZ2V0Q2xpZW50SWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlmcmFtZUVuYWJsZWQgJiYgciAmJiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9jcmIua2FyZ28uY29tL2FwaS92MS9pbml0c3luY3JuZC97VVVJRH0/c2VlZD17U0VFRH0maWR4PXtJTkRFWH0nLnJlcGxhY2UoJ3tVVUlEfScsIG4pLnJlcGxhY2UoJ3tTRUVEfScsIHIpLnJlcGxhY2UoJ3tJTkRFWH0nLCBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3JlYWRDb29raWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYuY29va2llc0FyZUVuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICcnLmNvbmNhdChlLCAnPScpLCByID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JyksIG4gPSAwOyBuIDwgci5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSByW25dOyAnICcgPT09IGkuY2hhckF0KDApOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS5zdWJzdHJpbmcoMSwgaS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gaS5pbmRleE9mKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN1YnN0cmluZyh0Lmxlbmd0aCwgaS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZ2V0Q3JiRnJvbUNvb2tpZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHAuX3JlYWRDb29raWUoJ2tyZ19jcmInKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04ucGFyc2UoYXRvYihlLnYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRDcmJGcm9tTG9jYWxTdG9yYWdlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IocC5fZ2V0TG9jYWxTdG9yYWdlU2FmZWx5KCdrcmdfY3JiJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRDcmI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcC5fZ2V0Q3JiRnJvbUxvY2FsU3RvcmFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA/IGUgOiBwLl9nZXRDcmJGcm9tQ29va2llKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRLcnV4VXNlcklkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcC5fZ2V0TG9jYWxTdG9yYWdlU2FmZWx5KCdreGthcl91c2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9nZXRLcnV4U2VnbWVudHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLl9nZXRMb2NhbFN0b3JhZ2VTYWZlbHkoJ2t4a2FyX3NlZ3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2dldEtydXg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcC5fZ2V0S3J1eFNlZ21lbnRzKCksIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICh0ID0gZS5zcGxpdCgnLCcpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJRDogcC5fZ2V0S3J1eFVzZXJJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZ2V0TG9jYWxTdG9yYWdlU2FmZWx5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2dldFVzZXJJZHM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHAuX2dldENyYigpLCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrYXJnb0lEOiByLnVzZXJJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SUQ6IHIuY2xpZW50SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyYklEczogci5zeW5jSWRzIHx8IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRPdXQ6IHIub3B0T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3A6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKG4udGRJRCA9IGUpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZ2V0Q2xpZW50SWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLl9nZXRDcmIoKS5jbGllbnRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2dldEFsbE1ldGFkYXRhOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySURzOiBwLl9nZXRVc2VySWRzKGUsIHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtydXg6IHAuX2dldEtydXgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVVJMOiB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDUkI6IHAuX3JlYWRDb29raWUoJ2tyZ19jcmInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDUkJMb2NhbFN0b3JhZ2U6IHAuX2dldExvY2FsU3RvcmFnZVNhZmVseSgna3JnX2NyYicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZ2V0U2Vzc2lvbklkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyB8fCAoYyA9IHAuX2dlbmVyYXRlUmFuZG9tVXVpZCgpKSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2dldFJlcXVlc3RDb3VudDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPT09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA/ICsrbCA6IChkID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBsID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9nZW5lcmF0ZVJhbmRvbVV1aWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgVWludDhBcnJheSgxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSwgZVs2XSA9IC0xNzcgJiBlWzZdIHwgNjQsIGVbOF0gPSAtNjUgJiBlWzhdIHwgMTI4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKG5ldyBVaW50OEFycmF5KGUpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCcwMCcgKyBlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNsaWNlKDAsIDgpICsgJy0nICsgdC5zbGljZSg4LCAxMikgKyAnLScgKyB0LnNsaWNlKDEyLCAxNikgKyAnLScgKyB0LnNsaWNlKDE2LCAyMCkgKyAnLScgKyB0LnNsaWNlKDIwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdC5zcGVjID0gcCwgKDAsIGEucmVnaXN0ZXJCaWRkZXIpKHApOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgcigzMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnNwZWMgPSB2b2lkIDAsIHIoMjYpLCByKDExKSwgcig2KSwgcigxMyksIHIoNCksIHIoMiksIHIoMTYpLCByKDE1MyksIHIoMzkzKSwgcig0MyksIHIoOSksIHIoMzMpLCByKDEpLCByKDMpLCByKDApLCByKDUpOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDc2KSwgaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT09IG0oZSkgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LmhhcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIG4gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBpKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAoby5nZXQgfHwgby5zZXQpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIGksIG8pIDogcltpXSA9IGVbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5kZWZhdWx0ID0gZSwgdCAmJiB0LnNldChlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfShyKDcpKSwgbyA9IHIoMjIpLCBhID0gcig0OSksIHMgPSByKDQ1KSwgdSA9IHIoMTI3KSwgYyA9IHAocigzNykpLCBkID0gcChyKDMxKSksIGwgPSByKDE1NiksIGYgPSByKDc1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7IGRlZmF1bHQ6IGUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIFdlYWtNYXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFdlYWtNYXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSByICYmIGUuY29uc3RydWN0b3IgJiYgKHIgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHIgfHwgJ1NldCcgPT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gciB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBuID0gbmV3IEFycmF5KHQpOyByIDwgdDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBoID0gJ2h0dHBzOi8vaWIuYWRueHMuY29tL3V0L3YzL3ByZWJpZCcsIFMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdtaW5kdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdtYXhkdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdza2lwcGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAncGxheWJhY2tfbWV0aG9kJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyYW1ld29ya3MnLAogICAgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdza2lwb2Zmc2V0JwogICAgICAgICAgICAgICAgICAgIF0sIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZXJuYWxVaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2VnbWVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZ2VuZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZScKICAgICAgICAgICAgICAgICAgICBdLCBfID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnZ2VvJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RldmljZV9pZCcKICAgICAgICAgICAgICAgICAgICBdLCBFID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdkb25nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbWVtYmVyX2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlYnVnX3RpbWVvdXQnCiAgICAgICAgICAgICAgICAgICAgXSwgSSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfbWV0aG9kOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX29uOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX29mZjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrX3RvX3BsYXk6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZV9vdmVyOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX3Vua25vd246IDUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9yb2xsOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkX3JvbGw6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3JvbGw6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW06IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW4tYmFubmVyJzogNQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogJ2Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTI6ICdkZXNjMicsCiAgICAgICAgICAgICAgICAgICAgICAgIGN0YTogJ2N0YXRleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZTogJ21haW5faW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbXM6IHsgcmVxdWlyZWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZTogJ2ljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbXM6IHsgcmVxdWlyZWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc3BvbnNvcmVkQnk6ICdzcG9uc29yZWRfYnknLAogICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5TGluazogJ3ByaXZhY3lfbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogJ3NhbGVwcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlVcmw6ICdkaXNwbGF5dXJsJwogICAgICAgICAgICAgICAgICAgIH0sIEEgPSAvXC9cL2NkblwuYWRueHNcLmNvbVwvdi8sIFQgPSAoMCwgZi5nZXRTdG9yYWdlTWFuYWdlcikoMzIsICdhcHBuZXh1cycpLCB4ID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnYXBwbmV4dXMnLAogICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogMzIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnYXBwbmV4dXNBc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiAzMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ2JyZWFsdGltZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnZW14ZGlnaXRhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDE4MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ3BhZ2VzY2llbmNlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2RlOiAnZGVmeW1lZGlhJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2RlOiAnZ291cm1ldGFkcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ21hdG9teScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ2ZlYXR1cmVmb3J3YXJkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjb2RlOiAnb2Z0bWVkaWEnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2Rpc3RyaWN0bScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDE0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ2FkYXN0YScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnYmVpbnRvbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDYxOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLkJBTk5FUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuVklERU8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLk5BVElWRQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIShlLnBhcmFtcy5wbGFjZW1lbnRJZCB8fCBlLnBhcmFtcy5tZW1iZXIgJiYgZS5wYXJhbXMuaW52Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUubWFwKFIpLCBuID0gKDAsIGMuZGVmYXVsdCkoZSwgayksIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSBvLmNvbmZpZy5nZXRDb25maWcoJ2NvcHBhJykgJiYgKGEgPSB7IGNvcHBhOiAhMCB9KSwgbiAmJiBPYmplY3Qua2V5cyhuLnBhcmFtcy51c2VyKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIGQuZGVmYXVsdCkoTywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpLmNvbnZlcnRDYW1lbFRvVW5kZXJzY29yZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NlZ21lbnRzJyA9PT0gZSAmJiBpLmlzQXJyYXkobi5wYXJhbXMudXNlcltlXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wYXJhbXMudXNlcltlXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmlzTnVtYmVyKGUpID8gci5wdXNoKHsgaWQ6IGUgfSkgOiBpLmlzUGxhaW5PYmplY3QoZSkgJiYgci5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYVt0XSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlZ21lbnRzJyAhPT0gZSAmJiAoYVt0XSA9IG4ucGFyYW1zLnVzZXJbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIHUgPSAoMCwgYy5kZWZhdWx0KShlLCBNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgJiYgdS5wYXJhbXMgJiYgdS5wYXJhbXMuYXBwICYmIChzID0ge30sIE9iamVjdC5rZXlzKHUucGFyYW1zLmFwcCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwLCBkLmRlZmF1bHQpKF8sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2VdID0gdS5wYXJhbXMuYXBwW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwsIGYgPSAoMCwgYy5kZWZhdWx0KShlLCBVKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgZi5wYXJhbXMgJiYgdS5wYXJhbXMuYXBwICYmIHUucGFyYW1zLmFwcC5pZCAmJiAobCA9IHsgYXBwaWQ6IGYucGFyYW1zLmFwcC5pZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0ge30sIGcgPSB7fSwgbSA9IFQuZ2V0Q29va2llKCdhcG5fcHJlYmlkX2RlYnVnJykgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IEpTT04ucGFyc2UobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ0Vycm9yKCdBcHBOZXh1cyBEZWJ1ZyBBdWN0aW9uIENvb2tpZSBFcnJvcjpcblxuJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSAoMCwgYy5kZWZhdWx0KShlLCBCKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICYmIHYuZGVidWcgJiYgKHAgPSB2LmRlYnVnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgJiYgcC5lbmFibGVkICYmIE9iamVjdC5rZXlzKHApLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZC5kZWZhdWx0KShFLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnW2VdID0gcFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSAoMCwgYy5kZWZhdWx0KShlLCBOKSwgUyA9IHkgPyBwYXJzZUludCh5LnBhcmFtcy5tZW1iZXIsIDEwKSA6IDAsIEkgPSBlWzBdLnNjaGFpbiwgdyA9ICgwLCBjLmRlZmF1bHQpKGUsIHopLCBBID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzOiBiKHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGs6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3BianMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzQuMjYuMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoYWluOiBJCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ICYmIChBLmlhYl9zdXBwb3J0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbWlkcG46ICdBcHBuZXh1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taWRwdjogJzQuMjYuMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgUyA+IDAgJiYgKEEubWVtYmVyX2lkID0gUyksIHUgJiYgKEEuZGV2aWNlID0gcyksIGYgJiYgKEEuYXBwID0gbCksIG8uY29uZmlnLmdldENvbmZpZygnYWRwb2QuYnJhbmRDYXRlZ29yeUV4Y2x1c2lvbicpICYmIChBLmJyYW5kX2NhdGVnb3J5X3VuaXF1ZW5lc3MgPSAhMCksIGcuZW5hYmxlZCAmJiAoQS5kZWJ1ZyA9IGcsIGkubG9nSW5mbygnQXBwTmV4dXMgRGVidWcgQXVjdGlvbiBTZXR0aW5nczpcblxuJyArIEpTT04uc3RyaW5naWZ5KGcsIG51bGwsIDQpKSksIHQgJiYgdC5nZHByQ29uc2VudCAmJiAoQS5nZHByX2NvbnNlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRfc3RyaW5nOiB0LmdkcHJDb25zZW50LmNvbnNlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRfcmVxdWlyZWQ6IHQuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCAmJiB0LnVzcENvbnNlbnQgJiYgKEEudXNfcHJpdmFjeSA9IHQudXNwQ29uc2VudCksIHQgJiYgdC5yZWZlcmVySW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF9yZWY6IGVuY29kZVVSSUNvbXBvbmVudCh0LnJlZmVyZXJJbmZvLnJlZmVyZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF90b3A6IHQucmVmZXJlckluZm8ucmVhY2hlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRfaWZzOiB0LnJlZmVyZXJJbmZvLm51bUlmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkX3N0azogdC5yZWZlcmVySW5mby5zdGFjay5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS5yZWZlcnJlcl9kZXRlY3Rpb24gPSB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgwLCBjLmRlZmF1bHQpKGUsIEwpICYmIGUuZmlsdGVyKEwpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5tZWRpYVR5cGVzLnZpZGVvLCBuID0gci5kdXJhdGlvblJhbmdlU2VjLCBvID0gci5yZXF1aXJlRXhhY3REdXJhdGlvbiwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuYWRQb2REdXJhdGlvblNlYywgciA9IGUuZHVyYXRpb25SYW5nZVNlYywgbiA9IGUucmVxdWlyZUV4YWN0RHVyYXRpb24sIG8gPSBpLmdldE1pblZhbHVlRnJvbUFycmF5KHIpLCBhID0gTWF0aC5mbG9vcih0IC8gbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IE1hdGgubWF4KGEsIHIubGVuZ3RoKSA6IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5tZWRpYVR5cGVzLnZpZGVvKSwgcyA9IGkuZ2V0TWF4VmFsdWVGcm9tQXJyYXkobiksIHUgPSBlLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudXVpZCA9PT0gdC5iaWRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMgPSBpLmZpbGwuYXBwbHkoaSwgYih1KS5jb25jYXQoW2FdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBNYXRoLmNlaWwoYSAvIG4ubGVuZ3RoKSwgbCA9IGkuY2h1bmsoYywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZm9yRWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFt0XS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWKHQsICdtaW5kdXJhdGlvbicsIGUpLCBWKHQsICdtYXhkdXJhdGlvbicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVihlLCAnbWF4ZHVyYXRpb24nLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyLCBlKSwgbiA9IEEudGFncy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC51dWlkICE9PSBlLmJpZElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEudGFncyA9IFtdLmNvbmNhdChiKG4pLCBiKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZVswXS51c2VySWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcoQywgaS5kZWVwQWNjZXNzKGVbMF0sICd1c2VySWQuY3JpdGVvSWQnKSwgJ2NyaXRlby5jb20nLCBudWxsKSwgRyhDLCBpLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5uZXRJZCcpLCAnbmV0aWQuZGUnLCBudWxsKSwgRyhDLCBpLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5pZGxfZW52JyksICdsaXZlcmFtcC5jb20nLCBudWxsKSwgRyhDLCBpLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC50ZGlkJyksICdhZHNlcnZlci5vcmcnLCAnVERJRCcpLCBDLmxlbmd0aCAmJiAoQS5laWRzID0gQyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gclswXS5wdWJsaXNoZXJfaWQgJiYgKEEucHVibGlzaGVyX2lkID0gclswXS5wdWJsaXNoZXJfaWQpLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLmdkcHJDb25zZW50ICYmIGUuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMgJiYgMiA9PT0gZS5nZHByQ29uc2VudC5hcGlWZXJzaW9uICYmICh0ID0gISghMCAhPT0gaS5kZWVwQWNjZXNzKGUuZ2RwckNvbnNlbnQsICd2ZW5kb3JEYXRhLnB1cnBvc2UuY29uc2VudHMuMScpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgfHwgKG4gPSB7IHdpdGhDcmVkZW50aWFsczogITEgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUlVFJyAhPT0gaS5nZXRQYXJhbWV0ZXJCeU5hbWUoJ2Fwbl90ZXN0JykudG9VcHBlckNhc2UoKSAmJiAhMCAhPT0gby5jb25maWcuZ2V0Q29uZmlnKCdhcG5fdGVzdCcpIHx8IChuLmN1c3RvbUhlYWRlcnMgPSB7ICdYLUlzLVRlc3QnOiAxIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnRhZ3MubGVuZ3RoID4gMTUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpLmRlZXBDbG9uZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jaHVuayhlLnRhZ3MsIDE1KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnRhZ3MgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBKU09OLnN0cmluZ2lmeShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBKU09OLnN0cmluZ2lmeShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShBLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMsIG8gPSB0LmJpZGRlclJlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCBlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAnaW4gcmVzcG9uc2UgZm9yICcuY29uY2F0KG8uYmlkZGVyQ29kZSwgJyBhZGFwdGVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5lcnJvciAmJiAoZiArPSAnOiAnLmNvbmNhdChlLmVycm9yKSksIGkubG9nRXJyb3IoZiksIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YWdzICYmIGUudGFncy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBmID0gKHQgPSBlKSAmJiB0LmFkcyAmJiB0LmFkcy5sZW5ndGggJiYgKDAsIGMuZGVmYXVsdCkodC5hZHMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucnRiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmICYmIDAgIT09IGYuY3BtICYmICgwLCBkLmRlZmF1bHQpKHIuc3VwcG9ydGVkTWVkaWFUeXBlcywgZi5hZF90eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gaS5nZXRCaWRSZXF1ZXN0KGUudXVpZCwgW3JdKSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogZS51dWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0LmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHQuY3JlYXRpdmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsSWQ6IHQuZGVhbF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldFJldmVudWU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBvLmFkVW5pdENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBuZXh1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1eWVyTWVtYmVySWQ6IHQuYnV5ZXJfbWVtYmVyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxQcmlvcml0eTogdC5kZWFsX3ByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxDb2RlOiB0LmRlYWxfY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWR2ZXJ0aXNlcl9pZCAmJiAodS5tZXRhID0gdih7fSwgdS5tZXRhLCB7IGFkdmVydGlzZXJJZDogdC5hZHZlcnRpc2VyX2lkIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5ydGIudmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh2KHUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC5ydGIudmlkZW8ucGxheWVyX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5ydGIudmlkZW8ucGxheWVyX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0SW1wVXJsOiB0Lm5vdGlmeV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzNjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5kZWVwQWNjZXNzKG8sICdtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuQURQT0Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICgwLCBhLmdldElhYlN1YkNhdGVnb3J5KShvLmJpZGRlciwgdC5icmFuZF9jYXRlZ29yeV9pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Lm1ldGEgPSB2KHt9LCB1Lm1ldGEsIHsgcHJpbWFyeUNhdElkOiBkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0LmRlYWxfcHJpb3JpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnZpZGVvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHMuQURQT0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25TZWNvbmRzOiBNYXRoLmZsb29yKHQucnRiLnZpZGVvLmR1cmF0aW9uX21zIC8gMTAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbFRpZXI6IGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUudmFzdFVybCA9IHQucnRiLnZpZGVvLmFzc2V0X3VybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGwuT1VUU1RSRUFNOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUuYWRSZXNwb25zZSA9IGUsIHUuYWRSZXNwb25zZS5hZCA9IHUuYWRSZXNwb25zZS5hZHNbMF0sIHUuYWRSZXNwb25zZS5hZC52aWRlbyA9IHUuYWRSZXNwb25zZS5hZC5ydGIudmlkZW8sIHUudmFzdFhtbCA9IHQucnRiLnZpZGVvLmNvbnRlbnQsIHQucmVuZGVyZXJfdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAoMCwgYy5kZWZhdWx0KShyLmJpZHMsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaWRJZCA9PT0gZS51dWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZyA9IGkuZGVlcEFjY2VzcyhwLCAncmVuZGVyZXIub3B0aW9ucycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucmVuZGVyZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDoge30sIG8gPSBuLlJlbmRlcmVyLmluc3RhbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LnJlbmRlcmVyX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5yZW5kZXJlcl91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnNldFJlbmRlcihGKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2dXYXJuKCdQcmViaWQgRXJyb3IgY2FsbGluZyBzZXRSZW5kZXIgb24gcmVuZGVyZXInLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5zZXRFdmVudEhhbmRsZXJzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5sb2dNZXNzYWdlKCdBcHBOZXh1cyBvdXRzdHJlYW0gdmlkZW8gaW1wcmVzc2lvbiBldmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxvZ01lc3NhZ2UoJ0FwcE5leHVzIG91dHN0cmVhbSB2aWRlbyBsb2FkZWQgZXZlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nTWVzc2FnZSgnQXBwTmV4dXMgb3V0c3RyZWFtIHJlbmRlcmVyIHZpZGVvIGV2ZW50JyksIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnLmNvbmNhdChlKSkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh1LmFkVW5pdENvZGUsIHQsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbC5JTlNUUkVBTToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUudmFzdFVybCA9IHQubm90aWZ5X3VybCArICcmcmVkaXI9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0LnJ0Yi52aWRlby5hc3NldF91cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0LnJ0YltzLk5BVElWRV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSB0LnJ0YltzLk5BVElWRV0sIGIgPSB0LnZpZXdhYmlsaXR5LmNvbmZpZy5yZXBsYWNlKCdzcmM9JywgJ2RhdGEtc3JjPScpLCB5ID0gbS5qYXZhc2NyaXB0X3RyYWNrZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IHkgPyB5ID0gYiA6IGkuaXNTdHIoeSkgPyB5ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IHkucHVzaChiKSwgdVtzLk5BVElWRV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbS50aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IG0uZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkyOiBtLmRlc2MyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhOiBtLmN0YXRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpbmc6IG0ucmF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BvbnNvcmVkQnk6IG0uc3BvbnNvcmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmFjeUxpbms6IG0ucHJpdmFjeV9saW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogbS5hZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRzOiBtLmRvd25sb2FkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2VzOiBtLmxpa2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmU6IG0ucGhvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogbS5wcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogbS5zYWxlcHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1VybDogbS5saW5rLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlVcmw6IG0uZGlzcGxheXVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVHJhY2tlcnM6IG0ubGluay5jbGlja190cmFja2VycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25UcmFja2VyczogbS5pbXByZXNzaW9uX3RyYWNrZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdFRyYWNrZXJzOiB5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG0ubWFpbl9pbWcgJiYgKHUubmF0aXZlLmltYWdlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtLm1haW5faW1nLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbS5tYWluX2ltZy5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbS5tYWluX2ltZy53aWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbS5pY29uICYmICh1Lm5hdGl2ZS5pY29uID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBtLmljb24udXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtLmljb24uaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG0uaWNvbi53aWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KHUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0LnJ0Yi5iYW5uZXIud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQucnRiLmJhbm5lci5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZDogdC5ydGIuYmFubmVyLmNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5ydGIudHJhY2tlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHQucnRiLnRyYWNrZXJzWzBdLmltcHJlc3Npb25fdXJsc1swXSwgUyA9IGkuY3JlYXRlVHJhY2tQaXhlbEh0bWwoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5hZCArPSBTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ0Vycm9yKCdFcnJvciBhcHBlbmRpbmcgdHJhY2tpbmcgcGl4ZWwnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgZiwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLm1lZGlhVHlwZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmFkX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHMuVklERU8gPyBzLlZJREVPIDogdCA9PT0gcy5OQVRJVkUgPyBzLk5BVElWRSA6IHMuQkFOTkVSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShmKSwgdS5wdXNoKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuZGVidWcgJiYgZS5kZWJ1Zy5kZWJ1Z19pbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAnQXBwTmV4dXMgRGVidWcgQXVjdGlvbiBmb3IgUHJlYmlkXG5cbicgKyBlLmRlYnVnLmRlYnVnX2luZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAucmVwbGFjZSgvKDx0ZD58PHRoPikvZ20sICdcdCcpLnJlcGxhY2UoLyg8XC90ZD58PFwvdGg+KS9nbSwgJ1xuJykucmVwbGFjZSgvXjxicj4vZ20sICcnKS5yZXBsYWNlKC8oPGJyPlxufDxicj4pL2dtLCAnXG4nKS5yZXBsYWNlKC88aDE+KC4qKTxcL2gxPi9nbSwgJ1xuXG49PT09PSAkMSA9PT09PVxuXG4nKS5yZXBsYWNlKC88aFsyLTZdPiguKik8XC9oWzItNl0+L2dtLCAnXG5cbioqKiAkMSAqKipcblxuJykucmVwbGFjZSgvKDwoW14+XSspPikvZ2ltLCAnJyksIGkubG9nTWVzc2FnZSgnaHR0cHM6Ly9jb25zb2xlLmFwcG5leHVzLmNvbS9kb2NzL3VuZGVyc3RhbmRpbmctdGhlLWRlYnVnLWF1Y3Rpb24nKSwgaS5sb2dNZXNzYWdlKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1hcHBpbmdGaWxlSW5mbzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2FjZG4uYWRueHMuY29tL3ByZWJpZC9hcHBuZXh1cy1tYXBwaW5nL21hcHBpbmdzLmpzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hJbkRheXM6IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlmcmFtZUVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hY2RuLmFkbnhzLmNvbS9kbXAvYXN5bmNfdXNlcnN5bmMuaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJpZFBhcmFtczogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gaS5jb252ZXJ0VHlwZXMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcjogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52Q29kZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50SWQ6ICdudW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiBpLnRyYW5zZm9ybUJpZGRlclBhcmFtS2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVySWQ6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgdCAmJiAoZS51c2VfcG10X3J1bGUgPSAnYm9vbGVhbicgPT0gdHlwZW9mIGUudXNlUGF5bWVudFJ1bGUgJiYgZS51c2VQYXltZW50UnVsZSwgZS51c2VQYXltZW50UnVsZSAmJiBkZWxldGUgZS51c2VQYXltZW50UnVsZSwgQyhlLmtleXdvcmRzKSAmJiBlLmtleXdvcmRzLmZvckVhY2goUCksIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkuY29udmVydENhbWVsVG9VbmRlcnNjb3JlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgIT09IHQgJiYgKGVbcl0gPSBlW3RdLCBkZWxldGUgZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9uQmlkV29uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uYXRpdmUgJiYgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5pc1N0cihlKSAmJiBqKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpLmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKG4pICYmICh0ID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLm5hdGl2ZS5qYXZhc2NyaXB0VHJhY2tlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAncGJqc19hZGlkPScgKyBlLmFkSWQgKyAnO3BianNfYXVjPScgKyBlLmFkVW5pdENvZGUsIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaW5kZXhPZignc3JjPSInKSArIDUsIHIgPSBlLmluZGV4T2YoJyInLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3Vic3RyaW5nKHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCksIG8gPSBuLnJlcGxhY2UoJ2RvbV9pZD0lbmF0aXZlX2RvbV9pZCUnLCByKSwgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZnJhbWUnKSwgcyA9ICExLCB1ID0gMDsgdSA8IGEubGVuZ3RoICYmICFzOyB1KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYVt1XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBjLmNvbnRlbnREb2N1bWVudCB8fCBjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpLCBmID0gMDsgZiA8IGwubGVuZ3RoICYmICFzOyBmKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbFtmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpID09IG4gJiYgKHAuc2V0QXR0cmlidXRlKCdzcmMnLCBvKSwgcC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjJywgJycpLCBwLnJlbW92ZUF0dHJpYnV0ZSAmJiBwLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1zcmMnKSwgcyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmICdTZWN1cml0eUVycm9yJyA9PT0gZS5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKGkuaXNBcnJheShlKSAmJiBlLmxlbmd0aCA+IDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUChlKSB7CiAgICAgICAgICAgICAgICAgICAgQyhlLnZhbHVlKSAmJiAnJyA9PT0gZS52YWx1ZVswXSAmJiBkZWxldGUgZS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5tYXRjaChBKSwgciA9IG51bGwgIT0gdCAmJiB0Lmxlbmd0aCA+PSAxLCBuID0gZS5tYXRjaCgndHJrLmpzJyksIGkgPSBudWxsICE9IG4gJiYgbi5sZW5ndGggPj0gMTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdGFydHNXaXRoKCc8c2NyaXB0JykgJiYgaSAmJiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAobi5zaXplcyA9IEQoZS5zaXplcyksIG4ucHJpbWFyeV9zaXplID0gbi5zaXplc1swXSwgbi5hZF90eXBlcyA9IFtdLCBuLnV1aWQgPSBlLmJpZElkLCBlLnBhcmFtcy5wbGFjZW1lbnRJZCA/IG4uaWQgPSBwYXJzZUludChlLnBhcmFtcy5wbGFjZW1lbnRJZCwgMTApIDogbi5jb2RlID0gZS5wYXJhbXMuaW52Q29kZSwgbi5hbGxvd19zbWFsbGVyX3NpemVzID0gZS5wYXJhbXMuYWxsb3dTbWFsbGVyU2l6ZXMgfHwgITEsIG4udXNlX3BtdF9ydWxlID0gZS5wYXJhbXMudXNlUGF5bWVudFJ1bGUgfHwgITEsIG4ucHJlYmlkID0gITAsIG4uZGlzYWJsZV9wc2EgPSAhMCwgZS5wYXJhbXMucmVzZXJ2ZSAmJiAobi5yZXNlcnZlID0gZS5wYXJhbXMucmVzZXJ2ZSksIGUucGFyYW1zLnBvc2l0aW9uICYmIChuLnBvc2l0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdzogMgogICAgICAgICAgICAgICAgICAgICAgICB9W2UucGFyYW1zLnBvc2l0aW9uXSB8fCAwKSwgZS5wYXJhbXMudHJhZmZpY1NvdXJjZUNvZGUgJiYgKG4udHJhZmZpY19zb3VyY2VfY29kZSA9IGUucGFyYW1zLnRyYWZmaWNTb3VyY2VDb2RlKSwgZS5wYXJhbXMucHJpdmF0ZVNpemVzICYmIChuLnByaXZhdGVfc2l6ZXMgPSBEKGUucGFyYW1zLnByaXZhdGVTaXplcykpLCBlLnBhcmFtcy5zdXBwbHlUeXBlICYmIChuLnN1cHBseV90eXBlID0gZS5wYXJhbXMuc3VwcGx5VHlwZSksIGUucGFyYW1zLnB1YkNsaWNrICYmIChuLnB1YmNsaWNrID0gZS5wYXJhbXMucHViQ2xpY2spLCBlLnBhcmFtcy5leHRJbnZDb2RlICYmIChuLmV4dF9pbnZfY29kZSA9IGUucGFyYW1zLmV4dEludkNvZGUpLCBlLnBhcmFtcy5wdWJsaXNoZXJJZCAmJiAobi5wdWJsaXNoZXJfaWQgPSBwYXJzZUludChlLnBhcmFtcy5wdWJsaXNoZXJJZCwgMTApKSwgZS5wYXJhbXMuZXh0ZXJuYWxJbXBJZCAmJiAobi5leHRlcm5hbF9pbXBfaWQgPSBlLnBhcmFtcy5leHRlcm5hbEltcElkKSwgIWkuaXNFbXB0eShlLnBhcmFtcy5rZXl3b3JkcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBpLnRyYW5zZm9ybUJpZGRlclBhcmFtS2V5d29yZHMoZS5wYXJhbXMua2V5d29yZHMpOwogICAgICAgICAgICAgICAgICAgICAgICBvLmxlbmd0aCA+IDAgJiYgby5mb3JFYWNoKFApLCBuLmtleXdvcmRzID0gbzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKChlLm1lZGlhVHlwZSA9PT0gcy5OQVRJVkUgfHwgaS5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLicuY29uY2F0KHMuTkFUSVZFKSkpICYmIChuLmFkX3R5cGVzLnB1c2gocy5OQVRJVkUpLCAwID09PSBuLnNpemVzLmxlbmd0aCAmJiAobi5zaXplcyA9IEQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgXSkpLCBlLm5hdGl2ZVBhcmFtcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAodCA9IGUubmF0aXZlUGFyYW1zLCByID0ge30sIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gd1tlXSAmJiB3W2VdLnNlcnZlck5hbWUgfHwgd1tlXSB8fCBlLCBvID0gd1tlXSAmJiB3W2VdLnJlcXVpcmVkUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJbbl0gPSB2KHt9LCBvLCB0W2VdKSwgKG4gPT09IHcuaW1hZ2Uuc2VydmVyTmFtZSB8fCBuID09PSB3Lmljb24uc2VydmVyTmFtZSkgJiYgcltuXS5zaXplcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcltuXS5zaXplczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5pc0FycmF5T2ZOdW1zKGEpIHx8IGkuaXNBcnJheShhKSAmJiBhLmxlbmd0aCA+IDAgJiYgYS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pc0FycmF5T2ZOdW1zKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSAmJiAocltuXS5zaXplcyA9IEQocltuXS5zaXplcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PT0gdy5wcml2YWN5TGluayAmJiAoci5wcml2YWN5X3N1cHBvcnRlZCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIpOwogICAgICAgICAgICAgICAgICAgICAgICBuW3MuTkFUSVZFXSA9IHsgbGF5b3V0czogW2FdIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBsID0gaS5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLicuY29uY2F0KHMuVklERU8pKSwgZiA9IGkuZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy52aWRlby5jb250ZXh0Jyk7CiAgICAgICAgICAgICAgICAgICAgbi5oYl9zb3VyY2UgPSBsICYmICdhZHBvZCcgPT09IGYgPyA3IDogMSwgKGUubWVkaWFUeXBlID09PSBzLlZJREVPIHx8IGwpICYmIG4uYWRfdHlwZXMucHVzaChzLlZJREVPKSwgKGUubWVkaWFUeXBlID09PSBzLlZJREVPIHx8IGwgJiYgJ291dHN0cmVhbScgIT09IGYpICYmIChuLnJlcXVpcmVfYXNzZXRfdXJsID0gITApLCBlLnBhcmFtcy52aWRlbyAmJiAobi52aWRlbyA9IHt9LCBPYmplY3Qua2V5cyhlLnBhcmFtcy52aWRlbykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCwgZC5kZWZhdWx0KShTLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb250ZXh0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncGxheWJhY2tfbWV0aG9kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wYXJhbXMudmlkZW9bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gaS5pc0FycmF5KHIpID8gclswXSA6IHIsIG4udmlkZW9bdF0gPSBJW3RdW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZyYW1ld29ya3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnZpZGVvW3RdID0gZS5wYXJhbXMudmlkZW9bdF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZS5wYXJhbXMudmlkZW8uZnJhbWV3b3JrcyAmJiBpLmlzQXJyYXkoZS5wYXJhbXMudmlkZW8uZnJhbWV3b3JrcykgJiYgKG4udmlkZW9fZnJhbWV3b3JrcyA9IGUucGFyYW1zLnZpZGVvLmZyYW1ld29ya3MpKSwgZS5yZW5kZXJlciAmJiAobi52aWRlbyA9IHYoe30sIG4udmlkZW8sIHsgY3VzdG9tX3JlbmRlcmVyX3ByZXNlbnQ6ICEwIH0pKSwgZS5wYXJhbXMuZnJhbWV3b3JrcyAmJiBpLmlzQXJyYXkoZS5wYXJhbXMuZnJhbWV3b3JrcykgJiYgKG4uYmFubmVyX2ZyYW1ld29ya3MgPSBlLnBhcmFtcy5mcmFtZXdvcmtzKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcCA9ICgwLCBjLmRlZmF1bHQpKHUuYXVjdGlvbk1hbmFnZXIuZ2V0QWRVbml0cygpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmFuc2FjdGlvbklkID09PSB0LnRyYW5zYWN0aW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgJiYgcC5tZWRpYVR5cGVzICYmIHAubWVkaWFUeXBlcy5iYW5uZXIgJiYgbi5hZF90eXBlcy5wdXNoKHMuQkFOTkVSKSwgMCA9PT0gbi5hZF90eXBlcy5sZW5ndGggJiYgZGVsZXRlIG4uYWRfdHlwZXMsIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdLCByID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKGkuaXNBcnJheShlKSAmJiAyID09PSBlLmxlbmd0aCAmJiAhaS5pc0FycmF5KGVbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIud2lkdGggPSBwYXJzZUludChlWzBdLCAxMCksIHIuaGVpZ2h0ID0gcGFyc2VJbnQoZVsxXSwgMTApLCB0LnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnb2JqZWN0JyA9PT0gbShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyID0ge30pLndpZHRoID0gcGFyc2VJbnQob1swXSwgMTApLCByLmhlaWdodCA9IHBhcnNlSW50KG9bMV0sIDEwKSwgdC5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZS5wYXJhbXMudXNlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcnNlSW50KGUucGFyYW1zLm1lbWJlciwgMTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUucGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUucGFyYW1zLmFwcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJhbXMgJiYgZS5wYXJhbXMuYXBwID8gISFlLnBhcmFtcy5hcHAuaWQgOiAhIWUucGFyYW1zLmFwcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUuZGVidWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tZWRpYVR5cGVzICYmIGUubWVkaWFUeXBlcy52aWRlbyAmJiBlLm1lZGlhVHlwZXMudmlkZW8uY29udGV4dCA9PT0gcy5BRFBPRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITEsIHIgPSBlLnBhcmFtcywgbiA9IGUucGFyYW1zLnZpZGVvOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZyYW1ld29ya3MgJiYgaS5pc0FycmF5KHIuZnJhbWV3b3JrcykgJiYgKHQgPSAoMCwgZC5kZWZhdWx0KShlLnBhcmFtcy5mcmFtZXdvcmtzLCA2KSksICF0ICYmIG4gJiYgbi5mcmFtZXdvcmtzICYmIGkuaXNBcnJheShuLmZyYW1ld29ya3MpICYmICh0ID0gKDAsIGQuZGVmYXVsdCkoZS5wYXJhbXMudmlkZW8uZnJhbWV3b3JrcywgNikpLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVihlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaS5pc0VtcHR5KGUudmlkZW8pICYmIChlLnZpZGVvID0ge30pLCBlLnZpZGVvW3RdID0gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByOwogICAgICAgICAgICAgICAgICAgIHQgPSBlLmFkVW5pdENvZGUsIChyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCkucXVlcnlTZWxlY3RvckFsbCgnZGl2W2lkXj1cJ2dvb2dsZV9hZHNcJ10nKSlbMF0gJiYgclswXS5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdub25lJyksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGUpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtpZF49XCdzYXNfc2NyaXB0XCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzBdLm5leHRTaWJsaW5nICYmICdpZnJhbWUnID09PSB0WzBdLm5leHRTaWJsaW5nLmxvY2FsTmFtZSAmJiB0WzBdLm5leHRTaWJsaW5nLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlLmFkVW5pdENvZGUpLCBlLnJlbmRlcmVyLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuQU5PdXRzdHJlYW1WaWRlby5yZW5kZXJBZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdJZDogZS5hZFJlc3BvbnNlLnRhZ19pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBbZS5nZXRTaXplKCkuc3BsaXQoJ3gnKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZDogZS5hZFVuaXRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogZS5hZFJlc3BvbnNlLnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFJlc3BvbnNlOiBlLmFkUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlck9wdGlvbnM6IGUucmVuZGVyZXIuZ2V0Q29uZmlnKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcS5iaW5kKG51bGwsIGUpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgIGUucmVuZGVyZXIuaGFuZGxlVmlkZW9FdmVudCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6IHIKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEcoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIChuID8gZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiByLAogICAgICAgICAgICAgICAgICAgICAgICBpZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgcnRpX3BhcnRuZXI6IG4KICAgICAgICAgICAgICAgICAgICB9KSA6IGUucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQKICAgICAgICAgICAgICAgICAgICB9KSksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnNwZWMgPSB4LCAoMCwgYS5yZWdpc3RlckJpZGRlcikoeCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgbiA9IHIoMTQpLCBpID0gcigzOCksIG8gPSByKDE3MCksIGEgPSAnJy5zdGFydHNXaXRoOwogICAgICAgICAgICAgICAgbihuLlAgKyBuLkYgKiByKDE3MSkoJ3N0YXJ0c1dpdGgnKSwgJ1N0cmluZycsIHsKICAgICAgICAgICAgICAgICAgICBzdGFydHNXaXRoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG8odGhpcywgZSwgJ3N0YXJ0c1dpdGgnKSwgciA9IGkoTWF0aC5taW4oYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDAsIHQubGVuZ3RoKSksIG4gPSBTdHJpbmcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID8gYS5jYWxsKHQsIG4sIHIpIDogdC5zbGljZShyLCByICsgbi5sZW5ndGgpID09PSBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDUyKSwgaSA9IHIoMzk1KSwgbyA9IHIoMzk2KTsKICAgICAgICAgICAgICAgICgwLCBuLmluc3RhbnRpYXRlQmlkQmFycmVsKShpLCBvKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBkZnBQYXRoOiB7IHByb3BlcnR5OiAnbWV0YWNyaXRpYycgfSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXRpbmc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VhdHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb246IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXNzaW9uOiA0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBbm5vdGF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVDb2RlOiAnbWV0YWNyaXRpYycsCiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2OiAnQUl6YVN5RER4Vk9ZeEhEcW1VamoxLUV4YmRLcGVXZ1FHcmwxbWQ4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Q6ICdBSXphU3lBeEhMMU16em9jUG5DakVTQ1E0dENBNlZwdWo5RlFvNmsnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGR5bmFtaWNCaWRkZXJzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1Ymljb246IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pbmNsdWRlZCA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlSWQ6IHIuaXNNb2JpbGUoKSA/ICczNzg4NTYnIDogJzM3ODg1NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiAyMzM4NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gSlNPTi5wYXJzZSgnW3siY29kZSI6Im5hdl9hZF9vbW5pIiwic2l6ZXMiOltbNiw2XSxbNSw1XV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwiY29sbGFwc2VFbXB0eURpdiI6W3RydWVdLCJ0YXJnZXRpbmciOnsicG9zIjoibmF2In0sImJpZHMiOlt7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19XX0seyJjb2RlIjoibGVhZGVyX3BsdXNfdG9wIiwic2l6ZXMiOltbNzI4LDkwXSxbOTcwLDI1MF0sWzk3MCw2Nl1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sImNvbGxhcHNlRW1wdHlEaXYiOlt0cnVlXSwidGFyZ2V0aW5nIjp7InBvcyI6InRvcCJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF8xIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI4NiJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NDk5NCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODkzMyIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjcwIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODE3In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5ZDE4MDE3YTdhMTU4YzQwMTVmYjZkOWQwMDE1IiwicG9zIjoibWV0YWNyaXRpY19kdF85NzB4MjUwXzEifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMjg3In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTM0Iiwic2l6ZSI6Wzk3MCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjczIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODE1In19XX0seyJjb2RlIjoibGVhZGVyX3RvcCIsInNpemVzIjpbWzcyOCw5MF0sWzk3MCw2Nl0sWzcyOCw5MV1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sImNvbGxhcHNlRW1wdHlEaXYiOlt0cnVlXSwidGFyZ2V0aW5nIjp7InBvcyI6InRvcCJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF8yIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI4OCJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEyMiIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODkzNSIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njc2In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODA5In19XX0seyJjb2RlIjoibmF0aXZlX3RvcCIsInNpemVzIjpbWzExLDExXSwiZmx1aWQiXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJjb2xsYXBzZUVtcHR5RGl2IjpbdHJ1ZV0sInRhcmdldGluZyI6eyJwb3MiOiJ0b3AifSwiYmlkcyI6e319LHsiY29kZSI6Im1wdV9wbHVzX3RvcCIsInNpemVzIjpbWzMwMCwyNTBdLFszMDAsNjAwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6InRvcCJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzMwMHgyNTBfMSJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE2ODIyOTAifX0seyJiaWRkZXIiOiJhbWF6b24iLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InB1Ym1hdGljIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJydWJpY29uIiwicGFyYW1zIjp7InpvbmVJZCI6IjIwOTUxMjYiLCJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoic29ub2JpIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5MzciLCJzaXplIjpbMzAwLDI1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2ODIifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MTgifX0seyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzMwMHg2MDAifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMjkxIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTM4Iiwic2l6ZSI6WzMwMCw2MDBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjYyIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODEwIn19XX0seyJjb2RlIjoibXB1X2JvdHRvbSIsInNpemVzIjpbWzMwMCwyNTBdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoiYm90dG9tIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OWQxODAxN2E3YTE1OGM0MDE1ZmI2ZDlkMDAxNSIsInBvcyI6Im1ldGFjcml0aWNfZHRfMzAweDI1MF8yIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI5MiJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEyOCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODkzOSIsInNpemUiOlszMDAsMjUwXX19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjY2NSJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgxMiJ9fV19LHsiY29kZSI6ImxlYWRlcl9ib3R0b20iLCJzaXplcyI6W1s3MjgsOTBdLFs5NzAsMjUwXSxbOTcwLDY2XV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6ImJvdHRvbSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF80In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI5MyJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEzMCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0MCIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjY4In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODEzIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5ZDE4MDE3YTdhMTU4YzQwMTVmYjZkOWQwMDE1IiwicG9zIjoibWV0YWNyaXRpY19kdF85NzB4MjUwXzIifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMjk0In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTQxIiwic2l6ZSI6Wzk3MCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjcxIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODE0In19XX0seyJjb2RlIjoicmVjaXJjdWxhdGlvbl9hZCIsInNpemVzIjpbWzMwMCwyNDldXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJjb2xsYXBzZUVtcHR5RGl2IjpbdHJ1ZV0sInRhcmdldGluZyI6eyJwb3MiOiJyZWNpcmN1bGF0aW9uIn0sImJpZHMiOnt9fSx7ImNvZGUiOiJsZWFkZXJfbWlkZGxlIiwic2l6ZXMiOltbNzI4LDkwXSxbOTcwLDY2XSxbNzI4LDkzXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF81In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI5NiJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEzNCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0MyIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njc3In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODE2In19XX0seyJjb2RlIjoibGVhZGVyX21pZGRsZTIiLCJzaXplcyI6W1s3MjgsOTBdLFs5NzAsNjZdLFs3MjgsOTNdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoibWlkZGxlMiJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF82In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI5NyJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEzNiIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0NCIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjgwIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODIxIn19XX0seyJjb2RlIjoiaW5jb250ZW50X3BsdXNfdG9wIiwic2l6ZXMiOltbNzI4LDkwXSxbOTcwLDI1MF0sWzk3MCw2Nl0sWzUsNV1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sImNvbGxhcHNlRW1wdHlEaXYiOlt0cnVlXSwidGFyZ2V0aW5nIjp7InBvcyI6InRvcCJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5NjlkMTgwMTdhN2ExNThjNDAxNWZiNmQ5ZDAwMTUiLCJwb3MiOiJtZXRhY3JpdGljX2R0XzcyOHg5MF83In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjI5OCJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTEzOCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0NSIsInNpemUiOls3MjgsOTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjgzIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODE5In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5ZDE4MDE3YTdhMTU4YzQwMTVmYjZkOWQwMDE1IiwicG9zIjoibWV0YWNyaXRpY19kdF85NzB4MjUwXzQifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMjk5In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTQ2Iiwic2l6ZSI6Wzk3MCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njg2In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODIwIn19XX0seyJjb2RlIjoibW9iaWxlX25hdl9hZF9vbW5pIiwic2l6ZXMiOltbNiw2XSxbNSw1XV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwiY29sbGFwc2VFbXB0eURpdiI6W3RydWVdLCJ0YXJnZXRpbmciOnsicG9zIjoibmF2In0sImJpZHMiOlt7ImJpZGRlciI6ImthcmdvIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiX3dBS0tZYjJMcHEifX1dfSx7ImNvZGUiOiJtb2JpbGVfYmFubmVyX3RvcCIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwiY29sbGFwc2VFbXB0eURpdiI6W3RydWVdLCJ0YXJnZXRpbmciOnsicG9zIjoidG9wIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF8xIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjMwMCJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NDk5NiIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0NyIsInNpemUiOlszMDAsMjUwXX19LHsiYmlkZGVyIjoia2FyZ28iLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiJfbGlmSFhkMFZ0aCJ9fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2ODkifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MjMifX0seyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMyMHg1MF8xIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTg2NDM3MiJ9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk0OCIsInNpemUiOlszMjAsNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njc4In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODIyIn19XX0seyJjb2RlIjoibW9iaWxlX25hdGl2ZV90b3AiLCJzaXplcyI6W1sxMSwxMV0sImZsdWlkIl0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwiY29sbGFwc2VFbXB0eURpdiI6W3RydWVdLCJ0YXJnZXRpbmciOnsicG9zIjoidG9wIn0sImJpZHMiOnt9fSx7ImNvZGUiOiJtb2JpbGVfaW5jb250ZW50X3BsdXNfdG9wIiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF0sWzMyMCw0ODBdLFs1LDVdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJjb2xsYXBzZUVtcHR5RGl2IjpbdHJ1ZV0sInRhcmdldGluZyI6eyJwb3MiOiJ0b3AifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzIifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzAxIn19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQwIiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTQ5Iiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJrYXJnbyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6Il9saWZIWGQwVnRoIn19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjY4MSJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgyNSJ9fSx7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzIweDUwXzIifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0MzczIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTUwIiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2ODQifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MjYifX1dfSx7ImNvZGUiOiJtb2JpbGVfYmFubmVyX3BsdXNfbWlkZGxlIiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sInRhcmdldGluZyI6eyJwb3MiOiJtaWRkbGUifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzMifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzAyIn19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQyIiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTUxIiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJrYXJnbyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6Il9saWZIWGQwVnRoIn19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjY4NSJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgyNCJ9fSx7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzIweDUwXzMifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzc0In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTUyIiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2ODgifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MjcifX1dfSx7ImNvZGUiOiJtb2JpbGVfaW5jb250ZW50X3BsdXNfbWlkZGxlMiIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFs1LDVdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJjb2xsYXBzZUVtcHR5RGl2IjpbdHJ1ZV0sInRhcmdldGluZyI6eyJwb3MiOiJtaWRkbGUyIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF80In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjMwMyJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTI3NiIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk1MyIsInNpemUiOlszMDAsMjUwXX19LHsiYmlkZGVyIjoia2FyZ28iLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiJfbGlmSFhkMFZ0aCJ9fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2OTEifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MjgifX0seyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMyMHg1MF80In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTg2NDM3NSJ9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk1NCIsInNpemUiOlszMjAsNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njk0In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODI5In19XX0seyJjb2RlIjoibW9iaWxlX21wdV9iYW5uZXJfYm90dG9tIiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sInRhcmdldGluZyI6eyJwb3MiOiJib3R0b20ifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzUifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzA0In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ2IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTU1Iiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njk3In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODMwIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfNSJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE4NjQzNzYifX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NTYiLCJzaXplIjpbMzIwLDUwXX19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjcwMCJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgzMiJ9fV19LHsiY29kZSI6Im1vYmlsZV9nYWxsZXJ5X2Jhbm5lcl9wbHVzXzEiLCJzaXplcyI6W1szMDAsMjUwXSxbMzIwLDUwXSxbMzIwLDQ4MF1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sInRhcmdldGluZyI6eyJwb3MiOiJtaWRkbGUifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzYifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzA1In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTU3Iiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJrYXJnbyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6Il9saWZIWGQwVnRoIn19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjcwMyJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgzMSJ9fSx7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzIweDUwXzYifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzc3In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTU4Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2ODcifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MzMifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c18yIiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF0sWzMyMCw0ODBdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoibWlkZGxlIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF83In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjMwNiJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTE0OCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk1OSIsInNpemUiOlszMDAsMjUwXX19LHsiYmlkZGVyIjoia2FyZ28iLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiJfbGlmSFhkMFZ0aCJ9fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2OTAifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MzQifX0seyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMyMHg1MF83In19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTg2NDM3OCJ9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk2MCIsInNpemUiOlszMjAsNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NjkyIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODM1In19XX0seyJjb2RlIjoibW9iaWxlX2dhbGxlcnlfYmFubmVyX3BsdXNfMyIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfOCJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE2ODIzMDcifX0seyJiaWRkZXIiOiJhbWF6b24iLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InB1Ym1hdGljIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJydWJpY29uIiwicGFyYW1zIjp7InpvbmVJZCI6IjIwOTUxNDgiLCJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoic29ub2JpIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NjEiLCJzaXplIjpbMzAwLDI1MF19fSx7ImJpZGRlciI6ImthcmdvIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiX2xpZkhYZDBWdGgifX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2Njk1In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODM2In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfOCJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE4NjQzNzkifX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NjIiLCJzaXplIjpbMzIwLDUwXX19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjY5OCJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgzNyJ9fV19LHsiY29kZSI6Im1vYmlsZV9nYWxsZXJ5X2Jhbm5lcl9wbHVzXzQiLCJzaXplcyI6W1szMDAsMjUwXSxbMzIwLDUwXSxbMzIwLDQ4MF1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sInRhcmdldGluZyI6eyJwb3MiOiJtaWRkbGUifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzkifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzA4In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTYzIiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJrYXJnbyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6Il9saWZIWGQwVnRoIn19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjcwMSJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3NzgzOCJ9fSx7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzIweDUwXzkifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0MzgxIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTY0Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MDQifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4MzkifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c181Iiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF0sWzMyMCw0ODBdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoibWlkZGxlIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF8xMCJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE2ODIzMDkifX0seyJiaWRkZXIiOiJhbWF6b24iLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InB1Ym1hdGljIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJydWJpY29uIiwicGFyYW1zIjp7InpvbmVJZCI6IjIwOTUxNDgiLCJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoic29ub2JpIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NjUiLCJzaXplIjpbMzAwLDI1MF19fSx7ImJpZGRlciI6ImthcmdvIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiX2xpZkhYZDBWdGgifX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzA2In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODQwIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTAifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzg0In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTY2Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MDgifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NDEifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c182Iiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF0sWzMyMCw0ODBdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoibWlkZGxlIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF8xMSJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE2ODIzMTAifX0seyJiaWRkZXIiOiJhbWF6b24iLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InB1Ym1hdGljIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJydWJpY29uIiwicGFyYW1zIjp7InpvbmVJZCI6IjIwOTUxNDgiLCJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoic29ub2JpIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NjciLCJzaXplIjpbMzAwLDI1MF19fSx7ImJpZGRlciI6ImthcmdvIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiX2xpZkhYZDBWdGgifX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzExIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODQyIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTEifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzg3In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTY4Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2OTMifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NDMifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c183Iiwic2l6ZXMiOltbMzAwLDI1MF0sWzMyMCw1MF0sWzMyMCw0ODBdXSwiY2FjaGUiOmZhbHNlLCJhbGxvd2VkVHlwZXMiOnsiYmFubmVyIjp0cnVlLCJuYXRpdmUiOmZhbHNlLCJ2aWRlbyI6ZmFsc2V9LCJ0YXJnZXRpbmciOnsicG9zIjoibWlkZGxlIn0sImJpZHMiOlt7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzAweDI1MF8xMiJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE2ODIzMTEifX0seyJiaWRkZXIiOiJhbWF6b24iLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InB1Ym1hdGljIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJydWJpY29uIiwicGFyYW1zIjp7InpvbmVJZCI6IjIwOTUxNDgiLCJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoic29ub2JpIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NjkiLCJzaXplIjpbMzAwLDI1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY2OTYifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NDQifX0seyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMyMHg1MF8xMiJ9fSx7ImJpZGRlciI6ImFwcG5leHVzIiwicGFyYW1zIjp7InBsYWNlbWVudElkIjoiMjE4NjQzODgifX0seyJiaWRkZXIiOiJpeCIsInBhcmFtcyI6eyJzaXRlSWQiOiI2Nzg5NzAiLCJzaXplIjpbMzIwLDUwXX19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjY5OSJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3Nzg0NSJ9fV19LHsiY29kZSI6Im1vYmlsZV9nYWxsZXJ5X2Jhbm5lcl9wbHVzXzgiLCJzaXplcyI6W1szMDAsMjUwXSxbMzIwLDUwXSxbMzIwLDQ4MF1dLCJjYWNoZSI6ZmFsc2UsImFsbG93ZWRUeXBlcyI6eyJiYW5uZXIiOnRydWUsIm5hdGl2ZSI6ZmFsc2UsInZpZGVvIjpmYWxzZX0sInRhcmdldGluZyI6eyJwb3MiOiJtaWRkbGUifSwiYmlkcyI6W3siYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMDB4MjUwXzEzIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTY4MjMxMiJ9fSx7ImJpZGRlciI6ImFtYXpvbiIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicHVibWF0aWMiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InJ1Ymljb24iLCJwYXJhbXMiOnsiem9uZUlkIjoiMjA5NTE0OCIsImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJzb25vYmkiLCJwYXJhbXMiOnsiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk3MSIsInNpemUiOlszMDAsMjUwXX19LHsiYmlkZGVyIjoib3BlbngiLCJwYXJhbXMiOnsidW5pdCI6IjU0NDA5NjcwMiJ9fSx7ImJpZGRlciI6InRydXN0eCIsInBhcmFtcyI6eyJ1aWQiOiI3Nzg0NiJ9fSx7ImJpZGRlciI6Im9uZW1vYmlsZSIsInBhcmFtcyI6eyJkY24iOiI4YTk2OTQ3YjAxN2E3YTE1OTY0NzE1ZmI2ZWI1MDAxYSIsInBvcyI6Im1ldGFjcml0aWNfbXdfMzIweDUwXzEzIn19LHsiYmlkZGVyIjoiYXBwbmV4dXMiLCJwYXJhbXMiOnsicGxhY2VtZW50SWQiOiIyMTg2NDM4OSJ9fSx7ImJpZGRlciI6Iml4IiwicGFyYW1zIjp7InNpdGVJZCI6IjY3ODk3MiIsInNpemUiOlszMjAsNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzA1In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODQ3In19XX0seyJjb2RlIjoibW9iaWxlX2dhbGxlcnlfYmFubmVyX3BsdXNfOSIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfMTQifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzEzIn19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTczIiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzA5In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODQ4In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTQifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0MzkwIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTc0Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MTIifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NDkifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c18xMCIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfMTUifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzE0In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTc1Iiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzE0In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODUwIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTUifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0MzkyIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTc2Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MTcifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NTEifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c18xMSIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfMTYifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzE1In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTc3Iiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzIxIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODUyIn19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTYifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0MzkzIn19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTc4Iiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MDcifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NTMifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c18xMiIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfMTcifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzE2In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTgwIiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzEwIn19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODU0In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTcifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzk0In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTgxIiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MTMifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NTUifX1dfSx7ImNvZGUiOiJtb2JpbGVfZ2FsbGVyeV9iYW5uZXJfcGx1c18xMyIsInNpemVzIjpbWzMwMCwyNTBdLFszMjAsNTBdLFszMjAsNDgwXV0sImNhY2hlIjpmYWxzZSwiYWxsb3dlZFR5cGVzIjp7ImJhbm5lciI6dHJ1ZSwibmF0aXZlIjpmYWxzZSwidmlkZW8iOmZhbHNlfSwidGFyZ2V0aW5nIjp7InBvcyI6Im1pZGRsZSJ9LCJiaWRzIjpbeyJiaWRkZXIiOiJvbmVtb2JpbGUiLCJwYXJhbXMiOnsiZGNuIjoiOGE5Njk0N2IwMTdhN2ExNTk2NDcxNWZiNmViNTAwMWEiLCJwb3MiOiJtZXRhY3JpdGljX213XzMwMHgyNTBfMTgifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxNjgyMzE3In19LHsiYmlkZGVyIjoiYW1hem9uIiwicGFyYW1zIjp7ImluY2x1ZGVkIjp0cnVlfX0seyJiaWRkZXIiOiJwdWJtYXRpYyIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoicnViaWNvbiIsInBhcmFtcyI6eyJ6b25lSWQiOiIyMDk1MTQ4IiwiaW5jbHVkZWQiOnRydWV9fSx7ImJpZGRlciI6InNvbm9iaSIsInBhcmFtcyI6eyJpbmNsdWRlZCI6dHJ1ZX19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTgyIiwic2l6ZSI6WzMwMCwyNTBdfX0seyJiaWRkZXIiOiJvcGVueCIsInBhcmFtcyI6eyJ1bml0IjoiNTQ0MDk2NzE1In19LHsiYmlkZGVyIjoidHJ1c3R4IiwicGFyYW1zIjp7InVpZCI6Ijc3ODU2In19LHsiYmlkZGVyIjoib25lbW9iaWxlIiwicGFyYW1zIjp7ImRjbiI6IjhhOTY5NDdiMDE3YTdhMTU5NjQ3MTVmYjZlYjUwMDFhIiwicG9zIjoibWV0YWNyaXRpY19td18zMjB4NTBfMTgifX0seyJiaWRkZXIiOiJhcHBuZXh1cyIsInBhcmFtcyI6eyJwbGFjZW1lbnRJZCI6IjIxODY0Mzk1In19LHsiYmlkZGVyIjoiaXgiLCJwYXJhbXMiOnsic2l0ZUlkIjoiNjc4OTgzIiwic2l6ZSI6WzMyMCw1MF19fSx7ImJpZGRlciI6Im9wZW54IiwicGFyYW1zIjp7InVuaXQiOiI1NDQwOTY3MTgifX0seyJiaWRkZXIiOiJ0cnVzdHgiLCJwYXJhbXMiOnsidWlkIjoiNzc4NTcifX1dfV0nKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHIoMTYpLCByKDgzKSwgcig0MCksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdJbnRlcnNlY3Rpb25PYnNlcnZlcicgaW4gZSAmJiAnSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeScgaW4gZSAmJiAnaW50ZXJzZWN0aW9uUmF0aW8nIGluIGUuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lzSW50ZXJzZWN0aW5nJyBpbiBlLkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkucHJvdG90eXBlIHx8IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkucHJvdG90eXBlLCAnaXNJbnRlcnNlY3RpbmcnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGkucHJvdG90eXBlLlRIUk9UVExFX1RJTUVPVVQgPSAxMDAsIGkucHJvdG90eXBlLlBPTExfSU5URVJWQUwgPSBudWxsLCBpLnByb3RvdHlwZS5VU0VfTVVUQVRJT05fT0JTRVJWRVIgPSAhMCwgaS5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5zb21lKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVsZW1lbnQgPT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAxICE9IGUubm9kZVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBFbGVtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVySW5zdGFuY2UoKSwgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeTogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9tb25pdG9ySW50ZXJzZWN0aW9ucygpLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9IHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lbGVtZW50ICE9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLmxlbmd0aCB8fCAodGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpLCB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXSwgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpLCB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudGFrZVJlY29yZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX3F1ZXVlZEVudHJpZXMuc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9xdWV1ZWRFbnRyaWVzID0gW10sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9pbml0VGhyZXNob2xkcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUgfHwgWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgfHwgKHQgPSBbdF0pLCB0LnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgIT0gdHlwZW9mIGUgfHwgaXNOYU4oZSkgfHwgZSA8IDAgfHwgZSA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlbHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgIT09IHJbdCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9wYXJzZVJvb3RNYXJnaW4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoZSB8fCAnMHB4Jykuc3BsaXQoL1xzKy8pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gL14oLT9cZCpcLj9cZCspKHB4fCUpJC8uZXhlYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290TWFyZ2luIG11c3QgYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciBwZXJjZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwYXJzZUZsb2F0KHRbMV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiB0WzJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMV0gPSB0WzFdIHx8IHRbMF0sIHRbMl0gPSB0WzJdIHx8IHRbMF0sIHRbM10gPSB0WzNdIHx8IHRbMV0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9tb25pdG9ySW50ZXJzZWN0aW9ucyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JpbmdJbnRlcnNlY3Rpb25zIHx8ICh0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucyA9ICEwLCB0aGlzLlBPTExfSU5URVJWQUwgPyB0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRoaXMuUE9MTF9JTlRFUlZBTCkgOiAobyhlLCAncmVzaXplJywgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCAhMCksIG8odCwgJ3Njcm9sbCcsIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgITApLCB0aGlzLlVTRV9NVVRBVElPTl9PQlNFUlZFUiAmJiAnTXV0YXRpb25PYnNlcnZlcicgaW4gZSAmJiAodGhpcy5fZG9tT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMpLCB0aGlzLl9kb21PYnNlcnZlci5vYnNlcnZlKHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3Q6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuX3VubW9uaXRvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucyAmJiAodGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMgPSAhMSwgY2xlYXJJbnRlcnZhbCh0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwpLCB0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwgPSBudWxsLCBhKGUsICdyZXNpemUnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsICEwKSwgYSh0LCAnc2Nyb2xsJywgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCAhMCksIHRoaXMuX2RvbU9ic2VydmVyICYmICh0aGlzLl9kb21PYnNlcnZlci5kaXNjb25uZWN0KCksIHRoaXMuX2RvbU9ic2VydmVyID0gbnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9yb290SXNJbkRvbSgpLCByID0gdCA/IHRoaXMuX2dldFJvb3RSZWN0KCkgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gaS5lbGVtZW50LCBhID0gcyhvKSwgdSA9IHRoaXMuX3Jvb3RDb250YWluc1RhcmdldChvKSwgYyA9IGkuZW50cnksIGQgPSB0ICYmIHUgJiYgdGhpcy5fY29tcHV0ZVRhcmdldEFuZFJvb3RJbnRlcnNlY3Rpb24obywgciksIGwgPSBpLmVudHJ5ID0gbmV3IG4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogZS5wZXJmb3JtYW5jZSAmJiBwZXJmb3JtYW5jZS5ub3cgJiYgcGVyZm9ybWFuY2Uubm93KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGluZ0NsaWVudFJlY3Q6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Qm91bmRzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUmVjdDogZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID8gdCAmJiB1ID8gdGhpcy5faGFzQ3Jvc3NlZFRocmVzaG9sZChjLCBsKSAmJiB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobCkgOiBjICYmIGMuaXNJbnRlcnNlY3RpbmcgJiYgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKGwpIDogdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyksIHRoaXMuX3F1ZXVlZEVudHJpZXMubGVuZ3RoICYmIHRoaXMuX2NhbGxiYWNrKHRoaXMudGFrZVJlY29yZHMoKSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9jb21wdXRlVGFyZ2V0QW5kUm9vdEludGVyc2VjdGlvbiA9IGZ1bmN0aW9uIChyLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ25vbmUnICE9IGUuZ2V0Q29tcHV0ZWRTdHlsZShyKS5kaXNwbGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSwgbywgYSwgdSwgZCwgbCwgZiwgcCwgZyA9IHMociksIG0gPSBjKHIpLCB2ID0gITE7ICF2OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG51bGwsIHkgPSAxID09IG0ubm9kZVR5cGUgPyBlLmdldENvbXB1dGVkU3R5bGUobSkgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdub25lJyA9PSB5LmRpc3BsYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSB0aGlzLnJvb3QgfHwgbSA9PSB0ID8gKHYgPSAhMCwgYiA9IG4pIDogbSAhPSB0LmJvZHkgJiYgbSAhPSB0LmRvY3VtZW50RWxlbWVudCAmJiAndmlzaWJsZScgIT0geS5vdmVyZmxvdyAmJiAoYiA9IHMobSkpLCBiICYmIChpID0gYiwgbyA9IGcsIGEgPSB2b2lkIDAsIHUgPSB2b2lkIDAsIGQgPSB2b2lkIDAsIGwgPSB2b2lkIDAsIGYgPSB2b2lkIDAsIHAgPSB2b2lkIDAsIGEgPSBNYXRoLm1heChpLnRvcCwgby50b3ApLCB1ID0gTWF0aC5taW4oaS5ib3R0b20sIG8uYm90dG9tKSwgZCA9IE1hdGgubWF4KGkubGVmdCwgby5sZWZ0KSwgbCA9IE1hdGgubWluKGkucmlnaHQsIG8ucmlnaHQpLCBwID0gdSAtIGEsICEoZyA9IChmID0gbCAtIGQpID49IDAgJiYgcCA+PSAwICYmIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBjKG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuX2dldFJvb3RSZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHModGhpcy5yb290KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmRvY3VtZW50RWxlbWVudCwgbiA9IHQuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiByLmNsaWVudFdpZHRoIHx8IG4uY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByLmNsaWVudFdpZHRoIHx8IG4uY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogci5jbGllbnRIZWlnaHQgfHwgbi5jbGllbnRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogci5jbGllbnRIZWlnaHQgfHwgbi5jbGllbnRIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9leHBhbmRSZWN0QnlSb290TWFyZ2luID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fcm9vdE1hcmdpblZhbHVlcy5tYXAoZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdweCcgPT0gdC51bml0ID8gdC52YWx1ZSA6IHQudmFsdWUgKiAociAlIDIgPyBlLndpZHRoIDogZS5oZWlnaHQpIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGUudG9wIC0gdFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGUucmlnaHQgKyB0WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IGUuYm90dG9tICsgdFsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogZS5sZWZ0IC0gdFszXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci53aWR0aCA9IHIucmlnaHQgLSByLmxlZnQsIHIuaGVpZ2h0ID0gci5ib3R0b20gLSByLnRvcCwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuX2hhc0Nyb3NzZWRUaHJlc2hvbGQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlICYmIGUuaXNJbnRlcnNlY3RpbmcgPyBlLmludGVyc2VjdGlvblJhdGlvIHx8IDAgOiAtMSwgbiA9IHQuaXNJbnRlcnNlY3RpbmcgPyB0LmludGVyc2VjdGlvblJhdGlvIHx8IDAgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRocmVzaG9sZHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzLnRocmVzaG9sZHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IHIgfHwgbyA9PSBuIHx8IG8gPCByICE9IG8gPCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9yb290SXNJbkRvbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5yb290IHx8IHUodCwgdGhpcy5yb290KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuX3Jvb3RDb250YWluc1RhcmdldCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSh0aGlzLnJvb3QgfHwgdCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl9yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmRleE9mKHRoaXMpIDwgMCAmJiByLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLl91bnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIuaW5kZXhPZih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICE9IGUgJiYgci5zcGxpY2UoZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgPSBpLCBlLkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPSBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lID0gZS50aW1lLCB0aGlzLnRhcmdldCA9IGUudGFyZ2V0LCB0aGlzLnJvb3RCb3VuZHMgPSBlLnJvb3RCb3VuZHMsIHRoaXMuYm91bmRpbmdDbGllbnRSZWN0ID0gZS5ib3VuZGluZ0NsaWVudFJlY3QsIHRoaXMuaW50ZXJzZWN0aW9uUmVjdCA9IGUuaW50ZXJzZWN0aW9uUmVjdCB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMAogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmlzSW50ZXJzZWN0aW5nID0gISFlLmludGVyc2VjdGlvblJlY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5ib3VuZGluZ0NsaWVudFJlY3QsIHIgPSB0LndpZHRoICogdC5oZWlnaHQsIG4gPSB0aGlzLmludGVyc2VjdGlvblJlY3QsIGkgPSBuLndpZHRoICogbi5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJzZWN0aW9uUmF0aW8gPSByID8gTnVtYmVyKChpIC8gcikudG9GaXhlZCg0KSkgOiB0aGlzLmlzSW50ZXJzZWN0aW5nID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSwgbyA9IHQgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLnJvb3QgJiYgMSAhPSBvLnJvb3Qubm9kZVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncm9vdCBtdXN0IGJlIGFuIEVsZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMgPSAociA9IHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucy5iaW5kKHRoaXMpLCBuID0gdGhpcy5USFJPVFRMRV9USU1FT1VULCBpID0gbnVsbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoKSwgaSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9jYWxsYmFjayA9IGUsIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9IFtdLCB0aGlzLl9xdWV1ZWRFbnRyaWVzID0gW10sIHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMgPSB0aGlzLl9wYXJzZVJvb3RNYXJnaW4oby5yb290TWFyZ2luKSwgdGhpcy50aHJlc2hvbGRzID0gdGhpcy5faW5pdFRocmVzaG9sZHMoby50aHJlc2hvbGQpLCB0aGlzLnJvb3QgPSBvLnJvb3QgfHwgbnVsbCwgdGhpcy5yb290TWFyZ2luID0gdGhpcy5fcm9vdE1hcmdpblZhbHVlcy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlICsgZS51bml0OwogICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlLmFkZEV2ZW50TGlzdGVuZXIgPyBlLmFkZEV2ZW50TGlzdGVuZXIodCwgciwgbiB8fCAhMSkgOiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLmF0dGFjaEV2ZW50ICYmIGUuYXR0YWNoRXZlbnQoJ29uJyArIHQsIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQsIHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5yZW1vdmVFdmVudExpc3RlbmVyID8gZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsIHIsIG4gfHwgITEpIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5kZXRhdGNoRXZlbnQgJiYgZS5kZXRhdGNoRXZlbnQoJ29uJyArIHQsIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gKHQud2lkdGggJiYgdC5oZWlnaHQgfHwgKHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHQudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHQucmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IHQuYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogdC5sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQucmlnaHQgLSB0LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQuYm90dG9tIC0gdC50b3AKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQpIDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0OyByOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBjKHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAxMSA9PSB0Lm5vZGVUeXBlICYmIHQuaG9zdCA/IHQuaG9zdCA6IHQgJiYgdC5hc3NpZ25lZFNsb3QgPyB0LmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlIDogdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KHdpbmRvdywgZG9jdW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICB9KCkpCn0="},{"name":"sugarcoat-bugsnag.min","aliases":["sugarcoat-bugsnag.min"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMCA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgZXhwb3J0cyAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgbW9kdWxlKQogICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBlKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kKQogICAgICAgICAgICAgICAgZGVmaW5lKFtdLCBlKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdyA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBnbG9iYWwgPyBnbG9iYWwgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiB0aGlzKS5idWdzbmFnID0gZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSwgdCkgewogICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSigoTWF0aC5yYW5kb20oKSAqIHJlIDw8IDApLnRvU3RyaW5nKG5lKSwgdGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWUgPSBlZSA8IHJlID8gZWUgOiAwLCArK2VlIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICdjJyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpLnRvU3RyaW5nKG5lKSArIEoocigpLnRvU3RyaW5nKG5lKSwgdGUpICsgUSgpICsgKG4oKSArIG4oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0KSB7CiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgdCkpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgdCkpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IFtlLnRhZ05hbWVdOwogICAgICAgICAgICAgICAgaWYgKGUuaWQgJiYgdC5wdXNoKCcjJyArIGUuaWQpLCBlLmNsYXNzTmFtZSAmJiBlLmNsYXNzTmFtZS5sZW5ndGggJiYgdC5wdXNoKCcuJyArIGUuY2xhc3NOYW1lLnNwbGl0KCcgJykuam9pbignLicpKSwgIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgfHwgIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0LmpvaW4oJycpKS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmpvaW4oJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZS5wYXJlbnROb2RlLmNoaWxkTm9kZXMsIGUpICsgMTsKICAgICAgICAgICAgICAgICAgICB0LnB1c2goJzpudGgtY2hpbGQoJyArIG4gKyAnKScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIDEgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodC5qb2luKCcnKSkubGVuZ3RoID8gdC5qb2luKCcnKSA6IGUucGFyZW50Tm9kZSA/IHMoZS5wYXJlbnROb2RlKSArICcgPiAnICsgdC5qb2luKCcnKSA6IHQuam9pbignJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdShlLCB0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLmxlbmd0aCA8PSB0ID8gZSA6IGUuc2xpY2UoMCwgdCAtICcoLi4uKScubGVuZ3RoKSArICcoLi4uKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgIGlmICghdHQocnQoKSwgdGhpc1tRZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHRoaXNbZXRdICsgJyAnICsgdGhpc1tRZV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID49IDQwMCA/IG50LmxlYXZlQnJlYWRjcnVtYignWE1MSHR0cFJlcXVlc3QgZmFpbGVkJywgZSwgWmUpIDogbnQubGVhdmVCcmVhZGNydW1iKCdYTUxIdHRwUmVxdWVzdCBzdWNjZWVkZWQnLCBlLCBaZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgIHR0KHJ0KCksIHRoaXNbUWVdKSB8fCBudC5sZWF2ZUJyZWFkY3J1bWIoJ1hNTEh0dHBSZXF1ZXN0IGVycm9yJywgeyByZXF1ZXN0OiB0aGlzW2V0XSArICcgJyArIHRoaXNbUWVdIH0sIFplKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnW1Rocm93czogJyArIChlID8gZS5tZXNzYWdlIDogJz8nKSArICddJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gZS5sZW5ndGg7IG4gPCByOyBuKyspCiAgICAgICAgICAgICAgICAgICAgaWYgKGVbbl0gPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBBcnJheV0nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdOwogICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkKG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPiB4dCAmJiByID4gRHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyKyssIGkgPT09IHVuZGVmaW5lZCAmJiAoaSA9IDApLCBpID4gQnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMdDsKICAgICAgICAgICAgICAgICAgICBpZiAobygpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgJ29iamVjdCcgIT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIGlmIChsKG4sIGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nOwogICAgICAgICAgICAgICAgICAgIGlmIChuLnB1c2goZSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGUudG9KU09OKQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0KGUudG9KU09OKCksIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucG9wKCksIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKG0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGcoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IFtdLCB1ID0gMCwgYyA9IGUubGVuZ3RoOyB1IDwgYzsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdXNoKEx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaCh0KGVbdV0sIGkgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucG9wKCksIHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBmID0ge307CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltoXSA9IEx0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltoXSA9IHQocChlLCBoKSwgaSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHYpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucG9wKCksIGY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbiA9IFtdLCByID0gMDsKICAgICAgICAgICAgICAgIHJldHVybiB0KGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiwgaSA9IDAsIG8gPSBlLmxlbmd0aDsgaSA8IG87IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgciA9IHQociwgZVtpXSwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9LCB2ID0gIXsgdG9TdHJpbmc6IG51bGwgfS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgndG9TdHJpbmcnKSwgeSA9IFsKICAgICAgICAgICAgICAgICAgICAndG9TdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICd0b0xvY2FsZVN0cmluZycsCiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlT2YnLAogICAgICAgICAgICAgICAgICAgICdoYXNPd25Qcm9wZXJ0eScsCiAgICAgICAgICAgICAgICAgICAgJ2lzUHJvdG90eXBlT2YnLAogICAgICAgICAgICAgICAgICAgICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsCiAgICAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yJwogICAgICAgICAgICAgICAgXSwgYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPCAxMCA/ICcwJyArIGUgOiBlOwogICAgICAgICAgICAgICAgfSwgdyA9IHsKICAgICAgICAgICAgICAgICAgICBtYXA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGUsIGZ1bmN0aW9uIChlLCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQodChuLCByLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJlZHVjZTogbSwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGUsIGZ1bmN0aW9uIChlLCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChuLCByLCBpKSA/IGUuY29uY2F0KG4pIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGUsIGZ1bmN0aW9uIChlLCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGUgfHwgbiA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAga2V5czogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgdC5wdXNoKG4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIGkgPSB5Lmxlbmd0aDsgciA8IGk7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB5W3JdKSAmJiB0LnB1c2goeVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNBcnJheTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEFycmF5XScgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzb0RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpICsgJy0nICsgYihlLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGIoZS5nZXRVVENEYXRlKCkpICsgJ1QnICsgYihlLmdldFVUQ0hvdXJzKCkpICsgJzonICsgYihlLmdldFVUQ01pbnV0ZXMoKSkgKyAnOicgKyBiKGUuZ2V0VVRDU2Vjb25kcygpKSArICcuJyArIChlLmdldFVUQ01pbGxpc2Vjb25kcygpIC8gMTAwMCkudG9GaXhlZCgzKS5zbGljZSgyLCA1KSArICdaJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBTID0gdy5pc29EYXRlLCBPID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2Fub255bW91c10nLCByID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSwgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogJ21hbnVhbCcsIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IFMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZSh0aGlzLCB0KSwgdGhpcy50eXBlID0gaSwgdGhpcy5uYW1lID0gbiwgdGhpcy5tZXRhRGF0YSA9IHIsIHRoaXMudGltZXN0YW1wID0gbzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdGhpcy50aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGogPSB7fSwgRSA9IHcuaW5jbHVkZXM7CiAgICAgICAgICAgIGoucG9zaXRpdmVJbnRJZkRlZmluZWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEUoWwogICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICdudW1iZXInCiAgICAgICAgICAgICAgICBdLCB0eXBlb2YgZSkgJiYgcGFyc2VJbnQoJycgKyBlLCAxMCkgPT09IGUgJiYgZSA+IDA7CiAgICAgICAgICAgIH0sIGouc3RyaW5nV2l0aExlbmd0aCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgISFlLmxlbmd0aDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIE4gPSB7fSwgUiA9IHcuZmlsdGVyLCBrID0gdy5yZWR1Y2UsIEIgPSB3LmtleXMsIEQgPSB3LmlzQXJyYXksIHggPSB3LmluY2x1ZGVzLCBMID0gai5wb3NpdGl2ZUludElmRGVmaW5lZCwgXyA9IGouc3RyaW5nV2l0aExlbmd0aDsKICAgICAgICAgICAgTi5zY2hlbWEgPSB7CiAgICAgICAgICAgICAgICBhcGlLZXk6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgcmVxdWlyZWQnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBfCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYXBwVmVyc2lvbjogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgYSBzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gZSB8fCBfKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhdXRvTm90aWZ5OiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgdHJ1ZXxmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZSB8fCAhMSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYmVmb3JlU2VuZDogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIGEgZnVuY3Rpb24gb3IgYXJyYXkgb2YgZnVuY3Rpb25zJywKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgfHwgRChlKSAmJiBSKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZW5kcG9pbnRzOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnk6ICdodHRwczovL25vdGlmeS5idWdzbmFnLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uczogJ2h0dHBzOi8vc2Vzc2lvbnMuYnVnc25hZy5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIGFuIG9iamVjdCBjb250YWluaW5nIGVuZHBvaW50IFVSTHMgeyBub3RpZnksIHNlc3Npb25zIH0uIHNlc3Npb25zIGlzIG9wdGlvbmFsIGlmIGF1dG9DYXB0dXJlU2Vzc2lvbnM9ZmFsc2UnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBfKGUubm90aWZ5KSAmJiAoITEgPT09IHQuYXV0b0NhcHR1cmVTZXNzaW9ucyB8fCBfKGUuc2Vzc2lvbnMpKSAmJiAwID09PSBSKEIoZSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXgoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3RpZnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXNzaW9ucycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9DYXB0dXJlU2Vzc2lvbnM6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVuZHBvaW50cyA9PT0gdW5kZWZpbmVkIHx8ICEhdC5lbmRwb2ludHMgJiYgISF0LmVuZHBvaW50cy5zZXNzaW9uczsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgdHJ1ZXxmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZSB8fCAhMSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbm90aWZ5UmVsZWFzZVN0YWdlczogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncycsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSBlIHx8IEQoZSkgJiYgUihlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGggPT09IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWxlYXNlU3RhZ2U6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdwcm9kdWN0aW9uJzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgYSBzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1heEJyZWFkY3J1bWJzOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgYSBudW1iZXIgXHUyMjY0NDAnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gZSB8fCBMKGUpICYmIChlID09PSB1bmRlZmluZWQgfHwgZSA8PSA0MCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGF1dG9CcmVhZGNydW1iczogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIHRydWV8ZmFsc2UnLAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1c2VyOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJyhvYmplY3QpIHVzZXIgc2hvdWxkIGJlIGFuIG9iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbWV0YURhdGE6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIGFuIG9iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbG9nZ2VyOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIG51bGwgb3IgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB7IGRlYnVnLCBpbmZvLCB3YXJuLCBlcnJvciB9JywKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlIHx8IGUgJiYgayhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJwogICAgICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgTi5tZXJnZURlZmF1bHRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGlmICghZSB8fCAhdCkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdHMgYW5kIHNjaGVtYSBvYmplY3RzIGFyZSByZXF1aXJlZCcpOwogICAgICAgICAgICAgICAgcmV0dXJuIGsoQih0KSwgZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltyXSA9IGVbcl0gIT09IHVuZGVmaW5lZCA/IGVbcl0gOiB0W3JdLmRlZmF1bHRWYWx1ZShlW3JdLCBlKSwgbjsKICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgfSwgTi52YWxpZGF0ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIXQpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRzIGFuZCBzY2hlbWEgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTsKICAgICAgICAgICAgICAgIHZhciBuID0gayhCKHQpLCBmdW5jdGlvbiAobiwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3JdLnZhbGlkYXRlKGVbcl0sIGUpID8gbiA6IG4uY29uY2F0KHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5OiByLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0W3JdLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlW3JdCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBbXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHZhbGlkOiAhbi5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBuCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgQyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwICYmICdzdHJpbmcnID09IHR5cGVvZiBlLmFwcC5yZWxlYXNlU3RhZ2UgPyBlLmFwcC5yZWxlYXNlU3RhZ2UgOiBlLmNvbmZpZy5yZWxlYXNlU3RhZ2U7CiAgICAgICAgICAgICAgICB9LCBxID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghZSB8fCAhZS5zdGFjayAmJiAhZS5zdGFja3RyYWNlICYmICFlWydvcGVyYSNzb3VyY2Vsb2MnXSB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgKGUuc3RhY2sgfHwgZS5zdGFja3RyYWNlIHx8IGVbJ29wZXJhI3NvdXJjZWxvYyddKSB8fCBlLnN0YWNrID09PSBlLm5hbWUgKyAnOiAnICsgZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgIH0sIFQgPSB7fTsKICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2YgVCA/IFQgPSB0KCkgOiBlLlN0YWNrRnJhbWUgPSB0KCk7CiAgICAgICAgICAgIH0odGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KGUpKSAmJiBpc0Zpbml0ZShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZS5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tlXTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBPYmplY3QpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdS5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkodVtuXSkgJiYgZVt1W25dXSAhPT0gdW5kZWZpbmVkICYmIHRoaXNbJ3NldCcgKyB0KHVbbl0pXShlW3Vbbl1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnaXNDb25zdHJ1Y3RvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICdpc0V2YWwnLAogICAgICAgICAgICAgICAgICAgICAgICAnaXNOYXRpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICAnaXNUb3BsZXZlbCcKICAgICAgICAgICAgICAgICAgICBdLCBvID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnY29sdW1uTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmVOdW1iZXInCiAgICAgICAgICAgICAgICAgICAgXSwgYSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uTmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnCiAgICAgICAgICAgICAgICAgICAgXSwgcyA9IFsnYXJncyddLCB1ID0gaS5jb25jYXQobywgYSwgcyk7CiAgICAgICAgICAgICAgICByLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICBnZXRBcmdzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFyZ3M7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXRBcmdzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ1tvYmplY3QgQXJyYXldJyAhPT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJncyBtdXN0IGJlIGFuIEFycmF5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJncyA9IGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRFdmFsT3JpZ2luOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV2YWxPcmlnaW47CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXRFdmFsT3JpZ2luOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2YWxPcmlnaW4gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBPYmplY3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V2YWwgT3JpZ2luIG11c3QgYmUgYW4gT2JqZWN0IG9yIFN0YWNrRnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZhbE9yaWdpbiA9IG5ldyByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCkgfHwgJ3thbm9ueW1vdXN9JykgKyAoJygnICsgKHRoaXMuZ2V0QXJncygpIHx8IFtdKS5qb2luKCcsJykgKyAnKScpICsgKHRoaXMuZ2V0RmlsZU5hbWUoKSA/ICdAJyArIHRoaXMuZ2V0RmlsZU5hbWUoKSA6ICcnKSArIChlKHRoaXMuZ2V0TGluZU51bWJlcigpKSA/ICc6JyArIHRoaXMuZ2V0TGluZU51bWJlcigpIDogJycpICsgKGUodGhpcy5nZXRDb2x1bW5OdW1iZXIoKSkgPyAnOicgKyB0aGlzLmdldENvbHVtbk51bWJlcigpIDogJycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGkubGVuZ3RoOyBjKyspCiAgICAgICAgICAgICAgICAgICAgci5wcm90b3R5cGVbJ2dldCcgKyB0KGlbY10pXSA9IG4oaVtjXSksIHIucHJvdG90eXBlWydzZXQnICsgdChpW2NdKV0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZV0gPSBCb29sZWFuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oaVtjXSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IG8ubGVuZ3RoOyBmKyspCiAgICAgICAgICAgICAgICAgICAgci5wcm90b3R5cGVbJ2dldCcgKyB0KG9bZl0pXSA9IG4ob1tmXSksIHIucHJvdG90eXBlWydzZXQnICsgdChvW2ZdKV0gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZShuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgKyAnIG11c3QgYmUgYSBOdW1iZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbdF0gPSBOdW1iZXIobik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfShvW2ZdKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgYS5sZW5ndGg7IGQrKykKICAgICAgICAgICAgICAgICAgICByLnByb3RvdHlwZVsnZ2V0JyArIHQoYVtkXSldID0gbihhW2RdKSwgci5wcm90b3R5cGVbJ3NldCcgKyB0KGFbZF0pXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tlXSA9IFN0cmluZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KGFbZF0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgQSA9IHt9OwogICAgICAgICAgICAhZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiBBID8gQSA9IHQoVCkgOiBlLkVycm9yU3RhY2tQYXJzZXIgPSB0KGUuU3RhY2tGcmFtZSk7CiAgICAgICAgICAgIH0odGhpcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciB0ID0gLyhefEApXFMrXDpcZCsvLCBuID0gL15ccyphdCAuKihcUytcOlxkK3xcKG5hdGl2ZVwpKS9tLCByID0gL14oZXZhbEApPyhcW25hdGl2ZSBjb2RlXF0pPyQvOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBlLnN0YWNrdHJhY2UgfHwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGVbJ29wZXJhI3NvdXJjZWxvYyddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc3RhY2sgJiYgZS5zdGFjay5tYXRjaChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVjhPcklFKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdGFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGFyc2UgZ2l2ZW4gRXJyb3Igb2JqZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBleHRyYWN0TG9jYXRpb246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gZS5pbmRleE9mKCc6JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC8oLis/KSg/Olw6KFxkKykpPyg/Olw6KFxkKykpPyQvLmV4ZWMoZS5yZXBsYWNlKC9bXChcKV0vZywgJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzJdIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbM10gfHwgdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBwYXJzZVY4T3JJRTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc3RhY2suc3BsaXQoJ1xuJykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlLm1hdGNoKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW5kZXhPZignKGV2YWwgJykgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvZXZhbCBjb2RlL2csICdldmFsJykucmVwbGFjZSgvKFwoZXZhbCBhdCBbXlwoKV0qKXwoXClcLC4qJCkvZywgJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5yZXBsYWNlKC9eXHMrLywgJycpLnJlcGxhY2UoL1woZXZhbCBjb2RlL2csICcoJykuc3BsaXQoL1xzKy8pLnNsaWNlKDEpLCByID0gdGhpcy5leHRyYWN0TG9jYXRpb24obi5wb3AoKSksIGkgPSBuLmpvaW4oJyAnKSB8fCB1bmRlZmluZWQsIG8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxhbm9ueW1vdXM+JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5kZXhPZihyWzBdKSA+IC0xID8gdW5kZWZpbmVkIDogclswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiByWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zdGFjay5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5tYXRjaChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcykubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pbmRleE9mKCcgPiBldmFsJykgPiAtMSAmJiAodCA9IHQucmVwbGFjZSgvIGxpbmUgKFxkKykoPzogPiBldmFsIGxpbmUgXGQrKSogPiBldmFsXDpcZCtcOlxkKy9nLCAnOiQxJykpLCAtMSA9PT0gdC5pbmRleE9mKCdAJykgJiYgLTEgPT09IHQuaW5kZXhPZignOicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZSh7IGZ1bmN0aW9uTmFtZTogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gLygoLioiLisiW15AXSopP1teQF0qKSg/OkApLywgciA9IHQubWF0Y2gobiksIGkgPSByICYmIHJbMV0gPyByWzFdIDogdW5kZWZpbmVkLCBvID0gdGhpcy5leHRyYWN0TG9jYXRpb24odC5yZXBsYWNlKG4sICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogb1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBvWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcjogb1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHBhcnNlT3BlcmE6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5zdGFja3RyYWNlIHx8IGUubWVzc2FnZS5pbmRleE9mKCdcbicpID4gLTEgJiYgZS5tZXNzYWdlLnNwbGl0KCdcbicpLmxlbmd0aCA+IGUuc3RhY2t0cmFjZS5zcGxpdCgnXG4nKS5sZW5ndGggPyB0aGlzLnBhcnNlT3BlcmE5KGUpIDogZS5zdGFjayA/IHRoaXMucGFyc2VPcGVyYTExKGUpIDogdGhpcy5wYXJzZU9wZXJhMTAoZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBwYXJzZU9wZXJhOTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IC9MaW5lIChcZCspLipzY3JpcHQgKD86aW4gKT8oXFMrKS9pLCByID0gdC5tZXNzYWdlLnNwbGl0KCdcbicpLCBpID0gW10sIG8gPSAyLCBhID0gci5sZW5ndGg7IG8gPCBhOyBvICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5leGVjKHJbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiBpLnB1c2gobmV3IGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBzWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHNbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiByW29dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBwYXJzZU9wZXJhMTA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAvTGluZSAoXGQrKS4qc2NyaXB0ICg/OmluICk/KFxTKykoPzo6IEluIGZ1bmN0aW9uIChcUyspKT8kL2ksIHIgPSB0LnN0YWNrdHJhY2Uuc3BsaXQoJ1xuJyksIGkgPSBbXSwgbyA9IDAsIGEgPSByLmxlbmd0aDsgbyA8IGE7IG8gKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuLmV4ZWMocltvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmIGkucHVzaChuZXcgZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBzWzNdIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogc1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBzWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogcltvXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcGFyc2VPcGVyYTExOiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zdGFjay5zcGxpdCgnXG4nKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUubWF0Y2godCkgJiYgIWUubWF0Y2goL15FcnJvciBjcmVhdGVkIGF0Lyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIgPSB0LnNwbGl0KCdAJyksIGkgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbihyLnBvcCgpKSwgbyA9IHIuc2hpZnQoKSB8fCAnJywgYSA9IG8ucmVwbGFjZSgvPGFub255bW91cyBmdW5jdGlvbig6IChcdyspKT8+LywgJyQyJykucmVwbGFjZSgvXChbXlwpXSpcKS9nLCAnJykgfHwgdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5tYXRjaCgvXCgoW15cKV0qKVwpLykgJiYgKG4gPSBvLnJlcGxhY2UoL15bXlwoXStcKChbXlwpXSopXCkkLywgJyQxJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuID09PSB1bmRlZmluZWQgfHwgJ1thcmd1bWVudHMgbm90IGF2YWlsYWJsZV0nID09PSBuID8gdW5kZWZpbmVkIDogbi5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWU6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogaVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiBpWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcjogaVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIE0gPSB7fTsKICAgICAgICAgICAgIWZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2YgTSA/IE0gPSB0KFQpIDogZS5TdGFja0dlbmVyYXRvciA9IHQoZS5TdGFja0ZyYW1lKTsKICAgICAgICAgICAgfSh0aGlzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2U6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10sIHIgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT0gdHlwZW9mIHQgJiYgJ251bWJlcicgPT0gdHlwZW9mIHQubWF4U3RhY2tTaXplICYmIChyID0gdC5tYXhTdGFja1NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmNhbGxlZTsgaSAmJiBuLmxlbmd0aCA8IHIgJiYgaS5hcmd1bWVudHM7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gbmV3IEFycmF5KGkuYXJndW1lbnRzLmxlbmd0aCksIGEgPSAwOyBhIDwgby5sZW5ndGg7ICsrYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW2FdID0gaS5hcmd1bWVudHNbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvZnVuY3Rpb24oPzpccysoW1x3JF0rKSkrXHMqXCgvLnRlc3QoaS50b1N0cmluZygpKSA/IG4ucHVzaChuZXcgZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBSZWdFeHAuJDEgfHwgdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IG4ucHVzaChuZXcgZSh7IGFyZ3M6IG8gfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS5jYWxsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBQID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCBWID0gdy5yZWR1Y2UsIEggPSB3LmZpbHRlciwgVSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFtdLCBvID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiBGKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQodGhpcywgZSksIHRoaXMuX19pc0J1Z3NuYWdSZXBvcnQgPSAhMCwgdGhpcy5faWdub3JlZCA9ICExLCB0aGlzLl9oYW5kbGVkU3RhdGUgPSBvLCB0aGlzLmFwcCA9IHVuZGVmaW5lZCwgdGhpcy5hcGlLZXkgPSB1bmRlZmluZWQsIHRoaXMuYnJlYWRjcnVtYnMgPSBbXSwgdGhpcy5jb250ZXh0ID0gdW5kZWZpbmVkLCB0aGlzLmRldmljZSA9IHVuZGVmaW5lZCwgdGhpcy5lcnJvckNsYXNzID0gSyhuLCAnW25vIGVycm9yIGNsYXNzXScpLCB0aGlzLmVycm9yTWVzc2FnZSA9IEsociwgJ1tubyBlcnJvciBtZXNzYWdlXScpLCB0aGlzLmdyb3VwaW5nSGFzaCA9IHVuZGVmaW5lZCwgdGhpcy5tZXRhRGF0YSA9IHt9LCB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQsIHRoaXMuc2V2ZXJpdHkgPSB0aGlzLl9oYW5kbGVkU3RhdGUuc2V2ZXJpdHksIHRoaXMuc3RhY2t0cmFjZSA9IFYoaSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gSSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd7fScgPT09IEpTT04uc3RyaW5naWZ5KG4pID8gZSA6IGUuY29uY2F0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSksIHRoaXMudXNlciA9IHVuZGVmaW5lZCwgdGhpcy5zZXNzaW9uID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcm90b3R5cGUuaWdub3JlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pZ25vcmVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUuaXNJZ25vcmVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faWdub3JlZDsKICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS51cGRhdGVNZXRhRGF0YSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSAoYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdKSA/IHRoaXMucmVtb3ZlTWV0YURhdGEoZSkgOiBudWxsID09PSAoYXJndW1lbnRzLmxlbmd0aCA8PSAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzJdKSA/IHRoaXMucmVtb3ZlTWV0YURhdGEoZSwgYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdLCBhcmd1bWVudHMubGVuZ3RoIDw9IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMl0pIDogKCdvYmplY3QnID09IHR5cGVvZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdKSAmJiAobiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXSksICdzdHJpbmcnID09IHR5cGVvZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzFdKSAmJiAodCA9IHt9LCB0W2FyZ3VtZW50cy5sZW5ndGggPD0gMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXV0gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDIgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMl0sIG4gPSB0KSwgbiA/ICh0aGlzLm1ldGFEYXRhW2VdIHx8ICh0aGlzLm1ldGFEYXRhW2VdID0ge30pLCB0aGlzLm1ldGFEYXRhW2VdID0gUCh7fSwgdGhpcy5tZXRhRGF0YVtlXSwgbiksIHRoaXMpIDogdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUucmVtb3ZlTWV0YURhdGEgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgIT0gdHlwZW9mIGUgPyB0aGlzIDogdCA/IHRoaXMubWV0YURhdGFbZV0gPyAoZGVsZXRlIHRoaXMubWV0YURhdGFbZV1bdF0sIHRoaXMpIDogdGhpcyA6IChkZWxldGUgdGhpcy5tZXRhRGF0YVtlXSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFZlcnNpb246ICc0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ2xhc3M6IHRoaXMuZXJyb3JDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5lcnJvck1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrdHJhY2U6IHRoaXMuc3RhY2t0cmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jyb3dzZXJqcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiB0aGlzLnNldmVyaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5oYW5kbGVkOiB0aGlzLl9oYW5kbGVkU3RhdGUudW5oYW5kbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHlSZWFzb246IHRoaXMuX2hhbmRsZWRTdGF0ZS5zZXZlcml0eVJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U6IHRoaXMuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWRjcnVtYnM6IHRoaXMuYnJlYWRjcnVtYnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YTogdGhpcy5tZXRhRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nSGFzaDogdGhpcy5ncm91cGluZ0hhc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiB0aGlzLnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uOiB0aGlzLnNlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfSgpLCBJID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZS5maWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAkKGUuZnVuY3Rpb25OYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogZS5saW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OdW1iZXI6IGUuY29sdW1uTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvamVjdDogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5saW5lTnVtYmVyID4gLTEgJiYgIXQuZmlsZSAmJiAhdC5tZXRob2QgJiYgKHQuZmlsZSA9ICdnbG9iYWwgY29kZScpLCB0OwogICAgICAgICAgICAgICAgfSwgJCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eZ2xvYmFsIGNvZGUkL2kudGVzdChlKSA/ICdnbG9iYWwgY29kZScgOiBlOwogICAgICAgICAgICAgICAgfSwgRiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB1bmhhbmRsZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eVJlYXNvbjogeyB0eXBlOiAnaGFuZGxlZEV4Y2VwdGlvbicgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBLID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgZSA/IGUgOiB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgVS5nZXRTdGFja3RyYWNlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHEoZSkgPyBBLnBhcnNlKGUpLnNsaWNlKHQpIDogSChNLmJhY2t0cmFjZSgpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gKGUuZnVuY3Rpb25OYW1lIHx8ICcnKS5pbmRleE9mKCdTdGFja0dlbmVyYXRvciQkJyk7CiAgICAgICAgICAgICAgICB9KS5zbGljZSgxICsgbik7CiAgICAgICAgICAgIH0sIFUuZW5zdXJlUmVwb3J0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwOwogICAgICAgICAgICAgICAgaWYgKGUuX19pc0J1Z3NuYWdSZXBvcnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gVS5nZXRTdGFja3RyYWNlKGUsIHQsIDEgKyBuKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFUoZS5uYW1lLCBlLm1lc3NhZ2UsIHIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVShlLm5hbWUsIGUubWVzc2FnZSwgW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgWCA9IFUsIEogPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gJzAwMDAwMDAwMCcgKyBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnN1YnN0cihuLmxlbmd0aCAtIHQpOwogICAgICAgICAgICAgICAgfSwgeiA9ICdvYmplY3QnID09IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiBzZWxmLCBHID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgVyBpbiB6KQogICAgICAgICAgICAgICAgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoeiwgVykgJiYgRysrOwogICAgICAgICAgICB2YXIgWSA9IG5hdmlnYXRvci5taW1lVHlwZXMgPyBuYXZpZ2F0b3IubWltZVR5cGVzLmxlbmd0aCA6IDAsIFogPSBKKChZICsgbmF2aWdhdG9yLnVzZXJBZ2VudC5sZW5ndGgpLnRvU3RyaW5nKDM2KSArIEcudG9TdHJpbmcoMzYpLCA0KSwgUSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWjsKICAgICAgICAgICAgICAgIH0sIGVlID0gMCwgdGUgPSA0LCBuZSA9IDM2LCByZSA9IE1hdGgucG93KG5lLCB0ZSk7CiAgICAgICAgICAgIGkuZmluZ2VycHJpbnQgPSBROwogICAgICAgICAgICB2YXIgaWUgPSBpLCBvZSA9IHcuaXNvRGF0ZSwgYWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbyh0aGlzLCBlKSwgdGhpcy5pZCA9IGllKCksIHRoaXMuc3RhcnRlZEF0ID0gb2UoKSwgdGhpcy5faGFuZGxlZCA9IDAsIHRoaXMuX3VuaGFuZGxlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogdGhpcy5zdGFydGVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkOiB0aGlzLl9oYW5kbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaGFuZGxlZDogdGhpcy5fdW5oYW5kbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUudHJhY2tFcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZS5faGFuZGxlZFN0YXRlLnVuaGFuZGxlZCA/ICdfdW5oYW5kbGVkJyA6ICdfaGFuZGxlZCddICs9IDE7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oKSwgc2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnW29iamVjdCBFcnJvcl0nOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1tvYmplY3QgRXhjZXB0aW9uXSc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnW29iamVjdCBET01FeGNlcHRpb25dJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgdWUgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIGNlID0gdy5tYXAsIGZlID0gdy5yZWR1Y2UsIGRlID0gdy5pbmNsdWRlcywgbGUgPSB3LmlzQXJyYXksIGdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgfSwgcGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBOLnNjaGVtYSwgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEodGhpcywgZSksICEodCAmJiB0Lm5hbWUgJiYgdC52ZXJzaW9uICYmIHQudXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYG5vdGlmaWVyYCBhcmd1bWVudCBpcyByZXF1aXJlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWVyID0gdCwgdGhpcy5jb25maWdTY2hlbWEgPSBuLCB0aGlzLl9jb25maWd1cmVkID0gITEsIHRoaXMuX3RyYW5zcG9ydCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRTZXNzaW9uOiBnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBvcnQ6IGdlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2xvZ2dlciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiBnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm86IGdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybjogZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZ2UKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5wbHVnaW5zID0gW10sIHRoaXMuc2Vzc2lvbiA9IHIsIHRoaXMuYmVmb3JlU2Vzc2lvbiA9IFtdLCB0aGlzLmJyZWFkY3J1bWJzID0gW10sIHRoaXMuYXBwID0ge30sIHRoaXMuY29udGV4dCA9IHVuZGVmaW5lZCwgdGhpcy5kZXZpY2UgPSB1bmRlZmluZWQsIHRoaXMubWV0YURhdGEgPSB1bmRlZmluZWQsIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZCwgdGhpcy51c2VyID0ge30sIHRoaXMuQnVnc25hZ1JlcG9ydCA9IFgsIHRoaXMuQnVnc25hZ0JyZWFkY3J1bWIgPSBPLCB0aGlzLkJ1Z3NuYWdTZXNzaW9uID0gYWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5jb25maWd1cmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcgPSBOLm1lcmdlRGVmYXVsdHModWUoe30sIHRoaXMuY29uZmlnLCBlKSwgdGhpcy5jb25maWdTY2hlbWEpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE4udmFsaWRhdGUodGhpcy5jb25maWcsIHRoaXMuY29uZmlnU2NoZW1hKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwID09ICF0LnZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHZlKHQuZXJyb3JzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzLmNvbmZpZy5iZWZvcmVTZW5kICYmICh0aGlzLmNvbmZpZy5iZWZvcmVTZW5kID0gW3RoaXMuY29uZmlnLmJlZm9yZVNlbmRdKSwgbnVsbCAhPT0gdGhpcy5jb25maWcuYXBwVmVyc2lvbiAmJiAodGhpcy5hcHAudmVyc2lvbiA9IHRoaXMuY29uZmlnLmFwcFZlcnNpb24pLCB0aGlzLmNvbmZpZy5tZXRhRGF0YSAmJiAodGhpcy5tZXRhRGF0YSA9IHRoaXMuY29uZmlnLm1ldGFEYXRhKSwgdGhpcy5jb25maWcudXNlciAmJiAodGhpcy51c2VyID0gdGhpcy5jb25maWcudXNlciksIHRoaXMuY29uZmlnLmxvZ2dlciAmJiB0aGlzLmxvZ2dlcih0aGlzLmNvbmZpZy5sb2dnZXIpLCB0aGlzLl9jb25maWd1cmVkID0gITAsIHRoaXMuX2xvZ2dlci5kZWJ1ZygnTG9hZGVkIScpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsdWdpbnMucHVzaChlKSwgZS5pbml0KHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLnRyYW5zcG9ydCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQgPSBlLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLmxvZ2dlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2dnZXIgPSBlLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLnNlc3Npb25EZWxlZ2F0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXNzaW9uRGVsZWdhdGUgPSBlLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLnN0YXJ0U2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Nlc3Npb25EZWxlZ2F0ZSA/IHRoaXMuX3Nlc3Npb25EZWxlZ2F0ZS5zdGFydFNlc3Npb24odGhpcykgOiAodGhpcy5fbG9nZ2VyLndhcm4oJ05vIHNlc3Npb24gaW1wbGVtZW50YXRpb24gaXMgaW5zdGFsbGVkJyksIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLmxlYXZlQnJlYWRjcnVtYiA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY29uZmlndXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2xpZW50IG5vdCBjb25maWd1cmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gZSB8fCB1bmRlZmluZWQsIG4gPSAnc3RyaW5nJyA9PSB0eXBlb2YgbiA/IG4gOiB1bmRlZmluZWQsIHIgPSAnc3RyaW5nJyA9PSB0eXBlb2YgciA/IHIgOiB1bmRlZmluZWQsIHQgPSAnb2JqZWN0JyA9PSB0eXBlb2YgdCAmJiBudWxsICE9PSB0ID8gdCA6IHVuZGVmaW5lZCwgJ3N0cmluZycgPT0gdHlwZW9mIGUgfHwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgTyhlLCB0LCBuLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJyZWFkY3J1bWJzLnB1c2goaSksIHRoaXMuYnJlYWRjcnVtYnMubGVuZ3RoID4gdGhpcy5jb25maWcubWF4QnJlYWRjcnVtYnMgJiYgKHRoaXMuYnJlYWRjcnVtYnMgPSB0aGlzLmJyZWFkY3J1bWJzLnNsaWNlKHRoaXMuYnJlYWRjcnVtYnMubGVuZ3RoIC0gdGhpcy5jb25maWcubWF4QnJlYWRjcnVtYnMpKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLm5vdGlmeSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jb25maWd1cmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGllbnQgbm90IGNvbmZpZ3VyZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBDKHRoaXMpLCByID0gaGUoZSwgdCwgdGhpcy5fbG9nZ2VyKSwgaSA9IHIuZXJyLCBvID0gci5lcnJvckZyYW1lc1RvU2tpcCwgYSA9IHIuX29wdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmICh0ID0gYSksICFpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHllKCdub3RoaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2dnZXIud2FybignVXNhZ2UgZXJyb3IuICcgKyBzKSwgaSA9IG5ldyBFcnJvcignQnVnc25hZyB1c2FnZSBlcnJvci4gJyArIHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiB0ICYmIG51bGwgIT09IHQgfHwgKHQgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gWC5lbnN1cmVSZXBvcnQoaSwgbywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1LmFwcCA9IHVlKHsgcmVsZWFzZVN0YWdlOiBuIH0sIHUuYXBwLCB0aGlzLmFwcCksIHUuY29udGV4dCA9IHUuY29udGV4dCB8fCB0LmNvbnRleHQgfHwgdGhpcy5jb250ZXh0IHx8IHVuZGVmaW5lZCwgdS5kZXZpY2UgPSB1ZSh7fSwgdS5kZXZpY2UsIHRoaXMuZGV2aWNlLCB0LmRldmljZSksIHUucmVxdWVzdCA9IHVlKHt9LCB1LnJlcXVlc3QsIHRoaXMucmVxdWVzdCwgdC5yZXF1ZXN0KSwgdS51c2VyID0gdWUoe30sIHUudXNlciwgdGhpcy51c2VyLCB0LnVzZXIpLCB1Lm1ldGFEYXRhID0gdWUoe30sIHUubWV0YURhdGEsIHRoaXMubWV0YURhdGEsIHQubWV0YURhdGEpLCB1LmJyZWFkY3J1bWJzID0gdGhpcy5icmVhZGNydW1icy5zbGljZSgwKSwgdGhpcy5zZXNzaW9uICYmICh0aGlzLnNlc3Npb24udHJhY2tFcnJvcih1KSwgdS5zZXNzaW9uID0gdGhpcy5zZXNzaW9uKSwgdC5zZXZlcml0eSAhPT0gdW5kZWZpbmVkICYmICh1LnNldmVyaXR5ID0gdC5zZXZlcml0eSwgdS5faGFuZGxlZFN0YXRlLnNldmVyaXR5UmVhc29uID0geyB0eXBlOiAndXNlclNwZWNpZmllZFNldmVyaXR5JyB9KSwgbGUodGhpcy5jb25maWcubm90aWZ5UmVsZWFzZVN0YWdlcykgJiYgIWRlKHRoaXMuY29uZmlnLm5vdGlmeVJlbGVhc2VTdGFnZXMsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvZ2dlci53YXJuKCdSZXBvcnQgbm90IHNlbnQgZHVlIHRvIHJlbGVhc2VTdGFnZS9ub3RpZnlSZWxlYXNlU3RhZ2VzIGNvbmZpZ3VyYXRpb24nKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gdS5zZXZlcml0eSwgZiA9IFtdLmNvbmNhdCh0LmJlZm9yZVNlbmQpLmNvbmNhdCh0aGlzLmNvbmZpZy5iZWZvcmVTZW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZlKGYsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGUgfHwgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgITEgPT09IHQodSkgfHwgISF1LmlzSWdub3JlZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpID8gKHRoaXMuX2xvZ2dlci5kZWJ1ZygnUmVwb3J0IG5vdCBzZW50IGR1ZSB0byBiZWZvcmVTZW5kIGNhbGxiYWNrJyksICExKSA6ICh0aGlzLmNvbmZpZy5hdXRvQnJlYWRjcnVtYnMgJiYgdGhpcy5sZWF2ZUJyZWFkY3J1bWIodS5lcnJvckNsYXNzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNsYXNzOiB1LmVycm9yQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHUuZXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IHUuc2V2ZXJpdHkKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2Vycm9yJyksIGMgIT09IHUuc2V2ZXJpdHkgJiYgKHUuX2hhbmRsZWRTdGF0ZS5zZXZlcml0eVJlYXNvbiA9IHsgdHlwZTogJ3VzZXJDYWxsYmFja1NldFNldmVyaXR5JyB9KSwgdGhpcy5fdHJhbnNwb3J0LnNlbmRSZXBvcnQodGhpcy5fbG9nZ2VyLCB0aGlzLmNvbmZpZywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpS2V5OiB1LmFwaUtleSB8fCB0aGlzLmNvbmZpZy5hcGlLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllcjogdGhpcy5ub3RpZmllciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3VdCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oKSwgaGUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gdm9pZCAwLCBpID0gMCwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHllKCdzdHJpbmcvc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLndhcm4oJ1VzYWdlIGVycm9yLiAnICsgYSksIHIgPSBuZXcgRXJyb3IoJ0J1Z3NuYWcgdXNhZ2UgZXJyb3IuICcgKyBhKSwgbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5QXJnczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbmV3IEVycm9yKFN0cmluZyhlKSksIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgICAgICAgICAgciA9IG5ldyBFcnJvcihTdHJpbmcoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0geWUoJ2Z1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG4ud2FybignVXNhZ2UgZXJyb3IuICcgKyBzKSwgciA9IG5ldyBFcnJvcignQnVnc25hZyB1c2FnZSBlcnJvci4gJyArIHMpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZSAmJiAoc2UoZSkgfHwgZS5fX2lzQnVnc25hZ1JlcG9ydCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPT0gZSAmJiBtZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyID0gbmV3IEVycm9yKGUubWVzc2FnZSB8fCBlLmVycm9yTWVzc2FnZSkpLm5hbWUgPSBlLm5hbWUgfHwgZS5lcnJvckNsYXNzLCBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB5ZSgndW5zdXBwb3J0ZWQgb2JqZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLndhcm4oJ1VzYWdlIGVycm9yLiAnICsgdSksIHIgPSBuZXcgRXJyb3IoJ0J1Z3NuYWcgdXNhZ2UgZXJyb3IuICcgKyB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBlcnI6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRnJhbWVzVG9Ta2lwOiBpLAogICAgICAgICAgICAgICAgICAgICAgICBfb3B0czogbwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBtZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ3N0cmluZycgIT0gdHlwZW9mIGUubmFtZSAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgZS5lcnJvckNsYXNzIHx8ICdzdHJpbmcnICE9IHR5cGVvZiBlLm1lc3NhZ2UgJiYgJ3N0cmluZycgIT0gdHlwZW9mIGUuZXJyb3JNZXNzYWdlKTsKICAgICAgICAgICAgICAgIH0sIHZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0J1Z3NuYWcgY29uZmlndXJhdGlvbiBlcnJvclxuJyArIGNlKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnIicgKyBlLmtleSArICciICcgKyBlLm1lc3NhZ2UgKyAnIFxuICAgIGdvdCAnICsgYmUoZS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSkuam9pbignXG5cbicpOwogICAgICAgICAgICAgICAgfSwgeWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnbm90aWZ5KCkgZXhwZWN0ZWQgZXJyb3Ivb3B0cyBwYXJhbWV0ZXJzLCBnb3QgJyArIGU7CiAgICAgICAgICAgICAgICB9LCBiZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnID09IHR5cGVvZiBlID8gSlNPTi5zdHJpbmdpZnkoZSkgOiBTdHJpbmcoZSk7CiAgICAgICAgICAgICAgICB9LCB3ZSA9IHBlLCBTZSA9IGoucG9zaXRpdmVJbnRJZkRlZmluZWQsIE9lID0gewogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZS5jb25maWcuYmVmb3JlU2VuZC5wdXNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA+PSBlLmNvbmZpZy5tYXhFdmVudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaWdub3JlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NjaGVtYTogewogICAgICAgICAgICAgICAgICAgICAgICBtYXhFdmVudHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBcdTIyNjQxMDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlKGUpICYmIGUgPCAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBqZSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSwgRWUgPSBOLnNjaGVtYSwgTmUgPSB3Lm1hcCwgUmUgPSB7CiAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVN0YWdlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9ebG9jYWxob3N0KDpcZCspPyQvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhvc3QpID8gJ2RldmVsb3BtZW50JyA6ICdwcm9kdWN0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Nob3VsZCBiZSBzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogai5zdHJpbmdXaXRoTGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0VXNlcklwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc2hvdWxkIGJlIHRydWV8ZmFsc2UnLAogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZSB8fCAhMSA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOiBqZSh7fSwgRWUubG9nZ2VyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBjb25zb2xlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGNvbnNvbGUuZGVidWcgPyBrZSgpIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0sIGtlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0ge30sIHQgPSBjb25zb2xlLmxvZzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUoWwogICAgICAgICAgICAgICAgICAgICAgICAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJwogICAgICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gY29uc29sZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgZVtuXSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIHIgPyByLmJpbmQoY29uc29sZSwgJ1tidWdzbmFnXScpIDogdC5iaW5kKGNvbnNvbGUsICdbYnVnc25hZ10nKTsKICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgIH0sIEJlID0ge30sIERlID0gdy5tYXAsIHhlID0gdy5yZWR1Y2UsIExlID0gdy5maWx0ZXI7CiAgICAgICAgICAgIEJlLmluaXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgRGUoX2UsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjb25zb2xlW3RdOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGVbdF0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoLCBpID0gQXJyYXkociksIG8gPSAwOyBvIDwgcjsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtvXSA9IGFyZ3VtZW50c1tvXTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5sZWF2ZUJyZWFkY3J1bWIoJ0NvbnNvbGUgb3V0cHV0JywgeGUoaSwgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gU3RyaW5nKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdbb2JqZWN0IE9iamVjdF0nID09PSByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBKU09OLnN0cmluZ2lmeSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbJ1snICsgbiArICddJ10gPSByLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7IHNldmVyaXR5OiAwID09PSB0LmluZGV4T2YoJ2dyb3VwJykgPyAnbG9nJyA6IHQgfSksICdsb2cnKSwgbi5hcHBseShjb25zb2xlLCBpKTsKICAgICAgICAgICAgICAgICAgICB9LCBjb25zb2xlW3RdLl9yZXN0b3JlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW3RdID0gbjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIEJlLmNvbmZpZ1NjaGVtYSA9IHsKICAgICAgICAgICAgICAgIGNvbnNvbGVCcmVhZGNydW1ic0VuYWJsZWQ6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGUgfHwgITEgPT09IGUgfHwgZSA9PT0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Nob3VsZCBiZSB0cnVlfGZhbHNlJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2UgPSBMZShbCiAgICAgICAgICAgICAgICAgICAgJ2xvZycsCiAgICAgICAgICAgICAgICAgICAgJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgJ3dhcm4nLAogICAgICAgICAgICAgICAgICAgICdlcnJvcicKICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBjb25zb2xlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGNvbnNvbGVbZV07CiAgICAgICAgICAgICAgICB9KSwgQ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5jb25maWcuYmVmb3JlU2VuZC51bnNoaWZ0KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvbnRleHQgfHwgKGUuY29udGV4dCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHFlID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCBUZSA9IHcuaXNvRGF0ZSwgQWUgPSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5jb25maWcuYmVmb3JlU2VuZC51bnNoaWZ0KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRldmljZSA9IHFlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lOiBUZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogbmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3Iuc3lzdGVtTGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmRldmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmJlZm9yZVNlc3Npb24ucHVzaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kZXZpY2UgPSB7IHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBNZSA9IHt9LCBQZSA9IHcucmVkdWNlLCBWZSA9IC9eLio8c2NyaXB0Lio/Pi8sIEhlID0gLzxcL3NjcmlwdD4uKiQvLCBVZSA9IChNZSA9IHsKICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICcnLCBuID0gITEsIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSByKCksIGRvY3VtZW50Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmFjdGl2ZScgPT09IGRvY3VtZW50LnJlYWR5U3RhdGUgJiYgKHQgPSByKCksIG4gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuY29uZmlnLmJlZm9yZVNlbmQudW5zaGlmdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLnN0YWNrdHJhY2VbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8gfHwgIW8uZmlsZSB8fCAhby5saW5lTnVtYmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZmlsZS5yZXBsYWNlKC8jLiokLywgJycpICE9PSBpLnJlcGxhY2UoLyMuKiQvLCAnJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIHQgfHwgKHQgPSByKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbJzwhLS0gRE9DIFNUQVJUIC0tPiddLmNvbmNhdCh0LnNwbGl0KCdcbicpKSwgcyA9IFVlKGEsIG8ubGluZU51bWJlciAtIDEpLCB1ID0gcy5zY3JpcHQsIGMgPSBzLnN0YXJ0LCBmID0gUGUodSwgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKGMgKyBuICsgMSAtIG8ubGluZU51bWJlcikgPiAxMCA/IGUgOiAoZVsnJyArIChjICsgbiArIDEpXSA9IHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29kZSA9IGYsIGUudXBkYXRlTWV0YURhdGEoJ3NjcmlwdCcsIHsgY29udGVudDogdS5qb2luKCdcbicpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS5leHRyYWN0U2NyaXB0Q29udGVudCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQ7IG4gPCBlLmxlbmd0aCAmJiAhSGUudGVzdChlW25dKTspCiAgICAgICAgICAgICAgICAgICAgICAgIG4rKzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbjsgbiA+IDAgJiYgIVZlLnRlc3QoZVtuXSk7KQogICAgICAgICAgICAgICAgICAgICAgICBuLS07CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuLCBvID0gZS5zbGljZShpLCByICsgMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9bMF0gPSBvWzBdLnJlcGxhY2UoVmUsICcnKSwgb1tvLmxlbmd0aCAtIDFdID0gb1tvLmxlbmd0aCAtIDFdLnJlcGxhY2UoSGUsICcnKSwgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIEllID0gewogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdhZGRFdmVudExpc3RlbmVyJyBpbiB3aW5kb3cgJiYgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdm9pZCAwLCByID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJGUodC50YXJnZXQpLCByID0gcyh0LnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICdbaGlkZGVuXScsIHIgPSAnW2hpZGRlbl0nLCBlLl9sb2dnZXIuZXJyb3IoJ0Nyb3NzIGRvbWFpbiBlcnJvciB3aGVuIHRyYWNraW5nIGNsaWNrIGV2ZW50LiBTZWUgZG9jczogaHR0cHM6Ly90aW55dXJsLmNvbS95OTRmcTV6bScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5sZWF2ZUJyZWFkY3J1bWIoJ1VJIGNsaWNrJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRleHQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2VsZWN0b3I6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICd1c2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NjaGVtYTogewogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbkJyZWFkY3J1bWJzRW5hYmxlZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGUgfHwgITEgPT09IGUgfHwgZSA9PT0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgdHJ1ZXxmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sICRlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudGV4dENvbnRlbnQgfHwgZS5pbm5lclRleHQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgfHwgJ3N1Ym1pdCcgIT09IGUudHlwZSAmJiAnYnV0dG9uJyAhPT0gZS50eXBlIHx8ICh0ID0gZS52YWx1ZSksIHQgPSB0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJyksIHUodCwgMTQwKTsKICAgICAgICAgICAgICAgIH0sIEZlID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCBLZSA9IHsKICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLmNvbmZpZy5jb2xsZWN0VXNlcklwIHx8IGUuY29uZmlnLmJlZm9yZVNlbmQucHVzaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS51c2VyID0gRmUoeyBpZDogJ1tOT1QgQ09MTEVDVEVEXScgfSwgZS51c2VyKSwgZS5yZXF1ZXN0ID0gRmUoeyBjbGllbnRJcDogJ1tOT1QgQ09MTEVDVEVEXScgfSwgZS5yZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgWGUgPSB7fTsKICAgICAgICAgICAgWGUuaW5pdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoJ2FkZEV2ZW50TGlzdGVuZXInIGluIHdpbmRvdykgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxlYXZlQnJlYWRjcnVtYih0LCB7fSwgJ25hdmlnYXRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHQoJ1BhZ2UgaGlkZGVuJyksICEwKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VzaG93JywgdCgnUGFnZSBzaG93bicpLCAhMCksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdCgnUGFnZSBsb2FkZWQnKSwgITApLCB3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIHQoJ0RPTUNvbnRlbnRMb2FkZWQnKSwgITApLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIHQoJ05hdmlnYXRlZCBiYWNrJyksICEwKTsKICAgICAgICAgICAgICAgICAgICB9KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQub2xkVVJMID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbTogSmUodC5vbGRVUkwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG86IEplKHQubmV3VVJMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBXZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB7IHRvOiBKZSh3aW5kb3cubG9jYXRpb24uaHJlZikgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5sZWF2ZUJyZWFkY3J1bWIoJ0hhc2ggY2hhbmdlZCcsIG4sICduYXZpZ2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgITApLCB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUgJiYgR2UoZSwgd2luZG93Lmhpc3RvcnksICdyZXBsYWNlU3RhdGUnKSwgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlICYmIEdlKGUsIHdpbmRvdy5oaXN0b3J5LCAncHVzaFN0YXRlJyksIGUubGVhdmVCcmVhZGNydW1iKCdCdWdzbmFnIGxvYWRlZCcsIHt9LCAnbmF2aWdhdGlvbicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBYZS5jb25maWdTY2hlbWEgPSB7CiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uQnJlYWRjcnVtYnNFbmFibGVkOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlIHx8ICExID09PSBlIHx8IGUgPT09IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzaG91bGQgYmUgdHJ1ZXxmYWxzZScKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIEplID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ocmVmID0gZSwgJycgKyB0LnBhdGhuYW1lICsgdC5zZWFyY2ggKyB0Lmhhc2g7CiAgICAgICAgICAgICAgICB9LCB6ZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBKZSh3aW5kb3cubG9jYXRpb24uaHJlZik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGU6IFdlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBuIHx8IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IHIKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgR2UgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gdFtuXTsKICAgICAgICAgICAgICAgICAgICB0W25dID0gZnVuY3Rpb24gKGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5sZWF2ZUJyZWFkY3J1bWIoJ0hpc3RvcnkgJyArIG4sIHplKGksIG8sIGEpLCAnbmF2aWdhdGlvbicpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnJlZnJlc2ggJiYgZS5yZWZyZXNoKCksIGUuc2Vzc2lvbiAmJiBlLnN0YXJ0U2Vzc2lvbigpLCByLmFwcGx5KHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvCiAgICAgICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KGEgIT09IHVuZGVmaW5lZCA/IGEgOiBbXSkpOwogICAgICAgICAgICAgICAgICAgIH0sIHRbbl0uX3Jlc3RvcmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gPSByOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBXZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lmhpc3Rvcnkuc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIFllID0ge30sIFplID0gJ3JlcXVlc3QnLCBRZSA9ICdCU35+VScsIGV0ID0gJ0JTfn5NJywgdHQgPSB3LmluY2x1ZGVzLCBudCA9IHZvaWQgMCwgcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgbnQuY29uZmlnLmVuZHBvaW50cy5ub3RpZnksCiAgICAgICAgICAgICAgICAgICAgICAgIG50LmNvbmZpZy5lbmRwb2ludHMuc2Vzc2lvbnMKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgWWUuaW5pdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBudCA9IGUsIGl0KCksIG90KCk7CiAgICAgICAgICAgIH0sIFllLmNvbmZpZ1NjaGVtYSA9IHsKICAgICAgICAgICAgICAgIG5ldHdvcmtCcmVhZGNydW1ic0VuYWJsZWQ6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGUgfHwgITEgPT09IGUgfHwgZSA9PT0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Nob3VsZCBiZSB0cnVlfGZhbHNlJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF81ZWIxZjFkZGEyYzJkMGQ1ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNWViMWYxZGRhMmMyZDBkNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2IzNjE1ZTNkMjRmYjlkMzAuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYWRkRXZlbnRMaXN0ZW5lcicgaW4gd2luZG93LlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5YTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbUWVdID0gbiwgdGhpc1tldF0gPSB0LCB0aGlzWydCU35+UyddICYmICh0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjKSwgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGYpKSwgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYyksIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmKSwgdGhpc1snQlN+flMnXSA9ICEwLCBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzVlYjFmMWRkYTJjMmQwZDUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzVlYjFmMWRkYTJjMmQwZDUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBvdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2ZldGNoJyBpbiB3aW5kb3cpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB3aW5kb3cuZmV0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoLCBuID0gQXJyYXkodCksIHIgPSAwOyByIDwgdDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBhcmd1bWVudHNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5bMF0sIG8gPSBuWzFdLCBhID0gJ0dFVCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyAmJiBvLm1ldGhvZCAmJiAoYSA9IG8ubWV0aG9kKSwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KHVuZGVmaW5lZCwgbikudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdChlLCBhLCBpKSwgdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdChhLCBpKSwgcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGF0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogdCArICcgJyArIG4KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGUuc3RhdHVzID49IDQwMCA/IG50LmxlYXZlQnJlYWRjcnVtYignZmV0Y2goKSBmYWlsZWQnLCByLCBaZSkgOiBudC5sZWF2ZUJyZWFkY3J1bWIoJ2ZldGNoKCkgc3VjY2VlZGVkJywgciwgWmUpOwogICAgICAgICAgICAgICAgfSwgc3QgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIG50LmxlYXZlQnJlYWRjcnVtYignZmV0Y2goKSBlcnJvcicsIHsgcmVxdWVzdDogZSArICcgJyArIHQgfSwgWmUpOwogICAgICAgICAgICAgICAgfSwgdXQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIGN0ID0gewogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuY29uZmlnLmJlZm9yZVNlbmQudW5zaGlmdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXF1ZXN0ICYmIGUucmVxdWVzdC51cmwgfHwgKGUucmVxdWVzdCA9IHV0KHt9LCBlLnJlcXVlc3QsIHsgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZiB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGZ0ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCBkdCA9IHcubWFwLCBsdCA9IHcuaXNBcnJheSwgZ3QgPSB3LmluY2x1ZGVzLCBwdCA9IHsKICAgICAgICAgICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZXNzaW9uRGVsZWdhdGUoaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIGh0ID0gewogICAgICAgICAgICAgICAgICAgIHN0YXJ0U2Vzc2lvbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNlc3Npb24gPSBuZXcgZS5CdWdzbmFnU2Vzc2lvbigpLCBkdCh0LmJlZm9yZVNlc3Npb24sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gQyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGx0KHQuY29uZmlnLm5vdGlmeVJlbGVhc2VTdGFnZXMpICYmICFndCh0LmNvbmZpZy5ub3RpZnlSZWxlYXNlU3RhZ2VzLCBuKSA/ICh0Ll9sb2dnZXIud2FybignU2Vzc2lvbiBub3Qgc2VudCBkdWUgdG8gcmVsZWFzZVN0YWdlL25vdGlmeVJlbGVhc2VTdGFnZXMgY29uZmlndXJhdGlvbicpLCB0KSA6IHQuY29uZmlnLmVuZHBvaW50cy5zZXNzaW9ucyA/ICh0Ll90cmFuc3BvcnQuc2VuZFNlc3Npb24odC5fbG9nZ2VyLCB0LmNvbmZpZywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXI6IHQubm90aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U6IHQuZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiBmdCh7IHJlbGVhc2VTdGFnZTogbiB9LCB0LmFwcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuc2Vzc2lvbi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiB0LnNlc3Npb24uc3RhcnRlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiB0LnVzZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCkgOiAodC5fbG9nZ2VyLndhcm4oJ1Nlc3Npb24gbm90IHNlbnQgZHVlIHRvIG1pc3NpbmcgZW5kcG9pbnRzLnNlc3Npb25zIGNvbmZpZ3VyYXRpb24nKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgbXQgPSB7fSwgdnQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIHl0ID0gdy5tYXAsIGJ0ID0gKG10ID0gewogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuY29uZmlnLmJlZm9yZVNlbmQucHVzaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdGFja3RyYWNlID0geXQoZS5zdGFja3RyYWNlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2dCh7fSwgZSwgeyBmaWxlOiBidChlLmZpbGUpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLl9zdHJpcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlID8gZS5yZXBsYWNlKC9cPy4qJC8sICcnKS5yZXBsYWNlKC8jLiokLywgJycpIDogZTsKICAgICAgICAgICAgICAgIH0sIHd0ID0ge30sIFN0ID0gdy5yZWR1Y2UsIE90ID0gdm9pZCAwOwogICAgICAgICAgICB3dC5pbml0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQucmVhc29uLCByID0gITE7CiAgICAgICAgICAgICAgICAgICAgdC5kZXRhaWwgJiYgdC5kZXRhaWwucmVhc29uICYmIChuID0gdC5kZXRhaWwucmVhc29uLCByID0gITApOwogICAgICAgICAgICAgICAgICAgIHZhciBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmhhbmRsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHlSZWFzb246IHsgdHlwZTogJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb24nIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBxKG4pKQogICAgICAgICAgICAgICAgICAgICAgICBvID0gbmV3IGUuQnVnc25hZ1JlcG9ydChuLm5hbWUsIG4ubWVzc2FnZSwgQS5wYXJzZShuKSwgaSksIHIgJiYgKG8uc3RhY2t0cmFjZSA9IFN0KG8uc3RhY2t0cmFjZSwgRXQobiksIFtdKSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChvID0gbmV3IGUuQnVnc25hZ1JlcG9ydChuICYmIG4ubmFtZSA/IG4ubmFtZSA6ICdVbmhhbmRsZWRSZWplY3Rpb24nLCBuICYmIG4ubWVzc2FnZSA/IG4ubWVzc2FnZSA6ICdSZWplY3Rpb24gcmVhc29uIHdhcyBub3QgYW4gRXJyb3IuIFNlZSAiUHJvbWlzZSIgdGFiIGZvciBtb3JlIGRldGFpbC4nLCBbXSwgaSkpLnVwZGF0ZU1ldGFEYXRhKCdwcm9taXNlJywgJ3JlamVjdGlvbiByZWFzb24nLCBqdChuKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUubm90aWZ5KG8pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICdhZGRFdmVudExpc3RlbmVyJyBpbiB3aW5kb3cgPyB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgdCkgOiB3aW5kb3cub251bmhhbmRsZWRyZWplY3Rpb24gPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHQoewogICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IG4KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgT3QgPSB0OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIganQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBlIHx8IGUgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQgKG9yIG51bGwpJzsKICAgICAgICAgICAgICAgICAgICBpZiAoc2UoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0ge30sIHRbT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGUuY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrOiBlLnN0YWNrCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSwgRXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5maWxlID09PSBlLnRvU3RyaW5nKCkgPyB0IDogKG4ubWV0aG9kICYmIChuLm1ldGhvZCA9IG4ubWV0aG9kLnJlcGxhY2UoL15ccysvLCAnJykpLCB0LmNvbmNhdChuKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIE50ID0gewogICAgICAgICAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93Lm9uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbmVycm9yID0gZnVuY3Rpb24gKG4sIHIsIGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBpICYmIC9TY3JpcHQgZXJyb3JcLj8vLnRlc3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fbG9nZ2VyLndhcm4oJ0lnbm9yaW5nIGNyb3NzLWRvbWFpbiBvciBldmFsIHNjcmlwdCBlcnJvci4gU2VlIGRvY3M6IGh0dHBzOi8vdGlueXVybC5jb20veTk0ZnE1em0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmhhbmRsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHlSZWFzb246IHsgdHlwZTogJ3VuaGFuZGxlZEV4Y2VwdGlvbicgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm5hbWUgJiYgYS5tZXNzYWdlID8gdSA9IG5ldyBlLkJ1Z3NuYWdSZXBvcnQoYS5uYW1lLCBhLm1lc3NhZ2UsIFJ0KGUuQnVnc25hZ1JlcG9ydC5nZXRTdGFja3RyYWNlKGEpLCByLCBpLCBvKSwgcykgOiAodSA9IG5ldyBlLkJ1Z3NuYWdSZXBvcnQoJ3dpbmRvdy5vbmVycm9yJywgU3RyaW5nKGEpLCBSdChlLkJ1Z3NuYWdSZXBvcnQuZ2V0U3RhY2t0cmFjZShhLCAxKSwgciwgaSwgbyksIHMpKS51cGRhdGVNZXRhRGF0YSgnd2luZG93IG9uZXJyb3InLCB7IGVycm9yOiBhIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuIHx8IG51bGwgPT09IG4gfHwgciB8fCBpIHx8IG8gfHwgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUgPSBuZXcgZS5CdWdzbmFnUmVwb3J0KCd3aW5kb3cub25lcnJvcicsIFN0cmluZyhuKSwgUnQoZS5CdWdzbmFnUmVwb3J0LmdldFN0YWNrdHJhY2UoYSwgMSksIHIsIGksIG8pLCBzKSkudXBkYXRlTWV0YURhdGEoJ3dpbmRvdyBvbmVycm9yJywgeyBldmVudDogbiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuLnR5cGUgPyAnRXZlbnQ6ICcgKyBuLnR5cGUgOiAnd2luZG93Lm9uZXJyb3InLCBmID0gbi5tZXNzYWdlIHx8IG4uZGV0YWlsIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSA9IG5ldyBlLkJ1Z3NuYWdSZXBvcnQoYywgZiwgZS5CdWdzbmFnUmVwb3J0LmdldFN0YWNrdHJhY2UobmV3IEVycm9yKCksIDEpLnNsaWNlKDEpLCBzKSkudXBkYXRlTWV0YURhdGEoJ3dpbmRvdyBvbmVycm9yJywgeyBldmVudDogbiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ub3RpZnkodSksICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgdChuLCByLCBpLCBvLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBSdCA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlWzBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpID8gKGkuZmlsZU5hbWUgfHwgaS5zZXRGaWxlTmFtZSh0KSwgaS5saW5lTnVtYmVyIHx8IGkuc2V0TGluZU51bWJlcihuKSwgaS5jb2x1bW5OdW1iZXIgfHwgKHIgIT09IHVuZGVmaW5lZCA/IGkuc2V0Q29sdW1uTnVtYmVyKHIpIDogd2luZG93LmV2ZW50ICYmIHdpbmRvdy5ldmVudC5lcnJvckNoYXJhY3RlciAmJiBpLnNldENvbHVtbk51bWJlcih3aW5kb3cuZXZlbnQgJiYgd2luZG93LmV2ZW50LmVycm9yQ2hhcmFjdGVyKSksIGUpIDogZTsKICAgICAgICAgICAgICAgIH0sIGt0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaChlKSwgdCwgbik7CiAgICAgICAgICAgICAgICB9LCBCdCA9IDIwLCBEdCA9IDI1MDAwLCB4dCA9IDgsIEx0ID0gJy4uLicsIF90ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGt0KGUpOwogICAgICAgICAgICAgICAgICAgIGlmICh0Lmxlbmd0aCA+IDEwMDAwMDAgJiYgKGRlbGV0ZSBlLmV2ZW50c1swXS5tZXRhRGF0YSwgZS5ldmVudHNbMF0ubWV0YURhdGEgPSB7IG5vdGlmaWVyOiAnV0FSTklORyFcblNlcmlhbGl6ZWQgcGF5bG9hZCB3YXMgJyArIHQubGVuZ3RoIC8gMTAwMDAwMCArICdNQiAobGltaXQgPSAxTUIpXG5tZXRhRGF0YSB3YXMgcmVtb3ZlZCcgfSwgKHQgPSBrdChlKSkubGVuZ3RoID4gMTAwMDAwMCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGF5bG9hZCBleGNlZWRlZCAxTUIgbGltaXQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0sIEN0ID0ge30sIHF0ID0gdy5pc29EYXRlOwogICAgICAgICAgICBDdCA9IHsKICAgICAgICAgICAgICAgIHNlbmRSZXBvcnQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IFR0KHQsICdub3RpZnknLCAnNC4wJyksIG8gPSBuZXcgd2luZG93LlhEb21haW5SZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgby5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIobnVsbCwgby5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgIH0sIG8ub3BlbignUE9TVCcsIGkpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uc2VuZChfdChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZW5kU2Vzc2lvbjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gVHQodCwgJ3Nlc3Npb25zJywgJzEuMCcpLCBvID0gbmV3IHdpbmRvdy5YRG9tYWluUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgIG8ub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByKG51bGwsIG8ucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgICAgICB9LCBvLm9wZW4oJ1BPU1QnLCBpKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnNlbmQoa3QobikpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBUdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF0KGUuZW5kcG9pbnRzW3RdLCB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wpICsgJz9hcGlLZXk9JyArIGVuY29kZVVSSUNvbXBvbmVudChlLmFwaUtleSkgKyAnJnBheWxvYWRWZXJzaW9uPScgKyBuICsgJyZzZW50QXQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChxdCgpKTsKICAgICAgICAgICAgICAgIH0sIEF0ID0gQ3QuX21hdGNoUGFnZVByb3RvY29sID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2h0dHA6JyA9PT0gdCA/IGUucmVwbGFjZSgvXmh0dHBzOi8sICdodHRwOicpIDogZTsKICAgICAgICAgICAgICAgIH0sIE10ID0gdy5pc29EYXRlLCBQdCA9IHsKICAgICAgICAgICAgICAgICAgICBzZW5kUmVwb3J0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmVuZHBvaW50cy5ub3RpZnksIG8gPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnJlYWR5U3RhdGUgPT09IHdpbmRvdy5YTUxIdHRwUmVxdWVzdC5ET05FICYmIHIobnVsbCwgby5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5vcGVuKCdQT1NUJywgaSksIG8uc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgby5zZXRSZXF1ZXN0SGVhZGVyKCdCdWdzbmFnLUFwaS1LZXknLCBuLmFwaUtleSB8fCB0LmFwaUtleSksIG8uc2V0UmVxdWVzdEhlYWRlcignQnVnc25hZy1QYXlsb2FkLVZlcnNpb24nLCAnNC4wJyksIG8uc2V0UmVxdWVzdEhlYWRlcignQnVnc25hZy1TZW50LUF0JywgTXQoKSksIG8uc2VuZChfdChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXJyb3IoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNlbmRTZXNzaW9uOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzRiMWQ0OTBhMTMyZGIyYmMgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKSwgJF9fX29sZF9lMmE1NWZjMWZkNmQ0YTIzID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80YjFkNDkwYTEzMmRiMmJjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2IzNjE1ZTNkMjRmYjlkMzAuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2UyYTU1ZmMxZmQ2ZDRhMjMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmVuZHBvaW50cy5zZXNzaW9ucywgbyA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzRiYmQzZjEwNjQ0OTViZjYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNGJiZDNmMTA2NDQ5NWJmNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ucmVhZHlTdGF0ZSA9PT0gd2luZG93LlhNTEh0dHBSZXF1ZXN0LkRPTkUgJiYgcihudWxsLCBvLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80YmJkM2YxMDY0NDk1YmY2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzRiYmQzZjEwNjQ0OTViZjYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5vcGVuKCdQT1NUJywgaSksIG8uc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKSwgby5zZXRSZXF1ZXN0SGVhZGVyKCdCdWdzbmFnLUFwaS1LZXknLCB0LmFwaUtleSksIG8uc2V0UmVxdWVzdEhlYWRlcignQnVnc25hZy1QYXlsb2FkLVZlcnNpb24nLCAnMS4wJyksIG8uc2V0UmVxdWVzdEhlYWRlcignQnVnc25hZy1TZW50LUF0JywgTXQoKSksIG8uc2VuZChrdChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmVycm9yKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzRiMWQ0OTBhMTMyZGIyYmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF80YjFkNDkwYTEzMmRiMmJjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9lMmE1NWZjMWZkNmQ0YTIzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfZTJhNTVmYzFmZDZkNGEyMykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgVnQgPSB7fSwgSHQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0sIFV0ID0gdy5tYXAsIEl0ID0gdy5yZWR1Y2UsICR0ID0gSHQoe30sIE4uc2NoZW1hLCBSZSksIEZ0ID0gWwogICAgICAgICAgICAgICAgICAgIE50LAogICAgICAgICAgICAgICAgICAgIHd0LAogICAgICAgICAgICAgICAgICAgIEFlLAogICAgICAgICAgICAgICAgICAgIENlLAogICAgICAgICAgICAgICAgICAgIGN0LAogICAgICAgICAgICAgICAgICAgIE9lLAogICAgICAgICAgICAgICAgICAgIEJlLAogICAgICAgICAgICAgICAgICAgIFllLAogICAgICAgICAgICAgICAgICAgIFhlLAogICAgICAgICAgICAgICAgICAgIEllLAogICAgICAgICAgICAgICAgICAgIE1lLAogICAgICAgICAgICAgICAgICAgIHB0LAogICAgICAgICAgICAgICAgICAgIEtlLAogICAgICAgICAgICAgICAgICAgIG10CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICBWdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107CiAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAoZSA9IHsgYXBpS2V5OiBlIH0pOwogICAgICAgICAgICAgICAgdmFyIG4gPSBbXTsKICAgICAgICAgICAgICAgIGUuc2Vzc2lvblRyYWNraW5nRW5hYmxlZCAmJiAobi5wdXNoKCdkZXByZWNhdGVkIG9wdGlvbiBzZXNzaW9uVHJhY2tpbmdFbmFibGVkIGlzIG5vdyBjYWxsZWQgYXV0b0NhcHR1cmVTZXNzaW9ucycpLCBlLmF1dG9DYXB0dXJlU2Vzc2lvbnMgPSBlLnNlc3Npb25UcmFja2luZ0VuYWJsZWQpLCAhZS5lbmRwb2ludCAmJiAhZS5zZXNzaW9uRW5kcG9pbnQgfHwgZS5lbmRwb2ludHMgfHwgKG4ucHVzaCgnZGVwcmVjYXRlZCBvcHRpb25zIGVuZHBvaW50L3Nlc3Npb25FbmRwb2ludCBhcmUgbm93IGNvbmZpZ3VyZWQgaW4gdGhlIGVuZHBvaW50cyBvYmplY3QnKSwgZS5lbmRwb2ludHMgPSB7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5OiBlLmVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgIHNlc3Npb25zOiBlLnNlc3Npb25FbmRwb2ludAogICAgICAgICAgICAgICAgfSksIGUuZW5kcG9pbnRzICYmIGUuZW5kcG9pbnRzLm5vdGlmeSAmJiAhZS5lbmRwb2ludHMuc2Vzc2lvbnMgJiYgbi5wdXNoKCdub3RpZnkgZW5kcG9pbnQgaXMgc2V0IGJ1dCBzZXNzaW9ucyBlbmRwb2ludCBpcyBub3QuIE5vIHNlc3Npb25zIHdpbGwgYmUgc2VudC4nKTsKICAgICAgICAgICAgICAgIHZhciByID0gSXQoW10uY29uY2F0KEZ0KS5jb25jYXQodCksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbmZpZ1NjaGVtYSA/IEh0KHt9LCBlLCB0LmNvbmZpZ1NjaGVtYSkgOiBlOwogICAgICAgICAgICAgICAgICAgIH0sICR0KSwgaSA9IG5ldyB3ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdCdWdzbmFnIEphdmFTY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnNC43LjMnLAogICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2dpdGh1Yi5jb20vYnVnc25hZy9idWdzbmFnLWpzJwogICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgcmV0dXJuIGkudHJhbnNwb3J0KHdpbmRvdy5YRG9tYWluUmVxdWVzdCA/IEN0IDogUHQpLCBpLmNvbmZpZ3VyZShlKSwgVXQobiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5fbG9nZ2VyLndhcm4oZSk7CiAgICAgICAgICAgICAgICB9KSwgaS51c2UoQWUpLCBpLnVzZShDZSksIGkudXNlKGN0KSwgaS51c2UoTWUpLCBpLnVzZShPZSksIGkudXNlKHB0KSwgaS51c2UoS2UpLCBpLnVzZShtdCksICExICE9PSBpLmNvbmZpZy5hdXRvTm90aWZ5ICYmIChpLnVzZShOdCksIGkudXNlKHd0KSksIEt0KGkuY29uZmlnLCAnbmF2aWdhdGlvbkJyZWFkY3J1bWJzRW5hYmxlZCcpICYmIGkudXNlKFhlKSwgS3QoaS5jb25maWcsICdpbnRlcmFjdGlvbkJyZWFkY3J1bWJzRW5hYmxlZCcpICYmIGkudXNlKEllKSwgS3QoaS5jb25maWcsICduZXR3b3JrQnJlYWRjcnVtYnNFbmFibGVkJykgJiYgaS51c2UoWWUpLCBLdChpLmNvbmZpZywgJ2NvbnNvbGVCcmVhZGNydW1ic0VuYWJsZWQnLCAhMSkgJiYgaS51c2UoQmUpLCBVdCh0LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnVzZShlKTsKICAgICAgICAgICAgICAgIH0pLCBpLmNvbmZpZy5hdXRvQ2FwdHVyZVNlc3Npb25zID8gaS5zdGFydFNlc3Npb24oKSA6IGk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBLdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgbiA9ICEoYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQpIHx8IGFyZ3VtZW50c1syXTsKICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbicgPT0gdHlwZW9mIGVbdF0gPyBlW3RdIDogZS5hdXRvQnJlYWRjcnVtYnMgJiYgKG4gfHwgIS9eZGV2KGVsb3BtZW50KT8kLy50ZXN0KGUucmVsZWFzZVN0YWdlKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBWdC5CdWdzbmFnID0gewogICAgICAgICAgICAgICAgQ2xpZW50OiB3ZSwKICAgICAgICAgICAgICAgIFJlcG9ydDogWCwKICAgICAgICAgICAgICAgIFNlc3Npb246IGFlLAogICAgICAgICAgICAgICAgQnJlYWRjcnVtYjogTwogICAgICAgICAgICB9LCBWdFsnZGVmYXVsdCddID0gVnQsIFZ0OwogICAgICAgIH0pOwogICAgfSgpKQp9"},{"name":"sugarcoat-cmp2","aliases":["sugarcoat-cmp2"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMCA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwKTsKICAgIGNvbnN0ICRfX19tb2NrXzE2YzUzMzk1YTgyMmRiNDggPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgbGV0IGlzU2VhbGVkID0gZmFsc2U7CiAgICAgICAgY2xhc3MgU3RvcmFnZSB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgaWYgKGlzU2VhbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGtleShpbmRleCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBrZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGtleXNbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldEl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIGtleSkgPyB0aGlzW2tleV0gOiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldEl0ZW0oa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1trZXldID0gU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1vdmVJdGVtKGtleSkgewogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogU3RvcmFnZSwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5sb2NhbFN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMuc2Vzc2lvblN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICB9KSgkX19fbW9ja18xNmM1MzM5NWE4MjJkYjQ4KTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIG4ocikgewogICAgICAgICAgICAgICAgaWYgKHRbcl0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbcl0uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciBvID0gdFtyXSA9IHsKICAgICAgICAgICAgICAgICAgICBpOiByLAogICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsIG8sIG8uZXhwb3J0cywgbiksIG8ubCA9ICEwLCBvLmV4cG9ydHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbi5tID0gZSwgbi5jID0gdCwgbi5kID0gZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIG4ubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogcgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIG4uciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICB9LCBuLnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgaWYgKDEgJiB0ICYmIChlID0gbihlKSksIDggJiB0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgaWYgKDQgJiB0ICYmICdvYmplY3QnID09PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgIGlmIChuLnIociksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnZGVmYXVsdCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlCiAgICAgICAgICAgICAgICAgICAgfSksIDIgJiB0ICYmICdzdHJpbmcnICE9IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgbi5kKHIsIG8sIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwsIG8pKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9LCBuLm4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHQgPSBlICYmIGUuX19lc01vZHVsZSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5kZWZhdWx0OwogICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gbi5kKHQsICdhJywgdCksIHQ7CiAgICAgICAgICAgIH0sIG4ubyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIHQpOwogICAgICAgICAgICB9LCBuLnAgPSAnLycsIG4obi5zID0gMTk2KTsKICAgICAgICB9KFsKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4oOTkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgfHwgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByKG4oMTExKSksIHIobigxMTIpKSwgcihuKDExMykpLCByKG4oMTE0KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgfHwgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByKG4oNTQpKSwgcihuKDExNSkpLCByKG4oNTUpKSwgcihuKDU2KSksIHIobigxMTYpKSwgcihuKDExNykpLCByKG4oMzgpKSwgcihuKDU3KSksIHIobigxMTgpKSwgcihuKDExOSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcxKSwgbyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXldJyA9PT0gby5jYWxsKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnID09PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICdvYmplY3QnID09PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBGdW5jdGlvbl0nID09PSBvLmNhbGwoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZSAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIGUgJiYgKGUgPSBbZV0pLCBpKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDAsIHIgPSBlLmxlbmd0aDsgbiA8IHI7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNhbGwobnVsbCwgZVtuXSwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykgJiYgdC5jYWxsKG51bGwsIGVbb10sIG8sIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIGlzQXJyYXk6IGksCiAgICAgICAgICAgICAgICAgICAgaXNBcnJheUJ1ZmZlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEFycmF5QnVmZmVyXScgPT09IG8uY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzQnVmZmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiAhcyhlKSAmJiBudWxsICE9PSBlLmNvbnN0cnVjdG9yICYmICFzKGUuY29uc3RydWN0b3IpICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyICYmIGUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0Zvcm1EYXRhOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBGb3JtRGF0YSAmJiBlIGluc3RhbmNlb2YgRm9ybURhdGE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0FycmF5QnVmZmVyVmlldzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgQXJyYXlCdWZmZXIgJiYgQXJyYXlCdWZmZXIuaXNWaWV3ID8gQXJyYXlCdWZmZXIuaXNWaWV3KGUpIDogZSAmJiBlLmJ1ZmZlciAmJiBlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNTdHJpbmc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc051bWJlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0OiBhLAogICAgICAgICAgICAgICAgICAgIGlzVW5kZWZpbmVkOiBzLAogICAgICAgICAgICAgICAgICAgIGlzRGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IERhdGVdJyA9PT0gby5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNGaWxlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgRmlsZV0nID09PSBvLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0Jsb2I6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBCbG9iXScgPT09IG8uY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb246IGMsCiAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW06IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGUpICYmIGMoZS5waXBlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzVVJMU2VhcmNoUGFyYW1zOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBVUkxTZWFyY2hQYXJhbXMgJiYgZSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtczsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzU3RhbmRhcmRCcm93c2VyRW52OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBuYXZpZ2F0b3IgfHwgJ1JlYWN0TmF0aXZlJyAhPT0gbmF2aWdhdG9yLnByb2R1Y3QgJiYgJ05hdGl2ZVNjcmlwdCcgIT09IG5hdmlnYXRvci5wcm9kdWN0ICYmICdOUycgIT09IG5hdmlnYXRvci5wcm9kdWN0KSAmJiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3aW5kb3cgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JFYWNoOiB1LAogICAgICAgICAgICAgICAgICAgIG1lcmdlOiBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB0eXBlb2YgdFtyXSAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG4gPyB0W3JdID0gZSh0W3JdLCBuKSA6IHRbcl0gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBvID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IG87IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoYXJndW1lbnRzW3JdLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkZWVwTWVyZ2U6IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHR5cGVvZiB0W3JdICYmICdvYmplY3QnID09PSB0eXBlb2YgbiA/IHRbcl0gPSBlKHRbcl0sIG4pIDogdFtyXSA9ICdvYmplY3QnID09PSB0eXBlb2YgbiA/IGUoe30sIG4pIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMCwgbyA9IGFyZ3VtZW50cy5sZW5ndGg7IHIgPCBvOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGFyZ3VtZW50c1tyXSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSh0LCBmdW5jdGlvbiAodCwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtvXSA9IG4gJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHQgPyByKHQsIG4pIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cmltOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC9eXHMqLywgJycpLnJlcGxhY2UoL1xzKiQvLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigyOSksIG8gPSBuKDEwMyksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jbXBJZCwgZGVsZXRlIHRoaXMuY21wVmVyc2lvbiwgZGVsZXRlIHRoaXMuZXZlbnRTdGF0dXMsIGRlbGV0ZSB0aGlzLmdkcHJBcHBsaWVzLCBkZWxldGUgdGhpcy50Y01vZGVsLCBkZWxldGUgdGhpcy50Y1N0cmluZywgZGVsZXRlIHRoaXMudGNmUG9saWN5VmVyc2lvbiwgdGhpcy5jbXBTdGF0dXMgPSByLkNtcFN0YXR1cy5MT0FESU5HLCB0aGlzLmRpc2FibGVkID0gITEsIHRoaXMuZGlzcGxheVN0YXR1cyA9IHIuRGlzcGxheVN0YXR1cy5ISURERU4sIHRoaXMuZXZlbnRRdWV1ZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmFwaVZlcnNpb24gPSAnMicsIGUuZXZlbnRRdWV1ZSA9IG5ldyBvLkV2ZW50TGlzdGVuZXJRdWV1ZSgpLCBlLmNtcFN0YXR1cyA9IHIuQ21wU3RhdHVzLkxPQURJTkcsIGUuZGlzYWJsZWQgPSAhMSwgZS5kaXNwbGF5U3RhdHVzID0gci5EaXNwbGF5U3RhdHVzLkhJRERFTiwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LkNtcEFwaU1vZGVsID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX192YWx1ZXMgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IsIG4gPSB0ICYmIGVbdF0sIHIgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICdudW1iZXInID09IHR5cGVvZiBlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiByID49IGUubGVuZ3RoICYmIChlID0gdm9pZCAwKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZSAmJiBlW3IrK10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICFlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgPyAnT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4nIDogJ1N5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4nKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLCB0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5kZWVwQ2xvbmUoZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHIgJiYgKHRbbl0gPSByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUuZGVlcENsb25lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIG8gPSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInID09PSBvIHx8ICdzdHJpbmcnID09PSBvIHx8ICdib29sZWFuJyA9PT0gbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZSAmJiAnb2JqZWN0JyA9PT0gbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGUuY2xvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZS5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZVtTeW1ib2wuaXRlcmF0b3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gcihlKSwgYSA9IHMubmV4dCgpOyAhYS5kb25lOyBhID0gcy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaCh0aGlzLmRlZXBDbG9uZShjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB7IGVycm9yOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgIWEuZG9uZSAmJiAobiA9IHMucmV0dXJuKSAmJiBuLmNhbGwocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0LmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQXJyYXkgPyBpIDogbmV3IGUuY29uc3RydWN0b3IoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkocCkgJiYgKHVbcF0gPSB0aGlzLmRlZXBDbG9uZShlW3BdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LkNsb25lYWJsZSA9IG87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig1KSwgbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5lbmNvZGUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgKGUgPSBwYXJzZUludChlLCAxMCkpLCAobiA9IGUudG9TdHJpbmcoMikpLmxlbmd0aCA+IHQgfHwgZSA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHIuRW5jb2RpbmdFcnJvcihlICsgJyB0b28gbGFyZ2UgdG8gZW5jb2RlIGludG8gJyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubGVuZ3RoIDwgdCAmJiAobiA9ICcwJy5yZXBlYXQodCAtIG4ubGVuZ3RoKSArIG4pLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmRlY29kZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPT0gZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHIuRGVjb2RpbmdFcnJvcignaW52YWxpZCBiaXQgbGVuZ3RoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5JbnRFbmNvZGVyID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCwgbiksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gbiA/IE9iamVjdC5jcmVhdGUobikgOiAoci5wcm90b3R5cGUgPSBuLnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpLCBvID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IChuIHx8IChuID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChvLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKHIubmV4dChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoci50aHJvdyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZG9uZSA/IG8oZS52YWx1ZSkgOiAodCA9IGUudmFsdWUsIHQgaW5zdGFuY2VvZiBuID8gdCA6IG5ldyBuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLnRoZW4ocywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKChyID0gci5hcHBseShlLCB0IHx8IFtdKSkubmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgaSA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgaSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxICYgb1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5czogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBhKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c6IGEoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm46IGEoMikKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIChpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgczspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gMSwgciAmJiAobyA9IDIgJiBpWzBdID8gci5yZXR1cm4gOiBpWzBdID8gci50aHJvdyB8fCAoKG8gPSByLnJldHVybikgJiYgby5jYWxsKHIpLCAwKSA6IHIubmV4dCkgJiYgIShvID0gby5jYWxsKHIsIGlbMV0pKS5kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIgPSAwLCBvICYmIChpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAmIGlbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBpWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMubGFiZWwrKywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCsrLCByID0gaVsxXSwgaSA9IFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcy5vcHMucG9wKCksIHMudHJ5cy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKG8gPSAobyA9IHMudHJ5cykubGVuZ3RoID4gMCAmJiBvW28ubGVuZ3RoIC0gMV0pIHx8IDYgIT09IGlbMF0gJiYgMiAhPT0gaVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDMgPT09IGlbMF0gJiYgKCFvIHx8IGlbMV0gPiBvWzBdICYmIGlbMV0gPCBvWzNdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCA9IGlbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNiA9PT0gaVswXSAmJiBzLmxhYmVsIDwgb1sxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCA9IG9bMV0sIG8gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgcy5sYWJlbCA8IG9bMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGFiZWwgPSBvWzJdLCBzLm9wcy5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1syXSAmJiBzLm9wcy5wb3AoKSwgcy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQuY2FsbChlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgciA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDUgJiBpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpWzBdID8gaVsxXSA6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IG4oMTUpLCBhID0gbig1KSwgYyA9IG4oNjUpLCB1ID0gbig2KSwgcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNSZWFkeV8gPSAhMSwgci5pc0xhdGVzdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0LmJhc2VVcmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5sYW5nXyA9IHQuREVGQVVMVF9MQU5HVUFHRSwgci5pc1ZlbmRvckxpc3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wb3B1bGF0ZShuKSwgci5yZWFkeVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGEuR1ZMRXJyb3IoJ211c3Qgc3BlY2lmeSBHVkwuYmFzZVVybCBiZWZvcmUgbG9hZGluZyBHVkwganNvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuQ0FDSEUuaGFzKGkpID8gKHIucG9wdWxhdGUodC5DQUNIRS5nZXQoaSkpLCByLnJlYWR5UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpKSA6IChvICs9IHQudmVyc2lvbmVkRmlsZW5hbWUucmVwbGFjZSgnW1ZFUlNJT05dJywgaSArICcnKSwgci5yZWFkeVByb21pc2UgPSByLmZldGNoSnNvbihvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuQ0FDSEUuaGFzKHQuTEFURVNUX0NBQ0hFX0tFWSkgPyAoci5wb3B1bGF0ZSh0LkNBQ0hFLmdldCh0LkxBVEVTVF9DQUNIRV9LRVkpKSwgci5yZWFkeVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKSkgOiAoci5pc0xhdGVzdCA9ICEwLCByLnJlYWR5UHJvbWlzZSA9IHIuZmV0Y2hKc29uKG8gKyB0LmxhdGVzdEZpbGVuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdiYXNlVXJsJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXmh0dHBzPzpcL1wvdmVuZG9ybGlzdFwuY29uc2Vuc3VcLm9yZ1wvLy50ZXN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYS5HVkxFcnJvcignSW52YWxpZCBiYXNlVXJsISAgWW91IG1heSBub3QgcHVsbCBkaXJlY3RseSBmcm9tIHZlbmRvcmxpc3QuY29uc2Vuc3Uub3JnIGFuZCBtdXN0IHByb3ZpZGUgeW91ciBvd24gY2FjaGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxlbmd0aCA+IDAgJiYgJy8nICE9PSBlW2UubGVuZ3RoIC0gMV0gJiYgKGUgKz0gJy8nKSwgdGhpcy5iYXNlVXJsXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmVtcHR5TGFuZ3VhZ2VDYWNoZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSAmJiB0LkxBTkdVQUdFX0NBQ0hFLnNpemUgPiAwID8gKHQuTEFOR1VBR0VfQ0FDSEUgPSBuZXcgTWFwKCksIG4gPSAhMCkgOiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiB0aGlzLmNvbnNlbnRMYW5ndWFnZXMuaGFzKGUudG9VcHBlckNhc2UoKSkgJiYgKHQuTEFOR1VBR0VfQ0FDSEUuZGVsZXRlKGUudG9VcHBlckNhc2UoKSksIG4gPSAhMCksIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZW1wdHlDYWNoZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoZSkgJiYgZSA+PSAwID8gKHQuQ0FDSEUuZGVsZXRlKGUpLCBuID0gITApIDogdm9pZCAwID09PSBlICYmICh0LkNBQ0hFID0gbmV3IE1hcCgpLCBuID0gITApLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5jYWNoZUxhbmd1YWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5MQU5HVUFHRV9DQUNIRS5oYXModGhpcy5sYW5nXykgfHwgdC5MQU5HVUFHRV9DQUNIRS5zZXQodGhpcy5sYW5nXywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiB0aGlzLnB1cnBvc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3NlczogdGhpcy5zcGVjaWFsUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEZlYXR1cmVzOiB0aGlzLnNwZWNpYWxGZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3M6IHRoaXMuc3RhY2tzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZmV0Y2hKc29uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodGhpcywgZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnRyeXMucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdCA9IHRoaXMucG9wdWxhdGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuSnNvbi5mZXRjaChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYXBwbHkodGhpcywgW3Iuc2VudCgpXSksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG4gPSByLnNlbnQoKSwgbmV3IGEuR1ZMRXJyb3Iobi5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldEpzb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsU3BlY2lmaWNhdGlvblZlcnNpb246IHRoaXMuZ3ZsU3BlY2lmaWNhdGlvblZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGlzdFZlcnNpb246IHRoaXMudmVuZG9yTGlzdFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNmUG9saWN5VmVyc2lvbjogdGhpcy50Y2ZQb2xpY3lWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiB0aGlzLmxhc3RVcGRhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiB0aGlzLnB1cnBvc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3NlczogdGhpcy5zcGVjaWFsUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEZlYXR1cmVzOiB0aGlzLnNwZWNpYWxGZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3M6IHRoaXMuc3RhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcnM6IHRoaXMuZnVsbFZlbmRvckxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuY2hhbmdlTGFuZ3VhZ2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8odGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgcywgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0aGlzLCBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPSBlLnRvVXBwZXJDYXNlKCksICF0LmNvbnNlbnRMYW5ndWFnZXMuaGFzKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHRoaXMubGFuZ18pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYW5nXyA9IG4sICF0LkxBTkdVQUdFX0NBQ0hFLmhhcyhuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobyBpbiByID0gdC5MQU5HVUFHRV9DQUNIRS5nZXQobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oYXNPd25Qcm9wZXJ0eShvKSAmJiAodGhpc1tvXSA9IHJbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0LmJhc2VVcmwgKyB0Lmxhbmd1YWdlRmlsZW5hbWUucmVwbGFjZSgnW0xBTkddJywgZSksIGkubGFiZWwgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS50cnlzLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hKc29uKHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zZW50KCksIHRoaXMuY2FjaGVMYW5ndWFnZSgpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBjID0gaS5zZW50KCksIG5ldyBhLkdWTEVycm9yKCd1bmFibGUgdG8gbG9hZCBsYW5ndWFnZTogJyArIGMubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYS5HVkxFcnJvcigndW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAnbGFuZ3VhZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQucHJvdG90eXBlLmlzVmVuZG9yTGlzdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlICYmIHZvaWQgMCAhPT0gZS52ZW5kb3JzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VzID0gZS5wdXJwb3NlcywgdGhpcy5zcGVjaWFsUHVycG9zZXMgPSBlLnNwZWNpYWxQdXJwb3NlcywgdGhpcy5mZWF0dXJlcyA9IGUuZmVhdHVyZXMsIHRoaXMuc3BlY2lhbEZlYXR1cmVzID0gZS5zcGVjaWFsRmVhdHVyZXMsIHRoaXMuc3RhY2tzID0gZS5zdGFja3MsIHRoaXMuaXNWZW5kb3JMaXN0KGUpICYmICh0aGlzLmd2bFNwZWNpZmljYXRpb25WZXJzaW9uID0gZS5ndmxTcGVjaWZpY2F0aW9uVmVyc2lvbiwgdGhpcy50Y2ZQb2xpY3lWZXJzaW9uID0gZS50Y2ZQb2xpY3lWZXJzaW9uLCB0aGlzLnZlbmRvckxpc3RWZXJzaW9uID0gZS52ZW5kb3JMaXN0VmVyc2lvbiwgdGhpcy5sYXN0VXBkYXRlZCA9IGUubGFzdFVwZGF0ZWQsICdzdHJpbmcnID09IHR5cGVvZiB0aGlzLmxhc3RVcGRhdGVkICYmICh0aGlzLmxhc3RVcGRhdGVkID0gbmV3IERhdGUodGhpcy5sYXN0VXBkYXRlZCkpLCB0aGlzLnZlbmRvcnNfID0gZS52ZW5kb3JzLCB0aGlzLmZ1bGxWZW5kb3JMaXN0ID0gZS52ZW5kb3JzLCB0aGlzLm1hcFZlbmRvcnMoKSwgdGhpcy5pc1JlYWR5XyA9ICEwLCB0aGlzLmlzTGF0ZXN0ICYmIHQuQ0FDSEUuc2V0KHQuTEFURVNUX0NBQ0hFX0tFWSwgdGhpcy5nZXRKc29uKCkpLCB0LkNBQ0hFLmhhcyh0aGlzLnZlbmRvckxpc3RWZXJzaW9uKSB8fCB0LkNBQ0hFLnNldCh0aGlzLnZlbmRvckxpc3RWZXJzaW9uLCB0aGlzLmdldEpzb24oKSkpLCB0aGlzLmNhY2hlTGFuZ3VhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUubWFwVmVuZG9ycyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5UHVycG9zZVZlbmRvck1hcCA9IHt9LCB0aGlzLmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXAgPSB7fSwgdGhpcy5ieUZlYXR1cmVWZW5kb3JNYXAgPSB7fSwgdGhpcy5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwID0ge30sIE9iamVjdC5rZXlzKHRoaXMucHVycG9zZXMpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJ5UHVycG9zZVZlbmRvck1hcFtlXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnSW50OiBuZXcgU2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnQ6IG5ldyBTZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleGlibGU6IG5ldyBTZXQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXModGhpcy5zcGVjaWFsUHVycG9zZXMpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXBbZV0gPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXModGhpcy5mZWF0dXJlcykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYnlGZWF0dXJlVmVuZG9yTWFwW2VdID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5rZXlzKHRoaXMuc3BlY2lhbEZlYXR1cmVzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwW2VdID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEFycmF5LmlzQXJyYXkoZSkgfHwgKGUgPSBPYmplY3Qua2V5cyh0aGlzLmZ1bGxWZW5kb3JMaXN0KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gK2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMudmVuZG9ySWRzID0gbmV3IFNldChlKSwgdGhpcy52ZW5kb3JzXyA9IGUucmVkdWNlKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LnZlbmRvcnNfWycnICsgbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgdm9pZCAwID09PSByLmRlbGV0ZWREYXRlICYmIChyLnB1cnBvc2VzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5ieVB1cnBvc2VWZW5kb3JNYXBbZSArICcnXS5jb25zZW50LmFkZChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5zcGVjaWFsUHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXBbZSArICcnXS5hZGQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIubGVnSW50UHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJ5UHVycG9zZVZlbmRvck1hcFtlICsgJyddLmxlZ0ludC5hZGQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIuZmxleGlibGVQdXJwb3NlcyAmJiByLmZsZXhpYmxlUHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJ5UHVycG9zZVZlbmRvck1hcFtlICsgJyddLmZsZXhpYmxlLmFkZChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5mZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYnlGZWF0dXJlVmVuZG9yTWFwW2UgKyAnJ10uYWRkKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLnNwZWNpYWxGZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYnlTcGVjaWFsRmVhdHVyZVZlbmRvck1hcFtlICsgJyddLmFkZChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZVtuXSA9IHIpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5nZXRGaWx0ZXJlZFZlbmRvcnMgPSBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzLCBpID0gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGUuc2xpY2UoMSksIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ3B1cnBvc2UnID09PSBlICYmIG4gPyB0aGlzWydieScgKyBpICsgJ1ZlbmRvck1hcCddW3QgKyAnJ11bbl0gOiB0aGlzWydieScgKyAociA/ICdTcGVjaWFsJyA6ICcnKSArIGkgKyAnVmVuZG9yTWFwJ11bdCArICcnXSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbZSArICcnXSA9IG8udmVuZG9yc1tlICsgJyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoQ29uc2VudFB1cnBvc2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgZSwgJ2NvbnNlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhMZWdJbnRQdXJwb3NlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkVmVuZG9ycygncHVycG9zZScsIGUsICdsZWdJbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhGbGV4aWJsZVB1cnBvc2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgZSwgJ2ZsZXhpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoU3BlY2lhbFB1cnBvc2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgZSwgdm9pZCAwLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoRmVhdHVyZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoJ2ZlYXR1cmUnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhTcGVjaWFsRmVhdHVyZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoJ2ZlYXR1cmUnLCBlLCB2b2lkIDAsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAndmVuZG9ycycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlbmRvcnNfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5wcm90b3R5cGUubmFycm93VmVuZG9yc1RvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmVuZG9ycyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAnaXNSZWFkeScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUmVhZHlfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHQodGhpcy5nZXRKc29uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmlzSW5zdGFuY2VPZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5uYXJyb3dWZW5kb3JzVG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuTEFOR1VBR0VfQ0FDSEUgPSBuZXcgTWFwKCksIHQuQ0FDSEUgPSBuZXcgTWFwKCksIHQuTEFURVNUX0NBQ0hFX0tFWSA9IDAsIHQuREVGQVVMVF9MQU5HVUFHRSA9ICdFTicsIHQuY29uc2VudExhbmd1YWdlcyA9IG5ldyB1LkNvbnNlbnRMYW5ndWFnZXMoKSwgdC5sYXRlc3RGaWxlbmFtZSA9ICd2ZW5kb3ItbGlzdC5qc29uJywgdC52ZXJzaW9uZWRGaWxlbmFtZSA9ICdhcmNoaXZlcy92ZW5kb3ItbGlzdC12W1ZFUlNJT05dLmpzb24nLCB0Lmxhbmd1YWdlRmlsZW5hbWUgPSAncHVycG9zZXMtW0xBTkddLmpzb24nLCB0OwogICAgICAgICAgICAgICAgICAgIH0ocy5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgdC5HVkwgPSBwOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzYpLCBvID0gbig2KSwgaSA9IG4oMTYpLCBzID0gbigzMyksIGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBvLCBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IHIuU2VtYW50aWNQcmVFbmNvZGVyLnByb2Nlc3MoZSwgdCksIChvID0gQXJyYXkuaXNBcnJheShudWxsID09PSAobiA9IHQpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uc2VnbWVudHMpID8gdC5zZWdtZW50cyA6IG5ldyByLlNlZ21lbnRTZXF1ZW5jZShlLCB0KVsnJyArIGUudmVyc2lvbl0pLmZvckVhY2goZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPCBvLmxlbmd0aCAtIDEgJiYgKHMgPSAnLicpLCBpICs9IHIuU2VnbWVudEVuY29kZXIuZW5jb2RlKGUsIHQpICsgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmRlY29kZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuc3BsaXQoJy4nKSwgYSA9IG4ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB8fCAodCA9IG5ldyBzLlRDTW9kZWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGE7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gbltjXSwgcCA9IHIuQmFzZTY0VXJsLmRlY29kZSh1LmNoYXJBdCgwKSkuc3Vic3RyKDAsIHIuQml0TGVuZ3RoLnNlZ21lbnRUeXBlKSwgbCA9IG8uU2VnbWVudElEcy5JRF9UT19LRVlbaS5JbnRFbmNvZGVyLmRlY29kZShwLCByLkJpdExlbmd0aC5zZWdtZW50VHlwZSkudG9TdHJpbmcoKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5TZWdtZW50RW5jb2Rlci5kZWNvZGUodSwgdCwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LlRDU3RyaW5nID0gYTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5lbmNvZGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gK2UgKyAnJzsKICAgICAgICAgICAgICAgICAgICB9LCBlLmRlY29kZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnMScgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuQm9vbGVhbkVuY29kZXIgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pIHx8ICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgcihuKDQ5KSksIHIobigxMDQpKSwgcihuKDEwNSkpLCByKG4oMjgpKSwgcihuKDUwKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMyk7CiAgICAgICAgICAgICAgICB0LlJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY21wSWQgPSByLkNtcEFwaU1vZGVsLmNtcElkLCB0aGlzLmNtcFZlcnNpb24gPSByLkNtcEFwaU1vZGVsLmNtcFZlcnNpb24sIHRoaXMuZ2RwckFwcGxpZXMgPSByLkNtcEFwaU1vZGVsLmdkcHJBcHBsaWVzLCB0aGlzLnRjZlBvbGljeVZlcnNpb24gPSByLkNtcEFwaU1vZGVsLnRjZlBvbGljeVZlcnNpb247CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pIHx8ICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgcihuKDEwMCkpLCByKG4oMTAxKSksIHIobigxMDIpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IG4oMzEpLCBpID0gbigyNyksIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLnJlc3BvbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZQYXJhbUludmFsaWQoKSwgdGhpcy5pbnZva2VDYWxsYmFjayhuZXcgaS5UQ0RhdGEodGhpcy5wYXJhbSwgdGhpcy5saXN0ZW5lcklkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRocm93SWZQYXJhbUludmFsaWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh2b2lkIDAgPT09IHRoaXMucGFyYW0gfHwgQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtKSAmJiB0aGlzLnBhcmFtLmV2ZXJ5KE51bWJlci5pc0ludGVnZXIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUGFyYW1ldGVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfShvLkNvbW1hbmQpOwogICAgICAgICAgICAgICAgdC5HZXRUQ0RhdGFDb21tYW5kID0gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VjY2VzcyA9ICEwLCBPYmplY3QuYXNzaWduKHRoaXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJJZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogcgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUNhbGxiYWNrKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5pbnZva2VDYWxsYmFjayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbnVsbCAhPT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdGhpcy5uZXh0ID8gdGhpcy5jYWxsYmFjayh0aGlzLm5leHQsIGUsIHQpIDogdGhpcy5jYWxsYmFjayhlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5Db21tYW5kID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxNSksIGkgPSBuKDUpLCBzID0gbigyMCksIGEgPSBuKDYpLCBjID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaXNTZXJ2aWNlU3BlY2lmaWNfID0gITEsIG4uc3VwcG9ydE9PQl8gPSAhMCwgbi51c2VOb25TdGFuZGFyZFN0YWNrc18gPSAhMSwgbi5wdXJwb3NlT25lVHJlYXRtZW50XyA9ICExLCBuLnB1Ymxpc2hlckNvdW50cnlDb2RlXyA9ICdBQScsIG4udmVyc2lvbl8gPSAyLCBuLmNvbnNlbnRTY3JlZW5fID0gMCwgbi5wb2xpY3lWZXJzaW9uXyA9IDIsIG4uY29uc2VudExhbmd1YWdlXyA9ICdFTicsIG4uY21wSWRfID0gMCwgbi5jbXBWZXJzaW9uXyA9IDAsIG4udmVuZG9yTGlzdFZlcnNpb25fID0gMCwgbi5udW1DdXN0b21QdXJwb3Nlc18gPSAwLCBuLnNwZWNpYWxGZWF0dXJlT3B0aW5zID0gbmV3IGEuVmVjdG9yKCksIG4ucHVycG9zZUNvbnNlbnRzID0gbmV3IGEuVmVjdG9yKCksIG4ucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBuZXcgYS5WZWN0b3IoKSwgbi5wdWJsaXNoZXJDb25zZW50cyA9IG5ldyBhLlZlY3RvcigpLCBuLnB1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBuZXcgYS5WZWN0b3IoKSwgbi5wdWJsaXNoZXJDdXN0b21Db25zZW50cyA9IG5ldyBhLlZlY3RvcigpLCBuLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBuZXcgYS5WZWN0b3IoKSwgbi52ZW5kb3JDb25zZW50cyA9IG5ldyBhLlZlY3RvcigpLCBuLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBuZXcgYS5WZWN0b3IoKSwgbi52ZW5kb3JzRGlzY2xvc2VkID0gbmV3IGEuVmVjdG9yKCksIG4udmVuZG9yc0FsbG93ZWQgPSBuZXcgYS5WZWN0b3IoKSwgbi5wdWJsaXNoZXJSZXN0cmljdGlvbnMgPSBuZXcgYS5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3IoKSwgdCAmJiAobi5ndmwgPSB0KSwgbi5jcmVhdGVkID0gbmV3IERhdGUoKSwgbi51cGRhdGVkKCksIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ2d2bCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmd2bF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuR1ZMLmlzSW5zdGFuY2VPZihlKSB8fCAoZSA9IG5ldyBzLkdWTChlKSksIHRoaXMuZ3ZsXyA9IGUsIHRoaXMucHVibGlzaGVyUmVzdHJpY3Rpb25zLmd2bCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdjbXBJZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNtcElkXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcigrZSkgJiYgZSA+IDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoJ2NtcElkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbXBJZF8gPSArZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ2NtcFZlcnNpb24nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbXBWZXJzaW9uXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcigrZSkgJiYgZSA+IC0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGkuVENNb2RlbEVycm9yKCdjbXBWZXJzaW9uJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbXBWZXJzaW9uXyA9ICtlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAnY29uc2VudFNjcmVlbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnNlbnRTY3JlZW5fOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShOdW1iZXIuaXNJbnRlZ2VyKCtlKSAmJiBlID4gLTEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoJ2NvbnNlbnRTY3JlZW4nLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnNlbnRTY3JlZW5fID0gK2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdjb25zZW50TGFuZ3VhZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zZW50TGFuZ3VhZ2VfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnNlbnRMYW5ndWFnZV8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAncHVibGlzaGVyQ291bnRyeUNvZGUnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdWJsaXNoZXJDb3VudHJ5Q29kZV87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghL14oW0Etel0pezJ9JC8udGVzdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGkuVENNb2RlbEVycm9yKCdwdWJsaXNoZXJDb3VudHJ5Q29kZScsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaGVyQ291bnRyeUNvZGVfID0gZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAndmVuZG9yTGlzdFZlcnNpb24nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ndmwgPyB0aGlzLmd2bC52ZW5kb3JMaXN0VmVyc2lvbiA6IHRoaXMudmVuZG9yTGlzdFZlcnNpb25fOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSArZSA+PiAwKSA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBpLlRDTW9kZWxFcnJvcigndmVuZG9yTGlzdFZlcnNpb24nLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvckxpc3RWZXJzaW9uXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdwb2xpY3lWZXJzaW9uJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ZsID8gdGhpcy5ndmwudGNmUG9saWN5VmVyc2lvbiA6IHRoaXMucG9saWN5VmVyc2lvbl87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvbGljeVZlcnNpb25fID0gcGFyc2VJbnQoZSwgMTApLCB0aGlzLnBvbGljeVZlcnNpb25fIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGkuVENNb2RlbEVycm9yKCdwb2xpY3lWZXJzaW9uJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICd2ZXJzaW9uJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbl87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbl8gPSBwYXJzZUludChlLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdpc1NlcnZpY2VTcGVjaWZpYycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU2VydmljZVNwZWNpZmljXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NlcnZpY2VTcGVjaWZpY18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAndXNlTm9uU3RhbmRhcmRTdGFja3MnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51c2VOb25TdGFuZGFyZFN0YWNrc187CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlTm9uU3RhbmRhcmRTdGFja3NfID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ3N1cHBvcnRPT0InLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdXBwb3J0T09CXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0T09CXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdwdXJwb3NlT25lVHJlYXRtZW50JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVycG9zZU9uZVRyZWF0bWVudF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVycG9zZU9uZVRyZWF0bWVudF8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5wcm90b3R5cGUuc2V0QWxsVmVuZG9yQ29uc2VudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvckNvbnNlbnRzLnNldCh0aGlzLmd2bC52ZW5kb3JzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudW5zZXRBbGxWZW5kb3JDb25zZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yQ29uc2VudHMuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc2V0QWxsVmVuZG9yc0Rpc2Nsb3NlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yc0Rpc2Nsb3NlZC5zZXQodGhpcy5ndmwudmVuZG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVuc2V0QWxsVmVuZG9yc0Rpc2Nsb3NlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yc0Rpc2Nsb3NlZC5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5zZXRBbGxWZW5kb3JzQWxsb3dlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yc0FsbG93ZWQuc2V0KHRoaXMuZ3ZsLnZlbmRvcnMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS51bnNldEFsbFZlbmRvcnNBbGxvd2VkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZW5kb3JzQWxsb3dlZC5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5zZXRBbGxWZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLnNldCh0aGlzLmd2bC52ZW5kb3JzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudW5zZXRBbGxWZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnNldEFsbFB1cnBvc2VDb25zZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVycG9zZUNvbnNlbnRzLnNldCh0aGlzLmd2bC5wdXJwb3Nlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVuc2V0QWxsUHVycG9zZUNvbnNlbnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXJwb3NlQ29uc2VudHMuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc2V0QWxsUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLnNldCh0aGlzLmd2bC5wdXJwb3Nlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVuc2V0QWxsUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnNldEFsbFNwZWNpYWxGZWF0dXJlT3B0aW5zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsRmVhdHVyZU9wdGlucy5zZXQodGhpcy5ndmwuc3BlY2lhbEZlYXR1cmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudW5zZXRBbGxTcGVjaWFsRmVhdHVyZU9wdGlucyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbEZlYXR1cmVPcHRpbnMuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc2V0QWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBbGxWZW5kb3JDb25zZW50cygpLCB0aGlzLnNldEFsbFB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzKCksIHRoaXMuc2V0QWxsU3BlY2lhbEZlYXR1cmVPcHRpbnMoKSwgdGhpcy5zZXRBbGxQdXJwb3NlQ29uc2VudHMoKSwgdGhpcy5zZXRBbGxWZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVuc2V0QWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bnNldEFsbFZlbmRvckNvbnNlbnRzKCksIHRoaXMudW5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cygpLCB0aGlzLnVuc2V0QWxsU3BlY2lhbEZlYXR1cmVPcHRpbnMoKSwgdGhpcy51bnNldEFsbFB1cnBvc2VDb25zZW50cygpLCB0aGlzLnVuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdudW1DdXN0b21QdXJwb3NlcycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5udW1DdXN0b21QdXJwb3Nlc187CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09IHR5cGVvZiB0aGlzLmN1c3RvbVB1cnBvc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmtleXModGhpcy5jdXN0b21QdXJwb3Nlcykuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICtlIC0gK3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gcGFyc2VJbnQodC5wb3AoKSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtQ3VzdG9tUHVycG9zZXNfID0gcGFyc2VJbnQoZSwgMTApLCB0aGlzLm51bUN1c3RvbVB1cnBvc2VzXyA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBpLlRDTW9kZWxFcnJvcignbnVtQ3VzdG9tUHVycG9zZXMnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQucHJvdG90eXBlLnVwZGF0ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RVcGRhdGVkID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5jb25zZW50TGFuZ3VhZ2VzID0gcy5HVkwuY29uc2VudExhbmd1YWdlcywgdDsKICAgICAgICAgICAgICAgICAgICB9KG8uQ2xvbmVhYmxlKTsKICAgICAgICAgICAgICAgIHQuVENNb2RlbCA9IGM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pIHx8ICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgcihuKDUzKSksIHIobigzNykpLCByKG4oMTIwKSksIHIobigxMjQpKSwgcihuKDU4KSksIHIobig2NCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNiksIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIG8sIGksIHMsIGEsIGMsIHUsIHAsIGwsIGQsIGYsIGgsIHksIHYsIGcsIG0sIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gci5GaWVsZHMuY21wSWQsIG4gPSByLkZpZWxkcy5jbXBWZXJzaW9uLCBvID0gci5GaWVsZHMuY29uc2VudExhbmd1YWdlLCBpID0gci5GaWVsZHMuY29uc2VudFNjcmVlbiwgcyA9IHIuRmllbGRzLmNyZWF0ZWQsIGEgPSByLkZpZWxkcy5pc1NlcnZpY2VTcGVjaWZpYywgYyA9IHIuRmllbGRzLmxhc3RVcGRhdGVkLCB1ID0gci5GaWVsZHMucG9saWN5VmVyc2lvbiwgcCA9IHIuRmllbGRzLnB1Ymxpc2hlckNvdW50cnlDb2RlLCBsID0gci5GaWVsZHMucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cywgZCA9IHIuRmllbGRzLnB1Ymxpc2hlckNvbnNlbnRzLCBmID0gci5GaWVsZHMucHVycG9zZUNvbnNlbnRzLCBoID0gci5GaWVsZHMucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMsIHkgPSByLkZpZWxkcy5wdXJwb3NlT25lVHJlYXRtZW50LCB2ID0gci5GaWVsZHMuc3BlY2lhbEZlYXR1cmVPcHRpbnMsIGcgPSByLkZpZWxkcy51c2VOb25TdGFuZGFyZFN0YWNrcywgbSA9IHIuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLCBiID0gci5GaWVsZHMudmVyc2lvbiwgZVt0XSA9IDEyLCBlW25dID0gMTIsIGVbb10gPSAxMiwgZVtpXSA9IDYsIGVbc10gPSAzNiwgZVthXSA9IDEsIGVbY10gPSAzNiwgZVt1XSA9IDYsIGVbcF0gPSAxMiwgZVtsXSA9IDI0LCBlW2RdID0gMjQsIGVbZl0gPSAyNCwgZVtoXSA9IDI0LCBlW3ldID0gMSwgZVt2XSA9IDEyLCBlW2ddID0gMSwgZVttXSA9IDEyLCBlW2JdID0gNiwgZS5hbnlCb29sZWFuID0gMSwgZS5lbmNvZGluZ1R5cGUgPSAxLCBlLm1heElkID0gMTYsIGUubnVtQ3VzdG9tUHVycG9zZXMgPSA2LCBlLm51bUVudHJpZXMgPSAxMiwgZS5udW1SZXN0cmljdGlvbnMgPSAxMiwgZS5wdXJwb3NlSWQgPSA2LCBlLnJlc3RyaWN0aW9uVHlwZSA9IDIsIGUuc2VnbWVudFR5cGUgPSAzLCBlLnNpbmdsZU9yUmFuZ2UgPSAxLCBlLnZlbmRvcklkID0gMTYsIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5CaXRMZW5ndGggPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgKHIgPSB0LlJlc3RyaWN0aW9uVHlwZSB8fCAodC5SZXN0cmljdGlvblR5cGUgPSB7fSkpW3IuTk9UX0FMTE9XRUQgPSAwXSA9ICdOT1RfQUxMT1dFRCcsIHJbci5SRVFVSVJFX0NPTlNFTlQgPSAxXSA9ICdSRVFVSVJFX0NPTlNFTlQnLCByW3IuUkVRVUlSRV9MSSA9IDJdID0gJ1JFUVVJUkVfTEknOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjMpLCBvID0gbig1KSwgaSA9IG4oNiksIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAnJywgbyA9IDE7IG8gPD0gdDsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gci5Cb29sZWFuRW5jb2Rlci5lbmNvZGUoZS5oYXMobykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuZGVjb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmxlbmd0aCAhPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgby5EZWNvZGluZ0Vycm9yKCdiaXRmaWVsZCBlbmNvZGluZyBsZW5ndGggbWlzbWF0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBuZXcgaS5WZWN0b3IoKSwgcyA9IDE7IHMgPD0gdDsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuQm9vbGVhbkVuY29kZXIuZGVjb2RlKGVbcyAtIDFdKSAmJiBuLnNldChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmJpdExlbmd0aCA9IGUubGVuZ3RoLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuRml4ZWRWZWN0b3JFbmNvZGVyID0gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pIHx8ICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICB9KG4oNDgpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIChyID0gdC5UQ0ZDb21tYW5kIHx8ICh0LlRDRkNvbW1hbmQgPSB7fSkpLlBJTkcgPSAncGluZycsIHIuR0VUX1RDX0RBVEEgPSAnZ2V0VENEYXRhJywgci5HRVRfSU5fQVBQX1RDX0RBVEEgPSAnZ2V0SW5BcHBUQ0RhdGEnLCByLkdFVF9WRU5ET1JfTElTVCA9ICdnZXRWZW5kb3JMaXN0Jywgci5BRERfRVZFTlRfTElTVEVORVIgPSAnYWRkRXZlbnRMaXN0ZW5lcicsIHIuUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigyOCksIGkgPSBuKDI5KSwgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jbXBTdGF0dXMgPSBpLkNtcFN0YXR1cy5FUlJPUiwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICB9KG8uUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgdC5EaXNhYmxlZCA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgJiYgKGVbbl0gPSB0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgbyA9IHRoaXMgJiYgdGhpcy5fX3JlYWQgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZVtTeW1ib2wuaXRlcmF0b3JdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGkgPSBuLmNhbGwoZSksIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAodm9pZCAwID09PSB0IHx8IHQtLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB1c2goci52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB7IGVycm9yOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgIXIuZG9uZSAmJiAobiA9IGkucmV0dXJuKSAmJiBuLmNhbGwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIGkgPSB0aGlzICYmIHRoaXMuX19zcHJlYWQgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gW10sIHQgPSAwOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUuY29uY2F0KG8oYXJndW1lbnRzW3RdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gbigxMyksIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5ldmVudFN0YXR1cyA9IHMuQ21wQXBpTW9kZWwuZXZlbnRTdGF0dXMsIHIuY21wU3RhdHVzID0gcy5DbXBBcGlNb2RlbC5jbXBTdGF0dXMsIHIubGlzdGVuZXJJZCA9IG4sIHMuQ21wQXBpTW9kZWwuZ2RwckFwcGxpZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHMuQ21wQXBpTW9kZWwudGNNb2RlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRjU3RyaW5nID0gcy5DbXBBcGlNb2RlbC50Y1N0cmluZywgci5pc1NlcnZpY2VTcGVjaWZpYyA9IG8uaXNTZXJ2aWNlU3BlY2lmaWMsIHIudXNlTm9uU3RhbmRhcmRTdGFja3MgPSBvLnVzZU5vblN0YW5kYXJkU3RhY2tzLCByLnB1cnBvc2VPbmVUcmVhdG1lbnQgPSBvLnB1cnBvc2VPbmVUcmVhdG1lbnQsIHIucHVibGlzaGVyQ0MgPSBvLnB1Ymxpc2hlckNvdW50cnlDb2RlLCByLm91dE9mQmFuZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFZlbmRvcnM6IHIuY3JlYXRlVmVjdG9yRmllbGQoby52ZW5kb3JzQWxsb3dlZCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2Nsb3NlZFZlbmRvcnM6IHIuY3JlYXRlVmVjdG9yRmllbGQoby52ZW5kb3JzRGlzY2xvc2VkLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHVycG9zZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudHM6IHIuY3JlYXRlVmVjdG9yRmllbGQoby5wdXJwb3NlQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlSW50ZXJlc3RzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci52ZW5kb3IgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8udmVuZG9yQ29uc2VudHMsIHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlSW50ZXJlc3RzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8udmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cywgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLnNwZWNpYWxGZWF0dXJlT3B0aW5zID0gci5jcmVhdGVWZWN0b3JGaWVsZChvLnNwZWNpYWxGZWF0dXJlT3B0aW5zKSwgci5wdWJsaXNoZXIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVibGlzaGVyQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlSW50ZXJlc3RzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVB1cnBvc2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRzOiByLmNyZWF0ZVZlY3RvckZpZWxkKG8ucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZUludGVyZXN0czogci5jcmVhdGVWZWN0b3JGaWVsZChvLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uczogci5jcmVhdGVSZXN0cmljdGlvbnMoby5wdWJsaXNoZXJSZXN0cmljdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0LnByb3RvdHlwZS5jcmVhdGVSZXN0cmljdGlvbnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm51bVJlc3RyaWN0aW9ucyA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGUuZ2V0TWF4VmVuZG9ySWQoKSwgciA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRSZXN0cmljdGlvbnMobikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUucHVycG9zZUlkLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gfHwgKHRbbl0gPSB7fSksIHRbbl1bcl0gPSBlLnJlc3RyaWN0aW9uVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSAxOyBvIDw9IG47IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5jcmVhdGVWZWN0b3JGaWVsZCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHQucmVkdWNlKGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbbiArICcnXSA9IGUuaGFzKCtuKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KSA6IGkoZSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdFswXS50b1N0cmluZygxMCldID0gdFsxXSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KG4oMjgpLlJlc3BvbnNlKTsKICAgICAgICAgICAgICAgIHQuVENEYXRhID0gYTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fcmVhZCB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgaSA9IG4uY2FsbChlKSwgcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICh2b2lkIDAgPT09IHQgfHwgdC0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmU7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaChyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHsgZXJyb3I6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAhci5kb25lICYmIChuID0gaS5yZXR1cm4pICYmIG4uY2FsbChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG8uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgbyA9IHRoaXMgJiYgdGhpcy5fX3NwcmVhZCB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgdCA9IDA7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5jb25jYXQocihhcmd1bWVudHNbdF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDQ3KSwgcyA9IG4oMTA3KSwgYSA9IG4oMTMpLCBjID0gbig0OSksIHUgPSBuKDEyNyk7CiAgICAgICAgICAgICAgICB0LkFQSV9LRVkgPSAnX190Y2ZhcGknOwogICAgICAgICAgICAgICAgdmFyIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBvOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBpLlRDRkNvbW1hbmQuQUREX0VWRU5UX0xJU1RFTkVSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IChuID0gZSkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbltzXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0J1aWx0LUluIEN1c3RvbSBDb21tbWFuZCBmb3IgJyArIHMgKyAnIG5vdCBhbGxvd2VkOiBVc2UgJyArIGkuVENGQ29tbWFuZC5HRVRfVENfREFUQSArICcgaW5zdGVhZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPSBpLlRDRkNvbW1hbmQuUkVNT1ZFX0VWRU5UX0xJU1RFTkVSLCBudWxsID09PSAociA9IGUpIHx8IHZvaWQgMCA9PT0gciA/IHZvaWQgMCA6IHJbc10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsdC1JbiBDdXN0b20gQ29tbW1hbmQgZm9yICcgKyBzICsgJyBub3QgYWxsb3dlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT09IChvID0gZSkgfHwgdm9pZCAwID09PSBvID8gdm9pZCAwIDogb1tpLlRDRkNvbW1hbmQuR0VUX1RDX0RBVEFdKSAmJiAoZVtpLlRDRkNvbW1hbmQuQUREX0VWRU5UX0xJU1RFTkVSXSA9IGVbaS5UQ0ZDb21tYW5kLkdFVF9UQ19EQVRBXSwgZVtpLlRDRkNvbW1hbmQuUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSA9IGVbaS5UQ0ZDb21tYW5kLkdFVF9UQ19EQVRBXSksIHRoaXMuY3VzdG9tQ29tbWFuZHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxRdWV1ZSA9IHdpbmRvd1t0LkFQSV9LRVldKCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbFF1ZXVlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbdC5BUElfS0VZXSA9IHRoaXMuYXBpQ2FsbC5iaW5kKHRoaXMpLCB0aGlzLnB1cmdlUXVldWVkQ2FsbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcm90b3R5cGUuYXBpQ2FsbCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIHAgPSBbXSwgbCA9IDM7IGwgPCBhcmd1bWVudHMubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW2wgLSAzXSA9IGFyZ3VtZW50c1tsXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbihudWxsLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHUuU3VwcG9ydGVkVmVyc2lvbnMuaGFzKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2sgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuQ21wQXBpTW9kZWwuZGlzYWJsZWQgPyBuKG5ldyBjLkRpc2FibGVkKCksICExKSA6IHRoaXMuaXNDdXN0b21Db21tYW5kKGUpIHx8IHRoaXMuaXNCdWlsdEluQ29tbWFuZChlKSA/IHRoaXMuaXNDdXN0b21Db21tYW5kKGUpICYmICF0aGlzLmlzQnVpbHRJbkNvbW1hbmQoZSkgPyAociA9IHRoaXMuY3VzdG9tQ29tbWFuZHMpW2VdLmFwcGx5KHIsIG8oW25dLCBwKSkgOiBlID09PSBpLlRDRkNvbW1hbmQuUElORyA/IHRoaXMuaXNDdXN0b21Db21tYW5kKGUpID8gbmV3IHMuQ29tbWFuZE1hcFtlXSh0aGlzLmN1c3RvbUNvbW1hbmRzW2VdLCBwWzBdLCBudWxsLCBuKSA6IG5ldyBzLkNvbW1hbmRNYXBbZV0obiwgcFswXSkgOiB2b2lkIDAgPT09IGEuQ21wQXBpTW9kZWwudGNNb2RlbCA/IHRoaXMuY2FsbFF1ZXVlLnB1c2gobyhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHApKSA6IHRoaXMuaXNDdXN0b21Db21tYW5kKGUpICYmIHRoaXMuaXNCdWlsdEluQ29tbWFuZChlKSA/IG5ldyBzLkNvbW1hbmRNYXBbZV0odGhpcy5jdXN0b21Db21tYW5kc1tlXSwgcFswXSwgbnVsbCwgbikgOiBuZXcgcy5Db21tYW5kTWFwW2VdKG4sIHBbMF0pIDogbihudWxsLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbihudWxsLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUucHVyZ2VRdWV1ZWRDYWxscyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNhbGxRdWV1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsUXVldWUgPSBbXSwgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dbdC5BUElfS0VZXS5hcHBseSh3aW5kb3csIG8oZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS5pc0N1c3RvbUNvbW1hbmQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21Db21tYW5kcyAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzLmN1c3RvbUNvbW1hbmRzW2VdOwogICAgICAgICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLmlzQnVpbHRJbkNvbW1hbmQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBzLkNvbW1hbmRNYXBbZV07CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuQ2FsbFJlc3BvbmRlciA9IHA7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgfHwgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByKG4oMzYpKSwgcihuKDUpKSwgcihuKDYpKSwgcihuKDE1KSksIHIobigyMCkpLCByKG4oNjUpKSwgcihuKDMzKSksIHIobigyMSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNSksIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghL15bMC0xXSskLy50ZXN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyByLkVuY29kaW5nRXJyb3IoJ0ludmFsaWQgYml0RmllbGQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5sZW5ndGggJSB0aGlzLkxDTTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gdCA/ICcwJy5yZXBlYXQodGhpcy5MQ00gLSB0KSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9ICcnLCBvID0gMDsgbyA8IGUubGVuZ3RoOyBvICs9IHRoaXMuQkFTSVMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSB0aGlzLkRJQ1RbcGFyc2VJbnQoZS5zdWJzdHIobywgdGhpcy5CQVNJUyksIDIpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmRlY29kZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS9eW0EtWmEtejAtOVwtX10rJC8udGVzdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgci5EZWNvZGluZ0Vycm9yKCdJbnZhbGlkbHkgZW5jb2RlZCBCYXNlNjRVUkwgc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gJycsIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy5SRVZFUlNFX0RJQ1QuZ2V0KGVbbl0pLnRvU3RyaW5nKDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gJzAnLnJlcGVhdCh0aGlzLkJBU0lTIC0gby5sZW5ndGgpICsgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLkRJQ1QgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODktXycsIGUuUkVWRVJTRV9ESUNUID0gbmV3IE1hcChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0onLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ04nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdYJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGUuQkFTSVMgPSA2LCBlLkxDTSA9IDI0LCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuQmFzZTY0VXJsID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudWxsICE9PSBlICYmIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yb290ID0gbnVsbCwgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLmlzRW1wdHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5yb290OwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCA9IHRoaXMucm9vdDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIDwgdC52YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdC5sZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxlZnQgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlID4gdC52YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHQucmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmlnaHQgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IFtdLCB0ID0gdGhpcy5yb290OyB0OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdC5sZWZ0OyBuLnJpZ2h0ICYmIG4ucmlnaHQgIT0gdDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucmlnaHQgPT0gdCA/IChuLnJpZ2h0ID0gbnVsbCwgZS5wdXNoKHQudmFsdWUpLCB0ID0gdC5yaWdodCkgOiAobi5yaWdodCA9IHQsIHQgPSB0LmxlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKHQudmFsdWUpLCB0ID0gdC5yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gITEsIG4gPSB0aGlzLnJvb3Q7IG47KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPiBuLnZhbHVlID8gbiA9IG4ucmlnaHQgOiBlIDwgbi52YWx1ZSAmJiAobiA9IG4ubGVmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUubWluID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodm9pZCAwID09PSBlICYmIChlID0gdGhpcy5yb290KTsgZTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxlZnQgPyBlID0gZS5sZWZ0IDogKHQgPSBlLnZhbHVlLCBlID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLm1heCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZvaWQgMCA9PT0gZSAmJiAoZSA9IHRoaXMucm9vdCk7IGU7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yaWdodCA/IGUgPSBlLnJpZ2h0IDogKHQgPSBlLnZhbHVlLCBlID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IHRoaXMucm9vdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBudWxsLCByID0gJ2xlZnQnOyB0OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIDwgdC52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdCwgdCA9IHQubGVmdCwgciA9ICdsZWZ0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUgPiB0LnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0LCB0ID0gdC5yaWdodCwgciA9ICdyaWdodCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sZWZ0IHx8IHQucmlnaHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmxlZnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5yaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy5taW4odC5yaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUobywgdC5yaWdodCksIHQudmFsdWUgPSBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA/IG5bcl0gPSB0LmxlZnQgOiB0aGlzLnJvb3QgPSB0LmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPyBuW3JdID0gdC5yaWdodCA6IHRoaXMucm9vdCA9IHQucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID8gbltyXSA9IG51bGwgOiB0aGlzLnJvb3QgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KG4oMTUpLkNsb25lYWJsZSk7CiAgICAgICAgICAgICAgICB0LkJpbmFyeVNlYXJjaFRyZWUgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jbXBJZCA9ICdjbXBJZCcsIGUuY21wVmVyc2lvbiA9ICdjbXBWZXJzaW9uJywgZS5jb25zZW50TGFuZ3VhZ2UgPSAnY29uc2VudExhbmd1YWdlJywgZS5jb25zZW50U2NyZWVuID0gJ2NvbnNlbnRTY3JlZW4nLCBlLmNyZWF0ZWQgPSAnY3JlYXRlZCcsIGUuc3VwcG9ydE9PQiA9ICdzdXBwb3J0T09CJywgZS5pc1NlcnZpY2VTcGVjaWZpYyA9ICdpc1NlcnZpY2VTcGVjaWZpYycsIGUubGFzdFVwZGF0ZWQgPSAnbGFzdFVwZGF0ZWQnLCBlLm51bUN1c3RvbVB1cnBvc2VzID0gJ251bUN1c3RvbVB1cnBvc2VzJywgZS5wb2xpY3lWZXJzaW9uID0gJ3BvbGljeVZlcnNpb24nLCBlLnB1Ymxpc2hlckNvdW50cnlDb2RlID0gJ3B1Ymxpc2hlckNvdW50cnlDb2RlJywgZS5wdWJsaXNoZXJDdXN0b21Db25zZW50cyA9ICdwdWJsaXNoZXJDdXN0b21Db25zZW50cycsIGUucHVibGlzaGVyQ3VzdG9tTGVnaXRpbWF0ZUludGVyZXN0cyA9ICdwdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzJywgZS5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzID0gJ3B1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMnLCBlLnB1Ymxpc2hlckNvbnNlbnRzID0gJ3B1Ymxpc2hlckNvbnNlbnRzJywgZS5wdWJsaXNoZXJSZXN0cmljdGlvbnMgPSAncHVibGlzaGVyUmVzdHJpY3Rpb25zJywgZS5wdXJwb3NlQ29uc2VudHMgPSAncHVycG9zZUNvbnNlbnRzJywgZS5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cyA9ICdwdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cycsIGUucHVycG9zZU9uZVRyZWF0bWVudCA9ICdwdXJwb3NlT25lVHJlYXRtZW50JywgZS5zcGVjaWFsRmVhdHVyZU9wdGlucyA9ICdzcGVjaWFsRmVhdHVyZU9wdGlucycsIGUudXNlTm9uU3RhbmRhcmRTdGFja3MgPSAndXNlTm9uU3RhbmRhcmRTdGFja3MnLCBlLnZlbmRvckNvbnNlbnRzID0gJ3ZlbmRvckNvbnNlbnRzJywgZS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzID0gJ3ZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMnLCBlLnZlbmRvckxpc3RWZXJzaW9uID0gJ3ZlbmRvckxpc3RWZXJzaW9uJywgZS52ZW5kb3JzQWxsb3dlZCA9ICd2ZW5kb3JzQWxsb3dlZCcsIGUudmVuZG9yc0Rpc2Nsb3NlZCA9ICd2ZW5kb3JzRGlzY2xvc2VkJywgZS52ZXJzaW9uID0gJ3ZlcnNpb24nLCBlOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5GaWVsZHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxNSksIGkgPSBuKDUpLCBzID0gbigzOCksIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0ICYmIChyLnB1cnBvc2VJZCA9IHQpLCB2b2lkIDAgIT09IG4gJiYgKHIucmVzdHJpY3Rpb25UeXBlID0gbiksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQudW5IYXNoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5zcGxpdCh0aGlzLmhhc2hTZXBhcmF0b3IpLCByID0gbmV3IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyICE9PSBuLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaS5UQ01vZGVsRXJyb3IoJ2hhc2gnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnB1cnBvc2VJZCA9IHBhcnNlSW50KG5bMF0sIDEwKSwgci5yZXN0cmljdGlvblR5cGUgPSBwYXJzZUludChuWzFdLCAxMCksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ2hhc2gnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBoYXNoIGludmFsaWQgUHVycG9zZVJlc3RyaWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICsgdGhpcy5wdXJwb3NlSWQgKyB0Lmhhc2hTZXBhcmF0b3IgKyB0aGlzLnJlc3RyaWN0aW9uVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ3B1cnBvc2VJZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnB1cnBvc2VJZF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVycG9zZUlkXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LnByb3RvdHlwZS5pc1ZhbGlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodGhpcy5wdXJwb3NlSWQpICYmIHRoaXMucHVycG9zZUlkID4gMCAmJiAodGhpcy5yZXN0cmljdGlvblR5cGUgPT09IHMuUmVzdHJpY3Rpb25UeXBlLk5PVF9BTExPV0VEIHx8IHRoaXMucmVzdHJpY3Rpb25UeXBlID09PSBzLlJlc3RyaWN0aW9uVHlwZS5SRVFVSVJFX0NPTlNFTlQgfHwgdGhpcy5yZXN0cmljdGlvblR5cGUgPT09IHMuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfTEkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5pc1NhbWVBcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdXJwb3NlSWQgPT09IGUucHVycG9zZUlkICYmIHRoaXMucmVzdHJpY3Rpb25UeXBlID09PSBlLnJlc3RyaWN0aW9uVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5oYXNoU2VwYXJhdG9yID0gJy0nLCB0OwogICAgICAgICAgICAgICAgICAgIH0oby5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgdC5QdXJwb3NlUmVzdHJpY3Rpb24gPSBhOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgKHIgPSB0LlNlZ21lbnQgfHwgKHQuU2VnbWVudCA9IHt9KSkuQ09SRSA9ICdjb3JlJywgci5WRU5ET1JTX0RJU0NMT1NFRCA9ICd2ZW5kb3JzRGlzY2xvc2VkJywgci5WRU5ET1JTX0FMTE9XRUQgPSAndmVuZG9yc0FsbG93ZWQnLCByLlBVQkxJU0hFUl9UQyA9ICdwdWJsaXNoZXJUQyc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgfHwgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByKG4oMjMpKSwgcihuKDU5KSksIHIobigxMjEpKSwgcihuKDM5KSksIHIobigxNikpLCByKG4oNjApKSwgcihuKDYxKSksIHIobig2MykpLCByKG4oNjIpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE2KSwgbyA9IG4oNSksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLkludEVuY29kZXIuZW5jb2RlKE1hdGgucm91bmQoZS5nZXRUaW1lKCkgLyAxMDApLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5kZWNvZGUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT09IGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvLkRlY29kaW5nRXJyb3IoJ2ludmFsaWQgYml0IGxlbmd0aCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2V0VGltZSgxMDAgKiByLkludEVuY29kZXIuZGVjb2RlKGUsIHQpKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LkRhdGVFbmNvZGVyID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE2KSwgbyA9IG4oNSksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gKGUgPSBlLnRvVXBwZXJDYXNlKCkpLmNoYXJDb2RlQXQoMCkgLSA2NSwgaSA9IGUuY2hhckNvZGVBdCgxKSAtIDY1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPCAwIHx8IG4gPiAyNSB8fCBpIDwgMCB8fCBpID4gMjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG8uRW5jb2RpbmdFcnJvcignaW52YWxpZCBsYW5ndWFnZSBjb2RlOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAlIDIgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgby5FbmNvZGluZ0Vycm9yKCdudW1CaXRzIG11c3QgYmUgZXZlbiwgJyArIHQgKyAnIGlzIG5vdCB2YWxpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgLz0gMiwgci5JbnRFbmNvZGVyLmVuY29kZShuLCB0KSArIHIuSW50RW5jb2Rlci5lbmNvZGUoaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuZGVjb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSBlLmxlbmd0aCB8fCBlLmxlbmd0aCAlIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG8uRGVjb2RpbmdFcnJvcignaW52YWxpZCBiaXQgbGVuZ3RoIGZvciBsYW5ndWFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmxlbmd0aCAvIDIsIGkgPSByLkludEVuY29kZXIuZGVjb2RlKGUuc2xpY2UoMCwgbiksIG4pICsgNjUsIHMgPSByLkludEVuY29kZXIuZGVjb2RlKGUuc2xpY2UobiksIG4pICsgNjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShpKSArIFN0cmluZy5mcm9tQ2hhckNvZGUocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5MYW5nRW5jb2RlciA9IGk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigzNyksIG8gPSBuKDIzKSwgaSA9IG4oNSksIHMgPSBuKDE2KSwgYSA9IG4oNiksIGMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZW5jb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcy5JbnRFbmNvZGVyLmVuY29kZShlLm51bVJlc3RyaWN0aW9ucywgci5CaXRMZW5ndGgubnVtUmVzdHJpY3Rpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlzRW1wdHkoKSB8fCBlLmdldFJlc3RyaWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IHMuSW50RW5jb2Rlci5lbmNvZGUobi5wdXJwb3NlSWQsIHIuQml0TGVuZ3RoLnB1cnBvc2VJZCksIHQgKz0gcy5JbnRFbmNvZGVyLmVuY29kZShuLnJlc3RyaWN0aW9uVHlwZSwgci5CaXRMZW5ndGgucmVzdHJpY3Rpb25UeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gZS5nZXRWZW5kb3JzKG4pLCBhID0gaS5sZW5ndGgsIGMgPSAwLCB1ID0gMCwgcCA9ICcnLCBsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGlbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gdSAmJiAoYysrLCB1ID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBpW2EgLSAxXSwgZCA9IGUuZ3ZsLnZlbmRvcklkczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gYSAtIDEgfHwgaVt0ICsgMV0gPiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICsrZSA8PSBsICYmICFkLmhhcyhlKTspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAhKG4gPT09IHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IG8uQm9vbGVhbkVuY29kZXIuZW5jb2RlKGYpLCBwICs9IHMuSW50RW5jb2Rlci5lbmNvZGUodSwgci5CaXRMZW5ndGgudmVuZG9ySWQpLCBmICYmIChwICs9IHMuSW50RW5jb2Rlci5lbmNvZGUobiwgci5CaXRMZW5ndGgudmVuZG9ySWQpKSwgdSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZCA9IDA7IGQgPCBhOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSBzLkludEVuY29kZXIuZW5jb2RlKGMsIHIuQml0TGVuZ3RoLm51bUVudHJpZXMpLCB0ICs9IHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5kZWNvZGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwLCBuID0gbmV3IGEuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yKCksIGMgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9ucyksIHIuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IHIuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHUgPSAwOyB1IDwgYzsgdSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLnB1cnBvc2VJZCksIHIuQml0TGVuZ3RoLnB1cnBvc2VJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSByLkJpdExlbmd0aC5wdXJwb3NlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSksIHIuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSByLkJpdExlbmd0aC5yZXN0cmljdGlvblR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgYS5QdXJwb3NlUmVzdHJpY3Rpb24ocCwgbCksIGYgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLm51bUVudHJpZXMpLCByLkJpdExlbmd0aC5udW1FbnRyaWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IHIuQml0TGVuZ3RoLm51bUVudHJpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCBmOyBoKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBvLkJvb2xlYW5FbmNvZGVyLmRlY29kZShlLnN1YnN0cih0LCByLkJpdExlbmd0aC5hbnlCb29sZWFuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gci5CaXRMZW5ndGguYW55Qm9vbGVhbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLnZlbmRvcklkKSwgci5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCArPSByLkJpdExlbmd0aC52ZW5kb3JJZCwgeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBzLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHQsIHIuQml0TGVuZ3RoLnZlbmRvcklkKSwgci5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgKz0gci5CaXRMZW5ndGgudmVuZG9ySWQsIGcgPCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBpLkRlY29kaW5nRXJyb3IoJ0ludmFsaWQgUmFuZ2VFbnRyeTogZW5kVmVuZG9ySWQgJyArIGcgKyAnIGlzIGxlc3MgdGhhbiAnICsgdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtID0gdjsgbSA8PSBnOyBtKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5hZGQobSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5hZGQodiwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYml0TGVuZ3RoID0gdCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LlB1cnBvc2VSZXN0cmljdGlvblZlY3RvckVuY29kZXIgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNiksIG8gPSBuKDM2KSwgaSA9IG4oMTYpLCBzID0gbigyMyksIGEgPSBuKDM5KSwgYyA9IG4oNjMpLCB1ID0gbig1KSwgcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5lbmNvZGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBbXSwgciA9IFtdLCBhID0gaS5JbnRFbmNvZGVyLmVuY29kZShlLm1heElkLCBvLkJpdExlbmd0aC5tYXhJZCksIHUgPSAnJywgcCA9IG8uQml0TGVuZ3RoLm1heElkICsgby5CaXRMZW5ndGguZW5jb2RpbmdUeXBlLCBsID0gcCArIGUubWF4SWQsIGQgPSAyICogby5CaXRMZW5ndGgudmVuZG9ySWQgKyBvLkJpdExlbmd0aC5zaW5nbGVPclJhbmdlICsgby5CaXRMZW5ndGgubnVtRW50cmllcywgZiA9IHAgKyBvLkJpdExlbmd0aC5udW1FbnRyaWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAoaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gcy5Cb29sZWFuRW5jb2Rlci5lbmNvZGUoaSksICh0ID0gZS5tYXhJZCA+IGQgJiYgZiA8IGwpICYmIGkgJiYgKGUuaGFzKGEgKyAxKSA/IDAgPT09IHIubGVuZ3RoICYmIChyLnB1c2goYSksIGYgKz0gby5CaXRMZW5ndGguc2luZ2xlT3JSYW5nZSwgZiArPSBvLkJpdExlbmd0aC52ZW5kb3JJZCkgOiAoci5wdXNoKGEpLCBmICs9IG8uQml0TGVuZ3RoLnZlbmRvcklkLCBuLnB1c2gociksIHIgPSBbXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgPyAoYSArPSBjLlZlY3RvckVuY29kaW5nVHlwZS5SQU5HRSArICcnLCBhICs9IHRoaXMuYnVpbGRSYW5nZUVuY29kaW5nKG4pKSA6IChhICs9IGMuVmVjdG9yRW5jb2RpbmdUeXBlLkZJRUxEICsgJycsIGEgKz0gdSksIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuZGVjb2RlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBwID0gMCwgbCA9IGkuSW50RW5jb2Rlci5kZWNvZGUoZS5zdWJzdHIocCwgby5CaXRMZW5ndGgubWF4SWQpLCBvLkJpdExlbmd0aC5tYXhJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IG8uQml0TGVuZ3RoLm1heElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBpLkludEVuY29kZXIuZGVjb2RlKGUuY2hhckF0KHApLCBvLkJpdExlbmd0aC5lbmNvZGluZ1R5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgKz0gby5CaXRMZW5ndGguZW5jb2RpbmdUeXBlLCBkID09PSBjLlZlY3RvckVuY29kaW5nVHlwZS5SQU5HRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gbmV3IHIuVmVjdG9yKCksIDEgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcxJyA9PT0gZS5zdWJzdHIocCwgMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdS5EZWNvZGluZ0Vycm9yKCdVbmFibGUgdG8gZGVjb2RlIGRlZmF1bHQgY29uc2VudD0xJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBpLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHAsIG8uQml0TGVuZ3RoLm51bUVudHJpZXMpLCBvLkJpdExlbmd0aC5udW1FbnRyaWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IG8uQml0TGVuZ3RoLm51bUVudHJpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCBmOyBoKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBzLkJvb2xlYW5FbmNvZGVyLmRlY29kZShlLmNoYXJBdChwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gby5CaXRMZW5ndGguc2luZ2xlT3JSYW5nZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBpLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHAsIG8uQml0TGVuZ3RoLnZlbmRvcklkKSwgby5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCArPSBvLkJpdExlbmd0aC52ZW5kb3JJZCwgeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBpLkludEVuY29kZXIuZGVjb2RlKGUuc3Vic3RyKHAsIG8uQml0TGVuZ3RoLnZlbmRvcklkKSwgby5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBvLkJpdExlbmd0aC52ZW5kb3JJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSB2OyBtIDw9IGc7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNldChtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNldCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZS5zdWJzdHIocCwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBsLCBuID0gYS5GaXhlZFZlY3RvckVuY29kZXIuZGVjb2RlKGIsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYml0TGVuZ3RoID0gcCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5idWlsZFJhbmdlRW5jb2RpbmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmxlbmd0aCwgbiA9IGkuSW50RW5jb2Rlci5lbmNvZGUodCwgby5CaXRMZW5ndGgubnVtRW50cmllcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAxID09PSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9IHMuQm9vbGVhbkVuY29kZXIuZW5jb2RlKCF0KSwgbiArPSBpLkludEVuY29kZXIuZW5jb2RlKGVbMF0sIG8uQml0TGVuZ3RoLnZlbmRvcklkKSwgdCB8fCAobiArPSBpLkludEVuY29kZXIuZW5jb2RlKGVbMV0sIG8uQml0TGVuZ3RoLnZlbmRvcklkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LlZlbmRvclZlY3RvckVuY29kZXIgPSBwOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgKHIgPSB0LlZlY3RvckVuY29kaW5nVHlwZSB8fCAodC5WZWN0b3JFbmNvZGluZ1R5cGUgPSB7fSkpW3IuRklFTEQgPSAwXSA9ICdGSUVMRCcsIHJbci5SQU5HRSA9IDFdID0gJ1JBTkdFJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSB8fCAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHIobigxMjIpKSwgcihuKDEyMykpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnNDYWxsID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzRjY2M3MzllZjUzOGM3YTQgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKSwgJF9fX29sZF84ZjE5NzYwMzllODJmMjUwID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzRjY2M3MzllZjUzOGM3YTQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2IzNjE1ZTNkMjRmYjlkMzAuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF84ZjE5NzYwMzllODJmMjUwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53aXRoQ3JlZGVudGlhbHMgPSBuLCBzLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzI1MzVlMDZhZTdlMDBmMDYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMjUzNWUwNmFlN2UwMGYwNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnJlYWR5U3RhdGUgPT0gWE1MSHR0cFJlcXVlc3QuRE9ORSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnN0YXR1cyA+PSAyMDAgJiYgcy5zdGF0dXMgPCAzMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHMucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG5ldyBFcnJvcignSFRUUCBTdGF0dXM6ICcgKyBzLnN0YXR1cyArICcgcmVzcG9uc2UgdHlwZTogJyArIHMucmVzcG9uc2VUeXBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yNTM1ZTA2YWU3ZTAwZjA2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzI1MzVlMDZhZTdlMDBmMDYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG5ldyBFcnJvcignZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShuZXcgRXJyb3IoJ2Fib3J0ZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsID09PSB0ID8gcy5vcGVuKCdHRVQnLCBlLCAhMCkgOiBzLm9wZW4oJ1BPU1QnLCBlLCAhMCksIHMucmVzcG9uc2VUeXBlID0gJ2pzb24nLCBzLnRpbWVvdXQgPSByLCBzLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobmV3IEVycm9yKCdUaW1lb3V0ICcgKyByICsgJ21zICcgKyBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMuc2VuZCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzRjY2M3MzllZjUzOGM3YTQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfNGNjYzczOWVmNTM4YzdhNCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzhmMTk3NjAzOWU4MmYyNTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfOGYxOTc2MDM5ZTgyZjI1MCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBlLnBvc3QgPSBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBuICYmIChuID0gITEpLCB2b2lkIDAgPT09IHIgJiYgKHIgPSAwKSwgdGhpcy5hYnNDYWxsKGUsIEpTT04uc3RyaW5naWZ5KHQpLCBuLCByKTsKICAgICAgICAgICAgICAgICAgICB9LCBlLmZldGNoID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKSwgdm9pZCAwID09PSBuICYmIChuID0gMCksIHRoaXMuYWJzQ2FsbChlLCBudWxsLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5Kc29uID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IFsKICAgICAgICAgICAgICAgICAgICAnZW4nLAogICAgICAgICAgICAgICAgICAgICdmcicsCiAgICAgICAgICAgICAgICAgICAgJ2RlJywKICAgICAgICAgICAgICAgICAgICAnaXQnLAogICAgICAgICAgICAgICAgICAgICdlcycsCiAgICAgICAgICAgICAgICAgICAgJ2RhJywKICAgICAgICAgICAgICAgICAgICAnbmwnLAogICAgICAgICAgICAgICAgICAgICdlbCcsCiAgICAgICAgICAgICAgICAgICAgJ2h1JywKICAgICAgICAgICAgICAgICAgICAncHQnLAogICAgICAgICAgICAgICAgICAgICdybycsCiAgICAgICAgICAgICAgICAgICAgJ2ZpJywKICAgICAgICAgICAgICAgICAgICAncGwnLAogICAgICAgICAgICAgICAgICAgICdzaycsCiAgICAgICAgICAgICAgICAgICAgJ3N2JywKICAgICAgICAgICAgICAgICAgICAnbm8nLAogICAgICAgICAgICAgICAgICAgICdydScsCiAgICAgICAgICAgICAgICAgICAgJ2JnJywKICAgICAgICAgICAgICAgICAgICAnY2EnLAogICAgICAgICAgICAgICAgICAgICdjcycsCiAgICAgICAgICAgICAgICAgICAgJ2V0JywKICAgICAgICAgICAgICAgICAgICAnaHInLAogICAgICAgICAgICAgICAgICAgICdsdCcsCiAgICAgICAgICAgICAgICAgICAgJ2x2JywKICAgICAgICAgICAgICAgICAgICAnbXQnLAogICAgICAgICAgICAgICAgICAgICdzbCcsCiAgICAgICAgICAgICAgICAgICAgJ3RyJywKICAgICAgICAgICAgICAgICAgICAnemgnCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLCByID0gMDsgciA8IG4ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvJTQwL2dpLCAnQCcpLnJlcGxhY2UoLyUzQS9naSwgJzonKS5yZXBsYWNlKC8lMjQvZywgJyQnKS5yZXBsYWNlKC8lMkMvZ2ksICcsJykucmVwbGFjZSgvJTIwL2csICcrJykucmVwbGFjZSgvJTVCL2dpLCAnWycpLnJlcGxhY2UoLyU1RC9naSwgJ10nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4odCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoci5pc1VSTFNlYXJjaFBhcmFtcyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgci5mb3JFYWNoKHQsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBlICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZSAmJiAoci5pc0FycmF5KGUpID8gdCArPSAnW10nIDogZSA9IFtlXSwgci5mb3JFYWNoKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pc0RhdGUoZSkgPyBlID0gZS50b0lTT1N0cmluZygpIDogci5pc09iamVjdChlKSAmJiAoZSA9IEpTT04uc3RyaW5naWZ5KGUpKSwgcy5wdXNoKG8odCkgKyAnPScgKyBvKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkgPSBzLmpvaW4oJyYnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlLmluZGV4T2YoJyMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT09IGEgJiYgKGUgPSBlLnNsaWNlKDAsIGEpKSwgZSArPSAoLTEgPT09IGUuaW5kZXhPZignPycpID8gJz8nIDogJyYnKSArIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgIWUuX19DQU5DRUxfXyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcpLCBvID0gbigxMzQpLCBpID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIXIuaXNVbmRlZmluZWQoZSkgJiYgci5pc1VuZGVmaW5lZChlWydDb250ZW50LVR5cGUnXSkgJiYgKGVbJ0NvbnRlbnQtVHlwZSddID0gdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBhID0gewogICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2EyNjI3NDQ2YWM1NTJkM2QgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYTI2Mjc0NDZhYzU1MmQzZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgfHwgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB0ICYmICdbb2JqZWN0IHByb2Nlc3NdJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKSAmJiAoZSA9IG4oNzUpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2EyNjI3NDQ2YWM1NTJkM2QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfYTI2Mjc0NDZhYzU1MmQzZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHQsICdBY2NlcHQnKSwgbyh0LCAnQ29udGVudC1UeXBlJyksIHIuaXNGb3JtRGF0YShlKSB8fCByLmlzQXJyYXlCdWZmZXIoZSkgfHwgci5pc0J1ZmZlcihlKSB8fCByLmlzU3RyZWFtKGUpIHx8IHIuaXNGaWxlKGUpIHx8IHIuaXNCbG9iKGUpID8gZSA6IHIuaXNBcnJheUJ1ZmZlclZpZXcoZSkgPyBlLmJ1ZmZlciA6IHIuaXNVUkxTZWFyY2hQYXJhbXMoZSkgPyAocyh0LCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKSwgZS50b1N0cmluZygpKSA6IHIuaXNPYmplY3QoZSkgPyAocyh0LCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyksIEpTT04uc3RyaW5naWZ5KGUpKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJywKICAgICAgICAgICAgICAgICAgICAgICAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhDb250ZW50TGVuZ3RoOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA+PSAyMDAgJiYgZSA8IDMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyBjb21tb246IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyB9IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWQnCiAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5oZWFkZXJzW2VdID0ge307CiAgICAgICAgICAgICAgICAgICAgfSksIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3B1dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwYXRjaCcKICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmhlYWRlcnNbZV0gPSByLm1lcmdlKGkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBlLmV4cG9ydHMgPSBhOwogICAgICAgICAgICAgICAgfS5jYWxsKHRoaXMsIG4oMTMzKSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcpLCBvID0gbigxMzUpLCBpID0gbig3MiksIHMgPSBuKDEzNyksIGEgPSBuKDE0MCksIGMgPSBuKDE0MSksIHUgPSBuKDc2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uICh0LCBwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNzc4YjYzZmJjMTM1Y2I5YSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkXzBhMTRmNjU2ZDUwZTQwYmEgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzc3OGI2M2ZiYzEzNWNiOWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMGExNGY2NTZkNTBlNDBiYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gZS5kYXRhLCBkID0gZS5oZWFkZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNGb3JtRGF0YShsKSAmJiBkZWxldGUgZFsnQ29udGVudC1UeXBlJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hdXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZS5hdXRoLnVzZXJuYW1lIHx8ICcnLCB5ID0gZS5hdXRoLnBhc3N3b3JkIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EoaCArICc6JyArIHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHMoZS5iYXNlVVJMLCBlLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBpKHYsIGUucGFyYW1zLCBlLnBhcmFtc1NlcmlhbGl6ZXIpLCAhMCksIGYudGltZW91dCA9IGUudGltZW91dCwgZi5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiA0ID09PSBmLnJlYWR5U3RhdGUgJiYgKDAgIT09IGYuc3RhdHVzIHx8IGYucmVzcG9uc2VVUkwgJiYgMCA9PT0gZi5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gZiA/IGEoZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZS5yZXNwb25zZVR5cGUgJiYgJ3RleHQnICE9PSBlLnJlc3BvbnNlVHlwZSA/IGYucmVzcG9uc2UgOiBmLnJlc3BvbnNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogZi5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiBmLnN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8odCwgcCwgciksIGYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmIChwKHUoJ1JlcXVlc3QgYWJvcnRlZCcsIGUsICdFQ09OTkFCT1JURUQnLCBmKSksIGYgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCh1KCdOZXR3b3JrIEVycm9yJywgZSwgbnVsbCwgZikpLCBmID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICd0aW1lb3V0IG9mICcgKyBlLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50aW1lb3V0RXJyb3JNZXNzYWdlICYmICh0ID0gZS50aW1lb3V0RXJyb3JNZXNzYWdlKSwgcCh1KHQsIGUsICdFQ09OTkFCT1JURUQnLCBmKSksIGYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBuKDE0MiksIG0gPSAoZS53aXRoQ3JlZGVudGlhbHMgfHwgYyh2KSkgJiYgZS54c3JmQ29va2llTmFtZSA/IGcucmVhZChlLnhzcmZDb29raWVOYW1lKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSAmJiAoZFtlLnhzcmZIZWFkZXJOYW1lXSA9IG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NldFJlcXVlc3RIZWFkZXInIGluIGYgJiYgci5mb3JFYWNoKGQsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGwgJiYgJ2NvbnRlbnQtdHlwZScgPT09IHQudG9Mb3dlckNhc2UoKSA/IGRlbGV0ZSBkW3RdIDogZi5zZXRSZXF1ZXN0SGVhZGVyKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscykgfHwgKGYud2l0aENyZWRlbnRpYWxzID0gISFlLndpdGhDcmVkZW50aWFscyksIGUucmVzcG9uc2VUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5yZXNwb25zZVR5cGUgPSBlLnJlc3BvbnNlVHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdqc29uJyAhPT0gZS5yZXNwb25zZVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyAmJiBmLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCAnZnVuY3Rpb24nID09PSB0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzICYmIGYudXBsb2FkICYmIGYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgZS5vblVwbG9hZFByb2dyZXNzKSwgZS5jYW5jZWxUb2tlbiAmJiBlLmNhbmNlbFRva2VuLnByb21pc2UudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmIChmLmFib3J0KCksIHAoZSksIGYgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdm9pZCAwID09PSBsICYmIChsID0gbnVsbCksIGYuc2VuZChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzc3OGI2M2ZiYzEzNWNiOWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF83NzhiNjNmYmMxMzVjYjlhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wYTE0ZjY1NmQ1MGU0MGJhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfMGExNGY2NTZkNTBlNDBiYSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDEzNik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgbiwgbywgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IEVycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByKHMsIHQsIG4sIG8sIGkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdCA9IHQgfHwge307CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fSwgbyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJwogICAgICAgICAgICAgICAgICAgICAgICBdLCBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3h5JwogICAgICAgICAgICAgICAgICAgICAgICBdLCBzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhc2VVUkwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmFtc1NlcmlhbGl6ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpdGhDcmVkZW50aWFscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRhcHRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzcG9uc2VUeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4c3JmQ29va2llTmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAneHNyZkhlYWRlck5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uVXBsb2FkUHJvZ3Jlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29uRG93bmxvYWRQcm9ncmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4Q29udGVudExlbmd0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRhdGVTdGF0dXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heFJlZGlyZWN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cEFnZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwc0FnZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYW5jZWxUb2tlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0UGF0aCcKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICByLmZvckVhY2gobywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB0W2VdICYmIChuW2VdID0gdFtlXSk7CiAgICAgICAgICAgICAgICAgICAgfSksIHIuZm9yRWFjaChpLCBmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICByLmlzT2JqZWN0KHRbb10pID8gbltvXSA9IHIuZGVlcE1lcmdlKGVbb10sIHRbb10pIDogJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB0W29dID8gbltvXSA9IHRbb10gOiByLmlzT2JqZWN0KGVbb10pID8gbltvXSA9IHIuZGVlcE1lcmdlKGVbb10pIDogJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBlW29dICYmIChuW29dID0gZVtvXSk7CiAgICAgICAgICAgICAgICAgICAgfSksIHIuZm9yRWFjaChzLCBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHRbcl0gPyBuW3JdID0gdFtyXSA6ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZVtyXSAmJiAobltyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciBhID0gby5jb25jYXQoaSkuY29uY2F0KHMpLCBjID0gT2JqZWN0LmtleXModCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IGEuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm9yRWFjaChjLCBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHRbcl0gPyBuW3JdID0gdFtyXSA6ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZVtyXSAmJiAobltyXSA9IGVbcl0pOwogICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0NhbmNlbCcgKyAodGhpcy5tZXNzYWdlID8gJzogJyArIHRoaXMubWVzc2FnZSA6ICcnKTsKICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9fQ0FOQ0VMX18gPSAhMCwgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pIHx8ICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgcihuKDQ3KSksIHIobigyNykpLCByKG4oMjkpKSwgcihuKDEwNikpOwogICAgICAgICAgICAgICAgdmFyIG8gPSBuKDUxKTsKICAgICAgICAgICAgICAgIHQuQVBJX0tFWSA9IG8uQVBJX0tFWTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4oMTI4KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9ICdkYXRhOmltYWdlL3N2Zyt4bWwsJTNDc3ZnIHZpZXdCb3g9XCcwIDAgMTYgMTdcJyB2ZXJzaW9uPVwnMS4xXCcgeG1sbnM9XCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnIHhtbG5zOnhsaW5rPVwnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wnIHN0eWxlPVwnbWFyZ2luLXJpZ2h0OiA1cHg7IGhlaWdodDogMTdweDtcJyUzRSUzQ2cgaWQ9XCdQYWdlLTFcJyBzdHJva2U9XCdub25lXCcgc3Ryb2tlLXdpZHRoPVwnMVwnIGZpbGw9XCdub25lXCcgZmlsbC1ydWxlPVwnZXZlbm9kZFwnJTNFJTNDZyBpZD1cJ2NvZ1wnIGZpbGw9XCclMjNGRkZGRkZcJyBmaWxsLXJ1bGU9XCdub256ZXJvXCclM0UlM0NwYXRoIGQ9XCdNMTUuNTk2OTE3LDkuOTgzMjY5MzggTDE0LjUwNDEwNzksOS4zMzc5ODgxNiBDMTQuNTcyODA2NCw4Ljc4MTUzODYgMTQuNTcyODA2NCw4LjIxODQ2MTQgMTQuNTA0MTA3OSw3LjY2MjAxMTg0IEwxNS41OTY5MTcsNy4wMTY3MzA2MiBDMTUuOTE3ODIyOSw2LjgyNzI2MjU5IDE2LjA3MjYxMjQsNi40Mzc0MjczMiAxNS45NjcwODQ4LDYuMDc0MTU0NiBDMTUuNTkxMjg3MSw0Ljc4MDMzNjExIDE0LjkyMjM2NDYsMy42MTU3MzE1MyAxNC4wMzkwMDIxLDIuNjYwNjExMTMgQzEzLjc4MzE3NTUsMi4zODQwMTc5NyAxMy4zNzQ5MDUzLDIuMzIzNDg5NjUgMTMuMDUyNTI0OSwyLjUxMzg0ODgxIEwxMS45NjEzMjQzLDMuMTU4MTM2MDggQzExLjUyNDg1MTksMi44MTg0MDExNyAxMS4wNDgxMjIxLDIuNTM2NDg2NjMgMTAuNTQyNDgyLDIuMzE5MTAyNTUgTDEwLjU0MjQ4MiwxLjAyOTkxMTA4IEMxMC41NDI0ODIsMC42NDg0Mzg3MzMgMTAuMjg2MDUyMiwwLjMxNjg2OTY4MyA5LjkyMzA1NTkyLDAuMjI5MDI0NzkyIEM4LjY2MTU1LC0wLjA3NjMyNDQ2IDcuMzM4NzE4MDksLTAuMDc2MzU4NzM0MiA2LjA3Njk0NDA4LDAuMjI5MDI0NzkyIEM1LjcxMzk4MTMxLDAuMzE2ODY5NjgzIDUuNDU3NTE4LDAuNjQ4NDA0NDU4IDUuNDU3NTE4LDEuMDI5OTExMDggTDUuNDU3NTE4LDIuMzE5MTAyNTUgQzQuOTUxODc0MDYsMi41MzY0Nzg3MiA0LjQ3NTE0MzM0LDIuODE4MzkzODIgNC4wMzg2NzU3MiwzLjE1ODEzNjA4IEwyLjk0NzQ3NTExLDIuNTEzODQ4ODEgQzIuNjI1MDYxMjIsMi4zMjM0ODk2NSAyLjIxNjc5MDk0LDIuMzg0MDE3OTcgMS45NjA5OTc4NiwyLjY2MDYxMTEzIEMxLjA3NzYzNTQyLDMuNjE1NzMxNTMgMC40MDg3MTI4OSw0Ljc4MDM3MDM4IDAuMDMyOTE1MjIzNiw2LjA3NDE1NDYgQy0wLjA3MjYxMjQwNyw2LjQzNzQyNzMyIDAuMDgyMTc3MDg5OSw2LjgyNzIyODMyIDAuNDAzMDgyOTYyLDcuMDE2NzMwNjIgTDEuNDk1ODkyMTIsNy42NjIwMTE4NCBDMS40MjcxOTM1Niw4LjIxODQ2MTQgMS40MjcxOTM1Niw4Ljc4MTUzODYgMS40OTU4OTIxMiw5LjMzNzk4ODE2IEwwLjQwMzA4Mjk2Miw5Ljk4MzI2OTM4IEMwLjA4MjE3NzA4OTksMTAuMTcyNzM3NCAtMC4wNzI2MTI0MDcsMTAuNTYyNTcyNyAwLjAzMjkxNTIyMzYsMTAuOTI1ODQ1NCBDMC40MDg3MTI4OSwxMi4yMTk2Mjk2IDEuMDc3NjM1NDIsMTMuMzg0MjY4NSAxLjk2MDk5Nzg2LDE0LjMzOTM4ODkgQzIuMjE2ODI0NDUsMTQuNjE1OTgyIDIuNjI1MDk0NzQsMTQuNjc2NTEwMyAyLjk0NzQ3NTExLDE0LjQ4NjE4NTUgTDQuMDM4Njc1NzIsMTMuODQxODk4MiBDNC40NzUxNDA5NiwxNC4xODE2MzQ5IDQuOTUxODcyNDMsMTQuNDYzNTM4OSA1LjQ1NzUxOCwxNC42ODA4OTc1IEw1LjQ1NzUxOCwxNS45NzAwODg5IEM1LjQ1NzUxOCwxNi4zNTE1NjEzIDUuNzEzOTQ3OCwxNi42ODMxMzAzIDYuMDc2OTQ0MDgsMTYuNzcwOTc1MiBDNy4zMzg0ODM1MSwxNy4wNzYzMjQ1IDguNjYxMjgxOTEsMTcuMDc2MzU4NyA5LjkyMzA1NTkyLDE2Ljc3MDk3NTIgQzEwLjI4NjAxODcsMTYuNjgzMTMwMyAxMC41NDI0ODIsMTYuMzUxNTk1NSAxMC41NDI0ODIsMTUuOTcwMDg4OSBMMTAuNTQyNDgyLDE0LjY4MDg5NzUgQzExLjA0ODExODMsMTQuNDYzNTE5OCAxMS41MjQ4NDc1LDE0LjE4MTYxNzEgMTEuOTYxMzI0MywxMy44NDE4OTgyIEwxMy4wNTI1MjQ5LDE0LjQ4NjE4NTUgQzEzLjM3NDkwNTMsMTQuNjc2NTQ0NiAxMy43ODMxNzU1LDE0LjYxNjAxNjMgMTQuMDM5MDAyMSwxNC4zMzkzODg5IEMxNC45MjIzNjQ2LDEzLjM4NDI2ODUgMTUuNTkxMjg3MSwxMi4yMTk2Mjk2IDE1Ljk2NzA4NDgsMTAuOTI1ODQ1NCBDMTYuMDcyNjEyNCwxMC41NjI1NzI3IDE1LjkxNzgyMjksMTAuMTcyNzcxNyAxNS41OTY5MTcsOS45ODMyNjkzOCBaIE0xMy40MDI2MTkzLDEzLjQyNjQ5NDMgTDExLjg1MDczNjQsMTIuNTEwMDAxIEMxMC45NDYzMjg4LDEzLjMwMDc0MjEgMTAuNjI1NTkwNSwxMy40OTk3MDQxIDkuNDcwMTE0ODQsMTMuOTE3MjY3MyBMOS40NzAxMTQ4NCwxNS43NTAyMTk2IEM4LjUwMDI0ODA4LDE1Ljk1NDgzNzMgNy40OTk3NTE5MiwxNS45NTQ4MzczIDYuNTI5ODg1MTYsMTUuNzUwMjE5NiBMNi41Mjk4ODUxNiwxMy45MTcyNjczIEM1LjQwMzE5NTksMTMuNTEwMTIzNSA1LjA3Njk5NTIyLDEzLjMyMTA2NjggNC4xNDkyNjM1OCwxMi41MTAwMDEgTDIuNTk3MzgwNzUsMTMuNDI2NDk0MyBDMS45MzY4Njk2LDEyLjY2OTM3NjMgMS40MzQ5MDEyNCwxMS43ODE3MDc2IDEuMTI1MjU1MjIsMTAuODIzMDkxMiBMMi42Nzc4MDgyOCw5LjkwNjU5Nzg5IEMyLjQ1ODgxMDgsOC42OTI3MDY5NCAyLjQ1ODcxMDI3LDguMzA3OTA5OTkgMi42Nzc4MDgyOCw3LjA5MzQwMjExIEwxLjEyNTI1NTIyLDYuMTc2OTA4NzkgQzEuNDM0OTAxMjQsNS4yMTgyOTI0MiAxLjkzNjkwMzExLDQuMzMwNTg5NDYgMi41OTczODA3NSwzLjU3MzEyODY0IEw0LjE0OTI2MzU4LDQuNDkwMzA3NDUgQzUuMDY2NzA3MiwzLjY4NzEyNDc4IDUuMzkxMjk5MzMsMy40OTQxMjY1IDYuNTI5ODg1MTYsMy4wODI2OTg0NiBMNi41Mjk4ODUxNiwxLjI0OTc4MDM3IEM3LjQ5OTcxNzc0LDEuMDQ0ODIwNTkgOC41MDAyODIyNiwxLjA0NDgyMDU5IDkuNDcwMTE0ODQsMS4yNDk3ODAzNyBMOS40NzAxMTQ4NCwzLjA4MjczMjc0IEMxMC42MDg3Njc3LDMuNDk0MTk1MDUgMTAuOTMzMzkzMywzLjY4NzIyNzYgMTEuODUwNzM2NCw0LjQ5MDM0MTcyIEwxMy40MDI2MTkzLDMuNTczMTYyOTEgQzE0LjA2MzA5NjksNC4zMzA1ODk0NiAxNC41NjUwOTg4LDUuMjE4MjkyNDIgMTQuODc0NzQ0OCw2LjE3Njk0MzA2IEwxMy4zMjIxOTE3LDcuMDkzNDM2MzggQzEzLjU0MTIyMjcsOC4zMDc2MzU4IDEzLjU0MTI4OTcsOC42OTIxMjQyOCAxMy4zMjIxOTE3LDkuOTA2NjMyMTcgTDE0Ljg3NDc0NDgsMTAuODIzMTI1NSBDMTQuNTY1MDk4OCwxMS43ODE3MDc2IDE0LjA2MzEzMDQsMTIuNjY5NDEwNSAxMy40MDI2MTkzLDEzLjQyNjQ5NDMgWiBNOCw1LjIwOTY4OTU4IEM2LjIyNjA3MDE0LDUuMjA5Njg5NTggNC43ODI4OTg1Myw2LjY4NTcwOTk2IDQuNzgyODk4NTMsOC41MDAwMTcxNCBDNC43ODI4OTg1MywxMC4zMTQzMjQzIDYuMjI2MDcwMTQsMTEuNzkwMzQ0NyA4LDExLjc5MDM0NDcgQzkuNzczOTI5ODYsMTEuNzkwMzQ0NyAxMS4yMTcxMDE1LDEwLjMxNDMyNDMgMTEuMjE3MTAxNSw4LjUwMDAxNzE0IEMxMS4yMTcxMDE1LDYuNjg1NzA5OTYgOS43NzM5Mjk4Niw1LjIwOTY4OTU4IDgsNS4yMDk2ODk1OCBaIE04LDEwLjY5MzU2ODggQzYuODE3MzgwMDksMTAuNjkzNTY4OCA1Ljg1NTI2NTY4LDkuNzA5NTU1MjYgNS44NTUyNjU2OCw4LjUwMDAxNzE0IEM1Ljg1NTI2NTY4LDcuMjkwNDc5MDIgNi44MTczODAwOSw2LjMwNjQ2NTQzIDgsNi4zMDY0NjU0MyBDOS4xODI2MTk5MSw2LjMwNjQ2NTQzIDEwLjE0NDczNDMsNy4yOTA0NzkwMiAxMC4xNDQ3MzQzLDguNTAwMDE3MTQgQzEwLjE0NDczNDMsOS43MDk1NTUyNiA5LjE4MjYxOTkxLDEwLjY5MzU2ODggOCwxMC42OTM1Njg4IFpcJyBpZD1cJ1NoYXBlXCclM0UlM0MvcGF0aCUzRSUzQy9nJTNFJTNDL2clM0UlM0Mvc3ZnJTNFJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5wcm90b3R5cGUsIG4gPSB0Lmhhc093blByb3BlcnR5LCByID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCA6IHt9LCBvID0gci5pdGVyYXRvciB8fCAnQEBpdGVyYXRvcicsIGkgPSByLmFzeW5jSXRlcmF0b3IgfHwgJ0BAYXN5bmNJdGVyYXRvcicsIHMgPSByLnRvU3RyaW5nVGFnIHx8ICdAQHRvU3RyaW5nVGFnJzsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZVt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgYSh7fSwgJycpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQgJiYgdC5wcm90b3R5cGUgaW5zdGFuY2VvZiBsID8gdCA6IGwsIGkgPSBPYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSwgcyA9IG5ldyBTKHIgfHwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5faW52b2tlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ3N1c3BlbmRlZFN0YXJ0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZXhlY3V0aW5nJyA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdjb21wbGV0ZWQnID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndGhyb3cnID09PSBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuLm1ldGhvZCA9IG8sIG4uYXJnID0gaTs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5kZWxlZ2F0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gQyhzLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT09IHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbmV4dCcgPT09IG4ubWV0aG9kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zZW50ID0gbi5fc2VudCA9IG4uYXJnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgndGhyb3cnID09PSBuLm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdXNwZW5kZWRTdGFydCcgPT09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgciA9ICdjb21wbGV0ZWQnLCBuLmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm4nID09PSBuLm1ldGhvZCAmJiBuLmFicnVwdCgncmV0dXJuJywgbi5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gJ2V4ZWN1dGluZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gdShlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdub3JtYWwnID09PSBjLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gbi5kb25lID8gJ2NvbXBsZXRlZCcgOiAnc3VzcGVuZGVkWWllbGQnLCBjLmFyZyA9PT0gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGMuYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IG4uZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhyb3cnID09PSBjLnR5cGUgJiYgKHIgPSAnY29tcGxldGVkJywgbi5tZXRob2QgPSAndGhyb3cnLCBuLmFyZyA9IGMuYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KGUsIG4sIHMpLCBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ25vcm1hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnOiBlLmNhbGwodCwgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Rocm93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmc6IFAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZS53cmFwID0gYzsKICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBoID0ge307CiAgICAgICAgICAgICAgICAgICAgaFtvXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiwgdiA9IHkgJiYgeSh5KEkoW10pKSk7CiAgICAgICAgICAgICAgICAgICAgdiAmJiB2ICE9PSB0ICYmIG4uY2FsbCh2LCBvKSAmJiAoaCA9IHYpOwogICAgICAgICAgICAgICAgICAgIHZhciBnID0gZi5wcm90b3R5cGUgPSBsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoaCk7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aHJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuJwogICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoZSwgdCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZSA9IGZ1bmN0aW9uIChvLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdChmdW5jdGlvbiAociwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gcihvLCBpLCBzLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHUoZVtvXSwgZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyAhPT0gYy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBjLmFyZywgbCA9IHAudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBsICYmIG4uY2FsbChsLCAnX19hd2FpdCcpID8gdC5yZXNvbHZlKGwuX19hd2FpdCkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCduZXh0JywgZSwgcywgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcigndGhyb3cnLCBlLCBzLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHQucmVzb2x2ZShsKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudmFsdWUgPSBlLCBzKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCd0aHJvdycsIGUsIHMsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShjLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obywgaSwgciwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IHIgPyByLnRoZW4ocywgcykgOiBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuaXRlcmF0b3JbdC5tZXRob2RdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5kZWxlZ2F0ZSA9IG51bGwsICd0aHJvdycgPT09IHQubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXRlcmF0b3IucmV0dXJuICYmICh0Lm1ldGhvZCA9ICdyZXR1cm4nLCB0LmFyZyA9IHZvaWQgMCwgQyhlLCB0KSwgJ3Rocm93JyA9PT0gdC5tZXRob2QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1ldGhvZCA9ICd0aHJvdycsIHQuYXJnID0gbmV3IFR5cGVFcnJvcignVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSBcJ3Rocm93XCcgbWV0aG9kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHUobiwgZS5pdGVyYXRvciwgdC5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyA9PT0gci50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWV0aG9kID0gJ3Rocm93JywgdC5hcmcgPSByLmFyZywgdC5kZWxlZ2F0ZSA9IG51bGwsIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gci5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID8gby5kb25lID8gKHRbZS5yZXN1bHROYW1lXSA9IG8udmFsdWUsIHQubmV4dCA9IGUubmV4dExvYywgJ3JldHVybicgIT09IHQubWV0aG9kICYmICh0Lm1ldGhvZCA9ICduZXh0JywgdC5hcmcgPSB2b2lkIDApLCB0LmRlbGVnYXRlID0gbnVsbCwgcCkgOiBvIDogKHQubWV0aG9kID0gJ3Rocm93JywgdC5hcmcgPSBuZXcgVHlwZUVycm9yKCdpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCcpLCB0LmRlbGVnYXRlID0gbnVsbCwgcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsgdHJ5TG9jOiBlWzBdIH07CiAgICAgICAgICAgICAgICAgICAgICAgIDEgaW4gZSAmJiAodC5jYXRjaExvYyA9IGVbMV0pLCAyIGluIGUgJiYgKHQuZmluYWxseUxvYyA9IGVbMl0sIHQuYWZ0ZXJMb2MgPSBlWzNdKSwgdGhpcy50cnlFbnRyaWVzLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY29tcGxldGlvbiB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdC50eXBlID0gJ25vcm1hbCcsIGRlbGV0ZSB0LmFyZywgZS5jb21wbGV0aW9uID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogJ3Jvb3QnIH1dLCBlLmZvckVhY2goXywgdGhpcyksIHRoaXMucmVzZXQoITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGUubmV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4oZS5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAtMSwgaSA9IGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgKytyIDwgZS5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmNhbGwoZSwgcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlID0gZVtyXSwgdC5kb25lID0gITEsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZSA9IHZvaWQgMCwgdC5kb25lID0gITAsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubmV4dCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbmV4dDogTCB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnByb3RvdHlwZSA9IGcuY29uc3RydWN0b3IgPSBmLCBmLmNvbnN0cnVjdG9yID0gZCwgZC5kaXNwbGF5TmFtZSA9IGEoZiwgcywgJ0dlbmVyYXRvckZ1bmN0aW9uJyksIGUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGUgJiYgZS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAodCA9PT0gZCB8fCAnR2VuZXJhdG9yRnVuY3Rpb24nID09PSAodC5kaXNwbGF5TmFtZSB8fCB0Lm5hbWUpKTsKICAgICAgICAgICAgICAgICAgICB9LCBlLm1hcmsgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsIGYpIDogKGUuX19wcm90b19fID0gZiwgYShlLCBzLCAnR2VuZXJhdG9yRnVuY3Rpb24nKSksIGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShnKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCBlLmF3cmFwID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgX19hd2FpdDogZSB9OwogICAgICAgICAgICAgICAgICAgIH0sIG0oYi5wcm90b3R5cGUpLCBiLnByb3RvdHlwZVtpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5Bc3luY0l0ZXJhdG9yID0gYiwgZS5hc3luYyA9IGZ1bmN0aW9uICh0LCBuLCByLCBvLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IFByb21pc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBiKGModCwgbiwgciwgbyksIGkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pID8gcyA6IHMubmV4dCgpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRvbmUgPyBlLnZhbHVlIDogcy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIG0oZyksIGEoZywgcywgJ0dlbmVyYXRvcicpLCBnW29dID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICB9LCBnLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgR2VuZXJhdG9yXSc7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5rZXlzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKG4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yZXZlcnNlKCksIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdC5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnZhbHVlID0gciwgbi5kb25lID0gITEsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5kb25lID0gITAsIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgZS52YWx1ZXMgPSBJLCBTLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IFMsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA9IDAsIHRoaXMubmV4dCA9IDAsIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB2b2lkIDAsIHRoaXMuZG9uZSA9ICExLCB0aGlzLmRlbGVnYXRlID0gbnVsbCwgdGhpcy5tZXRob2QgPSAnbmV4dCcsIHRoaXMuYXJnID0gdm9pZCAwLCB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChFKSwgIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcgPT09IHQuY2hhckF0KDApICYmIG4uY2FsbCh0aGlzLCB0KSAmJiAhaXNOYU4oK3Quc2xpY2UoMSkpICYmICh0aGlzW3RdID0gdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb25lID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IGUudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlLmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJ2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMudHlwZSA9ICd0aHJvdycsIHMuYXJnID0gZSwgdC5uZXh0ID0gbiwgciAmJiAodC5tZXRob2QgPSAnbmV4dCcsIHQuYXJnID0gdm9pZCAwKSwgISFyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBvID49IDA7IC0tbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy50cnlFbnRyaWVzW29dLCBzID0gaS5jb21wbGV0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncm9vdCcgPT09IGkudHJ5TG9jKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcignZW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkudHJ5TG9jIDw9IHRoaXMucHJldikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4uY2FsbChpLCAnY2F0Y2hMb2MnKSwgYyA9IG4uY2FsbChpLCAnZmluYWxseUxvYycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5jYXRjaExvYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihpLmNhdGNoTG9jLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgaS5maW5hbGx5TG9jKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGkuZmluYWxseUxvYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGkuY2F0Y2hMb2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoaS5jYXRjaExvYywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBpLmZpbmFsbHlMb2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoaS5maW5hbGx5TG9jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWJydXB0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyByID49IDA7IC0tcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy50cnlFbnRyaWVzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLnRyeUxvYyA8PSB0aGlzLnByZXYgJiYgbi5jYWxsKG8sICdmaW5hbGx5TG9jJykgJiYgdGhpcy5wcmV2IDwgby5maW5hbGx5TG9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAoJ2JyZWFrJyA9PT0gZSB8fCAnY29udGludWUnID09PSBlKSAmJiBpLnRyeUxvYyA8PSB0ICYmIHQgPD0gaS5maW5hbGx5TG9jICYmIChpID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGkgPyBpLmNvbXBsZXRpb24gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnR5cGUgPSBlLCBzLmFyZyA9IHQsIGkgPyAodGhpcy5tZXRob2QgPSAnbmV4dCcsIHRoaXMubmV4dCA9IGkuZmluYWxseUxvYywgcCkgOiB0aGlzLmNvbXBsZXRlKHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndGhyb3cnID09PSBlLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJyA9PT0gZS50eXBlIHx8ICdjb250aW51ZScgPT09IGUudHlwZSA/IHRoaXMubmV4dCA9IGUuYXJnIDogJ3JldHVybicgPT09IGUudHlwZSA/ICh0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IGUuYXJnLCB0aGlzLm1ldGhvZCA9ICdyZXR1cm4nLCB0aGlzLm5leHQgPSAnZW5kJykgOiAnbm9ybWFsJyA9PT0gZS50eXBlICYmIHQgJiYgKHRoaXMubmV4dCA9IHQpLCBwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLnRyeUVudHJpZXNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uZmluYWxseUxvYyA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLCBuLmFmdGVyTG9jKSwgRShuKSwgcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IHQgPj0gMDsgLS10KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLnRyeUVudHJpZXNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4udHJ5TG9jID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5jb21wbGV0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyA9PT0gci50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHIuYXJnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lsbGVnYWwgY2F0Y2ggYXR0ZW1wdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3I6IEkoZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0TmFtZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TG9jOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnbmV4dCcgPT09IHRoaXMubWV0aG9kICYmICh0aGlzLmFyZyA9IHZvaWQgMCksIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfShlLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZWdlbmVyYXRvclJ1bnRpbWUgPSByOwogICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uKCdyJywgJ3JlZ2VuZXJhdG9yUnVudGltZSA9IHInKShyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIChyID0gdC5DbXBTdGF0dXMgfHwgKHQuQ21wU3RhdHVzID0ge30pKS5TVFVCID0gJ3N0dWInLCByLkxPQURJTkcgPSAnbG9hZGluZycsIHIuTE9BREVEID0gJ2xvYWRlZCcsIHIuRVJST1IgPSAnZXJyb3InOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgKHIgPSB0LkRpc3BsYXlTdGF0dXMgfHwgKHQuRGlzcGxheVN0YXR1cyA9IHt9KSkuVklTSUJMRSA9ICd2aXNpYmxlJywgci5ISURERU4gPSAnaGlkZGVuJywgci5ESVNBQkxFRCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCAociA9IHQuRXZlbnRTdGF0dXMgfHwgKHQuRXZlbnRTdGF0dXMgPSB7fSkpLlRDX0xPQURFRCA9ICd0Y2xvYWRlZCcsIHIuQ01QX1VJX1NIT1dOID0gJ2NtcHVpc2hvd24nLCByLlVTRVJfQUNUSU9OX0NPTVBMRVRFID0gJ3VzZXJhY3Rpb25jb21wbGV0ZSc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigzMCksIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50UXVldWUgPSBuZXcgTWFwKCksIHRoaXMucXVldWVOdW1iZXIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnRRdWV1ZS5zZXQodGhpcy5xdWV1ZU51bWJlciwgZSksIHRoaXMucXVldWVOdW1iZXIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV2ZW50UXVldWUuZGVsZXRlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS5leGVjID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ldmVudFF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgci5HZXRUQ0RhdGFDb21tYW5kKGUuY2FsbGJhY2ssIGUucGFyYW0sIHQsIGUubmV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXVlTnVtYmVyID0gMCwgdGhpcy5ldmVudFF1ZXVlLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwgJ3NpemUnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudFF1ZXVlLnNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuRXZlbnRMaXN0ZW5lclF1ZXVlID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCwgbiksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gbiA/IE9iamVjdC5jcmVhdGUobikgOiAoci5wcm90b3R5cGUgPSBuLnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpLCBvID0gdGhpcyAmJiB0aGlzLl9fcmVhZCB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlW1N5bWJvbC5pdGVyYXRvcl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgaSA9IG4uY2FsbChlKSwgcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICh2b2lkIDAgPT09IHQgfHwgdC0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmU7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaChyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHsgZXJyb3I6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAhci5kb25lICYmIChuID0gaS5yZXR1cm4pICYmIG4uY2FsbChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG8uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgaSA9IHRoaXMgJiYgdGhpcy5fX3NwcmVhZCB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgdCA9IDA7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5jb25jYXQobyhhcmd1bWVudHNbdF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY2FsbCh0aGlzLCB0KSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIG4ub3V0T2ZCYW5kLCBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgdC5wcm90b3R5cGUuY3JlYXRlVmVjdG9yRmllbGQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICsgKHRbMV0gPyAnMScgOiAnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuY3JlYXRlUmVzdHJpY3Rpb25zID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubnVtUmVzdHJpY3Rpb25zID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmdldE1heFZlbmRvcklkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFJlc3RyaWN0aW9ucygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2UucHVycG9zZUlkLnRvU3RyaW5nKCldID0gJ18nLnJlcGVhdChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRSZXN0cmljdGlvbnMocikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5yZXN0cmljdGlvblR5cGUudG9TdHJpbmcoKSwgbyA9IGUucHVycG9zZUlkLnRvU3RyaW5nKCksIGkgPSB0W29dLnN1YnN0cigwLCBuKSwgcyA9IHRbb10uc3Vic3RyKG4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W29dID0gaSArIHIgKyBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSAwOyBvIDwgbjsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIobyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0obig1MCkuVENEYXRhKTsKICAgICAgICAgICAgICAgIHQuSW5BcHBUQ0RhdGEgPSBzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxMyksIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNtcExvYWRlZCA9ICEwLCB0LmNtcFN0YXR1cyA9IG8uQ21wQXBpTW9kZWwuY21wU3RhdHVzLCB0LmRpc3BsYXlTdGF0dXMgPSBvLkNtcEFwaU1vZGVsLmRpc3BsYXlTdGF0dXMsIHQuYXBpVmVyc2lvbiA9ICcnICsgby5DbXBBcGlNb2RlbC5hcGlWZXJzaW9uLCBvLkNtcEFwaU1vZGVsLnRjTW9kZWwgJiYgby5DbXBBcGlNb2RlbC50Y01vZGVsLnZlbmRvckxpc3RWZXJzaW9uICYmICh0Lmd2bFZlcnNpb24gPSArby5DbXBBcGlNb2RlbC50Y01vZGVsLnZlbmRvckxpc3RWZXJzaW9uKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICB9KG4oMjgpLlJlc3BvbnNlKTsKICAgICAgICAgICAgICAgIHQuUGluZyA9IGk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMyksIG8gPSBuKDI5KSwgaSA9IG4oNTEpLCBzID0gbig1MiksIGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCwgbiwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBuICYmIChuID0gITEpLCB0aGlzLm51bVVwZGF0ZXMgPSAwLCB0aGlzLnRocm93SWZJbnZhbGlkSW50KGUsICdjbXBJZCcsIDIpLCB0aGlzLnRocm93SWZJbnZhbGlkSW50KHQsICdjbXBWZXJzaW9uJywgMCksIHIuQ21wQXBpTW9kZWwuY21wSWQgPSBlLCByLkNtcEFwaU1vZGVsLmNtcFZlcnNpb24gPSB0LCB0aGlzLmlzU2VydmljZVNwZWNpZmljID0gISFuLCB0aGlzLmNhbGxSZXNwb25kZXIgPSBuZXcgaS5DYWxsUmVzcG9uZGVyKG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS50aHJvd0lmSW52YWxpZEludCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgnbnVtYmVyJyA9PSB0eXBlb2YgZSAmJiBOdW1iZXIuaXNJbnRlZ2VyKGUpICYmIGUgPj0gbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkICcgKyB0ICsgJzogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCAmJiAodCA9ICExKSwgci5DbXBBcGlNb2RlbC5kaXNhYmxlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NtcEFwaSBEaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5DbXBBcGlNb2RlbC5jbXBTdGF0dXMgPSBvLkNtcFN0YXR1cy5MT0FERUQsIHQgPyAoci5DbXBBcGlNb2RlbC5kaXNwbGF5U3RhdHVzID0gby5EaXNwbGF5U3RhdHVzLlZJU0lCTEUsIHIuQ21wQXBpTW9kZWwuZXZlbnRTdGF0dXMgPSBvLkV2ZW50U3RhdHVzLkNNUF9VSV9TSE9XTikgOiB2b2lkIDAgPT09IHIuQ21wQXBpTW9kZWwudGNNb2RlbCA/IChyLkNtcEFwaU1vZGVsLmRpc3BsYXlTdGF0dXMgPSBvLkRpc3BsYXlTdGF0dXMuRElTQUJMRUQsIHIuQ21wQXBpTW9kZWwuZXZlbnRTdGF0dXMgPSBvLkV2ZW50U3RhdHVzLlRDX0xPQURFRCkgOiAoci5DbXBBcGlNb2RlbC5kaXNwbGF5U3RhdHVzID0gby5EaXNwbGF5U3RhdHVzLkhJRERFTiwgci5DbXBBcGlNb2RlbC5ldmVudFN0YXR1cyA9IG8uRXZlbnRTdGF0dXMuVVNFUl9BQ1RJT05fQ09NUExFVEUpLCByLkNtcEFwaU1vZGVsLmdkcHJBcHBsaWVzID0gbnVsbCAhPT0gZSwgci5DbXBBcGlNb2RlbC5nZHByQXBwbGllcyA/ICgnJyA9PT0gZSA/IChyLkNtcEFwaU1vZGVsLnRjTW9kZWwgPSBuZXcgcy5UQ01vZGVsKCksIHIuQ21wQXBpTW9kZWwudGNNb2RlbC5jbXBJZCA9IHIuQ21wQXBpTW9kZWwuY21wSWQsIHIuQ21wQXBpTW9kZWwudGNNb2RlbC5jbXBWZXJzaW9uID0gci5DbXBBcGlNb2RlbC5jbXBWZXJzaW9uKSA6IHIuQ21wQXBpTW9kZWwudGNNb2RlbCA9IHMuVENTdHJpbmcuZGVjb2RlKGUpLCByLkNtcEFwaU1vZGVsLnRjTW9kZWwuaXNTZXJ2aWNlU3BlY2lmaWMgPSB0aGlzLmlzU2VydmljZVNwZWNpZmljLCByLkNtcEFwaU1vZGVsLnRjZlBvbGljeVZlcnNpb24gPSArci5DbXBBcGlNb2RlbC50Y01vZGVsLnBvbGljeVZlcnNpb24sIHIuQ21wQXBpTW9kZWwudGNTdHJpbmcgPSBlKSA6IHIuQ21wQXBpTW9kZWwudGNNb2RlbCA9IG51bGwsIDAgPT09IHRoaXMubnVtVXBkYXRlcyA/IHRoaXMuY2FsbFJlc3BvbmRlci5wdXJnZVF1ZXVlZENhbGxzKCkgOiByLkNtcEFwaU1vZGVsLmV2ZW50UXVldWUuZXhlYygpLCB0aGlzLm51bVVwZGF0ZXMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuQ21wQXBpTW9kZWwuZGlzYWJsZWQgPSAhMCwgci5DbXBBcGlNb2RlbC5jbXBTdGF0dXMgPSBvLkNtcFN0YXR1cy5FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LkNtcEFwaSA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMDgpLCBvID0gbigzMCksIGkgPSBuKDEwOSksIHMgPSBuKDExMCksIGEgPSBuKDEyNSksIGMgPSBuKDEyNiksIHUgPSBuKDQ4KSwgcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgcCwgbCwgZCwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSB1LlRDRkNvbW1hbmQuUElORywgbiA9IHUuVENGQ29tbWFuZC5HRVRfVENfREFUQSwgcCA9IHUuVENGQ29tbWFuZC5HRVRfSU5fQVBQX1RDX0RBVEEsIGwgPSB1LlRDRkNvbW1hbmQuR0VUX1ZFTkRPUl9MSVNULCBkID0gdS5UQ0ZDb21tYW5kLkFERF9FVkVOVF9MSVNURU5FUiwgZiA9IHUuVENGQ29tbWFuZC5SRU1PVkVfRVZFTlRfTElTVEVORVIsIGVbdF0gPSByLlBpbmdDb21tYW5kLCBlW25dID0gby5HZXRUQ0RhdGFDb21tYW5kLCBlW3BdID0gaS5HZXRJbkFwcFRDRGF0YUNvbW1hbmQsIGVbbF0gPSBzLkdldFZlbmRvckxpc3RDb21tYW5kLCBlW2RdID0gYS5BZGRFdmVudExpc3RlbmVyQ29tbWFuZCwgZVtmXSA9IGMuUmVtb3ZlRXZlbnRMaXN0ZW5lckNvbW1hbmQsIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5Db21tYW5kTWFwID0gcDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IG4oMjcpLCBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0LnByb3RvdHlwZS5yZXNwb25kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VDYWxsYmFjayhuZXcgby5QaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0obigzMSkuQ29tbWFuZCk7CiAgICAgICAgICAgICAgICB0LlBpbmdDb21tYW5kID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IG4oMzApLCBpID0gbigyNyksIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLnJlc3BvbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRocm93SWZQYXJhbUludmFsaWQoKSwgdGhpcy5pbnZva2VDYWxsYmFjayhuZXcgaS5JbkFwcFRDRGF0YSh0aGlzLnBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfShvLkdldFRDRGF0YUNvbW1hbmQpOwogICAgICAgICAgICAgICAgdC5HZXRJbkFwcFRDRGF0YUNvbW1hbmQgPSBzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxMyksIGkgPSBuKDMxKSwgcyA9IG4oNTIpLCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0LnByb3RvdHlwZS5yZXNwb25kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSB0aGlzLCBuID0gby5DbXBBcGlNb2RlbC50Y01vZGVsLCByID0gbi52ZW5kb3JMaXN0VmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdGhpcy5wYXJhbSAmJiAodGhpcy5wYXJhbSA9IHIpLCAoZSA9IHRoaXMucGFyYW0gPT09IHIgJiYgbi5ndmwgPyBuLmd2bCA6IG5ldyBzLkdWTCh0aGlzLnBhcmFtKSkucmVhZHlQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW52b2tlQ2FsbGJhY2soZS5nZXRKc29uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfShpLkNvbW1hbmQpOwogICAgICAgICAgICAgICAgdC5HZXRWZW5kb3JMaXN0Q29tbWFuZCA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgJiYgKGVbbl0gPSB0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgbik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUodCwgbiksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gbiA/IE9iamVjdC5jcmVhdGUobikgOiAoci5wcm90b3R5cGUgPSBuLnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY2FsbCh0aGlzLCB0KSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5uYW1lID0gJ0RlY29kaW5nRXJyb3InLCBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgdDsKICAgICAgICAgICAgICAgIH0oRXJyb3IpOwogICAgICAgICAgICAgICAgdC5EZWNvZGluZ0Vycm9yID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jYWxsKHRoaXMsIHQpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLm5hbWUgPSAnRW5jb2RpbmdFcnJvcicsIG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0OwogICAgICAgICAgICAgICAgfShFcnJvcik7CiAgICAgICAgICAgICAgICB0LkVuY29kaW5nRXJyb3IgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNhbGwodGhpcywgdCkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubmFtZSA9ICdHVkxFcnJvcicsIG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0OwogICAgICAgICAgICAgICAgfShFcnJvcik7CiAgICAgICAgICAgICAgICB0LkdWTEVycm9yID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gciAmJiAociA9ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLmNhbGwodGhpcywgJ2ludmFsaWQgdmFsdWUgJyArIG4gKyAnIHBhc3NlZCBmb3IgJyArIHQgKyAnICcgKyByKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5uYW1lID0gJ1RDTW9kZWxFcnJvcicsIG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByKHQsIGUpLCB0OwogICAgICAgICAgICAgICAgfShFcnJvcik7CiAgICAgICAgICAgICAgICB0LlRDTW9kZWxFcnJvciA9IG87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sYW5nU2V0Lmhhcyh0KTsKICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5sYW5nU2V0LmZvckVhY2godCk7CiAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCAnc2l6ZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sYW5nU2V0LnNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSksIGUubGFuZ1NldCA9IG5ldyBTZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAnQkcnLAogICAgICAgICAgICAgICAgICAgICAgICAnQ0EnLAogICAgICAgICAgICAgICAgICAgICAgICAnQ1MnLAogICAgICAgICAgICAgICAgICAgICAgICAnREEnLAogICAgICAgICAgICAgICAgICAgICAgICAnREUnLAogICAgICAgICAgICAgICAgICAgICAgICAnRUwnLAogICAgICAgICAgICAgICAgICAgICAgICAnRU4nLAogICAgICAgICAgICAgICAgICAgICAgICAnRVMnLAogICAgICAgICAgICAgICAgICAgICAgICAnRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAnRkknLAogICAgICAgICAgICAgICAgICAgICAgICAnRlInLAogICAgICAgICAgICAgICAgICAgICAgICAnSFInLAogICAgICAgICAgICAgICAgICAgICAgICAnSFUnLAogICAgICAgICAgICAgICAgICAgICAgICAnSVQnLAogICAgICAgICAgICAgICAgICAgICAgICAnSkEnLAogICAgICAgICAgICAgICAgICAgICAgICAnTFQnLAogICAgICAgICAgICAgICAgICAgICAgICAnTFYnLAogICAgICAgICAgICAgICAgICAgICAgICAnTVQnLAogICAgICAgICAgICAgICAgICAgICAgICAnTkwnLAogICAgICAgICAgICAgICAgICAgICAgICAnTk8nLAogICAgICAgICAgICAgICAgICAgICAgICAnUEwnLAogICAgICAgICAgICAgICAgICAgICAgICAnUFQnLAogICAgICAgICAgICAgICAgICAgICAgICAnUk8nLAogICAgICAgICAgICAgICAgICAgICAgICAnUlUnLAogICAgICAgICAgICAgICAgICAgICAgICAnU0snLAogICAgICAgICAgICAgICAgICAgICAgICAnU0wnLAogICAgICAgICAgICAgICAgICAgICAgICAnU1YnLAogICAgICAgICAgICAgICAgICAgICAgICAnVFInLAogICAgICAgICAgICAgICAgICAgICAgICAnWkgnCiAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB0LkNvbnNlbnRMYW5ndWFnZXMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0LCBuKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBuID8gT2JqZWN0LmNyZWF0ZShuKSA6IChyLnByb3RvdHlwZSA9IG4ucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCksIG8gPSB0aGlzICYmIHRoaXMuX192YWx1ZXMgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yLCBuID0gdCAmJiBlW3RdLCByID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgciA+PSBlLmxlbmd0aCAmJiAoZSA9IHZvaWQgMCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlICYmIGVbcisrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICFlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcih0ID8gJ09iamVjdCBpcyBub3QgaXRlcmFibGUuJyA6ICdTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDU2KSwgcyA9IG4oNTQpLCBhID0gbigzOCksIGMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudWxsICE9PSBlICYmIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYml0TGVuZ3RoID0gMCwgdC5tYXAgPSBuZXcgTWFwKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAuaGFzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5pc09rVG9IYXZlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBvID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gKHIgPSB0aGlzLmd2bCkgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci52ZW5kb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmd2bC52ZW5kb3JzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gYS5SZXN0cmljdGlvblR5cGUuTk9UX0FMTE9XRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gaS5sZWdJbnRQdXJwb3Nlcy5pbmNsdWRlcyh0KSB8fCBpLnB1cnBvc2VzLmluY2x1ZGVzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpLmZsZXhpYmxlUHVycG9zZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGEuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfQ09OU0VOVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gaS5mbGV4aWJsZVB1cnBvc2VzLmluY2x1ZGVzKHQpICYmIGkubGVnSW50UHVycG9zZXMuaW5jbHVkZXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGEuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfTEk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGkuZmxleGlibGVQdXJwb3Nlcy5pbmNsdWRlcyh0KSAmJiBpLnB1cnBvc2VzLmluY2x1ZGVzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT2tUb0hhdmUodC5yZXN0cmljdGlvblR5cGUsIHQucHVycG9zZUlkLCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5oYXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzKG4pIHx8ICh0aGlzLm1hcC5zZXQobiwgbmV3IHMuQmluYXJ5U2VhcmNoVHJlZSgpKSwgdGhpcy5iaXRMZW5ndGggPSAwKSwgdGhpcy5tYXAuZ2V0KG4pLmFkZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUucmVzdHJpY3RQdXJwb3NlVG9MZWdhbEJhc2lzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB0aGlzLmd2bC52ZW5kb3JJZHMsIG4gPSBlLmhhc2gsIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IG8odCksIHMgPSBpLm5leHQoKTsgIXMuZG9uZTsgcyA9IGkubmV4dCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gcy52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0geyBlcnJvcjogdCB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmICFzLmRvbmUgJiYgKG4gPSBpLnJldHVybikgJiYgbi5jYWxsKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBpID0gMTsgaSA8PSByOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXMobikgfHwgKHRoaXMubWFwLnNldChuLCBuZXcgcy5CaW5hcnlTZWFyY2hUcmVlKCkpLCB0aGlzLmJpdExlbmd0aCA9IDApLCB0aGlzLm1hcC5nZXQobikuYWRkKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5nZXRWZW5kb3JzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5oYXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzKG4pICYmICh0ID0gdGhpcy5tYXAuZ2V0KG4pLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldCgpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWRkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCA9IEFycmF5LmZyb20ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZ2V0UmVzdHJpY3Rpb25UeXBlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY3Rpb25zKGUpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1cnBvc2VJZCA9PT0gdCAmJiAodm9pZCAwID09PSBuIHx8IG4gPiBlLnJlc3RyaWN0aW9uVHlwZSkgJiYgKG4gPSBlLnJlc3RyaWN0aW9uVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudmVuZG9ySGFzUmVzdHJpY3Rpb24gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9ICExLCByID0gdGhpcy5nZXRSZXN0cmljdGlvbnMoZSksIG8gPSAwOyBvIDwgci5sZW5ndGggJiYgIW47IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdC5pc1NhbWVBcyhyW29dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5nZXRNYXhWZW5kb3JJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE1hdGgubWF4KHQubWF4KCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldFJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwLmZvckVhY2goZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gbi5jb250YWlucyhlKSAmJiB0LnB1c2goaS5QdXJwb3NlUmVzdHJpY3Rpb24udW5IYXNoKHIpKSA6IHQucHVzaChpLlB1cnBvc2VSZXN0cmljdGlvbi51bkhhc2gocikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmdldFB1cnBvc2VzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWRkKGkuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChuKS5wdXJwb3NlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuaGFzaCwgciA9IHRoaXMubWFwLmdldChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgKHIucmVtb3ZlKGUpLCByLmlzRW1wdHkoKSAmJiAodGhpcy5tYXAuZGVsZXRlKG4pLCB0aGlzLmJpdExlbmd0aCA9IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAnZ3ZsJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ZsXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3ZsXyB8fCAodGhpcy5ndmxfID0gZSwgdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXQoKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmlzT2tUb0hhdmUoci5yZXN0cmljdGlvblR5cGUsIHIucHVycG9zZUlkLCBuKSB8fCBlLnJlbW92ZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSB0aGlzLm1hcC5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdudW1SZXN0cmljdGlvbnMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfShuKDE1KS5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgdC5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3IgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgKHIgPSB0LkRldmljZURpc2Nsb3N1cmVTdG9yYWdlQWNjZXNzVHlwZSB8fCAodC5EZXZpY2VEaXNjbG9zdXJlU3RvcmFnZUFjY2Vzc1R5cGUgPSB7fSkpLkNPT0tJRSA9ICdjb29raWUnLCByLldFQiA9ICd3ZWInLCByLkFQUCA9ICdhcHAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbig1NyksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuSURfVE9fS0VZID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5TZWdtZW50LkNPUkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLlNlZ21lbnQuVkVORE9SU19BTExPV0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5TZWdtZW50LlBVQkxJU0hFUl9UQwogICAgICAgICAgICAgICAgICAgICAgICBdLCBlLktFWV9UT19JRCA9ICgociA9IHt9KVtvLlNlZ21lbnQuQ09SRV0gPSAwLCByW28uU2VnbWVudC5WRU5ET1JTX0RJU0NMT1NFRF0gPSAxLCByW28uU2VnbWVudC5WRU5ET1JTX0FMTE9XRURdID0gMiwgcltvLlNlZ21lbnQuUFVCTElTSEVSX1RDXSA9IDMsIHIpLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuU2VnbWVudElEcyA9IGk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkobikgJiYgKGVbbl0gPSB0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgbyA9IHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvciB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgaSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxICYgb1swXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG9bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5czogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBhKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c6IGEoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm46IGEoMikKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIChpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgczspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gMSwgciAmJiAobyA9IDIgJiBpWzBdID8gci5yZXR1cm4gOiBpWzBdID8gci50aHJvdyB8fCAoKG8gPSByLnJldHVybikgJiYgby5jYWxsKHIpLCAwKSA6IHIubmV4dCkgJiYgIShvID0gby5jYWxsKHIsIGlbMV0pKS5kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIgPSAwLCBvICYmIChpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAmIGlbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBpWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMubGFiZWwrKywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCsrLCByID0gaVsxXSwgaSA9IFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcy5vcHMucG9wKCksIHMudHJ5cy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoKG8gPSAobyA9IHMudHJ5cykubGVuZ3RoID4gMCAmJiBvW28ubGVuZ3RoIC0gMV0pIHx8IDYgIT09IGlbMF0gJiYgMiAhPT0gaVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDMgPT09IGlbMF0gJiYgKCFvIHx8IGlbMV0gPiBvWzBdICYmIGlbMV0gPCBvWzNdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCA9IGlbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNiA9PT0gaVswXSAmJiBzLmxhYmVsIDwgb1sxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYWJlbCA9IG9bMV0sIG8gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgcy5sYWJlbCA8IG9bMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGFiZWwgPSBvWzJdLCBzLm9wcy5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1syXSAmJiBzLm9wcy5wb3AoKSwgcy50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQuY2FsbChlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgciA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDUgJiBpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpWzBdID8gaVsxXSA6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oMTUpLCBzID0gbig1KSwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5iaXRMZW5ndGggPSAwLCB0Lm1heElkXyA9IDAsIHQuc2V0XyA9IG5ldyBTZXQoKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0LCBlKSwgdC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8odGhpcywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAxLCB0LmxhYmVsID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIDw9IHRoaXMubWF4SWQgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXMoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNlbnQoKSwgdC5sYWJlbCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSsrLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Xy52YWx1ZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCAnbWF4SWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhJZF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0Xy5oYXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVuc2V0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZSkgPyBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC51bnNldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogJ29iamVjdCcgPT0gdHlwZW9mIGUgPyB0aGlzLnVuc2V0KE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiArZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6ICh0aGlzLnNldF8uZGVsZXRlKGUpLCB0aGlzLmJpdExlbmd0aCA9IDAsIGUgPT09IHRoaXMubWF4SWQgJiYgKHRoaXMubWF4SWRfID0gMCwgdGhpcy5zZXRfLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1heElkXyA9IE1hdGgubWF4KHQubWF4SWQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuaXNJbnRNYXAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBuID0gJ29iamVjdCcgPT0gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBPYmplY3Qua2V5cyhlKS5ldmVyeShmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTnVtYmVyLmlzSW50ZWdlcihwYXJzZUludChuLCAxMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAociA9IHIgJiYgdC5pc1ZhbGlkTnVtYmVyKGVbbl0uaWQpKSAmJiB2b2lkIDAgIT09IGVbbl0ubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5pc1ZhbGlkTnVtYmVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlLCAxMCkgPiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5pc1NldCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBTZXQgJiYgKHQgPSBBcnJheS5mcm9tKGUpLmV2ZXJ5KHRoaXMuaXNWYWxpZE51bWJlcikpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTZXQoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoQXJyYXkuZnJvbShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzSW50TWFwKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gK2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWROdW1iZXIoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBzLlRDTW9kZWxFcnJvcignc2V0KCknLCBlLCAnbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGFycmF5LCBwb3NpdGl2ZSBpbnRlZ2VyLCBTZXQ8bnVtYmVyPiwgb3IgSW50TWFwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfLmFkZChlKSwgdGhpcy5tYXhJZF8gPSBNYXRoLm1heCh0aGlzLm1heElkLCBlKSwgdGhpcy5iaXRMZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0XyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8PSB0aGlzLm1heElkOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0aGlzLmhhcyh0KSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwgJ3NpemUnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRfLnNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LnByb3RvdHlwZS5zZXRBbGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfShpLkNsb25lYWJsZSk7CiAgICAgICAgICAgICAgICB0LlZlY3RvciA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig1MyksIG8gPSBuKDM3KSwgaSA9IG4oNTgpLCBzID0gbig2NCksIGEgPSBuKDUpLCBjID0gbig1NSksIHUgPSBuKDYpLCBwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmVuY29kZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0aGlzLmZpZWxkU2VxdWVuY2VbJycgKyBlLnZlcnNpb25dW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhLkVuY29kaW5nRXJyb3IoJ1VuYWJsZSB0byBlbmNvZGUgdmVyc2lvbjogJyArIGUudmVyc2lvbiArICcsIHNlZ21lbnQ6ICcgKyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAhPT0gdS5TZWdtZW50LkNPUkUgJiYgKHAgPSBpLkludEVuY29kZXIuZW5jb2RlKHUuU2VnbWVudElEcy5LRVlfVE9fSURbdF0sIG8uQml0TGVuZ3RoLnNlZ21lbnRUeXBlKSksIG4uZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZVtuXSwgdSA9IGkuRmllbGRFbmNvZGVyTWFwW25dLCBsID0gby5CaXRMZW5ndGhbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBsICYmIHMuaXNQdWJsaXNoZXJDdXN0b20obikgJiYgKGwgPSArZVtjLkZpZWxkcy5udW1DdXN0b21QdXJwb3Nlc10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gdS5lbmNvZGUociwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYS5FbmNvZGluZ0Vycm9yKCdFcnJvciBlbmNvZGluZyAnICsgdCArICctPicgKyBuICsgJzogJyArIGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIuQmFzZTY0VXJsLmVuY29kZShwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5kZWNvZGUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLCBwID0gci5CYXNlNjRVcmwuZGVjb2RlKGUpLCBsID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID09PSB1LlNlZ21lbnQuQ09SRSAmJiAodC52ZXJzaW9uID0gaS5JbnRFbmNvZGVyLmRlY29kZShwLnN1YnN0cihsLCBvLkJpdExlbmd0aFtjLkZpZWxkcy52ZXJzaW9uXSksIG8uQml0TGVuZ3RoW2MuRmllbGRzLnZlcnNpb25dKSksIG4gIT09IHUuU2VnbWVudC5DT1JFICYmIChsICs9IG8uQml0TGVuZ3RoLnNlZ21lbnRUeXBlKSwgdGhpcy5maWVsZFNlcXVlbmNlWycnICsgdC52ZXJzaW9uXVtuXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLkZpZWxkRW5jb2Rlck1hcFtlXSwgciA9IG8uQml0TGVuZ3RoW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHIgJiYgcy5pc1B1Ymxpc2hlckN1c3RvbShlKSAmJiAociA9ICt0W2MuRmllbGRzLm51bUN1c3RvbVB1cnBvc2VzXSksIDAgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBwLnN1YnN0cihsLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IGkuVmVuZG9yVmVjdG9yRW5jb2RlciA/IHRbZV0gPSBuLmRlY29kZSh1LCB0LnZlcnNpb24pIDogdFtlXSA9IG4uZGVjb2RlKHUsIHIpLCBOdW1iZXIuaXNJbnRlZ2VyKHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih0W2VdLmJpdExlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGEuRGVjb2RpbmdFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gdFtlXS5iaXRMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5pc1B1Ymxpc2hlckN1c3RvbSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5pbmRleE9mKCdwdWJsaXNoZXJDdXN0b20nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5maWVsZFNlcXVlbmNlID0gbmV3IHMuRmllbGRTZXF1ZW5jZSgpLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuU2VnbWVudEVuY29kZXIgPSBwOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNiksIG8gPSBuKDIzKSwgaSA9IG4oNTkpLCBzID0gbigzOSksIGEgPSBuKDE2KSwgYyA9IG4oNjApLCB1ID0gbig2MSksIHAgPSBuKDYyKSwgbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgbCwgZCwgZiwgaCwgeSwgdiwgZywgbSwgYiwgQywgXywgRSwgUywgSSwgTCwgUCwgdywgQSwgaywgTywgVCwgViwgeCwgUjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSByLkZpZWxkcy52ZXJzaW9uLCBuID0gci5GaWVsZHMuY3JlYXRlZCwgbCA9IHIuRmllbGRzLmxhc3RVcGRhdGVkLCBkID0gci5GaWVsZHMuY21wSWQsIGYgPSByLkZpZWxkcy5jbXBWZXJzaW9uLCBoID0gci5GaWVsZHMuY29uc2VudFNjcmVlbiwgeSA9IHIuRmllbGRzLmNvbnNlbnRMYW5ndWFnZSwgdiA9IHIuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLCBnID0gci5GaWVsZHMucG9saWN5VmVyc2lvbiwgbSA9IHIuRmllbGRzLmlzU2VydmljZVNwZWNpZmljLCBiID0gci5GaWVsZHMudXNlTm9uU3RhbmRhcmRTdGFja3MsIEMgPSByLkZpZWxkcy5zcGVjaWFsRmVhdHVyZU9wdGlucywgXyA9IHIuRmllbGRzLnB1cnBvc2VDb25zZW50cywgRSA9IHIuRmllbGRzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLCBTID0gci5GaWVsZHMucHVycG9zZU9uZVRyZWF0bWVudCwgSSA9IHIuRmllbGRzLnB1Ymxpc2hlckNvdW50cnlDb2RlLCBMID0gci5GaWVsZHMudmVuZG9yQ29uc2VudHMsIFAgPSByLkZpZWxkcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLCB3ID0gci5GaWVsZHMucHVibGlzaGVyUmVzdHJpY3Rpb25zLCBBID0gci5GaWVsZHMudmVuZG9yc0Rpc2Nsb3NlZCwgayA9IHIuRmllbGRzLnZlbmRvcnNBbGxvd2VkLCBPID0gci5GaWVsZHMucHVibGlzaGVyQ29uc2VudHMsIFQgPSByLkZpZWxkcy5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzLCBWID0gci5GaWVsZHMubnVtQ3VzdG9tUHVycG9zZXMsIHggPSByLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21Db25zZW50cywgUiA9IHIuRmllbGRzLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMsIGVbdF0gPSBhLkludEVuY29kZXIsIGVbbl0gPSBpLkRhdGVFbmNvZGVyLCBlW2xdID0gaS5EYXRlRW5jb2RlciwgZVtkXSA9IGEuSW50RW5jb2RlciwgZVtmXSA9IGEuSW50RW5jb2RlciwgZVtoXSA9IGEuSW50RW5jb2RlciwgZVt5XSA9IGMuTGFuZ0VuY29kZXIsIGVbdl0gPSBhLkludEVuY29kZXIsIGVbZ10gPSBhLkludEVuY29kZXIsIGVbbV0gPSBvLkJvb2xlYW5FbmNvZGVyLCBlW2JdID0gby5Cb29sZWFuRW5jb2RlciwgZVtDXSA9IHMuRml4ZWRWZWN0b3JFbmNvZGVyLCBlW19dID0gcy5GaXhlZFZlY3RvckVuY29kZXIsIGVbRV0gPSBzLkZpeGVkVmVjdG9yRW5jb2RlciwgZVtTXSA9IG8uQm9vbGVhbkVuY29kZXIsIGVbSV0gPSBjLkxhbmdFbmNvZGVyLCBlW0xdID0gcC5WZW5kb3JWZWN0b3JFbmNvZGVyLCBlW1BdID0gcC5WZW5kb3JWZWN0b3JFbmNvZGVyLCBlW3ddID0gdS5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3JFbmNvZGVyLCBlLnNlZ21lbnRUeXBlID0gYS5JbnRFbmNvZGVyLCBlW0FdID0gcC5WZW5kb3JWZWN0b3JFbmNvZGVyLCBlW2tdID0gcC5WZW5kb3JWZWN0b3JFbmNvZGVyLCBlW09dID0gcy5GaXhlZFZlY3RvckVuY29kZXIsIGVbVF0gPSBzLkZpeGVkVmVjdG9yRW5jb2RlciwgZVtWXSA9IGEuSW50RW5jb2RlciwgZVt4XSA9IHMuRml4ZWRWZWN0b3JFbmNvZGVyLCBlW1JdID0gcy5GaXhlZFZlY3RvckVuY29kZXIsIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5GaWVsZEVuY29kZXJNYXAgPSBsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNik7CiAgICAgICAgICAgICAgICB0LkZpZWxkU2VxdWVuY2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgdGhpc1sxXSA9ICgoZSA9IHt9KVtyLlNlZ21lbnQuQ09SRV0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLmNyZWF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLmxhc3RVcGRhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5jbXBJZCwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMuY21wVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMuY29uc2VudFNjcmVlbiwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMuY29uc2VudExhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy52ZW5kb3JMaXN0VmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMucHVycG9zZUNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy52ZW5kb3JDb25zZW50cwogICAgICAgICAgICAgICAgICAgIF0sIGUpLCB0aGlzWzJdID0gKCh0ID0ge30pW3IuU2VnbWVudC5DT1JFXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMuY3JlYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMubGFzdFVwZGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLmNtcElkLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5jbXBWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5jb25zZW50U2NyZWVuLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5jb25zZW50TGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5wb2xpY3lWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5pc1NlcnZpY2VTcGVjaWZpYywKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMudXNlTm9uU3RhbmRhcmRTdGFja3MsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnNwZWNpYWxGZWF0dXJlT3B0aW5zLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5wdXJwb3NlQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5wdXJwb3NlT25lVHJlYXRtZW50LAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5wdWJsaXNoZXJDb3VudHJ5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMudmVuZG9yQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnB1Ymxpc2hlclJlc3RyaWN0aW9ucwogICAgICAgICAgICAgICAgICAgIF0sIHRbci5TZWdtZW50LlBVQkxJU0hFUl9UQ10gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnB1Ymxpc2hlckNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICByLkZpZWxkcy5udW1DdXN0b21QdXJwb3NlcywKICAgICAgICAgICAgICAgICAgICAgICAgci5GaWVsZHMucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHIuRmllbGRzLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMKICAgICAgICAgICAgICAgICAgICBdLCB0W3IuU2VnbWVudC5WRU5ET1JTX0FMTE9XRURdID0gW3IuRmllbGRzLnZlbmRvcnNBbGxvd2VkXSwgdFtyLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRURdID0gW3IuRmllbGRzLnZlbmRvcnNEaXNjbG9zZWRdLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig2KTsKICAgICAgICAgICAgICAgIHQuU2VnbWVudFNlcXVlbmNlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1sxXSA9IFtyLlNlZ21lbnQuQ09SRV0sIHRoaXNbMl0gPSBbci5TZWdtZW50LkNPUkVdLCAyID09PSBlLnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlzU2VydmljZVNwZWNpZmljKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1syXS5wdXNoKHIuU2VnbWVudC5QVUJMSVNIRVJfVEMpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gISghdCB8fCAhdC5pc0ZvclZlbmRvcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAhMCAhPT0gZVtyLkZpZWxkcy5zdXBwb3J0T09CXSB8fCB0aGlzWzJdLnB1c2goci5TZWdtZW50LlZFTkRPUlNfRElTQ0xPU0VEKSwgbiAmJiAoZVtyLkZpZWxkcy5zdXBwb3J0T09CXSAmJiBlW3IuRmllbGRzLnZlbmRvcnNBbGxvd2VkXS5zaXplID4gMCAmJiB0aGlzWzJdLnB1c2goci5TZWdtZW50LlZFTkRPUlNfQUxMT1dFRCksIHRoaXNbMl0ucHVzaChyLlNlZ21lbnQuUFVCTElTSEVSX1RDKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig1KSwgbyA9IG4oNiksIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJvY2VzcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgbywgaSA9IGUuZ3ZsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyByLkVuY29kaW5nRXJyb3IoJ1VuYWJsZSB0byBlbmNvZGUgVENNb2RlbCB3aXRob3V0IGEgR1ZMJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkuaXNSZWFkeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgci5FbmNvZGluZ0Vycm9yKCdVbmFibGUgdG8gZW5jb2RlIFRDTW9kZWwgdGNNb2RlbC5ndmwucmVhZHlQcm9taXNlIGlzIG5vdCByZXNvbHZlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgPSBlLmNsb25lKCkpLmNvbnNlbnRMYW5ndWFnZSA9IGkubGFuZ3VhZ2UudG9VcHBlckNhc2UoKSwgKG51bGwgPT09IChuID0gdCkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi52ZXJzaW9uKSA+IDAgJiYgKG51bGwgPT09IChvID0gdCkgfHwgdm9pZCAwID09PSBvID8gdm9pZCAwIDogby52ZXJzaW9uKSA8PSB0aGlzLnByb2Nlc3Nvci5sZW5ndGggPyBlLnZlcnNpb24gPSB0LnZlcnNpb24gOiBlLnZlcnNpb24gPSB0aGlzLnByb2Nlc3Nvci5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGUudmVyc2lvbiAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJvY2Vzc29yW3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyByLkVuY29kaW5nRXJyb3IoJ0ludmFsaWQgdmVyc2lvbjogJyArIGUudmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzb3Jbc10oZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUucHJvY2Vzc29yID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVibGlzaGVyUmVzdHJpY3Rpb25zLmd2bCA9IHQsIGUucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMudW5zZXQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2V0KCdsZWdJbnRQdXJwb3NlcycsIGUudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyksIG4uc2V0KCdwdXJwb3NlcycsIGUudmVuZG9yQ29uc2VudHMpLCBuLmZvckVhY2goZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mb3JFYWNoKGZ1bmN0aW9uIChpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdC52ZW5kb3JzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSB8fCBhLmRlbGV0ZWREYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnVuc2V0KHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKDAgPT09IGFbcl0ubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5pc1NlcnZpY2VTcGVjaWZpYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBhLmZsZXhpYmxlUHVycG9zZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udW5zZXQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gZS5wdWJsaXNoZXJSZXN0cmljdGlvbnMuZ2V0UmVzdHJpY3Rpb25zKHMpLCB1ID0gITEsIHAgPSAwLCBsID0gYy5sZW5ndGg7IHAgPCBsICYmICF1OyBwKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBjW3BdLnJlc3RyaWN0aW9uVHlwZSA9PT0gby5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9DT05TRU5UICYmICdwdXJwb3NlcycgPT09IHIgfHwgY1twXS5yZXN0cmljdGlvblR5cGUgPT09IG8uUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfTEkgJiYgJ2xlZ0ludFB1cnBvc2VzJyA9PT0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IHx8IG4udW5zZXQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udW5zZXQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnZlbmRvcnNEaXNjbG9zZWQuc2V0KHQudmVuZG9ycyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5TZW1hbnRpY1ByZUVuY29kZXIgPSBpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxMyksIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLnJlc3BvbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVySWQgPSBvLkNtcEFwaU1vZGVsLmV2ZW50UXVldWUuYWRkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5jYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTogdGhpcy5wYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiB0aGlzLm5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLnByb3RvdHlwZS5yZXNwb25kLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfShuKDMwKS5HZXRUQ0RhdGFDb21tYW5kKTsKICAgICAgICAgICAgICAgIHQuQWRkRXZlbnRMaXN0ZW5lckNvbW1hbmQgPSBpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KG4pICYmIChlW25dID0gdFtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKHQsIG4pLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IG4gPyBPYmplY3QuY3JlYXRlKG4pIDogKHIucHJvdG90eXBlID0gbi5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gbigxMyksIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCwgZSksIHQucHJvdG90eXBlLnJlc3BvbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUNhbGxiYWNrKG8uQ21wQXBpTW9kZWwuZXZlbnRRdWV1ZS5yZW1vdmUodGhpcy5wYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0obigzMSkuQ29tbWFuZCk7CiAgICAgICAgICAgICAgICB0LlJlbW92ZUV2ZW50TGlzdGVuZXJDb21tYW5kID0gaTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlICYmIChlID0gK2UpLCB0aGlzLnNldF8uaGFzKGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGUuc2V0XyA9IG5ldyBTZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwKICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIHQuU3VwcG9ydGVkVmVyc2lvbnMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcpLCBvID0gbig3MSksIGkgPSBuKDEyOSksIHMgPSBuKDc3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IGkoZSksIG4gPSBvKGkucHJvdG90eXBlLnJlcXVlc3QsIHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmV4dGVuZChuLCBpLnByb3RvdHlwZSwgdCksIHIuZXh0ZW5kKG4sIHQpLCBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGMgPSBhKG4oNzQpKTsKICAgICAgICAgICAgICAgIGMuQXhpb3MgPSBpLCBjLmNyZWF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEocyhjLmRlZmF1bHRzLCBlKSk7CiAgICAgICAgICAgICAgICB9LCBjLkNhbmNlbCA9IG4oNzgpLCBjLkNhbmNlbFRva2VuID0gbigxNDMpLCBjLmlzQ2FuY2VsID0gbig3MyksIGMuYWxsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZSk7CiAgICAgICAgICAgICAgICB9LCBjLnNwcmVhZCA9IG4oMTQ0KSwgZS5leHBvcnRzID0gYywgZS5leHBvcnRzLmRlZmF1bHQgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcpLCBvID0gbig3MiksIGkgPSBuKDEzMCksIHMgPSBuKDEzMSksIGEgPSBuKDc3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdHMgPSBlLCB0aGlzLmludGVyY2VwdG9ycyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogbmV3IGkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IG5ldyBpKCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYy5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiBlID8gKGUgPSBhcmd1bWVudHNbMV0gfHwge30pLnVybCA9IGFyZ3VtZW50c1swXSA6IGUgPSBlIHx8IHt9LCAoZSA9IGEodGhpcy5kZWZhdWx0cywgZSkpLm1ldGhvZCA/IGUubWV0aG9kID0gZS5tZXRob2QudG9Mb3dlckNhc2UoKSA6IHRoaXMuZGVmYXVsdHMubWV0aG9kID8gZS5tZXRob2QgPSB0aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpIDogZS5tZXRob2QgPSAnZ2V0JzsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgXSwgbiA9IFByb21pc2UucmVzb2x2ZShlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC51bnNoaWZ0KGUuZnVsZmlsbGVkLCBlLnJlamVjdGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChlLmZ1bGZpbGxlZCwgZS5yZWplY3RlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyB0Lmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuLnRoZW4odC5zaGlmdCgpLCB0LnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuZ2V0VXJpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGEodGhpcy5kZWZhdWx0cywgZSksIG8oZS51cmwsIGUucGFyYW1zLCBlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sICcnKTsKICAgICAgICAgICAgICAgIH0sIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgJ2dldCcsCiAgICAgICAgICAgICAgICAgICAgJ2hlYWQnLAogICAgICAgICAgICAgICAgICAgICdvcHRpb25zJwogICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZVtlXSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Qoci5tZXJnZShuIHx8IHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSwgci5mb3JFYWNoKFsKICAgICAgICAgICAgICAgICAgICAncG9zdCcsCiAgICAgICAgICAgICAgICAgICAgJ3B1dCcsCiAgICAgICAgICAgICAgICAgICAgJ3BhdGNoJwogICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZVtlXSA9IGZ1bmN0aW9uICh0LCBuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3Qoci5tZXJnZShvIHx8IHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBuCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSksIGUuZXhwb3J0cyA9IGM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlcnMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8ucHJvdG90eXBlLnVzZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGZpbGxlZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWQ6IHQKICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5oYW5kbGVycy5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgfSwgby5wcm90b3R5cGUuZWplY3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlcnNbZV0gJiYgKHRoaXMuaGFuZGxlcnNbZV0gPSBudWxsKTsKICAgICAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0ICYmIGUodCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBlLmV4cG9ydHMgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcpLCBvID0gbigxMzIpLCBpID0gbig3MyksIHMgPSBuKDc0KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIGUuY2FuY2VsVG9rZW4gJiYgZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGUpLCBlLmhlYWRlcnMgPSBlLmhlYWRlcnMgfHwge30sIGUuZGF0YSA9IG8oZS5kYXRhLCBlLmhlYWRlcnMsIGUudHJhbnNmb3JtUmVxdWVzdCksIGUuaGVhZGVycyA9IHIubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbiB8fCB7fSwgZS5oZWFkZXJzW2UubWV0aG9kXSB8fCB7fSwgZS5oZWFkZXJzKSwgci5mb3JFYWNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdnZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAnaGVhZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3B1dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwYXRjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdjb21tb24nCiAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUuaGVhZGVyc1t0XTsKICAgICAgICAgICAgICAgICAgICB9KSwgKGUuYWRhcHRlciB8fCBzLmFkYXB0ZXIpKGUpLnRoZW4oZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSksIHQuZGF0YSA9IG8odC5kYXRhLCB0LmhlYWRlcnMsIGUudHJhbnNmb3JtUmVzcG9uc2UpLCB0OwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHQpIHx8IChhKGUpLCB0ICYmIHQucmVzcG9uc2UgJiYgKHQucmVzcG9uc2UuZGF0YSA9IG8odC5yZXNwb25zZS5kYXRhLCB0LnJlc3BvbnNlLmhlYWRlcnMsIGUudHJhbnNmb3JtUmVzcG9uc2UpKSksIFByb21pc2UucmVqZWN0KHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm9yRWFjaChuLCBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICB2YXIgbiwgciwgbyA9IGUuZXhwb3J0cyA9IHt9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuID09PSBzZXRUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChlLCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKG4gPT09IGkgfHwgIW4pICYmIHNldFRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gc2V0VGltZW91dCwgc2V0VGltZW91dChlLCAwKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCAwKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKG51bGwsIGUsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKHRoaXMsIGUsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBuID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHNldFRpbWVvdXQgPyBzZXRUaW1lb3V0IDogaTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGNsZWFyVGltZW91dCA/IGNsZWFyVGltZW91dCA6IHM7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByID0gczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB2YXIgYywgdSA9IFtdLCBwID0gITEsIGwgPSAtMTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgcCAmJiBjICYmIChwID0gITEsIGMubGVuZ3RoID8gdSA9IGMuY29uY2F0KHUpIDogbCA9IC0xLCB1Lmxlbmd0aCAmJiBmKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBwID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB1Lmxlbmd0aDsgdDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IHUsIHUgPSBbXTsgKytsIDwgdDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiBjW2xdLnJ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IC0xLCB0ID0gdS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG51bGwsIHAgPSAhMSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09PSBjbGVhclRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociA9PT0gcyB8fCAhcikgJiYgY2xlYXJUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gY2xlYXJUaW1lb3V0LCBjbGVhclRpbWVvdXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuY2FsbChudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZnVuID0gZSwgdGhpcy5hcnJheSA9IHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgby5uZXh0VGljayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W24gLSAxXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICB1LnB1c2gobmV3IGgoZSwgdCkpLCAxICE9PSB1Lmxlbmd0aCB8fCBwIHx8IGEoZik7CiAgICAgICAgICAgICAgICB9LCBoLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7CiAgICAgICAgICAgICAgICB9LCBvLnRpdGxlID0gJ2Jyb3dzZXInLCBvLmJyb3dzZXIgPSAhMCwgby5lbnYgPSB7fSwgby5hcmd2ID0gW10sIG8udmVyc2lvbiA9ICcnLCBvLnZlcnNpb25zID0ge30sIG8ub24gPSB5LCBvLmFkZExpc3RlbmVyID0geSwgby5vbmNlID0geSwgby5vZmYgPSB5LCBvLnJlbW92ZUxpc3RlbmVyID0geSwgby5yZW1vdmVBbGxMaXN0ZW5lcnMgPSB5LCBvLmVtaXQgPSB5LCBvLnByZXBlbmRMaXN0ZW5lciA9IHksIG8ucHJlcGVuZE9uY2VMaXN0ZW5lciA9IHksIG8ubGlzdGVuZXJzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICB9LCBvLmJpbmRpbmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTsKICAgICAgICAgICAgICAgIH0sIG8uY3dkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgICAgICAgICB9LCBvLmNoZGlyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpOwogICAgICAgICAgICAgICAgfSwgby51bWFzayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaChlLCBmdW5jdGlvbiAobiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByICE9PSB0ICYmIHIudG9VcHBlckNhc2UoKSA9PT0gdC50b1VwcGVyQ2FzZSgpICYmIChlW3RdID0gbiwgZGVsZXRlIGVbcl0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3Nik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gbi5jb25maWcudmFsaWRhdGVTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgIW8gfHwgbyhuLnN0YXR1cykgPyBlKG4pIDogdChyKCdSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICcgKyBuLnN0YXR1cywgbi5jb25maWcsIG51bGwsIG4ucmVxdWVzdCwgbikpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29uZmlnID0gdCwgbiAmJiAoZS5jb2RlID0gbiksIGUucmVxdWVzdCA9IHIsIGUucmVzcG9uc2UgPSBvLCBlLmlzQXhpb3NFcnJvciA9ICEwLCBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiB0aGlzLm51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiB0aGlzLmZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZU51bWJlcjogdGhpcy5saW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uTnVtYmVyOiB0aGlzLmNvbHVtbk51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IHRoaXMuY29kZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDEzOCksIG8gPSBuKDEzOSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICFyKHQpID8gbyhlLCB0KSA6IHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gL14oW2Etel1bYS16XGRcK1wtXC5dKjopP1wvXC8vaS50ZXN0KGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBlLnJlcGxhY2UoL1wvKyQvLCAnJykgKyAnLycgKyB0LnJlcGxhY2UoL15cLysvLCAnJykgOiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3KSwgbyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JpemF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtbGVuZ3RoJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldGFnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZnJvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdob3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lmLW1vZGlmaWVkLXNpbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lmLXVubW9kaWZpZWQtc2luY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnbGFzdC1tb2RpZmllZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdsb2NhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtZm9yd2FyZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAncHJveHktYXV0aG9yaXphdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHJ5LWFmdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXItYWdlbnQnCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IChyLmZvckVhY2goZS5zcGxpdCgnXG4nKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPSBlLmluZGV4T2YoJzonKSwgdCA9IHIudHJpbShlLnN1YnN0cigwLCBpKSkudG9Mb3dlckNhc2UoKSwgbiA9IHIudHJpbShlLnN1YnN0cihpICsgMSkpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1t0XSAmJiBvLmluZGV4T2YodCkgPj0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3RdID0gJ3NldC1jb29raWUnID09PSB0ID8gKHNbdF0gPyBzW3RdIDogW10pLmNvbmNhdChbbl0pIDogc1t0XSA/IHNbdF0gKyAnLCAnICsgbiA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgcykgOiBzOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKG4uc2V0QXR0cmlidXRlKCdocmVmJywgciksIHIgPSBuLmhyZWYpLCBuLnNldEF0dHJpYnV0ZSgnaHJlZicsIHIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBuLmhyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogbi5wcm90b2NvbCA/IG4ucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IG4uaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogbi5zZWFyY2ggPyBuLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCAnJykgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IG4uaGFzaCA/IG4uaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWU6IG4uaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0OiBuLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTogJy8nID09PSBuLnBhdGhuYW1lLmNoYXJBdCgwKSA/IG4ucGF0aG5hbWUgOiAnLycgKyBuLnBhdGhuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gbyh3aW5kb3cubG9jYXRpb24uaHJlZiksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5pc1N0cmluZyh0KSA/IG8odCkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wcm90b2NvbCA9PT0gZS5wcm90b2NvbCAmJiBuLmhvc3QgPT09IGUuaG9zdDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgPyB7CiAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIChlLCB0LCBuLCBvLCBpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChlICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHQpKSwgci5pc051bWJlcihuKSAmJiBhLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKG4pLnRvR01UU3RyaW5nKCkpLCByLmlzU3RyaW5nKG8pICYmIGEucHVzaCgncGF0aD0nICsgbyksIHIuaXNTdHJpbmcoaSkgJiYgYS5wdXNoKCdkb21haW49JyArIGkpLCAhMCA9PT0gcyAmJiBhLnB1c2goJ3NlY3VyZScpLCBkb2N1bWVudC5jb29raWUgPSBhLmpvaW4oJzsgJyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnw7XFxzKikoJyArIGUgKyAnKT0oW147XSopJykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGRlY29kZVVSSUNvbXBvbmVudCh0WzNdKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGUoZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcmVhZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNzgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIGUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbi5yZWFzb24gfHwgKG4ucmVhc29uID0gbmV3IHIoZSksIHQobi5yZWFzb24pKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhc29uKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnJlYXNvbjsKICAgICAgICAgICAgICAgIH0sIG8uc291cmNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBuZXcgbyhmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6IGUKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KG51bGwsIHQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gbiwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChyID0gci5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsIHQpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbi5wdXNoLmFwcGx5KG4sIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbCAhPSBhcmd1bWVudHNbdF0gPyBhcmd1bWVudHNbdF0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAlIDIgPyBvKE9iamVjdChuKSwgITApLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSwgdCwgblt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhuKSkgOiBvKE9iamVjdChuKSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobiwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuLnIodCksIG4uZCh0LCAncWNDbXBBcGknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0OwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAndXNwQXBpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBJdDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBuKDApLCBhID0gbi5uKHMpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0LCBuLCByLCBvLCBpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlW2ldKHMpLCBjID0gYS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG4odSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuZG9uZSA/IHQoYykgOiBQcm9taXNlLnJlc29sdmUoYykudGhlbihyLCBvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgbiA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuYXBwbHkodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGksIHIsIG8sIHMsIGEsICduZXh0JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGksIHIsIG8sIHMsIGEsICd0aHJvdycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRbbl07CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZW51bWVyYWJsZSA9IHIuZW51bWVyYWJsZSB8fCAhMSwgci5jb25maWd1cmFibGUgPSAhMCwgJ3ZhbHVlJyBpbiByICYmIChyLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgci5rZXksIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIGwoZS5wcm90b3R5cGUsIHQpLCBuICYmIGwoZSwgbiksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiwgaCwgeSwgdiwgZyA9IG4oODYpOwogICAgICAgICAgICAgICAgbig2NiksIG4oNjcpLCBuKDY4KTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGVbZS5UT1BfTEVGVCA9IDFdID0gJ1RPUF9MRUZUJywgZVtlLlRPUF9SSUdIVCA9IDJdID0gJ1RPUF9SSUdIVCcsIGVbZS5CT1RUT01fUklHSFQgPSAzXSA9ICdCT1RUT01fUklHSFQnLCBlW2UuQk9UVE9NX0xFRlQgPSA0XSA9ICdCT1RUT01fTEVGVCc7CiAgICAgICAgICAgICAgICB9KGYgfHwgKGYgPSB7fSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUuWUVTID0gJ1knLCBlLk5PVCA9ICdOJzsKICAgICAgICAgICAgICAgIH0oaCB8fCAoaCA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5HTE9CQUwgPSAnZ2xvYmFsJywgZS5TRVJWSUNFID0gJ3NlcnZpY2UnLCBlLkdMT0JBTF9HUk9VUCA9ICdnbG9iYWwgZ3JvdXAnLCBlLlNFUlZJQ0VfR1JPVVAgPSAnc2VydmljZSBncm91cCc7CiAgICAgICAgICAgICAgICB9KHkgfHwgKHkgPSB7fSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUuR0RQUiA9ICdHRFBSJywgZS5VU1AgPSAnVVNQJzsKICAgICAgICAgICAgICAgIH0odiB8fCAodiA9IHt9KSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IHsgaGFzQ29va2llOiAhMSB9LCBiID0gZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcCh0aGlzLCBlKSwgdGhpcy52ZW5kb3JDb25zZW50cyA9IGkoe30sIG0pLCB0aGlzLnB1cnBvc2VzQ29uc2VudHMgPSBpKHt9LCBtKSwgdGhpcy5zcGVjaWFsRmVhdHVyZXMgPSBpKHt9LCBtKSwgdGhpcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QgPSBpKHt9LCBtKSwgdGhpcy5sZWdpdGltYXRlUHVycG9zZXNDb25zZW50cyA9IGkoe30sIG0pLCB0aGlzLm5vbklhYkNvbnNlbnRzID0gaSh7fSwgbSksIHRoaXMuZ29vZ2xlQ29uc2VudHMgPSBpKHt9LCBtKSwgdGhpcy5jb25zZW50U2NyZWVuID0gMCwgdGhpcy5hbGxDb25zZW50cyA9ICExOwogICAgICAgICAgICAgICAgICAgIH0sIEMgPSAobig2OSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNwVmVyc2lvbjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwSnVyaXNkaWN0aW9uOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwTHNwYWN0OiBoLk5PVCwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwUHJpdmFjeVBvbGljeUxpbms6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB1c3BEZWxldGVEYXRhTGluazogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcEFjY2Vzc0RhdGFMaW5rOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llRG9tYWluOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzQ2NwYUxpbmtzOiAhMAogICAgICAgICAgICAgICAgICAgIH0pLCBfID0gewogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VG9nZ2xlVmFsdWU6ICdvZmYnLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VWk6ICdhbHdheXMnLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5UGVyc2lzdGVudENvbnNlbnRMaW5rOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaENvZGU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBncm91cFNpdGVzVXJsOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNjcmVlblJlamVjdEJ1dHRvblNob3dpbmc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuQm9keVRleHRPcHRpb246IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdfOiAnZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBub25jb25zZW50RGlzcGxheUZyZXF1ZW5jeTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudENvbnNlbnRMaW5rTG9jYXRpb246IGYuQk9UVE9NX1JJR0hULAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMb2dvOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTmFtZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlckZlYXR1cmVzSWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyU3BlY2lhbEZlYXR1cmVzSWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyU3BlY2lhbFB1cnBvc2VzSWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyUHVycG9zZUlkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJWZW5kb3JMaXN0VXJsOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQ291bnRyeUNvZGU6ICdHQicsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclB1cnBvc2VJZHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yU3BlY2lhbEZlYXR1cmVzSWRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTcGVjaWFsUHVycG9zZXNJZHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckZlYXR1cmVzSWRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0Q29uc2VudFJlZGlyZWN0VXJsOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgc29mdE9wdEluRW5hYmxlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpTGF5b3V0OiAncG9wdXAnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JMaXN0VXBkYXRlRnJlcTogMzAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTY29wZUdyb3VwVVJMOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llRG9tYWluOiB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZVBhdGg6ICcvJywKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcmRQYXJ0eVN0b3JhZ2VUeXBlOiAnaWZyYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1N1bW1hcnlWaWV3OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlRW5hYmxlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRPblNhZmFyaTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzQU1QOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQ29uc2VudFJlc3RyaWN0aW9uSWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTElSZXN0cmljdGlvbklkczogW10KICAgICAgICAgICAgICAgICAgICB9LCBFID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuQ3VzdG9tTGlua3M6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rc1RpdGxlOiAnQWRkaXRpb25hbCBMaW5rcycsCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvcnNMYWJlbDogJ05vbi1JQUIgVmVuZG9ycycKICAgICAgICAgICAgICAgICAgICB9LCBTID0gewogICAgICAgICAgICAgICAgICAgICAgICB1c3BEbnNUaXRsZTogJ0RvIE5vdCBTZWxsIE15IFBlcnNvbmFsIEluZm9ybWF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgdXNwRG5zVGV4dDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxwPldoZW4geW91IHZpc2l0IHRoaXMgd2Vic2l0ZSwgd2UgY29sbGVjdCBwZXJzb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIElQIGFkZHJlc3NlcywgY29va2llIGlkZW50aWZpZXJzIGFuZCBvdGhlciBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcnMuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHVzZWQgdG8gcGVyc29uYWxpemUgY29udGVudCBiYXNlZCBvbiB5b3VyIGludGVyZXN0cywgcnVuIGFuZCBvcHRpbWl6ZSBhZHZlcnRpc2luZyBjYW1wYWlnbnMgdGFpbG9yZWQgdG8geW91LCBtZWFzdXJlIHRoZSBwZXJmb3JtYW5jZSBvZiBhZHMgYW5kIGNvbnRlbnQsIGFuZCBkZXJpdmUgaW5zaWdodHMgYWJvdXQgdGhlIGF1ZGllbmNlcyB3aG8gZW5nYWdlIHdpdGggYWRzIGFuZCBjb250ZW50LiBUaGlzIGluZm9ybWF0aW9uIG1heSBhbHNvIGJlIGRpc2Nsb3NlZCBieSB1cyB0byB0aGlyZCBwYXJ0aWVzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy5pYWJwcml2YWN5LmNvbS9vcHRvdXQuaHRtbCI+SUFCXHUyMDE5cyBMaXN0IG9mIERvd25zdHJlYW0gUGFydGljaXBhbnRzPC9hPiB0aGF0IG1heSBmdXJ0aGVyIGRpc2Nsb3NlIGl0IHRvIG90aGVyIHRoaXJkIHBhcnRpZXMuIFVzaW5nIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFzIGRlc2NyaWJlZCBhYm92ZSBpcyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGhvdyB3ZSBvcGVyYXRlIG91ciB3ZWJzaXRlLCBtYWtlIHJldmVudWUgdG8gc3VwcG9ydCBvdXIgc3RhZmYsIGFuZCBnZW5lcmF0ZSByZWxldmFudCBjb250ZW50IGZvciBvdXIgYXVkaWVuY2UuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBvdXIgZGF0YSBjb2xsZWN0aW9uIGFuZCB1c2UgcHJhY3RpY2VzIGluIG91ciBQcml2YWN5IFBvbGljeS48L3A+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8cD5JZiB5b3Ugd2lzaCB0byBvcHQgb3V0IG9mIHRoZSBkaXNjbG9zdXJlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gdG8gdGhpcmQgcGFydGllcyBieSB1cywgcGxlYXNlIHVzZSB0aGUgYmVsb3cgb3B0IG91dCBhbmQgY29uZmlybSB5b3VyIHNlbGVjdGlvbi4gUGxlYXNlIG5vdGUgdGhhdCBhZnRlciB5b3VyIG9wdCBvdXQgcmVxdWVzdCBpcyBwcm9jZXNzZWQsIHlvdSBtYXkgY29udGludWUgc2VlaW5nIGludGVyZXN0LWJhc2VkIGFkcyBiYXNlZCBvbiBwZXJzb25hbCBJbmZvcm1hdGlvbiB1dGlsaXplZCBieSB1cyBvciBwZXJzb25hbCBpbmZvcm1hdGlvbiBkaXNjbG9zZWQgdG8gdGhpcmQgcGFydGllcyBwcmlvciB0byB5b3VyIG9wdCBvdXQuIFlvdSBtYXkgc2VwYXJhdGVseSBvcHQgb3V0IG9mIHRoZSBmdXJ0aGVyIGRpc2Nsb3N1cmUgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBieSB0aGlyZCBwYXJ0aWVzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy5pYWJwcml2YWN5LmNvbS9vcHRvdXQuaHRtbCI+SUFCXHUyMDE5cyBMaXN0IG9mIERvd25zdHJlYW0gUGFydGljaXBhbnRzPC9hPi48L3A+JwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICB1c3BEb05vdFNlbGxUb2dnbGVUZXh0OiAnSSB3YW50IHRvIG1ha2UgYSAiRG8gTm90IFNlbGwgTXkgUGVyc29uYWwgSW5mb3JtYXRpb24iIHJlcXVlc3QuIE5vdGU6IHRoaXMgYWN0aW9uIHdpbGwgbWFrZSBpdCBoYXJkZXIgdG8gdXMgdG8gdGFpbG9yIGNvbnRlbnQgZm9yIHlvdS4nLAogICAgICAgICAgICAgICAgICAgICAgICB1c3BQcml2YWN5UG9saWN5TGlua1RleHQ6ICdQcml2YWN5IFBvbGljeScsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcERlbGV0ZURhdGFMaW5rVGV4dDogJ0RhdGEgRGVsZXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICB1c3BBY2Nlc3NEYXRhTGlua1RleHQ6ICdEYXRhIEFjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcEFjY2VwdEJ1dHRvbjogJ0NPTkZJUk0nCiAgICAgICAgICAgICAgICAgICAgfSwgSSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNjcmVlblRpdGxlOiAnV2UgdmFsdWUgeW91ciBwcml2YWN5JywKICAgICAgICAgICAgICAgICAgICAgICAgYWdyZWVCdXR0b246ICdBR1JFRScsCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5SZWplY3RCdXR0b246ICdESVNBR1JFRScsCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5TZXR0aW5nc0J1dHRvbjogJ01PUkUgT1BUSU9OUycsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlTY3JlZW5Cb2R5Tm9SZWplY3RTZXJ2aWNlOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LlxuJwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0R2xvYmFsOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IGFjcm9zcyB0aGUgd2ViLiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LicKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdEdyb3VwOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIGEgZ3JvdXAgb2Ygd2Vic2l0ZXMgW2h5cGVybGlua2VkIHRvIGRvbWFpbiB3aGVyZSBhbGwgdGhlIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBmb3IgdGhpcyBncm91cCBjb25maWd1cmF0aW9uXS5Zb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LicKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlSZWplY3RTZXJ2aWNlOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LicKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlSZWplY3RHbG9iYWw6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIFdpdGggeW91ciBwZXJtaXNzaW9uIHdlIGFuZCBvdXIgcGFydG5lcnMgbWF5IHVzZSBwcmVjaXNlIGdlb2xvY2F0aW9uIGRhdGEgYW5kIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggZGV2aWNlIHNjYW5uaW5nLllvdSBtYXkgY2xpY2sgdG8gY29uc2VudCB0byBvdXIgYW5kIG91ciBwYXJ0bmVyc1x1MjAxOSBwcm9jZXNzaW5nIGFzIGRlc2NyaWJlZCBhYm92ZS4gQWx0ZXJuYXRpdmVseSB5b3UgbWF5IGNsaWNrIHRvIHJlZnVzZSB0byBjb25zZW50IG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZy4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkYXRhIG1heSBub3QgcmVxdWlyZSB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSBhIHJpZ2h0IHRvIG9iamVjdCB0byBzdWNoIHByb2Nlc3NpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSBhY3Jvc3MgdGhlIHdlYi5Zb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LicKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlSZWplY3RHcm91cDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgYW5kL29yIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiBhIGRldmljZSwgc3VjaCBhcyBjb29raWVzIGFuZCBwcm9jZXNzIHBlcnNvbmFsIGRhdGEsIHN1Y2ggYXMgdW5pcXVlIGlkZW50aWZpZXJzIGFuZCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgZGV2aWNlIGZvciBwZXJzb25hbGlzZWQgYWRzIGFuZCBjb250ZW50LCBhZCBhbmQgY29udGVudCBtZWFzdXJlbWVudCwgYW5kIGF1ZGllbmNlIGluc2lnaHRzLCBhcyB3ZWxsIGFzIHRvIGRldmVsb3AgYW5kIGltcHJvdmUgcHJvZHVjdHMuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgV2l0aCB5b3VyIHBlcm1pc3Npb24gd2UgYW5kIG91ciBwYXJ0bmVycyBtYXkgdXNlIHByZWNpc2UgZ2VvbG9jYXRpb24gZGF0YSBhbmQgaWRlbnRpZmljYXRpb24gdGhyb3VnaCBkZXZpY2Ugc2Nhbm5pbmcuIFlvdSBtYXkgY2xpY2sgdG8gY29uc2VudCB0byBvdXIgYW5kIG91ciBwYXJ0bmVyc1x1MjAxOSBwcm9jZXNzaW5nIGFzIGRlc2NyaWJlZCBhYm92ZS4gQWx0ZXJuYXRpdmVseSB5b3UgbWF5IGNsaWNrIHRvIHJlZnVzZSB0byBjb25zZW50IG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZy4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkYXRhIG1heSBub3QgcmVxdWlyZSB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSBhIHJpZ2h0IHRvIG9iamVjdCB0byBzdWNoIHByb2Nlc3NpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSB0byBhIGdyb3VwIG9mIHdlYnNpdGVzIFtsaW5rcyB0byBkb21haW4gd2hlcmUgYWxsIHRoZSBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgZm9yIHRoaXMgZ3JvdXAgY29uZmlndXJhdGlvbl0uIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuJwogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuQm9keUdsb2JhbDogJ1dlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGRldmljZXMsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgdGhlIHB1cnBvc2VzIGRlc2NyaWJlZCBiZWxvdy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgZm9yIHN1Y2ggcHVycG9zZXMuIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQsIG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHRvIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBZb3VyIHByZWZlcmVuY2VzIHdpbGwgYXBwbHkgYWNyb3NzIHRoZSB3ZWIuIFBsZWFzZSBub3RlIHRoYXQgc29tZSBwcm9jZXNzaW5nIG9mIHlvdXIgcGVyc29uYWwgZGF0YSBtYXkgbm90IHJlcXVpcmUgeW91ciBjb25zZW50LCBidXQgeW91IGhhdmUgYSByaWdodCB0byBvYmplY3QgdG8gc3VjaCBwcm9jZXNzaW5nLiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LicsCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5Cb2R5U2VydmljZTogJ1dlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGRldmljZXMsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgdGhlIHB1cnBvc2VzIGRlc2NyaWJlZCBiZWxvdy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgZm9yIHN1Y2ggcHVycG9zZXMuIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQsIG9yIGFjY2VzcyBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFuZCBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBiZWZvcmUgY29uc2VudGluZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgd2Vic2l0ZSBvbmx5LiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4nLAogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuQm9keUdyb3VwOiAnV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBvciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gZGV2aWNlcywgc3VjaCBhcyBjb29raWVzIGFuZCBwcm9jZXNzIHBlcnNvbmFsIGRhdGEsIHN1Y2ggYXMgdW5pcXVlIGlkZW50aWZpZXJzIGFuZCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgZGV2aWNlIGZvciB0aGUgcHVycG9zZXMgZGVzY3JpYmVkIGJlbG93LiBZb3UgbWF5IGNsaWNrIHRvIGNvbnNlbnQgdG8gb3VyIGFuZCBvdXIgcGFydG5lcnNcdTIwMTkgcHJvY2Vzc2luZyBmb3Igc3VjaCBwdXJwb3Nlcy4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjbGljayB0byByZWZ1c2UgdG8gY29uc2VudCwgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBZb3VyIHByZWZlcmVuY2VzIHdpbGwgYXBwbHkgdG8gYSBncm91cCBvZiB3ZWJzaXRlcyBbbGlua3MgdG8gZG9tYWluIHdoZXJlIGFsbCB0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGZvciB0aGlzIGdyb3VwIGNvbmZpZ3VyYXRpb25dLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4nLAogICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsUHVycG9zZXNBbmRGZWF0dXJlczogJ1NwZWNpYWwgUHVycG9zZXMgYW5kIEZlYXR1cmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZUFuZEV4aXRCdXR0b246ICdTQVZFICYgRVhJVCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VTY3JlZW5WZW5kb3JMaW5rOiAnUEFSVE5FUlMnLAogICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlSW50ZXJlc3RMaW5rOiAnTEVHSVRJTUFURSBJTlRFUkVTVCAnLAogICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsUHVycG9zZXNMYWJlbDogJ1NwZWNpYWwgUHVycG9zZXMnLAogICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRmVhdHVyZXNMYWJlbDogJ1NwZWNpYWwgRmVhdHVyZXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc0xhYmVsOiAnRmVhdHVyZXMnLAogICAgICAgICAgICAgICAgICAgICAgICBiYWNrOiAnQmFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgIG9uTGFiZWw6ICdPTicsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZkxhYmVsOiAnT0ZGJywKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlMYWJlbDogJ01VTFRJJywKICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWxEZXNjcmlwdGlvbjogJ0xlZ2FsIERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BhcnRuZXJzOiAnU2hvdyBQYXJ0bmVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVQYXJ0bmVyczogJ0hpZGUgUGFydG5lcnMnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JTY3JlZW5Cb2R5OiAnUmV2aWV3IGFuZCBzZXQgeW91ciBjb25zZW50IHByZWZlcmVuY2VzIGZvciBlYWNoIHBhcnRuZXIgYmVsb3cuIEV4cGFuZCBlYWNoIHBhcnRuZXIgbGlzdCBpdGVtIGZvciBtb3JlIGluZm9ybWF0aW9uIHRvIGhlbHAgbWFrZSB5b3VyIGNob2ljZS4gU29tZSBwZXJzb25hbCBkYXRhIGlzIHByb2Nlc3NlZCB3aXRob3V0IHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIHRoZSByaWdodCB0byBvYmplY3QuJywKICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmFjeVBvbGljeUxhYmVsOiAnUHJpdmFjeSBQb2xpY3knLAogICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkxhYmVsOiAnVmVuZG9yIERlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVNjcmVlbkJvZHk6ICdSZXZpZXcgYW5kIG9iamVjdCB0byBwcm9jZXNzaW5nIG9mIHBlcnNvbmFsIGRhdGEgd2l0aG91dCB5b3VyIGNvbnNlbnQgb24gdGhlIGJhc2lzIG9mIGEgbGVnaXRpbWF0ZSBpbnRlcmVzdCBmb3IgZWFjaCBwdXJwb3NlIGFuZCBieSBlYWNoIHBhcnRuZXIgYmVsb3cuIEV4cGFuZCBlYWNoIHB1cnBvc2Ugb3IgcGFydG5lciBsaXN0IGl0ZW0gZm9yIG1vcmUgaW5mb3JtYXRpb24gdG8gaGVscCBtYWtlIHlvdXIgY2hvaWNlLiBUbyBvYmplY3QgdG8gdGhlIHNwZWNpYWwgcHVycG9zZXMgb2YgZW5zdXJpbmcgc2VjdXJpdHksIHByZXZlbnRpbmcgZnJhdWQsIGFuZCBkZWJ1Z2dpbmcsIGFuZCB0ZWNobmljYWxseSBkZWxpdmVyaW5nIGFkcyBvciBjb250ZW50IGNsaWNrIG9uIGEgcGFydG5lclwncyBwcml2YWN5IHBvbGljeSBsaW5rLicsCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGVJbnRlcmVzdFB1cnBvc2VzTGFiZWw6ICdMZWdpdGltYXRlIEludGVyZXN0IFB1cnBvc2UocyknLAogICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlSW50ZXJlc3RWZW5kb3JMYWJlbDogJ0xlZ2l0aW1hdGUgSW50ZXJlc3QgVmVuZG9ycycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGVTY3JlZW5PYmplY3Q6ICdPQkpFQ1QgKHRyYW5zbGF0aW9uIGhpbnQ6IHZlcmIgdG8gb2JqZWN0KScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGVTY3JlZW5PYmplY3RlZDogJ09CSkVDVEVEJywKICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVNjcmVlbkFjY2VwdDogJ1JFTU9WRSBPQkpFQ1RJT04nLAogICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RBbGxCdXR0b246ICdPQkpFQ1QgQUxMJywKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudENvbnNlbnRMaW5rTGFiZWw6ICdQcml2YWN5JywKICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiVmVuZG9yc05vdGljZTogJ1ZlbmRvcnMgd2hvIGRvIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgSUFCIEV1cm9wZSBUcmFuc3BhcmVuY3kgYW5kIENvbnNlbnQgRnJhbWV3b3JrIGFuZCBkbyBub3QgYWRoZXJlIHRvIGl0cyBwb2xpY2llcyBvciB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVQYXJ0bmVyczogJ0dvb2dsZSBQYXJ0bmVycycsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU1heEFnZUxhYmVsOiAnTWF4IGNvb2tpZSBhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzTGFiZWw6ICdzZWNvbmRzJywKICAgICAgICAgICAgICAgICAgICAgICAgZGF5c0xhYmVsOiAnZGF5cycsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEaXNjbG9zdXJlTGFiZWw6ICdDb29raWUgZGlzY2xvc3VyZScKICAgICAgICAgICAgICAgICAgICB9LCBMID0gewogICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JMaXN0VXJsOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yQmxhY2tsaXN0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yV2hpdGVsaXN0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlV2hpdGVsaXN0OiBbMV0KICAgICAgICAgICAgICAgICAgICB9LCBQID0gewogICAgICAgICAgICAgICAgICAgICAgICB1eEJhY2tncm91bmRDb2xvcjogJyNmZmYnLAogICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25Db2xvcjogJyMyMDZEQzUnLAogICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25UZXh0Q29sb3I6ICcjZmZmJywKICAgICAgICAgICAgICAgICAgICAgICAgdXhTZWNvbmRhcnlCdXR0b25Db2xvcjogJyNmZmYnLAogICAgICAgICAgICAgICAgICAgICAgICB1eFNlY29uZGFyeUJ1dHRvblRleHRDb2xvcjogJyMyMDZEQzUnLAogICAgICAgICAgICAgICAgICAgICAgICB1eFRvb2dsZUFjdGl2ZUNvbG9yOiAnIzIwNkRDNScsCiAgICAgICAgICAgICAgICAgICAgICAgIHV4TGlua0NvbG9yOiAnIzIwNkRDNScsCiAgICAgICAgICAgICAgICAgICAgICAgIHV4Rm9udENvbG9yOiAnIzE0MWUyMycKICAgICAgICAgICAgICAgICAgICB9LCB3ID0gcGFyc2VJbnQoJycuY29uY2F0KCczMicpKSwgQSA9IE51bWJlci5pc05hTih3KSA/IDEgOiB3LCBrID0gJ0NNUExpc3QnLCBPID0gJ2V1Y29uc2VudC12MicsIFQgPSAnbm9uaWFidmVuZG9yY29uc2VudCcsIFYgPSAnZXVwdWJjb25zZW50JywgeCA9ICdfY21wUmVwcm9tcHRIYXNoJywgUiA9ICd1c3ByaXZhY3knLCBVID0gJ2FkZHRsX2NvbnNlbnQnLCBEID0gbig3MCksIE0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50Y2FzdEFjY291bnRJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTY29wZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LkdMT0JBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LlNFUlZJQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5HTE9CQUxfR1JPVVAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeS5TRVJWSUNFX0dST1VQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUb2dnbGVWYWx1ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZmYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlVaTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV2ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbkVVJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWx3YXlzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5UGVyc2lzdGVudENvbnNlbnRMaW5rOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwU2l0ZXNVcmw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBoYXNoQ29kZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5SZWplY3RCdXR0b25TaG93aW5nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGlzQU1QOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5Cb2R5VGV4dE9wdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmdfOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogRAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBub25jb25zZW50RGlzcGxheUZyZXF1ZW5jeTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRDb25zZW50TGlua0xvY2F0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTG9nbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlck5hbWU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJGZWF0dXJlc0lkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlclNwZWNpYWxGZWF0dXJlc0lkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlRW1wdHk6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlclNwZWNpYWxQdXJwb3Nlc0lkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJQdXJwb3NlSWRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVFbXB0eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVFbXB0eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJWZW5kb3JMaXN0VXJsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQ291bnRyeUNvZGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FGJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQVgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQVMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FPJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBUScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBTScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FXJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQVUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCSCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQkInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCSicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCTycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JBJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQlcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCVicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSU8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCTicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQkYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ00nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NWJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS1knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1REJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDTicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NYJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDTycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ1UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdESicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRE8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHUScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRk8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGSicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRlInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHRicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BGJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVEYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR0UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdERScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR0knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dVJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dOJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR1cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSE0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hOJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSEsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIVScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSU4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSVEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0pNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSlAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdKRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0pPJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS1onLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS1InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdLVycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tHJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTEEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMVicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xCJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTFMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xZJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTEknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xVJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTU8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01HJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTVcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01WJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01IJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTVEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01VJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNWCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01OJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01BJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTVonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNTScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05BJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTlInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQU4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05aJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTkknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdORScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05HJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTlUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdORicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01QJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTk8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPTScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUFcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BBJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUEcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUEgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQTicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUFQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1FBJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUkUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSTycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JVJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUlcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS04nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01GJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUE0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU00nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NBJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU04nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTQicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NPJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWkEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0VTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTEsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0onLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTWicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RXJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVEonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUWicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVEwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdURycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RLJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVE8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ROJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUTScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VBJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQUUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHQicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVU0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVlUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ZOJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVkcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dGJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1pNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWlcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclB1cnBvc2VJZHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZUVtcHR5OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5CZUVtcHR5OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNwZWNpYWxGZWF0dXJlc0lkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlRW1wdHk6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvclNwZWNpYWxQdXJwb3Nlc0lkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkJlRW1wdHk6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckZlYXR1cmVzSWRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQmVFbXB0eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICByZWplY3RDb25zZW50UmVkaXJlY3RVcmw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzdGFja3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzb2Z0T3B0SW5FbmFibGVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVpTGF5b3V0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jhbm5lcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGlzdFVwZGF0ZUZyZXE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U2NvcGVHcm91cFVSTDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZURvbWFpbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZVBhdGg6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0aGlyZFBhcnR5U3RvcmFnZVR5cGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmcmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwaScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1N1bW1hcnlWaWV3OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhY3lNb2RlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5HRFBSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuVVNQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcFZlcnNpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbMV0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwSnVyaXNkaWN0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0EnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcExzcGFjdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLllFUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLk5PVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB1c3BQcml2YWN5UG9saWN5TGluazogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcERlbGV0ZURhdGFMaW5rOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwQWNjZXNzRGF0YUxpbms6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc0NjcGFMaW5rczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVFbmFibGVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbGVhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlckNvbnNlbnRSZXN0cmljdGlvbklkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGU6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlckxJUmVzdHJpY3Rpb25JZHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlOiAnbnVtYmVyJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50T25TYWZhcmk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIEIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdEFsbDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuUmVqZWN0QnV0dG9uOiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTY3JlZW5TZXR0aW5nc0J1dHRvbjogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuVGl0bGU6IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudENvbnNlbnRMaW5rTGFiZWw6IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSW5pdFNjcmVlbkJvZHlUZXh0OiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNlY29uZFNjcmVlbkJvZHlUZXh0OiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVZlbmRvclNjcmVlbkJvZHlUZXh0OiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUxlZ2l0aW1hdGVTY3JlZW5Cb2R5VGV4dDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0U2VydmljZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdEdsb2JhbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdEdyb3VwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5U2NyZWVuQm9keVJlamVjdFNlcnZpY2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0R2xvYmFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5U2NyZWVuQm9keVJlamVjdEdyb3VwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBncm91cE9mU2l0ZXNMYWJlbDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBzYXZlQW5kRXhpdEJ1dHRvbjogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICBhZ3JlZVRvU2VsZWN0ZWRCdXR0b246IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWdyZWVCdXR0b246IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYWdyZWVBbGxCdXR0b246IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0QWxsOiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdEFsbEJ1dHRvbjogeyB0eXBlOiAnc3RyaW5nJyB9CiAgICAgICAgICAgICAgICAgICAgfSwgRiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiVmVuZG9yTGlzdFVybDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcldoaXRlbGlzdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGU6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckJsYWNrbGlzdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGU6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZVdoaXRlbGlzdDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FycmF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVR5cGU6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBOID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbml0U2NyZWVuQ3VzdG9tTGlua3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlUeXBlOiAnb2JqZWN0JwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsaW5rc1RpdGxlOiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvcnNMYWJlbDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICB1c3BEbnNUaXRsZTogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICB1c3BEbnNUZXh0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZTogJ3N0cmluZycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwRG9Ob3RTZWxsVG9nZ2xlVGV4dDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICB1c3BQcml2YWN5UG9saWN5TGlua1RleHQ6IHsgdHlwZTogJ3N0cmluZycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNwRGVsZXRlRGF0YUxpbmtUZXh0OiB7IHR5cGU6ICdzdHJpbmcnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzcEFjY2Vzc0RhdGFMaW5rVGV4dDogeyB0eXBlOiAnc3RyaW5nJyB9LAogICAgICAgICAgICAgICAgICAgICAgICB1c3BBY2NlcHRCdXR0b246IHsgdHlwZTogJ3N0cmluZycgfQogICAgICAgICAgICAgICAgICAgIH0sIGogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHV4QmFja2dyb3VuZENvbG9yOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXhQcmltYXJ5QnV0dG9uQ29sb3I6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25UZXh0Q29sb3I6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB1eFNlY29uZGFyeUJ1dHRvbkNvbG9yOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXhTZWNvbmRhcnlCdXR0b25UZXh0Q29sb3I6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB1eFRvb2dsZUFjdGl2ZUNvbG9yOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogJycKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXhMaW5rQ29sb3I6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB1eEZvbnRDb2xvcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBHID0gewogICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JMaXN0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5VHlwZTogJ29iamVjdCcKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiAnJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JzSGFzaDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBIID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW3RdLCBvID0gblt0XS50eXBlLCBpID0gblt0XS52YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgIT09IHIgJiYgKHR5cGVvZiByID09PSBvID8gJ251bWJlcicgPT09IG8gJiYgciA8IDAgPyAoY29uc29sZS53YXJuKCcnLmNvbmNhdCh0LCAnIG11c3QgYmUgYSB2YWxpZCBudW1iZXInKSksICExKSA6ICcnID09PSBpIHx8ICghIWkuaW5jbHVkZXMocikgfHwgKGNvbnNvbGUud2FybignJy5jb25jYXQodCwgJyBtdXN0IGJlIGEgdmFsaWQgdmFsdWUnKSksICExKSkgOiAoY29uc29sZS53YXJuKCcnLmNvbmNhdCh0LCAnIG11c3QgYmUgJykuY29uY2F0KG8pKSwgITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCcnLmNvbmNhdCh0LCAnIGlzIG5vdCBhIHZhbGlkIGNvbmZpZyB2YWx1ZScpKSwgITE7CiAgICAgICAgICAgICAgICAgICAgfSwgcSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghci5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBuW3RdLmNhbkJlRW1wdHkgJiYgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiBuW3RdLnZhbHVlcyA/IHR5cGVvZiBlID09PSBuW3RdLmFycmF5VHlwZSA/IG8ucHVzaChlKSA6IGNvbnNvbGUud2FybignJy5jb25jYXQoZSwgJyAnKS5jb25jYXQoJ2lzIG5vdCBhIHZhbGlkIHZhbHVlIGZvcicsICcgJykuY29uY2F0KHQpKSA6IG5bdF0udmFsdWVzLmluY2x1ZGVzKGUpID8gby5wdXNoKGUpIDogY29uc29sZS53YXJuKCcnLmNvbmNhdChlLCAnICcpLmNvbmNhdCgnaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yJywgJyAnKS5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICEhby5sZW5ndGggJiYgbzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc29sZS53YXJuKCcnLmNvbmNhdCh0LCAnIG11c3QgYmUgYW4gYXJyYXknKSksICExOwogICAgICAgICAgICAgICAgICAgIH0sIHogPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCh0aGlzLCBlKSwgdGhpcy5fY29yZUNvbmZpZyA9IHZvaWQgMCwgdGhpcy5fcHJlbWl1bVByb3BlcnRpZXMgPSB2b2lkIDAsIHRoaXMuX2NvcmVVaUxhYmVscyA9IHZvaWQgMCwgdGhpcy5fcHJlbWl1bVVpTGFiZWxzID0gdm9pZCAwLCB0aGlzLl90aGVtZSA9IHZvaWQgMCwgdGhpcy5fbm9uSWFiVmVuZG9yc0luZm8gPSB2b2lkIDAsIHRoaXMuX2FtcERhdGEgPSB2b2lkIDAsIHRoaXMuY2xlYW5Db25maWcgPSB2b2lkIDAsIHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4uY2xlYW5Db25maWcuY29yZUNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uc2VudFNjb3BlJyBpbiBlIHx8IChuLmNsZWFuQ29uZmlnLmNvcmVDb25maWcuY29uc2VudFNjb3BlID0geS5TRVJWSUNFKSwgJ3ByaXZhY3lNb2RlJyBpbiBlIHx8IChuLmNsZWFuQ29uZmlnLmNvcmVDb25maWcucHJpdmFjeU1vZGUgPSBbdi5HRFBSXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnZhbGlkYXRlQ29uZmlnID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCByID0ge30sIG8gPSB7fSwgaSA9IHt9LCBzID0ge30sIGEgPSB2b2lkIDAsIGMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29yZUNvbmZpZyAmJiAodCA9IG4uZmlsdGVyQ29uZmlnKGUuY29yZUNvbmZpZywgTSkpLCBlLmNvcmVVaUxhYmVscyAmJiAociA9IG4uZmlsdGVyTGFiZWxzKGUuY29yZVVpTGFiZWxzLCBCKSksIGUucHJlbWl1bVByb3BlcnRpZXMgJiYgKG8gPSBuLmZpbHRlckNvbmZpZyhlLnByZW1pdW1Qcm9wZXJ0aWVzLCBGKSksIGUucHJlbWl1bVVpTGFiZWxzICYmIChpID0gbi5maWx0ZXJMYWJlbHMoZS5wcmVtaXVtVWlMYWJlbHMsIE4pKSwgZS50aGVtZSAmJiAocyA9IG4uZmlsdGVyQ29uZmlnKGUudGhlbWUsIGopKSwgZS5ub25JYWJWZW5kb3JzSW5mbyAmJiAoYSA9IG4uZmlsdGVyQ29uZmlnKGUubm9uSWFiVmVuZG9yc0luZm8sIEcpKSwgZS5hbXBEYXRhICYmIChjID0gZS5hbXBEYXRhKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlQ29uZmlnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW1pdW1Qcm9wZXJ0aWVzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JzSW5mbzogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1wRGF0YTogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmZpbHRlckNvbmZpZyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2FycmF5JyA9PT0gdFtyXS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBxKGUsIHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKG5bcl0gPSBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgoZSwgciwgdCkgJiYgKG5bcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZmlsdGVyTGFiZWxzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PT0gdFtyXS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICE9PSBlW3JdID8gbltyXSA9IGVbcl0gOiBjb25zb2xlLndhcm4oJycuY29uY2F0KHIsICcgY2Fubm90IGJlIGVtcHR5JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBxKGUsIHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKG5bcl0gPSBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ2V0Q3VzdG9tQ29yZVVpTGFiZWxzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNsZWFuQ29uZmlnLmNvcmVVaUxhYmVsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuaW5pdGlhbGl6ZUNvbmZpZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhuLmNsZWFuQ29uZmlnKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bZV0gJiYgKG5bZV0gPSBpKGkoe30sIG5bZV0pLCBuLmNsZWFuQ29uZmlnW2VdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmNsZWFuQ29uZmlnID0gdGhpcy52YWxpZGF0ZUNvbmZpZyh0KSwgdGhpcy5jaGVja1JlcXVpcmVkVmFsdWVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuY2xlYW5Db25maWcsIG8gPSByLmNvcmVDb25maWcsIHMgPSBvLnByaXZhY3lNb2RlLCBhID0gby5jb25zZW50U2NvcGUsIGMgPSBvLnF1YW50Y2FzdEFjY291bnRJZCwgdSA9IHIubm9uSWFiVmVuZG9yc0luZm8sIGwgPSByLmFtcERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmluY2x1ZGVzKHYuR0RQUikgJiYgcy5pbmNsdWRlcyh2LlVTUCkgPyAodGhpcy5fY29yZUNvbmZpZyA9IGkoaSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRjYXN0QWNjb3VudElkOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTY29wZTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5TW9kZTogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXyksIEMpLCB0aGlzLl9wcmVtaXVtVWlMYWJlbHMgPSBpKGkoe30sIFMpLCBFKSwgdGhpcy5fcHJlbWl1bVByb3BlcnRpZXMgPSBpKHt9LCBMKSwgdGhpcy5fY29yZVVpTGFiZWxzID0gaSh7fSwgSSksIHRoaXMuX3RoZW1lID0gaSh7fSwgUCksIHUgJiYgKHRoaXMuX25vbklhYlZlbmRvcnNJbmZvID0gdSkpIDogcy5pbmNsdWRlcygnR0RQUicpID8gKHRoaXMuX2NvcmVDb25maWcgPSBpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGNhc3RBY2NvdW50SWQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudFNjb3BlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhY3lNb2RlOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfKSwgdGhpcy5fcHJlbWl1bVVpTGFiZWxzID0gaSh7fSwgRSksIHRoaXMuX3ByZW1pdW1Qcm9wZXJ0aWVzID0gaSh7fSwgTCksIHRoaXMuX2NvcmVVaUxhYmVscyA9IGkoe30sIEkpLCB0aGlzLl90aGVtZSA9IGkoe30sIFApLCB1ICYmICh0aGlzLl9ub25JYWJWZW5kb3JzSW5mbyA9IHUpKSA6ICh0aGlzLl9jb3JlQ29uZmlnID0gaSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRjYXN0QWNjb3VudElkOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTY29wZTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5TW9kZTogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQyksIHRoaXMuX3ByZW1pdW1VaUxhYmVscyA9IGkoe30sIFMpLCB0aGlzLl9wcmVtaXVtUHJvcGVydGllcyA9IHt9LCB0aGlzLl9jb3JlVWlMYWJlbHMgPSB7fSwgdGhpcy5fdGhlbWUgPSBpKHt9LCBQKSksIGwgJiYgKHRoaXMuX2FtcERhdGEgPSBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0Q3VzdG9tUHJlbWl1bVVpTGFiZWxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGVhbkNvbmZpZy5wcmVtaXVtVWlMYWJlbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb3JlQ29uZmlnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvcmVDb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVibGlzaGVyTG9nbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlck5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJsaXNoZXJGZWF0dXJlc0lkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlclNwZWNpYWxGZWF0dXJlc0lkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlclNwZWNpYWxQdXJwb3Nlc0lkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlclB1cnBvc2VJZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVibGlzaGVyVmVuZG9yTGlzdFVybCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlclZlbmRvckxpc3RVcmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJsaXNoZXJDb3VudHJ5Q29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlbmRvclB1cnBvc2VJZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZW5kb3JQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yU3BlY2lhbEZlYXR1cmVzSWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yU3BlY2lhbFB1cnBvc2VzSWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yRmVhdHVyZXNJZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWplY3RDb25zZW50UmVkaXJlY3RVcmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFja3MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCByID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub25jb25zZW50RGlzcGxheUZyZXF1ZW5jeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlbmRvckxpc3RVcGRhdGVGcmVxJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbb10gIT09IHQuY29yZUNvbmZpZ1tvXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSAhPT0gbi5pbmRleE9mKG8pICYmICgnJyA9PT0gZVtvXSB8fCBlW29dID09PSBbXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignJy5jb25jYXQobywgJyBjYW5ub3QgYmUgZW1wdHknKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuaW5kZXhPZihvKSAmJiBlW29dIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcnLmNvbmNhdChvLCAnIGNhbm5vdCBiZSBhIG5lZ2F0aXZlIG51bWJlcicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2NvcmVDb25maWcgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncHJlbWl1bVByb3BlcnRpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlbWl1bVByb3BlcnRpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJlbWl1bVByb3BlcnRpZXNbbl0gIT09IGVbbl0gJiYgKCcnID09PSBlW25dIHx8IGVbbl0gPT09IFtdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJycuY29uY2F0KG4sICcgY2Fubm90IGJlIGVtcHR5JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fcHJlbWl1bVByb3BlcnRpZXMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY29yZVVpTGFiZWxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvcmVVaUxhYmVsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb3JlVWlMYWJlbHNbbl0gIT09IGVbbl0gJiYgJycgPT09IGVbbl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcnLmNvbmNhdChuLCAnIGNhbm5vdCBiZSBlbXB0eScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2NvcmVVaUxhYmVscyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd0aGVtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aGVtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC50aGVtZVtuXSAhPT0gZVtuXSAmJiAnJyA9PT0gZVtuXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJycuY29uY2F0KG4sICcgY2Fubm90IGJlIGVtcHR5JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5fdGhlbWUgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbm9uSWFiVmVuZG9yc0luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9uSWFiVmVuZG9yc0luZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vbklhYlZlbmRvcnNJbmZvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2FtcERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW1wRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYW1wRGF0YSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdwcmVtaXVtVWlMYWJlbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlbWl1bVVpTGFiZWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnByZW1pdW1VaUxhYmVsc1tuXSAhPT0gZVtuXSAmJiAhZVtuXS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcnLmNvbmNhdChuLCAnIGNhbm5vdCBiZSBlbXB0eScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3ByZW1pdW1VaUxhYmVscyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCksIFkgPSBuKDIwKSwgVyA9IG4oMzMpLCBKID0gbig3MCksIEsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHRoaXMsIGUpLCB0aGlzLl9fdGNmYXBpdWkgPSB2b2lkIDAsIHRoaXMuX190Y2ZhcGl1aSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQuX190Y2ZhcGl1aS5hID0gdC5fX3RjZmFwaXVpLmEgfHwgW10sIHIgPSB3aW5kb3cuZG9jdW1lbnQsIG8gPSBhcmd1bWVudHMubGVuZ3RoLCBpID0gbmV3IEFycmF5KG8gPiAxID8gbyAtIDEgOiAwKSwgcyA9IDE7IHMgPCBvOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbcyAtIDFdID0gYXJndW1lbnRzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnB1c2goW2VdLmNvbmNhdChpKSksICFyLmdldEVsZW1lbnRCeUlkKCdfX3RjZmFwaXVpc2NyaXB0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSwgYyA9IChGZS5jb3JlQ29uZmlnLmxhbmdfIHx8ICdlbicpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEouaW5jbHVkZXMoYykgfHwgKGMgPSAnZW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAnaHR0cHM6Ly9xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy90Y2Z2Mi8zMi9jbXAydWkuanMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5yZXBsYWNlKCcuanMnLCAnLScuY29uY2F0KGMsICcuanMnKSksIGEudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnLCBhLmlkID0gJ19fdGNmYXBpdWlzY3JpcHQnLCBhLnNyYyA9IHUsIHIuaGVhZC5hcHBlbmRDaGlsZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cuX190Y2ZhcGl1aSB8fCAod2luZG93Ll9fdGNmYXBpdWkgPSB0aGlzLl9fdGNmYXBpdWkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGlzcGxheVVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgaSwgcywgYywgdSwgcCA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gcC5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gcFsxXSA/IHBbMV0gOiAxLCBvID0gcC5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gcFsyXSAmJiBwWzJdLCBpID0gbnVsbCA9PT0gKG4gPSBGZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLmluY2x1ZGVzKHQpLCBCZS51cGRhdGVBcGlWaXNpYmxlKHQsIGkpLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlLndhcm4oJ2F0dGVtcHQgdG8gc2hvdyBkaXNhYmxlZCBDTVAgVUkgcmVndWxhdGlvbj0nLmNvbmNhdCh0KSksIGUuYWJydXB0KCdyZXR1cm4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocyA9ICdHRFBSJyA9PT0gdCkgfHwgV2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAxMSwgSmUoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTQsIEJlLmxvYWRHVkwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudDAgPSBlLnNlbnQsIGUubmV4dCA9IDE4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnQwID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPSBlLnQwLCBlLnQxID0gdCwgZS50MiA9IHIsIGUudDMgPSBvLCBlLnQ0ID0gRmUsIGUudDUgPSBjLCAhcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDMwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDI3LCBCZS5nZXRDb25zZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50NiA9IGUuc2VudCwgZS5uZXh0ID0gMzE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudDYgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudDcgPSBlLnQ2LCBlLnQ4ID0gcyA/IEhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JMaXN0IDoge30sIGUudDkgPSBzID8gS2UuZGF0YSA6IHt9LCB1ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRpb246IGUudDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogZS50MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01hbmRhdG9yeTogZS50MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGUudDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsOiBlLnQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRJbmZvOiBlLnQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvckxpc3Q6IGUudDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlRGF0YTogZS50OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgd2luZG93Ll9fdGNmYXBpdWkoJ2Rpc3BsYXlVaScsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBRID0gbig4NyksIFogPSBuLm4oUSkuYS5jcmVhdGUoeyB4c3JmQ29va2llTmFtZTogbnVsbCB9KSwgWCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT0RFX0VOVjogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVCTElDX1VSTDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVBfRlJBTUVfVVJMX0JBU0U6ICdodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyLzMyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUF9DSEVDS19DT05TRU5UX1VSTDogJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9hbXAvY2hlY2stY29uc2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0NBTF9TVEFUSUNfRElSOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9MT0dfQVBJOiAnaHR0cHM6Ly9hdWRpdC10Y2Z2Mi5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFDVF9BUFBfR0VPSVBfQVBJX1VSTDogJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9nZW9pcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFDVF9BUFBfQ01QX0NPT0tJRV9BUEk6ICdodHRwczovL2FwaXMucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvQ29va2llQWNjZXNzVjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBQ1RfQVBQX0dPT0dMRV9BVFBfVVJMOiAnaHR0cHM6Ly9xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy90Y2Z2Mi9nb29nbGUtYXRwLWxpc3QuanNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFDVF9BUFBfVkVSU0lPTjogJzMyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9DTVBVSV9TUkM6ICdodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyLzMyL2NtcDJ1aS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFDVF9BUFBfR1ZMX0JBU0VfVVJMOiAnaHR0cHM6Ly9xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9HVkwtdjIvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9UUkFOU0xBVElPTl9CQVNFX1VSTDogJ2h0dHBzOi8vd3d3LnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyL3RyYW5zbGF0aW9ucy8nCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLlJFQUNUX0FQUF9ERUJVRyAmJiBjb25zb2xlLmxvZygnRGVidWc6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICB9LCAkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocCh0aGlzLCBlKSwgdGhpcy5faXNVc2VySW5FVSA9IHZvaWQgMCwgdGhpcy5faXNVc2VySW5VUyA9IHZvaWQgMCwgdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb24gPSB2b2lkIDAsIHRoaXMuX3VzZXJTcGVjaWZpY0xvY2F0aW9uID0gbnVsbCwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaW5VUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNVc2VySW5FVSA9IGZhbHNlLCB0aGlzLl9pc1VzZXJJblVTID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbkVVJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1VzZXJJbkVVID0gZmFsc2UsIHRoaXMuX2lzVXNlckluVVMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNVc2VySW5FVSA9IGZhbHNlLCB0aGlzLl9pc1VzZXJJblVTID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NoZWNrU3BlY2lmaWNMb2NhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID0gRmUuY29yZUNvbmZpZy5wcml2YWN5TW9kZSwgdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAyMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYKCdpbml0VXNwTG9jYXRpb246IGV4YWN0IGxvY2F0aW9uIHJlcXVlc3QnKSwgIXQuaW5jbHVkZXMoJ1VTUCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9IEZlLmNvcmVDb25maWcudXNwSnVyaXNkaWN0aW9uLCAhdGhpcy5pc1VzZXJJblVTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5pbmNsdWRlcygnVVMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJldiA9IDcsIGUubmV4dCA9IDEwLCBaLmdldCgnaHR0cHM6Ly9hcGlzLnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL2dlb2lwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZS5zZW50LCB0aGlzLl91c2VyU3BlY2lmaWNMb2NhdGlvbiA9IHIuZGF0YSwgZS5uZXh0ID0gMTc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldiA9IDE0LCBlLnQwID0gZS5jYXRjaCg3KSwgY29uc29sZS5sb2coZS50MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAyMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb24gPSAnVVMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VzZXJTcGVjaWZpY0xvY2F0aW9uID0gJ25vbi1VUyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnJ1cHQoJ3JldHVybicsIHRoaXMuX3VzZXJTcGVjaWZpY0xvY2F0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcywgW1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2lzVXNlckluRVUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCgndGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0aW5nJyksIHRoaXMuX2lzVXNlckluRVUgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1VzZXJJbkVVOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnaXNVc2VySW5VUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCd0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcnKSwgdGhpcy5faXNVc2VySW5VUyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVXNlckluVVM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd1c2VyU3BlY2lmaWNMb2NhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYKCd0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcnKSwgdGhpcy5fdXNlclNwZWNpZmljTG9jYXRpb24gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c2VyU3BlY2lmaWNMb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlID0gJycsIG5lKHQpLmRpc3BhdGNoKGUpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ0b2EoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gJycsIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IGVbbl0sIG8gPSAwOyBvIDwgNDsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHIgPj4gOCAqIG8gJiAyNTUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gZS5sZW5ndGgsIHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzMyNTg0MTkzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI3MTczMzg3OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNzMyNTg0MTk0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcxNzMzODc4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gNjQ7IHQgPD0gZS5sZW5ndGg7IHQgKz0gNjQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlKHIsIHVlKGUuc3Vic3RyaW5nKHQgLSA2NCwgdCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5zdWJzdHJpbmcodCAtIDY0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bdCA+PiAyXSB8PSBlLmNoYXJDb2RlQXQodCkgPDwgKHQgJSA0IDw8IDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvW3QgPj4gMl0gfD0gMTI4IDw8ICh0ICUgNCA8PCAzKSwgdCA+IDU1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlKHIsIG8pLCB0ID0gMDsgdCA8IDE2OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW3RdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1sxNF0gPSA4ICogbiwgcmUociwgbyksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0odGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGUgPSAnJzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5lKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBuID0gbiB8fCBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlICs9IGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gZSAmJiAodCA9ICdudWxsJyksIHRoaXNbJ18nICsgdF0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9vYmplY3Q6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSwgbyA9IC9cW29iamVjdCAoLiopXF0vaS5leGVjKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IChvID0gbyA/IG9bMV0gOiAndW5rbm93bjpbJyArIHQgKyAnXScpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaSA9IG4uaW5kZXhPZihlKSkgPj0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNwYXRjaCgnW0NJUkNVTEFSOicgKyBpICsgJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnB1c2goZSksICdvYmplY3QnID09PSBvIHx8ICdmdW5jdGlvbicgPT09IG8gfHwgJ2FzeW5jZnVuY3Rpb24nID09PSBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCdvYmplY3Q6JyArIHMubGVuZ3RoICsgJzonKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmRpc3BhdGNoKHQpLCByKCc6JyksIGEuZGlzcGF0Y2goZVt0XSksIHIoJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpc1snXycgKyBvXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gb2JqZWN0IHR5cGUgIicgKyBvICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgb10oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9hcnJheTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdhcnJheTonICsgZS5sZW5ndGggKyAnOicpLCBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kaXNwYXRjaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZGF0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdkYXRlOicgKyBlLnRvSlNPTigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3N5bWJvbDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdzeW1ib2w6JyArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9lcnJvcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdlcnJvcjonICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2Jvb2xlYW46IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcignYm9vbDonICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3N0cmluZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoJ3N0cmluZzonICsgZS5sZW5ndGggKyAnOicpLCByKGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9mdW5jdGlvbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoJ2ZuOicpLCB0aGlzLmRpc3BhdGNoKGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9udW1iZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcignbnVtYmVyOicgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfeG1sOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ3htbDonICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX251bGw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdOdWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF91bmRlZmluZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdVbmRlZmluZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3JlZ2V4cDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCdyZWdleDonICsgZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3VpbnQ4YXJyYXk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcigndWludDhhcnJheTonKSwgdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF91aW50OGNsYW1wZWRhcnJheTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCd1aW50OGNsYW1wZWRhcnJheTonKSwgdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9pbnQ4YXJyYXk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcigndWludDhhcnJheTonKSwgdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF91aW50MTZhcnJheTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCd1aW50MTZhcnJheTonKSwgdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9pbnQxNmFycmF5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ3VpbnQxNmFycmF5OicpLCB0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3VpbnQzMmFycmF5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ3VpbnQzMmFycmF5OicpLCB0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2ludDMyYXJyYXk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcigndWludDMyYXJyYXk6JyksIHRoaXMuZGlzcGF0Y2goQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZmxvYXQzMmFycmF5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ2Zsb2F0MzJhcnJheTonKSwgdGhpcy5kaXNwYXRjaChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9mbG9hdDY0YXJyYXk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcignZmxvYXQ2NGFycmF5OicpLCB0aGlzLmRpc3BhdGNoKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2FycmF5YnVmZmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ2FycmF5YnVmZmVyOicpLCB0aGlzLmRpc3BhdGNoKG5ldyBVaW50OEFycmF5KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3VybDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKCd1cmw6JyArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9tYXA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCdtYXA6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9zZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCdzZXQ6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcmUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVswXSwgciA9IGVbMV0sIG8gPSBlWzJdLCBpID0gZVszXTsKICAgICAgICAgICAgICAgICAgICBuID0gaWUobiwgciwgbywgaSwgdFswXSwgNywgLTY4MDg3NjkzNiksIGkgPSBpZShpLCBuLCByLCBvLCB0WzFdLCAxMiwgLTM4OTU2NDU4NiksIG8gPSBpZShvLCBpLCBuLCByLCB0WzJdLCAxNywgNjA2MTA1ODE5KSwgciA9IGllKHIsIG8sIGksIG4sIHRbM10sIDIyLCAtMTA0NDUyNTMzMCksIG4gPSBpZShuLCByLCBvLCBpLCB0WzRdLCA3LCAtMTc2NDE4ODk3KSwgaSA9IGllKGksIG4sIHIsIG8sIHRbNV0sIDEyLCAxMjAwMDgwNDI2KSwgbyA9IGllKG8sIGksIG4sIHIsIHRbNl0sIDE3LCAtMTQ3MzIzMTM0MSksIHIgPSBpZShyLCBvLCBpLCBuLCB0WzddLCAyMiwgLTQ1NzA1OTgzKSwgbiA9IGllKG4sIHIsIG8sIGksIHRbOF0sIDcsIDE3NzAwMzU0MTYpLCBpID0gaWUoaSwgbiwgciwgbywgdFs5XSwgMTIsIC0xOTU4NDE0NDE3KSwgbyA9IGllKG8sIGksIG4sIHIsIHRbMTBdLCAxNywgLTQyMDYzKSwgciA9IGllKHIsIG8sIGksIG4sIHRbMTFdLCAyMiwgLTE5OTA0MDQxNjIpLCBuID0gaWUobiwgciwgbywgaSwgdFsxMl0sIDcsIDE4MDQ2MDM2ODIpLCBpID0gaWUoaSwgbiwgciwgbywgdFsxM10sIDEyLCAtNDAzNDExMDEpLCBvID0gaWUobywgaSwgbiwgciwgdFsxNF0sIDE3LCAtMTUwMjAwMjI5MCksIG4gPSBzZShuLCByID0gaWUociwgbywgaSwgbiwgdFsxNV0sIDIyLCAxMjM2NTM1MzI5KSwgbywgaSwgdFsxXSwgNSwgLTE2NTc5NjUxMCksIGkgPSBzZShpLCBuLCByLCBvLCB0WzZdLCA5LCAtMTA2OTUwMTYzMiksIG8gPSBzZShvLCBpLCBuLCByLCB0WzExXSwgMTQsIDY0MzcxNzcxMyksIHIgPSBzZShyLCBvLCBpLCBuLCB0WzBdLCAyMCwgLTM3Mzg5NzMwMiksIG4gPSBzZShuLCByLCBvLCBpLCB0WzVdLCA1LCAtNzAxNTU4NjkxKSwgaSA9IHNlKGksIG4sIHIsIG8sIHRbMTBdLCA5LCAzODAxNjA4MyksIG8gPSBzZShvLCBpLCBuLCByLCB0WzE1XSwgMTQsIC02NjA0NzgzMzUpLCByID0gc2UociwgbywgaSwgbiwgdFs0XSwgMjAsIC00MDU1Mzc4NDgpLCBuID0gc2UobiwgciwgbywgaSwgdFs5XSwgNSwgNTY4NDQ2NDM4KSwgaSA9IHNlKGksIG4sIHIsIG8sIHRbMTRdLCA5LCAtMTAxOTgwMzY5MCksIG8gPSBzZShvLCBpLCBuLCByLCB0WzNdLCAxNCwgLTE4NzM2Mzk2MSksIHIgPSBzZShyLCBvLCBpLCBuLCB0WzhdLCAyMCwgMTE2MzUzMTUwMSksIG4gPSBzZShuLCByLCBvLCBpLCB0WzEzXSwgNSwgLTE0NDQ2ODE0NjcpLCBpID0gc2UoaSwgbiwgciwgbywgdFsyXSwgOSwgLTUxNDAzNzg0KSwgbyA9IHNlKG8sIGksIG4sIHIsIHRbN10sIDE0LCAxNzM1MzI4NDczKSwgbiA9IGFlKG4sIHIgPSBzZShyLCBvLCBpLCBuLCB0WzEyXSwgMjAsIC0xOTI2NjA3NzM0KSwgbywgaSwgdFs1XSwgNCwgLTM3ODU1OCksIGkgPSBhZShpLCBuLCByLCBvLCB0WzhdLCAxMSwgLTIwMjI1NzQ0NjMpLCBvID0gYWUobywgaSwgbiwgciwgdFsxMV0sIDE2LCAxODM5MDMwNTYyKSwgciA9IGFlKHIsIG8sIGksIG4sIHRbMTRdLCAyMywgLTM1MzA5NTU2KSwgbiA9IGFlKG4sIHIsIG8sIGksIHRbMV0sIDQsIC0xNTMwOTkyMDYwKSwgaSA9IGFlKGksIG4sIHIsIG8sIHRbNF0sIDExLCAxMjcyODkzMzUzKSwgbyA9IGFlKG8sIGksIG4sIHIsIHRbN10sIDE2LCAtMTU1NDk3NjMyKSwgciA9IGFlKHIsIG8sIGksIG4sIHRbMTBdLCAyMywgLTEwOTQ3MzA2NDApLCBuID0gYWUobiwgciwgbywgaSwgdFsxM10sIDQsIDY4MTI3OTE3NCksIGkgPSBhZShpLCBuLCByLCBvLCB0WzBdLCAxMSwgLTM1ODUzNzIyMiksIG8gPSBhZShvLCBpLCBuLCByLCB0WzNdLCAxNiwgLTcyMjUyMTk3OSksIHIgPSBhZShyLCBvLCBpLCBuLCB0WzZdLCAyMywgNzYwMjkxODkpLCBuID0gYWUobiwgciwgbywgaSwgdFs5XSwgNCwgLTY0MDM2NDQ4NyksIGkgPSBhZShpLCBuLCByLCBvLCB0WzEyXSwgMTEsIC00MjE4MTU4MzUpLCBvID0gYWUobywgaSwgbiwgciwgdFsxNV0sIDE2LCA1MzA3NDI1MjApLCBuID0gY2UobiwgciA9IGFlKHIsIG8sIGksIG4sIHRbMl0sIDIzLCAtOTk1MzM4NjUxKSwgbywgaSwgdFswXSwgNiwgLTE5ODYzMDg0NCksIGkgPSBjZShpLCBuLCByLCBvLCB0WzddLCAxMCwgMTEyNjg5MTQxNSksIG8gPSBjZShvLCBpLCBuLCByLCB0WzE0XSwgMTUsIC0xNDE2MzU0OTA1KSwgciA9IGNlKHIsIG8sIGksIG4sIHRbNV0sIDIxLCAtNTc0MzQwNTUpLCBuID0gY2UobiwgciwgbywgaSwgdFsxMl0sIDYsIDE3MDA0ODU1NzEpLCBpID0gY2UoaSwgbiwgciwgbywgdFszXSwgMTAsIC0xODk0OTg2NjA2KSwgbyA9IGNlKG8sIGksIG4sIHIsIHRbMTBdLCAxNSwgLTEwNTE1MjMpLCByID0gY2UociwgbywgaSwgbiwgdFsxXSwgMjEsIC0yMDU0OTIyNzk5KSwgbiA9IGNlKG4sIHIsIG8sIGksIHRbOF0sIDYsIDE4NzMzMTMzNTkpLCBpID0gY2UoaSwgbiwgciwgbywgdFsxNV0sIDEwLCAtMzA2MTE3NDQpLCBvID0gY2UobywgaSwgbiwgciwgdFs2XSwgMTUsIC0xNTYwMTk4MzgwKSwgciA9IGNlKHIsIG8sIGksIG4sIHRbMTNdLCAyMSwgMTMwOTE1MTY0OSksIG4gPSBjZShuLCByLCBvLCBpLCB0WzRdLCA2LCAtMTQ1NTIzMDcwKSwgaSA9IGNlKGksIG4sIHIsIG8sIHRbMTFdLCAxMCwgLTExMjAyMTAzNzkpLCBvID0gY2UobywgaSwgbiwgciwgdFsyXSwgMTUsIDcxODc4NzI1OSksIHIgPSBjZShyLCBvLCBpLCBuLCB0WzldLCAyMSwgLTM0MzQ4NTU1MSksIGVbMF0gPSBwZShuLCBlWzBdKSwgZVsxXSA9IHBlKHIsIGVbMV0pLCBlWzJdID0gcGUobywgZVsyXSksIGVbM10gPSBwZShpLCBlWzNdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9lKGUsIHQsIG4sIHIsIG8sIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHBlKHBlKHQsIGUpLCBwZShyLCBpKSksIHBlKHQgPDwgbyB8IHQgPj4+IDMyIC0gbywgbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpZShlLCB0LCBuLCByLCBvLCBpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9lKHQgJiBuIHwgfnQgJiByLCBlLCB0LCBvLCBpLCBzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNlKGUsIHQsIG4sIHIsIG8sIGksIHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2UodCAmIHIgfCBuICYgfnIsIGUsIHQsIG8sIGksIHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYWUoZSwgdCwgbiwgciwgbywgaSwgcykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZSh0IF4gbiBeIHIsIGUsIHQsIG8sIGksIHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gY2UoZSwgdCwgbiwgciwgbywgaSwgcykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZShuIF4gKHQgfCB+ciksIGUsIHQsIG8sIGksIHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdWUoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDY0OyB0ICs9IDQpCiAgICAgICAgICAgICAgICAgICAgICAgIG5bdCA+PiAyXSA9IGUuY2hhckNvZGVBdCh0KSArIChlLmNoYXJDb2RlQXQodCArIDEpIDw8IDgpICsgKGUuY2hhckNvZGVBdCh0ICsgMikgPDwgMTYpICsgKGUuY2hhckNvZGVBdCh0ICsgMykgPDwgMjQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICsgdCAmIDQyOTQ5NjcyOTU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcCh0aGlzLCBlKSwgdGhpcy5fdmFsdWVzID0gdm9pZCAwLCB0aGlzLl92YWx1ZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldWNvbnNlbnQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiVmVuZG9yQ29uc2VudDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JzSGFzaDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZXRjaGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2UucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd2YWx1ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0pLCBlOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZGUoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gbiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyB8fCAobyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSksIHQgJiYgKG8uY2xhc3NOYW1lID0gdCksIG4gJiYgKG8uaWQgPSBuKSwgciAmJiByLmluc2VydEJlZm9yZShvLCByLmZpcnN0Q2hpbGQpKSwgbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jb3JlQ29uZmlnLCBuID0gdC5wdWJsaXNoZXJGZWF0dXJlc0lkcywgciA9IHQucHVibGlzaGVyU3BlY2lhbEZlYXR1cmVzSWRzLCBvID0gdC5wdWJsaXNoZXJTcGVjaWFsUHVycG9zZXNJZHMsIGkgPSB0LnB1Ymxpc2hlclB1cnBvc2VJZHMsIHMgPSB0LnB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMsIGEgPSB0LnZlbmRvclB1cnBvc2VJZHMsIGMgPSB0LnZlbmRvclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMsIHUgPSB0LnZlbmRvclNwZWNpYWxGZWF0dXJlc0lkcywgcCA9IHQudmVuZG9yU3BlY2lhbFB1cnBvc2VzSWRzLCBsID0gdC52ZW5kb3JGZWF0dXJlc0lkcywgZCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBmID0gKGEgfHwgW10pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCA9IGUpICYmIHQuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIC0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZUlkczogKGYgPyBhIDogaSkgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzOiAoZiA/IGMgOiBzKSB8fCBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlc0lkczogKGYgPyB1IDogcikgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsUHVycG9zZXNJZHM6IChmID8gcCA6IG8pIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXNJZHM6IChmID8gbCA6IG4pIHx8IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgaGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXSwgciA9ICcnLmNvbmNhdChlWzBdLCAnficpLCBvID0gZS5tYXRjaCgvXGQrL2cpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoby5zaGlmdCgpLCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChyKS5jb25jYXQobnVsbCA9PT0gbyB8fCB2b2lkIDAgPT09IG8gPyB2b2lkIDAgOiBvLmpvaW4oJy4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCA9PT0gbyB8fCB2b2lkIDAgPT09IG8gPyB2b2lkIDAgOiBvLnJlZHVjZShmdW5jdGlvbiAoZSwgbiwgciwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBwYXJzZUludChuLCAxMCksIGUuY29uY2F0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBvW3JdID8gcGFyc2VJbnQobiwgMTApICsgdCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IGksIGkgPyBlLmNvbmNhdCgnLicuY29uY2F0KGkpKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24geWUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdzdHJpbmcnID09PSB0eXBlb2YgdCA/IGUodCkgOiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHZlLCBnZSwgbWUsIGJlLCBDZSwgX2UsIEVlLCBTZSwgSWUsIExlLCBQZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMuZGF0YSA9IHZvaWQgMCwgdGhpcy5fcmVwcm9tcHRPcHRpb25zSGFzaCA9IHZvaWQgMCwgdGhpcy5fc3RvcmVkSGFzaCA9IHZvaWQgMCwgdGhpcy5kYXRhID0gbmV3IGxlKCksIHRoaXMuX3JlcHJvbXB0T3B0aW9uc0hhc2ggPSAnJywgdGhpcy5fc3RvcmVkSGFzaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzaG91bGRSZXByb21wdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdlbmVyYXRlUmVwcm9tcHRPcHRpb25zSGFzaCgpLCB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZWRIYXNoICE9PSBlICYmICh0ID0gITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2VuZXJhdGVSZXByb21wdE9wdGlvbnNIYXNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZGF0YS52YWx1ZXMsIHQgPSBlLmV1Y29uc2VudCwgbiA9IGUubm9uSWFiVmVuZG9yQ29uc2VudCwgciA9IGUubm9uSWFiVmVuZG9yc0hhc2gsIG8gPSBGZS5jb3JlQ29uZmlnLCBpID0gby5zdGFja3MsIHMgPSBvLmluaXRTY3JlZW5Cb2R5VGV4dE9wdGlvbiwgYSA9IEZlLnByZW1pdW1Qcm9wZXJ0aWVzLCBjID0gYS52ZW5kb3JXaGl0ZWxpc3QsIHUgPSBhLnZlbmRvckJsYWNrbGlzdCwgcCA9IGZlKEZlKSwgbCA9IHAucHVycG9zZUlkcywgZCA9IHAucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcywgZiA9IHAuc3BlY2lhbEZlYXR1cmVzSWRzLCBoID0gcC5zcGVjaWFsUHVycG9zZXNJZHMsIHkgPSBwLmZlYXR1cmVzSWRzLCB2ID0gdGhpcy5jcmVhdGVOZXdIYXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBnID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcgPSAnJy5jb25jYXQoZywgJy4nKS5jb25jYXQocywgJy4nKS5jb25jYXQodiksIGcgPSBuID8gJycuY29uY2F0KGcsICcuJykuY29uY2F0KG4pIDogZywgZyA9IHIgPyAnJy5jb25jYXQoZywgJy4nKS5jb25jYXQocikgOiBnLCB0aGlzLl9yZXByb21wdE9wdGlvbnNIYXNoID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NyZWF0ZU5ld0hhc2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZXRWYWx1ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudmFsdWVzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldFZhbHVlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS52YWx1ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdG9yZWRIYXNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0b3JlZEhhc2ggPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9yZWRIYXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCB3ZSA9IG4oMjEpLCBBZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMuTE9XRVJDQVNFX1NUQVJUID0gOTcsIHRoaXMuUEFEX1pFUk9TID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgdGhpcy5DT09LSUVfTUFYX0FHRSA9IDMzNjk2MDAwLCB0aGlzLmJpdFNpemVzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcElkOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U2NyZWVuOiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRMYW5ndWFnZTogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wVmVyc2lvbjogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wVmVyc2lvbk9sZDogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50VmFsdWU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbnNlbnQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVmVuZG9ySWQ6IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nVHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JhbmdlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWZW5kb3JJZDogMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyQ3VzdG9tUHVycG9zZXM6IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRW50cmllczogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyUHVycG9zZXNWZXJzaW9uOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3Nlc0Fsb3dlZDogMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQ6IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VmVuZG9ySWQ6IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGlzdFZlcnNpb246IDEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9iaW5hcnlTdHIgPSB2b2lkIDAsIHRoaXMuX2JpdFBvc2l0aW9uID0gdm9pZCAwLCB0aGlzLlRDU3RyaW5nID0gdm9pZCAwLCB0aGlzLl9iaW5hcnlTdHIgPSAnJywgdGhpcy5fYml0UG9zaXRpb24gPSAwLCB0aGlzLlRDU3RyaW5nID0gbmV3IHdlLlRDU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2VuY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuY29va2llTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZHQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb29raWVOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhc3RVcGRhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY21wSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbXBWZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4VmVuZG9ySWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZW5kb3JDb25zZW50cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGUpLCByID0gJ25vbklhYlZlbmRvclRvQmluYXJ5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZHQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb29raWVOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVibGlzaGVyUHVycG9zZXNWZXJzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXJDdXN0b21QdXJwb3NlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFzdFVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbXBJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtcFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zZW50U2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uc2VudExhbmd1YWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yTGlzdFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21QdXJwb3NlQ29uc2VudHMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBlKSwgciA9ICdwdWJsaXNoZXJDb25zZW50VG9CaW5hcnknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBkdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvb2tpZU5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZW5kb3JDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1cnBvc2VDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpYWxGZWF0dXJlT3B0aW5zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJsaXNoZXJDb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHVibGlzaGVyTGVnaXRpbWF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1Ymxpc2hlclB1cnBvc2VJZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJsaXNoZXJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZSksIHIgPSAnZW5jb2RlRXVDb25zZW50JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZHQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb29raWVOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZSksIHIgPSAnZW5jb2RlR29vZ2xlQ29uc2VudCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4ubm90Rm91bmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignJy5jb25jYXQobi5ub3RGb3VuZCwgJyBrZXlzIG5vdCBmb3VuZCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmluY2x1ZGVzKCdUb0JpbmFyeScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0aGlzW3JdKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmaWVkT2JqZWN0OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFPbmx5OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpID0gdGhpcy5iaW5hcnlUb0J5dGVzKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvV2ViU2FmZUJhc2U2NChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3JdKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgY29va2llIG5hbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2RlY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJ2RlY29kZU5vbklhYlZlbmRvckJpbmFyeSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBWOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICdkZWNvZGVQdWJsaXNoZXJCaW5hcnknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAnZGVjb2RlRXVDb25zZW50JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJ2RlY29kZUdvb2dsZUNvbnNlbnQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5pbmNsdWRlcygnQmluYXJ5JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuZnJvbVdlYlNhZmVCYXNlNjQodCksIG8gPSB0aGlzLmJ5dGVzVG9CaW5hcnkocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbbl0obyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tuXSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkIGNvb2tpZSBuYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdhZGRCaW5hcnlGaWVsZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gKGUgfHwgMCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHIubGVuZ3RoIDw9IHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvdW50ZXJlZCBhbiBvdmVyZmxvdyBzZXR0aW5nIGNvb2tpZSBmaWVsZCAnLmNvbmNhdChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB0aGlzLlBBRF9aRVJPUy5zdWJzdHIoMCwgdCAtIHIubGVuZ3RoKSArIHIsIHRoaXMuYmluYXJ5U3RyICs9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmNvZGVHb29nbGVDb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJy5jb25jYXQoZS52ZXJzaW9uLCAnficpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUuY29yZUNvbmZpZy5pc0FNUCA/ICcnLmNvbmNhdCh0KS5jb25jYXQoZS52ZW5kb3JDb25zZW50cy5qb2luKCcuJykpIDogZS52ZW5kb3JDb25zZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gcltuXSA/IHQgLSByW24gLSAxXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA/IGUuY29uY2F0KCcuJy5jb25jYXQobykpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkZWNvZGVHb29nbGVDb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBudWxsID09PSAodCA9IGhlKGUsIEZlLmNvcmVDb25maWcuaXNBTVApLm1hdGNoKC9cZCsvZykpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUsIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbnVsbCA9PT0gbiB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnNoaWZ0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50SWRzOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmNvZGVFdUNvbnNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkoe30sIGUudmVuZG9yQ29uc2VudHMpLCBuID0gaSh7fSwgZS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS52ZW5kb3JDb25zZW50cyA9IHQsIGUudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZVt0XSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdW25dID8gV2VbdF0uc2V0KHBhcnNlSW50KG4pKSA6IFdlW3RdLnVuc2V0KHBhcnNlSW50KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS5wdWJsaXNoZXJDb25zZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjTW9kZWxOYW1lOiAncHVibGlzaGVyQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZUFycmF5OiBlLnB1Ymxpc2hlclB1cnBvc2VJZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUucHVibGlzaGVyTGVnaXRpbWF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y01vZGVsTmFtZTogJ3B1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZHVjZUFycmF5OiBlLnB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHQudmFsdWUgJiYgKGVbdC50Y01vZGVsTmFtZV0gPSB0LnJlZHVjZUFycmF5LnJlZHVjZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGkoe30sIGUpLCB7fSwgcih7fSwgbiwgdC52YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8oJ3ZlbmRvckNvbnNlbnRzJyksIG8oJ3B1cnBvc2VDb25zZW50cycpLCBvKCdzcGVjaWFsRmVhdHVyZU9wdGlucycpLCBvKCd2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzJyksIG8oJ3B1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzJyksIG8oJ3B1Ymxpc2hlckNvbnNlbnRzJyksIG8oJ3B1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMnKSwgZ3QoV2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGVjb2RlRXVDb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbm9uSWFiVmVuZG9yVG9CaW5hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudmVyaWZpZWRPYmplY3QsIG4gPSBlLm1ldGFkYXRhT25seTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmluYXJ5U3RyID0gJycsIHRoaXMuYWRkQmluYXJ5RmllbGQocHQodC5jcmVhdGVkKSwgdGhpcy5iaXRTaXplcy5jcmVhdGVkLCAnY3JlYXRlZCcpLCB0aGlzLmFkZEJpbmFyeUZpZWxkKHB0KHQubGFzdFVwZGF0ZWQpLCB0aGlzLmJpdFNpemVzLmxhc3RVcGRhdGVkLCAnbGFzdFVwZGF0ZWQnKSwgdGhpcy5hZGRCaW5hcnlGaWVsZCh0LmNtcElkLCB0aGlzLmJpdFNpemVzLmNtcElkLCAnY21wSWQnKSwgdGhpcy5hZGRCaW5hcnlGaWVsZCh0LmNtcFZlcnNpb24sIHRoaXMuYml0U2l6ZXMuY21wVmVyc2lvbiwgJ2NtcFZlcnNpb24nKSwgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpbmFyeVN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRCaW5hcnlGaWVsZCh0Lm1heFZlbmRvcklkLCB0aGlzLmJpdFNpemVzLm1heFZlbmRvcklkLCAnbWF4VmVuZG9ySWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDE7IHIgPD0gdC5tYXhWZW5kb3JJZDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5hcnlTdHIgKz0gdC52ZW5kb3JDb25zZW50c1tyXSA/ICcxJyA6ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5U3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGVjb2RlTm9uSWFiVmVuZG9yQmluYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IGx0KHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNyZWF0ZWQsIGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZWQ6IGx0KHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmxhc3RVcGRhdGVkLCBlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcElkOiB0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jbXBJZCwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFZlcnNpb246IHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLmNtcFZlcnNpb24sIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWZW5kb3JJZDogdGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMubWF4VmVuZG9ySWQsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JDb25zZW50czogW3ZvaWQgMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gdC5tYXhWZW5kb3JJZCB8fCAxLCByID0gbmV3IEFycmF5KG4pLCBvID0gMDsgbyA8IHQubWF4VmVuZG9ySWQ7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbbyArIDFdID0gJzEnID09PSBlLmNoYXJBdCh0aGlzLl9iaXRQb3NpdGlvbiArIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52ZW5kb3JDb25zZW50cyA9IHIsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdwdWJsaXNoZXJDb25zZW50VG9CaW5hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudmVyaWZpZWRPYmplY3QsIG4gPSBlLm1ldGFkYXRhT25seTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYmluYXJ5U3RyID0gJycsIDIgIT09IHQudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmVyc2lvbiAnICsgdC52ZXJzaW9uICsgJyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZEJpbmFyeUZpZWxkKHQudmVyc2lvbiwgdGhpcy5iaXRTaXplcy52ZXJzaW9uLCAndmVyc2lvbicpLCB0aGlzLmFkZEJpbmFyeUZpZWxkKHB0KHQuY3JlYXRlZCksIHRoaXMuYml0U2l6ZXMuY3JlYXRlZCwgJ2NyZWF0ZWQnKSwgdGhpcy5hZGRCaW5hcnlGaWVsZChwdCh0Lmxhc3RVcGRhdGVkKSwgdGhpcy5iaXRTaXplcy5sYXN0VXBkYXRlZCwgJ2xhc3RVcGRhdGVkJyksIHRoaXMuYWRkQmluYXJ5RmllbGQodC5jbXBJZCwgdGhpcy5iaXRTaXplcy5jbXBJZCwgJ2NtcElkJyksIHRoaXMuYWRkQmluYXJ5RmllbGQodC5jbXBWZXJzaW9uLCB0aGlzLmJpdFNpemVzLmNtcFZlcnNpb24sICdjbXBWZXJzaW9uJyksIHRoaXMuYWRkQmluYXJ5RmllbGQodC5jb25zZW50U2NyZWVuLCB0aGlzLmJpdFNpemVzLmNvbnNlbnRTY3JlZW4sICdjb25zZW50U2NyZWVuJyksIHRoaXMuYWRkQmluYXJ5RmllbGQodGhpcy5sYW5ndWFnZVRvQ29va2llVmFsdWUodC5jb25zZW50TGFuZ3VhZ2UpLCB0aGlzLmJpdFNpemVzLmNvbnNlbnRMYW5ndWFnZSwgJ2NvbnNlbnRMYW5ndWFnZScpLCB0aGlzLmFkZEJpbmFyeUZpZWxkKHQudmVuZG9yTGlzdFZlcnNpb24sIHRoaXMuYml0U2l6ZXMudmVuZG9yTGlzdFZlcnNpb24sICd2ZW5kb3JMaXN0VmVyc2lvbicpLCB0aGlzLmFkZEJpbmFyeUZpZWxkKHQucHVibGlzaGVyUHVycG9zZXNWZXJzaW9uLCB0aGlzLmJpdFNpemVzLnB1Ymxpc2hlclB1cnBvc2VzVmVyc2lvbiwgJ3B1Ymxpc2hlclB1cnBvc2VzVmVyc2lvbicpLCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5U3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEJpbmFyeUZpZWxkKHQuc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQsIHRoaXMuYml0U2l6ZXMuc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQsICdzdGFuZGFyZFB1cnBvc2VzQWxsb3dlZCcpLCB0aGlzLmFkZEJpbmFyeUZpZWxkKHQubnVtYmVyQ3VzdG9tUHVycG9zZXMsIHRoaXMuYml0U2l6ZXMubnVtYmVyQ3VzdG9tUHVycG9zZXMsICdudW1iZXJDdXN0b21QdXJwb3NlcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMTsgciA8PSB0Lm51bWJlckN1c3RvbVB1cnBvc2VzOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmFyeVN0ciArPSB0LmN1c3RvbVB1cnBvc2VDb25zZW50c1tyXSA/ICcxJyA6ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5U3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGVjb2RlUHVibGlzaGVyQmluYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRQb3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLnZlcnNpb24sIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiBsdCh0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jcmVhdGVkLCBlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiBsdCh0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5sYXN0VXBkYXRlZCwgZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBJZDogdGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMuY21wSWQsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBWZXJzaW9uOiB0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jbXBWZXJzaW9uLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudFNjcmVlbjogdGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMuY29uc2VudFNjcmVlbiwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRMYW5ndWFnZTogdGhpcy5sYW5ndWFnZUZyb21Db29raWVWYWx1ZSh0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5jb25zZW50TGFuZ3VhZ2UsIGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGlzdFZlcnNpb246IHRoaXMuZ2V0Qml0cyh0aGlzLmJpdFNpemVzLnZlbmRvckxpc3RWZXJzaW9uLCBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyUHVycG9zZXNWZXJzaW9uOiB0aGlzLmdldEJpdHModGhpcy5iaXRTaXplcy5wdWJsaXNoZXJQdXJwb3Nlc1ZlcnNpb24sIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFB1cnBvc2VzQWxsb3dlZDogdGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMuc3RhbmRhcmRQdXJwb3Nlc0FsbG93ZWQsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJDdXN0b21QdXJwb3NlczogdGhpcy5nZXRCaXRzKHRoaXMuYml0U2l6ZXMubnVtYmVyQ3VzdG9tUHVycG9zZXMsIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21QdXJwb3NlQ29uc2VudHM6IFt2b2lkIDBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9IG5ldyBBcnJheSh0Lm51bWJlckN1c3RvbVB1cnBvc2VzICsgMSksIHIgPSAwOyByIDwgdC5udW1iZXJDdXN0b21QdXJwb3NlczsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyICsgMV0gPSAnMScgPT09IGUuY2hhckF0KHRoaXMuX2JpdFBvc2l0aW9uICsgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmN1c3RvbVB1cnBvc2VDb25zZW50cyA9IG4sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdiaW5hcnlUb0J5dGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSArPSB0aGlzLlBBRF9aRVJPUy5zdWJzdHIoMCwgNyAtIChlLmxlbmd0aCArIDcpICUgOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4gKz0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChlLnN1YnN0cihuLCA4KSwgMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2J5dGVzVG9CaW5hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gJycsIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gdGhpcy5iaW5hcnk4Qml0cyhlLmNoYXJDb2RlQXQobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2JpbmFyeThCaXRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDAwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDAxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDAxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDEwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDEwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDExMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDExMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTAxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTEwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTEwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTExMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTExMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZSA+Pj4gNCAmIDE1XSArIHRbMTUgJiBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldEJpdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHBhcnNlSW50KHQuc3Vic3RyKHRoaXMuYml0UG9zaXRpb24sIGUpLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYml0UG9zaXRpb24gKz0gZSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3RvV2ViU2FmZUJhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidG9hKGUpLnJlcGxhY2UoL1wrL2csICctJykucmVwbGFjZSgvXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmcm9tV2ViU2FmZUJhc2U2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdG9iKGUucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsYW5ndWFnZVRvQ29va2llVmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNjQgKiAoZS5jaGFyQ29kZUF0KDApIC0gdGhpcy5MT1dFUkNBU0VfU1RBUlQpICsgKGUuY2hhckNvZGVBdCgxKSAtIHRoaXMuTE9XRVJDQVNFX1NUQVJUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xhbmd1YWdlRnJvbUNvb2tpZVZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodGhpcy5MT1dFUkNBU0VfU1RBUlQgKyBlIC8gNjQgPj4+IDApICsgU3RyaW5nLmZyb21DaGFyQ29kZSh0aGlzLkxPV0VSQ0FTRV9TVEFSVCArIGUgJSA2NCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkZWxldGVDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSAnJy5jb25jYXQoZSwgJz07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgbWF4LWFnZT0tMTsgZG9tYWluPScpLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZhbGxiYWNrVG9Mb2NhbFN0b3JhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVPbkxvY2FsU3RvcmFnZShlLCB0KSAmJiB0aGlzLmRlbGV0ZUNvb2tpZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NhdmVPbkxvY2FsU3RvcmFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfYmIyNGEwOWJlMzQxNDFiOCA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JiMjRhMDliZTM0MTQxYjgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrXzE2YzUzMzk1YTgyMmRiNDgubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSwgdCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignQ291bGQgbm90IHNhdmUgZGF0YSBvbiBsb2NhbCBzdG9yYWdlOiBOb3QgZW5vdWdoIHNwYWNlLicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9iYjI0YTA5YmUzNDE0MWI4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2JiMjRhMDliZTM0MTQxYjgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAhKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdKSB8fCBhcmd1bWVudHNbMl0sIHIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAociA9IHRoaXMuc2F2ZU9uTG9jYWxTdG9yYWdlKGUsIHQpKSwgciB8fCB2dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFZhbHVlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWdlOiB0aGlzLkNPT0tJRV9NQVhfQUdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF8wMTg1MTA3NGNkZGQ3MGNmID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMDE4NTEwNzRjZGRkNzBjZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfMTZjNTMzOTVhODIyZGI0OC5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudHJpbSgpLCBuID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7JykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmltKCkuc3RhcnRzV2l0aCh0ICsgJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmltKCkuc3Vic3RyaW5nKHQubGVuZ3RoICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IGUgPT09IE8gPyBDdChuKSA6IG5bMF0sIGUgIT09IE8gJiYgZSAhPT0gUiAmJiBlICE9PSBVICYmIHRoaXMuZmFsbGJhY2tUb0xvY2FsU3RvcmFnZSh0LCByKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignJy5jb25jYXQoZSwgJyBub3QgZm91bmQuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMDE4NTEwNzRjZGRkNzBjZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF8wMTg1MTA3NGNkZGQ3MGNmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2JpdFBvc2l0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JpdFBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaXRQb3NpdGlvbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdiaW5hcnlTdHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluYXJ5U3RyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmluYXJ5U3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24ga2UoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgciA9IG5ldyBBcnJheSh0KTsgbiA8IHQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgcltuXSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ09iamVjdCcgPT09IG4gJiYgZS5jb25zdHJ1Y3RvciAmJiAobiA9IGUuY29uc3RydWN0b3IubmFtZSksICdNYXAnID09PSBuIHx8ICdTZXQnID09PSBuID8gQXJyYXkuZnJvbShuKSA6ICdBcmd1bWVudHMnID09PSBuIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pID8ga2UoZSwgdCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVGUoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIFN5bWJvbCB8fCBudWxsID09IGVbU3ltYm9sLml0ZXJhdG9yXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSB8fCAoZSA9IE9lKGUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwLCBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA+PSBlLmxlbmd0aCA/IHsgZG9uZTogITAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGVbdCsrXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgaSA9ICEwLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSBlLmRvbmUsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgbnVsbCA9PSByLnJldHVybiB8fCByLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtlKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IE9lKGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10sIHIgPSAhMCwgbyA9ICExLCBpID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzLCBhID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEociA9IChzID0gYS5uZXh0KCkpLmRvbmUpICYmIChuLnB1c2gocy52YWx1ZSksICF0IHx8IG4ubGVuZ3RoICE9PSB0KTsgciA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITAsIGkgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIHx8IG51bGwgPT0gYS5yZXR1cm4gfHwgYS5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IE9lKGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLkdPX1RPX1BBR0UgPSAnZ29Ub1BhZ2UnLCBlLlBVUlBPU0UgPSAncHVycG9zZScsIGUuTEVHSVRJTUFURV9QVVJQT1NFID0gJ2xlZ2l0aW1hdGVQdXJwb3NlJywgZS5MRUdJVElNQVRFX1ZFTkRPUiA9ICdsZWdpdGltYXRlVmVuZG9yJywgZS5TUEVDSUFMX0ZFQVRVUkUgPSAnc3BlY2lhbEZlYXR1cmUnLCBlLlNUQUNLID0gJ3N0YWNrJywgZS5QQVJUSUFMX0NPTlNFTlQgPSAncGFydGlhbCcsIGUuU0FWRV9BTkRfRVhJVCA9ICdzYXZlQW5kRXhpdCcsIGUuQUNDRVBUX0FMTCA9ICdhY2NlcHRBbGwnLCBlLlJFSkVDVF9BTEwgPSAncmVqZWN0QWxsJywgZS5BQ0NFUFRfQUxMX0xFR0lUSU1BVEUgPSAnYWNjZXB0QWxsTGVnaXRpbWF0ZScsIGUuT0JKRUNUX0FMTF9MRUdJVElNQVRFID0gJ29iamVjdEFsbExlZ2l0aW1hdGUnLCBlLkFDQ0VQVF9BTExfVkVORE9SUyA9ICdhY2NlcHRBbGxWZW5kb3JzJywgZS5SRUpFQ1RfQUxMX1ZFTkRPUlMgPSAncmVqZWN0QWxsVmVuZG9ycycsIGUuQUNDRVBUX0FMTF9QVVJQT1NFUyA9ICdhY2NlcHRBbGxQdXJwb3NlcycsIGUuUkVKRUNUX0FMTF9QVVJQT1NFUyA9ICdyZWplY3RBbGxQdXJwb3NlcycsIGUuVkVORE9SID0gJ3ZlbmRvcicsIGUuTk9OX0lBQl9WRU5ET1IgPSAnbm9uSWFiVmVuZG9yJywgZS5ESVNNSVNTX1VJID0gJ2Rpc21pc3NVaScsIGUuU1RBUlRfT05fUEFHRSA9ICdzdGFydE9uUGFnZScsIGUuT1BUX09VVF9UT0dHTEUgPSAnb3B0T3V0VG9nZ2xlJywgZS5PUFRfT1VUX0NPTkZJUk0gPSAnb3B0T3V0Q29uZmlybScsIGUuRVhQQU5EX0VMRU1FTlQgPSAnZXhwYW5kRWxlbWVudCcsIGUuQ09MTEFQU0VfRUxFTUVOVCA9ICdjb2xsYXBzZUVsZW1lbnQnLCBlLkdPT0dMRSA9ICdnb29nbGVQYXJ0bmVyJzsKICAgICAgICAgICAgICAgIH0odmUgfHwgKHZlID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLk1BTkRBVE9SWSA9ICd0Y2Z1aTptYW5kYXRvcnknLCBlLkNIQU5HRV9PRl9DT05TRU5UID0gJ3RjZnVpOmNoYW5nZW9mY29uc2VudCcsIGUuQ0NQQSA9ICd1c3B1aTpkb25vdHNlbGwnOwogICAgICAgICAgICAgICAgfShnZSB8fCAoZ2UgPSB7fSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUuRkVBVFVSRVMgPSAnRmVhdHVyZXMnLCBlLk5PTl9JQUIgPSAnTm9uIElBQicsIGUuUFVSUE9TRVMgPSAnUHVycG9zZXMnLCBlLkxFR0lUSU1BVEVfUFVSUE9TRVMgPSAnTGVnaXRpbWF0ZSBQdXJwb3NlcycsIGUuTEVHSVRJTUFURV9WRU5ET1JTID0gJ0xlZ2l0aW1hdGUgVmVuZG9ycycsIGUuU1BFQ0lBTF9QVVJQT1NFUyA9ICdTcGVjaWFsIFB1cnBvc2VzJywgZS5TUEVDSUFMX0ZFQVRVUkVTID0gJ1NwZWNpYWwgRmVhdHVyZXMnLCBlLlZFTkRPUlMgPSAnVmVuZG9ycycsIGUuU1RBQ0tTID0gJ1N0YWNrcycsIGUuR09PR0xFID0gJ0dvb2dsZSc7CiAgICAgICAgICAgICAgICB9KG1lIHx8IChtZSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5JTklUID0gJ2luaXQnLCBlLk5BVklHQVRJT04gPSAnbmF2aWdhdGlvbicsIGUuRE9ORSA9ICdkb25lJzsKICAgICAgICAgICAgICAgIH0oYmUgfHwgKGJlID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLkFDQ0VQVF9BTEwgPSAnQWxsJywgZS5BQ0NFUFRfUEFSVElBTCA9ICdQYXJ0aWFsJywgZS5SRUpFQ1QgPSAnUmVqZWN0JzsKICAgICAgICAgICAgICAgIH0oQ2UgfHwgKENlID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLk5PTkVfT0JKRUNURUQgPSAnTm9uZScsIGUuQUxMX09CSkVDVEVEID0gJ0FsbCc7CiAgICAgICAgICAgICAgICB9KF9lIHx8IChfZSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5TVEFDS1MgPSAnc3RhY2tzJywgZS5WRU5ET1JTID0gJ3ZlbmRvcnMnLCBlLkZFQVRVUkVTID0gJ2ZlYXR1cmVzJywgZS5QVVJQT1NFUyA9ICdwdXJwb3NlcycsIGUuU1BFQ0lBTF9GRUFUVVJFUyA9ICdzcGVjaWFsRmVhdHVyZXMnLCBlLlNQRUNJQUxfUFVSUE9TRVMgPSAnc3BlY2lhbFB1cnBvc2VzJywgZS5GTEVYSUJMRV9QVVJQT1NFUyA9ICdmbGV4aWJsZVB1cnBvc2VzJywgZS5MRUdJVElNQVRFX1ZFTkRPUlMgPSAnbGVnaXRpbWF0ZVZlbmRvcnMnLCBlLkxFR0lUSU1BVEVfUFVSUE9TRVMgPSAnbGVnaXRpbWF0ZVB1cnBvc2VzJywgZS5VTkZJTFRFUkVEX0ZFQVRVUkVTID0gJ3VuZmlsdGVyZWRGZWF0dXJlcycsIGUuVU5GSUxURVJFRF9QVVJQT1NFUyA9ICd1bmZpbHRlcmVkUHVycG9zZXMnLCBlLlVORklMVEVSRURfU1BFQ0lBTF9GRUFUVVJFUyA9ICd1bmZpbHRlcmVkU3BlY2lhbEZlYXR1cmVzJywgZS5VTkZJTFRFUkVEX1NQRUNJQUxfUFVSUE9TRVMgPSAndW5maWx0ZXJlZFNwZWNpYWxQdXJwb3Nlcyc7CiAgICAgICAgICAgICAgICB9KEVlIHx8IChFZSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5DT05TRU5UX1JFU1BPTlNFID0gJ2NvbnNlbnQtcmVzcG9uc2UnLCBlLkNPTlNFTlRfVUkgPSAnY29uc2VudC11aSc7CiAgICAgICAgICAgICAgICB9KFNlIHx8IChTZSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZVtlLkdEUFIgPSAyXSA9ICdHRFBSJywgZVtlLlVTUCA9IDNdID0gJ1VTUCc7CiAgICAgICAgICAgICAgICB9KEllIHx8IChJZSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5BQ0NFUFQgPSAnYWNjZXB0JywgZS5SRUpFQ1QgPSAncmVqZWN0JywgZS5ESVNNSVNTID0gJ2Rpc21pc3MnLCBlLkVOVEVSX0ZVTExTQ1JFRU4gPSAnZW50ZXItZnVsbHNjcmVlbic7CiAgICAgICAgICAgICAgICB9KExlIHx8IChMZSA9IHt9KSk7CiAgICAgICAgICAgICAgICB2YXIgUmUgPSBuKDg4KSwgVWUgPSBuLm4oUmUpLCBEZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW46ICdQcml2YWN5JywKICAgICAgICAgICAgICAgICAgICAgICAgZnI6ICdDb25maWRlbnRpYWxpdMOpJywKICAgICAgICAgICAgICAgICAgICAgICAgZGU6ICdEYXRlbnNjaHV0eicsCiAgICAgICAgICAgICAgICAgICAgICAgIGl0OiAnUmlzZXJ2YXRlenphJywKICAgICAgICAgICAgICAgICAgICAgICAgZXM6ICdQcml2YWNpZGFkJywKICAgICAgICAgICAgICAgICAgICAgICAgZGE6ICdQcml2YXRsaXZldHMgZnJlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG5sOiAnUHJpdmFjeScsCiAgICAgICAgICAgICAgICAgICAgICAgIGVsOiAnzpHPgM+Mz4HPgc63z4TOvycsCiAgICAgICAgICAgICAgICAgICAgICAgIGh1OiAnQWRhdHbDqWRlbGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgcHQ6ICdQcml2YWNpZGFkZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHJvOiAnQ29uZmlkZW7Im2lhbGl0YXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgZmk6ICdZa3NpdHlpc3l5cycsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsOiAnUHJ5d2F0bm/Fm8SHJywKICAgICAgICAgICAgICAgICAgICAgICAgc2s6ICdTw7prcm9taWUnLAogICAgICAgICAgICAgICAgICAgICAgICBzdjogJ0ludGVncml0ZXQnLAogICAgICAgICAgICAgICAgICAgICAgICBubzogJ1BlcnNvbnZlcm4nLAogICAgICAgICAgICAgICAgICAgICAgICBydTogJ9Ca0L7QvdGE0LjQtNC10L3RhtC40LDQu9GM0L3QvtGB0YLRjCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyOiAn2KXYudiv2KfYr9in2Kog2KfZhNiu2LXZiNi12YrYqScsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhOiAn2KrZhti424zZhdin2Kog2K3YsduM2YUg2K7YtdmI2LXbjCcKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTWUoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciBvLCBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAncWMtY21wMi1jb250YWluZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlKCdkaXYnLCBlLCBlLCBkb2N1bWVudC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBzID0gJ3FjLWNtcDItcGVyc2lzdGVudC1saW5rJywgYSA9IGRlKCdhJywgcywgcywgaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZmlyc3RDaGlsZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgYS5vbmNsaWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Ll9fdGNmYXBpKCdkaXNwbGF5Q29uc2VudFVpJywgMiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBjID0gZGUoJ2ltZycsIHZvaWQgMCwgdm9pZCAwLCBhKSwgdSA9IGUgfHwgRGVbKHQgfHwgJ2VuJykudG9Mb3dlckNhc2UoKV0gfHwgRGUuZW47CiAgICAgICAgICAgICAgICAgICAgYy5zcmMgPSBVZS5hLCBjLmFsdCA9IHU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh1KTsKICAgICAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKHApOwogICAgICAgICAgICAgICAgICAgIHZhciBsID0gZGUoJ3N0eWxlJywgdm9pZCAwLCAncWMtY21wMicsIGRvY3VtZW50LmhlYWQpLCBkID0geGUoKG8gPSB7fSwgcihvLCBmLlRPUF9MRUZULCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZWZ0JwogICAgICAgICAgICAgICAgICAgICAgICBdKSwgcihvLCBmLlRPUF9SSUdIVCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHQnCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCByKG8sIGYuQk9UVE9NX0xFRlQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnQnCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCByKG8sIGYuQk9UVE9NX1JJR0hULCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm90dG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodCcKICAgICAgICAgICAgICAgICAgICAgICAgXSksIG8pW25dLCAyKSwgaCA9IGRbMF0sIHkgPSBkWzFdLCB2ID0gJ3RvcCcgPT09IGggPyAnYm90dG9tJyA6ICd0b3AnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmlubmVySFRNTCA9ICcucWMtY21wMi1wZXJzaXN0ZW50LWxpbmsge2N1cnNvcjpwb2ludGVyOyBwb3NpdGlvbjpmaXhlZDsgYmFja2dyb3VuZC1jb2xvcjojMzY4QkQ2O3BhZGRpbmc6NXB4IDE1cHg7IGNvbG9yOiNGRkY7IGRpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7IG1heC1oZWlnaHQ6MzBweDsgei1pbmRleDoyMTQ3NDgzNjQwOycgKyAnJy5jb25jYXQoaCwgJzowOyAnKS5jb25jYXQoeSwgJzowOycpICsgJ2JvcmRlci0nLmNvbmNhdCh2LCAnLWxlZnQtcmFkaXVzOjNweDsnKSArICdib3JkZXItJy5jb25jYXQodiwgJy1yaWdodC1yYWRpdXM6M3B4OycpICsgJ30ucWMtY21wMi1wZXJzaXN0ZW50LWxpbmsgaW1nIHt3aWR0aDoxNnB4OyBoZWlnaHQ6MTdweDsgbWFyZ2luLXJpZ2h0OjVweDt9JywgYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBCZSwgRmUsIE5lLCBqZSwgR2UsIEhlLCBxZSwgemUsIFllLCBXZSwgSmUsIEtlLCBRZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMuX2Nvb2tpZVZhbHVlcyA9IHZvaWQgMCwgdGhpcy5fZGVsZXRlZFZlbmRvcnMgPSB2b2lkIDAsIHRoaXMuaXNTYWZhcmkgPSB2b2lkIDAsIHRoaXMucmVzb2x2ZUNvb2tpZSA9IHZvaWQgMCwgdGhpcy5fZmV0Y2hDb29raWVzQ2FsbGVkID0gdm9pZCAwLCB0aGlzLnJlc29sdmVDb29raWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9jb29raWVWYWx1ZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVjb25zZW50OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JDb25zZW50OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVDb29raWVWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogbmV3IFByb21pc2UoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucmVzb2x2ZUNvb2tpZSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2RlbGV0ZWRWZW5kb3JzID0gW10sIHRoaXMuaXNTYWZhcmkgPSBidCgnc2FmYXJpJyksIHRoaXMuX2ZldGNoQ29va2llc0NhbGxlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRDb3JlQ29uZmlnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUuY29yZUNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldENvbnNlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBvLCBzLCBjLCB1LCBwLCBsLCBkLCBmLCBoLCB5LCB2LCBnLCBtLCBDLCBfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBtZS5WRU5ET1JTLCBuID0gbWUuTEVHSVRJTUFURV9WRU5ET1JTLCBvID0gbWUuTEVHSVRJTUFURV9QVVJQT1NFUywgcyA9IG1lLlBVUlBPU0VTLCBjID0gbWUuU1BFQ0lBTF9GRUFUVVJFUywgdSA9IG1lLk5PTl9JQUIsIHAgPSBtZS5HT09HTEUsIHRoaXMuX2Nvb2tpZVZhbHVlcy5mZXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA0LCB0aGlzLl9jb29raWVWYWx1ZXMucHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwgPSB5ZSh6ZS5kZWNvZGUsIHRoaXMuX2Nvb2tpZVZhbHVlcy5ldWNvbnNlbnQpLCBkID0gbmV3IGIoKSwgZiA9IFdlLmd2bCwgaCA9IEZlLmNvcmVDb25maWcucHVibGlzaGVyTmFtZSB8fCBGZS5jb3JlQ29uZmlnLmNvb2tpZURvbWFpbiB8fCAnJywgeSA9IEZlLmNvcmVDb25maWcsIHYgPSB5LnB1Ymxpc2hlclB1cnBvc2VJZHMsIGcgPSB5LnB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMsIG0gPSBmLnZlbmRvcnMsICh2IHx8IGcpICYmIChtID0gaShpKHt9LCBtKSwge30sIHIoe30sIGgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpLCB0aGlzLnBvcHVsYXRlQ29uc2VudHMoZCwgdCwgbSwgbCksIHRoaXMucG9wdWxhdGVDb25zZW50cyhkLCBzLCBmLnB1cnBvc2VzLCBsKSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGQsIGMsIGYuc3BlY2lhbEZlYXR1cmVzLCBsKSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGQsIG4sIG0sIGwpLCB0aGlzLnBvcHVsYXRlQ29uc2VudHMoZCwgbywgZi5wdXJwb3NlcywgbCksIEMgPSB5ZShIZS5kZWNvZGUsIHRoaXMuX2Nvb2tpZVZhbHVlcy5ub25JYWJWZW5kb3JDb25zZW50KSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGQsIHUsIEhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JMaXN0LCBDKSwgXyA9IHllKEtlLmRlY29kZSwgdGhpcy5fY29va2llVmFsdWVzLmdvb2dsZUNvb2tpZVZhbHVlKSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGQsIHAsIEtlLmRhdGEsIF8pLCBlLmFicnVwdCgncmV0dXJuJywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdleHRyYWN0TnVtZXJpY0tleXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcGFyc2VJbnQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05hTihyKSB8fCAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0Q29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEZlLmNvcmVDb25maWcsIG4gPSB0LnB1Ymxpc2hlclB1cnBvc2VJZHMsIHIgPSB0LnB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMsIG8gPSB0LnB1Ymxpc2hlck5hbWUsIHMgPSB0LmlzQU1QOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvbnNlbnRTY3JlZW4gJiYgKFdlLmNvbnNlbnRTY3JlZW4gPSBlLmNvbnNlbnRTY3JlZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgYyA9IHplLmVuY29kZSh0aGlzLmV4dHJhY3ROdW1lcmljS2V5cyhlLnZlbmRvckNvbnNlbnRzKSwgdGhpcy5leHRyYWN0TnVtZXJpY0tleXMoZS5wdXJwb3Nlc0NvbnNlbnRzKSwgdGhpcy5leHRyYWN0TnVtZXJpY0tleXMoZS5zcGVjaWFsRmVhdHVyZXMpLCB0aGlzLmV4dHJhY3ROdW1lcmljS2V5cyhlLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdCksIHRoaXMuZXh0cmFjdE51bWVyaWNLZXlzKGUubGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHMpLCBlLnZlbmRvckNvbnNlbnRzW29dLCBlLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdFtvXSwgbiwgciksIHUgPSB0aGlzLmZvcm1hdENvbnNlbnRzKGUubm9uSWFiQ29uc2VudHMpLCBwID0gRmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybCA/IEhlLmVuY29kZSh1LmNvbnNlbnRBcnJheSwgdS5tYXhWZW5kb3JJZCkgOiAnJywgbCA9IHRoaXMuZm9ybWF0R29vZ2xlQ29uc2VudHMoZSksIGQgPSBGZS5jb3JlQ29uZmlnLmdvb2dsZUVuYWJsZWQgPyBLZS5lbmNvZGUobCkgOiAnJywgZiA9IEhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JzSGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwubGVuZ3RoIHx8IHMgfHwgR2UuZGVsZXRlQ29va2llKFUsIEZlLmNvcmVDb25maWcuY29va2llRG9tYWluKSwgWWUuc2V0VmFsdWVzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV1Y29uc2VudDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvckNvbnNlbnQ6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JzSGFzaDogZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYSA9IFllLmdlbmVyYXRlUmVwcm9tcHRPcHRpb25zSGFzaCgpLCB0aGlzLnNldERhdGEoYywgcCwgYSwgZCksIHRoaXMudXBkYXRlQXBpVmlzaWJsZSgnR0RQUicsICExKSwgaShpKHt9LCB0aGlzLl9jb29raWVWYWx1ZXMpLCB7fSwgeyBhbGxDb25zZW50czogZS5hbGxDb25zZW50cyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3VwZGF0ZUFwaVZpc2libGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ1VTUCcgIT09IGUgJiYgZnQoTmUuaXNVc2VySW5FVSwgRmUuY29yZUNvbmZpZy5kaXNwbGF5VWkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX2Nvb2tpZVZhbHVlcy5ldWNvbnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICFuLm1lc3NhZ2UgfHwgKG4gPSAnJyksIFN0LmNtcEFwaS51cGRhdGUobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3QuY21wQXBpLnVwZGF0ZShudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmUuY29yZUNvbmZpZy5wcml2YWN5TW9kZS5pbmNsdWRlcygnR0RQUicpICYmIEZlLmNvcmVDb25maWcuZGlzcGxheVBlcnNpc3RlbnRDb25zZW50TGluayAmJiAhRmUuY29yZUNvbmZpZy5pc0FNUCAmJiB0aGlzLmhhc0Nvb2tpZSgpICYmIE1lKEZlLmdldEN1c3RvbUNvcmVVaUxhYmVscygpLnBlcnNpc3RlbnRDb25zZW50TGlua0xhYmVsLCBGZS5jb3JlQ29uZmlnLmxhbmdfLCBGZS5jb3JlQ29uZmlnLnBlcnNpc3RlbnRDb25zZW50TGlua0xvY2F0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IEZlLmNvcmVDb25maWcsIGkgPSBvLmNvbnNlbnRTY29wZSwgcyA9IG8udGhpcmRQYXJ0eVN0b3JhZ2VUeXBlLCBhID0gby5jb25zZW50U2NvcGVHcm91cFVSTCwgYyA9IG8uY29uc2VudE9uU2FmYXJpLCB1ID0gby5pc0FNUCwgcCA9ICdhcGknID09PSBzLCBsID0gdGhpcy5pc1NhZmFyaSAmJiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IHx8IChsID8gdGhpcy5zZXREYXRhVXNpbmdBcGkoITAsIGEsIGUsIHQsIG4sIHIpIDogaSA9PT0geS5TRVJWSUNFIHx8IHRoaXMuaXNTYWZhcmkgPyB0aGlzLnNldERhdGFVc2luZ0ZpcnN0UGFydHkoZSwgdCwgbiwgcikgOiBpID09PSB5LkdMT0JBTCA/ICh0aGlzLnNldERhdGFVc2luZ0FwaSghMCwgJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9Db29raWVBY2Nlc3NWMicsIGUpLCB0aGlzLnNldERhdGFVc2luZ0ZpcnN0UGFydHkoJycsIHQsIG4pKSA6IGkgPT09IHkuR0xPQkFMX0dST1VQID8gcCA/ICh0aGlzLnNldERhdGFVc2luZ0FwaSghMCwgJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9Db29raWVBY2Nlc3NWMicsIGUpLCB0aGlzLnNldERhdGFVc2luZ0FwaSghMCwgYSwgJycsIHQsIG4pKSA6ICh0aGlzLnNldERhdGFVc2luZ0FwaSghMCwgJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9Db29raWVBY2Nlc3NWMicsIGUpLCB0aGlzLnNldERhdGFVc2luZ0lmcmFtZSgnJywgdCwgbikpIDogaSA9PT0geS5TRVJWSUNFX0dST1VQICYmIChwID8gdGhpcy5zZXREYXRhVXNpbmdBcGkoITAsIGEsIGUsIHQsIG4sIHIpIDogdGhpcy5zZXREYXRhVXNpbmdJZnJhbWUoZSwgdCwgbiwgcikpKSwgdGhpcy5fY29va2llVmFsdWVzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVjb25zZW50OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiVmVuZG9yQ29uc2VudDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZUNvb2tpZVZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiB0aGlzLl9jb29raWVWYWx1ZXMucHJvbWlzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0RGF0YVVzaW5nQXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIHQsIG4sIHIsIG8sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAoc1tPXSA9IG4pLCByICYmIChzW1RdID0gciksIG8gJiYgKHNbeF0gPSBvKSwgaSAmJiAoc1tVXSA9IGkpLCBaKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ3Bvc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgY29va2llcyB3YXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0RGF0YVVzaW5nSWZyYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoJ3NldCcsIE8sIGUpLCB0ICYmIHN0LnRyeUdyb3VwQ29va2llQWNjZXNzQ2FsbCgnc2V0JywgVCwgdCksIG4gJiYgc3QudHJ5R3JvdXBDb29raWVBY2Nlc3NDYWxsKCdzZXQnLCB4LCBuKSwgciAmJiBzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoJ3NldCcsIFUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0RGF0YVVzaW5nRmlyc3RQYXJ0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgemUuc2V0Q29va2llKGUpLCB0ICYmIEhlLnNldENvb2tpZSh0KSwgbiAmJiBHZS5zZXQoeCwgbiksIHIgJiYgS2Uuc2V0Q29va2llKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZmV0Y2hDb29raWVWYWx1ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShhLmEubWFyayhmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIsIG8sIGksIHMsIGMsIHUsIHAsIGwsIGQsIGYsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IEZlLmNvcmVDb25maWcsIG4gPSB0LmNvbnNlbnRTY29wZSwgciA9IHQuY29uc2VudFNjb3BlR3JvdXBVUkwsIG8gPSB0LnRoaXJkUGFydHlTdG9yYWdlVHlwZSwgaSA9IHQuY29uc2VudE9uU2FmYXJpLCBzID0gdC5pc0FNUCwgYyA9IEZlLmFtcERhdGEsIHUgPSAnJywgcCA9ICcnLCBsID0gJycsIGQgPSB7fSwgZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBlLm5vbklhYkNvb2tpZVZhbHVlLCBwID0gZS52ZW5kb3JDb29raWVWYWx1ZSwgbCA9IGUuZ29vZ2xlQ29va2llVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IHRoaXMuaXNTYWZhcmkgJiYgaSwgdGhpcy5fZmV0Y2hDb29raWVzQ2FsbGVkID0gITAsICFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmNvbnNlbnRNZXRhZGF0YSAmJiBjLmNvbnNlbnRNZXRhZGF0YS5jb25zZW50U3RyaW5nVHlwZSA9PT0gSWUuR0RQUiAmJiAocCA9IGMuY29uc2VudFN0cmluZywgYy5jb25zZW50TWV0YWRhdGEuYWRkaXRpb25hbENvbnNlbnQgJiYgKGwgPSBjLmNvbnNlbnRNZXRhZGF0YS5hZGRpdGlvbmFsQ29uc2VudCkpLCBlLm5leHQgPSA2NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTUsIHRoaXMuZ2V0RGF0YVVzaW5nQXBpKCEwLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBlLnNlbnQsIGYoZCksIGUubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPT0geS5TRVJWSUNFICYmICF0aGlzLmlzU2FmYXJpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gdGhpcy5nZXREYXRhVXNpbmdGaXJzdFBhcnR5KCksIGYoZCksIGUubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPT0geS5HTE9CQUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAzMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAyNywgdGhpcy5nZXREYXRhVXNpbmdBcGkoITAsICdodHRwczovL2FwaXMucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvQ29va2llQWNjZXNzVjInLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZS5zZW50LCBwID0gZC52ZW5kb3JDb29raWVWYWx1ZSwgZCA9IHRoaXMuZ2V0RGF0YVVzaW5nRmlyc3RQYXJ0eSghMCksIHUgPSBkLm5vbklhYkNvb2tpZVZhbHVlLCBlLm5leHQgPSA2NzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT09IHkuR0xPQkFMX0dST1VQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2FwaScgIT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA0NTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAzNywgdGhpcy5nZXREYXRhVXNpbmdBcGkoITAsICdodHRwczovL2FwaXMucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvQ29va2llQWNjZXNzVjInLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA9IGUuc2VudCwgcCA9IGQudmVuZG9yQ29va2llVmFsdWUsIGUubmV4dCA9IDQxLCB0aGlzLmdldERhdGFVc2luZ0FwaSghMCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZS5zZW50LCB1ID0gZC5ub25JYWJDb29raWVWYWx1ZSwgZS5uZXh0ID0gNTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA0NywgdGhpcy5nZXREYXRhVXNpbmdBcGkoITAsICdodHRwczovL2FwaXMucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvQ29va2llQWNjZXNzVjInLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA9IGUuc2VudCwgcCA9IGQudmVuZG9yQ29va2llVmFsdWUsIGUubmV4dCA9IDUxLCB0aGlzLmdldERhdGFVc2luZ0lmcmFtZSghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZS5zZW50LCB1ID0gZC5ub25JYWJDb29raWVWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDY3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPT0geS5TRVJWSUNFX0dST1VQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2FwaScgIT09IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA2MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA1OSwgdGhpcy5nZXREYXRhVXNpbmdBcGkoITAsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGUuc2VudCwgZihkKSwgZS5uZXh0ID0gNjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA2NSwgdGhpcy5nZXREYXRhVXNpbmdJZnJhbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBlLnNlbnQsIGYoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb29raWVWYWx1ZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXVjb25zZW50OiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvckNvbnNlbnQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlQ29va2llVmFsdWU6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogdGhpcy5fY29va2llVmFsdWVzLnByb21pc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucmVzb2x2ZUNvb2tpZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0RGF0YVVzaW5nQXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgaSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAyLCBaKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdnZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA9IGUuc2VudCwgaSA9IHt9LCByID8gaS52ZW5kb3JDb29raWVWYWx1ZSA9IG8uZGF0YVtPXSA6IChzID0gby5kYXRhW3hdLCBZZS5zdG9yZWRIYXNoID0gcywgaS52ZW5kb3JDb29raWVWYWx1ZSA9IG8uZGF0YVtPXSwgaS5ub25JYWJDb29raWVWYWx1ZSA9IG8uZGF0YVtUXSwgaS5nb29nbGVDb29raWVWYWx1ZSA9IG8uZGF0YS5hZGR0bF9jb25zZW50KSwgZS5hYnJ1cHQoJ3JldHVybicsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0RGF0YVVzaW5nSWZyYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgaSwgcywgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gRmUuY29yZUNvbmZpZy5nb29nbGVFbmFibGVkLCByID0gRmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybCwgbyA9IHt9LCBlLm5leHQgPSA0LCBzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoJ2dldCcsIHgsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPSBlLnNlbnQsIFllLnN0b3JlZEhhc2ggPSBpLCAhdCB8fCAhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDksIHN0LnRyeUdyb3VwQ29va2llQWNjZXNzQ2FsbCgnZ2V0JywgVCwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm5vbklhYkNvb2tpZVZhbHVlID0gZS5zZW50LCBlLm5leHQgPSAyNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDE0LCBzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoJ2dldCcsIE8sICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLnZlbmRvckNvb2tpZVZhbHVlID0gZS5zZW50LCAhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDIxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDE4LCBzdC50cnlHcm91cENvb2tpZUFjY2Vzc0NhbGwoJ2dldCcsIFQsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzID0gZS5zZW50KSAmJiBBcnJheS5pc0FycmF5KHMpID8gcyA9IHNbMF0gOiBzIHx8IChzID0gbnVsbCksIG8ubm9uSWFiQ29va2llVmFsdWUgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMjQsIHN0LnRyeUdyb3VwQ29va2llQWNjZXNzQ2FsbCgnZ2V0JywgVSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPSBlLnNlbnQpICYmIEFycmF5LmlzQXJyYXkoYykgPyBjID0gY1swXSA6IGMgfHwgKGMgPSBudWxsKSwgby5nb29nbGVDb29raWVWYWx1ZSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnJ1cHQoJ3JldHVybicsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldERhdGFVc2luZ0ZpcnN0UGFydHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBuID0gRmUuY29yZUNvbmZpZy5nb29nbGVFbmFibGVkLCByID0gRmUucHJlbWl1bVByb3BlcnRpZXMubm9uSWFiVmVuZG9yTGlzdFVybCwgbyA9IEdlLmdldChPKSwgaSA9IEdlLmdldCh4KSwgcyA9IEdlLmdldChUKSwgYSA9IEdlLmdldChVKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFllLnN0b3JlZEhhc2ggPSBpLCBlIHx8ICgnc3RyaW5nJyA9PT0gdHlwZW9mIG8gJiYgKHQudmVuZG9yQ29va2llVmFsdWUgPSBvKSwgbiAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGEgJiYgKHQuZ29vZ2xlQ29va2llVmFsdWUgPSBhKSksIHIgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBzICYmICh0Lm5vbklhYkNvb2tpZVZhbHVlID0gcyksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXByb21wdER1ZVRvSW52YWxpZENNUElEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBvLCBpLCBzLCBjLCB1LCBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBGZS5jb3JlQ29uZmlnLmlzQU1QLCBuID0gITEsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAyNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gJ2h0dHBzOi8vdGVzdC5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9HVkwtdjIvY21wLWxpc3QuanNvbicsIG8gPSBbXSwgaSA9IG5ldyBEYXRlKCksIHMgPSBHZS5nZXQoayksICEoKGMgPSBzICYmICFzLm1lc3NhZ2UgPyBKU09OLnBhcnNlKHMpIDogbnVsbCkgJiYgYy5DTVAgJiYgYy5DTVAuaW5jbHVkZXMoU3RyaW5nKFdlLmNtcElkKSkgJiYgaS5nZXRUaW1lKCkgPCBjLmV4cGlyeSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMSwgZS5uZXh0ID0gMjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXYgPSAxMiwgZS5uZXh0ID0gMTUsIFouZ2V0KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGUuc2VudCwgby5wdXNoLmFwcGx5KG8sIFZlKE9iamVjdC5rZXlzKHUuZGF0YS5jbXBzKSkpLCBwID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiB1LmRhdGEubGFzdFVwZGF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01QOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyeTogaS5nZXRUaW1lKCkgKyAyNTkyMDAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEdlLnNldChrLCBKU09OLnN0cmluZ2lmeShwKSksIGUubmV4dCA9IDI0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXYgPSAyMSwgZS50MCA9IGUuY2F0Y2goMTIpLCBjb25zb2xlLmxvZyhlLnQwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhby5pbmNsdWRlcyhTdHJpbmcoV2UuY21wSWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdCgncmV0dXJuJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIG51bGwsIFtbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncmVwcm9tcHREdWVUb091dGRhdGVkR3ZsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBvLCBpLCBzLCBjLCB1LCBwLCBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBGZS5jb3JlQ29uZmlnLnZlbmRvckxpc3RVcGRhdGVGcmVxLCB0aGlzLl9jb29raWVWYWx1ZXMuZmV0Y2hlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gNCwgdGhpcy5fY29va2llVmFsdWVzLnByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0geWUoemUuZGVjb2RlLCB0aGlzLl9jb29raWVWYWx1ZXMuZXVjb25zZW50KSwgciA9ICExLCAhbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPSBuLnZlbmRvckxpc3RWZXJzaW9uLCBpID0gbi5wb2xpY3lWZXJzaW9uLCBzID0gbi5sYXN0VXBkYXRlZCwgYyA9IERhdGUubm93KCkgLSBzLmdldFRpbWUoKSA+IDg2NDAwMDAwICogdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0ZWRHdmxSZXByb21wdDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRXVDb25zZW50OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAxMywgdGhpcy5sb2FkR1ZMKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gV2UuZ3ZsLCBwID0gdS52ZW5kb3JMaXN0VmVyc2lvbiwgbCA9IHUudGNmUG9saWN5VmVyc2lvbiwgYyAmJiAocCA+IG8gfHwgbCA+IGkpICYmIChyID0gITApLCBlLm5leHQgPSAxODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0ZWRHdmxSZXByb21wdDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRXVDb25zZW50OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3JlcHJvbXB0RHVlVG9Db25zZW50T25EZWxldGVkVmVuZG9ycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gITEsIHIgPSBUZSh0aGlzLl9kZWxldGVkVmVuZG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIucygpOyAhKHQgPSByLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZldGNoRGF0YVRvUmVwcm9tcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShhLmEubWFyayhmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIsIG8sIHMsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMiwgdGhpcy5yZXByb21wdER1ZVRvT3V0ZGF0ZWRHdmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBlLnNlbnQsIG4gPSB0Lm91dGRhdGVkR3ZsUmVwcm9tcHQsIHIgPSB0LmRlY29kZWRFdUNvbnNlbnQsIGUubmV4dCA9IDcsIHRoaXMucmVwcm9tcHREdWVUb0ludmFsaWRDTVBJRCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA9IGUuc2VudCwgcyA9IEZlLmNvcmVDb25maWcuY29uc2VudFNjb3BlLCAoYyA9IG4gfHwgbykgfHwgKGMgPSB0aGlzLnJlcHJvbXB0RHVlVG9Db25zZW50T25EZWxldGVkVmVuZG9ycyhyLnZlbmRvckNvbnNlbnRzLnNldF8pKSB8fCAnZ2xvYmFsJyA9PT0gcyB8fCAoWWUuc2V0VmFsdWVzKGkoaSh7fSwgdGhpcy5fY29va2llVmFsdWVzKSwge30sIHsgbm9uSWFiVmVuZG9yc0hhc2g6IEhlLmRhdGEuZGF0YS5ub25JYWJWZW5kb3JzSGFzaCB9KSksIGMgPSBZZS5zaG91bGRSZXByb21wdCgpKSwgZS5hYnJ1cHQoJ3JldHVybicsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncG9wdWxhdGVDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBpID0gbWUuTk9OX0lBQiwgcyA9IG1lLlBVUlBPU0VTLCBhID0gbWUuTEVHSVRJTUFURV9QVVJQT1NFUywgYyA9IG1lLkxFR0lUSU1BVEVfVkVORE9SUywgdSA9IG1lLlZFTkRPUlMsIHAgPSBtZS5TUEVDSUFMX0ZFQVRVUkVTLCBsID0gbWUuR09PR0xFLCBkID0gJycsIGYgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnbm9uSWFiQ29uc2VudHMnLCBkID0gJ3ZlbmRvckNvbnNlbnRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gJ3ZlbmRvckNvbnNlbnRzJywgZCA9ICd2ZW5kb3JDb25zZW50cycsIGYgPSAncHVibGlzaGVyQ29uc2VudHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAncHVycG9zZXNDb25zZW50cycsIGQgPSAncHVycG9zZUNvbnNlbnRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gJ2xlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzJywgZCA9ICdwdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICd2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QnLCBkID0gJ3ZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMnLCBmID0gJ3B1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnc3BlY2lhbEZlYXR1cmVzJywgZCA9ICdzcGVjaWFsRmVhdHVyZU9wdGlucyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICdnb29nbGVDb25zZW50cycsIGQgPSAnY29uc2VudElkcyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IG51bGwgIT09IHIgJiYgIXIubWVzc2FnZSwgeSA9IEZlLmNvcmVDb25maWcucHVibGlzaGVyTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbb10uaGFzQ29va2llID0gaCwgaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2LCBnID0gVGUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGcucygpOyAhKHYgPSBnLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHYudmFsdWUsIGIgPSByW2RdW20uaWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbb11bbS5pZF0gPSBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmUodyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQywgXyA9IFRlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfLnMoKTsgIShDID0gXy5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEUgPSBDLnZhbHVlLCBTID0gcGFyc2VJbnQoRS5pZCwgMTApLCBJID0gcltkXS5pbmNsdWRlcyhTKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW29dW1NdID0gSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5lKHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIEwgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUCA9IEwgPT09IHkgJiYgZiA/IFZlKHJbZl0uc2V0XykubGVuZ3RoID4gMCA6IHJbZF0uaGFzKHBhcnNlSW50KEwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtvXVtMXSA9IFA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZm9ybWF0Q29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDAsIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHBhcnNlSW50KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOYU4obykgfHwgKG8gPiB0ICYmICh0ID0gbyksIG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudDogZVtyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50QXJyYXk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWZW5kb3JJZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZm9ybWF0R29vZ2xlQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUuZ29vZ2xlQ29uc2VudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gZS5nb29nbGVDb25zZW50c1tuXSAmJiB0LnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNvcnQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIC0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZWd1bGF0aW9uVG9Jbml0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBGZS5jb3JlQ29uZmlnLnByaXZhY3lNb2RlLCBuID0gJycsICF0LmluY2x1ZGVzKCdVU1AnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPSBGZS5jb3JlQ29uZmlnLnVzcEp1cmlzZGljdGlvbiwgIU5lLmlzVXNlckluVVMgfHwgIXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWCgnaW5pdFVzcExvY2F0aW9uOiBVUycpLCByLmluY2x1ZGVzKCdVUycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gOSwgTmUuY2hlY2tTcGVjaWZpY0xvY2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgoJ2luaXRVc3BMb2NhdGlvbjogc3BlY2lmaWMgbG9jYXRpb24nICsgSlNPTi5zdHJpbmdpZnkoTmUudXNlclNwZWNpZmljTG9jYXRpb24pKSwgTmUudXNlclNwZWNpZmljTG9jYXRpb24gJiYgTmUudXNlclNwZWNpZmljTG9jYXRpb24ucmVnaW9uICYmIHIuaW5jbHVkZXMoTmUudXNlclNwZWNpZmljTG9jYXRpb24ucmVnaW9uLnRvVXBwZXJDYXNlKCkpICYmIChuID0gJ1VTUCcpLCBlLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICdVU1AnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5jbHVkZXMoJ0dEUFInKSAmJiAnVVNQJyAhPT0gbiAmJiAobyA9IEZlLmNvcmVDb25maWcuZGlzcGxheVVpLCAoTmUuaXNVc2VySW5FVSAmJiAnaW5FVScgPT09IG8gfHwgJ2Fsd2F5cycgPT09IG8pICYmIChuID0gJ0dEUFInKSksIGUuYWJydXB0KCdyZXR1cm4nLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xvYWRHVkwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShhLmEubWFyayhmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIsIG8sIGksIHMsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IEZlLmNvcmVDb25maWcsIG4gPSB0LnByaXZhY3lNb2RlLCByID0gdC5sYW5nXywgbyA9IEZlLnByZW1pdW1Qcm9wZXJ0aWVzLCBpID0gby52ZW5kb3JXaGl0ZWxpc3QsIHMgPSBvLnZlbmRvckJsYWNrbGlzdCwgYyA9IG51bGwgPT09IHIgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci50b1VwcGVyQ2FzZSgpLCBXZS5ndmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXZS5ndmwgPSBuZXcgWS5HVkwoJ0xBVEVTVCcpLCBlLm5leHQgPSA2LCBXZS5ndmwucmVhZHlQcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4uaW5jbHVkZXMoJ0dEUFInKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDksIFdlLmd2bC5jaGFuZ2VMYW5ndWFnZShjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJHdmwoV2UuZ3ZsLCBpLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTQsIFdlLmd2bC5yZWFkeVByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnJ1cHQoJ3JldHVybicsIFdlLmd2bCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmaWx0ZXJHdmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUudmVuZG9ycywgbyA9IFtdLCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbZV0uZGVsZXRlZERhdGUgPyBpLnB1c2gocltlXS5pZCkgOiBvLnB1c2gocltlXS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmRlbGV0ZWRWZW5kb3JzID0gaSwgdC5sZW5ndGggJiYgKG8gPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uaW5jbHVkZXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbi5sZW5ndGggPyBlLm5hcnJvd1ZlbmRvcnNUbyhvLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFuLmluY2x1ZGVzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBlLm5hcnJvd1ZlbmRvcnNUbyhvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2hhc0Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5fY29va2llVmFsdWVzLmV1Y29uc2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldFB1Ymxpc2hlclJlc3RyaWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2UucHVibGlzaGVyUmVzdHJpY3Rpb25zLmFkZChlLmlkLCBlLnB1cnBvc2VSZXN0cmljdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkZWxldGVkVmVuZG9ycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxldGVkVmVuZG9ycyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb29raWVWYWx1ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29va2llVmFsdWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZmV0Y2hDb29raWVzQ2FsbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoQ29va2llc0NhbGxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgWmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHRoaXMsIGUpLCB0aGlzLl9kYXRhID0gdm9pZCAwLCB0aGlzLl9maWVsZHMgPSB2b2lkIDAsIHRoaXMuX2ZpZWxkcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcElkOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBWZXJzaW9uOiAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWZW5kb3JJZDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JDb25zZW50czogW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiVmVuZG9yTGlzdDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvcnNIYXNoOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maWVsZHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCksIFhlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCh0aGlzLCBlKSwgdGhpcy5fZGF0YSA9IHZvaWQgMCwgdGhpcy5jcmVhdGVkID0gdm9pZCAwLCB0aGlzLl9kYXRhID0gbmV3IFplKCksIHRoaXMuY3JlYXRlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2UuaWRdID0gZS5jb25zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEgPT09IHRoaXMuY3JlYXRlZCA/ICh0aGlzLmNyZWF0ZWQgPSAhMCwgdGhpcy5fZGF0YS5maWVsZHMgPSBpKGkoe30sIHRoaXMuX2RhdGEuZmllbGRzKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiBuZXcgRGF0ZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VmVuZG9ySWQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogdGhpcy5fZGF0YS5maWVsZHMgPSBpKGkoe30sIHRoaXMuX2RhdGEuZmllbGRzKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZWQ6IG5ldyBEYXRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEdlLmVuY29kZShpKHsgY29va2llTmFtZTogVCB9LCB0aGlzLl9kYXRhLmZpZWxkcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGVjb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlLmRlY29kZShULCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldENvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZSA/IEdlLnNldChULCBlKSA6IGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldENvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBHZS5nZXQoVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdzdHJpbmcnID09PSB0eXBlb2YgZSA/IHRoaXMuZGVjb2RlKGUpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZldGNoTGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGZS5wcmVtaXVtUHJvcGVydGllcy5ub25JYWJWZW5kb3JMaXN0VXJsIHx8IEZlLm5vbklhYlZlbmRvcnNJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdCgncmV0dXJuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnByZXYgPSAyLCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEZlLm5vbklhYlZlbmRvcnNJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGZS5ub25JYWJWZW5kb3JzSW5mby5ub25JYWJWZW5kb3JMaXN0ICYmIDAgIT09IEZlLm5vbklhYlZlbmRvcnNJbmZvLm5vbklhYlZlbmRvckxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdCgncmV0dXJuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBGZS5ub25JYWJWZW5kb3JzSW5mbywgZS5uZXh0ID0gMTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDExLCBaLmdldChGZS5wcmVtaXVtUHJvcGVydGllcy5ub25JYWJWZW5kb3JMaXN0VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLnNlbnQsIHQgPSBuLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gW10sIHQubm9uSWFiVmVuZG9yTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUudmVuZG9ySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeVVybDogISFlLnByaXZhY3lQb2xpY3lVcmwgJiYgZS5wcml2YWN5UG9saWN5VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogISFlLmRlc2NyaXB0aW9uICYmIGUuZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiAnbm9uSWFiUHVycG9zZUNvbnNlbnRJZHMnIGluIGUgJiYgZS5ub25JYWJQdXJwb3NlQ29uc2VudElkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnSW50UHVycG9zZXM6ICdub25JYWJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzJyBpbiBlICYmIGUubm9uSWFiUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX2RhdGEuZGF0YSA9IGkoaSh7fSwgdCksIHt9LCB7IG5vbklhYlZlbmRvckxpc3Q6IHIgfSksIGUubmV4dCA9IDIxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXYgPSAxOCwgZS50MCA9IGUuY2F0Y2goMiksIGNvbnNvbGUubG9nKCdlcnJvciBwcm9jZXNzaW5nIG5vbklhYlZlbmRvcnMnLCBlLnQwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcywgW1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2RhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgJGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCwgbiwgciwgbywgaSwgcywgYSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2UuZW5jb2RlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JDb25zZW50czogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VDb25zZW50czogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlT3B0aW5zOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0czogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQ29uc2VudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlckxlZ2l0aW1hdGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJQdXJwb3NlSWRzOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkczogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2RlY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZS5kZWNvZGUoTywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZXRDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PT0gdHlwZW9mIGUgPyBHZS5zZXQoTywgZSwgITEpIDogY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0Q29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEdlLmdldChPKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBlID8gdGhpcy5kZWNvZGUoZSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMuX3VzcFZlcnNpb24gPSB2b2lkIDAsIHRoaXMuX2Jhc2VTdHJpbmcgPSB2b2lkIDAsIHRoaXMuX25vdGljZWdpdmVuID0gdm9pZCAwLCB0aGlzLl9vcHRlZG91dCA9IHZvaWQgMCwgdGhpcy5fbHNwYWN0ID0gdm9pZCAwLCB0aGlzLl91c3BWZXJzaW9uID0gMSwgdGhpcy5fbm90aWNlZ2l2ZW4gPSAnLScsIHRoaXMuX29wdGVkb3V0ID0gJy0nLCB0aGlzLl9sc3BhY3QgPSAnLScsIHRoaXMuX2Jhc2VTdHJpbmcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdiYXNlU3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Jhc2VTdHJpbmcgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbm90aWNlZ2l2ZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWNlZ2l2ZW4gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ub3RpY2VnaXZlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ29wdGVkb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGVkb3V0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3B0ZWRvdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsc3BhY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbHNwYWN0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbHNwYWN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXNwVmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91c3BWZXJzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCB0dCA9IC9eWzFdW25OeVktXVtuTnlZLV1bbk55WS1dJC8sIG50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCh0aGlzLCBlKSwgdGhpcy5fZGF0YSA9IHZvaWQgMCwgdGhpcy5fZGF0YSA9IG5ldyBldCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5iYXNlU3RyaW5nID0gJycuY29uY2F0KGUsICdZJykuY29uY2F0KHQgPyAnWScgOiAnTicpLmNvbmNhdChGZS5jb3JlQ29uZmlnLnVzcExzcGFjdCksIHRoaXMuX2RhdGEuYmFzZVN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldENvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZSA/IHR0LnRlc3QoZSkgJiYgR2Uuc2V0KFIsIGUsICExKSA6IGUgJiYgJ21lc3NhZ2UnIGluIGUgJiYgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0Q29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2UuZ2V0KFIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHRoaXMsIGUpLCB0aGlzLl9jb29raWVBY2Nlc3NJZnJhbWUgPSB2b2lkIDAsIHRoaXMuX2lzQ29va2llQWNjZXNzSWZyYW1lUmVhZHkgPSB2b2lkIDAsIHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3MgPSB2b2lkIDAsIHRoaXMuX2Nvb2tpZUFjY2Vzc0lmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpLCB0aGlzLl9pc0Nvb2tpZUFjY2Vzc0lmcmFtZVJlYWR5ID0gITEsIHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3MgPSB7fSwgdGhpcy5ncm91cENvb2tpZUFjY2Vzc0hhbmRsZXIgPSB0aGlzLmdyb3VwQ29va2llQWNjZXNzSGFuZGxlci5iaW5kKHRoaXMpLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciA/IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5ncm91cENvb2tpZUFjY2Vzc0hhbmRsZXIsICExKSA6IHdpbmRvdy5hdHRhY2hFdmVudCgnb25tZXNzYWdlJywgdGhpcy5ncm91cENvb2tpZUFjY2Vzc0hhbmRsZXIpLCB0aGlzLmNyZWF0ZUdyb3VwQ29va2llQWNjZXNzSWZyYW1lKHQuY29yZUNvbmZpZy5jb25zZW50U2NvcGVHcm91cFVSTCwgJ19xY19jb29raWVfYWNjZXNzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3RyeUdyb3VwQ29va2llQWNjZXNzQ2FsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl9pc0Nvb2tpZUFjY2Vzc0lmcmFtZVJlYWR5ICYmIHIuX2Nvb2tpZUFjY2Vzc0lmcmFtZS5jb250ZW50V2luZG93ICYmIChjbGVhckludGVydmFsKGkpLCByLmdyb3VwQ29va2llQWNjZXNzQ2FsbChlLCB0LCBuLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdncm91cENvb2tpZUFjY2Vzc0NhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKSwgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19xY0NtcENvb2tpZUFjY2Vzc0NhbGw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzZXQnID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3VwQ29va2llQWNjZXNzQ2FsbGJhY2tzW29dID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llVmFsdWU6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyAzMzY5NjAwMDAwMCkudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuX19xY0NtcENvb2tpZUFjY2Vzc0NhbGwuY29va2llVmFsdWUgPSBuLCBpLl9fcWNDbXBDb29raWVBY2Nlc3NDYWxsLmNvb2tpZVBhdGggPSBGZS5jb3JlQ29uZmlnLmNvb2tpZVBhdGgsIGkuX19xY0NtcENvb2tpZUFjY2Vzc0NhbGwuZXhwaXJlcyA9IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm91cENvb2tpZUFjY2Vzc0NhbGxiYWNrc1tvXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nvb2tpZUFjY2Vzc0lmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKGksICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjcmVhdGVHcm91cENvb2tpZUFjY2Vzc0lmcmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5fY29va2llQWNjZXNzSWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNyYyA9IGUsIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJywgbi5pZCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSA/IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobikgOiBzZXRUaW1lb3V0KGUsIDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdncm91cENvb2tpZUFjY2Vzc0hhbmRsZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID0gJ3N0cmluZycgPT09IHR5cGVvZiBlLmRhdGEgPyAtMSAhPT0gZS5kYXRhLmluZGV4T2YoJ19fcWNDbXBDb29raWVBY2Nlc3NSZXR1cm4nKSA/IEpTT04ucGFyc2UoZS5kYXRhKSA6IHt9IDogZS5kYXRhKS5fX3FjQ21wQ29va2llQWNjZXNzUmV0dXJuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5fX3FjQ21wQ29va2llQWNjZXNzUmV0dXJuLmlzSGFuZGxlclJlZ2lzdGVyZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKHRoaXMuX2lzQ29va2llQWNjZXNzSWZyYW1lUmVhZHkgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuX19xY0NtcENvb2tpZUFjY2Vzc1JldHVybiwgciA9IHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3NbdC5jYWxsSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIucmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0JyA9PT0gbi5jbWQgJiYgKG8gPSAtMSAhPT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXVjb25zZW50LXYyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZHRsX2NvbnNlbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKHIuY29va2llTmFtZSkgPyAnZXVjb25zZW50LXYyJyA9PT0gci5jb29raWVOYW1lID8gdGhpcy5yZXR1cm5MYXRlc3RWZW5kb3JDb29raWUobi5jb29raWVzKSA6IG4uaXNTdWNjZXNzID8gbi5jb29raWVzWzBdIDogbnVsbCA6IG4uY29va2llcywgci5yZXNvbHZlKG8pKSwgZGVsZXRlIHRoaXMuZ3JvdXBDb29raWVBY2Nlc3NDYWxsYmFja3NbdC5jYWxsSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdyZXR1cm5MYXRlc3RWZW5kb3JDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLmxlbmd0aCA/IEN0KGUpIDogbmV3IEVycm9yKCdldWNvbnNlbnQtdjIgbm90IGZvdW5kLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnaXNDb29raWVBY2Nlc3NJZnJhbWVSZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzQ29va2llQWNjZXNzSWZyYW1lUmVhZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjb29raWVBY2Nlc3NJZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29va2llQWNjZXNzSWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBvdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMudmVyc2lvbiA9IHZvaWQgMCwgdGhpcy5fZGF0YSA9IHZvaWQgMCwgdGhpcy53aGl0ZWxpc3QgPSB2b2lkIDAsIHRoaXMudmVyc2lvbiA9IDEsIHRoaXMuX2RhdGEgPSBbXSwgdGhpcy53aGl0ZWxpc3QgPSBGZS5wcmVtaXVtUHJvcGVydGllcy5nb29nbGVXaGl0ZWxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2VuY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZS5lbmNvZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llTmFtZTogVSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGVjb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlLmRlY29kZShVLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldENvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZSA/IEdlLnNldChVLCBlLCAhMSkgOiBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEdlLmdldChVKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ3N0cmluZycgPT09IHR5cGVvZiB0ID8gZSA/IHQgOiB0aGlzLmRlY29kZSh0KSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmZXRjaFBhcnRuZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBvLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZlLmNvcmVDb25maWcuZ29vZ2xlRW5hYmxlZCAmJiAhRmUuY29yZUNvbmZpZy5jb25zZW50U2NvcGUuaW5jbHVkZXMoJ2dsb2JhbCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdCgncmV0dXJuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByZXYgPSAyLCAnaHR0cHM6Ly9xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy90Y2Z2Mi9nb29nbGUtYXRwLWxpc3QuanNvbicsIGUubmV4dCA9IDYsIFouZ2V0KCdodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyL2dvb2dsZS1hdHAtbGlzdC5qc29uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID0gZS5zZW50LCBuID0gW10sIEpTT04uc3RyaW5naWZ5KHRoaXMud2hpdGVsaXN0KSA9PT0gSlNPTi5zdHJpbmdpZnkoWy0xXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociBpbiB0LmRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgKG8gPSB0LmRhdGFbcl0pLnByb3ZpZGVyX2lkICYmICcnICE9PSBvLnByb3ZpZGVyX2lkICYmIChKU09OLnN0cmluZ2lmeSh0aGlzLndoaXRlbGlzdCkgPT09IEpTT04uc3RyaW5naWZ5KFsxXSkgfHwgdGhpcy53aGl0ZWxpc3QubGVuZ3RoID4gMCAmJiB0aGlzLndoaXRlbGlzdC5pbmNsdWRlcyhwYXJzZUludChvLnByb3ZpZGVyX2lkKSkpICYmIChpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogby5wcm92aWRlcl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG8ucHJvdmlkZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lVcmw6IG8ucG9saWN5X3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBvLmRvbWFpbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5wdXNoKGkpKSwgdGhpcy5fZGF0YSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ID0gMTEsIGUudDAgPSBlLmNhdGNoKDIpLCBjb25zb2xlLmxvZyhlLnQwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcywgW1sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2RhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIFkuR1ZMLmJhc2VVcmwgPSAnaHR0cHM6Ly9xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9HVkwtdjIvJzsKICAgICAgICAgICAgICAgIHZhciBpdCwgc3QsIGF0ID0gbmV3IEsoKSwgY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShhLmEubWFyayhmdW5jdGlvbiBlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBvLCBpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSAoRmUgPSB0KS5jb3JlQ29uZmlnLCByID0gbi5jb25zZW50U2NvcGUsIG8gPSBuLnByaXZhY3lNb2RlLCBpID0gbi5wdWJsaXNoZXJDb3VudHJ5Q29kZSwgcyA9IG4uc2hvd1N1bW1hcnlWaWV3LCAnJywgaXQgPSAnJywgQmUgPSBuZXcgUWUoKSwgTmUgPSBuZXcgJCgnaW5VUycpLCBqZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSAnJywgZS5wcmV2ID0gMSwgZS5uZXh0ID0gNCwgQmUucmVndWxhdGlvblRvSW5pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VTUCcgPT09ICh0ID0gZS5zZW50KSB8fCBvLmluY2x1ZGVzKCdVU1AnKSA/IEl0LmluaXRVc3AoKSA6IChuID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRVU1BEYXRhJyA9PT0gZSAmJiAxID09PSB0ICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBuICYmIG4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNwU3RyaW5nOiAnMS0tLScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih3aW5kb3csIHsgX191c3BhcGk6IG4gfSkpLCBlLm5leHQgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXYgPSA4LCBlLnQwID0gZS5jYXRjaCgxKSwgY29uc29sZS5sb2coZS50MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIG51bGwsIFtbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgR2UgPSBuZXcgQWUoKSwgSGUgPSBuZXcgWGUoKSwgcWUgPSBuZXcgbnQoKSwgemUgPSBuZXcgJGUoKSwgS2UgPSBuZXcgb3QoKSwgWWUgPSBuZXcgUGUoKSwgV2UgPSBudWxsLCBKZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIG8sIHMsIGMsIHUsIHAgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBwLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBwWzBdICYmIHBbMF0sIG8gPSByLmluY2x1ZGVzKCdzZXJ2aWNlJyksICgocyA9ICdHRFBSJyA9PT0gaXQpIHx8IHQpICYmICgoV2UgPSBuZXcgVy5UQ01vZGVsKCkpLmNtcElkID0gMTAsIFdlLmNtcFZlcnNpb24gPSBBLCBXZS5wdWJsaXNoZXJDb3VudHJ5Q29kZSA9IGksIG8gJiYgKGMgPSBmZShGZSksIHUgPSBjLnB1cnBvc2VJZHMsIFdlLmlzU2VydmljZVNwZWNpZmljID0gITAsIHUuaW5jbHVkZXMoMSkgfHwgKCdERScgPT09IGkgPyBXZS5wdXJwb3NlT25lVHJlYXRtZW50ID0gITAgOiB1LnB1c2goMSkpKSksIGUucHJldiA9IDQsICFzICYmICF0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA4LCBCZS5mZXRjaENvb2tpZVZhbHVlcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDEwLCBIZS5mZXRjaExpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTIsIEtlLmZldGNoUGFydG5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTQsIEJlLmZldGNoRGF0YVRvUmVwcm9tcHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShuID0gZS5zZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gMTgsIEJlLmxvYWRHVkwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAyMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ID0gMjAsIGUudDAgPSBlLmNhdGNoKDQpLCBjb25zb2xlLmVycm9yKGUudDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFicnVwdCgncmV0dXJuJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCBudWxsLCBbWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBlLm5leHQgPSAxNywgamUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCA9IGUuc2VudCwgZS5uZXh0ID0gMjAsIEplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNlbnQgJiYgJ0dEUFInID09PSBpdCA/IGF0LmRpc3BsYXlVaSgnR0RQUicsIHMgPyAwIDogMSwgITApIDogQmUudXBkYXRlQXBpVmlzaWJsZShpdCwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpLCB1dCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGkoaShpKHt9LCBlLmNvcmVDb25maWcpLCBlLnByZW1pdW1Qcm9wZXJ0aWVzKSwgZS5jb3JlVWlMYWJlbHMpLCBlLnByZW1pdW1VaUxhYmVscyk7CiAgICAgICAgICAgICAgICAgICAgfSwgcHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihlLmdldFRpbWUoKSAvIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgfSwgbHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoMTAwICogZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5rZXlzKHQpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBlLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5sZW5ndGggJiYgKHQubm90Rm91bmQgPSBuKSwgdDsKICAgICAgICAgICAgICAgICAgICB9LCBmdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlICYmICdhbHdheXMnICE9PSB0KTsKICAgICAgICAgICAgICAgICAgICB9LCBodCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvcmVDb25maWcuY29uc2VudFNjb3BlID09PSB5LkdMT0JBTCB8fCBlLmNvcmVDb25maWcuY29uc2VudFNjb3BlID09PSB5LkdMT0JBTF9HUk9VUDsKICAgICAgICAgICAgICAgICAgICB9LCB5dCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQubGVuZ3RoID4gMCA/ICh0LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gZVt0XSA/IG5bdF0gPSBlW3RdIDogblt0XSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbikgOiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHZ0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTAwMCAqIGUubWF4QWdlKS50b1VUQ1N0cmluZygpLCBuID0gJ2h0dHBzOicgPT09IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA/ICc7U2FtZVNpdGU9TGF4O3NlY3VyZScgOiAnJywgciA9IEZlLmNvcmVDb25maWcuY29va2llUGF0aCB8fCAnLyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGUuY29va2llTmFtZSArICc9JyArIGUuZW5jb2RlZFZhbHVlICsgJztwYXRoPScgKyByICsgJzttYXgtYWdlPScgKyBlLm1heEFnZSArICc7ZXhwaXJlcz0nICsgdCArICc7ZG9tYWluPScgKyBGZS5jb3JlQ29uZmlnLmNvb2tpZURvbWFpbiArIG47CiAgICAgICAgICAgICAgICAgICAgfSwgZ3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UuVENTdHJpbmcuZW5jb2RlKGUpOwogICAgICAgICAgICAgICAgICAgIH0sIG10ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlLlRDU3RyaW5nLmRlY29kZShlKTsKICAgICAgICAgICAgICAgICAgICB9LCBidCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmaXJlZm94JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihlKSA+IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3NhZmFyaSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZSkgPiAtMSAmJiAtMSA9PT0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sIEN0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudWxsLCBuID0gbmV3IEVycm9yKCdldWNvbnNlbnQtdjIgbm90IHZhbGlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG10KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZXVjb25zZW50LXYyIGNvb2tpZTogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiByLmxhc3RVcGRhdGVkICYmIHIubGFzdFVwZGF0ZWQgPiB0ICYmICh0ID0gci5sYXN0VXBkYXRlZCwgbiA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICB9LCBfdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAodGhpcywgZSksIHRoaXMuY21wQXBpID0gdm9pZCAwLCB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB2b2lkIDAsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLk15Q3VzdG9tQ29tbWFuZHMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IHdpbmRvdy5fX3RjZmFwaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sZW5ndGggJiYgci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAnaW5pdCcgPT09IGVbMF0gJiYgKG4gPSBlWzNdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmlzSW5pdGlhbGl6ZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gJ3RoaXJkUGFydHlTdG9yYWdlVHlwZScgaW4gbi5jb3JlQ29uZmlnID8gbi5jb3JlQ29uZmlnLnRoaXJkUGFydHlTdG9yYWdlVHlwZSA6ICdpZnJhbWUnLCBpID0gJ2NvbnNlbnRTY29wZScgaW4gbi5jb3JlQ29uZmlnID8gbi5jb3JlQ29uZmlnLmNvbnNlbnRTY29wZSA6ICdzZXJ2aWNlJywgcyA9ICdjb25zZW50U2NvcGVHcm91cFVSTCcgaW4gbi5jb3JlQ29uZmlnID8gbi5jb3JlQ29uZmlnLmNvbnNlbnRTY29wZUdyb3VwVVJMIDogJycsIGMgPSBpLmluY2x1ZGVzKCdzZXJ2aWNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmluY2x1ZGVzKCdncm91cCcpICYmICdpZnJhbWUnID09PSBvICYmIHMgJiYgKHN0ID0gbmV3IHJ0KG4pKSwgdGhpcy5NeUN1c3RvbUNvbW1hbmRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZzogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmdldENvbmZpZyhuKSwgbyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIHIgJiYgKG8gPSAhMCksIGUociwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb25JQUJWZW5kb3JDb25zZW50czogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZShuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAyLCB0LmdldE5vbklBQlZlbmRvckNvbnNlbnRzKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gZS5zZW50LCBpID0gITEsICdvYmplY3QnID09PSB0eXBlb2YgbyAmJiAoaSA9ICEwKSwgbihvLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlDb25zZW50VWk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHQuZGlzcGxheUNvbnNlbnRVaSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnNlbnRJbmZvOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShCZS5zZXRDb25zZW50cyh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQdWJsaXNoZXJSZXN0cmljdGlvbjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoQmUuc2V0UHVibGlzaGVyUmVzdHJpY3Rpb24odCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5VWlTdGF0ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoQmUudXBkYXRlQXBpVmlzaWJsZSh0LnJlZ3VsYXRpb24sIHQudmlzaWJsZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdDogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodC5pbml0KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmFkZEdldFRDRGF0YVRvU3VwcG9ydEdvb2dsZShuLCBjKSwgdGhpcy5jbXBBcGkgPSBuZXcgZy5DbXBBcGkoMTAsIEEsIGMsIHRoaXMuTXlDdXN0b21Db21tYW5kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2FkZEdldFRDRGF0YVRvU3VwcG9ydEdvb2dsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ2dvb2dsZUVuYWJsZWQnIGluIGUuY29yZUNvbmZpZyAmJiBlLmNvcmVDb25maWcuZ29vZ2xlRW5hYmxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFCZS5mZXRjaENvb2tpZXNDYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQmUuY29va2llVmFsdWVzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gNSwgQmUuY29va2llVmFsdWVzLnByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gQmUuY29va2llVmFsdWVzLmdvb2dsZUNvb2tpZVZhbHVlLCBvID0gciA/IGhlKHIpIDogdm9pZCAwLCBuLmFkZHRsQ29uc2VudCA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09PSB0eXBlb2YgdCAmJiAoJ2Jvb2xlYW4nID09PSB0eXBlb2YgbiA/IHQobikgOiB0KG4sICEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NeUN1c3RvbUNvbW1hbmRzLmdldFRDRGF0YSA9IHIsIHRoaXMuTXlDdXN0b21Db21tYW5kcy5nZXRJbkFwcFRDRGF0YSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2Rpc3BsYXlDb25zZW50VWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0LmRpc3BsYXlVaSgnR0RQUicsIDEsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2luaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWQgPSAhMCwgdGhpcy5jb25maWcgfHwgKHRoaXMuY29uZmlnID0gbmV3IHooZSksIHRoaXMuY29uZmlnLmluaXRpYWxpemVDb25maWcoKSksIGN0KHRoaXMuY29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdpbml0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGFuZCBzaG91bGQgb25seSBiZSBydW4gb25lIHRpbWUuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRDb25maWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAnYWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhbGwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVDb25maWc6IHRoaXMuY29uZmlnLmNvcmVDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogdGhpcy5jb25maWcuY29yZVVpTGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtUHJvcGVydGllczogdGhpcy5jb25maWcucHJlbWl1bVByb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW1pdW1VaUxhYmVsczogdGhpcy5jb25maWcucHJlbWl1bVVpTGFiZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZTogdGhpcy5jb25maWcudGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvcnNJbmZvOiB0aGlzLmNvbmZpZy5ub25JYWJWZW5kb3JzSW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb3JlIENvbmZpZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmNvcmVDb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQcmVtaXVtIFByb3BlcnRpZXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVtaXVtUHJvcGVydGllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NvcmUgVUkgTGFiZWxzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuY29yZVVpTGFiZWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUHJlbWl1bSBVSSBMYWJlbHMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcmVtaXVtVWlMYWJlbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUaGVtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLnRoZW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm9uIElhYiBWZW5kb3JzIEluZm8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5ub25JYWJWZW5kb3JzSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB1dCh0aGlzLmNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignIicuY29uY2F0KGUsICciOiB3YXMgbm90IGZvdW5kIGluIGNvbmZpZ3MnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Nob3VsZCBydW4gaW5pdCBiZWZvcmUgcnVubmluZyBnZXRDb25maWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldENvbmZpZ0luc3RhbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXROb25JQUJWZW5kb3JDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIsIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiB0aGlzLmNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFCZS5mZXRjaENvb2tpZXNDYWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJlLmNvb2tpZVZhbHVlcy5mZXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA1LCBCZS5jb29raWVWYWx1ZXMucHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSB5ZShIZS5kZWNvZGUsIEJlLmNvb2tpZVZhbHVlcy5ub25JYWJWZW5kb3JDb25zZW50KSwgciA9IG51bGwsIG8gPSAnVVNQJyAhPT0gaXQgJiYgZnQoTmUuaXNVc2VySW5FVSwgdGhpcy5jb25maWcuY29yZUNvbmZpZy5kaXNwbGF5VWkpLCBuICYmIHQgPyByID0geXQobi52ZW5kb3JDb25zZW50cywgdCkgOiBuICYmIChyID0gaSh7fSwgbi52ZW5kb3JDb25zZW50cykpLCBlLmFicnVwdCgncmV0dXJuJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkcHJBcHBsaWVzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0dsb2JhbENvbnNlbnQ6IGh0KHRoaXMuY29uZmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNHbG9iYWxTY29wZTogaHQodGhpcy5jb25maWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiByID8gR2UuZW5jb2RlKGkoaSh7fSwgbiksIHt9LCB7IGNvb2tpZU5hbWU6ICdub25pYWJ2ZW5kb3Jjb25zZW50JyB9KSwgITApIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJWZW5kb3JDb25zZW50czogciB8fCBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb25maWcgd2FzIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgRXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKHRoaXMsIGUpLCB0aGlzLl9fdXNwYXBpID0gdm9pZCAwLCB0aGlzLl91c3BWZXJzaW9uID0gMSwgdGhpcy5pc1VzcEp1cmlzZGljdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBvLCBpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gITAsIG8gPSBGZS5jb3JlQ29uZmlnLCBpID0gby51c3BKdXJpc2RpY3Rpb24sIG8uaXNBTVApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uZXh0ID0gNSwgTmUuY2hlY2tTcGVjaWZpY0xvY2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocyA9IGUuc2VudCkgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBzLnJlZ2lvbiAmJiAocyA9IHMucmVnaW9uLnRvVXBwZXJDYXNlKCkpLCBpLmluY2x1ZGVzKHMpIHx8ICgnZnVuY3Rpb24nID09PSB0eXBlb2YgbiAmJiBuKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHQuX3VzcFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3BTdHJpbmc6ICcxLS0tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCksIHIgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnJ1cHQoJ3JldHVybicsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgdGhpcy5fX3VzcGFwaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDEsIHIgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHZvaWQgMCwgbyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzID8gYXJndW1lbnRzWzNdIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09PSB0Ll91c3BWZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gbyA/IHRbZV0ociwgbykgOiB0W2VdKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBmdW5jdGlvbiAnLmNvbmNhdChlLCAnIGlzIG5vdCBkZWZpbmVkJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2b2lkIDAgPT09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgZnVuY3Rpb24gJy5jb25jYXQoZSwgJyBpcyBtaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIHRoaXJkIHBhcmFtZXRlciBzaG91bGQgYmUgYSBjYWxsYmFjayBmb3IgdGhlICcuY29uY2F0KGUsICcgZnVuY3Rpb24nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ3RoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgdXNwVmVyc2lvbiAxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdpbml0VXNwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIHQgPSB0aGlzLl9fdXNwYXBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZS5jb3JlQ29uZmlnLmlzQU1QICYmIHRoaXMuZ2V0VVNQRGF0YShmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB8fCBlLnNldFVzcERmdERhdGEoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gITAsIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNlLkNPTlNFTlRfUkVTUE9OU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogTGUuQUNDRVBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBlLnVzcFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudE1ldGFkYXRhOiB7IGNvbnNlbnRTdHJpbmdUeXBlOiBJZS5VU1AgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQgJiYgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShuLCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuYXNzaWduKHdpbmRvdywgeyBfX3VzcGFwaTogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3VzcFBpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShhLmEubWFyayhmdW5jdGlvbiBlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAzLCBOZS5jaGVja1NwZWNpZmljTG9jYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSBlLnNlbnQpICYmICdvYmplY3QnID09PSB0eXBlb2YgbiAmJiAobiA9IG4ucmVnaW9uKSwgdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogRmUuY29yZUNvbmZpZy5wcml2YWN5TW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXJpc2RpY3Rpb246IEZlLmNvcmVDb25maWcudXNwSnVyaXNkaWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcExvYWRlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSwgZS5uZXh0ID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgbWlzc2luZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2V0VXNwRGZ0RGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIsIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gRmUuY29yZUNvbmZpZy5pc0FNUCA/IG51bGwgOiBxZS5nZXRDb29raWUoKSwgZS5uZXh0ID0gNCwgdGhpcy5pc1VzcEp1cmlzZGljdGlvbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hYnJ1cHQoJ3JldHVybicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIG4gPyAociA9IHFlLmVuY29kZSh0aGlzLl91c3BWZXJzaW9uLCAhMSksIEZlLmNvcmVDb25maWcuaXNBTVAgfHwgcWUuc2V0Q29va2llKHIpLCB0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLl91c3BWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzcFN0cmluZzogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApKSA6IChvID0gbi5zcGxpdCgnJylbMF0sIHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNwU3RyaW5nOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCkpLCBlLm5leHQgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIG1pc3NpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZXRVc3BEYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSBxZS5lbmNvZGUodGhpcy5fdXNwVmVyc2lvbiwgbiksIGUubmV4dCA9IDQsIHRoaXMuaXNVc3BKdXJpc2RpY3Rpb24odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgIT09IHR5cGVvZiByID8gdChudWxsLCAhMSkgOiAoRmUuY29yZUNvbmZpZy5pc0FNUCB8fCBxZS5zZXRDb29raWUociksIHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHRoaXMuX3VzcFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNwU3RyaW5nOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvTm90U2VsbDogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApKSwgZS5uZXh0ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBtaXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0VVNQRGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KGEuYS5tYXJrKGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gRmUuY29yZUNvbmZpZy5pc0FNUCA/IEZlLmFtcERhdGEuY29uc2VudE1ldGFkYXRhICYmIEZlLmFtcERhdGEuY29uc2VudE1ldGFkYXRhLmNvbnNlbnRTdHJpbmdUeXBlID09PSBJZS5VU1AgJiYgRmUuYW1wRGF0YS5jb25zZW50U3RyaW5nIDogcWUuZ2V0Q29va2llKCksIGUubmV4dCA9IDQsIHRoaXMuaXNVc3BKdXJpc2RpY3Rpb24odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWJydXB0KCdyZXR1cm4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiBuID8gKHIgPSBuLnNwbGl0KCcnKVswXSwgdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3BTdHJpbmc6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSkgOiB0KG51bGwsICExKSwgZS5uZXh0ID0gMTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBtaXNzaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZGlzcGxheVVzcFVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHUoYS5hLm1hcmsoZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5wcmV2ID0gZS5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gci5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gclsxXSA/IHJbMV0gOiAxLCBlLm5leHQgPSAzLCB0aGlzLmlzVXNwSnVyaXNkaWN0aW9uKHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUud2FybignY2Fubm90IGRpc3BsYXkgVVNQIFVJIG91dHNpZGUgb2YgY29uZmlndXJlZCBqdXJpc2RpY3Rpb24ocyknKSwgZS5hYnJ1cHQoJ3JldHVybicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSBuICYmIGF0LmRpc3BsYXlVaSgnVVNQJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCksIFN0ID0gbmV3IF90KCksIEl0ID0gbmV3IEV0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICAsCiAgICAgICAgICAgICwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbigxNjYpOwogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICB9KCkpCn0="},{"name":"sugarcoat-cmp2ui-en","aliases":["sugarcoat-cmp2ui-en"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMCA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIHQocikgewogICAgICAgICAgICAgICAgaWYgKG5bcl0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bcl0uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciBvID0gbltyXSA9IHsKICAgICAgICAgICAgICAgICAgICBpOiByLAogICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsIG8sIG8uZXhwb3J0cywgdCksIG8ubCA9ICEwLCBvLmV4cG9ydHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdC5tID0gZSwgdC5jID0gbiwgdC5kID0gZnVuY3Rpb24gKGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgIHQubyhlLCBuKSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgbiwgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogcgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIHQuciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICB9LCB0LnQgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgaWYgKDEgJiBuICYmIChlID0gdChlKSksIDggJiBuKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgaWYgKDQgJiBuICYmICdvYmplY3QnID09PSB0eXBlb2YgZSAmJiBlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgIGlmICh0LnIociksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnZGVmYXVsdCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlCiAgICAgICAgICAgICAgICAgICAgfSksIDIgJiBuICYmICdzdHJpbmcnICE9IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdC5kKHIsIG8sIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwsIG8pKTsKICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICB9LCB0Lm4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBlICYmIGUuX19lc01vZHVsZSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5kZWZhdWx0OwogICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gdC5kKG4sICdhJywgbiksIG47CiAgICAgICAgICAgIH0sIHQubyA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pOwogICAgICAgICAgICB9LCB0LnAgPSAnLycsIHQodC5zID0gMTkpOwogICAgICAgIH0oWwogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDYpLCBvID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBBcnJheV0nID09PSBvLmNhbGwoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEZ1bmN0aW9uXScgPT09IG8uY2FsbChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9PSB0eXBlb2YgZSAmJiAoZSA9IFtlXSksIGEoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgciA9IGUubGVuZ3RoOyB0IDwgcjsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY2FsbChudWxsLCBlW3RdLCB0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBvKSAmJiBuLmNhbGwobnVsbCwgZVtvXSwgbywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgaXNBcnJheTogYSwKICAgICAgICAgICAgICAgICAgICBpc0FycmF5QnVmZmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyA9PT0gby5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNCdWZmZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICFpKGUpICYmIG51bGwgIT09IGUuY29uc3RydWN0b3IgJiYgIWkoZS5jb25zdHJ1Y3RvcikgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXIgJiYgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzRm9ybURhdGE6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEZvcm1EYXRhICYmIGUgaW5zdGFuY2VvZiBGb3JtRGF0YTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzQXJyYXlCdWZmZXJWaWV3OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBBcnJheUJ1ZmZlciAmJiBBcnJheUJ1ZmZlci5pc1ZpZXcgPyBBcnJheUJ1ZmZlci5pc1ZpZXcoZSkgOiBlICYmIGUuYnVmZmVyICYmIGUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc1N0cmluZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzTnVtYmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgPT09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNPYmplY3Q6IHMsCiAgICAgICAgICAgICAgICAgICAgaXNVbmRlZmluZWQ6IGksCiAgICAgICAgICAgICAgICAgICAgaXNEYXRlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgRGF0ZV0nID09PSBvLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0ZpbGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBGaWxlXScgPT09IG8uY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGlzQmxvYjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEJsb2JdJyA9PT0gby5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbjogYywKICAgICAgICAgICAgICAgICAgICBpc1N0cmVhbTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSkgJiYgYyhlLnBpcGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNVUkxTZWFyY2hQYXJhbXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIFVSTFNlYXJjaFBhcmFtcyAmJiBlIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIG5hdmlnYXRvciB8fCAnUmVhY3ROYXRpdmUnICE9PSBuYXZpZ2F0b3IucHJvZHVjdCAmJiAnTmF0aXZlU2NyaXB0JyAhPT0gbmF2aWdhdG9yLnByb2R1Y3QgJiYgJ05TJyAhPT0gbmF2aWdhdG9yLnByb2R1Y3QpICYmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdyAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGRvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvckVhY2g6IGwsCiAgICAgICAgICAgICAgICAgICAgbWVyZ2U6IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHR5cGVvZiBuW3JdICYmICdvYmplY3QnID09PSB0eXBlb2YgdCA/IG5bcl0gPSBlKG5bcl0sIHQpIDogbltyXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG8gPSBhcmd1bWVudHMubGVuZ3RoOyByIDwgbzsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbChhcmd1bWVudHNbcl0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlZXBNZXJnZTogZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PT0gdHlwZW9mIG5bcl0gJiYgJ29iamVjdCcgPT09IHR5cGVvZiB0ID8gbltyXSA9IGUobltyXSwgdCkgOiBuW3JdID0gJ29iamVjdCcgPT09IHR5cGVvZiB0ID8gZSh7fSwgdCkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwLCBvID0gYXJndW1lbnRzLmxlbmd0aDsgciA8IG87IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoYXJndW1lbnRzW3JdLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBleHRlbmQ6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKG4sIGZ1bmN0aW9uIChuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW29dID0gdCAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgbiA/IHIobiwgdCkgOiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyaW06IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL15ccyovLCAnJykucmVwbGFjZSgvXHMqJC8sICcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCgyMCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDIzKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIChyID0gbi5SZXN0cmljdGlvblR5cGUgfHwgKG4uUmVzdHJpY3Rpb25UeXBlID0ge30pKVtyLk5PVF9BTExPV0VEID0gMF0gPSAnTk9UX0FMTE9XRUQnLCByW3IuUkVRVUlSRV9DT05TRU5UID0gMV0gPSAnUkVRVUlSRV9DT05TRU5UJywgcltyLlJFUVVJUkVfTEkgPSAyXSA9ICdSRVFVSVJFX0xJJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgyMSksIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkQ29udGV4dFR5cGVzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dFR5cGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0VHlwZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0UHJvcHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRQcm9wczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BUeXBlczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvdHlwZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyaXR5OiAhMAogICAgICAgICAgICAgICAgICAgIH0sIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQkdHlwZW9mOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFR5cGVzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogITAKICAgICAgICAgICAgICAgICAgICB9LCBzID0ge307CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pc01lbW8oZSkgPyBpIDogc1tlLiQkdHlwZW9mXSB8fCBvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc1tyLkZvcndhcmRSZWZdID0gewogICAgICAgICAgICAgICAgICAgICQkdHlwZW9mOiAhMCwKICAgICAgICAgICAgICAgICAgICByZW5kZXI6ICEwLAogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRQcm9wczogITAsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICEwLAogICAgICAgICAgICAgICAgICAgIHByb3BUeXBlczogITAKICAgICAgICAgICAgICAgIH0sIHNbci5NZW1vXSA9IGk7CiAgICAgICAgICAgICAgICB2YXIgbCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSwgdSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGYgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIG0gPSBPYmplY3QucHJvdG90eXBlOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gZShuLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBmKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiBvICE9PSBtICYmIGUobiwgbywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB1KHQpOwogICAgICAgICAgICAgICAgICAgICAgICBwICYmIChpID0gaS5jb25jYXQocCh0KSkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gYyhuKSwgaCA9IGModCksIGcgPSAwOyBnIDwgaS5sZW5ndGg7ICsrZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBpW2ddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhW3ldICYmICghciB8fCAhclt5XSkgJiYgKCFoIHx8ICFoW3ldKSAmJiAoIXMgfHwgIXNbeV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBkKHQsIHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwobiwgeSwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmV4cG9ydHMgPSB0ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMTsgbiA8IGFyZ3VtZW50cy5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIHIpICYmIChlW3JdID0gdFtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSwgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtyXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyU0MC9naSwgJ0AnKS5yZXBsYWNlKC8lM0EvZ2ksICc6JykucmVwbGFjZSgvJTI0L2csICckJykucmVwbGFjZSgvJTJDL2dpLCAnLCcpLnJlcGxhY2UoLyUyMC9nLCAnKycpLnJlcGxhY2UoLyU1Qi9naSwgJ1snKS5yZXBsYWNlKC8lNUQvZ2ksICddJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0KG4pOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIuaXNVUkxTZWFyY2hQYXJhbXMobikpCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBuLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaChuLCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZSAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGUgJiYgKHIuaXNBcnJheShlKSA/IG4gKz0gJ1tdJyA6IGUgPSBbZV0sIHIuZm9yRWFjaChlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNEYXRlKGUpID8gZSA9IGUudG9JU09TdHJpbmcoKSA6IHIuaXNPYmplY3QoZSkgJiYgKGUgPSBKU09OLnN0cmluZ2lmeShlKSksIGkucHVzaChvKG4pICsgJz0nICsgbyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhID0gaS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5pbmRleE9mKCcjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC0xICE9PSBzICYmIChlID0gZS5zbGljZSgwLCBzKSksIGUgKz0gKC0xID09PSBlLmluZGV4T2YoJz8nKSA/ICc/JyA6ICcmJykgKyBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlIHx8ICFlLl9fQ0FOQ0VMX18pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gdCgwKSwgbyA9IHQoMjkpLCBhID0geyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcgfTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIXIuaXNVbmRlZmluZWQoZSkgJiYgci5pc1VuZGVmaW5lZChlWydDb250ZW50LVR5cGUnXSkgJiYgKGVbJ0NvbnRlbnQtVHlwZSddID0gbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBzID0gewogICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2JhOTAzZWEwNDQ3MmI4MTggPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYmE5MDNlYTA0NDcyYjgxOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgWE1MSHR0cFJlcXVlc3QgfHwgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBuICYmICdbb2JqZWN0IHByb2Nlc3NdJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pKSAmJiAoZSA9IHQoMTApKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JhOTAzZWEwNDQ3MmI4MTgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfYmE5MDNlYTA0NDcyYjgxOCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IFtmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKG4sICdBY2NlcHQnKSwgbyhuLCAnQ29udGVudC1UeXBlJyksIHIuaXNGb3JtRGF0YShlKSB8fCByLmlzQXJyYXlCdWZmZXIoZSkgfHwgci5pc0J1ZmZlcihlKSB8fCByLmlzU3RyZWFtKGUpIHx8IHIuaXNGaWxlKGUpIHx8IHIuaXNCbG9iKGUpID8gZSA6IHIuaXNBcnJheUJ1ZmZlclZpZXcoZSkgPyBlLmJ1ZmZlciA6IHIuaXNVUkxTZWFyY2hQYXJhbXMoZSkgPyAoaShuLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgnKSwgZS50b1N0cmluZygpKSA6IHIuaXNPYmplY3QoZSkgPyAoaShuLCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04JyksIEpTT04uc3RyaW5naWZ5KGUpKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IFtmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJywKICAgICAgICAgICAgICAgICAgICAgICAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhDb250ZW50TGVuZ3RoOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdGF0dXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA+PSAyMDAgJiYgZSA8IDMwMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyBjb21tb246IHsgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJyB9IH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWQnCiAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWFkZXJzW2VdID0ge307CiAgICAgICAgICAgICAgICAgICAgfSksIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgICAgICdwb3N0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3B1dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwYXRjaCcKICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzLmhlYWRlcnNbZV0gPSByLm1lcmdlKGEpOwogICAgICAgICAgICAgICAgICAgIH0pLCBlLmV4cG9ydHMgPSBzOwogICAgICAgICAgICAgICAgfS5jYWxsKHRoaXMsIHQoMjgpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMCksIG8gPSB0KDMwKSwgYSA9IHQoNyksIGkgPSB0KDMyKSwgcyA9IHQoMzUpLCBjID0gdCgzNiksIGwgPSB0KDExKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChuLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNmZmZTUyMTI0MGQ0NzY1ZCA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkX2QwODdkOTlkN2U3OWU0YzcgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzZmZmU1MjEyNDBkNDc2NWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYjM2MTVlM2QyNGZiOWQzMC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZDA4N2Q5OWQ3ZTc5ZTRjNykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19iMzYxNWUzZDI0ZmI5ZDMwLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZS5kYXRhLCBkID0gZS5oZWFkZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNGb3JtRGF0YShwKSAmJiBkZWxldGUgZFsnQ29udGVudC1UeXBlJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hdXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gZS5hdXRoLnVzZXJuYW1lIHx8ICcnLCBoID0gZS5hdXRoLnBhc3N3b3JkIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLkF1dGhvcml6YXRpb24gPSAnQmFzaWMgJyArIGJ0b2EobSArICc6JyArIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGkoZS5iYXNlVVJMLCBlLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLCBhKGcsIGUucGFyYW1zLCBlLnBhcmFtc1NlcmlhbGl6ZXIpLCAhMCksIGYudGltZW91dCA9IGUudGltZW91dCwgZi5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiA0ID09PSBmLnJlYWR5U3RhdGUgJiYgKDAgIT09IGYuc3RhdHVzIHx8IGYucmVzcG9uc2VVUkwgJiYgMCA9PT0gZi5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gZiA/IHMoZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkgOiBudWxsLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZS5yZXNwb25zZVR5cGUgJiYgJ3RleHQnICE9PSBlLnJlc3BvbnNlVHlwZSA/IGYucmVzcG9uc2UgOiBmLnJlc3BvbnNlVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogZi5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiBmLnN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8obiwgdSwgciksIGYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmLm9uYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmICh1KGwoJ1JlcXVlc3QgYWJvcnRlZCcsIGUsICdFQ09OTkFCT1JURUQnLCBmKSksIGYgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdShsKCdOZXR3b3JrIEVycm9yJywgZSwgbnVsbCwgZikpLCBmID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICd0aW1lb3V0IG9mICcgKyBlLnRpbWVvdXQgKyAnbXMgZXhjZWVkZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50aW1lb3V0RXJyb3JNZXNzYWdlICYmIChuID0gZS50aW1lb3V0RXJyb3JNZXNzYWdlKSwgdShsKG4sIGUsICdFQ09OTkFCT1JURUQnLCBmKSksIGYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSB0KDM3KSwgdiA9IChlLndpdGhDcmVkZW50aWFscyB8fCBjKGcpKSAmJiBlLnhzcmZDb29raWVOYW1lID8geS5yZWFkKGUueHNyZkNvb2tpZU5hbWUpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICYmIChkW2UueHNyZkhlYWRlck5hbWVdID0gdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc2V0UmVxdWVzdEhlYWRlcicgaW4gZiAmJiByLmZvckVhY2goZCwgZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09PSB0eXBlb2YgcCAmJiAnY29udGVudC10eXBlJyA9PT0gbi50b0xvd2VyQ2FzZSgpID8gZGVsZXRlIGRbbl0gOiBmLnNldFJlcXVlc3RIZWFkZXIobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKSB8fCAoZi53aXRoQ3JlZGVudGlhbHMgPSAhIWUud2l0aENyZWRlbnRpYWxzKSwgZS5yZXNwb25zZVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlc3BvbnNlVHlwZSA9IGUucmVzcG9uc2VUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2pzb24nICE9PSBlLnJlc3BvbnNlVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzICYmIGYuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBlLm9uRG93bmxvYWRQcm9ncmVzcyksICdmdW5jdGlvbicgPT09IHR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MgJiYgZi51cGxvYWQgJiYgZi51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBlLm9uVXBsb2FkUHJvZ3Jlc3MpLCBlLmNhbmNlbFRva2VuICYmIGUuY2FuY2VsVG9rZW4ucHJvbWlzZS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgKGYuYWJvcnQoKSwgdShlKSwgZiA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB2b2lkIDAgPT09IHAgJiYgKHAgPSBudWxsKSwgZi5zZW5kKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNmZmZTUyMTI0MGQ0NzY1ZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzZmZmU1MjEyNDBkNDc2NWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2QwODdkOTlkN2U3OWU0YzcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF9kMDg3ZDk5ZDdlNzllNGM3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMzEpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIG4sIHQsIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihpLCBuLCB0LCBvLCBhKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIG4gPSBuIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIG8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXRob2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmFtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YScKICAgICAgICAgICAgICAgICAgICAgICAgXSwgYSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm94eScKICAgICAgICAgICAgICAgICAgICAgICAgXSwgaSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXNlVVJMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybVJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybVJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbXNTZXJpYWxpemVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aXRoQ3JlZGVudGlhbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkYXB0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3BvbnNlVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAneHNyZkNvb2tpZU5hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hzcmZIZWFkZXJOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvblVwbG9hZFByb2dyZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbkRvd25sb2FkUHJvZ3Jlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heENvbnRlbnRMZW5ndGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbGlkYXRlU3RhdHVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhSZWRpcmVjdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHBBZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cHNBZ2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FuY2VsVG9rZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvY2tldFBhdGgnCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgci5mb3JFYWNoKG8sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgbltlXSAmJiAodFtlXSA9IG5bZV0pOwogICAgICAgICAgICAgICAgICAgIH0pLCByLmZvckVhY2goYSwgZnVuY3Rpb24gKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgci5pc09iamVjdChuW29dKSA/IHRbb10gPSByLmRlZXBNZXJnZShlW29dLCBuW29dKSA6ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgbltvXSA/IHRbb10gPSBuW29dIDogci5pc09iamVjdChlW29dKSA/IHRbb10gPSByLmRlZXBNZXJnZShlW29dKSA6ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZVtvXSAmJiAodFtvXSA9IGVbb10pOwogICAgICAgICAgICAgICAgICAgIH0pLCByLmZvckVhY2goaSwgZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBuW3JdID8gdFtyXSA9IG5bcl0gOiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGVbcl0gJiYgKHRbcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG8uY29uY2F0KGEpLmNvbmNhdChpKSwgYyA9IE9iamVjdC5rZXlzKG4pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBzLmluZGV4T2YoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZvckVhY2goYywgZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBuW3JdID8gdFtyXSA9IG5bcl0gOiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGVbcl0gJiYgKHRbcl0gPSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdDYW5jZWwnICsgKHRoaXMubWVzc2FnZSA/ICc6ICcgKyB0aGlzLm1lc3NhZ2UgOiAnJyk7CiAgICAgICAgICAgICAgICB9LCByLnByb3RvdHlwZS5fX0NBTkNFTF9fID0gITAsIGUuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzT3duUHJvcGVydHkodCkgJiYgKGVbdF0gPSBuW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUobiwgdCksIG4ucHJvdG90eXBlID0gbnVsbCA9PT0gdCA/IE9iamVjdC5jcmVhdGUodCkgOiAoci5wcm90b3R5cGUgPSB0LnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSB0KDQwKSwgYSA9IHQoNDEpLCBpID0gdCgzKSwgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IG4gJiYgKHIucHVycG9zZUlkID0gbiksIHZvaWQgMCAhPT0gdCAmJiAoci5yZXN0cmljdGlvblR5cGUgPSB0KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihuLCBlKSwgbi51bkhhc2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KHRoaXMuaGFzaFNlcGFyYXRvciksIHIgPSBuZXcgbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgIT09IHQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhLlRDTW9kZWxFcnJvcignaGFzaCcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIucHVycG9zZUlkID0gcGFyc2VJbnQodFswXSwgMTApLCByLnJlc3RyaWN0aW9uVHlwZSA9IHBhcnNlSW50KHRbMV0sIDEwKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLCAnaGFzaCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IGhhc2ggaW52YWxpZCBQdXJwb3NlUmVzdHJpY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgKyB0aGlzLnB1cnBvc2VJZCArIG4uaGFzaFNlcGFyYXRvciArIHRoaXMucmVzdHJpY3Rpb25UeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLCAncHVycG9zZUlkJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVycG9zZUlkXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXJwb3NlSWRfID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4ucHJvdG90eXBlLmlzVmFsaWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzSW50ZWdlcih0aGlzLnB1cnBvc2VJZCkgJiYgdGhpcy5wdXJwb3NlSWQgPiAwICYmICh0aGlzLnJlc3RyaWN0aW9uVHlwZSA9PT0gaS5SZXN0cmljdGlvblR5cGUuTk9UX0FMTE9XRUQgfHwgdGhpcy5yZXN0cmljdGlvblR5cGUgPT09IGkuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfQ09OU0VOVCB8fCB0aGlzLnJlc3RyaWN0aW9uVHlwZSA9PT0gaS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9MSSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ucHJvdG90eXBlLmlzU2FtZUFzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnB1cnBvc2VJZCA9PT0gZS5wdXJwb3NlSWQgJiYgdGhpcy5yZXN0cmljdGlvblR5cGUgPT09IGUucmVzdHJpY3Rpb25UeXBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmhhc2hTZXBhcmF0b3IgPSAnLScsIG47CiAgICAgICAgICAgICAgICAgICAgfShvLkNsb25lYWJsZSk7CiAgICAgICAgICAgICAgICBuLlB1cnBvc2VSZXN0cmljdGlvbiA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDQ3KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLCB0ID0gbi5oYXNPd25Qcm9wZXJ0eSwgciA9ICdmdW5jdGlvbicgPT09IHR5cGVvZiBTeW1ib2wgPyBTeW1ib2wgOiB7fSwgbyA9IHIuaXRlcmF0b3IgfHwgJ0BAaXRlcmF0b3InLCBhID0gci5hc3luY0l0ZXJhdG9yIHx8ICdAQGFzeW5jSXRlcmF0b3InLCBpID0gci50b1N0cmluZ1RhZyB8fCAnQEB0b1N0cmluZ1RhZyc7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGVbbl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMoe30sICcnKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuICYmIG4ucHJvdG90eXBlIGluc3RhbmNlb2YgcCA/IG4gOiBwLCBhID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIGkgPSBuZXcgQyhyIHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuX2ludm9rZSA9IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdzdXNwZW5kZWRTdGFydCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2V4ZWN1dGluZycgPT09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY29tcGxldGVkJyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyA9PT0gbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodC5tZXRob2QgPSBvLCB0LmFyZyA9IGE7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IF8oaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSB1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ25leHQnID09PSB0Lm1ldGhvZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2VudCA9IHQuX3NlbnQgPSB0LmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ3Rocm93JyA9PT0gdC5tZXRob2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3VzcGVuZGVkU3RhcnQnID09PSByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHIgPSAnY29tcGxldGVkJywgdC5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRpc3BhdGNoRXhjZXB0aW9uKHQuYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuJyA9PT0gdC5tZXRob2QgJiYgdC5hYnJ1cHQoJ3JldHVybicsIHQuYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICdleGVjdXRpbmcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGwoZSwgbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbm9ybWFsJyA9PT0gYy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9IHQuZG9uZSA/ICdjb21wbGV0ZWQnIDogJ3N1c3BlbmRlZFlpZWxkJywgYy5hcmcgPT09IHUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjLmFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiB0LmRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rocm93JyA9PT0gYy50eXBlICYmIChyID0gJ2NvbXBsZXRlZCcsIHQubWV0aG9kID0gJ3Rocm93JywgdC5hcmcgPSBjLmFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCB0LCBpKSwgYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdub3JtYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzogZS5jYWxsKG4sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd0aHJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnOiBTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUud3JhcCA9IGM7CiAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHt9OwogICAgICAgICAgICAgICAgICAgIG1bb10gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsIGcgPSBoICYmIGgoaChrKFtdKSkpOwogICAgICAgICAgICAgICAgICAgIGcgJiYgZyAhPT0gbiAmJiB0LmNhbGwoZywgbykgJiYgKG0gPSBnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IGYucHJvdG90eXBlID0gcC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG0pOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhyb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybicKICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGUsIG4sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2UgPSBmdW5jdGlvbiAobywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG4oZnVuY3Rpb24gKHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIHIobywgYSwgaSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBsKGVbb10sIGUsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgIT09IGMudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gYy5hcmcsIHAgPSB1LnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwICYmICdvYmplY3QnID09PSB0eXBlb2YgcCAmJiB0LmNhbGwocCwgJ19fYXdhaXQnKSA/IG4ucmVzb2x2ZShwLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcignbmV4dCcsIGUsIGksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoJ3Rocm93JywgZSwgaSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBuLnJlc29sdmUocCkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnZhbHVlID0gZSwgaSh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcigndGhyb3cnLCBlLCBpLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoYy5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG8sIGEsIHIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSByID8gci50aGVuKGksIGkpIDogaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLml0ZXJhdG9yW24ubWV0aG9kXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uZGVsZWdhdGUgPSBudWxsLCAndGhyb3cnID09PSBuLm1ldGhvZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLml0ZXJhdG9yLnJldHVybiAmJiAobi5tZXRob2QgPSAncmV0dXJuJywgbi5hcmcgPSB2b2lkIDAsIF8oZSwgbiksICd0aHJvdycgPT09IG4ubWV0aG9kKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5tZXRob2QgPSAndGhyb3cnLCBuLmFyZyA9IG5ldyBUeXBlRXJyb3IoJ1RoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgXCd0aHJvd1wnIG1ldGhvZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBsKHQsIGUuaXRlcmF0b3IsIG4uYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IHIudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLm1ldGhvZCA9ICd0aHJvdycsIG4uYXJnID0gci5hcmcsIG4uZGVsZWdhdGUgPSBudWxsLCB1OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHIuYXJnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA/IG8uZG9uZSA/IChuW2UucmVzdWx0TmFtZV0gPSBvLnZhbHVlLCBuLm5leHQgPSBlLm5leHRMb2MsICdyZXR1cm4nICE9PSBuLm1ldGhvZCAmJiAobi5tZXRob2QgPSAnbmV4dCcsIG4uYXJnID0gdm9pZCAwKSwgbi5kZWxlZ2F0ZSA9IG51bGwsIHUpIDogbyA6IChuLm1ldGhvZCA9ICd0aHJvdycsIG4uYXJnID0gbmV3IFR5cGVFcnJvcignaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QnKSwgbi5kZWxlZ2F0ZSA9IG51bGwsIHUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7IHRyeUxvYzogZVswXSB9OwogICAgICAgICAgICAgICAgICAgICAgICAxIGluIGUgJiYgKG4uY2F0Y2hMb2MgPSBlWzFdKSwgMiBpbiBlICYmIChuLmZpbmFsbHlMb2MgPSBlWzJdLCBuLmFmdGVyTG9jID0gZVszXSksIHRoaXMudHJ5RW50cmllcy5wdXNoKG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvbXBsZXRpb24gfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIG4udHlwZSA9ICdub3JtYWwnLCBkZWxldGUgbi5hcmcsIGUuY29tcGxldGlvbiA9IG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6ICdyb290JyB9XSwgZS5mb3JFYWNoKHgsIHRoaXMpLCB0aGlzLnJlc2V0KCEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBlLm5leHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGUubGVuZ3RoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gLTEsIGEgPSBmdW5jdGlvbiBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICsrciA8IGUubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jYWxsKGUsIHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi52YWx1ZSA9IGVbcl0sIG4uZG9uZSA9ICExLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udmFsdWUgPSB2b2lkIDAsIG4uZG9uZSA9ICEwLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5leHQgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5leHQ6IHcgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5wcm90b3R5cGUgPSB5LmNvbnN0cnVjdG9yID0gZiwgZi5jb25zdHJ1Y3RvciA9IGQsIGQuZGlzcGxheU5hbWUgPSBzKGYsIGksICdHZW5lcmF0b3JGdW5jdGlvbicpLCBlLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICdmdW5jdGlvbicgPT09IHR5cGVvZiBlICYmIGUuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW4gJiYgKG4gPT09IGQgfHwgJ0dlbmVyYXRvckZ1bmN0aW9uJyA9PT0gKG4uZGlzcGxheU5hbWUgfHwgbi5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5tYXJrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihlLCBmKSA6IChlLl9fcHJvdG9fXyA9IGYsIHMoZSwgaSwgJ0dlbmVyYXRvckZ1bmN0aW9uJykpLCBlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoeSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5hd3JhcCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IF9fYXdhaXQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICB9LCB2KGIucHJvdG90eXBlKSwgYi5wcm90b3R5cGVbYV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sIGUuQXN5bmNJdGVyYXRvciA9IGIsIGUuYXN5bmMgPSBmdW5jdGlvbiAobiwgdCwgciwgbywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGEgJiYgKGEgPSBQcm9taXNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYihjKG4sIHQsIHIsIG8pLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaXNHZW5lcmF0b3JGdW5jdGlvbih0KSA/IGkgOiBpLm5leHQoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5kb25lID8gZS52YWx1ZSA6IGkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB2KHkpLCBzKHksIGksICdHZW5lcmF0b3InKSwgeVtvXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfSwgeS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEdlbmVyYXRvcl0nOwogICAgICAgICAgICAgICAgICAgIH0sIGUua2V5cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucmV2ZXJzZSgpLCBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IG4ubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZSA9IHIsIHQuZG9uZSA9ICExLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZG9uZSA9ICEwLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIGUudmFsdWVzID0gaywgQy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBDLAogICAgICAgICAgICAgICAgICAgICAgICByZXNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPSAwLCB0aGlzLm5leHQgPSAwLCB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdm9pZCAwLCB0aGlzLmRvbmUgPSAhMSwgdGhpcy5kZWxlZ2F0ZSA9IG51bGwsIHRoaXMubWV0aG9kID0gJ25leHQnLCB0aGlzLmFyZyA9IHZvaWQgMCwgdGhpcy50cnlFbnRyaWVzLmZvckVhY2goRSksICFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnID09PSBuLmNoYXJBdCgwKSAmJiB0LmNhbGwodGhpcywgbikgJiYgIWlzTmFOKCtuLnNsaWNlKDEpKSAmJiAodGhpc1tuXSA9IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3A6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9uZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndGhyb3cnID09PSBlLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZS5hcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ydmFsOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnR5cGUgPSAndGhyb3cnLCBpLmFyZyA9IGUsIG4ubmV4dCA9IHQsIHIgJiYgKG4ubWV0aG9kID0gJ25leHQnLCBuLmFyZyA9IHZvaWQgMCksICEhcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgbyA+PSAwOyAtLW8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMudHJ5RW50cmllc1tvXSwgaSA9IGEuY29tcGxldGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Jvb3QnID09PSBhLnRyeUxvYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoJ2VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRyeUxvYyA8PSB0aGlzLnByZXYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0LmNhbGwoYSwgJ2NhdGNoTG9jJyksIGMgPSB0LmNhbGwoYSwgJ2ZpbmFsbHlMb2MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGEuY2F0Y2hMb2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoYS5jYXRjaExvYywgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGEuZmluYWxseUxvYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihhLmZpbmFsbHlMb2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBhLmNhdGNoTG9jKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGEuY2F0Y2hMb2MsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgYS5maW5hbGx5TG9jKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGEuZmluYWxseUxvYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFicnVwdDogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgciA+PSAwOyAtLXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMudHJ5RW50cmllc1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby50cnlMb2MgPD0gdGhpcy5wcmV2ICYmIHQuY2FsbChvLCAnZmluYWxseUxvYycpICYmIHRoaXMucHJldiA8IG8uZmluYWxseUxvYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKCdicmVhaycgPT09IGUgfHwgJ2NvbnRpbnVlJyA9PT0gZSkgJiYgYS50cnlMb2MgPD0gbiAmJiBuIDw9IGEuZmluYWxseUxvYyAmJiAoYSA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhID8gYS5jb21wbGV0aW9uIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS50eXBlID0gZSwgaS5hcmcgPSBuLCBhID8gKHRoaXMubWV0aG9kID0gJ25leHQnLCB0aGlzLm5leHQgPSBhLmZpbmFsbHlMb2MsIHUpIDogdGhpcy5jb21wbGV0ZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Rocm93JyA9PT0gZS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUuYXJnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdicmVhaycgPT09IGUudHlwZSB8fCAnY29udGludWUnID09PSBlLnR5cGUgPyB0aGlzLm5leHQgPSBlLmFyZyA6ICdyZXR1cm4nID09PSBlLnR5cGUgPyAodGhpcy5ydmFsID0gdGhpcy5hcmcgPSBlLmFyZywgdGhpcy5tZXRob2QgPSAncmV0dXJuJywgdGhpcy5uZXh0ID0gJ2VuZCcpIDogJ25vcm1hbCcgPT09IGUudHlwZSAmJiBuICYmICh0aGlzLm5leHQgPSBuKSwgdTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBuID49IDA7IC0tbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmZpbmFsbHlMb2MgPT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHQuY29tcGxldGlvbiwgdC5hZnRlckxvYyksIEUodCksIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBuID49IDA7IC0tbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy50cnlFbnRyaWVzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnRyeUxvYyA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuY29tcGxldGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd0aHJvdycgPT09IHIudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLmFyZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbGxlZ2FsIGNhdGNoIGF0dGVtcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOiBrKGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5hbWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExvYzogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ25leHQnID09PSB0aGlzLm1ldGhvZCAmJiAodGhpcy5hcmcgPSB2b2lkIDApLCB1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oZS5leHBvcnRzKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVnZW5lcmF0b3JSdW50aW1lID0gcjsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG8pIHsKICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbigncicsICdyZWdlbmVyYXRvclJ1bnRpbWUgPSByJykocik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDIyKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yLCBvID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSA6IDYwMTAzLCBhID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LnBvcnRhbCcpIDogNjAxMDYsIGkgPSByID8gU3ltYm9sLmZvcigncmVhY3QuZnJhZ21lbnQnKSA6IDYwMTA3LCBzID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiA2MDEwOCwgYyA9IHIgPyBTeW1ib2wuZm9yKCdyZWFjdC5wcm9maWxlcicpIDogNjAxMTQsIGwgPSByID8gU3ltYm9sLmZvcigncmVhY3QucHJvdmlkZXInKSA6IDYwMTA5LCB1ID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbnRleHQnKSA6IDYwMTEwLCBwID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LmFzeW5jX21vZGUnKSA6IDYwMTExLCBkID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogNjAxMTEsIGYgPSByID8gU3ltYm9sLmZvcigncmVhY3QuZm9yd2FyZF9yZWYnKSA6IDYwMTEyLCBtID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiA2MDExMywgaCA9IHIgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZV9saXN0JykgOiA2MDEyMCwgZyA9IHIgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiA2MDExNSwgeSA9IHIgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiA2MDExNiwgdiA9IHIgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogNjAxMjEsIGIgPSByID8gU3ltYm9sLmZvcigncmVhY3QuZnVuZGFtZW50YWwnKSA6IDYwMTE3LCBfID0gciA/IFN5bWJvbC5mb3IoJ3JlYWN0LnJlc3BvbmRlcicpIDogNjAxMTgsIHggPSByID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDYwMTE5OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgZSAmJiBudWxsICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS4kJHR5cGVvZjsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSA9IGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUgPSBlICYmIGUuJCR0eXBlb2YpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuLkFzeW5jTW9kZSA9IHAsIG4uQ29uY3VycmVudE1vZGUgPSBkLCBuLkNvbnRleHRDb25zdW1lciA9IHUsIG4uQ29udGV4dFByb3ZpZGVyID0gbCwgbi5FbGVtZW50ID0gbywgbi5Gb3J3YXJkUmVmID0gZiwgbi5GcmFnbWVudCA9IGksIG4uTGF6eSA9IHksIG4uTWVtbyA9IGcsIG4uUG9ydGFsID0gYSwgbi5Qcm9maWxlciA9IGMsIG4uU3RyaWN0TW9kZSA9IHMsIG4uU3VzcGVuc2UgPSBtLCBuLmlzQXN5bmNNb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhlKSB8fCBFKGUpID09PSBwOwogICAgICAgICAgICAgICAgfSwgbi5pc0NvbmN1cnJlbnRNb2RlID0gQywgbi5pc0NvbnRleHRDb25zdW1lciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IHU7CiAgICAgICAgICAgICAgICB9LCBuLmlzQ29udGV4dFByb3ZpZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRShlKSA9PT0gbDsKICAgICAgICAgICAgICAgIH0sIG4uaXNFbGVtZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBlICYmIG51bGwgIT09IGUgJiYgZS4kJHR5cGVvZiA9PT0gbzsKICAgICAgICAgICAgICAgIH0sIG4uaXNGb3J3YXJkUmVmID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRShlKSA9PT0gZjsKICAgICAgICAgICAgICAgIH0sIG4uaXNGcmFnbWVudCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IGk7CiAgICAgICAgICAgICAgICB9LCBuLmlzTGF6eSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IHk7CiAgICAgICAgICAgICAgICB9LCBuLmlzTWVtbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IGc7CiAgICAgICAgICAgICAgICB9LCBuLmlzUG9ydGFsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRShlKSA9PT0gYTsKICAgICAgICAgICAgICAgIH0sIG4uaXNQcm9maWxlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IGM7CiAgICAgICAgICAgICAgICB9LCBuLmlzU3RyaWN0TW9kZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSkgPT09IHM7CiAgICAgICAgICAgICAgICB9LCBuLmlzU3VzcGVuc2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBFKGUpID09PSBtOwogICAgICAgICAgICAgICAgfSwgbi5pc1ZhbGlkRWxlbWVudFR5cGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIGUgfHwgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGUgfHwgZSA9PT0gaSB8fCBlID09PSBkIHx8IGUgPT09IGMgfHwgZSA9PT0gcyB8fCBlID09PSBtIHx8IGUgPT09IGggfHwgJ29iamVjdCcgPT09IHR5cGVvZiBlICYmIG51bGwgIT09IGUgJiYgKGUuJCR0eXBlb2YgPT09IHkgfHwgZS4kJHR5cGVvZiA9PT0gZyB8fCBlLiQkdHlwZW9mID09PSBsIHx8IGUuJCR0eXBlb2YgPT09IHUgfHwgZS4kJHR5cGVvZiA9PT0gZiB8fCBlLiQkdHlwZW9mID09PSBiIHx8IGUuJCR0eXBlb2YgPT09IF8gfHwgZS4kJHR5cGVvZiA9PT0geCB8fCBlLiQkdHlwZW9mID09PSB2KTsKICAgICAgICAgICAgICAgIH0sIG4udHlwZU9mID0gRTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgwKSwgbyA9IHQoNiksIGEgPSB0KDI0KSwgaSA9IHQoMTIpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgYShlKSwgdCA9IG8oYS5wcm90b3R5cGUucmVxdWVzdCwgbik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZXh0ZW5kKHQsIGEucHJvdG90eXBlLCBuKSwgci5leHRlbmQodCwgbiksIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYyA9IHModCg5KSk7CiAgICAgICAgICAgICAgICBjLkF4aW9zID0gYSwgYy5jcmVhdGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGkoYy5kZWZhdWx0cywgZSkpOwogICAgICAgICAgICAgICAgfSwgYy5DYW5jZWwgPSB0KDEzKSwgYy5DYW5jZWxUb2tlbiA9IHQoMzgpLCBjLmlzQ2FuY2VsID0gdCg4KSwgYy5hbGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChlKTsKICAgICAgICAgICAgICAgIH0sIGMuc3ByZWFkID0gdCgzOSksIGUuZXhwb3J0cyA9IGMsIGUuZXhwb3J0cy5kZWZhdWx0ID0gYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgwKSwgbyA9IHQoNyksIGEgPSB0KDI1KSwgaSA9IHQoMjYpLCBzID0gdCgxMik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRzID0gZSwgdGhpcy5pbnRlcmNlcHRvcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG5ldyBhKCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBuZXcgYSgpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGMucHJvdG90eXBlLnJlcXVlc3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZSA/IChlID0gYXJndW1lbnRzWzFdIHx8IHt9KS51cmwgPSBhcmd1bWVudHNbMF0gOiBlID0gZSB8fCB7fSwgKGUgPSBzKHRoaXMuZGVmYXVsdHMsIGUpKS5tZXRob2QgPyBlLm1ldGhvZCA9IGUubWV0aG9kLnRvTG93ZXJDYXNlKCkgOiB0aGlzLmRlZmF1bHRzLm1ldGhvZCA/IGUubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKSA6IGUubWV0aG9kID0gJ2dldCc7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHQgPSBQcm9taXNlLnJlc29sdmUoZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udW5zaGlmdChlLmZ1bGZpbGxlZCwgZS5yZWplY3RlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZS5mdWxmaWxsZWQsIGUucmVqZWN0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsgbi5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC50aGVuKG4uc2hpZnQoKSwgbi5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBzKHRoaXMuZGVmYXVsdHMsIGUpLCBvKGUudXJsLCBlLnBhcmFtcywgZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCAnJyk7CiAgICAgICAgICAgICAgICB9LCByLmZvckVhY2goWwogICAgICAgICAgICAgICAgICAgICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICdnZXQnLAogICAgICAgICAgICAgICAgICAgICdoZWFkJywKICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucycKICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgYy5wcm90b3R5cGVbZV0gPSBmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHIubWVyZ2UodCB8fCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBuCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSksIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgJ3Bvc3QnLAogICAgICAgICAgICAgICAgICAgICdwdXQnLAogICAgICAgICAgICAgICAgICAgICdwYXRjaCcKICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgYy5wcm90b3R5cGVbZV0gPSBmdW5jdGlvbiAobiwgdCwgbykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHIubWVyZ2UobyB8fCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdAogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pLCBlLmV4cG9ydHMgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXJzID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLnByb3RvdHlwZS51c2UgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBmdWxmaWxsZWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkOiBuCiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuaGFuZGxlcnMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLmVqZWN0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXJzW2VdICYmICh0aGlzLmhhbmRsZXJzW2VdID0gbnVsbCk7CiAgICAgICAgICAgICAgICB9LCBvLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gbiAmJiBlKG4pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgwKSwgbyA9IHQoMjcpLCBhID0gdCg4KSwgaSA9IHQoOSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLmNhbmNlbFRva2VuICYmIGUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlKSwgZS5oZWFkZXJzID0gZS5oZWFkZXJzIHx8IHt9LCBlLmRhdGEgPSBvKGUuZGF0YSwgZS5oZWFkZXJzLCBlLnRyYW5zZm9ybVJlcXVlc3QpLCBlLmhlYWRlcnMgPSByLm1lcmdlKGUuaGVhZGVycy5jb21tb24gfHwge30sIGUuaGVhZGVyc1tlLm1ldGhvZF0gfHwge30sIGUuaGVhZGVycyksIHIuZm9yRWFjaChbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2hlYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAncG9zdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdwdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAncGF0Y2gnLAogICAgICAgICAgICAgICAgICAgICAgICAnY29tbW9uJwogICAgICAgICAgICAgICAgICAgIF0sIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBlLmhlYWRlcnNbbl07CiAgICAgICAgICAgICAgICAgICAgfSksIChlLmFkYXB0ZXIgfHwgaS5hZGFwdGVyKShlKS50aGVuKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUpLCBuLmRhdGEgPSBvKG4uZGF0YSwgbi5oZWFkZXJzLCBlLnRyYW5zZm9ybVJlc3BvbnNlKSwgbjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShuKSB8fCAocyhlKSwgbiAmJiBuLnJlc3BvbnNlICYmIChuLnJlc3BvbnNlLmRhdGEgPSBvKG4ucmVzcG9uc2UuZGF0YSwgbi5yZXNwb25zZS5oZWFkZXJzLCBlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLCBQcm9taXNlLnJlamVjdChuKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByLmZvckVhY2godCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgdmFyIHQsIHIsIG8gPSBlLmV4cG9ydHMgPSB7fTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gc2V0VGltZW91dCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID09PSBhIHx8ICF0KSAmJiBzZXRUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHNldFRpbWVvdXQsIHNldFRpbWVvdXQoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbChudWxsLCBlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbCh0aGlzLCBlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICdmdW5jdGlvbicgPT09IHR5cGVvZiBzZXRUaW1lb3V0ID8gc2V0VGltZW91dCA6IGE7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgciA9ICdmdW5jdGlvbicgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiBpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgciA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdmFyIGMsIGwgPSBbXSwgdSA9ICExLCBwID0gLTE7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgIHUgJiYgYyAmJiAodSA9ICExLCBjLmxlbmd0aCA/IGwgPSBjLmNvbmNhdChsKSA6IHAgPSAtMSwgbC5sZW5ndGggJiYgZigpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcyhkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gbC5sZW5ndGg7IG47KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSBsLCBsID0gW107ICsrcCA8IG47KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgY1twXS5ydW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAtMSwgbiA9IGwubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBudWxsLCB1ID0gITEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PT0gY2xlYXJUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPT09IGkgfHwgIXIpICYmIGNsZWFyVGltZW91dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IGNsZWFyVGltZW91dCwgY2xlYXJUaW1lb3V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwobnVsbCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5jYWxsKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1biA9IGUsIHRoaXMuYXJyYXkgPSBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8ubmV4dFRpY2sgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0IC0gMV0gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgbC5wdXNoKG5ldyBtKGUsIG4pKSwgMSAhPT0gbC5sZW5ndGggfHwgdSB8fCBzKGYpOwogICAgICAgICAgICAgICAgfSwgbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpOwogICAgICAgICAgICAgICAgfSwgby50aXRsZSA9ICdicm93c2VyJywgby5icm93c2VyID0gITAsIG8uZW52ID0ge30sIG8uYXJndiA9IFtdLCBvLnZlcnNpb24gPSAnJywgby52ZXJzaW9ucyA9IHt9LCBvLm9uID0gaCwgby5hZGRMaXN0ZW5lciA9IGgsIG8ub25jZSA9IGgsIG8ub2ZmID0gaCwgby5yZW1vdmVMaXN0ZW5lciA9IGgsIG8ucmVtb3ZlQWxsTGlzdGVuZXJzID0gaCwgby5lbWl0ID0gaCwgby5wcmVwZW5kTGlzdGVuZXIgPSBoLCBvLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBoLCBvLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgfSwgby5iaW5kaW5nID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgICAgICAgICAgICB9LCBvLmN3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy8nOwogICAgICAgICAgICAgICAgfSwgby5jaGRpciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTsKICAgICAgICAgICAgICAgIH0sIG8udW1hc2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDApOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByLmZvckVhY2goZSwgZnVuY3Rpb24gKHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgciAhPT0gbiAmJiByLnRvVXBwZXJDYXNlKCkgPT09IG4udG9VcHBlckNhc2UoKSAmJiAoZVtuXSA9IHQsIGRlbGV0ZSBlW3JdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHQoMTEpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQuY29uZmlnLnZhbGlkYXRlU3RhdHVzOwogICAgICAgICAgICAgICAgICAgICFvIHx8IG8odC5zdGF0dXMpID8gZSh0KSA6IG4ocignUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAnICsgdC5zdGF0dXMsIHQuY29uZmlnLCBudWxsLCB0LnJlcXVlc3QsIHQpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgbiwgdCwgciwgbykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbmZpZyA9IG4sIHQgJiYgKGUuY29kZSA9IHQpLCBlLnJlcXVlc3QgPSByLCBlLnJlc3BvbnNlID0gbywgZS5pc0F4aW9zRXJyb3IgPSAhMCwgZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcjogdGhpcy5udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5maWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHRoaXMubGluZU51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk51bWJlcjogdGhpcy5jb2x1bW5OdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogdGhpcy5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0aGlzLmNvZGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgzMyksIG8gPSB0KDM0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgIXIobikgPyBvKGUsIG4pIDogbjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAvXihbYS16XVthLXpcZFwrXC1cLl0qOik/XC9cLy9pLnRlc3QoZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGUucmVwbGFjZSgvXC8rJC8sICcnKSArICcvJyArIG4ucmVwbGFjZSgvXlwvKy8sICcnKSA6IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDApLCBvID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcml6YXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC1sZW5ndGgnLAogICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAnaWYtbW9kaWZpZWQtc2luY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnaWYtdW5tb2RpZmllZC1zaW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdsYXN0LW1vZGlmaWVkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xvY2F0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21heC1mb3J3YXJkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdwcm94eS1hdXRob3JpemF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmVyZXInLAogICAgICAgICAgICAgICAgICAgICAgICAncmV0cnktYWZ0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAndXNlci1hZ2VudCcKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCwgYSwgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gKHIuZm9yRWFjaChlLnNwbGl0KCdcbicpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9IGUuaW5kZXhPZignOicpLCBuID0gci50cmltKGUuc3Vic3RyKDAsIGEpKS50b0xvd2VyQ2FzZSgpLCB0ID0gci50cmltKGUuc3Vic3RyKGEgKyAxKSksIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpW25dICYmIG8uaW5kZXhPZihuKSA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbbl0gPSAnc2V0LWNvb2tpZScgPT09IG4gPyAoaVtuXSA/IGlbbl0gOiBbXSkuY29uY2F0KFt0XSkgOiBpW25dID8gaVtuXSArICcsICcgKyB0IDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCBpKSA6IGk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDApOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gci5pc1N0YW5kYXJkQnJvd3NlckVudigpID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlLCBuID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAodC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCByKSwgciA9IHQuaHJlZiksIHQuc2V0QXR0cmlidXRlKCdocmVmJywgciksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHQuaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sOiB0LnByb3RvY29sID8gdC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdDogdC5ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoOiB0LnNlYXJjaCA/IHQuc2VhcmNoLnJlcGxhY2UoL15cPy8sICcnKSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogdC5oYXNoID8gdC5oYXNoLnJlcGxhY2UoL14jLywgJycpIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZTogdC5ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHQucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lOiAnLycgPT09IHQucGF0aG5hbWUuY2hhckF0KDApID8gdC5wYXRobmFtZSA6ICcvJyArIHQucGF0aG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBvKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSwgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByLmlzU3RyaW5nKG4pID8gbyhuKSA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvY29sID09PSBlLnByb3RvY29sICYmIHQuaG9zdCA9PT0gZS5ob3N0OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgwKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSA/IHsKICAgICAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24gKGUsIG4sIHQsIG8sIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcy5wdXNoKGUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQobikpLCByLmlzTnVtYmVyKHQpICYmIHMucHVzaCgnZXhwaXJlcz0nICsgbmV3IERhdGUodCkudG9HTVRTdHJpbmcoKSksIHIuaXNTdHJpbmcobykgJiYgcy5wdXNoKCdwYXRoPScgKyBvKSwgci5pc1N0cmluZyhhKSAmJiBzLnB1c2goJ2RvbWFpbj0nICsgYSksICEwID09PSBpICYmIHMucHVzaCgnc2VjdXJlJyksIGRvY3VtZW50LmNvb2tpZSA9IHMuam9pbignOyAnKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJlYWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoJyhefDtcXHMqKSgnICsgZSArICcpPShbXjtdKiknKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID8gZGVjb2RlVVJJQ29tcG9uZW50KG5bM10pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZShlLCAnJywgRGF0ZS5ub3coKSAtIDg2NDAwMDAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICByZWFkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdCgxMyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2V4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuID0gZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnJlYXNvbiB8fCAodC5yZWFzb24gPSBuZXcgcihlKSwgbih0LnJlYXNvbikpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgby5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWFzb24pCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMucmVhc29uOwogICAgICAgICAgICAgICAgfSwgby5zb3VyY2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW46IG5ldyBvKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogZQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBlLmV4cG9ydHMgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkobnVsbCwgbik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX3ZhbHVlcyB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciwgdCA9IG4gJiYgZVtuXSwgciA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgJ251bWJlcicgPT0gdHlwZW9mIGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIHIgPj0gZS5sZW5ndGggJiYgKGUgPSB2b2lkIDApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlICYmIGVbcisrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogIWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobiA/ICdPYmplY3QgaXMgbm90IGl0ZXJhYmxlLicgOiAnU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLicpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIG4gPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmRlZXBDbG9uZShlW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gciAmJiAoblt0XSA9IHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3RvdHlwZS5kZWVwQ2xvbmUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCwgbyA9IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgPT09IG8gfHwgJ3N0cmluZycgPT09IG8gfHwgJ2Jvb2xlYW4nID09PSBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlICYmICdvYmplY3QnID09PSBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5jbG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jbG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBEYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlW1N5bWJvbC5pdGVyYXRvcl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSByKGUpLCBzID0gaS5uZXh0KCk7ICFzLmRvbmU7IHMgPSBpLm5leHQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHRoaXMuZGVlcENsb25lKGMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHsgZXJyb3I6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiAhcy5kb25lICYmICh0ID0gaS5yZXR1cm4pICYmIHQuY2FsbChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG4uZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSA/IGEgOiBuZXcgZS5jb25zdHJ1Y3RvcihhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eSh1KSAmJiAobFt1XSA9IHRoaXMuZGVlcENsb25lKGVbdV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIG4uQ2xvbmVhYmxlID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgbi5oYXNPd25Qcm9wZXJ0eSh0KSB8fCAoblt0XSA9IGVbdF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHIodCg0MikpLCByKHQoNDMpKSwgcih0KDQ0KSksIHIodCg0NSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzICYmIHRoaXMuX19leHRlbmRzIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fcHJvdG9fXyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmhhc093blByb3BlcnR5KHQpICYmIChlW3RdID0gblt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG4sIHQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlKG4sIHQpLCBuLnByb3RvdHlwZSA9IG51bGwgPT09IHQgPyBPYmplY3QuY3JlYXRlKHQpIDogKHIucHJvdG90eXBlID0gdC5wcm90b3R5cGUsIG5ldyByKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmNhbGwodGhpcywgbikgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubmFtZSA9ICdEZWNvZGluZ0Vycm9yJywgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIobiwgZSksIG47CiAgICAgICAgICAgICAgICB9KEVycm9yKTsKICAgICAgICAgICAgICAgIG4uRGVjb2RpbmdFcnJvciA9IG87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzT3duUHJvcGVydHkodCkgJiYgKGVbdF0gPSBuW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUobiwgdCksIG4ucHJvdG90eXBlID0gbnVsbCA9PT0gdCA/IE9iamVjdC5jcmVhdGUodCkgOiAoci5wcm90b3R5cGUgPSB0LnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY2FsbCh0aGlzLCBuKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5uYW1lID0gJ0VuY29kaW5nRXJyb3InLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihuLCBlKSwgbjsKICAgICAgICAgICAgICAgIH0oRXJyb3IpOwogICAgICAgICAgICAgICAgbi5FbmNvZGluZ0Vycm9yID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcyAmJiB0aGlzLl9fZXh0ZW5kcyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX3Byb3RvX18gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5oYXNPd25Qcm9wZXJ0eSh0KSAmJiAoZVt0XSA9IG5bdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KShuLCB0KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZShuLCB0KSwgbi5wcm90b3R5cGUgPSBudWxsID09PSB0ID8gT2JqZWN0LmNyZWF0ZSh0KSA6IChyLnByb3RvdHlwZSA9IHQucHJvdG90eXBlLCBuZXcgcigpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jYWxsKHRoaXMsIG4pIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5hbWUgPSAnR1ZMRXJyb3InLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihuLCBlKSwgbjsKICAgICAgICAgICAgICAgIH0oRXJyb3IpOwogICAgICAgICAgICAgICAgbi5HVkxFcnJvciA9IG87CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19wcm90b19fID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzT3duUHJvcGVydHkodCkgJiYgKGVbdF0gPSBuW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUobiwgdCksIG4ucHJvdG90eXBlID0gbnVsbCA9PT0gdCA/IE9iamVjdC5jcmVhdGUodCkgOiAoci5wcm90b3R5cGUgPSB0LnByb3RvdHlwZSwgbmV3IHIoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obiwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHIgJiYgKHIgPSAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5jYWxsKHRoaXMsICdpbnZhbGlkIHZhbHVlICcgKyB0ICsgJyBwYXNzZWQgZm9yICcgKyBuICsgJyAnICsgcikgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ubmFtZSA9ICdUQ01vZGVsRXJyb3InLCBvOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihuLCBlKSwgbjsKICAgICAgICAgICAgICAgIH0oRXJyb3IpOwogICAgICAgICAgICAgICAgbi5UQ01vZGVsRXJyb3IgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gSlNPTi5wYXJzZSgneyJQYXJlbnQiOnsiQ2hpbGQiOiJFbmdsaXNoIn0sImNvcmVVaUxhYmVscyI6eyJpbml0U2NyZWVuVGl0bGUiOiJXZSB2YWx1ZSB5b3VyIHByaXZhY3kiLCJhZ3JlZUJ1dHRvbiI6IkFHUkVFIiwiYWdyZWVBbGxCdXR0b24iOiJBR1JFRSBUTyBBTEwiLCJpbml0U2NyZWVuUmVqZWN0QnV0dG9uIjoiRElTQUdSRUUiLCJpbml0U2NyZWVuU2V0dGluZ3NCdXR0b24iOiJNT1JFIE9QVElPTlMiLCJzdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0U2VydmljZSI6WyJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLiIsIldpdGggeW91ciBwZXJtaXNzaW9uIHdlIGFuZCBvdXIgcGFydG5lcnMgbWF5IHVzZSBwcmVjaXNlIGdlb2xvY2F0aW9uIGRhdGEgYW5kIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggZGV2aWNlIHNjYW5uaW5nLiBZb3UgbWF5IGNsaWNrIHRvIGNvbnNlbnQgdG8gb3VyIGFuZCBvdXIgcGFydG5lcnNcdTIwMTkgcHJvY2Vzc2luZyBhcyBkZXNjcmliZWQgYWJvdmUuIEFsdGVybmF0aXZlbHkgeW91IG1heSBhY2Nlc3MgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYmVmb3JlIGNvbnNlbnRpbmcgb3IgdG8gcmVmdXNlIGNvbnNlbnRpbmcuIFBsZWFzZSBub3RlIHRoYXQgc29tZSBwcm9jZXNzaW5nIG9mIHlvdXIgcGVyc29uYWwgZGF0YSBtYXkgbm90IHJlcXVpcmUgeW91ciBjb25zZW50LCBidXQgeW91IGhhdmUgYSByaWdodCB0byBvYmplY3QgdG8gc3VjaCBwcm9jZXNzaW5nLiBZb3VyIHByZWZlcmVuY2VzIHdpbGwgYXBwbHkgdG8gdGhpcyB3ZWJzaXRlIG9ubHkuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuXFxuIl0sInN1bW1hcnlTY3JlZW5Cb2R5Tm9SZWplY3RHbG9iYWwiOlsiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4iLCJXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IGFjcm9zcyB0aGUgd2ViLiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LiJdLCJzdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0R3JvdXAiOlsiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4iLCJXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nIG9yIHRvIHJlZnVzZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIGEgZ3JvdXAgb2Ygd2Vic2l0ZXMuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIl0sInN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0U2VydmljZSI6WyJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIGFuZC9vciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gYSBkZXZpY2UsIHN1Y2ggYXMgY29va2llcyBhbmQgcHJvY2VzcyBwZXJzb25hbCBkYXRhLCBzdWNoIGFzIHVuaXF1ZSBpZGVudGlmaWVycyBhbmQgc3RhbmRhcmQgaW5mb3JtYXRpb24gc2VudCBieSBhIGRldmljZSBmb3IgcGVyc29uYWxpc2VkIGFkcyBhbmQgY29udGVudCwgYWQgYW5kIGNvbnRlbnQgbWVhc3VyZW1lbnQsIGFuZCBhdWRpZW5jZSBpbnNpZ2h0cywgYXMgd2VsbCBhcyB0byBkZXZlbG9wIGFuZCBpbXByb3ZlIHByb2R1Y3RzLiIsIldpdGggeW91ciBwZXJtaXNzaW9uIHdlIGFuZCBvdXIgcGFydG5lcnMgbWF5IHVzZSBwcmVjaXNlIGdlb2xvY2F0aW9uIGRhdGEgYW5kIGlkZW50aWZpY2F0aW9uIHRocm91Z2ggZGV2aWNlIHNjYW5uaW5nLiBZb3UgbWF5IGNsaWNrIHRvIGNvbnNlbnQgdG8gb3VyIGFuZCBvdXIgcGFydG5lcnNcdTIwMTkgcHJvY2Vzc2luZyBhcyBkZXNjcmliZWQgYWJvdmUuIEFsdGVybmF0aXZlbHkgeW91IG1heSBjbGljayB0byByZWZ1c2UgdG8gY29uc2VudCBvciBhY2Nlc3MgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYmVmb3JlIGNvbnNlbnRpbmcuIFBsZWFzZSBub3RlIHRoYXQgc29tZSBwcm9jZXNzaW5nIG9mIHlvdXIgcGVyc29uYWwgZGF0YSBtYXkgbm90IHJlcXVpcmUgeW91ciBjb25zZW50LCBidXQgeW91IGhhdmUgYSByaWdodCB0byBvYmplY3QgdG8gc3VjaCBwcm9jZXNzaW5nLiBZb3VyIHByZWZlcmVuY2VzIHdpbGwgYXBwbHkgdG8gdGhpcyB3ZWJzaXRlIG9ubHkuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIl0sInN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0R2xvYmFsIjpbIldlIGFuZCBvdXIgcGFydG5lcnMgc3RvcmUgYW5kL29yIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiBhIGRldmljZSwgc3VjaCBhcyBjb29raWVzIGFuZCBwcm9jZXNzIHBlcnNvbmFsIGRhdGEsIHN1Y2ggYXMgdW5pcXVlIGlkZW50aWZpZXJzIGFuZCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgZGV2aWNlIGZvciBwZXJzb25hbGlzZWQgYWRzIGFuZCBjb250ZW50LCBhZCBhbmQgY29udGVudCBtZWFzdXJlbWVudCwgYW5kIGF1ZGllbmNlIGluc2lnaHRzLCBhcyB3ZWxsIGFzIHRvIGRldmVsb3AgYW5kIGltcHJvdmUgcHJvZHVjdHMuIiwiV2l0aCB5b3VyIHBlcm1pc3Npb24gd2UgYW5kIG91ciBwYXJ0bmVycyBtYXkgdXNlIHByZWNpc2UgZ2VvbG9jYXRpb24gZGF0YSBhbmQgaWRlbnRpZmljYXRpb24gdGhyb3VnaCBkZXZpY2Ugc2Nhbm5pbmcuWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IGFjcm9zcyB0aGUgd2ViLllvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIl0sInN1bW1hcnlTY3JlZW5Cb2R5UmVqZWN0R3JvdXAiOlsiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4iLCJXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIGEgZ3JvdXAgb2Ygd2Vic2l0ZXMuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIl0sImluaXRTY3JlZW5Cb2R5R2xvYmFsIjoiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBvciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gZGV2aWNlcywgc3VjaCBhcyBjb29raWVzIGFuZCBwcm9jZXNzIHBlcnNvbmFsIGRhdGEsIHN1Y2ggYXMgdW5pcXVlIGlkZW50aWZpZXJzIGFuZCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgZGV2aWNlIGZvciB0aGUgcHVycG9zZXMgZGVzY3JpYmVkIGJlbG93LiBZb3UgbWF5IGNsaWNrIHRvIGNvbnNlbnQgdG8gb3VyIGFuZCBvdXIgcGFydG5lcnNcdTIwMTkgcHJvY2Vzc2luZyBmb3Igc3VjaCBwdXJwb3Nlcy4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjbGljayB0byByZWZ1c2UgdG8gY29uc2VudCwgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gdG8gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYmVmb3JlIGNvbnNlbnRpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSBhY3Jvc3MgdGhlIHdlYi4gUGxlYXNlIG5vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgeW91ciBwZXJzb25hbCBkYXRhIG1heSBub3QgcmVxdWlyZSB5b3VyIGNvbnNlbnQsIGJ1dCB5b3UgaGF2ZSBhIHJpZ2h0IHRvIG9iamVjdCB0byBzdWNoIHByb2Nlc3NpbmcuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgc2l0ZSBvciB2aXNpdCBvdXIgcHJpdmFjeSBwb2xpY3kuIiwiaW5pdFNjcmVlbkJvZHlTZXJ2aWNlIjoiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBvciBhY2Nlc3MgaW5mb3JtYXRpb24gb24gZGV2aWNlcywgc3VjaCBhcyBjb29raWVzIGFuZCBwcm9jZXNzIHBlcnNvbmFsIGRhdGEsIHN1Y2ggYXMgdW5pcXVlIGlkZW50aWZpZXJzIGFuZCBzdGFuZGFyZCBpbmZvcm1hdGlvbiBzZW50IGJ5IGEgZGV2aWNlIGZvciB0aGUgcHVycG9zZXMgZGVzY3JpYmVkIGJlbG93LiBZb3UgbWF5IGNsaWNrIHRvIGNvbnNlbnQgdG8gb3VyIGFuZCBvdXIgcGFydG5lcnNcdTIwMTkgcHJvY2Vzc2luZyBmb3Igc3VjaCBwdXJwb3Nlcy4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjbGljayB0byByZWZ1c2UgdG8gY29uc2VudCwgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBZb3VyIHByZWZlcmVuY2VzIHdpbGwgYXBwbHkgdG8gdGhpcyB3ZWJzaXRlIG9ubHkuIFBsZWFzZSBub3RlIHRoYXQgc29tZSBwcm9jZXNzaW5nIG9mIHlvdXIgcGVyc29uYWwgZGF0YSBtYXkgbm90IHJlcXVpcmUgeW91ciBjb25zZW50LCBidXQgeW91IGhhdmUgYSByaWdodCB0byBvYmplY3QgdG8gc3VjaCBwcm9jZXNzaW5nLiBZb3UgY2FuIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGF0IGFueSB0aW1lIGJ5IHJldHVybmluZyB0byB0aGlzIHNpdGUgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LiIsImluaXRTY3JlZW5Cb2R5R3JvdXAiOiJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIG9yIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiBkZXZpY2VzLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHRoZSBwdXJwb3NlcyBkZXNjcmliZWQgYmVsb3cuIFlvdSBtYXkgY2xpY2sgdG8gY29uc2VudCB0byBvdXIgYW5kIG91ciBwYXJ0bmVyc1x1MjAxOSBwcm9jZXNzaW5nIGZvciBzdWNoIHB1cnBvc2VzLiBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNsaWNrIHRvIHJlZnVzZSB0byBjb25zZW50LCBvciBhY2Nlc3MgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYmVmb3JlIGNvbnNlbnRpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSB0byBhIGdyb3VwIG9mIHdlYnNpdGVzLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBzaXRlIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4iLCJzcGVjaWFsUHVycG9zZXNBbmRGZWF0dXJlcyI6IlNwZWNpYWwgUHVycG9zZXMgYW5kIEZlYXR1cmVzIiwic2F2ZUFuZEV4aXRCdXR0b24iOiJTQVZFICYgRVhJVCIsImFncmVlVG9TZWxlY3RlZEJ1dHRvbiI6IkFHUkVFIFRPIFNFTEVDVEVEIiwicHVycG9zZVNjcmVlblZlbmRvckxpbmsiOiJQQVJUTkVSUyIsImxlZ2l0aW1hdGVJbnRlcmVzdExpbmsiOiJMRUdJVElNQVRFIElOVEVSRVNUICIsInNwZWNpYWxQdXJwb3Nlc0xhYmVsIjoiU3BlY2lhbCBQdXJwb3NlcyIsInNwZWNpYWxGZWF0dXJlc0xhYmVsIjoiU3BlY2lhbCBGZWF0dXJlcyIsImZlYXR1cmVzTGFiZWwiOiJGZWF0dXJlcyIsImJhY2siOiJCYWNrIiwib25MYWJlbCI6Ik9OIiwib2ZmTGFiZWwiOiJPRkYiLCJtdWx0aUxhYmVsIjoiTVVMVEkiLCJsZWdhbERlc2NyaXB0aW9uIjoiTGVnYWwgRGVzY3JpcHRpb24iLCJzaG93UGFydG5lcnMiOiJTaG93IFBhcnRuZXJzIiwiaGlkZVBhcnRuZXJzIjoiSGlkZSBQYXJ0bmVycyIsInZlbmRvclNjcmVlbkJvZHkiOiJSZXZpZXcgYW5kIHNldCB5b3VyIGNvbnNlbnQgcHJlZmVyZW5jZXMgZm9yIGVhY2ggcGFydG5lciBiZWxvdy4gRXhwYW5kIGVhY2ggcGFydG5lciBsaXN0IGl0ZW0gZm9yIG1vcmUgaW5mb3JtYXRpb24gdG8gaGVscCBtYWtlIHlvdXIgY2hvaWNlLiBTb21lIHBlcnNvbmFsIGRhdGEgaXMgcHJvY2Vzc2VkIHdpdGhvdXQgeW91ciBjb25zZW50LCBidXQgeW91IGhhdmUgdGhlIHJpZ2h0IHRvIG9iamVjdC4iLCJwcml2YWN5UG9saWN5TGFiZWwiOiJQcml2YWN5IFBvbGljeSIsImRlc2NyaXB0aW9uTGFiZWwiOiJWZW5kb3IgRGVzY3JpcHRpb24iLCJsZWdpdGltYXRlU2NyZWVuQm9keSI6IlJldmlldyBhbmQgb2JqZWN0IHRvIHByb2Nlc3Npbmcgb2YgcGVyc29uYWwgZGF0YSB3aXRob3V0IHlvdXIgY29uc2VudCBvbiB0aGUgYmFzaXMgb2YgYSBsZWdpdGltYXRlIGludGVyZXN0IGZvciBlYWNoIHB1cnBvc2UgYW5kIGJ5IGVhY2ggcGFydG5lciBiZWxvdy4gRXhwYW5kIGVhY2ggcHVycG9zZSBvciBwYXJ0bmVyIGxpc3QgaXRlbSBmb3IgbW9yZSBpbmZvcm1hdGlvbiB0byBoZWxwIG1ha2UgeW91ciBjaG9pY2UuIFRvIG9iamVjdCB0byB0aGUgc3BlY2lhbCBwdXJwb3NlcyBvZiBlbnN1cmluZyBzZWN1cml0eSwgcHJldmVudGluZyBmcmF1ZCwgYW5kIGRlYnVnZ2luZywgYW5kIHRlY2huaWNhbGx5IGRlbGl2ZXJpbmcgYWRzIG9yIGNvbnRlbnQgY2xpY2sgb24gYSBwYXJ0bmVyXCdzIHByaXZhY3kgcG9saWN5IGxpbmsuIiwibGVnaXRpbWF0ZUludGVyZXN0UHVycG9zZXNMYWJlbCI6IkxlZ2l0aW1hdGUgSW50ZXJlc3QgUHVycG9zZShzKSIsImxlZ2l0aW1hdGVJbnRlcmVzdFZlbmRvckxhYmVsIjoiTGVnaXRpbWF0ZSBJbnRlcmVzdCBWZW5kb3JzIiwibGVnaXRpbWF0ZVNjcmVlbk9iamVjdCI6Ik9CSkVDVCIsImxlZ2l0aW1hdGVTY3JlZW5PYmplY3RlZCI6Ik9CSkVDVEVEIiwibGVnaXRpbWF0ZVNjcmVlbkFjY2VwdCI6IlJFTU9WRSBPQkpFQ1RJT04iLCJvYmplY3RBbGxCdXR0b24iOiJPQkpFQ1QgQUxMIiwicGVyc2lzdGVudENvbnNlbnRMaW5rTGFiZWwiOiJQcml2YWN5Iiwibm9uSWFiVmVuZG9yc05vdGljZSI6IlZlbmRvcnMgd2hvIGRvIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgSUFCIEV1cm9wZSBUcmFuc3BhcmVuY3kgYW5kIENvbnNlbnQgRnJhbWV3b3JrIGFuZCBkbyBub3QgYWRoZXJlIHRvIGl0cyBwb2xpY2llcyBvciB0ZWNobmljYWwgc3BlY2lmaWNhdGlvbnMiLCJnb29nbGVQYXJ0bmVycyI6Ikdvb2dsZSBQYXJ0bmVycyIsInB1cnBvc2VzTGFiZWwiOiJQdXJwb3NlcyIsImdyb3VwT2ZTaXRlc0xhYmVsIjoiZ3JvdXAgb2Ygd2Vic2l0ZXMiLCJhY2NlcHRBbGwiOiJBQ0NFUFQgQUxMIiwicmVqZWN0QWxsIjoiUkVKRUNUIEFMTCIsImNvb2tpZU1heEFnZUxhYmVsIjoiQ29va2llIG1heCBhZ2UiLCJzZWNvbmRzTGFiZWwiOiJTZWNvbmRzIiwic3RvcmFnZURpc2Nsb3N1cmVMYWJlbCI6IlN0b3JhZ2UgZGlzY2xvc3VyZSIsImNvb2tpZUFjY2Vzc0xhYmVsIjoiVXNlcyBub24gY29va2llIGFjY2VzcyIsInllc0xhYmVsIjoiWWVzIiwibm9MYWJlbCI6Ik5vIiwiZGF5c0xhYmVsIjoiRGF5cyJ9LCJwcmVtaXVtVWlMYWJlbHMiOnsibGlua3NUaXRsZSI6IkFkZGl0aW9uYWwgTGlua3MiLCJub25JYWJWZW5kb3JzTGFiZWwiOiJOb24tSUFCIFZlbmRvcnMiLCJ1c3BBY2NlcHRCdXR0b24iOiJDT05GSVJNIiwidXNwQWNjZXNzRGF0YUxpbmtUZXh0IjoiRGF0YSBBY2Nlc3MiLCJ1c3BEZWxldGVEYXRhTGlua1RleHQiOiJEYXRhIERlbGV0aW9uIiwidXNwRG5zVGl0bGUiOiJEbyBOb3QgU2VsbCBNeSBQZXJzb25hbCBJbmZvcm1hdGlvbiIsInVzcERvTm90U2VsbFRvZ2dsZVRleHQiOiJJIHdhbnQgdG8gcmVxdWVzdCB0aGF0IHlvdSBcdTIwMThEbyBOb3QgU2VsbCBNeSBQZXJzb25hbCBJbmZvcm1hdGlvblx1MjAxOSIsInVzcFByaXZhY3lQb2xpY3lMaW5rVGV4dCI6IlByaXZhY3kgUG9saWN5IiwidXNwRG5zVGV4dCI6IjxwPldoZW4geW91IHZpc2l0IHRoaXMgd2Vic2l0ZSwgd2UgY29sbGVjdCBwZXJzb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIElQIGFkZHJlc3NlcywgY29va2llIGlkZW50aWZpZXJzIGFuZCBvdGhlciBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcnMuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHVzZWQgdG8gcGVyc29uYWxpemUgY29udGVudCBiYXNlZCBvbiB5b3VyIGludGVyZXN0cywgcnVuIGFuZCBvcHRpbWl6ZSBhZHZlcnRpc2luZyBjYW1wYWlnbnMgdGFpbG9yZWQgdG8geW91LCBtZWFzdXJlIHRoZSBwZXJmb3JtYW5jZSBvZiBhZHMgYW5kIGNvbnRlbnQsIGFuZCBkZXJpdmUgaW5zaWdodHMgYWJvdXQgdGhlIGF1ZGllbmNlcyB3aG8gZW5nYWdlIHdpdGggYWRzIGFuZCBjb250ZW50LiBUaGlzIGluZm9ybWF0aW9uIG1heSBhbHNvIGJlIGRpc2Nsb3NlZCBieSB1cyB0byB0aGlyZCBwYXJ0aWVzIG9uIHRoZSA8YSB0YXJnZXQ9XFwiX2JsYW5rXFwiIGhyZWY9XFwiaHR0cHM6Ly93d3cuaWFicHJpdmFjeS5jb20vb3B0b3V0Lmh0bWxcXCI+SUFCXHUyMDE5cyBMaXN0IG9mIERvd25zdHJlYW0gUGFydGljaXBhbnRzPC9hPiB0aGF0IG1heSBmdXJ0aGVyIGRpc2Nsb3NlIGl0IHRvIG90aGVyIHRoaXJkIHBhcnRpZXMuPC9wPjxwPlVzaW5nIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFzIGRlc2NyaWJlZCBhYm92ZSBpcyBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGhvdyB3ZSBvcGVyYXRlIG91ciB3ZWJzaXRlLCBtYWtlIHJldmVudWUgdG8gc3VwcG9ydCBvdXIgc3RhZmYsIGFuZCBnZW5lcmF0ZSByZWxldmFudCBjb250ZW50IGZvciBvdXIgYXVkaWVuY2UuIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCBvdXIgZGF0YSBjb2xsZWN0aW9uIGFuZCB1c2UgcHJhY3RpY2VzIGluIG91ciBQcml2YWN5IFBvbGljeS48L3A+PGJyIC8+PHA+SWYgeW91IHdpc2ggdG8gb3B0IG91dCBvZiB0aGUgZGlzY2xvc3VyZSBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIHRoaXJkIHBhcnRpZXMgYnkgdXMsIHBsZWFzZSB1c2UgdGhlIGJlbG93IG9wdCBvdXQgYW5kIGNvbmZpcm0geW91ciBzZWxlY3Rpb24uIFBsZWFzZSBub3RlIHRoYXQgYWZ0ZXIgeW91ciBvcHQgb3V0IHJlcXVlc3QgaXMgcHJvY2Vzc2VkLCB5b3UgbWF5IGNvbnRpbnVlIHNlZWluZyBpbnRlcmVzdCZuZGFzaDtiYXNlZCBhZHMgYmFzZWQgb24gcGVyc29uYWwgSW5mb3JtYXRpb24gdXRpbGl6ZWQgYnkgdXMgb3IgcGVyc29uYWwgaW5mb3JtYXRpb24gZGlzY2xvc2VkIHRvIHRoaXJkIHBhcnRpZXMgcHJpb3IgdG8geW91ciBvcHQgb3V0LiBZb3UgbWF5IHNlcGFyYXRlbHkgb3B0IG91dCBvZiB0aGUgZnVydGhlciBkaXNjbG9zdXJlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gYnkgdGhpcmQgcGFydGllcyBvbiB0aGUgPGEgdGFyZ2V0PVxcIl9ibGFua1xcIiBocmVmPVxcImh0dHBzOi8vd3d3LmlhYnByaXZhY3kuY29tL29wdG91dC5odG1sXFwiPklBQlx1MjAxOXMgTGlzdCBvZiBEb3duc3RyZWFtIFBhcnRpY2lwYW50czwvYT4uPC9wPiJ9LCJtb2JpbGVVaUxhYmVscyI6eyJkb25lTGFiZWwiOiJEb25lIiwic2VhcmNoTGFiZWwiOiJTZWFyY2giLCJjYW5jZWxMYWJlbCI6IkNhbmNlbCIsInNob3dWZW5kb3JzTGFiZWwiOiJTaG93IGFsbCB2ZW5kb3JzIiwic2hvd0lhYkxhYmVsIjoiU2hvdyBJQUIgdmVuZG9ycyIsImNvbnNlbnRMYWJlbCI6IkNvbnNlbnQiLCJmbGV4UHVycG9zZXNMYWJlbCI6IkZsZXhpYmxlIHB1cnBvc2VzIiwiY29va2llQWNjZXNzQm9keVRleHQiOiJXZSBhbmQgb3VyIHBhcnRuZXJzIHN0b3JlIG9yIGFjY2VzcyBpbmZvcm1hdGlvbiBvbiBkZXZpY2VzLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHRoZSBwdXJwb3NlcyBkZXNjcmliZWQgYmVsb3cuIFlvdSBtYXkgY2xpY2sgdG8gY29uc2VudCB0byBvdXIgYW5kIG91ciBwYXJ0bmVyc1x1MjAxOSBwcm9jZXNzaW5nIGZvciBzdWNoIHB1cnBvc2VzLiBBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNsaWNrIHRvIHJlZnVzZSB0byBjb25zZW50LCBvciBhY2Nlc3MgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYmVmb3JlIGNvbnNlbnRpbmcuIFlvdXIgcHJlZmVyZW5jZXMgd2lsbCBhcHBseSB0byB0aGlzIGFwcCBvbmx5LiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91IGNhbiBjaGFuZ2UgeW91ciBwcmVmZXJlbmNlcyBhdCBhbnkgdGltZSBieSByZXR1cm5pbmcgdG8gdGhpcyBhcHAgb3IgdmlzaXQgb3VyIHByaXZhY3kgcG9saWN5LiIsIm5vbmVMYWJlbCI6Ik5vbmUiLCJzb21lTGFiZWwiOiJTb21lIiwiYWxsTGFiZWwiOiJBbGwiLCJjbG9zZUxhYmVsIjoiQ2xvc2UiLCJhbGxWZW5kb3JzTGFiZWwiOiJBbGwiLCJzdW1tYXJ5U2NyZWVuQm9keVJlamVjdFNlcnZpY2UiOlsiV2UgYW5kIG91ciBwYXJ0bmVycyBzdG9yZSBhbmQvb3IgYWNjZXNzIGluZm9ybWF0aW9uIG9uIGEgZGV2aWNlLCBzdWNoIGFzIGNvb2tpZXMgYW5kIHByb2Nlc3MgcGVyc29uYWwgZGF0YSwgc3VjaCBhcyB1bmlxdWUgaWRlbnRpZmllcnMgYW5kIHN0YW5kYXJkIGluZm9ybWF0aW9uIHNlbnQgYnkgYSBkZXZpY2UgZm9yIHBlcnNvbmFsaXNlZCBhZHMgYW5kIGNvbnRlbnQsIGFkIGFuZCBjb250ZW50IG1lYXN1cmVtZW50LCBhbmQgYXVkaWVuY2UgaW5zaWdodHMsIGFzIHdlbGwgYXMgdG8gZGV2ZWxvcCBhbmQgaW1wcm92ZSBwcm9kdWN0cy4iLCJXaXRoIHlvdXIgcGVybWlzc2lvbiB3ZSBhbmQgb3VyIHBhcnRuZXJzIG1heSB1c2UgcHJlY2lzZSBnZW9sb2NhdGlvbiBkYXRhIGFuZCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIGRldmljZSBzY2FubmluZy4gWW91IG1heSBjbGljayB0byBjb25zZW50IHRvIG91ciBhbmQgb3VyIHBhcnRuZXJzXHUyMDE5IHByb2Nlc3NpbmcgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbHRlcm5hdGl2ZWx5IHlvdSBtYXkgY2xpY2sgdG8gcmVmdXNlIHRvIGNvbnNlbnQgb3IgYWNjZXNzIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNoYW5nZSB5b3VyIHByZWZlcmVuY2VzIGJlZm9yZSBjb25zZW50aW5nLiBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJvY2Vzc2luZyBvZiB5b3VyIHBlcnNvbmFsIGRhdGEgbWF5IG5vdCByZXF1aXJlIHlvdXIgY29uc2VudCwgYnV0IHlvdSBoYXZlIGEgcmlnaHQgdG8gb2JqZWN0IHRvIHN1Y2ggcHJvY2Vzc2luZy4gWW91ciBwcmVmZXJlbmNlcyB3aWxsIGFwcGx5IHRvIHRoaXMgYXBwIG9ubHkuIFlvdSBjYW4gY2hhbmdlIHlvdXIgcHJlZmVyZW5jZXMgYXQgYW55IHRpbWUgYnkgcmV0dXJuaW5nIHRvIHRoaXMgYXBwIG9yIHZpc2l0IG91ciBwcml2YWN5IHBvbGljeS4iXX19Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBuIHx8IG4gPiBlLmxlbmd0aCkgJiYgKG4gPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIHIgPSBuZXcgQXJyYXkobik7IHQgPCBuOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgIHJbdF0gPSBlW3RdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JyA9PT0gdCAmJiBlLmNvbnN0cnVjdG9yICYmICh0ID0gZS5jb25zdHJ1Y3Rvci5uYW1lKSwgJ01hcCcgPT09IHQgfHwgJ1NldCcgPT09IHQgPyBBcnJheS5mcm9tKHQpIDogJ0FyZ3VtZW50cycgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyByKGUsIG4pIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgbyhlKSB8fCBhKGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgU3ltYm9sIHx8IG51bGwgPT0gZVtTeW1ib2wuaXRlcmF0b3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpIHx8IChlID0gYShlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMCwgdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPj0gZS5sZW5ndGggPyB7IGRvbmU6ICEwIH0gOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlW24rK10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGkgPSAhMCwgcyA9ICExOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID0gZS5kb25lLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIHx8IG51bGwgPT0gci5yZXR1cm4gfHwgci5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIG4pKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgbi5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5bdF07CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZW51bWVyYWJsZSA9IHIuZW51bWVyYWJsZSB8fCAhMSwgci5jb25maWd1cmFibGUgPSAhMCwgJ3ZhbHVlJyBpbiByICYmIChyLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgci5rZXksIHIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIHAoZS5wcm90b3R5cGUsIG4pLCB0ICYmIHAoZSwgdCksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LnIobiksIHQuZChuLCAnY21wQXBpVWknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgZiA9IHBhcnNlSW50KCcnLmNvbmNhdCgnMzInKSksIG0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICBdLCBoID0gTnVtYmVyLmlzTmFOKGYpID8gMSA6IGY7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlKSB8fCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgciA9ICEwLCBvID0gITEsIGEgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGksIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShyID0gKGkgPSBzLm5leHQoKSkuZG9uZSkgJiYgKHQucHVzaChpLnZhbHVlKSwgIW4gfHwgdC5sZW5ndGggIT09IG4pOyByID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAhMCwgYSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgbikgfHwgYShlLCBuKSB8fCBjKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbbl0gPSB0LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgbikuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0LnB1c2guYXBwbHkodCwgcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPCBhcmd1bWVudHMubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudWxsICE9IGFyZ3VtZW50c1tuXSA/IGFyZ3VtZW50c1tuXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBuICUgMiA/IHYoT2JqZWN0KHQpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeShlLCBuLCB0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IHYoT2JqZWN0KHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgbiwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfLCB4LCBFLCBDLCBrLCB3ID0ge30sIFMgPSBbXSwgTCA9IC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gPSBuW3RdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgbiAmJiBuLnJlbW92ZUNoaWxkKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGEsIGkgPSBhcmd1bWVudHMsIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgPT0gYSA/IHIgPSBuW2FdIDogJ3JlZicgPT0gYSA/IG8gPSBuW2FdIDogc1thXSA9IG5bYV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSBbdF0sIGEgPSAzOyBhIDwgYXJndW1lbnRzLmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGlbYV0pOwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQgJiYgKHMuY2hpbGRyZW4gPSB0KSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiBudWxsICE9IGUuZGVmYXVsdFByb3BzKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gZS5kZWZhdWx0UHJvcHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHNbYV0gJiYgKHNbYV0gPSBlLmRlZmF1bHRQcm9wc1thXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEEoZSwgcywgciwgbywgbnVsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUsIG4sIHQsIHIsIG8pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiByLAogICAgICAgICAgICAgICAgICAgICAgICBfX2s6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBfX2I6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgX19kOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIF9fYzogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgX19oOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBfX3Y6IG51bGwgPT0gbyA/ICsrXy5fX3YgOiBvCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSBfLnZub2RlICYmIF8udm5vZGUoYSksIGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jaGlsZHJlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSwgbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMgPSBlLCB0aGlzLmNvbnRleHQgPSBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX18gPyBOKGUuX18sIGUuX18uX19rLmluZGV4T2YoZSkgKyAxKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdDsgbiA8IGUuX19rLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAodCA9IGUuX19rW25dKSAmJiBudWxsICE9IHQuX19lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuX19lOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnR5cGUgPyBOKGUpIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCB0OwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IChlID0gZS5fXykgJiYgbnVsbCAhPSBlLl9fYykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUuX19lID0gZS5fX2MuYmFzZSA9IG51bGwsIG4gPSAwOyBuIDwgZS5fX2subGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSAodCA9IGUuX19rW25dKSAmJiBudWxsICE9IHQuX19lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX2UgPSBlLl9fYy5iYXNlID0gdC5fX2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSkgewogICAgICAgICAgICAgICAgICAgICghZS5fX2QgJiYgKGUuX19kID0gITApICYmIHgucHVzaChlKSAmJiAhRC5fX3IrKyB8fCBDICE9PSBfLmRlYm91bmNlUmVuZGVyaW5nKSAmJiAoKEMgPSBfLmRlYm91bmNlUmVuZGVyaW5nKSB8fCBFKShEKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQoKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZTsgRC5fX3IgPSB4Lmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB4LnNvcnQoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9fdi5fX2IgLSBuLl9fdi5fX2I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4ID0gW10sIGUuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHQsIHIsIG8sIGEsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fZCAmJiAoYSA9IChvID0gKG4gPSBlKS5fX3YpLl9fZSwgKGkgPSBuLl9fUCkgJiYgKHQgPSBbXSwgKHIgPSBQKHt9LCBvKSkuX192ID0gby5fX3YgKyAxLCAkKGksIG8sIHIsIG4uX19uLCB2b2lkIDAgIT09IGkub3duZXJTVkdFbGVtZW50LCBudWxsICE9IG8uX19oID8gW2FdIDogbnVsbCwgdCwgbnVsbCA9PSBhID8gTihvKSA6IGEsIG8uX19oKSwgWSh0LCBvKSwgby5fX2UgIT0gYSAmJiBSKG8pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQihlLCBuLCB0LCByLCBvLCBhLCBpLCBzLCBjLCBsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHUsIHAsIGQsIGYsIG0sIGgsIGcsIHkgPSByICYmIHIuX19rIHx8IFMsIHYgPSB5Lmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHQuX19rID0gW10sIHUgPSAwOyB1IDwgbi5sZW5ndGg7IHUrKykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gKGYgPSB0Ll9fa1t1XSA9IG51bGwgPT0gKGYgPSBuW3VdKSB8fCAnYm9vbGVhbicgPT0gdHlwZW9mIGYgPyBudWxsIDogJ3N0cmluZycgPT0gdHlwZW9mIGYgfHwgJ251bWJlcicgPT0gdHlwZW9mIGYgfHwgJ2JpZ2ludCcgPT0gdHlwZW9mIGYgPyBBKG51bGwsIGYsIG51bGwsIG51bGwsIGYpIDogQXJyYXkuaXNBcnJheShmKSA/IEEoSSwgeyBjaGlsZHJlbjogZiB9LCBudWxsLCBudWxsLCBudWxsKSA6IGYuX19iID4gMCA/IEEoZi50eXBlLCBmLnByb3BzLCBmLmtleSwgbnVsbCwgZi5fX3YpIDogZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLl9fID0gdCwgZi5fX2IgPSB0Ll9fYiArIDEsIG51bGwgPT09IChkID0geVt1XSkgfHwgZCAmJiBmLmtleSA9PSBkLmtleSAmJiBmLnR5cGUgPT09IGQudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W3VdID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCB2OyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkID0geVtwXSkgJiYgZi5rZXkgPT0gZC5rZXkgJiYgZi50eXBlID09PSBkLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbcF0gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGUsIGYsIGQgPSBkIHx8IHcsIG8sIGEsIGksIHMsIGMsIGwpLCBtID0gZi5fX2UsIChwID0gZi5yZWYpICYmIGQucmVmICE9IHAgJiYgKGcgfHwgKGcgPSBbXSksIGQucmVmICYmIGcucHVzaChkLnJlZiwgbnVsbCwgZiksIGcucHVzaChwLCBmLl9fYyB8fCBtLCBmKSksIG51bGwgIT0gbSA/IChudWxsID09IGggJiYgKGggPSBtKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZi50eXBlICYmIG51bGwgIT0gZi5fX2sgJiYgZi5fX2sgPT09IGQuX19rID8gZi5fX2QgPSBjID0gaihmLCBjLCBlKSA6IGMgPSBWKGUsIGYsIGQsIHksIG0sIGMpLCBsIHx8ICdvcHRpb24nICE9PSB0LnR5cGUgPyAnZnVuY3Rpb24nID09IHR5cGVvZiB0LnR5cGUgJiYgKHQuX19kID0gYykgOiBlLnZhbHVlID0gJycpIDogYyAmJiBkLl9fZSA9PSBjICYmIGMucGFyZW50Tm9kZSAhPSBlICYmIChjID0gTihkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHQuX19lID0gaCwgdSA9IHY7IHUtLTspCiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0geVt1XSAmJiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdC50eXBlICYmIG51bGwgIT0geVt1XS5fX2UgJiYgeVt1XS5fX2UgPT0gdC5fX2QgJiYgKHQuX19kID0gTihyLCB1ICsgMSkpLCBYKHlbdV0sIHlbdV0pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1ID0gMDsgdSA8IGcubGVuZ3RoOyB1KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKGdbdV0sIGdbKyt1XSwgZ1srK3VdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBvOwogICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBlLl9fay5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgKG8gPSBlLl9fa1tyXSkgJiYgKG8uX18gPSBlLCBuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygby50eXBlID8gaihvLCBuLCB0KSA6IFYodCwgbywgbywgZS5fX2ssIG8uX19lLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IG4gfHwgW10sIG51bGwgPT0gZSB8fCAnYm9vbGVhbicgPT0gdHlwZW9mIGUgfHwgKEFycmF5LmlzQXJyYXkoZSkgPyBlLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRihlLCBuKTsKICAgICAgICAgICAgICAgICAgICB9KSA6IG4ucHVzaChlKSksIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKGUsIG4sIHQsIHIsIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSwgcywgYzsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBuLl9fZCkKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4uX19kLCBuLl9fZCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsID09IHQgfHwgbyAhPSBhIHx8IG51bGwgPT0gby5wYXJlbnROb2RlKQogICAgICAgICAgICAgICAgICAgICAgICBlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gYSB8fCBhLnBhcmVudE5vZGUgIT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBlbmRDaGlsZChvKSwgaSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSBhLCBjID0gMDsgKHMgPSBzLm5leHRTaWJsaW5nKSAmJiBjIDwgci5sZW5ndGg7IGMgKz0gMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbnNlcnRCZWZvcmUobywgYSksIGkgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyBpIDogby5uZXh0U2libGluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEcoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICctJyA9PT0gblswXSA/IGUuc2V0UHJvcGVydHkobiwgdCkgOiBlW25dID0gbnVsbCA9PSB0ID8gJycgOiAnbnVtYmVyJyAhPSB0eXBlb2YgdCB8fCBMLnRlc3QobikgPyB0IDogdCArICdweCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNKGUsIG4sIHQsIHIsIG8pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICBlOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0eWxlJyA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN0eWxlLmNzc1RleHQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiByICYmIChlLnN0eWxlLmNzc1RleHQgPSByID0gJycpLCByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgbiBpbiB0IHx8IEcoZS5zdHlsZSwgbiwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgdFtuXSA9PT0gcltuXSB8fCBHKGUuc3R5bGUsIG4sIHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnbycgPT09IG5bMF0gJiYgJ24nID09PSBuWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IG4gIT09IChuID0gbi5yZXBsYWNlKC9DYXB0dXJlJC8sICcnKSksIG4gPSBuLnRvTG93ZXJDYXNlKCkgaW4gZSA/IG4udG9Mb3dlckNhc2UoKS5zbGljZSgyKSA6IG4uc2xpY2UoMiksIGUubCB8fCAoZS5sID0ge30pLCBlLmxbbiArIGFdID0gdCwgdCA/IHIgfHwgZS5hZGRFdmVudExpc3RlbmVyKG4sIGEgPyBIIDogeiwgYSkgOiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIobiwgYSA/IEggOiB6LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MJyAhPT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4ucmVwbGFjZSgveGxpbmtbSDpoXS8sICdoJykucmVwbGFjZSgvc05hbWUkLywgJ3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdocmVmJyAhPT0gbiAmJiAnbGlzdCcgIT09IG4gJiYgJ2Zvcm0nICE9PSBuICYmICd0YWJJbmRleCcgIT09IG4gJiYgJ2Rvd25sb2FkJyAhPT0gbiAmJiBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtuXSA9IG51bGwgPT0gdCA/ICcnIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCB8fCAobnVsbCAhPSB0ICYmICghMSAhPT0gdCB8fCAnYScgPT09IG5bMF0gJiYgJ3InID09PSBuWzFdKSA/IGUuc2V0QXR0cmlidXRlKG4sIHQpIDogZS5yZW1vdmVBdHRyaWJ1dGUobikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxbZS50eXBlICsgITFdKF8uZXZlbnQgPyBfLmV2ZW50KGUpIDogZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBIKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxbZS50eXBlICsgITBdKF8uZXZlbnQgPyBfLmV2ZW50KGUpIDogZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAkKGUsIG4sIHQsIHIsIG8sIGEsIGksIHMsIGMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbCwgdSwgcCwgZCwgZiwgbSwgaCwgZywgeSwgdiwgYiwgeCA9IG4udHlwZTsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBuLmNvbnN0cnVjdG9yKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICBudWxsICE9IHQuX19oICYmIChjID0gdC5fX2gsIHMgPSBuLl9fZSA9IHQuX19lLCBuLl9faCA9IG51bGwsIGEgPSBbc10pLCAobCA9IF8uX19iKSAmJiBsKG4pOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnID0gbi5wcm9wcywgeSA9IChsID0geC5jb250ZXh0VHlwZSkgJiYgcltsLl9fY10sIHYgPSBsID8geSA/IHkucHJvcHMudmFsdWUgOiBsLl9fIDogciwgdC5fX2MgPyBoID0gKHUgPSBuLl9fYyA9IHQuX19jKS5fXyA9IHUuX19FIDogKCdwcm90b3R5cGUnIGluIHggJiYgeC5wcm90b3R5cGUucmVuZGVyID8gbi5fX2MgPSB1ID0gbmV3IHgoZywgdikgOiAobi5fX2MgPSB1ID0gbmV3IE8oZywgdiksIHUuY29uc3RydWN0b3IgPSB4LCB1LnJlbmRlciA9IEspLCB5ICYmIHkuc3ViKHUpLCB1LnByb3BzID0gZywgdS5zdGF0ZSB8fCAodS5zdGF0ZSA9IHt9KSwgdS5jb250ZXh0ID0gdiwgdS5fX24gPSByLCBwID0gdS5fX2QgPSAhMCwgdS5fX2ggPSBbXSksIG51bGwgPT0gdS5fX3MgJiYgKHUuX19zID0gdS5zdGF0ZSksIG51bGwgIT0geC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgJiYgKHUuX19zID09IHUuc3RhdGUgJiYgKHUuX19zID0gUCh7fSwgdS5fX3MpKSwgUCh1Ll9fcywgeC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoZywgdS5fX3MpKSksIGQgPSB1LnByb3BzLCBmID0gdS5zdGF0ZSwgcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSB4LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAmJiBudWxsICE9IHUuY29tcG9uZW50V2lsbE1vdW50ICYmIHUuY29tcG9uZW50V2lsbE1vdW50KCksIG51bGwgIT0gdS5jb21wb25lbnREaWRNb3VudCAmJiB1Ll9faC5wdXNoKHUuY29tcG9uZW50RGlkTW91bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB4LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAmJiBnICE9PSBkICYmIG51bGwgIT0gdS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmIHUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhnLCB2KSwgIXUuX19lICYmIG51bGwgIT0gdS5zaG91bGRDb21wb25lbnRVcGRhdGUgJiYgITEgPT09IHUuc2hvdWxkQ29tcG9uZW50VXBkYXRlKGcsIHUuX19zLCB2KSB8fCBuLl9fdiA9PT0gdC5fX3YpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucHJvcHMgPSBnLCB1LnN0YXRlID0gdS5fX3MsIG4uX192ICE9PSB0Ll9fdiAmJiAodS5fX2QgPSAhMSksIHUuX192ID0gbiwgbi5fX2UgPSB0Ll9fZSwgbi5fX2sgPSB0Ll9faywgbi5fX2suZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGUuX18gPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1Ll9faC5sZW5ndGggJiYgaS5wdXNoKHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHUuY29tcG9uZW50V2lsbFVwZGF0ZSAmJiB1LmNvbXBvbmVudFdpbGxVcGRhdGUoZywgdS5fX3MsIHYpLCBudWxsICE9IHUuY29tcG9uZW50RGlkVXBkYXRlICYmIHUuX19oLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5jb21wb25lbnREaWRVcGRhdGUoZCwgZiwgbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmNvbnRleHQgPSB2LCB1LnByb3BzID0gZywgdS5zdGF0ZSA9IHUuX19zLCAobCA9IF8uX19yKSAmJiBsKG4pLCB1Ll9fZCA9ICExLCB1Ll9fdiA9IG4sIHUuX19QID0gZSwgbCA9IHUucmVuZGVyKHUucHJvcHMsIHUuc3RhdGUsIHUuY29udGV4dCksIHUuc3RhdGUgPSB1Ll9fcywgbnVsbCAhPSB1LmdldENoaWxkQ29udGV4dCAmJiAociA9IFAoUCh7fSwgciksIHUuZ2V0Q2hpbGRDb250ZXh0KCkpKSwgcCB8fCBudWxsID09IHUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHwgKG0gPSB1LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKGQsIGYpKSwgYiA9IG51bGwgIT0gbCAmJiBsLnR5cGUgPT09IEkgJiYgbnVsbCA9PSBsLmtleSA/IGwucHJvcHMuY2hpbGRyZW4gOiBsLCBCKGUsIEFycmF5LmlzQXJyYXkoYikgPyBiIDogW2JdLCBuLCB0LCByLCBvLCBhLCBpLCBzLCBjKSwgdS5iYXNlID0gbi5fX2UsIG4uX19oID0gbnVsbCwgdS5fX2gubGVuZ3RoICYmIGkucHVzaCh1KSwgaCAmJiAodS5fX0UgPSB1Ll9fID0gbnVsbCksIHUuX19lID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IGEgJiYgbi5fX3YgPT09IHQuX192ID8gKG4uX19rID0gdC5fX2ssIG4uX19lID0gdC5fX2UpIDogbi5fX2UgPSBXKHQuX19lLCBuLCB0LCByLCBvLCBhLCBpLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgKGwgPSBfLmRpZmZlZCkgJiYgbChuKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4uX192ID0gbnVsbCwgKGMgfHwgbnVsbCAhPSBhKSAmJiAobi5fX2UgPSBzLCBuLl9faCA9ICEhYywgYVthLmluZGV4T2YocyldID0gbnVsbCksIF8uX19lKGUsIG4sIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFkoZSwgbikgewogICAgICAgICAgICAgICAgICAgIF8uX19jICYmIF8uX19jKG4sIGUpLCBlLnNvbWUoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuLl9faCwgbi5fX2ggPSBbXSwgZS5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jYWxsKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uX19lKGUsIG4uX192KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVyhlLCBuLCB0LCByLCBvLCBhLCBpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMsIGwsIHUsIHAsIGQgPSB0LnByb3BzLCBmID0gbi5wcm9wcywgbSA9IG4udHlwZSwgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdzdmcnID09PSBtICYmIChvID0gITApLCBudWxsICE9IGEpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBoIDwgYS5sZW5ndGg7IGgrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA9IGFbaF0pICYmIChjID09PSBlIHx8IChtID8gYy5sb2NhbE5hbWUgPT0gbSA6IDMgPT0gYy5ub2RlVHlwZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGMsIGFbaF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZik7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBvID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIG0pIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChtLCBmLmlzICYmIGYpLCBhID0gbnVsbCwgcyA9ICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gbSkKICAgICAgICAgICAgICAgICAgICAgICAgZCA9PT0gZiB8fCBzICYmIGUuZGF0YSA9PT0gZiB8fCAoZS5kYXRhID0gZik7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID0gYSAmJiBTLnNsaWNlLmNhbGwoZS5jaGlsZE5vZGVzKSwgbCA9IChkID0gdC5wcm9wcyB8fCB3KS5kYW5nZXJvdXNseVNldElubmVySFRNTCwgdSA9IGYuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwsICFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCA9IHt9LCBwID0gMDsgcCA8IGUuYXR0cmlidXRlcy5sZW5ndGg7IHArKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtlLmF0dHJpYnV0ZXNbcF0ubmFtZV0gPSBlLmF0dHJpYnV0ZXNbcF0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSB8fCBsKSAmJiAodSAmJiAobCAmJiB1Ll9faHRtbCA9PSBsLl9faHRtbCB8fCB1Ll9faHRtbCA9PT0gZS5pbm5lckhUTUwpIHx8IChlLmlubmVySFRNTCA9IHUgJiYgdS5fX2h0bWwgfHwgJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gKGUsIG4sIHQsIHIsIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NoaWxkcmVuJyA9PT0gYSB8fCAna2V5JyA9PT0gYSB8fCBhIGluIG4gfHwgTShlLCBhLCBudWxsLCB0W2FdLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiBuW2FdIHx8ICdjaGlsZHJlbicgPT09IGEgfHwgJ2tleScgPT09IGEgfHwgJ3ZhbHVlJyA9PT0gYSB8fCAnY2hlY2tlZCcgPT09IGEgfHwgdFthXSA9PT0gblthXSB8fCBNKGUsIGEsIG5bYV0sIHRbYV0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBmLCBkLCBvLCBzKSwgdSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uX19rID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGggPSBuLnByb3BzLmNoaWxkcmVuLCBCKGUsIEFycmF5LmlzQXJyYXkoaCkgPyBoIDogW2hdLCBuLCB0LCByLCBvICYmICdmb3JlaWduT2JqZWN0JyAhPT0gbSwgYSwgaSwgZS5maXJzdENoaWxkLCBzKSwgbnVsbCAhPSBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoID0gYS5sZW5ndGg7IGgtLTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBhW2hdICYmIFQoYVtoXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHMgfHwgKCd2YWx1ZScgaW4gZiAmJiB2b2lkIDAgIT09IChoID0gZi52YWx1ZSkgJiYgKGggIT09IGUudmFsdWUgfHwgJ3Byb2dyZXNzJyA9PT0gbSAmJiAhaCkgJiYgTShlLCAndmFsdWUnLCBoLCBkLnZhbHVlLCAhMSksICdjaGVja2VkJyBpbiBmICYmIHZvaWQgMCAhPT0gKGggPSBmLmNoZWNrZWQpICYmIGggIT09IGUuY2hlY2tlZCAmJiBNKGUsICdjaGVja2VkJywgaCwgZC5jaGVja2VkLCAhMSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEooZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBlKG4pIDogZS5jdXJyZW50ID0gbjsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF8uX19lKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFgoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBvLCBhOwogICAgICAgICAgICAgICAgICAgIGlmIChfLnVubW91bnQgJiYgXy51bm1vdW50KGUpLCAociA9IGUucmVmKSAmJiAoci5jdXJyZW50ICYmIHIuY3VycmVudCAhPT0gZS5fX2UgfHwgSihyLCBudWxsLCBuKSksIHQgfHwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS50eXBlIHx8ICh0ID0gbnVsbCAhPSAobyA9IGUuX19lKSksIGUuX19lID0gZS5fX2QgPSB2b2lkIDAsIG51bGwgIT0gKHIgPSBlLl9fYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuY29tcG9uZW50V2lsbFVubW91bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY29tcG9uZW50V2lsbFVubW91bnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLl9fZShlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgci5iYXNlID0gci5fX1AgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAociA9IGUuX19rKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgci5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbYV0gJiYgWChyW2FdLCBuLCB0KTsKICAgICAgICAgICAgICAgICAgICBudWxsICE9IG8gJiYgVChvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEsoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKGUsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGE7CiAgICAgICAgICAgICAgICAgICAgXy5fXyAmJiBfLl9fKGUsIG4pLCBvID0gKHIgPSAnZnVuY3Rpb24nID09IHR5cGVvZiB0KSA/IG51bGwgOiB0ICYmIHQuX19rIHx8IG4uX19rLCBhID0gW10sICQobiwgZSA9ICghciAmJiB0IHx8IG4pLl9fayA9IHEoSSwgbnVsbCwgW2VdKSwgbyB8fCB3LCB3LCB2b2lkIDAgIT09IG4ub3duZXJTVkdFbGVtZW50LCAhciAmJiB0ID8gW3RdIDogbyA/IG51bGwgOiBuLmZpcnN0Q2hpbGQgPyBTLnNsaWNlLmNhbGwobi5jaGlsZE5vZGVzKSA6IG51bGwsIGEsICFyICYmIHQgPyB0IDogbyA/IG8uX19lIDogbi5maXJzdENoaWxkLCByKSwgWShhLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFooZSwgbikgewogICAgICAgICAgICAgICAgICAgIFEoZSwgbiwgWik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBlZShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGEsIGkgPSBhcmd1bWVudHMsIHMgPSBQKHt9LCBlLnByb3BzKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleScgPT0gYSA/IHIgPSBuW2FdIDogJ3JlZicgPT0gYSA/IG8gPSBuW2FdIDogc1thXSA9IG5bYV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAzKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSBbdF0sIGEgPSAzOyBhIDwgYXJndW1lbnRzLmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGlbYV0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQgJiYgKHMuY2hpbGRyZW4gPSB0KSwgQShlLnR5cGUsIHMsIHIgfHwgZS5rZXksIG8gfHwgZS5yZWYsIG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbmUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBfX2M6IG4gPSAnX19jQycgKyBrKyssCiAgICAgICAgICAgICAgICAgICAgICAgIF9fOiBlLAogICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lcjogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNoaWxkcmVuKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2hpbGRDb250ZXh0IHx8ICh0ID0gW10sIChyID0ge30pW25dID0gdGhpcywgdGhpcy5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy52YWx1ZSAhPT0gZS52YWx1ZSAmJiB0LnNvbWUoVSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnN1YiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jb21wb25lbnRXaWxsVW5tb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNwbGljZSh0LmluZGV4T2YoZSksIDEpLCBuICYmIG4uY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuY2hpbGRyZW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LlByb3ZpZGVyLl9fID0gdC5Db25zdW1lci5jb250ZXh0VHlwZSA9IHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfID0gewogICAgICAgICAgICAgICAgICAgIF9fZTogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgciwgbzsgbiA9IG4uX187KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID0gbi5fX2MpICYmICF0Ll9fKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociA9IHQuY29uc3RydWN0b3IpICYmIG51bGwgIT0gci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiYgKHQuc2V0U3RhdGUoci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IoZSkpLCBvID0gdC5fX2QpLCBudWxsICE9IHQuY29tcG9uZW50RGlkQ2F0Y2ggJiYgKHQuY29tcG9uZW50RGlkQ2F0Y2goZSksIG8gPSB0Ll9fZCksIG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5fX0UgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgX192OiAwCiAgICAgICAgICAgICAgICB9LCBPLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgdCA9IG51bGwgIT0gdGhpcy5fX3MgJiYgdGhpcy5fX3MgIT09IHRoaXMuc3RhdGUgPyB0aGlzLl9fcyA6IHRoaXMuX19zID0gUCh7fSwgdGhpcy5zdGF0ZSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgKGUgPSBlKFAoe30sIHQpLCB0aGlzLnByb3BzKSksIGUgJiYgUCh0LCBlKSwgbnVsbCAhPSBlICYmIHRoaXMuX192ICYmIChuICYmIHRoaXMuX19oLnB1c2gobiksIFUodGhpcykpOwogICAgICAgICAgICAgICAgfSwgTy5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX192ICYmICh0aGlzLl9fZSA9ICEwLCBlICYmIHRoaXMuX19oLnB1c2goZSksIFUodGhpcykpOwogICAgICAgICAgICAgICAgfSwgTy5wcm90b3R5cGUucmVuZGVyID0gSSwgeCA9IFtdLCBFID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgUHJvbWlzZSA/IFByb21pc2UucHJvdG90eXBlLnRoZW4uYmluZChQcm9taXNlLnJlc29sdmUoKSkgOiBzZXRUaW1lb3V0LCBELl9fciA9IDAsIGsgPSAwOwogICAgICAgICAgICAgICAgdmFyIHRlLCByZSwgb2UsIGFlID0gMCwgaWUgPSBbXSwgc2UgPSBfLl9fYiwgY2UgPSBfLl9fciwgbGUgPSBfLmRpZmZlZCwgdWUgPSBfLl9fYywgcGUgPSBfLnVubW91bnQ7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgXy5fX2ggJiYgXy5fX2gocmUsIGUsIGFlIHx8IG4pLCBhZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByZS5fX0ggfHwgKHJlLl9fSCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgX186IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBfX2g6IFtdCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPj0gdC5fXy5sZW5ndGggJiYgdC5fXy5wdXNoKHt9KSwgdC5fX1tlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWUgPSAxLCBtZShTZSwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtZShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBkZSh0ZSsrLCAyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci50ID0gZSwgci5fX2MgfHwgKHIuX18gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0KG4pIDogU2Uodm9pZCAwLCBuKSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci50KHIuX19bMF0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fX1swXSAhPT0gbiAmJiAoci5fXyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuX19bMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHIuX19jLnNldFN0YXRlKHt9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLCByLl9fYyA9IHJlKSwgci5fXzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhlKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRlKHRlKyssIDMpOwogICAgICAgICAgICAgICAgICAgICFfLl9fcyAmJiB3ZSh0Ll9fSCwgbikgJiYgKHQuX18gPSBlLCB0Ll9fSCA9IG4sIHJlLl9fSC5fX2gucHVzaCh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkZSh0ZSsrLCA0KTsKICAgICAgICAgICAgICAgICAgICAhXy5fX3MgJiYgd2UodC5fX0gsIG4pICYmICh0Ll9fID0gZSwgdC5fX0ggPSBuLCByZS5fX2gucHVzaCh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5ZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFlID0gNSwgdmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjdXJyZW50OiBlIH07CiAgICAgICAgICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdmUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZGUodGUrKywgNyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHQuX19ILCBuKSAmJiAodC5fXyA9IGUoKSwgdC5fX0ggPSBuLCB0Ll9faCA9IGUpLCB0Ll9fOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYmUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhZSA9IDgsIHZlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfZShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByZS5jb250ZXh0W2UuX19jXSwgdCA9IGRlKHRlKyssIDkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ll9fYyA9IGUsIG4gPyAobnVsbCA9PSB0Ll9fICYmICh0Ll9fID0gITAsIG4uc3ViKHJlKSksIG4ucHJvcHMudmFsdWUpIDogZS5fXzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhlKCkgewogICAgICAgICAgICAgICAgICAgIGllLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuX19QKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fSC5fX2guZm9yRWFjaChDZSksIGUuX19ILl9faC5mb3JFYWNoKGtlKSwgZS5fX0guX19oID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fX0guX19oID0gW10sIF8uX19lKG4sIGUuX192KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgaWUgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF8uX19iID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZSA9IG51bGwsIHNlICYmIHNlKGUpOwogICAgICAgICAgICAgICAgfSwgXy5fX3IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGNlICYmIGNlKGUpLCB0ZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAocmUgPSBlLl9fYykuX19IOwogICAgICAgICAgICAgICAgICAgIG4gJiYgKG4uX19oLmZvckVhY2goQ2UpLCBuLl9faC5mb3JFYWNoKGtlKSwgbi5fX2ggPSBbXSk7CiAgICAgICAgICAgICAgICB9LCBfLmRpZmZlZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgbGUgJiYgbGUoZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLl9fYzsKICAgICAgICAgICAgICAgICAgICBuICYmIG4uX19IICYmIG4uX19ILl9faC5sZW5ndGggJiYgKDEgIT09IGllLnB1c2gobikgJiYgb2UgPT09IF8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8ICgob2UgPSBfLnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHIpLCBFZSAmJiBjYW5jZWxBbmltYXRpb25GcmFtZShuKSwgc2V0VGltZW91dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBzZXRUaW1lb3V0KHQsIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIEVlICYmIChuID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpKTsKICAgICAgICAgICAgICAgICAgICB9KSh4ZSkpLCByZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIH0sIF8uX19jID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBuLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19oLmZvckVhY2goQ2UpLCBlLl9faCA9IGUuX19oLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5fXyB8fCBrZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9faCAmJiAoZS5fX2ggPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbiA9IFtdLCBfLl9fZSh0LCBlLl9fdik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgdWUgJiYgdWUoZSwgbik7CiAgICAgICAgICAgICAgICB9LCBfLnVubW91bnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHBlICYmIHBlKGUpOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5fX2M7CiAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgbi5fX0gpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLl9fSC5fXy5mb3JFYWNoKENlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5fX2UoZSwgbi5fX3YpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIEVlID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQ2UoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gcmU7CiAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5fX2MgJiYgZS5fX2MoKSwgcmUgPSBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24ga2UoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gcmU7CiAgICAgICAgICAgICAgICAgICAgZS5fX2MgPSBlLl9fKCksIHJlID0gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdlKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgZS5sZW5ndGggIT09IG4ubGVuZ3RoIHx8IG4uc29tZShmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAhPT0gZVt0XTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNlKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbiA/IG4oZSkgOiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTGUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSA9IG5bdF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQZShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ19fc291cmNlJyAhPT0gdCAmJiAhKHQgaW4gbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ19fc291cmNlJyAhPT0gciAmJiBlW3JdICE9PSBuW3JdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRlKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzID0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIChUZS5wcm90b3R5cGUgPSBuZXcgTygpKS5pc1B1cmVSZWFjdENvbXBvbmVudCA9ICEwLCBUZS5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGUodGhpcy5wcm9wcywgZSkgfHwgUGUodGhpcy5zdGF0ZSwgbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHFlID0gXy5fX2I7CiAgICAgICAgICAgICAgICBfLl9fYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS50eXBlICYmIGUudHlwZS5fX2YgJiYgZS5yZWYgJiYgKGUucHJvcHMucmVmID0gZS5yZWYsIGUucmVmID0gbnVsbCksIHFlICYmIHFlKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBBZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIHx8IDM5MTE7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJZShlKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTGUoe30sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIHIucmVmLCBlKHIsICh0ID0gbi5yZWYgfHwgdCkgJiYgKCdvYmplY3QnICE9IHR5cGVvZiB0IHx8ICdjdXJyZW50JyBpbiB0KSA/IHQgOiBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uJCR0eXBlb2YgPSBBZSwgbi5yZW5kZXIgPSBuLCBuLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0gbi5fX2YgPSAhMCwgbi5kaXNwbGF5TmFtZSA9ICdGb3J3YXJkUmVmKCcgKyAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpICsgJyknLCBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIE9lID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gZSA/IG51bGwgOiBGKEYoZSkubWFwKG4pKTsKICAgICAgICAgICAgICAgICAgICB9LCBOZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBPZSwKICAgICAgICAgICAgICAgICAgICAgICAgZm9yRWFjaDogT2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBGKGUpLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG9ubHk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSAhPT0gbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ0NoaWxkcmVuLm9ubHknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRvQXJyYXk6IEYKICAgICAgICAgICAgICAgICAgICB9LCBSZSA9IF8uX19lOwogICAgICAgICAgICAgICAgXy5fX2UgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlLnRoZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIG8gPSBuOyBvID0gby5fXzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPSBvLl9fYykgJiYgci5fX2MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gbi5fX2UgJiYgKG4uX19lID0gdC5fX2UsIG4uX19rID0gdC5fX2spLCByLl9fYyhlLCBuKTsKICAgICAgICAgICAgICAgICAgICBSZShlLCBuLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgVWUgPSBfLnVubW91bnQ7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEZSgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdSA9IDAsIHRoaXMudCA9IG51bGwsIHRoaXMuX19iID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEJlKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuX18uX19jOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIG4uX19lICYmIG4uX19lKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gamUoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51ID0gbnVsbCwgdGhpcy5vID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF8udW5tb3VudCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLl9fYzsKICAgICAgICAgICAgICAgICAgICBuICYmIG4uX19SICYmIG4uX19SKCksIG4gJiYgITAgPT09IGUuX19oICYmIChlLnR5cGUgPSBudWxsKSwgVWUgJiYgVWUoZSk7CiAgICAgICAgICAgICAgICB9LCAoRGUucHJvdG90eXBlID0gbmV3IE8oKSkuX19jID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uX19jLCByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICBudWxsID09IHIudCAmJiAoci50ID0gW10pLCByLnQucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IEJlKHIuX192KSwgYSA9ICExLCBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB8fCAoYSA9ICEwLCB0Ll9fUiA9IG51bGwsIG8gPyBvKHMpIDogcygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0Ll9fUiA9IGk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS0tci5fX3UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5zdGF0ZS5fX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByLnN0YXRlLl9fZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fX3YuX19rWzBdID0gZnVuY3Rpb24gZShuLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAobi5fX3YgPSBudWxsLCBuLl9fayA9IG4uX19rICYmIG4uX19rLm1hcChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKG4sIHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uX19jICYmIG4uX19jLl9fUCA9PT0gdCAmJiAobi5fX2UgJiYgci5pbnNlcnRCZWZvcmUobi5fX2UsIG4uX19kKSwgbi5fX2MuX19lID0gITAsIG4uX19jLl9fUCA9IHIpKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBlLl9fYy5fX1AsIGUuX19jLl9fTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoci5zZXRTdGF0ZSh7IF9fZTogci5fX2IgPSBudWxsIH0pOyBuID0gci50LnBvcCgpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mb3JjZVVwZGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBjID0gITAgPT09IG4uX19oOwogICAgICAgICAgICAgICAgICAgIHIuX191KysgfHwgYyB8fCByLnNldFN0YXRlKHsgX19lOiByLl9fYiA9IHIuX192Ll9fa1swXSB9KSwgZS50aGVuKGksIGkpOwogICAgICAgICAgICAgICAgfSwgRGUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMudCA9IFtdOwogICAgICAgICAgICAgICAgfSwgRGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX19iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9fdi5fX2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIHIgPSB0aGlzLl9fdi5fX2tbMF0uX19jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX3YuX19rWzBdID0gZnVuY3Rpb24gZShuLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgKG4uX19jICYmIG4uX19jLl9fSCAmJiAobi5fX2MuX19ILl9fLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5fX2MgJiYgZS5fX2MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5fX2MuX19IID0gbnVsbCksIG51bGwgIT0gKG4gPSBMZSh7fSwgbikpLl9fYyAmJiAobi5fX2MuX19QID09PSByICYmIChuLl9fYy5fX1AgPSB0KSwgbi5fX2MgPSBudWxsKSwgbi5fX2sgPSBuLl9fayAmJiBuLl9fay5tYXAoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUobiwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLl9fYiwgdCwgci5fX08gPSByLl9fUCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uX19lICYmIHEoSSwgbnVsbCwgZS5mYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gJiYgKG8uX19oID0gbnVsbCksIFsKICAgICAgICAgICAgICAgICAgICAgICAgcShJLCBudWxsLCBuLl9fZSA/IG51bGwgOiBlLmNoaWxkcmVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgbwogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIEZlID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKyt0WzFdID09PSB0WzBdICYmIGUuby5kZWxldGUobiksIGUucHJvcHMucmV2ZWFsT3JkZXIgJiYgKCd0JyAhPT0gZS5wcm9wcy5yZXZlYWxPcmRlclswXSB8fCAhZS5vLnNpemUpKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSBlLnU7IHQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdC5sZW5ndGggPiAzOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnBvcCgpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsxXSA8IHRbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnUgPSB0ID0gdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFZlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5jaGlsZHJlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEdlKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMsIHQgPSBlLmk7CiAgICAgICAgICAgICAgICAgICAgbi5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUShudWxsLCBuLmwpLCBuLmwgPSBudWxsLCBuLmkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0sIG4uaSAmJiBuLmkgIT09IHQgJiYgbi5jb21wb25lbnRXaWxsVW5tb3VudCgpLCBlLl9fdiA/IChuLmwgfHwgKG4uaSA9IHQsIG4ubCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVR5cGU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGUpLCBuLmkuYXBwZW5kQ2hpbGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hpbGROb2Rlcy5wdXNoKGUpLCBuLmkuYXBwZW5kQ2hpbGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlsZE5vZGVzLnNwbGljZSh0aGlzLmNoaWxkTm9kZXMuaW5kZXhPZihlKSA+Pj4gMSwgMSksIG4uaS5yZW1vdmVDaGlsZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCBRKHEoVmUsIHsgY29udGV4dDogbi5jb250ZXh0IH0sIGUuX192KSwgbi5sKSkgOiBuLmwgJiYgbi5jb21wb25lbnRXaWxsVW5tb3VudCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKGplLnByb3RvdHlwZSA9IG5ldyBPKCkpLl9fZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCB0ID0gQmUobi5fX3YpLCByID0gbi5vLmdldChlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gclswXSsrLCBmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHJvcHMucmV2ZWFsT3JkZXIgPyAoci5wdXNoKG8pLCBGZShuLCBlLCByKSkgOiBvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0KGEpIDogYSgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBqZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnUgPSBudWxsLCB0aGlzLm8gPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBGKGUuY2hpbGRyZW4pOwogICAgICAgICAgICAgICAgICAgIGUucmV2ZWFsT3JkZXIgJiYgJ2InID09PSBlLnJldmVhbE9yZGVyWzBdICYmIG4ucmV2ZXJzZSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBuLmxlbmd0aDsgdC0tOykKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vLnNldChuW3RdLCB0aGlzLnUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudQogICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jaGlsZHJlbjsKICAgICAgICAgICAgICAgIH0sIGplLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBqZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHRoaXMuby5mb3JFYWNoKGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZlKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBNZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLmZvciAmJiBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykgfHwgNjAxMDMsIHplID0gL14oPzphY2NlbnR8YWxpZ25tZW50fGFyYWJpY3xiYXNlbGluZXxjYXB8Y2xpcCg/IVBhdGhVKXxjb2xvcnxmaWxsfGZsb29kfGZvbnR8Z2x5cGgoPyFSKXxob3JpenxtYXJrZXIoPyFIfFd8VSl8b3ZlcmxpbmV8cGFpbnR8c3RvcHxzdHJpa2V0aHJvdWdofHN0cm9rZXx0ZXh0KD8hTCl8dW5kZXJsaW5lfHVuaWNvZGV8dW5pdHN8dnx2ZWN0b3J8dmVydHx3b3JkfHdyaXRpbmd8eCg/IUMpKVtBLVpdLywgSGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbCgpID8gL2ZpbHxjaGV8cmFkL2kgOiAvZmlsfGNoZXxyYS9pKS50ZXN0KGUpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge30sIFsKICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50V2lsbE1vdW50JywKICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsCiAgICAgICAgICAgICAgICAgICAgJ2NvbXBvbmVudFdpbGxVcGRhdGUnCiAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoTy5wcm90b3R5cGUsIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1snVU5TQUZFXycgKyBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyICRlID0gXy5ldmVudDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFllKCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gV2UoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuY2VsQnViYmxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSmUoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFByZXZlbnRlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF8uZXZlbnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkZSAmJiAoZSA9ICRlKGUpKSwgZS5wZXJzaXN0ID0gWWUsIGUuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBXZSwgZS5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBKZSwgZS5uYXRpdmVFdmVudCA9IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIFhlLCBLZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFFlID0gXy52bm9kZTsKICAgICAgICAgICAgICAgIF8udm5vZGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS50eXBlLCB0ID0gZS5wcm9wcywgciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gKHIgPSB7fSwgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdFtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZScgPT09IG8gJiYgJ2RlZmF1bHRWYWx1ZScgaW4gdCAmJiBudWxsID09IGEgfHwgKCdkZWZhdWx0VmFsdWUnID09PSBvICYmICd2YWx1ZScgaW4gdCAmJiBudWxsID09IHQudmFsdWUgPyBvID0gJ3ZhbHVlJyA6ICdkb3dubG9hZCcgPT09IG8gJiYgITAgPT09IGEgPyBhID0gJycgOiAvb25kb3VibGVjbGljay9pLnRlc3QobykgPyBvID0gJ29uZGJsY2xpY2snIDogL15vbmNoYW5nZSh0ZXh0YXJlYXxpbnB1dCkvaS50ZXN0KG8gKyBuKSAmJiAhSGUodC50eXBlKSA/IG8gPSAnb25pbnB1dCcgOiAvXm9uKEFuaXxUcmF8VG91fEJlZm9yZUlucCkvLnRlc3QobykgPyBvID0gby50b0xvd2VyQ2FzZSgpIDogemUudGVzdChvKSA/IG8gPSBvLnJlcGxhY2UoL1tBLVowLTldLywgJy0kJicpLnRvTG93ZXJDYXNlKCkgOiBudWxsID09PSBhICYmIChhID0gdm9pZCAwKSwgcltvXSA9IGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICdzZWxlY3QnID09IG4gJiYgci5tdWx0aXBsZSAmJiBBcnJheS5pc0FycmF5KHIudmFsdWUpICYmIChyLnZhbHVlID0gRih0LmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByb3BzLnNlbGVjdGVkID0gLTEgIT0gci52YWx1ZS5pbmRleE9mKGUucHJvcHMudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksICdzZWxlY3QnID09IG4gJiYgbnVsbCAhPSByLmRlZmF1bHRWYWx1ZSAmJiAoci52YWx1ZSA9IEYodC5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcm9wcy5zZWxlY3RlZCA9IHIubXVsdGlwbGUgPyAtMSAhPSByLmRlZmF1bHRWYWx1ZS5pbmRleE9mKGUucHJvcHMudmFsdWUpIDogci5kZWZhdWx0VmFsdWUgPT0gZS5wcm9wcy52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBlLnByb3BzID0gcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbiAmJiB0LmNsYXNzICE9IHQuY2xhc3NOYW1lICYmIChLZS5lbnVtZXJhYmxlID0gJ2NsYXNzTmFtZScgaW4gdCwgbnVsbCAhPSB0LmNsYXNzTmFtZSAmJiAoci5jbGFzcyA9IHQuY2xhc3NOYW1lKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsICdjbGFzc05hbWUnLCBLZSkpLCBlLiQkdHlwZW9mID0gTWUsIFFlICYmIFFlKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBaZSA9IF8uX19yOwogICAgICAgICAgICAgICAgXy5fX3IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIFplICYmIFplKGUpLCBYZSA9IGUuX19jOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBlbiA9IHsKICAgICAgICAgICAgICAgICAgICBSZWFjdEN1cnJlbnREaXNwYXRjaGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYZS5fX25bZS5fX2NdLnByb3BzLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiBwZXJmb3JtYW5jZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBwZXJmb3JtYW5jZS5ub3cgJiYgcGVyZm9ybWFuY2Uubm93LmJpbmQocGVyZm9ybWFuY2UpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbm4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgZS4kJHR5cGVvZiA9PT0gTWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVN0YXRlOiBmZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlUmVkdWNlcjogbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUVmZmVjdDogaGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUxheW91dEVmZmVjdDogZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVJlZjogeWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZSA9IDYsIGdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gZShuKCkpIDogZSAmJiAoZS5jdXJyZW50ID0gbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwgPT0gdCA/IHQgOiB0LmNvbmNhdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZU1lbW86IHZlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VDYWxsYmFjazogYmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNvbnRleHQ6IF9lLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgXy51c2VEZWJ1Z1ZhbHVlICYmIF8udXNlRGVidWdWYWx1ZShuID8gbihlKSA6IGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMTYuOC4wJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRyZW46IE5lLAogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBuLl9fayAmJiAobi50ZXh0Q29udGVudCA9ICcnKSwgUShlLCBuKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCAmJiB0KCksIGUgPyBlLl9fYyA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGh5ZHJhdGU6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWihlLCBuKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCAmJiB0KCksIGUgPyBlLl9fYyA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlLl9fayAmJiAoUShudWxsLCBlKSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVQb3J0YWw6IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcShHZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWxlbWVudDogcSwKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ29udGV4dDogbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS5iaW5kKG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjbG9uZUVsZW1lbnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm4oZSkgPyBlZS5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVmOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjdXJyZW50OiBudWxsIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50OiBJLAogICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkRWxlbWVudDogbm4sCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRET01Ob2RlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKGUuYmFzZSB8fCAxID09PSBlLm5vZGVUeXBlICYmIGUpIHx8IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudDogTywKICAgICAgICAgICAgICAgICAgICAgICAgUHVyZUNvbXBvbmVudDogVGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW86IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMucHJvcHMucmVmLCByID0gdCA9PSBlLnJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXIgJiYgdCAmJiAodC5jYWxsID8gdChudWxsKSA6IHQuY3VycmVudCA9IG51bGwpLCBuID8gIW4odGhpcy5wcm9wcywgZSkgfHwgIXIgOiBQZSh0aGlzLnByb3BzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHQsIHEoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5kaXNwbGF5TmFtZSA9ICdNZW1vKCcgKyAoZS5kaXNwbGF5TmFtZSB8fCBlLm5hbWUpICsgJyknLCByLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0gITAsIHIuX19mID0gITAsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRSZWY6IEllLAogICAgICAgICAgICAgICAgICAgICAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTdHJpY3RNb2RlOiBJLAogICAgICAgICAgICAgICAgICAgICAgICBTdXNwZW5zZTogRGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1c3BlbnNlTGlzdDogamUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxhenk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8obykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIHx8IChuID0gZSgpKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZS5kZWZhdWx0IHx8IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxKHQsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uZGlzcGxheU5hbWUgPSAnTGF6eScsIG8uX19mID0gITAsIG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEOiBlbgogICAgICAgICAgICAgICAgICAgIH0sIHJuID0gdCgxKSwgb24gPSB0Lm4ocm4pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYW4oZSwgbiwgdCwgciwgbywgYSwgaSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZVthXShpKSwgYyA9IHMudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0KGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzLmRvbmUgPyBuKGMpIDogUHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4ociwgbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCB0ID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHIsIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZS5hcHBseShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuKGEsIHIsIG8sIGksIHMsICduZXh0JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbihhLCByLCBvLCBpLCBzLCAndGhyb3cnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkodm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRUYWcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAwID09PSBuLnRhZ3MubGVuZ3RoID8gbi5wcmVwZW5kID8gbi5jb250YWluZXIuZmlyc3RDaGlsZCA6IG4uYmVmb3JlIDogbi50YWdzW24udGFncy5sZW5ndGggLSAxXS5uZXh0U2libGluZywgbi5jb250YWluZXIuaW5zZXJ0QmVmb3JlKGUsIHQpLCBuLnRhZ3MucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuaXNTcGVlZHkgPSB2b2lkIDAgPT09IGUuc3BlZWR5IHx8IGUuc3BlZWR5LCB0aGlzLnRhZ3MgPSBbXSwgdGhpcy5jdHIgPSAwLCB0aGlzLm5vbmNlID0gZS5ub25jZSwgdGhpcy5rZXkgPSBlLmtleSwgdGhpcy5jb250YWluZXIgPSBlLmNvbnRhaW5lciwgdGhpcy5wcmVwZW5kID0gZS5wcmVwZW5kLCB0aGlzLmJlZm9yZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaHlkcmF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2godGhpcy5faW5zZXJ0VGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5pbnNlcnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHIgJSAodGhpcy5pc1NwZWVkeSA/IDY1MDAwIDogMSkgPT09IDAgJiYgdGhpcy5faW5zZXJ0VGFnKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnNldEF0dHJpYnV0ZSgncWMtZGF0YS1lbW90aW9uJywgZS5rZXkpLCB2b2lkIDAgIT09IGUubm9uY2UgJiYgbi5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgZS5ub25jZSksIG4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpKSwgbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtcycsICcnKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odGhpcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLnRhZ3NbdGhpcy50YWdzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTcGVlZHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnNoZWV0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2hlZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuc3R5bGVTaGVldHNbbl0ub3duZXJOb2RlID09PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5zdHlsZVNoZWV0c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW5zZXJ0UnVsZShlLCB0LmNzc1J1bGVzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdHIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5mbHVzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFncy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnRhZ3MgPSBbXSwgdGhpcy5jdHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgbG4gPSAnLXdlYmtpdC0nLCB1biA9IE1hdGguYWJzLCBwbiA9IFN0cmluZy5mcm9tQ2hhckNvZGU7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHJpbSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UobiwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtbihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaW5kZXhPZihuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhuKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCB8IGUuY2hhckNvZGVBdChuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGduKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zbGljZShuLCB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHluKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2bihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYm4oZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnB1c2goZSksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBfbihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKG4pLmpvaW4oJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHhuID0gMSwgRW4gPSAxLCBDbiA9IDAsIGtuID0gMCwgd24gPSAwLCBTbiA9ICcnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTG4oZSwgbiwgdCwgciwgbywgYSwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICByb290OiBuLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogYSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZTogeG4sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogRW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOiAnJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQbihlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExuKGUsIG4ucm9vdCwgbi5wYXJlbnQsIHQsIG4ucHJvcHMsIG4uY2hpbGRyZW4sIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVG4oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHduID0ga24gPCBDbiA/IGhuKFNuLCBrbisrKSA6IDAsIEVuKyssIDEwID09PSB3biAmJiAoRW4gPSAxLCB4bisrKSwgd247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxbigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG4oU24sIGtuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFuKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBrbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEluKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ24oU24sIGUsIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gT24oZSkgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDY0OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMTI2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgOTE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA5MzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTm4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4biA9IEVuID0gMSwgQ24gPSB5bihTbiA9IGUpLCBrbiA9IDAsIFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUm4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBTbiA9ICcnLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVW4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkbihJbihrbiAtIDEsIGZ1bmN0aW9uIGUobikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgVG4oKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHduKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoMzQgPT09IG4gfHwgMzkgPT09IG4gPyBuIDogd24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSA9PT0gbiAmJiBlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga247CiAgICAgICAgICAgICAgICAgICAgfSg5MSA9PT0gZSA/IGUgKyAyIDogNDAgPT09IGUgPyBlICsgMSA6IGUpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEbihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7ICh3biA9IHFuKCkpICYmIHduIDwgMzM7KQogICAgICAgICAgICAgICAgICAgICAgICBUbigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbihlKSA+IDIgfHwgT24od24pID4gMyA/ICcnIDogJyAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQm4oZSwgbikgewogICAgICAgICAgICAgICAgICAgIGZvciAoOyBUbigpICYmIGUgKyB3biAhPT0gNTcgJiYgKGUgKyB3biAhPT0gODQgfHwgNDcgIT09IHFuKCkpOyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvKicgKyBJbihuLCBrbiAtIDEpICsgJyonICsgcG4oNDcgPT09IGUgPyBlIDogVG4oKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqbihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7ICFPbihxbigpKTspCiAgICAgICAgICAgICAgICAgICAgICAgIFRuKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEluKGUsIGtuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZuKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUm4oZnVuY3Rpb24gZShuLCB0LCByLCBvLCBhLCBpLCBzLCBjLCBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gMCwgcCA9IDAsIGQgPSBzLCBmID0gMCwgbSA9IDAsIGggPSAwLCBnID0gMSwgeSA9IDEsIHYgPSAxLCBiID0gMCwgXyA9ICcnLCB4ID0gYSwgRSA9IGksIEMgPSBvLCBrID0gXzsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoID0gYiwgYiA9IFRuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayArPSBVbihiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrICs9IERuKGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHFuKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuKEduKEJuKFRuKCksIEFuKCkpLCB0LCByKSwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgKz0gJy8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTIzICogZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW3UrK10gPSB5bihrKSAqIHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNSAqIGc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OSArIHA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPiAwICYmIHluKGspIC0gZCAmJiBibihtID4gMzIgPyBNbihrICsgJzsnLCBvLCByLCBkIC0gMSkgOiBNbihmbihrLCAnICcsICcnKSArICc7JywgbywgciwgZCAtIDIpLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayArPSAnOyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJuKEMgPSBWbihrLCB0LCByLCB1LCBwLCBhLCBjLCBfLCB4ID0gW10sIEUgPSBbXSwgZCksIGkpLCAxMjMgPT09IGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGssIHQsIEMsIEMsIHgsIGksIGQsIGMsIEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG4sIEMsIEMsIG8gJiYgYm4oVm4obiwgQywgQywgMCwgMCwgYSwgYywgXywgYSwgeCA9IFtdLCBkKSwgRSksIGEsIEUsIGQsIGMsIG8gPyB4IDogRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoaywgQywgQywgQywgWycnXSwgRSwgZCwgYywgRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gcCA9IG0gPSAwLCBnID0gdiA9IDEsIF8gPSBrID0gJycsIGQgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gMSArIHluKGspLCBtID0gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChrICs9IHBuKGIpLCBiICogZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBwID4gMCA/IDEgOiAoayArPSAnXGYnLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbdSsrXSA9ICh5bihrKSAtIDEpICogdiwgdiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ID09PSBxbigpICYmIChrICs9IFVuKFRuKCkpKSwgZiA9IHFuKCksIHAgPSB5bihfID0gayArPSBqbihBbigpKSksIGIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUgPT09IGggJiYgMiA9PSB5bihrKSAmJiAoZyA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSgnJywgbnVsbCwgbnVsbCwgbnVsbCwgWycnXSwgZSA9IE5uKGUpLCAwLCBbMF0sIGUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFZuKGUsIG4sIHQsIHIsIG8sIGEsIGksIHMsIGMsIGwsIHUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gbyAtIDEsIGQgPSAwID09PSBvID8gYSA6IFsnJ10sIGYgPSB2bihkKSwgbSA9IDAsIGggPSAwLCBnID0gMDsgbSA8IHI7ICsrbSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDAsIHYgPSBnbihlLCBwICsgMSwgcCA9IHVuKGggPSBpW21dKSksIGIgPSBlOyB5IDwgZjsgKyt5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGIgPSBkbihoID4gMCA/IGRbeV0gKyAnICcgKyB2IDogZm4odiwgLyZcZi9nLCBkW3ldKSkpICYmIChjW2crK10gPSBiKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG4oZSwgbiwgdCwgMCA9PT0gbyA/ICdydWxlJyA6IHMsIGMsIGwsIHUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gR24oZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBMbihlLCBuLCB0LCAnY29tbScsIHBuKHduKSwgZ24oZSwgMiwgLTIpLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE1uKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG4oZSwgbiwgdCwgJ2RlY2wnLCBnbihlLCAwLCByKSwgZ24oZSwgciArIDEsIC0xKSwgcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6bihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgoKChuIDw8IDIgXiBobih0ID0gZSwgMCkpIDw8IDIgXiBobih0LCAxKSkgPDwgMiBeIGhuKHQsIDIpKSA8PCAyIF4gaG4odCwgMykpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU3Mzc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjAxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzE3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDM0MzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjQxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ1NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI5MjE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTcyOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjM1NjoKICAgICAgICAgICAgICAgICAgICBjYXNlIDU4NDQ6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzMTkxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjY0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDMwMDU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MzkxOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTg3OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDU2MjM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2MTM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDU5OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4NTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjE1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjM4OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDUxMDk6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzY1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTYyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDM4Mjk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyBlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTM0OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyNDY6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0ODEwOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNjk2ODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDI3NTY6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1vei0nICsgZSArICctbXMtJyArIGUgKyBlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNjgyODoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQyNjg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLScgKyBlICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDYxNjU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLWZsZXgtJyArIGUgKyBlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTE4NzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxuICsgZSArIGZuKGUsIC8oXHcrKS4rKDpbXl0rKS8sIGxuICsgJ2JveC0kMSQyLW1zLWZsZXgtJDEkMicpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU0NDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLWZsZXgtaXRlbS0nICsgZm4oZSwgL2ZsZXgtfC1zZWxmLywgJycpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2NzU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLWZsZXgtbGluZS1wYWNrJyArIGZuKGUsIC9hbGlnbi1jb250ZW50fGZsZXgtfC1zZWxmLywgJycpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU1NDg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLScgKyBmbihlLCAnc2hyaW5rJywgJ25lZ2F0aXZlJykgKyBlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNTI5MjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxuICsgZSArICctbXMtJyArIGZuKGUsICdiYXNpcycsICdwcmVmZXJyZWQtc2l6ZScpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDYwNjA6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArICdib3gtJyArIGZuKGUsICctZ3JvdycsICcnKSArIGxuICsgZSArICctbXMtJyArIGZuKGUsICdncm93JywgJ3Bvc2l0aXZlJykgKyBlOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDU1NDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxuICsgZm4oZSwgLyhbXi1dKSh0cmFuc2Zvcm0pL2csICckMScgKyBsbiArICckMicpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDYxODc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbihmbihmbihlLCAvKHpvb20tfGdyYWIpLywgbG4gKyAnJDEnKSwgLyhpbWFnZS1zZXQpLywgbG4gKyAnJDEnKSwgZSwgJycpICsgZTsKICAgICAgICAgICAgICAgICAgICBjYXNlIDU0OTU6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOTU5OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oZSwgLyhpbWFnZS1zZXRcKFteXSopLywgbG4gKyAnJDEkYCQxJyk7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTY4OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oZm4oZSwgLyguKzopKGZsZXgtKT8oLiopLywgbG4gKyAnYm94LXBhY2s6JDMtbXMtZmxleC1wYWNrOiQzJyksIC9zListYlteO10rLywgJ2p1c3RpZnknKSArIGxuICsgZSArIGU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0MDk1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzU4MzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDQwNjg6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTMyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oZSwgLyguKyktaW5saW5lKC4rKS8sIGxuICsgJyQxJDInKSArIGU7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA4MTE2OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNzA1OToKICAgICAgICAgICAgICAgICAgICBjYXNlIDU3NTM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1NTM1OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTQ0NToKICAgICAgICAgICAgICAgICAgICBjYXNlIDU3MDE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OTMzOgogICAgICAgICAgICAgICAgICAgIGNhc2UgNDY3NzoKICAgICAgICAgICAgICAgICAgICBjYXNlIDU1MzM6CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1Nzg5OgogICAgICAgICAgICAgICAgICAgIGNhc2UgNTAyMToKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3NjU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5bihlKSAtIDEgLSBuID4gNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaG4oZSwgbiArIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaG4oZSwgbiArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuKGUsIC8oLis6KSguKyktKFteXSspLywgJyQxJyArIGxuICsgJyQyLSQzJDEtbW96LScgKyAoMTA4ID09IG4gPyAnJDMnIDogJyQyLSQzJykpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB+bW4oZSwgJ3N0cmV0Y2gnKSA/IHpuKGZuKGUsICdzdHJldGNoJywgJ2ZpbGwtYXZhaWxhYmxlJyksIG4pICsgZSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNDk0OToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDExNSAhPT0gaG4oZSwgbiArIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA2NDQ0OgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhuKGUsIHluKGUpIC0gMyAtICh+bW4oZSwgJyFpbXBvcnRhbnQnKSAmJiAxMCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA3OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbihlLCBlLCBsbiArIGUpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4oZSwgLyguKzopKFteOyFdKykoO3whLispPy8sICckMScgKyBsbiArICg0NSA9PT0gaG4oZSwgMTQpID8gJ2lubGluZS0nIDogJycpICsgJ2JveCQzJDEnICsgbG4gKyAnJDIkMyQxLW1zLSQyYm94JDMnKSArIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OTM2OgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhuKGUsIG4gKyAxMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG4gKyBlICsgJy1tcy0nICsgZm4oZSwgL1tzdmhdXHcrLVt0YmxyXXsyfS8sICd0YicpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG4gKyBlICsgJy1tcy0nICsgZm4oZSwgL1tzdmhdXHcrLVt0YmxyXXsyfS8sICd0Yi1ybCcpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLScgKyBmbihlLCAvW3N2aF1cdystW3RibHJdezJ9LywgJ2xyJykgKyBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbiArIGUgKyAnLW1zLScgKyBlICsgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBIbihlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICcnLCByID0gdm4oZSksIG8gPSAwOyBvIDwgcjsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICB0ICs9IG4oZVtvXSwgbywgZSwgbikgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAkbihlLCBuLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICdAaW1wb3J0JzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWNsJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmV0dXJuID0gZS5yZXR1cm4gfHwgZS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3J1bGUnOgogICAgICAgICAgICAgICAgICAgICAgICBlLnZhbHVlID0gZS5wcm9wcy5qb2luKCcsJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB5bih0ID0gSG4oZS5jaGlsZHJlbiwgcikpID8gZS5yZXR1cm4gPSBlLnZhbHVlICsgJ3snICsgdCArICd9JyA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFluID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBXZWFrTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmhhcyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zZXQodCwgciksIHI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgV24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gblt0XSAmJiAoblt0XSA9IGUodCkpLCBuW3RdOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIEpuID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJuKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IC0xLCByID0gNDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChPbihyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzggPT09IHIgJiYgMTIgPT09IHFuKCkgJiYgKG5bdF0gPSAxKSwgZVt0XSArPSBqbihrbiAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gKz0gVW4ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQ0ID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlWysrdF0gPSA1OCA9PT0gcW4oKSA/ICcmXGYnIDogJycsIG5bdF0gPSBlW3RdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSArPSBwbihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChyID0gVG4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfShObihlKSwgbikpOwogICAgICAgICAgICAgICAgICAgIH0sIFhuID0gbmV3IFdlYWtNYXAoKSwgS24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3J1bGUnID09PSBlLnR5cGUgJiYgZS5wYXJlbnQgJiYgZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBlLnZhbHVlLCB0ID0gZS5wYXJlbnQsIHIgPSBlLmNvbHVtbiA9PT0gdC5jb2x1bW4gJiYgZS5saW5lID09PSB0LmxpbmU7ICdydWxlJyAhPT0gdC50eXBlOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gdC5wYXJlbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKDEgIT09IGUucHJvcHMubGVuZ3RoIHx8IDU4ID09PSBuLmNoYXJDb2RlQXQoMCkgfHwgWG4uZ2V0KHQpKSAmJiAhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhuLnNldChlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IFtdLCBhID0gSm4obiwgbyksIGkgPSB0LnByb3BzLCBzID0gMCwgYyA9IDA7IHMgPCBhLmxlbmd0aDsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGkubGVuZ3RoOyBsKyssIGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJvcHNbY10gPSBvW3NdID8gYVtzXS5yZXBsYWNlKC8mXGYvZywgaVtsXSkgOiBpW2xdICsgJyAnICsgYVtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFFuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdkZWNsJyA9PT0gZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDggPT09IG4uY2hhckNvZGVBdCgwKSAmJiA5OCA9PT0gbi5jaGFyQ29kZUF0KDIpICYmIChlLnJldHVybiA9ICcnLCBlLnZhbHVlID0gJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgWm4gPSBbZnVuY3Rpb24gKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5yZXR1cm4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZWNsJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXR1cm4gPSB6bihlLnZhbHVlLCBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0BrZXlmcmFtZXMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSG4oW1BuKGZuKGUudmFsdWUsICdAJywgJ0AnICsgbG4pLCBlLCAnJyldLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdydWxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9uKGUucHJvcHMsIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgodCA9IC8oOjpwbGFjXHcrfDpyZWFkLVx3KykvLmV4ZWModCA9IG4pKSA/IHRbMF0gOiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOnJlYWQtb25seSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOnJlYWQtd3JpdGUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSG4oW1BuKGZuKG4sIC86KHJlYWQtXHcrKS8sICc6LW1vei0kMScpLCBlLCAnJyldLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc6OnBsYWNlaG9sZGVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhuKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBuKGZuKG4sIC86KHBsYWNcdyspLywgJzonICsgbG4gKyAnaW5wdXQtJDEnKSwgZSwgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG4oZm4obiwgLzoocGxhY1x3KykvLCAnOi1tb3otJDEnKSwgZSwgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG4oZm4obiwgLzoocGxhY1x3KykvLCAnLW1zLWlucHV0LSQxJyksIGUsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwgZXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUua2V5OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2NzcycgPT09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGVbcWMtZGF0YS1lbW90aW9uXTpub3QoW2RhdGEtc10pJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKHQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChlKSwgZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcycsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5zdHlsaXNQbHVnaW5zIHx8IFpuOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgaSA9IHt9LCBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBlLmNvbnRhaW5lciB8fCBkb2N1bWVudC5oZWFkLCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlW3FjLWRhdGEtZW1vdGlvbl0nKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5nZXRBdHRyaWJ1dGUoJ3FjLWRhdGEtZW1vdGlvbicpLnNwbGl0KCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodFswXSA9PT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAxOyByIDwgdC5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVt0W3JdXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCBsLCB1ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pbnNlcnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yb290IHx8IChlID0gZS5yZXR1cm4pICYmIGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdm4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCByLCBvLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAnJywgcyA9IDA7IHMgPCBuOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IGVbc10odCwgciwgbywgYSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQociwgdSkpOwogICAgICAgICAgICAgICAgICAgICAgICBhID0gZnVuY3Rpb24gKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0LCBIbihGbihlID8gZSArICd7JyArIG4uc3R5bGVzICsgJ30nIDogbi5zdHlsZXMpLCBwKSwgciAmJiAoZC5pbnNlcnRlZFtuLm5hbWVdID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0OiBuZXcgY24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uY2U6IGUubm9uY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWR5OiBlLnNwZWVkeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiBlLnByZXBlbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uY2U6IGUubm9uY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQ6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0OiBhCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnNoZWV0Lmh5ZHJhdGUocyksIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG50KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobnQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAxOyBuIDwgYXJndW1lbnRzLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKGVbcl0gPSB0W3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdCg0KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHR0KGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGVbdF0gPyBuLnB1c2goZVt0XSArICc7JykgOiByICs9IHQgKyAnICc7CiAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcnQgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5rZXkgKyAnLScgKyBuLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCExID09PSB0ICYmIHZvaWQgMCA9PT0gZS5yZWdpc3RlcmVkW3JdICYmIChlLnJlZ2lzdGVyZWRbcl0gPSBuLnN0eWxlcyksIHZvaWQgMCA9PT0gZS5pbnNlcnRlZFtuLm5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbnNlcnQobiA9PT0gbyA/ICcuJyArIHIgOiAnJywgbywgZS5zaGVldCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IG8ubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodm9pZCAwICE9PSBvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIG90ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgdCA9IDAsIHIgPSAwLCBvID0gZS5sZW5ndGg7IG8gPj0gNDsgKytyLCBvIC09IDQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIChuID0gMjU1ICYgZS5jaGFyQ29kZUF0KHIpIHwgKDI1NSAmIGUuY2hhckNvZGVBdCgrK3IpKSA8PCA4IHwgKDI1NSAmIGUuY2hhckNvZGVBdCgrK3IpKSA8PCAxNiB8ICgyNTUgJiBlLmNoYXJDb2RlQXQoKytyKSkgPDwgMjQpKSArICg1OTc5NyAqIChuID4+PiAxNikgPDwgMTYpLCB0ID0gMTU0MDQ4MzQ3NyAqICg2NTUzNSAmIChuIF49IG4gPj4+IDI0KSkgKyAoNTk3OTcgKiAobiA+Pj4gMTYpIDw8IDE2KSBeIDE1NDA0ODM0NzcgKiAoNjU1MzUgJiB0KSArICg1OTc5NyAqICh0ID4+PiAxNikgPDwgMTYpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCBePSAoMjU1ICYgZS5jaGFyQ29kZUF0KHIgKyAyKSkgPDwgMTY7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgXj0gKDI1NSAmIGUuY2hhckNvZGVBdChyICsgMSkpIDw8IDg7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAxNTQwNDgzNDc3ICogKDY1NTM1ICYgKHQgXj0gMjU1ICYgZS5jaGFyQ29kZUF0KHIpKSkgKyAoNTk3OTcgKiAodCA+Pj4gMTYpIDw8IDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgodCA9IDE1NDA0ODM0NzcgKiAoNjU1MzUgJiAodCBePSB0ID4+PiAxMykpICsgKDU5Nzk3ICogKHQgPj4+IDE2KSA8PCAxNikpIF4gdCA+Pj4gMTUpID4+PiAwKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgfSwgYXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJJbWFnZU91dHNldDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVySW1hZ2VTbGljZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVySW1hZ2VXaWR0aDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgYm94RmxleDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgYm94RmxleEdyb3VwOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBib3hPcmRpbmFsR3JvdXA6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNvdW50OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBmbGV4OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBmbGV4R3JvdzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZmxleFBvc2l0aXZlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBmbGV4U2hyaW5rOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBmbGV4TmVnYXRpdmU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGZsZXhPcmRlcjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFJvdzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFJvd0VuZDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZFJvd1NwYW46IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRSb3dTdGFydDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtbjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtbkVuZDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZENvbHVtblNwYW46IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRDb2x1bW5TdGFydDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgbXNHcmlkUm93OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBtc0dyaWRSb3dTcGFuOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBtc0dyaWRDb2x1bW46IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIG1zR3JpZENvbHVtblNwYW46IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBvcnBoYW5zOiAxLAogICAgICAgICAgICAgICAgICAgICAgICB0YWJTaXplOiAxLAogICAgICAgICAgICAgICAgICAgICAgICB3aWRvd3M6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgV2Via2l0TGluZUNsYW1wOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZmxvb2RPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdG9wT3BhY2l0eTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlRGFzaGFycmF5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VEYXNob2Zmc2V0OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VNaXRlcmxpbWl0OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VPcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMQogICAgICAgICAgICAgICAgICAgIH0sIGl0ID0gL1tBLVpdfF5tcy9nLCBzdCA9IC9fRU1PXyhbXl9dKz8pXyhbXl0qPylfRU1PXy9nLCBjdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0NSA9PT0gZS5jaGFyQ29kZUF0KDEpOwogICAgICAgICAgICAgICAgICAgIH0sIGx0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAnYm9vbGVhbicgIT09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHV0ID0gV24oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN0KGUpID8gZSA6IGUucmVwbGFjZShpdCwgJy0kJicpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSksIHB0ID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FuaW1hdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FuaW1hdGlvbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5yZXBsYWNlKHN0LCBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gYXRbZV0gfHwgY3QoZSkgfHwgJ251bWJlcicgIT09IHR5cGVvZiBuIHx8IDAgPT09IG4gPyBuIDogbiArICdweCc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGR0KGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdC5fX2Vtb3Rpb25fc3R5bGVzKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICBjYXNlICdvYmplY3QnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gdC5hbmltKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IHQuc3R5bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHQuc3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHZvaWQgMCAhPT0gcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogci5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiByLnN0eWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSByLm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zdHlsZXMgKyAnOyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9IGR0KGUsIG4sIHRbb10pICsgJzsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IG4gJiYgdm9pZCAwICE9PSBuW2ldID8gciArPSBhICsgJ3snICsgbltpXSArICd9JyA6IGx0KGkpICYmIChyICs9IHV0KGEpICsgJzonICsgcHQoYSwgaSkgKyAnOycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghQXJyYXkuaXNBcnJheShpKSB8fCAnc3RyaW5nJyAhPT0gdHlwZW9mIGlbMF0gfHwgbnVsbCAhPSBuICYmIHZvaWQgMCAhPT0gbltpWzBdXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBkdChlLCBuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYW5pbWF0aW9uJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FuaW1hdGlvbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKz0gdXQoYSkgKyAnOicgKyBzICsgJzsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9IGEgKyAneycgKyBzICsgJ30nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgaS5sZW5ndGg7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdChpW2NdKSAmJiAociArPSB1dChhKSArICc6JyArIHB0KGEsIGlbY10pICsgJzsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBuLCB0KTsKICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZnQsIGEgPSB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ0ID0gbywgZHQoZSwgbiwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuW3RdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyBpIDogdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmdCwgbXQgPSAvbGFiZWw6XHMqKFteXHM7XG57XSspXHMqOy9nOwogICAgICAgICAgICAgICAgdmFyIGh0ID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IGUubGVuZ3RoICYmICdvYmplY3QnID09PSB0eXBlb2YgZVswXSAmJiBudWxsICE9PSBlWzBdICYmIHZvaWQgMCAhPT0gZVswXS5zdHlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMCwgbyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBmdCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IGEgfHwgdm9pZCAwID09PSBhLnJhdyA/IChyID0gITEsIG8gKz0gZHQodCwgbiwgYSkpIDogbyArPSBhWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGUubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICs9IGR0KHQsIG4sIGVbaV0pLCByICYmIChvICs9IGFbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBtdC5sYXN0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzLCBjID0gJyc7IG51bGwgIT09IChzID0gbXQuZXhlYyhvKSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSAnLScgKyBzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogb3QobykgKyBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogZnQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBndCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksIHl0ID0gbmUoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBIVE1MRWxlbWVudCA/IGV0KHsga2V5OiAnY3NzJyB9KSA6IG51bGwpLCB2dCA9ICh5dC5Qcm92aWRlciwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEllKGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9lKHl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKG4sIHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgYnQgPSBuZSh7fSk7CiAgICAgICAgICAgICAgICBZbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBZbihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09PSB0eXBlb2YgbiA/IG4oZSkgOiBudCh7fSwgZSwge30sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUsIG4pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgX3QgPSAnX19FTU9USU9OX1RZUEVfUExFQVNFX0RPX05PVF9VU0VfXyc7CiAgICAgICAgICAgICAgICB2dChmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5jc3M7CiAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiByICYmIHZvaWQgMCAhPT0gbi5yZWdpc3RlcmVkW3JdICYmIChyID0gbi5yZWdpc3RlcmVkW3JdKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGVbX3RdLCBhID0gW3JdLCBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiBlLmNsYXNzTmFtZSA/IGkgPSB0dChuLnJlZ2lzdGVyZWQsIGEsIGUuY2xhc3NOYW1lKSA6IG51bGwgIT0gZS5jbGFzc05hbWUgJiYgKGkgPSBlLmNsYXNzTmFtZSArICcgJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBodChhLCB2b2lkIDAsICdmdW5jdGlvbicgPT09IHR5cGVvZiByIHx8IEFycmF5LmlzQXJyYXkocikgPyBfZShidCkgOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIHJ0KG4sIHMsICdzdHJpbmcnID09PSB0eXBlb2Ygbyk7CiAgICAgICAgICAgICAgICAgICAgaSArPSBuLmtleSArICctJyArIHMubmFtZTsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgZ3QuY2FsbChlLCBsKSAmJiAnY3NzJyAhPT0gbCAmJiBsICE9PSBfdCAmJiAoY1tsXSA9IGVbbF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlZiA9IHQsIGMuY2xhc3NOYW1lID0gaSwgcShvLCBjKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdCg1KTsKICAgICAgICAgICAgICAgIHZhciB4dCA9IHZ0KGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnN0eWxlcywgciA9IGh0KFt0XSwgdm9pZCAwLCAnZnVuY3Rpb24nID09PSB0eXBlb2YgdCB8fCBBcnJheS5pc0FycmF5KHQpID8gX2UoYnQpIDogdm9pZCAwKSwgbyA9IHllKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuLmtleSArICctZ2xvYmFsJywgdCA9IG5ldyBjbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmNlOiBuLnNoZWV0Lm5vbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogbi5zaGVldC5jb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWR5OiBuLnNoZWV0LmlzU3BlZWR5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW3FjLWRhdGEtZW1vdGlvbj0iJyArIGUgKyAnICcgKyByLm5hbWUgKyAnIl0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2hlZXQudGFncy5sZW5ndGggJiYgKHQuYmVmb3JlID0gbi5zaGVldC50YWdzWzBdKSwgbnVsbCAhPT0gYSAmJiB0Lmh5ZHJhdGUoW2FdKSwgby5jdXJyZW50ID0gdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5mbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIFtuXSksIGdlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSByLm5leHQgJiYgcnQobiwgci5uZXh0LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gby5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50YWdzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnRhZ3NbZS50YWdzLmxlbmd0aCAtIDFdLm5leHRFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmVmb3JlID0gdCwgZS5mbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG4uaW5zZXJ0KCcnLCByLCBlLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfSwgWwogICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICByLm5hbWUKICAgICAgICAgICAgICAgICAgICBdKSwgbnVsbDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRXQoKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkoZSksIHQgPSAwOyB0IDwgZTsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICBuW3RdID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBodChuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBDdCwga3QsIHd0LCBTdCwgTHQsIFB0LCBUdCwgcXQsIEF0LCBJdCwgT3Q7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOdChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBvID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG8gPSB7fSwgYSA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IGEubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGFbcl0sIG4uaW5kZXhPZih0KSA+PSAwIHx8IChvW3RdID0gZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBuKTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBhLmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGFbcl0sIG4uaW5kZXhPZih0KSA+PSAwIHx8IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLCB0KSAmJiAob1t0XSA9IGVbdF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJ0KGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IGUuc2xpY2UoMCkpLCBPYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsIHsgcmF3OiB7IHZhbHVlOiBPYmplY3QuZnJlZXplKG4pIH0gfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5HT19UT19QQUdFID0gJ2dvVG9QYWdlJywgZS5QVVJQT1NFID0gJ3B1cnBvc2UnLCBlLkxFR0lUSU1BVEVfUFVSUE9TRSA9ICdsZWdpdGltYXRlUHVycG9zZScsIGUuTEVHSVRJTUFURV9WRU5ET1IgPSAnbGVnaXRpbWF0ZVZlbmRvcicsIGUuU1BFQ0lBTF9GRUFUVVJFID0gJ3NwZWNpYWxGZWF0dXJlJywgZS5TVEFDSyA9ICdzdGFjaycsIGUuUEFSVElBTF9DT05TRU5UID0gJ3BhcnRpYWwnLCBlLlNBVkVfQU5EX0VYSVQgPSAnc2F2ZUFuZEV4aXQnLCBlLkFDQ0VQVF9BTEwgPSAnYWNjZXB0QWxsJywgZS5SRUpFQ1RfQUxMID0gJ3JlamVjdEFsbCcsIGUuQUNDRVBUX0FMTF9MRUdJVElNQVRFID0gJ2FjY2VwdEFsbExlZ2l0aW1hdGUnLCBlLk9CSkVDVF9BTExfTEVHSVRJTUFURSA9ICdvYmplY3RBbGxMZWdpdGltYXRlJywgZS5BQ0NFUFRfQUxMX1ZFTkRPUlMgPSAnYWNjZXB0QWxsVmVuZG9ycycsIGUuUkVKRUNUX0FMTF9WRU5ET1JTID0gJ3JlamVjdEFsbFZlbmRvcnMnLCBlLkFDQ0VQVF9BTExfUFVSUE9TRVMgPSAnYWNjZXB0QWxsUHVycG9zZXMnLCBlLlJFSkVDVF9BTExfUFVSUE9TRVMgPSAncmVqZWN0QWxsUHVycG9zZXMnLCBlLlZFTkRPUiA9ICd2ZW5kb3InLCBlLk5PTl9JQUJfVkVORE9SID0gJ25vbklhYlZlbmRvcicsIGUuRElTTUlTU19VSSA9ICdkaXNtaXNzVWknLCBlLlNUQVJUX09OX1BBR0UgPSAnc3RhcnRPblBhZ2UnLCBlLk9QVF9PVVRfVE9HR0xFID0gJ29wdE91dFRvZ2dsZScsIGUuT1BUX09VVF9DT05GSVJNID0gJ29wdE91dENvbmZpcm0nLCBlLkVYUEFORF9FTEVNRU5UID0gJ2V4cGFuZEVsZW1lbnQnLCBlLkNPTExBUFNFX0VMRU1FTlQgPSAnY29sbGFwc2VFbGVtZW50JywgZS5HT09HTEUgPSAnZ29vZ2xlUGFydG5lcic7CiAgICAgICAgICAgICAgICB9KEN0IHx8IChDdCA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5NQU5EQVRPUlkgPSAndGNmdWk6bWFuZGF0b3J5JywgZS5DSEFOR0VfT0ZfQ09OU0VOVCA9ICd0Y2Z1aTpjaGFuZ2VvZmNvbnNlbnQnLCBlLkNDUEEgPSAndXNwdWk6ZG9ub3RzZWxsJzsKICAgICAgICAgICAgICAgIH0oa3QgfHwgKGt0ID0ge30pKSwgKFN0ID0gd3QgfHwgKHd0ID0ge30pKS5GRUFUVVJFUyA9ICdGZWF0dXJlcycsIFN0Lk5PTl9JQUIgPSAnTm9uIElBQicsIFN0LlBVUlBPU0VTID0gJ1B1cnBvc2VzJywgU3QuTEVHSVRJTUFURV9QVVJQT1NFUyA9ICdMZWdpdGltYXRlIFB1cnBvc2VzJywgU3QuTEVHSVRJTUFURV9WRU5ET1JTID0gJ0xlZ2l0aW1hdGUgVmVuZG9ycycsIFN0LlNQRUNJQUxfUFVSUE9TRVMgPSAnU3BlY2lhbCBQdXJwb3NlcycsIFN0LlNQRUNJQUxfRkVBVFVSRVMgPSAnU3BlY2lhbCBGZWF0dXJlcycsIFN0LlZFTkRPUlMgPSAnVmVuZG9ycycsIFN0LlNUQUNLUyA9ICdTdGFja3MnLCBTdC5HT09HTEUgPSAnR29vZ2xlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLklOSVQgPSAnaW5pdCcsIGUuTkFWSUdBVElPTiA9ICduYXZpZ2F0aW9uJywgZS5ET05FID0gJ2RvbmUnOwogICAgICAgICAgICAgICAgfShMdCB8fCAoTHQgPSB7fSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUuQUNDRVBUX0FMTCA9ICdBbGwnLCBlLkFDQ0VQVF9QQVJUSUFMID0gJ1BhcnRpYWwnLCBlLlJFSkVDVCA9ICdSZWplY3QnOwogICAgICAgICAgICAgICAgfShQdCB8fCAoUHQgPSB7fSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUuTk9ORV9PQkpFQ1RFRCA9ICdOb25lJywgZS5BTExfT0JKRUNURUQgPSAnQWxsJzsKICAgICAgICAgICAgICAgIH0oVHQgfHwgKFR0ID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLlNUQUNLUyA9ICdzdGFja3MnLCBlLlZFTkRPUlMgPSAndmVuZG9ycycsIGUuRkVBVFVSRVMgPSAnZmVhdHVyZXMnLCBlLlBVUlBPU0VTID0gJ3B1cnBvc2VzJywgZS5TUEVDSUFMX0ZFQVRVUkVTID0gJ3NwZWNpYWxGZWF0dXJlcycsIGUuU1BFQ0lBTF9QVVJQT1NFUyA9ICdzcGVjaWFsUHVycG9zZXMnLCBlLkZMRVhJQkxFX1BVUlBPU0VTID0gJ2ZsZXhpYmxlUHVycG9zZXMnLCBlLkxFR0lUSU1BVEVfVkVORE9SUyA9ICdsZWdpdGltYXRlVmVuZG9ycycsIGUuTEVHSVRJTUFURV9QVVJQT1NFUyA9ICdsZWdpdGltYXRlUHVycG9zZXMnLCBlLlVORklMVEVSRURfRkVBVFVSRVMgPSAndW5maWx0ZXJlZEZlYXR1cmVzJywgZS5VTkZJTFRFUkVEX1BVUlBPU0VTID0gJ3VuZmlsdGVyZWRQdXJwb3NlcycsIGUuVU5GSUxURVJFRF9TUEVDSUFMX0ZFQVRVUkVTID0gJ3VuZmlsdGVyZWRTcGVjaWFsRmVhdHVyZXMnLCBlLlVORklMVEVSRURfU1BFQ0lBTF9QVVJQT1NFUyA9ICd1bmZpbHRlcmVkU3BlY2lhbFB1cnBvc2VzJzsKICAgICAgICAgICAgICAgIH0ocXQgfHwgKHF0ID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLkNPTlNFTlRfUkVTUE9OU0UgPSAnY29uc2VudC1yZXNwb25zZScsIGUuQ09OU0VOVF9VSSA9ICdjb25zZW50LXVpJzsKICAgICAgICAgICAgICAgIH0oQXQgfHwgKEF0ID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlW2UuR0RQUiA9IDJdID0gJ0dEUFInLCBlW2UuVVNQID0gM10gPSAnVVNQJzsKICAgICAgICAgICAgICAgIH0oSXQgfHwgKEl0ID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLkFDQ0VQVCA9ICdhY2NlcHQnLCBlLlJFSkVDVCA9ICdyZWplY3QnLCBlLkRJU01JU1MgPSAnZGlzbWlzcycsIGUuRU5URVJfRlVMTFNDUkVFTiA9ICdlbnRlci1mdWxsc2NyZWVuJzsKICAgICAgICAgICAgICAgIH0oT3QgfHwgKE90ID0ge30pKTsKICAgICAgICAgICAgICAgIHZhciBVdCA9IC9eKChjaGlsZHJlbnxkYW5nZXJvdXNseVNldElubmVySFRNTHxrZXl8cmVmfGF1dG9Gb2N1c3xkZWZhdWx0VmFsdWV8ZGVmYXVsdENoZWNrZWR8aW5uZXJIVE1MfHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ3xzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmd8dmFsdWVMaW5rfGFjY2VwdHxhY2NlcHRDaGFyc2V0fGFjY2Vzc0tleXxhY3Rpb258YWxsb3d8YWxsb3dVc2VyTWVkaWF8YWxsb3dQYXltZW50UmVxdWVzdHxhbGxvd0Z1bGxTY3JlZW58YWxsb3dUcmFuc3BhcmVuY3l8YWx0fGFzeW5jfGF1dG9Db21wbGV0ZXxhdXRvUGxheXxjYXB0dXJlfGNlbGxQYWRkaW5nfGNlbGxTcGFjaW5nfGNoYWxsZW5nZXxjaGFyU2V0fGNoZWNrZWR8Y2l0ZXxjbGFzc0lEfGNsYXNzTmFtZXxjb2xzfGNvbFNwYW58Y29udGVudHxjb250ZW50RWRpdGFibGV8Y29udGV4dE1lbnV8Y29udHJvbHN8Y29udHJvbHNMaXN0fGNvb3Jkc3xjcm9zc09yaWdpbnxkYXRhfGRhdGVUaW1lfGRlY29kaW5nfGRlZmF1bHR8ZGVmZXJ8ZGlyfGRpc2FibGVkfGRpc2FibGVQaWN0dXJlSW5QaWN0dXJlfGRvd25sb2FkfGRyYWdnYWJsZXxlbmNUeXBlfGZvcm18Zm9ybUFjdGlvbnxmb3JtRW5jVHlwZXxmb3JtTWV0aG9kfGZvcm1Ob1ZhbGlkYXRlfGZvcm1UYXJnZXR8ZnJhbWVCb3JkZXJ8aGVhZGVyc3xoZWlnaHR8aGlkZGVufGhpZ2h8aHJlZnxocmVmTGFuZ3xodG1sRm9yfGh0dHBFcXVpdnxpZHxpbnB1dE1vZGV8aW50ZWdyaXR5fGlzfGtleVBhcmFtc3xrZXlUeXBlfGtpbmR8bGFiZWx8bGFuZ3xsaXN0fGxvYWRpbmd8bG9vcHxsb3d8bWFyZ2luSGVpZ2h0fG1hcmdpbldpZHRofG1heHxtYXhMZW5ndGh8bWVkaWF8bWVkaWFHcm91cHxtZXRob2R8bWlufG1pbkxlbmd0aHxtdWx0aXBsZXxtdXRlZHxuYW1lfG5vbmNlfG5vVmFsaWRhdGV8b3BlbnxvcHRpbXVtfHBhdHRlcm58cGxhY2Vob2xkZXJ8cGxheXNJbmxpbmV8cG9zdGVyfHByZWxvYWR8cHJvZmlsZXxyYWRpb0dyb3VwfHJlYWRPbmx5fHJlZmVycmVyUG9saWN5fHJlbHxyZXF1aXJlZHxyZXZlcnNlZHxyb2xlfHJvd3N8cm93U3BhbnxzYW5kYm94fHNjb3BlfHNjb3BlZHxzY3JvbGxpbmd8c2VhbWxlc3N8c2VsZWN0ZWR8c2hhcGV8c2l6ZXxzaXplc3xzbG90fHNwYW58c3BlbGxDaGVja3xzcmN8c3JjRG9jfHNyY0xhbmd8c3JjU2V0fHN0YXJ0fHN0ZXB8c3R5bGV8c3VtbWFyeXx0YWJJbmRleHx0YXJnZXR8dGl0bGV8dHJhbnNsYXRlfHR5cGV8dXNlTWFwfHZhbHVlfHdpZHRofHdtb2RlfHdyYXB8YWJvdXR8ZGF0YXR5cGV8aW5saXN0fHByZWZpeHxwcm9wZXJ0eXxyZXNvdXJjZXx0eXBlb2Z8dm9jYWJ8YXV0b0NhcGl0YWxpemV8YXV0b0NvcnJlY3R8YXV0b1NhdmV8Y29sb3J8aW5lcnR8aXRlbVByb3B8aXRlbVNjb3BlfGl0ZW1UeXBlfGl0ZW1JRHxpdGVtUmVmfG9ufHJlc3VsdHN8c2VjdXJpdHl8dW5zZWxlY3RhYmxlfGFjY2VudEhlaWdodHxhY2N1bXVsYXRlfGFkZGl0aXZlfGFsaWdubWVudEJhc2VsaW5lfGFsbG93UmVvcmRlcnxhbHBoYWJldGljfGFtcGxpdHVkZXxhcmFiaWNGb3JtfGFzY2VudHxhdHRyaWJ1dGVOYW1lfGF0dHJpYnV0ZVR5cGV8YXV0b1JldmVyc2V8YXppbXV0aHxiYXNlRnJlcXVlbmN5fGJhc2VsaW5lU2hpZnR8YmFzZVByb2ZpbGV8YmJveHxiZWdpbnxiaWFzfGJ5fGNhbGNNb2RlfGNhcEhlaWdodHxjbGlwfGNsaXBQYXRoVW5pdHN8Y2xpcFBhdGh8Y2xpcFJ1bGV8Y29sb3JJbnRlcnBvbGF0aW9ufGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnN8Y29sb3JQcm9maWxlfGNvbG9yUmVuZGVyaW5nfGNvbnRlbnRTY3JpcHRUeXBlfGNvbnRlbnRTdHlsZVR5cGV8Y3Vyc29yfGN4fGN5fGR8ZGVjZWxlcmF0ZXxkZXNjZW50fGRpZmZ1c2VDb25zdGFudHxkaXJlY3Rpb258ZGlzcGxheXxkaXZpc29yfGRvbWluYW50QmFzZWxpbmV8ZHVyfGR4fGR5fGVkZ2VNb2RlfGVsZXZhdGlvbnxlbmFibGVCYWNrZ3JvdW5kfGVuZHxleHBvbmVudHxleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkfGZpbGx8ZmlsbE9wYWNpdHl8ZmlsbFJ1bGV8ZmlsdGVyfGZpbHRlclJlc3xmaWx0ZXJVbml0c3xmbG9vZENvbG9yfGZsb29kT3BhY2l0eXxmb2N1c2FibGV8Zm9udEZhbWlseXxmb250U2l6ZXxmb250U2l6ZUFkanVzdHxmb250U3RyZXRjaHxmb250U3R5bGV8Zm9udFZhcmlhbnR8Zm9udFdlaWdodHxmb3JtYXR8ZnJvbXxmcnxmeHxmeXxnMXxnMnxnbHlwaE5hbWV8Z2x5cGhPcmllbnRhdGlvbkhvcml6b250YWx8Z2x5cGhPcmllbnRhdGlvblZlcnRpY2FsfGdseXBoUmVmfGdyYWRpZW50VHJhbnNmb3JtfGdyYWRpZW50VW5pdHN8aGFuZ2luZ3xob3JpekFkdlh8aG9yaXpPcmlnaW5YfGlkZW9ncmFwaGljfGltYWdlUmVuZGVyaW5nfGlufGluMnxpbnRlcmNlcHR8a3xrMXxrMnxrM3xrNHxrZXJuZWxNYXRyaXh8a2VybmVsVW5pdExlbmd0aHxrZXJuaW5nfGtleVBvaW50c3xrZXlTcGxpbmVzfGtleVRpbWVzfGxlbmd0aEFkanVzdHxsZXR0ZXJTcGFjaW5nfGxpZ2h0aW5nQ29sb3J8bGltaXRpbmdDb25lQW5nbGV8bG9jYWx8bWFya2VyRW5kfG1hcmtlck1pZHxtYXJrZXJTdGFydHxtYXJrZXJIZWlnaHR8bWFya2VyVW5pdHN8bWFya2VyV2lkdGh8bWFza3xtYXNrQ29udGVudFVuaXRzfG1hc2tVbml0c3xtYXRoZW1hdGljYWx8bW9kZXxudW1PY3RhdmVzfG9mZnNldHxvcGFjaXR5fG9wZXJhdG9yfG9yZGVyfG9yaWVudHxvcmllbnRhdGlvbnxvcmlnaW58b3ZlcmZsb3d8b3ZlcmxpbmVQb3NpdGlvbnxvdmVybGluZVRoaWNrbmVzc3xwYW5vc2UxfHBhaW50T3JkZXJ8cGF0aExlbmd0aHxwYXR0ZXJuQ29udGVudFVuaXRzfHBhdHRlcm5UcmFuc2Zvcm18cGF0dGVyblVuaXRzfHBvaW50ZXJFdmVudHN8cG9pbnRzfHBvaW50c0F0WHxwb2ludHNBdFl8cG9pbnRzQXRafHByZXNlcnZlQWxwaGF8cHJlc2VydmVBc3BlY3RSYXRpb3xwcmltaXRpdmVVbml0c3xyfHJhZGl1c3xyZWZYfHJlZll8cmVuZGVyaW5nSW50ZW50fHJlcGVhdENvdW50fHJlcGVhdER1cnxyZXF1aXJlZEV4dGVuc2lvbnN8cmVxdWlyZWRGZWF0dXJlc3xyZXN0YXJ0fHJlc3VsdHxyb3RhdGV8cnh8cnl8c2NhbGV8c2VlZHxzaGFwZVJlbmRlcmluZ3xzbG9wZXxzcGFjaW5nfHNwZWN1bGFyQ29uc3RhbnR8c3BlY3VsYXJFeHBvbmVudHxzcGVlZHxzcHJlYWRNZXRob2R8c3RhcnRPZmZzZXR8c3RkRGV2aWF0aW9ufHN0ZW1ofHN0ZW12fHN0aXRjaFRpbGVzfHN0b3BDb2xvcnxzdG9wT3BhY2l0eXxzdHJpa2V0aHJvdWdoUG9zaXRpb258c3RyaWtldGhyb3VnaFRoaWNrbmVzc3xzdHJpbmd8c3Ryb2tlfHN0cm9rZURhc2hhcnJheXxzdHJva2VEYXNob2Zmc2V0fHN0cm9rZUxpbmVjYXB8c3Ryb2tlTGluZWpvaW58c3Ryb2tlTWl0ZXJsaW1pdHxzdHJva2VPcGFjaXR5fHN0cm9rZVdpZHRofHN1cmZhY2VTY2FsZXxzeXN0ZW1MYW5ndWFnZXx0YWJsZVZhbHVlc3x0YXJnZXRYfHRhcmdldFl8dGV4dEFuY2hvcnx0ZXh0RGVjb3JhdGlvbnx0ZXh0UmVuZGVyaW5nfHRleHRMZW5ndGh8dG98dHJhbnNmb3JtfHUxfHUyfHVuZGVybGluZVBvc2l0aW9ufHVuZGVybGluZVRoaWNrbmVzc3x1bmljb2RlfHVuaWNvZGVCaWRpfHVuaWNvZGVSYW5nZXx1bml0c1BlckVtfHZBbHBoYWJldGljfHZIYW5naW5nfHZJZGVvZ3JhcGhpY3x2TWF0aGVtYXRpY2FsfHZhbHVlc3x2ZWN0b3JFZmZlY3R8dmVyc2lvbnx2ZXJ0QWR2WXx2ZXJ0T3JpZ2luWHx2ZXJ0T3JpZ2luWXx2aWV3Qm94fHZpZXdUYXJnZXR8dmlzaWJpbGl0eXx3aWR0aHN8d29yZFNwYWNpbmd8d3JpdGluZ01vZGV8eHx4SGVpZ2h0fHgxfHgyfHhDaGFubmVsU2VsZWN0b3J8eGxpbmtBY3R1YXRlfHhsaW5rQXJjcm9sZXx4bGlua0hyZWZ8eGxpbmtSb2xlfHhsaW5rU2hvd3x4bGlua1RpdGxlfHhsaW5rVHlwZXx4bWxCYXNlfHhtbG5zfHhtbG5zWGxpbmt8eG1sTGFuZ3x4bWxTcGFjZXx5fHkxfHkyfHlDaGFubmVsU2VsZWN0b3J8enx6b29tQW5kUGFufGZvcnxjbGFzc3xhdXRvZm9jdXMpfCgoW0RkXVtBYV1bVHRdW0FhXXxbQWFdW1JyXVtJaV1bQWFdfHgpLS4qKSkkLywgRHQgPSBXbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVXQudGVzdChlKSB8fCAxMTEgPT09IGUuY2hhckNvZGVBdCgwKSAmJiAxMTAgPT09IGUuY2hhckNvZGVBdCgxKSAmJiBlLmNoYXJDb2RlQXQoMikgPCA5MTsKICAgICAgICAgICAgICAgICAgICB9KSwgQnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RoZW1lJyAhPT0gZTsKICAgICAgICAgICAgICAgICAgICB9LCBqdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PT0gdHlwZW9mIGUgJiYgZS5jaGFyQ29kZUF0KDApID4gOTYgPyBEdCA6IEJ0OwogICAgICAgICAgICAgICAgICAgIH0sIEZ0ID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uc2hvdWxkRm9yd2FyZFByb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZS5fX2Vtb3Rpb25fZm9yd2FyZFByb3AgJiYgbyA/IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX19lbW90aW9uX2ZvcndhcmRQcm9wKG4pICYmIG8obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogbzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHIgJiYgdCAmJiAociA9IGUuX19lbW90aW9uX2ZvcndhcmRQcm9wKSwgcjsKICAgICAgICAgICAgICAgICAgICB9LCBWdCA9IGZ1bmN0aW9uIGUobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgYSA9IG4uX19lbW90aW9uX3JlYWwgPT09IG4sIGkgPSBhICYmIG4uX19lbW90aW9uX2Jhc2UgfHwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSB0ICYmIChyID0gdC5sYWJlbCwgbyA9IHQudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBGdChuLCB0LCBhKSwgYyA9IHMgfHwganQoaSksIGwgPSAhYygnYXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gYXJndW1lbnRzLCBwID0gYSAmJiB2b2lkIDAgIT09IG4uX19lbW90aW9uX3N0eWxlcyA/IG4uX19lbW90aW9uX3N0eWxlcy5zbGljZSgwKSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gciAmJiBwLnB1c2goJ2xhYmVsOicgKyByICsgJzsnKSwgbnVsbCA9PSB1WzBdIHx8IHZvaWQgMCA9PT0gdVswXS5yYXcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wdXNoLmFwcGx5KHAsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcC5wdXNoKHVbMF1bMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgPSB1Lmxlbmd0aCwgZiA9IDE7IGYgPCBkOyBmKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucHVzaCh1W2ZdLCB1WzBdW2ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gdnQoZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGwgJiYgZS5hcyB8fCBpLCBhID0gJycsIHUgPSBbXSwgZCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZS50aGVtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmIGluIChkID0ge30sIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtmXSA9IGVbZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQudGhlbWUgPSBfZShidCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZS5jbGFzc05hbWUgPyBhID0gdHQobi5yZWdpc3RlcmVkLCB1LCBlLmNsYXNzTmFtZSkgOiBudWxsICE9IGUuY2xhc3NOYW1lICYmIChhID0gZS5jbGFzc05hbWUgKyAnICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtID0gaHQocC5jb25jYXQodSksIG4ucmVnaXN0ZXJlZCwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnQobiwgbSwgJ3N0cmluZycgPT09IHR5cGVvZiByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICs9IG4ua2V5ICsgJy0nICsgbS5uYW1lLCB2b2lkIDAgIT09IG8gJiYgKGEgKz0gJyAnICsgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBsICYmIHZvaWQgMCA9PT0gcyA/IGp0KHIpIDogYywgZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHkgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCAmJiAnYXMnID09PSB5IHx8IGgoeSkgJiYgKGdbeV0gPSBlW3ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5jbGFzc05hbWUgPSBhLCBnLnJlZiA9IHQsIHEociwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmRpc3BsYXlOYW1lID0gdm9pZCAwICE9PSByID8gciA6ICdTdHlsZWQoJyArICgnc3RyaW5nJyA9PT0gdHlwZW9mIGkgPyBpIDogaS5kaXNwbGF5TmFtZSB8fCBpLm5hbWUgfHwgJ0NvbXBvbmVudCcpICsgJyknLCBtLmRlZmF1bHRQcm9wcyA9IG4uZGVmYXVsdFByb3BzLCBtLl9fZW1vdGlvbl9yZWFsID0gbSwgbS5fX2Vtb3Rpb25fYmFzZSA9IGksIG0uX19lbW90aW9uX3N0eWxlcyA9IHAsIG0uX19lbW90aW9uX2ZvcndhcmRQcm9wID0gcywgT2JqZWN0LmRlZmluZVByb3BlcnR5KG0sICd0b1N0cmluZycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy4nICsgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbS53aXRoQ29tcG9uZW50ID0gZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShuLCBudCh7fSwgdCwge30sIHIsIHsgc2hvdWxkRm9yd2FyZFByb3A6IEZ0KG0sIHIsICEwKSB9KSkuYXBwbHkodm9pZCAwLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKCk7CiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgJ2EnLAogICAgICAgICAgICAgICAgICAgICdhYmJyJywKICAgICAgICAgICAgICAgICAgICAnYWRkcmVzcycsCiAgICAgICAgICAgICAgICAgICAgJ2FyZWEnLAogICAgICAgICAgICAgICAgICAgICdhcnRpY2xlJywKICAgICAgICAgICAgICAgICAgICAnYXNpZGUnLAogICAgICAgICAgICAgICAgICAgICdhdWRpbycsCiAgICAgICAgICAgICAgICAgICAgJ2InLAogICAgICAgICAgICAgICAgICAgICdiYXNlJywKICAgICAgICAgICAgICAgICAgICAnYmRpJywKICAgICAgICAgICAgICAgICAgICAnYmRvJywKICAgICAgICAgICAgICAgICAgICAnYmlnJywKICAgICAgICAgICAgICAgICAgICAnYmxvY2txdW90ZScsCiAgICAgICAgICAgICAgICAgICAgJ2JvZHknLAogICAgICAgICAgICAgICAgICAgICdicicsCiAgICAgICAgICAgICAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgJ2NhbnZhcycsCiAgICAgICAgICAgICAgICAgICAgJ2NhcHRpb24nLAogICAgICAgICAgICAgICAgICAgICdjaXRlJywKICAgICAgICAgICAgICAgICAgICAnY29kZScsCiAgICAgICAgICAgICAgICAgICAgJ2NvbCcsCiAgICAgICAgICAgICAgICAgICAgJ2NvbGdyb3VwJywKICAgICAgICAgICAgICAgICAgICAnZGF0YScsCiAgICAgICAgICAgICAgICAgICAgJ2RhdGFsaXN0JywKICAgICAgICAgICAgICAgICAgICAnZGQnLAogICAgICAgICAgICAgICAgICAgICdkZWwnLAogICAgICAgICAgICAgICAgICAgICdkZXRhaWxzJywKICAgICAgICAgICAgICAgICAgICAnZGZuJywKICAgICAgICAgICAgICAgICAgICAnZGlhbG9nJywKICAgICAgICAgICAgICAgICAgICAnZGl2JywKICAgICAgICAgICAgICAgICAgICAnZGwnLAogICAgICAgICAgICAgICAgICAgICdkdCcsCiAgICAgICAgICAgICAgICAgICAgJ2VtJywKICAgICAgICAgICAgICAgICAgICAnZW1iZWQnLAogICAgICAgICAgICAgICAgICAgICdmaWVsZHNldCcsCiAgICAgICAgICAgICAgICAgICAgJ2ZpZ2NhcHRpb24nLAogICAgICAgICAgICAgICAgICAgICdmaWd1cmUnLAogICAgICAgICAgICAgICAgICAgICdmb290ZXInLAogICAgICAgICAgICAgICAgICAgICdmb3JtJywKICAgICAgICAgICAgICAgICAgICAnaDEnLAogICAgICAgICAgICAgICAgICAgICdoMicsCiAgICAgICAgICAgICAgICAgICAgJ2gzJywKICAgICAgICAgICAgICAgICAgICAnaDQnLAogICAgICAgICAgICAgICAgICAgICdoNScsCiAgICAgICAgICAgICAgICAgICAgJ2g2JywKICAgICAgICAgICAgICAgICAgICAnaGVhZCcsCiAgICAgICAgICAgICAgICAgICAgJ2hlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgJ2hncm91cCcsCiAgICAgICAgICAgICAgICAgICAgJ2hyJywKICAgICAgICAgICAgICAgICAgICAnaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgJ2knLAogICAgICAgICAgICAgICAgICAgICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICdpbWcnLAogICAgICAgICAgICAgICAgICAgICdpbnB1dCcsCiAgICAgICAgICAgICAgICAgICAgJ2lucycsCiAgICAgICAgICAgICAgICAgICAgJ2tiZCcsCiAgICAgICAgICAgICAgICAgICAgJ2tleWdlbicsCiAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJywKICAgICAgICAgICAgICAgICAgICAnbGVnZW5kJywKICAgICAgICAgICAgICAgICAgICAnbGknLAogICAgICAgICAgICAgICAgICAgICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgJ21hcCcsCiAgICAgICAgICAgICAgICAgICAgJ21hcmsnLAogICAgICAgICAgICAgICAgICAgICdtYXJxdWVlJywKICAgICAgICAgICAgICAgICAgICAnbWVudScsCiAgICAgICAgICAgICAgICAgICAgJ21lbnVpdGVtJywKICAgICAgICAgICAgICAgICAgICAnbWV0YScsCiAgICAgICAgICAgICAgICAgICAgJ21ldGVyJywKICAgICAgICAgICAgICAgICAgICAnbmF2JywKICAgICAgICAgICAgICAgICAgICAnbm9zY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICdvYmplY3QnLAogICAgICAgICAgICAgICAgICAgICdvbCcsCiAgICAgICAgICAgICAgICAgICAgJ29wdGdyb3VwJywKICAgICAgICAgICAgICAgICAgICAnb3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAnb3V0cHV0JywKICAgICAgICAgICAgICAgICAgICAncCcsCiAgICAgICAgICAgICAgICAgICAgJ3BhcmFtJywKICAgICAgICAgICAgICAgICAgICAncGljdHVyZScsCiAgICAgICAgICAgICAgICAgICAgJ3ByZScsCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzJywKICAgICAgICAgICAgICAgICAgICAncScsCiAgICAgICAgICAgICAgICAgICAgJ3JwJywKICAgICAgICAgICAgICAgICAgICAncnQnLAogICAgICAgICAgICAgICAgICAgICdydWJ5JywKICAgICAgICAgICAgICAgICAgICAncycsCiAgICAgICAgICAgICAgICAgICAgJ3NhbXAnLAogICAgICAgICAgICAgICAgICAgICdzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICdzZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAnc2VsZWN0JywKICAgICAgICAgICAgICAgICAgICAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICdzb3VyY2UnLAogICAgICAgICAgICAgICAgICAgICdzcGFuJywKICAgICAgICAgICAgICAgICAgICAnc3Ryb25nJywKICAgICAgICAgICAgICAgICAgICAnc3R5bGUnLAogICAgICAgICAgICAgICAgICAgICdzdWInLAogICAgICAgICAgICAgICAgICAgICdzdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICAnc3VwJywKICAgICAgICAgICAgICAgICAgICAndGFibGUnLAogICAgICAgICAgICAgICAgICAgICd0Ym9keScsCiAgICAgICAgICAgICAgICAgICAgJ3RkJywKICAgICAgICAgICAgICAgICAgICAndGV4dGFyZWEnLAogICAgICAgICAgICAgICAgICAgICd0Zm9vdCcsCiAgICAgICAgICAgICAgICAgICAgJ3RoJywKICAgICAgICAgICAgICAgICAgICAndGhlYWQnLAogICAgICAgICAgICAgICAgICAgICd0aW1lJywKICAgICAgICAgICAgICAgICAgICAndGl0bGUnLAogICAgICAgICAgICAgICAgICAgICd0cicsCiAgICAgICAgICAgICAgICAgICAgJ3RyYWNrJywKICAgICAgICAgICAgICAgICAgICAndScsCiAgICAgICAgICAgICAgICAgICAgJ3VsJywKICAgICAgICAgICAgICAgICAgICAndmFyJywKICAgICAgICAgICAgICAgICAgICAndmlkZW8nLAogICAgICAgICAgICAgICAgICAgICd3YnInLAogICAgICAgICAgICAgICAgICAgICdjaXJjbGUnLAogICAgICAgICAgICAgICAgICAgICdjbGlwUGF0aCcsCiAgICAgICAgICAgICAgICAgICAgJ2RlZnMnLAogICAgICAgICAgICAgICAgICAgICdlbGxpcHNlJywKICAgICAgICAgICAgICAgICAgICAnZm9yZWlnbk9iamVjdCcsCiAgICAgICAgICAgICAgICAgICAgJ2cnLAogICAgICAgICAgICAgICAgICAgICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgJ2xpbmUnLAogICAgICAgICAgICAgICAgICAgICdsaW5lYXJHcmFkaWVudCcsCiAgICAgICAgICAgICAgICAgICAgJ21hc2snLAogICAgICAgICAgICAgICAgICAgICdwYXRoJywKICAgICAgICAgICAgICAgICAgICAncGF0dGVybicsCiAgICAgICAgICAgICAgICAgICAgJ3BvbHlnb24nLAogICAgICAgICAgICAgICAgICAgICdwb2x5bGluZScsCiAgICAgICAgICAgICAgICAgICAgJ3JhZGlhbEdyYWRpZW50JywKICAgICAgICAgICAgICAgICAgICAncmVjdCcsCiAgICAgICAgICAgICAgICAgICAgJ3N0b3AnLAogICAgICAgICAgICAgICAgICAgICdzdmcnLAogICAgICAgICAgICAgICAgICAgICd0ZXh0JywKICAgICAgICAgICAgICAgICAgICAndHNwYW4nCiAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBWdFtlXSA9IFZ0KGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgR3QgPSBWdCwgTXQgPSAvXiMoW1xkQS1GXXs2fXxbXGRBLUZdezN9KSQvaSwgenQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMsIGUpLCB0aGlzLl91eFByaW1hcnlCdXR0b25UZXh0Q29sb3IgPSB2b2lkIDAsIHRoaXMuX3V4UHJpbWFyeUJ1dHRvbkNvbG9yID0gdm9pZCAwLCB0aGlzLl91eFNlY29uZGFyeUJ1dHRvblRleHRDb2xvciA9IHZvaWQgMCwgdGhpcy5fdXhTZWNvbmRhcnlCdXR0b25Db2xvciA9IHZvaWQgMCwgdGhpcy5fdXhGb250Q29sb3IgPSB2b2lkIDAsIHRoaXMuX3V4QmFja2dyb3VuZENvbG9yID0gdm9pZCAwLCB0aGlzLl91eFRvb2dsZUFjdGl2ZUNvbG9yID0gdm9pZCAwLCB0aGlzLl91eExpbmtDb2xvciA9IHZvaWQgMCwgdGhpcy5fcHJpbWFyeUJ1dHRvbkhvdmVyQmFja2dyb3VuZCA9IHZvaWQgMCwgdGhpcy5fc2Vjb25kYXJ5QnV0dG9uSG92ZXJCYWNrZ3JvdW5kID0gdm9pZCAwLCB0aGlzLl9zZWNvbmRhcnlUZXh0Q29sb3IgPSB2b2lkIDAsIHRoaXMuX2xpZ2h0VGV4dENvbG9yID0gdm9pZCAwLCB0aGlzLl9saWdodGVzdFRleHRDb2xvciA9IHZvaWQgMCwgdGhpcy5fb3ZlcmxheUNvbG9yID0gdm9pZCAwLCB0aGlzLl9ib3JkZXJDb2xvciA9IHZvaWQgMCwgdGhpcy5fc3ViSGVhZGVyQ29sb3IgPSB2b2lkIDAsIHRoaXMuX3BlcnNpc3RlbnRDb25zZW50TGlua0NvbG9yID0gdm9pZCAwLCB0aGlzLl9wZXJzaXN0ZW50Q29uc2VudExpbmtUZXh0Q29sb3IgPSB2b2lkIDAsIHRoaXMuX3dhcm5pbmdCYWNrZ3JvdW5kQ29sb3IgPSB2b2lkIDAsIHRoaXMuX3dhcm5pbmdUZXh0Q29sb3IgPSB2b2lkIDAsIHRoaXMuX2ZvbnQgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHNhLnRoZW1lLCB0ID0gbi51eFByaW1hcnlCdXR0b25Db2xvciwgciA9IG4udXhCYWNrZ3JvdW5kQ29sb3IsIG8gPSBuLnV4Rm9udENvbG9yLCBhID0gbi51eFByaW1hcnlCdXR0b25UZXh0Q29sb3IsIGkgPSBuLnV4U2Vjb25kYXJ5QnV0dG9uQ29sb3IsIHMgPSBuLnV4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yLCBjID0gbi51eFRvb2dsZUFjdGl2ZUNvbG9yLCBsID0gbi51eExpbmtDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3V4UHJpbWFyeUJ1dHRvblRleHRDb2xvciA9IGEsIHRoaXMuX3V4UHJpbWFyeUJ1dHRvbkNvbG9yID0gdCwgdGhpcy5fdXhTZWNvbmRhcnlCdXR0b25UZXh0Q29sb3IgPSBzLCB0aGlzLl91eFNlY29uZGFyeUJ1dHRvbkNvbG9yID0gaSwgdGhpcy5fdXhGb250Q29sb3IgPSBvLCB0aGlzLl91eEJhY2tncm91bmRDb2xvciA9IHIsIHRoaXMuX3V4VG9vZ2xlQWN0aXZlQ29sb3IgPSBjLCB0aGlzLl91eExpbmtDb2xvciA9IGwsIHRoaXMuX3ByaW1hcnlCdXR0b25Ib3ZlckJhY2tncm91bmQgPSBlLkxpZ2h0ZW5EYXJrZW5Db2xvcih0aGlzLl91eFByaW1hcnlCdXR0b25Db2xvciwgMzApLCB0aGlzLl9zZWNvbmRhcnlCdXR0b25Ib3ZlckJhY2tncm91bmQgPSB0LCB0aGlzLl9zdWJIZWFkZXJDb2xvciA9ICcjMjEyOTM0JywgdGhpcy5fc2Vjb25kYXJ5VGV4dENvbG9yID0gJyM0RDU0NUQnLCB0aGlzLl9saWdodFRleHRDb2xvciA9ICcjN0E3Rjg1JywgdGhpcy5fbGlnaHRlc3RUZXh0Q29sb3IgPSAnI0I3QjdCNycsIHRoaXMuX292ZXJsYXlDb2xvciA9ICdyZ2JhKDMzLCA0MSwgNTIsIDAuNzUpJywgdGhpcy5fYm9yZGVyQ29sb3IgPSAnI0Q4RDhEOCcsIHRoaXMuX3BlcnNpc3RlbnRDb25zZW50TGlua0NvbG9yID0gJyMzNjhCRDYnLCB0aGlzLl9wZXJzaXN0ZW50Q29uc2VudExpbmtUZXh0Q29sb3IgPSAnI0ZGRicsIHRoaXMuX3dhcm5pbmdCYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgyNTUsIDIyOSwgMTQzLCAwLjM1KScsIHRoaXMuX3dhcm5pbmdUZXh0Q29sb3IgPSAnI0ZBQUQxNCcsIHRoaXMuX2ZvbnQgPSAnSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NoZWNrVmFsaWRIZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdC50ZXN0KGUpID8gdGhpc1tuXSA9IGUgOiBjb25zb2xlLndhcm4oJycuY29uY2F0KGUsICcgaXMgbm90IGEgdmFsaWQgaGV4IHZhbHVlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXhMaW5rQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdXhMaW5rQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3V4TGlua0NvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd1eFRvb2dsZUFjdGl2ZUNvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3V4VG9vZ2xlQWN0aXZlQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3V4VG9vZ2xlQWN0aXZlQ29sb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3V4UHJpbWFyeUJ1dHRvblRleHRDb2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91eFByaW1hcnlCdXR0b25UZXh0Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3V4UHJpbWFyeUJ1dHRvblRleHRDb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXhQcmltYXJ5QnV0dG9uQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdXhQcmltYXJ5QnV0dG9uQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3V4UHJpbWFyeUJ1dHRvbkNvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdwcmltYXJ5QnV0dG9uSG92ZXJCYWNrZ3JvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ByaW1hcnlCdXR0b25Ib3ZlckJhY2tncm91bmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3ByaW1hcnlCdXR0b25Ib3ZlckJhY2tncm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3V4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3V4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ191eFNlY29uZGFyeUJ1dHRvblRleHRDb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXhTZWNvbmRhcnlCdXR0b25Db2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl91eFNlY29uZGFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ191eFNlY29uZGFyeUJ1dHRvbkNvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZWNvbmRhcnlCdXR0b25Ib3ZlckJhY2tncm91bmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2Vjb25kYXJ5QnV0dG9uSG92ZXJCYWNrZ3JvdW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ19zZWNvbmRhcnlCdXR0b25Ib3ZlckJhY2tncm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3V4Rm9udENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3V4Rm9udENvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ191eEZvbnRDb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc2Vjb25kYXJ5VGV4dENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlY29uZGFyeVRleHRDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbGlkSGV4KGUsICdfc2Vjb25kYXJ5VGV4dENvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsaWdodFRleHRDb2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9saWdodFRleHRDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbGlkSGV4KGUsICdfbGlnaHRUZXh0Q29sb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xpZ2h0ZXN0VGV4dENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpZ2h0ZXN0VGV4dENvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ19saWdodGVzdFRleHRDb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAndXhCYWNrZ3JvdW5kQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdXhCYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3V4QmFja2dyb3VuZENvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdvdmVybGF5Q29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheUNvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5Q29sb3IgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYm9yZGVyQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYm9yZGVyQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX2JvcmRlckNvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdWJIZWFkZXJDb2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdWJIZWFkZXJDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbGlkSGV4KGUsICdfc3ViSGVhZGVyQ29sb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3dhcm5pbmdCYWNrZ3JvdW5kQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2FybmluZ0JhY2tncm91bmRDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2FybmluZ0JhY2tncm91bmRDb2xvciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd3YXJuaW5nVGV4dENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dhcm5pbmdUZXh0Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZEhleChlLCAnX3dhcm5pbmdUZXh0Q29sb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3BlcnNpc3RlbnRDb25zZW50TGlua0NvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbnRDb25zZW50TGlua0NvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmFsaWRIZXgoZSwgJ19wZXJzaXN0ZW50Q29uc2VudExpbmtDb2xvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncGVyc2lzdGVudENvbnNlbnRMaW5rVGV4dENvbG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbnRDb25zZW50TGlua1RleHRDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZhbGlkSGV4KGUsICdfcGVyc2lzdGVudENvbnNlbnRMaW5rVGV4dENvbG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdmb250JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvbnQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwgW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdMaWdodGVuRGFya2VuQ29sb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIycgPT09IGVbMF0gJiYgKGUgPSBlLnNsaWNlKDEpLCB0ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHBhcnNlSW50KGUsIDE2KSwgbyA9IChyID4+IDE2KSArIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPiAyNTUgPyBvID0gMjU1IDogbyA8IDAgJiYgKG8gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAociA+PiA4ICYgMjU1KSArIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPiAyNTUgPyBhID0gMjU1IDogYSA8IDAgJiYgKGEgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAoMjU1ICYgcikgKyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA+IDI1NSA/IGkgPSAyNTUgOiBpIDwgMCAmJiAoaSA9IDApLCAodCA/ICcjJyA6ICcnKSArIChpIHwgYSA8PCA4IHwgbyA8PCAxNikudG9TdHJpbmcoMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBIdCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICAgIG1pbi13aWR0aDogMTkwcHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7XG4gICAgICAgIGZvbnQtc2l6ZTogJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3B4O1xuICAgICAgICBwYWRkaW5nOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgfVxuICAgICcKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAkdCgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgcGFkZGluZzogNXB4IDA7XG4gICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDA7XG4gICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDA7XG5cbiAgICAgICAgICAmLnFjLWNtcDItbGluay1hY3RpdmUge1xuICAgICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJi5xYy1jbXAyLWxpbmstaW5saW5lIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJjpob3ZlciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgICAgICAgZm9udC1zaXplOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAncHg7XG4gICAgICAgICAgfVxuICAgICAgICAnCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWXQoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgYmFja2dyb3VuZDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG5cbiAgICAgICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICAgICAgJjpob3ZlciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAnCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFl0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gV3QoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICYmLFxuICAgICAgJiYgJjpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIGJvcmRlcjogc29saWQgMXB4XG4gICAgICAgICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICB9XG4gICAgJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEp0KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWwogICAgICAgICAgICAgICAgICAgICAgICAnXG4mJiB7XG4gIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcbiAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICBib3JkZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMDtcbiAgbWluLWhlaWdodDogMzRweDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGxldHRlci1zcGFjaW5nOiAycHg7XG4gIG1hcmdpbjogMC41ZW07XG4gIHBhZGRpbmc6IDEycHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuMzVzIGVhc2U7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiA5NSU7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDFweCAxcHggcmdiYSgwLDAsMCwuMSk7XG5cbiAgQG1lZGlhKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgfVxuICB9XG5cbiAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gICAgICAnLAogICAgICAgICAgICAgICAgICAgICAgICAnXG5cbiAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gIEBtZWRpYShtYXgtd2lkdGg6IDM2MHB4KSB7XG4gICAgLyogc3VwcG9ydCBmb3IgaVBob25lIDUvU0UgR2FsYXh5IFM1ICovXG4gICAgbWFyZ2luOiAwLjNlbTtcbiAgfVxufVxuJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBKdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBYdCA9IEd0LmJ1dHRvbihKdCgpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25UZXh0Q29sb3I7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJpbWFyeUJ1dHRvbkhvdmVyQmFja2dyb3VuZDsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZGlzYWJsZWQsIHQgPSAoZS51eFNlY29uZGFyeUJ1dHRvbkNvbG9yLCBlLnV4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgRXQoV3QoKSwgenQuTGlnaHRlbkRhcmtlbkNvbG9yKHQsIC0zMCksIHp0LkxpZ2h0ZW5EYXJrZW5Db2xvcih0LCAtMzApLCB6dC5MaWdodGVuRGFya2VuQ29sb3IodCwgLTMwKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnV4U2Vjb25kYXJ5QnV0dG9uQ29sb3IsIHQgPSBlLnV4U2Vjb25kYXJ5QnV0dG9uVGV4dENvbG9yLCByID0gZS5tb2RlLCBvID0gZS5zZWNvbmRhcnlCdXR0b25Ib3ZlckJhY2tncm91bmQsIGEgPSBlLnV4UHJpbWFyeUJ1dHRvblRleHRDb2xvcjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzZWNvbmRhcnknID09PSByICYmIEV0KFl0KCksIG4sIHQsIHQsIG8sIG8sIGEpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5tb2RlLCB0ID0gZS51eFByaW1hcnlCdXR0b25Db2xvciwgciA9IGUuc2Vjb25kYXJ5VGV4dENvbG9yLCBvID0gZS51eExpbmtDb2xvciwgYSA9IGUuaXNMb25nOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2xpbmsnID09PSBuICYmIEV0KCR0KCksIHQsIHIsIG8sIGEgPyAxMSA6IDE0KTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2xhcmdlJyA9PT0gZS5zaXplICYmIEV0KEh0KCksIGUuaXNMb25nID8gMTEgOiAxNCwgZS5pc0xvbmcgPyAnMCAxNXB4ICFpbXBvcnRhbnQnIDogMCk7CiAgICAgICAgICAgICAgICAgICAgfSksIEt0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNoaWxkcmVuLCB0ID0gTnQoZSwgWydjaGlsZHJlbiddKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoWHQsIE9iamVjdC5hc3NpZ24oe30sIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4UHJpbWFyeUJ1dHRvbkNvbG9yOiBpYS51eFByaW1hcnlCdXR0b25Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4UHJpbWFyeUJ1dHRvblRleHRDb2xvcjogaWEudXhQcmltYXJ5QnV0dG9uVGV4dENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbkhvdmVyQmFja2dyb3VuZDogaWEucHJpbWFyeUJ1dHRvbkhvdmVyQmFja2dyb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4U2Vjb25kYXJ5QnV0dG9uQ29sb3I6IGlhLnV4U2Vjb25kYXJ5QnV0dG9uQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eFNlY29uZGFyeUJ1dHRvblRleHRDb2xvcjogaWEudXhTZWNvbmRhcnlCdXR0b25UZXh0Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eExpbmtDb2xvcjogaWEudXhMaW5rQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlCdXR0b25Ib3ZlckJhY2tncm91bmQ6IGlhLnNlY29uZGFyeUJ1dHRvbkhvdmVyQmFja2dyb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVRleHRDb2xvcjogaWEuc2Vjb25kYXJ5VGV4dENvbG9yCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgS3QuZGVmYXVsdFByb3BzID0gewogICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAnMCcsCiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3ByaW1hcnknLAogICAgICAgICAgICAgICAgICAgIHNpemU6ICdsYXJnZScsCiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBRdCwgWnQgPSBLdDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVyKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gfHwgKG8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpLCBuICYmIChvLmNsYXNzTmFtZSA9IG4pLCB0ICYmIChvLmlkID0gdCksIHIgJiYgci5pbnNlcnRCZWZvcmUobywgci5maXJzdENoaWxkKSksIG87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLkdMT0JBTCA9ICdnbG9iYWwnLCBlLlNFUlZJQ0UgPSAnc2VydmljZScsIGUuR0xPQkFMX0dST1VQID0gJ2dsb2JhbCBncm91cCcsIGUuU0VSVklDRV9HUk9VUCA9ICdzZXJ2aWNlIGdyb3VwJzsKICAgICAgICAgICAgICAgIH0oUXQgfHwgKFF0ID0ge30pKTsKICAgICAgICAgICAgICAgIHZhciBuciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvcmVDb25maWcsIHQgPSBuLnB1Ymxpc2hlckZlYXR1cmVzSWRzLCByID0gbi5wdWJsaXNoZXJTcGVjaWFsRmVhdHVyZXNJZHMsIG8gPSBuLnB1Ymxpc2hlclNwZWNpYWxQdXJwb3Nlc0lkcywgYSA9IG4ucHVibGlzaGVyUHVycG9zZUlkcywgaSA9IG4ucHVibGlzaGVyUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcywgcyA9IG4udmVuZG9yUHVycG9zZUlkcywgYyA9IG4udmVuZG9yUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcywgbCA9IG4udmVuZG9yU3BlY2lhbEZlYXR1cmVzSWRzLCB1ID0gbi52ZW5kb3JTcGVjaWFsUHVycG9zZXNJZHMsIHAgPSBuLnZlbmRvckZlYXR1cmVzSWRzLCBkID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcAogICAgICAgICAgICAgICAgICAgICAgICBdLCBmID0gKHMgfHwgW10pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAobiA9IGUpICYmIG4uc29ydChmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3NlSWRzOiAoZiA/IHMgOiBhKSB8fCBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkczogKGYgPyBjIDogaSkgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlc0lkczogKGYgPyBsIDogcikgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3Nlc0lkczogKGYgPyB1IDogbykgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzSWRzOiAoZiA/IHAgOiB0KSB8fCBbXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHRyID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKG4sICcqJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgcnIgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIGUuc3BsaXQobikucmVkdWNlKGZ1bmN0aW9uIChlLCByLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA/IGUuY29uY2F0KHRuLmNyZWF0ZUVsZW1lbnQoJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdC5jb25zZW50U2NvcGVHcm91cFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdfYmxhbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiArIHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pLCByKSA6IFtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgfSwgb3IgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyKHNhLmNvcmVDb25maWcuaXNBTVAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdC5DT05TRU5UX1VJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogT3QuRU5URVJfRlVMTFNDUkVFTgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHdpbmRvdy5fX3RjZmFwaXVpKCdnb1RvUGFnZScsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIGUuc3BsaXQobikucmVkdWNlKGZ1bmN0aW9uIChlLCByLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyA/IGUuY29uY2F0KHRuLmNyZWF0ZUVsZW1lbnQoWnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWxpbmstaW5saW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IG4gKyByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKSwgcikgOiBbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSkgOiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGFyID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIG51bGwsIGUuc3BsaXQoJ1tbL11dJykucmVkdWNlKGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQoaXIodCwgbiwgcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkpOwogICAgICAgICAgICAgICAgICAgIH0sIGlyID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyBSZWdFeHAoL1xbXFsoLio/KVxdXF0vKSwgbyA9IG5ldyBSZWdFeHAoLygoLio/KShbPUBdKT9cfCguKj8pKXwoKC4qPylcKil8KFwvKS8pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgncCcsIHsga2V5OiAncC0nICsgdCB9LCBlLnNwbGl0KHIpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyICYmICF0Lm1hdGNoKG8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHQuc3BsaXQoJ3wnKSwgaSA9IGFbMF0sIHMgPSBpLnNsaWNlKC0xKSwgYyA9IGkuc2xpY2UoMCwgaS5sZW5ndGggLSAxKSwgbCA9IGFbMV0sIHUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcqJyA9PT0gcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdG4uY3JlYXRlRWxlbWVudCgnc3Ryb25nJywgeyBrZXk6IHIgfSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnPScgPT09IHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwubWF0Y2gobmV3IFJlZ0V4cCgveyguKj8pfS8pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGwuc2xpY2UoMSwgbC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAmJiBuW3BdICYmICh1ID0gdG4uY3JlYXRlRWxlbWVudCgnYScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IG5bcF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdG4uY3JlYXRlRWxlbWVudCgnYScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0AnID09PSBzICYmICh1ID0gdG4uY3JlYXRlRWxlbWVudCgnYScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5fX3RjZmFwaXVpKCdnb1RvUGFnZScsIE51bWJlcihsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6ICcjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29uY2F0KHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkpOwogICAgICAgICAgICAgICAgICAgIH0sIHNyID0gZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaW5jbHVkZXMoJ1ticmVha10nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnNwbGl0KCdbYnJlYWtdJyksIG8gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmxlbmd0aCA+IDEgJiYgclsxXS5zcGxpdCgnPGJyPicpLmZvckVhY2goZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2godG4uY3JlYXRlRWxlbWVudCgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTDogeyBfX2h0bWw6IGUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBbdG4uY3JlYXRlRWxlbWVudCgncCcsIHsga2V5OiAtMSB9LCBvcihyWzBdLCBuKSldLmNvbmNhdChvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsga2V5OiAtMSB9LCBhcihlLCB0KSldOwogICAgICAgICAgICAgICAgICAgIH0sIGNyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PREVfRU5WOiAncHJvZHVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUJMSUNfVVJMOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNUF9GUkFNRV9VUkxfQkFTRTogJ2h0dHBzOi8vcXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvMzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1QX0NIRUNLX0NPTlNFTlRfVVJMOiAnaHR0cHM6Ly9hcGlzLnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL2FtcC9jaGVjay1jb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPQ0FMX1NUQVRJQ19ESVI6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBQ1RfQVBQX0xPR19BUEk6ICdodHRwczovL2F1ZGl0LXRjZnYyLnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9HRU9JUF9BUElfVVJMOiAnaHR0cHM6Ly9hcGlzLnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL2dlb2lwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9DTVBfQ09PS0lFX0FQSTogJ2h0dHBzOi8vYXBpcy5xdWFudGNhc3QubWdyLmNvbnNlbnN1Lm9yZy9Db29raWVBY2Nlc3NWMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFDVF9BUFBfR09PR0xFX0FUUF9VUkw6ICdodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL3RjZnYyL2dvb2dsZS1hdHAtbGlzdC5qc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9WRVJTSU9OOiAnMzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBQ1RfQVBQX0NNUFVJX1NSQzogJ2h0dHBzOi8vcXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvMzIvY21wMnVpLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUNUX0FQUF9HVkxfQkFTRV9VUkw6ICdodHRwczovL3F1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnL0dWTC12Mi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBQ1RfQVBQX1RSQU5TTEFUSU9OX0JBU0VfVVJMOiAnaHR0cHM6Ly93d3cucXVhbnRjYXN0Lm1nci5jb25zZW5zdS5vcmcvdGNmdjIvdHJhbnNsYXRpb25zLycKICAgICAgICAgICAgICAgICAgICAgICAgfSkuUkVBQ1RfQVBQX0RFQlVHICYmIGNvbnNvbGUubG9nKCdEZWJ1ZzogJyArIGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGxyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignVHJpZGVudC8nKSA+IC0xOwogICAgICAgICAgICAgICAgICAgIH0sIHVyID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkgJiYgZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW10sIHIgPSBbXSwgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNvcnQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIGlzTmFOKGVbbl0pID8gLTEgOiBlLm5hbWUudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHQubmFtZS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTEgJiYgbiA/IChlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05hTihlW25dKSA/IHQucHVzaChlKSA6IHIucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBbXS5jb25jYXQodCwgaShvKHIpKSkpIDogbyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBwciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gZS5jb3JlVWlMYWJlbHMsIHIgPSBlLmFjY2VwdEFsbEZ1bmN0aW9uLCBvID0gZS5yZWplY3RBbGxGdW5jdGlvbiwgYSA9IGUuYWNjZXB0U2VsZWN0ZWQsIGkgPSBlLnBhZ2UsIHMgPSBlLnNob3dSZWplY3RCdXR0b24sIGMgPSBlLnNob3dPdmVybGF5LCBsID0gZS5pc1Njcm9sbGVkLCB1ID0gZS5pc0FtcCwgcCA9IHNhLmNvcmVDb25maWcubGFuZ18sIGQgPSB0ID8gdC5zYXZlQW5kRXhpdEJ1dHRvbi5sZW5ndGggPiAxOCB8fCB0LmFncmVlQnV0dG9uLmxlbmd0aCA+IDE4IHx8IHQuaW5pdFNjcmVlblNldHRpbmdzQnV0dG9uLmxlbmd0aCA+IDE4IHx8IHQuaW5pdFNjcmVlblJlamVjdEJ1dHRvbi5sZW5ndGggPiAxOCA6IG51bGwsIGYgPSB0ID8gJ2VuJyAhPT0gcCAmJiB0LmxlZ2l0aW1hdGVJbnRlcmVzdExpbmsubGVuZ3RoID4gMTggfHwgdC5wdXJwb3NlU2NyZWVuVmVuZG9yTGluay5sZW5ndGggPiAxOCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gMCA9PT0gaSA/IHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1zdW1tYXJ5LWJ1dHRvbnMnIH0sIHMgJiYgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb25nOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdzZWNvbmRhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0LmluaXRTY3JlZW5SZWplY3RCdXR0b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmluaXRTY3JlZW5SZWplY3RCdXR0b24pLCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fdGNmYXBpdWkoJ2dvVG9QYWdlJywgMSksIHRyKHUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXQuQ09OU0VOVF9VSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBPdC5FTlRFUl9GVUxMU0NSRUVOCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ3NlY29uZGFyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQuaW5pdFNjcmVlblNldHRpbmdzQnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5pbml0U2NyZWVuU2V0dGluZ3NCdXR0b24pLCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0LmFncmVlQnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5hZ3JlZUJ1dHRvbikpIDogdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgbnVsbCwgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMb25nOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItaGlkZS1kZXNrdG9wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogdC5zYXZlQW5kRXhpdEJ1dHRvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuc2F2ZUFuZEV4aXRCdXR0b24pLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItZm9vdGVyLWxpbmtzJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fdGNmYXBpdWkoJ2dvVG9QYWdlJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogMiA9PT0gaSA/ICdxYy1jbXAyLWxpbmstYWN0aXZlJyA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0LnB1cnBvc2VTY3JlZW5WZW5kb3JMaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wdXJwb3NlU2NyZWVuVmVuZG9yTGluayksIHRuLmNyZWF0ZUVsZW1lbnQoWnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9uZzogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX190Y2ZhcGl1aSgnZ29Ub1BhZ2UnLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAzID09PSBpID8gJ3FjLWNtcDItbGluay1hY3RpdmUnIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHQubGVnaXRpbWF0ZUludGVyZXN0TGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQubGVnaXRpbWF0ZUludGVyZXN0TGluaykpLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItYnV0dG9ucy1kZXNrdG9wJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiB0LnNhdmVBbmRFeGl0QnV0dG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5zYXZlQW5kRXhpdEJ1dHRvbikpKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWZvb3RlciAnLmNvbmNhdChjID8gJ3FjLWNtcDItZm9vdGVyLW92ZXJsYXknIDogJycsICcgJykuY29uY2F0KGwgPyAncWMtY21wMi1mb290ZXItc2Nyb2xsZWQnIDogJycpIH0sIG4pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkcigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgICAgICB3aWR0aDogMTMwcHg7XG5cbiAgICAgICAgICAgIGltZyB7XG4gICAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHtcbiAgICAgICAgICAgICAgd2lkdGg6IDE3MHB4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICddKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmcigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgICAgICBoZWlnaHQ6IDQ1cHg7XG4gICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG5cbiAgICAgICAgICAgIGltZyB7XG4gICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgICAgICAgICBoZWlnaHQ6IDYwcHg7XG4gICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICAgICAgbWF4LXdpZHRoOiA3NzBweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbXIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgfVxuJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBtciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBociA9IEd0LmRpdihtcigpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQoZS5pc1NxdWFyZSA/IGZyKCkgOiBkcigpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgZ3IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubG9nb1VybCwgdCA9IGcoZmUoITEpLCAyKSwgciA9IHRbMF0sIG8gPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChociwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTcXVhcmU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdsb2dvLWNvbnRhaW5lcicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudCgnaW1nJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OiAnUHVibGlzaGVyIExvZ28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Mb2FkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5vZmZzZXRIZWlnaHQgPj0gbi5vZmZzZXRXaWR0aCAmJiBvKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5cigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogM3B4O1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAxNSUgMzAlO1xuXG4gICAgICAgIC5xYy1jbXAyLWV4cGFuZGFibGUtbGVnYWwucWMtY21wMi1leHBhbmRlZCAmIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gICAgICAgIH1cbiAgICAgICddKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2cigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgIGhlaWdodDogMTJweDtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgd2lkdGg6IDEycHg7XG5cbiAgICAgICAgLmV4cGFuZGVkICYge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7XG4gICAgICAgIH1cbiAgICAgICddKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdnIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBicigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgIGhlaWdodDogMTlweDtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTtcbiAgICAgICAgd2lkdGg6IDEycHg7XG5cbiAgICAgICAgLnFjLWNtcDItZXhwYW5kZWQgJiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbiAgICAgICAgfVxuICAgICAgJ10pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBiciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9yKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWydcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geHIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYmIHtcbiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcyBlYXNlO1xuXG4gICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuXG4gICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEVyID0gR3Quc3ZnKHhyKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFjaycgPT09IGUudHlwZSAmJiBFdChfcigpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2V4cGFuZCcgPT09IGUudHlwZSAmJiBFdChicigpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2lubmVyJyA9PT0gZS50eXBlICYmIEV0KHZyKCkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZmlsbCcgPT09IGUudHlwZSAmJiBFdCh5cigpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgQ3IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCA9IGUudHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbGwnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRuLmNyZWF0ZUVsZW1lbnQoJ3BhdGgnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogJ001IDQuNUwwLjUgMEwwLjUgOUw1IDQuNVonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdjdXJyZW50Q29sb3InCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdleHBhbmQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbm5lcic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgbnVsbCwgdG4uY3JlYXRlRWxlbWVudCgnZGVmcycsIG51bGwsIHRuLmNyZWF0ZUVsZW1lbnQoJ3BhdGgnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDogJ00zLjg4NzE2ODg2LDguNDcwNDgzNzEgTDEyLjE0MzE0NzIsMC4zMTU4MjY0MTkgQzEyLjQ3MjU0NTMsLTAuMDE0NTc3Nzk4NyAxMy4wMDUxODksLTAuMDE0NTc3Nzk4NyAxMy4zMzQ1ODcyLDAuMzE1ODI2NDE5IEwxMy44MzIxODg2LDAuODE0OTQ3Njg1IEMxNC4xNjE1ODY3LDEuMTQ1MzUxOSAxNC4xNjE1ODY3LDEuNjc5NjIyNTUgMTMuODMyMTg4NiwyLjAxMDAyNjc3IEw2LjY2MjUyMzIsOS4wNjgwMjMyNiBMMTMuODI1MTgwMSwxNi4xMjYwMTk3IEMxNC4xNTQ1NzgyLDE2LjQ1NjQyNCAxNC4xNTQ1NzgyLDE2Ljk5MDY5NDYgMTMuODI1MTgwMSwxNy4zMjEwOTg4IEwxMy4zMjc1Nzg3LDE3LjgyMDIyMDEgQzEyLjk5ODE4MDYsMTguMTUwNjI0MyAxMi40NjU1MzY4LDE4LjE1MDYyNDMgMTIuMTM2MTM4NywxNy44MjAyMjAxIEwzLjg4MDE2MDM5LDkuNjY1NTYyOCBDMy41NTc3NzA3NSw5LjMzNTE1ODU4IDMuNTU3NzcwNzUsOC44MDA4ODc5MyAzLjg4NzE2ODg2LDguNDcwNDgzNzEgWicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwYXRoLTEnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdG4uY3JlYXRlRWxlbWVudCgncmVjdCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3BhdGgtMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6ICcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzE4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxOCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdG4uY3JlYXRlRWxlbWVudCgnZycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ05ldy0tLU1vYmlsZS0yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICdub25lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogJzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICdub25lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsUnVsZTogJ2V2ZW5vZGQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdnJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaVBob25lLTExLTYtQ29weScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKC0yMy4wMDAwMDAsIC0xMzguMDAwMDAwKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2cnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICd2MScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlKDIwLjAwMDAwMCwgMTM4LjAwMDAwMCknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdnJywgeyBpZDogJ0ljb25zL2FuZ2xlLWxlZnQnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ21hc2snLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdtYXNrLTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6ICd3aGl0ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ3VzZScsIHsgaHJlZjogJyNwYXRoLTEnIH0pKSwgdG4uY3JlYXRlRWxlbWVudCgndXNlJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnTWFzaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ2N1cnJlbnRDb2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU6ICdub256ZXJvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiAnI3BhdGgtMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCB0bi5jcmVhdGVFbGVtZW50KCdkZWZzJywgbnVsbCwgdG4uY3JlYXRlRWxlbWVudCgncGF0aCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiAnTTMuODg3MTY4ODYsOC40NzA0ODM3MSBMMTIuMTQzMTQ3MiwwLjMxNTgyNjQxOSBDMTIuNDcyNTQ1MywtMC4wMTQ1Nzc3OTg3IDEzLjAwNTE4OSwtMC4wMTQ1Nzc3OTg3IDEzLjMzNDU4NzIsMC4zMTU4MjY0MTkgTDEzLjgzMjE4ODYsMC44MTQ5NDc2ODUgQzE0LjE2MTU4NjcsMS4xNDUzNTE5IDE0LjE2MTU4NjcsMS42Nzk2MjI1NSAxMy44MzIxODg2LDIuMDEwMDI2NzcgTDYuNjYyNTIzMiw5LjA2ODAyMzI2IEwxMy44MjUxODAxLDE2LjEyNjAxOTcgQzE0LjE1NDU3ODIsMTYuNDU2NDI0IDE0LjE1NDU3ODIsMTYuOTkwNjk0NiAxMy44MjUxODAxLDE3LjMyMTA5ODggTDEzLjMyNzU3ODcsMTcuODIwMjIwMSBDMTIuOTk4MTgwNiwxOC4xNTA2MjQzIDEyLjQ2NTUzNjgsMTguMTUwNjI0MyAxMi4xMzYxMzg3LDE3LjgyMDIyMDEgTDMuODgwMTYwMzksOS42NjU1NjI4IEMzLjU1Nzc3MDc1LDkuMzM1MTU4NTggMy41NTc3NzA3NSw4LjgwMDg4NzkzIDMuODg3MTY4ODYsOC40NzA0ODM3MSBaJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3BhdGgtMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0bi5jcmVhdGVFbGVtZW50KCdyZWN0JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncGF0aC0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogJzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzE4JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0bi5jcmVhdGVFbGVtZW50KCdnJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnTmV3LS0tTW9iaWxlLTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJ25vbmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAnMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ25vbmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxSdWxlOiAnZXZlbm9kZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2cnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdpUGhvbmUtMTEtNi1Db3B5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoLTIzLjAwMDAwMCwgLTEzOC4wMDAwMDApJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudCgnZycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3YxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUoMjAuMDAwMDAwLCAxMzguMDAwMDAwKScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2cnLCB7IGlkOiAnSWNvbnMvYW5nbGUtbGVmdCcgfSwgdG4uY3JlYXRlRWxlbWVudCgnbWFzaycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ21hc2stMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3doaXRlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudCgndXNlJywgeyBocmVmOiAnI3BhdGgtMScgfSkpLCB0bi5jcmVhdGVFbGVtZW50KCd1c2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdNYXNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsOiAnIzAwMDAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU6ICdub256ZXJvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiAnI3BhdGgtMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoRXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJzEycHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTlweCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94OiAnMCAwIDEyIDE5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICcxLjEnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pOwogICAgICAgICAgICAgICAgICAgIH0sIGtyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvcmVVaUxhYmVscywgdCA9IGUucGFnZSwgciA9IGUuaGFuZGxlU2Nyb2xsLCBvID0gZS5ib2R5Q29udGVudCwgYSA9IGUuaXNBbXAsIGkgPSBlLmlzRGVza3RvcCwgcyA9IGUuZGlzYWJsZWRBY2NlcHRBbGxCdXR0b24sIGMgPSBlLmFjY2VwdEFsbEhlYWRlciwgbCA9IGUucmVqZWN0QWxsSGVhZGVyLCB1ID0gc2EuY29yZUNvbmZpZy5wdWJsaXNoZXJMb2dvLCBwID0gby5ib2R5VGV4dCwgZCA9IG8uaXNDdXN0b21pemVkLCBmID0gbiA/IG4ucmVqZWN0QWxsLmxlbmd0aCA+IDE4IHx8IG4uYWNjZXB0QWxsLmxlbmd0aCA+IDE4IHx8IG4ub2JqZWN0QWxsQnV0dG9uLmxlbmd0aCA+IDE4IDogbnVsbCwgbSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQgPyB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItc3VtbWFyeS1pbmZvICcuY29uY2F0KHUgPyAncWMtY21wMi1sb2dvLWRpc3BsYXllZCcgOiAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAmJiByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmNoaWxkcmVuKSA6IHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIG51bGwsIGUuY2hpbGRyZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA/IHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIG51bGwsIHApIDogQXJyYXkuaXNBcnJheShwKSA/IHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIHAubWFwKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBrZXk6IG4gfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogdG4uY3JlYXRlRWxlbWVudCgncCcsIG51bGwsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gdCA/IG51bGwgOiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItaGVhZGVyLWxpbmtzJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9uZzogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IDMgPT09IHQgPyBuLm9iamVjdEFsbEJ1dHRvbiA6IG4ucmVqZWN0QWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMgPT09IHQgPyBuLm9iamVjdEFsbEJ1dHRvbiA6IG4ucmVqZWN0QWxsKSwgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogbi5hY2NlcHRBbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5hY2NlcHRBbGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItY29uc2VudC1pbmZvJyB9LCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItcHVibGlzaGVyLWxvZ28tY29udGFpbmVyJyB9LCB0ID4gMSAmJiB0bi5jcmVhdGVFbGVtZW50KCdidXR0b24nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWhvbWUtYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX190Y2ZhcGl1aSgnZ29Ub1BhZ2UnLCB0IC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiBuLmJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoQ3IsIHsgdHlwZTogJ2JhY2snIH0pLCAnICcsICghYSB8fCBpKSAmJiBuLmJhY2spLCB0bi5jcmVhdGVFbGVtZW50KCdmaWd1cmUnLCBudWxsLCB1ICYmIHRuLmNyZWF0ZUVsZW1lbnQoZ3IsIHsgbG9nb1VybDogdSB9KSwgdG4uY3JlYXRlRWxlbWVudCgnaDInLCBudWxsLCBuLmluaXRTY3JlZW5UaXRsZSkpLCB0bi5jcmVhdGVFbGVtZW50KG0sIG51bGwsIHRuLmNyZWF0ZUVsZW1lbnQoaCwgbnVsbCkpLCB0bi5jcmVhdGVFbGVtZW50KGcsIG51bGwpKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdyKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWydcbiAgICAgICAgICAgICAgICAgIGhlaWdodDogMzRweDtcblxuICAgICAgICAgICAgICAgICAgc3ZnIHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTRweDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gU3IoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcGFkZGluZzogMDtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgICY6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAucWMtY21wMi1saXN0LWhlYWRlciB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmOmxhc3Qtb2YtdHlwZSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgIH1cblxuICAgIC5xYy1jbXAyLWxpc3QtaGVhZGVyIHtcbiAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDkwMDtcbiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgIH1cblxuICAgIC5xYy1jbXAyLWxpc3QtaXRlbSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHBhZGRpbmc6IDEwcHggMjBweDtcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG5cbiAgICAgICYucWMtY21wMi1leHBhbmRlZCB7XG4gICAgICAgIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgfVxuXG4gICAgICAmOm9ubHktb2YtdHlwZSB7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgfVxuXG4gICAgICAmOm50aC1vZi10eXBlKGV2ZW4pIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1saXN0LWl0ZW0taGVhZGVyIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBtaW4taGVpZ2h0OiAyMXB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuXG4gICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgIHBhZGRpbmc6IC0yMHB4O1xuICAgICAgICAgIG91dGxpbmUtc3R5bGU6IHNvbGlkO1xuICAgICAgICAgIG91dGxpbmUtY29sb3I6ICNEOEQ4RDg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJi5xYy1jbXAyLWxpc3QtaXRlbS1sZWdpdGltYXRlIHtcbiAgICAgICAgLnFjLWNtcDItbGlzdC1pdGVtLXRpdGxlIHtcbiAgICAgICAgICB3aWR0aDogNzUlO1xuICAgICAgICB9XG4gICAgICAgIC5xYy1jbXAyLXRvZ2dsZS1zd2l0Y2gge1xuICAgICAgICAgIG9yZGVyOiAyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLWxpc3QtaXRlbS10aXRsZSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgd2lkdGg6IDgwJTtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHN0cm9uZyB7XG4gICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItbGlzdC1pdGVtLXN0YXR1cyB7XG4gICAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgd29yZC13cmFwOiBub3JtYWw7XG5cbiAgICAgICAgJi5xYy1jbXAtbG9uZy1sYWJlbCB7XG4gICAgICAgICAgZm9udC1zaXplOiA5cHg7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDFlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbWcge1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlO1xuICAgICAgICBtYXgtd2lkdGg6IDEycHg7XG4gICAgICB9XG5cbiAgICAgICYucWMtY21wMi10b2dnbGUtc3dpdGNoIHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGZpbGw7XG4gICAgICAgIHBhZGRpbmc6IDAgMjBweDtcbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItdG9nZ2xlIHtcbiAgICAgICAgJjpub3QoOmxhc3QtY2hpbGQpIHtcbiAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1saXN0IHtcbiAgICAgICAgbGlzdC1zdHlsZTogbm9uZTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBtYXgtaGVpZ2h0OiAwO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgbWF4LWhlaWdodCAwLjNzIGVhc2UsIHBhZGRpbmcgMC4zcyBlYXNlLFxuICAgICAgICAgIG1hcmdpbiAwLjNzIGVhc2U7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuXG4gICAgICAgICYucWMtd3JhcCB7XG4gICAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuXG4gICAgICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1pbmZvIHtcbiAgICAgICAgICAgIG9yZGVyOiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHAsXG4gICAgICAgIGxpIHtcbiAgICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcblxuICAgICAgICAgIGEge1xuICAgICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICY6bm90KDpmaXJzdC1jaGlsZCkge1xuICAgICAgICAgICAgc3Ryb25nIHtcbiAgICAgICAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuICAgICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1pbmZvIHtcbiAgICAgICAgICB3aWR0aDogODUlO1xuXG4gICAgICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1sZWdhbCB7XG4gICAgICAgICAgICAucWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uIHtcbiAgICAgICAgICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLnFjLWNtcDItbGVnYWwtZGVzY3JpcHRpb24ge1xuICAgICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICYucWMtY21wMi1leHBhbmRlZCB7XG4gICAgICAgICAgICAgIC5xYy1jbXAyLWxlZ2FsLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuXG4gICAgICAgICAgICAgICAgJi5xYy1jbXAyLW5vbi1pYWIge1xuICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMC42NTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJi5xYy1jbXAyLWV4cGFuZGVkIHtcbiAgICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1saXN0IHtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiAxNTAwMDBweDtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBmaWxsO1xuICAgICAgICAgIG1hcmdpbjogMTVweCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICAucWMtY21wMi1saXN0LWl0ZW0ge1xuICAgICAgICBwYWRkaW5nOiAxNXB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG5cbiAgICAgICAgJi5xYy1jbXAyLWxpc3QtaXRlbS1sZWdpdGltYXRlIHtcbiAgICAgICAgICAucWMtY21wMi1saXN0LWl0ZW0tdGl0bGUge1xuICAgICAgICAgICAgd2lkdGg6IDgyJTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAucWMtY21wMi1saXN0LWl0ZW0tdGl0bGUge1xuICAgICAgICAgIHdpZHRoOiA5MCU7XG4gICAgICAgIH1cblxuICAgICAgICAucWMtY21wMi1leHBhbmRhYmxlLWxpc3Qge1xuICAgICAgICAgICYucWMtd3JhcCB7XG4gICAgICAgICAgICAucWMtY21wMi1leHBhbmRhYmxlLWluZm8ge1xuICAgICAgICAgICAgICBvcmRlcjogMDtcblxuICAgICAgICAgICAgICAmLnFjLXc3NSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDc1JTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5xYy1jbXAyLWxpc3QtaXRlbS1zdGF0dXMge1xuICAgICAgICAgICYucWMtY21wLWxvbmctbGFiZWwge1xuICAgICAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1saXN0LWhlYWRlciB7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMDtcbiAgICAgIH1cbiAgICB9XG4gICAgQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gICAgICAucWMtY21wMi1saXN0LWl0ZW0ge1xuICAgICAgICAmLnFjLWNtcDItbGlzdC1pdGVtLWxlZ2l0aW1hdGUge1xuICAgICAgICAgIC5xYy1jbXAyLWV4cGFuZGFibGUtbGlzdCB7XG4gICAgICAgICAgICBmbGV4LXdyYXA6IG5vLXdyYXA7XG4gICAgICAgICAgICAucWMtY21wMi10b2dnbGUtc3dpdGNoIHtcbiAgICAgICAgICAgICAgb3JkZXI6IDE7XG4gICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICBidXR0b257XG4gICAgICAgICAgICAgICAgZmxvYXQ6cmlnaHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC5xYy1jbXAyLWV4cGFuZGFibGUtaW5mbyB7XG4gICAgICAgICAgICAgIHdpZHRoOjEwMCVcbiAgICAgICAgICAgICAgb3JkZXI6IDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIExyID0gR3QudWwoU3IoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJIZWFkZXJDb2xvcjsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudXhCYWNrZ3JvdW5kQ29sb3I7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5ib3JkZXJDb2xvcjsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYm9yZGVyQ29sb3I7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxpZ2h0VGV4dENvbG9yOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZWNvbmRhcnlUZXh0Q29sb3I7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxpZ2h0VGV4dENvbG9yOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZWNvbmRhcnlUZXh0Q29sb3I7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4UHJpbWFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pc0lFICYmIEV0KHdyKCkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQcigpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgICAgICBiYWNrZ3JvdW5kOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICBib3JkZXItY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDE4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDE4cHg7XG4gICAgICAgIC50b2dnbGUge1xuICAgICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgICAgIHAudGV4dCB7XG4gICAgICAgICAgJi5vbiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICAgIH1cbiAgICAgICAgICAmLm9mZiB7XG4gICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDI1cHg7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcbiAgICAgICAgfVxuICAgICAgJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBQciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRyKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWwogICAgICAgICAgICAgICAgICAgICAgICAnXG4gICYmJiYge1xuICAgIHdpZHRoOiAzMHB4O1xuICAgIGhlaWdodDogMThweDtcbiAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW46IDAgMCAwIGF1dG87XG4gICAgYmFja2dyb3VuZDogI2E2YTlhZTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2E2YTlhZTtcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xuICAgIG1pbi1oZWlnaHQ6IDE4cHg7XG5cbiAgICAudG9nZ2xlIHtcbiAgICAgIHdpZHRoOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgaGVpZ2h0OiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB0b3A6IDA7XG4gICAgICByaWdodDogMTJweDtcbiAgICB9XG5cbiAgICBwLnRleHQge1xuICAgICAgZm9udC1zaXplOiA5cHg7XG4gICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG4gICAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgZGlzcGxheTogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICYub24ge1xuICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgIH1cbiAgICAgICYub2ZmIHtcbiAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICB9XG4gICAgfVxuICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgd2lkdGg6IDUwcHg7XG4gICAgICBoZWlnaHQ6IDI1cHg7XG4gICAgICBtaW4taGVpZ2h0OiAyNXB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogMjVweDtcbiAgICAgIHAudGV4dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDMwcHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICB9XG5cbiAgICAgIC50b2dnbGUge1xuICAgICAgICB3aWR0aDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgaGVpZ2h0OiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICByaWdodDogMjVweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHFyID0gR3QuYnV0dG9uKFRyKCksICcxOHB4JywgJzE4cHgnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zaG93TGFiZWwgPyAnYmxvY2snIDogJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4UHJpbWFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNlY29uZGFyeVRleHRDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCAnMjVweCcsICcyNXB4JywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnN3aXRjaFN0YXRlLCB0ID0gZS51eFRvb2dsZUFjdGl2ZUNvbG9yLCByID0gZS5zaG93TGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIEV0KFByKCksIHQsIHQsIHIgPyAnYmxvY2snIDogJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICB9KSwgQXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUub24sIHQgPSB2b2lkIDAgIT09IG4gJiYgbiwgciA9IGUuY2xhc3NOYW1lLCBvID0gZS5vbkNsaWNrLCBhID0gZS5zaG93TGFiZWwsIGkgPSB2b2lkIDAgIT09IGEgJiYgYSwgcyA9IGUuZGlzYWJsZWQsIGMgPSB2b2lkIDAgIT09IHMgJiYgcywgbCA9IE50KGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGFzc05hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbkNsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvd0xhYmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzYWJsZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQocXIsIE9iamVjdC5hc3NpZ24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiAnc3dpdGNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogJ0NvbnNlbnQgdG9nZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWNoZWNrZWQnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoU3RhdGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiByICYmIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93TGFiZWw6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4UHJpbWFyeUJ1dHRvbkNvbG9yOiBpYS51eFByaW1hcnlCdXR0b25Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVRleHRDb2xvcjogaWEuc2Vjb25kYXJ5VGV4dENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXhUb29nbGVBY3RpdmVDb2xvcjogaWEudXhUb29nbGVBY3RpdmVDb2xvcgogICAgICAgICAgICAgICAgICAgICAgICB9LCBsKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICd0b2dnbGUnIH0pLCB0bi5jcmVhdGVFbGVtZW50KCdwJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAndGV4dCBvZmYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAnVG9nZ2xlIG9mZicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2EuY29yZVVpTGFiZWxzLm9mZkxhYmVsKSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3RleHQgb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAnVG9nZ2xlIG9uJwogICAgICAgICAgICAgICAgICAgICAgICB9LCBzYS5jb3JlVWlMYWJlbHMub25MYWJlbCkpOwogICAgICAgICAgICAgICAgICAgIH0sIElyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnVybCwgdCA9IGUubGFiZWwsIHIgPSBlLmJvbGRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgbnVsbCwgciA/IHRuLmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycsIG51bGwsICcnLmNvbmNhdCh0LCAnOiAnKSkgOiAnJy5jb25jYXQodCwgJzogJyksIHRuLmNyZWF0ZUVsZW1lbnQoJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnX2JsYW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbDogJ25vb3BlbmVyIG5vcmVmZXJyZXInCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgSXIuZGVmYXVsdFByb3BzID0geyBib2xkZWQ6ICExIH07CiAgICAgICAgICAgICAgICB2YXIgT3IgPSBJciwgTnIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuc2Vjb25kcywgdCA9IGUubGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdsaScsIG51bGwsICcnLmNvbmNhdCh0LCAnOiAnKS5jb25jYXQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzAgJy5jb25jYXQoc2EuY29yZVVpTGFiZWxzLnNlY29uZHNMYWJlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUgLyA4NjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID49IDEgPyAnJy5jb25jYXQoTWF0aC5yb3VuZChuKSwgJyAnKS5jb25jYXQoc2EuY29yZVVpTGFiZWxzLmRheXNMYWJlbCkgOiAnJy5jb25jYXQoZSwgJyAnKS5jb25jYXQoc2EuY29yZVVpTGFiZWxzLnNlY29uZHNMYWJlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0obikpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUnIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbJ1xuICAmJiYge1xuICAgIHVsLml0ZW1zIHtcbiAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICBwYWRkaW5nLWxlZnQ6IDE1cHg7XG5cbiAgICAgIGxpIHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7XG4gICAgICB9XG4gICAgfVxuICB9XG4nXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVXIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbJ1xuICAmJiYge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIHBhZGRpbmc6IDVweCAwO1xuICAgIHdpZHRoOiA1MCU7XG4gIH1cbiddKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgRHIgPSBHdC5kaXYoVXIoKSksIEJyID0gR3QuZGl2KFJyKCkpLCBqciA9IHQoMiksIEZyID0gdC5uKGpyKSwgVnIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubGFiZWwsIHQgPSBlLnVybCwgciA9IGcoZmUoITEpLCAyKSwgbyA9IHJbMF0sIGEgPSByWzFdLCBpID0gZyhmZShbXSksIDIpLCBzID0gaVswXSwgYyA9IGlbMV0sIGwgPSBnKGZlKCExKSwgMiksIHUgPSBsWzBdLCBwID0gbFsxXSwgZCA9IGcoZmUoJycpLCAyKSwgZiA9IGRbMF0sIG0gPSBkWzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAhdSAmJiBGci5hLmdldCh0KS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRpc2Nsb3N1cmVzICYmIGMoZS5kaXNjbG9zdXJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoW10pLCBtKCdFcnJvcjogY2Fubm90IGxvYWQgdmVuZG9yIGZpbGUuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcCghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgXSksIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnJy5jb25jYXQobyA/ICdleHBhbmRlZCcgOiAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoIW8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KERyLCBudWxsLCBuLCAnICcsIHRuLmNyZWF0ZUVsZW1lbnQoQ3IsIHsgdHlwZTogJ2lubmVyJyB9KSksIG8gJiYgdG4uY3JlYXRlRWxlbWVudChCciwgbnVsbCwgcy5sZW5ndGggPiAwICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ3VsJywgeyBjbGFzc05hbWU6ICdpdGVtcycgfSwgcy5tYXAoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdsaScsIHsga2V5OiBuIH0sIE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBrZXk6IHQgfSwgbiwgJzogJywgZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgZiAmJiB0bi5jcmVhdGVFbGVtZW50KCdzcGFuJywgbnVsbCwgJ1x4QTBceEEwJywgZikpKTsKICAgICAgICAgICAgICAgICAgICB9LCBHciA9IHF0LkxFR0lUSU1BVEVfVkVORE9SUywgTXIgPSBxdC5MRUdJVElNQVRFX1BVUlBPU0VTLCB6ciA9IHF0LlBVUlBPU0VTLCBIciA9IHF0LkZFQVRVUkVTLCAkciA9IHF0LlNQRUNJQUxfUFVSUE9TRVMsIFlyID0gcXQuU1BFQ0lBTF9GRUFUVVJFUywgV3IgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IG4ubGVnaXRpbWF0ZVNjcmVlbk9iamVjdCA6IG4ubGVnaXRpbWF0ZVNjcmVlbkFjY2VwdDsKICAgICAgICAgICAgICAgICAgICB9LCBKciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jbXBVSSwgdCA9IGUuZWxlbWVudCwgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS50b2dnbGVzSGlkZGVuLCBhID0gZS5kYXRhVHlwZSwgaSA9IGUucG9wdWxhdGVWZW5kb3JJbmZvLCBzID0gZS5zZXRTdGF0dXMsIGMgPSBlLnN0YXR1cywgbCA9IGUuaXNOb25JYWJDb25zZW50OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgndWwnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItZXhwYW5kYWJsZS1saXN0JyB9LCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItZXhwYW5kYWJsZS1pbmZvJyB9LCB0LnBvbGljeVVybCAmJiB0bi5jcmVhdGVFbGVtZW50KE9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQucG9saWN5VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHIucHJpdmFjeVBvbGljeUxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZGVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5kZXNjcmlwdGlvbiAmJiB0bi5jcmVhdGVFbGVtZW50KCdsaScsIG51bGwsIHRuLmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycsIG51bGwsIHIuZGVzY3JpcHRpb25MYWJlbCksIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCBudWxsLCB0LmRlc2NyaXB0aW9uKSksIHQucHVycG9zZXMgJiYgdC5wdXJwb3Nlcy5sZW5ndGggPiAwICYmIGwgJiYgaSh0LnB1cnBvc2VzLCB6ciwgciksIHQubGVnSW50UHVycG9zZXMgJiYgdC5sZWdJbnRQdXJwb3Nlcy5sZW5ndGggPiAwICYmICFsICYmIGkodC5sZWdJbnRQdXJwb3NlcywgTXIsIHIpKSwgIW8gJiYgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZS1zd2l0Y2gnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoQXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUucHJldmVudERlZmF1bHQoKSwgcyghYyksIG4uaGFuZGxlQ29uc2VudCh0LmlkLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9LCBYciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jbXBVSSwgdCA9IGUuZWxlbWVudCwgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS50b2dnbGVzSGlkZGVuLCBhID0gZS5kYXRhVHlwZSwgaSA9IGUucG9wdWxhdGVWZW5kb3JJbmZvLCBzID0gZS5zZXRTdGF0dXMsIGMgPSBlLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ3VsJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtbGlzdCcgfSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtaW5mbycgfSwgdC5wb2xpY3lVcmwgJiYgdG4uY3JlYXRlRWxlbWVudChPciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LnBvbGljeVVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByLnByaXZhY3lQb2xpY3lMYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdm9pZCAwICE9PSB0LmNvb2tpZU1heEFnZVNlY29uZHMgJiYgdG4uY3JlYXRlRWxlbWVudChOciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdC5jb29raWVNYXhBZ2VTZWNvbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHIuY29va2llTWF4QWdlTGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZvaWQgMCAhPT0gdC5kZXZpY2VTdG9yYWdlRGlzY2xvc3VyZVVybCAmJiB0bi5jcmVhdGVFbGVtZW50KFZyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQuZGV2aWNlU3RvcmFnZURpc2Nsb3N1cmVVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogci5zdG9yYWdlRGlzY2xvc3VyZUxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LnB1cnBvc2VzICYmIHQucHVycG9zZXMubGVuZ3RoID4gMCAmJiBpKHQucHVycG9zZXMsIHpyLCByKSwgdC5zcGVjaWFsUHVycG9zZXMgJiYgdC5zcGVjaWFsUHVycG9zZXMubGVuZ3RoID4gMCAmJiBpKHQuc3BlY2lhbFB1cnBvc2VzLCAkciwgciksIHQuZmVhdHVyZXMgJiYgdC5mZWF0dXJlcy5sZW5ndGggPiAwICYmIGkodC5mZWF0dXJlcywgSHIsIHIpLCB0LnNwZWNpYWxGZWF0dXJlcyAmJiB0LnNwZWNpYWxGZWF0dXJlcy5sZW5ndGggPiAwICYmIGkodC5zcGVjaWFsRmVhdHVyZXMsIFlyLCByKSksICFvICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUtc3dpdGNoJyB9LCB0bi5jcmVhdGVFbGVtZW50KEFyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpLCBzKCFjKSwgbi5oYW5kbGVDb25zZW50KHQuaWQsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgIH0sIEtyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNtcFVJLCB0ID0gZS5lbGVtZW50LCByID0gZS5jb3JlVWlMYWJlbHMsIG8gPSBlLmRhdGFUeXBlLCBhID0gZS5wb3B1bGF0ZVZlbmRvckluZm8sIGkgPSBlLnNldFN0YXR1cywgcyA9IGUuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgndWwnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItZXhwYW5kYWJsZS1saXN0IHFjLXdyYXAnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWluZm8gcWMtdzc1JyB9LCB0LnBvbGljeVVybCAmJiB0bi5jcmVhdGVFbGVtZW50KE9yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQucG9saWN5VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHIucHJpdmFjeVBvbGljeUxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB2b2lkIDAgIT09IHQuY29va2llTWF4QWdlU2Vjb25kcyAmJiB0bi5jcmVhdGVFbGVtZW50KE5yLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzOiB0LmNvb2tpZU1heEFnZVNlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogci5jb29raWVNYXhBZ2VMYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdm9pZCAwICE9PSB0LmRldmljZVN0b3JhZ2VEaXNjbG9zdXJlVXJsICYmIHRuLmNyZWF0ZUVsZW1lbnQoVnIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5kZXZpY2VTdG9yYWdlRGlzY2xvc3VyZVVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByLnN0b3JhZ2VEaXNjbG9zdXJlTGFiZWwKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQubGVnSW50UHVycG9zZXMgJiYgdC5sZWdJbnRQdXJwb3Nlcy5sZW5ndGggPiAwICYmIGEodC5sZWdJbnRQdXJwb3NlcywgR3IsIHIpLCB0LnNwZWNpYWxQdXJwb3NlcyAmJiB0LnNwZWNpYWxQdXJwb3Nlcy5sZW5ndGggPiAwICYmIGEodC5zcGVjaWFsUHVycG9zZXMsICRyLCByKSwgdC5mZWF0dXJlcyAmJiB0LmZlYXR1cmVzLmxlbmd0aCA+IDAgJiYgYSh0LmZlYXR1cmVzLCBIciwgciksIHQuc3BlY2lhbEZlYXR1cmVzICYmIHQuc3BlY2lhbEZlYXR1cmVzLmxlbmd0aCA+IDAgJiYgYSh0LnNwZWNpYWxGZWF0dXJlcywgWXIsIHIpKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZS1zd2l0Y2ggcWMtY21wMi1uby1tYXJnaW4nIH0sIHRuLmNyZWF0ZUVsZW1lbnQoWnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpLCBpKCFzKSwgbi5oYW5kbGVDb25zZW50KHQuaWQsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xvbmc6IHIubGVnaXRpbWF0ZVNjcmVlbkFjY2VwdC5sZW5ndGggPiAxOQogICAgICAgICAgICAgICAgICAgICAgICB9LCBXcihzLCByKSkpKTsKICAgICAgICAgICAgICAgICAgICB9LCBRciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jbXBVSSwgdCA9IGUuZWxlbWVudCwgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS50b2dnbGVzSGlkZGVuLCBhID0gZS5kYXRhVHlwZSwgaSA9IGUuc2V0U3RhdHVzLCBzID0gZS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCd1bCcsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWxpc3QnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWluZm8nIH0sIHQucG9saWN5VXJsICYmIHRuLmNyZWF0ZUVsZW1lbnQoT3IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5wb2xpY3lVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogci5wcml2YWN5UG9saWN5TGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmRlc2NyaXB0aW9uICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgbnVsbCwgdG4uY3JlYXRlRWxlbWVudCgnc3Ryb25nJywgbnVsbCwgci5kZXNjcmlwdGlvbkxhYmVsKSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIG51bGwsIHQuZGVzY3JpcHRpb24pKSksICFvICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUtc3dpdGNoJyB9LCB0bi5jcmVhdGVFbGVtZW50KEFyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpLCBpKCFzKSwgbi5oYW5kbGVDb25zZW50KHQuaWQsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgIH0sIFpyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNtcFVJLCB0ID0gZS5lbGVtZW50LCByID0gZS5jb3JlVWlMYWJlbHMsIG8gPSBlLnRvZ2dsZXNIaWRkZW4sIGEgPSBlLmRhdGFUeXBlLCBpID0gZS5sZWdpdGltYXRlLCBzID0gZS5oYW5kbGVDbGljaywgYyA9IGUudG9nZ2xlRXhwYW5kZWRMZWdhbCwgbCA9IGUucHJlbWl1bVVpTGFiZWxzLCB1ID0gZS5zZXRTdGF0dXMsIHAgPSBlLnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ3VsJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtbGlzdCAnLmNvbmNhdChpID8gJ3FjLXdyYXAnIDogJycpIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtaW5mbyAnLmNvbmNhdChpID8gJ3FjLXc3NScgOiAnJykgfSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIG51bGwsIHQuZGVzY3JpcHRpb24pLCB0LmRlc2NyaXB0aW9uTGVnYWwgJiYgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtbGVnYWwnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoWnQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZS1sZWdhbC1idXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCksIHMoZSwgJ2xlZ2FsRGVzY3JpcHRpb24tJy5jb25jYXQoYSwgJy0nKS5jb25jYXQodC5pZCkpLCBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoQ3IsIHsgdHlwZTogJ2ZpbGwnIH0pLCByLmxlZ2FsRGVzY3JpcHRpb24pLCB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWxlZ2FsLWRlc2NyaXB0aW9uJyB9LCB0LmRlc2NyaXB0aW9uTGVnYWwpKSwgdC52ZW5kb3JzICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWxlZ2FsJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpLCBzKGUsICd2ZW5kb3JzLScuY29uY2F0KGEsICctJykuY29uY2F0KHQuaWQpKSwgYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KENyLCB7IHR5cGU6ICdmaWxsJyB9KSwgci5zaG93UGFydG5lcnMpLCB0LnZlbmRvcnMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi1sZWdhbC1kZXNjcmlwdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICctICcuY29uY2F0KGUubmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgISghdC5ub25JYWJWZW5kb3JzIHx8ICF0Lm5vbklhYlZlbmRvcnMubGVuZ3RoKSAmJiB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCB0Lm5vbklhYlZlbmRvcnMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWxlZ2FsLWRlc2NyaXB0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJy0gJy5jb25jYXQoZS5uYW1lKSwgJyonKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItbGVnYWwtZGVzY3JpcHRpb24gcWMtY21wMi1ub24taWFiJyB9LCAnKiAnLCBsLm5vbklhYlZlbmRvcnNMYWJlbCkpKSksIGkgPyB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlLXN3aXRjaCcgfSwgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCksIHUoIXApLCBuLmhhbmRsZUNvbnNlbnQodC5pZCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9uZzogci5sZWdpdGltYXRlU2NyZWVuQWNjZXB0Lmxlbmd0aCA+IDE5CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFdyKHAsIHIpKSkgOiAhbyAmJiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlLXN3aXRjaCcgfSwgdG4uY3JlYXRlRWxlbWVudChBciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKSwgdSghcCksIG4uaGFuZGxlQ29uc2VudCh0LmlkLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9LCBlbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jb3JlVWlMYWJlbHMsIHQgPSBlLnByZW1pdW1VaUxhYmVscywgciA9IGUuZGF0YVR5cGUsIG8gPSBlLmxlZ2l0aW1hdGUsIGEgPSBlLnRvZ2dsZXNIaWRkZW4sIGkgPSBlLmV4cGFuZGFibGUsIHMgPSBlLmhhbmRsZUNsaWNrLCBjID0gZS5jbXBVSSwgbCA9IGUuaXRlbSwgdSA9IGUucG9wdWxhdGVWZW5kb3JJbmZvLCBwID0gZS5pc05vbklhYkNvbnNlbnQsIGQgPSBnKGZlKCExKSwgMiksIGYgPSBkWzBdLCBtID0gZFsxXSwgaCA9IGcoZmUoITEpLCAyKSwgeSA9IGhbMF0sIHYgPSBoWzFdLCBiID0gZyhmZShsLnN0YXR1cyksIDIpLCBfID0gYlswXSwgeCA9IGJbMV0sIEUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdigheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDID0gJycuY29uY2F0KHIsICctaWQ6JykuY29uY2F0KGwuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeChsLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtsLnN0YXR1c10pLCB0bi5jcmVhdGVFbGVtZW50KCdsaScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi1saXN0LWl0ZW0gJy5jb25jYXQoZiA/ICdxYy1jbXAyLWV4cGFuZGVkJyA6ICcnLCAnICcpLmNvbmNhdChvID8gJ3FjLWNtcDItbGlzdC1pdGVtLWxlZ2l0aW1hdGUnIDogJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICdsaXN0aXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaXRlbS1oZWFkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSghZiksIHMoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IGwubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItbGlzdC1pdGVtLXRpdGxlJyB9LCBsLm5hbWUpLCBvID8gdG4uY3JlYXRlRWxlbWVudCgncCcsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1saXN0LWl0ZW0tc3RhdHVzICcuY29uY2F0KG4ubGVnaXRpbWF0ZVNjcmVlbk9iamVjdGVkLmxlbmd0aCA+IDEyID8gJ3FjLWNtcC1sb25nLWxhYmVsJyA6ICcnKSB9LCBfID8gJycgOiBuLmxlZ2l0aW1hdGVTY3JlZW5PYmplY3RlZCkgOiAhYSAmJiB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaXRlbS1zdGF0dXMnIH0sIF8gPyBuLm9uTGFiZWwgOiBuLm9mZkxhYmVsKSwgaSAmJiB0bi5jcmVhdGVFbGVtZW50KENyLCB7IHR5cGU6ICdleHBhbmQnIH0pKSwgaSAmJiBmICYmIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBVSTogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVzSGlkZGVuOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlVmVuZG9ySW5mbzogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0dXM6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTm9uSWFiQ29uc2VudDogcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3dC5OT05fSUFCOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KEpyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuVkVORE9SUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChYciwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LkxFR0lUSU1BVEVfVkVORE9SUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChLciwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LkdPT0dMRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChRciwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KFpyLCBPYmplY3QuYXNzaWduKHt9LCBpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGU6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVFeHBhbmRlZExlZ2FsOiBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0obCkpOwogICAgICAgICAgICAgICAgICAgIH0sIG5vID0gcXQuTEVHSVRJTUFURV9WRU5ET1JTLCB0byA9IHF0LkxFR0lUSU1BVEVfUFVSUE9TRVMsIHJvID0gcXQuUFVSUE9TRVMsIG9vID0gcXQuRkVBVFVSRVMsIGFvID0gcXQuU1BFQ0lBTF9QVVJQT1NFUywgaW8gPSBxdC5TUEVDSUFMX0ZFQVRVUkVTLCBzbyA9IHF0LkZMRVhJQkxFX1BVUlBPU0VTLCBjbyA9IHF0LlVORklMVEVSRURfRkVBVFVSRVMsIGxvID0gcXQuVU5GSUxURVJFRF9QVVJQT1NFUywgdW8gPSBxdC5VTkZJTFRFUkVEX1NQRUNJQUxfRkVBVFVSRVMsIHBvID0gcXQuVU5GSUxURVJFRF9TUEVDSUFMX1BVUlBPU0VTLCBmbyA9IHRuLm1lbW8oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHQgPSBlLmNsYXNzTmFtZSwgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS5kYXRhLCBhID0gZS5kYXRhVHlwZSwgaSA9IGUudG9nZ2xlc0hpZGRlbiwgcyA9IGUuZXhwYW5kYWJsZSwgYyA9IGUubGVnaXRpbWF0ZSwgbCA9IGUucHJlbWl1bVVpTGFiZWxzLCB1ID0gZS5ub25JYWJEYXRhLCBwID0gZS5oYW5kbGVDbGljaywgZCA9IGUub25GdWxseVJlbmRlcmVkLCBmID0gZS50cmlnZ2VyUmVSZW5kZXIsIG0gPSBlLnNldFNob3dMb2FkZXIsIGggPSBlLmlzTm9uSWFiQ29uc2VudCwgeSA9IE9iamVjdC5rZXlzKG8pLmxlbmd0aCwgdiA9IHkgPyBmdW5jdGlvbiAoZSwgbiwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLk5PTl9JQUI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICYmIHIudmVuZG9ycy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci52ZW5kb3JzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG4uVkVORE9SUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVyKE9iamVjdC52YWx1ZXMoZS52ZW5kb3JzKSwgJ2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLkxFR0lUSU1BVEVfVkVORE9SUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVyKE9iamVjdC52YWx1ZXMoZS5sZWdpdGltYXRlVmVuZG9ycyksICdpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugbi5HT09HTEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cihlLCAnaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5sZW5ndGggJiYgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByICYmIHIudmVuZG9ycywgaSA9ICdub25JYWJQdXJwb3NlQ29uc2VudElkcyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBuLkxFR0lUSU1BVEVfVkVORE9SUyAmJiAoaSA9ICdub25JYWJQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW25dLCByID0gKHQuZGVzY3JpcHRpb25MZWdhbCB8fCAnJykucmVwbGFjZSgvKDpcc1wqKXwoOlwqKS9naSwgJzonKS5yZXBsYWNlKC8oXC5cc1wqKXwoXC5cKil8KFxzXCopL2dpLCAnLicpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LnN0YXR1cyB8fCAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkxlZ2FsOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yczogdXIodC52ZW5kb3JzLCAnaWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYlZlbmRvcnM6IGEgJiYgYS5sZW5ndGggJiYgYS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtpXSAmJiBlW2ldLmluY2x1ZGVzKHQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2gocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG8sIHd0LCBhLCB1KSA6IFtdLCBiID0gZyhmZSghMSksIDIpLCBfID0gYlswXSwgeCA9IGJbMV0sIEUgPSBnKGZlKHYuc2xpY2UoMCwgMTAwKSksIDIpLCBDID0gRVswXSwgayA9IEVbMV0sIHcgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgbiwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9ICcnLCBhID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHJvOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHQucHVycG9zZXNMYWJlbCwgYSA9IGxvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdG86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gdC5sZWdpdGltYXRlSW50ZXJlc3RQdXJwb3Nlc0xhYmVsLCBhID0gbG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhbzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0LnNwZWNpYWxQdXJwb3Nlc0xhYmVsLCBhID0gcG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzbzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0LmZsZXhpYmxlUHVycG9zZXNMYWJlbCwgYSA9IGxvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb286CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gdC5mZWF0dXJlc0xhYmVsLCBhID0gY287CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpbzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0LnNwZWNpYWxGZWF0dXJlc0xhYmVsLCBhID0gdW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBubzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSB0LmxlZ2l0aW1hdGVJbnRlcmVzdFB1cnBvc2VzTGFiZWwsIGEgPSBsbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgncCcsIHsga2V5OiAnJy5jb25jYXQoYSkuY29uY2F0KGUpIH0sICctICcsIHJbYV1bZV0ubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCgnbGknLCBudWxsLCB0bi5jcmVhdGVFbGVtZW50KCdzdHJvbmcnLCBudWxsLCBvKSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBuLCB0LCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQy5sZW5ndGggPCB2Lmxlbmd0aCAmJiAobiA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKHYuc2xpY2UoMCwgQy5sZW5ndGggKyAxMDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKSksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtmXSksIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gJiYgKG0oITEpLCBkICYmIEMubGVuZ3RoID09PSB2Lmxlbmd0aCAmJiBkKCEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtDXSksIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgoITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSksIHkgPyB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCB0bi5jcmVhdGVFbGVtZW50KExyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICcnLmNvbmNhdCh0IHx8ICcnLCAnIHFjLWNtcDItY29uc2VudC1saXN0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJIZWFkZXJDb2xvcjogaWEuc3ViSGVhZGVyQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogaWEuYm9yZGVyQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodFRleHRDb2xvcjogaWEubGlnaHRUZXh0Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUZXh0Q29sb3I6IGlhLnNlY29uZGFyeVRleHRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4UHJpbWFyeUJ1dHRvbkNvbG9yOiBpYS51eFByaW1hcnlCdXR0b25Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4QmFja2dyb3VuZENvbG9yOiBpYS51eEJhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSUU6IGxyKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSwgKGEgPT09IHd0Lk5PTl9JQUIgfHwgYSA9PT0gd3QuTEVHSVRJTUFURV9QVVJQT1NFUyB8fCBhID09PSB3dC5MRUdJVElNQVRFX1ZFTkRPUlMgfHwgYSA9PT0gd3QuR09PR0xFKSAmJiB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaGVhZGVyJyB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuTk9OX0lBQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5ub25JYWJWZW5kb3JzTGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LkxFR0lUSU1BVEVfUFVSUE9TRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubGVnaXRpbWF0ZUludGVyZXN0UHVycG9zZXNMYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuTEVHSVRJTUFURV9WRU5ET1JTOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmxlZ2l0aW1hdGVJbnRlcmVzdFZlbmRvckxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3dC5HT09HTEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZ29vZ2xlUGFydG5lcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSksIEMubWFwKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9PT0gd3QuVkVORE9SUyAmJiBlLmlzU3BlY2lhbFB1cnBvc2VzT25seSAmJiAodCA9ICEwKSwgdG4uY3JlYXRlRWxlbWVudChlbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlc0hpZGRlbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcFVJOiBvYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRlVmVuZG9ySW5mbzogdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05vbklhYkNvbnNlbnQ6IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1vKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWwogICAgICAgICAgICAgICAgICAgICAgICAnXG4gICYmIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAxMHB4IGF1dG8gIWltcG9ydGFudDtcbiAgICB6LWluZGV4OiAxMDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgfVxuXG4gIC5sb2FkZXIge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBAa2V5ZnJhbWVzIGxpbmUtc2NhbGUge1xuICAgICAgMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDEpO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgIH1cbiAgICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZXkoMC40KTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZXkoMC40KTtcbiAgICAgIH1cbiAgICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGV5KDEpO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxleSgxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLmxpbmUtc2NhbGUge1xuICAgICAgJiA+IGRpdjpudGgtY2hpbGQoMSkge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC40cyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjRzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgfVxuICAgICAgJiA+IGRpdjpudGgtY2hpbGQoMikge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC4zcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjNzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgfVxuICAgICAgJiA+IGRpdjpudGgtY2hpbGQoMykge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC4ycyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjJzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgfVxuICAgICAgJiA+IGRpdjpudGgtY2hpbGQoNCkge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAtMC4xcyBpbmZpbml0ZSBjdWJpYy1iZXppZXIoMC4yLCAwLjY4LCAwLjE4LCAxLjA4KTtcbiAgICAgICAgYW5pbWF0aW9uOiBsaW5lLXNjYWxlIDFzIC0wLjFzIGluZmluaXRlIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgfVxuICAgICAgJiA+IGRpdjpudGgtY2hpbGQoNSkge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogbGluZS1zY2FsZSAxcyAwcyBpbmZpbml0ZVxuICAgICAgICAgIGN1YmljLWJlemllcigwLjIsIDAuNjgsIDAuMTgsIDEuMDgpO1xuICAgICAgICBhbmltYXRpb246IGxpbmUtc2NhbGUgMXMgMHMgaW5maW5pdGUgY3ViaWMtYmV6aWVyKDAuMiwgMC42OCwgMC4xOCwgMS4wOCk7XG4gICAgICB9XG4gICAgICAmID4gZGl2IHtcbiAgICAgICAgYmFja2dyb3VuZDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgd2lkdGg6IDRweDtcbiAgICAgICAgaGVpZ2h0OiAzNXB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICAgIG1hcmdpbjogMnB4O1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIH1cbiAgICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGhvID0gR3QuZGl2KG1vKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4QmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4UHJpbWFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0pLCBnbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoaG8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4UHJpbWFyeUJ1dHRvbkNvbG9yOiBpYS51eFByaW1hcnlCdXR0b25Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV4QmFja2dyb3VuZENvbG9yOiBpYS51eEJhY2tncm91bmRDb2xvcgogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ2xvYWRlcicgfSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdsaW5lLXNjYWxlJyB9LCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCBudWxsKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgbnVsbCksIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIG51bGwpLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCBudWxsKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgbnVsbCkpKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgeW8gPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBlLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoblt0XSB8fCBbXSkuaW5jbHVkZXMoZS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZlbmRvcnMgPSByLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB2byA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gZS5jb3JlVWlMYWJlbHMsIHIgPSBlLnByZW1pdW1VaUxhYmVscywgbyA9IGUudmVuZG9yc0RhdGEsIGEgPSBlLmhhbmRsZUNsaWNrLCBpID0gZS5ub25JYWJEYXRhLCBzID0gZS5jaGlsZHJlbiwgYyA9IHllKG51bGwpLCBsID0gYih7fSwgby5sZWdpdGltYXRlUHVycG9zZXMpLCB1ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRW5hYmxlZDogaS5pc0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yczogaS52ZW5kb3JzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZWdJbnRQdXJwb3Nlcy5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwID0gaS5pc0VuYWJsZWQgJiYgaS52ZW5kb3JzLmxlbmd0aCAmJiB1LnZlbmRvcnMubGVuZ3RoID4gMCwgZCA9IGcoZmUoITEpLCAyKSwgZiA9IGRbMF0sIG0gPSBkWzFdLCBoID0gZyhmZSgwKSwgMiksIHkgPSBoWzBdLCB2ID0gaFsxXSwgXyA9IGcoZmUoITEpLCAyKSwgeCA9IF9bMF0sIEUgPSBfWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobCkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IE9iamVjdC52YWx1ZXMoYih7fSwgby52ZW5kb3JzKSksIGsgPSBPYmplY3QudmFsdWVzKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeW8oaywgQywgJ2xlZ0ludFB1cnBvc2VzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYy5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAmJiBlICYmIEUoITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbeV0pLCBoZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGMuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggJiYgZSAmJiAoZS5zY3JvbGxUb3AgPSBlLnNjcm9sbEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFt4XSksIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW25dKSwgdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgbnVsbCwgc1swXSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi1zY3JvbGxhYmxlLXNlY3Rpb24gJy5jb25jYXQoeCA/ICdsb2FkaW5nJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLmN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4pLCBlICYmICFmICYmIGUuc2Nyb2xsVG9wICsgZS5vZmZzZXRIZWlnaHQgPiBlLnNjcm9sbEhlaWdodCAtIDUwICYmIChuID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYobmV3IERhdGUoKS5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KGZvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBvLmxlZ2l0aW1hdGVQdXJwb3NlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiB3dC5MRUdJVElNQVRFX1BVUlBPU0VTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiRGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdG4uY3JlYXRlRWxlbWVudChmbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiB3dC5MRUdJVElNQVRFX1ZFTkRPUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGljazogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRnVsbHlSZW5kZXJlZDogbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJSZVJlbmRlcjogeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNob3dMb2FkZXI6IEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2l0aW1hdGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhIXAgJiYgdG4uY3JlYXRlRWxlbWVudChmbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkRhdGE6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogd3QuTk9OX0lBQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHggJiYgdG4uY3JlYXRlRWxlbWVudChnbywgbnVsbCkpLCBzWzFdKTsKICAgICAgICAgICAgICAgICAgICB9LCBibyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5pdGVtLCB0ID0gZS5pZCwgciA9IGUuc2VjdGlvbk5hbWUsIG8gPSBlLmNvcmVVaUxhYmVscywgYSA9IGUucHJlbWl1bVVpTGFiZWxzLCBpID0gZS5oYW5kbGVDbGljaywgcyA9IGUuaGFuZGxlQ29uc2VudCwgYyA9IGUuREFUQV9UWVBFOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgeyBrZXk6ICcnLmNvbmNhdChuLm5hbWUpLmNvbmNhdCh0KSB9LCB0bi5jcmVhdGVFbGVtZW50KCdsaScsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWluZm8nIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ3N0cm9uZycsIG51bGwsIG4ubmFtZSksIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCBudWxsLCBuLmRlc2NyaXB0aW9uKSwgbi5kZXNjcmlwdGlvbkxlZ2FsICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWxlZ2FsJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZSwgJ2xlZ2FsRGVzY3JpcHRpb24tc3RhY2tzLScuY29uY2F0KHIsICctJykuY29uY2F0KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudChDciwgeyB0eXBlOiAnZmlsbCcgfSksIG8ubGVnYWxEZXNjcmlwdGlvbiksIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItbGVnYWwtZGVzY3JpcHRpb24nIH0sIG4uZGVzY3JpcHRpb25MZWdhbC5yZXBsYWNlKC8oOlxzXCopfCg6XCopL2dpLCAnOicpLnJlcGxhY2UoLyhcLlxzXCopfChcLlwqKXwoXHNcKikvZ2ksICcuJykpKSwgbi52ZW5kb3JzICYmIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWxlZ2FsJyB9LCB0bi5jcmVhdGVFbGVtZW50KFp0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZSwgJ3ZlbmRvcnMtc3RhY2tzLScuY29uY2F0KG4uaWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudChDciwgeyB0eXBlOiAnZmlsbCcgfSksIG8uc2hvd1BhcnRuZXJzKSwgdXIobi52ZW5kb3JzLCAnaWQnKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdwJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWxlZ2FsLWRlc2NyaXB0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJy0gJy5jb25jYXQoZS5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhKCFuLm5vbklhYlZlbmRvcnMgfHwgIW4ubm9uSWFiVmVuZG9ycy5sZW5ndGgpICYmIHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIG4ubm9uSWFiVmVuZG9ycy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdwJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItbGVnYWwtZGVzY3JpcHRpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnLSAnLmNvbmNhdChlLm5hbWUpLCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1sZWdhbC1kZXNjcmlwdGlvbiBxYy1jbXAyLW5vbi1pYWInIH0sICcqICcsIGEubm9uSWFiVmVuZG9yc0xhYmVsKSkpKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZS1zd2l0Y2gnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoQXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dMYWJlbDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogbi5zdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0LCAncHVycG9zZXMnID09PSByID8gYy5QVVJQT1NFUyA6IGMuU1BFQ0lBTF9GRUFUVVJFUywgIW4uc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLXRvZ2dsZScKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9LCBfbyA9IEN0LkVYUEFORF9FTEVNRU5ULCB4byA9IEN0LkNPTExBUFNFX0VMRU1FTlQsIEVvID0gZnVuY3Rpb24gKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0ubGVuZ3RoID8gZVtuXS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC5maW5kKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaWQgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAncHVycG9zZXMnID09PSBuICYmIHIgJiYgci52ZW5kb3JzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ubm9uSWFiVmVuZG9ycyA9IGEgJiYgYS5sZW5ndGggJiYgYS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubm9uSWFiUHVycG9zZUNvbnNlbnRJZHMgJiYgZS5ub25JYWJQdXJwb3NlQ29uc2VudElkcy5pbmNsdWRlcyhvLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogW107CiAgICAgICAgICAgICAgICAgICAgfSwgQ28gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuaWQsIHQgPSBlLnN0YWNrLCByID0gZS5vblRvZ2dsZSwgbyA9IGUucHVycG9zZXMsIGEgPSBlLnNwZWNpYWxGZWF0dXJlcywgaSA9IGUubm9uSWFiRGF0YSwgcyA9IGUuY29yZVVpTGFiZWxzLCBjID0gZS5wcmVtaXVtVWlMYWJlbHMsIGwgPSBlLmhhbmRsZUNsaWNrLCB1ID0gZS5oYW5kbGVDb25zZW50LCBwID0gZS5jbGFzc05hbWUsIGQgPSBlLkRBVEFfVFlQRSwgZiA9ICcnLmNvbmNhdChuLCAnLWV4cGFuZGFibGUnKSwgbSA9IGcoZmUoRW8odCwgJ3B1cnBvc2VzJywgbywgaSkpLCAyKSwgaCA9IG1bMF0sIHkgPSBtWzFdLCB2ID0gZyhmZShFbyh0LCAnc3BlY2lhbEZlYXR1cmVzJywgYSwgaSkpLCAyKSwgXyA9IHZbMF0sIHggPSB2WzFdLCBFID0gZyhmZShoLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGggKyBfLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGgpLCAyKSwgQyA9IEVbMF0sIGsgPSBFWzFdLCB3ID0gZyhmZSghMSksIDIpLCBTID0gd1swXSwgTCA9IHdbMV0sIFAgPSBnKGZlKHQuc3RhdHVzKSwgMiksIFQgPSBQWzBdLCBxID0gUFsxXSwgQSA9IGcoZmUodC5zdGF0ZUxhYmVsKSwgMiksIEkgPSBBWzBdLCBPID0gQVsxXSwgTiA9IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdShlLCBuKSwgbiA9PT0gZC5QVVJQT1NFUyA/IHkoaC5tYXAoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaWQgPT09IGUgJiYgKG4uc3RhdHVzID0gdCksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogeChfLm1hcChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5pZCA9PT0gZSAmJiAobi5zdGF0dXMgPSB0KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGsoQyArICh0ID8gMSA6IC0xKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzLm9uTGFiZWwsIG4gPSBzLm9mZkxhYmVsLCB0ID0gcy5tdWx0aUxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gQyA/IChPKG4pLCBxKCExKSkgOiBDID09PSBoLmxlbmd0aCArIF8ubGVuZ3RoID8gKE8oZSksIHEoITApKSA6IChPKHQpLCBxKCExKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtDXSksIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtdGVzdGlkJzogJ3N0YWNrLWl0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnJy5jb25jYXQocCwgJyAnKS5jb25jYXQoUyA/ICdxYy1jbXAyLWV4cGFuZGVkJyA6ICcnKQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdidXR0b24nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaXRlbS1oZWFkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtY29udHJvbHMnOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtdGVzdGlkJzogJ3N0YWNrLWl0ZW0taGVhZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID8gb2EuZXZlbnRUcmFja2VyKHhvLCBuKSA6IG9hLmV2ZW50VHJhY2tlcihfbywgbiksIEwoIVMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaXRlbS10aXRsZScgfSwgdC5uYW1lKSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1saXN0LWl0ZW0tc3RhdHVzJyB9LCBJKSwgdG4uY3JlYXRlRWxlbWVudChDciwgeyB0eXBlOiAnZXhwYW5kJyB9KSksIFMgJiYgdG4uY3JlYXRlRWxlbWVudCgndWwnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItZXhwYW5kYWJsZS1saXN0JwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdsaScsIHsgY2xhc3NOYW1lOiAncWMtY21wMi1leHBhbmRhYmxlLWluZm8nIH0sIHQuZGVzY3JpcHRpb24pLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlLXN3aXRjaCcgfSwgdG4uY3JlYXRlRWxlbWVudChBciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xhYmVsOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uOiBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShoLm1hcChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoYih7fSwgbiksIHt9LCB7IHN0YXR1czogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB4KF8ubWFwKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYihiKHt9LCBuKSwge30sIHsgc3RhdHVzOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGsoZSA/IGgubGVuZ3RoICsgXy5sZW5ndGggOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCFUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIVMKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBoLm1hcChmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoYm8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTmFtZTogJ3B1cnBvc2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbnNlbnQ6IE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9UWVBFOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIF8ubWFwKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChibywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lOiAnc3BlY2lhbEZlYXR1cmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbnNlbnQ6IE4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9UWVBFOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24ga28oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbJ1xuICAgICAgICAucWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uIHtcbiAgICAgICAgICBoZWlnaHQ6IDM0cHg7XG4gICAgICAgIH1cblxuICAgICAgICAucWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uIHN2ZyB7XG4gICAgICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgICAgIHdpZHRoOiAxNHB4O1xuICAgICAgICB9XG4gICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gd28oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcblxuICAgIC5xYy1jbXAyLWxpc3QtaXRlbSB7XG4gICAgICAmOm9ubHktY2hpbGQge1xuICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAxcHggJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1saXN0IHtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cbiAgICAgICAgLnFjLWNtcDItZXhwYW5kYWJsZS1pbmZvIHtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICAgICAgICAgIHdpZHRoOiA4NSU7XG4gICAgICAgICAgJjpmaXJzdC1vZi10eXBlIHtcbiAgICAgICAgICAgIG1hcmdpbjogMjBweCAwcHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxpIHtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgIHBhZGRpbmc6IDA7XG5cbiAgICAgICAgICAgIHAge1xuICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3Ryb25nIHtcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgJjpsYXN0LW9mLXR5cGUge1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMCU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLnFjLWNtcDItdG9nZ2xlLXN3aXRjaCB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgICAgICAmOmZpcnN0LW9mLXR5cGUge1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDMwcHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFNvID0gR3QoTHIpKHdvKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlzSUUgJiYgRXQoa28oKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYm9yZGVyQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgfSksIExvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnZlbmRvcnNEYXRhLCB0ID0gZS5oYW5kbGVDbGljaywgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS5wdXJwb3NlcywgYSA9IGUuc3BlY2lhbEZlYXR1cmVzLCBpID0gZS5wcmVtaXVtVWlMYWJlbHMsIHMgPSBlLm5vbklhYkRhdGEsIGMgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9hLmhhbmRsZUNvbnNlbnQoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChTbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGlhLmJvcmRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHRUZXh0Q29sb3I6IGlhLmxpZ2h0VGV4dENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGV4dENvbG9yOiBpYS5zZWNvbmRhcnlUZXh0Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25Db2xvcjogaWEudXhQcmltYXJ5QnV0dG9uQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lFOiBscigpCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5lbnRyaWVzKG4uc3RhY2tzKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZyhlLCAyKSwgbCA9IG5bMF0sIHUgPSBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoQ28sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3N0YWNrLWl0ZW0taWQ6Jy5jb25jYXQobCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2s6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Ub2dnbGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYS5oYW5kbGVDb25zZW50KGUsIHd0LlNUQUNLUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3NlczogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRmVhdHVyZXM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiRGF0YTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbnNlbnQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc3RhY2staXRlbS0nLmNvbmNhdChsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS10ZXN0aWQnOiAnc3RhY2staXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi1saXN0LWl0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfVFlQRTogd3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFBvKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWydcbiAgICAgICYmJiYge1xuICAgICAgICAucWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uIHtcbiAgICAgICAgICBoZWlnaHQ6IDM0cHg7XG4gICAgICAgIH1cblxuICAgICAgICAucWMtY21wMi10b2dnbGUtbGVnYWwtYnV0dG9uIHN2ZyB7XG4gICAgICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgICAgIHdpZHRoOiAxNHB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgJ10pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBQbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRvKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWwogICAgICAgICAgICAgICAgICAgICAgICAnXG4gICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcbicKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxbygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICYmJiYge1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG5cbiAgICBsaSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuXG4gICAgICAmOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICB9XG5cbiAgICAgIHN0cm9uZyB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuJ10pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBxbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBBbyA9IEd0LnVsKHFvKCkpLCBJbyA9IEd0LmRpdihUbygpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pc0lFICYmIEV0KFBvKCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBPbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gZS5oYW5kbGVDbGljaywgciA9IGUuY29yZVVpTGFiZWxzLCBvID0gZS5wcmVtaXVtVWlMYWJlbHMsIGEgPSBlLmRhdGEsIGkgPSBlLmlkLCBzID0gZS50aXRsZSwgYyA9IGUudG9nZ2xlT2JqOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9PT0gby5saW5rc1RpdGxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGEubWFwKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgeyBrZXk6IGUubGFiZWwgKyBuIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGUubGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnX2JsYW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsOiAnbm9vcGVuZXIgbm9yZWZlcnJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBlLmxhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5sYWJlbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHUgaW4gYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gYVt1XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkIGluIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBwW2RdLCBtID0gKGYuZGVzY3JpcHRpb25MZWdhbCB8fCAnJykucmVwbGFjZSgvKDpcc1wqKXwoOlwqKS9naSwgJzonKS5yZXBsYWNlKC8oXC5cc1wqKXwoXC5cKil8KFxzXCopL2dpLCAnLicpLCBoID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnJy5jb25jYXQodSwgJyAnKS5jb25jYXQoZi5pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGYubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZi5kZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbkxlZ2FsOiBtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2goaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGwubWFwKGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQoJ2xpJywgeyBrZXk6IG4gfSwgdG4uY3JlYXRlRWxlbWVudCgnc3Ryb25nJywgbnVsbCwgZS50aXRsZSksIGUuZGVzY3JpcHRpb24sIGUuZGVzY3JpcHRpb25MZWdhbCAmJiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItZXhwYW5kYWJsZS1sZWdhbCcgfSwgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItdG9nZ2xlLWxlZ2FsLWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChuLCAnbGVnYWxEZXNjcmlwdGlvbi0nLmNvbmNhdChlLmlkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogci5sZWdhbERlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudChDciwgeyB0eXBlOiAnZmlsbCcgfSksIHIubGVnYWxEZXNjcmlwdGlvbiksIHRuLmNyZWF0ZUVsZW1lbnQoJ3AnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItbGVnYWwtZGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogJ3FjLWNtcDItdG9nZ2xlLWxlZ2FsLWJ1dHRvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmRlc2NyaXB0aW9uTGVnYWwpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChMciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtY21wMi1jb25zZW50LWxpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViSGVhZGVyQ29sb3I6IGlhLnN1YkhlYWRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGlhLmJvcmRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlnaHRUZXh0Q29sb3I6IGlhLmxpZ2h0VGV4dENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5VGV4dENvbG9yOiBpYS5zZWNvbmRhcnlUZXh0Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25Db2xvcjogaWEudXhQcmltYXJ5QnV0dG9uQ29sb3IKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudCgnbGknLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItbGlzdC1pdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICdyZWdpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiAnZmFsc2UnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItbGlzdC1pdGVtLWhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGU6ICdsaXN0aXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0bi5jcmVhdGVFbGVtZW50KCdwJywgeyBjbGFzc05hbWU6ICdxYy1jbXAyLWxpc3QtaXRlbS10aXRsZScgfSwgcyA9PT0gby5saW5rc1RpdGxlID8gdG4uY3JlYXRlRWxlbWVudCgnc3Ryb25nJywgbnVsbCwgcykgOiBzKSwgdG4uY3JlYXRlRWxlbWVudChDciwgeyB0eXBlOiAnZXhwYW5kJyB9KSksIGNbaV0gJiYgdG4uY3JlYXRlRWxlbWVudCgndWwnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtbGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlOiAnbGlzdCcKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudChJbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogJ2xpc3RpdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSUU6IGxyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWV4cGFuZGFibGUtaW5mbycKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdG4uY3JlYXRlRWxlbWVudChBbywgbnVsbCwgbikpKSkpOwogICAgICAgICAgICAgICAgICAgIH0sIE5vID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvcmVVaUxhYmVscywgdCA9IGUucHJlbWl1bVVpTGFiZWxzLCByID0gZS52ZW5kb3JzRGF0YSwgbyA9IGUuaGFuZGxlQ2xpY2ssIGEgPSBlLm5vbklhYkRhdGEsIGkgPSBlLmNoaWxkcmVuLCBzID0gZS50b2dnbGVPYmosIGMgPSBnKF9lKENhKSwgMSksIGwgPSBnKGZlKGNbMF0uZGlzYWJsZUFjY2VwdEJ1dHRvbiksIDIpLCB1ID0gbFswXSwgcCA9IGxbMV0sIGQgPSByLnN0YWNrcywgZiA9IGIoe30sIHIuc3BlY2lhbEZlYXR1cmVzKSwgbSA9IGIoe30sIHIucHVycG9zZXMpLCBoID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtKSksIHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGYpKSwgdiA9IE9iamVjdC52YWx1ZXMoaCksIF8gPSBPYmplY3QudmFsdWVzKHkpLCB4ID0geWUobnVsbCksIEUgPSBiZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB4LmN1cnJlbnQsIG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnU3BlY2lhbCBQdXJwb3NlcyBhbmQgRmVhdHVyZXMgR3JvdXAnKSwgdCA9IG51bGwgPT09IGUgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgciA9IG51bGwgPT09IG4gfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIHUgJiYgciAmJiB0ICYmICh0LmJvdHRvbSAtIHIudG9wID49IDAgJiYgKHAoITEpLCBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIEUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbdV0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geC5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgJiYgZSAmJiAoRSgpLCBlLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIEUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIE9iamVjdC5rZXlzKGQpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIEMgaW4gZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gZFtDXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5zcGVjaWFsRmVhdHVyZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB3IGluIGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnNwZWNpYWxGZWF0dXJlcy5pbmNsdWRlcyhwYXJzZUludCh3LCAxMCkpICYmIGRlbGV0ZSBmW3ddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrLnB1cnBvc2VzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgUyBpbiBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5wdXJwb3Nlcy5pbmNsdWRlcyhwYXJzZUludChTLCAxMCkpICYmIGRlbGV0ZSBtW1NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTCA9IE9iamVjdC52YWx1ZXMoYih7fSwgci52ZW5kb3JzKSksIFAgPSBPYmplY3QudmFsdWVzKG0pLCBUID0gT2JqZWN0LnZhbHVlcyhmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvKFAsIEwsICdwdXJwb3NlcycpLCB5byhULCBMLCAnc3BlY2lhbEZlYXR1cmVzJyksIHlvKHYsIEwsICdwdXJwb3NlcycpLCB5byhfLCBMLCAnc3BlY2lhbEZlYXR1cmVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIGkgJiYgdG4uY2xvbmVFbGVtZW50KGlbMF0sIHsgZGlzYWJsZWRBY2NlcHRBbGxCdXR0b246IHUgfSksIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLWNtcDItc2Nyb2xsYWJsZS1zZWN0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICB9LCAhIU9iamVjdC5rZXlzKGQpLmxlbmd0aCAmJiB0bi5jcmVhdGVFbGVtZW50KExvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JzRGF0YTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZXM6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRmVhdHVyZXM6IF8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJEYXRhOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiB0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhIU9iamVjdC5rZXlzKG0pLmxlbmd0aCAmJiB0bi5jcmVhdGVFbGVtZW50KGZvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IHd0LlBVUlBPU0VTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiRGF0YTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksICEhT2JqZWN0LmtleXMoZikubGVuZ3RoICYmIHRuLmNyZWF0ZUVsZW1lbnQoZm8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogd3QuU1BFQ0lBTF9GRUFUVVJFUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksICghIU9iamVjdC5rZXlzKHIuc3BlY2lhbFB1cnBvc2VzKS5sZW5ndGggfHwgISFPYmplY3Qua2V5cyhyLmZlYXR1cmVzKSkgJiYgdG4uY3JlYXRlRWxlbWVudChPbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdTcGVjaWFsIFB1cnBvc2VzIGFuZCBGZWF0dXJlcyBHcm91cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbi5zcGVjaWFsUHVycG9zZXNBbmRGZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTcGVjaWFsIEZlYXR1cmVzJzogci5zcGVjaWFsUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXM6IHIuZmVhdHVyZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVPYmo6IHMKICAgICAgICAgICAgICAgICAgICAgICAgfSksICEhKHQgJiYgdC5pbml0U2NyZWVuQ3VzdG9tTGlua3MgJiYgdC5pbml0U2NyZWVuQ3VzdG9tTGlua3MubGVuZ3RoKSAmJiB0bi5jcmVhdGVFbGVtZW50KE9vLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdC5saW5rc1RpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQubGlua3NUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdC5pbml0U2NyZWVuQ3VzdG9tTGlua3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVPYmo6IHMKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBpWzFdKTsKICAgICAgICAgICAgICAgICAgICB9LCBSbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gZS5jb3JlVWlMYWJlbHMsIHIgPSBlLm5vbklhYkRhdGEsIG8gPSBlLnZlbmRvcnNEYXRhLCBhID0gZS5oYW5kbGVDbGljaywgaSA9IGUucHJlbWl1bVVpTGFiZWxzLCBzID0gZS5nb29nbGVWZW5kb3JzLCBjID0gZS5jaGlsZHJlbiwgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VuYWJsZWQ6IHIuaXNFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcnM6IHIudmVuZG9ycy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucHVycG9zZXMubGVuZ3RoID4gMCB8fCAwID09PSBlLnB1cnBvc2VzLmxlbmd0aCAmJiAwID09PSBlLmxlZ0ludFB1cnBvc2VzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IHIuaXNFbmFibGVkICYmIHIudmVuZG9ycy5sZW5ndGggPiAwICYmIGwudmVuZG9ycy5sZW5ndGggPiAwLCBwID0geWUobnVsbCksIGQgPSBnKGZlKCExKSwgMiksIGYgPSBkWzBdLCBtID0gZFsxXSwgaCA9IGcoZmUoITEpLCAyKSwgeSA9IGhbMF0sIHYgPSBoWzFdLCBiID0gZyhmZSghMSksIDIpLCBfID0gYlswXSwgeCA9IGJbMV0sIEUgPSBnKGZlKDApLCAyKSwgQyA9IEVbMF0sIGsgPSBFWzFdLCB3ID0gZyhmZSghMSksIDIpLCBTID0gd1swXSwgTCA9IHdbMV0sIFAgPSBnKGZlKCExKSwgMiksIFQgPSBQWzBdLCBxID0gUFsxXSwgQSA9IGcoZmUoITEpLCAyKSwgSSA9IEFbMF0sIE8gPSBBWzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBwLmN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDICYmIGUgJiYgTyghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtDXSksIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcC5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSSAmJiBlICYmIChlLnNjcm9sbFRvcCA9IGUuc2Nyb2xsSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW0ldKSwgaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTCh1ICYmIGYpLCBxKHUgJiYgeSB8fCAhdSAmJiBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkKICAgICAgICAgICAgICAgICAgICAgICAgXSksIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pLCB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCBjWzBdLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLXNjcm9sbGFibGUtc2VjdGlvbiAnLmNvbmNhdChJID8gJ2xvYWRpbmcnIDogJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNjcm9sbDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcC5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChuKSwgZSAmJiAoIWYgfHwgdSAmJiAheSB8fCBzLmlzRW5hYmxlZCAmJiAhXykgJiYgZS5zY3JvbGxUb3AgKyBlLm9mZnNldEhlaWdodCA+IGUuc2Nyb2xsSGVpZ2h0IC0gNTAgJiYgKG4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayhuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMzAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoZm8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogd3QuVkVORE9SUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GdWxseVJlbmRlcmVkOiBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlUmVuZGVyOiBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0xvYWRlcjogTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1ICYmIFMgJiYgdG4uY3JlYXRlRWxlbWVudChmbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkRhdGE6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogd3QuTk9OX0lBQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GdWxseVJlbmRlcmVkOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclJlUmVuZGVyOiBDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2hvd0xvYWRlcjogTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb25JYWJDb25zZW50OiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5pc0VuYWJsZWQgJiYgcy5kYXRhLmxlbmd0aCA+IDAgJiYgVCAmJiAhKHNhLmNvcmVDb25maWcuY29uc2VudFNjb3BlIHx8ICcnKS5pbmNsdWRlcygnZ2xvYmFsJykgJiYgdG4uY3JlYXRlRWxlbWVudChmbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogd3QuR09PR0xFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xpY2s6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZ1bGx5UmVuZGVyZWQ6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVSZW5kZXI6IEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTaG93TG9hZGVyOiBPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEkgJiYgdG4uY3JlYXRlRWxlbWVudChnbywgbnVsbCkpLCBjWzFdKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gVW8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgJiYge1xuICAgICAgICAgIG1heC13aWR0aDogMTYwMHB4O1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIG1hcmdpbi10b3A6IGF1dG87XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgICAgICAgcGFkZGluZzogMjBweCAxNXB4IDEwcHg7XG4gICAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuXG4gICAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICIiO1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgd2lkdGg6IDEwMHZ3O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgICB0b3A6IC0xcHg7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgei1pbmRleDogLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgICY6OmFmdGVyIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICIiO1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgd2lkdGg6IDEwMHZ3O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgICB0b3A6IC0xcHg7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC5xYy1jbXAyLXN1bW1hcnktc2VjdGlvbiB7XG4gICAgICAgICAgICB3aWR0aDogNzIlO1xuICAgICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLnFjLWNtcDItZm9vdGVyIHtcbiAgICAgICAgICAgIHdpZHRoOiAyOCU7XG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgbWF4LWhlaWdodDogMTUwcHg7XG4gICAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm9yZGVyLXRvcDogbm9uZTtcblxuICAgICAgICAgICAgLnFjLWNtcDItc3VtbWFyeS1idXR0b25zIHtcbiAgICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBlbmQ7XG5cbiAgICAgICAgICAgICAgYnV0dG9ue1xuICAgICAgICAgICAgICAgIG9yZGVyOiAxO1xuICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG5cbiAgICAgICAgICAgICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgICAgb3JkZXIgMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgICAgIG9yZGVyIDI7XG4gICAgICAgICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHAsXG4gICAgICAgICAgaDIge1xuICAgICAgICAgICAganVzdGlmeS1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBVbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIERvKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWydcbiAgICAgICAgICAgICAgaGVpZ2h0OiAxOXB4O1xuICAgICAgICAgICAgICBzdmcge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQm8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgICAgICAgICBoZWlnaHQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICcKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqbygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgICAgICAgIGhlaWdodDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBqbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZvKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUnQoWwogICAgICAgICAgICAgICAgICAgICAgICAnXG4gICAgICAgICAgaGVpZ2h0OiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICAnCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVm8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgaGVpZ2h0OiA5NSU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogZ3JpZDtcbiAgICBncmlkLXRlbXBsYXRlLXJvd3M6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAganVzdGlmeS1pdGVtczogY2VudGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgIC5xYy1jbXAyLXNjcm9sbGFibGUtc2VjdGlvbiB7XG4gICAgICAnLAogICAgICAgICAgICAgICAgICAgICAgICAnXG5cbiAgICAgICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcblxuICAgICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgIH1cblxuICAgIGgyIHtcbiAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG5cbiAgICBwIHtcbiAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7XG5cbiAgICAgIGEge1xuICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5xYy1jbXAyLWNsb3NlLWljb24ge1xuICAgICAgYmFja2dyb3VuZDogdXJsKCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwlM0NzdmcgeG1sbnM9XCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wnIHdpZHRoPVwnMjRcJyBoZWlnaHQ9XCcyNFwnJTNFJTNDcGF0aCBkPVwnTS41LjVsMjMgMjNtMC0yM2wtMjMgMjNcJyBmaWxsPVwnbm9uZVwnIHN0cm9rZT1cJyUyMzAwMFwnIHN0cm9rZS1saW5lY2FwPVwncm91bmRcJyBzdHJva2UtbGluZWpvaW49XCdyb3VuZFwnIHN0cm9rZS1taXRlcmxpbWl0PVwnMTBcJy8lM0UlM0NwYXRoIGZpbGw9XCdub25lXCcgZD1cJ00wIDBoMjR2MjRIMHpcJy8lM0UlM0Mvc3ZnJTNFIilcbiAgICAgICAgbm8tcmVwZWF0O1xuICAgICAgYmFja2dyb3VuZC1zaXplOiA2NiU7XG4gICAgICBib3JkZXI6IG5vbmU7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogMzhweDtcbiAgICAgIHdpZHRoOiAzOHB4O1xuICAgICAgcmlnaHQ6IDIwcHg7XG4gICAgICB0b3A6IDIwcHg7XG4gICAgICB6LWluZGV4OiAxO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIH1cblxuICAgIC5xYy1jbXAyLWluZm8taWNvbiB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0NzdmcgYXJpYS1oaWRkZW49XCd0cnVlXCcgZm9jdXNhYmxlPVwnZmFsc2VcJyB4bWxucz1cJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCcgdmlld0JveD1cJzAgMCA1MTIgNTEyXCclM0UlM0NwYXRoIGZpbGw9XCclMjNGQUFEMTRcJyBkPVwnTTI1NiA4QzExOS4wNDMgOCA4IDExOS4wODMgOCAyNTZjMCAxMzYuOTk3IDExMS4wNDMgMjQ4IDI0OCAyNDhzMjQ4LTExMS4wMDMgMjQ4LTI0OEM1MDQgMTE5LjA4MyAzOTIuOTU3IDggMjU2IDh6bTAgMTEwYzIzLjE5NiAwIDQyIDE4LjgwNCA0MiA0MnMtMTguODA0IDQyLTQyIDQyLTQyLTE4LjgwNC00Mi00MiAxOC44MDQtNDIgNDItNDJ6bTU2IDI1NGMwIDYuNjI3LTUuMzczIDEyLTEyIDEyaC04OGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnYtMjRjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxMnYtNjRoLTEyYy02LjYyNyAwLTEyLTUuMzczLTEyLTEydi0yNGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDY0YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MTAwaDEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjR6XCclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UlMEEiKTtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICAgICAgaGVpZ2h0OiAxNXB4O1xuICAgICAgd2lkdGg6IDIxcHg7XG4gICAgfVxuXG4gICAgLnFjLWNtcDItY29uc2VudC1pbmZvIHtcbiAgICAgIHBhZGRpbmc6IDUlIDIwcHggMiU7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG5cbiAgICAgIC5xYy1jbXAyLWhlYWRlci1saW5rcyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBmbG9hdDogcmlnaHQ7XG5cbiAgICAgICAgYnV0dG9uIHtcbiAgICAgICAgICBtYXJnaW46IDAgMTVweDtcbiAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1wdWJsaXNoZXItbG9nby1jb250YWluZXIge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICAgICAgICAucWMtY21wMi1ob21lLWJ1dHRvbiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB0b3A6IDAlO1xuICAgICAgICAgIGxlZnQ6IDAlO1xuICAgICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgICAgc3ZnIHtcbiAgICAgICAgICAgIHVzZSB7XG4gICAgICAgICAgICAgIGZpbGw6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgICcsCiAgICAgICAgICAgICAgICAgICAgICAgICdcblxuICAgICAgICAgICY6Zm9jdXMge1xuICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbWcge1xuICAgICAgICAgICAgbWFyZ2luOiAwIDVweCAwIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmlndXJlIC5sb2dvLWNvbnRhaW5lciB7XG4gICAgICAgICAgbWFyZ2luOiAwIGF1dG87XG4gICAgICAgIH1cblxuICAgICAgICBpbWcge1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGgyIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMyU7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAzJTtcbiAgICAgICAgbWF4LWhlaWdodDogMjB2aDtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucWMtY21wMi1zdW1tYXJ5LXNlY3Rpb24ge1xuICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG5cbiAgICAgIGgyIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgIH1cblxuICAgICAgLmxvZ28tY29udGFpbmVyIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTNweDtcbiAgICAgIH1cbiAgICAgIC5xYy1jbXAyLXB1Ymxpc2hlci1sb2dvLWNvbnRhaW5lciB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItc3VtbWFyeS1pbmZvIHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDMwcHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcblxuICAgICAgICBwIHtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMS41ZW07XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiBub25lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnFjLWNtcDItc2Nyb2xsYWJsZS1zZWN0aW9uIHtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBmbGV4OiAxO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtYXgtd2lkdGg6IDc3MHB4O1xuICAgICAgbWF4LWhlaWdodDogMTAwJTtcblxuICAgICAgJjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgICB3aWR0aDogMC43cmVtO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAmOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgICAgIGJhY2tncm91bmQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICB9XG4gICAgICAmLmxvYWRpbmcge1xuICAgICAgICAmOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XG4gICAgICAgICAgYmFja2dyb3VuZDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3Bhbi5xYy1jbXAyLWxvYWRpbmctbWVzc2FnZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbWFyZ2luOiBhdXRvO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5xYy1jbXAyLXByaXZhY3ktcG9saWN5IHtcbiAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgcGFkZGluZzogMi41JSA2MHB4O1xuXG4gICAgICBhIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAucWMtY21wMi1mb290ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICBib3JkZXItdG9wOiBzb2xpZCAxcHggJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgIHBhZGRpbmc6IDMlIDE1cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgJi5xYy1jbXAyLWZvb3Rlci1vdmVybGF5IHtcbiAgICAgICAgJjo6YmVmb3JlIHtcbiAgICAgICAgICBjb250ZW50OiBcJ1wnO1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBoZWlnaHQ6IDUwcHg7XG4gICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDBkZWcsICNmZmZmZmYsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMCkpO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICAgdG9wOiAtNTFweDtcbiAgICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlO1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAmLnFjLWNtcDItZm9vdGVyLXNjcm9sbGVkIHtcbiAgICAgICAgICAmOjpiZWZvcmUge1xuICAgICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgKiB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICB9XG5cbiAgICAgIFttb2RlPVwnbGlua1wnXSB7XG4gICAgICAgICY6bm90KC5xYy1jbXAyLWxpbmstYWN0aXZlKSB7XG4gICAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgJiA+IGJ1dHRvbiB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyLjglO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLWZvb3Rlci1saW5rcyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgcGFkZGluZy10b3A6IDEwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1idXR0b25zLWRlc2t0b3Age1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1zdW1tYXJ5LWJ1dHRvbnMge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICBidXR0b24ge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgICAgICAgb3JkZXI6IDE7XG5cbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIG9yZGVyOiAyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICBvcmRlcjogMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBAbWVkaWEgKG1heC13aWR0aDogMzYwcHgpIHtcbiAgICAgIC8qIHN1cHBvcnQgZm9yIGlQaG9uZSA1L1NFIGFuZCBHYWxheHkgUzUgKi9cbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuXG4gICAgICBwIHtcbiAgICAgICAgZm9udC1zaXplOiAxM3B4O1xuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1zdW1tYXJ5LXNlY3Rpb24ge1xuICAgICAgICBtYXgtaGVpZ2h0OiA3MCU7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLWNvbnNlbnQtaW5mbyB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuXG4gICAgICAgIGltZyB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGgyIHtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAzcHg7XG4gICAgICAgIH1cblxuICAgICAgICBwIHtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7XG4gICAgICAgICAgbWF4LWhlaWdodDogMTV2aDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucWMtY21wMi1zY3JvbGxhYmxlLXNlY3Rpb24ge1xuICAgICAgICBtYXgtaGVpZ2h0OiA0MiU7XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLXByaXZhY3ktcG9saWN5IHtcbiAgICAgICAgcGFkZGluZzogOHB4IDI1cHg7XG5cbiAgICAgICAgcCB7XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIChtaW4td2lkdGg6IDc2OHB4KSB7XG4gICAgICBoZWlnaHQ6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICBtYXgtaGVpZ2h0OiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgd2lkdGg6IDc3MHB4O1xuICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiBhdXRvIDFmcjtcblxuICAgICAgaDIge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIHAge1xuICAgICAgICBmb250LXNpemU6IDE1cHg7XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLWhpZGUtZGVza3RvcCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLWNvbnNlbnQtaW5mbyB7XG4gICAgICAgIHBhZGRpbmc6IDE1cHggMzBweDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgICAgcCB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiBub25lO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5xYy1jbXAyLXB1Ymxpc2hlci1sb2dvLWNvbnRhaW5lciB7XG4gICAgICAgICAgaW1nIHtcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGgyIHtcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC5xYy1jbXAyLXNjcm9sbGFibGUtc2VjdGlvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAgMzBweDtcbiAgICAgIH1cblxuICAgICAgLnFjLWNtcDItZm9vdGVyIHtcbiAgICAgICAgcGFkZGluZzogMTNweCAzMHB4O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgYm94LXNoYWRvdzogMCAtMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgMC4xKTtcblxuICAgICAgICAucWMtY21wMi1mb290ZXItbGlua3Mge1xuICAgICAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgIGJ1dHRvbiB7XG4gICAgICAgICAgICAmOm5vdCgucWMtY21wMi1saW5rLWFjdGl2ZSkge1xuICAgICAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5xYy1jbXAyLWJ1dHRvbnMtZGVza3RvcCB7XG4gICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDUwcHg7XG4gICAgICAgICAgYnV0dG9uIHtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgICBmb250LXNpemU6IDExcHg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnV0dG9uIHtcbiAgICAgICAgICAgICY6Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMWVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC5xYy1jbXAyLXN1bW1hcnktYnV0dG9ucyB7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgICAgcGFkZGluZzogNXB4IDA7XG5cbiAgICAgICAgICBidXR0b24ge1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTVweDtcbiAgICAgICAgICAgIG9yZGVyOiAwO1xuXG4gICAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgb3JkZXI6IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAmLnFjLWNtcDItZm9vdGVyLW92ZXJsYXkge1xuICAgICAgICAgICY6OmJlZm9yZSB7XG4gICAgICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAnLAogICAgICAgICAgICAgICAgICAgICAgICAnXG4gICAgfVxuICB9XG4nCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEdvID0gR3QuZGl2KFZvKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4QmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSBlLnBhZ2UgPyAnYXV0byAzZnIgYXV0bycgOiAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlzSUUsIHQgPSBlLnBhZ2UsIHIgPSBlLnVzZXNMb2dvOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAxID09PSB0ICYmIEV0KEZvKCksIHIgPyAnMTkycHgnIDogJzI2MnB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlzSUUsIHQgPSBlLnBhZ2UsIHIgPSBlLnVzZXNMb2dvOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAyID09PSB0ICYmIEV0KGpvKCksIHIgPyAnMjgycHgnIDogJzM0MnB4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlzSUUsIHQgPSBlLnBhZ2UsIHIgPSBlLnVzZXNMb2dvOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAxICE9PSB0ICYmIDIgIT09IHQgJiYgRXQoQm8oKSwgciA/ICcyNjJweCcgOiAnMzMycHgnKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eEZvbnRDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eEZvbnRDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eExpbmtDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pc0lFICYmIEV0KERvKCkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4UHJpbWFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4QmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4QmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4UHJpbWFyeUJ1dHRvbkNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJvcmRlckNvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4TGlua0NvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSBlLnBhZ2UgPyAnYXV0bycgOiAnaW5oZXJpdCc7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IGUucGFnZSA/ICdub25lJyA6ICc1NTBweCc7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudXhMaW5rQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlzUG9wdXAsIHQgPSBlLnBhZ2UsIHIgPSBlLnV4QmFja2dyb3VuZENvbG9yOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW4gJiYgMCA9PT0gdCAmJiBFdChVbygpLCByLCByKTsKICAgICAgICAgICAgICAgICAgICB9KSwgTW8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY29yZVVpTGFiZWxzLCB0ID0gZS5wcmVtaXVtVWlMYWJlbHMsIHIgPSBlLmlzUG9wdXAsIG8gPSBlLm5vbklhYkRhdGEsIGEgPSBlLnBhZ2UsIHMgPSBlLmNvbnNlbnRHcm91cEhhbmRsZXIsIGMgPSBlLnZlbmRvcnNEYXRhLCBsID0gZS5zaG93UmVqZWN0QnV0dG9uLCB1ID0gZS5nb29nbGVWZW5kb3JzLCBwID0gZS5pc0FtcCwgZCA9IGUuc2V0QWxsQ29uc2VudHNUb0J5UGFnZSwgZiA9IGcoX2UoQ2EpLCAyKVsxXSwgbSA9IGcoZmUoITEpLCAyKSwgaCA9IG1bMF0sIHYgPSBtWzFdLCBfID0gZyhmZSh7fSksIDIpLCB4ID0gX1swXSwgRSA9IF9bMV0sIEMgPSBnKGZlKE1hdGgucmFuZG9tKCkpLCAyKSwgayA9IENbMF0sIHcgPSBDWzFdLCBTID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBMID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoYSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGEsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAoZCghMCwgYSksIHcoTWF0aC5yYW5kb20oKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIChkKCExLCBhKSwgdyhNYXRoLnJhbmRvbSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBBID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuY3VycmVudFRhcmdldC5wYXJlbnROb2RlLCBvID0gQ3QuRVhQQU5EX0VMRU1FTlQsIGEgPSBDdC5DT0xMQVBTRV9FTEVNRU5UOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2xhc3NMaXN0LmNvbnRhaW5zKCdxYy1jbXAyLWV4cGFuZGVkJykgPyAob2EuZXZlbnRUcmFja2VyKGEsIHQpLCBFKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGIoe30sIGUpLCB7fSwgeSh7fSwgdCwgITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiAob2EuZXZlbnRUcmFja2VyKG8sIHQpLCBFKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGIoe30sIGUpLCB7fSwgeSh7fSwgdCwgITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHIuY2xhc3NMaXN0LnRvZ2dsZSgncWMtY21wMi1leHBhbmRlZCcpLCBlLmN1cnJlbnRUYXJnZXQuaW5uZXJIVE1MID09PSBuLnNob3dQYXJ0bmVycyA/IGUuY3VycmVudFRhcmdldC5pbm5lckhUTUwgPSBuLmhpZGVQYXJ0bmVycyA6IGUuY3VycmVudFRhcmdldC5pbm5lckhUTUwgPT09IG4uaGlkZVBhcnRuZXJzICYmIChlLmN1cnJlbnRUYXJnZXQuaW5uZXJIVE1MID0gbi5zaG93UGFydG5lcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSSA9IGZ1bmN0aW9uIChlLCBuLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLmluaXRTY3JlZW5Cb2R5VGV4dE9wdGlvbiwgYSA9IG4uY3VzdG9tSW5pdFNjcmVlbkJvZHlUZXh0LCBzID0gbi5jdXN0b21TZWNvbmRTY3JlZW5Cb2R5VGV4dCwgYyA9IG4uY3VzdG9tVmVuZG9yU2NyZWVuQm9keVRleHQsIGwgPSBuLmN1c3RvbUxlZ2l0aW1hdGVTY3JlZW5Cb2R5VGV4dCwgdSA9ICcnLCBwID0gITEsIGQgPSBlLmNvbnNlbnRTY29wZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmLCBtID0gNCA9PT0gbyAmJiBhLCBoID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHNyKGEsIG4ucHVycG9zZVNjcmVlblZlbmRvckxpbmsudG9Mb3dlckNhc2UoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXQuU0VSVklDRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gbi5zdW1tYXJ5U2NyZWVuQm9keVJlamVjdFNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFF0LkdMT0JBTDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gbi5zdW1tYXJ5U2NyZWVuQm9keVJlamVjdEdsb2JhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9ICEwLCBmID0gbi5zdW1tYXJ5U2NyZWVuQm9keVJlamVjdEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXQuU0VSVklDRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gbi5zdW1tYXJ5U2NyZWVuQm9keU5vUmVqZWN0U2VydmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUXQuR0xPQkFMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBuLnN1bW1hcnlTY3JlZW5Cb2R5Tm9SZWplY3RHbG9iYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSAhMCwgZiA9IG4uc3VtbWFyeVNjcmVlbkJvZHlOb1JlamVjdEdyb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCAmJiAoZiA9IFtdLmNvbmNhdChpKGYpLCBbcnIoZlsxXSwgbi5ncm91cE9mU2l0ZXNMYWJlbCwgZSldKSksIG0gfHwgKGYgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcihmWzBdLCBuLnB1cnBvc2VTY3JlZW5WZW5kb3JMaW5rLnRvTG93ZXJDYXNlKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlsxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVRleHQ6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbWl6ZWQ6ICEhbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQgPT09IG8gJiYgcyA/ICh1ID0gc3Iocywgbi5wdXJwb3NlU2NyZWVuVmVuZG9yTGluay50b0xvd2VyQ2FzZSgpLCBlKSwgcCA9ICEwKSA6IHUgPSBkID09PSBRdC5TRVJWSUNFID8gbi5pbml0U2NyZWVuQm9keVNlcnZpY2UgfHwgJycgOiBkID09PSBRdC5HTE9CQUwgPyBuLmluaXRTY3JlZW5Cb2R5R2xvYmFsIHx8ICcnIDogbi5pbml0U2NyZWVuQm9keUdyb3VwIHx8ICcnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5VGV4dDogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ3VzdG9taXplZDogcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQgPT09IG8gJiYgYyA/ICh1ID0gc3IoYywgbi5wdXJwb3NlU2NyZWVuVmVuZG9yTGluay50b0xvd2VyQ2FzZSgpLCBlKSwgcCA9ICEwKSA6IHUgPSBuLnZlbmRvclNjcmVlbkJvZHkgfHwgJycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21pemVkOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNCA9PT0gbyAmJiBsID8gKHUgPSBzcihsLCBuLnB1cnBvc2VTY3JlZW5WZW5kb3JMaW5rLnRvTG93ZXJDYXNlKCksIGUpLCBwID0gITApIDogdSA9IG4ubGVnaXRpbWF0ZVNjcmVlbkJvZHkgfHwgJycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21pemVkOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlUZXh0OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21pemVkOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShzYS5jb3JlQ29uZmlnLCBuLCBsLCBhKSwgTyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS50YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLnNjcm9sbEhlaWdodCAtIG4uc2Nyb2xsVG9wID09PSBuLmNsaWVudEhlaWdodCA/IHYoITApIDogaCAmJiB2KCExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5xYy1jbXAyLXN1bW1hcnktaW5mbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5zY3JvbGxIZWlnaHQgLSBlLnNjcm9sbFRvcCA9PT0gZS5jbGllbnRIZWlnaHQgPyB2KCEwKSA6IGggJiYgdighMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSwgdG4uY3JlYXRlRWxlbWVudChHbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQb3B1cDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncWMtY21wMi11aScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6ICdxYy1jbXAyLXVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLW1vZGFsJzogJ3RydWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiSW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogaWEuYm9yZGVyQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWdodGVzdFRleHRDb2xvcjogaWEubGlnaHRlc3RUZXh0Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eEJhY2tncm91bmRDb2xvcjogaWEudXhCYWNrZ3JvdW5kQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eFByaW1hcnlCdXR0b25Db2xvcjogaWEudXhQcmltYXJ5QnV0dG9uQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eEZvbnRDb2xvcjogaWEudXhGb250Q29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1eExpbmtDb2xvcjogaWEudXhMaW5rQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nVGV4dENvbG9yOiBpYS53YXJuaW5nVGV4dENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0JhY2tncm91bmRDb2xvcjogaWEud2FybmluZ0JhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSUU6IGxyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzTG9nbzogJycgIT09IHNhLmNvcmVDb25maWcucHVibGlzaGVyTG9nbwogICAgICAgICAgICAgICAgICAgICAgICB9LCBvYS5nZXREaXNwbGF5VHlwZSgpICE9PSBrdC5NQU5EQVRPUlkgJiYgMCAhPT0gYSAmJiB0bi5jcmVhdGVFbGVtZW50KCdidXR0b24nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAyLWNsb3NlLWljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHJlZ3VsYXRpb246ICdHRFBSJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVE9HR0xFX0RJU1BMQVknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG9hLmV2ZW50VHJhY2tlcihDdC5ESVNNSVNTX1VJLCAnY2xpY2snKSwgYWEuc2VuZERvbmVMb2codm9pZCAwLCAnJywgJycpLCBvYS5ub3RpZnlVaUNsb3NlZCgnR0RQUicpLCB0cihwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0LkNPTlNFTlRfUkVTUE9OU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogT3QuRElTTUlTUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0bi5jcmVhdGVFbGVtZW50KGtyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0QWxsSGVhZGVyOiBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RBbGxIZWFkZXI6IHEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlDb250ZW50OiBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTY3JvbGw6IDAgPT09IGEgPyBPIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Rlc2t0b3A6IHdpbmRvdy5zY3JlZW4ud2lkdGggPiA3NjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1wOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgbnVsbCwgdG4uY3JlYXRlRWxlbWVudChwciwgT2JqZWN0LmFzc2lnbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRBbGxGdW5jdGlvbjogTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdFNlbGVjdGVkOiBTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChObywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW1pdW1VaUxhYmVsczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yc0RhdGE6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkRhdGE6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVPYmo6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIHRuLmNyZWF0ZUVsZW1lbnQociwgbnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcignVmVuZG9ycyByZW5kZXJlZDogJy5jb25jYXQoT2JqZWN0LmtleXMoYy52ZW5kb3JzKS5sZW5ndGgpKSwgdG4uY3JlYXRlRWxlbWVudChSbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW1pdW1VaUxhYmVsczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yc0RhdGE6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkRhdGE6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrOiBBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVWZW5kb3JzOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCB0bi5jcmVhdGVFbGVtZW50KHIsIG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3IoJ1ZlbmRvcnMgcmVuZGVyZWQ6ICcuY29uY2F0KE9iamVjdC5rZXlzKGMudmVuZG9ycykubGVuZ3RoKSksIHRuLmNyZWF0ZUVsZW1lbnQodm8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZVVpTGFiZWxzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcnNEYXRhOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGljazogQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uSWFiRGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdG4uY3JlYXRlRWxlbWVudChyLCBudWxsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLWNtcDItc3VtbWFyeS1zZWN0aW9uJyB9LCBlKSwgdG4uY3JlYXRlRWxlbWVudChyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdEFsbEZ1bmN0aW9uOiBQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVqZWN0QnV0dG9uOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93T3ZlcmxheTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2Nyb2xsZWQ6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1wOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6bygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICAnXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSG8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGhlaWdodDogJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3B4O1xuICAgIHdpZHRoOiAxMDB2dztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiA5OTk5OTk5OTk5OTk5OTtcblxuICAgICoge1xuICAgICAgZm9udC1mYW1pbHk6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBwYWRkaW5nOiAwO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIH1cblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1xuICAgIH1cbiAgfVxuJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBIbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkbyA9IEd0LmRpdihIbygpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUub3ZlcmxheUNvbG9yLCB0ID0gZS5pc0FNUCwgciA9IGUucGFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgMCA9PT0gciA/ICdub25lJyA6IG47CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnV4Rm9udENvbG9yOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZvbnQ7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmlzUG9wdXAsIHQgPSBlLnBhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbiAmJiAwID09PSB0ICYmIEV0KHpvKCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBZbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5pc1BvcHVwLCB0ID0gZS5jbGFzc05hbWUsIHIgPSBlLmlzT3BlbiwgbyA9IGUucGFnZSwgYSA9IGUuY2hpbGRyZW4sIGkgPSBlLmlzQU1QLCBzID0gZyhmZSh3aW5kb3cuaW5uZXJIZWlnaHQpLCAyKSwgYyA9IHNbMF0sIGwgPSBzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICBoZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHUpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbCh3aW5kb3cuaW5uZXJIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudCh0bi5GcmFnbWVudCwgbnVsbCwgciAmJiB0bi5jcmVhdGVFbGVtZW50KCRvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvcHVwOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlDb2xvcjogaWEub3ZlcmxheUNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXhGb250Q29sb3I6IGlhLnV4Rm9udENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udDogaWEuZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQU1QOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEpKTsKICAgICAgICAgICAgICAgICAgICB9LCBXbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jb3JlQ29uZmlnLCB0ID0gZS5jb3JlVWlMYWJlbHMsIHIgPSBlLnByZW1pdW1VaUxhYmVscywgbyA9IGUubm9uSWFiRGF0YSwgYSA9IGUudmVuZG9yc0RhdGEsIGkgPSBlLmNvbnNlbnRHcm91cEhhbmRsZXIsIHMgPSBlLmV2ZW50VHJhY2tlciwgYyA9IGUuc2V0QWxsQ29uc2VudHNUb0J5UGFnZSwgbCA9IGUuZ29vZ2xlVmVuZG9ycywgdSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDc2OCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggPD0gNzY4IHx8IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCA3NjgsIHAgPSBnKF9lKENhKSwgMSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KFlvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvcHVwOiAncG9wdXAnID09PSBuLnVpTGF5b3V0IHx8IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09wZW46IHAuZGlzcGxheUdEUFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAtY2xlYW5zbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiBwLnBhZ2VHRFBSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBTVA6IG4uaXNBTVAKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcC5kaXNwbGF5R0RQUiAmJiB0bi5jcmVhdGVFbGVtZW50KE1vLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvcHVwOiAncG9wdXAnID09PSBuLnVpTGF5b3V0IHx8IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJEYXRhOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yc0RhdGE6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRyYWNrZXI6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50R3JvdXBIYW5kbGVyOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcC5wYWdlR0RQUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFsbENvbnNlbnRzVG9CeVBhZ2U6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93UmVqZWN0QnV0dG9uOiBuLmluaXRTY3JlZW5SZWplY3RCdXR0b25TaG93aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlVmVuZG9yczogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1wOiBuLmlzQU1QCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gSm8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSdChbCiAgICAgICAgICAgICAgICAgICAgICAgICdcbiAgJiYge1xuICAgIG1heC13aWR0aDogNzcwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG5cbiAgICAucWMtdXNwLXVpLWNvbnRlbnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBtYXJnaW46IGF1dG87XG4gICAgICBtYXgtd2lkdGg6IDY2MHB4O1xuICAgICAgcGFkZGluZzogMzBweCAzMHB4IDMwcHg7XG5cbiAgICAgIC5xYy11c3AtdWktZm9ybS1jb250ZW50IHtcbiAgICAgICAgbWF4LXdpZHRoOiA2MDBweDtcbiAgICAgICAgcGFkZGluZzogMTBweCAxMHB4IDE1cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG5cbiAgICAgICAgPiBidXR0b24ge1xuICAgICAgICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICAgIHdpZHRoOiAxNDBweDtcbiAgICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAucWMtdXNwLWNvbnRhaW5lciB7XG4gICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgIG1hcmdpbjogMDtcblxuICAgICAgICAgIC5xYy11c3AtY29udGFpbmVyLXJvdyB7XG4gICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICBmb250LXdlaWdodDogMTAwO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG5cbiAgICAgICAgICAgIC5xYy11c3AtcHVycG9zZS1pbmZvIHtcbiAgICAgICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgICAgICAgICAgICAucWMtdXNwLXRvb2dsZSB7XG4gICAgICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDBweDtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC5xYy11c3AtYWN0aW9uLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogMTVweDtcbiAgICAgICAgICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNTBweCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLnFjLXVzcC10aXRsZSB7XG4gICAgICAgIGNvbG9yOiAnLAogICAgICAgICAgICAgICAgICAgICAgICAnO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgfVxuXG4gICAgICAucWMtdXNwLW1haW4tbWVzc2FnaW5nIHtcbiAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIG1heC1oZWlnaHQ6IDI3MHB4O1xuICAgICAgICBwYWRkaW5nOiAxNXB4IDA7XG4gICAgICAgIG1hcmdpbjogMTVweCAwO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcblxuICAgICAgICBhIHtcbiAgICAgICAgICBjb2xvcjogJywKICAgICAgICAgICAgICAgICAgICAgICAgJztcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAucWMtdXNwLWFsdC1idXR0b25zIHtcbiAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgcGFkZGluZy1ib3R0b206IDMwcHg7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG5cbiAgICAgIC5xYy11c3AtYWx0LWFjdGlvbiB7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgY29sb3I6ICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuXG4gICAgICAgICYucWMtdXNwLWNlbnRlci1ib3R0b20ge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICAgICAgICBwYWRkaW5nOiAwIDE1cHg7XG4gICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuXG4gICAgICAgICAgJiArIC5xYy11c3AtY2VudGVyLWJvdHRvbSB7XG4gICAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICcsCiAgICAgICAgICAgICAgICAgICAgICAgICc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnFjLXVzcC1jbG9zZS1pY29uIHtcbiAgICAgIGJhY2tncm91bmQ6IHVybCgiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsJTNDc3ZnIHhtbG5zPVwnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcJyB3aWR0aD1cJzI0XCcgaGVpZ2h0PVwnMjRcJyUzRSUzQ3BhdGggZD1cJ00uNS41bDIzIDIzbTAtMjNsLTIzIDIzXCcgZmlsbD1cJ25vbmVcJyBzdHJva2U9XCclMjMwMDBcJyBzdHJva2UtbGluZWNhcD1cJ3JvdW5kXCcgc3Ryb2tlLWxpbmVqb2luPVwncm91bmRcJyBzdHJva2UtbWl0ZXJsaW1pdD1cJzEwXCcvJTNFJTNDcGF0aCBmaWxsPVwnbm9uZVwnIGQ9XCdNMCAwaDI0djI0SDB6XCcvJTNFJTNDL3N2ZyUzRSIpXG4gICAgICAgIG5vLXJlcGVhdDtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogNjUlO1xuICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgICAgbWFyZ2luOiBhdXRvIDA7XG4gICAgICB3aWR0aDogMzhweDtcbiAgICAgIHJpZ2h0OiAyMHB4O1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAyMHB4O1xuICAgIH1cblxuICAgIEBtZWRpYSAobWluLXdpZHRoOiA3NjhweCkge1xuICAgICAgLnFjLXVzcC11aS1jb250ZW50IHtcbiAgICAgICAgLnFjLXVzcC11aS1mb3JtLWNvbnRlbnQge1xuICAgICAgICAgIC5xYy11c3AtY29udGFpbmVyIHtcbiAgICAgICAgICAgIC5xYy11c3AtY29udGFpbmVyLXJvdyB7XG4gICAgICAgICAgICAgIC5xYy11c3AtcHVycG9zZS1pbmZvIHtcbiAgICAgICAgICAgICAgICAucWMtdXNwLXRvb2dsZSB7XG4gICAgICAgICAgICAgICAgICBtYXJnaW4tbGVmdDogM3B4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC5xYy11c3AtYWN0aW9uLWRlc2NyaXB0aW9uIHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICAgICAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDc1cHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBKbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBYbyA9IEd0LmRpdihKbygpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5ib3JkZXJDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJIZWFkZXJDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eEZvbnRDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51eFByaW1hcnlCdXR0b25Db2xvcjsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5ib3JkZXJDb2xvcjsKICAgICAgICAgICAgICAgICAgICB9KSwgS28gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUucHJlbWl1bVVpTGFiZWxzLCB0ID0gZS5jb3JlQ29uZmlnLCByID0gZS5jbG9zZSwgbyA9IGUuZXZlbnRUcmFja2VyLCBhID0gZyhmZSghMSksIDIpLCBpID0gYVswXSwgcyA9IGFbMV0sIGMgPSBnKGZlKHsgdXNwU3RyaW5nOiAnJyB9KSwgMiksIGwgPSBjWzBdLCB1ID0gY1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fdXNwYXBpKCdnZXRVU1BEYXRhJywgMSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGUgJiYgJ1knID09PSBlLnVzcFN0cmluZ1syXSksIHUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG4uY3JlYXRlRWxlbWVudChYbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9sZTogJ2RpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogJ3FjLXVzcC10aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1tb2RhbCc6ICd0cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6IGlhLmJvcmRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViSGVhZGVyQ29sb3I6IGlhLnN1YkhlYWRlckNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXhGb250Q29sb3I6IGlhLnV4Rm9udENvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXhQcmltYXJ5QnV0dG9uQ29sb3I6IGlhLnV4UHJpbWFyeUJ1dHRvbkNvbG9yCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtcHJlc3NlZCc6ICdmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy11c3AtY2xvc2UtaWNvbiAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHIodC5pc0FNUCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdC5DT05TRU5UX1JFU1BPTlNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IE90LkRJU01JU1MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcigpLCBvKEN0LkRJU01JU1NfVUksICdjbGljaycpLCB2b2lkIGFhLnNlbmREb25lTG9nVXNwKFB0LkFDQ0VQVF9QQVJUSUFMLCBsLnVzcFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLXVzcC11aS1jb250ZW50JyB9LCB0bi5jcmVhdGVFbGVtZW50KCdwJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdxYy11c3AtdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLXRpdGxlJwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnB1Ymxpc2hlck5hbWUgJiYgJycuY29uY2F0KHQucHVibGlzaGVyTmFtZSwgJyAtICcpLCBuLnVzcERuc1RpdGxlKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLW1haW4tbWVzc2FnaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIEFycmF5LmlzQXJyYXkobi51c3BEbnNUZXh0KSA/IG4udXNwRG5zVGV4dC5tYXAoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogZSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7IF9faHRtbDogbi51c3BEbnNUZXh0IH0gfSkpLCB0bi5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ3FjLXVzcC11aS1mb3JtLWNvbnRlbnQnIH0sIHRuLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAncWMtdXNwLWNvbnRhaW5lcicgfSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy11c3AtY29udGFpbmVyLXJvdycgfSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy11c3AtcHVycG9zZS1pbmZvJyB9LCB0bi5jcmVhdGVFbGVtZW50KEFyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsbGVkYnknOiAndG9nZ2xlRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLXRvb2dsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhDdC5PUFRfT1VUX1RPR0dMRSwgU3RyaW5nKCFpKSksIHMoIWkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdG4uY3JlYXRlRWxlbWVudCgncCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAndG9nZ2xlRGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLWFjdGlvbi1kZXNjcmlwdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi51c3BEb05vdFNlbGxUb2dnbGVUZXh0KSkpKSwgdG4uY3JlYXRlRWxlbWVudChadCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnOiAnQ29uZmlybScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJpYS1wcmVzc2VkJzogJ2ZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ICdsYXJnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKEN0Lk9QVF9PVVRfQ09ORklSTSwgU3RyaW5nKGkpKSwgd2luZG93Ll9fdXNwYXBpKCdzZXRVc3BEYXRhJywgMSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHIodC5pc0FNUCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXQuQ09OU0VOVF9SRVNQT05TRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogZS5kb05vdFNlbGwgPyBPdC5SRUpFQ1QgOiBPdC5BQ0NFUFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBlLnVzcFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRNZXRhZGF0YTogeyBjb25zZW50U3RyaW5nVHlwZTogSXQuVVNQIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGFhLnNlbmREb25lTG9nVXNwKGkgPyBQdC5SRUpFQ1QgOiBQdC5BQ0NFUFRfQUxMLCBlLnVzcFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSksIHZvaWQgcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnVzcEFjY2VwdEJ1dHRvbikpKSwgdG4uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdxYy11c3AtYWx0LWJ1dHRvbnMnIH0sICF0LnN1cHByZXNzQ2NwYUxpbmtzICYmIHRuLmNyZWF0ZUVsZW1lbnQodG4uRnJhZ21lbnQsIG51bGwsIHRuLmNyZWF0ZUVsZW1lbnQoJ2EnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJJbmRleDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncWMtdXNwLWRlbGV0ZS1saW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3FjLXVzcC1hbHQtYWN0aW9uIHFjLXVzcC1jZW50ZXItYm90dG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHQudXNwRGVsZXRlRGF0YUxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1JlYWQgTW9yZSBhYm91dCB0aGUgRGF0YSBEZWxldGlvbiBQb2xpY3knCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4udXNwRGVsZXRlRGF0YUxpbmtUZXh0KSwgdG4uY3JlYXRlRWxlbWVudCgnYScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdxYy11c3AtYWNjZXNzLWxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLWFsdC1hY3Rpb24gcWMtdXNwLWNlbnRlci1ib3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdC51c3BBY2Nlc3NEYXRhTGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVhZCBNb3JlIGFib3V0IHRoZSBEYXRhIEFjY2VzcyBQb2xpY3knCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4udXNwQWNjZXNzRGF0YUxpbmtUZXh0KSwgdG4uY3JlYXRlRWxlbWVudCgnYScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYkluZGV4OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdxYy11c3AtcG9saWN5LWxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAncWMtdXNwLWFsdC1hY3Rpb24gcWMtdXNwLWNlbnRlci1ib3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogdC51c3BQcml2YWN5UG9saWN5TGluaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVhZCBNb3JlIGFib3V0IHRoZSBQcml2YWN5IFBvbGljeScKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi51c3BQcml2YWN5UG9saWN5TGlua1RleHQpKSkpOwogICAgICAgICAgICAgICAgICAgIH0sIFFvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvcmVDb25maWcsIHQgPSBlLnByZW1pdW1VaUxhYmVscywgciA9IGUuZXZlbnRUcmFja2VyLCBvID0gZyhfZShDYSksIDIpLCBhID0gb1swXSwgaSA9IG9bMV0sIHMgPSBhLmRpc3BsYXlVU1A7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bi5jcmVhdGVFbGVtZW50KFlvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdxYy1jbXAtY2xlYW5zbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BvcHVwOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3BlbjogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQU1QOiBuLmlzQU1QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LCBzICYmIHRuLmNyZWF0ZUVsZW1lbnQoS28sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVDb25maWc6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRyYWNrZXI6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHJlZ3VsYXRpb246ICdVU1AnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdUT0dHTEVfRElTUExBWScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBabygpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFJ0KFsnXG4gIC8qIFRoaXMgaXMgYSBjdXN0b21pemVkIHZlcnNpb24gb2YgY2xlYXNsYXRlLiBGb3IgbW9yZSBpbmZvIGdvIGhlcmU6IGh0dHA6Ly9jbGVhbnNsYXRlY3NzLmNvbS8gKi9cbiAgLnFjLWNtcC1jbGVhbnNsYXRlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaDEsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoMixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGgzLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaDQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoNSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGg2LFxuICAucWMtY21wLWNsZWFuc2xhdGUgcCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHRkLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0cixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGR0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBmb3JtLFxuICAucWMtY21wLWNsZWFuc2xhdGUgc2VsZWN0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgb3B0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgcHJlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGl2LFxuICAucWMtY21wLWNsZWFuc2xhdGUgdGFibGUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0aCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHRib2R5LFxuICAucWMtY21wLWNsZWFuc2xhdGUgdGZvb3QsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBjYXB0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdGhlYWQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGxpLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYWRkcmVzcyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGJsb2NrcXVvdGUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBkZCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGZpZWxkc2V0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgbGksXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpZnJhbWUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzdHJvbmcsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBsZWdlbmQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBlbSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN1bW1hcnksXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBjaXRlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgc3BhbixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgc3VwLFxuICAucWMtY21wLWNsZWFuc2xhdGUgbGFiZWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBkZm4sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvYmplY3QsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBiaWcsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBxLFxuICAucWMtY21wLWNsZWFuc2xhdGUgc2FtcCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFjcm9ueW0sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzbWFsbCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGltZyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN0cmlrZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGNvZGUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzdWIsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpbnMsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0ZXh0YXJlYSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGJ1dHRvbixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHZhcixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGEsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBhYmJyLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYXBwbGV0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUga2JkLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdHQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBiLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhyLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYXJ0aWNsZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFzaWRlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZmlndXJlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZmlnY2FwdGlvbixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGZvb3RlcixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhlYWRlcixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBuYXYsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzZWN0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdGltZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1hcmssXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBhdWRpbyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHZpZGVvLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYWJicixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFkZHJlc3MsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBhcmVhLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYmxvY2txdW90ZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGNhbnZhcyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGNhcHRpb24sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBjaXRlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgY29kZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGNvbGdyb3VwLFxuICAucWMtY21wLWNsZWFuc2xhdGUgY29sLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGF0YWxpc3QsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBmaWVsZHNldCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1haW4sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBtYXAsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBtZXRhLFxuICAucWMtY21wLWNsZWFuc2xhdGUgb3B0Z3JvdXAsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvdXRwdXQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBwcm9ncmVzcyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN2ZyB7XG4gICAgYmFja2dyb3VuZC1hdHRhY2htZW50OiBzY3JvbGw7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdDtcbiAgICBib3JkZXItY29sb3I6IGJsYWNrO1xuICAgIGJvcmRlci1jb2xvcjogY3VycmVudENvbG9yO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgYm9yZGVyLXN0eWxlOiBub25lO1xuICAgIGJvcmRlci13aWR0aDogbWVkaXVtO1xuICAgIGJvdHRvbTogYXV0bztcbiAgICBjbGVhcjogbm9uZTtcbiAgICBjbGlwOiBhdXRvO1xuICAgIGNvbG9yOiBpbmhlcml0O1xuICAgIGNvdW50ZXItaW5jcmVtZW50OiBub25lO1xuICAgIGNvdW50ZXItcmVzZXQ6IG5vbmU7XG4gICAgY3Vyc29yOiBhdXRvO1xuICAgIGRpcmVjdGlvbjogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBpbmxpbmU7XG4gICAgZmxvYXQ6IG5vbmU7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgZm9udC1zaXplOiBpbmhlcml0O1xuICAgIGZvbnQtc3R5bGU6IGluaGVyaXQ7XG4gICAgZm9udC12YXJpYW50OiBub3JtYWw7XG4gICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7XG4gICAgaGVpZ2h0OiBhdXRvO1xuICAgIGxlZnQ6IGF1dG87XG4gICAgbGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtcbiAgICBsaW5lLWhlaWdodDogaW5oZXJpdDtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IGluaGVyaXQ7XG4gICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogb3V0c2lkZTtcbiAgICBsaXN0LXN0eWxlLWltYWdlOiBub25lO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXgtaGVpZ2h0OiBub25lO1xuICAgIG1heC13aWR0aDogbm9uZTtcbiAgICBtaW4taGVpZ2h0OiAwO1xuICAgIG1pbi13aWR0aDogMDtcbiAgICBvcGFjaXR5OiAxO1xuICAgIG91dGxpbmU6IGludmVydCBub25lIG1lZGl1bTtcbiAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICBwYWRkaW5nOiAwO1xuICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgcXVvdGVzOiBcJ1wnIFwnXCc7XG4gICAgcmlnaHQ6IGF1dG87XG4gICAgdGFibGUtbGF5b3V0OiBhdXRvO1xuICAgIHRleHQtYWxpZ246IGluaGVyaXQ7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0O1xuICAgIHRleHQtaW5kZW50OiAwO1xuICAgIHRleHQtdHJhbnNmb3JtOiBub25lO1xuICAgIHRvcDogYXV0bztcbiAgICB1bmljb2RlLWJpZGk6IG5vcm1hbDtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gICAgdmlzaWJpbGl0eTogaW5oZXJpdDtcbiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAgIHdpZHRoOiBhdXRvO1xuICAgIHdvcmQtc3BhY2luZzogbm9ybWFsO1xuICAgIHotaW5kZXg6IGF1dG87XG5cbiAgICAtd2Via2l0LWJhY2tncm91bmQtb3JpZ2luOiBwYWRkaW5nLWJveDtcbiAgICBiYWNrZ3JvdW5kLW9yaWdpbjogcGFkZGluZy1ib3g7XG4gICAgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IGJvcmRlci1ib3g7XG4gICAgYmFja2dyb3VuZC1jbGlwOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiBhdXRvO1xuICAgIC1tb3otYmFja2dyb3VuZC1zaXplOiBhdXRvO1xuICAgIGJhY2tncm91bmQtc2l6ZTogYXV0bztcbiAgICAtd2Via2l0LWJvcmRlci1pbWFnZTogbm9uZTtcbiAgICAtbW96LWJvcmRlci1pbWFnZTogbm9uZTtcbiAgICAtby1ib3JkZXItaW1hZ2U6IG5vbmU7XG4gICAgYm9yZGVyLWltYWdlOiBub25lO1xuICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogMDtcbiAgICAtbW96LWJvcmRlci1yYWRpdXM6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGNvbnRlbnQtYm94O1xuICAgIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgLXdlYmtpdC1jb2x1bW4tY291bnQ6IGF1dG87XG4gICAgLW1vei1jb2x1bW4tY291bnQ6IGF1dG87XG4gICAgY29sdW1uLWNvdW50OiBhdXRvO1xuICAgIC13ZWJraXQtY29sdW1uLWdhcDogbm9ybWFsO1xuICAgIC1tb3otY29sdW1uLWdhcDogbm9ybWFsO1xuICAgIGNvbHVtbi1nYXA6IG5vcm1hbDtcbiAgICAtd2Via2l0LWNvbHVtbi1ydWxlOiBtZWRpdW0gbm9uZSBibGFjaztcbiAgICAtbW96LWNvbHVtbi1ydWxlOiBtZWRpdW0gbm9uZSBibGFjaztcbiAgICBjb2x1bW4tcnVsZTogbWVkaXVtIG5vbmUgYmxhY2s7XG4gICAgLXdlYmtpdC1jb2x1bW4tc3BhbjogMTtcbiAgICAtbW96LWNvbHVtbi1zcGFuOiAxO1xuICAgIGNvbHVtbi1zcGFuOiAxO1xuICAgIC13ZWJraXQtY29sdW1uLXdpZHRoOiBhdXRvO1xuICAgIC1tb3otY29sdW1uLXdpZHRoOiBhdXRvO1xuICAgIGNvbHVtbi13aWR0aDogYXV0bztcbiAgICBmb250LWZlYXR1cmUtc2V0dGluZ3M6IG5vcm1hbDtcbiAgICBvdmVyZmxvdy14OiB2aXNpYmxlO1xuICAgIG92ZXJmbG93LXk6IHZpc2libGU7XG4gICAgLXdlYmtpdC1oeXBoZW5zOiBtYW51YWw7XG4gICAgLW1vei1oeXBoZW5zOiBtYW51YWw7XG4gICAgaHlwaGVuczogbWFudWFsO1xuICAgIC13ZWJraXQtcGVyc3BlY3RpdmU6IG5vbmU7XG4gICAgLW1vei1wZXJzcGVjdGl2ZTogbm9uZTtcbiAgICAtbXMtcGVyc3BlY3RpdmU6IG5vbmU7XG4gICAgLW8tcGVyc3BlY3RpdmU6IG5vbmU7XG4gICAgcGVyc3BlY3RpdmU6IG5vbmU7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZS1vcmlnaW46IDUwJSA1MCU7XG4gICAgLW1vei1wZXJzcGVjdGl2ZS1vcmlnaW46IDUwJSA1MCU7XG4gICAgLW1zLXBlcnNwZWN0aXZlLW9yaWdpbjogNTAlIDUwJTtcbiAgICAtby1wZXJzcGVjdGl2ZS1vcmlnaW46IDUwJSA1MCU7XG4gICAgcGVyc3BlY3RpdmUtb3JpZ2luOiA1MCUgNTAlO1xuICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAtbW96LWJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgLW1zLWJhY2tmYWNlLXZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgLW8tYmFja2ZhY2UtdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIHRleHQtc2hhZG93OiBub25lO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDBzIGVhc2UgMHM7XG4gICAgdHJhbnNpdGlvbjogYWxsIDBzIGVhc2UgMHM7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7XG4gICAgLW1vei10cmFuc2Zvcm06IG5vbmU7XG4gICAgLW1zLXRyYW5zZm9ybTogbm9uZTtcbiAgICAtby10cmFuc2Zvcm06IG5vbmU7XG4gICAgdHJhbnNmb3JtOiBub25lO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIDUwJTtcbiAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7XG4gICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDUwJSA1MCU7XG4gICAgLW8tdHJhbnNmb3JtLW9yaWdpbjogNTAlIDUwJTtcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgNTAlO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBmbGF0O1xuICAgIC1tb3otdHJhbnNmb3JtLXN0eWxlOiBmbGF0O1xuICAgIC1tcy10cmFuc2Zvcm0tc3R5bGU6IGZsYXQ7XG4gICAgLW8tdHJhbnNmb3JtLXN0eWxlOiBmbGF0O1xuICAgIHRyYW5zZm9ybS1zdHlsZTogZmxhdDtcbiAgICB3b3JkLWJyZWFrOiBub3JtYWw7XG4gIH1cblxuICAucWMtY21wLWNsZWFuc2xhdGUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoMyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGg1LFxuICAucWMtY21wLWNsZWFuc2xhdGUgcCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGgxLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBkdCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGg2LFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBmb3JtLFxuICAucWMtY21wLWNsZWFuc2xhdGUgb3B0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgcHJlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGl2LFxuICAucWMtY21wLWNsZWFuc2xhdGUgaDIsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBjYXB0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaDQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFkZHJlc3MsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBibG9ja3F1b3RlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgZGQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBmaWVsZHNldCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhyLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYXJ0aWNsZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGRpYWxvZyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGZpZ3VyZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGZvb3RlcixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhlYWRlcixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhncm91cCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBuYXYsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzZWN0aW9uLFxuICAucWMtY21wLWNsZWFuc2xhdGUgYXVkaW8sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB2aWRlbyxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFkZHJlc3MsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBibG9ja3F1b3RlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgY29sZ3JvdXAsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBtYWluLFxuICAucWMtY21wLWNsZWFuc2xhdGUgcHJvZ3Jlc3MsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzdW1tYXJ5IHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgaDEsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoMixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGgzLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaDQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoNSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGg2IHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgaDEge1xuICAgIGZvbnQtc2l6ZTogMmVtO1xuICAgIHBhZGRpbmc6IDAuNjdlbSAwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoMiB7XG4gICAgZm9udC1zaXplOiAxLjVlbTtcbiAgICBwYWRkaW5nOiAwLjgzZW0gMDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgaDMge1xuICAgIGZvbnQtc2l6ZTogMS4xN2VtO1xuICAgIHBhZGRpbmc6IDAuODNlbSAwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBoNCB7XG4gICAgZm9udC1zaXplOiAxZW07XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGg1IHtcbiAgICBmb250LXNpemU6IDAuODNlbTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgcCB7XG4gICAgbWFyZ2luOiAxZW0gMDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgdGFibGUge1xuICAgIGRpc3BsYXk6IHRhYmxlO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0aGVhZCB7XG4gICAgZGlzcGxheTogdGFibGUtaGVhZGVyLWdyb3VwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0Ym9keSB7XG4gICAgZGlzcGxheTogdGFibGUtcm93LWdyb3VwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0Zm9vdCB7XG4gICAgZGlzcGxheTogdGFibGUtZm9vdGVyLWdyb3VwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0ciB7XG4gICAgZGlzcGxheTogdGFibGUtcm93O1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0aCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHRkIHtcbiAgICBkaXNwbGF5OiB0YWJsZS1jZWxsO1xuICAgIHBhZGRpbmc6IDJweDtcbiAgfVxuXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHtcbiAgICBtYXJnaW46IDFlbSAwO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBsaSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHVsIGxpLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdWwgdWwgdWwgbGksXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCBsaSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG9sIG9sIGxpLFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgb2wgb2wgbGksXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBvbCBvbCBsaSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHVsIG9sIGxpLFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgdWwgdWwgbGksXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCBvbCB1bCBsaSB7XG4gICAgbGlzdC1zdHlsZS1wb3NpdGlvbjogaW5zaWRlO1xuICAgIG1hcmdpbi10b3A6IDAuMDhlbTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgb2wsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCBvbCBvbCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdWwgdWwgdWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG9sIHVsIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgb2wgdWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBvbCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIG9sIG9sLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdWwgdWwgb2wge1xuICAgIHBhZGRpbmctbGVmdDogNDBweDtcbiAgICBtYXJnaW46IDA7XG4gIH1cblxuICAucWMtY21wLWNsZWFuc2xhdGUgbmF2IHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgbmF2IG9sIHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgbWVudSB7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBkaXNjO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCB7XG4gICAgbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgbWVudSB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG9sIG1lbnUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBtZW51LFxuICAucWMtY21wLWNsZWFuc2xhdGUgbWVudSBtZW51IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IGNpcmNsZTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgb2wgdWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCB1bCB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG9sIG1lbnUgdWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBvbCBvbCBtZW51LFxuICAucWMtY21wLWNsZWFuc2xhdGUgb2wgdWwgbWVudSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG9sIG1lbnUgbWVudSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIG9sIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdWwgdWwgdWwsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBtZW51IHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdWwgb2wgbWVudSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHVsIHVsIG1lbnUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB1bCBtZW51IG1lbnUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBtZW51IG9sIHVsLFxuICAucWMtY21wLWNsZWFuc2xhdGUgbWVudSB1bCB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUgbWVudSB1bCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUgb2wgbWVudSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUgdWwgbWVudSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUgbWVudSBtZW51IHtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgbGkge1xuICAgIGRpc3BsYXk6IGxpc3QtaXRlbTtcbiAgICBtaW4taGVpZ2h0OiBhdXRvO1xuICAgIG1pbi13aWR0aDogYXV0bztcbiAgICBwYWRkaW5nLWxlZnQ6IDIwcHg7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN0cm9uZyB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGVtIHtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGtiZCxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHNhbXAsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBjb2RlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgcHJlIHtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBhIHtcbiAgICBjb2xvcjogYmx1ZTtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgYTp2aXNpdGVkIHtcbiAgICBjb2xvcjogIzUyOTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgYSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGEgKixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdzdWJtaXRcJ10sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpbnB1dFt0eXBlPVwnYnV0dG9uXCddLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXRbdHlwZT1cJ3JhZGlvXCddLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXRbdHlwZT1cJ2NoZWNrYm94XCddLFxuICAucWMtY21wLWNsZWFuc2xhdGUgc2VsZWN0LFxuICAucWMtY21wLWNsZWFuc2xhdGUgYnV0dG9uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGJ1dHRvbixcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdzdWJtaXRcJ10ge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAycHggNnB4IDNweDtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjtcbiAgICBmb250LXNpemU6IHNtYWxsO1xuICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgIGNvbG9yOiBidXR0b250ZXh0O1xuICAgIGJvcmRlcjogMXB4ICNhNmE2YTYgc29saWQ7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBmaWx0ZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdXRsaW5lOiBpbml0aWFsO1xuXG4gICAgJjpmb2N1cyB7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggI2ZmZmZmZiwgMCAwIDNweCA1cHggIzIwNmRjNTtcbiAgICAgIG91dGxpbmU6IDJweCBkb3R0ZWQgdHJhbnNwYXJlbnQ7XG4gICAgICBvdXRsaW5lLW9mZnNldDogMnB4O1xuICAgIH1cbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgYnV0dG9uOmFjdGl2ZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdzdWJtaXRcJ106YWN0aXZlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXRbdHlwZT1cJ2J1dHRvblwnXTphY3RpdmUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBidXR0b246YWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgYnV0dG9uIHtcbiAgICBwYWRkaW5nOiAxcHggNnB4IDJweCA2cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdoaWRkZW5cJ10ge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAucWMtY21wLWNsZWFuc2xhdGUgdGV4dGFyZWEge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgcGFkZGluZzogMnB4O1xuICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgd29yZC13cmFwOiBicmVhay13b3JkO1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG4gICAgbGluZS1oZWlnaHQ6IDEzcHg7XG4gICAgcmVzaXplOiBib3RoO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzZWxlY3QsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSB0ZXh0YXJlYSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0IHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzZWxlY3Qge1xuICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICBmb250LWZhbWlseTogaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHRleHRhcmVhOmZvY3VzLFxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXQ6Zm9jdXMge1xuICAgIG91dGxpbmU6IGF1dG8gNXB4IC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtcbiAgICBvdXRsaW5lOiBpbml0aWFsO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpbnB1dFt0eXBlPVwndGV4dFwnXSB7XG4gICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgcGFkZGluZzogMXB4O1xuICAgIGZvbnQtZmFtaWx5OiBpbml0aWFsO1xuICAgIGZvbnQtc2l6ZTogc21hbGw7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdjaGVja2JveFwnXSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdyYWRpb1wnXSB7XG4gICAgYm9yZGVyOiAxcHggIzJiMmIyYiBzb2xpZDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdjaGVja2JveFwnXSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGlucHV0W3R5cGU9XCdyYWRpb1wnXSB7XG4gICAgb3V0bGluZTogaW5pdGlhbDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXRbdHlwZT1cJ3JhZGlvXCddIHtcbiAgICBtYXJnaW46IDJweCAycHggM3B4IDJweDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgYWJiclt0aXRsZV0sXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBhY3JvbnltW3RpdGxlXSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGRmblt0aXRsZV0ge1xuICAgIGN1cnNvcjogaGVscDtcbiAgICBib3JkZXItYm90dG9tLXdpZHRoOiAxcHg7XG4gICAgYm9yZGVyLWJvdHRvbS1zdHlsZTogZG90dGVkO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpbnMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjk7XG4gICAgY29sb3I6IGJsYWNrO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBkZWwge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBibG9ja3F1b3RlLFxuICAucWMtY21wLWNsZWFuc2xhdGUgcSB7XG4gICAgcXVvdGVzOiBub25lO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBibG9ja3F1b3RlOmJlZm9yZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGJsb2NrcXVvdGU6YWZ0ZXIsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBxOmJlZm9yZSxcbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHE6YWZ0ZXIsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBsaTpiZWZvcmUsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBsaTphZnRlciB7XG4gICAgY29udGVudDogXCdcJztcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgaW5wdXQsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzZWxlY3Qge1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIH1cblxuICAucWMtY21wLWNsZWFuc2xhdGUgdGFibGUge1xuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gICAgYm9yZGVyLXNwYWNpbmc6IDA7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGhyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBoZWlnaHQ6IDFweDtcbiAgICBib3JkZXI6IDA7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNjY2M7XG4gICAgbWFyZ2luOiAxZW0gMDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgKltkaXI9XCdydGxcJ10ge1xuICAgIGRpcmVjdGlvbjogcnRsO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBtYXJrIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY5O1xuICAgIGNvbG9yOiBibGFjaztcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIG1lbnUge1xuICAgIHBhZGRpbmctbGVmdDogNDBweDtcbiAgICBwYWRkaW5nLXRvcDogOHB4O1xuICB9XG5cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIFtoaWRkZW5dLFxuICAucWMtY21wLWNsZWFuc2xhdGUgdGVtcGxhdGUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIGFiYnJbdGl0bGVdIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggZG90dGVkO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzdWIsXG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBzdXAge1xuICAgIGZvbnQtc2l6ZTogNzUlO1xuICAgIGxpbmUtaGVpZ2h0OiAwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN1cCB7XG4gICAgdG9wOiAtMC41ZW07XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHN1YiB7XG4gICAgYm90dG9tOiAtMC4yNWVtO1xuICB9XG4gIC5xYy1jbXAtY2xlYW5zbGF0ZSBpbWcge1xuICAgIGJvcmRlcjogMDtcbiAgfVxuICAucWMtY21wLWNsZWFuc2xhdGUgZmlndXJlIHtcbiAgICBtYXJnaW46IDA7XG4gIH1cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHRleHRhcmVhIHtcbiAgICBvdmVyZmxvdzogYXV0bztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICB9XG5cbiAgLnFjLWNtcC1jbGVhbnNsYXRlIHtcbiAgICBmb250LXNpemU6IG1lZGl1bTtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBkaXJlY3Rpb246IGx0cjtcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIHRleHQtYWxpZ246IHN0YXJ0O1xuICAgIGZvbnQtZmFtaWx5OiBcJ1RpbWVzIE5ldyBSb21hblwnLCBUaW1lcywgc2VyaWY7XG4gICAgY29sb3I6IGJsYWNrO1xuICAgIGZvbnQtc3R5bGU6IG5vcm1hbDtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBsaXN0LXN0eWxlLXR5cGU6IGRpc2M7XG4gIH1cblxuICAucWMtY21wLWNsZWFuc2xhdGUgcHJlIHtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuICB9XG4nXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFpvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGVhLCBuYSwgdGEsIHJhID0gRXQoWm8oKSk7CiAgICAgICAgICAgICAgICB0KDE0KSwgdCgxNSksIHQoMTYpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZVtlLlRPUF9MRUZUID0gMV0gPSAnVE9QX0xFRlQnLCBlW2UuVE9QX1JJR0hUID0gMl0gPSAnVE9QX1JJR0hUJywgZVtlLkJPVFRPTV9SSUdIVCA9IDNdID0gJ0JPVFRPTV9SSUdIVCcsIGVbZS5CT1RUT01fTEVGVCA9IDRdID0gJ0JPVFRPTV9MRUZUJzsKICAgICAgICAgICAgICAgIH0oZWEgfHwgKGVhID0ge30pKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLllFUyA9ICdZJywgZS5OT1QgPSAnTic7CiAgICAgICAgICAgICAgICB9KG5hIHx8IChuYSA9IHt9KSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5HRFBSID0gJ0dEUFInLCBlLlVTUCA9ICdVU1AnOwogICAgICAgICAgICAgICAgfSh0YSB8fCAodGEgPSB7fSkpOwogICAgICAgICAgICAgICAgdCgxNyk7CiAgICAgICAgICAgICAgICB2YXIgb2EsIGFhLCBpYSwgc2EsIGNhLCBsYSwgdWEsIHBhLCBkYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gZS51aSwgciA9IGUubW9kZSwgbyA9IGcoX2UoQ2EpLCAxKVswXSwgYSA9IHQuY29uc2VudEdyb3VwSGFuZGxlciwgaSA9IHQuc2V0QWxsQ29uc2VudHNUb0J5UGFnZSwgcyA9IHQuZ2V0Q29yZUNvbmZpZygpLCBjID0gdC5nZXRDb3JlVWlMYWJlbHMoKSwgbCA9IHQuZ2V0UHJlbWl1bVVpTGFiZWxzKCksIHUgPSB0LmV2ZW50VHJhY2tlciwgcCA9IGcoZmUodm9pZCAwKSwgMiksIGQgPSBwWzBdLCBmID0gcFsxXSwgbSA9IGcoZmUodm9pZCAwKSwgMiksIGggPSBtWzBdLCB5ID0gbVsxXSwgdiA9IGcoZmUodm9pZCAwKSwgMiksIGIgPSB2WzBdLCBfID0gdlsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gc24ob24uYS5tYXJrKGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbi5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSAyLCBjYS5yZWFkeVByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KHQuZ2V0R1ZMVmVuZG9yc0RhdGEoKSksIF8odC5nZXRHb29nbGVWZW5kb3JzKCkpLCBmKHQuZ2V0Tm9uSWFiRGF0YSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLmRpc3BsYXlHRFBSICYmICFoIHx8ICF0LkdWTFZlbmRvcnNEYXRhSW5pdGlhbGl6ZWQgJiYgby5kaXNwbGF5R0RQUikgJiYgZSgpLCBvLmNoYW5nZWQgJiYgY3IoJ0xhc3QgY2hhbmdlZCAnLmNvbmNhdChvLmNoYW5nZWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBuID0gJycsIHIgPT09IHRhLkdEUFIgJiYgaCAmJiBkICYmIGIgPyBuID0gdG4uY3JlYXRlRWxlbWVudChXbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yZUNvbmZpZzogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVVaUxhYmVsczogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkRhdGE6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JzRGF0YTogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRHcm91cEhhbmRsZXI6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRBbGxDb25zZW50c1RvQnlQYWdlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbWl1bVVpTGFiZWxzOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUcmFja2VyOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlVmVuZG9yczogYgogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHIgPT09IHRhLlVTUCAmJiAobiA9IHRuLmNyZWF0ZUVsZW1lbnQoUW8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVDb25maWc6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVtaXVtVWlMYWJlbHM6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRyYWNrZXI6IHUKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0bi5jcmVhdGVFbGVtZW50KHRuLkZyYWdtZW50LCBudWxsLCB0bi5jcmVhdGVFbGVtZW50KHh0LCB7IHN0eWxlczogcmEgfSksIG4pOwogICAgICAgICAgICAgICAgICAgIH0sIGZhID0gdCgzKSwgbWEgPSB0KDE4KSwgaGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUodGhpcywgZSksIHRoaXMuX2RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVB1cnBvc2VzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVZlbmRvcnM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3Nlczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3Nlczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZmlsdGVyZWRTcGVjaWFsUHVycG9zZXM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmZpbHRlcmVkU3BlY2lhbEZlYXR1cmVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maWx0ZXJlZFB1cnBvc2VzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maWx0ZXJlZEZlYXR1cmVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBxdC5TVEFDS1MsIG8gPSBxdC5TUEVDSUFMX0ZFQVRVUkVTLCBhID0gcXQuU1BFQ0lBTF9QVVJQT1NFUywgaSA9IHF0LkZFQVRVUkVTLCBzID0gbi5zdGFja3MsIGMgPSBuLmZlYXR1cmVzLCBsID0gbi5wdXJwb3NlcywgcCA9IG4udmVuZG9ycywgZCA9IG4uc3BlY2lhbFB1cnBvc2VzLCBmID0gbi5zcGVjaWFsRmVhdHVyZXMsIG0gPSBucih0KSwgaCA9IG0uc3BlY2lhbEZlYXR1cmVzSWRzLCBnID0gbS5zcGVjaWFsUHVycG9zZXNJZHMsIHYgPSBtLmZlYXR1cmVzSWRzLCBfID0gdC5jb3JlQ29uZmlnLCB4ID0gXy5zdGFja3MsIEUgPSBfLnB1Ymxpc2hlclB1cnBvc2VJZHMsIEMgPSBfLnB1Ymxpc2hlclB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RJZHMsIGsgPSBfLnB1Ymxpc2hlckZlYXR1cmVzSWRzLCB3ID0gXy5wdWJsaXNoZXJTcGVjaWFsRmVhdHVyZXNJZHMsIFMgPSBfLnB1Ymxpc2hlclNwZWNpYWxQdXJwb3Nlc0lkcywgTCA9IF8uY29uc2VudFNjb3BlLCBQID0gdC5jb3JlQ29uZmlnLnB1Ymxpc2hlck5hbWUgfHwgdC5jb3JlQ29uZmlnLmNvb2tpZURvbWFpbiB8fCAnJywgVCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3NlczogUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleGlibGVQdXJwb3NlczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdJbnRQdXJwb3NlczogQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlczogdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiBFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHEgPSBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChULnB1cnBvc2VzIHx8IFQubGVnSW50UHVycG9zZXMpICYmIChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJ2aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZpY2UgZ3JvdXAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhMIHx8ICcnKSA/IHEgPSBiKHkoe30sIFAsIFQpLCBwKSA6IGNvbnNvbGUud2FybignWW91IGNhblwndCB1c2UgcHVibGlzaGVyIGxlZ2FsIGJhc2lzIG9uICcuY29uY2F0KEwsICcgY29uc2VudCBzY29wZS4nKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBBID0gdGhpcy5maWx0ZXJWZW5kb3JzKHEsIHQpLCBJID0gQS52ZW5kb3JzLCBPID0gQS5sZWdpdGltYXRlVmVuZG9ycywgTiA9IHRoaXMuZmlsdGVyU3RhY2tzQW5kU3BlY2lhbCh4IHx8IFtdLCByLCBzKS5zdGFja3MsIFIgPSB0aGlzLmZpbHRlclB1cnBvc2VzKGwsIHQpLCBVID0gUi5wdXJwb3NlcywgRCA9IFIubGVnaXRpbWF0ZVB1cnBvc2VzLCBCID0gdGhpcy5maWx0ZXJTdGFja3NBbmRTcGVjaWFsKHYsIGksIGMpLmZlYXR1cmVzLCBqID0gdGhpcy5maWx0ZXJTdGFja3NBbmRTcGVjaWFsKGgsIG8sIGYpLnNwZWNpYWxGZWF0dXJlcywgRiA9IHRoaXMuZmlsdGVyU3RhY2tzQW5kU3BlY2lhbChnLCBhLCBkKS5zcGVjaWFsUHVycG9zZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzOiBOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JzOiBJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZXM6IFUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlczogaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbFB1cnBvc2VzOiBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdpdGltYXRlVmVuZG9yczogTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVB1cnBvc2VzOiBELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmZpbHRlcmVkRmVhdHVyZXM6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZmlsdGVyZWRQdXJwb3NlczogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maWx0ZXJlZFNwZWNpYWxGZWF0dXJlczogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5maWx0ZXJlZFNwZWNpYWxQdXJwb3NlczogZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZpbHRlclZlbmRvcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5yKG4pLCByID0gdC5wdXJwb3NlSWRzLCBvID0gdC5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0SWRzLCBhID0gcXQuVkVORE9SUywgaSA9IHF0LkxFR0lUSU1BVEVfVkVORE9SUywgcyA9IHt9LCBjID0gbi5jb3JlQ29uZmlnLnB1Ymxpc2hlckNvbnNlbnRSZXN0cmljdGlvbklkcyB8fCBbXSwgbCA9IG4uY29yZUNvbmZpZy5wdWJsaXNoZXJMSVJlc3RyaWN0aW9uSWRzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2FdID0ge30sIHNbaV0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW25dLCB1ID0gdC5sZWdJbnRQdXJwb3NlcywgcCA9IHQucHVycG9zZXMsIGQgPSB0LmZsZXhpYmxlUHVycG9zZXMsIGYgPSB0LnNwZWNpYWxQdXJwb3NlcywgbSA9IHQuaWQsIGggPSAhcC5sZW5ndGggJiYgIXUubGVuZ3RoICYmIGYubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUubGVuZ3RoID4gMCAmJiAodS5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaW5jbHVkZXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCB1LnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5pbmNsdWRlcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSAmJiAoc1tpXVtuXSA9IHQpLCAocC5sZW5ndGggPiAwICYmIChwLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pbmNsdWRlcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IHAuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmluY2x1ZGVzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IGgpICYmIChzW2FdW25dID0gdCwgc1thXVtuXS5pc1NwZWNpYWxQdXJwb3Nlc09ubHkgPSBoKSwgZC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgbWEuUHVycG9zZVJlc3RyaWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXJwb3NlSWQgPSBlLCBjLmluY2x1ZGVzKGUpICYmIHUuaW5jbHVkZXMoZSkgJiYgKG4ucmVzdHJpY3Rpb25UeXBlID0gZmEuUmVzdHJpY3Rpb25UeXBlLlJFUVVJUkVfQ09OU0VOVCksIGwuaW5jbHVkZXMoZSkgJiYgcC5pbmNsdWRlcyhlKSAmJiAobi5yZXN0cmljdGlvblR5cGUgPSBmYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9MSSksIHZvaWQgMCAhPT0gbi5yZXN0cmljdGlvblR5cGUgJiYgd2luZG93Ll9fdGNmYXBpKCdzZXRQdWJsaXNoZXJSZXN0cmljdGlvbicsIDIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyKCdTZXR0aW5nIHB1Ymxpc2hlciByZXN0cmljdGlvbiAnLmNvbmNhdChuLnJlc3RyaWN0aW9uVHlwZSwgJyAtIFZlbmRvcjogJykuY29uY2F0KG0sICcgUHVycG9zZTogJykuY29uY2F0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3NlUmVzdHJpY3Rpb246IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3IoJ1JlZ3VsYXIgdmVuZG9ycyBsb2FkZWQ6ICcuY29uY2F0KE9iamVjdC5rZXlzKHNbYV0pLmxlbmd0aCkpLCBjcignTGVnaXRpbWF0ZSB2ZW5kb3JzIGxvYWRlZDogJy5jb25jYXQoT2JqZWN0LmtleXMoc1tpXSkubGVuZ3RoKSksIHNbYV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHNbYV0pKSwgc1tpXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc1tpXSkpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZmlsdGVyUHVycG9zZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uY29yZUNvbmZpZy5jb25zZW50U2NvcGUsIHIgPSBucihuKSwgbyA9IHIucHVycG9zZUlkcywgYSA9IHIucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdElkcywgaSA9IHF0LlBVUlBPU0VTLCBzID0gcXQuTEVHSVRJTUFURV9QVVJQT1NFUywgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY1tpXSA9IHt9LCBjW3NdID0ge30sIG8uZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tpXVtuXSA9IGIoe30sIGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICE9PSBuICYmIChjW3NdW25dID0gYih7fSwgZVtuXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgIWNbaV1bMV0gJiYgKHQgfHwgJycpLmluY2x1ZGVzKCdnbG9iYWwnKSAmJiAoY1tpXVsxXSA9IGIoe30sIGVbMV0pKSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZpbHRlclN0YWNrc0FuZFNwZWNpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltuXSA9IHt9LCBlLmxlbmd0aCAmJiBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbbl1bZV0gPSB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3VwZGF0ZVN0YXR1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFbbl1bZV0uc3RhdHVzID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2RhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCksIGdhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdSh0aGlzLCBlKSwgdGhpcy5fY21wSW5mbyA9IHZvaWQgMCwgdGhpcy5fbm9uSWFiQ29uc2VudHMgPSB2b2lkIDAsIHRoaXMuX3ZlbmRvckNvbnNlbnRzID0gdm9pZCAwLCB0aGlzLl92ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QgPSB2b2lkIDAsIHRoaXMuX3B1cnBvc2VzQ29uc2VudHMgPSB2b2lkIDAsIHRoaXMuX2xlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzID0gdm9pZCAwLCB0aGlzLl9zdGFja3NDb25zZW50cyA9IHZvaWQgMCwgdGhpcy5fc3BlY2lhbFB1cnBvc2VzQ29uc2VudHMgPSB2b2lkIDAsIHRoaXMuX3NwZWNpYWxGZWF0dXJlc0NvbnNlbnRzID0gdm9pZCAwLCB0aGlzLl9nb29nbGVDb25zZW50cyA9IHZvaWQgMCwgdGhpcy5fcmVwcm9tcHREYXRhID0gdm9pZCAwLCB0aGlzLnNlc3Npb25JZCA9IHZvaWQgMCwgdGhpcy5hbGxDb25zZW50cyA9IHZvaWQgMCwgdGhpcy5jb25zZW50UGFnZSA9IHZvaWQgMCwgdGhpcy5kaXNwbGF5VHlwZSA9IHZvaWQgMCwgdGhpcy5fbm9uSWFiVmVuZG9yc0luaXRpYWxpemVkID0gITEsIHRoaXMuX2dvb2dsZVZlbmRvcnNJbml0aWFsaXplZCA9ICExLCB0aGlzLl9HVkxWZW5kb3JzRGF0YUluaXRpYWxpemVkID0gITEsIHRoaXMuX25vbklhYkNvbnNlbnRzID0ge30sIHRoaXMuX3ZlbmRvckNvbnNlbnRzID0ge30sIHRoaXMuX3B1cnBvc2VzQ29uc2VudHMgPSB7fSwgdGhpcy5fbGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9zdGFja3NDb25zZW50cyA9IHt9LCB0aGlzLl9zcGVjaWFsUHVycG9zZXNDb25zZW50cyA9IHt9LCB0aGlzLl92ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QgPSB7fSwgdGhpcy5fc3BlY2lhbEZlYXR1cmVzQ29uc2VudHMgPSB7fSwgdGhpcy5fZ29vZ2xlQ29uc2VudHMgPSB7fSwgdGhpcy5jb25zZW50R3JvdXBIYW5kbGVyID0gdGhpcy5jb25zZW50R3JvdXBIYW5kbGVyLmJpbmQodGhpcyksIHRoaXMuaGFuZGxlU2V0Q29uc2VudEluZm9DYWxsYmFjayA9IHRoaXMuaGFuZGxlU2V0Q29uc2VudEluZm9DYWxsYmFjay5iaW5kKHRoaXMpLCB0aGlzLnNldEFsbENvbnNlbnRzVG9CeVBhZ2UgPSB0aGlzLnNldEFsbENvbnNlbnRzVG9CeVBhZ2UuYmluZCh0aGlzKSwgdGhpcy5hbGxDb25zZW50cyA9ICEwLCB0aGlzLnNlc3Npb25JZCA9ICcnLCB0aGlzLmRpc3BsYXlUeXBlID0ga3QuQ0hBTkdFX09GX0NPTlNFTlQsIHRoaXMuX2NtcEluZm8gPSBuZXcgaGEoY2EsIHNhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2V0Q29yZUNvbmZpZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNhLmNvcmVDb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRQcmVtaXVtVWlMYWJlbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYS5wcmVtaXVtVWlMYWJlbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRDb3JlVWlMYWJlbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYS5jb3JlVWlMYWJlbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXREaXNwbGF5VHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheVR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXROb25JYWJEYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHd0Lk5PTl9JQUIsIG4gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSAnb2JqZWN0JyA9PT0gdHlwZW9mIHNhLm5vbklhYlZlbmRvcnNJbmZvID8gT2JqZWN0LmtleXMoc2Eubm9uSWFiVmVuZG9yc0luZm8pLmxlbmd0aCA+IDAgOiAhIXNhLnByZW1pdW1Qcm9wZXJ0aWVzLm5vbklhYlZlbmRvckxpc3RVcmwsIHRoaXMucG9wdWxhdGVDb25zZW50cyghdGhpcy5fbm9uSWFiVmVuZG9yc0luaXRpYWxpemVkLCBlLCB1YSwgbGEpLCB0aGlzLl9ub25JYWJWZW5kb3JzSW5pdGlhbGl6ZWQgfHwgKHRoaXMuX25vbklhYlZlbmRvcnNJbml0aWFsaXplZCA9ICEwKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yczogdWEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldEdvb2dsZVZlbmRvcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gd3QuR09PR0xFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKCF0aGlzLl9nb29nbGVWZW5kb3JzSW5pdGlhbGl6ZWQsIGUsIHBhLCBsYSksIHRoaXMuX2dvb2dsZVZlbmRvcnNJbml0aWFsaXplZCB8fCAodGhpcy5fZ29vZ2xlVmVuZG9yc0luaXRpYWxpemVkID0gITApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VuYWJsZWQ6IHNhLmNvcmVDb25maWcuZ29vZ2xlRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdnZXRHVkxWZW5kb3JzRGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB3dC5WRU5ET1JTLCBuID0gd3QuTEVHSVRJTUFURV9WRU5ET1JTLCB0ID0gd3QuTEVHSVRJTUFURV9QVVJQT1NFUywgciA9IHd0LlBVUlBPU0VTLCBvID0gd3QuU1BFQ0lBTF9GRUFUVVJFUywgYSA9IHd0LlNUQUNLUywgaSA9ICF0aGlzLl9HVkxWZW5kb3JzRGF0YUluaXRpYWxpemVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGksIGUsIHRoaXMuX2NtcEluZm8uZGF0YS52ZW5kb3JzLCBsYSksIHRoaXMucG9wdWxhdGVDb25zZW50cyhpLCByLCB0aGlzLl9jbXBJbmZvLmRhdGEucHVycG9zZXMsIGxhKSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGksIG8sIHRoaXMuX2NtcEluZm8uZGF0YS5zcGVjaWFsRmVhdHVyZXMsIGxhKSwgdGhpcy5wb3B1bGF0ZUNvbnNlbnRzKGksIG4sIHRoaXMuX2NtcEluZm8uZGF0YS5sZWdpdGltYXRlVmVuZG9ycywgbGEpLCB0aGlzLnBvcHVsYXRlQ29uc2VudHMoaSwgdCwgdGhpcy5fY21wSW5mby5kYXRhLmxlZ2l0aW1hdGVQdXJwb3NlcywgbGEpLCB0aGlzLnBvcHVsYXRlQ29uc2VudHMoITAsIGEsIHRoaXMuX2NtcEluZm8uZGF0YS5zdGFja3MsIGxhKSwgdGhpcy5wb3B1bGF0ZVN0YWNrc0xhYmVscyh0aGlzLl9jbXBJbmZvLmRhdGEuc3RhY2tzKSwgdGhpcy5fR1ZMVmVuZG9yc0RhdGFJbml0aWFsaXplZCA9ICEwLCB0aGlzLl9jbXBJbmZvLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdwb3B1bGF0ZVN0YWNrc0xhYmVscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcywgdCA9IHNhLmNvcmVVaUxhYmVscywgciA9IHQub25MYWJlbCwgbyA9IHQub2ZmTGFiZWwsIGEgPSB0Lm11bHRpTGFiZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBlW2ldLCBjID0gcy5wdXJwb3Nlcy5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwgbi5fcHVycG9zZXNDb25zZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMSksIGwgPSAhIXMuc3BlY2lhbEZlYXR1cmVzICYmIHMuc3BlY2lhbEZlYXR1cmVzLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSB8fCBuLl9zcGVjaWFsRmVhdHVyZXNDb25zZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMSksIHUgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdGhpcy5fc3RhY2tzQ29uc2VudHNbaV0gPyByIDogYyB8fCBsID8gYSA6IG8sIHMuc3RhdGVMYWJlbCA9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NldEFsbENvbnNlbnRzVG8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCA9IHRoaXMuZ2V0Q29uc2VudHNUb0l0ZXJhdGUoKSwgciA9IHQub2JqZWN0c1RvSXRlcmF0ZSwgbyA9IHQuR1ZMT2JqZWN0c1RvSXRlcmF0ZSwgYSA9IGwocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEucygpOyAhKG4gPSBhLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW3NdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5lKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XS5zdGF0dXMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXModGhpcy5fY21wSW5mby5kYXRhLnN0YWNrcykubGVuZ3RoICYmICh0aGlzLnVwZGF0ZVN0YWNrc0NvbnNlbnQoKSwgdGhpcy5wb3B1bGF0ZVN0YWNrc0xhYmVscyh0aGlzLl9jbXBJbmZvLmRhdGEuc3RhY2tzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZXRBbGxDb25zZW50c1RvQnlQYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG8sIGEgPSBDdC5BQ0NFUFRfQUxMX1BVUlBPU0VTLCBpID0gQ3QuUkVKRUNUX0FMTF9QVVJQT1NFUywgcyA9IEN0LkFDQ0VQVF9BTExfVkVORE9SUywgYyA9IEN0LlJFSkVDVF9BTExfVkVORE9SUywgbCA9IEN0LkFDQ0VQVF9BTExfTEVHSVRJTUFURSwgdSA9IEN0Lk9CSkVDVF9BTExfTEVHSVRJTUFURSwgcCA9IHRoaXMuZ2V0Q29uc2VudHNUb0l0ZXJhdGUobiksIGQgPSBwLm9iamVjdHNUb0l0ZXJhdGUsIGYgPSBwLkdWTE9iamVjdHNUb0l0ZXJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gYSwgciA9IGksIG8gPSAnYWxsUHVycG9zZXMtJy5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHMsIHIgPSBjLCBvID0gJ2FsbFZlbmRvcnMtJy5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGwsIHIgPSB1LCBvID0gJ2FsbExlZ2l0aW1hdGVzLScuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRUcmFja2VyKGUgPyB0IDogciwgJ2NsaWNrJyksIGQuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bdF0gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZi5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XS5zdGF0dXMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgRWEgJiYgRWEoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RPR0dMRV9DSEFOR0UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NvbnNlbnRHcm91cEhhbmRsZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gc24ob24uYS5tYXJrKGZ1bmN0aW9uIGUobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb24uYS53cmFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLnByZXYgPSBlLm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhIGluICh0aGlzLmFsbENvbnNlbnRzID0gdCwgdGhpcy5jb25zZW50UGFnZSA9IG4sIHZvaWQgMCAhPT0gdCAmJiB0aGlzLnNldEFsbENvbnNlbnRzVG8odCksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzOiB0aGlzLnZlbmRvckNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJwb3Nlc0NvbnNlbnRzOiB0aGlzLnB1cnBvc2VzQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxGZWF0dXJlczogdGhpcy5zcGVjaWFsRmVhdHVyZXNDb25zZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0OiB0aGlzLnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHM6IHRoaXMubGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbklhYkNvbnNlbnRzOiB0aGlzLm5vbklhYkNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGVDb25zZW50czogdGhpcy5fZ29vZ2xlQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTY3JlZW46IHRoaXMuY29uc2VudFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbENvbnNlbnRzOiB0aGlzLmFsbENvbnNlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IHRoaXMuX2NtcEluZm8uZGF0YS52ZW5kb3JzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW2FdLmlzU3BlY2lhbFB1cnBvc2VzT25seSAmJiAoZGVsZXRlIHIudmVuZG9yQ29uc2VudHNbYV0sIHIudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0W2FdID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fdGNmYXBpKCdzZXRDb25zZW50SW5mbycsIDIsIHRoaXMuaGFuZGxlU2V0Q29uc2VudEluZm9DYWxsYmFjaywgciksIHRoaXMudG9nZ2xlRGlzcGxheVVpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd0b2dnbGVEaXNwbGF5VWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYSAmJiBFYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnVE9HR0xFX0RJU1BMQVknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZSB8fCB7IHJlZ3VsYXRpb246ICdHRFBSJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbm90aWZ5VWlDbG9zZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX190Y2ZhcGkoJ25vdGlmeVVpU3RhdGUnLCAyLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ3VsYXRpb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldENvbnNlbnRzVG9JdGVyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogMCwgbiA9IFtdLCB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzID09PSBlID8gKG4ucHVzaC5hcHBseShuLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sZWdpdGltYXRlUHVycG9zZXNDb25zZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdC5wdXNoLmFwcGx5KHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NtcEluZm8uZGF0YS5sZWdpdGltYXRlVmVuZG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NtcEluZm8uZGF0YS5sZWdpdGltYXRlUHVycG9zZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpIDogKG4ucHVzaC5hcHBseShuLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wdXJwb3Nlc0NvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhY2tzQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zcGVjaWFsRmVhdHVyZXNDb25zZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlbmRvckNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm9uSWFiQ29uc2VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nb29nbGVDb25zZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdC5wdXNoLmFwcGx5KHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NtcEluZm8uZGF0YS5wdXJwb3NlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NtcEluZm8uZGF0YS5zcGVjaWFsRmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbXBJbmZvLmRhdGEudmVuZG9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdGhpcy5fbm9uSWFiVmVuZG9yc0luaXRpYWxpemVkICYmIHVhICYmIHVhLmxlbmd0aCAmJiB0LnB1c2godWEpLCB0aGlzLl9nb29nbGVWZW5kb3JzSW5pdGlhbGl6ZWQgJiYgcGEgJiYgcGEubGVuZ3RoICYmIHQucHVzaChwYSkpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzVG9JdGVyYXRlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZMT2JqZWN0c1RvSXRlcmF0ZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnaXNNYW51YWxseVJlamVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZ2V0Q29uc2VudHNUb0l0ZXJhdGUoKSwgbiA9IGUub2JqZWN0c1RvSXRlcmF0ZSwgdCA9IGUuR1ZMT2JqZWN0c1RvSXRlcmF0ZSwgciA9IG4uZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhlKS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyA9IHQuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhlKS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IGUuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdoYW5kbGVTZXRDb25zZW50SW5mb0NhbGxiYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBDdC5BQ0NFUFRfQUxMLCB0ID0gQ3QuU0FWRV9BTkRfRVhJVCwgciA9IEN0LlJFSkVDVF9BTEwsIG8gPSBPdC5BQ0NFUFQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcHJvbXB0RGF0YSA9IGUsIHRoaXMuZXZlbnRUcmFja2VyKHZvaWQgMCAhPT0gdGhpcy5hbGxDb25zZW50cyA/IHRoaXMuYWxsQ29uc2VudHMgPyBuIDogciA6IHQsICdjbGljaycpLCBhYS5zZW5kRG9uZUxvZyh0aGlzLmFsbENvbnNlbnRzLCBlLmV1Y29uc2VudCwgZS5ub25JYWJWZW5kb3JDb25zZW50KSwgbyA9IHZvaWQgMCAhPT0gdGhpcy5hbGxDb25zZW50cyA/IHRoaXMuYWxsQ29uc2VudHMgPyBPdC5BQ0NFUFQgOiBPdC5SRUpFQ1QgOiB0aGlzLmlzTWFudWFsbHlSZWplY3RlZCgpID8gT3QuUkVKRUNUIDogT3QuQUNDRVBULCB0cihzYS5jb3JlQ29uZmlnLmlzQU1QLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBBdC5DT05TRU5UX1JFU1BPTlNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbzogZS5ldWNvbnNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50TWV0YWRhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsQ29uc2VudDogZS5nb29nbGVDb29raWVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U3RyaW5nVHlwZTogSXQuR0RQUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3BvcHVsYXRlQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbiwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSA9IHd0Lk5PTl9JQUIsIGkgPSB3dC5QVVJQT1NFUywgcyA9IHd0LkxFR0lUSU1BVEVfUFVSUE9TRVMsIGMgPSB3dC5MRUdJVElNQVRFX1ZFTkRPUlMsIHUgPSB3dC5WRU5ET1JTLCBwID0gd3QuU1BFQ0lBTF9GRUFUVVJFUywgZCA9IHd0LlNUQUNLUywgZiA9IHd0LkdPT0dMRSwgbSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICdfbm9uSWFiQ29uc2VudHMnLCBtID0gJ25vbklhYkNvbnNlbnRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gJ192ZW5kb3JDb25zZW50cycsIG0gPSAndmVuZG9yQ29uc2VudHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnX3B1cnBvc2VzQ29uc2VudHMnLCBtID0gJ3B1cnBvc2VzQ29uc2VudHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnX2xlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzJywgbSA9ICdsZWdpdGltYXRlUHVycG9zZXNDb25zZW50cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICdfdmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0JywgbSA9ICd2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnX3NwZWNpYWxGZWF0dXJlc0NvbnNlbnRzJywgbSA9ICdzcGVjaWFsRmVhdHVyZXMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAnX3N0YWNrc0NvbnNlbnRzJywgbSA9ICdwdXJwb3Nlc0NvbnNlbnRzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gJ19nb29nbGVDb25zZW50cycsIG0gPSAnZ29vZ2xlQ29uc2VudHMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSByW21dLmhhc0Nvb2tpZSwgZyA9IG4gPT09IHMgfHwgbiA9PT0gYyB8fCAnb24nID09PSBzYS5jb3JlQ29uZmlnLmRlZmF1bHRUb2dnbGVWYWx1ZSwgeSA9ICFoIHx8IG4gPT09IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09PSBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2LCBiID0gbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGIucygpOyAhKHYgPSBiLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfID0gdi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB5ID8gZyA6IHJbbV1bXy5pZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvXVtfLmlkXSA9IEJvb2xlYW4oeCksIF8uc3RhdHVzID0gQm9vbGVhbih4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uc3RhdHVzID0gdGhpc1tvXVtfLmlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5lKFQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuID09PSBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFLCBDID0gbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMucygpOyAhKEUgPSBDLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gRS52YWx1ZSwgdyA9IHBhcnNlSW50KGsuaWQsIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSB5ID8gZyA6IHJbbV1bd107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvXVt3XSA9IFMsIGsuc3RhdHVzID0gUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuc3RhdHVzID0gdGhpc1tvXVt3XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5lKFQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMuZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIEwgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUCA9IHkgPyBnIDogclttXVtMXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvXVtMXSA9IFAsIHRbTF0uc3RhdHVzID0gUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtMXS5zdGF0dXMgPSB0aGlzW29dW0xdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PT0gZCAmJiBoICYmIHRoaXMudXBkYXRlU3RhY2tzQ29uc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdoYW5kbGVDb25zZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG8sIGEsIGkgPSBDdC5WRU5ET1IsIHMgPSBDdC5QVVJQT1NFLCBjID0gQ3QuTEVHSVRJTUFURV9QVVJQT1NFLCBsID0gQ3QuTk9OX0lBQl9WRU5ET1IsIHUgPSBDdC5TUEVDSUFMX0ZFQVRVUkUsIHAgPSBDdC5TVEFDSywgZCA9IEN0LkxFR0lUSU1BVEVfVkVORE9SLCBmID0gQ3QuR09PR0xFLCBtID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0Lk5PTl9JQUI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gJ19ub25JYWJDb25zZW50cycsIGEgPSB1YSwgciA9ICcnLmNvbmNhdChsLCAnXycpLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LlZFTkRPUlM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gJ192ZW5kb3JDb25zZW50cycsIG8gPSAndmVuZG9ycycsIHIgPSAnJy5jb25jYXQoaSwgJ18nKS5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3dC5QVVJQT1NFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAnX3B1cnBvc2VzQ29uc2VudHMnLCBvID0gJ3B1cnBvc2VzJywgciA9ICcnLmNvbmNhdChzLCAnXycpLmNvbmNhdChlKSwgbSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuTEVHSVRJTUFURV9QVVJQT1NFUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAnX2xlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzJywgbyA9ICdsZWdpdGltYXRlUHVycG9zZXMnLCByID0gJycuY29uY2F0KGMsICdfJykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuTEVHSVRJTUFURV9WRU5ET1JTOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICdfdmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0JywgbyA9ICdsZWdpdGltYXRlVmVuZG9ycycsIHIgPSAnJy5jb25jYXQoZCwgJ18nKS5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3dC5TUEVDSUFMX0ZFQVRVUkVTOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICdfc3BlY2lhbEZlYXR1cmVzQ29uc2VudHMnLCBvID0gJ3NwZWNpYWxGZWF0dXJlcycsIHIgPSAnJy5jb25jYXQodSwgJ18nKS5jb25jYXQoZSksIG0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LlNQRUNJQUxfUFVSUE9TRVM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gJ19zcGVjaWFsUHVycG9zZXNDb25zZW50cycsIG8gPSAnc3BlY2lhbFB1cnBvc2VzJywgciA9ICcnLmNvbmNhdCh1LCAnXycpLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHd0LlNUQUNLUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAnX3N0YWNrc0NvbnNlbnRzJywgbyA9ICdzdGFja3MnLCByID0gJycuY29uY2F0KHAsICdfJykuY29uY2F0KGUpLCBtID0gITAsIHRoaXMuaGFuZGxlU3RhY2tDb25zZW50KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugd3QuR09PR0xFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICdfZ29vZ2xlQ29uc2VudHMnLCBhID0gcGEsIHIgPSAnJy5jb25jYXQoZiwgJ18nKS5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1t0XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAhdGhpc1t0XVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcoYS5maWx0ZXIoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaWQgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIDEpWzBdLnN0YXR1cyA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY21wSW5mby51cGRhdGVTdGF0dXMoZSwgbywgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3RdW2VdID0gaCwgdGhpcy5ldmVudFRyYWNrZXIociwgdGhpc1t0XVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fY21wSW5mby5kYXRhLnN0YWNrcykubGVuZ3RoICYmIG0gJiYgdGhpcy5wb3B1bGF0ZVN0YWNrc0xhYmVscyh0aGlzLl9jbXBJbmZvLmRhdGEuc3RhY2tzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xpbmtWZW5kb3JzVG9QdXJwb3NlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLCBuID0gY2EudmVuZG9ycywgdCA9IE9iamVjdC5rZXlzKHRoaXMuX3B1cnBvc2VzQ29uc2VudHMpLmZpbHRlcihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZS5fcHVycG9zZXNDb25zZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID0gZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXS5wdXJwb3Nlcy5pbmNsdWRlcyhwYXJzZUludCh0LCAxMCkpICYmIChlLl92ZW5kb3JDb25zZW50c1tyXSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlbmRvckNvbnNlbnRzW29dID0gITEsIHQubGVuZ3RoICYmIHIobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsaW5rUHVycG9zZXNUb1ZlbmRvcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcywgbiA9IGNhLnZlbmRvcnMsIHQgPSBPYmplY3Qua2V5cyh0aGlzLl92ZW5kb3JDb25zZW50cykuZmlsdGVyKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlLl92ZW5kb3JDb25zZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID0gT2JqZWN0LmtleXModGhpcy5fcHVycG9zZXNDb25zZW50cykuZmlsdGVyKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlLl9wdXJwb3Nlc0NvbnNlbnRzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGVuZ3RoID8gci5sZW5ndGggfHwgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3RdLnB1cnBvc2VzLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3RdLnB1cnBvc2VzLmluY2x1ZGVzKHIpICYmIChlLl9wdXJwb3Nlc0NvbnNlbnRzW3JdID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlLl9wdXJwb3Nlc0NvbnNlbnRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3B1cnBvc2VzQ29uc2VudHNbbl0gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbGlua0NvbnNlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ19wdXJwb3Nlc0NvbnNlbnRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnX3N0YWNrc0NvbnNlbnRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlua1ZlbmRvcnNUb1B1cnBvc2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnX3ZlbmRvckNvbnNlbnRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlua1B1cnBvc2VzVG9WZW5kb3JzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2hhbmRsZVN0YWNrQ29uc2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gY2Euc3RhY2tzW2VdLCByID0gIXRoaXMuX3N0YWNrc0NvbnNlbnRzW2VdLCBvID0gbCh0LnB1cnBvc2VzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoby5zKCk7ICEobiA9IG8ubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wdXJwb3Nlc0NvbnNlbnRzW2FdID0gciwgdGhpcy5fY21wSW5mby51cGRhdGVTdGF0dXMoYSwgJ3B1cnBvc2VzJywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZSh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNwZWNpYWxGZWF0dXJlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHMgPSBsKHQuc3BlY2lhbEZlYXR1cmVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzLnMoKTsgIShpID0gcy5uKCkpLmRvbmU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gaS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbEZlYXR1cmVzQ29uc2VudHNbY10gPSByLCB0aGlzLl9jbXBJbmZvLnVwZGF0ZVN0YXR1cyhjLCAnc3BlY2lhbEZlYXR1cmVzJywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZSh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3VwZGF0ZVN0YWNrc0NvbnNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0aGlzLl9jbXBJbmZvLmRhdGEuc3RhY2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2NtcEluZm8uZGF0YS5zdGFja3Nbbl0sIHIgPSB0LnB1cnBvc2VzLnJlZHVjZShmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBlLl9wdXJwb3Nlc0NvbnNlbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSwgbyA9ICF0LnNwZWNpYWxGZWF0dXJlc0NvbnNlbnRzIHx8IHQuc3BlY2lhbEZlYXR1cmVzLnJlZHVjZShmdW5jdGlvbiAobiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBlLl9zcGVjaWFsRmVhdHVyZXNDb25zZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXR1cyA9IHIgJiYgbywgdGhpcy5fc3RhY2tzQ29uc2VudHNbbl0gPSB0LnN0YXR1czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZm9ybWF0Q29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50QXJyYXk6IE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcGFyc2VJbnQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSByLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnQ6IGVbcl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiArdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZlbmRvcklkOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkaXNwbGF5Q29uc2VudFVpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDEsIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSAmJiBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHRFBSJyA9PT0gZSA/ICh0aGlzLmRpc3BsYXlUeXBlID0gdCA/IGt0Lk1BTkRBVE9SWSA6IGt0LkNIQU5HRV9PRl9DT05TRU5ULCBFYSAmJiBFYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnUEFHRV9DSEFOR0UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Jbml0OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiAnVVNQJyA9PT0gZSAmJiAodGhpcy5kaXNwbGF5VHlwZSA9IGt0LkNDUEEsIG4gPSAxKSwgdGhpcy50b2dnbGVEaXNwbGF5VWkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhdGlvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWFuZGF0b3J5OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmdlbmVyYXRlU2Vzc2lvbklkKGUpLCB0aGlzLmV2ZW50VHJhY2tlcihDdC5TVEFSVF9PTl9QQUdFLCAnJy5jb25jYXQoZSwgJ18nKS5jb25jYXQobikpLCBhYS5zZW5kSW5pdExvZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZ2VuZXJhdGVTZXNzaW9uSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQvJyksIHQgPSBuZXcgSW50MzJBcnJheSg0KSwgciA9ICcnLmNvbmNhdChlLCAnLScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICgtMSAhPT0gbiA/IG1zQ3J5cHRvIDogY3J5cHRvKS5nZXRSYW5kb21WYWx1ZXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IDQ7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9IHRbb10udG9TdHJpbmcoMzYpLnN1YnN0cmluZygxLCA2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2dldFNlc3Npb25JZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnZXZlbnRUcmFja2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWEucHVzaEV2ZW50KGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbm9uSWFiQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9uSWFiQ29uc2VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vbklhYkNvbnNlbnRzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3ZlbmRvckNvbnNlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZlbmRvckNvbnNlbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92ZW5kb3JDb25zZW50cyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdwdXJwb3Nlc0NvbnNlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3B1cnBvc2VzQ29uc2VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3B1cnBvc2VzQ29uc2VudHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVnaXRpbWF0ZVB1cnBvc2VzQ29uc2VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xlZ2l0aW1hdGVQdXJwb3Nlc0NvbnNlbnRzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3ZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdGFja3NDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFja3NDb25zZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhY2tzQ29uc2VudHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc3BlY2lhbEZlYXR1cmVzQ29uc2VudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3BlY2lhbEZlYXR1cmVzQ29uc2VudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NwZWNpYWxGZWF0dXJlc0NvbnNlbnRzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0dWTFZlbmRvcnNEYXRhSW5pdGlhbGl6ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fR1ZMVmVuZG9yc0RhdGFJbml0aWFsaXplZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2NtcEluZm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY21wSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY21wSW5mbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLCBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2luaXRMYWJlbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gc24ob24uYS5tYXJrKGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbi5hLndyYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gc2EuZ2V0Q3VzdG9tQ29yZVVpTGFiZWxzKCksIHIgPSBzYS5nZXRDdXN0b21QcmVtaXVtVWlMYWJlbHMoKSwgbyA9IHQoNDYpLCAoYSA9IHNhLmNvcmVDb25maWcucHJpdmFjeU1vZGUpICYmIGEuaW5jbHVkZXMoJ0dEUFInKSAmJiAoc2EuY29yZVVpTGFiZWxzID0gYihiKHt9LCBvLmNvcmVVaUxhYmVscyksIG4pKSwgc2EucHJlbWl1bVVpTGFiZWxzID0gYihiKHt9LCBvLnByZW1pdW1VaUxhYmVscyksIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2VuZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgeWEgPSBGci5hLmNyZWF0ZSh7IHhzcmZDb29raWVOYW1lOiBudWxsIH0pLCB2YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUodGhpcywgZSksIHRoaXMudXNlckV2ZW50cyA9IHZvaWQgMCwgdGhpcy51c2VyRXZlbnRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3B1c2hFdmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyKEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMudXNlckV2ZW50cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJycuY29uY2F0KGUsICc6JykuY29uY2F0KG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAncmVzb2x2ZUFjY2VwdGFuY2VTdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUHQuQUNDRVBUX0FMTCwgdCA9IFB0LkFDQ0VQVF9QQVJUSUFMLCByID0gUHQuUkVKRUNULCBvID0gVHQuQUxMX09CSkVDVEVELCBhID0gVHQuTk9ORV9PQkpFQ1RFRCwgaSA9ICdsZWdpdGltYXRlJyA9PT0gZSwgcyA9IGkgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvYS5sZWdpdGltYXRlUHVycG9zZXNDb25zZW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvYS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKSA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKG9hLnB1cnBvc2VzQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob2Euc3BlY2lhbEZlYXR1cmVzQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob2EudmVuZG9yQ29uc2VudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob2Eubm9uSWFiQ29uc2VudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZsYXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgPyBpID8gYSA6IG4gOiBzLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pID8gaSA/IG8gOiByIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NlbmRJbml0TG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHNhLmNvcmVDb25maWcsIG4gPSBlLnF1YW50Y2FzdEFjY291bnRJZCwgdCA9IGUucHVibGlzaGVyTmFtZSwgciA9IGUuaGFzaENvZGUsIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogd2luZG93LmxvY2F0aW9uICE9PSB3aW5kb3cucGFyZW50LmxvY2F0aW9uICYmIGRvY3VtZW50LnJlZmVycmVyID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvKXwoXC8uKiQpL2csICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGRvY3VtZW50LnJlZmVycmVyKSA6IHdpbmRvdy5sb2NhdGlvbi5ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlcjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBJZDogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wVmVyc2lvbjogJzIuJy5jb25jYXQoaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVR5cGU6IG9hLmdldERpc3BsYXlUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbkhhc2hDb2RlOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyhMdC5JTklULCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NlbmROYXZpZ2F0aW9uTG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHsgdXNlckV2ZW50czogdGhpcy51c2VyRXZlbnRzIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXNlckV2ZW50cyA9IFtdLCB0aGlzLmxvZyhMdC5OQVZJR0FUSU9OLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3NlbmREb25lTG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlID8gUHQuQUNDRVBUX0FMTCA6IHRoaXMucmVzb2x2ZUFjY2VwdGFuY2VTdGF0ZSgpLCBhID0gZSA/IFR0Lk5PTkVfT0JKRUNURUQgOiB0aGlzLnJlc29sdmVBY2NlcHRhbmNlU3RhdGUoJ2xlZ2l0aW1hdGUnKSwgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRXZlbnRzOiB0aGlzLnVzZXJFdmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5jZVN0YXRlOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdGlvblN0YXRlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjRGF0YTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25JYWJDb25zZW50RGF0YTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3BEYXRhOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJFdmVudHMgPSBbXSwgdGhpcy5sb2coTHQuRE9ORSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzZW5kRG9uZUxvZ1VzcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckV2ZW50czogdGhpcy51c2VyRXZlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0YW5jZVN0YXRlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNwRGF0YTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJFdmVudHMgPSBbXSwgdGhpcy5sb2coTHQuRE9ORSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gYihiKHt9LCBuKSwge30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRpbWVzdGFtcDogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25UeXBlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBvYS5nZXRTZXNzaW9uSWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YS5nZXQoJycuY29uY2F0KCdodHRwczovL2F1ZGl0LXRjZnYyLnF1YW50Y2FzdC5tZ3IuY29uc2Vuc3Uub3JnJywgJy8/bG9nPScpLmNvbmNhdCh0KSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgY3IoJycuY29uY2F0KGUsICcgc2VudCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0oKSwgYmEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzYSA9IGUuY29uZmlnLCBjYSA9IGUuZ3ZsLCBsYSA9IGUuY29uc2VudEluZm8sIHVhID0gZS5ub25JYWJWZW5kb3JMaXN0LCBwYSA9IGUuZ29vZ2xlRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnJlZ3VsYXRpb24sIHQgPSBlLnBhZ2UsIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzbihvbi5hLm1hcmsoZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uLmEud3JhcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUucHJldiA9IGUubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCA9IDIsIGdhLmluaXRMYWJlbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHQgPSA0LCBuZXcgZ2EoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9hID0gZS5zZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICBhYSA9IG5ldyB2YSgpLCBpYSA9IG5ldyB6dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICdxYy1jbXAyLWNvbnRhaW5lcic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVyKCdkaXYnLCBlLCBlLCBkb2N1bWVudC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgYSA9ICdxYy1jbXAyLW1haW4nLCBpID0gZXIoJ2RpdicsIGEsIGEsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICByKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bi5yZW5kZXIodG4uY3JlYXRlRWxlbWVudChrYSwgbnVsbCwgdG4uY3JlYXRlRWxlbWVudChkYSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpOiBvYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGkpLCBvYS5kaXNwbGF5Q29uc2VudFVpKG4sIHQsIGUuaXNNYW5kYXRvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBfYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUdEUFI6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VVNQOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUNoYW5nZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBwYWdlR0RQUjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUFjY2VwdEJ1dHRvbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQ6ICcnCiAgICAgICAgICAgICAgICAgICAgfSwgeGEgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUT0dHTEVfRElTUExBWSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4ucGF5bG9hZCwgciA9IHQucmVndWxhdGlvbiwgbyA9IHQuaXNNYW5kYXRvcnksIGEgPSAhMSwgaSA9ICExLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VTUCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAoaSA9ICExKSwgYSA9ICFlLmRpc3BsYXlVU1A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdHRFBSJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChhID0gITEpLCBzID0gISFvICYmICFlLnBhZ2VDaGFuZ2VkLCBpID0gIWUuZGlzcGxheUdEUFI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoYih7fSwgZSksIHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUdEUFI6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVVTUDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQWNjZXB0QnV0dG9uOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVE9HR0xFX0NIQU5HRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG4ucGF5bG9hZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGIoe30sIGUpLCB7fSwgeyBjaGFuZ2VkOiBjIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQQUdFX0NIQU5HRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IG4ucGF5bG9hZC5wYWdlLCB1ID0gMSAhPT0gbCB8fCBsICE9PSBlLnBhZ2VHRFBSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucGF5bG9hZC5vbkluaXQgfHwgKG9hLmV2ZW50VHJhY2tlcihDdC5HT19UT19QQUdFLCBsKSwgYWEuc2VuZE5hdmlnYXRpb25Mb2coKSksIGIoYih7fSwgZSksIHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUdEUFI6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUNoYW5nZWQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUFjY2VwdEJ1dHRvbjogIXUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBFYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfSwgQ2EgPSBuZShbCiAgICAgICAgICAgICAgICAgICAgICAgIHt9LAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0pLCBrYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jaGlsZHJlbiwgdCA9IGcobWUoeGEsIF9hKSwgMiksIHIgPSB0WzBdLCBvID0gdFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVhID0gbywgdG4uY3JlYXRlRWxlbWVudChDYS5Qcm92aWRlciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgbik7CiAgICAgICAgICAgICAgICAgICAgfSwgd2EgPSBuZXcgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUodGhpcywgZSksIHRoaXMuX190Y2ZhcGl1aSA9IHZvaWQgMCwgdGhpcy5nb1RvUGFnZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5pbmNsdWRlcyhlKSA/IEVhICYmIEVhKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BBR0VfQ0hBTkdFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSW5pdDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogY29uc29sZS53YXJuKCcnLmNvbmNhdChlLCAnIGlzIG5vdCBhIHN1cHBvcnRlZCBwYWdlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5pbml0QXBpVWkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuLl9fdGNmYXBpdWksIHQgPSBbXSwgciA9IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl9fdGNmYXBpdWkgJiYgci5fX3RjZmFwaXVpLmEgJiYgKHQgPSByLl9fdGNmYXBpdWkuYSksIE9iamVjdC5hc3NpZ24od2luZG93LCB7IF9fdGNmYXBpdWk6IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUsIHAsIGQgPSBsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZC5zKCk7ICEodSA9IGQubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB1LnZhbHVlLCBtID0gcyhwID0gZikgfHwgbyhwKSB8fCBhKHApIHx8IGMoKSwgaCA9IG1bMF0sIGcgPSBtLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltoXS5hcHBseShuLCBpKGcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5lKHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX190Y2ZhcGl1aSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBuZXcgQXJyYXkodCA+IDEgPyB0IC0gMSA6IDApLCBvID0gMTsgbyA8IHQ7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbbyAtIDFdID0gYXJndW1lbnRzW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2VdLmFwcGx5KG4sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGhlIGZ1bmN0aW9uICcuY29uY2F0KGUsICcgaXMgbm90IGRlZmluZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2Rpc3BsYXlVaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKSwgZTsKICAgICAgICAgICAgICAgICAgICB9KCkpKCk7CiAgICAgICAgICAgICAgICB3YS5pbml0QXBpVWkoKTsKICAgICAgICAgICAgfQogICAgICAgIF0pOwogICAgfSgpKQp9"},{"name":"sugarcoat-connatix.player","aliases":["sugarcoat-connatix.player"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfODFiYTMzMmY3NzA2NDBjYiA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja184MWJhMzMyZjc3MDY0MGNiKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIGUocykgewogICAgICAgICAgICAgICAgaWYgKGlbc10pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbc10uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciBuID0gaVtzXSA9IHsKICAgICAgICAgICAgICAgICAgICBpOiBzLAogICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHRbc10uY2FsbChuLmV4cG9ydHMsIG4sIG4uZXhwb3J0cywgZSksIG4ubCA9ICEwLCBuLmV4cG9ydHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZS5tID0gdCwgZS5jID0gaSwgZS5kID0gZnVuY3Rpb24gKHQsIGksIHMpIHsKICAgICAgICAgICAgICAgIGUubyh0LCBpKSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgaSwgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgIGdldDogcwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGUuciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC50b1N0cmluZ1RhZyAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgIH0sIGUudCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICBpZiAoMSAmIGkgJiYgKHQgPSBlKHQpKSwgOCAmIGkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICBpZiAoNCAmIGkgJiYgJ29iamVjdCcgPT0gdHlwZW9mIHQgJiYgdCAmJiB0Ll8pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB2YXIgcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgICAgICAgICBpZiAoZS5yKHMpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgJ2RlZmF1bHQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgICAgICAgICAgIH0pLCAyICYgaSAmJiAnc3RyaW5nJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgIGUuZChzLCBuLCBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBuKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgfSwgZS5uID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gdCAmJiB0Ll8gPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdDsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGUuZChpLCAnYScsIGkpLCBpOwogICAgICAgICAgICB9LCBlLm8gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBpKTsKICAgICAgICAgICAgfSwgZS5wID0gJycsIGUoZS5zID0gMTU2KTsKICAgICAgICB9KFsKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzLCBuLCByID0gZSg2MCksIGggPSByLlJlYWRlciwgYSA9IHIuV3JpdGVyLCBvID0gci51dGlsLCBjID0gci5yb290cy5kZWZhdWx0IHx8IChyLnJvb3RzLmRlZmF1bHQgPSB7fSk7CiAgICAgICAgICAgICAgICBjLlByb3RvQWRCcmVhayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZXMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHlwZXMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLm1heEFkUG9kRHVyYXRpb24gPSAwLCB0LnByb3RvdHlwZS5tYXhBZFNsb3REdXJhdGlvbiA9IDE4MCwgdC5wcm90b3R5cGUubnVtYmVyT2ZBZFNsb3RzID0gMSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9BZEJyZWFrKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnR5cGVzICYmIHMudHlwZXMubGVuZ3RoIHx8IChzLnR5cGVzID0gW10pLCAyID09ICg3ICYgbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LnVpbnQzMigpICsgdC5wb3M7IHQucG9zIDwgcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGVzLnB1c2godC5pbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZXMucHVzaCh0LmludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWF4QWRQb2REdXJhdGlvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1heEFkU2xvdER1cmF0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubnVtYmVyT2ZBZFNsb3RzID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS50eXBlcyA9IFtdKSwgaS5kZWZhdWx0cyAmJiAoZS5tYXhBZFBvZER1cmF0aW9uID0gMCwgZS5tYXhBZFNsb3REdXJhdGlvbiA9IDE4MCwgZS5udW1iZXJPZkFkU2xvdHMgPSAxKSwgdC50eXBlcyAmJiB0LnR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50eXBlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LnR5cGVzLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHlwZXNbc10gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQWRCcmVha1R5cGVFbnVtW3QudHlwZXNbc11dIDogdC50eXBlc1tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0Lm1heEFkUG9kRHVyYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWF4QWRQb2REdXJhdGlvbicpICYmIChlLm1heEFkUG9kRHVyYXRpb24gPSB0Lm1heEFkUG9kRHVyYXRpb24pLCBudWxsICE9IHQubWF4QWRTbG90RHVyYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWF4QWRTbG90RHVyYXRpb24nKSAmJiAoZS5tYXhBZFNsb3REdXJhdGlvbiA9IHQubWF4QWRTbG90RHVyYXRpb24pLCBudWxsICE9IHQubnVtYmVyT2ZBZFNsb3RzICYmIHQuaGFzT3duUHJvcGVydHkoJ251bWJlck9mQWRTbG90cycpICYmIChlLm51bWJlck9mQWRTbG90cyA9IHQubnVtYmVyT2ZBZFNsb3RzKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWREb21haW5CbG9ja2luZ1Jlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kb21haW5zID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmRvbWFpbnMgPSBvLmVtcHR5QXJyYXksIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvQWREb21haW5CbG9ja2luZ1Jlc3BvbnNlKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZG9tYWlucyAmJiBzLmRvbWFpbnMubGVuZ3RoIHx8IChzLmRvbWFpbnMgPSBbXSksIHMuZG9tYWlucy5wdXNoKHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5kb21haW5zID0gW10pLCB0LmRvbWFpbnMgJiYgdC5kb21haW5zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kb21haW5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuZG9tYWlucy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRvbWFpbnNbc10gPSB0LmRvbWFpbnNbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0NvcmVUYW1CaWRSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUubGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5jb2RlID0gJycsIHQucHJvdG90eXBlLm1ldGFkYXRhID0gbnVsbCwgdC5wcm90b3R5cGUuZXhwbG9yYXRpb24gPSAhMSwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQubGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbGluZUl0ZW1JZCcpICYmIGkudWludDMyKDEwKS5zdHJpbmcodC5saW5lSXRlbUlkKSwgbnVsbCAhPSB0LmNvZGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NvZGUnKSAmJiBpLnVpbnQzMigxOCkuc3RyaW5nKHQuY29kZSksIG51bGwgIT0gdC5tZXRhZGF0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWV0YWRhdGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQubWV0YWRhdGEsIGkudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpLCBudWxsICE9IHQuZXhwbG9yYXRpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2V4cGxvcmF0aW9uJykgJiYgaS51aW50MzIoMzIpLmJvb2wodC5leHBsb3JhdGlvbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQ29yZVRhbUJpZFJlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0NvcmVUYW1CaWRSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQubGluZUl0ZW1JZCAmJiAoaS5saW5lSXRlbUlkID0gU3RyaW5nKHQubGluZUl0ZW1JZCkpLCBudWxsICE9IHQuY29kZSAmJiAoaS5jb2RlID0gU3RyaW5nKHQuY29kZSkpLCBudWxsICE9IHQubWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5tZXRhZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0NvcmVUYW1CaWRSZXF1ZXN0Lm1ldGFkYXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubWV0YWRhdGEgPSBjLk1ldGFkYXRhTW9kZWwuZnJvbU9iamVjdCh0Lm1ldGFkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LmV4cGxvcmF0aW9uICYmIChpLmV4cGxvcmF0aW9uID0gQm9vbGVhbih0LmV4cGxvcmF0aW9uKSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5NZXRhZGF0YU1vZGVsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudmVyc2lvbiA9IDAsIHQucHJvdG90eXBlLnNlc3Npb25JZCA9ICcnLCB0LnByb3RvdHlwZS5wbGF5ZXJJZCA9ICcnLCB0LnByb3RvdHlwZS51c2VySWQgPSAnJywgdC5wcm90b3R5cGUuYnJvd3NlciA9IG51bGwsIHQucHJvdG90eXBlLmdlbyA9IG51bGwsIHQucHJvdG90eXBlLmNsaWVudEFiMCA9IDAsIHQucHJvdG90eXBlLmNsaWVudEFiMSA9IDAsIHQucHJvdG90eXBlLnNlcnZlckFiMCA9IDAsIHQucHJvdG90eXBlLnNlcnZlckFiMSA9IDAsIHQucHJvdG90eXBlLnBhZ2VVcmwgPSAnJywgdC5wcm90b3R5cGUuYnVuZGxlSWQgPSAnJywgdC5wcm90b3R5cGUuaW1wbGVtZW50YXRpb25UeXBlID0gMCwgdC5wcm90b3R5cGUudHJhY2tBbGxSZXF1ZXN0cyA9ICExLCB0LnByb3RvdHlwZS5jdXN0b21QYXJhbTEgPSAnJywgdC5wcm90b3R5cGUuY3VzdG9tUGFyYW0yID0gJycsIHQucHJvdG90eXBlLmN1c3RvbVBhcmFtMyA9ICcnLCB0LnByb3RvdHlwZS5hYlRlc3RJZCA9ICcnLCB0LnByb3RvdHlwZS5wYWdlSW5Gb2N1cyA9ICExLCB0LnByb3RvdHlwZS5jdXN0b21QYXJhbTQgPSAnJywgdC5wcm90b3R5cGUuY3VzdG9tUGFyYW01ID0gJycsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnZlcnNpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3ZlcnNpb24nKSAmJiBpLnVpbnQzMig4KS5pbnQzMih0LnZlcnNpb24pLCBudWxsICE9IHQuc2Vzc2lvbklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZXNzaW9uSWQnKSAmJiBpLnVpbnQzMigxOCkuc3RyaW5nKHQuc2Vzc2lvbklkKSwgbnVsbCAhPSB0LnBsYXllcklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwbGF5ZXJJZCcpICYmIGkudWludDMyKDI2KS5zdHJpbmcodC5wbGF5ZXJJZCksIG51bGwgIT0gdC51c2VySWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3VzZXJJZCcpICYmIGkudWludDMyKDM0KS5zdHJpbmcodC51c2VySWQpLCBudWxsICE9IHQuYnJvd3NlciAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYnJvd3NlcicpICYmIGMuQnJvd3Nlci5lbmNvZGUodC5icm93c2VyLCBpLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0LmdlbyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZ2VvJykgJiYgYy5HZW9Mb2NhdGlvbi5lbmNvZGUodC5nZW8sIGkudWludDMyKDUwKS5mb3JrKCkpLmxkZWxpbSgpLCBudWxsICE9IHQuY2xpZW50QWIwICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjbGllbnRBYjAnKSAmJiBpLnVpbnQzMig1NikuaW50MzIodC5jbGllbnRBYjApLCBudWxsICE9IHQuY2xpZW50QWIxICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjbGllbnRBYjEnKSAmJiBpLnVpbnQzMig2NCkuaW50MzIodC5jbGllbnRBYjEpLCBudWxsICE9IHQuc2VydmVyQWIwICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZXJ2ZXJBYjAnKSAmJiBpLnVpbnQzMig3MikuaW50MzIodC5zZXJ2ZXJBYjApLCBudWxsICE9IHQuc2VydmVyQWIxICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZXJ2ZXJBYjEnKSAmJiBpLnVpbnQzMig4MCkuaW50MzIodC5zZXJ2ZXJBYjEpLCBudWxsICE9IHQucGFnZVVybCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncGFnZVVybCcpICYmIGkudWludDMyKDEyMikuc3RyaW5nKHQucGFnZVVybCksIG51bGwgIT0gdC5idW5kbGVJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYnVuZGxlSWQnKSAmJiBpLnVpbnQzMigxMzgpLnN0cmluZyh0LmJ1bmRsZUlkKSwgbnVsbCAhPSB0LmltcGxlbWVudGF0aW9uVHlwZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaW1wbGVtZW50YXRpb25UeXBlJykgJiYgaS51aW50MzIoMTQ0KS5pbnQzMih0LmltcGxlbWVudGF0aW9uVHlwZSksIG51bGwgIT0gdC50cmFja0FsbFJlcXVlc3RzICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd0cmFja0FsbFJlcXVlc3RzJykgJiYgaS51aW50MzIoMTUyKS5ib29sKHQudHJhY2tBbGxSZXF1ZXN0cyksIG51bGwgIT0gdC5jdXN0b21QYXJhbTEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2N1c3RvbVBhcmFtMScpICYmIGkudWludDMyKDE2Mikuc3RyaW5nKHQuY3VzdG9tUGFyYW0xKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtMiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3VzdG9tUGFyYW0yJykgJiYgaS51aW50MzIoMTcwKS5zdHJpbmcodC5jdXN0b21QYXJhbTIpLCBudWxsICE9IHQuY3VzdG9tUGFyYW0zICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21QYXJhbTMnKSAmJiBpLnVpbnQzMigxNzgpLnN0cmluZyh0LmN1c3RvbVBhcmFtMyksIG51bGwgIT0gdC5hYlRlc3RJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWJUZXN0SWQnKSAmJiBpLnVpbnQzMigxOTQpLnN0cmluZyh0LmFiVGVzdElkKSwgbnVsbCAhPSB0LnBhZ2VJbkZvY3VzICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwYWdlSW5Gb2N1cycpICYmIGkudWludDMyKDIwMCkuYm9vbCh0LnBhZ2VJbkZvY3VzKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtNCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3VzdG9tUGFyYW00JykgJiYgaS51aW50MzIoMjEwKS5zdHJpbmcodC5jdXN0b21QYXJhbTQpLCBudWxsICE9IHQuY3VzdG9tUGFyYW01ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21QYXJhbTUnKSAmJiBpLnVpbnQzMigyMTgpLnN0cmluZyh0LmN1c3RvbVBhcmFtNSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLk1ldGFkYXRhTW9kZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5NZXRhZGF0YU1vZGVsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudmVyc2lvbiAmJiAoaS52ZXJzaW9uID0gMCB8IHQudmVyc2lvbiksIG51bGwgIT0gdC5zZXNzaW9uSWQgJiYgKGkuc2Vzc2lvbklkID0gU3RyaW5nKHQuc2Vzc2lvbklkKSksIG51bGwgIT0gdC5wbGF5ZXJJZCAmJiAoaS5wbGF5ZXJJZCA9IFN0cmluZyh0LnBsYXllcklkKSksIG51bGwgIT0gdC51c2VySWQgJiYgKGkudXNlcklkID0gU3RyaW5nKHQudXNlcklkKSksIG51bGwgIT0gdC5icm93c2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQuYnJvd3NlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5NZXRhZGF0YU1vZGVsLmJyb3dzZXI6IG9iamVjdCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5icm93c2VyID0gYy5Ccm93c2VyLmZyb21PYmplY3QodC5icm93c2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmdlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LmdlbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5NZXRhZGF0YU1vZGVsLmdlbzogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmdlbyA9IGMuR2VvTG9jYXRpb24uZnJvbU9iamVjdCh0Lmdlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQuY2xpZW50QWIwICYmIChpLmNsaWVudEFiMCA9IDAgfCB0LmNsaWVudEFiMCksIG51bGwgIT0gdC5jbGllbnRBYjEgJiYgKGkuY2xpZW50QWIxID0gMCB8IHQuY2xpZW50QWIxKSwgbnVsbCAhPSB0LnNlcnZlckFiMCAmJiAoaS5zZXJ2ZXJBYjAgPSAwIHwgdC5zZXJ2ZXJBYjApLCBudWxsICE9IHQuc2VydmVyQWIxICYmIChpLnNlcnZlckFiMSA9IDAgfCB0LnNlcnZlckFiMSksIG51bGwgIT0gdC5wYWdlVXJsICYmIChpLnBhZ2VVcmwgPSBTdHJpbmcodC5wYWdlVXJsKSksIG51bGwgIT0gdC5idW5kbGVJZCAmJiAoaS5idW5kbGVJZCA9IFN0cmluZyh0LmJ1bmRsZUlkKSksIHQuaW1wbGVtZW50YXRpb25UeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1dlYic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW1wbGVtZW50YXRpb25UeXBlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBbXAnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmltcGxlbWVudGF0aW9uVHlwZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC50cmFja0FsbFJlcXVlc3RzICYmIChpLnRyYWNrQWxsUmVxdWVzdHMgPSBCb29sZWFuKHQudHJhY2tBbGxSZXF1ZXN0cykpLCBudWxsICE9IHQuY3VzdG9tUGFyYW0xICYmIChpLmN1c3RvbVBhcmFtMSA9IFN0cmluZyh0LmN1c3RvbVBhcmFtMSkpLCBudWxsICE9IHQuY3VzdG9tUGFyYW0yICYmIChpLmN1c3RvbVBhcmFtMiA9IFN0cmluZyh0LmN1c3RvbVBhcmFtMikpLCBudWxsICE9IHQuY3VzdG9tUGFyYW0zICYmIChpLmN1c3RvbVBhcmFtMyA9IFN0cmluZyh0LmN1c3RvbVBhcmFtMykpLCBudWxsICE9IHQuYWJUZXN0SWQgJiYgKGkuYWJUZXN0SWQgPSBTdHJpbmcodC5hYlRlc3RJZCkpLCBudWxsICE9IHQucGFnZUluRm9jdXMgJiYgKGkucGFnZUluRm9jdXMgPSBCb29sZWFuKHQucGFnZUluRm9jdXMpKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtNCAmJiAoaS5jdXN0b21QYXJhbTQgPSBTdHJpbmcodC5jdXN0b21QYXJhbTQpKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtNSAmJiAoaS5jdXN0b21QYXJhbTUgPSBTdHJpbmcodC5jdXN0b21QYXJhbTUpKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLkJyb3dzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5icm93c2VyVmVyc2lvbiA9ICcnLCB0LnByb3RvdHlwZS5icm93c2VyVHlwZSA9ICcnLCB0LnByb3RvdHlwZS5vc0NvZGUgPSAnJywgdC5wcm90b3R5cGUuZGV2aWNlID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQuYnJvd3NlclZlcnNpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2Jyb3dzZXJWZXJzaW9uJykgJiYgaS51aW50MzIoMTApLnN0cmluZyh0LmJyb3dzZXJWZXJzaW9uKSwgbnVsbCAhPSB0LmJyb3dzZXJUeXBlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdicm93c2VyVHlwZScpICYmIGkudWludDMyKDE4KS5zdHJpbmcodC5icm93c2VyVHlwZSksIG51bGwgIT0gdC5vc0NvZGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ29zQ29kZScpICYmIGkudWludDMyKDI2KS5zdHJpbmcodC5vc0NvZGUpLCBudWxsICE9IHQuZGV2aWNlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkZXZpY2UnKSAmJiBpLnVpbnQzMigzMikuaW50MzIodC5kZXZpY2UpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLkJyb3dzZXIoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5icm93c2VyVmVyc2lvbiA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5icm93c2VyVHlwZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vc0NvZGUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGV2aWNlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LmZyb21PYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGMuQnJvd3NlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLkJyb3dzZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQuYnJvd3NlclZlcnNpb24gJiYgKGkuYnJvd3NlclZlcnNpb24gPSBTdHJpbmcodC5icm93c2VyVmVyc2lvbikpLCBudWxsICE9IHQuYnJvd3NlclR5cGUgJiYgKGkuYnJvd3NlclR5cGUgPSBTdHJpbmcodC5icm93c2VyVHlwZSkpLCBudWxsICE9IHQub3NDb2RlICYmIChpLm9zQ29kZSA9IFN0cmluZyh0Lm9zQ29kZSkpLCB0LmRldmljZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEZXNrdG9wJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kZXZpY2UgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NtYXJ0cGhvbmUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVGFibGV0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kZXZpY2UgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0dhbWVDb25zb2xlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kZXZpY2UgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NtYXJ0VFYnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV2VhcmFibGVDb21wdXRlcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZGV2aWNlID0gNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQREEnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5yZWNvZ25pemVkJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kZXZpY2UgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5icm93c2VyVmVyc2lvbiA9ICcnLCBlLmJyb3dzZXJUeXBlID0gJycsIGUub3NDb2RlID0gJycsIGUuZGV2aWNlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0Rlc2t0b3AnIDogMCksIG51bGwgIT0gdC5icm93c2VyVmVyc2lvbiAmJiB0Lmhhc093blByb3BlcnR5KCdicm93c2VyVmVyc2lvbicpICYmIChlLmJyb3dzZXJWZXJzaW9uID0gdC5icm93c2VyVmVyc2lvbiksIG51bGwgIT0gdC5icm93c2VyVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCdicm93c2VyVHlwZScpICYmIChlLmJyb3dzZXJUeXBlID0gdC5icm93c2VyVHlwZSksIG51bGwgIT0gdC5vc0NvZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnb3NDb2RlJykgJiYgKGUub3NDb2RlID0gdC5vc0NvZGUpLCBudWxsICE9IHQuZGV2aWNlICYmIHQuaGFzT3duUHJvcGVydHkoJ2RldmljZScpICYmIChlLmRldmljZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9EZXZpY2VUeXBlW3QuZGV2aWNlXSA6IHQuZGV2aWNlKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLkdlb0xvY2F0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuY291bnRyeUdlb0lkID0gMCwgdC5wcm90b3R5cGUuY2l0eUlkID0gMCwgdC5wcm90b3R5cGUuc3ViZGl2aXNpb25JZCA9IDAsIHQucHJvdG90eXBlLmRtYUlkID0gMCwgdC5wcm90b3R5cGUuaXAgPSAnJywgdC5wcm90b3R5cGUubGF0ID0gMCwgdC5wcm90b3R5cGUubG9uID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQuY291bnRyeUdlb0lkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjb3VudHJ5R2VvSWQnKSAmJiBpLnVpbnQzMig4KS5pbnQzMih0LmNvdW50cnlHZW9JZCksIG51bGwgIT0gdC5jaXR5SWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NpdHlJZCcpICYmIGkudWludDMyKDE2KS5pbnQzMih0LmNpdHlJZCksIG51bGwgIT0gdC5zdWJkaXZpc2lvbklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzdWJkaXZpc2lvbklkJykgJiYgaS51aW50MzIoMjQpLmludDMyKHQuc3ViZGl2aXNpb25JZCksIG51bGwgIT0gdC5kbWFJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZG1hSWQnKSAmJiBpLnVpbnQzMigzMikuaW50MzIodC5kbWFJZCksIG51bGwgIT0gdC5pcCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaXAnKSAmJiBpLnVpbnQzMig0Mikuc3RyaW5nKHQuaXApLCBudWxsICE9IHQubGF0ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdsYXQnKSAmJiBpLnVpbnQzMig0OSkuZG91YmxlKHQubGF0KSwgbnVsbCAhPSB0LmxvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbG9uJykgJiYgaS51aW50MzIoNTcpLmRvdWJsZSh0LmxvbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuR2VvTG9jYXRpb24oKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb3VudHJ5R2VvSWQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jaXR5SWQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWJkaXZpc2lvbklkID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZG1hSWQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pcCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYXQgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubG9uID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLkdlb0xvY2F0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuR2VvTG9jYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5jb3VudHJ5R2VvSWQgJiYgKGkuY291bnRyeUdlb0lkID0gMCB8IHQuY291bnRyeUdlb0lkKSwgbnVsbCAhPSB0LmNpdHlJZCAmJiAoaS5jaXR5SWQgPSAwIHwgdC5jaXR5SWQpLCBudWxsICE9IHQuc3ViZGl2aXNpb25JZCAmJiAoaS5zdWJkaXZpc2lvbklkID0gMCB8IHQuc3ViZGl2aXNpb25JZCksIG51bGwgIT0gdC5kbWFJZCAmJiAoaS5kbWFJZCA9IDAgfCB0LmRtYUlkKSwgbnVsbCAhPSB0LmlwICYmIChpLmlwID0gU3RyaW5nKHQuaXApKSwgbnVsbCAhPSB0LmxhdCAmJiAoaS5sYXQgPSBOdW1iZXIodC5sYXQpKSwgbnVsbCAhPSB0LmxvbiAmJiAoaS5sb24gPSBOdW1iZXIodC5sb24pKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUuY291bnRyeUdlb0lkID0gMCwgZS5jaXR5SWQgPSAwLCBlLnN1YmRpdmlzaW9uSWQgPSAwLCBlLmRtYUlkID0gMCwgZS5pcCA9ICcnLCBlLmxhdCA9IDAsIGUubG9uID0gMCksIG51bGwgIT0gdC5jb3VudHJ5R2VvSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY291bnRyeUdlb0lkJykgJiYgKGUuY291bnRyeUdlb0lkID0gdC5jb3VudHJ5R2VvSWQpLCBudWxsICE9IHQuY2l0eUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ2NpdHlJZCcpICYmIChlLmNpdHlJZCA9IHQuY2l0eUlkKSwgbnVsbCAhPSB0LnN1YmRpdmlzaW9uSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc3ViZGl2aXNpb25JZCcpICYmIChlLnN1YmRpdmlzaW9uSWQgPSB0LnN1YmRpdmlzaW9uSWQpLCBudWxsICE9IHQuZG1hSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZG1hSWQnKSAmJiAoZS5kbWFJZCA9IHQuZG1hSWQpLCBudWxsICE9IHQuaXAgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaXAnKSAmJiAoZS5pcCA9IHQuaXApLCBudWxsICE9IHQubGF0ICYmIHQuaGFzT3duUHJvcGVydHkoJ2xhdCcpICYmIChlLmxhdCA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5sYXQpID8gU3RyaW5nKHQubGF0KSA6IHQubGF0KSwgbnVsbCAhPSB0LmxvbiAmJiB0Lmhhc093blByb3BlcnR5KCdsb24nKSAmJiAoZS5sb24gPSBpLmpzb24gJiYgIWlzRmluaXRlKHQubG9uKSA/IFN0cmluZyh0LmxvbikgOiB0LmxvbiksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0NvcmVUYW1CaWRSZXNwb25zZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmVycm9yTWVzc2FnZSA9ICcnLCB0LnByb3RvdHlwZS5lbmNyeXB0ZWRCaWRQcmljZSA9ICcnLCB0LnByb3RvdHlwZS5vZnNrcCA9IDAsIHQucHJvdG90eXBlLmltcHJlc3Npb25UaW1lU3BlbnQgPSAwLCB0LnByb3RvdHlwZS5iaWRSYXRlID0gMCwgdC5wcm90b3R5cGUuc3VjY2Vzc1JhdGUgPSAwLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0NvcmVUYW1CaWRSZXNwb25zZSgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVycm9yTWVzc2FnZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZW5jcnlwdGVkQmlkUHJpY2UgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm9mc2twID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXByZXNzaW9uVGltZVNwZW50ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJpZFJhdGUgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1Y2Nlc3NSYXRlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmVycm9yTWVzc2FnZSA9ICcnLCBlLmVuY3J5cHRlZEJpZFByaWNlID0gJycsIGUub2Zza3AgPSAwLCBlLmltcHJlc3Npb25UaW1lU3BlbnQgPSAwLCBlLmJpZFJhdGUgPSAwLCBlLnN1Y2Nlc3NSYXRlID0gMCksIG51bGwgIT0gdC5lcnJvck1lc3NhZ2UgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZXJyb3JNZXNzYWdlJykgJiYgKGUuZXJyb3JNZXNzYWdlID0gdC5lcnJvck1lc3NhZ2UpLCBudWxsICE9IHQuZW5jcnlwdGVkQmlkUHJpY2UgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZW5jcnlwdGVkQmlkUHJpY2UnKSAmJiAoZS5lbmNyeXB0ZWRCaWRQcmljZSA9IHQuZW5jcnlwdGVkQmlkUHJpY2UpLCBudWxsICE9IHQub2Zza3AgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnb2Zza3AnKSAmJiAoZS5vZnNrcCA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5vZnNrcCkgPyBTdHJpbmcodC5vZnNrcCkgOiB0Lm9mc2twKSwgbnVsbCAhPSB0LmltcHJlc3Npb25UaW1lU3BlbnQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaW1wcmVzc2lvblRpbWVTcGVudCcpICYmIChlLmltcHJlc3Npb25UaW1lU3BlbnQgPSB0LmltcHJlc3Npb25UaW1lU3BlbnQpLCBudWxsICE9IHQuYmlkUmF0ZSAmJiB0Lmhhc093blByb3BlcnR5KCdiaWRSYXRlJykgJiYgKGUuYmlkUmF0ZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5iaWRSYXRlKSA/IFN0cmluZyh0LmJpZFJhdGUpIDogdC5iaWRSYXRlKSwgbnVsbCAhPSB0LnN1Y2Nlc3NSYXRlICYmIHQuaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3NSYXRlJykgJiYgKGUuc3VjY2Vzc1JhdGUgPSBpLmpzb24gJiYgIWlzRmluaXRlKHQuc3VjY2Vzc1JhdGUpID8gU3RyaW5nKHQuc3VjY2Vzc1JhdGUpIDogdC5zdWNjZXNzUmF0ZSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0Nvb2tpZVNldHRpbmdzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUubmFtZSA9ICcnLCB0LnByb3RvdHlwZS52YWx1ZSA9ICcnLCB0LnByb3RvdHlwZS50aW1lc3RhbXAgPSBvLkxvbmcgPyBvLkxvbmcuZnJvbUJpdHMoMCwgMCwgITEpIDogMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQubmFtZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbmFtZScpICYmIGkudWludDMyKDEwKS5zdHJpbmcodC5uYW1lKSwgbnVsbCAhPSB0LnZhbHVlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd2YWx1ZScpICYmIGkudWludDMyKDE4KS5zdHJpbmcodC52YWx1ZSksIG51bGwgIT0gdC50aW1lc3RhbXAgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RpbWVzdGFtcCcpICYmIGkudWludDMyKDI0KS5pbnQ2NCh0LnRpbWVzdGFtcCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQ29va2llU2V0dGluZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0Nvb2tpZVNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQubmFtZSAmJiAoaS5uYW1lID0gU3RyaW5nKHQubmFtZSkpLCBudWxsICE9IHQudmFsdWUgJiYgKGkudmFsdWUgPSBTdHJpbmcodC52YWx1ZSkpLCBudWxsICE9IHQudGltZXN0YW1wICYmIChvLkxvbmcgPyAoaS50aW1lc3RhbXAgPSBvLkxvbmcuZnJvbVZhbHVlKHQudGltZXN0YW1wKSkudW5zaWduZWQgPSAhMSA6ICdzdHJpbmcnID09IHR5cGVvZiB0LnRpbWVzdGFtcCA/IGkudGltZXN0YW1wID0gcGFyc2VJbnQodC50aW1lc3RhbXAsIDEwKSA6ICdudW1iZXInID09IHR5cGVvZiB0LnRpbWVzdGFtcCA/IGkudGltZXN0YW1wID0gdC50aW1lc3RhbXAgOiAnb2JqZWN0JyA9PSB0eXBlb2YgdC50aW1lc3RhbXAgJiYgKGkudGltZXN0YW1wID0gbmV3IG8uTG9uZ0JpdHModC50aW1lc3RhbXAubG93ID4+PiAwLCB0LnRpbWVzdGFtcC5oaWdoID4+PiAwKS50b051bWJlcigpKSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0Nvb2tpZVN5bmNSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb29raWVMaXN0ID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNvb2tpZUxpc3QgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLnNlY3VyZU1vZGUgPSAwLCB0LnByb3RvdHlwZS5icm93c2VySW5mbyA9IG51bGwsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LmNvb2tpZUxpc3QgJiYgdC5jb29raWVMaXN0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5jb29raWVMaXN0Lmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuUHJvdG9Db29raWVTZXR0aW5ncy5lbmNvZGUodC5jb29raWVMaXN0W2VdLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5zZWN1cmVNb2RlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZWN1cmVNb2RlJykgJiYgaS51aW50MzIoMTYpLmludDMyKHQuc2VjdXJlTW9kZSksIG51bGwgIT0gdC5icm93c2VySW5mbyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYnJvd3NlckluZm8nKSAmJiBjLkJyb3dzZXIuZW5jb2RlKHQuYnJvd3NlckluZm8sIGkudWludDMyKDI2KS5mb3JrKCkpLmxkZWxpbSgpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b0Nvb2tpZVN5bmNSZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9Db29raWVTeW5jUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb29raWVMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5jb29raWVMaXN0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0Nvb2tpZVN5bmNSZXF1ZXN0LmNvb2tpZUxpc3Q6IGFycmF5IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNvb2tpZUxpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5jb29raWVMaXN0Lmxlbmd0aDsgKytlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LmNvb2tpZUxpc3RbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvQ29va2llU3luY1JlcXVlc3QuY29va2llTGlzdDogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jb29raWVMaXN0W2VdID0gYy5Qcm90b0Nvb2tpZVNldHRpbmdzLmZyb21PYmplY3QodC5jb29raWVMaXN0W2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuc2VjdXJlTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTZWN1cmUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNlY3VyZU1vZGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Vuc2VjdXJlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zZWN1cmVNb2RlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBdXRvJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zZWN1cmVNb2RlID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmJyb3dzZXJJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQuYnJvd3NlckluZm8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9Db29raWVTeW5jUmVxdWVzdC5icm93c2VySW5mbzogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJyb3dzZXJJbmZvID0gYy5Ccm93c2VyLmZyb21PYmplY3QodC5icm93c2VySW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1VzZXJJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnVzZXJJZCA9ICcnLCB0LnByb3RvdHlwZS5sb29rdXBJZCA9ICcnLCB0LnByb3RvdHlwZS5sb29rdXBSZXNwb25zZUNvZGUgPSAwLCB0LnByb3RvdHlwZS5jYWxsRnJhdWRTZW5zb3IgPSAhMSwgdC5wcm90b3R5cGUucHVibGlzaGVyQWRzVHh0ID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvVXNlckluZm9ybWF0aW9uKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXNlcklkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxvb2t1cElkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxvb2t1cFJlc3BvbnNlQ29kZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNhbGxGcmF1ZFNlbnNvciA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVibGlzaGVyQWRzVHh0ID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLnVzZXJJZCA9ICcnLCBlLmxvb2t1cElkID0gJycsIGUubG9va3VwUmVzcG9uc2VDb2RlID0gMCwgZS5jYWxsRnJhdWRTZW5zb3IgPSAhMSwgZS5wdWJsaXNoZXJBZHNUeHQgPSAnJyksIG51bGwgIT0gdC51c2VySWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndXNlcklkJykgJiYgKGUudXNlcklkID0gdC51c2VySWQpLCBudWxsICE9IHQubG9va3VwSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbG9va3VwSWQnKSAmJiAoZS5sb29rdXBJZCA9IHQubG9va3VwSWQpLCBudWxsICE9IHQubG9va3VwUmVzcG9uc2VDb2RlICYmIHQuaGFzT3duUHJvcGVydHkoJ2xvb2t1cFJlc3BvbnNlQ29kZScpICYmIChlLmxvb2t1cFJlc3BvbnNlQ29kZSA9IHQubG9va3VwUmVzcG9uc2VDb2RlKSwgbnVsbCAhPSB0LmNhbGxGcmF1ZFNlbnNvciAmJiB0Lmhhc093blByb3BlcnR5KCdjYWxsRnJhdWRTZW5zb3InKSAmJiAoZS5jYWxsRnJhdWRTZW5zb3IgPSB0LmNhbGxGcmF1ZFNlbnNvciksIG51bGwgIT0gdC5wdWJsaXNoZXJBZHNUeHQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncHVibGlzaGVyQWRzVHh0JykgJiYgKGUucHVibGlzaGVyQWRzVHh0ID0gdC5wdWJsaXNoZXJBZHNUeHQpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuQ3JlYXRpdmVUcmFja2VyVmlld01vZGVsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHlwZSA9IDAsIHQucHJvdG90eXBlLnRyaWdnZXIgPSAwLCB0LnByb3RvdHlwZS51cmwgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuQ3JlYXRpdmVUcmFja2VyVmlld01vZGVsKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRyaWdnZXIgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy51cmwgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUudHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdJbWFnZScgOiAwLCBlLnRyaWdnZXIgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnSW1wcmVzc2lvbicgOiAwLCBlLnVybCA9ICcnKSwgbnVsbCAhPSB0LnR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndHlwZScpICYmIChlLnR5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvVHJhY2tlclR5cGVbdC50eXBlXSA6IHQudHlwZSksIG51bGwgIT0gdC50cmlnZ2VyICYmIHQuaGFzT3duUHJvcGVydHkoJ3RyaWdnZXInKSAmJiAoZS50cmlnZ2VyID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1RyYWNrZXJUcmlnZ2VyVHlwZVt0LnRyaWdnZXJdIDogdC50cmlnZ2VyKSwgbnVsbCAhPSB0LnVybCAmJiB0Lmhhc093blByb3BlcnR5KCd1cmwnKSAmJiAoZS51cmwgPSB0LnVybCksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQWRCcmVha1RhcmdldGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmFkUm9sbFR5cGUgPSAwLCB0LnByb3RvdHlwZS5hZEJyZWFrVHlwZUVudW0gPSAxLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0xpbmVJdGVtQWRCcmVha1RhcmdldGluZygpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkUm9sbFR5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZEJyZWFrVHlwZUVudW0gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5hZFJvbGxUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ05vbmUnIDogMCwgZS5hZEJyZWFrVHlwZUVudW0gPSBpLmVudW1zID09PSBTdHJpbmcgPyAnQWxsJyA6IDEpLCBudWxsICE9IHQuYWRSb2xsVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCdhZFJvbGxUeXBlJykgJiYgKGUuYWRSb2xsVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9BZEJyZWFrVHlwZUVudW1bdC5hZFJvbGxUeXBlXSA6IHQuYWRSb2xsVHlwZSksIG51bGwgIT0gdC5hZEJyZWFrVHlwZUVudW0gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRCcmVha1R5cGVFbnVtJykgJiYgKGUuYWRCcmVha1R5cGVFbnVtID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtW3QuYWRCcmVha1R5cGVFbnVtXSA6IHQuYWRCcmVha1R5cGVFbnVtKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTGluZUl0ZW1BZFBvZFRhcmdldGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRTbG90UG9zaXRpb25zID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRhcmdldGluZ1R5cGUgPSAwLCB0LnByb3RvdHlwZS5hZFNsb3RUYXJnZXRpbmdUeXBlID0gMSwgdC5wcm90b3R5cGUuYWRTbG90UG9zaXRpb25zID0gby5lbXB0eUFycmF5LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0xpbmVJdGVtQWRQb2RUYXJnZXRpbmcoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50YXJnZXRpbmdUeXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRTbG90VGFyZ2V0aW5nVHlwZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5hZFNsb3RQb3NpdGlvbnMgJiYgcy5hZFNsb3RQb3NpdGlvbnMubGVuZ3RoIHx8IChzLmFkU2xvdFBvc2l0aW9ucyA9IFtdKSwgMiA9PSAoNyAmIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gdC51aW50MzIoKSArIHQucG9zOyB0LnBvcyA8IHI7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFNsb3RQb3NpdGlvbnMucHVzaCh0LmludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFNsb3RQb3NpdGlvbnMucHVzaCh0LmludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5hZFNsb3RQb3NpdGlvbnMgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUudGFyZ2V0aW5nVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdPbmx5JyA6IDAsIGUuYWRTbG90VGFyZ2V0aW5nVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdTcGVjaWZpY1Nsb3RzJyA6IDEpLCBudWxsICE9IHQudGFyZ2V0aW5nVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCd0YXJnZXRpbmdUeXBlJykgJiYgKGUudGFyZ2V0aW5nVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbVRhcmdldGluZ1R5cGVFbnVtW3QudGFyZ2V0aW5nVHlwZV0gOiB0LnRhcmdldGluZ1R5cGUpLCBudWxsICE9IHQuYWRTbG90VGFyZ2V0aW5nVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCdhZFNsb3RUYXJnZXRpbmdUeXBlJykgJiYgKGUuYWRTbG90VGFyZ2V0aW5nVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbUFkU2xvdFRhcmdldGluZ1R5cGVFbnVtW3QuYWRTbG90VGFyZ2V0aW5nVHlwZV0gOiB0LmFkU2xvdFRhcmdldGluZ1R5cGUpLCB0LmFkU2xvdFBvc2l0aW9ucyAmJiB0LmFkU2xvdFBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWRTbG90UG9zaXRpb25zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuYWRTbG90UG9zaXRpb25zLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWRTbG90UG9zaXRpb25zW3NdID0gdC5hZFNsb3RQb3NpdGlvbnNbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQWRCcmVha1NldHRpbmdzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZEJyZWFrVGFyZ2V0aW5nID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmFkQnJlYWtUYXJnZXRpbmcgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmFkUG9kVGFyZ2V0aW5nID0gbnVsbCwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtTZXR0aW5ncygpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkQnJlYWtUYXJnZXRpbmcgJiYgcy5hZEJyZWFrVGFyZ2V0aW5nLmxlbmd0aCB8fCAocy5hZEJyZWFrVGFyZ2V0aW5nID0gW10pLCBzLmFkQnJlYWtUYXJnZXRpbmcucHVzaChjLlByb3RvTGluZUl0ZW1BZEJyZWFrVGFyZ2V0aW5nLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFBvZFRhcmdldGluZyA9IGMuUHJvdG9MaW5lSXRlbUFkUG9kVGFyZ2V0aW5nLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKGUuYWRCcmVha1RhcmdldGluZyA9IFtdKSwgaS5kZWZhdWx0cyAmJiAoZS5hZFBvZFRhcmdldGluZyA9IG51bGwpLCB0LmFkQnJlYWtUYXJnZXRpbmcgJiYgdC5hZEJyZWFrVGFyZ2V0aW5nLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZEJyZWFrVGFyZ2V0aW5nID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuYWRCcmVha1RhcmdldGluZy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkQnJlYWtUYXJnZXRpbmdbc10gPSBjLlByb3RvTGluZUl0ZW1BZEJyZWFrVGFyZ2V0aW5nLnRvT2JqZWN0KHQuYWRCcmVha1RhcmdldGluZ1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5hZFBvZFRhcmdldGluZyAmJiB0Lmhhc093blByb3BlcnR5KCdhZFBvZFRhcmdldGluZycpICYmIChlLmFkUG9kVGFyZ2V0aW5nID0gYy5Qcm90b0xpbmVJdGVtQWRQb2RUYXJnZXRpbmcudG9PYmplY3QodC5hZFBvZFRhcmdldGluZywgaSkpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhY2tlcnMgPSBbXSwgdGhpcy5yZW5kaXRpb25zID0gW10sIHRoaXMuZmxvb3JQcmljZXMgPSBbXSwgdGhpcy5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZyA9IFtdLCB0aGlzLnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUucHVibGlzaGVyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZFRhZyA9ICcnLCB0LnByb3RvdHlwZS5jcmVhdGl2ZVR5cGUgPSAwLCB0LnByb3RvdHlwZS5zb3VuZCA9ICExLCB0LnByb3RvdHlwZS52aWV3YWJpbGl0eSA9ICExLCB0LnByb3RvdHlwZS5pbXByZXNzaW9uVGltZVNwZW50ID0gMCwgdC5wcm90b3R5cGUudmVuZG9ySWQgPSAnJywgdC5wcm90b3R5cGUudHJhY2tlcnMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmR1cmF0aW9uID0gMCwgdC5wcm90b3R5cGUucmVuZGl0aW9ucyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUubWVkaWFDcmVhdGl2ZUlkID0gJycsIHQucHJvdG90eXBlLmlnbm9yZUZpbGxlZFJlcXVlc3RzID0gITEsIHQucHJvdG90eXBlLnJlcXVlc3RDYXAgPSAzLCB0LnByb3RvdHlwZS5pbXByZXNzaW9uQ2FwID0gMCwgdC5wcm90b3R5cGUuc3VjY2Vzc1JhdGUgPSAwLCB0LnByb3RvdHlwZS5saW5lSXRlbVByaW9yaXR5ID0gMCwgdC5wcm90b3R5cGUuaGVhZGVyQmlkZGVyQmlkcyA9ICcnLCB0LnByb3RvdHlwZS5oZWFkZXJCaWRkZXJUaW1lb3V0ID0gMCwgdC5wcm90b3R5cGUubWVkaWFDcmVhdGl2ZUNsaWNrVXJsID0gJycsIHQucHJvdG90eXBlLnJlc2V0UmVxdWVzdHNDYXBUaW1lID0gNjAsIHQucHJvdG90eXBlLnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lID0gNjAsIHQucHJvdG90eXBlLnJlc2V0Q2FwVHlwZSA9IDAsIHQucHJvdG90eXBlLmNyZWF0aXZlSGxzRmlsZU5hbWUgPSAnJywgdC5wcm90b3R5cGUudGltZUJldHdlZW5SZXF1ZXN0cyA9IDAsIHQucHJvdG90eXBlLnNraXBNb2RlID0gMCwgdC5wcm90b3R5cGUubWVkaWFJZFRhcmdldGluZyA9IG51bGwsIHQucHJvdG90eXBlLm1lZGlhS2V5d29yZHNUYXJnZXRpbmcgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nID0gbnVsbCwgdC5wcm90b3R5cGUuYWRUeXBlID0gMCwgdC5wcm90b3R5cGUub3ZlcmxheVRpbWUgPSAzMCwgdC5wcm90b3R5cGUuZmxvb3JQcmljZSA9IDAsIHQucHJvdG90eXBlLmFkQnJlYWtTZXR0aW5ncyA9IG51bGwsIHQucHJvdG90eXBlLmZsb29yUHJpY2VzID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5iaWRSYXRlID0gMCwgdC5wcm90b3R5cGUucGF1c2VBZE91dE9mVmlldyA9IDAsIHQucHJvdG90eXBlLm1vYXRUcmFja2luZ0VuYWJsZWQgPSAhMSwgdC5wcm90b3R5cGUuY254Q3JlYXRpdmVJZCA9ICcnLCB0LnByb3RvdHlwZS5ibG9ja2VkRG9tYWluc1JldmlzaW9uTnVtYmVyID0gMCwgdC5wcm90b3R5cGUuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmFtYXpvbkRlYWxJZCA9ICcnLCB0LnByb3RvdHlwZS5wbGF5ZXJTaXplVGFyZ2V0aW5ncyA9IG51bGwsIHQucHJvdG90eXBlLnBsYXllclNpemUgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9MaW5lSXRlbSgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRUYWcgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY3JlYXRpdmVUeXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc291bmQgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnZpZXdhYmlsaXR5ID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXByZXNzaW9uVGltZVNwZW50ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnZlbmRvcklkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50cmFja2VycyAmJiBzLnRyYWNrZXJzLmxlbmd0aCB8fCAocy50cmFja2VycyA9IFtdKSwgcy50cmFja2Vycy5wdXNoKGMuQ3JlYXRpdmVUcmFja2VyVmlld01vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZHVyYXRpb24gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVuZGl0aW9ucyAmJiBzLnJlbmRpdGlvbnMubGVuZ3RoIHx8IChzLnJlbmRpdGlvbnMgPSBbXSksIHMucmVuZGl0aW9ucy5wdXNoKGMuUHJvdG9SZW5kaXRpb24uZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tZWRpYUNyZWF0aXZlSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmlnbm9yZUZpbGxlZFJlcXVlc3RzID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVxdWVzdENhcCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXByZXNzaW9uQ2FwID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1Y2Nlc3NSYXRlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5saW5lSXRlbVByaW9yaXR5ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmhlYWRlckJpZGRlckJpZHMgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmhlYWRlckJpZGRlclRpbWVvdXQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFDcmVhdGl2ZUNsaWNrVXJsID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZXNldFJlcXVlc3RzQ2FwVGltZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZXNldEltcHJlc3Npb25zQ2FwVGltZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZXNldENhcFR5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY3JlYXRpdmVIbHNGaWxlTmFtZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudGltZUJldHdlZW5SZXF1ZXN0cyA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5za2lwTW9kZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tZWRpYUlkVGFyZ2V0aW5nID0gYy5Qcm90b1RhcmdldGluZ0Nob2ljZU1vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tZWRpYUtleXdvcmRzVGFyZ2V0aW5nID0gYy5Qcm90b1RhcmdldGluZ0Nob2ljZU1vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nID0gYy5Qcm90b1RhcmdldGluZ0Nob2ljZU1vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFR5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub3ZlcmxheVRpbWUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvb3JQcmljZSA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRCcmVha1NldHRpbmdzID0gYy5Qcm90b0xpbmVJdGVtQWRCcmVha1NldHRpbmdzLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuZmxvb3JQcmljZXMgJiYgcy5mbG9vclByaWNlcy5sZW5ndGggfHwgKHMuZmxvb3JQcmljZXMgPSBbXSksIDIgPT0gKDcgJiBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHQudWludDMyKCkgKyB0LnBvczsgdC5wb3MgPCByOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvb3JQcmljZXMucHVzaCh0LmRvdWJsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvb3JQcmljZXMucHVzaCh0LmRvdWJsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5iaWRSYXRlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wYXVzZUFkT3V0T2ZWaWV3ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1vYXRUcmFja2luZ0VuYWJsZWQgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jbnhDcmVhdGl2ZUlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5ibG9ja2VkRG9tYWluc1JldmlzaW9uTnVtYmVyID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nICYmIHMuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoIHx8IChzLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW10pLCBzLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nLnB1c2goYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nICYmIHMucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZy5sZW5ndGggfHwgKHMucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZyA9IFtdKSwgcy5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nLnB1c2goYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hbWF6b25EZWFsSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBsYXllclNpemVUYXJnZXRpbmdzID0gYy5Qcm90b1BsYXllclNpemVUYXJnZXRpbmdzLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucGxheWVyU2l6ZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLnRyYWNrZXJzID0gW10sIGUucmVuZGl0aW9ucyA9IFtdLCBlLmZsb29yUHJpY2VzID0gW10sIGUuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBbXSwgZS5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW10pLCBpLmRlZmF1bHRzICYmIChlLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSAnJywgZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCBlLmFkVGFnID0gJycsIGUuY3JlYXRpdmVUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ1RoaXJkUGFydHknIDogMCwgZS5zb3VuZCA9ICExLCBlLnZpZXdhYmlsaXR5ID0gITEsIGUuaW1wcmVzc2lvblRpbWVTcGVudCA9IDAsIGUudmVuZG9ySWQgPSAnJywgZS5kdXJhdGlvbiA9IDAsIGUubWVkaWFDcmVhdGl2ZUlkID0gJycsIGUuaWdub3JlRmlsbGVkUmVxdWVzdHMgPSAhMSwgZS5yZXF1ZXN0Q2FwID0gMywgZS5pbXByZXNzaW9uQ2FwID0gMCwgZS5zdWNjZXNzUmF0ZSA9IDAsIGUubGluZUl0ZW1Qcmlvcml0eSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdIb3VzZScgOiAwLCBlLmhlYWRlckJpZGRlckJpZHMgPSAnJywgZS5oZWFkZXJCaWRkZXJUaW1lb3V0ID0gMCwgZS5tZWRpYUNyZWF0aXZlQ2xpY2tVcmwgPSAnJywgZS5yZXNldFJlcXVlc3RzQ2FwVGltZSA9IDYwLCBlLnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lID0gNjAsIGUucmVzZXRDYXBUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ1RpbWVDYXBwaW5nJyA6IDAsIGUuY3JlYXRpdmVIbHNGaWxlTmFtZSA9ICcnLCBlLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSAwLCBlLnNraXBNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0lmTG9uZ2VyVGhhbjMxU2VjJyA6IDAsIGUubWVkaWFJZFRhcmdldGluZyA9IG51bGwsIGUubWVkaWFLZXl3b3Jkc1RhcmdldGluZyA9IG51bGwsIGUubWVkaWFMYW5ndWFnZVRhcmdldGluZyA9IG51bGwsIGUuYWRUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ1ZpZGVvJyA6IDAsIGUub3ZlcmxheVRpbWUgPSAzMCwgZS5mbG9vclByaWNlID0gMCwgZS5hZEJyZWFrU2V0dGluZ3MgPSBudWxsLCBlLmJpZFJhdGUgPSAwLCBlLnBhdXNlQWRPdXRPZlZpZXcgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnRGVmYXVsdCcgOiAwLCBlLm1vYXRUcmFja2luZ0VuYWJsZWQgPSAhMSwgZS5jbnhDcmVhdGl2ZUlkID0gJycsIGUuYmxvY2tlZERvbWFpbnNSZXZpc2lvbk51bWJlciA9IDAsIGUucGxheWVyU2l6ZVRhcmdldGluZ3MgPSBudWxsLCBlLmFtYXpvbkRlYWxJZCA9ICcnLCBlLnBsYXllclNpemUgPSAnJyksIG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ3B1Ymxpc2hlckxpbmVJdGVtSWQnKSAmJiAoZS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkdmVydGlzZXJMaW5lSXRlbUlkJykgJiYgKGUuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LmFkVGFnICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkVGFnJykgJiYgKGUuYWRUYWcgPSB0LmFkVGFnKSwgbnVsbCAhPSB0LmNyZWF0aXZlVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCdjcmVhdGl2ZVR5cGUnKSAmJiAoZS5jcmVhdGl2ZVR5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQ3JlYXRpdmVUeXBlRW51bVt0LmNyZWF0aXZlVHlwZV0gOiB0LmNyZWF0aXZlVHlwZSksIG51bGwgIT0gdC5zb3VuZCAmJiB0Lmhhc093blByb3BlcnR5KCdzb3VuZCcpICYmIChlLnNvdW5kID0gdC5zb3VuZCksIG51bGwgIT0gdC52aWV3YWJpbGl0eSAmJiB0Lmhhc093blByb3BlcnR5KCd2aWV3YWJpbGl0eScpICYmIChlLnZpZXdhYmlsaXR5ID0gdC52aWV3YWJpbGl0eSksIG51bGwgIT0gdC5pbXByZXNzaW9uVGltZVNwZW50ICYmIHQuaGFzT3duUHJvcGVydHkoJ2ltcHJlc3Npb25UaW1lU3BlbnQnKSAmJiAoZS5pbXByZXNzaW9uVGltZVNwZW50ID0gdC5pbXByZXNzaW9uVGltZVNwZW50KSwgbnVsbCAhPSB0LnZlbmRvcklkICYmIHQuaGFzT3duUHJvcGVydHkoJ3ZlbmRvcklkJykgJiYgKGUudmVuZG9ySWQgPSB0LnZlbmRvcklkKSwgdC50cmFja2VycyAmJiB0LnRyYWNrZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50cmFja2VycyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LnRyYWNrZXJzLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHJhY2tlcnNbc10gPSBjLkNyZWF0aXZlVHJhY2tlclZpZXdNb2RlbC50b09iamVjdCh0LnRyYWNrZXJzW3NdLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmR1cmF0aW9uICYmIHQuaGFzT3duUHJvcGVydHkoJ2R1cmF0aW9uJykgJiYgKGUuZHVyYXRpb24gPSB0LmR1cmF0aW9uKSwgdC5yZW5kaXRpb25zICYmIHQucmVuZGl0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVuZGl0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHQucmVuZGl0aW9ucy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbmRpdGlvbnNbc10gPSBjLlByb3RvUmVuZGl0aW9uLnRvT2JqZWN0KHQucmVuZGl0aW9uc1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5tZWRpYUNyZWF0aXZlSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFDcmVhdGl2ZUlkJykgJiYgKGUubWVkaWFDcmVhdGl2ZUlkID0gdC5tZWRpYUNyZWF0aXZlSWQpLCBudWxsICE9IHQuaWdub3JlRmlsbGVkUmVxdWVzdHMgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlRmlsbGVkUmVxdWVzdHMnKSAmJiAoZS5pZ25vcmVGaWxsZWRSZXF1ZXN0cyA9IHQuaWdub3JlRmlsbGVkUmVxdWVzdHMpLCBudWxsICE9IHQucmVxdWVzdENhcCAmJiB0Lmhhc093blByb3BlcnR5KCdyZXF1ZXN0Q2FwJykgJiYgKGUucmVxdWVzdENhcCA9IHQucmVxdWVzdENhcCksIG51bGwgIT0gdC5pbXByZXNzaW9uQ2FwICYmIHQuaGFzT3duUHJvcGVydHkoJ2ltcHJlc3Npb25DYXAnKSAmJiAoZS5pbXByZXNzaW9uQ2FwID0gdC5pbXByZXNzaW9uQ2FwKSwgbnVsbCAhPSB0LnN1Y2Nlc3NSYXRlICYmIHQuaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3NSYXRlJykgJiYgKGUuc3VjY2Vzc1JhdGUgPSBpLmpzb24gJiYgIWlzRmluaXRlKHQuc3VjY2Vzc1JhdGUpID8gU3RyaW5nKHQuc3VjY2Vzc1JhdGUpIDogdC5zdWNjZXNzUmF0ZSksIG51bGwgIT0gdC5saW5lSXRlbVByaW9yaXR5ICYmIHQuaGFzT3duUHJvcGVydHkoJ2xpbmVJdGVtUHJpb3JpdHknKSAmJiAoZS5saW5lSXRlbVByaW9yaXR5ID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0xpbmVJdGVtUHJpb3JpdHlbdC5saW5lSXRlbVByaW9yaXR5XSA6IHQubGluZUl0ZW1Qcmlvcml0eSksIG51bGwgIT0gdC5oZWFkZXJCaWRkZXJCaWRzICYmIHQuaGFzT3duUHJvcGVydHkoJ2hlYWRlckJpZGRlckJpZHMnKSAmJiAoZS5oZWFkZXJCaWRkZXJCaWRzID0gdC5oZWFkZXJCaWRkZXJCaWRzKSwgbnVsbCAhPSB0LmhlYWRlckJpZGRlclRpbWVvdXQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaGVhZGVyQmlkZGVyVGltZW91dCcpICYmIChlLmhlYWRlckJpZGRlclRpbWVvdXQgPSB0LmhlYWRlckJpZGRlclRpbWVvdXQpLCBudWxsICE9IHQubWVkaWFDcmVhdGl2ZUNsaWNrVXJsICYmIHQuaGFzT3duUHJvcGVydHkoJ21lZGlhQ3JlYXRpdmVDbGlja1VybCcpICYmIChlLm1lZGlhQ3JlYXRpdmVDbGlja1VybCA9IHQubWVkaWFDcmVhdGl2ZUNsaWNrVXJsKSwgbnVsbCAhPSB0LnJlc2V0UmVxdWVzdHNDYXBUaW1lICYmIHQuaGFzT3duUHJvcGVydHkoJ3Jlc2V0UmVxdWVzdHNDYXBUaW1lJykgJiYgKGUucmVzZXRSZXF1ZXN0c0NhcFRpbWUgPSB0LnJlc2V0UmVxdWVzdHNDYXBUaW1lKSwgbnVsbCAhPSB0LnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lICYmIHQuaGFzT3duUHJvcGVydHkoJ3Jlc2V0SW1wcmVzc2lvbnNDYXBUaW1lJykgJiYgKGUucmVzZXRJbXByZXNzaW9uc0NhcFRpbWUgPSB0LnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lKSwgbnVsbCAhPSB0LnJlc2V0Q2FwVHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCdyZXNldENhcFR5cGUnKSAmJiAoZS5yZXNldENhcFR5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvUmVzZXRDYXBUeXBlRW51bVt0LnJlc2V0Q2FwVHlwZV0gOiB0LnJlc2V0Q2FwVHlwZSksIG51bGwgIT0gdC5jcmVhdGl2ZUhsc0ZpbGVOYW1lICYmIHQuaGFzT3duUHJvcGVydHkoJ2NyZWF0aXZlSGxzRmlsZU5hbWUnKSAmJiAoZS5jcmVhdGl2ZUhsc0ZpbGVOYW1lID0gdC5jcmVhdGl2ZUhsc0ZpbGVOYW1lKSwgbnVsbCAhPSB0LnRpbWVCZXR3ZWVuUmVxdWVzdHMgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndGltZUJldHdlZW5SZXF1ZXN0cycpICYmIChlLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSB0LnRpbWVCZXR3ZWVuUmVxdWVzdHMpLCBudWxsICE9IHQuc2tpcE1vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc2tpcE1vZGUnKSAmJiAoZS5za2lwTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9BZFNraXBNb2RlW3Quc2tpcE1vZGVdIDogdC5za2lwTW9kZSksIG51bGwgIT0gdC5tZWRpYUlkVGFyZ2V0aW5nICYmIHQuaGFzT3duUHJvcGVydHkoJ21lZGlhSWRUYXJnZXRpbmcnKSAmJiAoZS5tZWRpYUlkVGFyZ2V0aW5nID0gYy5Qcm90b1RhcmdldGluZ0Nob2ljZU1vZGVsLnRvT2JqZWN0KHQubWVkaWFJZFRhcmdldGluZywgaSkpLCBudWxsICE9IHQubWVkaWFLZXl3b3Jkc1RhcmdldGluZyAmJiB0Lmhhc093blByb3BlcnR5KCdtZWRpYUtleXdvcmRzVGFyZ2V0aW5nJykgJiYgKGUubWVkaWFLZXl3b3Jkc1RhcmdldGluZyA9IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbC50b09iamVjdCh0Lm1lZGlhS2V5d29yZHNUYXJnZXRpbmcsIGkpKSwgbnVsbCAhPSB0Lm1lZGlhTGFuZ3VhZ2VUYXJnZXRpbmcgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFMYW5ndWFnZVRhcmdldGluZycpICYmIChlLm1lZGlhTGFuZ3VhZ2VUYXJnZXRpbmcgPSBjLlByb3RvVGFyZ2V0aW5nQ2hvaWNlTW9kZWwudG9PYmplY3QodC5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nLCBpKSksIG51bGwgIT0gdC5hZFR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRUeXBlJykgJiYgKGUuYWRUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0FkVHlwZVt0LmFkVHlwZV0gOiB0LmFkVHlwZSksIG51bGwgIT0gdC5vdmVybGF5VGltZSAmJiB0Lmhhc093blByb3BlcnR5KCdvdmVybGF5VGltZScpICYmIChlLm92ZXJsYXlUaW1lID0gdC5vdmVybGF5VGltZSksIG51bGwgIT0gdC5mbG9vclByaWNlICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb29yUHJpY2UnKSAmJiAoZS5mbG9vclByaWNlID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LmZsb29yUHJpY2UpID8gU3RyaW5nKHQuZmxvb3JQcmljZSkgOiB0LmZsb29yUHJpY2UpLCBudWxsICE9IHQuYWRCcmVha1NldHRpbmdzICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkQnJlYWtTZXR0aW5ncycpICYmIChlLmFkQnJlYWtTZXR0aW5ncyA9IGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtTZXR0aW5ncy50b09iamVjdCh0LmFkQnJlYWtTZXR0aW5ncywgaSkpLCB0LmZsb29yUHJpY2VzICYmIHQuZmxvb3JQcmljZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZsb29yUHJpY2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5mbG9vclByaWNlcy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZsb29yUHJpY2VzW3NdID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LmZsb29yUHJpY2VzW3NdKSA/IFN0cmluZyh0LmZsb29yUHJpY2VzW3NdKSA6IHQuZmxvb3JQcmljZXNbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5iaWRSYXRlICYmIHQuaGFzT3duUHJvcGVydHkoJ2JpZFJhdGUnKSAmJiAoZS5iaWRSYXRlID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LmJpZFJhdGUpID8gU3RyaW5nKHQuYmlkUmF0ZSkgOiB0LmJpZFJhdGUpLCBudWxsICE9IHQucGF1c2VBZE91dE9mVmlldyAmJiB0Lmhhc093blByb3BlcnR5KCdwYXVzZUFkT3V0T2ZWaWV3JykgJiYgKGUucGF1c2VBZE91dE9mVmlldyA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbVBhdXNlQWRPdXRPZlZpZXdFbnVtW3QucGF1c2VBZE91dE9mVmlld10gOiB0LnBhdXNlQWRPdXRPZlZpZXcpLCBudWxsICE9IHQubW9hdFRyYWNraW5nRW5hYmxlZCAmJiB0Lmhhc093blByb3BlcnR5KCdtb2F0VHJhY2tpbmdFbmFibGVkJykgJiYgKGUubW9hdFRyYWNraW5nRW5hYmxlZCA9IHQubW9hdFRyYWNraW5nRW5hYmxlZCksIG51bGwgIT0gdC5jbnhDcmVhdGl2ZUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ2NueENyZWF0aXZlSWQnKSAmJiAoZS5jbnhDcmVhdGl2ZUlkID0gdC5jbnhDcmVhdGl2ZUlkKSwgbnVsbCAhPSB0LmJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXIgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYmxvY2tlZERvbWFpbnNSZXZpc2lvbk51bWJlcicpICYmIChlLmJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXIgPSB0LmJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXIpLCB0LmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nICYmIHQuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nW3NdID0gYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwudG9PYmplY3QodC5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZ1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZyAmJiB0LnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nW3NdID0gYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwudG9PYmplY3QodC5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nW3NdLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LnBsYXllclNpemVUYXJnZXRpbmdzICYmIHQuaGFzT3duUHJvcGVydHkoJ3BsYXllclNpemVUYXJnZXRpbmdzJykgJiYgKGUucGxheWVyU2l6ZVRhcmdldGluZ3MgPSBjLlByb3RvUGxheWVyU2l6ZVRhcmdldGluZ3MudG9PYmplY3QodC5wbGF5ZXJTaXplVGFyZ2V0aW5ncywgaSkpLCBudWxsICE9IHQuYW1hem9uRGVhbElkICYmIHQuaGFzT3duUHJvcGVydHkoJ2FtYXpvbkRlYWxJZCcpICYmIChlLmFtYXpvbkRlYWxJZCA9IHQuYW1hem9uRGVhbElkKSwgbnVsbCAhPSB0LnBsYXllclNpemUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncGxheWVyU2l6ZScpICYmIChlLnBsYXllclNpemUgPSB0LnBsYXllclNpemUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuY2hvaWNlQ3JpdGVyaWEgPSAwLCB0LnByb3RvdHlwZS5pdGVtcyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbCgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNob2ljZUNyaXRlcmlhID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaXRlbXMgJiYgcy5pdGVtcy5sZW5ndGggfHwgKHMuaXRlbXMgPSBbXSksIHMuaXRlbXMucHVzaCh0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKGUuaXRlbXMgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUuY2hvaWNlQ3JpdGVyaWEgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnT25seScgOiAwKSwgbnVsbCAhPSB0LmNob2ljZUNyaXRlcmlhICYmIHQuaGFzT3duUHJvcGVydHkoJ2Nob2ljZUNyaXRlcmlhJykgJiYgKGUuY2hvaWNlQ3JpdGVyaWEgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQ2hvaWNlQ3JpdGVyaWFFbnVtW3QuY2hvaWNlQ3JpdGVyaWFdIDogdC5jaG9pY2VDcml0ZXJpYSksIHQuaXRlbXMgJiYgdC5pdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgdC5pdGVtcy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLml0ZW1zW3NdID0gdC5pdGVtc1tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQ29udGV4dHVhbFRhcmdldGluZ0Nhc2VNb2RlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycyA9IFtdLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5maWx0ZXJzID0gby5lbXB0eUFycmF5LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5maWx0ZXJzICYmIHMuZmlsdGVycy5sZW5ndGggfHwgKHMuZmlsdGVycyA9IFtdKSwgcy5maWx0ZXJzLnB1c2goYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdGaWx0ZXJNb2RlbC5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5maWx0ZXJzID0gW10pLCB0LmZpbHRlcnMgJiYgdC5maWx0ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5maWx0ZXJzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuZmlsdGVycy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZpbHRlcnNbc10gPSBjLlByb3RvQ29udGV4dHVhbFRhcmdldGluZ0ZpbHRlck1vZGVsLnRvT2JqZWN0KHQuZmlsdGVyc1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdGaWx0ZXJNb2RlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHlwZSA9IDAsIHQucHJvdG90eXBlLml0ZW1zID0gby5lbXB0eUFycmF5LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdGaWx0ZXJNb2RlbCgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pdGVtcyAmJiBzLml0ZW1zLmxlbmd0aCB8fCAocy5pdGVtcyA9IFtdKSwgcy5pdGVtcy5wdXNoKHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5pdGVtcyA9IFtdKSwgaS5kZWZhdWx0cyAmJiAoZS50eXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0luY2x1ZGVBbnknIDogMCksIG51bGwgIT0gdC50eXBlICYmIHQuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSAmJiAoZS50eXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0xpbmVJdGVtQ29udGV4dHVhbFRhcmdldGluZ0VudW1bdC50eXBlXSA6IHQudHlwZSksIHQuaXRlbXMgJiYgdC5pdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaXRlbXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgdC5pdGVtcy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLml0ZW1zW3NdID0gdC5pdGVtc1tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyU2l6ZVRhcmdldGluZ3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5zaXplQ2hvaWNlQ3JpdGVyaWEgPSAwLCB0LnByb3RvdHlwZS5taW5XaWR0aCA9IDAsIHQucHJvdG90eXBlLm1heFdpZHRoID0gMCwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9QbGF5ZXJTaXplVGFyZ2V0aW5ncygpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNpemVDaG9pY2VDcml0ZXJpYSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1pbldpZHRoID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWF4V2lkdGggPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5zaXplQ2hvaWNlQ3JpdGVyaWEgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnR3JlYXRlclRoYW4nIDogMCwgZS5taW5XaWR0aCA9IDAsIGUubWF4V2lkdGggPSAwKSwgbnVsbCAhPSB0LnNpemVDaG9pY2VDcml0ZXJpYSAmJiB0Lmhhc093blByb3BlcnR5KCdzaXplQ2hvaWNlQ3JpdGVyaWEnKSAmJiAoZS5zaXplQ2hvaWNlQ3JpdGVyaWEgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvU2l6ZUNob2ljZUNyaXRlcmlhRW51bVt0LnNpemVDaG9pY2VDcml0ZXJpYV0gOiB0LnNpemVDaG9pY2VDcml0ZXJpYSksIG51bGwgIT0gdC5taW5XaWR0aCAmJiB0Lmhhc093blByb3BlcnR5KCdtaW5XaWR0aCcpICYmIChlLm1pbldpZHRoID0gdC5taW5XaWR0aCksIG51bGwgIT0gdC5tYXhXaWR0aCAmJiB0Lmhhc093blByb3BlcnR5KCdtYXhXaWR0aCcpICYmIChlLm1heFdpZHRoID0gdC5tYXhXaWR0aCksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1JlbmRpdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmhlaWdodCA9IDAsIHQucHJvdG90eXBlLmNvZGVjID0gJycsIHQucHJvdG90eXBlLmZpbGUgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9SZW5kaXRpb24oKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWlnaHQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb2RlYyA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5maWxlID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmhlaWdodCA9IDAsIGUuY29kZWMgPSAnJywgZS5maWxlID0gJycpLCBudWxsICE9IHQuaGVpZ2h0ICYmIHQuaGFzT3duUHJvcGVydHkoJ2hlaWdodCcpICYmIChlLmhlaWdodCA9IHQuaGVpZ2h0KSwgbnVsbCAhPSB0LmNvZGVjICYmIHQuaGFzT3duUHJvcGVydHkoJ2NvZGVjJykgJiYgKGUuY29kZWMgPSB0LmNvZGVjKSwgbnVsbCAhPSB0LmZpbGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmlsZScpICYmIChlLmZpbGUgPSB0LmZpbGUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaXZlTWVkaWFNZXRhZGF0YVJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuc3RhcnREYXRlID0gJycsIHQucHJvdG90eXBlLm91dHB1dFVybCA9ICcnLCB0LnByb3RvdHlwZS50aHVtYm5haWxVcmwgPSAnJywgdC5wcm90b3R5cGUuYWx0VGV4dCA9ICcnLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0xpdmVNZWRpYU1ldGFkYXRhUmVzcG9uc2UoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdGFydERhdGUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub3V0cHV0VXJsID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRodW1ibmFpbFVybCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hbHRUZXh0ID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLnN0YXJ0RGF0ZSA9ICcnLCBlLm91dHB1dFVybCA9ICcnLCBlLnRodW1ibmFpbFVybCA9ICcnLCBlLmFsdFRleHQgPSAnJyksIG51bGwgIT0gdC5zdGFydERhdGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc3RhcnREYXRlJykgJiYgKGUuc3RhcnREYXRlID0gdC5zdGFydERhdGUpLCBudWxsICE9IHQub3V0cHV0VXJsICYmIHQuaGFzT3duUHJvcGVydHkoJ291dHB1dFVybCcpICYmIChlLm91dHB1dFVybCA9IHQub3V0cHV0VXJsKSwgbnVsbCAhPSB0LnRodW1ibmFpbFVybCAmJiB0Lmhhc093blByb3BlcnR5KCd0aHVtYm5haWxVcmwnKSAmJiAoZS50aHVtYm5haWxVcmwgPSB0LnRodW1ibmFpbFVybCksIG51bGwgIT0gdC5hbHRUZXh0ICYmIHQuaGFzT3duUHJvcGVydHkoJ2FsdFRleHQnKSAmJiAoZS5hbHRUZXh0ID0gdC5hbHRUZXh0KSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTG9nZ2luZ1JlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5tZXNzYWdlID0gJycsIHQucHJvdG90eXBlLnZlcnNpb24gPSAwLCB0LnByb3RvdHlwZS5sZXZlbCA9IDAsIHQucHJvdG90eXBlLmNhbGxTdGFjayA9ICcnLCB0LnByb3RvdHlwZS5wYWdlVXJsID0gJycsIHQucHJvdG90eXBlLmV4Y2VwdGlvbiA9ICcnLCB0LnByb3RvdHlwZS5zZXNzaW9uSWQgPSAnJywgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQubWVzc2FnZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWVzc2FnZScpICYmIGkudWludDMyKDEwKS5zdHJpbmcodC5tZXNzYWdlKSwgbnVsbCAhPSB0LnZlcnNpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3ZlcnNpb24nKSAmJiBpLnVpbnQzMigxNikuaW50MzIodC52ZXJzaW9uKSwgbnVsbCAhPSB0LmxldmVsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdsZXZlbCcpICYmIGkudWludDMyKDI0KS5pbnQzMih0LmxldmVsKSwgbnVsbCAhPSB0LmNhbGxTdGFjayAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY2FsbFN0YWNrJykgJiYgaS51aW50MzIoMzQpLnN0cmluZyh0LmNhbGxTdGFjayksIG51bGwgIT0gdC5wYWdlVXJsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwYWdlVXJsJykgJiYgaS51aW50MzIoNDIpLnN0cmluZyh0LnBhZ2VVcmwpLCBudWxsICE9IHQuZXhjZXB0aW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdleGNlcHRpb24nKSAmJiBpLnVpbnQzMig1MCkuc3RyaW5nKHQuZXhjZXB0aW9uKSwgbnVsbCAhPSB0LnNlc3Npb25JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnc2Vzc2lvbklkJykgJiYgaS51aW50MzIoNTgpLnN0cmluZyh0LnNlc3Npb25JZCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvTG9nZ2luZ1JlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0xvZ2dpbmdSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobnVsbCAhPSB0Lm1lc3NhZ2UgJiYgKGkubWVzc2FnZSA9IFN0cmluZyh0Lm1lc3NhZ2UpKSwgbnVsbCAhPSB0LnZlcnNpb24gJiYgKGkudmVyc2lvbiA9IDAgfCB0LnZlcnNpb24pLCB0LmxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ZBVEFMJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sZXZlbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0FSTklORyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0lORk8nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxldmVsID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LmNhbGxTdGFjayAmJiAoaS5jYWxsU3RhY2sgPSBTdHJpbmcodC5jYWxsU3RhY2spKSwgbnVsbCAhPSB0LnBhZ2VVcmwgJiYgKGkucGFnZVVybCA9IFN0cmluZyh0LnBhZ2VVcmwpKSwgbnVsbCAhPSB0LmV4Y2VwdGlvbiAmJiAoaS5leGNlcHRpb24gPSBTdHJpbmcodC5leGNlcHRpb24pKSwgbnVsbCAhPSB0LnNlc3Npb25JZCAmJiAoaS5zZXNzaW9uSWQgPSBTdHJpbmcodC5zZXNzaW9uSWQpKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvU3ByaXRlU2hlZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5maWxlID0gJycsIHQucHJvdG90eXBlLmhlaWdodCA9IDAsIHQucHJvdG90eXBlLmNvdW50ID0gMCwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9TcHJpdGVTaGVldCgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZpbGUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaGVpZ2h0ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY291bnQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5maWxlID0gJycsIGUuaGVpZ2h0ID0gMCwgZS5jb3VudCA9IDApLCBudWxsICE9IHQuZmlsZSAmJiB0Lmhhc093blByb3BlcnR5KCdmaWxlJykgJiYgKGUuZmlsZSA9IHQuZmlsZSksIG51bGwgIT0gdC5oZWlnaHQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaGVpZ2h0JykgJiYgKGUuaGVpZ2h0ID0gdC5oZWlnaHQpLCBudWxsICE9IHQuY291bnQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY291bnQnKSAmJiAoZS5jb3VudCA9IHQuY291bnQpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9UcmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmZpbGUgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9UcmFjaygpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZpbGUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUuZmlsZSA9ICcnKSwgbnVsbCAhPSB0LmZpbGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmlsZScpICYmIChlLmZpbGUgPSB0LmZpbGUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9DdXN0b21GaWVsZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLm5hbWUgPSAnJywgdC5wcm90b3R5cGUudmFsdWUgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9DdXN0b21GaWVsZCgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm5hbWUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudmFsdWUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUubmFtZSA9ICcnLCBlLnZhbHVlID0gJycpLCBudWxsICE9IHQubmFtZSAmJiB0Lmhhc093blByb3BlcnR5KCduYW1lJykgJiYgKGUubmFtZSA9IHQubmFtZSksIG51bGwgIT0gdC52YWx1ZSAmJiB0Lmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIChlLnZhbHVlID0gdC52YWx1ZSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b01lZGlhTWV0YWRhdGFSZXNwb25zZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5d29yZExpc3QgPSBbXSwgdGhpcy50cmFja0xpc3QgPSBbXSwgdGhpcy5yZW5kaXRpb25MaXN0ID0gW10sIHRoaXMuY3VzdG9tRmllbGRzID0gW10sIHRoaXMudmlkZW9JbmRleGVzID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRpdGxlID0gJycsIHQucHJvdG90eXBlLmRlc2NyaXB0aW9uID0gJycsIHQucHJvdG90eXBlLmR1cmF0aW9uID0gMCwgdC5wcm90b3R5cGUuY2xpY2tVcmwgPSAnJywgdC5wcm90b3R5cGUua2V5d29yZExpc3QgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLnRyYWNrTGlzdCA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuc3ByaXRlU2hlZXQgPSBudWxsLCB0LnByb3RvdHlwZS50aHVtYm5haWwgPSAnJywgdC5wcm90b3R5cGUucmVuZGl0aW9uTGlzdCA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuY3VzdG9tRmllbGRzID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5obHNGaWxlUGF0aCA9ICcnLCB0LnByb3RvdHlwZS5sYW5ndWFnZUlkID0gJycsIHQucHJvdG90eXBlLnNvdXJjZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hbHRUZXh0ID0gJycsIHQucHJvdG90eXBlLnZpZGVvSW5kZXhlcyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9NZWRpYU1ldGFkYXRhUmVzcG9uc2UoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50aXRsZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kZXNjcmlwdGlvbiA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kdXJhdGlvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNsaWNrVXJsID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmtleXdvcmRMaXN0ICYmIHMua2V5d29yZExpc3QubGVuZ3RoIHx8IChzLmtleXdvcmRMaXN0ID0gW10pLCBzLmtleXdvcmRMaXN0LnB1c2godC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50cmFja0xpc3QgJiYgcy50cmFja0xpc3QubGVuZ3RoIHx8IChzLnRyYWNrTGlzdCA9IFtdKSwgcy50cmFja0xpc3QucHVzaChjLlByb3RvVHJhY2suZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNwcml0ZVNoZWV0ID0gYy5Qcm90b1Nwcml0ZVNoZWV0LmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRodW1ibmFpbCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZW5kaXRpb25MaXN0ICYmIHMucmVuZGl0aW9uTGlzdC5sZW5ndGggfHwgKHMucmVuZGl0aW9uTGlzdCA9IFtdKSwgcy5yZW5kaXRpb25MaXN0LnB1c2goYy5Qcm90b1JlbmRpdGlvbi5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmN1c3RvbUZpZWxkcyAmJiBzLmN1c3RvbUZpZWxkcy5sZW5ndGggfHwgKHMuY3VzdG9tRmllbGRzID0gW10pLCBzLmN1c3RvbUZpZWxkcy5wdXNoKGMuUHJvdG9DdXN0b21GaWVsZC5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmhsc0ZpbGVQYXRoID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sYW5ndWFnZUlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zb3VyY2VJdGVtSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFsdFRleHQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnZpZGVvSW5kZXhlcyAmJiBzLnZpZGVvSW5kZXhlcy5sZW5ndGggfHwgKHMudmlkZW9JbmRleGVzID0gW10pLCBzLnZpZGVvSW5kZXhlcy5wdXNoKHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5rZXl3b3JkTGlzdCA9IFtdLCBlLnRyYWNrTGlzdCA9IFtdLCBlLnJlbmRpdGlvbkxpc3QgPSBbXSwgZS5jdXN0b21GaWVsZHMgPSBbXSwgZS52aWRlb0luZGV4ZXMgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUudGl0bGUgPSAnJywgZS5kZXNjcmlwdGlvbiA9ICcnLCBlLmR1cmF0aW9uID0gMCwgZS5jbGlja1VybCA9ICcnLCBlLnNwcml0ZVNoZWV0ID0gbnVsbCwgZS50aHVtYm5haWwgPSAnJywgZS5obHNGaWxlUGF0aCA9ICcnLCBlLmxhbmd1YWdlSWQgPSAnJywgZS5zb3VyY2VJdGVtSWQgPSAnJywgZS5hbHRUZXh0ID0gJycpLCBudWxsICE9IHQudGl0bGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndGl0bGUnKSAmJiAoZS50aXRsZSA9IHQudGl0bGUpLCBudWxsICE9IHQuZGVzY3JpcHRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZGVzY3JpcHRpb24nKSAmJiAoZS5kZXNjcmlwdGlvbiA9IHQuZGVzY3JpcHRpb24pLCBudWxsICE9IHQuZHVyYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZHVyYXRpb24nKSAmJiAoZS5kdXJhdGlvbiA9IHQuZHVyYXRpb24pLCBudWxsICE9IHQuY2xpY2tVcmwgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY2xpY2tVcmwnKSAmJiAoZS5jbGlja1VybCA9IHQuY2xpY2tVcmwpLCB0LmtleXdvcmRMaXN0ICYmIHQua2V5d29yZExpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmtleXdvcmRMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQua2V5d29yZExpc3QubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5rZXl3b3JkTGlzdFtzXSA9IHQua2V5d29yZExpc3Rbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQudHJhY2tMaXN0ICYmIHQudHJhY2tMaXN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50cmFja0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LnRyYWNrTGlzdC5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRyYWNrTGlzdFtzXSA9IGMuUHJvdG9UcmFjay50b09iamVjdCh0LnRyYWNrTGlzdFtzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5zcHJpdGVTaGVldCAmJiB0Lmhhc093blByb3BlcnR5KCdzcHJpdGVTaGVldCcpICYmIChlLnNwcml0ZVNoZWV0ID0gYy5Qcm90b1Nwcml0ZVNoZWV0LnRvT2JqZWN0KHQuc3ByaXRlU2hlZXQsIGkpKSwgbnVsbCAhPSB0LnRodW1ibmFpbCAmJiB0Lmhhc093blByb3BlcnR5KCd0aHVtYm5haWwnKSAmJiAoZS50aHVtYm5haWwgPSB0LnRodW1ibmFpbCksIHQucmVuZGl0aW9uTGlzdCAmJiB0LnJlbmRpdGlvbkxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbmRpdGlvbkxpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LnJlbmRpdGlvbkxpc3QubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW5kaXRpb25MaXN0W3NdID0gYy5Qcm90b1JlbmRpdGlvbi50b09iamVjdCh0LnJlbmRpdGlvbkxpc3Rbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmN1c3RvbUZpZWxkcyAmJiB0LmN1c3RvbUZpZWxkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3VzdG9tRmllbGRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5jdXN0b21GaWVsZHMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jdXN0b21GaWVsZHNbc10gPSBjLlByb3RvQ3VzdG9tRmllbGQudG9PYmplY3QodC5jdXN0b21GaWVsZHNbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuaGxzRmlsZVBhdGggJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaGxzRmlsZVBhdGgnKSAmJiAoZS5obHNGaWxlUGF0aCA9IHQuaGxzRmlsZVBhdGgpLCBudWxsICE9IHQubGFuZ3VhZ2VJZCAmJiB0Lmhhc093blByb3BlcnR5KCdsYW5ndWFnZUlkJykgJiYgKGUubGFuZ3VhZ2VJZCA9IHQubGFuZ3VhZ2VJZCksIG51bGwgIT0gdC5zb3VyY2VJdGVtSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc291cmNlSXRlbUlkJykgJiYgKGUuc291cmNlSXRlbUlkID0gdC5zb3VyY2VJdGVtSWQpLCBudWxsICE9IHQuYWx0VGV4dCAmJiB0Lmhhc093blByb3BlcnR5KCdhbHRUZXh0JykgJiYgKGUuYWx0VGV4dCA9IHQuYWx0VGV4dCksIHQudmlkZW9JbmRleGVzICYmIHQudmlkZW9JbmRleGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS52aWRlb0luZGV4ZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LnZpZGVvSW5kZXhlcy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnZpZGVvSW5kZXhlc1tzXSA9IHQudmlkZW9JbmRleGVzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9SdGJSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lSXRlbXMgPSB7fSwgdGhpcy5jdXN0b21NYWNyb3MgPSB7fSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUubWV0YWRhdGEgPSBudWxsLCB0LnByb3RvdHlwZS5jb3BwYSA9ICExLCB0LnByb3RvdHlwZS5yZWZlcmVyVXJsID0gJycsIHQucHJvdG90eXBlLnRlc3RNb2RlID0gITEsIHQucHJvdG90eXBlLnZpZGVvV2lkdGggPSAwLCB0LnByb3RvdHlwZS52aWRlb0hlaWdodCA9IDAsIHQucHJvdG90eXBlLmdkcHJDb21wbGlhbnQgPSAhMSwgdC5wcm90b3R5cGUuc291bmRPbiA9ICExLCB0LnByb3RvdHlwZS5nZHByQ29uc2VudERhdGEgPSAnJywgdC5wcm90b3R5cGUuZXhwbG9yYXRpb25Nb2RlID0gITEsIHQucHJvdG90eXBlLnZpZXdhYmlsaXR5ID0gITEsIHQucHJvdG90eXBlLm91dHN0cmVhbSA9ICExLCB0LnByb3RvdHlwZS5kb21haW5VUkwgPSAnJywgdC5wcm90b3R5cGUuaXNDbGlja1RvUGxheSA9ICExLCB0LnByb3RvdHlwZS5hcHBWZXJzaW9uID0gJycsIHQucHJvdG90eXBlLmRldmljZUlEID0gJycsIHQucHJvdG90eXBlLmxpbmVJdGVtcyA9IG8uZW1wdHlPYmplY3QsIHQucHJvdG90eXBlLmlzQ2NwYUJsb2NraW5nVXNlckluZm8gPSAhMSwgdC5wcm90b3R5cGUudXNQcml2YWN5U3RyaW5nID0gJycsIHQucHJvdG90eXBlLmFkU2tpcHBhYmlsaXR5ID0gMCwgdC5wcm90b3R5cGUuc2tpcEFkQWZ0ZXIgPSA1LCB0LnByb3RvdHlwZS5nZHByQ29uc2VudE1vZGUgPSAwLCB0LnByb3RvdHlwZS5tYXhBZER1cmF0aW9uID0gMTgwLCB0LnByb3RvdHlwZS5jdXN0b21NYWNyb3MgPSBvLmVtcHR5T2JqZWN0LCB0LnByb3RvdHlwZS5tYXhCaWRQcmljZSA9IDAsIHQucHJvdG90eXBlLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiA9IDMxLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC5tZXRhZGF0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWV0YWRhdGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQubWV0YWRhdGEsIGkudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLCBudWxsICE9IHQuY29wcGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NvcHBhJykgJiYgaS51aW50MzIoMzIpLmJvb2wodC5jb3BwYSksIG51bGwgIT0gdC5yZWZlcmVyVXJsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdyZWZlcmVyVXJsJykgJiYgaS51aW50MzIoNDIpLnN0cmluZyh0LnJlZmVyZXJVcmwpLCBudWxsICE9IHQudGVzdE1vZGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3Rlc3RNb2RlJykgJiYgaS51aW50MzIoNDgpLmJvb2wodC50ZXN0TW9kZSksIG51bGwgIT0gdC52aWRlb1dpZHRoICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd2aWRlb1dpZHRoJykgJiYgaS51aW50MzIoNTYpLmludDMyKHQudmlkZW9XaWR0aCksIG51bGwgIT0gdC52aWRlb0hlaWdodCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndmlkZW9IZWlnaHQnKSAmJiBpLnVpbnQzMig2NCkuaW50MzIodC52aWRlb0hlaWdodCksIG51bGwgIT0gdC5nZHByQ29tcGxpYW50ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdnZHByQ29tcGxpYW50JykgJiYgaS51aW50MzIoNzIpLmJvb2wodC5nZHByQ29tcGxpYW50KSwgbnVsbCAhPSB0LnNvdW5kT24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3NvdW5kT24nKSAmJiBpLnVpbnQzMig4MCkuYm9vbCh0LnNvdW5kT24pLCBudWxsICE9IHQuZ2RwckNvbnNlbnREYXRhICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdnZHByQ29uc2VudERhdGEnKSAmJiBpLnVpbnQzMig5MCkuc3RyaW5nKHQuZ2RwckNvbnNlbnREYXRhKSwgbnVsbCAhPSB0LmV4cGxvcmF0aW9uTW9kZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZXhwbG9yYXRpb25Nb2RlJykgJiYgaS51aW50MzIoOTYpLmJvb2wodC5leHBsb3JhdGlvbk1vZGUpLCBudWxsICE9IHQudmlld2FiaWxpdHkgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3ZpZXdhYmlsaXR5JykgJiYgaS51aW50MzIoMTA0KS5ib29sKHQudmlld2FiaWxpdHkpLCBudWxsICE9IHQub3V0c3RyZWFtICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdvdXRzdHJlYW0nKSAmJiBpLnVpbnQzMigxMTIpLmJvb2wodC5vdXRzdHJlYW0pLCBudWxsICE9IHQuZG9tYWluVVJMICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkb21haW5VUkwnKSAmJiBpLnVpbnQzMigxMzApLnN0cmluZyh0LmRvbWFpblVSTCksIG51bGwgIT0gdC5pc0NsaWNrVG9QbGF5ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdpc0NsaWNrVG9QbGF5JykgJiYgaS51aW50MzIoMTQ0KS5ib29sKHQuaXNDbGlja1RvUGxheSksIG51bGwgIT0gdC5hcHBWZXJzaW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhcHBWZXJzaW9uJykgJiYgaS51aW50MzIoMTcwKS5zdHJpbmcodC5hcHBWZXJzaW9uKSwgbnVsbCAhPSB0LmRldmljZUlEICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkZXZpY2VJRCcpICYmIGkudWludDMyKDE5NCkuc3RyaW5nKHQuZGV2aWNlSUQpLCBudWxsICE9IHQubGluZUl0ZW1zICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdsaW5lSXRlbXMnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyh0LmxpbmVJdGVtcyksIHMgPSAwOyBzIDwgZS5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnVpbnQzMigyMDIpLmZvcmsoKS51aW50MzIoMTApLnN0cmluZyhlW3NdKSwgYy5Qcm90b1J0YlJlcXVlc3RMaW5lSXRlbUVudHJ5LmVuY29kZSh0LmxpbmVJdGVtc1tlW3NdXSwgaS51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCkubGRlbGltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuaXNDY3BhQmxvY2tpbmdVc2VySW5mbyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaXNDY3BhQmxvY2tpbmdVc2VySW5mbycpICYmIGkudWludDMyKDIwOCkuYm9vbCh0LmlzQ2NwYUJsb2NraW5nVXNlckluZm8pLCBudWxsICE9IHQudXNQcml2YWN5U3RyaW5nICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd1c1ByaXZhY3lTdHJpbmcnKSAmJiBpLnVpbnQzMigyMTgpLnN0cmluZyh0LnVzUHJpdmFjeVN0cmluZyksIG51bGwgIT0gdC5hZFNraXBwYWJpbGl0eSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWRTa2lwcGFiaWxpdHknKSAmJiBpLnVpbnQzMigyNTYpLmludDMyKHQuYWRTa2lwcGFiaWxpdHkpLCBudWxsICE9IHQuc2tpcEFkQWZ0ZXIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3NraXBBZEFmdGVyJykgJiYgaS51aW50MzIoMjY0KS5pbnQzMih0LnNraXBBZEFmdGVyKSwgbnVsbCAhPSB0LmdkcHJDb25zZW50TW9kZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZ2RwckNvbnNlbnRNb2RlJykgJiYgaS51aW50MzIoMjg4KS5pbnQzMih0LmdkcHJDb25zZW50TW9kZSksIG51bGwgIT0gdC5tYXhBZER1cmF0aW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdtYXhBZER1cmF0aW9uJykgJiYgaS51aW50MzIoMjk2KS5pbnQzMih0Lm1heEFkRHVyYXRpb24pLCBudWxsICE9IHQuY3VzdG9tTWFjcm9zICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21NYWNyb3MnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IE9iamVjdC5rZXlzKHQuY3VzdG9tTWFjcm9zKSwgcyA9IDA7IHMgPCBlLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudWludDMyKDMwNikuZm9yaygpLnVpbnQzMigxMCkuc3RyaW5nKGVbc10pLnVpbnQzMigxOCkuc3RyaW5nKHQuY3VzdG9tTWFjcm9zW2Vbc11dKS5sZGVsaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5tYXhCaWRQcmljZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWF4QmlkUHJpY2UnKSAmJiBpLnVpbnQzMigzMTMpLmRvdWJsZSh0Lm1heEJpZFByaWNlKSwgbnVsbCAhPSB0LmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuJykgJiYgaS51aW50MzIoMzIwKS5pbnQzMih0LmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvUnRiUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvUnRiUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0Lm1ldGFkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQubWV0YWRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9SdGJSZXF1ZXN0Lm1ldGFkYXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubWV0YWRhdGEgPSBjLk1ldGFkYXRhTW9kZWwuZnJvbU9iamVjdCh0Lm1ldGFkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmNvcHBhICYmIChpLmNvcHBhID0gQm9vbGVhbih0LmNvcHBhKSksIG51bGwgIT0gdC5yZWZlcmVyVXJsICYmIChpLnJlZmVyZXJVcmwgPSBTdHJpbmcodC5yZWZlcmVyVXJsKSksIG51bGwgIT0gdC50ZXN0TW9kZSAmJiAoaS50ZXN0TW9kZSA9IEJvb2xlYW4odC50ZXN0TW9kZSkpLCBudWxsICE9IHQudmlkZW9XaWR0aCAmJiAoaS52aWRlb1dpZHRoID0gMCB8IHQudmlkZW9XaWR0aCksIG51bGwgIT0gdC52aWRlb0hlaWdodCAmJiAoaS52aWRlb0hlaWdodCA9IDAgfCB0LnZpZGVvSGVpZ2h0KSwgbnVsbCAhPSB0LmdkcHJDb21wbGlhbnQgJiYgKGkuZ2RwckNvbXBsaWFudCA9IEJvb2xlYW4odC5nZHByQ29tcGxpYW50KSksIG51bGwgIT0gdC5zb3VuZE9uICYmIChpLnNvdW5kT24gPSBCb29sZWFuKHQuc291bmRPbikpLCBudWxsICE9IHQuZ2RwckNvbnNlbnREYXRhICYmIChpLmdkcHJDb25zZW50RGF0YSA9IFN0cmluZyh0LmdkcHJDb25zZW50RGF0YSkpLCBudWxsICE9IHQuZXhwbG9yYXRpb25Nb2RlICYmIChpLmV4cGxvcmF0aW9uTW9kZSA9IEJvb2xlYW4odC5leHBsb3JhdGlvbk1vZGUpKSwgbnVsbCAhPSB0LnZpZXdhYmlsaXR5ICYmIChpLnZpZXdhYmlsaXR5ID0gQm9vbGVhbih0LnZpZXdhYmlsaXR5KSksIG51bGwgIT0gdC5vdXRzdHJlYW0gJiYgKGkub3V0c3RyZWFtID0gQm9vbGVhbih0Lm91dHN0cmVhbSkpLCBudWxsICE9IHQuZG9tYWluVVJMICYmIChpLmRvbWFpblVSTCA9IFN0cmluZyh0LmRvbWFpblVSTCkpLCBudWxsICE9IHQuaXNDbGlja1RvUGxheSAmJiAoaS5pc0NsaWNrVG9QbGF5ID0gQm9vbGVhbih0LmlzQ2xpY2tUb1BsYXkpKSwgbnVsbCAhPSB0LmFwcFZlcnNpb24gJiYgKGkuYXBwVmVyc2lvbiA9IFN0cmluZyh0LmFwcFZlcnNpb24pKSwgbnVsbCAhPSB0LmRldmljZUlEICYmIChpLmRldmljZUlEID0gU3RyaW5nKHQuZGV2aWNlSUQpKSwgdC5saW5lSXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5saW5lSXRlbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9SdGJSZXF1ZXN0LmxpbmVJdGVtczogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxpbmVJdGVtcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IE9iamVjdC5rZXlzKHQubGluZUl0ZW1zKSwgcyA9IDA7IHMgPCBlLmxlbmd0aDsgKytzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LmxpbmVJdGVtc1tlW3NdXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9SdGJSZXF1ZXN0LmxpbmVJdGVtczogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5saW5lSXRlbXNbZVtzXV0gPSBjLlByb3RvUnRiUmVxdWVzdExpbmVJdGVtRW50cnkuZnJvbU9iamVjdCh0LmxpbmVJdGVtc1tlW3NdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQuaXNDY3BhQmxvY2tpbmdVc2VySW5mbyAmJiAoaS5pc0NjcGFCbG9ja2luZ1VzZXJJbmZvID0gQm9vbGVhbih0LmlzQ2NwYUJsb2NraW5nVXNlckluZm8pKSwgbnVsbCAhPSB0LnVzUHJpdmFjeVN0cmluZyAmJiAoaS51c1ByaXZhY3lTdHJpbmcgPSBTdHJpbmcodC51c1ByaXZhY3lTdHJpbmcpKSwgdC5hZFNraXBwYWJpbGl0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJZkxvbmdlclRoYW4nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkU2tpcHBhYmlsaXR5ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBbHdheXMnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkU2tpcHBhYmlsaXR5ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb1Jlc3RyaWN0aW9ucyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRTa2lwcGFiaWxpdHkgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobnVsbCAhPSB0LnNraXBBZEFmdGVyICYmIChpLnNraXBBZEFmdGVyID0gMCB8IHQuc2tpcEFkQWZ0ZXIpLCB0LmdkcHJDb25zZW50TW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVbmtub3duJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5nZHByQ29uc2VudE1vZGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ05vQ21wJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5nZHByQ29uc2VudE1vZGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ05vQ29uc2VudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2RwckNvbnNlbnRNb2RlID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb0Nvbm5hdGl4Q29uc2VudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2RwckNvbnNlbnRNb2RlID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb3RBbGxEZW1hbmRDb25zZW50JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5nZHByQ29uc2VudE1vZGUgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FsbEdvb2QnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmdkcHJDb25zZW50TW9kZSA9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5tYXhBZER1cmF0aW9uICYmIChpLm1heEFkRHVyYXRpb24gPSAwIHwgdC5tYXhBZER1cmF0aW9uKSwgdC5jdXN0b21NYWNyb3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5jdXN0b21NYWNyb3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9SdGJSZXF1ZXN0LmN1c3RvbU1hY3Jvczogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmN1c3RvbU1hY3JvcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gT2JqZWN0LmtleXModC5jdXN0b21NYWNyb3MpLCBzID0gMDsgcyA8IGUubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jdXN0b21NYWNyb3NbZVtzXV0gPSBTdHJpbmcodC5jdXN0b21NYWNyb3NbZVtzXV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQubWF4QmlkUHJpY2UgJiYgKGkubWF4QmlkUHJpY2UgPSBOdW1iZXIodC5tYXhCaWRQcmljZSkpLCBudWxsICE9IHQuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuICYmIChpLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiA9IDAgfCB0LmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1J0YlJlcXVlc3RMaW5lSXRlbUVudHJ5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pZ25vcmVkRmxvb3JQcmljZUZhY3RvckluZGV4ZXMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuY2FjaGVkRmxvb3JQcmljZSA9IG51bGwsIHQucHJvdG90eXBlLmF2YWlsYWJsZVJlcXVlc3RzID0gMCwgdC5wcm90b3R5cGUuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5nZHByQ29uc2VudCA9ICExLCB0LnByb3RvdHlwZS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gJycsIHQucHJvdG90eXBlLnNsb3RXaWR0aCA9IDAsIHQucHJvdG90eXBlLnNsb3RIZWlnaHQgPSAwLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdUJywgewogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IG8ub25lT2ZHZXR0ZXIoaSA9IFsnY2FjaGVkRmxvb3JQcmljZSddKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBvLm9uZU9mU2V0dGVyKGkpCiAgICAgICAgICAgICAgICAgICAgfSksIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LmF2YWlsYWJsZVJlcXVlc3RzICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhdmFpbGFibGVSZXF1ZXN0cycpICYmIGkudWludDMyKDgpLmludDMyKHQuYXZhaWxhYmxlUmVxdWVzdHMpLCBudWxsICE9IHQuY2FjaGVkRmxvb3JQcmljZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY2FjaGVkRmxvb3JQcmljZScpICYmIGkudWludDMyKDE3KS5kb3VibGUodC5jYWNoZWRGbG9vclByaWNlKSwgbnVsbCAhPSB0Lmlnbm9yZWRGbG9vclByaWNlRmFjdG9ySW5kZXhlcyAmJiB0Lmlnbm9yZWRGbG9vclByaWNlRmFjdG9ySW5kZXhlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudWludDMyKDI0KS5pbnQzMih0Lmlnbm9yZWRGbG9vclByaWNlRmFjdG9ySW5kZXhlc1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQuZ2RwckNvbnNlbnQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2dkcHJDb25zZW50JykgJiYgaS51aW50MzIoMzIpLmJvb2wodC5nZHByQ29uc2VudCksIG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwdWJsaXNoZXJMaW5lSXRlbUlkJykgJiYgaS51aW50MzIoNDIpLnN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpLCBudWxsICE9IHQuc2xvdFdpZHRoICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzbG90V2lkdGgnKSAmJiBpLnVpbnQzMig0OCkuaW50MzIodC5zbG90V2lkdGgpLCBudWxsICE9IHQuc2xvdEhlaWdodCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnc2xvdEhlaWdodCcpICYmIGkudWludDMyKDU2KS5pbnQzMih0LnNsb3RIZWlnaHQpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b1J0YlJlcXVlc3RMaW5lSXRlbUVudHJ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9SdGJSZXF1ZXN0TGluZUl0ZW1FbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmNhY2hlZEZsb29yUHJpY2UgJiYgKGkuY2FjaGVkRmxvb3JQcmljZSA9IE51bWJlcih0LmNhY2hlZEZsb29yUHJpY2UpKSwgbnVsbCAhPSB0LmF2YWlsYWJsZVJlcXVlc3RzICYmIChpLmF2YWlsYWJsZVJlcXVlc3RzID0gMCB8IHQuYXZhaWxhYmxlUmVxdWVzdHMpLCB0Lmlnbm9yZWRGbG9vclByaWNlRmFjdG9ySW5kZXhlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b1J0YlJlcXVlc3RMaW5lSXRlbUVudHJ5Lmlnbm9yZWRGbG9vclByaWNlRmFjdG9ySW5kZXhlczogYXJyYXkgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzW2VdID0gMCB8IHQuaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQuZ2RwckNvbnNlbnQgJiYgKGkuZ2RwckNvbnNlbnQgPSBCb29sZWFuKHQuZ2RwckNvbnNlbnQpKSwgbnVsbCAhPSB0LnB1Ymxpc2hlckxpbmVJdGVtSWQgJiYgKGkucHVibGlzaGVyTGluZUl0ZW1JZCA9IFN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpKSwgbnVsbCAhPSB0LnNsb3RXaWR0aCAmJiAoaS5zbG90V2lkdGggPSAwIHwgdC5zbG90V2lkdGgpLCBudWxsICE9IHQuc2xvdEhlaWdodCAmJiAoaS5zbG90SGVpZ2h0ID0gMCB8IHQuc2xvdEhlaWdodCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1J0YlJlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lSXRlbVJlc3BvbnNlcyA9IFtdLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5saW5lSXRlbVJlc3BvbnNlcyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9SdGJSZXNwb25zZSgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxpbmVJdGVtUmVzcG9uc2VzICYmIHMubGluZUl0ZW1SZXNwb25zZXMubGVuZ3RoIHx8IChzLmxpbmVJdGVtUmVzcG9uc2VzID0gW10pLCBzLmxpbmVJdGVtUmVzcG9uc2VzLnB1c2goYy5Qcm90b1J0YkxpbmVJdGVtLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLmxpbmVJdGVtUmVzcG9uc2VzID0gW10pLCB0LmxpbmVJdGVtUmVzcG9uc2VzICYmIHQubGluZUl0ZW1SZXNwb25zZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxpbmVJdGVtUmVzcG9uc2VzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQubGluZUl0ZW1SZXNwb25zZXMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5saW5lSXRlbVJlc3BvbnNlc1tzXSA9IGMuUHJvdG9SdGJMaW5lSXRlbS50b09iamVjdCh0LmxpbmVJdGVtUmVzcG9uc2VzW3NdLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUnRiQmlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iaWxsaW5nTm90aWNlVXJsTGlzdCA9IFtdLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS53aW5Ob3RpY2VVcmwgPSAnJywgdC5wcm90b3R5cGUuYWRRdWFsaXR5Q2hlY2tVcmwgPSAnJywgdC5wcm90b3R5cGUudmFzdFRhZyA9ICcnLCB0LnByb3RvdHlwZS5lbmNyeXB0ZWRQcmljZSA9ICcnLCB0LnByb3RvdHlwZS5jcmVhdGl2ZUlkID0gJycsIHQucHJvdG90eXBlLnNlYXRJZCA9ICcnLCB0LnByb3RvdHlwZS5hZG9tYWluID0gJycsIHQucHJvdG90eXBlLnN5bmNlZFVzZXIgPSAhMSwgdC5wcm90b3R5cGUucmVxdWVzdGVkRmxvb3JQcmljZSA9IDAsIHQucHJvdG90eXBlLmZsb29yUHJpY2VGYWN0b3JJbmRleCA9IDAsIHQucHJvdG90eXBlLmNhbXBhaWduSWQgPSAnJywgdC5wcm90b3R5cGUud2lkdGggPSAwLCB0LnByb3RvdHlwZS5oZWlnaHQgPSAwLCB0LnByb3RvdHlwZS5iaWxsaW5nTm90aWNlVXJsTGlzdCA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUubWltZSA9ICd0ZXh0L2h0bWwnLCB0LnByb3RvdHlwZS5ndGtwYnAgPSAwLCB0LnByb3RvdHlwZS5zdWNjZXNzUmF0ZSA9IDAsIHQucHJvdG90eXBlLmltcHJlc3Npb25UaW1lU3BlbnQgPSAwLCB0LnByb3RvdHlwZS5iaWRSYXRlID0gMCwgdC5wcm90b3R5cGUuZHNwSWQgPSAnJywgdC5wcm90b3R5cGUuY254QmlkSWQgPSAnJywgdC5wcm90b3R5cGUubG9nQXVjdGlvbkluZm9ybWF0aW9uID0gITEsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvUnRiQmlkKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMud2luTm90aWNlVXJsID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkUXVhbGl0eUNoZWNrVXJsID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnZhc3RUYWcgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZW5jcnlwdGVkUHJpY2UgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY3JlYXRpdmVJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZWF0SWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRvbWFpbiA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3luY2VkVXNlciA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlcXVlc3RlZEZsb29yUHJpY2UgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb29yUHJpY2VGYWN0b3JJbmRleCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jYW1wYWlnbklkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy53aWR0aCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWlnaHQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmlsbGluZ05vdGljZVVybExpc3QgJiYgcy5iaWxsaW5nTm90aWNlVXJsTGlzdC5sZW5ndGggfHwgKHMuYmlsbGluZ05vdGljZVVybExpc3QgPSBbXSksIHMuYmlsbGluZ05vdGljZVVybExpc3QucHVzaCh0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5taW1lID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5ndGtwYnAgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1Y2Nlc3NSYXRlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXByZXNzaW9uVGltZVNwZW50ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJpZFJhdGUgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRzcElkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jbnhCaWRJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubG9nQXVjdGlvbkluZm9ybWF0aW9uID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLmJpbGxpbmdOb3RpY2VVcmxMaXN0ID0gW10pLCBpLmRlZmF1bHRzICYmIChlLndpbk5vdGljZVVybCA9ICcnLCBlLmFkUXVhbGl0eUNoZWNrVXJsID0gJycsIGUudmFzdFRhZyA9ICcnLCBlLmVuY3J5cHRlZFByaWNlID0gJycsIGUuY3JlYXRpdmVJZCA9ICcnLCBlLnNlYXRJZCA9ICcnLCBlLmFkb21haW4gPSAnJywgZS5zeW5jZWRVc2VyID0gITEsIGUucmVxdWVzdGVkRmxvb3JQcmljZSA9IDAsIGUuZmxvb3JQcmljZUZhY3RvckluZGV4ID0gMCwgZS5jYW1wYWlnbklkID0gJycsIGUud2lkdGggPSAwLCBlLmhlaWdodCA9IDAsIGUubWltZSA9ICd0ZXh0L2h0bWwnLCBlLmd0a3BicCA9IDAsIGUuc3VjY2Vzc1JhdGUgPSAwLCBlLmltcHJlc3Npb25UaW1lU3BlbnQgPSAwLCBlLmJpZFJhdGUgPSAwLCBlLmRzcElkID0gJycsIGUuY254QmlkSWQgPSAnJywgZS5sb2dBdWN0aW9uSW5mb3JtYXRpb24gPSAhMSksIG51bGwgIT0gdC53aW5Ob3RpY2VVcmwgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnd2luTm90aWNlVXJsJykgJiYgKGUud2luTm90aWNlVXJsID0gdC53aW5Ob3RpY2VVcmwpLCBudWxsICE9IHQuYWRRdWFsaXR5Q2hlY2tVcmwgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRRdWFsaXR5Q2hlY2tVcmwnKSAmJiAoZS5hZFF1YWxpdHlDaGVja1VybCA9IHQuYWRRdWFsaXR5Q2hlY2tVcmwpLCBudWxsICE9IHQudmFzdFRhZyAmJiB0Lmhhc093blByb3BlcnR5KCd2YXN0VGFnJykgJiYgKGUudmFzdFRhZyA9IHQudmFzdFRhZyksIG51bGwgIT0gdC5lbmNyeXB0ZWRQcmljZSAmJiB0Lmhhc093blByb3BlcnR5KCdlbmNyeXB0ZWRQcmljZScpICYmIChlLmVuY3J5cHRlZFByaWNlID0gdC5lbmNyeXB0ZWRQcmljZSksIG51bGwgIT0gdC5jcmVhdGl2ZUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ2NyZWF0aXZlSWQnKSAmJiAoZS5jcmVhdGl2ZUlkID0gdC5jcmVhdGl2ZUlkKSwgbnVsbCAhPSB0LnNlYXRJZCAmJiB0Lmhhc093blByb3BlcnR5KCdzZWF0SWQnKSAmJiAoZS5zZWF0SWQgPSB0LnNlYXRJZCksIG51bGwgIT0gdC5hZG9tYWluICYmIHQuaGFzT3duUHJvcGVydHkoJ2Fkb21haW4nKSAmJiAoZS5hZG9tYWluID0gdC5hZG9tYWluKSwgbnVsbCAhPSB0LnN5bmNlZFVzZXIgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc3luY2VkVXNlcicpICYmIChlLnN5bmNlZFVzZXIgPSB0LnN5bmNlZFVzZXIpLCBudWxsICE9IHQucmVxdWVzdGVkRmxvb3JQcmljZSAmJiB0Lmhhc093blByb3BlcnR5KCdyZXF1ZXN0ZWRGbG9vclByaWNlJykgJiYgKGUucmVxdWVzdGVkRmxvb3JQcmljZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5yZXF1ZXN0ZWRGbG9vclByaWNlKSA/IFN0cmluZyh0LnJlcXVlc3RlZEZsb29yUHJpY2UpIDogdC5yZXF1ZXN0ZWRGbG9vclByaWNlKSwgbnVsbCAhPSB0LmZsb29yUHJpY2VGYWN0b3JJbmRleCAmJiB0Lmhhc093blByb3BlcnR5KCdmbG9vclByaWNlRmFjdG9ySW5kZXgnKSAmJiAoZS5mbG9vclByaWNlRmFjdG9ySW5kZXggPSB0LmZsb29yUHJpY2VGYWN0b3JJbmRleCksIG51bGwgIT0gdC5jYW1wYWlnbklkICYmIHQuaGFzT3duUHJvcGVydHkoJ2NhbXBhaWduSWQnKSAmJiAoZS5jYW1wYWlnbklkID0gdC5jYW1wYWlnbklkKSwgbnVsbCAhPSB0LndpZHRoICYmIHQuaGFzT3duUHJvcGVydHkoJ3dpZHRoJykgJiYgKGUud2lkdGggPSB0LndpZHRoKSwgbnVsbCAhPSB0LmhlaWdodCAmJiB0Lmhhc093blByb3BlcnR5KCdoZWlnaHQnKSAmJiAoZS5oZWlnaHQgPSB0LmhlaWdodCksIHQuYmlsbGluZ05vdGljZVVybExpc3QgJiYgdC5iaWxsaW5nTm90aWNlVXJsTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlsbGluZ05vdGljZVVybExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgdC5iaWxsaW5nTm90aWNlVXJsTGlzdC5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpbGxpbmdOb3RpY2VVcmxMaXN0W3NdID0gdC5iaWxsaW5nTm90aWNlVXJsTGlzdFtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0Lm1pbWUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWltZScpICYmIChlLm1pbWUgPSB0Lm1pbWUpLCBudWxsICE9IHQuZ3RrcGJwICYmIHQuaGFzT3duUHJvcGVydHkoJ2d0a3BicCcpICYmIChlLmd0a3BicCA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5ndGtwYnApID8gU3RyaW5nKHQuZ3RrcGJwKSA6IHQuZ3RrcGJwKSwgbnVsbCAhPSB0LnN1Y2Nlc3NSYXRlICYmIHQuaGFzT3duUHJvcGVydHkoJ3N1Y2Nlc3NSYXRlJykgJiYgKGUuc3VjY2Vzc1JhdGUgPSBpLmpzb24gJiYgIWlzRmluaXRlKHQuc3VjY2Vzc1JhdGUpID8gU3RyaW5nKHQuc3VjY2Vzc1JhdGUpIDogdC5zdWNjZXNzUmF0ZSksIG51bGwgIT0gdC5pbXByZXNzaW9uVGltZVNwZW50ICYmIHQuaGFzT3duUHJvcGVydHkoJ2ltcHJlc3Npb25UaW1lU3BlbnQnKSAmJiAoZS5pbXByZXNzaW9uVGltZVNwZW50ID0gdC5pbXByZXNzaW9uVGltZVNwZW50KSwgbnVsbCAhPSB0LmJpZFJhdGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYmlkUmF0ZScpICYmIChlLmJpZFJhdGUgPSBpLmpzb24gJiYgIWlzRmluaXRlKHQuYmlkUmF0ZSkgPyBTdHJpbmcodC5iaWRSYXRlKSA6IHQuYmlkUmF0ZSksIG51bGwgIT0gdC5kc3BJZCAmJiB0Lmhhc093blByb3BlcnR5KCdkc3BJZCcpICYmIChlLmRzcElkID0gdC5kc3BJZCksIG51bGwgIT0gdC5jbnhCaWRJZCAmJiB0Lmhhc093blByb3BlcnR5KCdjbnhCaWRJZCcpICYmIChlLmNueEJpZElkID0gdC5jbnhCaWRJZCksIG51bGwgIT0gdC5sb2dBdWN0aW9uSW5mb3JtYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbG9nQXVjdGlvbkluZm9ybWF0aW9uJykgJiYgKGUubG9nQXVjdGlvbkluZm9ybWF0aW9uID0gdC5sb2dBdWN0aW9uSW5mb3JtYXRpb24pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9SdGJOb0JpZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNvbm5hdGl4UmVhc29uID0gMCwgdC5wcm90b3R5cGUucGFydG5lclJlYXNvbiA9IDAsIHQucHJvdG90eXBlLnN5bmNlZFVzZXIgPSAhMSwgdC5wcm90b3R5cGUucmVxdWVzdGVkRmxvb3JQcmljZSA9IDAsIHQucHJvdG90eXBlLmZsb29yUHJpY2VGYWN0b3JJbmRleCA9IDAsIHQucHJvdG90eXBlLnBhcnRuZXJDdXN0b21IZWFkZXJzID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvUnRiTm9CaWQoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uYXRpeFJlYXNvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBhcnRuZXJSZWFzb24gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zeW5jZWRVc2VyID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZXF1ZXN0ZWRGbG9vclByaWNlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb29yUHJpY2VGYWN0b3JJbmRleCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBhcnRuZXJDdXN0b21IZWFkZXJzID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmNvbm5hdGl4UmVhc29uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ1JlcXVlc3RFeGNlcHRpb24nIDogMCwgZS5wYXJ0bmVyUmVhc29uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ1Vua25vd24nIDogMCwgZS5zeW5jZWRVc2VyID0gITEsIGUucmVxdWVzdGVkRmxvb3JQcmljZSA9IDAsIGUuZmxvb3JQcmljZUZhY3RvckluZGV4ID0gMCwgZS5wYXJ0bmVyQ3VzdG9tSGVhZGVycyA9ICcnKSwgbnVsbCAhPSB0LmNvbm5hdGl4UmVhc29uICYmIHQuaGFzT3duUHJvcGVydHkoJ2Nvbm5hdGl4UmVhc29uJykgJiYgKGUuY29ubmF0aXhSZWFzb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtW3QuY29ubmF0aXhSZWFzb25dIDogdC5jb25uYXRpeFJlYXNvbiksIG51bGwgIT0gdC5wYXJ0bmVyUmVhc29uICYmIHQuaGFzT3duUHJvcGVydHkoJ3BhcnRuZXJSZWFzb24nKSAmJiAoZS5wYXJ0bmVyUmVhc29uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5QYXJ0bmVyTm9CaWRSZWFzb25FbnVtW3QucGFydG5lclJlYXNvbl0gOiB0LnBhcnRuZXJSZWFzb24pLCBudWxsICE9IHQuc3luY2VkVXNlciAmJiB0Lmhhc093blByb3BlcnR5KCdzeW5jZWRVc2VyJykgJiYgKGUuc3luY2VkVXNlciA9IHQuc3luY2VkVXNlciksIG51bGwgIT0gdC5yZXF1ZXN0ZWRGbG9vclByaWNlICYmIHQuaGFzT3duUHJvcGVydHkoJ3JlcXVlc3RlZEZsb29yUHJpY2UnKSAmJiAoZS5yZXF1ZXN0ZWRGbG9vclByaWNlID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LnJlcXVlc3RlZEZsb29yUHJpY2UpID8gU3RyaW5nKHQucmVxdWVzdGVkRmxvb3JQcmljZSkgOiB0LnJlcXVlc3RlZEZsb29yUHJpY2UpLCBudWxsICE9IHQuZmxvb3JQcmljZUZhY3RvckluZGV4ICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb29yUHJpY2VGYWN0b3JJbmRleCcpICYmIChlLmZsb29yUHJpY2VGYWN0b3JJbmRleCA9IHQuZmxvb3JQcmljZUZhY3RvckluZGV4KSwgbnVsbCAhPSB0LnBhcnRuZXJDdXN0b21IZWFkZXJzICYmIHQuaGFzT3duUHJvcGVydHkoJ3BhcnRuZXJDdXN0b21IZWFkZXJzJykgJiYgKGUucGFydG5lckN1c3RvbUhlYWRlcnMgPSB0LnBhcnRuZXJDdXN0b21IZWFkZXJzKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUnRiTGluZUl0ZW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJpZHMgPSBbXSwgdGhpcy5ub0JpZHMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuaWQgPSAnJywgdC5wcm90b3R5cGUuY2FjaGVkRmxvb3JQcmljZSA9IDAsIHQucHJvdG90eXBlLmJpZHMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLm5vQmlkcyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9SdGJMaW5lSXRlbSgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNhY2hlZEZsb29yUHJpY2UgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmlkcyAmJiBzLmJpZHMubGVuZ3RoIHx8IChzLmJpZHMgPSBbXSksIHMuYmlkcy5wdXNoKGMuUHJvdG9SdGJCaWQuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm5vQmlkcyAmJiBzLm5vQmlkcy5sZW5ndGggfHwgKHMubm9CaWRzID0gW10pLCBzLm5vQmlkcy5wdXNoKGMuUHJvdG9SdGJOb0JpZC5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS5iaWRzID0gW10sIGUubm9CaWRzID0gW10pLCBpLmRlZmF1bHRzICYmIChlLmlkID0gJycsIGUuY2FjaGVkRmxvb3JQcmljZSA9IDApLCBudWxsICE9IHQuaWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaWQnKSAmJiAoZS5pZCA9IHQuaWQpLCBudWxsICE9IHQuY2FjaGVkRmxvb3JQcmljZSAmJiB0Lmhhc093blByb3BlcnR5KCdjYWNoZWRGbG9vclByaWNlJykgJiYgKGUuY2FjaGVkRmxvb3JQcmljZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5jYWNoZWRGbG9vclByaWNlKSA/IFN0cmluZyh0LmNhY2hlZEZsb29yUHJpY2UpIDogdC5jYWNoZWRGbG9vclByaWNlKSwgdC5iaWRzICYmIHQuYmlkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LmJpZHMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5iaWRzW3NdID0gYy5Qcm90b1J0YkJpZC50b09iamVjdCh0LmJpZHNbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lm5vQmlkcyAmJiB0Lm5vQmlkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubm9CaWRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5ub0JpZHMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ub0JpZHNbc10gPSBjLlByb3RvUnRiTm9CaWQudG9PYmplY3QodC5ub0JpZHNbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9TdXBwbHlDaGFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmJ1c2luZXNzRG9tYWluID0gJycsIHQucHJvdG90eXBlLnN1cHBseUNoYWluSWQgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9TdXBwbHlDaGFpbigpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJ1c2luZXNzRG9tYWluID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1cHBseUNoYWluSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUuYnVzaW5lc3NEb21haW4gPSAnJywgZS5zdXBwbHlDaGFpbklkID0gJycpLCBudWxsICE9IHQuYnVzaW5lc3NEb21haW4gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYnVzaW5lc3NEb21haW4nKSAmJiAoZS5idXNpbmVzc0RvbWFpbiA9IHQuYnVzaW5lc3NEb21haW4pLCBudWxsICE9IHQuc3VwcGx5Q2hhaW5JZCAmJiB0Lmhhc093blByb3BlcnR5KCdzdXBwbHlDaGFpbklkJykgJiYgKGUuc3VwcGx5Q2hhaW5JZCA9IHQuc3VwcGx5Q2hhaW5JZCksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkQ2xpY2tUcmFja2luZ1JlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS50cmFja2luZ1JlcXVlc3RNZXRhID0gbnVsbCwgdC5wcm90b3R5cGUubWVkaWFHdWlkID0gJycsIHQucHJvdG90eXBlLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUudHlwZSA9IDEsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5tZWRpYUd1aWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ21lZGlhR3VpZCcpICYmIGkudWludDMyKDE4KS5zdHJpbmcodC5tZWRpYUd1aWQpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncHVibGlzaGVyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDI2KS5zdHJpbmcodC5wdWJsaXNoZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZHZlcnRpc2VyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDM0KS5zdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCksIG51bGwgIT0gdC50eXBlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd0eXBlJykgJiYgaS51aW50MzIoNDApLmludDMyKHQudHlwZSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQWRDbGlja1RyYWNraW5nUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvQWRDbGlja1RyYWNraW5nUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC50cmFja2luZ1JlcXVlc3RNZXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvQWRDbGlja1RyYWNraW5nUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQubWVkaWFHdWlkICYmIChpLm1lZGlhR3VpZCA9IFN0cmluZyh0Lm1lZGlhR3VpZCkpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiAoaS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQucHVibGlzaGVyTGluZUl0ZW1JZCkpLCBudWxsICE9IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgJiYgKGkuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSBTdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCkpLCB0LnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQWRDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQWRDbGlja1Rocm91Z2gnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FkU2tpcENsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWb2x1bWVDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUGF1c2VDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUGxheUNsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdGdWxsU2NyZWVuQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ011dGVDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5tdXRlQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BZE9wcG9ydHVuaXR5UmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnNlc3Npb25JZCA9ICcnLCB0LnByb3RvdHlwZS50cmFja2luZ1JlcXVlc3RNZXRhID0gbnVsbCwgdC5wcm90b3R5cGUuYWRCcmVhayA9IDAsIHQucHJvdG90eXBlLnBsYXllcldpZHRoID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQuc2Vzc2lvbklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZXNzaW9uSWQnKSAmJiBpLnVpbnQzMigxMCkuc3RyaW5nKHQuc2Vzc2lvbklkKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTgpLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5hZEJyZWFrICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZEJyZWFrJykgJiYgaS51aW50MzIoMjQpLmludDMyKHQuYWRCcmVhayksIG51bGwgIT0gdC5wbGF5ZXJXaWR0aCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncGxheWVyV2lkdGgnKSAmJiBpLnVpbnQzMigzMikuaW50MzIodC5wbGF5ZXJXaWR0aCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQWRPcHBvcnR1bml0eVJlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0FkT3Bwb3J0dW5pdHlSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuc2Vzc2lvbklkICYmIChpLnNlc3Npb25JZCA9IFN0cmluZyh0LnNlc3Npb25JZCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnRyYWNraW5nUmVxdWVzdE1ldGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9BZE9wcG9ydHVuaXR5UmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmFkQnJlYWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm9uZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRCcmVhayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUHJlUm9sbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRCcmVhayA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTWlkUm9sbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRCcmVhayA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUG9zdFJvbGwnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkQnJlYWsgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQucGxheWVyV2lkdGggJiYgKGkucGxheWVyV2lkdGggPSAwIHwgdC5wbGF5ZXJXaWR0aCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0F1Y3Rpb25JbmZvUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNueEJpZElkID0gJycsIHQucHJvdG90eXBlLmF1Y3Rpb25JbmZvcm1hdGlvbiA9IG51bGwsIHQucHJvdG90eXBlLmF1Y3Rpb25Mb3NzUmVhc29uID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQuY254QmlkSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NueEJpZElkJykgJiYgaS51aW50MzIoMTApLnN0cmluZyh0LmNueEJpZElkKSwgbnVsbCAhPSB0LmF1Y3Rpb25JbmZvcm1hdGlvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYXVjdGlvbkluZm9ybWF0aW9uJykgJiYgYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5lbmNvZGUodC5hdWN0aW9uSW5mb3JtYXRpb24sIGkudWludDMyKDE4KS5mb3JrKCkpLmxkZWxpbSgpLCBudWxsICE9IHQuYXVjdGlvbkxvc3NSZWFzb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2F1Y3Rpb25Mb3NzUmVhc29uJykgJiYgaS51aW50MzIoMjQpLmludDMyKHQuYXVjdGlvbkxvc3NSZWFzb24pLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvQXVjdGlvbkluZm9SZXF1ZXN0KCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY254QmlkSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYXVjdGlvbkluZm9ybWF0aW9uID0gYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hdWN0aW9uTG9zc1JlYXNvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQXVjdGlvbkluZm9SZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9BdWN0aW9uSW5mb1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5jbnhCaWRJZCAmJiAoaS5jbnhCaWRJZCA9IFN0cmluZyh0LmNueEJpZElkKSksIG51bGwgIT0gdC5hdWN0aW9uSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5hdWN0aW9uSW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9BdWN0aW9uSW5mb1JlcXVlc3QuYXVjdGlvbkluZm9ybWF0aW9uOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXVjdGlvbkluZm9ybWF0aW9uID0gYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5mcm9tT2JqZWN0KHQuYXVjdGlvbkluZm9ybWF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuYXVjdGlvbkxvc3NSZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVGFyZ2V0aW5nTWlzbWF0Y2gnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmF1Y3Rpb25Mb3NzUmVhc29uID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDb21wZXRpdG9yUHJpb3JpdHknOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmF1Y3Rpb25Mb3NzUmVhc29uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBZE9wcG9ydHVuaXR5RW5kJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hdWN0aW9uTG9zc1JlYXNvbiA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmNueEJpZElkID0gJycsIGUuYXVjdGlvbkluZm9ybWF0aW9uID0gbnVsbCwgZS5hdWN0aW9uTG9zc1JlYXNvbiA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdUYXJnZXRpbmdNaXNtYXRjaCcgOiAwKSwgbnVsbCAhPSB0LmNueEJpZElkICYmIHQuaGFzT3duUHJvcGVydHkoJ2NueEJpZElkJykgJiYgKGUuY254QmlkSWQgPSB0LmNueEJpZElkKSwgbnVsbCAhPSB0LmF1Y3Rpb25JbmZvcm1hdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdhdWN0aW9uSW5mb3JtYXRpb24nKSAmJiAoZS5hdWN0aW9uSW5mb3JtYXRpb24gPSBjLlByb3RvQXVjdGlvbkluZm9ybWF0aW9uLnRvT2JqZWN0KHQuYXVjdGlvbkluZm9ybWF0aW9uLCBpKSksIG51bGwgIT0gdC5hdWN0aW9uTG9zc1JlYXNvbiAmJiB0Lmhhc093blByb3BlcnR5KCdhdWN0aW9uTG9zc1JlYXNvbicpICYmIChlLmF1Y3Rpb25Mb3NzUmVhc29uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0F1Y3Rpb25Mb3NzUmVhc29uRW51bVt0LmF1Y3Rpb25Mb3NzUmVhc29uXSA6IHQuYXVjdGlvbkxvc3NSZWFzb24pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BdWN0aW9uSW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5oaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlID0gMCwgdC5wcm90b3R5cGUuc2Vjb25kSGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSA9IDAsIHQucHJvdG90eXBlLmJpZERlbnNpdHkgPSAwLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC5oaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdoaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlJykgJiYgaS51aW50MzIoOSkuZG91YmxlKHQuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSksIG51bGwgIT0gdC5zZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlJykgJiYgaS51aW50MzIoMTcpLmRvdWJsZSh0LnNlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UpLCBudWxsICE9IHQuYmlkRGVuc2l0eSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYmlkRGVuc2l0eScpICYmIGkudWludDMyKDI0KS5pbnQzMih0LmJpZERlbnNpdHkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvQXVjdGlvbkluZm9ybWF0aW9uKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlID0gdC5kb3VibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJpZERlbnNpdHkgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvQXVjdGlvbkluZm9ybWF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSAmJiAoaS5oaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlID0gTnVtYmVyKHQuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSkpLCBudWxsICE9IHQuc2Vjb25kSGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSAmJiAoaS5zZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlID0gTnVtYmVyKHQuc2Vjb25kSGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSkpLCBudWxsICE9IHQuYmlkRGVuc2l0eSAmJiAoaS5iaWREZW5zaXR5ID0gMCB8IHQuYmlkRGVuc2l0eSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UgPSAwLCBlLnNlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UgPSAwLCBlLmJpZERlbnNpdHkgPSAwKSwgbnVsbCAhPSB0LmhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZScpICYmIChlLmhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UgPSBpLmpzb24gJiYgIWlzRmluaXRlKHQuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSkgPyBTdHJpbmcodC5oaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlKSA6IHQuaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSksIG51bGwgIT0gdC5zZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlICYmIHQuaGFzT3duUHJvcGVydHkoJ3NlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UnKSAmJiAoZS5zZWNvbmRIaWdoZXN0T2JmdXNjYXRlZEJpZFByaWNlID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LnNlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UpID8gU3RyaW5nKHQuc2Vjb25kSGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZSkgOiB0LnNlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2UpLCBudWxsICE9IHQuYmlkRGVuc2l0eSAmJiB0Lmhhc093blByb3BlcnR5KCdiaWREZW5zaXR5JykgJiYgKGUuYmlkRGVuc2l0eSA9IHQuYmlkRGVuc2l0eSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCByLnV0aWwudG9KU09OT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1ByZWJpZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUuc3luY2VkVXNlciA9ICExLCB0LnByb3RvdHlwZS50aW1lU3BlbnQgPSAwLCB0LnByb3RvdHlwZS5yZWFzb24gPSAwLCB0LnByb3RvdHlwZS5ydGJSZXF1ZXN0TnVtYmVyID0gMCwgdC5wcm90b3R5cGUucGFydG5lclJlYXNvbiA9IDAsIHQucHJvdG90eXBlLnJlcXVlc3RlZEZsb29yUHJpY2UgPSAwLCB0LnByb3RvdHlwZS5wYXJ0bmVyQ3VzdG9tSGVhZGVycyA9ICcnLCB0LnByb3RvdHlwZS5wcmViaWRKc0JpZGRlck5hbWUgPSAnJywgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncHVibGlzaGVyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDEwKS5zdHJpbmcodC5wdWJsaXNoZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZHZlcnRpc2VyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDE4KS5zdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5zeW5jZWRVc2VyICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzeW5jZWRVc2VyJykgJiYgaS51aW50MzIoMjQpLmJvb2wodC5zeW5jZWRVc2VyKSwgbnVsbCAhPSB0LnRpbWVTcGVudCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndGltZVNwZW50JykgJiYgaS51aW50MzIoMzIpLmludDMyKHQudGltZVNwZW50KSwgbnVsbCAhPSB0LnJlYXNvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncmVhc29uJykgJiYgaS51aW50MzIoNDApLmludDMyKHQucmVhc29uKSwgbnVsbCAhPSB0LnJ0YlJlcXVlc3ROdW1iZXIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3J0YlJlcXVlc3ROdW1iZXInKSAmJiBpLnVpbnQzMig0OCkuaW50MzIodC5ydGJSZXF1ZXN0TnVtYmVyKSwgbnVsbCAhPSB0LnBhcnRuZXJSZWFzb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3BhcnRuZXJSZWFzb24nKSAmJiBpLnVpbnQzMig1NikuaW50MzIodC5wYXJ0bmVyUmVhc29uKSwgbnVsbCAhPSB0LnJlcXVlc3RlZEZsb29yUHJpY2UgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3JlcXVlc3RlZEZsb29yUHJpY2UnKSAmJiBpLnVpbnQzMig2NSkuZG91YmxlKHQucmVxdWVzdGVkRmxvb3JQcmljZSksIG51bGwgIT0gdC5wYXJ0bmVyQ3VzdG9tSGVhZGVycyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncGFydG5lckN1c3RvbUhlYWRlcnMnKSAmJiBpLnVpbnQzMig3NCkuc3RyaW5nKHQucGFydG5lckN1c3RvbUhlYWRlcnMpLCBudWxsICE9IHQucHJlYmlkSnNCaWRkZXJOYW1lICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwcmViaWRKc0JpZGRlck5hbWUnKSAmJiBpLnVpbnQzMig5OCkuc3RyaW5nKHQucHJlYmlkSnNCaWRkZXJOYW1lKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmZyb21PYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGMuUHJvdG9QcmViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b1ByZWJpZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIChpLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSBTdHJpbmcodC5wdWJsaXNoZXJMaW5lSXRlbUlkKSksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiAoaS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9IFN0cmluZyh0LmFkdmVydGlzZXJMaW5lSXRlbUlkKSksIG51bGwgIT0gdC5zeW5jZWRVc2VyICYmIChpLnN5bmNlZFVzZXIgPSBCb29sZWFuKHQuc3luY2VkVXNlcikpLCBudWxsICE9IHQudGltZVNwZW50ICYmIChpLnRpbWVTcGVudCA9IDAgfCB0LnRpbWVTcGVudCksIHQucmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1JlcXVlc3RFeGNlcHRpb24nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlYXNvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVGltZW91dCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVhc29uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdFbXB0eVJlc3BvbnNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFzb24gPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ludmFsaWRSZXNwb25zZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVhc29uID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb0JpZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVhc29uID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCaWRCZWxvd0Zsb29yJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFzb24gPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RlYWxJZE1pc21hdGNoJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFzb24gPSA2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NzSW52YWxpZFJlc3BvbnNlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFzb24gPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NzUmVxdWVzdEV4Y2VwdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVhc29uID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDc0VtcHR5UmVzcG9uc2UnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlYXNvbiA9IDk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm9MaWJJblBhZ2UnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFzb24gPSAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bGwgIT0gdC5ydGJSZXF1ZXN0TnVtYmVyICYmIChpLnJ0YlJlcXVlc3ROdW1iZXIgPSAwIHwgdC5ydGJSZXF1ZXN0TnVtYmVyKSwgdC5wYXJ0bmVyUmVhc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Vua25vd24nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1RlY2huaWNhbEVycm9yJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wYXJ0bmVyUmVhc29uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJbnZhbGlkUmVxdWVzdCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGFydG5lclJlYXNvbiA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnS25vd25XZWJTcGlkZXInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1N1c3BlY3RlZE5vbkh1bWFuVHJhZmZpYyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGFydG5lclJlYXNvbiA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2xvdWRJUCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGFydG5lclJlYXNvbiA9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5zdXBwb3J0ZWREZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSA2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Jsb2NrZWRQdWJsaXNoZXInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSA3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VubWF0Y2hlZFVzZXInOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RhaWx5UmVhZGVyQ2FwTWV0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wYXJ0bmVyUmVhc29uID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEYWlseURvbWFpbkNhcE1ldCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBhcnRuZXJSZWFzb24gPSAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LnJlcXVlc3RlZEZsb29yUHJpY2UgJiYgKGkucmVxdWVzdGVkRmxvb3JQcmljZSA9IE51bWJlcih0LnJlcXVlc3RlZEZsb29yUHJpY2UpKSwgbnVsbCAhPSB0LnBhcnRuZXJDdXN0b21IZWFkZXJzICYmIChpLnBhcnRuZXJDdXN0b21IZWFkZXJzID0gU3RyaW5nKHQucGFydG5lckN1c3RvbUhlYWRlcnMpKSwgbnVsbCAhPSB0LnByZWJpZEpzQmlkZGVyTmFtZSAmJiAoaS5wcmViaWRKc0JpZGRlck5hbWUgPSBTdHJpbmcodC5wcmViaWRKc0JpZGRlck5hbWUpKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQmlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUucHVibGlzaGVyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5zeW5jZWRVc2VyID0gITEsIHQucHJvdG90eXBlLnRpbWVTcGVudCA9IDAsIHQucHJvdG90eXBlLnJ0YlJlcXVlc3ROdW1iZXIgPSAwLCB0LnByb3RvdHlwZS5jcmVhdGl2ZUlkID0gJycsIHQucHJvdG90eXBlLnJ0YlNlYXRJZCA9ICcnLCB0LnByb3RvdHlwZS5ydGJBZG9tYWluID0gJycsIHQucHJvdG90eXBlLmVuY3J5cHRlZFByaWNlID0gJycsIHQucHJvdG90eXBlLnJlcXVlc3RlZEZsb29yUHJpY2UgPSAwLCB0LnByb3RvdHlwZS5wcmViaWRKc0JpZGRlck5hbWUgPSAnJywgdC5wcm90b3R5cGUuY3VzdG9tQ2xpZW50UHJpY2UgPSAwLCB0LnByb3RvdHlwZS5kc3BJZCA9ICcnLCB0LnByb3RvdHlwZS5jbnhCaWRJZCA9ICcnLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwdWJsaXNoZXJMaW5lSXRlbUlkJykgJiYgaS51aW50MzIoMTApLnN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpLCBudWxsICE9IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2FkdmVydGlzZXJMaW5lSXRlbUlkJykgJiYgaS51aW50MzIoMTgpLnN0cmluZyh0LmFkdmVydGlzZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LnN5bmNlZFVzZXIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3N5bmNlZFVzZXInKSAmJiBpLnVpbnQzMigyNCkuYm9vbCh0LnN5bmNlZFVzZXIpLCBudWxsICE9IHQudGltZVNwZW50ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd0aW1lU3BlbnQnKSAmJiBpLnVpbnQzMigzMikuaW50MzIodC50aW1lU3BlbnQpLCBudWxsICE9IHQucnRiUmVxdWVzdE51bWJlciAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncnRiUmVxdWVzdE51bWJlcicpICYmIGkudWludDMyKDQwKS5pbnQzMih0LnJ0YlJlcXVlc3ROdW1iZXIpLCBudWxsICE9IHQuY3JlYXRpdmVJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3JlYXRpdmVJZCcpICYmIGkudWludDMyKDUwKS5zdHJpbmcodC5jcmVhdGl2ZUlkKSwgbnVsbCAhPSB0LnJ0YlNlYXRJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncnRiU2VhdElkJykgJiYgaS51aW50MzIoNTgpLnN0cmluZyh0LnJ0YlNlYXRJZCksIG51bGwgIT0gdC5ydGJBZG9tYWluICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdydGJBZG9tYWluJykgJiYgaS51aW50MzIoNjYpLnN0cmluZyh0LnJ0YkFkb21haW4pLCBudWxsICE9IHQuZW5jcnlwdGVkUHJpY2UgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2VuY3J5cHRlZFByaWNlJykgJiYgaS51aW50MzIoNzQpLnN0cmluZyh0LmVuY3J5cHRlZFByaWNlKSwgbnVsbCAhPSB0LnJlcXVlc3RlZEZsb29yUHJpY2UgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3JlcXVlc3RlZEZsb29yUHJpY2UnKSAmJiBpLnVpbnQzMig4MSkuZG91YmxlKHQucmVxdWVzdGVkRmxvb3JQcmljZSksIG51bGwgIT0gdC5wcmViaWRKc0JpZGRlck5hbWUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3ByZWJpZEpzQmlkZGVyTmFtZScpICYmIGkudWludDMyKDEwNikuc3RyaW5nKHQucHJlYmlkSnNCaWRkZXJOYW1lKSwgbnVsbCAhPSB0LmN1c3RvbUNsaWVudFByaWNlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21DbGllbnRQcmljZScpICYmIGkudWludDMyKDExMykuZG91YmxlKHQuY3VzdG9tQ2xpZW50UHJpY2UpLCBudWxsICE9IHQuZHNwSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2RzcElkJykgJiYgaS51aW50MzIoMTIyKS5zdHJpbmcodC5kc3BJZCksIG51bGwgIT0gdC5jbnhCaWRJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY254QmlkSWQnKSAmJiBpLnVpbnQzMigxMzApLnN0cmluZyh0LmNueEJpZElkKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmZyb21PYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGMuUHJvdG9CaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0JpZCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LnB1Ymxpc2hlckxpbmVJdGVtSWQgJiYgKGkucHVibGlzaGVyTGluZUl0ZW1JZCA9IFN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIChpLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpKSwgbnVsbCAhPSB0LnN5bmNlZFVzZXIgJiYgKGkuc3luY2VkVXNlciA9IEJvb2xlYW4odC5zeW5jZWRVc2VyKSksIG51bGwgIT0gdC50aW1lU3BlbnQgJiYgKGkudGltZVNwZW50ID0gMCB8IHQudGltZVNwZW50KSwgbnVsbCAhPSB0LnJ0YlJlcXVlc3ROdW1iZXIgJiYgKGkucnRiUmVxdWVzdE51bWJlciA9IDAgfCB0LnJ0YlJlcXVlc3ROdW1iZXIpLCBudWxsICE9IHQuY3JlYXRpdmVJZCAmJiAoaS5jcmVhdGl2ZUlkID0gU3RyaW5nKHQuY3JlYXRpdmVJZCkpLCBudWxsICE9IHQucnRiU2VhdElkICYmIChpLnJ0YlNlYXRJZCA9IFN0cmluZyh0LnJ0YlNlYXRJZCkpLCBudWxsICE9IHQucnRiQWRvbWFpbiAmJiAoaS5ydGJBZG9tYWluID0gU3RyaW5nKHQucnRiQWRvbWFpbikpLCBudWxsICE9IHQuZW5jcnlwdGVkUHJpY2UgJiYgKGkuZW5jcnlwdGVkUHJpY2UgPSBTdHJpbmcodC5lbmNyeXB0ZWRQcmljZSkpLCBudWxsICE9IHQucmVxdWVzdGVkRmxvb3JQcmljZSAmJiAoaS5yZXF1ZXN0ZWRGbG9vclByaWNlID0gTnVtYmVyKHQucmVxdWVzdGVkRmxvb3JQcmljZSkpLCBudWxsICE9IHQucHJlYmlkSnNCaWRkZXJOYW1lICYmIChpLnByZWJpZEpzQmlkZGVyTmFtZSA9IFN0cmluZyh0LnByZWJpZEpzQmlkZGVyTmFtZSkpLCBudWxsICE9IHQuY3VzdG9tQ2xpZW50UHJpY2UgJiYgKGkuY3VzdG9tQ2xpZW50UHJpY2UgPSBOdW1iZXIodC5jdXN0b21DbGllbnRQcmljZSkpLCBudWxsICE9IHQuZHNwSWQgJiYgKGkuZHNwSWQgPSBTdHJpbmcodC5kc3BJZCkpLCBudWxsICE9IHQuY254QmlkSWQgJiYgKGkuY254QmlkSWQgPSBTdHJpbmcodC5jbnhCaWRJZCkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Qb3N0QmlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUucHVibGlzaGVyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5zeW5jZWRVc2VyID0gITEsIHQucHJvdG90eXBlLnRpbWVTcGVudCA9IDAsIHQucHJvdG90eXBlLmVycm9yID0gJycsIHQucHJvdG90eXBlLmxvYWRlZCA9ICExLCB0LnByb3RvdHlwZS5jcmVhdGl2ZUlkID0gJycsIHQucHJvdG90eXBlLnJ0YlNlYXRJZCA9ICcnLCB0LnByb3RvdHlwZS5ydGJBZG9tYWluID0gJycsIHQucHJvdG90eXBlLmFkc291cmNlVHlwZSA9IDAsIHQucHJvdG90eXBlLnZhc3RNZWRpYVR5cGUgPSAnJywgdC5wcm90b3R5cGUuYWRQb2RTbG90UG9zaXRpb24gPSAwLCB0LnByb3RvdHlwZS5wcmViaWRKc0JpZGRlck5hbWUgPSAnJywgdC5wcm90b3R5cGUuZHNwSWQgPSAnJywgdC5wcm90b3R5cGUuY254QmlkSWQgPSAnJywgdC5wcm90b3R5cGUud2luVG9BZExvYWRlZFRpbWUgPSAwLCB0LnByb3RvdHlwZS5hdWN0aW9uSW5mb3JtYXRpb24gPSBudWxsLCB0LnByb3RvdHlwZS5hdWN0aW9uUG9zdGJpZFJlYXNvbiA9IDAsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnB1Ymxpc2hlckxpbmVJdGVtSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3B1Ymxpc2hlckxpbmVJdGVtSWQnKSAmJiBpLnVpbnQzMigxMCkuc3RyaW5nKHQucHVibGlzaGVyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWR2ZXJ0aXNlckxpbmVJdGVtSWQnKSAmJiBpLnVpbnQzMigxOCkuc3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpLCBudWxsICE9IHQuc3luY2VkVXNlciAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnc3luY2VkVXNlcicpICYmIGkudWludDMyKDI0KS5ib29sKHQuc3luY2VkVXNlciksIG51bGwgIT0gdC50aW1lU3BlbnQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RpbWVTcGVudCcpICYmIGkudWludDMyKDMyKS5pbnQzMih0LnRpbWVTcGVudCksIG51bGwgIT0gdC5lcnJvciAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZXJyb3InKSAmJiBpLnVpbnQzMig0Mikuc3RyaW5nKHQuZXJyb3IpLCBudWxsICE9IHQubG9hZGVkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdsb2FkZWQnKSAmJiBpLnVpbnQzMig0OCkuYm9vbCh0LmxvYWRlZCksIG51bGwgIT0gdC5jcmVhdGl2ZUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjcmVhdGl2ZUlkJykgJiYgaS51aW50MzIoNTgpLnN0cmluZyh0LmNyZWF0aXZlSWQpLCBudWxsICE9IHQucnRiU2VhdElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdydGJTZWF0SWQnKSAmJiBpLnVpbnQzMig2Nikuc3RyaW5nKHQucnRiU2VhdElkKSwgbnVsbCAhPSB0LnJ0YkFkb21haW4gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3J0YkFkb21haW4nKSAmJiBpLnVpbnQzMig3NCkuc3RyaW5nKHQucnRiQWRvbWFpbiksIG51bGwgIT0gdC5hZHNvdXJjZVR5cGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2Fkc291cmNlVHlwZScpICYmIGkudWludDMyKDgwKS5pbnQzMih0LmFkc291cmNlVHlwZSksIG51bGwgIT0gdC52YXN0TWVkaWFUeXBlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd2YXN0TWVkaWFUeXBlJykgJiYgaS51aW50MzIoOTApLnN0cmluZyh0LnZhc3RNZWRpYVR5cGUpLCBudWxsICE9IHQuYWRQb2RTbG90UG9zaXRpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2FkUG9kU2xvdFBvc2l0aW9uJykgJiYgaS51aW50MzIoOTYpLmludDMyKHQuYWRQb2RTbG90UG9zaXRpb24pLCBudWxsICE9IHQucHJlYmlkSnNCaWRkZXJOYW1lICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwcmViaWRKc0JpZGRlck5hbWUnKSAmJiBpLnVpbnQzMigxMDYpLnN0cmluZyh0LnByZWJpZEpzQmlkZGVyTmFtZSksIG51bGwgIT0gdC5kc3BJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZHNwSWQnKSAmJiBpLnVpbnQzMigxMTQpLnN0cmluZyh0LmRzcElkKSwgbnVsbCAhPSB0LmNueEJpZElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjbnhCaWRJZCcpICYmIGkudWludDMyKDEyMikuc3RyaW5nKHQuY254QmlkSWQpLCBudWxsICE9IHQud2luVG9BZExvYWRlZFRpbWUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3dpblRvQWRMb2FkZWRUaW1lJykgJiYgaS51aW50MzIoMTI4KS5pbnQzMih0LndpblRvQWRMb2FkZWRUaW1lKSwgbnVsbCAhPSB0LmF1Y3Rpb25JbmZvcm1hdGlvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYXVjdGlvbkluZm9ybWF0aW9uJykgJiYgYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5lbmNvZGUodC5hdWN0aW9uSW5mb3JtYXRpb24sIGkudWludDMyKDE0NikuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0LmF1Y3Rpb25Qb3N0YmlkUmVhc29uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhdWN0aW9uUG9zdGJpZFJlYXNvbicpICYmIGkudWludDMyKDE1MikuaW50MzIodC5hdWN0aW9uUG9zdGJpZFJlYXNvbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvUG9zdEJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvUG9zdEJpZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIChpLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSBTdHJpbmcodC5wdWJsaXNoZXJMaW5lSXRlbUlkKSksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiAoaS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9IFN0cmluZyh0LmFkdmVydGlzZXJMaW5lSXRlbUlkKSksIG51bGwgIT0gdC5zeW5jZWRVc2VyICYmIChpLnN5bmNlZFVzZXIgPSBCb29sZWFuKHQuc3luY2VkVXNlcikpLCBudWxsICE9IHQudGltZVNwZW50ICYmIChpLnRpbWVTcGVudCA9IDAgfCB0LnRpbWVTcGVudCksIG51bGwgIT0gdC5lcnJvciAmJiAoaS5lcnJvciA9IFN0cmluZyh0LmVycm9yKSksIG51bGwgIT0gdC5sb2FkZWQgJiYgKGkubG9hZGVkID0gQm9vbGVhbih0LmxvYWRlZCkpLCBudWxsICE9IHQuY3JlYXRpdmVJZCAmJiAoaS5jcmVhdGl2ZUlkID0gU3RyaW5nKHQuY3JlYXRpdmVJZCkpLCBudWxsICE9IHQucnRiU2VhdElkICYmIChpLnJ0YlNlYXRJZCA9IFN0cmluZyh0LnJ0YlNlYXRJZCkpLCBudWxsICE9IHQucnRiQWRvbWFpbiAmJiAoaS5ydGJBZG9tYWluID0gU3RyaW5nKHQucnRiQWRvbWFpbikpLCB0LmFkc291cmNlVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVbmtub3duJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hZHNvdXJjZVR5cGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZwYWlkJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hZHNvdXJjZVR5cGUgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Zhc3RNZWRpYSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdDbnhNZWRpYSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdKdyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJbWEnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkc291cmNlVHlwZSA9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQU9MJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hZHNvdXJjZVR5cGUgPSA2OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudmFzdE1lZGlhVHlwZSAmJiAoaS52YXN0TWVkaWFUeXBlID0gU3RyaW5nKHQudmFzdE1lZGlhVHlwZSkpLCBudWxsICE9IHQuYWRQb2RTbG90UG9zaXRpb24gJiYgKGkuYWRQb2RTbG90UG9zaXRpb24gPSAwIHwgdC5hZFBvZFNsb3RQb3NpdGlvbiksIG51bGwgIT0gdC5wcmViaWRKc0JpZGRlck5hbWUgJiYgKGkucHJlYmlkSnNCaWRkZXJOYW1lID0gU3RyaW5nKHQucHJlYmlkSnNCaWRkZXJOYW1lKSksIG51bGwgIT0gdC5kc3BJZCAmJiAoaS5kc3BJZCA9IFN0cmluZyh0LmRzcElkKSksIG51bGwgIT0gdC5jbnhCaWRJZCAmJiAoaS5jbnhCaWRJZCA9IFN0cmluZyh0LmNueEJpZElkKSksIG51bGwgIT0gdC53aW5Ub0FkTG9hZGVkVGltZSAmJiAoaS53aW5Ub0FkTG9hZGVkVGltZSA9IDAgfCB0LndpblRvQWRMb2FkZWRUaW1lKSwgbnVsbCAhPSB0LmF1Y3Rpb25JbmZvcm1hdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LmF1Y3Rpb25JbmZvcm1hdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b1Bvc3RCaWQuYXVjdGlvbkluZm9ybWF0aW9uOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXVjdGlvbkluZm9ybWF0aW9uID0gYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5mcm9tT2JqZWN0KHQuYXVjdGlvbkluZm9ybWF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuYXVjdGlvblBvc3RiaWRSZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ3JlYXRpdmVFcnJvcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXVjdGlvblBvc3RiaWRSZWFzb24gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NES0ZhaWx1cmUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmF1Y3Rpb25Qb3N0YmlkUmVhc29uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVbnN1cHBvcnRlZE1lZGlhJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hdWN0aW9uUG9zdGJpZFJlYXNvbiA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVGFyZ2V0aW5nTWlzbWF0Y2gnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmF1Y3Rpb25Qb3N0YmlkUmVhc29uID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQbGF5ZXJFcnJvcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXVjdGlvblBvc3RiaWRSZWFzb24gPSA0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9CaWRUcmFja2luZ3NSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmViaWRzID0gW10sIHRoaXMuYmlkcyA9IFtdLCB0aGlzLnBvc3RCaWRzID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUd1aWQgPSAnJywgdC5wcm90b3R5cGUucHJlYmlkcyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuYmlkcyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUucG9zdEJpZHMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmxvZ0V2ZXJ5dGluZyA9ICExLCB0LnByb3RvdHlwZS5oYXNHZHByQ29uc2VudFBheWxvYWQgPSAhMSwgdC5wcm90b3R5cGUuZ2RwckNvbnNlbnRNb2RlID0gMCwgdC5wcm90b3R5cGUudXNlRXhwbG9yYXRpb24gPSAhMSwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHJhY2tpbmdSZXF1ZXN0TWV0YScpICYmIGMuTWV0YWRhdGFNb2RlbC5lbmNvZGUodC50cmFja2luZ1JlcXVlc3RNZXRhLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0Lm1lZGlhR3VpZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWVkaWFHdWlkJykgJiYgaS51aW50MzIoMTgpLnN0cmluZyh0Lm1lZGlhR3VpZCksIG51bGwgIT0gdC5wcmViaWRzICYmIHQucHJlYmlkcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQucHJlYmlkcy5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLlByb3RvUHJlYmlkLmVuY29kZSh0LnByZWJpZHNbZV0sIGkudWludDMyKDM0KS5mb3JrKCkpLmxkZWxpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmJpZHMgJiYgdC5iaWRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCB0LmJpZHMubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5Qcm90b0JpZC5lbmNvZGUodC5iaWRzW2VdLCBpLnVpbnQzMig0MikuZm9yaygpKS5sZGVsaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5wb3N0QmlkcyAmJiB0LnBvc3RCaWRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCB0LnBvc3RCaWRzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuUHJvdG9Qb3N0QmlkLmVuY29kZSh0LnBvc3RCaWRzW2VdLCBpLnVpbnQzMig1MCkuZm9yaygpKS5sZGVsaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5sb2dFdmVyeXRpbmcgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2xvZ0V2ZXJ5dGluZycpICYmIGkudWludDMyKDU2KS5ib29sKHQubG9nRXZlcnl0aW5nKSwgbnVsbCAhPSB0Lmhhc0dkcHJDb25zZW50UGF5bG9hZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaGFzR2RwckNvbnNlbnRQYXlsb2FkJykgJiYgaS51aW50MzIoODApLmJvb2wodC5oYXNHZHByQ29uc2VudFBheWxvYWQpLCBudWxsICE9IHQuZ2RwckNvbnNlbnRNb2RlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdnZHByQ29uc2VudE1vZGUnKSAmJiBpLnVpbnQzMig4OCkuaW50MzIodC5nZHByQ29uc2VudE1vZGUpLCBudWxsICE9IHQudXNlRXhwbG9yYXRpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3VzZUV4cGxvcmF0aW9uJykgJiYgaS51aW50MzIoOTYpLmJvb2wodC51c2VFeHBsb3JhdGlvbiksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvQmlkVHJhY2tpbmdzUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvQmlkVHJhY2tpbmdzUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC50cmFja2luZ1JlcXVlc3RNZXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvQmlkVHJhY2tpbmdzUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5tZWRpYUd1aWQgJiYgKGkubWVkaWFHdWlkID0gU3RyaW5nKHQubWVkaWFHdWlkKSksIHQucHJlYmlkcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQucHJlYmlkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9CaWRUcmFja2luZ3NSZXF1ZXN0LnByZWJpZHM6IGFycmF5IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnByZWJpZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5wcmViaWRzLmxlbmd0aDsgKytlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnByZWJpZHNbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvQmlkVHJhY2tpbmdzUmVxdWVzdC5wcmViaWRzOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnByZWJpZHNbZV0gPSBjLlByb3RvUHJlYmlkLmZyb21PYmplY3QodC5wcmViaWRzW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5iaWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5iaWRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0JpZFRyYWNraW5nc1JlcXVlc3QuYmlkczogYXJyYXkgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYmlkcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IHQuYmlkcy5sZW5ndGg7ICsrZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5iaWRzW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0JpZFRyYWNraW5nc1JlcXVlc3QuYmlkczogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5iaWRzW2VdID0gYy5Qcm90b0JpZC5mcm9tT2JqZWN0KHQuYmlkc1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucG9zdEJpZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LnBvc3RCaWRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0JpZFRyYWNraW5nc1JlcXVlc3QucG9zdEJpZHM6IGFycmF5IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBvc3RCaWRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgdC5wb3N0Qmlkcy5sZW5ndGg7ICsrZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5wb3N0Qmlkc1tlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9CaWRUcmFja2luZ3NSZXF1ZXN0LnBvc3RCaWRzOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnBvc3RCaWRzW2VdID0gYy5Qcm90b1Bvc3RCaWQuZnJvbU9iamVjdCh0LnBvc3RCaWRzW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bGwgIT0gdC5sb2dFdmVyeXRpbmcgJiYgKGkubG9nRXZlcnl0aW5nID0gQm9vbGVhbih0LmxvZ0V2ZXJ5dGluZykpLCBudWxsICE9IHQuaGFzR2RwckNvbnNlbnRQYXlsb2FkICYmIChpLmhhc0dkcHJDb25zZW50UGF5bG9hZCA9IEJvb2xlYW4odC5oYXNHZHByQ29uc2VudFBheWxvYWQpKSwgdC5nZHByQ29uc2VudE1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5rbm93bic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2RwckNvbnNlbnRNb2RlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb0NtcCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2RwckNvbnNlbnRNb2RlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOb0NvbnNlbnQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmdkcHJDb25zZW50TW9kZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm9Db25uYXRpeENvbnNlbnQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmdkcHJDb25zZW50TW9kZSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTm90QWxsRGVtYW5kQ29uc2VudCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ2RwckNvbnNlbnRNb2RlID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdBbGxHb29kJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5nZHByQ29uc2VudE1vZGUgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQudXNlRXhwbG9yYXRpb24gJiYgKGkudXNlRXhwbG9yYXRpb24gPSBCb29sZWFuKHQudXNlRXhwbG9yYXRpb24pKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvSGVhdnlBZFRyYWNraW5nUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5oZWF2eUFkQmxvY2tUeXBlRW51bSA9IDAsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWR2ZXJ0aXNlckxpbmVJdGVtSWQnKSAmJiBpLnVpbnQzMigxOCkuc3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpLCBudWxsICE9IHQuaGVhdnlBZEJsb2NrVHlwZUVudW0gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2hlYXZ5QWRCbG9ja1R5cGVFbnVtJykgJiYgaS51aW50MzIoMjQpLmludDMyKHQuaGVhdnlBZEJsb2NrVHlwZUVudW0pLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b0hlYXZ5QWRUcmFja2luZ1JlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b0hlYXZ5QWRUcmFja2luZ1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC50cmFja2luZ1JlcXVlc3RNZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0hlYXZ5QWRUcmFja2luZ1JlcXVlc3QudHJhY2tpbmdSZXF1ZXN0TWV0YTogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBjLk1ldGFkYXRhTW9kZWwuZnJvbU9iamVjdCh0LnRyYWNraW5nUmVxdWVzdE1ldGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIChpLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpKSwgdC5oZWF2eUFkQmxvY2tUeXBlRW51bSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdHbG9iYWwnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhlYXZ5QWRCbG9ja1R5cGVFbnVtID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTY3JpcHQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhlYXZ5QWRCbG9ja1R5cGVFbnVtID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWcGFpZElmcmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGVhdnlBZEJsb2NrVHlwZUVudW0gPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ092ZXJsYXlJZnJhbWUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhlYXZ5QWRCbG9ja1R5cGVFbnVtID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTWVkaWFDbGlja1RyYWNraW5nUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUd1aWQgPSAnJywgdC5wcm90b3R5cGUudHlwZSA9IDAsIHQucHJvdG90eXBlLmNsaWNrVXJsID0gJycsIHQucHJvdG90eXBlLnNsaWRlVGl0bGUgPSAnJywgdC5wcm90b3R5cGUuc2xpZGVOdW1iZXIgPSAwLCB0LnByb3RvdHlwZS5zbGlkZU1lZGlhVHlwZSA9IDAsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5tZWRpYUd1aWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ21lZGlhR3VpZCcpICYmIGkudWludDMyKDE4KS5zdHJpbmcodC5tZWRpYUd1aWQpLCBudWxsICE9IHQudHlwZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHlwZScpICYmIGkudWludDMyKDI0KS5pbnQzMih0LnR5cGUpLCBudWxsICE9IHQuY2xpY2tVcmwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NsaWNrVXJsJykgJiYgaS51aW50MzIoMzQpLnN0cmluZyh0LmNsaWNrVXJsKSwgbnVsbCAhPSB0LnNsaWRlVGl0bGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3NsaWRlVGl0bGUnKSAmJiBpLnVpbnQzMig0Mikuc3RyaW5nKHQuc2xpZGVUaXRsZSksIG51bGwgIT0gdC5zbGlkZU51bWJlciAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnc2xpZGVOdW1iZXInKSAmJiBpLnVpbnQzMig0OCkuaW50MzIodC5zbGlkZU51bWJlciksIG51bGwgIT0gdC5zbGlkZU1lZGlhVHlwZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnc2xpZGVNZWRpYVR5cGUnKSAmJiBpLnVpbnQzMig1NikuaW50MzIodC5zbGlkZU1lZGlhVHlwZSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvTWVkaWFDbGlja1RyYWNraW5nUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvTWVkaWFDbGlja1RyYWNraW5nUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC50cmFja2luZ1JlcXVlc3RNZXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvTWVkaWFDbGlja1RyYWNraW5nUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQubWVkaWFHdWlkICYmIChpLm1lZGlhR3VpZCA9IFN0cmluZyh0Lm1lZGlhR3VpZCkpLCB0LnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1VybENsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWb2x1bWVDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUGxheUNsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQYXVzZUNsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOZXh0Q2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ByZXZpb3VzQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ011dGVDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5tdXRlQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Nsb3NlQ2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSA5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1Njcm9sbENsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0dhbGxlcnlDbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTdWJ0aXRsZUNsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDEyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Z1bGxTY3JlZW5DbGljayc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnR5cGUgPSAxMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdFeGl0RnVsbFNjcmVlbkNsaWNrJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHlwZSA9IDE0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobnVsbCAhPSB0LmNsaWNrVXJsICYmIChpLmNsaWNrVXJsID0gU3RyaW5nKHQuY2xpY2tVcmwpKSwgbnVsbCAhPSB0LnNsaWRlVGl0bGUgJiYgKGkuc2xpZGVUaXRsZSA9IFN0cmluZyh0LnNsaWRlVGl0bGUpKSwgbnVsbCAhPSB0LnNsaWRlTnVtYmVyICYmIChpLnNsaWRlTnVtYmVyID0gMCB8IHQuc2xpZGVOdW1iZXIpLCB0LnNsaWRlTWVkaWFUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ltYWdlJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zbGlkZU1lZGlhVHlwZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVmlkZW8nOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNsaWRlTWVkaWFUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTWVkaWFUcmFja2luZ1JlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS50cmFja2luZ1JlcXVlc3RNZXRhID0gbnVsbCwgdC5wcm90b3R5cGUubWVkaWFHdWlkID0gJycsIHQucHJvdG90eXBlLnF1YXJ0aWxlID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHJhY2tpbmdSZXF1ZXN0TWV0YScpICYmIGMuTWV0YWRhdGFNb2RlbC5lbmNvZGUodC50cmFja2luZ1JlcXVlc3RNZXRhLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0Lm1lZGlhR3VpZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWVkaWFHdWlkJykgJiYgaS51aW50MzIoMTgpLnN0cmluZyh0Lm1lZGlhR3VpZCksIG51bGwgIT0gdC5xdWFydGlsZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncXVhcnRpbGUnKSAmJiBpLnVpbnQzMigzMikuaW50MzIodC5xdWFydGlsZSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvTWVkaWFUcmFja2luZ1JlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b01lZGlhVHJhY2tpbmdSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnRyYWNraW5nUmVxdWVzdE1ldGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9NZWRpYVRyYWNraW5nUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQubWVkaWFHdWlkICYmIChpLm1lZGlhR3VpZCA9IFN0cmluZyh0Lm1lZGlhR3VpZCkpLCB0LnF1YXJ0aWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1N0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5xdWFydGlsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRmlyc3QnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnF1YXJ0aWxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTZWNvbmQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnF1YXJ0aWxlID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUaGlyZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucXVhcnRpbGUgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ZvdXJ0aCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucXVhcnRpbGUgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9TZXNzaW9uQWRCbG9ja2VyUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZHluYW1pY0Vsa0ZpZWxkc1ZhbHVlcyA9IHt9LCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS50cmFja2luZ1JlcXVlc3RNZXRhID0gbnVsbCwgdC5wcm90b3R5cGUuYWRCbG9ja0RldGVjdGlvblR5cGUgPSAwLCB0LnByb3RvdHlwZS5keW5hbWljRWxrRmllbGRzVmFsdWVzID0gby5lbXB0eU9iamVjdCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHJhY2tpbmdSZXF1ZXN0TWV0YScpICYmIGMuTWV0YWRhdGFNb2RlbC5lbmNvZGUodC50cmFja2luZ1JlcXVlc3RNZXRhLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0LmFkQmxvY2tEZXRlY3Rpb25UeXBlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZEJsb2NrRGV0ZWN0aW9uVHlwZScpICYmIGkudWludDMyKDE2KS5pbnQzMih0LmFkQmxvY2tEZXRlY3Rpb25UeXBlKSwgbnVsbCAhPSB0LmR5bmFtaWNFbGtGaWVsZHNWYWx1ZXMgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2R5bmFtaWNFbGtGaWVsZHNWYWx1ZXMnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyh0LmR5bmFtaWNFbGtGaWVsZHNWYWx1ZXMpLCBzID0gMDsgcyA8IGUubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS51aW50MzIoODAyKS5mb3JrKCkudWludDMyKDEwKS5zdHJpbmcoZVtzXSkudWludDMyKDE4KS5zdHJpbmcodC5keW5hbWljRWxrRmllbGRzVmFsdWVzW2Vbc11dKS5sZGVsaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvU2Vzc2lvbkFkQmxvY2tlclJlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b1Nlc3Npb25BZEJsb2NrZXJSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnRyYWNraW5nUmVxdWVzdE1ldGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9TZXNzaW9uQWRCbG9ja2VyUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LmFkQmxvY2tEZXRlY3Rpb25UeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Jhbm5lcic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRCbG9ja0RldGVjdGlvblR5cGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ05ldHdvcmsnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkQmxvY2tEZXRlY3Rpb25UeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5keW5hbWljRWxrRmllbGRzVmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQuZHluYW1pY0Vsa0ZpZWxkc1ZhbHVlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b1Nlc3Npb25BZEJsb2NrZXJSZXF1ZXN0LmR5bmFtaWNFbGtGaWVsZHNWYWx1ZXM6IG9iamVjdCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5keW5hbWljRWxrRmllbGRzVmFsdWVzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXModC5keW5hbWljRWxrRmllbGRzVmFsdWVzKSwgcyA9IDA7IHMgPCBlLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZHluYW1pY0Vsa0ZpZWxkc1ZhbHVlc1tlW3NdXSA9IFN0cmluZyh0LmR5bmFtaWNFbGtGaWVsZHNWYWx1ZXNbZVtzXV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9TZXNzaW9uVGltZVRyYWNraW5nUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS50aW1lUGxheWVkID0gMCwgdC5wcm90b3R5cGUudGltZVBsYXllZEluVmlldyA9IDAsIHQucHJvdG90eXBlLnNlc3Npb25UaW1lID0gMCwgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHJhY2tpbmdSZXF1ZXN0TWV0YScpICYmIGMuTWV0YWRhdGFNb2RlbC5lbmNvZGUodC50cmFja2luZ1JlcXVlc3RNZXRhLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0LnRpbWVQbGF5ZWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RpbWVQbGF5ZWQnKSAmJiBpLnVpbnQzMigxNikuaW50MzIodC50aW1lUGxheWVkKSwgbnVsbCAhPSB0LnRpbWVQbGF5ZWRJblZpZXcgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RpbWVQbGF5ZWRJblZpZXcnKSAmJiBpLnVpbnQzMigyNCkuaW50MzIodC50aW1lUGxheWVkSW5WaWV3KSwgbnVsbCAhPSB0LnNlc3Npb25UaW1lICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzZXNzaW9uVGltZScpICYmIGkudWludDMyKDMyKS5pbnQzMih0LnNlc3Npb25UaW1lKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmZyb21PYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGMuUHJvdG9TZXNzaW9uVGltZVRyYWNraW5nUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvU2Vzc2lvblRpbWVUcmFja2luZ1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC50cmFja2luZ1JlcXVlc3RNZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b1Nlc3Npb25UaW1lVHJhY2tpbmdSZXF1ZXN0LnRyYWNraW5nUmVxdWVzdE1ldGE6IG9iamVjdCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50cmFja2luZ1JlcXVlc3RNZXRhID0gYy5NZXRhZGF0YU1vZGVsLmZyb21PYmplY3QodC50cmFja2luZ1JlcXVlc3RNZXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LnRpbWVQbGF5ZWQgJiYgKGkudGltZVBsYXllZCA9IDAgfCB0LnRpbWVQbGF5ZWQpLCBudWxsICE9IHQudGltZVBsYXllZEluVmlldyAmJiAoaS50aW1lUGxheWVkSW5WaWV3ID0gMCB8IHQudGltZVBsYXllZEluVmlldyksIG51bGwgIT0gdC5zZXNzaW9uVGltZSAmJiAoaS5zZXNzaW9uVGltZSA9IDAgfCB0LnNlc3Npb25UaW1lKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvVHJhY2tpbmdSZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IG51bGwsIHQucHJvdG90eXBlLmhhc0FkQmxvY2tlciA9ICExLCB0LnByb3RvdHlwZS5idW5kbGVOYW1lID0gJycsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5oYXNBZEJsb2NrZXIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2hhc0FkQmxvY2tlcicpICYmIGkudWludDMyKDMyKS5ib29sKHQuaGFzQWRCbG9ja2VyKSwgbnVsbCAhPSB0LmJ1bmRsZU5hbWUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2J1bmRsZU5hbWUnKSAmJiBpLnVpbnQzMig0Mikuc3RyaW5nKHQuYnVuZGxlTmFtZSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvVHJhY2tpbmdSZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9UcmFja2luZ1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC50cmFja2luZ1JlcXVlc3RNZXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b1RyYWNraW5nUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5oYXNBZEJsb2NrZXIgJiYgKGkuaGFzQWRCbG9ja2VyID0gQm9vbGVhbih0Lmhhc0FkQmxvY2tlcikpLCBudWxsICE9IHQuYnVuZGxlTmFtZSAmJiAoaS5idW5kbGVOYW1lID0gU3RyaW5nKHQuYnVuZGxlTmFtZSkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9UcmFja2luZ1Jlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0ID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmVycm9yTWVzc2FnZSA9ICcnLCB0LnByb3RvdHlwZS5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0ID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5pbXByZXNzaW9uUmV2ZW51ZSA9IDAsIHQucHJvdG90eXBlLmFkU2VydmVyTGluZUl0ZW1OYW1lID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvVHJhY2tpbmdSZXNwb25zZSgpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVycm9yTWVzc2FnZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0ICYmIHMucGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdC5sZW5ndGggfHwgKHMucGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdCA9IFtdKSwgcy5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0LnB1c2godC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXByZXNzaW9uUmV2ZW51ZSA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFNlcnZlckxpbmVJdGVtTmFtZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLnBsYXRmb3JtQ2FwcGVkTGluZUl0ZW1JZExpc3QgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUuZXJyb3JNZXNzYWdlID0gJycsIGUuaW1wcmVzc2lvblJldmVudWUgPSAwLCBlLmFkU2VydmVyTGluZUl0ZW1OYW1lID0gJycpLCBudWxsICE9IHQuZXJyb3JNZXNzYWdlICYmIHQuaGFzT3duUHJvcGVydHkoJ2Vycm9yTWVzc2FnZScpICYmIChlLmVycm9yTWVzc2FnZSA9IHQuZXJyb3JNZXNzYWdlKSwgdC5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0ICYmIHQucGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LnBsYXRmb3JtQ2FwcGVkTGluZUl0ZW1JZExpc3QubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0W3NdID0gdC5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0W3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQuaW1wcmVzc2lvblJldmVudWUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaW1wcmVzc2lvblJldmVudWUnKSAmJiAoZS5pbXByZXNzaW9uUmV2ZW51ZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5pbXByZXNzaW9uUmV2ZW51ZSkgPyBTdHJpbmcodC5pbXByZXNzaW9uUmV2ZW51ZSkgOiB0LmltcHJlc3Npb25SZXZlbnVlKSwgbnVsbCAhPSB0LmFkU2VydmVyTGluZUl0ZW1OYW1lICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkU2VydmVyTGluZUl0ZW1OYW1lJykgJiYgKGUuYWRTZXJ2ZXJMaW5lSXRlbU5hbWUgPSB0LmFkU2VydmVyTGluZUl0ZW1OYW1lKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvVmlkZW9BZEltcHJlc3Npb25SZXF1ZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IG51bGwsIHQucHJvdG90eXBlLm1lZGlhR3VpZCA9ICcnLCB0LnByb3RvdHlwZS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gJycsIHQucHJvdG90eXBlLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gJycsIHQucHJvdG90eXBlLnN5bmNlZFVzZXIgPSAhMSwgdC5wcm90b3R5cGUudGltZVNwZW50ID0gMCwgdC5wcm90b3R5cGUuZW5jcnlwdGVkUHJpY2UgPSAnJywgdC5wcm90b3R5cGUuY3JlYXRpdmVJZCA9ICcnLCB0LnByb3RvdHlwZS5ydGJTZWF0SWQgPSAnJywgdC5wcm90b3R5cGUucnRiQWRvbWFpbiA9ICcnLCB0LnByb3RvdHlwZS5jdXN0b21DbGllbnRQcmljZSA9IDAsIHQucHJvdG90eXBlLmFkc291cmNlVHlwZSA9IDAsIHQucHJvdG90eXBlLnZhc3RNZWRpYVR5cGUgPSAnJywgdC5wcm90b3R5cGUuYWRQb2RTbG90UG9zaXRpb24gPSAwLCB0LnByb3RvdHlwZS5wcmViaWRKc0JpZGRlck5hbWUgPSAnJywgdC5wcm90b3R5cGUuZHNwSWQgPSAnJywgdC5wcm90b3R5cGUuY254QmlkSWQgPSAnJywgdC5wcm90b3R5cGUud2luVG9BZExvYWRlZFRpbWUgPSAwLCB0LnByb3RvdHlwZS5zdGFydEFkVG9JbXByZXNzaW9uVGltZSA9IDAsIHQucHJvdG90eXBlLmRlY2xhcmVkRHVyYXRpb24gPSAwLCB0LnByb3RvdHlwZS5pbXByZXNzaW9uRHVyYXRpb24gPSAwLCB0LnByb3RvdHlwZS51c2VFeHBsb3JhdGlvbiA9ICExLCB0LnByb3RvdHlwZS5hdWN0aW9uSW5mb3JtYXRpb24gPSBudWxsLCB0LnByb3RvdHlwZS5wbGF5ZXJXaWR0aCA9IDAsIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgfHwgKGkgPSBhLmNyZWF0ZSgpKSwgbnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3RyYWNraW5nUmVxdWVzdE1ldGEnKSAmJiBjLk1ldGFkYXRhTW9kZWwuZW5jb2RlKHQudHJhY2tpbmdSZXF1ZXN0TWV0YSwgaS51aW50MzIoMTApLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5tZWRpYUd1aWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ21lZGlhR3VpZCcpICYmIGkudWludDMyKDI2KS5zdHJpbmcodC5tZWRpYUd1aWQpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncHVibGlzaGVyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDQyKS5zdHJpbmcodC5wdWJsaXNoZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZHZlcnRpc2VyTGluZUl0ZW1JZCcpICYmIGkudWludDMyKDUwKS5zdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5zeW5jZWRVc2VyICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdzeW5jZWRVc2VyJykgJiYgaS51aW50MzIoNTYpLmJvb2wodC5zeW5jZWRVc2VyKSwgbnVsbCAhPSB0LnRpbWVTcGVudCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndGltZVNwZW50JykgJiYgaS51aW50MzIoNjQpLmludDMyKHQudGltZVNwZW50KSwgbnVsbCAhPSB0LmVuY3J5cHRlZFByaWNlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdlbmNyeXB0ZWRQcmljZScpICYmIGkudWludDMyKDc0KS5zdHJpbmcodC5lbmNyeXB0ZWRQcmljZSksIG51bGwgIT0gdC5jcmVhdGl2ZUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjcmVhdGl2ZUlkJykgJiYgaS51aW50MzIoODIpLnN0cmluZyh0LmNyZWF0aXZlSWQpLCBudWxsICE9IHQucnRiU2VhdElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdydGJTZWF0SWQnKSAmJiBpLnVpbnQzMig5MCkuc3RyaW5nKHQucnRiU2VhdElkKSwgbnVsbCAhPSB0LnJ0YkFkb21haW4gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3J0YkFkb21haW4nKSAmJiBpLnVpbnQzMig5OCkuc3RyaW5nKHQucnRiQWRvbWFpbiksIG51bGwgIT0gdC5jdXN0b21DbGllbnRQcmljZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3VzdG9tQ2xpZW50UHJpY2UnKSAmJiBpLnVpbnQzMigxMDUpLmRvdWJsZSh0LmN1c3RvbUNsaWVudFByaWNlKSwgbnVsbCAhPSB0LmFkc291cmNlVHlwZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWRzb3VyY2VUeXBlJykgJiYgaS51aW50MzIoMTEyKS5pbnQzMih0LmFkc291cmNlVHlwZSksIG51bGwgIT0gdC52YXN0TWVkaWFUeXBlICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd2YXN0TWVkaWFUeXBlJykgJiYgaS51aW50MzIoMTIyKS5zdHJpbmcodC52YXN0TWVkaWFUeXBlKSwgbnVsbCAhPSB0LmFkUG9kU2xvdFBvc2l0aW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdhZFBvZFNsb3RQb3NpdGlvbicpICYmIGkudWludDMyKDE0NCkuaW50MzIodC5hZFBvZFNsb3RQb3NpdGlvbiksIG51bGwgIT0gdC5wcmViaWRKc0JpZGRlck5hbWUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3ByZWJpZEpzQmlkZGVyTmFtZScpICYmIGkudWludDMyKDE1NCkuc3RyaW5nKHQucHJlYmlkSnNCaWRkZXJOYW1lKSwgbnVsbCAhPSB0LmRzcElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkc3BJZCcpICYmIGkudWludDMyKDE2Mikuc3RyaW5nKHQuZHNwSWQpLCBudWxsICE9IHQuY254QmlkSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NueEJpZElkJykgJiYgaS51aW50MzIoMTcwKS5zdHJpbmcodC5jbnhCaWRJZCksIG51bGwgIT0gdC53aW5Ub0FkTG9hZGVkVGltZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnd2luVG9BZExvYWRlZFRpbWUnKSAmJiBpLnVpbnQzMigxNzYpLmludDMyKHQud2luVG9BZExvYWRlZFRpbWUpLCBudWxsICE9IHQuc3RhcnRBZFRvSW1wcmVzc2lvblRpbWUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3N0YXJ0QWRUb0ltcHJlc3Npb25UaW1lJykgJiYgaS51aW50MzIoMTg0KS5pbnQzMih0LnN0YXJ0QWRUb0ltcHJlc3Npb25UaW1lKSwgbnVsbCAhPSB0LmRlY2xhcmVkRHVyYXRpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2RlY2xhcmVkRHVyYXRpb24nKSAmJiBpLnVpbnQzMigxOTMpLmRvdWJsZSh0LmRlY2xhcmVkRHVyYXRpb24pLCBudWxsICE9IHQuaW1wcmVzc2lvbkR1cmF0aW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdpbXByZXNzaW9uRHVyYXRpb24nKSAmJiBpLnVpbnQzMigyMDEpLmRvdWJsZSh0LmltcHJlc3Npb25EdXJhdGlvbiksIG51bGwgIT0gdC51c2VFeHBsb3JhdGlvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndXNlRXhwbG9yYXRpb24nKSAmJiBpLnVpbnQzMigyMDgpLmJvb2wodC51c2VFeHBsb3JhdGlvbiksIG51bGwgIT0gdC5hdWN0aW9uSW5mb3JtYXRpb24gJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2F1Y3Rpb25JbmZvcm1hdGlvbicpICYmIGMuUHJvdG9BdWN0aW9uSW5mb3JtYXRpb24uZW5jb2RlKHQuYXVjdGlvbkluZm9ybWF0aW9uLCBpLnVpbnQzMigyMTgpLmZvcmsoKSkubGRlbGltKCksIG51bGwgIT0gdC5wbGF5ZXJXaWR0aCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncGxheWVyV2lkdGgnKSAmJiBpLnVpbnQzMigyMjQpLmludDMyKHQucGxheWVyV2lkdGgpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b1ZpZGVvQWRJbXByZXNzaW9uUmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBjLlByb3RvVmlkZW9BZEltcHJlc3Npb25SZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnRyYWNraW5nUmVxdWVzdE1ldGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9WaWRlb0FkSW1wcmVzc2lvblJlcXVlc3QudHJhY2tpbmdSZXF1ZXN0TWV0YTogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBjLk1ldGFkYXRhTW9kZWwuZnJvbU9iamVjdCh0LnRyYWNraW5nUmVxdWVzdE1ldGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobnVsbCAhPSB0Lm1lZGlhR3VpZCAmJiAoaS5tZWRpYUd1aWQgPSBTdHJpbmcodC5tZWRpYUd1aWQpKSwgbnVsbCAhPSB0LnB1Ymxpc2hlckxpbmVJdGVtSWQgJiYgKGkucHVibGlzaGVyTGluZUl0ZW1JZCA9IFN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpKSwgbnVsbCAhPSB0LmFkdmVydGlzZXJMaW5lSXRlbUlkICYmIChpLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpKSwgbnVsbCAhPSB0LnN5bmNlZFVzZXIgJiYgKGkuc3luY2VkVXNlciA9IEJvb2xlYW4odC5zeW5jZWRVc2VyKSksIG51bGwgIT0gdC50aW1lU3BlbnQgJiYgKGkudGltZVNwZW50ID0gMCB8IHQudGltZVNwZW50KSwgbnVsbCAhPSB0LmVuY3J5cHRlZFByaWNlICYmIChpLmVuY3J5cHRlZFByaWNlID0gU3RyaW5nKHQuZW5jcnlwdGVkUHJpY2UpKSwgbnVsbCAhPSB0LmNyZWF0aXZlSWQgJiYgKGkuY3JlYXRpdmVJZCA9IFN0cmluZyh0LmNyZWF0aXZlSWQpKSwgbnVsbCAhPSB0LnJ0YlNlYXRJZCAmJiAoaS5ydGJTZWF0SWQgPSBTdHJpbmcodC5ydGJTZWF0SWQpKSwgbnVsbCAhPSB0LnJ0YkFkb21haW4gJiYgKGkucnRiQWRvbWFpbiA9IFN0cmluZyh0LnJ0YkFkb21haW4pKSwgbnVsbCAhPSB0LmN1c3RvbUNsaWVudFByaWNlICYmIChpLmN1c3RvbUNsaWVudFByaWNlID0gTnVtYmVyKHQuY3VzdG9tQ2xpZW50UHJpY2UpKSwgdC5hZHNvdXJjZVR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVW5rbm93bic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWcGFpZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWYXN0TWVkaWEnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkc291cmNlVHlwZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQ254TWVkaWEnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkc291cmNlVHlwZSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSncnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkc291cmNlVHlwZSA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSW1hJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hZHNvdXJjZVR5cGUgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FPTCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRzb3VyY2VUeXBlID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnZhc3RNZWRpYVR5cGUgJiYgKGkudmFzdE1lZGlhVHlwZSA9IFN0cmluZyh0LnZhc3RNZWRpYVR5cGUpKSwgbnVsbCAhPSB0LmFkUG9kU2xvdFBvc2l0aW9uICYmIChpLmFkUG9kU2xvdFBvc2l0aW9uID0gMCB8IHQuYWRQb2RTbG90UG9zaXRpb24pLCBudWxsICE9IHQucHJlYmlkSnNCaWRkZXJOYW1lICYmIChpLnByZWJpZEpzQmlkZGVyTmFtZSA9IFN0cmluZyh0LnByZWJpZEpzQmlkZGVyTmFtZSkpLCBudWxsICE9IHQuZHNwSWQgJiYgKGkuZHNwSWQgPSBTdHJpbmcodC5kc3BJZCkpLCBudWxsICE9IHQuY254QmlkSWQgJiYgKGkuY254QmlkSWQgPSBTdHJpbmcodC5jbnhCaWRJZCkpLCBudWxsICE9IHQud2luVG9BZExvYWRlZFRpbWUgJiYgKGkud2luVG9BZExvYWRlZFRpbWUgPSAwIHwgdC53aW5Ub0FkTG9hZGVkVGltZSksIG51bGwgIT0gdC5zdGFydEFkVG9JbXByZXNzaW9uVGltZSAmJiAoaS5zdGFydEFkVG9JbXByZXNzaW9uVGltZSA9IDAgfCB0LnN0YXJ0QWRUb0ltcHJlc3Npb25UaW1lKSwgbnVsbCAhPSB0LmRlY2xhcmVkRHVyYXRpb24gJiYgKGkuZGVjbGFyZWREdXJhdGlvbiA9IE51bWJlcih0LmRlY2xhcmVkRHVyYXRpb24pKSwgbnVsbCAhPSB0LmltcHJlc3Npb25EdXJhdGlvbiAmJiAoaS5pbXByZXNzaW9uRHVyYXRpb24gPSBOdW1iZXIodC5pbXByZXNzaW9uRHVyYXRpb24pKSwgbnVsbCAhPSB0LnVzZUV4cGxvcmF0aW9uICYmIChpLnVzZUV4cGxvcmF0aW9uID0gQm9vbGVhbih0LnVzZUV4cGxvcmF0aW9uKSksIG51bGwgIT0gdC5hdWN0aW9uSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC5hdWN0aW9uSW5mb3JtYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9WaWRlb0FkSW1wcmVzc2lvblJlcXVlc3QuYXVjdGlvbkluZm9ybWF0aW9uOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXVjdGlvbkluZm9ybWF0aW9uID0gYy5Qcm90b0F1Y3Rpb25JbmZvcm1hdGlvbi5mcm9tT2JqZWN0KHQuYXVjdGlvbkluZm9ybWF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LnBsYXllcldpZHRoICYmIChpLnBsYXllcldpZHRoID0gMCB8IHQucGxheWVyV2lkdGgpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9WaWRlb0FkSW1wcmVzc2lvblZpZXdhYmxlUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUd1aWQgPSAnJywgdC5wcm90b3R5cGUucHVibGlzaGVyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5ydGJTZWF0SWQgPSAnJywgdC5wcm90b3R5cGUuZHNwSWQgPSAnJywgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndHJhY2tpbmdSZXF1ZXN0TWV0YScpICYmIGMuTWV0YWRhdGFNb2RlbC5lbmNvZGUodC50cmFja2luZ1JlcXVlc3RNZXRhLCBpLnVpbnQzMigxMCkuZm9yaygpKS5sZGVsaW0oKSwgbnVsbCAhPSB0Lm1lZGlhR3VpZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnbWVkaWFHdWlkJykgJiYgaS51aW50MzIoMjYpLnN0cmluZyh0Lm1lZGlhR3VpZCksIG51bGwgIT0gdC5wdWJsaXNoZXJMaW5lSXRlbUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwdWJsaXNoZXJMaW5lSXRlbUlkJykgJiYgaS51aW50MzIoNDIpLnN0cmluZyh0LnB1Ymxpc2hlckxpbmVJdGVtSWQpLCBudWxsICE9IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2FkdmVydGlzZXJMaW5lSXRlbUlkJykgJiYgaS51aW50MzIoNTApLnN0cmluZyh0LmFkdmVydGlzZXJMaW5lSXRlbUlkKSwgbnVsbCAhPSB0LnJ0YlNlYXRJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncnRiU2VhdElkJykgJiYgaS51aW50MzIoNTgpLnN0cmluZyh0LnJ0YlNlYXRJZCksIG51bGwgIT0gdC5kc3BJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZHNwSWQnKSAmJiBpLnVpbnQzMig2Nikuc3RyaW5nKHQuZHNwSWQpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Qcm90b1ZpZGVvQWRJbXByZXNzaW9uVmlld2FibGVSZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9WaWRlb0FkSW1wcmVzc2lvblZpZXdhYmxlUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnRyYWNraW5nUmVxdWVzdE1ldGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgdC50cmFja2luZ1JlcXVlc3RNZXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvVmlkZW9BZEltcHJlc3Npb25WaWV3YWJsZVJlcXVlc3QudHJhY2tpbmdSZXF1ZXN0TWV0YTogb2JqZWN0IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBjLk1ldGFkYXRhTW9kZWwuZnJvbU9iamVjdCh0LnRyYWNraW5nUmVxdWVzdE1ldGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQubWVkaWFHdWlkICYmIChpLm1lZGlhR3VpZCA9IFN0cmluZyh0Lm1lZGlhR3VpZCkpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiAoaS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQucHVibGlzaGVyTGluZUl0ZW1JZCkpLCBudWxsICE9IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgJiYgKGkuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSBTdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCkpLCBudWxsICE9IHQucnRiU2VhdElkICYmIChpLnJ0YlNlYXRJZCA9IFN0cmluZyh0LnJ0YlNlYXRJZCkpLCBudWxsICE9IHQuZHNwSWQgJiYgKGkuZHNwSWQgPSBTdHJpbmcodC5kc3BJZCkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9WaWRlb0FkUXVhcnRpbGVzUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRyYWNraW5nUmVxdWVzdE1ldGEgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUd1aWQgPSAnJywgdC5wcm90b3R5cGUucHVibGlzaGVyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5xdWFydGlsZSA9IDAsIHQucHJvdG90eXBlLnJ0YlNlYXRJZCA9ICcnLCB0LnByb3RvdHlwZS5kc3BJZCA9ICcnLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC50cmFja2luZ1JlcXVlc3RNZXRhICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd0cmFja2luZ1JlcXVlc3RNZXRhJykgJiYgYy5NZXRhZGF0YU1vZGVsLmVuY29kZSh0LnRyYWNraW5nUmVxdWVzdE1ldGEsIGkudWludDMyKDEwKS5mb3JrKCkpLmxkZWxpbSgpLCBudWxsICE9IHQubWVkaWFHdWlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdtZWRpYUd1aWQnKSAmJiBpLnVpbnQzMigyNikuc3RyaW5nKHQubWVkaWFHdWlkKSwgbnVsbCAhPSB0LnB1Ymxpc2hlckxpbmVJdGVtSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3B1Ymxpc2hlckxpbmVJdGVtSWQnKSAmJiBpLnVpbnQzMig0Mikuc3RyaW5nKHQucHVibGlzaGVyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYWR2ZXJ0aXNlckxpbmVJdGVtSWQnKSAmJiBpLnVpbnQzMig1MCkuc3RyaW5nKHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQpLCBudWxsICE9IHQucXVhcnRpbGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3F1YXJ0aWxlJykgJiYgaS51aW50MzIoNTYpLmludDMyKHQucXVhcnRpbGUpLCBudWxsICE9IHQucnRiU2VhdElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdydGJTZWF0SWQnKSAmJiBpLnVpbnQzMig2Nikuc3RyaW5nKHQucnRiU2VhdElkKSwgbnVsbCAhPSB0LmRzcElkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkc3BJZCcpICYmIGkudWludDMyKDc0KS5zdHJpbmcodC5kc3BJZCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvVmlkZW9BZFF1YXJ0aWxlc1JlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5Qcm90b1ZpZGVvQWRRdWFydGlsZXNSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQudHJhY2tpbmdSZXF1ZXN0TWV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnRyYWNraW5nUmVxdWVzdE1ldGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCcuUHJvdG9WaWRlb0FkUXVhcnRpbGVzUmVxdWVzdC50cmFja2luZ1JlcXVlc3RNZXRhOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhY2tpbmdSZXF1ZXN0TWV0YSA9IGMuTWV0YWRhdGFNb2RlbC5mcm9tT2JqZWN0KHQudHJhY2tpbmdSZXF1ZXN0TWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQubWVkaWFHdWlkICYmIChpLm1lZGlhR3VpZCA9IFN0cmluZyh0Lm1lZGlhR3VpZCkpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiAoaS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gU3RyaW5nKHQucHVibGlzaGVyTGluZUl0ZW1JZCkpLCBudWxsICE9IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgJiYgKGkuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSBTdHJpbmcodC5hZHZlcnRpc2VyTGluZUl0ZW1JZCkpLCB0LnF1YXJ0aWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1N0YXJ0JzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5xdWFydGlsZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRmlyc3QnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnF1YXJ0aWxlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTZWNvbmQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnF1YXJ0aWxlID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUaGlyZCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucXVhcnRpbGUgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ZvdXJ0aCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucXVhcnRpbGUgPSA0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQucnRiU2VhdElkICYmIChpLnJ0YlNlYXRJZCA9IFN0cmluZyh0LnJ0YlNlYXRJZCkpLCBudWxsICE9IHQuZHNwSWQgJiYgKGkuZHNwSWQgPSBTdHJpbmcodC5kc3BJZCkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Vc2VyU3luY1JlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS51c2VySWQgPSAnJywgdC5wcm90b3R5cGUuZGVtYW5kUGFydG5lciA9IDAsIHQucHJvdG90eXBlLmRlbWFuZFBhcnRuZXJVc2VySWQgPSAnJywgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudXNlcklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd1c2VySWQnKSAmJiBpLnVpbnQzMigxMCkuc3RyaW5nKHQudXNlcklkKSwgbnVsbCAhPSB0LmRlbWFuZFBhcnRuZXIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2RlbWFuZFBhcnRuZXInKSAmJiBpLnVpbnQzMigxNikuaW50MzIodC5kZW1hbmRQYXJ0bmVyKSwgbnVsbCAhPSB0LmRlbWFuZFBhcnRuZXJVc2VySWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2RlbWFuZFBhcnRuZXJVc2VySWQnKSAmJiBpLnVpbnQzMigyNikuc3RyaW5nKHQuZGVtYW5kUGFydG5lclVzZXJJZCksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvVXNlclN5bmNSZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9Vc2VyU3luY1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC51c2VySWQgJiYgKGkudXNlcklkID0gU3RyaW5nKHQudXNlcklkKSksIG51bGwgIT0gdC5kZW1hbmRQYXJ0bmVyICYmIChpLmRlbWFuZFBhcnRuZXIgPSAwIHwgdC5kZW1hbmRQYXJ0bmVyKSwgbnVsbCAhPSB0LmRlbWFuZFBhcnRuZXJVc2VySWQgJiYgKGkuZGVtYW5kUGFydG5lclVzZXJJZCA9IFN0cmluZyh0LmRlbWFuZFBhcnRuZXJVc2VySWQpKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bSA9IChzID0ge30sIChuID0gT2JqZWN0LmNyZWF0ZShzKSlbc1swXSA9ICdBdXRvcGxheSddID0gMCwgbltzWzFdID0gJ1Njcm9sbFRvUGxheSddID0gMSwgbltzWzJdID0gJ0NsaWNrVG9QbGF5J10gPSAyLCBuKSwgYy5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ09mZiddID0gMCwgaVt0WzFdID0gJ09uSG92ZXInXSA9IDEsIGlbdFsyXSA9ICdPbkhvdmVyQWZ0ZXJGaXJzdEFkJ10gPSAyLCBpW3RbM10gPSAnQWx3YXlzT24nXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJGbG9hdGluZ01vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdPZmYnXSA9IDAsIGlbdFsxXSA9ICdPblBhZ2VMb2FkJ10gPSAxLCBpW3RbMl0gPSAnQWZ0ZXJJblZpZXcnXSA9IDIsIGlbdFszXSA9ICdBbHdheXMnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJTb3VuZE1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdNdXRlJ10gPSAwLCBpW3RbMV0gPSAnT24nXSA9IDEsIGlbdFsyXSA9ICdIb3ZlciddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1BsYXllckluc2VydE1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdXaXRoaW5Db250YWluZXInXSA9IDAsIGlbdFsxXSA9ICdCZWZvcmVDb250YWluZXInXSA9IDEsIGlbdFsyXSA9ICdBZnRlckNvbnRhaW5lciddID0gMiwgaVt0WzNdID0gJ1JlcGxhY2VDb250YWluZXInXSA9IDMsIGlbdFs0XSA9ICdIaWRlQ29udGFpbmVyJ10gPSA0LCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRWaWV3YWJpbGl0eVBvbGljeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0RlZmF1bHQnXSA9IDAsIGlbdFsxXSA9ICdTdHJpY3QnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9TaGFyaW5nRGVzdGluYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdGYWNlYm9vayddID0gMCwgaVt0WzFdID0gJ1R3aXR0ZXInXSA9IDEsIGlbdFsyXSA9ICdMaW5rZWRJbiddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0Zsb2F0aW5nRml4ZWRQb3NpdGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdQYWdlJ10gPSAwLCBpW3RbMV0gPSAnRWxlbWVudCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1Bvc2l0aW9uTW9kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0JvdHRvbVJpZ2h0J10gPSAwLCBpW3RbMV0gPSAnQm90dG9tTGVmdCddID0gMSwgaVt0WzJdID0gJ1RvcFJpZ2h0J10gPSAyLCBpW3RbM10gPSAnVG9wTGVmdCddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkUGxheWJhY2tNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnQXV0b3BsYXknXSA9IDAsIGlbdFsxXSA9ICdTY3JvbGxUb1BsYXknXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9GbG9hdGluZ0FwcGVuZExvY2F0aW9uRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0Fib3ZlJ10gPSAwLCBpW3RbMV0gPSAnQmVsb3cnXSA9IDEsIGlbdFsyXSA9ICdXaXRoaW4nXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJBZFNraXBwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0lmTG9uZ2VyVGhhbiddID0gMCwgaVt0WzFdID0gJ0Fsd2F5cyddID0gMSwgaVt0WzJdID0gJ05vUmVzdHJpY3Rpb25zJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvVmlkZW9RdWFsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnQXV0byddID0gMCwgaVt0WzFdID0gJ0hpZ2gxMDgwcCddID0gMSwgaVt0WzJdID0gJ0hpZ2g3MjBwJ10gPSAyLCBpW3RbM10gPSAnTWVkaXVtMzYwcCddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0ltcGxlbWVudGF0aW9uVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1dlYiddID0gMCwgaVt0WzFdID0gJ0FtcCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkQnJlYWtUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ05vbmUnXSA9IDAsIGlbdFsxXSA9ICdQcmVSb2xsJ10gPSAxLCBpW3RbMl0gPSAnTWlkUm9sbCddID0gMiwgaVt0WzNdID0gJ1Bvc3RSb2xsJ10gPSAzLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRTbG90QWRUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1NpbmdsZUFkJ10gPSAwLCBpW3RbMV0gPSAnQWRQb2QnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9EZXZpY2VUeXBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnRGVza3RvcCddID0gMCwgaVt0WzFdID0gJ1NtYXJ0cGhvbmUnXSA9IDEsIGlbdFsyXSA9ICdUYWJsZXQnXSA9IDIsIGlbdFszXSA9ICdHYW1lQ29uc29sZSddID0gMywgaVt0WzRdID0gJ1NtYXJ0VFYnXSA9IDQsIGlbdFs1XSA9ICdXZWFyYWJsZUNvbXB1dGVyJ10gPSA1LCBpW3RbNl0gPSAnUERBJ10gPSA2LCBpW3RbN10gPSAnVW5yZWNvZ25pemVkJ10gPSA3LCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQ29va2llU2VjdXJlTW9kZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdTZWN1cmUnXSA9IDAsIGlbdFsxXSA9ICdVbnNlY3VyZSddID0gMSwgaVt0WzJdID0gJ0F1dG8nXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9UcmFja2VyVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0ltYWdlJ10gPSAwLCBpW3RbMV0gPSAnSmF2YXNjcmlwdCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1RyYWNrZXJUcmlnZ2VyVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0ltcHJlc3Npb24nXSA9IDAsIGlbdFsxXSA9ICdDb21wbGV0ZTI1UGMnXSA9IDEsIGlbdFsyXSA9ICdDb21wbGV0ZTUwUGMnXSA9IDIsIGlbdFszXSA9ICdDb21wbGV0ZTc1UGMnXSA9IDMsIGlbdFs0XSA9ICdWaWV3Q29tcGxldGlvbiddID0gNCwgaVt0WzVdID0gJ1ZpZGVvQ2xpY2snXSA9IDUsIGlbdFs2XSA9ICdQYXVzZSddID0gNiwgaVt0WzddID0gJ1Jlc3VtZSddID0gNywgaVt0WzhdID0gJ011dGUnXSA9IDgsIGlbdFs5XSA9ICdVbm11dGUnXSA9IDksIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9DcmVhdGl2ZVR5cGVFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnVGhpcmRQYXJ0eSddID0gMCwgaVt0WzFdID0gJ01lZGlhRmlsZSddID0gMSwgaVt0WzJdID0gJ1J0YiddID0gMiwgaVt0WzNdID0gJ0V4dGVybmFsJ10gPSAzLCBpW3RbNF0gPSAnSGVhZGVyQmlkZGVyJ10gPSA0LCBpW3RbN10gPSAnVGFtJ10gPSA3LCBpW3RbOF0gPSAnVGFtRGVhbCddID0gOCwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1Jlc2V0Q2FwVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdUaW1lQ2FwcGluZyddID0gMCwgaVt0WzFdID0gJ0NvbnRlbnRDYXBwaW5nJ10gPSAxLCBpW3RbMl0gPSAnT3Bwb3J0dW5pdHlDYXBwaW5nJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRTbG90c0VudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdQcmVSb2xsJ10gPSAwLCBpW3RbMV0gPSAnTWlkUm9sbCddID0gMSwgaVt0WzJdID0gJ1Bvc3RSb2xsJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTGluZUl0ZW1Qcmlvcml0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0hvdXNlJ10gPSAwLCBpW3RbMV0gPSAnRGVmYXVsdCddID0gMSwgaVt0WzJdID0gJ1ByZWZlcnJlZCddID0gMiwgaVt0WzNdID0gJ1RvcCddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkU2tpcE1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJZkxvbmdlclRoYW4zMVNlYyddID0gMCwgaVt0WzFdID0gJ0Fsd2F5cyddID0gMSwgaVt0WzJdID0gJ05ldmVyJ10gPSAyLCBpW3RbM10gPSAnTm90QXBsaWNhYmxlJ10gPSAzLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRUeXBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnVmlkZW8nXSA9IDAsIGlbdFsxXSA9ICdPdmVybGF5J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQ2hvaWNlQ3JpdGVyaWFFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnT25seSddID0gMCwgaVt0WzFdID0gJ0V4Y2VwdCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMV0gPSAnQWxsJ10gPSAxLCBpW3RbMl0gPSAnU2luZ2xlQWQnXSA9IDIsIGlbdFszXSA9ICdBZFBvZCddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtVGFyZ2V0aW5nVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdPbmx5J10gPSAwLCBpW3RbMV0gPSAnRXhjZXB0J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTGluZUl0ZW1BZFNsb3RUYXJnZXRpbmdUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzFdID0gJ1NwZWNpZmljU2xvdHMnXSA9IDEsIGlbdFsyXSA9ICdJbnRlcnZhbCddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtUGF1c2VBZE91dE9mVmlld0VudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdEZWZhdWx0J10gPSAwLCBpW3RbMV0gPSAnU3RyaWN0J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTGluZUl0ZW1Db250ZXh0dWFsVGFyZ2V0aW5nRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0luY2x1ZGVBbnknXSA9IDAsIGlbdFsxXSA9ICdJbmNsdWRlQWxsJ10gPSAxLCBpW3RbMl0gPSAnRXhjbHVkZUFueSddID0gMiwgaVt0WzNdID0gJ0V4Y2x1ZGVBbGwnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9TaXplQ2hvaWNlQ3JpdGVyaWFFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnR3JlYXRlclRoYW4nXSA9IDAsIGlbdFsxXSA9ICdTbWFsbGVyVGhhbiddID0gMSwgaVt0WzJdID0gJ0JldHdlZW4nXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnRkFUQUwnXSA9IDAsIGlbdFsxXSA9ICdXQVJOSU5HJ10gPSAxLCBpW3RbMl0gPSAnSU5GTyddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b01lZGlhVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJbWFnZSddID0gMCwgaVt0WzFdID0gJ1ZpZGVvJ10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnUmVxdWVzdEV4Y2VwdGlvbiddID0gMCwgaVt0WzFdID0gJ1RpbWVvdXQnXSA9IDEsIGlbdFsyXSA9ICdFbXB0eVJlc3BvbnNlJ10gPSAyLCBpW3RbM10gPSAnSW52YWxpZFJlc3BvbnNlJ10gPSAzLCBpW3RbNF0gPSAnTm9CaWQnXSA9IDQsIGlbdFs1XSA9ICdCaWRCZWxvd0Zsb29yJ10gPSA1LCBpW3RbNl0gPSAnRGVhbElkTWlzbWF0Y2gnXSA9IDYsIGlbdFs3XSA9ICdDc0ludmFsaWRSZXNwb25zZSddID0gNywgaVt0WzhdID0gJ0NzUmVxdWVzdEV4Y2VwdGlvbiddID0gOCwgaVt0WzldID0gJ0NzRW1wdHlSZXNwb25zZSddID0gOSwgaVt0WzExXSA9ICdOb0xpYkluUGFnZSddID0gMTEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUGFydG5lck5vQmlkUmVhc29uRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1Vua25vd24nXSA9IDAsIGlbdFsxXSA9ICdUZWNobmljYWxFcnJvciddID0gMSwgaVt0WzJdID0gJ0ludmFsaWRSZXF1ZXN0J10gPSAyLCBpW3RbM10gPSAnS25vd25XZWJTcGlkZXInXSA9IDMsIGlbdFs0XSA9ICdTdXNwZWN0ZWROb25IdW1hblRyYWZmaWMnXSA9IDQsIGlbdFs1XSA9ICdDbG91ZElQJ10gPSA1LCBpW3RbNl0gPSAnVW5zdXBwb3J0ZWREZXZpY2UnXSA9IDYsIGlbdFs3XSA9ICdCbG9ja2VkUHVibGlzaGVyJ10gPSA3LCBpW3RbOF0gPSAnVW5tYXRjaGVkVXNlciddID0gOCwgaVt0WzldID0gJ0RhaWx5UmVhZGVyQ2FwTWV0J10gPSA5LCBpW3RbMTBdID0gJ0RhaWx5RG9tYWluQ2FwTWV0J10gPSAxMCwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkQmxvY2tEZXRlY3Rpb25UeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0Jhbm5lciddID0gMCwgaVt0WzFdID0gJ05ldHdvcmsnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BZENsaWNrVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFsxXSA9ICdBZENsaWNrJ10gPSAxLCBpW3RbMl0gPSAnQWRDbGlja1Rocm91Z2gnXSA9IDIsIGlbdFszXSA9ICdBZFNraXBDbGljayddID0gMywgaVt0WzRdID0gJ1ZvbHVtZUNsaWNrJ10gPSA0LCBpW3RbNV0gPSAnUGF1c2VDbGljayddID0gNSwgaVt0WzZdID0gJ1BsYXlDbGljayddID0gNiwgaVt0WzddID0gJ0Z1bGxTY3JlZW5DbGljayddID0gNywgaVt0WzhdID0gJ011dGVDbGljayddID0gOCwgaVt0WzldID0gJ1VubXV0ZUNsaWNrJ10gPSA5LCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRzb3VyY2VUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1Vua25vd24nXSA9IDAsIGlbdFsxXSA9ICdWcGFpZCddID0gMSwgaVt0WzJdID0gJ1Zhc3RNZWRpYSddID0gMiwgaVt0WzNdID0gJ0NueE1lZGlhJ10gPSAzLCBpW3RbNF0gPSAnSncnXSA9IDQsIGlbdFs1XSA9ICdJbWEnXSA9IDUsIGlbdFs2XSA9ICdBT0wnXSA9IDYsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BdWN0aW9uTG9zc1JlYXNvbkVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdUYXJnZXRpbmdNaXNtYXRjaCddID0gMCwgaVt0WzFdID0gJ0NvbXBldGl0b3JQcmlvcml0eSddID0gMSwgaVt0WzJdID0gJ0FkT3Bwb3J0dW5pdHlFbmQnXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9HZHByQ29uc2VudE1vZGVFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnVW5rbm93biddID0gMCwgaVt0WzFdID0gJ05vQ21wJ10gPSAxLCBpW3RbMl0gPSAnTm9Db25zZW50J10gPSAyLCBpW3RbM10gPSAnTm9Db25uYXRpeENvbnNlbnQnXSA9IDMsIGlbdFs0XSA9ICdOb3RBbGxEZW1hbmRDb25zZW50J10gPSA0LCBpW3RbNV0gPSAnQWxsR29vZCddID0gNSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0F1Y3Rpb25Qb3N0YmlkUmVhc29uRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0NyZWF0aXZlRXJyb3InXSA9IDAsIGlbdFsxXSA9ICdTREtGYWlsdXJlJ10gPSAxLCBpW3RbMl0gPSAnVW5zdXBwb3J0ZWRNZWRpYSddID0gMiwgaVt0WzNdID0gJ1RhcmdldGluZ01pc21hdGNoJ10gPSAzLCBpW3RbNF0gPSAnUGxheWVyRXJyb3InXSA9IDQsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9IZWF2eUFkQmxvY2tUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0dsb2JhbCddID0gMCwgaVt0WzFdID0gJ1NjcmlwdCddID0gMSwgaVt0WzJdID0gJ1ZwYWlkSWZyYW1lJ10gPSAyLCBpW3RbM10gPSAnT3ZlcmxheUlmcmFtZSddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0NsaWNrJ10gPSAwLCBpW3RbMV0gPSAnVXJsQ2xpY2snXSA9IDEsIGlbdFsyXSA9ICdWb2x1bWVDbGljayddID0gMiwgaVt0WzNdID0gJ1BsYXlDbGljayddID0gMywgaVt0WzRdID0gJ1BhdXNlQ2xpY2snXSA9IDQsIGlbdFs1XSA9ICdOZXh0Q2xpY2snXSA9IDUsIGlbdFs2XSA9ICdQcmV2aW91c0NsaWNrJ10gPSA2LCBpW3RbN10gPSAnTXV0ZUNsaWNrJ10gPSA3LCBpW3RbOF0gPSAnVW5tdXRlQ2xpY2snXSA9IDgsIGlbdFs5XSA9ICdDbG9zZUNsaWNrJ10gPSA5LCBpW3RbMTBdID0gJ1Njcm9sbENsaWNrJ10gPSAxMCwgaVt0WzExXSA9ICdHYWxsZXJ5Q2xpY2snXSA9IDExLCBpW3RbMTJdID0gJ1N1YnRpdGxlQ2xpY2snXSA9IDEyLCBpW3RbMTNdID0gJ0Z1bGxTY3JlZW5DbGljayddID0gMTMsIGlbdFsxNF0gPSAnRXhpdEZ1bGxTY3JlZW5DbGljayddID0gMTQsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9RdWFydGlsZXNFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnU3RhcnQnXSA9IDAsIGlbdFsxXSA9ICdGaXJzdCddID0gMSwgaVt0WzJdID0gJ1NlY29uZCddID0gMiwgaVt0WzNdID0gJ1RoaXJkJ10gPSAzLCBpW3RbNF0gPSAnRm91cnRoJ10gPSA0LCBpOwogICAgICAgICAgICAgICAgfSgpLCB0LmV4cG9ydHMgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbih0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHQpKSAmJiBpc0Zpbml0ZSh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKHQpICYmIHQgPiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModCkgJiYgdC5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnID09IHR5cGVvZiB0ICYmIG51bGwgIT09IHQgJiYgIUFycmF5LmlzQXJyYXkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb250ZW50V2luZG93IHx8IHQuY29udGVudERvY3VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5kKGksICdnJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICd1JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnTycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ04nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdLJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnSicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ3knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICd4JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB5OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAndycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdJJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAndCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ1EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGo7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdMJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBrOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnbCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gXzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEE7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdtJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBJOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQ7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBQOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnUicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ24nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEU7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBMOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnTScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdwJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBGOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnaicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ3MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFU7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAndicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHo7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdnJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnQicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ0UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEo7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdQJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBROwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnQScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFk7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdxJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBLOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnSCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ0MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR0OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnUycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQ7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdvJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBldDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ0QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnRicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnQ7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICd6JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBydDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ0cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMjQpLCBuID0gZSgxKSwgciA9IGUoNiksIGggPSBlKDQpLCBhID0gZSg4KSwgbyA9IGUoMCksIGMgPSBlKDUpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiAodC5zdHlsZS5kaXNwbGF5ID0gaSA/ICcnIDogJ25vbmUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qobi5hKSh0LmNsYXNzTGlzdCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHQuY2xhc3NMaXN0LmFkZChpKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gYCR7IHQuZ2V0QXR0cmlidXRlKCdjbGFzcycpIH0gJHsgaSB9YDsKICAgICAgICAgICAgICAgICAgICB0LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qobi5hKSh0LmNsYXNzTGlzdCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHQuY2xhc3NMaXN0LnJlbW92ZShpKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJykucmVwbGFjZShpLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQpIHsKICAgICAgICAgICAgICAgICAgICB1KHQsICExKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAodCkgewogICAgICAgICAgICAgICAgICAgIHUodCwgITApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIGluIGkpCiAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKHQuc3R5bGVbZV0gPSBpW2VdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCwgLi4uaSkgewogICAgICAgICAgICAgICAgICAgIGkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zdHlsZVtpXSA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbSh0KSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnBhcmVudE5vZGUgJiYgdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyh0LCBpLCBlLCBzLCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoID0gZS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5pZCA9IHQuaWQsIGgudHlwZSA9ICd0ZXh0L2NzcycsIGgucmVsID0gJ3N0eWxlc2hlZXQnLCBoLmhyZWYgPSB0LnNyYywgT2JqZWN0KG4uYikocykgJiYgKGgub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3Qobi5iKShyKSAmJiAoaC5vbmVycm9yID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZW1vdmVDaGlsZChoKSwgT2JqZWN0KG4uZykodCkgPyByKGBsaW5rX3N0eWxlc2hlZXRfbG9hZF9lcnJvcl8keyB0IH1gKSA6IHIoYGxpbmtfc3R5bGVzaGVldF9sb2FkX2Vycm9yXyR7IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBlbmRDaGlsZChpKSwgZS5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBoKSB9YCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5hcHBlbmRDaGlsZChoKSwgaDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkodCwgaSwgZSwgcywgciwgaCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfSkoKSwgYSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHUgPSBlLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5zcmMgPSB0LnNyYywgdS5hc3luYyA9ICEwLCB1LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JywgdC5pZCAmJiAodS5pZCA9IHQuaWQpLCBPYmplY3Qobi5iKShzKSAmJiAodS5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1Lm9uZXJyb3IgPSBlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVtb3ZlQ2hpbGQodSksIGggJiYgT2JqZWN0KGMuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiAnc2NyaXB0X2xvYWRfZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IG8uUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3Qobi5iKShyKSAmJiByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuYXBwZW5kQ2hpbGQodSksIHU7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCAmJiBPYmplY3QoYy5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgc2NyaXB0X2luc2VydF9lcnJvcl8keyBpLm1lc3NhZ2UgfV8keyBpLnN0YWNrIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBvLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChuLmIpKHIpICYmIHIoKSwgbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBuID0gaS5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmFwcGVuZENoaWxkKG4pLCB0LmFwcGVuZENoaWxkKHMpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTyh0LCAuLi5pKSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiBpLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmgpKGkpICYmIGwodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KHQsIC4uLmkpIHsKICAgICAgICAgICAgICAgICAgICB0ICYmIGkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uaCkoaSkgJiYgZCh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFModCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuY2xhc3NMaXN0LmNvbnRhaW5zKGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAoT2JqZWN0KG4uYSkoZSkgPyBlID8gKE8odCwgaSksICEwKSA6ICh4KHQsIGkpLCAhMSkgOiB0LmNsYXNzTGlzdC50b2dnbGUoaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gayh0LCBpLCBlLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiAoZCh0LCBpKSwgcyAmJiBMKHQpLCBsKHQsIGUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IF8gPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTsKICAgICAgICAgICAgICAgICAgICB9LCBBID0gKHQsIGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZ2V0Q29tcHV0ZWRTdHlsZSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCBJID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9KSgpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGUuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXSwgbiA9IGUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgICAgICAgICAgICBuLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpLCBuLmlkID0gaSwgbi5zdHlsZVNoZWV0ID8gbi5zdHlsZVNoZWV0LmNzc1RleHQgPSB0IDogbi5hcHBlbmRDaGlsZChlLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKSwgcy5hcHBlbmRDaGlsZChuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBpLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0sIHMgPSBpLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgICAgICAgICBzLnNldEF0dHJpYnV0ZSgncmVsJywgJ3ByZWNvbm5lY3QnKSwgcy5zZXRBdHRyaWJ1dGUoJ2xpbmsnLCB0KSwgZS5hcHBlbmRDaGlsZChzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBpLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlubmVySFRNTCA9IHQsIGUuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBNKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBpID4gMCA/ICh0LnJlbW92ZUF0dHJpYnV0ZSgnbXV0ZWQnKSwgdC5tdXRlZCA9ICExKSA6ICh0LnNldEF0dHJpYnV0ZSgnbXV0ZWQnLCAnJyksIHQubXV0ZWQgPSAhMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5iLmZpbmQoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmtleXMuZnVsbHNjcmVlbkVuYWJsZWQgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwodCkgewogICAgICAgICAgICAgICAgICAgIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHQud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KHQsIDIwKTsKICAgICAgICAgICAgICAgICAgICB9KShpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEIodCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAodC5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCB0LndlYmtpdENhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQodCk7CiAgICAgICAgICAgICAgICAgICAgfSkoaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnJlZHVjZSgodCwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgfHwgaS5xdWVyeVNlbGVjdG9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBBKGUsIFUoZSkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KHQsIGkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzID8gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0UHJvcGVydHlWYWx1ZShpKTsKICAgICAgICAgICAgICAgICAgICB9KHMsIGUpIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBEKFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2gxJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2gyJwogICAgICAgICAgICAgICAgICAgIF0sIHQsICdmb250LWZhbWlseScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8ICdpbmhlcml0JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFYodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBEKFsncCddLCB0LCAnZm9udC1mYW1pbHknKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAnaW5oZXJpdCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gJCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdCAmJiBpICYmIChBcnJheS5pc0FycmF5KHQpID8gdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hcHBlbmRDaGlsZCh0KTsKICAgICAgICAgICAgICAgICAgICB9KSA6IGkuYXBwZW5kQ2hpbGQodCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gT2JqZWN0KHIuYykoaS5jaGlsZHJlbik7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAtIDEgPT09IGkgfHwgMCA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwLCBBcnJheS5pc0FycmF5KHQpID8gSChuW2ldLCAuLi50KSA6IEgobltpXSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHMgfHwgJCh0LCBpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEgodCwgLi4uaSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZSA9IGkubGVuZ3RoOyBlLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShpW2VdLCB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBVKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHtkaXNwbGF5OiBlfSA9IEEodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgJ25vbmUnID09PSBlICYmICh0LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHoodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAnb3BhY2l0eScgPT09IHMucHJvcGVydHlOYW1lICYmICh4KHQsIGgubS5GYWRlT3V0QmFzZSwgaC5tLkZhZGVPdXQpLCBpKCksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGUpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIE8odCwgaC5tLkZhZGVPdXRCYXNlKSwgcSh0KSwgTCh0KSwgdC5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZSksIE8odCwgaC5tLkZhZGVPdXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVyh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdvcGFjaXR5JyA9PT0gcy5wcm9wZXJ0eU5hbWUgJiYgKHgodCwgaC5tLkZhZGVJbkJhc2UsIGgubS5GYWRlSW4pLCBpKCksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGUpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIE8odCwgaC5tLkZhZGVJbkJhc2UpLCBxKHQpLCBMKHQpLCB0LmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBlKSwgTyh0LCBoLm0uRmFkZUluKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEcodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBVKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogcwogICAgICAgICAgICAgICAgICAgIH0gPSBBKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnbm9uZScgPT09IGUgfHwgJzAnID09PSBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGUuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgcy5zcmMgPSAnaHR0cHM6Ly9jZG4uY29ubmF0aXguY29tL21pbi9jb25uYXRpeC5yZW5kZXJlci5pbmZlZWQubWluLmpzJywgcy5zZXRBdHRyaWJ1dGUoJ2RhdGEtY29ubmF0aXgtdG9rZW4nLCB0KSwgZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChpKS5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaW5uZXJIVE1MID0gdCB8fCAnJywgZS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBYKCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3IuZG9Ob3RUcmFjayB8fCB3aW5kb3cuZG9Ob3RUcmFjazsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzEnID09PSB0IHx8ICd5ZXMnID09PSB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdChhLmYpKHQpLnRvcEZyYW1lOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2ldID8gZSA6IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBLKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHQsIHMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAhczspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mcmFtZXNbaV0gJiYgKHMgPSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC50b3AgfHwgdC50b3AgPT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5zbGljZS5jYWxsKGkuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KSwgMCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHR0KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IE9iamVjdChhLmYpKHQpLnRvcEZyYW1lLmxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHBzJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0dCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdC5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZXRhW2NvbnRlbnQ9dXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0c10nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWV0YScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zZXRBdHRyaWJ1dGUoJ2h0dHAtZXF1aXYnLCAnQ29udGVudC1TZWN1cml0eS1Qb2xpY3knKSwgaS5jb250ZW50ID0gJ3VwZ3JhZGUtaW5zZWN1cmUtcmVxdWVzdHMnLCB0LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGV0KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGEuZikodCkudG9wRnJhbWUuZG9jdW1lbnQucmVmZXJyZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdChhLmYpKGkpLnRvcEZyYW1lLmxvY2F0aW9uLmhvc3RuYW1lLCBzID0gT2JqZWN0KGEuZykodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgJiYgcy5ob3N0bmFtZSA9PT0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG50KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB0Lm9uY2xpY2sgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGMuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGAkeyBpIH0gLSBjbGljayBvbiB0YWc6JHsgZSB9IGNsYXNzOiR7IHMgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IG8uUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGMuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYCR7IGkgfV9FcnJvciAtIGlmcmFtZSBjbGlja2AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogby5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjawogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBydCh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5jdXJyZW50VGltZSA9IHQuY3VycmVudFRpbWUgKyAwLjAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHMucmVsID0gJ3ByZWxvYWQnLCBzLmhyZWYgPSBpLCBzLmFzID0gZSwgdC5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgICAgICAgICAgICAgICAgIH0oaSwgdCwgJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG47CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5GdWxsc2NyZWVuID0gJ2Z1bGxzY3JlZW4nLCB0Lk5vcm1hbCA9ICdub3JtYWwnLCB0LlRodW1ibmFpbCA9ICd0aHVtYm5haWwnOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkFkTG9hZGVkID0gJ0FkTG9hZGVkJywgdC5BZFN0YXJ0ZWQgPSAnQWRTdGFydGVkJywgdC5BZFN0b3BwZWQgPSAnQWRTdG9wcGVkJywgdC5BZFNraXBwZWQgPSAnQWRTa2lwcGVkJywgdC5BZFNraXBwYWJsZVN0YXRlQ2hhbmdlID0gJ0FkU2tpcHBhYmxlU3RhdGVDaGFuZ2UnLCB0LkFkU2l6ZUNoYW5nZSA9ICdBZFNpemVDaGFuZ2UnLCB0LkFkTGluZWFyQ2hhbmdlID0gJ0FkTGluZWFyQ2hhbmdlJywgdC5BZER1cmF0aW9uQ2hhbmdlID0gJ0FkRHVyYXRpb25DaGFuZ2UnLCB0LkFkRXhwYW5kZWRDaGFuZ2UgPSAnQWRFeHBhbmRlZENoYW5nZScsIHQuQWRSZW1haW5pbmdUaW1lQ2hhbmdlID0gJ0FkUmVtYWluaW5nVGltZUNoYW5nZScsIHQuQWRWb2x1bWVDaGFuZ2UgPSAnQWRWb2x1bWVDaGFuZ2UnLCB0LkFkSW1wcmVzc2lvbiA9ICdBZEltcHJlc3Npb24nLCB0LkFkVmlkZW9TdGFydCA9ICdBZFZpZGVvU3RhcnQnLCB0LkFkVmlkZW9GaXJzdFF1YXJ0aWxlID0gJ0FkVmlkZW9GaXJzdFF1YXJ0aWxlJywgdC5BZFZpZGVvTWlkcG9pbnQgPSAnQWRWaWRlb01pZHBvaW50JywgdC5BZFZpZGVvVGhpcmRRdWFydGlsZSA9ICdBZFZpZGVvVGhpcmRRdWFydGlsZScsIHQuQWRWaWRlb0NvbXBsZXRlID0gJ0FkVmlkZW9Db21wbGV0ZScsIHQuQWRDbGlja1RocnUgPSAnQWRDbGlja1RocnUnLCB0LkFkSW50ZXJhY3Rpb24gPSAnQWRJbnRlcmFjdGlvbicsIHQuQWRVc2VyQWNjZXB0SW52aXRhdGlvbiA9ICdBZFVzZXJBY2NlcHRJbnZpdGF0aW9uJywgdC5BZFVzZXJNaW5pbWl6ZSA9ICdBZFVzZXJNaW5pbWl6ZScsIHQuQWRVc2VyQ2xvc2UgPSAnQWRVc2VyQ2xvc2UnLCB0LkFkUGF1c2VkID0gJ0FkUGF1c2VkJywgdC5BZFBsYXlpbmcgPSAnQWRQbGF5aW5nJywgdC5BZExvZyA9ICdBZExvZycsIHQuQWRFcnJvciA9ICdBZEVycm9yJzsKICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiwgcjsKICAgICAgICAgICAgICAgIGUuZChpLCAnaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdqJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAncicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2knLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2wnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ20nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdxJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnbycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB5OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ3AnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5JbnZpc2libGUgPSAnY254LW1vZC1pbnZpc2libGUnLCB0LkhvdmVyU3RhcnQgPSAnY254LW1vZC1ob3Zlci1zJywgdC5Ib3ZlckVuZCA9ICdjbngtbW9kLWhvdmVyJywgdC5Ib3ZlckJvb20gPSAnY254LW1vZC1ib29tJywgdC5EaXNwbGF5Tm9uZSA9ICdjbngtbW9kLWRpc3BsYXktbm9uZScsIHQuQWN0aXZlID0gJ2NueC1tb2QtYWN0aXZlJywgdC5IaWRlT25Wb2x1bWVIb3ZlciA9ICdjbngtaGlkZS1vbi12b2x1bWUtaG92ZXInLCB0LkhpZGVPblNpbmdsZVZpZGVvID0gJ2NueC1oaWRlLW9uLXNpbmdsZS12aWRlbycsIHQuTm9UcmFuc2l0aW9uID0gJ2NueC1tb2Qtbm8tdHJhbnNpdGlvbicsIHQuQ29sbGFwc2FibGUgPSAnY254LW1vZC1jb2xsYXBzYWJsZScsIHQuSGFzQ3VzdG9tU2Nyb2xsYmFyID0gJ2NueC1tb2Qtc2Nyb2xsYmFyJywgdC5TaG93ID0gJ2NueC1tb2Qtc2hvdycsIHQuSGlkZSA9ICdjbngtbW9kLWhpZGUnLCB0Lk9uSG9sZCA9ICdjbngtbW9kLW9uaG9sZCcsIHQuRm9yY2VMaW5lQnJlYWsgPSAnY254LW1vZC1mb3JjZS1saW5lLWJyZWFrJywgdC5IaWRlT25BZE92ZXJsYXkgPSAnY254LW1vZC1hZC1vdmVybGF5LW5vbmUnLCB0LkhpZGVPblBvZExvYWRpbmdTY3JlZW4gPSAnY254LW1vZC1wb2QtbG9hZGluZy1ub25lJzsKICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5GdWxsc2NyZWVuID0gJ2NueC1pbi1mdWxsc2NyZWVuJywgdC5BZCA9ICdjbngtaW4tYWQnLCB0LkFkT3ZlcmxheVR5cGUgPSAnY254LWluLWFkLW92ZXJsYXknLCB0LkFkRnVsbFNpemUgPSAnY254LWluLWFkLWZ1bGwnLCB0LkFkU2hvd0NhcmQgPSAnY254LWFkLXNob3ctY2FyZCcsIHQuU2hvd0NvbnRyb2xzID0gJ2NueC1pbi1zaG93LWNvbnRyb2xzJywgdC5Nb2JpbGUgPSAnY254LWluLW1vYmlsZScsIHQuRGVza3RvcCA9ICdjbngtaW4tZGVza3RvcCcsIHQuTXV0ZWQgPSAnY254LWluLW11dGUnLCB0LkNvbGxhcHNlZCA9ICdjbngtaW4tY29sbGFwc2UnLCB0LkdhbGxlcnlQb3J0cmFpdCA9ICdjbngtaW4tZy1wb3J0cmFpdCcsIHQuR2FsbGVyeUxhbmRzY2FwZSA9ICdjbngtaW4tZy1sYW5kc2NhcGUnLCB0LkNvbnRleHRDb250cm9sbGVyID0gJ2NueC1jb250ZXh0LWNvbnRyb2xsZXInLCB0LkhpZGVVSSA9ICdjbngtaW4taGlkZS11aScsIHQuUG9kTG9hZGluZ1NjcmVlbiA9ICdjbngtaW4tcG9kLWxvYWRpbmcnLCB0LkNsb3NlT24gPSAnY254LWNsb3NlLW9uJywgdC5DbG9zZU9mZiA9ICdjbngtY2xvc2Utb2ZmJywgdC5DbG9zZUhvdmVyID0gJ2NueC1jbG9zZS1ob3ZlcicsIHQuQ2xvc2VGbG9hdE9uID0gJ2NueC1jbG9zZS1mbG9hdC1vbicsIHQuQ2xvc2VGbG9hdE9mZiA9ICdjbngtY2xvc2UtZmxvYXQtb2ZmJywgdC5DbG9zZUZsb2F0SG92ZXIgPSAnY254LWNsb3NlLWZsb2F0LWhvdmVyJywgdC5VaUluVmlldyA9ICdjbngtdWktaW4tdmlldyc7CiAgICAgICAgICAgICAgICB9KG4gfHwgKG4gPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuUGxheWluZyA9ICdjbngtaXMtcGxheWluZycsIHQuUGF1c2VkID0gJ2NueC1pcy1wYXVzZWQnLCB0LlN0b3BwZWQgPSAnY254LWlzLXN0b3BwZWQnLCB0LlByZXJvbGwgPSAnY254LWlzLXByZXJvbGwnLCB0LlBvc3Ryb2xsID0gJ2NueC1pcy1wb3N0cm9sbCcsIHQuTG9hZGluZyA9ICdjbngtaXMtbG9hZGluZycsIHQuTGl2ZUVuZGVkID0gJ2NueC1saXZlLWVuZGVkJzsKICAgICAgICAgICAgICAgIH0ociB8fCAociA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCBoID0gewogICAgICAgICAgICAgICAgICAgIFh4bDogJ2NueC1icC14eGwtdicsCiAgICAgICAgICAgICAgICAgICAgWGw6ICdjbngtYnAteGwtdicsCiAgICAgICAgICAgICAgICAgICAgTGc6ICdjbngtYnAtbGctdicsCiAgICAgICAgICAgICAgICAgICAgTWQ6ICdjbngtYnAtbWQtdicsCiAgICAgICAgICAgICAgICAgICAgU206ICdjbngtYnAtc20tdicsCiAgICAgICAgICAgICAgICAgICAgWHM6ICdjbngtYnAteHMtdicsCiAgICAgICAgICAgICAgICAgICAgWHhzOiAnY254LWJwLXh4cy12JwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBhLCBvLCBjLCB1LCBsLCBkLCBmOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5SZXNwb25zaXZlID0gJ2NueC1zaXplLXJlc3BvbnNpdmUnLCB0LkZpeGVkID0gJ2NueC1zaXplLWZpeGVkJzsKICAgICAgICAgICAgICAgIH0oYSB8fCAoYSA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5DbGlja09wdGlvbiA9ICdjbngtY20taXRlbS0tY2xpY2snLCB0LlRvZ2dsZU9wdGlvbiA9ICdjbngtY20taXRlbS0tdG9nZ2xlJywgdC5TdWJtZW51T3B0aW9uID0gJ2NueC1jbS1pdGVtLS1zdWJtZW51JywgdC5JdGVtSWNvbiA9ICdjbngtY20taXRlbV9faWNvbicsIHQuSXRlbVRpdGxlID0gJ2NueC1jbS1pdGVtX190aXRsZScsIHQuSXRlbUV4dHJhID0gJ2NueC1jbS1pdGVtX19leHRyYScsIHQuSXRlbXMgPSAnY254LWNtLWl0ZW1zJywgdC5Db250YWluZXIgPSAnY254LWNtLWNvbnRhaW5lcic7CiAgICAgICAgICAgICAgICB9KG8gfHwgKG8gPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuSWNvbnMgPSAnY254LWNvbG9yLWljb24nLCB0LlRvb2x0aXBUZXh0ID0gJ2NueC1jb2xvci10dC10ZXh0JywgdC5Ub29sdGlwQmFja2dyb3VuZCA9ICdjbngtY29sb3ItdHQtYmcnLCB0LkFjY2VudENvbG9yID0gJ2NueC1jb2xvci1hY2NlbnQnLCB0LlByaW1hcnlDb2xvciA9ICdjbngtY29sb3ItcHJpbWFyeScsIHQuU2Vjb25kYXJ5Q29sb3IgPSAnY254LWNvbG9yLXNlY29uZGFyeScsIHQuVGl0bGVDb21wb25lbnQgPSAnY254LXRpdGxlLWNvbXBvbmVudCcsIHQuVGl0bGVMaW5rID0gJ2NueC1jb2xvci10aXRsZS1saW5rJywgdC5TbGlkZVByb2dyZXNzQmFyID0gJ2NueC1zbGlkZXMtcHJvZ3Jlc3MtYmFyJywgdC5Qcm9ncmVzc0ZpbGwgPSAnY254LXByb2dyZXNzLWZpbGwnOwogICAgICAgICAgICAgICAgfShjIHx8IChjID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkluaGVyaXRUaXRsZUZvbnRGYW1pbHkgPSAnY254LWluaGVyaXQtdGl0bGUtZm9udC1mYW1pbHknLCB0LkluaGVyaXRCb2R5Rm9udEZhbWlseSA9ICdjbngtaW5oZXJpdC1ib2R5LWZvbnQtZmFtaWx5JzsKICAgICAgICAgICAgICAgIH0odSB8fCAodSA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5Db25uYXRpeCA9ICcjMDA5OUZGJywgdC5JY29ucyA9ICcjRkZGRkZGJywgdC5QcmltYXJ5QmFja2dyb3VuZCA9ICcjRjFGMUYxJywgdC5QcmltYXJ5Rm9yZWdyb3VuZCA9ICcjMDAwMDAwJywgdC5TZWNvbmRhcnlCYWNrZ3JvdW5kID0gJyMwMDAwMDAnLCB0LlNlY29uZGFyeUZvcmVncm91bmQgPSAnI0YxRjFGMScsIHQuQWNjZW50Rm9yZWdyb3VuZCA9ICcjRkZGRkZGJzsKICAgICAgICAgICAgICAgIH0obCB8fCAobCA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5DYXB0aW9uQ29udGFpbmVyID0gJ2NueC1jYXB0aW9ucy10ZXh0LWhvbGRlcic7CiAgICAgICAgICAgICAgICB9KGQgfHwgKGQgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuTWFpbkNsYXNzID0gJ2NueC1mbG9hdCcsIHQuVHJhbnNpdGlvbkNsYXNzID0gJ2NueC1mbG9hdC10cmFuc2l0aW9uJzsKICAgICAgICAgICAgICAgIH0oZiB8fCAoZiA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCBwID0gewogICAgICAgICAgICAgICAgICAgIEZhZGVPdXRCYXNlOiAnY254LWZhZGUtb3V0LWJhc2UnLAogICAgICAgICAgICAgICAgICAgIEZhZGVPdXQ6ICdjbngtZmFkZS1vdXQnLAogICAgICAgICAgICAgICAgICAgIEZhZGVJbkJhc2U6ICdjbngtZmFkZS1pbi1iYXNlJywKICAgICAgICAgICAgICAgICAgICBGYWRlSW46ICdjbngtZmFkZS1pbicKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgYiwgdiwgbTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQ3VycmVudFNsaWRlID0gJ2NueC1zbGlkZS1jdXJyZW50JywgdC5OZXh0U2xpZGUgPSAnY254LXNsaWRlLW5leHQnLCB0LlNsaWRlTGVmdCA9ICdjbngtc2xpZGUtbGVmdCcsIHQuU2xpZGVSaWdodCA9ICdjbngtc2xpZGUtcmlnaHQnOwogICAgICAgICAgICAgICAgfShiIHx8IChiID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0Lk9wYWNpdHlJblRyYW5zaXRpb24gPSAnY254LXRvb2x0aXAtYW5pbWF0aW9uLWluJzsKICAgICAgICAgICAgICAgIH0odiB8fCAodiA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5DYXJkID0gJ2NueC1nLWNhcmQnLCB0LkNhcmRTbG90ID0gJ2NueC1nLWNhcmQtc2xvdCcsIHQuQ2FyZEltYWdlID0gJ2NueC1nLWNhcmQtaW1hZ2UnLCB0LkNhcmRUZXh0ID0gJ2NueC1nLWNhcmQtdGV4dCcsIHQuQ2FyZFRleHRDb250YWluZXIgPSAnY254LWctY2FyZC10ZXh0LWNvbnRhaW5lcicsIHQuQ2FyZFBsYWNlaG9sZGVyID0gJ2NueC1nLWNhcmQtcGxhY2Vob2xkZXInLCB0LkNhcmRSYWlsID0gJ2NueC1nLXJhaWwnLCB0LlN0eWxlRGV0YWlsZWQgPSAnY254LWctc3R5bGUtZGV0YWlsZWQnLCB0LlN0eWxlVmlzdWFsID0gJ2NueC1nLXN0eWxlLXZpc3VhbCcsIHQuRXhwbG9yZU1vcmUgPSAnY254LWctZXhwbG9yZS1tb3JlJywgdC5GYWRlT3V0ID0gJ2NueC1nLWZhZGUtb3V0JzsKICAgICAgICAgICAgICAgIH0obSB8fCAobSA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCBnID0gewogICAgICAgICAgICAgICAgICAgICAgICBNYWluQ29udGFpbmVyOiAnY254LW1haW4tY29udGFpbmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgTWFpbkNvbnRhaW5lckZsZXg6ICdjbngtbWFpbi1jb250YWluZXItZmxleCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllcldyYXBwZXI6ICdjbngtcGxheWVyLXdyYXBwZXInLAogICAgICAgICAgICAgICAgICAgICAgICBJbWFnZVBsYWNlaG9sZGVyOiAnY254LWltYWdlLXBsYWNlaG9sZGVyJwogICAgICAgICAgICAgICAgICAgIH0sIHkgPSAnY254LXJhdGlvJywgdyA9ICdjbngtaGlkZS12aWRlbycsIE8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQ6ICdjbngtc2tpcC1hZC10ZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgVGltZXI6ICdjbngtdGltZXItbG9hZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgSWNvbjogJ2NueC1za2lwLWFkLWljb24nLAogICAgICAgICAgICAgICAgICAgICAgICBTa2lwQWRCdXR0b246ICdjbngtc2tpcC1hZC1idXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICBJblRpbWVyOiAnY254LXNraXAtYWQtaW4tdGltZXInCiAgICAgICAgICAgICAgICAgICAgfSwgeCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgSWNvbjogJ2NueC1wb2Qtb3Blbi1uZXctaWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbjogJ2NueC1wb2QtcmVhZC1tb3JlLWJ0bicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbkNvbnRhaW5lcjogJ2NueC1wb2QtcmVhZC1tb3JlLWNvbnRhaW5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBwZXI6ICdjbngtcG9kLXJlYWQtbW9yZS13cmFwcGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgQmFja2dyb3VuZEltZzogJ2NueC1wb2QtbG9hZGluZy1iYWNrZ3JvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgSW5mb0NvbnRhaW5lcjogJ2NueC1wb2QtbG9hZGluZy1pbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgRmFsbGJhY2tDb250YWluZXI6ICdjbngtcG9kLWxvYWRpbmctZmFsbGJhY2snLAogICAgICAgICAgICAgICAgICAgICAgICBTbG90Q291bnRUZXh0OiAnY254LXBvZC1zbG90LWNvdW50LXRleHQnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgyMSksIG4gPSBlKDIzKSwgciA9IGUoMCksIGggPSBlKDE0KSwgYSA9IGUoMzApOwogICAgICAgICAgICAgICAgY29uc3QgbyA9ICEwLCBjID0gMzA7CiAgICAgICAgICAgICAgICB2YXIgdSA9IGUoMzYpOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBzKSAmJiBpLmluZGV4T2YocykgPCAwICYmIChlW3NdID0gdFtzXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTsgbiA8IHMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmluZGV4T2Yoc1tuXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh0LCBzW25dKSAmJiAoZVtzW25dXSA9IHRbc1tuXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCBkID0gNTAwOwogICAgICAgICAgICAgICAgbGV0IGYgPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhyZWYsIHAgPSAhMTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZiA9IHdpbmRvdy50b3AubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIodCkgewogICAgICAgICAgICAgICAgICAgIHZhciB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogaSA9IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiBlID0gITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dKc29uU3RhdGU6IHYgPSAhMQogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdCwgbSA9IGwodCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rocm90dGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kTWF4TG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dKc29uU3RhdGUnCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIGlmICghcCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0ucGxheWVyRGVzdHJveWVkICYmIChwID0gITApLCBtLnNlc3Npb25JZCA9IGEuYS5zZXNzaW9uSWQsIG8gJiYgKGEuYS5pbmNyZW1lbnRMb2dDb3VudChtLm1lc3NhZ2UpLCBhLmEuaXNNYXhMb2dPdmVyZmxvdyhtLm1lc3NhZ2UpICYmIGIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMb2dnaW5nX21heF9sb2dfb3ZlcmZsb3dfMTAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBtLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBtLmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGEuYS5zZXNzaW9uSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhLmEuaXNNYXhMb2cobS5tZXNzYWdlLCBpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmICFhLmEuaXNNYXhMb2dTZW50KG0ubWVzc2FnZSkgJiYgKGEuYS5zZXRNYXhMb2dTZW50KG0ubWVzc2FnZSksIGIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMb2dnaW5nX21heF9sb2dfc2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBtLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBtLmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBhLmEuc2Vzc2lvbklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgKG0uY2FsbFN0YWNrID0gdS5hLmdldEpzb25TdHJpbmcoKSksIHZvaWQgMCA9PT0gbS5jYWxsU3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IEVycm9yKG0ubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5jYWxsU3RhY2sgPSB0LnN0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0uY2FsbFN0YWNrID0gbS5jYWxsU3RhY2suc3Vic3RyaW5nKDAsIGQpLCBzLmEubG9nVG9TZXJ2ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnBhZ2VVcmwgPSBmLCBtLnZlcnNpb24gPSBzLmEudmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YTogbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGguYS5lbmRQb2ludHMudHJhY2tpbmcubG9nZ2luZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9SZXF1ZXN0OiByLlByb3RvTG9nZ2luZ1JlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5zZW5kQmVhY29uID8gbi5hLnNlbmRQcm90b0JlYWNvblJlcXVlc3QodCkgOiBuLmEuc2VuZFByb3RvUmVxdWVzdCh0KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYS5sb2dUb0NvbnNvbGUgJiYgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJyM4QjAwMDAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnI0ZGOEMwMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICcjMDAwMDAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYCVjQ29ubmF0aXggTG9nZ2luZzpcbiAgIG1lc3NhZ2U6ICR7IHQubWVzc2FnZSB9XG4gICBleGNlcHRpb246ICR7IHQuZXhjZXB0aW9uIH1cbiAgIGxldmVsOiAkeyB0LmxldmVsIH1cbiAgIHZlcnNpb246ICR7IHQudmVyc2lvbiB9XG4gICBzZXNzaW9uSWQ6ICR7IHQuc2Vzc2lvbklkIH1cbiAgIGNhbGxTdGFjazogJHsgdC5jYWxsU3RhY2sgfWAsIGBjb2xvcjokeyBpIH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ20nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnaScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2wnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdqJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICduJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB5OwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgzMSksIG4gPSBlKDgpLCByID0gZSgxKSwgaCA9IGUoNSksIGEgPSBlKDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaW5kZXhPZih0KSA+IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0IDogW3RdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IFtdLCBzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuaGFzKGlbdF0pIHx8IChzLnNldChpW3RdLCAhMCksIGUucHVzaChpKSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10uc2xpY2UuY2FsbCh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBwYXJzZUludChlLCAxMCkgPj0gMCAmJiBpLnB1c2godFtlXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0Lmxlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ldmVyeSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmQpKHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0KSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAnWyc7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICBpICs9IE9iamVjdChzLmMpKHRbZV0pICsgKGUgPT09IHQubGVuZ3RoIC0gMSA/ICcnIDogJywnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArPSAnXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghdCB8fCAhaSkgJiYgKHQubGVuZ3RoID09PSBpLmxlbmd0aCAmJiAodCA9PT0gaSB8fCAwID09PSB0Lmxlbmd0aCAmJiAwID09PSBpLmxlbmd0aCB8fCB0LmV2ZXJ5KCh0LCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5pKSh0LCBpW2VdKTsKICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWkuaW5jbHVkZXModCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmluY2x1ZGVzKHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmluZGV4T2YoaSkgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5pbmRleE9mKGkpOwogICAgICAgICAgICAgICAgICAgIC0xICE9PSBlID8gdC5zcGxpY2UoZSwgMSkgOiBPYmplY3QoaC5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdyZW1vdmVJdGVtRnJvbUFycmF5X2Vycm9yX2l0ZW1fbm90X2ZvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBKU09OLnN0cmluZ2lmeShpKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGEuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8odCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG4sIHIgPSBlKDYwKSwgaCA9IHIuUmVhZGVyLCBhID0gci5Xcml0ZXIsIG8gPSByLnV0aWwsIGMgPSByLnJvb3RzLmRlZmF1bHQgfHwgKHIucm9vdHMuZGVmYXVsdCA9IHt9KTsKICAgICAgICAgICAgICAgIGMuUHJvdG9FbGVtZW50c1JlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRva2VucyA9IFtdLCB0aGlzLmZvcmNlTGluZUl0ZW1JZHMgPSBbXSwgdGhpcy5xdWVyeUpzVGFyZ2V0aW5nID0ge30sIHRoaXMucmVsb2FkZWRQbGF5ZXJzID0ge30sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRva2VucyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUucGFnZVVybCA9ICcnLCB0LnByb3RvdHlwZS51c2VySWQgPSAnJywgdC5wcm90b3R5cGUuZm9yY2VQbGF5ZXJJZCA9ICcnLCB0LnByb3RvdHlwZS5mb3JjZU1lZGlhSWQgPSAnJywgdC5wcm90b3R5cGUuZm9yY2VQbGF5bGlzdElkID0gJycsIHQucHJvdG90eXBlLnZlcnNpb24gPSAwLCB0LnByb3RvdHlwZS5mb3JjZUxpbmVJdGVtSWRzID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5jbGllbnRBYjAgPSAwLCB0LnByb3RvdHlwZS5jbGllbnRBYjEgPSAwLCB0LnByb3RvdHlwZS5jdXN0b21QYXJhbTEgPSAnJywgdC5wcm90b3R5cGUuY3VzdG9tUGFyYW0yID0gJycsIHQucHJvdG90eXBlLmN1c3RvbVBhcmFtMyA9ICcnLCB0LnByb3RvdHlwZS5mb3JjZUV4cGxvcmF0aW9uID0gITEsIHQucHJvdG90eXBlLmVzNiA9ICExLCB0LnByb3RvdHlwZS5idW5kbGVJZCA9ICcnLCB0LnByb3RvdHlwZS5mb3JjZVNvdXJjZUl0ZW1JZCA9ICcnLCB0LnByb3RvdHlwZS5wYXJzZURvbWFpbiA9ICExLCB0LnByb3RvdHlwZS5pbXBsZW1lbnRhdGlvblR5cGUgPSAwLCB0LnByb3RvdHlwZS5xdWVyeUpzVGFyZ2V0aW5nID0gby5lbXB0eU9iamVjdCwgdC5wcm90b3R5cGUuaXNDb25zZW50Q29ubmF0aXggPSAhMCwgdC5wcm90b3R5cGUucmVsb2FkZWRQbGF5ZXJzID0gby5lbXB0eU9iamVjdCwgdC5wcm90b3R5cGUuZGlzYWJsZVRyYWNraW5nID0gITEsIHQucHJvdG90eXBlLnJlZmVycmVyID0gJycsIHQucHJvdG90eXBlLmxvY2FsVGltZXN0YW1wID0gby5Mb25nID8gby5Mb25nLmZyb21CaXRzKDAsIDAsICExKSA6IDAsIHQucHJvdG90eXBlLmN1c3RvbVBhcmFtNCA9ICcnLCB0LnByb3RvdHlwZS5jdXN0b21QYXJhbTUgPSAnJywgdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSB8fCAoaSA9IGEuY3JlYXRlKCkpLCBudWxsICE9IHQudG9rZW5zICYmIHQudG9rZW5zLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC50b2tlbnMubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS51aW50MzIoMTApLnN0cmluZyh0LnRva2Vuc1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQucGFnZVVybCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAncGFnZVVybCcpICYmIGkudWludDMyKDI2KS5zdHJpbmcodC5wYWdlVXJsKSwgbnVsbCAhPSB0LnVzZXJJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAndXNlcklkJykgJiYgaS51aW50MzIoNDIpLnN0cmluZyh0LnVzZXJJZCksIG51bGwgIT0gdC5mb3JjZVBsYXllcklkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdmb3JjZVBsYXllcklkJykgJiYgaS51aW50MzIoNTgpLnN0cmluZyh0LmZvcmNlUGxheWVySWQpLCBudWxsICE9IHQuZm9yY2VNZWRpYUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdmb3JjZU1lZGlhSWQnKSAmJiBpLnVpbnQzMig2Nikuc3RyaW5nKHQuZm9yY2VNZWRpYUlkKSwgbnVsbCAhPSB0LmZvcmNlUGxheWxpc3RJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZm9yY2VQbGF5bGlzdElkJykgJiYgaS51aW50MzIoNzQpLnN0cmluZyh0LmZvcmNlUGxheWxpc3RJZCksIG51bGwgIT0gdC52ZXJzaW9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICd2ZXJzaW9uJykgJiYgaS51aW50MzIoODApLmludDMyKHQudmVyc2lvbiksIG51bGwgIT0gdC5mb3JjZUxpbmVJdGVtSWRzICYmIHQuZm9yY2VMaW5lSXRlbUlkcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgdC5mb3JjZUxpbmVJdGVtSWRzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudWludDMyKDkwKS5zdHJpbmcodC5mb3JjZUxpbmVJdGVtSWRzW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5jbGllbnRBYjAgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NsaWVudEFiMCcpICYmIGkudWludDMyKDk2KS5pbnQzMih0LmNsaWVudEFiMCksIG51bGwgIT0gdC5jbGllbnRBYjEgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NsaWVudEFiMScpICYmIGkudWludDMyKDEwNCkuaW50MzIodC5jbGllbnRBYjEpLCBudWxsICE9IHQuY3VzdG9tUGFyYW0xICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21QYXJhbTEnKSAmJiBpLnVpbnQzMigxMzApLnN0cmluZyh0LmN1c3RvbVBhcmFtMSksIG51bGwgIT0gdC5jdXN0b21QYXJhbTIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2N1c3RvbVBhcmFtMicpICYmIGkudWludDMyKDEzOCkuc3RyaW5nKHQuY3VzdG9tUGFyYW0yKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtMyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3VzdG9tUGFyYW0zJykgJiYgaS51aW50MzIoMTQ2KS5zdHJpbmcodC5jdXN0b21QYXJhbTMpLCBudWxsICE9IHQuZm9yY2VFeHBsb3JhdGlvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZm9yY2VFeHBsb3JhdGlvbicpICYmIGkudWludDMyKDE2MCkuYm9vbCh0LmZvcmNlRXhwbG9yYXRpb24pLCBudWxsICE9IHQuZXM2ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdlczYnKSAmJiBpLnVpbnQzMigxNjgpLmJvb2wodC5lczYpLCBudWxsICE9IHQuYnVuZGxlSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2J1bmRsZUlkJykgJiYgaS51aW50MzIoMTc4KS5zdHJpbmcodC5idW5kbGVJZCksIG51bGwgIT0gdC5mb3JjZVNvdXJjZUl0ZW1JZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZm9yY2VTb3VyY2VJdGVtSWQnKSAmJiBpLnVpbnQzMigxODYpLnN0cmluZyh0LmZvcmNlU291cmNlSXRlbUlkKSwgbnVsbCAhPSB0LnBhcnNlRG9tYWluICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdwYXJzZURvbWFpbicpICYmIGkudWludDMyKDE5MikuYm9vbCh0LnBhcnNlRG9tYWluKSwgbnVsbCAhPSB0LmltcGxlbWVudGF0aW9uVHlwZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaW1wbGVtZW50YXRpb25UeXBlJykgJiYgaS51aW50MzIoMjAwKS5pbnQzMih0LmltcGxlbWVudGF0aW9uVHlwZSksIG51bGwgIT0gdC5xdWVyeUpzVGFyZ2V0aW5nICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdxdWVyeUpzVGFyZ2V0aW5nJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gT2JqZWN0LmtleXModC5xdWVyeUpzVGFyZ2V0aW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCBzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudWludDMyKDIxMCkuZm9yaygpLnVpbnQzMigxMCkuc3RyaW5nKHNbZV0pLnVpbnQzMigxOCkuc3RyaW5nKHQucXVlcnlKc1RhcmdldGluZ1tzW2VdXSkubGRlbGltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5pc0NvbnNlbnRDb25uYXRpeCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnaXNDb25zZW50Q29ubmF0aXgnKSAmJiBpLnVpbnQzMigyMTYpLmJvb2wodC5pc0NvbnNlbnRDb25uYXRpeCksIG51bGwgIT0gdC5yZWxvYWRlZFBsYXllcnMgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3JlbG9hZGVkUGxheWVycycpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gT2JqZWN0LmtleXModC5yZWxvYWRlZFBsYXllcnMpLCBlID0gMDsgZSA8IHMubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS51aW50MzIoMjM0KS5mb3JrKCkudWludDMyKDEwKS5zdHJpbmcoc1tlXSkudWludDMyKDE4KS5zdHJpbmcodC5yZWxvYWRlZFBsYXllcnNbc1tlXV0pLmxkZWxpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LmRpc2FibGVUcmFja2luZyAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnZGlzYWJsZVRyYWNraW5nJykgJiYgaS51aW50MzIoMjQ4KS5ib29sKHQuZGlzYWJsZVRyYWNraW5nKSwgbnVsbCAhPSB0LnJlZmVycmVyICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdyZWZlcnJlcicpICYmIGkudWludDMyKDI1OCkuc3RyaW5nKHQucmVmZXJyZXIpLCBudWxsICE9IHQubG9jYWxUaW1lc3RhbXAgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2xvY2FsVGltZXN0YW1wJykgJiYgaS51aW50MzIoMjY0KS5pbnQ2NCh0LmxvY2FsVGltZXN0YW1wKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtNCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY3VzdG9tUGFyYW00JykgJiYgaS51aW50MzIoMjc0KS5zdHJpbmcodC5jdXN0b21QYXJhbTQpLCBudWxsICE9IHQuY3VzdG9tUGFyYW01ICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdjdXN0b21QYXJhbTUnKSAmJiBpLnVpbnQzMigyODIpLnN0cmluZyh0LmN1c3RvbVBhcmFtNSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tT2JqZWN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBjLlByb3RvRWxlbWVudHNSZXF1ZXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuUHJvdG9FbGVtZW50c1JlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQudG9rZW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC50b2tlbnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvRWxlbWVudHNSZXF1ZXN0LnRva2VuczogYXJyYXkgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudG9rZW5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IHQudG9rZW5zLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudG9rZW5zW2VdID0gU3RyaW5nKHQudG9rZW5zW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LnBhZ2VVcmwgJiYgKGkucGFnZVVybCA9IFN0cmluZyh0LnBhZ2VVcmwpKSwgbnVsbCAhPSB0LnVzZXJJZCAmJiAoaS51c2VySWQgPSBTdHJpbmcodC51c2VySWQpKSwgbnVsbCAhPSB0LmZvcmNlUGxheWVySWQgJiYgKGkuZm9yY2VQbGF5ZXJJZCA9IFN0cmluZyh0LmZvcmNlUGxheWVySWQpKSwgbnVsbCAhPSB0LmZvcmNlTWVkaWFJZCAmJiAoaS5mb3JjZU1lZGlhSWQgPSBTdHJpbmcodC5mb3JjZU1lZGlhSWQpKSwgbnVsbCAhPSB0LmZvcmNlUGxheWxpc3RJZCAmJiAoaS5mb3JjZVBsYXlsaXN0SWQgPSBTdHJpbmcodC5mb3JjZVBsYXlsaXN0SWQpKSwgbnVsbCAhPSB0LnZlcnNpb24gJiYgKGkudmVyc2lvbiA9IDAgfCB0LnZlcnNpb24pLCB0LmZvcmNlTGluZUl0ZW1JZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmZvcmNlTGluZUl0ZW1JZHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignLlByb3RvRWxlbWVudHNSZXF1ZXN0LmZvcmNlTGluZUl0ZW1JZHM6IGFycmF5IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmZvcmNlTGluZUl0ZW1JZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCB0LmZvcmNlTGluZUl0ZW1JZHMubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5mb3JjZUxpbmVJdGVtSWRzW2VdID0gU3RyaW5nKHQuZm9yY2VMaW5lSXRlbUlkc1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChudWxsICE9IHQuY2xpZW50QWIwICYmIChpLmNsaWVudEFiMCA9IDAgfCB0LmNsaWVudEFiMCksIG51bGwgIT0gdC5jbGllbnRBYjEgJiYgKGkuY2xpZW50QWIxID0gMCB8IHQuY2xpZW50QWIxKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtMSAmJiAoaS5jdXN0b21QYXJhbTEgPSBTdHJpbmcodC5jdXN0b21QYXJhbTEpKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtMiAmJiAoaS5jdXN0b21QYXJhbTIgPSBTdHJpbmcodC5jdXN0b21QYXJhbTIpKSwgbnVsbCAhPSB0LmN1c3RvbVBhcmFtMyAmJiAoaS5jdXN0b21QYXJhbTMgPSBTdHJpbmcodC5jdXN0b21QYXJhbTMpKSwgbnVsbCAhPSB0LmZvcmNlRXhwbG9yYXRpb24gJiYgKGkuZm9yY2VFeHBsb3JhdGlvbiA9IEJvb2xlYW4odC5mb3JjZUV4cGxvcmF0aW9uKSksIG51bGwgIT0gdC5lczYgJiYgKGkuZXM2ID0gQm9vbGVhbih0LmVzNikpLCBudWxsICE9IHQuYnVuZGxlSWQgJiYgKGkuYnVuZGxlSWQgPSBTdHJpbmcodC5idW5kbGVJZCkpLCBudWxsICE9IHQuZm9yY2VTb3VyY2VJdGVtSWQgJiYgKGkuZm9yY2VTb3VyY2VJdGVtSWQgPSBTdHJpbmcodC5mb3JjZVNvdXJjZUl0ZW1JZCkpLCBudWxsICE9IHQucGFyc2VEb21haW4gJiYgKGkucGFyc2VEb21haW4gPSBCb29sZWFuKHQucGFyc2VEb21haW4pKSwgdC5pbXBsZW1lbnRhdGlvblR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV2ViJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5pbXBsZW1lbnRhdGlvblR5cGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0FtcCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW1wbGVtZW50YXRpb25UeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5xdWVyeUpzVGFyZ2V0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT0gdHlwZW9mIHQucXVlcnlKc1RhcmdldGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0VsZW1lbnRzUmVxdWVzdC5xdWVyeUpzVGFyZ2V0aW5nOiBvYmplY3QgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucXVlcnlKc1RhcmdldGluZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3Qua2V5cyh0LnF1ZXJ5SnNUYXJnZXRpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IHMubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5xdWVyeUpzVGFyZ2V0aW5nW3NbZV1dID0gU3RyaW5nKHQucXVlcnlKc1RhcmdldGluZ1tzW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5pc0NvbnNlbnRDb25uYXRpeCAmJiAoaS5pc0NvbnNlbnRDb25uYXRpeCA9IEJvb2xlYW4odC5pc0NvbnNlbnRDb25uYXRpeCkpLCB0LnJlbG9hZGVkUGxheWVycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiB0LnJlbG9hZGVkUGxheWVycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJy5Qcm90b0VsZW1lbnRzUmVxdWVzdC5yZWxvYWRlZFBsYXllcnM6IG9iamVjdCBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWxvYWRlZFBsYXllcnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IE9iamVjdC5rZXlzKHQucmVsb2FkZWRQbGF5ZXJzKSwgZSA9IDA7IGUgPCBzLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucmVsb2FkZWRQbGF5ZXJzW3NbZV1dID0gU3RyaW5nKHQucmVsb2FkZWRQbGF5ZXJzW3NbZV1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LmRpc2FibGVUcmFja2luZyAmJiAoaS5kaXNhYmxlVHJhY2tpbmcgPSBCb29sZWFuKHQuZGlzYWJsZVRyYWNraW5nKSksIG51bGwgIT0gdC5yZWZlcnJlciAmJiAoaS5yZWZlcnJlciA9IFN0cmluZyh0LnJlZmVycmVyKSksIG51bGwgIT0gdC5sb2NhbFRpbWVzdGFtcCAmJiAoby5Mb25nID8gKGkubG9jYWxUaW1lc3RhbXAgPSBvLkxvbmcuZnJvbVZhbHVlKHQubG9jYWxUaW1lc3RhbXApKS51bnNpZ25lZCA9ICExIDogJ3N0cmluZycgPT0gdHlwZW9mIHQubG9jYWxUaW1lc3RhbXAgPyBpLmxvY2FsVGltZXN0YW1wID0gcGFyc2VJbnQodC5sb2NhbFRpbWVzdGFtcCwgMTApIDogJ251bWJlcicgPT0gdHlwZW9mIHQubG9jYWxUaW1lc3RhbXAgPyBpLmxvY2FsVGltZXN0YW1wID0gdC5sb2NhbFRpbWVzdGFtcCA6ICdvYmplY3QnID09IHR5cGVvZiB0LmxvY2FsVGltZXN0YW1wICYmIChpLmxvY2FsVGltZXN0YW1wID0gbmV3IG8uTG9uZ0JpdHModC5sb2NhbFRpbWVzdGFtcC5sb3cgPj4+IDAsIHQubG9jYWxUaW1lc3RhbXAuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCBudWxsICE9IHQuY3VzdG9tUGFyYW00ICYmIChpLmN1c3RvbVBhcmFtNCA9IFN0cmluZyh0LmN1c3RvbVBhcmFtNCkpLCBudWxsICE9IHQuY3VzdG9tUGFyYW01ICYmIChpLmN1c3RvbVBhcmFtNSA9IFN0cmluZyh0LmN1c3RvbVBhcmFtNSkpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5bGlzdEl0ZW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5tZWRpYUlkID0gJycsIHQucHJvdG90eXBlLnJldmlzaW9uTnVtYmVyID0gMCwgdC5wcm90b3R5cGUubWVkaWFDb250ZW50VmVyc2lvbklkID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvUGxheWxpc3RJdGVtKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yZXZpc2lvbk51bWJlciA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1lZGlhQ29udGVudFZlcnNpb25JZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5tZWRpYUlkID0gJycsIGUucmV2aXNpb25OdW1iZXIgPSAwLCBlLm1lZGlhQ29udGVudFZlcnNpb25JZCA9ICcnKSwgbnVsbCAhPSB0Lm1lZGlhSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFJZCcpICYmIChlLm1lZGlhSWQgPSB0Lm1lZGlhSWQpLCBudWxsICE9IHQucmV2aXNpb25OdW1iZXIgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncmV2aXNpb25OdW1iZXInKSAmJiAoZS5yZXZpc2lvbk51bWJlciA9IHQucmV2aXNpb25OdW1iZXIpLCBudWxsICE9IHQubWVkaWFDb250ZW50VmVyc2lvbklkICYmIHQuaGFzT3duUHJvcGVydHkoJ21lZGlhQ29udGVudFZlcnNpb25JZCcpICYmIChlLm1lZGlhQ29udGVudFZlcnNpb25JZCA9IHQubWVkaWFDb250ZW50VmVyc2lvbklkKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvRWxlbWVudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNoYXJpbmdEZXN0aW5hdGlvbnMgPSBbXSwgdGhpcy5mbG9hdGluZ0RldmljZU1vZGUgPSBbXSwgdGhpcy5saW5lSXRlbXMgPSBbXSwgdGhpcy5wbGF5bGlzdCA9IFtdLCB0aGlzLmFkQnJlYWtzID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnBsYXllcklkID0gJycsIHQucHJvdG90eXBlLnBsYXliYWNrTW9kZSA9IDAsIHQucHJvdG90eXBlLnNvdW5kTW9kZSA9IDAsIHQucHJvdG90eXBlLnVwTmV4dE1vZGUgPSAxLCB0LnByb3RvdHlwZS5jb250YWluZXJTZWxlY3RvciA9ICcnLCB0LnByb3RvdHlwZS5wb3NpdGlvbiA9IDAsIHQucHJvdG90eXBlLmluc2VydFBvc2l0aW9uID0gMCwgdC5wcm90b3R5cGUuZm9yY2VJbnNlcnRQYXRoID0gITEsIHQucHJvdG90eXBlLnJlbmRlckluRnJhbWUgPSAhMSwgdC5wcm90b3R5cGUuc2Nyb2xsSGlqYWNraW5nUHJvdGVjdGlvbiA9ICExLCB0LnByb3RvdHlwZS5wcmVSb2xsQnJlYWsgPSAwLCB0LnByb3RvdHlwZS5wb3N0Um9sbEJyZWFrID0gMCwgdC5wcm90b3R5cGUubWlkUm9sbE51bWJlciA9IC0xLCB0LnByb3RvdHlwZS50aW1lQmV0d2VlbkFkcyA9IDAsIHQucHJvdG90eXBlLm1pblRpbWVCZWZvcmVGaXJzdEFkID0gMCwgdC5wcm90b3R5cGUuYWRWaWV3YWJpbGl0eVBvbGljeSA9IDAsIHQucHJvdG90eXBlLnJlc3BvbnNpdmUgPSAhMSwgdC5wcm90b3R5cGUucmF0aW9XaWR0aCA9IDAsIHQucHJvdG90eXBlLnJhdGlvSGVpZ2h0ID0gMCwgdC5wcm90b3R5cGUuZml4ZWRXaWR0aCA9IDAsIHQucHJvdG90eXBlLmZpeGVkSGVpZ2h0ID0gMCwgdC5wcm90b3R5cGUuY2FzdGluZyA9ICExLCB0LnByb3RvdHlwZS5zaGFyaW5nRGVzdGluYXRpb25zID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5jbG9zZWRDYXB0aW9uID0gITEsIHQucHJvdG90eXBlLm11dGVXYXRlcm1hcmsgPSAhMSwgdC5wcm90b3R5cGUuZXhwYW5kQnV0dG9uID0gITEsIHQucHJvdG90eXBlLmNsb3NlQnV0dG9uTW9kZSA9IDAsIHQucHJvdG90eXBlLmZsb2F0aW5nTW9kZSA9IDAsIHQucHJvdG90eXBlLmZsb2F0aW5nRGV2aWNlTW9kZSA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUgPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ0ZpeGVkUG9zaXRpb24gPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ1BhZ2VFbGVtZW50ID0gJycsIHQucHJvdG90eXBlLmZsb2F0aW5nVXNlRWxlbWVudFdpZHRoID0gITEsIHQucHJvdG90eXBlLmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24gPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ0d1dHRlclggPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ0d1dHRlclkgPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ1dpZHRoID0gMCwgdC5wcm90b3R5cGUuaWNvbnNDb2xvciA9ICcnLCB0LnByb3RvdHlwZS5hY2NlbnRDb2xvciA9ICcnLCB0LnByb3RvdHlwZS50b29sdGlwVGV4dENvbG9yID0gJycsIHQucHJvdG90eXBlLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgPSAnJywgdC5wcm90b3R5cGUuaHRtbCA9ICcnLCB0LnByb3RvdHlwZS5nYWxsZXJ5U3R5bGUgPSAwLCB0LnByb3RvdHlwZS5sb2dvUG9zaXRpb24gPSAwLCB0LnByb3RvdHlwZS5sb2dvVXJsID0gJycsIHQucHJvdG90eXBlLmxpbmVJdGVtcyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuYWRQbGF5YmFja01vZGUgPSAwLCB0LnByb3RvdHlwZS5jc3MgPSAnJywgdC5wcm90b3R5cGUuc2Vzc2lvbklkID0gJycsIHQucHJvdG90eXBlLnBsYXlsaXN0SWQgPSAnJywgdC5wcm90b3R5cGUucGxheWVyVHlwZSA9IDAsIHQucHJvdG90eXBlLm91dHN0cmVhbUluaXRpYWxSZW5kZXJpbmcgPSAwLCB0LnByb3RvdHlwZS5vdXRzdHJlYW1Ib3VzZUJhY2tncm91bmRDb2xvciA9ICcnLCB0LnByb3RvdHlwZS5vdXRzdHJlYW1Ub3RhbEFkQnJlYWtMZW5ndGggPSAwLCB0LnByb3RvdHlwZS5vdXRzdHJlYW1FbmRBZEJyZWFrUG9saWN5ID0gMCwgdC5wcm90b3R5cGUuZ2FsbGVyeU9yaWVudGF0aW9uID0gMCwgdC5wcm90b3R5cGUucGxheWxpc3QgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmZsb2F0aW5nQXBwZW5kTG9jYXRpb24gPSAwLCB0LnByb3RvdHlwZS5mbG9hdGluZ1lBeGlzUGFkZGluZyA9IDAsIHQucHJvdG90eXBlLmN1c3RvbUpzQ29kZSA9ICcnLCB0LnByb3RvdHlwZS52aWRlb1F1YWxpdHkgPSAwLCB0LnByb3RvdHlwZS5pbml0aWFsaXphdGlvblNldHRpbmdzSnNvbiA9ICcnLCB0LnByb3RvdHlwZS5hZFNraXBwYWJpbGl0eSA9IDAsIHQucHJvdG90eXBlLnNraXBBZEFmdGVyID0gNSwgdC5wcm90b3R5cGUuYWRCcmVha3MgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmFtYXpvblRhbVNsb3RJZCA9ICcnLCB0LnByb3RvdHlwZS5taWRSb2xsT25seU9uTG9uZ0NvbnRlbnQgPSAhMCwgdC5wcm90b3R5cGUubGltaXRDbGllbnRTaWRlQXBpVXNlID0gITEsIHQucHJvdG90eXBlLmFiVGVzdElkID0gJycsIHQucHJvdG90eXBlLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiA9IDMxLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b0VsZW1lbnRzKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucGxheWVySWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucGxheWJhY2tNb2RlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc291bmRNb2RlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXBOZXh0TW9kZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbnRhaW5lclNlbGVjdG9yID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBvc2l0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaW5zZXJ0UG9zaXRpb24gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5mb3JjZUluc2VydFBhdGggPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbmRlckluRnJhbWUgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zY3JvbGxIaWphY2tpbmdQcm90ZWN0aW9uID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJlUm9sbEJyZWFrID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBvc3RSb2xsQnJlYWsgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWlkUm9sbE51bWJlciA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50aW1lQmV0d2VlbkFkcyA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5taW5UaW1lQmVmb3JlRmlyc3RBZCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFZpZXdhYmlsaXR5UG9saWN5ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlc3BvbnNpdmUgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yYXRpb1dpZHRoID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJhdGlvSGVpZ2h0ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZpeGVkV2lkdGggPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZml4ZWRIZWlnaHQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY2FzdGluZyA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zaGFyaW5nRGVzdGluYXRpb25zICYmIHMuc2hhcmluZ0Rlc3RpbmF0aW9ucy5sZW5ndGggfHwgKHMuc2hhcmluZ0Rlc3RpbmF0aW9ucyA9IFtdKSwgMiA9PSAoNyAmIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gdC51aW50MzIoKSArIHQucG9zOyB0LnBvcyA8IHI7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zaGFyaW5nRGVzdGluYXRpb25zLnB1c2godC5pbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2hhcmluZ0Rlc3RpbmF0aW9ucy5wdXNoKHQuaW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY2xvc2VkQ2FwdGlvbiA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm11dGVXYXRlcm1hcmsgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5leHBhbmRCdXR0b24gPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jbG9zZUJ1dHRvbk1vZGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdNb2RlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5mbG9hdGluZ0RldmljZU1vZGUgJiYgcy5mbG9hdGluZ0RldmljZU1vZGUubGVuZ3RoIHx8IChzLmZsb2F0aW5nRGV2aWNlTW9kZSA9IFtdKSwgMiA9PSAoNyAmIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSB0LnVpbnQzMigpICsgdC5wb3M7IHQucG9zIDwgcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nRGV2aWNlTW9kZS5wdXNoKHQuaW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nRGV2aWNlTW9kZS5wdXNoKHQuaW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdGaXhlZFBvc2l0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nUGFnZUVsZW1lbnQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nVXNlRWxlbWVudFdpZHRoID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5mbG9hdGluZ0d1dHRlclggPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdHdXR0ZXJZID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nV2lkdGggPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaWNvbnNDb2xvciA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWNjZW50Q29sb3IgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRvb2x0aXBUZXh0Q29sb3IgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0MzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmh0bWwgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdhbGxlcnlTdHlsZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sb2dvUG9zaXRpb24gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubG9nb1VybCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGluZUl0ZW1zICYmIHMubGluZUl0ZW1zLmxlbmd0aCB8fCAocy5saW5lSXRlbXMgPSBbXSksIHMubGluZUl0ZW1zLnB1c2goYy5Qcm90b0xpbmVJdGVtLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRQbGF5YmFja01vZGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY3NzID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zZXNzaW9uSWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBsYXlsaXN0SWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1NDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBsYXllclR5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZyA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vdXRzdHJlYW1Ib3VzZUJhY2tncm91bmRDb2xvciA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub3V0c3RyZWFtVG90YWxBZEJyZWFrTGVuZ3RoID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm91dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3kgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2FsbGVyeU9yaWVudGF0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBsYXlsaXN0ICYmIHMucGxheWxpc3QubGVuZ3RoIHx8IChzLnBsYXlsaXN0ID0gW10pLCBzLnBsYXlsaXN0LnB1c2goYy5Qcm90b1BsYXlsaXN0SXRlbS5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb2F0aW5nQXBwZW5kTG9jYXRpb24gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmxvYXRpbmdZQXhpc1BhZGRpbmcgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY3VzdG9tSnNDb2RlID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy52aWRlb1F1YWxpdHkgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaW5pdGlhbGl6YXRpb25TZXR0aW5nc0pzb24gPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2NjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkU2tpcHBhYmlsaXR5ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2NzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNraXBBZEFmdGVyID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2ODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkQnJlYWtzICYmIHMuYWRCcmVha3MubGVuZ3RoIHx8IChzLmFkQnJlYWtzID0gW10pLCBzLmFkQnJlYWtzLnB1c2goYy5Qcm90b0FkQnJlYWsuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hbWF6b25UYW1TbG90SWQgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3MDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1pZFJvbGxPbmx5T25Mb25nQ29udGVudCA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3MToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxpbWl0Q2xpZW50U2lkZUFwaVVzZSA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3MjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFiVGVzdElkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4gPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLnNoYXJpbmdEZXN0aW5hdGlvbnMgPSBbXSwgZS5mbG9hdGluZ0RldmljZU1vZGUgPSBbXSwgZS5saW5lSXRlbXMgPSBbXSwgZS5wbGF5bGlzdCA9IFtdLCBlLmFkQnJlYWtzID0gW10pLCBpLmRlZmF1bHRzICYmIChlLnBsYXllcklkID0gJycsIGUucGxheWJhY2tNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0F1dG9wbGF5JyA6IDAsIGUuc291bmRNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ011dGUnIDogMCwgZS51cE5leHRNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ05leHQnIDogMSwgZS5jb250YWluZXJTZWxlY3RvciA9ICcnLCBlLnBvc2l0aW9uID0gMCwgZS5pbnNlcnRQb3NpdGlvbiA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdXaXRoaW5Db250YWluZXInIDogMCwgZS5mb3JjZUluc2VydFBhdGggPSAhMSwgZS5yZW5kZXJJbkZyYW1lID0gITEsIGUuc2Nyb2xsSGlqYWNraW5nUHJvdGVjdGlvbiA9ICExLCBlLnByZVJvbGxCcmVhayA9IDAsIGUucG9zdFJvbGxCcmVhayA9IDAsIGUubWlkUm9sbE51bWJlciA9IC0xLCBlLnRpbWVCZXR3ZWVuQWRzID0gMCwgZS5taW5UaW1lQmVmb3JlRmlyc3RBZCA9IDAsIGUuYWRWaWV3YWJpbGl0eVBvbGljeSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdEZWZhdWx0JyA6IDAsIGUucmVzcG9uc2l2ZSA9ICExLCBlLnJhdGlvV2lkdGggPSAwLCBlLnJhdGlvSGVpZ2h0ID0gMCwgZS5maXhlZFdpZHRoID0gMCwgZS5maXhlZEhlaWdodCA9IDAsIGUuY2FzdGluZyA9ICExLCBlLmNsb3NlZENhcHRpb24gPSAhMSwgZS5tdXRlV2F0ZXJtYXJrID0gITEsIGUuZXhwYW5kQnV0dG9uID0gITEsIGUuY2xvc2VCdXR0b25Nb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ09mZicgOiAwLCBlLmZsb2F0aW5nTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdPZmYnIDogMCwgZS5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdPZmYnIDogMCwgZS5mbG9hdGluZ0ZpeGVkUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyAnUGFnZScgOiAwLCBlLmZsb2F0aW5nUGFnZUVsZW1lbnQgPSAnJywgZS5mbG9hdGluZ1VzZUVsZW1lbnRXaWR0aCA9ICExLCBlLmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyAnQm90dG9tUmlnaHQnIDogMCwgZS5mbG9hdGluZ0d1dHRlclggPSAwLCBlLmZsb2F0aW5nR3V0dGVyWSA9IDAsIGUuZmxvYXRpbmdXaWR0aCA9IDAsIGUuaWNvbnNDb2xvciA9ICcnLCBlLmFjY2VudENvbG9yID0gJycsIGUudG9vbHRpcFRleHRDb2xvciA9ICcnLCBlLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgPSAnJywgZS5odG1sID0gJycsIGUuZ2FsbGVyeVN0eWxlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ05vbmUnIDogMCwgZS5sb2dvUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyAnTm9uZScgOiAwLCBlLmxvZ29VcmwgPSAnJywgZS5hZFBsYXliYWNrTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdBdXRvcGxheScgOiAwLCBlLmNzcyA9ICcnLCBlLnNlc3Npb25JZCA9ICcnLCBlLnBsYXlsaXN0SWQgPSAnJywgZS5wbGF5ZXJUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0luU3RyZWFtJyA6IDAsIGUub3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZyA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdFeHBhbmRXaXRoQWQnIDogMCwgZS5vdXRzdHJlYW1Ib3VzZUJhY2tncm91bmRDb2xvciA9ICcnLCBlLm91dHN0cmVhbVRvdGFsQWRCcmVha0xlbmd0aCA9IDAsIGUub3V0c3RyZWFtRW5kQWRCcmVha1BvbGljeSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdIaWRlJyA6IDAsIGUuZ2FsbGVyeU9yaWVudGF0aW9uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0xhbmRzY2FwZScgOiAwLCBlLmZsb2F0aW5nQXBwZW5kTG9jYXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyAnQWJvdmUnIDogMCwgZS5mbG9hdGluZ1lBeGlzUGFkZGluZyA9IDAsIGUuY3VzdG9tSnNDb2RlID0gJycsIGUudmlkZW9RdWFsaXR5ID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0F1dG8nIDogMCwgZS5pbml0aWFsaXphdGlvblNldHRpbmdzSnNvbiA9ICcnLCBlLmFkU2tpcHBhYmlsaXR5ID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0lmTG9uZ2VyVGhhbicgOiAwLCBlLnNraXBBZEFmdGVyID0gNSwgZS5hbWF6b25UYW1TbG90SWQgPSAnJywgZS5taWRSb2xsT25seU9uTG9uZ0NvbnRlbnQgPSAhMCwgZS5saW1pdENsaWVudFNpZGVBcGlVc2UgPSAhMSwgZS5hYlRlc3RJZCA9ICcnLCBlLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiA9IDMxKSwgbnVsbCAhPSB0LnBsYXllcklkICYmIHQuaGFzT3duUHJvcGVydHkoJ3BsYXllcklkJykgJiYgKGUucGxheWVySWQgPSB0LnBsYXllcklkKSwgbnVsbCAhPSB0LnBsYXliYWNrTW9kZSAmJiB0Lmhhc093blByb3BlcnR5KCdwbGF5YmFja01vZGUnKSAmJiAoZS5wbGF5YmFja01vZGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bVt0LnBsYXliYWNrTW9kZV0gOiB0LnBsYXliYWNrTW9kZSksIG51bGwgIT0gdC5zb3VuZE1vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc291bmRNb2RlJykgJiYgKGUuc291bmRNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1BsYXllclNvdW5kTW9kZVt0LnNvdW5kTW9kZV0gOiB0LnNvdW5kTW9kZSksIG51bGwgIT0gdC51cE5leHRNb2RlICYmIHQuaGFzT3duUHJvcGVydHkoJ3VwTmV4dE1vZGUnKSAmJiAoZS51cE5leHRNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1BsYXllclVwTmV4dE1vZGVbdC51cE5leHRNb2RlXSA6IHQudXBOZXh0TW9kZSksIG51bGwgIT0gdC5jb250YWluZXJTZWxlY3RvciAmJiB0Lmhhc093blByb3BlcnR5KCdjb250YWluZXJTZWxlY3RvcicpICYmIChlLmNvbnRhaW5lclNlbGVjdG9yID0gdC5jb250YWluZXJTZWxlY3RvciksIG51bGwgIT0gdC5wb3NpdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdwb3NpdGlvbicpICYmIChlLnBvc2l0aW9uID0gdC5wb3NpdGlvbiksIG51bGwgIT0gdC5pbnNlcnRQb3NpdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdpbnNlcnRQb3NpdGlvbicpICYmIChlLmluc2VydFBvc2l0aW9uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1BsYXllckluc2VydE1vZGVbdC5pbnNlcnRQb3NpdGlvbl0gOiB0Lmluc2VydFBvc2l0aW9uKSwgbnVsbCAhPSB0LmZvcmNlSW5zZXJ0UGF0aCAmJiB0Lmhhc093blByb3BlcnR5KCdmb3JjZUluc2VydFBhdGgnKSAmJiAoZS5mb3JjZUluc2VydFBhdGggPSB0LmZvcmNlSW5zZXJ0UGF0aCksIG51bGwgIT0gdC5yZW5kZXJJbkZyYW1lICYmIHQuaGFzT3duUHJvcGVydHkoJ3JlbmRlckluRnJhbWUnKSAmJiAoZS5yZW5kZXJJbkZyYW1lID0gdC5yZW5kZXJJbkZyYW1lKSwgbnVsbCAhPSB0LnNjcm9sbEhpamFja2luZ1Byb3RlY3Rpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc2Nyb2xsSGlqYWNraW5nUHJvdGVjdGlvbicpICYmIChlLnNjcm9sbEhpamFja2luZ1Byb3RlY3Rpb24gPSB0LnNjcm9sbEhpamFja2luZ1Byb3RlY3Rpb24pLCBudWxsICE9IHQucHJlUm9sbEJyZWFrICYmIHQuaGFzT3duUHJvcGVydHkoJ3ByZVJvbGxCcmVhaycpICYmIChlLnByZVJvbGxCcmVhayA9IHQucHJlUm9sbEJyZWFrKSwgbnVsbCAhPSB0LnBvc3RSb2xsQnJlYWsgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncG9zdFJvbGxCcmVhaycpICYmIChlLnBvc3RSb2xsQnJlYWsgPSB0LnBvc3RSb2xsQnJlYWspLCBudWxsICE9IHQubWlkUm9sbE51bWJlciAmJiB0Lmhhc093blByb3BlcnR5KCdtaWRSb2xsTnVtYmVyJykgJiYgKGUubWlkUm9sbE51bWJlciA9IHQubWlkUm9sbE51bWJlciksIG51bGwgIT0gdC50aW1lQmV0d2VlbkFkcyAmJiB0Lmhhc093blByb3BlcnR5KCd0aW1lQmV0d2VlbkFkcycpICYmIChlLnRpbWVCZXR3ZWVuQWRzID0gdC50aW1lQmV0d2VlbkFkcyksIG51bGwgIT0gdC5taW5UaW1lQmVmb3JlRmlyc3RBZCAmJiB0Lmhhc093blByb3BlcnR5KCdtaW5UaW1lQmVmb3JlRmlyc3RBZCcpICYmIChlLm1pblRpbWVCZWZvcmVGaXJzdEFkID0gdC5taW5UaW1lQmVmb3JlRmlyc3RBZCksIG51bGwgIT0gdC5hZFZpZXdhYmlsaXR5UG9saWN5ICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkVmlld2FiaWxpdHlQb2xpY3knKSAmJiAoZS5hZFZpZXdhYmlsaXR5UG9saWN5ID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0FkVmlld2FiaWxpdHlQb2xpY3lbdC5hZFZpZXdhYmlsaXR5UG9saWN5XSA6IHQuYWRWaWV3YWJpbGl0eVBvbGljeSksIG51bGwgIT0gdC5yZXNwb25zaXZlICYmIHQuaGFzT3duUHJvcGVydHkoJ3Jlc3BvbnNpdmUnKSAmJiAoZS5yZXNwb25zaXZlID0gdC5yZXNwb25zaXZlKSwgbnVsbCAhPSB0LnJhdGlvV2lkdGggJiYgdC5oYXNPd25Qcm9wZXJ0eSgncmF0aW9XaWR0aCcpICYmIChlLnJhdGlvV2lkdGggPSB0LnJhdGlvV2lkdGgpLCBudWxsICE9IHQucmF0aW9IZWlnaHQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncmF0aW9IZWlnaHQnKSAmJiAoZS5yYXRpb0hlaWdodCA9IHQucmF0aW9IZWlnaHQpLCBudWxsICE9IHQuZml4ZWRXaWR0aCAmJiB0Lmhhc093blByb3BlcnR5KCdmaXhlZFdpZHRoJykgJiYgKGUuZml4ZWRXaWR0aCA9IHQuZml4ZWRXaWR0aCksIG51bGwgIT0gdC5maXhlZEhlaWdodCAmJiB0Lmhhc093blByb3BlcnR5KCdmaXhlZEhlaWdodCcpICYmIChlLmZpeGVkSGVpZ2h0ID0gdC5maXhlZEhlaWdodCksIG51bGwgIT0gdC5jYXN0aW5nICYmIHQuaGFzT3duUHJvcGVydHkoJ2Nhc3RpbmcnKSAmJiAoZS5jYXN0aW5nID0gdC5jYXN0aW5nKSwgdC5zaGFyaW5nRGVzdGluYXRpb25zICYmIHQuc2hhcmluZ0Rlc3RpbmF0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2hhcmluZ0Rlc3RpbmF0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LnNoYXJpbmdEZXN0aW5hdGlvbnMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zaGFyaW5nRGVzdGluYXRpb25zW3NdID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1NoYXJpbmdEZXN0aW5hdGlvblt0LnNoYXJpbmdEZXN0aW5hdGlvbnNbc11dIDogdC5zaGFyaW5nRGVzdGluYXRpb25zW3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuY2xvc2VkQ2FwdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdjbG9zZWRDYXB0aW9uJykgJiYgKGUuY2xvc2VkQ2FwdGlvbiA9IHQuY2xvc2VkQ2FwdGlvbiksIG51bGwgIT0gdC5tdXRlV2F0ZXJtYXJrICYmIHQuaGFzT3duUHJvcGVydHkoJ211dGVXYXRlcm1hcmsnKSAmJiAoZS5tdXRlV2F0ZXJtYXJrID0gdC5tdXRlV2F0ZXJtYXJrKSwgbnVsbCAhPSB0LmV4cGFuZEJ1dHRvbiAmJiB0Lmhhc093blByb3BlcnR5KCdleHBhbmRCdXR0b24nKSAmJiAoZS5leHBhbmRCdXR0b24gPSB0LmV4cGFuZEJ1dHRvbiksIG51bGwgIT0gdC5jbG9zZUJ1dHRvbk1vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY2xvc2VCdXR0b25Nb2RlJykgJiYgKGUuY2xvc2VCdXR0b25Nb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZVt0LmNsb3NlQnV0dG9uTW9kZV0gOiB0LmNsb3NlQnV0dG9uTW9kZSksIG51bGwgIT0gdC5mbG9hdGluZ01vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmxvYXRpbmdNb2RlJykgJiYgKGUuZmxvYXRpbmdNb2RlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1BsYXllckZsb2F0aW5nTW9kZVt0LmZsb2F0aW5nTW9kZV0gOiB0LmZsb2F0aW5nTW9kZSksIHQuZmxvYXRpbmdEZXZpY2VNb2RlICYmIHQuZmxvYXRpbmdEZXZpY2VNb2RlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mbG9hdGluZ0RldmljZU1vZGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LmZsb2F0aW5nRGV2aWNlTW9kZS5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZsb2F0aW5nRGV2aWNlTW9kZVtzXSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9EZXZpY2VUeXBlW3QuZmxvYXRpbmdEZXZpY2VNb2RlW3NdXSA6IHQuZmxvYXRpbmdEZXZpY2VNb2RlW3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUnKSAmJiAoZS5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGVbdC5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZV0gOiB0LmZsb2F0aW5nQ2xvc2VCdXR0b25Nb2RlKSwgbnVsbCAhPSB0LmZsb2F0aW5nRml4ZWRQb3NpdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdmbG9hdGluZ0ZpeGVkUG9zaXRpb24nKSAmJiAoZS5mbG9hdGluZ0ZpeGVkUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvRmxvYXRpbmdGaXhlZFBvc2l0aW9uTW9kZVt0LmZsb2F0aW5nRml4ZWRQb3NpdGlvbl0gOiB0LmZsb2F0aW5nRml4ZWRQb3NpdGlvbiksIG51bGwgIT0gdC5mbG9hdGluZ1BhZ2VFbGVtZW50ICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb2F0aW5nUGFnZUVsZW1lbnQnKSAmJiAoZS5mbG9hdGluZ1BhZ2VFbGVtZW50ID0gdC5mbG9hdGluZ1BhZ2VFbGVtZW50KSwgbnVsbCAhPSB0LmZsb2F0aW5nVXNlRWxlbWVudFdpZHRoICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb2F0aW5nVXNlRWxlbWVudFdpZHRoJykgJiYgKGUuZmxvYXRpbmdVc2VFbGVtZW50V2lkdGggPSB0LmZsb2F0aW5nVXNlRWxlbWVudFdpZHRoKSwgbnVsbCAhPSB0LmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmxvYXRpbmdTY3JvbGxQb3NpdGlvbicpICYmIChlLmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvUG9zaXRpb25Nb2RlW3QuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbl0gOiB0LmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24pLCBudWxsICE9IHQuZmxvYXRpbmdHdXR0ZXJYICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb2F0aW5nR3V0dGVyWCcpICYmIChlLmZsb2F0aW5nR3V0dGVyWCA9IHQuZmxvYXRpbmdHdXR0ZXJYKSwgbnVsbCAhPSB0LmZsb2F0aW5nR3V0dGVyWSAmJiB0Lmhhc093blByb3BlcnR5KCdmbG9hdGluZ0d1dHRlclknKSAmJiAoZS5mbG9hdGluZ0d1dHRlclkgPSB0LmZsb2F0aW5nR3V0dGVyWSksIG51bGwgIT0gdC5mbG9hdGluZ1dpZHRoICYmIHQuaGFzT3duUHJvcGVydHkoJ2Zsb2F0aW5nV2lkdGgnKSAmJiAoZS5mbG9hdGluZ1dpZHRoID0gdC5mbG9hdGluZ1dpZHRoKSwgbnVsbCAhPSB0Lmljb25zQ29sb3IgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaWNvbnNDb2xvcicpICYmIChlLmljb25zQ29sb3IgPSB0Lmljb25zQ29sb3IpLCBudWxsICE9IHQuYWNjZW50Q29sb3IgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWNjZW50Q29sb3InKSAmJiAoZS5hY2NlbnRDb2xvciA9IHQuYWNjZW50Q29sb3IpLCBudWxsICE9IHQudG9vbHRpcFRleHRDb2xvciAmJiB0Lmhhc093blByb3BlcnR5KCd0b29sdGlwVGV4dENvbG9yJykgJiYgKGUudG9vbHRpcFRleHRDb2xvciA9IHQudG9vbHRpcFRleHRDb2xvciksIG51bGwgIT0gdC50b29sdGlwQmFja2dyb3VuZENvbG9yICYmIHQuaGFzT3duUHJvcGVydHkoJ3Rvb2x0aXBCYWNrZ3JvdW5kQ29sb3InKSAmJiAoZS50b29sdGlwQmFja2dyb3VuZENvbG9yID0gdC50b29sdGlwQmFja2dyb3VuZENvbG9yKSwgbnVsbCAhPSB0Lmh0bWwgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaHRtbCcpICYmIChlLmh0bWwgPSB0Lmh0bWwpLCBudWxsICE9IHQuZ2FsbGVyeVN0eWxlICYmIHQuaGFzT3duUHJvcGVydHkoJ2dhbGxlcnlTdHlsZScpICYmIChlLmdhbGxlcnlTdHlsZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9HYWxsZXJ5U3R5bGVNb2RlW3QuZ2FsbGVyeVN0eWxlXSA6IHQuZ2FsbGVyeVN0eWxlKSwgbnVsbCAhPSB0LmxvZ29Qb3NpdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdsb2dvUG9zaXRpb24nKSAmJiAoZS5sb2dvUG9zaXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvTG9nb1Bvc2l0aW9uTW9kZVt0LmxvZ29Qb3NpdGlvbl0gOiB0LmxvZ29Qb3NpdGlvbiksIG51bGwgIT0gdC5sb2dvVXJsICYmIHQuaGFzT3duUHJvcGVydHkoJ2xvZ29VcmwnKSAmJiAoZS5sb2dvVXJsID0gdC5sb2dvVXJsKSwgdC5saW5lSXRlbXMgJiYgdC5saW5lSXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxpbmVJdGVtcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHQubGluZUl0ZW1zLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubGluZUl0ZW1zW3NdID0gYy5Qcm90b0xpbmVJdGVtLnRvT2JqZWN0KHQubGluZUl0ZW1zW3NdLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmFkUGxheWJhY2tNb2RlICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkUGxheWJhY2tNb2RlJykgJiYgKGUuYWRQbGF5YmFja01vZGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQWRQbGF5YmFja01vZGVbdC5hZFBsYXliYWNrTW9kZV0gOiB0LmFkUGxheWJhY2tNb2RlKSwgbnVsbCAhPSB0LmNzcyAmJiB0Lmhhc093blByb3BlcnR5KCdjc3MnKSAmJiAoZS5jc3MgPSB0LmNzcyksIG51bGwgIT0gdC5zZXNzaW9uSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc2Vzc2lvbklkJykgJiYgKGUuc2Vzc2lvbklkID0gdC5zZXNzaW9uSWQpLCBudWxsICE9IHQucGxheWxpc3RJZCAmJiB0Lmhhc093blByb3BlcnR5KCdwbGF5bGlzdElkJykgJiYgKGUucGxheWxpc3RJZCA9IHQucGxheWxpc3RJZCksIG51bGwgIT0gdC5wbGF5ZXJUeXBlICYmIHQuaGFzT3duUHJvcGVydHkoJ3BsYXllclR5cGUnKSAmJiAoZS5wbGF5ZXJUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0VsZW1lbnRzVHlwZUVudW1bdC5wbGF5ZXJUeXBlXSA6IHQucGxheWVyVHlwZSksIG51bGwgIT0gdC5vdXRzdHJlYW1Jbml0aWFsUmVuZGVyaW5nICYmIHQuaGFzT3duUHJvcGVydHkoJ291dHN0cmVhbUluaXRpYWxSZW5kZXJpbmcnKSAmJiAoZS5vdXRzdHJlYW1Jbml0aWFsUmVuZGVyaW5nID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b091dHN0cmVhbUluaXRpYWxSZW5kZXJpbmdFbnVtW3Qub3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZ10gOiB0Lm91dHN0cmVhbUluaXRpYWxSZW5kZXJpbmcpLCBudWxsICE9IHQub3V0c3RyZWFtSG91c2VCYWNrZ3JvdW5kQ29sb3IgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnb3V0c3RyZWFtSG91c2VCYWNrZ3JvdW5kQ29sb3InKSAmJiAoZS5vdXRzdHJlYW1Ib3VzZUJhY2tncm91bmRDb2xvciA9IHQub3V0c3RyZWFtSG91c2VCYWNrZ3JvdW5kQ29sb3IpLCBudWxsICE9IHQub3V0c3RyZWFtVG90YWxBZEJyZWFrTGVuZ3RoICYmIHQuaGFzT3duUHJvcGVydHkoJ291dHN0cmVhbVRvdGFsQWRCcmVha0xlbmd0aCcpICYmIChlLm91dHN0cmVhbVRvdGFsQWRCcmVha0xlbmd0aCA9IHQub3V0c3RyZWFtVG90YWxBZEJyZWFrTGVuZ3RoKSwgbnVsbCAhPSB0Lm91dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3kgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnb3V0c3RyZWFtRW5kQWRCcmVha1BvbGljeScpICYmIChlLm91dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3kgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvT3V0c3RyZWFtRW5kQWRCcmVha1BvbGljeUVudW1bdC5vdXRzdHJlYW1FbmRBZEJyZWFrUG9saWN5XSA6IHQub3V0c3RyZWFtRW5kQWRCcmVha1BvbGljeSksIG51bGwgIT0gdC5nYWxsZXJ5T3JpZW50YXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZ2FsbGVyeU9yaWVudGF0aW9uJykgJiYgKGUuZ2FsbGVyeU9yaWVudGF0aW9uID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW1bdC5nYWxsZXJ5T3JpZW50YXRpb25dIDogdC5nYWxsZXJ5T3JpZW50YXRpb24pLCB0LnBsYXlsaXN0ICYmIHQucGxheWxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBsYXlsaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5wbGF5bGlzdC5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBsYXlsaXN0W3NdID0gYy5Qcm90b1BsYXlsaXN0SXRlbS50b09iamVjdCh0LnBsYXlsaXN0W3NdLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0LmZsb2F0aW5nQXBwZW5kTG9jYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmxvYXRpbmdBcHBlbmRMb2NhdGlvbicpICYmIChlLmZsb2F0aW5nQXBwZW5kTG9jYXRpb24gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvRmxvYXRpbmdBcHBlbmRMb2NhdGlvbkVudW1bdC5mbG9hdGluZ0FwcGVuZExvY2F0aW9uXSA6IHQuZmxvYXRpbmdBcHBlbmRMb2NhdGlvbiksIG51bGwgIT0gdC5mbG9hdGluZ1lBeGlzUGFkZGluZyAmJiB0Lmhhc093blByb3BlcnR5KCdmbG9hdGluZ1lBeGlzUGFkZGluZycpICYmIChlLmZsb2F0aW5nWUF4aXNQYWRkaW5nID0gdC5mbG9hdGluZ1lBeGlzUGFkZGluZyksIG51bGwgIT0gdC5jdXN0b21Kc0NvZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY3VzdG9tSnNDb2RlJykgJiYgKGUuY3VzdG9tSnNDb2RlID0gdC5jdXN0b21Kc0NvZGUpLCBudWxsICE9IHQudmlkZW9RdWFsaXR5ICYmIHQuaGFzT3duUHJvcGVydHkoJ3ZpZGVvUXVhbGl0eScpICYmIChlLnZpZGVvUXVhbGl0eSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9WaWRlb1F1YWxpdHlbdC52aWRlb1F1YWxpdHldIDogdC52aWRlb1F1YWxpdHkpLCBudWxsICE9IHQuaW5pdGlhbGl6YXRpb25TZXR0aW5nc0pzb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaW5pdGlhbGl6YXRpb25TZXR0aW5nc0pzb24nKSAmJiAoZS5pbml0aWFsaXphdGlvblNldHRpbmdzSnNvbiA9IHQuaW5pdGlhbGl6YXRpb25TZXR0aW5nc0pzb24pLCBudWxsICE9IHQuYWRTa2lwcGFiaWxpdHkgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRTa2lwcGFiaWxpdHknKSAmJiAoZS5hZFNraXBwYWJpbGl0eSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9QbGF5ZXJBZFNraXBwYWJpbGl0eVt0LmFkU2tpcHBhYmlsaXR5XSA6IHQuYWRTa2lwcGFiaWxpdHkpLCBudWxsICE9IHQuc2tpcEFkQWZ0ZXIgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc2tpcEFkQWZ0ZXInKSAmJiAoZS5za2lwQWRBZnRlciA9IHQuc2tpcEFkQWZ0ZXIpLCB0LmFkQnJlYWtzICYmIHQuYWRCcmVha3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkQnJlYWtzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5hZEJyZWFrcy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkQnJlYWtzW3NdID0gYy5Qcm90b0FkQnJlYWsudG9PYmplY3QodC5hZEJyZWFrc1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5hbWF6b25UYW1TbG90SWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYW1hem9uVGFtU2xvdElkJykgJiYgKGUuYW1hem9uVGFtU2xvdElkID0gdC5hbWF6b25UYW1TbG90SWQpLCBudWxsICE9IHQubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50ICYmIHQuaGFzT3duUHJvcGVydHkoJ21pZFJvbGxPbmx5T25Mb25nQ29udGVudCcpICYmIChlLm1pZFJvbGxPbmx5T25Mb25nQ29udGVudCA9IHQubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50KSwgbnVsbCAhPSB0LmxpbWl0Q2xpZW50U2lkZUFwaVVzZSAmJiB0Lmhhc093blByb3BlcnR5KCdsaW1pdENsaWVudFNpZGVBcGlVc2UnKSAmJiAoZS5saW1pdENsaWVudFNpZGVBcGlVc2UgPSB0LmxpbWl0Q2xpZW50U2lkZUFwaVVzZSksIG51bGwgIT0gdC5hYlRlc3RJZCAmJiB0Lmhhc093blByb3BlcnR5KCdhYlRlc3RJZCcpICYmIChlLmFiVGVzdElkID0gdC5hYlRlc3RJZCksIG51bGwgIT0gdC5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuJykgJiYgKGUuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuID0gdC5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9FbGVtZW50c1Jlc3BvbnNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXJzID0gW10sIHRoaXMubGluZUl0ZW1zID0gW10sIHRoaXMuY29va2llU3luY1VybHMgPSB7fSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuZXJyb3JNZXNzYWdlID0gJycsIHQucHJvdG90eXBlLnBsYXllcnMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLmJyb3dzZXIgPSBudWxsLCB0LnByb3RvdHlwZS5nZW9Mb2NhdGlvbiA9IG51bGwsIHQucHJvdG90eXBlLmxpbmVJdGVtcyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuY29va2llU3luY1VybHMgPSBvLmVtcHR5T2JqZWN0LCB0LnByb3RvdHlwZS5leHBsb3JhdGlvbk1vZGUgPSAhMSwgdC5wcm90b3R5cGUuc3VwcGx5Q2hhaW4gPSBudWxsLCB0LnByb3RvdHlwZS5zZWNvbmRMZXZlbERvbWFpbiA9ICcnLCB0LnByb3RvdHlwZS51c2VySW5mb3JtYXRpb24gPSBudWxsLCB0LnByb3RvdHlwZS5zZXJ2ZXJBYjAgPSAwLCB0LnByb3RvdHlwZS5zZXJ2ZXJBYjEgPSAwLCB0LnByb3RvdHlwZS5pc1Nlb1RyYWZmaWMgPSAhMSwgdC5wcm90b3R5cGUuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQgPSAhMSwgdC5wcm90b3R5cGUucHVibGlzaGVyTmV0d29ya0NvZGUgPSAwLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlLCBzLCBuID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHIgPSBuZXcgYy5Qcm90b0VsZW1lbnRzUmVzcG9uc2UoKTsgdC5wb3MgPCBuOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5lcnJvck1lc3NhZ2UgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnBsYXllcnMgJiYgci5wbGF5ZXJzLmxlbmd0aCB8fCAoci5wbGF5ZXJzID0gW10pLCByLnBsYXllcnMucHVzaChjLlByb3RvRWxlbWVudHMuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5icm93c2VyID0gYy5Ccm93c2VyLmRlY29kZSh0LCB0LnVpbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZW9Mb2NhdGlvbiA9IGMuR2VvTG9jYXRpb24uZGVjb2RlKHQsIHQudWludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxpbmVJdGVtcyAmJiByLmxpbmVJdGVtcy5sZW5ndGggfHwgKHIubGluZUl0ZW1zID0gW10pLCByLmxpbmVJdGVtcy5wdXNoKGMuUHJvdG9MaW5lSXRlbS5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNvb2tpZVN5bmNVcmxzID09PSBvLmVtcHR5T2JqZWN0ICYmIChyLmNvb2tpZVN5bmNVcmxzID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdC51aW50MzIoKSArIHQucG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDAsIHMgPSAnJzsgdC5wb3MgPCB1OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobCA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNvb2tpZVN5bmNVcmxzW2VdID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5leHBsb3JhdGlvbk1vZGUgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zdXBwbHlDaGFpbiA9IGMuUHJvdG9TdXBwbHlDaGFpbi5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2Vjb25kTGV2ZWxEb21haW4gPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnVzZXJJbmZvcm1hdGlvbiA9IGMuUHJvdG9Vc2VySW5mb3JtYXRpb24uZGVjb2RlKHQsIHQudWludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNlcnZlckFiMCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZXJ2ZXJBYjEgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNTZW9UcmFmZmljID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdWJsaXNoZXJOZXR3b3JrQ29kZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKHMucGxheWVycyA9IFtdLCBzLmxpbmVJdGVtcyA9IFtdKSwgKGkub2JqZWN0cyB8fCBpLmRlZmF1bHRzKSAmJiAocy5jb29raWVTeW5jVXJscyA9IHt9KSwgaS5kZWZhdWx0cyAmJiAocy5lcnJvck1lc3NhZ2UgPSAnJywgcy5icm93c2VyID0gbnVsbCwgcy5nZW9Mb2NhdGlvbiA9IG51bGwsIHMuZXhwbG9yYXRpb25Nb2RlID0gITEsIHMuc3VwcGx5Q2hhaW4gPSBudWxsLCBzLnNlY29uZExldmVsRG9tYWluID0gJycsIHMudXNlckluZm9ybWF0aW9uID0gbnVsbCwgcy5zZXJ2ZXJBYjAgPSAwLCBzLnNlcnZlckFiMSA9IDAsIHMuaXNTZW9UcmFmZmljID0gITEsIHMuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQgPSAhMSwgcy5wdWJsaXNoZXJOZXR3b3JrQ29kZSA9IDApLCBudWxsICE9IHQuZXJyb3JNZXNzYWdlICYmIHQuaGFzT3duUHJvcGVydHkoJ2Vycm9yTWVzc2FnZScpICYmIChzLmVycm9yTWVzc2FnZSA9IHQuZXJyb3JNZXNzYWdlKSwgdC5wbGF5ZXJzICYmIHQucGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucGxheWVycyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB0LnBsYXllcnMubGVuZ3RoOyArK24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wbGF5ZXJzW25dID0gYy5Qcm90b0VsZW1lbnRzLnRvT2JqZWN0KHQucGxheWVyc1tuXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5icm93c2VyICYmIHQuaGFzT3duUHJvcGVydHkoJ2Jyb3dzZXInKSAmJiAocy5icm93c2VyID0gYy5Ccm93c2VyLnRvT2JqZWN0KHQuYnJvd3NlciwgaSkpLCBudWxsICE9IHQuZ2VvTG9jYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZ2VvTG9jYXRpb24nKSAmJiAocy5nZW9Mb2NhdGlvbiA9IGMuR2VvTG9jYXRpb24udG9PYmplY3QodC5nZW9Mb2NhdGlvbiwgaSkpLCB0LmxpbmVJdGVtcyAmJiB0LmxpbmVJdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGluZUl0ZW1zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgdC5saW5lSXRlbXMubGVuZ3RoOyArK24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5saW5lSXRlbXNbbl0gPSBjLlByb3RvTGluZUl0ZW0udG9PYmplY3QodC5saW5lSXRlbXNbbl0sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmNvb2tpZVN5bmNVcmxzICYmIChlID0gT2JqZWN0LmtleXModC5jb29raWVTeW5jVXJscykpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb29raWVTeW5jVXJscyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGUubGVuZ3RoOyArK24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb29raWVTeW5jVXJsc1tlW25dXSA9IHQuY29va2llU3luY1VybHNbZVtuXV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5leHBsb3JhdGlvbk1vZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZXhwbG9yYXRpb25Nb2RlJykgJiYgKHMuZXhwbG9yYXRpb25Nb2RlID0gdC5leHBsb3JhdGlvbk1vZGUpLCBudWxsICE9IHQuc3VwcGx5Q2hhaW4gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc3VwcGx5Q2hhaW4nKSAmJiAocy5zdXBwbHlDaGFpbiA9IGMuUHJvdG9TdXBwbHlDaGFpbi50b09iamVjdCh0LnN1cHBseUNoYWluLCBpKSksIG51bGwgIT0gdC5zZWNvbmRMZXZlbERvbWFpbiAmJiB0Lmhhc093blByb3BlcnR5KCdzZWNvbmRMZXZlbERvbWFpbicpICYmIChzLnNlY29uZExldmVsRG9tYWluID0gdC5zZWNvbmRMZXZlbERvbWFpbiksIG51bGwgIT0gdC51c2VySW5mb3JtYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgndXNlckluZm9ybWF0aW9uJykgJiYgKHMudXNlckluZm9ybWF0aW9uID0gYy5Qcm90b1VzZXJJbmZvcm1hdGlvbi50b09iamVjdCh0LnVzZXJJbmZvcm1hdGlvbiwgaSkpLCBudWxsICE9IHQuc2VydmVyQWIwICYmIHQuaGFzT3duUHJvcGVydHkoJ3NlcnZlckFiMCcpICYmIChzLnNlcnZlckFiMCA9IHQuc2VydmVyQWIwKSwgbnVsbCAhPSB0LnNlcnZlckFiMSAmJiB0Lmhhc093blByb3BlcnR5KCdzZXJ2ZXJBYjEnKSAmJiAocy5zZXJ2ZXJBYjEgPSB0LnNlcnZlckFiMSksIG51bGwgIT0gdC5pc1Nlb1RyYWZmaWMgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnaXNTZW9UcmFmZmljJykgJiYgKHMuaXNTZW9UcmFmZmljID0gdC5pc1Nlb1RyYWZmaWMpLCBudWxsICE9IHQuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQnKSAmJiAocy5iYW5kd2lkdGhMb2dnaW5nRW5hYmxlZCA9IHQuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQpLCBudWxsICE9IHQucHVibGlzaGVyTmV0d29ya0NvZGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncHVibGlzaGVyTmV0d29ya0NvZGUnKSAmJiAocy5wdWJsaXNoZXJOZXR3b3JrQ29kZSA9IHQucHVibGlzaGVyTmV0d29ya0NvZGUpLCBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtUYXJnZXRpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5hZFJvbGxUeXBlID0gMCwgdC5wcm90b3R5cGUuYWRCcmVha1R5cGVFbnVtID0gMSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtUYXJnZXRpbmcoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZFJvbGxUeXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRCcmVha1R5cGVFbnVtID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUuYWRSb2xsVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdOb25lJyA6IDAsIGUuYWRCcmVha1R5cGVFbnVtID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0FsbCcgOiAxKSwgbnVsbCAhPSB0LmFkUm9sbFR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRSb2xsVHlwZScpICYmIChlLmFkUm9sbFR5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQWRCcmVha1R5cGVFbnVtW3QuYWRSb2xsVHlwZV0gOiB0LmFkUm9sbFR5cGUpLCBudWxsICE9IHQuYWRCcmVha1R5cGVFbnVtICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkQnJlYWtUeXBlRW51bScpICYmIChlLmFkQnJlYWtUeXBlRW51bSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtUeXBlRW51bVt0LmFkQnJlYWtUeXBlRW51bV0gOiB0LmFkQnJlYWtUeXBlRW51bSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQWRQb2RUYXJnZXRpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkU2xvdFBvc2l0aW9ucyA9IFtdLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS50YXJnZXRpbmdUeXBlID0gMCwgdC5wcm90b3R5cGUuYWRTbG90VGFyZ2V0aW5nVHlwZSA9IDEsIHQucHJvdG90eXBlLmFkU2xvdFBvc2l0aW9ucyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9MaW5lSXRlbUFkUG9kVGFyZ2V0aW5nKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudGFyZ2V0aW5nVHlwZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkU2xvdFRhcmdldGluZ1R5cGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuYWRTbG90UG9zaXRpb25zICYmIHMuYWRTbG90UG9zaXRpb25zLmxlbmd0aCB8fCAocy5hZFNsb3RQb3NpdGlvbnMgPSBbXSksIDIgPT0gKDcgJiBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHQudWludDMyKCkgKyB0LnBvczsgdC5wb3MgPCByOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRTbG90UG9zaXRpb25zLnB1c2godC5pbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRTbG90UG9zaXRpb25zLnB1c2godC5pbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKGUuYWRTbG90UG9zaXRpb25zID0gW10pLCBpLmRlZmF1bHRzICYmIChlLnRhcmdldGluZ1R5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnT25seScgOiAwLCBlLmFkU2xvdFRhcmdldGluZ1R5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnU3BlY2lmaWNTbG90cycgOiAxKSwgbnVsbCAhPSB0LnRhcmdldGluZ1R5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndGFyZ2V0aW5nVHlwZScpICYmIChlLnRhcmdldGluZ1R5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvTGluZUl0ZW1UYXJnZXRpbmdUeXBlRW51bVt0LnRhcmdldGluZ1R5cGVdIDogdC50YXJnZXRpbmdUeXBlKSwgbnVsbCAhPSB0LmFkU2xvdFRhcmdldGluZ1R5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRTbG90VGFyZ2V0aW5nVHlwZScpICYmIChlLmFkU2xvdFRhcmdldGluZ1R5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvTGluZUl0ZW1BZFNsb3RUYXJnZXRpbmdUeXBlRW51bVt0LmFkU2xvdFRhcmdldGluZ1R5cGVdIDogdC5hZFNsb3RUYXJnZXRpbmdUeXBlKSwgdC5hZFNsb3RQb3NpdGlvbnMgJiYgdC5hZFNsb3RQb3NpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkU2xvdFBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LmFkU2xvdFBvc2l0aW9ucy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkU2xvdFBvc2l0aW9uc1tzXSA9IHQuYWRTbG90UG9zaXRpb25zW3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRCcmVha1RhcmdldGluZyA9IFtdLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5hZEJyZWFrVGFyZ2V0aW5nID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5hZFBvZFRhcmdldGluZyA9IG51bGwsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvTGluZUl0ZW1BZEJyZWFrU2V0dGluZ3MoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZEJyZWFrVGFyZ2V0aW5nICYmIHMuYWRCcmVha1RhcmdldGluZy5sZW5ndGggfHwgKHMuYWRCcmVha1RhcmdldGluZyA9IFtdKSwgcy5hZEJyZWFrVGFyZ2V0aW5nLnB1c2goYy5Qcm90b0xpbmVJdGVtQWRCcmVha1RhcmdldGluZy5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRQb2RUYXJnZXRpbmcgPSBjLlByb3RvTGluZUl0ZW1BZFBvZFRhcmdldGluZy5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLmFkQnJlYWtUYXJnZXRpbmcgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUuYWRQb2RUYXJnZXRpbmcgPSBudWxsKSwgdC5hZEJyZWFrVGFyZ2V0aW5nICYmIHQuYWRCcmVha1RhcmdldGluZy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWRCcmVha1RhcmdldGluZyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LmFkQnJlYWtUYXJnZXRpbmcubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZEJyZWFrVGFyZ2V0aW5nW3NdID0gYy5Qcm90b0xpbmVJdGVtQWRCcmVha1RhcmdldGluZy50b09iamVjdCh0LmFkQnJlYWtUYXJnZXRpbmdbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQuYWRQb2RUYXJnZXRpbmcgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnYWRQb2RUYXJnZXRpbmcnKSAmJiAoZS5hZFBvZFRhcmdldGluZyA9IGMuUHJvdG9MaW5lSXRlbUFkUG9kVGFyZ2V0aW5nLnRvT2JqZWN0KHQuYWRQb2RUYXJnZXRpbmcsIGkpKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTGluZUl0ZW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRyYWNrZXJzID0gW10sIHRoaXMucmVuZGl0aW9ucyA9IFtdLCB0aGlzLmZsb29yUHJpY2VzID0gW10sIHRoaXMuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBbXSwgdGhpcy5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnB1Ymxpc2hlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSAnJywgdC5wcm90b3R5cGUuYWRUYWcgPSAnJywgdC5wcm90b3R5cGUuY3JlYXRpdmVUeXBlID0gMCwgdC5wcm90b3R5cGUuc291bmQgPSAhMSwgdC5wcm90b3R5cGUudmlld2FiaWxpdHkgPSAhMSwgdC5wcm90b3R5cGUuaW1wcmVzc2lvblRpbWVTcGVudCA9IDAsIHQucHJvdG90eXBlLnZlbmRvcklkID0gJycsIHQucHJvdG90eXBlLnRyYWNrZXJzID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5kdXJhdGlvbiA9IDAsIHQucHJvdG90eXBlLnJlbmRpdGlvbnMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLm1lZGlhQ3JlYXRpdmVJZCA9ICcnLCB0LnByb3RvdHlwZS5pZ25vcmVGaWxsZWRSZXF1ZXN0cyA9ICExLCB0LnByb3RvdHlwZS5yZXF1ZXN0Q2FwID0gMywgdC5wcm90b3R5cGUuaW1wcmVzc2lvbkNhcCA9IDAsIHQucHJvdG90eXBlLnN1Y2Nlc3NSYXRlID0gMCwgdC5wcm90b3R5cGUubGluZUl0ZW1Qcmlvcml0eSA9IDAsIHQucHJvdG90eXBlLmhlYWRlckJpZGRlckJpZHMgPSAnJywgdC5wcm90b3R5cGUuaGVhZGVyQmlkZGVyVGltZW91dCA9IDAsIHQucHJvdG90eXBlLm1lZGlhQ3JlYXRpdmVDbGlja1VybCA9ICcnLCB0LnByb3RvdHlwZS5yZXNldFJlcXVlc3RzQ2FwVGltZSA9IDYwLCB0LnByb3RvdHlwZS5yZXNldEltcHJlc3Npb25zQ2FwVGltZSA9IDYwLCB0LnByb3RvdHlwZS5yZXNldENhcFR5cGUgPSAwLCB0LnByb3RvdHlwZS5jcmVhdGl2ZUhsc0ZpbGVOYW1lID0gJycsIHQucHJvdG90eXBlLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSAwLCB0LnByb3RvdHlwZS5za2lwTW9kZSA9IDAsIHQucHJvdG90eXBlLm1lZGlhSWRUYXJnZXRpbmcgPSBudWxsLCB0LnByb3RvdHlwZS5tZWRpYUtleXdvcmRzVGFyZ2V0aW5nID0gbnVsbCwgdC5wcm90b3R5cGUubWVkaWFMYW5ndWFnZVRhcmdldGluZyA9IG51bGwsIHQucHJvdG90eXBlLmFkVHlwZSA9IDAsIHQucHJvdG90eXBlLm92ZXJsYXlUaW1lID0gMzAsIHQucHJvdG90eXBlLmZsb29yUHJpY2UgPSAwLCB0LnByb3RvdHlwZS5hZEJyZWFrU2V0dGluZ3MgPSBudWxsLCB0LnByb3RvdHlwZS5mbG9vclByaWNlcyA9IG8uZW1wdHlBcnJheSwgdC5wcm90b3R5cGUuYmlkUmF0ZSA9IDAsIHQucHJvdG90eXBlLnBhdXNlQWRPdXRPZlZpZXcgPSAwLCB0LnByb3RvdHlwZS5tb2F0VHJhY2tpbmdFbmFibGVkID0gITEsIHQucHJvdG90eXBlLmNueENyZWF0aXZlSWQgPSAnJywgdC5wcm90b3R5cGUuYmxvY2tlZERvbWFpbnNSZXZpc2lvbk51bWJlciA9IDAsIHQucHJvdG90eXBlLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gby5lbXB0eUFycmF5LCB0LnByb3RvdHlwZS5hbWF6b25EZWFsSWQgPSAnJywgdC5wcm90b3R5cGUucGxheWVyU2l6ZVRhcmdldGluZ3MgPSBudWxsLCB0LnByb3RvdHlwZS5wbGF5ZXJTaXplID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvTGluZUl0ZW0oKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdWJsaXNoZXJMaW5lSXRlbUlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkVGFnID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNyZWF0aXZlVHlwZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNvdW5kID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy52aWV3YWJpbGl0eSA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaW1wcmVzc2lvblRpbWVTcGVudCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy52ZW5kb3JJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHJhY2tlcnMgJiYgcy50cmFja2Vycy5sZW5ndGggfHwgKHMudHJhY2tlcnMgPSBbXSksIHMudHJhY2tlcnMucHVzaChjLkNyZWF0aXZlVHJhY2tlclZpZXdNb2RlbC5kZWNvZGUodCwgdC51aW50MzIoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmR1cmF0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlbmRpdGlvbnMgJiYgcy5yZW5kaXRpb25zLmxlbmd0aCB8fCAocy5yZW5kaXRpb25zID0gW10pLCBzLnJlbmRpdGlvbnMucHVzaChjLlByb3RvUmVuZGl0aW9uLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFDcmVhdGl2ZUlkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pZ25vcmVGaWxsZWRSZXF1ZXN0cyA9IHQuYm9vbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnJlcXVlc3RDYXAgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaW1wcmVzc2lvbkNhcCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdWNjZXNzUmF0ZSA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGluZUl0ZW1Qcmlvcml0eSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWFkZXJCaWRkZXJCaWRzID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWFkZXJCaWRkZXJUaW1lb3V0ID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1lZGlhQ3JlYXRpdmVDbGlja1VybCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVzZXRSZXF1ZXN0c0NhcFRpbWUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVzZXRJbXByZXNzaW9uc0NhcFRpbWUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVzZXRDYXBUeXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNyZWF0aXZlSGxzRmlsZU5hbWUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyODoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2tpcE1vZGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFJZFRhcmdldGluZyA9IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbC5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFLZXl3b3Jkc1RhcmdldGluZyA9IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbC5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWVkaWFMYW5ndWFnZVRhcmdldGluZyA9IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbC5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRUeXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm92ZXJsYXlUaW1lID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb29yUHJpY2UgPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkQnJlYWtTZXR0aW5ncyA9IGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtTZXR0aW5ncy5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmZsb29yUHJpY2VzICYmIHMuZmxvb3JQcmljZXMubGVuZ3RoIHx8IChzLmZsb29yUHJpY2VzID0gW10pLCAyID09ICg3ICYgbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LnVpbnQzMigpICsgdC5wb3M7IHQucG9zIDwgcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb29yUHJpY2VzLnB1c2godC5kb3VibGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmZsb29yUHJpY2VzLnB1c2godC5kb3VibGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmlkUmF0ZSA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucGF1c2VBZE91dE9mVmlldyA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tb2F0VHJhY2tpbmdFbmFibGVkID0gdC5ib29sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY254Q3JlYXRpdmVJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYmxvY2tlZERvbWFpbnNSZXZpc2lvbk51bWJlciA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZyAmJiBzLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nLmxlbmd0aCB8fCAocy5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZyA9IFtdKSwgcy5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZy5wdXNoKGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nQ2FzZU1vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZyAmJiBzLnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoIHx8IChzLnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcgPSBbXSksIHMucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZy5wdXNoKGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nQ2FzZU1vZGVsLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ4OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYW1hem9uRGVhbElkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wbGF5ZXJTaXplVGFyZ2V0aW5ncyA9IGMuUHJvdG9QbGF5ZXJTaXplVGFyZ2V0aW5ncy5kZWNvZGUodCwgdC51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnBsYXllclNpemUgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS50cmFja2VycyA9IFtdLCBlLnJlbmRpdGlvbnMgPSBbXSwgZS5mbG9vclByaWNlcyA9IFtdLCBlLmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW10sIGUucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZyA9IFtdKSwgaS5kZWZhdWx0cyAmJiAoZS5wdWJsaXNoZXJMaW5lSXRlbUlkID0gJycsIGUuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgPSAnJywgZS5hZFRhZyA9ICcnLCBlLmNyZWF0aXZlVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdUaGlyZFBhcnR5JyA6IDAsIGUuc291bmQgPSAhMSwgZS52aWV3YWJpbGl0eSA9ICExLCBlLmltcHJlc3Npb25UaW1lU3BlbnQgPSAwLCBlLnZlbmRvcklkID0gJycsIGUuZHVyYXRpb24gPSAwLCBlLm1lZGlhQ3JlYXRpdmVJZCA9ICcnLCBlLmlnbm9yZUZpbGxlZFJlcXVlc3RzID0gITEsIGUucmVxdWVzdENhcCA9IDMsIGUuaW1wcmVzc2lvbkNhcCA9IDAsIGUuc3VjY2Vzc1JhdGUgPSAwLCBlLmxpbmVJdGVtUHJpb3JpdHkgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnSG91c2UnIDogMCwgZS5oZWFkZXJCaWRkZXJCaWRzID0gJycsIGUuaGVhZGVyQmlkZGVyVGltZW91dCA9IDAsIGUubWVkaWFDcmVhdGl2ZUNsaWNrVXJsID0gJycsIGUucmVzZXRSZXF1ZXN0c0NhcFRpbWUgPSA2MCwgZS5yZXNldEltcHJlc3Npb25zQ2FwVGltZSA9IDYwLCBlLnJlc2V0Q2FwVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdUaW1lQ2FwcGluZycgOiAwLCBlLmNyZWF0aXZlSGxzRmlsZU5hbWUgPSAnJywgZS50aW1lQmV0d2VlblJlcXVlc3RzID0gMCwgZS5za2lwTW9kZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdJZkxvbmdlclRoYW4zMVNlYycgOiAwLCBlLm1lZGlhSWRUYXJnZXRpbmcgPSBudWxsLCBlLm1lZGlhS2V5d29yZHNUYXJnZXRpbmcgPSBudWxsLCBlLm1lZGlhTGFuZ3VhZ2VUYXJnZXRpbmcgPSBudWxsLCBlLmFkVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdWaWRlbycgOiAwLCBlLm92ZXJsYXlUaW1lID0gMzAsIGUuZmxvb3JQcmljZSA9IDAsIGUuYWRCcmVha1NldHRpbmdzID0gbnVsbCwgZS5iaWRSYXRlID0gMCwgZS5wYXVzZUFkT3V0T2ZWaWV3ID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0RlZmF1bHQnIDogMCwgZS5tb2F0VHJhY2tpbmdFbmFibGVkID0gITEsIGUuY254Q3JlYXRpdmVJZCA9ICcnLCBlLmJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXIgPSAwLCBlLnBsYXllclNpemVUYXJnZXRpbmdzID0gbnVsbCwgZS5hbWF6b25EZWFsSWQgPSAnJywgZS5wbGF5ZXJTaXplID0gJycpLCBudWxsICE9IHQucHVibGlzaGVyTGluZUl0ZW1JZCAmJiB0Lmhhc093blByb3BlcnR5KCdwdWJsaXNoZXJMaW5lSXRlbUlkJykgJiYgKGUucHVibGlzaGVyTGluZUl0ZW1JZCA9IHQucHVibGlzaGVyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiB0Lmhhc093blByb3BlcnR5KCdhZHZlcnRpc2VyTGluZUl0ZW1JZCcpICYmIChlLmFkdmVydGlzZXJMaW5lSXRlbUlkID0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCksIG51bGwgIT0gdC5hZFRhZyAmJiB0Lmhhc093blByb3BlcnR5KCdhZFRhZycpICYmIChlLmFkVGFnID0gdC5hZFRhZyksIG51bGwgIT0gdC5jcmVhdGl2ZVR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY3JlYXRpdmVUeXBlJykgJiYgKGUuY3JlYXRpdmVUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0NyZWF0aXZlVHlwZUVudW1bdC5jcmVhdGl2ZVR5cGVdIDogdC5jcmVhdGl2ZVR5cGUpLCBudWxsICE9IHQuc291bmQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc291bmQnKSAmJiAoZS5zb3VuZCA9IHQuc291bmQpLCBudWxsICE9IHQudmlld2FiaWxpdHkgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndmlld2FiaWxpdHknKSAmJiAoZS52aWV3YWJpbGl0eSA9IHQudmlld2FiaWxpdHkpLCBudWxsICE9IHQuaW1wcmVzc2lvblRpbWVTcGVudCAmJiB0Lmhhc093blByb3BlcnR5KCdpbXByZXNzaW9uVGltZVNwZW50JykgJiYgKGUuaW1wcmVzc2lvblRpbWVTcGVudCA9IHQuaW1wcmVzc2lvblRpbWVTcGVudCksIG51bGwgIT0gdC52ZW5kb3JJZCAmJiB0Lmhhc093blByb3BlcnR5KCd2ZW5kb3JJZCcpICYmIChlLnZlbmRvcklkID0gdC52ZW5kb3JJZCksIHQudHJhY2tlcnMgJiYgdC50cmFja2Vycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHJhY2tlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgdC50cmFja2Vycy5sZW5ndGg7ICsrcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRyYWNrZXJzW3NdID0gYy5DcmVhdGl2ZVRyYWNrZXJWaWV3TW9kZWwudG9PYmplY3QodC50cmFja2Vyc1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdC5kdXJhdGlvbiAmJiB0Lmhhc093blByb3BlcnR5KCdkdXJhdGlvbicpICYmIChlLmR1cmF0aW9uID0gdC5kdXJhdGlvbiksIHQucmVuZGl0aW9ucyAmJiB0LnJlbmRpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbmRpdGlvbnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IDA7IHMgPCB0LnJlbmRpdGlvbnMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW5kaXRpb25zW3NdID0gYy5Qcm90b1JlbmRpdGlvbi50b09iamVjdCh0LnJlbmRpdGlvbnNbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQubWVkaWFDcmVhdGl2ZUlkICYmIHQuaGFzT3duUHJvcGVydHkoJ21lZGlhQ3JlYXRpdmVJZCcpICYmIChlLm1lZGlhQ3JlYXRpdmVJZCA9IHQubWVkaWFDcmVhdGl2ZUlkKSwgbnVsbCAhPSB0Lmlnbm9yZUZpbGxlZFJlcXVlc3RzICYmIHQuaGFzT3duUHJvcGVydHkoJ2lnbm9yZUZpbGxlZFJlcXVlc3RzJykgJiYgKGUuaWdub3JlRmlsbGVkUmVxdWVzdHMgPSB0Lmlnbm9yZUZpbGxlZFJlcXVlc3RzKSwgbnVsbCAhPSB0LnJlcXVlc3RDYXAgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncmVxdWVzdENhcCcpICYmIChlLnJlcXVlc3RDYXAgPSB0LnJlcXVlc3RDYXApLCBudWxsICE9IHQuaW1wcmVzc2lvbkNhcCAmJiB0Lmhhc093blByb3BlcnR5KCdpbXByZXNzaW9uQ2FwJykgJiYgKGUuaW1wcmVzc2lvbkNhcCA9IHQuaW1wcmVzc2lvbkNhcCksIG51bGwgIT0gdC5zdWNjZXNzUmF0ZSAmJiB0Lmhhc093blByb3BlcnR5KCdzdWNjZXNzUmF0ZScpICYmIChlLnN1Y2Nlc3NSYXRlID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LnN1Y2Nlc3NSYXRlKSA/IFN0cmluZyh0LnN1Y2Nlc3NSYXRlKSA6IHQuc3VjY2Vzc1JhdGUpLCBudWxsICE9IHQubGluZUl0ZW1Qcmlvcml0eSAmJiB0Lmhhc093blByb3BlcnR5KCdsaW5lSXRlbVByaW9yaXR5JykgJiYgKGUubGluZUl0ZW1Qcmlvcml0eSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbVByaW9yaXR5W3QubGluZUl0ZW1Qcmlvcml0eV0gOiB0LmxpbmVJdGVtUHJpb3JpdHkpLCBudWxsICE9IHQuaGVhZGVyQmlkZGVyQmlkcyAmJiB0Lmhhc093blByb3BlcnR5KCdoZWFkZXJCaWRkZXJCaWRzJykgJiYgKGUuaGVhZGVyQmlkZGVyQmlkcyA9IHQuaGVhZGVyQmlkZGVyQmlkcyksIG51bGwgIT0gdC5oZWFkZXJCaWRkZXJUaW1lb3V0ICYmIHQuaGFzT3duUHJvcGVydHkoJ2hlYWRlckJpZGRlclRpbWVvdXQnKSAmJiAoZS5oZWFkZXJCaWRkZXJUaW1lb3V0ID0gdC5oZWFkZXJCaWRkZXJUaW1lb3V0KSwgbnVsbCAhPSB0Lm1lZGlhQ3JlYXRpdmVDbGlja1VybCAmJiB0Lmhhc093blByb3BlcnR5KCdtZWRpYUNyZWF0aXZlQ2xpY2tVcmwnKSAmJiAoZS5tZWRpYUNyZWF0aXZlQ2xpY2tVcmwgPSB0Lm1lZGlhQ3JlYXRpdmVDbGlja1VybCksIG51bGwgIT0gdC5yZXNldFJlcXVlc3RzQ2FwVGltZSAmJiB0Lmhhc093blByb3BlcnR5KCdyZXNldFJlcXVlc3RzQ2FwVGltZScpICYmIChlLnJlc2V0UmVxdWVzdHNDYXBUaW1lID0gdC5yZXNldFJlcXVlc3RzQ2FwVGltZSksIG51bGwgIT0gdC5yZXNldEltcHJlc3Npb25zQ2FwVGltZSAmJiB0Lmhhc093blByb3BlcnR5KCdyZXNldEltcHJlc3Npb25zQ2FwVGltZScpICYmIChlLnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lID0gdC5yZXNldEltcHJlc3Npb25zQ2FwVGltZSksIG51bGwgIT0gdC5yZXNldENhcFR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncmVzZXRDYXBUeXBlJykgJiYgKGUucmVzZXRDYXBUeXBlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1Jlc2V0Q2FwVHlwZUVudW1bdC5yZXNldENhcFR5cGVdIDogdC5yZXNldENhcFR5cGUpLCBudWxsICE9IHQuY3JlYXRpdmVIbHNGaWxlTmFtZSAmJiB0Lmhhc093blByb3BlcnR5KCdjcmVhdGl2ZUhsc0ZpbGVOYW1lJykgJiYgKGUuY3JlYXRpdmVIbHNGaWxlTmFtZSA9IHQuY3JlYXRpdmVIbHNGaWxlTmFtZSksIG51bGwgIT0gdC50aW1lQmV0d2VlblJlcXVlc3RzICYmIHQuaGFzT3duUHJvcGVydHkoJ3RpbWVCZXR3ZWVuUmVxdWVzdHMnKSAmJiAoZS50aW1lQmV0d2VlblJlcXVlc3RzID0gdC50aW1lQmV0d2VlblJlcXVlc3RzKSwgbnVsbCAhPSB0LnNraXBNb2RlICYmIHQuaGFzT3duUHJvcGVydHkoJ3NraXBNb2RlJykgJiYgKGUuc2tpcE1vZGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQWRTa2lwTW9kZVt0LnNraXBNb2RlXSA6IHQuc2tpcE1vZGUpLCBudWxsICE9IHQubWVkaWFJZFRhcmdldGluZyAmJiB0Lmhhc093blByb3BlcnR5KCdtZWRpYUlkVGFyZ2V0aW5nJykgJiYgKGUubWVkaWFJZFRhcmdldGluZyA9IGMuUHJvdG9UYXJnZXRpbmdDaG9pY2VNb2RlbC50b09iamVjdCh0Lm1lZGlhSWRUYXJnZXRpbmcsIGkpKSwgbnVsbCAhPSB0Lm1lZGlhS2V5d29yZHNUYXJnZXRpbmcgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFLZXl3b3Jkc1RhcmdldGluZycpICYmIChlLm1lZGlhS2V5d29yZHNUYXJnZXRpbmcgPSBjLlByb3RvVGFyZ2V0aW5nQ2hvaWNlTW9kZWwudG9PYmplY3QodC5tZWRpYUtleXdvcmRzVGFyZ2V0aW5nLCBpKSksIG51bGwgIT0gdC5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nICYmIHQuaGFzT3duUHJvcGVydHkoJ21lZGlhTGFuZ3VhZ2VUYXJnZXRpbmcnKSAmJiAoZS5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nID0gYy5Qcm90b1RhcmdldGluZ0Nob2ljZU1vZGVsLnRvT2JqZWN0KHQubWVkaWFMYW5ndWFnZVRhcmdldGluZywgaSkpLCBudWxsICE9IHQuYWRUeXBlICYmIHQuaGFzT3duUHJvcGVydHkoJ2FkVHlwZScpICYmIChlLmFkVHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9BZFR5cGVbdC5hZFR5cGVdIDogdC5hZFR5cGUpLCBudWxsICE9IHQub3ZlcmxheVRpbWUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnb3ZlcmxheVRpbWUnKSAmJiAoZS5vdmVybGF5VGltZSA9IHQub3ZlcmxheVRpbWUpLCBudWxsICE9IHQuZmxvb3JQcmljZSAmJiB0Lmhhc093blByb3BlcnR5KCdmbG9vclByaWNlJykgJiYgKGUuZmxvb3JQcmljZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5mbG9vclByaWNlKSA/IFN0cmluZyh0LmZsb29yUHJpY2UpIDogdC5mbG9vclByaWNlKSwgbnVsbCAhPSB0LmFkQnJlYWtTZXR0aW5ncyAmJiB0Lmhhc093blByb3BlcnR5KCdhZEJyZWFrU2V0dGluZ3MnKSAmJiAoZS5hZEJyZWFrU2V0dGluZ3MgPSBjLlByb3RvTGluZUl0ZW1BZEJyZWFrU2V0dGluZ3MudG9PYmplY3QodC5hZEJyZWFrU2V0dGluZ3MsIGkpKSwgdC5mbG9vclByaWNlcyAmJiB0LmZsb29yUHJpY2VzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mbG9vclByaWNlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHQuZmxvb3JQcmljZXMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mbG9vclByaWNlc1tzXSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5mbG9vclByaWNlc1tzXSkgPyBTdHJpbmcodC5mbG9vclByaWNlc1tzXSkgOiB0LmZsb29yUHJpY2VzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHQuYmlkUmF0ZSAmJiB0Lmhhc093blByb3BlcnR5KCdiaWRSYXRlJykgJiYgKGUuYmlkUmF0ZSA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5iaWRSYXRlKSA/IFN0cmluZyh0LmJpZFJhdGUpIDogdC5iaWRSYXRlKSwgbnVsbCAhPSB0LnBhdXNlQWRPdXRPZlZpZXcgJiYgdC5oYXNPd25Qcm9wZXJ0eSgncGF1c2VBZE91dE9mVmlldycpICYmIChlLnBhdXNlQWRPdXRPZlZpZXcgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvTGluZUl0ZW1QYXVzZUFkT3V0T2ZWaWV3RW51bVt0LnBhdXNlQWRPdXRPZlZpZXddIDogdC5wYXVzZUFkT3V0T2ZWaWV3KSwgbnVsbCAhPSB0Lm1vYXRUcmFja2luZ0VuYWJsZWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbW9hdFRyYWNraW5nRW5hYmxlZCcpICYmIChlLm1vYXRUcmFja2luZ0VuYWJsZWQgPSB0Lm1vYXRUcmFja2luZ0VuYWJsZWQpLCBudWxsICE9IHQuY254Q3JlYXRpdmVJZCAmJiB0Lmhhc093blByb3BlcnR5KCdjbnhDcmVhdGl2ZUlkJykgJiYgKGUuY254Q3JlYXRpdmVJZCA9IHQuY254Q3JlYXRpdmVJZCksIG51bGwgIT0gdC5ibG9ja2VkRG9tYWluc1JldmlzaW9uTnVtYmVyICYmIHQuaGFzT3duUHJvcGVydHkoJ2Jsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXInKSAmJiAoZS5ibG9ja2VkRG9tYWluc1JldmlzaW9uTnVtYmVyID0gdC5ibG9ja2VkRG9tYWluc1JldmlzaW9uTnVtYmVyKSwgdC5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZyAmJiB0LmFkdmVydGlzZXJDb250ZXh0dWFsVGFyZ2V0aW5nLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IHQuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmcubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZHZlcnRpc2VyQ29udGV4dHVhbFRhcmdldGluZ1tzXSA9IGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nQ2FzZU1vZGVsLnRvT2JqZWN0KHQuYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmdbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnB1Ymxpc2hlckNvbnRleHR1YWxUYXJnZXRpbmcgJiYgdC5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgdC5wdWJsaXNoZXJDb250ZXh0dWFsVGFyZ2V0aW5nLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZ1tzXSA9IGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nQ2FzZU1vZGVsLnRvT2JqZWN0KHQucHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZ1tzXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gdC5wbGF5ZXJTaXplVGFyZ2V0aW5ncyAmJiB0Lmhhc093blByb3BlcnR5KCdwbGF5ZXJTaXplVGFyZ2V0aW5ncycpICYmIChlLnBsYXllclNpemVUYXJnZXRpbmdzID0gYy5Qcm90b1BsYXllclNpemVUYXJnZXRpbmdzLnRvT2JqZWN0KHQucGxheWVyU2l6ZVRhcmdldGluZ3MsIGkpKSwgbnVsbCAhPSB0LmFtYXpvbkRlYWxJZCAmJiB0Lmhhc093blByb3BlcnR5KCdhbWF6b25EZWFsSWQnKSAmJiAoZS5hbWF6b25EZWFsSWQgPSB0LmFtYXpvbkRlYWxJZCksIG51bGwgIT0gdC5wbGF5ZXJTaXplICYmIHQuaGFzT3duUHJvcGVydHkoJ3BsYXllclNpemUnKSAmJiAoZS5wbGF5ZXJTaXplID0gdC5wbGF5ZXJTaXplKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvVGFyZ2V0aW5nQ2hvaWNlTW9kZWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNob2ljZUNyaXRlcmlhID0gMCwgdC5wcm90b3R5cGUuaXRlbXMgPSBvLmVtcHR5QXJyYXksIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvVGFyZ2V0aW5nQ2hvaWNlTW9kZWwoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jaG9pY2VDcml0ZXJpYSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLml0ZW1zICYmIHMuaXRlbXMubGVuZ3RoIHx8IChzLml0ZW1zID0gW10pLCBzLml0ZW1zLnB1c2godC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkuYXJyYXlzIHx8IGkuZGVmYXVsdHMpICYmIChlLml0ZW1zID0gW10pLCBpLmRlZmF1bHRzICYmIChlLmNob2ljZUNyaXRlcmlhID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ09ubHknIDogMCksIG51bGwgIT0gdC5jaG9pY2VDcml0ZXJpYSAmJiB0Lmhhc093blByb3BlcnR5KCdjaG9pY2VDcml0ZXJpYScpICYmIChlLmNob2ljZUNyaXRlcmlhID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0Nob2ljZUNyaXRlcmlhRW51bVt0LmNob2ljZUNyaXRlcmlhXSA6IHQuY2hvaWNlQ3JpdGVyaWEpLCB0Lml0ZW1zICYmIHQuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLml0ZW1zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuaXRlbXMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pdGVtc1tzXSA9IHQuaXRlbXNbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdDYXNlTW9kZWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuZmlsdGVycyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nQ2FzZU1vZGVsKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZmlsdGVycyAmJiBzLmZpbHRlcnMubGVuZ3RoIHx8IChzLmZpbHRlcnMgPSBbXSksIHMuZmlsdGVycy5wdXNoKGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nRmlsdGVyTW9kZWwuZGVjb2RlKHQsIHQudWludDMyKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKGUuZmlsdGVycyA9IFtdKSwgdC5maWx0ZXJzICYmIHQuZmlsdGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZmlsdGVycyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LmZpbHRlcnMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5maWx0ZXJzW3NdID0gYy5Qcm90b0NvbnRleHR1YWxUYXJnZXRpbmdGaWx0ZXJNb2RlbC50b09iamVjdCh0LmZpbHRlcnNbc10sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nRmlsdGVyTW9kZWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zID0gW10sIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnR5cGUgPSAwLCB0LnByb3RvdHlwZS5pdGVtcyA9IG8uZW1wdHlBcnJheSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9Db250ZXh0dWFsVGFyZ2V0aW5nRmlsdGVyTW9kZWwoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50eXBlID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaXRlbXMgJiYgcy5pdGVtcy5sZW5ndGggfHwgKHMuaXRlbXMgPSBbXSksIHMuaXRlbXMucHVzaCh0LnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaS5hcnJheXMgfHwgaS5kZWZhdWx0cykgJiYgKGUuaXRlbXMgPSBbXSksIGkuZGVmYXVsdHMgJiYgKGUudHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdJbmNsdWRlQW55JyA6IDApLCBudWxsICE9IHQudHlwZSAmJiB0Lmhhc093blByb3BlcnR5KCd0eXBlJykgJiYgKGUudHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/IGMuUHJvdG9MaW5lSXRlbUNvbnRleHR1YWxUYXJnZXRpbmdFbnVtW3QudHlwZV0gOiB0LnR5cGUpLCB0Lml0ZW1zICYmIHQuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLml0ZW1zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQuaXRlbXMubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pdGVtc1tzXSA9IHQuaXRlbXNbc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1BsYXllclNpemVUYXJnZXRpbmdzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuc2l6ZUNob2ljZUNyaXRlcmlhID0gMCwgdC5wcm90b3R5cGUubWluV2lkdGggPSAwLCB0LnByb3RvdHlwZS5tYXhXaWR0aCA9IDAsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvUGxheWVyU2l6ZVRhcmdldGluZ3MoKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zaXplQ2hvaWNlQ3JpdGVyaWEgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5taW5XaWR0aCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1heFdpZHRoID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUuc2l6ZUNob2ljZUNyaXRlcmlhID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gJ0dyZWF0ZXJUaGFuJyA6IDAsIGUubWluV2lkdGggPSAwLCBlLm1heFdpZHRoID0gMCksIG51bGwgIT0gdC5zaXplQ2hvaWNlQ3JpdGVyaWEgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc2l6ZUNob2ljZUNyaXRlcmlhJykgJiYgKGUuc2l6ZUNob2ljZUNyaXRlcmlhID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1NpemVDaG9pY2VDcml0ZXJpYUVudW1bdC5zaXplQ2hvaWNlQ3JpdGVyaWFdIDogdC5zaXplQ2hvaWNlQ3JpdGVyaWEpLCBudWxsICE9IHQubWluV2lkdGggJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWluV2lkdGgnKSAmJiAoZS5taW5XaWR0aCA9IHQubWluV2lkdGgpLCBudWxsICE9IHQubWF4V2lkdGggJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWF4V2lkdGgnKSAmJiAoZS5tYXhXaWR0aCA9IHQubWF4V2lkdGgpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuQ3JlYXRpdmVUcmFja2VyVmlld01vZGVsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHlwZSA9IDAsIHQucHJvdG90eXBlLnRyaWdnZXIgPSAwLCB0LnByb3RvdHlwZS51cmwgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuQ3JlYXRpdmVUcmFja2VyVmlld01vZGVsKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRyaWdnZXIgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy51cmwgPSB0LnN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVmYXVsdHMgJiYgKGUudHlwZSA9IGkuZW51bXMgPT09IFN0cmluZyA/ICdJbWFnZScgOiAwLCBlLnRyaWdnZXIgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnSW1wcmVzc2lvbicgOiAwLCBlLnVybCA9ICcnKSwgbnVsbCAhPSB0LnR5cGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgndHlwZScpICYmIChlLnR5cGUgPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvVHJhY2tlclR5cGVbdC50eXBlXSA6IHQudHlwZSksIG51bGwgIT0gdC50cmlnZ2VyICYmIHQuaGFzT3duUHJvcGVydHkoJ3RyaWdnZXInKSAmJiAoZS50cmlnZ2VyID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b1RyYWNrZXJUcmlnZ2VyVHlwZVt0LnRyaWdnZXJdIDogdC50cmlnZ2VyKSwgbnVsbCAhPSB0LnVybCAmJiB0Lmhhc093blByb3BlcnR5KCd1cmwnKSAmJiAoZS51cmwgPSB0LnVybCksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1JlbmRpdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmhlaWdodCA9IDAsIHQucHJvdG90eXBlLmNvZGVjID0gJycsIHQucHJvdG90eXBlLmZpbGUgPSAnJywgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9SZW5kaXRpb24oKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oZWlnaHQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb2RlYyA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5maWxlID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmhlaWdodCA9IDAsIGUuY29kZWMgPSAnJywgZS5maWxlID0gJycpLCBudWxsICE9IHQuaGVpZ2h0ICYmIHQuaGFzT3duUHJvcGVydHkoJ2hlaWdodCcpICYmIChlLmhlaWdodCA9IHQuaGVpZ2h0KSwgbnVsbCAhPSB0LmNvZGVjICYmIHQuaGFzT3duUHJvcGVydHkoJ2NvZGVjJykgJiYgKGUuY29kZWMgPSB0LmNvZGVjKSwgbnVsbCAhPSB0LmZpbGUgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZmlsZScpICYmIChlLmZpbGUgPSB0LmZpbGUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuQnJvd3NlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gT2JqZWN0LmtleXModCksIGUgPSAwOyBlIDwgaS5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRbaVtlXV0gJiYgKHRoaXNbaVtlXV0gPSB0W2lbZV1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmJyb3dzZXJWZXJzaW9uID0gJycsIHQucHJvdG90eXBlLmJyb3dzZXJUeXBlID0gJycsIHQucHJvdG90eXBlLm9zQ29kZSA9ICcnLCB0LnByb3RvdHlwZS5kZXZpY2UgPSAwLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC5icm93c2VyVmVyc2lvbiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnYnJvd3NlclZlcnNpb24nKSAmJiBpLnVpbnQzMigxMCkuc3RyaW5nKHQuYnJvd3NlclZlcnNpb24pLCBudWxsICE9IHQuYnJvd3NlclR5cGUgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2Jyb3dzZXJUeXBlJykgJiYgaS51aW50MzIoMTgpLnN0cmluZyh0LmJyb3dzZXJUeXBlKSwgbnVsbCAhPSB0Lm9zQ29kZSAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnb3NDb2RlJykgJiYgaS51aW50MzIoMjYpLnN0cmluZyh0Lm9zQ29kZSksIG51bGwgIT0gdC5kZXZpY2UgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2RldmljZScpICYmIGkudWludDMyKDMyKS5pbnQzMih0LmRldmljZSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuQnJvd3NlcigpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJyb3dzZXJWZXJzaW9uID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJyb3dzZXJUeXBlID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm9zQ29kZSA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kZXZpY2UgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZnJvbU9iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgYy5Ccm93c2VyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGMuQnJvd3NlcigpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG51bGwgIT0gdC5icm93c2VyVmVyc2lvbiAmJiAoaS5icm93c2VyVmVyc2lvbiA9IFN0cmluZyh0LmJyb3dzZXJWZXJzaW9uKSksIG51bGwgIT0gdC5icm93c2VyVHlwZSAmJiAoaS5icm93c2VyVHlwZSA9IFN0cmluZyh0LmJyb3dzZXJUeXBlKSksIG51bGwgIT0gdC5vc0NvZGUgJiYgKGkub3NDb2RlID0gU3RyaW5nKHQub3NDb2RlKSksIHQuZGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0Rlc2t0b3AnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU21hcnRwaG9uZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZGV2aWNlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUYWJsZXQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnR2FtZUNvbnNvbGUnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU21hcnRUVic6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZGV2aWNlID0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXZWFyYWJsZUNvbXB1dGVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kZXZpY2UgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1BEQSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZGV2aWNlID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdVbnJlY29nbml6ZWQnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRldmljZSA9IDc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmJyb3dzZXJWZXJzaW9uID0gJycsIGUuYnJvd3NlclR5cGUgPSAnJywgZS5vc0NvZGUgPSAnJywgZS5kZXZpY2UgPSBpLmVudW1zID09PSBTdHJpbmcgPyAnRGVza3RvcCcgOiAwKSwgbnVsbCAhPSB0LmJyb3dzZXJWZXJzaW9uICYmIHQuaGFzT3duUHJvcGVydHkoJ2Jyb3dzZXJWZXJzaW9uJykgJiYgKGUuYnJvd3NlclZlcnNpb24gPSB0LmJyb3dzZXJWZXJzaW9uKSwgbnVsbCAhPSB0LmJyb3dzZXJUeXBlICYmIHQuaGFzT3duUHJvcGVydHkoJ2Jyb3dzZXJUeXBlJykgJiYgKGUuYnJvd3NlclR5cGUgPSB0LmJyb3dzZXJUeXBlKSwgbnVsbCAhPSB0Lm9zQ29kZSAmJiB0Lmhhc093blByb3BlcnR5KCdvc0NvZGUnKSAmJiAoZS5vc0NvZGUgPSB0Lm9zQ29kZSksIG51bGwgIT0gdC5kZXZpY2UgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnZGV2aWNlJykgJiYgKGUuZGV2aWNlID0gaS5lbnVtcyA9PT0gU3RyaW5nID8gYy5Qcm90b0RldmljZVR5cGVbdC5kZXZpY2VdIDogdC5kZXZpY2UpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgci51dGlsLnRvSlNPTk9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuR2VvTG9jYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5jb3VudHJ5R2VvSWQgPSAwLCB0LnByb3RvdHlwZS5jaXR5SWQgPSAwLCB0LnByb3RvdHlwZS5zdWJkaXZpc2lvbklkID0gMCwgdC5wcm90b3R5cGUuZG1hSWQgPSAwLCB0LnByb3RvdHlwZS5pcCA9ICcnLCB0LnByb3RvdHlwZS5sYXQgPSAwLCB0LnByb3RvdHlwZS5sb24gPSAwLCB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gYS5jcmVhdGUoKSksIG51bGwgIT0gdC5jb3VudHJ5R2VvSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2NvdW50cnlHZW9JZCcpICYmIGkudWludDMyKDgpLmludDMyKHQuY291bnRyeUdlb0lkKSwgbnVsbCAhPSB0LmNpdHlJZCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCAnY2l0eUlkJykgJiYgaS51aW50MzIoMTYpLmludDMyKHQuY2l0eUlkKSwgbnVsbCAhPSB0LnN1YmRpdmlzaW9uSWQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ3N1YmRpdmlzaW9uSWQnKSAmJiBpLnVpbnQzMigyNCkuaW50MzIodC5zdWJkaXZpc2lvbklkKSwgbnVsbCAhPSB0LmRtYUlkICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdkbWFJZCcpICYmIGkudWludDMyKDMyKS5pbnQzMih0LmRtYUlkKSwgbnVsbCAhPSB0LmlwICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdpcCcpICYmIGkudWludDMyKDQyKS5zdHJpbmcodC5pcCksIG51bGwgIT0gdC5sYXQgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgJ2xhdCcpICYmIGkudWludDMyKDQ5KS5kb3VibGUodC5sYXQpLCBudWxsICE9IHQubG9uICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsICdsb24nKSAmJiBpLnVpbnQzMig1NykuZG91YmxlKHQubG9uKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5HZW9Mb2NhdGlvbigpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvdW50cnlHZW9JZCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNpdHlJZCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnN1YmRpdmlzaW9uSWQgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kbWFJZCA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmlwID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxhdCA9IHQuZG91YmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sb24gPSB0LmRvdWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LmZyb21PYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIGMuR2VvTG9jYXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgYy5HZW9Mb2NhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0LmNvdW50cnlHZW9JZCAmJiAoaS5jb3VudHJ5R2VvSWQgPSAwIHwgdC5jb3VudHJ5R2VvSWQpLCBudWxsICE9IHQuY2l0eUlkICYmIChpLmNpdHlJZCA9IDAgfCB0LmNpdHlJZCksIG51bGwgIT0gdC5zdWJkaXZpc2lvbklkICYmIChpLnN1YmRpdmlzaW9uSWQgPSAwIHwgdC5zdWJkaXZpc2lvbklkKSwgbnVsbCAhPSB0LmRtYUlkICYmIChpLmRtYUlkID0gMCB8IHQuZG1hSWQpLCBudWxsICE9IHQuaXAgJiYgKGkuaXAgPSBTdHJpbmcodC5pcCkpLCBudWxsICE9IHQubGF0ICYmIChpLmxhdCA9IE51bWJlcih0LmxhdCkpLCBudWxsICE9IHQubG9uICYmIChpLmxvbiA9IE51bWJlcih0LmxvbikpLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS5jb3VudHJ5R2VvSWQgPSAwLCBlLmNpdHlJZCA9IDAsIGUuc3ViZGl2aXNpb25JZCA9IDAsIGUuZG1hSWQgPSAwLCBlLmlwID0gJycsIGUubGF0ID0gMCwgZS5sb24gPSAwKSwgbnVsbCAhPSB0LmNvdW50cnlHZW9JZCAmJiB0Lmhhc093blByb3BlcnR5KCdjb3VudHJ5R2VvSWQnKSAmJiAoZS5jb3VudHJ5R2VvSWQgPSB0LmNvdW50cnlHZW9JZCksIG51bGwgIT0gdC5jaXR5SWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY2l0eUlkJykgJiYgKGUuY2l0eUlkID0gdC5jaXR5SWQpLCBudWxsICE9IHQuc3ViZGl2aXNpb25JZCAmJiB0Lmhhc093blByb3BlcnR5KCdzdWJkaXZpc2lvbklkJykgJiYgKGUuc3ViZGl2aXNpb25JZCA9IHQuc3ViZGl2aXNpb25JZCksIG51bGwgIT0gdC5kbWFJZCAmJiB0Lmhhc093blByb3BlcnR5KCdkbWFJZCcpICYmIChlLmRtYUlkID0gdC5kbWFJZCksIG51bGwgIT0gdC5pcCAmJiB0Lmhhc093blByb3BlcnR5KCdpcCcpICYmIChlLmlwID0gdC5pcCksIG51bGwgIT0gdC5sYXQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbGF0JykgJiYgKGUubGF0ID0gaS5qc29uICYmICFpc0Zpbml0ZSh0LmxhdCkgPyBTdHJpbmcodC5sYXQpIDogdC5sYXQpLCBudWxsICE9IHQubG9uICYmIHQuaGFzT3duUHJvcGVydHkoJ2xvbicpICYmIChlLmxvbiA9IGkuanNvbiAmJiAhaXNGaW5pdGUodC5sb24pID8gU3RyaW5nKHQubG9uKSA6IHQubG9uKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHIudXRpbC50b0pTT05PcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvU3VwcGx5Q2hhaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5idXNpbmVzc0RvbWFpbiA9ICcnLCB0LnByb3RvdHlwZS5zdXBwbHlDaGFpbklkID0gJycsIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGggfHwgKHQgPSBoLmNyZWF0ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAgPT09IGkgPyB0LmxlbiA6IHQucG9zICsgaSwgcyA9IG5ldyBjLlByb3RvU3VwcGx5Q2hhaW4oKTsgdC5wb3MgPCBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuID4+PiAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5idXNpbmVzc0RvbWFpbiA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zdXBwbHlDaGFpbklkID0gdC5zdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSg3ICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50b09iamVjdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlZmF1bHRzICYmIChlLmJ1c2luZXNzRG9tYWluID0gJycsIGUuc3VwcGx5Q2hhaW5JZCA9ICcnKSwgbnVsbCAhPSB0LmJ1c2luZXNzRG9tYWluICYmIHQuaGFzT3duUHJvcGVydHkoJ2J1c2luZXNzRG9tYWluJykgJiYgKGUuYnVzaW5lc3NEb21haW4gPSB0LmJ1c2luZXNzRG9tYWluKSwgbnVsbCAhPSB0LnN1cHBseUNoYWluSWQgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnc3VwcGx5Q2hhaW5JZCcpICYmIChlLnN1cHBseUNoYWluSWQgPSB0LnN1cHBseUNoYWluSWQpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Vc2VySW5mb3JtYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHQpLCBlID0gMDsgZSA8IGkubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0W2lbZV1dICYmICh0aGlzW2lbZV1dID0gdFtpW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS51c2VySWQgPSAnJywgdC5wcm90b3R5cGUubG9va3VwSWQgPSAnJywgdC5wcm90b3R5cGUubG9va3VwUmVzcG9uc2VDb2RlID0gMCwgdC5wcm90b3R5cGUuY2FsbEZyYXVkU2Vuc29yID0gITEsIHQucHJvdG90eXBlLnB1Ymxpc2hlckFkc1R4dCA9ICcnLCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBoIHx8ICh0ID0gaC5jcmVhdGUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdm9pZCAwID09PSBpID8gdC5sZW4gOiB0LnBvcyArIGksIHMgPSBuZXcgYy5Qcm90b1VzZXJJbmZvcm1hdGlvbigpOyB0LnBvcyA8IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudWludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4gPj4+IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnVzZXJJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sb29rdXBJZCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5sb29rdXBSZXNwb25zZUNvZGUgPSB0LmludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jYWxsRnJhdWRTZW5zb3IgPSB0LmJvb2woKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB1Ymxpc2hlckFkc1R4dCA9IHQuc3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUoNyAmIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIHQudG9PYmplY3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZWZhdWx0cyAmJiAoZS51c2VySWQgPSAnJywgZS5sb29rdXBJZCA9ICcnLCBlLmxvb2t1cFJlc3BvbnNlQ29kZSA9IDAsIGUuY2FsbEZyYXVkU2Vuc29yID0gITEsIGUucHVibGlzaGVyQWRzVHh0ID0gJycpLCBudWxsICE9IHQudXNlcklkICYmIHQuaGFzT3duUHJvcGVydHkoJ3VzZXJJZCcpICYmIChlLnVzZXJJZCA9IHQudXNlcklkKSwgbnVsbCAhPSB0Lmxvb2t1cElkICYmIHQuaGFzT3duUHJvcGVydHkoJ2xvb2t1cElkJykgJiYgKGUubG9va3VwSWQgPSB0Lmxvb2t1cElkKSwgbnVsbCAhPSB0Lmxvb2t1cFJlc3BvbnNlQ29kZSAmJiB0Lmhhc093blByb3BlcnR5KCdsb29rdXBSZXNwb25zZUNvZGUnKSAmJiAoZS5sb29rdXBSZXNwb25zZUNvZGUgPSB0Lmxvb2t1cFJlc3BvbnNlQ29kZSksIG51bGwgIT0gdC5jYWxsRnJhdWRTZW5zb3IgJiYgdC5oYXNPd25Qcm9wZXJ0eSgnY2FsbEZyYXVkU2Vuc29yJykgJiYgKGUuY2FsbEZyYXVkU2Vuc29yID0gdC5jYWxsRnJhdWRTZW5zb3IpLCBudWxsICE9IHQucHVibGlzaGVyQWRzVHh0ICYmIHQuaGFzT3duUHJvcGVydHkoJ3B1Ymxpc2hlckFkc1R4dCcpICYmIChlLnB1Ymxpc2hlckFkc1R4dCA9IHQucHVibGlzaGVyQWRzVHh0KSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQWRCcmVhayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudHlwZXMgPSBbXSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyh0KSwgZSA9IDA7IGUgPCBpLmxlbmd0aDsgKytlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdFtpW2VdXSAmJiAodGhpc1tpW2VdXSA9IHRbaVtlXV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudHlwZXMgPSBvLmVtcHR5QXJyYXksIHQucHJvdG90eXBlLm1heEFkUG9kRHVyYXRpb24gPSAwLCB0LnByb3RvdHlwZS5tYXhBZFNsb3REdXJhdGlvbiA9IDE4MCwgdC5wcm90b3R5cGUubnVtYmVyT2ZBZFNsb3RzID0gMSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgaCB8fCAodCA9IGguY3JlYXRlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCA9PT0gaSA/IHQubGVuIDogdC5wb3MgKyBpLCBzID0gbmV3IGMuUHJvdG9BZEJyZWFrKCk7IHQucG9zIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC51aW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobiA+Pj4gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnR5cGVzICYmIHMudHlwZXMubGVuZ3RoIHx8IChzLnR5cGVzID0gW10pLCAyID09ICg3ICYgbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LnVpbnQzMigpICsgdC5wb3M7IHQucG9zIDwgcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGVzLnB1c2godC5pbnQzMigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZXMucHVzaCh0LmludDMyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubWF4QWRQb2REdXJhdGlvbiA9IHQuaW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm1heEFkU2xvdER1cmF0aW9uID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubnVtYmVyT2ZBZFNsb3RzID0gdC5pbnQzMigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKDcgJiBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRvT2JqZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpLmFycmF5cyB8fCBpLmRlZmF1bHRzKSAmJiAoZS50eXBlcyA9IFtdKSwgaS5kZWZhdWx0cyAmJiAoZS5tYXhBZFBvZER1cmF0aW9uID0gMCwgZS5tYXhBZFNsb3REdXJhdGlvbiA9IDE4MCwgZS5udW1iZXJPZkFkU2xvdHMgPSAxKSwgdC50eXBlcyAmJiB0LnR5cGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50eXBlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0LnR5cGVzLmxlbmd0aDsgKytzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHlwZXNbc10gPSBpLmVudW1zID09PSBTdHJpbmcgPyBjLlByb3RvQWRCcmVha1R5cGVFbnVtW3QudHlwZXNbc11dIDogdC50eXBlc1tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSB0Lm1heEFkUG9kRHVyYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWF4QWRQb2REdXJhdGlvbicpICYmIChlLm1heEFkUG9kRHVyYXRpb24gPSB0Lm1heEFkUG9kRHVyYXRpb24pLCBudWxsICE9IHQubWF4QWRTbG90RHVyYXRpb24gJiYgdC5oYXNPd25Qcm9wZXJ0eSgnbWF4QWRTbG90RHVyYXRpb24nKSAmJiAoZS5tYXhBZFNsb3REdXJhdGlvbiA9IHQubWF4QWRTbG90RHVyYXRpb24pLCBudWxsICE9IHQubnVtYmVyT2ZBZFNsb3RzICYmIHQuaGFzT3duUHJvcGVydHkoJ251bWJlck9mQWRTbG90cycpICYmIChlLm51bWJlck9mQWRTbG90cyA9IHQubnVtYmVyT2ZBZFNsb3RzKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvT3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZ0VudW0gPSAocyA9IHt9LCAobiA9IE9iamVjdC5jcmVhdGUocykpW3NbMF0gPSAnRXhwYW5kV2l0aEFkJ10gPSAwLCBuW3NbMV0gPSAnRnVsbHlSZW5kZXJlZCddID0gMSwgbiksIGMuUHJvdG9PdXRzdHJlYW1FbmRBZEJyZWFrUG9saWN5RW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0hpZGUnXSA9IDAsIGlbdFsxXSA9ICdIb3VzZVNjcmVlbiddID0gMSwgaVt0WzJdID0gJ0xvb3AnXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9HYWxsZXJ5U3R5bGVNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnTm9uZSddID0gMCwgaVt0WzFdID0gJ0RldGFpbGVkJ10gPSAxLCBpW3RbMl0gPSAnVmlzdWFsJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvTG9nb1Bvc2l0aW9uTW9kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ05vbmUnXSA9IDAsIGlbdFsxXSA9ICdDb250cm9sQmFyJ10gPSAxLCBpW3RbMl0gPSAnQm90dG9tUmlnaHQnXSA9IDIsIGlbdFszXSA9ICdCb3R0b21MZWZ0J10gPSAzLCBpW3RbNF0gPSAnVG9wUmlnaHQnXSA9IDQsIGlbdFs1XSA9ICdUb3BMZWZ0J10gPSA1LCBpW3RbNl0gPSAnQ2VudGVyJ10gPSA2LCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvR2FsbGVyeU9yaWVudGF0aW9uRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0xhbmRzY2FwZSddID0gMCwgaVt0WzFdID0gJ1BvcnRyYWl0J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvRWxlbWVudHNUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0luU3RyZWFtJ10gPSAwLCBpW3RbMV0gPSAnT3V0U3RyZWFtJ10gPSAxLCBpW3RbMl0gPSAnSW5TdHJlYW1JbkFwcCddID0gMiwgaVt0WzNdID0gJ0xpdmUnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJVcE5leHRNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnTG9vcCddID0gMCwgaVt0WzFdID0gJ05leHQnXSA9IDEsIGlbdFsyXSA9ICdTdG9wJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvQ3JlYXRpdmVUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1RoaXJkUGFydHknXSA9IDAsIGlbdFsxXSA9ICdNZWRpYUZpbGUnXSA9IDEsIGlbdFsyXSA9ICdSdGInXSA9IDIsIGlbdFszXSA9ICdFeHRlcm5hbCddID0gMywgaVt0WzRdID0gJ0hlYWRlckJpZGRlciddID0gNCwgaVt0WzddID0gJ1RhbSddID0gNywgaVt0WzhdID0gJ1RhbURlYWwnXSA9IDgsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9SZXNldENhcFR5cGVFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnVGltZUNhcHBpbmcnXSA9IDAsIGlbdFsxXSA9ICdDb250ZW50Q2FwcGluZyddID0gMSwgaVt0WzJdID0gJ09wcG9ydHVuaXR5Q2FwcGluZyddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkU2xvdHNFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnUHJlUm9sbCddID0gMCwgaVt0WzFdID0gJ01pZFJvbGwnXSA9IDEsIGlbdFsyXSA9ICdQb3N0Um9sbCddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtUHJpb3JpdHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdIb3VzZSddID0gMCwgaVt0WzFdID0gJ0RlZmF1bHQnXSA9IDEsIGlbdFsyXSA9ICdQcmVmZXJyZWQnXSA9IDIsIGlbdFszXSA9ICdUb3AnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BZFNraXBNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnSWZMb25nZXJUaGFuMzFTZWMnXSA9IDAsIGlbdFsxXSA9ICdBbHdheXMnXSA9IDEsIGlbdFsyXSA9ICdOZXZlciddID0gMiwgaVt0WzNdID0gJ05vdEFwbGljYWJsZSddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ1ZpZGVvJ10gPSAwLCBpW3RbMV0gPSAnT3ZlcmxheSddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0Nob2ljZUNyaXRlcmlhRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ09ubHknXSA9IDAsIGlbdFsxXSA9ICdFeGNlcHQnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbUFkQnJlYWtUeXBlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzFdID0gJ0FsbCddID0gMSwgaVt0WzJdID0gJ1NpbmdsZUFkJ10gPSAyLCBpW3RbM10gPSAnQWRQb2QnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbVRhcmdldGluZ1R5cGVFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnT25seSddID0gMCwgaVt0WzFdID0gJ0V4Y2VwdCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQWRTbG90VGFyZ2V0aW5nVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFsxXSA9ICdTcGVjaWZpY1Nsb3RzJ10gPSAxLCBpW3RbMl0gPSAnSW50ZXJ2YWwnXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9MaW5lSXRlbVBhdXNlQWRPdXRPZlZpZXdFbnVtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnRGVmYXVsdCddID0gMCwgaVt0WzFdID0gJ1N0cmljdCddID0gMSwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0xpbmVJdGVtQ29udGV4dHVhbFRhcmdldGluZ0VudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJbmNsdWRlQW55J10gPSAwLCBpW3RbMV0gPSAnSW5jbHVkZUFsbCddID0gMSwgaVt0WzJdID0gJ0V4Y2x1ZGVBbnknXSA9IDIsIGlbdFszXSA9ICdFeGNsdWRlQWxsJ10gPSAzLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvU2l6ZUNob2ljZUNyaXRlcmlhRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0dyZWF0ZXJUaGFuJ10gPSAwLCBpW3RbMV0gPSAnU21hbGxlclRoYW4nXSA9IDEsIGlbdFsyXSA9ICdCZXR3ZWVuJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvVHJhY2tlclR5cGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJbWFnZSddID0gMCwgaVt0WzFdID0gJ0phdmFzY3JpcHQnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJbXByZXNzaW9uJ10gPSAwLCBpW3RbMV0gPSAnQ29tcGxldGUyNVBjJ10gPSAxLCBpW3RbMl0gPSAnQ29tcGxldGU1MFBjJ10gPSAyLCBpW3RbM10gPSAnQ29tcGxldGU3NVBjJ10gPSAzLCBpW3RbNF0gPSAnVmlld0NvbXBsZXRpb24nXSA9IDQsIGlbdFs1XSA9ICdWaWRlb0NsaWNrJ10gPSA1LCBpW3RbNl0gPSAnUGF1c2UnXSA9IDYsIGlbdFs3XSA9ICdSZXN1bWUnXSA9IDcsIGlbdFs4XSA9ICdNdXRlJ10gPSA4LCBpW3RbOV0gPSAnVW5tdXRlJ10gPSA5LCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0F1dG9wbGF5J10gPSAwLCBpW3RbMV0gPSAnU2Nyb2xsVG9QbGF5J10gPSAxLCBpW3RbMl0gPSAnQ2xpY2tUb1BsYXknXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdPZmYnXSA9IDAsIGlbdFsxXSA9ICdPbkhvdmVyJ10gPSAxLCBpW3RbMl0gPSAnT25Ib3ZlckFmdGVyRmlyc3RBZCddID0gMiwgaVt0WzNdID0gJ0Fsd2F5c09uJ10gPSAzLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnT2ZmJ10gPSAwLCBpW3RbMV0gPSAnT25QYWdlTG9hZCddID0gMSwgaVt0WzJdID0gJ0FmdGVySW5WaWV3J10gPSAyLCBpW3RbM10gPSAnQWx3YXlzJ10gPSAzLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyU291bmRNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnTXV0ZSddID0gMCwgaVt0WzFdID0gJ09uJ10gPSAxLCBpW3RbMl0gPSAnSG92ZXInXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9QbGF5ZXJJbnNlcnRNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnV2l0aGluQ29udGFpbmVyJ10gPSAwLCBpW3RbMV0gPSAnQmVmb3JlQ29udGFpbmVyJ10gPSAxLCBpW3RbMl0gPSAnQWZ0ZXJDb250YWluZXInXSA9IDIsIGlbdFszXSA9ICdSZXBsYWNlQ29udGFpbmVyJ10gPSAzLCBpW3RbNF0gPSAnSGlkZUNvbnRhaW5lciddID0gNCwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkVmlld2FiaWxpdHlQb2xpY3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdEZWZhdWx0J10gPSAwLCBpW3RbMV0gPSAnU3RyaWN0J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvU2hhcmluZ0Rlc3RpbmF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnRmFjZWJvb2snXSA9IDAsIGlbdFsxXSA9ICdUd2l0dGVyJ10gPSAxLCBpW3RbMl0gPSAnTGlua2VkSW4nXSA9IDIsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9GbG9hdGluZ0ZpeGVkUG9zaXRpb25Nb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3RbMF0gPSAnUGFnZSddID0gMCwgaVt0WzFdID0gJ0VsZW1lbnQnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9Qb3NpdGlvbk1vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdCb3R0b21SaWdodCddID0gMCwgaVt0WzFdID0gJ0JvdHRvbUxlZnQnXSA9IDEsIGlbdFsyXSA9ICdUb3BSaWdodCddID0gMiwgaVt0WzNdID0gJ1RvcExlZnQnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BZFBsYXliYWNrTW9kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0F1dG9wbGF5J10gPSAwLCBpW3RbMV0gPSAnU2Nyb2xsVG9QbGF5J10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvRmxvYXRpbmdBcHBlbmRMb2NhdGlvbkVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdBYm92ZSddID0gMCwgaVt0WzFdID0gJ0JlbG93J10gPSAxLCBpW3RbMl0gPSAnV2l0aGluJ10gPSAyLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvUGxheWVyQWRTa2lwcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdJZkxvbmdlclRoYW4nXSA9IDAsIGlbdFsxXSA9ICdBbHdheXMnXSA9IDEsIGlbdFsyXSA9ICdOb1Jlc3RyaWN0aW9ucyddID0gMiwgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b1ZpZGVvUXVhbGl0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0F1dG8nXSA9IDAsIGlbdFsxXSA9ICdIaWdoMTA4MHAnXSA9IDEsIGlbdFsyXSA9ICdIaWdoNzIwcCddID0gMiwgaVt0WzNdID0gJ01lZGl1bTM2MHAnXSA9IDMsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9JbXBsZW1lbnRhdGlvblR5cGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdXZWInXSA9IDAsIGlbdFsxXSA9ICdBbXAnXSA9IDEsIGk7CiAgICAgICAgICAgICAgICB9KCksIGMuUHJvdG9BZEJyZWFrVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdOb25lJ10gPSAwLCBpW3RbMV0gPSAnUHJlUm9sbCddID0gMSwgaVt0WzJdID0gJ01pZFJvbGwnXSA9IDIsIGlbdFszXSA9ICdQb3N0Um9sbCddID0gMywgaTsKICAgICAgICAgICAgICAgIH0oKSwgYy5Qcm90b0FkU2xvdEFkVHlwZUVudW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbdFswXSA9ICdTaW5nbGVBZCddID0gMCwgaVt0WzFdID0gJ0FkUG9kJ10gPSAxLCBpOwogICAgICAgICAgICAgICAgfSgpLCBjLlByb3RvRGV2aWNlVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0WzBdID0gJ0Rlc2t0b3AnXSA9IDAsIGlbdFsxXSA9ICdTbWFydHBob25lJ10gPSAxLCBpW3RbMl0gPSAnVGFibGV0J10gPSAyLCBpW3RbM10gPSAnR2FtZUNvbnNvbGUnXSA9IDMsIGlbdFs0XSA9ICdTbWFydFRWJ10gPSA0LCBpW3RbNV0gPSAnV2VhcmFibGVDb21wdXRlciddID0gNSwgaVt0WzZdID0gJ1BEQSddID0gNiwgaVt0WzddID0gJ1VucmVjb2duaXplZCddID0gNywgaTsKICAgICAgICAgICAgICAgIH0oKSwgdC5leHBvcnRzID0gYzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdsJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnaScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdqJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMTkpLCBuID0gZSgxKSwgciA9IGUoMzEpLCBoID0gZSg2KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAodCArIDE2ICogTWF0aC5yYW5kb20oKSkgJSAxNiB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gTWF0aC5mbG9vcih0IC8gMTYpLCAoJ3gnID09PSBpID8gZSA6IDMgJiBlIHwgOCkudG9TdHJpbmcoMTYpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSgpLnJlcGxhY2UoLy0vZywgJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoIXQuZXJyKQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQudG9wRnJhbWUubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8IDAgPT09IGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGkudG9wLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAwID09PSBlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LnRvcEZyYW1lLmRvY3VtZW50LnJlZmVycmVyOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUodCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0Lm1hdGNoKC9eKGh0dHBzPzopXC9cLygoW146XC8/I10qKSg/OjooWzAtOV0rKSk/KShbXC9dezAsMX1bXj8jXSopKFw/W14jXSp8KSgjLip8KSQvKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogaVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IGlbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZTogaVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IGlbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTogaVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogaVs2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IGlbN10KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwodCkgewogICAgICAgICAgICAgICAgICAgIGxldCBpID0gdCwgZSA9IG51bGwsIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaS5wYXJlbnQuZG9jdW1lbnQgIT09IGkuZG9jdW1lbnQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkucGFyZW50LmRvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGksIGkgPSBpLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICB0b3BGcmFtZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgdG9wQ2hpbGRGcmFtZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyOiBzCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgfSkoKSwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uZykodCkgJiYgKG5ldyBpLkltYWdlKCkuc3JjID0gYCR7IHQgfSR7IE9iamVjdChzLmMpKHQpIH0keyBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2gocyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IGkgPyBgJHsgaSB9WyR7IHMgfV1gIDogcywgbyA9IHRbc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChuLmYpKG8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goYCR7IGVuY29kZVVSSUNvbXBvbmVudChhKSB9PSR7IE9iamVjdChyLmMpKG8pIH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goYCR7IGVuY29kZVVSSUNvbXBvbmVudChhKSB9PSR7IE9iamVjdChoLmwpKG8pIH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsICE9IG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGVuY29kZVVSSUNvbXBvbmVudChvKSwgaSA9IGVuY29kZVVSSUNvbXBvbmVudChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBpICYmIGUucHVzaChgJHsgaSB9PSR7IHQgfWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmpvaW4oJyYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlKSB9YCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gTWF0aC5mbG9vcigxMDAgKiBNYXRoLnJhbmRvbSgpKTsKICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IDAsIHMgPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAocyArPSB0W25dKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdCA9ICExOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdWRpbycpOwogICAgICAgICAgICAgICAgICAgICAgICBpLnZvbHVtZSA9IDEsIGkubXV0ZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGUgJiYgZS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0ID0gIWkucGF1c2VkLCBpLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9KSgpLCAuLi5lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLmYpKHQpID8gT2JqZWN0KHIuYikodCwgaSkgOiBBcnJheS5pc0FycmF5KHQpID8gT2JqZWN0KGguaikodCwgaSkgOiB0ID09PSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSAwLCBuID0gdDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgcyA8PSBlOykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocysrLCBuLmNsYXNzTGlzdC5jb250YWlucyhpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobiA9IG4ucGFyZW50RWxlbWVudCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDU7CiAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQoKS50aGVuKGUpLmNhdGNoKG4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAhPT0gaSA/IGcodCwgaSAtIDEpLnRoZW4oZSwgcykgOiBzKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzLCBuLCByLCBoOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LklkbGUgPSAwXSA9ICdJZGxlJywgdFt0LkxvYWRpbmcgPSAxXSA9ICdMb2FkaW5nJywgdFt0LlJlYWR5ID0gMl0gPSAnUmVhZHknLCB0W3QuRXJyb3IgPSAzXSA9ICdFcnJvcicsIHRbdC5DYXBwZWQgPSA0XSA9ICdDYXBwZWQnLCB0W3QuSW5XaW4gPSA1XSA9ICdJbldpbicsIHRbdC5Db25zdW1lZCA9IDZdID0gJ0NvbnN1bWVkJywgdFt0LkluSW1wcmVzc2lvbiA9IDddID0gJ0luSW1wcmVzc2lvbic7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5KYXZhc2NyaXB0ID0gMF0gPSAnSmF2YXNjcmlwdCcsIHRbdC5WaWRlbyA9IDFdID0gJ1ZpZGVvJzsKICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5UaW1lb3V0ID0gJ3RpbWVvdXQnLCB0LlRpbWVvdXRMb2FkZWQgPSAndGltZW91dF9sb2FkZWQnLCB0LkltYUVycm9yID0gJ2ltYUVycm9yJywgdC5JbWFTY3JpcHRGYWlsdXJlID0gJ2ltYVNjcmlwdEZhaWx1cmUnLCB0LkltYU9iamVjdE5vdEZvdW5kID0gJ2ltYU9iamVjdE5vdEZvdW5kJywgdC5JbWFNYW5hZ2VySW5pdCA9ICdpbWFNYW5hZ2VySW5pdCcsIHQuSW1hSW5pdFNka0Vycm9yID0gJ2luaXRJbWFzZGtFcnJvcicsIHQuVmFzdFZpZGVvVGFnRXZlbnRFcnJvciA9ICd2YXN0VmlkZW9UYWdFdmVudEVycm9yJywgdC5WYXN0VW5zdXBwb3J0ZWRNZWRpYSA9ICd2YXN0VW5zdXBwb3J0ZWRNZWRpYScsIHQuVmFzdFBsYXlQcm9taXNlUmVqZWN0ID0gJ3BsYXlQcm9taXNlUmVqZWN0JywgdC5BZFN0b3BwZWQgPSAnYWRTdG9wcGVkJywgdC5NdXRlRW5mb3JjZSA9ICdtdXRlRW5mb3JjZScsIHQuVnBhaWRPbkxvYWQgPSAndnBhaWRPbkxvYWQnLCB0LlZwYWlkSW52YWxpZCA9ICd2cGFpZEludmFsaWQnLCB0LlZwYWlkR2V0VnBhaWRBZEVycm9yID0gJ3ZwYWlkR2V0VnBhaWRBZEVycm9yJywgdC5DbnhNZWRpYU5vUmVuZGl0aW9ucyA9ICdub1JlbmRpdGlvbnMnLCB0LkNueE1lZGlhU3JjTm90U3VwcG9ydGVkID0gJ3NyY05vdFN1cHBvcnRlZCcsIHQuSW52YWxpZFZwYWlkRXZlbnQgPSAnaW52YWxpZFZwYWlkRXZlbnQnLCB0LkFkeE92ZXJsYXlOb0ZpbGwgPSAnYWR4T3ZlcmxheU5vRmlsbCcsIHQuQWR4T3ZlcmxheUdwdFNjcmlwdExvYWQgPSAnYWR4T3ZlcmxheUdwdFNjcmlwdExvYWQnLCB0LkRpc3BsYXlJbnRlZ3JhdG9ySWZyYW1lTG9hZCA9ICdkaXNwbGF5SW50ZWdyYXRvcklmcmFtZUxvYWQnLCB0LkVuZm9yY2VtZW50TWFsd2FyZSA9ICdtYWx3YXJlRGV0ZWN0ZWQnLCB0LkVuZm9yY2VtZW50Vm9sdW1lID0gJ3ZvbHVtZURldGVjdGVkJywgdC5DYW5jZWxsZWQgPSAnYWRNYW5hZ2VyUmVtb3ZlZCcsIHQuRG9tYWluQmxvY2tlZCA9ICdkb21haW5CbG9ja2VkJywgdC5BZGFwdG9yU3RhcnRBZEVycm9yID0gJ2FkYXB0b3JTdGFydEFkRXJyb3InLCB0LkFkYXB0b3JJbml0QWRFcnJvciA9ICdhZGFwdG9ySW5pdEFkRXJyb3InLCB0LldyYXBwZXJTdGFydEFkRXJyb3IgPSAnd3JhcHBlclN0YXJ0QWRFcnJvcicsIHQuV3JhcHBlckluaXRBZEVycm9yID0gJ3dyYXBwZXJJbml0QWRFcnJvcic7CiAgICAgICAgICAgICAgICB9KHIgfHwgKHIgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuSHRtbCA9ICd0ZXh0L2h0bWwnLCB0LkphdmFzY3JpcHQgPSAnYXBwbGljYXRpb24vamF2YXNjcmlwdCc7CiAgICAgICAgICAgICAgICB9KGggfHwgKGggPSB7fSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuSG9sZFN0YXJ0ID0gMF0gPSAnSG9sZFN0YXJ0JywgdFt0LkhvbGRFbmQgPSAxXSA9ICdIb2xkRW5kJywgdFt0LlRhcExlZnQgPSAyXSA9ICdUYXBMZWZ0JywgdFt0LlRhcFJpZ2h0ID0gM10gPSAnVGFwUmlnaHQnLCB0W3QuU3dpcGVFbmQgPSA0XSA9ICdTd2lwZUVuZCcsIHRbdC5Td2lwZU1vdmUgPSA1XSA9ICdTd2lwZU1vdmUnLCB0W3QuU2Nyb2xsID0gNl0gPSAnU2Nyb2xsJywgdFt0LkNsaWNrID0gN10gPSAnQ2xpY2snOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKSwgaS5hID0gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgcyA9IC8oXGRcZCk6KFxkXGQpOihcZFxkKShcLihcZFxkXGQpKT8vLCBuID0gMzYwMDAwMCwgciA9IDYwMDAwLCBoID0gMTAwMCwgYSA9IDYwLCBvID0gODY0MDAwMDAsIGMgPSA2MDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBlKDMpLmIsIG4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHMpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFkQnJlYWtTdGFydDogJ2FkQnJlYWtTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkQ29tcGxldGU6ICdhZENvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgQWRCcmVha0NvbXBsZXRlOiAnYWRCcmVha0NvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgUGF1c2U6ICdwYXVzZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkUGF1c2U6ICdhZFBhdXNlJywKICAgICAgICAgICAgICAgICAgICAgICAgUGxheTogJ3BsYXknLAogICAgICAgICAgICAgICAgICAgICAgICBBZFBsYXk6ICdhZFBsYXknLAogICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50Q29tcGxldGU6ICdjb250ZW50Q29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uU3RhcnQ6ICdzZXNzaW9uU3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBTZXNzaW9uRW5kOiAnc2Vzc2lvbkVuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllclJlc2l6ZWQ6ICdwbGF5ZXJTdGF0ZVJlc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9uRW50ZXJGdWxsc2NyZWVuOiAnb25FbnRlckZ1bGxzY3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICBPbkV4aXRGdWxsc2NyZWVuOiAnb25FeGl0RnVsbHNjcmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllckNvbGxhcHNlZDogJ3BsYXllckNvbGxhcHNlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllckV4cGFuZGVkOiAncGxheWVyRXhwYW5kZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBQbGF5RXJyb3I6ICdwbGF5RXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJFcnJvcjogJ3JlbmRlckVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgQWRTdGF0ZUNoYW5nZTogJ2FkU3RhdGVDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDaGFuZ2U6ICd2b2x1bWVDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICBEZXN0cm95OiAnZGVzdHJveScKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGkuYSA9IG47CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICBQbGF5OiAncGxheScsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhdXNlOiAncGF1c2UnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWFsaXR5Q2hhbmdlZDogJ3F1YWxpdHlDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgUGxheUVycm9yOiAncGxheUVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lQ2hhbmdlZDogJ3ZvbHVtZUNoYW5nZWQnCiAgICAgICAgICAgICAgICAgICAgfSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgRnVsbHNjcmVlbkNoYW5nZWQ6ICdmdWxsc2NyZWVuQ2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsYXllckZsb2F0Q2hhbmdlZDogJ3BsYXllckZsb2F0Q2hhbmdlZCcKICAgICAgICAgICAgICAgICAgICB9LCByID0geyBPbWlkVmlld2FiaWxpdHlUaHJlc2hvbGQ6ICdPbWlkVmlld2FiaWxpdHlUaHJlc2hvbGQnIH0sIGggPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsKICAgICAgICAgICAgICAgICAgICAgICAgUmVhZHk6ICdyZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZWQ6ICdyZW1vdmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXBFcnJvcjogJ3NldHVwRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBJc1ZpZXdhYmxlOiAnaXNWaWV3YWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgIFNpemVDaGFuZ2VkOiAnc2l6ZUNoYW5nZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBCcmFuZGluZ0NsaWNrZWQ6ICdicmFuZGluZ0NsaWNrZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBJbXByZXNzaW9uUHJpY2U6ICdpbXByZXNzaW9uUHJpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBJbXByZXNzaW9uUmV2ZW51ZTogJ2ltcHJlc3Npb25SZXZlbnVlJwogICAgICAgICAgICAgICAgICAgIH0sIHMpLCBuKSwgciksIHsKICAgICAgICAgICAgICAgICAgICAgICAgQWRDbGljazogJ2FkQ2xpY2snLAogICAgICAgICAgICAgICAgICAgICAgICBBZFBsYXk6ICdhZFBsYXknLAogICAgICAgICAgICAgICAgICAgICAgICBBZFBhdXNlOiAnYWRQYXVzZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkSW1wcmVzc2lvbjogJ2FkSW1wcmVzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkQ29tcGxldGVkMjU6ICdhZENvbXBsZXRlZDI1JywKICAgICAgICAgICAgICAgICAgICAgICAgQWRDb21wbGV0ZWQ1MDogJ2FkQ29tcGxldGVkNTAnLAogICAgICAgICAgICAgICAgICAgICAgICBBZENvbXBsZXRlZDc1OiAnYWRDb21wbGV0ZWQ3NScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkQ29tcGxldGVkMTAwOiAnYWRDb21wbGV0ZWQxMDAnLAogICAgICAgICAgICAgICAgICAgICAgICBBZFNraXBwZWQ6ICdhZFNraXBwZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBBZEVycm9yOiAnYWRFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkU3RvcHBlZDogJ2FkU3RvcHBlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkQ29tcGFuaW9uOiAnYWRDb21wYW5pb24nCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuU2V0dXBFcnJvciA9ICdTZXR1cEVycm9yJywgdC5Ob1BsYXllciA9ICdOb1BsYXllcicsIHQuUmVuZGVyRXJyb3IgPSAnUmVuZGVyRXJyb3InOwogICAgICAgICAgICAgICAgfShhIHx8IChhID0ge30pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgyMSk7CiAgICAgICAgICAgICAgICBjbGFzcyBuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFzZSA9IHQsIHRoaXMuYXBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxzOiB0LmNvcmUgKyAnY29yZS9wbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcnk6IHQuY29yZSArICdjb3JlL3N0b3J5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YjogdC5jb3JlICsgJ3J0Yi9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwYWlkOiB0LmNvcmUgKyAndnBhaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1VybHM6IHQuY29yZSArICdjb3JlL3VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrc3Rvcnk6IHQuY29yZSArICdjb3JlL2ZhbGxiYWNrc3RvcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llOiB0LmNvcmUgKyAnY29yZS9jaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YW06IHQuY29yZSArICdjb3JlL2F0YW0nCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudHJhY2tpbmcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX3JlbmRlcmVkOiB0LnRyYWNraW5nICsgJ3NyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25fdmlldzogdC50cmFja2luZyArICdzdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uX3RpbWU6IHQudHJhY2tpbmcgKyAnc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbl9jbGllbnRfZXJyb3I6IHQudHJhY2tpbmcgKyAnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9xdWFydGlsZTogdC50cmFja2luZyArICdtcScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9jbGljazogdC50cmFja2luZyArICdtYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZF9pbXByZXNzaW9uOiB0LnRyYWNraW5nICsgJ2FpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IHQudHJhY2tpbmcgKyAnYWJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkX2ltcHJlc3Npb25fdmlld2FibGU6IHQudHJhY2tpbmcgKyAnYXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfcXVhcnRpbGU6IHQudHJhY2tpbmcgKyAnYXEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfY2xpY2s6IHQudHJhY2tpbmcgKyAnYWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudExvYWQ6IHQudHJhY2tpbmcgKyAnY2xyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQ29udGVudDogdC50cmFja2luZyArICduYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFNlcnZpY2U6IHQudHJhY2tpbmcgKyAnZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmc6IHQudHJhY2tpbmcgKyAndHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFzdFdpbjogdC50cmFja2luZyArICd2dycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGI6IHQudHJhY2tpbmcgKyAnZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nOiB0LnRyYWNraW5nICsgJ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FsbGVyeUNhcmRDbGljazogdC50cmFja2luZyArICdjYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGFydDogdC50cmFja2luZyArICdwcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE9wcG9ydHVuaXR5OiB0LnRyYWNraW5nICsgJ2FvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25BZEJsb2NrZXI6IHQudHJhY2tpbmcgKyAnc2FiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXZ5X2FkX2ludGVydmVudGlvbjogdC50cmFja2luZyArICdoYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSW5mb3JtYXRpb246IHQudHJhY2tpbmcgKyAnYXVjaW5mbycKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5hc3NldHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogYCR7IHRoaXMuVih0LmFzc2V0cykgfXBsYXllci5jc3NgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlzcGFjZTogYCR7IHRoaXMuVih0LmFzc2V0cykgfWNvbm5hdGl4LnBsYXlzcGFjZS5jc3NgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlQW5hbHl0aWNzOiBgJHsgdC5hc3NldHMgfXAvcGx1Z2lucy9hZG9iZS5wbHVnaW4uanNgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRBbmFseXRpY3M6IGAkeyB0LmFzc2V0cyB9cC9wbHVnaW5zL21vYXQucGx1Z2luLmpzYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkZXZlbG9wbWVudCcgPT09IHMuYS5lbnYgPyAnLy9jZC5jb25uYXRpeC5jb20vJyA6IGAkeyB0IH1wLyR7IHMuYS52ZXJzaW9uIH0vYDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgciA9IGUoMTkpLCBoID0gZSg4KTsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xhc3MgYSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIFUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBPYmplY3Qoci5iKSgnY254RW52JywgT2JqZWN0KGguZikod2luZG93KS50b3BGcmFtZS5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKHMuYS5kb21haW5QcmVmaXggPSBgLSR7IHQgfWApLCBPYmplY3Qua2V5cyh0aGlzLiQpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRbdF0gPSB0aGlzLiRbdF0ucmVwbGFjZSgne3tlbnZ9fScsIHMuYS5kb21haW5QcmVmaXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbmV3IG4oYS4kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldCBlbmRQb2ludHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSBhLlcgJiYgKGEuVyA9IGEuVSgpKSwgYS5XOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEuJCA9IHsKICAgICAgICAgICAgICAgICAgICBhOiAnLy9he3tlbnZ9fS5jb25uYXRpeC5jb20vJywKICAgICAgICAgICAgICAgICAgICB2aWRlbzogJy8vdmlkLmNvbm5hdGl4LmNvbS8nLAogICAgICAgICAgICAgICAgICAgIGltYWdlOiAnLy9pbWcuY29ubmF0aXguY29tLycsCiAgICAgICAgICAgICAgICAgICAgY29yZTogJ2h0dHBzOi8vY2FwaXt7ZW52fX0uY29ubmF0aXguY29tLycsCiAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmc6ICcvL2NhcGl7e2Vudn19LmNvbm5hdGl4LmNvbS90ci8nLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiAnLy92aWQuY29ubmF0aXguY29tLycsCiAgICAgICAgICAgICAgICAgICAgYXNzZXRzOiAnLy9jZHN7e2Vudn19LmNvbm5hdGl4LmNvbS8nLAogICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtczogJy8vbGl0LmNvbm5hdGl4LmNvbS8nCiAgICAgICAgICAgICAgICB9LCBhLlcgPSBudWxsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgxKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICsgKHMgLSBlKSAqIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSAtIHQpIC8gKGkgLSB0KTsKICAgICAgICAgICAgICAgICAgICB9KHQsIGksIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucmVkdWNlKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhlIC0gdCkgPD0gTWF0aC5hYnMoaSAtIHQpID8gZSA6IGk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAvIDEwMCAqIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5wb3coMTAsIGkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHQgKiBlKSAvIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIU9iamVjdChzLmUpKHQud2lkdGgpIHx8ICFPYmplY3Qocy5lKSh0LmhlaWdodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBlID0gaTsgZSA+IDE7IGUtLSkKICAgICAgICAgICAgICAgICAgICAgICAgdCAlIGUgPT0gMCAmJiBpICUgZSA9PSAwICYmICh0IC89IGUsIGkgLz0gZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhSYXRpbzogdCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0UmF0aW86IGkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuU2Vzc2lvblJlbmRlcmVkID0gJ3JlbmRlcmVkJywgdC5TZXNzaW9uVmlldyA9ICdlbnRlcl92aWV3JzsKICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICBVc2VySW50ZXJhY3Rpb246ICd1c2VySW50ZXJhY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmFsVXNlckludGVyYWN0aW9uOiAnZ2VuZXJhbFVzZXJJbnRlcmFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIENhblN0YXJ0OiAnY2FuU3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICBEZXN0cm95OiAnZGVzdHJveScKICAgICAgICAgICAgICAgICAgICB9LCByID0geyBTdGF0ZUNoYW5nZWQ6ICdzdGF0ZUNoYW5nZWQnIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ICYmICh0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpW3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbc10uZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpW3NdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbc10uY2FsbChuLmV4cG9ydHMsIG4sIG4uZXhwb3J0cywgZSksIG4ubCA9ICEwLCBuLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm0gPSB0LCBlLmMgPSBpLCBlLmQgPSBmdW5jdGlvbiAodCwgaSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBlLm8odCwgaSkgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIGksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBzCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGUuciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBlLnQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSAmIGkgJiYgKHQgPSBlKHQpKSwgOCAmIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQgJiBpICYmICdvYmplY3QnID09IHR5cGVvZiB0ICYmIHQgJiYgdC5fKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucihzKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsICdkZWZhdWx0JywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMiAmIGkgJiYgJ3N0cmluZycgIT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kKHMsIG4sIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIGUubiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdCAmJiB0Ll8gPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmQoaSwgJ2EnLCBpKSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCBlLm8gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0sIGUucCA9ICcvZGlzdC8nLCBlKGUucyA9IDEzKTsKICAgICAgICAgICAgICAgIH0oWwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZSg1KTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZzogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2c6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBoID0gciwgYSA9IE9iamVjdChzLmEpKCksIG8gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmNvbnNvbGUgJiYgITAgPT09IHQgfHwgJ29iamVjdCcgPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCwgZSA9IG5ldyBBcnJheShpID4gMSA/IGkgLSAxIDogMCksIHMgPSAxOyBzIDwgaTsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcyAtIDFdID0gYXJndW1lbnRzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFtpXSA9IHRbaV0gPyB0W2ldLmJpbmQodCkgOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGEuY29uc29sZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCwgcyA9IG5ldyBBcnJheShlKSwgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tuXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMF0gJiYgKHNbMF0gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID0gJ1snICsgdCArICddID4gJyArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIHNbMF0pKSwgaS5hcHBseShhLmNvbnNvbGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgJ2RlYnVnJywgJ2xvZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgubG9nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyA9IGg7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0FUVEFDSElORzogJ2hsc01lZGlhQXR0YWNoaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0FUVEFDSEVEOiAnaGxzTWVkaWFBdHRhY2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9ERVRBQ0hJTkc6ICdobHNNZWRpYURldGFjaGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9ERVRBQ0hFRDogJ2hsc01lZGlhRGV0YWNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX1JFU0VUOiAnaGxzQnVmZmVyUmVzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0NPREVDUzogJ2hsc0J1ZmZlckNvZGVjcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfQ1JFQVRFRDogJ2hsc0J1ZmZlckNyZWF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQlVGRkVSX0FQUEVORElORzogJ2hsc0J1ZmZlckFwcGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfQVBQRU5ERUQ6ICdobHNCdWZmZXJBcHBlbmRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVUZGRVJfRU9TOiAnaGxzQnVmZmVyRW9zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9GTFVTSElORzogJ2hsc0J1ZmZlckZsdXNoaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9GTFVTSEVEOiAnaGxzQnVmZmVyRmx1c2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQU5JRkVTVF9MT0FESU5HOiAnaGxzTWFuaWZlc3RMb2FkaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BTklGRVNUX0xPQURFRDogJ2hsc01hbmlmZXN0TG9hZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BTklGRVNUX1BBUlNFRDogJ2hsc01hbmlmZXN0UGFyc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX1NXSVRDSElORzogJ2hsc0xldmVsU3dpdGNoaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX1NXSVRDSEVEOiAnaGxzTGV2ZWxTd2l0Y2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9MT0FESU5HOiAnaGxzTGV2ZWxMb2FkaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0xPQURFRDogJ2hsc0xldmVsTG9hZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX1VQREFURUQ6ICdobHNMZXZlbFVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfUFRTX1VQREFURUQ6ICdobHNMZXZlbFB0c1VwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVFJBQ0tTX1VQREFURUQ6ICdobHNBdWRpb1RyYWNrc1VwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVFJBQ0tfU1dJVENISU5HOiAnaGxzQXVkaW9UcmFja1N3aXRjaGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19UUkFDS19TV0lUQ0hFRDogJ2hsc0F1ZGlvVHJhY2tTd2l0Y2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19UUkFDS19MT0FESU5HOiAnaGxzQXVkaW9UcmFja0xvYWRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVFJBQ0tfTE9BREVEOiAnaGxzQXVkaW9UcmFja0xvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUSVRMRV9UUkFDS1NfVVBEQVRFRDogJ2hsc1N1YnRpdGxlVHJhY2tzVXBkYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUSVRMRV9UUkFDS19TV0lUQ0g6ICdobHNTdWJ0aXRsZVRyYWNrU3dpdGNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRJVExFX1RSQUNLX0xPQURJTkc6ICdobHNTdWJ0aXRsZVRyYWNrTG9hZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUSVRMRV9UUkFDS19MT0FERUQ6ICdobHNTdWJ0aXRsZVRyYWNrTG9hZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VEOiAnaGxzU3VidGl0bGVGcmFnUHJvY2Vzc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVRfUFRTX0ZPVU5EOiAnaGxzSW5pdFB0c0ZvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfTE9BRElORzogJ2hsc0ZyYWdMb2FkaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfTE9BRF9QUk9HUkVTUzogJ2hsc0ZyYWdMb2FkUHJvZ3Jlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBR19MT0FEX0VNRVJHRU5DWV9BQk9SVEVEOiAnaGxzRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfTE9BREVEOiAnaGxzRnJhZ0xvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFHX0RFQ1JZUFRFRDogJ2hsc0ZyYWdEZWNyeXB0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVDogJ2hsc0ZyYWdQYXJzaW5nSW5pdFNlZ21lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBR19QQVJTSU5HX1VTRVJEQVRBOiAnaGxzRnJhZ1BhcnNpbmdVc2VyZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFHX1BBUlNJTkdfTUVUQURBVEE6ICdobHNGcmFnUGFyc2luZ01ldGFkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfUEFSU0lOR19EQVRBOiAnaGxzRnJhZ1BhcnNpbmdEYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfUEFSU0VEOiAnaGxzRnJhZ1BhcnNlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFHX0JVRkZFUkVEOiAnaGxzRnJhZ0J1ZmZlcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQUdfQ0hBTkdFRDogJ2hsc0ZyYWdDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQU19EUk9QOiAnaGxzRnBzRHJvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFNfRFJPUF9MRVZFTF9DQVBQSU5HOiAnaGxzRnBzRHJvcExldmVsQ2FwcGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUlJPUjogJ2hsc0Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RST1lJTkc6ICdobHNEZXN0cm95aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9MT0FESU5HOiAnaGxzS2V5TG9hZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTE9BREVEOiAnaGxzS2V5TG9hZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUkVBTV9TVEFURV9UUkFOU0lUSU9OOiAnaGxzU3RyZWFtU3RhdGVUcmFuc2l0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJVkVfQkFDS19CVUZGRVJfUkVBQ0hFRDogJ2hsc0xpdmVCYWNrQnVmZmVyUmVhY2hlZCcKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG47CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5ORVRXT1JLX0VSUk9SID0gJ25ldHdvcmtFcnJvcicsIHQuTUVESUFfRVJST1IgPSAnbWVkaWFFcnJvcicsIHQuS0VZX1NZU1RFTV9FUlJPUiA9ICdrZXlTeXN0ZW1FcnJvcicsIHQuTVVYX0VSUk9SID0gJ211eEVycm9yJywgdC5PVEhFUl9FUlJPUiA9ICdvdGhlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuS0VZX1NZU1RFTV9OT19LRVlTID0gJ2tleVN5c3RlbU5vS2V5cycsIHQuS0VZX1NZU1RFTV9OT19BQ0NFU1MgPSAna2V5U3lzdGVtTm9BY2Nlc3MnLCB0LktFWV9TWVNURU1fTk9fU0VTU0lPTiA9ICdrZXlTeXN0ZW1Ob1Nlc3Npb24nLCB0LktFWV9TWVNURU1fTElDRU5TRV9SRVFVRVNUX0ZBSUxFRCA9ICdrZXlTeXN0ZW1MaWNlbnNlUmVxdWVzdEZhaWxlZCcsIHQuS0VZX1NZU1RFTV9OT19JTklUX0RBVEEgPSAna2V5U3lzdGVtTm9Jbml0RGF0YScsIHQuTUFOSUZFU1RfTE9BRF9FUlJPUiA9ICdtYW5pZmVzdExvYWRFcnJvcicsIHQuTUFOSUZFU1RfTE9BRF9USU1FT1VUID0gJ21hbmlmZXN0TG9hZFRpbWVPdXQnLCB0Lk1BTklGRVNUX1BBUlNJTkdfRVJST1IgPSAnbWFuaWZlc3RQYXJzaW5nRXJyb3InLCB0Lk1BTklGRVNUX0lOQ09NUEFUSUJMRV9DT0RFQ1NfRVJST1IgPSAnbWFuaWZlc3RJbmNvbXBhdGlibGVDb2RlY3NFcnJvcicsIHQuTEVWRUxfTE9BRF9FUlJPUiA9ICdsZXZlbExvYWRFcnJvcicsIHQuTEVWRUxfTE9BRF9USU1FT1VUID0gJ2xldmVsTG9hZFRpbWVPdXQnLCB0LkxFVkVMX1NXSVRDSF9FUlJPUiA9ICdsZXZlbFN3aXRjaEVycm9yJywgdC5BVURJT19UUkFDS19MT0FEX0VSUk9SID0gJ2F1ZGlvVHJhY2tMb2FkRXJyb3InLCB0LkFVRElPX1RSQUNLX0xPQURfVElNRU9VVCA9ICdhdWRpb1RyYWNrTG9hZFRpbWVPdXQnLCB0LkZSQUdfTE9BRF9FUlJPUiA9ICdmcmFnTG9hZEVycm9yJywgdC5GUkFHX0xPQURfVElNRU9VVCA9ICdmcmFnTG9hZFRpbWVPdXQnLCB0LkZSQUdfREVDUllQVF9FUlJPUiA9ICdmcmFnRGVjcnlwdEVycm9yJywgdC5GUkFHX1BBUlNJTkdfRVJST1IgPSAnZnJhZ1BhcnNpbmdFcnJvcicsIHQuUkVNVVhfQUxMT0NfRVJST1IgPSAncmVtdXhBbGxvY0Vycm9yJywgdC5LRVlfTE9BRF9FUlJPUiA9ICdrZXlMb2FkRXJyb3InLCB0LktFWV9MT0FEX1RJTUVPVVQgPSAna2V5TG9hZFRpbWVPdXQnLCB0LkJVRkZFUl9BRERfQ09ERUNfRVJST1IgPSAnYnVmZmVyQWRkQ29kZWNFcnJvcicsIHQuQlVGRkVSX0FQUEVORF9FUlJPUiA9ICdidWZmZXJBcHBlbmRFcnJvcicsIHQuQlVGRkVSX0FQUEVORElOR19FUlJPUiA9ICdidWZmZXJBcHBlbmRpbmdFcnJvcicsIHQuQlVGRkVSX1NUQUxMRURfRVJST1IgPSAnYnVmZmVyU3RhbGxlZEVycm9yJywgdC5CVUZGRVJfRlVMTF9FUlJPUiA9ICdidWZmZXJGdWxsRXJyb3InLCB0LkJVRkZFUl9TRUVLX09WRVJfSE9MRSA9ICdidWZmZXJTZWVrT3ZlckhvbGUnLCB0LkJVRkZFUl9OVURHRV9PTl9TVEFMTCA9ICdidWZmZXJOdWRnZU9uU3RhbGwnLCB0LklOVEVSTkFMX0VYQ0VQVElPTiA9ICdpbnRlcm5hbEV4Y2VwdGlvbic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBOdW1iZXIuaXNGaW5pdGUgfHwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgdCAmJiBpc0Zpbml0ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoNSksIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNIZWFkZXIgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIDEwIDw9IHQubGVuZ3RoICYmIDczID09PSB0W2ldICYmIDY4ID09PSB0W2kgKyAxXSAmJiA1MSA9PT0gdFtpICsgMl0gJiYgdFtpICsgM10gPCAyNTUgJiYgdFtpICsgNF0gPCAyNTUgJiYgdFtpICsgNl0gPCAxMjggJiYgdFtpICsgN10gPCAxMjggJiYgdFtpICsgOF0gPCAxMjggJiYgdFtpICsgOV0gPCAxMjg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5pc0Zvb3RlciA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgMTAgPD0gdC5sZW5ndGggJiYgNTEgPT09IHRbaV0gJiYgNjggPT09IHRbaSArIDFdICYmIDczID09PSB0W2kgKyAyXSAmJiB0W2kgKyAzXSA8IDI1NSAmJiB0W2kgKyA0XSA8IDI1NSAmJiB0W2kgKyA2XSA8IDEyOCAmJiB0W2kgKyA3XSA8IDEyOCAmJiB0W2kgKyA4XSA8IDEyOCAmJiB0W2kgKyA5XSA8IDEyODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmdldElEM0RhdGEgPSBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gZSwgbiA9IDA7IHQuaXNIZWFkZXIoaSwgZSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAxMCwgbiArPSB0LlooaSwgZSArIDYpLCB0LmlzRm9vdGVyKGksIGUgKyAxMCkgJiYgKG4gKz0gMTApLCBlICs9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN1YmFycmF5KHMsIHMgKyBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LlogPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gKDEyNyAmIHRbaV0pIDw8IDIxLCBlIHw9ICgxMjcgJiB0W2kgKyAxXSkgPDwgMTQsIGUgfD0gKDEyNyAmIHRbaSArIDJdKSA8PCA3LCBlIHw9IDEyNyAmIHRbaSArIDNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0VGltZVN0YW1wID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHQuZ2V0SUQzRnJhbWVzKGkpLCBzID0gMDsgcyA8IGUubGVuZ3RoOyBzKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmlzVGltZVN0YW1wRnJhbWUobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmlzVGltZVN0YW1wRnJhbWUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnUFJJVicgPT09IHQua2V5ICYmICdjb20uYXBwbGUuc3RyZWFtaW5nLnRyYW5zcG9ydFN0cmVhbVRpbWVzdGFtcCcgPT09IHQuaW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lml0ID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGlbMF0sIGlbMV0sIGlbMl0sIGlbM10pLCBzID0gdC5aKGksIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpLnN1YmFycmF5KDEwLCAxMCArIHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRJRDNGcmFtZXMgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgcyA9IFtdOyB0LmlzSGVhZGVyKGksIGUpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQuWihpLCBlICsgNiksIHIgPSAoZSArPSAxMCkgKyBuOyBlICsgOCA8IHI7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0Lml0KGkuc3ViYXJyYXkoZSkpLCBhID0gdC5ldChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIHMucHVzaChhKSwgZSArPSBoLnNpemUgKyAxMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaXNGb290ZXIoaSwgZSkgJiYgKGUgKz0gMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZXQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1BSSVYnID09PSBpLnR5cGUgPyB0LnN0KGkpIDogJ1QnID09PSBpLnR5cGVbMF0gPyB0Lm50KGkpIDogJ1cnID09PSBpLnR5cGVbMF0gPyB0LnJ0KGkpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQudHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoOCA9PT0gdC5kYXRhLmJ5dGVMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IFVpbnQ4QXJyYXkodC5kYXRhKSwgZSA9IDEgJiBpWzNdLCBzID0gKGlbNF0gPDwgMjMpICsgKGlbNV0gPDwgMTUpICsgKGlbNl0gPDwgNykgKyBpWzddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgLz0gNDUsIGUgJiYgKHMgKz0gNDc3MjE4NTguODQpLCBNYXRoLnJvdW5kKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5zdCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGkuc2l6ZSA8IDIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuaHQoaS5kYXRhLCAhMCksIHMgPSBuZXcgVWludDhBcnJheShpLmRhdGEuc3ViYXJyYXkoZS5sZW5ndGggKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm86IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcy5idWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm50ID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaS5zaXplIDwgMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnVFhYWCcgPT09IGkudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMSwgcyA9IHQuaHQoaS5kYXRhLnN1YmFycmF5KGUpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSArPSBzLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0Lmh0KGkuZGF0YS5zdWJhcnJheShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBpLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm86IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0Lmh0KGkuZGF0YS5zdWJhcnJheSgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaS50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnJ0ID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdXWFhYJyA9PT0gaS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5zaXplIDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDEsIHMgPSB0Lmh0KGkuZGF0YS5zdWJhcnJheShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IHMubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5odChpLmRhdGEuc3ViYXJyYXkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGkudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0Lmh0KGkuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGkudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lmh0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5kZWNvZGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy5pbmRleE9mKCdcMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gbiA/IHMuc3Vic3RyaW5nKDAsIG4pIDogczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1wwL2csICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByLCBhLCBvLCBjID0gdC5sZW5ndGgsIHUgPSAnJywgbCA9IDA7IGwgPCBjOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IChyID0gdFtsKytdKSAmJiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IHIgJiYgMyAhPT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIgPj4gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdFtsKytdLCB1ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKDMxICYgcikgPDwgNiB8IDYzICYgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0W2wrK10sIG8gPSB0W2wrK10sIHUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoMTUgJiByKSA8PCAxMiB8ICg2MyAmIGEpIDw8IDYgfCAoNjMgJiBvKSA8PCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0KG4uYSkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzIHx8IHZvaWQgMCA9PT0gdC5UZXh0RGVjb2RlciB8fCAocyA9IG5ldyB0LlRleHREZWNvZGVyKCd1dGYtOCcpKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHIuaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYSA9IHI7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIHdpbmRvdyA/IHNlbGYgOiB3aW5kb3cuY254UmVuZGVyV2luZG93ID8gd2luZG93LmNueFJlbmRlcldpbmRvdyA6IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiwgciwgaCwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC9eKCg/OlthLXpBLVowLTkrXC0uXSs6KT8pKFwvXC9bXlwvPyNdKik/KCg/OlteXC9cPyNdKlwvKSouKj8pPz8oOy4qPyk/KFw/Lio/KT8oIy4qPyk/JC8sIG4gPSAvXihbXlwvPyNdKikoLiopJC8sIHIgPSAvKD86XC98XilcLig/PVwvKS9nLCBoID0gLyg/OlwvfF4pXC5cLlwvKD8hXC5cLlwvKS4qPyg/PVwvKS9nLCBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRBYnNvbHV0ZVVSTDogZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9IGUgfHwge30sIHQgPSB0LnRyaW0oKSwgIShpID0gaS50cmltKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5hbHdheXNOb3JtYWxpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBhLnBhcnNlVVJMKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwYXJzZSBiYXNlIFVSTC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucGF0aCA9IGEubm9ybWFsaXplUGF0aChzLnBhdGgpLCBhLmJ1aWxkVVJMRnJvbVBhcnRzKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEucGFyc2VVUkwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwYXJzZSByZWxhdGl2ZSBVUkwuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuc2NoZW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hbHdheXNOb3JtYWxpemUgPyAoci5wYXRoID0gYS5ub3JtYWxpemVQYXRoKHIucGF0aCksIGEuYnVpbGRVUkxGcm9tUGFydHMocikpIDogaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEucGFyc2VVUkwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwYXJzZSBiYXNlIFVSTC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgubmV0TG9jICYmIGgucGF0aCAmJiAnLycgIT09IGgucGF0aFswXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZXhlYyhoLnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLm5ldExvYyA9IG9bMV0sIGgucGF0aCA9IG9bMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgubmV0TG9jICYmICFoLnBhdGggJiYgKGgucGF0aCA9ICcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZTogaC5zY2hlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldExvYzogci5uZXRMb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogci5wYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiByLnF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudDogci5mcmFnbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyLm5ldExvYyAmJiAoYy5uZXRMb2MgPSBoLm5ldExvYywgJy8nICE9PSByLnBhdGhbMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5wYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGgucGF0aCwgbCA9IHUuc3Vic3RyaW5nKDAsIHUubGFzdEluZGV4T2YoJy8nKSArIDEpICsgci5wYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wYXRoID0gYS5ub3JtYWxpemVQYXRoKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucGF0aCA9IGgucGF0aCwgci5wYXJhbXMgfHwgKGMucGFyYW1zID0gaC5wYXJhbXMsIHIucXVlcnkgfHwgKGMucXVlcnkgPSBoLnF1ZXJ5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IGMucGF0aCAmJiAoYy5wYXRoID0gZS5hbHdheXNOb3JtYWxpemUgPyBhLm5vcm1hbGl6ZVBhdGgoci5wYXRoKSA6IHIucGF0aCksIGEuYnVpbGRVUkxGcm9tUGFydHMoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VVUkw6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBzLmV4ZWModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZTogaVsxXSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0TG9jOiBpWzJdIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBpWzNdIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGlbNF0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBpWzVdIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudDogaVs2XSB8fCAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZVBhdGg6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gdC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpLnJlcGxhY2UociwgJycpOyB0Lmxlbmd0aCAhPT0gKHQgPSB0LnJlcGxhY2UoaCwgJycpKS5sZW5ndGg7KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdCgnJykucmV2ZXJzZSgpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkVVJMRnJvbVBhcnRzOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNjaGVtZSArIHQubmV0TG9jICsgdC5wYXRoICsgdC5wYXJhbXMgKyB0LnF1ZXJ5ICsgdC5mcmFnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5leHBvcnRzID0gYTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCBuID0gJ34nOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbiA9IHQsIHRoaXMuY29udGV4dCA9IGksIHRoaXMub25jZSA9IGUgfHwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBpLCBlLCBzLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBoKGUsIHMgfHwgdCwgciksIG8gPSBuID8gbiArIGkgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYXRbb10gPyB0LmF0W29dLmZuID8gdC5hdFtvXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmF0W29dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiB0LmF0W29dLnB1c2goYSkgOiAodC5hdFtvXSA9IGEsIHQub3QrKyksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID09IC0tdC5vdCA/IHQuYXQgPSBuZXcgcigpIDogZGVsZXRlIHQuYXRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXQgPSBuZXcgcigpLCB0aGlzLm90ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuY3JlYXRlICYmIChyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCksIG5ldyByKCkuX19wcm90b19fIHx8IChuID0gITEpKSwgYy5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpLCBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdGhpcy5vdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiB0ID0gdGhpcy5hdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNhbGwodCwgaSkgJiYgZS5wdXNoKG4gPyBpLnNsaWNlKDEpIDogaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IGUuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbiA/IG4gKyB0IDogdCwgZSA9IHRoaXMuYXRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZm4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlLmZuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwLCByID0gZS5sZW5ndGgsIGggPSBuZXcgQXJyYXkocik7IHMgPCByOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFtzXSA9IGVbc10uZm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4gPyBuICsgdCA6IHQsIGUgPSB0aGlzLmF0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlLmZuID8gMSA6IGUubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCByLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4gPyBuICsgdCA6IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXRbYV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGMsIHUgPSB0aGlzLmF0W2FdLCBsID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1LmZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh1Lm9uY2UgJiYgdGhpcy5yZW1vdmVMaXN0ZW5lcih0LCB1LmZuLCB2b2lkIDAsICEwKSwgbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuZm4uY2FsbCh1LmNvbnRleHQpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmZuLmNhbGwodS5jb250ZXh0LCBpKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5mbi5jYWxsKHUuY29udGV4dCwgaSwgZSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuZm4uY2FsbCh1LmNvbnRleHQsIGksIGUsIHMpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmZuLmNhbGwodS5jb250ZXh0LCBpLCBlLCBzLCByKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5mbi5jYWxsKHUuY29udGV4dCwgaSwgZSwgcywgciwgaCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAxLCBvID0gbmV3IEFycmF5KGwgLSAxKTsgYyA8IGw7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1tjIC0gMV0gPSBhcmd1bWVudHNbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5mbi5hcHBseSh1LmNvbnRleHQsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgZiA9IHUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBmOyBjKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodVtjXS5vbmNlICYmIHRoaXMucmVtb3ZlTGlzdGVuZXIodCwgdVtjXS5mbiwgdm9pZCAwLCAhMCksIGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtjXS5mbi5jYWxsKHVbY10uY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtjXS5mbi5jYWxsKHVbY10uY29udGV4dCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtjXS5mbi5jYWxsKHVbY10uY29udGV4dCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtjXS5mbi5jYWxsKHVbY10uY29udGV4dCwgaSwgZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSAxLCBvID0gbmV3IEFycmF5KGwgLSAxKTsgZCA8IGw7IGQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1tkIC0gMV0gPSBhcmd1bWVudHNbZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1W2NdLmZuLmFwcGx5KHVbY10uY29udGV4dCwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEodGhpcywgdCwgaSwgZSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKHRoaXMsIHQsIGksIGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuID8gbiArIHQgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmF0W3JdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHRoaXMsIHIpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0aGlzLmF0W3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGguZm4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5mbiAhPT0gaSB8fCBzICYmICFoLm9uY2UgfHwgZSAmJiBoLmNvbnRleHQgIT09IGUgfHwgbyh0aGlzLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBjID0gW10sIHUgPSBoLmxlbmd0aDsgYSA8IHU7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhbYV0uZm4gIT09IGkgfHwgcyAmJiAhaFthXS5vbmNlIHx8IGUgJiYgaFthXS5jb250ZXh0ICE9PSBlKSAmJiBjLnB1c2goaFthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5sZW5ndGggPyB0aGlzLmF0W3JdID0gMSA9PT0gYy5sZW5ndGggPyBjWzBdIDogYyA6IG8odGhpcywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyAoaSA9IG4gPyBuICsgdCA6IHQsIHRoaXMuYXRbaV0gJiYgbyh0aGlzLCBpKSkgOiAodGhpcy5hdCA9IG5ldyByKCksIHRoaXMub3QgPSAwKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUub2ZmID0gYy5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsIGMucHJvdG90eXBlLmFkZExpc3RlbmVyID0gYy5wcm90b3R5cGUub24sIGMucHJlZml4ZWQgPSBuLCBjLkV2ZW50RW1pdHRlciA9IGMsIHQuZXhwb3J0cyA9IGM7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZSgxKSwgbiA9IGUoMiksIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VidGxlID0gdCwgdGhpcy5hZXNJViA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5kZWNyeXB0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VidGxlLmRlY3J5cHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DQkMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXY6IHRoaXMuYWVzSVYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJ0bGUgPSB0LCB0aGlzLmtleSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5leHBhbmRLZXkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIHRoaXMua2V5LCB7IG5hbWU6ICdBRVMtQ0JDJyB9LCAhMSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY3J5cHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlY3J5cHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yY29uID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuc3ViTWl4ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQzMkFycmF5KDI1NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDMyQXJyYXkoMjU2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVaW50MzJBcnJheSgyNTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQzMkFycmF5KDI1NikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy5pbnZTdWJNaXggPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDMyQXJyYXkoMjU2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVaW50MzJBcnJheSgyNTYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQzMkFycmF5KDI1NiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVWludDMyQXJyYXkoMjU2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLnNCb3ggPSBuZXcgVWludDMyQXJyYXkoMjU2KSwgdGhpcy5pbnZTQm94ID0gbmV3IFVpbnQzMkFycmF5KDI1NiksIHRoaXMua2V5ID0gbmV3IFVpbnQzMkFycmF5KDApLCB0aGlzLmluaXRUYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnVpbnQ4QXJyYXlUb1VpbnQzMkFycmF5XyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBuZXcgRGF0YVZpZXcodCksIGUgPSBuZXcgVWludDMyQXJyYXkoNCksIHMgPSAwOyBzIDwgNDsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtzXSA9IGkuZ2V0VWludDMyKDQgKiBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5pbml0VGFibGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5zQm94LCBpID0gdGhpcy5pbnZTQm94LCBlID0gdGhpcy5zdWJNaXgsIHMgPSBlWzBdLCBuID0gZVsxXSwgciA9IGVbMl0sIGggPSBlWzNdLCBhID0gdGhpcy5pbnZTdWJNaXgsIG8gPSBhWzBdLCBjID0gYVsxXSwgdSA9IGFbMl0sIGwgPSBhWzNdLCBkID0gbmV3IFVpbnQzMkFycmF5KDI1NiksIGYgPSAwLCBwID0gMCwgYiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCAyNTY7IGIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbYl0gPSBiIDwgMTI4ID8gYiA8PCAxIDogYiA8PCAxIF4gMjgzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgMjU2OyBiKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gcCBeIHAgPDwgMSBeIHAgPDwgMiBeIHAgPDwgMyBeIHAgPDwgNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2ID4+PiA4IF4gMjU1ICYgdiBeIDk5LCB0W2ZdID0gdiwgaVt2XSA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGRbZl0sIGcgPSBkW21dLCB5ID0gZFtnXSwgdyA9IDI1NyAqIGRbdl0gXiAxNjg0MzAwOCAqIHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2ZdID0gdyA8PCAyNCB8IHcgPj4+IDgsIG5bZl0gPSB3IDw8IDE2IHwgdyA+Pj4gMTYsIHJbZl0gPSB3IDw8IDggfCB3ID4+PiAyNCwgaFtmXSA9IHcsIHcgPSAxNjg0MzAwOSAqIHkgXiA2NTUzNyAqIGcgXiAyNTcgKiBtIF4gMTY4NDMwMDggKiBmLCBvW3ZdID0gdyA8PCAyNCB8IHcgPj4+IDgsIGNbdl0gPSB3IDw8IDE2IHwgdyA+Pj4gMTYsIHVbdl0gPSB3IDw8IDggfCB3ID4+PiAyNCwgbFt2XSA9IHcsIGYgPyAoZiA9IG0gXiBkW2RbZFt5IF4gbV1dXSwgcCBePSBkW2RbcF1dKSA6IGYgPSBwID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZXhwYW5kS2V5ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMudWludDhBcnJheVRvVWludDMyQXJyYXlfKHQpLCBlID0gITAsIHMgPSAwOyBzIDwgaS5sZW5ndGggJiYgZTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaVtzXSA9PT0gdGhpcy5rZXlbc10sIHMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtleSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMua2V5U2l6ZSA9IGkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDQgIT09IG4gJiYgNiAhPT0gbiAmJiA4ICE9PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZXMga2V5IHNpemU9JyArIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGgsIGEsIG8sIGMgPSB0aGlzLmtzUm93cyA9IDQgKiAobiArIDYgKyAxKSwgdSA9IHRoaXMua2V5U2NoZWR1bGUgPSBuZXcgVWludDMyQXJyYXkoYyksIGwgPSB0aGlzLmludktleVNjaGVkdWxlID0gbmV3IFVpbnQzMkFycmF5KGMpLCBkID0gdGhpcy5zQm94LCBmID0gdGhpcy5yY29uLCBwID0gdGhpcy5pbnZTdWJNaXgsIGIgPSBwWzBdLCB2ID0gcFsxXSwgbSA9IHBbMl0sIGcgPSBwWzNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IGM7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIDwgbiA/IGEgPSB1W3JdID0gaVtyXSA6IChvID0gYSwgciAlIG4gPT0gMCA/IChvID0gZFsobyA9IG8gPDwgOCB8IG8gPj4+IDI0KSA+Pj4gMjRdIDw8IDI0IHwgZFtvID4+PiAxNiAmIDI1NV0gPDwgMTYgfCBkW28gPj4+IDggJiAyNTVdIDw8IDggfCBkWzI1NSAmIG9dLCBvIF49IGZbciAvIG4gfCAwXSA8PCAyNCkgOiBuID4gNiAmJiByICUgbiA9PSA0ICYmIChvID0gZFtvID4+PiAyNF0gPDwgMjQgfCBkW28gPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGRbbyA+Pj4gOCAmIDI1NV0gPDwgOCB8IGRbMjU1ICYgb10pLCB1W3JdID0gYSA9ICh1W3IgLSBuXSBeIG8pID4+PiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaCA9IDA7IGggPCBjOyBoKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGMgLSBoLCBvID0gMyAmIGggPyB1W3JdIDogdVtyIC0gNF0sIGxbaF0gPSBoIDwgNCB8fCByIDw9IDQgPyBvIDogYltkW28gPj4+IDI0XV0gXiB2W2RbbyA+Pj4gMTYgJiAyNTVdXSBeIG1bZFtvID4+PiA4ICYgMjU1XV0gXiBnW2RbMjU1ICYgb11dLCBsW2hdID0gbFtoXSA+Pj4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkubmV0d29ya1RvSG9zdE9yZGVyU3dhcCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IDw8IDI0IHwgKDY1MjgwICYgdCkgPDwgOCB8ICgxNjcxMTY4MCAmIHQpID4+IDggfCB0ID4+PiAyNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlY3J5cHQgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCByLCBoLCBhLCBvLCBjLCB1LCBsLCBkLCBmLCBwLCBiLCB2LCBtLCBnLCB5LCB3LCBPID0gdGhpcy5rZXlTaXplICsgNiwgeCA9IHRoaXMuaW52S2V5U2NoZWR1bGUsIFMgPSB0aGlzLmludlNCb3gsIGogPSB0aGlzLmludlN1Yk1peCwgayA9IGpbMF0sIF8gPSBqWzFdLCBBID0galsyXSwgSSA9IGpbM10sIEMgPSB0aGlzLnVpbnQ4QXJyYXlUb1VpbnQzMkFycmF5XyhlKSwgVCA9IENbMF0sIFAgPSBDWzFdLCBNID0gQ1syXSwgRSA9IENbM10sIEwgPSBuZXcgSW50MzJBcnJheSh0KSwgUiA9IG5ldyBJbnQzMkFycmF5KEwubGVuZ3RoKSwgQiA9IHRoaXMubmV0d29ya1RvSG9zdE9yZGVyU3dhcDsgaSA8IEwubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChkID0gQihMW2ldKSwgZiA9IEIoTFtpICsgMV0pLCBwID0gQihMW2kgKyAyXSksIGIgPSBCKExbaSArIDNdKSwgbyA9IGQgXiB4WzBdLCBjID0gYiBeIHhbMV0sIHUgPSBwIF4geFsyXSwgbCA9IGYgXiB4WzNdLCB2ID0gNCwgbSA9IDE7IG0gPCBPOyBtKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGtbbyA+Pj4gMjRdIF4gX1tjID4+IDE2ICYgMjU1XSBeIEFbdSA+PiA4ICYgMjU1XSBeIElbMjU1ICYgbF0gXiB4W3ZdLCByID0ga1tjID4+PiAyNF0gXiBfW3UgPj4gMTYgJiAyNTVdIF4gQVtsID4+IDggJiAyNTVdIF4gSVsyNTUgJiBvXSBeIHhbdiArIDFdLCBoID0ga1t1ID4+PiAyNF0gXiBfW2wgPj4gMTYgJiAyNTVdIF4gQVtvID4+IDggJiAyNTVdIF4gSVsyNTUgJiBjXSBeIHhbdiArIDJdLCBhID0ga1tsID4+PiAyNF0gXiBfW28gPj4gMTYgJiAyNTVdIF4gQVtjID4+IDggJiAyNTVdIF4gSVsyNTUgJiB1XSBeIHhbdiArIDNdLCBvID0gbiwgYyA9IHIsIHUgPSBoLCBsID0gYSwgdiArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IFNbbyA+Pj4gMjRdIDw8IDI0IF4gU1tjID4+IDE2ICYgMjU1XSA8PCAxNiBeIFNbdSA+PiA4ICYgMjU1XSA8PCA4IF4gU1syNTUgJiBsXSBeIHhbdl0sIHIgPSBTW2MgPj4+IDI0XSA8PCAyNCBeIFNbdSA+PiAxNiAmIDI1NV0gPDwgMTYgXiBTW2wgPj4gOCAmIDI1NV0gPDwgOCBeIFNbMjU1ICYgb10gXiB4W3YgKyAxXSwgaCA9IFNbdSA+Pj4gMjRdIDw8IDI0IF4gU1tsID4+IDE2ICYgMjU1XSA8PCAxNiBeIFNbbyA+PiA4ICYgMjU1XSA8PCA4IF4gU1syNTUgJiBjXSBeIHhbdiArIDJdLCBhID0gU1tsID4+PiAyNF0gPDwgMjQgXiBTW28gPj4gMTYgJiAyNTVdIDw8IDE2IF4gU1tjID4+IDggJiAyNTVdIDw8IDggXiBTWzI1NSAmIHVdIF4geFt2ICsgM10sIHYgKz0gMywgUltpXSA9IEIobiBeIFQpLCBSW2kgKyAxXSA9IEIoYSBeIFApLCBSW2kgKyAyXSA9IEIoaCBeIE0pLCBSW2kgKyAzXSA9IEIociBeIEUpLCBUID0gZCwgUCA9IGYsIE0gPSBwLCBFID0gYiwgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzID8gKGcgPSBSLmJ1ZmZlciwgeSA9IGcuYnl0ZUxlbmd0aCwgKHcgPSB5ICYmIG5ldyBEYXRhVmlldyhnKS5nZXRVaW50OCh5IC0gMSkpID8gZy5zbGljZSgwLCB5IC0gdykgOiBnKSA6IFIuYnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rZXkgPSB2b2lkIDAsIHRoaXMua2V5U2l6ZSA9IHZvaWQgMCwgdGhpcy5rc1Jvd3MgPSB2b2lkIDAsIHRoaXMuc0JveCA9IHZvaWQgMCwgdGhpcy5pbnZTQm94ID0gdm9pZCAwLCB0aGlzLnN1Yk1peCA9IHZvaWQgMCwgdGhpcy5pbnZTdWJNaXggPSB2b2lkIDAsIHRoaXMua2V5U2NoZWR1bGUgPSB2b2lkIDAsIHRoaXMuaW52S2V5U2NoZWR1bGUgPSB2b2lkIDAsIHRoaXMucmNvbiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBvID0gZSgwKSwgYyA9IGUoNSksIHUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gKHZvaWQgMCA9PT0gZSA/IHt9IDogZSkucmVtb3ZlUEtDUzdQYWRkaW5nLCBuID0gdm9pZCAwID09PSBzIHx8IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ0VuYWJsZWQgPSAhMCwgdGhpcy5vYnNlcnZlciA9IHQsIHRoaXMuY29uZmlnID0gaSwgdGhpcy5yZW1vdmVQS0NTN1BhZGRpbmcgPSBuLCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdChjLmEpKCkuY3J5cHRvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgKHRoaXMuc3VidGxlID0gci5zdWJ0bGUgfHwgci53ZWJraXRTdWJ0bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVXZWJDcnlwdG8gPSAhdGhpcy5zdWJ0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaXNTeW5jID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlV2ViQ3J5cHRvICYmIHRoaXMuY29uZmlnLmVuYWJsZVNvZnR3YXJlQUVTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVjcnlwdCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVdlYkNyeXB0byAmJiB0aGlzLmNvbmZpZy5lbmFibGVTb2Z0d2FyZUFFUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dFbmFibGVkICYmIChvLmIubG9nKCdKUyBBRVMgZGVjcnlwdCcpLCB0aGlzLmxvZ0VuYWJsZWQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHRoaXMuZGVjcnlwdG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCAodGhpcy5kZWNyeXB0b3IgPSBjID0gbmV3IGEoKSksIGMuZXhwYW5kS2V5KGkpLCBzKGMuZGVjcnlwdCh0LCAwLCBlLCB0aGlzLnJlbW92ZVBLQ1M3UGFkZGluZykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dFbmFibGVkICYmIChvLmIubG9nKCdXZWJDcnlwdG8gQUVTIGRlY3J5cHQnKSwgdGhpcy5sb2dFbmFibGVkID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB0aGlzLnN1YnRsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2V5ICE9PSBpICYmICh0aGlzLmtleSA9IGksIHRoaXMuZmFzdEFlc0tleSA9IG5ldyBoKHUsIGkpKSwgdGhpcy5mYXN0QWVzS2V5LmV4cGFuZEtleSgpLnRoZW4oZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcih1LCBlKS5kZWNyeXB0KHQsIGgpLmNhdGNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ub25XZWJDcnlwdG9FcnJvcihyLCB0LCBpLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ub25XZWJDcnlwdG9FcnJvcihyLCB0LCBpLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5vbldlYkNyeXB0b0Vycm9yID0gZnVuY3Rpb24gKHQsIGksIGUsIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZW5hYmxlU29mdHdhcmVBRVMgPyAoby5iLmxvZygnV2ViQ3J5cHRvIEVycm9yLCBkaXNhYmxlIFdlYkNyeXB0byBBUEknKSwgdGhpcy5kaXNhYmxlV2ViQ3J5cHRvID0gITAsIHRoaXMubG9nRW5hYmxlZCA9ICEwLCB0aGlzLmRlY3J5cHQoaSwgZSwgciwgaCkpIDogKG8uYi5lcnJvcignZGVjcnlwdGluZyBlcnJvciA6ICcgKyB0Lm1lc3NhZ2UpLCB0aGlzLm9ic2VydmVyLnRyaWdnZXIocy5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBuLmEuRlJBR19ERUNSWVBUX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0Lm1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmRlY3J5cHRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAodC5kZXN0cm95KCksIHRoaXMuZGVjcnlwdG9yID0gdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBsID0gZSgzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjU1ID09PSB0W2ldICYmIDI0MCA9PSAoMjQ2ICYgdFtpICsgMV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgJiB0W2kgKyAxXSA/IDcgOiA5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgzICYgdFtpICsgM10pIDw8IDExIHwgdFtpICsgNF0gPDwgMyB8ICgyMjQgJiB0W2kgKyA1XSkgPj4+IDU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoaSArIDEgPCB0Lmxlbmd0aCAmJiBkKHQsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKHQsIGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyA1IDwgdC5sZW5ndGggJiYgKGUgPSBwKHQsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGkgKyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09PSB0Lmxlbmd0aCB8fCBzICsgMSA8IHQubGVuZ3RoICYmIGQodCwgcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQsIGksIGUsIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5zYW1wbGVyYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAodCwgaSwgZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgYSwgYywgdSwgbCwgZCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwgZiA9IHIsIHAgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IDEgKyAoKDE5MiAmIGlbZSArIDJdKSA+Pj4gNiksICEoKGEgPSAoNjAgJiBpW2UgKyAyXSkgPj4+IDIpID4gcC5sZW5ndGggLSAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1ID0gKDEgJiBpW2UgKyAyXSkgPDwgMiwgdSB8PSAoMTkyICYgaVtlICsgM10pID4+PiA2LCBvLmIubG9nKCdtYW5pZmVzdCBjb2RlYzonICsgciArICcsQURUUyBkYXRhOnR5cGU6JyArIGggKyAnLHNhbXBsZWluZ0luZGV4OicgKyBhICsgJ1snICsgcFthXSArICdIel0sY2hhbm5lbENvbmZpZzonICsgdSksIC9maXJlZm94L2kudGVzdChkKSA/IGEgPj0gNiA/IChoID0gNSwgbCA9IG5ldyBBcnJheSg0KSwgYyA9IGEgLSAzKSA6IChoID0gMiwgbCA9IG5ldyBBcnJheSgyKSwgYyA9IGEpIDogLTEgIT09IGQuaW5kZXhPZignYW5kcm9pZCcpID8gKGggPSAyLCBsID0gbmV3IEFycmF5KDIpLCBjID0gYSkgOiAoaCA9IDUsIGwgPSBuZXcgQXJyYXkoNCksIHIgJiYgKC0xICE9PSByLmluZGV4T2YoJ21wNGEuNDAuMjknKSB8fCAtMSAhPT0gci5pbmRleE9mKCdtcDRhLjQwLjUnKSkgfHwgIXIgJiYgYSA+PSA2ID8gYyA9IGEgLSAzIDogKChyICYmIC0xICE9PSByLmluZGV4T2YoJ21wNGEuNDAuMicpICYmIChhID49IDYgJiYgMSA9PT0gdSB8fCAvdml2YWxkaS9pLnRlc3QoZCkpIHx8ICFyICYmIDEgPT09IHUpICYmIChoID0gMiwgbCA9IG5ldyBBcnJheSgyKSksIGMgPSBhKSksIGxbMF0gPSBoIDw8IDMsIGxbMF0gfD0gKDE0ICYgYSkgPj4gMSwgbFsxXSB8PSAoMSAmIGEpIDw8IDcsIGxbMV0gfD0gdSA8PCAzLCA1ID09PSBoICYmIChsWzFdIHw9ICgxNCAmIGMpID4+IDEsIGxbMl0gPSAoMSAmIGMpIDw8IDcsIGxbMl0gfD0gOCwgbFszXSA9IDApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGU6IHBbYV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiAnbXA0YS40MC4nICsgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdENvZGVjOiBmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRyaWdnZXIocy5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBuLmEuRlJBR19QQVJTSU5HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnaW52YWxpZCBBRFRTIHNhbXBsaW5nIGluZGV4OicgKyBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgZSwgciwgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jb25maWcgPSBhLmNvbmZpZywgdC5zYW1wbGVyYXRlID0gYS5zYW1wbGVyYXRlLCB0LmNoYW5uZWxDb3VudCA9IGEuY2hhbm5lbENvdW50LCB0LmNvZGVjID0gYS5jb2RlYywgdC5tYW5pZmVzdENvZGVjID0gYS5tYW5pZmVzdENvZGVjLCBvLmIubG9nKCdwYXJzZWQgY29kZWM6JyArIHQuY29kZWMgKyAnLHJhdGU6JyArIGEuc2FtcGxlcmF0ZSArICcsbmIgY2hhbm5lbDonICsgYS5jaGFubmVsQ291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDkyMTYwMDAwIC8gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaCwgYSA9IHQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gZih0LCBpKSwgaCA9IHAodCwgaSksIChoIC09IHIpID4gMCAmJiBpICsgciArIGggPD0gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckxlbmd0aDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbXA6IGUgKyBzICogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpLCBlLCBzLCBuLCBnKHQuc2FtcGxlcmF0ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHIuc3RhbXAsIGEgPSByLmhlYWRlckxlbmd0aCwgbyA9IHIuZnJhbWVMZW5ndGgsIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiBpLnN1YmFycmF5KGUgKyBhLCBlICsgYSArIG8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzOiBoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2FtcGxlcy5wdXNoKGMpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZTogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBvICsgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBlKDQpLCBPID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gdCwgdGhpcy5jb25maWcgPSBlLCB0aGlzLnJlbXV4ZXIgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnJlc2V0SW5pdFNlZ21lbnQgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiAnYXVkaW8vYWR0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXVkaW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUFDOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDb2RlYzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUaW1lU2NhbGU6IDkwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZXNldFRpbWVTdGFtcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb2JlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gKHcuYS5nZXRJRDNEYXRhKHQsIDApIHx8IFtdKS5sZW5ndGgsIGUgPSB0Lmxlbmd0aDsgaSA8IGU7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2KHQsIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmIubG9nKCdBRFRTIHN5bmMgd29yZCBmb3VuZCAhJyksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5hcHBlbmQgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5jdCwgciA9IHcuYS5nZXRJRDNEYXRhKHQsIDApIHx8IFtdLCBoID0gdy5hLmdldFRpbWVTdGFtcChyKSwgYSA9IE9iamVjdChsLmEpKGgpID8gOTAgKiBoIDogOTAwMDAgKiBpLCBjID0gMCwgdSA9IGEsIGQgPSB0Lmxlbmd0aCwgZiA9IHIubGVuZ3RoLCBwID0gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0czogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0czogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07IGYgPCBkIC0gMTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYih0LCBmKSAmJiBmICsgNSA8IGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG4sIHRoaXMub2JzZXJ2ZXIsIHQsIGYsIG4ubWFuaWZlc3RDb2RlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB5KG4sIHQsIGYsIGEsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmIubG9nKCdVbmFibGUgdG8gcGFyc2UgQUFDIGZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICs9IHYubGVuZ3RoLCB1ID0gdi5zYW1wbGUucHRzLCBjKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LmEuaXNIZWFkZXIodCwgZikgPyAociA9IHcuYS5nZXRJRDNEYXRhKHQsIGYpLCBwLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHM6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0czogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmICs9IHIubGVuZ3RoKSA6IGYrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW11eGVyLnJlbXV4KG4sIHsgc2FtcGxlczogW10gfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlczogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VGltZVNjYWxlOiA5MDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7IHNhbXBsZXM6IFtdIH0sIGksIGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB4ID0gZSgxMCksIFMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cmF0ZXNNYXA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZ1JhdGVNYXA6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVzQ29lZmZpY2llbnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzSW5TbG90OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEZyYW1lOiBmdW5jdGlvbiAodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlICsgMjQgPiBpLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5wYXJzZUhlYWRlcihpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICYmIGUgKyByLmZyYW1lTGVuZ3RoIDw9IGkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBzICsgbiAqICg5MDAwMCAqIHIuc2FtcGxlc1BlckZyYW1lIC8gci5zYW1wbGVSYXRlKSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6IGkuc3ViYXJyYXkoZSwgZSArIHIuZnJhbWVMZW5ndGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzOiBoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY29uZmlnID0gW10sIHQuY2hhbm5lbENvdW50ID0gci5jaGFubmVsQ291bnQsIHQuc2FtcGxlcmF0ZSA9IHIuc2FtcGxlUmF0ZSwgdC5zYW1wbGVzLnB1c2goYSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHIuZnJhbWVMZW5ndGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhlYWRlcjogZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0W2kgKyAxXSA+PiAzICYgMywgcyA9IHRbaSArIDFdID4+IDEgJiAzLCBuID0gdFtpICsgMl0gPj4gNCAmIDE1LCByID0gdFtpICsgMl0gPj4gMiAmIDMsIGggPSB0W2kgKyAyXSA+PiAxICYgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgIT09IGUgJiYgMCAhPT0gbiAmJiAxNSAhPT0gbiAmJiAzICE9PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IDMgPT09IGUgPyAzIC0gcyA6IDMgPT09IHMgPyAzIDogNCwgbyA9IDEwMDAgKiBTLkJpdHJhdGVzTWFwWzE0ICogYSArIG4gLSAxXSwgYyA9IDMgPT09IGUgPyAwIDogMiA9PT0gZSA/IDEgOiAyLCB1ID0gUy5TYW1wbGluZ1JhdGVNYXBbMyAqIGMgKyByXSwgbCA9IHRbaSArIDNdID4+IDYgPT0gMyA/IDEgOiAyLCBkID0gUy5TYW1wbGVzQ29lZmZpY2llbnRzW2VdW3NdLCBmID0gUy5CeXRlc0luU2xvdFtzXSwgcCA9IDggKiBkICogZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQ6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGg6IHBhcnNlSW50KGQgKiBvIC8gdSArIGgsIDEwKSAqIGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lOiBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hlYWRlclBhdHRlcm46IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyNTUgPT09IHRbaV0gJiYgMjI0ID09ICgyMjQgJiB0W2kgKyAxXSkgJiYgMCAhPSAoNiAmIHRbaSArIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSGVhZGVyOiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoaSArIDEgPCB0Lmxlbmd0aCAmJiB0aGlzLmlzSGVhZGVyUGF0dGVybih0LCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZTogZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgdC5sZW5ndGggJiYgdGhpcy5pc0hlYWRlclBhdHRlcm4odCwgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5wYXJzZUhlYWRlcih0LCBpKSwgcyA9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUuZnJhbWVMZW5ndGggJiYgKHMgPSBlLmZyYW1lTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gaSArIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9PT0gdC5sZW5ndGggfHwgbiArIDEgPCB0Lmxlbmd0aCAmJiB0aGlzLmlzSGVhZGVyUGF0dGVybih0LCBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGogPSBTLCBrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB0LCB0aGlzLmJ5dGVzQXZhaWxhYmxlID0gdC5ieXRlTGVuZ3RoLCB0aGlzLndvcmQgPSAwLCB0aGlzLmJpdHNBdmFpbGFibGUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxvYWRXb3JkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuZGF0YSwgaSA9IHRoaXMuYnl0ZXNBdmFpbGFibGUsIGUgPSB0LmJ5dGVMZW5ndGggLSBpLCBzID0gbmV3IFVpbnQ4QXJyYXkoNCksIG4gPSBNYXRoLm1pbig0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGJ5dGVzIGF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNldCh0LnN1YmFycmF5KGUsIGUgKyBuKSksIHRoaXMud29yZCA9IG5ldyBEYXRhVmlldyhzLmJ1ZmZlcikuZ2V0VWludDMyKDApLCB0aGlzLmJpdHNBdmFpbGFibGUgPSA4ICogbiwgdGhpcy5ieXRlc0F2YWlsYWJsZSAtPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuc2tpcEJpdHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRzQXZhaWxhYmxlID4gdCA/ICh0aGlzLndvcmQgPDw9IHQsIHRoaXMuYml0c0F2YWlsYWJsZSAtPSB0KSA6ICh0IC09IHRoaXMuYml0c0F2YWlsYWJsZSwgdCAtPSAoaSA9IHQgPj4gMykgPj4gMywgdGhpcy5ieXRlc0F2YWlsYWJsZSAtPSBpLCB0aGlzLmxvYWRXb3JkKCksIHRoaXMud29yZCA8PD0gdCwgdGhpcy5iaXRzQXZhaWxhYmxlIC09IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVhZEJpdHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE1hdGgubWluKHRoaXMuYml0c0F2YWlsYWJsZSwgdCksIGUgPSB0aGlzLndvcmQgPj4+IDMyIC0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPiAzMiAmJiBvLmIuZXJyb3IoJ0Nhbm5vdCByZWFkIG1vcmUgdGhhbiAzMiBiaXRzIGF0IGEgdGltZScpLCB0aGlzLmJpdHNBdmFpbGFibGUgLT0gaSwgdGhpcy5iaXRzQXZhaWxhYmxlID4gMCA/IHRoaXMud29yZCA8PD0gaSA6IHRoaXMuYnl0ZXNBdmFpbGFibGUgPiAwICYmIHRoaXMubG9hZFdvcmQoKSwgKGkgPSB0IC0gaSkgPiAwICYmIHRoaXMuYml0c0F2YWlsYWJsZSA/IGUgPDwgaSB8IHRoaXMucmVhZEJpdHMoaSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuc2tpcExaID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IHRoaXMuYml0c0F2YWlsYWJsZTsgKyt0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gKHRoaXMud29yZCAmIDIxNDc0ODM2NDggPj4+IHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndvcmQgPDw9IHQsIHRoaXMuYml0c0F2YWlsYWJsZSAtPSB0LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkV29yZCgpLCB0ICsgdGhpcy5za2lwTFooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnNraXBVRUcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcEJpdHMoMSArIHRoaXMuc2tpcExaKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuc2tpcEVHID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBCaXRzKDEgKyB0aGlzLnNraXBMWigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlYWRVRUcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5za2lwTFooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHModCArIDEpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlYWRFRyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnJlYWRVRUcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgJiB0ID8gMSArIHQgPj4+IDEgOiAtMSAqICh0ID4+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlYWRCb29sZWFuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gdGhpcy5yZWFkQml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlYWRVQnl0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoOCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZWFkVVNob3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQml0cygxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZWFkVUludCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoMzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuc2tpcFNjYWxpbmdMaXN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUgPSA4LCBzID0gODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQ7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIT09IHMgJiYgKHMgPSAoZSArIHRoaXMucmVhZEVHKCkgKyAyNTYpICUgMjU2KSwgZSA9IDAgPT09IHMgPyBlIDogczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlYWRTUFMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpLCBlLCBzLCBuLCByLCBoLCBhID0gMCwgbyA9IDAsIGMgPSAwLCB1ID0gMCwgbCA9IHRoaXMucmVhZFVCeXRlLmJpbmQodGhpcyksIGQgPSB0aGlzLnJlYWRCaXRzLmJpbmQodGhpcyksIGYgPSB0aGlzLnJlYWRVRUcuYmluZCh0aGlzKSwgcCA9IHRoaXMucmVhZEJvb2xlYW4uYmluZCh0aGlzKSwgYiA9IHRoaXMuc2tpcEJpdHMuYmluZCh0aGlzKSwgdiA9IHRoaXMuc2tpcEVHLmJpbmQodGhpcyksIG0gPSB0aGlzLnNraXBVRUcuYmluZCh0aGlzKSwgZyA9IHRoaXMuc2tpcFNjYWxpbmdMaXN0LmJpbmQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKCksIHQgPSBsKCksIGQoNSksIGIoMyksIGwoKSwgbSgpLCAxMDAgPT09IHQgfHwgMTEwID09PSB0IHx8IDEyMiA9PT0gdCB8fCAyNDQgPT09IHQgfHwgNDQgPT09IHQgfHwgODMgPT09IHQgfHwgODYgPT09IHQgfHwgMTE4ID09PSB0IHx8IDEyOCA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMyA9PT0geSAmJiBiKDEpLCBtKCksIG0oKSwgYigxKSwgcCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDMgIT09IHkgPyA4IDogMTIsIGggPSAwOyBoIDwgcjsgaCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKCkgJiYgZyhoIDwgNiA/IDE2IDogNjQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHcgPSBmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSB3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgxID09PSB3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiKDEpLCB2KCksIHYoKSwgaSA9IGYoKSwgaCA9IDA7IGggPCBpOyBoKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKCksIGIoMSksIGUgPSBmKCksIHMgPSBmKCksIDAgPT09IChuID0gZCgxKSkgJiYgYigxKSwgYigxKSwgcCgpICYmIChhID0gZigpLCBvID0gZigpLCBjID0gZigpLCB1ID0gZigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCgpICYmIHAoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjU1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoKSA8PCA4IHwgbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCkgPDwgOCB8IGwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5jZWlsKDE2ICogKGUgKyAxKSAtIDIgKiBhIC0gMiAqIG8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAoMiAtIG4pICogKHMgKyAxKSAqIDE2IC0gKG4gPyAyIDogNCkgKiAoYyArIHUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxSYXRpbzogTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVhZFNsaWNlVHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFVCeXRlKCksIHRoaXMucmVhZFVFRygpLCB0aGlzLnJlYWRVRUcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBfID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY3J5cHRkYXRhID0gZSwgdGhpcy5kaXNjYXJkRVBCID0gcywgdGhpcy5kZWNyeXB0ZXIgPSBuZXcgdSh0LCBpLCB7IHJlbW92ZVBLQ1M3UGFkZGluZzogITEgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZGVjcnlwdEJ1ZmZlciA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjcnlwdGVyLmRlY3J5cHQodCwgdGhpcy5kZWNyeXB0ZGF0YS5rZXkuYnVmZmVyLCB0aGlzLmRlY3J5cHRkYXRhLml2LmJ1ZmZlciwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5kZWNyeXB0QWFjU2FtcGxlID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W2ldLnVuaXQsIHIgPSBuLnN1YmFycmF5KDE2LCBuLmxlbmd0aCAtIG4ubGVuZ3RoICUgMTYpLCBoID0gci5idWZmZXIuc2xpY2Uoci5ieXRlT2Zmc2V0LCByLmJ5dGVPZmZzZXQgKyByLmxlbmd0aCksIGEgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlY3J5cHRCdWZmZXIoaCwgZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBuZXcgVWludDhBcnJheShyKSwgbi5zZXQociwgMTYpLCBzIHx8IGEuZGVjcnlwdEFhY1NhbXBsZXModCwgaSArIDEsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlY3J5cHRBYWNTYW1wbGVzID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRbaV0udW5pdC5sZW5ndGggPCAzMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMuZGVjcnlwdGVyLmlzU3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlY3J5cHRBYWNTYW1wbGUodCwgaSwgZSwgcyksICFzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmdldEF2Y0VuY3J5cHRlZERhdGEgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTYgKiBNYXRoLmZsb29yKCh0Lmxlbmd0aCAtIDQ4KSAvIDE2MCkgKyAxNiwgZSA9IG5ldyBJbnQ4QXJyYXkoaSksIHMgPSAwLCBuID0gMzI7IG4gPD0gdC5sZW5ndGggLSAxNjsgbiArPSAxNjAsIHMgKz0gMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNldCh0LnN1YmFycmF5KG4sIG4gKyAxNiksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmdldEF2Y0RlY3J5cHRlZFVuaXQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gbmV3IFVpbnQ4QXJyYXkoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCBzID0gMzI7IHMgPD0gdC5sZW5ndGggLSAxNjsgcyArPSAxNjAsIGUgKz0gMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldChpLnN1YmFycmF5KGUsIGUgKyAxNiksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlY3J5cHRBdmNTYW1wbGUgPSBmdW5jdGlvbiAodCwgaSwgZSwgcywgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuZGlzY2FyZEVQQihuLmRhdGEpLCBhID0gdGhpcy5nZXRBdmNFbmNyeXB0ZWREYXRhKGgpLCBvID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWNyeXB0QnVmZmVyKGEuYnVmZmVyLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5kYXRhID0gby5nZXRBdmNEZWNyeXB0ZWRVbml0KGgsIGEpLCByIHx8IG8uZGVjcnlwdEF2Y1NhbXBsZXModCwgaSwgZSArIDEsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlY3J5cHRBdmNTYW1wbGVzID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7OyBpKyssIGUgPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSB0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdFtpXS51bml0czsgIShlID49IG4ubGVuZ3RoKTsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHIubGVuZ3RoIDw9IDQ4IHx8IDEgIT09IHIudHlwZSAmJiA1ICE9PSByLnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5kZWNyeXB0ZXIuaXNTeW5jKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlY3J5cHRBdmNTYW1wbGUodCwgaSwgZSwgcywgciwgaCksICFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIEEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW86IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQzOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0LCB0aGlzLmNvbmZpZyA9IGUsIHRoaXMudHlwZVN1cHBvcnRlZCA9IHMsIHRoaXMucmVtdXhlciA9IGksIHRoaXMuc2FtcGxlQWVzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zZXREZWNyeXB0RGF0YSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdCAmJiBudWxsICE9IHQua2V5ICYmICdTQU1QTEUtQUVTJyA9PT0gdC5tZXRob2QgPyB0aGlzLnNhbXBsZUFlcyA9IG5ldyBfKHRoaXMub2JzZXJ2ZXIsIHRoaXMuY29uZmlnLCB0LCB0aGlzLmRpc2NhcmRFUEIpIDogdGhpcy5zYW1wbGVBZXMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvYmUgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQudXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGUgPCAwIHx8IChlICYmIG8uYi53YXJuKCdNUEVHMi1UUyBkZXRlY3RlZCBidXQgZmlyc3Qgc3luYyB3b3JkIGZvdW5kIEAgb2Zmc2V0ICcgKyBlICsgJywganVuayBhaGVhZCA/JyksIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnV0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE1hdGgubWluKDEwMDAsIHQubGVuZ3RoIC0gNTY0KSwgZSA9IDA7IGUgPCBpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDcxID09PSB0W2VdICYmIDcxID09PSB0W2UgKyAxODhdICYmIDcxID09PSB0W2UgKyAzNzZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmNyZWF0ZVRyYWNrID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogJ3ZpZGVvJyA9PT0gdCB8fCAnYXVkaW8nID09PSB0ID8gJ3ZpZGVvL21wMnQnIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBBW3RdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VGltZVNjYWxlOiA5MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkOiAndmlkZW8nID09PSB0ID8gMCA6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUFDOiAnYXVkaW8nID09PSB0IHx8IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAnYXVkaW8nID09PSB0ID8gaSA6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVzZXRJbml0U2VnbWVudCA9IGZ1bmN0aW9uIChpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG10UGFyc2VkID0gITEsIHRoaXMubHQgPSAtMSwgdGhpcy5kdCA9IHQuY3JlYXRlVHJhY2soJ3ZpZGVvJywgbiksIHRoaXMuY3QgPSB0LmNyZWF0ZVRyYWNrKCdhdWRpbycsIG4pLCB0aGlzLmZ0ID0gdC5jcmVhdGVUcmFjaygnaWQzJywgbiksIHRoaXMucHQgPSB0LmNyZWF0ZVRyYWNrKCd0ZXh0JywgbiksIHRoaXMuYWFjT3ZlckZsb3cgPSBudWxsLCB0aGlzLmFhY0xhc3RQVFMgPSBudWxsLCB0aGlzLmF2Y1NhbXBsZSA9IG51bGwsIHRoaXMuYXVkaW9Db2RlYyA9IGUsIHRoaXMudmlkZW9Db2RlYyA9IHMsIHRoaXMuYnQgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVzZXRUaW1lU3RhbXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5hcHBlbmQgPSBmdW5jdGlvbiAoaSwgZSwgciwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgYywgdSwgbCwgZCwgZiA9IGkubGVuZ3RoLCBwID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGlndW91cyA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdGhpcy5wbXRQYXJzZWQsIHYgPSB0aGlzLmR0LCBtID0gdGhpcy5jdCwgZyA9IHRoaXMuZnQsIHkgPSB2LnBpZCwgdyA9IG0ucGlkLCBPID0gZy5waWQsIHggPSB0aGlzLmx0LCBTID0gdi5wZXNEYXRhLCBqID0gbS5wZXNEYXRhLCBrID0gZy5wZXNEYXRhLCBfID0gdGhpcy52dCwgQSA9IHRoaXMuZ3QsIEkgPSB0aGlzLnl0LCBDID0gdGhpcy53dC5iaW5kKHRoaXMpLCBUID0gdGhpcy5PdC5iaW5kKHRoaXMpLCBQID0gdGhpcy54dC5iaW5kKHRoaXMpLCBNID0gdGhpcy5TdC5iaW5kKHRoaXMpLCBFID0gdC51dChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmIC09IChmICsgRSkgJSAxODgsIGEgPSBFOyBhIDwgZjsgYSArPSAxODgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNzEgPT09IGlbYV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9ICEhKDY0ICYgaVthICsgMV0pLCB1ID0gKCgzMSAmIGlbYSArIDFdKSA8PCA4KSArIGlbYSArIDJdLCAoNDggJiBpW2EgKyAzXSkgPj4gNCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsID0gYSArIDUgKyBpW2EgKyA0XSkgPT09IGEgKyAxODgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGEgKyA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiAoUyAmJiAoZCA9IEkoUykpICYmIEMoZCwgITEpLCBTID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBTICYmIChTLmRhdGEucHVzaChpLnN1YmFycmF5KGwsIGEgKyAxODgpKSwgUy5zaXplICs9IGEgKyAxODggLSBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmIChqICYmIChkID0gSShqKSkgJiYgKG0uaXNBQUMgPyBUKGQpIDogUChkKSksIGogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGogJiYgKGouZGF0YS5wdXNoKGkuc3ViYXJyYXkobCwgYSArIDE4OCkpLCBqLnNpemUgKz0gYSArIDE4OCAtIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGsgJiYgKGQgPSBJKGspKSAmJiBNKGQpLCBrID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBrICYmIChrLmRhdGEucHVzaChpLnN1YmFycmF5KGwsIGEgKyAxODgpKSwgay5zaXplICs9IGEgKyAxODggLSBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmIChsICs9IGlbbF0gKyAxKSwgeCA9IHRoaXMubHQgPSBfKGksIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGwgKz0gaVtsXSArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTCA9IEEoaSwgbCwgITAgPT09IHRoaXMudHlwZVN1cHBvcnRlZC5tcGVnIHx8ICEwID09PSB0aGlzLnR5cGVTdXBwb3J0ZWQubXAzLCBudWxsICE9IHRoaXMuc2FtcGxlQWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPSBMLmF2YykgPiAwICYmICh2LnBpZCA9IHkpLCAodyA9IEwuYXVkaW8pID4gMCAmJiAobS5waWQgPSB3LCBtLmlzQUFDID0gTC5pc0FBQyksIChPID0gTC5pZDMpID4gMCAmJiAoZy5waWQgPSBPKSwgcCAmJiAhYiAmJiAoby5iLmxvZygncmVwYXJzZSBmcm9tIGJlZ2lubmluZycpLCBwID0gITEsIGEgPSBFIC0gMTg4KSwgYiA9IHRoaXMucG10UGFyc2VkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4MTkxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IG4uYS5GUkFHX1BBUlNJTkdfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnVFMgcGFja2V0IGRpZCBub3Qgc3RhcnQgd2l0aCAweDQ3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTICYmIChkID0gSShTKSkgPyAoQyhkLCAhMCksIHYucGVzRGF0YSA9IG51bGwpIDogdi5wZXNEYXRhID0gUywgaiAmJiAoZCA9IEkoaikpID8gKG0uaXNBQUMgPyBUKGQpIDogUChkKSwgbS5wZXNEYXRhID0gbnVsbCkgOiAoaiAmJiBqLnNpemUgJiYgby5iLmxvZygnbGFzdCBBQUMgUEVTIHBhY2tldCB0cnVuY2F0ZWQsbWlnaHQgb3ZlcmxhcCBiZXR3ZWVuIGZyYWdtZW50cycpLCBtLnBlc0RhdGEgPSBqKSwgayAmJiAoZCA9IEkoaykpID8gKE0oZCksIGcucGVzRGF0YSA9IG51bGwpIDogZy5wZXNEYXRhID0gaywgbnVsbCA9PSB0aGlzLnNhbXBsZUFlcyA/IHRoaXMucmVtdXhlci5yZW11eChtLCB2LCBnLCB0aGlzLnB0LCBlLCByLCBoKSA6IHRoaXMuZGVjcnlwdEFuZFJlbXV4KG0sIHYsIGcsIHRoaXMucHQsIGUsIHIsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVjcnlwdEFuZFJlbXV4ID0gZnVuY3Rpb24gKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2FtcGxlcyAmJiB0LmlzQUFDKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNhbXBsZUFlcy5kZWNyeXB0QWFjU2FtcGxlcyh0LnNhbXBsZXMsIDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmRlY3J5cHRBbmRSZW11eEF2Yyh0LCBpLCBlLCBzLCBuLCByLCBoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjcnlwdEFuZFJlbXV4QXZjKHQsIGksIGUsIHMsIG4sIHIsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVjcnlwdEFuZFJlbXV4QXZjID0gZnVuY3Rpb24gKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuc2FtcGxlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYW1wbGVBZXMuZGVjcnlwdEF2Y1NhbXBsZXMoaS5zYW1wbGVzLCAwLCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5yZW11eGVyLnJlbXV4KHQsIGksIGUsIHMsIG4sIHIsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW11eGVyLnJlbXV4KHQsIGksIGUsIHMsIG4sIHIsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qdCA9IHRoaXMua3QgPSB2b2lkIDAsIHRoaXMuYnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkudnQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDMxICYgdFtpICsgMTBdKSA8PCA4IHwgdFtpICsgMTFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZ3QgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzogLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDM6IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUFDOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gaSArIDMgKyAoKDE1ICYgdFtpICsgMV0pIDw8IDggfCB0W2kgKyAyXSkgLSA0LCBpICs9IDEyICsgKCgxNSAmIHRbaSArIDEwXSkgPDwgOCB8IHRbaSArIDExXSk7IGkgPCBuOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyID0gKDMxICYgdFtpICsgMV0pIDw8IDggfCB0W2kgKyAyXSwgdFtpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYi5sb2coJ3Vua25vd24gc3RyZWFtIHR5cGU6JyArIHRbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBoLmF1ZGlvICYmIChoLmF1ZGlvID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBoLmlkMyAmJiAoaC5pZDMgPSByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjE5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmIubG9nKCd1bmtub3duIHN0cmVhbSB0eXBlOicgKyB0W2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gaC5hdmMgJiYgKGguYXZjID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA/IC0xID09PSBoLmF1ZGlvICYmIChoLmF1ZGlvID0gciwgaC5pc0FBQyA9ICExKSA6IG8uYi5sb2coJ01QRUcgYXVkaW8gZm91bmQsIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyIGZvciBub3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iLndhcm4oJ0hFVkMgc3RyZWFtIHR5cGUgZm91bmQsIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmIubG9nKCd1bmtub3duIHN0cmVhbSB0eXBlOicgKyB0W2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNSArICgoMTUgJiB0W2kgKyAzXSkgPDwgOCB8IHRbaSArIDRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnl0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUsIHMsIG4sIHIsIGgsIGEsIGMsIHUgPSAwLCBsID0gdC5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgMCA9PT0gdC5zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBsWzBdLmxlbmd0aCA8IDE5ICYmIGwubGVuZ3RoID4gMTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IFVpbnQ4QXJyYXkobFswXS5sZW5ndGggKyBsWzFdLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnNldChsWzBdKSwgZC5zZXQobFsxXSwgbFswXS5sZW5ndGgpLCBsWzBdID0gZCwgbC5zcGxpY2UoMSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09ICgoaSA9IGxbMF0pWzBdIDw8IDE2KSArIChpWzFdIDw8IDgpICsgaVsyXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzID0gKGlbNF0gPDwgOCkgKyBpWzVdKSAmJiBzID4gdC5zaXplIC0gNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxOTIgJiAoZSA9IGlbN10pICYmICgoaCA9IDUzNjg3MDkxMiAqICgxNCAmIGlbOV0pICsgNDE5NDMwNCAqICgyNTUgJiBpWzEwXSkgKyAxNjM4NCAqICgyNTQgJiBpWzExXSkgKyAxMjggKiAoMjU1ICYgaVsxMl0pICsgKDI1NCAmIGlbMTNdKSAvIDIpID4gNDI5NDk2NzI5NSAmJiAoaCAtPSA4NTg5OTM0NTkyKSwgNjQgJiBlID8gKChhID0gNTM2ODcwOTEyICogKDE0ICYgaVsxNF0pICsgNDE5NDMwNCAqICgyNTUgJiBpWzE1XSkgKyAxNjM4NCAqICgyNTQgJiBpWzE2XSkgKyAxMjggKiAoMjU1ICYgaVsxN10pICsgKDI1NCAmIGlbMThdKSAvIDIpID4gNDI5NDk2NzI5NSAmJiAoYSAtPSA4NTg5OTM0NTkyKSwgaCAtIGEgPiA1NDAwMDAwICYmIChvLmIud2FybihNYXRoLnJvdW5kKChoIC0gYSkgLyA5MDAwMCkgKyAncyBkZWx0YSBiZXR3ZWVuIFBUUyBhbmQgRFRTLCBhbGlnbiB0aGVtJyksIGggPSBhKSkgOiBhID0gaCksIGMgPSAobiA9IGlbOF0pICsgOSwgdC5zaXplIDw9IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNpemUgLT0gYywgciA9IG5ldyBVaW50OEFycmF5KHQuc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gMCwgcCA9IGwubGVuZ3RoOyBmIDwgcDsgZisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAoaSA9IGxbZl0pLmJ5dGVMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjIC09IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS5zdWJhcnJheShjKSwgYiAtPSBjLCBjID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZXQoaSwgdSksIHUgKz0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzICYmIChzIC09IG4gKyAzKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0czogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW46IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wdXNoQWNjZXNVbml0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQudW5pdHMubGVuZ3RoICYmIHQuZnJhbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaS5zYW1wbGVzLCBzID0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odC5wdHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpLmRyb3BwZWQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbcyAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHRzID0gbi5wdHMsIHQuZHRzID0gbi5kdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5jb25maWcuZm9yY2VLZXlGcmFtZU9uRGlzY29udGludWl0eSB8fCAhMCA9PT0gdC5rZXkgfHwgaS5zcHMgJiYgKHMgfHwgdGhpcy5jb250aWd1b3VzKSA/ICh0LmlkID0gcywgZS5wdXNoKHQpKSA6IGkuZHJvcHBlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGVidWcubGVuZ3RoICYmIG8uYi5sb2codC5wdHMgKyAnLycgKyB0LmR0cyArICc6JyArIHQuZGVidWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkud3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcywgbiwgciA9IHRoaXMsIGggPSB0aGlzLmR0LCBhID0gdGhpcy5fdCh0LmRhdGEpLCBvID0gdGhpcy5hdmNTYW1wbGUsIGMgPSAhMSwgdSA9IHRoaXMucHVzaEFjY2VzVW5pdC5iaW5kKHRoaXMpLCBsID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0czogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0czogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGF0YSA9IG51bGwsIG8gJiYgYS5sZW5ndGggJiYgIWguYXVkRm91bmQgJiYgKHUobywgaCksIG8gPSB0aGlzLmF2Y1NhbXBsZSA9IGwoITEsIHQucHRzLCB0LmR0cywgJycpKSwgYS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAhMCwgbyB8fCAobyA9IHIuYXZjU2FtcGxlID0gbCghMCwgdC5wdHMsIHQuZHRzLCAnJykpLCBvLmZyYW1lID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgYS5sZW5ndGggPiA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IGsoYSkucmVhZFNsaWNlVHlwZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICE9PSBkICYmIDQgIT09IGQgJiYgNyAhPT0gZCAmJiA5ICE9PSBkIHx8IChvLmtleSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwLCBvIHx8IChvID0gci5hdmNTYW1wbGUgPSBsKCEwLCB0LnB0cywgdC5kdHMsICcnKSksIG8ua2V5ID0gITAsIG8uZnJhbWUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gITAsIChlID0gbmV3IGsoci5kaXNjYXJkRVBCKGkuZGF0YSkpKS5yZWFkVUJ5dGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gMCwgcCA9IDAsIGIgPSAhMSwgdiA9IDA7ICFiICYmIGUuYnl0ZXNBdmFpbGFibGUgPiAxOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiArPSB2ID0gZS5yZWFkVUJ5dGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoMjU1ID09PSB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gdiA9IGUucmVhZFVCeXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDI1NSA9PT0gdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0ID09PSBmICYmIDAgIT09IGUuYnl0ZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gITAsIDE4MSA9PT0gZS5yZWFkVUJ5dGUoKSAmJiA0OSA9PT0gZS5yZWFkVVNob3J0KCkgJiYgMTE5NTQ1NjgyMCA9PT0gZS5yZWFkVUludCgpICYmIDMgPT09IGUucmVhZFVCeXRlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGUucmVhZFVCeXRlKCksIGcgPSAzMSAmIG0sIHkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZWFkVUJ5dGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBnOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkucHVzaChlLnJlYWRVQnl0ZSgpKSwgeS5wdXNoKGUucmVhZFVCeXRlKCkpLCB5LnB1c2goZS5yZWFkVUJ5dGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5BdChyLnB0LnNhbXBsZXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiB0LnB0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXM6IHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICg1ID09PSBmICYmIDAgIT09IGUuYnl0ZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gITAsIHAgPiAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ucHVzaChlLnJlYWRVQnl0ZSgpLnRvU3RyaW5nKDE2KSksIDMgIT09IG4gJiYgNSAhPT0gbiAmJiA3ICE9PSBuICYmIDkgIT09IG4gfHwgTy5wdXNoKCctJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBwIC0gMTYsIFMgPSBuZXcgVWludDhBcnJheSh4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgeDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTW25dID0gZS5yZWFkVUJ5dGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLkF0KHIucHQuc2FtcGxlcywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHM6IHQucHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkVHlwZTogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogTy5qb2luKCcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGFCeXRlczogUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRhdGE6IE9iamVjdCh3LmIpKFMuYnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAgPCBlLmJ5dGVzQXZhaWxhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IHA7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlYWRVQnl0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9ICEwLCBjID0gITAsICFoLnNwcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9IChlID0gbmV3IGsoaS5kYXRhKSkucmVhZFNQUygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLndpZHRoID0gai53aWR0aCwgaC5oZWlnaHQgPSBqLmhlaWdodCwgaC5waXhlbFJhdGlvID0gai5waXhlbFJhdGlvLCBoLnNwcyA9IFtpLmRhdGFdLCBoLmR1cmF0aW9uID0gci5idDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSBpLmRhdGEuc3ViYXJyYXkoMSwgNCksIEEgPSAnYXZjMS4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSSA9IF9bbl0udG9TdHJpbmcoMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS5sZW5ndGggPCAyICYmIChJID0gJzAnICsgSSksIEEgKz0gSTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmNvZGVjID0gQTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwLCBoLnBwcyB8fCAoaC5wcHMgPSBbaS5kYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICExLCBoLmF1ZEZvdW5kID0gITAsIG8gJiYgdShvLCBoKSwgbyA9IHIuYXZjU2FtcGxlID0gbCghMSwgdC5wdHMsIHQuZHRzLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICExLCBvICYmIChvLmRlYnVnICs9ICd1bmtub3duIE5BTCAnICsgaS50eXBlICsgJyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgcyAmJiBvLnVuaXRzLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpICYmIG8gJiYgKHUobywgaCksIHRoaXMuYXZjU2FtcGxlID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5BdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkucHRzID49IHRbZSAtIDFdLnB0cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IGUgLSAxOyBzID49IDA7IHMtLSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkucHRzIDwgdFtzXS5wdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc3BsaWNlKHMsIDAsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5JdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGkgPSB0aGlzLmF2Y1NhbXBsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpIHx8IDAgPT09IGkudW5pdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuZHQuc2FtcGxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlW2UubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaS51bml0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBzW3MubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5fdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlLCBzLCBuLCByID0gMCwgaCA9IHQuYnl0ZUxlbmd0aCwgYSA9IHRoaXMuZHQsIG8gPSBhLm5hbHVTdGF0ZSB8fCAwLCBjID0gbywgdSA9IFtdLCBsID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoLTEgPT09IG8gJiYgKGwgPSAwLCBuID0gMzEgJiB0WzBdLCBvID0gMCwgciA9IDEpOyByIDwgaDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9IHRbcisrXSwgbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSAhPT0gbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0LnN1YmFycmF5KGwsIHIgLSBvIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUucHVzaChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzLkl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmIChjICYmIHIgPD0gNCAtIGMgJiYgZC5zdGF0ZSAmJiAoZC5kYXRhID0gZC5kYXRhLnN1YmFycmF5KDAsIGQuZGF0YS5ieXRlTGVuZ3RoIC0gYykpLCAoZSA9IHIgLSBvIC0gMSkgPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBuZXcgVWludDhBcnJheShkLmRhdGEuYnl0ZUxlbmd0aCArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXQoZC5kYXRhLCAwKSwgZi5zZXQodC5zdWJhcnJheSgwLCBlKSwgZC5kYXRhLmJ5dGVMZW5ndGgpLCBkLmRhdGEgPSBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPCBoID8gKGwgPSByLCBuID0gMzEgJiB0W3JdLCBvID0gMCkgOiBvID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gaSA/IDAgOiAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBpID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID49IDAgJiYgbyA+PSAwICYmIChzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHQuc3ViYXJyYXkobCwgaCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5wdXNoKHMpKSwgMCA9PT0gdS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcy5JdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG5ldyBVaW50OEFycmF5KHAuZGF0YS5ieXRlTGVuZ3RoICsgdC5ieXRlTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnNldChwLmRhdGEsIDApLCBiLnNldCh0LCBwLmRhdGEuYnl0ZUxlbmd0aCksIHAuZGF0YSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubmFsdVN0YXRlID0gbywgdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRpc2NhcmRFUEIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpLCBlLCBzID0gdC5ieXRlTGVuZ3RoLCBuID0gW10sIHIgPSAxOyByIDwgcyAtIDI7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gdFtyXSAmJiAwID09PSB0W3IgKyAxXSAmJiAzID09PSB0W3IgKyAyXSA/IChuLnB1c2gociArIDIpLCByICs9IDIpIDogcisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHMgLSBuLmxlbmd0aCwgZSA9IG5ldyBVaW50OEFycmF5KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBpOyBoKyssIHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPT09IG5bMF0gJiYgKGgrKywgbi5zaGlmdCgpKSwgZVtyXSA9IHRbaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuT3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgciwgaCwgYSwgYywgdSwgbCA9IHRoaXMuY3QsIGQgPSB0LmRhdGEsIGYgPSB0LnB0cywgcCA9IHRoaXMuYWFjT3ZlckZsb3csIHYgPSB0aGlzLmFhY0xhc3RQVFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IG5ldyBVaW50OEFycmF5KHAuYnl0ZUxlbmd0aCArIGQuYnl0ZUxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LnNldChwLCAwKSwgdy5zZXQoZCwgcC5ieXRlTGVuZ3RoKSwgZCA9IHc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMCwgYSA9IGQubGVuZ3RoOyByIDwgYSAtIDEgJiYgIWIoZCwgcik7IHIrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghciB8fCAociA8IGEgLSAxID8gKGMgPSAnQUFDIFBFUyBkaWQgbm90IHN0YXJ0IHdpdGggQURUUyBoZWFkZXIsb2Zmc2V0OicgKyByLCB1ID0gITEpIDogKGMgPSAnbm8gQURUUyBoZWFkZXIgZm91bmQgaW4gQUFDIFBFUycsIHUgPSAhMCksIG8uYi53YXJuKCdwYXJzaW5nIGVycm9yOicgKyBjKSwgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG4uYi5NRURJQV9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBuLmEuRlJBR19QQVJTSU5HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICF1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0obCwgdGhpcy5vYnNlcnZlciwgZCwgciwgdGhpcy5hdWRpb0NvZGVjKSwgZSA9IDAsIGkgPSBnKGwuc2FtcGxlcmF0ZSksIHAgJiYgdikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gdiArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoTyAtIGYpID4gMSAmJiAoby5iLmxvZygnQUFDOiBhbGlnbiBQVFMgZm9yIG92ZXJsYXBwaW5nIGZyYW1lcyBieSAnICsgTWF0aC5yb3VuZCgoTyAtIGYpIC8gOTApKSwgZiA9IE8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHIgPCBhOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKGQsIHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICsgNSA8IGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0geShsLCBkLCByLCBmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSB4Lmxlbmd0aCwgaCA9IHguc2FtcGxlLnB0cywgZSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gciA8IGEgPyBkLnN1YmFycmF5KHIsIGEpIDogbnVsbCwgdGhpcy5hYWNPdmVyRmxvdyA9IHAsIHRoaXMuYWFjTGFzdFBUUyA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnh0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHQuZGF0YSwgZSA9IGkubGVuZ3RoLCBzID0gMCwgbiA9IDAsIHIgPSB0LnB0czsgbiA8IGU7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGouaXNIZWFkZXIoaSwgbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGouYXBwZW5kRnJhbWUodGhpcy5jdCwgaSwgbiwgciwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICs9IGgubGVuZ3RoLCBzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5TdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnQuc2FtcGxlcy5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIEMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0LCB0aGlzLmNvbmZpZyA9IGUsIHRoaXMucmVtdXhlciA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucmVzZXRJbml0U2VnbWVudCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3QgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICdhdWRpby9tcGVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdWRpbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQUFDOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RDb2RlYzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUaW1lU2NhbGU6IDkwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZXNldFRpbWVTdGFtcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb2JlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUsIHMgPSB3LmEuZ2V0SUQzRGF0YSh0LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgdm9pZCAwICE9PSB3LmEuZ2V0VGltZVN0YW1wKHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gcy5sZW5ndGgsIGUgPSBNYXRoLm1pbih0Lmxlbmd0aCAtIDEsIGkgKyAxMDApOyBpIDwgZTsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqLnByb2JlKHQsIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5iLmxvZygnTVBFRyBBdWRpbyBzeW5jIHdvcmQgZm91bmQgIScpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuYXBwZW5kID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHcuYS5nZXRJRDNEYXRhKHQsIDApLCByID0gdy5hLmdldFRpbWVTdGFtcChuKSwgaCA9IHIgPyA5MCAqIHIgOiA5MDAwMCAqIGksIGEgPSBuLmxlbmd0aCwgbyA9IHQubGVuZ3RoLCBjID0gMCwgdSA9IDAsIGwgPSB0aGlzLmN0LCBkID0gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0czogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0czogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07IGEgPCBvOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqLmlzSGVhZGVyKHQsIGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBqLmFwcGVuZEZyYW1lKGwsIHQsIGEsIGgsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSArPSBmLmxlbmd0aCwgdSA9IGYuc2FtcGxlLnB0cywgYysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5hLmlzSGVhZGVyKHQsIGEpID8gKG4gPSB3LmEuZ2V0SUQzRGF0YSh0LCBhKSwgZC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHM6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYSArPSBuLmxlbmd0aCkgOiBhKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtdXhlci5yZW11eChsLCB7IHNhbXBsZXM6IFtdIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXM6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRpbWVTY2FsZTogOTAwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyBzYW1wbGVzOiBbXSB9LCBpLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgVCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRTaWxlbnRGcmFtZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtcDRhLjQwLjInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDMgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg0ID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDUgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNiA9PT0gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDMgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgUCA9IE1hdGgucG93KDIsIDMyKSAtIDEsIE0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiAodC50eXBlcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMxOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmNDOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidHJ0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW5mOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmVmOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2RzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHlwOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZGxyOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGF0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGhkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZGlhOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZmhkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5mOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb29mOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb292OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRhOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLm1wMyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ZXg6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12aGQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3A6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkdHA6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Ymw6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0Y286IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c2M6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c2Q6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3o6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0dHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmZHQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmaGQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWY6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWs6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW46IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZXg6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRraGQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtaGQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtaGQ6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnR5cGVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHlwZXMuaGFzT3duUHJvcGVydHkoaSkgJiYgKHQudHlwZXNbaV0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jaGFyQ29kZUF0KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuY2hhckNvZGVBdCgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNoYXJDb2RlQXQoMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jaGFyQ29kZUF0KDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgcyA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LkhETFJfVFlQRVMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgciA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LlNUVFMgPSB0LlNUU0MgPSB0LlNUQ08gPSByLCB0LlNUU1ogPSBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQuVk1IRCA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdC5TTUhEID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQuU1RTRCA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBhID0gbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIG8gPSBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuRlRZUCA9IHQuYm94KHQudHlwZXMuZnR5cCwgaCwgbywgaCwgYSksIHQuRElORiA9IHQuYm94KHQudHlwZXMuZGluZiwgdC5ib3godC50eXBlcy5kcmVmLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5ib3ggPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpLCBlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgcyA9IDgsIG4gPSBlLmxlbmd0aCwgciA9IG47IG4tLTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IGVbbl0uYnl0ZUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgoaSA9IG5ldyBVaW50OEFycmF5KHMpKVswXSA9IHMgPj4gMjQgJiAyNTUsIGlbMV0gPSBzID4+IDE2ICYgMjU1LCBpWzJdID0gcyA+PiA4ICYgMjU1LCBpWzNdID0gMjU1ICYgcywgaS5zZXQodCwgNCksIG4gPSAwLCBzID0gODsgbiA8IHI7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0KGVbbl0sIHMpLCBzICs9IGVbbl0uYnl0ZUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5oZGxyID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMuaGRsciwgdC5IRExSX1RZUEVTW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1kYXQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ib3godC50eXBlcy5tZGF0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1kaGQgPSBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICo9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gTWF0aC5mbG9vcihlIC8gKFAgKyAxKSksIG4gPSBNYXRoLmZsb29yKGUgJSAoUCArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMubWRoZCwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID4+IDI0ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1kaWEgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ib3godC50eXBlcy5tZGlhLCB0Lm1kaGQoaS50aW1lc2NhbGUsIGkuZHVyYXRpb24pLCB0LmhkbHIoaS50eXBlKSwgdC5taW5mKGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1maGQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ib3godC50eXBlcy5tZmhkLCBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1pbmYgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2F1ZGlvJyA9PT0gaS50eXBlID8gdC5ib3godC50eXBlcy5taW5mLCB0LmJveCh0LnR5cGVzLnNtaGQsIHQuU01IRCksIHQuRElORiwgdC5zdGJsKGkpKSA6IHQuYm94KHQudHlwZXMubWluZiwgdC5ib3godC50eXBlcy52bWhkLCB0LlZNSEQpLCB0LkRJTkYsIHQuc3RibChpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5tb29mID0gZnVuY3Rpb24gKGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMubW9vZiwgdC5tZmhkKGkpLCB0LnRyYWYocywgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQubW9vdiA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBpLmxlbmd0aCwgcyA9IFtdOyBlLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tlXSA9IHQudHJhayhpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94LmFwcGx5KG51bGwsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHlwZXMubW9vdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubXZoZChpWzBdLnRpbWVzY2FsZSwgaVswXS5kdXJhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQocykuY29uY2F0KHQubXZleChpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQubXZleCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBpLmxlbmd0aCwgcyA9IFtdOyBlLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tlXSA9IHQudHJleChpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94LmFwcGx5KG51bGwsIFt0LnR5cGVzLm12ZXhdLmNvbmNhdChzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5tdmhkID0gZnVuY3Rpb24gKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAqPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IE1hdGguZmxvb3IoZSAvIChQICsgMSkpLCBuID0gTWF0aC5mbG9vcihlICUgKFAgKyAxKSksIHIgPSBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPj4gMjQgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID4+IDE2ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJveCh0LnR5cGVzLm12aGQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuc2R0cCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCBuID0gaS5zYW1wbGVzIHx8IFtdLCByID0gbmV3IFVpbnQ4QXJyYXkoNCArIG4ubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IG4ubGVuZ3RoOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbltzXS5mbGFncywgcltzICsgNF0gPSBlLmRlcGVuZHNPbiA8PCA0IHwgZS5pc0RlcGVuZGVkT24gPDwgMiB8IGUuaGFzUmVkdW5kYW5jeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMuc2R0cCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5zdGJsID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMuc3RibCwgdC5zdHNkKGkpLCB0LmJveCh0LnR5cGVzLnN0dHMsIHQuU1RUUyksIHQuYm94KHQudHlwZXMuc3RzYywgdC5TVFNDKSwgdC5ib3godC50eXBlcy5zdHN6LCB0LlNUU1opLCB0LmJveCh0LnR5cGVzLnN0Y28sIHQuU1RDTykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuYXZjMSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCBuLCByID0gW10sIGggPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IGkuc3BzLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChzID0gaS5zcHNbZV0pLmJ5dGVMZW5ndGgsIHIucHVzaChuID4+PiA4ICYgMjU1KSwgci5wdXNoKDI1NSAmIG4pLCByID0gci5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgaS5wcHMubGVuZ3RoOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gKHMgPSBpLnBwc1tlXSkuYnl0ZUxlbmd0aCwgaC5wdXNoKG4gPj4+IDggJiAyNTUpLCBoLnB1c2goMjU1ICYgbiksIGggPSBoLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdC5ib3godC50eXBlcy5hdmNDLCBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcls1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0IHwgaS5zcHMubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChyKS5jb25jYXQoW2kucHBzLmxlbmd0aF0pLmNvbmNhdChoKSkpLCBvID0gaS53aWR0aCwgYyA9IGkuaGVpZ2h0LCB1ID0gaS5waXhlbFJhdGlvWzBdLCBsID0gaS5waXhlbFJhdGlvWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ib3godC50eXBlcy5hdmMxLCBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBhLCB0LmJveCh0LnR5cGVzLmJ0cnQsIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSksIHQuYm94KHQudHlwZXMucGFzcCwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5lc2RzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmNvbmZpZy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzICsgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSArIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KFtpXSkuY29uY2F0KHQuY29uZmlnKS5jb25jYXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm1wNGEgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuc2FtcGxlcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMubXA0YSwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQuYm94KHQudHlwZXMuZXNkcywgdC5lc2RzKGkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5tcDMgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuc2FtcGxlcmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXNbJy5tcDMnXSwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuc3RzZCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYXVkaW8nID09PSBpLnR5cGUgPyBpLmlzQUFDIHx8ICdtcDMnICE9PSBpLmNvZGVjID8gdC5ib3godC50eXBlcy5zdHNkLCB0LlNUU0QsIHQubXA0YShpKSkgOiB0LmJveCh0LnR5cGVzLnN0c2QsIHQuU1RTRCwgdC5tcDMoaSkpIDogdC5ib3godC50eXBlcy5zdHNkLCB0LlNUU0QsIHQuYXZjMShpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC50a2hkID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLmlkLCBzID0gaS5kdXJhdGlvbiAqIGkudGltZXNjYWxlLCBuID0gaS53aWR0aCwgciA9IGkuaGVpZ2h0LCBoID0gTWF0aC5mbG9vcihzIC8gKFAgKyAxKSksIGEgPSBNYXRoLmZsb29yKHMgJSAoUCArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYm94KHQudHlwZXMudGtoZCwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID4+IDI0ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA+PiAyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQudHJhZiA9IGZ1bmN0aW9uIChpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdC5zZHRwKGkpLCBuID0gaS5pZCwgciA9IE1hdGguZmxvb3IoZSAvIChQICsgMSkpLCBoID0gTWF0aC5mbG9vcihlICUgKFAgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJveCh0LnR5cGVzLnRyYWYsIHQuYm94KHQudHlwZXMudGZoZCwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID4+IDE2ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSksIHQuYm94KHQudHlwZXMudGZkdCwgbmV3IFVpbnQ4QXJyYXkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+IDE2ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPj4gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID4+IDE2ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSksIHQudHJ1bihpLCBzLmxlbmd0aCArIDE2ICsgMjAgKyA4ICsgMTYgKyA4ICsgOCksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQudHJhayA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmR1cmF0aW9uID0gaS5kdXJhdGlvbiB8fCA0Mjk0OTY3Mjk1LCB0LmJveCh0LnR5cGVzLnRyYWssIHQudGtoZChpKSwgdC5tZGlhKGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnRyZXggPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJveCh0LnR5cGVzLnRyZXgsIG5ldyBVaW50OEFycmF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID4+IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnRydW4gPSBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiwgciwgaCwgYSwgbywgYyA9IGkuc2FtcGxlcyB8fCBbXSwgdSA9IGMubGVuZ3RoLCBsID0gMTIgKyAxNiAqIHUsIGQgPSBuZXcgVWludDhBcnJheShsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlICs9IDggKyBsLCBkLnNldChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA+Pj4gMjQgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA+Pj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA+Pj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4+IDI0ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4+IDE2ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPj4+IDggJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1ICYgZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgMCksIHMgPSAwOyBzIDwgdTsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IChuID0gY1tzXSkuZHVyYXRpb24sIGggPSBuLnNpemUsIGEgPSBuLmZsYWdzLCBvID0gbi5jdHMsIGQuc2V0KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+PiAyNCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+PiAxNiAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID4+PiA4ICYgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NSAmIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA+Pj4gMjQgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA+Pj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA+Pj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaXNMZWFkaW5nIDw8IDIgfCBhLmRlcGVuZHNPbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmlzRGVwZW5kZWRPbiA8PCA2IHwgYS5oYXNSZWR1bmRhbmN5IDw8IDQgfCBhLnBhZGRpbmdWYWx1ZSA8PCAxIHwgYS5pc05vblN5bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjE0NDAgJiBhLmRlZ3JhZFByaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgJiBhLmRlZ3JhZFByaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA+Pj4gMjQgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA+Pj4gMTYgJiAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA+Pj4gOCAmIDI1NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgJiBvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCAxMiArIDE2ICogcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJveCh0LnR5cGVzLnRydW4sIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuaW5pdFNlZ21lbnQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGVzIHx8IHQuaW5pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcyA9IHQubW9vdihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gbmV3IFVpbnQ4QXJyYXkodC5GVFlQLmJ5dGVMZW5ndGggKyBzLmJ5dGVMZW5ndGgpKS5zZXQodC5GVFlQKSwgZS5zZXQocywgdC5GVFlQLmJ5dGVMZW5ndGgpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gMSksIHZvaWQgMCA9PT0gcyAmJiAocyA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdCAqIGkgKiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPyBNYXRoLnJvdW5kKG4pIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkgJiYgKGkgPSAhMSksIEUodCwgMTAwMCwgMSAvIDkwMDAwLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkgJiYgKGkgPSAxKSwgRSh0LCA5MDAwMCwgMSAvIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCLCBEID0gUigxMCksIEYgPSBSKDAuMiksIFYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0LCB0aGlzLmNvbmZpZyA9IGksIHRoaXMudHlwZVN1cHBvcnRlZCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NhZmFyaSA9IHMgJiYgcy5pbmRleE9mKCdBcHBsZScpID4gLTEgJiYgbiAmJiAhbi5tYXRjaCgnQ3JpT1MnKSwgdGhpcy5JU0dlbmVyYXRlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZXNldFRpbWVTdGFtcCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanQgPSB0aGlzLmt0ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlc2V0SW5pdFNlZ21lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSVNHZW5lcmF0ZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlbXV4ID0gZnVuY3Rpb24gKHQsIGksIGUsIG4sIHIsIGgsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuSVNHZW5lcmF0ZWQgfHwgdGhpcy5nZW5lcmF0ZUlTKHQsIGksIHIpLCB0aGlzLklTR2VuZXJhdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHQuc2FtcGxlcy5sZW5ndGgsIHUgPSBpLnNhbXBsZXMubGVuZ3RoLCBsID0gciwgZCA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAodC5zYW1wbGVzWzBdLnB0cyAtIGkuc2FtcGxlc1swXS5wdHMpIC8gaS5pbnB1dFRpbWVTY2FsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IE1hdGgubWF4KDAsIGYpLCBkICs9IE1hdGgubWF4KDAsIC1mKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50aW1lc2NhbGUgfHwgKG8uYi53YXJuKCdyZWdlbmVyYXRlIEluaXRTZWdtZW50IGFzIGF1ZGlvIGRldGVjdGVkJyksIHRoaXMuZ2VuZXJhdGVJUyh0LCBpLCByKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAsIGIgPSB0aGlzLnJlbXV4QXVkaW8odCwgbCwgaCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiAoYiAmJiAocCA9IGIuZW5kUFRTIC0gYi5zdGFydFBUUyksIGkudGltZXNjYWxlIHx8IChvLmIud2FybigncmVnZW5lcmF0ZSBJbml0U2VnbWVudCBhcyB2aWRlbyBkZXRlY3RlZCcpLCB0aGlzLmdlbmVyYXRlSVModCwgaSwgcikpLCB0aGlzLnJlbXV4VmlkZW8oaSwgZCwgaCwgcCwgYSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnJlbXV4VmlkZW8oaSwgZCwgaCwgMCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAmJiB0LmNvZGVjICYmIHRoaXMucmVtdXhFbXB0eUF1ZGlvKHQsIGwsIGgsIHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2FtcGxlcy5sZW5ndGggJiYgdGhpcy5yZW11eElEMyhlLCByKSwgbi5zYW1wbGVzLmxlbmd0aCAmJiB0aGlzLnJlbXV4VGV4dChuLCByKSwgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5GUkFHX1BBUlNFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5nZW5lcmF0ZUlTID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGgsIGEgPSB0aGlzLm9ic2VydmVyLCBjID0gdC5zYW1wbGVzLCB1ID0gaS5zYW1wbGVzLCBsID0gdGhpcy50eXBlU3VwcG9ydGVkLCBkID0gJ2F1ZGlvL21wNCcsIGYgPSB7fSwgcCA9IHsgdHJhY2tzOiBmIH0sIGIgPSB2b2lkIDAgPT09IHRoaXMuanQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIChyID0gaCA9IDEgLyAwKSwgdC5jb25maWcgJiYgYy5sZW5ndGggJiYgKHQudGltZXNjYWxlID0gdC5zYW1wbGVyYXRlLCBvLmIubG9nKCdhdWRpbyBzYW1wbGluZyByYXRlIDogJyArIHQuc2FtcGxlcmF0ZSksIHQuaXNBQUMgfHwgKGwubXBlZyA/IChkID0gJ2F1ZGlvL21wZWcnLCB0LmNvZGVjID0gJycpIDogbC5tcDMgJiYgKHQuY29kZWMgPSAnbXAzJykpLCBmLmF1ZGlvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYzogdC5jb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VnbWVudDogIXQuaXNBQUMgJiYgbC5tcGVnID8gbmV3IFVpbnQ4QXJyYXkoKSA6IE0uaW5pdFNlZ21lbnQoW3RdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogeyBjaGFubmVsQ291bnQ6IHQuY2hhbm5lbENvdW50IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgJiYgKHIgPSBoID0gY1swXS5wdHMgLSB0LmlucHV0VGltZVNjYWxlICogZSkpLCBpLnNwcyAmJiBpLnBwcyAmJiB1Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBpLmlucHV0VGltZVNjYWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50aW1lc2NhbGUgPSB2LCBmLnZpZGVvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogJ3ZpZGVvL21wNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWM6IGkuY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlZ21lbnQ6IE0uaW5pdFNlZ21lbnQoW2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpLmhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgJiYgKHIgPSBNYXRoLm1pbihyLCB1WzBdLnB0cyAtIHYgKiBlKSwgaCA9IE1hdGgubWluKGgsIHVbMF0uZHRzIC0gdiAqIGUpLCB0aGlzLm9ic2VydmVyLnRyaWdnZXIocy5hLklOSVRfUFRTX0ZPVU5ELCB7IGluaXRQVFM6IHIgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGYpLmxlbmd0aCA/IChhLnRyaWdnZXIocy5hLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQsIHApLCB0aGlzLklTR2VuZXJhdGVkID0gITAsIGIgJiYgKHRoaXMuanQgPSByLCB0aGlzLmt0ID0gaCkpIDogYS50cmlnZ2VyKHMuYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbi5iLk1FRElBX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogbi5hLkZSQUdfUEFSU0lOR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogJ25vIGF1ZGlvL3ZpZGVvIHNhbXBsZXMgZm91bmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVtdXhWaWRlbyA9IGZ1bmN0aW9uICh0LCBpLCBlLCByLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBjLCB1LCBsLCBkLCBmLCBwLCBiID0gOCwgdiA9IHQudGltZXNjYWxlLCBtID0gdC5zYW1wbGVzLCBnID0gW10sIHkgPSBtLmxlbmd0aCwgdyA9IHRoaXMuQ3QsIE8gPSB0aGlzLmp0LCB4ID0gdGhpcy5uZXh0QXZjRHRzLCBTID0gdGhpcy5pc1NhZmFyaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgJiYgKGUgfD0gbS5sZW5ndGggJiYgeCAmJiAoaCAmJiBNYXRoLmFicyhpIC0geCAvIHYpIDwgMC4xIHx8IE1hdGguYWJzKG1bMF0ucHRzIC0geCAtIE8pIDwgdiAvIDUpKSwgZSB8fCAoeCA9IGkgKiB2KSwgbS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdHMgPSB3KHQucHRzIC0gTywgeCksIHQuZHRzID0gdyh0LmR0cyAtIE8sIHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG0uc29ydChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5kdHMgLSBpLmR0cywgcyA9IHQucHRzIC0gaS5wdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwgcyB8fCB0LmlkIC0gaS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGogPSBtLnJlZHVjZShmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih0LCBpLnB0cyAtIGkuZHRzKSwgLTEgKiBGKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iLndhcm4oJ1BUUyA8IERUUyBkZXRlY3RlZCBpbiB2aWRlbyBzYW1wbGVzLCBzaGlmdGluZyBEVFMgYnkgJyArIEwoaiwgITApICsgJyBtcyB0byBvdmVyY29tZSB0aGlzIGlzc3VlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBtLmxlbmd0aDsgaysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW2tdLmR0cyArPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSBtWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IE1hdGgubWF4KF8uZHRzLCAwKSwgbCA9IE1hdGgubWF4KF8ucHRzLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBBID0gZCAtIHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIEEgJiYgKEEgPiAxID8gby5iLmxvZygnQVZDOiAnICsgTChBLCAhMCkgKyAnIG1zIGhvbGUgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQsZmlsbGluZyBpdCcpIDogQSA8IC0xICYmIG8uYi5sb2coJ0FWQzogJyArIEwoLUEsICEwKSArICcgbXMgb3ZlcmxhcHBpbmcgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQnKSwgZCA9IHgsIG1bMF0uZHRzID0gZCwgbCA9IE1hdGgubWF4KGwgLSBBLCB4KSwgbVswXS5wdHMgPSBsLCBvLmIubG9nKCdWaWRlbzogUFRTL0RUUyBhZGp1c3RlZDogJyArIEwobCwgITApICsgJy8nICsgTChkLCAhMCkgKyAnLCBkZWx0YTogJyArIEwoQSwgITApICsgJyBtcycpKSwgXyA9IG1bbS5sZW5ndGggLSAxXSwgcCA9IE1hdGgubWF4KF8uZHRzLCAwKSwgZiA9IE1hdGgubWF4KF8ucHRzLCAwLCBwKSwgUyAmJiAoYSA9IE1hdGgucm91bmQoKHAgLSBkKSAvIChtLmxlbmd0aCAtIDEpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBJID0gMCwgQyA9IDAsIFQgPSAwOyBUIDwgeTsgVCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgUCA9IG1bVF0sIEUgPSBQLnVuaXRzLCBSID0gRS5sZW5ndGgsIEIgPSAwLCBEID0gMDsgRCA8IFI7IEQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiArPSBFW0RdLmRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgKz0gQiwgSSArPSBSLCBQLmxlbmd0aCA9IEIsIFAuZHRzID0gUyA/IGQgKyBUICogYSA6IE1hdGgubWF4KFAuZHRzLCBkKSwgUC5wdHMgPSBNYXRoLm1heChQLnB0cywgUC5kdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFYgPSBDICsgNCAqIEkgKyA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3IFVpbnQ4QXJyYXkoVik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLmIuTVVYX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBuLmEuUkVNVVhfQUxMT0NfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXM6IFYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogJ2ZhaWwgYWxsb2NhdGluZyB2aWRlbyBtZGF0ICcgKyBWCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVSA9IG5ldyBEYXRhVmlldyhjLmJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLnNldFVpbnQzMigwLCBWKSwgYy5zZXQoTS50eXBlcy5tZGF0LCA0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyICQgPSAwOyAkIDwgeTsgJCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgTiA9IG1bJF0sIEggPSBOLnVuaXRzLCBxID0gMCwgeiA9IHZvaWQgMCwgVyA9IDAsIEcgPSBILmxlbmd0aDsgVyA8IEc7IFcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSiA9IEhbV10sIFEgPSBKLmRhdGEsIFggPSBKLmRhdGEuYnl0ZUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS5zZXRVaW50MzIoYiwgWCksIGIgKz0gNCwgYy5zZXQoUSwgYiksIGIgKz0gWCwgcSArPSA0ICsgWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHogPSBNYXRoLm1heCgwLCBhICogTWF0aC5yb3VuZCgoTi5wdHMgLSBOLmR0cykgLyBhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkIDwgeSAtIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gbVskICsgMV0uZHRzIC0gTi5kdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFkgPSB0aGlzLmNvbmZpZywgSyA9IE4uZHRzIC0gbVskID4gMCA/ICQgLSAxIDogJF0uZHRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFkuc3RyZXRjaFNob3J0VmlkZW9UcmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBaID0gWS5tYXhCdWZmZXJIb2xlLCB0dCA9IE1hdGguZmxvb3IoWiAqIHYpLCBpdCA9IChyID8gbCArIHIgKiB2IDogdGhpcy5uZXh0QXVkaW9QdHMpIC0gTi5wdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgPiB0dCA/ICgoYSA9IGl0IC0gSykgPCAwICYmIChhID0gSyksIG8uYi5sb2coJ0l0IGlzIGFwcHJveGltYXRlbHkgJyArIEwoaXQsICExKSArICcgbXMgdG8gdGhlIG5leHQgc2VnbWVudDsgdXNpbmcgZHVyYXRpb24gJyArIEwoYSwgITEpICsgJyBtcyBmb3IgdGhlIGxhc3QgdmlkZW8gZnJhbWUuJykpIDogYSA9IEs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gTWF0aC5yb3VuZChOLnB0cyAtIE4uZHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0czogeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwZW5kZWRPbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JlZHVuZGFuY3k6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyYWRQcmlvOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uOiBOLmtleSA/IDIgOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOb25TeW5jOiBOLmtleSA/IDAgOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dEF2Y0R0cyA9IHAgKyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV0ID0gdC5kcm9wcGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubmJOYWx1ID0gMCwgdC5kcm9wcGVkID0gMCwgZy5sZW5ndGggJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2Nocm9tZScpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3QgPSBnWzBdLmZsYWdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LmRlcGVuZHNPbiA9IDIsIHN0LmlzTm9uU3luYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNhbXBsZXMgPSBnLCB1ID0gTS5tb29mKHQuc2VxdWVuY2VOdW1iZXIrKywgZCwgdCksIHQuc2FtcGxlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UFRTOiBsIC8gdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQVFM6IChmICsgYSkgLyB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RFRTOiBkIC8gdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREVFM6IHRoaXMubmV4dEF2Y0R0cyAvIHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdWRpbzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVmlkZW86ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iOiBnLmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkOiBldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9ic2VydmVyLnRyaWdnZXIocy5hLkZSQUdfUEFSU0lOR19EQVRBLCBudCksIG50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZW11eEF1ZGlvID0gZnVuY3Rpb24gKHQsIGksIGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGgsIGEsIGMsIHUsIGwsIGQsIGYgPSB0LmlucHV0VGltZVNjYWxlLCBwID0gdC50aW1lc2NhbGUsIGIgPSBmIC8gcCwgdiA9ICh0LmlzQUFDID8gMTAyNCA6IDExNTIpICogYiwgbSA9IHRoaXMuQ3QsIGcgPSB0aGlzLmp0LCB5ID0gIXQuaXNBQUMgJiYgdGhpcy50eXBlU3VwcG9ydGVkLm1wZWcsIHcgPSB5ID8gMCA6IDgsIE8gPSB0LnNhbXBsZXMsIHggPSBbXSwgUyA9IHRoaXMubmV4dEF1ZGlvUHRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSB8PSBPLmxlbmd0aCAmJiBTICYmIChyICYmIE1hdGguYWJzKGkgLSBTIC8gZikgPCAwLjEgfHwgTWF0aC5hYnMoT1swXS5wdHMgLSBTIC0gZykgPCAyMCAqIHYpLCBPLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB0cyA9IHQuZHRzID0gbSh0LnB0cyAtIGcsIGkgKiBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAwICE9PSAoTyA9IE8uZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHRzID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSB8fCAoUyA9IHIgPyBpICogZiA6IE9bMF0ucHRzKSwgdC5pc0FBQykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gdGhpcy5jb25maWcubWF4QXVkaW9GcmFtZXNEcmlmdCwgayA9IDAsIF8gPSBTOyBrIDwgTy5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBBLCBJID0gT1trXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChBID0gSS5wdHMgLSBfKSA8PSAtaiAqIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmIud2FybignRHJvcHBpbmcgMSBhdWRpbyBmcmFtZSBAICcgKyBMKF8sICEwKSArICcgbXMgZHVlIHRvICcgKyBMKEEsICEwKSArICcgbXMgb3ZlcmxhcC4nKSwgTy5zcGxpY2UoaywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEEgPj0gaiAqIHYgJiYgQSA8IEQgJiYgXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSBNYXRoLnJvdW5kKEEgLyB2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYi53YXJuKCdJbmplY3RpbmcgJyArIEMgKyAnIGF1ZGlvIGZyYW1lcyBAICcgKyBMKF8sICEwKSArICcgbXMgZHVlIHRvICcgKyBMKF8sICEwKSArICcgbXMgZ2FwLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgUCA9IDA7IFAgPCBDOyBQKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSA9IE1hdGgubWF4KF8sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gVC5nZXRTaWxlbnRGcmFtZSh0Lm1hbmlmZXN0Q29kZWMgfHwgdC5jb2RlYywgdC5jaGFubmVsQ291bnQpKSB8fCAoby5iLmxvZygnVW5hYmxlIHRvIGdldCBzaWxlbnQgZnJhbWUgZm9yIGdpdmVuIGF1ZGlvIGNvZGVjOyBkdXBsaWNhdGluZyBsYXN0IGZyYW1lIGluc3RlYWQuJyksIGEgPSBJLnVuaXQuc3ViYXJyYXkoKSksIE8uc3BsaWNlKGssIDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRzOiBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHM6IEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgXyArPSB2LCBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLnB0cyA9IEkuZHRzID0gXywgXyArPSB2LCBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoQSksIEkucHRzID0gSS5kdHMgPSBfLCBfICs9IHYsIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBSID0gTy5sZW5ndGgsIEIgPSAwOyBSLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIgKz0gT1tSXS51bml0LmJ5dGVMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBGID0gMCwgViA9IE8ubGVuZ3RoOyBGIDwgVjsgRisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFUgPSBPW0ZdLCAkID0gVS51bml0LCBOID0gVS5wdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5kdXJhdGlvbiA9IE1hdGgucm91bmQoKE4gLSBkKSAvIGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSCA9IE4gLSBTLCBxID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgdC5pc0FBQyAmJiBIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSCA+IDAgJiYgSCA8IEQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IE1hdGgucm91bmQoKE4gLSBTKSAvIHYpLCBvLmIubG9nKEwoSCwgITApICsgJyBtcyBob2xlIGJldHdlZW4gQUFDIHNhbXBsZXMgZGV0ZWN0ZWQsZmlsbGluZyBpdCcpLCBxID4gMCAmJiAoKGEgPSBULmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlYyB8fCB0LmNvZGVjLCB0LmNoYW5uZWxDb3VudCkpIHx8IChhID0gJC5zdWJhcnJheSgpKSwgQiArPSBxICogYS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSCA8IC0xMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYi5sb2coJ2Ryb3Agb3ZlcmxhcHBpbmcgQUFDIHNhbXBsZSwgZXhwZWN0ZWQvcGFyc2VkL2RlbHRhOiAnICsgTChTLCAhMCkgKyAnIG1zIC8gJyArIEwoTiwgITApICsgJyBtcyAvICcgKyBMKC1ILCAhMCkgKyAnIG1zJyksIEIgLT0gJC5ieXRlTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiA9IFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgPSBOLCAhKEIgPiAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQiArPSB3OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG5ldyBVaW50OEFycmF5KEIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLm9ic2VydmVyLnRyaWdnZXIocy5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbi5iLk1VWF9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBuLmEuUkVNVVhfQUxMT0NfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogJ2ZhaWwgYWxsb2NhdGluZyBhdWRpbyBtZGF0ICcgKyBCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IHx8IChuZXcgRGF0YVZpZXcoYy5idWZmZXIpLnNldFVpbnQzMigwLCBCKSwgYy5zZXQoTS50eXBlcy5tZGF0LCA0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHogPSAwOyB6IDwgcTsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPSBULmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlYyB8fCB0LmNvZGVjLCB0LmNoYW5uZWxDb3VudCkpIHx8IChvLmIubG9nKCdVbmFibGUgdG8gZ2V0IHNpbGVudCBmcmFtZSBmb3IgZ2l2ZW4gYXVkaW8gY29kZWM7IGR1cGxpY2F0aW5nIHRoaXMgZnJhbWUgaW5zdGVhZC4nKSwgYSA9ICQuc3ViYXJyYXkoKSksIGMuc2V0KGEsIHcpLCB3ICs9IGEuYnl0ZUxlbmd0aCwgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBhLmJ5dGVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAxMDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXBlbmRlZE9uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNSZWR1bmRhbmN5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyYWRQcmlvOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzT246IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB4LnB1c2goaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2V0KCQsIHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBXID0gJC5ieXRlTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gVywgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVhZGluZzogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVwZW5kZWRPbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JlZHVuZGFuY3k6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyYWRQcmlvOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kc09uOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB4LnB1c2goaCksIGQgPSBOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChSID0geC5sZW5ndGgpID49IDIgJiYgKEcgPSB4W1IgLSAyXS5kdXJhdGlvbiwgaC5kdXJhdGlvbiA9IEcpLCBSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0QXVkaW9QdHMgPSBTID0gZCArIGIgKiBHLCB0LnNhbXBsZXMgPSB4LCB1ID0geSA/IG5ldyBVaW50OEFycmF5KCkgOiBNLm1vb2YodC5zZXF1ZW5jZU51bWJlcisrLCBsIC8gYiwgdCksIHQuc2FtcGxlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBKID0gbCAvIGYsIFEgPSBTIC8gZiwgWCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTI6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBUUzogSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBUUzogUSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RFRTOiBKLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kRFRTOiBRLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2F1ZGlvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ZpZGVvOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iOiBSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXIudHJpZ2dlcihzLmEuRlJBR19QQVJTSU5HX0RBVEEsIFgpLCBYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlbXV4RW1wdHlBdWRpbyA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5pbnB1dFRpbWVTY2FsZSwgciA9IG4gLyAodC5zYW1wbGVyYXRlID8gdC5zYW1wbGVyYXRlIDogbiksIGggPSB0aGlzLm5leHRBdWRpb1B0cywgYSA9ICh2b2lkIDAgIT09IGggPyBoIDogcy5zdGFydERUUyAqIG4pICsgdGhpcy5rdCwgYyA9IHMuZW5kRFRTICogbiArIHRoaXMua3QsIHUgPSAxMDI0ICogciwgbCA9IE1hdGguY2VpbCgoYyAtIGEpIC8gdSksIGQgPSBULmdldFNpbGVudEZyYW1lKHQubWFuaWZlc3RDb2RlYyB8fCB0LmNvZGVjLCB0LmNoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLmIud2FybigncmVtdXggZW1wdHkgQXVkaW8nKSwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZiA9IFtdLCBwID0gMDsgcCA8IGw7IHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYSArIHAgKiB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0czogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzOiBiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNhbXBsZXMgPSBmLCB0aGlzLnJlbXV4QXVkaW8odCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5iLnRyYWNlKCdVbmFibGUgdG8gcmVtdXhFbXB0eUF1ZGlvIHNpbmNlIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhIHNpbGVudCBmcmFtZSBmb3IgZ2l2ZW4gYXVkaW8gY29kZWMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZW11eElEMyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlID0gdC5zYW1wbGVzLmxlbmd0aCwgbiA9IHQuaW5wdXRUaW1lU2NhbGUsIHIgPSB0aGlzLmp0LCBoID0gdGhpcy5rdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZTsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID0gdC5zYW1wbGVzW2FdKS5wdHMgPSAoaS5wdHMgLSByKSAvIG4sIGkuZHRzID0gKGkuZHRzIC0gaCkgLyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIHsgc2FtcGxlczogdC5zYW1wbGVzIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2FtcGxlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVtdXhUZXh0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zYW1wbGVzLnNvcnQoZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnB0cyAtIGkucHRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUgPSB0LnNhbXBsZXMubGVuZ3RoLCBuID0gdC5pbnB1dFRpbWVTY2FsZSwgciA9IHRoaXMuanQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoID0gMDsgaCA8IGU7IGgrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IHQuc2FtcGxlc1toXSkucHRzID0gKGkucHRzIC0gcikgLyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci50cmlnZ2VyKHMuYS5GUkFHX1BBUlNJTkdfVVNFUkRBVEEsIHsgc2FtcGxlczogdC5zYW1wbGVzIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2FtcGxlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuQ3QgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSBpIDwgdCA/IC04NTg5OTM0NTkyIDogODU4OTkzNDU5MjsgTWF0aC5hYnModCAtIGkpID4gNDI5NDk2NzI5NjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICs9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIFUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZXNldFRpbWVTdGFtcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnJlc2V0SW5pdFNlZ21lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZW11eCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBuLCByLCBoLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gdGhpcy5vYnNlcnZlciwgdSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh1ICs9ICdhdWRpbycpLCBpICYmICh1ICs9ICd2aWRlbycpLCBjLnRyaWdnZXIocy5hLkZSQUdfUEFSU0lOR19EQVRBLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UFRTOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREVFM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW86ICEhdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ZpZGVvOiAhIWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMudHJpZ2dlcihzLmEuRlJBR19QQVJTRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksICQgPSBPYmplY3QoYy5hKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICQucGVyZm9ybWFuY2Uubm93LmJpbmQoJC5wZXJmb3JtYW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYi5kZWJ1ZygnVW5hYmxlIHRvIHVzZSBQZXJmb3JtYW5jZSBBUEkgb24gdGhpcyBlbnZpcm9ubWVudCcpLCBCID0gJC5EYXRlLm5vdzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIgPSB0LCB0aGlzLnR5cGVTdXBwb3J0ZWQgPSBpLCB0aGlzLmNvbmZpZyA9IGUsIHRoaXMudmVuZG9yID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5kZW11eGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnB1c2ggPSBmdW5jdGlvbiAodCwgaSwgZSwgbiwgciwgaCwgYSwgbywgYywgbCwgZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5ieXRlTGVuZ3RoID4gMCAmJiBudWxsICE9IGkgJiYgbnVsbCAhPSBpLmtleSAmJiAnQUVTLTEyOCcgPT09IGkubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdGhpcy5kZWNyeXB0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gYiAmJiAoYiA9IHRoaXMuZGVjcnlwdGVyID0gbmV3IHUodGhpcy5vYnNlcnZlciwgdGhpcy5jb25maWcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBCKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZGVjcnlwdCh0LCBpLmtleS5idWZmZXIsIGkuaXYuYnVmZmVyLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBCKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLm9ic2VydmVyLnRyaWdnZXIocy5hLkZSQUdfREVDUllQVEVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHN0YXJ0OiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZGVjcnlwdDogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBwLnB1c2hEZWNyeXB0ZWQobmV3IFVpbnQ4QXJyYXkodCksIGksIG5ldyBVaW50OEFycmF5KGUpLCBuLCByLCBoLCBhLCBvLCBjLCBsLCBkLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaERlY3J5cHRlZChuZXcgVWludDhBcnJheSh0KSwgaSwgbmV3IFVpbnQ4QXJyYXkoZSksIG4sIHIsIGgsIGEsIG8sIGMsIGwsIGQsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wdXNoRGVjcnlwdGVkID0gZnVuY3Rpb24gKHQsIGksIGUsIHIsIGgsIGEsIG8sIGMsIHUsIGwsIGQsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHRoaXMuZGVtdXhlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXAgfHwgKG8gfHwgYykgJiYgIXRoaXMucHJvYmUodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IHRoaXMub2JzZXJ2ZXIsIHYgPSB0aGlzLnR5cGVTdXBwb3J0ZWQsIG0gPSB0aGlzLmNvbmZpZywgZyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdXg6IEksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW11eDogVgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW11eDogeC5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtdXg6IFUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtdXg6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW11eDogVgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW11eDogQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbXV4OiBWCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCB5ID0gMCwgdyA9IGcubGVuZ3RoOyB5IDwgdzsgeSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUyA9IGdbeV0sIGogPSBTLmRlbXV4LnByb2JlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGoodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IHRoaXMucmVtdXhlciA9IG5ldyBTLnJlbXV4KGIsIG0sIHYsIHRoaXMudmVuZG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gbmV3IFMuZGVtdXgoYiwgaywgbSwgdiksIHRoaXMucHJvYmUgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGIudHJpZ2dlcihzLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogbi5hLkZSQUdfUEFSU0lOR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnbm8gZGVtdXggbWF0Y2hpbmcgd2l0aCBjb250ZW50IGZvdW5kJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVtdXhlciA9IHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfID0gdGhpcy5yZW11eGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvIHx8IGMpICYmIChwLnJlc2V0SW5pdFNlZ21lbnQoZSwgciwgaCwgbCksIF8ucmVzZXRJbml0U2VnbWVudCgpKSwgbyAmJiAocC5yZXNldFRpbWVTdGFtcChmKSwgXy5yZXNldFRpbWVTdGFtcChmKSksICdmdW5jdGlvbicgPT0gdHlwZW9mIHAuc2V0RGVjcnlwdERhdGEgJiYgcC5zZXREZWNyeXB0RGF0YShpKSwgcC5hcHBlbmQodCwgYSwgdSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYSA9IE47CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZSgwKSwgbiA9IGUoMSksIHIgPSBNYXRoLnBvdygyLCAzMikgLSAxLCBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyID0gdCwgdGhpcy5yZW11eGVyID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5yZXNldFRpbWVTdGFtcCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBUUyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZXNldEluaXRTZWdtZW50ID0gZnVuY3Rpb24gKGksIGUsIHMsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgaS5ieXRlTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuaW5pdERhdGEgPSB0LnBhcnNlSW5pdFNlZ21lbnQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IGUgJiYgKGUgPSAnbXA0YS40MC41JyksIG51bGwgPT0gcyAmJiAocyA9ICdhdmMxLjQyZTAxZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguYXVkaW8gJiYgaC52aWRlbyA/IGEuYXVkaW92aWRlbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICd2aWRlby9tcDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiBlICsgJywnICsgcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VnbWVudDogciA/IGkgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogKGguYXVkaW8gJiYgKGEuYXVkaW8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiAnYXVkaW8vbXA0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0U2VnbWVudDogciA/IGkgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaC52aWRlbyAmJiAoYS52aWRlbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6ICd2aWRlby9tcDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWdtZW50OiByID8gaSA6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5vYnNlcnZlci50cmlnZ2VyKG4uYS5GUkFHX1BBUlNJTkdfSU5JVF9TRUdNRU5ULCB7IHRyYWNrczogYSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmICh0aGlzLmF1ZGlvQ29kZWMgPSBlKSwgcyAmJiAodGhpcy52aWRlb0NvZGVjID0gcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm9iZSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZpbmRCb3goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBNYXRoLm1pbihpLmxlbmd0aCwgMTYzODQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFsnbW9vZiddKS5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuYmluMnN0ciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucmVhZFVpbnQxNiA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGF0YSAmJiAoaSArPSB0LnN0YXJ0LCB0ID0gdC5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0W2ldIDw8IDggfCB0W2kgKyAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPCAwID8gNjU1MzYgKyBlIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnJlYWRVaW50MzIgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRhdGEgJiYgKGkgKz0gdC5zdGFydCwgdCA9IHQuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdFtpXSA8PCAyNCB8IHRbaSArIDFdIDw8IDE2IHwgdFtpICsgMl0gPDwgOCB8IHRbaSArIDNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA8IDAgPyA0Mjk0OTY3Mjk2ICsgZSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC53cml0ZVVpbnQzMiA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGF0YSAmJiAoaSArPSB0LnN0YXJ0LCB0ID0gdC5kYXRhKSwgdFtpXSA9IGUgPj4gMjQsIHRbaSArIDFdID0gZSA+PiAxNiAmIDI1NSwgdFtpICsgMl0gPSBlID4+IDggJiAyNTUsIHRbaSArIDNdID0gMjU1ICYgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmZpbmRCb3ggPSBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiwgciwgaCwgYSwgbywgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5kYXRhID8gKGEgPSBpLnN0YXJ0LCByID0gaS5lbmQsIGkgPSBpLmRhdGEpIDogKGEgPSAwLCByID0gaS5ieXRlTGVuZ3RoKSwgIWUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IGE7IHMgPCByOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAobiA9IHQucmVhZFVpbnQzMihpLCBzKSkgPiAxID8gcyArIG4gOiByLCB0LmJpbjJzdHIoaS5zdWJhcnJheShzICsgNCwgcyArIDgpKSA9PT0gZVswXSAmJiAoMSA9PT0gZS5sZW5ndGggPyBjLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHMgKyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAoaCA9IHQuZmluZEJveCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogcyArIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnNsaWNlKDEpKSkubGVuZ3RoICYmIChjID0gYy5jb25jYXQoaCkpKSwgcyA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucGFyc2VTZWdtZW50SW5kZXggPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcyA9IHQuZmluZEJveChpLCBbJ21vb3YnXSlbMF0sIG4gPSBzID8gcy5lbmQgOiBudWxsLCByID0gMCwgaCA9IHQuZmluZEJveChpLCBbJ3NpZHgnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCB8fCAhaFswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gKGggPSBoWzBdKS5kYXRhWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gMCA9PT0gYSA/IDggOiAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0LnJlYWRVaW50MzIoaCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKz0gNCwgciArPSAwID09PSBhID8gOCA6IDE2LCByICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gaC5lbmQgKyAwLCB1ID0gdC5yZWFkVWludDE2KGgsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwOyBsIDwgdTsgbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHIsIGYgPSB0LnJlYWRVaW50MzIoaCwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IDIxNDc0ODM2NDcgJiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT0gKDIxNDc0ODM2NDggJiBmKSA+Pj4gMzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCdTSURYIGhhcyBoaWVyYXJjaGljYWwgcmVmZXJlbmNlcyAobm90IHN1cHBvcnRlZCknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gdC5yZWFkVWludDMyKGgsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSA0LCBlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZVNpemU6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VnbWVudER1cmF0aW9uOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IGIgLyBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBjICsgcCAtIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyArPSBwLCByID0gZCArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGU6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlc0NvdW50OiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vb3ZFbmRPZmZzZXQ6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlSW5pdFNlZ21lbnQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maW5kQm94KGksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb292JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFrJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuZmluZEJveChpLCBbJ3RraGQnXSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5kYXRhW24uc3RhcnRdLCBoID0gMCA9PT0gciA/IDEyIDogMjAsIGEgPSB0LnJlYWRVaW50MzIobiwgaCksIG8gPSB0LmZpbmRCb3goaSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21kaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21kaGQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSAwID09PSAociA9IG8uZGF0YVtvLnN0YXJ0XSkgPyAxMiA6IDIwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHQucmVhZFVpbnQzMihvLCBoKSwgdSA9IHQuZmluZEJveChpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21kaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZGxyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuOiAnYXVkaW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGU6ICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1bdC5iaW4yc3RyKHUuZGF0YS5zdWJhcnJheSh1LnN0YXJ0ICsgOCwgdS5zdGFydCArIDEyKSldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHQuZmluZEJveChpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZGlhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbmYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RibCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHNkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0LmJpbjJzdHIoZC5kYXRhLnN1YmFycmF5KGQuc3RhcnQgKyAxMiwgZC5zdGFydCArIDE2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYi5sb2coJ01QNERlbXV4ZXI6JyArIGwgKyAnOicgKyBmICsgJyBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW2FdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlW2xdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc2NhbGU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5nZXRTdGFydERUUyA9IGZ1bmN0aW9uIChpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IHQuZmluZEJveChlLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9vZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhZicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIG4gPSBbXS5jb25jYXQuYXBwbHkoW10sIHMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maW5kQm94KGUsIFsndGZoZCddKS5tYXAoZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IHQucmVhZFVpbnQzMihzLCA0KSwgciA9IGlbbl0udGltZXNjYWxlIHx8IDkwMDAwLCB0LmZpbmRCb3goZSwgWyd0ZmR0J10pLm1hcChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBpLmRhdGFbaS5zdGFydF0sIHMgPSB0LnJlYWRVaW50MzIoaSwgNCksIDEgPT09IGUgJiYgKHMgKj0gTWF0aC5wb3coMiwgMzIpLCBzICs9IHQucmVhZFVpbnQzMihpLCA4KSksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbMF0gLyByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgciA9IE1hdGgubWluLmFwcGx5KG51bGwsIG4pLCBpc0Zpbml0ZShyKSA/IHIgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQub2Zmc2V0U3RhcnREVFMgPSBmdW5jdGlvbiAoaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpbmRCb3goZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vb2YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmluZEJveChlLCBbJ3RmaGQnXSkubWFwKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0LnJlYWRVaW50MzIobiwgNCksIGEgPSBpW2hdLnRpbWVzY2FsZSB8fCA5MDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpbmRCb3goZSwgWyd0ZmR0J10pLm1hcChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuZGF0YVtpLnN0YXJ0XSwgbiA9IHQucmVhZFVpbnQzMihpLCA0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LndyaXRlVWludDMyKGksIDQsIG4gLSBzICogYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAqPSBNYXRoLnBvdygyLCAzMiksIG4gKz0gdC5yZWFkVWludDMyKGksIDgpLCBuIC09IHMgKiBhLCBuID0gTWF0aC5tYXgobiwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IE1hdGguZmxvb3IobiAvIChyICsgMSkpLCBvID0gTWF0aC5mbG9vcihuICUgKHIgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LndyaXRlVWludDMyKGksIDQsIGgpLCB0LndyaXRlVWludDMyKGksIDgsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5hcHBlbmQgPSBmdW5jdGlvbiAoaSwgZSwgcywgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMuaW5pdERhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggfHwgKHRoaXMucmVzZXRJbml0U2VnbWVudChpLCB0aGlzLmF1ZGlvQ29kZWMsIHRoaXMudmlkZW9Db2RlYywgITEpLCBoID0gdGhpcy5pbml0RGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvID0gdGhpcy5pbml0UFRTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHQuZ2V0U3RhcnREVFMoaCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRQVFMgPSBvID0gYyAtIGUsIHRoaXMub2JzZXJ2ZXIudHJpZ2dlcihuLmEuSU5JVF9QVFNfRk9VTkQsIHsgaW5pdFBUUzogbyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm9mZnNldFN0YXJ0RFRTKGgsIGksIG8pLCBhID0gdC5nZXRTdGFydERUUyhoLCBpKSwgdGhpcy5yZW11eGVyLnJlbXV4KGguYXVkaW8sIGgudmlkZW8sIG51bGwsIG51bGwsIGEsIHMsIHIsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpLmEgPSBoOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlbc10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpW3NdLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpW3NdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3NdLmNhbGwobi5leHBvcnRzLCBuLCBuLmV4cG9ydHMsIGUpLCBuLmwgPSAhMCwgbi5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5tID0gdCwgZS5jID0gaSwgZS5pID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuZCA9IGZ1bmN0aW9uICh0LCBpLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5vKHQsIGkpIHx8IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLm4gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdCAmJiB0Ll8gPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5kKGksICdhJywgaSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLm8gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnAgPSAnLycsIGUub2UgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbnNvbGUuZXJyb3IodCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBlKGUucyA9IEVOVFJZX01PRFVMRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5kZWZhdWx0IHx8IHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnXFwoXFxzKigvXFwqLio/XFwqLyk/XFxzKi4qPyhbXFwufFxcLXxcXCt8XFx3fC98QF0rKS4qP1xcKSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0ICsgJycpLnJlcGxhY2UoL1suPyorXiRbXF1cXCgpe318LV0vZywgJ1xcJCYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQsIGksIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoW3NdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGkudG9TdHJpbmcoKSwgbyA9IGEubWF0Y2goL15mdW5jdGlvblxzP1x3KlwoXHcrLFxzKlx3KyxccyooXHcrKVwpLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjLCB1ID0gb1sxXSwgbCA9IG5ldyBSZWdFeHAoJyhcXFxcbnxcXFcpJyArIHIodSkgKyBuLCAnZycpOyBjID0gbC5leGVjKGEpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGxsLXJlZmVyZW5jZScgIT09IGNbM10gJiYgaFtzXS5wdXNoKGNbM10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gbmV3IFJlZ0V4cCgnXFwoJyArIHIodSkgKyAnXFwoIihkbGwtcmVmZXJlbmNlXFxzKFtcXC58XFwtfFxcK3xcXHd8L3xAXSspKSJcXClcXCknICsgbiwgJ2cnKTsgYyA9IGwuZXhlYyhhKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtjWzJdXSB8fCAoaFtzXS5wdXNoKGNbMV0pLCB0W2NbMl1dID0gZShjWzFdKS5tKSwgaFtjWzJdXSA9IGhbY1syXV0gfHwgW10sIGhbY1syXV0ucHVzaChjWzRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQsIGYgPSBPYmplY3Qua2V5cyhoKSwgcCA9IDA7IHAgPCBmLmxlbmd0aDsgcCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgaFtmW3BdXS5sZW5ndGg7IGIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGhbZltwXV1bYl0sIGlzTmFOKDEgKiBkKSB8fCAoaFtmW3BdXVtiXSA9IDEgKiBoW2ZbcF1dW2JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLnJlZHVjZShmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IHRbZV0ubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHsgbWFpbjogZS5tIH0sIHIgPSBpLmFsbCA/IHsgbWFpbjogT2JqZWN0LmtleXMobi5tYWluKSB9IDogZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHsgbWFpbjogW2ldIH0sIHMgPSB7IG1haW46IFtdIH0sIG4gPSB7IG1haW46IHt9IH07IGEoZSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IE9iamVjdC5rZXlzKGUpLCBvID0gMDsgbyA8IHIubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHJbb10sIHUgPSBlW2NdLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuW2NdID0gbltjXSB8fCB7fSwgIW5bY11bdV0gJiYgdFtjXVt1XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2NdW3VdID0gITAsIHNbY10gPSBzW2NdIHx8IFtdLCBzW2NdLnB1c2godSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSBoKHQsIHRbY11bdV0sIGMpLCBkID0gT2JqZWN0LmtleXMobCksIGYgPSAwOyBmIDwgZC5sZW5ndGg7IGYrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbZFtmXV0gPSBlW2RbZl1dIHx8IFtdLCBlW2RbZl1dID0gZVtkW2ZdXS5jb25jYXQobFtkW2ZdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4sIHQpLCBvID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ21haW4nICE9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyByW3RdW2ldOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbdF0ucHVzaChpKSwgblt0XVtpXSA9ICcoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7IG1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXzsgfSknLCBvID0gbyArICd2YXIgJyArIHQgKyAnID0gKCcgKyBzLnRvU3RyaW5nKCkucmVwbGFjZSgnRU5UUllfTU9EVUxFJywgSlNPTi5zdHJpbmdpZnkoaSkpICsgJykoeycgKyByW3RdLm1hcChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSkgKyAnOiAnICsgblt0XVtpXS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKSArICd9KTtcbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyA9IG8gKyAnbmV3ICgoJyArIHMudG9TdHJpbmcoKS5yZXBsYWNlKCdFTlRSWV9NT0RVTEUnLCBKU09OLnN0cmluZ2lmeSh0KSkgKyAnKSh7JyArIHIubWFpbi5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkgKyAnOiAnICsgbi5tYWluW3RdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJykgKyAnfSkpKHNlbGYpOyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyB3aW5kb3cuQmxvYihbb10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5iYXJlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAod2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMIHx8IHdpbmRvdy5tb3pVUkwgfHwgd2luZG93Lm1zVVJMKS5jcmVhdGVPYmplY3RVUkwoYyksIGwgPSBuZXcgd2luZG93Lldvcmtlcih1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLm9iamVjdFVSTCA9IHUsIGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGUucihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBlKDkpLCBuID0gZSgxKSwgciA9IGUoMCksIGggPSBlKDgpOwogICAgICAgICAgICAgICAgICAgICAgICBpLmRlZmF1bHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgaC5FdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJpZ2dlciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHMgPSBuZXcgQXJyYXkoZSA+IDEgPyBlIC0gMSA6IDApLCBuID0gMTsgbiA8IGU7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1tuIC0gMV0gPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lbWl0LmFwcGx5KGksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub2ZmID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCwgcyA9IG5ldyBBcnJheShlID4gMSA/IGUgLSAxIDogMCksIG4gPSAxOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW24gLSAxXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZUxpc3RlbmVyLmFwcGx5KGksIFt0XS5jb25jYXQocykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gbi5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaC5jbWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBKU09OLnBhcnNlKGguY29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5kZW11eGVyID0gbmV3IHMuYShpLCBoLnR5cGVTdXBwb3J0ZWQsIGEsIGgudmVuZG9yKSwgT2JqZWN0KHIuYSkoYS5kZWJ1ZyksIGUoJ2luaXQnLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVtdXgnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRlbXV4ZXIucHVzaChoLmRhdGEsIGguZGVjcnlwdGRhdGEsIGguaW5pdFNlZ21lbnQsIGguYXVkaW9Db2RlYywgaC52aWRlb0NvZGVjLCBoLnRpbWVPZmZzZXQsIGguZGlzY29udGludWl0eSwgaC50cmFja1N3aXRjaCwgaC5jb250aWd1b3VzLCBoLmR1cmF0aW9uLCBoLmFjY3VyYXRlVGltZU9mZnNldCwgaC5kZWZhdWx0SW5pdFBUUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkub24obi5hLkZSQUdfREVDUllQVEVELCBlKSwgaS5vbihuLmEuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCwgZSksIGkub24obi5hLkZSQUdfUEFSU0VELCBlKSwgaS5vbihuLmEuRVJST1IsIGUpLCBpLm9uKG4uYS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIGUpLCBpLm9uKG4uYS5GUkFHX1BBUlNJTkdfVVNFUkRBVEEsIGUpLCBpLm9uKG4uYS5JTklUX1BUU19GT1VORCwgZSksIGkub24obi5hLkZSQUdfUEFSU0lOR19EQVRBLCBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gW10sIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRhdGExICYmIChuLmRhdGExID0gZS5kYXRhMS5idWZmZXIsIHMucHVzaChlLmRhdGExLmJ1ZmZlciksIGRlbGV0ZSBlLmRhdGExKSwgZS5kYXRhMiAmJiAobi5kYXRhMiA9IGUuZGF0YTIuYnVmZmVyLCBzLnB1c2goZS5kYXRhMi5idWZmZXIpLCBkZWxldGUgZS5kYXRhMiksIHQucG9zdE1lc3NhZ2Uobiwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfZjdhNjBhMTQzZDc0MTZkMiA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZjdhNjBhMTQzZDc0MTZkMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja184MWJhMzMyZjc3MDY0MGNiLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnIoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG4sIHIgPSBlKDcpLCBoID0gZSgyKSwgYSA9IGUoMyksIG8gPSBlKDEpLCBjID0gZSgwKSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsc0V2ZW50R2VuZXJpYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHNIYW5kbGVyRGVzdHJveWluZzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHNIYW5kbGVyRGVzdHJveWVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuaGFuZGxlZEV2ZW50cyA9IHZvaWQgMCwgdGhpcy51c2VHZW5lcmljSGFuZGxlciA9IHZvaWQgMCwgdGhpcy5obHMgPSB0LCB0aGlzLm9uRXZlbnQgPSB0aGlzLm9uRXZlbnQuYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCwgZSA9IG5ldyBBcnJheShpID4gMSA/IGkgLSAxIDogMCksIHMgPSAxOyBzIDwgaTsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3MgLSAxXSA9IGFyZ3VtZW50c1tzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZWRFdmVudHMgPSBlLCB0aGlzLnVzZUdlbmVyaWNIYW5kbGVyID0gITAsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25IYW5kbGVyRGVzdHJveWluZygpLCB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5vbkhhbmRsZXJEZXN0cm95ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub25IYW5kbGVyRGVzdHJveWluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub25IYW5kbGVyRGVzdHJveWVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5pc0V2ZW50SGFuZGxlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIHRoaXMuaGFuZGxlZEV2ZW50cyAmJiB0aGlzLmhhbmRsZWRFdmVudHMubGVuZ3RoICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHRoaXMub25FdmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucmVnaXN0ZXJMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0V2ZW50SGFuZGxlcigpICYmIHRoaXMuaGFuZGxlZEV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1W3RdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3JiaWRkZW4gZXZlbnQtbmFtZTogJyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhscy5vbih0LCB0aGlzLm9uRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS51bnJlZ2lzdGVyTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFdmVudEhhbmRsZXIoKSAmJiB0aGlzLmhhbmRsZWRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhscy5vZmYodCwgdGhpcy5vbkV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub25FdmVudCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkV2ZW50R2VuZXJpYyh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub25FdmVudEdlbmVyaWMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnb24nICsgdC5yZXBsYWNlKCdobHMnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdGhpc1tlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V2ZW50ICcgKyB0ICsgJyBoYXMgbm8gZ2VuZXJpYyBoYW5kbGVyIGluIHRoaXMgJyArIHRoaXMuY29uc3RydWN0b3IubmFtZSArICcgY2xhc3MgKHRyaWVkICcgKyBlICsgJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2VdLmJpbmQodGhpcywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uY2FsbCh0aGlzLCB0LCBpKS5jYWxsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmVycm9yKCdBbiBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZCB3aGlsZSBoYW5kbGluZyBldmVudCAnICsgdCArICcuIEVycm9yIG1lc3NhZ2U6ICInICsgaS5tZXNzYWdlICsgJyIuIEhlcmUgaXMgYSBzdGFja3RyYWNlOicsIGkpLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk9USEVSX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaC5hLklOVEVSTkFMX0VYQ0VQVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5NQU5JRkVTVCA9ICdtYW5pZmVzdCcsIHQuTEVWRUwgPSAnbGV2ZWwnLCB0LkFVRElPX1RSQUNLID0gJ2F1ZGlvVHJhY2snLCB0LlNVQlRJVExFX1RSQUNLID0gJ3N1YnRpdGxlVHJhY2snOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuTUFJTiA9ICdtYWluJywgdC5BVURJTyA9ICdhdWRpbycsIHQuU1VCVElUTEUgPSAnc3VidGl0bGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlKDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBpLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVudW1lcmFibGUgPSBzLmVudW1lcmFibGUgfHwgITEsIHMuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gcyAmJiAocy53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHMua2V5LCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCwgYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVHQgPSBudWxsLCB0aGlzLmJhc2V1cmkgPSB2b2lkIDAsIHRoaXMucmVsdXJpID0gdm9pZCAwLCB0aGlzLm1ldGhvZCA9IG51bGwsIHRoaXMua2V5ID0gbnVsbCwgdGhpcy5pdiA9IG51bGwsIHRoaXMuYmFzZXVyaSA9IHQsIHRoaXMucmVsdXJpID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB0LCAoZSA9IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3VyaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLlR0ICYmIHRoaXMucmVsdXJpICYmICh0aGlzLlR0ID0gT2JqZWN0KHIuYnVpbGRBYnNvbHV0ZVVSTCkodGhpcy5iYXNldXJpLCB0aGlzLnJlbHVyaSwgeyBhbHdheXNOb3JtYWxpemU6ICEwIH0pKSwgdGhpcy5UdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKSAmJiBmKGkucHJvdG90eXBlLCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGkubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZW51bWVyYWJsZSA9IHMuZW51bWVyYWJsZSB8fCAhMSwgcy5jb25maWd1cmFibGUgPSAhMCwgJ3ZhbHVlJyBpbiBzICYmIChzLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgcy5rZXksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LkFVRElPID0gJ2F1ZGlvJywgdC5WSURFTyA9ICd2aWRlbyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShwIHx8IChwID0ge30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QdCA9IG51bGwsIHRoaXMuTXQgPSBudWxsLCB0aGlzLkV0ID0gbnVsbCwgdGhpcy5MdCA9ICgodCA9IHt9KVtwLkFVRElPXSA9ICExLCB0W3AuVklERU9dID0gITEsIHQpLCB0aGlzLmRlbHRhUFRTID0gMCwgdGhpcy5yYXdQcm9ncmFtRGF0ZVRpbWUgPSBudWxsLCB0aGlzLnByb2dyYW1EYXRlVGltZSA9IG51bGwsIHRoaXMudGl0bGUgPSBudWxsLCB0aGlzLnRhZ0xpc3QgPSBbXSwgdGhpcy5jYyA9IHZvaWQgMCwgdGhpcy50eXBlID0gdm9pZCAwLCB0aGlzLnJlbHVybCA9IHZvaWQgMCwgdGhpcy5iYXNldXJsID0gdm9pZCAwLCB0aGlzLmR1cmF0aW9uID0gdm9pZCAwLCB0aGlzLnN0YXJ0ID0gdm9pZCAwLCB0aGlzLnNuID0gMCwgdGhpcy51cmxJZCA9IDAsIHRoaXMubGV2ZWwgPSAwLCB0aGlzLmxldmVsa2V5ID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgcyA9IHQucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zZXRCeXRlUmFuZ2UgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNwbGl0KCdAJywgMiksIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT09IGUubGVuZ3RoID8gc1swXSA9IGkgPyBpLmJ5dGVSYW5nZUVuZE9mZnNldCA6IDAgOiBzWzBdID0gcGFyc2VJbnQoZVsxXSksIHNbMV0gPSBwYXJzZUludChlWzBdKSArIHNbMF0sIHRoaXMuTXQgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmFkZEVsZW1lbnRhcnlTdHJlYW0gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MdFt0XSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmhhc0VsZW1lbnRhcnlTdHJlYW0gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSB0aGlzLkx0W3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmNyZWF0ZUluaXRpYWxpemF0aW9uVmVjdG9yID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBuZXcgVWludDhBcnJheSgxNiksIGUgPSAxMjsgZSA8IDE2OyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlXSA9IHQgPj4gOCAqICgxNSAtIGUpICYgMjU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMuc2V0RGVjcnlwdERhdGFGcm9tTGV2ZWxLZXkgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgdC5tZXRob2QgJiYgdC51cmkgJiYgIXQuaXYgJiYgKChlID0gbmV3IGIodC5iYXNldXJpLCB0LnJlbHVyaSkpLm1ldGhvZCA9IHQubWV0aG9kLCBlLml2ID0gdGhpcy5jcmVhdGVJbml0aWFsaXphdGlvblZlY3RvcihpKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSB0LCAoZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICd1cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuUHQgJiYgdGhpcy5yZWx1cmwgJiYgKHRoaXMuUHQgPSBPYmplY3Qoci5idWlsZEFic29sdXRlVVJMKSh0aGlzLmJhc2V1cmwsIHRoaXMucmVsdXJsLCB7IGFsd2F5c05vcm1hbGl6ZTogITAgfSkpLCB0aGlzLlB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlB0ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2J5dGVSYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk10ID8gdGhpcy5NdCA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYnl0ZVJhbmdlU3RhcnRPZmZzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ieXRlUmFuZ2VbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdieXRlUmFuZ2VFbmRPZmZzZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ieXRlUmFuZ2VbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdkZWNyeXB0ZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZXZlbGtleSAmJiAhdGhpcy5FdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuRXQgJiYgdGhpcy5sZXZlbGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnNuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgIT0gdHlwZW9mIHQgJiYgKHRoaXMubGV2ZWxrZXkgJiYgJ0FFUy0xMjgnID09PSB0aGlzLmxldmVsa2V5Lm1ldGhvZCAmJiAhdGhpcy5sZXZlbGtleS5pdiAmJiBjLmIud2FybignbWlzc2luZyBJViBmb3IgaW5pdGlhbGl6YXRpb24gc2VnbWVudCB3aXRoIG1ldGhvZD0iJyArIHRoaXMubGV2ZWxrZXkubWV0aG9kICsgJyIgLSBjb21wbGlhbmNlIGlzc3VlJyksIHQgPSAwKSwgdGhpcy5FdCA9IHRoaXMuc2V0RGVjcnlwdERhdGFGcm9tTGV2ZWxLZXkodGhpcy5sZXZlbGtleSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdlbmRQcm9ncmFtRGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdGhpcy5wcm9ncmFtRGF0ZVRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QoYS5hKSh0aGlzLnByb2dyYW1EYXRlVGltZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QoYS5hKSh0aGlzLmR1cmF0aW9uKSA/IHRoaXMuZHVyYXRpb24gOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9ncmFtRGF0ZVRpbWUgKyAxMDAwICogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2VuY3J5cHRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCF0aGlzLmRlY3J5cHRkYXRhIHx8IG51bGwgPT09IHRoaXMuZGVjcnlwdGRhdGEudXJpIHx8IG51bGwgIT09IHRoaXMuZGVjcnlwdGRhdGEua2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pICYmIHYoaS5wcm90b3R5cGUsIGUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBpLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVudW1lcmFibGUgPSBzLmVudW1lcmFibGUgfHwgITEsIHMuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gcyAmJiAocy53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHMua2V5LCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kQ0MgPSAwLCB0aGlzLmVuZFNOID0gMCwgdGhpcy5mcmFnbWVudHMgPSBbXSwgdGhpcy5pbml0U2VnbWVudCA9IG51bGwsIHRoaXMubGl2ZSA9ICEwLCB0aGlzLm5lZWRTaWR4UmFuZ2VzID0gITEsIHRoaXMuc3RhcnRDQyA9IDAsIHRoaXMuc3RhcnRTTiA9IDAsIHRoaXMuc3RhcnRUaW1lT2Zmc2V0ID0gbnVsbCwgdGhpcy50YXJnZXRkdXJhdGlvbiA9IDAsIHRoaXMudG90YWxkdXJhdGlvbiA9IDAsIHRoaXMudHlwZSA9IG51bGwsIHRoaXMudXJsID0gdCwgdGhpcy52ZXJzaW9uID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB0LCAoZSA9IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2hhc1Byb2dyYW1EYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIXRoaXMuZnJhZ21lbnRzWzBdIHx8ICFPYmplY3QoYS5hKSh0aGlzLmZyYWdtZW50c1swXS5wcm9ncmFtRGF0ZVRpbWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKSAmJiBnKGkucHJvdG90eXBlLCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB3ID0gL14oXGQrKXgoXGQrKSQvLCBPID0gL1xzKiguKz8pXHMqPSgoPzpcIi4qP1wiKXwuKj8pKD86LHwkKS9nLCB4ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiAoJ3N0cmluZycgPT0gdHlwZW9mIGkgJiYgKGkgPSB0LnBhcnNlQXR0ckxpc3QoaSkpLCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAodGhpc1tlXSA9IGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlY2ltYWxJbnRlZ2VyID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KHRoaXNbdF0sIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID8gMSAvIDAgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5oZXhhZGVjaW1hbEludGVnZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW3RdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gKHRoaXNbdF0gfHwgJzB4Jykuc2xpY2UoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoMSAmIGkubGVuZ3RoID8gJzAnIDogJycpICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IG5ldyBVaW50OEFycmF5KGkubGVuZ3RoIC8gMiksIHMgPSAwOyBzIDwgaS5sZW5ndGggLyAyOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3NdID0gcGFyc2VJbnQoaS5zbGljZSgyICogcywgMiAqIHMgKyAyKSwgMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmhleGFkZWNpbWFsSW50ZWdlckFzTnVtYmVyID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KHRoaXNbdF0sIDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID8gMSAvIDAgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5kZWNpbWFsRmxvYXRpbmdQb2ludCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpc1t0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmVudW1lcmF0ZWRTdHJpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5kZWNpbWFsUmVzb2x1dGlvbiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB3LmV4ZWModGhpc1t0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogcGFyc2VJbnQoaVsxXSwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwYXJzZUludChpWzJdLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucGFyc2VBdHRyTGlzdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE8ubGFzdEluZGV4ID0gMDsgbnVsbCAhPT0gKGkgPSBPLmV4ZWModCkpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGlbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHMuaW5kZXhPZignIicpICYmIHMubGFzdEluZGV4T2YoJyInKSA9PT0gcy5sZW5ndGggLSAxICYmIChzID0gcy5zbGljZSgxLCAtMSkpLCBlW2lbMV1dID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIFMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzZHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYy0zJzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FjLTQnOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGFjOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGF3OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmExOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHRzKyc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkdHMtJzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRzaDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VjLTMnOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNhOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNzE5OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnNzI2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtNGFlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaGExOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaGEyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaG0xOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaG0yOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbHBhOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRhOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmF3ICc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXI6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd2I6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd3A6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldmM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxY3A6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbXY6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3b3M6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsYXc6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMxOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmM0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmNwOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFjOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmF2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdmhlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmN2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXYxOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodmMxOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtanAyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDR2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmMxOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmMyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmMzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdmM0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjYwOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMjYzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmMxOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdmMyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmMtMSc6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwMDg6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwMDk6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQoKGkgfHwgJ3ZpZGVvJykgKyAnL21wNDtjb2RlY3M9IicgKyB0ICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSAvI0VYVC1YLVNUUkVBTS1JTkY6KFteXG5ccl0qKVtcclxuXSsoW15cclxuXSspL2csIF8gPSAvI0VYVC1YLU1FRElBOiguKikvZywgQSA9IG5ldyBSZWdFeHAoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyNFWFRJTkY6XHMqKFxkKig/OlwuXGQrKT8pKD86LCguKilccyspPy8uc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3woPyEjKShbXFMrID9dKykvLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC98I0VYVC1YLUJZVEVSQU5HRToqKC4rKS8uc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3wjRVhULVgtUFJPR1JBTS1EQVRFLVRJTUU6KC4rKS8uc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3wjLiovLnNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJycpLCAnZycpLCBJID0gLyg/Oig/OiMoRVhUTTNVKSl8KD86I0VYVC1YLShQTEFZTElTVC1UWVBFKTooLispKXwoPzojRVhULVgtKE1FRElBLVNFUVVFTkNFKTogKihcZCspKXwoPzojRVhULVgtKFRBUkdFVERVUkFUSU9OKTogKihcZCspKXwoPzojRVhULVgtKEtFWSk6KC4rKSl8KD86I0VYVC1YLShTVEFSVCk6KC4rKSl8KD86I0VYVC1YLShFTkRMSVNUKSl8KD86I0VYVC1YLShESVNDT05USU5VSVRZLVNFUSlVRU5DRTooXGQrKSl8KD86I0VYVC1YLShESVMpQ09OVElOVUlUWSkpfCg/OiNFWFQtWC0oVkVSU0lPTik6KFxkKykpfCg/OiNFWFQtWC0oTUFQKTooLispKXwoPzooIykoW146XSopOiguKikpfCg/OigjKSguKikpKD86LiopXHI/XG4/LywgQyA9IC9cLihtcDR8bTRzfG00dnxtNGEpJC9pLCBUID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZpbmRHcm91cCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuaWQgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmNvbnZlcnRBVkMxVG9BVkNPVEkgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlID0gdC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxlbmd0aCA+IDIgPyAoaSA9IGUuc2hpZnQoKSArICcuJywgaSArPSBwYXJzZUludChlLnNoaWZ0KCkpLnRvU3RyaW5nKDE2KSwgaSArPSAoJzAwMCcgKyBwYXJzZUludChlLnNoaWZ0KCkpLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC00KSkgOiBpID0gdCwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucmVzb2x2ZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuYnVpbGRBYnNvbHV0ZVVSTChpLCB0LCB7IGFsd2F5c05vcm1hbGl6ZTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlTWFzdGVyUGxheWxpc3QgPSBmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXVkaW8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0LmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgITAgPT09IGVbdC5zbGljZSgwLCA0KV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gdC5sYXN0SW5kZXhPZignYXZjMScsIDApIHx8IDAgPT09IHQubGFzdEluZGV4T2YoJ21wNGEnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2UgKyAnQ29kZWMnXSA9IG4ubGVuZ3RoID4gMCA/IG5bMF0gOiBzWzBdLCB0ID0gdC5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBzLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLnVua25vd25Db2RlY3MgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsubGFzdEluZGV4ID0gMDsgbnVsbCAhPSAocyA9IGsuZXhlYyhpKSk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0ge30sIGEgPSBoLmF0dHJzID0gbmV3IHgoc1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgudXJsID0gdC5yZXNvbHZlKHNbMl0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGEuZGVjaW1hbFJlc29sdXRpb24oJ1JFU09MVVRJT04nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyAmJiAoaC53aWR0aCA9IG8ud2lkdGgsIGguaGVpZ2h0ID0gby5oZWlnaHQpLCBoLmJpdHJhdGUgPSBhLmRlY2ltYWxJbnRlZ2VyKCdBVkVSQUdFLUJBTkRXSURUSCcpIHx8IGEuZGVjaW1hbEludGVnZXIoJ0JBTkRXSURUSCcpLCBoLm5hbWUgPSBhLk5BTUUsIHIoW10uY29uY2F0KChhLkNPREVDUyB8fCAnJykuc3BsaXQoL1sgLF0rLykpLCBoKSwgaC52aWRlb0NvZGVjICYmIC0xICE9PSBoLnZpZGVvQ29kZWMuaW5kZXhPZignYXZjMScpICYmIChoLnZpZGVvQ29kZWMgPSB0LmNvbnZlcnRBVkMxVG9BVkNPVEkoaC52aWRlb0NvZGVjKSksIG4ucHVzaChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlTWFzdGVyUGxheWxpc3RNZWRpYSA9IGZ1bmN0aW9uIChpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBuICYmIChuID0gW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gW10sIGEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoXy5sYXN0SW5kZXggPSAwOyBudWxsICE9PSAociA9IF8uZXhlYyhpKSk7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IHgoclsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLlRZUEUgPT09IHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhKyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogb1snR1JPVVAtSUQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvLk5BTUUgfHwgby5MQU5HVUFHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICdZRVMnID09PSBvLkRFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3NlbGVjdDogJ1lFUycgPT09IG8uQVVUT1NFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6ICdZRVMnID09PSBvLkZPUkNFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nOiBvLkxBTkdVQUdFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uVVJJICYmIChjLnVybCA9IHQucmVzb2x2ZShvLlVSSSwgZSkpLCBuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdC5maW5kR3JvdXAobiwgYy5ncm91cElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmF1ZGlvQ29kZWMgPSB1ID8gdS5jb2RlYyA6IG5bMF0uY29kZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLnB1c2goYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlTGV2ZWxQbGF5bGlzdCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGgsIG8sIHUgPSAwLCBsID0gMCwgZCA9IG5ldyB5KGkpLCBmID0gMCwgcCA9IG51bGwsIHYgPSBuZXcgbSgpLCBnID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEEubGFzdEluZGV4ID0gMDsgbnVsbCAhPT0gKHIgPSBBLmV4ZWModCkpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdyA9IHJbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmR1cmF0aW9uID0gcGFyc2VGbG9hdCh3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPID0gKCcgJyArIHJbMl0pLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi50aXRsZSA9IE8gfHwgbnVsbCwgdi50YWdMaXN0LnB1c2goTyA/IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSU5GJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lORicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoclszXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChhLmEpKHYuZHVyYXRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSB1Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi50eXBlID0gcywgdi5zdGFydCA9IGwsIG8gJiYgKHYubGV2ZWxrZXkgPSBvKSwgdi5zbiA9IFMsIHYubGV2ZWwgPSBlLCB2LmNjID0gZiwgdi51cmxJZCA9IG4sIHYuYmFzZXVybCA9IGksIHYucmVsdXJsID0gKCcgJyArIHJbM10pLnNsaWNlKDEpLCBQKHYsIHApLCBkLmZyYWdtZW50cy5wdXNoKHYpLCBwID0gdiwgbCArPSB2LmR1cmF0aW9uLCB2ID0gbmV3IG0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyWzRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaiA9ICgnICcgKyByWzRdKS5zbGljZSgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPyB2LnNldEJ5dGVSYW5nZShqLCBwKSA6IHYuc2V0Qnl0ZVJhbmdlKGopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJbNV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnJhd1Byb2dyYW1EYXRlVGltZSA9ICgnICcgKyByWzVdKS5zbGljZSgxKSwgdi50YWdMaXN0LnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQUk9HUkFNLURBVEUtVElNRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5yYXdQcm9ncmFtRGF0ZVRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBudWxsID09PSBnICYmIChnID0gZC5mcmFnbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyID0gclswXS5tYXRjaChJKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIud2FybignTm8gbWF0Y2hlcyBvbiBzbG93IHJlZ2V4IG1hdGNoIGZvciBsZXZlbCBwbGF5bGlzdCEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaCA9IDE7IGggPCByLmxlbmd0aCAmJiB2b2lkIDAgPT09IHJbaF07IGgrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9ICgnICcgKyByW2ggKyAxXSkuc2xpY2UoMSksIF8gPSAoJyAnICsgcltoICsgMl0pLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyW2hdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LnRhZ0xpc3QucHVzaChfID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IFtrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQTEFZTElTVC1UWVBFJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnR5cGUgPSBrLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNRURJQS1TRVFVRU5DRSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGQuc3RhcnRTTiA9IHBhcnNlSW50KGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVEFSR0VURFVSQVRJT04nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQudGFyZ2V0ZHVyYXRpb24gPSBwYXJzZUZsb2F0KGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVkVSU0lPTic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC52ZXJzaW9uID0gcGFyc2VJbnQoayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdFWFRNM1UnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnRU5ETElTVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5saXZlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdESVMnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYrKywgdi50YWdMaXN0LnB1c2goWydESVMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdESVNDT05USU5VSVRZLVNFUSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHBhcnNlSW50KGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnS0VZJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVCA9IG5ldyB4KGspLCBNID0gVC5lbnVtZXJhdGVkU3RyaW5nKCdNRVRIT0QnKSwgRSA9IFQuVVJJLCBMID0gVC5oZXhhZGVjaW1hbEludGVnZXIoJ0lWJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTSAmJiAobyA9IG5ldyBiKGksIEUpLCBFICYmIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FFUy0xMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0FNUExFLUFFUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTQU1QTEUtQUVTLUNFTkMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKE0pID49IDAgJiYgKG8ubWV0aG9kID0gTSwgby5rZXkgPSBudWxsLCBvLml2ID0gTCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1RBUlQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBSID0gbmV3IHgoaykuZGVjaW1hbEZsb2F0aW5nUG9pbnQoJ1RJTUUtT0ZGU0VUJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGEuYSkoUikgJiYgKGQuc3RhcnRUaW1lT2Zmc2V0ID0gUik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNQVAnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCID0gbmV3IHgoayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5yZWx1cmwgPSBCLlVSSSwgQi5CWVRFUkFOR0UgJiYgdi5zZXRCeXRlUmFuZ2UoQi5CWVRFUkFOR0UpLCB2LmJhc2V1cmwgPSBpLCB2LmxldmVsID0gZSwgdi50eXBlID0gcywgdi5zbiA9ICdpbml0U2VnbWVudCcsIGQuaW5pdFNlZ21lbnQgPSB2LCAodiA9IG5ldyBtKCkpLnJhd1Byb2dyYW1EYXRlVGltZSA9IGQuaW5pdFNlZ21lbnQucmF3UHJvZ3JhbURhdGVUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIud2FybignbGluZSBwYXJzZWQgYnV0IG5vdCBoYW5kbGVkOiAnICsgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID0gcCkgJiYgIXYucmVsdXJsICYmIChkLmZyYWdtZW50cy5wb3AoKSwgbCAtPSB2LmR1cmF0aW9uKSwgZC50b3RhbGR1cmF0aW9uID0gbCwgZC5hdmVyYWdldGFyZ2V0ZHVyYXRpb24gPSBsIC8gZC5mcmFnbWVudHMubGVuZ3RoLCBkLmVuZFNOID0gdSAtIDEsIGQuc3RhcnRDQyA9IGQuZnJhZ21lbnRzWzBdID8gZC5mcmFnbWVudHNbMF0uY2MgOiAwLCBkLmVuZENDID0gZiwgIWQuaW5pdFNlZ21lbnQgJiYgZC5mcmFnbWVudHMubGVuZ3RoICYmIGQuZnJhZ21lbnRzLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDLnRlc3QodC5yZWx1cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIChjLmIud2FybignTVA0IGZyYWdtZW50cyBmb3VuZCBidXQgbm8gaW5pdCBzZWdtZW50IChwcm9iYWJseSBubyBNQVAsIGluY29tcGxldGUgTTNVOCksIHRyeWluZyB0byBmZXRjaCBTSURYJyksICh2ID0gbmV3IG0oKSkucmVsdXJsID0gZC5mcmFnbWVudHNbMF0ucmVsdXJsLCB2LmJhc2V1cmwgPSBpLCB2LmxldmVsID0gZSwgdi50eXBlID0gcywgdi5zbiA9ICdpbml0U2VnbWVudCcsIGQuaW5pdFNlZ21lbnQgPSB2LCBkLm5lZWRTaWR4UmFuZ2VzID0gITApLCBnICYmIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB0W2ldLCBzID0gaSAtIDE7IHMgPj0gMDsgcy0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbc107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnByb2dyYW1EYXRlVGltZSA9IGUucHJvZ3JhbURhdGVUaW1lIC0gMTAwMCAqIG4uZHVyYXRpb24sIGUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShkLmZyYWdtZW50cywgZyksIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmF3UHJvZ3JhbURhdGVUaW1lID8gdC5wcm9ncmFtRGF0ZVRpbWUgPSBEYXRlLnBhcnNlKHQucmF3UHJvZ3JhbURhdGVUaW1lKSA6IGkgJiYgaS5wcm9ncmFtRGF0ZVRpbWUgJiYgKHQucHJvZ3JhbURhdGVUaW1lID0gaS5lbmRQcm9ncmFtRGF0ZVRpbWUpLCBPYmplY3QoYS5hKSh0LnByb2dyYW1EYXRlVGltZSkgfHwgKHQucHJvZ3JhbURhdGVUaW1lID0gbnVsbCwgdC5yYXdQcm9ncmFtRGF0ZVRpbWUgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE0gPSB3aW5kb3cucGVyZm9ybWFuY2UsIEUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSB0LmNhbGwodGhpcywgaSwgby5hLk1BTklGRVNUX0xPQURJTkcsIG8uYS5MRVZFTF9MT0FESU5HLCBvLmEuQVVESU9fVFJBQ0tfTE9BRElORywgby5hLlNVQlRJVExFX1RSQUNLX0xPQURJTkcpIHx8IHRoaXMpLmxvYWRlcnMgPSB7fSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LCAoaSA9IHIpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLCBpLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGksIGkuX19wcm90b19fID0gZSwgci5jYW5IYXZlUXVhbGl0eUxldmVscyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgIT09IHMuQVVESU9fVFJBQ0sgJiYgdCAhPT0gcy5TVUJUSVRMRV9UUkFDSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIubWFwQ29udGV4dFRvTGV2ZWxUeXBlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5BVURJT19UUkFDSzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uQVVESU87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLlNVQlRJVExFX1RSQUNLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5TVUJUSVRMRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5NQUlOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIuZ2V0UmVzcG9uc2VVcmwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZSAmJiAwICE9PSBlLmluZGV4T2YoJ2RhdGE6JykgfHwgKGUgPSBpLnVybCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSByLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmNyZWF0ZUludGVybmFsTG9hZGVyID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuaGxzLmNvbmZpZywgZSA9IGkucExvYWRlciwgcyA9IGkubG9hZGVyLCBuID0gbmV3IChlIHx8IHMpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxvYWRlciA9IG4sIHRoaXMubG9hZGVyc1t0LnR5cGVdID0gbiwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUuZ2V0SW50ZXJuYWxMb2FkZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRlcnNbdC50eXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUucmVzZXRJbnRlcm5hbExvYWRlciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZXJzW3RdICYmIGRlbGV0ZSB0aGlzLmxvYWRlcnNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LmRlc3Ryb3lJbnRlcm5hbExvYWRlcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLmxvYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxvYWRlcnNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5kZXN0cm95KCksIHRoaXMucmVzZXRJbnRlcm5hbExvYWRlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95SW50ZXJuYWxMb2FkZXJzKCksIHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUub25NYW5pZmVzdExvYWRpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuTUFOSUZFU1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUub25MZXZlbExvYWRpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHMuTEVWRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiB0LmxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAndGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUub25BdWRpb1RyYWNrTG9hZGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcy5BVURJT19UUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICd0ZXh0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5vblN1YnRpdGxlVHJhY2tMb2FkaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQudXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzLlNVQlRJVExFX1RSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LmxvYWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5obHMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5kZWJ1ZygnTG9hZGluZyBwbGF5bGlzdCBvZiB0eXBlICcgKyB0LnR5cGUgKyAnLCBsZXZlbDogJyArIHQubGV2ZWwgKyAnLCBpZDogJyArIHQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuLCByLCBoLCBhID0gdGhpcy5nZXRJbnRlcm5hbExvYWRlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGEuY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgby51cmwgPT09IHQudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYi50cmFjZSgncGxheWxpc3QgcmVxdWVzdCBvbmdvaW5nJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIud2FybignYWJvcnRpbmcgcHJldmlvdXMgbG9hZGVyIGZvciB0eXBlOiAnICsgdC50eXBlKSwgYS5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5NQU5JRkVTVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGkubWFuaWZlc3RMb2FkaW5nTWF4UmV0cnksIG4gPSBpLm1hbmlmZXN0TG9hZGluZ1RpbWVPdXQsIHIgPSBpLm1hbmlmZXN0TG9hZGluZ1JldHJ5RGVsYXksIGggPSBpLm1hbmlmZXN0TG9hZGluZ01heFJldHJ5VGltZW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLkxFVkVMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMCwgaCA9IDAsIHIgPSAwLCBuID0gaS5sZXZlbExvYWRpbmdUaW1lT3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaS5sZXZlbExvYWRpbmdNYXhSZXRyeSwgbiA9IGkubGV2ZWxMb2FkaW5nVGltZU91dCwgciA9IGkubGV2ZWxMb2FkaW5nUmV0cnlEZWxheSwgaCA9IGkubGV2ZWxMb2FkaW5nTWF4UmV0cnlUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdGhpcy5jcmVhdGVJbnRlcm5hbExvYWRlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyeTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyeURlbGF5OiBoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3M6IHRoaXMubG9hZHN1Y2Nlc3MuYmluZCh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMubG9hZGVycm9yLmJpbmQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblRpbWVvdXQ6IHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmIuZGVidWcoJ0NhbGxpbmcgaW50ZXJuYWwgbG9hZGVyIGRlbGVnYXRlIGZvciBVUkw6ICcgKyB0LnVybCksIGEubG9hZCh0LCB1LCBsKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LmxvYWRzdWNjZXNzID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBzICYmIChzID0gbnVsbCksIGUuaXNTaWR4UmVxdWVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUnQodCwgZSksIHZvaWQgdGhpcy5CdCh0LCBpLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZXNldEludGVybmFsTG9hZGVyKGUudHlwZSksICdzdHJpbmcnICE9IHR5cGVvZiB0LmRhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgcmVzcG9uc2VUeXBlIG9mICJ0ZXh0IiBmb3IgUGxheWxpc3RMb2FkZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRsb2FkID0gTS5ub3coKSwgMCA9PT0gbi5pbmRleE9mKCcjRVhUTTNVJykgPyBuLmluZGV4T2YoJyNFWFRJTkY6JykgPiAwIHx8IG4uaW5kZXhPZignI0VYVC1YLVRBUkdFVERVUkFUSU9OOicpID4gMCA/IHRoaXMuRHQodCwgaSwgZSwgcykgOiB0aGlzLkZ0KHQsIGksIGUsIHMpIDogdGhpcy5WdCh0LCBlLCAnbm8gRVhUTTNVIGRlbGltaXRlcicsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5sb2FkZXJyb3IgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IG51bGwpLCB0aGlzLlV0KGksIGUsICExLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUubG9hZHRpbWVvdXQgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IG51bGwpLCB0aGlzLlV0KGksIGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUuRnQgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5obHMsIGggPSB0LmRhdGEsIGEgPSByLmdldFJlc3BvbnNlVXJsKHQsIGUpLCB1ID0gVC5wYXJzZU1hc3RlclBsYXlsaXN0KGgsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHUubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuYXR0cnMuQVVESU8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiB0LmF1ZGlvQ29kZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGQgPSBULnBhcnNlTWFzdGVyUGxheWxpc3RNZWRpYShoLCBhLCAnQVVESU8nLCBsKSwgZiA9IFQucGFyc2VNYXN0ZXJQbGF5bGlzdE1lZGlhKGgsIGEsICdTVUJUSVRMRVMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC51cmwgfHwgKHAgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEgPT09IHAgJiYgdVswXS5hdWRpb0NvZGVjICYmICF1WzBdLmF0dHJzLkFVRElPICYmIChjLmIubG9nKCdhdWRpbyBjb2RlYyBzaWduYWxlZCBpbiBxdWFsaXR5IGxldmVsLCBidXQgbm8gZW1iZWRkZWQgYXVkaW8gdHJhY2sgc2lnbmFsZWQsIGNyZWF0ZSBvbmUnKSwgZC51bnNoaWZ0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9zZWxlY3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi50cmlnZ2VyKG8uYS5NQU5JRkVTVF9MT0FERUQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsczogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2tzOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVzOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WdCh0LCBlLCAnbm8gbGV2ZWwgZm91bmQgaW4gbWFuaWZlc3QnLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUuRHQgPSBmdW5jdGlvbiAodCwgaSwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5obHMsIGMgPSBlLmlkLCB1ID0gZS5sZXZlbCwgbCA9IGUudHlwZSwgZCA9IHIuZ2V0UmVzcG9uc2VVcmwodCwgZSksIGYgPSBPYmplY3QoYS5hKShjKSA/IGMgOiAwLCBwID0gT2JqZWN0KGEuYSkodSkgPyB1IDogZiwgYiA9IHIubWFwQ29udGV4dFRvTGV2ZWxUeXBlKGUpLCB2ID0gVC5wYXJzZUxldmVsUGxheWxpc3QodC5kYXRhLCBkLCBwLCBiLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi50bG9hZCA9IGkudGxvYWQsIGwgPT09IHMuTUFOSUZFU1QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgudHJpZ2dlcihvLmEuTUFOSUZFU1RfTE9BREVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM6IFttXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvVHJhY2tzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLnRwYXJzZWQgPSBNLm5vdygpLCB2Lm5lZWRTaWR4UmFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gdi5pbml0U2VnbWVudC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NpZHhSZXF1ZXN0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRGV0YWlsczogdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VTdGFydDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRW5kOiAyMDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxldmVsRGV0YWlscyA9IHYsIHRoaXMuQnQodCwgaSwgZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LlJ0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQuZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWR4IHJlcXVlc3QgbXVzdCBiZSBtYWRlIHdpdGggcmVzcG9uc2VUeXBlIG9mIGFycmF5IGJ1ZmZlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZC5hLnBhcnNlU2VnbWVudEluZGV4KG5ldyBVaW50OEFycmF5KHQuZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5yZWZlcmVuY2VzLCBuID0gaS5sZXZlbERldGFpbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZm9yRWFjaChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmluZm87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5mcmFnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gcy5ieXRlUmFuZ2UubGVuZ3RoICYmIHMuc2V0Qnl0ZVJhbmdlKFN0cmluZygxICsgZS5lbmQgLSBlLnN0YXJ0KSArICdAJyArIFN0cmluZyhlLnN0YXJ0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuICYmIG4uaW5pdFNlZ21lbnQuc2V0Qnl0ZVJhbmdlKFN0cmluZyhlLm1vb3ZFbmRPZmZzZXQpICsgJ0AwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5WdCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk5FVFdPUktfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IGguYS5NQU5JRkVTVF9QQVJTSU5HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUuVXQgPSBmdW5jdGlvbiAodCwgaSwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9ICExKSwgdm9pZCAwID09PSBuICYmIChuID0gbnVsbCksIGMuYi5pbmZvKCdBIG5ldHdvcmsgZXJyb3Igb2NjdXJlZCB3aGlsZSBsb2FkaW5nIGEgJyArIHQudHlwZSArICctdHlwZSBwbGF5bGlzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdGhpcy5nZXRJbnRlcm5hbExvYWRlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5NQU5JRkVTVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGUgPyBoLmEuTUFOSUZFU1RfTE9BRF9USU1FT1VUIDogaC5hLk1BTklGRVNUX0xPQURfRVJST1IsIGEgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLkxFVkVMOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZSA/IGguYS5MRVZFTF9MT0FEX1RJTUVPVVQgOiBoLmEuTEVWRUxfTE9BRF9FUlJPUiwgYSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuQVVESU9fVFJBQ0s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBlID8gaC5hLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVCA6IGguYS5BVURJT19UUkFDS19MT0FEX0VSUk9SLCBhID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiAodS5hYm9ydCgpLCB0aGlzLnJlc2V0SW50ZXJuYWxMb2FkZXIodC50eXBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGguYi5ORVRXT1JLX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAobC5yZXNwb25zZSA9IG4pLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5FUlJPUiwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1LkJ0ID0gZnVuY3Rpb24gKHQsIGksIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGUudHlwZSwgYSA9IGUubGV2ZWwsIGMgPSBlLmlkLCB1ID0gZS5sZXZlbERldGFpbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUgJiYgdS50YXJnZXRkdXJhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuY2FuSGF2ZVF1YWxpdHlMZXZlbHMoZS50eXBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoby5hLkxFVkVMX0xPQURFRCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGEgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogYyB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuQVVESU9fVFJBQ0s6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihvLmEuQVVESU9fVFJBQ0tfTE9BREVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0czogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5TVUJUSVRMRV9UUkFDSzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKG8uYS5TVUJUSVRMRV9UUkFDS19MT0FERUQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WdCh0LCBlLCAnaW52YWxpZCB0YXJnZXQgZHVyYXRpb24nLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCksIEwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSB0LmNhbGwodGhpcywgaSwgby5hLkZSQUdfTE9BRElORykgfHwgdGhpcykubG9hZGVycyA9IHt9LCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxvYWRlcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiBzLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZXJzID0ge30sIHQucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25GcmFnTG9hZGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmZyYWcsIGUgPSBpLnR5cGUsIHMgPSB0aGlzLmxvYWRlcnMsIG4gPSB0aGlzLmhscy5jb25maWcsIHIgPSBuLmZMb2FkZXIsIGggPSBuLmxvYWRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvYWRlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHUsIGwsIGQgPSBzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgKGMuYi53YXJuKCdhYm9ydCBwcmV2aW91cyBmcmFnbWVudCBsb2FkZXIgZm9yIHR5cGU6ICcgKyBlKSwgZC5hYm9ydCgpKSwgZCA9IHNbZV0gPSBpLmxvYWRlciA9IG4uZkxvYWRlciA/IG5ldyByKG4pIDogbmV3IGgobiksIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaS51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3NEYXRhOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBpLmJ5dGVSYW5nZVN0YXJ0T2Zmc2V0LCBwID0gaS5ieXRlUmFuZ2VFbmRPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGEuYSkoZikgJiYgT2JqZWN0KGEuYSkocCkgJiYgKG8ucmFuZ2VTdGFydCA9IGYsIG8ucmFuZ2VFbmQgPSBwKSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogbi5mcmFnTG9hZGluZ1RpbWVPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJldHJ5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeURlbGF5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSZXRyeURlbGF5OiBuLmZyYWdMb2FkaW5nTWF4UmV0cnlUaW1lb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdWNjZXNzOiB0aGlzLmxvYWRzdWNjZXNzLmJpbmQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3I6IHRoaXMubG9hZGVycm9yLmJpbmQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uVGltZW91dDogdGhpcy5sb2FkdGltZW91dC5iaW5kKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzOiB0aGlzLmxvYWRwcm9ncmVzcy5iaW5kKHRoaXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5sb2FkKG8sIHUsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5sb2Fkc3VjY2VzcyA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBzICYmIChzID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmRhdGEsIHIgPSBlLmZyYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sb2FkZXIgPSB2b2lkIDAsIHRoaXMubG9hZGVyc1tyLnR5cGVdID0gdm9pZCAwLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5GUkFHX0xPQURFRCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0czogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZGVycm9yID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGkuZnJhZywgbiA9IHMubG9hZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbi5hYm9ydCgpLCB0aGlzLmxvYWRlcnNbcy50eXBlXSA9IHZvaWQgMCwgdGhpcy5obHMudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk5FVFdPUktfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IGguYS5GUkFHX0xPQURfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZzogaS5mcmFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZHRpbWVvdXQgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaS5mcmFnLCBuID0gcy5sb2FkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLmFib3J0KCksIHRoaXMubG9hZGVyc1tzLnR5cGVdID0gdm9pZCAwLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuTkVUV09SS19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaC5hLkZSQUdfTE9BRF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc6IGkuZnJhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZHByb2dyZXNzID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHMgJiYgKHMgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmxvYWRlZCA9IHQubG9hZGVkLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5GUkFHX0xPQURfUFJPR1JFU1MsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZzogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpLCBSID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gdC5jYWxsKHRoaXMsIGksIG8uYS5LRVlfTE9BRElORykgfHwgdGhpcykubG9hZGVycyA9IHt9LCBlLmRlY3J5cHRrZXkgPSBudWxsLCBlLmRlY3J5cHR1cmwgPSBudWxsLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLmxvYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmxvYWRlcnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGVycyA9IHt9LCB0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uS2V5TG9hZGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmZyYWcsIGUgPSBpLnR5cGUsIHMgPSB0aGlzLmxvYWRlcnNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuZGVjcnlwdGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLmRlY3J5cHRkYXRhLnVyaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gIT09IHRoaXMuZGVjcnlwdHVybCB8fCBudWxsID09PSB0aGlzLmRlY3J5cHRrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy5obHMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgKGMuYi53YXJuKCdhYm9ydCBwcmV2aW91cyBrZXkgbG9hZGVyIGZvciB0eXBlOicgKyBlKSwgcy5hYm9ydCgpKSwgIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYy5iLndhcm4oJ2tleSB1cmkgaXMgZmFsc3knKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9hZGVyID0gdGhpcy5sb2FkZXJzW2VdID0gbmV3IHIubG9hZGVyKHIpLCB0aGlzLmRlY3J5cHR1cmwgPSBuLCB0aGlzLmRlY3J5cHRrZXkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogci5mcmFnTG9hZGluZ1RpbWVPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJldHJ5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyeURlbGF5OiByLmZyYWdMb2FkaW5nUmV0cnlEZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UmV0cnlEZWxheTogci5mcmFnTG9hZGluZ01heFJldHJ5VGltZW91dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzczogdGhpcy5sb2Fkc3VjY2Vzcy5iaW5kKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yOiB0aGlzLmxvYWRlcnJvci5iaW5kKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblRpbWVvdXQ6IHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvYWRlci5sb2FkKGgsIGEsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVjcnlwdGtleSAmJiAoaS5kZWNyeXB0ZGF0YS5rZXkgPSB0aGlzLmRlY3J5cHRrZXksIHRoaXMuaGxzLnRyaWdnZXIoby5hLktFWV9MT0FERUQsIHsgZnJhZzogaSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdNaXNzaW5nIGRlY3J5cHRpb24gZGF0YSBvbiBmcmFnbWVudCBpbiBvbktleUxvYWRpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZHN1Y2Nlc3MgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5mcmFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGVjcnlwdGRhdGEgPyAodGhpcy5kZWNyeXB0a2V5ID0gcy5kZWNyeXB0ZGF0YS5rZXkgPSBuZXcgVWludDhBcnJheSh0LmRhdGEpLCBzLmxvYWRlciA9IHZvaWQgMCwgZGVsZXRlIHRoaXMubG9hZGVyc1tzLnR5cGVdLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5LRVlfTE9BREVELCB7IGZyYWc6IHMgfSkpIDogYy5iLmVycm9yKCdhZnRlciBrZXkgbG9hZCwgZGVjcnlwdGRhdGEgdW5zZXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZGVycm9yID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuZnJhZywgcyA9IGUubG9hZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgcy5hYm9ydCgpLCBkZWxldGUgdGhpcy5sb2FkZXJzW2UudHlwZV0sIHRoaXMuaGxzLnRyaWdnZXIoby5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGguYi5ORVRXT1JLX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBoLmEuS0VZX0xPQURfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZHRpbWVvdXQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaS5mcmFnLCBzID0gZS5sb2FkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiBzLmFib3J0KCksIGRlbGV0ZSB0aGlzLmxvYWRlcnNbZS50eXBlXSwgdGhpcy5obHMudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk5FVFdPUktfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IGguYS5LRVlfTE9BRF9USU1FT1VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCksIEIgPSAnTk9UX0xPQURFRCcsIEQgPSAnQVBQRU5ESU5HJywgRiA9ICdQQVJUSUFMJywgViA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHQuY2FsbCh0aGlzLCBpLCBvLmEuQlVGRkVSX0FQUEVOREVELCBvLmEuRlJBR19CVUZGRVJFRCwgby5hLkZSQUdfTE9BREVEKSB8fCB0aGlzKS5idWZmZXJQYWRkaW5nID0gMC4yLCBlLmZyYWdtZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCksIGUudGltZVJhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIGUuY29uZmlnID0gaS5jb25maWcsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdCwgKGkgPSBzKS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSwgaS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpLCBpLl9fcHJvdG9fXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMudGltZVJhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuY29uZmlnID0gbnVsbCwgbC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLCB0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmdldEJ1ZmZlcmVkRnJhZyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmZyYWdtZW50cywgcyA9IE9iamVjdC5rZXlzKGUpLmZpbHRlcihmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uYm9keS50eXBlICE9PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbi5idWZmZXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4uYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnN0YXJ0UFRTIDw9IHQgJiYgdCA8PSByLmVuZFBUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0uYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZGV0ZWN0RXZpY3RlZEZyYWdtZW50cyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHMsIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZnJhZ21lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gbi5mcmFnbWVudHNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gaC5idWZmZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBoLnJhbmdlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gYS50aW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPSBlW29dLCAhMSA9PT0gbi5pc1RpbWVCdWZmZXJlZChzLnN0YXJ0UFRTLCBzLmVuZFBUUywgaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucmVtb3ZlRnJhZ21lbnQoaC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZGV0ZWN0UGFydGlhbEZyYWdtZW50cyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBlID0gdGhpcy5nZXRGcmFnbWVudEtleSh0KSwgcyA9IHRoaXMuZnJhZ21lbnRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgKHMuYnVmZmVyZWQgPSAhMCwgT2JqZWN0LmtleXModGhpcy50aW1lUmFuZ2VzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmhhc0VsZW1lbnRhcnlTdHJlYW0oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gaS50aW1lUmFuZ2VzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5yYW5nZVtlXSA9IGkuZ2V0QnVmZmVyZWRUaW1lcyh0LnN0YXJ0UFRTLCB0LmVuZFBUUywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmdldEJ1ZmZlcmVkVGltZXMgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMsIG4sIHIgPSBbXSwgaCA9ICExLCBhID0gMDsgYSA8IGUubGVuZ3RoOyBhKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPSBlLnN0YXJ0KGEpIC0gdGhpcy5idWZmZXJQYWRkaW5nLCBuID0gZS5lbmQoYSkgKyB0aGlzLmJ1ZmZlclBhZGRpbmcsIHQgPj0gcyAmJiBpIDw9IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQVFM6IE1hdGgubWF4KHQsIGUuc3RhcnQoYSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBUUzogTWF0aC5taW4oaSwgZS5lbmQoYSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IDwgbiAmJiBpID4gcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQVFM6IE1hdGgubWF4KHQsIGUuc3RhcnQoYSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFBUUzogTWF0aC5taW4oaSwgZS5lbmQoYSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpIDw9IHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbDogaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmdldEZyYWdtZW50S2V5ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlICsgJ18nICsgdC5sZXZlbCArICdfJyArIHQudXJsSWQgKyAnXycgKyB0LnNuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5nZXRQYXJ0aWFsRnJhZ21lbnQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlLCBzLCBuID0gdGhpcywgciA9IG51bGwsIGggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLmZyYWdtZW50cykuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uZnJhZ21lbnRzW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzUGFydGlhbChvKSAmJiAoZSA9IG8uYm9keS5zdGFydFBUUyAtIG4uYnVmZmVyUGFkZGluZywgcyA9IG8uYm9keS5lbmRQVFMgKyBuLmJ1ZmZlclBhZGRpbmcsIHQgPj0gZSAmJiB0IDw9IHMgJiYgKGkgPSBNYXRoLm1pbih0IC0gZSwgcyAtIHQpLCBoIDw9IGkgJiYgKHIgPSBvLmJvZHksIGggPSBpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5nZXRTdGF0ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmdldEZyYWdtZW50S2V5KHQpLCBlID0gdGhpcy5mcmFnbWVudHNbaV0sIHMgPSBCOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGUgJiYgKHMgPSBlLmJ1ZmZlcmVkID8gITAgPT09IHRoaXMuaXNQYXJ0aWFsKGUpID8gRiA6ICdPSycgOiBEKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uaXNQYXJ0aWFsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IHQuYnVmZmVyZWQgJiYgKHZvaWQgMCAhPT0gdC5yYW5nZS52aWRlbyAmJiAhMCA9PT0gdC5yYW5nZS52aWRlby5wYXJ0aWFsIHx8IHZvaWQgMCAhPT0gdC5yYW5nZS5hdWRpbyAmJiAhMCA9PT0gdC5yYW5nZS5hdWRpby5wYXJ0aWFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uaXNUaW1lQnVmZmVyZWQgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMsIG4sIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9IGUuc3RhcnQocikgLSB0aGlzLmJ1ZmZlclBhZGRpbmcsIG4gPSBlLmVuZChyKSArIHRoaXMuYnVmZmVyUGFkZGluZywgdCA+PSBzICYmIGkgPD0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPD0gcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkZyYWdMb2FkZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5mcmFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmEpKGkuc24pICYmICFpLmJpdHJhdGVUZXN0ICYmICh0aGlzLmZyYWdtZW50c1t0aGlzLmdldEZyYWdtZW50S2V5KGkpXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IE9iamVjdC5jcmVhdGUobnVsbCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkJ1ZmZlckFwcGVuZGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lUmFuZ2VzID0gdC50aW1lUmFuZ2VzLCBPYmplY3Qua2V5cyh0aGlzLnRpbWVSYW5nZXMpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLnRpbWVSYW5nZXNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZGV0ZWN0RXZpY3RlZEZyYWdtZW50cyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25GcmFnQnVmZmVyZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0UGFydGlhbEZyYWdtZW50cyh0LmZyYWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5oYXNGcmFnbWVudCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmdldEZyYWdtZW50S2V5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRoaXMuZnJhZ21lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5yZW1vdmVGcmFnbWVudCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmdldEZyYWdtZW50S2V5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZyYWdtZW50c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ucmVtb3ZlQWxsRnJhZ21lbnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCksIFUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIHMgPSB0Lmxlbmd0aCAtIDEsIG4gPSBudWxsLCByID0gbnVsbDsgZSA8PSBzOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGkociA9IHRbbiA9IChlICsgcykgLyAyIHwgMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA+IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbiArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaCA8IDApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG4gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlzQnVmZmVyZWQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHQuYnVmZmVyZWQsIHMgPSAwOyBzIDwgZS5sZW5ndGg7IHMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBlLnN0YXJ0KHMpICYmIGkgPD0gZS5lbmQocykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuYnVmZmVySW5mbyA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBuID0gdC5idWZmZXJlZCwgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzID0gMDsgcyA8IG4ubGVuZ3RoOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG4uc3RhcnQocyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogbi5lbmQocykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlcmVkSW5mbyhyLCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhcnQ6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmJ1ZmZlcmVkSW5mbyA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zb3J0KGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5zdGFydCAtIGkuc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIHx8IGkuZW5kIC0gdC5lbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHNbciAtIDFdLmVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W25dLnN0YXJ0IC0gaCA8IGUgPyB0W25dLmVuZCA+IGggJiYgKHNbciAtIDFdLmVuZCA9IHRbbl0uZW5kKSA6IHMucHVzaCh0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHVzaCh0W25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgbyA9IDAsIGMgPSBpLCB1ID0gaSwgbCA9IDA7IGwgPCBzLmxlbmd0aDsgbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gc1tsXS5zdGFydCwgZiA9IHNbbF0uZW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArIGUgPj0gZCAmJiBpIDwgZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBkLCBvID0gKHUgPSBmKSAtIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgKyBlIDwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW46IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGFydDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIE4gPSBlKDgpLCBIID0gZSgxMSksIHEgPSBlKDkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuTWVkaWFTb3VyY2UgfHwgd2luZG93LldlYktpdE1lZGlhU291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVyA9IGUoNSksIEcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gdCwgKGkgPSBzKS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSwgaS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpLCBpLl9fcHJvdG9fXyA9IGUsIHMucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoLCBlID0gbmV3IEFycmF5KGkgPiAxID8gaSAtIDEgOiAwKSwgcyA9IDE7IHMgPCBpOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcyAtIDFdID0gYXJndW1lbnRzW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdC5hcHBseSh0aGlzLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KE4uRXZlbnRFbWl0dGVyKSwgSiA9IHooKSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1R5cGVTdXBwb3J0ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMgPSB0LCB0aGlzLmlkID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMub2JzZXJ2ZXIgPSBuZXcgRygpLCBuID0gdC5jb25maWcsIHIgPSBmdW5jdGlvbiAoaSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgPSBzIHx8IHt9KS5mcmFnID0gZS5mcmFnLCBzLmlkID0gZS5pZCwgdC50cmlnZ2VyKGksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub24oby5hLkZSQUdfREVDUllQVEVELCByKSwgcy5vbihvLmEuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCwgciksIHMub24oby5hLkZSQUdfUEFSU0lOR19EQVRBLCByKSwgcy5vbihvLmEuRlJBR19QQVJTRUQsIHIpLCBzLm9uKG8uYS5FUlJPUiwgciksIHMub24oby5hLkZSQUdfUEFSU0lOR19NRVRBREFUQSwgciksIHMub24oby5hLkZSQUdfUEFSU0lOR19VU0VSREFUQSwgciksIHMub24oby5hLklOSVRfUFRTX0ZPVU5ELCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNDogSi5pc1R5cGVTdXBwb3J0ZWQoJ3ZpZGVvL21wNCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzogSi5pc1R5cGVTdXBwb3J0ZWQoJ2F1ZGlvL21wZWcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wMzogSi5pc1R5cGVTdXBwb3J0ZWQoJ2F1ZGlvL21wNDsgY29kZWNzPSJtcDMiJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IG5hdmlnYXRvci52ZW5kb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uZW5hYmxlV29ya2VyICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBXb3JrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ2RlbXV4aW5nIGluIHdlYndvcmtlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IHRoaXMudyA9IEgoMTIpLCB0aGlzLm9ud21zZyA9IHRoaXMub25Xb3JrZXJNZXNzYWdlLmJpbmQodGhpcyksIGwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMub253bXNnKSwgbC5vbmVycm9yID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRyaWdnZXIoby5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGguYi5PVEhFUl9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaC5hLklOVEVSTkFMX0VYQ0VQVElPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ2RlbXV4ZXJXb3JrZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI6IHsgbWVzc2FnZTogaS5tZXNzYWdlICsgJyAoJyArIGkuZmlsZW5hbWUgKyAnOicgKyBpLmxpbmVubyArICcpJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQ6ICdpbml0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3VwcG9ydGVkOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcjogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IEpTT04uc3RyaW5naWZ5KG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLndhcm4oJ0Vycm9yIGluIHdvcmtlcjonLCB0KSwgYy5iLmVycm9yKCdFcnJvciB3aGlsZSBpbml0aWFsaXppbmcgRGVtdXhlcldvcmtlciwgZmFsbGJhY2sgb24gRGVtdXhlcklubGluZScpLCBsICYmIE9iamVjdChXLmEpKCkuVVJMLnJldm9rZU9iamVjdFVSTChsLm9iamVjdFVSTCksIHRoaXMuZGVtdXhlciA9IG5ldyBxLmEocywgYSwgbiwgdSksIHRoaXMudyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlbXV4ZXIgPSBuZXcgcS5hKHMsIGEsIG4sIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMub253bXNnKSwgdC50ZXJtaW5hdGUoKSwgdGhpcy53ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRlbXV4ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKGkuZGVzdHJveSgpLCB0aGlzLmRlbXV4ZXIgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLm9ic2VydmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGUucmVtb3ZlQWxsTGlzdGVuZXJzKCksIHRoaXMub2JzZXJ2ZXIgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHVzaCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCBuLCByLCBoLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB0aGlzLncsIGwgPSBPYmplY3QoYS5hKShuLnN0YXJ0UFRTKSA/IG4uc3RhcnRQVFMgOiBuLnN0YXJ0LCBkID0gbi5kZWNyeXB0ZGF0YSwgZiA9IHRoaXMuZnJhZywgcCA9ICEoZiAmJiBuLmNjID09PSBmLmNjKSwgYiA9ICEoZiAmJiBuLmxldmVsID09PSBmLmxldmVsKSwgdiA9IGYgJiYgbi5zbiA9PT0gZi5zbiArIDEsIG0gPSAhYiAmJiB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICYmIGMuYi5sb2codGhpcy5pZCArICc6ZGlzY29udGludWl0eSBkZXRlY3RlZCcpLCBiICYmIGMuYi5sb2codGhpcy5pZCArICc6c3dpdGNoIGRldGVjdGVkJyksIHRoaXMuZnJhZyA9IG4sIHUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kOiAnZGVtdXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY3J5cHRkYXRhOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlZ21lbnQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NvZGVjOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Db2RlYzogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPZmZzZXQ6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5OiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTd2l0Y2g6IGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aWd1b3VzOiBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmF0ZVRpbWVPZmZzZXQ6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SW5pdFBUUzogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBbdF0gOiBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gdGhpcy5kZW11eGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICYmIGcucHVzaCh0LCBkLCBpLCBlLCBzLCBsLCBwLCBiLCBtLCByLCBoLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLm9uV29ya2VyTWVzc2FnZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmRhdGEsIGUgPSB0aGlzLmhsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkuZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFcuYSkoKS5VUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudy5vYmplY3RVUkwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG8uYS5GUkFHX1BBUlNJTkdfREFUQToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kYXRhLmRhdGExID0gbmV3IFVpbnQ4QXJyYXkoaS5kYXRhMSksIGkuZGF0YTIgJiYgKGkuZGF0YS5kYXRhMiA9IG5ldyBVaW50OEFycmF5KGkuZGF0YTIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmRhdGEgPSBpLmRhdGEgfHwge30sIGkuZGF0YS5mcmFnID0gdGhpcy5mcmFnLCBpLmRhdGEuaWQgPSB0aGlzLmlkLCBlLnRyaWdnZXIoaS5ldmVudCwgaS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhdWRpbyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmF1ZGlvR3JvdXBJZHMgfHwgKHQuYXVkaW9Hcm91cElkcyA9IFtdKSwgdC5hdWRpb0dyb3VwSWRzLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRleHRHcm91cElkcyB8fCAodC50ZXh0R3JvdXBJZHMgPSBbXSksIHQudGV4dEdyb3VwSWRzLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdFtpXSwgbiA9IHRbZV0sIHIgPSBuLnN0YXJ0UFRTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYS5hKShyKSA/IGUgPiBpID8gKHMuZHVyYXRpb24gPSByIC0gcy5zdGFydCwgcy5kdXJhdGlvbiA8IDAgJiYgYy5iLndhcm4oJ25lZ2F0aXZlIGR1cmF0aW9uIGNvbXB1dGVkIGZvciBmcmFnICcgKyBzLnNuICsgJyxsZXZlbCAnICsgcy5sZXZlbCArICcsIHRoZXJlIHNob3VsZCBiZSBzb21lIGR1cmF0aW9uIGRyaWZ0IGJldHdlZW4gcGxheWxpc3QgYW5kIGZyYWdtZW50IScpKSA6IChuLmR1cmF0aW9uID0gcy5zdGFydCAtIHIsIG4uZHVyYXRpb24gPCAwICYmIGMuYi53YXJuKCduZWdhdGl2ZSBkdXJhdGlvbiBjb21wdXRlZCBmb3IgZnJhZyAnICsgbi5zbiArICcsbGV2ZWwgJyArIG4ubGV2ZWwgKyAnLCB0aGVyZSBzaG91bGQgYmUgc29tZSBkdXJhdGlvbiBkcmlmdCBiZXR3ZWVuIHBsYXlsaXN0IGFuZCBmcmFnbWVudCEnKSkgOiBuLnN0YXJ0ID0gZSA+IGkgPyBzLnN0YXJ0ICsgcy5kdXJhdGlvbiA6IE1hdGgubWF4KHMuc3RhcnQgLSBuLmR1cmF0aW9uLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSyh0LCBpLCBlLCBzLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChhLmEpKGkuc3RhcnRQVFMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE1hdGguYWJzKGkuc3RhcnRQVFMgLSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmEpKGkuZGVsdGFQVFMpID8gaS5kZWx0YVBUUyA9IE1hdGgubWF4KG8sIGkuZGVsdGFQVFMpIDogaS5kZWx0YVBUUyA9IG8sIGggPSBNYXRoLm1heChlLCBpLnN0YXJ0UFRTKSwgZSA9IE1hdGgubWluKGUsIGkuc3RhcnRQVFMpLCBzID0gTWF0aC5tYXgocywgaS5lbmRQVFMpLCBuID0gTWF0aC5taW4obiwgaS5zdGFydERUUyksIHIgPSBNYXRoLm1heChyLCBpLmVuZERUUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlIC0gaS5zdGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zdGFydCA9IGkuc3RhcnRQVFMgPSBlLCBpLm1heFN0YXJ0UFRTID0gaCwgaS5lbmRQVFMgPSBzLCBpLnN0YXJ0RFRTID0gbiwgaS5lbmREVFMgPSByLCBpLmR1cmF0aW9uID0gcyAtIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1LCBsLCBkLCBmID0gaS5zbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8IGYgPCB0LnN0YXJ0U04gfHwgZiA+IHQuZW5kU04pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1ID0gZiAtIHQuc3RhcnRTTiwgKGwgPSB0LmZyYWdtZW50cylbdV0gPSBpLCBkID0gdTsgZCA+IDA7IGQtLSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkobCwgZCwgZCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSB1OyBkIDwgbC5sZW5ndGggLSAxOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZKGwsIGQsIGQgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuUFRTS25vd24gPSAhMCwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9ICcnLCBlID0gdC5sZW5ndGgsIHMgPSAwOyBzIDwgZTsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gJ1snICsgdC5zdGFydChzKS50b0ZpeGVkKDMpICsgJywnICsgdC5lbmQocykudG9GaXhlZCgzKSArICddJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0dCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZnJhZ21lbnRzLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLnN0YXJ0ICsgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnN0YXJ0ID0gaS5zdGFydFBUUyA9IGUsIGkuZW5kUFRTID0gZSArIGkuZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLlBUU0tub3duID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGl0KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgaS5kZXRhaWxzICYmIGUgJiYgKGUuZW5kQ0MgPiBlLnN0YXJ0Q0MgfHwgdCAmJiB0LmNjIDwgZS5zdGFydENDKSAmJiAocyA9ICEwKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIGUsIGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuZnJhZ21lbnRzLCBzID0gaS5mcmFnbWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmxlbmd0aCAmJiBlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBudWxsLCBzID0gMDsgcyA8IHQubGVuZ3RoOyBzICs9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBuLmNjID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBzWzBdLmNjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmICghbiB8fCBuLnN0YXJ0UFRTKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ05vIGZyYWcgaW4gcHJldmlvdXMgbGV2ZWwgdG8gYWxpZ24gb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdObyBmcmFnbWVudHMgdG8gYWxpZ24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUuZGV0YWlscywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiAoYy5iLmxvZygnQWRqdXN0aW5nIFBUUyB1c2luZyBsYXN0IGxldmVsIGR1ZSB0byBDQyBpbmNyZWFzZSB3aXRoaW4gY3VycmVudCBsZXZlbCcpLCB0dChzLnN0YXJ0LCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgZSwgaSksICFlLlBUU0tub3duICYmIGkgJiYgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmIGkuZnJhZ21lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5oYXNQcm9ncmFtRGF0ZVRpbWUgfHwgIWkuaGFzUHJvZ3JhbURhdGVUaW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLmZyYWdtZW50c1swXS5wcm9ncmFtRGF0ZVRpbWUsIHMgPSAodC5mcmFnbWVudHNbMF0ucHJvZ3JhbURhdGVUaW1lIC0gZSkgLyAxMDAwICsgaS5mcmFnbWVudHNbMF0uc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGEuYSkocykgJiYgKGMuYi5sb2coJ2FkanVzdGluZyBQVFMgdXNpbmcgcHJvZ3JhbURhdGVUaW1lIGRlbHRhLCBzbGlkaW5nOicgKyBzLnRvRml4ZWQoMykpLCB0dChzLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgaS5kZXRhaWxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHQgJiYgKHQgPSAwKSwgdm9pZCAwID09PSBpICYmIChpID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gTWF0aC5taW4oaSwgZS5kdXJhdGlvbiArIChlLmRlbHRhUFRTID8gZS5kZWx0YVBUUyA6IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RhcnQgKyBlLmR1cmF0aW9uIC0gcyA8PSB0ID8gMSA6IGUuc3RhcnQgLSBzID4gdCAmJiBlLnN0YXJ0ID8gLTEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gMTAwMCAqIE1hdGgubWluKGksIGUuZHVyYXRpb24gKyAoZS5kZWx0YVBUUyA/IGUuZGVsdGFQVFMgOiAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZS5lbmRQcm9ncmFtRGF0ZVRpbWUgfHwgMCkgLSBzID4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcgPSB0LCB0aGlzLm1lZGlhID0gaSwgdGhpcy5mcmFnbWVudFRyYWNrZXIgPSBlLCB0aGlzLmhscyA9IHMsIHRoaXMubnVkZ2VSZXRyeSA9IDAsIHRoaXMuc3RhbGxSZXBvcnRlZCA9ICExLCB0aGlzLnN0YWxsZWQgPSBudWxsLCB0aGlzLm1vdmVkID0gITEsIHRoaXMuc2Vla2luZyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnBvbGwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb25maWcsIGUgPSB0aGlzLm1lZGlhLCBzID0gdGhpcy5zdGFsbGVkLCBuID0gZS5jdXJyZW50VGltZSwgciA9IGUuc2Vla2luZywgaCA9IHRoaXMuc2Vla2luZyAmJiAhciwgYSA9ICF0aGlzLnNlZWtpbmcgJiYgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVraW5nID0gciwgbiA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgfHwgaCkgJiYgKHRoaXMuc3RhbGxlZCA9IG51bGwpLCAhZS5wYXVzZWQgJiYgIWUuZW5kZWQgJiYgMCAhPT0gZS5wbGF5YmFja1JhdGUgJiYgZS5idWZmZXJlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gJC5idWZmZXJJbmZvKGUsIG4sIDApLCB1ID0gby5sZW4gPiAwLCBsID0gby5uZXh0U3RhcnQgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1IHx8IGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby5sZW4gPiAyIHx8ICFsIHx8IGwgLSBuID4gMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubW92ZWQgJiYgdGhpcy5zdGFsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gTWF0aC5tYXgobCwgby5zdGFydCB8fCAwKSAtIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID4gMCAmJiBkIDw9IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLiR0KG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBmIC0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXIgJiYgcCA+PSAyNTAgJiYgdGhpcy5OdChvLmxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gJC5idWZmZXJJbmZvKGUsIG4sIGkubWF4QnVmZmVySG9sZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHQoYiwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhbGxlZCA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubW92ZWQgPSAhMCwgbnVsbCAhPT0gcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFsbFJlcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCkgLSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLndhcm4oJ3BsYXliYWNrIG5vdCBzdHVjayBhbnltb3JlIEAnICsgbiArICcsIGFmdGVyICcgKyBNYXRoLnJvdW5kKHYpICsgJ21zJyksIHRoaXMuc3RhbGxSZXBvcnRlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhbGxlZCA9IG51bGwsIHRoaXMubnVkZ2VSZXRyeSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5IdCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNvbmZpZywgcyA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLCBuID0gdGhpcy5tZWRpYS5jdXJyZW50VGltZSwgciA9IHMuZ2V0UGFydGlhbEZyYWdtZW50KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgdGhpcy4kdChyKSB8fCB0LmxlbiA+IGUubWF4QnVmZmVySG9sZSAmJiBpID4gMTAwMCAqIGUuaGlnaEJ1ZmZlcldhdGNoZG9nUGVyaW9kICYmIChjLmIud2FybignVHJ5aW5nIHRvIG51ZGdlIHBsYXloZWFkIG92ZXIgYnVmZmVyLWhvbGUnKSwgdGhpcy5zdGFsbGVkID0gbnVsbCwgdGhpcy5xdCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuTnQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5obHMsIGUgPSB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhbGxSZXBvcnRlZCB8fCAodGhpcy5zdGFsbFJlcG9ydGVkID0gITAsIGMuYi53YXJuKCdQbGF5YmFjayBzdGFsbGluZyBhdCBAJyArIGUuY3VycmVudFRpbWUgKyAnIGR1ZSB0byBsb3cgYnVmZmVyJyksIGkudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk1FRElBX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBoLmEuQlVGRkVSX1NUQUxMRURfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS4kdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuY29uZmlnLCBlID0gdGhpcy5obHMsIHMgPSB0aGlzLm1lZGlhLCBuID0gcy5jdXJyZW50VGltZSwgciA9IDAsIGEgPSAwOyBhIDwgcy5idWZmZXJlZC5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHMuYnVmZmVyZWQuc3RhcnQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICsgaS5tYXhCdWZmZXJIb2xlID49IHIgJiYgbiA8IHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gTWF0aC5tYXgodSArIDAuMDUsIHMuY3VycmVudFRpbWUgKyAwLjEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYi53YXJuKCdza2lwcGluZyBob2xlLCBhZGp1c3RpbmcgY3VycmVudFRpbWUgZnJvbSAnICsgbiArICcgdG8gJyArIGwpLCB0aGlzLm1vdmVkID0gITAsIHRoaXMuc3RhbGxlZCA9IG51bGwsIHMuY3VycmVudFRpbWUgPSBsLCB0ICYmIGUudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaC5hLkJVRkZFUl9TRUVLX09WRVJfSE9MRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAnZnJhZ21lbnQgbG9hZGVkIHdpdGggYnVmZmVyIGhvbGVzLCBzZWVraW5nIGZyb20gJyArIG4gKyAnIHRvICcgKyBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBzLmJ1ZmZlcmVkLmVuZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnF0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5jb25maWcsIGkgPSB0aGlzLmhscywgZSA9IHRoaXMubWVkaWEsIHMgPSBlLmN1cnJlbnRUaW1lLCBuID0gKHRoaXMubnVkZ2VSZXRyeSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubnVkZ2VSZXRyeSA9IG4sIG4gPCB0Lm51ZGdlTWF4UmV0cnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBzICsgbiAqIHQubnVkZ2VPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdOdWRnaW5nIFwnY3VycmVudFRpbWVcJyBmcm9tICcgKyBzICsgJyB0byAnICsgciksIGUuY3VycmVudFRpbWUgPSByLCBpLnRyaWdnZXIoby5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBoLmEuQlVGRkVSX05VREdFX09OX1NUQUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIuZXJyb3IoJ1BsYXloZWFkIHN0aWxsIG5vdCBtb3Zpbmcgd2hpbGUgZW5vdWdoIGRhdGEgYnVmZmVyZWQgQCcgKyBzICsgJyBhZnRlciAnICsgdC5udWRnZU1heFJldHJ5ICsgJyBudWRnZXMnKSwgaS50cmlnZ2VyKG8uYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk1FRElBX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaC5hLkJVRkZFUl9TVEFMTEVEX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBydCA9ICdTVE9QUEVEJywgaHQgPSAnSURMRScsIGF0ID0gJ0tFWV9MT0FESU5HJywgb3QgPSAnRlJBR19MT0FESU5HJywgY3QgPSAnRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlknLCB1dCA9ICdQQVJTSU5HJywgbHQgPSAnUEFSU0VEJywgZHQgPSAnQlVGRkVSX0ZMVVNISU5HJywgZnQgPSAnRVJST1InLCBwdCA9ICdXQUlUSU5HX0xFVkVMJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBidCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgaS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lbnVtZXJhYmxlID0gcy5lbnVtZXJhYmxlIHx8ICExLCBzLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIHMgJiYgKHMud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBzLmtleSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZ0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSB0LmNhbGwodGhpcywgaSwgby5hLk1FRElBX0FUVEFDSEVELCBvLmEuTUVESUFfREVUQUNISU5HLCBvLmEuTUFOSUZFU1RfTE9BRElORywgby5hLk1BTklGRVNUX1BBUlNFRCwgby5hLkxFVkVMX0xPQURFRCwgby5hLktFWV9MT0FERUQsIG8uYS5GUkFHX0xPQURFRCwgby5hLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCwgby5hLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQsIG8uYS5GUkFHX1BBUlNJTkdfREFUQSwgby5hLkZSQUdfUEFSU0VELCBvLmEuRVJST1IsIG8uYS5BVURJT19UUkFDS19TV0lUQ0hJTkcsIG8uYS5BVURJT19UUkFDS19TV0lUQ0hFRCwgby5hLkJVRkZFUl9DUkVBVEVELCBvLmEuQlVGRkVSX0FQUEVOREVELCBvLmEuQlVGRkVSX0ZMVVNIRUQpIHx8IHRoaXMpLmZyYWdtZW50VHJhY2tlciA9IGUsIHMuY29uZmlnID0gaS5jb25maWcsIHMuYXVkaW9Db2RlY1N3YXAgPSAhMSwgcy56dCA9IHJ0LCBzLnN0YWxsUmVwb3J0ZWQgPSAhMSwgcy5nYXBDb250cm9sbGVyID0gbnVsbCwgcy5hbHRBdWRpbyA9ICExLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LCAoaSA9IHMpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLCBpLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGksIGkuX19wcm90b19fID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIHUsIGwgPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuc3RhcnRMb2FkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxldmVscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5sYXN0Q3VycmVudFRpbWUsIGUgPSB0aGlzLmhsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdG9wTG9hZCgpLCB0aGlzLnNldEludGVydmFsKDEwMCksIHRoaXMubGV2ZWwgPSAtMSwgdGhpcy5mcmFnTG9hZEVycm9yID0gMCwgIXRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5zdGFydExldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gcyAmJiAocyA9IDAsIHRoaXMuYml0cmF0ZVRlc3QgPSAhMCksIHRoaXMubGV2ZWwgPSBlLm5leHRMb2FkTGV2ZWwgPSBzLCB0aGlzLmxvYWRlZG1ldGFkYXRhID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPiAwICYmIC0xID09PSB0ICYmIChjLmIubG9nKCdvdmVycmlkZSBzdGFydFBvc2l0aW9uIHdpdGggbGFzdEN1cnJlbnRUaW1lIEAnICsgaS50b0ZpeGVkKDMpKSwgdCA9IGkpLCB0aGlzLnN0YXRlID0gaHQsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMubGFzdEN1cnJlbnRUaW1lID0gdCwgdGhpcy50aWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcmNlU3RhcnRMb2FkID0gITAsIHRoaXMuc3RhdGUgPSBydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5zdG9wTG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VTdGFydExvYWQgPSAhMSwgdC5wcm90b3R5cGUuc3RvcExvYWQuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5kb1RpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnTG9hZEVycm9yID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubGV2ZWxzW3RoaXMubGV2ZWxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5kZXRhaWxzICYmICh0aGlzLnN0YXRlID0gaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSwgZSA9IHRoaXMucmV0cnlEYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghZSB8fCBpID49IGUgfHwgdGhpcy5tZWRpYSAmJiB0aGlzLm1lZGlhLnNlZWtpbmcpICYmIChjLmIubG9nKCdtZWRpYUNvbnRyb2xsZXI6IHJldHJ5RGF0ZSByZWFjaGVkLCBzd2l0Y2ggYmFjayB0byBJRExFIHN0YXRlJyksIHRoaXMuc3RhdGUgPSBodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkd0KCksIHRoaXMuSnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5XdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5obHMsIGkgPSB0LmNvbmZpZywgZSA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSB0aGlzLmxldmVsTGFzdExvYWRlZCAmJiAoZSB8fCAhdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgJiYgaS5zdGFydEZyYWdQcmVmZXRjaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdGhpcy5sb2FkZWRtZXRhZGF0YSA/IGUuY3VycmVudFRpbWUgOiB0aGlzLm5leHRMb2FkUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0Lm5leHRMb2FkTGV2ZWwsIHIgPSB0aGlzLmxldmVsc1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgYSA9IHIuYml0cmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGEgPyBNYXRoLm1heCg4ICogaS5tYXhCdWZmZXJTaXplIC8gYSwgaS5tYXhCdWZmZXJMZW5ndGgpIDogaS5tYXhCdWZmZXJMZW5ndGgsIGggPSBNYXRoLm1pbihoLCBpLm1heE1heEJ1ZmZlckxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gJC5idWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXIgPyB0aGlzLm1lZGlhQnVmZmVyIDogZSwgcywgaS5tYXhCdWZmZXJIb2xlKSwgbCA9IHUubGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShsID49IGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIudHJhY2UoJ2J1ZmZlciBsZW5ndGggb2YgJyArIGwudG9GaXhlZCgzKSArICcgaXMgYmVsb3cgbWF4IG9mICcgKyBoLnRvRml4ZWQoMykgKyAnLiBjaGVja2luZyBmb3IgbW9yZSBwYXlsb2FkIC4uLicpLCB0aGlzLmxldmVsID0gdC5uZXh0TG9hZExldmVsID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gci5kZXRhaWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8IGQubGl2ZSAmJiB0aGlzLmxldmVsTGFzdExvYWRlZCAhPT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gcHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5RdCh1LCBkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbHRBdWRpbyAmJiAoZi50eXBlID0gJ3ZpZGVvJyksIHRoaXMuaGxzLnRyaWdnZXIoby5hLkJVRkZFUl9FT1MsIGYpLCB2b2lkICh0aGlzLnN0YXRlID0gJ0VOREVEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWHQocywgdSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuWHQgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmZyYWdQcmV2aW91cywgbiA9IHRoaXMubGV2ZWwsIHIgPSBlLmZyYWdtZW50cywgaCA9IHIubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT09IGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgbyA9IHJbMF0uc3RhcnQsIHUgPSByW2ggLSAxXS5zdGFydCArIHJbaCAtIDFdLmR1cmF0aW9uLCBsID0gaS5lbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaW5pdFNlZ21lbnQgJiYgIWUuaW5pdFNlZ21lbnQuZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGUuaW5pdFNlZ21lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZS5saXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpcy5jb25maWcuaW5pdGlhbExpdmVNYW5pZmVzdFNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoIDwgZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGMuYi53YXJuKCdDYW4gbm90IHN0YXJ0IHBsYXliYWNrIG9mIGEgbGV2ZWwsIHJlYXNvbjogbm90IGVub3VnaCBmcmFnbWVudHMgJyArIGggKyAnIDwgJyArIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gKGEgPSB0aGlzLll0KGUsIGwsIG8sIHUsIHMsIHIsIGgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA8IG8gJiYgKGEgPSByWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHx8IChhID0gdGhpcy5LdChvLCBzLCBoLCByLCBsLCB1LCBlKSksIGEgJiYgKGEuZW5jcnlwdGVkID8gKGMuYi5sb2coJ0xvYWRpbmcga2V5IGZvciAnICsgYS5zbiArICcgb2YgWycgKyBlLnN0YXJ0U04gKyAnICwnICsgZS5lbmRTTiArICddLGxldmVsICcgKyBuKSwgdGhpcy5adChhKSkgOiAoYy5iLmxvZygnTG9hZGluZyAnICsgYS5zbiArICcgb2YgWycgKyBlLnN0YXJ0U04gKyAnICwnICsgZS5lbmRTTiArICddLGxldmVsICcgKyBuICsgJywgY3VycmVudFRpbWU6JyArIHQudG9GaXhlZCgzKSArICcsYnVmZmVyRW5kOicgKyBsLnRvRml4ZWQoMykpLCB0aGlzLnRpKGEpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuWXQgPSBmdW5jdGlvbiAodCwgaSwgZSwgcywgbiwgciwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHUgPSB0aGlzLmhscy5jb25maWcsIGwgPSB0aGlzLm1lZGlhLCBkID0gdm9pZCAwICE9PSB1LmxpdmVNYXhMYXRlbmN5RHVyYXRpb24gPyB1LmxpdmVNYXhMYXRlbmN5RHVyYXRpb24gOiB1LmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCAqIHQudGFyZ2V0ZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IE1hdGgubWF4KGUgLSB1Lm1heEZyYWdMb29rVXBUb2xlcmFuY2UsIHMgLSBkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5saXZlU3luY1Bvc2l0aW9uID0gdGhpcy5jb21wdXRlTGl2ZVBvc2l0aW9uKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBmLCBsICYmICFsLnBhdXNlZCAmJiBsLnJlYWR5U3RhdGUgJiYgbC5kdXJhdGlvbiA+IGYgJiYgZiA+IGwuY3VycmVudFRpbWUgJiYgKGMuYi5sb2coJ2J1ZmZlciBlbmQ6ICcgKyBpLnRvRml4ZWQoMykgKyAnIGlzIGxvY2F0ZWQgdG9vIGZhciBmcm9tIHRoZSBlbmQgb2YgbGl2ZSBzbGlkaW5nIHBsYXlsaXN0LCByZXNldCBjdXJyZW50VGltZSB0byA6ICcgKyBmLnRvRml4ZWQoMykpLCBsLmN1cnJlbnRUaW1lID0gZiksIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5QVFNLbm93biAmJiBpID4gcyAmJiBsICYmIGwucmVhZHlTdGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiAhdC5QVFNLbm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5oYXNQcm9ncmFtRGF0ZVRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdsaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIHNhbWUgUERUOiAnICsgbi5wcm9ncmFtRGF0ZVRpbWUpLCBvID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gaSB8fCAhQXJyYXkuaXNBcnJheSh0KSB8fCAhdC5sZW5ndGggfHwgIU9iamVjdChhLmEpKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8ICh0WzBdLnByb2dyYW1EYXRlVGltZSB8fCAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gKHRbdC5sZW5ndGggLSAxXS5lbmRQcm9ncmFtRGF0ZVRpbWUgfHwgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0Lmxlbmd0aDsgKytzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0KGksIGUsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShyLCBuLmVuZFByb2dyYW1EYXRlVGltZSwgdS5tYXhGcmFnTG9va1VwVG9sZXJhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG4uc24gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAgPj0gdC5zdGFydFNOICYmIHAgPD0gdC5lbmRTTikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gcltwIC0gdC5zdGFydFNOXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNjID09PSBiLmNjICYmIChvID0gYiwgYy5iLmxvZygnbGl2ZSBwbGF5bGlzdCwgc3dpdGNoaW5nIHBsYXlsaXN0LCBsb2FkIGZyYWcgd2l0aCBuZXh0IFNOOiAnICsgby5zbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCAobyA9IFUuc2VhcmNoKHIsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY2MgLSB0LmNjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpICYmIGMuYi5sb2coJ2xpdmUgcGxheWxpc3QsIHN3aXRjaGluZyBwbGF5bGlzdCwgbG9hZCBmcmFnIHdpdGggc2FtZSBDQzogJyArIG8uc24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCAobyA9IHJbTWF0aC5taW4oaCAtIDEsIE1hdGgucm91bmQoaCAvIDIpKV0sIGMuYi5sb2coJ2xpdmUgcGxheWxpc3QsIHN3aXRjaGluZyBwbGF5bGlzdCwgdW5rbm93biwgbG9hZCBtaWRkbGUgZnJhZyA6ICcgKyBvLnNuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5LdCA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCBuLCByLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgbyA9IHRoaXMuaGxzLmNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID0gbiA8IHIgPyBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGUgJiYgKGUgPSAwKSwgdm9pZCAwID09PSBzICYmIChzID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdCA/IGlbdC5zbiAtIGlbMF0uc24gKyAxXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmICFldChlLCBzLCBuKSA/IG4gOiBVLnNlYXJjaChpLCBldC5iaW5kKG51bGwsIGUsIHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGksIHMsIG4sIG4gPiByIC0gby5tYXhGcmFnTG9va1VwVG9sZXJhbmNlID8gMCA6IG8ubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSkgOiBzW2UgLSAxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gYS5zbiAtIGguc3RhcnRTTiwgbCA9IGkgJiYgYS5sZXZlbCA9PT0gaS5sZXZlbCwgZCA9IHNbdSAtIDFdLCBmID0gc1t1ICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgYS5zbiA9PT0gaS5zbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgJiYgIWEuYmFja3RyYWNrZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5zbiA8IGguZW5kU04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGkuZGVsdGFQVFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAmJiBwID4gby5tYXhCdWZmZXJIb2xlICYmIGkuZHJvcHBlZCAmJiB1ID8gKGEgPSBkLCBjLmIud2FybignUHJldmlvdXMgZnJhZ21lbnQgd2FzIGRyb3BwZWQgd2l0aCBsYXJnZSBQVFMgZ2FwIGJldHdlZW4gYXVkaW8gYW5kIHZpZGVvLiBNYXliZSBmcmFnbWVudCBpcyBub3Qgc3RhcnRpbmcgd2l0aCBhIGtleWZyYW1lPyBMb2FkaW5nIHByZXZpb3VzIG9uZSB0byB0cnkgdG8gb3ZlcmNvbWUgdGhpcycpKSA6IChhID0gZiwgYy5iLmxvZygnUmUtbG9hZGluZyBmcmFnbWVudCB3aXRoIFNOOiAnICsgYS5zbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmFja3RyYWNrZWQgJiYgKGYgJiYgZi5iYWNrdHJhY2tlZCA/IChjLmIud2FybignQWxyZWFkeSBiYWNrdHJhY2tlZCBmcm9tIGZyYWdtZW50ICcgKyBmLnNuICsgJywgd2lsbCBub3QgYmFja3RyYWNrIHRvIGZyYWdtZW50ICcgKyBhLnNuICsgJy4gTG9hZGluZyBmcmFnbWVudCAnICsgZi5zbiksIGEgPSBmKSA6IChjLmIud2FybignTG9hZGVkIGZyYWdtZW50IHdpdGggZHJvcHBlZCBmcmFtZXMsIGJhY2t0cmFja2luZyAxIHNlZ21lbnQgdG8gZmluZCBhIGtleWZyYW1lJyksIGEuZHJvcHBlZCA9IDAsIGQgPyAoYSA9IGQpLmJhY2t0cmFja2VkID0gITAgOiB1ICYmIChhID0gbnVsbCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLlp0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBhdCwgdGhpcy5obHMudHJpZ2dlcihvLmEuS0VZX0xPQURJTkcsIHsgZnJhZzogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC50aSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLmdldFN0YXRlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFnQ3VycmVudCA9IHQsICdpbml0U2VnbWVudCcgIT09IHQuc24gJiYgKHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITApLCBPYmplY3QoYS5hKSh0LnNuKSAmJiAhdC5iaXRyYXRlVGVzdCAmJiAodGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gdC5zdGFydCArIHQuZHVyYXRpb24pLCB0LmJhY2t0cmFja2VkIHx8IGkgPT09IEIgfHwgaSA9PT0gRiA/ICh0LmF1dG9MZXZlbCA9IHRoaXMuaGxzLmF1dG9MZXZlbEVuYWJsZWQsIHQuYml0cmF0ZVRlc3QgPSB0aGlzLmJpdHJhdGVUZXN0LCB0aGlzLmhscy50cmlnZ2VyKG8uYS5GUkFHX0xPQURJTkcsIHsgZnJhZzogdCB9KSwgdGhpcy5kZW11eGVyIHx8ICh0aGlzLmRlbXV4ZXIgPSBuZXcgUSh0aGlzLmhscywgJ21haW4nKSksIHRoaXMuc3RhdGUgPSBvdCkgOiBpID09PSBEICYmIHRoaXMuaWkodC5kdXJhdGlvbikgJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuZ2V0QnVmZmVyZWRGcmFnID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRCdWZmZXJlZEZyYWcodCwgbi5NQUlOKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5mb2xsb3dpbmdCdWZmZXJlZEZyYWcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB0aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmVuZFBUUyArIDAuNSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLkp0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGksIGUgPSB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5yZWFkeVN0YXRlICYmICExID09PSBlLnNlZWtpbmcgJiYgKChpID0gZS5jdXJyZW50VGltZSkgPiB0aGlzLmxhc3RDdXJyZW50VGltZSAmJiAodGhpcy5sYXN0Q3VycmVudFRpbWUgPSBpKSwgJC5pc0J1ZmZlcmVkKGUsIGkpID8gdCA9IHRoaXMuZ2V0QnVmZmVyZWRGcmFnKGkpIDogJC5pc0J1ZmZlcmVkKGUsIGkgKyAwLjEpICYmICh0ID0gdGhpcy5nZXRCdWZmZXJlZEZyYWcoaSArIDAuMSkpLCB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gdGhpcy5mcmFnUGxheWluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKG8uYS5GUkFHX0NIQU5HRUQsIHsgZnJhZzogcyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYWdQbGF5aW5nICYmIHRoaXMuZnJhZ1BsYXlpbmcubGV2ZWwgPT09IG4gfHwgdGhpcy5obHMudHJpZ2dlcihvLmEuTEVWRUxfU1dJVENIRUQsIHsgbGV2ZWw6IG4gfSksIHRoaXMuZnJhZ1BsYXlpbmcgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5pbW1lZGlhdGVMZXZlbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmIubG9nKCdpbW1lZGlhdGVMZXZlbFN3aXRjaCcpLCAhdGhpcy5pbW1lZGlhdGVTd2l0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmltbWVkaWF0ZVN3aXRjaCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpID0gdGhpcy5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID8gKHQgPSBpLnBhdXNlZCwgaS5wYXVzZSgpKSA6IHQgPSAhMCwgdGhpcy5wcmV2aW91c2x5UGF1c2VkID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5mcmFnQ3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5sb2FkZXIgJiYgZS5sb2FkZXIuYWJvcnQoKSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuZmx1c2hNYWluQnVmZmVyKDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuaW1tZWRpYXRlTGV2ZWxTd2l0Y2hFbmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuYnVmZmVyZWQubGVuZ3RoICYmICh0aGlzLmltbWVkaWF0ZVN3aXRjaCA9ICExLCAkLmlzQnVmZmVyZWQodCwgdC5jdXJyZW50VGltZSkgJiYgKHQuY3VycmVudFRpbWUgLT0gMC4wMDAxKSwgdGhpcy5wcmV2aW91c2x5UGF1c2VkIHx8IHQucGxheSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5uZXh0TGV2ZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LnJlYWR5U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSB0aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmN1cnJlbnRUaW1lKSkgJiYgZS5zdGFydFBUUyA+IDEgJiYgdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgZS5zdGFydFBUUyAtIDEpLCB0LnBhdXNlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5obHMubmV4dExvYWRMZXZlbCwgciA9IHRoaXMubGV2ZWxzW25dLCBoID0gdGhpcy5mcmFnTGFzdEticHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBoICYmIHRoaXMuZnJhZ0N1cnJlbnQgPyB0aGlzLmZyYWdDdXJyZW50LmR1cmF0aW9uICogci5iaXRyYXRlIC8gKDEwMDAgKiBoKSArIDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMgPSB0aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmN1cnJlbnRUaW1lICsgaSkpICYmIChzID0gdGhpcy5mb2xsb3dpbmdCdWZmZXJlZEZyYWcocykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5mcmFnQ3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiBhLmxvYWRlciAmJiBhLmxvYWRlci5hYm9ydCgpLCB0aGlzLmZyYWdDdXJyZW50ID0gbnVsbCwgdGhpcy5mbHVzaE1haW5CdWZmZXIocy5tYXhTdGFydFBUUywgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuZmx1c2hNYWluQnVmZmVyID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBkdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZE9mZnNldDogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWx0QXVkaW8gJiYgKGUudHlwZSA9ICd2aWRlbycpLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5CVUZGRVJfRkxVU0hJTkcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLm9uTWVkaWFBdHRhY2hlZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMubWVkaWEgPSB0aGlzLm1lZGlhQnVmZmVyID0gdC5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub252c2Vla2luZyA9IHRoaXMub25NZWRpYVNlZWtpbmcuYmluZCh0aGlzKSwgdGhpcy5vbnZzZWVrZWQgPSB0aGlzLm9uTWVkaWFTZWVrZWQuYmluZCh0aGlzKSwgdGhpcy5vbnZlbmRlZCA9IHRoaXMub25NZWRpYUVuZGVkLmJpbmQodGhpcyksIGkuYWRkRXZlbnRMaXN0ZW5lcignc2Vla2luZycsIHRoaXMub252c2Vla2luZyksIGkuYWRkRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgdGhpcy5vbnZzZWVrZWQpLCBpLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5vbnZlbmRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZXZlbHMgJiYgZS5hdXRvU3RhcnRMb2FkICYmIHRoaXMuaGxzLnN0YXJ0TG9hZChlLnN0YXJ0UG9zaXRpb24pLCB0aGlzLmdhcENvbnRyb2xsZXIgPSBuZXcgbnQoZSwgaSwgdGhpcy5mcmFnbWVudFRyYWNrZXIsIHRoaXMuaGxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbk1lZGlhRGV0YWNoaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmVuZGVkICYmIChjLmIubG9nKCdNU0UgZGV0YWNoaW5nIGFuZCB2aWRlbyBlbmRlZCwgcmVzZXQgc3RhcnRQb3NpdGlvbicpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxldmVsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5kZXRhaWxzICYmIHQuZGV0YWlscy5mcmFnbWVudHMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmJhY2t0cmFja2VkID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgJiYgKHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2luZycsIHRoaXMub252c2Vla2luZyksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Vla2VkJywgdGhpcy5vbnZzZWVrZWQpLCB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgdGhpcy5vbnZlbmRlZCksIHRoaXMub252c2Vla2luZyA9IHRoaXMub252c2Vla2VkID0gdGhpcy5vbnZlbmRlZCA9IG51bGwpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVBbGxGcmFnbWVudHMoKSwgdGhpcy5tZWRpYSA9IHRoaXMubWVkaWFCdWZmZXIgPSBudWxsLCB0aGlzLmxvYWRlZG1ldGFkYXRhID0gITEsIHRoaXMuc3RvcExvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbk1lZGlhU2Vla2VkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLm1lZGlhLCBpID0gdCA/IHQuY3VycmVudFRpbWUgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYS5hKShpKSAmJiBjLmIubG9nKCdtZWRpYSBzZWVrZWQgdG8gJyArIGkudG9GaXhlZCgzKSksIHRoaXMudGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLm9uTWFuaWZlc3RMb2FkaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygndHJpZ2dlciBCVUZGRVJfUkVTRVQnKSwgdGhpcy5obHMudHJpZ2dlcihvLmEuQlVGRkVSX1JFU0VUKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlQWxsRnJhZ21lbnRzKCksIHRoaXMuc3RhbGxlZCA9ICExLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwub25NYW5pZmVzdFBhcnNlZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSA9ICExLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxldmVscy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPSB0LmF1ZGlvQ29kZWMpICYmICgtMSAhPT0gaS5pbmRleE9mKCdtcDRhLjQwLjInKSAmJiAoZSA9ICEwKSwgLTEgIT09IGkuaW5kZXhPZignbXA0YS40MC41JykgJiYgKHMgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYXVkaW9Db2RlY1N3aXRjaCA9IGUgJiYgcywgdGhpcy5hdWRpb0NvZGVjU3dpdGNoICYmIGMuYi5sb2coJ2JvdGggQUFDL0hFLUFBQyBhdWRpbyBmb3VuZCBpbiBsZXZlbHM7IGRlY2xhcmluZyBsZXZlbCBjb2RlYyBhcyBIRS1BQUMnKSwgdGhpcy5hbHRBdWRpbyA9IHQuYWx0QXVkaW8sIHRoaXMubGV2ZWxzID0gdC5sZXZlbHMsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4uYXV0b1N0YXJ0TG9hZCB8fCB0aGlzLmZvcmNlU3RhcnRMb2FkKSAmJiB0aGlzLmhscy5zdGFydExvYWQobi5zdGFydFBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkxldmVsTG9hZGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5kZXRhaWxzLCBlID0gdC5sZXZlbCwgcyA9IHRoaXMubGV2ZWxzW3RoaXMubGV2ZWxMYXN0TG9hZGVkXSwgbiA9IHRoaXMubGV2ZWxzW2VdLCByID0gaS50b3RhbGR1cmF0aW9uLCBoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmIubG9nKCdsZXZlbCAnICsgZSArICcgbG9hZGVkIFsnICsgaS5zdGFydFNOICsgJywnICsgaS5lbmRTTiArICddLGR1cmF0aW9uOicgKyByKSwgaS5saXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBuLmRldGFpbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiBpLmZyYWdtZW50cy5sZW5ndGggPiAwID8gKGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW5pdFNlZ21lbnQgJiYgdC5pbml0U2VnbWVudCAmJiAoaS5pbml0U2VnbWVudCA9IHQuaW5pdFNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSBNYXRoLm1heCh0LnN0YXJ0U04sIGkuc3RhcnRTTikgLSBpLnN0YXJ0U04sIG4gPSBNYXRoLm1pbih0LmVuZFNOLCBpLmVuZFNOKSAtIGkuc3RhcnRTTiwgciA9IGkuc3RhcnRTTiAtIHQuc3RhcnRTTiwgaCA9IHM7IGggPD0gbjsgaCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHQuZnJhZ21lbnRzW3IgKyBoXSwgbyA9IGkuZnJhZ21lbnRzW2hdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShhLCBvLCBoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBpLCBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0LmNjIC0gbi5jYywgT2JqZWN0KGEuYSkodC5zdGFydFBUUykgJiYgKG4uc3RhcnQgPSBuLnN0YXJ0UFRTID0gdC5zdGFydFBUUywgbi5lbmRQVFMgPSB0LmVuZFBUUywgbi5kdXJhdGlvbiA9IHQuZHVyYXRpb24sIG4uYmFja3RyYWNrZWQgPSB0LmJhY2t0cmFja2VkLCBuLmRyb3BwZWQgPSB0LmRyb3BwZWQsIGUgPSBuKSwgaS5QVFNLbm93biA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuUFRTS25vd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnZGlzY29udGludWl0eSBzbGlkaW5nIGZyb20gcGxheWxpc3QsIHRha2UgZHJpZnQgaW50byBhY2NvdW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGkuZnJhZ21lbnRzLCByID0gMDsgciA8IG4ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0uY2MgKz0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBLKGksIGUsIGUuc3RhcnRQVFMsIGUuZW5kUFRTLCBlLnN0YXJ0RFRTLCBlLmVuZERUUykgOiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaS5zdGFydFNOIC0gdC5zdGFydFNOLCBzID0gdC5mcmFnbWVudHMsIG4gPSBpLmZyYWdtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlIDwgMCB8fCBlID4gcy5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IG4ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdLnN0YXJ0ICs9IHNbZV0uc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIGkpLCBpLlBUU0tub3duID0gdC5QVFNLbm93bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odSwgaSksIGggPSBpLmZyYWdtZW50c1swXS5zdGFydCwgdGhpcy5saXZlU3luY1Bvc2l0aW9uID0gdGhpcy5jb21wdXRlTGl2ZVBvc2l0aW9uKGgsIHUpLCBpLlBUU0tub3duICYmIE9iamVjdChhLmEpKGgpID8gYy5iLmxvZygnbGl2ZSBwbGF5bGlzdCBzbGlkaW5nOicgKyBoLnRvRml4ZWQoMykpIDogKGMuYi5sb2coJ2xpdmUgcGxheWxpc3QgLSBvdXRkYXRlZCBQVFMsIHVua25vd24gc2xpZGluZycpLCBpdCh0aGlzLmZyYWdQcmV2aW91cywgcywgaSkpKSA6IChjLmIubG9nKCdsaXZlIHBsYXlsaXN0IC0gZmlyc3QgbG9hZCwgdW5rbm93biBzbGlkaW5nJyksIGkuUFRTS25vd24gPSAhMSwgaXQodGhpcy5mcmFnUHJldmlvdXMsIHMsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuUFRTS25vd24gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmRldGFpbHMgPSBpLCB0aGlzLmxldmVsTGFzdExvYWRlZCA9IGUsIHRoaXMuaGxzLnRyaWdnZXIoby5hLkxFVkVMX1VQREFURUQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEgPT09IHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xID09PSB0aGlzLnN0YXJ0UG9zaXRpb24gfHwgLTEgPT09IHRoaXMubGFzdEN1cnJlbnRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gaS5zdGFydFRpbWVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmEpKGwpID8gKGwgPCAwICYmIChjLmIubG9nKCduZWdhdGl2ZSBzdGFydCB0aW1lIG9mZnNldCAnICsgbCArICcsIGNvdW50IGZyb20gZW5kIG9mIGxhc3QgZnJhZ21lbnQnKSwgbCA9IGggKyByICsgbCksIGMuYi5sb2coJ3N0YXJ0IHRpbWUgb2Zmc2V0IGZvdW5kIGluIHBsYXlsaXN0LCBhZGp1c3Qgc3RhcnRQb3NpdGlvbiB0byAnICsgbCksIHRoaXMuc3RhcnRQb3NpdGlvbiA9IGwpIDogaS5saXZlID8gKHRoaXMuc3RhcnRQb3NpdGlvbiA9IHRoaXMuY29tcHV0ZUxpdmVQb3NpdGlvbihoLCBpKSwgYy5iLmxvZygnY29uZmlndXJlIHN0YXJ0UG9zaXRpb24gdG8gJyArIHRoaXMuc3RhcnRQb3NpdGlvbikpIDogdGhpcy5zdGFydFBvc2l0aW9uID0gMCwgdGhpcy5sYXN0Q3VycmVudFRpbWUgPSB0aGlzLnN0YXJ0UG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IHRoaXMuc3RhcnRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPT09IHB0ICYmICh0aGlzLnN0YXRlID0gaHQpLCB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbktleUxvYWRlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPT09IGF0ICYmICh0aGlzLnN0YXRlID0gaHQsIHRoaXMudGljaygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkZyYWdMb2FkZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmZyYWdDdXJyZW50LCBlID0gdGhpcy5obHMsIHMgPSB0aGlzLmxldmVscywgbiA9IHRoaXMubWVkaWEsIHIgPSB0LmZyYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gb3QgJiYgaSAmJiAnbWFpbicgPT09IHIudHlwZSAmJiByLmxldmVsID09PSBpLmxldmVsICYmIHIuc24gPT09IGkuc24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHQuc3RhdHMsIGEgPSBzW2kubGV2ZWxdLCB1ID0gYS5kZXRhaWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJpdHJhdGVUZXN0ID0gITEsIHRoaXMuc3RhdHMgPSBoLCBjLmIubG9nKCdMb2FkZWQgJyArIGkuc24gKyAnIG9mIFsnICsgdS5zdGFydFNOICsgJyAsJyArIHUuZW5kU04gKyAnXSxsZXZlbCAnICsgaS5sZXZlbCksIHIuYml0cmF0ZVRlc3QgJiYgZS5uZXh0TG9hZExldmVsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gaHQsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITEsIGgudHBhcnNlZCA9IGgudGJ1ZmZlcmVkID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpLCBlLnRyaWdnZXIoby5hLkZSQUdfQlVGRkVSRUQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZzogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnbWFpbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMudGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdpbml0U2VnbWVudCcgPT09IHIuc24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBodCwgaC50cGFyc2VkID0gaC50YnVmZmVyZWQgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCksIHUuaW5pdFNlZ21lbnQuZGF0YSA9IHQucGF5bG9hZCwgZS50cmlnZ2VyKG8uYS5GUkFHX0JVRkZFUkVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0czogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWc6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ21haW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnUGFyc2luZyAnICsgaS5zbiArICcgb2YgWycgKyB1LnN0YXJ0U04gKyAnICwnICsgdS5lbmRTTiArICddLGxldmVsICcgKyBpLmxldmVsICsgJywgY2MgJyArIGkuY2MpLCB0aGlzLnN0YXRlID0gdXQsIHRoaXMucGVuZGluZ0J1ZmZlcmluZyA9ICEwLCB0aGlzLmFwcGVuZGVkID0gITEsIHIuYml0cmF0ZVRlc3QgJiYgKHIuYml0cmF0ZVRlc3QgPSAhMSwgdGhpcy5mcmFnbWVudFRyYWNrZXIub25GcmFnTG9hZGVkKHsgZnJhZzogciB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gIShuICYmIG4uc2Vla2luZykgJiYgKHUuUFRTS25vd24gfHwgIXUubGl2ZSksIGQgPSB1LmluaXRTZWdtZW50ID8gdS5pbml0U2VnbWVudC5kYXRhIDogW10sIGYgPSB0aGlzLmVpKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5kZW11eGVyID0gdGhpcy5kZW11eGVyIHx8IG5ldyBRKHRoaXMuaGxzLCAnbWFpbicpKS5wdXNoKHQucGF5bG9hZCwgZCwgZiwgYS52aWRlb0NvZGVjLCBpLCB1LnRvdGFsZHVyYXRpb24sIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhZ0xvYWRFcnJvciA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwub25GcmFnUGFyc2luZ0luaXRTZWdtZW50ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5mcmFnQ3VycmVudCwgZSA9IHQuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmICdtYWluJyA9PT0gdC5pZCAmJiBlLnNuID09PSBpLnNuICYmIGUubGV2ZWwgPT09IGkubGV2ZWwgJiYgdGhpcy5zdGF0ZSA9PT0gdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiwgciA9IHQudHJhY2tzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmF1ZGlvICYmIHRoaXMuYWx0QXVkaW8gJiYgZGVsZXRlIHIuYXVkaW8sIG4gPSByLmF1ZGlvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gdGhpcy5sZXZlbHNbdGhpcy5sZXZlbF0uYXVkaW9Db2RlYywgYSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAmJiB0aGlzLmF1ZGlvQ29kZWNTd2FwICYmIChjLmIubG9nKCdzd2FwcGluZyBwbGF5bGlzdCBhdWRpbyBjb2RlYycpLCBoID0gLTEgIT09IGguaW5kZXhPZignbXA0YS40MC41JykgPyAnbXA0YS40MC4yJyA6ICdtcDRhLjQwLjUnKSwgdGhpcy5hdWRpb0NvZGVjU3dpdGNoICYmIDEgIT09IG4ubWV0YWRhdGEuY2hhbm5lbENvdW50ICYmIC0xID09PSBhLmluZGV4T2YoJ2ZpcmVmb3gnKSAmJiAoaCA9ICdtcDRhLjQwLjUnKSwgLTEgIT09IGEuaW5kZXhPZignYW5kcm9pZCcpICYmICdhdWRpby9tcGVnJyAhPT0gbi5jb250YWluZXIgJiYgKGggPSAnbXA0YS40MC4yJywgYy5iLmxvZygnQW5kcm9pZDogZm9yY2UgYXVkaW8gY29kZWMgdG8gJyArIGgpKSwgbi5sZXZlbENvZGVjID0gaCwgbi5pZCA9IHQuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyBpbiAoKG4gPSByLnZpZGVvKSAmJiAobi5sZXZlbENvZGVjID0gdGhpcy5sZXZlbHNbdGhpcy5sZXZlbF0udmlkZW9Db2RlYywgbi5pZCA9IHQuaWQpLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5CVUZGRVJfQ09ERUNTLCByKSwgcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHJbc10sIGMuYi5sb2coJ21haW4gdHJhY2s6JyArIHMgKyAnLGNvbnRhaW5lcjonICsgbi5jb250YWluZXIgKyAnLGNvZGVjc1tsZXZlbC9wYXJzZWRdPVsnICsgbi5sZXZlbENvZGVjICsgJy8nICsgbi5jb2RlYyArICddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gbi5pbml0U2VnbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiAodGhpcy5hcHBlbmRlZCA9ICEwLCB0aGlzLnBlbmRpbmdCdWZmZXJpbmcgPSAhMCwgdGhpcy5obHMudHJpZ2dlcihvLmEuQlVGRkVSX0FQUEVORElORywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6ICdtYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdpbml0U2VnbWVudCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkZyYWdQYXJzaW5nRGF0YSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIGUgPSB0aGlzLmZyYWdDdXJyZW50LCBzID0gdC5mcmFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgJ21haW4nID09PSB0LmlkICYmIHMuc24gPT09IGUuc24gJiYgcy5sZXZlbCA9PT0gZS5sZXZlbCAmJiAoJ2F1ZGlvJyAhPT0gdC50eXBlIHx8ICF0aGlzLmFsdEF1ZGlvKSAmJiB0aGlzLnN0YXRlID09PSB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5sZXZlbHNbdGhpcy5sZXZlbF0sIHIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoYS5hKSh0LmVuZFBUUykgfHwgKHQuZW5kUFRTID0gdC5zdGFydFBUUyArIGUuZHVyYXRpb24sIHQuZW5kRFRTID0gdC5zdGFydERUUyArIGUuZHVyYXRpb24pLCAhMCA9PT0gdC5oYXNBdWRpbyAmJiByLmFkZEVsZW1lbnRhcnlTdHJlYW0ocC5BVURJTyksICEwID09PSB0Lmhhc1ZpZGVvICYmIHIuYWRkRWxlbWVudGFyeVN0cmVhbShwLlZJREVPKSwgYy5iLmxvZygnUGFyc2VkICcgKyB0LnR5cGUgKyAnLFBUUzpbJyArIHQuc3RhcnRQVFMudG9GaXhlZCgzKSArICcsJyArIHQuZW5kUFRTLnRvRml4ZWQoMykgKyAnXSxEVFM6WycgKyB0LnN0YXJ0RFRTLnRvRml4ZWQoMykgKyAnLycgKyB0LmVuZERUUy50b0ZpeGVkKDMpICsgJ10sbmI6JyArIHQubmIgKyAnLGRyb3BwZWQ6JyArICh0LmRyb3BwZWQgfHwgMCkpLCAndmlkZW8nID09PSB0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmRyb3BwZWQgPSB0LmRyb3BwZWQsIHIuZHJvcHBlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmJhY2t0cmFja2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdBbHJlYWR5IGJhY2t0cmFja2VkIG9uIHRoaXMgZnJhZ21lbnQsIGFwcGVuZGluZyB3aXRoIHRoZSBnYXAnLCByLnNuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gbi5kZXRhaWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCB8fCByLnNuICE9PSBoLnN0YXJ0U04pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmIud2FybignbWlzc2luZyB2aWRlbyBmcmFtZShzKSwgYmFja3RyYWNraW5nIGZyYWdtZW50Jywgci5zbiksIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KHIpLCByLmJhY2t0cmFja2VkID0gITAsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IHQuc3RhcnRQVFMsIHRoaXMuc3RhdGUgPSBodCwgdGhpcy5mcmFnUHJldmlvdXMgPSByLCB2b2lkIHRoaXMudGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdtaXNzaW5nIHZpZGVvIGZyYW1lKHMpIG9uIGZpcnN0IGZyYWcsIGFwcGVuZGluZyB3aXRoIGdhcCcsIHIuc24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmJhY2t0cmFja2VkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBLKG4uZGV0YWlscywgciwgdC5zdGFydFBUUywgdC5lbmRQVFMsIHQuc3RhcnREVFMsIHQuZW5kRFRTKSwgbCA9IHRoaXMuaGxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwudHJpZ2dlcihvLmEuTEVWRUxfUFRTX1VQREFURUQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogbi5kZXRhaWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogdGhpcy5sZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpZnQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHQudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHQuc3RhcnRQVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdC5lbmRQVFMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRhdGExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRhdGEyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5sZW5ndGggJiYgaS5zdGF0ZSA9PT0gdXQgJiYgKGkuYXBwZW5kZWQgPSAhMCwgaS5wZW5kaW5nQnVmZmVyaW5nID0gITAsIGwudHJpZ2dlcihvLmEuQlVGRkVSX0FQUEVORElORywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdC50eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogJ21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ2RhdGEnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy50aWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwub25GcmFnUGFyc2VkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5mcmFnQ3VycmVudCwgZSA9IHQuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgJ21haW4nID09PSB0LmlkICYmIGUuc24gPT09IGkuc24gJiYgZS5sZXZlbCA9PT0gaS5sZXZlbCAmJiB0aGlzLnN0YXRlID09PSB1dCAmJiAodGhpcy5zdGF0cy50cGFyc2VkID0gd2luZG93LnBlcmZvcm1hbmNlLm5vdygpLCB0aGlzLnN0YXRlID0gbHQsIHRoaXMuc2koKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwub25BdWRpb1RyYWNrU3dpdGNoaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gISF0LnVybCwgZSA9IHQuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWRpYUJ1ZmZlciAhPT0gdGhpcy5tZWRpYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzd2l0Y2hpbmcgb24gbWFpbiBhdWRpbywgdXNlIG1lZGlhLmJ1ZmZlcmVkIHRvIHNjaGVkdWxlIG1haW4gZnJhZ21lbnQgbG9hZGluZycpLCB0aGlzLm1lZGlhQnVmZmVyID0gdGhpcy5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmZyYWdDdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxvYWRlciAmJiAoYy5iLmxvZygnc3dpdGNoaW5nIHRvIG1haW4gYXVkaW8gdHJhY2ssIGNhbmNlbCBtYWluIGZyYWdtZW50IGxvYWQnKSwgcy5sb2FkZXIuYWJvcnQoKSksIHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMuZGVtdXhlciAmJiAodGhpcy5kZW11eGVyLmRlc3Ryb3koKSwgdGhpcy5kZW11eGVyID0gbnVsbCksIHRoaXMuc3RhdGUgPSBodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmhsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnRyaWdnZXIoby5hLkJVRkZFUl9GTFVTSElORywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kT2Zmc2V0OiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhdWRpbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi50cmlnZ2VyKG8uYS5BVURJT19UUkFDS19TV0lUQ0hFRCwgeyBpZDogZSB9KSwgdGhpcy5hbHRBdWRpbyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLm9uQXVkaW9UcmFja1N3aXRjaGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5pZCwgZSA9ICEhdGhpcy5obHMuYXVkaW9UcmFja3NbaV0udXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXMudmlkZW9CdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiB0aGlzLm1lZGlhQnVmZmVyICE9PSBzICYmIChjLmIubG9nKCdzd2l0Y2hpbmcgb24gYWx0ZXJuYXRlIGF1ZGlvLCB1c2UgdmlkZW8uYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nJyksIHRoaXMubWVkaWFCdWZmZXIgPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWx0QXVkaW8gPSBlLCB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkJ1ZmZlckNyZWF0ZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUsIHMgPSB0LnRyYWNrcywgbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWluJyA9PT0gaC5pZCA/IChlID0gciwgaSA9IGgsICd2aWRlbycgPT09IHIgJiYgKHRoaXMudmlkZW9CdWZmZXIgPSBzW3JdLmJ1ZmZlcikpIDogbiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBpID8gKGMuYi5sb2coJ2FsdGVybmF0ZSB0cmFjayBmb3VuZCwgdXNlICcgKyBlICsgJy5idWZmZXJlZCB0byBzY2hlZHVsZSBtYWluIGZyYWdtZW50IGxvYWRpbmcnKSwgdGhpcy5tZWRpYUJ1ZmZlciA9IGkuYnVmZmVyKSA6IHRoaXMubWVkaWFCdWZmZXIgPSB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLm9uQnVmZmVyQXBwZW5kZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdtYWluJyA9PT0gdC5wYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAhPT0gdXQgJiYgaSAhPT0gbHQgfHwgKHRoaXMucGVuZGluZ0J1ZmZlcmluZyA9IHQucGVuZGluZyA+IDAsIHRoaXMuc2koKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuc2kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLnN0YXRlICE9PSBsdCB8fCB0aGlzLmFwcGVuZGVkICYmIHRoaXMucGVuZGluZ0J1ZmZlcmluZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuZnJhZ0N1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ21haW4gYnVmZmVyZWQgOiAnICsgWi50b1N0cmluZyhpLmJ1ZmZlcmVkKSksIHRoaXMuZnJhZ1ByZXZpb3VzID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnN0YXRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRidWZmZXJlZCA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSwgdGhpcy5mcmFnTGFzdEticHMgPSBNYXRoLnJvdW5kKDggKiBlLnRvdGFsIC8gKGUudGJ1ZmZlcmVkIC0gZS50Zmlyc3QpKSwgdGhpcy5obHMudHJpZ2dlcihvLmEuRlJBR19CVUZGRVJFRCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdtYWluJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdGF0ZSA9IGh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkVycm9yID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5mcmFnIHx8IHRoaXMuZnJhZ0N1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgJ21haW4nID09PSBpLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICEhdGhpcy5tZWRpYSAmJiAkLmlzQnVmZmVyZWQodGhpcy5tZWRpYSwgdGhpcy5tZWRpYS5jdXJyZW50VGltZSkgJiYgJC5pc0J1ZmZlcmVkKHRoaXMubWVkaWEsIHRoaXMubWVkaWEuY3VycmVudFRpbWUgKyAwLjUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5kZXRhaWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLmEuRlJBR19MT0FEX0VSUk9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLkZSQUdfTE9BRF9USU1FT1VUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLktFWV9MT0FEX0VSUk9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLktFWV9MT0FEX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5mYXRhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZyYWdMb2FkRXJyb3IgKyAxIDw9IHRoaXMuY29uZmlnLmZyYWdMb2FkaW5nTWF4UmV0cnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IE1hdGgubWluKE1hdGgucG93KDIsIHRoaXMuZnJhZ0xvYWRFcnJvcikgKiB0aGlzLmNvbmZpZy5mcmFnTG9hZGluZ1JldHJ5RGVsYXksIHRoaXMuY29uZmlnLmZyYWdMb2FkaW5nTWF4UmV0cnlUaW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIud2FybignbWVkaWFDb250cm9sbGVyOiBmcmFnIGxvYWRpbmcgZmFpbGVkLCByZXRyeSBpbiAnICsgcyArICcgbXMnKSwgdGhpcy5yZXRyeURhdGUgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgKyBzLCB0aGlzLmxvYWRlZG1ldGFkYXRhIHx8ICh0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCA9ICExLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24pLCB0aGlzLmZyYWdMb2FkRXJyb3IrKywgdGhpcy5zdGF0ZSA9IGN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmVycm9yKCdtZWRpYUNvbnRyb2xsZXI6ICcgKyB0LmRldGFpbHMgKyAnIHJlYWNoZXMgbWF4IHJldHJ5LCByZWRpc3BhdGNoIGFzIGZhdGFsIC4uLicpLCB0LmZhdGFsID0gITAsIHRoaXMuc3RhdGUgPSBmdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLmEuTEVWRUxfTE9BRF9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguYS5MRVZFTF9MT0FEX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgIT09IGZ0ICYmICh0LmZhdGFsID8gKHRoaXMuc3RhdGUgPSBmdCwgYy5iLndhcm4oJ3N0cmVhbUNvbnRyb2xsZXI6ICcgKyB0LmRldGFpbHMgKyAnLHN3aXRjaCB0byAnICsgdGhpcy5zdGF0ZSArICcgc3RhdGUgLi4uJykpIDogdC5sZXZlbFJldHJ5IHx8IHRoaXMuc3RhdGUgIT09IHB0IHx8ICh0aGlzLnN0YXRlID0gaHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLmEuQlVGRkVSX0ZVTExfRVJST1I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWluJyAhPT0gdC5wYXJlbnQgfHwgdGhpcy5zdGF0ZSAhPT0gdXQgJiYgdGhpcy5zdGF0ZSAhPT0gbHQgfHwgKGUgPyAodGhpcy5paSh0aGlzLmNvbmZpZy5tYXhCdWZmZXJMZW5ndGgpLCB0aGlzLnN0YXRlID0gaHQpIDogKGMuYi53YXJuKCdidWZmZXIgZnVsbCBlcnJvciBhbHNvIG1lZGlhLmN1cnJlbnRUaW1lIGlzIG5vdCBidWZmZXJlZCwgZmx1c2ggZXZlcnl0aGluZycpLCB0aGlzLmZyYWdDdXJyZW50ID0gbnVsbCwgdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5paSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubWF4TWF4QnVmZmVyTGVuZ3RoID49IHQgJiYgKGkubWF4TWF4QnVmZmVyTGVuZ3RoIC89IDIsIGMuYi53YXJuKCdtYWluOnJlZHVjZSBtYXggYnVmZmVyIGxlbmd0aCB0byAnICsgaS5tYXhNYXhCdWZmZXJMZW5ndGggKyAncycpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuR3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAwICE9PSB0LnJlYWR5U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICh0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHQpLmJ1ZmZlcmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmxvYWRlZG1ldGFkYXRhICYmIGkubGVuZ3RoID8gKHRoaXMubG9hZGVkbWV0YWRhdGEgPSAhMCwgdGhpcy5uaSgpKSA6IHRoaXMuaW1tZWRpYXRlU3dpdGNoID8gdGhpcy5pbW1lZGlhdGVMZXZlbFN3aXRjaEVuZCgpIDogdGhpcy5nYXBDb250cm9sbGVyLnBvbGwodGhpcy5sYXN0Q3VycmVudFRpbWUsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsLm9uRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGh0LCB0aGlzLmxvYWRlZG1ldGFkYXRhIHx8ICh0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCA9ICExLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24pLCB0aGlzLnRpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5vbkJ1ZmZlckZsdXNoZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWFCdWZmZXIgPyB0aGlzLm1lZGlhQnVmZmVyIDogdGhpcy5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIuZGV0ZWN0RXZpY3RlZEZyYWdtZW50cyhwLlZJREVPLCB0LmJ1ZmZlcmVkKSwgdGhpcy5zdGF0ZSA9IGh0LCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuc3dhcEF1ZGlvQ29kZWMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ29kZWNTd2FwID0gIXRoaXMuYXVkaW9Db2RlY1N3YXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwubmkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWEsIGkgPSB0LmN1cnJlbnRUaW1lLCBlID0gdC5zZWVraW5nID8gaSA6IHRoaXMuc3RhcnRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT09IGUgJiYgZSA+PSAwICYmIChjLmIubG9nKCd0YXJnZXQgc3RhcnQgcG9zaXRpb24gbm90IGJ1ZmZlcmVkLCBzZWVrIHRvIGJ1ZmZlcmVkLnN0YXJ0KDApICcgKyBlICsgJyBmcm9tIGN1cnJlbnQgdGltZSAnICsgaSArICcgJyksIHQuY3VycmVudFRpbWUgPSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbC5laSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuY29uZmlnLmRlZmF1bHRBdWRpb0NvZGVjIHx8IHQuYXVkaW9Db2RlYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF1ZGlvQ29kZWNTd2FwICYmIChjLmIubG9nKCdzd2FwcGluZyBwbGF5bGlzdCBhdWRpbyBjb2RlYycpLCBpICYmIChpID0gLTEgIT09IGkuaW5kZXhPZignbXA0YS40MC41JykgPyAnbXA0YS40MC4yJyA6ICdtcDRhLjQwLjUnKSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBzLCAodSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56dCA9IHQsIGMuYi5sb2coJ21haW4gc3RyZWFtLWNvbnRyb2xsZXI6ICcgKyBpICsgJy0+JyArIHQpLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5TVFJFQU1fU1RBVEVfVFJBTlNJVElPTiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzU3RhdGU6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnp0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY3VycmVudExldmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmdldEJ1ZmZlcmVkRnJhZyh0LmN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ25leHRCdWZmZXJlZEZyYWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdGhpcy5mb2xsb3dpbmdCdWZmZXJlZEZyYWcodGhpcy5nZXRCdWZmZXJlZEZyYWcodC5jdXJyZW50VGltZSkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ25leHRMZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5uZXh0QnVmZmVyZWRGcmFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHQubGV2ZWwgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xpdmVTeW5jUG9zaXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSAmJiBidChyLnByb3RvdHlwZSwgdSksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdCwgKGkgPSBzKS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSwgaS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpLCBpLl9fcHJvdG9fXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRvVGljayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5zdGFydExvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uc3RvcExvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuZnJhZ0N1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh0LmxvYWRlciAmJiB0LmxvYWRlci5hYm9ydCgpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudCh0KSksIHRoaXMuZGVtdXhlciAmJiAodGhpcy5kZW11eGVyLmRlc3Ryb3koKSwgdGhpcy5kZW11eGVyID0gbnVsbCksIHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMuY2xlYXJJbnRlcnZhbCgpLCB0aGlzLmNsZWFyTmV4dFRpY2soKSwgdGhpcy5zdGF0ZSA9IHJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLlF0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5mcmFnQ3VycmVudCwgcyA9IHRoaXMuZnJhZ21lbnRUcmFja2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpLmxpdmUgJiYgZSAmJiAhZS5iYWNrdHJhY2tlZCAmJiBlLnNuID09PSBpLmVuZFNOICYmICF0Lm5leHRTdGFydCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy5nZXRTdGF0ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9PT0gRiB8fCAnT0snID09PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uTWVkaWFTZWVraW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmNvbmZpZywgaSA9IHRoaXMubWVkaWEsIGUgPSB0aGlzLm1lZGlhQnVmZmVyLCBzID0gdGhpcy5zdGF0ZSwgbiA9IGkgPyBpLmN1cnJlbnRUaW1lIDogbnVsbCwgciA9ICQuYnVmZmVySW5mbyhlIHx8IGksIG4sIHRoaXMuY29uZmlnLm1heEJ1ZmZlckhvbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChhLmEpKG4pICYmIGMuYi5sb2coJ21lZGlhIHNlZWtpbmcgdG8gJyArIG4udG9GaXhlZCgzKSksIHMgPT09IG90KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB0aGlzLmZyYWdDdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSByLmxlbiAmJiBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC5tYXhGcmFnTG9va1VwVG9sZXJhbmNlLCB1ID0gaC5zdGFydCAtIG8sIGwgPSBoLnN0YXJ0ICsgaC5kdXJhdGlvbiArIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPCB1IHx8IG4gPiBsID8gKGgubG9hZGVyICYmIChjLmIubG9nKCdzZWVraW5nIG91dHNpZGUgb2YgYnVmZmVyIHdoaWxlIGZyYWdtZW50IGxvYWQgaW4gcHJvZ3Jlc3MsIGNhbmNlbCBmcmFnbWVudCBsb2FkJyksIGgubG9hZGVyLmFib3J0KCkpLCB0aGlzLmZyYWdDdXJyZW50ID0gbnVsbCwgdGhpcy5mcmFnUHJldmlvdXMgPSBudWxsLCB0aGlzLnN0YXRlID0gaHQpIDogYy5iLmxvZygnc2Vla2luZyBvdXRzaWRlIG9mIGJ1ZmZlciBidXQgd2l0aGluIGN1cnJlbnRseSBsb2FkZWQgZnJhZ21lbnQgcmFuZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRU5ERUQnID09PSBzICYmICgwID09PSByLmxlbiAmJiAodGhpcy5mcmFnUHJldmlvdXMgPSBudWxsLCB0aGlzLmZyYWdDdXJyZW50ID0gbnVsbCksIHRoaXMuc3RhdGUgPSBodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmICh0aGlzLmxhc3RDdXJyZW50VGltZSA9IG4pLCB0aGlzLmxvYWRlZG1ldGFkYXRhIHx8ICh0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb24gPSBuKSwgdGhpcy50aWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25NZWRpYUVuZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5sYXN0Q3VycmVudFRpbWUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uSGFuZGxlckRlc3Ryb3lpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BMb2FkKCksIHQucHJvdG90eXBlLm9uSGFuZGxlckRlc3Ryb3lpbmcuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkhhbmRsZXJEZXN0cm95ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gcnQsIHRoaXMuZnJhZ21lbnRUcmFja2VyID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5jb21wdXRlTGl2ZVBvc2l0aW9uID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdm9pZCAwICE9PSB0aGlzLmNvbmZpZy5saXZlU3luY0R1cmF0aW9uID8gdGhpcy5jb25maWcubGl2ZVN5bmNEdXJhdGlvbiA6IHRoaXMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb25Db3VudCAqIGkudGFyZ2V0ZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCArIE1hdGgubWF4KDAsIGkudG90YWxkdXJhdGlvbiAtIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSwgcyA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkocyA+IDEgPyBzIC0gMSA6IDApLCByID0gMTsgciA8IHM7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3IgLSAxXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHQuY2FsbC5hcHBseSh0LCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmNvbmNhdChuKSkgfHwgdGhpcykuYWkgPSB2b2lkIDAsIGUub2kgPSBudWxsLCBlLmNpID0gbnVsbCwgZS51aSA9IDAsIGUuYWkgPSBlLnRpY2suYmluZChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigndGhpcyBoYXNuXCd0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc25cJ3QgYmVlbiBjYWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LCAoaSA9IHMpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLCBpLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGksIGkuX19wcm90b19fID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ub25IYW5kbGVyRGVzdHJveWluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLmNsZWFySW50ZXJ2YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5oYXNJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuY2k7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uaGFzTmV4dFRpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLm9pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnNldEludGVydmFsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5jaSAmJiAodGhpcy5jaSA9IHNlbGYuc2V0SW50ZXJ2YWwodGhpcy5haSwgdCksICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5jbGVhckludGVydmFsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5jaSAmJiAoc2VsZi5jbGVhckludGVydmFsKHRoaXMuY2kpLCB0aGlzLmNpID0gbnVsbCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmNsZWFyTmV4dFRpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLm9pICYmIChzZWxmLmNsZWFyVGltZW91dCh0aGlzLm9pKSwgdGhpcy5vaSA9IG51bGwsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi50aWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51aSsrLCAxID09PSB0aGlzLnVpICYmICh0aGlzLmRvVGljaygpLCB0aGlzLnVpID4gMSAmJiAodGhpcy5jbGVhck5leHRUaWNrKCksIHRoaXMub2kgPSBzZWxmLnNldFRpbWVvdXQodGhpcy5haSwgMCkpLCB0aGlzLnVpID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZG9UaWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgaS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lbnVtZXJhYmxlID0gcy5lbnVtZXJhYmxlIHx8ICExLCBzLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIHMgJiYgKHMud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBzLmtleSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBlcmZvcm1hbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBndCwgeXQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSB0LmNhbGwodGhpcywgaSwgby5hLk1BTklGRVNUX0xPQURFRCwgby5hLkxFVkVMX0xPQURFRCwgby5hLkFVRElPX1RSQUNLX1NXSVRDSEVELCBvLmEuRlJBR19MT0FERUQsIG8uYS5FUlJPUikgfHwgdGhpcykuY2FubG9hZCA9ICExLCBlLmN1cnJlbnRMZXZlbEluZGV4ID0gbnVsbCwgZS5tYW51YWxMZXZlbEluZGV4ID0gLTEsIGUudGltZXIgPSBudWxsLCBndCA9IC9jaHJvbWV8ZmlyZWZveC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIsIGEgPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm9uSGFuZGxlckRlc3Ryb3lpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMubWFudWFsTGV2ZWxJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5jbGVhclRpbWVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHRoaXMudGltZXIgJiYgKGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSwgdGhpcy50aW1lciA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5zdGFydExvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmxpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FubG9hZCA9ICEwLCB0aGlzLmxldmVsUmV0cnlDb3VudCA9IDAsIHQgJiYgdC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubG9hZEVycm9yID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmRldGFpbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5saXZlICYmICh0LmRldGFpbHMgPSB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsICE9PSB0aGlzLnRpbWVyICYmIHRoaXMubG9hZExldmVsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnN0b3BMb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FubG9hZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5vbk1hbmlmZXN0TG9hZGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSA9IFtdLCBzID0gW10sIG4gPSB7fSwgciA9IG51bGwsIGEgPSAhMSwgdSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmxldmVscy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuYXR0cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxvYWRFcnJvciA9IDAsIHQuZnJhZ21lbnRFcnJvciA9ICExLCBhID0gYSB8fCAhIXQudmlkZW9Db2RlYywgdSA9IHUgfHwgISF0LmF1ZGlvQ29kZWMsIGd0ICYmIHQuYXVkaW9Db2RlYyAmJiAtMSAhPT0gdC5hdWRpb0NvZGVjLmluZGV4T2YoJ21wNGEuNDAuMzQnKSAmJiAodC5hdWRpb0NvZGVjID0gdm9pZCAwKSwgKHIgPSBuW3QuYml0cmF0ZV0pID8gci51cmwucHVzaCh0LnVybCkgOiAodC51cmwgPSBbdC51cmxdLCB0LnVybElkID0gMCwgblt0LmJpdHJhdGVdID0gdCwgZS5wdXNoKHQpKSwgaSAmJiAoaS5BVURJTyAmJiAodSA9ICEwLCBYKHIgfHwgdCwgJ2F1ZGlvJywgaS5BVURJTykpLCBpLlNVQlRJVExFUyAmJiBYKHIgfHwgdCwgJ3RleHQnLCBpLlNVQlRJVExFUykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYSAmJiB1ICYmIChlID0gZS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQudmlkZW9Db2RlYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBlID0gZS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5hdWRpb0NvZGVjLCBlID0gdC52aWRlb0NvZGVjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICghaSB8fCBqKGksICdhdWRpbycpKSAmJiAoIWUgfHwgaihlLCAndmlkZW8nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmF1ZGlvVHJhY2tzICYmIChzID0gdC5hdWRpb1RyYWNrcy5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdC5hdWRpb0NvZGVjIHx8IGoodC5hdWRpb0NvZGVjLCAnYXVkaW8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLmZvckVhY2goZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaWQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBlWzBdLmJpdHJhdGUsIGUuc29ydChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYml0cmF0ZSAtIGkuYml0cmF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMubGkgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMDsgbCA8IGUubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVtsXS5iaXRyYXRlID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaSA9IGwsIGMuYi5sb2coJ21hbmlmZXN0IGxvYWRlZCwnICsgZS5sZW5ndGggKyAnIGxldmVsKHMpIGZvdW5kLCBmaXJzdCBiaXRyYXRlOicgKyBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihvLmEuTUFOSUZFU1RfUEFSU0VELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1RyYWNrczogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0TGV2ZWw6IHRoaXMuZGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0czogdC5zdGF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRBdWRpbzogcy5zb21lKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihvLmEuRVJST1IsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGguYi5NRURJQV9FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IGguYS5NQU5JRkVTVF9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmhscy51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdubyBsZXZlbCB3aXRoIGNvbXBhdGlibGUgY29kZWNzIGZvdW5kIGluIG1hbmlmZXN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEuc2V0TGV2ZWxJbnRlcm5hbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxpLCBlID0gdGhpcy5obHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPj0gMCAmJiB0IDwgaS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJUaW1lcigpLCB0aGlzLmN1cnJlbnRMZXZlbEluZGV4ICE9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzd2l0Y2hpbmcgdG8gbGV2ZWwgJyArIHQpLCB0aGlzLmN1cnJlbnRMZXZlbEluZGV4ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubGV2ZWwgPSB0LCBlLnRyaWdnZXIoby5hLkxFVkVMX1NXSVRDSElORywgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpW3RdLCByID0gbi5kZXRhaWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIgfHwgci5saXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4udXJsSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRyaWdnZXIoby5hLkxFVkVMX0xPQURJTkcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG4udXJsW2FdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRyaWdnZXIoby5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuT1RIRVJfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBoLmEuTEVWRUxfU1dJVENIX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdpbnZhbGlkIGxldmVsIGlkeCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLm9uRXJyb3IgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmZhdGFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPT09IGguYi5ORVRXT1JLX0VSUk9SICYmIHRoaXMuY2xlYXJUaW1lcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSA9ICExLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC5kZXRhaWxzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLkZSQUdfTE9BRF9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLmEuRlJBR19MT0FEX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLktFWV9MT0FEX0VSUk9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguYS5LRVlfTE9BRF9USU1FT1VUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQuZnJhZy5sZXZlbCwgcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLkxFVkVMX0xPQURfRVJST1I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLkxFVkVMX0xPQURfVElNRU9VVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0LmNvbnRleHQubGV2ZWwsIGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguYS5SRU1VWF9BTExPQ19FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0LmxldmVsLCBlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBpICYmIHRoaXMucmVjb3ZlckxldmVsKHQsIGksIGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEucmVjb3ZlckxldmVsID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaCwgYSA9IHRoaXMsIG8gPSB0aGlzLmhscy5jb25maWcsIHUgPSB0LmRldGFpbHMsIGwgPSB0aGlzLmxpW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLmxvYWRFcnJvcisrLCBsLmZyYWdtZW50RXJyb3IgPSBzLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMubGV2ZWxSZXRyeUNvdW50ICsgMSA8PSBvLmxldmVsTG9hZGluZ01heFJldHJ5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmIuZXJyb3IoJ2xldmVsIGNvbnRyb2xsZXIsIGNhbm5vdCByZWNvdmVyIGZyb20gJyArIHUgKyAnIGVycm9yJyksIHRoaXMuY3VycmVudExldmVsSW5kZXggPSBudWxsLCB0aGlzLmNsZWFyVGltZXIoKSwgdm9pZCAodC5mYXRhbCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IE1hdGgubWluKE1hdGgucG93KDIsIHRoaXMubGV2ZWxSZXRyeUNvdW50KSAqIG8ubGV2ZWxMb2FkaW5nUmV0cnlEZWxheSwgby5sZXZlbExvYWRpbmdNYXhSZXRyeVRpbWVvdXQpLCB0aGlzLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2FkTGV2ZWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciksIHQubGV2ZWxSZXRyeSA9ICEwLCB0aGlzLmxldmVsUmV0cnlDb3VudCsrLCBjLmIud2FybignbGV2ZWwgY29udHJvbGxlciwgJyArIHUgKyAnLCByZXRyeSBpbiAnICsgciArICcgbXMsIGN1cnJlbnQgcmV0cnkgY291bnQgaXMgJyArIHRoaXMubGV2ZWxSZXRyeUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgfHwgcykgJiYgKChuID0gbC51cmwubGVuZ3RoKSA+IDEgJiYgbC5sb2FkRXJyb3IgPCBuID8gKGwudXJsSWQgPSAobC51cmxJZCArIDEpICUgbiwgbC5kZXRhaWxzID0gdm9pZCAwLCBjLmIud2FybignbGV2ZWwgY29udHJvbGxlciwgJyArIHUgKyAnIGZvciBsZXZlbCAnICsgaSArICc6IHN3aXRjaGluZyB0byByZWR1bmRhbnQgVVJMLWlkICcgKyBsLnVybElkKSkgOiAtMSA9PT0gdGhpcy5tYW51YWxMZXZlbEluZGV4ID8gKGggPSAwID09PSBpID8gdGhpcy5saS5sZW5ndGggLSAxIDogaSAtIDEsIGMuYi53YXJuKCdsZXZlbCBjb250cm9sbGVyLCAnICsgdSArICc6IHN3aXRjaCB0byAnICsgaCksIHRoaXMuaGxzLm5leHRBdXRvTGV2ZWwgPSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4ID0gaCkgOiBzICYmIChjLmIud2FybignbGV2ZWwgY29udHJvbGxlciwgJyArIHUgKyAnOiByZWxvYWQgYSBmcmFnbWVudCcpLCB0aGlzLmN1cnJlbnRMZXZlbEluZGV4ID0gbnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5vbkZyYWdMb2FkZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5mcmFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGkgJiYgJ21haW4nID09PSBpLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmxpW2kubGV2ZWxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGUgJiYgKGUuZnJhZ21lbnRFcnJvciA9ICExLCBlLmxvYWRFcnJvciA9IDAsIHRoaXMubGV2ZWxSZXRyeUNvdW50ID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5vbkxldmVsTG9hZGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIGUgPSB0LmxldmVsLCBzID0gdC5kZXRhaWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5saVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uZnJhZ21lbnRFcnJvciB8fCAobi5sb2FkRXJyb3IgPSAwLCB0aGlzLmxldmVsUmV0cnlDb3VudCA9IDApLCBzLmxpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IDEwMDAgKiAoaS5hdmVyYWdldGFyZ2V0ZHVyYXRpb24gPyBpLmF2ZXJhZ2V0YXJnZXRkdXJhdGlvbiA6IGkudGFyZ2V0ZHVyYXRpb24pLCBuID0gcyAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgaS5lbmRTTiA9PT0gdC5lbmRTTiAmJiAocyA9IG4pLCBlICYmIChzID0gTWF0aC5tYXgobiwgcyAtICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLSBlKSkpLCBNYXRoLnJvdW5kKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShuLmRldGFpbHMsIHMsIHQuc3RhdHMudHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnbGl2ZSBwbGF5bGlzdCwgcmVsb2FkIGluICcgKyBNYXRoLnJvdW5kKHIpICsgJyBtcycpLCB0aGlzLnRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubG9hZExldmVsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLm9uQXVkaW9UcmFja1N3aXRjaGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuaGxzLmF1ZGlvVHJhY2tzW3QuaWRdLmdyb3VwSWQsIGUgPSB0aGlzLmhscy5sZXZlbHNbdGhpcy5jdXJyZW50TGV2ZWxJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5hdWRpb0dyb3VwSWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAtMSwgbiA9IDA7IG4gPCBlLmF1ZGlvR3JvdXBJZHMubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hdWRpb0dyb3VwSWRzW25dID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgIT09IGUudXJsSWQgJiYgKGUudXJsSWQgPSBzLCB0aGlzLnN0YXJ0TG9hZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLmxvYWRMZXZlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5iLmRlYnVnKCdjYWxsIHRvIGxvYWRMZXZlbCcpLCBudWxsICE9PSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4ICYmIHRoaXMuY2FubG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubGlbdGhpcy5jdXJyZW50TGV2ZWxJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgdCAmJiB0LnVybC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuY3VycmVudExldmVsSW5kZXgsIGUgPSB0LnVybElkLCBzID0gdC51cmxbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdBdHRlbXB0IGxvYWRpbmcgbGV2ZWwgaW5kZXggJyArIGkgKyAnIHdpdGggVVJMLWlkICcgKyBlKSwgdGhpcy5obHMudHJpZ2dlcihvLmEuTEVWRUxfTE9BRElORywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gcywgKHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdsZXZlbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xldmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50TGV2ZWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmxpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAodCA9IE1hdGgubWluKHQsIGkubGVuZ3RoIC0gMSksIHRoaXMuY3VycmVudExldmVsSW5kZXggPT09IHQgJiYgaVt0XS5kZXRhaWxzIHx8IHRoaXMuc2V0TGV2ZWxJbnRlcm5hbCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWFudWFsTGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hbnVhbExldmVsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFudWFsTGV2ZWxJbmRleCA9IHQsIHZvaWQgMCA9PT0gdGhpcy5maSAmJiAodGhpcy5maSA9IHQpLCAtMSAhPT0gdCAmJiAodGhpcy5sZXZlbCA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZpcnN0TGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdGFydExldmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0aGlzLmZpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhscy5jb25maWcuc3RhcnRMZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0ID8gdCA6IHRoaXMuZGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbmV4dExvYWRMZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSB0aGlzLm1hbnVhbExldmVsSW5kZXggPyB0aGlzLm1hbnVhbExldmVsSW5kZXggOiB0aGlzLmhscy5uZXh0QXV0b0xldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxldmVsID0gdCwgLTEgPT09IHRoaXMubWFudWFsTGV2ZWxJbmRleCAmJiAodGhpcy5obHMubmV4dEF1dG9MZXZlbCA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgJiYgbXQobi5wcm90b3R5cGUsIHIpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpLCB3dCA9IGUoNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gT3QodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgRXZlbnQoJ2FkZHRyYWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50JykpLmluaXRFdmVudCgnYWRkdHJhY2snLCAhMSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHJhY2sgPSB0LCBpLmRpc3BhdGNoRXZlbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4dCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHQuY2FsbCh0aGlzLCBpLCBvLmEuTUVESUFfQVRUQUNIRUQsIG8uYS5NRURJQV9ERVRBQ0hJTkcsIG8uYS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIG8uYS5MSVZFX0JBQ0tfQlVGRkVSX1JFQUNIRUQpIHx8IHRoaXMpLmlkM1RyYWNrID0gdm9pZCAwLCBlLm1lZGlhID0gdm9pZCAwLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbk1lZGlhQXR0YWNoZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCB0aGlzLm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbk1lZGlhRGV0YWNoaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0LmN1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdC5jdWVzLmxlbmd0aCA+IDA7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlQ3VlKHQuY3Vlc1swXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLmlkM1RyYWNrKSwgdGhpcy5pZDNUcmFjayA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZ2V0SUQzVHJhY2sgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbWV0YWRhdGEnID09PSBlLmtpbmQgJiYgJ2lkMycgPT09IGUubGFiZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3QoZSwgdGhpcy5tZWRpYSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhLmFkZFRleHRUcmFjaygnbWV0YWRhdGEnLCAnaWQzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uRnJhZ1BhcnNpbmdNZXRhZGF0YSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmZyYWcsIGUgPSB0LnNhbXBsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZDNUcmFjayB8fCAodGhpcy5pZDNUcmFjayA9IHRoaXMuZ2V0SUQzVHJhY2sodGhpcy5tZWRpYS50ZXh0VHJhY2tzKSwgdGhpcy5pZDNUcmFjay5tb2RlID0gJ2hpZGRlbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSB0aGlzLmhscy5jb25maWcuY254UmVuZGVyV2luZG93LldlYktpdERhdGFDdWUgfHwgaGlzLmhscy5jb25maWcuY254UmVuZGVyV2luZG93LlZUVEN1ZSB8fCBoaXMuaGxzLmNvbmZpZy5jbnhSZW5kZXJXaW5kb3cuVGV4dFRyYWNrQ3VlLCBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB3dC5hLmdldElEM0ZyYW1lcyhlW25dLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBlW25dLnB0cywgYSA9IG4gPCBlLmxlbmd0aCAtIDEgPyBlW24gKyAxXS5wdHMgOiBpLmVuZFBUUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPT09IGEgPyBhICs9IDAuMDAwMSA6IGggPiBhICYmIChjLmIud2FybignZGV0ZWN0ZWQgYW4gaWQzIHNhbXBsZSB3aXRoIGVuZFRpbWUgPCBzdGFydFRpbWUsIGFkanVzdGluZyBlbmRUaW1lIHRvIChzdGFydFRpbWUgKyAwLjI1KScpLCBhID0gaCArIDAuMjUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSByW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3QuYS5pc1RpbWVTdGFtcEZyYW1lKHUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gbmV3IHMoaCwgYSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnZhbHVlID0gdSwgdGhpcy5pZDNUcmFjay5hZGRDdWUobCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkxpdmVCYWNrQnVmZmVyUmVhY2hlZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmJ1ZmZlckVuZCwgZSA9IHRoaXMuaWQzVHJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5jdWVzICYmIGUuY3Vlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0WzBdLmVuZFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IHRbdC5sZW5ndGggLSAxXS5lbmRUaW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3QubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgcyA9IHQubGVuZ3RoIC0gMTsgZSA8PSBzOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTWF0aC5mbG9vcigocyArIGUpIC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCB0W25dLmVuZFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBuIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaSA+IHRbbl0uZW5kVGltZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG4gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdLmVuZFRpbWUgLSBpIDwgaSAtIHRbc10uZW5kVGltZSA/IHRbZV0gOiB0W3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUuY3VlcywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGUuY3Vlc1swXSAhPT0gczspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW1vdmVDdWUoZS5jdWVzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpLCBTdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxwaGFfID0gdm9pZCAwLCB0aGlzLmVzdGltYXRlXyA9IHZvaWQgMCwgdGhpcy50b3RhbFdlaWdodF8gPSB2b2lkIDAsIHRoaXMuYWxwaGFfID0gdCA/IE1hdGguZXhwKE1hdGgubG9nKDAuNSkgLyB0KSA6IDAsIHRoaXMuZXN0aW1hdGVfID0gMCwgdGhpcy50b3RhbFdlaWdodF8gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnNhbXBsZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBNYXRoLnBvdyh0aGlzLmFscGhhXywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3RpbWF0ZV8gPSBpICogKDEgLSBlKSArIGUgKiB0aGlzLmVzdGltYXRlXywgdGhpcy50b3RhbFdlaWdodF8gKz0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZ2V0VG90YWxXZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxXZWlnaHRfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5nZXRFc3RpbWF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHBoYV8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAxIC0gTWF0aC5wb3codGhpcy5hbHBoYV8sIHRoaXMudG90YWxXZWlnaHRfKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVfIC8gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXN0aW1hdGVfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBqdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmRlZmF1bHRFc3RpbWF0ZV8gPSB2b2lkIDAsIHRoaXMubWluV2VpZ2h0XyA9IHZvaWQgMCwgdGhpcy5taW5EZWxheU1zXyA9IHZvaWQgMCwgdGhpcy5zbG93XyA9IHZvaWQgMCwgdGhpcy5mYXN0XyA9IHZvaWQgMCwgdGhpcy5obHMgPSB0LCB0aGlzLmRlZmF1bHRFc3RpbWF0ZV8gPSBzLCB0aGlzLm1pbldlaWdodF8gPSAwLjAwMSwgdGhpcy5taW5EZWxheU1zXyA9IDUwLCB0aGlzLnNsb3dfID0gbmV3IFN0KGkpLCB0aGlzLmZhc3RfID0gbmV3IFN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnNhbXBsZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAodCA9IE1hdGgubWF4KHQsIHRoaXMubWluRGVsYXlNc18pKSAvIDEwMDAsIHMgPSA4ICogaSAvIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mYXN0Xy5zYW1wbGUoZSwgcyksIHRoaXMuc2xvd18uc2FtcGxlKGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5jYW5Fc3RpbWF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuZmFzdF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgdC5nZXRUb3RhbFdlaWdodCgpID49IHRoaXMubWluV2VpZ2h0XzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZ2V0RXN0aW1hdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2FuRXN0aW1hdGUoKSA/IE1hdGgubWluKHRoaXMuZmFzdF8uZ2V0RXN0aW1hdGUoKSwgdGhpcy5zbG93Xy5nZXRFc3RpbWF0ZSgpKSA6IHRoaXMuZGVmYXVsdEVzdGltYXRlXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgaS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lbnVtZXJhYmxlID0gcy5lbnVtZXJhYmxlIHx8ICExLCBzLmNvbmZpZ3VyYWJsZSA9ICEwLCAndmFsdWUnIGluIHMgJiYgKHMud3JpdGFibGUgPSAhMCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBzLmtleSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF90ID0gd2luZG93LnBlcmZvcm1hbmNlLCBBdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHQuY2FsbCh0aGlzLCBpLCBvLmEuRlJBR19MT0FESU5HLCBvLmEuRlJBR19MT0FERUQsIG8uYS5GUkFHX0JVRkZFUkVELCBvLmEuRVJST1IpIHx8IHRoaXMpLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSAwLCBlLnBpID0gLTEsIGUuaGxzID0gaSwgZS50aW1lciA9IG51bGwsIGUuYndFc3RpbWF0b3IgPSBudWxsLCBlLm9uQ2hlY2sgPSBlLmJpLmJpbmQoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigndGhpcyBoYXNuXCd0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc25cJ3QgYmVlbiBjYWxsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdCwgKGkgPSBzKS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSwgaS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpLCBpLl9fcHJvdG9fXyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgdSA9IHMucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyVGltZXIoKSwgbC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5vbkZyYWdMb2FkaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21haW4nID09PSBpLnR5cGUgJiYgKHRoaXMudGltZXIgfHwgKHRoaXMuZnJhZ0N1cnJlbnQgPSBpLCB0aGlzLnRpbWVyID0gc2V0SW50ZXJ2YWwodGhpcy5vbkNoZWNrLCAxMDApKSwgIXRoaXMuYndFc3RpbWF0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCBuID0gdGhpcy5obHMsIHIgPSBuLmNvbmZpZywgaCA9IGkubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubGV2ZWxzW2hdLmRldGFpbHMubGl2ZSA/IChlID0gci5hYnJFd21hRmFzdExpdmUsIHMgPSByLmFickV3bWFTbG93TGl2ZSkgOiAoZSA9IHIuYWJyRXdtYUZhc3RWb0QsIHMgPSByLmFickV3bWFTbG93Vm9EKSwgdGhpcy5id0VzdGltYXRvciA9IG5ldyBqdChuLCBzLCBlLCByLmFickV3bWFEZWZhdWx0RXN0aW1hdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUuYmkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhscywgaSA9IHQubWVkaWEsIGUgPSB0aGlzLmZyYWdDdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZS5sb2FkZXIsIG4gPSB0Lm1pbkF1dG9MZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzIHx8IHMuc3RhdHMgJiYgcy5zdGF0cy5hYm9ydGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYi53YXJuKCdmcmFnIGxvYWRlciBkZXN0cm95IG9yIGFib3J0ZWQsIGRpc2FybSBhYmFuZG9uUnVsZXMnKSwgdGhpcy5jbGVhclRpbWVyKCksIHZvaWQgKHRoaXMucGkgPSAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcy5zdGF0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgciAmJiAoIWkucGF1c2VkICYmIDAgIT09IGkucGxheWJhY2tSYXRlIHx8ICFpLnJlYWR5U3RhdGUpICYmIGUuYXV0b0xldmVsICYmIGUubGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gX3Qubm93KCkgLSByLnRyZXF1ZXN0LCBhID0gTWF0aC5hYnMoaS5wbGF5YmFja1JhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPiA1MDAgKiBlLmR1cmF0aW9uIC8gYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gdC5sZXZlbHMsIGwgPSBNYXRoLm1heCgxLCByLmJ3ID8gci5idyAvIDggOiAxMDAwICogci5sb2FkZWQgLyBoKSwgZCA9IHVbZS5sZXZlbF0sIGYgPSBkLnJlYWxCaXRyYXRlID8gTWF0aC5tYXgoZC5yZWFsQml0cmF0ZSwgZC5iaXRyYXRlKSA6IGQuYml0cmF0ZSwgcCA9IHIudG90YWwgPyByLnRvdGFsIDogTWF0aC5tYXgoci5sb2FkZWQsIE1hdGgucm91bmQoZS5kdXJhdGlvbiAqIGYgLyA4KSksIGIgPSBpLmN1cnJlbnRUaW1lLCB2ID0gKHAgLSByLmxvYWRlZCkgLyBsLCBtID0gKCQuYnVmZmVySW5mbyhpLCBiLCB0LmNvbmZpZy5tYXhCdWZmZXJIb2xlKS5lbmQgLSBiKSAvIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPCAyICogZS5kdXJhdGlvbiAvIGEgJiYgdiA+IG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZyA9IGUubGV2ZWwgLSAxOyBnID4gbjsgZy0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IHVbZ10ucmVhbEJpdHJhdGUgPyBNYXRoLm1heCh1W2ddLnJlYWxCaXRyYXRlLCB1W2ddLmJpdHJhdGUpIDogdVtnXS5iaXRyYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZHVyYXRpb24gKiB5IC8gKDYuNCAqIGwpIDwgbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPCB2ICYmIChjLmIud2FybignbG9hZGluZyB0b28gc2xvdywgYWJvcnQgZnJhZ21lbnQgbG9hZGluZyBhbmQgc3dpdGNoIHRvIGxldmVsICcgKyBnICsgJzpmcmFnTG9hZGVkRGVsYXlbJyArIGcgKyAnXTxmcmFnTG9hZGVkRGVsYXlbJyArIChlLmxldmVsIC0gMSkgKyAnXTtidWZmZXJTdGFydmF0aW9uRGVsYXk6JyArICh2b2lkIDApLnRvRml4ZWQoMSkgKyAnPCcgKyB2LnRvRml4ZWQoMSkgKyAnOicgKyBtLnRvRml4ZWQoMSkpLCB0Lm5leHRMb2FkTGV2ZWwgPSBnLCB0aGlzLmJ3RXN0aW1hdG9yLnNhbXBsZShoLCByLmxvYWRlZCksIHMuYWJvcnQoKSwgdGhpcy5jbGVhclRpbWVyKCksIHQudHJpZ2dlcihvLmEuRlJBR19MT0FEX0VNRVJHRU5DWV9BQk9SVEVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUub25GcmFnTG9hZGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21haW4nID09PSBpLnR5cGUgJiYgT2JqZWN0KGEuYSkoaS5zbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJUaW1lcigpLCB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSBpLmxldmVsLCB0aGlzLnBpID0gLTEsIHRoaXMuaGxzLmNvbmZpZy5hYnJNYXhXaXRoUmVhbEJpdHJhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5obHMubGV2ZWxzW2kubGV2ZWxdLCBzID0gKGUubG9hZGVkID8gZS5sb2FkZWQuYnl0ZXMgOiAwKSArIHQuc3RhdHMubG9hZGVkLCBuID0gKGUubG9hZGVkID8gZS5sb2FkZWQuZHVyYXRpb24gOiAwKSArIHQuZnJhZy5kdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubG9hZGVkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnJlYWxCaXRyYXRlID0gTWF0aC5yb3VuZCg4ICogcyAvIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmZyYWcuYml0cmF0ZVRlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5zdGF0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudHBhcnNlZCA9IHIudGJ1ZmZlcmVkID0gci50bG9hZCwgdGhpcy5vbkZyYWdCdWZmZXJlZCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHUub25GcmFnQnVmZmVyZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5zdGF0cywgZSA9IHQuZnJhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITAgIT09IGkuYWJvcnRlZCAmJiAnbWFpbicgPT09IGUudHlwZSAmJiBPYmplY3QoYS5hKShlLnNuKSAmJiAoIWUuYml0cmF0ZVRlc3QgfHwgaS50bG9hZCA9PT0gaS50YnVmZmVyZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaS50cGFyc2VkIC0gaS50cmVxdWVzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnbGF0ZW5jeS9sb2FkaW5nL3BhcnNpbmcvYXBwZW5kL2ticHM6JyArIE1hdGgucm91bmQoaS50Zmlyc3QgLSBpLnRyZXF1ZXN0KSArICcvJyArIE1hdGgucm91bmQoaS50bG9hZCAtIGkudGZpcnN0KSArICcvJyArIE1hdGgucm91bmQoaS50cGFyc2VkIC0gaS50bG9hZCkgKyAnLycgKyBNYXRoLnJvdW5kKGkudGJ1ZmZlcmVkIC0gaS50cGFyc2VkKSArICcvJyArIE1hdGgucm91bmQoOCAqIGkubG9hZGVkIC8gKGkudGJ1ZmZlcmVkIC0gaS50cmVxdWVzdCkpKSwgdGhpcy5id0VzdGltYXRvci5zYW1wbGUocywgaS5sb2FkZWQpLCBpLmJ3RXN0aW1hdGUgPSB0aGlzLmJ3RXN0aW1hdG9yLmdldEVzdGltYXRlKCksIGUuYml0cmF0ZVRlc3QgPyB0aGlzLmJpdHJhdGVUZXN0RGVsYXkgPSBzIC8gMTAwMCA6IHRoaXMuYml0cmF0ZVRlc3REZWxheSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5vbkVycm9yID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuZGV0YWlscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5hLkZSQUdfTE9BRF9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguYS5GUkFHX0xPQURfVElNRU9VVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclRpbWVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5jbGVhclRpbWVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS52aSA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCBuLCByLCBoLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdSA9IG47IHUgPj0gczsgdS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gb1t1XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbC5kZXRhaWxzLCBmID0gZCA/IGQudG90YWxkdXJhdGlvbiAvIGQuZnJhZ21lbnRzLmxlbmd0aCA6IGksIHAgPSAhIWQgJiYgZC5saXZlLCBiID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHUgPD0gdCA/IGggKiBlIDogYSAqIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IG9bdV0ucmVhbEJpdHJhdGUgPyBNYXRoLm1heChvW3VdLnJlYWxCaXRyYXRlLCBvW3VdLmJpdHJhdGUpIDogb1t1XS5iaXRyYXRlLCBtID0gdiAqIGYgLyBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuYi50cmFjZSgnbGV2ZWwvYWRqdXN0ZWRidy9iaXRyYXRlL2F2Z0R1cmF0aW9uL21heEZldGNoRHVyYXRpb24vZmV0Y2hEdXJhdGlvbjogJyArIHUgKyAnLycgKyBNYXRoLnJvdW5kKGIpICsgJy8nICsgdiArICcvJyArIGYgKyAnLycgKyByICsgJy8nICsgbSksIGIgPiB2ICYmICghbSB8fCBwICYmICF0aGlzLmJpdHJhdGVUZXN0RGVsYXkgfHwgbSA8IHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBzLCAociA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ25leHRBdXRvTGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5waSwgaSA9IHRoaXMuYndFc3RpbWF0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgtMSA9PT0gdCB8fCBpICYmIGkuY2FuRXN0aW1hdGUoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMubmV4dEFCUkF1dG9MZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gdCAmJiAoZSA9IE1hdGgubWluKHQsIGUpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbmV4dEFCUkF1dG9MZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhscywgaSA9IHQubWF4QXV0b0xldmVsLCBlID0gdC5sZXZlbHMsIHMgPSB0LmNvbmZpZywgbiA9IHQubWluQXV0b0xldmVsLCByID0gdC5tZWRpYSwgaCA9IHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCwgYSA9IHRoaXMuZnJhZ0N1cnJlbnQgPyB0aGlzLmZyYWdDdXJyZW50LmR1cmF0aW9uIDogMCwgbyA9IHIgPyByLmN1cnJlbnRUaW1lIDogMCwgdSA9IHIgJiYgMCAhPT0gci5wbGF5YmFja1JhdGUgPyBNYXRoLmFicyhyLnBsYXliYWNrUmF0ZSkgOiAxLCBsID0gdGhpcy5id0VzdGltYXRvciA/IHRoaXMuYndFc3RpbWF0b3IuZ2V0RXN0aW1hdGUoKSA6IHMuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSwgZCA9ICgkLmJ1ZmZlckluZm8ociwgbywgcy5tYXhCdWZmZXJIb2xlKS5lbmQgLSBvKSAvIHUsIGYgPSB0aGlzLnZpKGgsIGEsIGwsIG4sIGksIGQsIHMuYWJyQmFuZFdpZHRoRmFjdG9yLCBzLmFickJhbmRXaWR0aFVwRmFjdG9yLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID49IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIudHJhY2UoJ3JlYnVmZmVyaW5nIGV4cGVjdGVkIHRvIGhhcHBlbiwgbGV0cyB0cnkgdG8gZmluZCBhIHF1YWxpdHkgbGV2ZWwgbWluaW1pemluZyB0aGUgcmVidWZmZXJpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gYSA/IE1hdGgubWluKGEsIHMubWF4U3RhcnZhdGlvbkRlbGF5KSA6IHMubWF4U3RhcnZhdGlvbkRlbGF5LCBiID0gcy5hYnJCYW5kV2lkdGhGYWN0b3IsIHYgPSBzLmFickJhbmRXaWR0aFVwRmFjdG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHRoaXMuYml0cmF0ZVRlc3REZWxheTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtICYmIChwID0gKGEgPyBNYXRoLm1pbihhLCBzLm1heExvYWRpbmdEZWxheSkgOiBzLm1heExvYWRpbmdEZWxheSkgLSBtLCBjLmIudHJhY2UoJ2JpdHJhdGUgdGVzdCB0b29rICcgKyBNYXRoLnJvdW5kKDEwMDAgKiBtKSArICdtcywgc2V0IGZpcnN0IGZyYWdtZW50IG1heCBmZXRjaER1cmF0aW9uIHRvICcgKyBNYXRoLnJvdW5kKDEwMDAgKiBwKSArICcgbXMnKSwgYiA9IHYgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gdGhpcy52aShoLCBhLCBsLCBuLCBpLCBkICsgcCwgYiwgdiwgZSksIE1hdGgubWF4KGYsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgJiYga3Qobi5wcm90b3R5cGUsIHIpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpLCBJdCA9IHooKSwgQ3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPSB0LmNhbGwodGhpcywgaSwgby5hLk1FRElBX0FUVEFDSElORywgby5hLk1FRElBX0RFVEFDSElORywgby5hLk1BTklGRVNUX1BBUlNFRCwgby5hLkJVRkZFUl9SRVNFVCwgby5hLkJVRkZFUl9BUFBFTkRJTkcsIG8uYS5CVUZGRVJfQ09ERUNTLCBvLmEuQlVGRkVSX0VPUywgby5hLkJVRkZFUl9GTFVTSElORywgby5hLkxFVkVMX1BUU19VUERBVEVELCBvLmEuTEVWRUxfVVBEQVRFRCkgfHwgdGhpcykubWkgPSBudWxsLCBlLmdpID0gbnVsbCwgZS55aSA9IDEwLCBlLndpID0gbnVsbCwgZS5PaSA9IG51bGwsIGUueGkgPSAhMSwgZS5TaSA9ICExLCBlLmNvbmZpZyA9IHZvaWQgMCwgZS5hdWRpb1RpbWVzdGFtcE9mZnNldCA9IHZvaWQgMCwgZS5idWZmZXJDb2RlY0V2ZW50c0V4cGVjdGVkID0gMCwgZS5qaSA9IDAsIGUubWVkaWEgPSBudWxsLCBlLm1lZGlhU291cmNlID0gbnVsbCwgZS5zZWdtZW50cyA9IFtdLCBlLnBhcmVudCA9IHZvaWQgMCwgZS5hcHBlbmRpbmcgPSAhMSwgZS5hcHBlbmRlZCA9IDAsIGUuYXBwZW5kRXJyb3IgPSAwLCBlLmZsdXNoQnVmZmVyQ291bnRlciA9IDAsIGUudHJhY2tzID0ge30sIGUucGVuZGluZ1RyYWNrcyA9IHt9LCBlLnNvdXJjZUJ1ZmZlciA9IHt9LCBlLmZsdXNoUmFuZ2UgPSBbXSwgZS5raSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnbWVkaWEgc291cmNlIG9wZW5lZCcpLCBlLmhscy50cmlnZ2VyKG8uYS5NRURJQV9BVFRBQ0hFRCwgeyBtZWRpYTogZS5tZWRpYSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm1lZGlhU291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIGUua2kpLCBlLmNoZWNrUGVuZGluZ1RyYWNrcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuX2kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ21lZGlhIHNvdXJjZSBjbG9zZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLkFpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdtZWRpYSBzb3VyY2UgZW5kZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLklpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hdWRpb1RpbWVzdGFtcE9mZnNldCAmJiBlLnNvdXJjZUJ1ZmZlci5hdWRpbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNvdXJjZUJ1ZmZlci5hdWRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdjaGFuZ2UgbXBlZyBhdWRpbyB0aW1lc3RhbXAgb2Zmc2V0IGZyb20gJyArIHQudGltZXN0YW1wT2Zmc2V0ICsgJyB0byAnICsgZS5hdWRpb1RpbWVzdGFtcE9mZnNldCksIHQudGltZXN0YW1wT2Zmc2V0ID0gZS5hdWRpb1RpbWVzdGFtcE9mZnNldCwgZGVsZXRlIGUuYXVkaW9UaW1lc3RhbXBPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS54aSAmJiBlLmRvRmx1c2goKSwgZS5TaSAmJiBlLmNoZWNrRW9zKCksIGUuYXBwZW5kaW5nID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5wYXJlbnQsIHMgPSBlLnNlZ21lbnRzLnJlZHVjZShmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmVudCA9PT0gaSA/IHQgKyAxIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApLCBuID0ge30sIHIgPSBlLnNvdXJjZUJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHJbaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2hhbmRsaW5nIHNvdXJjZSBidWZmZXIgdXBkYXRlIGVuZCBlcnJvcjogc291cmNlIGJ1ZmZlciBmb3IgJyArIGggKyAnIHVuaW5pdGlsaXplZCBhbmQgdW5hYmxlIHRvIHVwZGF0ZSBidWZmZXJlZCBUaW1lUmFuZ2VzLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltoXSA9IGEuYnVmZmVyZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5obHMudHJpZ2dlcihvLmEuQlVGRkVSX0FQUEVOREVELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVJhbmdlczogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS54aSB8fCBlLmRvQXBwZW5kaW5nKCksIGUudXBkYXRlTWVkaWFFbGVtZW50RHVyYXRpb24oKSwgMCA9PT0gcyAmJiBlLmZsdXNoTGl2ZUJhY2tCdWZmZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLkNpID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmVycm9yKCdzb3VyY2VCdWZmZXIgZXJyb3I6JywgdCksIGUuaGxzLnRyaWdnZXIoby5hLkVSUk9SLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiBoLmEuQlVGRkVSX0FQUEVORElOR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdGFsOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmNvbmZpZyA9IGkuY29uZmlnLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkxldmVsUHRzVXBkYXRlZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnR5cGUsIGUgPSB0aGlzLnRyYWNrcy5hdWRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2F1ZGlvJyA9PT0gaSAmJiBlICYmICdhdWRpby9tcGVnJyA9PT0gZS5jb250YWluZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnNvdXJjZUJ1ZmZlci5hdWRpbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0xldmVsIFBUUyBVcGRhdGVkIGFuZCBzb3VyY2UgYnVmZmVyIGZvciBhdWRpbyB1bmluaXRhbGl6ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHMudGltZXN0YW1wT2Zmc2V0IC0gdC5zdGFydCkgPiAwLjEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy51cGRhdGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hYm9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdjYW4gbm90IGFib3J0IGF1ZGlvIGJ1ZmZlcjogJyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA/IHRoaXMuYXVkaW9UaW1lc3RhbXBPZmZzZXQgPSB0LnN0YXJ0IDogKGMuYi53YXJuKCdjaGFuZ2UgbXBlZyBhdWRpbyB0aW1lc3RhbXAgb2Zmc2V0IGZyb20gJyArIHMudGltZXN0YW1wT2Zmc2V0ICsgJyB0byAnICsgdC5zdGFydCksIHMudGltZXN0YW1wT2Zmc2V0ID0gdC5zdGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uTWFuaWZlc3RQYXJzZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyQ29kZWNFdmVudHNFeHBlY3RlZCA9IHRoaXMuamkgPSB0LmFsdEF1ZGlvID8gMiA6IDEsIGMuYi5sb2codGhpcy5idWZmZXJDb2RlY0V2ZW50c0V4cGVjdGVkICsgJyBidWZmZXJDb2RlYyBldmVudChzKSBleHBlY3RlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbk1lZGlhQXR0YWNoaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMubWVkaWEgPSB0Lm1lZGlhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmIEl0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5tZWRpYVNvdXJjZSA9IG5ldyBJdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIoJ3NvdXJjZW9wZW4nLCB0aGlzLmtpKSwgZS5hZGRFdmVudExpc3RlbmVyKCdzb3VyY2VlbmRlZCcsIHRoaXMuQWkpLCBlLmFkZEV2ZW50TGlzdGVuZXIoJ3NvdXJjZWNsb3NlJywgdGhpcy5faSksIGkuc3JjID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZSksIHRoaXMuT2kgPSBpLnNyYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uTWVkaWFEZXRhY2hpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnbWVkaWEgc291cmNlIGRldGFjaGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5tZWRpYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29wZW4nID09PSB0LnJlYWR5U3RhdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZW5kT2ZTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIud2Fybignb25NZWRpYURldGFjaGluZzonICsgdC5tZXNzYWdlICsgJyB3aGlsZSBjYWxsaW5nIGVuZE9mU3RyZWFtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlb3BlbicsIHRoaXMua2kpLCB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NvdXJjZWVuZGVkJywgdGhpcy5BaSksIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc291cmNlY2xvc2UnLCB0aGlzLl9pKSwgdGhpcy5tZWRpYSAmJiAodGhpcy5PaSAmJiB0aGlzLmhscy5jb25maWcuY254UmVuZGVyV2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5PaSksIHRoaXMubWVkaWEuc3JjID09PSB0aGlzLk9pID8gKHRoaXMubWVkaWEucmVtb3ZlQXR0cmlidXRlKCdzcmMnKSwgdGhpcy5tZWRpYS5sb2FkKCkpIDogYy5iLndhcm4oJ21lZGlhLnNyYyB3YXMgY2hhbmdlZCBieSBhIHRoaXJkIHBhcnR5IC0gc2tpcCBjbGVhbnVwJykpLCB0aGlzLm1lZGlhU291cmNlID0gbnVsbCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuT2kgPSBudWxsLCB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzRXhwZWN0ZWQgPSB0aGlzLmppLCB0aGlzLnBlbmRpbmdUcmFja3MgPSB7fSwgdGhpcy50cmFja3MgPSB7fSwgdGhpcy5zb3VyY2VCdWZmZXIgPSB7fSwgdGhpcy5mbHVzaFJhbmdlID0gW10sIHRoaXMuc2VnbWVudHMgPSBbXSwgdGhpcy5hcHBlbmRlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoby5hLk1FRElBX0RFVEFDSEVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uY2hlY2tQZW5kaW5nVHJhY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5idWZmZXJDb2RlY0V2ZW50c0V4cGVjdGVkLCBpID0gdGhpcy5wZW5kaW5nVHJhY2tzLCBlID0gT2JqZWN0LmtleXMoaSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlICYmICF0IHx8IDIgPT09IGUpICYmICh0aGlzLmNyZWF0ZVNvdXJjZUJ1ZmZlcnMoaSksIHRoaXMucGVuZGluZ1RyYWNrcyA9IHt9LCB0aGlzLmRvQXBwZW5kaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vbkJ1ZmZlclJlc2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5zb3VyY2VCdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKHRoaXMubWVkaWFTb3VyY2UgJiYgdGhpcy5tZWRpYVNvdXJjZS5yZW1vdmVTb3VyY2VCdWZmZXIoZSksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndXBkYXRlZW5kJywgdGhpcy5JaSksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0aGlzLkNpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlciA9IHt9LCB0aGlzLmZsdXNoUmFuZ2UgPSBbXSwgdGhpcy5zZWdtZW50cyA9IFtdLCB0aGlzLmFwcGVuZGVkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25CdWZmZXJDb2RlY3MgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUJ1ZmZlcikubGVuZ3RoIHx8IChPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGVuZGluZ1RyYWNrc1tlXSA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYnVmZmVyQ29kZWNFdmVudHNFeHBlY3RlZCA9IE1hdGgubWF4KHRoaXMuYnVmZmVyQ29kZWNFdmVudHNFeHBlY3RlZCAtIDEsIDApLCB0aGlzLm1lZGlhU291cmNlICYmICdvcGVuJyA9PT0gdGhpcy5tZWRpYVNvdXJjZS5yZWFkeVN0YXRlICYmIHRoaXMuY2hlY2tQZW5kaW5nVHJhY2tzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5jcmVhdGVTb3VyY2VCdWZmZXJzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuc291cmNlQnVmZmVyLCBlID0gdGhpcy5tZWRpYVNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdjcmVhdGVTb3VyY2VCdWZmZXJzIGNhbGxlZCB3aGVuIG1lZGlhU291cmNlIHdhcyBudWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlbc10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignc291cmNlIGJ1ZmZlciBleGlzdHMgZm9yIHRyYWNrICcgKyBzICsgJywgaG93ZXZlciB0cmFjayBkb2VzIG5vdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLmxldmVsQ29kZWMgfHwgbi5jb2RlYywgYSA9IG4uY29udGFpbmVyICsgJztjb2RlY3M9JyArIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdjcmVhdGluZyBzb3VyY2VCdWZmZXIoJyArIGEgKyAnKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGlbc10gPSBlLmFkZFNvdXJjZUJ1ZmZlcihhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmFkZEV2ZW50TGlzdGVuZXIoJ3VwZGF0ZWVuZCcsIHRoaXMuSWkpLCB1LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5DaSksIHRoaXMudHJhY2tzW3NdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBuLmNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxDb2RlYzogbi5sZXZlbENvZGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBhZGQgc291cmNlQnVmZmVyOicgKyB0Lm1lc3NhZ2UpLCB0aGlzLmhscy50cmlnZ2VyKG8uYS5FUlJPUiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLmIuTUVESUFfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6IGguYS5CVUZGRVJfQUREX0NPREVDX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGU6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoby5hLkJVRkZFUl9DUkVBVEVELCB7IHRyYWNrczogdGhpcy50cmFja3MgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uQnVmZmVyQXBwZW5kaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhpIHx8ICh0aGlzLnNlZ21lbnRzID8gdGhpcy5zZWdtZW50cy5wdXNoKHQpIDogdGhpcy5zZWdtZW50cyA9IFt0XSwgdGhpcy5kb0FwcGVuZGluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25CdWZmZXJFb3MgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5zb3VyY2VCdWZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC50eXBlIHx8IHQudHlwZSA9PT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnNvdXJjZUJ1ZmZlcltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgIWUuZW5kZWQgJiYgKGUuZW5kZWQgPSAhMCwgYy5iLmxvZyhpICsgJyBzb3VyY2VCdWZmZXIgbm93IEVPUycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tFb3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uY2hlY2tFb3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnNvdXJjZUJ1ZmZlciwgaSA9IHRoaXMubWVkaWFTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgJ29wZW4nID09PSBpLnJlYWR5U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy5lbmRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnVwZGF0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAodGhpcy5TaSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdhbGwgbWVkaWEgZGF0YSBhcmUgYXZhaWxhYmxlLCBzaWduYWwgZW5kT2ZTdHJlYW0oKSB0byBNZWRpYVNvdXJjZSBhbmQgc3RvcCBsb2FkaW5nIGZyYWdtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmVuZE9mU3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdleGNlcHRpb24gd2hpbGUgY2FsbGluZyBtZWRpYVNvdXJjZS5lbmRPZlN0cmVhbSgpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TaSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNpID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uQnVmZmVyRmx1c2hpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHlwZSA/IHRoaXMuZmx1c2hSYW5nZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHQuc3RhcnRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdC5lbmRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHQudHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHRoaXMuZmx1c2hSYW5nZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHQuc3RhcnRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZDogdC5lbmRPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5mbHVzaFJhbmdlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogdC5zdGFydE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB0LmVuZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2F1ZGlvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5mbHVzaEJ1ZmZlckNvdW50ZXIgPSAwLCB0aGlzLmRvRmx1c2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZmx1c2hMaXZlQmFja0J1ZmZlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53aSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuY29uZmlnLmxpdmVCYWNrQnVmZmVyTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGaW5pdGUodCkgJiYgISh0IDwgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWRpYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5tZWRpYS5jdXJyZW50VGltZSwgZSA9IHRoaXMuc291cmNlQnVmZmVyLCBzID0gT2JqZWN0LmtleXMoZSksIG4gPSBpIC0gTWF0aC5tYXgodCwgdGhpcy55aSksIHIgPSBzLmxlbmd0aCAtIDE7IHIgPj0gMDsgci0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gc1tyXSwgYSA9IGVbaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGEuYnVmZmVyZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Lmxlbmd0aCA+IDAgJiYgbiA+IHUuc3RhcnQoMCkgJiYgdGhpcy5yZW1vdmVCdWZmZXJSYW5nZShoLCBhLCAwLCBuKSAmJiB0aGlzLmhscy50cmlnZ2VyKG8uYS5MSVZFX0JBQ0tfQlVGRkVSX1JFQUNIRUQsIHsgYnVmZmVyRW5kOiBuIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5lcnJvcignZmx1c2hMaXZlQmFja0J1ZmZlciBjYWxsZWQgd2l0aG91dCBhdHRhY2hpbmcgbWVkaWEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uTGV2ZWxVcGRhdGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZGV0YWlsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmZyYWdtZW50cy5sZW5ndGggPiAwICYmICh0aGlzLmdpID0gaS50b3RhbGR1cmF0aW9uICsgaS5mcmFnbWVudHNbMF0uc3RhcnQsIHRoaXMueWkgPSBpLmF2ZXJhZ2V0YXJnZXRkdXJhdGlvbiB8fCBpLnRhcmdldGR1cmF0aW9uIHx8IDEwLCB0aGlzLndpID0gaS5saXZlLCB0aGlzLnVwZGF0ZU1lZGlhRWxlbWVudER1cmF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi51cGRhdGVNZWRpYUVsZW1lbnREdXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaSA9IHRoaXMuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSB0aGlzLmdpICYmIHRoaXMubWVkaWEgJiYgdGhpcy5tZWRpYVNvdXJjZSAmJiB0aGlzLnNvdXJjZUJ1ZmZlciAmJiAwICE9PSB0aGlzLm1lZGlhLnJlYWR5U3RhdGUgJiYgJ29wZW4nID09PSB0aGlzLm1lZGlhU291cmNlLnJlYWR5U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiB0aGlzLnNvdXJjZUJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnNvdXJjZUJ1ZmZlcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICYmICEwID09PSBzLnVwZGF0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdGhpcy5tZWRpYS5kdXJhdGlvbiwgbnVsbCA9PT0gdGhpcy5taSAmJiAodGhpcy5taSA9IHRoaXMubWVkaWFTb3VyY2UuZHVyYXRpb24pLCAhMCA9PT0gdGhpcy53aSAmJiAhMCA9PT0gaS5saXZlRHVyYXRpb25JbmZpbml0eSA/IChjLmIubG9nKCdNZWRpYSBTb3VyY2UgZHVyYXRpb24gaXMgc2V0IHRvIEluZmluaXR5JyksIHRoaXMubWkgPSB0aGlzLm1lZGlhU291cmNlLmR1cmF0aW9uID0gMSAvIDApIDogKHRoaXMuZ2kgPiB0aGlzLm1pICYmIHRoaXMuZ2kgPiB0IHx8ICFPYmplY3QoYS5hKSh0KSkgJiYgKGMuYi5sb2coJ1VwZGF0aW5nIE1lZGlhIFNvdXJjZSBkdXJhdGlvbiB0byAnICsgdGhpcy5naS50b0ZpeGVkKDMpKSwgdGhpcy5taSA9IHRoaXMubWVkaWFTb3VyY2UuZHVyYXRpb24gPSB0aGlzLmdpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmRvRmx1c2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHRoaXMuZmx1c2hSYW5nZS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5mbHVzaFJhbmdlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmx1c2hCdWZmZXIodC5zdGFydCwgdC5lbmQsIHQudHlwZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAodGhpcy54aSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbHVzaFJhbmdlLnNoaWZ0KCksIHRoaXMuZmx1c2hCdWZmZXJDb3VudGVyID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHRoaXMuZmx1c2hSYW5nZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54aSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGUgPSB0aGlzLnNvdXJjZUJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIChpICs9IG4uYnVmZmVyZWQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmVycm9yKCdlcnJvciB3aGlsZSBhY2Nlc3Npbmcgc291cmNlQnVmZmVyLmJ1ZmZlcmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBlbmRlZCA9IGksIHRoaXMuaGxzLnRyaWdnZXIoby5hLkJVRkZFUl9GTFVTSEVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmRvQXBwZW5kaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5jb25maWcsIGkgPSB0aGlzLmhscywgZSA9IHRoaXMuc2VnbWVudHMsIHMgPSB0aGlzLnNvdXJjZUJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMocykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tZWRpYSB8fCB0aGlzLm1lZGlhLmVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VnbWVudHMgPSBbXSwgdm9pZCBjLmIuZXJyb3IoJ3RyeWluZyB0byBhcHBlbmQgYWx0aG91Z2ggYSBtZWRpYSBlcnJvciBvY2N1cmVkLCBmbHVzaCBzZWdtZW50IGFuZCBhYm9ydCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYXBwZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gc1tuLnR5cGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLklpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnVwZGF0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZS51bnNoaWZ0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVuZGVkID0gITEsIHRoaXMucGFyZW50ID0gbi5wYXJlbnQsIHIuYXBwZW5kQnVmZmVyKG4uZGF0YSksIHRoaXMuYXBwZW5kRXJyb3IgPSAwLCB0aGlzLmFwcGVuZGVkKyssIHRoaXMuYXBwZW5kaW5nID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIuZXJyb3IoJ2Vycm9yIHdoaWxlIHRyeWluZyB0byBhcHBlbmQgYnVmZmVyOicgKyBzLm1lc3NhZ2UpLCBlLnVuc2hpZnQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5iLk1FRElBX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBuLnBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHM6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWw6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyID09PSBzLmNvZGUgPyAodGhpcy5zZWdtZW50cyA9IFtdLCBhLmRldGFpbHMgPSBoLmEuQlVGRkVSX0ZVTExfRVJST1IpIDogKHRoaXMuYXBwZW5kRXJyb3IrKywgYS5kZXRhaWxzID0gaC5hLkJVRkZFUl9BUFBFTkRfRVJST1IsIHRoaXMuYXBwZW5kRXJyb3IgPiB0LmFwcGVuZEVycm9yTWF4UmV0cnkgJiYgKGMuYi5sb2coJ2ZhaWwgJyArIHQuYXBwZW5kRXJyb3JNYXhSZXRyeSArICcgdGltZXMgdG8gYXBwZW5kIHNlZ21lbnQgaW4gc291cmNlQnVmZmVyJyksIHRoaXMuc2VnbWVudHMgPSBbXSwgYS5mYXRhbCA9ICEwKSksIGkudHJpZ2dlcihvLmEuRVJST1IsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uZmx1c2hCdWZmZXIgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5zb3VyY2VCdWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhzKS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICdudWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWRpYSAmJiAobiA9IHRoaXMubWVkaWEuY3VycmVudFRpbWUudG9GaXhlZCgzKSksIGMuYi5sb2coJ2ZsdXNoQnVmZmVyLHBvcy9zdGFydC9lbmQ6ICcgKyBuICsgJy8nICsgdCArICcvJyArIGkpLCB0aGlzLmZsdXNoQnVmZmVyQ291bnRlciA+PSB0aGlzLmFwcGVuZGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5iLndhcm4oJ2Fib3J0IGZsdXNoaW5nIHRvbyBtYW55IHJldHJpZXMnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmVuZGVkID0gITEsIHIudXBkYXRpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5iLndhcm4oJ2Nhbm5vdCBmbHVzaCwgc2IgdXBkYXRpbmcgaW4gcHJvZ3Jlc3MnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbW92ZUJ1ZmZlclJhbmdlKGUsIHIsIHQsIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmx1c2hCdWZmZXJDb3VudGVyKyssICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5iLmxvZygnYnVmZmVyIGZsdXNoZWQnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnJlbW92ZUJ1ZmZlclJhbmdlID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGkuYnVmZmVyZWQubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gaS5idWZmZXJlZC5zdGFydChuKSwgaCA9IGkuYnVmZmVyZWQuZW5kKG4pLCBhID0gTWF0aC5tYXgociwgZSksIG8gPSBNYXRoLm1pbihoLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLm1pbihvLCBoKSAtIGEgPiAwLjUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9ICdudWxsJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYSAmJiAodSA9IHRoaXMubWVkaWEuY3VycmVudFRpbWUudG9TdHJpbmcoKSksIGMuYi5sb2coJ3NiIHJlbW92ZSAnICsgdCArICcgWycgKyBhICsgJywnICsgbyArICddLCBvZiBbJyArIHIgKyAnLCcgKyBoICsgJ10sIHBvczonICsgdSksIGkucmVtb3ZlKGEsIG8pLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLndhcm4oJ3JlbW92ZUJ1ZmZlclJhbmdlIGZhaWxlZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFR0KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBpLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVudW1lcmFibGUgPSBzLmVudW1lcmFibGUgfHwgITEsIHMuY29uZmlndXJhYmxlID0gITAsICd2YWx1ZScgaW4gcyAmJiAocy53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIHMua2V5LCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHQsIE10ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0gdC5jYWxsKHRoaXMsIGksIG8uYS5GUFNfRFJPUF9MRVZFTF9DQVBQSU5HLCBvLmEuTUVESUFfQVRUQUNISU5HLCBvLmEuTUFOSUZFU1RfUEFSU0VELCBvLmEuQlVGRkVSX0NPREVDUywgby5hLk1FRElBX0RFVEFDSElORykgfHwgdGhpcykuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgZS5maXJzdExldmVsID0gbnVsbCwgZS5sZXZlbHMgPSBbXSwgZS5tZWRpYSA9IG51bGwsIGUucmVzdHJpY3RlZExldmVscyA9IFtdLCBlLnRpbWVyID0gbnVsbCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB0LCAoaSA9IHMpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpLCBpLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGksIGkuX19wcm90b19fID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBoLCBhID0gcy5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGxzLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSAmJiAodGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuc3RvcENhcHBpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLm9uRnBzRHJvcExldmVsQ2FwcGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pc0xldmVsQWxsb3dlZCh0LmRyb3BwZWRMZXZlbCwgdGhpcy5yZXN0cmljdGVkTGV2ZWxzKSAmJiB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMucHVzaCh0LmRyb3BwZWRMZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLm9uTWVkaWFBdHRhY2hpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhIGluc3RhbmNlb2YgdGhpcy5obHMuY29uZmlnLmNueFJlbmRlcldpbmRvdy5IVE1MVmlkZW9FbGVtZW50ID8gdC5tZWRpYSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLm9uTWFuaWZlc3RQYXJzZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5obHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN0cmljdGVkTGV2ZWxzID0gW10sIHRoaXMubGV2ZWxzID0gdC5sZXZlbHMsIHRoaXMuZmlyc3RMZXZlbCA9IHQuZmlyc3RMZXZlbCwgaS5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUgJiYgdC52aWRlbyAmJiB0aGlzLnN0YXJ0Q2FwcGluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5vbkJ1ZmZlckNvZGVjcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obHMuY29uZmlnLmNhcExldmVsVG9QbGF5ZXJTaXplICYmIHQudmlkZW8gJiYgdGhpcy5zdGFydENhcHBpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEub25MZXZlbHNVcGRhdGVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxldmVscyA9IHQubGV2ZWxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5vbk1lZGlhRGV0YWNoaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcENhcHBpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEuZGV0ZWN0UGxheWVyU2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tZWRpYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubGV2ZWxzID8gdGhpcy5sZXZlbHMubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5obHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmF1dG9MZXZlbENhcHBpbmcgPSB0aGlzLmdldE1heExldmVsKHQgLSAxKSwgaS5hdXRvTGV2ZWxDYXBwaW5nID4gdGhpcy5hdXRvTGV2ZWxDYXBwaW5nICYmIGkuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWxTd2l0Y2goKSwgdGhpcy5hdXRvTGV2ZWxDYXBwaW5nID0gaS5hdXRvTGV2ZWxDYXBwaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5nZXRNYXhMZXZlbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZXZlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMubGV2ZWxzLmZpbHRlcihmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5pc0xldmVsQWxsb3dlZChuLCBpLnJlc3RyaWN0ZWRMZXZlbHMpICYmIG4gPD0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5nZXRNYXhMZXZlbEJ5TWVkaWFTaXplKGUsIHRoaXMubWVkaWFXaWR0aCwgdGhpcy5tZWRpYUhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnN0YXJ0Q2FwcGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyIHx8ICh0aGlzLmF1dG9MZXZlbENhcHBpbmcgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHRoaXMuaGxzLmZpcnN0TGV2ZWwgPSB0aGlzLmdldE1heExldmVsKHRoaXMuZmlyc3RMZXZlbCksIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmRldGVjdFBsYXllclNpemUuYmluZCh0aGlzKSwgMTAwMCksIHRoaXMuZGV0ZWN0UGxheWVyU2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEuc3RvcENhcHBpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN0cmljdGVkTGV2ZWxzID0gW10sIHRoaXMuZmlyc3RMZXZlbCA9IG51bGwsIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgdGhpcy50aW1lciAmJiAodGhpcy50aW1lciA9IGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMuaXNMZXZlbEFsbG93ZWQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkgJiYgKGkgPSBbXSksIC0xID09PSBpLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmdldE1heExldmVsQnlNZWRpYVNpemUgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCB0ICYmICF0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMsIG4sIHIgPSB0Lmxlbmd0aCAtIDEsIGggPSAwOyBoIDwgdC5sZW5ndGg7IGggKz0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRbaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYS53aWR0aCA+PSBpIHx8IGEuaGVpZ2h0ID49IGUpICYmIChzID0gYSwgIShuID0gdFtoICsgMV0pIHx8IHMud2lkdGggIT09IG4ud2lkdGggfHwgcy5oZWlnaHQgIT09IG4uaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBzLCBoID0gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnY29udGVudFNjYWxlRmFjdG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLCAociA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21lZGlhV2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpID0gdGhpcy5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICYmICh0ID0gaS53aWR0aCB8fCBpLmNsaWVudFdpZHRoIHx8IGkub2Zmc2V0V2lkdGgsIHQgKj0gcy5jb250ZW50U2NhbGVGYWN0b3IpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21lZGlhSGVpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaSA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiAodCA9IGkuaGVpZ2h0IHx8IGkuY2xpZW50SGVpZ2h0IHx8IGkub2Zmc2V0SGVpZ2h0LCB0ICo9IHMuY29udGVudFNjYWxlRmFjdG9yKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pICYmIFR0KG4ucHJvdG90eXBlLCByKSwgaCAmJiBUdChuLCBoKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShsKSwgRXQgPSB3aW5kb3cucGVyZm9ybWFuY2UsIEx0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbCh0aGlzLCBpLCBvLmEuTUVESUFfQVRUQUNISU5HKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHQsIChpID0gcykucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksIGkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gaSwgaS5fX3Byb3RvX18gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lciAmJiBjbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLmlzVmlkZW9QbGF5YmFja1F1YWxpdHlBdmFpbGFibGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub25NZWRpYUF0dGFjaGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmhscy5jb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jYXBMZXZlbE9uRlBTRHJvcCAmJiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgKHRoaXMudmlkZW8gPSB0Lm1lZGlhIGluc3RhbmNlb2YgdGhpcy5obHMuY29uZmlnLmNueFJlbmRlcldpbmRvdy5IVE1MVmlkZW9FbGVtZW50ID8gdC5tZWRpYSA6IG51bGwpLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5ICYmICh0aGlzLmlzVmlkZW9QbGF5YmFja1F1YWxpdHlBdmFpbGFibGUgPSAhMCksIGNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLmNoZWNrRlBTSW50ZXJ2YWwuYmluZCh0aGlzKSwgaS5mcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5jaGVja0ZQUyA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBFdC5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0VGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzIC0gdGhpcy5sYXN0VGltZSwgciA9IGUgLSB0aGlzLmxhc3REcm9wcGVkRnJhbWVzLCBoID0gaSAtIHRoaXMubGFzdERlY29kZWRGcmFtZXMsIGEgPSAxMDAwICogciAvIG4sIHUgPSB0aGlzLmhsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1LnRyaWdnZXIoby5hLkZQU19EUk9QLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREcm9wcGVkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVjb2RlZDogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxEcm9wcGVkRnJhbWVzOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEgPiAwICYmIHIgPiB1LmNvbmZpZy5mcHNEcm9wcGVkTW9uaXRvcmluZ1RocmVzaG9sZCAqIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHUuY3VycmVudExldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCdkcm9wIEZQUyByYXRpbyBncmVhdGVyIHRoYW4gbWF4IGFsbG93ZWQgdmFsdWUgZm9yIGN1cnJlbnRMZXZlbDogJyArIGwpLCBsID4gMCAmJiAoLTEgPT09IHUuYXV0b0xldmVsQ2FwcGluZyB8fCB1LmF1dG9MZXZlbENhcHBpbmcgPj0gbCkgJiYgKGwgLT0gMSwgdS50cmlnZ2VyKG8uYS5GUFNfRFJPUF9MRVZFTF9DQVBQSU5HLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkTGV2ZWw6IHUuY3VycmVudExldmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHUuYXV0b0xldmVsQ2FwcGluZyA9IGwsIHUuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWxTd2l0Y2goKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0VGltZSA9IHMsIHRoaXMubGFzdERyb3BwZWRGcmFtZXMgPSBlLCB0aGlzLmxhc3REZWNvZGVkRnJhbWVzID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmNoZWNrRlBTSW50ZXJ2YWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnZpZGVvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZpZGVvUGxheWJhY2tRdWFsaXR5QXZhaWxhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGUFModCwgaS50b3RhbFZpZGVvRnJhbWVzLCBpLmRyb3BwZWRWaWRlb0ZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZQUyh0LCB0LndlYmtpdERlY29kZWRGcmFtZUNvdW50LCB0LndlYmtpdERyb3BwZWRGcmFtZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCksIFJ0ID0gd2luZG93LCBCdCA9IFJ0LnBlcmZvcm1hbmNlLCBEdCA9IFJ0LlhNTEh0dHBSZXF1ZXN0LCBGdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC54aHJTZXR1cCAmJiAodGhpcy54aHJTZXR1cCA9IHQueGhyU2V0dXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hYm9ydCgpLCB0aGlzLmxvYWRlciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5sb2FkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiA0ICE9PSB0LnJlYWR5U3RhdGUgJiYgKHRoaXMuc3RhdHMuYWJvcnRlZCA9ICEwLCB0LmFib3J0KCkpLCB3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gbnVsbCwgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCksIHRoaXMucmV0cnlUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkubG9hZCA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdCwgdGhpcy5jb25maWcgPSBpLCB0aGlzLmNhbGxiYWNrcyA9IGUsIHRoaXMuc3RhdHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZXF1ZXN0OiBCdC5ub3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnk6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnJldHJ5RGVsYXkgPSBpLnJldHJ5RGVsYXksIHRoaXMubG9hZEludGVybmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmxvYWRJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaSA9IHRoaXMuY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdGhpcy5sb2FkZXIgPSBuZXcgRHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuc3RhdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50Zmlyc3QgPSAwLCBlLmxvYWRlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLnhoclNldHVwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGkudXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm9wZW4oJ0dFVCcsIGkudXJsLCAhMCksIHModCwgaS51cmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlYWR5U3RhdGUgfHwgdC5vcGVuKCdHRVQnLCBpLnVybCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5jYWxsYmFja3Mub25FcnJvcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0LnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGUubWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yYW5nZUVuZCAmJiB0LnNldFJlcXVlc3RIZWFkZXIoJ1JhbmdlJywgJ2J5dGVzPScgKyBpLnJhbmdlU3RhcnQgKyAnLScgKyAoaS5yYW5nZUVuZCAtIDEpKSwgdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLnJlYWR5c3RhdGVjaGFuZ2UuYmluZCh0aGlzKSwgdC5vbnByb2dyZXNzID0gdGhpcy5sb2FkcHJvZ3Jlc3MuYmluZCh0aGlzKSwgdC5yZXNwb25zZVR5cGUgPSBpLnJlc3BvbnNlVHlwZSwgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKSwgdGhpcy5jb25maWcudGltZW91dCksIHQuc2VuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuY3VycmVudFRhcmdldCwgZSA9IGkucmVhZHlTdGF0ZSwgcyA9IHRoaXMuc3RhdHMsIG4gPSB0aGlzLmNvbnRleHQsIHIgPSB0aGlzLmNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuYWJvcnRlZCAmJiBlID49IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCAwID09PSBzLnRmaXJzdCAmJiAocy50Zmlyc3QgPSBNYXRoLm1heChCdC5ub3coKSwgcy50cmVxdWVzdCkpLCA0ID09PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGkuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gMjAwICYmIGggPCAzMDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRsb2FkID0gTWF0aC5tYXgocy50Zmlyc3QsIEJ0Lm5vdygpKSwgbyA9ICdhcnJheWJ1ZmZlcicgPT09IG4ucmVzcG9uc2VUeXBlID8gKGEgPSBpLnJlc3BvbnNlKS5ieXRlTGVuZ3RoIDogKGEgPSBpLnJlc3BvbnNlVGV4dCkubGVuZ3RoLCBzLmxvYWRlZCA9IHMudG90YWwgPSBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGkucmVzcG9uc2VVUkwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLm9uU3VjY2Vzcyh1LCBzLCBuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmV0cnkgPj0gci5tYXhSZXRyeSB8fCBoID49IDQwMCAmJiBoIDwgNDk5ID8gKGMuYi5lcnJvcihoICsgJyB3aGlsZSBsb2FkaW5nICcgKyBuLnVybCksIHRoaXMuY2FsbGJhY2tzLm9uRXJyb3IoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBpLnN0YXR1c1RleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLCBpKSkgOiAoYy5iLndhcm4oaCArICcgd2hpbGUgbG9hZGluZyAnICsgbi51cmwgKyAnLCByZXRyeWluZyBpbiAnICsgdGhpcy5yZXRyeURlbGF5ICsgJy4uLicpLCB0aGlzLmRlc3Ryb3koKSwgdGhpcy5yZXRyeVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxvYWRJbnRlcm5hbC5iaW5kKHRoaXMpLCB0aGlzLnJldHJ5RGVsYXkpLCB0aGlzLnJldHJ5RGVsYXkgPSBNYXRoLm1pbigyICogdGhpcy5yZXRyeURlbGF5LCByLm1heFJldHJ5RGVsYXkpLCBzLnJldHJ5KyspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxvYWR0aW1lb3V0LmJpbmQodGhpcyksIHIudGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmxvYWR0aW1lb3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi53YXJuKCd0aW1lb3V0IHdoaWxlIGxvYWRpbmcgJyArIHRoaXMuY29udGV4dC51cmwpLCB0aGlzLmNhbGxiYWNrcy5vblRpbWVvdXQodGhpcy5zdGF0cywgdGhpcy5jb250ZXh0LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkubG9hZHByb2dyZXNzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuY3VycmVudFRhcmdldCwgZSA9IHRoaXMuc3RhdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgPSB0LmxvYWRlZCwgdC5sZW5ndGhDb21wdXRhYmxlICYmIChlLnRvdGFsID0gdC50b3RhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLmNhbGxiYWNrcy5vblByb2dyZXNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgcyhlLCB0aGlzLmNvbnRleHQsIG51bGwsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoNiksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuV0lERVZJTkUgPSAnY29tLndpZGV2aW5lLmFscGhhJywgdC5QTEFZUkVBRFkgPSAnY29tLm1pY3Jvc29mdC5wbGF5cmVhZHknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oUHQgfHwgKFB0ID0ge30pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93LmNueFJlbmRlcldpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCAmJiB0Lm5hdmlnYXRvciAmJiB0Lm5hdmlnYXRvci5yZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MgPyB0Lm5hdmlnYXRvci5yZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MuYmluZCh0Lm5hdmlnYXRvcikgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBVdCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgaSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0W2ldID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICR0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fSwgcyA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAocyA9IHMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkuZmlsdGVyKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSksIHMuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0KHQsIGksIGVbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueFJlbmRlcldpbmRvdzogd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU3RhcnRMb2FkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbjogLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBdWRpb0NvZGVjOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwTGV2ZWxPbkZQU0Ryb3A6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBMZXZlbFRvUGxheWVyU2l6ZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxMaXZlTWFuaWZlc3RTaXplOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmZXJTaXplOiA2MDAwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmZmVySG9sZTogMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dCdWZmZXJXYXRjaGRvZ1BlcmlvZDogMC41LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoQnVmZmVyV2F0Y2hkb2dQZXJpb2Q6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51ZGdlT2Zmc2V0OiAwLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51ZGdlTWF4UmV0cnk6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEZyYWdMb29rVXBUb2xlcmFuY2U6IDAuMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVTeW5jRHVyYXRpb25Db3VudDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50OiAxIC8gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVN5bmNEdXJhdGlvbjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTWF4TGF0ZW5jeUR1cmF0aW9uOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVEdXJhdGlvbkluZmluaXR5OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUJhY2tCdWZmZXJMZW5ndGg6IDEgLyAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhNYXhCdWZmZXJMZW5ndGg6IDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlV29ya2VyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU29mdHdhcmVBRVM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdExvYWRpbmdUaW1lT3V0OiAxMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RMb2FkaW5nTWF4UmV0cnk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0TG9hZGluZ1JldHJ5RGVsYXk6IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0TG9hZGluZ01heFJldHJ5VGltZW91dDogNjQwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGV2ZWw6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxMb2FkaW5nVGltZU91dDogMTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsTG9hZGluZ01heFJldHJ5OiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbExvYWRpbmdSZXRyeURlbGF5OiAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbExvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6IDY0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnTG9hZGluZ1RpbWVPdXQ6IDIwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnTG9hZGluZ01heFJldHJ5OiA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnTG9hZGluZ1JldHJ5RGVsYXk6IDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdMb2FkaW5nTWF4UmV0cnlUaW1lb3V0OiA2NDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRGcmFnUHJlZmV0Y2g6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZDogNTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBzRHJvcHBlZE1vbml0b3JpbmdUaHJlc2hvbGQ6IDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kRXJyb3JNYXhSZXRyeTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyOiBGdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkxvYWRlcjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9hZGVyOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoclNldHVwOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpY2Vuc2VYaHJTZXR1cDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnJDb250cm9sbGVyOiBBdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ29udHJvbGxlcjogQ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcExldmVsQ29udHJvbGxlcjogTXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwc0NvbnRyb2xsZXI6IEx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJldGNoU2hvcnRWaWRlb1RyYWNrOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QXVkaW9GcmFtZXNEcmlmdDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VLZXlGcmFtZU9uRGlzY29udGludWl0eTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFickV3bWFGYXN0TGl2ZTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJyRXdtYVNsb3dMaXZlOiA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnJFd21hRmFzdFZvRDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJyRXdtYVNsb3dWb0Q6IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFickV3bWFEZWZhdWx0RXN0aW1hdGU6IDUwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJyQmFuZFdpZHRoRmFjdG9yOiAwLjk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnJCYW5kV2lkdGhVcEZhY3RvcjogMC43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnJNYXhXaXRoUmVhbEJpdHJhdGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTdGFydmF0aW9uRGVsYXk6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExvYWRpbmdEZWxheTogNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQXV0b0JpdHJhdGU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtZUVuYWJsZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRldmluZUxpY2Vuc2VVcmw6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzRnVuYzogVnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZVN0cmVhbUNvbnRyb2xsZXI6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVUcmFja0NvbnRyb2xsZXI6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWxpbmVDb250cm9sbGVyOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU3RyZWFtQ29udHJvbGxlcjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1RyYWNrQ29udHJvbGxlcjogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWVDb250cm9sbGVyOiB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOdCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgaSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0W2ldID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCd0aGlzIGhhc25cJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzblwndCBiZWVuIGNhbGxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGkubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZW51bWVyYWJsZSA9IHMuZW51bWVyYWJsZSB8fCAhMSwgcy5jb25maWd1cmFibGUgPSAhMCwgJ3ZhbHVlJyBpbiBzICYmIChzLndyaXRhYmxlID0gITApLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgcy5rZXksIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHp0KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgcXQodC5wcm90b3R5cGUsIGkpLCBlICYmIHF0KHQsIGUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmQoaSwgJ2RlZmF1bHQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgV3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gaSAmJiAoaSA9IHt9KSwgKGUgPSB0LmNhbGwodGhpcykgfHwgdGhpcykuY29uZmlnID0gdm9pZCAwLCBlLlRpID0gdm9pZCAwLCBlLmFickNvbnRyb2xsZXIgPSB2b2lkIDAsIGUuY2FwTGV2ZWxDb250cm9sbGVyID0gdm9pZCAwLCBlLmxldmVsQ29udHJvbGxlciA9IHZvaWQgMCwgZS5zdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCBlLm5ldHdvcmtDb250cm9sbGVycyA9IHZvaWQgMCwgZS5hdWRpb1RyYWNrQ29udHJvbGxlciA9IHZvaWQgMCwgZS5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlciA9IHZvaWQgMCwgZS5lbWVDb250cm9sbGVyID0gdm9pZCAwLCBlLmNvcmVDb21wb25lbnRzID0gdm9pZCAwLCBlLm1lZGlhID0gbnVsbCwgZS51cmwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLkRlZmF1bHRDb25maWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkubGl2ZVN5bmNEdXJhdGlvbkNvdW50IHx8IGkubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50KSAmJiAoaS5saXZlU3luY0R1cmF0aW9uIHx8IGkubGl2ZU1heExhdGVuY3lEdXJhdGlvbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGhscy5qcyBjb25maWc6IGRvblwndCBtaXggdXAgbGl2ZVN5bmNEdXJhdGlvbkNvdW50L2xpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCBhbmQgbGl2ZVN5bmNEdXJhdGlvbi9saXZlTWF4TGF0ZW5jeUR1cmF0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNvbmZpZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9LCBzID0gT2JqZWN0LmtleXMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgKHMgPSBzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgdCkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSwgcy5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdCh0LCBpLCBlW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh7fSwgbiwgaSksIHdpbmRvdy5jbnhSZW5kZXJXaW5kb3cgPSBlLmNvbmZpZy5jbnhSZW5kZXJXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEh0KGUpLmNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHIubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50ICYmIHIubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50IDw9IHIubGl2ZVN5bmNEdXJhdGlvbkNvdW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBobHMuanMgY29uZmlnOiAibGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50IiBtdXN0IGJlIGd0ICJsaXZlU3luY0R1cmF0aW9uQ291bnQiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSByLmxpdmVNYXhMYXRlbmN5RHVyYXRpb24gJiYgKHZvaWQgMCA9PT0gci5saXZlU3luY0R1cmF0aW9uIHx8IHIubGl2ZU1heExhdGVuY3lEdXJhdGlvbiA8PSByLmxpdmVTeW5jRHVyYXRpb24pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBobHMuanMgY29uZmlnOiAibGl2ZU1heExhdGVuY3lEdXJhdGlvbiIgbXVzdCBiZSBndCAibGl2ZVN5bmNEdXJhdGlvbiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChjLmEpKHIuZGVidWcpLCBlLlRpID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGUuYWJyQ29udHJvbGxlciA9IG5ldyByLmFickNvbnRyb2xsZXIoSHQoZSkpLCBhID0gbmV3IHIuYnVmZmVyQ29udHJvbGxlcihIdChlKSksIG8gPSBlLmNhcExldmVsQ29udHJvbGxlciA9IG5ldyByLmNhcExldmVsQ29udHJvbGxlcihIdChlKSksIHUgPSBuZXcgci5mcHNDb250cm9sbGVyKEh0KGUpKSwgbCA9IG5ldyBFKEh0KGUpKSwgZCA9IG5ldyBMKEh0KGUpKSwgZiA9IG5ldyBSKEh0KGUpKSwgcCA9IG5ldyB4dChIdChlKSksIGIgPSBlLmxldmVsQ29udHJvbGxlciA9IG5ldyB5dChIdChlKSksIHYgPSBuZXcgVihIdChlKSksIG0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RyZWFtQ29udHJvbGxlciA9IG5ldyB2dChIdChlKSwgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBnID0gci5hdWRpb1N0cmVhbUNvbnRyb2xsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICYmIG0ucHVzaChuZXcgZyhIdChlKSwgdikpLCBlLm5ldHdvcmtDb250cm9sbGVycyA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnID0gci5hdWRpb1RyYWNrQ29udHJvbGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3ID0gbmV3IGcoSHQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXVkaW9UcmFja0NvbnRyb2xsZXIgPSB3LCB5LnB1c2godyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA9IHIuc3VidGl0bGVUcmFja0NvbnRyb2xsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTyA9IG5ldyBnKEh0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyID0gTywgbS5wdXNoKE8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgPSByLmVtZUNvbnRyb2xsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBnKEh0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmVtZUNvbnRyb2xsZXIgPSB4LCB5LnB1c2goeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGcgPSByLnN1YnRpdGxlU3RyZWFtQ29udHJvbGxlcikgJiYgbS5wdXNoKG5ldyBnKEh0KGUpLCB2KSksIChnID0gci50aW1lbGluZUNvbnRyb2xsZXIpICYmIHkucHVzaChuZXcgZyhIdChlKSkpLCBlLmNvcmVDb21wb25lbnRzID0geSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdCwgKGkgPSBzKS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSwgaS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpLCBpLl9fcHJvdG9fXyA9IGUsIHMuaXNTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gc2VsZi5Tb3VyY2VCdWZmZXIgfHwgc2VsZi5XZWJLaXRTb3VyY2VCdWZmZXIsIGUgPSB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQuaXNUeXBlU3VwcG9ydGVkICYmIHQuaXNUeXBlU3VwcG9ydGVkKCd2aWRlby9tcDQ7IGNvZGVjcz0iYXZjMS40MkUwMUUsbXA0YS40MC4yIicpLCBzID0gIWkgfHwgaS5wcm90b3R5cGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaS5wcm90b3R5cGUuYXBwZW5kQnVmZmVyICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGkucHJvdG90eXBlLnJlbW92ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlICYmICEhczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgenQocywgbnVsbCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0Vycm9yVHlwZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnRXJyb3JEZXRhaWxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ0RlZmF1bHRDb25maWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5kZWZhdWx0Q29uZmlnID8gcy5kZWZhdWx0Q29uZmlnIDogJHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZGVmYXVsdENvbmZpZyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ2Rlc3Ryb3knKSwgdGhpcy50cmlnZ2VyKG8uYS5ERVNUUk9ZSU5HKSwgdGhpcy5kZXRhY2hNZWRpYSgpLCB0aGlzLmNvcmVDb21wb25lbnRzLmNvbmNhdCh0aGlzLm5ldHdvcmtDb250cm9sbGVycykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMudXJsID0gbnVsbCwgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5UaSA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmF0dGFjaE1lZGlhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ2F0dGFjaE1lZGlhJyksIHRoaXMubWVkaWEgPSB0LCB0aGlzLnRyaWdnZXIoby5hLk1FRElBX0FUVEFDSElORywgeyBtZWRpYTogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5kZXRhY2hNZWRpYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ2RldGFjaE1lZGlhJyksIHRoaXMudHJpZ2dlcihvLmEuTUVESUFfREVUQUNISU5HKSwgdGhpcy5tZWRpYSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubG9hZFNvdXJjZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gci5idWlsZEFic29sdXRlVVJMKHRoaXMuY29uZmlnLmNueFJlbmRlcldpbmRvdy5sb2NhdGlvbi5ocmVmLCB0LCB7IGFsd2F5c05vcm1hbGl6ZTogITAgfSksIGMuYi5sb2coJ2xvYWRTb3VyY2U6JyArIHQpLCB0aGlzLnVybCA9IHQsIHRoaXMudHJpZ2dlcihvLmEuTUFOSUZFU1RfTE9BRElORywgeyB1cmw6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uc3RhcnRMb2FkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IC0xKSwgYy5iLmxvZygnc3RhcnRMb2FkKCcgKyB0ICsgJyknKSwgdGhpcy5uZXR3b3JrQ29udHJvbGxlcnMuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc3RhcnRMb2FkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uc3RvcExvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzdG9wTG9hZCcpLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdG9wTG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uc3dhcEF1ZGlvQ29kZWMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzd2FwQXVkaW9Db2RlYycpLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuc3dhcEF1ZGlvQ29kZWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5yZWNvdmVyTWVkaWFFcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYi5sb2coJ3JlY292ZXJNZWRpYUVycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubWVkaWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRldGFjaE1lZGlhKCksIHQgJiYgdGhpcy5hdHRhY2hNZWRpYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgenQocywgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xldmVscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxldmVsQ29udHJvbGxlci5sZXZlbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjdXJyZW50TGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmN1cnJlbnRMZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnc2V0IGN1cnJlbnRMZXZlbDonICsgdCksIHRoaXMubG9hZExldmVsID0gdCwgdGhpcy5zdHJlYW1Db250cm9sbGVyLmltbWVkaWF0ZUxldmVsU3dpdGNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICduZXh0TGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnc2V0IG5leHRMZXZlbDonICsgdCksIHRoaXMubGV2ZWxDb250cm9sbGVyLm1hbnVhbExldmVsID0gdCwgdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbG9hZExldmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGV2ZWxDb250cm9sbGVyLmxldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzZXQgbG9hZExldmVsOicgKyB0KSwgdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbmV4dExvYWRMZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxldmVsQ29udHJvbGxlci5uZXh0TG9hZExldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxldmVsQ29udHJvbGxlci5uZXh0TG9hZExldmVsID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2ZpcnN0TGV2ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5sZXZlbENvbnRyb2xsZXIuZmlyc3RMZXZlbCwgdGhpcy5taW5BdXRvTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzZXQgZmlyc3RMZXZlbDonICsgdCksIHRoaXMubGV2ZWxDb250cm9sbGVyLmZpcnN0TGV2ZWwgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc3RhcnRMZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmIubG9nKCdzZXQgc3RhcnRMZXZlbDonICsgdCksIC0xICE9PSB0ICYmICh0ID0gTWF0aC5tYXgodCwgdGhpcy5taW5BdXRvTGV2ZWwpKSwgdGhpcy5sZXZlbENvbnRyb2xsZXIuc3RhcnRMZXZlbCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdjYXBMZXZlbFRvUGxheWVyU2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICEhdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAhPT0gdGhpcy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUgJiYgKGkgPyB0aGlzLmNhcExldmVsQ29udHJvbGxlci5zdGFydENhcHBpbmcoKSA6ICh0aGlzLmNhcExldmVsQ29udHJvbGxlci5zdG9wQ2FwcGluZygpLCB0aGlzLmF1dG9MZXZlbENhcHBpbmcgPSAtMSwgdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpKSwgdGhpcy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUgPSBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2F1dG9MZXZlbENhcHBpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5UaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iLmxvZygnc2V0IGF1dG9MZXZlbENhcHBpbmc6JyArIHQpLCB0aGlzLlRpID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2JhbmR3aWR0aEVzdGltYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmFickNvbnRyb2xsZXIuYndFc3RpbWF0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdC5nZXRFc3RpbWF0ZSgpIDogTmFOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYXV0b0xldmVsRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdtYW51YWxMZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxldmVsQ29udHJvbGxlci5tYW51YWxMZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ21pbkF1dG9MZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB0aGlzLmxldmVscywgaSA9IHRoaXMuY29uZmlnLm1pbkF1dG9CaXRyYXRlLCBlID0gdCA/IHQubGVuZ3RoIDogMCwgcyA9IDA7IHMgPCBlOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRbc10ucmVhbEJpdHJhdGUgPyBNYXRoLm1heCh0W3NdLnJlYWxCaXRyYXRlLCB0W3NdLmJpdHJhdGUpIDogdFtzXS5iaXRyYXRlKSA+IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbWF4QXV0b0xldmVsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmxldmVscywgaSA9IHRoaXMuYXV0b0xldmVsQ2FwcGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBpICYmIHQgJiYgdC5sZW5ndGggPyB0Lmxlbmd0aCAtIDEgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnbmV4dEF1dG9MZXZlbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh0aGlzLmFickNvbnRyb2xsZXIubmV4dEF1dG9MZXZlbCwgdGhpcy5taW5BdXRvTGV2ZWwpLCB0aGlzLm1heEF1dG9MZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWJyQ29udHJvbGxlci5uZXh0QXV0b0xldmVsID0gTWF0aC5tYXgodGhpcy5taW5BdXRvTGV2ZWwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYXVkaW9UcmFja3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdC5hdWRpb1RyYWNrcyA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnYXVkaW9UcmFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5hdWRpb1RyYWNrQ29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB0LmF1ZGlvVHJhY2sgOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIChpLmF1ZGlvVHJhY2sgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ2xpdmVTeW5jUG9zaXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmxpdmVTeW5jUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdWJ0aXRsZVRyYWNrcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB0LnN1YnRpdGxlVHJhY2tzIDogW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6ICdzdWJ0aXRsZVRyYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IHQuc3VidGl0bGVUcmFjayA6IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKGkuc3VidGl0bGVUcmFjayA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiAnc3VidGl0bGVEaXNwbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0ICYmIHQuc3VidGl0bGVEaXNwbGF5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKGkuc3VidGl0bGVEaXNwbGF5ID0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KEcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd0LmRlZmF1bHRDb25maWcgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9mN2E2MGExNDNkNzQxNmQyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfZjdhNjBhMTQzZDc0MTZkMikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSkuZGVmYXVsdCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMCk7CiAgICAgICAgICAgICAgICBjb25zdCBuID0gWwogICAgICAgICAgICAgICAgICAgIHMuUHJvdG9EZXZpY2VUeXBlLlNtYXJ0cGhvbmUsCiAgICAgICAgICAgICAgICAgICAgcy5Qcm90b0RldmljZVR5cGUuVGFibGV0CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LklvcyA9ICdpb3MnLCB0LkFuZHJvaWQgPSAnYW5kcm9pZCcsIHQuTWFjID0gJ21hY29zJywgdC5XaW5kb3dzID0gJ3dpbmRvd3MnLCB0LkxpbnV4ID0gJ2xpbnV4JzsKICAgICAgICAgICAgICAgIH0ociB8fCAociA9IHt9KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMSk7CiAgICAgICAgICAgICAgICBjb25zdCBuID0gJy5jZG4uYW1wcHJvamVjdC5vcmcnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaSB8fCAoaSA9IGxvY2F0aW9uLnNlYXJjaCksIHQgPSB0LnJlcGxhY2UoL1xbLywgJ1xcWycpLnJlcGxhY2UoL10vLCAnXFxdJyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBSZWdFeHAoYFtcXD8mXSR7IHQgfT0oW14mI10qKWAsICdpJykuZXhlYyhpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gZSA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQoZVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IFJlZ0V4cChgKFs/Jl0pJHsgaSB9PS4qPygmfCQpYCwgJ2knKSwgbiA9IC0xICE9PSB0LmluZGV4T2YoJz8nKSA/ICcmJyA6ICc/JzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXRjaChzKSA/IGUgPyB0LnJlcGxhY2UocywgYCQxJHsgaSB9PSR7IGUgfSQyYCkgOiB0LnJlcGxhY2UocywgJyQxJykgOiBgJHsgdCB9JHsgbiB9JHsgaSB9PSR7IGUgfWA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbmRleE9mKCc/JykgPiAtMSA/ICcmJyA6ICc/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qocy5oKSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5kZXhPZignOi8vJykgPiAtMSA/IHQuc3BsaXQoJy8nKVsyXSA6IHQuc3BsaXQoJy8nKVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGModCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsgJ2h0dHAnICsgKC8oXC9zXC8pKy8udGVzdCh0LnJlcGxhY2UoaSwgJycpKSA/ICdzJyA6ICcnKSB9Oi8vJHsgaSB9YDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSB0LmluZGV4T2YobikgPyB0IDogKHQgPSAodCA9ICh0ID0gKHQgPSAodCA9ICh0ID0gKHQgPSB0LnJlcGxhY2UobiwgJycpKS5yZXBsYWNlKCd3d3ctJywgJ3d3dy4nKSkucmVwbGFjZSgnYW1wLScsICdhbXAuJykpLmNueF9yZXBsYWNlQWxsKCctLScsICc9JykpLmNueF9yZXBsYWNlQWxsKCctJywgJy4nKSkuY254X3JlcGxhY2VBbGwoJz0nLCAnLScpKS5yZXBsYWNlKCd3d3cuJywgJ2FtcC4nKSkuaW5kZXhPZignYW1wLicpID4gLTEgPyB0IDogdCA9ICh0ID0gdC5yZXBsYWNlKCdodHRwOi8vJywgJ2h0dHA6Ly9hbXAuJykpLnJlcGxhY2UoJ2h0dHBzOi8vJywgJ2h0dHBzOi8vYW1wLicpOwogICAgICAgICAgICAgICAgICAgIH0odCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSAvXmh0dHBzOlwvXC93d3cuZ29vZ2xlXC4uKj9cL2FtcFwvcypcLyovLmV4ZWModCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5yZXBsYWNlKGlbMF0sICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0odCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmluZGV4T2YobikgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgnaHR0cHM6Ly8nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gL15bXlwvXSsoXC9bYS16XStcLykrcypcLyovLCBlID0gaS50ZXN0KHQpID8gdC5yZXBsYWNlKGkuZXhlYyh0KVswXSwgJycpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0odCkpKSwgaSAmJiAodCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gdC5pbmRleE9mKCcjb3JpZ2luLScpICYmIC0xID09PSB0LmluZGV4T2YoJ3ZpZXdlclVybC0nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5zcGxpdCgnI29yaWdpbi0nKVsxXS5zcGxpdCgndmlld2VyVXJsLScpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSh0ID0gZGVjb2RlVVJJQ29tcG9uZW50KGlbMV0pLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfSh0KSksIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg2KTsKICAgICAgICAgICAgICAgIGNsYXNzIG4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBpID0ge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGlbdF0gfHwgKHRoaXMuUGlbdF0gPSBbXSksIHRoaXMuUGlbdF0ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYzogZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBpW3RdICYmICh0aGlzLlBpW3RdID0gdGhpcy5QaVt0XS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISh0LmNvbnRleHQgPT09IGkgJiYgKHQuZnVuYyA9PT0gZSB8fCAhZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlQWxsKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5QaSkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGlbaV0gPSB0aGlzLlBpW2ldLmZpbHRlcihpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jb250ZXh0ICE9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdWJsaXNoKHQsIGksIGUgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXlsb2FkOiB2b2lkIDAgfTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLlBpLCBpKSAmJiB0aGlzLlBpW2ldLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNvbnRleHQgPT09IHQgJiYgaS5mdW5jKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVsYXkodCwgaSwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qocy5tKSh0KS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUodCwgaSwgaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdWJsaXNoKGUsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWxheUJ1bGsodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF5KHQuY2hhbm5lbCwgdC5zb3VyY2UsIGksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBzID0gSlNPTi5wYXJzZSgneyJ2ZXJzaW9uIjoxMjQ4OTgsImRvbWFpblByZWZpeCI6IiIsImxvZ1RvQ29uc29sZSI6ZmFsc2UsImxvZ1RvU2VydmVyIjp0cnVlLCJlbnYiOiJwcm9kdWN0aW9uIn0nKSwgbiA9ICEwOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuQ21wQXBpID0gMF0gPSAnQ21wQXBpJywgdFt0LlRjZkFwaSA9IDFdID0gJ1RjZkFwaSc7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoNSksIHIgPSBlKDApLCBoID0gZSg4KSwgYSA9IGUoMSksIG8gPSBlKDE5KTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSAzMDAwMDsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGZ1bmN0aW9uICh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVybDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VHlwZTogZSA9ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogcyA9ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogbiA9ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogciA9ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLm9wZW4oZSwgdCwgITApLCBzLmxlbmd0aCA+IDAgJiYgaC5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBzKSwgbi5sZW5ndGggPiAwICYmIChoLnJlc3BvbnNlVHlwZSA9IG4pLCBoLnRpbWVvdXQgPSBpLCBoLndpdGhDcmVkZW50aWFscyA9IHIsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpLCBuID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5yZWFkeVN0YXRlID09PSBYTUxIdHRwUmVxdWVzdC5ET05FKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMjAwID09PSBzLnN0YXR1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQocy5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHMucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbi5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG5ldyBFcnJvcihgUmVxdWVzdCBmYWlsLiBzdGF0dXM6JHsgcy5zdGF0dXMgfSwgcmVhZHlTdGF0ZTokeyBzLnJlYWR5U3RhdGUgfSwgcmVzcG9uc2U6JHsgdCB9LCB0aW1lOiR7IGUgfWApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy5vbnRpbWVvdXQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbi5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShuZXcgRXJyb3IoYFJlcXVlc3QgdGltZW91dCBzdGF0dXM6JHsgcy5zdGF0dXMgfS4gdGltZTokeyB0IH1gKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLnNlbmQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBPYmplY3QoaC5rKShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcyB8fCBpICYmIDAgIT09IE9iamVjdC5rZXlzKGkpLmxlbmd0aCB8fCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2VtcHR5X3Byb3RvX3JlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogJ2VtcHR5X2Z1bmN0aW9uX2FyZ3VtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IHQuZnJvbU9iamVjdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzIHx8IGEgJiYgMCAhPT0gT2JqZWN0LmtleXMoYSkubGVuZ3RoIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnZW1wdHlfcHJvdG9fcmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiAnZW1wdHlfZnJvbU9iamVjdF9yZXN1bHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvID0gdC5lbmNvZGUoYSkuZmluaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXMgfHwgbyAmJiAwICE9PSBPYmplY3Qua2V5cyhvKS5sZW5ndGggfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdlbXB0eV9wcm90b19yZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6ICdlbXB0eV9lbmNvZGVfcmVzdWx0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBKU09OLnN0cmluZ2lmeShpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJvdG9idWZfZW5jb2RlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyh0LCBpLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdQT1NUJzsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBoLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzLCBoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50aGVuKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaSA/IG5ldyBVaW50OEFycmF5KGkpIDogbmV3IFVpbnQ4QXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdC50b09iamVjdCh0LmRlY29kZShzKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGAkeyBlIH1fXyR7IHQubWVzc2FnZSB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Byb3RvYnVmX2RlY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIGEuZXJyb3JNZXNzYWdlICYmICc1MDAnID09PSBhLmVycm9yTWVzc2FnZSAmJiBoKGEuZXJyb3JNZXNzYWdlKSwgcyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFR5cGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogJ1BPU1QnID09PSBzID8gJ211bHRpcGFydC9mb3JtLWRhdGEnIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCksIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0LmZldGNoWE1MUmVxdWVzdCA9IGZ1bmN0aW9uICh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVybDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogaQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRoZW4oaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5zZW5kUHJvdG9SZXF1ZXN0ID0gZnVuY3Rpb24gKHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9SZXNwb25zZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9SZXF1ZXN0OiBpLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiBsLAogICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBmLAogICAgICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcjogcAogICAgICAgICAgICAgICAgICAgIH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IGUgPyBzKGksIGUsIHUpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGModCwgdSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGEuZikoaSkgPyAoT2JqZWN0LmtleXMoaSkuZm9yRWFjaChlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IE9iamVjdChvLmUpKHQsIGUsIGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSh1LCBmKSwgbCwgYiwgZCkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBwICYmIE9iamVjdChoLmspKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1hocl9lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogYCR7IHQgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuZXcgRXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIHQuc2VuZFByb3RvQmVhY29uUmVxdWVzdCA9IGZ1bmN0aW9uICh7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvUmVxdWVzdDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IGksCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiBlCiAgICAgICAgICAgICAgICAgICAgfSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gaSA/IHModCwgaSwgZSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF2aWdhdG9yLnNlbmRCZWFjb24oZSwgbik7CiAgICAgICAgICAgICAgICAgICAgfSwgdC50cmFja1BpeGVsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZSgpLnNyYyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnWGhyX3RyYWNrUGl4ZWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbjsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2QnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQ2hyb21lID0gJ2Nocm9tZScsIHQuRmlyZWZveCA9ICdmaXJlZm94JywgdC5FZGdlID0gJ2VkZ2UnLCB0LlNhZmFyaSA9ICdzYWZhcmknLCB0Lk9wZXJhID0gJ29wZXJhJywgdC5TYW1zdW5nID0gJ3NhbXN1bmcnLCB0LkZhY2Vib29rID0gJ2ZhY2Vib29rJywgdC5JbnRlcm5ldEV4cGxvcmVyID0gJ2llJzsKICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5TdGFuZGFyZCA9ICdzdGFuZGFyZCcsIHQuV2Via2l0ID0gJ3dlYmtpdCcsIHQuTW96ID0gJ21veicsIHQuTXMgPSAnbXMnLCB0Lk8gPSAnbyc7CiAgICAgICAgICAgICAgICB9KG4gfHwgKG4gPSB7fSkpOwogICAgICAgICAgICAgICAgY29uc3QgciA9IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG4uU3RhbmRhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgIGtleXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5FbmFibGVkOiAnZnVsbHNjcmVlbkVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbkVsZW1lbnQ6ICdmdWxsc2NyZWVuRWxlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RnVsbHNjcmVlbjogJ3JlcXVlc3RGdWxsc2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRGdWxsc2NyZWVuOiAnZXhpdEZ1bGxzY3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbmNoYW5nZTogJ2Z1bGxzY3JlZW5jaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbmVycm9yOiAnZnVsbHNjcmVlbmVycm9yJwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG4uV2Via2l0LAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsc2NyZWVuRW5hYmxlZDogJ3dlYmtpdEZ1bGxzY3JlZW5FbmFibGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5FbGVtZW50OiAnd2Via2l0RnVsbHNjcmVlbkVsZW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEZ1bGxzY3JlZW46ICd3ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0RnVsbHNjcmVlbjogJ3dlYmtpdEV4aXRGdWxsc2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5jaGFuZ2U6ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5lcnJvcjogJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvcicKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLldlYmtpdCwKICAgICAgICAgICAgICAgICAgICAgICAga2V5czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbkVuYWJsZWQ6ICd3ZWJraXRTdXBwb3J0c0Z1bGxzY3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbkVsZW1lbnQ6ICd3ZWJraXRGdWxsc2NyZWVuRWxlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RnVsbHNjcmVlbjogJ3dlYmtpdEVudGVyRnVsbHNjcmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0RnVsbHNjcmVlbjogJ3dlYmtpdEV4aXRGdWxsc2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5jaGFuZ2U6ICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5lcnJvcjogJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvcicKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLk1veiwKICAgICAgICAgICAgICAgICAgICAgICAga2V5czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbkVuYWJsZWQ6ICdtb3pGdWxsU2NyZWVuRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsc2NyZWVuRWxlbWVudDogJ21vekZ1bGxTY3JlZW5FbGVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RGdWxsc2NyZWVuOiAnbW96UmVxdWVzdEZ1bGxTY3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdEZ1bGxzY3JlZW46ICdtb3pDYW5jZWxGdWxsU2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5jaGFuZ2U6ICdtb3pmdWxsc2NyZWVuY2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5lcnJvcjogJ21vemZ1bGxzY3JlZW5lcnJvcicKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLk1zLAogICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsc2NyZWVuRW5hYmxlZDogJ21zRnVsbHNjcmVlbkVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbkVsZW1lbnQ6ICdtc0Z1bGxzY3JlZW5FbGVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RGdWxsc2NyZWVuOiAnbXNSZXF1ZXN0RnVsbHNjcmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0RnVsbHNjcmVlbjogJ21zRXhpdEZ1bGxzY3JlZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlbmNoYW5nZTogJ01TRnVsbHNjcmVlbkNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsc2NyZWVuZXJyb3I6ICdNU0Z1bGxzY3JlZW5FcnJvcicKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB2YXIgaDsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuU2VsZiA9ICdfc2VsZicsIHQuQmxhbmsgPSAnX2JsYW5rJywgdC5QYXJlbnQgPSAnX3BhcmVudCcsIHQuVG9wID0gJ190b3AnOwogICAgICAgICAgICAgICAgfShoIHx8IChoID0ge30pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnaicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2cnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHMgPSAnMS4zLjEzLWlhYjIzNDMnLCBuID0gJzEuMy4xMy1pYWIyMzQzJywgciA9ICdDb25uYXRpeCc7CiAgICAgICAgICAgICAgICB2YXIgaCwgYSwgbywgYywgdSwgbCwgZCwgZjsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuR2VuZXJpYyA9ICdnZW5lcmljJywgdC5WaWRlbyA9ICd2aWRlbyc7CiAgICAgICAgICAgICAgICB9KGggfHwgKGggPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQ2xpY2sgPSAnY2xpY2snLCB0Lkludml0YXRpb25BY2NlcHQgPSAnaW52aXRhdGlvbkFjY2VwdCc7CiAgICAgICAgICAgICAgICB9KGEgfHwgKGEgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuUHJlUm9sbCA9ICdwcmVyb2xsJywgdC5NaWRSb2xsID0gJ21pZHJvbGwnLCB0LlBvc3RSb2xsID0gJ3Bvc3Ryb2xsJywgdC5TdGFuZGFsb25lID0gJ3N0YW5kYWxvbmUnOwogICAgICAgICAgICAgICAgfShvIHx8IChvID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LlNlc3Npb25TdGFydCA9ICdzZXNzaW9uU3RhcnQnLCB0LlNlc3Npb25FcnJvciA9ICdzZXNzaW9uRXJyb3InLCB0LlNlc3Npb25GaW5pc2ggPSAnc2Vzc2lvbkZpbmlzaCc7CiAgICAgICAgICAgICAgICB9KGMgfHwgKGMgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuRGVmaW5lZEJ5SmF2YXNjcmlwdCA9ICdkZWZpbmVkQnlKYXZhU2NyaXB0JywgdC5CZWdpblRvUmVuZGVyID0gJ2JlZ2luVG9SZW5kZXInOwogICAgICAgICAgICAgICAgfSh1IHx8ICh1ID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkRlZmluZWRCeUphdmFzY3JpcHQgPSAnZGVmaW5lZEJ5SmF2YVNjcmlwdCcsIHQuVmlkZW8gPSAndmlkZW8nOwogICAgICAgICAgICAgICAgfShsIHx8IChsID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LnNlc3Npb25FcnJvciA9ICdzZXNzaW9uRXJyb3InLCB0Lmdlb21ldHJ5Q2hhbmdlID0gJ2dlb21ldHJ5Q2hhbmdlJzsKICAgICAgICAgICAgICAgIH0oZCB8fCAoZCA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5iYWNrZ3JvdW5kZWQgPSAnYmFja2dyb3VuZGVkJywgdC5ub3RGb3VuZCA9ICdub3RGb3VuZCc7CiAgICAgICAgICAgICAgICB9KGYgfHwgKGYgPSB7fSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgcyA9IDIwMCwgbiA9IDAuOSwgciA9IDEuMSwgaCA9IDMxLCBhID0gMjAwMCwgbyA9IDEwMDAsIGMgPSAwLjUsIHUgPSAnY29ubmF0aXguY29tJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQ29ubmF0aXggPSAnMTQzJywgdC5BcHBOZXh1cyA9ICczMicsIHQuRGlzdHJpY3RNID0gJzE0NCcsIHQuSW5kZXhFeGNoYW5nZSA9ICcxMCcsIHQuTGtxZCA9ICcyMzcnLCB0Lk9uZVZpZGVvID0gJzI1JywgdC5PcGVueCA9ICc2OScsIHQuUHVibWF0aWMgPSAnNzYnLCB0LlJoeXRobU9uZSA9ICczNicsIHQuUnViaWNvbiA9ICc1MicsIHQuU3BvdHggPSAnMTY1JywgdC5UZWxhcmlhID0gJzIwMicsIHQuTWVkaWFOZXQgPSAnMTQyJywgdC5BZE1hbiA9ICcxNDknLCB0Lklyb25Tb3VyY2UgPSAnJywgdC5VbmRlcnRvbmUgPSAnNjc3JywgdC5TeW5hY29yTWVkaWEgPSAnJywgdC5BbXhSVEIgPSAnNzM3JywgdC5TbWFhdG8gPSAnODInOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IG4gPSAnY254X3Vzcl9zdG9yYWdlJywgciA9IFsnMVlOWSddOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgxKSwgbiA9IGUoMTEpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0KSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGksIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmcpKHQpICYmIChpID0gdC5tYXRjaChuLmIpKSAmJiAoZSA9IHBhcnNlSW50KGlbMV0sIDEwKSAqIG4uZCArIHBhcnNlSW50KGlbMl0sIDEwKSAqIG4uZSArIHBhcnNlSW50KGlbM10sIDEwKSAqIG4uZiArIHBhcnNlSW50KGlbNV0gfHwgMCwgMTApKSwgaXNOYU4oZSkgPyBudWxsIDogZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAvXlxkKyhcLlxkKyk/JSQvZy50ZXN0KHQpID8gaSA/IGkgKiBwYXJzZUZsb2F0KHQucmVwbGFjZSgnJScsICcnKSkgLyAxMDAgOiBudWxsIDogcih0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpICsgdCAqIG4uYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc6JzsKICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID49IDEwID8gdCA6IGAwJHsgdCB9YDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsgZShNYXRoLmZsb29yKHQgLyA2MCkpIH0keyBpIH0keyBlKE1hdGguZmxvb3IodCAlIDYwKSkgfWA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShlIDwgdCB8fCBlID4gaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFRpbWUoKSAtIDEwMDAgKiB0LmdldFRpbWV6b25lT2Zmc2V0KCkgKiA2MDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xhc3MgcyB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzLk1heExvZ092ZXJmbG93ID0gMTAwMCwgcy5tYXhMb2dPdmVyZmxvd0NvdW50ID0ge30sIHMubG9nQ291bnQgPSB7fSwgcy5tYXhMb2dTZW50ID0ge30sIHMuc2Vzc2lvbklkID0gJycsIHMucGFnZUZvY3VzID0gITEsIHMuaW5jcmVtZW50TG9nQ291bnQgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICBzLmxvZ0NvdW50W3RdID8gKCsrcy5tYXhMb2dPdmVyZmxvd0NvdW50W3RdLCArK3MubG9nQ291bnRbdF0pIDogKHMubG9nQ291bnRbdF0gPSAxLCBzLm1heExvZ092ZXJmbG93Q291bnRbdF0gPSAxKTsKICAgICAgICAgICAgICAgIH0sIHMuaXNNYXhMb2cgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIShzLmxvZ0NvdW50W3RdICYmIHMubG9nQ291bnRbdF0gPiBpKTsKICAgICAgICAgICAgICAgIH0sIHMuaXNNYXhMb2dPdmVyZmxvdyA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzLm1heExvZ092ZXJmbG93Q291bnRbdF0gPiBzLk1heExvZ092ZXJmbG93ICYmIChzLm1heExvZ092ZXJmbG93Q291bnRbdF0gPSAxLCAhMCk7CiAgICAgICAgICAgICAgICB9LCBzLnNldE1heExvZ1NlbnQgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICBzLm1heExvZ1NlbnRbdF0gPSAhMDsKICAgICAgICAgICAgICAgIH0sIHMuaXNNYXhMb2dTZW50ID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcy5tYXhMb2dTZW50W3RdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICB9KSwgZS5kKGksICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoOCksIG4gPSBlKDEpOwogICAgICAgICAgICAgICAgY29uc3QgciA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2ldOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KGkpICYmICdzdHJpbmcnID09IHR5cGVvZiB0W2ldICYmICh0W2ldID0gYCUyMiR7IGVuY29kZVVSSUNvbXBvbmVudCh0W2ldKSB9JTIyYCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpLmNueF9yZXBsYWNlQWxsKCciJywgJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qobi5mKSh0KSB8fCAhT2JqZWN0KG4uZikoaSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCksIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZW5ndGggPT09IHIubGVuZ3RoICYmIGUuZXZlcnkoZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5pKSh0W2VdLCBpW2VdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IHMgPSAnaHR0cHM6Ly9jb25uYXRpeC5jb20vcHJpdmFjeS1wb2xpY3kvJywgbiA9ICd2JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHModCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSB8fCAoaVtlXSA9IHRbZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSksIHMoZSgxMzQpKSwgcyhlKDEzNSkpLCBzKGUoMTM2KSksIHMoZSgxMzcpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNsYXNzIHMgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcy5jbGllbnRBYjAgPSAwLCBzLmNsaWVudEFiMSA9IDA7CiAgICAgICAgICAgICAgICBjbGFzcyBuIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgbi5jbGllbnRBYjAgPSAwLCBuLmNsaWVudEFiMSA9IDAsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LkVsZW1lbnRzQUJTZXJ2aWNlID0gMF0gPSAnRWxlbWVudHNBQlNlcnZpY2UnLCB0W3QuUGxheXNwYWNlQUJTZXJ2aWNlID0gMV0gPSAnUGxheXNwYWNlQUJTZXJ2aWNlJzsKICAgICAgICAgICAgICAgIH0ociB8fCAociA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBoIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0IGNsaWVudEFiMCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QUJWYWx1ZUZvcktleSgnY2xpZW50QWIwJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXQgY2xpZW50QWIxKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBQlZhbHVlRm9yS2V5KCdjbGllbnRBYjEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldEFCVmFsdWVGb3JLZXkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuYWJTZXJ2aWNlVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHIuUGxheXNwYWNlQUJTZXJ2aWNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHModCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSB8fCAoaVtlXSA9IHRbZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSksIHMoZSg2NikpLCBzKGUoMTM4KSksIHMoZSg2NykpLCBzKGUoNjgpKSwgcyhlKDEzOSkpLCBzKGUoNTYpKSwgcyhlKDY5KSksIHMoZSgxNDApKSwgcyhlKDE0MSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoOSksIG4gPSBlKDMpLCByID0gZSg3KTsKICAgICAgICAgICAgICAgIGNsYXNzIGggewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBNaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGguRWk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLkVpKyssIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBMaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLlJpW3RdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgQmkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLlJpW3QuYWR2ZXJ0aXNlckxpbmVJdGVtSWRdICYmIGguYWRkQ3VzdG9tSGlzdG9yeUxpbmUoJ2R1cGxpY2F0ZScsIHsgaWQ6IHQuYWR2ZXJ0aXNlckxpbmVJdGVtSWQgfSksIGguUmlbdC5hZHZlcnRpc2VyTGluZUl0ZW1JZF0gPSBoLk1pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgRGkodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiB0LmFkdmVydGlzZXJMaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlVHlwZTogdC5jcmVhdGl2ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRpbWVvdXQ6IHQuaW1wcmVzc2lvblRpbWVTcGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbVByaW9yaXR5OiB0LmxpbmVJdGVtUHJpb3JpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU2l6ZTogdC5wbGF5ZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDYXA6IHQucmVxdWVzdENhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDogdC5zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eTogdC52aWV3YWJpbGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBzZXRDbGllbnRTaWRlQWRMaXN0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaC5GaSAmJiAoaC5WaSA9IGguRGkoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpLCBoLkJpKGguVmkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIHNldFJ0YkFkTGlzdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGguRmkgJiYgKGguVWkgPSBoLkRpKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpKSwgaC5CaShoLlVpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBzZXRIZWFkZXJCaWRkZXJBZExpc3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICBoLkZpICYmIChoLiRpID0gaC5EaShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKSksIGguQmkoaC4kaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0VGFtQWRMaXN0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaC5GaSAmJiAoaC5OaSA9IGguRGkoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpLCBoLkJpKGguTmkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIHNldExpbmVJdGVtU3RhdHVzKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoLkZpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaC5MaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaC5IaS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdGF0dXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHMuYVtpXQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIHNldFZwYWlkRXZlbnQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaC5GaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGguTGkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmIuQWRMb2FkZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmIuQWRTdGFydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugbi5iLkFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmIuQWRTa2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugbi5iLkFkU3RvcHBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG4uYi5BZFBhdXNlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG4uYi5BZFBsYXlpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLkhpLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZwYWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0Vmlld2FiaWxpdHlTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGguRmkgJiYgaC5IaS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmlldzogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIHNldEZvY3VzU3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBoLkZpICYmIGguSGkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZm9jdXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WaWV3OiB0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0QWRTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGguRmkgJiYgaC5IaS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdhZFN0YXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiByLlByb3RvQWRTbG90c0VudW1bdF0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBlbmZvcmNlckFjdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGguRmkgJiYgaC5IaS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbmZvcmNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBhZGRDdXN0b21IaXN0b3J5TGluZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGguRmkgJiYgaC5IaS5wdXNoKE9iamVjdC5hc3NpZ24oeyB0eXBlOiB0IH0sIGkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldEpzb25TdHJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLkZpID8gSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QWRMaXN0OiBoLlZpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiQWRMaXN0OiBoLlVpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyQmlkZGVyQWRMaXN0OiBoLiRpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkQWRMaXN0OiBoLlJpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeTogaC5IaQogICAgICAgICAgICAgICAgICAgICAgICB9KS5zdWJzdHJpbmcoMCwgaC5xaSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIHBsYXllckRlc3Ryb3llZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56aSA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaXNQbGF5ZXJEZXN0cm95ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnppOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGguRmkgPSBEYXRlLm5vdygpIC0gMTU4MTA5MzkxNzUzNyA8IDAsIGgucWkgPSA1MDAwMCwgaC5FaSA9IDAsIGguUmkgPSB7fSwgaC5WaSA9IFtdLCBoLlVpID0gW10sIGguJGkgPSBbXSwgaC5OaSA9IFtdLCBoLkhpID0gW10sIGguemkgPSAhMTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlAxID0gMV0gPSAnUDEnLCB0W3QuUDIgPSAyXSA9ICdQMicsIHRbdC5QMyA9IDNdID0gJ1AzJywgdFt0LlA0ID0gNF0gPSAnUDQnLCB0W3QuUDUgPSA1XSA9ICdQNScsIHRbdC5QNiA9IDZdID0gJ1A2JywgdFt0LlA3ID0gN10gPSAnUDcnLCB0W3QuUDggPSA4XSA9ICdQOCcsIHRbdC5QOSA9IDldID0gJ1A5JywgdFt0LlAxMCA9IDEwXSA9ICdQMTAnOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xhc3MgcyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV2kgPSAhMSwgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2UoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2kgPSB0LCB0aGlzLkppID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFpKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLldpIHx8ICh0aGlzLldpID0gITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RaSgpLCB0aGlzLkdpKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWplY3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFpKCksIHRoaXMuSmkodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpc1BlbmRpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5XaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSBPYmplY3Qua2V5cyhpKSwgbiA9IDA7IG4gPCBzLmxlbmd0aDsgKytuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSB0W3Nbbl1dICYmIGUgfHwgKHRbc1tuXV0gPSBpW3Nbbl1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGkodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ21lc3NhZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGkpIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdzdGFjaycsIHsgdmFsdWU6IG5ldyBFcnJvcigpLnN0YWNrIHx8ICcnIH0pLCBlICYmIG4odGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSkuY29uc3RydWN0b3IgPSBpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICduYW1lJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAnOiAnICsgdGhpcy5tZXNzYWdlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzLmFzUHJvbWlzZSA9IGUoMTIxKSwgcy5iYXNlNjQgPSBlKDEyMiksIHMuRXZlbnRFbWl0dGVyID0gZSgxMjMpLCBzLmZsb2F0ID0gZSgxMjQpLCBzLmlucXVpcmUgPSBlKDEyNSksIHMudXRmOCA9IGUoMTI2KSwgcy5wb29sID0gZSgxMjcpLCBzLkxvbmdCaXRzID0gZSgxMjgpLCBzLmlzTm9kZSA9IEJvb2xlYW4odm9pZCAwICE9PSB0ICYmIHQgJiYgdC5wcm9jZXNzICYmIHQucHJvY2Vzcy52ZXJzaW9ucyAmJiB0LnByb2Nlc3MudmVyc2lvbnMubm9kZSksIHMuZ2xvYmFsID0gcy5pc05vZGUgJiYgdCB8fCAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdyB8fCAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygc2VsZiAmJiBzZWxmIHx8IHRoaXMsIHMuZW1wdHlBcnJheSA9IE9iamVjdC5mcmVlemUgPyBPYmplY3QuZnJlZXplKFtdKSA6IFtdLCBzLmVtcHR5T2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSA/IE9iamVjdC5mcmVlemUoe30pIDoge30sIHMuaXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgPT0gdHlwZW9mIHQgJiYgaXNGaW5pdGUodCkgJiYgTWF0aC5mbG9vcih0KSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICB9LCBzLmlzU3RyaW5nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiB0IHx8IHQgaW5zdGFuY2VvZiBTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfSwgcy5pc09iamVjdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdvYmplY3QnID09IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgICAgIH0sIHMuaXNzZXQgPSBzLmlzU2V0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0W2ldOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShudWxsID09IGUgfHwgIXQuaGFzT3duUHJvcGVydHkoaSkpICYmICgnb2JqZWN0JyAhPSB0eXBlb2YgZSB8fCAoQXJyYXkuaXNBcnJheShlKSA/IGUubGVuZ3RoIDogT2JqZWN0LmtleXMoZSkubGVuZ3RoKSA+IDApOwogICAgICAgICAgICAgICAgICAgIH0sIHMuQnVmZmVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzLmlucXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS51dGY4V3JpdGUgPyB0IDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KCksIHMuWGkgPSBudWxsLCBzLllpID0gbnVsbCwgcy5uZXdCdWZmZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgPT0gdHlwZW9mIHQgPyBzLkJ1ZmZlciA/IHMuWWkodCkgOiBuZXcgcy5BcnJheSh0KSA6IHMuQnVmZmVyID8gcy5YaSh0KSA6ICd1bmRlZmluZWQnID09IHR5cGVvZiBVaW50OEFycmF5ID8gdCA6IG5ldyBVaW50OEFycmF5KHQpOwogICAgICAgICAgICAgICAgICAgIH0sIHMuQXJyYXkgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgVWludDhBcnJheSA/IFVpbnQ4QXJyYXkgOiBBcnJheSwgcy5Mb25nID0gcy5nbG9iYWwuZGNvZGVJTyAmJiBzLmdsb2JhbC5kY29kZUlPLkxvbmcgfHwgcy5nbG9iYWwuTG9uZyB8fCBzLmlucXVpcmUoJ2xvbmcnKSwgcy5rZXkyUmUgPSAvXnRydWV8ZmFsc2V8MHwxJC8sIHMua2V5MzJSZSA9IC9eLT8oPzowfFsxLTldWzAtOV0qKSQvLCBzLmtleTY0UmUgPSAvXig/OltcXHgwMC1cXHhmZl17OH18LT8oPzowfFsxLTldWzAtOV0qKSkkLywgcy5sb25nVG9IYXNoID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBzLkxvbmdCaXRzLmZyb20odCkudG9IYXNoKCkgOiBzLkxvbmdCaXRzLnplcm9IYXNoOwogICAgICAgICAgICAgICAgICAgIH0sIHMubG9uZ0Zyb21IYXNoID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzLkxvbmdCaXRzLmZyb21IYXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5Mb25nID8gcy5Mb25nLmZyb21CaXRzKGUubG8sIGUuaGksIGkpIDogZS50b051bWJlcihCb29sZWFuKGkpKTsKICAgICAgICAgICAgICAgICAgICB9LCBzLm1lcmdlID0gbiwgcy5sY0ZpcnN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB0LnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgICAgICB9LCBzLm5ld0Vycm9yID0gciwgcy5Qcm90b2NvbEVycm9yID0gcignUHJvdG9jb2xFcnJvcicpLCBzLm9uZU9mR2V0dGVyID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHt9LCBlID0gMDsgZSA8IHQubGVuZ3RoOyArK2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW3RbZV1dID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyh0aGlzKSwgZSA9IHQubGVuZ3RoIC0gMTsgZSA+IC0xOyAtLWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IGlbdFtlXV0gJiYgdm9pZCAwICE9PSB0aGlzW3RbZV1dICYmIG51bGwgIT09IHRoaXNbdFtlXV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHMub25lT2ZTZXR0ZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgdC5sZW5ndGg7ICsrZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdICE9PSBpICYmIGRlbGV0ZSB0aGlzW3RbZV1dOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHMudG9KU09OT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ3M6IFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgZW51bXM6IFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXM6IFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAganNvbjogITAKICAgICAgICAgICAgICAgICAgICB9LCBzLktpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMuQnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICB0ID8gKHMuWGkgPSB0LmZyb20gIT09IFVpbnQ4QXJyYXkuZnJvbSAmJiB0LmZyb20gfHwgZnVuY3Rpb24gKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdChpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy5ZaSA9IHQuYWxsb2NVbnNhZmUgfHwgZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBzLlhpID0gcy5ZaSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0uY2FsbCh0aGlzLCBlKDYyKSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzMpLCBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiAodCA9IHBhcnNlSW50KHQsIDEwKSksIChlID0gdC50b1N0cmluZygyKSkubGVuZ3RoID4gaSB8fCB0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcy5FbmNvZGluZ0Vycm9yKHQgKyAnIHRvbyBsYXJnZSB0byBlbmNvZGUgaW50byAnICsgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sZW5ndGggPCBpICYmIChlID0gJzAnLnJlcGVhdChpIC0gZS5sZW5ndGgpICsgZSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSB0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgcy5EZWNvZGluZ0Vycm9yKCdpbnZhbGlkIGJpdCBsZW5ndGgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0LCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBpLkludEVuY29kZXIgPSBuOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzICYmIHRoaXMuWmkgfHwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IsIGUgPSBpICYmIHRbaV0sIHMgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmICdudW1iZXInID09IHR5cGVvZiB0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiBzID49IHQubGVuZ3RoICYmICh0ID0gdm9pZCAwKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCAmJiB0W3MrK10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGkgPyAnT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS4nIDogJ1N5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC4nKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBpID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdC5kZWVwQ2xvbmUodFtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHMgJiYgKGlbZV0gPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuZGVlcENsb25lID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGUsIG4gPSB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInID09PSBuIHx8ICdzdHJpbmcnID09PSBuIHx8ICdib29sZWFuJyA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gdCAmJiAnb2JqZWN0JyA9PT0gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHQuY2xvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2xvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgRGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodC5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gdFtTeW1ib2wuaXRlcmF0b3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoID0gcyh0KSwgYSA9IGgubmV4dCgpOyAhYS5kb25lOyBhID0gaC5uZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gYS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaCh0aGlzLmRlZXBDbG9uZShvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB7IGVycm9yOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgIWEuZG9uZSAmJiAoZSA9IGgucmV0dXJuKSAmJiBlLmNhbGwoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgQXJyYXkgPyByIDogbmV3IHQuY29uc3RydWN0b3Iocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkodSkgJiYgKGNbdV0gPSB0aGlzLmRlZXBDbG9uZSh0W3VdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBpLkNsb25lYWJsZSA9IG47CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQucHJlYmlkID0gJ3ByZWJpZCcsIHQuYmlkID0gJ2JpZCcsIHQud2luID0gJ3dpbicsIHQuaW1wcmVzc2lvbiA9ICdpbXByZXNzaW9uJywgdC52aWV3YWJsZUltcHJlc3Npb24gPSAndmlld2FibGVJbXByZXNzaW9uJywgdC5wb3N0YmlkID0gJ3Bvc3RiaWQnLCB0LmluaXRBZCA9ICdpbml0QWQnLCB0LnJlcXVlc3QgPSAncmVxdWVzdCc7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGUuZChpLCAnYicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSBlKDApOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlByZVJvbGwgPSAwXSA9ICdQcmVSb2xsJywgdFt0Lk1pZFJvbGwgPSAxXSA9ICdNaWRSb2xsJywgdFt0LlBvc3RSb2xsID0gMl0gPSAnUG9zdFJvbGwnLCB0W3QuU3RhbmRhbG9uZSA9IDNdID0gJ1N0YW5kYWxvbmUnOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB7CiAgICAgICAgICAgICAgICAgICAgW24uUHJvdG9BZFNsb3RzRW51bS5QcmVSb2xsXTogcy5QcmVSb2xsLAogICAgICAgICAgICAgICAgICAgIFtuLlByb3RvQWRTbG90c0VudW0uTWlkUm9sbF06IHMuTWlkUm9sbCwKICAgICAgICAgICAgICAgICAgICBbbi5Qcm90b0FkU2xvdHNFbnVtLlBvc3RSb2xsXTogcy5Qb3N0Um9sbAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg0NSksIG4gPSBlKDApLCByID0gZSgxNCksIGggPSBlKDEpLCBhID0gZSg1KTsKICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBuZXcgcy5hKG4uUHJvdG9BZERvbWFpbkJsb2NraW5nUmVzcG9uc2UsICdBZERvbWFpbkJsb2NraW5nU2VydmljZScpLCBjID0gMjsKICAgICAgICAgICAgICAgIGxldCB1OwogICAgICAgICAgICAgICAgY29uc3QgbCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIHUgfHwgKHUgPSBuZXcgUHJvbWlzZShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZmluZCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrZWREb21haW5zUmV2aXNpb25OdW1iZXI6IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBlLCB1ID0gYCR7IHIuYS5lbmRQb2ludHMuYmFzZS5saW5lSXRlbXMgfSR7IHMgfS9ibG9ja2VkRG9tYWluc18keyBoIH0uYmluYDsKICAgICAgICAgICAgICAgICAgICAgICAgby5mZXRjaE1ldGFkYXRhKHUsIGMpLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnNldChzLCB0LmRvbWFpbnMpLCBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWREb21haW5CbG9ja2luZ1NlcnZpY2VfZmV0Y2hCbG9ja2VkRG9tYWluc19lbmRwb2ludF91bmF2YWlsYWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IG4uUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChoLmgpKGkpID8gdS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuaGFzKHQpICYmIGwuZ2V0KHQpLnNvbWUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaW5jbHVkZXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA/IGUoITApIDogZSghMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZSghMSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgwKSwgbiA9IGUoOCksIHIgPSBlKDUpLCBoID0gZSgxKSwgYSA9IGUoMjMpOwogICAgICAgICAgICAgICAgY2xhc3MgbyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlID0gdCwgdGhpcy5pZSA9IGksIHRoaXMuZWUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5zZW5kUHJvdG9SZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9SZXNwb25zZTogdGhpcy50ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZXRjaE1ldGFkYXRhKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZSwgcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uaikoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSkudGhlbihpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KGguZikoaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgRXJyb3IoJ2ludmFsaWQgbWV0YWRhdGEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2UodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdChoLmgpKG51bGwgPT09IChpID0gdC5lKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLm1lc3NhZ2UpID8gdC5lLm1lc3NhZ2UgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IGUuaW5kZXhPZignWGhyVXRpbHNfWE1MSHR0cFJlcXVlc3RfZXJyb3InKSAmJiBPYmplY3Qoci5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTWVkaWFNZXRhZGF0YUhhbmRsZXJfZmV0Y2hNZXRhZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGAkeyB0aGlzLmllIH1fJHsgZSB9OiR7IEpTT04uc3RyaW5naWZ5KHQpIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LmUgJiYgdC5lLnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHMuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICt0ICsgJyc7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzEnID09PSB0OwogICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBpLkJvb2xlYW5FbmNvZGVyID0gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSBlKDUwKSwgciA9IGUoMiksIGggPSBlKDgpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZEJhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFubmVyLXNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWJjX2Jhbm5lcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFubmVyX1RvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRfY29udGFpbmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJfMzAweDI1MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHViXzMwMHgyNTBtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdWJfNzI4eDkwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWFkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0X2FkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0QWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtYWQtbGlua3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHRfYWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LWFkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1hZC1saW5rcycKICAgICAgICAgICAgICAgICAgICAgICAgXSwgZSA9ICdjbnh0ZXN0YWRibG9jaycsIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gaS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxzdHlsZT4uYWRCYW5uZXJ7YmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IGhlaWdodDogMXB4ICFpbXBvcnRhbnQ7IHdpZHRoOiAxcHggIWltcG9ydGFudDsgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7IGxlZnQ6IC0xMDAwMHB4ICFpbXBvcnRhbnQ7IHRvcDogLTEwMDBweCAhaW1wb3J0YW50OyBkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQ7IH08L3N0eWxlPjxkaXYgaWQ9IiR7IGUgfSIgY2xhc3M9IiR7IHQgfSI+PC9kaXY+YDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IHsgc3JjOiBuLmEgfTsKICAgICAgICAgICAgICAgICAgICB0LmRldGVjdFVzaW5nQ1NTID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHQuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgJiYgMCAhPT0gbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB8fCAoaSA9ICEwKSwgdC5kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG4pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCB0LmRldGVjdFVzaW5nU2NyaXB0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gT2JqZWN0KGguZikod2luZG93KS50b3BGcmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZ29vZ2xldGFnICYmIHQoITEpLCBPYmplY3Qoci54KShhLCBpLmRvY3VtZW50LmhlYWQsIGksICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5nb29nbGV0YWcgPyB0KCExKSA6IHQoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg4KSwgbiA9IGUoMjgpLCByID0gZSgyMyksIGggPSBlKDApLCBhID0gZSgxNCksIG8gPSBlKDEpLCBjID0gZSgzMiksIHUgPSBlKDIxKTsKICAgICAgICAgICAgICAgIGNsYXNzIGwgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZSA9IHQsIHRoaXMucmUgPSAhMCwgdGhpcy5oZSA9ICcnLCB0aGlzLmFlID0gITEsIHRoaXMuY2UgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldEluc3RhbmNlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG4uYSwgZSA9IE9iamVjdChzLmYpKHQpLnRvcEZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtpXSB8fCAoZVtpXSA9IG5ldyBsKGUpKSwgZVtpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHVzZXJJZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChvLmgpKHRoaXMudWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudWUuc3BsaXQoJ18nKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IHVzZXJJZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudWUgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNDY3BhQXBwbGljYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBpc0NjcGFBcHBsaWNhYmxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB1c1ByaXZhY3lTdHJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgdXNQcml2YWN5U3RyaW5nKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjb25zZW50UGF5bG9hZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBjb25zZW50UGF5bG9hZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGUgfHwgKHRoaXMubGUgPSB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0U2NvcGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzeW5jRGVtYW5kUGFydG5lcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZXJJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IHRoaXMudXNlcklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbWFuZFBhcnRuZXI6IHBhcnNlSW50KHQuZGVtYW5kUGFydG5lciwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbWFuZFBhcnRuZXJVc2VySWQ6IHQuZGVtYW5kUGFydG5lclVzZXJJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYS5zZW5kUHJvdG9SZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGguUHJvdG9Vc2VyU3luY1JlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGEuYS5lbmRQb2ludHMuYXBpLnN5bmNVcmxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IFtjLmJdOiB1LmEudmVyc2lvbiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQbHNDYWxsKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWUgPyAodGhpcy5jZS5wdXNoKHQpLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy51c2VySWQgPyAodCgpLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHRoaXMuYWUgPSAhMCwgdCgpLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFlID0gITEsIHRoaXMuY2UuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuY2UgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGQsIGYgPSBlKDI5KSwgcCA9IGUoNSksIGIgPSBlKDYpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5VU0VSX0lEID0gJ2NueF91c2VySWQnOwogICAgICAgICAgICAgICAgfShkIHx8IChkID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIHYgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZSA9IHQsIHRoaXMuZmUgPSBpLCB0aGlzLnBlID0geyBbZC5VU0VSX0lEXTogMzAgfSwgdGhpcy5iZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGYWNlYm9vayBBcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dvb2dsZSBBcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZsaXBib2FyZCBBcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luc3RhZ3JhbSBBcHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BpbnRlcmVzdCBBcHAnCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMudmUgPSAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbWUoewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaQogICAgICAgICAgICAgICAgICAgIH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9PT0gZC5VU0VSX0lEICYmICh0aGlzLmRlLnVzZXJJZCA9IHRoaXMuZ2UoaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLnBlW3QubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gYDsgZXhwaXJlcz0keyBuZXcgRGF0ZShPYmplY3QoZi5iKShlKSkudG9VVENTdHJpbmcoKSB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLmRvY3VtZW50LmNvb2tpZSA9IGAkeyB0Lm5hbWUgfT0keyB0LnZhbHVlIH0keyBpIH07IHBhdGg9L2A7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdlKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QoYi5oKSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpc3Q6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVNb2RlOiBpID8gaC5Qcm90b0Nvb2tpZVNlY3VyZU1vZGVFbnVtLlVuc2VjdXJlIDogaC5Qcm90b0Nvb2tpZVNlY3VyZU1vZGVFbnVtLkF1dG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VySW5mbzogdGhpcy5PZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hLnNlbmRQcm90b1JlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGguUHJvdG9Db29raWVTeW5jUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvaW50OiBhLmEuZW5kUG9pbnRzLmFwaS5jb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgW2MuYl06IHUuYS52ZXJzaW9uIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcjogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHAuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyQ29va2llTWFuYWdlcl9zZXRUaGlyZFBhcnR5Q29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuY2FsbFN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCdfJylbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0ICsgJz0nLCBlID0gZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMuZmUuZG9jdW1lbnQuY29va2llKS5zcGxpdCgnOycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgdCBvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7ICcgJyA9PT0gdC5jaGFyQXQoMCk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHQuaW5kZXhPZihpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2UodC5zdWJzdHJpbmcoaS5sZW5ndGgsIHQubGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFVzZXJJZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGUudXNlcklkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzeW5jRmlyc3RQYXJ0eUNvb2tpZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBPYmplY3QoZi5iKSh0aGlzLnBlW3RdKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBkLlVTRVJfSUQgJiYgKGkudmFsdWUgPSB0aGlzLmRlLnVzZXJJZCksIE9iamVjdChvLmgpKGkudmFsdWUpICYmIHRoaXMueWUoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN5bmNUaGlyZFBhcnR5Q29va2llTGlzdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbZC5VU0VSX0lEXSwgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBkLlVTRVJfSUQgJiYgT2JqZWN0KG8uaCkodGhpcy5kZS51c2VySWQpICYmIGUucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZC5VU0VSX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmRlLnVzZXJJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IE9iamVjdChmLmIpKHRoaXMucGVbZC5VU0VSX0lEXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy53ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QnJvd3NlckluZm8odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9lID0gdCwgdGhpcy52ZSA9IHRoaXMuYmUuaW5jbHVkZXModC5icm93c2VyVHlwZSksIHRoaXMudmUgJiYgaSAmJiB0aGlzLnN5bmNUaGlyZFBhcnR5Q29va2llTGlzdCh0aGlzLnZlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VXNlckluZm9ybWF0aW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0aGlzLm1lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGQuVVNFUl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LnVzZXJJZAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmV0Y2hDb29raWVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICBbZC5VU0VSX0lEXS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMueGUodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcigoe3ZhbHVlOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmgpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdW5zZWN1cmVkQ29va2llU3luYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG0gPSBlKDIyKTsKICAgICAgICAgICAgICAgIGNvbnN0IGcgPSB7CiAgICAgICAgICAgICAgICAgICAgW20uYS5DbXBBcGldOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1Byb3BlcnR5TmFtZTogJ19fY21wJywKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVQcm9wZXJ0eU5hbWU6ICdfX2NtcExvY2F0b3InLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRWZW5kb3JDb25zZW50RGF0YU1ldGhvZE5hbWU6ICdnZXRWZW5kb3JDb25zZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnREYXRhTWV0aG9kTmFtZTogJ2dldENvbnNlbnREYXRhJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgW20uYS5UY2ZBcGldOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1Byb3BlcnR5TmFtZTogJ19fdGNmYXBpJywKICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVQcm9wZXJ0eU5hbWU6ICdfX3RjZmFwaUxvY2F0b3InLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRWZW5kb3JDb25zZW50RGF0YU1ldGhvZE5hbWU6ICdnZXRUQ0RhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50VXBkYXRlTWV0aG9kTmFtZTogJ2FkZEV2ZW50TGlzdGVuZXInLAogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVVcGRhdGVMaXN0ZW5lck1ldGhvZE5hbWU6ICdyZW1vdmVFdmVudExpc3RlbmVyJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyB5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2UgPSB0LCB0aGlzLmplID0gaSwgdGhpcy5hcGlUeXBlID0gbS5hLkNtcEFwaSwgdGhpcy5rZSA9IHt9LCB0aGlzLmxlID0gbnVsbCwgdGhpcy5fZSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9ICdzdHJpbmcnID09IHR5cGVvZiB0LmRhdGEgPyBKU09OLnBhcnNlKHQuZGF0YSkgOiB0LmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgcyAmJiBzLkFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuQWUuY2FsbElkID09PSB0aGlzLkllKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHMuQWUucmV0dXJuVmFsdWUgJiYgcy5BZS5yZXR1cm5WYWx1ZS52ZW5kb3JDb25zZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNlKHQpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0aGlzLkllKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5BZS5jYWxsSWQgPT09IHRoaXMuVGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gcy5BZS5yZXR1cm5WYWx1ZSAmJiBzLkFlLnJldHVyblZhbHVlLmNvbnNlbnREYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGUodCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHRoaXMuVGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0FwaU9uUGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IHRoaXMuU2UgfHwgbnVsbCAhPT0gdGhpcy5qZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYmluZFRvQXBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5TZSA/IG5ldyBQcm9taXNlKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1lKHRoaXMuU2UpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IG51bGwgIT09IHRoaXMuamUgPyB0aGlzLkVlKHRoaXMuamUpIDogUHJvbWlzZS5yZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDb25zZW50Rm9yVmVuZG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5rZVt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc2VudFBheWxvYWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRJbkFwcENvbnNlbnREYXRhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DZSh0KSwgdGhpcy5QZSh0LmNvbnNlbnRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYXNJdnRDb25zZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0NvbnNlbnRGb3JWZW5kb3Iobi5jLkNvbm5hdGl4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDb25zZW50Rm9yUHVycG9zZXModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UZSA9IE9iamVjdChzLmMpKCksIHRoaXMuSWUgPSBPYmplY3Qocy5jKSgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lKHQpLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbdF0gPSAhMCwgaVt0aGlzLlRlXSAmJiBpW3RoaXMuSWVdICYmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHMsICExKSwgZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHMsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBnW20uYS5DbXBBcGldLmdldFZlbmRvckNvbnNlbnREYXRhTWV0aG9kTmFtZSwgciA9IGdbbS5hLkNtcEFwaV0uZ2V0Q29uc2VudERhdGFNZXRob2ROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IHRoaXMuSWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnKicpLCB0LnBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJZDogdGhpcy5UZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBNZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBnW20uYS5DbXBBcGldLndpbmRvd1Byb3BlcnR5TmFtZSwgZSA9IGdbbS5hLkNtcEFwaV0uZ2V0VmVuZG9yQ29uc2VudERhdGFNZXRob2ROYW1lLCBzID0gZ1ttLmEuQ21wQXBpXS5nZXRDb25zZW50RGF0YU1ldGhvZE5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHRbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgUHJvbWlzZShzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtpXShlLCBudWxsLCAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7dmVuZG9yQ29uc2VudHM6IGl9ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNlKGkpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgciA9IG5ldyBQcm9taXNlKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2ldKHMsIG51bGwsICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtjb25zZW50RGF0YTogaX0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGUoaSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoby5mKSh0KSA/ICh0aGlzLmtlID0gdCwgUHJvbWlzZS5yZXNvbHZlKCkpIDogUHJvbWlzZS5yZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uZykodCkgPyAodGhpcy5sZSA9IHQsIFByb21pc2UucmVzb2x2ZSgpKSA6IFByb21pc2UucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHcgPSBlKDIpLCBPID0gZSg3NyksIHggPSBlKDc4KTsKICAgICAgICAgICAgICAgIGNvbnN0IFMgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gZ1tpXS53aW5kb3dQcm9wZXJ0eU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qody5yKSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCBqID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGdbaV0uZnJhbWVQcm9wZXJ0eU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qody5xKSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9LCBrID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IFModCwgaSkgfHwgbnVsbCAhPT0gaih0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9LCBfID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBPLlRDU3RyaW5nLmRlY29kZSh0KSwgZSA9IHt9LCBzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnZlbmRvckNvbnNlbnRzLmZvckVhY2goKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2ldID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkucHVycG9zZUNvbnNlbnRzLmZvckVhY2goKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2ldID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZUNvbnNlbnRzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNTdHJpbmc6IHQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBBID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB4LmRlY29kZUNvbnNlbnRTdHJpbmcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpLm1heFZlbmRvcklkOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMTsgdCA8PSBzOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGUuc3BsaXQoJycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hbGxvd2VkVmVuZG9ySWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3QgLSAxXSA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSksICh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7IGNvbnNlbnRTdHJpbmc6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgdC5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2UgKyAxXSA9ICcxJyA9PT0gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KShuLmpvaW4oJycpKTsKICAgICAgICAgICAgICAgICAgICB9LCBJID0gKHQsIGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qoby5mKShzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICB9LCBDID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uaCkobnVsbCA9PT0gKGkgPSB0KSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLnRjU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICB9LCBUID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uaCkobnVsbCA9PT0gKGkgPSB0KSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmNvbnNlbnRTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgIH0sIFAgPSAoewogICAgICAgICAgICAgICAgICAgICAgICBjbXBFbmNvZGVkU3RyaW5nOiB0LAogICAgICAgICAgICAgICAgICAgICAgICB0Y2ZFbmNvZGVkU3RyaW5nOiBpCiAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChvLmgpKHQpICYmICFPYmplY3Qoby5oKShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoby5oKShpKSAmJiAoZSA9IEkoaSwgXywgQSkpLCBPYmplY3Qoby5mKShlKSA/IGUgOiBPYmplY3Qoby5oKSh0KSA/IChlID0gSSh0LCBBLCBfKSwgT2JqZWN0KG8uZikoZSkgPyBlIDogKE9iamVjdChwLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyTWFuYWdlclNlcnZpY2VfZ2V0RGVjb2RlZENvbnNlbnREYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogJ2NtcEVuY29kZWRTdHJpbmcgZmFpbGVkIHRvIGRlY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBFbmNvZGVkU3RyaW5nOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZkVuY29kZWRTdHJpbmc6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsKSkgOiAoT2JqZWN0KHAuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXJNYW5hZ2VyU2VydmljZV9nZXREZWNvZGVkQ29uc2VudERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiAndGNmRW5jb2RlZFN0cmluZyBmYWlsZWQgdG8gZGVjb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogSlNPTi5zdHJpbmdpZnkoeyB0Y2ZFbmNvZGVkU3RyaW5nOiBpIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9LCBNID0gJ3VzZXJhY3Rpb25jb21wbGV0ZScsIEUgPSAndGNsb2FkZWQnOwogICAgICAgICAgICAgICAgY2xhc3MgTCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJlID0gdCwgdGhpcy5CZSA9IGksIHRoaXMuYXBpVHlwZSA9IG0uYS5UY2ZBcGksIHRoaXMuRGUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzID0gdC5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQuZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IEpTT04ucGFyc2UodC5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT0gdHlwZW9mIHMgJiYgcy5GZSAmJiBzLkZlLmNhbGxJZCA9PT0gdGhpcy5WZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHMuRmUucmV0dXJuVmFsdWUudGNTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNlKHQpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHRoaXMuVmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQXBpT25QYWdlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gdGhpcy5SZSB8fCBudWxsICE9PSB0aGlzLkJlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBiaW5kVG9BcGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB0aGlzLlJlID8gbmV3IFByb21pc2UoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTWUodGhpcy5SZSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbnVsbCAhPT0gdGhpcy5CZSA/IHRoaXMuRWUodGhpcy5CZSkgOiBQcm9taXNlLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0NvbnNlbnRGb3JWZW5kb3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEobnVsbCA9PT0gKGkgPSB0aGlzLlVlKSB8fCB2b2lkIDAgPT09IGkgfHwgIWkudmVuZG9yQ29uc2VudHMpICYmICEhKG51bGwgPT09IChlID0gdGhpcy5VZSkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS52ZW5kb3JDb25zZW50c1t0XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnRQYXlsb2FkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09ICh0ID0gdGhpcy5VZSkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC50Y1N0cmluZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SW5BcHBDb25zZW50RGF0YSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVWUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuVWUpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGFzSXZ0Q29uc2VudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0NvbnNlbnRGb3JQdXJwb3Nlcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShudWxsID09PSAoaSA9IHRoaXMuVWUpIHx8IHZvaWQgMCA9PT0gaSB8fCAhaS5wdXJwb3NlQ29uc2VudHMpICYmIHQuZXZlcnkodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLlVlLnB1cnBvc2VDb25zZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WZSA9IE9iamVjdChzLmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRGUodCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVt0XSA9ICEwLCBpW3RoaXMuVmVdICYmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHMsICExKSwgZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHMsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBnW20uYS5UY2ZBcGldLmdldFZlbmRvckNvbnNlbnREYXRhTWV0aG9kTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucG9zdE1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiB0aGlzLlZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJyonKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IGdbbS5hLlRjZkFwaV0ud2luZG93UHJvcGVydHlOYW1lLCBlID0gZ1ttLmEuVGNmQXBpXS5jb25zZW50VXBkYXRlTWV0aG9kTmFtZSwgcyA9IGdbbS5hLlRjZkFwaV0ucmVtb3ZlVXBkYXRlTGlzdGVuZXJNZXRob2ROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0W2ldID8gbmV3IFByb21pc2UodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJlW2ldKGUsIDIsIChlLCBuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgKGUuZXZlbnRTdGF0dXMgPT09IE0gfHwgZS5ldmVudFN0YXR1cyA9PT0gRSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IGUudGNTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2UobikudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5SZVtpXShzLCAyLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmxpc3RlbmVySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IFByb21pc2UucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IFAoeyB0Y2ZFbmNvZGVkU3RyaW5nOiB0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhpKSA/ICh0aGlzLlVlID0gaSwgUHJvbWlzZS5yZXNvbHZlKCkpIDogUHJvbWlzZS5yZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgUiA9IGUoMzcpOwogICAgICAgICAgICAgICAgY29uc3QgQiA9IFsKICAgICAgICAgICAgICAgICAgICBSLmEuUDEsCiAgICAgICAgICAgICAgICAgICAgUi5hLlAyLAogICAgICAgICAgICAgICAgICAgIFIuYS5QNCwKICAgICAgICAgICAgICAgICAgICBSLmEuUDcsCiAgICAgICAgICAgICAgICAgICAgUi5hLlA4CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgY2xhc3MgRCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5lID0gdCwgdGhpcy5mZSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBQKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBFbmNvZGVkU3RyaW5nOiBudWxsID09PSAocyA9IGUuY21wKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLmNvbnNlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNmRW5jb2RlZFN0cmluZzogbnVsbCA9PT0gKG4gPSBlLnRjZikgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi50Y1N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEgPSB0aGlzLkhlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSBhID8gKHRoaXMucWUoYSksIChDKHIpIHx8IFQocikpICYmIHRoaXMuemUuc2V0SW5BcHBDb25zZW50RGF0YShyKSkgOiBPYmplY3QocC5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlck1hbmFnZXJTZXJ2aWNlX1VzZXJDb25zZW50QXBpTWFuYWdlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246ICdmYWlsZWQgdG8gZmluZCB0aGUgcmlnaHQgYXBpLCBubyBjb25zZW50IHN0cmluZyBhbmQgbm8gZnJhbWV3b3JrIG9uIHBhZ2Ugd2FzIGZvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogSlNPTi5zdHJpbmdpZnkoeyBfYXBwU2V0dGluZ3M6IGUgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFBhZ2VVcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLldlID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QW1wVXNlckNvbnNlbnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29uc2VudFJlcXVpcmVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LmNvbnNlbnRTdHJpbmdUeXBlRW51bS5VU19QUklWQUNZX1NUUklORywgbiA9IG51bGwgPT09IChpID0gdC5jb25zZW50TWV0YWRhdGEpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuY29uc2VudFN0cmluZ1R5cGUsIHIgPSB0LmVuY29kZUNvbnNlbnRTdHJpbmcgfHwgKG51bGwgPT09IChlID0gdC5jb25zZW50TWV0YWRhdGEpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuYWRkaXRpb25hbENvbnNlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgYTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qoby5oKShyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE9iamVjdChwLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQU1QX25vX2NvbnNlbnRfc3RyaW5nX3Byb3ZpZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEpTT04uc3RyaW5naWZ5KHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdGhpcy5XZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09PSBzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgT2JqZWN0KHAuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyQ29uc2VudEFwaU1hbmFnZXJfQ0NQQV9lbmNvZGVkX3N0cmluZ19mcm9tX2FtcF9ub3RfdXNlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogYCR7IEpTT04uc3RyaW5naWZ5KHQpIH1fX3BhZ2VVUkxfJHsgdGhpcy5XZSB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSBQKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZkVuY29kZWRTdHJpbmc6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBFbmNvZGVkU3RyaW5nOiByCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBDKGMpID8gYSA9IG5ldyBMKG51bGwsIG51bGwpIDogVChjKSAmJiAoYSA9IG5ldyB5KG51bGwsIG51bGwpKSwgYSA/IGEgPyAodGhpcy56ZSA9IGEsIHRoaXMuemUuc2V0SW5BcHBDb25zZW50RGF0YShjKSkgOiBPYmplY3QocC5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlckNvbnNlbnRBcGlNYW5hZ2VyX2FtcF91c2VyQ29uc2VudEFwaV9ub3RfZm91bmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGAkeyBKU09OLnN0cmluZ2lmeSh0KSB9X19wYWdlVVJMX18keyB0aGlzLldlIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdChwLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyQ29uc2VudEFwaU1hbmFnZXJfZW5jb2RlZF9zdHJpbmdfbm90X3RjZl9hbmRfbm90X2NtcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogYCR7IEpTT04uc3RyaW5naWZ5KHQpIH1fX3BhZ2VVUkxfXyR7IHRoaXMuV2UgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0NvbnNlbnRSZXF1aXJlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQ29uc2VudCh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25zZW50UmVxdWlyZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuaXNDb25zZW50Rm9yVmVuZG9yKHQpICYmIHRoaXMuemUuaXNDb25zZW50Rm9yUHVycG9zZXMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0NvbnNlbnRDb25uYXRpeCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25zZW50KG4uYy5Db25uYXRpeCwgQik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnREYXRhUGF5bG9hZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuZ2V0Q29uc2VudFBheWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYmluZFRvQ29uc2VudEFwaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuYmluZFRvQXBpKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQ29uc2VudEFwaU9uUGFnZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuaXNBcGlPblBhZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGFzSVZUQ29uc2VudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuaGFzSXZ0Q29uc2VudCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDb25zZW50QXBpVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuemUuYXBpVHlwZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gUyh0aGlzLmZlLCB0KSwgZSA9IGoodGhpcy5mZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPT09IG0uYS5UY2ZBcGkgPyB0aGlzLnplID0gbmV3IEwoaSwgZSkgOiB0aGlzLnplID0gbmV3IHkoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEModCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5hLlRjZkFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFQodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5hLkNtcEFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsodGhpcy5mZSwgbS5hLlRjZkFwaSkgPyBtLmEuVGNmQXBpIDogayh0aGlzLmZlLCBtLmEuQ21wQXBpKSA/IG0uYS5DbXBBcGkgOiBtLmEuVGNmQXBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBGID0gZSgxOSk7CiAgICAgICAgICAgICAgICBjb25zdCBWID0gJ1VzZXJUaGlyZFBhcnR5U3luY01hbmFnZXJfUHVibWF0aWMnLCBVID0gJ0Nvb2tpZVN5bmNfc3luY1NjcmlwdF9ub3RfcHJvcGVybHlfbG9hZGVkJywgJCA9ICdDb29raWVTeW5jX3BhcmFtX25vdF9wYXJzZWRfcHJvcGVybHknLCBOID0gKHQsIGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzLCBuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gT2JqZWN0KEYuYikoJ3AnLCB0KSwgaCA9IE9iamVjdChGLmIpKCdwcmVkaXJlY3QnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuUHViTWF0aWNTeW5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIKHIsIGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcShyLCBoLCBpLCBlKSwgcyghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qody54KSh7IHNyYzogJy8vYWRzLnB1Ym1hdGljLmNvbS9BZFNlcnZlci9qcy91c2VyU3luYy5qcycgfSwgd2luZG93LmRvY3VtZW50LmhlYWQsIHdpbmRvdywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIKHIsIGgpID8gKHEociwgaCwgaSwgZSksIHMoITApKSA6IG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCwgVik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIEggPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5QdWJNYXRpY1N5bmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geihVLCAnUFVCTUFUSUMnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBOdW1iZXIucGFyc2VJbnQodCwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG8uZCkoZSkgPyAhIU9iamVjdChvLmgpKGkpIHx8ICh6KCQsICdQVUJNQVRJQycsICdwcmVkaXJlY3QnKSwgITEpIDogKHooJCwgJ1BVQk1BVElDJywgJ3AnKSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0sIHEgPSAodCwgaSwgZSwgcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHViSWQ6IE51bWJlci5wYXJzZUludCh0LCAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAobi5kZWxheSA9IDEwMDAsIG4uZ2RwciA9IDEsIG4uZ2RwckNvbnNlbnQgPSBzKSwgd2luZG93LlB1Yk1hdGljU3luYy5zeW5jKG4pOwogICAgICAgICAgICAgICAgICAgIH0sIHogPSAodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICB9KSgpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChwLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIFcgPSAneWVsbG93Ymx1ZS5pbyc7CiAgICAgICAgICAgICAgICBjbGFzcyBHIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2UgPSB0LCB0aGlzLk5lID0gaSwgdGhpcy5KZSA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXBsYWNldXNlcklkTWFjcm9zKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IChlID0gKGUgPSBlLnJlcGxhY2UoJyU1QnVzZXJJZCU1RCcsIGkpKS5yZXBsYWNlKCdbdXNlcklkXScsIGkpKS5yZXBsYWNlKCclN2JVU0VSX0lEJTdkJywgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFlKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlhlKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3dpZHRoOjFweDtoZWlnaHQ6MXB4O2JvcmRlcjowcHg7bWFyZ2luOjBweDtwYWRkaW5nOjBweCcpLCBlLnNyYyA9IHQudXJsLCBpLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qody54KSh7IHNyYzogdC51cmwgfSwgaS5kb2N1bWVudC5oZWFkLCBpLCBudWxsLCBudWxsLCAxID09PSBPYmplY3Qocy5rKShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksICdVc2VyTWFuYWdlcl91bmFibGVfdG9faW5zZXJ0X3N5bmNfdXJsX3NjcmlwdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudmVuZG9ySWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmMuUnViaWNvbjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuLmMuUHVibWF0aWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC51cmwuaW5kZXhPZihXKSA+IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN5bmNVcmxzKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KZS5mb3JFYWNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuR2UuaXNDb25zZW50KGUudmVuZG9ySWQpICYmICFlLnN5bmNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnZlbmRvcklkID09PSBuLmMuUHVibWF0aWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE4oZS51cmwsIHRoaXMuR2UuaXNDb25zZW50UmVxdWlyZWQoKSwgdGhpcy5HZS5nZXRDb25zZW50RGF0YVBheWxvYWQoKSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN5bmNlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT09IGUudXJsLmluZGV4T2YoJ29wZW54Lm5ldCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51cmwgPSBgJHsgZS51cmwuc3BsaXQoJ3I9JylbMF0gfSZyPVxuICAgICAgICAgICAgICAgICAgICAgICAgJHsgZW5jb2RlVVJJQ29tcG9uZW50KGBodHRwczovL2NhcGkuY29ubmF0aXguY29tL2NvcmUvdXM/RGVtYW5kUGFydG5lcj04JlVzZXJJZD0keyB0IH0mRGVtYW5kUGFydG5lclVzZXJJZD1gKSB9YCwgZS51cmwgPSB0aGlzLnJlcGxhY2V1c2VySWRNYWNyb3MoZS51cmwsIHQpLCByLmEudHJhY2tQaXhlbChlLnVybCksIHZvaWQgKGUuc3luY2VkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnVybC5pbmRleE9mKCdwaXhlbC5hZHZlcnRpc2luZy5jb20nKSA+IC0xICYmIChlLnVybCA9IGUudXJsLnJlcGxhY2UoJ2dkcHI9JywgYGdkcHI9JHsgdGhpcy5HZS5pc0NvbnNlbnRSZXF1aXJlZCgpID8gMSA6IDAgfWApLCBlLnVybCA9IGUudXJsLnJlcGxhY2UoJ2dkcHJfY29uc2VudD0nLCAnZ2Rwcl9jb25zZW50PTAnKSksIGUudXJsID0gdGhpcy5yZXBsYWNldXNlcklkTWFjcm9zKGUudXJsLCB0KSwgdGhpcy5OZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnVybCA9IE9iamVjdChGLmUpKGUudXJsLCAnZ2RwcicsICcxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkdlLmdldENvbnNlbnREYXRhUGF5bG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnVybCA9IE9iamVjdChGLmUpKGUudXJsLCAnZ2Rwcl9jb25zZW50JywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUWUoZSwgaSkgJiYgKGUuc3luY2VkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U3luY1VybHModCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHRoaXMuSmUubGVuZ3RoID4gMCkgJiYgKHRoaXMuSmUgPSBbXSwgT2JqZWN0LmtleXModCkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSmUucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9ySWQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0W2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBKID0gZSgzOCk7CiAgICAgICAgICAgICAgICBjb25zdCBRID0gewogICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9uOiB7IENhbGlmb3JuaWE6IDUzMzI5MjEgfSwKICAgICAgICAgICAgICAgICAgICBjb3VudHJ5OiB7IFVTOiA2MjUyMDAxIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBYIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGUgPSB0LCB0aGlzLlllID0gMSwgdGhpcy5LZSA9ICdfX3VzcGFwaScsIHRoaXMuWmUgPSAnZ2V0VVNQRGF0YScsIHRoaXMudHMoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFVzUHJpdmFjeVN0cmluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGUudXNQcml2YWN5U3RyaW5nIHx8IHRoaXMuZGUuaXNDY3BhQXBwbGljYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlLnVzUHJpdmFjeVN0cmluZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDY3BhQXBwbGljYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGUuaXNDY3BhQXBwbGljYWJsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNTZWxsVXNlckFsbG93ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kZS5pc0NjcGFBcHBsaWNhYmxlIHx8IHRoaXMuZXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0R2VvTG9jYXRpb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNzID0gdCwgdC5zdWJkaXZpc2lvbklkICE9PSBRLnN1YmRpdmlzaW9uLkNhbGlmb3JuaWEgJiYgKHRoaXMuZGUuaXNDY3BhQXBwbGljYWJsZSA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmV0Y2hVc1ByaXZhY3lTdHJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5zKCkgJiYgdGhpcy5ycygpLCB0aGlzLmlzQ2NwYUFwcGxpY2FibGUoKSA/IG5ldyBQcm9taXNlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVc1ByaXZhY3lTdHJpbmcoKSA/IHQoKSA6IHQodGhpcy5ocygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZGUuZ2V0U2NvcGUoKVt0aGlzLktlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBlKHRoaXMuWmUsIHRoaXMuWWUsIChlLCBzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA/ICh0aGlzLnRzKGUudXNwU3RyaW5nKSwgdCgpKSA6IGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5kZS51c1ByaXZhY3lTdHJpbmcgfHwgT2JqZWN0KGIuZykodGhpcy5kZS51c1ByaXZhY3lTdHJpbmcsIG4uYik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZS51c1ByaXZhY3lTdHJpbmcgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qocy5rKShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgyMDIwLCAxMCwgMTYsIDEyLCAwLCAwKS5nZXRUaW1lKCksIGkgPSBuZXcgRGF0ZSgyMDIwLCAxMCwgMTcsIDEyLCAwLCAwKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoZi5kKSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcnMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlHZW9JZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRpdmlzaW9uSWQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPT09IFEuY291bnRyeS5VUyAmJiBPYmplY3QocC5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlckNjcGFNYW5hZ2VyX2xvZ0NDUEEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEpTT04uc3RyaW5naWZ5KGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0aGlzLmRlLnVzUHJpdmFjeVN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgWSwgSzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWTsKICAgICAgICAgICAgICAgIH0pLCBlLmQoaSwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFo7CiAgICAgICAgICAgICAgICB9KSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkNDUEFfSU5GT19SRUNFSVZFRCA9ICdjY3BhSW5mb1JlY2VpdmVkJywgdC5DT05TRU5UX0RBVEFfVVBEQVRFID0gJ2NvbnNlbnREYXRhVXBkYXRlJzsKICAgICAgICAgICAgICAgIH0oWSB8fCAoWSA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5TWU5DX1VSTFNfUkVDRUlWRUQgPSAndGhpcmRQYXJ0eVN5bmNVcmxzUmVjZWl2ZWQnLCB0LlVTRVJfSU5GT19SRUNFSVZFRCA9ICd1c2VySW5mb1JlY2VpdmVkJzsKICAgICAgICAgICAgICAgIH0oSyB8fCAoSyA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBaIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcyA9IGksIHRoaXMudXMgPSBlLCB0aGlzLl9hcHBTZXR0aW5ncyA9IHMsIHRoaXMuZ2RwckNvbnNlbnRNb2RlID0gaC5Qcm90b0dkcHJDb25zZW50TW9kZUVudW0uVW5rbm93biwgdGhpcy5scyA9IHt9LCB0aGlzLmRzID0gJycsIHRoaXMuZnMgPSAhMSwgdGhpcy5wcyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLkdlLmlzQ29uc2VudFJlcXVpcmVkKCkgfHwgdGhpcy5jcyA/IHRoaXMucmVzb2x2ZUV2ZW50KFkuQ09OU0VOVF9EQVRBX1VQREFURSkgOiAodGhpcy5nZHByQ29uc2VudE1vZGUgPSB0aGlzLkdlLmlzQ29uc2VudEFwaU9uUGFnZSgpIHx8IHRoaXMudXMgPyBoLlByb3RvR2RwckNvbnNlbnRNb2RlRW51bS5Ob0NvbnNlbnQgOiBoLlByb3RvR2RwckNvbnNlbnRNb2RlRW51bS5Ob0NtcCwgdGhpcy5HZS5iaW5kVG9Db25zZW50QXBpKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NvbnNlbnRDb25uYXRpeCgpIHx8ICh0aGlzLmdkcHJDb25zZW50TW9kZSA9IGguUHJvdG9HZHByQ29uc2VudE1vZGVFbnVtLk5vQ29ubmF0aXhDb25zZW50KSwgdGhpcy5yZXNvbHZlRXZlbnQoWS5DT05TRU5UX0RBVEFfVVBEQVRFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmJzID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NvbnNlbnRDb25uYXRpeCgpICYmICh0aGlzLm9uRXZlbnQoW0suVVNFUl9JTkZPX1JFQ0VJVkVEXSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcyAmJiAodGhpcy52cy5zeW5jVGhpcmRQYXJ0eUNvb2tpZUxpc3QoKSwgdGhpcy52cy51bnNlY3VyZWRDb29raWVTeW5jICYmIHRoaXMudnMuc3luY1RoaXJkUGFydHlDb29raWVMaXN0KHRoaXMudnMudW5zZWN1cmVkQ29va2llU3luYyksIHRoaXMudnMuc3luY0ZpcnN0UGFydHlDb29raWUoZC5VU0VSX0lEKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5vbkV2ZW50KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLLlNZTkNfVVJMU19SRUNFSVZFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZLkNPTlNFTlRfREFUQV9VUERBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWS5DQ1BBX0lORk9fUkVDRUlWRUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29uc2VudENvbm5hdGl4KCkgJiYgdGhpcy5tcy5pc1NlbGxVc2VyQWxsb3dlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ncy5zeW5jVXJscyh0aGlzLmRlLnVzZXJJZCwgdGhpcy5kZS5nZXRTY29wZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHAuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyTWFuYWdlcl9zeW5jVXJscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZSA9IGwuZ2V0SW5zdGFuY2UodCksIHRoaXMuY3MgfHwgKHRoaXMudnMgPSBuZXcgdih0aGlzLmRlLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZjogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuX2FwcFNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HZSA9IG5ldyBEKCEhdGhpcy5kcywgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2Y6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmdzID0gbmV3IEcodGhpcy5HZSwgdGhpcy5pc0dEUFIoKSksIHRoaXMubXMgPSBuZXcgWCh0aGlzLmRlLCB0aGlzLl9hcHBTZXR0aW5ncy51c1ByaXZhY3lTdHJpbmcpLCB0aGlzLnlzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChwLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1VzZXJNYW5hZ2VyX2NvbnN0cnVjdG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHlzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZzICYmIHRoaXMudnMuZmV0Y2hDb29raWVzKCksIHRoaXMucHMoKSwgdGhpcy5vbkV2ZW50KFtZLkNPTlNFTlRfREFUQV9VUERBVEVdKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocC5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyTWFuYWdlcl9jb25zZW50X2RhdGFfcmVjZWl2ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0aGlzLmxzW3RdICYmICh0aGlzLmxzW3RdID0gbmV3IEouYSgpLCB0aGlzLmxzW3RdLnByb21pc2UuY2F0Y2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubHNbdF0ucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5sc1t0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUV2ZW50KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cyh0KS5yZXNvbHZlKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBbXBVc2VyQ29uc2VudCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR2Uuc2V0QW1wVXNlckNvbnNlbnQodCksIHRoaXMucmVzb2x2ZUV2ZW50KFkuQ09OU0VOVF9EQVRBX1VQREFURSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFBhZ2VVcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdlICYmIHRoaXMuR2Uuc2V0UGFnZVVybCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25FdmVudCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndzKHQpLnByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQ29uc2VudCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlLmlzQ29uc2VudCh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDb25zZW50Q29ubmF0aXgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlLmlzQ29uc2VudENvbm5hdGl4KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnRQYXlsb2FkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HZS5nZXRDb25zZW50RGF0YVBheWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDb25zZW50UmVxdWlyZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdlLmlzQ29uc2VudFJlcXVpcmVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFRoaXJkUGFydHlTeW5jVXJscyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3MgfHwgdGhpcy5ncy5zZXRTeW5jVXJscyh0KSAmJiB0aGlzLnJlc29sdmVFdmVudChLLlNZTkNfVVJMU19SRUNFSVZFRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEdlb0xvY2F0aW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tcy5zZXRHZW9Mb2NhdGlvbih0KSwgdGhpcy5tcy5mZXRjaFVzUHJpdmFjeVN0cmluZygpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlRXZlbnQoWS5DQ1BBX0lORk9fUkVDRUlWRUQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmVFdmVudChZLkNDUEFfSU5GT19SRUNFSVZFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRVc2VySWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29uc2VudENvbm5hdGl4KCkgJiYgdGhpcy52cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZzLmdldFVzZXJJZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudnMgJiYgdGhpcy52cy5nZXRVc2VySWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VXNlckluZm9ybWF0aW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52cyAmJiAodGhpcy52cy5zZXRVc2VySW5mb3JtYXRpb24odCksIHRoaXMucmVzb2x2ZUV2ZW50KEsuVVNFUl9JTkZPX1JFQ0VJVkVEKSwgIXRoaXMuY3MgJiYgdGhpcy5pc0NvbnNlbnRDb25uYXRpeCgpICYmIHRoaXMudnMuc3luY0ZpcnN0UGFydHlDb29raWUoZC5VU0VSX0lEKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzR0RQUigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5kczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VXNQcml2YWN5U3RyaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tcy5nZXRVc1ByaXZhY3lTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNDY3BhQXBwbGljYWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubXMuaXNDY3BhQXBwbGljYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc1NlbGxVc2VyQWxsb3dlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3MgfHwgdGhpcy5tcy5pc1NlbGxVc2VyQWxsb3dlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VJZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25zZW50Q29ubmF0aXgoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBTZXR0aW5ncy5kZXZpY2VJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU3MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBTZXR0aW5ncy5kZXZpY2VJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VHJhY2thYmxlVXNlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3MgPyB0aGlzLmdldERldmljZUlkKCkgOiB0aGlzLmdldFVzZXJJZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRGb3JjZWRUcmFja2FibGVVc2VyKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcyA/IHRoaXMuU3MoKSA6IHRoaXMuT3MoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQbHNDYWxsKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNDb25zZW50Q29ubmF0aXgoKSB8fCAodGhpcy5mcyA9ICEwKSwgdGhpcy5kZS5yZWdpc3RlclBsc0NhbGwodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEJyb3dzZXJJbmZvKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52cyAmJiB0aGlzLnZzLnNldEJyb3dzZXJJbmZvKHQsIHRoaXMuaXNDb25zZW50Q29ubmF0aXgoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEdkcHJDb25zZW50QXBpVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuR2UuZ2V0Q29uc2VudEFwaVR5cGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbjsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuaGlkZGVuID0gJ2hpZGRlbicsIHQubXNIaWRkZW4gPSAnbXNIaWRkZW4nLCB0LndlYmtpdEhpZGRlbiA9ICd3ZWJraXRIaWRkZW4nOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LnZpc2liaWxpdHljaGFuZ2UgPSAndmlzaWJpbGl0eWNoYW5nZScsIHQubXN2aXNpYmlsaXR5Y2hhbmdlID0gJ21zdmlzaWJpbGl0eWNoYW5nZScsIHQud2Via2l0dmlzaWJpbGl0eWNoYW5nZSA9ICd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJzsKICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyByIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanMgPSB0LCB0aGlzLmtzID0gW10sIHRoaXMuX3MoKSwgdGhpcy5BcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3MucHVzaCh0KSwgdCh0aGlzLmlzRG9jdW1lbnRWaXNpYmxlKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvZmYodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtzID0gdGhpcy5rcy5maWx0ZXIoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9zKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHRoaXMuanMuZ2V0RG9jdW1lbnRQcm9wZXJ0eShzLmhpZGRlbikgPyAodGhpcy5JcyA9IHMuaGlkZGVuLCB0aGlzLkNzID0gbi52aXNpYmlsaXR5Y2hhbmdlKSA6IHZvaWQgMCAhPT0gdGhpcy5qcy5nZXREb2N1bWVudFByb3BlcnR5KHMubXNIaWRkZW4pID8gKHRoaXMuSXMgPSBzLm1zSGlkZGVuLCB0aGlzLkNzID0gbi5tc3Zpc2liaWxpdHljaGFuZ2UpIDogdm9pZCAwICE9PSB0aGlzLmpzLmdldERvY3VtZW50UHJvcGVydHkocy53ZWJraXRIaWRkZW4pICYmICh0aGlzLklzID0gcy53ZWJraXRIaWRkZW4sIHRoaXMuQ3MgPSBuLndlYmtpdHZpc2liaWxpdHljaGFuZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBBcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qcy5hZGRFdmVudExpc3RlbmVyT25HbG9iYWwodGhpcy5DcywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rcy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQodGhpcy5pc0RvY3VtZW50VmlzaWJsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCwgITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0RvY3VtZW50VmlzaWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmpzLmdldERvY3VtZW50UHJvcGVydHkodGhpcy5Jcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBzID0gJy8vc2VjdXJlcHViYWRzLmcuZG91YmxlY2xpY2submV0L3RhZy9qcy9ncHQuanMnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9Y254LWctY2FyZD4gPGNueCBjbGFzcz1jbngtZy1jYXJkLWltYWdlLWNvbnRhaW5lcj4gPGNueCBjbGFzcz1jbngtZy10cmlhbmdsZT48L2NueD4gPGNueCBjbGFzcz1jbngtZy1jYXJkLWltYWdlPiA8Y254IGNsYXNzPWNueC1nLWNhcmQtaWNvbj4gPGNueCBjbGFzcz1jbngtdWktYnRuPiA8Y254IGNsYXNzPSJjbngtaWNvbi1idXR0b24gY254LXVpLWJ0bi1ob3ZlcmFibGUgY254LW1vZC1ob3ZlciI+IDxjbnggY2xhc3M9Y254LWJ0bi1jb250YWluZXI+IDxjbnggY2xhc3M9Y254LXBsYXktaWNvbj4gPHN2ZyBtYXJrdXAtaW5saW5lIGNsYXNzPWNueC1jb2xvci1pY29uIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTUgNHYxNmwxNi04eiIgZmlsbC1ydWxlPWV2ZW5vZGQgLz48L3N2Zz4gPC9jbng+IDwvY254PiA8L2NueD4gPC9jbng+IDwvY254PiA8L2NueD4gPC9jbng+IDxjbnggY2xhc3M9Y254LWctY2FyZC10ZXh0LWNvbnRhaW5lcj4gPGNueCBjbGFzcz1jbngtZy1jYXJkLXRleHQ+IDxjbngtc3Bhbj48L2NueC1zcGFuPiA8L2NueD4gPC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC1pY29uLWJ1dHRvbiBjbngtYnV0dG9uLWNhcHRpb24gY254LXVpLWJ0bi1ob3ZlcmFibGUiPiA8Y254IGNsYXNzPWNueC1idG4tY29udGFpbmVyPiA8Y254IGNsYXNzPWNueC1jYXB0aW9uLW9mZi1pY29uPiA8c3ZnIG1hcmt1cC1pbmxpbmUgY2xhc3M9Y254LWNvbG9yLWljb24geG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMjAuNTU2IDVIMy40NDRDMy4xNjMgNSAzIDUuMTUgMyA1LjI1djEzLjVjMCAuMS4xNjMuMjUuNDQ0LjI1aDE3LjExYy4yNzUgMCAuNDQ0LS4xNTYuNDQ0LS4yNVY1LjI1YzAtLjA5NC0uMTctLjI1LS40NDQtLjI1em0wLTJDMjEuOSAzIDIzIDQuMDEzIDIzIDUuMjV2MTMuNWMwIDEuMjM4LTEuMSAyLjI1LTIuNDQ0IDIuMjVIMy40NDRDMi4wODggMjEgMSAxOS45ODggMSAxOC43NVY1LjI1QzEgNC4wMTMgMi4wODggMyAzLjQ0NCAzaDE3LjExek0xMSAxMUg5LjV2LS41aC0ydjNoMlYxM0gxMXYxYzAgLjU1LS40NSAxLTEgMUg3Yy0uNTUgMC0xLS40NS0xLTF2LTRjMC0uNTUuNDUtMSAxLTFoM2MuNTUgMCAxIC40NSAxIDF2MXptNyAwaC0xLjV2LS41aC0ydjNoMlYxM0gxOHYxYzAgLjU1LS40NSAxLTEgMWgtM2MtLjU1IDAtMS0uNDUtMS0xdi00YzAtLjU1LjQ1LTEgMS0xaDNjLjU1IDAgMSAuNDUgMSAxdjF6IiBmaWxsLXJ1bGU9ZXZlbm9kZCAvPjwvc3ZnPiA8L2NueD4gPGNueCBjbGFzcz1jbngtY2FwdGlvbi1vbi1pY29uPiA8c3ZnIG1hcmt1cC1pbmxpbmUgY2xhc3M9Y254LWNvbG9yLWljb24geG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyBmaWxsPW5vbmU+PHBhdGggZD0iTTIwLjYgM0MyMS45IDMgMjMgNCAyMyA1LjNMMjMgMTguOEMyMyAyMCAyMS45IDIxIDIwLjYgMjFMMy40IDIxQzIuMSAyMSAxIDIwIDEgMTguOEwxIDUuM0MxIDQgMi4xIDMgMy40IDNMMjAuNiAzWiIgY2xhc3M9Y254LWNvbG9yLWFjY2VudCAvPjxwYXRoIGQ9Ik0xMSAxMUw5LjUgMTEgOS41IDEwLjUgNy41IDEwLjUgNy41IDEzLjUgOS41IDEzLjUgOS41IDEzIDExIDEzIDExIDE0QzExIDE0LjYgMTAuNiAxNSAxMCAxNUw3IDE1QzYuNSAxNSA2IDE0LjYgNiAxNEw2IDEwQzYgOS41IDYuNSA5IDcgOUwxMCA5QzEwLjYgOSAxMSA5LjUgMTEgMTBMMTEgMTFaTTE4IDExTDE2LjUgMTEgMTYuNSAxMC41IDE0LjUgMTAuNSAxNC41IDEzLjUgMTYuNSAxMy41IDE2LjUgMTMgMTggMTMgMTggMTRDMTggMTQuNiAxNy42IDE1IDE3IDE1TDE0IDE1QzEzLjUgMTUgMTMgMTQuNiAxMyAxNEwxMyAxMEMxMyA5LjUgMTMuNSA5IDE0IDlMMTcgOUMxNy42IDkgMTggOS41IDE4IDEwTDE4IDExWiIgY2xhc3M9Y254LWNvbG9yLWljb24gLz48L2c+PC9zdmc+IDwvY254PiA8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz1jbngtdWktbG9hZGVyPiA8c3ZnIGNsYXNzPWNueC1jb2xvci1hY2NlbnQgdmVyc2lvbj0xLjEgdmlld0JveD0iMCAwIDc5IDkwIiB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zz48cG9seWdvbiBwb2ludHM9IjIxIDczLjMyMiAxMSA3OSAxMSAxMiAyMSAxNy42NzgiIGZpbGw9bm9uZSBzdHJva2UtbGluZWNhcD1yb3VuZCBzdHJva2UtbGluZWpvaW49cm91bmQgLz48cG9seWdvbiBwb2ludHM9IjI3IDcwIDI3IDIxIDM4IDI3LjI2NyAzOCA2My43MzMiIGZpbGw9dHJhbnNwYXJlbnQgc3Ryb2tlLWxpbmVjYXA9cm91bmQgc3Ryb2tlLWxpbmVqb2luPXJvdW5kIC8+PHBvbHlnb24gcG9pbnRzPSI0NCA2MSA0NCAzMSA1NCAzNi43NjkgNTQgNTUuMjMxIiBmaWxsPW5vbmUgc3Ryb2tlLWxpbmVjYXA9cm91bmQgc3Ryb2tlLWxpbmVqb2luPXJvdW5kIC8+PHBvbHlnb24gcG9pbnRzPSI2MCA1MSA2MCA0MCA3MCA0NS41IiBmaWxsPW5vbmUgc3Ryb2tlLWxpbmVjYXA9cm91bmQgc3Ryb2tlLWxpbmVqb2luPXJvdW5kIC8+PC9zdmc+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgdmlld0JveD0iMCAwIDI1IDI1IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTUgMjEuNDUzYzIuMDIyIDEuNjI3IDQuNiAyLjYwMiA3LjM4NyAyLjYwMiAzLjk3MyAwIDcuNDg1LTEuOTY3IDkuNjIyLTQuOTc3bC00LjU5Ni0zLjM0YTMuODcgMy44NyAwIDAgMC00LjU0OCAwTDUgMjEuNDUzek0yMiA0Ljk3N0ExMS43NSAxMS43NSAwIDAgMCAxMi4zODcgMCAxMS43NCAxMS43NCAwIDAgMCA1IDIuNjAybDcuOSA1Ljc0YTMuODEgMy44MSAwIDAgMCA0LjQ3OSAwbDQuNjMtMy4zNjR6bTEuNTYzIDExLjM5NWMuNDk0LTEuMy43NjctMi43MTIuNzY3LTQuMTg2UzI0LjA1NyA5LjMgMjMuNTYzIDhsLTMuODU4IDIuODAzYTEuNzEgMS43MSAwIDAgMCAwIDIuNzY2bDMuODU4IDIuODAzeiIgZmlsbD0iI2ZmZiI+PC9wYXRoPjxwYXRoIGQ9Ik0yLjM3OCA1Yy0uMDI0LS4wMTctLjA1Ny0uMDEyLS4wNzQuMDFBMTEuNzQgMTEuNzQgMCAwIDAgMCAxMi4wMjVhMTEuNzQgMTEuNzQgMCAwIDAgMi4zMDQgNy4wMDRjLjAxNy4wMjMuMDUuMDI4LjA3NC4wMWw4LjAxMy01LjgyMmMuODEtLjU5LjgxLTEuNzk3IDAtMi4zODZMMi4zNzggNXoiIGZpbGw9IiMwOWYiPjwvcGF0aD48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzUpLCBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlLCBuLCByLCBoLCBhLCBvLCBjLCB1LCBsLCBkLCBmLCBwLCBiLCB2LCBtLCBnLCB5OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9IHMuRmllbGRzLmNtcElkLCBlID0gcy5GaWVsZHMuY21wVmVyc2lvbiwgbiA9IHMuRmllbGRzLmNvbnNlbnRMYW5ndWFnZSwgciA9IHMuRmllbGRzLmNvbnNlbnRTY3JlZW4sIGggPSBzLkZpZWxkcy5jcmVhdGVkLCBhID0gcy5GaWVsZHMuaXNTZXJ2aWNlU3BlY2lmaWMsIG8gPSBzLkZpZWxkcy5sYXN0VXBkYXRlZCwgYyA9IHMuRmllbGRzLnBvbGljeVZlcnNpb24sIHUgPSBzLkZpZWxkcy5wdWJsaXNoZXJDb3VudHJ5Q29kZSwgbCA9IHMuRmllbGRzLnB1Ymxpc2hlckxlZ2l0aW1hdGVJbnRlcmVzdHMsIGQgPSBzLkZpZWxkcy5wdWJsaXNoZXJDb25zZW50cywgZiA9IHMuRmllbGRzLnB1cnBvc2VDb25zZW50cywgcCA9IHMuRmllbGRzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLCBiID0gcy5GaWVsZHMucHVycG9zZU9uZVRyZWF0bWVudCwgdiA9IHMuRmllbGRzLnNwZWNpYWxGZWF0dXJlT3B0aW5zLCBtID0gcy5GaWVsZHMudXNlTm9uU3RhbmRhcmRTdGFja3MsIGcgPSBzLkZpZWxkcy52ZW5kb3JMaXN0VmVyc2lvbiwgeSA9IHMuRmllbGRzLnZlcnNpb24sIHRbaV0gPSAxMiwgdFtlXSA9IDEyLCB0W25dID0gMTIsIHRbcl0gPSA2LCB0W2hdID0gMzYsIHRbYV0gPSAxLCB0W29dID0gMzYsIHRbY10gPSA2LCB0W3VdID0gMTIsIHRbbF0gPSAyNCwgdFtkXSA9IDI0LCB0W2ZdID0gMjQsIHRbcF0gPSAyNCwgdFtiXSA9IDEsIHRbdl0gPSAxMiwgdFttXSA9IDEsIHRbZ10gPSAxMiwgdFt5XSA9IDYsIHQuYW55Qm9vbGVhbiA9IDEsIHQuZW5jb2RpbmdUeXBlID0gMSwgdC5tYXhJZCA9IDE2LCB0Lm51bUN1c3RvbVB1cnBvc2VzID0gNiwgdC5udW1FbnRyaWVzID0gMTIsIHQubnVtUmVzdHJpY3Rpb25zID0gMTIsIHQucHVycG9zZUlkID0gNiwgdC5yZXN0cmljdGlvblR5cGUgPSAyLCB0LnNlZ21lbnRUeXBlID0gMywgdC5zaW5nbGVPclJhbmdlID0gMSwgdC52ZW5kb3JJZCA9IDE2LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuQml0TGVuZ3RoID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSksIChzID0gaS5SZXN0cmljdGlvblR5cGUgfHwgKGkuUmVzdHJpY3Rpb25UeXBlID0ge30pKVtzLk5PVF9BTExPV0VEID0gMF0gPSAnTk9UX0FMTE9XRUQnLCBzW3MuUkVRVUlSRV9DT05TRU5UID0gMV0gPSAnUkVRVUlSRV9DT05TRU5UJywgc1tzLlJFUVVJUkVfTEkgPSAyXSA9ICdSRVFVSVJFX0xJJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDQ2KSwgbiA9IGUoMzMpLCByID0gZSgzNSksIGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAnJywgbiA9IDE7IG4gPD0gaTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gcy5Cb29sZWFuRW5jb2Rlci5lbmNvZGUodC5oYXMobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmxlbmd0aCAhPT0gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgbi5EZWNvZGluZ0Vycm9yKCdiaXRmaWVsZCBlbmNvZGluZyBsZW5ndGggbWlzbWF0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBuZXcgci5WZWN0b3IoKSwgaCA9IDE7IGggPD0gaTsgaCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuQm9vbGVhbkVuY29kZXIuZGVjb2RlKHRbaCAtIDFdKSAmJiBlLnNldChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpdExlbmd0aCA9IHQubGVuZ3RoLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuRml4ZWRWZWN0b3JFbmNvZGVyID0gaDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8Y254IGNsYXNzPWNueC11aS1wcm9ncmVzcy1sYWJlbD4gPGNueC1zcGFuPjwvY254LXNwYW4+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgY2xhc3M9ImNueC1jb2xvci1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE4IDIxaDNWM2gtM3YxOHpNMyAyMWwxNC05TDMgM3YxOHoiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPjwvc3ZnPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBlKDEyMCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBsOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSBlKDM5KSwgciA9IG4uTG9uZ0JpdHMsIGggPSBuLmJhc2U2NCwgYSA9IG4udXRmODsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZm4gPSB0LCB0aGlzLmxlbiA9IGksIHRoaXMubmV4dCA9IHZvaWQgMCwgdGhpcy52YWwgPSBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUodCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZCA9IHQuaGVhZCwgdGhpcy50YWlsID0gdC50YWlsLCB0aGlzLmxlbiA9IHQubGVuLCB0aGlzLm5leHQgPSB0LnN0YXRlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW4gPSAwLCB0aGlzLmhlYWQgPSBuZXcgbyhjLCAwLCAwKSwgdGhpcy50YWlsID0gdGhpcy5oZWFkLCB0aGlzLnN0YXRlcyA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5CdWZmZXIgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobC5jcmVhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoKTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGwoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGlbZV0gPSAyNTUgJiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW4gPSB0LCB0aGlzLm5leHQgPSB2b2lkIDAsIHRoaXMudmFsID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoOyB0LmhpOykKICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gMTI3ICYgdC5sbyB8IDEyOCwgdC5sbyA9ICh0LmxvID4+PiA3IHwgdC5oaSA8PCAyNSkgPj4+IDAsIHQuaGkgPj4+PSA3OwogICAgICAgICAgICAgICAgICAgIGZvciAoOyB0LmxvID4gMTI3OykKICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gMTI3ICYgdC5sbyB8IDEyOCwgdC5sbyA9IHQubG8gPj4+IDc7CiAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gdC5sbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGlbZV0gPSAyNTUgJiB0LCBpW2UgKyAxXSA9IHQgPj4+IDggJiAyNTUsIGlbZSArIDJdID0gdCA+Pj4gMTYgJiAyNTUsIGlbZSArIDNdID0gdCA+Pj4gMjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsLmNyZWF0ZSA9IGQoKSwgbC5hbGxvYyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBuLkFycmF5KHQpOwogICAgICAgICAgICAgICAgfSwgbi5BcnJheSAhPT0gQXJyYXkgJiYgKGwuYWxsb2MgPSBuLnBvb2wobC5hbGxvYywgbi5BcnJheS5wcm90b3R5cGUuc3ViYXJyYXkpKSwgbC5wcm90b3R5cGUuVHMgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRhaWwgPSB0aGlzLnRhaWwubmV4dCA9IG5ldyBvKHQsIGksIGUpLCB0aGlzLmxlbiArPSBpLCB0aGlzOwogICAgICAgICAgICAgICAgfSwgcC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSwgcC5wcm90b3R5cGUuZm4gPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoOyB0ID4gMTI3OykKICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gMTI3ICYgdCB8IDEyOCwgdCA+Pj49IDc7CiAgICAgICAgICAgICAgICAgICAgaVtlXSA9IHQ7CiAgICAgICAgICAgICAgICB9LCBsLnByb3RvdHlwZS51aW50MzIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbiArPSAodGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQgPSBuZXcgcCgodCA+Pj49IDApIDwgMTI4ID8gMSA6IHQgPCAxNjM4NCA/IDIgOiB0IDwgMjA5NzE1MiA/IDMgOiB0IDwgMjY4NDM1NDU2ID8gNCA6IDUsIHQpKS5sZW4sIHRoaXM7CiAgICAgICAgICAgICAgICB9LCBsLnByb3RvdHlwZS5pbnQzMiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPCAwID8gdGhpcy5UcyhiLCAxMCwgci5mcm9tTnVtYmVyKHQpKSA6IHRoaXMudWludDMyKHQpOwogICAgICAgICAgICAgICAgfSwgbC5wcm90b3R5cGUuc2ludDMyID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51aW50MzIoKHQgPDwgMSBeIHQgPj4gMzEpID4+PiAwKTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLnVpbnQ2NCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSByLmZyb20odCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVHMoYiwgaS5sZW5ndGgoKSwgaSk7CiAgICAgICAgICAgICAgICB9LCBsLnByb3RvdHlwZS5pbnQ2NCA9IGwucHJvdG90eXBlLnVpbnQ2NCwgbC5wcm90b3R5cGUuc2ludDY0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIuZnJvbSh0KS56ekVuY29kZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRzKGIsIGkubGVuZ3RoKCksIGkpOwogICAgICAgICAgICAgICAgfSwgbC5wcm90b3R5cGUuYm9vbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVHMoZiwgMSwgdCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLmZpeGVkMzIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRzKHYsIDQsIHQgPj4+IDApOwogICAgICAgICAgICAgICAgfSwgbC5wcm90b3R5cGUuc2ZpeGVkMzIgPSBsLnByb3RvdHlwZS5maXhlZDMyLCBsLnByb3RvdHlwZS5maXhlZDY0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIuZnJvbSh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ucyh2LCA0LCBpLmxvKS5Ucyh2LCA0LCBpLmhpKTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLnNmaXhlZDY0ID0gbC5wcm90b3R5cGUuZml4ZWQ2NCwgbC5wcm90b3R5cGUuZmxvYXQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRzKG4uZmxvYXQud3JpdGVGbG9hdExFLCA0LCB0KTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLmRvdWJsZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVHMobi5mbG9hdC53cml0ZURvdWJsZUxFLCA4LCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbSA9IG4uQXJyYXkucHJvdG90eXBlLnNldCA/IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgaS5zZXQodCwgZSk7CiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHQubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgIGlbZSArIHNdID0gdFtzXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBsLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0Lmxlbmd0aCA+Pj4gMDsKICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRzKGYsIDEsIDApOwogICAgICAgICAgICAgICAgICAgIGlmIChuLmlzU3RyaW5nKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbC5hbGxvYyhpID0gaC5sZW5ndGgodCkpOwogICAgICAgICAgICAgICAgICAgICAgICBoLmRlY29kZSh0LCBlLCAwKSwgdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVpbnQzMihpKS5UcyhtLCBpLCB0KTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhLmxlbmd0aCh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/IHRoaXMudWludDMyKGkpLlRzKGEud3JpdGUsIGksIHQpIDogdGhpcy5UcyhmLCAxLCAwKTsKICAgICAgICAgICAgICAgIH0sIGwucHJvdG90eXBlLmZvcmsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzID0gbmV3IHUodGhpcyksIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBvKGMsIDAsIDApLCB0aGlzLmxlbiA9IDAsIHRoaXM7CiAgICAgICAgICAgICAgICB9LCBsLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZXMgPyAodGhpcy5oZWFkID0gdGhpcy5zdGF0ZXMuaGVhZCwgdGhpcy50YWlsID0gdGhpcy5zdGF0ZXMudGFpbCwgdGhpcy5sZW4gPSB0aGlzLnN0YXRlcy5sZW4sIHRoaXMuc3RhdGVzID0gdGhpcy5zdGF0ZXMubmV4dCkgOiAodGhpcy5oZWFkID0gdGhpcy50YWlsID0gbmV3IG8oYywgMCwgMCksIHRoaXMubGVuID0gMCksIHRoaXM7CiAgICAgICAgICAgICAgICB9LCBsLnByb3RvdHlwZS5sZGVsaW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhlYWQsIGkgPSB0aGlzLnRhaWwsIGUgPSB0aGlzLmxlbjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXNldCgpLnVpbnQzMihlKSwgZSAmJiAodGhpcy50YWlsLm5leHQgPSB0Lm5leHQsIHRoaXMudGFpbCA9IGksIHRoaXMubGVuICs9IGUpLCB0aGlzOwogICAgICAgICAgICAgICAgfSwgbC5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB0aGlzLmhlYWQubmV4dCwgaSA9IHRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLCBlID0gMDsgdDspCiAgICAgICAgICAgICAgICAgICAgICAgIHQuZm4odC52YWwsIGksIGUpLCBlICs9IHQubGVuLCB0ID0gdC5uZXh0OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfSwgbC5LaSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcyA9IHQsIGwuY3JlYXRlID0gZCgpLCBzLktpKCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2Ygd2luZG93ICYmIChlID0gd2luZG93KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IGU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBvOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSBlKDM5KSwgciA9IG4uTG9uZ0JpdHMsIGggPSBuLnV0Zjg7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2VFcnJvcignaW5kZXggb3V0IG9mIHJhbmdlOiAnICsgdC5wb3MgKyAnICsgJyArIChpIHx8IDEpICsgJyA+ICcgKyB0Lmxlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1ZiA9IHQsIHRoaXMucG9zID0gMCwgdGhpcy5sZW4gPSB0Lmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjLCB1ID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFVpbnQ4QXJyYXkgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgQXJyYXkuaXNBcnJheSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2lsbGVnYWwgYnVmZmVyJyk7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignaWxsZWdhbCBidWZmZXInKTsKICAgICAgICAgICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5CdWZmZXIgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvLmNyZWF0ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uQnVmZmVyLmlzQnVmZmVyKHQpID8gbmV3IHModCkgOiB1KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IHIoMCwgMCksIGkgPSAwOwogICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMubGVuIC0gdGhpcy5wb3MgPiA0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDM7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGEodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sbyA9ICh0LmxvIHwgKDEyNyAmIHRoaXMuYnVmW3RoaXMucG9zXSkgPDwgNyAqIGkpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5sbyA9ICh0LmxvIHwgKDEyNyAmIHRoaXMuYnVmW3RoaXMucG9zKytdKSA8PCA3ICogaSkgPj4+IDAsIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgNDsgKytpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sbyA9ICh0LmxvIHwgKDEyNyAmIHRoaXMuYnVmW3RoaXMucG9zXSkgPDwgNyAqIGkpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIGlmICh0LmxvID0gKHQubG8gfCAoMTI3ICYgdGhpcy5idWZbdGhpcy5wb3NdKSA8PCAyOCkgPj4+IDAsIHQuaGkgPSAodC5oaSB8ICgxMjcgJiB0aGlzLmJ1Zlt0aGlzLnBvc10pID4+IDQpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPSAwLCB0aGlzLmxlbiAtIHRoaXMucG9zID4gNCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDU7ICsraSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmhpID0gKHQuaGkgfCAoMTI3ICYgdGhpcy5idWZbdGhpcy5wb3NdKSA8PCA3ICogaSArIDMpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCA1OyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmxlbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaGkgPSAodC5oaSB8ICgxMjcgJiB0aGlzLmJ1Zlt0aGlzLnBvc10pIDw8IDcgKiBpICsgMykgPj4+IDAsIHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2ludmFsaWQgdmFyaW50IGVuY29kaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRbaSAtIDRdIHwgdFtpIC0gM10gPDwgOCB8IHRbaSAtIDJdIDw8IDE2IHwgdFtpIC0gMV0gPDwgMjQpID4+PiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wb3MgKyA4ID4gdGhpcy5sZW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGEodGhpcywgOCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyByKGYodGhpcy5idWYsIHRoaXMucG9zICs9IDQpLCBmKHRoaXMuYnVmLCB0aGlzLnBvcyArPSA0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLmNyZWF0ZSA9IGwoKSwgby5wcm90b3R5cGUuUHMgPSBuLkFycmF5LnByb3RvdHlwZS5zdWJhcnJheSB8fCBuLkFycmF5LnByb3RvdHlwZS5zbGljZSwgby5wcm90b3R5cGUudWludDMyID0gKGMgPSA0Mjk0OTY3Mjk1LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPSAoMTI3ICYgdGhpcy5idWZbdGhpcy5wb3NdKSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIGlmIChjID0gKGMgfCAoMTI3ICYgdGhpcy5idWZbdGhpcy5wb3NdKSA8PCA3KSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIGlmIChjID0gKGMgfCAoMTI3ICYgdGhpcy5idWZbdGhpcy5wb3NdKSA8PCAxNCkgPj4+IDAsIHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICBpZiAoYyA9IChjIHwgKDEyNyAmIHRoaXMuYnVmW3RoaXMucG9zXSkgPDwgMjEpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGMgPSAoYyB8ICgxNSAmIHRoaXMuYnVmW3RoaXMucG9zXSkgPDwgMjgpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnBvcyArPSA1KSA+IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnBvcyA9IHRoaXMubGVuLCBhKHRoaXMsIDEwKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCBvLnByb3RvdHlwZS5pbnQzMiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCB8IHRoaXMudWludDMyKCk7CiAgICAgICAgICAgICAgICB9LCBvLnByb3RvdHlwZS5zaW50MzIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID4+PiAxIF4gLSgxICYgdCkgfCAwOwogICAgICAgICAgICAgICAgfSwgby5wcm90b3R5cGUuYm9vbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gdGhpcy51aW50MzIoKTsKICAgICAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLmZpeGVkMzIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zICsgNCA+IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhKHRoaXMsIDQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmKHRoaXMuYnVmLCB0aGlzLnBvcyArPSA0KTsKICAgICAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnNmaXhlZDMyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyArIDQgPiB0aGlzLmxlbikKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYSh0aGlzLCA0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCB8IGYodGhpcy5idWYsIHRoaXMucG9zICs9IDQpOwogICAgICAgICAgICAgICAgfSwgby5wcm90b3R5cGUuZmxvYXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zICsgNCA+IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhKHRoaXMsIDQpOwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5mbG9hdC5yZWFkRmxvYXRMRSh0aGlzLmJ1ZiwgdGhpcy5wb3MpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcyArPSA0LCB0OwogICAgICAgICAgICAgICAgfSwgby5wcm90b3R5cGUuZG91YmxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvcyArIDggPiB0aGlzLmxlbikKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYSh0aGlzLCA0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uZmxvYXQucmVhZERvdWJsZUxFKHRoaXMuYnVmLCB0aGlzLnBvcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucG9zICs9IDgsIHQ7CiAgICAgICAgICAgICAgICB9LCBvLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMudWludDMyKCksIGkgPSB0aGlzLnBvcywgZSA9IHRoaXMucG9zICsgdDsKICAgICAgICAgICAgICAgICAgICBpZiAoZSA+IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBvcyArPSB0LCBBcnJheS5pc0FycmF5KHRoaXMuYnVmKSA/IHRoaXMuYnVmLnNsaWNlKGksIGUpIDogaSA9PT0gZSA/IG5ldyB0aGlzLmJ1Zi5jb25zdHJ1Y3RvcigwKSA6IHRoaXMuUHMuY2FsbCh0aGlzLmJ1ZiwgaSwgZSk7CiAgICAgICAgICAgICAgICB9LCBvLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmJ5dGVzKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgucmVhZCh0LCAwLCB0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9LCBvLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgPT0gdHlwZW9mIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zICsgdCA+IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYSh0aGlzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gdDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucG9zID49IHRoaXMubGVuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGEodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDEyOCAmIHRoaXMuYnVmW3RoaXMucG9zKytdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnNraXBUeXBlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcCg4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAodGhpcy51aW50MzIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IDQgIT0gKHQgPSA3ICYgdGhpcy51aW50MzIoKSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwVHlwZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAoNCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdpbnZhbGlkIHdpcmUgdHlwZSAnICsgdCArICcgYXQgb2Zmc2V0ICcgKyB0aGlzLnBvcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfSwgby5LaSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcyA9IHQsIG8uY3JlYXRlID0gbCgpLCBzLktpKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuLkxvbmcgPyAndG9Mb25nJyA6ICd0b051bWJlcic7CiAgICAgICAgICAgICAgICAgICAgbi5tZXJnZShvLnByb3RvdHlwZSwgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuY2FsbCh0aGlzKVtpXSghMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuY2FsbCh0aGlzKVtpXSghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNpbnQ2NDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuY2FsbCh0aGlzKS56ekRlY29kZSgpW2ldKCExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQ2NDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuY2FsbCh0aGlzKVtpXSghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNmaXhlZDY0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcC5jYWxsKHRoaXMpW2ldKCExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHModCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSB8fCAoaVtlXSA9IHRbZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSksIHMoZSg2NSkpLCBzKGUoNTUpKSwgcyhlKDE0MikpLCBzKGUoMTQ2KSksIHMoZSg3MCkpLCBzKGUoNzYpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDMzKSwgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lbmNvZGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEvXlswLTFdKyQvLnRlc3QodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHMuRW5jb2RpbmdFcnJvcignSW52YWxpZCBiaXRGaWVsZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0Lmxlbmd0aCAlIHRoaXMuTENNOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSBpID8gJzAnLnJlcGVhdCh0aGlzLkxDTSAtIGkpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gJycsIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4gKz0gdGhpcy5CQVNJUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9IHRoaXMuRElDVFtwYXJzZUludCh0LnN1YnN0cihuLCB0aGlzLkJBU0lTKSwgMildOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghL15bQS1aYS16MC05XC1fXSskLy50ZXN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBzLkRlY29kaW5nRXJyb3IoJ0ludmFsaWRseSBlbmNvZGVkIEJhc2U2NFVSTCBzdHJpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAnJywgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLlJFVkVSU0VfRElDVC5nZXQodFtlXSkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAnMCcucmVwZWF0KHRoaXMuQkFTSVMgLSBuLmxlbmd0aCkgKyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuRElDVCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fJywgdC5SRVZFUlNFX0RJQ1QgPSBuZXcgTWFwKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ08nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdZJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgdC5CQVNJUyA9IDYsIHQuTENNID0gMjQsIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgaS5CYXNlNjRVcmwgPSBuOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSB0aGlzICYmIHRoaXMuRXMgfHwgKHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX3Byb3RvX18gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAodFtlXSA9IGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcyh0LCBpKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBpID8gT2JqZWN0LmNyZWF0ZShpKSA6IChlLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCBuZXcgZSgpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCAhPT0gdCAmJiB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucm9vdCA9IG51bGwsIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBpLnByb3RvdHlwZS5pc0VtcHR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMucm9vdDsKICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0VtcHR5KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJvb3QgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSB0aGlzLnJvb3Q7OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8IGkudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGkubGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sZWZ0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA+IGkudmFsdWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpLnJpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJpZ2h0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgaSA9IHRoaXMucm9vdDsgaTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5sZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGkubGVmdDsgZS5yaWdodCAmJiBlLnJpZ2h0ICE9IGk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5yaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJpZ2h0ID09IGkgPyAoZS5yaWdodCA9IG51bGwsIHQucHVzaChpLnZhbHVlKSwgaSA9IGkucmlnaHQpIDogKGUucmlnaHQgPSBpLCBpID0gaS5sZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChpLnZhbHVlKSwgaSA9IGkucmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9ICExLCBlID0gdGhpcy5yb290OyBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudmFsdWUgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID4gZS52YWx1ZSA/IGUgPSBlLnJpZ2h0IDogdCA8IGUudmFsdWUgJiYgKGUgPSBlLmxlZnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm1pbiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZvaWQgMCA9PT0gdCAmJiAodCA9IHRoaXMucm9vdCk7IHQ7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5sZWZ0ID8gdCA9IHQubGVmdCA6IChpID0gdC52YWx1ZSwgdCA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5tYXggPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2b2lkIDAgPT09IHQgJiYgKHQgPSB0aGlzLnJvb3QpOyB0OykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmlnaHQgPyB0ID0gdC5yaWdodCA6IChpID0gdC52YWx1ZSwgdCA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGkgJiYgKGkgPSB0aGlzLnJvb3QpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gbnVsbCwgcyA9ICdsZWZ0JzsgaTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8IGkudmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGksIGkgPSBpLmxlZnQsIHMgPSAnbGVmdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0ID4gaS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaSwgaSA9IGkucmlnaHQsIHMgPSAncmlnaHQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkubGVmdCB8fCBpLnJpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5sZWZ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkucmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMubWluKGkucmlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKG4sIGkucmlnaHQpLCBpLnZhbHVlID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBlW3NdID0gaS5sZWZ0IDogdGhpcy5yb290ID0gaS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gZVtzXSA9IGkucmlnaHQgOiB0aGlzLnJvb3QgPSBpLnJpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA/IGVbc10gPSBudWxsIDogdGhpcy5yb290ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgfShlKDQxKS5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgaS5CaW5hcnlTZWFyY2hUcmVlID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY21wSWQgPSAnY21wSWQnLCB0LmNtcFZlcnNpb24gPSAnY21wVmVyc2lvbicsIHQuY29uc2VudExhbmd1YWdlID0gJ2NvbnNlbnRMYW5ndWFnZScsIHQuY29uc2VudFNjcmVlbiA9ICdjb25zZW50U2NyZWVuJywgdC5jcmVhdGVkID0gJ2NyZWF0ZWQnLCB0LnN1cHBvcnRPT0IgPSAnc3VwcG9ydE9PQicsIHQuaXNTZXJ2aWNlU3BlY2lmaWMgPSAnaXNTZXJ2aWNlU3BlY2lmaWMnLCB0Lmxhc3RVcGRhdGVkID0gJ2xhc3RVcGRhdGVkJywgdC5udW1DdXN0b21QdXJwb3NlcyA9ICdudW1DdXN0b21QdXJwb3NlcycsIHQucG9saWN5VmVyc2lvbiA9ICdwb2xpY3lWZXJzaW9uJywgdC5wdWJsaXNoZXJDb3VudHJ5Q29kZSA9ICdwdWJsaXNoZXJDb3VudHJ5Q29kZScsIHQucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMgPSAncHVibGlzaGVyQ3VzdG9tQ29uc2VudHMnLCB0LnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSAncHVibGlzaGVyQ3VzdG9tTGVnaXRpbWF0ZUludGVyZXN0cycsIHQucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cyA9ICdwdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzJywgdC5wdWJsaXNoZXJDb25zZW50cyA9ICdwdWJsaXNoZXJDb25zZW50cycsIHQucHVibGlzaGVyUmVzdHJpY3Rpb25zID0gJ3B1Ymxpc2hlclJlc3RyaWN0aW9ucycsIHQucHVycG9zZUNvbnNlbnRzID0gJ3B1cnBvc2VDb25zZW50cycsIHQucHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMgPSAncHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMnLCB0LnB1cnBvc2VPbmVUcmVhdG1lbnQgPSAncHVycG9zZU9uZVRyZWF0bWVudCcsIHQuc3BlY2lhbEZlYXR1cmVPcHRpbnMgPSAnc3BlY2lhbEZlYXR1cmVPcHRpbnMnLCB0LnVzZU5vblN0YW5kYXJkU3RhY2tzID0gJ3VzZU5vblN0YW5kYXJkU3RhY2tzJywgdC52ZW5kb3JDb25zZW50cyA9ICd2ZW5kb3JDb25zZW50cycsIHQudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyA9ICd2ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzJywgdC52ZW5kb3JMaXN0VmVyc2lvbiA9ICd2ZW5kb3JMaXN0VmVyc2lvbicsIHQudmVuZG9yc0FsbG93ZWQgPSAndmVuZG9yc0FsbG93ZWQnLCB0LnZlbmRvcnNEaXNjbG9zZWQgPSAndmVuZG9yc0Rpc2Nsb3NlZCcsIHQudmVyc2lvbiA9ICd2ZXJzaW9uJywgdDsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuRmllbGRzID0gczsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzLCBuID0gdGhpcyAmJiB0aGlzLkVzIHx8IChzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19wcm90b19fID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKHRbZV0gPSBpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHModCwgaSksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gaSA/IE9iamVjdC5jcmVhdGUoaSkgOiAoZS5wcm90b3R5cGUgPSBpLnByb3RvdHlwZSwgbmV3IGUoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gZSg0MSksIGggPSBlKDMzKSwgYSA9IGUoNTYpLCBvID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHQuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gaSAmJiAocy5wdXJwb3NlSWQgPSBpKSwgdm9pZCAwICE9PSBlICYmIChzLnJlc3RyaWN0aW9uVHlwZSA9IGUpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBpLnVuSGFzaCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuc3BsaXQodGhpcy5oYXNoU2VwYXJhdG9yKSwgcyA9IG5ldyBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiAhPT0gZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGguVENNb2RlbEVycm9yKCdoYXNoJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5wdXJwb3NlSWQgPSBwYXJzZUludChlWzBdLCAxMCksIHMucmVzdHJpY3Rpb25UeXBlID0gcGFyc2VJbnQoZVsxXSwgMTApLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdoYXNoJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgaGFzaCBpbnZhbGlkIFB1cnBvc2VSZXN0cmljdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyArIHRoaXMucHVycG9zZUlkICsgaS5oYXNoU2VwYXJhdG9yICsgdGhpcy5yZXN0cmljdGlvblR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdwdXJwb3NlSWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wdXJwb3NlSWRfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VJZF8gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5wcm90b3R5cGUuaXNWYWxpZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHRoaXMucHVycG9zZUlkKSAmJiB0aGlzLnB1cnBvc2VJZCA+IDAgJiYgKHRoaXMucmVzdHJpY3Rpb25UeXBlID09PSBhLlJlc3RyaWN0aW9uVHlwZS5OT1RfQUxMT1dFRCB8fCB0aGlzLnJlc3RyaWN0aW9uVHlwZSA9PT0gYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9DT05TRU5UIHx8IHRoaXMucmVzdHJpY3Rpb25UeXBlID09PSBhLlJlc3RyaWN0aW9uVHlwZS5SRVFVSVJFX0xJKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuaXNTYW1lQXMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVycG9zZUlkID09PSB0LnB1cnBvc2VJZCAmJiB0aGlzLnJlc3RyaWN0aW9uVHlwZSA9PT0gdC5yZXN0cmljdGlvblR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuaGFzaFNlcGFyYXRvciA9ICctJywgaTsKICAgICAgICAgICAgICAgICAgICB9KHIuQ2xvbmVhYmxlKTsKICAgICAgICAgICAgICAgIGkuUHVycG9zZVJlc3RyaWN0aW9uID0gbzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSksIChzID0gaS5TZWdtZW50IHx8IChpLlNlZ21lbnQgPSB7fSkpLkNPUkUgPSAnY29yZScsIHMuVkVORE9SU19ESVNDTE9TRUQgPSAndmVuZG9yc0Rpc2Nsb3NlZCcsIHMuVkVORE9SU19BTExPV0VEID0gJ3ZlbmRvcnNBbGxvd2VkJywgcy5QVUJMSVNIRVJfVEMgPSAncHVibGlzaGVyVEMnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpIHx8IChpW2VdID0gdFtlXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KSwgcyhlKDQ2KSksIHMoZSg3MSkpLCBzKGUoMTQzKSksIHMoZSg1NykpLCBzKGUoNDApKSwgcyhlKDcyKSksIHMoZSg3MykpLCBzKGUoNzUpKSwgcyhlKDc0KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg0MCksIG4gPSBlKDMzKSwgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lbmNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuSW50RW5jb2Rlci5lbmNvZGUoTWF0aC5yb3VuZCh0LmdldFRpbWUoKSAvIDEwMCksIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPT0gdC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG4uRGVjb2RpbmdFcnJvcignaW52YWxpZCBiaXQgbGVuZ3RoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZXRUaW1lKDEwMCAqIHMuSW50RW5jb2Rlci5kZWNvZGUodCwgaSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuRGF0ZUVuY29kZXIgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoNDApLCBuID0gZSgzMyksIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKHQgPSB0LnRvVXBwZXJDYXNlKCkpLmNoYXJDb2RlQXQoMCkgLSA2NSwgciA9IHQuY2hhckNvZGVBdCgxKSAtIDY1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPCAwIHx8IGUgPiAyNSB8fCByIDwgMCB8fCByID4gMjUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG4uRW5jb2RpbmdFcnJvcignaW52YWxpZCBsYW5ndWFnZSBjb2RlOiAnICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIDIgPT0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgbi5FbmNvZGluZ0Vycm9yKCdudW1CaXRzIG11c3QgYmUgZXZlbiwgJyArIGkgKyAnIGlzIG5vdCB2YWxpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLz0gMiwgcy5JbnRFbmNvZGVyLmVuY29kZShlLCBpKSArIHMuSW50RW5jb2Rlci5lbmNvZGUociwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9PSB0Lmxlbmd0aCB8fCB0Lmxlbmd0aCAlIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG4uRGVjb2RpbmdFcnJvcignaW52YWxpZCBiaXQgbGVuZ3RoIGZvciBsYW5ndWFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0Lmxlbmd0aCAvIDIsIHIgPSBzLkludEVuY29kZXIuZGVjb2RlKHQuc2xpY2UoMCwgZSksIGUpICsgNjUsIGggPSBzLkludEVuY29kZXIuZGVjb2RlKHQuc2xpY2UoZSksIGUpICsgNjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShyKSArIFN0cmluZy5mcm9tQ2hhckNvZGUoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgaS5MYW5nRW5jb2RlciA9IHI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg1NSksIG4gPSBlKDQ2KSwgciA9IGUoMzMpLCBoID0gZSg0MCksIGEgPSBlKDM1KSwgbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5lbmNvZGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBoLkludEVuY29kZXIuZW5jb2RlKHQubnVtUmVzdHJpY3Rpb25zLCBzLkJpdExlbmd0aC5udW1SZXN0cmljdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNFbXB0eSgpIHx8IHQuZ2V0UmVzdHJpY3Rpb25zKCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gaC5JbnRFbmNvZGVyLmVuY29kZShlLnB1cnBvc2VJZCwgcy5CaXRMZW5ndGgucHVycG9zZUlkKSwgaSArPSBoLkludEVuY29kZXIuZW5jb2RlKGUucmVzdHJpY3Rpb25UeXBlLCBzLkJpdExlbmd0aC5yZXN0cmljdGlvblR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB0LmdldFZlbmRvcnMoZSksIGEgPSByLmxlbmd0aCwgbyA9IDAsIGMgPSAwLCB1ID0gJycsIGwgPSAwOyBsIDwgYTsgbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gcltsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGMgJiYgKG8rKywgYyA9IGQpLCBsID09PSBhIC0gMSB8fCByW2wgKyAxXSA+IGQgKyAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9ICEoZCA9PT0gYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IG4uQm9vbGVhbkVuY29kZXIuZW5jb2RlKGYpLCB1ICs9IGguSW50RW5jb2Rlci5lbmNvZGUoYywgcy5CaXRMZW5ndGgudmVuZG9ySWQpLCBmICYmICh1ICs9IGguSW50RW5jb2Rlci5lbmNvZGUoZCwgcy5CaXRMZW5ndGgudmVuZG9ySWQpKSwgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBoLkludEVuY29kZXIuZW5jb2RlKG8sIHMuQml0TGVuZ3RoLm51bUVudHJpZXMpLCBpICs9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAwLCBlID0gbmV3IGEuUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yKCksIG8gPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9ucyksIHMuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHMuQml0TGVuZ3RoLm51bVJlc3RyaWN0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgbzsgYysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLnB1cnBvc2VJZCksIHMuQml0TGVuZ3RoLnB1cnBvc2VJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBzLkJpdExlbmd0aC5wdXJwb3NlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSksIHMuQml0TGVuZ3RoLnJlc3RyaWN0aW9uVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBzLkJpdExlbmd0aC5yZXN0cmljdGlvblR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgYS5QdXJwb3NlUmVzdHJpY3Rpb24odSwgbCksIGYgPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLm51bUVudHJpZXMpLCBzLkJpdExlbmd0aC5udW1FbnRyaWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IHMuQml0TGVuZ3RoLm51bUVudHJpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBmOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBuLkJvb2xlYW5FbmNvZGVyLmRlY29kZSh0LnN1YnN0cihpLCBzLkJpdExlbmd0aC5hbnlCb29sZWFuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gcy5CaXRMZW5ndGguYW55Qm9vbGVhbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLnZlbmRvcklkKSwgcy5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSArPSBzLkJpdExlbmd0aC52ZW5kb3JJZCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBoLkludEVuY29kZXIuZGVjb2RlKHQuc3Vic3RyKGksIHMuQml0TGVuZ3RoLnZlbmRvcklkKSwgcy5CaXRMZW5ndGgudmVuZG9ySWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKz0gcy5CaXRMZW5ndGgudmVuZG9ySWQsIG0gPCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyByLkRlY29kaW5nRXJyb3IoJ0ludmFsaWQgUmFuZ2VFbnRyeTogZW5kVmVuZG9ySWQgJyArIG0gKyAnIGlzIGxlc3MgdGhhbiAnICsgdik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gdjsgZyA8PSBtOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZGQoZywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hZGQodiwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYml0TGVuZ3RoID0gaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBpLlB1cnBvc2VSZXN0cmljdGlvblZlY3RvckVuY29kZXIgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzUpLCBuID0gZSg2NCksIHIgPSBlKDQwKSwgaCA9IGUoNDYpLCBhID0gZSg1NyksIG8gPSBlKDc1KSwgYyA9IGUoMzMpLCB1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVuY29kZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSA9IFtdLCBzID0gW10sIGEgPSByLkludEVuY29kZXIuZW5jb2RlKHQubWF4SWQsIG4uQml0TGVuZ3RoLm1heElkKSwgYyA9ICcnLCB1ID0gbi5CaXRMZW5ndGgubWF4SWQgKyBuLkJpdExlbmd0aC5lbmNvZGluZ1R5cGUsIGwgPSB1ICsgdC5tYXhJZCwgZCA9IDIgKiBuLkJpdExlbmd0aC52ZW5kb3JJZCArIG4uQml0TGVuZ3RoLnNpbmdsZU9yUmFuZ2UgKyBuLkJpdExlbmd0aC5udW1FbnRyaWVzLCBmID0gdSArIG4uQml0TGVuZ3RoLm51bUVudHJpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uIChyLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBoLkJvb2xlYW5FbmNvZGVyLmVuY29kZShyKSwgKGkgPSB0Lm1heElkID4gZCAmJiBmIDwgbCkgJiYgciAmJiAodC5oYXMoYSArIDEpID8gMCA9PT0gcy5sZW5ndGggJiYgKHMucHVzaChhKSwgZiArPSBuLkJpdExlbmd0aC5zaW5nbGVPclJhbmdlLCBmICs9IG4uQml0TGVuZ3RoLnZlbmRvcklkKSA6IChzLnB1c2goYSksIGYgKz0gbi5CaXRMZW5ndGgudmVuZG9ySWQsIGUucHVzaChzKSwgcyA9IFtdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSA/IChhICs9IG8uVmVjdG9yRW5jb2RpbmdUeXBlLlJBTkdFICsgJycsIGEgKz0gdGhpcy5idWlsZFJhbmdlRW5jb2RpbmcoZSkpIDogKGEgKz0gby5WZWN0b3JFbmNvZGluZ1R5cGUuRklFTEQgKyAnJywgYSArPSBjKSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHUgPSAwLCBsID0gci5JbnRFbmNvZGVyLmRlY29kZSh0LnN1YnN0cih1LCBuLkJpdExlbmd0aC5tYXhJZCksIG4uQml0TGVuZ3RoLm1heElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gbi5CaXRMZW5ndGgubWF4SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHIuSW50RW5jb2Rlci5kZWNvZGUodC5jaGFyQXQodSksIG4uQml0TGVuZ3RoLmVuY29kaW5nVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSArPSBuLkJpdExlbmd0aC5lbmNvZGluZ1R5cGUsIGQgPT09IG8uVmVjdG9yRW5jb2RpbmdUeXBlLlJBTkdFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSBuZXcgcy5WZWN0b3IoKSwgMSA9PT0gaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJzEnID09PSB0LnN1YnN0cih1LCAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBjLkRlY29kaW5nRXJyb3IoJ1VuYWJsZSB0byBkZWNvZGUgZGVmYXVsdCBjb25zZW50PTEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHIuSW50RW5jb2Rlci5kZWNvZGUodC5zdWJzdHIodSwgbi5CaXRMZW5ndGgubnVtRW50cmllcyksIG4uQml0TGVuZ3RoLm51bUVudHJpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gbi5CaXRMZW5ndGgubnVtRW50cmllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IGY7IHArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGguQm9vbGVhbkVuY29kZXIuZGVjb2RlKHQuY2hhckF0KHUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSArPSBuLkJpdExlbmd0aC5zaW5nbGVPclJhbmdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHIuSW50RW5jb2Rlci5kZWNvZGUodC5zdWJzdHIodSwgbi5CaXRMZW5ndGgudmVuZG9ySWQpLCBuLkJpdExlbmd0aC52ZW5kb3JJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1ICs9IG4uQml0TGVuZ3RoLnZlbmRvcklkLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHIuSW50RW5jb2Rlci5kZWNvZGUodC5zdWJzdHIodSwgbi5CaXRMZW5ndGgudmVuZG9ySWQpLCBuLkJpdExlbmd0aC52ZW5kb3JJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IG4uQml0TGVuZ3RoLnZlbmRvcklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IHY7IGcgPD0gbTsgZysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0KGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0KHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSB0LnN1YnN0cih1LCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IGwsIGUgPSBhLkZpeGVkVmVjdG9yRW5jb2Rlci5kZWNvZGUoeSwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaXRMZW5ndGggPSB1LCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmJ1aWxkUmFuZ2VFbmNvZGluZyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQubGVuZ3RoLCBlID0gci5JbnRFbmNvZGVyLmVuY29kZShpLCBuLkJpdExlbmd0aC5udW1FbnRyaWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDEgPT09IHQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gaC5Cb29sZWFuRW5jb2Rlci5lbmNvZGUoIWkpLCBlICs9IHIuSW50RW5jb2Rlci5lbmNvZGUodFswXSwgbi5CaXRMZW5ndGgudmVuZG9ySWQpLCBpIHx8IChlICs9IHIuSW50RW5jb2Rlci5lbmNvZGUodFsxXSwgbi5CaXRMZW5ndGgudmVuZG9ySWQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuVmVuZG9yVmVjdG9yRW5jb2RlciA9IHU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pLCAocyA9IGkuVmVjdG9yRW5jb2RpbmdUeXBlIHx8IChpLlZlY3RvckVuY29kaW5nVHlwZSA9IHt9KSlbcy5GSUVMRCA9IDBdID0gJ0ZJRUxEJywgc1tzLlJBTkdFID0gMV0gPSAnUkFOR0UnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpIHx8IChpW2VdID0gdFtlXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KSwgcyhlKDE0NCkpLCBzKGUoMTQ1KSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg2NCksIG4gPSBlKDM1KSwgciA9IGUoNDApLCBoID0gZSgxNDcpLCBhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgbiwgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBzLlNlbWFudGljUHJlRW5jb2Rlci5wcm9jZXNzKHQsIGkpLCAobiA9IEFycmF5LmlzQXJyYXkobnVsbCA9PT0gKGUgPSBpKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLnNlZ21lbnRzKSA/IGkuc2VnbWVudHMgOiBuZXcgcy5TZWdtZW50U2VxdWVuY2UodCwgaSlbJycgKyB0LnZlcnNpb25dKS5mb3JFYWNoKGZ1bmN0aW9uIChpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIDwgbi5sZW5ndGggLSAxICYmIChoID0gJy4nKSwgciArPSBzLlNlZ21lbnRFbmNvZGVyLmVuY29kZSh0LCBpKSArIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWNvZGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnNwbGl0KCcuJyksIGEgPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgfHwgKGkgPSBuZXcgaC5UQ01vZGVsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBhOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGVbb10sIHUgPSBzLkJhc2U2NFVybC5kZWNvZGUoYy5jaGFyQXQoMCkpLnN1YnN0cigwLCBzLkJpdExlbmd0aC5zZWdtZW50VHlwZSksIGwgPSBuLlNlZ21lbnRJRHMuSURfVE9fS0VZW3IuSW50RW5jb2Rlci5kZWNvZGUodSwgcy5CaXRMZW5ndGguc2VnbWVudFR5cGUpLnRvU3RyaW5nKCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuU2VnbWVudEVuY29kZXIuZGVjb2RlKGMsIGksIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgaS5UQ1N0cmluZyA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMTUwKS5kZWNvZGVDb25zZW50U3RyaW5nOwogICAgICAgICAgICAgICAgdC5leHBvcnRzID0geyBkZWNvZGVDb25zZW50U3RyaW5nOiBzIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEY7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgwKSwgbiA9IGUubihzKSwgciA9IGUoNSksIGggPSBlKDgpLCBhID0gZSgyKSwgbyA9IGUoMTE3KSwgYyA9IGUoMTEzKSwgdSA9IGUoODApLCBsID0gZSg4MSksIGQgPSBlKDE5KSwgZiA9IGUoMjEpLCBwID0gZSgzMCksIGIgPSBlKDEpLCB2ID0gZSg2KSwgbSA9IGUoMTMpLCBnID0gZSg0OSksIHkgPSBlKDM0KSwgdyA9IGUoNDgpLCBPID0gZSg4MiksIHggPSBlKDExNCksIFMgPSBlKDExNSksIGogPSBlKDI1KSwgayA9IGUoMjQpLCBfID0gZSg4MyksIEEgPSBlKDIwKSwgSSA9IGUoMTYpLCBDID0gZSg0KSwgVCA9IGUoODQpLCBQID0gZSgxMTgpLCBNID0gZSgxMTYpLCBFID0gZSg0NCksIEwgPSBlKDQ3KSwgUiA9IGUoODUpOwogICAgICAgICAgICAgICAgY29uc3QgQiA9ICdwbGF5ZXJfaW5zdGFuY2UnLCBEID0gJywnOwogICAgICAgICAgICAgICAgY2xhc3MgRiBleHRlbmRzIEEuYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLnNlcnZpY2VzID0gdCwgdGhpcy5HTE9CQUwgPSBpLCB0aGlzLmNzID0gZSwgdGhpcy51cyA9IHMsIHRoaXMuTHMgPSBuLCB0aGlzLnJlYWR5Q2FsbGJhY2sgPSByLCB0aGlzLlJzID0ge30sIHRoaXMuQnMgPSAnPGNueC1wbGFjZWhvbGRlcj48L2NueC1wbGFjZWhvbGRlcj4nLCB0aGlzLkRzID0gMTAwLCB0aGlzLkZzID0gMTAwMCwgdGhpcy5pc1NlcnZlcmxlc3NNb2RlID0gITEsIHRoaXMuVnMgPSAhMSwgdGhpcy5VcyA9IFtdLCB0aGlzLiRzID0gJ3t7b21pZFZlcmlmaWNhdGlvbkNsaWVudH19JywgdGhpcy5jcyAmJiB0aGlzLk5zKCksIHRoaXMuSHMgPSBMLmEuZGV0ZWN0VXNpbmdDU1ModGhpcy5HTE9CQUwpLCB0aGlzLnFzID0gT2JqZWN0KGEubykodGhpcy5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcklkOiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5wbGF5ZXJJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcHBTZXR0aW5nczogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29ubmF0aXhJbnRlcm5hbHM6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLl9jb25uYXRpeEludGVybmFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2luZzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9taXphdGlvbjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTEgJiYgKHQuY3VzdG9tUGFyYW0xID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW0xKSwgdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW0yICYmICh0LmN1c3RvbVBhcmFtMiA9IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLmN1c3RvbVBhcmFtMiksIHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLmN1c3RvbVBhcmFtMyAmJiAodC5jdXN0b21QYXJhbTMgPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTMpLCB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTQgJiYgKHQuY3VzdG9tUGFyYW00ID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW00KSwgdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW01ICYmICh0LmN1c3RvbVBhcmFtNSA9IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLmN1c3RvbVBhcmFtNSksIHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLnVzZUV4dGVybmFsVmlld2FiaWxpdHlTZXJ2aWNlICYmICh0LnNldHRpbmdzLnVzZUV4dGVybmFsVmlld2FiaWxpdHlTZXJ2aWNlID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuc2V0dGluZ3MudXNlRXh0ZXJuYWxWaWV3YWJpbGl0eVNlcnZpY2UpLCB0aGlzLmV4dGVybmFsQXR0cmlidXRlcyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFdzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuR0xPQkFMLmZyYW1lRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QoYS5CKShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0ICYmIChlID0gITEpLCBlID8gT2JqZWN0KGEudSkoaSkgOiBPYmplY3QoYS5PKShpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR3ModCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSnModCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZXZhbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQucmVwbGFjZSgvXFsoXGQrKV0vZywgJzpudGgtY2hpbGQoJDEpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFlzKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuR3ModCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSBlID8gbmV3IFByb21pc2UoZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHRoaXMuWXModCwgaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5Ecyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogUHJvbWlzZS5yZXNvbHZlKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLcyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLlFzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuWXMoZSwgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKcyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdCgvKFwuY254RXFcKFxkK1wpKS8pLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IC0xID09PSB0LmluZGV4T2YoJ2NueEVxJykgPyBlID8gZS5xdWVyeVNlbGVjdG9yQWxsKHQpIDogT2JqZWN0KGEuSCkodCwgaSkgOiB0aGlzLlpzKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSA/IChlLmhhc093blByb3BlcnR5KCdsZW5ndGgnKSAmJiAoZSA9IGUubGVuZ3RoID4gMCA/IGVbMF0gOiBudWxsKSwgZSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBacyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAvXGQrL2cuZXhlYyhpKSwgcyA9IHBhcnNlSW50KGVbMF0sIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPiB0Lmxlbmd0aCA/IE9iamVjdCh2LmMpKHQpW3QubGVuZ3RoIC0gMV0gOiBPYmplY3Qodi5jKSh0KVtzXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVzID8gcy5Qcm90b0ltcGxlbWVudGF0aW9uVHlwZS5BbXAgOiBzLlByb3RvSW1wbGVtZW50YXRpb25UeXBlLldlYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW4odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0KGguZikodGhpcy5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSBPYmplY3QoYi5hKSh0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5yZW5kZXJpbmcuZm9yY2VJbnNlcnRQYXRoKSA/IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLnJlbmRlcmluZy5mb3JjZUluc2VydFBhdGggOiBpLmZvcmNlSW5zZXJ0UGF0aCwgbmV3IFByb21pc2UoKG4sIHIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoID0gT2JqZWN0KGEuZikodGhpcy5CcywgdGhpcy5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgfHwgdC50YWcucGFyZW50Tm9kZSA9PT0gdGhpcy5HTE9CQUwuZG9jdW1lbnQuaGVhZCAmJiAoIWUudG9wQ2hpbGRGcmFtZSB8fCBpLnJlbmRlckluRnJhbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQsIHMsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50b3BDaGlsZEZyYW1lICYmIE9iamVjdChhLkkpKGUudG9wQ2hpbGRGcmFtZS5mcmFtZUVsZW1lbnQsIEMuaC5EaXNwbGF5Tm9uZSksIHQgPSBPYmplY3QoYi5oKSh0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5yZW5kZXJpbmcuY29udGFpbmVyU2VsZWN0b3IpID8gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuc2V0dGluZ3MucmVuZGVyaW5nLmNvbnRhaW5lclNlbGVjdG9yIDogaS5jb250YWluZXJTZWxlY3RvciwgcyA9IE9iamVjdChiLmEpKHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLnJlbmRlcmluZy5pbnNlcnRQb3NpdGlvbikgPyB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5yZW5kZXJpbmcuaW5zZXJ0UG9zaXRpb24gOiBpLmluc2VydFBvc2l0aW9uLCByID0gT2JqZWN0KGIuYSkodGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuc2V0dGluZ3MucmVuZGVyaW5nLnBvc2l0aW9uKSA/IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLnJlbmRlcmluZy5wb3NpdGlvbiA6IGkucG9zaXRpb24sIHRoaXMuS3ModCwgZS50b3BGcmFtZSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbih0LCBoLCBzLCByKSwgbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRDb250YWluZXI6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRXaW5kb3c6IGUudG9wRnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRvcENoaWxkRnJhbWUgJiYgIWkucmVuZGVySW5GcmFtZSA/IChoID0gT2JqZWN0KGEuZikodGhpcy5CcywgZS50b3BGcmFtZSksIGUudG9wQ2hpbGRGcmFtZS5mcmFtZUVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCwgZS50b3BDaGlsZEZyYW1lLmZyYW1lRWxlbWVudCksIE9iamVjdChhLmEpKGUudG9wQ2hpbGRGcmFtZS5mcmFtZUVsZW1lbnQsIEMuaC5EaXNwbGF5Tm9uZSksIG4oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRDb250YWluZXI6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydFdpbmRvdzogZS50b3BGcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6ICh0LnRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLCB0LnRhZyksIG4oeyBpbnNlcnRDb250YWluZXI6IGggfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbm4odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoYS52KShpLCB0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcm4odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLlByb3RvUGxheWVySW5zZXJ0TW9kZS5CZWZvcmVDb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5Qcm90b1BsYXllckluc2VydE1vZGUuUmVwbGFjZUNvbnRhaW5lcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaSwgdCksIE9iamVjdChhLkopKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5Qcm90b1BsYXllckluc2VydE1vZGUuSGlkZUNvbnRhaW5lcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaSwgdCksIE9iamVjdChhLnUpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5Qcm90b1BsYXllckluc2VydE1vZGUuQWZ0ZXJDb250YWluZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm5leHRFbGVtZW50U2libGluZyA/IHQucGFyZW50RWxlbWVudC5pbnNlcnRCZWZvcmUoaSwgdC5uZXh0RWxlbWVudFNpYmxpbmcpIDogdC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuKHQsIGksIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9PT0gcy5Qcm90b1BsYXllckluc2VydE1vZGUuV2l0aGluQ29udGFpbmVyID8gdGhpcy5ubih0LCBpLCBuKSA6IHRoaXMucm4odCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhuKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmVJdGVtcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnQubGluZUl0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5saW5lSXRlbXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmVJdGVtcyA9IE9iamVjdCh2LmUpKCdhZHZlcnRpc2VyTGluZUl0ZW1JZCcsIHQubGluZUl0ZW1zKSwgZSAhPT0gdC5saW5lSXRlbXMubGVuZ3RoICYmIE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0xvYWRlcl9kdXBsaWNhdGVkX2Fkc291cmNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6ICdfJwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYW4odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5wbGF5ZXJzW2ldLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyTW9kZWw6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeGVyU2VydmljZTogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuUnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkhzIHx8IHRoaXMuc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLnNldFRoaXJkUGFydHlTeW5jVXJscyh0LmNvb2tpZVN5bmNVcmxzKSwgdGhpcy5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2Uuc2V0R2VvTG9jYXRpb24odC5nZW9Mb2NhdGlvbiksIHAuYS5zZXNzaW9uSWQgPSBlLnNlc3Npb25JZCwgdGhpcy5jbi5hZGRQbGF5ZXJTZXNzaW9uKGUucGxheWVySWQsIGUuc2Vzc2lvbklkKSwgIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLnJlZ2lzdGVyQXBpRXJyb3IobS5hLlNldHVwRXJyb3IsICdObyBwbGF5bGlzdCB3YXMgcHJvdmlkZWQhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG8gPSBuZXcgbC5hKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyOiB0LmJyb3dzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvTG9jYXRpb246IHQuZ2VvTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcklkOiBuLnBsYXllcklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvcmF0aW9uTW9kZTogdC5leHBsb3JhdGlvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlSUQ6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5idW5kbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJRDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLmFwcElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpblVSTDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLmRvbWFpblVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVVSTDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLnN0b3JlVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcENhdGVnb3JpZXM6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5hcHBDYXRlZ29yaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcElzUGFpZDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLmFwcElzUGFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBOYW1lOiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5fYXBwU2V0dGluZ3MuYXBwTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBQcml2YWN5UG9saWN5OiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5fYXBwU2V0dGluZ3MuYXBwUHJpdmFjeVBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBWZXJzaW9uOiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5fYXBwU2V0dGluZ3MuYXBwVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLmRldmljZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVjeWNsZXJWaWV3SW50ZWdyYXRpb246IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5pc1JlY3ljbGVyVmlld0ludGVncmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcFBhZ2VVUkw6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5hcHBQYWdlVVJMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZCA9IG8uYnJvd3Nlci5icm93c2VyVHlwZSA9PT0gay5hLkludGVybmV0RXhwbG9yZXIsIGYgPSBuZXcgZy5hKGgpLCB2ID0gdGhpcy5nZXRWaWV3YWJpbGl0eVNlcnZpY2UobiwgZiwgZCksIHkgPSB0aGlzLkhzOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhzID0gTC5hLmRldGVjdFVzaW5nQ1NTKG4uZ2xvYmFsKSwgeSAhPT0gdGhpcy5IcyAmJiBPYmplY3Qoci5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTG9hZGVyX2FkQmxvY2tlckRldGVjdGlvbl9jaGFuZ2VkX2FmdGVyX25ld19nbG9iYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgJHsgeSB9YAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTyA9IG5ldyB1LmEobiwgdC5nZW9Mb2NhdGlvbiwgby5wYWdlVXJsLCBvLnBhZ2VEb21haW4sIHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncywgdGhpcy5xcywgdC5wdWJsaXNoZXJOZXR3b3JrQ29kZSksIHggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3YWJpbGl0eVNlcnZpY2U6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNraW5nU2VydmljZTogdGhpcy51bihuLCB0LCBpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzaXplT2JzZXJ2ZXI6IG5ldyBjLmEobi5nbG9iYWwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyTWFuYWdlclNlcnZpY2U6IHRoaXMuc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNyb3NTZXJ2aWNlOiBPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHNTdG9yYWdlU2VydmljZTogdGhpcy5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUZvY3VzU2VydmljZTogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TZXJ2aWNlOiBuZXcgTS5hKG4uZ2xvYmFsLCBvLmlzTW9iaWxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJsU3VmZml4ZXJTZXJ2aWNlOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHMgJiYgeC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tTZXNzaW9uQWRCbG9ja2VyKHMuUHJvdG9BZEJsb2NrRGV0ZWN0aW9uVHlwZUVudW0uQmFubmVyKSwgeC5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2Uuc2V0UGFnZVVybCh4LmNvbmZpZy5wYWdlVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUyA9IHRoaXMudG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgeC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2Uuc2V0SW1wbGVtZW50YXRpb25UeXBlT25NZXRhKFMpLCBuLmV4dGVybmFsTWFjcm9zICYmIHguc2VydmljZXMuTWFjcm9zU2VydmljZS5hZGRFeHRyYU1hY3JvcyhuLmV4dGVybmFsTWFjcm9zKSwgeC5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2Uub25FdmVudChbdy5hLkNDUEFfSU5GT19SRUNFSVZFRF0pLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5zZXJ2aWNlcy5NYWNyb3NTZXJ2aWNlLnNldFVzUHJpdmFjeVN0cmluZyh4LnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5nZXRVc1ByaXZhY3lTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB4LnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5vbkV2ZW50KFt3LmEuQ09OU0VOVF9EQVRBX1VQREFURV0pLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudXBkYXRlTWV0YWRhdGFNb2RlbCh7IHVzZXJJZDogeC5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuZ2V0VHJhY2thYmxlVXNlcigpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHguc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmdldENvbnNlbnRQYXlsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UuaGFzR2RwckNvbnNlbnRQYXlsb2FkID0gT2JqZWN0KGIuaCkodCksIHRoaXMuc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmdkcHJDb25zZW50TW9kZSA9PT0gcy5Qcm90b0dkcHJDb25zZW50TW9kZUVudW0uTm9Db25zZW50IHx8IHRoaXMuY3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gbi5saW5lSXRlbVNldHRpbmdzLmxpbmVJdGVtcy5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoYi5oKSh0LnZlbmRvcklkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5ldmVyeSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmlzQ29uc2VudCh0LnZlbmRvcklkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5nZHByQ29uc2VudE1vZGUgPSB0ID8gcy5Qcm90b0dkcHJDb25zZW50TW9kZUVudW0uQWxsR29vZCA6IHMuUHJvdG9HZHByQ29uc2VudE1vZGVFbnVtLk5vdEFsbERlbWFuZENvbnNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzUGxheWVyUmVsb2FkZWQ6IHRoaXMuY24ud2FzUGxheWVyUmVsb2FkZWQoZS5wbGF5ZXJJZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNQbGF5ZXJJblZpZXc6IHRoaXMuY24uZ2V0U2Vzc2lvbkluVmlldyhlLnBsYXllcklkKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5nZXRSZW5kZXJlckluc3RhbmNlKG4sIHgsIHRoaXMuSHMsIGosIHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncyksIHRoaXMuc3Vic2NyaWJlKEkuYy5TZXNzaW9uVmlldywgdGhpcy5yZW5kZXJlciwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbi5hZGRTZXNzaW9uSW5WaWV3KGUucGxheWVySWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoSS5jLlNlc3Npb25SZW5kZXJlZCwgdGhpcy5yZW5kZXJlciwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuZ2V0VXNlcklkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFAuYShPLCBoLCB0aGlzLmxuLCB0KS5hZGRGcmF1ZFNlbnNvclNjcmlwdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgXyA9IE9iamVjdC5hc3NpZ24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnRW51bXM6IHRoaXMuZ2V0QXBpQ29uZmlnRW51bXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0V2ZW50czogdGhpcy5nZXRBcGlDb25maWdFdmVudHMoKQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnJlbmRlcmVyLmdldEFwaU1ldGhvZHMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBBID0gZS5jdXN0b21Kc0NvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gYCR7IEIgfV8keyB4LmNvbmZpZy5hcHBJZCB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR0xPQkFMW3RdID0gXywgQSA9IEEuY254X3JlcGxhY2VBbGwoYCJ7eyR7IEIgfX19ImAsIGB3aW5kb3cuJHsgdCB9YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbml0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG4oQSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID8gdGhpcy5yZWdpc3RlckFwaVN1Y2Nlc3MoXykgOiB0aGlzLnJlZ2lzdGVyQXBpRXJyb3IobS5hLlJlbmRlckVycm9yLCAnUGxheWVyIHNpemUgdW5kZXIgc3VwcG9ydGVkIHZhbHVlJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGlzYWJsZVRyYWNraW5nID8gbmV3IE8uYSgpIDogbmV3IG8uYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTWFuYWdlclNlcnZpY2U6IHRoaXMuc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlcjogaS5icm93c2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvTG9jYXRpb246IGkuZ2VvTG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJJZDogdC5wbGF5ZXJJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogdGhpcy5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuZ2V0VHJhY2thYmxlVXNlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBpLnBsYXllcnNbZV0uc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlSWQ6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5idW5kbGVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtMTogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUGFyYW0yOiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXJhbTM6IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLmN1c3RvbVBhcmFtMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtNDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW00LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUGFyYW01OiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYlRlc3RJZDogaS5wbGF5ZXJzW2VdLmFiVGVzdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbG9yYXRpb25Nb2RlOiBpLmV4cGxvcmF0aW9uTW9kZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZG4odCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHVzZVNhZmVNb2RlOiAhMCB9OwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNhZmVNb2RlOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gaSwgbiA9IGUgfHwgdGhpcy5HTE9CQUw7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByOwogICAgICAgICAgICAgICAgICAgICAgICByID0gcyA/IGBcbiAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgInVzZSBzdHJpY3QiO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAkeyB0IH1cbiAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJy0tLUNueEN1c3RvbUFwaUVycm9yLS0tJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGUubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICBgIDogdCwgT2JqZWN0KGEudykobi5kb2N1bWVudC5oZWFkLCBuLCByLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE5zKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcy5pbmNsdWRlcygne3tvbWlkVmVyaWZpY2F0aW9uQ2xpZW50JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTYWZlTW9kZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWw6IHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRuKGRlY29kZVVSSSh0aGlzLiRzKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJJZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tYWluOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0aGlzLmJuOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52bih0LCBpKS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgRXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBPYmplY3Qoci5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGkubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlcmVuZGVyX0xvYWRlcl9wbGF5ZXJfaWRfY2FsbF9nZXRfcGxzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucmVnaXN0ZXJBcGlFcnJvcihtLmEuU2V0dXBFcnJvciwgJ3BsYXllciBkYXRhIGNhbGwgZXJyb3InKSwgdGhpcy5tbigpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ24odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm9ybWF0aW9uOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2Uuc2V0VXNlckluZm9ybWF0aW9uKGUpLCB0aGlzLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5zZXRCcm93c2VySW5mbyhpKSwgZSAmJiBlLmNhbGxGcmF1ZFNlbnNvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cElkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFJlc3BvbnNlQ29kZTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJBZHNUeHQ6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBJZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXNwb25zZUNvZGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQWRzVHh0OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVR5cGU6IGkuZGV2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHkuYS5zZXJ2ZXJBYjAgPSB0LnNlcnZlckFiMCwgeS5hLnNlcnZlckFiMSA9IHQuc2VydmVyQWIxLCBPYmplY3Qodi5oKSh0LnBsYXllcnMpID8gKHQucGxheWVycy5sZW5ndGggPiAxICYmICh0aGlzLnpzKCksIHRoaXMuVnMgPSAhMCksIE9iamVjdC5rZXlzKHQucGxheWVycykuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueW4odCwgdGhpcy5ibiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IHRoaXMucmVnaXN0ZXJBcGlFcnJvcihtLmEuTm9QbGF5ZXIsIGBObyBwbGF5ZXIgYXZhaWxhYmxlIGZvciBnaXZlbiBwbGF5ZXIgaWQ6JHsgdGhpcy5ibi5wbGF5ZXJJZCB9YCksIHRoaXMubW4oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud24oKSwgdGhpcy54bigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuVnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5Vc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWR5Q2FsbGJhY2sgJiYgdGhpcy5yZWFkeUNhbGxiYWNrKHQuYXBpRXJyb3JPYmosIHQuYXBpQ29uZmlnT2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFNuKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVzLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFwaUVycm9yT2JqOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdFJlbmRlckVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5bih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LnBsYXllcnNbZV0sIHtwbGF5ZXJNb2RlbDogbn0gPSB0aGlzLlJzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLldzKHMucmVuZGVySW5GcmFtZSksIHRoaXMuYW4odCwgZSksIHRoaXMuam4obiwgdGhpcy5yZW5kZXJlci5wbGF5ZXJDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2bih0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbWFpbjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyOiB0aGlzLnFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zOiBbdF0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5idW5kbGVJZCA9IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLl9hcHBTZXR0aW5ncy5idW5kbGVJRCwgdGhpcy5xdWVyeVBhcmFtcy5jbnhMaW5lSXRlbUlkICYmIChlLmZvcmNlTGluZUl0ZW1JZHMgPSB0aGlzLnF1ZXJ5UGFyYW1zLmNueExpbmVJdGVtSWQuc3BsaXQoRCkuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChiLmgpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMucXVlcnlQYXJhbXMuY254UGxheWVySWQgPyBlLmZvcmNlUGxheWVySWQgPSB0aGlzLnF1ZXJ5UGFyYW1zLmNueFBsYXllcklkIDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuc2V0dGluZ3MuX2Nvbm5hdGl4SW50ZXJuYWxzLnNraXBTZXJ2aW5nUnVsZXMgJiYgKGUuZm9yY2VQbGF5ZXJJZCA9IHQpLCB0aGlzLnF1ZXJ5UGFyYW1zLmNueEV4cGxvcmF0aW9uTW9kZSAmJiAoZS5mb3JjZUV4cGxvcmF0aW9uID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7cXVlcnlKc1RhcmdldGluZzogc30gPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChiLmYpKHMpICYmIE9iamVjdC5rZXlzKHMpLmxlbmd0aCA+IDAgJiYgKGUucXVlcnlKc1RhcmdldGluZyA9IE9iamVjdC5rZXlzKHMpLnJlZHVjZSgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdCksIHsgW2ldOiBgJHsgc1tpXSB9YCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pKSwgZS5jdXN0b21QYXJhbTEgPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTEsIGUuY3VzdG9tUGFyYW0yID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW0yLCBlLmN1c3RvbVBhcmFtMyA9IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLmN1c3RvbVBhcmFtMywgZS5jdXN0b21QYXJhbTQgPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5jdXN0b21QYXJhbTQsIGUuY3VzdG9tUGFyYW01ID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuY3VzdG9tUGFyYW01LCBlLmRpc2FibGVUcmFja2luZyA9IHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLnNldHRpbmdzLl9jb25uYXRpeEludGVybmFscy5kaXNhYmxlVHJhY2tpbmcsIGUudmVyc2lvbiA9IGYuYS52ZXJzaW9uLCBlLmVzNiA9IGYuYiwgZS51c2VySWQgPSB0aGlzLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5nZXRGb3JjZWRUcmFja2FibGVVc2VyKCksIGUuaXNDb25zZW50Q29ubmF0aXggPSB0aGlzLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5pc0NvbnNlbnRDb25uYXRpeCgpLCBlLmNsaWVudEFiMCA9IHkuYS5jbGllbnRBYjAsIGUuY2xpZW50QWIxID0geS5hLmNsaWVudEFiMSwgZS5pbXBsZW1lbnRhdGlvblR5cGUgPSB0aGlzLnRuKCksIGUucmVsb2FkZWRQbGF5ZXJzID0gdGhpcy5jbi5nZXRDb29raWVQbGF5ZXJzU2Vzc2lvbigpLCBlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlKSwgdGhpcy5nZXRTcGVjaWZpY1JlcXVlc3REYXRhKCkpLCB0aGlzLmJuLnBsYXllcklkID8gdGhpcy5nZXRQbGF5ZXJSZXNwb25zZShlLCB0aGlzLmJuLnBsYXllcklkIHx8ICdzZXJ2ZXJsZXNzJykgOiBuZXcgUHJvbWlzZSgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NlcnZlcmxlc3NNb2RlID0gITAsIHQodGhpcy5kZWZhdWx0SW5pdEZyb21Qcm90bygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGtuKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gT2JqZWN0KGQuYikoJ2NueFZpZGVvUG9zaXRpb24nLCB0aGlzLnBhZ2VVcmwpLCBpID0gcGFyc2VJbnQoT2JqZWN0KGQuYikoJ2NueFN0b3J5UG9zaXRpb24nLCB0aGlzLnBhZ2VVcmwpLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhTdG9yeUlkOiBPYmplY3QoZC5iKSgnY254U3RvcnlJZCcsIHRoaXMucGFnZVVybCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhMaW5lSXRlbUlkOiBPYmplY3QoZC5iKSgnY254TGluZUl0ZW1JZCcsIHRoaXMucGFnZVVybCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhQbGF5ZXJJZDogT2JqZWN0KGQuYikoJ2NueFBsYXllcklkJywgdGhpcy5wYWdlVXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueE1lZGlhSWQ6IE9iamVjdChkLmIpKCdjbnhNZWRpYUlkJywgdGhpcy5wYWdlVXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueFBsYXlsaXN0SWQ6IE9iamVjdChkLmIpKCdjbnhQbGF5bGlzdElkJywgdGhpcy5wYWdlVXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueFZpZGVvUG9zaXRpb246IHQgPyBwYXJzZUludCh0LCAxMCkgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY254RXhwbG9yYXRpb25Nb2RlOiAndHJ1ZScgPT09IE9iamVjdChkLmIpKCdjbnhFeHBsb3JhdGlvbk1vZGUnLCB0aGlzLnBhZ2VVcmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY254U3RvcnlQb3NpdGlvbjogT2JqZWN0KGIuZSkoaSkgPyBpIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueFNraXBBZHNGbGFnOiAndHJ1ZScgPT09IE9iamVjdChkLmIpKCdjbnhTa2lwQWRzRmxhZycsIHRoaXMucGFnZVVybCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhSZWxvYWRUaW1lOiBwYXJzZUludChPYmplY3QoZC5iKSgnY254UmVsb2FkVGltZScsIHRoaXMucGFnZVVybCksIDEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueE92ZXJyaWRlTGluZWl0ZW1zOiAndHJ1ZScgPT09IE9iamVjdChkLmIpKCdjbnhPdmVycmlkZUxpbmVpdGVtcycsIHRoaXMucGFnZVVybCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhJc1Nlb1RyYWZmaWM6ICd0cnVlJyA9PT0gT2JqZWN0KGQuYikoJ2NueElzU2VvVHJhZmZpYycsIHRoaXMucGFnZVVybCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgam4odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5nZXREZWxlZ2F0ZUhhbmRsZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHguYSh0aGlzLkdMT0JBTCwgdGhpcy5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZSwgZSwgdCwgaSkuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkdMT0JBTC5PbWlkU2Vzc2lvbkNsaWVudCAmJiB0aGlzLkdMT0JBTC5PbWlkU2Vzc2lvbkNsaWVudFtqLmpdOwogICAgICAgICAgICAgICAgICAgICAgICB0ID8gdGhpcy5BbiA9IG5ldyBTLmEodCwgdGhpcy5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZSwgdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuX2FwcFNldHRpbmdzLnNka1ZlcnNpb24pIDogT2JqZWN0KHIuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ09taWRTZXNzaW9uQ2xpZW50IG5vdCBmb3VuZC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHMuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBJbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5DbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRkQ3NzU3R5bGVzaGVldFRvSGVhZChzLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoaC5qKSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTG9hZGVyX2FkZF9jc3NfbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbmV3IEVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUXVlcnlQYXJhbXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMgPSB0aGlzLmtuKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvYWRTY3JpcHRUYWcodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzID0gdCwgaSAmJiAoZSA9IHRoaXMuR0xPQkFMLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpKSwgIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMb2FkZXJfbm9fc2NyaXB0X2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGAkeyB0LnBsYXllcklkIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5yZWdpc3RlckFwaUVycm9yKG0uYS5TZXR1cEVycm9yLCAnQ291bGQgbm90IGxvY2F0ZSBhbnkgc2NyaXB0IHRhZyBpZHMgaW4gdGhlIHBhZ2UnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBPYmplY3QoYi5mKSh0LnNldHRpbmdzLnBsdWdpbnMuYWRvYmVBbmFseXRpY3NTZXR0aW5ncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkxzICYmIHRoaXMuX24oKSwgdGhpcy5ibiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tYWluOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVySWQ6IHQucGxheWVySWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSwgITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluc2VydFJlbmRlcmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbiA9IG5ldyBfLmEodGhpcy5xdWVyeVBhcmFtcy5jbnhSZWxvYWRUaW1lKSwgdGhpcy5XcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBuKCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGxheWVycy5mb3JFYWNoKChlLCBuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wbGF5ZXJzW25dLmxpbWl0Q2xpZW50U2lkZUFwaVVzZSAmJiB0aGlzLnpzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuaW4odGhpcy5ibiwgZSkudGhlbihpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5obihlLCB0LmxpbmVJdGVtcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgUi5hKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYmFuZHdpZHRoTG9nZ2luZ0VuYWJsZWQgJiYgcy5zZXRRdWVyeVBhcmFtcyh7IHBsYXllcklkOiB0LnBsYXllcnNbbl0ucGxheWVySWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLmdldFBsYXllck1vZGVsKGksIHQsIHMsIG4udG9TdHJpbmcoKSksIGggPSBuZXcgVC5hKHIuZ2xvYmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChFLmEpKHIubGluZUl0ZW1TZXR0aW5ncy5saW5lSXRlbXMpLCB0aGlzLlJzW25dID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyTW9kZWw6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxEb21VdGlsc1NlcnZpY2U6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5JbihoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckFwaUVycm9yKG0uYS5TZXR1cEVycm9yLCAncmVuZGVyaW5nIGVycm9yJyksIE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdMb2FkZXJfc2VuZF9kYXRhX3RvX3JlbmRlcmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHMuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBQcm9taXNlLmFsbChpKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfTG9hZGVyX2RvX3BsYXllcl9jYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud24gPSB0aGlzLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5yZWdpc3RlclBsc0NhbGwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlcmVuZGVyX0xvYWRlcl9pbnNlcnRfcmVuZGVyZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcy5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpbmRQYWdlVXJsKHQsIGksIGUgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jbnhfcGFnZV91cmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VVcmwgPSB0LmNueF9wYWdlX3VybDsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WydjbnhBbXBBZCknXSA/IHRoaXMucGFnZVVybCA9IHQuY29udGV4dC5zb3VyY2VVcmwgfHwgdC5jb250ZXh0LmxvY2F0aW9uLmhyZWYgOiB0aGlzLnBhZ2VVcmwgPSBpIHx8IE9iamVjdChoLmUpKE9iamVjdChoLmYpKHRoaXMuR0xPQkFMKSwgdGhpcy5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFnZVVybCB8fCAwID09PSB0aGlzLnBhZ2VVcmwubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwgT2JqZWN0KHIuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfTG9hZGVyX2ZpbmRfcGFnZV91cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBzLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbmV3IFByb21pc2UoZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZFBhZ2VVcmwodCwgaSwgITApLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5Gcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhZ2VVcmwgPSBPYmplY3QoZC5kKSh0aGlzLnBhZ2VVcmwpLCBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTG9hZGVyX2ZpbmRfcGFnZV91cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogcy5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBQcm9taXNlLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyQXBpRXJyb3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmEuU2V0dXBFcnJvcjsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Vcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaUVycm9yT2JqOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckFwaVN1Y2Nlc3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVzLnB1c2goeyBhcGlDb25maWdPYmo6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIgJiYgdGhpcy5yZW5kZXJlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoMCksIHIgPSBlKDgpLCBoID0gZSgyKSwgYSA9IGUoMzEpLCBvID0gZSgyNiksIGMgPSBlKDEpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5BcHBVcmwgPSAnQVBQX1VSTCcsIHQuQXBwQnVuZGxlID0gJ0FQUF9CVU5ETEUnLCB0LkFwcE5hbWUgPSAnQVBQX05BTUUnLCB0LlV1aWQgPSAnVVVJRCcsIHQuUGFnZVVybCA9ICdQQUdFX1VSTCcsIHQuQWRQb3NpdGlvbiA9ICdBRF9QT1NJVElPTicsIHQuVmlkZW9UaXRsZSA9ICdWSURFT19USVRMRScsIHQuTWVkaWFUaXRsZSA9ICdNRURJQV9USVRMRScsIHQuVmlkZW9EdXJhdGlvbiA9ICdWSURFT19EVVJBVElPTicsIHQuQ29udGVudExlbmd0aCA9ICdDT05URU5UX0xFTkdUSCcsIHQuVmlkZW9EZXNjcmlwdGlvbiA9ICdWSURFT19ERVNDUklQVElPTicsIHQuVmlkZW9VcmwgPSAnVklERU9fVVJMJywgdC5WaWRlb0lkID0gJ1ZJREVPX0lEJywgdC5WaWRlb1RpbWUgPSAnVklERU9fVElNRScsIHQuRGVzY3JpcHRpb25VcmwgPSAnREVTQ1JJUFRJT05fVVJMJywgdC5WaWRlb0tleXdvcmRzID0gJ1ZJREVPX0tFWVdPUkRTJywgdC5BdXRvcGxheSA9ICdBVVRPUExBWScsIHQuVXNlckFnZW50ID0gJ1VBJywgdC5JcCA9ICdJUCcsIHQuQ2FzaEJ1c3RlciA9ICdDQicsIHQuV2lkdGggPSAnV0lEVEgnLCB0LkhlaWdodCA9ICdIRUlHSFQnLCB0LkRvbWFpbiA9ICdET01BSU4nLCB0LlNvdXJjZVJlZmVycmVyID0gJ1NPVVJDRV9SRUZFUlJFUicsIHQuR2RwciA9ICdHRFBSJywgdC5HZHByQ29uc2VudCA9ICdHRFBSX0NPTlNFTlQnLCB0LkNvbnNlbnQgPSAnQ09OU0VOVCcsIHQuQ3RkID0gJ0NURCcsIHQuUHVibGlzaGVyID0gJ1BVQkxJU0hFUicsIHQuUmFuZG9tID0gJ1JBTkQnLCB0LlNpdGUgPSAnU0lURScsIHQuU3ViSWQgPSAnU1VCX0lEJywgdC5VcmwgPSAnVVJMJywgdC5Vc2VyTGF0ID0gJ1VTRVJfTEFUJywgdC5Vc2VyTG9uZyA9ICdVU0VSX0xPTkcnLCB0LlVzUHJpdmFjeVN0cmluZyA9ICdVU19QUklWQUNZJywgdC5Eb05vdFRyYWNrID0gJ0ROVCcsIHQuRnJhdWRTZW5zb3JVc2VySWQgPSAnRlNfVVNFUl9JRCcsIHQuUHVibGlzaGVySWQgPSAnUFVCTElTSEVSX0lEJywgdC5TZXNzaW9uSWQgPSAnU0VTU0lPTl9JRCcsIHQuRnJhdWRTZW5zb3JEZXZpY2VUeXBlID0gJ0ZTX0RFVklDRV9UWVBFJywgdC5GcmF1ZFNlbnNvckxvb2t1cElkID0gJ01HSUQnLCB0LkZyYXVkU2Vuc29yTG9va3VwUmVzcG9uc2VDb2RlID0gJ01HVE8nLCB0LkZyYXVkU2Vuc29yTWVkaWFUeXBlID0gJ0ZTX01FRElBX1RZUEUnLCB0LkNueFN1cHBsaWVySWQgPSAnQ05YX1NVUFBMSUVSX0lEJywgdC5BZHhQdWJsaXNoZXJOZXR3b3JrQ29kZSA9ICdBRFhfQ1BOQyc7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgdSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgciwgaCwgYSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuID0gbmV3IE1hcCgpLCB0aGlzLlBuID0gJ1snLCB0aGlzLk1uID0gJ10nLCB0aGlzLlRuLnNldChzLkF1dG9wbGF5LCB0LnBsYXliYWNrTW9kZSA9PT0gbi5Qcm90b1BsYXllclBsYXliYWNrTW9kZUVudW0uQXV0b3BsYXkpLCB0aGlzLlRuLnNldChzLlVzZXJBZ2VudCwgbmF2aWdhdG9yLnVzZXJBZ2VudCksIHRoaXMuVG4uc2V0KHMuVXNlckxvbmcsIGkubG9uKSwgdGhpcy5Ubi5zZXQocy5Vc2VyTGF0LCBpLmxhdCksIHRoaXMuVG4uc2V0KHMuSXAsIGkuaXApLCB0aGlzLkVuKGgpLCB0aGlzLkxuKGEpLCB0aGlzLlJuKGUpLCB0aGlzLkJuKCksIHRoaXMuVG4uc2V0KHMuRG9tYWluLCByKSwgdGhpcy5Ubi5zZXQocy5DbnhTdXBwbGllcklkLCBvLmMpLCB0aGlzLlRuLnNldChzLlNlc3Npb25JZCwgdC5zZXNzaW9uSWQpLCBjICYmIHRoaXMuVG4uc2V0KHMuQWR4UHVibGlzaGVyTmV0d29ya0NvZGUsIGAsJHsgYyB9YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVuKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5BcHBCdW5kbGUsIHQuYnVuZGxlSUQpLCB0aGlzLlRuLnNldChzLkFwcE5hbWUsIHQuYXBwTmFtZSksIHRoaXMuVG4uc2V0KHMuQXBwVXJsLCB0LnN0b3JlVVJMKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTG4odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuLnNldChzLlNvdXJjZVJlZmVycmVyLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQm4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBPYmplY3QoaC5BKSgpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuRG9Ob3RUcmFjaywgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJuKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5QYWdlVXJsLCB0KSwgdGhpcy5Ubi5zZXQocy5VcmwsIHQpLCB0aGlzLlRuLnNldChzLlB1Ymxpc2hlciwgdCksIHRoaXMuVG4uc2V0KHMuU2l0ZSwgdCksIHRoaXMuVG4uc2V0KHMuRGVzY3JpcHRpb25VcmwsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChyLmMpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuQ2FzaEJ1c3RlciwgdCksIHRoaXMuVG4uc2V0KHMuUmFuZG9tLCB0KSwgdGhpcy5Ubi5zZXQocy5DdGQsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNwbGl0KCc/JylbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZuKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc3BsaXQoJz8nKS5zbGljZSgxKS5qb2luKCc/Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFVuKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQuaW5kZXhPZihpKSAmJiB0LmluZGV4T2YoZSwgZS5sZW5ndGgpID09PSB0Lmxlbmd0aCAtIGkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkZuKHQpLCBzID0gdGhpcy5Obih0aGlzLlZuKHQpLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyBlIH0keyBzID8gYD8keyBzIH1gIDogJycgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE5uKHQsIGksIGUgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnNwbGl0KCcmJykuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoblsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5VbihuWzFdLCB0aGlzLlBuLCB0aGlzLk1uKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZShuWzFdLCB0aGlzLkhuKG5bMV0udG9Mb3dlckNhc2UoKSwgaSwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRlY29kZVVSSUNvbXBvbmVudChuWzFdKS5zcGxpdCgnPScpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuTm4oZGVjb2RlVVJJQ29tcG9uZW50KG5bMV0pLCBpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoblsxXSwgZW5jb2RlVVJJQ29tcG9uZW50KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzID0gdGhpcy5xbihzLCBpKSwgdGhpcy56bihzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgem4odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbmRleE9mKHRoaXMuUG4pID4gLTEgJiYgKHQgPSB0LmNueF9yZXBsYWNlQWxsKHRoaXMuUG4sIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLlBuKSkpLCB0LmluZGV4T2YodGhpcy5NbikgPiAtMSAmJiAodCA9IHQuY254X3JlcGxhY2VBbGwodGhpcy5NbiwgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuTW4pKSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhuKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMsIG4gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5mb3JFYWNoKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgbi5pbmRleE9mKHRoaXMuUG4gKyBpLnRvTG93ZXJDYXNlKCkgKyB0aGlzLk1uKSA+IC0xOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gZSA/IHQgOiBlbmNvZGVVUklDb21wb25lbnQodCksIG4gPSBuLnJlcGxhY2UodGhpcy5QbiArIGkudG9Mb3dlckNhc2UoKSArIHRoaXMuTW4sIHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcW4odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gYCR7IHRoaXMuUG4gfSR7IHMuQWR4UHVibGlzaGVyTmV0d29ya0NvZGUgfSR7IHRoaXMuTW4gfWA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gdC5pbmRleE9mKGUpID8gdCA6IGkuaGFzKHMuQWR4UHVibGlzaGVyTmV0d29ya0NvZGUpID8gdC5jbnhfcmVwbGFjZUFsbChlLCBpLmdldChzLkFkeFB1Ymxpc2hlck5ldHdvcmtDb2RlKSkgOiB0LmNueF9yZXBsYWNlQWxsKGUsICcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRXaWR0aCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuV2lkdGgsIE1hdGguZmxvb3IodCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBZEhlaWdodCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuSGVpZ2h0LCBNYXRoLmZsb29yKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U3ViSWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuLnNldChzLlN1YklkLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0R0RQUih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuR2RwciwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFVVSUQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuLnNldChzLlV1aWQsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRHRFBSQ29uc2VudCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuR2RwckNvbnNlbnQsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRDb25zZW50KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5Db25zZW50LCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VmlkZW9JZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuVmlkZW9JZCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZpZGVvVGltZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuVmlkZW9UaW1lLCBNYXRoLmZsb29yKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VmlkZW9VcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuLnNldChzLlZpZGVvVXJsLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VmlkZW9EZXNjcmlwdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuVmlkZW9EZXNjcmlwdGlvbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZpZGVvRHVyYXRpb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRuLnNldChzLlZpZGVvRHVyYXRpb24sIHQpLCB0aGlzLlRuLnNldChzLkNvbnRlbnRMZW5ndGgsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRWaWRlb1RpdGxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuVmlkZW9UaXRsZSwgdCksIHRoaXMuVG4uc2V0KHMuTWVkaWFUaXRsZSwgdCksIHQgJiYgKGkgPSB0LnNwbGl0KCcgJykuam9pbignLCcpKSwgdGhpcy5Ubi5zZXQocy5WaWRlb0tleXdvcmRzLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRQb3NpdGlvbih0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdtaWRSb2xsJzsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuQWRQb3NpdGlvbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldHVwTWFjcm9zKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRG4oKSwgdGhpcy4kbih0LCB0aGlzLlRuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkRXh0cmFNYWNyb3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gT2JqZWN0KGEuYSkocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHQpLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaS5pbmNsdWRlcyh0LnRvVXBwZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQoaSwgdFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRFeHRyYU1hY3JvcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChhLmEpKHMpLCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRuLmZvckVhY2goKGUsIHMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaW5jbHVkZXMocykgfHwgbnVsbCA9PSBlIHx8IChpW3NdID0gT2JqZWN0KGMuaCkoZSkgPyBlIDogSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VXNQcml2YWN5U3RyaW5nKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVG4uc2V0KHMuVXNQcml2YWN5U3RyaW5nLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VXNlcklkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5GcmF1ZFNlbnNvclVzZXJJZCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFB1Ymxpc2hlcklkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5QdWJsaXNoZXJJZCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEZyYXVkU2Vuc29yTWFjcm9zKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Ubi5zZXQocy5GcmF1ZFNlbnNvckRldmljZVR5cGUsIHQuZGV2aWNlVHlwZSksIHRoaXMuVG4uc2V0KHMuRnJhdWRTZW5zb3JMb29rdXBJZCwgdC5sb29rdXBJZCksIHRoaXMuVG4uc2V0KHMuRnJhdWRTZW5zb3JMb29rdXBSZXNwb25zZUNvZGUsIHQubG9va3VwUmVzcG9uc2VDb2RlKSwgdGhpcy5Ubi5zZXQocy5GcmF1ZFNlbnNvck1lZGlhVHlwZSwgdC5tZWRpYVR5cGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDE4KSwgbiA9IGUoOCksIHIgPSBlKDI0KSwgaCA9IGUoMTkpLCBhID0gZSgxKTsKICAgICAgICAgICAgICAgIGNsYXNzIG8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XbiA9IHQsIHRoaXMuR24gPSAxMDAsIHRoaXMuSm4gPSBPYmplY3Qobi5mKSh3aW5kb3cpLnRvcEZyYW1lLCB0aGlzLlFuID0gcy5hLmluZGV4T2YodGhpcy5Xbi5icm93c2VyLmRldmljZSkgPiAtMSwgdGhpcy5YbiA9IE9iamVjdChuLmQpKCksIHRoaXMuWW4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyVHlwZTogdGhpcy5LbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJvd3NlclZlcnNpb246IHRoaXMuV24uYnJvd3Nlci5icm93c2VyVmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlpuID0gdGhpcy50cigpLCB0aGlzLmlyID0gdGhpcy5wYWdlVXJsLnN1YnN0cigwLCB0aGlzLkduKSwgdGhpcy5lciA9IE9iamVjdChoLmEpKHRoaXMuaXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyLmEpLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduLmJyb3dzZXIuYnJvd3NlclR5cGUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHIuYVtpXSkgPiAtMSAmJiAodCA9IHIuYVtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQsIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5Xbi5icm93c2VyLm9zQ29kZS5zcGxpdCgnXycpLCBuID0gZVswXS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocy5iKS5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pbmRleE9mKHMuYltpXSkgPiAtMSAmJiAodCA9IHMuYltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmxlbmd0aCA+IDEgJiYgKGkgPSBwYXJzZUZsb2F0KGAkeyBlWzFdIHx8IDAgfS4keyBlWzJdIHx8IDAgfWApKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc1ZlcnNpb246IGkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGRldmljZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uYnJvd3Nlci5kZXZpY2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBicm93c2VyKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ZbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9zKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5abjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGdlb0xvY2F0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5nZW9Mb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHBhZ2VVcmwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLnBhZ2VVcmwgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBwYWdlVXJsVHJ1bmMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgcGFnZURvbWFpbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpc01vYmlsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpc0luQXBwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGEuaCkodGhpcy5Xbi5idW5kbGVJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpc0luQXBwQW5kcm9pZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNJbkFwcCAmJiB0aGlzLm9zLm9zID09PSBzLmIuQW5kcm9pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHBsYXllcklkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5wbGF5ZXJJZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFwcElkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGJ1bmRsZUlEKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5idW5kbGVJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlPU0FwcElEKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5hcHBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGRvbWFpblVSTCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uZG9tYWluVVJMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgc3RvcmVVUkwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLnN0b3JlVVJMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgZXhwbG9yYXRpb25Nb2RlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5leHBsb3JhdGlvbk1vZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhcHBOYW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5hcHBOYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYXBwQ2F0ZWdvcmllcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uYXBwQ2F0ZWdvcmllczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFwcFZlcnNpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmFwcFZlcnNpb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhcHBQcml2YWN5UG9saWN5KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5hcHBQcml2YWN5UG9saWN5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYXBwSXNQYWlkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5hcHBJc1BhaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZXZpY2VJZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB0b3BXaW5kb3coKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkpuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNSZWN5Y2xlclZpZXdJbnRlZ3JhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uaXNSZWN5Y2xlclZpZXdJbnRlZ3JhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFwcFBhZ2VVUkwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmFwcFBhZ2VVUkw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjbGFzcyBzIHsKICAgICAgICAgICAgICAgICAgICBzZXROZXdNZWRpYSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlTWVkaWFNZXRhZGF0YSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TWVkaWFTdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uUGxheWJhY2soKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb25WaWV3YWJpbGl0eSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tTZXNzaW9uUmVuZGVyZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrU2Vzc2lvblZpZXdhYmlsaXR5KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja01lZGlhUXVhcnRpbGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrTWVkaWFDbGljaygpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRTdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnRCaWRSZXF1ZXN0cygpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkUHJlYmlkKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRQb3N0QmlkKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRCaWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrQXVjdGlvbkluZm9Gb3JCaWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrVmlkZW9BZEltcHJlc3Npb24oKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrVmlkZW9BZEltcHJlc3Npb25WaWV3YWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tWaWRlb0FkUXVhcnRpbGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrQWRDbGljaygpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tBZE9wcG9ydHVuaXR5KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja1Nlc3Npb25BZEJsb2NrZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhTW9kZWwoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1ldGFkYXRhTW9kZWwoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldElzQ29uc2VudFBheWxvYWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1Ymxpc2goKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEltcGxlbWVudGF0aW9uVHlwZU9uTWV0YSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkUGxhdGZvcm1DYXBwZWRMaW5lSXRlbVN1YnNjcmliZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbW92ZVBsYXRmb3JtQ2FwcGVkTGluZUl0ZW1TdWJzY3JpYmVyKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRJbXByZXNzaW9uUmV2ZW51ZVN1YnNjcmliZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlVG9JbXByZXNzaW9uUmV2ZW51ZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tIZWF2eUFkSW50ZXJ2ZW50aW9uKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDgpLCBuID0gZSg1KSwgciA9IGUoMCksIGggPSBlKDExKTsKICAgICAgICAgICAgICAgIGNsYXNzIGEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SRUxPQURfVElNRSA9IGguYSwgdGhpcy5SRUxPQURfQ09PS0lFUyA9ICdjbnhfcGxheWVyX3JlbG9hZCcsIHRoaXMuU0VTU0lPTl9JTl9WSUVXX0ZMQUcgPSAnX3Nlc3Npb25XYXNWaWV3ZWQnLCB0aGlzLnNyID0ge30sIHRoaXMubnIgPSB7fSwgdGhpcy5yciA9IHt9LCB0aGlzLkpuID0gT2JqZWN0KHMuZikod2luZG93KS50b3BGcmFtZSwgdGhpcy5ocih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbGF5ZXJSZWxvYWRlcl9jb29raWVfZmV0Y2hfZmFpbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogci5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdhc1BsYXllclJlbG9hZGVkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5zclt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkUGxheWVyU2Vzc2lvbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubnJbdF0gPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDb29raWVQbGF5ZXJzU2Vzc2lvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZFNlc3Npb25JblZpZXcodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5yW3RdICs9IHRoaXMuU0VTU0lPTl9JTl9WSUVXX0ZMQUc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFNlc3Npb25JblZpZXcodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yclt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3IoKSwgdGhpcy5Kbi5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCB8fCB0aGlzLlJFTE9BRF9USU1FKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLkpuLmRvY3VtZW50LmNvb2tpZSkuc3BsaXQoJzsnKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbMF0uaW5kZXhPZih0aGlzLlJFTE9BRF9DT09LSUVTKSA+IC0xICYmICh0aGlzLnNyID0gSlNPTi5wYXJzZShpWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmNyKCksIHRoaXMudXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3IpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5zclt0XS5pbmRleE9mKHRoaXMuU0VTU0lPTl9JTl9WSUVXX0ZMQUcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA+IC0xICYmICh0aGlzLnNyW3RdID0gdGhpcy5zclt0XS5zdWJzdHIoMCwgaSksIHRoaXMucnJbdF0gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Kbi5kb2N1bWVudC5jb29raWUgPSBgJHsgdGhpcy5SRUxPQURfQ09PS0lFUyB9PTsgZXhwaXJlcyA9IFRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UOyBwYXRoPS9gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5ycikuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSB0aGlzLm5yW3RdLmluZGV4T2YodGhpcy5TRVNTSU9OX0lOX1ZJRVdfRkxBRykgJiYgdGhpcy5hZGRTZXNzaW9uSW5WaWV3KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdC5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gaC5nICogaC5mLCB0LnNldFRpbWUoaSksIHRoaXMuSm4uZG9jdW1lbnQuY29va2llID0gYCR7IHRoaXMuUkVMT0FEX0NPT0tJRVMgfT0keyBKU09OLnN0cmluZ2lmeSh0aGlzLm5yKSB9OyBleHBpcmVzPSR7IHQudG9VVENTdHJpbmcoKSB9OyBwYXRoPS9gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDgpLCBuID0gZSgyKSwgciA9IGUoMTQpLCBoID0gZSg2KSwgYSA9IGUoNSksIG8gPSBlKDApLCBjID0gZSgxNyksIHUgPSBlKDEpOwogICAgICAgICAgICAgICAgY2xhc3MgbCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQgPSAodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoKSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5mZSA9IHQsIHRoaXMuYWRkUHJlY29ubmVjdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0SGxzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY254UmVuZGVyV2luZG93ID0gdGhpcy5mZSwgbmV3IGModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZENzc1N0cmluZyh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLmIpKHQsIGksIHRoaXMuZmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRQcmVjb25uZWN0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5jKShyLmEuZW5kUG9pbnRzLmJhc2UudmlkZW8sIHRoaXMuZmUpLCBPYmplY3Qobi5jKShyLmEuZW5kUG9pbnRzLmJhc2UuY29yZSwgdGhpcy5mZSksIE9iamVjdChuLmMpKHIuYS5lbmRQb2ludHMuYmFzZS5pbWFnZSwgdGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldExpbmVIZWlnaHRQcm9wZXJ0eVZhbHVlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLmspKHQsIHRoaXMuZmUpLmdldFByb3BlcnR5VmFsdWUoJ2xpbmUtaGVpZ2h0Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEZvbnRTaXplUHJvcGVydHlWYWx1ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5rKSh0LCB0aGlzLmZlKS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LXNpemUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Rm9udFdlaWdodFByb3BlcnR5VmFsdWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC13ZWlnaHQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNmb3JtUHJvcGVydHlWYWx1ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5rKSh0LCB0aGlzLmZlKS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ1RvcFByb3BlcnR5VmFsdWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ0JvdHRvbVByb3BlcnR5VmFsdWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWFyZ2luVG9wUHJvcGVydHlWYWx1ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5rKSh0LCB0aGlzLmZlKS5nZXRQcm9wZXJ0eVZhbHVlKCdtYXJnaW4tdG9wJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldE1hcmdpbkJvdHRvbVByb3BlcnR5VmFsdWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLWJvdHRvbScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRNYXJnaW5MZWZ0UHJvcGVydHlWYWx1ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5rKSh0LCB0aGlzLmZlKS5nZXRQcm9wZXJ0eVZhbHVlKCdtYXJnaW4tbGVmdCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRNYXJnaW5SaWdodFByb3BlcnR5VmFsdWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgnbWFyZ2luLXJpZ2h0Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVsZW1lbnRCeVN0cmluZyh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmU7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uZikodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZlOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0h0dHBzUHJvdG9jb2xVc2VkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uQykodGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzVVJMU2FtZURvbWFpblRvVG9wKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLkQpKHQsIHRoaXMuZmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0RldGFjaGVkRnJvbURPTSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkucGFyZW50Tm9kZTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPSBpLnBhcmVudE5vZGUpID09PSB0aGlzLmZlLmRvY3VtZW50LmJvZHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5U2VsZWN0b3IodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZlOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZENzc1N0eWxlc2hlZXRUb0hlYWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5mZS5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgcy5nZXRFbGVtZW50QnlJZCh0LmlkKSA/IE9iamVjdCh1LmIpKGkpICYmIGkoKSA6IE9iamVjdChuLnkpKHQsIHMuaGVhZCwgdGhpcy5mZSwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEZ1bGxzY3JlZW5LZXlzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLm4pKHQgfHwgdGhpcy5mZS5kb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRGdWxsc2NyZWVuKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKGkgfHwgdGhpcy5mZS5kb2N1bWVudClbdF0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0RG9jdW1lbnRQcm9wZXJ0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZlLmRvY3VtZW50W3RdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyT25HbG9iYWwodCwgaSwgZSwgcyA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChlID8gdGhpcy5mZS5kb2N1bWVudCA6IHRoaXMuZmUpLmFkZEV2ZW50TGlzdGVuZXIodCwgaSwgcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJPbkdsb2JhbCh0LCBpLCBlLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKGUgPyB0aGlzLmZlLmRvY3VtZW50IDogdGhpcy5mZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LCBpLCBzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tXaXRoSW1hZ2VzKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMubCkodCwgdGhpcy5mZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRDb29yZGluYXRlcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgciA9IHRoaXMuZmUucGFnZVlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRYOiBlICs9IHRoaXMuZmUucGFnZVhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRZOiBpICs9IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWVIZWxwZXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uTSkodGhpcy5mZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbmNlbFJlcXVlc3RBbmltYXRpb25GcmFtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5lKSh0aGlzLmZlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0R2xvYmFsTG9jYXRpb25Qcm9wZXJ0aWVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5mZS5sb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiB0Lmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IHQucGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmOiB0LmhyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogdC5wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHQuaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ6IHQucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogdC5zZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiB0Lmhhc2gKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3Blbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmUub3Blbih0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcHV0ZWRUcmFuc2xhdGVYKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0KG4uaykodCwgdGhpcy5mZSkuZ2V0UHJvcGVydHlWYWx1ZSgndHJhbnNmb3JtJykubWF0Y2goL15tYXRyaXhcKCguKylcKSQvKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChoLmgpKGUpICYmIChpID0gcGFyc2VGbG9hdChlWzFdLnNwbGl0KCcsICcpWzRdKSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEJvZHlEaW1lbnNpb25zKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChzLmYpKHRoaXMuZmUpLnRvcEZyYW1lLmRvY3VtZW50LmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFdpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldEhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gT2JqZWN0KG4uaykodCwgdGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpICs9IHBhcnNlSW50KHIubWFyZ2luTGVmdCwgMTApICsgcGFyc2VJbnQoci5tYXJnaW5SaWdodCwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZSArPSBwYXJzZUludChyLm1hcmdpblRvcCwgMTApICsgcGFyc2VJbnQoci5tYXJnaW5Cb3R0b20sIDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChhLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRG9tVXRpbHNfZXJyb3JfZ2V0dGluZ19ib2R5X2RpbWVuc2lvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogby5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFZpZXdwb3J0V2lkdGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qocy5mKSh0aGlzLmZlKS50b3BGcmFtZS5pbm5lcldpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRWaWV3cG9ydEhlaWdodCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmYpKHRoaXMuZmUpLnRvcEZyYW1lLmlubmVySGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRHbG9iYWxDbG9zZXN0VG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHMuZikodGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0cmlwSHRtbFRhZ3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uUCkodCwgdGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uaykodCwgdGhpcy5mZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRCeUlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLmwpKHQsIHRoaXMuZmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLm0pKHQsIHRoaXMuZmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbnNlcnRTY3JpcHQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQuaWQpID8gT2JqZWN0KHUuYikoaSkgJiYgaSgpIDogT2JqZWN0KG4ueCkodCwgdGhpcy5mZS5kb2N1bWVudC5oZWFkLCB0aGlzLmZlLCBpLCBudWxsLCAhMCwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoNiksIG4gPSBlKDEpOwogICAgICAgICAgICAgICAgY2xhc3MgciB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UXVlcnlQYXJhbXModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxyID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kUGFyYW1zVG9VcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kcih0LCBPYmplY3Qua2V5cyh0aGlzLmxyKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlOiB0aGlzLmxyW3RdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRyKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qocy5oKShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICB0ICs9IHQuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JzsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmgpKHQucGFyYW1OYW1lKSAmJiBPYmplY3Qobi5oKSh0LnBhcmFtVmFsdWUpICYmIChlICs9IGAkeyBlLmxlbmd0aCA+IDAgPyAnJicgOiAnJyB9JHsgdC5wYXJhbU5hbWUgfT0keyB0LnBhcmFtVmFsdWUgfWApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCArIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9Y254LWctY2FyZD4gPGNueCBjbGFzcz1jbngtZy10cmlhbmdsZT48L2NueD4gPGNueCBjbGFzcz1jbngtZy1jYXJkLWltYWdlPjwvY254PiA8Y254IGNsYXNzPWNueC1nLWNhcmQtdGV4dC1jb250YWluZXI+IDxjbnggY2xhc3M9Y254LWctY2FyZC10ZXh0PjwvY254PiA8L2NueD4gPGNueCBjbGFzcz1jbngtZy1jYXJkLWljb24+IDxjbnggY2xhc3M9Y254LXVpLWJ0bj4gPGNueCBjbGFzcz0iY254LWljb24tYnV0dG9uIGNueC11aS1idG4taG92ZXJhYmxlIGNueC1tb2QtaG92ZXIiPiA8Y254IGNsYXNzPWNueC1idG4tY29udGFpbmVyPiA8Y254IGNsYXNzPWNueC1wbGF5LWljb24+IDxzdmcgbWFya3VwLWlubGluZSBjbGFzcz1jbngtY29sb3ItaWNvbiB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik01IDR2MTZsMTYtOHoiIGZpbGwtcnVsZT1ldmVub2RkIC8+PC9zdmc+IDwvY254PiA8L2NueD4gPC9jbng+IDwvY254PiA8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz0iY254LXRvb2x0aXAtaG9sZGVyIGNueC1jb2xvci10dC1iZyI+IDxjbnggY2xhc3M9ImNueC10b29sdGlwLXRleHQgY254LWNvbG9yLXR0LXRleHQiPlRFU1Q8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz0iY254LWljb24tYnV0dG9uIGNueC1idXR0b24tc2V0dGluZ3MgY254LWNvbnRleHQtY29udHJvbGxlciBjbngtdWktYnRuLWhvdmVyYWJsZSI+IDxjbnggY2xhc3M9Y254LWJ0bi1jb250YWluZXI+IDxjbnggY2xhc3M9Y254LXNldHRpbmdzLWljb24+IDxzdmcgbWFya3VwLWlubGluZSBjbGFzcz1jbngtY29sb3ItaWNvbiB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyB4bWxuczp4bGluaz1odHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIHZpZXdCb3g9IjAgMCAyMiAyMiI+PHBhdGggZD0iTTE4LjQ1NCA1Ljg0N2wtMi42NDIgMS4wNS0xLjAzLS43ODRjLS40NDQtLjMzOC0uOTA0LS42MDMtMS4zOS0uOGwtMS4yMDUtLjQ4OC0uNDA0LTIuNzg2aC0xLjU2M2wtLjQwNCAyLjc4Ni0xLjIwNS40ODhjLS40NjUuMTg4LS45My40Ni0xLjQxMy44MTdMNi4xNyA2LjkgMy41NDYgNS44NDdsLS43ODMgMS4zNCAyLjIzMiAxLjcyNy0uMTYgMS4yNjZjLS4wNDIuMzMtLjA2Mi41OS0uMDYyLjgycy4wMi40OS4wNjIuODJsLjE2IDEuMjY2LTIuMjMzIDEuNzI3Ljc4MyAxLjM0IDIuNjQyLTEuMDUgMS4wMy43ODRjLjQ0NC4zMzguOTA0LjYwMyAxLjM5LjhsMS4yMDUuNDg4LjQwNCAyLjc4NmgxLjU2M2wuNDA0LTIuNzg2IDEuMjA1LS40ODhjLjQ2NS0uMTg4LjkzLS40NiAxLjQxMy0uODE3bDEuMDI1LS43NiAyLjYyNSAxLjA0My43ODMtMS4zNC0yLjIzMy0xLjcyNy4xNi0xLjI2NmMuMDQzLS4zMzcuMDYyLS41ODQuMDYyLS44MnMtLjAyLS40ODMtLjA2Mi0uODJsLS4xNi0xLjI2NiAyLjIzMy0xLjcyNy0uNzgzLTEuMzR6bS43MSA2LjIyN2wyLjMyIDEuODFjLjIxLjE2NC4yNjQuNDYuMTMyLjcwMmwtMi4xOTggMy43OTNjLS4xMzIuMjQtLjQxOC4zNC0uNjcuMjRsLTIuNzM2LTEuMDk2Yy0uNTcuNDI3LTEuMTg3LjgtMS44NTcgMS4wNzRsLS40MTggMi45MDVjLS4wMzMuMjYzLS4yNjQuNDYtLjUzOC40Nkg4LjgwMmMtLjI3NSAwLS41MDYtLjE5Ny0uNTM4LS40NmwtLjQxOC0yLjkwNWMtLjY3LS4yNzQtMS4yODYtLjYzNi0xLjg1Ny0xLjA3NGwtMi43MzYgMS4wOTZjLS4yNDIuMDg4LS41MzggMC0uNjctLjI0TC4zODUgMTQuNTg0Yy0uMTMyLS4yNC0uMDc3LS41MzcuMTMyLS43MDJsMi4zMi0xLjgxQTguNjcgOC42NyAwIDAgMSAyLjc1OCAxMWE4LjY3IDguNjcgMCAwIDEgLjA3Ny0xLjA3NGwtMi4zMi0xLjgxYS41NC41NCAwIDAgMS0uMTMyLS43MDJsMi4xOTgtMy43OTNjLjEzMi0uMjQuNDE4LS4zNC42Ny0uMjRMNS45OSA0LjQ3OGMuNTctLjQyNyAxLjE4Ny0uOCAxLjg1Ny0xLjA3NEw4LjI2NC41Yy4wMzMtLjI2My4yNjQtLjQ2LjUzOC0uNDZoNC4zOTZjLjI3NSAwIC41MDYuMTk3LjUzOC40NmwuNDE4IDIuOTA1Yy42Ny4yNzQgMS4yODYuNjM2IDEuODU3IDEuMDc0bDIuNzM2LTEuMDk2Yy4yNDItLjA4OC41MzggMCAuNjcuMjRsMi4xOTggMy43OTNjLjEzMi4yNC4wNzcuNTM3LS4xMzIuNzAybC0yLjMyIDEuODFBOC41MiA4LjUyIDAgMCAxIDE5LjI0MiAxMWE4LjUyIDguNTIgMCAwIDEtLjA3NyAxLjA3NHpNMTEgMTQuMjU2QTMuMjYgMy4yNiAwIDAgMCAxNC4yNTYgMTEgMy4yNiAzLjI2IDAgMCAwIDExIDcuNzQ0IDMuMjYgMy4yNiAwIDAgMCA3Ljc0NCAxMSAzLjI2IDMuMjYgMCAwIDAgMTEgMTQuMjU2em0wLTJBMS4yNiAxLjI2IDAgMCAxIDkuNzQ0IDExIDEuMjYgMS4yNiAwIDAgMSAxMSA5Ljc0NCAxLjI2IDEuMjYgMCAwIDEgMTIuMjU2IDExIDEuMjYgMS4yNiAwIDAgMSAxMSAxMi4yNTZ6Ii8+PC9zdmc+IDwvY254PiA8Y254IGNsYXNzPWNueC1oZC1mbGFnPiA8c3ZnIG1hcmt1cC1pbmxpbmUgeG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDE3IDExIj48ZyBmaWxsPW5vbmU+PHJlY3QgY2xhc3M9Y254LWNvbG9yLWFjY2VudCB3aWR0aD0xNyBoZWlnaHQ9MTEgcng9MiBmaWxsPSMwOUYgLz48cGF0aCBjbGFzcz1jbngtY29sb3ItaWNvbiBkPSJNOCA5TDYuOSA5IDYuOSA1LjkgNC4xIDUuOSA0LjEgOSAzIDkgMyAyIDQuMSAyIDQuMSA0LjkgNi45IDQuOSA2LjkgMiA4IDIgOCA5Wk0xMCA5TDEwIDIgMTIgMkMxMi42IDIgMTMuMSAyLjIgMTMuNiAyLjQgMTQgMi43IDE0LjQgMy4xIDE0LjYgMy42IDE0LjkgNC4xIDE1IDQuNyAxNSA1LjNMMTUgNS43QzE1IDYuNCAxNC45IDYuOSAxNC42IDcuNCAxNC40IDcuOSAxNCA4LjMgMTMuNSA4LjYgMTMuMSA4LjkgMTIuNSA5IDExLjkgOUwxMCA5Wk0xMSAzTDExIDggMTIuMiA4QzEyLjggOCAxMy4yIDcuOCAxMy41IDcuNCAxMy44IDcgMTQgNi40IDE0IDUuN0wxNCA1LjNDMTQgNC42IDEzLjggNCAxMy41IDMuNiAxMy4yIDMuMiAxMi44IDMgMTIuMiAzTDExIDNaIi8+PC9nPjwvc3ZnPiA8L2NueD4gPC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC11cC1uZXh0LWNvbnRhaW5lciBjbngtaGlkZS1vbi1zaW5nbGUtdmlkZW8iPiA8Y254IGNsYXNzPWNueC11cC1uZXh0LWJveD4gPGNueCBjbGFzcz1jbngtdXAtbmV4dC1ib3gtaW1hZ2U+IDxpbWcvPiA8L2NueD4gPGNueCBjbGFzcz1jbngtdXAtbmV4dC1ib3gtZ3JhZGllbnQ+PC9jbng+IDxjbnggY2xhc3M9Y254LXVwLW5leHQtYm94LXRleHQ+PC9jbng+IDxjbnggY2xhc3M9Y254LXVwLW5leHQtYm94LWJ1dHRvbj4gPGNueCBjbGFzcz1jbngtdXAtbmV4dC1ib3gtYnV0dG9uLXRleHQ+TkVYVDwvY254PiA8L2NueD4gPC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC1wcm9ncmVzcy1iYXIgY254LXZpZGVvLXByb2dyZXNzIj4gPGNueCBjbGFzcz1jbngtcHJvZ3Jlc3MtcmFpbC1jb250YWluZXI+IDxjbnggY2xhc3M9Y254LXByb2dyZXNzLXJhaWw+PC9jbng+IDxjbnggY2xhc3M9ImNueC1wcm9ncmVzcy1maWxsIGNueC1jb2xvci1hY2NlbnQiPjwvY254PiA8Y254IGNsYXNzPWNueC1wcm9ncmVzcy1mb2xsb3c+PC9jbng+IDwvY254PiA8Y254IGNsYXNzPSJjbngtcHJvZ3Jlc3MtaGFuZGxlIGNueC1jb2xvci1hY2NlbnQiPjwvY254PiA8Y254IGNsYXNzPWNueC1wcm9ncmVzcy1oaXRhcmVhPjwvY254PiA8L2NueD4gJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8Y254IGNsYXNzPSJjbngtdWktY20gY254LXVpLWNtLWNvbnRleHQiPiA8Y254IGNsYXNzPWNueC1jbS1jb250YWluZXI+PC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC11aS1jbSBjbngtdWktY20tc2V0dGluZ3MiPiA8Y254IGNsYXNzPWNueC1jbS1jb250YWluZXI+PC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9Y254LWNhcHRpb25zPiA8Y254IGNsYXNzPWNueC1jYXB0aW9ucy1jb250YWluZXI+IDxjbngtc3BhbiBjbGFzcz1jbngtY2FwdGlvbnMtdGV4dC1ob2xkZXI+PC9jbngtc3Bhbj4gPC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgY2xhc3M9ImNueC1jb2xvci1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTUgNHYxNmwxNi04eiIgZmlsbC1ydWxlPSJldmVub2RkIj48L3BhdGg+PC9zdmc+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8c3ZnIGNsYXNzPSJjbngtY29sb3ItaWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik05IDIxSDNWM2g2djE4em0xMiAwaC02VjNoNnYxOHoiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PC9wYXRoPjwvc3ZnPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz1jbngtcHJvZ3Jlc3MtYmFyPiA8Y254IGNsYXNzPWNueC1wcm9ncmVzcy1yYWlsLWNvbnRhaW5lcj4gPGNueCBjbGFzcz1jbngtcHJvZ3Jlc3MtcmFpbD48L2NueD4gPGNueCBjbGFzcz0iY254LXByb2dyZXNzLWZpbGwgY254LWNvbG9yLWljb24iPjwvY254PiA8L2NueD4gPGNueCBjbGFzcz0iY254LXByb2dyZXNzLWhhbmRsZSBjbngtY29sb3ItaWNvbiI+PC9jbng+IDwvY254PiAnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC1pY29uLWJ1dHRvbiBjbngtdWktYnRuLWhvdmVyYWJsZSI+IDxjbnggY2xhc3M9Y254LWJ0bi1jb250YWluZXI+IDxjbnggY2xhc3M9Y254LWV4cGFuZC1pY29uPiA8c3ZnIG1hcmt1cC1pbmxpbmUgY2xhc3M9Y254LWNvbG9yLWljb24geG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNNC42IDNIMTB2Mkg1djVIM1Y0LjZBMS41OCAxLjU4IDAgMCAxIDQuNiAzek01IDE0djVoNXYySDQuNkExLjU4IDEuNTggMCAwIDEgMyAxOS40VjE0aDJ6TTE5LjQgM0ExLjU4IDEuNTggMCAwIDEgMjEgNC42VjEwaC0yVjVoLTVWM2g1LjR6TTE5IDE0aDJ2NS40YTEuNTggMS41OCAwIDAgMS0xLjYgMS42SDE0di0yaDV2LTV6IiBmaWxsLXJ1bGU9ZXZlbm9kZCAvPjwvc3ZnPiA8L2NueD4gPGNueCBjbGFzcz1jbngtY29sbGFwc2UtaWNvbj4gPHN2ZyBtYXJrdXAtaW5saW5lIGNsYXNzPWNueC1jb2xvci1pY29uIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbC1ydWxlPWV2ZW5vZGQ+PHBhdGggZD0iTTE2LjYgMTVhMS41OCAxLjU4IDAgMCAwLTEuNiAxLjZWMjJoMnYtNWg1di0yaC01LjR6TTE3IDJoLTJ2NS40QTEuNTggMS41OCAwIDAgMCAxNi42IDlIMjJWN2gtNVYyek03LjQgMTVBMS41OCAxLjU4IDAgMCAxIDkgMTYuNlYyMkg3di01SDJ2LTJoNS40ek03IDJoMnY1LjRBMS41OCAxLjU4IDAgMCAxIDcuNCA5SDJWN2g1VjJ6Ii8+PC9zdmc+IDwvY254PiA8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz0iY254LXVpLWNtIGNueC11aS1jbS1xdWFsaXR5Ij4gPGNueCBjbGFzcz1jbngtY20tY29udGFpbmVyPjwvY254PiA8L2NueD4gJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAyMiAyMiIgY2xhc3M9ImNueC1jb2xvci1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48cGF0aCBkPSJNMTggNS40TDE2LjYgNCAxMSA5LjYgNS40IDQgNCA1LjQgOS42IDExIDQgMTYuNiA1LjQgMThsNS42LTUuNiA1LjYgNS42IDEuNC0xLjQtNS42LTUuNnoiPjwvcGF0aD48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgY2xhc3M9ImNueC1jb2xvci1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMjIgMjIiPjxwYXRoIGQ9Ik0xMSA3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9ImNueC1hZC1za2lwLWJ1dHRvbiBjbngtdWktYnRuIj4gPGNueCBjbGFzcz1jbngtaWNvbi1idXR0b24+IDxjbnggY2xhc3M9Y254LXNraXAtYWQtdGV4dD4gU2tpcCA8Y254LXNwYW4+PC9jbngtc3Bhbj4gPC9jbng+IDxjbnggY2xhc3M9Y254LXNraXAtYWQtaWNvbj4gPHN2ZyBtYXJrdXAtaW5saW5lIHZpZXdCb3g9IjAgMCAyNCAyNCIgY2xhc3M9Y254LWNvbG9yLWljb24geG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTggMjFoM1YzaC0zdjE4ek0zIDIxbDE0LTlMMyAzdjE4eiIgZmlsbC1ydWxlPWV2ZW5vZGQgLz48L3N2Zz4gPC9jbng+IDwvY254PiA8Y254IGNsYXNzPWNueC10aW1lci1sb2FkZXI+IDxzdmcgbWFya3VwLWlubGluZSB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyB3aWR0aD0zNiBoZWlnaHQ9MzYgdmlld0JveD0iMCAwIDM2IDM2Ij48Y2lyY2xlIGNsYXNzPWNueC1zdmctY2lyY2xlLXN0cm9rZSBjeD0xOCBjeT0xOCByPTE3IC8+PC9zdmc+IDwvY254PiA8L2NueD4gJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMiAyIDIwIDIwIj48cGF0aCBkPSJNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNtLTIgMTZINVY1aDdWM0g1YTIgMiAwIDAwLTIgMnYxNGEyIDIgMCAwMDIgMmgxNGEyIDIgMCAwMDItMnYtN2gtMnY3eiI+PC9wYXRoPjwvc3ZnPic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz1jbngtcG9kLWxvYWRpbmctc2NyZWVuLWNvbnRhaW5lcj4gPGltZyBhbHQ9IkxvYWRpbmcgUG9kcyIgY2xhc3M9Y254LXBvZC1sb2FkaW5nLWJhY2tncm91bmQgLz4gPGNueCBjbGFzcz1jbngtcG9kLWxvYWRpbmctaW5mbz4gPGNueCBjbGFzcz1jbngtcG9kLW9wZW4tbmV3LWljb24+IDwvY254PiA8Y254IGNsYXNzPWNueC1wb2QtdmlzaXQtd2Vic2l0ZS10ZXh0PiA8Y254LXNwYW4+VmlzaXQgQWR2ZXJ0aXNlciB3ZWJzaXRlPC9jbngtc3Bhbj4gPC9jbng+IDxjbnggY2xhc3M9Y254LXBvZC1yZWFkLW1vcmUtY29udGFpbmVyPiA8Y254LXNwYW4gY2xhc3M9Y254LXBvZC1yZWFkLW1vcmUtYnRuPkdPIFRPIFBBR0U8L2NueC1zcGFuPiA8L2NueD4gPC9jbng+IDxjbnggY2xhc3M9Y254LXBvZC1sb2FkaW5nLWZhbGxiYWNrPiA8Y254IGNsYXNzPWNueC1wb2QtbG9hZGluZy1zcGlubmVyPjwvY254PiA8Y254LXNwYW4gY2xhc3M9Y254LXBvZC1zbG90LWNvdW50LXRleHQ+PC9jbngtc3Bhbj4gPC9jbng+IDwvY254Pic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPHN2ZyBjbGFzcz0iY254LWNvbG9yLWljb24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYzaDJWNWgxOHYxNGgtN3YyaDdjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNMSAxOHYzaDNjMC0xLjY2LTEuMzQtMy0zLTN6bTAtNHYyYzIuNzYgMCA1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTAtNHYyYzQuOTcgMCA5IDQuMDMgOSA5aDJjMC02LjA4LTQuOTMtMTEtMTEtMTF6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjwvcGF0aD48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgY2xhc3M9ImNueC1jb2xvci1pY29uIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE4IDE2LjA4Yy0uNzYgMC0xLjQ0LjMtMS45Ni43N0w4LjkgMTIuN2MuMDUtLjIzLjEtLjQ2LjEtLjdzLS4wNC0uNDctLjEtLjdsNy4wNS00LjFjLjU0LjUgMS4yNS44IDIuMDQuOCAxLjY2IDAgMy0xLjM0IDMtM3MtMS4zNC0zLTMtMy0zIDEuMzQtMyAzYzAgLjI0LjA0LjQ3LjEuN0w4LjA0IDkuOEM3LjUgOS4zIDYuOCA5IDYgOWMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgM2MuOCAwIDEuNS0uMyAyLjA0LS44bDcuMTIgNC4xNmEyLjgyIDIuODIgMCAwIDAtLjA4LjY1YzAgMS42IDEuMyAyLjkyIDIuOTIgMi45MnMyLjkyLTEuMyAyLjkyLTIuOTItMS4zLTIuOTItMi45Mi0yLjkyeiIgZmlsbC1ydWxlPSJldmVub2RkIj48L3BhdGg+PC9zdmc+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8Y254IGNsYXNzPWNueC1pY29uLWJ1dHRvbj4gPGNueCBjbGFzcz1jbngtYnRuLWNvbnRhaW5lcj4gPGNueCBjbGFzcz1jbngtdW5tdXRlLWljb24+IDxzdmcgbWFya3VwLWlubGluZSBjbGFzcz1jbngtY29sb3ItaWNvbiB4bWxucz1odHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0wIDcuOTEzdjcuOTEzaDQuOTQ2bDUuOTM1IDUuMDQ1VjEuOTc4TDQuOTQ2IDcuOTEzem0xNi44MTUgMy45NTdjLjAzLTIuMDc4LTEuMTItMy45OTQtMi45NjctNC45NDZ2OS45YzEuODQ3LS45NTIgMi45OTctMi44NjcgMi45NjctNC45NDV6TTEzLjg0OCAwdjIuMDc3YTEwLjM5IDEwLjM5IDAgMCAxIDAgMTkuNTg1djIuMDc3YTEyLjA1IDEyLjA1IDAgMCAwIDguOS0xMS44N0ExMi4wNSAxMi4wNSAwIDAgMCAxMy44NDggMHoiLz48L3N2Zz4gPC9jbng+IDxjbnggY2xhc3M9Y254LW11dGUtaWNvbj4gPHN2ZyBtYXJrdXAtaW5saW5lIGNsYXNzPWNueC1jb2xvci1pY29uIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTExIDJMOC4yNSA0LjI1IDExIDd6TTAgN3Y5aDVsNiA1di02LjVMMy44NSA3em0xNyA0LjVjMC0xLjk2NS0xLjItMy43MzUtMy00LjV2M2wyLjggMi44YTMuNzMgMy43MyAwIDAgMCAuMi0xLjN6bTMuNCA3LjQ1bC0xLjg1LTEuODUtMi42NS0yLjYtMS45LTEuOTUtMy0zLTQuMTUtNC4xLTQuOTUtNUwxLjQ1IDAgMCAxLjQ1IDE3LjE1IDE4LjYgMTkgMjAuNGwzLjU1IDMuNkwyNCAyMi41NXpNMTQgMjNhMTEuODMgMTEuODMgMCAwIDAgMy42NS0xLjU1bC0xLjI1LTEuM2MtLjc0Ny40OTgtMS41NTMuOTAyLTIuNCAxLjJWMjN6bTktMTEuNUExMS43NyAxMS43NyAwIDAgMCAxNCAwdjEuNkExMC41MyAxMC41MyAwIDAgMSAyMCAxNmwxLjQ1IDEuNDVBMTEuOTkgMTEuOTkgMCAwIDAgMjMgMTEuNXoiLz48L3N2Zz4gPC9jbng+IDwvY254PiA8L2NueD4gJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8c3ZnIHZpZXdCb3g9IjAgMCA0NCA0NCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9Im5vbnplcm8iPjxwYXRoIGQ9Ik0yMiAxNS41YTYuNSA2LjUgMCAxMDAgMTMgNi41IDYuNSAwIDAwMC0xM3oiIGZpbGw9IiNGRkYiPjwvcGF0aD48cGF0aCBkPSJNMjIgMThhNCA0IDAgMTEwIDggNCA0IDAgMDEwLTh6IiBmaWxsPSIjRkY0MDQ3Ij48L3BhdGg+PHBhdGggZD0iTTM3LjU5OCA3LjU0MWM3Ljk1NSA3Ljk3MiA4LjAzNiAyMC44NDYuMjQzIDI4LjkxOGwtLjI0My4yNDgtMS43Ny0xLjc2NWM2Ljk4NS03IDcuMDYyLTE4LjMwMi4yMzMtMjUuMzk3bC0uMjMzLS4yMzggMS43Ny0xLjc2NnptLTQuNzIyIDUuMjI1YzQuMzQgNC45MjYgNC40MTUgMTIuODAzLjIyNCAxNy44MzFsLS4yMjQuMjYyTDMxIDI5LjIwNmMzLjUxNS0zLjk4OSAzLjU4My0xMC40NjUuMjAzLTE0LjU1TDMxIDE0LjQybDEuODc2LTEuNjUzeiIgZmlsbD0iI0ZGRiI+PC9wYXRoPjxwYXRoIGQ9Ik02LjU5OCA3LjU0MWM3Ljk1NSA3Ljk3MiA4LjAzNiAyMC44NDYuMjQzIDI4LjkxOGwtLjI0My4yNDgtMS43Ny0xLjc2NWM2Ljk4NS03IDcuMDYyLTE4LjMwMi4yMzMtMjUuMzk3bC0uMjMzLS4yMzggMS43Ny0xLjc2NnptLTQuNzIyIDUuMjI1YzQuMzQgNC45MjYgNC40MTUgMTIuODAzLjIyNCAxNy44MzFsLS4yMjQuMjYyTDAgMjkuMjA2YzMuNTE1LTMuOTg5IDMuNTgzLTEwLjQ2NS4yMDMtMTQuNTVMMCAxNC40MmwxLjg3Ni0xLjY1M3oiIGZpbGw9IiNGRkYiIHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEyLjYyNiAwKSI+PC9wYXRoPjwvZz48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxzdmcgdmlld0JveD0iMCAwIDQ0IDQ0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiNGRkYiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHJlY3QgY2xhc3M9ImNueC1saXZlLWljb24tc3ZnLXJlY3RhbmdsZSIgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMjIuMDYgMjEuNDMpIiB4PSIyMC4wNTkiIHk9IjE1LjkyOSI+PC9yZWN0PjxwYXRoIGQ9Ik0zNy41OTggNy41NDFjNy45NTUgNy45NzIgOC4wMzYgMjAuODQ2LjI0MyAyOC45MThsLS4yNDMuMjQ4LTEuNzctMS43NjVjNi45ODUtNyA3LjA2Mi0xOC4zMDIuMjMzLTI1LjM5N2wtLjIzMy0uMjM4IDEuNzctMS43NjZ6bS00LjcyMiA1LjIyNWM0LjM0IDQuOTI2IDQuNDE1IDEyLjgwMy4yMjQgMTcuODMxbC0uMjI0LjI2MkwzMSAyOS4yMDZjMy41MTUtMy45ODkgMy41ODMtMTAuNDY1LjIwMy0xNC41NUwzMSAxNC40MmwxLjg3Ni0xLjY1M3oiIGZpbGwtcnVsZT0ibm9uemVybyIgb3BhY2l0eT0iLjUiPjwvcGF0aD48cGF0aCBkPSJNNi41OTggNy41NDFjNy45NTUgNy45NzIgOC4wMzYgMjAuODQ2LjI0MyAyOC45MThsLS4yNDMuMjQ4LTEuNzctMS43NjVjNi45ODUtNyA3LjA2Mi0xOC4zMDIuMjMzLTI1LjM5N2wtLjIzMy0uMjM4IDEuNzctMS43NjZ6bS00LjcyMiA1LjIyNWM0LjM0IDQuOTI2IDQuNDE1IDEyLjgwMy4yMjQgMTcuODMxbC0uMjI0LjI2MkwwIDI5LjIwNmMzLjUxNS0zLjk4OSAzLjU4My0xMC40NjUuMjAzLTE0LjU1TDAgMTQuNDJsMS44NzYtMS42NTN6IiBmaWxsLXJ1bGU9Im5vbnplcm8iIG9wYWNpdHk9Ii41IiB0cmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAxMi42MjYgMCkiPjwvcGF0aD48L2c+PC9zdmc+JzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8Y254IGNsYXNzPSJjbngtbGl2ZS1wb3N0ZXIgY254LW1vZC1hY3RpdmUiPiA8Y254IGNsYXNzPWNueC1saXZlLWJyb2FkY2FzdD4gPGNueCBjbGFzcz1jbngtbGl2ZS1pY29uPiA8c3ZnIGNsYXNzPWNueC1saXZlLWljb24tc3RhcnRpbmcgbWFya3VwLWlubGluZSB2aWV3Qm94PSIwIDAgNDQgNDQiIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxnIGZpbGw9bm9uZSBmaWxsLXJ1bGU9bm9uemVybz48cGF0aCBkPSJNMjIgMTUuNWE2LjUgNi41IDAgMTAwIDEzIDYuNSA2LjUgMCAwMDAtMTN6IiBmaWxsPSNGRkYgLz48cGF0aCBkPSJNMjIgMThhNCA0IDAgMTEwIDggNCA0IDAgMDEwLTh6IiBmaWxsPSNGRjQwNDcgLz48cGF0aCBkPSJNMzcuNTk4IDcuNTQxYzcuOTU1IDcuOTcyIDguMDM2IDIwLjg0Ni4yNDMgMjguOTE4bC0uMjQzLjI0OC0xLjc3LTEuNzY1YzYuOTg1LTcgNy4wNjItMTguMzAyLjIzMy0yNS4zOTdsLS4yMzMtLjIzOCAxLjc3LTEuNzY2em0tNC43MjIgNS4yMjVjNC4zNCA0LjkyNiA0LjQxNSAxMi44MDMuMjI0IDE3LjgzMWwtLjIyNC4yNjJMMzEgMjkuMjA2YzMuNTE1LTMuOTg5IDMuNTgzLTEwLjQ2NS4yMDMtMTQuNTVMMzEgMTQuNDJsMS44NzYtMS42NTN6IiBmaWxsPSNGRkYgLz48cGF0aCBkPSJNNi41OTggNy41NDFjNy45NTUgNy45NzIgOC4wMzYgMjAuODQ2LjI0MyAyOC45MThsLS4yNDMuMjQ4LTEuNzctMS43NjVjNi45ODUtNyA3LjA2Mi0xOC4zMDIuMjMzLTI1LjM5N2wtLjIzMy0uMjM4IDEuNzctMS43NjZ6bS00LjcyMiA1LjIyNWM0LjM0IDQuOTI2IDQuNDE1IDEyLjgwMy4yMjQgMTcuODMxbC0uMjI0LjI2MkwwIDI5LjIwNmMzLjUxNS0zLjk4OSAzLjU4My0xMC40NjUuMjAzLTE0LjU1TDAgMTQuNDJsMS44NzYtMS42NTN6IiBmaWxsPSNGRkYgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTIuNjI2IDApIi8+PC9nPjwvc3ZnPiA8c3ZnIGNsYXNzPWNueC1saXZlLWljb24tZW5kZWQgbWFya3VwLWlubGluZSB2aWV3Qm94PSIwIDAgNDQgNDQiIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnPjxnIGZpbGw9I0ZGRiBmaWxsLXJ1bGU9ZXZlbm9kZD48cmVjdCBjbGFzcz1jbngtbGl2ZS1pY29uLXN2Zy1yZWN0YW5nbGUgdHJhbnNmb3JtPSJyb3RhdGUoOTAgMjIuMDYgMjEuNDMpIiB4PTIwLjA1OSB5PTE1LjkyOSAvPjxwYXRoIGQ9Ik0zNy41OTggNy41NDFjNy45NTUgNy45NzIgOC4wMzYgMjAuODQ2LjI0MyAyOC45MThsLS4yNDMuMjQ4LTEuNzctMS43NjVjNi45ODUtNyA3LjA2Mi0xOC4zMDIuMjMzLTI1LjM5N2wtLjIzMy0uMjM4IDEuNzctMS43NjZ6bS00LjcyMiA1LjIyNWM0LjM0IDQuOTI2IDQuNDE1IDEyLjgwMy4yMjQgMTcuODMxbC0uMjI0LjI2MkwzMSAyOS4yMDZjMy41MTUtMy45ODkgMy41ODMtMTAuNDY1LjIwMy0xNC41NUwzMSAxNC40MmwxLjg3Ni0xLjY1M3oiIGZpbGwtcnVsZT1ub256ZXJvIG9wYWNpdHk9LjUgLz48cGF0aCBkPSJNNi41OTggNy41NDFjNy45NTUgNy45NzIgOC4wMzYgMjAuODQ2LjI0MyAyOC45MThsLS4yNDMuMjQ4LTEuNzctMS43NjVjNi45ODUtNyA3LjA2Mi0xOC4zMDIuMjMzLTI1LjM5N2wtLjIzMy0uMjM4IDEuNzctMS43NjZ6bS00LjcyMiA1LjIyNWM0LjM0IDQuOTI2IDQuNDE1IDEyLjgwMy4yMjQgMTcuODMxbC0uMjI0LjI2MkwwIDI5LjIwNmMzLjUxNS0zLjk4OSAzLjU4My0xMC40NjUuMjAzLTE0LjU1TDAgMTQuNDJsMS44NzYtMS42NTN6IiBmaWxsLXJ1bGU9bm9uemVybyBvcGFjaXR5PS41IHRyYW5zZm9ybT0ibWF0cml4KC0xIDAgMCAxIDEyLjYyNiAwKSIvPjwvZz48L3N2Zz4gPC9jbng+IDxjbnggY2xhc3M9Y254LWxpdmUtbWVzc2FnZT4gPGNueC1zcGFuPjwvY254LXNwYW4+IDwvY254PiA8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSAnPGNueCBjbGFzcz0iY254LXVpLWxpdmUtYmFkZ2Utd3JhcHBlciBjbngtZC1tZC1ub25lIj4gPGNueCBjbGFzcz1jbngtdWktbGl2ZS1iYWRnZT4gPHN2ZyBtYXJrdXAtaW5saW5lIHhtbG5zPWh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIHZpZXdCb3g9IjAgMCAzNyA5IiBmaWxsLXJ1bGU9bm9uemVybz48cGF0aCBkPSJNMTUuMjIzIDlWNy44MTZIMTEuMzVWLjQ3SDkuODY4VjloNS4zNTZ6bTMuNyAwVi40N2gtMS40NzdWOWgxLjQ3N3ptNi41NTUgMEwyOC41NS40N2gtMS42M2wtMi4xNjggNi42NzRMMjIuNjA4LjQ3aC0xLjYyM0wyNC4wNDMgOWgxLjQzNnptMTAuNiAwVjcuODE2aC00LjA5NlY1LjJoMy41MDRWNC4wMmgtMy41MDRWMS42NjRoNC4wNTVWLjQ3SDMwLjVWOWg1LjU3OHpNMyAyYTMgMyAwIDEgMCAwIDYgMyAzIDAgMSAwIDAtNnoiIGZpbGw9I2ZmZiAvPjxwYXRoIGQ9Ik0zIDNhMiAyIDAgMSAxIDAgNCAyIDIgMCAxIDEgMC00eiIgZmlsbD0jZmY0MDQ3IC8+PC9zdmc+IDwvY254PiA8L2NueD4gJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9ICc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDMyIDIyIj48cGF0aCBkPSJNMjYsMjJIMFYwSDMxLjkzTDMyLDE2QTYsNiwwLDAsMSwyNiwyMloiIHN0eWxlPSJmaWxsOiNmZmM4MDA7ZmlsbC1ydWxlOmV2ZW5vZGQiPjwvcGF0aD48cGF0aCBkPSJNMTIsNS4yOWgwTDE2LjQ1LDE2LjdIMTQuODNsLTEuMDYtMi44NUg4Ljg2bC0xLDIuODVINi4yMUwxMC42LDUuMzFoMFptNS44OSwxMS40MlY1LjI5aDMuNjNBNS41Miw1LjUyLDAsMCwxLDI2LjY1LDExYTUuMzMsNS4zMywwLDAsMS00LjkzLDUuN0gxNy44OVptMS40Ni0xLjM2aDIuMTdjMS43NywwLDMuNy0xLjQ5LDMuNy00LjM1cy0xLjkzLTQuMjgtMy43LTQuMjhIMTkuMzVabS04LTguMTYtMiw1LjI0aDMuODZaIiBzdHlsZT0iZmlsbC1ydWxlOmV2ZW5vZGQiPjwvcGF0aD48L3N2Zz4nOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gJzxjbnggY2xhc3M9Y254LW11dGUtd2F0ZXJtYXJrPiA8Y254PiA8c3ZnIG1hcmt1cC1pbmxpbmUgY2xhc3M9Y254LWNvbG9yLWljb24geG1sbnM9aHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTEgMkw4LjI1IDQuMjUgMTEgN3pNMCA3djloNWw2IDV2LTYuNUwzLjg1IDd6bTE3IDQuNWMwLTEuOTY1LTEuMi0zLjczNS0zLTQuNXYzbDIuOCAyLjhhMy43MyAzLjczIDAgMCAwIC4yLTEuM3ptMy40IDcuNDVsLTEuODUtMS44NS0yLjY1LTIuNi0xLjktMS45NS0zLTMtNC4xNS00LjEtNC45NS01TDEuNDUgMCAwIDEuNDUgMTcuMTUgMTguNiAxOSAyMC40bDMuNTUgMy42TDI0IDIyLjU1ek0xNCAyM2ExMS44MyAxMS44MyAwIDAgMCAzLjY1LTEuNTVsLTEuMjUtMS4zYy0uNzQ3LjQ5OC0xLjU1My45MDItMi40IDEuMlYyM3ptOS0xMS41QTExLjc3IDExLjc3IDAgMCAwIDE0IDB2MS42QTEwLjUzIDEwLjUzIDAgMCAxIDIwIDE2bDEuNDUgMS40NUExMS45OSAxMS45OSAwIDAgMCAyMyAxMS41eiIvPjwvc3ZnPiA8L2NueD4gPC9jbng+ICc7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoNSksIHIgPSBlKDApLCBoID0gZSgyKSwgYSA9IFtdLCBvID0gJ1Jlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkIHdpdGggdW5kZWxpdmVyZWQgbm90aWZpY2F0aW9ucy4nOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5CT1JERVJfQk9YID0gJ2JvcmRlci1ib3gnLCB0LkNPTlRFTlRfQk9YID0gJ2NvbnRlbnQtYm94JywgdC5ERVZJQ0VfUElYRUxfQ09OVEVOVF9CT1ggPSAnZGV2aWNlLXBpeGVsLWNvbnRlbnQtYm94JzsKICAgICAgICAgICAgICAgIH0ocyB8fCAocyA9IHt9KSk7CiAgICAgICAgICAgICAgICB2YXIgYywgdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54ID0gdCwgdGhpcy55ID0gaSwgdGhpcy53aWR0aCA9IGUsIHRoaXMuaGVpZ2h0ID0gcywgdGhpcy50b3AgPSB0aGlzLnksIHRoaXMubGVmdCA9IHRoaXMueCwgdGhpcy5ib3R0b20gPSB0aGlzLnRvcCArIHRoaXMuaGVpZ2h0LCB0aGlzLnJpZ2h0ID0gdGhpcy5sZWZ0ICsgdGhpcy53aWR0aCwgT2JqZWN0LmZyZWV6ZSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB0LngsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogdC55LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdC50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHQucmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiB0LmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0LmhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5mcm9tUmVjdCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHQoaS54LCBpLnksIGkud2lkdGgsIGkuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCksIGwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgJiYgJ2dldEJCb3gnIGluIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuZ2V0QkJveCgpLCBlID0gaS53aWR0aCwgcyA9IGkuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlICYmICFzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdCwgciA9IG4ub2Zmc2V0V2lkdGgsIGggPSBuLm9mZnNldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEociB8fCBoIHx8IHQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIH0sIGYgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgcyA9IG51bGwgPT09IChlID0gbnVsbCA9PT0gKGkgPSB0KSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLm93bmVyRG9jdW1lbnQpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuZGVmYXVsdFZpZXc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIShzICYmIHQgaW5zdGFuY2VvZiBzLkVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0sIHAgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDoge30sIGIgPSBuZXcgV2Vha01hcCgpLCB2ID0gL2F1dG98c2Nyb2xsLywgbSA9IC9edGJ8dmVydGljYWwvLCBnID0gL21zaWV8dHJpZGVudC9pLnRlc3QocC5uYXZpZ2F0b3IgJiYgcC5uYXZpZ2F0b3IudXNlckFnZW50KSwgeSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHQgfHwgJzAnKTsKICAgICAgICAgICAgICAgICAgICB9LCB3ID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCAmJiAodCA9IDApLCB2b2lkIDAgPT09IGkgJiYgKGkgPSAwKSwgdm9pZCAwID09PSBlICYmIChlID0gITEpLCBPYmplY3QuZnJlZXplKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZVNpemU6IChlID8gaSA6IHQpIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU6IChlID8gdCA6IGkpIHx8IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgTyA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiB3KCksCiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlckJveFNpemU6IHcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEJveFNpemU6IHcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFJlY3Q6IG5ldyB1KDAsIDAsIDAsIDApCiAgICAgICAgICAgICAgICAgICAgfSksIHggPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBpICYmIChpID0gITEpLCBiLmhhcyh0KSAmJiAhaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5zZXQodCwgTyksIE87CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZ2V0Q29tcHV0ZWRTdHlsZSh0KSwgcyA9IGwodCkgJiYgdC5vd25lclNWR0VsZW1lbnQgJiYgdC5nZXRCQm94KCksIG4gPSAhZyAmJiAnYm9yZGVyLWJveCcgPT09IGUuYm94U2l6aW5nLCByID0gbS50ZXN0KGUud3JpdGluZ01vZGUgfHwgJycpLCBoID0gIXMgJiYgdi50ZXN0KGUub3ZlcmZsb3dZIHx8ICcnKSwgYSA9ICFzICYmIHYudGVzdChlLm92ZXJmbG93WCB8fCAnJyksIG8gPSBzID8gMCA6IHkoZS5wYWRkaW5nVG9wKSwgYyA9IHMgPyAwIDogeShlLnBhZGRpbmdSaWdodCksIGYgPSBzID8gMCA6IHkoZS5wYWRkaW5nQm90dG9tKSwgcCA9IHMgPyAwIDogeShlLnBhZGRpbmdMZWZ0KSwgeCA9IHMgPyAwIDogeShlLmJvcmRlclRvcFdpZHRoKSwgUyA9IHMgPyAwIDogeShlLmJvcmRlclJpZ2h0V2lkdGgpLCBqID0gcyA/IDAgOiB5KGUuYm9yZGVyQm90dG9tV2lkdGgpLCBrID0gcCArIGMsIF8gPSBvICsgZiwgQSA9IChzID8gMCA6IHkoZS5ib3JkZXJMZWZ0V2lkdGgpKSArIFMsIEkgPSB4ICsgaiwgQyA9IGEgPyB0Lm9mZnNldEhlaWdodCAtIEkgLSB0LmNsaWVudEhlaWdodCA6IDAsIFQgPSBoID8gdC5vZmZzZXRXaWR0aCAtIEEgLSB0LmNsaWVudFdpZHRoIDogMCwgUCA9IG4gPyBrICsgQSA6IDAsIE0gPSBuID8gXyArIEkgOiAwLCBFID0gcyA/IHMud2lkdGggOiB5KGUud2lkdGgpIC0gUCAtIFQsIEwgPSBzID8gcy5oZWlnaHQgOiB5KGUuaGVpZ2h0KSAtIE0gLSBDLCBSID0gRSArIGsgKyBUICsgQSwgQiA9IEwgKyBfICsgQyArIEksIEQgPSBPYmplY3QuZnJlZXplKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VQaXhlbENvbnRlbnRCb3hTaXplOiB3KE1hdGgucm91bmQoRSAqIGRldmljZVBpeGVsUmF0aW8pLCBNYXRoLnJvdW5kKEwgKiBkZXZpY2VQaXhlbFJhdGlvKSwgciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyQm94U2l6ZTogdyhSLCBCLCByKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Qm94U2l6ZTogdyhFLCBMLCByKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVjdDogbmV3IHUocCwgbywgRSwgTCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5zZXQodCwgRCksIEQ7CiAgICAgICAgICAgICAgICAgICAgfSwgUyA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geCh0LCBlKSwgciA9IG4uYm9yZGVyQm94U2l6ZSwgaCA9IG4uY29udGVudEJveFNpemUsIGEgPSBuLmRldmljZVBpeGVsQ29udGVudEJveFNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuREVWSUNFX1BJWEVMX0NPTlRFTlRfQk9YOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5CT1JERVJfQk9YOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGogPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB4KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0LCB0aGlzLmNvbnRlbnRSZWN0ID0gaS5jb250ZW50UmVjdCwgdGhpcy5ib3JkZXJCb3hTaXplID0gW2kuYm9yZGVyQm94U2l6ZV0sIHRoaXMuY29udGVudEJveFNpemUgPSBbaS5jb250ZW50Qm94U2l6ZV0sIHRoaXMuZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZSA9IFtpLmRldmljZVBpeGVsQ29udGVudEJveFNpemVdOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKSwgayA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgLyAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgZSA9IHQucGFyZW50Tm9kZTsgZTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDEsIGUgPSBlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgIH0sIF8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMSAvIDAsIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gZS5hY3RpdmVUYXJnZXRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hY3RpdmVUYXJnZXRzLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgaihpLnRhcmdldCksIG4gPSBrKGkudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wdXNoKGUpLCBpLmxhc3RSZXBvcnRlZFNpemUgPSBTKGkudGFyZ2V0LCBpLm9ic2VydmVkQm94KSwgbiA8IHQgJiYgKHQgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jYWxsYmFjay5jYWxsKGUub2JzZXJ2ZXIsIHMsIGUub2JzZXJ2ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlLmFjdGl2ZVRhcmdldHMuc3BsaWNlKDAsIGUuYWN0aXZlVGFyZ2V0cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIHMgPSBpOyBlIDwgcy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHNbZV0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgQSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZm9yRWFjaChmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hY3RpdmVUYXJnZXRzLnNwbGljZSgwLCBpLmFjdGl2ZVRhcmdldHMubGVuZ3RoKSwgaS5za2lwcGVkVGFyZ2V0cy5zcGxpY2UoMCwgaS5za2lwcGVkVGFyZ2V0cy5sZW5ndGgpLCBpLm9ic2VydmF0aW9uVGFyZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pc0FjdGl2ZSgpICYmIChrKGUudGFyZ2V0KSA+IHQgPyBpLmFjdGl2ZVRhcmdldHMucHVzaChlKSA6IGkuc2tpcHBlZFRhcmdldHMucHVzaChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgSSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEEoaSk7IGEuc29tZShmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGl2ZVRhcmdldHMubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBfKCksIEEoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnNvbWUoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNraXBwZWRUYXJnZXRzLmxlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmICgnZnVuY3Rpb24nID09IHR5cGVvZiBFcnJvckV2ZW50ID8gdCA9IG5ldyBFcnJvckV2ZW50KCdlcnJvcicsIHsgbWVzc2FnZTogbyB9KSA6ICgodCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpKS5pbml0RXZlbnQoJ2Vycm9yJywgITEsICExKSwgdC5tZXNzYWdlID0gbyksIHdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpKSwgaSA+IDA7CiAgICAgICAgICAgICAgICAgICAgfSwgQyA9IFtdLCBUID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMuc3BsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm9ic2VydmUoZSwgeyBjaGFyYWN0ZXJEYXRhOiAhMCB9KSwgYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRleHRDb250ZW50ID0gJycgKyAoaSA/IGktLSA6IGkrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIEMucHVzaCh0KSwgYygpOwogICAgICAgICAgICAgICAgICAgIH0sIFAgPSAwLCBNID0gewogICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSwgRSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdsb2FkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zaXRpb25lbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAnYW5pbWF0aW9uZW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2FuaW1hdGlvbnN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2FuaW1hdGlvbml0ZXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXlkb3duJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vdXNldXAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW91c2Vkb3duJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vdXNlb3ZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb3VzZW91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdibHVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvY3VzJwogICAgICAgICAgICAgICAgICAgIF0sIEwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSB0ICYmICh0ID0gMCksIERhdGUubm93KCkgKyB0OwogICAgICAgICAgICAgICAgICAgIH0sIFIgPSAhMSwgQiA9IG5ldyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gITAsIHRoaXMubGlzdGVuZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2NoZWR1bGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSB0ICYmICh0ID0gMjUwKSwgIVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHMgPSBMKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFIgPSAhMSwgdCA9IHMgLSBMKCksICFQKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBpLnJ1bigxMDAwKSA6IHQgPiAwID8gaS5ydW4odCkgOiBpLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpLCB0aGlzLnJ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5vYnNlcnZlciAmJiB0Lm9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkgPyBpKCkgOiBwLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BwZWQgJiYgKHRoaXMuc3RvcHBlZCA9ICExLCB0aGlzLm9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5saXN0ZW5lciksIHRoaXMub2JzZXJ2ZSgpLCBFLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcC5hZGRFdmVudExpc3RlbmVyKGksIHQubGlzdGVuZXIsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcHBlZCB8fCAodGhpcy5vYnNlcnZlciAmJiB0aGlzLm9ic2VydmVyLmRpc2Nvbm5lY3QoKSwgRS5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLCB0Lmxpc3RlbmVyLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdG9wcGVkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKSkoKSwgRCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICFQICYmIHQgPiAwICYmIEIuc3RhcnQoKSwgIShQICs9IHQpICYmIEIuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIH0sIEYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0LCB0aGlzLm9ic2VydmVkQm94ID0gaSB8fCBzLkNPTlRFTlRfQk9YLCB0aGlzLmxhc3RSZXBvcnRlZFNpemUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lU2l6ZTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1NpemU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGkgPSBTKHRoaXMudGFyZ2V0LCB0aGlzLm9ic2VydmVkQm94LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHRoaXMudGFyZ2V0LCBsKHQpIHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJTlBVVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaW1hZ2UnICE9PSB0LnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdWSURFTyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQVVESU8nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0VNQkVEJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPQkpFQ1QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NBTlZBUyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSUZSQU1FJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJTUcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgfHwgJ2lubGluZScgIT09IGdldENvbXB1dGVkU3R5bGUodCkuZGlzcGxheSB8fCAodGhpcy5sYXN0UmVwb3J0ZWRTaXplID0gaSksIHRoaXMubGFzdFJlcG9ydGVkU2l6ZS5pbmxpbmVTaXplICE9PSBpLmlubGluZVNpemUgfHwgdGhpcy5sYXN0UmVwb3J0ZWRTaXplLmJsb2NrU2l6ZSAhPT0gaS5ibG9ja1NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBWID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFyZ2V0cyA9IFtdLCB0aGlzLnNraXBwZWRUYXJnZXRzID0gW10sIHRoaXMub2JzZXJ2YXRpb25UYXJnZXRzID0gW10sIHRoaXMub2JzZXJ2ZXIgPSB0LCB0aGlzLmNhbGxiYWNrID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCksIFUgPSBuZXcgV2Vha01hcCgpLCAkID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSArPSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbZV0udGFyZ2V0ID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgfSwgTiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jb25uZWN0ID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFYodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLnNldCh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5vYnNlcnZlID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gVS5nZXQodCksIG4gPSAwID09PSBzLm9ic2VydmF0aW9uVGFyZ2V0cy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHMub2JzZXJ2YXRpb25UYXJnZXRzLCBpKSA8IDAgJiYgKG4gJiYgYS5wdXNoKHMpLCBzLm9ic2VydmF0aW9uVGFyZ2V0cy5wdXNoKG5ldyBGKGksIGUgJiYgZS5ib3gpKSwgRCgxKSwgQi5zY2hlZHVsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC51bm9ic2VydmUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBVLmdldCh0KSwgcyA9ICQoZS5vYnNlcnZhdGlvblRhcmdldHMsIGkpLCBuID0gMSA9PT0gZS5vYnNlcnZhdGlvblRhcmdldHMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA+PSAwICYmIChuICYmIGEuc3BsaWNlKGEuaW5kZXhPZihlKSwgMSksIGUub2JzZXJ2YXRpb25UYXJnZXRzLnNwbGljZShzLCAxKSwgRCgtMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmRpc2Nvbm5lY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBlID0gVS5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm9ic2VydmF0aW9uVGFyZ2V0cy5zbGljZSgpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS51bm9ic2VydmUodCwgZS50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuYWN0aXZlVGFyZ2V0cy5zcGxpY2UoMCwgZS5hY3RpdmVUYXJnZXRzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBIID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBhcmd1bWVudHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBjb25zdHJ1Y3QgXCdSZXNpemVPYnNlcnZlclwnOiAxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gY29uc3RydWN0IFwnUmVzaXplT2JzZXJ2ZXJcJzogVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgTi5jb25uZWN0KHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5vYnNlcnZlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBhcmd1bWVudHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwnb2JzZXJ2ZVwnIG9uIFwnUmVzaXplT2JzZXJ2ZXJcJzogMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwnb2JzZXJ2ZVwnIG9uIFwnUmVzaXplT2JzZXJ2ZXJcJzogcGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgXCdFbGVtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLm9ic2VydmUodGhpcywgdCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnVub2JzZXJ2ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gYXJndW1lbnRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gZXhlY3V0ZSBcJ3Vub2JzZXJ2ZVwnIG9uIFwnUmVzaXplT2JzZXJ2ZXJcJzogMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ZhaWxlZCB0byBleGVjdXRlIFwndW5vYnNlcnZlXCcgb24gXCdSZXNpemVPYnNlcnZlclwnOiBwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSBcJ0VsZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4udW5vYnNlcnZlKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTi5kaXNjb25uZWN0KHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbiBSZXNpemVPYnNlcnZlciAoKSB7IFtwb2x5ZmlsbCBjb2RlXSB9JzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNsYXNzIHEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wciA9IFtdLCB0aGlzLmJyID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZyKHQudGFyZ2V0KS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChPYmplY3QoaC5pKSh0LmVsZW1lbnQpLCB0LmNhbGxiYWNrKHQuZWxlbWVudCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5SZXNpemVPYnNlcnZlciB8fCBIOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tciA9IG5ldyBpKHRoaXMuYnIpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Jlc2l6ZU9ic2VydmVyX2NvbnN0cnVjdG9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IHIuUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3IodCwgaSkgfHwgKHRoaXMucHIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMubXIub2JzZXJ2ZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9mZih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmdyKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXIudW5vYnNlcnZlKGUuZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnByLmluZGV4T2YoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHMgPj0gMCAmJiB0aGlzLnByLnNwbGljZShzLCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdGhpcy5wci5sZW5ndGggPiAwOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1yLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdnIodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wci5maWx0ZXIoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5lbGVtZW50ID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wci5maW5kKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZWxlbWVudCA9PT0gdCAmJiBlLmNhbGxiYWNrID09PSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoMik7CiAgICAgICAgICAgICAgICBjbGFzcyByIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueXIgPSBbXSwgdGhpcy53ciA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ci5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLk9yID0gdC5zdWJzY3JpYmUodGhpcy53cik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjYWNoZWRFdmVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnlyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlyID0gbnVsbCwgdGhpcy5PcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQWRvYmVBbmFseXRpY3MgPSAnQWRvYmVBbmFseXRpY3MnLCB0Lk1vYXRBbmFseXRpY3MgPSAnTW9hdEFuYWx5dGljcyc7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpOwogICAgICAgICAgICAgICAgdmFyIGggPSBlKDEpLCBhID0gZSg1KSwgbyA9IGUoMCksIGMgPSBlKDYpLCB1ID0gZSgzMSksIGwgPSBlKDgpLCBkID0gZSgxOSksIGYgPSBlKDIxKSwgcCA9IGUoMTQpOwogICAgICAgICAgICAgICAgZS5kKGksICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjbGFzcyBiIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueHIgPSBpLCB0aGlzLlNyID0gZSwgdGhpcy5qciA9IHMsIHRoaXMua3IgPSBuLCB0aGlzLl9yID0gW10sIHRoaXMuQXIgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Jcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5fci5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5uYW1lID09PSB0LnR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgIWkuc3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnN0YXJ0ZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkuZXZlbnRzQ2FjaGVIYW5kbGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdC5jYWNoZWRFdmVudHMsIHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZUFuYWx5dGljc1NldHRpbmdzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9hdEFuYWx5dGljc1NldHRpbmdzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RlYnVnTG9nZ2luZzogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5qci5hcGlDb25maWcuc2V0dGluZ3MucGx1Z2lucywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kTGV2ZWxEb21haW46IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJJZDogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5qciwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEV2ZW50czogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlQW5hbHl0aWNzU2V0dGluZ3M6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2F0QW5hbHl0aWNzU2V0dGluZ3M6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGVidWdMb2dnaW5nOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kTGV2ZWxEb21haW46IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJJZDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lOiB0aGlzLkNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5XZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGYuYS52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGVIYW5kbGVyczogdGhpcy5TciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckNvbnRhaW5lcjogdGhpcy5rciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcldpbmRvdzogd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRJbnN0YW5jZSgpLnN0YXJ0KHRoaXMueHIsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IG8uUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUGx1Z2luc0hhbmRsZXJfaW5pdFBsdWdpbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IE9iamVjdChsLmYpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlID0gci50b3BGcmFtZSwgdGhpcy5XZSA9IE9iamVjdChsLmUpKHIsIHRoaXMuZmUpLCB0aGlzLldlID0gT2JqZWN0KGQuZCkodGhpcy5XZSksIHRoaXMuQ3IgPSBPYmplY3QoZC5hKSh0aGlzLldlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVHIoKSwgdGhpcy5QcigpLCB0aGlzLmZlLmNueFBsdWdpbnMucGx1Z2luc0hhbmRsZXJzLnB1c2godGhpcy5Bcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRyKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuZmUuY254UGx1Z2lucykgJiYgdGhpcy5mZS5jbnhQbHVnaW5zLmxlbmd0aCA+IDAgJiYgKHQgPSB0aGlzLmZlLmNueFBsdWdpbnMpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Bcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChoLmYpKHRoaXMuZmUuY254UGx1Z2lucykgfHwgdGhpcy5Ncih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChjLmgpKHQpICYmIHRoaXMuTHIodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuZmUuY254UGx1Z2lucy5jYWNoZWRQbHVnaW5zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KGMuaCkoaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnR5cGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJyKHQudHlwZSkgfHwgdGhpcy5mZS5jbnhQbHVnaW5zLmNhY2hlZFBsdWdpbnMucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLmNueFBsdWdpbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQbHVnaW5zOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luc0hhbmRsZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2g6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zSGFuZGxlcnMuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTHIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJyKHQpIHx8IHRoaXMuX3IucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHNDYWNoZUhhbmRsZXI6IG5ldyByKHRoaXMueHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3IuZm9yRWFjaCgoe25hbWU6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Ccih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIERyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdCh1LmEpKHQpLmV2ZXJ5KHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChoLmgpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanIuYXBpQ29uZmlnLnNldHRpbmdzLnBsdWdpbnMuYWRvYmVBbmFseXRpY3NTZXR0aW5ncyAmJiB0aGlzLkRyKHRoaXMuanIuYXBpQ29uZmlnLnNldHRpbmdzLnBsdWdpbnMuYWRvYmVBbmFseXRpY3NTZXR0aW5ncykgJiYgdC5wdXNoKHMuQWRvYmVBbmFseXRpY3MpLCB0aGlzLmpyLm1vYXRUcmFja2luZ0VuYWJsZWQgJiYgdC5wdXNoKHMuTW9hdEFuYWx5dGljcyksIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEJyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBgY254LSR7IHQgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuQWRvYmVBbmFseXRpY3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNyYyA9IHAuYS5lbmRQb2ludHMuYXNzZXRzLnBsdWdpbnMuYWRvYmVBbmFseXRpY3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLk1vYXRBbmFseXRpY3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNyYyA9IHAuYS5lbmRQb2ludHMuYXNzZXRzLnBsdWdpbnMubW9hdEFuYWx5dGljczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkuaWQpIHx8IE9iamVjdChuLngpKGksIHRoaXMuZmUuZG9jdW1lbnQuaGVhZCwgdGhpcy5mZSwgbnVsbCwgbnVsbCwgITAsICdQbHVnaW5zSGFuZGxlcl91bmFibGVfdG9faW5zZXJ0X3BsdWdpbl9zY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiwgciA9IGUoMjUpLCBoID0gZSgxMiksIGEgPSBlKDQzKTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuTWluaW1pemVkID0gJ21pbmltaXplZCcsIHQuQ29sbGFwc2VkID0gJ2NvbGxhcHNlZCcsIHQuTm9ybWFsID0gJ25vcm1hbCcsIHQuRXhwYW5kZWQgPSAnZXhwYW5kZWQnLCB0LkZ1bGxzY3JlZW4gPSAnZnVsbHNjcmVlbic7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuU3RhdGVDaGFuZ2VkID0gJ3N0YXRlQ2hhbmdlZCc7CiAgICAgICAgICAgICAgICB9KG4gfHwgKG4gPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgbyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZVN0YXRlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuRnIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVnIgJiYgdGhpcy5Wci5uYW1lID09PSBpIHx8IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBuLlN0YXRlQ2hhbmdlZCwgeyBwYXlsb2FkOiB7IHN0YXRlOiBpIH0gfSksIHRoaXMuVnIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlVyIHx8IGkgIT09IHMuTm9ybWFsIHx8ICh0aGlzLlVyID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5WcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRQbGF5ZXJTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVnIgJiYgdGhpcy5Wci5uYW1lID09PSB0IHx8IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBuLlN0YXRlQ2hhbmdlZCwgeyBwYXlsb2FkOiB7IHN0YXRlOiB0IH0gfSksIHRoaXMuVnIgPSB7IG5hbWU6IHQgfSwgdGhpcy5VciB8fCB0ICE9PSBzLk5vcm1hbCB8fCAodGhpcy5VciA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuVnIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVnIgJiYgdGhpcy5Wci5uYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5VcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLk5vcm1hbDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuVXIuZGltZW5zaW9ucywgbiA9IGkgKiBlLCByID0gdC53aWR0aCAqIHQuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCEwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbiA8IHI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5FeHBhbmRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuID4gcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLkNvbGxhcHNlZDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLk5vcm1hbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjID0gZSgyMCksIHUgPSBlKDUpLCBsID0gZSgwKTsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xhc3MgZCBleHRlbmRzIGMuYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLiRyID0gdCwgdGhpcy54ciA9IGksIHRoaXMuTnIgPSBuZXcgbyh0aGlzKSwgdGhpcy5IciA9ICExLCB0aGlzLnFyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZEVycm9yXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5QbGF5RXJyb3JdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLlJlbmRlckVycm9yXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZEltcHJlc3Npb25dOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSnIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLkFkQ29tcGxldGVdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLkFkVmlkZW9TdGFydF06ICh7YWRWaWRlb1N0YXJ0TWV0YWRhdGE6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWHIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZFZpZGVvRmlyc3RRdWFydGlsZV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ZcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuQWRWaWRlb01pZHBvaW50XTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLktyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZFZpZGVvVGhpcmRRdWFydGlsZV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5acigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuQWRWaWRlb0NvbXBsZXRlXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5Wb2x1bWVDaGFuZ2VdOiAoe3ZvbHVtZTogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5paCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLkFkUGF1c2VdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLkFkUGxheV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuQWRTa2lwcGVkXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5oKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZENsaWNrVGhydV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuQWRJbnRlcmFjdGlvbl06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuQWRMb2FkZWRdOiAoe2FkTG9hZGVkTWV0YWRhdGE6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWgodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guYS5BZFN0YXRlQ2hhbmdlXTogKHthZFN0YXRlQ2hhbmdlZE1ldGFkYXRhOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9oKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuUGxheWVyUmVzaXplZF06ICh7cGxheWVyRGltZW5zaW9uc01ldGFkYXRhOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuT25FbnRlckZ1bGxzY3JlZW5dOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLlBsYXllckNvbGxhcHNlZF06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLmEuUGxheWVyRXhwYW5kZWRdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5hLkRlc3Ryb3ldOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5zdWJzY3JpYmVBbGwodGhpcy5Ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucGggPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMucXJbdC5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHQubWV0YWRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCh1LmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Nlc3Npb25DbGllbnRXcmFwcGVyX29tc2RrX19vbkV2ZW50U3RvcmFnZUV2ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5jYWxsU3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkU2Vzc2lvbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRFdmVudHM6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRXZlbnRzOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuJHIsIHIgPSB0aGlzLmJoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aCA9IG5ldyB0KHIpLCB0aGlzLm1oID0gbmV3IGkodGhpcy52aCksIHRoaXMuZ2ggPSBuZXcgcyh0aGlzLnZoKSwgdGhpcy54ci5zdWJzY3JpYmUodGhpcy5waCksIHRoaXMuc3Vic2NyaWJlKG4uU3RhdGVDaGFuZ2VkLCB0aGlzLk5yLCAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtzdGF0ZTogdH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnloKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMud2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHUuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdTZXNzaW9uQ2xpZW50V3JhcHBlcl9vbXNka19jbGFzc2VzX2luaXRfZXJyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuY2FsbFN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6cigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aC5lcnJvcihyLmQuVmlkZW8sIGguYS5BZEVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmguZXJyb3Ioci5kLlZpZGVvLCBoLmEuUGxheUVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmguZXJyb3Ioci5kLkdlbmVyaWMsIGguYS5SZW5kZXJFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydG5lcjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQ6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuJHI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShuZXcgaShyLmksIHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSnIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHIgPSAhMCwgdGhpcy5taC5pbXByZXNzaW9uT2NjdXJyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuTnIuY3VycmVudFN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICB0ICE9PSBzLk5vcm1hbCAmJiB0aGlzLnloKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBRcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IciA9ICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFQbGF5ZXJWb2x1bWU6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2guc3RhcnQoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFlyKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdoLmZpcnN0UXVhcnRpbGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2gubWlkcG9pbnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWnIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2gudGhpcmRRdWFydGlsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5naC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpaCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHIgJiYgdGhpcy5naC52b2x1bWVDaGFuZ2UodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdoLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdoLnJlc3VtZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5naC5za2lwcGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdoLmFkVXNlckludGVyYWN0aW9uKHIuZy5DbGljayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdoLmFkVXNlckludGVyYWN0aW9uKHIuZy5JbnZpdGF0aW9uQWNjZXB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWgodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTa2lwcGFibGU6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcE9mZnNldDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F1dG9QbGF5OiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdCwge1Zhc3RQcm9wZXJ0aWVzOiBufSA9IHRoaXMuJHIsIHIgPSBuZXcgbihpLCBlLCBzLCB0aGlzLk9oKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taC5sb2FkZWQocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9oKHtzdGF0ZTogdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PaCA9IHIuaFthLmFbdF1dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5aCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdGhpcy5naC5wbGF5ZXJTdGF0ZUNoYW5nZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeGgodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5yLmNvbXB1dGVTdGF0ZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU2godCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5yLnNldFBsYXllclN0YXRlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1aCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueGgodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNoKHMuRnVsbHNjcmVlbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNoKHMuTWluaW1pemVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2gocy5Ob3JtYWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aC5yZWdpc3RlclNlc3Npb25PYnNlcnZlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHlwZSA9PT0gci5iLlNlc3Npb25TdGFydCA/IHRoaXMuamgodCkgOiB0LnR5cGUgPT09IHIuYi5TZXNzaW9uRXJyb3IgJiYgT2JqZWN0KHUuYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdTZXNzaW9uQ2xpZW50V3JhcHBlcl9vbXNka19zZXNzaW9uX2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEpTT04uc3RyaW5naWZ5KHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBsLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGpoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5kYXRhLmNyZWF0aXZlVHlwZSA9PT0gci5jLkRlZmluZWRCeUphdmFzY3JpcHQgJiYgdGhpcy52aC5zZXRDcmVhdGl2ZVR5cGUoci5jLlZpZGVvKSwgdC5kYXRhLmltcHJlc3Npb25UeXBlID09PSByLmYuRGVmaW5lZEJ5SmF2YXNjcmlwdCAmJiB0aGlzLnZoLnNldEltcHJlc3Npb25UeXBlKHIuZi5CZWdpblRvUmVuZGVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiwgciwgaCwgYSA9IGUoNCksIG8gPSBlKDEwKTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5YID0gMF0gPSAnWCcsIHRbdC5ZID0gMV0gPSAnWSc7CiAgICAgICAgICAgICAgICB9KHMgfHwgKHMgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQ2xpY2sgPSAnY2xpY2snLCB0LkludGVyYWN0aW9uU3RhcnQgPSAnaW50ZXJhY3Rpb25zdGFydCcsIHQuSW50ZXJhY3Rpb24gPSAnaW50ZXJhY3Rpb24nLCB0LkludGVyYWN0aW9uRW5kID0gJ2ludGVyYWN0aW9uZW5kJzsKICAgICAgICAgICAgICAgIH0obiB8fCAobiA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlN3aXBlID0gMF0gPSAnU3dpcGUnLCB0W3QuSG9sZCA9IDFdID0gJ0hvbGQnOwogICAgICAgICAgICAgICAgfShyIHx8IChyID0ge30pKSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuTGVmdCA9IDBdID0gJ0xlZnQnLCB0W3QuUmlnaHQgPSAxXSA9ICdSaWdodCc7CiAgICAgICAgICAgICAgICB9KGggfHwgKGggPSB7fSkpOwogICAgICAgICAgICAgICAgdmFyIGMgPSBlKDYpLCB1ID0gZSgyKTsKICAgICAgICAgICAgICAgIGNvbnN0IGwgPSB7CiAgICAgICAgICAgICAgICAgICAgTUFJTjogMCwKICAgICAgICAgICAgICAgICAgICBBVVhJTElBUlk6IDEsCiAgICAgICAgICAgICAgICAgICAgU0VDT05EQVJZOiAyLAogICAgICAgICAgICAgICAgICAgIEZPVVJUSDogMywKICAgICAgICAgICAgICAgICAgICBGSUZUSDogNAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmJ1dHRvbiA9PT0gbC5NQUlOOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGYgPSBlKDE1KSwgcCA9IGUoMSk7CiAgICAgICAgICAgICAgICBlLmQoaSwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IGIgPSAyNSwgdiA9IDI1MCwgbSA9IDMwOwogICAgICAgICAgICAgICAgY2xhc3MgZyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtoID0gdCwgdGhpcy5RbiA9IGksIHRoaXMubWVkaWF0b3IgPSBudWxsLCB0aGlzLl9oID0gbSwgdGhpcy5BaCA9IHYsIHRoaXMuSWggPSBiLCB0aGlzLkNoID0gW10sIHRoaXMuVGggPSB7fSwgdGhpcy5QaCA9IDAsIHRoaXMuTWggPSAwLCB0aGlzLkVoID0gITAsIHRoaXMuTGggPSBudWxsLCB0aGlzLlJoID0gITEsIHRoaXMuQmggPSAhMSwgdGhpcy5EaCA9ICExLCB0aGlzLkZoID0gITEsIHRoaXMuVmggPSAwLCB0aGlzLlVoID0gMCwgdGhpcy4kaCA9IG51bGwsIHRoaXMuTmggPSBudWxsLCB0aGlzLkhoID0gbnVsbCwgdGhpcy5xaCA9ICEwLCB0aGlzLnpoID0gITEsIHRoaXMuV2ggPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUW4gPyAodC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLkdoLCB7IHBhc3NpdmU6ICEwIH0pLCB0LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5KaCwgeyBwYXNzaXZlOiAhMCB9KSwgdC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5RaCksIHQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuWGgpLCB0LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuWWgpKSA6ICh0LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5LaCksIHQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ZaCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlpoID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFuID8gKHQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5HaCksIHQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLkpoKSwgdC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5RaCksIHQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuWGgpLCB0LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuWWgpKSA6ICh0LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5LaCksIHQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5ZaCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkdoID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhoID0gaSwgdGhpcy5CaCA9ICExLCB0aGlzLmlhKGksIHIuSG9sZCkgJiYgdGhpcy5lYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLnNhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NaCA9IGUuZXZlbnRYLCB0aGlzLlBoID0gZS5ldmVudFksIHRoaXMubmEodCwgaSwgbi5JbnRlcmFjdGlvblN0YXJ0KSwgdGhpcy5FaCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkpoID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCksIGUgPSB0aGlzLnNhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRWggJiYgKE1hdGguYWJzKGUuZGVsdGFYRnJvbVN0YXJ0KSA+IHRoaXMuSWggfHwgTWF0aC5hYnMoZS5kZWx0YVlGcm9tU3RhcnQpID4gdGhpcy5JaCkgJiYgKHRoaXMuRWggPSAhMSksIHRoaXMuUmggfHwgdGhpcy5pYShpLCByLlN3aXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSB0aGlzLiRoICYmIHRoaXMucmEoaSwgZSksIHRoaXMuJGggPT09IHMuWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IHRoaXMuTmggJiYgKHRoaXMuTmggPSBPYmplY3QodS5NKSh0aGlzLmtoLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTmggPSBudWxsLCB0aGlzLmhhKGUuZGVsdGFYRnJvbVN0YXJ0KSwgaS5tZWRpYXRvci5wdWJsaXNoKGkuY29udGV4dCwgby5hW28uYS5Td2lwZU1vdmVdLCB7IHBheWxvYWQ6IGUuZGVsdGFYRnJvbVN0YXJ0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5RaCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy56aCA9ICExLCB0aGlzLkhoID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuc2EodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYW5jZWxhYmxlICYmIHRoaXMuaWEoaSwgci5Ib2xkKSAmJiBNYXRoLmFicyhlLmRlbHRhWEZyb21TdGFydCkgPCB0aGlzLkloICYmIE1hdGguYWJzKGUuZGVsdGFZRnJvbVN0YXJ0KSA8IHRoaXMuSWggJiYgdC5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLmFhKHQsIGksIGUpLCB0aGlzLm9hKGUpID09PSBzLlkgJiYgTWF0aC5hYnMoZS5kZWx0YVlGcm9tU3RhcnQpID49IHRoaXMuSWggPyB0aGlzLnFoICYmIGkubWVkaWF0b3IucHVibGlzaChpLmNvbnRleHQsIG8uYVtvLmEuU2Nyb2xsXSkgOiAhdGhpcy5FaCB8fCB0aGlzLkRoIHx8IHRoaXMuQmggfHwgKHRoaXMuemggPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhoID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5YaCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFhKHQsIGkpLCB0aGlzLkhoID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5LaCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuY2Eobi5JbnRlcmFjdGlvblN0YXJ0LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnRhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IaCA9IGksIHQuc3RvcFByb3BhZ2F0aW9uKCksIHQucHJldmVudERlZmF1bHQoKSwgdGhpcy5pYShpLCByLkhvbGQpICYmIHRoaXMuZWEodCksIHRoaXMubmEodCwgaSwgbi5JbnRlcmFjdGlvblN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ZaCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56aCA/IChpLm1lZGlhdG9yLnB1Ymxpc2goaS5jb250ZXh0LCBvLmFbby5hLkNsaWNrXSksIHZvaWQgKHRoaXMuemggPSAhMSkpIDogZCh0KSAmJiB0aGlzLkhoID8gKHQuc3RvcFByb3BhZ2F0aW9uKCksIHQucHJldmVudERlZmF1bHQoKSwgdGhpcy5uYSh0LCB0aGlzLkhoLCBuLkludGVyYWN0aW9uKSwgdGhpcy5uYSh0LCB0aGlzLkhoLCBuLkludGVyYWN0aW9uRW5kKSwgKHRoaXMuUmggfHwgdGhpcy5pYShpLCByLkhvbGQpKSAmJiB0aGlzLnVhKHQpLCB0aGlzLkhoID09PSBpICYmICh0aGlzLm5hKHQsIGksIG4uQ2xpY2spLCBpLm1lZGlhdG9yLnB1Ymxpc2goaS5jb250ZXh0LCBvLmFbby5hLkNsaWNrXSkpLCB2b2lkICh0aGlzLkhoID0gbnVsbCkpIDogKHRoaXMuY2Eobi5JbnRlcmFjdGlvbiwgdCksIHZvaWQgdGhpcy5jYShuLkludGVyYWN0aW9uRW5kLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubGEgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYShuLkludGVyYWN0aW9uLCB0KSwgdm9pZCB0aGlzLmNhKG4uSW50ZXJhY3Rpb25FbmQsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IaCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGEgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCh0KSB8fCAhdGhpcy5IaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jYShuLkludGVyYWN0aW9uLCB0KSwgdm9pZCB0aGlzLmNhKG4uSW50ZXJhY3Rpb25FbmQsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYSh0LCB0aGlzLkhoLCBuLkludGVyYWN0aW9uKSwgdGhpcy5uYSh0LCB0aGlzLkhoLCBuLkludGVyYWN0aW9uRW5kKSwgKHRoaXMuUmggfHwgdGhpcy5pYSh0aGlzLkhoLCByLkhvbGQpKSAmJiB0aGlzLnVhKHQpLCB0aGlzLkhoID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFRhcFNpemVUaHJlc2hvbGQ6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkVHJpZ2dlckR1cmF0aW9uOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVGhyZXNob2xkOiBjCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSBPYmplY3QuYXNzaWduKHt9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faCA9IGggfHwgdGhpcy5faCwgdGhpcy5BaCA9IGEgfHwgdGhpcy5BaCwgdGhpcy5JaCA9IGMgfHwgdGhpcy5JaCwgdGhpcy5raC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLmxhKSwgdGhpcy5raC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5kYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKHQsIGksIGUsIHMgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgbiA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWF0b3I6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBzIHx8IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZFNwZWNpYWxJbnRlcmFjdGlvbnM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFNwZWNpYWxJbnRlcmFjdGlvbnM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ2gucHVzaChyKSwgdGhpcy5XaChyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkNoLmZpbmQoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5lbGVtZW50ID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAodGhpcy5DaCA9IHRoaXMuQ2guZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuWmgoaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyQWxsKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuQ2guZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubWVkaWF0b3IgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBpLmZvckVhY2godGhpcy5aaCksIHRoaXMuQ2ggPSBPYmplY3QoYy5hKSh0aGlzLkNoLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmFsQWN0aW9ucyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIGkpKS5mb3JFYWNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UaFtlXSA9IHRoaXMuVGhbZV0gfHwgW10sIHRoaXMuVGhbZV0ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhdG9yOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogaVtlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZW1vdmVHbG9iYWxBY3Rpb25zKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5UaCkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVGhbaV0uc29tZShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pbml0aWF0b3IgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJiAodGhpcy5UaFtpXSA9IHRoaXMuVGhbaV0uZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmluaXRpYXRvciAhPT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGVTcGVjaWFsSW50ZXJhY3Rpb25zKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuZmEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuZGlzYWJsZWRTcGVjaWFsSW50ZXJhY3Rpb25zID0gT2JqZWN0KGMubikoaS5hbGxvd2VkU3BlY2lhbEludGVyYWN0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZVNwZWNpYWxJbnRlcmFjdGlvbnModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZhKHQpLmRpc2FibGVkU3BlY2lhbEludGVyYWN0aW9ucyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXROb25JbnRlcnJ1cHRpYmxlSW50ZXJhY3Rpb25zKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5hLkhvbGRTdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYS5Ib2xkRW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5hLlN3aXBlTW92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYS5Td2lwZUVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYS5TY3JvbGwKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVNjcm9sbEV2ZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFoID0gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZVNjcm9sbEV2ZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFoID0gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLkxoKSwgdGhpcy5DaC5mb3JFYWNoKHRoaXMuWmgpLCB0aGlzLmtoLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubGEpLCB0aGlzLmtoLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmRhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy50YSh0KSwgZSA9IGkuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgcyA9IHRoaXMuYmEodCksIG4gPSBlLndpZHRoLCByID0gT2JqZWN0KGYuZSkoMCwgbiwgMCwgMTAwLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YShpLCB0aGlzLl9oLCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmEodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlIDwgaSA/IHQubWVkaWF0b3IucHVibGlzaCh0LmNvbnRleHQsIG8uYVtvLmEuVGFwTGVmdF0pIDogdC5tZWRpYXRvci5wdWJsaXNoKHQuY29udGV4dCwgby5hW28uYS5UYXBSaWdodF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLkxoKSwgdGhpcy5SaCA9ICExLCB0aGlzLkRoID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnRhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QodS5hKShpLmVsZW1lbnQsIGEuaC5PbkhvbGQpLCB0aGlzLkxoID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJoID0gITAsIHRoaXMuRWggJiYgKHRoaXMuRGggPSAhMCwgaS5tZWRpYXRvci5wdWJsaXNoKGkuY29udGV4dCwgby5hW28uYS5Ib2xkU3RhcnRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQWgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1YSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLkxoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCh1LkkpKGkuZWxlbWVudCwgYS5oLk9uSG9sZCksIHRoaXMuUmggPyAodGhpcy5SaCA9ICExLCB0aGlzLkRoICYmICh0aGlzLkRoID0gITEsIGkubWVkaWF0b3IucHVibGlzaChpLmNvbnRleHQsIG8uYVtvLmEuSG9sZEVuZF0pKSkgOiAodGhpcy5CaCA9ICEwLCB0aGlzLnBhKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWEodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCB0aGlzLnNhKHQpLCB0LnN0b3BQcm9wYWdhdGlvbigpLCB0aGlzLm5hKHQsIGksIG4uSW50ZXJhY3Rpb24pLCB0aGlzLm5hKHQsIGksIG4uSW50ZXJhY3Rpb25FbmQpLCAodGhpcy5SaCB8fCB0aGlzLkZoIHx8IHRoaXMuRWggJiYgdGhpcy5pYShpLCByLkhvbGQpKSAmJiB0aGlzLnVhKHQpLCAodGhpcy5GaCB8fCB0aGlzLmlhKGksIHIuU3dpcGUpKSAmJiB0aGlzLm1hKGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByYSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGggPSB0aGlzLm9hKGkpLCB0aGlzLiRoID09PSBzLlggJiYgKHRoaXMuRmggPSAhMCwgdGhpcy5SaCB8fCAoY2xlYXJUaW1lb3V0KHRoaXMuTGgpLCB0aGlzLkxoID0gbnVsbCwgdGhpcy5SaCA9ICEwLCB0Lm1lZGlhdG9yLnB1Ymxpc2godC5jb250ZXh0LCBvLmFbby5hLkhvbGRTdGFydF0pKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1hKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRmgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmdhKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tZWRpYXRvci5wdWJsaXNoKHQuY29udGV4dCwgby5hW28uYS5Td2lwZUVuZF0sIHsgcGF5bG9hZDogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QodS5lKSh0aGlzLmtoLCB0aGlzLk5oKSwgdGhpcy5OaCA9IG51bGwsIHRoaXMuRmggPSAhMSwgdGhpcy5NaCA9IG51bGwsIHRoaXMuUGggPSBudWxsLCB0aGlzLiRoID0gbnVsbCwgdGhpcy5WaCA9IDAsIHRoaXMuVWggPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVWggPCB0aGlzLkloID8gdGhpcy5VaCsrIDogKHRoaXMuVmggPSB0LCB0aGlzLlVoID0gMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9hKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHQuZGVsdGFYRnJvbVN0YXJ0KSA+PSBNYXRoLmFicyh0LmRlbHRhWUZyb21TdGFydCkgPyBzLlggOiBzLlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVsdGFYRnJvbVN0YXJ0IC0gdGhpcy5WaCA8IDAgPyBoLkxlZnQgOiBoLlJpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFYRnJvbVN0YXJ0OiBpLmNsaWVudFggLSB0aGlzLk1oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFZRnJvbVN0YXJ0OiBpLmNsaWVudFkgLSB0aGlzLlBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRYOiBpLmNsaWVudFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFk6IGkuY2xpZW50WQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0YSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkhoIHx8IHRoaXMuZmEodC5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmEodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DaC5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMudGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYIC0gaS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQub2Zmc2V0WDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWEodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hbGxvd2VkU3BlY2lhbEludGVyYWN0aW9ucy5pbmNsdWRlcyhpKSAmJiAhdC5kaXNhYmxlZFNwZWNpYWxJbnRlcmFjdGlvbnMuaW5jbHVkZXMoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5hKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGkuY2FsbGJhY2tzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocC5iKShzKSAmJiBzKHQpLCB0aGlzLmNhKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSAoZSA9IHRoaXMuVGhbdF0pIHx8IHZvaWQgMCA9PT0gZSB8fCBlLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFjdGlvbihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMgPSBlKDIzKSwgbiA9IGUoMCksIHIgPSBlKDIxKSwgaCA9IGUoMTQpLCBhID0gZSgxMSk7CiAgICAgICAgICAgICAgICBjbGFzcyBvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55YSA9IG51bGwsIHRoaXMud2EgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IHRoaXMueWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YSA9IHQgLSB0aGlzLnlhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydENvdW50aW5nVGltZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55YSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQ291bnRpbmdUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9hKCksIHRoaXMueWEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZXRjaFRpbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9hKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLnJvdW5kKHRoaXMud2EgLyBhLmYpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YSA9IDAsIG51bGwgIT09IHRoaXMueWEgJiYgdGhpcy5zdGFydENvdW50aW5nVGltZSgpLCBpID4gdCA/IHQgOiBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjID0gZSgyMCksIHUgPSBlKDEpLCBsID0gZSgzNCksIGQgPSBlKDMyKSwgZiA9IGUoOCksIHAgPSBlKDYpLCBiID0gZSgzMCk7CiAgICAgICAgICAgICAgICBlKDQyKTsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgdiA9IDUwMDsKICAgICAgICAgICAgICAgIGNsYXNzIG0gZXh0ZW5kcyBjLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJJZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2VvTG9jYXRpb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXI6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogaCwKICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlSWQ6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHhhOiBjLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VyTWFuYWdlclNlcnZpY2U6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtMTogZCwKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUGFyYW0yOiBiLAogICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21QYXJhbTM6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVBhcmFtNDogbSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tUGFyYW01OiBnLAogICAgICAgICAgICAgICAgICAgICAgICBhYlRlc3RJZDogeSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwbG9yYXRpb25Nb2RlOiB3CiAgICAgICAgICAgICAgICAgICAgfSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLmhhc0dkcHJDb25zZW50UGF5bG9hZCA9ICExLCB0aGlzLlNhID0ge30sIHRoaXMuamEgPSB7fSwgdGhpcy5rYSA9ICExLCB0aGlzLl9hID0gITEsIHRoaXMuQWEgPSAhMSwgdGhpcy5JYSA9ICExLCB0aGlzLkNhID0gW10sIHRoaXMuVGEgPSBbXSwgdGhpcy5QYSA9IFtdLCB0aGlzLk1hID0gNTAwMCwgdGhpcy5FYSA9ICExLCB0aGlzLnhhID0gITEsIHRoaXMuTGEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNSZXBlYXREZWxheTogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlcGVhdERlbGF5OiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlcGVhdERlbGF5OiAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlcGVhdERlbGF5OiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlcGVhdERlbGF5OiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAxMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNSZXBlYXREZWxheTogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheTogMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzUmVwZWF0RGVsYXk6IDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXk6IDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlcGVhdERlbGF5OiAxMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZGVsYXk6IDE4MDAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLlJhID0gMCwgdGhpcy5CYSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocC5nKShpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDcyODZiM2QtOTBjNS00NjM0LWFjODctMDA2MTc2OWQxNWE4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyYTljNjAwNy02MjEzLTQxODctOWIwZC0xYTZlOWQ3ODI2ZjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhYzZlMmZjLTQ3MmEtNDZlNi04YTZiLWI1YmVhNTdhNTBiYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTEyY2RiODgtOTFlYS00NTJkLTk5MGMtMDNhN2QzMTE4ZDJjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwNzUxMjdmYS1mZWM5LTRlZTctOWE0Yy1iZmI0NDc4YTQ0MTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzJmZWJkYTYzLTZlYzktNDk1MS05YzA3LTU5MzkzNzZiODIyNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNTVjYTdhZDctZjMxMS00ODU0LWIyOWEtYTJkNTkwNzYwNDkzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2MmJiYmNkYS0wMjRlLTQ3NjktOTY4YS1kYjg0ODMwZjY1Y2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzY0OGQ4ZDRkLWZhNDEtNDk2Yy04NDE1LTI2ZjNhZDJkMTk4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNmZkZmZiZjUtYjg5OS00NGFjLTk2YTYtNGVhYjUwNDk3YjViJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiNjA5NGZmNi01NGEwLTRkZGQtYjc5OS02NjE5M2Y4MzQ2YzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2M4MWJiMWY4LWRlODAtNDI4Yi1hZTQyLTFjZTBlNzVkMzk5OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGRiYWRiMmMtOWU3OC00NDJhLWI3NTctYTQ5MTEzYTc5MWVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyMGQ3MWIxMi00MWNlLTQ1ZGItODEzNS0xYTNjZDExMWIyNWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEzZTRlZTY1LTZiZWQtNDBlNi04ZTQxLTRlZjkwODdjMjk0YicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjJkNzZkMTMtY2QzMi00MDIxLWEyNDMtOThiMjQ0NGNkMTRkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiMWM3ODEwMy00YmI3LTQ3YWMtOWNmZS1kY2Q5YjYwM2U4YTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzc3YTdlZjU2LWM2MDgtNDU2ZC04ZmY5LWEzODJkMTM5ZmY5NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNWQ4ZWVlYTctNGVlMC00YWQ3LTkwMjMtOTdmYmM4ZDk3ZmE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZDM3OTA5NS01ZjQ2LTRjMWMtOTE3ZC1hZDA2M2Q4NGVhZjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzA1MjdlYTJiLWNiNjAtNDA4ZS04NWMxLWU1MDBiZWUxMjhjMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTQ4YTAxOTMtNTVkNi00N2ExLThhMzMtMmM0YmE5Yzk3YjVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyNzkzN2YxMy1mMDA4LTQ1N2ItOTM4Yy04N2M5ZmU0NDdkZTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzRjMmI2MjQzLTU3MTUtNDY1MS1hMjdlLWY2MDUyYjYxYWY4MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTBlZmFlNjItYWYxNy00ZDQ3LWE2NWUtYmFhYmMyYjYwNDk2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2NWQ3Y2ZiNC03MGE1LTQ4MGEtOTVhNy0yNWE3MTNkNjE2OTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzZlM2VmNmExLTJjY2YtNDhiMy05NzNjLTU1MjQ0NDg3ZGMzOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTM0MjZlMDAtMjExYi00YzcwLTk4MWUtZDcxYTYyMjU0M2NmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3MjhiMDIwZC1hYTMyLTQwMDktYWQwZC05YzFiNmI1N2IzYzknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzc3ZTZiZjBkLWJlZmUtNDM2NC05Zjk1LWRmMzdkNDc4ZjI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTllMTRiZmQtZDVlZi00ZjgyLThjOWQtZWExOTUxMmQwNzkzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4YzE3NWMxMC0yMDJhLTQyNzUtOWUxMC01YWI5YjIxNmE2MWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzk0MjkzMTVjLWE2NDQtNGZiZi05MzhmLTMwY2QyM2YyYjA5OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYTFiZjkxZjgtOThjYi00NjQyLWEyZWMtMjEyNDc4MmJmMjczJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICczMDI1NzQxZS1jNjQ1LTQ2ZWUtOTNkYi1jNmIxYzVjZGI4NDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MzMmYxZmIxLTY4ZDctNDFjYy05YTMzLTVmNTQxZDViMGNmZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYzkyZWJjZDQtYjRjMS00NDllLTgwOWEtNjc0NGEwY2QyMWQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkMGFkODM2MC0yODRkLTQ3ZDMtODYxZC02YmU1YjA5NjE5ZTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzliM2IwY2U2LWNhZTUtNDNlMC1iNjY5LTAyM2M3NmU5MTI3ZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmJiNmFiNDQtM2I0Ny00NGQ4LTk5MGMtNjQyZGU0YmIxMmJhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZWI5NzE3OS0zNDg2LTRjYTgtOTY4Yy1jMThmNDllM2JlNGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZmYzEzYzZhLTZkNmItNDhkYy05OTY1LWQ1YTVhZGZlYTBmMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYThlYzQwNDQtNTBjNy00NmIxLThlOGEtNGRhOThmZjk1YWVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZTJlMzZkMC04ZTY2LTQ0MzMtYmIzYy00N2U3OGFkNmYyNTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzA3OWI3ZTljLTZkOGYtNDc3Mi1iNWQ3LTU3OWM2ZjVmODczYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDRmODg0YWYtNDdlYy00NzU0LWE5MTMtYjM4ODIzZjcwMWE1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyZTdiMTUwMS04NDBhLTQ2ZjAtYTNhZS0wMTUwMDhiNjY2ZDgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzJlYTBiM2JhLTY2YzktNDZmNC1hNGEzLTMwMGYxYmIzNmE5MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnM2UxZmNmMjQtMGU3YS00YWViLTlkY2UtYTk4ZDU1MmRkN2M3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1MTU2YTQ0Yy1hM2Q5LTQwYWQtYTU5Mi1iNmZmYjgwMTliMmEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzZiNTVkMjYxLTYzYzctNDM0OS04MDRmLTNkOWJiZDdhYWM4NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOGQ5NWEzYTUtZmZhMC00OTMyLTgyMDgtZTA2YThmNjU5YjU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhNDlkOGRiYi1iOTFmLTQxYTMtYjVhOC04YTViMDUzYWY3NzYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E1ODU1MjRhLTI3ODQtNGIyZC05MjRiLWQ4NzI5OTRjYjdhOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjI1Zjk2ZDYtNmQ1OC00ODNiLTg4NTYtZGRmZmQ2MWJhYzQwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZDVlZmM2Mi1kYjEzLTQwZjItYTc2ZS1kZjliOTBhMjY4N2InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzA4YjQ2NDUxLTE4NDktNDMzYy05MDE5LTg1YjJhZWNhODdkMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmI1YWQzYjQtOGZjZC00Y2I4LWFmNzAtMzgzODM5ZGIzNzEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlNjhjNzM3Ni1lNmM3LTQ0ZmYtYWQ2NS03NzU2OTEzNzJmMTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Y1YTM5MjBiLTE1ZmMtNGI1Mi04NTg2LTE2MDkxYjliZWRkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMGM4MzYwM2EtNWQwYy00YjYyLWE2MTMtNWYyZGIzNjUxMGQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwZjNjNzA1Ni0wNWQ0LTQ2ZmUtODI0Yy0zMmRmNDgxMTUzNjknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJzgxMzI5ODI2LWExZjMtNGYwYi04NmUxLTJjMWZiNThjYWM4NScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYTdiNGVhYWQtOGRlYS00MWQ1LThiZDAtYzhmMTNjZDg0Mjk2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjMTI4Mjc4MS1mNzVhLTQ2YjctYjc3NC01Njk1ZTBhNzRjM2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Q0NzgxOWFlLWJlMTgtNDA1NC04ZmZkLWRjODZlYjZmZGI1YScKICAgICAgICAgICAgICAgICAgICAgICAgXSkgPyB0aGlzLlNhLnRyYWNrQWxsUmVxdWVzdHMgPSAhMCA6IHRoaXMuU2EudHJhY2tBbGxSZXF1ZXN0cyA9IDEgPT09IE9iamVjdChmLmspKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICBdKSwgdGhpcy5EYSA9IHUsIHRoaXMuU2EudXNlcklkID0gdCwgdGhpcy5TYS5wbGF5ZXJJZCA9IGksIHRoaXMuU2EuZ2VvID0gZSwgdGhpcy5TYS5icm93c2VyID0gcywgdGhpcy5TYS52ZXJzaW9uID0gci5hLnZlcnNpb24sIHRoaXMuU2Euc2Vzc2lvbklkID0gbiwgdGhpcy5TYS5jbGllbnRBYjAgPSBsLmEuY2xpZW50QWIwLCB0aGlzLlNhLmNsaWVudEFiMSA9IGwuYS5jbGllbnRBYjEsIHRoaXMuU2Euc2VydmVyQWIwID0gbC5hLnNlcnZlckFiMCwgdGhpcy5TYS5zZXJ2ZXJBYjEgPSBsLmEuc2VydmVyQWIxLCB0aGlzLlNhLnBhZ2VVcmwgPSBoLCB0aGlzLlNhLmJ1bmRsZUlkID0gYSwgdGhpcy5TYS5jdXN0b21QYXJhbTEgPSBkLCB0aGlzLlNhLmN1c3RvbVBhcmFtMiA9IGIsIHRoaXMuU2EuY3VzdG9tUGFyYW0zID0gdiwgdGhpcy5TYS5jdXN0b21QYXJhbTQgPSBtLCB0aGlzLlNhLmN1c3RvbVBhcmFtNSA9IGcsIHRoaXMuU2EuYWJUZXN0SWQgPSB5LCB0aGlzLkZhID0gbmV3IG8oKSwgdGhpcy5WYSA9IG5ldyBvKCksIHRoaXMuVWEgPSB3OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYSh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uUHJvdG9UcmFja2luZ1JlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgZSwgciA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlNhLnBhZ2VJbkZvY3VzID0gYi5hLnBhZ2VGb2N1cywgcy5hLnNlbmRQcm90b0JlYWNvblJlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0RGF0YTogT2JqZWN0LmFzc2lnbih7IHRyYWNraW5nUmVxdWVzdE1ldGE6IHIgPyB0aGlzLlNhIDogdm9pZCAwIH0sIGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOYSh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uUHJvdG9UcmFja2luZ1JlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgZSwgaCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU2EucGFnZUluRm9jdXMgPSBiLmEucGFnZUZvY3VzOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gcy5hLnNlbmRQcm90b1JlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1Jlc3BvbnNlOiBuLlByb3RvVHJhY2tpbmdSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhOiBPYmplY3QuYXNzaWduKHsgdHJhY2tpbmdSZXF1ZXN0TWV0YTogaCA/IHRoaXMuU2EgOiB2b2lkIDAgfSwgZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBbZC5iXTogci5hLnZlcnNpb24gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcjogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtSWRMaXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHAuaCkoaSkgJiYgdGhpcy5CYS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0UGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25SZXZlbnVlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2VydmVyTGluZUl0ZW1OYW1lOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCh1LmUpKGUpICYmIE9iamVjdCh1LmgpKHMpICYmIHRoaXMuSGEgJiYgdGhpcy5IYS5ub3RpZnlJbXByZXNzaW9uUmV2ZW51ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblJldmVudWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTZXJ2ZXJMaW5lSXRlbU5hbWU6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZFBsYXRmb3JtQ2FwcGVkTGluZUl0ZW1TdWJzY3JpYmVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CYS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZW1vdmVQbGF0Zm9ybUNhcHBlZExpbmVJdGVtU3Vic2NyaWJlcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkJhLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPj0gMCAmJiB0aGlzLkJhLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SW1wcmVzc2lvblJldmVudWVTdWJzY3JpYmVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IYSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlVG9JbXByZXNzaW9uUmV2ZW51ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSGEgIT09IHQgJiYgKHRoaXMuSGEgPSB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxYSh0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uUHJvdG9NZWRpYVRyYWNraW5nUmVxdWVzdDsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBPYmplY3QuYXNzaWduKHt9LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHUuaCkodGhpcy5qYS5tZWRpYUlkKSAmJiAocy5tZWRpYUd1aWQgPSB0aGlzLmphLm1lZGlhSWQpLCB0aGlzLk5hKHQsIGUsIHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6YSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FYSB8fCAodGhpcy5FYSA9ICEwLCB0aGlzLk5hKGguYS5lbmRQb2ludHMudHJhY2tpbmcucGxheWVyU3RhcnQsIG4uUHJvdG9UcmFja2luZ1JlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV2EodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLlByb3RvTWVkaWFUcmFja2luZ1JlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5OYSh0LCBlLCBPYmplY3QuYXNzaWduKHsgbWVkaWFHdWlkOiB0aGlzLmphLm1lZGlhSWQgfSwgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBHYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucWEoaC5hLmVuZFBvaW50cy50cmFja2luZy5tZWRpYV9xdWFydGlsZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZU1ldGE6IHRoaXMuamEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLmphLm1lZGlhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGlsZTogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSmEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUWEodGhpcy5UYSwgdGhpcy5DYSwgdGhpcy5QYSksIHRoaXMuVGEgPSBbXSwgdGhpcy5DYSA9IFtdLCB0aGlzLlBhID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFhKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHQubGVuZ3RoICYmIDAgPT09IGkubGVuZ3RoICYmIDAgPT09IGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmVycm9yICYmIHQuZXJyb3IubGVuZ3RoID4gMCAmJiAodC5lcnJvciA9IHQuZXJyb3Iuc3Vic3RyaW5nKDAsIHYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUd1aWQ6IHRoaXMuamEubWVkaWFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZHM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEJpZHM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFdmVyeXRpbmc6IHRoaXMueGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNHZHByQ29uc2VudFBheWxvYWQ6IHRoaXMuaGFzR2RwckNvbnNlbnRQYXlsb2FkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwckNvbnNlbnRNb2RlOiB0aGlzLkRhLmdkcHJDb25zZW50TW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4cGxvcmF0aW9uOiB0aGlzLlVhCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTmEoaC5hLmVuZFBvaW50cy50cmFja2luZy5iaWRzLCBuLlByb3RvQmlkVHJhY2tpbmdzUmVxdWVzdCwgcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmFkX2NsaWNrLCBuLlByb3RvQWRDbGlja1RyYWNraW5nUmVxdWVzdCwgT2JqZWN0LmFzc2lnbih7IG1lZGlhR3VpZDogdGhpcy5qYS5tZWRpYUlkIH0sIHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWWEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRhKGguYS5lbmRQb2ludHMudHJhY2tpbmcuaGVhdnlfYWRfaW50ZXJ2ZW50aW9uLCBuLlByb3RvSGVhdnlBZFRyYWNraW5nUmVxdWVzdCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEthKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5MYVt0aGlzLlJhXTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuWmEpLCB0aGlzLlphID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvKHQuZGVsYXkpLCBPYmplY3QodS5lKSh0LnRpbWVzUmVwZWF0RGVsYXkpICYmIHQudGltZXNSZXBlYXREZWxheS0tLCAwID09PSB0LnRpbWVzUmVwZWF0RGVsYXkgJiYgdGhpcy5SYSsrLCB0aGlzLkthKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDAgKiB0LmRlbGF5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG8odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5hKGguYS5lbmRQb2ludHMudHJhY2tpbmcuc2Vzc2lvbl90aW1lLCBuLlByb3RvU2Vzc2lvblRpbWVUcmFja2luZ1JlcXVlc3QsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nUmVxdWVzdE1ldGE6IHRoaXMuU2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uVGltZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVQbGF5ZWQ6IHRoaXMuRmEuZmV0Y2hUaW1lKHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVBsYXllZEluVmlldzogdGhpcy5WYS5mZXRjaFRpbWUodCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldE5ld01lZGlhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qYSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1lZGlhTWV0YWRhdGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmphID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SW1wbGVtZW50YXRpb25UeXBlT25NZXRhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TYS5pbXBsZW1lbnRhdGlvblR5cGUgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRNZWRpYVN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdhKG4uUHJvdG9RdWFydGlsZXNFbnVtLlN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnphKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFNlc3Npb25QbGF5YmFjayh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQWEgIT09IHQgJiYgKHRoaXMuQWEgPSB0LCB0aGlzLklhICYmIHRoaXMuQWEgJiYgdGhpcy5WYS5zdGFydENvdW50aW5nVGltZSgpLCB0aGlzLkFhID8gdGhpcy5GYS5zdGFydENvdW50aW5nVGltZSgpIDogKHRoaXMuRmEuc3RvcENvdW50aW5nVGltZSgpLCB0aGlzLlZhLnN0b3BDb3VudGluZ1RpbWUoKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uVmlld2FiaWxpdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklhICE9PSB0ICYmICh0aGlzLklhID0gdCwgdGhpcy5JYSAmJiB0aGlzLkFhID8gdGhpcy5WYS5zdGFydENvdW50aW5nVGltZSgpIDogdGhpcy5JYSB8fCB0aGlzLlZhLnN0b3BDb3VudGluZ1RpbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrU2Vzc2lvblJlbmRlcmVkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMua2EpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTmEoaC5hLmVuZFBvaW50cy50cmFja2luZy5zZXNzaW9uX3JlbmRlcmVkLCBuLlByb3RvVHJhY2tpbmdSZXF1ZXN0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBZEJsb2NrZXI6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVOYW1lOiAncGxheWVyLmRjLmpzJwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5rYSA9ICEwLCB0aGlzLkthKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrU2Vzc2lvblZpZXdhYmlsaXR5KCkgewogICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5fYSAmJiB0aGlzLkVhICYmICh0aGlzLk5hKGguYS5lbmRQb2ludHMudHJhY2tpbmcuc2Vzc2lvbl92aWV3KSwgdGhpcy5fYSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tNZWRpYVF1YXJ0aWxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HYSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2tNZWRpYUNsaWNrKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bS5DbGljazsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tVcmw6IHQgPT09IG4uUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uVXJsQ2xpY2sgPyB0aGlzLmphLmNsaWNrVXJsIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVUaXRsZTogdGhpcy5qYS5zbGlkZVRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpZGVOdW1iZXI6IHRoaXMuamEuc2xpZGVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZU1lZGlhVHlwZTogdGhpcy5qYS5zbGlkZU1lZGlhVHlwZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFhKGguYS5lbmRQb2ludHMudHJhY2tpbmcubWVkaWFfY2xpY2ssIGksIG4uUHJvdG9NZWRpYUNsaWNrVHJhY2tpbmdSZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRTdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56YSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEJpZFJlcXVlc3RzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlvID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KYSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLk1hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkUHJlYmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UYS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRQb3N0QmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHUuZykodC5lcnJvcikgfHwgKHQuZXJyb3IgPSBKU09OLnN0cmluZ2lmeSh0LmVycm9yKSksIHRoaXMuUGEucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkQmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DYS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja0F1Y3Rpb25JbmZvRm9yQmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmF1Y3Rpb25JbmZvcm1hdGlvbiwgbi5Qcm90b0F1Y3Rpb25JbmZvUmVxdWVzdCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrVmlkZW9BZEltcHJlc3Npb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5XYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmFkX2ltcHJlc3Npb24sIHQsIG4uUHJvdG9WaWRlb0FkSW1wcmVzc2lvblJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja1ZpZGVvQWRJbXByZXNzaW9uVmlld2FibGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5XYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmFkX2ltcHJlc3Npb25fdmlld2FibGUsIHQsIG4uUHJvdG9WaWRlb0FkSW1wcmVzc2lvblZpZXdhYmxlUmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrVmlkZW9BZFF1YXJ0aWxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmFkX3F1YXJ0aWxlLCB0LCBuLlByb3RvVmlkZW9BZFF1YXJ0aWxlc1JlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja0FkQ2xpY2sodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhhKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFja0FkT3Bwb3J0dW5pdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7c2Vzc2lvbklkOiBpfSA9IHRoaXMuU2E7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2Vzc2lvbklkID0gaSwgdGhpcy5OYShoLmEuZW5kUG9pbnRzLnRyYWNraW5nLmFkT3Bwb3J0dW5pdHksIG4uUHJvdG9BZE9wcG9ydHVuaXR5UmVxdWVzdCwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrU2Vzc2lvbkFkQmxvY2tlcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTmEoaC5hLmVuZFBvaW50cy50cmFja2luZy5zZXNzaW9uQWRCbG9ja2VyLCBuLlByb3RvU2Vzc2lvbkFkQmxvY2tlclJlcXVlc3QsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nUmVxdWVzdE1ldGE6IHRoaXMuU2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJsb2NrRGV0ZWN0aW9uVHlwZTogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFNb2RlbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2E7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1ldGFkYXRhTW9kZWwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNhID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLlNhKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNrSGVhdnlBZEludGVydmVudGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWWEodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5aYSksIGNsZWFySW50ZXJ2YWwodGhpcy5pbyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSBlKDEpLCByID0gZSgwKTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5EZXNrdG9wID0gMl0gPSAnRGVza3RvcCcsIHRbdC5TbWFydFRWID0gM10gPSAnU21hcnRUVicsIHRbdC5TbWFydHBob25lID0gNF0gPSAnU21hcnRwaG9uZScsIHRbdC5UYWJsZXQgPSA1XSA9ICdUYWJsZXQnLCB0W3QuR2FtZUNvbnNvbGUgPSA2XSA9ICdHYW1lQ29uc29sZScsIHRbdC5VbnJlY29nbml6ZWQgPSA3XSA9ICdVbnJlY29nbml6ZWQnOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtyLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXTogcy5EZXNrdG9wLAogICAgICAgICAgICAgICAgICAgICAgICBbci5Qcm90b0RldmljZVR5cGUuU21hcnRwaG9uZV06IHMuU21hcnRwaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgW3IuUHJvdG9EZXZpY2VUeXBlLlRhYmxldF06IHMuVGFibGV0LAogICAgICAgICAgICAgICAgICAgICAgICBbci5Qcm90b0RldmljZVR5cGUuR2FtZUNvbnNvbGVdOiBzLkdhbWVDb25zb2xlLAogICAgICAgICAgICAgICAgICAgICAgICBbci5Qcm90b0RldmljZVR5cGUuU21hcnRUVl06IHMuU21hcnRUViwKICAgICAgICAgICAgICAgICAgICAgICAgW3IuUHJvdG9EZXZpY2VUeXBlLldlYXJhYmxlQ29tcHV0ZXJdOiBzLlVucmVjb2duaXplZCwKICAgICAgICAgICAgICAgICAgICAgICAgW3IuUHJvdG9EZXZpY2VUeXBlLlBEQV06IHMuVW5yZWNvZ25pemVkLAogICAgICAgICAgICAgICAgICAgICAgICBbci5Qcm90b0RldmljZVR5cGUuVW5yZWNvZ25pemVkXTogcy5VbnJlY29nbml6ZWQKICAgICAgICAgICAgICAgICAgICB9LCBhID0gJ2h0dHBzOi8vcy5zcnZzeW5kLmNvbS8yLzIzNDE3NS9hbmFseXRpY3MuanM/ZHQ9MjM0MTc1MTU5NzY3NTg2OTI1MDAxMiZkaT1bRE9NQUlOXSZ1aT1bRlNfVVNFUl9JRF0mbWQ9W0ZTX01FRElBX1RZUEVdJmFwPVtBUFBfQlVORExFXSZzcj1bQ05YX1NVUFBMSUVSX0lEXSZwcD1bUFVCTElTSEVSX0lEXSZ0aT1bU0VTU0lPTl9JRF0mZGU9W0ZTX0RFVklDRV9UWVBFXSZ0bz1bTUdUT10mcHY9W01HSURdJywgbyA9ICdjbnhfZnJhdWRfc2Vuc29yJywgYyA9ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnLCB1ID0gMjsKICAgICAgICAgICAgICAgIGUuZChpLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2xhc3MgbCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVvID0gdCwgdGhpcy5zbyA9IGksIHRoaXMubG4gPSBlLCB0aGlzLm5vKHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRGcmF1ZFNlbnNvclNjcmlwdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc28uZ2V0RWxlbWVudEJ5SWQobykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogdGhpcy5lby5zZXR1cE1hY3JvcyhhKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvLmluc2VydFNjcmlwdCh0LCBudWxsLCAnRnJhdWRTZW5zb3Jfc2NyaXB0X2Vycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5vKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE9iamVjdChuLmgpKHQpID8gdCA6IGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBJZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXNwb25zZUNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQWRzVHh0OiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5sbiwgciA9IGhbdGhpcy5sbi5kZXZpY2VUeXBlXTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lby5zZXRQdWJsaXNoZXJJZChzKSwgdGhpcy5lby5zZXRVc2VySWQodCksIHRoaXMuZW8uc2V0RnJhdWRTZW5zb3JNYWNyb3MoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwSWQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBSZXNwb25zZUNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiB1CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMgPSBpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICBzLnV0aWwuS2koKSwgcy5Xcml0ZXIuS2kocy5CdWZmZXJXcml0ZXIpLCBzLlJlYWRlci5LaShzLkJ1ZmZlclJlYWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzLmJ1aWxkID0gJ21pbmltYWwnLCBzLldyaXRlciA9IGUoNjEpLCBzLkJ1ZmZlcldyaXRlciA9IGUoMTI5KSwgcy5SZWFkZXIgPSBlKDYzKSwgcy5CdWZmZXJSZWFkZXIgPSBlKDEzMCksIHMudXRpbCA9IGUoMzkpLCBzLnJwYyA9IGUoMTMxKSwgcy5yb290cyA9IGUoMTMzKSwgcy5jb25maWd1cmUgPSBuLCBuKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKSwgcyA9IDAsIG4gPSAyLCByID0gITA7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IG4gPCBhcmd1bWVudHMubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgZVtzKytdID0gYXJndW1lbnRzW24rK107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChuLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVbc10gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPSAhMSwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSksIGUgPSAwOyBlIDwgaS5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gYXJndW1lbnRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFwcGx5KG51bGwsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoaSB8fCBudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAociA9ICExLCBoKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gaTsKICAgICAgICAgICAgICAgIHMubGVuZ3RoID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IC0taSAlIDQgPiAxICYmICc9JyA9PT0gdC5jaGFyQXQoaSk7KQogICAgICAgICAgICAgICAgICAgICAgICArK2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbCgzICogdC5sZW5ndGgpIC8gNCAtIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IG5ldyBBcnJheSg2NCksIHIgPSBuZXcgQXJyYXkoMTIzKSwgaCA9IDA7IGggPCA2NDspCiAgICAgICAgICAgICAgICAgICAgcltuW2hdID0gaCA8IDI2ID8gaCArIDY1IDogaCA8IDUyID8gaCArIDcxIDogaCA8IDYyID8gaCAtIDQgOiBoIC0gNTkgfCA0M10gPSBoKys7CiAgICAgICAgICAgICAgICBzLmVuY29kZSA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcywgciA9IG51bGwsIGggPSBbXSwgYSA9IDAsIG8gPSAwOyBpIDwgZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB0W2krK107CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoW2ErK10gPSBuW2MgPj4gMl0sIHMgPSAoMyAmIGMpIDw8IDQsIG8gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhbYSsrXSA9IG5bcyB8IGMgPj4gNF0sIHMgPSAoMTUgJiBjKSA8PCAyLCBvID0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoW2ErK10gPSBuW3MgfCBjID4+IDZdLCBoW2ErK10gPSBuWzYzICYgY10sIG8gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPiA4MTkxICYmICgociB8fCAociA9IFtdKSkucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgaCkpLCBhID0gMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvICYmIChoW2ErK10gPSBuW3NdLCBoW2ErK10gPSA2MSwgMSA9PT0gbyAmJiAoaFthKytdID0gNjEpKSwgciA/IChhICYmIHIucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgaC5zbGljZSgwLCBhKSkpLCByLmpvaW4oJycpKSA6IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBoLnNsaWNlKDAsIGEpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBzLmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcywgbiA9IGUsIGggPSAwLCBhID0gMDsgYSA8IHQubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQuY2hhckNvZGVBdChhKyspOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoNjEgPT09IG8gJiYgaCA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gKG8gPSByW29dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdpbnZhbGlkIGVuY29kaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gbywgaCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gcyA8PCAyIHwgKDQ4ICYgbykgPj4gNCwgcyA9IG8sIGggPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZSsrXSA9ICgxNSAmIHMpIDw8IDQgfCAoNjAgJiBvKSA+PiAyLCBzID0gbywgaCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gKDMgJiBzKSA8PCA2IHwgbywgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT09IGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdpbnZhbGlkIGVuY29kaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLSBuOwogICAgICAgICAgICAgICAgfSwgcy50ZXN0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gL14oPzpbQS1aYS16MC05Ky9dezR9KSooPzpbQS1aYS16MC05Ky9dezJ9PT18W0EtWmEtejAtOSsvXXszfT0pPyQvLnRlc3QodCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJvID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBzLCBzLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJvW3RdIHx8ICh0aGlzLnJvW3RdID0gW10pKS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgZm46IGksCiAgICAgICAgICAgICAgICAgICAgICAgIGN0eDogZSB8fCB0aGlzCiAgICAgICAgICAgICAgICAgICAgfSksIHRoaXM7CiAgICAgICAgICAgICAgICB9LCBzLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm8gPSB7fTsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2b2lkIDAgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm9bdF0gPSBbXTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB0aGlzLnJvW3RdLCBzID0gMDsgcyA8IGUubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbc10uZm4gPT09IGkgPyBlLnNwbGljZShzLCAxKSA6ICsrczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0sIHMucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5yb1t0XTsKICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gW10sIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goYXJndW1lbnRzW3MrK10pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgPSAwOyBzIDwgaS5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtzXS5mbi5hcHBseShpW3MrK10uY3R4LCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBGbG9hdDMyQXJyYXkgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IEZsb2F0MzJBcnJheShbLTBdKSwgZSA9IG5ldyBVaW50OEFycmF5KGkuYnVmZmVyKSwgcyA9IDEyOCA9PT0gZVszXTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbih0LCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpWzBdID0gdCwgc1tuXSA9IGVbMF0sIHNbbiArIDFdID0gZVsxXSwgc1tuICsgMl0gPSBlWzJdLCBzW24gKyAzXSA9IGVbM107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcih0LCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpWzBdID0gdCwgc1tuXSA9IGVbM10sIHNbbiArIDFdID0gZVsyXSwgc1tuICsgMl0gPSBlWzFdLCBzW24gKyAzXSA9IGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXSA9IHRbc10sIGVbMV0gPSB0W3MgKyAxXSwgZVsyXSA9IHRbcyArIDJdLCBlWzNdID0gdFtzICsgM10sIGlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVszXSA9IHRbc10sIGVbMl0gPSB0W3MgKyAxXSwgZVsxXSA9IHRbcyArIDJdLCBlWzBdID0gdFtzICsgM10sIGlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdC53cml0ZUZsb2F0TEUgPSBzID8gbiA6IHIsIHQud3JpdGVGbG9hdEJFID0gcyA/IHIgOiBuLCB0LnJlYWRGbG9hdExFID0gcyA/IGggOiBhLCB0LnJlYWRGbG9hdEJFID0gcyA/IGEgOiBoOwogICAgICAgICAgICAgICAgICAgIH0oKSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkgPCAwID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiAoaSA9IC1pKSwgMCA9PT0gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KDEgLyBpID4gMCA/IDAgOiAyMTQ3NDgzNjQ4LCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzTmFOKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoMjE0MzI4OTM0NCwgZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID4gMy40MDI4MjM0NjYzODUyODg2ZSszOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KChuIDw8IDMxIHwgMjEzOTA5NTA0MCkgPj4+IDAsIGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA8IDEuMTc1NDk0MzUwODIyMjg3NWUtMzgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgobiA8PCAzMSB8IE1hdGgucm91bmQoaSAvIDEuNDAxMjk4NDY0MzI0ODE3ZS00NSkpID4+PiAwLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gTWF0aC5mbG9vcihNYXRoLmxvZyhpKSAvIE1hdGguTE4yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KChuIDw8IDMxIHwgciArIDEyNyA8PCAyMyB8IDgzODg2MDcgJiBNYXRoLnJvdW5kKGkgKiBNYXRoLnBvdygyLCAtcikgKiA4Mzg4NjA4KSkgPj4+IDAsIGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0KGksIGUpLCBuID0gMiAqIChzID4+IDMxKSArIDEsIHIgPSBzID4+PiAyMyAmIDI1NSwgaCA9IDgzODg2MDcgJiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NSA9PT0gciA/IGggPyBOYU4gOiBuICogKDEgLyAwKSA6IDAgPT09IHIgPyAxLjQwMTI5ODQ2NDMyNDgxN2UtNDUgKiBuICogaCA6IG4gKiBNYXRoLnBvdygyLCByIC0gMTUwKSAqIChoICsgODM4ODYwOCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdC53cml0ZUZsb2F0TEUgPSBpLmJpbmQobnVsbCwgbiksIHQud3JpdGVGbG9hdEJFID0gaS5iaW5kKG51bGwsIHIpLCB0LnJlYWRGbG9hdExFID0gZS5iaW5kKG51bGwsIGgpLCB0LnJlYWRGbG9hdEJFID0gZS5iaW5kKG51bGwsIGEpOwogICAgICAgICAgICAgICAgICAgIH0oKSwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIEZsb2F0NjRBcnJheSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgRmxvYXQ2NEFycmF5KFstMF0pLCBlID0gbmV3IFVpbnQ4QXJyYXkoaS5idWZmZXIpLCBzID0gMTI4ID09PSBlWzddOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKHQsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbMF0gPSB0LCBzW25dID0gZVswXSwgc1tuICsgMV0gPSBlWzFdLCBzW24gKyAyXSA9IGVbMl0sIHNbbiArIDNdID0gZVszXSwgc1tuICsgNF0gPSBlWzRdLCBzW24gKyA1XSA9IGVbNV0sIHNbbiArIDZdID0gZVs2XSwgc1tuICsgN10gPSBlWzddOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIodCwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaVswXSA9IHQsIHNbbl0gPSBlWzddLCBzW24gKyAxXSA9IGVbNl0sIHNbbiArIDJdID0gZVs1XSwgc1tuICsgM10gPSBlWzRdLCBzW24gKyA0XSA9IGVbM10sIHNbbiArIDVdID0gZVsyXSwgc1tuICsgNl0gPSBlWzFdLCBzW24gKyA3XSA9IGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXSA9IHRbc10sIGVbMV0gPSB0W3MgKyAxXSwgZVsyXSA9IHRbcyArIDJdLCBlWzNdID0gdFtzICsgM10sIGVbNF0gPSB0W3MgKyA0XSwgZVs1XSA9IHRbcyArIDVdLCBlWzZdID0gdFtzICsgNl0sIGVbN10gPSB0W3MgKyA3XSwgaVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKHQsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzddID0gdFtzXSwgZVs2XSA9IHRbcyArIDFdLCBlWzVdID0gdFtzICsgMl0sIGVbNF0gPSB0W3MgKyAzXSwgZVszXSA9IHRbcyArIDRdLCBlWzJdID0gdFtzICsgNV0sIGVbMV0gPSB0W3MgKyA2XSwgZVswXSA9IHRbcyArIDddLCBpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQud3JpdGVEb3VibGVMRSA9IHMgPyBuIDogciwgdC53cml0ZURvdWJsZUJFID0gcyA/IHIgOiBuLCB0LnJlYWREb3VibGVMRSA9IHMgPyBoIDogYSwgdC5yZWFkRG91YmxlQkUgPSBzID8gYSA6IGg7CiAgICAgICAgICAgICAgICAgICAgfSgpIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQsIGksIGUsIHMsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gcyA8IDAgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoICYmIChzID0gLXMpLCAwID09PSBzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoMCwgbiwgciArIGkpLCB0KDEgLyBzID4gMCA/IDAgOiAyMTQ3NDgzNjQ4LCBuLCByICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpc05hTihzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KDAsIG4sIHIgKyBpKSwgdCgyMTQ2OTU5MzYwLCBuLCByICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzID4gMS43OTc2OTMxMzQ4NjIzMTU3ZSszMDgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgwLCBuLCByICsgaSksIHQoKGggPDwgMzEgfCAyMTQ2NDM1MDcyKSA+Pj4gMCwgbiwgciArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgoYSA9IHMgLyA1ZS0zMjQpID4+PiAwLCBuLCByICsgaSksIHQoKGggPDwgMzEgfCBhIC8gNDI5NDk2NzI5NikgPj4+IDAsIG4sIHIgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBNYXRoLmZsb29yKE1hdGgubG9nKHMpIC8gTWF0aC5MTjIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0ID09PSBvICYmIChvID0gMTAyMyksIHQoNDUwMzU5OTYyNzM3MDQ5NiAqIChhID0gcyAqIE1hdGgucG93KDIsIC1vKSkgPj4+IDAsIG4sIHIgKyBpKSwgdCgoaCA8PCAzMSB8IG8gKyAxMDIzIDw8IDIwIHwgMTA0ODU3NiAqIGEgJiAxMDQ4NTc1KSA+Pj4gMCwgbiwgciArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdChzLCBuICsgaSksIGggPSB0KHMsIG4gKyBlKSwgYSA9IDIgKiAoaCA+PiAzMSkgKyAxLCBvID0gaCA+Pj4gMjAgJiAyMDQ3LCBjID0gNDI5NDk2NzI5NiAqICgxMDQ4NTc1ICYgaCkgKyByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIwNDcgPT09IG8gPyBjID8gTmFOIDogYSAqICgxIC8gMCkgOiAwID09PSBvID8gNWUtMzI0ICogYSAqIGMgOiBhICogTWF0aC5wb3coMiwgbyAtIDEwNzUpICogKGMgKyA0NTAzNTk5NjI3MzcwNDk2KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LndyaXRlRG91YmxlTEUgPSBpLmJpbmQobnVsbCwgbiwgMCwgNCksIHQud3JpdGVEb3VibGVCRSA9IGkuYmluZChudWxsLCByLCA0LCAwKSwgdC5yZWFkRG91YmxlTEUgPSBlLmJpbmQobnVsbCwgaCwgMCwgNCksIHQucmVhZERvdWJsZUJFID0gZS5iaW5kKG51bGwsIGEsIDQsIDApOwogICAgICAgICAgICAgICAgICAgIH0oKSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGlbZV0gPSAyNTUgJiB0LCBpW2UgKyAxXSA9IHQgPj4+IDggJiAyNTUsIGlbZSArIDJdID0gdCA+Pj4gMTYgJiAyNTUsIGlbZSArIDNdID0gdCA+Pj4gMjQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBpW2VdID0gdCA+Pj4gMjQsIGlbZSArIDFdID0gdCA+Pj4gMTYgJiAyNTUsIGlbZSArIDJdID0gdCA+Pj4gOCAmIDI1NSwgaVtlICsgM10gPSAyNTUgJiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0W2ldIHwgdFtpICsgMV0gPDwgOCB8IHRbaSArIDJdIDw8IDE2IHwgdFtpICsgM10gPDwgMjQpID4+PiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0W2ldIDw8IDI0IHwgdFtpICsgMV0gPDwgMTYgfCB0W2kgKyAyXSA8PCA4IHwgdFtpICsgM10pID4+PiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gcyhzKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHModCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZXZhbCgncXVpcmUnLnJlcGxhY2UoL14vLCAncmUnKSkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmIChpLmxlbmd0aCB8fCBPYmplY3Qua2V5cyhpKS5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGk7CiAgICAgICAgICAgICAgICBzLmxlbmd0aCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGUgPSAwLCBzID0gMDsgcyA8IHQubGVuZ3RoOyArK3MpCiAgICAgICAgICAgICAgICAgICAgICAgIChlID0gdC5jaGFyQ29kZUF0KHMpKSA8IDEyOCA/IGkgKz0gMSA6IGUgPCAyMDQ4ID8gaSArPSAyIDogNTUyOTYgPT0gKDY0NTEyICYgZSkgJiYgNTYzMjAgPT0gKDY0NTEyICYgdC5jaGFyQ29kZUF0KHMgKyAxKSkgPyAoKytzLCBpICs9IDQpIDogaSArPSAzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgfSwgcy5yZWFkID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAtIGkgPCAxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcywgbiA9IG51bGwsIHIgPSBbXSwgaCA9IDA7IGkgPCBlOykKICAgICAgICAgICAgICAgICAgICAgICAgKHMgPSB0W2krK10pIDwgMTI4ID8gcltoKytdID0gcyA6IHMgPiAxOTEgJiYgcyA8IDIyNCA/IHJbaCsrXSA9ICgzMSAmIHMpIDw8IDYgfCA2MyAmIHRbaSsrXSA6IHMgPiAyMzkgJiYgcyA8IDM2NSA/IChzID0gKCg3ICYgcykgPDwgMTggfCAoNjMgJiB0W2krK10pIDw8IDEyIHwgKDYzICYgdFtpKytdKSA8PCA2IHwgNjMgJiB0W2krK10pIC0gNjU1MzYsIHJbaCsrXSA9IDU1Mjk2ICsgKHMgPj4gMTApLCByW2grK10gPSA1NjMyMCArICgxMDIzICYgcykpIDogcltoKytdID0gKDE1ICYgcykgPDwgMTIgfCAoNjMgJiB0W2krK10pIDw8IDYgfCA2MyAmIHRbaSsrXSwgaCA+IDgxOTEgJiYgKChuIHx8IChuID0gW10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCByKSksIGggPSAwKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IChoICYmIG4ucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgci5zbGljZSgwLCBoKSkpLCBuLmpvaW4oJycpKSA6IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCByLnNsaWNlKDAsIGgpKTsKICAgICAgICAgICAgICAgIH0sIHMud3JpdGUgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMsIG4sIHIgPSBlLCBoID0gMDsgaCA8IHQubGVuZ3RoOyArK2gpCiAgICAgICAgICAgICAgICAgICAgICAgIChzID0gdC5jaGFyQ29kZUF0KGgpKSA8IDEyOCA/IGlbZSsrXSA9IHMgOiBzIDwgMjA0OCA/IChpW2UrK10gPSBzID4+IDYgfCAxOTIsIGlbZSsrXSA9IDYzICYgcyB8IDEyOCkgOiA1NTI5NiA9PSAoNjQ1MTIgJiBzKSAmJiA1NjMyMCA9PSAoNjQ1MTIgJiAobiA9IHQuY2hhckNvZGVBdChoICsgMSkpKSA/IChzID0gNjU1MzYgKyAoKDEwMjMgJiBzKSA8PCAxMCkgKyAoMTAyMyAmIG4pLCArK2gsIGlbZSsrXSA9IHMgPj4gMTggfCAyNDAsIGlbZSsrXSA9IHMgPj4gMTIgJiA2MyB8IDEyOCwgaVtlKytdID0gcyA+PiA2ICYgNjMgfCAxMjgsIGlbZSsrXSA9IDYzICYgcyB8IDEyOCkgOiAoaVtlKytdID0gcyA+PiAxMiB8IDIyNCwgaVtlKytdID0gcyA+PiA2ICYgNjMgfCAxMjgsIGlbZSsrXSA9IDYzICYgcyB8IDEyOCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLSByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBlIHx8IDgxOTIsIG4gPSBzID4+PiAxLCByID0gbnVsbCwgaCA9IHM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIDwgMSB8fCBlID4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICBoICsgZSA+IHMgJiYgKHIgPSB0KHMpLCBoID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaS5jYWxsKHIsIGgsIGggKz0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3ICYgaCAmJiAoaCA9IDEgKyAoNyB8IGgpKSwgYTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IG47CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sbyA9IHQgPj4+IDAsIHRoaXMuaGkgPSBpID4+PiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHIgPSBuLnplcm8gPSBuZXcgbigwLCAwKTsKICAgICAgICAgICAgICAgIHIudG9OdW1iZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9LCByLnp6RW5jb2RlID0gci56ekRlY29kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0sIHIubGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBoID0gbi56ZXJvSGFzaCA9ICdcMFwwXDBcMFwwXDBcMFwwJzsKICAgICAgICAgICAgICAgIG4uZnJvbU51bWJlciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIHZhciBpID0gdCA8IDA7CiAgICAgICAgICAgICAgICAgICAgaSAmJiAodCA9IC10KTsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQgPj4+IDAsIHMgPSAodCAtIGUpIC8gNDI5NDk2NzI5NiA+Pj4gMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiAocyA9IH5zID4+PiAwLCBlID0gfmUgPj4+IDAsICsrZSA+IDQyOTQ5NjcyOTUgJiYgKGUgPSAwLCArK3MgPiA0Mjk0OTY3Mjk1ICYmIChzID0gMCkpKSwgbmV3IG4oZSwgcyk7CiAgICAgICAgICAgICAgICB9LCBuLmZyb20gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZnJvbU51bWJlcih0KTsKICAgICAgICAgICAgICAgICAgICBpZiAocy5pc1N0cmluZyh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuTG9uZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmZyb21OdW1iZXIocGFyc2VJbnQodCwgMTApKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHMuTG9uZy5mcm9tU3RyaW5nKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5sb3cgfHwgdC5oaWdoID8gbmV3IG4odC5sb3cgPj4+IDAsIHQuaGlnaCA+Pj4gMCkgOiByOwogICAgICAgICAgICAgICAgfSwgbi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGlmICghdCAmJiB0aGlzLmhpID4+PiAzMSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDEgKyB+dGhpcy5sbyA+Pj4gMCwgZSA9IH50aGlzLmhpID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoZSA9IGUgKyAxID4+PiAwKSwgLShpICsgNDI5NDk2NzI5NiAqIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sbyArIDQyOTQ5NjcyOTYgKiB0aGlzLmhpOwogICAgICAgICAgICAgICAgfSwgbi5wcm90b3R5cGUudG9Mb25nID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5Mb25nID8gbmV3IHMuTG9uZygwIHwgdGhpcy5sbywgMCB8IHRoaXMuaGksIEJvb2xlYW4odCkpIDogewogICAgICAgICAgICAgICAgICAgICAgICBsb3c6IDAgfCB0aGlzLmxvLAogICAgICAgICAgICAgICAgICAgICAgICBoaWdoOiAwIHwgdGhpcy5oaSwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQ6IEJvb2xlYW4odCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBhID0gU3RyaW5nLnByb3RvdHlwZS5jaGFyQ29kZUF0OwogICAgICAgICAgICAgICAgbi5mcm9tSGFzaCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IGggPyByIDogbmV3IG4oKGEuY2FsbCh0LCAwKSB8IGEuY2FsbCh0LCAxKSA8PCA4IHwgYS5jYWxsKHQsIDIpIDw8IDE2IHwgYS5jYWxsKHQsIDMpIDw8IDI0KSA+Pj4gMCwgKGEuY2FsbCh0LCA0KSB8IGEuY2FsbCh0LCA1KSA8PCA4IHwgYS5jYWxsKHQsIDYpIDw8IDE2IHwgYS5jYWxsKHQsIDcpIDw8IDI0KSA+Pj4gMCk7CiAgICAgICAgICAgICAgICB9LCBuLnByb3RvdHlwZS50b0hhc2ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1ICYgdGhpcy5sbywgdGhpcy5sbyA+Pj4gOCAmIDI1NSwgdGhpcy5sbyA+Pj4gMTYgJiAyNTUsIHRoaXMubG8gPj4+IDI0LCAyNTUgJiB0aGlzLmhpLCB0aGlzLmhpID4+PiA4ICYgMjU1LCB0aGlzLmhpID4+PiAxNiAmIDI1NSwgdGhpcy5oaSA+Pj4gMjQpOwogICAgICAgICAgICAgICAgfSwgbi5wcm90b3R5cGUuenpFbmNvZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhpID4+IDMxOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhpID0gKCh0aGlzLmhpIDw8IDEgfCB0aGlzLmxvID4+PiAzMSkgXiB0KSA+Pj4gMCwgdGhpcy5sbyA9ICh0aGlzLmxvIDw8IDEgXiB0KSA+Pj4gMCwgdGhpczsKICAgICAgICAgICAgICAgIH0sIG4ucHJvdG90eXBlLnp6RGVjb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gLSgxICYgdGhpcy5sbyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG8gPSAoKHRoaXMubG8gPj4+IDEgfCB0aGlzLmhpIDw8IDMxKSBeIHQpID4+PiAwLCB0aGlzLmhpID0gKHRoaXMuaGkgPj4+IDEgXiB0KSA+Pj4gMCwgdGhpczsKICAgICAgICAgICAgICAgIH0sIG4ucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubG8sIGkgPSAodGhpcy5sbyA+Pj4gMjggfCB0aGlzLmhpIDw8IDQpID4+PiAwLCBlID0gdGhpcy5oaSA+Pj4gMjQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IGUgPyAwID09PSBpID8gdCA8IDE2Mzg0ID8gdCA8IDEyOCA/IDEgOiAyIDogdCA8IDIwOTcxNTIgPyAzIDogNCA6IGkgPCAxNjM4NCA/IGkgPCAxMjggPyA1IDogNiA6IGkgPCAyMDk3MTUyID8gNyA6IDggOiBlIDwgMTI4ID8gOSA6IDEwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoNjEpOwogICAgICAgICAgICAgICAgKHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gcjsKICAgICAgICAgICAgICAgIHZhciBuID0gZSgzOSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgIHMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIHQubGVuZ3RoIDwgNDAgPyBuLnV0Zjgud3JpdGUodCwgaSwgZSkgOiBpLnV0ZjhXcml0ZSA/IGkudXRmOFdyaXRlKHQsIGUpIDogaS53cml0ZSh0LCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHIuS2kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgci5hbGxvYyA9IG4uWWksIHIud3JpdGVCeXRlc0J1ZmZlciA9IG4uQnVmZmVyICYmIG4uQnVmZmVyLnByb3RvdHlwZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgJ3NldCcgPT09IG4uQnVmZmVyLnByb3RvdHlwZS5zZXQubmFtZSA/IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0KHQsIGUpOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5jb3B5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jb3B5KGksIGUsIDAsIHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCB0Lmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlKytdID0gdFtzKytdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCByLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgbi5pc1N0cmluZyh0KSAmJiAodCA9IG4uWGkodCwgJ2Jhc2U2NCcpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQubGVuZ3RoID4+PiAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVpbnQzMihpKSwgaSAmJiB0aGlzLlRzKHIud3JpdGVCeXRlc0J1ZmZlciwgaSwgdCksIHRoaXM7CiAgICAgICAgICAgICAgICB9LCByLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi5CdWZmZXIuYnl0ZUxlbmd0aCh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51aW50MzIoaSksIGkgJiYgdGhpcy5UcyhoLCBpLCB0KSwgdGhpczsKICAgICAgICAgICAgICAgIH0sIHIuS2koKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoNjMpOwogICAgICAgICAgICAgICAgKHIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gcjsKICAgICAgICAgICAgICAgIHZhciBuID0gZSgzOSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKHQpIHsKICAgICAgICAgICAgICAgICAgICBzLmNhbGwodGhpcywgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByLktpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG4uQnVmZmVyICYmIChyLnByb3RvdHlwZS5QcyA9IG4uQnVmZmVyLnByb3RvdHlwZS5zbGljZSk7CiAgICAgICAgICAgICAgICB9LCByLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnVpbnQzMigpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1Zi51dGY4U2xpY2UgPyB0aGlzLmJ1Zi51dGY4U2xpY2UodGhpcy5wb3MsIHRoaXMucG9zID0gTWF0aC5taW4odGhpcy5wb3MgKyB0LCB0aGlzLmxlbikpIDogdGhpcy5idWYudG9TdHJpbmcoJ3V0Zi04JywgdGhpcy5wb3MsIHRoaXMucG9zID0gTWF0aC5taW4odGhpcy5wb3MgKyB0LCB0aGlzLmxlbikpOwogICAgICAgICAgICAgICAgfSwgci5LaSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgaS5TZXJ2aWNlID0gZSgxMzIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gbjsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgzOSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdycGNJbXBsIG11c3QgYmUgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgIHMuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyksIHRoaXMucnBjSW1wbCA9IHQsIHRoaXMucmVxdWVzdERlbGltaXRlZCA9IEJvb2xlYW4oaSksIHRoaXMucmVzcG9uc2VEZWxpbWl0ZWQgPSBCb29sZWFuKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKG4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzLkV2ZW50RW1pdHRlci5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IG4sIG4ucHJvdG90eXBlLnJwY0NhbGwgPSBmdW5jdGlvbiB0KGksIGUsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcigncmVxdWVzdCBtdXN0IGJlIHNwZWNpZmllZCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpczsKICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmFzUHJvbWlzZSh0LCBhLCBpLCBlLCBuLCByKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYS5ycGNJbXBsKQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucnBjSW1wbChpLCBlW2EucmVxdWVzdERlbGltaXRlZCA/ICdlbmNvZGVEZWxpbWl0ZWQnIDogJ2VuY29kZSddKHIpLmZpbmlzaCgpLCBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5lbWl0KCdlcnJvcicsIHQsIGkpLCBoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5bYS5yZXNwb25zZURlbGltaXRlZCA/ICdkZWNvZGVEZWxpbWl0ZWQnIDogJ2RlY29kZSddKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmVtaXQoJ2Vycm9yJywgdCwgaSksIGgodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmVtaXQoJ2RhdGEnLCBlLCBpKSwgaChudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5lbmQoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmVtaXQoJ2Vycm9yJywgdCwgaSksIHZvaWQgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoRXJyb3IoJ2FscmVhZHkgZW5kZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgfSwgbi5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ycGNJbXBsICYmICh0IHx8IHRoaXMucnBjSW1wbChudWxsLCBudWxsLCBudWxsKSwgdGhpcy5ycGNJbXBsID0gbnVsbCwgdGhpcy5lbWl0KCdlbmQnKS5vZmYoKSksIHRoaXM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5leHBvcnRzID0ge307CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IHRoaXMgJiYgdGhpcy5FcyB8fCAocyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fcHJvdG9fXyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gaVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGkpLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IGkgPyBPYmplY3QuY3JlYXRlKGkpIDogKGUucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIG5ldyBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5jYWxsKHRoaXMsIGkpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5hbWUgPSAnRGVjb2RpbmdFcnJvcicsIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBpOwogICAgICAgICAgICAgICAgfShFcnJvcik7CiAgICAgICAgICAgICAgICBpLkRlY29kaW5nRXJyb3IgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSB0aGlzICYmIHRoaXMuRXMgfHwgKHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX3Byb3RvX18gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAodFtlXSA9IGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcyh0LCBpKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBpID8gT2JqZWN0LmNyZWF0ZShpKSA6IChlLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCBuZXcgZSgpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuY2FsbCh0aGlzLCBpKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYW1lID0gJ0VuY29kaW5nRXJyb3InLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihpLCB0KSwgaTsKICAgICAgICAgICAgICAgIH0oRXJyb3IpOwogICAgICAgICAgICAgICAgaS5FbmNvZGluZ0Vycm9yID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzLCBuID0gdGhpcyAmJiB0aGlzLkVzIHx8IChzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19wcm90b19fID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKHRbZV0gPSBpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHModCwgaSksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gaSA/IE9iamVjdC5jcmVhdGUoaSkgOiAoZS5wcm90b3R5cGUgPSBpLnByb3RvdHlwZSwgbmV3IGUoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNhbGwodGhpcywgaSkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmFtZSA9ICdHVkxFcnJvcicsIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBpOwogICAgICAgICAgICAgICAgfShFcnJvcik7CiAgICAgICAgICAgICAgICBpLkdWTEVycm9yID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzLCBuID0gdGhpcyAmJiB0aGlzLkVzIHx8IChzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19wcm90b19fID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKHRbZV0gPSBpW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHModCwgaSksIHQucHJvdG90eXBlID0gbnVsbCA9PT0gaSA/IE9iamVjdC5jcmVhdGUoaSkgOiAoZS5wcm90b3R5cGUgPSBpLnByb3RvdHlwZSwgbmV3IGUoKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBzICYmIChzID0gJycpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuY2FsbCh0aGlzLCAnaW52YWxpZCB2YWx1ZSAnICsgZSArICcgcGFzc2VkIGZvciAnICsgaSArICcgJyArIHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLm5hbWUgPSAnVENNb2RlbEVycm9yJywgbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oaSwgdCksIGk7CiAgICAgICAgICAgICAgICB9KEVycm9yKTsKICAgICAgICAgICAgICAgIGkuVENNb2RlbEVycm9yID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxhbmdTZXQuaGFzKGkpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmxhbmdTZXQuZm9yRWFjaChpKTsKICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsICdzaXplJywgewogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxhbmdTZXQuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSwgdC5sYW5nU2V0ID0gbmV3IFNldChbCiAgICAgICAgICAgICAgICAgICAgICAgICdCRycsCiAgICAgICAgICAgICAgICAgICAgICAgICdDQScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDUycsCiAgICAgICAgICAgICAgICAgICAgICAgICdEQScsCiAgICAgICAgICAgICAgICAgICAgICAgICdERScsCiAgICAgICAgICAgICAgICAgICAgICAgICdFTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdFTicsCiAgICAgICAgICAgICAgICAgICAgICAgICdFUycsCiAgICAgICAgICAgICAgICAgICAgICAgICdFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdGSScsCiAgICAgICAgICAgICAgICAgICAgICAgICdGUicsCiAgICAgICAgICAgICAgICAgICAgICAgICdIUicsCiAgICAgICAgICAgICAgICAgICAgICAgICdIVScsCiAgICAgICAgICAgICAgICAgICAgICAgICdJVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdMVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdMVicsCiAgICAgICAgICAgICAgICAgICAgICAgICdNVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdOTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdOTycsCiAgICAgICAgICAgICAgICAgICAgICAgICdQTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdQVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdSTycsCiAgICAgICAgICAgICAgICAgICAgICAgICdSVScsCiAgICAgICAgICAgICAgICAgICAgICAgICdTSycsCiAgICAgICAgICAgICAgICAgICAgICAgICdTTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdTVicsCiAgICAgICAgICAgICAgICAgICAgICAgICdaSCcKICAgICAgICAgICAgICAgICAgICBdKSwgdDsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuQ29uc2VudExhbmd1YWdlcyA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IHRoaXMgJiYgdGhpcy5FcyB8fCAocyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fcHJvdG9fXyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gaVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGkpLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IGkgPyBPYmplY3QuY3JlYXRlKGkpIDogKGUucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIG5ldyBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGUoNjgpLCBoID0gZSg2NiksIGEgPSBlKDU2KSwgbyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG51bGwgIT09IHQgJiYgdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5iaXRMZW5ndGggPSAwLCBpLm1hcCA9IG5ldyBNYXAoKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihpLCB0KSwgaS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcC5oYXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmlzT2tUb0hhdmUgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG4gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSAocyA9IHRoaXMuZ3ZsKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLnZlbmRvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuZ3ZsLnZlbmRvcnNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09PSBhLlJlc3RyaWN0aW9uVHlwZS5OT1RfQUxMT1dFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSByLmxlZ0ludFB1cnBvc2VzLmluY2x1ZGVzKGkpIHx8IHIucHVycG9zZXMuaW5jbHVkZXMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIuZmxleGlibGVQdXJwb3Nlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9DT05TRU5UOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSByLmZsZXhpYmxlUHVycG9zZXMuaW5jbHVkZXMoaSkgJiYgci5sZWdJbnRQdXJwb3Nlcy5pbmNsdWRlcyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYS5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9MSToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gci5mbGV4aWJsZVB1cnBvc2VzLmluY2x1ZGVzKGkpICYmIHIucHVycG9zZXMuaW5jbHVkZXMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPa1RvSGF2ZShpLnJlc3RyaWN0aW9uVHlwZSwgaS5wdXJwb3NlSWQsIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLmhhc2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXMoZSkgfHwgKHRoaXMubWFwLnNldChlLCBuZXcgaC5CaW5hcnlTZWFyY2hUcmVlKCkpLCB0aGlzLmJpdExlbmd0aCA9IDApLCB0aGlzLm1hcC5nZXQoZSkuYWRkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5nZXRWZW5kb3JzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5oYXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzKGUpICYmIChpID0gdGhpcy5tYXAuZ2V0KGUpLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldCgpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSA9IEFycmF5LmZyb20ocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0UmVzdHJpY3Rpb25UeXBlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UmVzdHJpY3Rpb25zKHQpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1cnBvc2VJZCA9PT0gaSAmJiAodm9pZCAwID09PSBlIHx8IGUgPiB0LnJlc3RyaWN0aW9uVHlwZSkgJiYgKGUgPSB0LnJlc3RyaWN0aW9uVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudmVuZG9ySGFzUmVzdHJpY3Rpb24gPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9ICExLCBzID0gdGhpcy5nZXRSZXN0cmljdGlvbnModCksIG4gPSAwOyBuIDwgcy5sZW5ndGggJiYgIWU7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaS5pc1NhbWVBcyhzW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5nZXRNYXhWZW5kb3JJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcC5mb3JFYWNoKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGgubWF4KGkubWF4KCksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldFJlc3RyaWN0aW9ucyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwLmZvckVhY2goZnVuY3Rpb24gKGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gZS5jb250YWlucyh0KSAmJiBpLnB1c2goci5QdXJwb3NlUmVzdHJpY3Rpb24udW5IYXNoKHMpKSA6IGkucHVzaChyLlB1cnBvc2VSZXN0cmljdGlvbi51bkhhc2gocykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldFB1cnBvc2VzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRkKHIuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChlKS5wdXJwb3NlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEFycmF5LmZyb20odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuaGFzaCwgcyA9IHRoaXMubWFwLmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgKHMucmVtb3ZlKHQpLCBzLmlzRW1wdHkoKSAmJiAodGhpcy5tYXAuZGVsZXRlKGUpLCB0aGlzLmJpdExlbmd0aCA9IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnZ3ZsJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ZsXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3ZsXyB8fCAodGhpcy5ndmxfID0gdCwgdGhpcy5tYXAuZm9yRWFjaChmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHIuUHVycG9zZVJlc3RyaWN0aW9uLnVuSGFzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXQoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmlzT2tUb0hhdmUocy5yZXN0cmljdGlvblR5cGUsIHMucHVycG9zZUlkLCBlKSB8fCB0LnJlbW92ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSB0aGlzLm1hcC5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdudW1SZXN0cmljdGlvbnMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfShlKDQxKS5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgaS5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3IgPSBvOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHM7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBuID0gZSg2OSksIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuSURfVE9fS0VZID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5TZWdtZW50LkNPUkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLlNlZ21lbnQuVkVORE9SU19BTExPV0VELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5TZWdtZW50LlBVQkxJU0hFUl9UQwogICAgICAgICAgICAgICAgICAgICAgICBdLCB0LktFWV9UT19JRCA9ICgocyA9IHt9KVtuLlNlZ21lbnQuQ09SRV0gPSAwLCBzW24uU2VnbWVudC5WRU5ET1JTX0RJU0NMT1NFRF0gPSAxLCBzW24uU2VnbWVudC5WRU5ET1JTX0FMTE9XRURdID0gMiwgc1tuLlNlZ21lbnQuUFVCTElTSEVSX1RDXSA9IDMsIHMpLCB0OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuU2VnbWVudElEcyA9IHI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IHRoaXMgJiYgdGhpcy5FcyB8fCAocyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fcHJvdG9fXyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gaVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGkpLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IGkgPyBPYmplY3QuY3JlYXRlKGkpIDogKGUucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIG5ldyBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCByID0gdGhpcyAmJiB0aGlzLmhvIHx8IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCBuLCByLCBoID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgJiBuWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgblsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGEoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdzogYSgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjogYSgyKQogICAgICAgICAgICAgICAgICAgICAgICB9LCAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgKHJbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSAxLCBzICYmIChuID0gMiAmIHJbMF0gPyBzLnJldHVybiA6IHJbMF0gPyBzLnRocm93IHx8ICgobiA9IHMucmV0dXJuKSAmJiBuLmNhbGwocyksIDApIDogcy5uZXh0KSAmJiAhKG4gPSBuLmNhbGwocywgclsxXSkpLmRvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocyA9IDAsIG4gJiYgKHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICYgclswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHJbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5sYWJlbCsrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogclsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxhYmVsKyssIHMgPSByWzFdLCByID0gWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBoLm9wcy5wb3AoKSwgaC50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShuID0gKG4gPSBoLnRyeXMpLmxlbmd0aCA+IDAgJiYgbltuLmxlbmd0aCAtIDFdKSAmJiAoNiA9PT0gclswXSB8fCAyID09PSByWzBdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMyA9PT0gclswXSAmJiAoIW4gfHwgclsxXSA+IG5bMF0gJiYgclsxXSA8IG5bM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxhYmVsID0gclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg2ID09PSByWzBdICYmIGgubGFiZWwgPCBuWzFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxhYmVsID0gblsxXSwgbiA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBoLmxhYmVsIDwgblsyXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sYWJlbCA9IG5bMl0sIGgub3BzLnB1c2gocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuWzJdICYmIGgub3BzLnBvcCgpLCBoLnRyeXMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gaS5jYWxsKHQsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNSAmIHJbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJbMF0gPyByWzFdIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGggPSB0aGlzICYmIHRoaXMuWmkgfHwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yLCBlID0gaSAmJiB0W2ldLCBzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgdC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgcyA+PSB0Lmxlbmd0aCAmJiAodCA9IHZvaWQgMCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0ICYmIHRbcysrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihpID8gJ09iamVjdCBpcyBub3QgaXRlcmFibGUuJyA6ICdTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCAnXycsIHsgdmFsdWU6ICEwIH0pOwogICAgICAgICAgICAgICAgdmFyIGEgPSBlKDQxKSwgbyA9IGUoMzMpLCBjID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCAhPT0gdCAmJiB0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmJpdExlbmd0aCA9IDAsIGkubWF4SWRfID0gMCwgaS5zZXRfID0gbmV3IFNldCgpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBpLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih0aGlzLCBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDEsIGkubGFiZWwgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPD0gdGhpcy5tYXhJZCA/IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhcyh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2VudCgpLCBpLmxhYmVsID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KyssIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRfLnZhbHVlcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdtYXhJZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heElkXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRfLmhhcyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0KSA/IHQuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnVuc2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAnb2JqZWN0JyA9PSB0eXBlb2YgdCA/IHRoaXMudW5zZXQoT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICt0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogKHRoaXMuc2V0Xy5kZWxldGUodCksIHRoaXMuYml0TGVuZ3RoID0gMCwgdCA9PT0gdGhpcy5tYXhJZCAmJiAodGhpcy5tYXhJZF8gPSAwLCB0aGlzLnNldF8uZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubWF4SWRfID0gTWF0aC5tYXgoaS5tYXhJZCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5pc0ludE1hcCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIGUgPSAnb2JqZWN0JyA9PSB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIE9iamVjdC5rZXlzKHQpLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBOdW1iZXIuaXNJbnRlZ2VyKHBhcnNlSW50KGUsIDEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzID0gcyAmJiBpLmlzVmFsaWROdW1iZXIodFtlXS5pZCkpICYmIHZvaWQgMCAhPT0gdFtlXS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmlzVmFsaWROdW1iZXIgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHQsIDEwKSA+IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmlzU2V0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIFNldCAmJiAoaSA9IEFycmF5LmZyb20odCkuZXZlcnkodGhpcy5pc1ZhbGlkTnVtYmVyKSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1NldCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChBcnJheS5mcm9tKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNJbnRNYXAodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiArdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZE51bWJlcih0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG8uVENNb2RlbEVycm9yKCdzZXQoKScsIHQsICdtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgYXJyYXksIHBvc2l0aXZlIGludGVnZXIsIFNldDxudW1iZXI+LCBvciBJbnRNYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldF8uYWRkKHQpLCB0aGlzLm1heElkXyA9IE1hdGgubWF4KHRoaXMubWF4SWQsIHQpLCB0aGlzLmJpdExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gaCh0aGlzKSwgbiA9IHMubmV4dCgpOyAhbi5kb25lOyBuID0gcy5uZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KHJbMV0sIHJbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0geyBlcnJvcjogdCB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICFuLmRvbmUgJiYgKGUgPSBzLnJldHVybikgJiYgZS5jYWxsKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaS5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSwgJ3NpemUnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXRfLnNpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLnByb3RvdHlwZS5zZXRBbGwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShhLkNsb25lYWJsZSk7CiAgICAgICAgICAgICAgICBpLlZlY3RvciA9IGM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSg2NSksIG4gPSBlKDU1KSwgciA9IGUoNzApLCBoID0gZSg3NiksIGEgPSBlKDMzKSwgbyA9IGUoNjcpLCBjID0gZSgzNSksIHUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZW5jb2RlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBoID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMuZmllbGRTZXF1ZW5jZVsnJyArIHQudmVyc2lvbl1baV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGEuRW5jb2RpbmdFcnJvcignVW5hYmxlIHRvIGVuY29kZSB2ZXJzaW9uOiAnICsgdC52ZXJzaW9uICsgJywgc2VnbWVudDogJyArIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICE9PSBjLlNlZ21lbnQuQ09SRSAmJiAodSA9IHIuSW50RW5jb2Rlci5lbmNvZGUoYy5TZWdtZW50SURzLktFWV9UT19JRFtpXSwgbi5CaXRMZW5ndGguc2VnbWVudFR5cGUpKSwgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0W2VdLCBjID0gci5GaWVsZEVuY29kZXJNYXBbZV0sIGwgPSBuLkJpdExlbmd0aFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGwgJiYgaC5pc1B1Ymxpc2hlckN1c3RvbShlKSAmJiAobCA9ICt0W28uRmllbGRzLm51bUN1c3RvbVB1cnBvc2VzXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSArPSBjLmVuY29kZShzLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBhLkVuY29kaW5nRXJyb3IoJ0Vycm9yIGVuY29kaW5nICcgKyBpICsgJy0+JyArIGUgKyAnOiAnICsgdC5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5CYXNlNjRVcmwuZW5jb2RlKHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmRlY29kZSA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHRoaXMsIHUgPSBzLkJhc2U2NFVybC5kZWNvZGUodCksIGwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IGMuU2VnbWVudC5DT1JFICYmIChpLnZlcnNpb24gPSByLkludEVuY29kZXIuZGVjb2RlKHUuc3Vic3RyKGwsIG4uQml0TGVuZ3RoW28uRmllbGRzLnZlcnNpb25dKSwgbi5CaXRMZW5ndGhbby5GaWVsZHMudmVyc2lvbl0pKSwgZSAhPT0gYy5TZWdtZW50LkNPUkUgJiYgKGwgKz0gbi5CaXRMZW5ndGguc2VnbWVudFR5cGUpLCB0aGlzLmZpZWxkU2VxdWVuY2VbJycgKyBpLnZlcnNpb25dW2VdLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIuRmllbGRFbmNvZGVyTWFwW3RdLCBzID0gbi5CaXRMZW5ndGhbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gcyAmJiBoLmlzUHVibGlzaGVyQ3VzdG9tKHQpICYmIChzID0gK2lbby5GaWVsZHMubnVtQ3VzdG9tUHVycG9zZXNdKSwgMCAhPT0gcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHUuc3Vic3RyKGwsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gci5WZW5kb3JWZWN0b3JFbmNvZGVyID8gaVt0XSA9IGUuZGVjb2RlKGMsIGkudmVyc2lvbikgOiBpW3RdID0gZS5kZWNvZGUoYywgcyksIE51bWJlci5pc0ludGVnZXIocykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICs9IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlbdF0uYml0TGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgYS5EZWNvZGluZ0Vycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSBpW3RdLmJpdExlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmlzUHVibGlzaGVyQ3VzdG9tID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSB0LmluZGV4T2YoJ3B1Ymxpc2hlckN1c3RvbScpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmZpZWxkU2VxdWVuY2UgPSBuZXcgaC5GaWVsZFNlcXVlbmNlKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgaS5TZWdtZW50RW5jb2RlciA9IHU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgzNSksIG4gPSBlKDQ2KSwgciA9IGUoNzEpLCBoID0gZSg1NyksIGEgPSBlKDQwKSwgbyA9IGUoNzIpLCBjID0gZSg3MyksIHUgPSBlKDc0KSwgbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgbCwgZCwgZiwgcCwgYiwgdiwgbSwgZywgeSwgdywgTywgeCwgUywgaiwgaywgXywgQSwgSSwgQywgVCwgUCwgTSwgRSwgTDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSBzLkZpZWxkcy52ZXJzaW9uLCBlID0gcy5GaWVsZHMuY3JlYXRlZCwgbCA9IHMuRmllbGRzLmxhc3RVcGRhdGVkLCBkID0gcy5GaWVsZHMuY21wSWQsIGYgPSBzLkZpZWxkcy5jbXBWZXJzaW9uLCBwID0gcy5GaWVsZHMuY29uc2VudFNjcmVlbiwgYiA9IHMuRmllbGRzLmNvbnNlbnRMYW5ndWFnZSwgdiA9IHMuRmllbGRzLnZlbmRvckxpc3RWZXJzaW9uLCBtID0gcy5GaWVsZHMucG9saWN5VmVyc2lvbiwgZyA9IHMuRmllbGRzLmlzU2VydmljZVNwZWNpZmljLCB5ID0gcy5GaWVsZHMudXNlTm9uU3RhbmRhcmRTdGFja3MsIHcgPSBzLkZpZWxkcy5zcGVjaWFsRmVhdHVyZU9wdGlucywgTyA9IHMuRmllbGRzLnB1cnBvc2VDb25zZW50cywgeCA9IHMuRmllbGRzLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzLCBTID0gcy5GaWVsZHMucHVycG9zZU9uZVRyZWF0bWVudCwgaiA9IHMuRmllbGRzLnB1Ymxpc2hlckNvdW50cnlDb2RlLCBrID0gcy5GaWVsZHMudmVuZG9yQ29uc2VudHMsIF8gPSBzLkZpZWxkcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLCBBID0gcy5GaWVsZHMucHVibGlzaGVyUmVzdHJpY3Rpb25zLCBJID0gcy5GaWVsZHMudmVuZG9yc0Rpc2Nsb3NlZCwgQyA9IHMuRmllbGRzLnZlbmRvcnNBbGxvd2VkLCBUID0gcy5GaWVsZHMucHVibGlzaGVyQ29uc2VudHMsIFAgPSBzLkZpZWxkcy5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzLCBNID0gcy5GaWVsZHMubnVtQ3VzdG9tUHVycG9zZXMsIEUgPSBzLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21Db25zZW50cywgTCA9IHMuRmllbGRzLnB1Ymxpc2hlckN1c3RvbUxlZ2l0aW1hdGVJbnRlcmVzdHMsIHRbaV0gPSBhLkludEVuY29kZXIsIHRbZV0gPSByLkRhdGVFbmNvZGVyLCB0W2xdID0gci5EYXRlRW5jb2RlciwgdFtkXSA9IGEuSW50RW5jb2RlciwgdFtmXSA9IGEuSW50RW5jb2RlciwgdFtwXSA9IGEuSW50RW5jb2RlciwgdFtiXSA9IG8uTGFuZ0VuY29kZXIsIHRbdl0gPSBhLkludEVuY29kZXIsIHRbbV0gPSBhLkludEVuY29kZXIsIHRbZ10gPSBuLkJvb2xlYW5FbmNvZGVyLCB0W3ldID0gbi5Cb29sZWFuRW5jb2RlciwgdFt3XSA9IGguRml4ZWRWZWN0b3JFbmNvZGVyLCB0W09dID0gaC5GaXhlZFZlY3RvckVuY29kZXIsIHRbeF0gPSBoLkZpeGVkVmVjdG9yRW5jb2RlciwgdFtTXSA9IG4uQm9vbGVhbkVuY29kZXIsIHRbal0gPSBvLkxhbmdFbmNvZGVyLCB0W2tdID0gdS5WZW5kb3JWZWN0b3JFbmNvZGVyLCB0W19dID0gdS5WZW5kb3JWZWN0b3JFbmNvZGVyLCB0W0FdID0gYy5QdXJwb3NlUmVzdHJpY3Rpb25WZWN0b3JFbmNvZGVyLCB0LnNlZ21lbnRUeXBlID0gYS5JbnRFbmNvZGVyLCB0W0ldID0gdS5WZW5kb3JWZWN0b3JFbmNvZGVyLCB0W0NdID0gdS5WZW5kb3JWZWN0b3JFbmNvZGVyLCB0W1RdID0gaC5GaXhlZFZlY3RvckVuY29kZXIsIHRbUF0gPSBoLkZpeGVkVmVjdG9yRW5jb2RlciwgdFtNXSA9IGEuSW50RW5jb2RlciwgdFtFXSA9IGguRml4ZWRWZWN0b3JFbmNvZGVyLCB0W0xdID0gaC5GaXhlZFZlY3RvckVuY29kZXIsIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgaS5GaWVsZEVuY29kZXJNYXAgPSBsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzUpOwogICAgICAgICAgICAgICAgaS5GaWVsZFNlcXVlbmNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCBpOwogICAgICAgICAgICAgICAgICAgIHRoaXNbMV0gPSAoKHQgPSB7fSlbcy5TZWdtZW50LkNPUkVdID0gWwogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy52ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5jcmVhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5sYXN0VXBkYXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMuY21wSWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLmNtcFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLmNvbnNlbnRTY3JlZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLmNvbnNlbnRMYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMudmVuZG9yTGlzdFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLnB1cnBvc2VDb25zZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMudmVuZG9yQ29uc2VudHMKICAgICAgICAgICAgICAgICAgICBdLCB0KSwgdGhpc1syXSA9ICgoaSA9IHt9KVtzLlNlZ21lbnQuQ09SRV0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLmNyZWF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLmxhc3RVcGRhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5jbXBJZCwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMuY21wVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMuY29uc2VudFNjcmVlbiwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMuY29uc2VudExhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy52ZW5kb3JMaXN0VmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMucG9saWN5VmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMuaXNTZXJ2aWNlU3BlY2lmaWMsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLnVzZU5vblN0YW5kYXJkU3RhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5zcGVjaWFsRmVhdHVyZU9wdGlucywKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMucHVycG9zZUNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMucHVycG9zZU9uZVRyZWF0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMucHVibGlzaGVyQ291bnRyeUNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLnZlbmRvckNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5wdWJsaXNoZXJSZXN0cmljdGlvbnMKICAgICAgICAgICAgICAgICAgICBdLCBpW3MuU2VnbWVudC5QVUJMSVNIRVJfVENdID0gWwogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5wdWJsaXNoZXJDb25zZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMucHVibGlzaGVyTGVnaXRpbWF0ZUludGVyZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgcy5GaWVsZHMubnVtQ3VzdG9tUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHMuRmllbGRzLnB1Ymxpc2hlckN1c3RvbUNvbnNlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICBzLkZpZWxkcy5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzCiAgICAgICAgICAgICAgICAgICAgXSwgaVtzLlNlZ21lbnQuVkVORE9SU19BTExPV0VEXSA9IFtzLkZpZWxkcy52ZW5kb3JzQWxsb3dlZF0sIGlbcy5TZWdtZW50LlZFTkRPUlNfRElTQ0xPU0VEXSA9IFtzLkZpZWxkcy52ZW5kb3JzRGlzY2xvc2VkXSwgaSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMzUpOwogICAgICAgICAgICAgICAgaS5TZWdtZW50U2VxdWVuY2UgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzWzFdID0gW3MuU2VnbWVudC5DT1JFXSwgdGhpc1syXSA9IFtzLlNlZ21lbnQuQ09SRV0sIDIgPT09IHQudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNTZXJ2aWNlU3BlY2lmaWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzWzJdLnB1c2gocy5TZWdtZW50LlBVQkxJU0hFUl9UQyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhKCFpIHx8ICFpLmlzRm9yVmVuZG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmICEwICE9PSB0W3MuRmllbGRzLnN1cHBvcnRPT0JdIHx8IHRoaXNbMl0ucHVzaChzLlNlZ21lbnQuVkVORE9SU19ESVNDTE9TRUQpLCBlICYmICh0W3MuRmllbGRzLnN1cHBvcnRPT0JdICYmIHRbcy5GaWVsZHMudmVuZG9yc0FsbG93ZWRdLnNpemUgPiAwICYmIHRoaXNbMl0ucHVzaChzLlNlZ21lbnQuVkVORE9SU19BTExPV0VEKSwgdGhpc1syXS5wdXNoKHMuU2VnbWVudC5QVUJMSVNIRVJfVEMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcyAmJiB0aGlzLlppIHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciwgZSA9IGkgJiYgdFtpXSwgcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY2FsbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgJ251bWJlcicgPT0gdHlwZW9mIHQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHMgPj0gdC5sZW5ndGggJiYgKHQgPSB2b2lkIDApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCAmJiB0W3MrK10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoaSA/ICdPYmplY3QgaXMgbm90IGl0ZXJhYmxlLicgOiAnU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLicpOwogICAgICAgICAgICAgICAgICAgIH0sIG4gPSB0aGlzICYmIHRoaXMuYW8gfHwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgdFtTeW1ib2wuaXRlcmF0b3JdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG4sIHIgPSBlLmNhbGwodCksIGggPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAodm9pZCAwID09PSBpIHx8IGktLSA+IDApICYmICEocyA9IHIubmV4dCgpKS5kb25lOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLnB1c2gocy52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB7IGVycm9yOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgIXMuZG9uZSAmJiAoZSA9IHIucmV0dXJuKSAmJiBlLmNhbGwocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgJ18nLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gZSgzMyksIGggPSBlKDM1KSwgYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm9jZXNzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCBuID0gdC5ndmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHIuRW5jb2RpbmdFcnJvcignVW5hYmxlIHRvIGVuY29kZSBUQ01vZGVsIHdpdGhvdXQgYSBHVkwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbi5pc1JlYWR5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyByLkVuY29kaW5nRXJyb3IoJ1VuYWJsZSB0byBlbmNvZGUgVENNb2RlbCB0Y01vZGVsLmd2bC5yZWFkeVByb21pc2UgaXMgbm90IHJlc29sdmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCA9IHQuY2xvbmUoKSkuY29uc2VudExhbmd1YWdlID0gbi5sYW5ndWFnZS50b1VwcGVyQ2FzZSgpLCAobnVsbCA9PT0gKGUgPSBpKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLnZlcnNpb24pID4gMCAmJiAobnVsbCA9PT0gKHMgPSBpKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLnZlcnNpb24pIDw9IHRoaXMucHJvY2Vzc29yLmxlbmd0aCA/IHQudmVyc2lvbiA9IGkudmVyc2lvbiA6IHQudmVyc2lvbiA9IHRoaXMucHJvY2Vzc29yLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gdC52ZXJzaW9uIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5wcm9jZXNzb3JbaF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IHIuRW5jb2RpbmdFcnJvcignSW52YWxpZCB2ZXJzaW9uOiAnICsgdC52ZXJzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NvcltoXSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm9jZXNzb3IgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHIsIGEsIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdWJsaXNoZXJSZXN0cmljdGlvbnMuZ3ZsID0gaSwgdC5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cy51bnNldCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnNldCgnbGVnSW50UHVycG9zZXMnLCB0LnZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMpLCBjLnNldCgncHVycG9zZXMnLCB0LnZlbmRvckNvbnNlbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gcyhjKSwgbCA9IHUubmV4dCgpOyAhbC5kb25lOyBsID0gdS5uZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbihsLnZhbHVlLCAyKSwgZiA9IGRbMF0sIHAgPSBkWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gKGEgPSB2b2lkIDAsIHMocC52YWx1ZXMoKSkpLCB2ID0gYi5uZXh0KCk7ICF2LmRvbmU7IHYgPSBiLm5leHQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHYudmFsdWUsIGcgPSBpLnZlbmRvcnNbbV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyB8fCBnLmRlbGV0ZWREYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC51bnNldChtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoMCA9PT0gZ1tmXS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pc1NlcnZpY2VTcGVjaWZpYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZy5mbGV4aWJsZVB1cnBvc2VzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC51bnNldChtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IHQucHVibGlzaGVyUmVzdHJpY3Rpb25zLmdldFJlc3RyaWN0aW9ucyhtKSwgdyA9ICExLCBPID0gMCwgeCA9IHkubGVuZ3RoOyBPIDwgeCAmJiAhdzsgTysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHlbT10ucmVzdHJpY3Rpb25UeXBlID09PSBoLlJlc3RyaWN0aW9uVHlwZS5SRVFVSVJFX0NPTlNFTlQgJiYgJ3B1cnBvc2VzJyA9PT0gZiB8fCB5W09dLnJlc3RyaWN0aW9uVHlwZSA9PT0gaC5SZXN0cmljdGlvblR5cGUuUkVRVUlSRV9MSSAmJiAnbGVnSW50UHVycG9zZXMnID09PSBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3IHx8IHAudW5zZXQobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAudW5zZXQobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB7IGVycm9yOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgJiYgIXYuZG9uZSAmJiAobyA9IGIucmV0dXJuKSAmJiBvLmNhbGwoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHsgZXJyb3I6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCAmJiAhbC5kb25lICYmIChyID0gdS5yZXR1cm4pICYmIHIuY2FsbCh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUuZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmVuZG9yc0Rpc2Nsb3NlZC5zZXQoaS52ZW5kb3JzKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBpLlNlbWFudGljUHJlRW5jb2RlciA9IGE7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IHRoaXMgJiYgdGhpcy5FcyB8fCAocyA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fcHJvdG9fXyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gaVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGkpLCB0LnByb3RvdHlwZSA9IG51bGwgPT09IGkgPyBPYmplY3QuY3JlYXRlKGkpIDogKGUucHJvdG90eXBlID0gaS5wcm90b3R5cGUsIG5ldyBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IGUoNDEpLCBoID0gZSgzMyksIGEgPSBlKDE0OCksIG8gPSBlKDM1KSwgYyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlzU2VydmljZVNwZWNpZmljXyA9ICExLCBlLnN1cHBvcnRPT0JfID0gITAsIGUudXNlTm9uU3RhbmRhcmRTdGFja3NfID0gITEsIGUucHVycG9zZU9uZVRyZWF0bWVudF8gPSAhMSwgZS5wdWJsaXNoZXJDb3VudHJ5Q29kZV8gPSAnQUEnLCBlLnZlcnNpb25fID0gMiwgZS5jb25zZW50U2NyZWVuXyA9IDAsIGUucG9saWN5VmVyc2lvbl8gPSAyLCBlLmNvbnNlbnRMYW5ndWFnZV8gPSAnRU4nLCBlLmNtcElkXyA9IDAsIGUuY21wVmVyc2lvbl8gPSAwLCBlLnZlbmRvckxpc3RWZXJzaW9uXyA9IDAsIGUubnVtQ3VzdG9tUHVycG9zZXNfID0gMCwgZS5zcGVjaWFsRmVhdHVyZU9wdGlucyA9IG5ldyBvLlZlY3RvcigpLCBlLnB1cnBvc2VDb25zZW50cyA9IG5ldyBvLlZlY3RvcigpLCBlLnB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzID0gbmV3IG8uVmVjdG9yKCksIGUucHVibGlzaGVyQ29uc2VudHMgPSBuZXcgby5WZWN0b3IoKSwgZS5wdWJsaXNoZXJMZWdpdGltYXRlSW50ZXJlc3RzID0gbmV3IG8uVmVjdG9yKCksIGUucHVibGlzaGVyQ3VzdG9tQ29uc2VudHMgPSBuZXcgby5WZWN0b3IoKSwgZS5wdWJsaXNoZXJDdXN0b21MZWdpdGltYXRlSW50ZXJlc3RzID0gbmV3IG8uVmVjdG9yKCksIGUudmVuZG9yQ29uc2VudHMgPSBuZXcgby5WZWN0b3IoKSwgZS52ZW5kb3JMZWdpdGltYXRlSW50ZXJlc3RzID0gbmV3IG8uVmVjdG9yKCksIGUudmVuZG9yc0Rpc2Nsb3NlZCA9IG5ldyBvLlZlY3RvcigpLCBlLnZlbmRvcnNBbGxvd2VkID0gbmV3IG8uVmVjdG9yKCksIGUucHVibGlzaGVyUmVzdHJpY3Rpb25zID0gbmV3IG8uUHVycG9zZVJlc3RyaWN0aW9uVmVjdG9yKCksIGkgJiYgKGUuZ3ZsID0gaSksIGUuY3JlYXRlZCA9IG5ldyBEYXRlKCksIGUudXBkYXRlZCgpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGksIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdndmwnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ndmxfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLkdWTC5pc0luc3RhbmNlT2YodCkgfHwgKHQgPSBuZXcgYS5HVkwodCkpLCB0aGlzLmd2bF8gPSB0LCB0aGlzLnB1Ymxpc2hlclJlc3RyaWN0aW9ucy5ndmwgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnY21wSWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbXBJZF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoK3QpICYmIHQgPiAxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGguVENNb2RlbEVycm9yKCdjbXBJZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY21wSWRfID0gK3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdjbXBWZXJzaW9uJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY21wVmVyc2lvbl87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKE51bWJlci5pc0ludGVnZXIoK3QpICYmIHQgPiAtMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBoLlRDTW9kZWxFcnJvcignY21wVmVyc2lvbicsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY21wVmVyc2lvbl8gPSArdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSwgJ2NvbnNlbnRTY3JlZW4nLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zZW50U2NyZWVuXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoTnVtYmVyLmlzSW50ZWdlcigrdCkgJiYgdCA+IC0xKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGguVENNb2RlbEVycm9yKCdjb25zZW50U2NyZWVuJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zZW50U2NyZWVuXyA9ICt0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnY29uc2VudExhbmd1YWdlJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc2VudExhbmd1YWdlXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zZW50TGFuZ3VhZ2VfID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSwgJ3B1Ymxpc2hlckNvdW50cnlDb2RlJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHVibGlzaGVyQ291bnRyeUNvZGVfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIS9eKFtBLXpdKXsyfSQvLnRlc3QodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBoLlRDTW9kZWxFcnJvcigncHVibGlzaGVyQ291bnRyeUNvZGUnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hlckNvdW50cnlDb2RlXyA9IHQudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSwgJ3ZlbmRvckxpc3RWZXJzaW9uJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3ZsID8gdGhpcy5ndmwudmVuZG9yTGlzdFZlcnNpb24gOiB0aGlzLnZlbmRvckxpc3RWZXJzaW9uXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID0gK3QgPj4gMCkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaC5UQ01vZGVsRXJyb3IoJ3ZlbmRvckxpc3RWZXJzaW9uJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZW5kb3JMaXN0VmVyc2lvbl8gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAncG9saWN5VmVyc2lvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmd2bCA/IHRoaXMuZ3ZsLnRjZlBvbGljeVZlcnNpb24gOiB0aGlzLnBvbGljeVZlcnNpb25fOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wb2xpY3lWZXJzaW9uXyA9IHBhcnNlSW50KHQsIDEwKSwgdGhpcy5wb2xpY3lWZXJzaW9uXyA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBoLlRDTW9kZWxFcnJvcigncG9saWN5VmVyc2lvbicsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAndmVyc2lvbicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb25fOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb25fID0gcGFyc2VJbnQodCwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnaXNTZXJ2aWNlU3BlY2lmaWMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1NlcnZpY2VTcGVjaWZpY187CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTZXJ2aWNlU3BlY2lmaWNfID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnByb3RvdHlwZSwgJ3VzZU5vblN0YW5kYXJkU3RhY2tzJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudXNlTm9uU3RhbmRhcmRTdGFja3NfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZU5vblN0YW5kYXJkU3RhY2tzXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUsICdzdXBwb3J0T09CJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VwcG9ydE9PQl87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydE9PQl8gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAncHVycG9zZU9uZVRyZWF0bWVudCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnB1cnBvc2VPbmVUcmVhdG1lbnRfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VPbmVUcmVhdG1lbnRfID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkucHJvdG90eXBlLnNldEFsbFZlbmRvckNvbnNlbnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52ZW5kb3JDb25zZW50cy5zZXQodGhpcy5ndmwudmVuZG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnVuc2V0QWxsVmVuZG9yQ29uc2VudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvckNvbnNlbnRzLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnNldEFsbFZlbmRvcnNEaXNjbG9zZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvcnNEaXNjbG9zZWQuc2V0KHRoaXMuZ3ZsLnZlbmRvcnMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51bnNldEFsbFZlbmRvcnNEaXNjbG9zZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvcnNEaXNjbG9zZWQuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuc2V0QWxsVmVuZG9yc0FsbG93ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZlbmRvcnNBbGxvd2VkLnNldCh0aGlzLmd2bC52ZW5kb3JzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudW5zZXRBbGxWZW5kb3JzQWxsb3dlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yc0FsbG93ZWQuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cy5zZXQodGhpcy5ndmwudmVuZG9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnVuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cy5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5zZXRBbGxQdXJwb3NlQ29uc2VudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VDb25zZW50cy5zZXQodGhpcy5ndmwucHVycG9zZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51bnNldEFsbFB1cnBvc2VDb25zZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVycG9zZUNvbnNlbnRzLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnNldEFsbFB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cy5zZXQodGhpcy5ndmwucHVycG9zZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51bnNldEFsbFB1cnBvc2VMZWdpdGltYXRlSW50ZXJlc3RzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cy5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5zZXRBbGxTcGVjaWFsRmVhdHVyZU9wdGlucyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbEZlYXR1cmVPcHRpbnMuc2V0KHRoaXMuZ3ZsLnNwZWNpYWxGZWF0dXJlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnVuc2V0QWxsU3BlY2lhbEZlYXR1cmVPcHRpbnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxGZWF0dXJlT3B0aW5zLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnNldEFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWxsVmVuZG9yQ29uc2VudHMoKSwgdGhpcy5zZXRBbGxQdXJwb3NlTGVnaXRpbWF0ZUludGVyZXN0cygpLCB0aGlzLnNldEFsbFNwZWNpYWxGZWF0dXJlT3B0aW5zKCksIHRoaXMuc2V0QWxsUHVycG9zZUNvbnNlbnRzKCksIHRoaXMuc2V0QWxsVmVuZG9yTGVnaXRpbWF0ZUludGVyZXN0cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51bnNldEFsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zZXRBbGxWZW5kb3JDb25zZW50cygpLCB0aGlzLnVuc2V0QWxsUHVycG9zZUxlZ2l0aW1hdGVJbnRlcmVzdHMoKSwgdGhpcy51bnNldEFsbFNwZWNpYWxGZWF0dXJlT3B0aW5zKCksIHRoaXMudW5zZXRBbGxQdXJwb3NlQ29uc2VudHMoKSwgdGhpcy51bnNldEFsbFZlbmRvckxlZ2l0aW1hdGVJbnRlcmVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnbnVtQ3VzdG9tUHVycG9zZXMnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMubnVtQ3VzdG9tUHVycG9zZXNfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgdGhpcy5jdXN0b21QdXJwb3NlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5rZXlzKHRoaXMuY3VzdG9tUHVycG9zZXMpLnNvcnQoZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiArdCAtICtpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHBhcnNlSW50KGkucG9wKCksIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm51bUN1c3RvbVB1cnBvc2VzXyA9IHBhcnNlSW50KHQsIDEwKSwgdGhpcy5udW1DdXN0b21QdXJwb3Nlc18gPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaC5UQ01vZGVsRXJyb3IoJ251bUN1c3RvbVB1cnBvc2VzJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLnByb3RvdHlwZS51cGRhdGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuY29uc2VudExhbmd1YWdlcyA9IGEuR1ZMLmNvbnNlbnRMYW5ndWFnZXMsIGk7CiAgICAgICAgICAgICAgICAgICAgfShyLkNsb25lYWJsZSk7CiAgICAgICAgICAgICAgICBpLlRDTW9kZWwgPSBjOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHMsIG4gPSB0aGlzICYmIHRoaXMuRXMgfHwgKHMgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX3Byb3RvX18gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9IHx8IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAodFtlXSA9IGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcyh0LCBpKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBpID8gT2JqZWN0LmNyZWF0ZShpKSA6IChlLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCBuZXcgZSgpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgciA9IHRoaXMgJiYgdGhpcy5vbyB8fCBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IChlIHx8IChlID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHMubmV4dCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ocy50aHJvdyh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZG9uZSA/IG4odC52YWx1ZSkgOiAoaSA9IHQudmFsdWUsIGkgaW5zdGFuY2VvZiBlID8gaSA6IG5ldyBlKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLnRoZW4oaCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKChzID0gcy5hcHBseSh0LCBpIHx8IFtdKSkubmV4dCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgaCA9IHRoaXMgJiYgdGhpcy5obyB8fCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcywgbiwgciwgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxICYgblswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5czogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBhKDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c6IGEoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm46IGEoMikKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIChyW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gMSwgcyAmJiAobiA9IDIgJiByWzBdID8gcy5yZXR1cm4gOiByWzBdID8gcy50aHJvdyB8fCAoKG4gPSBzLnJldHVybikgJiYgbi5jYWxsKHMpLCAwKSA6IHMubmV4dCkgJiYgIShuID0gbi5jYWxsKHMsIHJbMV0pKS5kb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHMgPSAwLCBuICYmIChyID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAmIHJbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCByWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgubGFiZWwrKywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sYWJlbCsrLCBzID0gclsxXSwgciA9IFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gaC5vcHMucG9wKCksIGgudHJ5cy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobiA9IChuID0gaC50cnlzKS5sZW5ndGggPiAwICYmIG5bbi5sZW5ndGggLSAxXSkgJiYgKDYgPT09IHJbMF0gfHwgMiA9PT0gclswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDMgPT09IHJbMF0gJiYgKCFuIHx8IHJbMV0gPiBuWzBdICYmIHJbMV0gPCBuWzNdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sYWJlbCA9IHJbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNiA9PT0gclswXSAmJiBoLmxhYmVsIDwgblsxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sYWJlbCA9IG5bMV0sIG4gPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgaC5sYWJlbCA8IG5bMl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgubGFiZWwgPSBuWzJdLCBoLm9wcy5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblsyXSAmJiBoLm9wcy5wb3AoKSwgaC50cnlzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGkuY2FsbCh0LCBoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDUgJiByWzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByWzBdID8gclsxXSA6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgYSA9IGUoNDEpLCBvID0gZSgzMyksIGMgPSBlKDE0OSksIHUgPSBlKDM1KSwgbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0LmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaXNSZWFkeV8gPSAhMSwgcy5pc0xhdGVzdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLmJhc2VVcmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5sYW5nXyA9IGkuREVGQVVMVF9MQU5HVUFHRSwgcy5pc1ZlbmRvckxpc3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wb3B1bGF0ZShlKSwgcy5yZWFkeVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG8uR1ZMRXJyb3IoJ211c3Qgc3BlY2lmeSBHVkwuYmFzZVVybCBiZWZvcmUgbG9hZGluZyBHVkwganNvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuQ0FDSEUuaGFzKHIpID8gKHMucG9wdWxhdGUoaS5DQUNIRS5nZXQocikpLCBzLnJlYWR5UHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpKSA6IChuICs9IGkudmVyc2lvbmVkRmlsZW5hbWUucmVwbGFjZSgnW1ZFUlNJT05dJywgciArICcnKSwgcy5yZWFkeVByb21pc2UgPSBzLmZldGNoSnNvbihuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuQ0FDSEUuaGFzKGkuTEFURVNUX0NBQ0hFX0tFWSkgPyAocy5wb3B1bGF0ZShpLkNBQ0hFLmdldChpLkxBVEVTVF9DQUNIRV9LRVkpKSwgcy5yZWFkeVByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKSkgOiAocy5pc0xhdGVzdCA9ICEwLCBzLnJlYWR5UHJvbWlzZSA9IHMuZmV0Y2hKc29uKG4gKyBpLmxhdGVzdEZpbGVuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihpLCB0KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdiYXNlVXJsJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVVybF87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXmh0dHBzPzpcL1wvdmVuZG9ybGlzdFwuY29uc2Vuc3VcLm9yZ1wvLy50ZXN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgby5HVkxFcnJvcignSW52YWxpZCBiYXNlVXJsISAgWW91IG1heSBub3QgcHVsbCBkaXJlY3RseSBmcm9tIHZlbmRvcmxpc3QuY29uc2Vuc3Uub3JnIGFuZCBtdXN0IHByb3ZpZGUgeW91ciBvd24gY2FjaGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmxlbmd0aCA+IDAgJiYgJy8nICE9PSB0W3QubGVuZ3RoIC0gMV0gJiYgKHQgKz0gJy8nKSwgdGhpcy5iYXNlVXJsXyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmVtcHR5TGFuZ3VhZ2VDYWNoZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCAmJiBpLkxBTkdVQUdFX0NBQ0hFLnNpemUgPiAwID8gKGkuTEFOR1VBR0VfQ0FDSEUgPSBuZXcgTWFwKCksIGUgPSAhMCkgOiAnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiB0aGlzLmNvbnNlbnRMYW5ndWFnZXMuaGFzKHQudG9VcHBlckNhc2UoKSkgJiYgKGkuTEFOR1VBR0VfQ0FDSEUuZGVsZXRlKHQudG9VcHBlckNhc2UoKSksIGUgPSAhMCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuZW1wdHlDYWNoZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodCkgJiYgdCA+PSAwID8gKGkuQ0FDSEUuZGVsZXRlKHQpLCBlID0gITApIDogdm9pZCAwID09PSB0ICYmIChpLkNBQ0hFID0gbmV3IE1hcCgpLCBlID0gITApLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5jYWNoZUxhbmd1YWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5MQU5HVUFHRV9DQUNIRS5oYXModGhpcy5sYW5nXykgfHwgaS5MQU5HVUFHRV9DQUNIRS5zZXQodGhpcy5sYW5nXywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiB0aGlzLnB1cnBvc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3NlczogdGhpcy5zcGVjaWFsUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEZlYXR1cmVzOiB0aGlzLnNwZWNpYWxGZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3M6IHRoaXMuc3RhY2tzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZmV0Y2hKc29uID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgodGhpcywgZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnRyeXMucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgaSA9IHRoaXMucG9wdWxhdGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuSnNvbi5mZXRjaCh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYXBwbHkodGhpcywgW3Muc2VudCgpXSksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGUgPSBzLnNlbnQoKSwgbmV3IG8uR1ZMRXJyb3IoZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldEpzb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsU3BlY2lmaWNhdGlvblZlcnNpb246IHRoaXMuZ3ZsU3BlY2lmaWNhdGlvblZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTGlzdFZlcnNpb246IHRoaXMudmVuZG9yTGlzdFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNmUG9saWN5VmVyc2lvbjogdGhpcy50Y2ZQb2xpY3lWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVcGRhdGVkOiB0aGlzLmxhc3RVcGRhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2VzOiB0aGlzLnB1cnBvc2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxQdXJwb3NlczogdGhpcy5zcGVjaWFsUHVycG9zZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbEZlYXR1cmVzOiB0aGlzLnNwZWNpYWxGZWF0dXJlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3M6IHRoaXMuc3RhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcnM6IHRoaXMuZnVsbFZlbmRvckxpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuY2hhbmdlTGFuZ3VhZ2UgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcywgbiwgciwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaCh0aGlzLCBmdW5jdGlvbiAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSB0LnRvVXBwZXJDYXNlKCksICFpLmNvbnNlbnRMYW5ndWFnZXMuaGFzKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHRoaXMubGFuZ18pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sYW5nXyA9IGUsICFpLkxBTkdVQUdFX0NBQ0hFLmhhcyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiBpbiBzID0gaS5MQU5HVUFHRV9DQUNIRS5nZXQoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oYXNPd25Qcm9wZXJ0eShuKSAmJiAodGhpc1tuXSA9IHNbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBpLmJhc2VVcmwgKyBpLmxhbmd1YWdlRmlsZW5hbWUucmVwbGFjZSgnW0xBTkddJywgdCksIGgubGFiZWwgPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC50cnlzLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hKc29uKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5zZW50KCksIHRoaXMuY2FjaGVMYW5ndWFnZSgpLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhID0gaC5zZW50KCksIG5ldyBvLkdWTEVycm9yKCd1bmFibGUgdG8gbG9hZCBsYW5ndWFnZTogJyArIGEubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgby5HVkxFcnJvcigndW5zdXBwb3J0ZWQgbGFuZ3VhZ2UgJyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnbGFuZ3VhZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sYW5nXzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkucHJvdG90eXBlLmlzVmVuZG9yTGlzdCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSB0ICYmIHZvaWQgMCAhPT0gdC52ZW5kb3JzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5wb3B1bGF0ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1cnBvc2VzID0gdC5wdXJwb3NlcywgdGhpcy5zcGVjaWFsUHVycG9zZXMgPSB0LnNwZWNpYWxQdXJwb3NlcywgdGhpcy5mZWF0dXJlcyA9IHQuZmVhdHVyZXMsIHRoaXMuc3BlY2lhbEZlYXR1cmVzID0gdC5zcGVjaWFsRmVhdHVyZXMsIHRoaXMuc3RhY2tzID0gdC5zdGFja3MsIHRoaXMuaXNWZW5kb3JMaXN0KHQpICYmICh0aGlzLmd2bFNwZWNpZmljYXRpb25WZXJzaW9uID0gdC5ndmxTcGVjaWZpY2F0aW9uVmVyc2lvbiwgdGhpcy50Y2ZQb2xpY3lWZXJzaW9uID0gdC50Y2ZQb2xpY3lWZXJzaW9uLCB0aGlzLnZlbmRvckxpc3RWZXJzaW9uID0gdC52ZW5kb3JMaXN0VmVyc2lvbiwgdGhpcy5sYXN0VXBkYXRlZCA9IHQubGFzdFVwZGF0ZWQsICdzdHJpbmcnID09IHR5cGVvZiB0aGlzLmxhc3RVcGRhdGVkICYmICh0aGlzLmxhc3RVcGRhdGVkID0gbmV3IERhdGUodGhpcy5sYXN0VXBkYXRlZCkpLCB0aGlzLnZlbmRvcnNfID0gdC52ZW5kb3JzLCB0aGlzLmZ1bGxWZW5kb3JMaXN0ID0gdC52ZW5kb3JzLCB0aGlzLm1hcFZlbmRvcnMoKSwgdGhpcy5pc1JlYWR5XyA9ICEwLCB0aGlzLmlzTGF0ZXN0ICYmIGkuQ0FDSEUuc2V0KGkuTEFURVNUX0NBQ0hFX0tFWSwgdGhpcy5nZXRKc29uKCkpLCBpLkNBQ0hFLmhhcyh0aGlzLnZlbmRvckxpc3RWZXJzaW9uKSB8fCBpLkNBQ0hFLnNldCh0aGlzLnZlbmRvckxpc3RWZXJzaW9uLCB0aGlzLmdldEpzb24oKSkpLCB0aGlzLmNhY2hlTGFuZ3VhZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUubWFwVmVuZG9ycyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5UHVycG9zZVZlbmRvck1hcCA9IHt9LCB0aGlzLmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXAgPSB7fSwgdGhpcy5ieUZlYXR1cmVWZW5kb3JNYXAgPSB7fSwgdGhpcy5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwID0ge30sIE9iamVjdC5rZXlzKHRoaXMucHVycG9zZXMpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJ5UHVycG9zZVZlbmRvck1hcFt0XSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnSW50OiBuZXcgU2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnQ6IG5ldyBTZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxleGlibGU6IG5ldyBTZXQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXModGhpcy5zcGVjaWFsUHVycG9zZXMpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXBbdF0gPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXModGhpcy5mZWF0dXJlcykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYnlGZWF0dXJlVmVuZG9yTWFwW3RdID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5rZXlzKHRoaXMuc3BlY2lhbEZlYXR1cmVzKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5ieVNwZWNpYWxGZWF0dXJlVmVuZG9yTWFwW3RdID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEFycmF5LmlzQXJyYXkodCkgfHwgKHQgPSBPYmplY3Qua2V5cyh0aGlzLmZ1bGxWZW5kb3JMaXN0KS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gK3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMudmVuZG9ySWRzID0gbmV3IFNldCh0KSwgdGhpcy52ZW5kb3JzXyA9IHQucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBpLnZlbmRvcnNfWycnICsgZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgJiYgdm9pZCAwID09PSBzLmRlbGV0ZWREYXRlICYmIChzLnB1cnBvc2VzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5ieVB1cnBvc2VWZW5kb3JNYXBbdCArICcnXS5jb25zZW50LmFkZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5zcGVjaWFsUHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJ5U3BlY2lhbFB1cnBvc2VWZW5kb3JNYXBbdCArICcnXS5hZGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMubGVnSW50UHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJ5UHVycG9zZVZlbmRvck1hcFt0ICsgJyddLmxlZ0ludC5hZGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMuZmxleGlibGVQdXJwb3NlcyAmJiBzLmZsZXhpYmxlUHVycG9zZXMuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmJ5UHVycG9zZVZlbmRvck1hcFt0ICsgJyddLmZsZXhpYmxlLmFkZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5mZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYnlGZWF0dXJlVmVuZG9yTWFwW3QgKyAnJ10uYWRkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzLnNwZWNpYWxGZWF0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYnlTcGVjaWFsRmVhdHVyZVZlbmRvck1hcFt0ICsgJyddLmFkZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdFtlXSA9IHMpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5nZXRGaWx0ZXJlZFZlbmRvcnMgPSBmdW5jdGlvbiAodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCByID0gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHQuc2xpY2UoMSksIGggPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoJ3B1cnBvc2UnID09PSB0ICYmIGUgPyB0aGlzWydieScgKyByICsgJ1ZlbmRvck1hcCddW2kgKyAnJ11bZV0gOiB0aGlzWydieScgKyAocyA/ICdTcGVjaWFsJyA6ICcnKSArIHIgKyAnVmVuZG9yTWFwJ11baSArICcnXSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhbdCArICcnXSA9IG4udmVuZG9yc1t0ICsgJyddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoQ29uc2VudFB1cnBvc2UgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgdCwgJ2NvbnNlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhMZWdJbnRQdXJwb3NlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkVmVuZG9ycygncHVycG9zZScsIHQsICdsZWdJbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhGbGV4aWJsZVB1cnBvc2UgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgdCwgJ2ZsZXhpYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoU3BlY2lhbFB1cnBvc2UgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRWZW5kb3JzKCdwdXJwb3NlJywgdCwgdm9pZCAwLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldFZlbmRvcnNXaXRoRmVhdHVyZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoJ2ZlYXR1cmUnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZ2V0VmVuZG9yc1dpdGhTcGVjaWFsRmVhdHVyZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZFZlbmRvcnMoJ2ZlYXR1cmUnLCB0LCB2b2lkIDAsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAndmVuZG9ycycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlbmRvcnNfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5wcm90b3R5cGUubmFycm93VmVuZG9yc1RvID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwVmVuZG9ycyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLCAnaXNSZWFkeScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzUmVhZHlfOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGkodGhpcy5nZXRKc29uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmlzSW5zdGFuY2VPZiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdC5uYXJyb3dWZW5kb3JzVG87CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuTEFOR1VBR0VfQ0FDSEUgPSBuZXcgTWFwKCksIGkuQ0FDSEUgPSBuZXcgTWFwKCksIGkuTEFURVNUX0NBQ0hFX0tFWSA9IDAsIGkuREVGQVVMVF9MQU5HVUFHRSA9ICdFTicsIGkuY29uc2VudExhbmd1YWdlcyA9IG5ldyB1LkNvbnNlbnRMYW5ndWFnZXMoKSwgaS5sYXRlc3RGaWxlbmFtZSA9ICd2ZW5kb3ItbGlzdC5qc29uJywgaS52ZXJzaW9uZWRGaWxlbmFtZSA9ICdhcmNoaXZlcy92ZW5kb3ItbGlzdC12W1ZFUlNJT05dLmpzb24nLCBpLmxhbmd1YWdlRmlsZW5hbWUgPSAncHVycG9zZXMtW0xBTkddLmpzb24nLCBpOwogICAgICAgICAgICAgICAgICAgIH0oYS5DbG9uZWFibGUpOwogICAgICAgICAgICAgICAgaS5HVkwgPSBsOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksICdfJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hYnNDYWxsID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaC53aXRoQ3JlZGVudGlhbHMgPSBlLCBoLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgucmVhZHlTdGF0ZSA9PSBYTUxIdHRwUmVxdWVzdC5ET05FKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaC5zdGF0dXMgPj0gMjAwICYmIGguc3RhdHVzIDwgMzAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGgucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IEpTT04ucGFyc2UodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgRXJyb3IoJ0hUVFAgU3RhdHVzOiAnICsgaC5zdGF0dXMgKyAnIHJlc3BvbnNlIHR5cGU6ICcgKyBoLnJlc3BvbnNlVHlwZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGguYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgRXJyb3IoJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGguYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgRXJyb3IoJ2Fib3J0ZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbnVsbCA9PT0gaSA/IGgub3BlbignR0VUJywgdCwgITApIDogaC5vcGVuKCdQT1NUJywgdCwgITApLCBoLnJlc3BvbnNlVHlwZSA9ICdqc29uJywgaC50aW1lb3V0ID0gcywgaC5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgRXJyb3IoJ1RpbWVvdXQgJyArIHMgKyAnbXMgJyArIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGguc2VuZChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wb3N0ID0gZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSAmJiAoZSA9ICExKSwgdm9pZCAwID09PSBzICYmIChzID0gMCksIHRoaXMuYWJzQ2FsbCh0LCBKU09OLnN0cmluZ2lmeShpKSwgZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5mZXRjaCA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGkgJiYgKGkgPSAhMSksIHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApLCB0aGlzLmFic0NhbGwodCwgbnVsbCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGkuSnNvbiA9IHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcyA9IGUoMTUxKSwgbiA9IHMuZGVjb2RlQml0c1RvSWRzLCByID0gcy5kZWNvZGVGcm9tQmFzZTY0OwogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIGRlY29kZUNvbnNlbnRTdHJpbmc6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcih0KSwgZSA9IGkudmVyc2lvbiwgcyA9IGkuY21wSWQsIGggPSBpLnZlbmRvckxpc3RWZXJzaW9uLCBhID0gaS5wdXJwb3NlSWRCaXRTdHJpbmcsIG8gPSBpLm1heFZlbmRvcklkLCBjID0gaS5jcmVhdGVkLCB1ID0gaS5sYXN0VXBkYXRlZCwgbCA9IGkuaXNSYW5nZSwgZCA9IGkuZGVmYXVsdENvbnNlbnQsIGYgPSBpLnZlbmRvcklkQml0U3RyaW5nLCBwID0gaS52ZW5kb3JSYW5nZUxpc3QsIGIgPSBpLmNtcFZlcnNpb24sIHYgPSBpLmNvbnNlbnRTY3JlZW4sIG0gPSBpLmNvbnNlbnRMYW5ndWFnZSwgZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcElkOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckxpc3RWZXJzaW9uOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRQdXJwb3NlSWRzOiBuKGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFZlbmRvcklkOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFVwZGF0ZWQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wVmVyc2lvbjogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U2NyZWVuOiB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRMYW5ndWFnZTogbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gcC5yZWR1Y2UoZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gaS5pc1JhbmdlLCBzID0gaS5zdGFydFZlbmRvcklkLCBuID0gaS5lbmRWZW5kb3JJZCwgciA9IGUgPyBuIDogcywgaCA9IHM7IGggPD0gcjsgaCArPSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2hdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmFsbG93ZWRWZW5kb3JJZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHcgPSAxOyB3IDw9IG87IHcgKz0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCAmJiAheVt3XSB8fCAhZCAmJiB5W3ddKSAmJiAtMSA9PT0gZy5hbGxvd2VkVmVuZG9ySWRzLmluZGV4T2YodykgJiYgZy5hbGxvd2VkVmVuZG9ySWRzLnB1c2godyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5hbGxvd2VkVmVuZG9ySWRzID0gbihmKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBzID0gZSgxNTIpLCBuID0gZSgxNTQpLCByID0gbi52ZXJzaW9uTnVtQml0cywgaCA9IG4udmVuZG9yVmVyc2lvbk1hcDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludCh0LnN1YnN0cihpLCBlKSwgMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoMTAwICogYSh0LCBpLCBlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGEodCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoaSArIDY1KS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0LnN1YnN0cihpLCBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhzLnNsaWNlKDAsIGUgLyAyKSkgKyBjKHMuc2xpY2UoZSAvIDIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5pbnB1dCwgZSA9IHQub3V0cHV0LCBzID0gdC5zdGFydFBvc2l0aW9uLCBuID0gdC5maWVsZCwgciA9IG4udHlwZSwgaCA9IG4ubnVtQml0cywgYyA9IG4uZGVjb2RlciwgbCA9IG4udmFsaWRhdG9yLCBmID0gbi5saXN0Q291bnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGwgJiYgIWwoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5ld1Bvc2l0aW9uOiBzIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGMpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKGksIGUsIHMpOwogICAgICAgICAgICAgICAgICAgIHZhciBwLCBiLCB2ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaCA/IGgoZSkgOiBoOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2ludCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGZpZWxkVmFsdWU6IGEoaSwgcywgdikgfTsKICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZmllbGRWYWx1ZTogKHAgPSBpLCBiID0gcywgMSA9PT0gcGFyc2VJbnQocC5zdWJzdHIoYiwgMSksIDIpKSB9OwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGUnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBmaWVsZFZhbHVlOiBvKGksIHMsIHYpIH07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYml0cyc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGZpZWxkVmFsdWU6IGkuc3Vic3RyKHMsIHYpIH07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGlzdCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbiA/IHIgPSBuKGkpIDogJ251bWJlcicgPT0gdHlwZW9mIG4gJiYgKHIgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGggPSBlLCBhID0gW10sIG8gPSAwOyBvIDwgcjsgbyArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogcy5maWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb246IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gYy5uZXdQb3NpdGlvbiwgYS5wdXNoKGMuZGVjb2RlZE9iamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWU6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb246IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgZSwgcywgbiwgZik7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbGFuZ3VhZ2UnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBmaWVsZFZhbHVlOiB1KGksIHMsIHYpIH07CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50U3RyaW5nIC0gVW5rbm93biBmaWVsZCB0eXBlICcgKyByICsgJyBmb3IgZGVjb2RpbmcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHQuaW5wdXQsIGUgPSB0LmZpZWxkcywgcyA9IHQuc3RhcnRQb3NpdGlvbiwgbiA9IHZvaWQgMCA9PT0gcyA/IDAgOiBzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRPYmplY3Q6IGUucmVkdWNlKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGUubmFtZSwgciA9IGUubnVtQml0cywgaCA9IGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhID0gaC5maWVsZFZhbHVlLCBvID0gaC5uZXdQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGEgJiYgKHRbc10gPSBhKSwgdm9pZCAwICE9PSBvID8gbiA9IG8gOiAnbnVtYmVyJyA9PSB0eXBlb2YgciAmJiAobiArPSByKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pLAogICAgICAgICAgICAgICAgICAgICAgICBuZXdQb3NpdGlvbjogbgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgZGVjb2RlQml0c1RvSWRzOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zcGxpdCgnJykucmVkdWNlKGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzEnID09PSBpICYmIC0xID09PSB0LmluZGV4T2YoZSArIDEpICYmIHQucHVzaChlICsgMSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlY29kZUZyb21CYXNlNjQ6IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB0OyBlLmxlbmd0aCAlIDQgIT0gMDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICs9ICc9JzsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgbywgYyA9IHMuZGVjb2RlKGUpLCB1ID0gJycsIGwgPSAwOyBsIDwgYy5sZW5ndGg7IGwgKz0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBjLmNoYXJDb2RlQXQobCkudG9TdHJpbmcoMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IChuID0gZiwgbyA9IDggLSBmLmxlbmd0aCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiAnMCcsIGUgPSAnJywgcyA9IDA7IHMgPCB0OyBzICs9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oTWF0aC5tYXgoMCwgbykpICsgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogaCwgZSA9IGEodCwgMCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgIT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25zZW50U3RyaW5nIC0gVW5rbm93biB2ZXJzaW9uIG51bWJlciBpbiB0aGUgc3RyaW5nIHRvIGRlY29kZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uc2VudFN0cmluZyAtIFVuc3VwcG9ydGVkIHZlcnNpb24gJyArIGUgKyAnIGluIHRoZSBzdHJpbmcgdG8gZGVjb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBpW2VdLmZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZGVjb2RlZE9iamVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSh1LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgKGZ1bmN0aW9uICh0LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gaSwgYSA9ICh0ICYmIHQuZXhwb3J0cywgJ29iamVjdCcgPT0gdHlwZW9mIHMgJiYgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2xvYmFsICE9PSBhICYmIGEud2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAoby5wcm90b3R5cGUgPSBuZXcgRXJyb3IoKSkubmFtZSA9ICdJbnZhbGlkQ2hhcmFjdGVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1ID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nLCBsID0gL1tcdFxuXGZcciBdL2csIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gU3RyaW5nKHQpLCAvW15cMC1ceEZGXS8udGVzdCh0KSAmJiBjKCdUaGUgc3RyaW5nIHRvIGJlIGVuY29kZWQgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIG9mIHRoZSBMYXRpbjEgcmFuZ2UuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGksIGUsIHMsIG4sIHIgPSB0Lmxlbmd0aCAlIDMsIGggPSAnJywgYSA9IC0xLCBvID0gdC5sZW5ndGggLSByOyArK2EgPCBvOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0LmNoYXJDb2RlQXQoYSkgPDwgMTYsIGUgPSB0LmNoYXJDb2RlQXQoKythKSA8PCA4LCBzID0gdC5jaGFyQ29kZUF0KCsrYSksIGggKz0gdS5jaGFyQXQoKG4gPSBpICsgZSArIHMpID4+IDE4ICYgNjMpICsgdS5jaGFyQXQobiA+PiAxMiAmIDYzKSArIHUuY2hhckF0KG4gPj4gNiAmIDYzKSArIHUuY2hhckF0KDYzICYgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyID09IHIgPyAoaSA9IHQuY2hhckNvZGVBdChhKSA8PCA4LCBlID0gdC5jaGFyQ29kZUF0KCsrYSksIGggKz0gdS5jaGFyQXQoKG4gPSBpICsgZSkgPj4gMTApICsgdS5jaGFyQXQobiA+PiA0ICYgNjMpICsgdS5jaGFyQXQobiA8PCAyICYgNjMpICsgJz0nKSA6IDEgPT0gciAmJiAobiA9IHQuY2hhckNvZGVBdChhKSwgaCArPSB1LmNoYXJBdChuID4+IDIpICsgdS5jaGFyQXQobiA8PCA0ICYgNjMpICsgJz09JyksIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gKHQgPSBTdHJpbmcodCkucmVwbGFjZShsLCAnJykpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAlIDQgPT0gMCAmJiAoaSA9ICh0ID0gdC5yZXBsYWNlKC89PT8kLywgJycpKS5sZW5ndGgpLCAoaSAlIDQgPT0gMSB8fCAvW14rYS16QS1aMC05L10vLnRlc3QodCkpICYmIGMoJ0ludmFsaWQgY2hhcmFjdGVyOiB0aGUgc3RyaW5nIHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlLCBzLCBuID0gMCwgciA9ICcnLCBoID0gLTE7ICsraCA8IGk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHUuaW5kZXhPZih0LmNoYXJBdChoKSksIGUgPSBuICUgNCA/IDY0ICogZSArIHMgOiBzLCBuKysgJSA0ICYmIChyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjU1ICYgZSA+PiAoLTIgKiBuICYgNikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMC4xLjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IChuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0uY2FsbChpLCBlLCBpLCB0KSkgfHwgKHQuZXhwb3J0cyA9IG4pOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0uY2FsbCh0aGlzLCBlKDE1MykodCksIGUoNjIpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICB0LmV4cG9ydHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LndlYnBhY2tQb2x5ZmlsbCB8fCAodC5kZXByZWNhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wYXRocyA9IFtdLCB0LmNoaWxkcmVuIHx8ICh0LmNoaWxkcmVuID0gW10pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ2xvYWRlZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ2lkJywgewogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIHQud2VicGFja1BvbHlmaWxsID0gMSksIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIHZlcnNpb25OdW1CaXRzOiA2LAogICAgICAgICAgICAgICAgICAgIHZlbmRvclZlcnNpb25NYXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgMTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhRmllbGRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFzdFVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbXBJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtcFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zZW50U2NyZWVuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVuZG9yTGlzdFZlcnNpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiA2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAzNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbGFzdFVwZGF0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJpdHM6IDM2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjbXBJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY21wVmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29uc2VudFNjcmVlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiA2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb25zZW50TGFuZ3VhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGFuZ3VhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmVuZG9yTGlzdFZlcnNpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQml0czogMTIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3B1cnBvc2VJZEJpdFN0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaXRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQml0czogMjQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21heFZlbmRvcklkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJpdHM6IDE2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpc1JhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd2ZW5kb3JJZEJpdFN0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdiaXRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQml0czogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1heFZlbmRvcklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQuaXNSYW5nZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGVmYXVsdENvbnNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYm9vbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJpdHM6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlzUmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ251bUVudHJpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlzUmFuZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZlbmRvclJhbmdlTGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdENvdW50OiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubnVtRW50cmllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNSYW5nZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2lzUmFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzdGFydFZlbmRvcklkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1CaXRzOiAxNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZW5kVmVuZG9ySWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJpdHM6IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNSYW5nZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5jbnhfcmVwbGFjZUFsbCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQodCkuam9pbihpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLnIoaSk7CiAgICAgICAgICAgICAgICB2YXIgcywgbiA9IGUoNSksIHIgPSBlKDQ4KSwgaCA9IChlKDE1NSksIGUoMCkpLCBhID0gZSg3OSksIG8gPSBlKDIwKSwgYyA9IGUoMTYpLCB1ID0gZSgzMSksIGwgPSBlKDYpLCBkID0gZSg0KSwgZiA9IGUoMzYpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5EZXByZWNhdGlvbiA9ICdkZXByZWNhdGlvbicsIHQuSW50ZXJ2ZW50aW9uID0gJ2ludGVydmVudGlvbicsIHQuQ3Jhc2ggPSAnY3Jhc2gnOwogICAgICAgICAgICAgICAgfShzIHx8IChzID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IHAgPSAnSGVhdnlBZEludGVydmVudGlvbic7CiAgICAgICAgICAgICAgICBjbGFzcyBiIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmUgPSB0LCB0aGlzLmNvID0gaSwgdGhpcy51byA9IGUsIHRoaXMuZG8gPSAhMSwgdGhpcy5mbyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaWRkZW4nID09PSB0aGlzLmZlLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSAmJiB0aGlzLnBvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucG8gPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kbyB8fCAhdGhpcy5ibykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5iby50YWtlUmVjb3JkcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52byh0KSwgdGhpcy5kbyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnZvID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZpbHRlcigoe2JvZHk6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChudWxsID09PSAoaSA9IHQpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuaWQpID09PSBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jby50cmFja0hlYXZ5QWRJbnRlcnZlbnRpb24odGhpcy51byk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5tbygpICYmIHRoaXMueXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZS5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHRoaXMucG8pLCB0aGlzLmZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLmZvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbW8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZmUuUmVwb3J0aW5nT2JzZXJ2ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHlzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvID0gbmV3IHRoaXMuZmUuUmVwb3J0aW5nT2JzZXJ2ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZvKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlczogW3MuSW50ZXJ2ZW50aW9uXQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5iby5vYnNlcnZlKCksIHRoaXMuZmUuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCB0aGlzLnBvKSwgdGhpcy5mZS5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5mbyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgdiBleHRlbmRzIG8uYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5wbGF5ZXJNb2RlbCA9IGksIHRoaXMuYXBwID0gZSwgdGhpcy5IcyA9IHMsIHRoaXMueW8gPSBuLCB0aGlzLl9hcHBTZXR0aW5ncyA9IHIsIHRoaXMubWFjcm9FbGVtZW50cyA9IHsgcGxheWVyOiBbXSB9LCB0aGlzLndvID0gITEsIHRoaXMuT28gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ3t7ZGVzY3JpcHRpb259fScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ3t7dGl0bGV9fScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXI6ICd7e3BsYXllcn19JwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnhvID0gbnVsbCwgdGhpcy5TbyA9IDUwMCwgdGhpcy5jcmVhdGVFeHBlcmllbmNlKGksIHIpLCB0aGlzLmpvID0gbmV3IGIoaS5nbG9iYWwsIHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZSwgeyBoZWF2eUFkQmxvY2tUeXBlRW51bTogaC5Qcm90b0hlYXZ5QWRCbG9ja1R5cGVFbnVtLkdsb2JhbCB9KSwgdGhpcy5rbyA9IG5ldyBiKHdpbmRvdywgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLCB7IGhlYXZ5QWRCbG9ja1R5cGVFbnVtOiBoLlByb3RvSGVhdnlBZEJsb2NrVHlwZUVudW0uU2NyaXB0IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVUb0V2ZW50cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoYy5iLkRlc3Ryb3ksIHRoaXMuZXhwZXJpZW5jZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShjLmIuQ2FuU3RhcnQsIHRoaXMuZXhwZXJpZW5jZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShjLmMuU2Vzc2lvblJlbmRlcmVkLCB0aGlzLmV4cGVyaWVuY2UsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueW8ud2FzUGxheWVyUmVsb2FkZWQgfHwgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnRyYWNrU2Vzc2lvblJlbmRlcmVkKHRoaXMuSHMpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5jLlNlc3Npb25SZW5kZXJlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShjLmMuU2Vzc2lvblZpZXcsIHRoaXMuZXhwZXJpZW5jZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55by53YXNQbGF5ZXJJblZpZXcgfHwgKHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS50cmFja1Nlc3Npb25WaWV3YWJpbGl0eSgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5jLlNlc3Npb25WaWV3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QodS5hKSh0aGlzLmV4cGVyaWVuY2UuZXZlbnRzKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUodCwgdGhpcy5leHBlcmllbmNlLCBpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2VBcGkudHJpZ2dlcih0LCBpLnBheWxvYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVNYWNyb0NvbnRlbnQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudGV4dENvbnRlbnQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyTW9kZWwuY3NzICYmIHRoaXMuYXBwLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZS5hZGRDc3NTdHJpbmcodGhpcy5wbGF5ZXJNb2RlbC5jc3MsIGBjbngtY3VzdG9tLWNzcy0keyB0aGlzLmFwcC5jb25maWcuYXBwSWQgfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGNueD4keyB0IH08L2NueD5gLnJlcGxhY2UoL3tceyhbXn1dKyl9fS9nLCAnPGNueC1zcGFuPiQmPC9jbngtc3Bhbj4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQW8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4cGVyaWVuY2VDb250YWluZXIgPSB0aGlzLklvKCksIHRoaXMucGxheWVyTW9kZWwuaHRtbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuYXBwLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZS5jcmVhdGVFbGVtZW50QnlTdHJpbmcodGhpcy5fbyh0aGlzLnBsYXllck1vZGVsLmh0bWwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ28odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5tYWNyb0VsZW1lbnRzLnBsYXllclswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigncGxheWVyIG1hY3JvIHdhcyBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW5uZXJIVE1MID0gJycsIGkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5leHBlcmllbmNlQ29udGFpbmVyLCBpKSwgaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpLCBPYmplY3QobC5jKSh0LmNoaWxkcmVuKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyTW9kZWwudGFyZ2V0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsIHRoaXMucGxheWVyTW9kZWwudGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheWVyTW9kZWwudGFyZ2V0Q29udGFpbmVyLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuZXhwZXJpZW5jZUNvbnRhaW5lciwgdGhpcy5wbGF5ZXJNb2RlbC50YXJnZXRDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXllck1vZGVsLnRhcmdldENvbnRhaW5lci5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMucGxheWVyTW9kZWwudGFyZ2V0Q29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSW8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmFwcC5jb25maWcuaXNNb2JpbGUgPyBkLmcuTW9iaWxlIDogZC5nLkRlc2t0b3A7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8Y254IGNsYXNzPSIkeyBkLmIuTWFpbkNvbnRhaW5lciB9ICR7IHQgfSAkeyB0aGlzLlRvIH0iPjwvY254PmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChsLmMpKHQuY2hpbGRyZW4pLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgdGhpcy5Dbyh0KSwgT2JqZWN0LmtleXModGhpcy5PbykuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5Pb1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRleHRDb250ZW50LmluZGV4T2YoZSkgPiAtMSAmJiB0aGlzLlBvKGksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBQbyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFjcm9FbGVtZW50c1t0XSB8fCAodGhpcy5tYWNyb0VsZW1lbnRzW3RdID0gW10pLCB0aGlzLm1hY3JvRWxlbWVudHNbdF0ucHVzaChpKSwgaS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBNbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdGhpcy54byAmJiAoY2xlYXJJbnRlcnZhbCh0aGlzLnhvKSwgdGhpcy54byA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JbigpLCB0aGlzLkFvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmFwcC5jb25maWcuZGV2aWNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1N1cHBvcnRlZEJyZWFrcG9pbnQoaSkgPyAodGhpcy5zdWJzY3JpYmVUb0V2ZW50cygpLCB0aGlzLmV4cGVyaWVuY2UuRW8odGhpcy5wbGF5ZXJNb2RlbCwgdGhpcy5hcHAsIHRoaXMuZXhwZXJpZW5jZUNvbnRhaW5lciwgdCksIHRoaXMueG8gPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvID8gdGhpcy5NbygpIDogdGhpcy5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLmlzRGV0YWNoZWRGcm9tRE9NKHRoaXMuZXhwZXJpZW5jZUNvbnRhaW5lcikgJiYgKHRoaXMuZGVzdHJveSgpLCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3BsYXllcl9yZW1vdmVkX2Zyb21fRE9NJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlNvKSwgITApIDogKHRoaXMuZGVzdHJveSgpLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFwaU1ldGhvZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGVyaWVuY2VBcGkuZ2V0QXBpTWV0aG9kcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgcGxheWVyQ29udGFpbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHBlcmllbmNlQ29udGFpbmVyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hLnBsYXllckRlc3Ryb3llZCgpLCB0aGlzLndvID0gITAsIHRoaXMuTW8oKSwgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLmRlc3Ryb3koKSwgdGhpcy5hcHAuc2VydmljZXMuUmVzaXplT2JzZXJ2ZXIuZGVzdHJveSgpLCB0aGlzLmFwcC5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2UuZGVzdHJveSgpLCB0aGlzLmFwcC5zZXJ2aWNlcy5JbnRlcmFjdGlvblNlcnZpY2UuZGVzdHJveSgpLCB0aGlzLmV4cGVyaWVuY2VBcGkuc2V0RGVzdHJveWVkKCksIHRoaXMudW5zdWJzY3JpYmVBbGwodGhpcy5leHBlcmllbmNlKSwgdGhpcy5leHBlcmllbmNlICYmICh0aGlzLmV4cGVyaWVuY2UuZGVzdHJveSgpLCB0aGlzLmV4cGVyaWVuY2UgPSBudWxsKSwgdGhpcy5leHBlcmllbmNlQ29udGFpbmVyLnBhcmVudE5vZGUgJiYgdGhpcy5leHBlcmllbmNlQ29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5leHBlcmllbmNlQ29udGFpbmVyKSwgdGhpcy5qby5kZXN0cm95KCksIHRoaXMua28uZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSZW5kZXJlcl9kZXN0cm95JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBtID0gewogICAgICAgICAgICAgICAgICAgIFBsYXk6ICdwbGF5JywKICAgICAgICAgICAgICAgICAgICBQYXVzZTogJ3BhdXNlJywKICAgICAgICAgICAgICAgICAgICBNdXRlOiAnbXV0ZScsCiAgICAgICAgICAgICAgICAgICAgVW5tdXRlOiAndW5tdXRlJywKICAgICAgICAgICAgICAgICAgICBDYW5wbGF5OiAnY2FucGxheScsCiAgICAgICAgICAgICAgICAgICAgRW5kZWQ6ICdlbmRlZCcsCiAgICAgICAgICAgICAgICAgICAgVGltZXVwZGF0ZTogJ3RpbWV1cGRhdGUnLAogICAgICAgICAgICAgICAgICAgIFNlZWtpbmc6ICdzZWVraW5nJywKICAgICAgICAgICAgICAgICAgICBTZWVrZWQ6ICdzZWVrZWQnLAogICAgICAgICAgICAgICAgICAgIFZvbHVtZWNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgRHVyYXRpb25jaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgRnVsbHNjcmVlbjogJ2Z1bGxzY3JlZW4nLAogICAgICAgICAgICAgICAgICAgIExvYWRlZERhdGE6ICdsb2FkZWRkYXRhJywKICAgICAgICAgICAgICAgICAgICBMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJywKICAgICAgICAgICAgICAgICAgICBFcnJvcjogJ2Vycm9yJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBnLCB5LCB3OwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LkF1dG8gPSAwXSA9ICdBdXRvJywgdFt0LlN0cmljdCA9IDFdID0gJ1N0cmljdCc7CiAgICAgICAgICAgICAgICB9KGcgfHwgKGcgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5QbGF5aW5nU3RhdGUgPSAwXSA9ICdQbGF5aW5nU3RhdGUnLCB0W3QuUGF1c2VkU3RhdGUgPSAxXSA9ICdQYXVzZWRTdGF0ZScsIHRbdC5QcmVyb2xsU3RhdGUgPSAyXSA9ICdQcmVyb2xsU3RhdGUnLCB0W3QuUG9zdHJvbGxTdGF0ZSA9IDNdID0gJ1Bvc3Ryb2xsU3RhdGUnLCB0W3QuU3RvcHBlZFN0YXRlID0gNF0gPSAnU3RvcHBlZFN0YXRlJywgdFt0LlJlcGxheVN0YXRlID0gNV0gPSAnUmVwbGF5U3RhdGUnLCB0W3QuSGlkZGVuU3RhdGUgPSA2XSA9ICdIaWRkZW5TdGF0ZScsIHRbdC5CdWZmZXJpbmdTdGF0ZSA9IDddID0gJ0J1ZmZlcmluZ1N0YXRlJywgdFt0LkxpdmVTdHJlYW1TdGFydGluZyA9IDhdID0gJ0xpdmVTdHJlYW1TdGFydGluZycsIHRbdC5MaXZlU3RyZWFtRW5kZWQgPSA5XSA9ICdMaXZlU3RyZWFtRW5kZWQnLCB0W3QuTGl2ZVN0cmVhbVN0b3BwZWQgPSAxMF0gPSAnTGl2ZVN0cmVhbVN0b3BwZWQnLCB0W3QuTGl2ZVN0cmVhbU5vdFN1cHBvcnRlZCA9IDExXSA9ICdMaXZlU3RyZWFtTm90U3VwcG9ydGVkJzsKICAgICAgICAgICAgICAgIH0oeSB8fCAoeSA9IHt9KSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5IMjY0ID0gJ2gyNjQnLCB0LkhldmMgPSAnaGV2Yyc7CiAgICAgICAgICAgICAgICB9KHcgfHwgKHcgPSB7fSkpOwogICAgICAgICAgICAgICAgY29uc3QgTyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUGxheUVycm9yOiAncGxheUVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VmlkZW86ICduZXdWaWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmluZzogJ2J1ZmZlcmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkOiAnYnVmZmVyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBMZXZlbFN3aXRjaGluZzogJ2xldmVsU3dpdGNoaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgRW5kT2ZTdHJlYW06ICdlbmRPZlN0cmVhbScsCiAgICAgICAgICAgICAgICAgICAgICAgIExpdmVTdHJlYW1Ob3RQbGF5YWJsZTogJ2xpdmVOb3RQbGF5YWJsZScKICAgICAgICAgICAgICAgICAgICB9LCB4ID0gewogICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2U6ICdWaWRlb1F1YWxpdHlDaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudFF1YWxpdHk6ICdDdXJyZW50UXVhbGl0eScsCiAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlZDogJ1F1YWxpdHlMaXN0TG9hZGVkJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgUzsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Mb3cxNDRwID0gMTQ0XSA9ICdMb3cxNDRwJywgdFt0LkxvdzI0MHAgPSAyNDBdID0gJ0xvdzI0MHAnLCB0W3QuTWVkaXVtMzYwcCA9IDM2MF0gPSAnTWVkaXVtMzYwcCcsIHRbdC5NZWRpdW00ODBwID0gNDgwXSA9ICdNZWRpdW00ODBwJywgdFt0LkhpZ2g3MjBwID0gNzIwXSA9ICdIaWdoNzIwcCcsIHRbdC5IaWdoMTA4MHAgPSAxMDgwXSA9ICdIaWdoMTA4MHAnOwogICAgICAgICAgICAgICAgfShTIHx8IChTID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IGogPSA3MjAsIGsgPSA1MDAwLCBfID0geyBOZXdUaHVtYm5haWw6ICdOZXdUaHVtYm5haWwnIH07CiAgICAgICAgICAgICAgICB2YXIgQSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgYy5hKSwgewogICAgICAgICAgICAgICAgICAgIEZpcnN0RnJhbWVQbGF5ZWQ6ICdmaXJzdEZyYW1lUGxheWVkJywKICAgICAgICAgICAgICAgICAgICBDb250ZW50UXVhcnRpbGVzOiAnY29udGVudFF1YXJ0aWxlcycsCiAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhVXBkYXRlOiAnbWVkaWFNZXRhVXBkYXRlJywKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VWaWRlbzogJ2NoYW5nZVZpZGVvJywKICAgICAgICAgICAgICAgICAgICBWaWRlb1F1ZXVlZDogJ3ZpZGVvUXVldWVkJwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBJID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgewogICAgICAgICAgICAgICAgICAgICAgICBWaWRlb1N0YXJ0ZWQ6ICd2aWRlb1N0YXJ0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NvbXBsZXRlZDI1OiAndmlkZW9Db21wbGV0ZWQyNScsCiAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ29tcGxldGVkNTA6ICd2aWRlb0NvbXBsZXRlZDUwJywKICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9Db21wbGV0ZWQ3NTogJ3ZpZGVvQ29tcGxldGVkNzUnLAogICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NvbXBsZXRlZDEwMDogJ3ZpZGVvQ29tcGxldGVkMTAwJywKICAgICAgICAgICAgICAgICAgICAgICAgTmV3VmlkZW86ICduZXdWaWRlbycKICAgICAgICAgICAgICAgICAgICB9KSwgeyBTdWJ0aXRsZXNWaXNpYmlsaXR5Q2hhbmdlZDogJ3N1YnRpdGxlc1Zpc2liaWxpdHlDaGFuZ2VkJyB9KSwgeyBQbGF5ZXJDbGlja2VkOiAncGxheWVyQ2xpY2tlZCcgfSksIHsgR2FsbGVyeUNhcmRDbGlja2VkOiAnZ2FsbGVyeUNhcmRDbGlja2VkJyB9KSwgQyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2VkOiAnY29sbGFwc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgQWRDeWNsZUNvbXBsZXRlOiAnYWRDeWNsZUNvbXBsZXRlJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgVCA9IGUoMik7CiAgICAgICAgICAgICAgICBjbGFzcyBQIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG8gPSB0LCB0aGlzLlJvID0gcywgdGhpcy5CbyA9IHRoaXMuRG8oZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIERvKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRbaV0gfHwgdFtoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpZHRoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuRm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgIT09IHRoaXMuY3VycmVudEJyZWFrcG9pbnRDbGFzcyAmJiAoT2JqZWN0KFQuSSkodGhpcy5MbywgdGhpcy5jdXJyZW50QnJlYWtwb2ludENsYXNzKSwgT2JqZWN0KFQuYSkodGhpcy5MbywgaSksIHRoaXMuY3VycmVudEJyZWFrcG9pbnRDbGFzcyA9IGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0ID49IHRoaXMuQm8ueHhsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUm8uWHhsOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHQgPj0gdGhpcy5Cby54bDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJvLlhsOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHQgPj0gdGhpcy5Cby5sZzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJvLkxnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHQgPj0gdGhpcy5Cby5tZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJvLk1kOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHQgPj0gdGhpcy5Cby5zbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJvLlNtOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHQgPj0gdGhpcy5Cby54czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJvLlhzOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUm8uWHhzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIE0gPSBlKDcpOwogICAgICAgICAgICAgICAgY29uc3QgRSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgeGw6IDcyMCwKICAgICAgICAgICAgICAgICAgICAgICAgbGc6IDMyMCwKICAgICAgICAgICAgICAgICAgICAgICAgbWQ6IDIwNCwKICAgICAgICAgICAgICAgICAgICAgICAgc206IDE0MiwKICAgICAgICAgICAgICAgICAgICAgICAgeHM6IDAKICAgICAgICAgICAgICAgICAgICB9LCBMID0gewogICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0RldmljZVR5cGUuRGVza3RvcF06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsOiA0NjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZzogMzg4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWQ6IDI0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtOiAxNDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0RldmljZVR5cGUuVGFibGV0XTogT2JqZWN0LmFzc2lnbih7fSwgRSksCiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lXTogT2JqZWN0LmFzc2lnbih7fSwgRSkKICAgICAgICAgICAgICAgICAgICB9LCBSID0gewogICAgICAgICAgICAgICAgICAgICAgICB4bDogNzIwLAogICAgICAgICAgICAgICAgICAgICAgICBsZzogMzIwLAogICAgICAgICAgICAgICAgICAgICAgICBtZDogMjA0LAogICAgICAgICAgICAgICAgICAgICAgICBzbTogMTQyLAogICAgICAgICAgICAgICAgICAgICAgICB4czogMAogICAgICAgICAgICAgICAgICAgIH0sIEIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGw6IDQ2OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxnOiAzODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDogMjQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc206IDE0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhzOiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5UYWJsZXRdOiBPYmplY3QuYXNzaWduKHt9LCBSKSwKICAgICAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9EZXZpY2VUeXBlLlNtYXJ0cGhvbmVdOiBPYmplY3QuYXNzaWduKHt9LCBSKQogICAgICAgICAgICAgICAgICAgIH0sIEQgPSAxNzYsIEYgPSAxNjAsIFYgPSAxNDQsIFUgPSAxMTIsICQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhsOiBSLnhsICsgRCwKICAgICAgICAgICAgICAgICAgICAgICAgbGc6IFIubGcgKyBGLAogICAgICAgICAgICAgICAgICAgICAgICBtZDogUi5tZCArIFYsCiAgICAgICAgICAgICAgICAgICAgICAgIHNtOiBSLnNtICsgVQogICAgICAgICAgICAgICAgICAgIH0sIE4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGw6IDQ2OCArIEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZzogMzg4ICsgRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1kOiAyNDggKyBWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc206IDE0MiArIFUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4czogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0RldmljZVR5cGUuVGFibGV0XTogT2JqZWN0LmFzc2lnbih7fSwgJCksCiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lXTogT2JqZWN0LmFzc2lnbih7fSwgJCkKICAgICAgICAgICAgICAgICAgICB9LCBIID0gewogICAgICAgICAgICAgICAgICAgICAgICBsZzogMzIwLAogICAgICAgICAgICAgICAgICAgICAgICBtZDogMjA0LAogICAgICAgICAgICAgICAgICAgICAgICBzbTogMAogICAgICAgICAgICAgICAgICAgIH0sIHEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGw6IDQ2OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxnOiAzODgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZDogMjQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc206IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9EZXZpY2VUeXBlLlRhYmxldF06IE9iamVjdC5hc3NpZ24oe30sIEgpLAogICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0RldmljZVR5cGUuU21hcnRwaG9uZV06IE9iamVjdC5hc3NpZ24oe30sIEgpCiAgICAgICAgICAgICAgICAgICAgfSwgeiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgeHhsOiAxMDgwLAogICAgICAgICAgICAgICAgICAgICAgICB4bDogMAogICAgICAgICAgICAgICAgICAgIH0sIFcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHhsOiA3MjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bDogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0RldmljZVR5cGUuVGFibGV0XTogT2JqZWN0LmFzc2lnbih7fSwgeiksCiAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lXTogT2JqZWN0LmFzc2lnbih7fSwgeikKICAgICAgICAgICAgICAgICAgICB9LCBHID0gewogICAgICAgICAgICAgICAgICAgICAgICBbTS5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW0uTGFuZHNjYXBlXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgW00uUHJvdG9HYWxsZXJ5U3R5bGVNb2RlLkRldGFpbGVkXTogVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5WaXN1YWxdOiBOCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFtNLlByb3RvR2FsbGVyeU9yaWVudGF0aW9uRW51bS5Qb3J0cmFpdF06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5EZXRhaWxlZF06IHEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuVmlzdWFsXTogQgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBKOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LkNhcmRDbGlja2VkID0gMF0gPSAnQ2FyZENsaWNrZWQnOwogICAgICAgICAgICAgICAgfShKIHx8IChKID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IFEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNjAsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogOTAKICAgICAgICAgICAgICAgICAgICB9LCBYID0gewogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogODAsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogODAKICAgICAgICAgICAgICAgICAgICB9LCBZID0gMywgSyA9ICdFWFBMT1JFIE1PUkUnOwogICAgICAgICAgICAgICAgY2xhc3MgWiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm8gPSB0LCB0aGlzLmpzID0gaSwgdGhpcy5VbyA9IDEuMiwgdGhpcy4kbyA9IDE2LCB0aGlzLk5vID0gJ25vcm1hbCcsIHRoaXMuSG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZU5hdGl2ZUNsYW1waW5nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnFvID0gITEsIHRoaXMuSG8gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuSG8pLCBlKSwgdGhpcy5xbyA9IHRoaXMuem8oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TGluZXModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhvLmxpbmVzID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhbXBlZFRleHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLldvID0gdC50cmltKCksIHRoaXMuR28gPSB0aGlzLmpzLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyhgPGNueC1zcGFuIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OmluaGVyaXQ7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDsiPiR7IHRoaXMuV28gfTwvY254LXNwYW4+YCksIHRoaXMuVm8uYXBwZW5kQ2hpbGQodGhpcy5Hbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLkpvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTGluZUNsYW1wX2dldE1heExpbmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5Rbyh0aGlzLkhvLmxpbmVzLCBpKSwgcyA9IHRoaXMuWG8oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5Hby5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIC0gMSA8PSBzID8gKHRoaXMuWW8oKSwgdGhpcy5XbykgOiB0aGlzLnFvID8gdm9pZCBPYmplY3QoVC5OKSh0aGlzLlZvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJraXRCb3hPcmllbnQ6ICd2ZXJ0aWNhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiAnLXdlYmtpdC1ib3gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Via2l0TGluZUNsYW1wOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy5Lbyh0aGlzLkdvLmZpcnN0Q2hpbGQsIHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6bygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5Iby51c2VOYXRpdmVDbGFtcGluZyAmJiB2b2lkIDAgIT09IHRoaXMuVm8uc3R5bGUud2Via2l0TGluZUNsYW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpvKHRoaXMuVm8pICogdCArICh0aGlzLnRjKHRoaXMuR28pICsgdGhpcy50Yyh0aGlzLlZvKSkgKyAodGhpcy5pYyh0aGlzLkdvKSArIHRoaXMuaWModGhpcy5WbykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodDogaX0gPSB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiBpID4gMCA/IE1hdGguY2VpbChpKSA6IHQucGFyZW50Tm9kZSA/IHRoaXMuZWModC5wYXJlbnROb2RlKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEpvKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5lYyh0aGlzLlZvKSwgaSA9IHRoaXMuWm8odGhpcy5WbyksIGUgPSB0aGlzLnRjKHRoaXMuR28pICsgdGhpcy50Yyh0aGlzLlZvKSwgcyA9IHRoaXMuaWModGhpcy5HbykgKyB0aGlzLmljKHRoaXMuVm8pLCBuID0gTWF0aC5mbG9vcigodCAtIGUgLSBzKSAvIGkgKyAwLjA1KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KG4sIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmpzLmdldEZvbnRTaXplUHJvcGVydHlWYWx1ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyBwYXJzZUludChpLCAxMCkgOiB0aGlzLiRvOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBabyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5qcy5nZXRMaW5lSGVpZ2h0UHJvcGVydHlWYWx1ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgaSAhPT0gdGhpcy5ObyB8fCAoaSA9IGAkeyB0aGlzLlVvICogdGhpcy5zYyh0KSB9YCksIHBhcnNlSW50KGksIDEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGModCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuanMuZ2V0UGFkZGluZ1RvcFByb3BlcnR5VmFsdWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpLCAxMCkgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWModCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuanMuZ2V0UGFkZGluZ0JvdHRvbVByb3BlcnR5VmFsdWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpLCAxMCkgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUW8odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA+IDAgPyAwID09PSBpID8gdCA6IE1hdGgubWluKHRoaXMuSG8ubGluZXMsIGkpIDogaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS28odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSAmJiAoZSA9IHQubm9kZVZhbHVlLnNwbGl0KCcgJykpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gWy4uLmVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5wb3AoKSwgdGhpcy5uYyh0LCBgJHsgcy5qb2luKCcgJykgfS4uLmApLCB0LnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0ID4gaSA/IHRoaXMuS28odCwgaSwgcykgOiAodGhpcy5ZbygpLCBgJHsgcy5qb2luKCcgJykgfS4uLmApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5jKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5ub2RlVmFsdWUgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBZbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Wby5pbm5lckhUTUwgPSAnJywgdGhpcy5HbyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHR0ID0gZSg4NiksIGl0ID0gZS5uKHR0KSwgZXQgPSBlKDUxKSwgc3QgPSBlLm4oZXQpLCBudCA9IGUoMjkpLCBydCA9IGUoMSksIGh0ID0gZSgxMCk7CiAgICAgICAgICAgICAgICB2YXIgYXQgPSBjbGFzcyBleHRlbmRzIG8uYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5tciA9IGksIHRoaXMucmMgPSBlLCB0aGlzLmhjID0gcywgdGhpcy5XbiA9IG4sIHRoaXMuYnIgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduLm1ldGFkYXRhLnRpdGxlICYmIHRoaXMuYWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5vYyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBKW0ouQ2FyZENsaWNrZWRdLCB7IHBheWxvYWQ6IHRoaXMuV24uaWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudWMgPSB0aGlzLnJjLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyh0aGlzLmxjKCkpLCB0aGlzLmRjID0gdGhpcy51Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuby5DYXJkSW1hZ2UpWzBdLCB0aGlzLmZjID0gdGhpcy51Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuby5DYXJkVGV4dClbMF0sIHRoaXMucGMgPSB0aGlzLnVjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZC5vLkNhcmRUZXh0Q29udGFpbmVyKVswXSwgdGhpcy5Xbi50aXRsZUZvbnQgJiYgT2JqZWN0KFQuTikodGhpcy5wYywgeyAnZm9udC1mYW1pbHknOiB0aGlzLlduLnRpdGxlRm9udCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHRoaXMucmMuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYy5hcHBlbmRDaGlsZChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuV24ubWV0YWRhdGEuZ2V0VGh1bWJuYWlsVXJsKHRoaXMuYmMoKS53aWR0aCwgdGhpcy5iYygpLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QocnQuaCkoaCkgJiYgKHIuc3JjID0gaCksIHIuYWx0ID0gT2JqZWN0KHJ0LmEpKHRoaXMuV24ubWV0YWRhdGEuYWx0VGV4dCkgPyB0aGlzLlduLm1ldGFkYXRhLmFsdFRleHQgOiAnJywgdGhpcy5Xbi5zdHlsZSA9PT0gTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuRGV0YWlsZWQgJiYgdGhpcy5Xbi5tZXRhZGF0YS5kdXJhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMucmMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8Y254IGNsYXNzPSJjbngtZy1jYXJkLXRleHQtaW5mbyI+JHsgT2JqZWN0KG50LmYpKHRoaXMuV24ubWV0YWRhdGEuZHVyYXRpb24pIH08L2NueD5gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV24uYm9keUZvbnQgJiYgT2JqZWN0KFQuTikodCwgeyAnZm9udC1mYW1pbHknOiB0aGlzLlduLmJvZHlGb250IH0pLCB0aGlzLnBjLmFwcGVuZENoaWxkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGMucmVnaXN0ZXIodGhpcy51YywgdGhpcywgdGhpcy5oYyksIHRoaXMuc3Vic2NyaWJlKGh0LmFbaHQuYS5DbGlja10sIHRoaXMuaGMsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucmVsYXkoaHQuYVtodC5hLlNjcm9sbF0sIHRoaXMuaGMsIHRoaXMsIHRoaXMubWVkaWF0b3IpLCB0aGlzLnZjID0gbmV3IFoodGhpcy5mYywgdGhpcy5yYywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXM6IFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VOYXRpdmVDbGFtcGluZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMubXIub24odGhpcy51YywgdGhpcy5icik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxjKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5zdHlsZSA9PT0gTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuVmlzdWFsID8gaXQuYSA6IHN0LmE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJjKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xbi5zdHlsZSA9PT0gTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuVmlzdWFsID8gUSA6IFg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFjKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy52Yy5nZXRDbGFtcGVkVGV4dCh0aGlzLlduLm1ldGFkYXRhLnRpdGxlKSwgaSA9IHRoaXMucmMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8Y254LXNwYW4+JHsgdCB9PC9jbngtc3Bhbj5gKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuZCkoaSwgdGhpcy5mYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCAkZWxlbWVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudWM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFjdGl2ZVN0YXRlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA/IE9iamVjdChULmEpKHRoaXMudWMsIGQuaC5BY3RpdmUpIDogT2JqZWN0KFQuSSkodGhpcy51YywgZC5oLkFjdGl2ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudWMucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9jKSwgdGhpcy5tci5vZmYodGhpcy51YywgdGhpcy5icik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsYW1wTGluZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIG90ID0gY2xhc3MgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cGVyKCksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLm1yID0gaSwgdGhpcy5yYyA9IGUsIHRoaXMuaGMgPSBzLCB0aGlzLlduID0gbiwgdGhpcy5tYyA9ICExLCB0aGlzLlduLiRzbG90LmlubmVySFRNTCA9IGA8Y254IGNsYXNzPSIkeyBkLm8uQ2FyZFBsYWNlaG9sZGVyIH0iPjwvY254PmAsIHRoaXMuV24uc3R5bGUgPT09IE0uUHJvdG9HYWxsZXJ5U3R5bGVNb2RlLkRldGFpbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gZS5jcmVhdGVFbGVtZW50QnlTdHJpbmcodGhpcy5nYyhzdC5hKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduLiRzbG90LmZpcnN0Q2hpbGQuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYy5yZWdpc3Rlcih0aGlzLlduLiRzbG90LCB0aGlzLm1lZGlhdG9yLCB0aGlzKSwgdGhpcy5yZWxheShodC5hW2h0LmEuU2Nyb2xsXSwgdGhpcy5oYywgdGhpcywgdGhpcy5tZWRpYXRvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdjKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IFsuLi5BcnJheSgxMildLm1hcCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxjbngtc3BhbiBzdHlsZT0nd2lkdGg6ICR7IDEwICsgTWF0aC5mbG9vcig0MCAqIE1hdGgucmFuZG9tKCkpIH0lJz48L2NueC1zcGFuPiBgOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yZXBsYWNlKCc8Y254LXNwYW4+PC9jbngtc3Bhbj4nLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q2FyZERhdGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnljID0gbmV3IGF0KHRoaXMsIHRoaXMubXIsIHRoaXMucmMsIHRoaXMuaGMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLlduLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuV24uc3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlRm9udDogdGhpcy5Xbi50aXRsZUZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5Rm9udDogdGhpcy5Xbi5ib2R5Rm9udAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoSltKLkNhcmRDbGlja2VkXSwgdGhpcy55YywgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEpbSi5DYXJkQ2xpY2tlZF0sIHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMudW5zdWJzY3JpYmVBbGwodGhpcy5oYyksIHRoaXMucmVsYXkoaHQuYVtodC5hLlNjcm9sbF0sIHRoaXMueWMsIHRoaXMsIHRoaXMubWVkaWF0b3IpLCB0aGlzLnljLnNldEFjdGl2ZVN0YXRlKHRoaXMubWMpLCB0aGlzLlduLiRzbG90LmlubmVySFRNTCA9ICcnLCB0aGlzLlduLiRzbG90LmFwcGVuZENoaWxkKHRoaXMueWMuJGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBY3RpdmVTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWMgPSB0LCB0aGlzLnljICYmIHRoaXMueWMuc2V0QWN0aXZlU3RhdGUodGhpcy5tYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbnRhaW5lcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uJHNsb3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsYW1wTGluZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWMuY2xhbXBMaW5lcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCBjdCA9IDQsIHV0ID0gNCwgbHQgPSAyMCwgZHQgPSAxMDAsIGZ0ID0gNTA7CiAgICAgICAgICAgICAgICB2YXIgcHQ7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0Lk1haW5Db250YWluZXIgPSAnY254LXNjcm9sbGJhcicsIHQuV3JhcHBlciA9ICdjbngtc2Nyb2xsYmFyLXdyYXBwZXInLCB0LkNvbnRlbnQgPSAnY254LXNjcm9sbGJhci1jb250ZW50JywgdC5Ib3Jpem9udGFsID0gJ2NueC1zY3JvbGxiYXItaG9yaXpvbnRhbCcsIHQuSGFuZGxlID0gJ2NueC1zY3JvbGxiYXItaGFuZGxlJywgdC5QcmV2ZW50U2VsZWN0ID0gJ2NueC1zY3JvbGxiYXItcHJldmVudC1zZWxlY3QnLCB0LlNob3dPbkhvdmVyID0gJ2NueC1zY3JvbGxiYXItc2hvdy1vbi1ob3Zlcic7CiAgICAgICAgICAgICAgICB9KHB0IHx8IChwdCA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBidCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndjID0gdCwgdGhpcy5XbiA9IGksIHRoaXMuT2MgPSAwLCB0aGlzLnhjID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLlNjID0gdC5wYWdlWSwgdGhpcy5qYyA9IHQucGFnZVgsIE9iamVjdChULmEpKHRoaXMua2MsIHB0LlByZXZlbnRTZWxlY3QpLCBPYmplY3QoVC5hKSh0aGlzLmZlLmRvY3VtZW50LmJvZHksIHB0LlByZXZlbnRTZWxlY3QpLCB0aGlzLmZlLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2MpLCB0aGlzLmZlLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLkFjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuX2MgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5Xbi5ob3Jpem9udGFsID8gdC5wYWdlWCAtIHRoaXMuamMgOiB0LnBhZ2VZIC0gdGhpcy5TYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNjID0gdC5wYWdlWSwgdGhpcy5qYyA9IHQucGFnZVgsIE9iamVjdChULk0pKHRoaXMuZmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Xbi5ob3Jpem9udGFsID8gdGhpcy5JYy5zY3JvbGxMZWZ0ICs9IGkgLyB0aGlzLkNjIDogdGhpcy5JYy5zY3JvbGxUb3AgKz0gaSAvIHRoaXMuQ2M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkFjID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5rYywgcHQuUHJldmVudFNlbGVjdCksIE9iamVjdChULkkpKHRoaXMuZmUuZG9jdW1lbnQuYm9keSwgcHQuUHJldmVudFNlbGVjdCksIHRoaXMuZmUuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fYyksIHRoaXMuZmUuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuQWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5UYyA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5Xbi5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZGVsdGFNb2RlID8gZHQgKiAodC5kZWx0YVkgPCAwID8gLTEgOiAxKSA6IHQuZGVsdGFZLCBlID0gbHQgKiAoTWF0aC5mbG9vcihpKSAvIDMzKSwgcyA9IHRoaXMuT2MgKyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPj0gLTEgKiB0aGlzLmtjLmNsaWVudFdpZHRoICYmIHMgPD0gdGhpcy5JYy5zY3JvbGxXaWR0aCAtIHRoaXMua2MuY2xpZW50V2lkdGggJiYgKHRoaXMuT2MgPSBzKSwgT2JqZWN0KFQuTSkodGhpcy5mZSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5JYy5zY3JvbGxMZWZ0ID0gdGhpcy5PYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuUGMgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuTWMpLCB0aGlzLk1jID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRWMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkVjID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlduLmhvcml6b250YWwgPyB0aGlzLkljLnNjcm9sbFdpZHRoIDogdGhpcy5JYy5zY3JvbGxIZWlnaHQsIGkgPSB0aGlzLlduLmhvcml6b250YWwgPyB0aGlzLndjLmNsaWVudFdpZHRoIDogdGhpcy53Yy5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DYyA9IGkgLyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSAtMSAqICh0aGlzLndjLmNsaWVudFdpZHRoIC0gKHRoaXMua2MuY2xpZW50V2lkdGggfHwgY3QpIC0gdXQpLCBzID0gdGhpcy53Yy5jbGllbnRIZWlnaHQgLSB0aGlzLmtjLmNsaWVudEhlaWdodCAtIHV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULk0pKHRoaXMuZmUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQ2MgPj0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULnUpKHRoaXMua2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoVC5PKSh0aGlzLmtjKSwgdGhpcy5Xbi5ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE9iamVjdChULk4pKHRoaXMua2MsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGAkeyBNYXRoLm1heCgxMDAgKiB0aGlzLkNjLCAxMCkgfSVgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IGAkeyBzIH1weGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogYCR7IHRoaXMuSWMuc2Nyb2xsTGVmdCAvIHQgKiAxMDAgfSVgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5OKSh0aGlzLmtjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYCR7IE1hdGgubWF4KDEwMCAqIHRoaXMuQ2MsIDEwKSB9JWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBgJHsgdGhpcy5JYy5zY3JvbGxUb3AgLyB0ICogMTAwIH0lYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogYCR7IGUgfXB4YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZmUgPSBPYmplY3QoVC5zKSh0KSwgIXRoaXMuZmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpbmRvdyB3YXMgbm90IGZvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTGMoKSwgdGhpcy5rYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLnhjKSwgdGhpcy5Xbi5vdmVycmlkZU5hdGl2ZUhvcml6b250YWxTY3JvbGwgJiYgdGhpcy5JYy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMuVGMsIHsgcGFzc2l2ZTogITAgfSksIHRoaXMuZmUuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5QYyksIHRoaXMuSWMuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5FYyksIHRoaXMuSWMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuRWMpLCBPYmplY3QoVC5hKSh0aGlzLndjLCBwdC5NYWluQ29udGFpbmVyLCB0aGlzLlduLmhvcml6b250YWwgPyBwdC5Ib3Jpem9udGFsIDogdm9pZCAwLCB0aGlzLlduLnNob3dPbkhvdmVyID8gcHQuU2hvd09uSG92ZXIgOiB2b2lkIDApLCB0aGlzLkVjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QoVC5rKSh0aGlzLndjLCB0aGlzLmZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJzBweCcgPT09IGUuaGVpZ2h0ICYmICcwcHgnICE9PSBlLm1heEhlaWdodCAmJiBPYmplY3QoVC5OKSh0aGlzLndjLCB7IGhlaWdodDogZS5tYXhIZWlnaHQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIExjKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHRoaXMua2MgPSBPYmplY3QoVC5mKShgPGNueCBjbGFzcz0iJHsgcHQuSGFuZGxlIH0iPmAsIHRoaXMuZmUpLCB0aGlzLlJjID0gT2JqZWN0KFQuZikoYDxjbnggY2xhc3M9IiR7IHB0LldyYXBwZXIgfSI+YCwgdGhpcy5mZSksIHRoaXMuSWMgPSBPYmplY3QoVC5mKShgPGNueCBjbGFzcz0iJHsgcHQuQ29udGVudCB9Ij5gLCB0aGlzLmZlKSwgdGhpcy5SYy5hcHBlbmRDaGlsZCh0aGlzLkljKTsgdGhpcy53Yy5maXJzdENoaWxkOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSWMuYXBwZW5kQ2hpbGQodGhpcy53Yy5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53Yy5hcHBlbmRDaGlsZCh0aGlzLlJjKSwgdGhpcy53Yy5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWVuZCcsIHRoaXMua2MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHRoaXMuZmUuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fYyksIHRoaXMuZmUuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuQWMpLCB0aGlzLmtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMueGMpLCB0aGlzLkljLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5UYyksIHRoaXMuZmUucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5QYyksIHRoaXMuSWMucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5FYyksIHRoaXMuSWMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuRWMpLCBPYmplY3QoVC5KKSh0aGlzLmtjKTsgdGhpcy5JYy5maXJzdENoaWxkOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2MuYXBwZW5kQ2hpbGQodGhpcy5JYy5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSikodGhpcy5SYyksIE9iamVjdChULkkpKHRoaXMud2MsIHB0Lk1haW5Db250YWluZXIsIHB0Lkhvcml6b250YWwsIHB0LlNob3dPbkhvdmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB2dCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jbGllbnRIZWlnaHQgfHwgdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9LCBtdCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jbGllbnRXaWR0aCB8fCB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgfSwgZ3QgPSAodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0Lm9mZnNldFRvcCwgbiA9ICgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoaS5nZXRNYXJnaW5Ub3BQcm9wZXJ0eVZhbHVlKHQpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoaS5nZXRNYXJnaW5Cb3R0b21Qcm9wZXJ0eVZhbHVlKHQpLCAxMCkgfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKSwgciA9IHZ0KHQpLCBoID0gdnQodC5wYXJlbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguZmxvb3IoaCAvIChyICsgbikpLCBpID0gTWF0aC5mbG9vcih0IC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gTWF0aC5tYXgocyAtIGkgKiAociArIG4pLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LnBhcmVudEVsZW1lbnQuc2Nyb2xsVG9wID0gYTsKICAgICAgICAgICAgICAgICAgICB9LCB5dCA9ICh0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQub2Zmc2V0TGVmdCwgbiA9ICgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VJbnQoaS5nZXRNYXJnaW5MZWZ0UHJvcGVydHlWYWx1ZSh0KSwgMTApIHx8IDApICsgKHBhcnNlSW50KGkuZ2V0TWFyZ2luUmlnaHRQcm9wZXJ0eVZhbHVlKHQpLCAxMCkgfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKSwgciA9IG10KHQpLCBoID0gbXQodC5wYXJlbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGEgPSBzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE1hdGguZmxvb3IoaCAvIChyICsgbikpLCBpID0gTWF0aC5mbG9vcih0IC8gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gTWF0aC5tYXgocyAtIGkgKiAociArIG4pLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LnBhcmVudEVsZW1lbnQuc2Nyb2xsTGVmdCA9IGE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIHd0IGV4dGVuZHMgby5hIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByLCBoLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLm1yID0gaSwgdGhpcy5yYyA9IGUsIHRoaXMuaGMgPSBzLCB0aGlzLkJjID0gbiwgdGhpcy5EYyA9IHIsIHRoaXMuRmMgPSBoLCB0aGlzLlZjID0gYSwgdGhpcy5VYyA9IFtdLCB0aGlzLiRjID0gW10sIHRoaXMuTmMgPSBudWxsLCB0aGlzLkhjID0gMCwgdGhpcy5xYyA9IE9iamVjdChULnApKHRoaXMuQmMpLCB0aGlzLnpjID0gT2JqZWN0KFQuaikodGhpcy5CYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLkZjID09PSBNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5EZXRhaWxlZCA/IGQuby5TdHlsZURldGFpbGVkIDogZC5vLlN0eWxlVmlzdWFsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KFQuYSkodGhpcy5CYywgYyksIHRoaXMuRmMgPT09IE0uUHJvdG9HYWxsZXJ5U3R5bGVNb2RlLkRldGFpbGVkICYmICh0aGlzLkJjLmlubmVySFRNTCA9IGA8Y254IGNsYXNzPSIkeyBkLm8uRXhwbG9yZU1vcmUgfSI+JHsgSyB9PC9jbng+YCksIHRoaXMuV2MgPSBlLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyhgPGNueCBjbGFzcz0iJHsgZC5vLkNhcmRSYWlsIH0iPjwvY254PmApLCB0aGlzLkJjLmFwcGVuZENoaWxkKHRoaXMuV2MpLCB0aGlzLkZjID09PSBNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5EZXRhaWxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8Y254IGNsYXNzPSIkeyBkLm8uRmFkZU91dCB9Ij48L2NueD5gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQmMuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HYyhvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSmMoKSwgdGhpcy5RYygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblJlc2l6ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWGMgJiYgKHRoaXMuWGMudXBkYXRlV2lkdGgodCksIHRoaXMuWWMoKSwgdGhpcy5LYygpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudEluZGV4KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IYyA9IHQsIHRoaXMuVWMuZm9yRWFjaCgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY2FyZC5zZXRBY3RpdmVTdGF0ZSh0ID09PSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuS2MoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR2ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2goKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLlpjKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XYy5hcHBlbmRDaGlsZChlLmdldENvbnRhaW5lcigpKSwgdGhpcy5VYy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU291cmNlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoSltKLkNhcmRDbGlja2VkXSwgZSwgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnR1KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucmVsYXkoaHQuYVtodC5hLlNjcm9sbF0sIGUsIHRoaXMsIHRoaXMubWVkaWF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS2MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QobC5oKSh0aGlzLiRjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuVWNbdGhpcy5IY10uY2FyZC5nZXRDb250YWluZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WYyA9PT0gTS5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW0uTGFuZHNjYXBlID8gZ3QodCwgdGhpcy5yYywgITApIDogeXQodCwgdGhpcy5yYywgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBaYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnJjLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyhgPGNueCBjbGFzcz0iJHsgZC5vLkNhcmRTbG90IH0iPjwvY254PmApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG90KHRoaXMsIHRoaXMubXIsIHRoaXMucmMsIHRoaXMuaGMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHRoaXMuRmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2xvdDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlRm9udDogdGhpcy5xYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlGb250OiB0aGlzLnpjCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0dSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBLkNoYW5nZVZpZGVvLCB7IHBheWxvYWQ6IHsgdmlkZW9JbmRleDogdCB9IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VYy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC52aWRlb1NvdXJjZS5nZXRNZXRhZGF0YShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNhcmQuc2V0Q2FyZERhdGEoaSksIHQuY2FyZC5jbGFtcExpbmVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGl1KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRjLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKHQpLCB0aGlzLldjLnJlbW92ZUNoaWxkKHQuZ2V0Q29udGFpbmVyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy4kYyA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBldSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuVmMgPT09IE0uUHJvdG9HYWxsZXJ5T3JpZW50YXRpb25FbnVtLlBvcnRyYWl0ID8gdGhpcy5XYy5jbGllbnRXaWR0aCA6IHRoaXMuV2MuY2xpZW50SGVpZ2h0LCBpID0gdGhpcy5VY1swXS5jYXJkLmdldENvbnRhaW5lcigpLCBlID0gdGhpcy5WYyA9PT0gTS5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW0uUG9ydHJhaXQgPyBpLmNsaWVudFdpZHRoIDogaS5jbGllbnRIZWlnaHQsIHMgPSBNYXRoLmNlaWwodCAvIGUpICsgMSAtICh0aGlzLlVjLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA+IHRoaXMuJGMubGVuZ3RoIC0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDw9IHM7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlpjKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGMucHVzaChpKSwgdGhpcy5yZWxheShodC5hW2h0LmEuU2Nyb2xsXSwgaSwgdGhpcywgdGhpcy5tZWRpYXRvciksIHRoaXMuV2MuYXBwZW5kQ2hpbGQoaS5nZXRDb250YWluZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFljKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1KCkgPyAodGhpcy5pdSgpLCB0aGlzLm51KCkpIDogKHRoaXMucnUoKSwgdGhpcy5ldSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbnUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IHRoaXMuTmMgJiYgKHRoaXMuTmMgPSBuZXcgYnQodGhpcy5XYywgeyBob3Jpem9udGFsOiB0aGlzLlZjID09PSBNLlByb3RvR2FsbGVyeU9yaWVudGF0aW9uRW51bS5Qb3J0cmFpdCB9KSwgT2JqZWN0KFQuYSkodGhpcy5XYywgZC5oLkhhc0N1c3RvbVNjcm9sbGJhcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBydSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdGhpcy5OYyAmJiAodGhpcy5OYy5kZXN0cm95KCksIHRoaXMuTmMgPSBudWxsLCBPYmplY3QoVC5JKSh0aGlzLldjLCBkLmguSGFzQ3VzdG9tU2Nyb2xsYmFyKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN1KCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5VY1t0aGlzLlVjLmxlbmd0aCAtIDFdLmNhcmQuZ2V0Q29udGFpbmVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZjID09PSBNLlByb3RvR2FsbGVyeU9yaWVudGF0aW9uRW51bS5MYW5kc2NhcGUgPyB0Lm9mZnNldFRvcCArIHQuY2xpZW50SGVpZ2h0ID4gdGhpcy5XYy5jbGllbnRIZWlnaHQgOiB0Lm9mZnNldExlZnQgKyB0LmNsaWVudFdpZHRoID4gdGhpcy5XYy5jbGllbnRXaWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUWMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmh1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWGMgPSBuZXcgUCh0aGlzLkJjLCB0aGlzLkRjLCB0LCBkLnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBodSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdbdGhpcy5WY11bdGhpcy5GY107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIE90LCB4dCwgU3QgPSBlKDE4KSwganQgPSBlKDM4KSwga3QgPSBlKDI0KTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuZW50ZXIgPSAnZW50ZXJGdWxsc2NyZWVuJywgdC5leGl0ID0gJ2V4aXRGdWxsc2NyZWVuJzsKICAgICAgICAgICAgICAgIH0oT3QgfHwgKE90ID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIF90IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5yYyA9IGksIHRoaXMuWm4gPSBzLCB0aGlzLmF1ID0gITEsIHRoaXMub3UgPSAxMDAwLCB0aGlzLmN1ID0gITAsIHRoaXMudXUgPSAhMSwgdGhpcy5sdSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ICYmIHRoaXMuZHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZnUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ID8gbnVsbCAhPT0gdGhpcy5mdWxsc2NyZWVuRWxlbWVudCA/IHRoaXMuZHUoKSA6IHRoaXMucHUoKSA6IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBPdC5leGl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucHUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dSA9ICExLCB0aGlzLmJ1LnJlamVjdCgpLCB0aGlzLmF1ID0gITEsIGNsZWFyVGltZW91dCh0aGlzLnZ1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubXUgPSBzICYmIHMgPT09IFN0LmIuSW9zID8gZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKVswXSA6IGUsICF0aGlzLm11KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbGVtZW50IGlzIG1pc3NpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmd1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkICh0aGlzLmN1ID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55dSA9IHQua2V5cywgdGhpcy53dSA9IHQubmFtZSwgdGhpcy5PdSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1ID0gITEsIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRnVsbHNjcmVlbiBpbml0IGZhaWxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHRoaXMuWm4gPT09IFN0LmIuSW9zID8gdGhpcy5yYy5nZXRGdWxsc2NyZWVuS2V5cyh0aGlzLm11KSA6IHRoaXMucmMuZ2V0RnVsbHNjcmVlbktleXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGZ1bGxzY3JlZW5FbGVtZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yYy5nZXREb2N1bWVudFByb3BlcnR5KHRoaXMueXUuZnVsbHNjcmVlbkVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgZnVsbHNjcmVlbkVuYWJsZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJjLmdldERvY3VtZW50UHJvcGVydHkodGhpcy55dS5mdWxsc2NyZWVuRW5hYmxlZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudGVyRnVsbFNjcmVlbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnUgPSBuZXcganQuYSgpLCB0aGlzLmF1ID0gITAsIGNsZWFyVGltZW91dCh0aGlzLnZ1KSwgdGhpcy52dSA9IHNldFRpbWVvdXQodGhpcy5wdSwgdGhpcy5vdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXVbdGhpcy55dS5yZXF1ZXN0RnVsbHNjcmVlbl0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5idS5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRGdWxsU2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYy5leGl0RnVsbHNjcmVlbih0aGlzLnl1LmV4aXRGdWxsc2NyZWVuLCB0aGlzLlpuID09PSBTdC5iLklvcyA/IHRoaXMubXUgOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2Z1bGxzY3JlZW5fZXhpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1ID0gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE91KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnd1ID09PSBrdC5kLk1veiB8fCB0aGlzLnd1ID09PSBrdC5kLk1zID8gKHRoaXMucmMuYWRkRXZlbnRMaXN0ZW5lck9uR2xvYmFsKHRoaXMueXUuZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5mdSksIHRoaXMucmMuYWRkRXZlbnRMaXN0ZW5lck9uR2xvYmFsKHRoaXMueXUuZnVsbHNjcmVlbmVycm9yLCB0aGlzLnB1KSkgOiAodGhpcy5tdS5hZGRFdmVudExpc3RlbmVyKHRoaXMueXUuZnVsbHNjcmVlbmNoYW5nZSwgdGhpcy5mdSksIHRoaXMubXUuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLnl1LmZ1bGxzY3JlZW5lcnJvciwgdGhpcy5wdSkpLCB0aGlzLlpuID09PSBTdC5iLklvcyAmJiAodGhpcy5tdS5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRiZWdpbmZ1bGxzY3JlZW4nLCB0aGlzLmx1KSwgdGhpcy5tdS5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRlbmRmdWxsc2NyZWVuJywgdGhpcy5mdSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4dSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53dSA9PT0ga3QuZC5Nb3ogfHwgdGhpcy53dSA9PT0ga3QuZC5NcyA/ICh0aGlzLnJjLnJlbW92ZUV2ZW50TGlzdGVuZXJPbkdsb2JhbCh0aGlzLnl1LmZ1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuZnUpLCB0aGlzLnJjLnJlbW92ZUV2ZW50TGlzdGVuZXJPbkdsb2JhbCh0aGlzLnl1LmZ1bGxzY3JlZW5lcnJvciwgdGhpcy5wdSkpIDogKHRoaXMubXUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLnl1LmZ1bGxzY3JlZW5jaGFuZ2UsIHRoaXMuZnUpLCB0aGlzLm11LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy55dS5mdWxsc2NyZWVuZXJyb3IsIHRoaXMucHUpKSwgdGhpcy5abiA9PT0gU3QuYi5Jb3MgJiYgKHRoaXMubXUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0YmVnaW5mdWxsc2NyZWVuJywgdGhpcy5sdSksIHRoaXMubXUucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0ZW5kZnVsbHNjcmVlbicsIHRoaXMuZnUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXUgPSAhMCwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIE90LmVudGVyKSwgdGhpcy5idS5yZXNvbHZlKCksIHRoaXMuYXUgPSAhMSwgY2xlYXJUaW1lb3V0KHRoaXMudnUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNGdWxsc2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51dTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gJiYgdGhpcy5leGl0RnVsbFNjcmVlbigpLCB0aGlzLnh1KCksIHRoaXMuYnUgJiYgdGhpcy5idS5pc1BlbmRpbmcgJiYgdGhpcy5idS5yZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuUGxheSA9IDBdID0gJ1BsYXknLCB0W3QuUGF1c2UgPSAxXSA9ICdQYXVzZScsIHRbdC5SZXBsYXkgPSAyXSA9ICdSZXBsYXknLCB0W3QuVm9sdW1lID0gM10gPSAnVm9sdW1lJywgdFt0Lk11dGUgPSA0XSA9ICdNdXRlJywgdFt0LlVubXV0ZSA9IDVdID0gJ1VubXV0ZScsIHRbdC5TZWVrID0gNl0gPSAnU2VlaycsIHRbdC5EcmFnZ2luZ1N0YXJ0ID0gN10gPSAnRHJhZ2dpbmdTdGFydCcsIHRbdC5EcmFnZ2luZ1N0b3BwZWQgPSA4XSA9ICdEcmFnZ2luZ1N0b3BwZWQnLCB0W3QuU2Vla2luZ1N0YXJ0ID0gOV0gPSAnU2Vla2luZ1N0YXJ0JywgdFt0LlNlZWtpbmdTdG9wcGVkID0gMTBdID0gJ1NlZWtpbmdTdG9wcGVkJywgdFt0LkV4cGFuZCA9IDExXSA9ICdFeHBhbmQnLCB0W3QuQ29sbGFwc2UgPSAxMl0gPSAnQ29sbGFwc2UnLCB0W3QuUXVhbGl0eSA9IDEzXSA9ICdRdWFsaXR5JywgdFt0LkNsb3NlID0gMTRdID0gJ0Nsb3NlJywgdFt0Lk5leHQgPSAxNV0gPSAnTmV4dCcsIHRbdC5QcmV2ID0gMTZdID0gJ1ByZXYnLCB0W3QuU2V0dGluZ3MgPSAxN10gPSAnU2V0dGluZ3MnLCB0W3QuQ2FwdGlvbk9uID0gMThdID0gJ0NhcHRpb25PbicsIHRbdC5DYXB0aW9uT2ZmID0gMTldID0gJ0NhcHRpb25PZmYnLCB0W3QuQ2FwdGlvblVwZGF0ZSA9IDIwXSA9ICdDYXB0aW9uVXBkYXRlJywgdFt0LlZvbHVtZUhvdmVyU3RhcnQgPSAyMV0gPSAnVm9sdW1lSG92ZXJTdGFydCcsIHRbdC5Wb2x1bWVIb3ZlclN0b3BwZWQgPSAyMl0gPSAnVm9sdW1lSG92ZXJTdG9wcGVkJywgdFt0Lk92ZXJsYXlDbGljayA9IDIzXSA9ICdPdmVybGF5Q2xpY2snLCB0W3QuVUlIaWRlU3RhcnQgPSAyNF0gPSAnVUlIaWRlU3RhcnQnLCB0W3QuVUlTaG93U3RhcnQgPSAyNV0gPSAnVUlTaG93U3RhcnQnLCB0W3QuVUlFbmRTaG93SGlkZSA9IDI2XSA9ICdVSUVuZFNob3dIaWRlJywgdFt0LkFib3V0Q2xpY2sgPSAyN10gPSAnQWJvdXRDbGljaycsIHRbdC5Db250ZXh0Q2xpY2sgPSAyOF0gPSAnQ29udGV4dENsaWNrJywgdFt0LlNldHRpbmdzTWVudSA9IDI5XSA9ICdTZXR0aW5nc01lbnUnLCB0W3QuSG92ZXJTdGFydCA9IDMwXSA9ICdIb3ZlclN0YXJ0JywgdFt0LkhvdmVyRW5kID0gMzFdID0gJ0hvdmVyRW5kJywgdFt0LlN0YXRlQ2hhbmdlZCA9IDMyXSA9ICdTdGF0ZUNoYW5nZWQnLCB0W3QuUmViaW5kQ29tcG9uZW50ID0gMzNdID0gJ1JlYmluZENvbXBvbmVudCcsIHRbdC5Ta2lwQWQgPSAzNF0gPSAnU2tpcEFkJywgdFt0LkxvZ29DbGlja2VkID0gMzVdID0gJ0xvZ29DbGlja2VkJywgdFt0LkNvbnRleHRNZW51T3BlbiA9IDM2XSA9ICdDb250ZXh0TWVudU9wZW4nLCB0W3QuQ29udGV4dE1lbnVDbG9zZSA9IDM3XSA9ICdDb250ZXh0TWVudUNsb3NlJzsKICAgICAgICAgICAgICAgIH0oeHQgfHwgKHh0ID0ge30pKTsKICAgICAgICAgICAgICAgIHZhciBBdCwgSXQsIEN0LCBUdCA9IGUoMTMpLCBQdCA9IGUoMyk7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkVudGVyU3RhcnQgPSAnZW50ZXJTdGFydCcsIHQuRW50ZXJTdG9wID0gJ2VudGVyU3RvcCcsIHQuRXhpdFN0YXJ0ID0gJ2V4aXRTdGFydCcsIHQuRXhpdFN0b3AgPSAnZXhpdFN0b3AnOwogICAgICAgICAgICAgICAgfShBdCB8fCAoQXQgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5EaXJlY3Rpb25JbiA9IDBdID0gJ0RpcmVjdGlvbkluJywgdFt0LkRpcmVjdGlvbk91dCA9IDFdID0gJ0RpcmVjdGlvbk91dCcsIHRbdC5GYWRlSW4gPSAyXSA9ICdGYWRlSW4nOwogICAgICAgICAgICAgICAgfShJdCB8fCAoSXQgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuRmxvYXQgPSAnZmxvYXQnLCB0LkVtYmVkID0gJ2VtYmVkJzsKICAgICAgICAgICAgICAgIH0oQ3QgfHwgKEN0ID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IE10ID0gNDAwLCBFdCA9IDEwMDAsIEx0ID0gMjAsIFJ0ID0gMC41OwogICAgICAgICAgICAgICAgY2xhc3MgQnQgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU3UgPSB0LCB0aGlzLlduID0gaSwgdGhpcy5MbyA9IGUsIHRoaXMuRGMgPSBzLCB0aGlzLmpzID0gbiwgdGhpcy5qdSA9IHIsIHRoaXMua3UgPSAwLCB0aGlzLl91ID0gdm9pZCAwLCB0aGlzLkF1ID0gbnVsbCwgdGhpcy5JdSA9ICExLCB0aGlzLkN1ID0gNTAwLCB0aGlzLlR1ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdSAmJiB0aGlzLlB1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuTXUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5Xbi53aWR0aCA9IHRoaXMuRXUuY2xpZW50V2lkdGgsIHRoaXMuTHUoKSwgdGhpcy5fdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJ1KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkx1ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CdSgpID8gIXRoaXMuRHUgfHwgdGhpcy5fdSB8fCB0aGlzLkl1ID8gdGhpcy5GdSgpIDogdGhpcy5WdSgpIDogdGhpcy5fdSAmJiB0aGlzLlV1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuJHUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLk51KHQucHJvcGVydHlOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHJhbnNpdGlvblN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdC5EaXJlY3Rpb25JbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uU3RhdGUgPSB2b2lkIDAsIHRoaXMuSHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdC5EaXJlY3Rpb25PdXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblN0YXRlID0gdm9pZCAwLCB0aGlzLnF1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXQuRmFkZUluOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25TdGF0ZSA9IHZvaWQgMCwgdGhpcy56dSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5XdSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdHJhbnNpdGlvblN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IHRyYW5zaXRpb25TdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR3UgPT09IEl0LkZhZGVJbiAmJiB0aGlzLkp1KGQubS5GYWRlSW5CYXNlLCBkLm0uRmFkZUluKSwgdGhpcy5HdSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFF1KC4uLnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy5MbywgLi4udCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEp1KC4uLnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5MbywgLi4udCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZ1KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRjICE9PSBoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lICYmICh0aGlzLkxvLnN0eWxlLndpZHRoID0gYCR7IHRoaXMuV24ud2lkdGggfXB4YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLkxvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxvLnN0eWxlLmhlaWdodCA9IHRoaXMuV24uZ2V0SGVpZ2h0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmcpKHRoaXMuRGMsIHRoaXMuV24uZmxvYXRpbmdEZXZpY2VNb2RlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWXUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanMuYWRkRXZlbnRMaXN0ZW5lck9uR2xvYmFsKCdzY3JvbGwnLCB0aGlzLlR1KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRXUgJiYgKHRoaXMuS3UoKSwgdGhpcy5adSA8IHRoaXMuV24uZmxvYXRpbmdHdXR0ZXJZID8gdGhpcy50bCh0aGlzLlduLmZsb2F0aW5nR3V0dGVyWSkgOiB0aGlzLnRsKHRoaXMuWnUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRXUgPSB0aGlzLmpzLnF1ZXJ5U2VsZWN0b3IodGhpcy5Xbi5wYWdlRWxlbWVudCksIHRoaXMuRXUgJiYgKGNsZWFySW50ZXJ2YWwodGhpcy5BdSksIHRoaXMuV24ud2lkdGggPSB0aGlzLkV1LmNsaWVudFdpZHRoLCB0aGlzLkx1KCksIHRoaXMuU3Uub24odGhpcy5FdSwgdGhpcy5NdSksIHRoaXMuU3Uub24odGhpcy5qcy5nZXRHbG9iYWxDbG9zZXN0VG9wKCkudG9wRnJhbWUuZG9jdW1lbnQuYm9keSwgdGhpcy5NdSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLlduLmFwcGVuZExvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0Zsb2F0aW5nQXBwZW5kTG9jYXRpb25FbnVtLkFib3ZlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5adSA9IHRoaXMuRXUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5Mby5vZmZzZXRIZWlnaHQgLSB0aGlzLlduLmZsb2F0aW5nWUF4aXNQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0Zsb2F0aW5nQXBwZW5kTG9jYXRpb25FbnVtLkJlbG93OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5adSA9IHRoaXMuRXUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5FdS5vZmZzZXRIZWlnaHQgKyB0aGlzLlduLmZsb2F0aW5nWUF4aXNQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0Zsb2F0aW5nQXBwZW5kTG9jYXRpb25FbnVtLldpdGhpbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWnUgPSB0aGlzLkV1LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BdSA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5DdSksIHRoaXMuaWwoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2woKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmZsb2F0aW5nUG9zaXRpb24gPT09IGguUHJvdG9GbG9hdGluZ0ZpeGVkUG9zaXRpb25Nb2RlLkVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE51KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnRyYW5zaXRpb25TdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0LkRpcmVjdGlvbkluOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0LkRpcmVjdGlvbk91dDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncmlnaHQnID09PSB0IHx8ICdsZWZ0JyA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdC5GYWRlSW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29wYWNpdHknID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5sKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxvLnN0eWxlLnRvcCA9ICcnLCB0aGlzLkxvLnN0eWxlLmJvdHRvbSA9ICcnLCB0aGlzLkxvLnN0eWxlLmxlZnQgPSAnJywgdGhpcy5Mby5zdHlsZS5yaWdodCA9ICcnLCB0aGlzLkxvLnN0eWxlLndpZHRoID0gJycsIHRoaXMuTG8uc3R5bGUuaGVpZ2h0ID0gJycsIHRoaXMuTG8uc3R5bGUudHJhbnNmb3JtID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHF1KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91ID0gITEsIHRoaXMuSnUoZC5uLk1haW5DbGFzcywgZC5uLlRyYW5zaXRpb25DbGFzcywgdGhpcy5Xbi5wb3NpdGlvbkNsYXNzKSwgdGhpcy5ubCgpLCB0aGlzLnJsKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduLmlzUG9zaXRpb25lZFRvcCA/ICh0aGlzLkxvLnN0eWxlLnRvcCA9IGAkeyB0aGlzLlduLmZsb2F0aW5nR3V0dGVyWSB9cHhgLCB0aGlzLkxvLnN0eWxlLmJvdHRvbSA9ICdhdXRvJykgOiB0aGlzLlduLmlzUG9zaXRpb25lZEJvdHRvbSAmJiAodGhpcy5Mby5zdHlsZS50b3AgPSAnYXV0bycsIHRoaXMuTG8uc3R5bGUuYm90dG9tID0gYCR7IHRoaXMuV24uZmxvYXRpbmdHdXR0ZXJZIH1weGApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0bCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG8uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHsgdCB9cHgpYDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID8gdGhpcy5RdShkLm4uVHJhbnNpdGlvbkNsYXNzKSA6IHRoaXMuSnUoZC5uLlRyYW5zaXRpb25DbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9sKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWwoaSksIGUgfHwgdGhpcy5Xbi5pc1Bvc2l0aW9uZWRMZWZ0ID8gKHRoaXMuTG8uc3R5bGUubGVmdCA9IGAkeyB0IH1weGAsIHRoaXMuTG8uc3R5bGUucmlnaHQgPSAnYXV0bycpIDogKHRoaXMuTG8uc3R5bGUubGVmdCA9ICdhdXRvJywgdGhpcy5Mby5zdHlsZS5yaWdodCA9IGAkeyB0IH1weGApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBCdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChULnMpKHRoaXMuTG8pLmRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggPj0gdGhpcy5qdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVnUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkJ1KCkgJiYgKCF0aGlzLnNsKCkgfHwgdGhpcy5FdSAmJiAoIXRoaXMuRXUgfHwgMCAhPT0gdGhpcy5FdS5jbGllbnRXaWR0aCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3UgPSAhMCwgdGhpcy50cmFuc2l0aW9uU3RhdGUgPSBJdC5EaXJlY3Rpb25JbiwgdGhpcy5RdShkLm4uTWFpbkNsYXNzLCB0aGlzLlduLnBvc2l0aW9uQ2xhc3MpLCB0aGlzLkx1KCksIHRoaXMuc2woKSA/ICh0aGlzLkxvLnN0eWxlLnRvcCA9ICcwcHgnLCB0aGlzLmNsKCksIHRoaXMub2wodGhpcy5rdSwgITEsICEwKSwgdGhpcy5QdSgpKSA6ICh0aGlzLmhsKCksIHRoaXMub2wodGhpcy5rdSkpLCB0aGlzLnVsKCksIE9iamVjdChULmkpKHRoaXMuTG8pLCB0aGlzLkV1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUnUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sKHRoaXMuV24uZmxvYXRpbmdHdXR0ZXJYLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkV1ICYmICh0aGlzLmpzLmdldEVsZW1lbnRDb29yZGluYXRlcyh0aGlzLkV1KS5jbGllbnRYIDwgdGhpcy5qcy5nZXRCb2R5RGltZW5zaW9ucygpLndpZHRoIC8gMiA/ICh0aGlzLlduLmlzUG9zaXRpb25lZExlZnQgPSAhMCwgdGhpcy5Xbi5pc1Bvc2l0aW9uZWRSaWdodCA9ICExKSA6ICh0aGlzLlduLmlzUG9zaXRpb25lZExlZnQgPSAhMSwgdGhpcy5Xbi5pc1Bvc2l0aW9uZWRSaWdodCA9ICEwKSwgdGhpcy5XdSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV3UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2woKSAmJiB0aGlzLlduLmlzUG9zaXRpb25lZFJpZ2h0ID8gdGhpcy5rdSA9IHRoaXMuanMuZ2V0Qm9keURpbWVuc2lvbnMoKS53aWR0aCArICh0aGlzLlduLmZsb2F0aW5nV2lkdGggfHwgRXQpICsgTHQgOiB0aGlzLmt1ID0gLSgodGhpcy5Xbi5mbG9hdGluZ1dpZHRoIHx8IEV0KSArIEx0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUnUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbCgpLCBpID0gdGhpcy5qcy5nZXRFbGVtZW50Q29vcmRpbmF0ZXModGhpcy5FdSkuY2xpZW50WCwgdGhpcy5Xbi5pc1Bvc2l0aW9uZWRMZWZ0ID8gaSArPSB0aGlzLlduLmZsb2F0aW5nR3V0dGVyWCA6IGkgLT0gdGhpcy5Xbi5mbG9hdGluZ0d1dHRlclgsIHRoaXMub2woaSwgdCwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBVdSh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKHRoaXMudHJhbnNpdGlvblN0YXRlID0gSXQuRGlyZWN0aW9uT3V0KSwgdGhpcy5sbCgpLCBpID0gdGhpcy5zbCgpLCB0aGlzLm9sKHRoaXMua3UsIHQsIGkpLCB0IHx8IHRoaXMucXUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG8uYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMuJHUpLCB0aGlzLlN1Lm9uKHRoaXMuTG8sIHRoaXMuTHUpLCB0aGlzLnNsKCkgJiYgKHRoaXMuZWwoKSwgdGhpcy5ZdSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU3Uub2ZmKHRoaXMuTG8sIHRoaXMuTHUpLCB0aGlzLkxvLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLiR1KSwgdGhpcy5FdSAmJiAodGhpcy5TdS5vZmYodGhpcy5FdSwgdGhpcy5NdSksIHRoaXMuU3Uub2ZmKHRoaXMuanMuZ2V0R2xvYmFsQ2xvc2VzdFRvcCgpLnRvcEZyYW1lLmRvY3VtZW50LmJvZHksIHRoaXMuTXUpLCB0aGlzLmpzLnJlbW92ZUV2ZW50TGlzdGVuZXJPbkdsb2JhbCgnc2Nyb2xsJywgdGhpcy5UdSksIGNsZWFySW50ZXJ2YWwodGhpcy5BdSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNJbkZsb2F0aW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBEdCBleHRlbmRzIEJ0IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByLCBhLCBvID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcihlLCBuLCBzLCByLCBhLCBvKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMucGwgPSBpLCB0aGlzLmJsID0gITAsIHRoaXMudmwgPSAhMCwgdGhpcy5tbCA9ICExLCB0aGlzLkR1ID0gITEsIHRoaXMuZ2wgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnBsLmdldElzVGFiSW5Gb2N1cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0aGlzLmlzSW5GbG9hdGluZyAmJiAodGhpcy5EdSA9ICExLCB0aGlzLlV1KCkpLCB0aGlzLmJsICYmIHRoaXMuV24uZmxvYXRpbmdNb2RlID09PSBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFmdGVySW5WaWV3ICYmIHQgJiYgKHRoaXMuYmwgPSAhMSksICF0ICYmICF0aGlzLmJsICYmIHRoaXMudmwgJiYgaSAmJiAodGhpcy5EdSA9ICEwLCBzdXBlci5WdSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5GdSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbkZsb2F0aW5nICYmIHN1cGVyLkZ1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFV1KCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gIXRoaXMubWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLlV1KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEF0LkV4aXRTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlsKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgQXQuRW50ZXJTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHlsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25TdGF0ZSA9IEl0LkZhZGVJbiwgdGhpcy5KdShkLm0uRmFkZUluKSwgdGhpcy5RdShkLm0uRmFkZUluQmFzZSksIE9iamVjdChULmkpKHRoaXMuTG8pLCB0aGlzLlF1KGQubS5GYWRlSW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEF0LkVudGVyU3RvcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHp1KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkp1KGQubS5GYWRlSW5CYXNlLCBkLm0uRmFkZUluKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEF0LkV4aXRTdG9wKSwgdGhpcy5JdSAmJiBzdXBlci5mbCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3bCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbC5vbih0aGlzLkxvLnBhcmVudEVsZW1lbnQsIHRoaXMuZ2wsIHsgdGhyZXNob2xkOiBSdCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT2woKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGwub2ZmKHRoaXMuTG8ucGFyZW50RWxlbWVudCwgdGhpcy5nbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlh1KCkgJiYgKHN1cGVyLmRsKCksIHRoaXMuV24uZmxvYXRpbmdNb2RlID09PSBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLk9uUGFnZUxvYWQgJiYgKHRoaXMuYmwgPSAhMSksIHRoaXMud2woKSwgdGhpcy5nbCh0aGlzLnBsLmNoZWNrKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuTG8ucGFyZW50RWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogUnQKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FuRmxvYXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlh1KCkgJiYgdGhpcy5Xbi5mbG9hdGluZ01vZGUgIT09IGguUHJvdG9QbGF5ZXJGbG9hdGluZ01vZGUuT2ZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzSW5GbG9hdGluZyA/ICh0aGlzLnF1KCksIHRoaXMuSXUgPSAhMCkgOiBzdXBlci5mbCgpLCB0aGlzLk9sKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBlbmFibGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52bDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IGVuYWJsZWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZsID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVsbHNjcmVlblN0YXRlQ2hhbmdlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tbCA9IHQsIHQgPyB0aGlzLk9sKCkgOiB0aGlzLndsKCksIHRoaXMuZ2wodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgRnQgZXh0ZW5kcyBCdCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgciwgaCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoaSwgcywgZSwgbiwgciwgaCksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLkR1ID0gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVsKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEF0LkVudGVyU3RvcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxsKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBybCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgenUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlh1KCkgJiYgKHN1cGVyLmRsKCksIHN1cGVyLlZ1KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IFZ0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBEZXRhY2hlZEZyb21Eb206ICdkZXRhY2hlZEZyb21Eb20nLAogICAgICAgICAgICAgICAgICAgICAgICBBZFNsb3RSZXNpemVkOiAnYWRTbG90UmVzaXplZCcKICAgICAgICAgICAgICAgICAgICB9LCBVdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgRGV0YWNoZWRGcm9tRG9tOiAnZGV0YWNoZWRGcm9tRG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgQWRzRW5hYmxlZDogJ2Fkc0VuYWJsZWQnCiAgICAgICAgICAgICAgICAgICAgfSwgJHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE1pZFJvbGxDYXBwZWQ6ICdtaWRSb2xsQ2FwcGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxBZEJyZWFrTGVuZ3RoRXhwaXJlZDogJ3RvdGFsQWRCcmVha0xlbmd0aEV4cGlyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBFbmFibGVBZHM6ICdlbmFibGVBZHMnLAogICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlQWRzOiAnZGlzYWJsZUFkcycsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcmNlU3RvcEFkU2xvdDogJ0ZvcmNlU3RvcEFkU2xvdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcmNlU3RvcEFkUG9kOiAnRm9yY2VTdG9wQWRQb2QnLAogICAgICAgICAgICAgICAgICAgICAgICBBZE9wcG9ydHVuaXR5OiAnYWRPcHBvcnR1bml0eScsCiAgICAgICAgICAgICAgICAgICAgICAgIEFkUG9kUmVtYWluaW5nVGltZTogJ0FkUG9kUmVtYWluaW5nVGltZScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIE50LCBIdCA9IGUoMjYpLCBxdCA9IGUoMTEpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LkZpcnN0UXVhcnRpbGUgPSAwXSA9ICdGaXJzdFF1YXJ0aWxlJywgdFt0LlNlY29uZFF1YXJ0aWxlID0gMV0gPSAnU2Vjb25kUXVhcnRpbGUnLCB0W3QuVGhpcmRRdWFydGlsZSA9IDJdID0gJ1RoaXJkUXVhcnRpbGUnLCB0W3QuRm91cnRoUXVhcnRpbGUgPSAzXSA9ICdGb3VydGhRdWFydGlsZSc7CiAgICAgICAgICAgICAgICB9KE50IHx8IChOdCA9IHt9KSk7CiAgICAgICAgICAgICAgICB2YXIgenQgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoenQgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0Ll9fcHJvdG9fXyA9IGk7CiAgICAgICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gaVtlXSk7CiAgICAgICAgICAgICAgICAgICAgfSkodCwgaSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gV3QodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6dCh0LCBpKSwgdC5wcm90b3R5cGUgPSBudWxsID09PSBpID8gT2JqZWN0LmNyZWF0ZShpKSA6IChlLnByb3RvdHlwZSA9IGkucHJvdG90eXBlLCBuZXcgZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEd0KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBKdCA9ICExLCBRdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZTogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIG5ldyBFcnJvcigpLnN0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSnQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXQgdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBYdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgWXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFF0LnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFh0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgS3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWnQodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmICdvYmplY3QnID09IHR5cGVvZiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvci5jYWxsKHRoaXMpLCB0aGlzLm1lc3NhZ2UgPSB0ID8gdC5sZW5ndGggKyAnIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdW5zdWJzY3JpcHRpb246XG4nICsgdC5tYXAoZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIDEgKyAnKSAnICsgdC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignXG4gICcpIDogJycsIHRoaXMubmFtZSA9ICdVbnN1YnNjcmlwdGlvbkVycm9yJywgdGhpcy5lcnJvcnMgPSB0LCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCksIGlpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gITEsIHRoaXMuU2wgPSBudWxsLCB0aGlzLmpsID0gbnVsbCwgdCAmJiAodGhpcy5rbCA9ICEwLCB0aGlzLk9yID0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLlNsLCBzID0gdGhpcy5rbCwgbiA9IHRoaXMuT3IsIHIgPSB0aGlzLmpsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCA9ICEwLCB0aGlzLlNsID0gbnVsbCwgdGhpcy5qbCA9IG51bGwsIGUgaW5zdGFuY2VvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsICE9PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoID0gMDsgaCA8IGUubGVuZ3RoOyArK2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbaF0ucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEd0KG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgKHRoaXMuT3IgPSB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdCBpbnN0YW5jZW9mIHRpID8gZWkodC5lcnJvcnMpIDogW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChLdChyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSByLmxlbmd0aDsgKytoIDwgYTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gcltoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChadChvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSB8fCBbXSwgdCBpbnN0YW5jZW9mIHRpID8gaSA9IGkuY29uY2F0KGVpKHQuZXJyb3JzKSkgOiBpLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgdGkoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuRU1QVFk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyB0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdGhpcyB8fCBlLmNsb3NlZCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiBlLnVuc3Vic2NyaWJlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnVuc3Vic2NyaWJlKCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgPSBuZXcgdCgpKS5qbCA9IFtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5yZWNvZ25pemVkIHRlYXJkb3duICcgKyBpICsgJyBhZGRlZCB0byBTdWJzY3JpcHRpb24uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuU2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLlNsID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG4gaW5zdGFuY2VvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHRoaXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuU2wgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT09IG4uaW5kZXhPZih0aGlzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmpsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IHIgPyB0aGlzLmpsID0gW2VdIDogci5wdXNoKGUpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmpsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuaW5kZXhPZih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAhPT0gZSAmJiBpLnNwbGljZShlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5FTVBUWSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jbG9zZWQgPSAhMCwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfShuZXcgdCgpKSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBlaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbmNhdChpIGluc3RhbmNlb2YgdGkgPyBpLmVycm9ycyA6IGkpOwogICAgICAgICAgICAgICAgICAgIH0sIFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBzaSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCA/IFN5bWJvbCgncnhTdWJzY3JpYmVyJykgOiAnQEByeFN1YnNjcmliZXJfJyArIE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBuaSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoci5zeW5jRXJyb3JWYWx1ZSA9IG51bGwsIHIuc3luY0Vycm9yVGhyb3duID0gITEsIHIuc3luY0Vycm9yVGhyb3dhYmxlID0gITEsIHIuaXNTdG9wcGVkID0gITEsIGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmRlc3RpbmF0aW9uID0gWXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZGVzdGluYXRpb24gPSBZdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgaSA/IChyLnN5bmNFcnJvclRocm93YWJsZSA9IGUuc3luY0Vycm9yVGhyb3dhYmxlLCByLmRlc3RpbmF0aW9uID0gZSwgZS5hZGQocikpIDogKHIuc3luY0Vycm9yVGhyb3dhYmxlID0gITAsIHIuZGVzdGluYXRpb24gPSBuZXcgcmkociwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3luY0Vycm9yVGhyb3dhYmxlID0gITAsIHIuZGVzdGluYXRpb24gPSBuZXcgcmkociwgZSwgcywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlW3NpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLmNyZWF0ZSA9IGZ1bmN0aW9uICh0LCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBpKHQsIGUsIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc3luY0Vycm9yVGhyb3dhYmxlID0gITEsIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgfHwgdGhpcy5fbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgfHwgKHRoaXMuaXNTdG9wcGVkID0gITAsIHRoaXMuQWwodCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5jb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkIHx8ICh0aGlzLmlzU3RvcHBlZCA9ICEwLCB0aGlzLklsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51bnN1YnNjcmliZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VkIHx8ICh0aGlzLmlzU3RvcHBlZCA9ICEwLCB0LnByb3RvdHlwZS51bnN1YnNjcmliZS5jYWxsKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuX2wgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5BbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpLCB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLklsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpLCB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLkNsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLlNsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2wgPSBudWxsLCB0aGlzLnVuc3Vic2NyaWJlKCksIHRoaXMuY2xvc2VkID0gITEsIHRoaXMuaXNTdG9wcGVkID0gITEsIHRoaXMuU2wgPSB0LCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0oaWkpLCByaSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGggPSB0LmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguVGwgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEd0KGUpID8gciA9IGUgOiBlICYmIChyID0gZS5uZXh0LCBzID0gZS5lcnJvciwgbiA9IGUuY29tcGxldGUsIGUgIT09IFl0ICYmIChHdCgoYSA9IE9iamVjdC5jcmVhdGUoZSkpLnVuc3Vic2NyaWJlKSAmJiBoLmFkZChhLnVuc3Vic2NyaWJlLmJpbmQoYSkpLCBhLnVuc3Vic2NyaWJlID0gaC51bnN1YnNjcmliZS5iaW5kKGgpKSksIGguUGwgPSBhLCBoLl9sID0gciwgaC5BbCA9IHMsIGguSWwgPSBuLCBoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkICYmIHRoaXMuX2wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuVGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXQudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyAmJiBpLnN5bmNFcnJvclRocm93YWJsZSA/IHRoaXMuTWwoaSwgdGhpcy5fbCwgdCkgJiYgdGhpcy51bnN1YnNjcmliZSgpIDogdGhpcy5FbCh0aGlzLl9sLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5UbCwgZSA9IFF0LnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuQWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgaS5zeW5jRXJyb3JUaHJvd2FibGUgPyAodGhpcy5NbChpLCB0aGlzLkFsLCB0KSwgdGhpcy51bnN1YnNjcmliZSgpKSA6ICh0aGlzLkVsKHRoaXMuQWwsIHQpLCB0aGlzLnVuc3Vic2NyaWJlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkuc3luY0Vycm9yVGhyb3dhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gKGkuc3luY0Vycm9yVmFsdWUgPSB0LCBpLnN5bmNFcnJvclRocm93biA9ICEwKSA6IFh0KHQpLCB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKCksIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5UbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5JbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LklsLmNhbGwodC5QbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF0LnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgaS5zeW5jRXJyb3JUaHJvd2FibGUgPyAodGhpcy5NbChpLCBlKSwgdGhpcy51bnN1YnNjcmliZSgpKSA6ICh0aGlzLkVsKGUpLCB0aGlzLnVuc3Vic2NyaWJlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLkVsID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsKHRoaXMuUGwsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlKCksIFF0LnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLk1sID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUXQudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBjYWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuY2FsbCh0aGlzLlBsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUXQudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyA/ICh0LnN5bmNFcnJvclZhbHVlID0gaSwgdC5zeW5jRXJyb3JUaHJvd24gPSAhMCwgITApIDogKFh0KGkpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLk9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLlRsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QbCA9IG51bGwsIHRoaXMuVGwgPSBudWxsLCB0LnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSk7CiAgICAgICAgICAgICAgICB2YXIgaGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJzsKICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFpKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9pKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gdC5sZW5ndGggPyBhaSA6IDEgPT09IHQubGVuZ3RoID8gdFswXSA6IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnJlZHVjZShmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY2kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTGwgPSAhMSwgdCAmJiAodGhpcy5SbCA9IHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUubGlmdCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc291cmNlID0gdGhpcywgZS5vcGVyYXRvciA9IGksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGUuc3Vic2NyaWJlID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzLm9wZXJhdG9yLCBuID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIG5pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0W3NpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3NpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCBpIHx8IGUgPyBuZXcgbmkodCwgaSwgZSkgOiBuZXcgbmkoWXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPyBuLmFkZChzLmNhbGwobiwgdGhpcy5zb3VyY2UpKSA6IG4uYWRkKHRoaXMuc291cmNlIHx8IFF0LnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgIW4uc3luY0Vycm9yVGhyb3dhYmxlID8gdGhpcy5SbChuKSA6IHRoaXMuQmwobikpLCBRdC51c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nICYmIG4uc3luY0Vycm9yVGhyb3dhYmxlICYmIChuLnN5bmNFcnJvclRocm93YWJsZSA9ICExLCBuLnN5bmNFcnJvclRocm93bikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuLnN5bmNFcnJvclZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5CbCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUXQudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyAmJiAodC5zeW5jRXJyb3JUaHJvd24gPSAhMCwgdC5zeW5jRXJyb3JWYWx1ZSA9IGkpLCAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LCBlID0gaS5jbG9zZWQsIHMgPSBpLmRlc3RpbmF0aW9uLCBuID0gaS5pc1N0b3BwZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIHx8IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBzICYmIHMgaW5zdGFuY2VvZiBuaSA/IHMgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpID8gY29uc29sZS53YXJuKGkpIDogdC5lcnJvcihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgKGkgPSAodWkoaSkpKShmdW5jdGlvbiAoaSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZS5zdWJzY3JpYmUoZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0KSwgbiAmJiBuLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLlJsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgaS5zdWJzY3JpYmUodCk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5wcm90b3R5cGVbaGldID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICB9LCB0LnByb3RvdHlwZS5waXBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtpXSA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IHQubGVuZ3RoID8gdGhpcyA6IG9pKHQpKHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucHJvdG90eXBlLnRvUHJvbWlzZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAodCA9ICh1aSh0KSkpKGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc3Vic2NyaWJlKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmNyZWF0ZSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdChpKTsKICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdWkodCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gUXQuUHJvbWlzZSB8fCBQcm9taXNlKSwgIXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gUHJvbWlzZSBpbXBsIGZvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbGkgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdC5jYWxsKHRoaXMsIGksIGUpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zY2hlZHVsZXIgPSBpLCBzLndvcmsgPSBlLCBzLnBlbmRpbmcgPSAhMSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGkgJiYgKGkgPSAwKSwgdGhpcy5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5pZCwgcyA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAodGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQocywgZSwgaSkpLCB0aGlzLnBlbmRpbmcgPSAhMCwgdGhpcy5kZWxheSA9IGksIHRoaXMuaWQgPSB0aGlzLmlkIHx8IHRoaXMucmVxdWVzdEFzeW5jSWQocywgdGhpcy5pZCwgaSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnJlcXVlc3RBc3luY0lkID0gZnVuY3Rpb24gKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgJiYgKGUgPSAwKSwgc2V0SW50ZXJ2YWwodC5mbHVzaC5iaW5kKHQsIHRoaXMpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUucmVjeWNsZUFzeW5jSWQgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSAmJiAoZSA9IDApLCBudWxsICE9PSBlICYmIHRoaXMuZGVsYXkgPT09IGUgJiYgITEgPT09IHRoaXMucGVuZGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ2V4ZWN1dGluZyBhIGNhbmNlbGxlZCBhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLkRsKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdGhpcy5wZW5kaW5nICYmIG51bGwgIT0gdGhpcy5pZCAmJiAodGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuRGwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMSwgcyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAhMCwgcyA9ICEhdCAmJiB0IHx8IG5ldyBFcnJvcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVuc3Vic2NyaWJlKCksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLk9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmlkLCBpID0gdGhpcy5zY2hlZHVsZXIsIGUgPSBpLmFjdGlvbnMsIHMgPSBlLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndvcmsgPSBudWxsLCB0aGlzLnN0YXRlID0gbnVsbCwgdGhpcy5wZW5kaW5nID0gITEsIHRoaXMuc2NoZWR1bGVyID0gbnVsbCwgLTEgIT09IHMgJiYgZS5zcGxpY2UocywgMSksIG51bGwgIT0gdCAmJiAodGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoaSwgdCwgbnVsbCkpLCB0aGlzLmRlbGF5ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaTsKICAgICAgICAgICAgICAgICAgICB9KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDApLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0oaWkpKSwgZGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gdC5ub3cpLCB0aGlzLlNjaGVkdWxlckFjdGlvbiA9IGksIHRoaXMubm93ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuc2NoZWR1bGUgPSBmdW5jdGlvbiAodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9IDApLCBuZXcgdGhpcy5TY2hlZHVsZXJBY3Rpb24odGhpcywgdCkuc2NoZWR1bGUoZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQubm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBmaSA9IG5ldyAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IHMgJiYgKHMgPSBkaS5ub3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmNhbGwodGhpcywgZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmRlbGVnYXRlICYmIGkuZGVsZWdhdGUgIT09IG4gPyBpLmRlbGVnYXRlLm5vdygpIDogcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFjdGlvbnMgPSBbXSwgbi5hY3RpdmUgPSAhMSwgbi5zY2hlZHVsZWQgPSB2b2lkIDAsIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFd0KGksIHQpLCBpLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uIChlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBzICYmIChzID0gMCksIGkuZGVsZWdhdGUgJiYgaS5kZWxlZ2F0ZSAhPT0gdGhpcyA/IGkuZGVsZWdhdGUuc2NoZWR1bGUoZSwgcywgbikgOiB0LnByb3RvdHlwZS5zY2hlZHVsZS5jYWxsKHRoaXMsIGUsIHMsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuYWN0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSB0LmV4ZWN1dGUodC5zdGF0ZSwgdC5kZWxheSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0ID0gaS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUgPSAhMSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdCA9IGkuc2hpZnQoKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0oZGkpKShsaSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwaSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCAmJiAodCA9IDApLCB2b2lkIDAgPT09IGkgJiYgKGkgPSBmaSksIChLdChlID0gdCkgfHwgIShlIC0gcGFyc2VGbG9hdChlKSArIDEgPj0gMCkgfHwgdCA8IDApICYmICh0ID0gMCksIGkgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaS5zY2hlZHVsZSB8fCAoaSA9IGZpKSwgbmV3IGNpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkZChpLnNjaGVkdWxlKGJpLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZDogdAogICAgICAgICAgICAgICAgICAgICAgICB9KSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBiaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LnN1YnNjcmliZXIsIGUgPSB0LmNvdW50ZXIsIHMgPSB0LnBlcmlvZDsKICAgICAgICAgICAgICAgICAgICBpLm5leHQoZSksIHRoaXMuc2NoZWR1bGUoewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyOiBpLAogICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyOiBlICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kOiBzCiAgICAgICAgICAgICAgICAgICAgfSwgcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB2aSA9IDEwMDsKICAgICAgICAgICAgICAgIGNsYXNzIG1pIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0VGltZW91dCh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5GbCB8fCB0aGlzLlZsKCksIHRoaXMuVWwodCwgaSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgc2V0SW50ZXJ2YWwodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRmwgfHwgdGhpcy5WbCgpLCB0aGlzLlVsKHQsIGksICExKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNsZWFyVGltZW91dCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGwuZGVsZXRlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY2xlYXJJbnRlcnZhbCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGwuZGVsZXRlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgVmwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRmwgPSBwaSh2aSksIHRoaXMuRmwuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk5sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgSGwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsYmFjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RpbWVyU2VydmljZV9lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgTmwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlLCBzXSBvZiB0aGlzLiRsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAtIHMuc3RhcnRUaW1lIDwgcy5kdXJhdGlvbiAqIChzLmludGVydmFsVGltZXNDYWxsZWQgKyAxKSB8fCAodGhpcy5IbChzKSwgcy5pc1RpbWVvdXQgPyBpLnB1c2goZSkgOiBzLmludGVydmFsVGltZXNDYWxsZWQrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdCBvZiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbC5kZWxldGUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBVbCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSArK3RoaXMucWw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRsLnNldChzLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUaW1lb3V0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsVGltZXNDYWxsZWQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWkuJGwgPSBuZXcgTWFwKCksIG1pLnFsID0gMDsKICAgICAgICAgICAgICAgIHZhciBnaSwgeWksIHdpID0gZSgxNSksIE9pID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yLmNhbGwodGhpcyksIHRoaXMubWVzc2FnZSA9ICdvYmplY3QgdW5zdWJzY3JpYmVkJywgdGhpcy5uYW1lID0gJ09iamVjdFVuc3Vic2NyaWJlZEVycm9yJywgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCB4aSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0LmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnN1YmplY3QgPSBpLCBzLnN1YnNjcmliZXIgPSBlLCBzLmNsb3NlZCA9ICExLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUudW5zdWJzY3JpYmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuc3ViamVjdCwgaSA9IHQub2JzZXJ2ZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN1YmplY3QgPSBudWxsLCBpICYmIDAgIT09IGkubGVuZ3RoICYmICF0LmlzU3RvcHBlZCAmJiAhdC5jbG9zZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLmluZGV4T2YodGhpcy5zdWJzY3JpYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT09IGUgJiYgaS5zcGxpY2UoZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0oaWkpLCBTaSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmNhbGwodGhpcywgaSkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRlc3RpbmF0aW9uID0gaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSksIGppID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5vYnNlcnZlcnMgPSBbXSwgaS5jbG9zZWQgPSAhMSwgaS5pc1N0b3BwZWQgPSAhMSwgaS5oYXNFcnJvciA9ICExLCBpLnRocm93bkVycm9yID0gbnVsbCwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlW3NpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2kodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmxpZnQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcga2kodGhpcywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5vcGVyYXRvciA9IHQsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5vYnNlcnZlcnMsIGUgPSBpLmxlbmd0aCwgcyA9IGkuc2xpY2UoKSwgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbbl0ubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9ICEwLCB0aGlzLnRocm93bkVycm9yID0gdCwgdGhpcy5pc1N0b3BwZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLm9ic2VydmVycywgZSA9IGkubGVuZ3RoLCBzID0gaS5zbGljZSgpLCBuID0gMDsgbiA8IGU7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW25dLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMubGVuZ3RoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHRoaXMub2JzZXJ2ZXJzLCBpID0gdC5sZW5ndGgsIGUgPSB0LnNsaWNlKCksIHMgPSAwOyBzIDwgaTsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbc10uY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnVuc3Vic2NyaWJlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSAhMCwgdGhpcy5jbG9zZWQgPSAhMCwgdGhpcy5vYnNlcnZlcnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5CbCA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuQmwuY2FsbCh0aGlzLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuUmwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBPaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzRXJyb3IgPyAodC5lcnJvcih0aGlzLnRocm93bkVycm9yKSwgaWkuRU1QVFkpIDogdGhpcy5pc1N0b3BwZWQgPyAodC5jb21wbGV0ZSgpLCBpaS5FTVBUWSkgOiAodGhpcy5vYnNlcnZlcnMucHVzaCh0KSwgbmV3IHhpKHRoaXMsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuYXNPYnNlcnZhYmxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgY2koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNvdXJjZSA9IHRoaXMsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuY3JlYXRlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcga2kodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShjaSksIGtpID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHQuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZGVzdGluYXRpb24gPSBpLCBzLnNvdXJjZSA9IGUsIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFd0KGksIHQpLCBpLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5uZXh0ICYmIGkubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpLmVycm9yICYmIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmNvbXBsZXRlICYmIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuUmwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlID8gdGhpcy5zb3VyY2Uuc3Vic2NyaWJlKHQpIDogaWkuRU1QVFk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShqaSk7CiAgICAgICAgICAgICAgICBjbGFzcyBfaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0pKCksIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwMDsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVyRHVyYXRpb24gPSB0LCB0aGlzLnpsID0gaSwgdGhpcy5XbCA9IGUsIHRoaXMuR2wgPSAwLCB0aGlzLkpsID0gbnVsbCwgdGhpcy5RbCA9ICExLCB0aGlzLllsID0gITEsIHRoaXMuS2wgPSBuZXcgamkoKSwgdGhpcy5abCA9IG5ldyBqaSgpLCB0aGlzLnRkID0gbmV3IGppKCksIHRoaXMuZWQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IE50LkZpcnN0UXVhcnRpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhcnRpbGU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IE50LlNlY29uZFF1YXJ0aWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBOdC5UaGlyZFF1YXJ0aWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBOdC5Gb3VydGhRdWFydGlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGlsZTogNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLnNkID0gbnVsbCwgdGhpcy5uZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmQoKSwgdGhpcy5LbC5uZXh0KCksIHRoaXMuaGQoKSwgdGhpcy5vZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0IHx8IHRoaXMuZGlzYWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ZbCA9ICEwLCBudWxsID09PSB0aGlzLkpsICYmIHRoaXMudWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ZbCA9ICExLCBudWxsICE9PSB0aGlzLkpsICYmICh0aGlzLnJkKCksIHRoaXMubGQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc2V0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAodGhpcy50aW1lckR1cmF0aW9uID0gdCksIHRoaXMuR2wgPSAwLCB0aGlzLlFsID0gITEsIHRoaXMuc2QgPSBudWxsLCAobnVsbCAhPT0gdGhpcy5KbCB8fCB0aGlzLllsKSAmJiAodGhpcy5sZCgpLCB0aGlzLnVkKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdGltZUVsYXBzZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdGltZVJlbWFpbmluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGltZXJEdXJhdGlvbiAtIHRoaXMuR2w7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUWwgPSAhMCwgdGhpcy5sZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25UaW1lVXBkYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5LbC5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uVGltZUVsYXBzZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpsLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25RdWFydGlsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGQuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdsICs9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5vZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUWwgfHwgKHRoaXMuaGQoKSwgdGhpcy5vZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCB0aGlzLkpsID0gbWkuc2V0SW50ZXJ2YWwodGhpcy5uZCwgdGhpcy56bCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWkuY2xlYXJJbnRlcnZhbCh0aGlzLkpsKSwgdGhpcy5KbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKSwgdGhpcy5abC5uZXh0KCksIHRoaXMuZmQodGhpcy5HbCwgdGhpcy50aW1lckR1cmF0aW9uLCB0aGlzLldsKSwgdGhpcy5HbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdsIC8gcXQuZiA+PSB0aGlzLnRpbWVyRHVyYXRpb24gLyBxdC5mICYmIHRoaXMuZGQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gT2JqZWN0KHdpLmYpKHQgLyBxdC5mLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZChzLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5mbG9vcihPYmplY3Qod2kuZSkoMCwgaSwgMCwgNCwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNkIDw9IGUgJiYgKHRoaXMuZWQuZm9yRWFjaCgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGlsZTogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09PSBlICYmIHRoaXMudGQubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2QrKyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQWkodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Vbmtub3duID0gMF0gPSAnVW5rbm93bicsIHRbdC5UaW1lb3V0QmV0d2VlbkFkcyA9IDFdID0gJ1RpbWVvdXRCZXR3ZWVuQWRzJzsKICAgICAgICAgICAgICAgIH0oZ2kgfHwgKGdpID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIElpIGV4dGVuZHMgby5hIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLmNvbnRyb2xEYXRhID0gZSwgdGhpcy5hcHAgPSBzLCB0aGlzLmJkID0gMCwgdGhpcy52ZCA9IDAsIHRoaXMuZ2QgPSBudWxsLCB0aGlzLnlkID0gbmV3IE1hcCgpLCB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgPSBNLlByb3RvQWRTbG90c0VudW0uUHJlUm9sbCwgdGhpcy53ZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BwZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHk6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbXByZXNzaW9uOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlRGlzYWJsZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvRGltZW5zaW9uOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXBwQmFja2dyb3VuZGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXBwUmVjeWNsZXJWaWV3Vmlld2FiaWxpdHk6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZmlyc3RBZEJyZWFrU3RhcnRlZCA9ICExLCB0aGlzLk9kID0gITEsIHRoaXMudmlld2FiaWxpdHlTdGF0ZUNoYW5nZWQoaSksIHRoaXMub25SZXNpemUodGhpcy5jb250cm9sRGF0YS5wbGF5ZXJEaW1lbnNpb25zLndpZHRoLCB0aGlzLmNvbnRyb2xEYXRhLnBsYXllckRpbWVuc2lvbnMuaGVpZ2h0KSwgdGhpcy5jb250cm9sRGF0YS50b3RhbEFkQnJlYWtMZW5ndGggJiYgKHRoaXMueGQgPSBuZXcgX2kodGhpcy5jb250cm9sRGF0YS50b3RhbEFkQnJlYWtMZW5ndGgpLCB0aGlzLnlkLnNldCh0aGlzLnhkLCBbdGhpcy54ZC5vblRpbWVFbGFwc2VkLnN1YnNjcmliZSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsICR0LlRvdGFsQWRCcmVha0xlbmd0aEV4cGlyZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFNkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52ZCA+PSB0aGlzLmNvbnRyb2xEYXRhLm51bWJlck9mTWlkUm9sbHMgJiYgLTEgIT09IHRoaXMuY29udHJvbERhdGEubnVtYmVyT2ZNaWRSb2xsczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgamQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnN0b3AoKSwgQWkodGhpcy55ZC5nZXQodCkpLCB0aGlzLnlkLmRlbGV0ZSh0KSwgbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga2QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLk9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9kID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoLlByb3RvQWRTbG90c0VudW0uUHJlUm9sbF06IGguUHJvdG9BZEJyZWFrVHlwZUVudW0uUHJlUm9sbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGxdOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLk1pZFJvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9BZFNsb3RzRW51bS5Qb3N0Um9sbF06IGguUHJvdG9BZEJyZWFrVHlwZUVudW0uUG9zdFJvbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgJHQuQWRPcHBvcnR1bml0eSwgeyBwYXlsb2FkOiB7IGFkQnJlYWtUeXBlOiB0W3RoaXMuY3VycmVudFBsYXllckFkU2xvdF0gfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgJHQuRW5hYmxlQWRzKSwgdGhpcy54ZCAmJiB0aGlzLnhkLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbkVuYWJsZUFkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2Quc3RvcHBlZCB8fCB0aGlzLndkLnZpZXdhYmlsaXR5IHx8IHRoaXMud2QuaW5JbXByZXNzaW9uIHx8IHRoaXMud2QuZm9yY2VEaXNhYmxlIHx8IHRoaXMud2QuemVyb0RpbWVuc2lvbiB8fCB0aGlzLndkLmlzQXBwQmFja2dyb3VuZGVkIHx8IHRoaXMud2QuaW5BcHBSZWN5Y2xlclZpZXdWaWV3YWJpbGl0eSA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUFkczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVhc29uOiBnaS5Vbmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgPT09IE0uUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsICYmIHRoaXMuU2QoKSA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUFkczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVhc29uOiBnaS5Vbmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgIT09IE0uUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsICYmIHRoaXMuYmQgPiAwID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQWRzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZWFzb246IGdpLlVua25vd24KICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUFkczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVhc29uOiBnaS5Vbmtub3duCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRvZ2dsZUVuYWJsZUFkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY2FuRW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZW5hYmxlQWRzID8gdGhpcy5rZCgpIDogKHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCAkdC5EaXNhYmxlQWRzLCB7IHBheWxvYWQ6IHQuZGlzYWJsZVJlYXNvbiB9KSwgdGhpcy54ZCAmJiAhdGhpcy53ZC5pbkltcHJlc3Npb24gJiYgdGhpcy54ZC5zdG9wKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEFkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZC5zdG9wcGVkID0gITEsIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmNlUmVjaGVjaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVFbmFibGVBZHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25BZEltcHJlc3Npb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgPT09IE0uUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsICYmICh0aGlzLmZpcnN0QWRCcmVha1N0YXJ0ZWQgfHwgKHRoaXMuZmlyc3RBZEJyZWFrU3RhcnRlZCA9ICEwKSksIHRoaXMud2QuaW5JbXByZXNzaW9uID0gITAsIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCksIHRoaXMuX2QoKSwgdGhpcy5JZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5DZCh0LnBheWxvYWQuYWRTa2lwTW9kZSwgdC5wYXlsb2FkLmFkRHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBpID4gMCAmJiAodGhpcy5nZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsICR0LkZvcmNlU3RvcEFkU2xvdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgKiBxdC5mKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIElkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xEYXRhLm1heEFkUG9kRHVyYXRpb24gJiYgIXRoaXMuVGQgJiYgKHRoaXMuVGQgPSBuZXcgX2kodGhpcy5jb250cm9sRGF0YS5tYXhBZFBvZER1cmF0aW9uKSwgdGhpcy5UZC5zdGFydCgpLCB0aGlzLnlkLnNldCh0aGlzLlRkLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRkLm9uVGltZUVsYXBzZWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgJHQuRm9yY2VTdG9wQWRQb2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRkLm9uVGltZVVwZGF0ZS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlRkLnRpbWVSZW1haW5pbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsICR0LkFkUG9kUmVtYWluaW5nVGltZSwgeyBwYXlsb2FkOiB7IHJlbWFpbmluZ1RpbWU6IHQgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbERhdGEubWF4QWRTbG90RHVyYXRpb24gJiYgIXRoaXMuUGQgJiYgKHRoaXMuUGQgPSBuZXcgX2kodGhpcy5jb250cm9sRGF0YS5tYXhBZFNsb3REdXJhdGlvbiksIHRoaXMuUGQuc3RhcnQoKSwgdGhpcy55ZC5zZXQodGhpcy5QZCwgW3RoaXMuUGQub25UaW1lRWxhcHNlZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCAkdC5Gb3JjZVN0b3BBZFNsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENkKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNvbnRyb2xEYXRhLnBsYXllckFkc1NraXBwYWJpbGl0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJBZFNraXBwYWJpbGl0eS5JZkxvbmdlclRoYW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPT09IGguUHJvdG9BZFNraXBNb2RlLk5ldmVyIHx8IHQgPT09IGguUHJvdG9BZFNraXBNb2RlLklmTG9uZ2VyVGhhbjMxU2VjKSAmJiAhaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sRGF0YS5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gaC5Qcm90b0FkU2tpcE1vZGUuTmV2ZXIgJiYgaSA+IHRoaXMuY29udHJvbERhdGEuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xEYXRhLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJBZFNraXBwYWJpbGl0eS5Ob1Jlc3RyaWN0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09PSBoLlByb3RvQWRTa2lwTW9kZS5JZkxvbmdlclRoYW4zMVNlYyAmJiAhaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHQuZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25BZEZpbmlzaGVkKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBkID0gdGhpcy5qZCh0aGlzLlBkKSwgaSB8fCAodGhpcy5UZCA9IHRoaXMuamQodGhpcy5UZCksIHRoaXMuY3VycmVudFBsYXllckFkU2xvdCA9PT0gTS5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwgPyB0aGlzLnZkKysgOiB0aGlzLmJkKyspLCB0aGlzLlNkKCkgJiYgIWkgJiYgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsICR0Lk1pZFJvbGxDYXBwZWQpLCB0ICYmICh0aGlzLk9kID0gITApLCB0aGlzLndkLmluSW1wcmVzc2lvbiA9ICExLCBpID8gdGhpcy5rZCgpIDogdGhpcy50b2dnbGVFbmFibGVBZHMoKSwgY2xlYXJUaW1lb3V0KHRoaXMuZ2QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkFkUGF1c2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVGQgJiYgdGhpcy5UZC5zdG9wKCksIHRoaXMuUGQgJiYgdGhpcy5QZC5zdG9wKCksIHRoaXMueGQgJiYgdGhpcy54ZC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQWRQbGF5KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRkICYmIHRoaXMuVGQuc3RhcnQoKSwgdGhpcy5QZCAmJiB0aGlzLlBkLnN0YXJ0KCksIHRoaXMueGQgJiYgdGhpcy54ZC5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblN0b3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYXllckFkU2xvdCA9IG51bGwsIHRoaXMud2Quc3RvcHBlZCA9ICEwLCB0aGlzLnRvZ2dsZUVuYWJsZUFkcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkFkU3RhdGVDaGFuZ2UodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xEYXRhLm1heEFkU2xvdER1cmF0aW9uID0gaS5tYXhBZFNsb3REdXJhdGlvbiwgdGhpcy5jb250cm9sRGF0YS5tYXhBZFBvZER1cmF0aW9uID0gaS5tYXhBZFBvZER1cmF0aW9uLCB0ID09PSB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgJiYgdCA9PT0gTS5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwgfHwgKG51bGwgPT09IHQgJiYgdGhpcy5FZCA9PT0gTS5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwgfHwgKHRoaXMuT2QgPSAhMCksIHQgIT09IE0uUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsICYmICh0aGlzLmJkID0gMCwgdGhpcy5maXJzdEFkQnJlYWtTdGFydGVkID0gITEpLCB0aGlzLmN1cnJlbnRQbGF5ZXJBZFNsb3QgPSB0LCB0aGlzLkVkID0gdCwgdGhpcy5zdGFydEFkcygpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGVudENoYW5nZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmQgPSAwLCB0aGlzLmZpcnN0QWRCcmVha1N0YXJ0ZWQgPSAhMSwgdGhpcy50b2dnbGVFbmFibGVBZHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTdGF0ZUNoYW5nZWQodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MZCA9IHQsIHRoaXMuY29udHJvbERhdGEudmlld2FiaWxpdHlQb2xpY3kgPT09IE0uUHJvdG9BZFZpZXdhYmlsaXR5UG9saWN5LlN0cmljdCAmJiAodGhpcy53ZC52aWV3YWJpbGl0eSA9ICF0KSwgZSB8fCB0aGlzLnRvZ2dsZUVuYWJsZUFkcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRUb2dnbGVBZHNSZWFzb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndkLmlzQXBwQmFja2dyb3VuZGVkID0gdC5pc0FwcEJhY2tncm91bmRlZCwgdGhpcy53ZC5pbkFwcFJlY3ljbGVyVmlld1ZpZXdhYmlsaXR5ID0gdC5pbkFwcFJlY3ljbGVyVmlld1ZpZXdhYmlsaXR5LCB0aGlzLnRvZ2dsZUVuYWJsZUFkcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQWR2ZXJ0aXNpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2QuZm9yY2VEaXNhYmxlID0gITAsIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZUFkdmVydGlzaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndkLmZvcmNlRGlzYWJsZSA9ICExLCB0aGlzLnRvZ2dsZUVuYWJsZUFkcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhkICYmIHRoaXMueGQuZGlzYWJsZSgpLCBjbGVhclRpbWVvdXQodGhpcy5nZCksIHRoaXMuUGQgPSB0aGlzLmpkKHRoaXMuUGQpLCB0aGlzLlRkID0gdGhpcy5qZCh0aGlzLlRkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGluVmlldygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uUmVzaXplKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZC56ZXJvRGltZW5zaW9uID0gMCA9PT0gdCB8fCAwID09PSBpLCB0aGlzLnRvZ2dsZUVuYWJsZUFkcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Qb3J0cmFpdCA9IDBdID0gJ1BvcnRyYWl0JywgdFt0LkxhbmRzY2FwZSA9IDFdID0gJ0xhbmRzY2FwZSc7CiAgICAgICAgICAgICAgICB9KHlpIHx8ICh5aSA9IHt9KSk7CiAgICAgICAgICAgICAgICB2YXIgQ2kgPSB5aTsKICAgICAgICAgICAgICAgIGNvbnN0IFRpID0gMS4zOwogICAgICAgICAgICAgICAgY2xhc3MgUGkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cmxTdWZmaXhlclNlcnZpY2UgPSB0LCB0aGlzLlJkID0ge30sIHRoaXMuQmQgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0SW1hZ2UodCwgaSwgZSwgcywgbiA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICB9KSgpLCByID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGQgPSB0LCB0aGlzLkZkID0gT2JqZWN0KHJ0LmgpKGkpID8gaSA6ICcnLCB0aGlzLlZkID0gZSwgdGhpcy5VZCA9IHMsIHRoaXMubHIgPSBuLCB0aGlzLiRkID0gciwgdGhpcy5OZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuSGQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuRGQgKyB0aGlzLmxyLCBlID0gbmV3IEltYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNyYyA9IHRoaXMudXJsU3VmZml4ZXJTZXJ2aWNlLmFwcGVuZFBhcmFtc1RvVXJsKGkpLCBlLmFsdCA9IHRoaXMuRmQsIHRoaXMuUmRbdGhpcy5EZF0gPSB0aGlzLlJkW3RoaXMuRGRdIHx8IHt9LCB0aGlzLlJkW3RoaXMuRGRdW3RoaXMuVmRdID0gdGhpcy5SZFt0aGlzLkRkXVt0aGlzLlZkXSB8fCB7fSwgdGhpcy5SZFt0aGlzLkRkXVt0aGlzLlZkXVt0aGlzLlVkXSA9IHRoaXMuUmRbdGhpcy5EZF1bdGhpcy5WZF1bdGhpcy5VZF0gfHwge30sIHRoaXMuUmRbdGhpcy5EZF1bdGhpcy5WZF1bdGhpcy5VZF1bdGhpcy5scl0gPSBlLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMucWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLldkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkdkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIHx8IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgemQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLlJkW3RoaXMuRGRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKHRoaXMuQmQgPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlJkW3RoaXMuRGRdLCBlID0gdGhpcy5WZCA+IHRoaXMuVWQgPyBDaS5MYW5kc2NhcGUgOiBDaS5Qb3J0cmFpdDsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaSkuZm9yRWFjaChzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBwYXJzZUludChzLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpW3NdKS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhaVtzXVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHBhcnNlSW50KGksIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG4gPiBzID8gQ2kuTGFuZHNjYXBlIDogQ2kuUG9ydHJhaXQpICE9PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYTogbiAqIHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzogdGhpcy5KZCh0aGlzLkRkLCBuLCBzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLkJkID0gWy4uLnRdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKZCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlJkW3RdICYmIHRoaXMuUmRbdF1baV0gJiYgdGhpcy5SZFt0XVtpXVtlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJkW3RdW2ldW2VdW09iamVjdC5rZXlzKHRoaXMuUmRbdF1baV1bZV0pWzBdXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJkW3RoaXMuRGRdICYmIHRoaXMuUmRbdGhpcy5EZF1bdGhpcy5WZF0gJiYgdGhpcy5SZFt0aGlzLkRkXVt0aGlzLlZkXVt0aGlzLlVkXSAmJiB0aGlzLlJkW3RoaXMuRGRdW3RoaXMuVmRdW3RoaXMuVWRdW3RoaXMubHJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IHRoaXMuQmQubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5WZCAqIHRoaXMuVWQsIGkgPSB0aGlzLkJkLmZpbHRlcigoe2FyZWE6IGl9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuc29ydCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFyZWEgLSBpLmFyZWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IGkubGVuZ3RoID8gaVswXS5pbWcgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdkKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdGhpcy5CZC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlZkICogdGhpcy5VZCwgaSA9IHRoaXMuQmQuZmlsdGVyKCh7YXJlYTogaX0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA8IHQgJiYgdCAvIGkgPD0gVGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5zb3J0KCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYXJlYSAtIHQuYXJlYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gaS5sZW5ndGggPyBpWzBdLmltZyA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgTWkgPSBlKDQzKTsKICAgICAgICAgICAgICAgIGNsYXNzIEVpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUWQgPSB0LCB0aGlzLlhkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtUeXBlOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLk5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9kTnVtYmVyOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWRTbG90RHVyYXRpb246IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZFBvZER1cmF0aW9uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxOdW1iZXJPZkFkU2xvdHM6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ZZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldE5ld0JyZWFrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RZC5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlcy5mb3JFYWNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlByZVJvbGw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaSA9PT0gaC5Qcm90b0FkU2xvdHNFbnVtLlByZVJvbGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQWRCcmVha1R5cGVFbnVtLk1pZFJvbGw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gaSA9PT0gaC5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlBvc3RSb2xsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGkgPT09IGguUHJvdG9BZFNsb3RzRW51bS5Qb3N0Um9sbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHQpICYmICh0aGlzLlhkLmN1cnJlbnRQb2ROdW1iZXIgPSBpLm51bWJlck9mQWRTbG90cywgdGhpcy5YZC5tYXhBZFNsb3REdXJhdGlvbiA9IGkubWF4QWRTbG90RHVyYXRpb24sIHRoaXMuWGQubWF4QWRQb2REdXJhdGlvbiA9IGkubWF4QWRQb2REdXJhdGlvbiwgdGhpcy5YZC50b3RhbE51bWJlck9mQWRTbG90cyA9IGkubnVtYmVyT2ZBZFNsb3RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkU3RhcnRlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5LZCgpLCAwID09PSB0aGlzLlhkLmN1cnJlbnRQb2ROdW1iZXIgJiYgKHRoaXMuWGQuY3VycmVudFBvZE51bWJlciA9IHRoaXMuWGQudG90YWxOdW1iZXJPZkFkU2xvdHMpLCB0aGlzLlhkLmN1cnJlbnRQb2ROdW1iZXItLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW5kUG9kKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLktkKCksIHRoaXMuWGQuY3VycmVudFBvZE51bWJlciA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudGVyUG9kVGltZW91dCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuS2QoKSwgdGhpcy5ZZCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5LZCgpLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGspOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0luQWRQb2QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhkLmN1cnJlbnRQb2ROdW1iZXIgPiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnRCcmVha0luUG9kKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YZC50b3RhbE51bWJlck9mQWRTbG90cyA+IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldE1heEFkU2xvdER1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YZC5tYXhBZFNsb3REdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWF4QWRQb2REdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWGQubWF4QWRQb2REdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWF4QWRTbG90UG9zc2libGVEdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuUWQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSB0aGlzLlFkW2ldLm1heEFkU2xvdER1cmF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGgubWF4KHQsIHRoaXMuUWRbaV0ubWF4QWRTbG90RHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50U2xvdEluZGV4KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YZC50b3RhbE51bWJlck9mQWRTbG90cyAtIHRoaXMuWGQuY3VycmVudFBvZE51bWJlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TmV4dFNsb3RJbmRleCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0Q3VycmVudFNsb3RJbmRleCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YZC50b3RhbE51bWJlck9mQWRTbG90cyA+IHQgPyB0ICsgMSA6IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFRvdGFsTnVtYmVyT2ZTbG90cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWGQudG90YWxOdW1iZXJPZkFkU2xvdHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzSW5Qb2RUaW1lb3V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLllkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuWWQpLCB0aGlzLllkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgTGkgPSBlKDgpLCBSaSA9IGUoNDcpOwogICAgICAgICAgICAgICAgY29uc3QgQmkgPSBbJ2NvbS5hY2N1d2VhdGhlci5hbmRyb2lkJ10sIERpID0gMC4wNSAqIHF0LmY7CiAgICAgICAgICAgICAgICBjbGFzcyBGaSBleHRlbmRzIG8uYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5IcyA9IGksIHRoaXMuX2FwcFNldHRpbmdzID0gZSwgdGhpcy5aZCA9IHMsIHRoaXMudGYgPSAwLjAxLCB0aGlzLmlmID0gMC41LCB0aGlzLmVmID0gMjAwMCwgdGhpcy5zZiA9IDAsIHRoaXMubmYgPSAhMSwgdGhpcy5yZiA9ICExLCB0aGlzLmhmID0gITEsIHRoaXMuYWYgPSAhMSwgdGhpcy5jZiA9ICExLCB0aGlzLnVmID0gITEsIHRoaXMuTGQgPSAhMSwgdGhpcy5PaCA9IGguUHJvdG9BZFNsb3RzRW51bS5QcmVSb2xsLCB0aGlzLnV1ID0gITEsIHRoaXMubGYgPSAhMSwgdGhpcy5kZiA9ICExLCB0aGlzLmZmID0gITEsIHRoaXMucGYgPSAhMSwgdGhpcy5iZiA9ICExLCB0aGlzLnZmID0gITEsIHRoaXMubWYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZFJlbWFpbmluZ1RpbWVDaGFuZ2VdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBmICYmIHRoaXMuYXBwLmNvbmZpZy5pc0luQXBwQW5kcm9pZCAmJiAobnVsbCA9PT0gKGkgPSB0aGlzLmFkSGFuZGxlcikgfHwgdm9pZCAwID09PSBpIHx8IGkucGF1c2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRJbXByZXNzaW9uXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZi5vbkFkSW1wcmVzc2lvbih0KSwgdGhpcy55ZigpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYi5BZEltcHJlc3Npb24sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTb3VyY2VEYXRhOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BZERhdGE6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5wYXlsb2FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2YoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRTdG9wcGVkXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmIuQWRTdG9wcGVkLCB0KSwgdGhpcy5PZigpLCB0aGlzLnhmKCksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFN0b3BwZWQoKSwgdGhpcy5MZCAmJiB0aGlzLlNmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRFcnJvcl06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbiAmJiB0aGlzLk9mKCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLkFkRXJyb3IsIHQpLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQdC5iLkFkU2tpcHBlZF06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLkFkU2tpcHBlZCwgdCksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFNraXBwZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb2F0aW5nTW9kdWxlICYmICh0aGlzLmZsb2F0aW5nTW9kdWxlLmVuYWJsZWQgPSAhMCksIHRoaXMuT2YoITApLCB0aGlzLnhmKCksIHRoaXMuTGQgJiYgdGhpcy5TZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQdC5iLkFkUGF1c2VkXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZi5vbkFkUGF1c2UoKSwgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnNldFNlc3Npb25QbGF5YmFjayghMSksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFBhdXNlZCgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYi5BZFBhdXNlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZFBsYXlpbmddOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdmLm9uQWRQbGF5KCksIHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5zZXRTZXNzaW9uUGxheWJhY2soITApLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRQbGF5aW5nKCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLkFkUGxheSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRWaWRlb0ZpcnN0UXVhcnRpbGVdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYi5BZENvbXBsZXRlZDI1LCB0KSwgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkVmlkZW9GaXJzdFF1YXJ0aWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRWaWRlb01pZHBvaW50XTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmIuQWRDb21wbGV0ZWQ1MCwgdCksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFZpZGVvTWlkcG9pbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZFZpZGVvVGhpcmRRdWFydGlsZV06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLkFkQ29tcGxldGVkNzUsIHQpLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRWaWRlb1RoaXJkUXVhcnRpbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZFZpZGVvQ29tcGxldGVdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYi5BZENvbXBsZXRlZDEwMCwgdCksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFZpZGVvQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZENsaWNrVGhydV06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLkFkQ2xpY2ssIHQpLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRDbGlja1RocnUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZEludGVyYWN0aW9uXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZEludGVyYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRVc2VyQWNjZXB0SW52aXRhdGlvbl06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRJbnRlcmFjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQdC5iLkFkVXNlckNsb3NlXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZEludGVyYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW1B0LmIuQWRVc2VyTWluaW1pemVdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkSW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbUHQuYi5BZFZpZGVvU3RhcnRdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7YWRTb3VyY2VEYXRhOiBpfSA9IHQucGF5bG9hZCwgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBpICYmIGkubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFQbGF5ZXJWb2x1bWU6IHRoaXMuZ2V0Vm9sdW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRWaWRlb1N0YXJ0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQdC5iLkFkTG9hZGVkXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2FkTG9hZGVkRGF0YTogZX0gPSB0LnBheWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT09IChpID0gZSkgfHwgdm9pZCAwID09PSBpID8gdm9pZCAwIDogaS5za2lwT2Zmc2V0KSA8IDAgJiYgKGUuc2tpcE9mZnNldCA9IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuamYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkTG9hZGVkKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQdC5iLkFkVm9sdW1lQ2hhbmdlXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFZvbHVtZUNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmtmID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMubWZbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5fZiA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZiA9IHQsIHQgJiYgKHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5vZmYodGhpcy4kcGxheWVyQ29udGFpbmVyLCB0aGlzLl9mKSwgdGhpcy5BZigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5JZiA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0aGlzLmFkSGFuZGxlciAmJiAhdGhpcy5mZiAmJiBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlci5yZXN1bWVXaXRob3V0VXNlckludGVyYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBEaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQ2YgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5yZiAmJiB0aGlzLlRmKCkgJiYgKHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBjLmIuQ2FuU3RhcnQpLCB0aGlzLmFwcC5zZXJ2aWNlcy5SZXNpemVPYnNlcnZlci5vZmYodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciwgdGhpcy5DZikpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlBmID0gKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFjazogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Z1bGxzY3JlZW5DbG9zZTogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZsb2F0aW5nTW9kdWxlICYmIE9iamVjdChydC5hKSh0KSAmJiAhaSAmJiAodGhpcy5mbG9hdGluZ01vZHVsZS5lbmFibGVkID0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuTWYgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkVmKDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkxmID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FZigwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5SZiA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QZih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtwbGF5YmFjazogaX0gPSB0LnBheWxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYSkoaSkgJiYgKGkgPyAodGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkUGxheSgpLCB0aGlzLmZmID0gITEpIDogKHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRBZFBhdXNlKCksIHRoaXMuZmYgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkJmID0gbmV3IFBpKHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEZigpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2YodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0QWRJbXByZXNzaW9uKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4ZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkQ29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRmYoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFNmKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWZigpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVWYoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRmKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOZigpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSGYoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFmKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsgc3RhdGU6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkU3RhdGVDaGFuZ2UoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHpmKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50V2lkdGg6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy4kcGxheWVyQ29udGFpbmVyLCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdFBsYXllclJlc2l6ZWQoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFdmKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0T25FbnRlckZ1bGxzY3JlZW4oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR2YoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRPbkV4aXRGdWxsc2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEpmKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0T25QbGF5ZXJDb2xsYXBzZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUWYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRPblBsYXllckV4cGFuZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhmKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ZZih0KSwgdGhpcy5LZih0KSwgdGhpcy5aZih0KSwgdGhpcy5PaCA9IHQsIHRoaXMudHAodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEtmKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuYWRTdGF0ZUNoYW5nZSh0LCB0aGlzLmVwLmdldE1heEFkU2xvdER1cmF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBaZih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2Yub25BZFN0YXRlQ2hhbmdlKHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEFkUG9kRHVyYXRpb246IHRoaXMuZXAuZ2V0TWF4QWRQb2REdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWRTbG90RHVyYXRpb246IHRoaXMuZXAuZ2V0TWF4QWRTbG90RHVyYXRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWWYodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVwLnNldE5ld0JyZWFrKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucWYoTWkuYlt0XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5jb250ZW50Q2hhbmdlZCgpLCB0aGlzLmdmLmNvbnRlbnRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5wKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciA9IHRoaXMucnAoKSwgdGhpcy5hcCgpLCB0aGlzLnJlbGF5KFR0LmIuSW1wcmVzc2lvblByaWNlLCB0aGlzLmFkSGFuZGxlciwgdGhpcywgdGhpcy5tZWRpYXRvciksIHRoaXMucmVsYXkoVHQuYi5JbXByZXNzaW9uUmV2ZW51ZSwgdGhpcy5hZEhhbmRsZXIsIHRoaXMsIHRoaXMubWVkaWF0b3IpLCB0aGlzLnN1YnNjcmliZShjLmIuVXNlckludGVyYWN0aW9uLCB0aGlzLmFkSGFuZGxlciwgdGhpcy5SZiksIHRoaXMuc3Vic2NyaWJlKFZ0LkRldGFjaGVkRnJvbURvbSwgdGhpcy5hZEhhbmRsZXIsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZS5pc0RldGFjaGVkRnJvbURPTSh0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyKSA/IHRoaXMudHJpZ2dlckRlc3Ryb3koKSA6ICh0aGlzLnVuc3Vic2NyaWJlQWxsKHRoaXMuYWRIYW5kbGVyKSwgdGhpcy5hZEhhbmRsZXIuZGVzdHJveSgpLCB0aGlzLmFkSGFuZGxlciA9IG51bGwsIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ29ubHlfYWRIYW5kbGVyX2Rlc3Ryb3llZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2Uuc2V0QWRTdGFydCgpLCB0aGlzLmRmID0gITAsIHRoaXMuZmYgPSAhMSwgdGhpcy5BZigpLCB0aGlzLnVuc3Vic2NyaWJlKFV0LkFkc0VuYWJsZWQsIHRoaXMuYWRIYW5kbGVyLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoVXQuQWRzRW5hYmxlZCwgdGhpcy5hZEhhbmRsZXIsIHQpLCB0aGlzLnN1YnNjcmliZShWdC5BZFNsb3RSZXNpemVkLCB0aGlzLmFkSGFuZGxlciwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZi5vblJlc2l6ZSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFwKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhQdC5iKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoUHQuYlt0XSwgdGhpcy5hZEhhbmRsZXIsIGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBQdC5iW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua2YoZSkoaSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT2YodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5lcC5pc0luQWRQb2QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoaSA9ICExLCB0aGlzLmVwLmVuZFBvZCgpKSwgdGhpcy5nZi5vbkFkRmluaXNoZWQodGhpcy5hZEhhbmRsZXIuaW5JbXByZXNzaW9uLCBpKSwgdGhpcy5vcCgpLCB0aGlzLmNwLmlzQ2xvc2VCdXR0b24gJiYgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuZmlyc3RBZFNob3duICYmICh0aGlzLmNwLmNsb3NlQnV0dG9uTW9kZSAhPT0gaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5PbkhvdmVyQWZ0ZXJGaXJzdEFkIHx8IE9iamVjdChULnQpKHRoaXMuJHBsYXllckNvbnRhaW5lciwgZC5nLkNsb3NlSG92ZXIpIHx8IE9iamVjdChULmEpKHRoaXMuJHBsYXllckNvbnRhaW5lciwgZC5nLkNsb3NlSG92ZXIpLCB0aGlzLmNwLmZsb2F0aW5nU2V0dGluZ3MuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUgIT09IGguUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUuT25Ib3ZlckFmdGVyRmlyc3RBZCB8fCBPYmplY3QoVC50KSh0aGlzLiRwbGF5ZXJDb250YWluZXIsIGQuZy5DbG9zZUZsb2F0SG92ZXIpIHx8IE9iamVjdChULmEpKHRoaXMuJHBsYXllckNvbnRhaW5lciwgZC5nLkNsb3NlRmxvYXRIb3ZlcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5ZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcC5hZFN0YXJ0ZWQoKSwgdGhpcy5hZEhhbmRsZXIuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyLmVudGVyQWRQb2RMb2FkaW5nU3RhdGUoKSwgdGhpcy5lcC5lbnRlclBvZFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcC5lbmRQb2QoKSwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmkpKHRoaXMuJHBsYXllckNvbnRhaW5lciksIHRoaXMuZ2YgPSB0aGlzLmRwKCksIHRoaXMuc3Vic2NyaWJlKCR0LkVuYWJsZUFkcywgdGhpcy5nZiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuZW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSgkdC5EaXNhYmxlQWRzLCB0aGlzLmdmLCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyICYmIHRoaXMuYWRIYW5kbGVyLmRpc2FibGVBZHModC5wYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKCR0LkZvcmNlU3RvcEFkU2xvdCwgdGhpcy5nZiwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuc3RvcEFkKCdmb3JjZVN0b3BBZFNsb3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKCR0LkZvcmNlU3RvcEFkUG9kLCB0aGlzLmdmLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hZEhhbmRsZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcC5lbmRQb2QoKSwgdGhpcy5hZEhhbmRsZXIuc3RvcEFkKCdmb3JjZVN0b3BBZFBvZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoJHQuQWRQb2RSZW1haW5pbmdUaW1lLCB0aGlzLmdmLCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyICYmIHRoaXMuYWRIYW5kbGVyLnVwZGF0ZVBvZFJlbWFpbmluZ1RpbWUodC5wYXlsb2FkLnJlbWFpbmluZ1RpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoJHQuQWRPcHBvcnR1bml0eSwgdGhpcy5nZiwgdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnBheWxvYWQuYWRCcmVha1R5cGUsIHMgPSBudWxsID09PSAoaSA9IHRoaXMuYWRIYW5kbGVyKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmdldEFkQ29udGFpbmVyV2lkdGgoKSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCcmVhazogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyV2lkdGg6IE9iamVjdChydC5hKShzKSA/IHMgOiB0aGlzLiRwbGF5ZXJDb250YWluZXIuY2xpZW50V2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnRyYWNrQWRPcHBvcnR1bml0eShuKSwgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIubmV3QWRPcHBvcnR1bml0eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5vbih0aGlzLiRwbGF5ZXJDb250YWluZXIsIHRoaXMuX2YsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogdGhpcy5pZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRGVsYXk6IHRoaXMuZWYKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5vbih0aGlzLiRwbGF5ZXJDb250YWluZXIsICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nbCh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyB0aHJlc2hvbGQ6IHRoaXMudGYgfSksIHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5zdWJzY3JpYmUoVHQuZS5PbWlkVmlld2FiaWxpdHlUaHJlc2hvbGQsIHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmUuT21pZFZpZXdhYmlsaXR5VGhyZXNob2xkLCB7IHBheWxvYWQ6IHsgdGhyZXNob2xkOiB0IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmFwcC5jb25maWcub3Mub3MgPT09IFN0LmIuSW9zICYmIHRoaXMuYXBwLnNlcnZpY2VzLlBhZ2VGb2N1c1NlcnZpY2Uub24odGhpcy5JZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEFmKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxmICYmIHRoaXMuZGYgJiYgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYy5TZXNzaW9uVmlldyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdsKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2lzUmVjeWNsZXJWaWV3SW50ZWdyYXRpb246IHN9ID0gdGhpcy5hcHAuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdmLnNldFRvZ2dsZUFkc1JlYXNvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FwcEJhY2tncm91bmRlZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXBwUmVjeWNsZXJWaWV3Vmlld2FiaWxpdHk6IHMgJiYgIXQKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYXBwLmNvbmZpZy5pc0luQXBwICYmIChpID8gKHRoaXMucGYgPSAhMCwgdGhpcy52ZiA/IHRoaXMuYmYgPSAhMCA6IHRoaXMuYmYgPSAhMSwgdGhpcy5wcCA9IHRoaXMuZ2V0Vm9sdW1lKCksIHRoaXMuc2V0Vm9sdW1lKDApLCBudWxsID09PSAoZSA9IHRoaXMuYWRIYW5kbGVyKSB8fCB2b2lkIDAgPT09IGUgfHwgZS5kaXNhYmxlQWRzKGdpLlVua25vd24pLCB0aGlzLnBhdXNlKCkpIDogKHRoaXMucHAgJiYgKHRoaXMuc2V0Vm9sdW1lKHRoaXMucHApLCB0aGlzLnBwID0gbnVsbCksIHRoaXMucGYgJiYgKHRoaXMucGYgPSAhMSwgdGhpcy5iZiB8fCB0aGlzLnBsYXkoKSkpKSwgdGhpcy5MZCA9IHQsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5iLklzVmlld2FibGUsIHsgcGF5bG9hZDogdCB9KSwgdGhpcy5nZi52aWV3YWJpbGl0eVN0YXRlQ2hhbmdlZCh0aGlzLmNoZWNrRmxvYXRpbmdWaWV3YWJpbGl0eSh0KSwgdGhpcy5lcC5pc0luQWRQb2QoKSwgdGhpcy5lcC5pc0luUG9kVGltZW91dCgpKSwgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnNldFNlc3Npb25WaWV3YWJpbGl0eSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hlY2tGbG9hdGluZ1ZpZXdhYmlsaXR5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5nZXRJc1RhYkluRm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodCB8fCAhdGhpcy5mbG9hdGluZ01vZHVsZSB8fCAhdGhpcy5mbG9hdGluZ01vZHVsZS5pc0luRmxvYXRpbmcgfHwgIWkpIHx8IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVoKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy4kcGxheWVyQ29udGFpbmVyLmNsaWVudFdpZHRoLCBpID0gdGhpcy4kcGxheWVyQ29udGFpbmVyLmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy51dSA/IFB0LmEuRnVsbHNjcmVlbiA6IFB0LmEuTm9ybWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIucmVzaXplQWQodCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZi5vblJlc2l6ZSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha1BvaW50c0hhbmRsZXIudXBkYXRlV2lkdGgodCksIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmIuU2l6ZUNoYW5nZWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5icCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXUgfHwgdGhpcy56ZigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2cCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuUmVzaXplT2JzZXJ2ZXIub24odGhpcy4kcGxheWVyQ29udGFpbmVyLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dSA9ICEwLCB0aGlzLmFwcC5zZXJ2aWNlcy5JbnRlcmFjdGlvblNlcnZpY2UuZGlzYWJsZVNjcm9sbEV2ZW50KCksIHRoaXMuV2YoKSwgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuc2V0VmFzdFZpZXdNb2RlKFB0LmEuRnVsbHNjcmVlbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1ID0gITEsIHRoaXMuYXBwLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZS5lbmFibGVTY3JvbGxFdmVudCgpLCB0aGlzLkdmKCksIHRoaXMuYWRIYW5kbGVyICYmIHRoaXMuYWRIYW5kbGVyLnNldFZhc3RWaWV3TW9kZShQdC5hLk5vcm1hbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHlwKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gYDxjbnggY2xhc3M9JyR7IGQuYyB9Jz48L2NueD5gLCBpID0gdGhpcy5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3AoaSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdwKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuTikodCwgeyAncGFkZGluZy1ib3R0b20nOiBgJHsgdGhpcy5PcCgpIH0lYCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNwLnBsYXllclNpemUucmF0aW9IZWlnaHQgLyB0aGlzLmNwLnBsYXllclNpemUucmF0aW9XaWR0aCAqIDEwMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKEF0LkVudGVyU3RhcnQsIHRoaXMuZmxvYXRpbmdNb2R1bGUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5jLlBsYXllckZsb2F0Q2hhbmdlZCwgeyBwYXlsb2FkOiBDdC5GbG9hdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKEF0LkV4aXRTdG9wLCB0aGlzLmZsb2F0aW5nTW9kdWxlLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYy5QbGF5ZXJGbG9hdENoYW5nZWQsIHsgcGF5bG9hZDogQ3QuRW1iZWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShBdC5FbnRlclN0b3AsIHRoaXMuZmxvYXRpbmdNb2R1bGUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2woITApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvYXRpbmdNb2R1bGUgPSBuZXcgRHQodGhpcywgdGhpcy5hcHAuc2VydmljZXMuVmlld2FiaWxpdHlTZXJ2aWNlLCB0aGlzLmFwcC5zZXJ2aWNlcy5SZXNpemVPYnNlcnZlciwgdGhpcy4kcGxheWVyQ29udGFpbmVyLCB0aGlzLmNwLmZsb2F0aW5nU2V0dGluZ3MsIHRoaXMuYXBwLmNvbmZpZy5kZXZpY2UsIHRoaXMuYXBwLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZSwgdGhpcy5qcCksIHRoaXMueHAoKSwgdGhpcy5mbG9hdGluZ01vZHVsZS5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBrcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBGdCh0aGlzLCB0aGlzLmFwcC5zZXJ2aWNlcy5SZXNpemVPYnNlcnZlciwgdGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciwgdGhpcy5jcC5mbG9hdGluZ1NldHRpbmdzLCB0aGlzLmFwcC5jb25maWcuZGV2aWNlLCB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZShBdC5FbnRlclN0b3AsIHQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS50cmlnZ2VyUmVjaGVjayh0aGlzLiRwbGF5ZXJDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXROZXdWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5zZXRWb2x1bWUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFwKCksIHRoaXMuYWRIYW5kbGVyICYmIHRoaXMuQ3AodGhpcy5hZEhhbmRsZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDcCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKGMuYi5Vc2VySW50ZXJhY3Rpb24sIHQsICh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7dm9sdW1lOiB0fQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHRoaXMuVHAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGloKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmIuVm9sdW1lQ2hhbmdlZCwgeyBwYXlsb2FkOiB0IH0pLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0Vm9sdW1lQ2hhbmdlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFZih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Vm9sdW1lKCkgIT09IHQgJiYgdGhpcy5zZXROZXdWb2x1bWUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEFwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5mID0gITAsIHRoaXMuJHBsYXllckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLk1mKSwgdGhpcy4kcGxheWVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5MZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5mICYmICh0aGlzLm5mID0gITEsIHRoaXMuJHBsYXllckNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCB0aGlzLk1mKSwgdGhpcy4kcGxheWVyQ29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5MZikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBQcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5icmVha1BvaW50c0hhbmRsZXIgPSBuZXcgUCh0aGlzLiRwbGF5ZXJDb250YWluZXIsIHRoaXMuYXBwLmNvbmZpZy5kZXZpY2UsIHRoaXMuTXAsIHRoaXMuRXApLCB0aGlzLmJyZWFrUG9pbnRzSGFuZGxlci51cGRhdGVXaWR0aCh0aGlzLiRwbGF5ZXJDb250YWluZXIuY2xpZW50V2lkdGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBMcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3AuaXNDbG9zZUJ1dHRvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnN1YnNjcmliZSh4dFt4dC5DbG9zZV0sIHRoaXMuYWRIYW5kbGVyLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5jcC5jbG9zZUJ1dHRvbk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5BbHdheXNPbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0aGlzLiRwbGF5ZXJDb250YWluZXIsIGQuZy5DbG9zZU9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5PZmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy4kcGxheWVyQ29udGFpbmVyLCBkLmcuQ2xvc2VPZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUGxheWVyQ2xvc2VCdXR0b25Nb2RlLk9uSG92ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy4kcGxheWVyQ29udGFpbmVyLCBkLmcuQ2xvc2VIb3Zlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuY3AuZmxvYXRpbmdTZXR0aW5ncy5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUGxheWVyQ2xvc2VCdXR0b25Nb2RlLkFsd2F5c09uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmEpKHRoaXMuJHBsYXllckNvbnRhaW5lciwgZC5nLkNsb3NlRmxvYXRPbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUuT2ZmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmEpKHRoaXMuJHBsYXllckNvbnRhaW5lciwgZC5nLkNsb3NlRmxvYXRPZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUGxheWVyQ2xvc2VCdXR0b25Nb2RlLk9uSG92ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy4kcGxheWVyQ29udGFpbmVyLCBkLmcuQ2xvc2VGbG9hdEhvdmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqZih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtza2lwT2Zmc2V0OiBpfSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F1dG9QbGF5OiB0aGlzLmNwLnBsYXliYWNrTW9kZSA9PT0gaC5Qcm90b1BsYXllclBsYXliYWNrTW9kZUVudW0uQXV0b3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwT2Zmc2V0OiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTa2lwcGFibGU6IE9iamVjdChydC5kKShpKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBScCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZiA9ICEwLCB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2Uuc2V0Q29udGVudFN0YXJ0KCksIHRoaXMuQWYoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVGYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFdpZHRoOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIU9iamVjdCh3aS5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCB0aGlzLkJwKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEJwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmkuaW5jbHVkZXModGhpcy5hcHAuY29uZmlnLmJ1bmRsZUlEKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRHAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLmdldENvbXB1dGVkU3R5bGUodCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wV2lkdGg6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kV2lkdGg6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBIZWlnaHQ6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kSGVpZ2h0OiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGV4OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhXaWR0aDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0Lm5vZGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogSlNPTi5zdHJpbmdpZnkoYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVycjogJ0Jhc2VFeHBlcmllbmNlX2dldEVsZW1lbnRJbmZvX2Vycm9yJyB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZwKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChMaS5rKShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuRHAodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lci5wYXJlbnRFbGVtZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW46IHRoaXMuRHAodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Jhc2VFeHBlcmllbmNlX2ludmFsaWRfZGltZW5zaW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogSlNPTi5zdHJpbmdpZnkodCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVwID0gbmV3IEVpKHRoaXMuY3AuYWRCcmVha3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFbyh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3AgPSB0LCB0aGlzLmFwcCA9IGksIHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIgPSBlLCBzICYmIHMoKSwgdGhpcy5EZigpLCB0aGlzLmFwcC5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2Uuc2V0Vmlld2FibGVUaHJlc2hvbGQodGhpcy5zZiksIHRoaXMuZ2VuZXJhdGVIVE1MKCksIHRoaXMuVnAoKSwgdGhpcy5hcHAuc2VydmljZXMuUmVzaXplT2JzZXJ2ZXIub24odGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciwgdGhpcy5DZiksIHRoaXMuVGYoKSA/IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBjLmIuQ2FuU3RhcnQpIDogdGhpcy5GcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZiA9ICEwLCBPYmplY3QoVC5hKSh0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyLCBkLmIuTWFpbkNvbnRhaW5lckZsZXgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5jLlNlc3Npb25SZW5kZXJlZCksIHRoaXMuUHAoKSwgdGhpcy52cCgpLCB0aGlzLmNwLmZsb2F0aW5nU2V0dGluZ3MuZmxvYXRpbmdNb2RlID09PSBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFsd2F5cyA/IHRoaXMua3AoKSA6ICh0aGlzLnpmKCksIHRoaXMuU3AoKSksIHRoaXMuZnAoKSwgdGhpcy5jcC5saW5lSXRlbVNldHRpbmdzLmxpbmVJdGVtcy5sZW5ndGggPiAwICYmICF0aGlzLmNwLmRpc2FibGVBZHZlcnRpc2luZyAmJiAhdGhpcy5IcyAmJiB0aGlzLm5wKCksIHRoaXMuYXBwLmNvbmZpZy5pc01vYmlsZSB8fCB0aGlzLmNwLnNvdW5kTW9kZSAhPT0gaC5Qcm90b1BsYXllclNvdW5kTW9kZS5Ib3ZlciB8fCB0aGlzLl9wKCksIHRoaXMuY3AuaXNDbG9zZUJ1dHRvbiAmJiB0aGlzLkxwKCksIHRoaXMubHAoKSwgdGhpcy5IcyB8fCBSaS5hLmRldGVjdFVzaW5nU2NyaXB0KCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS50cmFja1Nlc3Npb25BZEJsb2NrZXIoaC5Qcm90b0FkQmxvY2tEZXRlY3Rpb25UeXBlRW51bS5OZXR3b3JrKSwgdGhpcy5nZi5kaXNhYmxlQWR2ZXJ0aXNpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwbGF5KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5pbkltcHJlc3Npb24gJiYgdGhpcy5hZEhhbmRsZXIucGxheSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXVzZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuaW5JbXByZXNzaW9uICYmIHRoaXMuYWRIYW5kbGVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV3Vm9sdW1lKHQpLCB0aGlzLlRwKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFNpemUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lci5jbGllbnRXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lci5jbGllbnRIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCh3aS5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCBPYmplY3QoVC5OKSh0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYCR7IHQgfXB4YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYCR7IGkgfXB4YAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q3VzdG9tTWFjcm9zKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuTWFjcm9zU2VydmljZS5hZGRFeHRyYU1hY3Jvcyh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNWaWV3YWJsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZS5jaGVjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLiRwbGF5ZXJDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudGYKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZpZXdhYmxlVGhyZXNob2xkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAgPyB0aGlzLmFwcC5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2Uuc2V0Vmlld2FibGVUaHJlc2hvbGQodCkgOiB0aGlzLnNmID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QW1wVXNlckNvbnNlbnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2Uuc2V0QW1wVXNlckNvbnNlbnQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyaWdnZXJEZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5kZXN0cm95KCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBjLmIuRGVzdHJveSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGVBZHZlcnRpc2luZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZi5kaXNhYmxlQWR2ZXJ0aXNpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW5hYmxlQWR2ZXJ0aXNpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2YuZW5hYmxlQWR2ZXJ0aXNpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuZGVzdHJveSgpLCB0aGlzLmdmICYmIHRoaXMuZ2YuZGVzdHJveSgpLCB0aGlzLmZsb2F0aW5nTW9kdWxlICYmICh0aGlzLmZsb2F0aW5nTW9kdWxlLmRlc3Ryb3koKSwgdGhpcy5mbG9hdGluZ01vZHVsZSA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBWaSA9IGUoMTQpOwogICAgICAgICAgICAgICAgY29uc3QgVWkgPSAxNDAsICRpID0gODA7CiAgICAgICAgICAgICAgICBjbGFzcyBOaSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFNjYWxlZEltYWdlVXJsKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgIU9iamVjdCh3aS5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkobikgJiYgKGkgPSBPYmplY3Qod2kuYykoaSwgbiksIGUgPSBPYmplY3Qod2kuYykoZSwgbikpLCBzLmFwcGVuZFBhcmFtc1RvVXJsKGAkeyB0IH0keyBOaS5nZXRTY2FsZWRJbWFnZVF1ZXJ5UGFyYW1zKGksIGUpIH1gLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRTY2FsZWRJbWFnZVF1ZXJ5UGFyYW1zKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdCh3aS5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSA/ICcnIDogYD93aWR0aD0keyB0IH0maGVpZ2h0PSR7IGkgfSZmaXQ9Ym91bmRzYDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGdldFNtYXJ0Q3JvcHBlZEltYWdlVXJsKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKSh0KSB8fCAodCA9IFZpLmEuZW5kUG9pbnRzLmJhc2UuaW1hZ2UpLCBPYmplY3Qod2kuZCkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKGkgPSBVaSwgZSA9ICRpKSwgcy5hcHBlbmRQYXJhbXNUb1VybChgJHsgdCB9JHsgTmkuZ2V0U21hcnRDcm9wcGVkSW1hZ2VRdWVyeVBhcmFtcyhpLCBlKSB9YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRTbWFydENyb3BwZWRJbWFnZVF1ZXJ5UGFyYW1zKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdCh3aS5kKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSA/ICcnIDogYD9jcm9wPSR7IHQgfTokeyBpIH0sc21hcnQmd2lkdGg9JHsgdCB9JmhlaWdodD0keyBpIH0mZm9ybWF0PWpwZWcmcXVhbGl0eT02MCZmaXQ9Y3JvcGA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgSGkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25DbGljaygpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNpdGlvblRvU3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudGVyU3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0YXRlKCksIHRoaXMuY29udGV4dC5jdXJyZW50U3RhdGUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBxaSwgemksIFdpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gR2kodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgIHQuc3R5bGUudG9wID0gYCR7IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0gaSAtIHMuY2xpZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IHMuY2xpZW50WSArIHMuaGVpZ2h0IC0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgbi5hbGlnblRvcCAmJiByID4gdC5vZmZzZXRIZWlnaHQgPyByIC09IHQub2Zmc2V0SGVpZ2h0IDogIW4uYWxpZ25Ub3AgJiYgaCA8IHQub2Zmc2V0SGVpZ2h0ID8gciAtPSB0Lm9mZnNldEhlaWdodCAtIGggOiAociArPSBlKSArIHQub2Zmc2V0SGVpZ2h0ID4gcy5oZWlnaHQgJiYgKHIgPSBzLmhlaWdodCAtIHQub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSh0LCBpLmNsaWVudFksIGkuaGVpZ2h0LCBlLCBzKSB9cHhgLCB0LnN0eWxlLmxlZnQgPSBgJHsgZnVuY3Rpb24gKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHMuZGlzdGFuY2VGcm9tTWFyZ2luID8gcy5kaXN0YW5jZUZyb21NYXJnaW4gOiAwOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgciA9IE1hdGguY2VpbChpKSAtIE1hdGguY2VpbChlLmNsaWVudFgpLCBoID0gaSwgYSA9IGggKyB0Lm9mZnNldFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvID0gZS5jbGllbnRYICsgZS53aWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMuYWxpZ25NaWRkbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0Lm9mZnNldFdpZHRoIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLT0gTWF0aC5jZWlsKGkpLCBoIC09IGksIGEgLT0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5hbGlnbk1pZGRsZSB8fCBzLmZvcmNlUmlnaHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jbGllbnRYID4gaCA/IHIgPSAwICsgbiA6IG8gPCBhICYmIChyIC09IE1hdGguY2VpbChhKSAtIE1hdGguY2VpbChvKSArIG4pLCByOwogICAgICAgICAgICAgICAgICAgICAgICBhID4gbyAmJiAociAtPSB0Lm9mZnNldFdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSh0LCBpLmNsaWVudFgsIGUsIHMpIH1weGA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuUGxheUJ1dHRvbiA9IDBdID0gJ1BsYXlCdXR0b24nLCB0W3QuQmlnUGxheUJ1dHRvbiA9IDFdID0gJ0JpZ1BsYXlCdXR0b24nLCB0W3QuVm9sdW1lQnV0dG9uID0gMl0gPSAnVm9sdW1lQnV0dG9uJywgdFt0LlZvbHVtZVByb2dyZXNzID0gM10gPSAnVm9sdW1lUHJvZ3Jlc3MnLCB0W3QuVm9sdW1lQ29udHJvbHMgPSA0XSA9ICdWb2x1bWVDb250cm9scycsIHRbdC5FeHBhbmRCdXR0b24gPSA1XSA9ICdFeHBhbmRCdXR0b24nLCB0W3QuU2V0dGluZ3NCdXR0b24gPSA2XSA9ICdTZXR0aW5nc0J1dHRvbicsIHRbdC5DYXB0aW9uQnV0dG9uID0gN10gPSAnQ2FwdGlvbkJ1dHRvbicsIHRbdC5DYXB0aW9uQ29tcG9uZW50ID0gOF0gPSAnQ2FwdGlvbkNvbXBvbmVudCcsIHRbdC5DYXN0QnV0dG9uID0gOV0gPSAnQ2FzdEJ1dHRvbicsIHRbdC5TaGFyZUJ1dHRvbiA9IDEwXSA9ICdTaGFyZUJ1dHRvbicsIHRbdC5VcE5leHRCdXR0b24gPSAxMV0gPSAnVXBOZXh0QnV0dG9uJywgdFt0LlVwTmV4dEJveCA9IDEyXSA9ICdVcE5leHRCb3gnLCB0W3QuUHJldmlvdXNCdXR0b24gPSAxM10gPSAnUHJldmlvdXNCdXR0b24nLCB0W3QuTG9nb0NvbXBvbmVudCA9IDE0XSA9ICdMb2dvQ29tcG9uZW50JywgdFt0LkxvZ29PdXRzdHJlYW0gPSAxNV0gPSAnTG9nb091dHN0cmVhbScsIHRbdC5Nb3JlQnV0dG9uID0gMTZdID0gJ01vcmVCdXR0b24nLCB0W3QuRWxhcHNlZFRpbWVMYWJlbCA9IDE3XSA9ICdFbGFwc2VkVGltZUxhYmVsJywgdFt0LlRvdGFsRHVyYXRpb25MYWJlbCA9IDE4XSA9ICdUb3RhbER1cmF0aW9uTGFiZWwnLCB0W3QuUHJvZ3Jlc3NCYXIgPSAxOV0gPSAnUHJvZ3Jlc3NCYXInLCB0W3QuUXVhbGl0eU1lbnUgPSAyMF0gPSAnUXVhbGl0eU1lbnUnLCB0W3QuUXVlU3RhdGVPdmVybGF5ID0gMjFdID0gJ1F1ZVN0YXRlT3ZlcmxheScsIHRbdC5Mb2FkZXIgPSAyMl0gPSAnTG9hZGVyJywgdFt0LkNvbnRleHRNZW51ID0gMjNdID0gJ0NvbnRleHRNZW51JywgdFt0LkVsZW1lbnRzU2V0dGluZ3NNZW51ID0gMjRdID0gJ0VsZW1lbnRzU2V0dGluZ3NNZW51JywgdFt0LkNsb3NlQnV0dG9uID0gMjVdID0gJ0Nsb3NlQnV0dG9uJywgdFt0LlNraXBBZEJ1dHRvbiA9IDI2XSA9ICdTa2lwQWRCdXR0b24nLCB0W3QuQWRMb2FkaW5nU2NyZWVuID0gMjddID0gJ0FkTG9hZGluZ1NjcmVlbicsIHRbdC5DdGFCdXR0b24gPSAyOF0gPSAnQ3RhQnV0dG9uJywgdFt0LlBsYXlzcGFjZVByb2dyZXNzQmFyID0gMjldID0gJ1BsYXlzcGFjZVByb2dyZXNzQmFyJywgdFt0LlBsYXlzcGFjZVNldHRpbmdzTWVudSA9IDMwXSA9ICdQbGF5c3BhY2VTZXR0aW5nc01lbnUnLCB0W3QuQ2xpY2tUb1BsYXlCdXR0b24gPSAzMV0gPSAnQ2xpY2tUb1BsYXlCdXR0b24nLCB0W3QuU2xpZGVUaXRsZSA9IDMyXSA9ICdTbGlkZVRpdGxlJywgdFt0LlNraXBBZCA9IDMzXSA9ICdTa2lwQWQnLCB0W3QuVG9wVGl0bGUgPSAzNF0gPSAnVG9wVGl0bGUnLCB0W3QuVG9wTG9nbyA9IDM1XSA9ICdUb3BMb2dvJywgdFt0LlRvcFNsaWRlVGl0bGUgPSAzNl0gPSAnVG9wU2xpZGVUaXRsZScsIHRbdC5Ub3BTdG9yeVRpdGxlID0gMzddID0gJ1RvcFN0b3J5VGl0bGUnLCB0W3QuVGV4dExhYmVsID0gMzhdID0gJ1RleHRMYWJlbCcsIHRbdC5MaXZlUG9zdGVyID0gMzldID0gJ0xpdmVQb3N0ZXInLCB0W3QuTGl2ZUljb24gPSA0MF0gPSAnTGl2ZUljb24nOwogICAgICAgICAgICAgICAgfShxaSB8fCAocWkgPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Ub3AgPSAxXSA9ICdUb3AnLCB0W3QuQm90dG9tID0gMl0gPSAnQm90dG9tJywgdFt0LlJpZ2h0ID0gNF0gPSAnUmlnaHQnLCB0W3QuTGVmdCA9IDhdID0gJ0xlZnQnLCB0W3QuTWlkZGxlID0gMTZdID0gJ01pZGRsZSc7CiAgICAgICAgICAgICAgICB9KHppIHx8ICh6aSA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBKaSBleHRlbmRzIG8uYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5qcyA9IGksIHRoaXMuaGMgPSBlLCB0aGlzLlFuID0gbiwgdGhpcy5CYyA9IGkuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDb250YWluZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkJjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDb29yZGluYXRlcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmpzLmdldEVsZW1lbnRDb29yZGluYXRlcyh0aGlzLkJjKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUW4gJiYgdCA/ICgodCAmIHppLlRvcCkgPT09IHppLlRvcCAmJiAoaS5jbGllbnRZIC09IHRoaXMuQmMuY2xpZW50SGVpZ2h0KSwgKHQgJiB6aS5SaWdodCkgPT09IHppLlJpZ2h0ICYmIChpLmNsaWVudFggKz0gdGhpcy5CYy5jbGllbnRXaWR0aCkpIDogaS5jbGllbnRYICs9IGkud2lkdGggLyAyLCBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93Q29tcG9uZW50KHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuQmMgfHwgIXRoaXMuQmMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9iamVjdChULnQpKHRoaXMuQmMucGFyZW50RWxlbWVudCwgJ2NueC11aS1idG4nKSA/IHRoaXMuQmMucGFyZW50RWxlbWVudCA6IHRoaXMuQmM7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgT2JqZWN0KFQuQikoaSkgPyBPYmplY3QoVC5nKShpKSA6IE9iamVjdChULk8pKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlQ29tcG9uZW50KHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuQmMgfHwgIXRoaXMuQmMucGFyZW50RWxlbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IE9iamVjdChULnQpKHRoaXMuQmMucGFyZW50RWxlbWVudCwgJ2NueC11aS1idG4nKSA/IHRoaXMuQmMucGFyZW50RWxlbWVudCA6IHRoaXMuQmM7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgIU9iamVjdChULkIpKGkpID8gT2JqZWN0KFQuaCkoaSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChULnUpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdChULnUpKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJjLmlubmVySFRNTCA9ICcnLCB0aGlzLkJjLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIHRoaXMuaGMudW5yZWdpc3RlckFsbCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBRaSBleHRlbmRzIEppIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQsIGksIGUsIHMsIG4pLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0LmFbaHQuYS5TY3JvbGxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQuYVtodC5hLkNsaWNrXQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLlVwID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uSW50ZXJhY3Rpb25IYW5kbGVyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm9uQmVmb3JlQ2xpY2sgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMub25DbGljayA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkludGVyYWN0aW9uSGFuZGxlcih0KSwgdGhpcy5vbkNsaWNrSGFuZGxlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25JbnRlcmFjdGlvbkhhbmRsZXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcih0KSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbnN0YXJ0OiB0aGlzLm9uQmVmb3JlQ2xpY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbjogdGhpcy5VcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiB0aGlzLm9uQ2xpY2sKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYy5yZWdpc3Rlcih0aGlzLkJjLCB0aGlzLCB0aGlzLmhjLCB0KSwgdGhpcy5RbiAmJiAodGhpcy5zdWJzY3JpYmUoaHQuYVtodC5hLkNsaWNrXSwgdGhpcy5oYywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNsaWNrSGFuZGxlcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5yZWxheShodC5hW2h0LmEuU2Nyb2xsXSwgdGhpcy5oYywgdGhpcywgdGhpcy5tZWRpYXRvcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKHRoaXMuaGMpLCBzdXBlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgWGkgZXh0ZW5kcyBRaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMub25DbGljayA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkludGVyYWN0aW9uSGFuZGxlcih0KSwgdGhpcy5vbkNsaWNrSGFuZGxlcigpLCB0aGlzLmFkZEJvb21FZmZlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkQm9vbUVmZmVjdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy5CYywgJ2NueC1ib29tJyksIHRoaXMuQmMuZ2V0Q2xpZW50UmVjdHMoKSwgT2JqZWN0KFQuYSkodGhpcy5CYywgJ2NueC1ib29tLWFuaW0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYW5zZm9ybScgPT09IGkucHJvcGVydHlOYW1lICYmIChPYmplY3QoVC5JKSh0aGlzLkJjLCAnY254LWJvb20nKSwgT2JqZWN0KFQuSSkodGhpcy5CYywgJ2NueC1ib29tLWFuaW0nKSwgdGhpcy5CYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBvbmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLCB0aGlzLkJjLmFwcGVuZENoaWxkKHRoaXMuanMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKCc8Y254IGNsYXNzPSJjbngtYm9vbS1lbGVtIj48L2NueD4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgWWkgZXh0ZW5kcyBYaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRMaXN0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuSG92ZXJTdGFydF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5Ib3ZlckVuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmV2ZW50TGlzdAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLm9uU3RhcnRIb3ZlciA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmEpKHRoaXMuQmMsIGQuaC5Ib3ZlclN0YXJ0KSwgT2JqZWN0KFQuYSkodGhpcy5CYywgZC5oLkhvdmVyRW5kKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkhvdmVyU3RhcnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5vbkVuZEhvdmVyID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5CYywgZC5oLkhvdmVyRW5kKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkhvdmVyRW5kXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXRDb21wb25lbnQoKSwgdGhpcy5RbiA/ICh0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLm9uU3RhcnRIb3ZlciwgeyBwYXNzaXZlOiAhMCB9KSwgdGhpcy5CYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25FbmRIb3ZlciksIHRoaXMuQmMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uRW5kSG92ZXIpKSA6ICh0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uU3RhcnRIb3ZlciksIHRoaXMuQmMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25FbmRIb3ZlcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFuID8gKHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25TdGFydEhvdmVyKSwgdGhpcy5CYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25FbmRIb3ZlciksIHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hjYW5jZWwnLCB0aGlzLm9uRW5kSG92ZXIpKSA6ICh0aGlzLkJjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uU3RhcnRIb3ZlciksIHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMub25FbmRIb3ZlcikpLCBzdXBlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uSW50ZXJhY3Rpb25IYW5kbGVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkVuZEhvdmVyQ2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25FbmRIb3ZlckNsaWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5JKSh0aGlzLkJjLCBkLmguSG92ZXJFbmQpLCBPYmplY3QoVC5JKSh0aGlzLkJjLCBkLmguSG92ZXJTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlBsYXkgPSAwXSA9ICdQbGF5JywgdFt0LlBhdXNlID0gMV0gPSAnUGF1c2UnOwogICAgICAgICAgICAgICAgfShXaSB8fCAoV2kgPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgS2kgZXh0ZW5kcyBZaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy4kcCA9ICExLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlBsYXldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuUGF1c2VdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuUmVwbGF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlN0YXRlQ2hhbmdlZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmV2ZW50TGlzdAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLk5wID0gJ1BsYXknLCB0aGlzLkhwID0gJ1BhdXNlJywgdGhpcy5zZXRTdGF0ZShXaS5QYXVzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ID09PSBXaS5QYXVzZSA/IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5QYXVzZV0pIDogdGhpcy4kcCA/IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5SZXBsYXldKSA6IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5QbGF5XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFwKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0b2dnbGVSZXBsYXkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRwID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ICE9PSB0ICYmICh0aGlzLnp0ID0gdCwgdGhpcy5xcCgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuU3RhdGVDaGFuZ2VkXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdG9vbHRpcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenQgPT09IFdpLlBsYXkgPyB0aGlzLk5wIDogdGhpcy5IcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBaaSBleHRlbmRzIEhpIHsKICAgICAgICAgICAgICAgICAgICBpbml0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC4kdWlDb250YWluZXIuY2xhc3NMaXN0LmFkZChkLmouUGxheWluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLlBsYXlCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuc2V0U3RhdGUoV2kuUGF1c2UpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5CaWdQbGF5QnV0dG9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpLnNldFN0YXRlKFdpLlBhdXNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJHVpQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoZC5qLlBsYXlpbmcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHRlIGV4dGVuZHMgWmkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLnpwID0gMTAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxhcHNlZFRpbWVvdXRJZCB8fCAhdGhpcy5jb250ZXh0LmR1cmF0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGFwc2VkVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuZWxhcHNlZFRpbWUgKz0gKERhdGUubm93KCkgLSB0KSAvIDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5Qcm9ncmVzc0Jhcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIGkuc2V0UHJvZ3Jlc3MoT2JqZWN0KHdpLmUpKDAsIHRoaXMuY29udGV4dC5kdXJhdGlvbiwgMCwgMTAwLCB0aGlzLmNvbnRleHQuZWxhcHNlZFRpbWUpKSwgdGhpcy5lbGFwc2VkVGltZW91dElkID0gbnVsbCwgdGhpcy5XcCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnpwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0U3RhdGUoKSwgdGhpcy5jb250ZXh0LmR1cmF0aW9uICYmIHRoaXMuV3AoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5leGl0U3RhdGUoKSwgdGhpcy5jb250ZXh0LmR1cmF0aW9uICYmIChjbGVhclRpbWVvdXQodGhpcy5lbGFwc2VkVGltZW91dElkKSwgdGhpcy5lbGFwc2VkVGltZW91dElkID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgaWUgZXh0ZW5kcyBIaSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJHVpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoZC5qLlBhdXNlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLlBsYXlCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuc2V0U3RhdGUoV2kuUGxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLkJpZ1BsYXlCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBpICYmIGkuc2V0U3RhdGUoV2kuUGxheSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LiR1aUNvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKGQuai5QYXVzZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGVlIGV4dGVuZHMgaWUgewogICAgICAgICAgICAgICAgICAgIGluaXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZXhpdFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3Mgc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HcCA9IHQsIHRoaXMuanMgPSBpLCB0aGlzLkpwID0gL1xbXFsoWzAtOV0rKV1dL2csIHRoaXMuUXAgPSBbXSwgdGhpcy5YcCA9IFtdLCB0aGlzLllwID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50QnlTdHJpbmcodGhpcy5LcCh0aGlzLkdwKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpwKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8Y254IGNsYXNzPSJwbF8keyB0IH0iPjwvY254PmA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEtwKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucmVwbGFjZSh0aGlzLkpwLCAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUXAucHVzaChwYXJzZUludChpLCAxMCkpLCB0aGlzLlpwKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGIodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YcC5zb21lKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc2xvdE5hbWUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID8gbnVsbCA6IHRoaXMuWHAuc29tZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbXBvbmVudCA9PT0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgPyBudWxsIDogdGhpcy5ZcC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGBwbF8keyB0IH1gKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50TGlzdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFJlbmRlcmVkRG9tKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ZcDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJTbG90KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMudGIodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaS5nZXRDb250YWluZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHMsIGUpLCB0aGlzLlhwLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90TmFtZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBvbmVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWHAuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbXBvbmVudC5pbml0Q29tcG9uZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIG5lIGV4dGVuZHMgby5hIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlID0gdCwgdGhpcy50ZW1wbGF0ZVN0cmluZyA9IGksIHRoaXMuY29tcG9uZW50RmFjdG9yeSA9IGUsIHRoaXMuaWIgPSB7fSwgdGhpcy5lYiA9IG5ldyBzZShpLCB0KSwgdGhpcy5hZGRDb21wb25lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWIuZ2V0Q29tcG9uZW50TGlzdCgpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jb21wb25lbnRGYWN0b3J5LmNyZWF0ZUNvbXBvbmVudCh0LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDb21wb25lbnQodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNvbXBvbmVudCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWIucmVnaXN0ZXJTbG90KHQsIGkpLCB0aGlzLmliW3RdID0gaSwgdGhpcy5zYihpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmV2ZW50TGlzdC5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoaSwgdCwgZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9PT0geHRbeHQuUmViaW5kQ29tcG9uZW50XSAmJiB0aGlzLnJlYmluZENvbXBvbmVudEV2ZW50cyh0KSwgdGhpcy5oYW5kbGVDb21wb25lbnRFdmVudChpLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmViaW5kQ29tcG9uZW50RXZlbnRzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAodGhpcy51bnN1YnNjcmliZUFsbCh0KSwgdGhpcy5zYih0KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmliW3RdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmliKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pYlt0XS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHJlIGV4dGVuZHMgbmUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoZSwgcywgbiksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLiRjb250YWluZXIgPSBpLCB0aGlzLmNvbXBvbmVudEZhY3RvcnkgPSBuLCB0aGlzLiR1aUNvbnRhaW5lciA9IHRoaXMuZWIuZ2V0UmVuZGVyZWREb20oKSwgaS5hcHBlbmRDaGlsZCh0aGlzLiR1aUNvbnRhaW5lciksIHRoaXMuZWIuaW5pdENvbXBvbmVudHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlU3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5yYlt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAhPT0gdGhpcy5jdXJyZW50U3RhdGUgJiYgdGhpcy5jdXJyZW50U3RhdGUuY2FuVHJhbnNpdGlvblRvU3RhdGUoaSkgJiYgKHRoaXMuY3VycmVudFN0YXRlLmV4aXRTdGF0ZShpKSwgaS5lbnRlclN0YXRlKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0aGlzLiR1aUNvbnRhaW5lciwgZC5oLkRpc3BsYXlOb25lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy4kdWlDb250YWluZXIsIGQuaC5EaXNwbGF5Tm9uZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKSwgdGhpcy4kdWlDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiR1aUNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGhlLCBhZSA9IGUoODcpLCBvZSA9IGUubihhZSk7CiAgICAgICAgICAgICAgICBjbGFzcyBjZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhiID0gdCwgdGhpcy5qcyA9IGksIHRoaXMuYWIgPSBbXSwgdGhpcy5vYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA0CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuY2IgPSAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGIgPSB0aGlzLmpzLmdldEVsZW1lbnRDb29yZGluYXRlcyh0aGlzLmhiLnBhcmVudEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmYih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY254LXRvb2x0aXAtdGV4dCcpWzBdLmlubmVySFRNTCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBiKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICF0LnRvb2x0aXAgfHwgdGhpcy5jYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWIuZmluZChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jb21wb25lbnQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuanMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKG9lLmEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZiKGksIHQudG9vbHRpcCksIHRoaXMudWIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZ2V0Q29vcmRpbmF0ZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFk6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5qcy5nZXRFbGVtZW50Q29vcmRpbmF0ZXModGhpcy5oYik7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gPD0gaCArIGEgLyAyIC0gciA/IGUuY2xpZW50WSArPSB0aGlzLm9iLnRvcCA6IChlLmNsaWVudFkgLT0gdGhpcy5vYi5ib3R0b20sIHMgPSAhMCksIHRoaXMuaGIuYXBwZW5kQ2hpbGQoaSksIEdpKGksIGUsIHRoaXMubGIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduTWlkZGxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduVG9wOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VSaWdodDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZUZyb21NYXJnaW46IHRoaXMub2IubWFyZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QoVC5pKShpKSwgT2JqZWN0KFQuYSkoaSwgZC5xLk9wYWNpdHlJblRyYW5zaXRpb24pLCB0aGlzLmFiLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYmIodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQudG9vbHRpcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuYWIuZmluZChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmNvbXBvbmVudCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkuZG9tRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYi5yZW1vdmVDaGlsZChlKSwgdGhpcy5hYiA9IHRoaXMuYWIuZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY29tcG9uZW50ICE9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmIodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQudG9vbHRpcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuYWIuZmluZCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbXBvbmVudCA9PT0gdGhpcy5tYjsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgdGhpcy5mYihpLmRvbUVsZW1lbnQsIHQudG9vbHRpcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdiKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1iID0gbnVsbCwgdGhpcy5hYi5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmIodC5jb21wb25lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0RGlzdGFuY2VWYWx1ZXModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9iID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9iKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhvdmVyU3RhcnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1iID0gdCwgdGhpcy5wYih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaG92ZXJFbmQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1iID0gbnVsbCwgdGhpcy5iYih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGVDaGFuZ2VkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYiA9PT0gdCAmJiB0aGlzLnZiKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVG9vbHRpcHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2IgPSAhMCwgdGhpcy5nYigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmFibGVUb29sdGlwcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYiA9ICExLCB0aGlzLnBiKHRoaXMubWIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5leHBhbmQgPSAwXSA9ICdleHBhbmQnLCB0W3QuY29sbGFwc2UgPSAxXSA9ICdjb2xsYXBzZSc7CiAgICAgICAgICAgICAgICB9KGhlIHx8IChoZSA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyB1ZSBleHRlbmRzIFlpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5ldmVudExpc3QgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5FeHBhbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuQ29sbGFwc2VdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5ldmVudExpc3QKICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy55YiA9ICdGdWxsIFNjcmVlbicsIHRoaXMud2IgPSAnRXhpdCBGdWxsIFNjcmVlbic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuenQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoZS5jb2xsYXBzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5FeHBhbmRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGhlLmV4cGFuZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Db2xsYXBzZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuRXhwYW5kXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQmMgJiYgKHRoaXMuenQgPT09IGhlLmV4cGFuZCA/IHRoaXMuQmMuY2xhc3NMaXN0LmFkZChkLmguQWN0aXZlKSA6IHRoaXMuQmMuY2xhc3NMaXN0LnJlbW92ZShkLmguQWN0aXZlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56dCAhPT0gdCAmJiAodGhpcy56dCA9IHQsIHRoaXMucXAoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB0b29sdGlwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56dCA9PT0gaGUuZXhwYW5kID8gdGhpcy53YiA6IHRoaXMueWI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgbGUgZXh0ZW5kcyByZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy5PYiA9IG5ldyBjZSh0aGlzLiR1aUNvbnRhaW5lciwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbXBvbmVudEV2ZW50KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkucGF5bG9hZCAmJiBpLnBheWxvYWQudGFyZ2V0Q29tcG9uZW50ICYmIChzID0gaS5wYXlsb2FkLnRhcmdldENvbXBvbmVudCksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5Ib3ZlclN0YXJ0XToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2IuaG92ZXJTdGFydChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LkhvdmVyRW5kXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2IuaG92ZXJFbmQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5TdGF0ZUNoYW5nZWRdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PYi5zdGF0ZUNoYW5nZWQocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChULnQpKHRoaXMuJHVpQ29udGFpbmVyLCBkLmcuU2hvd0NvbnRyb2xzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLkVsYXBzZWRUaW1lTGFiZWwpLCBzID0gdGhpcy5nZXRDb21wb25lbnQocWkuVG90YWxEdXJhdGlvbkxhYmVsKSwgbiA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlByb2dyZXNzQmFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5zZXRUaW1lKHQpLCBzICYmIHMuc2V0VGltZShpKSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IDAsIHMgPSBpLCByID0gMCwgaCA9IDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0UHJvZ3Jlc3MoT2JqZWN0KHdpLmUpKGUsIHMsIHIsIGgsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KHFpLkV4cGFuZEJ1dHRvbikuc2V0U3RhdGUoaGUuZXhwYW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KHFpLkV4cGFuZEJ1dHRvbikuc2V0U3RhdGUoaGUuY29sbGFwc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGRlIGV4dGVuZHMgWWkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlNldHRpbmdzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZXZlbnRMaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMueGIgPSAnU2V0dGluZ3MnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlNldHRpbmdzXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRvZ2dsZUhERmxhZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyBPYmplY3QoVC5hKSh0aGlzLkJjLCBkLmguQWN0aXZlKSA6IE9iamVjdChULkkpKHRoaXMuQmMsIGQuaC5BY3RpdmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdG9vbHRpcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGZlID0gZSg4OCksIHBlID0gZS5uKGZlKTsKICAgICAgICAgICAgICAgIGNsYXNzIGJlIGV4dGVuZHMgWWkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBoKSwgdGhpcy5TYiA9IG4sIHRoaXMuaXNBY3RpdmUgPSByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9ICF0aGlzLmlzQWN0aXZlLCB0aGlzLm9uU3RhdGVDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlzQWN0aXZlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56dDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IGlzQWN0aXZlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56dCA9IHQsIHRoaXMuenQgPyBPYmplY3QoVC5hKSh0aGlzLkJjLCB0aGlzLlNiKSA6IE9iamVjdChULkkpKHRoaXMuQmMsIHRoaXMuU2IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHZlIGV4dGVuZHMgYmUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LkNhcHRpb25Pbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5DYXB0aW9uT2ZmXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlN0YXRlQ2hhbmdlZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmV2ZW50TGlzdAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLmpiID0gJ1N1YnRpdGxlcyBPbicsIHRoaXMua2IgPSAnU3VidGl0bGVzIE9mZic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uU3RhdGVDaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB0aGlzLmlzQWN0aXZlID8geHRbeHQuQ2FwdGlvbk9uXSA6IHh0W3h0LkNhcHRpb25PZmZdKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlN0YXRlQ2hhbmdlZF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdG9vbHRpcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNBY3RpdmUgPyB0aGlzLmtiIDogdGhpcy5qYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbWUgPSBlKDUyKSwgZ2UgPSBlLm4obWUpLCB5ZSA9IGUoODkpLCB3ZSA9IGUubih5ZSk7CiAgICAgICAgICAgICAgICBjbGFzcyBPZSBleHRlbmRzIFFpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5MZCA9ICExLCB0aGlzLmV2ZW50TGlzdCA9IFt4dFt4dC5OZXh0XV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuTmV4dF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxkID0gITAsIHRoaXMuQmMuY2xhc3NMaXN0LmFkZCgnY254LWZhZGUtaW4tdXAtbmV4dCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxkID0gITEsIHRoaXMuQmMuY2xhc3NMaXN0LnJlbW92ZSgnY254LWZhZGUtaW4tdXAtbmV4dCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0luVmlldygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNhcmQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdzcmMnLCB0KSwgZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnLCBlLm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY254LXVwLW5leHQtYm94LXRleHQnKVswXS5pbm5lckhUTUwgPSBPYmplY3QocnQuaCkoaSkgPyBpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgeGUgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzKSwgdGhpcy5zZXR0aW5ncyA9IG4sIHRoaXMuZXZlbnRMaXN0ID0gW10sIHRoaXMuX2IgPSAxNDQsIHRoaXMuQWIgPSAzNjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlTG9nbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLmpzLmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAgICAgICAgICAgICAgICAgICB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0aGlzLnJlc2l6ZUxvZ28odCksIHRoaXMuQmMuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuc3JjID0gdGhpcy5zZXR0aW5ncy5sb2dvVXJsLCB0LmFsdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNpemVMb2dvKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQubmF0dXJhbFdpZHRoLCBlID0gdC5uYXR1cmFsSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MubG9nb1Bvc2l0aW9uID09PSBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5Db250cm9sQmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdHlsZS5zZXRQcm9wZXJ0eSgnaGVpZ2h0JywgYCR7IHRoaXMuQWIgfXB4YCwgJ2ltcG9ydGFudCcpLCB0LnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsIGAkeyB0aGlzLkFiIH1weGAsICdpbXBvcnRhbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gaSAvIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFiICogcyA+IHRoaXMuX2IgPyAodC5zdHlsZS5zZXRQcm9wZXJ0eSgnd2lkdGgnLCBgJHsgdGhpcy5fYiB9cHhgLCAnaW1wb3J0YW50JyksIHQuc3R5bGUuc2V0UHJvcGVydHkoJ2hlaWdodCcsICdhdXRvJywgJ2ltcG9ydGFudCcpKSA6ICh0LnN0eWxlLnNldFByb3BlcnR5KCd3aWR0aCcsICdhdXRvJywgJ2ltcG9ydGFudCcpLCB0LnN0eWxlLnNldFByb3BlcnR5KCdoZWlnaHQnLCBgJHsgdGhpcy5BYiB9cHhgLCAnaW1wb3J0YW50JykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVMb2dvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTG9nb0NvbXBvbmVudF9jcmVhdGVMb2dvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFNlIGV4dGVuZHMgSmkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkliID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY254LXNwYW4nKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzTmFOKHQpIHx8ICdudW1iZXInICE9IHR5cGVvZiB0ID8gT2JqZWN0KFQuYSkodGhpcy5CYywgZC5oLkludmlzaWJsZSkgOiAodGhpcy5JYi5pbm5lckhUTUwgPSBPYmplY3QobnQuZikodCksIE9iamVjdChULkkpKHRoaXMuQmMsIGQuaC5JbnZpc2libGUpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgamUgPSBlKDU4KSwga2UgPSBlLm4oamUpOwogICAgICAgICAgICAgICAgY2xhc3MgX2UgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQsIGksIGUsIHMsIG4pLCB0aGlzLkNiID0gMCwgdGhpcy5UYiA9IG51bGwsIHRoaXMuUGIgPSAwLCB0aGlzLk1iID0gMCwgdGhpcy5FYiA9IDEwMCwgdGhpcy5jYWNoZURvbUVsZW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhY2hlRG9tRWxlbWVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTGIgPSB0aGlzLkJjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NueC1wcm9ncmVzcy1maWxsJylbMF0sIHRoaXMuV2MgPSB0aGlzLkJjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NueC1wcm9ncmVzcy1yYWlsJylbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhY2hlV2lkdGhzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNiID0gdGhpcy5maXhlZFJhaWxXaWR0aCA/IHRoaXMuZml4ZWRSYWlsV2lkdGggOiB0aGlzLldjLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLCB0aGlzLlRiID0gdGhpcy5XYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVVaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXB1dGVkVHJhbnNsYXRpb24odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGIgPSBpLCB0aGlzLkxiLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7IGkgfXB4KWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzVmFsaWRUcmFuc2xhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUGIgPj0gMCAmJiB0aGlzLlBiIDw9IHRoaXMuQ2I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkVHJhbnNsYXRpb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA8IDAgPyAwIDogdCA+IHRoaXMuQ2IgPyB0aGlzLkNiIDogdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UHJvZ3Jlc3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlV2lkdGhzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXB1dGVkVHJhbnNsYXRpb24oT2JqZWN0KHdpLmUpKDAsIDEwMCwgMCwgdGhpcy5DYiwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVpKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVHJhbnNpdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy5CYywgZC5oLk5vVHJhbnNpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZVRyYW5zaXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULkkpKHRoaXMuQmMsIGQuaC5Ob1RyYW5zaXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSYih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVRyYW5zaXRpb24oKSwgdGhpcy5zZXRQcm9ncmVzcyh0KSwgT2JqZWN0KFQuaSkodGhpcy5MYiksIHRoaXMuZW5hYmxlVHJhbnNpdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3JjZVN0YXJ0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmIodGhpcy5NYik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmNlRW5kU3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmIodGhpcy5FYik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVXaWR0aHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIEFlIGV4dGVuZHMgX2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy5CYiA9IDAsIHRoaXMuTmggPSBudWxsLCB0aGlzLkRiID0gITEsIHRoaXMuZXZlbnRMaXN0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuRHJhZ2dpbmdTdGFydF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5EcmFnZ2luZ1N0b3BwZWRdCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuRmIgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVXaWR0aHMoKSwgdGhpcy5WYih0aGlzLlViKHQpKSwgdGhpcy5RbiA/IHRoaXMuQmMuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLiRiLCB0aGlzLk5iKSA6IHRoaXMuanMuYWRkRXZlbnRMaXN0ZW5lck9uR2xvYmFsKHRoaXMuJGIsIHRoaXMuTmIpLCB0aGlzLm9uRHJhZ1N0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuTmIgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IHRoaXMuTmggJiYgKHRoaXMuRGIgfHwgKHRoaXMuRGIgPSAhMCwgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbigpKSwgdGhpcy5OaCA9IHRoaXMuanMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSGVscGVyKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5IYiArICh0aGlzLlViKHQpIC0gdGhpcy5xYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkVHJhbnNsYXRpb24oKSAmJiB0aGlzLnpiKGkpLCB0aGlzLk5oID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5XYiA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdG9wUHJvcGFnYXRpb24oKSwgdGhpcy5RbiA/IHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLiRiLCB0aGlzLk5iKSA6IHRoaXMuanMucmVtb3ZlRXZlbnRMaXN0ZW5lck9uR2xvYmFsKHRoaXMuJGIsIHRoaXMuTmIpLCB0aGlzLkRiID0gITEsIHRoaXMuZW5hYmxlVHJhbnNpdGlvbigpLCB0aGlzLm9uRHJhZ0VuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLiRiID0gbiA/ICd0b3VjaG1vdmUnIDogJ21vdXNlbW92ZSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhY2hlRG9tRWxlbWVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNhY2hlRG9tRWxlbWVudHMoKSwgdGhpcy5HYiA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY254LXByb2dyZXNzLWhhbmRsZScpWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWNoZVdpZHRocygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2FjaGVXaWR0aHMoKSwgdGhpcy5CYiA9IHRoaXMuR2IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVVaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wdXRlZFRyYW5zbGF0aW9uKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdiLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7IGkgLSB0aGlzLkJiIH1weClgOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkRyYWdFbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5EcmFnZ2luZ1N0b3BwZWRdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25EcmFnU3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5EcmFnZ2luZ1N0YXJ0XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFViKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUW4gPyB0LnRvdWNoZXMuaXRlbSgwKS5jbGllbnRYIDogdC5jbGllbnRYOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWYih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSGIgPSB0IC0gdGhpcy5UYiwgdGhpcy5xYiA9IHQsIHRoaXMuemIodGhpcy5IYik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHpiKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZFRyYW5zbGF0aW9uKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXB1dGVkVHJhbnNsYXRpb24odCksIGUgPSAwLCBzID0gdGhpcy5DYiwgbiA9IDAsIHIgPSAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVpKGkpLCB0aGlzLm9uUHJvZ3Jlc3NDaGFuZ2UoT2JqZWN0KHdpLmUpKGUsIHMsIG4sIHIsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldFByb2dyZXNzKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0Q29tcG9uZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGlvbnN0YXJ0OiB0aGlzLkZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3Rpb25lbmQ6IHRoaXMuV2IKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYy5yZWdpc3Rlcih0aGlzLkJjLCB0aGlzLCB0aGlzLmhjLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIEllIGV4dGVuZHMgQWUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy5KYiA9ICExLCB0aGlzLlFiID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0aGlzLkJjLCBkLmguSG92ZXJFbmQpLCB0aGlzLkpiID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuWGIgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXB1dGVkVHJhbnNsYXRpb24odC5jbGllbnRYIC0gdGhpcy5UYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlliLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7IGkgfXB4KWA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuS2IgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWWIuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoMCknLCB0aGlzLkpiID0gITEsIHRoaXMuWmIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ldmVudExpc3QgPSB0aGlzLmV2ZW50TGlzdC5jb25jYXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuU2Vla10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5TZWVraW5nU3RhcnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuU2Vla2luZ1N0b3BwZWRdCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblByb2dyZXNzQ2hhbmdlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlNlZWtdLCB7IHBheWxvYWQ6IHQgLSAwLjEgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uRHJhZ0VuZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25EcmFnRW5kKCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5TZWVraW5nU3RvcHBlZF0pLCB0aGlzLlpiKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uRHJhZ1N0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5vbkRyYWdTdGFydCgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuU2Vla2luZ1N0YXJ0XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpiKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkpiIHx8IHRoaXMuRGIgfHwgT2JqZWN0KFQuSSkodGhpcy5CYywgZC5oLkhvdmVyRW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBvbmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLCB0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuWGIpLCB0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLlFiKSwgdGhpcy5CYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5LYiksIHRoaXMuWWIgPSB0aGlzLkJjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NueC1wcm9ncmVzcy1mb2xsb3cnKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQudSkodGhpcy5CYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3coKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULk8pKHRoaXMuQmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5kZXN0cm95KCksIHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5YYiksIHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuUWIpLCB0aGlzLkJjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLktiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgQ2UgPSBlKDkwKSwgVGUgPSBlLm4oQ2UpOwogICAgICAgICAgICAgICAgY2xhc3MgUGUgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93KCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5PKSh0aGlzLkJjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQudSkodGhpcy5CYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIE1lLCBFZSA9IGUoOTEpLCBMZSA9IGUubihFZSksIFJlID0gZSg1MyksIEJlID0gZS5uKFJlKSwgRGUgPSBlKDkyKSwgRmUgPSBlLm4oRGUpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlNpbXBsZU1lbnVJdGVtID0gMF0gPSAnU2ltcGxlTWVudUl0ZW0nLCB0W3QuVG9nZ2xlTWVudUl0ZW0gPSAxXSA9ICdUb2dnbGVNZW51SXRlbScsIHRbdC5TdWJtZW51TWVudUl0ZW0gPSAyXSA9ICdTdWJtZW51TWVudUl0ZW0nOwogICAgICAgICAgICAgICAgfShNZSB8fCAoTWUgPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgVmUgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgciwgaCwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBhKSwgdGhpcy5ldmVudE5hbWUgPSBuLCB0aGlzLnR2ID0gciwgdGhpcy5ldiA9IGgsIHRoaXMuc3YgPSBbXSwgdGhpcy5ldmVudExpc3QgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5SZWJpbmRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHQuYVtodC5hLkhvbGRTdGFydF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodC5hW2h0LmEuSG9sZEVuZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5Db250ZXh0TWVudU9wZW5dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuQ29udGV4dE1lbnVDbG9zZV0KICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy5udiA9ICExLCB0aGlzLnJ2ID0gMTAsIHRoaXMuaHYgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXYucmVtb3ZlQ2hpbGQodC50YXJnZXQpLCB0aGlzLmF2LnN0eWxlLndpZHRoID0gYCR7IHRoaXMuQmMuY2xpZW50V2lkdGggfXB4YDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5jbG9zZSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBPYmplY3QoTGkuaCkodC50YXJnZXQsIGQuZy5Db250ZXh0Q29udHJvbGxlciwgdGhpcy5ydikgfHwgITEgIT09IHRoaXMuaXNPcGVuICYmICh0aGlzLm52ICYmICh0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgaHQuYVtodC5hLkhvbGRFbmRdKSwgT2JqZWN0KFQuSSkodGhpcy5ldiwgZC5oLk9uSG9sZCksIHRoaXMubnYgPSAhMSksIHRoaXMuaXNPcGVuID0gITEsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Db250ZXh0TWVudUNsb3NlXSksIE9iamVjdChULmEpKHRoaXMuQmMsIGQuaC5JbnZpc2libGUpLCB0aGlzLmhjLnJlbW92ZUdsb2JhbEFjdGlvbnModGhpcy5CYyksIHRoaXMuY2xvc2VBbGxTdWJtZW51SXRlbXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuY2xvc2UoKSwgdGhpcy5jYWNoZUNvb3JkaW5hdGVzKCksIHRoaXMuZXZlbnRMaXN0LnB1c2godGhpcy5ldmVudE5hbWUpLCB0aGlzLmF2ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuay5Db250YWluZXIpWzBdLCB0aGlzLm92ID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoYDxjbnggY2xhc3M9IiR7IGQuay5JdGVtcyB9Ij48L2NueD5gKSwgdGhpcy5hdi5hcHBlbmRDaGlsZCh0aGlzLm92KSwgT2JqZWN0KFQuYSkodGhpcy5hdiwgZC5nLkNvbnRleHRDb250cm9sbGVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkTmV3SXRlbXNFdmVudCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhT2JqZWN0KGwuZykodCwgdGhpcy5ldmVudExpc3QpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaS5sZW5ndGggPiAwICYmICh0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZXZlbnRMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuUmViaW5kQ29tcG9uZW50XSwgeyBwYXlsb2FkOiB0aGlzLnR2IH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FjaGVDb29yZGluYXRlcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYiA9IHRoaXMuanMuZ2V0RWxlbWVudENvb3JkaW5hdGVzKHRoaXMuZXYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkNvbnRleHRNZW51KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZUNvb3JkaW5hdGVzKCksIEdpKHRoaXMuQmMsIHQsIHRoaXMubGIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduTWlkZGxlOiB0aGlzLmFsaWduTWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25Ub3A6IHRoaXMuYWxpZ25Ub3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVJpZ2h0OiB0aGlzLmZvcmNlUmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN2KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZS5TaW1wbGVNZW51SXRlbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1lLlN1Ym1lbnVNZW51SXRlbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXYodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1dih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkJjLmNsaWVudFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB0LmlzT3BlbiA/ICh0LiRtZW51Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLmh2KSwgdGhpcy5vdi5zdHlsZS5sZWZ0ID0gJzBweCcsIHQuJG1lbnVDb250YWluZXIuc3R5bGUubGVmdCA9ICcwcHgnKSA6ICh0LiRtZW51Q29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCB0aGlzLmh2KSwgdGhpcy5hdi5zdHlsZS53aWR0aCA9IGAkeyAyICogaSB9cHhgLCB0aGlzLmF2LmFwcGVuZENoaWxkKHQuJG1lbnVDb250YWluZXIpLCBPYmplY3QoVC5pKSh0aGlzLmF2KSwgdGhpcy5vdi5zdHlsZS5sZWZ0ID0gYCR7IC1pIH1weGAsIHQuJG1lbnVDb250YWluZXIuc3R5bGUubGVmdCA9IGAkeyAtaSB9cHhgKSwgdC5pc09wZW4gPSAhdC5pc09wZW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsb3NlQWxsU3VibWVudUl0ZW1zKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN2LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPT09IE1lLlN1Ym1lbnVNZW51SXRlbSAmJiB0LmlzT3BlbiAmJiB0aGlzLnV2KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnVpbGRDb250ZXh0TWVudSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3YuaW5uZXJIVE1MID0gJycsIHRoaXMuYXYuc3R5bGUud2lkdGggPSBgJHsgdGhpcy5CYy5jbGllbnRXaWR0aCB9cHhgLCB0aGlzLnN2LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51bnN1YnNjcmliZUFsbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3YgPSB0LCB0aGlzLnN2LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udC5ldmVudExpc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHQuZXZlbnRMaXN0LmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaWJlKGksIHQsIGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN2KHQpLCB0aGlzLnNlbmRFdmVudChpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmluaXRDb21wb25lbnQoKSwgdGhpcy5vdi5hcHBlbmRDaGlsZCh0LmdldENvbnRhaW5lcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYWRkTmV3SXRlbXNFdmVudChpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QW5jaG9yQ29vcmRpbmF0ZXNUbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKGkgPSB0KSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmdldENvb3JkaW5hdGVzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9wZW4odCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKHRoaXMubnYgPSBpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgaHQuYVtodC5hLkhvbGRTdGFydF0pLCBPYmplY3QoVC5hKSh0aGlzLmV2LCBkLmguT25Ib2xkKSksIHRoaXMuaXNPcGVuID0gITAsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Db250ZXh0TWVudU9wZW5dKSwgdGhpcy5wb3NpdGlvbkNvbnRleHRNZW51KHQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0geyBpbnRlcmFjdGlvbmVuZDogdGhpcy5jbG9zZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhjLmFkZEdsb2JhbEFjdGlvbnModGhpcy5CYywgZSksIE9iamVjdChULkkpKHRoaXMuQmMsIGQuaC5JbnZpc2libGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFVlIGV4dGVuZHMgUWkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSwgVWUuZ2V0VGVtcGxhdGUobiksIHMpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5tYyA9ICExLCB0aGlzLnR5cGUgPSBNZS5TaW1wbGVNZW51SXRlbSwgdGhpcy5ldmVudExpc3QgPSBbXSwgdGhpcy5ldmVudCA9IG4uYWN0aXZlRXZlbnQsIHRoaXMubmFtZSA9IG4ubmFtZSwgbi5ldmVudExpc3QgPyB0aGlzLmV2ZW50TGlzdCA9IG4uZXZlbnRMaXN0IDogdGhpcy5ldmVudExpc3QucHVzaCh0aGlzLmV2ZW50KSwgdGhpcy5sdiA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShkLmsuSXRlbVRpdGxlKVswXSwgdGhpcy5kdiA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShkLmsuSXRlbUljb24pWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZ2V0VGVtcGxhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gYDxjbnggY2xhc3M9IiR7IGQuay5JdGVtSWNvbiB9Ij4keyB0Lmljb24gfTwvY254PmAsIGUgPSBgPGNueCBjbGFzcz0iJHsgZC5rLkl0ZW1FeHRyYSB9Ij4keyB0LmxhYmVsIH08L2NueD5gOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxjbnggY2xhc3M9IiR7IGQuay5DbGlja09wdGlvbiB9Ij5cbiAgICAgICAgICAgICAgICAgICAgJHsgdC5pY29uID8gaSA6ICcnIH1cbiAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iJHsgZC5rLkl0ZW1UaXRsZSB9Ij4keyB0Lm5hbWUgfTwvY254PlxuICAgICAgICAgICAgICAgICAgICAkeyB0LmxhYmVsID8gZSA6ICcnIH1cbiAgICAgICAgICAgICAgICA8L2NueD5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB0aGlzLmV2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlSXRlbU5hbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmx2LmlubmVySFRNTCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNoYW5nZUl0ZW1JY29uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdi5pbm5lckhUTUwgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNBY3RpdmUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1jOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgaXNBY3RpdmUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1jID0gdCwgdGhpcy5tYyA/IE9iamVjdChULmEpKHRoaXMuQmMsIGQuaC5BY3RpdmUsIGQuZi5BY2NlbnRDb2xvcikgOiBPYmplY3QoVC5JKSh0aGlzLkJjLCBkLmguQWN0aXZlLCBkLmYuQWNjZW50Q29sb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciAkZSA9IGUoNTQpLCBOZSA9IGUubigkZSksIEhlID0gZSgyMSk7CiAgICAgICAgICAgICAgICBjbGFzcyBxZSBleHRlbmRzIFZlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5hbGlnbk1pZGRsZSA9ICExLCB0aGlzLmFsaWduVG9wID0gITEsIHRoaXMuZm9yY2VSaWdodCA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IEhlLmEudmVyc2lvbiA/IGBWJHsgSGUuYS52ZXJzaW9uIH1gIDogJ2RldicsIGkgPSBbbmV3IFVlKHRoaXMsIHRoaXMuanMsIHRoaXMuaGMsIHRoaXMuUW4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRXZlbnQ6IHh0W3h0LkFib3V0Q2xpY2tdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQWJvdXQgQ29ubmF0aXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBOZS5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZENvbnRleHRNZW51KGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ2KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uUmVzaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhY2hlQ29vcmRpbmF0ZXMoKSwgdGhpcy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHplIGV4dGVuZHMgYmUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSwgemUuZ2V0VGVtcGxhdGUobiksIGQuaC5BY3RpdmUsIG4uZGVmYXVsdFN0YXRlLCBzKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuZXZlbnRMaXN0ID0gW10sIHRoaXMudHlwZSA9IE1lLlRvZ2dsZU1lbnVJdGVtLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE9uOiB0aGlzLnB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRPZmY6IHRoaXMuYnYKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IG4sIHRoaXMuZXZlbnRMaXN0LnB1c2godGhpcy5wdiwgdGhpcy5idik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBnZXRUZW1wbGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBgPGNueCBjbGFzcz0iJHsgZC5rLkl0ZW1JY29uIH0iPiR7IHQuaWNvbiB9PC9jbng+YDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8Y254IGNsYXNzPSIkeyBkLmsuVG9nZ2xlT3B0aW9uIH0gJHsgdC5kZWZhdWx0U3RhdGUgPyBkLmguQWN0aXZlIDogJycgfSI+XG4gICAgICAgICAgICAgICAgICAgICR7IHQuaWNvbiA/IGkgOiAnJyB9XG4gICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9IiR7IGQuay5JdGVtVGl0bGUgfSI+JHsgdC5uYW1lIH08L2NueD5cbiAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iJHsgZC5rLkl0ZW1FeHRyYSB9Ij5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1jbS10b2dnbGUtc3dpdGNoIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtY20tc2xpZGVyICR7IGQuZi5BY2NlbnRDb2xvciB9Ij48L2NueD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY254PlxuICAgICAgICAgICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgICAgICA8L2NueD5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblN0YXRlQ2hhbmdlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdGhpcy5pc0FjdGl2ZSA/IHRoaXMucHYgOiB0aGlzLmJ2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRvb2x0aXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBXZSA9IHsKICAgICAgICAgICAgICAgICAgICBDb250ZXh0QWJvdXQ6ICdBYm91dCBDb25uYXRpeCcsCiAgICAgICAgICAgICAgICAgICAgQ29udGV4dFF1YWxpdHk6ICdWaWRlbyBTZXR0aW5ncycsCiAgICAgICAgICAgICAgICAgICAgQ29udGV4dENhcHRpb246ICdDbG9zZWQgQ2FwdGlvbicKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBHZSBleHRlbmRzIFZlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByLCBoLCBhLCBvLCBjID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSwgcywgbiwgciwgaCwgbyksIHRoaXMuYWxpZ25NaWRkbGUgPSAhMSwgdGhpcy5hbGlnblRvcCA9ICExLCB0aGlzLmZvcmNlUmlnaHQgPSAhMSwgdGhpcy52diA9IFtuZXcgVWUodGhpcywgdGhpcy5qcywgdGhpcy5oYywgdGhpcy5RbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUV2ZW50OiB4dFt4dC5BYm91dENsaWNrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBXZS5Db250ZXh0QWJvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogTmUuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSGUuYS52ZXJzaW9uID8gYFYkeyBIZS5hLnZlcnNpb24gfWAgOiAnZGV2JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldLCB0aGlzLm12ID0gbmV3IHplKHRoaXMsIHRoaXMuanMsIHRoaXMuaGMsIHRoaXMuUW4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50T2ZmOiB4dFt4dC5DYXB0aW9uT2ZmXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50T246IHh0W3h0LkNhcHRpb25Pbl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0U3RhdGU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBXZS5Db250ZXh0Q2FwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IGdlLmEKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuZ3YgPSBbdGhpcy5tdl0sIHRoaXMueXYgPSBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3digpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLnZ2OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnl2ID09PSBkLnIuTGcgJiYgKHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmd2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy52dgogICAgICAgICAgICAgICAgICAgICAgICBdKSwgdGhpcy5idWlsZENvbnRleHRNZW51KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnd2KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uUmVzaXplKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gJiYgdGhpcy5wb3NpdGlvbkNvbnRleHRNZW51KHQpLCB0aGlzLnl2ICE9PSBpID8gKHRoaXMueXYgPSBpLCB0aGlzLmNsb3NlQWxsU3VibWVudUl0ZW1zKCksIHRoaXMud3YoKSkgOiB0aGlzLnl2ID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ2FwdGlvblN0YXRlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tdi5pc0FjdGl2ZSAhPT0gdCAmJiAodGhpcy5tdi5pc0FjdGl2ZSA9IHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlQ2FwdGlvbk9wdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tdi5oaWRlQ29tcG9uZW50KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3dDYXB0aW9uT3B0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm12LnNob3dDb21wb25lbnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QW5jaG9yQ29vcmRpbmF0ZXNUbyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gemkuUmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnl2ICE9PSBkLnIuWGwgJiYgdGhpcy55diAhPT0gZC5yLlh4bCAmJiAoaSB8PSB6aS5Ub3ApLCB0LmdldENvb3JkaW5hdGVzKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEplKHQpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModCkucmVkdWNlKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpKSwgeyBbZV06IE9iamVjdChydC5oKSh0W2VdKSAmJiB0W2VdLmluY2x1ZGVzKCclJScpID8gdm9pZCAwIDogdFtlXSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdzYW5pdGl6ZURmcE1hY3Jvc19lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGkubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3Qua2V5cyh0KS5yZWR1Y2UoKGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGkpLCB7IFtlXTogT2JqZWN0KHJ0LmgpKHRbZV0pICYmIHRbZV0uaW5kZXhPZignJSUnKSA+IC0xID8gdm9pZCAwIDogdFtlXSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFFlIGV4dGVuZHMgSmkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk92ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuZS5DYXB0aW9uQ29udGFpbmVyKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2FwdGlvbnModCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Pdi5pbm5lckhUTUwgPSB0ICYmIHQudGV4dCA/IChpID0gdC50ZXh0LCBlID0gJzxicj4nLCBpLnJlcGxhY2UoLyg/OlxyXG58XHJ8XG4pL2csIGUpKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBYZSA9IGUoOTMpLCBZZSA9IGUubihYZSk7CiAgICAgICAgICAgICAgICBjbGFzcyBLZSBleHRlbmRzIHhlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy54diA9ICdjbngtbG9nby1oZWlnaHQnLCB0aGlzLlN2ID0gJ2NueC1sb2dvLXdpZHRoJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlTG9nbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CYy5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJjLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZScsIHRoaXMucmVzaXplTG9nbyh0aGlzLkJjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5CYy5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbicsIHRoaXMuQmMuc3JjID0gdGhpcy5zZXR0aW5ncy5sb2dvVXJsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNpemVMb2dvKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQubmF0dXJhbFdpZHRoLCBlID0gdC5uYXR1cmFsSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiBlID8gKGkgPiBlID8gT2JqZWN0KFQuYSkodCwgdGhpcy5TdikgOiBPYmplY3QoVC5hKSh0LCB0aGlzLnh2KSwgdCkgOiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBaZSA9IGUoOTQpLCB0cyA9IGUubihaZSksIGlzID0gZSg5NSksIGVzID0gZS5uKGlzKTsKICAgICAgICAgICAgICAgIGNsYXNzIHNzIGV4dGVuZHMgQWUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy5qdiA9IDgwLCB0aGlzLmZpeGVkUmFpbFdpZHRoID0gdGhpcy5qdiwgdGhpcy5ldmVudExpc3QucHVzaCh4dFt4dC5Wb2x1bWVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25Qcm9ncmVzc0NoYW5nZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Wb2x1bWVdLCB7IHBheWxvYWQ6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG5zID0gZSg5NiksIHJzID0gZS5uKG5zKSwgaHMgPSBlKDk3KSwgYXMgPSBlLm4oaHMpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gb3ModCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBlID8gZ1tnLkF1dG9dIDogaS5oZWlnaHQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5hbWUuaW5kZXhPZihzKSA+IC0xID8gdC5pc0FjdGl2ZSA9ICEwIDogdC5pc0FjdGl2ZSA9ICExOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnW3QuZXZlbnRdID09PSBnLkF1dG87CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZmluZCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmV2ZW50ID09PSBpLmhlaWdodC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBgJHsgbi5uYW1lIH0gKCR7IGUubmFtZSB9KWA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNoYW5nZUl0ZW1OYW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG4uY2hhbmdlSXRlbU5hbWUobi5uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGNzIGV4dGVuZHMgVmUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmFsaWduTWlkZGxlID0gITAsIHRoaXMuYWxpZ25Ub3AgPSAhMCwgdGhpcy5mb3JjZVJpZ2h0ID0gITEsIHRoaXMua3YgPSBbXSwgdGhpcy5fdiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eTogZy5BdXRvCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQXYgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VuZEV2ZW50KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BdiA9IGdbdF0gPT09IGcuQXV0bywgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHRoaXMuZXZlbnROYW1lLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLkF2ID8gdGhpcy5fdi5oZWlnaHQgOiBwYXJzZUludCh0LCAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eTogdGhpcy5BdiA/IGcuQXV0byA6IGcuU3RyaWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjcmVhdGVRdWFsaXR5TWVudSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3YgPSBbXSwgdGhpcy5JdiA9IHQsIHRoaXMuSXYuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3YucHVzaChuZXcgVWUodGhpcywgdGhpcy5qcywgdGhpcy5oYywgdGhpcy5RbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAkeyB0LnZpZGVvSGVpZ2h0IH1wYCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFdmVudDogdC52aWRlb0hlaWdodC50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0LmlzSEQgPyAnSEQnIDogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmt2LnB1c2gobmV3IFVlKHRoaXMsIHRoaXMuanMsIHRoaXMuaGMsIHRoaXMuUW4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGdbZy5BdXRvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUV2ZW50OiBnW2cuQXV0b10KICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBvcyh0aGlzLmt2LCB0aGlzLl92LCB0aGlzLkF2KSwgdGhpcy5idWlsZENvbnRleHRNZW51KHRoaXMua3YpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblJlc2l6ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDb29yZGluYXRlcygpLCB0aGlzLmlzT3BlbiAmJiB0aGlzLnBvc2l0aW9uQ29udGV4dE1lbnUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVF1YWxpdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5oKSh0aGlzLkl2KSAmJiAodGhpcy5BdiA9IHQucXVhbGl0eSA9PT0gZy5BdXRvLCB0aGlzLl92LnF1YWxpdHkgPSB0LnF1YWxpdHksIHRoaXMuX3YuaGVpZ2h0ID0gT2JqZWN0KHdpLmIpKHQuaGVpZ2h0LCB0aGlzLkl2Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIG9zKHRoaXMua3YsIHRoaXMuX3YsIHRoaXMuQXYpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdXMgPSBlKDk4KSwgbHMgPSBlLm4odXMpOwogICAgICAgICAgICAgICAgY2xhc3MgZHMgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93KCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5PKSh0aGlzLkJjKSwgT2JqZWN0KFQuaSkodGhpcy5CYyksIE9iamVjdChULmEpKHRoaXMuQmMsIGQuaC5BY3RpdmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5JKSh0aGlzLkJjLCBkLmguQWN0aXZlKSwgT2JqZWN0KFQudSkodGhpcy5CYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgZnMgZXh0ZW5kcyBZaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgciwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzLCBuKSwgdGhpcy50b29sdGlwID0gaCwgdGhpcy5DdiA9IHFpW3JdLCB0aGlzLmV2ZW50TGlzdC5wdXNoKHRoaXMuQ3YpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHRoaXMuQ3YpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHBzIGV4dGVuZHMgUWkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSwgcywgbiksIHRoaXMudG9vbHRpcCA9IGgsIHRoaXMuZXZlbnRMaXN0ID0gW10sIHRoaXMuQ3YgPSBxaVtyXSwgdGhpcy5ldmVudExpc3QucHVzaCh0aGlzLkN2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25DbGlja0hhbmRsZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB0aGlzLkN2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBicyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpzID0gdCwgdGhpcy5oYyA9IGksIHRoaXMuUW4gPSBlLCB0aGlzLlR2ID0gbmV3IE1hcCgpLCBPYmplY3Qua2V5cyhzKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUHYocWlbdF0sIHNbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QnV0dG9uKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3ZlcmFibGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6IG4KICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuTXYodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gbmV3IGZzKGksIHRoaXMuanMsIHRoaXMuaGMsIHMsIHRoaXMuUW4sIHQsIG4pIDogbmV3IHBzKGksIHRoaXMuanMsIHRoaXMuaGMsIHMsIHRoaXMuUW4sIHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0dlbmVyYWxDb21wb25lbnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Udi5oYXModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE12KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVHYuZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBQdih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVHYuc2V0KHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB2cyA9IGUoOTkpLCBtcyA9IGUubih2cyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBncyh0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBgXG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtaWNvbi1idXR0b24gY254LWJ1dHRvbi0keyBxaVt0XS50b0xvd2VyQ2FzZSgpIH0gY254LXVpLWJ0bi1ob3ZlcmFibGUiPlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1idG4tY29udGFpbmVyIj5cbiAgICAgICAgICAgICAgICAgICAgJHsgaSB9XG4gICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgYC50cmltKCkgOiBgPGNueCBjbGFzcz0iY254LWJ1dHRvbi0keyBxaVt0XS50b0xvd2VyQ2FzZSgpIH0iPiR7IGkgfTwvY254PmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeXMgPSBlKDU5KSwgd3MgPSBlLm4oeXMpLCBPcyA9IGUoMTAwKSwgeHMgPSBlLm4oT3MpOwogICAgICAgICAgICAgICAgdmFyIFNzID0gewogICAgICAgICAgICAgICAgICAgIFtxaVtxaS5Nb3JlQnV0dG9uXV06IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGdzKHFpLk1vcmVCdXR0b24sIHhzLmEpLAogICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAnTW9yZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzSG92ZXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgW3FpW3FpLkNsb3NlQnV0dG9uXV06IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGdzKHFpLkNsb3NlQnV0dG9uLCBtcy5hKSwKICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ0Nsb3NlIFBsYXllcicsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzSG92ZXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgW3FpW3FpLlVwTmV4dEJ1dHRvbl1dOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBncyhxaS5VcE5leHRCdXR0b24sIHdzLmEpLAogICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAnTmV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzSG92ZXJhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgW3FpW3FpLlByZXZpb3VzQnV0dG9uXV06IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGdzKHFpLlByZXZpb3VzQnV0dG9uLCB3cy5hKSwKICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ1ByZXZpb3VzJywKICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3ZlcmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGpzID0gJ0FkJzsKICAgICAgICAgICAgICAgIGNsYXNzIGtzIGV4dGVuZHMgWWkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlNraXBBZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmV2ZW50TGlzdAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLkV2ID0gLTEsIHRoaXMuTHYgPSAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBvbmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdENvbXBvbmVudCgpLCB0aGlzLmhpZGVDb21wb25lbnQoKSwgdGhpcy5SdiA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2NueC1zcGFuJylbMF0sIHRoaXMuUnYuaW5uZXJIVE1MID0ganMsIHRoaXMuQnYgPSB0aGlzLkJjLnF1ZXJ5U2VsZWN0b3JBbGwoYC4keyBkLnAuVGltZXIgfSBzdmdgKVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U2Vjb25kc1VudGlsU2tpcCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRXYgPSBNYXRoLmNlaWwodCksIHRoaXMuTHYgPSAtMSwgdGhpcy5FdiA+IDAgJiYgT2JqZWN0KFQuTikodGhpcy5CdiwgeyAnYW5pbWF0aW9uLWR1cmF0aW9uJzogdGhpcy5FdiArICdzJyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGlja0Rvd24odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5FdiAtIE1hdGguZmxvb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgMCB8fCAwID09PSB0aGlzLkx2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0KFQudCkodGhpcy5CYywgZC5wLkluVGltZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkx2ID0gaSwgMCA9PT0gdGhpcy5MdiA/IChlICYmIE9iamVjdChULkkpKHRoaXMuQmMsIGQucC5JblRpbWVyKSwgdGhpcy5Sdi5pbm5lckhUTUwgPSBqcykgOiAoZSB8fCBPYmplY3QoVC5hKSh0aGlzLkJjLCBkLnAuSW5UaW1lciksIHRoaXMuUnYuaW5uZXJIVE1MID0gYGluICR7IHRoaXMuTHYgfXNgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRvb2x0aXAoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2tIYW5kbGVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAwID09PSB0aGlzLkx2ICYmIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Ta2lwQWRdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgX3MgPSBlKDEwMSksIEFzID0gZS5uKF9zKSwgSXMgPSBlKDEwMiksIENzID0gZS5uKElzKTsKICAgICAgICAgICAgICAgIGNvbnN0IFRzID0gJ0xvYWRpbmcgYWQnOwogICAgICAgICAgICAgICAgY2xhc3MgUHMgZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRHYgPSB0aGlzLkJjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZC5hLkJhY2tncm91bmRJbWcpWzBdLCB0aGlzLkZ2ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuYS5JY29uKVswXSwgdGhpcy5Gdi5pbm5lckhUTUwgPSBDcy5hLCB0aGlzLlZ2ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuYS5CdXR0b25Db250YWluZXIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuYS5CdXR0b24pWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlV2ID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoYDxhIGNsYXNzPSIkeyBkLmEuV3JhcHBlciB9IiBocmVmPSIjIj5gKSwgdGhpcy5Vdi50YXJnZXQgPSBrdC5jLkJsYW5rLCB0aGlzLlV2LmFwcGVuZENoaWxkKHQpLCB0aGlzLlZ2LmlubmVySFRNTCA9ICcnLCB0aGlzLlZ2LmFwcGVuZENoaWxkKHRoaXMuVXYpLCB0aGlzLiR2ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuYS5JbmZvQ29udGFpbmVyKVswXSwgdGhpcy5OdiA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShkLmEuRmFsbGJhY2tDb250YWluZXIpWzBdLCB0aGlzLkh2ID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGQuYS5TbG90Q291bnRUZXh0KVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QmFja2dyb3VuZEltZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5oKSh0KSA/IChPYmplY3QoVC5JKSh0aGlzLkR2LCBkLmguRGlzcGxheU5vbmUpLCB0aGlzLkR2LnNyYyA9IHQpIDogT2JqZWN0KFQuYSkodGhpcy5EdiwgZC5oLkRpc3BsYXlOb25lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Q2xpY2tVcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChydC5oKSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoVC5PKSh0aGlzLk52KSwgdm9pZCBPYmplY3QoVC51KSh0aGlzLiR2KTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuTykodGhpcy4kdiksIE9iamVjdChULnUpKHRoaXMuTnYpLCB0aGlzLlV2LmhyZWYgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRGYWxsYmFja1RleHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdCB8fCAxLCBzID0gaSB8fCAxOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkh2LmlubmVySFRNTCA9IGAkeyBUcyB9ICR7IGUgfS8keyBzIH1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBNcywgRXMgPSBlKDEwMyksIExzID0gZS5uKEVzKTsKICAgICAgICAgICAgICAgIGNsYXNzIFJzIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0pKCksIG4gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpzID0gdCwgdGhpcy5oYyA9IGksIHRoaXMuQmMgPSBlLCB0aGlzLlduID0gcywgdGhpcy5xdiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5QbGF5QnV0dG9uXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenYoITEsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5CaWdQbGF5QnV0dG9uXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenYoITAsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5Wb2x1bWVQcm9ncmVzc106IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3ModCwgdGhpcy5qcywgdGhpcy5oYywgcnMuYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3FpLkV4cGFuZEJ1dHRvbl06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdWUodCwgdGhpcy5qcywgdGhpcy5oYywgYXMuYSwgdGhpcy5Xbi5pc01vYmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3FpLlF1YWxpdHlNZW51XTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjcyh0LCB0aGlzLmpzLCB0aGlzLmhjLCBscy5hLCB4dFt4dC5RdWFsaXR5XSwgcWkuUXVhbGl0eU1lbnUsIHRoaXMuQmMsIHRoaXMuV24uaXNNb2JpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5Mb2FkZXJdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGRzKHQsIHRoaXMuanMsIHRoaXMuaGMsIEJlLmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5Ta2lwQWRCdXR0b25dOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGtzKHQsIHRoaXMuanMsIHRoaXMuaGMsIEFzLmEsIHRoaXMuV24uaXNNb2JpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5BZExvYWRpbmdTY3JlZW5dOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBzKHQsIHRoaXMuanMsIHRoaXMuaGMsIExzLmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnp2ID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgS2koaSwgdGhpcy5qcywgdGhpcy5oYywgZnVuY3Rpb24gKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuICAgIDxjbnggY2xhc3M9ImNueC1pY29uLWJ1dHRvbiBjbngtdWktYnRuLWhvdmVyYWJsZSAkeyB0ID8gJ2NueC1idXR0b24tYmlnLXBsYXknIDogJycgfSI+XG4gICAgICAgIDxjbnggY2xhc3M9ImNueC1idG4tY29udGFpbmVyIj5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1wbGF5LWljb24iPiR7IHRzLmEgfTwvY254PlxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXBhdXNlLWljb24iPiR7IGVzLmEgfTwvY254PlxuICAgICAgICA8L2NueD5cbiAgICA8L2NueD5cbmAudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0KSwgdGhpcy5Xbi5pc01vYmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuV3YgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5xdlt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkd2ID0gbmV3IGJzKHRoaXMuanMsIHRoaXMuaGMsIHRoaXMuV24uaXNNb2JpbGUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgU3MpLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLld2KHQpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSB8fCAodGhpcy5Hdi5pc0dlbmVyYWxDb21wb25lbnQodCkgPyB0aGlzLkd2LmdldEJ1dHRvbih0LCBpKSA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0Lk11dGUgPSAwXSA9ICdNdXRlJywgdFt0LlVubXV0ZSA9IDFdID0gJ1VubXV0ZSc7CiAgICAgICAgICAgICAgICB9KE1zIHx8IChNcyA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBCcyBleHRlbmRzIFlpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQsIGksIGUsIHMsIHIpLCB0aGlzLmV2ZW50TGlzdCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0Lk11dGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuVW5tdXRlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlN0YXRlQ2hhbmdlZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmV2ZW50TGlzdAogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLkp2ID0gJ011dGUnLCB0aGlzLlF2ID0gJ1VubXV0ZScsIHRoaXMuenQgPSBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkNsaWNrSGFuZGxlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56dCA9PT0gTXMuTXV0ZSA/ICh0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuVW5tdXRlXSksIHRoaXMuc2V0U3RhdGUoTXMuVW5tdXRlKSkgOiAodGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0Lk11dGVdKSwgdGhpcy5zZXRTdGF0ZShNcy5NdXRlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ID09PSBNcy5NdXRlID8gT2JqZWN0KFQuTCkodGhpcy5CYywgJ2NueC1zb3VuZC1vbicsICdjbngtc291bmQtb2ZmJykgOiBPYmplY3QoVC5MKSh0aGlzLkJjLCAnY254LXNvdW5kLW9mZicsICdjbngtc291bmQtb24nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRvb2x0aXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnp0ID09PSBNcy5NdXRlID8gdGhpcy5RdiA6IHRoaXMuSnY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRDb21wb25lbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXRDb21wb25lbnQoKSwgdGhpcy5xcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuenQgIT09IHQgJiYgKHRoaXMuenQgPSB0LCB0aGlzLnFwKCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5TdGF0ZUNoYW5nZWRdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPiAwID8gdGhpcy5zZXRTdGF0ZShNcy5Vbm11dGUpIDogdGhpcy5zZXRTdGF0ZShNcy5NdXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBEcyBleHRlbmRzIG5lIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKGksIGUsIHMpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5CYyA9IHRoaXMuZWIuZ2V0UmVuZGVyZWREb20oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5CYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBvbmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lYi5pbml0Q29tcG9uZW50cygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5PKSh0aGlzLkJjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZUNvbXBvbmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQudSkodGhpcy5CYyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgRnMgZXh0ZW5kcyBEcyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzKSwgdGhpcy5YdiA9IG51bGwsIHRoaXMuZXZlbnRMaXN0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuVm9sdW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LlZvbHVtZUhvdmVyU3RhcnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuVm9sdW1lSG92ZXJTdG9wcGVkXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LkRyYWdnaW5nU3RvcHBlZF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dFt4dC5EcmFnZ2luZ1N0YXJ0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh0W3h0LkhvdmVyU3RhcnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuSG92ZXJFbmRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHRbeHQuU3RhdGVDaGFuZ2VkXQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLll2ID0gMC4yLCB0aGlzLkt2ID0gNjAwLCB0aGlzLlp2ID0gITEsIHRoaXMudG0gPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLlh2KSwgT2JqZWN0KFQuYSkodGhpcy5CYywgJ2NueC1tb2QtaG92ZXInKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZUhvdmVyU3RhcnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5pbSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWnYgfHwgKG51bGwgIT09IHRoaXMuWHYgJiYgY2xlYXJUaW1lb3V0KHRoaXMuWHYpLCB0aGlzLlh2ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5CYywgJ2NueC1tb2QtaG92ZXInKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZUhvdmVyU3RvcHBlZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5LdikpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmVtID0gdGhpcy5ZdiwgdGhpcy5ubSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlZvbHVtZUJ1dHRvbiksIHRoaXMucm0gPSB0aGlzLmdldENvbXBvbmVudChxaS5Wb2x1bWVQcm9ncmVzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbXBvbmVudEV2ZW50KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHM7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LlZvbHVtZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gaS5wYXlsb2FkIC8gMTAwLCB0aGlzLmhtKHMpLCB0aGlzLmFtKGkucGF5bG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5NdXRlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAwLCB0aGlzLnNldFZvbHVtZVByb2dyZXNzKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuVW5tdXRlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0aGlzLmVtLCB0aGlzLnNldFZvbHVtZVByb2dyZXNzKDEwMCAqIHRoaXMuZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuRHJhZ2dpbmdTdG9wcGVkXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWnYgPSAhMSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkRyYWdnaW5nU3RvcHBlZF0pLCB0aGlzLmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5EcmFnZ2luZ1N0YXJ0XToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWnYgPSAhMCwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkRyYWdnaW5nU3RhcnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LkhvdmVyU3RhcnRdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkhvdmVyU3RhcnRdLCB7IHBheWxvYWQ6IHsgdGFyZ2V0Q29tcG9uZW50OiBlIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5Ib3ZlckVuZF06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuSG92ZXJFbmRdLCB7IHBheWxvYWQ6IHsgdGFyZ2V0Q29tcG9uZW50OiBlIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5TdGF0ZUNoYW5nZWRdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlN0YXRlQ2hhbmdlZF0sIHsgcGF5bG9hZDogeyB0YXJnZXRDb21wb25lbnQ6IGUgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHMgJiYgdGhpcy5vbShzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaG0odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0IDwgdGhpcy5ZdiA/IHRoaXMuZW0gPSB0aGlzLll2IDogdGhpcy5lbSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9tKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYW0odCkgewogICAgICAgICAgICAgICAgICAgICAgICAwID09PSB0ID8gdGhpcy5ubS5zZXRTdGF0ZShNcy5NdXRlKSA6IHRoaXMubm0uc2V0U3RhdGUoTXMuVW5tdXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Vm9sdW1lUHJvZ3Jlc3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJtLnNldFByb2dyZXNzKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0Q29tcG9uZW50KCksIHRoaXMuQmMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMudG0pLCB0aGlzLkJjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLmltKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Vm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IDEwMCAqIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW0oaSksIHRoaXMuc2V0Vm9sdW1lUHJvZ3Jlc3MoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKSwgdGhpcy5CYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgdGhpcy50bSksIHRoaXMuQmMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuaW0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBWcyA9IGBcbiAgICA8Y254IGNsYXNzPSJjbngtdm9sdW1lLWNvbnRhaW5lciI+XG4gICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idG4gY254LXZvbHVtZS1idG4iPlxuICAgICAgICAgICAgW1skeyBxaS5Wb2x1bWVCdXR0b24gfV1dXG4gICAgICAgIDwvY254PlxuICAgICAgICA8Y254IGNsYXNzPSJjbngtdm9sdW1lLWJhciI+XG4gICAgICAgICAgICBbWyR7IHFpLlZvbHVtZVByb2dyZXNzIH1dXVxuICAgICAgICA8L2NueD5cbiAgICA8L2NueD5cbmAudHJpbSgpLCBVcyA9IGUoMTA0KSwgJHMgPSBlLm4oVXMpLCBOcyA9IGUoMTA1KSwgSHMgPSBlLm4oTnMpOwogICAgICAgICAgICAgICAgdmFyIHFzID0gewogICAgICAgICAgICAgICAgICAgICAgICBbcWlbcWkuU2hhcmVCdXR0b25dXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGdzKHFpLlNoYXJlQnV0dG9uLCBIcy5hKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICdTaGFyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvdmVyYWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgW3FpW3FpLkNhc3RCdXR0b25dXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGdzKHFpLkNhc3RCdXR0b24sICRzLmEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogJ0Nhc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3ZlcmFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCB6cyA9IGUoMTA2KSwgV3MgPSBlLm4oenMpLCBHcyA9IGUoMTA3KSwgSnMgPSBlLm4oR3MpLCBRcyA9IGUoMTA4KSwgWHMgPSBlLm4oUXMpOwogICAgICAgICAgICAgICAgY29uc3QgWXMgPSA5MCAqIHF0LmcsIEtzID0gJ1RoaXMgbGl2ZSBzdHJlYW0gd2lsbCBzdGFydCBzaG9ydGx5JywgWnMgPSAnVGhpcyBsaXZlIHN0cmVhbSBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4gUGxlYXNlIGNoZWNrIGFnYWluIHNob3J0bHknLCB0biA9ICdMaXZlIHN0cmVhbSBub3Qgc3VwcG9ydGVkIGJ5IGJyb3dzZXInOwogICAgICAgICAgICAgICAgY2xhc3MgZW4gZXh0ZW5kcyBKaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRMaXN0ID0gW10sIHRoaXMuY20gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVtID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoJzxpbWcvPicpLCB0aGlzLkJjLmFwcGVuZENoaWxkKHRoaXMudW0pLCB0aGlzLmxtID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY254LXNwYW4nKVswXSwgdGhpcy5kbSA9IHRoaXMuQmMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY254LWxpdmUtbWVzc2FnZScpWzBdLCB0aGlzLmZtID0gdGhpcy5CYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjbngtbGl2ZS1pY29uJylbMF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFBvc3RlclNyYyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5oKSh0KSAmJiAodGhpcy51bS5zcmMgPSB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UG9zdGVyQWx0VGV4dCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW0uYWx0ID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SWNvblRvU3RhcnRpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm0uaW5uZXJIVE1MID0gYCR7IEpzLmEgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEljb25Ub0VuZGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZtLmlubmVySFRNTCA9IGAkeyBYcy5hIH1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRNZXNzYWdlVG9TdGFydGluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbShLcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldE1lc3NhZ2VUb0VuZGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBtKFpzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TWVzc2FnZVRvTm90U3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBtKHRuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGVsYXllZFN0YXJ0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmUpKERhdGUucGFyc2UodCkpICYmICh0aGlzLmJtID0gbmV3IERhdGUodCksIHRoaXMudm0oKSA+IDAgJiYgKHRoaXMubW0oKSwgY2xlYXJJbnRlcnZhbCh0aGlzLmNtKSwgdGhpcy5jbSA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcXQuZiAqIHF0LmcpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3dNZXNzYWdlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5PKSh0aGlzLmZtKSwgT2JqZWN0KFQuTykodGhpcy5kbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGVNZXNzYWdlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC51KSh0aGlzLmZtKSwgT2JqZWN0KFQudSkodGhpcy5kbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3coKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULk8pKHRoaXMuQmMpLCBPYmplY3QoVC5hKSh0aGlzLkJjLCBkLmguQWN0aXZlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5CYywgZC5oLkFjdGl2ZSksIE9iamVjdChULnUpKHRoaXMuQmMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5kZXN0cm95KCksIGNsZWFySW50ZXJ2YWwodGhpcy5jbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1tKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy52bSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdtKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbShgTGl2ZSBpbiAkeyBpIH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBtKEtzKSwgY2xlYXJJbnRlcnZhbCh0aGlzLmNtKSwgdGhpcy5jbSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZtKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE1hdGgubWF4KHRoaXMuYm0uZ2V0VGltZSgpLCBEYXRlLm5vdygpKSAtIERhdGUubm93KCkpIC8gcXQuZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ20odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdCA+PSBZcyA/IE1hdGgucm91bmQodCAvIChxdC5nICogcXQuYykpIDogTWF0aC5jZWlsKHQgLyBxdC5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyBpIH0gJHsgdCA+PSBZcyA/ICdob3VycycgOiBgbWludXRlJHsgMSA9PT0gaSA/ICcnIDogJ3MnIH1gIH1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwbSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG0uaW5uZXJIVE1MID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgc24gPSBlKDEwOSksIG5uID0gZS5uKHNuKTsKICAgICAgICAgICAgICAgIGNsYXNzIHJuIGV4dGVuZHMgSmkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50TGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0Q29tcG9uZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVDb21wb25lbnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaG4sIGFuID0gZSgxMTApLCBvbiA9IGUubihhbik7CiAgICAgICAgICAgICAgICBjbGFzcyBjbiBleHRlbmRzIFJzIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQsIGksIGUsIHMsIHFzKSwgdGhpcy5qcyA9IHQsIHRoaXMuQmMgPSBlLCB0aGlzLlduID0gcywgdGhpcy55bSA9IG4sIHRoaXMud20gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuVm9sdW1lQ29udHJvbHNdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZzKHQsIHRoaXMuanMsIFZzLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuVm9sdW1lQnV0dG9uXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCcyh0LCB0aGlzLmpzLCB0aGlzLmhjLCBXcy5hLCBNcy5NdXRlLCB0aGlzLlduLmlzTW9iaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuU2V0dGluZ3NCdXR0b25dOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGRlKHQsIHRoaXMuanMsIHRoaXMuaGMsIHBlLmEsIHRoaXMuV24uaXNNb2JpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5DYXB0aW9uQnV0dG9uXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB2ZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCBnZS5hLCBkLmguQWN0aXZlLCB0aGlzLlduLmNsb3NlZENhcHRpb25EZWZhdWx0LCB0aGlzLlduLmlzTW9iaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuVXBOZXh0Qm94XTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCB3ZS5hLCB0aGlzLlduLmlzTW9iaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuTG9nb0NvbXBvbmVudF06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KHJ0LmEpKHRoaXMuV24ubG9nb1VybCkgJiYgIU9iamVjdChydC5hKSh0aGlzLlduLmxvZ29Qb3NpdGlvbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY3VzdG9tIGxvZ28gaXMgdW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB4ZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCAnPGNueCBjbGFzcz0iY254LWxvZ28iPjwvY254PicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb1VybDogdGhpcy5Xbi5sb2dvVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dvUG9zaXRpb246IHRoaXMuV24ubG9nb1Bvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3FpLkxvZ29PdXRzdHJlYW1dOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChydC5hKSh0aGlzLlduLmxvZ29VcmwpICYmICFPYmplY3QocnQuYSkodGhpcy5Xbi5sb2dvUG9zaXRpb24pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ291dHN0cmVhbSBsb2dvIHVuZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgS2UodCwgdGhpcy5qcywgdGhpcy5oYywgJzxpbWcgY2xhc3M9ImNueC1ob21lLXNjcmVlbi1sb2dvIiAvPicsIHsgbG9nb1VybDogdGhpcy5Xbi5sb2dvVXJsIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5MaXZlUG9zdGVyXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlbih0LCB0aGlzLmpzLCB0aGlzLmhjLCBubi5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuTGl2ZUljb25dOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHJuKHQsIHRoaXMuanMsIHRoaXMuaGMsIG9uLmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5FbGFwc2VkVGltZUxhYmVsXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCBrZS5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuVG90YWxEdXJhdGlvbkxhYmVsXTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCBrZS5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcWkuUHJvZ3Jlc3NCYXJdOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEllKHQsIHRoaXMuanMsIHRoaXMuaGMsIFRlLmEsIHRoaXMuV24uaXNNb2JpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5RdWVTdGF0ZU92ZXJsYXldOiB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBlKHQsIHRoaXMuanMsIHRoaXMuaGMsIEJlLmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5Db250ZXh0TWVudV06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcWUodCwgdGhpcy5qcywgdGhpcy5oYywgTGUuYSwgeHRbeHQuQ29udGV4dENsaWNrXSwgcWkuQ29udGV4dE1lbnUsIHRoaXMuQmMsIHRoaXMuV24uaXNNb2JpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5FbGVtZW50c1NldHRpbmdzTWVudV06IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2UodCwgdGhpcy5qcywgdGhpcy5oYywgRmUuYSwgeHRbeHQuU2V0dGluZ3NNZW51XSwgcWkuRWxlbWVudHNTZXR0aW5nc01lbnUsIHRoaXMuQmMsIHRoaXMueW0sIHRoaXMuV24uaXNNb2JpbGUsIHRoaXMuV24uY2xvc2VkQ2FwdGlvbkRlZmF1bHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtxaS5DYXB0aW9uQ29tcG9uZW50XTogdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBRZSh0LCB0aGlzLmpzLCB0aGlzLmhjLCBZZS5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5PbSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLndtW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk9tKHQpKGkpIHx8IHN1cGVyLmNyZWF0ZUNvbXBvbmVudCh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkluUG9kID0gJ2NueC1hZC1pbi1wb2QnLCB0LkFkTWFya2VySW5Qb2RUZXh0Q29udGFpbmVyID0gJ2NueC1hZC1tYXJrZXItdGV4dCcsIHQuQ2FyZEltYWdlID0gJ2NueC1hZC1jYXJkLWltYWdlJywgdC5DYXJkVGl0bGUgPSAnY254LWFkLWNhcmQtdGl0bGUnLCB0LkFkVWlDb250ZW50ID0gJ2NueC11aS1hZC1jb250ZW50JzsKICAgICAgICAgICAgICAgIH0oaG4gfHwgKGhuID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIHVuIGV4dGVuZHMgbGUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIsIGggPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBuLCBpLCByLCBhIHx8IG5ldyBjbihpLCBzLCBuLCBoKSksIHRoaXMubWVkaWF0b3IgPSB0LCB0aGlzLmdsb2JhbERvbVV0aWxzU2VydmljZSA9IGksIHRoaXMucGwgPSBlLCB0aGlzLiRjb250YWluZXIgPSBuLCB0aGlzLnNldHRpbmdzID0gaCwgdGhpcy5yYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBsYXlpbmdTdGF0ZV06IG5ldyB0ZSh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBhdXNlZFN0YXRlXTogbmV3IGVlKHRoaXMpCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMueG0gPSAwLCB0aGlzLk5oID0gbnVsbCwgdGhpcy5qbSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuUSkodGhpcy4kdWlDb250YWluZXIsIGQuZy5VaUluVmlldywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuT2Iuc2V0RGlzdGFuY2VWYWx1ZXMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiA0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnJiW3kuUGF1c2VkU3RhdGVdLmVudGVyU3RhdGUoKSwgdGhpcy5rbSA9IHRoaXMuJGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuJHsgaG4uQ2FyZEltYWdlIH1gKSwgdGhpcy5fbSA9IHRoaXMuJGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuJHsgaG4uQ2FyZFRpdGxlIH1gKSwgdGhpcy5BbSA9IHRoaXMuJGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAuJHsgaG4uQWRVaUNvbnRlbnQgfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb21wb25lbnRFdmVudCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwZXIuaGFuZGxlQ29tcG9uZW50RXZlbnQodCwgaSwgZSksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5Wb2x1bWVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuTXV0ZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuTXV0ZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuVW5tdXRlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Vbm11dGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHFpW3FpLkNsb3NlQnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5DbG9zZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuRXhwYW5kXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5FeHBhbmRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LkNvbGxhcHNlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Db2xsYXBzZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wb25lbnQocWkuUHJvZ3Jlc3NCYXIpLCBlID0gdGhpcy5nZXRDb21wb25lbnQocWkuVG90YWxEdXJhdGlvbkxhYmVsKSwgcyA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlNraXBBZEJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICF0ICYmIHMgJiYgKHMuc2V0U2Vjb25kc1VudGlsU2tpcCgwKSwgcy50aWNrRG93bigwKSksIHQgfHwgIWkgPyAodGhpcy5lbGFwc2VkVGltZSA9IDAsIHRoaXMuZHVyYXRpb24gPSB0LCBpICYmIGkuc2V0UHJvZ3Jlc3MoT2JqZWN0KHdpLmUpKDAsIHQsIDAsIDEwMCwgMCkpLCBlICYmIGUuc2V0VGltZSh0KSwgdGhpcy5JbSh0aGlzLnhtKSkgOiBpLnNldFByb2dyZXNzKDEwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5Wb2x1bWVDb250cm9scyksIGUgPSB0aGlzLmdldENvbXBvbmVudChxaS5Wb2x1bWVCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBpICYmIGkuc2V0Vm9sdW1lKHQpLCBlICYmIGUuc2V0Vm9sdW1lKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgZWxhcHNlZFRpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnhtOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgZWxhcHNlZFRpbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhtID0gdCwgdGhpcy5JbSh0aGlzLnhtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvd1NraXBBZEJ1dHRvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5Ta2lwQWRCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBpICYmIChpLnNob3dDb21wb25lbnQoKSwgaS5zZXRTZWNvbmRzVW50aWxTa2lwKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZVNraXBBZEJ1dHRvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlNraXBBZEJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5oaWRlQ29tcG9uZW50KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZFBvZEFkTWFya2VyKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy4kdWlDb250YWluZXIsIGhuLkluUG9kKSwgT2JqZWN0KGwuYykodGhpcy4kdWlDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShobi5BZE1hcmtlckluUG9kVGV4dENvbnRhaW5lcikpLmZvckVhY2goZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlubmVySFRNTCA9IGAkeyB0ICsgMSB9LyR7IGkgfWA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZW1vdmVBZGRQb2RBZE1hcmtlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy4kdWlDb250YWluZXIsIGhuLkluUG9kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSW0odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wb25lbnQocWkuRWxhcHNlZFRpbWVMYWJlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5zZXRUaW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5nZXRDb21wb25lbnQocWkuU2tpcEFkQnV0dG9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLnRpY2tEb3duKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlQWRMb2FkaW5nU2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRDb21wb25lbnQocWkuQWRMb2FkaW5nU2NyZWVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmhpZGVDb21wb25lbnQoKSwgT2JqZWN0KFQuSSkodGhpcy4kY29udGFpbmVyLCBkLmcuUG9kTG9hZGluZ1NjcmVlbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3dBZExvYWRpbmdTY3JlZW4odCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5nZXRDb21wb25lbnQocWkuQWRMb2FkaW5nU2NyZWVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAobi5zaG93Q29tcG9uZW50KCksIG4uc2V0QmFja2dyb3VuZEltZyh0KSwgbi5zZXRDbGlja1VybChpKSwgbi5zZXRGYWxsYmFja1RleHQoZSwgcyksIE9iamVjdChULmEpKHRoaXMuJGNvbnRhaW5lciwgZC5nLlBvZExvYWRpbmdTY3JlZW4pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZUFkTWFya2VyKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy4kY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJy5jbngtYWQtbWFya2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULnUpKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlUHJvZ3Jlc3NCYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KHFpLlByb2dyZXNzQmFyKS5oaWRlQ29tcG9uZW50KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldENvbnRpbnVlUmVhZGluZ0NhcmQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmttLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9IGB1cmwoIiR7IHQuaW1hZ2VTcmMgfSIpYCwgdGhpcy5fbS5pbm5lckhUTUwgPSB0LnRpdGxlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXJkSGFzRGF0YSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKSh0aGlzLmttLnN0eWxlLmJhY2tncm91bmRJbWFnZSkgJiYgT2JqZWN0KHJ0LmgpKHRoaXMuX20uaW5uZXJIVE1MKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvd0NvbnRpbnVlUmVhZGluZ0NhcmQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0aGlzLiRjb250YWluZXIsIGQuZy5BZFNob3dDYXJkKSwgbnVsbCA9PT0gdGhpcy5OaCAmJiAodGhpcy5OaCA9IHRoaXMuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLnJlcXVlc3RBbmltYXRpb25GcmFtZUhlbHBlcigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5oID0gbnVsbCwgT2JqZWN0KFQuTikodCwgeyBoZWlnaHQ6IGAkeyB0aGlzLkFtLmNsaWVudEhlaWdodCB9cHhgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGVDb250aW51ZVJlYWRpbmdDYXJkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy4kY29udGFpbmVyLCBkLmcuQWRTaG93Q2FyZCksIE9iamVjdChULkspKHQsICdoZWlnaHQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2hvdygpLCB0aGlzLnBsLm9uKHRoaXMuJHVpQ29udGFpbmVyLCB0aGlzLmptLCB7IHRocmVzaG9sZDogMC41IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULlEpKHRoaXMuJHVpQ29udGFpbmVyLCBkLmcuVWlJblZpZXcsICExKSwgdGhpcy5wbC5vZmYodGhpcy4kdWlDb250YWluZXIsIHRoaXMuam0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KHFpLkV4cGFuZEJ1dHRvbikuc2V0U3RhdGUoaGUuZXhwYW5kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50KHFpLkV4cGFuZEJ1dHRvbikuc2V0U3RhdGUoaGUuY29sbGFwc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsbiA9IGUoMTExKSwgZG4gPSBlLm4obG4pOwogICAgICAgICAgICAgICAgY2xhc3MgZm4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93RXhwYW5kQnV0dG9uID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpIGNueC11aS1hZCI+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWFkLWNvbnRlbnQgJHsgdGhpcy5zaG93RXhwYW5kQnV0dG9uID8gJ2NueC1hZC1mcycgOiAnJyB9Ij5cbiAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LWFkLW1hcmtlciI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtYWQtbWFya2VyLXN2ZyI+JHsgZG4uYSB9PC9jbng+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtYWQtbWFya2VyLXRleHQiPjEvMTwvY254PlxuICAgICAgICAgICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LWFkLWNsb3NlLWJ1dHRvbiBjbngtdWktYnRuIj5bWyR7IHFpLkNsb3NlQnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtYWQtYnV0dG9ucyI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtYWQtcGxheS1idXR0b24gY254LXVpLWJ0biI+W1skeyBxaS5QbGF5QnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LWFkLXZvbHVtZS1jb250cm9scyI+W1skeyBxaS5Wb2x1bWVDb250cm9scyB9XV08L2NueD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1hZC12b2x1bWUtYnV0dG9uIGNueC11aS1idG4iPltbJHsgcWkuVm9sdW1lQnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgICAgICAgICAgW1skeyBxaS5Ta2lwQWRCdXR0b24gfV1dXG4gICAgICAgICAgICAgICAgICAgICR7IHRoaXMuZ2V0RXhwYW5kVGVtcGxhdGUoKSB9XG4gICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1hZC1wcm9ncmVzcy1iYXIiPltbJHsgcWkuUHJvZ3Jlc3NCYXIgfV1dPC9jbng+XG4gICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LWFkLWNhcmQiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSIkeyBobi5DYXJkSW1hZ2UgfSIgdmlld0JveD0iMCAwIDE2IDkiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1hZC1jYXJkLXRleHQiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNueD5Db250aW51ZSB3YXRjaGluZzwvY254PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iJHsgaG4uQ2FyZFRpdGxlIH0iPjwvY254PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNueD5hZnRlciB0aGUgYWQ8L2NueD5cbiAgICAgICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICAgICAgW1skeyBxaS5BZExvYWRpbmdTY3JlZW4gfV1dXG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgYC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEV4cGFuZFRlbXBsYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaG93RXhwYW5kQnV0dG9uID8gYDxjbnggY2xhc3M9ImNueC1hZC1leHBhbmQtYnV0dG9uIGNueC11aS1idG4gY254LWhpZGUtb24tdm9sdW1lLWhvdmVyIGNueC1kLXNtLW5vbmUiPltbJHsgcWkuRXhwYW5kQnV0dG9uIH1dXTwvY254PmAgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcG4gPSBlKDE5KTsKICAgICAgICAgICAgICAgIGNvbnN0IGJuID0gNzIsIHZuID0gNCwgbW4gPSAxNTAsIGduID0gMjcwOwogICAgICAgICAgICAgICAgY2xhc3MgeW4gZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuanIgPSBpLCB0aGlzLkNtID0gZSwgdGhpcy5UbSA9IHMsIHRoaXMuUG0gPSBuLCB0aGlzLk1tID0gciwgdGhpcy5aZCA9IGgsIHRoaXMuRW0gPSBbXSwgdGhpcy5maXJzdEFkU2hvd24gPSAhMSwgdGhpcy5IciA9ICExLCB0aGlzLkxtID0gMCwgdGhpcy5SbSA9ICEwLCB0aGlzLkJtID0gITEsIHRoaXMuRG0gPSAhMSwgdGhpcy5GbSA9IFB0LmEuTm9ybWFsLCB0aGlzLlZtID0gdGhpcy5nZXROZXdBZE1hbmFnZXIoKSwgdGhpcy5zdWJzY3JpYmUoVXQuQWRzRW5hYmxlZCwgdGhpcy5WbSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFV0LkFkc0VuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVW0odCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtLmluaXRBZCh0LCBpLCB0aGlzLkZtLCAxLCBlLCBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogdGhpcy4kbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5Qcm90b0FkVHlwZS5WaWRlbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBObSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IbS5zaG93U2tpcEFkQnV0dG9uKHRoaXMuanIuc2tpcEFkQWZ0ZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxbSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlZtLmdldEN1cnJlbnRBZENsaWNrVHJhY2tpbmdQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgdGhpcy5NbS5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tBZENsaWNrKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaSksIHsgdHlwZTogdCB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHptKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucGF5bG9hZC5hZExvYWRlZERhdGEuc2tpcE9mZnNldCAmJiB0LnBheWxvYWQuYWRMb2FkZWREYXRhLnNraXBPZmZzZXQgPj0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuVm0uZ2V0QWREdXJhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuanIuYWRTa2lwcGFiaWxpdHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUGxheWVyQWRTa2lwcGFiaWxpdHkuSWZMb25nZXJUaGFuOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucGF5bG9hZC5hZFNraXBNb2RlID09PSBoLlByb3RvQWRTa2lwTW9kZS5JZkxvbmdlclRoYW4zMVNlYyAmJiAoaSA8IHRoaXMuanIuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuIHx8ICFpKSB8fCB0LnBheWxvYWQuYWRTa2lwTW9kZSA9PT0gaC5Qcm90b0FkU2tpcE1vZGUuTmV2ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b1BsYXllckFkU2tpcHBhYmlsaXR5Lk5vUmVzdHJpY3Rpb25zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucGF5bG9hZC5hZFNraXBNb2RlID09PSBoLlByb3RvQWRTa2lwTW9kZS5OZXZlciB8fCB0LnBheWxvYWQuYWRTa2lwTW9kZSA9PT0gaC5Qcm90b0FkU2tpcE1vZGUuSWZMb25nZXJUaGFuMzFTZWMgJiYgKGkgPCBIdC5kIHx8ICFpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXbSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRW0uZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgIT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0LCBkLmguSGlkZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBHbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FbS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodCwgZC5oLkhpZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVyQ29uZmlnKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WbS51cGRhdGVGaWx0ZXJDb25maWcodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEptKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRtID0gITEsIHRoaXMuSG0uaGlkZUFkTG9hZGluZ1NjcmVlbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBRbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IbS5oaWRlU2tpcEFkQnV0dG9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhtKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdDsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoUHQuYikuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKFB0LmJbaV0sIHRoaXMuVm0sIGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCA9ICExLCBQdC5iW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkTG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CbSA9IHRoaXMuem0oZSksIHRoaXMuQm0gJiYgKHMucGF5bG9hZC5hZExvYWRlZERhdGEuc2tpcE9mZnNldCA9IHRoaXMuanIuc2tpcEFkQWZ0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRQYXVzZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSG0uY2hhbmdlU3RhdGUoeS5QYXVzZWRTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFBsYXlpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSG0uY2hhbmdlU3RhdGUoeS5QbGF5aW5nU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlltKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRTa2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFtKGguUHJvdG9BZENsaWNrVHlwZUVudW0uQWRTa2lwQ2xpY2spLCB0aGlzLkdtKCksIHQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkU3RvcHBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HbSgpLCB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZENsaWNrVGhydToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xbShoLlByb3RvQWRDbGlja1R5cGVFbnVtLkFkQ2xpY2tUaHJvdWdoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SbSAmJiB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgUHQuYltpXSwgZSksIHRoaXMuUm0gPSAhMCwgdCAmJiAodGhpcy5IciA9ICExLCB0aGlzLkhtLmNoYW5nZVN0YXRlKHkuUGF1c2VkU3RhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuVm9sdW1lXSwgdGhpcy5IbSwgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWb2x1bWUodCksIHRoaXMucW0oaC5Qcm90b0FkQ2xpY2tUeXBlRW51bS5Wb2x1bWVDbGljayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5QbGF5XSwgdGhpcy5IbSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xbShoLlByb3RvQWRDbGlja1R5cGVFbnVtLlBsYXlDbGljayksIHRoaXMucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuUGF1c2VdLCB0aGlzLkhtLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFtKGguUHJvdG9BZENsaWNrVHlwZUVudW0uUGF1c2VDbGljayksIHRoaXMucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNsb3NlXSwgdGhpcy5IbSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5Vc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyBwbGF5YmFjazogITEgfSB9KSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkNsb3NlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5NdXRlXSwgdGhpcy5IbSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWb2x1bWUoMCksIHRoaXMucW0oaC5Qcm90b0FkQ2xpY2tUeXBlRW51bS5NdXRlQ2xpY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuVW5tdXRlXSwgdGhpcy5IbSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWb2x1bWUoMSksIHRoaXMucW0oaC5Qcm90b0FkQ2xpY2tUeXBlRW51bS5Vbm11dGVDbGljayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShVdC5EZXRhY2hlZEZyb21Eb20sIHRoaXMuVm0sICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBWdC5EZXRhY2hlZEZyb21Eb20pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5yZWxheShUdC5iLkltcHJlc3Npb25QcmljZSwgdGhpcy5WbSwgdGhpcywgdGhpcy5tZWRpYXRvciksIHRoaXMucmVsYXkoVHQuYi5JbXByZXNzaW9uUmV2ZW51ZSwgdGhpcy5WbSwgdGhpcywgdGhpcy5tZWRpYXRvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFltKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RbSgpLCB0aGlzLnVwZGF0ZUNvbnRpbnVlUmVhZGluZ0NhcmQoKSwgdC5wYXlsb2FkLmFkRHVyYXRpb24gPSB0aGlzLlZtLmdldEFkRHVyYXRpb24oKSwgdC5wYXlsb2FkLmFkRHVyYXRpb24gfHwgdGhpcy5maXJzdEFkU2hvd24gfHwgdGhpcy5zaG93KCksIHRoaXMuZmlyc3RBZFNob3duID0gITAsIHRoaXMuSHIgPSAhMCwgdGhpcy5CbSAmJiB0aGlzLk5tKCksIHRoaXMuSG0udXBkYXRlRHVyYXRpb24odC5wYXlsb2FkLmFkRHVyYXRpb24pLCB0aGlzLkhtLmNoYW5nZVN0YXRlKHkuUGxheWluZ1N0YXRlKSwgdGhpcy5LbSA9IHQucGF5bG9hZC5jbGlja1Rocm91Z2hVcmwsIHRoaXMuV20odC5wYXlsb2FkLnNlbGVjdGVkQWRTbG90KSwgdGhpcy5QbS5nZXRUb3RhbE51bWJlck9mU2xvdHMoKSA+IDEgPyB0aGlzLkhtLmFkZFBvZEFkTWFya2VyKHRoaXMuUG0uZ2V0Q3VycmVudFNsb3RJbmRleCgpLCB0aGlzLlBtLmdldFRvdGFsTnVtYmVyT2ZTbG90cygpKSA6IHRoaXMuSG0ucmVtb3ZlQWRkUG9kQWRNYXJrZXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWm0odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNtLmFwcGVuZENoaWxkKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0Zyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTW0uc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLmNyZWF0ZUVsZW1lbnRCeVN0cmluZyhgPGRpdiBjbGFzcz0gImNueC1hZC1jb250YWluZXIgY254LWZ1bGwtaGVpZ2h0ICR7IHQgfSI+PC9kaXY+YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlnKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtID0gdGhpcy50ZygpLCB0aGlzLlptKHRoaXMuJG0pLCB0aGlzLkVtLnB1c2godGhpcy4kbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVnKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gKGUgPSB0aGlzLmpyLCBzID0gdGhpcy5NbS5jb25maWcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29Vcmw6IGUubG9nb1VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBzLmlzTW9iaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VCdXR0b25Nb2RlOiBlLmNsb3NlQnV0dG9uTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0aW5nQ2xvc2VCdXR0b25Nb2RlOiBlLmZsb2F0aW5nU2V0dGluZ3MuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nsb3NlQnV0dG9uOiBlLmlzQ2xvc2VCdXR0b24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudHNWaXNpYmlsaXR5OiBlLnVpQ29tcG9uZW50c1Zpc2liaWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nRGVzdGluYXRpb25zOiBlLnNoYXJpbmdEZXN0aW5hdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhtID0gbmV3IHVuKHRoaXMsIHRoaXMuTW0uc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLCB0aGlzLk1tLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZSwgdGhpcy5NbS5zZXJ2aWNlcy5JbnRlcmFjdGlvblNlcnZpY2UsIHRoaXMuQ20sIG5ldyBmbih0KS50ZW1wbGF0ZSwgaSksIHRoaXMuSG0uaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCh0LCBpLCBlLCBzID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWcocyksIHRoaXMuaWcoKSwgdGhpcy5VbSh0LCBpLCBlKSwgdGhpcy5zZXRWb2x1bWUoZSksIHRoaXMuWG0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2FkaGFuZGxlcl9zdGFydCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuTG07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULkkpKHRoaXMuQ20sIGQuZy5BZCwgZC5nLkFkT3ZlcmxheVR5cGUpLCB0aGlzLkhtLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IFtkLmcuQWRdLCBpID0gdGhpcy5WbS5nZXRDdXJyZW50QWRUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPT09IGguUHJvdG9BZFR5cGUuT3ZlcmxheSAmJiB0LnB1c2goZC5nLkFkT3ZlcmxheVR5cGUpLCB0aGlzLnNnID0gaSwgT2JqZWN0KFQuYSkodGhpcy5DbSwgLi4udCksIHRoaXMuSG0uc2hvdygpLCB0aGlzLkhtLnVwZGF0ZVZvbHVtZSh0aGlzLkxtKSwgdGhpcy5KbSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZENvbnRhaW5lcldpZHRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5WbS5nZXRBZENvbnRhaW5lcldpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTG0gPSB0LCB0aGlzLlZtLnNldEFkVm9sdW1lKHQpLCB0aGlzLkhtICYmIHRoaXMuSG0udXBkYXRlVm9sdW1lKHQpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgeyBwYXlsb2FkOiB7IHZvbHVtZTogITAgfSB9KSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIHsgcGF5bG9hZDogeyB2b2x1bWU6IHQgfSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhc3RWaWV3TW9kZShlKSwgdGhpcy51cGRhdGVDb250aW51ZVJlYWRpbmdDYXJkKCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBWdC5BZFNsb3RSZXNpemVkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZFN0YXRlQ2hhbmdlKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WbS5vbkFkU3RhdGVDaGFuZ2UodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGFuZ2VkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtLm9uQ29udGVudENoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaW5JbXByZXNzaW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5IcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFkSW5XaW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZtLmFkSW5XaW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpbkFkUG9kTG9hZGluZ1N0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EbTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lV2l0aG91dFVzZXJJbnRlcmFjdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WbS5yZXN1bWVBZCghMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBsYXkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm0ucmVzdW1lQWQoITApLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgeyBwYXlsb2FkOiB7IHBsYXliYWNrOiAhMCB9IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QocG4uYikoJ2NueFNob3dBZENhcmQnLCB0aGlzLk1tLmNvbmZpZy5wYWdlVXJsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuYWRUeXBlID09PSBoLlByb3RvQWRUeXBlLlZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5DbS5jbGllbnRXaWR0aCAqICh0LmhlaWdodFJhdGlvIC8gdC53aWR0aFJhdGlvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLkNtLmNsaWVudEhlaWdodCAtIGUgPj0gYm4gKyB2bjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZFR5cGUgPT09IGguUHJvdG9BZFR5cGUuT3ZlcmxheSAmJiAoaSA9IHRoaXMuQ20uY2xpZW50SGVpZ2h0IC0gdC5oZWlnaHQgPj0gYm4gKyB2biksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRpbnVlUmVhZGluZ0NhcmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLlZtLmdldEFkTWVkaWFTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5hKSh0KSAmJiAodGhpcy5uZyh0aGlzLlZtLmdldEFkTWVkaWFTaXplKCkpID8gdGhpcy5IbS5zaG93Q29udGludWVSZWFkaW5nQ2FyZCh0aGlzLiRtKSA6IHRoaXMuSG0uaGlkZUNvbnRpbnVlUmVhZGluZ0NhcmQodGhpcy4kbSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRDb250aW51ZVJlYWRpbmdDYXJkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IbS5zZXRDb250aW51ZVJlYWRpbmdDYXJkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlU3JjOiBOaS5nZXRTbWFydENyb3BwZWRJbWFnZVVybCh0LmltYWdlU3JjLCBnbiwgbW4sIHRoaXMuWmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQudGl0bGUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhdXNlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtLnBhdXNlQWQoITApLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgeyBwYXlsb2FkOiB7IHBsYXliYWNrOiAhMSB9IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFB0LmIuQWRTdG9wcGVkKSwgdGhpcy5SbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtICYmIHRoaXMuaW5JbXByZXNzaW9uID8gKGkoKSwgdGhpcy5WbS5zdG9wQWQodCkpIDogdGhpcy5pbkFkUG9kTG9hZGluZ1N0YXRlICYmIGkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtICYmIHRoaXMuaW5JbXByZXNzaW9uID8gdGhpcy5WbS5za2lwQWQoKSA6IHRoaXMuRG0gJiYgKHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBQdC5iLkFkU2tpcHBlZCksIHRoaXMuSm0oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVzZXJJbnRlcmFjdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm0udXNlckludGVyYWN0aW9uKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmFibGVBZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm0uZW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudGVyQWRQb2RMb2FkaW5nU3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRG0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuVm0uZ2V0TGFzdEFkU2xvdCh0aGlzLnNnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IbS5zaG93QWRMb2FkaW5nU2NyZWVuKE5pLmdldFNtYXJ0Q3JvcHBlZEltYWdlVXJsKHRoaXMucmcsIHQsIGksIHRoaXMuWmQpLCB0aGlzLkttLCB0aGlzLlBtLmdldE5leHRTbG90SW5kZXgoKSwgdGhpcy5QbS5nZXRUb3RhbE51bWJlck9mU2xvdHMoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkTG9hZGluZ0JhY2tncm91bmRVcmwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJnID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlUG9kUmVtYWluaW5nVGltZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm0udXBkYXRlUG9kUmVtYWluaW5nVGltZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV3QWRPcHBvcnR1bml0eSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WbS5uZXdBZE9wcG9ydHVuaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGVBZHModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZtLmRpc2FibGVBZHModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZhc3RWaWV3TW9kZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRm0gPSB0LCB0aGlzLlZtLnNldFZhc3RWaWV3TW9kZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09ICh0ID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSB0IHx8IHQuZGlzYWJsZUFkcyhnaS5Vbmtub3duKSwgbnVsbCA9PT0gKGkgPSB0aGlzLkhtKSB8fCB2b2lkIDAgPT09IGkgfHwgaS5kZXN0cm95KCksIG51bGwgPT09IChlID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSBlIHx8IGUuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB3biwgT24gPSBlKDI4KTsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQXBwTmV4dXMgPSAnYXBwbmV4dXMnLCB0LkRpc3RyaWN0TSA9ICdkaXN0cmljdG0nLCB0LkluZGV4RXhjaGFuZ2UgPSAnaXgnLCB0LkxrcWQgPSAnbGtxZCcsIHQuT25lVmlkZW8gPSAnb25lVmlkZW8nLCB0Lk9wZW5YID0gJ29wZW54JywgdC5QdWJtYXRpYyA9ICdwdWJtYXRpYycsIHQuUmh5dGhtT25lID0gJ3JoeXRobW9uZScsIHQuUnViaWNvbiA9ICdydWJpY29uJywgdC5TcG90WCA9ICdzcG90eCcsIHQuVGVsYXJpYSA9ICd0ZWxhcmlhJywgdC5NZWRpYU5ldCA9ICdtZWRpYW5ldCcsIHQuQWRtYW4gPSAnYWRtYW4nLCB0Lklyb25Tb3VyY2UgPSAnaXJvbnNvdXJjZScsIHQuVW5kZXJ0b25lID0gJ3VuZGVydG9uZScsIHQuU3luYWNvck1lZGlhID0gJ3N5bmFjb3JtZWRpYScsIHQuQW14UlRCID0gJ2FteCcsIHQuU21hYXRvID0gJ3NtYWF0bycsIHQuU21hcnRBZFNlcnZlciA9ICdzbWFydGFkc2VydmVyJzsKICAgICAgICAgICAgICAgIH0od24gfHwgKHduID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IHhuID0gewogICAgICAgICAgICAgICAgICAgICAgICBbd24uTGtxZF06IE9uLmMuTGtxZCwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLlJoeXRobU9uZV06IE9uLmMuUmh5dGhtT25lLAogICAgICAgICAgICAgICAgICAgICAgICBbd24uVGVsYXJpYV06IE9uLmMuVGVsYXJpYSwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLklyb25Tb3VyY2VdOiBPbi5jLklyb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5VbmRlcnRvbmVdOiBPbi5jLlVuZGVydG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLlN5bmFjb3JNZWRpYV06IE9uLmMuU3luYWNvck1lZGlhCiAgICAgICAgICAgICAgICAgICAgfSwgU24gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHduLkFwcE5leHVzLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5EaXN0cmljdE0sCiAgICAgICAgICAgICAgICAgICAgICAgIHduLkluZGV4RXhjaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLk9uZVZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5PcGVuWCwKICAgICAgICAgICAgICAgICAgICAgICAgd24uUHVibWF0aWMsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlJoeXRobU9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgd24uUnViaWNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgd24uU3BvdFgsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlRlbGFyaWEsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLk1lZGlhTmV0LAogICAgICAgICAgICAgICAgICAgICAgICB3bi5BZG1hbiwKICAgICAgICAgICAgICAgICAgICAgICAgd24uSXJvblNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgd24uVW5kZXJ0b25lLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5BbXhSVEIsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlNtYWF0bywKICAgICAgICAgICAgICAgICAgICAgICAgd24uU21hcnRBZFNlcnZlcgogICAgICAgICAgICAgICAgICAgIF0sIGpuID0gWwogICAgICAgICAgICAgICAgICAgICAgICB3bi5BcHBOZXh1cywKICAgICAgICAgICAgICAgICAgICAgICAgd24uRGlzdHJpY3RNLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5JbmRleEV4Y2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5PbmVWaWRlbywKICAgICAgICAgICAgICAgICAgICAgICAgd24uT3BlblgsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlB1Ym1hdGljLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5SaHl0aG1PbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlJ1Ymljb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlNwb3RYLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5UZWxhcmlhLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5NZWRpYU5ldCwKICAgICAgICAgICAgICAgICAgICAgICAgd24uQWRtYW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHduLkFteFJUQiwKICAgICAgICAgICAgICAgICAgICAgICAgd24uU21hYXRvLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5TbWFydEFkU2VydmVyCiAgICAgICAgICAgICAgICAgICAgXSwga24gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHduLk9uZVZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5JbmRleEV4Y2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5SdWJpY29uLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5QdWJtYXRpYywKICAgICAgICAgICAgICAgICAgICAgICAgd24uU3BvdFgsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLkFwcE5leHVzLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5EaXN0cmljdE0sCiAgICAgICAgICAgICAgICAgICAgICAgIHduLk9wZW5YLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5NZWRpYU5ldCwKICAgICAgICAgICAgICAgICAgICAgICAgd24uQWRtYW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHduLklyb25Tb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlVuZGVydG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgd24uU3luYWNvck1lZGlhLAogICAgICAgICAgICAgICAgICAgICAgICB3bi5BbXhSVEIsCiAgICAgICAgICAgICAgICAgICAgICAgIHduLlNtYWF0bywKICAgICAgICAgICAgICAgICAgICAgICAgd24uU21hcnRBZFNlcnZlcgogICAgICAgICAgICAgICAgICAgIF0sIF9uID0gJ2h0dHBzOi8vcHJlYmlkLmFkbnhzLmNvbS9wYmMvdjEvY2FjaGUnLCBBbiA9IDE4MCwgSW4gPSAnLy9jZHMuY29ubmF0aXguY29tL3AvcGx1Z2lucy9wcmViaWQ0LjQzLjAtMS5qcycsIENuID0gWwogICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8vbXA0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvL3dlYm0nLAogICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlby9vZ2cnLAogICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8vbXBlZycKICAgICAgICAgICAgICAgICAgICBdLCBUbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgVkFTVF8xOiAxLAogICAgICAgICAgICAgICAgICAgICAgICBWQVNUXzI6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIFZBU1RfMzogMywKICAgICAgICAgICAgICAgICAgICAgICAgVkFTVF8xX1dSQVBQRVI6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgIFZBU1RfMl9XUkFQUEVSOiA1LAogICAgICAgICAgICAgICAgICAgICAgICBWQVNUXzNfV1JBUFBFUjogNiwKICAgICAgICAgICAgICAgICAgICAgICAgVkFTVF80OiA3LAogICAgICAgICAgICAgICAgICAgICAgICBWQVNUXzRfV1JBUFBFUjogOAogICAgICAgICAgICAgICAgICAgIH0sIFBuID0gMSwgTW4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZQQUlEXzE6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFZQQUlEXzI6IDIKICAgICAgICAgICAgICAgICAgICB9LCBFbiA9IDIsIExuID0gNDE7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSbih0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0ICsgTG4pICogRW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCbih0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgLyBFbiAtIExuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgRG4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhnID0gRGF0ZS5ub3coKSwgdGhpcy5hZyA9IHsgYWR2ZXJ0aXNlcjoge30gfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkUHJlYmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKHRoaXMuYWcuYWR2ZXJ0aXNlclt0XSkgfHwgdGhpcy5vZyh0KSwgdGhpcy5hZy5hZHZlcnRpc2VyW3RdLnByZWJpZERhdGEucHVzaCh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWRkQmlkKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKHRoaXMuYWcuYWR2ZXJ0aXNlclt0XSkgfHwgdGhpcy5vZyh0KSwgdGhpcy5hZy5hZHZlcnRpc2VyW3RdLmJpZHNGbG9vclByaWNlTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUHJpY2U6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZEltcHJlc3Npb24odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYSkodGhpcy5hZy5hZHZlcnRpc2VyW3RdKSB8fCB0aGlzLm9nKHQpLCB0aGlzLmFnLmFkdmVydGlzZXJbdF0uaW1wcmVzc2lvblJldmVudWVMaXN0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZFByaWNlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG91bGRSZXF1ZXN0TGluZUl0ZW0odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodGhpcy5jZyhpLCAzKSAmJiB0aGlzLnVnKHQsIGksIDUpIDwgLTAuNSAmJiB0aGlzLmRnKHQsIGksIDMpID49IDExLjUgJiYgdGhpcy5mZyh0LCBpLCAxMCwgMC4xKSA8IDAuMzUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjZyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IC0gdGhpcy5oZyA+PSBpICogcXQuZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWcodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5hZy5hZHZlcnRpc2VyW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChydC5hKShzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMucGcocy5pbXByZXNzaW9uUmV2ZW51ZUxpc3QsIGksIGUpLm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm9iZnVzY2F0ZWRQcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmgpKG4pICYmIChyID0gbi5yZWR1Y2UoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICsgUm4oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5iZyhyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGcodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5hZy5hZHZlcnRpc2VyW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdChydC5hKShzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMucGcocy5wcmViaWREYXRhLCBpLCBlKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJnKG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZyh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmFnLmFkdmVydGlzZXJbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KHJ0LmEpKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5wZyhuLmltcHJlc3Npb25SZXZlbnVlTGlzdCwgaSwgZSkubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaCA9IHRoaXMudmcociwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJnKGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwZyh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpIC0gcXQuZiwgbiA9IGkgLSBlICogcXQuZSwgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdC5sZW5ndGggLSAxOyBpID49IDAgJiYgdFtpXS50aW1lc3RhbXAgPj0gbjsgaS0tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtpXS50aW1lc3RhbXAgPD0gcyAmJiByLnB1c2godFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBiZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSB0ID8gLTEgOiB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWcuYWR2ZXJ0aXNlclt0XSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZERhdGE6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkc0Zsb29yUHJpY2VMaXN0OiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25SZXZlbnVlTGlzdDogW10KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmcodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gdC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPD0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbdC5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9ICgodCA9IHQuc29ydCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IC0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5sZW5ndGggLSAxKSAqIGksIHMgPSBNYXRoLmZsb29yKGUpLCBuID0gcyArIDEsIHIgPSBlICUgMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPj0gdC5sZW5ndGggPyB0W3NdIDogdFtzXSAqICgxIC0gcikgKyB0W25dICogcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBGbiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWcgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZFBsYXRmb3JtQ2FwcGVkTGluZUl0ZW1JZExpc3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuaCkodCkgJiYgdGhpcy5tZy5hZGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0xpbmVJdGVtUGxhdGZvcm1DYXBwZWQoewogICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyTGluZUl0ZW1JZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTGluZUl0ZW1JZDogaQogICAgICAgICAgICAgICAgICAgIH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWcuaGFzKHQpIHx8IHRoaXMubWcuaGFzKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFZuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZyA9IG5ldyBqaSgpLCB0aGlzLnlnID0gbmV3IGppKCksIHRoaXMud2cgPSBuZXcgamkoKSwgdGhpcy5PZyA9IG5ldyBqaSgpLCB0aGlzLnhnID0gbmV3IGppKCksIHRoaXMuU2cgPSBuZXcgamkoKSwgdGhpcy5jYWxsaW5nTGluZUl0ZW1zID0gW10sIHRoaXMuYmlkcyA9IFtdLCB0aGlzLmJpZHNMb2FkaW5nID0gW10sIHRoaXMuYmlkc1JlYWR5ID0gW10sIHRoaXMuYmlkU3RhcnRlZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkJpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2cuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkJpZENvbnN1bWVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55Zy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uQmlkTG9hZGluZ0NvbnN1bWVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53Zy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uQmlkUmVhZHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk9nLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25CaWRTdGFydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54Zy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uQmlkUmVhZHlDb25zdW1lZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuU2cuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFsbEJpZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmJpZFN0YXJ0ZWQgPyBbdGhpcy5iaWRTdGFydGVkXSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5nZXRBbGxCaWRzRXhjZXB0U3RhcnRlZEJpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBbGxCaWRzRXhjZXB0U3RhcnRlZEJpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuYmlkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuYmlkc0xvYWRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmJpZHNSZWFkeQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRCaWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpZHMucHVzaCh0KSwgdGhpcy5nZy5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtb3ZlQmlkVG9Mb2FkaW5nKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRzTG9hZGluZy5wdXNoKHQpLCB0aGlzLmNvbnN1bWVCaWQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1vdmVCaWRUb1JlYWR5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRzUmVhZHkucHVzaCh0KSwgdGhpcy5jb25zdW1lQmlkTG9hZGluZyh0KSwgdGhpcy5PZy5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtb3ZlQmlkVG9TdGFydGVkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRTdGFydGVkID0gdCwgdGhpcy5jb25zdW1lQmlkUmVhZHkodCksIHRoaXMueGcubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUJpZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChsLmspKHRoaXMuYmlkcywgdCksIHRoaXMueWcubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3VtZUJpZExvYWRpbmcodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5rKSh0aGlzLmJpZHNMb2FkaW5nLCB0KSwgdGhpcy53Zy5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb25zdW1lQmlkUmVhZHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5rKSh0aGlzLmJpZHNSZWFkeSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN1bWVCaWRTdGFydGVkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRTdGFydGVkID0gbnVsbCwgdGhpcy5TZy5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFVuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGl2ZVZpZXcgPSBbXSwgdGhpcy5zdGFydCA9IFtdLCB0aGlzLmZpcnN0UXVhcnRpbGUgPSBbXSwgdGhpcy5taWRwb2ludCA9IFtdLCB0aGlzLnRoaXJkUXVhcnRpbGUgPSBbXSwgdGhpcy5pbXByZXNzaW9uID0gW10sIHRoaXMuY29tcGxldGUgPSBbXSwgdGhpcy5tdXRlID0gW10sIHRoaXMudW5tdXRlID0gW10sIHRoaXMucGF1c2UgPSBbXSwgdGhpcy5yZXdpbmQgPSBbXSwgdGhpcy5yZXN1bWUgPSBbXSwgdGhpcy5mdWxsc2NyZWVuID0gW10sIHRoaXMuZXhpdEZ1bGxzY3JlZW4gPSBbXSwgdGhpcy5leHBhbmQgPSBbXSwgdGhpcy5jb2xsYXBzZSA9IFtdLCB0aGlzLmNsb3NlID0gW10sIHRoaXMuY2xvc2VMaW5lYXIgPSBbXSwgdGhpcy5hY2NlcHRJbnZpdGF0aW9uTGluZWFyID0gW10sIHRoaXMuYWNjZXB0SW52aXRhdGlvbiA9IFtdLCB0aGlzLnNraXAgPSBbXSwgdGhpcy5wcm9ncmVzcyA9IFtdLCB0aGlzLnBsYXllckV4cGFuZCA9IFtdLCB0aGlzLnBsYXllckNvbGxhcHNlID0gW10sIHRoaXMuYWRFeHBhbmQgPSBbXSwgdGhpcy5hZENvbGxhcHNlID0gW10sIHRoaXMuZnVsbFNjcmVlbiA9IFtdLCB0aGlzLmNhblBsYXlUaHJvdWdoID0gW10sIHRoaXMuc3RhbGxlZCA9IFtdLCB0aGlzLndhaXRpbmcgPSBbXSwgdGhpcy5vdGhlckFkSW50ZXJhY3Rpb24gPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyAkbiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWNrVHJhY2tpbmdzID0gW10sIHRoaXMuY3VzdG9tQ2xpY2tzID0gW10sIHRoaXMuZXJyb3JVcmxzID0gW10sIHRoaXMuaW1wcmVzc2lvbnMgPSBbXSwgdGhpcy50cmFja2luZ0V2ZW50cyA9IG5ldyBVbigpLCB0LmluTGluZSA/IHRoaXMuamcodC5pbkxpbmUpIDogdGhpcy5rZyh0LndyYXBwZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2codC5lcnJvcnMpLCB0aGlzLkFnKHQuaW1wcmVzc2lvbnMpLCB0aGlzLklnKHQuY3JlYXRpdmVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga2codCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nKHQuZXJyb3JzKSwgdGhpcy5BZyh0LmltcHJlc3Npb25zKSwgdGhpcy5JZyh0LmNyZWF0aXZlcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENnKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UZyh0LnRyYWNraW5nRXZlbnRzKSwgdGhpcy5QZyh0LnZpZGVvQ2xpY2tzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUGcodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh0aGlzLk1nKHQuY2xpY2tUcmFja2luZ3MpLCB0aGlzLkVnKHQuY3VzdG9tQ2xpY2tzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE1nKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1RyYWNraW5ncy5wdXNoKC4uLnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2xpY2tzLnB1c2goLi4udCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRnKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYWNraW5nRXZlbnRzW3QubmFtZV0ucHVzaCh0LnVyaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX1Zhc3RSZXNwb25zZV90cmFja2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgJHsgdC5uYW1lIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGkuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBJZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGluZWFyICYmIHRoaXMuQ2codC5saW5lYXIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2codCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yVXJscy5wdXNoKC4uLnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBBZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW1wcmVzc2lvbnMucHVzaCguLi50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBObiA9IHsKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b1RyYWNrZXJUcmlnZ2VyVHlwZS5JbXByZXNzaW9uXTogJ2FkSW1wcmVzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUuQ29tcGxldGUyNVBjXTogJ2FkUXVhcnRpbGVGaXJzdCcsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUuQ29tcGxldGU1MFBjXTogJ2FkUXVhcnRpbGVTZWNvbmQnLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvVHJhY2tlclRyaWdnZXJUeXBlLkNvbXBsZXRlNzVQY106ICdhZFF1YXJ0aWxlVGhpcmQnLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvVHJhY2tlclRyaWdnZXJUeXBlLlZpZXdDb21wbGV0aW9uXTogJ2FkUXVhcnRpbGVGb3VydGgnLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvVHJhY2tlclRyaWdnZXJUeXBlLlZpZGVvQ2xpY2tdOiAnYWRDbGljaycsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUuUGF1c2VdOiAnYWRQYXVzZScsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUuUmVzdW1lXTogJ2FkUmVzdW1lJywKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b1RyYWNrZXJUcmlnZ2VyVHlwZS5NdXRlXTogJ2FkTXV0ZScsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9UcmFja2VyVHJpZ2dlclR5cGUuVW5tdXRlXTogJ2FkVW5tdXRlJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEhuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEVycm9yID0gW10sIHRoaXMuYWRXaW4gPSBbXSwgdGhpcy5hZEltcHJlc3Npb24gPSBbXSwgdGhpcy5hZFN0YXJ0ZWQgPSBbXSwgdGhpcy5hZFZpZGVvU3RhcnQgPSBbXSwgdGhpcy5hZFF1YXJ0aWxlRmlyc3QgPSBbXSwgdGhpcy5hZFF1YXJ0aWxlU2Vjb25kID0gW10sIHRoaXMuYWRRdWFydGlsZVRoaXJkID0gW10sIHRoaXMuYWRRdWFydGlsZUZvdXJ0aCA9IFtdLCB0aGlzLmFkQ2xpY2sgPSBbXSwgdGhpcy5hZFBhdXNlID0gW10sIHRoaXMuYWRSZXN1bWUgPSBbXSwgdGhpcy5hZFNraXAgPSBbXSwgdGhpcy5hZE11dGUgPSBbXSwgdGhpcy5hZFVubXV0ZSA9IFtdLCB0aGlzLmFkVXNlckNsb3NlID0gW10sIHRoaXMuYWRVc2VyQWNjZXB0SW52aXRhdGlvbiA9IFtdLCB0aGlzLmFkVXNlck1pbmltaXplID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyB0cmFjayh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHMuYWRDb250YWluZXJTdGF0ZS5nZXQoZS5hZFR5cGUpLCB7YWRCcmVha1R5cGU6IGF9ID0gcy5hZEJyZWFrU3RhdGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYURlc2NyaXB0aW9uOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRHVyYXRpb246IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZDogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVVybDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpdGxlOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gcy5tZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQudXJsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpLnJlcGxhY2UodC51cmwsIGUudmVuZG9ySWQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFjcm9zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRXaWR0aDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEhlaWdodDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFBvc3Rpb246IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU1hY3JvczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhRGVzY3JpcHRpb246IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEdXJhdGlvbjogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVXJsOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGl0bGU6IGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b1RyYWNrZXJUeXBlLkltYWdlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KExpLmwpKFtzXSwgd2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9UcmFja2VyVHlwZS5KYXZhc2NyaXB0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQueCkoeyBzcmM6IHMgfSwgd2luZG93LmRvY3VtZW50LmhlYWQsIHdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpW05uW3RdXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC50cmlnZ2VyLCBpKS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LnVybAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gem4odCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGguUHJvdG9UcmFja2VyVHlwZS5JbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFduKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6bih0KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBHbjsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5IYW5kbGluZ1Nka1VybCA9IDBdID0gJ0hhbmRsaW5nU2RrVXJsJywgdFt0Lk5ldHdvcmtSZXF1ZXN0VXJsID0gMV0gPSAnTmV0d29ya1JlcXVlc3RVcmwnLCB0W3QuWG1sSW52YWxpZFN0cmluZyA9IDJdID0gJ1htbEludmFsaWRTdHJpbmcnLCB0W3QuWG1sUGFyc2VHZW5lcmFsID0gM10gPSAnWG1sUGFyc2VHZW5lcmFsJywgdFt0LlhtbEludmFsaWRUcmVlID0gNF0gPSAnWG1sSW52YWxpZFRyZWUnLCB0W3QuWG1sSW52YWxpZEFkID0gNV0gPSAnWG1sSW52YWxpZEFkJywgdFt0LlhtbEFkYXB0b3JXcmFwcGVyTGltaXQgPSA2XSA9ICdYbWxBZGFwdG9yV3JhcHBlckxpbWl0JywgdFt0LkhUTUxVbmtub3duTWltZVR5cGUgPSA3XSA9ICdIVE1MVW5rbm93bk1pbWVUeXBlJywgdFt0LkltYUFkc01hbmFnZXJJbml0ID0gOF0gPSAnSW1hQWRzTWFuYWdlckluaXQnLCB0W3QuSW1hVmFzdEVtcHR5UmVzcG9uc2UgPSA5XSA9ICdJbWFWYXN0RW1wdHlSZXNwb25zZScsIHRbdC5JbWFSZXF1ZXN0RXhjZXB0aW9uID0gMTBdID0gJ0ltYVJlcXVlc3RFeGNlcHRpb24nLCB0W3QuSW1hVGltZW91dCA9IDExXSA9ICdJbWFUaW1lb3V0JywgdFt0LkltYUludmFsaWRSZXNwb25zZSA9IDEyXSA9ICdJbWFJbnZhbGlkUmVzcG9uc2UnOwogICAgICAgICAgICAgICAgfShHbiB8fCAoR24gPSB7fSkpOwogICAgICAgICAgICAgICAgY29uc3QgSm4gPSB7CiAgICAgICAgICAgICAgICAgICAgW0duLkhhbmRsaW5nU2RrVXJsXTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc1JlcXVlc3RFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgW0duLk5ldHdvcmtSZXF1ZXN0VXJsXTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc1JlcXVlc3RFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgW0duLlhtbEludmFsaWRTdHJpbmddOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkNzRW1wdHlSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBbR24uWG1sUGFyc2VHZW5lcmFsXTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc0ludmFsaWRSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBbR24uWG1sSW52YWxpZFRyZWVdOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkNzSW52YWxpZFJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgIFtHbi5YbWxJbnZhbGlkQWRdOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkNzSW52YWxpZFJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgIFtHbi5YbWxBZGFwdG9yV3JhcHBlckxpbWl0XTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc0ludmFsaWRSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBbR24uSFRNTFVua25vd25NaW1lVHlwZV06IGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uQ3NJbnZhbGlkUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgW0duLkltYUFkc01hbmFnZXJJbml0XTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc1JlcXVlc3RFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgW0duLkltYVZhc3RFbXB0eVJlc3BvbnNlXTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Dc0ludmFsaWRSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICBbR24uSW1hUmVxdWVzdEV4Y2VwdGlvbl06IGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uQ3NSZXF1ZXN0RXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgIFtHbi5JbWFUaW1lb3V0XTogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5UaW1lb3V0LAogICAgICAgICAgICAgICAgICAgIFtHbi5JbWFJbnZhbGlkUmVzcG9uc2VdOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkNzSW52YWxpZFJlc3BvbnNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIFFuLCBYbiwgWW4gPSBlKDkpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5WT0xVTUVfREVURUNURUQgPSAndm9sdW1lX2RldGVjdGVkJywgdC5NQUxXQVJFX0RFVEVDVEVEID0gJ21hbHdhcmVfZGV0ZWN0ZWQnLCB0LkJBRFVSSV9ERVRFQ1RFRCA9ICdiYWR1cmlfZGV0ZWN0ZWQnOwogICAgICAgICAgICAgICAgfShRbiB8fCAoUW4gPSB7fSkpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Ob25lID0gMF0gPSAnTm9uZScsIHRbdC5NdXRlID0gMV0gPSAnTXV0ZScsIHRbdC5TY3JvbGxIaWphY2sgPSAyXSA9ICdTY3JvbGxIaWphY2snLCB0W3QuTWVtb3J5TGVhayA9IDRdID0gJ01lbW9yeUxlYWsnLCB0W3QuTWFsd2FyZSA9IDhdID0gJ01hbHdhcmUnLCB0W3QuQWxsID0gMTVdID0gJ0FsbCc7CiAgICAgICAgICAgICAgICB9KFhuIHx8IChYbiA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCBLbiA9ICcyLjAnOwogICAgICAgICAgICAgICAgY2xhc3MgWm4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnID0gbmV3IGppKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvblZwYWlkRXZlbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJnLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VWZXJzaW9uKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gS247CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzIuMCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHRyLCBpcjsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5XaW4gPSAwXSA9ICdXaW4nLCB0W3QuQWRMb2FkZWQgPSAxXSA9ICdBZExvYWRlZCcsIHRbdC5BZFN0YXJ0ZWQgPSAyXSA9ICdBZFN0YXJ0ZWQnLCB0W3QuQWRJbXByZXNzaW9uID0gM10gPSAnQWRJbXByZXNzaW9uJzsKICAgICAgICAgICAgICAgIH0odHIgfHwgKHRyID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIGVyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQmcgPSB0LCB0aGlzLkRnID0gbmV3IE1hcCgpLCBPYmplY3QocnQuYSkodGhpcy5CZy5zZXR0aW5ncy5iaWRMaWZlY3ljbGUpIHx8ICh0aGlzLkJnLnNldHRpbmdzLmJpZExpZmVjeWNsZSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25UcmFja2luZ0xpZmVjeWNsZUV2ZW50KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLkRnLnNldCh0LCBEYXRlLm5vdygpKSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRyLkFkTG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdHIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WZygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZnKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJnLnNldHRpbmdzLmJpZExpZmVjeWNsZS53aW5Ub0FkTG9hZGVkVGltZSA9IHRoaXMuVWc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZnKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJnLnNldHRpbmdzLmJpZExpZmVjeWNsZS5zdGFydEFkVG9JbXByZXNzaW9uVGltZSA9IHRoaXMuJGc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCAkZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGcuZ2V0KHRyLkFkSW1wcmVzc2lvbikgJiYgdGhpcy5EZy5nZXQodHIuQWRTdGFydGVkKSA/IHRoaXMuRGcuZ2V0KHRyLkFkSW1wcmVzc2lvbikgLSB0aGlzLkRnLmdldCh0ci5BZFN0YXJ0ZWQpIDogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IFVnKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EZy5nZXQodHIuQWRMb2FkZWQpICYmIHRoaXMuRGcuZ2V0KHRyLldpbikgPyB0aGlzLkRnLmdldCh0ci5BZExvYWRlZCkgLSB0aGlzLkRnLmdldCh0ci5XaW4pIDogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzcih0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgdCAtICh0IC0gdCAlIDEwMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHQgLSB0ICUgMTAwCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5yKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiBzLAogICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogbgogICAgICAgICAgICAgICAgICAgIH0gPSB0OwogICAgICAgICAgICAgICAgICAgIGxldCByID0gMCA9PT0gZSA/IE1hdGgucmFuZG9tKCkgOiBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gMSwgMSAqIHMgKyBIdC5mICogbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJyKHQpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuY3JlYXRpdmVUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UYW06CiAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UYW1EZWFsOgogICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uUnRiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUm4odC5vYmZ1c2NhdGVkUHJpY2UpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uSGVhZGVyQmlkZGVyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jcG07CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmxvb3JQcmljZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LklNUFJFU1NJT05fVElNRU9VVCA9ICdJTVBSRVNTSU9OX1RJTUVPVVQnLCB0LlZJRVdBQkxFX0lNUFJFU1NJT05fVElNRU9VVCA9ICdWSUVXQUJMRV9JTVBSRVNTSU9OX1RJTUVPVVQnLCB0LlNLSVBfQURfVElNRU9VVCA9ICdTS0lQX0FEX1RJTUVPVVQnLCB0LlNUT1BfQURfVElNRU9VVCA9ICdTVE9QX0FEX1RJTUVPVVQnLCB0LkFEX0xPQURFRF9USU1FT1VUID0gJ0FEX0xPQURFRF9USU1FT1VUJzsKICAgICAgICAgICAgICAgIH0oaXIgfHwgKGlyID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IGhyID0gNTAwLCBhciA9ICdjbngtYWQtYmlkLXNsb3Qtc2VsZWN0ZWQnLCBvciA9ICdDb25uYXRpeCBBZCc7CiAgICAgICAgICAgICAgICBjbGFzcyBjciBleHRlbmRzIFpuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMuc2V0dGluZ3MgPSB0LCB0aGlzLk5nID0gbnVsbCwgdGhpcy5IZyA9IG51bGwsIHRoaXMucWcgPSBudWxsLCB0aGlzLnpnID0gbnVsbCwgdGhpcy5XZyA9IHZvaWQgMCwgdGhpcy5HZyA9ICExLCB0aGlzLkl1ID0gITEsIHRoaXMuSmcgPSAhMSwgdGhpcy5RZyA9ICExLCB0aGlzLlhnID0gbnVsbCwgdGhpcy5qbCA9IFtdLCB0aGlzLllnID0gbmV3IGppKCksIHRoaXMuS2cgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuVGltZW91dCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy50eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLml5ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leSgpLCB0aGlzLnN5KGlyLlZJRVdBQkxFX0lNUFJFU1NJT05fVElNRU9VVCkuY2xlYXJUaW1lb3V0KCksIHRoaXMuc2V0dGluZ3Mudmlld2FiaWxpdHlTZXJ2aWNlLm9mZih0aGlzLk5nLCB0aGlzLm55KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ueSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuc3koaXIuVklFV0FCTEVfSU1QUkVTU0lPTl9USU1FT1VUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyBpLnRpbWVvdXRIYW5kbGUudGltZW91dElkIHx8IGkuc2V0VGltZW91dCgpIDogaS5jbGVhclRpbWVvdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5oeSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoeyB0eXBlOiBQdC5iLkFkU2tpcHBlZCB9KSwgdGhpcy50eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmF5ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZFN0b3BwZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaG91bGRUcmFja1Bvc3RCaWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMub3kgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuVGltZW91dExvYWRlZCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy50eSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnN5ID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy51eVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0OiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudGltZW91dElkID0gbWkuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkudGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQ6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gaS50aW1lb3V0SWQgJiYgKG1pLmNsZWFyVGltZW91dChpLnRpbWVvdXRJZCksIGkudGltZW91dElkID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5jcmVhdGl2ZUlkID0gdGhpcy5zZXR0aW5ncy5leHRlcm5hbENyZWF0aXZlSWQsIHRoaXMubHkgPSBgY254LWFkLWJpZC1zbG90LWlkLSR7IHRoaXMuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEuY254QmlkSWQgfWAsIHRoaXMucHkgPSBgY254LWFkLXNsb3QtJHsgdGhpcy5zZXR0aW5ncy5pZCB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2FkVHlwZTogaX0gPSB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXIuSU1QUkVTU0lPTl9USU1FT1VUXTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLktnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDI1MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRJZDogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpci5WSUVXQUJMRV9JTVBSRVNTSU9OX1RJTUVPVVRdOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuaXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogaSA9PT0gTS5Qcm90b0FkVHlwZS5WaWRlbyA/IEh0LmIgOiBIdC5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRJZDogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpci5TS0lQX0FEX1RJTUVPVVRdOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuaHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRJZDogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpci5TVE9QX0FEX1RJTUVPVVRdOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMuYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogNTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRJZDogbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpci5BRF9MT0FERURfVElNRU9VVF06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdGhpcy5veSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAyNTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SWQ6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5aZCA9IHQudXJsU3VmZml4ZXJTZXJ2aWNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRQcmljZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZVR5cGU6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1Qcmlvcml0eTogcwogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1JZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElkOiB0aGlzLnNldHRpbmdzLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVUeXBlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdGhpcy5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdGhpcy5zZXR0aW5ncy5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0aGlzLnNldHRpbmdzLmNwbQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5KGlyLlNLSVBfQURfVElNRU9VVCkuc2V0VGltZW91dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5KGlyLlNUT1BfQURfVElNRU9VVCkuc2V0VGltZW91dCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFnICYmIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQUJhc2VCaWRBZGFwdG9yX3NhbWViaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiAnc3RhcnRBZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGBhZHY6JHsgdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkIH0gYmlkaWQ6ICR7IHRoaXMucHkgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuUWcgPSAhMCwgdGhpcy5zeShpci5JTVBSRVNTSU9OX1RJTUVPVVQpLnNldFRpbWVvdXQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEFkKHQsIGksIGUsIHMsIHIsIGEsIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KZyAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0FCYXNlQmlkQWRhcHRvcl9zYW1lYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogJ2luaXRBZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGBhZHY6JHsgdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkIH0gYmlkaWQ6ICR7IHRoaXMucHkgfWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuSmcgPSAhMCwgdGhpcy5zeShpci5BRF9MT0FERURfVElNRU9VVCkuc2V0VGltZW91dCgpLCB0aGlzLmJ5KG8pLCB0aGlzLnZ5ID0gbmV3IGVyKHRoaXMpLCB0aGlzLnZ5Lm9uVHJhY2tpbmdMaWZlY3ljbGVFdmVudCh0ci5XaW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBZFZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSGcudm9sdW1lID0gdCwgT2JqZWN0KFQuUikodGhpcy5IZywgdCksIHQgPD0gMCA/IHRoaXMuc2V0dGluZ3MuYWRFbmZvcmNlci5zdGFydChYbi5NdXRlKSA6IHRoaXMuc2V0dGluZ3MuYWRFbmZvcmNlci5zdG9wKFhuLk11dGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaW1wcmVzc2lvblN0YXJ0ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkdnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgY3JlYXRpdmVJZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV2c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBjcmVhdGl2ZUlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmgpKHRoaXMuY3JlYXRpdmVJZCkgfHwgKHRoaXMuV2cgPSB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uQWRWaWV3YWJsZUltcHJlc3Npb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLllnLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBteSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuZCkodC5wYXlsb2FkLnNraXBPZmZzZXQpICYmIChpID0gdC5wYXlsb2FkLnNraXBPZmZzZXQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZExvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZExvYWRlZERhdGE6IHsgc2tpcE9mZnNldDogaSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2tpcE1vZGU6IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5za2lwTW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZExvYWRlZFBheWxvYWQgPSBlLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBneSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkSW1wcmVzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNraXBNb2RlOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uc2tpcE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTb3VyY2VEYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRUcmFja2luZ0VuYWJsZWQ6IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5tb2F0VHJhY2tpbmdFbmFibGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uY254Q3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRJZDogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IHRoaXMuZ2V0QWREdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFZpZGVvVXJsOiB0aGlzLmFkVmlkZW9VcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BZERhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFUjogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5ydGJBZG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVElWRV9JRDogdGhpcy5jcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1QQUlHTl9JRDogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5ydGJDYW1wYWluSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHl5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRWaWRlb1N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2tpcE1vZGU6IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5za2lwTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNvdXJjZURhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9hdFRyYWNraW5nRW5hYmxlZDogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLm1vYXRUcmFja2luZ0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5jbnhDcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZElkOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpcy5nZXRBZER1cmF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BZERhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFUjogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5ydGJBZG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVBVElWRV9JRDogdGhpcy5jcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1QQUlHTl9JRDogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5ydGJDYW1wYWluSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpnKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud3kodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkTG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudnkub25UcmFja2luZ0xpZmVjeWNsZUV2ZW50KHRyLkFkTG9hZGVkKSwgdGhpcy5zeShpci5BRF9MT0FERURfVElNRU9VVCkuY2xlYXJUaW1lb3V0KCksIHRoaXMuUmcubmV4dCh0aGlzLm15KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZEltcHJlc3Npb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52eS5vblRyYWNraW5nTGlmZWN5Y2xlRXZlbnQodHIuQWRJbXByZXNzaW9uKSwgdGhpcy5zeShpci5JTVBSRVNTSU9OX1RJTUVPVVQpLmNsZWFyVGltZW91dCgpLCB0aGlzLk95KCksIE9iamVjdChULmEpKHRoaXMucWcsIGFyKSwgdGhpcy5SZy5uZXh0KHRoaXMuZ3kodCkpLCB0aGlzLkdnID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb1N0YXJ0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudnkub25UcmFja2luZ0xpZmVjeWNsZUV2ZW50KHRyLkFkU3RhcnRlZCksIHRoaXMuUmcubmV4dCh0aGlzLnl5KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFN0b3BwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRTa2lwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JdSAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQUJhc2VCaWRBZGFwdG9yX2RvdWJsZV9kZXN0cm95JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuZmwoKSwgdGhpcy5SZy5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5JbnZhbGlkVnBhaWRFdmVudCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpnID0gdGhpcy54eSgpLCB0aGlzLnFnID0gdGhpcy56Zy5zbG90c0NvbnRhaW5lciwgT2JqZWN0KFQuYSkodGhpcy5xZywgdGhpcy5seSksIHRoaXMuTmcgPSB0aGlzLnpnLmFkU2xvdCwgdGhpcy5OZy5pZCA9IHRoaXMucHksIHRoaXMucWcuaWQgPSB0aGlzLnNldHRpbmdzLmJpZFNsb3RJZCwgdGhpcy5IZyA9IHRoaXMuemcudmlkZW9TbG90LCB0aGlzLkhnLnZvbHVtZSA9IHQsIE9iamVjdChULlIpKHRoaXMuSGcsIHQpLCB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIucmVnaXN0ZXJDb250YWluZXIodGhpcy5xZywgdGhpcy5weSksIHRoaXMuamwucHVzaCh0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIub25FbmZvcmNlckV2ZW50LnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU3kodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLnN0YXJ0KFhuLkFsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHh5KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlci5yZXF1ZXN0QWRTbG90KHRoaXMuc2V0dGluZ3MuYWRDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JdSA9ICEwLCBPYmplY3QoVC5JKSh0aGlzLnFnLCBhciksIE9iamVjdChULkkpKHRoaXMucWcsIHRoaXMubHkpLCB0aGlzLk5nLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKSwgdGhpcy5xZy5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyksIEFpKHRoaXMuamwpLCB0aGlzLnR5KCksIHRoaXMuc2V0dGluZ3MuYWRFbmZvcmNlci5kZXJlZ2lzdGVyQ29udGFpbmVyKHRoaXMucWcpLCB0aGlzLnNldHRpbmdzLnZpZXdhYmlsaXR5U2VydmljZS5vZmYodGhpcy5OZywgdGhpcy5ueSksIG51bGwgIT09IHRoaXMuWGcgJiYgbWkuY2xlYXJUaW1lb3V0KHRoaXMuWGcpLCB0aGlzLmp5KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGp5KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhnID0gbWkuc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFkU2xvdENvbnRhaW5lclJlY3ljbGVyLmRlc3Ryb3lBZFNsb3QodGhpcy56Zyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGhyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTGluZUl0ZW1JZDogaQogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLllnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiU2VhdElkOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnJ0YlNlYXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcElkOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmRzcElkCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPeSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IEh0LmUsIGkgPSB0aGlzLk5nOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLnZpZXdhYmlsaXR5U2VydmljZS5vbihpLCB0aGlzLm55LCB7IHRocmVzaG9sZDogdCB9KSwgdGhpcy5ueSh0aGlzLnNldHRpbmdzLnZpZXdhYmlsaXR5U2VydmljZS5jaGVjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMudXkpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5KHQpLmNsZWFyVGltZW91dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd3kodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghdGhpcy5HZyAmJiAodC50eXBlID09PSBQdC5iLkFkU3RvcHBlZCB8fCB0LnR5cGUgPT09IFB0LmIuQWRTa2lwcGVkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFN5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZGV0ZWN0ZWRDb250YWluZXIgIT09IHRoaXMucWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFFuLkJBRFVSSV9ERVRFQ1RFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAnQWRNYW5hZ2VyX2VuZm9yY2VyX0JhZFVyaSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRbi5NQUxXQVJFX0RFVEVDVEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICdBZE1hbmFnZXJfZW5mb3JjZXJfbWFsd2FyZScsIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5FbmZvcmNlbWVudE1hbHdhcmUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRbi5WT0xVTUVfREVURUNURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ0FkTWFuYWdlcl9lbmZvcmNlcl9zb3VuZEJsb2NrJywgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkVuZm9yY2VtZW50Vm9sdW1lIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBreSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCByOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkLCBvID0gdGhpcy5jcmVhdGl2ZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgQWRNYW5hZ2VyXyR7IHQgfV8keyBpIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6JHsgYSB9X2NyZWF0aXZlSWQ6JHsgbyB9X2Vycm9yTWVzc2FnZTokeyBudWxsID09PSAocyA9IGUpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMubWVzc2FnZSB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogbnVsbCA9PT0gKHIgPSBlKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB1ciA9IGUoNDQpOwogICAgICAgICAgICAgICAgY2xhc3MgbHIgZXh0ZW5kcyBabiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgciwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLl95ID0gdCwgdGhpcy5abiA9IGksIHRoaXMuQXkgPSBlLCB0aGlzLkl5ID0gcywgdGhpcy5DeSA9IG4sIHRoaXMuVHkgPSByLCB0aGlzLlB5ID0gaCwgdGhpcy5NeSA9IG5ldyBqaSgpLCB0aGlzLkV5ID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuTHkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHQuZ2V0RXJyb3IoKS5nZXRNZXNzYWdlKCkgKyAnXycgKyB0LmdldEVycm9yKCkuZ2V0RXJyb3JDb2RlKCkgKyAnXycgKyB0LmdldEVycm9yKCkuZ2V0VmFzdEVycm9yQ29kZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuSW1hRXJyb3IgKyAnXycgKyBpIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlJ5ID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5feS5BZEV2ZW50LlR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLkNMSUNLOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRDbGlja1RocnUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuTE9BREVEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWgodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuSU1QUkVTU0lPTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHNNYW5hZ2VyOiB0aGlzLkN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5CeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld01vZGU6IHRoaXMuRHkodGhpcy5GeSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVGFnOiB0aGlzLkl5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkVmlkZW9TdGFydCB9KSwgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEltcHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgaW1hTWV0YWRhdGE6IGUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLlNUQVJURUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFN0YXJ0ZWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuRklSU1RfUVVBUlRJTEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFZpZGVvRmlyc3RRdWFydGlsZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5NSURQT0lOVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkVmlkZW9NaWRwb2ludCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5USElSRF9RVUFSVElMRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkVmlkZW9UaGlyZFF1YXJ0aWxlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLkNPTVBMRVRFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7IHR5cGU6IFB0LmIuQWRWaWRlb0NvbXBsZXRlIH0pLCB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkU3RvcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaG91bGRUcmFja1Bvc3RCaWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5BTExfQURTX0NPTVBMRVRFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5EVVJBVElPTl9DSEFOR0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZER1cmF0aW9uQ2hhbmdlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLlBBVVNFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkUGF1c2VkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLlJFU1VNRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFBsYXlpbmcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuTElORUFSX0NIQU5HRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZExpbmVhckNoYW5nZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5TS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkU2tpcHBhYmxlU3RhdGVDaGFuZ2UgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGkuU0tJUFBFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkU2tpcHBlZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5WT0xVTUVfQ0hBTkdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkVm9sdW1lQ2hhbmdlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpLlVTRVJfQ0xPU0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFVzZXJDbG9zZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaS5MT0c6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZExvZyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5WeSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25DcmVhdGl2ZVJlY2VpdmVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5NeS5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEFkKHQsIGksIGUsIHMsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CeSA9IHIuc2xvdCwgdGhpcy5VeSA9IHIudmlkZW9TbG90LCB0aGlzLkZ5ID0gZSB8fCBQdC5hLk5vcm1hbDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ3kuc2V0Vm9sdW1lKDApLCB0aGlzLkN5LmluaXQodCwgaSwgdGhpcy5EeSh0aGlzLkZ5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkltYU1hbmFnZXJJbml0IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkN5LnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLldyYXBwZXJTdGFydEFkRXJyb3IgKyBgXyR7IHQubWVzc2FnZSB9YCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkN5LnN0b3AoKSwgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRTdG9wcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBzaG91bGRUcmFja1Bvc3RCaWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc2l6ZUFkKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DeS5yZXNpemUodCwgaSwgdGhpcy5EeShlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhdXNlQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ3kucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ3kucmVzdW1lKCksIHRoaXMuWm4gPT09IFN0LmIuSW9zICYmIE9iamVjdChULnopKHRoaXMuVXkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DeS5leHBhbmQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DeS5jb2xsYXBzZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBza2lwQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ3kuc2tpcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFJlbWFpbmluZ1RpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkN5LmdldFJlbWFpbmluZ1RpbWUoKSB8fCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZER1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4keSA/IHRoaXMuJHkuZ2V0RHVyYXRpb24oKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkVm9sdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DeS5nZXRWb2x1bWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYVdpZHRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4keSA/IHRoaXMuJHkuZ2V0VmFzdE1lZGlhV2lkdGgoKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFIZWlnaHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiR5ID8gdGhpcy4keS5nZXRWYXN0TWVkaWFIZWlnaHQoKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DeS5zZXRWb2x1bWUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldE1lZGlhRmlsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJHkgPyB0aGlzLiR5LmdldE1lZGlhVXJsKCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZ5KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkF5LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5feS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwgdGhpcy5FeSksIHRoaXMuQ3kuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl95LkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLCB0aGlzLkV5KSwgT2JqZWN0LmtleXModGhpcy5feS5BZEV2ZW50LlR5cGUpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkN5LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5feS5BZEV2ZW50LlR5cGVbdF0sIHRoaXMuUnksICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE55KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkF5LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5feS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwgdGhpcy5FeSksIHRoaXMuQ3kucmVtb3ZlRXZlbnRMaXN0ZW5lcih0aGlzLl95LkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLCB0aGlzLkV5KSwgT2JqZWN0LmtleXModGhpcy5feS5BZEV2ZW50LlR5cGUpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkN5LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5feS5BZEV2ZW50LlR5cGVbdF0sIHRoaXMuUnksICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIER5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IFB0LmEuRnVsbHNjcmVlbiA/IHRoaXMuX3kuVmlld01vZGUuRlVMTFNDUkVFTiA6IHRoaXMuX3kuVmlld01vZGUuTk9STUFMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBMeSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmdldFVzZXJSZXF1ZXN0Q29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWkgfHwgaS5pZCA9PT0gdGhpcy5UeS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYWgodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiR5ID0gdC5nZXRBZCgpLCB0aGlzLk15Lm5leHQodGhpcy4keS5nZXRDcmVhdGl2ZUlkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IC0xLCBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy4keS5nZXRTa2lwVGltZU9mZnNldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQuZ2V0QWREYXRhKCkuY2xpY2tUaHJvdWdoVXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE9iamVjdChydC5oKShzKSA/IHMgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QodXIuYikodGhpcy5QeSwgZSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5Eb21haW5CbG9ja2VkIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkTG9hZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2tpcE9mZnNldDogaSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk55KCksIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ3kuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGRyID0gewogICAgICAgICAgICAgICAgICAgICAgICBJbWFPYmplY3ROb3RGb3VuZDogWW4uYy5JbWFPYmplY3ROb3RGb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgSW1hU2NyaXB0RmFpbHVyZTogWW4uYy5JbWFTY3JpcHRGYWlsdXJlCiAgICAgICAgICAgICAgICAgICAgfSwgZnIgPSAnLy9pbWFzZGsuZ29vZ2xlYXBpcy5jb20vanMvc2RrbG9hZGVyL2ltYTMuanMnOwogICAgICAgICAgICAgICAgY2xhc3MgcHIgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBwcmVsb2FkSW1hU2RrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuRykoZnIsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZmV0Y2hJbWFTZGsodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGUsIHMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBwci5IeSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gaSAmJiAxID09PSBPYmplY3QoTGkuaykoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQueCkoeyBzcmM6IGZyIH0sIHQuZG9jdW1lbnQuaGVhZCwgdCwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBwci5IeSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID8gZShpKSA6IChhICYmIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9JbWFJbnRlZ3JhdG9yX25vX2ltYWdlX29iamVjdF9mb3VuZF9hZnRlcl9sb2FkaW5nX3NjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMoZHIuSW1hT2JqZWN0Tm90Rm91bmQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGRyLkltYVNjcmlwdEZhaWx1cmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSwgJ0FkTWFuYWdlcl9JbWFJbnRlZ3JhdG9yX3VuYWJsZV90b19pbnNlcnRfaW1hX3Nka19zY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBIeSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lmdvb2dsZSAmJiB0Lmdvb2dsZS5pbWE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgYnIgZXh0ZW5kcyBjciB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0KSwgdGhpcy5zZXR0aW5ncyA9IHQsIHRoaXMuemcgPSBudWxsLCB0aGlzLmFkTWVkaWFUeXBlID0gJ2ltYScsIHRoaXMuYWRTb3VyY2VUeXBlID0gaC5Qcm90b0Fkc291cmNlVHlwZUVudW0uSW1hLCB0aGlzLnF5ID0gW10sIHRoaXMuemcgPSB0aGlzLnNldHRpbmdzLmltYUFkU2xvdENvbnRhaW5lciwgdGhpcy56eSA9IG5ldyBscih0aGlzLnNldHRpbmdzLmltYVNkaywgdGhpcy5zZXR0aW5ncy5vcywgdGhpcy5zZXR0aW5ncy5pbWFBZHNMb2FkZXIsIHRoaXMuc2V0dGluZ3MudXJsLCB0aGlzLnNldHRpbmdzLmltYUFkc01hbmFnZXIsIHRoaXMuc2V0dGluZ3MucmVxdWVzdEFkc0NvbnRleHQsIHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5wdWJsaXNoZXJMaW5lSXRlbUlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEFkKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXRBZCh0LCBpLCBlLCBzLCBuLCByLCBoKSwgdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLm1vYXRUcmFja2luZ0VuYWJsZWQgJiYgdGhpcy5XeSgpLCB0aGlzLnF5LnB1c2godGhpcy56eS5vblZwYWlkRXZlbnQuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy56eS5vbkNyZWF0aXZlUmVjZWl2ZWQuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpdmVJZCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuenkuaW5pdEFkKHQsIGksIGUsIHMsIG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90OiB0aGlzLk5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2xvdDogdGhpcy5IZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkFkYXB0b3JJbml0QWRFcnJvciArIGBfJHsgdC5tZXNzYWdlIH1gIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydEFkKCksIHRoaXMuenkuc3RhcnRBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5BZGFwdG9yU3RhcnRBZEVycm9yICsgYF8keyB0Lm1lc3NhZ2UgfWAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcEFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0b3BBZCh0KSwgdGhpcy56eS5zdG9wQWQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0ltYUJpZEFkYXB0b3InLCAnc3RvcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56eS5yZXNpemVBZCh0LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSW1hQmlkQWRhcHRvcicsICdyZXNpemVBZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhdXNlQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp5LnBhdXNlQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSW1hQmlkQWRhcHRvcicsICdwYXVzZUFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp5LnJlc3VtZUFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0ltYUJpZEFkYXB0b3InLCAncmVzdW1lQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuenkuZXhwYW5kQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSW1hQmlkQWRhcHRvcicsICdleHBhbmRBZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp5LmNvbGxhcHNlQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSW1hQmlkQWRhcHRvcicsICdjb2xsYXBzZUFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2tpcEFkKCksIHRoaXMuenkuc2tpcEFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0ltYUJpZEFkYXB0b3InLCAnc2tpcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRSZW1haW5pbmdUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenkuZ2V0QWRSZW1haW5pbmdUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdJbWFCaWRBZGFwdG9yJywgJ2dldEFkUmVtYWluaW5nVGltZScsIHQpLCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkRHVyYXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56eSAmJiB0aGlzLnp5LmdldEFkRHVyYXRpb24oKSB8fCB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdJbWFCaWRBZGFwdG9yJywgJ2dldEFkRHVyYXRpb24nLCB0KSwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFZvbHVtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnp5LmdldEFkVm9sdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdJbWFCaWRBZGFwdG9yJywgJ2dldEFkVm9sdW1lJywgdCksIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYVNpemUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy56eS5nZXRBZE1lZGlhV2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy56eS5nZXRBZE1lZGlhSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0QWRWb2x1bWUodCksIHRoaXMuenkuc2V0QWRWb2x1bWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0ltYUJpZEFkYXB0b3InLCAnc2V0QWRWb2x1bWUnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYWRWaWRlb1VybCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenkuZ2V0TWVkaWFGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZWNsYXJlZER1cmF0aW9uSW5TZWNvbmRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56eS5nZXRBZER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGd5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHN1cGVyLmd5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5wYXlsb2FkLmFkU291cmNlRGF0YS5pbWFNZXRhZGF0YSA9IHQucGF5bG9hZC5pbWFNZXRhZGF0YSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnpnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqeSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlci5yZWN5Y2xlQWRTbG90KHRoaXMuemcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXeSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHIuZmV0Y2hJbWFTZGsodGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UuZ2V0R2xvYmFsQ2xvc2VzdFRvcCgpLnRvcEZyYW1lLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZmwoKSwgQWkodGhpcy5xeSksIHRoaXMuenkuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdJbWFCaWRBZGFwdG9yJywgJ19kZXN0cm95JywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB2ciA9IDI1OwogICAgICAgICAgICAgICAgY2xhc3MgbXIgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHQsIHRoaXMuQXkgPSBpLCB0aGlzLlZkID0gZSwgdGhpcy5VZCA9IHMsIHRoaXMuSXkgPSBuLCB0aGlzLlV5ID0gciwgdGhpcy5XZSA9IGgsIHRoaXMuR3kgPSBuZXcgamkoKSwgdGhpcy5KeSA9IG5ldyBqaSgpLCB0aGlzLlF5ID0geyBpZDogT2JqZWN0KExpLmMpKCkgfSwgdGhpcy5DeSA9IG51bGwsIHRoaXMuRXkgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5MeSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQuZ2V0RXJyb3IoKS5nZXRFcnJvckNvZGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl95LkFkRXJyb3IuRXJyb3JDb2RlLlZBU1RfRU1QVFlfUkVTUE9OU0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YeShHbi5JbWFWYXN0RW1wdHlSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoaXMuX3kuQWRFcnJvci5FcnJvckNvZGUuVkFTVF9XUkFQUEVSX0VSUk9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0aGlzLl95LkFkRXJyb3IuRXJyb3JDb2RlLlZBU1RfTUFMRk9STUVEX1JFU1BPTlNFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWHkoR24uSW1hSW52YWxpZFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YeShHbi5JbWFSZXF1ZXN0RXhjZXB0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ZeSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MeSh0KSAmJiAodGhpcy5DeSA9IHQuZ2V0QWRzTWFuYWdlcih0aGlzLlV5LCB7IGxvYWRWaWRlb1RpbWVvdXQ6IHZyICogcXQuZiB9KSwgdGhpcy5LeSgpLCB0aGlzLkd5Lm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYUFkc01hbmFnZXI6IHRoaXMuQ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFkc0NvbnRleHQ6IHRoaXMuUXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5BeS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3kuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELCB0aGlzLll5KSwgdGhpcy5BeS5hZGRFdmVudExpc3RlbmVyKHRoaXMuX3kuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsIHRoaXMuRXkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25TdWNjZXNzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HeS5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uRXJyb3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkp5LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2FkQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgdGhpcy5feS5BZHNSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRUYWdVcmwgPSB0aGlzLkl5LCB0LmxpbmVhckFkU2xvdFdpZHRoID0gdC5ub25MaW5lYXJBZFNsb3RXaWR0aCA9IHRoaXMuVmQsIHQubGluZWFyQWRTbG90SGVpZ2h0ID0gdC5ub25MaW5lYXJBZFNsb3RIZWlnaHQgPSB0aGlzLlVkLCB0LnBhZ2VVcmwgPSB0aGlzLldlLCB0aGlzLkF5LnJlcXVlc3RBZHModCwgdGhpcy5ReSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFh5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KeS5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLeSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BeS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3kuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELCB0aGlzLll5KSwgdGhpcy5BeS5yZW1vdmVFdmVudExpc3RlbmVyKHRoaXMuX3kuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsIHRoaXMuRXkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBMeSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmdldFVzZXJSZXF1ZXN0Q29udGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWkgfHwgaS5pZCA9PT0gdGhpcy5ReS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkt5KCksIG51bGwgPT09ICh0ID0gdGhpcy5DeSkgfHwgdm9pZCAwID09PSB0IHx8IHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBnciA9IDI1MDAwOwogICAgICAgICAgICAgICAgY2xhc3MgeXIgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHQsIHRoaXMuWnkgPSAhMSwgdGhpcy50dyA9IFtdLCB0aGlzLm1ldHJpY3MgPSB7IGNyZWF0ZWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZldGNoQmlkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY3MuZmV0Y2hTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCB0aGlzLml3ID0gdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlci5yZXF1ZXN0QWRTbG90SW1hKHRoaXMuc2V0dGluZ3MuYWRDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gbmV3IFByb21pc2UoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShHbi5JbWFUaW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBncik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaSA9IHRoaXMuZXcodGhpcy5pdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJhY2UoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgXSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MuZmV0Y2hFbmQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgdGhpcy5aeSA9ICEwLCB0aGlzLnN3ICYmIEFpKHRoaXMudHcpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubWV0cmljcy5mZXRjaEVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCB0aGlzLlp5ID0gITAsIHRoaXMuc3cgJiYgKEFpKHRoaXMudHcpLCB0aGlzLnN3LmRlc3Ryb3koKSwgdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlci5yZWN5Y2xlQWRTbG90KHRoaXMuaXcpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV3KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmV0Y2hJbWFEZXBlbmRlbmNpZXMoKS50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubncgPSB0LCB0aGlzLnJ3KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgT2JqZWN0KHJ0LmEpKHQpID8gdCA6IEduLkltYVJlcXVlc3RFeGNlcHRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBydyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlp5ID8gUHJvbWlzZS5yZWplY3QoKSA6IG5ldyBQcm9taXNlKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5hdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdyA9IG5ldyBtcih0LmltYVNkaywgdC5pbWFBZHNMb2FkZXIsIHMud2lkdGgsIHMuaGVpZ2h0LCB0aGlzLnNldHRpbmdzLnVybCwgdGhpcy5pdy52aWRlb1Nsb3QsIHRoaXMuc2V0dGluZ3MucGFnZVVybCksIHRoaXMudHcucHVzaCh0aGlzLnN3Lm9uU3VjY2Vzcy5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN3Lm9uRXJyb3Iuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuc3cubG9hZEFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLmFkQ29udGFpbmVyU3RhdGUuZ2V0KHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZFR5cGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBodyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJzOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuc2V0dGluZ3MudXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVNlcnZpY2U6IHRoaXMuc2V0dGluZ3Mudmlld2FiaWxpdHlTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0aGlzLnNldHRpbmdzLmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdGhpcy5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdGhpcy5zZXR0aW5ncy5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLnNldHRpbmdzLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbENyZWF0aXZlSWQ6IHRoaXMuc2V0dGluZ3MuY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYVNkazogdGhpcy5udy5pbWFTZGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFBZHNMb2FkZXI6IHRoaXMubncuaW1hQWRzTG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hQWRzTWFuYWdlcjogdC5pbWFBZHNNYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFkc0NvbnRleHQ6IHQucmVxdWVzdEFkc0NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFBZFNsb3RDb250YWluZXI6IHRoaXMuaXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IHRoaXMuc2V0dGluZ3MuYmlkU2xvdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5zZXR0aW5ncy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ZXJTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnVybFN1ZmZpeGVyU2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3cih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdC5zb3J0KCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LndpZHRoID09PSBpLndpZHRoID8gdC5iaXRyYXRlIC0gaS5iaXRyYXRlIDogdC53aWR0aCAtIGkud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0Lmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodFtlXS53aWR0aCA+PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZSAtIDFdIHx8IHRbZV07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbdC5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IE9yID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBgY254X2JpZF9zbG90XyR7IE9iamVjdChMaS5jKSgpIH1gOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciB4ciA9IGUoMTcpOwogICAgICAgICAgICAgICAgY29uc3QgU3IgPSB4ciAmJiB4ci5pc1N1cHBvcnRlZCgpLCBqciA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jYW5QbGF5VHlwZSgnYXBwbGljYXRpb24vdm5kLmFwcGxlLm1wZWd1cmwnKTsKICAgICAgICAgICAgICAgICAgICB9LCBrciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlV29ya2VyOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FwTGV2ZWxUb1BsYXllclNpemU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjbnhSZW5kZXJXaW5kb3c6IHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmZmVyU2l6ZTogNTAwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmZmVyTGVuZ3RoOiA1LAogICAgICAgICAgICAgICAgICAgICAgICBtYXhNYXhCdWZmZXJMZW5ndGg6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICBsaXZlQmFja0J1ZmZlckxlbmd0aDogMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBfciB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm93ID0gdCwgdGhpcy5jdyA9IGksIHRoaXMucmMgPSBlLCB0aGlzLnV3ID0gcywgdGhpcy5sdyA9IFtdLCB0aGlzLmR3ID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmZhdGFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4ci5FcnJvclR5cGVzLk5FVFdPUktfRVJST1I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmRldGFpbHMgPT09IHhyLkVycm9yRGV0YWlscy5NQU5JRkVTVF9QQVJTSU5HX0VSUk9SIHx8IGkuZGV0YWlscyA9PT0geHIuRXJyb3JEZXRhaWxzLk1BTklGRVNUX0xPQURfRVJST1IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcuc3RhcnRMb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHIuRXJyb3JUeXBlcy5NRURJQV9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5yZWNvdmVyTWVkaWFFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnZ3ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLk1FRElBX0FUVEFDSEVELCB0aGlzLnZ3KSwgdGhpcy5wdy5sb2FkU291cmNlKHRoaXMub3cpLCB0aGlzLnB3Lm9uY2UoeHIuRXZlbnRzLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5tdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubXcgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB3Lm9mZih4ci5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm13KSwgdGhpcy5ndygpLCB0aGlzLnV3LmZvcmNlTWF4TGV2ZWwgJiYgdGhpcy55dygpLCB0aGlzLnV3LmZvcmNlUmVzb2x1dGlvbkhlaWdodCAmJiB0aGlzLnd3KHRoaXMudXcuZm9yY2VSZXNvbHV0aW9uSGVpZ2h0KSwgdGhpcy5PdygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAodGhpcy51dy5mb3JjZU1heExldmVsIHx8IHRoaXMudXcuZm9yY2VSZXNvbHV0aW9uSGVpZ2h0KSAmJiAoa3IuY2FwTGV2ZWxUb1BsYXllclNpemUgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PdyA9IHQsIHRoaXMuZncgPSBpLCBTciA/ICh0aGlzLnB3ID0gdGhpcy5yYy5pbml0SGxzKGtyKSwgdGhpcy54dygpKSA6IHRoaXMuZncoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdyAmJiAodGhpcy5wdy5kZXN0cm95KCksIHRoaXMucHcgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeHcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcub24oeHIuRXZlbnRzLkVSUk9SLCB0aGlzLmR3KSwgdGhpcy5wdy5hdHRhY2hNZWRpYSh0aGlzLmN3KSwgdGhpcy5wdy5vbmNlKHhyLkV2ZW50cy5NRURJQV9BVFRBQ0hFRCwgdGhpcy52dyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHl3KCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5wdy5sZXZlbHMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Tdyh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd3codCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5sdy5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaGVpZ2h0ID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0aGlzLlN3KGkubGV2ZWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcuY3VycmVudExldmVsID0gdCwgdGhpcy5wdy5zdGFydExldmVsID0gdCwgdGhpcy5wdy5uZXh0TGV2ZWwgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBndygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5sZXZlbHMuZm9yRWFjaCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sdy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQuaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEFyID0gZSg0OSk7CiAgICAgICAgICAgICAgICBjb25zdCBJciA9IHsKICAgICAgICAgICAgICAgICAgICBkb21haW46ICdodWZmcG9zdCcsCiAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbkhlaWdodDogNTQwCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgQ3IgZXh0ZW5kcyBabiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgciwgYSwgbywgYywgbCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMuanMgPSB0LCB0aGlzLmp3ID0gaSwgdGhpcy5VeSA9IGUsIHRoaXMuWm4gPSBzLCB0aGlzLmt3ID0gciwgdGhpcy5fdyA9IGEsIHRoaXMuQXcgPSBvLCB0aGlzLkl3ID0gYywgdGhpcy5DdyA9IGwsIHRoaXMuZXIgPSBkLCB0aGlzLlR3ID0gITEsIHRoaXMucGFnZUZvY3VzID0gbmV3IEFyLmEodGhpcy5qcyksIHRoaXMuUHcgPSBPYmplY3QodS5hKShtKSwgdGhpcy5NdyA9ICExLCB0aGlzLkV3ID0gITAsIHRoaXMuTHcgPSAhMSwgdGhpcy5SdyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogUHQuYi5BZFZpZGVvU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFB0LmIuQWRWaWRlb0ZpcnN0UXVhcnRpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IDI1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBQdC5iLkFkVmlkZW9NaWRwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFB0LmIuQWRWaWRlb1RoaXJkUXVhcnRpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IDc1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBQdC5iLkFkVmlkZW9Db21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogMTAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuQncgPSB0aGlzLlJ3WzBdLCB0aGlzLkR3ID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodC50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtLlBhdXNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdyAmJiAhdGhpcy5FdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkICh0aGlzLkV3ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk13ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5QbGF5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuTXcgJiYgdGhpcy5DdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuVXkucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtLkNhbnBsYXk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtLkR1cmF0aW9uY2hhbmdlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5UaW1ldXBkYXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLlZhc3RWaWRlb1RhZ0V2ZW50RXJyb3IgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xpY2snOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZENsaWNrVGhydSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX1Zhc3RJbnRlZ3JhdG9yX29uVmlkZW9FdmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRBZCh0LCBpLCBlLCBzLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlV5ID0gci52aWRlb1Nsb3QsIHRoaXMud2lkdGggPSB0LCB0aGlzLmhlaWdodCA9IGksIHRoaXMuVXcodGhpcy5rdywgdGhpcy5VeS5wYXJlbnRFbGVtZW50KSwgdGhpcy5yZXNpemVBZCh0LCBpLCBlKSwgdGhpcy5hZGRWaWRlb0V2ZW50cyh0aGlzLlV5KSwgdGhpcy5JdyAmJiBTciA/IHRoaXMuJHcoKSA6ICh0aGlzLlV5LnNldEF0dHJpYnV0ZSgnc3JjJywgdGhpcy5qdyksIHRoaXMuVXkuc2V0QXR0cmlidXRlKCdwcmVsb2FkJywgJ21ldGFkYXRhJyksIHRoaXMuVXkubG9hZCgpKSwgdGhpcy5wYWdlRm9jdXMuaXNEb2N1bWVudFZpc2libGUoKSB8fCB0aGlzLkZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLldyYXBwZXJJbml0QWRFcnJvciArIGBfJHsgdC5tZXNzYWdlIH1gIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5hKSh0aGlzLlV5LCAnY254LWFkLXZpZGVvLXNsb3QnKSwgdGhpcy5NdyA9ICEwLCB0aGlzLnBhZ2VGb2N1cy5pc0RvY3VtZW50VmlzaWJsZSgpID8gdGhpcy5VeS5wbGF5KCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFN0YXJ0ZWQgfSksIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRJbXByZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5WYXN0UGxheVByb21pc2VSZWplY3QgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAodGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFN0YXJ0ZWQgfSksIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEltcHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLlV5LnBsYXkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLldyYXBwZXJTdGFydEFkRXJyb3IgKyBgXyR7IHQubWVzc2FnZSB9YCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkN3ICYmIHRoaXMuVXkucGF1c2UoKSwgJ3ZpZGVvQ29tcGxldGUnID09PSB0ICYmIHRoaXMuX3cgPyB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZFN0b3BwZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IHNob3VsZFRyYWNrUG9zdEJpZDogITEgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkU3RvcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2hvdWxkVHJhY2tQb3N0QmlkOiAhMCB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNpemVBZCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULk4pKHRoaXMuVXksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBgJHsgdCB9cHhgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBgJHsgaSB9cHhgCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLlJnLm5leHQoeyB0eXBlOiBQdC5iLkFkU2l6ZUNoYW5nZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NdyA9ICExLCB0aGlzLkF3ICYmIHZvaWQgMCA9PT0gdGhpcy5CdyAmJiAodGhpcy5CdyA9IHRoaXMuUndbMF0pLCB0aGlzLlV5LnBhdXNlKCksIHRoaXMuUmcubmV4dCh7IHR5cGU6IFB0LmIuQWRQYXVzZWQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc3VtZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93ICYmIHZvaWQgMCA9PT0gdGhpcy5CdyAmJiAodGhpcy5CdyA9IHRoaXMuUndbMF0pLCB0aGlzLk13ID0gITAsIHRoaXMuVXkucGxheSgpLCB0aGlzLlpuID09PSBTdC5iLklvcyAmJiBPYmplY3QoVC56KSh0aGlzLlV5KSwgdGhpcy5SZy5uZXh0KHsgdHlwZTogUHQuYi5BZFBsYXlpbmcgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4cGFuZEFkKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFkKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBza2lwQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7IHR5cGU6IFB0LmIuQWRTa2lwcGVkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFJlbWFpbmluZ1RpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlV5LmR1cmF0aW9uIC0gdGhpcy5VeS5jdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWREdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVXkuZHVyYXRpb24gPyB0aGlzLlV5LmR1cmF0aW9uIDogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRWb2x1bWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlV5LnZvbHVtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlV5LnZvbHVtZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFXaWR0aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVXkudmlkZW9XaWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYUhlaWdodCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVXkudmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5BdyAmJiAhdGhpcy5fdykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuSSkodGhpcy5VeSwgJ2NueC1hZC12aWRlby1zbG90JyksIHRoaXMuTncodGhpcy5VeSksIHRoaXMuVXkucmVtb3ZlQXR0cmlidXRlKCdzcmMnKSwgdGhpcy5IdyAmJiAodGhpcy5Idy5kZXN0cm95KCksIHRoaXMuSHcgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX1Zhc3RJbnRlZ3JhdG9yX2Rlc3Ryb3lBZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ID0geyBmb3JjZU1heExldmVsOiAhMCB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVyICYmIHRoaXMuZXIuaW5kZXhPZihJci5kb21haW4pID4gLTEgJiYgKHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU1heExldmVsOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUmVzb2x1dGlvbkhlaWdodDogSXIucmVzb2x1dGlvbkhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5IdyA9IG5ldyBfcih0aGlzLmp3LCB0aGlzLlV5LCB0aGlzLmpzLCB0KSwgdGhpcy5Idy5zdGFydCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZ3KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkNueE1lZGlhU3JjTm90U3VwcG9ydGVkIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVXcodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF3ID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50KCdhJyksIHQgJiYgKHRoaXMucXcuaHJlZiA9IHQsIHRoaXMucXcudGFyZ2V0ID0gJ19ibGFuaycpLCBPYmplY3QoVC5hKSh0aGlzLnF3LCAnY254LWFkLXNsb3QnKSwgaS5hcHBlbmRDaGlsZCh0aGlzLnF3KSwgdGhpcy5xdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuRHcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRWaWRlb0V2ZW50cyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUHcuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRkRXZlbnRMaXN0ZW5lcihpLCB0aGlzLkR3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucXcgJiYgdGhpcy5xdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuRHcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUHcuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihpLCB0aGlzLkR3KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucXcgJiYgdGhpcy5xdy5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuRHcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGdygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UdyB8fCAodGhpcy5UdyA9ICEwLCB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZExvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVncoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7IHR5cGU6IFB0LmIuQWRSZW1haW5pbmdUaW1lQ2hhbmdlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gT2JqZWN0KHdpLmUpKDAsIHRoaXMuVXkuZHVyYXRpb24sIDAsIDEwMCwgdGhpcy5VeS5jdXJyZW50VGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkJ3ICYmIHQgPj0gdGhpcy5Cdy5wb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MdyB8fCB0aGlzLlJnLm5leHQoeyB0eXBlOiB0aGlzLkJ3LmV2ZW50IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuQnc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJ3ID0gdGhpcy5Sd1t0aGlzLlJ3LmluZGV4T2YodGhpcy5CdykgKyAxXSwgdC5ldmVudCA9PT0gUHQuYi5BZFZpZGVvQ29tcGxldGUgJiYgKHRoaXMuRXcgPSAhMSwgdGhpcy5zdG9wQWQoJ3ZpZGVvQ29tcGxldGUnKSwgdGhpcy5MdyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBUcjsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuZXJyb3JJZnJhbWUgPSAnRXJyb3IgY3JlYXRpbmcgaWZyYW1lJzsKICAgICAgICAgICAgICAgIH0oVHIgfHwgKFRyID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IFByID0gJ2NueFByb3h5VGFzaycsIE1yID0gYFxuICAgIHdpbmRvdy4keyBQciB9ID0gZnVuY3Rpb24odGFzaykge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgIH0sIDApO1xuICAgIH1cbmA7CiAgICAgICAgICAgICAgICBjbGFzcyBFciB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIGV4ZWN1dGVBc3luYyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuencodCkoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBXdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRbUHJdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGF0aWMgencodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Xdyh0KSB8fCB0aGlzLkd3KHQpLCB0W1ByXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhdGljIEd3KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZG9jdW1lbnQuaGVhZDsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQudykoaSwgdCwgTXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIExyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuanMgPSB0LCB0aGlzLmNvID0gaSwgdGhpcy5raCA9IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEp3KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jb250ZW50V2luZG93ICYmICFzICYmIChzID0gITAsIHRoaXMuUXcobiwgdGhpcy5Ydyh0LCBpKSwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBZdyh0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkt3KHQsIHRoaXMuSncoaSwgZSwgcyksIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLdyh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLmpzLmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5hbGxvdyA9ICdhdXRvcGxheScsIHMuc3JjID0gJ2phdmFzY3JpcHQ6ZmFsc2UnLCBzLnNyY2RvYyA9ICcnLCBzLndpZHRoID0gJzEwMCUnLCBzLmhlaWdodCA9ICcxMDAlJywgcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZScsIHMuc3R5bGUubGVmdCA9ICcwJywgcy5zdHlsZS50b3AgPSAnMCcsIHMuc3R5bGUubWFyZ2luID0gJzBweCcsIHMuc3R5bGUucGFkZGluZyA9ICcwcHgnLCBzLnN0eWxlLmJvcmRlciA9ICcwcHgnLCBzLnN0eWxlLndpZHRoID0gJzEwMCUnLCBzLnN0eWxlLmhlaWdodCA9ICcxMDAlJywgcy5zZXRBdHRyaWJ1dGUoJ1NDUk9MTElORycsICdOTycpLCBzLm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuYXBwZW5kQ2hpbGQocyksIGkocyksIHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFF3KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IE9iamVjdChULnMpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBFci5leGVjdXRlQXN5bmMocywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5jb250ZW50V2luZG93ICYmIHQuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm9wZW4oKSwgZS53cml0ZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlp3KHQsIGkpLCB0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYdyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAnb2JqZWN0JyA9PSB0eXBlb2YgcyA/IEpTT04uc3RyaW5naWZ5KGlbZV0pIDogaVtlXSwgdCA9IHQucmVwbGFjZShuZXcgUmVnRXhwKGB7eyR7IGUgfX19YCwgJ2cnKSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2FkSWZyYW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9ICc8IURPQ1RZUEUgaHRtbD48aHRtbCBsYW5nPSJlbiI+PGhlYWQ+JyArICh0LmN1c3RvbUhlYWQgPyB0LmN1c3RvbUhlYWQgOiAnJykgKyAnPG1ldGEgY2hhcnNldD0iVVRGLTgiPjwvaGVhZD48Ym9keSBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowIj4nICsgKHQuY3VzdG9tSHRtbCA/IHQuY3VzdG9tSHRtbCA6ICcnKSArICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+d2luZG93LnBvc3RNZXNzYWdlKFwneyJldmVudCI6ICJyZWFkeSIsICJpZCI6ICJ7e2lmcmFtZUlEfX0ifVwnLCBcJypcJyk7PC9zY3JpcHQ+PC9ib2R5PjwvaHRtbD4nLCBlID0gJ2NueC1pZnJhbWVfJyArIE9iamVjdChMaS5jKSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHMsIG4pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudE8gPSB0aGlzLll3KHQuY29udGFpbmVyLCBpLCB7IGlmcmFtZUlEOiBlIH0sIGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBuKFRyLmVycm9ySWZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IEpTT04ucGFyc2UodC5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguaWQgPT09IGUgJiYgKGkuY29udGVudFdpbmRvdyA/IChpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY2xvc2UoKSwgaS5jb250ZW50V2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByKSwgcyh7IGlmcmFtZTogaSB9KSkgOiBuKCdUaGUgSWZyYW1lIGlzIG5vIGxvbmdlciBpbiB0aGUgRE9NJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWF2eUFkQmxvY2tUeXBlRW51bTogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5jdXN0b21SZXBvcnRpbmdMb2c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaU8gPSBuZXcgYih0aGlzLnRPLmNvbnRlbnRXaW5kb3csIHRoaXMuY28sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhdnlBZEJsb2NrVHlwZUVudW06IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlp3KGksIHQpLCBuKCdJZnJhbWUgY2FsbGJhY2sgZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmtoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpZnJhbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRPOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlPLmRlc3Ryb3koKSwgdGhpcy50TyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFp3KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qcy5pc0RldGFjaGVkRnJvbURPTSh0KSA/IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpZnJhbWVMb2FkZXJfKGluRG9tX2ZhbHNlKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGkubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpZnJhbWVMb2FkZXJfKGluRG9tX3RydWUpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogaS5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dKc29uU3RhdGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KFQuSikodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgUnIgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lTyA9IHQsIHRoaXMuanMgPSBpLCB0aGlzLmNvID0gZSwgdGhpcy5YbiA9IHMsIHRoaXMuc08gPSBuLCB0aGlzLm5PID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keVRhbXBsYXRlOiBgPGRpdiBjbGFzcz0iYWQtZWxlbWVudCIgaWQ9ImNueC1hZC1lbGVtZW50Ij48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIkeyB0aGlzLmVPIH0iPjxcL3NjcmlwdD4nXG4gICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij5cbiAgICAgICAgICAgIHdpbmRvdy5PYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgJ2NueElubmVyVGFnJywgeyBlbnVtZXJhYmxlOiAhMSwgd3JpdGFibGU6ICEwLCB2YWx1ZTogJyR7IHRoaXMuWG4gfScgfSk7XG4gICAgICAgICAgICB3aW5kb3cuT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ2NueElubmVyVGFnJyxcbiAgICAgICAgICAgIHsgZW51bWVyYWJsZTogITEsIHdyaXRhYmxlOiAhMCwgdmFsdWU6ICckeyB0aGlzLlhuIH0nIH0pO1xuICAgICAgICAgICAgY254dGltZW91dHMgPSBbXTtcbiAgICAgICAgICAgIGNueGludGVydmFscyA9IFtdO1xuICAgICAgICAgICAgb2xkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgICAgICBzZXRUaW1lb3V0ID0gZnVuY3Rpb24gKGUsIHQpIHsgdmFyIG4gPSBvbGRTZXRUaW1lb3V0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IHJldHVybiBjbnh0aW1lb3V0cy5wdXNoKG4pLCBuIH07XG4gICAgICAgICAgICBvbGRTZXRJbnRlcnZhbCA9IHNldEludGVydmFsO1xuICAgICAgICAgICAgc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbiAoZSwgdCkgeyB2YXIgbiA9IG9sZFNldEludGVydmFsLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7IHJldHVybiBjbnhpbnRlcnZhbHMucHVzaChuKSwgbiB9O1xuICAgICAgICAgICAgY2xlYXJBbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbCA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGNueHRpbWVvdXRzLmxlbmd0aDsgZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjbnh0aW1lb3V0c1tlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCBjbnhpbnRlcnZhbHMubGVuZ3RoOyBlKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChjbnhpbnRlcnZhbHNbZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIDxcL3NjcmlwdD5gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZFRhbXBsYXRlOiAnIDxzdHlsZT5cbiAgICAgICAgICAgIGh0bWwsXG4gICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgLmFkLWVsZW1lbnQge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc3R5bGU+JwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnJPID0gbmV3IExyKHRoaXMuanMsIHRoaXMuY28pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJPLmxvYWRJZnJhbWUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSGVhZDogdGhpcy5uTy5oZWFkVGFtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21IdG1sOiB0aGlzLm5PLmJvZHlUYW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVJlcG9ydGluZ0xvZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXZ5QWRCbG9ja1R5cGVFbnVtOiBoLlByb3RvSGVhdnlBZEJsb2NrVHlwZUVudW0uVnBhaWRJZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IHRoaXMuc08KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvYWRBZFVuaXRJZnJhbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaE8odCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFkQ29udGFpbmVyID0gdC5pZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYWQtZWxlbWVudCcpLCBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveUFkVW5pdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5yTy5pZnJhbWUuY29udGVudFdpbmRvdy5jbGVhckFsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9WUEFJQ2xpZW50X2Rlc3Ryb3lBZFVuaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogbnVsbCA9PT0gKHQgPSBlKSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBudWxsID09PSAoaSA9IGUpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuck8uZGVzdHJveSgpLCB0aGlzLnJPID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgQnI7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuaGFuZHNoYWtlVmVyc2lvbiA9IDBdID0gJ2hhbmRzaGFrZVZlcnNpb24nLCB0W3QuaW5pdEFkID0gMV0gPSAnaW5pdEFkJywgdFt0LnN0YXJ0QWQgPSAyXSA9ICdzdGFydEFkJywgdFt0LnN0b3BBZCA9IDNdID0gJ3N0b3BBZCcsIHRbdC5za2lwQWQgPSA0XSA9ICdza2lwQWQnLCB0W3QucmVzaXplQWQgPSA1XSA9ICdyZXNpemVBZCcsIHRbdC5wYXVzZUFkID0gNl0gPSAncGF1c2VBZCcsIHRbdC5yZXN1bWVBZCA9IDddID0gJ3Jlc3VtZUFkJywgdFt0LmV4cGFuZEFkID0gOF0gPSAnZXhwYW5kQWQnLCB0W3QuY29sbGFwc2VBZCA9IDldID0gJ2NvbGxhcHNlQWQnLCB0W3Quc3Vic2NyaWJlID0gMTBdID0gJ3N1YnNjcmliZScsIHRbdC51bnN1YnNjcmliZSA9IDExXSA9ICd1bnN1YnNjcmliZSc7CiAgICAgICAgICAgICAgICB9KEJyIHx8IChCciA9IHt9KSk7CiAgICAgICAgICAgICAgICBjbGFzcyBEciBleHRlbmRzIFpuIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCByLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMuancgPSB0LCB0aGlzLmpzID0gaSwgdGhpcy5jbyA9IGUsIHRoaXMuYU8gPSBzLCB0aGlzLnNPID0gciwgdGhpcy5XZyA9IGEsIHRoaXMuWm4gPSBvLCB0aGlzLm9PID0gW10sIHRoaXMuY08gPSBuZXcgU2V0KCksIHRoaXMudU8gPSBuZXcgU2V0KCksIHRoaXMubE8gPSAodCwgaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVySGFuZGxlczogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZE8oUHQuYi5BZENsaWNrVGhydSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZE8gPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudU8uYWRkKHQpLCAhdGhpcy5jTy5oYXModCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgIT09IFB0LmIuQWRJbXByZXNzaW9uIHx8IHRoaXMudU8uaGFzKFB0LmIuQWRMb2FkZWQpID8gdm9pZCB0aGlzLmZPKHQsIGkpIDogKE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9BZFZwYWlkV3JhcHBlcl9JbXByZXNzaW9uQmVmb3JlQWRMb2FkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGBhZHZlcnRpc2VyTGluZUl0ZW1JZDokeyB0aGlzLnNPIH1fY3JlYXRpdmVJZDokeyB0aGlzLldnIH1fdnBhaWRTcmM6JHsgdGhpcy5qdyB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBKU09OLnN0cmluZ2lmeShPYmplY3QobC5kKSh0aGlzLnVPKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5jTy5hZGQoUHQuYi5BZExvYWRlZCksIHZvaWQgdGhpcy5mTyhQdC5iLkFkTG9hZGVkLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZk8gPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBPYmplY3QocnQuZykoaSkgPyBpIDogSlNPTi5zdHJpbmdpZnkoaSkgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkTG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRMb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2tpcE9mZnNldDogT2JqZWN0KHJ0LmYpKGkpID8gaS5za2lwT2Zmc2V0IDogdm9pZCAwIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZEltcHJlc3Npb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEltcHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRDbGlja1RocnU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZENsaWNrVGhydSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogT2JqZWN0KHJ0LmYpKGkpID8gaSA6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7IHR5cGU6IFB0LmJbdF0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRBZCh0LCBpLCBlLCBzLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZkID0gdCwgdGhpcy5VZCA9IGksIHRoaXMuRnkgPSBlLCB0aGlzLnBPID0gcywgdGhpcy5iTyA9IG4sIHRoaXMudk8gPSByLCB0aGlzLm1PID0gbmV3IFJyKHRoaXMuancsIHRoaXMuanMsIHRoaXMuY28sIHRoaXMuYU8sIHRoaXMuc08pLCB0aGlzLmdPID0gdGhpcy5tTy5sb2FkQWRVbml0SWZyYW1lKHIuc2xvdCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlPKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5WcGFpZE9uTG9hZCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuVnBhaWRPbkxvYWQgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudU8uaGFzKFB0LmIuQWRJbXByZXNzaW9uKSAmJiAhdGhpcy5jTy5oYXMoUHQuYi5BZEltcHJlc3Npb24pICYmIChPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9BZFZwYWlkV3JhcHBlcl9icm9rZW5JbXByZXNzaW9uSGFuZGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGBhZHZlcnRpc2VyTGluZUl0ZW1JZDokeyB0aGlzLnNPIH1fY3JlYXRpdmVJZDokeyB0aGlzLldnIH1fdnBhaWRTcmM6JHsgdGhpcy5qdyB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEpTT04uc3RyaW5naWZ5KE9iamVjdChsLmQpKHRoaXMudU8pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuY08uYWRkKFB0LmIuQWRJbXByZXNzaW9uKSwgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkSW1wcmVzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLndPLnN0YXJ0QWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuV3JhcHBlclN0YXJ0QWRFcnJvciB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gKGkgPSB0aGlzLmdPKSB8fCB2b2lkIDAgPT09IGkgfHwgaS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud08gPyB0aGlzLndPLnN0b3BBZCh0KSA6IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnc3RvcEFkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndPLnJlc2l6ZUFkKHQsIGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXVzZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndPLnBhdXNlQWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud08ucmVzdW1lQWQoKSwgdGhpcy5abiA9PT0gU3QuYi5Jb3MgJiYgT2JqZWN0KFQueikodGhpcy52Ty52aWRlb1Nsb3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53Ty5leHBhbmRBZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndPLmNvbGxhcHNlQWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndPLnNraXBBZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFJlbWFpbmluZ1RpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndPLmdldEFkUmVtYWluaW5nVGltZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZER1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09ICh0ID0gdGhpcy53TykgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5nZXRBZER1cmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkVm9sdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53Ty5nZXRBZFZvbHVtZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBZFZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud08uc2V0QWRWb2x1bWUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9PKCksIHRoaXMub08ubGVuZ3RoID0gMCwgdGhpcy53TyA9IG51bGwsIG51bGwgPT09ICh0ID0gdGhpcy5tTykgfHwgdm9pZCAwID09PSB0IHx8IHQuZGVzdHJveUFkVW5pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5Tyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmlmcmFtZS5jb250ZW50V2luZG93LmdldFZQQUlEQWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53TyA9IGUsIHRoaXMuYXAoKSwgdGhpcy54TyhlKSA/IGUuaW5pdEFkKHRoaXMuVmQsIHRoaXMuVWQsIHRoaXMuRnksIHRoaXMucE8sIHRoaXMuYk8sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90OiB0LmFkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2xvdDogdGhpcy52Ty52aWRlb1Nsb3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuVnBhaWRJbnZhbGlkIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLlZwYWlkR2V0VnBhaWRBZEVycm9yIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoUHQuYikuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5kTy5iaW5kKHRoaXMsIFB0LmJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHQuYlt0XSA9PT0gUHQuYi5BZENsaWNrVGhydSAmJiAoaSA9IHRoaXMubE8pLCB0aGlzLm9PLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLndPLnN1YnNjcmliZShpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE9PKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9PLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndPLnVuc3Vic2NyaWJlKHQuaGFuZGxlciwgdC5ldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4Tyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhPYmplY3QobC5mKShCcikpLmV2ZXJ5KGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5iKSh0W0JyW2ldXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IEZyID0gJ3ZpZGVvL21wNCc7CiAgICAgICAgICAgICAgICBjbGFzcyBWciBleHRlbmRzIGNyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQpLCB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5hZFNvdXJjZVR5cGUgPSBoLlByb3RvQWRzb3VyY2VUeXBlRW51bS5Vbmtub3duLCB0aGlzLlNPID0gW10sIHRoaXMuY3JlYXRpdmVJZCA9IHQudmFzdFJlc3BvbnNlLmNyZWF0aXZlSWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRBZCh0LCBpLCBlLCBzLCBuLCByLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0QWQodCwgaSwgZSwgcywgbiwgciwgYSksIE9iamVjdCh1ci5iKSh0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwgdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UuY2xpY2tUaHJvdWdoKS50aGVuKG4gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkRvbWFpbkJsb2NrZWQgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5qTyA9IHRoaXMua08odCwgdGhpcy5IZyksIG51bGwgPT09IHRoaXMuak8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuVmFzdFVuc3VwcG9ydGVkTWVkaWEgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkTWVkaWFUeXBlID0gdGhpcy5qTy50eXBlLCB0aGlzLmpPLmdldE1lZGlhRmlsZVR5cGUoKSA9PT0gWW4uZC5WaWRlbyA/ICh0aGlzLl9PID0gbmV3IENyKHRoaXMuc2V0dGluZ3MuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLCB0aGlzLmpPLnNyYywgdGhpcy5IZywgdGhpcy5zZXR0aW5ncy5vcywgdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UuY2xpY2tUaHJvdWdoLCB0aGlzLnNldHRpbmdzLmxvb3BBZFdoZW5GaW5pc2hlZCksIHRoaXMuYWRTb3VyY2VUeXBlID0gaC5Qcm90b0Fkc291cmNlVHlwZUVudW0uVmFzdE1lZGlhKSA6ICh0aGlzLl9PID0gbmV3IERyKHRoaXMuak8uc3JjLCB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSwgdGhpcy5zZXR0aW5ncy50cmFja2luZ1NlcnZpY2UsIHRoaXMucHksIHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwgdGhpcy5jcmVhdGl2ZUlkLCB0aGlzLnNldHRpbmdzLm9zKSwgdGhpcy5hZFNvdXJjZVR5cGUgPSBoLlByb3RvQWRzb3VyY2VUeXBlRW51bS5WcGFpZCksIHRoaXMuU08ucHVzaCh0aGlzLl9PLm9uVnBhaWRFdmVudC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09IFB0LmIuQWRMb2FkZWQgJiYgKHQucGF5bG9hZC5za2lwT2Zmc2V0ID0gdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2Uuc2tpcG9mZnNldCksIHQudHlwZSA9PT0gUHQuYi5BZENsaWNrVGhydSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5BTyA9IHQucGF5bG9hZC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5wYXlsb2FkLnVybCB8fCB0aGlzLnNldHRpbmdzLnZhc3RSZXNwb25zZS5jbGlja1Rocm91Z2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHQucGF5bG9hZC5wbGF5ZXJIYW5kbGVzICYmIHRoaXMuc2V0dGluZ3MuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLm9wZW4oaSwga3QuYy5CbGFuayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRQYXJhbWV0ZXJzOiB0aGlzLnNldHRpbmdzLnZhc3RSZXNwb25zZS5hZFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUGFyYW1ldGVyczogdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UuYWRQYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9PLmluaXRBZCh0LCBpLCBlLCBzLCByLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Q6IHRoaXMuTmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvU2xvdDogdGhpcy5IZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSU8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JTyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRBZCgpLCB0aGlzLl9PLnN0YXJ0QWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SZy5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuQWRhcHRvclN0YXJ0QWRFcnJvciArIGBfJHsgdC5tZXNzYWdlIH1gIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0b3BBZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0b3BBZCh0KSwgdGhpcy5fTyA/IHRoaXMuX08uc3RvcEFkKHQpIDogT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3N0b3BBZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fTy5yZXNpemVBZCh0LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAncmVzaXplQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXVzZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fTy5wYXVzZUFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ1Zhc3RCaWRBZGFwdG9yJywgJ3BhdXNlQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXN1bWVBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX08ucmVzdW1lQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAncmVzdW1lQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX08uZXhwYW5kQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAnZXhwYW5kQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fTy5jb2xsYXBzZUFkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ1Zhc3RCaWRBZGFwdG9yJywgJ2NvbGxhcHNlQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBza2lwQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5za2lwQWQoKSwgdGhpcy5fTy5za2lwQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAnc2tpcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRSZW1haW5pbmdUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX08uZ2V0QWRSZW1haW5pbmdUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdWYXN0QmlkQWRhcHRvcicsICdnZXRBZFJlbWFpbmluZ1RpbWUnLCB0KSwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZER1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX08gJiYgdGhpcy5fTy5nZXRBZER1cmF0aW9uKCkgfHwgTWF0aC5yb3VuZCh0aGlzLnNldHRpbmdzLnZhc3RSZXNwb25zZS5kdXJhdGlvbiAvIHF0LmYpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAnZ2V0QWREdXJhdGlvbicsIHQpLCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkVm9sdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX08uZ2V0QWRWb2x1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua3koJ1Zhc3RCaWRBZGFwdG9yJywgJ2dldEFkVm9sdW1lJywgdCksIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYVNpemUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ID0gMCwgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9PIGluc3RhbmNlb2YgQ3IgPyAodCA9IHRoaXMuX08uZ2V0QWRNZWRpYVdpZHRoKCksIGkgPSB0aGlzLl9PLmdldEFkTWVkaWFIZWlnaHQoKSkgOiAodCA9IHRoaXMuak8ud2lkdGgsIGkgPSB0aGlzLmpPLmhlaWdodCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldEFkVm9sdW1lKHQpLCB0aGlzLl9PLnNldEFkVm9sdW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdWYXN0QmlkQWRhcHRvcicsICdzZXRBZFZvbHVtZScsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhZFZpZGVvVXJsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09ICh0ID0gdGhpcy5qTykgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5zcmM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZWNsYXJlZER1cmF0aW9uSW5TZWNvbmRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UuZHVyYXRpb24gLyBxdC5mOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBzdXBlci55eSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ08oaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGd5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHN1cGVyLmd5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DTyhpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2V0dGluZ3MubG9vcEFkV2hlbkZpbmlzaGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5mbCgpLCBBaSh0aGlzLlNPKSwgbnVsbCA9PT0gKHQgPSB0aGlzLl9PKSB8fCB2b2lkIDAgPT09IHQgfHwgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnVmFzdEJpZEFkYXB0b3InLCAnX2Rlc3Ryb3knLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQ08odCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucGF5bG9hZC5hZFNvdXJjZURhdGEubmFtZSA9IG51bGwgPT09IChpID0gdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuYWRUaXRsZSwgdC5wYXlsb2FkLmNsaWNrVGhyb3VnaFVybCA9IHRoaXMuQU8gfHwgdGhpcy5zZXR0aW5ncy52YXN0UmVzcG9uc2UuY2xpY2tUaHJvdWdoLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUTyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldE1lZGlhRmlsZVR5cGUoKSA9PT0gWW4uZC5WaWRlbyAmJiBpLmNhblBsYXlUeXBlKHQudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBrTyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLlRPKHRoaXMuc2V0dGluZ3MudmFzdFJlc3BvbnNlLm1lZGlhRmlsZXMsIGkpLCBzID0gZS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSA9PT0gRnI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyKHMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3IoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLnNldHRpbmdzLnZhc3RSZXNwb25zZS5tZWRpYUZpbGVzLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldE1lZGlhRmlsZVR5cGUoKSA9PT0gWW4uZC5KYXZhc2NyaXB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubGVuZ3RoID8gd3IobiwgdCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBJTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5BZGFwdG9ySW5pdEFkRXJyb3IgKyBgXyR7IHQubWVzc2FnZSB9YCB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBVciwgJHI7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eXHMqJC8udGVzdCh0KSA/IG51bGwgOiAvXig/OnRydWV8ZmFsc2UpJC9pLnRlc3QodCkgPyAndHJ1ZScgPT09IHQudG9Mb3dlckNhc2UoKSA6IGlzRmluaXRlKHQpID8gcGFyc2VGbG9hdCh0KSA6IGlzRmluaXRlKERhdGUucGFyc2UodCkpID8gbmV3IERhdGUodCkgOiAnc3RyaW5nJyA9PSB0eXBlb2YgdCA/IHQudHJpbSgpIDogdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdC5KWE9OVHJlZSA9IGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IDAsIG4gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMua2V5QXR0cmlidXRlcyB8fCAodGhpcy5rZXlBdHRyaWJ1dGVzID0ge30pLCBlLmhhc0NoaWxkTm9kZXMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSwgcywgciwgaCA9IDA7IGggPCBlLmNoaWxkTm9kZXMubGVuZ3RoOyBoKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpID0gZS5jaGlsZE5vZGVzLml0ZW0oaCkpLm5vZGVUeXBlIC0gMSB8IDEpID09PSBOb2RlLlRFWFRfTk9ERSA/IG4gKz0gaS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBpLm5vZGVWYWx1ZS50cmltKCkgOiBpLm5vZGVWYWx1ZSA6IDEgIT09IGkubm9kZVR5cGUgfHwgaS5wcmVmaXggfHwgKHMgPSBpLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHIgPSBuZXcgdChpKSwgdGhpcy5oYXNPd25Qcm9wZXJ0eShzKSA/ICh0aGlzW3NdLmNvbnN0cnVjdG9yICE9PSBBcnJheSAmJiAodGhpc1tzXSA9IFt0aGlzW3NdXSksIHRoaXNbc10ucHVzaChyKSkgOiB0aGlzW3NdID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtleVZhbHVlID0gbiA/IGkobikgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGUuaGFzQXR0cmlidXRlcyA/IGUuYXR0cmlidXRlcy5sZW5ndGggPiAwIDogZS5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHMgPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyBzKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUuYXR0cmlidXRlcy5pdGVtKHMpLCB0aGlzLmtleUF0dHJpYnV0ZXNbdC5uYW1lLnRvTG93ZXJDYXNlKCldID0gaSh0LnZhbHVlLnRyaW0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCB0LmdldEtleVZhbHVlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgdC5rZXlWYWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmtleVZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0sIHQuZGVjb2RlWE1MVGV4dCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnJlcGxhY2UoLyZhcG9zOy9nLCAnXCcnKS5yZXBsYWNlKC8mcXVvdDsvZywgJyInKS5yZXBsYWNlKC8mZ3Q7L2csICc+JykucmVwbGFjZSgvJmx0Oy9nLCAnPCcpLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oVXIgfHwgKFVyID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIE5yIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUE8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9qYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2phdmFzY3JpcHQxLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQvamF2YXNjcmlwdDEuMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9qYXZhc2NyaXB0MS40JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2pzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9lY21hc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2VjbWFzY3JpcHQxLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQvZWNtYXNjcmlwdDEuMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC9lY21hc2NyaXB0MS40JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0L2xpdmVzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2VjbWFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgXSwgdGhpcy5NTyA9ICdWUEFJRCcsIHRoaXMuZGVsaXZlcnkgPSB2b2lkIDAsIHRoaXMudHlwZSA9IHZvaWQgMCwgdGhpcy53aWR0aCA9IDAsIHRoaXMuaGVpZ2h0ID0gMCwgdGhpcy5jb2RlYyA9IHZvaWQgMCwgdGhpcy5pZCA9IHZvaWQgMCwgdGhpcy5iaXRyYXRlID0gdm9pZCAwLCB0aGlzLm1pbkJpdHJhdGUgPSB2b2lkIDAsIHRoaXMubWF4Qml0cmF0ZSA9IHZvaWQgMCwgdGhpcy5zY2FsYWJsZSA9IHZvaWQgMCwgdGhpcy5tYWludGFpbkFzcGVjdFJhdGlvID0gdm9pZCAwLCB0aGlzLmFwaUZyYW1ld29yayA9IHZvaWQgMCwgdGhpcy5zcmMgPSB2b2lkIDAsIHRoaXMuZGVsaXZlcnkgPSB0LmtleUF0dHJpYnV0ZXMuZGVsaXZlcnksIHRoaXMudHlwZSA9IHQua2V5QXR0cmlidXRlcy50eXBlLCB0aGlzLndpZHRoID0gdC5rZXlBdHRyaWJ1dGVzLndpZHRoLCB0aGlzLmhlaWdodCA9IHQua2V5QXR0cmlidXRlcy5oZWlnaHQsIHRoaXMuY29kZWMgPSB0LmtleUF0dHJpYnV0ZXMuY29kZWMsIHRoaXMuaWQgPSB0LmtleUF0dHJpYnV0ZXMuaWQsIHRoaXMuYml0cmF0ZSA9IHQua2V5QXR0cmlidXRlcy5iaXRyYXRlLCB0aGlzLm1pbkJpdHJhdGUgPSB0LmtleUF0dHJpYnV0ZXMubWluYml0cmF0ZSwgdGhpcy5tYXhCaXRyYXRlID0gdC5rZXlBdHRyaWJ1dGVzLm1heGJpdHJhdGUsIHRoaXMuc2NhbGFibGUgPSB0LmtleUF0dHJpYnV0ZXMuc2NhbGFibGUsIHRoaXMubWFpbnRhaW5Bc3BlY3RSYXRpbyA9IHQua2V5QXR0cmlidXRlcy5tYWludGFpbmFzcGVjdHJhdGlvLCB0aGlzLmFwaUZyYW1ld29yayA9IHQua2V5QXR0cmlidXRlcy5hcGlmcmFtZXdvcmssIHRoaXMuc3JjID0gVXIuZ2V0S2V5VmFsdWUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzU3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISgnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnID09PSB0aGlzLnR5cGUgfHwgJ3ZpZGVvL3gtZmx2JyA9PT0gdGhpcy50eXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWVkaWFGaWxlVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpRnJhbWV3b3JrID09PSB0aGlzLk1PIHx8IE9iamVjdChsLmcpKHRoaXMudHlwZSwgdGhpcy5QTykgPyBZbi5kLkphdmFzY3JpcHQgOiBZbi5kLlZpZGVvOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIEhyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHQua2V5QXR0cmlidXRlcy5ldmVudCwgdGhpcy51cmkgPSBVci5nZXRLZXlWYWx1ZSh0KSwgJ3Byb2dyZXNzJyA9PT0gdGhpcy5uYW1lICYmICh0aGlzLm9mZnNldCA9IE9iamVjdChudC5lKSh0LmtleUF0dHJpYnV0ZXMub2Zmc2V0LCBpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgcXIgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGlja1Rocm91Z2ggPSB2b2lkIDAsIHRoaXMuY2xpY2tUcmFja2luZ3MgPSBbXSwgdGhpcy5jdXN0b21DbGlja3MgPSBbXSwgdGhpcy5jbGlja1Rocm91Z2ggPSBVci5nZXRLZXlWYWx1ZSh0LmNsaWNrdGhyb3VnaCksIHRoaXMuY2xpY2tUcmFja2luZ3MgPSB0aGlzLkVPKE9iamVjdChsLm0pKHQuY2xpY2t0cmFja2luZykpLCB0aGlzLmN1c3RvbUNsaWNrcyA9IHRoaXMuRU8oT2JqZWN0KGwubSkodC5jdXN0b21jbGljaykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdFswXSAmJiB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goVXIuZ2V0S2V5VmFsdWUodCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB6ciB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gdm9pZCAwLCB0aGlzLm1lZGlhRmlsZXMgPSBbXSwgdGhpcy50cmFja2luZ0V2ZW50cyA9IFtdLCB0aGlzLnNraXBvZmZzZXQgPSB2b2lkIDAsIHRoaXMudmlkZW9DbGlja3MgPSB2b2lkIDAsIHRoaXMuZHVyYXRpb24gPSBPYmplY3QobnQuYSkoVXIuZ2V0S2V5VmFsdWUodC5kdXJhdGlvbikpLCB0aGlzLnNraXBvZmZzZXQgPSBPYmplY3QobnQuZSkodC5rZXlBdHRyaWJ1dGVzLnNraXBvZmZzZXQsIHRoaXMuZHVyYXRpb24pLCB0Lm1lZGlhZmlsZXMgJiYgKHRoaXMubWVkaWFGaWxlcyA9IHRoaXMuTE8oT2JqZWN0KGwubSkodC5tZWRpYWZpbGVzLm1lZGlhZmlsZSkpKSwgdC50cmFja2luZ2V2ZW50cyAmJiAodGhpcy50cmFja2luZ0V2ZW50cyA9IHRoaXMuUk8oT2JqZWN0KGwubSkodC50cmFja2luZ2V2ZW50cy50cmFja2luZykpKSwgdC52aWRlb2NsaWNrcyAmJiAodGhpcy52aWRlb0NsaWNrcyA9IG5ldyBxcih0LnZpZGVvY2xpY2tzKSksIHQuYWRwYXJhbWV0ZXJzICYmICh0aGlzLmFkUGFyYW1ldGVycyA9IFVyLmdldEtleVZhbHVlKHQuYWRwYXJhbWV0ZXJzKSwgdC5hZHBhcmFtZXRlcnNbJ0B4bWxFbmNvZGVkJ10gJiYgKHRoaXMuYWRQYXJhbWV0ZXJzID0gVXIuZGVjb2RlWE1MVGV4dCh0aGlzLmFkUGFyYW1ldGVycykpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUk8odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRbMF0gJiYgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKG5ldyBIcih0LCB0aGlzLmR1cmF0aW9uKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBMTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdFswXSAmJiB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IE5yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pc1N1cHBvcnRlZCgpICYmIGkucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzU3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgV3IgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHZvaWQgMCwgdGhpcy5zZXF1ZW5jZSA9IHZvaWQgMCwgdGhpcy5hZElkID0gdm9pZCAwLCB0aGlzLmxpbmVhciA9IHZvaWQgMCwgdGhpcy5pZCA9IHQua2V5QXR0cmlidXRlcy5pZCwgdGhpcy5zZXF1ZW5jZSA9IHQua2V5QXR0cmlidXRlcy5zZXF1ZW5jZSwgdGhpcy5hZElkID0gdC5rZXlBdHRyaWJ1dGVzLmFkaWQsIHQubGluZWFyICYmICh0aGlzLmxpbmVhciA9IG5ldyB6cih0LmxpbmVhcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc1N1cHBvcnRlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHRbMF0gJiYgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKFVyLmdldEtleVZhbHVlKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQucGFyc2VJbXByZXNzaW9ucyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHQpOwogICAgICAgICAgICAgICAgICAgIH0sIHQucGFyc2VDcmV0aXZlcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaChuZXcgV3IodCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlRXJyb3JzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0oJHIgfHwgKCRyID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIEdyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gdm9pZCAwLCB0aGlzLmFkdmVydGlzZXIgPSB2b2lkIDAsIHRoaXMuc3VydmV5cyA9IHZvaWQgMCwgdGhpcy5lcnJvcnMgPSB2b2lkIDAsIHRoaXMucHJpY2luZyA9IHZvaWQgMCwgdGhpcy5leHRlbnNpb25zID0gdm9pZCAwLCB0aGlzLmFkVGl0bGUgPSBVci5nZXRLZXlWYWx1ZSh0LmFkdGl0bGUpLCB0aGlzLmFkU3lzdGVtID0gVXIuZ2V0S2V5VmFsdWUodC5hZHN5c3RlbSksIHRoaXMuaW1wcmVzc2lvbnMgPSAkci5wYXJzZUltcHJlc3Npb25zKE9iamVjdChsLm0pKHQuaW1wcmVzc2lvbikpLCB0aGlzLmNyZWF0aXZlcyA9IChudWxsID09PSAoaSA9IHQuY3JlYXRpdmVzKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmNyZWF0aXZlKSA/ICRyLnBhcnNlQ3JldGl2ZXMoT2JqZWN0KGwubSkodC5jcmVhdGl2ZXMuY3JlYXRpdmUpKSA6IFtdLCB0aGlzLmRlc2NyaXB0aW9uID0gVXIuZ2V0S2V5VmFsdWUodC5kZXNjcmlwdGlvbiksIHRoaXMuYWR2ZXJ0aXNlciA9IFVyLmdldEtleVZhbHVlKHQuYWR2ZXJ0aXNlciksIHRoaXMuc3VydmV5cyA9IFVyLmdldEtleVZhbHVlKHQuc3VydmV5KSwgdGhpcy5lcnJvcnMgPSAkci5wYXJzZUVycm9ycyhPYmplY3QobC5tKSh0LmVycm9yKSksIHRoaXMucHJpY2luZyA9IFVyLmdldEtleVZhbHVlKHQucHJpY2luZyksIHRoaXMuZXh0ZW5zaW9ucyA9IFVyLmdldEtleVZhbHVlKHQuZXh0ZW5zaW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzU3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgSnIgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRTeXN0ZW0gPSB2b2lkIDAsIHRoaXMuaW1wcmVzc2lvbnMgPSBbXSwgdGhpcy5WQVNUQWRUYWdVUkkgPSB2b2lkIDAsIHRoaXMuY3JlYXRpdmVzID0gW10sIHRoaXMuZXJyb3JzID0gdm9pZCAwLCB0aGlzLmV4dGVuc2lvbnMgPSB2b2lkIDAsIHRoaXMuZmFsbG93QWRkaXRpb25hbFdyYXBwZXJzID0gdm9pZCAwLCB0aGlzLmFsbG93TXVsdGlwbGVBZHMgPSB2b2lkIDAsIHRoaXMuZmFsbGJhY2tPbk5vQWQgPSB2b2lkIDAsIHRoaXMuYWRTeXN0ZW0gPSBVci5nZXRLZXlWYWx1ZSh0LmFkU3lzdGVtKSwgdGhpcy5pbXByZXNzaW9ucyA9ICRyLnBhcnNlSW1wcmVzc2lvbnMoT2JqZWN0KGwubSkodC5pbXByZXNzaW9uKSksIHRoaXMuVkFTVEFkVGFnVVJJID0gVXIuZ2V0S2V5VmFsdWUodC52YXN0YWR0YWd1cmkpLCB0aGlzLmNyZWF0aXZlcyA9IChudWxsID09PSAoaSA9IHQuY3JlYXRpdmVzKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmNyZWF0aXZlKSA/ICRyLnBhcnNlQ3JldGl2ZXMoT2JqZWN0KGwubSkodC5jcmVhdGl2ZXMuY3JlYXRpdmUpKSA6IFtdLCB0aGlzLmVycm9ycyA9ICRyLnBhcnNlRXJyb3JzKE9iamVjdChsLm0pKHQuZXJyb3IpKSwgdGhpcy5leHRlbnNpb25zID0gdC5leHRlbnNpb25zLCB0aGlzLmZhbGxvd0FkZGl0aW9uYWxXcmFwcGVycyA9ICF0LmtleUF0dHJpYnV0ZXMuZm9sbG93YWRkaXRpb25hbHdyYXBwZXJzIHx8IHQua2V5QXR0cmlidXRlcy5mb2xsb3dhZGRpdGlvbmFsd3JhcHBlcnMsIHRoaXMuYWxsb3dNdWx0aXBsZUFkcyA9IHQua2V5QXR0cmlidXRlcy5hbGxvd211bHRpcGxlYWRzLCB0aGlzLmZhbGxiYWNrT25Ob0FkID0gdC5rZXlBdHRyaWJ1dGVzLmZhbGxiYWNrb25ub2FkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFFyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodCkgPyB0aGlzLkJPKHQpIDogdGhpcy5ETyh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNTdXBwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRE8odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdC5rZXlBdHRyaWJ1dGVzLmlkLCB0aGlzLnNlcXVlbmNlID0gdC5rZXlBdHRyaWJ1dGVzLnNlcXVlbmNlLCB0LmlubGluZSA/IHRoaXMuaW5MaW5lID0gbmV3IEdyKHQuaW5saW5lKSA6IHQud3JhcHBlciAmJiAodGhpcy53cmFwcGVyID0gbmV3IEpyKHQud3JhcHBlcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBCTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkZPKHQpLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5saW5lYXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIU9iamVjdChsLmgpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGwuaCkoaSkgJiYgdGhpcy5ETyhpWzBdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRk8odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbmxpbmUgPyBPYmplY3QobC5tKSh0LmlubGluZS5jcmVhdGl2ZXMuY3JlYXRpdmUpIDogdC53cmFwcGVyID8gT2JqZWN0KGwubSkodC53cmFwcGVyLmNyZWF0aXZlcy5jcmVhdGl2ZSkgOiBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBYciB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WTyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhcnNlVmFzdFhtbCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuVU8odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlYXNvbjogR24uWG1sSW52YWxpZFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh0LCAnYXBwbGljYXRpb24veG1sJyksIGUgPSBuZXcgVXIuSlhPTlRyZWUoaS5kb2N1bWVudEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRPKGUsIHRoaXMuVk8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JSZWFzb246IEduLlhtbEludmFsaWRUcmVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBuZXcgUXIoZS5hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5OTyhzKSA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlYXNvbjogR24uWG1sSW52YWxpZEFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclJlYXNvbjogR24uWG1sUGFyc2VHZW5lcmFsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFVPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE8odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQuYWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBwYXJzZUludCh0LmtleUF0dHJpYnV0ZXMudmVyc2lvbiwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShlICYmIGUgPCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTk8odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC53cmFwcGVyLCBlID0gdC5pbkxpbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSAmJiAhaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgIWkuVkFTVEFkVGFnVVJJKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghWy4uLmUuY3JlYXRpdmVzXS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKGUgPSBudWxsID09PSAoaSA9IHQpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkubGluZWFyKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLm1lZGlhRmlsZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFlyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWFGaWxlcyA9IFtdLCB0aGlzLmFkVGl0bGUgPSB2b2lkIDAsIHRoaXMuYWRQYXJhbWV0ZXJzID0gdm9pZCAwLCB0aGlzLmNsaWNrVGhyb3VnaCA9IHZvaWQgMCwgdGhpcy5jcmVhdGl2ZUlkID0gdm9pZCAwLCB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmluTGluZSA/ICh0aGlzLmFkVGl0bGUgPSB0LmluTGluZS5hZFRpdGxlLCB0aGlzLklnKHQuaW5MaW5lLmNyZWF0aXZlcykpIDogdC53cmFwcGVyICYmIHRoaXMuSWcodC53cmFwcGVyLmNyZWF0aXZlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSB0LmR1cmF0aW9uLCB0aGlzLkhPKHQubWVkaWFGaWxlcyksIHRoaXMucU8odC5za2lwb2Zmc2V0KSwgdGhpcy56Tyh0LmFkUGFyYW1ldGVycyksIHQudmlkZW9DbGlja3MgJiYgdC52aWRlb0NsaWNrcy5jbGlja1Rocm91Z2ggJiYgdGhpcy5Vdyh0LnZpZGVvQ2xpY2tzLmNsaWNrVGhyb3VnaCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHpPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZFBhcmFtZXRlcnMgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcG9mZnNldCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYUZpbGVzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5tZWRpYUZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBVdyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpY2tUaHJvdWdoID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSWcodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmVhciAmJiAodGhpcy5jcmVhdGl2ZUlkID0gdC5pZCwgdGhpcy5DZyh0LmxpbmVhcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBLciA9IDIsIFpyID0gMTA7CiAgICAgICAgICAgICAgICBjbGFzcyB0aCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5tZXRyaWNzID0geyBjcmVhdGVkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9LCB0aGlzLnNldHRpbmdzLnZhc3RBZHNDaGFpbiB8fCAodGhpcy5zZXR0aW5ncy52YXN0QWRzQ2hhaW4gPSBbXSksIHZvaWQgMCA9PT0gdGhpcy5zZXR0aW5ncy5tYXhXcmFwcGVyTGltaXQgJiYgKHRoaXMuc2V0dGluZ3MubWF4V3JhcHBlckxpbWl0ID0gWnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZXRjaEJpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljcy5mZXRjaFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHRoaXMuV08odGhpcy5zZXR0aW5ncy54bWwpLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBYcihLcikucGFyc2VWYXN0WG1sKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgIT09IHMuZXJyb3IgPyAodGhpcy5HTyhzLnJlc3VsdCksIGkodGhpcy5KTyhzLnJlc3VsdCkpKSA6IGUocy5lcnJvclJlYXNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQud3JhcHBlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubWF4V3JhcHBlckxpbWl0IDw9IDAgJiYgZShHbi5YbWxBZGFwdG9yV3JhcHBlckxpbWl0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5zZXR0aW5ncy5tYXhXcmFwcGVyTGltaXQgLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobmV3IHJoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFuYWdlckxpbmVJdGVtOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2Vyc0luZm9ybWF0aW9uOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdyYXBwZXJMaW1pdDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LndyYXBwZXIuVkFTVEFkVGFnVVJJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlVHJhY2tpbmdNYWNyb3M6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IHRoaXMuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nU3RhdGU6IHRoaXMuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hY3JvUmVwbGFjZXI6IHRoaXMuc2V0dGluZ3MuYWRNYWNyb1JlcGxhY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnZpZXdhYmlsaXR5U2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0aGlzLnNldHRpbmdzLmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZFByaWNlOiB0aGlzLnNldHRpbmdzLm9iZnVzY2F0ZWRQcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0V2l0aENyZWRlbnRpYWxzOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RXaXRoQ3JlZGVudGlhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiB0aGlzLnNldHRpbmdzLnN1Y2Nlc3NSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5zZXR0aW5ncy5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHRoaXMuc2V0dGluZ3MuY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2xvdElkOiB0aGlzLnNldHRpbmdzLmJpZFNsb3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEFkV2hlbkZpbmlzaGVkOiB0aGlzLnNldHRpbmdzLmxvb3BBZFdoZW5GaW5pc2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5zZXR0aW5ncy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuc2V0dGluZ3MudXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmV0Y2hCaWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobmV3IFZyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFuYWdlckxpbmVJdGVtOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyczogdGhpcy5zZXR0aW5ncy50cmFja2Vyc0luZm9ybWF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0UmVzcG9uc2U6IG5ldyBZcih0aGlzLnNldHRpbmdzLnZhc3RBZHNDaGFpbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRhZGF0YTogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyOiB0aGlzLnNldHRpbmdzLmFkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxEb21VdGlsc1NlcnZpY2U6IHRoaXMuc2V0dGluZ3MuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZpY2U6IHRoaXMuc2V0dGluZ3MudHJhY2tpbmdTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVNlcnZpY2U6IHRoaXMuc2V0dGluZ3Mudmlld2FiaWxpdHlTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHRoaXMuc2V0dGluZ3MuY3BtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmZ1c2NhdGVkUHJpY2U6IHRoaXMuc2V0dGluZ3Mub2JmdXNjYXRlZFByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiB0aGlzLnNldHRpbmdzLnN1Y2Nlc3NSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5zZXR0aW5ncy5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsQ3JlYXRpdmVJZDogdGhpcy5zZXR0aW5ncy5jcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IHRoaXMuc2V0dGluZ3MuYmlkU2xvdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQWRXaGVuRmluaXNoZWQ6IHRoaXMuc2V0dGluZ3MubG9vcEFkV2hlbkZpbmlzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuc2V0dGluZ3MudXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR08odCkgewogICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBuZXcgJG4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFkRXJyb3IucHVzaCguLi5XbihlLmVycm9yVXJscykpLCBpLmFkSW1wcmVzc2lvbi5wdXNoKC4uLlduKGUuaW1wcmVzc2lvbnMpKSwgaS5hZENsaWNrLnB1c2goLi4uV24oZS5jbGlja1RyYWNraW5ncykpLCBpLmFkTXV0ZS5wdXNoKC4uLlduKGUudHJhY2tpbmdFdmVudHMubXV0ZSkpLCBpLmFkUGF1c2UucHVzaCguLi5XbihlLnRyYWNraW5nRXZlbnRzLnBhdXNlKSksIGkuYWRRdWFydGlsZUZpcnN0LnB1c2goLi4uV24oZS50cmFja2luZ0V2ZW50cy5maXJzdFF1YXJ0aWxlKSksIGkuYWRRdWFydGlsZVNlY29uZC5wdXNoKC4uLlduKGUudHJhY2tpbmdFdmVudHMubWlkcG9pbnQpKSwgaS5hZFF1YXJ0aWxlVGhpcmQucHVzaCguLi5XbihlLnRyYWNraW5nRXZlbnRzLnRoaXJkUXVhcnRpbGUpKSwgaS5hZFF1YXJ0aWxlRm91cnRoLnB1c2goLi4uV24oZS50cmFja2luZ0V2ZW50cy5jb21wbGV0ZSkpLCBpLmFkUmVzdW1lLnB1c2goLi4uV24oZS50cmFja2luZ0V2ZW50cy5yZXN1bWUpKSwgaS5hZFNraXAucHVzaCguLi5XbihlLnRyYWNraW5nRXZlbnRzLnNraXApKSwgaS5hZFN0YXJ0ZWQucHVzaCguLi5XbihlLnRyYWNraW5nRXZlbnRzLmNyZWF0aXZlVmlldykpLCBpLmFkVmlkZW9TdGFydC5wdXNoKC4uLlduKFsuLi5lLnRyYWNraW5nRXZlbnRzLnN0YXJ0XSkpLCBpLmFkVW5tdXRlLnB1c2goLi4uaS5hZFVubXV0ZSwgLi4uV24oZS50cmFja2luZ0V2ZW50cy51bm11dGUpKSwgaS5hZFVzZXJBY2NlcHRJbnZpdGF0aW9uLnB1c2goLi4uV24oWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmUudHJhY2tpbmdFdmVudHMuYWNjZXB0SW52aXRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lLnRyYWNraW5nRXZlbnRzLmFjY2VwdEludml0YXRpb25MaW5lYXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKSwgaS5hZFVzZXJDbG9zZS5wdXNoKC4uLlduKGUudHJhY2tpbmdFdmVudHMuY2xvc2UpKSwgaS5hZFVzZXJNaW5pbWl6ZS5wdXNoKC4uLmkuYWRVc2VyTWluaW1pemUsIC4uLlduKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5lLnRyYWNraW5nRXZlbnRzLmNvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmUudHJhY2tpbmdFdmVudHMucGxheWVyQ29sbGFwc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZS50cmFja2luZ0V2ZW50cy5hZENvbGxhcHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgdGhpcy5zZXR0aW5ncy50cmFja2Vyc0luZm9ybWF0aW9uKSwgdGhpcy5zZXR0aW5ncy52YXN0QWRzQ2hhaW4ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaWgsIGVoID0gZSgyMyk7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuTm9uZSA9IDBdID0gJ05vbmUnLCB0W3QuSW1hID0gMV0gPSAnSW1hJzsKICAgICAgICAgICAgICAgIH0oaWggfHwgKGloID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNoID0geyBbaWguSW1hXTogJy5nLmRvdWJsZWNsaWNrLm5ldCcgfSwgbmggPSAhMDsKICAgICAgICAgICAgICAgIGNsYXNzIHJoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0LCB2b2lkIDAgPT09IHRoaXMuc2V0dGluZ3MucmVxdWVzdFdpdGhDcmVkZW50aWFscyAmJiAodGhpcy5zZXR0aW5ncy5yZXF1ZXN0V2l0aENyZWRlbnRpYWxzID0gbmgpLCB0aGlzLm1ldHJpY3MgPSB7IGNyZWF0ZWQ6IG5ldyBEYXRlKCkuZ2V0VGltZSgpIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZldGNoQmlkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLmZldGNoU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgdGhpcy5RTyh0aGlzLnNldHRpbmdzLnVybCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZldGNoQmlkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gaWguTm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNoKS5mb3JFYWNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT09IHQuaW5kZXhPZihzaFtlXSkgJiYgKGkgPSBwYXJzZUludChlLCAxMCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUU8odCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5ZTyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLlhPKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaWguTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLktPKGkpOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGloLkltYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpPKGkpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KEduLkhhbmRsaW5nU2RrVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBaTyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IHlyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNldHRpbmdzLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYW5hZ2VyTGluZUl0ZW06IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2Vyc0luZm9ybWF0aW9uOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlVHJhY2tpbmdNYWNyb3M6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVNlcnZpY2U6IHRoaXMuc2V0dGluZ3Mudmlld2FiaWxpdHlTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0aGlzLnNldHRpbmdzLmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdGhpcy5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdGhpcy5zZXR0aW5ncy5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLnNldHRpbmdzLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiB0aGlzLnNldHRpbmdzLmNyZWF0aXZlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IHRoaXMuc2V0dGluZ3MuYmlkU2xvdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5zZXR0aW5ncy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ZXJTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnVybFN1ZmZpeGVyU2VydmljZQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEtPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVoLmEuZmV0Y2hYTUxSZXF1ZXN0KHQsIHRoaXMuc2V0dGluZ3MucmVxdWVzdFdpdGhDcmVkZW50aWFscykuY2F0Y2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExID09PSB0aGlzLnNldHRpbmdzLnJlcXVlc3RXaXRoQ3JlZGVudGlhbHMgPyBQcm9taXNlLnJlamVjdChHbi5OZXR3b3JrUmVxdWVzdFVybCkgOiBlaC5hLmZldGNoWE1MUmVxdWVzdCh0LCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChHbi5OZXR3b3JrUmVxdWVzdFVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2Vyc0luZm9ybWF0aW9uOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFzdEFkc0NoYWluOiB0aGlzLnNldHRpbmdzLnZhc3RBZHNDaGFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWw6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVRyYWNraW5nTWFjcm9zOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IHRoaXMuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYWNyb1JlcGxhY2VyOiB0aGlzLnNldHRpbmdzLmFkTWFjcm9SZXBsYWNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxEb21VdGlsc1NlcnZpY2U6IHRoaXMuc2V0dGluZ3MuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5U2VydmljZTogdGhpcy5zZXR0aW5ncy52aWV3YWJpbGl0eVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHRoaXMuc2V0dGluZ3MuY3BtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdGhpcy5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaXRoQ3JlZGVudGlhbHM6IHRoaXMuc2V0dGluZ3MucmVxdWVzdFdpdGhDcmVkZW50aWFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdGhpcy5zZXR0aW5ncy5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5zZXR0aW5ncy5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3RDb250YWluZXJSZWN5Y2xlcjogdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiB0aGlzLnNldHRpbmdzLmNyZWF0aXZlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2xvdElkOiB0aGlzLnNldHRpbmdzLmJpZFNsb3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQWRXaGVuRmluaXNoZWQ6IHRoaXMuc2V0dGluZ3MubG9vcEFkV2hlbkZpbmlzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VVcmw6IHRoaXMuc2V0dGluZ3MucGFnZVVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuc2V0dGluZ3MudXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFlPKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLmFkQ29udGFpbmVyU3RhdGUuZ2V0KHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZFR5cGUpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkSGVpZ2h0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkV2lkdGg6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRQb3N0aW9uOiB0aGlzLnNldHRpbmdzLmNhbGxpbmdTdGF0ZS5hZEJyZWFrU3RhdGUuYWRCcmVha1R5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEZXNjcmlwdGlvbjogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUubWVkaWEubWVkaWFEZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUR1cmF0aW9uOiB0aGlzLnNldHRpbmdzLmNhbGxpbmdTdGF0ZS5tZWRpYS5tZWRpYUR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQ6IHRoaXMuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLm1lZGlhLm1lZGlhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaXRsZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUubWVkaWEubWVkaWFUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVVybDogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUubWVkaWEubWVkaWFVcmwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmFkTWFjcm9SZXBsYWNlci5yZXBsYWNlKHQsIHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS52ZW5kb3JJZCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYWNyb3M6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU1hY3JvczogbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBoaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHQsIE9iamVjdChydC5oKSh0aGlzLmRhdGEuY254QmlkSWQpIHx8ICh0aGlzLmRhdGEuY254QmlkSWQgPSBPYmplY3QoTGkuYykoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGFoID0gZSgzMik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvaCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmluZCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCA9PT0gaTsKICAgICAgICAgICAgICAgICAgICB9KS5hZE1hbmFnZXJMaW5lSXRlbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNoKHQpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY2FsbGVycy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5yZXF1ZXN0ZWRGbG9vclByaWNlSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSB8fCBPYmplY3QobC5nKShlLCBpKSB8fCBpLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgfSksIHQuYmlkcy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5yZXF1ZXN0ZWRGbG9vclByaWNlSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZSB8fCBPYmplY3QobC5nKShlLCBpKSB8fCBpLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1aCh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uVGFtLAogICAgICAgICAgICAgICAgICAgICAgICBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UYW1EZWFsLAogICAgICAgICAgICAgICAgICAgICAgICBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5SdGIsCiAgICAgICAgICAgICAgICAgICAgICAgIGguUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLkhlYWRlckJpZGRlcgogICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXModCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBsaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR4ID0gdCwgdGhpcy5leCA9IGksIHRoaXMuc08gPSBlLCB0aGlzLmpzID0gcywgdGhpcy5jbyA9IG4sIHRoaXMuc3ggPSAnZGl2LWNueC1kaXNwbGF5JywgdGhpcy5ueCA9IG5ldyBqaSgpLCB0aGlzLkp5ID0gbmV3IGppKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkRpc3BsYXlBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubnguYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkVycm9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5KeS5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUFkKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTmcgPSB0LCB0aGlzLnJPID0gbmV3IExyKHRoaXMuanMsIHRoaXMuY28pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHggPT09IFluLmIuSHRtbCAmJiAoZSA9IHRoaXMuZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuaHgodGhpcy5OZywgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJPLmxvYWRJZnJhbWUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUhlYWQ6ICc8c3R5bGU+aHRtbCwgYm9keSB7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0jJyArIHRoaXMuc3ggKyAne3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpfSMnICsgdGhpcy5zeCArICd7Ym9yZGVyOjNweCBzb2xpZCB3aGl0ZX0jJyArIHRoaXMuc3ggKyAnIGlmcmFtZXtkaXNwbGF5OmJsb2NrfTwvc3R5bGU+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21IdG1sOiAnPGRpdiBpZD0iJyArIHRoaXMuc3ggKyAnIj4nICsgZSArICc8L2Rpdj4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21SZXBvcnRpbmdMb2c6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhdnlBZEJsb2NrVHlwZUVudW06IGguUHJvdG9IZWF2eUFkQmxvY2tUeXBlRW51bS5PdmVybGF5SWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyTGluZUl0ZW1JZDogdGhpcy5zTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5heCA9IHQuaWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmF4LmNvbnRlbnRXaW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3ggPSBpLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc3gpLCB0aGlzLnR4ID09PSBZbi5iLkphdmFzY3JpcHQgJiYgT2JqZWN0KFQudykodGhpcy5veCwgaSwgdGhpcy5leCksICcnID09PSB0aGlzLmF4LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5pbm5lckhUTUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9ICdodG1sLCBib2R5IHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21hcmdpbjowO2JvcmRlcjowfSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXgodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULkYpKHRoaXMuYXguY29udGVudFdpbmRvdywgJ0FkSHRtbFdyYXBwZXInKSwgdGhpcy5ueC5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkp5Lm5leHQoWW4uYy5EaXNwbGF5SW50ZWdyYXRvcklmcmFtZUxvYWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSnkubmV4dChZbi5jLldyYXBwZXJJbml0QWRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYVdpZHRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5veC5jbGllbnRXaWR0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYUhlaWdodCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3guY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF4ICYmIHRoaXMuTmcgJiYgT2JqZWN0KFQuSikodGhpcy5heCksIHRoaXMuck8gJiYgKHRoaXMuck8uZGVzdHJveSgpLCB0aGlzLnJPID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGh4KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpLndpZHRoIHx8ICFpLmhlaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5qcy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoYDxkaXYgY2xhc3M9ImNueC1pZnJhbWUtY29udGFpbmVyIiBzdHlsZT0id2lkdGg6ICR7IGkud2lkdGggfXB4OyBoZWlnaHQ6ICR7IGkuaGVpZ2h0IH1weCI+PC9kaXY+YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk5nLmFwcGVuZENoaWxkKGUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1eCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmF4LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSwgZSA9IHRoaXMuYXguY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaS5hcHBlbmRDaGlsZChlKSwgdGhpcy5heC5jb250ZW50V2luZG93LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZGggPSB7CiAgICAgICAgICAgICAgICAgICAgW050LkZpcnN0UXVhcnRpbGVdOiBQdC5iLkFkVmlkZW9GaXJzdFF1YXJ0aWxlLAogICAgICAgICAgICAgICAgICAgIFtOdC5TZWNvbmRRdWFydGlsZV06IFB0LmIuQWRWaWRlb01pZHBvaW50LAogICAgICAgICAgICAgICAgICAgIFtOdC5UaGlyZFF1YXJ0aWxlXTogUHQuYi5BZFZpZGVvVGhpcmRRdWFydGlsZSwKICAgICAgICAgICAgICAgICAgICBbTnQuRm91cnRoUXVhcnRpbGVdOiBQdC5iLkFkVmlkZW9Db21wbGV0ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIGZoIGV4dGVuZHMgY3IgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCksIHRoaXMuc2V0dGluZ3MgPSB0LCB0aGlzLmFkTWVkaWFUeXBlID0gJ2Rpc3BsYXlIdG1sJywgdGhpcy5hZFNvdXJjZVR5cGUgPSBoLlByb3RvQWRzb3VyY2VUeXBlRW51bS5Vbmtub3duLCB0aGlzLmx4ID0gJ2h0bWwnLCB0aGlzLnpsID0gNTAwLCB0aGlzLldsID0gMSwgdGhpcy5weCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLm92ZXJsYXlUaW1lICogcXQuZjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieCA9IG5ldyBfaShpLCB0aGlzLnpsLCB0aGlzLldsKSwgdGhpcy5weC5wdXNoKHRoaXMuYngub25UaW1lVXBkYXRlLnN1YnNjcmliZSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsgdHlwZTogUHQuYi5BZFJlbWFpbmluZ1RpbWVDaGFuZ2UgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmJ4Lm9uVGltZUVsYXBzZWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEFkKCdodG1sVGltZXJFbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmJ4Lm9uUXVhcnRpbGUuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZGhbdF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhZFZpZGVvVXJsKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5seDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGRlY2xhcmVkRHVyYXRpb25JblNlY29uZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ub3ZlcmxheVRpbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRBZCh0LCBpLCBlLCBzLCBuLCByLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0QWQodCwgaSwgZSwgcywgbiwgciwgaCksIHRoaXMuVmQgPSB0LCB0aGlzLlVkID0gaSwgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZExvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5BZGFwdG9ySW5pdEFkRXJyb3IgKyBgXyR7IHQubWVzc2FnZSB9YCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRBZCgpLCB0aGlzLmJ4LnN0YXJ0KCksIHRoaXMudnggPSBuZXcgbGgodGhpcy5zZXR0aW5ncy5taW1lLCB0aGlzLnNldHRpbmdzLmh0bWwsIHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwgdGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuc2V0dGluZ3MudHJhY2tpbmdTZXJ2aWNlKSwgdGhpcy5weC5wdXNoKHRoaXMudngub25EaXNwbGF5QWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsgdHlwZTogUHQuYi5BZFN0YXJ0ZWQgfSksIHRoaXMuWmcoeyB0eXBlOiBQdC5iLkFkVmlkZW9TdGFydCB9KSwgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRJbXByZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMudngub25FcnJvci5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IHQgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmJ4LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy52eC5pbml0aWFsaXplQWQodGhpcy5OZywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLlZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5VZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5BZGFwdG9yU3RhcnRBZEVycm9yICsgYF8keyB0Lm1lc3NhZ2UgfWAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcEFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0b3BBZCh0KSwgdGhpcy5ieC5zdG9wKCksIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRTdG9wcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2hvdWxkVHJhY2tQb3N0QmlkOiAhMCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSHRtbEJpZEFkYXB0b3InLCAnc3RvcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2tpcEFkKCksIHRoaXMuWmcoeyB0eXBlOiBQdC5iLkFkU2tpcHBlZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSHRtbEJpZEFkYXB0b3InLCAnc2tpcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnguc3RvcCgpLCB0aGlzLlpnKHsgdHlwZTogUHQuYi5BZFBhdXNlZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnSHRtbEJpZEFkYXB0b3InLCAncGF1c2VBZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc3VtZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieC5zdGFydCgpLCB0aGlzLlpnKHsgdHlwZTogUHQuYi5BZFBsYXlpbmcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0h0bWxCaWRBZGFwdG9yJywgJ3Jlc3VtZUFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhwYW5kQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkRHVyYXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ4LnRpbWVyRHVyYXRpb24gLyBxdC5mOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFJlbWFpbmluZ1RpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ4LnRpbWVSZW1haW5pbmcgLyBxdC5mOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZFZvbHVtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFTaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMudnguZ2V0QWRNZWRpYVdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMudnguZ2V0QWRNZWRpYUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZkID0gdCwgdGhpcy5VZCA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmZsKCksIHRoaXMuYnguc3RvcCgpLCBBaSh0aGlzLnB4KSwgbnVsbCA9PT0gKHQgPSB0aGlzLnZ4KSB8fCB2b2lkIDAgPT09IHQgfHwgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0h0bWxCaWRBZGFwdG9yJywgJ19kZXN0cm95JywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBwaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5tZXRyaWNzID0geyBjcmVhdGVkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZXRjaEJpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWV0cmljcy5mZXRjaFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCksICF0aGlzLm14KHRoaXMuc2V0dGluZ3MubWltZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoR24uSFRNTFVua25vd25NaW1lVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgZmgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJzOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sOiB0aGlzLnNldHRpbmdzLmh0bWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lOiB0aGlzLnNldHRpbmdzLm1pbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5EaW1lbnNpb25zOiB0aGlzLnNldHRpbmdzLmRpbWVuc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IHRoaXMuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1N0YXRlOiB0aGlzLnNldHRpbmdzLmNhbGxpbmdTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZpY2U6IHRoaXMuc2V0dGluZ3MudHJhY2tpbmdTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnZpZXdhYmlsaXR5U2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyOiB0aGlzLnNldHRpbmdzLmFkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0aGlzLnNldHRpbmdzLmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdGhpcy5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdGhpcy5zZXR0aW5ncy5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLnNldHRpbmdzLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbENyZWF0aXZlSWQ6IHRoaXMuc2V0dGluZ3MuY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFNsb3RJZDogdGhpcy5zZXR0aW5ncy5iaWRTbG90SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuc2V0dGluZ3MudXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIFByb21pc2UucmVzb2x2ZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXgodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoWW4uYikuc29tZShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBZbi5iW2ldID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBiaCA9ICdjbnhSdGJUZXN0JzsKICAgICAgICAgICAgICAgIGNsYXNzIHZoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByLCBoLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3ggPSB0LCB0aGlzLnl4ID0gaSwgdGhpcy5NbSA9IGUsIHRoaXMud3ggPSBzLCB0aGlzLk94ID0gbiwgdGhpcy54eCA9IHIsIHRoaXMuU3ggPSBoLCB0aGlzLmp4ID0gYSwgdGhpcy5reCA9IDAsIHRoaXMuX3ggPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5jYWxsaW5nU3RhdGUuYWRDb250YWluZXJTdGF0ZS5nZXQoaC5Qcm90b0FkVHlwZS5WaWRlbyksIHMgPSB0aGlzLkF4KGksIGUpLCByID0gdGhpcy5JeCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFzIHx8IE9iamVjdC5rZXlzKHIubGluZUl0ZW1zKS5sZW5ndGggPD0gMCA/IFByb21pc2UucmVzb2x2ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkczogW10KICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0aGlzLkN4KHIpLnRoZW4oaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5UeChpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdSdGJDYWxsQWdncmVnYXRvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkczogW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUeCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkczogW10KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubGluZUl0ZW1SZXNwb25zZXMuZm9yRWFjaChzID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBvaChpLmxpbmVJdGVtUmVxdWVzdERhdGFMaXN0LCBzLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5lKShzLmNhY2hlZEZsb29yUHJpY2UpICYmIHRoaXMuX3guc2V0KHMuaWQsIHMuY2FjaGVkRmxvb3JQcmljZSksIHMuYmlkcy5mb3JFYWNoKHMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLlB4KHMsIG4sIHQsIGkuY2FsbGluZ1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIGUuYmlkcy5wdXNoKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMubm9CaWRzLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ub0JpZHMucHVzaCh0aGlzLk14KGksIG4sIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTXgodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW06IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IG5ldyBoaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRmxvb3JQcmljZTogdC5yZXF1ZXN0ZWRGbG9vclByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEZsb29yUHJpY2VJbmRleDogdC5mbG9vclByaWNlRmFjdG9ySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiUmVxdWVzdE51bWJlcjogdGhpcy5reCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jZWRVc2VyOiB0LnN5bmNlZFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lckN1c3RvbUhlYWRlcnM6IHQucGFydG5lckN1c3RvbUhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lclJlYXNvbjogdC5wYXJ0bmVyUmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUcmFja2luZ0hhbmRsZWRCeVNlcnZlcjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0LmNvbm5hdGl4UmVhc29uCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFB4KHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy5FeChuLCBpKSwgYSA9IG5ldyBoaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRmxvb3JQcmljZTogbi5yZXF1ZXN0ZWRGbG9vclByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEZsb29yUHJpY2VJbmRleDogbi5mbG9vclByaWNlRmFjdG9ySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VkVXNlcjogbi5zeW5jZWRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YlJlcXVlc3ROdW1iZXI6IHRoaXMua3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJpY2U6IG4uZW5jcnlwdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNwSWQ6IG4uZHNwSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiQWRvbWFpbjogbi5hZG9tYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YlNlYXRJZDogbi5zZWF0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiQ2FtcGFpbklkOiBuLmNhbXBhaWduSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY254QmlkSWQ6IG4uY254QmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRyYWNraW5nSGFuZGxlZEJ5U2VydmVyOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dBdWN0aW9uSW5mb3JtYXRpb246IG4ubG9nQXVjdGlvbkluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyA9IE9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaS5wcm90b0xpbmVJdGVtLmFkVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9BZFR5cGUuVmlkZW86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogT2JqZWN0KExpLmMpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYW5hZ2VyTGluZUl0ZW06IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVRyYWNraW5nTWFjcm9zOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2Vyc0luZm9ybWF0aW9uOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbDogbi52YXN0VGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFNsb3RJZDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1N0YXRlOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFjcm9SZXBsYWNlcjogdGhpcy53eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5PeC5nZXQoaS5wcm90b0xpbmVJdGVtLmFkVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiB0aGlzLk1tLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVNlcnZpY2U6IHRoaXMuTW0uc2VydmljZXMuVmlld2FiaWxpdHlTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZFByaWNlOiBuLmd0a3BicCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLlN4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IG4uY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogbi5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5NbS5jb25maWcub3Mub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuangsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5NbS5jb25maWcucGFnZVVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuTW0uc2VydmljZXMuVXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQWRUeXBlLk92ZXJsYXk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHBoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogT2JqZWN0KExpLmMpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYW5hZ2VyTGluZUl0ZW06IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbi53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuLmhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogbi52YXN0VGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWU6IG4ubWltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVRyYWNraW5nTWFjcm9zOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcnNJbmZvcm1hdGlvbjogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nU3RhdGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRDb250YWluZXI6IHRoaXMuT3guZ2V0KGkucHJvdG9MaW5lSXRlbS5hZFR5cGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTZXJ2aWNlOiB0aGlzLk1tLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZpY2U6IHRoaXMuTW0uc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogbi5ndGtwYnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5TeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiBuLmNyZWF0aXZlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc1JhdGU6IG4uc3VjY2Vzc1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6IHRoaXMuTW0uY29uZmlnLm9zLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2xvdENvbnRhaW5lclJlY3ljbGVyOiB0aGlzLmp4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybFN1ZmZpeGVyU2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5VcmxTdWZmaXhlclNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEV4KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyBIbigpOwogICAgICAgICAgICAgICAgICAgICAgICBxbihpLnByb3RvTGluZUl0ZW0udHJhY2tlcnMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udC5iaWxsaW5nTm90aWNlVXJsTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRRdWFsaXR5Q2hlY2tVcmwKICAgICAgICAgICAgICAgICAgICAgICAgXS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmgpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gem4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZEltcHJlc3Npb24ucHVzaCguLi5zKSwgT2JqZWN0KHJ0LmgpKHQud2luTm90aWNlVXJsKSAmJiBlLmFkV2luLnB1c2goem4odC53aW5Ob3RpY2VVcmwpKSwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTHgodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5wcm90b0xpbmVJdGVtLmFkVHlwZSA9PT0gaC5Qcm90b0FkVHlwZS5PdmVybGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaS5hZENvbnRhaW5lclN0YXRlLmdldChoLlByb3RvQWRUeXBlLlZpZGVvKSwgcyA9IGkuYWRDb250YWluZXJTdGF0ZS5nZXQodC5wcm90b0xpbmVJdGVtLmFkVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oZWlnaHQgIT09IHMuaGVpZ2h0IHx8IGUud2lkdGggIT09IHMud2lkdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHMud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcy5oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSeCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueHguc2hvdWxkUmVxdWVzdExpbmVJdGVtKHQuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0LmFkTWFuYWdlckxpbmVJdGVtLCBoID0gdGhpcy5MeChyLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feC5oYXMoci5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKSAmJiAoYSA9IHRoaXMuX3guZ2V0KHIucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCkpLCBlW3IucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZF0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUmVxdWVzdHM6IHQubWF4QXZhaWxhYmxlUmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwckNvbnNlbnQ6IHRoaXMuTW0uc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmlzQ29uc2VudChyLnByb3RvTGluZUl0ZW0udmVuZG9ySWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEZsb29yUHJpY2U6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZEZsb29yUHJpY2VGYWN0b3JJbmRleGVzOiBjaChyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiByLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90SGVpZ2h0OiBudWxsID09PSAocyA9IGgpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RXaWR0aDogbnVsbCA9PT0gKG4gPSBoKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLndpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSXgodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5OiBzCiAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LmNhbGxpbmdTdGF0ZS5hZENvbnRhaW5lclN0YXRlLmdldChoLlByb3RvQWRUeXBlLlZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLk1tLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5nZXRNZXRhZGF0YU1vZGVsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZHByQ29tcGxpYW50OiB0aGlzLk1tLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5pc0dEUFIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkcHJDb25zZW50RGF0YTogdGhpcy5NbS5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuZ2V0Q29uc2VudFBheWxvYWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kT246IHQuY2FsbGluZ1N0YXRlLnNvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9IZWlnaHQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb1dpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdE1vZGU6ICd0cnVlJyA9PT0gT2JqZWN0KHBuLmIpKGJoLCB0aGlzLk1tLmNvbmZpZy5wYWdlVXJsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvcmF0aW9uTW9kZTogdGhpcy5NbS5jb25maWcuZXhwbG9yYXRpb25Nb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHk6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW06IHRoaXMuZ3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5VUkw6IHRoaXMuTW0uY29uZmlnLmRvbWFpblVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xpY2tUb1BsYXk6IHQuY2FsbGluZ1N0YXRlLmNsaWNrVG9QbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwVmVyc2lvbjogdGhpcy5NbS5jb25maWcuYXBwVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlEOiB0aGlzLk1tLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZS5nZXREZXZpY2VJZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDY3BhQmxvY2tpbmdVc2VySW5mbzogIXRoaXMuTW0uc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmlzU2VsbFVzZXJBbGxvd2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c1ByaXZhY3lTdHJpbmc6IHRoaXMuTW0uc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmdldFVzUHJpdmFjeVN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTa2lwcGFiaWxpdHk6IHRoaXMueXguYWRTa2lwcGFiaWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwQWRBZnRlcjogdGhpcy55eC5za2lwQWRBZnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkcHJDb25zZW50TW9kZTogdGhpcy5NbS5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuZ2RwckNvbnNlbnRNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tTWFjcm9zOiB0aGlzLk1tLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2UuZ2V0RXh0cmFNYWNyb3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEFkRHVyYXRpb246IHQubWF4QWREdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtczogdGhpcy5SeCh0LmxpbmVJdGVtUmVxdWVzdERhdGFMaXN0LCB0LmNhbGxpbmdTdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCaWRQcmljZTogdC5tYXhCaWRQcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbjogdGhpcy55eC5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQ3godCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5reCsrLCBlaC5hLnNlbmRQcm90b1JlcXVlc3QoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IFZpLmEuZW5kUG9pbnRzLmFwaS5ydGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGguUHJvdG9SdGJSZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9SZXNwb25zZTogaC5Qcm90b1J0YlJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBbYWguYl06IEhlLmEudmVyc2lvbiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBBeCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSB0ICYmIDAgIT09IGkgfHwgKE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQmlkZGVyQ2FsbGVyX2RpbWVuc2lvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgd2lkdGg6JHsgdCB9X2hlaWdodDokeyBpIH1fZGVzdHJveWVkOiR7IGYuYS5pc1BsYXllckRlc3Ryb3llZCgpIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtaCA9IGUoMjIpLCBnaCA9IGUoMzcpOwogICAgICAgICAgICAgICAgY29uc3QgeWggPSBbCiAgICAgICAgICAgICAgICAgICAgZ2guYS5QMSwKICAgICAgICAgICAgICAgICAgICBnaC5hLlAyLAogICAgICAgICAgICAgICAgICAgIGdoLmEuUDQsCiAgICAgICAgICAgICAgICAgICAgZ2guYS5QNywKICAgICAgICAgICAgICAgICAgICBnaC5hLlA4CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgY2xhc3Mgd2ggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5EYSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEJ4KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWguYS5DbXBBcGk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gU247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtaC5hLlRjZkFwaToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBqbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGwuZykodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIER4KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuRGEuZ2V0R2RwckNvbnNlbnRBcGlUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkJ4KHQsIGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0geG5bdF0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRhLmlzQ29uc2VudChlLCB5aCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZ4KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhT2JqZWN0KGwuZykodCwga24pIHx8ICEhdGhpcy5EYS5pc1NlbGxVc2VyQWxsb3dlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0JpZGRlckNhbGxhYmxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRGEuaXNHRFBSKCkgPyB0aGlzLkR4KHQpIDogIXRoaXMuRGEuaXNDY3BhQXBwbGljYWJsZSgpIHx8IHRoaXMuRngodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgT2ggPSAodCwgaSwgZSwgcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUHJlYmlkQ2FjaGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlOiB7IHVybDogX24gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyU3luYzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jRW5hYmxlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyczogJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogJ2luY2x1ZGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiAnaW5jbHVkZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY3NQZXJCaWRkZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNEZWxheTogMzAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbkRlbGF5OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1N5bmNFbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnY3JpdGVvJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwdWJDb21tb25JZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7IGVuYWJsZVNoYXJlZElkOiAhMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdfcHViY2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogMTgwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZmxvY0lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHsgdG9rZW46ICdBM2RIVFNvTlVNampFUkJMbHJ2SlNlbE5ud1dVQ3dWUWhaNXROUStzbGw3eStMa1BQVlpYdEI3N3UyeTdDd2VSSXhpWWFHd0dYTmxXMS9kRnA4Vk1FZ0lBQUFCK2V5SnZjbWxuYVc0aU9pSm9kSFJ3Y3pvdkwzTm9ZWEpsWkdsa0xtOXlaem8wTkRNaUxDSm1aV0YwZFhKbElqb2lTVzUwWlhKbGMzUkRiMmh2Y25SQlVFa2lMQ0psZUhCcGNua2lPakUyTWpZeU1qQTNPVGtzSW1selUzVmlaRzl0WVdsdUlqcDBjblZsTENKcGMxUm9hWEprVUdGeWRIa2lPblJ5ZFdWOScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3VpZDInIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXg6IHsgdGltZW91dDogOTAwIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIChuLnNjaGFpbiA9ICh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogJ3N0cmljdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcjogJzEuMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2k6IHQuYnVzaW5lc3NEb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkOiBPYmplY3QocnQuaCkodC5zdXBwbHlDaGFpbklkKSA/IHQuc3VwcGx5Q2hhaW5JZCA6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkoZSkpLCAodCB8fCBpKSAmJiAobi5jb25zZW50TWFuYWdlbWVudCA9ICgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBBcGk6ICdpYWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0R2RwclNjb3BlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dBdWN0aW9uV2l0aG91dENvbnNlbnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cnBvc2U6ICdzdG9yYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlUHVycG9zZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZVZlbmRvcjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZTogJ2Jhc2ljQWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlUHVycG9zZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZVZlbmRvcjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVycG9zZTogJ21lYXN1cmVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlUHVycG9zZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZVZlbmRvcjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzcDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBBcGk6ICdpYWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAyMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBpKSksIE9iamVjdChydC5oKShzKSAmJiAobi5wYWdlVXJsID0gcyksIG47CiAgICAgICAgICAgICAgICAgICAgfSwgeGggPSBbLi4uQ25dLCBTaCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgVG4uVkFTVF8yX1dSQVBQRVIsCiAgICAgICAgICAgICAgICAgICAgICAgIFRuLlZBU1RfMiwKICAgICAgICAgICAgICAgICAgICAgICAgVG4uVkFTVF8zLAogICAgICAgICAgICAgICAgICAgICAgICBUbi5WQVNUXzNfV1JBUFBFUgogICAgICAgICAgICAgICAgICAgIF0sIGpoID0gWwogICAgICAgICAgICAgICAgICAgICAgICBNbi5WUEFJRF8xLAogICAgICAgICAgICAgICAgICAgICAgICBNbi5WUEFJRF8yCiAgICAgICAgICAgICAgICAgICAgXSwga2ggPSAodCwgaSwgZSwgcywgbikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogT2JqZWN0KExpLmMpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogZSA/ICdvdXRzdHJlYW0nIDogJ2luc3RyZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IHhoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IFNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lYXJpdHk6IFBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6IGpoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcmtzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNbi5WUEFJRF8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW4uVlBBSURfMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluRHVyYXRpb246IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogW10KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5lKShuKSAmJiAoci5mbG9vcnMgPSAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHsgZmllbGRzOiBbJ21lZGlhVHlwZSddIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiB7IHZpZGVvOiB0IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG4pKSwgcjsKICAgICAgICAgICAgICAgICAgICB9LCBfaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgW3duLkFwcE5leHVzXTogKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QuYXNzaWduKHt9LCB0KSwgcyA9IGkuZmxvb3JQcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkocykgJiYgKGUucmVzZXJ2ZSA9IHMpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uRGlzdHJpY3RNXTogKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QuYXNzaWduKHt9LCB0KSwgcyA9IGkuZmxvb3JQcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkocykgJiYgKGUucmVzZXJ2ZSA9IHMpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uVGVsYXJpYV06ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zcmNQYWdlVXJsIHx8IChlLnNyY1BhZ2VVcmwgPSBpLnBhZ2VVcmwpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uT25lVmlkZW9dOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmgpKHQucHViSWQpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0hlYWRlckJpZGRlcl9PbmVWaWRlb19wdWJJZF9taXNzaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHViSWQ6IHQucHViSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJXaWR0aDogTWF0aC5mbG9vcihpLnBsYXllcldpZHRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckhlaWdodDogTWF0aC5mbG9vcihpLnBsYXllckhlaWdodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lczogeGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IFNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiBqaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiB7IHBhZ2U6IGkucGFnZVVybCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMgPSBpLmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmUpKHMpICYmIChlLmJpZGZsb29yID0gcyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5JbmRleEV4Y2hhbmdlXTogKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnNpdGVJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KHJ0LmgpKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfSVhfYWRhcHRlcl9taXNzaW5nX3NpdGVJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gT2JqZWN0LmtleXMoVG4pLm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRuW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlSWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoaS5wbGF5ZXJXaWR0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGkucGxheWVySGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IENuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogaS5tYXhEdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sczogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5kKSh0Lm1pbmR1cmF0aW9uKSAmJiAoci52aWRlby5taW5kdXJhdGlvbiA9IHQubWluZHVyYXRpb24pLCBPYmplY3QocnQuZCkodC5tYXhkdXJhdGlvbikgJiYgdC5tYXhkdXJhdGlvbiA8PSBpLm1heER1cmF0aW9uICYmIChyLnZpZGVvLm1heGR1cmF0aW9uID0gdC5tYXhkdXJhdGlvbiksIE9iamVjdChydC5oKSh0LmlkKSAmJiAoci5pZCA9IHQuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IGkuZmxvb3JQcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkoYSkgJiYgKHIuYmlkRmxvb3IgPSBhLCByLmJpZEZsb29yQ3VyID0gJ1VTRCcpLCByOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uUnViaWNvbl06ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdCksIHMgPSBpLmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmUpKHMpICYmIChlLmZsb29yID0gcyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5SaHl0aG1PbmVdOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpLCBzID0gaS5mbG9vclByaWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5lKShzKSAmJiAoZS5mbG9vciA9IHMpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uUHVibWF0aWNdOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpLCBzID0gaS5mbG9vclByaWNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5lKShzKSAmJiAoZS5rYWRmbG9vciA9IFN0cmluZyhzKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5TcG90WF06ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhpZGVfc2tpbiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGkuZmxvb3JQcmljZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkocykgJiYgKGUucHJpY2VfZmxvb3IgPSBzKSwgaS5pc091dHN0cmVhbSAmJiAoZS5vdXRzdHJlYW1fb3B0aW9ucyA9IHsgc2xvdDogaS5iaWRTbG90SWQgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5NZWRpYU5ldF06ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuaCkoZS5jaWQpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZEpTX01lZGlhTmV0X2FkYXB0ZXJfbWlzc2luZ19jaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KHJ0LmgpKGUuY3JpZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfTWVkaWFOZXRfYWRhcHRlcl9taXNzaW5nX2NyaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpLmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmUpKHMpICYmIChlLmJpZEZsb29yID0gcyksIGUudmlkZW8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiBPYmplY3Qua2V5cyhNbikubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW5bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IE9iamVjdC5rZXlzKENuKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDblt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IE9iamVjdC5rZXlzKFRuKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUblt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEdXJhdGlvbjogaS5tYXhEdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBpLnBsYXllcldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGkucGxheWVySGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uQWRtYW5dOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKShlLnBsYWNlbWVudElkKSB8fCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmViaWRKU19BZG1hbl9hZGFwdGVyX21pc3NpbmdfcGxhY2VtZW50SWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLklyb25Tb3VyY2VdOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmgpKGUuaXNPcmcpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZEpTX0lyb25Tb3VyY2VfYWRhcHRlcl9taXNzaW5nX2lzT3JnX3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLmxpbmVJdGVtSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2Zsb29yUHJpY2U6IHN9ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuZSkocykgJiYgKGUuZmxvb3JQcmljZSA9IHMpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uVW5kZXJ0b25lXTogKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QuYXNzaWduKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuaCkoZS5wbGFjZW1lbnRJZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfVW5kZXJ0b25lX2FkYXB0ZXJfbWlzc2luZ19wbGFjZW1lbnRJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLmxpbmVJdGVtSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QocnQuZCkoZS5wdWJsaXNoZXJJZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfVW5kZXJ0b25lX2FkYXB0ZXJfbWlzc2luZ19wdWJsaXNoZXJJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLmxpbmVJdGVtSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBbd24uU3luYWNvck1lZGlhXTogKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QuYXNzaWduKHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5oKShlLnNlYXRJZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfU3luYWNvck1lZGlhX2FkYXB0ZXJfbWlzc2luZ19zZWF0SWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KHJ0LmgpKGUudGFnSWQpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZEpTX1N5bmFjb3JNZWRpYV9hZGFwdGVyX21pc3NpbmdfdGFnSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBpLmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmUpKHMpICYmIChlLmJpZGZsb29yID0gcyksIGUudmlkZW8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiBPYmplY3Qua2V5cyhNbikubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTW5bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IE9iamVjdC5rZXlzKENuKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDblt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IE9iamVjdC5rZXlzKFRuKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUblt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogaS5tYXhEdXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLkFteFJUQl06ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgdCksIHMgPSBpLmZsb29yUHJpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmUpKHMpICYmIChlLmZsb29yID0gcyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFt3bi5TbWFhdG9dOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKShlLnB1Ymxpc2hlcklkKSB8fCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmViaWRKU19TbWFhdG9fYWRhcHRlcl9taXNzaW5nX3B1Ymxpc2hlcklkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGkubGluZUl0ZW1JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdChydC5oKShlLmFkc3BhY2VJZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfU21hYXRvX2FkYXB0ZXJfbWlzc2luZ19hZHNwYWNlSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgW3duLlNtYXJ0QWRTZXJ2ZXJdOiAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpLCB7Zmxvb3JQcmljZTogc30gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmUpKHMpICYmIChlLmJpZGZsb29yID0gcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0LnZpZGVvKSwgeyBwcm90b2NvbDogVG4uVkFTVF8zX1dSQVBQRVIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52aWRlbyA9IHIsIE9iamVjdChydC5lKShlLm5ldHdvcmtJZCkgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkSlNfU21hcnRBZFNlcnZlcl9hZGFwdGVyX21pc3NpbmdfbmV0d29ya0lkX2ludGVnZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KHJ0LmUpKGUuZm9ybWF0SWQpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZEpTX1NtYXJ0QWRTZXJ2ZXJfYWRhcHRlcl9taXNzaW5nX2Zvcm1hdElkX2ludGVnZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaS5saW5lSXRlbUlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0KHJ0LmUpKGUucGFnZUlkKSB8fCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmViaWRKU19TbWFydEFkU2VydmVyX2FkYXB0ZXJfbWlzc2luZ19wYWdlSWRfaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLmxpbmVJdGVtSWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QocnQuZSkoZS5zaXRlSWQpIHx8IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZWJpZEpTX1NtYXJ0QWRTZXJ2ZXJfYWRhcHRlcl9taXNzaW5nX3NpdGVJZF9pbnRlZ2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGkubGluZUl0ZW1JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBBaCA9ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gSlNPTi5wYXJzZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxlbmd0aCA+IDEgJiYgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQWRTb3VyY2VXcmFwcGVfbXVsdGlwbGVfYmlkZGVycycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGVbMF0uYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9BZFNvdXJjZVdyYXBwZXJfY2Fubm90X2dldF9iaWRkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgSWggPSAtMTsKICAgICAgICAgICAgICAgIGNsYXNzIENoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVnggPSB0LCB0aGlzLldlID0gaSwgdGhpcy5neCA9IGUsIHRoaXMuVXggPSBzLCB0aGlzLiR4ID0gbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhlYWRlckJpZGRlcih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocywgbikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OeCgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSHgodCwgaSwgZSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChuKS50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLk5vQmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSHgodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuYXZhaWxhYmxlUmVxdWVzdHMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQubGluZUl0ZW0uZmxvb3JQcmljZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChsLmgpKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0aGlzLnF4KHMsIHQuYXZhaWxhYmxlUmVxdWVzdHMsIHQubWF4QmlkUHJpY2UpLm1hcChuID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnp4KHQubGluZUl0ZW0sIG4uZmxvb3JQcmljZSwgbi5mbG9vclByaWNlSW5kZXgsIGksIGUsIHMsIHQubWF4QWREdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBJaCwgaCA9IHRoaXMuengodC5saW5lSXRlbSwgdC5saW5lSXRlbS5mbG9vclByaWNlLCByLCBpLCBlLCBzLCB0Lm1heEFkRHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwobikudGhlbihpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gW10sIG4gPSBbXSwgciA9IHQubGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlYXNvbiA/IG4ucHVzaCh0KSA6IGUucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1JZDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6eCh0LCBpLCBlLCBzLCBuLCByLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV3godCwgaSwgZSwgcywgbiwgciwgaCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTngoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBianMgPyAodGhpcy5HeCA9IHdpbmRvdy5wYmpzLCB0KCkpIDogT2JqZWN0KFQueCkoeyBzcmM6IEluIH0sIHdpbmRvdy5kb2N1bWVudC5oZWFkLCB3aW5kb3csICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkd4ID0gd2luZG93LnBianMsIHRoaXMuSngoKSwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Ob0JpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCwgJ0FkTWFuYWdlcl9IZWFkZXJCaWRkZXJfdW5hYmxlX3RvX2luc2VydF9wcmViaWRKc19zY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEp4KCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gT2godGhpcy5VeCwgdGhpcy4keCwgdGhpcy5WeCwgdGhpcy5XZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYmpzLnNldENvbmZpZyh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV3godCwgaSwgZSwgcywgciwgYSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGMsIHUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBraChzLCByLCB0aGlzLmd4LCBvLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQuaGVhZGVyQmlkZGVyQmlkczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmJpZHMgPSBKU09OLnBhcnNlKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfSGVhZGVyQmlkZGVyX3VuYWJsZV90b19wYXJzZV9oZWFkZXJfYmlkZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdm9pZCB1KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLk5vQmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlSW5kZXg6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGQgPSBPcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5iaWRzLmZvckVhY2goZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUXgoZSwgcywgciwgaSwgdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCwgbywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5HeC5xdWUucHVzaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HeC5hZGRBZFVuaXRzKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IHQuaGVhZGVyQmlkZGVyVGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0czogW2xdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzQmFja0hhbmRsZXI6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocyA9IHRoaXMuR3guZ2V0SGlnaGVzdENwbUJpZHMobC5jb2RlKVswXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkNzRW1wdHlSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUHJpY2U6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlSW5kZXg6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLlh4KHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0hlYWRlckJpZGRlcl9ub19jb250ZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogSlNPTi5zdHJpbmdpZnkocykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZvaWQgdSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uQ3NJbnZhbGlkUmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZUluZGV4OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLll4KHMpLCBvID0gcy5jcG0gfHwgcy5hZFJlc3BvbnNlLmFkLmNwbSwge2FkdmVydGlzZXJMaW5lSXRlbUlkOiBmfSA9IHQsIHAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFRhZzogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtSWQ6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZUluZGV4OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElkOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmUpKGkpICYmIG8gPCBpICYmIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9IZWFkZXJCaWRkZXJSZXF1ZXN0ZXJfY3BtX2xvd2VyX3RoYW5fZmxvb3JwcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogYGZsb29yUHJpY2VzXyR7IGEgfV9pbmRleF8keyBlIH1fY3BtXyR7IG8gfV9saV8keyB0LmFkdmVydGlzZXJMaW5lSXRlbUlkIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IEFoKHQuaGVhZGVyQmlkZGVyQmlkcywgdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYyhwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0hlYWRlckJpZGRlcl9QcmViaWRqc19lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5Ob0JpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZUluZGV4OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR3gucmVxdWVzdEJpZHMocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFF4KHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IF9oW3QuYmlkZGVyXTsKICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAodC5wYXJhbXMgPSBhKHQucGFyYW1zLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJXaWR0aDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllckhlaWdodDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heER1cmF0aW9uOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVVybDogdGhpcy5XZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUHJpY2U6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbUlkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRzdHJlYW06IHRoaXMuZ3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IGgKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYeCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFkc2VydmVyVGFyZ2V0aW5nICYmIE9iamVjdChydC5oKSh0LmFkc2VydmVyVGFyZ2V0aW5nLmhiX2NhY2hlX2lkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWXgodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7IF9uIH0/dXVpZD0keyB0LmFkc2VydmVyVGFyZ2V0aW5nLmhiX2NhY2hlX2lkIH1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxeCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0Lm1hcCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUHJpY2VJbmRleDogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKCh7Zmxvb3JQcmljZTogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID49IGUgJiYgcyA+IDAgJiYgKHMtLSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubGVuZ3RoIHx8IG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZUluZGV4OiBJaAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBUaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiwgciwgaCwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmd4ID0gdCwgdGhpcy5WeCA9IGksIHRoaXMuTW0gPSBlLCB0aGlzLnd4ID0gcywgdGhpcy5PeCA9IG4sIHRoaXMuU3ggPSByLCB0aGlzLmp4ID0gaCwgdGhpcy5fdyA9IGEsIHRoaXMuS3ggPSBuZXcgTWFwKCksIHRoaXMuWnggPSBuZXcgQ2godGhpcy5WeCwgdGhpcy5NbS5jb25maWcucGFnZVVybCwgdGhpcy5neCwgdGhpcy5NbS5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UuaXNHRFBSKCksIHRoaXMuTW0uc2VydmljZXMuVXNlck1hbmFnZXJTZXJ2aWNlLmlzQ2NwYUFwcGxpY2FibGUoKSksIHRoaXMudFMgPSBuZXcgd2godGhpcy5NbS5zZXJ2aWNlcy5Vc2VyTWFuYWdlclNlcnZpY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQuY2FsbGluZ1N0YXRlLmFkQ29udGFpbmVyU3RhdGUuZ2V0KGguUHJvdG9BZFR5cGUuVmlkZW8pLCBzID0gdGhpcy5BeChpLCBlKSwgbiA9IHRoaXMuaVModC5saW5lSXRlbVJlcXVlc3REYXRhTGlzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QobC5oKShuKSAmJiBzID8gKHQubGluZUl0ZW1SZXF1ZXN0RGF0YUxpc3QgPSBuLCB0aGlzLmVTKHQpLnRoZW4oaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc1MoaSwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogUHJvbWlzZS5yZXNvbHZlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9CaWRzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc1ModCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gb2goaS5saW5lSXRlbVJlcXVlc3REYXRhTGlzdCwgdC5saW5lSXRlbUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYmlkcy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBuZXcgSG4oKSwgciA9IG5ldyBoaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGbG9vclByaWNlOiB0LmZsb29yUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGbG9vclByaWNlSW5kZXg6IHQuZmxvb3JQcmljZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYmlkSnNCaWRkZXJOYW1lOiB0aGlzLm5TKHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFuKHMucHJvdG9MaW5lSXRlbS50cmFja2VycywgbiksIGUuYmlkcy5wdXNoKG5ldyByaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBPYmplY3QoTGkuYykoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYW5hZ2VyTGluZUl0ZW06IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VUcmFja2luZ01hY3JvczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRhZGF0YTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcnNJbmZvcm1hdGlvbjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0LmFkVGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nU3RhdGU6IGkuY2FsbGluZ1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hY3JvUmVwbGFjZXI6IHRoaXMud3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyOiB0aGlzLk94LmdldChzLnByb3RvTGluZUl0ZW0uYWRUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiB0aGlzLk1tLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTZXJ2aWNlOiB0aGlzLk1tLnNlcnZpY2VzLlZpZXdhYmlsaXR5U2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2aWNlOiB0aGlzLk1tLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0LmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5TeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6IHRoaXMuTW0uY29uZmlnLm9zLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3RDb250YWluZXJSZWN5Y2xlcjogdGhpcy5qeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2xvdElkOiB0LnNsb3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEFkV2hlbkZpbmlzaGVkOiB0aGlzLl93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVXJsOiB0aGlzLk1tLmNvbmZpZy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuTW0uc2VydmljZXMuVXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQubm9CaWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBoaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEZsb29yUHJpY2U6IHQuZmxvb3JQcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRmxvb3JQcmljZUluZGV4OiB0LmZsb29yUHJpY2VJbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubm9CaWRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHQucmVhc29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQuY2FsbGluZ1N0YXRlLmFkQ29udGFpbmVyU3RhdGUuZ2V0KGguUHJvdG9BZFR5cGUuVmlkZW8pLCBzID0gdC5saW5lSXRlbVJlcXVlc3REYXRhTGlzdC5tYXAoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuclMoaSwgdC5tYXhBZER1cmF0aW9uLCB0Lm1heEJpZFByaWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aeC5yZXF1ZXN0SGVhZGVyQmlkZGVyKHMsIGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByUyh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LmFkTWFuYWdlckxpbmVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlUmVxdWVzdHM6IHQubWF4QXZhaWxhYmxlUmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbTogcy5wcm90b0xpbmVJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWREdXJhdGlvbjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJpZFByaWNlOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMublModC5hZE1hbmFnZXJMaW5lSXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oUyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEF4KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IHQgJiYgMCAhPT0gaSB8fCAoT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9QcmViaWRBZ2dyZWdhdG9yX2RpbWVuc2lvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgd2lkdGg6JHsgdCB9X2hlaWdodDokeyBpIH1fZGVzdHJveWVkOiR7IGYuYS5pc1BsYXllckRlc3Ryb3llZCgpIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoUyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRTLmlzQmlkZGVyQ2FsbGFibGUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5TKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuS3guZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmgpKGkpID8gaSA6IEFoKHQucHJvdG9MaW5lSXRlbS5oZWFkZXJCaWRkZXJCaWRzLCB0LnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQpIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IFBoID0gewogICAgICAgICAgICAgICAgICAgICAgICBsaWJQcm9wZXJ0eU5hbWU6ICdhcHN0YWcnLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6ICd2aWRlbycKICAgICAgICAgICAgICAgICAgICB9LCBNaCA9ICdodHRwczovL2FheC5hbWF6b24tYWRzeXN0ZW0uY29tL2UvZHRiL3Zhc3QnLCBFaCA9ICdsb2FkJzsKICAgICAgICAgICAgICAgIGNsYXNzIExoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTW0gPSB0LCB0aGlzLmFTID0gaSwgdGhpcy5vUyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY1MgfHwgdGhpcy51UygpLCB0aGlzLmxTICYmIGNsZWFySW50ZXJ2YWwodGhpcy5sUyksIHRoaXMuY1MgfHwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdUYW1SZXF1ZXN0ZXJfVEFNX2xpYl9ub3RfZm91bmRfb25fcGFnZV9sb2FkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuTW0uY29uZmlnLnRvcFdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kUyA9IE9iamVjdChMaS5mKShlKS50b3BGcmFtZSwgdGhpcy51UygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qmlkcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZTKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxTICYmIGNsZWFySW50ZXJ2YWwodGhpcy5sUyksIHRoaXMuZFMucmVtb3ZlRXZlbnRMaXN0ZW5lcihFaCwgdGhpcy5vUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucFModGhpcy5hUywgUGgubWVkaWFUeXBlLCB0LmFtYXpvbkRlYWxJZCkudGhlbihpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFtYXpvbkRlYWxJZCA/IHRoaXMuYlModCwgaSkgOiB0aGlzLnZTKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1JZDogdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1JZDogdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZHM6IFt7IHJlYXNvbjogaSB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBTKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChzLCBuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNTID8gdGhpcy5jUy5mZXRjaEJpZHMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElEOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5oKSh0KSA/IE9iamVjdChydC5oKShlKSA/IHModGhpcy5tUyh0LCBlKSkgOiBzKHRoaXMuZ1ModCkpIDogbihoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkVtcHR5UmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBuKGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uTm9MaWJJblBhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ1ModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKGksIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnlTKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QobC5oKShzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53UygpLCB2b2lkIGUoaC5Db25uYXRpeE5vQmlkUmVhc29uRW51bS5JbnZhbGlkUmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaShzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1TKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChlLCBzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5PUyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KGwuaCkobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud1MoKSwgdm9pZCBzKGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uSW52YWxpZFJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudGFyZ2V0aW5nLmFtem5kZWFscy5pbmNsdWRlcyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA/IGUocikgOiBzKGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uRGVhbElkTWlzbWF0Y2gpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeVModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhISh0LmFtem5iaWQgfHwgKG51bGwgPT09IChpID0gdC50YXJnZXRpbmcpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuYW16bmlpZCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT1ModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QobC5oKShudWxsID09PSAoaSA9IHQudGFyZ2V0aW5nKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmFtem5kZWFscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3UygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1RhbVJlcXVlc3Rlcl9GZXRjaEJpZHNfQ3JlYXRpdmVUeXBlX01pc21hdGNoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2Uyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1JZDogdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IGkuYW16bmJpZCB8fCAobnVsbCA9PT0gKGUgPSBpLnRhcmdldGluZykgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5hbXpuYmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLk1tLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5nZXRNZXRhZGF0YU1vZGVsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsb3JhdGlvbjogdGhpcy5NbS5jb25maWcuZXhwbG9yYXRpb25Nb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWguYS5zZW5kUHJvdG9SZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludDogVmkuYS5lbmRQb2ludHMuYXBpLnRhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IGguUHJvdG9Db3JlVGFtQmlkUmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1Jlc3BvbnNlOiBoLlByb3RvQ29yZVRhbUJpZFJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IFthaC5iXTogSGUuYS52ZXJzaW9uIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKHMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5oKShzLmVycm9yTWVzc2FnZSkgPyBlKGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uUmVxdWVzdEV4Y2VwdGlvbikgOiBzLmVuY3J5cHRlZEJpZFByaWNlID8gdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFByaWNlOiBzLmVuY3J5cHRlZEJpZFByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0VGFnOiB0aGlzLnhTKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnNrcDogcy5vZnNrcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc1JhdGU6IHMuc3VjY2Vzc1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RJZDogT3IoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZShoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLkludmFsaWRSZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShoLkNvbm5hdGl4Tm9CaWRSZWFzb25FbnVtLlJlcXVlc3RFeGNlcHRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBiUyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRQcmljZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhc3RUYWc6IHRoaXMuU1MoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnNrcDogQm4odC5mbG9vclByaWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiB0LnN1Y2Nlc3NSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdElkOiBPcigpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhTKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0LmFtem5paWQgfHwgKG51bGwgPT09IChpID0gdC50YXJnZXRpbmcpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuYW16bmlpZCksIG4gPSB0LmFtem5iaWQgfHwgKG51bGwgPT09IChlID0gdC50YXJnZXRpbmcpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuYW16bmJpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsgTWggfT9iPSR7IHMgfSZwcD0keyBuIH0mcm5kPSR7IE9iamVjdChMaS5jKSgpIH1gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTUyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmhlbHBlcnMudGFyZ2V0aW5nS2V5c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyBNaCB9P2I9JHsgdC50YXJnZXRpbmdbaV0gfSZybmQ9JHsgT2JqZWN0KExpLmMpKCkgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVTKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRTW1BoLmxpYlByb3BlcnR5TmFtZV0gPyB0aGlzLmNTID0gdGhpcy5kU1tQaC5saWJQcm9wZXJ0eU5hbWVdIDogdGhpcy5sUyB8fCAnY29tcGxldGUnICE9PSB0aGlzLmRTLmRvY3VtZW50LnJlYWR5U3RhdGUgJiYgKHRoaXMuZFMuYWRkRXZlbnRMaXN0ZW5lcihFaCwgdGhpcy5vUyksIHRoaXMubFMgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVTKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHF0LmYpKSwgdGhpcy5jUyAmJiBjbGVhckludGVydmFsKHRoaXMubFMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFJoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTW0gPSB0LCB0aGlzLmpTID0gaSwgdGhpcy53eCA9IGUsIHRoaXMuT3ggPSBzLCB0aGlzLlN4ID0gbiwgdGhpcy5qeCA9IHIsIHRoaXMua1MgPSBuZXcgTGgodGhpcy5NbSwgdGhpcy5qUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZQogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5jYWxsaW5nU3RhdGUuYWRDb250YWluZXJTdGF0ZS5nZXQoaC5Qcm90b0FkVHlwZS5WaWRlbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkF4KGksIGUpID8gdGhpcy5fUyh0KS50aGVuKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLkFTKGksIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9CaWRzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogUHJvbWlzZS5yZXNvbHZlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9CaWRzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rUy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9TKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQubGluZUl0ZW1SZXF1ZXN0RGF0YUxpc3QubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmtTLnJlcXVlc3RCaWRzKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBBUyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vQmlkczogW10KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBvaChpLmxpbmVJdGVtUmVxdWVzdERhdGFMaXN0LCB0LmxpbmVJdGVtSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5iaWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBIbigpLCByID0gbmV3IGhoKHsgZW5jcnlwdGVkUHJpY2U6IHQuZW5jcnlwdGVkUHJpY2UgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW4ocy5wcm90b0xpbmVJdGVtLnRyYWNrZXJzLCBuKSwgZS5iaWRzLnB1c2gobmV3IHJoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE9iamVjdChMaS5jKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVRyYWNraW5nTWFjcm9zOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2Vyc0luZm9ybWF0aW9uOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHQudmFzdFRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2xvdElkOiB0LnNsb3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1N0YXRlOiBpLmNhbGxpbmdTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYWNyb1JlcGxhY2VyOiB0aGlzLnd4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5PeC5nZXQocy5wcm90b0xpbmVJdGVtLmFkVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5U2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmljZTogdGhpcy5NbS5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRW5mb3JjZXI6IHRoaXMuU3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RXaXRoQ3JlZGVudGlhbHM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdC5zdWNjZXNzUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JmdXNjYXRlZFByaWNlOiB0Lm9mc2twLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5NbS5jb25maWcub3Mub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2xvdENvbnRhaW5lclJlY3ljbGVyOiB0aGlzLmp4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVXJsOiB0aGlzLk1tLmNvbmZpZy5wYWdlVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuTW0uc2VydmljZXMuVXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQubm9CaWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ub0JpZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IG5ldyBoaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IHQucmVhc29uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEF4KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IHQgJiYgMCAhPT0gaSB8fCAoT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9QcmViaWRBZ2dyZWdhdG9yX2RpbWVuc2lvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBgd2lkdGg6JHsgdCB9X2hlaWdodDokeyBpIH1fZGVzdHJveWVkOiR7IGYuYS5pc1BsYXllckRlc3Ryb3llZCgpIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IEJoID0gWwogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NgogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzMKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIF0sIERoID0gJ2RvbWFpbnMnOwogICAgICAgICAgICAgICAgY2xhc3MgRmggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JUyA9IHQsIHRoaXMuQ1MgPSBpLCB0aGlzLlRTID0gZSwgdGhpcy5zeCA9IGBkaXYtZ3B0LWFkLTE1ODk1NDk4MDYyMTEtJHsgT2JqZWN0KExpLmMpKCkgfWAsIHRoaXMubnggPSBuZXcgamkoKSwgdGhpcy5KeSA9IG5ldyBqaSgpLCB0aGlzLk15ID0gbmV3IGppKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkNyZWF0aXZlUmVjZWl2ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk15LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25EaXNwbGF5QWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm54LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25FcnJvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSnkuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFIZWlnaHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBTID8gdGhpcy5QUy5jbGllbnRIZWlnaHQgOiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZE1lZGlhV2lkdGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBTID8gdGhpcy5QUy5jbGllbnRXaWR0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVBZCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1TID0gdCwgdGhpcy5ieSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkVTKGkud2lkdGgsIGkuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSVMuY21kLnB1c2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTFMgPSB0aGlzLklTLmRlZmluZVNsb3QodGhpcy5UUywgZSwgdGhpcy5zeCkuYWRkU2VydmljZSh0aGlzLklTLnB1YmFkcygpKS5zZXRUYXJnZXRpbmcoRGgsIHRoaXMuQ1MpLCB0aGlzLklTLmVuYWJsZVNlcnZpY2VzKCksIHRoaXMuUlModGhpcy5MUyksIHRoaXMuSVMucHViYWRzKCkuaXNJbml0aWFsTG9hZERpc2FibGVkKCkgJiYgdGhpcy5JUy5wdWJhZHMoKS5yZWZyZXNoKFt0aGlzLkxTXSksIHRoaXMuSVMuZGlzcGxheSh0aGlzLnN4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkp5Lm5leHQoWW4uYy5XcmFwcGVySW5pdEFkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSVMuY21kLnB1c2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JUy5kZXN0cm95U2xvdHMgJiYgdGhpcy5MUyAmJiB0aGlzLklTLmRlc3Ryb3lTbG90cyhbdGhpcy5MU10pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUlModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklTLnB1YmFkcygpLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RPbmxvYWQnLCBpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBzLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuc2xvdCA9PT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBudWxsID09PSAociA9IG51bGwgPT09IChzID0gbnVsbCA9PT0gKGUgPSBpKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLnNsb3QpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuZ2V0UmVzcG9uc2VJbmZvcm1hdGlvbigpKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLmNyZWF0aXZlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdGhpcy5NeS5uZXh0KHQudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0dwdFdyYXBwZXJfY3JlYXRpdmVJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm54Lm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuSVMucHViYWRzKCkuYWRkRXZlbnRMaXN0ZW5lcignc2xvdFJlbmRlckVuZGVkJywgdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNsb3QgPT09IHRoaXMuTFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBTID0gbnVsbCA9PT0gKGkgPSB0aGlzLk1TKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZnJhbWUnKVswXSwgT2JqZWN0KHJ0LmEpKHRoaXMuTFMpICYmIE9iamVjdChULkYpKHRoaXMuUFMuY29udGVudFdpbmRvdywgJ0dQVFdyYXBwZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaXNFbXB0eSAmJiB0aGlzLkp5Lm5leHQoWW4uYy5BZHhPdmVybGF5Tm9GaWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJ5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5pZCA9IHRoaXMuc3g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVTKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJoLmZpbHRlcihlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheShlKSB8fCAhT2JqZWN0KGwuaSkoZSkgfHwgT2JqZWN0KGwuaCkoZSkgJiYgZVswXSA8PSB0ICYmIGVbMV0gPD0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFZoID0gZSg1MCk7CiAgICAgICAgICAgICAgICBjb25zdCBVaCA9IDUwMDsKICAgICAgICAgICAgICAgIGNsYXNzICRoIGV4dGVuZHMgY3IgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCksIHRoaXMuc2V0dGluZ3MgPSB0LCB0aGlzLmFkTWVkaWFUeXBlID0gJ2Rpc3BsYXlBZHgnLCB0aGlzLmFkU291cmNlVHlwZSA9IGguUHJvdG9BZHNvdXJjZVR5cGVFbnVtLlVua25vd24sIHRoaXMubHggPSAnYWR4JywgdGhpcy5CUyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOdC5GaXJzdFF1YXJ0aWxlXTogUHQuYi5BZFZpZGVvRmlyc3RRdWFydGlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOdC5TZWNvbmRRdWFydGlsZV06IFB0LmIuQWRWaWRlb01pZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW050LlRoaXJkUXVhcnRpbGVdOiBQdC5iLkFkVmlkZW9UaGlyZFF1YXJ0aWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW050LkZvdXJ0aFF1YXJ0aWxlXTogUHQuYi5BZFZpZGVvQ29tcGxldGUKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5EUyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLm92ZXJsYXlUaW1lICogcXQuZjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieCA9IG5ldyBfaShpLCBVaCksIHRoaXMuRFMucHVzaCh0aGlzLmJ4Lm9uVGltZVVwZGF0ZS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7IHR5cGU6IFB0LmIuQWRSZW1haW5pbmdUaW1lQ2hhbmdlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5ieC5vblRpbWVFbGFwc2VkLnN1YnNjcmliZSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBZCgnYWR4VGltZXJFbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmJ4Lm9uUXVhcnRpbGUuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5CU1t0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEFkKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXRBZCh0LCBpLCBlLCBzLCBuLCByLCBoKSwgdGhpcy5GUyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuVlMoKS50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJFMgPSBuZXcgRmgodCwgdGhpcy5zZXR0aW5ncy5kb21haW4sIHRoaXMuc2V0dGluZ3MuYWR4QWRVbml0UGF0aCksIHRoaXMuRFMucHVzaCh0aGlzLiRTLm9uQ3JlYXRpdmVSZWNlaXZlZC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRpdmVJZCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZExvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBza2lwT2Zmc2V0OiAwIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkFkeE92ZXJsYXlHcHRTY3JpcHRMb2FkICsgYF8keyB0Lm1lc3NhZ2UgfWAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7IGVycm9yTWVzc2FnZTogWW4uYy5BZGFwdG9ySW5pdEFkRXJyb3IgKyBgXyR7IHQubWVzc2FnZSB9YCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnRBZCgpLCB0aGlzLkRTLnB1c2godGhpcy4kUy5vbkRpc3BsYXlBZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoeyB0eXBlOiBQdC5iLkFkU3RhcnRlZCB9KSwgdGhpcy5aZyh7IHR5cGU6IFB0LmIuQWRWaWRlb1N0YXJ0IH0pLCB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEltcHJlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYnguc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiRTLm9uRXJyb3Iuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiB0IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5ieC5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuJFMuaW5pdGlhbGl6ZUFkKHRoaXMuTmcsIHRoaXMuRlMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuQWRhcHRvclN0YXJ0QWRFcnJvciArIGBfJHsgdC5leGNlcHRpb24gfWAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcEFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0b3BBZCh0KSwgdGhpcy5ieC5zdG9wKCksIHRoaXMuWmcoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRTdG9wcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgc2hvdWxkVHJhY2tQb3N0QmlkOiAhMCB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnQWR4QmlkQWRhcHRvcicsICdzdG9wQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXNpemVBZCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlMgJiYgKHRoaXMuRlMud2lkdGggPSB0LCB0aGlzLkZTLmhlaWdodCA9IGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXVzZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ieC5zdG9wKCksIHRoaXMuWmcoeyB0eXBlOiBQdC5iLkFkUGF1c2VkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdBZHhCaWRBZGFwdG9yJywgJ3BhdXNlQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXN1bWVBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnguc3RhcnQoKSwgdGhpcy5aZyh7IHR5cGU6IFB0LmIuQWRQbGF5aW5nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdBZHhCaWRBZGFwdG9yJywgJ3Jlc3VtZUFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhwYW5kQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQWQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNraXBBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNraXBBZCgpLCB0aGlzLlpnKHsgdHlwZTogUHQuYi5BZFNraXBwZWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0FkeEJpZEFkYXB0b3InLCAnc2tpcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRSZW1haW5pbmdUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ieC50aW1lUmVtYWluaW5nIC8gcXQuZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWREdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYngudGltZXJEdXJhdGlvbiAvIHF0LmY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkVm9sdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRNZWRpYVNpemUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy4kUy5nZXRBZE1lZGlhV2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy4kUy5nZXRBZE1lZGlhSGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWRWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYWRWaWRlb1VybCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubHg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZWNsYXJlZER1cmF0aW9uSW5TZWNvbmRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWUygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChMaS5mKSh3aW5kb3cpLnRvcEZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5nb29nbGV0YWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQuZ29vZ2xldGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsgY21kOiBbXSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ29vZ2xldGFnID0gd2luZG93Lmdvb2dsZXRhZyB8fCBpLCBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULngpKHsgc3JjOiBWaC5hIH0sIHQuZG9jdW1lbnQuaGVhZCwgdCwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHQuZ29vZ2xldGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZsKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmZsKCksIHRoaXMuYnguc3RvcCgpLCBBaSh0aGlzLkRTKSwgbnVsbCA9PT0gKHQgPSB0aGlzLiRTKSB8fCB2b2lkIDAgPT09IHQgfHwgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0FkeEJpZEFkYXB0b3InLCAnX2Rlc3Ryb3knLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IE5oID0gJ2h0dHBzOi8vYWR4LmNvbm5hdGl4LmNvbSc7CiAgICAgICAgICAgICAgICBjbGFzcyBIaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5tZXRyaWNzID0geyBjcmVhdGVkOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmZXRjaEJpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRyaWNzLmZldGNoU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyAkaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5zZXR0aW5ncy5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFuYWdlckxpbmVJdGVtOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcnM6IHRoaXMuc2V0dGluZ3MudHJhY2tlcnNJbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkeEFkVW5pdFBhdGg6IHRoaXMuTlModGhpcy5zZXR0aW5ncy51cmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdE1ldGFkYXRhOiB0aGlzLnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogdGhpcy5zZXR0aW5ncy5jYWxsaW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHRoaXMuc2V0dGluZ3MucGFnZURvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyOiB0aGlzLnNldHRpbmdzLmFkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5U2VydmljZTogdGhpcy5zZXR0aW5ncy52aWV3YWJpbGl0eVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHRoaXMuc2V0dGluZ3MuY3BtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc1JhdGU6IHRoaXMuc2V0dGluZ3Muc3VjY2Vzc1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmZ1c2NhdGVkUHJpY2U6IHRoaXMuc2V0dGluZ3Mub2JmdXNjYXRlZFByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3M6IHRoaXMuc2V0dGluZ3Mub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3RDb250YWluZXJSZWN5Y2xlcjogdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFNsb3RJZDogdGhpcy5zZXR0aW5ncy5iaWRTbG90SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTdWZmaXhlclNlcnZpY2U6IHRoaXMuc2V0dGluZ3MudXJsU3VmZml4ZXJTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLmZldGNoRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIFByb21pc2UucmVzb2x2ZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTlModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zdWJzdHIoTmgubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBxaCBleHRlbmRzIGNyIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQpLCB0aGlzLnNldHRpbmdzID0gdCwgdGhpcy5hZE1lZGlhVHlwZSA9ICdjbnhNZWRpYScsIHRoaXMuYWRTb3VyY2VUeXBlID0gaC5Qcm90b0Fkc291cmNlVHlwZUVudW0uQ254TWVkaWEsIHRoaXMuSFMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEFkKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuaW5pdEFkKHQsIGksIGUsIHMsIG4sIHIsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG8gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QocnQuaCkodGhpcy5zZXR0aW5ncy5leHRlcm5hbE1lZGlhRmlsZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHRoaXMuc2V0dGluZ3MuZXh0ZXJuYWxNZWRpYUZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChPYmplY3QocnQuaCkodGhpcy5zZXR0aW5ncy5leHRlcm5hbEhsc0ZpbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB0aGlzLnNldHRpbmdzLmV4dGVybmFsSGxzRmlsZSwgbyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QobC5oKSh0aGlzLnNldHRpbmdzLnJlbmRpdGlvbnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFB0LmIuQWRFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkNueE1lZGlhTm9SZW5kaXRpb25zIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHRoaXMucVModGhpcy5zZXR0aW5ncy5yZW5kaXRpb25zLCBpLCB0aGlzLnNldHRpbmdzLm1lZGlhSWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56UyA9IGEsIHRoaXMuV1MgPSBuZXcgQ3IodGhpcy5zZXR0aW5ncy5nbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuelMsIHRoaXMuSGcsIHRoaXMuc2V0dGluZ3Mub3MsIHRoaXMuc2V0dGluZ3MuY2xpY2tVcmwsIHRoaXMuc2V0dGluZ3MubG9vcEFkV2hlbkZpbmlzaGVkLCB0aGlzLnNldHRpbmdzLnBhdXNlQWRXaGVuRmluaXNoZWQsIG8sIHRoaXMuc2V0dGluZ3MuaW5BcHAsIHRoaXMuc2V0dGluZ3MucGFnZURvbWFpbiksIHRoaXMuSFMucHVzaCh0aGlzLldTLm9uVnBhaWRFdmVudC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5XUy5pbml0QWQodCwgaSwgZSwgcywgbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3Q6IHRoaXMuTmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9TbG90OiB0aGlzLkhnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsgZXJyb3JNZXNzYWdlOiBZbi5jLkFkYXB0b3JJbml0QWRFcnJvciArIGBfJHsgdC5tZXNzYWdlIH1gIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydEFkKCksIHRoaXMuV1Muc3RhcnRBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQdC5iLkFkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogeyBlcnJvck1lc3NhZ2U6IFluLmMuQWRhcHRvclN0YXJ0QWRFcnJvciArIGBfJHsgdC5tZXNzYWdlIH1gIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0b3BBZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0b3BBZCh0KSwgdGhpcy5XUyA/IHRoaXMuV1Muc3RvcEFkKHQpIDogT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3N0b3BBZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XUy5yZXNpemVBZCh0LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnQ254TWVkaWFCaWRBZGFwdG9yJywgJ3Jlc2l6ZUFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV1MucGF1c2VBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAncGF1c2VBZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc3VtZUFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XUy5yZXN1bWVBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAncmVzdW1lQWQnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV1MuZXhwYW5kQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5reSgnQ254TWVkaWFCaWRBZGFwdG9yJywgJ2V4cGFuZEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV1MuY29sbGFwc2VBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAnY29sbGFwc2VBZCcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNraXBBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNraXBBZCgpLCB0aGlzLldTLnNraXBBZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAnc2tpcEFkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWRSZW1haW5pbmdUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV1MuZ2V0QWRSZW1haW5pbmdUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAnZ2V0QWRSZW1haW5pbmdUaW1lJywgdCksIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QWREdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLldTID8gdGhpcy5XUy5nZXRBZER1cmF0aW9uKCkgOiB0aGlzLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAnZ2V0QWREdXJhdGlvbicsIHQpLCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkVm9sdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV1MuZ2V0QWRWb2x1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua3koJ0NueE1lZGlhQmlkQWRhcHRvcicsICdnZXRBZFZvbHVtZScsIHQpLCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFTaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuV1MuZ2V0QWRNZWRpYVdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuV1MuZ2V0QWRNZWRpYUhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldEFkVm9sdW1lKHQpLCB0aGlzLldTLnNldEFkVm9sdW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmt5KCdDbnhNZWRpYUJpZEFkYXB0b3InLCAnc2V0QWRWb2x1bWUnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYWRWaWRlb1VybCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuelM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZWNsYXJlZER1cmF0aW9uSW5TZWNvbmRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5wYXVzZUFkV2hlbkZpbmlzaGVkICYmICF0aGlzLnNldHRpbmdzLmxvb3BBZFdoZW5GaW5pc2hlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZmwoKSwgQWkodGhpcy5IUyksIG51bGwgPT09ICh0ID0gdGhpcy5XUykgfHwgdm9pZCAwID09PSB0IHx8IHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3koJ0NueE1lZGlhQmlkQWRhcHRvcicsICdfZGVzdHJveScsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxUyh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzLCBuOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY29kZWMgPT09IHcuSDI2NDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMgPSBPYmplY3Qod2kuYikoaSwgbi5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgKG4gPSBuLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmhlaWdodCA9PT0gczsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLmxlbmd0aCA+IDAgPyB0aGlzLlpkLmFwcGVuZFBhcmFtc1RvVXJsKGAkeyBWaS5hLmVuZFBvaW50cy5iYXNlLnZpZGVvIH0keyBlIH0vJHsgblswXS5maWxlIH1gKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgemggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHQsIHRoaXMubWV0cmljcyA9IHsgY3JlYXRlZDogbmV3IERhdGUoKS5nZXRUaW1lKCkgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmV0Y2hCaWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljcy5mZXRjaFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgcWgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuc2V0dGluZ3MuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJzOiB0aGlzLnNldHRpbmdzLnRyYWNrZXJzSW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLnNldHRpbmdzLm1lZGlhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kaXRpb25zOiB0aGlzLnNldHRpbmdzLnJlbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1VybDogdGhpcy5zZXR0aW5ncy5jbGlja1VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRhZGF0YTogdGhpcy5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsaW5nU3RhdGU6IHRoaXMuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdhYmlsaXR5U2VydmljZTogdGhpcy5zZXR0aW5ncy52aWV3YWJpbGl0eVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZENvbnRhaW5lcjogdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogdGhpcy5zZXR0aW5ncy5jcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmZ1c2NhdGVkUHJpY2U6IHRoaXMuc2V0dGluZ3Mub2JmdXNjYXRlZFByaWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRFbmZvcmNlcjogdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxNZWRpYUZpbGU6IHRoaXMuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5leHRlcm5hbE1lZGlhRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsSGxzRmlsZTogdGhpcy5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmV4dGVybmFsSGxzRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlQWRXaGVuRmluaXNoZWQ6IHRoaXMuc2V0dGluZ3MucGF1c2VBZFdoZW5GaW5pc2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BBZFdoZW5GaW5pc2hlZDogdGhpcy5zZXR0aW5ncy5sb29wQWRXaGVuRmluaXNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFwcDogdGhpcy5zZXR0aW5ncy5pbkFwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLnNldHRpbmdzLm9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTbG90Q29udGFpbmVyUmVjeWNsZXI6IHRoaXMuc2V0dGluZ3MuYWRTbG90Q29udGFpbmVyUmVjeWNsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRTbG90SWQ6IHRoaXMuc2V0dGluZ3MuYmlkU2xvdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ZXJTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnVybFN1ZmZpeGVyU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VEb21haW46IHRoaXMuc2V0dGluZ3MucGFnZURvbWFpbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0cmljcy5mZXRjaEVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBQcm9taXNlLnJlc29sdmUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFdoOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LklETEUgPSAwXSA9ICdJRExFJywgdFt0LlJVTk5JTkcgPSAxXSA9ICdSVU5OSU5HJywgdFt0LlNUT1BQSU5HID0gMl0gPSAnU1RPUFBJTkcnOwogICAgICAgICAgICAgICAgfShXaCB8fCAoV2ggPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgR2ggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HUyA9IHQsIHRoaXMuenQgPSBXaC5JRExFLCB0aGlzLkpTID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ID09PSBXaC5JRExFID8gKHRoaXMuenQgPSBXaC5SVU5OSU5HLCB0aGlzLlFTKCkpIDogdGhpcy56dCA9PT0gV2guU1RPUFBJTkcgJiYgKHRoaXMuenQgPSBXaC5SVU5OSU5HLCB0aGlzLlFTKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ID0gV2guU1RPUFBJTkc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFByb21pc2VOb3RpZmllcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhTID0gdCwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0SWRsZU5vdGlmaWVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWVMgPSB0LCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuenQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEtTKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5HUygpOwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IHQgPyB0aGlzLkpTID0gdC50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YUyAmJiB0aGlzLlhTKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuenQgPT09IFdoLlNUT1BQSU5HICYmICh0aGlzLnp0ID0gV2guSURMRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpcy56dCA9IFdoLklETEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFTKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnp0ID09PSBXaC5JRExFID8gdGhpcy5ZUyAmJiB0aGlzLllTKCkgOiB0aGlzLnp0ID09PSBXaC5SVU5OSU5HICYmICh0aGlzLktTKCksIHRoaXMuSlMudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFTKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBKaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5HUyA9IHQsIHRoaXMuWlMgPSBpLCB0aGlzLnRqID0gW10sIHRoaXMuaWooaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ai5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGouZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UHJvbWlzZU5vdGlmaWVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGouZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0UHJvbWlzZU5vdGlmaWVyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QWxsVGhyZWFkc0lkbGVOb3RpZmllcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVqID0gdCwgdGhpcy5zaigpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXROdW1iZXJPZlRocmVhZHModCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpTID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQgLSB0aGlzLlpTOwogICAgICAgICAgICAgICAgICAgICAgICBpID4gMCA/IHRoaXMuaWooaSkgOiBpIDwgMCAmJiB0aGlzLm5qKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGoucmVkdWNlKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtpLmdldFN0YXRlKCldKyssIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtXaC5JRExFXTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtXaC5SVU5OSU5HXTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtXaC5TVE9QUElOR106IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlqKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBuZXcgR2godGhpcy5HUykuc2V0UHJvbWlzZU5vdGlmaWVyKHRoaXMuWFMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ai5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5qKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE1hdGgubWluKHQsIHRoaXMudGoubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRqLnBvcCgpLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2ooKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFN0YXRlKClbV2guSURMRV0gPT09IHRoaXMudGoubGVuZ3RoICYmIHRoaXMuZWooKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ai5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zZXRJZGxlTm90aWZpZXIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIFFoIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaiA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYW5DYWxsKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmouZXZlcnkoZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYW5DYWxsKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJSZXF1ZXN0Rm9yTGluZUl0ZW0odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yai5mb3JFYWNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW1wcmVzc2lvbkZvckxpbmVJdGVtKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmouZm9yRWFjaChlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVnaXN0ZXJJbXByZXNzaW9uRm9yTGluZUl0ZW0odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNhbGxpbmdWYWxpZGF0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yai5wdXNoKHQpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNhbGxpbmdWYWxpZGF0b3JzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDYWxsaW5nVmFsaWRhdG9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yai5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUoNDIpOwogICAgICAgICAgICAgICAgY2xhc3MgWGggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gITEsIHRoaXMubG9nZ2VkID0gITEsIHRoaXMuc3RhcnRUaW1lID0gMCwgdGhpcy53aW5JZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBZaCB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRTbG90VHlwZSA9IGguUHJvdG9BZEJyZWFrVHlwZUVudW1baC5Qcm90b0FkQnJlYWtUeXBlRW51bS5QcmVSb2xsXSwgdGhpcy50aW1lVG9GaXJzdEJpZCA9IC0xLCB0aGlzLnRpbWVUb0ZpcnN0V2luID0gLTEsIHRoaXMudGltZVRvRmlyc3RCaWRSZWFkeSA9IC0xLCB0aGlzLnRpbWVUb0ZpcnN0UG9zdEJpZCA9IC0xLCB0aGlzLnRpbWVUb0ZpcnN0U3RhcnRBZCA9IC0xLCB0aGlzLnRpbWVUb0ZpcnN0QWRJbXByZXNzaW9uID0gLTEsIHRoaXMucHJlcm9sbExlbmd0aCA9IC0xLCB0aGlzLm51bWJlck9mQmlkcyA9IDAsIHRoaXMubnVtYmVyT2ZCaWRzUmVhZHkgPSAwLCB0aGlzLm51bWJlck9mV2lucyA9IDAsIHRoaXMubnVtYmVyT2ZQb3N0QmlkcyA9IDAsIHRoaXMuaW5kZXhPZldpblRoYXRHYXZlSW1wcmVzc2lvbiA9IC0xLCB0aGlzLnBsYXllcklkID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgS2ggewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbmV3IFhoKCksIHRoaXMubWV0cmljcyA9IG5ldyBZaCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IFpoID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdGEodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBaaC5oYXModCkgfHwgWmguc2V0KHQsIG5ldyBLaCgpKSwgWmguZ2V0KHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGlhOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFaaC5oYXModCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KExpLmspKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IFpoLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5tZXRhZGF0YS5pbml0aWFsaXplZCAmJiAhZS5tZXRhZGF0YS5sb2dnZWQgJiYgKGkgJiYgKGUubWV0cmljcy5wcmVyb2xsTGVuZ3RoID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBlLm1ldGFkYXRhLnN0YXJ0VGltZSksIGUubWV0YWRhdGEubG9nZ2VkID0gITAsIGUubWV0cmljcy5wbGF5ZXJJZCA9IHQsIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyb2xsX1Byb2JsZW1fTG9ncycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IEpTT04uc3RyaW5naWZ5KGUubWV0cmljcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHQuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0YSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaS5tZXRhZGF0YS5pbml0aWFsaXplZCA9ICEwLCBpLm1ldGFkYXRhLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgIH0sIHQubG9nID0gaSwgdC50cmFja0JpZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0YSh0KSwgZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAwID09PSBpLm1ldHJpY3MubnVtYmVyT2ZCaWRzICYmIChpLm1ldHJpY3MudGltZVRvRmlyc3RCaWQgPSBlIC0gaS5tZXRhZGF0YS5zdGFydFRpbWUsIGkubWV0cmljcy50aW1lVG9GaXJzdEJpZCA+IHF0LmEgJiYgKGkubWV0cmljcy50aW1lVG9GaXJzdEJpZCA9IDApKSwgaS5tZXRyaWNzLm51bWJlck9mQmlkcysrOwogICAgICAgICAgICAgICAgICAgIH0sIHQudHJhY2tCaWRSZWFkeSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0YSh0KSwgZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAwID09PSBpLm1ldHJpY3MubnVtYmVyT2ZCaWRzUmVhZHkgJiYgKGkubWV0cmljcy50aW1lVG9GaXJzdEJpZFJlYWR5ID0gZSAtIGkubWV0YWRhdGEuc3RhcnRUaW1lLCBpLm1ldHJpY3MudGltZVRvRmlyc3RCaWRSZWFkeSA+IHF0LmEgJiYgKGkubWV0cmljcy50aW1lVG9GaXJzdEJpZFJlYWR5ID0gMCkpLCBpLm1ldHJpY3MubnVtYmVyT2ZCaWRzUmVhZHkrKzsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRyYWNrU3RhcnRBZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0YSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IGkubWV0cmljcy50aW1lVG9GaXJzdFN0YXJ0QWQgJiYgKGkubWV0cmljcy50aW1lVG9GaXJzdFN0YXJ0QWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGkubWV0YWRhdGEuc3RhcnRUaW1lKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRyYWNrQWRJbXByZXNzaW9uID0gZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gcy5tZXRyaWNzLnRpbWVUb0ZpcnN0QWRJbXByZXNzaW9uICYmIChzLm1ldHJpY3MudGltZVRvRmlyc3RBZEltcHJlc3Npb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHMubWV0YWRhdGEuc3RhcnRUaW1lKSwgcy5tZXRyaWNzLmluZGV4T2ZXaW5UaGF0R2F2ZUltcHJlc3Npb24gPSBzLm1ldGFkYXRhLndpbklkcy5pbmRleE9mKGUuc2V0dGluZ3MuaWQpLCBpKHQpOwogICAgICAgICAgICAgICAgICAgIH0sIHQudHJhY2tQb3N0QmlkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRhKHQpLCBlID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGkubWV0cmljcy5udW1iZXJPZlBvc3RCaWRzICYmIChpLm1ldHJpY3MudGltZVRvRmlyc3RQb3N0QmlkID0gZSAtIGkubWV0YWRhdGEuc3RhcnRUaW1lLCBpLm1ldHJpY3MudGltZVRvRmlyc3RQb3N0QmlkID4gcXQuYSAmJiAoaS5tZXRyaWNzLnRpbWVUb0ZpcnN0UG9zdEJpZCA9IDApKSwgaS5tZXRyaWNzLm51bWJlck9mUG9zdEJpZHMrKzsKICAgICAgICAgICAgICAgICAgICB9LCB0LnRyYWNrV2luID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRhKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBlLm1ldGFkYXRhLndpbklkcy5wdXNoKGkuc2V0dGluZ3MuaWQpLCAwID09PSBlLm1ldHJpY3MubnVtYmVyT2ZXaW5zICYmIChlLm1ldHJpY3MudGltZVRvRmlyc3RXaW4gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGUubWV0YWRhdGEuc3RhcnRUaW1lLCBlLm1ldHJpY3MudGltZVRvRmlyc3RXaW4gPiBxdC5hICYmIChlLm1ldHJpY3MudGltZVRvRmlyc3RXaW4gPSAwKSksIGUubWV0cmljcy5udW1iZXJPZldpbnMrKzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfShpYSB8fCAoaWEgPSB7fSkpOwogICAgICAgICAgICAgICAgY29uc3QgZWEgPSA0OwogICAgICAgICAgICAgICAgdmFyIHNhOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0LlJ0YiA9IDFdID0gJ1J0YicsIHRbdC5IZWFkZXJCaWRkZXIgPSAyXSA9ICdIZWFkZXJCaWRkZXInLCB0W3QuVGFtID0gM10gPSAnVGFtJzsKICAgICAgICAgICAgICAgIH0oc2EgfHwgKHNhID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5hID0gewogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5SdGJdOiBzYS5SdGIsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLkhlYWRlckJpZGRlcl06IHNhLkhlYWRlckJpZGRlciwKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uVGFtXTogc2EuVGFtLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UYW1EZWFsXTogc2EuVGFtCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgcmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHQsIHRoaXMuaGogPSBuZXcgTWFwKCksIHRoaXMuamwgPSBbXSwgdGhpcy5haiA9ICExLCB0aGlzLm9qID0gbmV3IGppKCksIHRoaXMuY2ogPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy51aigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGoodC5saW5lSXRlbUxpc3QpLCB0aGlzLmRqKHQubGluZUl0ZW1MaXN0LCB0LnN0YXRlKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maih0LmxpbmVJdGVtTGlzdCksIHRoaXMucGooKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmoodC5saW5lSXRlbUxpc3QpLCB0aGlzLnBqKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuYmogPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuYWRDYWxsZXJZby5nZXRXaW5uaW5nWW9TY29yZShpLnNldHRpbmdzLmlkKSAtIHRoaXMuc2V0dGluZ3MuYWRDYWxsZXJZby5nZXRXaW5uaW5nWW9TY29yZSh0LnNldHRpbmdzLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5zZXR0aW5ncy5saW5lSXRlbUxpc3QuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVoKHQucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUpID8gdC5wcm90b0xpbmVJdGVtLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSAxMCA6IHQucHJvdG9MaW5lSXRlbS50aW1lQmV0d2VlblJlcXVlc3RzID0gNjsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuamwucHVzaCh0aGlzLnNldHRpbmdzLmxpbmVJdGVtU2VydmljZXMubGluZUl0ZW1TZXJ2aWNlc1RpbWVyLm9uVGltZXIoKS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wub25CaWRDb25zdW1lZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wub25CaWRMb2FkaW5nQ29uc3VtZWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmooKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2V0dGluZ3MuYWRCaWRQb29sLm9uQmlkUmVhZHlDb25zdW1lZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMubWogPSBuZXcgUWgoKS5yZWdpc3RlckNhbGxpbmdWYWxpZGF0b3JzKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUl0ZW1TZXJ2aWNlcy5yZXF1ZXN0Q2Fwc1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmxpbmVJdGVtU2VydmljZXMuaW1wcmVzc2lvbkNhcHNTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5saW5lSXRlbVNlcnZpY2VzLnRpbWVCZXR3ZWVuUmVxdWVzdHNTZXJ2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCB0aGlzLmdqID0gbmV3IEpoKHRoaXMuY2osIGVhKSwgdGhpcy5zZXR0aW5ncy5saW5lSXRlbUxpc3QuZmluZCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvTGluZUl0ZW0uY3JlYXRpdmVUeXBlID09PSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5SdGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIHRoaXMuaGouc2V0KHNhLlJ0YiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblBlbmRpbmc6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyOiBuZXcgdmgodGhpcy5zZXR0aW5ncy5pc091dHN0cmVhbSwgdGhpcy5zZXR0aW5ncy5za2lwQWRTZXR0aW5ncywgdGhpcy5zZXR0aW5ncy5hcHAsIHRoaXMuc2V0dGluZ3MuYWRNYWNyb1JlcGxhY2VyLCB0aGlzLnNldHRpbmdzLmFkQ29udGFpbmVyTWFwLCB0aGlzLnNldHRpbmdzLmFkUmVxdWVzdEdhdGVrZWVwZXIsIHRoaXMuc2V0dGluZ3MuYWRFbmZvcmNlciwgdGhpcy5zZXR0aW5ncy5hZFNsb3RDb250YWluZXJSZWN5Y2xlcikKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2V0dGluZ3MubGluZUl0ZW1MaXN0LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b0xpbmVJdGVtLmNyZWF0aXZlVHlwZSA9PT0gaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uSGVhZGVyQmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9KSAmJiB0aGlzLmhqLnNldChzYS5IZWFkZXJCaWRkZXIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25QZW5kaW5nOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcjogbmV3IFRoKHRoaXMuc2V0dGluZ3MuaXNPdXRzdHJlYW0sIHRoaXMuc2V0dGluZ3Muc2NoYWluU2V0dGluZ3MsIHRoaXMuc2V0dGluZ3MuYXBwLCB0aGlzLnNldHRpbmdzLmFkTWFjcm9SZXBsYWNlciwgdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lck1hcCwgdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLCB0aGlzLnNldHRpbmdzLmFkU2xvdENvbnRhaW5lclJlY3ljbGVyLCB0aGlzLnNldHRpbmdzLmxvb3BBZFdoZW5GaW5pc2hlZCkKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2V0dGluZ3MubGluZUl0ZW1MaXN0LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b0xpbmVJdGVtLmNyZWF0aXZlVHlwZSA9PT0gaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uVGFtIHx8IHQucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUgPT09IGguUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLlRhbURlYWw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIHRoaXMuaGouc2V0KHNhLlRhbSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblBlbmRpbmc6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyOiBuZXcgUmgodGhpcy5zZXR0aW5ncy5hcHAsIHRoaXMuc2V0dGluZ3MuYW1hem9uU2xvdElkLCB0aGlzLnNldHRpbmdzLmFkTWFjcm9SZXBsYWNlciwgdGhpcy5zZXR0aW5ncy5hZENvbnRhaW5lck1hcCwgdGhpcy5zZXR0aW5ncy5hZEVuZm9yY2VyLCB0aGlzLnNldHRpbmdzLmFkU2xvdENvbnRhaW5lclJlY3ljbGVyKQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5nai5zZXRBbGxUaHJlYWRzSWRsZU5vdGlmaWVyKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MubGluZUl0ZW1TZXJ2aWNlcy5saW5lSXRlbVNlcnZpY2VzVGltZXIuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkZpcnN0QWdncmVnYXRlZEJhdGNoRmluaXNoZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9qLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYWxsKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nai5zZXROdW1iZXJPZlRocmVhZHModC5tYXhQYXJhbGxlbENhbGxzKSwgdGhpcy55aiA9IHQsIHRoaXMuYWogPSAhMCwgdGhpcy52aigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFqID0gITEsIHRoaXMuZ2ouc3RvcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKSwgdGhpcy5tai5kZXN0cm95KCksIHRoaXMuaGouZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY2FsbGVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEFpKHRoaXMuamwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwaigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oai5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5hdWN0aW9uUGVuZGluZyAmJiAodCA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgJiYgdGhpcy5vai5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdqKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodC5hZ2dyZWdhdG9ycy5zaXplID4gMCkgJiYgKCEoIXVoKHQucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUpICYmICh0LmJpZHMuc2l6ZSA+IDAgfHwgdC5jYWxsZXJzLnNpemUgPiAwKSkgJiYgdGhpcy5tai5jYW5DYWxsKHQsIHRoaXMuT2ooKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuc2V0dGluZ3MucGxhdGZvcm1DYXBwZWRMaW5lSXRlbVJlcG8uaXNMaW5lSXRlbVBsYXRmb3JtQ2FwcGVkKHQucHJvdG9MaW5lSXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2aigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5haiAmJiB0aGlzLmdqLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVqKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy53aih0aGlzLnNldHRpbmdzLmxpbmVJdGVtTGlzdCksIGkgPSB0aGlzLnNldHRpbmdzLmFkQ2FsbGVyWW8uZ2V0QmVzdENhbGxhYmxlKHQsIHRoaXMueWouc3RhdGVTZXR0aW5ncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmIHRoaXMueGooaS5saW5lSXRlbUxpc3RbMF0sIGkuc3RhdGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVoKHQucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wuZ2V0QWxsQmlkc0V4Y2VwdFN0YXJ0ZWRCaWQoKS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuYWRDYWxsZXJZby5pc0JpZFRhcmdldGluZ0FsbG93ZWQodCwgaSwgdGhpcy5zZXR0aW5ncy5saW5lSXRlbVNlcnZpY2VzLmltcHJlc3Npb25DYXBzU2VydmljZSwgdGhpcy5zZXR0aW5ncy5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtUmVwbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcyA9IHQucHJvdG9MaW5lSXRlbS5mbG9vclByaWNlIHx8IHQucHJvdG9MaW5lSXRlbS5jdXN0b21DcG0sIG4gPSB0aGlzLnNldHRpbmdzLmFkQ2FsbGVyWW8uZ2V0Q2FsbGluZ1lvU2NvcmUodC5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKSwgciA9IHRoaXMuc2V0dGluZ3MuYWRCaWRQb29sLmNhbGxpbmdMaW5lSXRlbXMsIGggPSBbLi4uZS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFByaWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldLCBhID0gWy4uLnIubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZENhbGxlcllvLmdldENhbGxpbmdZb1Njb3JlKHQucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSldOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGgubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA8IGhbdF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGEubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA8IGFbdF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxqKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wuY2FsbGluZ0xpbmVJdGVtcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc2V0dGluZ3MuYWRCaWRQb29sLmNhbGxpbmdMaW5lSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50CiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZqKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wuY2FsbGluZ0xpbmVJdGVtcyA9IHRoaXMuc2V0dGluZ3MuYWRCaWRQb29sLmNhbGxpbmdMaW5lSXRlbXMuZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3QobC5nKShpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVoKHRbMF0ucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUpID8gdGhpcy5Taih0LCBpKSA6IHRoaXMuamoodFswXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGpqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tai5yZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LCB0aGlzLk9qKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5raih0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ooZSksIHRoaXMuQWooZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFNqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuaGouZ2V0KG5hW3RbMF0ucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWdncmVnYXRvcnMuYWRkKGUuY2FsbGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuYXVjdGlvblBlbmRpbmcgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtUmVxdWVzdERhdGFMaXN0OiB0Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QXZhaWxhYmxlUmVxdWVzdHM6IHRoaXMuc2V0dGluZ3MubGluZUl0ZW1TZXJ2aWNlcy5yZXF1ZXN0Q2Fwc1NlcnZpY2UuZ2V0QXZhaWxhYmxlUmVxdWVzdHNGb3JMaW5lSXRlbSh0LCB0aGlzLk9qKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1N0YXRlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWREdXJhdGlvbjogaS5hZEJyZWFrU3RhdGUubWF4QWREdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJpZFByaWNlOiB0aGlzLklqKGkpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGxlci5yZXF1ZXN0KHMpLnRoZW4ocyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmJpZHMubGVuZ3RoIHx8IHMubm9CaWRzLmxlbmd0aCB8fCB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tai5yZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LCB0aGlzLk9qKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZ2dyZWdhdG9ycy5kZWxldGUoZS5jYWxsZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMubm9CaWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tai5yZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LmxpbmVJdGVtLCB0aGlzLk9qKCkpLCB0aGlzLkNqKGksIHQubGluZUl0ZW0sIHQucmVhc29uLCB0LnJlcXVlc3RNZXRhZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5iaWRzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2oodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5iaWRzLnNvcnQodGhpcy5iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gcy5iaWRzLm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tai5yZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLCB0aGlzLk9qKCkpLCB0aGlzLkFqKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmF1Y3Rpb25QZW5kaW5nID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBBaih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLmNhbGxlcnMuYWRkKHQpLCB0LmZldGNoQmlkKCkuY2F0Y2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLmNhbGxlcnMuZGVsZXRlKHQpLCB0aGlzLnNldHRpbmdzLmFkQ2FsbGVyWW8ucmVnaXN0ZXJQcmVCaWQodC5zZXR0aW5ncy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gSm5baV0gPyBKbltpXSA6IGguQ29ubmF0aXhOb0JpZFJlYXNvbkVudW0uUmVxdWVzdEV4Y2VwdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNqKHQuc2V0dGluZ3MuY2FsbGluZ1N0YXRlLCB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLCBlLCB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YSwgdC5zZXR0aW5ncy50cmFja2Vyc0luZm9ybWF0aW9uLCBEYXRlLm5vdygpIC0gdC5tZXRyaWNzLmZldGNoU3RhcnQpLCBQcm9taXNlLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5jYWxsZXJzLmRlbGV0ZSh0KSwgdGhpcy5UaihpLCBEYXRlLm5vdygpIC0gdC5tZXRyaWNzLmZldGNoU3RhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gdCAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkTWFuYWdlcl9BZENhbGxlckNvbnRyb2xsZXJfaGFuZGxlQ2FsbEFkYXB0b3JSZXF1ZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRNYXhMb2c6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0sIHMgPSB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEucmVxdWVzdFRyYWNraW5nSGFuZGxlZEJ5U2VydmVyIHx8IHRoaXMuc2V0dGluZ3MudHJhY2tpbmdTZXJ2aWNlLmFkZEJpZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IGUucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiBlLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGbG9vclByaWNlOiBzLmRhdGEucmVxdWVzdGVkRmxvb3JQcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGJSZXF1ZXN0TnVtYmVyOiBzLmRhdGEucnRiUmVxdWVzdE51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jZWRVc2VyOiBzLmRhdGEuc3luY2VkVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmViaWRKc0JpZGRlck5hbWU6IHMuZGF0YS5wcmViaWRKc0JpZGRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tQ2xpZW50UHJpY2U6IHQuc2V0dGluZ3MuY3BtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTcGVudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3BJZDogcy5kYXRhLmRzcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFByaWNlOiBzLmRhdGEuZW5jcnlwdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiQWRvbWFpbjogcy5kYXRhLnJ0YkFkb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogdC5jcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YlNlYXRJZDogcy5kYXRhLnJ0YlNlYXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnhCaWRJZDogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5jbnhCaWRJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2V0dGluZ3MuYWRSZXF1ZXN0R2F0ZWtlZXBlci5hZGRCaWQoZS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkLCBzLmRhdGEucmVxdWVzdGVkRmxvb3JQcmljZSksICF0aGlzLnNldHRpbmdzLmFkQ2FsbGVyWW8uaXNCaWRUYXJnZXRpbmdBbGxvd2VkRXZlckluU2Vzc2lvbih0LCB0LnNldHRpbmdzLmNhbGxpbmdTdGF0ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5hZENhbGxlcllvLnJlZ2lzdGVyUHJlQmlkKHQuc2V0dGluZ3MuaWQpLCB2b2lkIHRoaXMuc2V0dGluZ3MuYXVjdGlvbkluZm9Mb2dnaW5nLmJpZElzTm90V2lubmFibGVFdmVySW5TZXNzaW9uKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpYS50cmFja0JpZCh0aGlzLnNldHRpbmdzLmFwcC5jb25maWcucGxheWVySWQpLCB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLmJpZHMuYWRkKHQpLCB0aGlzLnNldHRpbmdzLmFkQmlkUG9vbC5hZGRCaWQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENqKHQsIGksIGUsIHMsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBIbi50cmFjayhuLmFkRXJyb3IsIHRoaXMuc2V0dGluZ3MuYWRNYWNyb1JlcGxhY2VyLCBpLnByb3RvTGluZUl0ZW0sIHQpLCBzLmRhdGEucmVxdWVzdFRyYWNraW5nSGFuZGxlZEJ5U2VydmVyIHx8IHRoaXMuc2V0dGluZ3MudHJhY2tpbmdTZXJ2aWNlLmFkZFByZWJpZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyTGluZUl0ZW1JZDogaS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTGluZUl0ZW1JZDogaS5wcm90b0xpbmVJdGVtLnB1Ymxpc2hlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyQ3VzdG9tSGVhZGVyczogcy5kYXRhLnBhcnRuZXJDdXN0b21IZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydG5lclJlYXNvbjogcy5kYXRhLnBhcnRuZXJSZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRGbG9vclByaWNlOiBzLmRhdGEucmVxdWVzdGVkRmxvb3JQcmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YlJlcXVlc3ROdW1iZXI6IHMuZGF0YS5ydGJSZXF1ZXN0TnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VkVXNlcjogcy5kYXRhLnN5bmNlZFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmViaWRKc0JpZGRlck5hbWU6IHMuZGF0YS5wcmViaWRKc0JpZGRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3BlbnQ6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc2V0dGluZ3MuYWRSZXF1ZXN0R2F0ZWtlZXBlci5hZGRQcmViaWQoaS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga2oodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gbmV3IEhuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHFuKHQucHJvdG9MaW5lSXRlbS50cmFja2VycywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogT2JqZWN0KExpLmMpKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE1hbmFnZXJMaW5lSXRlbTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VUcmFja2luZ01hY3JvczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0TWV0YWRhdGE6IG5ldyBoaCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlcnNJbmZvcm1hdGlvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdTdGF0ZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyOiB0aGlzLnNldHRpbmdzLmFkQ29udGFpbmVyTWFwLmdldCh0LnByb3RvTGluZUl0ZW0uYWRUeXBlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5zZXR0aW5ncy5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLmFwcC5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHQucHJvdG9MaW5lSXRlbS5mbG9vclByaWNlIHx8IHQucHJvdG9MaW5lSXRlbS5jdXN0b21DcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEVuZm9yY2VyOiB0aGlzLnNldHRpbmdzLmFkRW5mb3JjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvczogdGhpcy5zZXR0aW5ncy5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2xvdENvbnRhaW5lclJlY3ljbGVyOiB0aGlzLnNldHRpbmdzLmFkU2xvdENvbnRhaW5lclJlY3ljbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkU2xvdElkOiBPcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsU3VmZml4ZXJTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLmFwcC5zZXJ2aWNlcy5VcmxTdWZmaXhlclNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnByb3RvTGluZUl0ZW0uY3JlYXRpdmVUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uRXh0ZXJuYWw6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uVGhpcmRQYXJ0eToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvTGluZUl0ZW0uYWRUeXBlID09PSBoLlByb3RvQWRUeXBlLk92ZXJsYXkgPyBuZXcgSGgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5wcm90b0xpbmVJdGVtLmFkVGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VEb21haW46IHRoaXMuc2V0dGluZ3MuYXBwLmNvbmZpZy5wYWdlRG9tYWluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBuZXcgcmgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5wcm90b0xpbmVJdGVtLmFkVGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFjcm9SZXBsYWNlcjogdGhpcy5zZXR0aW5ncy5hZE1hY3JvUmVwbGFjZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2aWNlOiB0aGlzLnNldHRpbmdzLnRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQWRXaGVuRmluaXNoZWQ6IHRoaXMuc2V0dGluZ3MubG9vcEFkV2hlbkZpbmlzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VVcmw6IHRoaXMuc2V0dGluZ3MuYXBwLmNvbmZpZy5wYWdlVXJsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uTWVkaWFGaWxlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB6aChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHMpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tVcmw6IHQucHJvdG9MaW5lSXRlbS5tZWRpYUNyZWF0aXZlQ2xpY2tVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZDogdC5wcm90b0xpbmVJdGVtLm1lZGlhQ3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kaXRpb25zOiB0LnByb3RvTGluZUl0ZW0ucmVuZGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZUFkV2hlbkZpbmlzaGVkOiB0aGlzLnNldHRpbmdzLnBhdXNlQWRXaGVuRmluaXNoZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEFkV2hlbkZpbmlzaGVkOiB0aGlzLnNldHRpbmdzLmxvb3BBZFdoZW5GaW5pc2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFwcDogdGhpcy5zZXR0aW5ncy5hcHAuY29uZmlnLmlzSW5BcHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZURvbWFpbjogdGhpcy5zZXR0aW5ncy5hcHAuY29uZmlnLnBhZ2VEb21haW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfaih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlVHlwZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUHJpY2U6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1Qcmlvcml0eTogcgogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmFkQ2FsbGVyWW8ucmVnaXN0ZXJCaWRkaW5nSW5mb3JtYXRpb24oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVUeXBlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcmljZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtSWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZElkOiB0LnNldHRpbmdzLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3BtOiB0LnNldHRpbmdzLmNwbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iZnVzY2F0ZWRQcmljZTogdC5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzUmF0ZTogdC5zZXR0aW5ncy5zdWNjZXNzUmF0ZSB8fCBzCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPaigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnlqLnN0YXRlU2V0dGluZ3MuY3VycmVudFN0YXRlIHx8IHRoaXMueWouc3RhdGVTZXR0aW5ncy5wcmVkaWN0ZWRTdGF0ZSkuYWRPcHBvcnR1bml0eS5pZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSWoodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wuYmlkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc2V0dGluZ3MuYWRCaWRQb29sLmJpZHNMb2FkaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zZXR0aW5ncy5hZEJpZFBvb2wuYmlkc1JlYWR5CiAgICAgICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuYWRDYWxsZXJZby5pc0JpZFRhcmdldGluZ0FsbG93ZWQoaSwgdCwgdGhpcy5zZXR0aW5ncy5saW5lSXRlbVNlcnZpY2VzLmltcHJlc3Npb25DYXBzU2VydmljZSwgdGhpcy5zZXR0aW5ncy5wbGF0Zm9ybUNhcHBlZExpbmVJdGVtUmVwbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGwuaCkoaSkgPyBNYXRoLm1heCguLi5pLm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldFByaWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaGEgPSAndW5jYXRlZ29yaXplZCc7CiAgICAgICAgICAgICAgICBjbGFzcyBhYSB7CiAgICAgICAgICAgICAgICAgICAgcmVzZXRDYXBzQmFzZWRPbkV4dGVybmFsRXZlbnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5Qai5rZXlzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NaihlLCB0KSAmJiB0aGlzLkVqKGUsIGhhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTWoodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b0xpbmVJdGVtLnJlc2V0Q2FwVHlwZSA9PT0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTGoodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Naih0LCBoLlByb3RvUmVzZXRDYXBUeXBlRW51bS5UaW1lQ2FwcGluZykgJiYgdGhpcy5Saih0KSA+IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3Mgb2EgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CaiA9IHQsIHRoaXMuRGogPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldE51bWJlck9mSW1wcmVzc2lvbnMoewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogaQogICAgICAgICAgICAgICAgICAgIH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKGkpICYmIHRoaXMuQmogPT09IGguUHJvdG9SZXNldENhcFR5cGVFbnVtLk9wcG9ydHVuaXR5Q2FwcGluZyB8fCAoaSA9IGhhKSwgdGhpcy5Eai5zZXQoaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldE51bWJlck9mSW1wcmVzc2lvbnMoe2NhdGVnb3J5SWQ6IHR9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuYSkodCkgJiYgdGhpcy5CaiA9PT0gaC5Qcm90b1Jlc2V0Q2FwVHlwZUVudW0uT3Bwb3J0dW5pdHlDYXBwaW5nIHx8ICh0ID0gaGEpLCB0aGlzLkRqLmdldCh0KSB8fCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGNhIGV4dGVuZHMgYWEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKCksIHRoaXMuRmogPSB0LCB0aGlzLlBqID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYW5DYWxsKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Waih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuUGouZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlIHx8ICgwID09PSB0LnByb3RvTGluZUl0ZW0uaW1wcmVzc2lvbkNhcCB8fCBlLmdldE51bWJlck9mSW1wcmVzc2lvbnMoeyBjYXRlZ29yeUlkOiBpIH0pIDwgdC5wcm90b0xpbmVJdGVtLmltcHJlc3Npb25DYXApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckltcHJlc3Npb25Gb3JMaW5lSXRlbSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gdGhpcy5Qai5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgJiYgKHRoaXMuUGouc2V0KHQsIG5ldyBvYSh0LnByb3RvTGluZUl0ZW0ucmVzZXRDYXBUeXBlKSksIGUgPSB0aGlzLlBqLmdldCh0KSwgdGhpcy5Maih0KSAmJiAoZS5uZXh0SW1wcmVzc2lvbkNhcFJlc2V0VGltZXN0YW1wID0gdGhpcy5Vaih0aGlzLlJqKHQpKSkpLCBlLnNldE51bWJlck9mSW1wcmVzc2lvbnMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUuZ2V0TnVtYmVyT2ZJbXByZXNzaW9ucyh7IGNhdGVnb3J5SWQ6IGkgfSkgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJSZXF1ZXN0Rm9yTGluZUl0ZW0odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Qai5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFaih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGouZ2V0KHQpLnNldE51bWJlck9mSW1wcmVzc2lvbnMoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSaih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvTGluZUl0ZW0ucmVzZXRJbXByZXNzaW9uc0NhcFRpbWUgKiBxdC5mOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWaih0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuTGoodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLlBqLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBlICYmIHRoaXMuJGoodCwgaSkgJiYgKGUuc2V0TnVtYmVyT2ZJbXByZXNzaW9ucyh7IHZhbHVlOiAwIH0pLCBlLm5leHRJbXByZXNzaW9uQ2FwUmVzZXRUaW1lc3RhbXAgPSB0aGlzLlVqKHRoaXMuUmoodCksIGkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGoodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA+PSB0aGlzLlBqLmdldCh0KS5uZXh0SW1wcmVzc2lvbkNhcFJlc2V0VGltZXN0YW1wOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBVaih0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gTWF0aC5jZWlsKChpIC0gdGhpcy5GaikgLyB0KSAqIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZqICsgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB1YSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJqID0gdCwgdGhpcy5OaiA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TnVtYmVyT2ZSZXF1ZXN0cyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeUlkOiBpCiAgICAgICAgICAgICAgICAgICAgfSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYSkoaSkgJiYgdGhpcy5CaiA9PT0gaC5Qcm90b1Jlc2V0Q2FwVHlwZUVudW0uT3Bwb3J0dW5pdHlDYXBwaW5nIHx8IChpID0gaGEpLCB0aGlzLk5qLnNldChpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TnVtYmVyT2ZSZXF1ZXN0cyh7Y2F0ZWdvcnlJZDogdH0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5hKSh0KSAmJiB0aGlzLkJqID09PSBoLlByb3RvUmVzZXRDYXBUeXBlRW51bS5PcHBvcnR1bml0eUNhcHBpbmcgfHwgKHQgPSBoYSksIHRoaXMuTmouZ2V0KHQpIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgbGEgZXh0ZW5kcyBhYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5GaiA9IHQsIHRoaXMuYWxsb3dSZXNldE9uVGltZSA9ICEwLCB0aGlzLlBqID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYW5DYWxsKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Waih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuUGouZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlIHx8ICgwID09PSB0LnByb3RvTGluZUl0ZW0ucmVxdWVzdENhcCB8fCBlLmdldE51bWJlck9mUmVxdWVzdHMoeyBjYXRlZ29yeUlkOiBpIH0pIDwgdC5wcm90b0xpbmVJdGVtLnJlcXVlc3RDYXApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlclJlcXVlc3RGb3JMaW5lSXRlbSh0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IHRoaXMuUGouZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBzICYmICh0aGlzLlBqLnNldCh0LCBuZXcgdWEodC5wcm90b0xpbmVJdGVtLnJlc2V0Q2FwVHlwZSkpLCBzID0gdGhpcy5Qai5nZXQodCksIHRoaXMuTGoodCkgJiYgKHMubmV4dFJlcXVlc3RDYXBSZXNldFRpbWVzdGFtcCA9IHRoaXMuVWoodGhpcy5Saih0KSkpKSwgcy5zZXROdW1iZXJPZlJlcXVlc3RzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzLmdldE51bWJlck9mUmVxdWVzdHMoeyBjYXRlZ29yeUlkOiBpIH0pICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW1wcmVzc2lvbkZvckxpbmVJdGVtKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVJlcXVlc3RzRm9yTGluZUl0ZW0odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5Qai5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgPyB0LnByb3RvTGluZUl0ZW0ucmVxdWVzdENhcCA6IHQucHJvdG9MaW5lSXRlbS5yZXF1ZXN0Q2FwIC0gZS5nZXROdW1iZXJPZlJlcXVlc3RzKHsgY2F0ZWdvcnlJZDogaSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdG9yZU9uZUNhcEZvckxpbmVJdGVtKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQucHJvdG9MaW5lSXRlbS5pZ25vcmVGaWxsZWRSZXF1ZXN0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuUGouZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gZS5nZXROdW1iZXJPZlJlcXVlc3RzKHsgY2F0ZWdvcnlJZDogaSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPiAwICYmIGUuc2V0TnVtYmVyT2ZSZXF1ZXN0cyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHMgLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5SWQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGouY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRWoodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBqLmdldCh0KS5zZXROdW1iZXJPZlJlcXVlc3RzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlJZDogaQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUmoodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b0xpbmVJdGVtLnJlc2V0UmVxdWVzdHNDYXBUaW1lICogcXQuZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVmoodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkxqKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5Qai5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gZSAmJiB0aGlzLiRqKHQsIGkpICYmIChlLnNldE51bWJlck9mUmVxdWVzdHMoeyB2YWx1ZTogMCB9KSwgZS5uZXh0UmVxdWVzdENhcFJlc2V0VGltZXN0YW1wID0gdGhpcy5Vaih0aGlzLlJqKHQpLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPj0gdGhpcy5Qai5nZXQodCkubmV4dFJlcXVlc3RDYXBSZXNldFRpbWVzdGFtcCAmJiB0aGlzLmFsbG93UmVzZXRPblRpbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFVqKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBNYXRoLmNlaWwoKGkgLSB0aGlzLkZqKSAvIHQpICogdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRmogKyBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGRhIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QaiA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJSZXF1ZXN0Rm9yTGluZUl0ZW0odCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSB0aGlzLlBqLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gcyAmJiAodGhpcy5Qai5zZXQodCwge30pLCBzID0gdGhpcy5Qai5nZXQodCkpLCBzLmxhc3RSZXF1ZXN0VGltZXN0YW1wID0gZSwgcy5jYXRlZ29yeUlkID0gaSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJJbXByZXNzaW9uRm9yTGluZUl0ZW0odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FuQ2FsbCh0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5Qai5nZXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHMgfHwgKDAgPT09IHQucHJvdG9MaW5lSXRlbS50aW1lQmV0d2VlblJlcXVlc3RzIHx8IChlID49IHMubGFzdFJlcXVlc3RUaW1lc3RhbXAgKyB0LnByb3RvTGluZUl0ZW0udGltZUJldHdlZW5SZXF1ZXN0cyAqIHF0LmYgfHwgIShzLmNhdGVnb3J5SWQgPT09IGkgfHwgdC5wcm90b0xpbmVJdGVtLnJlc2V0Q2FwVHlwZSAhPT0gaC5Qcm90b1Jlc2V0Q2FwVHlwZUVudW0uT3Bwb3J0dW5pdHlDYXBwaW5nKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBqLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZmEgPSA1MDA7CiAgICAgICAgICAgICAgICBjbGFzcyBwYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSGogPSBudWxsLCB0aGlzLnFqID0gbmV3IGppKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy56aigpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5XaigpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblRpbWVyKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5xai5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XaigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6aigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gdGhpcy5IaiAmJiAodGhpcy5IaiA9IG1pLnNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucWoubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmYSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXaigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWkuY2xlYXJJbnRlcnZhbCh0aGlzLkhqKSwgdGhpcy5IaiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgYmEgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5HaiA9IHQsIHRoaXMuSmogPSBpLCB0aGlzLnBsID0gZSwgdGhpcy5RaiA9IHMsIHRoaXMuWGogPSBuZXcgamkoKSwgdGhpcy5mb3JjZVRyaWdnZXJVcGRhdGVTdGF0ZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsuLi50aGlzLkdqLmtleXMoKV0uZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Zaih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLllqID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuS2ouc2V0KHQsIHRoaXMuWmoodGhpcy5Hai5nZXQodCksIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy50ayA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5payhbaC5Qcm90b0FkVHlwZS5WaWRlb10sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmVrID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlrKFtoLlByb3RvQWRUeXBlLk92ZXJsYXldLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5iciA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWsoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguUHJvdG9BZFR5cGUuT3ZlcmxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLlByb3RvQWRUeXBlLlZpZGVvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5payA9ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWWoodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5Yai5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuS2ogPSBuZXcgTWFwKCksIHRoaXMuc2sgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0FkVHlwZS5WaWRlb106IHRoaXMudGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0FkVHlwZS5PdmVybGF5XTogdGhpcy5lawogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmZvcmNlVHJpZ2dlclVwZGF0ZVN0YXRlKCksIHRoaXMuR2ouZm9yRWFjaCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Kai5vbih0LCB0aGlzLmJyKSwgdGhpcy5wbC5vbih0LCB0aGlzLnNrW2ldLCB7IHRocmVzaG9sZDogdGhpcy5RaiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkNvbnRhaW5lclN0YXRlVXBkYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Yai5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyTWFwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HajsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q29udGFpbmVyU3RhdGVNYXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLktqOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdqLmZvckVhY2goKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSmoub2ZmKHQsIHRoaXMuYnIpLCB0aGlzLnBsLm9mZih0LCB0aGlzLnNrW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpqKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlICYmIChlID0gdGhpcy5wbC5jaGVjayh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiB0aGlzLlFqCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHQuY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHQuY2xpZW50SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHk6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB2YSA9ICdjbnhwbC12bCcsIG1hID0gJ2NueHBsLXJmJzsKICAgICAgICAgICAgICAgIGNsYXNzIGdhIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uayA9ICEwLCB0aGlzLnJrID0gbmV3IGppKCksIHRoaXMuaGsgPSBbXSwgdGhpcy5hayA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkudm9sdW1lID4gMCAmJiAoaS52b2x1bWUgPSAwLCAhaS5wYXVzZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGkuZ2V0QXR0cmlidXRlKG1hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJrLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByZXZlbnREZWZhdWx0ID8gdC5wcmV2ZW50RGVmYXVsdCgpIDogdC5yZXR1cm5WYWx1ZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25Wb2x1bWVEZXRlY3RlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmsuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuZm9yY2UodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChydC5jKSh0KSAmJiAoZSA9IHQuY29udGVudERvY3VtZW50IHx8IHQuY29udGVudFdpbmRvdy5kb2N1bWVudCksIHRoaXMubmsgPSAhMSwgT2JqZWN0KGwuYykoZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKSkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2sodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wRW5mb3JjZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uayA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjbGVhckVuZm9yY2UodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oayA9IHRoaXMuaGsuZmlsdGVyKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShtYSkgIT09IHQgfHwgKGkucHVzaChlKSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh2YSksIHQucmVtb3ZlQXR0cmlidXRlKG1hKSwgdC5yZW1vdmVFdmVudExpc3RlbmVyKCd2b2x1bWVjaGFuZ2UnLCB0aGlzLmFrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2sodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmICF0LmdldEF0dHJpYnV0ZSgnY254cGwtdmwnKSAmJiAodC52b2x1bWUgPSAwLCB0LnNldEF0dHJpYnV0ZSh2YSwgJ3RydWUnKSwgdC5zZXRBdHRyaWJ1dGUobWEsIGkpLCB0LmFkZEV2ZW50TGlzdGVuZXIoJ3ZvbHVtZWNoYW5nZScsIHRoaXMuYWspLCB0aGlzLmhrLnB1c2godCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHlhIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdWsodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0LkVsZW1lbnQucHJvdG90eXBlLnNjcm9sbEludG9WaWV3ID0gaSwgdC5FbGVtZW50LnByb3RvdHlwZS5zY3JvbGxJbnRvVmlld0lmTmVlZGVkID0gaSwgdC5zY3JvbGwgPSBpLCB0LnNjcm9sbFRvID0gaSwgdC5zY3JvbGxCeSA9IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuZm9yY2UodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYykodCkgJiYgdGhpcy51ayh0LmNvbnRlbnRXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wRW5mb3JjZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2xlYXJFbmZvcmNlKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHdhIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGsgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNueEVuZlN0b3JhZ2UgPyB0LmNueEVuZlN0b3JhZ2UgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmZlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGsodGhpcy5mZSkgfHwgdGhpcy5kayh0aGlzLmZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfRW5mb3JjZXJNZW1vcnlfYmluZF9lbmZvcmNlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGsodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC53KSh0LmRvY3VtZW50LmhlYWQsIHQsICchZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3dpbmRvd1siY254IituXXx8KHdpbmRvd1siY254IituXT13aW5kb3dbbl0sd2luZG93W25dPWZ1bmN0aW9uKGUpe3ZhciB0PSIiO3RyeXtlJiYodD1mdW5jdGlvbiBuKGUsdCl7dHJ5e2lmKCFlKXJldHVybiIiO2lmKGUuY254SW5uZXJUYWcpcmV0dXJuIGUuY254SW5uZXJUYWc7aWYodDwyKXt2YXIgcj10KzE7cmV0dXJuIG4oZS5jYWxsZXIscil9fWNhdGNoKG4pe3JldHVybiIifXJldHVybiIifShlKSl9Y2F0Y2gobil7fXZhciByPXdpbmRvd1siY254IituXS5hcHBseShudWxsLGFyZ3VtZW50cyk7aWYodCl7dmFyIGk9d2luZG93LmNueEVuZlN0b3JhZ2U7aVtuXVt0XT1pW25dW3RdfHxbXSxpW25dW3RdLnB1c2gocil9cmV0dXJuIHJ9KX13aW5kb3cuY254RW5mU3RvcmFnZT17c2V0VGltZW91dDp7fSxzZXRJbnRlcnZhbDp7fSxldmVudExpc3RlbmVyczp7fSxlcnJvcnM6W119O3ZhciBlPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5zcGxpdCgiLiIpLHQ9d2luZG93LmJ0b2EoZVtlLmxlbmd0aC0yXSsiLiIrZVtlLmxlbmd0aC0xXSk7LTE9PT1bImRHMTZMbU52YlE9PSIsIlltbHNiR0p2WVhKa0xtTnZiUT09IiwiYUc5c2JIbDNiMjlrY21Wd2IzSjBaWEl1WTI5dCIsImRtbGlaUzVqYjIwPSIsImFHOXliM05qYjNCbExtTnZiUT09IiwiWVhOMGNtOXNiMmQ1TG1OdmJRPT0iLCJZV2h2Y21GdGFYTnRieTVqYjIwPSJdLmluZGV4T2YodCkmJighZnVuY3Rpb24oKXtjb25zdCBuPXdpbmRvdy5FdmVudFRhcmdldD93aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlOndpbmRvdy5kb2N1bWVudDtuLmNueEFkZEV2ZW50TGlzdGVuZXJ8fChuLmNueEFkZEV2ZW50TGlzdGVuZXI9bi5hZGRFdmVudExpc3RlbmVyLG4uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihuLGUsdCl7dmFyIHI9dGhpc3x8d2luZG93O2lmKGUmJmUuY254SW5uZXJUYWcpe3ZhciBpPXdpbmRvdy5jbnhFbmZTdG9yYWdlO2kuZXZlbnRMaXN0ZW5lcnNbZS5jbnhJbm5lclRhZ109aS5ldmVudExpc3RlbmVyc1tlLmNueElubmVyVGFnXXx8W10saS5ldmVudExpc3RlbmVyc1tlLmNueElubmVyVGFnXS5wdXNoKHtlbGVtZW50OnIsdHlwZTpuLGhhbmRsZXI6ZSxvcHRpb25zOnR9KX10cnl7ci5jbnhBZGRFdmVudExpc3RlbmVyKG4sZSx0KX1jYXRjaChuKXtuLm1lc3NhZ2U9ImFkbHN0bl8iK24ubWVzc2FnZSxpLmVycm9ycy5wdXNoKG4pfX0pfSgpLG4oInNldFRpbWVvdXQiKSxuKCJzZXRJbnRlcnZhbCIpKX0oKTsnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW5mb3JjZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QocnQuYykodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29udGVudFdpbmRvdy5zZWxmID09PSB0b3AgfHwgdC5jb250ZW50V2luZG93LkZ1bmN0aW9uLnByb3RvdHlwZS5jbnhJbm5lclRhZyB8fCB0LmNvbnRlbnRXaW5kb3cuT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuY29udGVudFdpbmRvdy5GdW5jdGlvbi5wcm90b3R5cGUsICdjbnhJbm5lclRhZycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5jb250ZW50V2luZG93LnNlbGYgPT09IHRvcCB8fCB0LmNvbnRlbnRXaW5kb3cuT2JqZWN0LnByb3RvdHlwZS5jbnhJbm5lclRhZyB8fCB0LmNvbnRlbnRXaW5kb3cuT2JqZWN0LmRlZmluZVByb3BlcnR5KHQuY29udGVudFdpbmRvdy5PYmplY3QucHJvdG90eXBlLCAnY254SW5uZXJUYWcnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0b3BFbmZvcmNlKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjbGVhckVuZm9yY2UodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMubGsodGhpcy5mZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmV2ZW50TGlzdGVuZXJzW3RdICYmIChpLmV2ZW50TGlzdGVuZXJzW3RdLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodC50eXBlLCB0LmhhbmRsZXIsIHQub3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ldmVudExpc3RlbmVyc1t0XSA9IFtdKSwgaS5zZXRJbnRlcnZhbFt0XSAmJiAoaS5zZXRJbnRlcnZhbFt0XS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZlLmNsZWFySW50ZXJ2YWwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5zZXRJbnRlcnZhbFt0XSA9IFtdKSwgaS5zZXRUaW1lb3V0W3RdICYmIChpLnNldFRpbWVvdXRbdF0uZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZS5jbGVhclRpbWVvdXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5zZXRUaW1lb3V0W3RdID0gW10pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBPYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmsgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlyYWxnYWlucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmluZy1zeXMuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21tZXJjaWFsYWRzZGlzdHJpYnV0b3InCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMucGsgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVhY2hmcm9udG1lZGlhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21tZXJjaWFsYWRzZGlzdHJpYnV0b3InCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuYmsgPSBbJ2NvbW1lcmNpYWxhZHNkaXN0cmlidXRvciddLCB0aGlzLnZrID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BpeGVsLmNsZWFyc3RyZWFtLnR2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaXhlbC5jbHJzdG0uY29tJwogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLm1rID0gbmV3IGppKCksIHRoaXMuZ2sgPSBuZXcgamkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uTWFsd2FyZURldGVjdGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tay5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uQmFkVXJpRGV0ZWN0ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdrLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmZvcmNlKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChydC5jKSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ayA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2sodCksIHRoaXMuT2sodCksIHRoaXMueGsodCksIHRoaXMuU2sodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcEVuZm9yY2UoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsZWFyRW5mb3JjZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgamsodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICB0LmV2ZXJ5KHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xID09PSBlLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmICFpLmdldEF0dHJpYnV0ZSgnY254JykgJiYgKGkuc2V0QXR0cmlidXRlKCdjbngnLCAndHJ1ZScpLCB0aGlzLmdrLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHRoaXMueWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlbWVudE1lc3NhZ2U6IGAkeyBzIH0tJHsgaSB9YAogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAodGhpcy5may5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5pbmRleE9mKHQpID4gLTEgJiYgdGhpcy5tay5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy55aywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlbWVudE1lc3NhZ2U6IGBtYWx3YXJlLSR7IHQgfWAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5qayhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fib3V0OmJsYW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYm91dDpzZWxmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYXZhc2NyaXB0OicKICAgICAgICAgICAgICAgICAgICAgICAgXSwgdCwgaSwgJ2lmcmFtZScpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT2sodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5jKSh0LmNvbnRlbnREb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JykpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdC5nZXRBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAodGhpcy5way5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW5kZXhPZih0KSA+IC0xICYmIHRoaXMubWsubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZUlkOiB0aGlzLnlrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlbWVudE1lc3NhZ2U6IGBtYWx3YXJlLSR7IHQgfWAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmprKFsnLy8nXSwgdCwgaSwgJ3NjcmlwdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGwuYykodC5jb250ZW50RG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKSkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmdldEF0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0aGlzLmJrLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5pbmRleE9mKHQpID4gLTEgJiYgdGhpcy5tay5uZXh0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlSWQ6IHRoaXMueWssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZm9yY2VtZW50TWVzc2FnZTogYG1hbHdhcmUtJHsgdCB9YAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTayh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChsLmMpKHQuY29udGVudERvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKSkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHRoaXMudmsuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmluZGV4T2YodCkgPiAtMSAmJiB0aGlzLm1rLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VJZDogdGhpcy55aywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5mb3JjZW1lbnRNZXNzYWdlOiBgbWFsd2FyZS0keyB0IH1gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgeGEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMua2sgPSBlLCB0aGlzLl9rID0gbnVsbCwgdGhpcy5BayA9IG5ldyBNYXAoKSwgdGhpcy5JayA9IFhuLk5vbmUsIHRoaXMuQ2sgPSAzMDAsIHRoaXMuamwgPSBbXSwgdGhpcy5UayA9IG5ldyBNYXAoKSwgdGhpcy5TeSA9IG5ldyBqaSgpLCB0aGlzLkFrLnNldChYbi5NZW1vcnlMZWFrLCBuZXcgd2EoaSkpLCBlIHx8IHRoaXMuQWsuc2V0KFhuLlNjcm9sbEhpamFjaywgbmV3IHlhKCkpLCAhdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBnYSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Bay5zZXQoWG4uTXV0ZSwgdCksIHRoaXMuamwucHVzaCh0Lm9uVm9sdW1lRGV0ZWN0ZWQuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGsoUW4uVk9MVU1FX0RFVEVDVEVELCB0LCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IG5ldyBPYSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpsLnB1c2gocy5vbkJhZFVyaURldGVjdGVkLnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGsoUW4uQkFEVVJJX0RFVEVDVEVELCB0LnJlZmVyZW5jZUlkLCB0LmVuZm9yY2VtZW50TWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzLm9uTWFsd2FyZURldGVjdGVkLnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUGsoUW4uTUFMV0FSRV9ERVRFQ1RFRCwgdC5yZWZlcmVuY2VJZCwgdC5lbmZvcmNlbWVudE1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuQWsuc2V0KFhuLk1hbHdhcmUsIHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25FbmZvcmNlckV2ZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TeS5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJDb250YWluZXIodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlRrLmdldCh0KSB8fCB0aGlzLlRrLnNldCh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlckNvbnRhaW5lcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVGsuZ2V0KHQpICYmICh0aGlzLkFrLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNsZWFyRW5mb3JjZSh0aGlzLlRrLmdldCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLlRrLmRlbGV0ZSh0KSwgdGhpcy5Uay5zaXplIHx8IHRoaXMuc3RvcChYbi5BbGwpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtrICYmICh0IF49IFhuLlNjcm9sbEhpamFjayksIHRoaXMuSWsgfD0gdCwgbnVsbCA9PT0gdGhpcy5fayAmJiAodGhpcy5fayA9IHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Uay5mb3JFYWNoKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTWsoaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQ2spKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSWsgJj0gfnQsIHRoaXMuSWsgPT09IFhuLk5vbmUgJiYgKGNsZWFySW50ZXJ2YWwodGhpcy5fayksIHRoaXMuX2sgPSBudWxsKSwgdGhpcy5Bay5mb3JFYWNoKChpLCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYgZSAmJiBpLnN0b3BFbmZvcmNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3AoWG4uQWxsKSwgQWkodGhpcy5qbCksIHRoaXMuVGsuZm9yRWFjaCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXJlZ2lzdGVyQ29udGFpbmVyKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTWsodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5jKSh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpZnJhbWUnKSkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Nayh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuQWsuZm9yRWFjaCgoZSwgcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JayAmIHMgJiYgZS5lbmZvcmNlKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUGsodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgczsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Uay5mb3JFYWNoKCh0LCBlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBpICYmIChzID0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLlN5Lm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZENvbnRhaW5lcjogcwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBTYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduID0gdCwgdGhpcy5FayA9ICExLCB0aGlzLkxrID0gdm9pZCAwLCB0aGlzLlJrID0gW10sIHRoaXMuamwgPSBbXSwgdGhpcy5CayA9ICExLCB0aGlzLkRrID0gbmV3IGppKCksIHRoaXMuRmsgPSBuZXcgamkoKSwgdGhpcy5WayA9IFtdLCB0aGlzLmpsLnB1c2godGhpcy5Xbi5hZEJpZFBvb2wub25CaWRSZWFkeS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWEudHJhY2tCaWRSZWFkeSh0aGlzLlduLnBsYXllcklkKSwgdGhpcy5VaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5Xbi5pbXByZXNzaW9uQ2Fwc1RpbWVyLm9uVGltZXIoKS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvbkFkU2VsZWN0ZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRrLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25BZEZpbmlzaGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Gay5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRrID0gdCwgdGhpcy5FayA9ICEwLCB0aGlzLlVrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0b3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRWsgPSAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCksIEFpKHRoaXMuamwpLCB0aGlzLkxrIHx8IHRoaXMuTmsoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVWsoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5FayB8fCB0aGlzLkJrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5Iayh0aGlzLiRrKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5xayh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MayAmJiB0aGlzLlduLnJlbW92ZUJpZElmSGlnaGVyWW9TY29yZSAmJiBpID8gKHRoaXMuTmsoKSwgdGhpcy5May5zdG9wQWQoJ3JlbW92ZVN0YXJ0ZWRCaWQnKSwgdGhpcy56ayh0KSkgOiB0aGlzLkxrIHx8IHRoaXMuemsodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHprKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MayA9IHQsIHRoaXMuVmsgPSBbXSwgdGhpcy5Xbi5hZEJpZFBvb2wubW92ZUJpZFRvU3RhcnRlZCh0KSwgdGhpcy5Eay5uZXh0KHQpLCB0aGlzLldrKHQpLCBpYS50cmFja1N0YXJ0QWQodGhpcy5Xbi5wbGF5ZXJJZCksIHQuc3RhcnRBZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MayAmJiAoQWkodGhpcy5SayksIHRoaXMuUmsgPSBbXSwgdGhpcy5Xbi5hZEJpZFBvb2wuY29uc3VtZUJpZFN0YXJ0ZWQodGhpcy5MayksIHRoaXMuTGsgPSB2b2lkIDAsIHRoaXMuVmsgPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmltcHJlc3Npb25DYXBzU2VydmljZS5jYW5DYWxsKGksIHRoaXMuJGsuYWRPcHBvcnR1bml0eS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuV24uYWRCaWRQb29sLmJpZHNSZWFkeS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Hayh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmFkSW1wcmVzc2lvbmVyWW8uZ2V0QmVzdEJpZChpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcWsodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLkxrICYmIHRoaXMuV24uYWRJbXByZXNzaW9uZXJZby5nZXRCZXR0ZXJCaWQodCwgdGhpcy5MaykgIT09IHRoaXMuTGs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEprKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CayAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQWRNYW5hZ2VyX0FCYXNlQmlkQWRhcHRvcl9tdWx0aXBsZUltcHJlc3Npb25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogYGFkdmVydGlzZXJMaW5lSXRlbUlkOiR7IHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCB9X2NyZWF0aXZlSWQ6JHsgdC5jcmVhdGl2ZUlkIH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBgJHsgdC5hZE1lZGlhVHlwZSB9YCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuV24uYWRJbXByZXNzaW9uZXJZby5yZWdpc3RlckltcHJlc3Npb24odC5zZXR0aW5ncy5pZCwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmNyZWF0aXZlVHlwZSksIGlhLnRyYWNrQWRJbXByZXNzaW9uKHRoaXMuV24ucGxheWVySWQsIHQpLCB0aGlzLkJrID0gITAsIHRoaXMuV24uYWRSZXF1ZXN0R2F0ZWtlZXBlci5hZGRJbXByZXNzaW9uKHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwgdC5zZXR0aW5ncy5vYmZ1c2NhdGVkUHJpY2UpLCB0aGlzLlduLmltcHJlc3Npb25DYXBzU2VydmljZS5yZWdpc3RlckltcHJlc3Npb25Gb3JMaW5lSXRlbSh0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLCB0aGlzLiRrLmFkT3Bwb3J0dW5pdHkuaWQpLCB0aGlzLlduLnJlcXVlc3RDYXBzU2VydmljZS5yZXN0b3JlT25lQ2FwRm9yTGluZUl0ZW0odC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwgdGhpcy4kay5hZE9wcG9ydHVuaXR5LmlkKSwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5iaWRzLmRlbGV0ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuV24uYXVjdGlvbkluZm9Mb2dnaW5nLm9uSW1wcmVzc2lvbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Rayh0LCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWGsodCwgaSwgZSwgcyA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWWsodCwgaSwgZSwgcyksIHRoaXMuV24ubG9vcEFkV2hlbkZpbmlzaGVkID8gdC5yZXN1bWVBZCgpIDogdGhpcy5Xbi5wYXVzZUFkV2hlbkZpbmlzaGVkID8gdC5wYXVzZUFkKCkgOiAodGhpcy5Gay5uZXh0KHQpLCB0aGlzLk5rKCksIHRoaXMuVWsoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFlrKHQsIGksIGUsIHMgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5CaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkICh0aGlzLkJrID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV24uYWRJbXByZXNzaW9uZXJZby5yZWdpc3RlclBvc3RCaWQodC5zZXR0aW5ncy5pZCwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmNyZWF0aXZlVHlwZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLlduLmF1Y3Rpb25JbmZvTG9nZ2luZy5vblBvc3RCaWQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuS2sodCwgZSwgaSwgbiksIHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0uYmlkcy5kZWxldGUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFrKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSB0aGlzLiRrLmFkQnJlYWtTdGF0ZSwgaCA9IE9iamVjdChydC5kKShPYmplY3Qod2kuZikodC5nZXRBZER1cmF0aW9uKCksIDIpKSA/IE9iamVjdCh3aS5mKSh0LmdldEFkRHVyYXRpb24oKSwgMikgOiAwLCBhID0gT2JqZWN0KHJ0LmQpKE9iamVjdCh3aS5mKSh0LmRlY2xhcmVkRHVyYXRpb25JblNlY29uZHMsIDIpKSA/IE9iamVjdCh3aS5mKSh0LmRlY2xhcmVkRHVyYXRpb25JblNlY29uZHMsIDIpIDogMCwgbyA9IGggLSBhLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUG9kU2xvdFBvc2l0aW9uOiByLmFkUG9kU2xvdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkc291cmNlVHlwZTogdC5hZFNvdXJjZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21DbGllbnRQcmljZTogdC5zZXR0aW5ncy5jcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkUHJpY2U6IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEuZW5jcnlwdGVkUHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYmlkSnNCaWRkZXJOYW1lOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnByZWJpZEpzQmlkZGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGJBZG9tYWluOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnJ0YkFkb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVJZDogdC5jcmVhdGl2ZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YlNlYXRJZDogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5ydGJTZWF0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VkVXNlcjogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5zeW5jZWRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTcGVudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0TWVkaWFUeXBlOiB0LmFkTWVkaWFUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmRzcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNueEJpZElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmNueEJpZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpblRvQWRMb2FkZWRUaW1lOiBudWxsID09PSAocyA9IHQuc2V0dGluZ3MuYmlkTGlmZWN5Y2xlKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLndpblRvQWRMb2FkZWRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0QWRUb0ltcHJlc3Npb25UaW1lOiBudWxsID09PSAobiA9IHQuc2V0dGluZ3MuYmlkTGlmZWN5Y2xlKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLnN0YXJ0QWRUb0ltcHJlc3Npb25UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25EdXJhdGlvbjogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZER1cmF0aW9uOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUV4cGxvcmF0aW9uOiB0aGlzLlduLmV4cGxvcmF0aW9uTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJXaWR0aDogdGhpcy5Xbi5hZENvbnRhaW5lci5nZXRDb250YWluZXJTdGF0ZU1hcCgpLmdldCh0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWRUeXBlKS53aWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKGUpICYmIChjLmF1Y3Rpb25JbmZvcm1hdGlvbiA9IGUpLCB0aGlzLlduLnRyYWNraW5nU2VydmljZS50cmFja1ZpZGVvQWRJbXByZXNzaW9uKGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLayh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gdGhpcy4kay5hZEJyZWFrU3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlhLnRyYWNrUG9zdEJpZCh0aGlzLlduLnBsYXllcklkKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUG9kU2xvdFBvc2l0aW9uOiByLmFkUG9kU2xvdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRzb3VyY2VUeXBlOiB0LmFkU291cmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZEpzQmlkZGVyTmFtZTogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5wcmViaWRKc0JpZGRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0TWVkaWFUeXBlOiB0LmFkTWVkaWFUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VkVXNlcjogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5zeW5jZWRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiU2VhdElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnJ0YlNlYXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YkFkb21haW46IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEucnRiQWRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHQuY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTcGVudDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmRzcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY254QmlkSWQ6IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEuY254QmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5Ub0FkTG9hZGVkVGltZTogbnVsbCA9PT0gKG4gPSB0LnNldHRpbmdzLmJpZExpZmVjeWNsZSkgfHwgdm9pZCAwID09PSBuID8gdm9pZCAwIDogbi53aW5Ub0FkTG9hZGVkVGltZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYSkocykgJiYgKGguYXVjdGlvbkluZm9ybWF0aW9uID0gcywgaC5hdWN0aW9uUG9zdGJpZFJlYXNvbiA9IHRoaXMuV24uYXVjdGlvbkluZm9Mb2dnaW5nLmdldEdlbmVyYWxQb3N0YmlkUmVhc29uKGkpKSwgdGhpcy5Xbi50cmFja2luZ1NlcnZpY2UuYWRkUG9zdEJpZChoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWmsodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZrLmluZGV4T2YoaSkgPj0gMCAmJiAhKHRoaXMuV24ucGF1c2VBZFdoZW5GaW5pc2hlZCB8fCB0aGlzLlduLmxvb3BBZFdoZW5GaW5pc2hlZCkgPyAxID09PSBPYmplY3QoTGkuaykoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgOTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgIF0pICYmIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQWRJbXByZXNzaW9uZXJDb250cm9sbGVyX2hhbmRsZVF1YXJ0aWxlc1RyYWNraW5nX3RyYWNrX3NhbWVfcXVhcnRpbGVfdHdpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5hZE1lZGlhVHlwZQogICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICh0aGlzLlZrLnB1c2goaSksIHRoaXMuV24udHJhY2tpbmdTZXJ2aWNlLnRyYWNrVmlkZW9BZFF1YXJ0aWxlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0aWxlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiU2VhdElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnJ0YlNlYXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmRzcElkCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV2sodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Say5wdXNoKHQub25WcGFpZEV2ZW50LnN1YnNjcmliZShlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRJbXByZXNzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRDbGlja1RocnU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZENsaWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRTdGFydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRTdGFydGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb1N0YXJ0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRWaWRlb1N0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb0ZpcnN0UXVhcnRpbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFF1YXJ0aWxlRmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFZpZGVvTWlkcG9pbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFF1YXJ0aWxlU2Vjb25kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb1RoaXJkUXVhcnRpbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFF1YXJ0aWxlVGhpcmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFZpZGVvQ29tcGxldGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFF1YXJ0aWxlRm91cnRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRQYXVzZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFBhdXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRQbGF5aW5nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYWRSZXN1bWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFNraXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hZFNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFVzZXJDbG9zZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmFkVXNlckNsb3NlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRVc2VyQWNjZXB0SW52aXRhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmFkVXNlckFjY2VwdEludml0YXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFVzZXJNaW5pbWl6ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmFkVXNlck1pbmltaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmFkRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUudHlwZSwgdC5zZXR0aW5ncy50cmFja2VycyksIGEgPSBEYXRlLm5vdygpIC0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAociB8fCBlLnR5cGUgIT09IFB0LmIuQWRJbXByZXNzaW9uIHx8ICh0aGlzLnRfKCdBZE1hbmFnZXJfQWRJbXByZXNzaW9uQ29udHJvbGxlcl90cmFja2VyX2ltcHJlc3Npb25fbm90X2ZvdW5kJyksIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfQWRJbXByZXNzaW9uQ29udHJvbGxlcl90cmFja2VyX2ltcHJlc3Npb25fbm90X2ZvdW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBIbi50cmFjayhyLCB0aGlzLlduLmFkTWFjcm9SZXBsYWNlciwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLCB0LnNldHRpbmdzLmNhbGxpbmdTdGF0ZSksIGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Yayh0LCBhLCBlLnBheWxvYWQuZXJyb3JNZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFNraXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Yayh0LCBhLCBZbi5jLkFkU3RvcHBlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRTdG9wcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWGsodCwgYSwgWW4uYy5BZFN0b3BwZWQsIG51bGwgPT09IChzID0gZS5wYXlsb2FkKSB8fCB2b2lkIDAgPT09IHMgPyB2b2lkIDAgOiBzLnNob3VsZFRyYWNrUG9zdEJpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSmsodCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb0ZpcnN0UXVhcnRpbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aayh0LCBoLlByb3RvUXVhcnRpbGVzRW51bS5GaXJzdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb01pZHBvaW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWmsodCwgaC5Qcm90b1F1YXJ0aWxlc0VudW0uU2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFZpZGVvVGhpcmRRdWFydGlsZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlprKHQsIGguUHJvdG9RdWFydGlsZXNFbnVtLlRoaXJkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUHQuYi5BZFZpZGVvQ29tcGxldGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aayh0LCBoLlByb3RvUXVhcnRpbGVzRW51bS5Gb3VydGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSksIHRoaXMuUmsucHVzaCh0Lm9uQWRWaWV3YWJsZUltcHJlc3Npb24uc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Xbi50cmFja2luZ1NlcnZpY2UudHJhY2tWaWRlb0FkSW1wcmVzc2lvblZpZXdhYmxlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRfKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogbnVsbCA9PT0gKGUgPSBpKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IG51bGwgPT09IChzID0gaSkgfHwgdm9pZCAwID09PSBzID8gdm9pZCAwIDogcy5zdGFjawogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBqYSA9IHsKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5QcmVSb2xsXTogJ3ByZVJvbGwnLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvQWRCcmVha1R5cGVFbnVtLk1pZFJvbGxdOiAnbWlkUm9sbCcsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9BZEJyZWFrVHlwZUVudW0uUG9zdFJvbGxdOiAncG9zdFJvbGwnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3Mga2EgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pXyA9IHQsIHRoaXMuRGEgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXBsYWNlKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pXy5zZXRBZFdpZHRoKGUuYWRNYWNyb3MuYWRXaWR0aCksIHRoaXMuaV8uc2V0QWRIZWlnaHQoZS5hZE1hY3Jvcy5hZEhlaWdodCksIHRoaXMuaV8uc2V0QWRQb3NpdGlvbihqYVtlLmFkTWFjcm9zLmFkUG9zdGlvbl0pLCBlLm1lZGlhTWFjcm9zLm1lZGlhRGVzY3JpcHRpb24gJiYgdGhpcy5pXy5zZXRWaWRlb0Rlc2NyaXB0aW9uKGUubWVkaWFNYWNyb3MubWVkaWFEZXNjcmlwdGlvbiksIGUubWVkaWFNYWNyb3MubWVkaWFEdXJhdGlvbiAmJiB0aGlzLmlfLnNldFZpZGVvRHVyYXRpb24oZS5tZWRpYU1hY3Jvcy5tZWRpYUR1cmF0aW9uKSwgZS5tZWRpYU1hY3Jvcy5tZWRpYUlkICYmIHRoaXMuaV8uc2V0VmlkZW9JZChlLm1lZGlhTWFjcm9zLm1lZGlhSWQpLCBlLm1lZGlhTWFjcm9zLm1lZGlhVGl0bGUgJiYgdGhpcy5pXy5zZXRWaWRlb1RpdGxlKGUubWVkaWFNYWNyb3MubWVkaWFUaXRsZSksIGUubWVkaWFNYWNyb3MubWVkaWFVcmwgJiYgdGhpcy5pXy5zZXRWaWRlb1VybChlLm1lZGlhTWFjcm9zLm1lZGlhVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuRGEuaXNDb25zZW50KGkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlfLnNldEdEUFIodGhpcy5EYS5pc0NvbnNlbnRSZXF1aXJlZCgpID8gMSA6IDApLCB0aGlzLmlfLnNldENvbnNlbnQocyA/IDEgOiAwKSwgdGhpcy5pXy5zZXRHRFBSQ29uc2VudCh0aGlzLkRhLmdldENvbnNlbnRQYXlsb2FkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5EYS5nZXRUcmFja2FibGVVc2VyKCksIHIgPSB0aGlzLkRhLmlzQ29uc2VudENvbm5hdGl4KCkgJiYgcyA/IG4gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlfLnNldFVVSUQociksIHRoaXMuaV8uc2V0dXBNYWNyb3ModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgX2EgPSAzMCAqIHF0LmY7CiAgICAgICAgICAgICAgICBjbGFzcyBBYSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZV8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbkFkUmVtb3ZlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lXyA9IG51bGwsIHRoaXMuc18oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2VWaWFVc2VySW50ZXJhY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZV8gJiYgKHRoaXMuZV8ucGF1c2VkV2l0aFVzZXJJbnRlcmFjdGlvbiA9ICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lVmlhVXNlckludGVyYWN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVfICYmICh0aGlzLmVfLnBhdXNlZFdpdGhVc2VySW50ZXJhY3Rpb24gPSAhMSwgdGhpcy5zXygpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbl8odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVfID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXVzZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkV2l0aFVzZXJJbnRlcmFjdGlvbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdUaW1lRm9yQWRUb0JlUGF1c2VkOiBfYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RBZFBhdXNlZFN0YXJ0ZWRUaW1lc3RhbXA6IHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNfKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNoZWNrUGF1c2VBZCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG51bGwgPT09IHRoaXMuZV8gJiYgdGhpcy5uXyh0KSwgaSA/IHRoaXMucl8odCkgOiB0aGlzLmhfKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaF8odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFfKHQpICYmICh0aGlzLmVfLmlzUGF1c2VkID0gITAsIHRoaXMuZV8ubGFzdEFkUGF1c2VkU3RhcnRlZFRpbWVzdGFtcCA9IERhdGUubm93KCksIHQucGF1c2VBZCgpLCB0aGlzLnNfKCksIHRoaXMub18gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc3RvcEFkKCdwYXVzZU91dE9mVmlldycpLCB0aGlzLmVfID0gbnVsbCwgdGhpcy5zXygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmVfLnJlbWFpbmluZ1RpbWVGb3JBZFRvQmVQYXVzZWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcl8odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucGF1c2VBZE91dE9mVmlldyAmJiB0LmltcHJlc3Npb25TdGFydGVkICYmIHRoaXMuZV8uaXNQYXVzZWQgJiYgIXRoaXMuZV8ucGF1c2VkV2l0aFVzZXJJbnRlcmFjdGlvbiAmJiAodGhpcy5zXygpLCB0aGlzLmVfLmlzUGF1c2VkID0gITEsIHRoaXMuZV8ucmVtYWluaW5nVGltZUZvckFkVG9CZVBhdXNlZCA9IHRoaXMuZV8ucmVtYWluaW5nVGltZUZvckFkVG9CZVBhdXNlZCAtIChEYXRlLm5vdygpIC0gdGhpcy5lXy5sYXN0QWRQYXVzZWRTdGFydGVkVGltZXN0YW1wKSwgdC5yZXN1bWVBZCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc18oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9fKSwgdGhpcy5vXyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYV8odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLnBhdXNlQWRPdXRPZlZpZXcgJiYgdC5pbXByZXNzaW9uU3RhcnRlZCAmJiAhdGhpcy5lXy5pc1BhdXNlZCAmJiAhdGhpcy5lXy5wYXVzZWRXaXRoVXNlckludGVyYWN0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIElhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvbi4gQXJlIHlvdSBsb29raW5nIGZvciBgbWFwVG8oKWA/Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxpZnQobmV3IENhKHQsIGkpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIENhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHQsIHRoaXMudGhpc0FyZyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3Vic2NyaWJlKG5ldyBUYSh0LCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKSwgVGEgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5jYWxsKHRoaXMsIGkpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wcm9qZWN0ID0gZSwgbi5jb3VudCA9IDAsIG4udGhpc0FyZyA9IHMgfHwgbiwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlLl9sID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy5wcm9qZWN0LmNhbGwodGhpcy50aGlzQXJnLCB0LCB0aGlzLmNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSksIFBhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgcyA9IHQubGVuZ3RoOyBlIDwgcyAmJiAhaS5jbG9zZWQ7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLm5leHQodFtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE1hKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yID8gU3ltYm9sLml0ZXJhdG9yIDogJ0BAaXRlcmF0b3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEVhID0gTWEoKSwgTGEgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgdC5sZW5ndGggJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUmEodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQgJiYgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdC5zdWJzY3JpYmUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdC50aGVuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEJhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0W2hpXSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPSB0LCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBzW2hpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGkuc3Vic2NyaWJlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb3ZpZGVkIG9iamVjdCBkb2VzIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IFN5bWJvbC5vYnNlcnZhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zdWJzY3JpYmUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKExhKHQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGEodCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJhKHQpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IHQsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50aGVuKGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jbG9zZWQgfHwgKHQubmV4dChpKSwgdC5jb21wbGV0ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZXJyb3IoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKG51bGwsIFh0KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0W0VhXSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSB0LCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGlbRWFdKCk7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBlLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVycm9yKGkpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5kb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lm5leHQocy52YWx1ZSksIHQuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnJldHVybiAmJiB0LmFkZChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZXR1cm4gJiYgZS5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBpLCBlLCBzLCBuID0gWnQodCkgPyAnYW4gaW52YWxpZCBvYmplY3QnIDogJ1wnJyArIHQgKyAnXCcnOwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1lvdSBwcm92aWRlZCAnICsgbiArICcgd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLiBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgQXJyYXksIG9yIEl0ZXJhYmxlLicpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIERhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGNpKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbmV3IGlpKCksIG4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICE9PSB0Lmxlbmd0aCA/IChlLm5leHQodFtuKytdKSwgZS5jbG9zZWQgfHwgcy5hZGQodGhpcy5zY2hlZHVsZSgpKSkgOiBlLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgczsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHRbaGldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2koZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuZXcgaWkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuYWRkKGkuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W2hpXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQobi5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKGkuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKGkuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkKGkuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJhKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjaShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG5ldyBpaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50aGVuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmV4dCh0KSwgcy5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZChpLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMYSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEYSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdFtFYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpIHx8ICdzdHJpbmcnID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBjaShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgbiA9IG5ldyBpaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZGQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBzLnJldHVybiAmJiBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gdFtFYV0oKSwgbi5hZGQoaS5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmNsb3NlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbi52YWx1ZSwgaSA9IG4uZG9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZS5lcnJvcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID8gZS5jb21wbGV0ZSgpIDogKGUubmV4dCh0KSwgdGhpcy5zY2hlZHVsZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKG51bGwgIT09IHQgJiYgdHlwZW9mIHQgfHwgdCkgKyAnIGlzIG5vdCBvYnNlcnZhYmxlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgVmEgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdC5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJlbnQgPSBpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUuX2wgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5TmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuQWwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQubm90aWZ5RXJyb3IodCksIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuSWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlDb21wbGV0ZSgpLCB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSksIFVhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmIHQuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5vdGlmeUVycm9yID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0obmkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gJGEodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgJiYgKGUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBpID8gZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucGlwZSgkYShmdW5jdGlvbiAoZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gdChlLCBzKSwgciA/IEZhKG4sIHIpIDogbiBpbnN0YW5jZW9mIGNpID8gbiA6IG5ldyBjaShCYShuKSkpLnBpcGUoSWEoZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlLCB0LCBzLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgfSA6ICgnbnVtYmVyJyA9PSB0eXBlb2YgaSAmJiAoZSA9IGkpLCBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5saWZ0KG5ldyBOYSh0LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgTmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBpICYmIChpID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSwgdGhpcy5wcm9qZWN0ID0gdCwgdGhpcy5jb25jdXJyZW50ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zdWJzY3JpYmUobmV3IEhhKHQsIHRoaXMucHJvamVjdCwgdGhpcy5jb25jdXJyZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBIYSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBzICYmIChzID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5jYWxsKHRoaXMsIGkpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wcm9qZWN0ID0gZSwgbi5jb25jdXJyZW50ID0gcywgbi5oYXNDb21wbGV0ZWQgPSAhMSwgbi5idWZmZXIgPSBbXSwgbi5hY3RpdmUgPSAwLCBuLmluZGV4ID0gMCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlLl9sID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlIDwgdGhpcy5jb25jdXJyZW50ID8gdGhpcy5jXyh0KSA6IHRoaXMuYnVmZmVyLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmNfID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlID0gdGhpcy5pbmRleCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdGhpcy5wcm9qZWN0KHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSsrLCB0aGlzLnVfKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS51XyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBWYSh0aGlzKSwgZSA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkZChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkuY2xvc2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGNpID8gdC5zdWJzY3JpYmUoaSkgOiBCYSh0KShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICE9PSBpICYmIGUuYWRkKHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5JbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gITAsIDAgPT09IHRoaXMuYWN0aXZlICYmIDAgPT09IHRoaXMuYnVmZmVyLmxlbmd0aCAmJiB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCksIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUubm90aWZ5TmV4dCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5vdGlmeUNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlLS0sIHQubGVuZ3RoID4gMCA/IHRoaXMuX2wodC5zaGlmdCgpKSA6IDAgPT09IHRoaXMuYWN0aXZlICYmIHRoaXMuaGFzQ29tcGxldGVkICYmIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaTsKICAgICAgICAgICAgICAgICAgICB9KFVhKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHFhKCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHRbaV0gPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHMgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG4gPSBudWxsLCByID0gdFt0Lmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IHIpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuc2NoZWR1bGUgPyAobiA9IHQucG9wKCksIHQubGVuZ3RoID4gMSAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgdFt0Lmxlbmd0aCAtIDFdICYmIChzID0gdC5wb3AoKSkpIDogJ251bWJlcicgPT0gdHlwZW9mIHIgJiYgKHMgPSB0LnBvcCgpKSwgbnVsbCA9PT0gbiAmJiAxID09PSB0Lmxlbmd0aCAmJiB0WzBdIGluc3RhbmNlb2YgY2kgPyB0WzBdIDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gdCAmJiAodCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSksICRhKGFpLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KHMpKGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID8gRGEodCwgaSkgOiBuZXcgY2koUGEodCkpOwogICAgICAgICAgICAgICAgICAgIH0odCwgbikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gemEodCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5saWZ0KG5ldyBXYSh0LCBpKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBXYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWRpY2F0ZSA9IHQsIHRoaXMudGhpc0FyZyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3Vic2NyaWJlKG5ldyBHYSh0LCB0aGlzLnByZWRpY2F0ZSwgdGhpcy50aGlzQXJnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCBHYSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmNhbGwodGhpcywgaSkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnByZWRpY2F0ZSA9IGUsIG4udGhpc0FyZyA9IHMsIG4uY291bnQgPSAwLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUuX2wgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0aGlzLnByZWRpY2F0ZS5jYWxsKHRoaXMudGhpc0FyZywgdCwgdGhpcy5jb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0aGlzLmRlc3RpbmF0aW9uLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBKYSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSAmJiAoaSA9ICExKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubGlmdChuZXcgUWEodCwgaSkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgUWEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSB0LCB0aGlzLmluY2x1c2l2ZSA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3Vic2NyaWJlKG5ldyBYYSh0LCB0aGlzLnByZWRpY2F0ZSwgdGhpcy5pbmNsdXNpdmUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICB9KCksIFhhID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuY2FsbCh0aGlzLCBpKSB8fCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucHJlZGljYXRlID0gZSwgbi5pbmNsdXNpdmUgPSBzLCBuLmluZGV4ID0gMCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlLl9sID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBlID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRoaXMucHJlZGljYXRlKHQsIHRoaXMuaW5kZXgrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZS5lcnJvcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dE9yQ29tcGxldGUodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLm5leHRPckNvbXBsZXRlID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4oaSkgPyBlLm5leHQodCkgOiAodGhpcy5pbmNsdXNpdmUgJiYgZS5uZXh0KHQpLCBlLmNvbXBsZXRlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0obmkpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWWEoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBLYSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmxpZnQobmV3IFphKHQsIGksIGUpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFphID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dE9yT2JzZXJ2ZXIgPSB0LCB0aGlzLmVycm9yID0gaSwgdGhpcy5jb21wbGV0ZSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3Vic2NyaWJlKG5ldyB0byh0LCB0aGlzLm5leHRPck9ic2VydmVyLCB0aGlzLmVycm9yLCB0aGlzLmNvbXBsZXRlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQ7CiAgICAgICAgICAgICAgICAgICAgfSgpLCB0byA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0LmNhbGwodGhpcywgaSkgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmxfID0gWWEsIHIuZF8gPSBZYSwgci5mXyA9IFlhLCByLmRfID0gcyB8fCBZYSwgci5mXyA9IG4gfHwgWWEsIEd0KGUpID8gKHIuUGwgPSByLCByLmxfID0gZSkgOiBlICYmIChyLlBsID0gZSwgci5sXyA9IGUubmV4dCB8fCBZYSwgci5kXyA9IGUuZXJyb3IgfHwgWWEsIHIuZl8gPSBlLmNvbXBsZXRlIHx8IFlhKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3QoaSwgdCksIGkucHJvdG90eXBlLl9sID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sXy5jYWxsKHRoaXMuUGwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLkFsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kXy5jYWxsKHRoaXMuUGwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5JbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mXy5jYWxsKHRoaXMuUGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHRoaXMuZGVzdGluYXRpb24uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpOwogICAgICAgICAgICAgICAgICAgIH0obmkpOwogICAgICAgICAgICAgICAgY2xhc3MgaW8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWQgPSB0LCB0aGlzLmNhbmNlbGxlZCA9ICExLCB0aGlzLnBfID0gbmV3IGppKCksIHRoaXMuYl8gPSAhMSwgdGhpcy5HeSA9IHRoaXMuYmlkLm9uVnBhaWRFdmVudC5waXBlKHphKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSA9PT0gUHQuYi5BZExvYWRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEphKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5iXzsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEthKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYl8gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLkp5ID0gdGhpcy5iaWQub25WcGFpZEV2ZW50LnBpcGUoemEodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlID09PSBQdC5iLkFkRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBJYSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnBheWxvYWQuZXJyb3JNZXNzYWdlOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgSmEoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmJfOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgS2EoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iXyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBvblN1Y2Nlc3MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkd5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25GYWlsdXJlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWEodGhpcy5wXywgdGhpcy5KeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvYWRCaWQodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpZC5pbml0QWQodCwgaSwgZSwgcywgdm9pZCAwLCB2b2lkIDAsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGVvID0gMTsKICAgICAgICAgICAgICAgIGNsYXNzIHNvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV24gPSB0LCB0aGlzLnZfID0gbmV3IFNldCgpLCB0aGlzLm1fID0gbmV3IE1hcCgpLCB0aGlzLmpsID0gW10sIHRoaXMudmwgPSAhMSwgdGhpcy5nXyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnlfKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMud18oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5zZWxlY3RlZEJpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gRGF0ZS5ub3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmF1Y3Rpb25JbmZvTG9nZ2luZy53aW5CaWQodC5zZWxlY3RlZEJpZCksIHRoaXMuT18odCwgdGhpcy54Xy52YXN0Vmlld01vZGUpLmNhdGNoKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtzZWxlY3RlZEJpZDogc30gPSB0LCBuID0gdGhpcy5Xbi5hdWN0aW9uSW5mb0xvZ2dpbmcub25Qb3N0QmlkKHQuc2VsZWN0ZWRCaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMuU18ocywgaSwgZSwgbiksIHRoaXMual8oKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMual8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSlNPTi5zdHJpbmdpZnkoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdBZE1hbmFnZXJfd2luQmlkX2ZhaWxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ2ogPSBuZXcgSmgodGhpcy5nXywgZW8pLCB0aGlzLmpsLnB1c2godGhpcy5Xbi5hZEJpZFBvb2wub25CaWQuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMud18oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV24uYXVjdGlvbkluZm9Mb2dnaW5nLm5ld0JpZEFkZGVkKHQsIGkpLCB0aGlzLmpfKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLlduLmFkQmlkUG9vbC5vbkJpZFN0YXJ0ZWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMual8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuV24uYWRCaWRQb29sLm9uQmlkUmVhZHlDb25zdW1lZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qXygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5Xbi5pbXByZXNzaW9uQ2Fwc1RpbWVyLm9uVGltZXIoKS5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qXygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZ0JpZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZfLnNpemUgPiAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aW4odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhfID0gdCwgdGhpcy5nai5zZXROdW1iZXJPZlRocmVhZHModC5tYXhQYXJhbGxlbFdpbnMpLCB0aGlzLnZsID0gITAsIHRoaXMual8oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52bCA9ICExLCB0aGlzLmdqLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCksIEFpKHRoaXMuamwpLCB0aGlzLm1fLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgal8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmwgJiYgdGhpcy5nai5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3XygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMua18oKSwgaSA9IHRoaXMuX18oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQV8odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEFfKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdC5hc3NpZ24oe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZWxlY3RlZEJpZCAmJiBpLnNlbGVjdGVkQmlkID8gKHRoaXMuSV8oaS5zZWxlY3RlZEJpZCwgdC5zZWxlY3RlZEJpZCkgJiYgKGUuc2VsZWN0ZWRCaWQgPSB2b2lkIDAsIGUudW5zZWxlY3RlZEJpZExpc3QucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQ6IHQuc2VsZWN0ZWRCaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzUmVhc29uOiBoLlByb3RvQXVjdGlvbkxvc3NSZWFzb25FbnVtLkNvbXBldGl0b3JQcmlvcml0eQogICAgICAgICAgICAgICAgICAgICAgICB9KSksIGUpIDogZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeV8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gdGhpcy5Xbi5tYXhOdW1iZXJPZldpbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLmFkQmlkUG9vbC5iaWRzUmVhZHkubGVuZ3RoICsgdGhpcy52Xy5zaXplICsgKHRoaXMuV24uYWRCaWRQb29sLmJpZFN0YXJ0ZWQgPyAxIDogMCkgPj0gdGhpcy5Xbi5tYXhOdW1iZXJPZldpbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGtfKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DXyh0aGlzLlduLmFkQmlkUG9vbC5iaWRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX18oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5PYmplY3QobC5kKSh0aGlzLnZfKS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLlduLmFkQmlkUG9vbC5iaWRzUmVhZHkKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ18odCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENfKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24uYWRXaW5uZXJZby5zZWxlY3RCZXN0QmlkKHQsIHRoaXMueF8uc3RhdGVTZXR0aW5ncywgdGhpcy5Xbi5pbXByZXNzaW9uQ2Fwc1NlcnZpY2UsIHRoaXMuV24ucGxhdGZvcm1DYXBwZWRMaW5lSXRlbVJlcG8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBJXyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKHRoaXMuV24uYWRXaW5uZXJZby5nZXRXaW5uaW5nWW9TY29yZSh0LnNldHRpbmdzLmlkKSA8PSB0aGlzLlduLmFkV2lubmVyWW8uZ2V0V2lubmluZ1lvU2NvcmUoaS5zZXR0aW5ncy5pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPXyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoZSwgcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEJpZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdCwgaCA9IG5ldyBpbyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudl8uYWRkKGgpLCB0aGlzLlduLmFkQmlkUG9vbC5tb3ZlQmlkVG9Mb2FkaW5nKG4pLCBoLm9uU3VjY2Vzcy5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudl8uZGVsZXRlKGgpLCB0aGlzLlduLmFkQmlkUG9vbC5tb3ZlQmlkVG9SZWFkeShuKSwgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGgub25GYWlsdXJlLnN1YnNjcmliZShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZfLmRlbGV0ZShoKSwgdGhpcy5Xbi5hZEJpZFBvb2wuY29uc3VtZUJpZExvYWRpbmcobiksIHQuc2VsZWN0ZWRCaWQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0uYmlkcy5kZWxldGUobiksIHMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSByLmFkQ29udGFpbmVyU3RhdGUuZ2V0KG4uc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZFR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5sb2FkQmlkKGEsIG8sIGksIHRoaXMuV24uZGVzaXJlZEJpdFJhdGVGb3JXaW5zLCByLnNvdW5kVmFsdWUpLCBIbi50cmFjayhuLnNldHRpbmdzLnRyYWNrZXJzLmFkV2luLCB0aGlzLlduLmFkTWFjcm9SZXBsYWNlciwgbi5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLCByKSwgaWEudHJhY2tXaW4odGhpcy5Xbi5wbGF5ZXJJZCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTXyh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVF8odCwgRGF0ZS5ub3coKSAtIGksIGUsIHMpLCB0aGlzLlduLmFkV2lubmVyWW8ucmVnaXN0ZXJQb3N0QmlkKHQuc2V0dGluZ3MuaWQsIHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGUsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUXyh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBoLCBhLCBvOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gKG51bGwgPT09IChyID0gbnVsbCA9PT0gKG4gPSB0aGlzLnhfLnN0YXRlU2V0dGluZ3MpIHx8IHZvaWQgMCA9PT0gbiA/IHZvaWQgMCA6IG4uY3VycmVudFN0YXRlKSB8fCB2b2lkIDAgPT09IHIgPyB2b2lkIDAgOiByLmFkQnJlYWtTdGF0ZSkgfHwgKG51bGwgPT09IChhID0gbnVsbCA9PT0gKGggPSB0aGlzLnhfLnN0YXRlU2V0dGluZ3MpIHx8IHZvaWQgMCA9PT0gaCA/IHZvaWQgMCA6IGgucHJlZGljdGVkU3RhdGUpIHx8IHZvaWQgMCA9PT0gYSA/IHZvaWQgMCA6IGEuYWRCcmVha1N0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgSG4udHJhY2sodC5zZXR0aW5ncy50cmFja2Vycy5hZEVycm9yLCB0aGlzLlduLmFkTWFjcm9SZXBsYWNlciwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLCB0LnNldHRpbmdzLmNhbGxpbmdTdGF0ZSksIGlhLnRyYWNrUG9zdEJpZCh0aGlzLlduLnBsYXllcklkKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUG9kU2xvdFBvc2l0aW9uOiBjLmFkUG9kU2xvdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRzb3VyY2VUeXBlOiB0LmFkU291cmNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWR2ZXJ0aXNlckxpbmVJdGVtSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiB0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0ucHVibGlzaGVyTGluZUl0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZEpzQmlkZGVyTmFtZTogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5wcmViaWRKc0JpZGRlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0TWVkaWFUeXBlOiB0LmFkTWVkaWFUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2VkVXNlcjogdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5zeW5jZWRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRiU2VhdElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLnJ0YlNlYXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YkFkb21haW46IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEucnRiQWRvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHQuY3JlYXRpdmVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTcGVudDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzcElkOiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmRzcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY254QmlkSWQ6IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEuY254QmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5Ub0FkTG9hZGVkVGltZTogbnVsbCA9PT0gKG8gPSB0LnNldHRpbmdzLmJpZExpZmVjeWNsZSkgfHwgdm9pZCAwID09PSBvID8gdm9pZCAwIDogby53aW5Ub0FkTG9hZGVkVGltZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuYSkocykgJiYgKHUuYXVjdGlvbkluZm9ybWF0aW9uID0gcywgdS5hdWN0aW9uUG9zdGJpZFJlYXNvbiA9IHRoaXMuV24uYXVjdGlvbkluZm9Mb2dnaW5nLmdldEdlbmVyYWxQb3N0YmlkUmVhc29uKGUpKSwgdGhpcy5Xbi50cmFja2luZ1NlcnZpY2UuYWRkUG9zdEJpZCh1KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbm87CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChsLmgpKGkuaXRlbXMpICYmIEFycmF5LmlzQXJyYXkodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QobC5iKSh0LCBpLml0ZW1zKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jaG9pY2VDcml0ZXJpYSA9PT0gaC5Qcm90b0Nob2ljZUNyaXRlcmlhRW51bS5Pbmx5ID8gZSA+IDAgOiAwID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3QobC5nKSh0LCBpLml0ZW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY2hvaWNlQ3JpdGVyaWEgPT09IGguUHJvdG9DaG9pY2VDcml0ZXJpYUVudW0uT25seSA/IGUgOiAhZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNvbWUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBlID0gMDsgZSA8IHQuZmlsdGVycy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdC5maWx0ZXJzW2VdLCBuID0gaS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuaXRlbXMuaW5jbHVkZXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocy50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0xpbmVJdGVtQ29udGV4dHVhbFRhcmdldGluZ0VudW0uSW5jbHVkZUFueToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9MaW5lSXRlbUNvbnRleHR1YWxUYXJnZXRpbmdFbnVtLkluY2x1ZGVBbGw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAhPT0gcy5pdGVtcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0xpbmVJdGVtQ29udGV4dHVhbFRhcmdldGluZ0VudW0uRXhjbHVkZUFueToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvTGluZUl0ZW1Db250ZXh0dWFsVGFyZ2V0aW5nRW51bS5FeGNsdWRlQWxsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IHMuaXRlbXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdC5pc0FsbG93ZWRCeVNvdW5kID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0LnByb3RvTGluZUl0ZW0uc291bmQgfHwgaS5zb3VuZDsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQWxsb3dlZEJ5Vmlld2FiaWxpdHkgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaS5hZENvbnRhaW5lclN0YXRlLmdldCh0LnByb3RvTGluZUl0ZW0uYWRUeXBlKS52aWV3YWJpbGl0eTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0LnByb3RvTGluZUl0ZW0udmlld2FiaWxpdHkgfHwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQWxsb3dlZEJ5QWRCcmVha1R5cGUgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQucHJvdG9MaW5lSXRlbS5hZEJyZWFrU2V0dGluZ3MgfHwgdC5wcm90b0xpbmVJdGVtLmFkQnJlYWtTZXR0aW5ncy5hZEJyZWFrVGFyZ2V0aW5nLnNvbWUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5hZFJvbGxUeXBlID09PSBpLmFkQnJlYWtTdGF0ZS5hZEJyZWFrVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLkFsbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvTGluZUl0ZW1BZEJyZWFrVHlwZUVudW0uQWRQb2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvTGluZUl0ZW1BZEJyZWFrVHlwZUVudW0uU2luZ2xlQWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuYWRCcmVha1R5cGVFbnVtLCBpLmFkQnJlYWtTdGF0ZS5pc0FkUG9kQnJlYWspOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQWxsb3dlZEJ5TWVkaWFUYXJnZXRpbmcgPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISh0LnByb3RvTGluZUl0ZW0ubWVkaWFJZFRhcmdldGluZyAmJiAhaShlLm1lZGlhLm1lZGlhSWQsIHQucHJvdG9MaW5lSXRlbS5tZWRpYUlkVGFyZ2V0aW5nKSB8fCB0LnByb3RvTGluZUl0ZW0ubWVkaWFLZXl3b3Jkc1RhcmdldGluZyAmJiAhaShlLm1lZGlhLm1lZGlhS2V5d29yZHMsIHQucHJvdG9MaW5lSXRlbS5tZWRpYUtleXdvcmRzVGFyZ2V0aW5nKSB8fCB0LnByb3RvTGluZUl0ZW0ubWVkaWFMYW5ndWFnZVRhcmdldGluZyAmJiAhaShlLm1lZGlhLm1lZGlhTGFuZ3VhZ2UsIHQucHJvdG9MaW5lSXRlbS5tZWRpYUxhbmd1YWdlVGFyZ2V0aW5nKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5pc0FsbG93ZWRCeUNvbnRleHR1YWxUYXJnZXRpbmcgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckNvbnRleHR1YWxUYXJnZXRpbmc6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyQ29udGV4dHVhbFRhcmdldGluZzogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHQucHJvdG9MaW5lSXRlbSwgciA9IGkubWVkaWEudmlkZW9JbmRleGVzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShPYmplY3QobC5oKShzKSAmJiAhZShzLCByKSB8fCBPYmplY3QobC5oKShuKSAmJiAhZShuLCByKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5pc0FsbG93ZWRCeVBsYXllclNpemVUYXJnZXRpbmcgPSBmdW5jdGlvbiAodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7cGxheWVyU2l6ZVRhcmdldGluZ3M6IGV9ID0gdC5wcm90b0xpbmVJdGVtLCB7d2lkdGg6IHN9ID0gaS5hZENvbnRhaW5lclN0YXRlLmdldCh0LnByb3RvTGluZUl0ZW0uYWRUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3QocnQuZikoZSkgfHwgIU9iamVjdChydC5kKShzKSB8fCAoZS5zaXplQ2hvaWNlQ3JpdGVyaWEgPT09IGguUHJvdG9TaXplQ2hvaWNlQ3JpdGVyaWFFbnVtLkdyZWF0ZXJUaGFuID8gIU9iamVjdChydC5kKShlLm1pbldpZHRoKSB8fCBzID49IGUubWluV2lkdGggOiBlLnNpemVDaG9pY2VDcml0ZXJpYSA9PT0gaC5Qcm90b1NpemVDaG9pY2VDcml0ZXJpYUVudW0uU21hbGxlclRoYW4gPyAhT2JqZWN0KHJ0LmQpKGUubWF4V2lkdGgpIHx8IHMgPD0gZS5tYXhXaWR0aCA6IGUuc2l6ZUNob2ljZUNyaXRlcmlhICE9PSBoLlByb3RvU2l6ZUNob2ljZUNyaXRlcmlhRW51bS5CZXR3ZWVuIHx8ICFPYmplY3QocnQuZCkoZS5tYXhXaWR0aCkgfHwgIU9iamVjdChydC5kKShlLm1pbldpZHRoKSB8fCBzID49IGUubWluV2lkdGggJiYgcyA8PSBlLm1heFdpZHRoKTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQWxsb3dlZEJ5UG9kVGFyZ2V0aW5nID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBudWxsID09PSAoZSA9IHQucHJvdG9MaW5lSXRlbS5hZEJyZWFrU2V0dGluZ3MpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuYWRQb2RUYXJnZXRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpLmFkQnJlYWtTdGF0ZS5pc0FkUG9kQnJlYWspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSBpLmFkQnJlYWtTdGF0ZS5hZFBvZFNsb3RJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzLmFkU2xvdFRhcmdldGluZ1R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvTGluZUl0ZW1BZFNsb3RUYXJnZXRpbmdUeXBlRW51bS5JbnRlcnZhbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuIDwgcy5hZFNsb3RQb3NpdGlvbnNbMF0gfHwgbiA+IHMuYWRTbG90UG9zaXRpb25zWzFdKSAmJiAociA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9MaW5lSXRlbUFkU2xvdFRhcmdldGluZ1R5cGVFbnVtLlNwZWNpZmljU2xvdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gcy5hZFNsb3RQb3NpdGlvbnMuaW5kZXhPZihuKSAmJiAociA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy50YXJnZXRpbmdUeXBlID09PSBoLlByb3RvTGluZUl0ZW1UYXJnZXRpbmdUeXBlRW51bS5FeGNlcHQgJiYgKHIgPSAhciksIHI7CiAgICAgICAgICAgICAgICAgICAgfSwgdC5pc0FsbG93ZWRSZWdhcmRpbmdEdXJhdGlvbiA9IGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdCB8fCAwID09PSBpIHx8IHQgPD0gaTsKICAgICAgICAgICAgICAgICAgICB9LCB0LmlzQWxsb3dlZFJlZ2FyZGluZ1NraXBwYWJpbGl0eSA9IGZ1bmN0aW9uICh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5hZFNraXBwYWJpbGl0eSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJBZFNraXBwYWJpbGl0eS5JZkxvbmdlclRoYW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gaC5Qcm90b0FkU2tpcE1vZGUuTmV2ZXIgJiYgdCA+IGUuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuIHx8IGkgPT09IGguUHJvdG9BZFNraXBNb2RlLklmTG9uZ2VyVGhhbjMxU2VjICYmIHQgPCBIdC5kICYmIHQgPiBlLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUGxheWVyQWRTa2lwcGFiaWxpdHkuQWx3YXlzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGguUHJvdG9BZFNraXBNb2RlLklmTG9uZ2VyVGhhbjMxU2VjICYmIHQgJiYgdCA8IEh0LmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfShubyB8fCAobm8gPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3Mgcm8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QXyA9IHQsIHRoaXMuTV8gPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDYWxsaW5nWW9TY29yZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBfLmdldENhbGxpbmdZb1Njb3JlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRXaW5uaW5nWW9TY29yZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBfLmdldFdpbm5pbmdZb1Njb3JlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRJbXByZXNzaW9uWW9TY29yZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlBfLmdldEltcHJlc3Npb25Zb1Njb3JlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckJpZGRpbmdJbmZvcm1hdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUF8ucmVnaXN0ZXJCaWRkaW5nSW5mb3JtYXRpb24odCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJlQmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QXy5yZWdpc3RlclByZUJpZCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJJbXByZXNzaW9uKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QXy5yZWdpc3RlckltcHJlc3Npb24odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUG9zdEJpZCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUF8ucmVnaXN0ZXJQb3N0QmlkKHQsIGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFXyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuby5pc0FsbG93ZWRCeVZpZXdhYmlsaXR5KHQsIGkpICYmIG5vLmlzQWxsb3dlZEJ5U291bmQodCwgaSkgJiYgbm8uaXNBbGxvd2VkQnlBZEJyZWFrVHlwZSh0LCBpKSAmJiBuby5pc0FsbG93ZWRCeU1lZGlhVGFyZ2V0aW5nKHQsIGkpICYmIG5vLmlzQWxsb3dlZEJ5UG9kVGFyZ2V0aW5nKHQsIGkpICYmIG5vLmlzQWxsb3dlZEJ5Q29udGV4dHVhbFRhcmdldGluZyh0LCBpKSAmJiBuby5pc0FsbG93ZWRCeVBsYXllclNpemVUYXJnZXRpbmcodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIExfKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZ2V0QWREdXJhdGlvbigpLCBzID0gdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLnNraXBNb2RlLCBuID0gaS5hZEJyZWFrU3RhdGUuc2Vzc2lvbk1heEFkRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuby5pc0FsbG93ZWRSZWdhcmRpbmdEdXJhdGlvbihlLCBuKSAmJiBuby5pc0FsbG93ZWRSZWdhcmRpbmdTa2lwcGFiaWxpdHkoZSwgcywgdGhpcy5NXyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJfKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZ2V0QWREdXJhdGlvbigpLCBzID0gaS5hZEJyZWFrU3RhdGUucmVtYWluaW5nQWREdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vLmlzQWxsb3dlZFJlZ2FyZGluZ0R1cmF0aW9uKGUsIHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBCXyh0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhcy5pc0xpbmVJdGVtUGxhdGZvcm1DYXBwZWQodC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtKSAmJiBlLmNhbkNhbGwodC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbSwgaS5hZE9wcG9ydHVuaXR5LmlkKSAmJiB0aGlzLkVfKHQuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0sIGkpICYmIHRoaXMuTF8odCwgaSkgJiYgdGhpcy5SXyh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBobyBleHRlbmRzIHJvIHsKICAgICAgICAgICAgICAgICAgICBnZXRCZXN0Q2FsbGFibGUodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5EXyh0LCBpLmN1cnJlbnRTdGF0ZSB8fCBpLnByZWRpY3RlZFN0YXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNCaWRUYXJnZXRpbmdBbGxvd2VkKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQl8odCwgaSwgZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQmlkVGFyZ2V0aW5nQWxsb3dlZEV2ZXJJblNlc3Npb24odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5MXyh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRF8odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkZfKHQsIGkpLCBzID0gdGhpcy5WXyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtTGlzdDogdGhpcy5VXyhzLCBlKQogICAgICAgICAgICAgICAgICAgICAgICB9IDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBWXyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc29tZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1aCh0LnByb3RvTGluZUl0ZW0uY3JlYXRpdmVUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKGkgPSBpLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1aCh0LnByb3RvTGluZUl0ZW0uY3JlYXRpdmVUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLk5fKGkpWzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOXyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc29ydCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FsbGluZ1lvU2NvcmUoaS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKSAtIHRoaXMuZ2V0Q2FsbGluZ1lvU2NvcmUodC5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZfKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuRV8odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBVXyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHtjcmVhdGl2ZVR5cGU6IGV9ID0gdC5wcm90b0xpbmVJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWgoZSkgPyB0aGlzLk5fKGkuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHQucHJvdG9MaW5lSXRlbS5jcmVhdGl2ZVR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IFt0XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBhbyBleHRlbmRzIHJvIHsKICAgICAgICAgICAgICAgICAgICBnZXRCZXN0QmlkKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSF8odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEJldHRlckJpZCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEltcHJlc3Npb25Zb1Njb3JlKHQuc2V0dGluZ3MuaWQpID4gdGhpcy5nZXRJbXByZXNzaW9uWW9TY29yZShpLnNldHRpbmdzLmlkKSA/IHQgOiBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIXyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4udF0uc29ydCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW1wcmVzc2lvbllvU2NvcmUoaS5zZXR0aW5ncy5pZCkgLSB0aGlzLmdldEltcHJlc3Npb25Zb1Njb3JlKHQuc2V0dGluZ3MuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBvbyBleHRlbmRzIHJvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5xXyA9ICh0LCBpLCBlLCBzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gW10sIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaCBvZiB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CXyhoLCBpLmN1cnJlbnRTdGF0ZSB8fCBpLnByZWRpY3RlZFN0YXRlLCBlLCBzKSA/IG4ucHVzaChoKSA6IHIucHVzaChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEJpZExpc3Q6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90QWxsb3dlZEJpZExpc3Q6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNlbGVjdEJlc3RCaWQodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuID0gdGhpcy5xXyh0LCBpLCBlLCBzKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRCaWRMaXN0OiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdEFsbG93ZWRCaWRMaXN0OiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gbiwgbyA9IGkuY3VycmVudFN0YXRlIHx8IGkucHJlZGljdGVkU3RhdGUsIGMgPSB0aGlzLnpfKHIpLCB1ID0gYS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzUmVhc29uOiB0aGlzLldfKHQsIG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBsID0gci5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgIT09IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzUmVhc29uOiBoLlByb3RvQXVjdGlvbkxvc3NSZWFzb25FbnVtLkNvbXBldGl0b3JQcmlvcml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRCaWQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNlbGVjdGVkQmlkTGlzdDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0JldHRlckJpZCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFdpbm5pbmdZb1Njb3JlKHQuc2V0dGluZ3MuaWQpID4gdGhpcy5nZXRXaW5uaW5nWW9TY29yZShpLnNldHRpbmdzLmlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgel8odCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KGwuaCkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWy4uLnRdLnNvcnQoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRXaW5uaW5nWW9TY29yZShpLnNldHRpbmdzLmlkKSAtIHRoaXMuZ2V0V2lubmluZ1lvU2NvcmUodC5zZXR0aW5ncy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVswXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgV18odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SXyh0LCBpKSA/IGguUHJvdG9BdWN0aW9uTG9zc1JlYXNvbkVudW0uQWRPcHBvcnR1bml0eUVuZCA6IGguUHJvdG9BdWN0aW9uTG9zc1JlYXNvbkVudW0uVGFyZ2V0aW5nTWlzbWF0Y2g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgY28gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XbiA9IHQsIHRoaXMuR18gPSBuZXcgamkoKSwgdGhpcy5KXyA9ICExLCB0aGlzLlFfID0gITEsIHRoaXMuWF8gPSBudWxsLCB0aGlzLllfID0gITEsIHRoaXMuS18gPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV24ueW9TY29yZU1hbmFnZXIuZ2V0Q2FsbGluZ1lvU2NvcmUoaS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKSAtIHRoaXMuV24ueW9TY29yZU1hbmFnZXIuZ2V0Q2FsbGluZ1lvU2NvcmUodC5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5KXyA9IHQubG9ja2VkLCB0LmFkQmlkUG9vbC5vbkJpZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KXyB8fCB0aGlzLlpfKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25BdWN0aW9uRW5kKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5HXy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBdWN0aW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RXyA9ICExLCAwICE9PSB0IHx8IHRoaXMuSl8gfHwgbnVsbCAhPT0gdGhpcy5YXyA/IHRoaXMuWl8oKSB8fCAodGhpcy5ZXyA9ICExLCB0aGlzLnRBKCksIHRoaXMuWF8gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWV8gPSAhMCwgdGhpcy5KXyB8fCB0aGlzLkdfLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCkpIDogdGhpcy5HXy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvY2soKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSl8gPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkpfID0gITEsIHRoaXMuUV8gfHwgKHRoaXMuWV8gPyB0aGlzLkdfLm5leHQoKSA6IHRoaXMuWl8oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbmNlbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RXyA9ICEwLCB0aGlzLnRBKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRBKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5YXyksIHRoaXMuWF8gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBaXygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLlFfKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlduLmFkQmlkUG9vbC5iaWRzLnNvcnQoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlduLnlvU2NvcmVNYW5hZ2VyLmdldFdpbm5pbmdZb1Njb3JlKGkuc2V0dGluZ3MuaWQpIC0gdGhpcy5Xbi55b1Njb3JlTWFuYWdlci5nZXRXaW5uaW5nWW9TY29yZSh0LnNldHRpbmdzLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlduLmFkQmlkUG9vbC5iaWRzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV24uYWRCaWRQb29sLmNhbGxpbmdMaW5lSXRlbXMuc29ydCh0aGlzLktfKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuV24uYWRCaWRQb29sLmNhbGxpbmdMaW5lSXRlbXNbMF0sIHMgPSB0aGlzLlduLnlvU2NvcmVNYW5hZ2VyLmdldFdpbm5pbmdZb1Njb3JlKGkuc2V0dGluZ3MuaWQpLCBuID0gdGhpcy5Xbi55b1Njb3JlTWFuYWdlci5nZXRDYWxsaW5nWW9TY29yZShudWxsID09PSAodCA9IGUpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQucHJvdG9MaW5lSXRlbS5hZHZlcnRpc2VyTGluZUl0ZW1JZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoIWUgfHwgcyA+PSBuKSAmJiAodGhpcy5HXy5uZXh0KCksIHRoaXMudEEoKSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHVvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9MaW5lSXRlbSA9IHQsIHRoaXMuYWxsb3dlZFNsb3RzID0gW10sIHRoaXMuYmlkcyA9IG5ldyBTZXQoKSwgdGhpcy5jYWxsZXJzID0gbmV3IFNldCgpLCB0aGlzLmFnZ3JlZ2F0b3JzID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGxvID0gJ2NueC1hZC1iaWQtc2xvdCcsIGZvID0gJ2NueC1hZC1zbG90JywgcG8gPSAnY254LWFkLXZpZGVvLXNsb3QnOwogICAgICAgICAgICAgICAgY2xhc3MgYm8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb250YWluZXIgPSB0LCB0aGlzLnJjID0gaSwgdGhpcy5pc0ltYVNsb3QgPSAhMSwgdGhpcy5zbG90c0NvbnRhaW5lciA9IHRoaXMucmMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8ZGl2IGNsYXNzPSAiJHsgbG8gfSI+PC9kaXY+YCksIHRoaXMuYWRTbG90ID0gdGhpcy5yYy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoYDxkaXYgY2xhc3M9IiR7IGZvIH0iPjwvZGl2PmApLCB0aGlzLnZpZGVvU2xvdCA9IHRoaXMucmMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8dmlkZW8gY2xhc3M9IiR7IGZvIH0gJHsgcG8gfSI+PC92aWRlbz5gKSwgdGhpcy52aWRlb1Nsb3Quc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKSwgdGhpcy52aWRlb1Nsb3Quc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJyksIHRoaXMuc2xvdHNDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy52aWRlb1Nsb3QpLCB0aGlzLnNsb3RzQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuYWRTbG90KSwgdGhpcy5wYXJlbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zbG90c0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuc2xvdHNDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB2byBleHRlbmRzIGJvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5pc0ltYVNsb3QgPSAhMCwgdGhpcy5pQSA9ICExLCB0aGlzLmVBID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hQWREaXNwbGF5Q29udGFpbmVyOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFBZHNMb2FkZXI6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYVNkazogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZldGNoSW1hRGVwZW5kZW5jaWVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHIuZmV0Y2hJbWFTZGsod2luZG93LCAhMCkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNBKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lQS5pbWFBZHNMb2FkZXIgJiYgdGhpcy5lQS5pbWFBZHNMb2FkZXIuZGVzdHJveSgpLCB0aGlzLmVBLmltYUFkRGlzcGxheUNvbnRhaW5lciAmJiB0aGlzLmVBLmltYUFkRGlzcGxheUNvbnRhaW5lci5kZXN0cm95KCksIHN1cGVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2FuaXRpemUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZUEuaW1hQWRzTG9hZGVyLmNvbnRlbnRDb21wbGV0ZSgpLCBzdXBlci5zYW5pdGl6ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlBKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZUE7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0dGluZ3Muc2V0RGlzYWJsZUN1c3RvbVBsYXliYWNrRm9ySU9TMTBQbHVzKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMubkEodCksIGUgPSB0aGlzLnJBKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lQSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYVNkazogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYUFkRGlzcGxheUNvbnRhaW5lcjogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYUFkc0xvYWRlcjogZQogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmlBID0gITAsIHRoaXMuZUE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5BKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyB0LkFkRGlzcGxheUNvbnRhaW5lcih0aGlzLmFkU2xvdCwgdGhpcy52aWRlb1Nsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pbml0aWFsaXplKCksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJBKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IG5ldyB0LkFkc0xvYWRlcihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0U2V0dGluZ3MoKS5zZXRWcGFpZE1vZGUodC5JbWFTZGtTZXR0aW5ncy5WcGFpZE1vZGUuSU5TRUNVUkUpLCBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG1vID0gMzsKICAgICAgICAgICAgICAgIGNsYXNzIGdvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0LCB0aGlzLmhBID0gbmV3IFNldCgpLCB0aGlzLmFBID0gbmV3IFNldCgpLCB0aGlzLm9BID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuY0EgPSAwLCBwci5wcmVsb2FkSW1hU2RrKHdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IG1vOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgdm8odC5zbG90LCB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmZldGNoSW1hRGVwZW5kZW5jaWVzKCksIHRoaXMuaEEuYWRkKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBZFNsb3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gbmV3IGJvKHQsIHRoaXMuc2V0dGluZ3MuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudUEoaSksIHRoaXMubEEoKSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFkU2xvdEltYSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5kQSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSB8fCAoaSA9IG5ldyB2byh0LCB0aGlzLnNldHRpbmdzLmdsb2JhbERvbVV0aWxzU2VydmljZSkpLCB0aGlzLnVBKGkpLCB0aGlzLmxBKCksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lBZFNsb3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFBLmRlbGV0ZSh0KSwgdC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlY3ljbGVBZFNsb3QodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFBLmRlbGV0ZSh0KSwgdGhpcy5mQSh0KSA/ICh0LnNhbml0aXplKCksIHRoaXMuaEEuYWRkKHQpKSA6IHRoaXMuZGVzdHJveUFkU2xvdCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZkEodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pc0ltYVNsb3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRBKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhBLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZBKGkpICYmIG51bGwgPT09IHQgJiYgKHQgPSBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVBKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oQS5kZWxldGUodCksIHRoaXMuYUEuYWRkKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsQSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuaEEuc2l6ZSArIHRoaXMuYUEuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9PT0gdGhpcy5vQVt0aGlzLmNBXSAmJiAodGhpcy5wQSh0aGlzLm9BW3RoaXMuY0FdKSwgdCA9PT0gdGhpcy5vQVt0aGlzLm9BLmxlbmd0aCAtIDFdICYmIHRoaXMub0EucHVzaCh0aGlzLm9BW3RoaXMub0EubGVuZ3RoIC0gMV0gKyAyMCksIHRoaXMuY0ErKyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBBKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0FkU2xvdENvbnRhaW5lclJlY3ljbGVyX3Nsb3Rjb3VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IGAkeyB0IH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1heExvZzogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgeW8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iQSA9IGksIHRoaXMudkEgPSB0aGlzLm1BKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckJpZGRpbmdJbmZvcm1hdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBycih0KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtSWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSB1aCh0LmNyZWF0aXZlVHlwZSkgPyBucih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBzCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuYkEpIDogdGhpcy5nZXRDYWxsaW5nWW9TY29yZSh0LmxpbmVJdGVtSWQpLCB0aGlzLmdBKG4sIHIsIGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZUJpZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueUEodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW1wcmVzc2lvbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueUEodCksIHVoKGkpIHx8IHRoaXMud0EodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUG9zdEJpZCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueUEodCksIHVoKGkpIHx8IGUgPT09IFluLmMuQ2FuY2VsbGVkIHx8IHRoaXMuT0EodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdZb1Njb3JlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMueEEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID8gaS55b1Njb3JlIDogMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0V2lubmluZ1lvU2NvcmUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5TQSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyBpLmJpZE1hcC5nZXQodCkgOiAoT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1lvU2NvcmVNYW5hZ2VyX2dldFdpbm5pbmdZb1Njb3JlX2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogYGJpZCB3YXMgbm90IHlldCByZWdpc3RlcmVkOiAkeyB0IH1gLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcKICAgICAgICAgICAgICAgICAgICAgICAgfSksIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRJbXByZXNzaW9uWW9TY29yZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFdpbm5pbmdZb1Njb3JlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlNBKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHNyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbMV0gKyBpWzBdICogSHQuZzsKICAgICAgICAgICAgICAgICAgICAgICAgfShpLnlvU2NvcmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpBKGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3QSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlNBKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHNyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbMV0gKyBpWzBdICogSHQuaDsKICAgICAgICAgICAgICAgICAgICAgICAgfShpLnlvU2NvcmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpBKGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqQSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKHQueW9TY29yZSA9IGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnQSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLnhBKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmtBKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5iQSB8fCBzLmJpZE1hcC5oYXMoaSkgfHwgLTEgPT09IG4gPyB0aGlzLl9BKHMsIGkpICYmIHMuYmlkTWFwLnNldChpLCBlKSA6IHMuYmlkTWFwLnNldChpLCBuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga0EodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gWy4uLnQuYmlkTWFwLnZhbHVlcygpXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmgpKGkpID8gaVswXSA6IC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfQSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5iQSB8fCAhdC5iaWRNYXAuaGFzKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclByaWNlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtUHJpb3JpdHk6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc1JhdGU6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpdmVUeXBlOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbUlkOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvU2NvcmU6IGggPSB1aChyKSA/IE1hdGgucmFuZG9tKCkgOiBucih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NSYXRlOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5iQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkTWFwOiBuZXcgTWFwKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4QSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZBLmZpbmQoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5saW5lSXRlbUlkID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU0EodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy52QS5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYmlkTWFwLmhhcyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHlBKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5TQSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAwICE9PSBpLmJpZE1hcC5zaXplICYmIGkuYmlkTWFwLmRlbGV0ZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB3byB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkFBID0gdCwgdGhpcy5jbyA9IGksIHRoaXMuSUEgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJpZElzTm90V2lubmFibGVFdmVySW5TZXNzaW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLkNBKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuVEEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlBBKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLnNvcnQoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZSA9IHRoaXMuTUEoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRUEodC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YS5jbnhCaWRJZCwgZSwgaC5Qcm90b0F1Y3Rpb25Mb3NzUmVhc29uRW51bS5UYXJnZXRpbmdNaXNtYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5ld0JpZEFkZGVkKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DQSh0KSAmJiAoaS5zZWxlY3RlZEJpZCA/IGkuc2VsZWN0ZWRCaWQgIT09IHQgPyB0aGlzLkxBKHQsIGkpIDogdGhpcy5SQSh0KSA6IHRoaXMuTEEodCwgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aW5CaWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuQ0EodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlRBKCksIGUgPSB0aGlzLk1BKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklBLnNldCh0LCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25Qb3N0QmlkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQkEodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uSW1wcmVzc2lvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkJBKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBDQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmxvZ0F1Y3Rpb25JbmZvcm1hdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUkEodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7Y254QmlkSWQ6IGl9ID0gdC5zZXR0aW5ncy5yZXF1ZXN0TWV0YWRhdGEuZGF0YSwgZSA9IHRoaXMuVEEoKSwgcyA9IHRoaXMuTUEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRUEoaSwgcywgaC5Qcm90b0F1Y3Rpb25Mb3NzUmVhc29uRW51bS5Db21wZXRpdG9yUHJpb3JpdHkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBCQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLkRBKHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5GQSh0KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTEEodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgcywgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2NueEJpZElkOiBofSA9IHQuc2V0dGluZ3MucmVxdWVzdE1ldGFkYXRhLmRhdGEsIGEgPSB0aGlzLlRBKCksIG8gPSB0aGlzLlZBKHQsIGkpLCBjID0gdGhpcy5NQShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKG8pID8gdGhpcy5FQShoLCBjLCBvKSA6IHRoaXMuVUEoJ0FkTWFuYWdlcl9BdWN0aW9uSW5mb0xvZ2dpbmdfbG9zc1JlYXNvbl9jYW5ub3RfYmVfZm91bmQnLCB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmNueEJpZElkLCBudWxsID09PSAociA9IG51bGwgPT09IChuID0gbnVsbCA9PT0gKHMgPSBudWxsID09PSAoZSA9IGkuc2VsZWN0ZWRCaWQpIHx8IHZvaWQgMCA9PT0gZSA/IHZvaWQgMCA6IGUuc2V0dGluZ3MpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMucmVxdWVzdE1ldGFkYXRhKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLmRhdGEpIHx8IHZvaWQgMCA9PT0gciA/IHZvaWQgMCA6IHIuY254QmlkSWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBEQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLklBLmhhcyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLklBLmdldCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DQSh0KSAmJiB0aGlzLlVBKCdBZE1hbmFnZXJfQXVjdGlvbkluZm9Mb2dnaW5nX2Nhbm5vdF9maW5kX3dpbl9iaWRfc25hcHNob3QnLCB0LnNldHRpbmdzLnJlcXVlc3RNZXRhZGF0YS5kYXRhLmNueEJpZElkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRkEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklBLmhhcyh0KSAmJiB0aGlzLklBLmRlbGV0ZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVkEodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IChlID0gaS51bnNlbGVjdGVkQmlkTGlzdC5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuYmlkID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5sb3NzUmVhc29uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRHZW5lcmFsUG9zdGJpZFJlYXNvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFluLmMuSW1hU2NyaXB0RmFpbHVyZToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkltYU9iamVjdE5vdEZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFluLmMuSW1hTWFuYWdlckluaXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWW4uYy5JbWFJbml0U2RrRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWW4uYy5BZHhPdmVybGF5R3B0U2NyaXB0TG9hZDoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkRpc3BsYXlJbnRlZ3JhdG9ySWZyYW1lTG9hZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLlByb3RvQXVjdGlvblBvc3RiaWRSZWFzb25FbnVtLlNES0ZhaWx1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWW4uYy5WYXN0VW5zdXBwb3J0ZWRNZWRpYToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkNueE1lZGlhU3JjTm90U3VwcG9ydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguUHJvdG9BdWN0aW9uUG9zdGJpZFJlYXNvbkVudW0uVW5zdXBwb3J0ZWRNZWRpYTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkRvbWFpbkJsb2NrZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5Qcm90b0F1Y3Rpb25Qb3N0YmlkUmVhc29uRW51bS5UYXJnZXRpbmdNaXNtYXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkFkYXB0b3JJbml0QWRFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBZbi5jLkFkYXB0b3JTdGFydEFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWW4uYy5XcmFwcGVySW5pdEFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgWW4uYy5XcmFwcGVyU3RhcnRBZEVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguUHJvdG9BdWN0aW9uUG9zdGJpZFJlYXNvbkVudW0uVGFyZ2V0aW5nTWlzbWF0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5Qcm90b0F1Y3Rpb25Qb3N0YmlkUmVhc29uRW51bS5DcmVhdGl2ZUVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRBKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5BQS5nZXRBbGxCaWRzKCkubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUEEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnNvcnQoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIC0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFBBKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uY3JlYXRpdmVUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uUnRiOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLlRhbToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UYW1EZWFsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJuKHQuc2V0dGluZ3Mub2JmdXNjYXRlZFByaWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5IZWFkZXJCaWRkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZXR0aW5ncy5jcG07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmZsb29yUHJpY2UgfHwgdC5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmN1c3RvbUNwbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBNQSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0WzBdID8gQm4odFswXSkgOiB2b2lkIDAsIGUgPSB0WzFdID8gQm4odFsxXSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IHRoaXMuVUEoJ0FkTWFuYWdlcl9BdWN0aW9uSW5mb0xvZ2dpbmdfaGlnaGVzdEJpZFByaWNlX21pc3NpbmcnLCBgJHsgaSB9YCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZERlbnNpdHk6IHQubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdE9iZnVzY2F0ZWRCaWRQcmljZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEhpZ2hlc3RPYmZ1c2NhdGVkQmlkUHJpY2U6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRUEodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvLnRyYWNrQXVjdGlvbkluZm9Gb3JCaWQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY254QmlkSWQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSW5mb3JtYXRpb246IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uTG9zc1JlYXNvbjogZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVUEodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICB9KSgpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBPbzsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5Ob1ByZWZldGNoID0gMF0gPSAnTm9QcmVmZXRjaCcsIHRbdC5TdGFydFNlc3Npb25QcmVmZXRjaCA9IDFdID0gJ1N0YXJ0U2Vzc2lvblByZWZldGNoJywgdFt0Lk1pZFNlc3Npb25QcmVmZXRjaCA9IDJdID0gJ01pZFNlc3Npb25QcmVmZXRjaCc7CiAgICAgICAgICAgICAgICB9KE9vIHx8IChPbyA9IHt9KSk7CiAgICAgICAgICAgICAgICBjb25zdCB4byA9IDAsIFNvID0gNSwgam8gPSAxMCwga28gPSAtMSwgX28gPSAxLCBBbyA9ICExOwogICAgICAgICAgICAgICAgY2xhc3MgSW8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XbiA9IHQsIHRoaXMuJEEgPSAhMSwgdGhpcy5OQSA9ICExLCB0aGlzLmpsID0gW10sIHRoaXMuSEEgPSBudWxsLCB0aGlzLnFBID0gITEsIHRoaXMuUmcgPSBuZXcgamkoKSwgdGhpcy56QSA9IG5ldyBqaSgpLCB0aGlzLldBID0gITEsIHRoaXMuR0EgPSBuZXcgRm4oKSwgdGhpcy5KQSA9IG5ldyBBYSgpLCB0aGlzLlduLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UuYWRkUGxhdGZvcm1DYXBwZWRMaW5lSXRlbVN1YnNjcmliZXIodGhpcyksIHRoaXMuV24uYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5zZXRJbXByZXNzaW9uUmV2ZW51ZVN1YnNjcmliZXIodGhpcyksIHRoaXMuV24uYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5zdGFydEJpZFJlcXVlc3RzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLlduLmxpbmVJdGVtTGlzdC5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB1byh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlID0gbmV3IHlvKHRoaXMuV24ubGluZUl0ZW1MaXN0LCB0aGlzLlduLmFwcC5jb25maWcuZXhwbG9yYXRpb25Nb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RQSA9IG5ldyBwYSgpLCB0aGlzLlhBID0gbmV3IGNhKCksIHRoaXMuWUEgPSBuZXcgbGEoKSwgdGhpcy5LQSA9IG5ldyBkYSgpLCB0aGlzLiRtID0gbmV3IGJhKHRoaXMuV24uYWRDb250YWluZXJNYXAsIHRoaXMuV24uYXBwLnNlcnZpY2VzLlJlc2l6ZU9ic2VydmVyLCB0aGlzLlduLmFwcC5zZXJ2aWNlcy5WaWV3YWJpbGl0eVNlcnZpY2UsIEh0LmUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gbmV3IGdvKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbERvbVV0aWxzU2VydmljZTogdGhpcy5Xbi5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjeWNsZUFkU2xvdHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdDogdGhpcy4kbS5nZXRDb250YWluZXJNYXAoKS5nZXQoaC5Qcm90b0FkVHlwZS5WaWRlbykKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQUEgPSBuZXcgVm4oKSwgdGhpcy5aQSA9IG5ldyB3byh0aGlzLkFBLCB0aGlzLlduLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UpLCB0aGlzLnRJID0gbmV3IGNvKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQmlkUG9vbDogdGhpcy5BQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b1Njb3JlTWFuYWdlcjogZQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy54eCA9IG5ldyBEbigpLCB0aGlzLnd4ID0gbmV3IGthKHRoaXMuV24uYXBwLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2UsIHRoaXMuV24uYXBwLnNlcnZpY2VzLlVzZXJNYW5hZ2VyU2VydmljZSksIHRoaXMuaUkgPSBuZXcgcmEoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCaWRQb29sOiB0aGlzLkFBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRDYWxsZXJZbzogbmV3IGhvKGUsIHRoaXMuV24uc2tpcFBsYXllclNldHRpbmdzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JbmZvTG9nZ2luZzogdGhpcy5aQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyTWFwOiB0aGlzLiRtLmdldENvbnRhaW5lck1hcCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRNYWNyb1JlcGxhY2VyOiB0aGlzLnd4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1hem9uU2xvdElkOiB0aGlzLlduLmFtYXpvblRhbVNsb3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcDogdGhpcy5Xbi5hcHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc091dHN0cmVhbTogdGhpcy5Xbi5vdXRzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbUxpc3Q6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hhaW5TZXR0aW5nczogdGhpcy5Xbi5wYmpzU2NoYWluU2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwQWRTZXR0aW5nczogdGhpcy5Xbi5za2lwUGxheWVyU2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZpY2U6IHRoaXMuV24uYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJdGVtU2VydmljZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uQ2Fwc1NlcnZpY2U6IHRoaXMuWEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1TZXJ2aWNlc1RpbWVyOiB0aGlzLlFBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDYXBzU2VydmljZTogdGhpcy5ZQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lQmV0d2VlblJlcXVlc3RzU2VydmljZTogdGhpcy5LQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUmVxdWVzdEdhdGVrZWVwZXI6IHRoaXMueHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybUNhcHBlZExpbmVJdGVtUmVwbzogdGhpcy5HQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkRW5mb3JjZXI6IG5ldyB4YSh0aGlzLlduLmFwcC5jb25maWcuaXNNb2JpbGUsIE9iamVjdChULnMpKHRoaXMuV24uYWRDb250YWluZXJNYXAuZ2V0KGguUHJvdG9BZFR5cGUuVmlkZW8pKSwgdGhpcy5Xbi5kaXNhYmxlU2Nyb2xsSGlqYWNrRW5mb3JjZW1lbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VBZFdoZW5GaW5pc2hlZDogdGhpcy5Xbi5wYXVzZUFkV2hlbkZpbmlzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEFkV2hlbkZpbmlzaGVkOiB0aGlzLlduLmxvb3BBZFdoZW5GaW5pc2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLlduLmFwcC5jb25maWcub3Mub3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3RDb250YWluZXJSZWN5Y2xlcjogcwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5lSSA9IG5ldyBzbyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJpZFBvb2w6IHRoaXMuQUEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFdpbm5lcllvOiBuZXcgb28oZSwgdGhpcy5Xbi5za2lwUGxheWVyU2V0dGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbkluZm9Mb2dnaW5nOiB0aGlzLlpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZEJpdFJhdGVGb3JXaW5zOiBfbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mV2luczoga28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZpY2U6IHRoaXMuV24uYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25DYXBzU2VydmljZTogdGhpcy5YQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJlc3Npb25DYXBzVGltZXI6IHRoaXMuUUEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybUNhcHBlZExpbmVJdGVtUmVwbzogdGhpcy5HQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFjcm9SZXBsYWNlcjogdGhpcy53eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcklkOiB0aGlzLlduLmFwcC5jb25maWcucGxheWVySWQKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc0kgPSBuZXcgU2EoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCaWRQb29sOiB0aGlzLkFBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRDb250YWluZXI6IHRoaXMuJG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEltcHJlc3Npb25lcllvOiBuZXcgYW8oZSwgdGhpcy5Xbi5za2lwUGxheWVyU2V0dGluZ3MpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbkluZm9Mb2dnaW5nOiB0aGlzLlpBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvbkNhcHNTZXJ2aWNlOiB0aGlzLlhBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvbkNhcHNUaW1lcjogdGhpcy5RQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDYXBzU2VydmljZTogdGhpcy5ZQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllclNraXBwYWJpbGl0eTogdGhpcy5Xbi5za2lwUGxheWVyU2V0dGluZ3MuYWRTa2lwcGFiaWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCaWRJZkhpZ2hlcllvU2NvcmU6IEFvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2aWNlOiB0aGlzLlduLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFJlcXVlc3RHYXRla2VlcGVyOiB0aGlzLnh4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VBZFdoZW5GaW5pc2hlZDogdGhpcy5Xbi5wYXVzZUFkV2hlbkZpbmlzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEFkV2hlbkZpbmlzaGVkOiB0aGlzLlduLmxvb3BBZFdoZW5GaW5pc2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWFjcm9SZXBsYWNlcjogdGhpcy53eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxvcmF0aW9uTW9kZTogdGhpcy5Xbi5hcHAuY29uZmlnLmV4cGxvcmF0aW9uTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcklkOiB0aGlzLlduLmFwcC5jb25maWcucGxheWVySWQKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuamwucHVzaCh0aGlzLnRJLm9uQXVjdGlvbkVuZC5zdWJzY3JpYmUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kQSA9ICEwLCB0aGlzLm5JKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLiRtLm9uQ29udGFpbmVyU3RhdGVVcGRhdGUuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkhBKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eTogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0aGlzLnJJKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oSShlKSwgdGhpcy5IQS5yZXNpemVBZCh0LCBpLCB0aGlzLmFJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTkEgJiYgdGhpcy5vSSgpLCB0aGlzLiRBICYmIHRoaXMubkkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc0kub25BZFNlbGVjdGVkLnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSEEgPSB0LCB0aGlzLmNJKCksIHQuc2V0QWRWb2x1bWUodGhpcy51SS5zb3VuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnNJLm9uQWRGaW5pc2hlZC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxJKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLkFBLm9uQmlkUmVhZHkuc3Vic2NyaWJlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XQSAmJiAodGhpcy5pSS5zdG9wKCksIHRoaXMuTkEgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbiA9IHRoaXMuaUkub25GaXJzdEFnZ3JlZ2F0ZWRCYXRjaEZpbmlzaGVkLnN1YnNjcmliZSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRJLnVubG9jaygpLCBuLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgb25WcGFpZEV2ZW50KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5SZy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG9uSW1wcmVzc2lvblJldmVudWVFdmVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuekEuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQSAmJiAodGhpcy5kSSh0KSwgdGhpcy5IQS5zZXRBZFZvbHVtZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVmlld01vZGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5IQSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hSSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5ySSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQS5yZXNpemVBZChpLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wQWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhBICYmIHRoaXMuSEEuc3RvcEFkKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXVzZUFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQSAmJiB0aGlzLkhBLnBhdXNlQWQoKSwgdCAmJiB0aGlzLkpBLnBhdXNlVmlhVXNlckludGVyYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc3VtZUFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQSAmJiB0aGlzLkhBLnJlc3VtZUFkKCksIHQgJiYgdGhpcy5KQS5yZXN1bWVWaWFVc2VySW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2tpcEFkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhBICYmICh0aGlzLkhBLnNldEFkVm9sdW1lKDApLCB0aGlzLkhBLnNraXBBZCgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VmlkZW9BZENvbnRhaW5lclN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbS5nZXRDb250YWluZXJTdGF0ZU1hcCgpLmdldChoLlByb3RvQWRUeXBlLlZpZGVvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudEFkTWV0YWRhdGEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkhBKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZlcnRpc2VyTGluZUl0ZW1JZDogdGhpcy5IQS5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkdmVydGlzZXJMaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hlckxpbmVJdGVtSWQ6IHRoaXMuSEEuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5wdWJsaXNoZXJMaW5lSXRlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVHlwZTogdGhpcy5IQS5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLmFkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogdGhpcy5IQS5nZXRBZER1cmF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTa2lwTW9kZTogdGhpcy5IQS5zZXR0aW5ncy5hZE1hbmFnZXJMaW5lSXRlbS5wcm90b0xpbmVJdGVtLnNraXBNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRUcmFja2luZ0VuYWJsZWQ6IHRoaXMuSEEuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5tb2F0VHJhY2tpbmdFbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmFibGVJbXByZXNzaW9ucyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVByZWRpY3QoKSwgdGhpcy5XQSA9ICExLCB0aGlzLmZJKHQpLCB0aGlzLnVJID0gdCwgdGhpcy5wSSB8fCAodGhpcy5wSSA9IHRoaXMudUkpLCB0aGlzLllBLmFsbG93UmVzZXRPblRpbWUgPSAhMCwgdGhpcy4kbS5mb3JjZVRyaWdnZXJVcGRhdGVTdGF0ZSgpLCB0aGlzLmJJKHQpLCB0aGlzLk5BID0gITAsIHRoaXMub0koKSwgdC5hZE9wcG9ydHVuaXR5ICYmICF0LmFkT3Bwb3J0dW5pdHkuc3RhcnRlZEF1Y3Rpb25XaXRoVGltZW91dCA/ICh0LmFkT3Bwb3J0dW5pdHkuc3RhcnRBdWN0aW9uV2l0aFRpbWVvdXQoKSwgdGhpcy50SS5zdGFydEF1Y3Rpb24oeG8pKSA6IHRoaXMudEkuc3RhcnRBdWN0aW9uKDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlSW1wcmVzc2lvbnMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJEEgJiYgKHRoaXMudEkuY2FuY2VsKCksIHRoaXMuc0kuc3RvcCgpLCB0aGlzLmlJLnN0b3AoKSwgdGhpcy4kQSA9ICExLCB0aGlzLk5BID0gITEsIHRoaXMuSEEgJiYgIXRoaXMucUEgJiYgdGhpcy5Xbi5hcHAuY29uZmlnLmlzSW5BcHAgJiYgdGhpcy5IQS5zdG9wQWQoJ2luQXBwX2Rpc2FibGUnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVuYWJsZVByZWRpY3QodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0aGlzLkFBLmJpZHNSZWFkeS5sZW5ndGggPiAwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnVJID0gbnVsbCwgdGhpcy5XQSA9ICEwLCB0aGlzLnBJID0gdCwgdGhpcy5wSS5wcmVmZXRjaFN0YXRlVHlwZSA9IGksIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT28uU3RhcnRTZXNzaW9uUHJlZmV0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ZQS5hbGxvd1Jlc2V0T25UaW1lID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9vLk1pZFNlc3Npb25QcmVmZXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLllBLmFsbG93UmVzZXRPblRpbWUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTkEgPSAhMCwgdGhpcy5vSSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRpc2FibGVQcmVkaWN0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLldBICYmICh0aGlzLmlJLnN0b3AoKSwgdGhpcy5OQSA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR0EuYWRkUGxhdGZvcm1DYXBwZWRMaW5lSXRlbUlkTGlzdCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5SW1wcmVzc2lvblJldmVudWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpBLm5leHQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkTWVkaWFTaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5IQSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuSEEuZ2V0QWRNZWRpYVNpemUoKS53aWR0aCwgaSA9IHRoaXMuSEEuZ2V0QWRNZWRpYVNpemUoKS5oZWlnaHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhSYXRpbzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0UmF0aW86IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gT2JqZWN0KHdpLmEpKHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhSYXRpbzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHRSYXRpbzogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFR5cGU6IHRoaXMuSEEuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbS5hZFR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlSW1wcmVzc2lvbnMoKSwgQWkodGhpcy5qbCksIHRoaXMuaUkuZGVzdHJveSgpLCB0aGlzLmVJLmRlc3Ryb3koKSwgdGhpcy5zSS5kZXN0cm95KCksIHRoaXMuUUEuZGVzdHJveSgpLCB0aGlzLkhBICYmICh0aGlzLnZJKCksIHRoaXMuSEEuc3RvcEFkKCdhZE1hbmFnZXJEZXN0cm95JyksIHRoaXMubEkoKSksIHRoaXMuV24uYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5yZW1vdmVQbGF0Zm9ybUNhcHBlZExpbmVJdGVtU3Vic2NyaWJlcih0aGlzKSwgdGhpcy5Xbi5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnVuc3Vic2NyaWJlVG9JbXByZXNzaW9uUmV2ZW51ZSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nQWRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0aGlzLkhBIHx8ICEhdGhpcy5lSS5pc0xvYWRpbmdCaWRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5JKCkgewogICAgICAgICAgICAgICAgICAgICAgICAodGhpcy51SSB8fCB0aGlzLnBJKSAmJiB0aGlzLnVJICYmIHRoaXMuc0kuc3RhcnQodGhpcy5tSSh0aGlzLnVJKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9JKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlJLmNhbGwodGhpcy5nSSgpKSwgdGhpcy5lSS53aW4odGhpcy55SSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ0koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQYXJhbGxlbENhbGxzOiBTbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGU6IHRoaXMubUkodGhpcy51SSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkU3RhdGU6IHRoaXMud0kodGhpcy5wSSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeUkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkQml0UmF0ZTogX28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQYXJhbGxlbFdpbnM6IGpvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFzdFZpZXdNb2RlOiB0aGlzLnVJID8gdGhpcy51SS52YXN0Vmlld01vZGUgOiB0aGlzLnBJLnZhc3RWaWV3TW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGU6IHRoaXMubUkodGhpcy51SSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdGVkU3RhdGU6IHRoaXMud0kodGhpcy5wSSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd0kodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcmVmZXRjaFN0YXRlVHlwZSA9PT0gT28uU3RhcnRTZXNzaW9uUHJlZmV0Y2ggPyAoaSA9IG5ldyBNYXAoKSwgdGhpcy4kbS5nZXRDb250YWluZXJTdGF0ZU1hcCgpLmZvckVhY2goKHQsIGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0KGUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdCksIHsgdmlld2FiaWxpdHk6ICEwIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogaSA9IHRoaXMuJG0uZ2V0Q29udGFpbmVyU3RhdGVNYXAoKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tUb1BsYXk6IHQuY2xpY2tUb1BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogdC5tZWRpYU1ldGFkYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kOiAhIXQuc291bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFZhbHVlOiB0LnNvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRDb250YWluZXJTdGF0ZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQnJlYWtTdGF0ZTogdC5hZEJyZWFrU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE9wcG9ydHVuaXR5OiB0LmFkT3Bwb3J0dW5pdHkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbUkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tUb1BsYXk6IHQuY2xpY2tUb1BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWE6IHQubWVkaWFNZXRhZGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmQ6ICEhdC5zb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFZhbHVlOiB0LnNvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyU3RhdGU6IHRoaXMuJG0uZ2V0Q29udGFpbmVyU3RhdGVNYXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJyZWFrU3RhdGU6IHQuYWRCcmVha1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkT3Bwb3J0dW5pdHk6IHQuYWRPcHBvcnR1bml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY0koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJnLm5leHQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogUHQuYi5BZExvYWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IG51bGwgPT09ICh0ID0gdGhpcy5IQS5zZXR0aW5ncy5hZExvYWRlZFBheWxvYWQpIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQucGF5bG9hZAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5PSSA9IHRoaXMuSEEub25WcGFpZEV2ZW50LnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnR5cGUgPT09IFB0LmIuQWRJbXByZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xQSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHt2aWV3YWJpbGl0eTogdH0gPSB0aGlzLnJJKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oSSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUmcubmV4dCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJJKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kbS5nZXRDb250YWluZXJTdGF0ZU1hcCgpLmdldCh0aGlzLkhBLnNldHRpbmdzLmFkTWFuYWdlckxpbmVJdGVtLnByb3RvTGluZUl0ZW0uYWRUeXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdkkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT0kgJiYgKHRoaXMuT0kudW5zdWJzY3JpYmUoKSwgdGhpcy5PSSA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsSSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xQSA9ICExLCB0aGlzLkpBLm9uQWRSZW1vdmVkKCksIHRoaXMuSEEgPSBudWxsLCB0aGlzLnZJKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhJKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KQS5jaGVja1BhdXNlQWQodGhpcy5IQSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJJKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLllBCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIHQubmV3Q29udGVudCAmJiBpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnJlc2V0Q2Fwc0Jhc2VkT25FeHRlcm5hbEV2ZW50KGguUHJvdG9SZXNldENhcFR5cGVFbnVtLkNvbnRlbnRDYXBwaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRJKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuSEEuZ2V0QWRWb2x1bWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAwID09PSBpICYmIHQgPiAwID8gZSA9IHRoaXMuSEEuc2V0dGluZ3MudHJhY2tlcnMuYWRVbm11dGUgOiBpID4gMCAmJiAwID09PSB0ICYmIChlID0gdGhpcy5IQS5zZXR0aW5ncy50cmFja2Vycy5hZE11dGUpLCBlICYmIEhuLnRyYWNrKGUsIHRoaXMud3gsIHRoaXMuSEEuc2V0dGluZ3MuYWRNYW5hZ2VyTGluZUl0ZW0ucHJvdG9MaW5lSXRlbSwgdGhpcy5tSSh0aGlzLnVJIHx8IHRoaXMucEkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZkkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7cGxheWVySWQ6IGl9ID0gdGhpcy5Xbi5hcHAuY29uZmlnLCB7YWRPcHBvcnR1bml0eTogZX0gPSB0LCB7YWRCcmVha1R5cGU6IHN9ID0gdC5hZEJyZWFrU3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgcyA9PT0gaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5QcmVSb2xsICYmIGlhLmluaXRpYWxpemUoaSksIHMgIT09IGguUHJvdG9BZEJyZWFrVHlwZUVudW0uUHJlUm9sbCAmJiBpYS5sb2coaSwgITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIENvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54SSA9IE9iamVjdChMaS5jKSgpLCB0aGlzLlNJID0gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueEk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBzdGFydGVkQXVjdGlvbldpdGhUaW1lb3V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5TSTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnRBdWN0aW9uV2l0aFRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU0kgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBUbyA9IHsKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b0FkU2xvdHNFbnVtLlByZVJvbGxdOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlByZVJvbGwsCiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsXTogaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5NaWRSb2xsLAogICAgICAgICAgICAgICAgICAgIFtoLlByb3RvQWRTbG90c0VudW0uUG9zdFJvbGxdOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlBvc3RSb2xsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgUG8gZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgYSwgbywgYywgdSwgbCwgZCwgZiwgcCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5qSSA9IGksIHRoaXMua0kgPSBlLCB0aGlzLk1fID0gcywgdGhpcy5NbSA9IG4sIHRoaXMuX0kgPSByLCB0aGlzLlBtID0gbywgdGhpcy5hUyA9IGMsIHRoaXMuQUkgPSBsLCB0aGlzLkF3ID0gZCwgdGhpcy5JSSA9IGYsIHRoaXMuUWQgPSBwLCB0aGlzLl93ID0gYiwgdGhpcy5qbCA9IFtdLCB0aGlzLkNJID0gITEsIHRoaXMuVEkgPSAhMSwgdGhpcy5PeCA9IG5ldyBNYXAoKSwgdGhpcy5NSSA9IE9vLk5vUHJlZmV0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2ID0gaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5NaWRSb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFkLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGVzLnNvbWUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IGguUHJvdG9BZEJyZWFrVHlwZUVudW0uUHJlUm9sbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmICh2ID0gaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5QcmVSb2xsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSB0aGlzLkVJKHRoaXMuUG0uZ2V0TWF4QWRTbG90RHVyYXRpb24oKSwgdik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudUkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYU1ldGFkYToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1RvUGxheTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZE9wcG9ydHVuaXR5OiBuZXcgQ28oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXN0Vmlld01vZGU6IFB0LmEuTm9ybWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCcmVha1N0YXRlOiBtCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhZEluV2luKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5WbS5pc0xvYWRpbmdBZHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW5hYmxlQWRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNJID0gITAsIHRoaXMuTEkoKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFV0LkFkc0VuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQWRzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DSSA9ICExLCB0aGlzLlZtICYmICh0aGlzLlZtLmRpc2FibGVJbXByZXNzaW9ucygpLCB0aGlzLk1JID09PSBPby5Ob1ByZWZldGNoICYmIHQgPT09IGdpLlRpbWVvdXRCZXR3ZWVuQWRzICYmIHRoaXMuUkkoT28uTWlkU2Vzc2lvblByZWZldGNoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlckNvbmZpZyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudUkubWVkaWFNZXRhZGEubWVkaWFJZCA9IHQubWVkaWFJZCwgdGhpcy51SS5tZWRpYU1ldGFkYS5tZWRpYUxhbmd1YWdlID0gdC5tZWRpYUxhbmd1YWdlLCB0aGlzLnVJLm1lZGlhTWV0YWRhLm1lZGlhS2V5d29yZHMgPSB0Lm1lZGlhS2V5d29yZHM7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBPYmplY3QuYXNzaWduKHRoaXMudUkubWVkaWFNZXRhZGEsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxJKHsgbWVkaWFNZXRhZGE6IGkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVzZXJJbnRlcmFjdGlvbih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTEkoeyBjbGlja1RvUGxheTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5ld0FkT3Bwb3J0dW5pdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTUkgPT09IE9vLk5vUHJlZmV0Y2ggJiYgKHRoaXMudUkuYWRPcHBvcnR1bml0eSA9IG5ldyBDbygpKSwgdGhpcy5MSSh7IGFkT3Bwb3J0dW5pdHk6IHRoaXMudUkuYWRPcHBvcnR1bml0eSB9KSwgdGhpcy5CSSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0QWQodCwgaSwgZSwgcywgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk94LnNldCh0LnR5cGUsIHQuY29udGFpbmVyKSwgdGhpcy5PeC5nZXQoaC5Qcm90b0FkVHlwZS5PdmVybGF5KSB8fCB0aGlzLk94LnNldChoLlByb3RvQWRUeXBlLk92ZXJsYXksIHRoaXMuT3guZ2V0KGguUHJvdG9BZFR5cGUuVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuVW0oKSwgdGhpcy5USSA9ICEwLCB0aGlzLkxJKHsgc291bmQ6IG4gfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEFkVm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IChpID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSBpIHx8IGkuc2V0QWRWb2x1bWUodCksIHRoaXMuTEkoeyBzb3VuZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzaXplQWQodCwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ESSAhPT0gZSAmJiAodGhpcy5zZXRWYXN0Vmlld01vZGUoZSksIG51bGwgPT09IChzID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSBzIHx8IHMuc2V0QWRWaWV3TW9kZShlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0b3BBZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSAoaSA9IHRoaXMuVm0pIHx8IHZvaWQgMCA9PT0gaSB8fCBpLnN0b3BBZCh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2VBZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSAoaSA9IHRoaXMuVm0pIHx8IHZvaWQgMCA9PT0gaSB8fCBpLnBhdXNlQWQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc3VtZUFkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09IChpID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSBpIHx8IGkucmVzdW1lQWQodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNraXBBZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT09ICh0ID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSB0IHx8IHQuc2tpcEFkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkQ29udGFpbmVyV2lkdGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKHQgPSB0aGlzLlZtKSB8fCB2b2lkIDAgPT09IHQgPyB2b2lkIDAgOiB0LmdldFZpZGVvQWRDb250YWluZXJTdGF0ZSgpLndpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZE1lZGlhU2l6ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09PSAodCA9IHRoaXMuVm0pIHx8IHZvaWQgMCA9PT0gdCA/IHZvaWQgMCA6IHQuZ2V0QWRNZWRpYVNpemUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudEFkQ2xpY2tUcmFja2luZ1Byb3BlcnRpZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJMaW5lSXRlbUlkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2ZXJ0aXNlckxpbmVJdGVtSWQ6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSA9IG51bGwgPT09ICh0ID0gdGhpcy5WbSkgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC5nZXRDdXJyZW50QWRNZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVyTGluZUl0ZW1JZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmVydGlzZXJMaW5lSXRlbUlkOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFkRHVyYXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZtLmdldEN1cnJlbnRBZE1ldGFkYXRhKCkuZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRBZFR5cGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZtLmdldEN1cnJlbnRBZE1ldGFkYXRhKCkuYWRUeXBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRMYXN0QWRTbG90KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuT3guZ2V0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpLmNsaWVudEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpLmNsaWVudFdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBvZFJlbWFpbmluZ1RpbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA8PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy51SS5hZEJyZWFrU3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQodCAvIHF0LmYpID4gaS5yZW1haW5pbmdBZER1cmF0aW9uIHx8IHRoaXMuTEkoeyBhZEJyZWFrU3RhdGU6IHRoaXMuRUkodCwgaS5hZEJyZWFrVHlwZSkgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQWRTdGF0ZUNoYW5nZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBUb1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MSSh7IGFkQnJlYWtTdGF0ZTogdGhpcy5FSShpLCBlKSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25Db250ZW50Q2hhbmdlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxJKHsgbmV3Q29udGVudDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZhc3RWaWV3TW9kZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuREkgPSB0LCB0aGlzLkZJKHsgdmFzdFZpZXdNb2RlOiB0IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICBBaSh0aGlzLmpsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTEkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZJKHQpLCB0aGlzLkNJICYmIHRoaXMuVEkgJiYgKHRoaXMuVm0uZW5hYmxlSW1wcmVzc2lvbnModGhpcy51SSksIHRoaXMuVkkoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZJKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnVJLCB0KSwgdGhpcy51SS5hZEJyZWFrU3RhdGUgPSB0aGlzLkVJKHRoaXMudUkuYWRCcmVha1N0YXRlLnJlbWFpbmluZ0FkRHVyYXRpb24sIHRoaXMudUkuYWRCcmVha1N0YXRlLmFkQnJlYWtUeXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVkkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRkkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tUb1BsYXk6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudDogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVJKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWRQb2RCcmVhazogdGhpcy5QbS5pc0N1cnJlbnRCcmVha0luUG9kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFBvZFNsb3RJbmRleDogdGhpcy5QbS5pc0N1cnJlbnRCcmVha0luUG9kKCkgPyB0aGlzLlBtLmdldE5leHRTbG90SW5kZXgoKSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZER1cmF0aW9uOiBNYXRoLnJvdW5kKHRoaXMuUG0uZ2V0TWF4QWRTbG90RHVyYXRpb24oKSAvIHF0LmYgfHwgQW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nQWREdXJhdGlvbjogTWF0aC5yb3VuZCh0IC8gcXQuZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uTWF4QWREdXJhdGlvbjogTWF0aC5yb3VuZCh0aGlzLlBtLmdldE1heEFkU2xvdFBvc3NpYmxlRHVyYXRpb24oKSAvIHF0LmYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCcmVha1R5cGU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVm0gPSBuZXcgSW8oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRCcmVha0hlbHBlcjogdGhpcy5QbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQ29udGFpbmVyTWFwOiB0aGlzLk94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1hem9uVGFtU2xvdElkOiB0aGlzLmFTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwOiB0aGlzLk1tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUl0ZW1MaXN0OiB0aGlzLmpJLmxpbmVJdGVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbTogdGhpcy5fSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBianNTY2hhaW5TZXR0aW5nczogdGhpcy5rSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGxUaW1lTXM6IHRoaXMuQUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwUGxheWVyU2V0dGluZ3M6IHRoaXMuTV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlU2Nyb2xsSGlqYWNrRW5mb3JjZW1lbnQ6ICF0aGlzLmpJLmRpc2FibGVTY3JvbGxIaWphY2tFbmZvcmNlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlQWRXaGVuRmluaXNoZWQ6IHRoaXMuQXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQWRXaGVuRmluaXNoZWQ6IHRoaXMuX3cKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuamwucHVzaCh0aGlzLlZtLm9uVnBhaWRFdmVudC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkTG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVUkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRJbXByZXNzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJEkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFB0LmIuQWRWaWRlb1N0YXJ0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQdC5iLkFkRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHQudHlwZSwgeyBwYXlsb2FkOiB0LnBheWxvYWQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7IHBheWxvYWQ6IHt9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB0LnR5cGUsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB0aGlzLlZtLm9uSW1wcmVzc2lvblJldmVudWVFdmVudC5zdWJzY3JpYmUodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYi5JbXByZXNzaW9uUHJpY2UsIHsgcGF5bG9hZDogdC5pbXByZXNzaW9uUmV2ZW51ZSB9KSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmIuSW1wcmVzc2lvblJldmVudWUsIHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuSUkgPT09IGguUHJvdG9BZFBsYXliYWNrTW9kZS5TY3JvbGxUb1BsYXkgJiYgdGhpcy5SSShPby5TdGFydFNlc3Npb25QcmVmZXRjaCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJJKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NSSA9IHQsIHRoaXMudUkuYWRPcHBvcnR1bml0eSA9IG5ldyBDbygpLCB0aGlzLlZtLmVuYWJsZVByZWRpY3QodGhpcy51SSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEJJKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk1JID0gT28uTm9QcmVmZXRjaDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVUkodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU2tpcE1vZGU6IHQucGF5bG9hZC5hZFNraXBNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTG9hZGVkRGF0YTogeyBza2lwT2Zmc2V0OiB0LnBheWxvYWQuYWRMb2FkZWREYXRhLnNraXBPZmZzZXQgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdC50eXBlLCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkSWQ6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRWaWRlb1VybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYU1ldGFkYXRhOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRUcmFja2luZ0VuYWJsZWQ6IGMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LnBheWxvYWQuYWRTb3VyY2VEYXRhLCB1ID0gdGhpcy5WbS5nZXRDdXJyZW50QWRNZXRhZGF0YSgpLCBsID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRTa2lwTW9kZTogdC5wYXlsb2FkLmFkU2tpcE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkU291cmNlRGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9hdFRyYWNraW5nRW5hYmxlZDogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkSWQ6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFNZXRhZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVmlkZW9Vcmw6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1Rocm91Z2hVcmw6IHQucGF5bG9hZC5jbGlja1Rocm91Z2hVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUFkRGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURWRVJUSVNFUjogbnVsbCA9PT0gKGkgPSB0LnBheWxvYWQuY3VzdG9tQWREYXRhKSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLkFEVkVSVElTRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1QQUlHTl9JRDogbnVsbCA9PT0gKGUgPSB0LnBheWxvYWQuY3VzdG9tQWREYXRhKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLkNBTVBBSUdOX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQVRJVkVfSUQ6IHQucGF5bG9hZC5jdXN0b21BZERhdGEuQ1JFQVRJVkVfSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWREdXJhdGlvbjogdC5wYXlsb2FkLmFkU291cmNlRGF0YS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQWRTbG90OiB0aGlzLk94LmdldCh1LmFkVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdC50eXBlLCBsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBNbyBleHRlbmRzIHluIHsKICAgICAgICAgICAgICAgICAgICBnZXROZXdBZE1hbmFnZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNraXBwYWJpbGl0eTogdGhpcy5qci5hZFNraXBwYWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBBZEFmdGVyOiB0aGlzLmpyLnNraXBBZEFmdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuOiB0aGlzLmpyLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvKHRoaXMsIHRoaXMuanIubGluZUl0ZW1TZXR0aW5ncywgdGhpcy5qci5zdXBwbHlDaGFpblNldHRpbmdzLCB0LCB0aGlzLk1tLCB0aGlzLmpyLmlzT3V0U3RyZWFtVHlwZSgpLCB0aGlzLmpyLmFkU2tpcHBhYmlsaXR5LCB0aGlzLlBtLCB0aGlzLmpyLmFtYXpvblRhbVNsb3RJZCwgdGhpcy5qci5nbG9iYWwsIHRoaXMuanIucHJlUm9sbEJyZWFrLCB0aGlzLmpyLnBhdXNlQWRXaGVuRmluaXNoZWQsIHRoaXMuanIuYWRQbGF5YmFja01vZGUsIHRoaXMuanIuYWRCcmVha3MsIHRoaXMuanIubG9vcEFkV2hlbkZpbmlzaGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWW0odCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5ZbSh0KSwgdGhpcy5qci5vdXRzdHJlYW1BZEFzQ29udGVudCAmJiB0aGlzLk5JKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhtKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5YbSgpLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5Ta2lwQWRdLCB0aGlzLkhtLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5za2lwQWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuanIub3V0c3RyZWFtQWRBc0NvbnRlbnQgJiYgKHRoaXMudW5zdWJzY3JpYmUoUHQuYi5BZFN0b3BwZWQsIHRoaXMuVm0pLCB0aGlzLnVuc3Vic2NyaWJlKFB0LmIuQWRFcnJvciwgdGhpcy5WbSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBOSSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IbS5oaWRlUHJvZ3Jlc3NCYXIoKSwgdGhpcy5IbS5oaWRlQWRNYXJrZXIoKSwgdGhpcy5RbSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IEVvID0gNDgwOwogICAgICAgICAgICAgICAgY2xhc3MgTG8gZXh0ZW5kcyBJaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcykgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCBzKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuSEkgPSAhMSwgdGhpcy53ZC5pblRpbWVvdXQgPSAhMSwgdGhpcy53ZC5saW1pdEFkc09uTWlkUm9sbCA9ICEwLCB0aGlzLm9uU3RvcCgpLCB0aGlzLnFJID0gbmV3IF9pKHRoaXMuY29udHJvbERhdGEubWluVGltZUJlZm9yZUFkQnJlYWspLCB0aGlzLnFJLm9uVGltZUVsYXBzZWQuc3Vic2NyaWJlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RBZEJyZWFrU3RhcnRlZCB8fCAodGhpcy5maXJzdEFkQnJlYWtTdGFydGVkID0gITApLCB0aGlzLndkLmluVGltZW91dCA9ICExLCB0aGlzLkhJID0gITAsIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6SSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGxheWVyQWRTbG90ICE9PSBNLlByb3RvQWRTbG90c0VudW0uTWlkUm9sbCB8fCB0aGlzLndkLmluVGltZW91dCB8fCB0aGlzLkhJIHx8ICh0aGlzLmZpcnN0QWRCcmVha1N0YXJ0ZWQgPyB0aGlzLmNvbnRyb2xEYXRhLnRpbWVCZXR3ZWVuQWRzICYmIHRoaXMuTGQgJiYgdGhpcy5XSSgpIDogdGhpcy5jb250cm9sRGF0YS5taW5UaW1lQmVmb3JlQWRCcmVhayAmJiB0aGlzLkdJKCksIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBXSSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZC5pblRpbWVvdXQgPSAhMCwgdGhpcy5xSS5yZXNldCh0aGlzLmNvbnRyb2xEYXRhLnRpbWVCZXR3ZWVuQWRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR0koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2QuaW5UaW1lb3V0ID0gITAsIHRoaXMucUkucmVzZXQodGhpcy5jb250cm9sRGF0YS5taW5UaW1lQmVmb3JlQWRCcmVhayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEpJKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZC5saW1pdEFkc09uTWlkUm9sbCA9IHRoaXMuY29udHJvbERhdGEubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50ICYmIHQgPT09IE0uUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsICYmICghaSB8fCBpIDwgRW8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYW5FbmFibGVBZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzdXBlci5jYW5FbmFibGVBZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmVuYWJsZUFkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50UGxheWVyQWRTbG90ID09PSBNLlByb3RvQWRTbG90c0VudW0uTWlkUm9sbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud2QubGltaXRBZHNPbk1pZFJvbGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQWRzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlYXNvbjogZ2kuVW5rbm93bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53ZC5pblRpbWVvdXQgJiYgdGhpcy5MZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVBZHM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlUmVhc29uOiBnaS5UaW1lb3V0QmV0d2VlbkFkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0QWRzKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnpJKCksIHN1cGVyLnN0YXJ0QWRzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGFuZ2VkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndkLmluVGltZW91dCA9ICExLCB0aGlzLndkLmxpbWl0QWRzT25NaWRSb2xsID0gITAsIHRoaXMucUkuc3RvcCgpLCB0aGlzLmZpcnN0QWRCcmVha1N0YXJ0ZWQgPSAhMSwgdGhpcy5ISSA9ICExLCB0aGlzLnpJKCksIHN1cGVyLmNvbnRlbnRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQWRTdGF0ZUNoYW5nZSh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSB0aGlzLndkLmxpbWl0QWRzT25NaWRSb2xsOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkpJKHQsIGUpLCBzICE9PSB0aGlzLndkLmxpbWl0QWRzT25NaWRSb2xsICYmIHRoaXMudG9nZ2xlRW5hYmxlQWRzKCksIHQgPT09IHRoaXMuY3VycmVudFBsYXllckFkU2xvdCAmJiB0ID09PSBNLlByb3RvQWRTbG90c0VudW0uTWlkUm9sbCB8fCAodGhpcy5ISSA9ICExLCBzdXBlci5vbkFkU3RhdGVDaGFuZ2UodCwgaSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250ZW50UGxheWJhY2tTdGF0ZUNoYW5nZWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ID8gdGhpcy5xSS5zdGFydCgpIDogdGhpcy5xSS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uQWRJbXByZXNzaW9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25BZEltcHJlc3Npb24odCksIHRoaXMuUUkgPSAhdGhpcy5MZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25BZEZpbmlzaGVkKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhJID0gITEsIHRoaXMuZmlyc3RBZEJyZWFrU3RhcnRlZCAmJiAhdGhpcy5RSSAmJiB0aGlzLkxkICYmICFpICYmIHRoaXMuekkoKSwgc3VwZXIub25BZEZpbmlzaGVkKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVN0YXRlQ2hhbmdlZCh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCksIGUgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpIHx8IHRoaXMuekkoKSwgc3VwZXIudmlld2FiaWxpdHlTdGF0ZUNoYW5nZWQodCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucUkuZGlzYWJsZSgpLCBzdXBlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgUm8gZXh0ZW5kcyBGaSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuTXAgPSBMLCB0aGlzLkVwID0gZC5yLCB0aGlzLmpwID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHR5cGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNwLnBsYXllclR5cGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1vKHRoaXMsIHRoaXMuY3AsIHRoaXMuJHBsYXllckNvbnRhaW5lciwgdGhpcy5jaGVja0Zsb2F0aW5nVmlld2FiaWxpdHkodGhpcy5pc1ZpZXdhYmxlKCkpLCB0aGlzLmVwLCB0aGlzLmFwcCwgdGhpcy5aZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSFRNTCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcGxheWVyV3JhcHBlciA9IHRoaXMuYXBwLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZS5jcmVhdGVFbGVtZW50QnlTdHJpbmcoYDxjbnggY2xhc3M9IiR7IGQuYi5QbGF5ZXJXcmFwcGVyIH0iPjwvY254PmApLCB0aGlzLiRwbGF5ZXJDb250YWluZXIgPSB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKCc8Y254IGNsYXNzPVwnY254LXZpZGVvLWNvbnRhaW5lclwnPjwvY254PicpLCB0aGlzLmFkZFBsYXllclNpemUoKSwgdGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRwbGF5ZXJXcmFwcGVyKSwgdGhpcy4kcGxheWVyV3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLiRwbGF5ZXJDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRQbGF5ZXJTaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNwLnBsYXllclNpemUucmVzcG9uc2l2ZSA/ICh0aGlzLiRwbGF5ZXJXcmFwcGVyLmFwcGVuZENoaWxkKHRoaXMueXAoKSksIE9iamVjdChULmEpKHRoaXMuJHBsYXllcldyYXBwZXIsIGQuaS5SZXNwb25zaXZlKSkgOiAodGhpcy5zZXRGaXhlZFNpemUodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciksIE9iamVjdChULmEpKHRoaXMuJHBsYXllcldyYXBwZXIsIGQuaS5GaXhlZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRGaXhlZFNpemUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5OKSh0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYCR7IHRoaXMuY3AucGxheWVyU2l6ZS5maXhlZFdpZHRoIH1weGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGAkeyB0aGlzLmNwLnBsYXllclNpemUuZml4ZWRIZWlnaHQgfXB4YAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG8odGhpcywgdGhpcy5pc1ZpZXdhYmxlKCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mTWlkUm9sbHM6IHRoaXMuY3AubWlkUm9sbE51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWVCZWZvcmVBZEJyZWFrOiB0aGlzLmNwLm1pblRpbWVCZWZvcmVGaXJzdEFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5BZHM6IHRoaXMuY3AudGltZUJldHdlZW5BZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3YWJpbGl0eVBvbGljeTogdGhpcy5jcC5hZFZpZXdhYmlsaXR5UG9saWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxBZEJyZWFrTGVuZ3RoOiB0aGlzLmNwLm91dHN0cmVhbVNldHRpbmdzID8gdGhpcy5jcC5vdXRzdHJlYW1TZXR0aW5ncy50b3RhbEFkQnJlYWtMZW5ndGggOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZFNsb3REdXJhdGlvbjogdGhpcy5lcC5nZXRNYXhBZFNsb3REdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWRQb2REdXJhdGlvbjogdGhpcy5lcC5nZXRNYXhBZFBvZER1cmF0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJEaW1lbnNpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuJHBsYXllckNvbnRhaW5lci5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuJHBsYXllckNvbnRhaW5lci5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJBZHNTa2lwcGFiaWxpdHk6IHRoaXMuY3AuYWRTa2lwcGFiaWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRSb2xsT25seU9uTG9uZ0NvbnRlbnQ6IHRoaXMuY3AubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuOiB0aGlzLmNwLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbgogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmFwcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEJvOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5QcmVSb2xsID0gJ3ByZS1yb2xsJywgdC5NaWRSb2xsID0gJ21pZC1yb2xsJywgdC5Qb3N0Um9sbCA9ICdwb3N0LXJvbGwnOwogICAgICAgICAgICAgICAgfShCbyB8fCAoQm8gPSB7fSkpOwogICAgICAgICAgICAgICAgdmFyIERvID0gQm87CiAgICAgICAgICAgICAgICBjb25zdCBGbyA9IDEyMDA7CiAgICAgICAgICAgICAgICBjbGFzcyBWbyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSwgcywgbiA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGbzsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkgPSB0LCB0aGlzLllJID0gaSwgdGhpcy5LSSA9IGUsIHRoaXMuWkkgPSBzLCB0aGlzLnRDID0gbiwgdGhpcy5pQyA9IG51bGwsIHRoaXMuZUMgPSAhMSwgdGhpcy5zQyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRBKCksICF0aGlzLmVDICYmIHRoaXMuWUkgJiYgdGhpcy5ZSS5hZEluV2luKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVDID0gITAsIHZvaWQgdGhpcy5uQyh0aGlzLnRDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkuc3RhcnRDb250ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudEEoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlU3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LlByZXJvbGxTdGF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZUMgPSAhMSwgdGhpcy5uQyh0aGlzLktJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUG9zdHJvbGxTdGF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZUMgPSAhMSwgdGhpcy5uQyh0aGlzLlpJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pQyAmJiB0aGlzLnRBKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdEEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlDKSwgdGhpcy5pQyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5DKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50QSgpLCB0aGlzLmlDID0gc2V0VGltZW91dCh0aGlzLnNDLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgVW8gPSB7CiAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXhIZWlnaHQ6IDE2MCwKICAgICAgICAgICAgICAgICAgICByYXRpb1dpZHRoOiAxNiwKICAgICAgICAgICAgICAgICAgICByYXRpb0hlaWdodDogOQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0ICRvID0gJ1ZpZGVvJzsKICAgICAgICAgICAgICAgIGNsYXNzIE5vIGV4dGVuZHMgUm8gewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmV2ZW50cyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgVHQuYiksIEkpLCB0aGlzLnJDID0gITEsIHRoaXMuaEMgPSAhMCwgdGhpcy5hQyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBsYXlpbmdTdGF0ZV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhmKGguUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdmLmNvbnRlbnRQbGF5YmFja1N0YXRlQ2hhbmdlZCghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3kuUHJlcm9sbFN0YXRlXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWGYoaC5Qcm90b0FkU2xvdHNFbnVtLlByZVJvbGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBvc3Ryb2xsU3RhdGVdOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YZihoLlByb3RvQWRTbG90c0VudW0uUG9zdFJvbGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBhdXNlZFN0YXRlXTogKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2ggPT09IGguUHJvdG9BZFNsb3RzRW51bS5QcmVSb2xsICYmIHRoaXMuWGYoaC5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlN0b3BwZWRTdGF0ZV06ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9oID09PSBoLlByb3RvQWRTbG90c0VudW0uUG9zdFJvbGwgJiYgdGhpcy5jcC51cE5leHRNb2RlICE9PSBNLlByb3RvUGxheWVyVXBOZXh0TW9kZS5TdG9wID8gKHRoaXMuWGYoaC5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwpLCB0aGlzLk5mKCkpIDogKHRoaXMuZ2Yub25TdG9wKCksIHRoaXMuTmYoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMub0MgPSAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSB5LlBsYXlpbmdTdGF0ZSAmJiAodGhpcy51bnN1YnNjcmliZShBLlN0YXRlQ2hhbmdlZCwgdGhpcy5YSSwgdGhpcy5vQyksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBJLlZpZGVvU3RhcnRlZCwgeyBwYXlsb2FkOiB0aGlzLmdldFZpZGVvRGV0YWlscygpIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5jQyA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuYUNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSB5LlBsYXlpbmdTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2YuY29udGVudFBsYXliYWNrU3RhdGVDaGFuZ2VkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSB5LlBhdXNlZFN0YXRlID8gdGhpcy52ZiA9ICEwIDogdGhpcy52ZiA9ICExLCBpICYmIGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudUMgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxDLmVudGVyRnVsbFNjcmVlbigpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkuZW50ZXJGdWxsc2NyZWVuKCksIHRoaXMuZmxvYXRpbmdNb2R1bGUgJiYgdGhpcy5mbG9hdGluZ01vZHVsZS5mdWxsc2NyZWVuU3RhdGVDaGFuZ2UoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Jhc2VWaWRlb0V4cGVyaWVuY2VfZW50ZXJGdWxsc2NyZWVuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ3AgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhJLmV4aXRGdWxsc2NyZWVuKCksIHRoaXMuZmxvYXRpbmdNb2R1bGUgJiYgdGhpcy5mbG9hdGluZ01vZHVsZS5mdWxsc2NyZWVuU3RhdGVDaGFuZ2UoITEpLCB0aGlzLmFwcC5jb25maWcub3Mub3MgPT09IFN0LmIuSW9zICYmICh0aGlzLnJDID0gdGhpcy5YSS5pc0lvc0Z1bGxzY3JlZW4gPSAhMSwgdGhpcy5YZih0aGlzLk9oKSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5jLkZ1bGxzY3JlZW5DaGFuZ2VkLCB7IHBheWxvYWQ6ICExIH0pLCBzdXBlci5ncCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm1wID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuY29uZmlnLm9zLm9zID09PSBTdC5iLklvcyAmJiAodGhpcy5yQyA9IHRoaXMuWEkuaXNJb3NGdWxsc2NyZWVuID0gITAsIHRoaXMuZ2Yub25TdG9wKCkpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgVHQuYy5GdWxsc2NyZWVuQ2hhbmdlZCwgeyBwYXlsb2FkOiAhMCB9KSwgc3VwZXIubXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydCgpLCB0aGlzLmRDKCksIHRoaXMuZkMoKSwgdGhpcy5wQyh0aGlzLlhJLCB0aGlzLmFkSGFuZGxlciksIHRoaXMuYkMoKSwgdGhpcy5YSS5zdGFydCgpLCB0aGlzLkNwKHRoaXMuWEkpLCB0aGlzLnZDKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQmFzZVZpZGVvRXhwZXJpZW5jZV9TdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVmlkZW8odCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkSGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlci5zdG9wQWQoJ2NoYW5nZVZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PZih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyLnVzZXJJbnRlcmFjdGlvbihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhJLnNldFZpZGVvKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwbGF5KHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5pbkltcHJlc3Npb24gPyB0aGlzLmFkSGFuZGxlci5wbGF5KCkgOiB0aGlzLlhJLnBsYXkodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhdXNlKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5pbkltcHJlc3Npb24gPyB0aGlzLmFkSGFuZGxlci5wYXVzZSgpIDogdGhpcy5YSS5wYXVzZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TmV3Vm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0TmV3Vm9sdW1lKHQpLCB0aGlzLlhJLnZvbHVtZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFZvbHVtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWEkudm9sdW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhJLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgZHVyYXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhJLmR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RldGFpbHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YSS5nZXRDdXJyZW50VmlkZW9EYXRhKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHRoaXMubUMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0b2dnbGVGdWxsc2NyZWVuKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKHQpIHx8ICh0ID0gIXRoaXMubEMuaXNGdWxsc2NyZWVuKSwgdGhpcy5sQy5pc0Z1bGxzY3JlZW4gIT09IHQgJiYgKHQgPyB0aGlzLnVDKCkgOiB0aGlzLmxDLmV4aXRGdWxsU2NyZWVuKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93Q2FwdGlvbnMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkuc2hvd0NhcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGVDYXB0aW9ucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YSS5oaWRlQ2FwdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRXhwYW5kQnV0dG9uKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YSS50b2dnbGVFeHBhbmRCdXR0b24odCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFBsYXlsaXN0SWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNwLnBsYXlsaXN0SWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFF1YWxpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhJLmdldFF1YWxpdHkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UXVhbGl0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkuc2V0UXVhbGl0eSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QXV0b1F1YWxpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWEkuc2V0QXV0b1F1YWxpdHkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0QXZhaWxhYmxlUXVhbGl0aWVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5YSS5nZXRBdmFpbGFibGVRdWFsaXRpZXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpLCB0aGlzLmdDLmRlc3Ryb3koKSwgdGhpcy5YSSAmJiAodGhpcy5YSS5kZXN0cm95KCksIHRoaXMudW5zdWJzY3JpYmVBbGwodGhpcy5YSSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtQyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZU1heEhlaWdodDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb0hlaWdodDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb1dpZHRoOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gVW8sIG4gPSBpIC8gZSAqIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0LnRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHQuZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogT2JqZWN0KHJ0LmQpKHQuZHVyYXRpb24pID8gdC5kdXJhdGlvbiA6IHRoaXMuWEkuZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkczogdC5rZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdC5jbGlja1VybCA/IHRoaXMuYXBwLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2Uuc2V0dXBNYWNyb3ModC5jbGlja1VybCkgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUZpZWxkczogdC5jdXN0b21GaWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWw6IHQuZ2V0VGh1bWJuYWlsVXJsKG4sIGkpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEZmKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZiB8fCB0aGlzLlZmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBEb1toLlByb3RvQWRTbG90c0VudW1bdGhpcy5PaF1dOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhmID0gITAsIHRoaXMuYWYgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsgYWRCcmVha1Bvc2l0aW9uOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2ggPT09IGguUHJvdG9BZFNsb3RzRW51bS5Qb3N0Um9sbCAmJiAodGhpcy51ZiA9ICEwKSwgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkQnJlYWtTdGFydChpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU2YoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGYgJiYgKHRoaXMuaGYgPSAhMSwgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdEFkQnJlYWtDb21wbGV0ZSgpLCB0aGlzLnVmICYmICh0aGlzLnVmID0gITEsIHRoaXMuTmYoKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBVZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZiB8fCAodGhpcy5oZiAmJiB0aGlzLlNmKCksIHRoaXMuY2YgfHwgdGhpcy5WZigpLCB0aGlzLmFmID0gITAsIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRQbGF5KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZiAmJiAodGhpcy5hZiA9ICExLCB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0UGF1c2UoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZmKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmIHx8ICh0aGlzLmNmID0gITAsIHRoaXMuWEkuZ2V0Q3VycmVudFZpZGVvRGF0YSgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUl0ZW1JZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZHM6IHIKICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuWEkuc3RyZWFtRm9ybWF0LCBhID0gJG8sIG8gPSBlIHx8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0U2Vzc2lvblN0YXJ0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdDogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWVsZExpc3Q6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTmYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2YgJiYgKHRoaXMuY2YgPSAhMSwgdGhpcy5hZiA9ICExLCB0aGlzLmhmICYmIHRoaXMuU2YoKSwgdGhpcy5hcHAuc2VydmljZXMuRXZlbnRzU3RvcmFnZVNlcnZpY2UuZW1pdFNlc3Npb25FbmQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhmKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNmICYmICh0aGlzLmFwcC5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0Q29udGVudENvbXBsZXRlKCksIHRoaXMuY3AucG9zdFJvbGxCcmVhayB8fCB0aGlzLk5mKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5ZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuZ2V0VmlkZW9EZXRhaWxzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyLnNldENvbnRpbnVlUmVhZGluZ0NhcmQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTcmM6IHQudGh1bWJuYWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQudGl0bGUKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHN1cGVyLnlmKCksIHRoaXMuWEkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbCh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2wodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVoKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci51aCgpLCB0aGlzLlhJICYmIHRoaXMuWEkucmVzaXplKHRoaXMuYnJlYWtQb2ludHNIYW5kbGVyLmN1cnJlbnRCcmVha3BvaW50Q2xhc3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG9hdGluZ01vZHVsZSAmJiB0aGlzLmZsb2F0aW5nTW9kdWxlLmlzSW5GbG9hdGluZyA/ICh0aGlzLmZsb2F0aW5nTW9kdWxlLmRlc3Ryb3koKSwgdGhpcy5wYXVzZSghMSkpIDogdGhpcy5sQy5pc0Z1bGxzY3JlZW4gPyB0aGlzLmxDLmV4aXRGdWxsU2NyZWVuKCkgOiB0aGlzLnRyaWdnZXJEZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlSFRNTCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2VuZXJhdGVIVE1MKCksIHRoaXMueUMgPSB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKGA8aW1nIGNsYXNzPSIkeyBkLmIuSW1hZ2VQbGFjZWhvbGRlciB9Ij5gKSwgdGhpcy4kcGxheWVyV3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnlDKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd0ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci51cGRhdGVGaWx0ZXJDb25maWcodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJDKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZSh4dFt4dC5Wb2x1bWVdLCB0aGlzLlhJLCAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge3ZvbHVtZTogdH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5paCh0KSwgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuc2V0Vm9sdW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoTy5OZXdWaWRlbywgdGhpcy5YSSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEkuTmV3VmlkZW8pLCB0aGlzLnN1YnNjcmliZShBLlN0YXRlQ2hhbmdlZCwgdGhpcy5YSSwgdGhpcy5vQyksIHRoaXMuWEkuZ2V0Q3VycmVudFZpZGVvRGF0YSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUtleXdvcmRzOiB0LmtleXdvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUxhbmd1YWdlOiB0Lmxhbmd1YWdlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSW5kZXhlczogdC52aWRlb0luZGV4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud0MoaSksIHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5zZXROZXdNZWRpYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQ6IHQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVXJsOiB0LmNsaWNrVXJsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHQuZ2V0VGh1bWJuYWlsVXJsKHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIuY2xpZW50V2lkdGgsIHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5zZXRBZExvYWRpbmdCYWNrZ3JvdW5kVXJsKGUpLCB0aGlzLk9DKGUsIHQuYWx0VGV4dCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBLk1lZGlhTWV0YVVwZGF0ZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdC50aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0LmRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoQS5GaXJzdEZyYW1lUGxheWVkLCB0aGlzLlhJLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2Uuc2V0TWVkaWFTdGFydCgpLCB0aGlzLlJwKCksIHRoaXMuVmYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKEEuU3RhdGVDaGFuZ2VkLCB0aGlzLlhJLCAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZ0MuY2hhbmdlU3RhdGUodCksIHRoaXMueEModCksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5QbGF5aW5nU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmQuUGxheSwgeyBwYXlsb2FkOiB0aGlzLmdldFZpZGVvRGV0YWlscygpIH0pLCB0aGlzLlVmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUGF1c2VkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmQuUGF1c2UsIHsgcGF5bG9hZDogdGhpcy5nZXRWaWRlb0RldGFpbHMoKSB9KSwgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnNldFNlc3Npb25QbGF5YmFjayghMSksIHRoaXMuJGYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5TdG9wcGVkU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnNldFNlc3Npb25QbGF5YmFjayghMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHkuUHJlcm9sbFN0YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB5LlBvc3Ryb2xsU3RhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHAuc2VydmljZXMuVHJhY2tpbmdTZXJ2aWNlLnNldFNlc3Npb25QbGF5YmFjayghMCksIHRoaXMuRmYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeS5IaWRkZW5TdGF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2Uuc2V0U2Vzc2lvblBsYXliYWNrKCEwKSwgdGhpcy4kZigpLCB0aGlzLkZmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwLnNlcnZpY2VzLlRyYWNraW5nU2VydmljZS5zZXRTZXNzaW9uUGxheWJhY2soITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5mbG9hdGluZ01vZHVsZSAmJiB0aGlzLnN1YnNjcmliZShjLmIuVXNlckludGVyYWN0aW9uLCB0aGlzLlhJLCB0aGlzLlBmKSwgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5zdWJzY3JpYmUoYy5iLlVzZXJJbnRlcmFjdGlvbiwgdGhpcy5YSSwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtwbGF5YmFjazogdH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgITEgPT09IHQgJiYgdGhpcy5nZi5vblN0b3AoKSwgdGhpcy5hZEhhbmRsZXIudXNlckludGVyYWN0aW9uKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoYy5iLlVzZXJJbnRlcmFjdGlvbiwgdGhpcy5YSSwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkTmV4dDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkUHJldjogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCB8fCBpKSAmJiB0aGlzLk5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShBLkNvbnRlbnRRdWFydGlsZXMsIHRoaXMuWEksICh7cGF5bG9hZDogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tNZWRpYVF1YXJ0aWxlKHQpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9RdWFydGlsZXNFbnVtLkZpcnN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBJLlZpZGVvQ29tcGxldGVkMjU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9RdWFydGlsZXNFbnVtLlNlY29uZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gSS5WaWRlb0NvbXBsZXRlZDUwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUXVhcnRpbGVzRW51bS5UaGlyZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gSS5WaWRlb0NvbXBsZXRlZDc1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoLlByb3RvUXVhcnRpbGVzRW51bS5Gb3VydGg6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IEkuVmlkZW9Db21wbGV0ZWQxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBpLCB7IHBheWxvYWQ6IHRoaXMuZ2V0VmlkZW9EZXRhaWxzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShBLkNvbnRlbnRRdWFydGlsZXMsIHRoaXMuWEksICh7cGF5bG9hZDogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPT09IGguUHJvdG9RdWFydGlsZXNFbnVtLkZvdXJ0aCAmJiB0aGlzLkhmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5PdmVybGF5Q2xpY2tdLCB0aGlzLlhJLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEkuUGxheWVyQ2xpY2tlZCwgeyBwYXlsb2FkOiB0aGlzLmdldFZpZGVvRGV0YWlscygpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeC5DaGFuZ2UsIHRoaXMuWEksIHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5kLlF1YWxpdHlDaGFuZ2VkLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKE8uUGxheUVycm9yLCB0aGlzLlhJLCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5kLlBsYXlFcnJvciwgdCksIHRoaXMuYXBwLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRQbGF5RXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNhcHRpb25Pbl0sIHRoaXMuWEksICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgSS5TdWJ0aXRsZXNWaXNpYmlsaXR5Q2hhbmdlZCwgeyBwYXlsb2FkOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNhcHRpb25PZmZdLCB0aGlzLlhJLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEkuU3VidGl0bGVzVmlzaWJpbGl0eUNoYW5nZWQsIHsgcGF5bG9hZDogITEgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5Wb2x1bWVdLCB0aGlzLmFkSGFuZGxlciwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt2b2x1bWU6IHR9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWgodCksIHRoaXMuWEkudm9sdW1lID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKE8uTmV3VmlkZW8sIHRoaXMuWEksICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaEMgPyAodGhpcy5oQyA9ICExLCB0aGlzLmNwLmFkUGxheWJhY2tNb2RlID09PSBoLlByb3RvQWRQbGF5YmFja01vZGUuQXV0b3BsYXkgJiYgdGhpcy5jcC5wbGF5YmFja01vZGUgIT09IGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkNsaWNrVG9QbGF5ICYmIDAgPT09IHRoaXMuY3AucHJlUm9sbEJyZWFrICYmIHRoaXMuWGYoaC5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwpKSA6IHRoaXMuc3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuY3AuaXNDbG9zZUJ1dHRvbiAmJiB0aGlzLnN1YnNjcmliZSh4dFt4dC5DbG9zZV0sIHRoaXMuWEksICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShjLmIuR2VuZXJhbFVzZXJJbnRlcmFjdGlvbiwgdGhpcy5YSSwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt0eXBlOiB0fQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tNZWRpYUNsaWNrKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZkMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyICYmICh0aGlzLmFkSGFuZGxlci5zdGFydCh0aGlzLlhJLndpZHRoLCB0aGlzLlhJLmhlaWdodCwgdGhpcy5jcC5zb3VuZE1vZGUgPT09IE0uUHJvdG9QbGF5ZXJTb3VuZE1vZGUuT24gPyAxIDogMCksIHRoaXMuZ2YuZm9yY2VSZWNoZWNrKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB4Qyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY0ModCkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS2YodCkgewogICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5yQyAmJiB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5hZFN0YXRlQ2hhbmdlKHQsIHRoaXMuZXAuZ2V0TWF4QWRTbG90RHVyYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpmKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2R1cmF0aW9uOiBpfSA9IHRoaXMuWEk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2Yub25BZFN0YXRlQ2hhbmdlKHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEFkUG9kRHVyYXRpb246IHRoaXMuZXAuZ2V0TWF4QWRQb2REdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWRTbG90RHVyYXRpb246IHRoaXMuZXAuZ2V0TWF4QWRTbG90RHVyYXRpb24oKQogICAgICAgICAgICAgICAgICAgICAgICB9LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdkMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubEMgPSBuZXcgX3QodGhpcywgdGhpcy5hcHAuc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLCB0aGlzLiRwbGF5ZXJDb250YWluZXIsIHRoaXMuYXBwLmNvbmZpZy5vcy5vcyksIHRoaXMuU0MoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU0MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkV4cGFuZF0sIHRoaXMuWEksIHRoaXMudUMpLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5Db2xsYXBzZV0sIHRoaXMuWEksICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxDLmV4aXRGdWxsU2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShPdC5leGl0LCB0aGlzLmxDLCB0aGlzLmdwKSwgdGhpcy5zdWJzY3JpYmUoT3QuZW50ZXIsIHRoaXMubEMsIHRoaXMubXApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPQyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueUMuc3R5bGUuZGlzcGxheSA9ICdub25lJywgdGhpcy55Qy5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlDLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QocnQuaCkodCkgJiYgdGhpcy55Qy5zZXRBdHRyaWJ1dGUoJ3NyYycsIHQpLCB0aGlzLnlDLnNldEF0dHJpYnV0ZSgnYWx0JywgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBDKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlUm9sbEJyZWFrOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJvbGxCcmVhazogcwogICAgICAgICAgICAgICAgICAgICAgICB9ID0gdGhpcy5jcDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nQyA9IG5ldyBWbyh0LCBpLCBlLCBzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgSG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kdWVUaW1lID0gdCwgdGhpcy5zY2hlZHVsZXIgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN1YnNjcmliZShuZXcgcW8odCwgdGhpcy5kdWVUaW1lLCB0aGlzLnNjaGVkdWxlcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKSwgcW8gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5jYWxsKHRoaXMsIGkpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5kdWVUaW1lID0gZSwgbi5zY2hlZHVsZXIgPSBzLCBuLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IG51bGwsIG4ubGFzdFZhbHVlID0gbnVsbCwgbi5oYXNWYWx1ZSA9ICExLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUuX2wgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCksIHRoaXMubGFzdFZhbHVlID0gdCwgdGhpcy5oYXNWYWx1ZSA9ICEwLCB0aGlzLmFkZCh0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKHpvLCB0aGlzLmR1ZVRpbWUsIHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUuSWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZE5leHQoKSwgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5kZWJvdW5jZWROZXh0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xlYXJEZWJvdW5jZSgpLCB0aGlzLmhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmxhc3RWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGwsIHRoaXMuaGFzVmFsdWUgPSAhMSwgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5jbGVhckRlYm91bmNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHQgJiYgKHRoaXMucmVtb3ZlKHQpLCB0LnVuc3Vic2NyaWJlKCksIHRoaXMuZGVib3VuY2VkU3Vic2NyaXB0aW9uID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6byh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5kZWJvdW5jZWROZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgV28gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3IuY2FsbCh0aGlzKSwgdGhpcy5tZXNzYWdlID0gJ2FyZ3VtZW50IG91dCBvZiByYW5nZScsIHRoaXMubmFtZSA9ICdBcmd1bWVudE91dE9mUmFuZ2VFcnJvcicsIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLCB0OwogICAgICAgICAgICAgICAgICAgIH0oKSwgR28gPSBuZXcgY2koZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEpvKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgY2koZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNjaGVkdWxlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0odCkgOiBHbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBRbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b3RhbCA9IHQsIHRoaXMudG90YWwgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXbygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnN1YnNjcmliZShuZXcgWG8odCwgdGhpcy50b3RhbCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgIH0oKSwgWG8gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdC5jYWxsKHRoaXMsIGkpIHx8IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy50b3RhbCA9IGUsIHMuY291bnQgPSAwLCBzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXdChpLCB0KSwgaS5wcm90b3R5cGUuX2wgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnRvdGFsLCBlID0gKyt0aGlzLmNvdW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA8PSBpICYmICh0aGlzLmRlc3RpbmF0aW9uLm5leHQodCksIGUgPT09IGkgJiYgKHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKSwgdGhpcy51bnN1YnNjcmliZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgfShuaSk7CiAgICAgICAgICAgICAgICBjb25zdCBZbyA9IDQwMDsKICAgICAgICAgICAgICAgIHZhciBLbywgWm87CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0W3QuU3RhdGVDaGFuZ2VkID0gMF0gPSAnU3RhdGVDaGFuZ2VkJywgdFt0LkNvbnRlbnRFbmQgPSAxXSA9ICdDb250ZW50RW5kJywgdFt0LlZpZGVvUXVldWVkID0gMl0gPSAnVmlkZW9RdWV1ZWQnOwogICAgICAgICAgICAgICAgfShLbyB8fCAoS28gPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgdGMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5qQyA9IGksIHRoaXMua0MgPSBlLCB0aGlzLl9DID0gcywgdGhpcy5BQyA9IG4sIHRoaXMuSUMgPSByLCB0aGlzLkNDID0gaCwgdGhpcy5UQyA9ICExLCB0aGlzLlBDID0gITEsIHRoaXMuTUMgPSAhMSwgdGhpcy5FQyA9ICExLCB0aGlzLkxDID0gNTAwLCB0aGlzLlJDID0gITEsIHRoaXMuQkMgPSBuZXcgamkoKSwgdGhpcy5EQyA9IDAsIHRoaXMuRkMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRkMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVkMgPSB5LlN0b3BwZWRTdGF0ZSwgdGhpcy5VQyA9IHkuU3RvcHBlZFN0YXRlLCB0aGlzLkNDICYmICh0aGlzLlRDID0gITApLCB0aGlzLmluaXRMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdExpc3RlbmVycygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQkMucGlwZSgoaSA9IFlvLCB2b2lkIDAgPT09IGUgJiYgKGUgPSBmaSksIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5saWZ0KG5ldyBIbyhpLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAodCA9IDEsIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gdCA/IEpvKCkgOiBpLmxpZnQobmV3IFFvKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLnN1YnNjcmliZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJEModCksIHRoaXMuREMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTkModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZDICE9PSB0ICYmICh0aGlzLlVDID0gdGhpcy5WQywgdGhpcy5WQyA9IHQsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBLb1tLby5TdGF0ZUNoYW5nZWRdLCB7IHBheWxvYWQ6IHRoaXMuVkMgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIQyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZDID09PSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OQyh5LlByZXJvbGxTdGF0ZSksIHRoaXMuVEMgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgekMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV0MgPT09IHkuUGxheWluZ1N0YXRlID8gdGhpcy5HQygpIDogdGhpcy5KQygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBRQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OQyh5LlBvc3Ryb2xsU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XQyA9PT0geS5QYXVzZWRTdGF0ZSA/ICh0aGlzLk1DID0gITAsIHRoaXMuc3RvcCgpKSA6ICh0aGlzLk1DID0gITEsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBLb1tLby5Db250ZW50RW5kXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBZQyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJDID0gITAsIHRoaXMuVkMgIT09IHkuSGlkZGVuU3RhdGUgJiYgdGhpcy5OQyh5LlBsYXlpbmdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVkMgIT09IHkuSGlkZGVuU3RhdGUgJiYgKHRoaXMua0MuaXNQbGF5UGVuZGluZygpICYmIHRoaXMuUkMgPyB0aGlzLk5DKHkuUGxheWluZ1N0YXRlKSA6IHRoaXMuTkMoeS5TdG9wcGVkU3RhdGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEpDKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLnBhdXNlKCksIHRoaXMuTkMoeS5QYXVzZWRTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdDKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5DKHkuQnVmZmVyaW5nU3RhdGUpLCB0aGlzLmpDLmdldEN1cnJlbnRWaWRlb0RhdGEoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQyh5LkhpZGRlblN0YXRlKSB8fCB0aGlzLldDID09PSB5LlBhdXNlZFN0YXRlIHx8IHRoaXMuWUModGhpcy5rQy5wbGF5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS0MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVkMgIT09IHkuUG9zdHJvbGxTdGF0ZSAmJiAodGhpcy5UQyA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlVDICYmIHRoaXMuTkModGhpcy5VQyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBsYXkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV0MgPSB5LlBsYXlpbmdTdGF0ZSwgdGhpcy5IQyh5LlBsYXlpbmdTdGF0ZSkgfHwgdGhpcy5IQyh5LlByZXJvbGxTdGF0ZSkgfHwgdGhpcy5IQyh5LlBvc3Ryb2xsU3RhdGUpIHx8IHRoaXMuSEMoeS5IaWRkZW5TdGF0ZSkgfHwgKCF0aGlzLl9DIHx8IHRoaXMuVEMgfHwgdGhpcy5QQyA/IHRoaXMuSEMoeS5TdG9wcGVkU3RhdGUpICYmIHRoaXMuTUMgPyB0aGlzLlhDKCkgOiB0aGlzLkdDKCkgOiB0aGlzLnFDKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0luUGxheWluZ1N0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5IQyh5LlBsYXlpbmdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZpZGVvUXVldWUodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAwID09PSB0aGlzLkJDLm9ic2VydmVycy5sZW5ndGggJiYgdGhpcy5pbml0TGlzdGVuZXJzKCksIGkgPyB0aGlzLkRDLS0gOiB0aGlzLkRDKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmpDLmdldEFkanVzdGVkVmlkZW9JbmRleCh0LCB0aGlzLkRDKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CQy5uZXh0KGUpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgS29bS28uVmlkZW9RdWV1ZWRdLCB7IHBheWxvYWQ6IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMua0MucGF1c2UoKSwgdGhpcy5LQygpLCB0aGlzLk5DKHkuQnVmZmVyaW5nU3RhdGUpLCB0aGlzLlpDICYmIHRoaXMuWkMuaXNQZW5kaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpDLnJlamVjdCgpLCB0aGlzLlpDID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpDID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuakMuc2V0VmlkZW8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWkMgPSBuZXcganQuYSgpLCB0aGlzLlpDLnJlc29sdmUoaSksIHRoaXMuWkMucHJvbWlzZS50aGVuKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aQyA9IG51bGwsIHRoaXMua0Muc2V0U291cmNlKHQpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2UodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV0MgPSB5LlBhdXNlZFN0YXRlLCB0aGlzLkhDKHkuUHJlcm9sbFN0YXRlKSB8fCB0aGlzLkhDKHkuUG9zdHJvbGxTdGF0ZSkgfHwgdGhpcy5IQyh5LkhpZGRlblN0YXRlKSB8fCB0aGlzLkpDKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhdXNlVG9nZ2xlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5IQyh5LlBhdXNlZFN0YXRlKSB8fCB0aGlzLkhDKHkuUGxheWluZ1N0YXRlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkhDKHkuUGF1c2VkU3RhdGUpICYmIHRoaXMuRUMgPyAodGhpcy5FQyA9ICExLCB2b2lkIHRoaXMucGxheSgpKSA6IHRoaXMuSEMoeS5QbGF5aW5nU3RhdGUpID8gKHRoaXMuRUMgPSAhMCwgdm9pZCB0aGlzLnBhdXNlKCkpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLnBhdXNlKCksIHRoaXMuTkMoeS5TdG9wcGVkU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLmhpZGUoKSwgdGhpcy5rQy5wYXVzZSgpLCB0aGlzLk5DKHkuSGlkZGVuU3RhdGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93KHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhDKHkuSGlkZGVuU3RhdGUpICYmICh0aGlzLmtDLnNob3coKSwgdGhpcy5VQyAhPT0geS5Qb3N0cm9sbFN0YXRlID8gdCAmJiAodGhpcy5XQyA9PT0geS5QbGF5aW5nU3RhdGUgPyB0aGlzLkdDKCkgOiB0aGlzLkpDKCkpIDogdGhpcy5YQygpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmlkZW9FbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQUMgJiYgIXRoaXMuUEMgPyB0aGlzLlFDKCkgOiB0aGlzLlhDKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uRW50ZXJCdWZmZXJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSEMoeS5QbGF5aW5nU3RhdGUpICYmIHRoaXMuTkMoeS5CdWZmZXJpbmdTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uRXhpdEJ1ZmZlcmluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IQyh5LkJ1ZmZlcmluZ1N0YXRlKSAmJiAodGhpcy5XQyA9PT0geS5QbGF5aW5nU3RhdGUgPyB0aGlzLkdDKCkgOiB0aGlzLkpDKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlZDOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXBsYXkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua0MuY3VycmVudFRpbWUgPSAwLCAhdGhpcy5fQyB8fCB0aGlzLlBDID8gdGhpcy5HQygpIDogdGhpcy5xQygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0Um9sbEJyZWFrKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlZDICE9PSB5LlBvc3Ryb2xsU3RhdGUgPyB0aGlzLnpDKCkgOiB0aGlzLlhDKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uRnVsbFNjcmVlbkNoYW5nZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSUMgJiYgKHRoaXMuUEMgPSB0LCB0IHx8IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XQyA9PT0geS5QbGF5aW5nU3RhdGUgPyAodGhpcy5wYXVzZSgpLCB0aGlzLnBsYXkoKSkgOiB0aGlzLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuTEMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBpYyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRUID0gW10sIHRoaXMudFQgPSB0LCB0aGlzLmlUKDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zVCh0aGlzLm5UKS5nZXRNZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMublQgPSB0LCB0aGlzLmVUKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudFRbdF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZVF1YWxpdGllc0ZvclNvdXJjZU1ldGEodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnNldEF2YWlsYWJsZVF1YWxpdGllcyhpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IG5leHRWaWRlb0luZGV4KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uVCA9PT0gdGhpcy50VC5sZW5ndGggLSAxID8gMCA6IHRoaXMublQgKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgcHJldlZpZGVvSW5kZXgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSB0aGlzLm5UID8gdGhpcy50VC5sZW5ndGggLSAxIDogdGhpcy5uVCAtIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjdXJyZW50VmlkZW9JbmRleCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMublQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRWaWRlb0RhdGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNUKHRoaXMublQpLmdldE1ldGFkYXRhKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RhdGEodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNUKHQpLmdldE1ldGFkYXRhKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBZGp1c3RlZFZpZGVvSW5kZXgodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSA9PT0gaSB8fCAtMSA9PT0gaSA/IHQgOiBpID4gMCA/IHQgKyBpIDwgdGhpcy5sZW5ndGggPyB0ICsgaSA6IHRoaXMubGVuZ3RoIC0gMSA6IHQgKyBpIDwgMCA/IDAgOiB0ICsgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VmlkZW8odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNUKHQpLmdldE1ldGFkYXRhKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaVQodCksIGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRULmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50VCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHQuQXV0b3BsYXkgPSAnYXV0b3BsYXknLCB0LkF1dG9jaGFpbiA9ICdhdXRvY2hhaW4nLCB0LlVzZXJJbml0aWF0ZWQgPSAndXNlciBpbml0aWF0ZWQnOwogICAgICAgICAgICAgICAgfShabyB8fCAoWm8gPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgZWMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Gb3JtYXQgPSBaby5BdXRvcGxheSwgdGhpcy5pc011dGVkID0gITAsIHQgPT09IGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkNsaWNrVG9QbGF5ICYmICh0aGlzLnN0cmVhbUZvcm1hdCA9IFpvLlVzZXJJbml0aWF0ZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgc3RyZWFtRm9ybWF0VmFsdWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsgdGhpcy5zdHJlYW1Gb3JtYXQgfSR7IHRoaXMuaXNNdXRlZCA/ICcgbXV0ZWQnIDogJycgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3Qgc2MgPSB7CiAgICAgICAgICAgICAgICAgICAgW2guUHJvdG9WaWRlb1F1YWxpdHkuSGlnaDEwODBwXTogewogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBnLlN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDgwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b1ZpZGVvUXVhbGl0eS5IaWdoNzIwcF06IHsKICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eTogZy5TdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogNzIwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBbaC5Qcm90b1ZpZGVvUXVhbGl0eS5NZWRpdW0zNjBwXTogewogICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBnLlN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAzNjAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2xhc3MgbmMgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuY3AgPSBpLCB0aGlzLk1tID0gZSwgdGhpcy5DbSA9IHMsIHRoaXMueW0gPSBuLCB0aGlzLnJUID0gITEsIHRoaXMuaFQgPSAhMCwgdGhpcy5hVCgpLCB0aGlzLm9UKCksIHRoaXMuY1QoKSwgdGhpcy51VCA9IG5ldyBlYyh0aGlzLmNwLnBsYXliYWNrTW9kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhtKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBzdHJlYW1Gb3JtYXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVULnN0cmVhbUZvcm1hdFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwbGF5KHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmICh0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgeyBwYXlsb2FkOiB7IHBsYXliYWNrOiAhMCB9IH0pLCB0aGlzLnVULnN0cmVhbUZvcm1hdCA9IFpvLlVzZXJJbml0aWF0ZWQpLCB0aGlzLmxULnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2UodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5Vc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyBwbGF5YmFjazogITEgfSB9KSwgdGhpcy5sVC5wYXVzZSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VmlkZW8odCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQuc2V0VmlkZW9RdWV1ZSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2hvdyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5zaG93KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoaWRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxULmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlzSGlkZGVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sVC5nZXRDdXJyZW50U3RhdGUoKSA9PT0geS5IaWRkZW5TdGF0ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW50ZXJGdWxsc2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV1ID0gITAsIHRoaXMuZFQuZXhwYW5kKCksIHRoaXMubFQub25GdWxsU2NyZWVuQ2hhbmdlKCEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdEZ1bGxzY3JlZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXUgPSAhMSwgdGhpcy5kVC5jb2xsYXBzZSgpLCB0aGlzLmxULm9uRnVsbFNjcmVlbkNoYW5nZSghMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc2l6ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZFQub25SZXNpemUodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB3aWR0aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua0Mud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBoZWlnaHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmtDLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHZvbHVtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua0Mudm9sdW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgdm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rQy52b2x1bWUgPSB0LCB0aGlzLmRULnVwZGF0ZVZvbHVtZSh0KSwgdGhpcy51VC5pc011dGVkID0gdCA8PSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50VmlkZW9EYXRhKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuakMuZ2V0Q3VycmVudFZpZGVvRGF0YSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VmlkZW9EYXRhKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuakMuZ2V0VmlkZW9EYXRhKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNJb3NGdWxsc2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5rQy5pc0lvc0Z1bGxzY3JlZW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBpc0lvc0Z1bGxzY3JlZW4odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLmlzSW9zRnVsbHNjcmVlbiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjdXJyZW50VGltZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua0MuY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua0MuZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3dDYXB0aW9ucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rQy5zaG93Q2FwdGlvbnMoKSwgdGhpcy5kVC50b2dnbGVDYXB0aW9uU3RhdGUoITApLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ2FwdGlvbk9uXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGVDYXB0aW9ucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rQy5oaWRlQ2FwdGlvbnMoKSwgdGhpcy5kVC50b2dnbGVDYXB0aW9uU3RhdGUoITEpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ2FwdGlvbk9mZl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0b2dnbGVFeHBhbmRCdXR0b24odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRULnRvZ2dsZUV4cGFuZEJ1dHRvbkRpc3BsYXkodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFF1YWxpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qQy5nZXRDdXJyZW50VmlkZW9EYXRhKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGkuZ2V0Q2xvc2VzdFNvdXJjZVF1YWxpdHkodGhpcy5rQy5jdXJyZW50UXVhbGl0eVNldHRpbmdzLmhlaWdodCkudmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRRdWFsaXR5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qQy5nZXRDdXJyZW50VmlkZW9EYXRhKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkuZ2V0Q2xvc2VzdFNvdXJjZVF1YWxpdHkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLnNldFF1YWxpdHkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZS52aWRlb0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBnLlN0cmljdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRBdXRvUXVhbGl0eSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rQy5zZXRRdWFsaXR5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5rQy5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBnLkF1dG8KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVF1YWxpdGllcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuakMuZ2V0Q3VycmVudFZpZGVvRGF0YShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBpLmdldEF2YWlsYWJsZVF1YWxpdGllcygpLm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52aWRlb0hlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RvcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVCAmJiB0aGlzLmxULnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVzdW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxUICYmIHRoaXMubFQucmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29udGVudCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5leGl0Um9sbEJyZWFrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZFQuZGVzdHJveSgpLCB0aGlzLmpDLmRlc3Ryb3koKSwgdGhpcy5rQy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZUKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpDLmdldEN1cnJlbnRWaWRlb0RhdGEodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLnNldFNvdXJjZSh0KSwgdGhpcy5kVC51cGRhdGVDdXJyZW50VmlkZW8odCksIHRoaXMucFQodCwgdGhpcy5rQy5jdXJyZW50UXVhbGl0eVNldHRpbmdzKSwgdGhpcy5jcC5jbG9zZWRDYXB0aW9uRGVmYXVsdCA/IHRoaXMuc2hvd0NhcHRpb25zKCkgOiB0aGlzLmhpZGVDYXB0aW9ucygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYlQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKEtvW0tvLlN0YXRlQ2hhbmdlZF0sIHRoaXMubFQsICh7cGF5bG9hZDogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZFQuY2hhbmdlU3RhdGUodCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBLlN0YXRlQ2hhbmdlZCwgeyBwYXlsb2FkOiB0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoS29bS28uQ29udGVudEVuZF0sIHRoaXMubFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudlQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKEtvW0tvLlZpZGVvUXVldWVkXSwgdGhpcy5sVCwgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEEuVmlkZW9RdWV1ZWQsIHsgcGF5bG9hZDogeyB2aWRlb0luZGV4OiB0IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUoeHRbeHQuUGxheV0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhUICYmIHRoaXMuY3AucGxheWJhY2tNb2RlID09PSBoLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bS5DbGlja1RvUGxheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNwLnNvdW5kTW9kZSA9PT0gaC5Qcm90b1BsYXllclNvdW5kTW9kZS5PbiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudm9sdW1lID0gdCwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIHsgcGF5bG9hZDogeyB2b2x1bWU6IHQgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaFQgPSAhMSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5Vc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyBwbGF5YmFjazogITAgfSB9KSwgdGhpcy5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5Wb2x1bWVdLCB0aGlzLmRULCAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLnZvbHVtZSA9IHQsIHRoaXMudVQuaXNNdXRlZCA9IHQgPD0gMCwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5Vc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyB2b2x1bWU6ICEwIH0gfSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5Wb2x1bWVdLCB7IHBheWxvYWQ6IHsgdm9sdW1lOiB0IH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5QYXVzZV0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBjLmIuVXNlckludGVyYWN0aW9uLCB7IHBheWxvYWQ6IHsgcGxheWJhY2s6ICExIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LlNlZWtdLCB0aGlzLmRULCAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDLmZvcmNlQ3VycmVudFRpbWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5TZWVraW5nU3RhcnRdLCB0aGlzLmRULCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxULnBhdXNlVG9nZ2xlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5TZWVraW5nU3RvcHBlZF0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQucGF1c2VUb2dnbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0Lk92ZXJsYXlDbGlja10sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuakMuZ2V0Q3VycmVudFZpZGVvRGF0YSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuaCkodC5jbGlja1VybCkgJiYgKHRoaXMuY3AuZGlzYWJsZUNsaWNrVXJsIHx8ICh0aGlzLk1tLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2Uuc2V0VmlkZW9UaW1lKHRoaXMua0MuY3VycmVudFRpbWUpLCB0aGlzLk1tLnNlcnZpY2VzLkdsb2JhbERvbVV0aWxzU2VydmljZS5vcGVuKHRoaXMuTW0uc2VydmljZXMuTWFjcm9zU2VydmljZS5zZXR1cE1hY3Jvcyh0LmNsaWNrVXJsKSwga3QuYy5CbGFuaykpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLkdlbmVyYWxVc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyB0eXBlOiBoLlByb3RvTWVkaWFDbGlja1R5cGVFbnVtLlVybENsaWNrIH0gfSkpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuT3ZlcmxheUNsaWNrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkV4cGFuZF0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5FeHBhbmRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNvbGxhcHNlXSwgdGhpcy5kVCwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkNvbGxhcHNlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5RdWFsaXR5XSwgdGhpcy5kVCwgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rQy5zZXRRdWFsaXR5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuQ2xvc2VdLCB0aGlzLmRULCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2s6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Z1bGxzY3JlZW5DbG9zZTogdGhpcy51dQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ2xvc2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNhcHRpb25Pbl0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NhcHRpb25zKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5DYXB0aW9uT2ZmXSwgdGhpcy5kVCwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlQ2FwdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNhcHRpb25Pbl0sIHRoaXMua0MsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZFQudG9nZ2xlQ2FwdGlvblN0YXRlKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNhcHRpb25PZmZdLCB0aGlzLmtDLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRULnRvZ2dsZUNhcHRpb25TdGF0ZSghMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5DYXB0aW9uVXBkYXRlXSwgdGhpcy5rQywgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kVC51cGRhdGVDYXB0aW9ucyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKGMuYi5Vc2VySW50ZXJhY3Rpb24sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFtjLmIuVXNlckludGVyYWN0aW9uXSwgeyBwYXlsb2FkOiB7IHZpZGVvSW5kZXg6IHRoaXMuakMuY3VycmVudFZpZGVvSW5kZXggfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMucmVsYXkoYy5iLkdlbmVyYWxVc2VySW50ZXJhY3Rpb24sIHRoaXMuZFQsIHRoaXMsIHRoaXMubWVkaWF0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLQyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAodGhpcy5qQy5nZXRDdXJyZW50VmlkZW9EYXRhKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nVCh0KSwgdGhpcy5kVC51cGRhdGVDdXJyZW50VmlkZW8odCksIHRoaXMucFQodCwgdGhpcy5rQy5jdXJyZW50UXVhbGl0eVNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuZFQudXBkYXRlQ2FwdGlvbnMoKSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBPLk5ld1ZpZGVvLCB7IHBheWxvYWQ6IHsgdmlkZW9JbmRleDogdGhpcy5qQy5jdXJyZW50VmlkZW9JbmRleCB9IH0pLCB0aGlzLnJUID0gITEsIHRoaXMueVQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWG0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubVQoKSwgdGhpcy53VCgpLCB0aGlzLk9UKCksIHRoaXMueFQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgU1QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dvUG9zaXRpb246IHRoaXMuY3AubG9nb1Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb1VybDogdGhpcy5jcC5sb2dvVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHRoaXMuTW0uY29uZmlnLmlzTW9iaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzVXBOZXh0OiB0aGlzLmNwLnVwTmV4dE1vZGUgPT09IE0uUHJvdG9QbGF5ZXJVcE5leHRNb2RlLk5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbnRDb2xvcjogdGhpcy5jcC5hY2NlbnRDb2xvciB8fCBkLmwuQ29ubmF0aXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uc0NvbG9yOiB0aGlzLmNwLmljb25zQ29sb3IgfHwgZC5sLkljb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcEJhY2tncm91bmRDb2xvcjogdGhpcy5jcC50b29sdGlwQmFja2dyb3VuZENvbG9yIHx8IGQubC5Db25uYXRpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0Q29sb3I6IHRoaXMuY3AudG9vbHRpcFRleHRDb2xvciB8fCBkLmwuSWNvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbk1vZGU6IHRoaXMuY3AuY2xvc2VCdXR0b25Nb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGU6IHRoaXMuY3AuZmxvYXRpbmdTZXR0aW5ncy5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VCdXR0b246IHRoaXMuY3AuaXNDbG9zZUJ1dHRvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29tcG9uZW50c1Zpc2liaWxpdHk6IHRoaXMuY3AudWlDb21wb25lbnRzVmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdEZXN0aW5hdGlvbnM6IHRoaXMuY3Auc2hhcmluZ0Rlc3RpbmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZENhcHRpb25EZWZhdWx0OiB0aGlzLmNwLmNsb3NlZENhcHRpb25EZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzRGlzcGxheUNvbnRyb2xzOiB0aGlzLmNwLmFsd2F5c0Rpc3BsYXlDb250cm9scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLk1tLmNvbmZpZy5vcy5vcwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyOiB0aGlzLk1tLmNvbmZpZy5icm93c2VyLmJyb3dzZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zOiB0aGlzLk1tLmNvbmZpZy5vcy5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc1ZlcnNpb246IHRoaXMuTW0uY29uZmlnLm9zLm9zVmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IHRoaXMuY3Auc291bmRNb2RlID09PSBoLlByb3RvUGxheWVyU291bmRNb2RlLk9uICYmIHRoaXMuY3AucGxheWJhY2tNb2RlICE9PSBoLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bS5DbGlja1RvUGxheSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpUID0gc2NbdGhpcy5jcC52aWRlb1F1YWxpdHldLCB0aGlzLmtUKHQsIGkpLCB0aGlzLnN1YnNjcmliZSh4LkxvYWRlZCwgdGhpcy5rQywgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5TGlzdDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb01ldGE6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qQy5zZXRBdmFpbGFibGVRdWFsaXRpZXNGb3JTb3VyY2VNZXRhKGksIHQucXVhbGl0eUxpc3QpLCB0aGlzLmRULnVwZGF0ZUN1cnJlbnRWaWRlbyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKE8uQnVmZmVyaW5nLCB0aGlzLmtDLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxULm9uRW50ZXJCdWZmZXJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKE8uQnVmZmVyZWQsIHRoaXMua0MsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQub25FeGl0QnVmZmVyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwVCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmdldEF2YWlsYWJsZVF1YWxpdGllcygpOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobC5oKShlKSAmJiB0aGlzLmRULnVwZGF0ZVF1YWxpdHkodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NbS5zZXJ2aWNlcy5NYWNyb3NTZXJ2aWNlLnNldFZpZGVvRHVyYXRpb24odC5kdXJhdGlvbiksIHRoaXMuTW0uc2VydmljZXMuTWFjcm9zU2VydmljZS5zZXRWaWRlb1RpdGxlKHQudGl0bGUpLCB0aGlzLk1tLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2Uuc2V0VmlkZW9EZXNjcmlwdGlvbih0LmRlc2NyaXB0aW9uKSwgdGhpcy5NbS5zZXJ2aWNlcy5NYWNyb3NTZXJ2aWNlLnNldFZpZGVvVXJsKHQuY2xpY2tVcmwpLCB0aGlzLk1tLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2Uuc2V0VmlkZW9JZCh0LmlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb1QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuakMgPSBuZXcgaWModGhpcy5jcC5wbGF5bGlzdCksIDEgPT09IHRoaXMuakMubGVuZ3RoICYmIHRoaXMuZFQudG9nZ2xlUGxheWxpc3RDb250cm9scyghMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFUKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5TVCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9UKHQpLCB0aGlzLmRULnVwZGF0ZVZvbHVtZSh0aGlzLmNwLnNvdW5kTW9kZSA9PT0gaC5Qcm90b1BsYXllclNvdW5kTW9kZS5PbiA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd1QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXkoTy5QbGF5RXJyb3IsIHRoaXMua0MsIHRoaXMsIHRoaXMubWVkaWF0b3IpLCB0aGlzLnN1YnNjcmliZShPLk5ld1ZpZGVvLCB0aGlzLmtDLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLktDKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmUobS5UaW1ldXBkYXRlLCB0aGlzLmtDLCAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRULnVwZGF0ZUR1cmF0aW9uKHRoaXMua0MuY3VycmVudFRpbWUsIHRoaXMua0MuZHVyYXRpb24pLCB0aGlzLk1tLnNlcnZpY2VzLk1hY3Jvc1NlcnZpY2Uuc2V0VmlkZW9UaW1lKHRoaXMua0MuY3VycmVudFRpbWUpLCAhdGhpcy5yVCAmJiB0ICYmICh0aGlzLnJUID0gITAsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBLkZpcnN0RnJhbWVQbGF5ZWQpKSwgdGhpcy5rQy5jdXJyZW50VGltZSAhPT0gdGhpcy5BVCAmJiB0aGlzLklUKHQpLCB0aGlzLkFUID0gdGhpcy5rQy5jdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKG0uRW5kZWQsIHRoaXMua0MsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQuaGFuZGxlVmlkZW9FbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhUKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZSh4LkN1cnJlbnRRdWFsaXR5LCB0aGlzLmtDLCAoe3BheWxvYWQ6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpDLmdldEN1cnJlbnRWaWRlb0RhdGEoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wVChpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeC5DaGFuZ2UsIHRoaXMua0MsICh7cGF5bG9hZDogdH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuakMuZ2V0Q3VycmVudFZpZGVvRGF0YShpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gaS5nZXRBdmFpbGFibGVRdWFsaXRpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KGwuaCkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGkuZ2V0Q2xvc2VzdFNvdXJjZVF1YWxpdHkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMualQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiBnLlN0cmljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZS52aWRlb0hlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeC5DaGFuZ2UsIHsgcGF5bG9hZDogZS52aWRlb0hlaWdodCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHJjID0gZSgxMTIpLCBoYyA9IGUubihyYyk7CiAgICAgICAgICAgICAgICBjbGFzcyBhYyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSB0LCB0aGlzLkNUID0gaSwgdGhpcy5sb2dvR2VuZXJhbFBvc2l0aW9uID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuVG9wTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5Ub3BSaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuQm90dG9tUmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IFtNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5DZW50ZXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGJhcjogW00uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkNvbnRyb2xCYXJdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuVFQgPSAodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKCkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGNueCBjbGFzcz0iY254LXVpLWJ0biAkeyBpIH0iPltbJHsgdCB9XV08L2NueD5gOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRMb2dvVGVtcGxhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pbmRleE9mKHRoaXMuc2V0dGluZ3MubG9nb1Bvc2l0aW9uKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5sb2dvUG9zaXRpb24gPT09IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkNvbnRyb2xCYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8Y254IGNsYXNzPSJjbngtdWktYnRuIGNueC1kLXNtLW5vbmUgY254LWQtbWQtbm9uZSBjbngtaGlkZS1vbi12b2x1bWUtaG92ZXIiPltbJHsgcWkuTG9nb0NvbXBvbmVudCB9XV08L2NueD5gOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCExID09PSB0aGlzLkNUIHx8IHRoaXMuc2V0dGluZ3MubG9nb1Bvc2l0aW9uICE9PSBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5Cb3R0b21MZWZ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGNueCBjbGFzcz0iY254LWxvZ28tYmFyIj5bWyR7IHFpLkxvZ29Db21wb25lbnQgfV1dPC9jbng+YDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjYXN0QnV0dG9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51aUNvbXBvbmVudHNWaXNpYmlsaXR5LmNhc3RpbmcgPyB0aGlzLlRUKHFpLkNhc3RCdXR0b24pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBzaGFyZUJ1dHRvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmgpKHRoaXMuc2V0dGluZ3Muc2hhcmluZ0Rlc3RpbmF0aW9ucykgPyB0aGlzLlRUKHFpLlNoYXJlQnV0dG9uKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmRCdXR0b24odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISh0aGlzLnNldHRpbmdzLmlzSW5BcHAgJiYgdGhpcy5zZXR0aW5ncy5vcyA9PT0gU3QuYi5BbmRyb2lkKSAmJiB0aGlzLnNldHRpbmdzLnVpQ29tcG9uZW50c1Zpc2liaWxpdHkuZXhwYW5kQnV0dG9uID8gdGhpcy5UVChxaS5FeHBhbmRCdXR0b24sIHQpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzQnV0dG9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pc0luQXBwID8gJycgOiBgPGNueCBjbGFzcz0iY254LXVpLWJ0biBjbngtZC1tZC1ub25lIj5bWyR7IHFpLlNldHRpbmdzQnV0dG9uIH1dXTwvY254PmA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBtdXRlV2F0ZXJtYXJrKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy51aUNvbXBvbmVudHNWaXNpYmlsaXR5Lm11dGVXYXRlcm1hcmsgJiYgdGhpcy5zZXR0aW5ncy5sb2dvUG9zaXRpb24gIT09IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbUxlZnQgPyBoYy5hIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjbG9zZUJ1dHRvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuaXNDbG9zZUJ1dHRvbiA/IGA8Y254IGNsYXNzPSJjbngtdWktYnRuIGNueC1jbG9zZS1idXR0b24iPltbJHsgcWkuQ2xvc2VCdXR0b24gfV1dPC9jbng+YCA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdXBOZXh0Qm94KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5oYXNVcE5leHQgPyBgW1skeyBxaS5VcE5leHRCb3ggfV1dYCA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgbGl2ZVBvc3RlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1QgPyBgW1skeyBxaS5MaXZlUG9zdGVyIH1dXWAgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TG9nb1Bvc2l0aW9uQ2xhc3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuVG9wUmlnaHQgJiYgdGhpcy5zZXR0aW5ncy5jbG9zZUJ1dHRvbk1vZGUgPyAnJyA6IHRoaXMuc2V0dGluZ3MubG9nb1Bvc2l0aW9uID09PSB0ID8gJ2xvZ28tcmlnaHQnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlzQWx3YXlzT24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLmNsb3NlQnV0dG9uTW9kZSA9PT0gaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5BbHdheXNPbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGRlc2t0b3BUZW1wbGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1ncmFkaWVudC10b3AiPjwvY254PlxuICAgICAgICAgICAgW1skeyBxaS5RdWVTdGF0ZU92ZXJsYXkgfV1dXG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktaGVhZCBjbngtZC1zbS1ub25lIGNueC11aS1iYXIgY254LWxvY2stYmFyLW9uLWhvdmVyICR7IHRoaXMuZ2V0TG9nb1Bvc2l0aW9uQ2xhc3MoTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuVG9wUmlnaHQpIH0iPlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1oZWFkLWJ1dHRvbnMiPlxuICAgICAgICAgICAgICAgICAgICAkeyB0aGlzLmNhc3RCdXR0b24gfVxuICAgICAgICAgICAgICAgICAgICAkeyB0aGlzLnNoYXJlQnV0dG9uIH1cbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5jbG9zZUJ1dHRvbiB9XG4gICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICAgICAgJHsgdGhpcy5nZXRMb2dvVGVtcGxhdGUodGhpcy5sb2dvR2VuZXJhbFBvc2l0aW9uLnRvcCkgfVxuICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktc3BhY2VyIGNueC1kLXNtLW5vbmUiPjwvY254PlxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWNvbnRlbnQgY254LXVpLWJhciBjbngtY2VudGVyLWFsaWduIj48Y254IGNsYXNzPSJjbngtdWktYnRuIj5bWyR7IHFpLkJpZ1BsYXlCdXR0b24gfV1dPC9jbng+PC9jbng+XG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktc3BhY2VyIGNueC1kLXNtLW5vbmUiPjwvY254PlxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWNvbnRlbnQgY254LXVpLWJhciBjbngtZC1zbS1ub25lICR7IHRoaXMuZ2V0TG9nb1Bvc2l0aW9uQ2xhc3MoTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuQm90dG9tUmlnaHQpIH0iPlxuICAgICAgICAgICAgICAgICR7IHRoaXMubXV0ZVdhdGVybWFyayB9XG4gICAgICAgICAgICAgICAgJHsgdGhpcy51cE5leHRCb3ggfVxuICAgICAgICAgICAgICAgICR7IHRoaXMuZ2V0TG9nb1RlbXBsYXRlKHRoaXMubG9nb0dlbmVyYWxQb3NpdGlvbi5ib3R0b20pIH1cbiAgICAgICAgICAgICAgICBbWyR7IHFpLkNhcHRpb25Db21wb25lbnQgfV1dXG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1wcm9ncmVzcyBjbngtdWktYmFyIGNueC1kLXNtLW5vbmUiPlxuICAgICAgICAgICAgICAgICR7IHRoaXMuYmVmb3JlUHJvZ3Jlc3NCYXJMYWJlbCB9XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLXByb2dyZXNzLWJhciI+W1skeyBxaS5Qcm9ncmVzc0JhciB9XV08L2NueD5cbiAgICAgICAgICAgICAgICAkeyB0aGlzLmFmdGVyUHJvZ3Jlc3NCYXJMYWJlbCB9XG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idXR0b25zIGNueC11aS1iYXIgY254LWxvY2stYmFyLW9uLWhvdmVyIj5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktYnRuIGNueC1oaWRlLW9uLXNpbmdsZS12aWRlbyI+W1skeyBxaS5QcmV2aW91c0J1dHRvbiB9XV08L2NueD5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktYnRuIj5bWyR7IHFpLlBsYXlCdXR0b24gfV1dPC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWJ0biBjbngtaGlkZS1vbi1zaW5nbGUtdmlkZW8iPltbJHsgcWkuVXBOZXh0QnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1kLXNtLW5vbmUgY254LWQtbWQtbm9uZSI+W1skeyBxaS5Wb2x1bWVDb250cm9scyB9XV08L2NueD5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktYnRuIGNueC1kLXNtLW5vbmUgY254LWQtbGctbm9uZSBjbngtZC14bC1ub25lIj5bWyR7IHFpLlZvbHVtZUJ1dHRvbiB9XV08L2NueD5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktc3BhY2VyIGNueC1kLXNtLW5vbmUiPjwvY254PlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idG4gY254LWQtc20tbm9uZSBjbngtZC1tZC1ub25lIGNueC1oaWRlLW9uLXZvbHVtZS1ob3ZlciI+W1skeyBxaS5DYXB0aW9uQnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgICR7IHRoaXMuc2V0dGluZ3NCdXR0b24oKSB9XG4gICAgICAgICAgICAgICAgJHsgdGhpcy5leHBhbmRCdXR0b24oJ2NueC1kLXNtLW5vbmUgY254LWhpZGUtb24tdm9sdW1lLWhvdmVyJykgfVxuICAgICAgICAgICAgICAgICR7IHRoaXMuZ2V0TG9nb1RlbXBsYXRlKHRoaXMubG9nb0dlbmVyYWxQb3NpdGlvbi5jb250cm9sYmFyKSB9XG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1ncmFkaWVudC1ib3R0b20iPjwvY254PlxuICAgIGAudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgbW9iaWxlVGVtcGxhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICBbWyR7IHFpLlF1ZVN0YXRlT3ZlcmxheSB9XV1cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1oZWFkIGNueC1kLXNtLW5vbmUgY254LXVpLWJhciAkeyB0aGlzLmdldExvZ29Qb3NpdGlvbkNsYXNzKE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLlRvcFJpZ2h0KSB9Ij5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktaGVhZC1idXR0b25zIj5cbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5jYXN0QnV0dG9uIH1cbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5zaGFyZUJ1dHRvbiB9XG4gICAgICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idG4gJHsgZC5nLkNvbnRleHRDb250cm9sbGVyIH0iPltbJHsgcWkuTW9yZUJ1dHRvbiB9XV08L2NueD5cbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5jbG9zZUJ1dHRvbiB9XG4gICAgICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICAgICAgJHsgdGhpcy5nZXRMb2dvVGVtcGxhdGUodGhpcy5sb2dvR2VuZXJhbFBvc2l0aW9uLnRvcCkgfVxuICAgICAgICAgICAgPC9jbng+XG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktc3BhY2VyIGNueC1kLXNtLW5vbmUiPjwvY254PlxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWNvbnRlbnQgY254LXVpLWJhciBjbngtY2VudGVyLWFsaWduIj5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktYnRuIj5bWyR7IHFpLkJpZ1BsYXlCdXR0b24gfV1dPC9jbng+XG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1jb250ZW50LW1vYmlsZSBjbngtdWktYmFyIGNueC12ZXJ0aWNhbC1hbGlnbiI+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLXNwYWNlciI+PC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWJ0biBjbngtaGlkZS1vbi1zaW5nbGUtdmlkZW8iPltbJHsgcWkuUHJldmlvdXNCdXR0b24gfV1dPC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLXNwYWNlciI+PC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWJ0biI+W1skeyBxaS5QbGF5QnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1zcGFjZXIiPjwvY254PlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idG4gY254LWhpZGUtb24tc2luZ2xlLXZpZGVvIj5bWyR7IHFpLlVwTmV4dEJ1dHRvbiB9XV08L2NueD5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktc3BhY2VyIj48L2NueD5cbiAgICAgICAgICAgIDwvY254PlxuICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLXNwYWNlciBjbngtZC1zbS1ub25lIj48L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1jb250ZW50IGNueC11aS1iYXIgY254LWQtc20tbm9uZSI+XG4gICAgICAgICAgICAgICAgJHsgdGhpcy5tdXRlV2F0ZXJtYXJrIH1cbiAgICAgICAgICAgICAgICAkeyB0aGlzLnVwTmV4dEJveCB9XG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC1tb2JpbGUtY2FwdGlvbnMtYmFyIGNueC11aS1iYXIgIj5cbiAgICAgICAgICAgICAgICBbWyR7IHFpLkNhcHRpb25Db21wb25lbnQgfV1dXG4gICAgICAgICAgICA8L2NueD5cbiAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idXR0b25zIGNueC11aS1iYXIgY254LWQtc20tbm9uZSAiPlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1idG4iPltbJHsgcWkuVm9sdW1lQnV0dG9uIH1dXTwvY254PlxuICAgICAgICAgICAgICAgIDxjbnggY2xhc3M9ImNueC11aS1wcm9ncmVzcy1iYXIiPltbJHsgcWkuUHJvZ3Jlc3NCYXIgfV1dPC9jbng+XG4gICAgICAgICAgICAgICAgPGNueCBjbGFzcz0iY254LXVpLWJ0biBjbngtZC1tZC1ub25lIGNueC1kLWxnLW5vbmUiPltbJHsgcWkuQ2FwdGlvbkJ1dHRvbiB9XV08L2NueD5cbiAgICAgICAgICAgICAgICAkeyB0aGlzLnNldHRpbmdzQnV0dG9uKCkgfVxuICAgICAgICAgICAgICAgICR7IHRoaXMuZXhwYW5kQnV0dG9uKCkgfVxuICAgICAgICAgICAgICAgICR7IHRoaXMuZ2V0TG9nb1RlbXBsYXRlKHRoaXMubG9nb0dlbmVyYWxQb3NpdGlvbi5jb250cm9sYmFyKSB9XG4gICAgICAgICAgICAgICAgJHsgdGhpcy5saXZlQm90dG9tTG9nb0lmTmVlZGVkIH1cbiAgICAgICAgICAgIDwvY254PlxuICAgICAgICBgLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5zZXR0aW5ncy5pc01vYmlsZSA/IGQuZy5Nb2JpbGUgOiAnJywgaSA9IHRoaXMuc2V0dGluZ3MuaXNNb2JpbGUgPyB0aGlzLm1vYmlsZVRlbXBsYXRlIDogdGhpcy5kZXNrdG9wVGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGNueCBjbGFzcz0iY254LXVpIGNueC11aS12aWRlbyAkeyB0aGlzLmlzTGl2ZUZsYWcgfSAkeyB0IH0iPlxuICAgICAgICAgICAgICAgICAgICAkeyB0aGlzLmxpdmVQb3N0ZXIgfVxuICAgICAgICAgICAgICAgICAgICAkeyBpIH1cbiAgICAgICAgICAgICAgICAgICAgW1skeyBxaS5RdWFsaXR5TWVudSB9XV1cbiAgICAgICAgICAgICAgICAgICAgW1skeyBxaS5Db250ZXh0TWVudSB9XV1cbiAgICAgICAgICAgICAgICAgICAgW1skeyBxaS5FbGVtZW50c1NldHRpbmdzTWVudSB9XV1cbiAgICAgICAgICAgICAgICAgICAgW1skeyBxaS5Mb2FkZXIgfV1dXG4gICAgICAgICAgICAgICAgPC9jbng+YC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBiZWZvcmVQcm9ncmVzc0JhckxhYmVsKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DVCA/IGBbWyR7IHFpLkxpdmVJY29uIH1dXWAgOiBgPGNueCBjbGFzcz0iY254LXVpLXByb2dyZXNzLWxhYmVsIGNueC1kLW1kLW5vbmUiPjxjbngtc3Bhbj5bWyR7IHFpLkVsYXBzZWRUaW1lTGFiZWwgfV1dPC9jbngtc3Bhbj48L2NueD5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgYWZ0ZXJQcm9ncmVzc0JhckxhYmVsKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DVCA/ICc8Y254IGNsYXNzPSJjbngtdWktcHJvZ3Jlc3MtbGFiZWwtbGl2ZSBjbngtZC1tZC1ub25lIj48L2NueD4nIDogYDxjbnggY2xhc3M9ImNueC11aS1wcm9ncmVzcy1sYWJlbCBjbngtZC1tZC1ub25lIj48Y254LXNwYW4+W1skeyBxaS5Ub3RhbER1cmF0aW9uTGFiZWwgfV1dPC9jbngtc3Bhbj48L2NueD5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgbGl2ZUJvdHRvbUxvZ29JZk5lZWRlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1QgJiYgdGhpcy5zZXR0aW5ncy5sb2dvUG9zaXRpb24gPT09IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbVJpZ2h0ID8gYDxjbnggY2xhc3M9ImNueC1saXZlLWJvdHRvbS1sb2dvIj5bWyR7IHFpLkxvZ29Db21wb25lbnQgfV1dPC9jbng+YCA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNMaXZlRmxhZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1QgPyAnY254LWxpdmUnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3Mgb2MgZXh0ZW5kcyBaaSB7CiAgICAgICAgICAgICAgICAgICAgb25DbGljaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0Lm1lZGlhdG9yLnB1Ymxpc2godGhpcy5jb250ZXh0LCB4dFt4dC5PdmVybGF5Q2xpY2tdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0U3RhdGUoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuc2hvd1VpQ29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5leGl0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBjYyBleHRlbmRzIGllIHsKICAgICAgICAgICAgICAgICAgICBvbkNsaWNrKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmluaXRTdGF0ZSgpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5kaXNhYmxlTW91c2VNb3ZlKCksIHRoaXMuY29udGV4dC5vdmVybGF5TW9kdWxlLmRpc2FibGVIb3ZlcigpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5yZW1vdmVPdmVybGF5Q2xpY2tFdmVudHMoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuc2hvd1VpQ29udHJvbHMoITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmV4aXRTdGF0ZSgpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5lbmFibGVNb3VzZU1vdmUoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuYWRkT3ZlcmxheUNsaWNrRXZlbnRzKCksIHRoaXMuY29udGV4dC5vdmVybGF5TW9kdWxlLmVuYWJsZUhvdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgdWMgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcigpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5oYiA9IGksIHRoaXMuUFQgPSBlLCB0aGlzLk1UID0gcywgdGhpcy5oYyA9IG4sIHRoaXMuUW4gPSByLCB0aGlzLkVUID0gITEsIHRoaXMuTFQgPSAzMDAwLCB0aGlzLlJUID0gITEsIHRoaXMuQlQgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tdG9wJyAhPT0gdC5wcm9wZXJ0eU5hbWUgJiYgJ21hcmdpbicgIT09IHQucHJvcGVydHlOYW1lICYmICdtYXJnaW4tYm90dG9tJyAhPT0gdC5wcm9wZXJ0eU5hbWUgfHwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlVJU2hvd1N0YXJ0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuRFQgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJnaW4tdG9wJyAhPT0gdC5wcm9wZXJ0eU5hbWUgJiYgJ21hcmdpbicgIT09IHQucHJvcGVydHlOYW1lICYmICdtYXJnaW4tYm90dG9tJyAhPT0gdC5wcm9wZXJ0eU5hbWUgfHwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlVJRW5kU2hvd0hpZGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5GVCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUFQgJiYgKHRoaXMuUFQuc2hvdygpLCBPYmplY3QoVC5pKSh0aGlzLmhiKSksIE9iamVjdChULnQpKHRoaXMuaGIsIGQuai5QYXVzZWQpIHx8IHRoaXMuc2hvd1VpQ29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5WVCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVVQodGhpcy5MVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuJFQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlFuICYmIHRoaXMuRVQgPyB0aGlzLnNob3dVaUNvbnRyb2xzKCkgOiB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuT3ZlcmxheUNsaWNrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuJHUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nID09PSB0LnByb3BlcnR5TmFtZSAmJiAodGhpcy5QVCAmJiB0aGlzLlBULmhpZGUoKSwgdGhpcy5oYi5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy4kdSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLk5UID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VWlDb250cm9scygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmFkZE92ZXJsYXlDbGlja0V2ZW50cyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoaHQuYVtodC5hLkNsaWNrXSwgdGhpcy5oYywgdGhpcy4kVCksIHRoaXMuc3Vic2NyaWJlKGh0LmFbaHQuYS5DbGlja10sIHRoaXMuaGMsIHRoaXMuJFQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnJlbW92ZU92ZXJsYXlDbGlja0V2ZW50cyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoaHQuYVtodC5hLkNsaWNrXSwgdGhpcy5oYywgdGhpcy4kVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZW5hYmxlTW91c2VNb3ZlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NVCB8fCB0aGlzLlFuIHx8IHRoaXMuaGIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5OVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGlzYWJsZU1vdXNlTW92ZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUW4gfHwgdGhpcy5oYi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLk5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5lbmFibGVIb3ZlciA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTVQgfHwgKHRoaXMuUW4gPyB0aGlzLmhiLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLkZULCB7IHBhc3NpdmU6ICEwIH0pIDogKHRoaXMuaGIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMuRlQpLCB0aGlzLmhiLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLlZUKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmRpc2FibGVIb3ZlciA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUW4gPyB0aGlzLmhiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLkZUKSA6ICh0aGlzLmhiLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLkZUKSwgdGhpcy5oYi5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5WVCkpLCBjbGVhclRpbWVvdXQodGhpcy5IVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMuRFQpLCBpLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25zdGFydCcsIHRoaXMuQlQpLCB0aGlzLlFuIHx8IHRoaXMucVQoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnY254LWxvY2stYmFyLW9uLWhvdmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChsLmMpKGkpLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51aVN0aWNreSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVpU3RpY2t5ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFVUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuSFQpLCB0aGlzLkhUID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVVaUNvbnRyb2xzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzaG93VWlDb250cm9scyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgIXRoaXMuTVQgJiYgdGhpcy5VVCh0aGlzLkxUKSwgdGhpcy5RbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChULnQpKHRoaXMuaGIsIGQuZy5TaG93Q29udHJvbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5FVCA9ICF0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICEwICE9PSB0aGlzLnpUICYmICh0aGlzLnpUID0gITAsIHRoaXMuaGIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMuJHUpLCBPYmplY3QoVC5hKSh0aGlzLmhiLCBkLmcuU2hvd0NvbnRyb2xzKSwgdGhpcy5QVCAmJiB0aGlzLlBULnNob3coKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGVVaUNvbnRyb2xzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdGhpcy56VCB8fCB0aGlzLlJUIHx8ICh0aGlzLnpUID0gITEsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5VSUhpZGVTdGFydF0pLCB0aGlzLlBUICYmIHRoaXMuaGIuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMuJHUpLCBPYmplY3QoVC5JKSh0aGlzLmhiLCBkLmcuU2hvd0NvbnRyb2xzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhjLnJlZ2lzdGVyKHRoaXMuaGIsIHRoaXMsIHRoaXMuaGMpLCB0aGlzLnJlbGF5KGh0LmFbaHQuYS5TY3JvbGxdLCB0aGlzLmhjLCB0aGlzLCB0aGlzLm1lZGlhdG9yKSwgdGhpcy5lbmFibGVIb3ZlcigpLCB0aGlzLmFkZE92ZXJsYXlDbGlja0V2ZW50cygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVIb3ZlcigpLCB0aGlzLmRpc2FibGVNb3VzZU1vdmUoKSwgdGhpcy51bnN1YnNjcmliZUFsbCh0aGlzLmhjKSwgdGhpcy5oYy51bnJlZ2lzdGVyQWxsKHRoaXMpLCBjbGVhclRpbWVvdXQodGhpcy5IVCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCB1aVN0aWNreSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUlQgPSB0LCAhMSAhPT0gdCB8fCB0aGlzLk1UIHx8IHRoaXMuVVQodGhpcy5MVCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgbGMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5XVCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV1QuZmlsdGVyKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5zdGFuY2UgIT09IGkuaW5zdGFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLldULmZpbmQoKHtuYW1lOiBpfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBRVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCgoe2luc3RhbmNlOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5pc09wZW4gJiYgdC5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlQ29udGV4dE1lbnUodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLkpUKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5pbnN0YW5jZS5pc09wZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pbnN0YW5jZS5jbG9zZSgpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb29yZGluYXRlczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZFBhdXNlOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IGksIG4gPSB0IHx8IGUuaW5zdGFuY2UuZ2V0QW5jaG9yQ29vcmRpbmF0ZXNUbyhlLmxpbmtlZENvbXBvbmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pbnN0YW5jZS5vcGVuKG4sIHMpLCB0aGlzLlFUKHRoaXMuR1QoZSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0FueUNvbnRleHRNZW51T3BlbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5XVC5maW5kKCh7aW5zdGFuY2U6IHR9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pc09wZW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjbG9zZUNvbnRleHRNZW51KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuSlQodCkuaW5zdGFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuaXNPcGVuICYmIGkuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2xvc2VBbGxDb250ZXh0TWVudXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUVQodGhpcy5XVCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgZGMgZXh0ZW5kcyBIaSB7CiAgICAgICAgICAgICAgICAgICAgb25DbGljaygpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJHVpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoZC5qLkxvYWRpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5Mb2FkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC4kdWlDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShkLmouTG9hZGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLkxvYWRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgZmMgZXh0ZW5kcyBjYyB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0U3RhdGUoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuaGlkZVVpQ29udHJvbHMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5leGl0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBwYyBleHRlbmRzIEhpIHsKICAgICAgICAgICAgICAgICAgICBvbkNsaWNrKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbml0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULnUpKHRoaXMuY29udGV4dC4kdWlDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULk8pKHRoaXMuY29udGV4dC4kdWlDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGJjIGV4dGVuZHMgSGkgewogICAgICAgICAgICAgICAgICAgIG9uQ2xpY2soKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluaXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LiR1aUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKGQuai5QcmVyb2xsKSwgdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5RdWVTdGF0ZU92ZXJsYXkpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuVXBOZXh0Qm94KTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJHVpQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoZC5qLlByZXJvbGwpLCB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLlF1ZVN0YXRlT3ZlcmxheSkuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHZjIGV4dGVuZHMgbGUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgaCwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBzLCBpLCBuLCBuZXcgY24oaSwgZSwgcywgciwgYSkpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy5nbG9iYWxEb21VdGlsc1NlcnZpY2UgPSBpLCB0aGlzLmludGVyYWN0aW9uU2VydmljZSA9IGUsIHRoaXMuJGNvbnRhaW5lciA9IHMsIHRoaXMuc2V0dGluZ3MgPSByLCB0aGlzLmFwcElkID0gaCwgdGhpcy5yYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBsYXlpbmdTdGF0ZV06IG5ldyBvYyh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBhdXNlZFN0YXRlXTogbmV3IGNjKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3kuQnVmZmVyaW5nU3RhdGVdOiBuZXcgZGModGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeS5TdG9wcGVkU3RhdGVdOiBuZXcgZmModGhpcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeS5IaWRkZW5TdGF0ZV06IG5ldyBwYyh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlByZXJvbGxTdGF0ZV06IG5ldyBiYyh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LlBvc3Ryb2xsU3RhdGVdOiBuZXcgYmModGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5idCA9IDAsIHRoaXMuWFQgPSBudWxsLCB0aGlzLllUID0gMjAwMCwgdGhpcy5LVCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMueW0gPT09IGQuci5TbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5wcmV2ZW50RGVmYXVsdCgpLCAhdGhpcy5nZXRDb21wb25lbnQocWkuQ29udGV4dE1lbnUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLlhUKSwgdGhpcy5aVC5jbG9zZUFsbENvbnRleHRNZW51cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb29yZGluYXRlczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRYOiB0LnBhZ2VYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRZOiB0LnBhZ2VZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWlQudG9nZ2xlQ29udGV4dE1lbnUocWkuQ29udGV4dE1lbnUsIGkpLCB0aGlzLlhUID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aVC5jbG9zZUNvbnRleHRNZW51KHFpLkNvbnRleHRNZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuWVQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnRQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PYi5kaXNhYmxlVG9vbHRpcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5pUCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuT2IuZW5hYmxlVG9vbHRpcHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy4kVCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWlQuaXNBbnlDb250ZXh0TWVudU9wZW4oKSA/IHRoaXMuWlQuY2xvc2VBbGxDb250ZXh0TWVudXMoKSA6IHRoaXMuY3VycmVudFN0YXRlLm9uQ2xpY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5lUCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWlQuY2xvc2VBbGxDb250ZXh0TWVudXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5zUCA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnltID0gYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgblAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBgaWRfJHsgdGhpcy5hcHBJZCB9YDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kdWlDb250YWluZXIuaWQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gYFxuICAgICAgICAgICAgIyR7IHQgfSAuJHsgZC5mLkljb25zIH0ge1xuICAgICAgICAgICAgICAgIGZpbGw6ICR7IHRoaXMuc2V0dGluZ3MuaWNvbnNDb2xvciB9O1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7IHRoaXMuc2V0dGluZ3MuaWNvbnNDb2xvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIyR7IHQgfSAuJHsgZC5mLkFjY2VudENvbG9yIH0ge1xuICAgICAgICAgICAgICAgIGZpbGw6ICR7IHRoaXMuc2V0dGluZ3MuYWNjZW50Q29sb3IgfTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyB0aGlzLnNldHRpbmdzLmFjY2VudENvbG9yIH07XG4gICAgICAgICAgICAgICAgY29sb3I6ICR7IHRoaXMuc2V0dGluZ3MuYWNjZW50Q29sb3IgfTtcbiAgICAgICAgICAgICAgICBzdHJva2U6ICR7IHRoaXMuc2V0dGluZ3MuYWNjZW50Q29sb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICMkeyB0IH0gc3ZnLiR7IGQuZi5BY2NlbnRDb2xvciB9IHtcbiAgICAgICAgICAgICAgICBmaWxsOiAkeyB0aGlzLnNldHRpbmdzLmFjY2VudENvbG9yIH0haW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7IHRoaXMuc2V0dGluZ3MuYWNjZW50Q29sb3IgfTtcbiAgICAgICAgICAgICAgICBjb2xvcjogJHsgdGhpcy5zZXR0aW5ncy5hY2NlbnRDb2xvciB9O1xuICAgICAgICAgICAgICAgIHN0cm9rZTogJHsgdGhpcy5zZXR0aW5ncy5hY2NlbnRDb2xvciB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIyR7IHQgfSAuJHsgZC5mLlRvb2x0aXBUZXh0IH0ge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAkeyB0aGlzLnNldHRpbmdzLnRvb2x0aXBUZXh0Q29sb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICMkeyB0IH0gLiR7IGQuZi5Ub29sdGlwQmFja2dyb3VuZCB9IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkeyB0aGlzLnNldHRpbmdzLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBrZXlmcmFtZXMgJHsgdCB9LWJhciB7XG4gICAgICAgICAgICAgICAgMSUge1xuICAgICAgICAgICAgICAgICAgZmlsbDogdHJhbnNwYXJlbnQ7IHRyYW5zZm9ybTogc2NhbGVZKDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDMwJSB7ZmlsbDogJHsgdGhpcy5zZXR0aW5ncy5hY2NlbnRDb2xvciB9OyB0cmFuc2Zvcm06IHNjYWxlWSgxLjEpfVxuICAgICAgICAgICAgICAgIDYwJSB7ZmlsbDogdHJhbnNwYXJlbnQ7IHRyYW5zZm9ybTogc2NhbGVZKDEpfVxuICAgICAgICAgICAgICAgIDEwMCUge2ZpbGw6IHRyYW5zcGFyZW50OyB0cmFuc2Zvcm06IHNjYWxlWSgxKX1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgIyR7IHQgfSAuY254LXVpLWxvYWRlciBwb2x5Z29uIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24tbmFtZTogJHsgdCB9LWJhcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgYC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2xvYmFsRG9tVXRpbHNTZXJ2aWNlLmFkZENzc1N0cmluZyhpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgclAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBbXSwgaSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLkVsZW1lbnRzU2V0dGluZ3NNZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiB0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZWRDb21wb25lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KHFpLk1vcmVCdXR0b24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcWkuRWxlbWVudHNTZXR0aW5nc01lbnUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLmdldENvbXBvbmVudChxaS5RdWFsaXR5TWVudSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VkQ29tcG9uZW50OiB0aGlzLmdldENvbXBvbmVudChxaS5TZXR0aW5nc0J1dHRvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBxaS5RdWFsaXR5TWVudQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLkNvbnRleHRNZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiB0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBxaS5Db250ZXh0TWVudQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5aVCA9IG5ldyBsYyh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaFAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheU1vZHVsZSA9IG5ldyB1Yyh0aGlzLCB0aGlzLiR1aUNvbnRhaW5lciwgdGhpcy5nZXRDb21wb25lbnQocWkuUHJvZ3Jlc3NCYXIpLCB0aGlzLnNldHRpbmdzLmFsd2F5c0Rpc3BsYXlDb250cm9scywgdGhpcy5pbnRlcmFjdGlvblNlcnZpY2UsIHRoaXMuc2V0dGluZ3MuaXNNb2JpbGUpLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5PdmVybGF5Q2xpY2tdLCB0aGlzLm92ZXJsYXlNb2R1bGUsIHRoaXMuJFQpLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5VSUhpZGVTdGFydF0sIHRoaXMub3ZlcmxheU1vZHVsZSwgdGhpcy5lUCksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LlVJU2hvd1N0YXJ0XSwgdGhpcy5vdmVybGF5TW9kdWxlLCB0aGlzLnRQKSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuVUlFbmRTaG93SGlkZV0sIHRoaXMub3ZlcmxheU1vZHVsZSwgdGhpcy5pUCksIHRoaXMuc3Vic2NyaWJlKGh0LmFbaHQuYS5TY3JvbGxdLCB0aGlzLm92ZXJsYXlNb2R1bGUsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYVAoaHQuYVtodC5hLlNjcm9sbF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5vdmVybGF5TW9kdWxlLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9QKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55bSAhPT0gZC5yLkxnICYmIHQgfHwgdGhpcy5jUC5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA/IE9iamVjdChULmEpKGksIGQuaC5JbnZpc2libGUpIDogT2JqZWN0KFQuSSkoaSwgZC5oLkludmlzaWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1UCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPyBPYmplY3QoVC5hKSh0aGlzLiR1aUNvbnRhaW5lciwgZC5nLk11dGVkKSA6IE9iamVjdChULkkpKHRoaXMuJHVpQ29udGFpbmVyLCBkLmcuTXV0ZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsUCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5DYXB0aW9uQnV0dG9uKSwgZSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLkVsZW1lbnRzU2V0dGluZ3NNZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgdCA/IChpICYmIGkuc2hvd0NvbXBvbmVudCgpLCBlICYmIGUuc2hvd0NhcHRpb25PcHRpb24oKSkgOiAoaSAmJiBpLmhpZGVDb21wb25lbnQoKSwgZSAmJiBlLmhpZGVDYXB0aW9uT3B0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYW5kbGVDb21wb25lbnRFdmVudCh0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwZXIuaGFuZGxlQ29tcG9uZW50RXZlbnQodCwgaSwgZSksIHRoaXMuYVAodCksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5EcmFnZ2luZ1N0YXJ0XToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheU1vZHVsZS51aVN0aWNreSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuRHJhZ2dpbmdTdG9wcGVkXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheU1vZHVsZS51aVN0aWNreSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcWlbcWkuVXBOZXh0QnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5OZXh0XSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBxaVtxaS5QcmV2aW91c0J1dHRvbl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuUHJldl0sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuU2Vla106CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gMCwgbiA9IDEwMCwgciA9IDAsIGggPSB0aGlzLmJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlNlZWtdLCB7IHBheWxvYWQ6IE9iamVjdCh3aS5lKShzLCBuLCByLCBoLCBpLnBheWxvYWQpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuTXV0ZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVQKCEwKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIHsgcGF5bG9hZDogMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LlVubXV0ZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVQKCExKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LlZvbHVtZV0sIHsgcGF5bG9hZDogMSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LlZvbHVtZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVQKCFpLnBheWxvYWQpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuVm9sdW1lXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5Wb2x1bWVIb3ZlclN0YXJ0XToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub1AoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuVm9sdW1lSG92ZXJTdG9wcGVkXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub1AoITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuU2V0dGluZ3NdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5aVC50b2dnbGVDb250ZXh0TWVudShxaS5RdWFsaXR5TWVudSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5RdWFsaXR5XToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucGF5bG9hZCAmJiB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuUXVhbGl0eV0sIHsgcGF5bG9hZDogaS5wYXlsb2FkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcWlbcWkuTW9yZUJ1dHRvbl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlpULnRvZ2dsZUNvbnRleHRNZW51KHFpLkVsZW1lbnRzU2V0dGluZ3NNZW51KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHFpW3FpLkNsb3NlQnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5DbG9zZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQWJvdXRDbGlja106CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbERvbVV0aWxzU2VydmljZS5vcGVuKGFoLmEsIGt0LmMuQmxhbmspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQ29udGV4dE1lbnVDbG9zZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlNb2R1bGUudWlTdGlja3kgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LkNvbnRleHRNZW51T3Blbl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXlNb2R1bGUudWlTdGlja3kgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFQKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGh0LmFbaHQuYS5TY3JvbGxdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uU2Nyb2xsQ2xpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5Wb2x1bWVdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uVm9sdW1lQ2xpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBxaVtxaS5QbGF5QnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBxaVtxaS5CaWdQbGF5QnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBxaVtxaS5DbGlja1RvUGxheUJ1dHRvbl06CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuUGxheV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaC5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bS5QbGF5Q2xpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5QYXVzZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaC5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bS5QYXVzZUNsaWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcWlbcWkuVXBOZXh0QnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBoLlByb3RvTWVkaWFDbGlja1R5cGVFbnVtLk5leHRDbGljazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LlByZXZdOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHFpW3FpLlByZXZpb3VzQnV0dG9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBoLlByb3RvTWVkaWFDbGlja1R5cGVFbnVtLlByZXZpb3VzQ2xpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5NdXRlXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBoLlByb3RvTWVkaWFDbGlja1R5cGVFbnVtLk11dGVDbGljazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LlVubXV0ZV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaC5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bS5Vbm11dGVDbGljazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHh0W3h0LkNsb3NlXToKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBxaVtxaS5DbG9zZUJ1dHRvbl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaC5Qcm90b01lZGlhQ2xpY2tUeXBlRW51bS5DbG9zZUNsaWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQ2FwdGlvbk9mZl06CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQ2FwdGlvbk9uXToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBoLlByb3RvTWVkaWFDbGlja1R5cGVFbnVtLlN1YnRpdGxlQ2xpY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5FeHBhbmRdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uRnVsbFNjcmVlbkNsaWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQ29sbGFwc2VdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uRXhpdEZ1bGxTY3JlZW5DbGljazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGkgJiYgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5HZW5lcmFsVXNlckludGVyYWN0aW9uLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFDbGljazogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXBOZXh0Qm94KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlVwTmV4dEJveCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS51cGRhdGVDYXJkKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVQKCF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlZvbHVtZUJ1dHRvbiksIGUgPSB0aGlzLmdldENvbXBvbmVudChxaS5Wb2x1bWVDb250cm9scyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBlLnNldFZvbHVtZSh0KSA6IGkgJiYgaS5zZXRTdGF0ZSh0ID4gMCA/IE1zLlVubXV0ZSA6IE1zLk11dGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVEdXJhdGlvbih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUR1cmF0aW9uKHQsIGkpLCB0aGlzLmJ0ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlVwTmV4dEJveCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGkgLSB0IDw9IDUgPyBlLmlzSW5WaWV3KCkgfHwgZS5zaG93KCkgOiBlLmlzSW5WaWV3KCkgJiYgZS5oaWRlKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVDYXB0aW9ucyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5DYXB0aW9uQ29tcG9uZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiBpLnVwZGF0ZUNhcHRpb25zKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0b2dnbGVDYXB0aW9uU3RhdGUodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wb25lbnQocWkuQ2FwdGlvbkJ1dHRvbiksIGUgPSB0aGlzLmdldENvbXBvbmVudChxaS5FbGVtZW50c1NldHRpbmdzTWVudSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgaS5pc0FjdGl2ZSAhPT0gdCAmJiAoaS5pc0FjdGl2ZSA9IHQpLCBlICYmIGUudG9nZ2xlQ2FwdGlvblN0YXRlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1cGRhdGVRdWFsaXR5KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuZ2V0Q29tcG9uZW50KHFpLlNldHRpbmdzQnV0dG9uKSwgcyA9IHQuZ2V0Q2xvc2VzdFNvdXJjZVF1YWxpdHkoaS5oZWlnaHQpLmlzSEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS50b2dnbGVIREZsYWcocyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLmdldENvbXBvbmVudChxaS5RdWFsaXR5TWVudSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbi51cGRhdGVRdWFsaXR5KGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNoYW5nZVN0YXRlKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblJlc2l6ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueW0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wb25lbnQocWkuUXVhbGl0eU1lbnUpLCBlID0gdGhpcy5nZXRDb21wb25lbnQocWkuU2V0dGluZ3NCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBpICYmIGUgJiYgaS5vblJlc2l6ZShlLmdldENvb3JkaW5hdGVzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5nZXRDb21wb25lbnQocWkuQ29udGV4dE1lbnUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocyAmJiBzLm9uUmVzaXplKCksIHRoaXMuc2V0dGluZ3MuaXNNb2JpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmdldENvbXBvbmVudChxaS5FbGVtZW50c1NldHRpbmdzTWVudSksIGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5Nb3JlQnV0dG9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgaSAmJiB0Lm9uUmVzaXplKHQuZ2V0QW5jaG9yQ29vcmRpbmF0ZXNUbyhpKSwgdGhpcy55bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudFZpZGVvKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0QXZhaWxhYmxlUXVhbGl0aWVzKCksIGUgPSB0aGlzLmdldENvbXBvbmVudChxaS5RdWFsaXR5TWVudSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5jcmVhdGVRdWFsaXR5TWVudShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IHQuZ2V0VGh1bWJuYWlsVXJsKHRoaXMuJHVpQ29udGFpbmVyLmNsaWVudFdpZHRoLCB0aGlzLiR1aUNvbnRhaW5lci5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgXy5OZXdUaHVtYm5haWwsIHsgcGF5bG9hZDogeyB0aHVtYm5haWxVcmw6IHMgfSB9KSwgdGhpcy5sUCghIXQuc3VidGl0bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0b2dnbGVQbGF5bGlzdENvbnRyb2xzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuJHVpQ29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZC5oLkhpZGVPblNpbmdsZVZpZGVvKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGwuYykoaSkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyBPYmplY3QoVC5PKShpKSA6IE9iamVjdChULnUpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRXhwYW5kQnV0dG9uRGlzcGxheSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmdldENvbXBvbmVudChxaS5FeHBhbmRCdXR0b24pOwogICAgICAgICAgICAgICAgICAgICAgICBpICYmICh0ID8gaS5zaG93Q29tcG9uZW50KCkgOiBpLmhpZGVDb21wb25lbnQoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oUCgpLCB0aGlzLnJQKCksIHRoaXMuZFAoKSwgdGhpcy4kY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuc1ApLCB0aGlzLmNQID0gT2JqZWN0KGwuYykodGhpcy4kdWlDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShkLmguSGlkZU9uVm9sdW1lSG92ZXIpKSwgdGhpcy5zZXR0aW5ncy5pc01vYmlsZSB8fCB0aGlzLiR1aUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMuS1QpLCB0aGlzLm5QKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQmFzZVVpQ29udGVudF9zdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpLCB0aGlzLiRjb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5zUCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgbWMgZXh0ZW5kcyBmYyB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuQmlnUGxheUJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC50b2dnbGVSZXBsYXkoITApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmV4aXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5CaWdQbGF5QnV0dG9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnRvZ2dsZVJlcGxheSghMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgZ2MgZXh0ZW5kcyB2YyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZlAgPSB7IFt5LlJlcGxheVN0YXRlXTogbmV3IG1jKHRoaXMpIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJiID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0aGlzLnJiKSwgdGhpcy5mUCksIHN1cGVyLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRQKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJiW3kuU3RvcHBlZFN0YXRlXS5lbnRlclN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgeWMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wUCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdy5IMjY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbjogJ21wNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL21wNCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHcuSGV2YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb246ICdtcDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2aWRlby9tcDQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRoaXMuSG8gPSB0aGlzLnBQLmZpbmQoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pZCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB0eXBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5Iby5jb2RlY3MgPyBgY29kZWNzPSR7IHRoaXMuSG8uY29kZWNzIH1gIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsgdGhpcy5Iby50eXBlIH07ICR7IHQgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSG8uaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3Mgd2MgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuU3UgPSBpLCB0aGlzLm11ID0gZSwgdGhpcy5iUCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IGcuQXV0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogMzYwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucmVzaXplT2JzZXJ2ZXJCaW5kZWQgPSAhMSwgdGhpcy52UCA9IDMwLCB0aGlzLkx1ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMubXUuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubVAodCkgJiYgdGhpcy5jdXJyZW50UXVhbGl0eVNldHRpbmdzLnF1YWxpdHkgPT09IGcuQXV0bykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eTogZy5BdXRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEN1cnJlbnRRdWFsaXR5U2V0dGluZ3MoaSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4LkN1cnJlbnRRdWFsaXR5LCB7IHBheWxvYWQ6IGkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRRdWFsaXR5U2V0dGluZ3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJQLnF1YWxpdHkgPSB0LnF1YWxpdHksIHRoaXMuYlAuaGVpZ2h0ICE9PSB0LmhlaWdodCAmJiAodGhpcy5iUC5oZWlnaHQgPSB0LmhlaWdodCwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHguQ2hhbmdlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1QKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmJQLmhlaWdodCB8fCB0IC8gdGhpcy5iUC5oZWlnaHQgKiAxMDAgLSAxMDAgPiB0aGlzLnZQOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRSZXNpemVPYnNlcnZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlckJpbmRlZCA9ICEwLCB0aGlzLlN1Lm9uKHRoaXMubXUsIHRoaXMuTHUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZW1vdmVSZXNpemVPYnNlcnZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlckJpbmRlZCA9ICExLCB0aGlzLlN1Lm9mZih0aGlzLm11LCB0aGlzLkx1KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UXVhbGl0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQucXVhbGl0eSA9PT0gZy5BdXRvID8gdGhpcy5yZXNpemVPYnNlcnZlckJpbmRlZCB8fCAodGhpcy5zZXRDdXJyZW50UXVhbGl0eVNldHRpbmdzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5OiB0LnF1YWxpdHkKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuYWRkUmVzaXplT2JzZXJ2ZXIoKSwgdGhpcy5MdSgpKSA6ICh0aGlzLnJlc2l6ZU9ic2VydmVyQmluZGVkICYmIHRoaXMucmVtb3ZlUmVzaXplT2JzZXJ2ZXIoKSwgdGhpcy5zZXRDdXJyZW50UXVhbGl0eVNldHRpbmdzKHQpKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHguQ3VycmVudFF1YWxpdHksIHsgcGF5bG9hZDogdGhpcy5iUCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRRdWFsaXR5U2V0dGluZ3MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJQOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVJlc2l6ZU9ic2VydmVyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgT2MgPSB7IFRyYWNrTG9hZGVkOiAndHJhY2tMb2FkZWQnIH0sIHhjID0gewogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IGcuQXV0bwogICAgICAgICAgICAgICAgICAgIH0sIFNjID0gJ2VuJywgamMgPSAnc3VidGl0bGUnOwogICAgICAgICAgICAgICAgY2xhc3Mga2MgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMucmMgPSBpLCB0aGlzLmN3ID0gZSwgdGhpcy5nUCA9IFtdLCB0aGlzLnlQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIE9jLlRyYWNrTG9hZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd1AodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk9QID0gdCwgdGhpcy54UCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTUCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3cuaW5uZXJIVE1MID0gJycsIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3cuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBqUCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ1A7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHhQKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nUCA9IFtdLCB0aGlzLk9QICYmIHRoaXMuT1Auc3VidGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLnJjLmNyZWF0ZUVsZW1lbnQoJ3RyYWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNyYyA9IHRoaXMuT1Auc3VidGl0bGUsIHQuc3JjbGFuZyA9IFNjLCB0LmtpbmQgPSBqYywgdC5kZWZhdWx0ID0gITAsIHQuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMueVAsICExKSwgdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWQnLCB0aGlzLnlQLCAhMSksIHRoaXMuZ1AucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIF9jIGV4dGVuZHMga2MgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBuKSwgdGhpcy5TdSA9IGUsIHRoaXMuQ20gPSBzLCB0aGlzLmpUID0gaCwgdGhpcy5rUCA9IG51bGwsIHRoaXMuX1AgPSAxMC4xMywgdGhpcy5BUCA9IHRoaXMuSVAocik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DUCA9IG5ldyB3Yyh0aGlzLCB0aGlzLlN1LCB0aGlzLkNtKSwgdGhpcy5PdSgpLCB0aGlzLnNldFF1YWxpdHkodGhpcy5qVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTXA0U291cmNlSGFuZGxlcl9zdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25RdWFsaXR5Q2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoTWVkaWEoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U291cmNlKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndQKHQpLCB0aGlzLlRQKHRoaXMuUFAoKSwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFF1YWxpdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNQLnNldFF1YWxpdHkodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjdXJyZW50UXVhbGl0eVNldHRpbmdzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DUC5jdXJyZW50UXVhbGl0eVNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhdHRhY2hNZWRpYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NUCgpLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXRhY2hNZWRpYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdy5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpLCB0aGlzLlRQKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNQLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgT3UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVsYXkoeC5DdXJyZW50UXVhbGl0eSwgdGhpcy5DUCwgdGhpcywgdGhpcy5tZWRpYXRvciksIHRoaXMuc3Vic2NyaWJlKHguQ2hhbmdlLCB0aGlzLkNQLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkVQKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBFUCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5UUCh0aGlzLlBQKCkpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeC5DaGFuZ2UsIHsgcGF5bG9hZDogdGhpcy5DUC5jdXJyZW50UXVhbGl0eVNldHRpbmdzLmhlaWdodCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTFAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlNQKHQpLCB0aGlzLmN3LmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUFAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLlJQKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmpQKCkKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUlAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdyB8fCAhdGhpcy5PUCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5PUC5nZXRTb3VyY2VzKHRoaXMuQ1AuY3VycmVudFF1YWxpdHlTZXR0aW5ncy5oZWlnaHQsIHRoaXMuQVApLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5yYy5jcmVhdGVFbGVtZW50KCdzb3VyY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3JjID0gaS5zcmMsIGUudHlwZSA9IGkudHlwZSwgdC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTVAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua1AgJiYgKHRoaXMuTFAodGhpcy5rUCksIHRoaXMua1AgPSBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgVFAodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua1AgPSB0LCBpICYmIHRoaXMuTVAoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSVAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0Lm9zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3QuYi5Jb3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcuSGV2YywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LkgyNjQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTdC5iLk1hYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB0Lm9zVmVyc2lvbiA+IHRoaXMuX1AgJiYgdC5icm93c2VyID09PSBrdC5hLlNhZmFyaSA/IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LkhldmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5IMjY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogW3cuSDI2NF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBbdy5IMjY0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHljKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBBYyA9IHsKICAgICAgICAgICAgICAgICAgICBVbmV4cGVjdGVkRXJyb3I6ICd1bmV4cGVjdGVkRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmluZ0Vycm9yOiAnYnVmZmVyaW5nRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEZyYWdCdWZmZXJlZDogJ2ZyYWdCdWZmZXJlZCcsCiAgICAgICAgICAgICAgICAgICAgTWFuaWZlc3RMb2FkZWQ6ICdtYW5pZmVzdExvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgTGV2ZWxTd2l0Y2hpbmc6ICdsZXZlbFN3aXRjaGluZycsCiAgICAgICAgICAgICAgICAgICAgU3RyZWFtRW5kZWQ6ICdzdHJlYW1FbmRlZCcKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgSWM7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0Lkh0dHAgPSAnaHR0cCcsIHQuSHR0cHMgPSAnaHR0cHMnOwogICAgICAgICAgICAgICAgfShJYyB8fCAoSWMgPSB7fSkpOwogICAgICAgICAgICAgICAgY29uc3QgQ2MgPSB7CiAgICAgICAgICAgICAgICAgICAgZW5hYmxlV29ya2VyOiAhMSwKICAgICAgICAgICAgICAgICAgICBjYXBMZXZlbFRvUGxheWVyU2l6ZTogITAsCiAgICAgICAgICAgICAgICAgICAgY254UmVuZGVyV2luZG93OiB3aW5kb3csCiAgICAgICAgICAgICAgICAgICAgbWF4QnVmZmVyU2l6ZTogNTAwMDAwMCwKICAgICAgICAgICAgICAgICAgICBtYXhCdWZmZXJMZW5ndGg6IDUsCiAgICAgICAgICAgICAgICAgICAgbWF4TWF4QnVmZmVyTGVuZ3RoOiAxMCwKICAgICAgICAgICAgICAgICAgICBsaXZlQmFja0J1ZmZlckxlbmd0aDogMAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIFRjIGV4dGVuZHMga2MgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4sIHIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSksIHRoaXMuQlAgPSBzLCB0aGlzLmpUID0gbiwgdGhpcy5EUCA9IHIsIHRoaXMuWmQgPSBoLCB0aGlzLmx3ID0gW10sIHRoaXMuRlAgPSBnLkF1dG8sIHRoaXMuVlAgPSAzMjAsIHRoaXMuVVAgPSAhMSwgdGhpcy4kUCA9ICExLCB0aGlzLk5QID0gITEsIHRoaXMudncgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB3Lm9mZih4ci5FdmVudHMuTUVESUFfQVRUQUNIRUQsIHRoaXMudncpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuSFAodGhpcy5xUCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB3LmxvYWRTb3VyY2UodCksIHRoaXMucHcub25jZSh4ci5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm13KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5tdyA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcub2ZmKHhyLkV2ZW50cy5NQU5JRkVTVF9QQVJTRUQsIHRoaXMubXcpLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5MRVZFTF9TV0lUQ0hJTkcsIHRoaXMuelApLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5MRVZFTF9TV0lUQ0hFRCwgdGhpcy5XUCksIHRoaXMucHcub24oeHIuRXZlbnRzLkZSQUdfQlVGRkVSRUQsIHRoaXMuR1ApLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5GUkFHX0xPQURJTkcsIHRoaXMuSlApLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5GUkFHX0xPQURFRCwgdGhpcy5RUCksIHRoaXMucHcub24oeHIuRXZlbnRzLkJVRkZFUl9BUFBFTkRJTkcsIHRoaXMuWFApLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5CVUZGRVJfQVBQRU5ERUQsIHRoaXMuWVApLCB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5CVUZGRVJfRU9TLCB0aGlzLktQKSwgdGhpcy5xUCA9IG51bGwsIHRoaXMuZ3coKSwgdGhpcy5aUCgpLCB0aGlzLnRNKCksIHRoaXMuaU0ucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmVNID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xUCA9IG51bGwsIHRoaXMuY3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLkxvYWRlZE1ldGFkYXRhLCB0aGlzLmVNKSwgdGhpcy5zTS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuWlAgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5sdy5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9IZWlnaHQ6IHQuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hEOiB0LmhlaWdodCA+PSBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdC5sZXZlbC50b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEFjLk1hbmlmZXN0TG9hZGVkLCB7IHBheWxvYWQ6IHsgcXVhbGl0eUxpc3Q6IHQgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5HUCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBYy5GcmFnQnVmZmVyZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkpQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VUCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlFQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VUCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlhQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kUCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLllQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kUCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLktQID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEFjLlN0cmVhbUVuZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5kdyA9ICh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5kZXRhaWxzID09PSB4ci5FcnJvckRldGFpbHMuQlVGRkVSX1NUQUxMRURfRVJST1IgJiYgKHRoaXMuVVAgfHwgdGhpcy4kUCA/IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBYy5CdWZmZXJpbmdFcnJvcikgOiAodGhpcy5OUCB8fCAodGhpcy5wdy5yZWNvdmVyTWVkaWFFcnJvcigpLCB0aGlzLmN3LnBsYXkoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OUCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OUCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5OUCA9ICEwKSksIGkuZmF0YWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHhyLkVycm9yVHlwZXMuTkVUV09SS19FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkuZGV0YWlscyA9PT0geHIuRXJyb3JEZXRhaWxzLk1BTklGRVNUX1BBUlNJTkdfRVJST1IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB0aGlzLm5NKCdobHNfbmV0d29ya19lcnJvcl9tYW5pZmVzdF9wYXJzaW5nX2Vycm9yX0ZBVEFMJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmRldGFpbHMgPT09IHhyLkVycm9yRGV0YWlscy5NQU5JRkVTVF9MT0FEX0VSUk9SKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIEFjLlVuZXhwZWN0ZWRFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcuc3RhcnRMb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHIuRXJyb3JUeXBlcy5NRURJQV9FUlJPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5yZWNvdmVyTWVkaWFFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5NKCdobHNfdW5leHBlY3RlZF9lcnJvcl9GQVRBTCcsIGB0eXBlXyR7IGkudHlwZSB9X2RldGFpbHNfJHsgaS5kZXRhaWxzIH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS50eXBlID09PSB4ci5FcnJvclR5cGVzLk1FRElBX0VSUk9SICYmIGkuZGV0YWlscyA9PT0geHIuRXJyb3JEZXRhaWxzLkJVRkZFUl9BUFBFTkRJTkdfRVJST1IgJiYgdGhpcy5uTSgnaGxzX21lZGlhX2Vycm9yX2J1ZmZlcl9hcHBlbmRpbmdfZXJyb3InKSwgaS50eXBlID09PSB4ci5FcnJvclR5cGVzLk5FVFdPUktfRVJST1IgJiYgaS5kZXRhaWxzID09PSB4ci5FcnJvckRldGFpbHMuTUFOSUZFU1RfUEFSU0lOR19FUlJPUiAmJiB0aGlzLm5NKCdobHNfbmV0d29ya19lcnJvcl9tYW5pZmVzdF9wYXJzaW5nX2Vycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuck0gPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5NKCdobHNfdmlkZW9fdGFnX2Vycm9yJywgYGNvZGVfJHsgdGhpcy5jdy5lcnJvci5jb2RlIH1fbWVzc2FnZV8keyB0aGlzLmN3LmVycm9yLm1lc3NhZ2UgfWApOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLldQID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVlAgPSB0aGlzLmx3LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubGV2ZWwgPT09IGkubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5oZWlnaHQsIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4LkNoYW5nZSwgeyBwYXlsb2FkOiB0aGlzLmN1cnJlbnRRdWFsaXR5U2V0dGluZ3MuaGVpZ2h0IH0pLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeC5DdXJyZW50UXVhbGl0eSwgeyBwYXlsb2FkOiB0aGlzLmN1cnJlbnRRdWFsaXR5U2V0dGluZ3MgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuelAgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgQWMuTGV2ZWxTd2l0Y2hpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBTciAmJiAodGhpcy5wdyA9IHRoaXMucmMuaW5pdEhscyhDYyksIHRoaXMuRFAgJiYgKHRoaXMucHcuYXV0b0xldmVsQ2FwcGluZyA9IDEpKSwgdGhpcy5WUCA9IHRoaXMualQuaGVpZ2h0LCB0aGlzLkZQID0gdGhpcy5qVC5xdWFsaXR5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGxpdmVTeW5jUG9zaXRpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnB3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHcubGl2ZVN5bmNQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0U291cmNlKHQsIGkgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhNID0gdC5pZCwgdGhpcy53UCh0KSwgdGhpcy5xUCA9IHQsIGkgJiYgdGhpcy5hdHRhY2hNZWRpYSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhdHRhY2hNZWRpYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHcgPyB0aGlzLnB3Lm9uKHhyLkV2ZW50cy5FUlJPUiwgdGhpcy5kdykgOiB0aGlzLmN3LmFkZEV2ZW50TGlzdGVuZXIobS5FcnJvciwgdGhpcy5yTSksIHRoaXMucVApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5qUCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuU1AoaSksIHRoaXMucHcgPyB0aGlzLmFNKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHRoaXMub00oKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGV0YWNoTWVkaWEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubHcgPSBbXSwgdGhpcy5wdyA/ICh0aGlzLnB3LmRldGFjaE1lZGlhKCksIHRoaXMuY00oKSkgOiAodGhpcy5jdy5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpLCB0aGlzLmN3LnJlbW92ZUV2ZW50TGlzdGVuZXIobS5Mb2FkZWRNZXRhZGF0YSwgdGhpcy5lTSksIHRoaXMuY3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLkVycm9yLCB0aGlzLnJNKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFF1YWxpdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZQID0gdC5xdWFsaXR5LCB0aGlzLlZQID0gdC5oZWlnaHQsIHRoaXMucHcgJiYgdGhpcy50TSgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeC5DaGFuZ2UsIHsgcGF5bG9hZDogdGhpcy5jdXJyZW50UXVhbGl0eVNldHRpbmdzLmhlaWdodCB9KSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHguQ3VycmVudFF1YWxpdHksIHsgcGF5bG9hZDogdGhpcy5jdXJyZW50UXVhbGl0eVNldHRpbmdzIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgY3VycmVudFF1YWxpdHlTZXR0aW5ncygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHk6IHRoaXMuRlAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuVlAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25RdWFsaXR5Q2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcgPyAodGhpcy5jTSgpLCB0aGlzLnB3LmRlc3Ryb3koKSwgdGhpcy5wdyA9IG51bGwpIDogKHRoaXMuY3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLkxvYWRlZE1ldGFkYXRhLCB0aGlzLmVNKSwgdGhpcy5jdy5yZW1vdmVFdmVudExpc3RlbmVyKG0uRXJyb3IsIHRoaXMuck0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlNID0gbmV3IGp0LmEoKSwgdGhpcy5wdy5hdHRhY2hNZWRpYSh0aGlzLmN3KSwgdGhpcy5wdy5vbmNlKHhyLkV2ZW50cy5NRURJQV9BVFRBQ0hFRCwgdGhpcy52dyksIHRoaXMuaU0ucHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb00oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNNID0gbmV3IGp0LmEoKSwgdGhpcy5jdy5zcmMgPSB0aGlzLkhQKHRoaXMucVApLCB0aGlzLmN3LmFkZEV2ZW50TGlzdGVuZXIobS5Mb2FkZWRNZXRhZGF0YSwgdGhpcy5lTSksIHRoaXMuc00ucHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY00oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcub2ZmKHhyLkV2ZW50cy5NRURJQV9BVFRBQ0hFRCwgdGhpcy52dyksIHRoaXMucHcub2ZmKHhyLkV2ZW50cy5NQU5JRkVTVF9QQVJTRUQsIHRoaXMubXcpLCB0aGlzLnB3Lm9mZih4ci5FdmVudHMuRVJST1IsIHRoaXMuZHcpLCB0aGlzLnB3Lm9mZih4ci5FdmVudHMuTEVWRUxfU1dJVENISU5HLCB0aGlzLnpQKSwgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLkxFVkVMX1NXSVRDSEVELCB0aGlzLldQKSwgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLkZSQUdfQlVGRkVSRUQsIHRoaXMuR1ApLCB0aGlzLnB3Lm9mZih4ci5FdmVudHMuRlJBR19MT0FESU5HLCB0aGlzLkpQKSwgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLkZSQUdfTE9BREVELCB0aGlzLlFQKSwgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLkJVRkZFUl9BUFBFTkRJTkcsIHRoaXMuWFApLCB0aGlzLnB3Lm9mZih4ci5FdmVudHMuQlVGRkVSX0FQUEVOREVELCB0aGlzLllQKSwgdGhpcy5wdy5vZmYoeHIuRXZlbnRzLkJVRkZFUl9FT1MsIHRoaXMuS1ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBndygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5sZXZlbHMuZm9yRWFjaCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5EUCAmJiBpID4gMSB8fCB0aGlzLmx3LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdC5oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbk0odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0aGlzLmhNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLldBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IGkKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBBYy5VbmV4cGVjdGVkRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0TSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuRlAgPT09IGcuQXV0bykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHcuY3VycmVudExldmVsID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdy5jdXJyZW50TGV2ZWwgPSB0aGlzLmx3LmZpbmQodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmhlaWdodCA9PT0gdGhpcy5WUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5sZXZlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdIbHNTb3VyY2VIYW5kbGVyX3F1YWxpdHlfbm90X3ByZXNlbnRfaW5faGxzX21hbmlmZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhQKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LmdldEhsc1NvdXJjZSgpLCBlID0gT2JqZWN0KExpLmcpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5wcm90b2NvbCA/IHRoaXMuWmQuYXBwZW5kUGFyYW1zVG9VcmwoaSkgOiB0aGlzLlpkLmFwcGVuZFBhcmFtc1RvVXJsKGAkeyB0aGlzLkJQIH06JHsgaSB9YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnSGxzU291cmNlSGFuZGxlcl91bmRlZmluZWRfc291cmNlTWV0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kTWF4TG9nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgUGM7CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB0LkRpc2FibGVkID0gJ2Rpc2FibGVkJywgdC5IaWRkZW4gPSAnaGlkZGVuJywgdC5TaG93aW5nID0gJ3Nob3dpbmcnOwogICAgICAgICAgICAgICAgfShQYyB8fCAoUGMgPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgTWMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuY3cgPSBpLCB0aGlzLlB3ID0gZSwgdGhpcy5NbSA9IG4sIHRoaXMudU0gPSAhMSwgdGhpcy5sTSA9ICExLCB0aGlzLmRNID0gUGMuSGlkZGVuLCB0aGlzLmZNID0gMCwgdGhpcy5NdyA9ICExLCB0aGlzLnBNID0gbnVsbCwgdGhpcy5iTSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0LnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5QbGF5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5NdyAmJiB0aGlzLk1tLmNvbmZpZy5pc0luQXBwQW5kcm9pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudU0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5UaW1ldXBkYXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB0LnR5cGUsIHsgcGF5bG9hZDogdGhpcy51TSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbS5FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5jdy5lcnJvciA/IHRoaXMuY3cuZXJyb3IubWVzc2FnZSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBPLlBsYXlFcnJvciwgeyBwYXlsb2FkOiBpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtLkxvYWRlZE1ldGFkYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubE0gPSAhMCwgT2JqZWN0KHJ0LmQpKHRoaXMudk0pICYmICh0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy52TSwgdGhpcy52TSA9IG51bGwpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdC50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHQudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucGxheSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLk13ID0gITAsIHRoaXMucE0gPSB0aGlzLmN3LnBsYXkoKSwgbnVsbCAhPT0gdGhpcy5wTSA/ICh0aGlzLmZNKyssIHRoaXMucE0udGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51TSA9ICEwLCB0aGlzLk1tLmNvbmZpZy5vcy5vcyA9PT0gU3QuYi5Jb3MgJiYgT2JqZWN0KFQueikodGhpcy5jdyksIHRoaXMuZk0tLSwgdGhpcy5tTSgpLCB0aGlzLnBNID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBPLlBsYXlFcnJvciwgeyBwYXlsb2FkOiB0IH0pLCB0aGlzLnVNID0gITEsIHRoaXMuZk0tLSwgdGhpcy5wTSA9IG51bGwsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5wYXVzZSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHRoaXMucE0gPyB0aGlzLnBNLnRoZW4odGhpcy5nTSkuY2F0Y2godGhpcy5nTSkgOiB0aGlzLnlNKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ00gPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZNID4gMSB8fCB0aGlzLnlNKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudm9sdW1lID0gcywgdGhpcy5PdSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Qdy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdy5hZGRFdmVudExpc3RlbmVyKHQsIHRoaXMuYk0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3cudGV4dFRyYWNrcyAmJiAwICE9PSB0aGlzLmN3LnRleHRUcmFja3MubGVuZ3RoICYmIE9iamVjdC5rZXlzKHRoaXMuY3cudGV4dFRyYWNrcykuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3cudGV4dFRyYWNrc1t0XS5tb2RlID0gdGhpcy5kTTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBwb3N0ZXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuaCkodCkgJiYgKHRoaXMuY3cucG9zdGVyID0gdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBwb3N0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN3LnBvc3RlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3cucGF1c2UoKSwgdGhpcy51TSA9ICExLCB0aGlzLk13ID0gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB2b2x1bWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgdm9sdW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcCA9IHQgPD0gMSA/IHQgOiB0IC8gMTAwLCB0aGlzLmN3LnZvbHVtZSA9IHRoaXMucHAsIE9iamVjdChULlIpKHRoaXMuY3csIHRoaXMucHApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmN3LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgY3VycmVudFRpbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxNID8gdGhpcy5jdy5jdXJyZW50VGltZSA9IHQgOiB0aGlzLnZNID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGR1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdy5kdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHBsYXlpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVNOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlB3LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN3LnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgdGhpcy5iTSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRUcmFja01vZGVzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kTSA9IHQsIHRoaXMubU0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0TWV0YUxvYWRlZCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubE0gPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRDcm9zc09yaWdpbkF0dHJpYnV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdy5nZXRBdHRyaWJ1dGUoJ2Nyb3Nzb3JpZ2luJykgfHwgdGhpcy5jdy5zZXRBdHRyaWJ1dGUoJ2Nyb3Nzb3JpZ2luJywgJ2Fub255bW91cycpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRQb3N0ZXIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc3RlciA9IHQuZ2V0VGh1bWJuYWlsVXJsKHRoaXMuY3cuY2xpZW50V2lkdGgsIHRoaXMuY3cuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFRyYWNrKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdy50ZXh0VHJhY2tzICYmIDAgIT09IHRoaXMuY3cudGV4dFRyYWNrcy5sZW5ndGggPyB0aGlzLmN3LnRleHRUcmFja3NbMF0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc1BsYXlQZW5kaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mTSA+IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgRWMgZXh0ZW5kcyBvLmEgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIHIsIGEsIG8gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgYywgdSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXIoKSwgdGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuTW0gPSBpLCB0aGlzLnJjID0gZSwgdGhpcy5DbSA9IHMsIHRoaXMuU3UgPSByLCB0aGlzLndNID0gYSwgdGhpcy5IbyA9IG8sIHRoaXMuQ0MgPSBjLCB0aGlzLmpUID0gdSwgdGhpcy5PTSA9ICEwLCB0aGlzLnJDID0gITEsIHRoaXMueE0gPSAhMSwgdGhpcy5TTSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFjay5hY3RpdmVDdWVzICYmIHRoaXMuY3VycmVudFRyYWNrLmFjdGl2ZUN1ZXMubGVuZ3RoID4gMCAmJiAodCA9IHRoaXMuY3VycmVudFRyYWNrLmFjdGl2ZUN1ZXNbMF0pLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ2FwdGlvblVwZGF0ZV0sIHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMueVAgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VHJhY2sgJiYgKHRoaXMuY3VycmVudFRyYWNrLm1vZGUgPSB0aGlzLmpNID8gUGMuSGlkZGVuIDogUGMuRGlzYWJsZWQsIHRoaXMuY3VycmVudFRyYWNrLm9uY3VlY2hhbmdlID0gdGhpcy5TTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmtNKCksIHRoaXMuX00uYXBwZW5kQ2hpbGQodGhpcy5jdyksIHRoaXMuQ20uYXBwZW5kQ2hpbGQodGhpcy5fTSksIHRoaXMualQgPSB0aGlzLmpUIHx8IHhjLCB0aGlzLkFNID0gbmV3IF9jKHRoaXMsIGUsIHRoaXMuU3UsIHRoaXMuQ20sIHRoaXMuY3csIHRoaXMuSG8sIHRoaXMualQpLCBTciB8fCBqcih0aGlzLmN3KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMucmMuaXNIdHRwc1Byb3RvY29sVXNlZCgpID8gSWMuSHR0cHMgOiBJYy5IdHRwLCBpID0gT2JqZWN0KHJ0LmgpKHRoaXMuTW0uY29uZmlnLmJ1bmRsZUlEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHcgPSBuZXcgVGModGhpcywgdGhpcy5yYywgdGhpcy5jdywgdCwgdGhpcy5qVCwgaSwgdGhpcy5NbS5zZXJ2aWNlcy5VcmxTdWZmaXhlclNlcnZpY2UpLCB0aGlzLklNKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5PTSA9ICExLCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0hsc19ub3Rfc3VwcG9ydGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5QdyA9IE9iamVjdCh1LmEpKG0pLCB0aGlzLkNNID0gbmV3IE1jKHRoaXMsIHRoaXMuY3csIHRoaXMuUHcsIHRoaXMud00sIHRoaXMuTW0pLCB0aGlzLlRNKCksIHRoaXMuUE0oKSwgdGhpcy5NTSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ZpZGVvSGFuZGxlcl9zdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNvdXJjZSh0aGlzLkxNLCAhMCwgdGhpcy5BTSksIHRoaXMuUk0uYXR0YWNoTWVkaWEoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ00ucGxheSgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueE0gPSAhMSwgdGhpcy5CTS5yZXNvbHZlKCksIHRoaXMuQ00uY3VycmVudFRpbWUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CTSAmJiB0aGlzLkJNLmlzUGVuZGluZyAmJiAodGhpcy54TSA9ICExLCB0aGlzLkJNLnJlamVjdCgpLCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdWaWRlb0hhbmRsZXJfaGxzX2Vycm9yX2NvbnRlbnRfcGxheWVyX3BsYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5CTSAmJiB0aGlzLkJNLmlzUGVuZGluZyAmJiAodGhpcy54TSA9ICExLCB0aGlzLkJNLnJlamVjdCgpKSwgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdWaWRlb0hhbmRsZXJfaGxzX2Vycm9yX2F0dGFjaF9tZWRpYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKEFjLlVuZXhwZWN0ZWRFcnJvciwgdGhpcy5IdywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54TSA9ICEwLCB0aGlzLkVNKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShBYy5NYW5pZmVzdExvYWRlZCwgdGhpcy5IdywgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHguTG9hZGVkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5TGlzdDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9NZXRhOiB0aGlzLkxNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuQ00uc2V0TWV0YUxvYWRlZCghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShBYy5CdWZmZXJpbmdFcnJvciwgdGhpcy5IdywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIE8uQnVmZmVyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKEFjLkZyYWdCdWZmZXJlZCwgdGhpcy5IdywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIE8uQnVmZmVyZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoQWMuU3RyZWFtRW5kZWQsIHRoaXMuSHcsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBPLkVuZE9mU3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKEFjLkxldmVsU3dpdGNoaW5nLCB0aGlzLkh3LCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgTy5MZXZlbFN3aXRjaGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBUTSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ETSh0aGlzLkFNKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUE0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSHcgJiYgdGhpcy5ETSh0aGlzLkh3KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRE0odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCksIHRoaXMuRk0odCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE1NKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlB3LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZSh0LCB0aGlzLkNNLCBpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBtLkNhbnBsYXkgJiYgdGhpcy5DQyAmJiAodGhpcy5jdXJyZW50VGltZSA9IHRoaXMuQ0MsIHRoaXMuQ0MgPSBudWxsKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnJlbGF5KE8uUGxheUVycm9yLCB0aGlzLkNNLCB0aGlzLCB0aGlzLm1lZGlhdG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRk0odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF5KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHguQ3VycmVudFF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLk5ld1ZpZGVvCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHQsIHRoaXMsIHRoaXMubWVkaWF0b3IpLCB0aGlzLnN1YnNjcmliZSh4LkNoYW5nZSwgdCwgKHtwYXlsb2FkOiB0fSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblF1YWxpdHlDaGFuZ2VkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoT2MuVHJhY2tMb2FkZWQsIHQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueVAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB3aWR0aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX00uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBoZWlnaHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DTS5jdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IGN1cnJlbnRUaW1lKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DTS5jdXJyZW50VGltZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcmNlQ3VycmVudFRpbWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNNLmN1cnJlbnRUaW1lID0gdCwgdGhpcy5DQyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ00uZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB2b2x1bWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNNLnZvbHVtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IHZvbHVtZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ00udm9sdW1lID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHBsYXlpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkNNLnBsYXlpbmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpc0lvc0Z1bGxzY3JlZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJDOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgaXNJb3NGdWxsc2NyZWVuKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yQyA9IHQsIHRoaXMuckMgJiYgdGhpcy5qTSA/IHRoaXMuVk0oKSA6IHRoaXMuVU0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRRdWFsaXR5U2V0dGluZ3MoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlJNLmN1cnJlbnRRdWFsaXR5U2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhpZGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmEpKHRoaXMuX00sIGQuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3coKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULkkpKHRoaXMuX00sIGQuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFNvdXJjZSh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ0MgPSBudWxsLCBuZXcgUHJvbWlzZSgocywgcikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxNID0gdCwgdGhpcy5STSAmJiB0aGlzLlJNLmRldGFjaE1lZGlhKCksIGUgPyB0aGlzLiRNKGUpIDogT2JqZWN0KHJ0LmgpKHQuaGxzRmlsZVBhdGgpICYmIHRoaXMuSHcgPyB0aGlzLlJNID0gdGhpcy5IdyA6IHRoaXMuJE0odGhpcy5BTSksIHQgJiYgdC5zdWJ0aXRsZSAmJiB0aGlzLkNNLnNldENyb3NzT3JpZ2luQXR0cmlidXRlKCksIHRoaXMuQ00uc2V0UG9zdGVyKHQpLCB0aGlzLkNNLnNldFRyYWNrTW9kZXModGhpcy5qTSA/IFBjLkhpZGRlbiA6IFBjLkRpc2FibGVkKSwgaSAmJiB0aGlzLkNNLnNldE1ldGFMb2FkZWQoITEpLCB0aGlzLlJNLnNldFNvdXJjZSh0LCBpKSwgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIE8uTmV3VmlkZW8pLCBzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVmlkZW9IYW5kbGVyX3NldF92aWRlb19zb3VyY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LnN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0UXVhbGl0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUk0uc2V0UXVhbGl0eSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQ00ucGF1c2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGxheSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQk0gPSBuZXcganQuYSgpLCB0aGlzLlJNLmF0dGFjaE1lZGlhKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkNNLnBsYXkoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkJNLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnhNICYmIHRoaXMuQk0gJiYgdGhpcy5CTS5pc1BlbmRpbmcgJiYgKHRoaXMuQk0ucmVqZWN0KCksIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ZpZGVvSGFuZGxlcl9wdWJsaWNfcGxheV9jb250ZW50X3BsYXllcl9wbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5jYWxsU3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQk0gJiYgdGhpcy5CTS5pc1BlbmRpbmcgJiYgdGhpcy5CTS5yZWplY3QodCksIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVmlkZW9IYW5kbGVyX3B1YmxpY19wbGF5X2F0dGFjaF9tZWRpYV9lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5CTS5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc1BsYXlQZW5kaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5DTS5pc1BsYXlQZW5kaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNob3dDYXB0aW9ucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qTSA9ICEwLCB0aGlzLkNNLnNldFRyYWNrTW9kZXMoUGMuSGlkZGVuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaGlkZUNhcHRpb25zKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpNID0gITEsIHRoaXMuQ00uc2V0VHJhY2tNb2RlcyhQYy5EaXNhYmxlZCksIHRoaXMuY3VycmVudFRyYWNrICYmIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5DYXB0aW9uVXBkYXRlXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUk0uZGVzdHJveSgpLCB0aGlzLl9NLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fTSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGtNKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9NID0gdGhpcy5yYy5jcmVhdGVFbGVtZW50QnlTdHJpbmcoJzxjbnggY2xhc3M9ImNueC12aWRlby13cmFwcGVyIj48L2NueD4nKSwgdGhpcy5jdyA9IHRoaXMucmMuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKCc8dmlkZW8gY2xhc3M9ImNueC12aWRlby10YWciPjwvdmlkZW8+JyksIHRoaXMuSG8ub3MgPT09IFN0LmIuSW9zICYmICh0aGlzLmN3LnNldEF0dHJpYnV0ZSgncGxheXNpbmxpbmUnLCAnJyksIHRoaXMuY3cuc2V0QXR0cmlidXRlKCd3ZWJraXQtcGxheXNpbmxpbmUnLCAnJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkTSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuUk0gPSB0LCB0aGlzLlJNLnNldFF1YWxpdHkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eTogZy5BdXRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblF1YWxpdHlDaGFuZ2VkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuQ00ucGxheWluZzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DQyA9IHRoaXMuY3VycmVudFRpbWUsIGkgJiYgdGhpcy5STS5vblF1YWxpdHlDaGFuZ2VkICYmIHRoaXMuUk0ub25RdWFsaXR5Q2hhbmdlZCgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5DTS5zZXRNZXRhTG9hZGVkKCExKSwgdGhpcy5DTS5wbGF5KCkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVmlkZW9IYW5kbGVyX3F1YWxpdHlfY2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeC5DaGFuZ2UsIHsgcGF5bG9hZDogdCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRUcmFjaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ00uZ2V0Q3VycmVudFRyYWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFZNKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFjayAmJiAodGhpcy5jdXJyZW50VHJhY2sub25jdWVjaGFuZ2UgPSBudWxsLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ2FwdGlvblVwZGF0ZV0pLCB0aGlzLmN1cnJlbnRUcmFjay5tb2RlID0gUGMuU2hvd2luZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFVNKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50VHJhY2subW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYy5TaG93aW5nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYy5IaWRkZW46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qTSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQYy5EaXNhYmxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmpNID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgdGhpcy5qTSA/IHh0W3h0LkNhcHRpb25Pbl0gOiB4dFt4dC5DYXB0aW9uT2ZmXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55UCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IExjID0gewogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTY4LAogICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDkxCiAgICAgICAgICAgICAgICAgICAgfSwgUmMgPSA2OwogICAgICAgICAgICAgICAgY2xhc3MgQmMgZXh0ZW5kcyBuYyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuTk0gPSAhMSwgdGhpcy5zZCA9IGguUHJvdG9RdWFydGlsZXNFbnVtLlN0YXJ0LCB0aGlzLkhNID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3RhcnQoKSwgdGhpcy5rQy5zdGFydCgpLCB0aGlzLmZUKCksIHRoaXMuYlQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0Q3VycmVudFZpZGVvSW5kZXgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpDLmN1cnJlbnRWaWRlb0luZGV4OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfVCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHQpLCB7IGlzSW5BcHA6IE9iamVjdChydC5oKSh0aGlzLk1tLmNvbmZpZy5idW5kbGVJRCkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBuZXcgYWModCwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRUID0gbmV3IGdjKHRoaXMsIHRoaXMuTW0uc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLCB0aGlzLk1tLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZSwgdGhpcy5DbSwgaS50ZW1wbGF0ZSwgdCwgdGhpcy5NbS5jb25maWcuYXBwSWQsIHRoaXMueW0pLCB0aGlzLmRULnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIElUKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcC51cE5leHRNb2RlID09PSBNLlByb3RvUGxheWVyVXBOZXh0TW9kZS5OZXh0ICYmIHRoaXMua0MuZHVyYXRpb24gLSB0aGlzLmtDLmN1cnJlbnRUaW1lIDw9IFJjICYmICF0aGlzLk5NICYmICh0aGlzLk5NID0gITAsIHRoaXMuakMuZ2V0VmlkZW9EYXRhKHRoaXMuakMubmV4dFZpZGVvSW5kZXgsIHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHQuZ2V0VGh1bWJuYWlsVXJsKExjLndpZHRoLCBMYy5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kVC51cGRhdGVVcE5leHRCb3goaSwgdC5kZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5xTSh0aGlzLmtDLmN1cnJlbnRUaW1lLCB0aGlzLmtDLmR1cmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgeVQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTk0gPSAhMSwgdGhpcy5zZCA9IGguUHJvdG9RdWFydGlsZXNFbnVtLlN0YXJ0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2VCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmNwLnVwTmV4dE1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNLlByb3RvUGxheWVyVXBOZXh0TW9kZS5Mb29wOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56TSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTS5Qcm90b1BsYXllclVwTmV4dE1vZGUuTmV4dDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuV00oKSwgdGhpcy51VC5zdHJlYW1Gb3JtYXQgPSBaby5BdXRvY2hhaW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNLlByb3RvUGxheWVyVXBOZXh0TW9kZS5TdG9wOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5zdG9wKCksIHRoaXMuZFQuY2hhbmdlU3RhdGUoeS5SZXBsYXlTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYlQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVSb2xsQnJlYWs6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJvbGxCcmVhazogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA9IHRoaXMuY3AsIGUgPSBPYmplY3QocnQuZSkodCksIHMgPSBPYmplY3QocnQuZSkoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQgPSBuZXcgdGModGhpcywgdGhpcy5qQywgdGhpcy5rQywgZSwgcywgdGhpcy5NbS5jb25maWcub3Mub3MgPT09IFN0LmIuSW9zLCB0aGlzLmNwLnZpZGVvUG9zaXRpb24pLCBzdXBlci5iVCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtVCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIubVQoKSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuUmVwbGF5XSwgdGhpcy5kVCwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIGMuYi5Vc2VySW50ZXJhY3Rpb24sIHsgcGF5bG9hZDogeyBwbGF5YmFjazogITAgfSB9KSwgdGhpcy56TSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuTmV4dF0sIHRoaXMuZFQsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBjLmIuVXNlckludGVyYWN0aW9uLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFjazogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWROZXh0OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLldNKCksIHRoaXMudVQuc3RyZWFtRm9ybWF0ID0gWm8uVXNlckluaXRpYXRlZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LlByZXZdLCB0aGlzLmRULCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgYy5iLlVzZXJJbnRlcmFjdGlvbiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2s6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja2VkUHJldjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5HTSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga1QodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtDID0gbmV3IEVjKHRoaXMsIHRoaXMuTW0sIHRoaXMuTW0uc2VydmljZXMuR2xvYmFsRG9tVXRpbHNTZXJ2aWNlLCB0aGlzLkNtLCB0aGlzLk1tLnNlcnZpY2VzLlJlc2l6ZU9ic2VydmVyLCBpLCB0LCB0aGlzLmNwLnZpZGVvUG9zaXRpb24sIHRoaXMualQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKTSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICYmIHQgPyBNYXRoLmZsb29yKE9iamVjdCh3aS5lKSgwLCBpLCAwLCA0LCB0KSkgOiBoLlByb3RvUXVhcnRpbGVzRW51bS5TdGFydDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcU0odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5KTSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA+IGguUHJvdG9RdWFydGlsZXNFbnVtLlN0YXJ0ICYmIGUgIT09IHRoaXMuc2QgJiYgKHRoaXMuSE0uZ2V0KGUpIHx8ICh0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgQS5Db250ZW50UXVhcnRpbGVzLCB7IHBheWxvYWQ6IGUgfSksIHRoaXMuSE0uc2V0KGUsICEwKSksIHRoaXMuc2QgPSBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgR00oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmlkZW8odGhpcy5qQy5wcmV2VmlkZW9JbmRleCwgITApLCB0aGlzLnVULnN0cmVhbUZvcm1hdCA9IFpvLlVzZXJJbml0aWF0ZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFdNKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpZGVvKHRoaXMuakMubmV4dFZpZGVvSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLQyh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuS0ModCksIHRoaXMuSE0uY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgek0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubFQucmVwbGF5KCksIHRoaXMuS0MoITEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBEYzsKICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHRbdC5QbGF5ID0gMF0gPSAnUGxheScsIHRbdC5QYXVzZSA9IDFdID0gJ1BhdXNlJzsKICAgICAgICAgICAgICAgIH0oRGMgfHwgKERjID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIEZjIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5tZWRpYXRvciA9IHQsIHRoaXMuaW5WaWV3ID0gITEsIHRoaXMuUU0gPSAhMSwgdGhpcy5YTSA9ICExLCB0aGlzLllNID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkF1dG9wbGF5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5LTSh0aGlzLlpNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkNsaWNrVG9QbGF5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5LTSh0aGlzLnRFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLlNjcm9sbFRvUGxheToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuS00odGhpcy5pRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgS00odCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLllNID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5RTSB8fCB0LmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpNKCkgewogICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5YTSAmJiB0aGlzLmluVmlldyAmJiAodGhpcy5YTSA9ICEwLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgRGNbRGMuUGxheV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaUUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5WaWV3ID8gdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIERjW0RjLlBsYXldKSA6IHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBEY1tEYy5QYXVzZV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0RSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Vmlld2FiaWxpdHkodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluVmlldyA9IHQsIHRoaXMuWU0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0VXNlclBsYXliYWNrKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuWE0gJiYgdCAmJiAodGhpcy5YTSA9IHQpLCB0aGlzLlFNID0gIXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgVmMgZXh0ZW5kcyBObyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZUUgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydCgpLCB0aGlzLnNFKCksIHRoaXMubkUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdWaWRlb0V4cGVyaWVuY2Vfc3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5leHRWaWRlbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLlhJLmdldEN1cnJlbnRWaWRlb0luZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVmlkZW8oKyt0LCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByZXZWaWRlbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSB0aGlzLlhJLmdldEN1cnJlbnRWaWRlb0luZGV4KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVmlkZW8oLS10LCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmVBbGwodGhpcy5yRSksIHN1cGVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXAuaXNJbkFkUG9kKCkgPyB0aGlzLnVwKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9wKCksIHRoaXMuZ2Yub25BZEZpbmlzaGVkKHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbiwgdGhpcy5lcC5pc0luQWRQb2QoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhJLnNob3coITApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IChzdXBlci5vcCgpLCB0aGlzLlhJLnNob3codGhpcy5lRSksIHRoaXMuZUUgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVoKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci51aCgpLCB0aGlzLmhFICYmIHRoaXMuYUUoKSwgdGhpcy5yRSAmJiB0aGlzLnJFLm9uUmVzaXplKHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIuY2xpZW50V2lkdGgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZUhUTUwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlSFRNTCgpLCB0aGlzLmNwLmdhbGxlcnkgJiYgdGhpcy5vRSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YSSA9IG5ldyBCYyh0aGlzLCB0aGlzLmNwLCB0aGlzLmFwcCwgdGhpcy4kcGxheWVyQ29udGFpbmVyLCB0aGlzLmJyZWFrUG9pbnRzSGFuZGxlci5jdXJyZW50QnJlYWtwb2ludENsYXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2wodCwgaSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdsKHQsIGkpLCB0aGlzLmNFLnNldFZpZXdhYmlsaXR5KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jRSA9IG5ldyBGYyh0aGlzLCB0aGlzLmNwLnBsYXliYWNrTW9kZSksIHRoaXMuc3Vic2NyaWJlKERjW0RjLlBsYXldLCB0aGlzLmNFLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlhJLnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKERjW0RjLlBhdXNlXSwgdGhpcy5jRSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YSS5wYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoYy5iLlVzZXJJbnRlcmFjdGlvbiwgdGhpcy5YSSwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHtwbGF5YmFjazogdH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHJ0LmEpKHQpICYmIHRoaXMuY0Uuc2V0VXNlclBsYXliYWNrKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYUUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3AuZ2FsbGVyeS5vcmllbnRhdGlvbiA9PT0gTS5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW0uTGFuZHNjYXBlICYmIE9iamVjdChULk4pKHRoaXMuaEUsIHsgaGVpZ2h0OiBgJHsgdGhpcy4kcGxheWVyV3JhcHBlci5jbGllbnRIZWlnaHQgfXB4YCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb0UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaEUgPSB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UuY3JlYXRlRWxlbWVudEJ5U3RyaW5nKCc8Y254IGNsYXNzPSJjbngtZy1jb250YWluZXIiPjwvY254PicpLCB0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuaEUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jcC5nYWxsZXJ5Lm9yaWVudGF0aW9uID09PSBNLlByb3RvR2FsbGVyeU9yaWVudGF0aW9uRW51bS5MYW5kc2NhcGUgPyBkLmcuR2FsbGVyeUxhbmRzY2FwZSA6IGQuZy5HYWxsZXJ5UG9ydHJhaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChULmEpKHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIsIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcC5nYWxsZXJ5ICYmICh0aGlzLnJFID0gbmV3IHd0KHRoaXMsIHRoaXMuYXBwLnNlcnZpY2VzLlJlc2l6ZU9ic2VydmVyLCB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuYXBwLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZSwgdGhpcy5oRSwgdGhpcy5hcHAuY29uZmlnLmRldmljZSwgdGhpcy5jcC5nYWxsZXJ5LnN0eWxlLCB0aGlzLmNwLmdhbGxlcnkub3JpZW50YXRpb24sIHRoaXMuY3AucGxheWxpc3QpLCB0aGlzLnN1YnNjcmliZShBLkNoYW5nZVZpZGVvLCB0aGlzLnJFLCAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge3ZpZGVvSW5kZXg6IHR9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZUUgPSAhdGhpcy5YSS5pc0hpZGRlbiwgdGhpcy5lcC5lbmRQb2QoKSwgdGhpcy5jaGFuZ2VWaWRlbyh0LCAhMCksIHRoaXMuWEkuZ2V0VmlkZW9EYXRhKHQsIHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBJLkdhbGxlcnlDYXJkQ2xpY2tlZCwgeyBwYXlsb2FkOiB0aGlzLm1DKHQpIH0pLCB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tNZWRpYUNsaWNrKGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uR2FsbGVyeUNsaWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLk5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZShPLk5ld1ZpZGVvLCB0aGlzLlhJLCAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge3ZpZGVvSW5kZXg6IHR9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuckUuc2V0Q3VycmVudEluZGV4KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoQS5WaWRlb1F1ZXVlZCwgdGhpcy5YSSwgKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt2aWRlb0luZGV4OiB0fQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJFLnNldEN1cnJlbnRJbmRleCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKGh0LmFbaHQuYS5TY3JvbGxdLCB0aGlzLnJFLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC5zZXJ2aWNlcy5UcmFja2luZ1NlcnZpY2UudHJhY2tNZWRpYUNsaWNrKGguUHJvdG9NZWRpYUNsaWNrVHlwZUVudW0uU2Nyb2xsQ2xpY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5yRS5zdGFydCgpLCB0aGlzLnJFLm9uUmVzaXplKHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIuY2xpZW50V2lkdGgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBVYyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuamwgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb24odCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5qbFt0XSA9IHRoaXMuamxbdF0gfHwgW10sICFPYmplY3QocnQuYikoaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7IHQgfSBldmVudCBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbmApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qbFt0XS5wdXNoKGkpLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qbFt0XSA9IHRoaXMuamxbdF0uZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICE9PSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uY2UodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5vbih0LCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbW92ZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuamxbdF0gJiYgKHRoaXMuamxbdF0gPSB0aGlzLmpsW3RdLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICE9PSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qbCA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qbFt0XSAmJiB0aGlzLmpsW3RdLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzICRjIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZXJpZW5jZSA9IHQsIHRoaXMudUUgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm8ub24odCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubEUgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iby5yZW1vdmUodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZEUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvLnJlbW92ZUFsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmZFID0gKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm8ub25jZSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5wRSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGVyaWVuY2UuaXNWaWV3YWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmJFID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2Uuc2V0Vmlld2FibGVUaHJlc2hvbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMudkUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2UucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm1FID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ0UgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHBlcmllbmNlLmdldFZvbHVtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnlFID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2Uuc2V0Vm9sdW1lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmZsID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnRyaWdnZXJEZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMud0UgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2UuZGlzYWJsZUFkdmVydGlzaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuT0UgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2UuZW5hYmxlQWR2ZXJ0aXNpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy54RSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnNldEN1c3RvbU1hY3Jvcyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5TRSA9IHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnNldEFtcFVzZXJDb25zZW50KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmJvID0gbmV3IFVjKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyaWdnZXIodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvLnRyaWdnZXIodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldERlc3Ryb3llZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKFR0LmIuUmVtb3ZlZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFwaU1ldGhvZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbjogdGhpcy51RSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogdGhpcy5sRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbDogdGhpcy5kRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6IHRoaXMuZkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZpZXdhYmxlOiB0aGlzLnBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Vmlld2FibGVUaHJlc2hvbGQ6IHRoaXMuYkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5OiB0aGlzLnZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2U6IHRoaXMubUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWU6IHRoaXMuZ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWb2x1bWU6IHRoaXMueUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlQWR2ZXJ0aXNpbmc6IHRoaXMud0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVBZHZlcnRpc2luZzogdGhpcy5PRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hY3JvczogdGhpcy54RSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEFtcFVzZXJDb25zZW50OiB0aGlzLlNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveTogdGhpcy5mbAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIE5jIGV4dGVuZHMgJGMgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmpFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpZW5jZS50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmF3ID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpZW5jZS5nZXRTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMua0UgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnNldFNpemUodCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFwaU1ldGhvZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN1cGVyLmdldEFwaU1ldGhvZHMoKSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBsYXllclR5cGU6IHRoaXMuakUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXplOiB0aGlzLmF3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2l6ZTogdGhpcy5rRQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBIYyBleHRlbmRzIE5jIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQpLCB0aGlzLmV4cGVyaWVuY2UgPSB0LCB0aGlzLl9FID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpZW5jZS5nZXRWaWRlb0RldGFpbHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5BRSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGVyaWVuY2UuZ2V0UGxheWxpc3RJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLklFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpZW5jZS5jdXJyZW50VGltZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5DRSA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGVyaWVuY2UuZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuVEUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZXJpZW5jZS50b2dnbGVGdWxsc2NyZWVuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlBFID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gdGhpcy5leHBlcmllbmNlLnNob3dDYXB0aW9ucygpIDogdGhpcy5leHBlcmllbmNlLmhpZGVDYXB0aW9ucygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLk1FID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGVyaWVuY2UudG9nZ2xlRXhwYW5kQnV0dG9uKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkVFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwZXJpZW5jZS5nZXRRdWFsaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuTEUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZXJpZW5jZS5zZXRRdWFsaXR5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLlJFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnNldEF1dG9RdWFsaXR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuQkUgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5leHBlcmllbmNlLmdldEF2YWlsYWJsZVF1YWxpdGllcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkRFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLm5leHRWaWRlbygpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkZFID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBlcmllbmNlLnByZXZWaWRlbygpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBcGlNZXRob2RzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdXBlci5nZXRBcGlNZXRob2RzKCkpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0RldGFpbHM6IHRoaXMuX0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWaWRlb0N1cnJlbnRQb3NpdGlvbjogdGhpcy5JRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZpZGVvRHVyYXRpb246IHRoaXMuQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVGdWxsc2NyZWVuOiB0aGlzLlRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlU3VidGl0bGVzOiB0aGlzLlBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlRnVsbHNjcmVlbkJ1dHRvbjogdGhpcy5NRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBsYXlsaXN0SWQ6IHRoaXMuQUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWFsaXR5OiB0aGlzLkVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UXVhbGl0eTogdGhpcy5MRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEF1dG9RdWFsaXR5OiB0aGlzLlJFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QXZhaWxhYmxlUXVhbGl0aWVzOiB0aGlzLkJFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFZpZGVvOiB0aGlzLkRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlZpZGVvOiB0aGlzLkZFCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIHFjIGV4dGVuZHMgcmUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUsIHMsIG4gPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgfSkoKSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlcih0LCBpLCBlLCByLCBuZXcgY24oZSwgcywgaSwgbikpLCB0aGlzLm1lZGlhdG9yID0gdCwgdGhpcy4kY29udGFpbmVyID0gaSwgdGhpcy5yYiA9IHt9LCB0aGlzLiR1aUNvbnRhaW5lci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBgJHsgbi5iYWNrZ3JvdW5kQ29sb3IgfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhbmRsZUNvbXBvbmVudEV2ZW50KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcWlbcWkuQ2xvc2VCdXR0b25dOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkNsb3NlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB4dFt4dC5FeHBhbmRdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkV4cGFuZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgeHRbeHQuQ29sbGFwc2VdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIHh0W3h0LkNvbGxhcHNlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB6YyBleHRlbmRzIGFjIHsKICAgICAgICAgICAgICAgICAgICBnZXRMb2dvUG9zaXRpb25DbGFzcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbUxlZnQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VpLWhvbWUtc2NyZWVuLWxvZ28tYm90dG9tLWxlZnQnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbVJpZ2h0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1aS1ob21lLXNjcmVlbi1sb2dvLWJvdHRvbS1yaWdodCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuVG9wTGVmdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndWktaG9tZS1zY3JlZW4tbG9nby10b3AtbGVmdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuVG9wUmlnaHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncy5pc0Nsb3NlQnV0dG9uID8gJ3VpLWhvbWUtc2NyZWVuLWxvZ28tdG9wLWxlZnQnIDogJ3VpLWhvbWUtc2NyZWVuLWxvZ28tdG9wLXJpZ2h0JzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5DZW50ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VpLWhvbWUtc2NyZWVuLWxvZ28tY2VudGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRMb2dvVGVtcGxhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgPGNueCBjbGFzcz0iY254LWxvZ28tYmFyICR7IHRoaXMuZ2V0TG9nb1Bvc2l0aW9uQ2xhc3ModGhpcy5zZXR0aW5ncy5sb2dvUG9zaXRpb24pIH0iPltbJHsgcWkuTG9nb091dHN0cmVhbSB9XV08L2NueD5gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdGVtcGxhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxuICAgICAgICA8Y254IGNsYXNzPSJjbngtdWkgY254LXVpLWhvbWUtc2NyZWVuIj5cbiAgICAgICAgJHsgdGhpcy5nZXRMb2dvVGVtcGxhdGUoKSB9XG4gICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktYmFyIj5cbiAgICAgICAgICAgICAgICA8Y254IGNsYXNzPSJjbngtdWktaGVhZC1idXR0b25zIj5cbiAgICAgICAgICAgICAgICAgICAgJHsgdGhpcy5pc0Fsd2F5c09uKCkgPyAnJyA6IHRoaXMuY2xvc2VCdXR0b24gfVxuICAgICAgICAgICAgICAgIDwvY254PlxuICAgICAgICAgICAgICAgICR7IHRoaXMuaXNBbHdheXNPbigpID8gdGhpcy5jbG9zZUJ1dHRvbiA6ICcnIH1cbiAgICAgICAgICAgIDwvY254PlxuICAgICAgICAgICR7IChudWxsID09PSAoaSA9IG51bGwgPT09ICh0ID0gdGhpcy5zZXR0aW5ncykgfHwgdm9pZCAwID09PSB0ID8gdm9pZCAwIDogdC51aUNvbXBvbmVudHNWaXNpYmlsaXR5KSB8fCB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBpLmV4cGFuZEJ1dHRvbikgPyBgPGNueCBjbGFzcz0iY254LWFkLWV4cGFuZC1idXR0b24gY254LXVpLWJ0biI+W1skeyBxaS5FeHBhbmRCdXR0b24gfV1dPC9jbng+YCA6ICcnIH1cbiAgICAgICAgPC9jbng+YC50cmltKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgV2MgZXh0ZW5kcyBNbyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZW50ZXJGdWxsU2NyZWVuID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sQy5lbnRlckZ1bGxTY3JlZW4oKS50aGVuKCkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ091dHN0cmVhbUFkSGFuZGxlcl9lbnRlckZ1bGxzY3JlZW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5leGl0RnVsbHNjcmVlbiA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubEMuZXhpdEZ1bGxTY3JlZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5ncCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBUdC5jLkZ1bGxzY3JlZW5DaGFuZ2VkLCB7IHBheWxvYWQ6ICExIH0pLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgeHRbeHQuQ29sbGFwc2VdLCB7IHBheWxvYWQ6ICExIH0pLCB0aGlzLk1tLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZS5lbmFibGVTY3JvbGxFdmVudCgpLCB0aGlzLk1tLnNlcnZpY2VzLkV2ZW50c1N0b3JhZ2VTZXJ2aWNlLmVtaXRPbkV4aXRGdWxsc2NyZWVuKCksIHRoaXMuSG0uY29sbGFwc2UoKSwgdGhpcy5zZXRWYXN0Vmlld01vZGUoUHQuYS5Ob3JtYWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLm1wID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYXRvci5wdWJsaXNoKHRoaXMsIFR0LmMuRnVsbHNjcmVlbkNoYW5nZWQsIHsgcGF5bG9hZDogITAgfSksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCB4dFt4dC5FeHBhbmRdLCB7IHBheWxvYWQ6ICExIH0pLCB0aGlzLk1tLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZS5kaXNhYmxlU2Nyb2xsRXZlbnQoKSwgdGhpcy5NbS5zZXJ2aWNlcy5FdmVudHNTdG9yYWdlU2VydmljZS5lbWl0T25FbnRlckZ1bGxzY3JlZW4oKSwgdGhpcy5IbS5leHBhbmQoKSwgdGhpcy5zZXRWYXN0Vmlld01vZGUoUHQuYS5GdWxsc2NyZWVuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaW5pdEZ1bGxTY3JlZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubEMgPSBuZXcgX3QodGhpcywgdGhpcy5NbS5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuJG0ucGFyZW50RWxlbWVudCwgdGhpcy5NbS5jb25maWcub3Mub3MpLCB0aGlzLlNDKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFNDKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZSh4dFt4dC5FeHBhbmRdLCB0aGlzLkhtLCB0aGlzLmVudGVyRnVsbFNjcmVlbiksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNvbGxhcHNlXSwgdGhpcy5IbSwgdGhpcy5leGl0RnVsbHNjcmVlbiksIHRoaXMuc3Vic2NyaWJlKE90LmV4aXQsIHRoaXMubEMsIHRoaXMuZ3ApLCB0aGlzLnN1YnNjcmliZShPdC5lbnRlciwgdGhpcy5sQywgdGhpcy5tcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgR2MgZXh0ZW5kcyBSbyB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuZXZlbnRzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBUdC5iKSwgQyksIHRoaXMuVkUgPSAhMSwgdGhpcy5VRSA9ICExLCB0aGlzLiRFID0gITEsIHRoaXMuTkUgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtaGVpZ2h0JyA9PT0gdC5wcm9wZXJ0eU5hbWUgJiYgKHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIHRoaXMuTkUpLCB0aGlzLmhhbmRsZUNsb3NlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBycCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXYyh0aGlzLCB0aGlzLmNwLCB0aGlzLiRwbGF5ZXJDb250YWluZXIsIHRoaXMuY2hlY2tGbG9hdGluZ1ZpZXdhYmlsaXR5KHRoaXMuaXNWaWV3YWJsZSgpKSwgdGhpcy5lcCwgdGhpcy5hcHAsIHRoaXMuWmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBIRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy5hZEhhbmRsZXIuaW5JbXByZXNzaW9uID8gdGhpcy5WRSA9ICEwIDogdGhpcy5xRSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBxRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIgJiYgdGhpcy51bnN1YnNjcmliZUFsbCh0aGlzLmFkSGFuZGxlciksIHRoaXMuZ2Yub25TdG9wKCksIHRoaXMuY3Aub3V0c3RyZWFtU2V0dGluZ3MuZW5kQWRCcmVha1BvbGljeSA9PT0gTS5Qcm90b091dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3lFbnVtLkhpZGUgJiYgdGhpcy56RSghMCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBDLkFkQ3ljbGVDb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFdFKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29Qb3NpdGlvbjogdGhpcy5jcC5sb2dvUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb1VybDogdGhpcy5jcC5sb2dvVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xvc2VCdXR0b246IHRoaXMuY3AuaXNDbG9zZUJ1dHRvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbk1vZGU6IHRoaXMuY3AuY2xvc2VCdXR0b25Nb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5jcC5vdXRzdHJlYW1TZXR0aW5ncy5ob3VzZVNjcmVlbkJhY2tncm91bmRDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbXBvbmVudHNWaXNpYmlsaXR5OiB7IGV4cGFuZEJ1dHRvbjogdGhpcy5jcC51aUNvbXBvbmVudHNWaXNpYmlsaXR5LmV4cGFuZEJ1dHRvbiAmJiB0aGlzLmFwcC5jb25maWcub3Mub3MgIT09IFN0LmIuSW9zIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBuZXcgemModCkudGVtcGxhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR0UgPSBuZXcgcWModGhpcywgdGhpcy4kcGxheWVyQ29udGFpbmVyLCB0aGlzLmFwcC5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuYXBwLnNlcnZpY2VzLkludGVyYWN0aW9uU2VydmljZSwgdCwgaSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LkNsb3NlXSwgdGhpcy5HRSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuRXhwYW5kXSwgdGhpcy5HRSwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZEhhbmRsZXIuZW50ZXJGdWxsU2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5Db2xsYXBzZV0sIHRoaXMuR0UsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRIYW5kbGVyLmV4aXRGdWxsc2NyZWVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBKRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kRSAmJiAoT2JqZWN0KFQuSSkodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciwgZC5nLkNvbGxhcHNlZCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBDLkNvbGxhcHNlZCwgeyBwYXlsb2FkOiAhMSB9KSwgdGhpcy4kRSA9ICExLCB0aGlzLlFmKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6RSh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgdGhpcy5ORSksIHRoaXMuaGFuZGxlQ2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQpLCB0aGlzLk5FKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy4kZXhwZXJpZW5jZUNvbnRhaW5lciwgZC5nLkNvbGxhcHNlZCksIHRoaXMubWVkaWF0b3IucHVibGlzaCh0aGlzLCBDLkNvbGxhcHNlZCwgeyBwYXlsb2FkOiAhMCB9KSwgdGhpcy4kRSA9ICEwLCB0aGlzLkpmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUUUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGV4cGVyaWVuY2VDb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gYCR7IHRoaXMuJHBsYXllckNvbnRhaW5lci5jbGllbnRIZWlnaHQgfXB4YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgWEUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuR0UgJiYgdGhpcy5HRS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFlFKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdFICYmIHRoaXMuR0Uuc2hvdygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB1aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudWgoKSwgdGhpcy5RRSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPZih0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuT2YodCksIHRoaXMuVkUgJiYgdGhpcy5xRSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbCh0LCBpID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2wodCwgaSksICF0aGlzLlVFICYmIHQgJiYgKHRoaXMuVUUgPSAhMCwgdGhpcy5LRSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXAuaXNJbkFkUG9kKCkgPyB0aGlzLnVwKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2Yub25BZEZpbmlzaGVkKHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbiwgdGhpcy5lcC5pc0luQWRQb2QoKSksIHN1cGVyLm9wKCksIHRoaXMuWUUoKSwgdGhpcy5lcC5zZXROZXdCcmVhayhNLlByb3RvQWRTbG90c0VudW0uTWlkUm9sbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHN1cGVyLm9wKCksIHRoaXMuZXAuc2V0TmV3QnJlYWsoTS5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwpLCB0aGlzLllFKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5ZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIueWYoKSwgdGhpcy5YRSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRQbGF5ZXJTaXplKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5hZGRQbGF5ZXJTaXplKCksIHRoaXMuY3AucGxheWVyU2l6ZS5yZXNwb25zaXZlID8gdGhpcy4kcGxheWVyV3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLnlwKCkpIDogdGhpcy5zZXRGaXhlZFNpemUodGhpcy4kcGxheWVyV3JhcHBlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJwKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBLRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3AuYWRQbGF5YmFja01vZGUgPT09IE0uUHJvdG9BZFBsYXliYWNrTW9kZS5TY3JvbGxUb1BsYXkgJiYgIXRoaXMuVUUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuWGYoTS5Qcm90b0FkU2xvdHNFbnVtLk1pZFJvbGwpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdmLmNvbnRlbnRQbGF5YmFja1N0YXRlQ2hhbmdlZCghMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRwKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnFmKE1pLmEuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpFKCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnN0YXJ0KCksIHRoaXMuYWRIYW5kbGVyID8gKHRoaXMuYWRIYW5kbGVyLnN0YXJ0KHRoaXMuJHBsYXllckNvbnRhaW5lci5jbGllbnRXaWR0aCwgdGhpcy4kcGxheWVyQ29udGFpbmVyLmNsaWVudEhlaWdodCwgdGhpcy5jcC5zb3VuZE1vZGUgPT09IE0uUHJvdG9QbGF5ZXJTb3VuZE1vZGUuT24gPyAxIDogMCwgdGhpcy5jcC51aUNvbXBvbmVudHNWaXNpYmlsaXR5LmV4cGFuZEJ1dHRvbiAmJiB0aGlzLmFwcC5jb25maWcub3Mub3MgIT09IFN0LmIuSW9zKSwgdGhpcy5hZEhhbmRsZXIuaW5pdEZ1bGxTY3JlZW4oKSwgdGhpcy5nZi5mb3JjZVJlY2hlY2soKSwgdGhpcy5zdWJzY3JpYmUoUHQuYi5BZEltcHJlc3Npb24sIHRoaXMuYWRIYW5kbGVyLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5KRSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKHh0W3h0LlZvbHVtZV0sIHRoaXMuYWRIYW5kbGVyLCAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHt2b2x1bWU6IHR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5paCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLnN1YnNjcmliZSh4dFt4dC5FeHBhbmRdLCB0aGlzLmFkSGFuZGxlciwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5zdWJzY3JpYmUoeHRbeHQuQ29sbGFwc2VdLCB0aGlzLmFkSGFuZGxlciwgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGFwc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IHRoaXMuekUoKSwgdGhpcy5LRSgpLCB0aGlzLnN1YnNjcmliZSgkdC5NaWRSb2xsQ2FwcGVkLCB0aGlzLmdmLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5IRSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuc3Vic2NyaWJlKCR0LlRvdGFsQWRCcmVha0xlbmd0aEV4cGlyZWQsIHRoaXMuZ2YsICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkhFKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5jcC5vdXRzdHJlYW1TZXR0aW5ncy5pbml0aWFsUmVuZGVyaW5nID09PSBNLlByb3RvT3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZ0VudW0uRXhwYW5kV2l0aEFkICYmICh0aGlzLnpFKCksIE9iamVjdChULmkpKHRoaXMuJHBsYXllckNvbnRhaW5lcikpLCBPYmplY3QoVC5hKSh0aGlzLiRleHBlcmllbmNlQ29udGFpbmVyLCBkLmguQ29sbGFwc2FibGUpLCB0aGlzLlFFKCksIHRoaXMuY3Aub3V0c3RyZWFtQWRBc0NvbnRlbnQgfHwgdGhpcy5XRSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ091dHNyZWFtX3N0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRWb2x1bWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkSGFuZGxlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFkSGFuZGxlci5nZXRWb2x1bWUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGN1cnJlbnRUaW1lKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGR1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpLCB0aGlzLkdFICYmIHRoaXMuR0UuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleHBhbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSAodCA9IHRoaXMuR0UpIHx8IHZvaWQgMCA9PT0gdCB8fCB0LmdldENvbXBvbmVudChxaS5FeHBhbmRCdXR0b24pLnNldFN0YXRlKGhlLmV4cGFuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gKHQgPSB0aGlzLkdFKSB8fCB2b2lkIDAgPT09IHQgfHwgdC5nZXRDb21wb25lbnQocWkuRXhwYW5kQnV0dG9uKS5zZXRTdGF0ZShoZS5jb2xsYXBzZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgSmMgZXh0ZW5kcyBOYyB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBRYyBleHRlbmRzIHRjIHsKICAgICAgICAgICAgICAgICAgICBwbGF5KCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50TCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLldDID0geS5QbGF5aW5nU3RhdGUsIHRoaXMudEwgPSAhMSwgdm9pZCB0aGlzLnFDKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSEMoeS5MaXZlU3RyZWFtU3RhcnRpbmcpID8gdGhpcy5qQy5nZXRDdXJyZW50VmlkZW9EYXRhKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua0MucGxheSgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSkMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHN1cGVyLnBsYXkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGF1c2UodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSEMoeS5MaXZlU3RyZWFtRW5kZWQpIHx8IHRoaXMuSEMoeS5MaXZlU3RyZWFtU3RhcnRpbmcpIHx8IHRoaXMuSEMoeS5MaXZlU3RyZWFtU3RvcHBlZCkgfHwgKHQgJiYgKHRoaXMudEwgPSAhMCksIHN1cGVyLnBhdXNlKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZSgpLCB0aGlzLmhhbmRsZVZpZGVvRW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVudGVyTGl2ZU5vdFN1cHBvcnRlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5OQyh5LkxpdmVTdHJlYW1Ob3RTdXBwb3J0ZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBGQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5WQyA9IHkuTGl2ZVN0cmVhbVN0YXJ0aW5nLCB0aGlzLlVDID0geS5MaXZlU3RyZWFtU3RhcnRpbmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhDKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLk5DKHkuTGl2ZVN0cmVhbUVuZGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSkMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua0MucGF1c2UoKSwgdGhpcy5OQyh5LkxpdmVTdHJlYW1TdG9wcGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBYYyBleHRlbmRzIEhpIHsKICAgICAgICAgICAgICAgICAgICBpbml0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLkxpdmVQb3N0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0LnNldE1lc3NhZ2VUb1N0YXJ0aW5nKCksIHQuc2hvdygpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5yZW1vdmVPdmVybGF5Q2xpY2tFdmVudHMoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuZGlzYWJsZUhvdmVyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5MaXZlUG9zdGVyKS5oaWRlKCksIHRoaXMuY29udGV4dC5zZXRGdWxsUHJvZ3Jlc3NCYXJVSSgpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5hZGRPdmVybGF5Q2xpY2tFdmVudHMoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUuZW5hYmxlSG92ZXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBZYyBleHRlbmRzIEhpIHsKICAgICAgICAgICAgICAgICAgICBpbml0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSB0aGlzLmNvbnRleHQuZ2V0Q29tcG9uZW50KHFpLkxpdmVQb3N0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJHVpQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoZC5qLkxpdmVFbmRlZCksIHQuc2V0TWVzc2FnZVRvRW5kZWQoKSwgdC5zaG93KCksIHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuTGl2ZUljb24pLmhpZGVDb21wb25lbnQoKSwgdGhpcy5jb250ZXh0Lm92ZXJsYXlNb2R1bGUucmVtb3ZlT3ZlcmxheUNsaWNrRXZlbnRzKCksIHRoaXMuY29udGV4dC5vdmVybGF5TW9kdWxlLmRpc2FibGVIb3ZlcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBleGl0U3RhdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgS2MgZXh0ZW5kcyBjYyB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuTGl2ZVBvc3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGlkZU1lc3NhZ2UoKSwgdC5zaG93KCksIHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuTGl2ZUljb24pLnNob3dDb21wb25lbnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5leGl0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuY29udGV4dC5nZXRDb21wb25lbnQocWkuTGl2ZVBvc3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuaGlkZSgpLCB0LnNob3dNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgWmMgZXh0ZW5kcyBIaSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5jb250ZXh0LmdldENvbXBvbmVudChxaS5MaXZlUG9zdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQuYSkodGhpcy5jb250ZXh0LiR1aUNvbnRhaW5lciwgZC5qLkxpdmVFbmRlZCksIHQuc2V0TWVzc2FnZVRvTm90U3VwcG9ydGVkKCksIHQuc2hvdygpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5oaWRlVWlDb250cm9scygpLCB0aGlzLmNvbnRleHQub3ZlcmxheU1vZHVsZS5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGV4aXRTdGF0ZSgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB0dSBleHRlbmRzIHZjIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5pTCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LkxpdmVTdHJlYW1TdGFydGluZ106IG5ldyBYYyh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LkxpdmVTdHJlYW1FbmRlZF06IG5ldyBZYyh0aGlzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt5LkxpdmVTdHJlYW1TdG9wcGVkXTogbmV3IEtjKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgW3kuTGl2ZVN0cmVhbU5vdFN1cHBvcnRlZF06IG5ldyBaYyh0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdGFydCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yYiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yYiksIHRoaXMuaUwpLCBzdXBlci5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblJlc2l6ZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9uUmVzaXplKHQpLCB0aGlzLnNldEZ1bGxQcm9ncmVzc0JhclVJKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZ1bGxQcm9ncmVzc0JhclVJKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEZ1bGxQcm9ncmVzc0JhclVJKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5nZXRDb21wb25lbnQocWkuUHJvZ3Jlc3NCYXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuc2V0UHJvZ3Jlc3MoMTAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZFAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmJbeS5MaXZlU3RyZWFtU3RhcnRpbmddLmVudGVyU3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudFZpZGVvKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudXBkYXRlQ3VycmVudFZpZGVvKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5nZXRDb21wb25lbnQocWkuTGl2ZVBvc3Rlcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdC5nZXRUaHVtYm5haWxVcmwodGhpcy4kdWlDb250YWluZXIuY2xpZW50V2lkdGgsIHRoaXMuJHVpQ29udGFpbmVyLmNsaWVudEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldFBvc3RlclNyYyhlKSwgaS5zZXRQb3N0ZXJBbHRUZXh0KHQuYWx0VGV4dCksIE9iamVjdChydC5oKSh0LnN0YXJ0RGF0ZSkgJiYgaS5oYW5kbGVEZWxheWVkU3RhcnQodC5zdGFydERhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgaXUgZXh0ZW5kcyBFYyB7CiAgICAgICAgICAgICAgICAgICAgcGxheSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuUk0ubGl2ZVN5bmNQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKHRoaXMuQ00uY3VycmVudFRpbWUgPSB0KSwgc3VwZXIucGxheSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbmRPZlN0cmVhbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5STS5kZXRhY2hNZWRpYSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaGxzU3VwcG9ydGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5PTTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRU0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuQk0gJiYgdGhpcy5CTS5pc1BlbmRpbmcgJiYgdGhpcy5CTS5yZWplY3QoKSwgdGhpcy5STS5kZXRhY2hNZWRpYSgpLCB0aGlzLm1lZGlhdG9yLnB1Ymxpc2godGhpcywgTy5MaXZlU3RyZWFtTm90UGxheWFibGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGV1ID0gMTAsIHN1ID0gMTA7CiAgICAgICAgICAgICAgICBjbGFzcyBudSBleHRlbmRzIG5jIHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5lTCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNMID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5lbmRPZlN0cmVhbSgpLCB0aGlzLmtDLmVuZE9mU3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydCgpLCB0aGlzLm5MKCksIHRoaXMuckwoKSwgdGhpcy5iVCgpLCB0aGlzLmtDLmhsc1N1cHBvcnRlZCA/ICh0aGlzLmtDLnN0YXJ0KCksIHRoaXMuZlQoKSwgdGhpcy5lTCgpKSA6IHRoaXMubFQuZW50ZXJMaXZlTm90U3VwcG9ydGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaEwoKSwgdGhpcy5hTCgpLCBzdXBlci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5MKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZShPLkVuZE9mU3RyZWFtLCB0aGlzLmtDLCB0aGlzLnNMKSwgdGhpcy5zdWJzY3JpYmUoTy5MZXZlbFN3aXRjaGluZywgdGhpcy5rQywgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5vbkVudGVyQnVmZmVyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByTCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxheShfLk5ld1RodW1ibmFpbCwgdGhpcy5kVCwgdGhpcywgdGhpcy5tZWRpYXRvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF9UKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBhYyh0LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZFQgPSBuZXcgdHUodGhpcywgdGhpcy5NbS5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuTW0uc2VydmljZXMuSW50ZXJhY3Rpb25TZXJ2aWNlLCB0aGlzLkNtLCBpLnRlbXBsYXRlLCB0LCB0aGlzLk1tLmNvbmZpZy5hcHBJZCwgdGhpcy55bSksIHRoaXMuZFQuc3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSVQodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9MKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5VCgpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdlQoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJUKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlUm9sbEJyZWFrOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSb2xsQnJlYWs6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0aGlzLmNwLCBlID0gT2JqZWN0KHJ0LmUpKHQpLCBzID0gT2JqZWN0KHJ0LmUpKGkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxUID0gbmV3IFFjKHRoaXMsIHRoaXMuakMsIHRoaXMua0MsIGUsIHMsIHRoaXMuTW0uY29uZmlnLm9zLm9zID09PSBTdC5iLklvcywgdGhpcy5jcC52aWRlb1Bvc2l0aW9uKSwgc3VwZXIuYlQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY1QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNUKCksIHRoaXMuc3Vic2NyaWJlKE8uTGl2ZVN0cmVhbU5vdFBsYXlhYmxlLCB0aGlzLmtDLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jTCksIHRoaXMuY0wgPSBzZXRUaW1lb3V0KHRoaXMuZUwsIHN1ICogcXQuZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBrVCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua0MgPSBuZXcgaXUodGhpcywgdGhpcy5NbSwgdGhpcy5NbS5zZXJ2aWNlcy5HbG9iYWxEb21VdGlsc1NlcnZpY2UsIHRoaXMuQ20sIHRoaXMuTW0uc2VydmljZXMuUmVzaXplT2JzZXJ2ZXIsIGksIHQsIHRoaXMuY3AudmlkZW9Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9MKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oTCgpLCB0ICYmICh0aGlzLnVMID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sVC5pc0luUGxheWluZ1N0YXRlKCkgJiYgKHRoaXMuc0woKSwgdGhpcy5oTCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZXUgKiBxdC5mKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVMICYmIChjbGVhckludGVydmFsKHRoaXMudUwpLCB0aGlzLnVMID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNMICYmIChjbGVhckludGVydmFsKHRoaXMuY0wpLCB0aGlzLmNMID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3MgcnUgZXh0ZW5kcyBObyB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0xpdmVFeHBlcmllbmNlX3N0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5YSSA9IG5ldyBudSh0aGlzLCB0aGlzLmNwLCB0aGlzLmFwcCwgdGhpcy4kcGxheWVyQ29udGFpbmVyLCB0aGlzLmJyZWFrUG9pbnRzSGFuZGxlci5jdXJyZW50QnJlYWtwb2ludENsYXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb3AoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXAuaXNJbkFkUG9kKCkgPyB0aGlzLnVwKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2Yub25BZEZpbmlzaGVkKHRoaXMuYWRIYW5kbGVyLmluSW1wcmVzc2lvbiwgdGhpcy5lcC5pc0luQWRQb2QoKSksIHN1cGVyLm9wKCksIHRoaXMuWEkuc2hvdyghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHN1cGVyLm9wKCksIHRoaXMuWEkuc2hvdyghMCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBiQygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuYkMoKSwgdGhpcy5zdWJzY3JpYmUoXy5OZXdUaHVtYm5haWwsIHRoaXMuWEksICh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7dGh1bWJuYWlsVXJsOiB0fQogICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkSGFuZGxlciAmJiB0aGlzLmFkSGFuZGxlci5zZXRBZExvYWRpbmdCYWNrZ3JvdW5kVXJsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBodSBleHRlbmRzIHYgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLlRvID0gJ2NueC1lbCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUV4cGVyaWVuY2UodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmlzSW5TdHJlYW1UeXBlKCkgPyAodGhpcy5leHBlcmllbmNlID0gbmV3IFZjKHRoaXMsIHRoaXMuSHMsIGksIHRoaXMuYXBwLnNlcnZpY2VzLlVybFN1ZmZpeGVyU2VydmljZSksIHRoaXMuZXhwZXJpZW5jZUFwaSA9IG5ldyBIYyh0aGlzLmV4cGVyaWVuY2UpKSA6IHQuaXNMaXZlVHlwZSgpID8gKHRoaXMuZXhwZXJpZW5jZSA9IG5ldyBydSh0aGlzLCB0aGlzLkhzLCBpLCB0aGlzLmFwcC5zZXJ2aWNlcy5VcmxTdWZmaXhlclNlcnZpY2UpLCB0aGlzLmV4cGVyaWVuY2VBcGkgPSBuZXcgSGModGhpcy5leHBlcmllbmNlKSkgOiAodGhpcy5leHBlcmllbmNlID0gbmV3IEdjKHRoaXMsIHRoaXMuSHMsIGksIHRoaXMuYXBwLnNlcnZpY2VzLlVybFN1ZmZpeGVyU2VydmljZSksIHRoaXMuZXhwZXJpZW5jZUFwaSA9IG5ldyBKYyh0aGlzLmV4cGVyaWVuY2UpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNTdXBwb3J0ZWRCcmVha3BvaW50KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVUb0V2ZW50cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc3Vic2NyaWJlVG9FdmVudHMoKSwgdGhpcy5wbGF5ZXJNb2RlbC5odG1sICYmIHRoaXMuc3Vic2NyaWJlKEEuTWVkaWFNZXRhVXBkYXRlLCB0aGlzLmV4cGVyaWVuY2UsICh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNYWNyb0NvbnRlbnQodGhpcy5tYWNyb0VsZW1lbnRzLnRpdGxlLCB0KSwgdGhpcy51cGRhdGVNYWNyb0NvbnRlbnQodGhpcy5tYWNyb0VsZW1lbnRzLmRlc2NyaXB0aW9uLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEFwaU1ldGhvZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4cGVyaWVuY2VBcGkuZ2V0QXBpTWV0aG9kcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGF1IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sTCA9IFtdLCB0aGlzLmRMID0gMCwgdGhpcy5mTCA9ICExLCB0aGlzLnBMID0gdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxMLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0ICE9PSBpLmVsZW1lbnQgfHwgdGhpcy5iTChpLCB0aGlzLmRMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2TCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5sTC5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IChpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkUGVyY2VudEluVmlldzogMAogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmxMLnB1c2goaSkpLCBpLmxpc3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJMKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5saXN0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdC5jYWxsYmFja1NlbnQgJiYgdC50aHJlc2hvbGQgPD0gaSA/ICh0LmNhbGxiYWNrU2VudCA9ICEwLCB0LnRpbWVvdXQgPSBPYmplY3QoTGkuYSkodC5jYWxsYmFjaywgdC5jYWxsYmFja0RlbGF5LCAhMCwgdGhpcy5mTCkpIDogdC5jYWxsYmFja1NlbnQgJiYgdC50aHJlc2hvbGQgPiBpICYmICh0LmNhbGxiYWNrU2VudCA9ICExLCBjbGVhclRpbWVvdXQodC50aW1lb3V0KSwgdC50aW1lb3V0ID0gT2JqZWN0KExpLmEpKHQuY2FsbGJhY2ssIDAsICExLCB0aGlzLmZMKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbih0LCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudkwodCkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQ6IGUudGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tTZW50OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRGVsYXk6IGUuY2FsbGJhY2tEZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogaQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5wTCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvZmYodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5sTC5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gZS5saXN0Lmxlbmd0aDsgdC0tOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxpc3RbdF0uY2FsbGJhY2sgPT09IGkgJiYgZS5saXN0LnNwbGljZSh0LCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGUubGlzdC5sZW5ndGggJiYgdGhpcy5sTC5zcGxpY2UodGhpcy5sTC5pbmRleE9mKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaGVjayh0ID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdGhyZXNob2xkOiAwLjEgfTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRMID49IHQudGhyZXNob2xkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVjaGVjayh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucEwodCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1MKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mTCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldFZpZXdhYmxlVGhyZXNob2xkKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kTCA9IHQsIHRoaXMudHJpZ2dlclJlY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0SXNUYWJJbkZvY3VzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHQgPSB0aGlzLmxMLmxlbmd0aDsgdC0tOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMubExbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gaS5saXN0Lmxlbmd0aDsgdC0tOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaS5saXN0W3RdLnRpbWVvdXQpLCB0aGlzLm9mZihpLmVsZW1lbnQsIGkubGlzdFt0XS5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgb3UsIGN1LCB1dSA9IGUoMzApOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0Lm5vbmUgPSAwXSA9ICdub25lJywgdFt0LmZyaWVuZGx5ID0gMV0gPSAnZnJpZW5kbHknLCB0W3Quc2FmZSA9IDJdID0gJ3NhZmUnOwogICAgICAgICAgICAgICAgfShvdSB8fCAob3UgPSB7fSkpOwogICAgICAgICAgICAgICAgY2xhc3MgbHUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZSA9IHQsIHRoaXMuZ0wgPSBpLCB0aGlzLmxMID0gW10sIHRoaXMueUwgPSBvdS5ub25lLCB0aGlzLndMID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uT2JzZXJ2ZXI6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tJbXBsZW1lbnRhdGlvbjogITEKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5PTCA9IG51bGwsIHRoaXMueEwgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNQogICAgICAgICAgICAgICAgICAgICAgICBdLCB0aGlzLlNMID0gMjUwLCB0aGlzLmpMID0gITEsIHRoaXMua0wgPSB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuakwgPSB0LCB0aGlzLnBMKCksIGYuYS5zZXRGb2N1c1N0YXRlKHQpLCB1dS5hLnBhZ2VGb2N1cyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucEwgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxMLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuZEwodC5lbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uVmlld0hhbmRsZSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLl9MID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gdGhpcy5PTCAmJiAodGhpcy5PTCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucEwoKSwgY2xlYXJUaW1lb3V0KHRoaXMuT0wpLCB0aGlzLk9MID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuU0wpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5BTChlKSwgdGhpcy5JTCgpLCB0aGlzLkNMKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIENMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdMLm9uKHRoaXMua0wpLCB1dS5hLnBhZ2VGb2N1cyA9IHRoaXMuZ0wuaXNEb2N1bWVudFZpc2libGUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQUwodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLkludGVyc2VjdGlvbk9ic2VydmVyICYmICF0ID8gdGhpcy53TC5pbnRlcnNlY3Rpb25PYnNlcnZlciA9ICEwIDogdGhpcy53TC5mYWxsYmFja0ltcGxlbWVudGF0aW9uID0gITAsIHRoaXMuZmUuc2VsZiAhPT0gdGhpcy5mZS50b3AgPyAodGhpcy5UTCA9IHRoaXMuUEwodGhpcy5mZSksIG51bGwgIT09IHRoaXMuVEwgPyB0aGlzLnlMID0gb3UuZnJpZW5kbHkgOiB0aGlzLnlMID0gb3Uuc2FmZSkgOiB0aGlzLlRMID0gdGhpcy5mZS5mcmFtZUVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFBMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPSB0LnBhcmVudCkgPT09IHRoaXMuZmUudG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmZyYW1lRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuUEwoaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIElMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndMLmludGVyc2VjdGlvbk9ic2VydmVyID8gdGhpcy5NTCA9IG5ldyB0aGlzLmZlLkludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMub25PYnNlcnZlckVudGVyLmJpbmQodGhpcyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TWFyZ2luOiAnMHB4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogdGhpcy54TAogICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICh0aGlzLmZlLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX0wpLCB0aGlzLmZlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLnBMKSwgdGhpcy5mZS5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnBMKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEVMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubEwuZmluZChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmVsZW1lbnQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkTCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnlMID09PSBvdS5zYWZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0gdGhpcy5FTCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpID8gaS5jYWNoZWRQZXJjZW50SW5WaWV3IDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJhdGlvOiBlLmJvdHRvbSAvIGUuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFJhdGlvOiAodGhpcy5mZS50b3AuaW5uZXJIZWlnaHQgLSBlLnRvcCkgLyBlLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0UmF0aW86ICh0aGlzLmZlLnRvcC5pbm5lcldpZHRoIC0gZS5sZWZ0KSAvIGUud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRSYXRpbzogZS5yaWdodCAvIGUud2lkdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t0XSA8PSAwICYmIChpID0gMCksIHNbdF0gPiAwICYmIHNbdF0gPCAxICYmIChpICo9IHNbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgb25PYnNlcnZlckVudGVyKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sTC5maWx0ZXIoaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCA9PT0gdC50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25WaWV3SGFuZGxlKGksIHQuaW50ZXJzZWN0aW9uUmF0aW8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvblZpZXdIYW5kbGUodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmNhY2hlZFBlcmNlbnRJblZpZXcgPSBpLCB0Lmxpc3QuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0LmNhbGxiYWNrU2VudCAmJiB0LnRocmVzaG9sZCA8PSBpICYmIHRoaXMuakwgPyAodC5jYWxsYmFja1NlbnQgPSAhMCwgdC50aW1lb3V0ID0gT2JqZWN0KExpLmEpKHQuY2FsbGJhY2ssIHQuY2FsbGJhY2tEZWxheSwgITApKSA6IHQuY2FsbGJhY2tTZW50ICYmICh0LnRocmVzaG9sZCA+IGkgfHwgIXRoaXMuakwpICYmICh0LmNhbGxiYWNrU2VudCA9ICExLCBjbGVhclRpbWVvdXQodC50aW1lb3V0KSwgdC50aW1lb3V0ID0gT2JqZWN0KExpLmEpKHQuY2FsbGJhY2ssIDAsICExKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvbih0LCBpLCBlID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMud0wuZmFsbGJhY2tJbXBsZW1lbnRhdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnlMID09PSBvdS5mcmllbmRseSAmJiB0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgIT09IHRoaXMuZmUudG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0aGlzLlRMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy55TCA9PT0gb3Uuc2FmZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3QoTGkuYSkoaSwgMCwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbiA9IHRoaXMubEwuZmluZChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmVsZW1lbnQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBuID8gcyA9ICEwIDogKG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZWRQZXJjZW50SW5WaWV3OiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubEwucHVzaChuKSksIG4ubGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZDogZS50aHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1NlbnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tEZWxheTogZS5jYWxsYmFja0RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLndMLmludGVyc2VjdGlvbk9ic2VydmVyID8gKHMgJiYgdGhpcy5NTC51bm9ic2VydmUodCksIHRoaXMuTUwub2JzZXJ2ZSh0KSkgOiB0aGlzLndMLmZhbGxiYWNrSW1wbGVtZW50YXRpb24gJiYgdGhpcy5wTCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvZmYodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gdGhpcy5sTC5maW5kKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZWxlbWVudCA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcyA9IGUubGlzdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgczspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0tLCBlLmxpc3Rbc10uY2FsbGJhY2sgPT09IGkgJiYgZS5saXN0LnNwbGljZShzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGUubGlzdC5sZW5ndGggJiYgKHRoaXMuTUwgJiYgdGhpcy5NTC51bm9ic2VydmUodCksIHRoaXMubEwuc3BsaWNlKHRoaXMubEwuaW5kZXhPZihlKSwgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNoZWNrKHQgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aHJlc2hvbGQ6IDAuMSB9OwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LmVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gdC5lbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55TCA9PT0gb3UuZnJpZW5kbHkgJiYgKGkgPSB0aGlzLlRMKSwgdGhpcy5kTChpKSA+PSB0LnRocmVzaG9sZCAmJiB0aGlzLmpMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUmVjaGVjayh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud0wuZmFsbGJhY2tJbXBsZW1lbnRhdGlvbiAmJiB0ICYmIHRoaXMubEwuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmVsZW1lbnQgPT09IHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5kTChpLmVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25WaWV3SGFuZGxlKGksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0Vmlld2FibGVUaHJlc2hvbGQodCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRJc1RhYkluRm9jdXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmpMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmUodCwgaSkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX0wpLCB0aGlzLmZlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLnBMKSwgdGhpcy5mZS5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnBMKSwgW10uc2xpY2UuY2FsbCh0aGlzLmxMKS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbCh0Lmxpc3QpLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmYodC5lbGVtZW50LCBpLmNhbGxiYWNrKSwgdGhpcy5mZS5jbGVhclRpbWVvdXQoaS50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5nTC5vZmYodGhpcy5rTCksIGNsZWFyVGltZW91dCh0aGlzLk9MKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBkdSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH0pKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MTCA9IHQsIHRoaXMuUkwgPSAxNiwgdGhpcy5CTCA9IDk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEhlaWdodEJ5UmF0aW8odCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh0IC8gdGhpcy5STCAqIHRoaXMuQkwpICsgdGhpcy5MTDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyBmdSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmxvYXRpbmdNb2RlID0gT2JqZWN0KHJ0LmEpKGUubW9kZSkgPyBlLm1vZGUgOiB0LmZsb2F0aW5nTW9kZSwgT2JqZWN0KGwuaCkoZS5kZXZpY2VzKSA/IHRoaXMuZmxvYXRpbmdEZXZpY2VNb2RlID0gZS5kZXZpY2VzIDogdGhpcy5mbG9hdGluZ0RldmljZU1vZGUgPSBPYmplY3QobC5oKSh0LmZsb2F0aW5nRGV2aWNlTW9kZSkgPyB0LmZsb2F0aW5nRGV2aWNlTW9kZSA6IFtoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wXSwgT2JqZWN0KHJ0LmEpKGUuY2xvc2VCdXR0b24pID8gdGhpcy5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSA9IGUuY2xvc2VCdXR0b24gOiBPYmplY3QocnQuYSkodC5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSkgPyB0aGlzLmZsb2F0aW5nQ2xvc2VCdXR0b25Nb2RlID0gdC5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSA6IHRoaXMuZmxvYXRpbmdDbG9zZUJ1dHRvbk1vZGUgPSBoLlByb3RvUGxheWVyQ2xvc2VCdXR0b25Nb2RlLk9uSG92ZXIsIHRoaXMuZmxvYXRpbmdQb3NpdGlvbiA9IE9iamVjdChydC5hKShlLmZpeGVkUG9zaXRpb24pID8gZS5maXhlZFBvc2l0aW9uIDogdC5mbG9hdGluZ0ZpeGVkUG9zaXRpb24sIHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9IE9iamVjdChydC5hKShlLnNjcm9sbFBvc2l0aW9uKSA/IGUuc2Nyb2xsUG9zaXRpb24gOiB0LmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24sIHRoaXMuZmxvYXRpbmdXaWR0aCA9IE9iamVjdChydC5hKShlLmZsb2F0aW5nV2lkdGgpID8gZS5mbG9hdGluZ1dpZHRoIDogdC5mbG9hdGluZ1dpZHRoIHx8IE10LCB0aGlzLmZsb2F0aW5nR3V0dGVyWCA9IE9iamVjdChydC5hKShlLmZsb2F0aW5nR3V0dGVyWCkgPyBlLmZsb2F0aW5nR3V0dGVyWCA6IHQuZmxvYXRpbmdHdXR0ZXJYLCB0aGlzLmZsb2F0aW5nR3V0dGVyWSA9IE9iamVjdChydC5hKShlLmZsb2F0aW5nR3V0dGVyWSkgPyBlLmZsb2F0aW5nR3V0dGVyWSA6IHQuZmxvYXRpbmdHdXR0ZXJZLCB0aGlzLnBhZ2VFbGVtZW50ID0gdC5mbG9hdGluZ1BhZ2VFbGVtZW50LCB0aGlzLmFwcGVuZExvY2F0aW9uID0gdC5mbG9hdGluZ0FwcGVuZExvY2F0aW9uLCB0aGlzLmZsb2F0aW5nWUF4aXNQYWRkaW5nID0gdC5mbG9hdGluZ1lBeGlzUGFkZGluZywgdGhpcy5ETCA9IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Cb3R0b21MZWZ0IHx8IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Ub3BMZWZ0LCB0aGlzLkZMID0gdGhpcy5mbG9hdGluZ1Njcm9sbFBvc2l0aW9uID09PSBoLlByb3RvUG9zaXRpb25Nb2RlLkJvdHRvbVJpZ2h0IHx8IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Ub3BSaWdodCwgdGhpcy5WTCA9IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Ub3BMZWZ0IHx8IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Ub3BSaWdodCwgdGhpcy5VTCA9IHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbiA9PT0gaC5Qcm90b1Bvc2l0aW9uTW9kZS5Cb3R0b21SaWdodCB8fCB0aGlzLmZsb2F0aW5nU2Nyb2xsUG9zaXRpb24gPT09IGguUHJvdG9Qb3NpdGlvbk1vZGUuQm90dG9tTGVmdCwgdGhpcy4kTCA9IG5ldyBkdShpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlzUG9zaXRpb25lZExlZnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNQb3NpdGlvbmVkUmlnaHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkZMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaXNQb3NpdGlvbmVkVG9wKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5WTDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlzUG9zaXRpb25lZEJvdHRvbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuVUw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBpc1Bvc2l0aW9uZWRMZWZ0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ETCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldCBpc1Bvc2l0aW9uZWRSaWdodCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRkwgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXQgaXNQb3NpdGlvbmVkQm90dG9tKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5VTCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBwb3NpdGlvbkNsYXNzKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZmxvYXRpbmdTY3JvbGxQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9Qb3NpdGlvbk1vZGUuQm90dG9tTGVmdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYm90dG9tLWxlZnQnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9Qb3NpdGlvbk1vZGUuVG9wTGVmdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9wLWxlZnQnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGguUHJvdG9Qb3NpdGlvbk1vZGUuVG9wUmlnaHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvcC1yaWdodCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JvdHRvbS1yaWdodCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0IHdpZHRoKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mbG9hdGluZ1dpZHRoID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHdpZHRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mbG9hdGluZ1dpZHRoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRIZWlnaHQodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7IHRoaXMuJEwuZ2V0SGVpZ2h0QnlSYXRpbyh0KSB9cHhgOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHB1KHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmYpKHQpICYmICdbb2JqZWN0IFJlZ0V4cF0nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkgJiYgJ1tvYmplY3QgRGF0ZV0nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBidSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB1KHQpID8gdnUoe30sIHQpIDogdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHZ1KHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHUodCkgJiYgT2JqZWN0LmtleXModCkuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbaV0gPSBidSh0W2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIE9iamVjdC5rZXlzKGkpLmZvckVhY2gocyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdShpW3NdKSAmJiB0W3NdID8gZVtzXSA9IHZ1KHRbc10sIGlbc10pIDogZVtzXSA9IGJ1KGlbc10pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9KHQsIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdFt0Lk5vcm1hbCA9IDBdID0gJ05vcm1hbCcsIHRbdC5CdXp6ZmVlZCA9IDFdID0gJ0J1enpmZWVkJzsKICAgICAgICAgICAgICAgIH0oY3UgfHwgKGN1ID0ge30pKTsKICAgICAgICAgICAgICAgIGNsYXNzIG11IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCByLCBhLCBvLCBjLCB1LCBkLCBmLCBwID0gKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfSkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nbG9iYWwgPSB0LCB0aGlzLnRhcmdldENvbnRhaW5lciA9IGksIHRoaXMuTkwgPSBlLCB0aGlzLkRjID0gcywgdGhpcy5zZWNvbmRMZXZlbERvbWFpbiA9IHIsIHRoaXMuYXBpQ29uZmlnID0gYSwgdGhpcy5zdXBwbHlDaGFpblNldHRpbmdzID0gYywgdGhpcy5pc1Nlb1RyYWZmaWMgPSB1LCB0aGlzLlpkID0gZCwgdGhpcy52aWRlb1Bvc2l0aW9uID0gZiwgdGhpcy5zaGFyaW5nRGVzdGluYXRpb25zID0gW10sIHRoaXMuZGlzYWJsZUFkdmVydGlzaW5nID0gITEsIHRoaXMuYWRCcmVha3MgPSBbXSwgdGhpcy5kaXNhYmxlQ2xpY2tVcmwgPSAhMSwgdGhpcy5tb2F0VHJhY2tpbmdFbmFibGVkID0gITEsIHRoaXMucGF1c2VBZFdoZW5GaW5pc2hlZCA9ICExLCB0aGlzLmxvb3BBZFdoZW5GaW5pc2hlZCA9ICExLCB0aGlzLmFkc011c3RCZVNraXBwYWJsZUlmTG9uZ2VyVGhhbiA9IEh0LmQsIE9iamVjdChydC5oKShlLmluaXRpYWxpemF0aW9uU2V0dGluZ3NKc29uKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IEpTT04ucGFyc2UoZS5pbml0aWFsaXphdGlvblNldHRpbmdzSnNvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcGlDb25maWcgPSB2dSh0aGlzLmFwaUNvbmZpZywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaW52YWxpZF9pbml0X2pzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbFN0YWNrOiB0LmNhbGxTdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmFwaUNvbmZpZy5wbGF5ZXJNb2RlID09PSBjdS5CdXp6ZmVlZCB8fCB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5wYXVzZUFkV2hlbkZpbmlzaGVkKSAmJiAodGhpcy5wYXVzZUFkV2hlbkZpbmlzaGVkID0gITApLCB0aGlzLkhMKHRoaXMuTkwubGluZUl0ZW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdW5kTW9kZSA9IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5kZWZhdWx0U291bmRNb2RlKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmRlZmF1bHRTb3VuZE1vZGUgOiBlLnNvdW5kTW9kZSwgdGhpcy5wbGF5YmFja01vZGUgPSBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MucGxheWJhY2tNb2RlKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLnBsYXliYWNrTW9kZSA6IGUucGxheWJhY2tNb2RlLCB0aGlzLnBsYXliYWNrTW9kZSA9PT0gaC5Qcm90b1BsYXllclBsYXliYWNrTW9kZUVudW0uQ2xpY2tUb1BsYXkgfHwgdGhpcy5zb3VuZE1vZGUgPT09IGguUHJvdG9QbGF5ZXJTb3VuZE1vZGUuTXV0ZSB8fCBPYmplY3QoTGkuYikoKSB8fCAodGhpcy5zb3VuZE1vZGUgPSBoLlByb3RvUGxheWVyU291bmRNb2RlLk11dGUpLCB0aGlzLmh0bWwgPSBlLmh0bWwsIHRoaXMuY3NzID0gZS5jc3MsIHRoaXMuZmxvYXRpbmdTZXR0aW5ncyA9IG5ldyBmdShlLCBwLCB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLmZsb2F0aW5nKSwgdGhpcy5sb2dvVXJsID0gT2JqZWN0KHJ0LmgpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24ubG9nb1VybCkgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLmxvZ29VcmwgOiBlLmxvZ29Vcmw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSBlLmFtYXpvblRhbVNsb3RJZDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChydC5oKSh2KSAmJiAodGhpcy5hbWF6b25UYW1TbG90SWQgPSB2KSwgT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLm1hY3JvcykgJiYgKHRoaXMuZXh0ZXJuYWxNYWNyb3MgPSB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5tYWNyb3MpLCBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuZGlzYWJsZUFkdmVydGlzaW5nKSAmJiAodGhpcy5kaXNhYmxlQWR2ZXJ0aXNpbmcgPSB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5kaXNhYmxlQWR2ZXJ0aXNpbmcpLCB0aGlzLnFMKCksIHRoaXMuekwoKSwgT2JqZWN0KGwuaCkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcubGluZUl0ZW1zKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGUubGluZUl0ZW1zLmZpbHRlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jcmVhdGl2ZVR5cGUgPT09IGguUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLkV4dGVybmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5saW5lSXRlbXMuZm9yRWFjaChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5XTChpKSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5HTCgpLCBlID0gdGhpcy5KTChpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5pZCA9PT0gdC5hZHZlcnRpc2VyTGluZUl0ZW1JZCAmJiAoaS51cmwgfHwgaS5oZWFkZXJCaWRkZXJCaWRzIHx8IGkuZXh0ZXJuYWxNZWRpYUZpbGUgfHwgaS5leHRlcm5hbEhsc0ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuSkwoaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICEwICE9PSB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5ibG9ja0Nvbm5hdGl4RGVtYW5kICYmIGIucHVzaCguLi5lLmxpbmVJdGVtcy5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jcmVhdGl2ZVR5cGUgIT09IGguUHJvdG9DcmVhdGl2ZVR5cGVFbnVtLkV4dGVybmFsOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIGIuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY3JlYXRpdmVUeXBlID09PSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5FeHRlcm5hbCAmJiAodC5oZWFkZXJCaWRkZXJCaWRzICYmICdbXScgIT09IHQuaGVhZGVyQmlkZGVyQmlkcyA/IHQuY3JlYXRpdmVUeXBlID0gaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uSGVhZGVyQmlkZGVyIDogdC5leHRlcm5hbE1lZGlhRmlsZSB8fCB0LmV4dGVybmFsSGxzRmlsZSA/IHQuY3JlYXRpdmVUeXBlID0gaC5Qcm90b0NyZWF0aXZlVHlwZUVudW0uTWVkaWFGaWxlIDogdC5jcmVhdGl2ZVR5cGUgPSBoLlByb3RvQ3JlYXRpdmVUeXBlRW51bS5UaGlyZFBhcnR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSB0aGlzLlFMKGIpLCBnID0gT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLnJlbmRlcmluZy5zY3JvbGxIaWphY2tpbmdQcm90ZWN0aW9uKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLnJlbmRlcmluZy5zY3JvbGxIaWphY2tpbmdQcm90ZWN0aW9uIDogZS5zY3JvbGxIaWphY2tpbmdQcm90ZWN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVJdGVtU2V0dGluZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSXRlbXM6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlU2Nyb2xsSGlqYWNrRW5mb3JjZW1lbnQ6IGcKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5taWRSb2xsTnVtYmVyID0gT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLm1heE51bWJlck9mTWlkUm9sbHMpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcubWF4TnVtYmVyT2ZNaWRSb2xscyA6IGUubWlkUm9sbE51bWJlciwgdGhpcy5hZFZpZXdhYmlsaXR5UG9saWN5ID0gZS5hZFZpZXdhYmlsaXR5UG9saWN5LCB0aGlzLnByZVJvbGxCcmVhayA9IChPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcucHJlUm9sbEJyZWFrKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLnByZVJvbGxCcmVhayA6IGUucHJlUm9sbEJyZWFrKSAqIHF0LmYsIHRoaXMucG9zdFJvbGxCcmVhayA9IChPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcucG9zdFJvbGxCcmVhaykgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5wb3N0Um9sbEJyZWFrIDogZS5wb3N0Um9sbEJyZWFrKSAqIHF0LmYsIHRoaXMucGxheWVySWQgPSBlLnBsYXllcklkLCB0aGlzLmZsb2F0aW5nU2V0dGluZ3MuZmxvYXRpbmdNb2RlID09PSBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFsd2F5cyA/IHRoaXMuY2xvc2VCdXR0b25Nb2RlID0gdGhpcy5mbG9hdGluZ1NldHRpbmdzLmZsb2F0aW5nQ2xvc2VCdXR0b25Nb2RlIDogdGhpcy5jbG9zZUJ1dHRvbk1vZGUgPSBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5jbG9zZUJ1dHRvbk1vZGUpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5jbG9zZUJ1dHRvbk1vZGUgOiBlLmNsb3NlQnV0dG9uTW9kZSwgdGhpcy5pc0Nsb3NlQnV0dG9uID0gISF0aGlzLmNsb3NlQnV0dG9uTW9kZSB8fCAhIXRoaXMuZmxvYXRpbmdTZXR0aW5ncy5mbG9hdGluZ0Nsb3NlQnV0dG9uTW9kZSwgdGhpcy51aUNvbXBvbmVudHNWaXNpYmlsaXR5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGluZzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRCdXR0b246IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLnNob3dFeHBhbmRCdXR0b24pID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5zaG93RXhwYW5kQnV0dG9uIDogZS5leHBhbmRCdXR0b24KICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5zaGFyaW5nRGVzdGluYXRpb25zID0gdm9pZCAwLCB0aGlzLmFkUGxheWJhY2tNb2RlID0gZS5hZFBsYXliYWNrTW9kZSwgT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmRpc2FibGVDbGlja1VybCkgJiYgKHRoaXMuZGlzYWJsZUNsaWNrVXJsID0gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuZGlzYWJsZUNsaWNrVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge3NraXBBZEFmdGVyOiB5fSA9IGEuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcuc2tpcEFkU2V0dGluZ3MgfHwge30sIHthZFNraXBwYWJpbGl0eTogd30gPSBhLnNldHRpbmdzLmFkdmVydGlzaW5nLnNraXBBZFNldHRpbmdzIHx8IHt9LCB7YWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuOiBPfSA9IGEuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcuc2tpcEFkU2V0dGluZ3MgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcEFkQWZ0ZXIgPSBPYmplY3QocnQuYSkoeSkgPyB5IDogZS5za2lwQWRBZnRlciwgdGhpcy5hZFNraXBwYWJpbGl0eSA9IE9iamVjdChydC5hKSh3KSA/IHcgOiBlLmFkU2tpcHBhYmlsaXR5LCBPYmplY3QocnQuYSkoTykgPyBPID4gMCAmJiBPIDw9IEh0LmQgJiYgKHRoaXMuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuID0gTykgOiBPYmplY3QocnQuYSkodykgfHwgZS5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4gJiYgKHRoaXMuYWRzTXVzdEJlU2tpcHBhYmxlSWZMb25nZXJUaGFuID0gZS5hZHNNdXN0QmVTa2lwcGFibGVJZkxvbmdlclRoYW4pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7ZGlzYWJsZVRyYWNraW5nOiB4fSA9IGEuc2V0dGluZ3MuX2Nvbm5hdGl4SW50ZXJuYWxzOwogICAgICAgICAgICAgICAgICAgICAgICAoeCB8fCBvIHx8IHRoaXMuaXNTZW9UcmFmZmljKSAmJiAodGhpcy5kaXNhYmxlVHJhY2tpbmcgPSAhMCksIHRoaXMuc2Vzc2lvbklkID0gdGhpcy5OTC5zZXNzaW9uSWQsIHRoaXMubW9hdFRyYWNraW5nRW5hYmxlZCA9IHRoaXMubGluZUl0ZW1TZXR0aW5ncy5saW5lSXRlbXMuc29tZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1vYXRUcmFja2luZ0VuYWJsZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBYTCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYWRUYWcgPSBPYmplY3QocnQuYSkodC51cmwpID8gdC51cmwgOiBpLmFkVGFnLCBpLnJlcXVlc3RDYXAgPSBPYmplY3QocnQuYSkodC5jb250ZW50UmVxdWVzdENhcCkgPyB0LmNvbnRlbnRSZXF1ZXN0Q2FwIDogaS5yZXF1ZXN0Q2FwLCBpLmltcHJlc3Npb25DYXAgPSBPYmplY3QocnQuYSkodC5jb250ZW50SW1wcmVzc2lvbkNhcCkgPyB0LmNvbnRlbnRJbXByZXNzaW9uQ2FwIDogaS5pbXByZXNzaW9uQ2FwLCBpLnZpZXdhYmlsaXR5ID0gT2JqZWN0KHJ0LmEpKHQudmlld2FiaWxpdHkpID8gdC52aWV3YWJpbGl0eSA6IGkudmlld2FiaWxpdHksIGkuc291bmQgPSBPYmplY3QocnQuYSkodC5zb3VuZCkgPyB0LnNvdW5kIDogaS5zb3VuZCwgaS5pZ25vcmVGaWxsZWRSZXF1ZXN0cyA9IE9iamVjdChydC5hKSh0Lmlnbm9yZUZpbGxlZFJlcXVlc3RzKSA/IHQuaWdub3JlRmlsbGVkUmVxdWVzdHMgOiBpLmlnbm9yZUZpbGxlZFJlcXVlc3RzLCBpLmhlYWRlckJpZGRlckJpZHMgPSBPYmplY3QocnQuYSkodC5oZWFkZXJCaWRkZXJCaWRzKSA/IHQuaGVhZGVyQmlkZGVyQmlkcyA6IGkuaGVhZGVyQmlkZGVyQmlkcywgaS5oZWFkZXJCaWRkZXJUaW1lb3V0ID0gT2JqZWN0KHJ0LmEpKHQuaGVhZGVyQmlkZGVyVGltZW91dCkgPyB0LmhlYWRlckJpZGRlclRpbWVvdXQgOiBpLmhlYWRlckJpZGRlclRpbWVvdXQsIGkucmVzZXRSZXF1ZXN0c0NhcFRpbWUgPSBPYmplY3QocnQuYSkodC5yZXNldFJlcXVlc3RzQ2FwVGltZSkgPyB0LnJlc2V0UmVxdWVzdHNDYXBUaW1lIDogaS5yZXNldFJlcXVlc3RzQ2FwVGltZSwgaS5yZXNldEltcHJlc3Npb25zQ2FwVGltZSA9IE9iamVjdChydC5hKSh0LnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lKSA/IHQucmVzZXRJbXByZXNzaW9uc0NhcFRpbWUgOiBpLnJlc2V0SW1wcmVzc2lvbnNDYXBUaW1lLCBpLnJlc2V0Q2FwVHlwZSA9IE9iamVjdChydC5hKSh0LnJlc2V0Q2FwVHlwZSkgPyB0LnJlc2V0Q2FwVHlwZSA6IGkucmVzZXRDYXBUeXBlLCBpLnRpbWVCZXR3ZWVuUmVxdWVzdHMgPSBPYmplY3QocnQuYSkodC50aW1lQmV0d2VlblJlcXVlc3RzKSA/IHQudGltZUJldHdlZW5SZXF1ZXN0cyA6IGkudGltZUJldHdlZW5SZXF1ZXN0cywgaS5za2lwTW9kZSA9IE9iamVjdChydC5hKSh0LnNraXBNb2RlKSA/IHQuc2tpcE1vZGUgOiBpLnNraXBNb2RlLCBpLmZsb29yUHJpY2UgPSBPYmplY3QocnQuYSkodC5mbG9vclByaWNlKSA/IHQuZmxvb3JQcmljZSA6IGkuZmxvb3JQcmljZSwgaS5hZEJyZWFrU2V0dGluZ3MgPSBPYmplY3QocnQuYSkodC5hZEJyZWFrU2V0dGluZ3MpID8gdC5hZEJyZWFrU2V0dGluZ3MgOiBpLmFkQnJlYWtTZXR0aW5ncywgaS5wYXVzZUFkT3V0T2ZWaWV3ID0gT2JqZWN0KHJ0LmEpKHQucGF1c2VBZE91dE9mVmlldykgPyB0LnBhdXNlQWRPdXRPZlZpZXcgOiBpLnBhdXNlQWRPdXRPZlZpZXc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHFMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLllMKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLnByZVJvbGxCcmVhaywgaC5Qcm90b0FkQnJlYWtUeXBlRW51bS5QcmVSb2xsKSwgdGhpcy5ZTCh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5wb3N0Um9sbEJyZWFrLCBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlBvc3RSb2xsKSwgdGhpcy5ZTCh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy5tYXhOdW1iZXJPZk1pZFJvbGxzLCBoLlByb3RvQWRCcmVha1R5cGVFbnVtLk1pZFJvbGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBZTCh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLktMKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLmFkQnJlYWtzLCBpKSwgcyA9IHRoaXMuS0wodGhpcy5OTC5hZEJyZWFrcywgaSksIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4QWRQb2REdXJhdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhBZFNsb3REdXJhdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZkFkU2xvdHM6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXM6IFtpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA/IHRoaXMuYWRCcmVha3MucHVzaChlKSA6ICFPYmplY3QocnQuYSkodCkgfHwgZSB8fCBzID8gIWUgJiYgcyAmJiB0aGlzLmFkQnJlYWtzLnB1c2gocykgOiB0aGlzLmFkQnJlYWtzLnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEtMKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHlwZXMuaW5jbHVkZXMoaSkgJiYgKChlID0gT2JqZWN0LmFzc2lnbih7fSwgdCkpLnR5cGVzID0gW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFFMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge2FkQnJlYWtzOiBpfSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50eXBlcy5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0KSwgeyB0eXBlczogW2ldIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgcy5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHRoaXMucmVtb3ZlQ29tcGF0aWJsZUxpbmVJdGVtcyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuZmlsdGVyKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlLmluY2x1ZGVzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29tcGF0aWJsZUxpbmVJdGVtcyh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnR5cGVzWzBdLCBzID0gdC5udW1iZXJPZkFkU2xvdHMgPiAxID8gaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLkFkUG9kIDogaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLlNpbmdsZUFkOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5maWx0ZXIodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQuYWRCcmVha1NldHRpbmdzLmFkQnJlYWtUYXJnZXRpbmcuc29tZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZFJvbGxUeXBlID09PSBlICYmICh0LmFkQnJlYWtUeXBlRW51bSA9PT0gaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLkFsbCB8fCB0LmFkQnJlYWtUeXBlRW51bSA9PT0gcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEhMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hZEJyZWFrU2V0dGluZ3MgfHwgdGhpcy5aTCh0KSwgdGhpcy5XTCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFpMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5hZEJyZWFrU2V0dGluZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJyZWFrVGFyZ2V0aW5nOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFJvbGxUeXBlOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlByZVJvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQnJlYWtUeXBlRW51bTogaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLkFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFJvbGxUeXBlOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLk1pZFJvbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkQnJlYWtUeXBlRW51bTogaC5Qcm90b0xpbmVJdGVtQWRCcmVha1R5cGVFbnVtLkFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFJvbGxUeXBlOiBoLlByb3RvQWRCcmVha1R5cGVFbnVtLlBvc3RSb2xsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZEJyZWFrVHlwZUVudW06IGguUHJvdG9MaW5lSXRlbUFkQnJlYWtUeXBlRW51bS5BbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFdMKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gdC5yZXF1ZXN0Q2FwICYmICh0LnJlcXVlc3RDYXAgPSAyMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHpMKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkQnJlYWtzLmZvckVhY2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1heEFkU2xvdER1cmF0aW9uICo9IHF0LmYsIHQubWF4QWRQb2REdXJhdGlvbiAqPSBxdC5mLCB0Lm51bWJlck9mQWRTbG90cyA8PSAxID8gdC5tYXhBZFBvZER1cmF0aW9uID0gMCA6IHQubWF4QWRTbG90RHVyYXRpb24gPiB0Lm1heEFkUG9kRHVyYXRpb24gJiYgKHQubWF4QWRTbG90RHVyYXRpb24gPSB0Lm1heEFkUG9kRHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSkwodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0LmFzc2lnbih7fSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlhMKHQsIGUpLCBPYmplY3QocnQuYSkodC5leHRlcm5hbE1lZGlhRmlsZSkgJiYgKGUuZXh0ZXJuYWxNZWRpYUZpbGUgPSB0LmV4dGVybmFsTWVkaWFGaWxlKSwgT2JqZWN0KHJ0LmEpKHQuZXh0ZXJuYWxIbHNGaWxlKSAmJiAoZS5leHRlcm5hbEhsc0ZpbGUgPSB0LmV4dGVybmFsSGxzRmlsZSksIGUuY3VzdG9tQ3BtID0gdC5jcG0sIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEdMKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5Qcm90b0xpbmVJdGVtLnRvT2JqZWN0KGguUHJvdG9MaW5lSXRlbS5mcm9tT2JqZWN0KHt9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGd1IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSXYgPSBbXSwgdGhpcy54SSA9IHQuaWQsIHRoaXMudFIgPSB0LnRpdGxlLCB0aGlzLkZkID0gdC5hbHRUZXh0LCB0aGlzLmlSID0gdC5kZXNjcmlwdGlvbiwgdGhpcy5lUiA9IHQuaW1hZ2VVcmwsIHRoaXMua1AgPSB0LnNvdXJjZXMsIHRoaXMua3cgPSB0LmNsaWNrVXJsIHx8ICcnLCB0aGlzLnNSID0gdC5obHNGaWxlUGF0aCB8fCAnJywgdGhpcy5uUiA9IHQubGl2ZVN0cmVhbUZpbGVQYXRoIHx8ICcnLCB0aGlzLnJSID0gdC5saXZlU3RyYW1TdGFydERhdGUgfHwgJycsIHRoaXMua1AgJiYgdGhpcy5rUC5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5Jdi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogU1t0LnF1YWxpdHldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvSGVpZ2h0OiB0LnF1YWxpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIRDogdC5xdWFsaXR5ID49IGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGlkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy54STsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50UjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFsdFRleHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuYSkodGhpcy5GZCkgPyB0aGlzLkZkIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZXNjcmlwdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaVI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjbGlja1VybCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua3c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZXModCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHRoaXMua1AuZmluZChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkucXVhbGl0eSA9PT0gdGhpcy5nZXRDbG9zZXN0U291cmNlUXVhbGl0eSh0KS52aWRlb0hlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG5ldyB5Yyh3LkgyNjQpLnR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRIbHNTb3VyY2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5SIHx8IHRoaXMuc1I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVF1YWxpdGllcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSXYuc29ydCgodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmlkZW9IZWlnaHQgLSBpLnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsVXJsKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lUjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGhsc0ZpbGVQYXRoKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uUiB8fCB0aGlzLnNSOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDbG9zZXN0U291cmNlUXVhbGl0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0KHdpLmIpKHQsIHRoaXMuSXYubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSXYuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudmlkZW9IZWlnaHQgPT09IGUgJiYgKGkgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNldEF2YWlsYWJsZVF1YWxpdGllcyh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSXYgPSB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgc3RhcnREYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yUjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGFzcyB5dSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhSID0gbmV3IGd1KHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRNZXRhZGF0YSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdCh0aGlzLmhSKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QXZhaWxhYmxlUXVhbGl0aWVzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oUi5zZXRBdmFpbGFibGVRdWFsaXRpZXModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xhc3Mgd3UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hUiA9ICExLCB0aGlzLm9SID0gW10sIHRoaXMuY1IgPSAhMSwgdGhpcy54SSA9IHQsIHRoaXMudVIgPSBpLCB0aGlzLmxSID0gZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGEodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFSID8gdCAmJiB0KHRoaXMuaFIpIDogdGhpcy5kUih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QXZhaWxhYmxlUXVhbGl0aWVzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oUi5zZXRBdmFpbGFibGVRdWFsaXRpZXModCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRSKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0aGlzLm9SLnB1c2godCksIHRoaXMuY1IgfHwgKHRoaXMuY1IgPSAhMCwgdGhpcy5mUigpLnRoZW4odCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNSID0gITEsIHRoaXMuYVIgPSAhMCwgdGhpcy5oUiA9IHRoaXMucFIodCksIHRoaXMub1IuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCh0aGlzLmhSKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLm9SID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY1IgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIE91IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueEkgPSB0LCB0aGlzLmxSID0gaSwgdGhpcy5aZCA9IHMsIHRoaXMuYlIgPSBbXSwgdGhpcy52UiA9IFtdLCB0aGlzLm1SID0gW10sIHRoaXMuZ1IgPSBbXSwgdGhpcy55UiA9IFtdLCB0aGlzLkl2ID0gW10sIHRoaXMudFIgPSBlLnRpdGxlLCB0aGlzLkZkID0gZS5hbHRUZXh0LCB0aGlzLmlSID0gZS5kZXNjcmlwdGlvbiwgdGhpcy5rdyA9IGUuY2xpY2tVcmwsIHRoaXMuYlIgPSBlLmtleXdvcmRMaXN0LCB0aGlzLndSID0gZS5sYW5ndWFnZUlkLCB0aGlzLnZSID0gZS50cmFja0xpc3QsIHRoaXMuT1IgPSBlLnRodW1ibmFpbCwgdGhpcy5idCA9IGUuZHVyYXRpb24sIHRoaXMuZ1IgPSBlLmN1c3RvbUZpZWxkcywgdGhpcy5zUiA9IGUuaGxzRmlsZVBhdGgsIHRoaXMueFIgPSBlLnNvdXJjZUl0ZW1JZCwgdGhpcy55UiA9IGUudmlkZW9JbmRleGVzLCBPYmplY3QobC5oKShlLnJlbmRpdGlvbkxpc3QpICYmICh0aGlzLm1SID0gdGhpcy5TUihlLnJlbmRpdGlvbkxpc3QpLCB0aGlzLmpSKGUucmVuZGl0aW9uTGlzdCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBTUih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNvcnQoKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmhlaWdodCAtIGkuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QXZhaWxhYmxlUXVhbGl0aWVzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JdiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGpSKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGwuZSkoJ2hlaWdodCcsIHQpLmZvckVhY2goKHQsIGkpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSXYucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9IZWlnaHQ6IHQuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHsgdC5oZWlnaHQgfXBgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSEQ6IHQuaGVpZ2h0ID49IGoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAga1IodCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tUi5maW5kKGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29kZWMgPT09IHQgJiYgZS5oZWlnaHQgPT09IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfUih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gYCR7IHQgfSR7IHRoaXMueEkgfS9gOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmgpKHRoaXMubFIpID8gZSArPSBgJHsgdGhpcy5sUiB9LyR7IGkgfWAgOiBlICs9IGksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIEFSKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IE9iamVjdCh3aS5iKSh0LCB0aGlzLkl2Lm1hcCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnZpZGVvSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmtSKGksIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgaGxzRmlsZVBhdGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNSOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBdmFpbGFibGVRdWFsaXRpZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkl2OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRDbG9zZXN0U291cmNlUXVhbGl0eSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gT2JqZWN0KHdpLmIpKHQsIHRoaXMuSXYubWFwKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudmlkZW9IZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSXYuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudmlkZW9IZWlnaHQgPT09IGUgJiYgKGkgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZXModCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzID0gdGhpcy5BUih0LCBpLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChsLmgpKGUpIHx8IHMgJiYgZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IHRoaXMuWmQuYXBwZW5kUGFyYW1zVG9VcmwodGhpcy5fUihWaS5hLmVuZFBvaW50cy5iYXNlLnZpZGVvLCBzLmZpbGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBpLnR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0SGxzU291cmNlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aZC5hcHBlbmRQYXJhbXNUb1VybCh0aGlzLl9SKFZpLmEuZW5kUG9pbnRzLmJhc2UudmlkZW8sIHRoaXMuc1IpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsVXJsKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHRoaXMuX1IoVmkuYS5lbmRQb2ludHMuYmFzZS5pbWFnZSwgdGhpcy5PUik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOaS5nZXRTbWFydENyb3BwZWRJbWFnZVVybChlLCB0LCBpLCB0aGlzLlpkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHRpdGxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50UjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IGFsdFRleHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QocnQuYSkodGhpcy5GZCkgPyB0aGlzLkZkIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkZXNjcmlwdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaVI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjbGlja1VybCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua3c7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBrZXl3b3JkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYlI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBsYW5ndWFnZUlkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53UjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0IHNvdXJjZUl0ZW1JZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueFI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBzdWJ0aXRsZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudlIgJiYgdGhpcy52UlswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpkLmFwcGVuZFBhcmFtc1RvVXJsKHRoaXMuX1IoVmkuYS5lbmRQb2ludHMuYmFzZS52aWRlbywgdGhpcy52UlswXS5maWxlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBzcHJpdGVTaGVldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSVI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBkdXJhdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueEk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBjdXN0b21GaWVsZHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdSOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgdmlkZW9JbmRleGVzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy55UjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeHUgPSBlKDQ1KTsKICAgICAgICAgICAgICAgIGNvbnN0IFN1ID0gJ1ZpZGVvU291cmNlV3JhcHBlcic7CiAgICAgICAgICAgICAgICBjbGFzcyBqdSBleHRlbmRzIHd1IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyKHQsIGksIGUpLCB0aGlzLlpkID0gcywgdGhpcy5DUiA9IG5ldyB4dS5hKGguUHJvdG9NZWRpYU1ldGFkYXRhUmVzcG9uc2UsIFN1KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZlIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ID0gYCR7IFZpLmEuZW5kUG9pbnRzLmJhc2UubWV0YWRhdGEgfSR7IHRoaXMueEkgfS9gOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmgpKHRoaXMubFIpID8gdCArPSBgJHsgdGhpcy5sUiB9LyR7IHRoaXMudVIgfV9tZWRpYS5iaW5gIDogdCArPSBgJHsgdGhpcy51UiB9X21lZGlhLmJpbmAsIHRoaXMuQ1IuZmV0Y2hNZXRhZGF0YSh0aGlzLlpkLmFwcGVuZFBhcmFtc1RvVXJsKHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcFIodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE91KHRoaXMueEksIHRoaXMubFIsIHQsIHRoaXMuWmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNsYXNzIGt1IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSXYgPSBbXSwgdGhpcy54SSA9IHQsIHRoaXMuRmQgPSBpLmFsdFRleHQsIHRoaXMuc1IgPSBpLm91dHB1dFVybCwgdGhpcy5PUiA9IGkudGh1bWJuYWlsVXJsLCB0aGlzLlRSID0gaS5zdGFydERhdGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZXModCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2V0QXZhaWxhYmxlUXVhbGl0aWVzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5JdiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBobHNGaWxlUGF0aCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc1I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldEF2YWlsYWJsZVF1YWxpdGllcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuSXY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldENsb3Nlc3RTb3VyY2VRdWFsaXR5KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBPYmplY3Qod2kuYikodCwgdGhpcy5Jdi5tYXAodCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52aWRlb0hlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Jdi5mb3JFYWNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC52aWRlb0hlaWdodCA9PT0gZSAmJiAoaSA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0SGxzU291cmNlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zUjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsVXJsKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuT1I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBpZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueEk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCBhbHRUZXh0KCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHJ0LmEpKHRoaXMuRmQpID8gdGhpcy5GZCA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXQgc3RhcnREYXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5UUjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBfdSA9ICdMaXZlVmlkZW9Tb3VyY2VXcmFwcGVyJzsKICAgICAgICAgICAgICAgIGNsYXNzIEF1IGV4dGVuZHMgd3UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIodCwgaSwgZSksIHRoaXMuQ1IgPSBuZXcgeHUuYShoLlByb3RvTGl2ZU1lZGlhTWV0YWRhdGFSZXNwb25zZSwgX3UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmUigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IGAkeyBWaS5hLmVuZFBvaW50cy5iYXNlLm1ldGFkYXRhIH0keyB0aGlzLnhJIH0vJHsgdGhpcy51UiB9X2xpdmVTdHJlYW0uYmluYDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ1IuZmV0Y2hNZXRhZGF0YSh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcFIodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGt1KHRoaXMueEksIHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IEl1ID0gMTA7CiAgICAgICAgICAgICAgICBjbGFzcyBDdSBleHRlbmRzIG11IHsKICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcih0LCBpLCBlLCBzLCByLCBhLCBvLCBjLCB1LCBkLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBlcih0LCBpLCBlLCBzLCByLCBhLCBvLCBjLCBmLCB1LCBkKSwgdGhpcy5nbG9iYWwgPSB0LCB0aGlzLnRhcmdldENvbnRhaW5lciA9IGksIHRoaXMuTkwgPSBlLCB0aGlzLlpkID0gdSwgdGhpcy52aWRlb1Bvc2l0aW9uID0gZCwgdGhpcy5wbGF5bGlzdCA9IFtdLCB0aGlzLm91dHN0cmVhbUFkQXNDb250ZW50ID0gITEsIHRoaXMuYWx3YXlzRGlzcGxheUNvbnRyb2xzID0gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5hbHdheXNEaXNwbGF5Q29udHJvbHMsIHRoaXMucGxheWVyU2l6ZSA9IHRoaXMuUFIoKSwgdGhpcy5taWRSb2xsT25seU9uTG9uZ0NvbnRlbnQgPSBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50KSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLm1pZFJvbGxPbmx5T25Mb25nQ29udGVudCA6IGUubWlkUm9sbE9ubHlPbkxvbmdDb250ZW50LCB0aGlzLnVpQ29tcG9uZW50c1Zpc2liaWxpdHkud2F0ZXJtYXJrID0gT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24uc2hvd011dGVXYXRlcm1hcmspID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5zaG93TXV0ZVdhdGVybWFyayA6IGUubXV0ZVdhdGVybWFyaywgdGhpcy5wbGF5bGlzdElkID0gZS5wbGF5bGlzdElkLCB0aGlzLmFjY2VudENvbG9yID0gT2JqZWN0KHJ0LmgpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24uYWNjZW50Q29sb3IpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5hY2NlbnRDb2xvciA6IGUuYWNjZW50Q29sb3IsIHRoaXMuaWNvbnNDb2xvciA9IE9iamVjdChydC5oKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLmljb25zQ29sb3IpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5pY29uc0NvbG9yIDogZS5pY29uc0NvbG9yLCB0aGlzLnRvb2x0aXBUZXh0Q29sb3IgPSBPYmplY3QocnQuaCkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi50b29sdGlwVGV4dENvbG9yKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24udG9vbHRpcFRleHRDb2xvciA6IGUudG9vbHRpcFRleHRDb2xvciwgdGhpcy50b29sdGlwQmFja2dyb3VuZENvbG9yID0gT2JqZWN0KHJ0LmgpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24udG9vbHRpcEJhY2tncm91bmRDb2xvcikgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IgOiBlLnRvb2x0aXBCYWNrZ3JvdW5kQ29sb3IsIHRoaXMubWluVGltZUJlZm9yZUZpcnN0QWQgPSAoT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLnRpbWVCZWZvcmVGaXJzdEFkKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmFkdmVydGlzaW5nLnRpbWVCZWZvcmVGaXJzdEFkIDogZS5taW5UaW1lQmVmb3JlRmlyc3RBZCkgKiBxdC5mLCB0aGlzLnRpbWVCZXR3ZWVuQWRzID0gKE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy50aW1lQmV0d2VlbkFkcykgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5hZHZlcnRpc2luZy50aW1lQmV0d2VlbkFkcyA6IGUudGltZUJldHdlZW5BZHMpICogcXQuZiwgdGhpcy51cE5leHRNb2RlID0gT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLm5leHRWaWRlb01vZGUpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MubmV4dFZpZGVvTW9kZSA6IGUudXBOZXh0TW9kZSwgdGhpcy5jbG9zZWRDYXB0aW9uRGVmYXVsdCA9IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLmNsb3NlZENhcHRpb25EZWZhdWx0KSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24uY2xvc2VkQ2FwdGlvbkRlZmF1bHQgOiBlLmNsb3NlZENhcHRpb24sIHRoaXMubG9nb1Bvc2l0aW9uID0gT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24ubG9nb1Bvc2l0aW9uKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24ubG9nb1Bvc2l0aW9uIDogZS5sb2dvUG9zaXRpb24sIHRoaXMucGxheWVyVHlwZSA9IGUucGxheWVyVHlwZSwgdGhpcy5wbGF5ZXJUeXBlICE9PSBNLlByb3RvRWxlbWVudHNUeXBlRW51bS5PdXRTdHJlYW0gfHwgIXRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLm91dHN0cmVhbUFkQXNDb250ZW50ICYmIHRoaXMuYXBpQ29uZmlnLnBsYXllck1vZGUgIT09IGN1LkJ1enpmZWVkIHx8ICh0aGlzLm91dHN0cmVhbUFkQXNDb250ZW50ID0gITApLCAoT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLm91dHN0cmVhbVNldHRpbmdzLmVuZEFkQnJlYWtQb2xpY3kpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3Mub3V0c3RyZWFtU2V0dGluZ3MuZW5kQWRCcmVha1BvbGljeSA9PT0gTS5Qcm90b091dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3lFbnVtLkxvb3AgOiBlLm91dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3kgPT09IE0uUHJvdG9PdXRzdHJlYW1FbmRBZEJyZWFrUG9saWN5RW51bS5Mb29wKSAmJiAodGhpcy5vdXRzdHJlYW1BZEFzQ29udGVudCA9ICEwLCB0aGlzLmxvb3BBZFdoZW5GaW5pc2hlZCA9ICEwKSwgT2JqZWN0KHJ0LmUpKHRoaXMubWluVGltZUJlZm9yZUZpcnN0QWQpIHx8IHRoaXMuYXBpQ29uZmlnLnBsYXllck1vZGUgPT09IGN1LkJ1enpmZWVkIHx8IHRoaXMub3V0c3RyZWFtQWRBc0NvbnRlbnQgfHwgKHRoaXMubWluVGltZUJlZm9yZUZpcnN0QWQgPSBJdSksIE9iamVjdChydC5oKSh0aGlzLmFwaUNvbmZpZy5fYXBwU2V0dGluZ3MuYnVuZGxlSUQpICYmICF0aGlzLmlzSW5BcHAoKSAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnRzX1BsYXllck1vZGVsX2J1bmRsZV9pZF9mb3Jfbm9uX2luX2FwcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgIU9iamVjdChydC5oKSh0aGlzLmFwaUNvbmZpZy5fYXBwU2V0dGluZ3MuYnVuZGxlSUQpICYmIHRoaXMuaXNJbkFwcCgpICYmIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnRWxlbWVudHNfUGxheWVyTW9kZWxfYnVuZGxlX2lkX21pc3NpbmdfZm9yX2luX2FwcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLkZBVEFMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy52aWRlb1F1YWxpdHkgPSBPYmplY3QocnQuYSkodGhpcy5OTC52aWRlb1F1YWxpdHkpID8gdGhpcy5OTC52aWRlb1F1YWxpdHkgOiBNLlByb3RvVmlkZW9RdWFsaXR5LkF1dG8sIE9iamVjdChsLmgpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLnBsYXlsaXN0KSAmJiAhT2JqZWN0KHJ0LmgpKHRoaXMuYXBpQ29uZmlnLm1lZGlhSWQpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MucGxheWxpc3QuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QocnQuaCkodC5saXZlU3RyZWFtRmlsZVBhdGgpICYmICh0aGlzLnBsYXllclR5cGUgPSBNLlByb3RvRWxlbWVudHNUeXBlRW51bS5MaXZlLCB0aGlzLnBsYXliYWNrTW9kZSA9IE0uUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkNsaWNrVG9QbGF5KSwgdGhpcy5wbGF5bGlzdC5wdXNoKG5ldyB5dSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGUucGxheWxpc3QubGVuZ3RoID4gMCAmJiBlLnBsYXlsaXN0LmZvckVhY2goKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmlzaW9uTnVtYmVyOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQ29udGVudFZlcnNpb25JZDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTkwucGxheWVyVHlwZSA9PT0gTS5Qcm90b0VsZW1lbnRzVHlwZUVudW0uTGl2ZSA/IHRoaXMucGxheWxpc3QucHVzaChuZXcgQXUodCwgaSwgZSkpIDogdGhpcy5wbGF5bGlzdC5wdXNoKG5ldyBqdSh0LCBpLCBlLCB0aGlzLlpkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5pc091dFN0cmVhbVR5cGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5vdXRzdHJlYW1TZXR0aW5ncy5pbml0aWFsUmVuZGVyaW5nKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLm91dHN0cmVhbVNldHRpbmdzLmluaXRpYWxSZW5kZXJpbmcgOiBlLm91dHN0cmVhbUluaXRpYWxSZW5kZXJpbmcsIGkgPSBPYmplY3QocnQuaCkodGhpcy5hcGlDb25maWcuc2V0dGluZ3Mub3V0c3RyZWFtU2V0dGluZ3MuaG91c2VTY3JlZW5Db2xvcikgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5vdXRzdHJlYW1TZXR0aW5ncy5ob3VzZVNjcmVlbkNvbG9yIDogZS5vdXRzdHJlYW1Ib3VzZUJhY2tncm91bmRDb2xvciwgcyA9IChPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3Mub3V0c3RyZWFtU2V0dGluZ3MudG90YWxBZEJyZWFrTGVuZ3RoKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLm91dHN0cmVhbVNldHRpbmdzLnRvdGFsQWRCcmVha0xlbmd0aCA6IGUub3V0c3RyZWFtVG90YWxBZEJyZWFrTGVuZ3RoKSAqIHF0LmYsIG4gPSBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3Mub3V0c3RyZWFtU2V0dGluZ3MuZW5kQWRCcmVha1BvbGljeSkgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5vdXRzdHJlYW1TZXR0aW5ncy5lbmRBZEJyZWFrUG9saWN5IDogZS5vdXRzdHJlYW1FbmRBZEJyZWFrUG9saWN5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRzdHJlYW1TZXR0aW5ncyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsUmVuZGVyaW5nOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXNlU2NyZWVuQmFja2dyb3VuZENvbG9yOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQWRCcmVha0xlbmd0aDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRBZEJyZWFrUG9saWN5OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuZ2FsbGVyeS5zdHlsZSkgJiYgdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuZ2FsbGVyeS5zdHlsZSAhPT0gTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuTm9uZSB8fCAhT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmdhbGxlcnkuc3R5bGUpICYmIGUuZ2FsbGVyeVN0eWxlICE9PSBNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5Ob25lKSAmJiB0aGlzLmZsb2F0aW5nU2V0dGluZ3MuZmxvYXRpbmdNb2RlICE9PSBNLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFsd2F5cyAmJiAodGhpcy5nYWxsZXJ5ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5nYWxsZXJ5LnN0eWxlKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmdhbGxlcnkuc3R5bGUgOiBlLmdhbGxlcnlTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uOiB0aGlzLk1SKCkKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldCB1cmxTdWZmaXhlclNlcnZpY2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0luQXBwKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGwuZykodGhpcy5wbGF5ZXJUeXBlLCBbTS5Qcm90b0VsZW1lbnRzVHlwZUVudW0uSW5TdHJlYW1JbkFwcF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc0luU3RyZWFtVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmcpKHRoaXMucGxheWVyVHlwZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5Qcm90b0VsZW1lbnRzVHlwZUVudW0uSW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLlByb3RvRWxlbWVudHNUeXBlRW51bS5JblN0cmVhbUluQXBwCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpc091dFN0cmVhbVR5cGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QobC5nKSh0aGlzLnBsYXllclR5cGUsIFtNLlByb3RvRWxlbWVudHNUeXBlRW51bS5PdXRTdHJlYW1dKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaXNMaXZlVHlwZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChsLmcpKHRoaXMucGxheWVyVHlwZSwgW00uUHJvdG9FbGVtZW50c1R5cGVFbnVtLkxpdmVdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgUFIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBPYmplY3QocnQuYSkodGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5yZXNwb25zaXZlKSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24ucmVzcG9uc2l2ZSA6IHRoaXMuTkwucmVzcG9uc2l2ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGlvV2lkdGg6IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLnJhdGlvV2lkdGgpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5yYXRpb1dpZHRoIDogdGhpcy5OTC5yYXRpb1dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9IZWlnaHQ6IE9iamVjdChydC5hKSh0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLnJhdGlvSGVpZ2h0KSA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24ucmF0aW9IZWlnaHQgOiB0aGlzLk5MLnJhdGlvSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRXaWR0aDogT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24uZml4ZWRXaWR0aCkgPyB0aGlzLmFwaUNvbmZpZy5zZXR0aW5ncy5jdXN0b21pemF0aW9uLmZpeGVkV2lkdGggOiB0aGlzLk5MLmZpeGVkV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZEhlaWdodDogT2JqZWN0KHJ0LmEpKHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmN1c3RvbWl6YXRpb24uZml4ZWRIZWlnaHQpID8gdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuY3VzdG9taXphdGlvbi5maXhlZEhlaWdodCA6IHRoaXMuTkwuZml4ZWRIZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTVIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkRjID09PSBoLlByb3RvRGV2aWNlVHlwZS5TbWFydHBob25lIHx8IHRoaXMuRGMgPT09IGguUHJvdG9EZXZpY2VUeXBlLlRhYmxldCA/IE0uUHJvdG9HYWxsZXJ5T3JpZW50YXRpb25FbnVtLlBvcnRyYWl0IDogdGhpcy5hcGlDb25maWcuc2V0dGluZ3MuZ2FsbGVyeS5vcmllbnRhdGlvbiA/IHRoaXMuYXBpQ29uZmlnLnNldHRpbmdzLmdhbGxlcnkub3JpZW50YXRpb24gOiB0aGlzLk5MLmdhbGxlcnlPcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBUdSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBUdC5iKSwgSSksIEMpLCBQdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tNb2RlRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b1BsYXk6IGguUHJvdG9QbGF5ZXJQbGF5YmFja01vZGVFbnVtLkF1dG9wbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsVG9QbGF5OiBoLlByb3RvUGxheWVyUGxheWJhY2tNb2RlRW51bS5TY3JvbGxUb1BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlja1RvUGxheTogaC5Qcm90b1BsYXllclBsYXliYWNrTW9kZUVudW0uQ2xpY2tUb1BsYXkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFNvdW5kTW9kZUVudW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uOiBoLlByb3RvUGxheWVyU291bmRNb2RlLk9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBoLlByb3RvUGxheWVyU291bmRNb2RlLk11dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkhvdmVyOiBoLlByb3RvUGxheWVyU291bmRNb2RlLkhvdmVyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFBvc2l0aW9uRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aGluQ29udGFpbmVyOiBoLlByb3RvUGxheWVySW5zZXJ0TW9kZS5XaXRoaW5Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmVDb250YWluZXI6IGguUHJvdG9QbGF5ZXJJbnNlcnRNb2RlLkJlZm9yZUNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVyQ29udGFpbmVyOiBoLlByb3RvUGxheWVySW5zZXJ0TW9kZS5BZnRlckNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VDb250YWluZXI6IGguUHJvdG9QbGF5ZXJJbnNlcnRNb2RlLlJlcGxhY2VDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaWRlQ29udGFpbmVyOiBoLlByb3RvUGxheWVySW5zZXJ0TW9kZS5IaWRlQ29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlQnV0dG9uTW9kZUVudW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZjogaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5PZmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbjogaC5Qcm90b1BsYXllckNsb3NlQnV0dG9uTW9kZS5PbkhvdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT25BZnRlckZpcnN0QWQ6IGguUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUuT25Ib3ZlckFmdGVyRmlyc3RBZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uSG92ZXI6IGguUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUuT25Ib3ZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uSG92ZXJBZnRlckZpcnN0QWQ6IGguUHJvdG9QbGF5ZXJDbG9zZUJ1dHRvbk1vZGUuT25Ib3ZlckFmdGVyRmlyc3RBZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsd2F5c09uOiBoLlByb3RvUGxheWVyQ2xvc2VCdXR0b25Nb2RlLkFsd2F5c09uCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1YWxpdHlFbnVtOiBTLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5lSXRlbUV4Y2x1ZGVkU2xvdHNFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVSb2xsOiBoLlByb3RvQWRTbG90c0VudW0uUHJlUm9sbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pZFJvbGw6IGguUHJvdG9BZFNsb3RzRW51bS5NaWRSb2xsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zdFJvbGw6IGguUHJvdG9BZFNsb3RzRW51bS5Qb3N0Um9sbAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvclR5cGVzRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dXBFcnJvcjogVHQuYS5TZXR1cEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9QbGF5ZXI6IFR0LmEuTm9QbGF5ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRpbmdNb2RlRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmOiBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLk9mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uUGFnZUxvYWQ6IGguUHJvdG9QbGF5ZXJGbG9hdGluZ01vZGUuT25QYWdlTG9hZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFmdGVySW5WaWV3OiBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFmdGVySW5WaWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx3YXlzOiBoLlByb3RvUGxheWVyRmxvYXRpbmdNb2RlLkFsd2F5cwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBGbG9hdGluZ0RldmljZXNFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNrdG9wOiBoLlByb3RvRGV2aWNlVHlwZS5EZXNrdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hcnRwaG9uZTogaC5Qcm90b0RldmljZVR5cGUuU21hcnRwaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxldDogaC5Qcm90b0RldmljZVR5cGUuVGFibGV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXI6IGguUHJvdG9EZXZpY2VUeXBlLkdhbWVDb25zb2xlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0aW5nRml4ZWRQb3NpdGlvbk1vZGVFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlOiBoLlByb3RvRmxvYXRpbmdGaXhlZFBvc2l0aW9uTW9kZS5QYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxlbWVudDogaC5Qcm90b0Zsb2F0aW5nRml4ZWRQb3NpdGlvbk1vZGUuRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBGbG9hdGluZ1Njcm9sbFBvc2l0aW9uRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tUmlnaHQ6IGguUHJvdG9Qb3NpdGlvbk1vZGUuQm90dG9tUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3R0b21MZWZ0OiBoLlByb3RvUG9zaXRpb25Nb2RlLkJvdHRvbUxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3BSaWdodDogaC5Qcm90b1Bvc2l0aW9uTW9kZS5Ub3BSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcExlZnQ6IGguUHJvdG9Qb3NpdGlvbk1vZGUuVG9wTGVmdAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBGbG9hdGluZ1N0YXRlc0VudW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0OiBDdC5GbG9hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYmVkOiBDdC5FbWJlZAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnRhdGlvblR5cGVFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbXA6IGguUHJvdG9JbXBsZW1lbnRhdGlvblR5cGUuQW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViOiBoLlByb3RvSW1wbGVtZW50YXRpb25UeXBlLldlYgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgTXUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIFB1KSwgewogICAgICAgICAgICAgICAgICAgICAgICBOZXh0VmlkZW9Nb2RlRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dDogTS5Qcm90b1BsYXllclVwTmV4dE1vZGUuTmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3A6IE0uUHJvdG9QbGF5ZXJVcE5leHRNb2RlLkxvb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wOiBNLlByb3RvUGxheWVyVXBOZXh0TW9kZS5TdG9wCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ29Qb3NpdGlvbkVudW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmU6IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLk5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQmFyOiBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5Db250cm9sQmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tUmlnaHQ6IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLkJvdHRvbVJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQm90dG9tTGVmdDogTS5Qcm90b0xvZ29Qb3NpdGlvbk1vZGUuQm90dG9tTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcFJpZ2h0OiBNLlByb3RvTG9nb1Bvc2l0aW9uTW9kZS5Ub3BSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcExlZnQ6IE0uUHJvdG9Mb2dvUG9zaXRpb25Nb2RlLlRvcExlZnQKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGxheWVyVHlwZXNFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJblN0cmVhbTogTS5Qcm90b0VsZW1lbnRzVHlwZUVudW0uSW5TdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRTdHJlYW06IE0uUHJvdG9FbGVtZW50c1R5cGVFbnVtLk91dFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluU3RyZWFtSW5BcHA6IE0uUHJvdG9FbGVtZW50c1R5cGVFbnVtLkluU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZTogTS5Qcm90b0VsZW1lbnRzVHlwZUVudW0uTGl2ZQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBHYWxsZXJ5U3R5bGVNb2RlRW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZTogTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbGVkOiBNLlByb3RvR2FsbGVyeVN0eWxlTW9kZS5EZXRhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbDogTS5Qcm90b0dhbGxlcnlTdHlsZU1vZGUuVmlzdWFsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEdhbGxlcnlPcmllbnRhdGlvbkVudW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmRzY2FwZTogTS5Qcm90b0dhbGxlcnlPcmllbnRhdGlvbkVudW0uTGFuZHNjYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydHJhaXQ6IE0uUHJvdG9HYWxsZXJ5T3JpZW50YXRpb25FbnVtLlBvcnRyYWl0CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxSZW5kZXJpbmdFbnVtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBhbmRXaXRoQWQ6IE0uUHJvdG9PdXRzdHJlYW1Jbml0aWFsUmVuZGVyaW5nRW51bS5FeHBhbmRXaXRoQWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxseVJlbmRlcmVkOiBNLlByb3RvT3V0c3RyZWFtSW5pdGlhbFJlbmRlcmluZ0VudW0uRnVsbHlSZW5kZXJlZAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBFbmRBZEJyZWFrUG9saWN5RW51bTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkZTogTS5Qcm90b091dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3lFbnVtLkhpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3VzZVNjcmVlbjogTS5Qcm90b091dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3lFbnVtLkhvdXNlU2NyZWVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcDogTS5Qcm90b091dHN0cmVhbUVuZEFkQnJlYWtQb2xpY3lFbnVtLkxvb3AKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRXUodCwgaSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0LnRvT2JqZWN0KHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0czogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudG9PYmplY3Qoe30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oaSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGxheWVycy5wdXNoKHMpLCBlLmJyb3dzZXIgPSBoLkJyb3dzZXIudG9PYmplY3QoaC5Ccm93c2VyLmZyb21PYmplY3Qoe30pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0czogITAKICAgICAgICAgICAgICAgICAgICB9KSwgZS5nZW9Mb2NhdGlvbiA9IGguR2VvTG9jYXRpb24udG9PYmplY3QoaC5HZW9Mb2NhdGlvbi5mcm9tT2JqZWN0KHt9KSwgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHM6ICEwCiAgICAgICAgICAgICAgICAgICAgfSksIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgTHUgPSBlKDI1KTsKICAgICAgICAgICAgICAgIGNsYXNzIFJ1IGV4dGVuZHMgYXUgewogICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIoKSwgdGhpcy5mZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvID0gbmV3IFVjKCksIHRoaXMueXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdvbWlkX3ZlcmlmaWNhdGlvbl9jbGllbnRfZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5jYWxsU3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGkgPyBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTCA6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJvLm9uKHQsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB5cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuRVIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuTFIgPSBuZXcgdCgpLCAhdGhpcy5MUi5pc1N1cHBvcnRlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbWlkX25vdF9pbXBsZW1lbnRlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLlJSKCksIHRoaXMuWG0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRVIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5mZS5PbWlkVmVyaWZpY2F0aW9uQ2xpZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbWlkX3ZlcmlmaWNhdGlvbl9jbGllbnRfbm90X2ZvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5mZS5PbWlkVmVyaWZpY2F0aW9uQ2xpZW50W0x1LmtdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvbWlkX3ZlcmlmaWNhdGlvbl9jbGllbnRfd3JvbmdfdmVyc2lvbicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZS5PbWlkVmVyaWZpY2F0aW9uQ2xpZW50W0x1LmtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSUigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5MUi5yZWdpc3RlclNlc3Npb25PYnNlcnZlcih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdC50eXBlID09PSBMdS5lLnNlc3Npb25FcnJvciAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ29taWRfdmVyaWZpY2F0aW9uX2NsaWVudF9zZXNzaW9uX2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQuZGF0YS5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5XQVJOSU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFhtKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkxSLmFkZEV2ZW50TGlzdGVuZXIoTHUuZS5nZW9tZXRyeUNoYW5nZSwgdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2VJblZpZXc6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb25zOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0LmRhdGEuYWRWaWV3LCBzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHUuYS5iYWNrZ3JvdW5kZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdS5hLm5vdEZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uc29tZSh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmluY2x1ZGVzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1MKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBpIC8gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Vmlld2FibGVUaHJlc2hvbGQociksIHRoaXMuYm8udHJpZ2dlcihUdC5lLk9taWRWaWV3YWJpbGl0eVRocmVzaG9sZCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnb21pZF92ZXJpZmljYXRpb25fY2xpZW50X2dlb21ldHJ5X2NoYW5nZV9lcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuY2FsbFN0YWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IEJ1ID0gYGNueC1wbGF5ZXItY3NzLSR7IEhlLmEudmVyc2lvbiB9YCwgRHUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogVmkuYS5lbmRQb2ludHMuYXNzZXRzLmNzcy5lbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEJ1CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEZ1IGV4dGVuZHMgYS5hIHsKICAgICAgICAgICAgICAgICAgICBDbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIER1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXREZWxlZ2F0ZUhhbmRsZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50UGxheWJhY2tUaW1lOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbmRlcmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gdGhpcy5yZW5kZXJlci5nZXRBcGlNZXRob2RzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0UGxheWVyVHlwZSgpID09PSBNLlByb3RvRWxlbWVudHNUeXBlRW51bS5PdXRTdHJlYW0gPyAwIDogdC5nZXRWaWRlb0N1cnJlbnRQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRWb2x1bWU6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRBcGlNZXRob2RzKCkuZ2V0Vm9sdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFJlbmRlcmVySW5zdGFuY2UodCwgaSwgZSwgcywgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGh1KHRoaXMsIHQsIGksIGUsIHMsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRWaWV3YWJpbGl0eVNlcnZpY2UodCwgaSwgZSA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy51c2VFeHRlcm5hbFZpZXdhYmlsaXR5U2VydmljZSA/IG5ldyBhdSgpIDogdGhpcy5jcyA/IG5ldyBSdSh3aW5kb3csIHRoaXMuTHMpIDogbmV3IGx1KHQuZ2xvYmFsLCBpLCB0LmlzT3V0U3RyZWFtVHlwZSgpIHx8IGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRQbGF5ZXJSZXNwb25zZSh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWguYS5zZW5kUHJvdG9SZXF1ZXN0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1Jlc3BvbnNlOiBNLlByb3RvRWxlbWVudHNSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b1JlcXVlc3Q6IE0uUHJvdG9FbGVtZW50c1JlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdERhdGE6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IFZpLmEuZW5kUG9pbnRzLmFwaS5wbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBbYWguYl06IEhlLmEudmVyc2lvbiB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0Vycm9yOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbih0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucGFyZW50LmNvbm5hdGl4RHVtbXkgJiYgT2JqZWN0KHBuLmIpKCdjb25uYXRpeER1bW15JywgdGhpcy5wYWdlVXJsKSAmJiAodC5wbGF5ZXJzWzBdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0LnBsYXllcnNbMF0pLCB3aW5kb3cucGFyZW50LmNvbm5hdGl4RHVtbXkpKSwgaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdldFBsYXllck1vZGVsKHQsIGksIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgciA9IG5ldyBDdSh0Lmluc2VydFdpbmRvdyA/IHQuaW5zZXJ0V2luZG93IDogdGhpcy5HTE9CQUwsIHQuaW5zZXJ0Q29udGFpbmVyLCBpLnBsYXllcnNbc10sIGkuYnJvd3Nlci5kZXZpY2UsIGkuc2Vjb25kTGV2ZWxEb21haW4sIHRoaXMuZXh0ZXJuYWxBdHRyaWJ1dGVzLCB0aGlzLmlzU2VydmVybGVzc01vZGUsIGkuc3VwcGx5Q2hhaW4sIGUsIHRoaXMucXVlcnlQYXJhbXMuY254VmlkZW9Qb3NpdGlvbiwgaS5pc1Nlb1RyYWZmaWMgfHwgdGhpcy5xdWVyeVBhcmFtcy5jbnhJc1Nlb1RyYWZmaWMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gci5wbGF5bGlzdC5sZW5ndGggPyAoT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnRzTG9hZGVyX25vX3BsYXlsaXN0X2l0ZW1zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbnVsbCkgOiByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBcGlDb25maWdFbnVtcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE11OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnZXRBcGlDb25maWdFdmVudHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ2V0U3BlY2lmaWNSZXF1ZXN0RGF0YSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHsgbG9jYWxUaW1lc3RhbXA6IE9iamVjdChudC5jKSgpIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXMuY254TWVkaWFJZCA/IHQuZm9yY2VNZWRpYUlkID0gdGhpcy5xdWVyeVBhcmFtcy5jbnhNZWRpYUlkIDogdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMubWVkaWFJZCAmJiAodC5mb3JjZU1lZGlhSWQgPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5tZWRpYUlkKSwgdGhpcy5xdWVyeVBhcmFtcy5jbnhQbGF5bGlzdElkID8gdC5mb3JjZVBsYXlsaXN0SWQgPSB0aGlzLnF1ZXJ5UGFyYW1zLmNueFBsYXlsaXN0SWQgOiB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5wbGF5bGlzdElkICYmICFPYmplY3QobC5oKSh0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5wbGF5bGlzdCkgJiYgKHQuZm9yY2VQbGF5bGlzdElkID0gdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMucGxheWxpc3RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5mb3JjZVNvdXJjZUl0ZW1JZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChydC5oKShpKSAmJiAodC5mb3JjZVNvdXJjZUl0ZW1JZCA9IGkpLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB6cygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuenMoKSwgdGhpcy5leHRlcm5hbEF0dHJpYnV0ZXMuc2V0dGluZ3MuZ2FsbGVyeSA9IHt9LCB0aGlzLmV4dGVybmFsQXR0cmlidXRlcy5zZXR0aW5ncy5vdXRzdHJlYW1TZXR0aW5ncyA9IHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBCUih0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmF0aW9XaWR0aCA9IDE2LCB0LnJhdGlvSGVpZ2h0ID0gOTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRJbml0RnJvbVByb3RvKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ID0gRXUoTS5Qcm90b0VsZW1lbnRzUmVzcG9uc2UsIE0uUHJvdG9FbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLkJSKHQucGxheWVycyksIHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFZ1ID0gZSgxMik7CiAgICAgICAgICAgICAgICBjbGFzcyBVdSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IodCA9ICgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9KSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlYnVnTG9nZ2luZyA9IHQsIHRoaXMuRFIgPSAnZXZlbnRFbWl0dGVkJywgdGhpcy5ibyA9IG5ldyBVYygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmUodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5iby5vbih0aGlzLkRSLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvLnJlbW92ZSh0aGlzLkRSLCB0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdFNlc3Npb25TdGFydCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7IHZpZGVvTWV0YWRhdGE6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFZ1LmEuU2Vzc2lvblN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0Q29udGVudENvbXBsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5Db250ZW50Q29tcGxldGUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRTZXNzaW9uRW5kKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5TZXNzaW9uRW5kIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0UGxheSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuUGxheSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdFBhdXNlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5QYXVzZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkUGxheSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRQbGF5IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRQYXVzZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRQYXVzZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkUGxheWluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRQbGF5aW5nIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRQYXVzZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkUGF1c2VkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRJbXByZXNzaW9uKHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkTWV0YWRhdGE6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21BZE1ldGFkYXRhOiBpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBWdS5hLkFkSW1wcmVzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkQ29tcGxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkQ29tcGxldGUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZFN0b3BwZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkU3RvcHBlZCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkQnJlYWtTdGFydCh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7IGFkQnJlYWtNZXRhZGF0YTogdCB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogVnUuYS5BZEJyZWFrU3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZEJyZWFrQ29tcGxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkQnJlYWtDb21wbGV0ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdFBsYXllclJlc2l6ZWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0geyBwbGF5ZXJEaW1lbnNpb25zTWV0YWRhdGE6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFZ1LmEuUGxheWVyUmVzaXplZAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdE9uRW50ZXJGdWxsc2NyZWVuKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5PbkVudGVyRnVsbHNjcmVlbiB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdE9uRXhpdEZ1bGxzY3JlZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLk9uRXhpdEZ1bGxzY3JlZW4gfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRPblBsYXllckNvbGxhcHNlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuUGxheWVyQ29sbGFwc2VkIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0T25QbGF5ZXJFeHBhbmRlZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuUGxheWVyRXhwYW5kZWQgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZEVycm9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5BZEVycm9yIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0UGxheUVycm9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5QbGF5RXJyb3IgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRSZW5kZXJFcnJvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuUmVuZGVyRXJyb3IgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZENsaWNrVGhydSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRDbGlja1RocnUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZEludGVyYWN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5BZEludGVyYWN0aW9uIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRWaWRlb1N0YXJ0KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaSA9IHsgYWRWaWRlb1N0YXJ0TWV0YWRhdGE6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFZ1LmEuQWRWaWRlb1N0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRMb2FkZWQodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0geyBhZExvYWRlZE1ldGFkYXRhOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBWdS5hLkFkTG9hZGVkCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRTdGF0ZUNoYW5nZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB7IGFkU3RhdGVDaGFuZ2VkTWV0YWRhdGE6IHQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFZ1LmEuQWRTdGF0ZUNoYW5nZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkVmlkZW9GaXJzdFF1YXJ0aWxlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5BZFZpZGVvRmlyc3RRdWFydGlsZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZW1pdEFkVmlkZW9NaWRwb2ludCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRWaWRlb01pZHBvaW50IH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRWaWRlb1RoaXJkUXVhcnRpbGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkVmlkZW9UaGlyZFF1YXJ0aWxlIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbWl0QWRWaWRlb0NvbXBsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsgbmFtZTogVnUuYS5BZFZpZGVvQ29tcGxldGUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRWb2x1bWVDaGFuZ2UodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZSKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IFZ1LmEuVm9sdW1lQ2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgdm9sdW1lOiB0IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZFZvbHVtZUNoYW5nZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5GUih7IG5hbWU6IFZ1LmEuQWRWb2x1bWVDaGFuZ2UgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVtaXRBZFNraXBwZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkFkU2tpcHBlZCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgRlIodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWJ1Z0xvZ2dpbmcgJiYgY29uc29sZS5sb2coJ0Nvbm5hdGl4IFBsYXllciBFbGVtZW50cyBkZWJ1Z2dpbmc6ICcsIHQpLCB0aGlzLmJvLnRyaWdnZXIodGhpcy5EUiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuRlIoeyBuYW1lOiBWdS5hLkRlc3Ryb3kgfSksIHRoaXMuYm8ucmVtb3ZlQWxsKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyICR1LCBOdSA9IGUoMzQpOwogICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgdC5jb25uYXRpeCA9ICdjb25uYXRpeC5jb20nLCB0LmVsZW1lbnRzID0gJ2VsZW1lbnRzLnZpZGVvJzsKICAgICAgICAgICAgICAgIH0oJHUgfHwgKCR1ID0ge30pKTsKICAgICAgICAgICAgICAgIGNvbnN0IEh1ID0gewogICAgICAgICAgICAgICAgICAgIFskdS5jb25uYXRpeF06ICdjbngnLAogICAgICAgICAgICAgICAgICAgIFskdS5lbGVtZW50c106ICdjbnhlbCcKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCBxdSA9IHdpbmRvdy5wYXJlbnQsIHp1ID0gW10sIFd1ID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICdTQ1JJUFQnICE9PSB0LnRhZ05hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfRWxlbWVudHNfZ2V0QnVuZGxlRG9tYWluX25vX2N1cnJlbnRTY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5GQVRBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0LnNyYzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaW5kZXhPZigkdS5lbGVtZW50cykgPiAtMSA/ICR1LmVsZW1lbnRzIDogaS5pbmRleE9mKCR1LmNvbm5hdGl4KSA+IC0xID8gJHUuY29ubmF0aXggOiAoT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19nZXRCdW5kbGVEb21haW5fdW5rb3duX3NyYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uRkFUQUwKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0od2luZG93LmRvY3VtZW50LmN1cnJlbnRTY3JpcHQpOwogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VubG9hZCcsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgenUuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBjb25zdCBHdSA9IE9iamVjdChMaS5mKShxdSkudG9wRnJhbWU7CiAgICAgICAgICAgICAgICBOdS5hLmFiU2VydmljZVR5cGUgPSBOdS5iLkVsZW1lbnRzQUJTZXJ2aWNlOwogICAgICAgICAgICAgICAgY29uc3QgSnUgPSAodCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5BTVBfQ09OVEVYVF9EQVRBIHx8IHQuc2V0dGluZ3MuaW1wbGVtZW50YXRpb25UeXBlID09PSBoLlByb3RvSW1wbGVtZW50YXRpb25UeXBlLkFtcDsKICAgICAgICAgICAgICAgICAgICB9LCBRdSA9IGZ1bmN0aW9uICh0LCBpLCBlLCBzLCByLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBjOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1ID0gSnUodCwgcXUpLCBsID0gbmV3IEZ1KGUsIHF1LCBzLCB1LCByLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgenUucHVzaChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChMaS5qKSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QoVC5sKShEdS5pZCwgR3UpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KFQueSkoRHUsIEd1LmRvY3VtZW50LmhlYWQsIEd1LCAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19Mb2FkZXJfYWRkX2Nzc19saW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoVC5TKShxdSksIGwudXBkYXRlUXVlcnlQYXJhbXMoKSwgbC5sb2FkU2NyaXB0VGFnKHQsIGkpID8gbC5pbnNlcnRSZW5kZXJlcigpIDogT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19tYWluX25vX3NjcmlwdF90YWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfRWxlbWVudHNfbWFpbl9pbnNlcnRSZW5kZXJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IHQubWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHMgPyBkKCkgOiBsLmZpbmRQYWdlVXJsKHF1LCBudWxsID09PSAoYyA9IG51bGwgPT09IChvID0gdCkgfHwgdm9pZCAwID09PSBvID8gdm9pZCAwIDogby5zZXR0aW5ncykgfHwgdm9pZCAwID09PSBjID8gdm9pZCAwIDogYy5hbXBVcmwpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2godCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19tYWluX2luaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGwucmVnaXN0ZXJBcGlFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT09IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdtc2llJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19tYWluX0lFX2NoZWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghV3UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBIdVtXdV07CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHF1W3RdICYmIChpID0gcXVbdF0uY21kKSwgcXVbdF0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVt0XSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXR0aW5ncyA9IHQuc2V0dGluZ3MgfHwge30sIHQuX2FwcFNldHRpbmdzID0gdC5fYXBwU2V0dGluZ3MgfHwge30sIHQuX2FwcFNldHRpbmdzLmNtcCA9IHQuX2FwcFNldHRpbmdzLmNtcCB8fCB7fSwgdC5fYXBwU2V0dGluZ3MudGNmID0gdC5fYXBwU2V0dGluZ3MudGNmIHx8IHt9LCB0LnNldHRpbmdzLmN1c3RvbWl6YXRpb24gPSB0LnNldHRpbmdzLmN1c3RvbWl6YXRpb24gfHwge30sIHQuc2V0dGluZ3MucmVuZGVyaW5nID0gdC5zZXR0aW5ncy5yZW5kZXJpbmcgfHwge30sIHQuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcgPSB0LnNldHRpbmdzLmFkdmVydGlzaW5nIHx8IHt9LCB0LnNldHRpbmdzLm91dHN0cmVhbVNldHRpbmdzID0gdC5zZXR0aW5ncy5vdXRzdHJlYW1TZXR0aW5ncyB8fCB7fSwgdC5zZXR0aW5ncy5nYWxsZXJ5ID0gdC5zZXR0aW5ncy5nYWxsZXJ5IHx8IHt9LCB0LnNldHRpbmdzLl9jb25uYXRpeEludGVybmFscyA9IHQuc2V0dGluZ3MuX2Nvbm5hdGl4SW50ZXJuYWxzIHx8IHt9LCB0LnNldHRpbmdzLnBsdWdpbnMgPSB0LnNldHRpbmdzLnBsdWdpbnMgfHwge30sIHQuc2V0dGluZ3MuYWR2ZXJ0aXNpbmcuc2tpcEFkU2V0dGluZ3MgPSB0LnNldHRpbmdzLmFkdmVydGlzaW5nLnNraXBBZFNldHRpbmdzIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2MDI2NjA4MDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLnRob21zb25yZXV0ZXJzLnJldXRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTIzNDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tLmNueC5hbmRyb2lkc2RrYXBwJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uaW5jbHVkZXMobnVsbCA9PT0gKGUgPSBudWxsID09PSAoaSA9IHQpIHx8IHZvaWQgMCA9PT0gaSA/IHZvaWQgMCA6IGkuX2FwcFNldHRpbmdzKSB8fCB2b2lkIDAgPT09IGUgPyB2b2lkIDAgOiBlLmJ1bmRsZUlEKSAmJiBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnQ05YX1JFVVRFUlNfQVBQU0VUVElOR1MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb246IEpTT04uc3RyaW5naWZ5KHQuX2FwcFNldHRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0ID0gKHQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgZSwgcywgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IE9iamVjdC5hc3NpZ24oe30sIHQpLCBhID0gbnVsbCA9PT0gKGkgPSBoLl9hcHBTZXR0aW5ncykgfHwgdm9pZCAwID09PSBpID8gdm9pZCAwIDogaS5jbXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPYmplY3QocnQuaCkobnVsbCA9PT0gKGUgPSBoLl9hcHBTZXR0aW5ncykgfHwgdm9pZCAwID09PSBlID8gdm9pZCAwIDogZS5nZHByQ29uc2VudFN0cmluZykgfHwgT2JqZWN0KHJ0LmgpKG51bGwgPT09IChzID0gaC5fYXBwU2V0dGluZ3MpIHx8IHZvaWQgMCA9PT0gcyA/IHZvaWQgMCA6IHMuZ2RwclBhcnNlZFZlbmRvclN0cmluZykpICYmIChoLl9hcHBTZXR0aW5ncy5jbXAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50U3RyaW5nOiBPYmplY3QocnQuaCkobnVsbCA9PT0gKG4gPSBhKSB8fCB2b2lkIDAgPT09IG4gPyB2b2lkIDAgOiBuLmNvbnNlbnRTdHJpbmcpID8gYS5jb25zZW50U3RyaW5nIDogaC5fYXBwU2V0dGluZ3MuZ2RwckNvbnNlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRWZW5kb3JDb25zZW50czogT2JqZWN0KHJ0LmgpKG51bGwgPT09IChyID0gYSkgfHwgdm9pZCAwID09PSByID8gdm9pZCAwIDogci5wYXJzZWRWZW5kb3JDb25zZW50cykgPyBhLnBhcnNlZFZlbmRvckNvbnNlbnRzIDogaC5fYXBwU2V0dGluZ3MuZ2RwclBhcnNlZFZlbmRvclN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbyA9IE9iamVjdC5hc3NpZ24oe30sIEplKE9iamVjdC5hc3NpZ24oe30sIGguX2FwcFNldHRpbmdzLmNtcCkpKSwgYyA9IE9iamVjdC5hc3NpZ24oe30sIEplKE9iamVjdC5hc3NpZ24oe30sIGguX2FwcFNldHRpbmdzLnRjZikpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzUHJpdmFjeVN0cmluZzogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJRDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBQYWdlVVJMOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gSmUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzUHJpdmFjeVN0cmluZzogaC5fYXBwU2V0dGluZ3MudXNQcml2YWN5U3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlEOiBoLl9hcHBTZXR0aW5ncy5kZXZpY2VJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBQYWdlVVJMOiBoLl9hcHBTZXR0aW5ncy5hcHBQYWdlVVJMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguX2FwcFNldHRpbmdzID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBoLl9hcHBTZXR0aW5ncyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZjogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzUHJpdmFjeVN0cmluZzogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlEOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwUGFnZVVSTDogZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uIChpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHMgPSBPYmplY3QocnQuaCkodC5fYXBwU2V0dGluZ3MuYnVuZGxlSUQpLCBhID0gT2JqZWN0KHJ0LmgpKHQuX2FwcFNldHRpbmdzLnNka1ZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSBwYXJzZUludCh0Ll9hcHBTZXR0aW5ncy5zZGtWZXJzaW9uLnN1YnN0cigwLCAxKSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldHRpbmdzLnVzZUV4dGVybmFsVmlld2FiaWxpdHlTZXJ2aWNlID0gIShpID49IDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvID0gKCh0LCBpKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7cGx1Z2luczogZX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXA6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNQcml2YWN5U3RyaW5nOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJRDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSB0Ll9hcHBTZXR0aW5ncywgbyA9IEp1KHQsIHF1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck1hbmFnZXJTZXJ2aWNlOiBuZXcgci5iKHF1LCBpLCBvLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcDogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNmOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c1ByaXZhY3lTdHJpbmc6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlEOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzU3RvcmFnZVNlcnZpY2U6IG5ldyBVdShlLl9kZWJ1Z0xvZ2dpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0LCBzKSwgYyA9ICc2Nzk4YTYxYS05YjFlLTQwNTgtOWQ4OC01MTBjMzBiMzdhZDYnLCB1ID0gJzI2MjBmZDk2LTE4YzktNGYwNS1hNjQ5LTE0NTQyYzljYjM3Yyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCExKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KExpLmspKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPYmplY3QoVC5FKSh1LCBpLCBxdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGxheWVySWQgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdSh0LCBpLCBvLCBzLCBhLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfRWxlbWVudHNfbWFpbl9pbml0UGxheWVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaVt0XS5jbWQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KG4uYSkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfRWxlbWVudHNfbWFpbl9wdXNoX2NhbGxiYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogaC5Qcm90b0xvZ2dpbmdMZXZlbEVudW0uSU5GTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGU6IDEwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaVt0XS5jb25maWdFbnVtcyA9IE11LCBpW3RdLmNvbmZpZ0V2ZW50cyA9IFR1LCBpW3RdOwogICAgICAgICAgICAgICAgICAgICAgICB9KCksIGkuZm9yRWFjaCh0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChuLmEpKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1ByZXJlbmRlcl9FbGVtZW50c19tYWluX2NvbW1hbmRzX2NhbGxiYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uOiB0Lm1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxTdGFjazogdC5zdGFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGguUHJvdG9Mb2dnaW5nTGV2ZWxFbnVtLklORk8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm90dGxlOiAxMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Qobi5hKSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQcmVyZW5kZXJfRWxlbWVudHNfbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbjogdC5tZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsU3RhY2s6IHQuc3RhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBoLlByb3RvTG9nZ2luZ0xldmVsRW51bS5JTkZPLAogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZTogMTAwMAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgXSk7CiAgICB9KCkpCn0="},{"name":"sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min","aliases":["sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min"],"kind":{"mime":"application/javascript"},"content":"dmFyIF9zYXRlbGxpdGU7CnsKICAgIGNvbnN0ICRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgeGhyVW5zZW50ID0gMDsKICAgICAgICBjb25zdCB4aHJPcGVuZWQgPSAxOwogICAgICAgIGNvbnN0IHhockhlYWRlcnNSZWNlaXZlZCA9IDI7CiAgICAgICAgY29uc3QgeGhyTG9hZGluZyA9IDM7CiAgICAgICAgY29uc3QgeGhyRG9uZSA9IDQ7CiAgICAgICAgY29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wgPSBTeW1ib2woJ2RlZmVycmVkSGFuZGxlJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZHN0YXJ0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Qcm9ncmVzc1N5bWJvbCA9IFN5bWJvbCgnb25wcm9ncmVzcycpOwogICAgICAgIGNvbnN0IHhock9uQWJvcnRTeW1ib2wgPSBTeW1ib2woJ29uYWJvcnQnKTsKICAgICAgICBjb25zdCB4aHJPbkVycm9yU3ltYm9sID0gU3ltYm9sKCdvbmVycm9yJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3ltYm9sID0gU3ltYm9sKCdvbmxvYWQnKTsKICAgICAgICBjb25zdCB4aHJPblRpbWVvdXRTeW1ib2wgPSBTeW1ib2woJ29udGltZW91dCcpOwogICAgICAgIGNvbnN0IHhock9uTG9hZEVuZFN5bWJvbCA9IFN5bWJvbCgnb25sb2FkZW5kJyk7CiAgICAgICAgY29uc3QgeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sID0gU3ltYm9sKCdvbnJlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICBjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sID0gU3ltYm9sKCdyZWFkeVN0YXRlJyk7CiAgICAgICAgY29uc3QgeGhyVGltZW91dFN5bWJvbCA9IFN5bWJvbCgndGltZW91dCcpOwogICAgICAgIGNvbnN0IHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCA9IFN5bWJvbCgnd2l0aENyZWRlbnRpYWxzJyk7CiAgICAgICAgY29uc3QgeGhyVXBsb2FkU3ltYm9sID0gU3ltYm9sKCd1cGxvYWQnKTsKICAgICAgICBjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2wgPSBTeW1ib2woJ3Jlc3BvbnNlVHlwZScpOwogICAgICAgIGNvbnN0IGRlZmluZUV2ZW50ID0gKG9iaiwgc3ltYm9sKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW1ib2wsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbc3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBjaGFuZ2VSZWFkeVN0YXRlID0gKHhociwgcmVhZHlTdGF0ZSkgPT4gewogICAgICAgICAgICB4aHJbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPSByZWFkeVN0YXRlOwogICAgICAgICAgICB4aHIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnKSk7CiAgICAgICAgfTsKICAgICAgICBsZXQgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgIGNsYXNzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkgJiYgISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3RhcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Qcm9ncmVzc1N5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkFib3J0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uRXJyb3JTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uVGltZW91dFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRFbmRTeW1ib2wpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmxvYWRzdGFydCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2Fkc3RhcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucHJvZ3Jlc3MoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25wcm9ncmVzcyh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmFib3J0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25BYm9ydFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uYWJvcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25BYm9ydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25lcnJvcigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmVycm9yKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uRXJyb3JTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9udGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9udGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZGVuZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ubG9hZGVuZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0VXBsb2FkLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNvbnN0IHhoclVwbG9hZCA9IG5ldyBYTUxIdHRwUmVxdWVzdFVwbG9hZCgpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhockRlZmVycmVkSGFuZGxlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclJlYWR5U3RhdGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclRpbWVvdXRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVXBsb2FkU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeGhyVXBsb2FkLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVzcG9uc2VUeXBlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbnJlYWR5c3RhdGVjaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnJlYWR5c3RhdGVjaGFuZ2UodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZWFkeVN0YXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlbihtZXRob2QsIHVybCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhock9wZW5lZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJUaW1lb3V0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB3aXRoQ3JlZGVudGlhbHMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB3aXRoQ3JlZGVudGlhbHModmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJVbnNlbnQ6CiAgICAgICAgICAgICAgICBjYXNlIHhock9wZW5lZDogewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwnd2l0aENyZWRlbnRpYWxzXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF0gPSAhIXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB1cGxvYWQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmQoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSA9PT0geGhyT3BlbmVkICYmIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhockRvbmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlIFwnc2VuZFwnIG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIG9iamVjdFwncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhYm9ydCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0pOwogICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhoclVuc2VudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCdhYm9ydCcpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVVJMKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgc3RhdHVzVGV4dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlKG1pbWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUeXBlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgcmVzcG9uc2VUeXBlKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gc2V0IHRoZSBcJ3Jlc3BvbnNlVHlwZVwnIHByb3BlcnR5IG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0XCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgY2FzZSAnYXJyYXlidWZmZXInOgogICAgICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6CiAgICAgICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlKCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyAnJyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICcnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhZCB0aGUgXCdyZXNwb25zZVRleHRcJyBwcm9wZXJ0eSBmcm9tIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0XCdzIFwncmVzcG9uc2VUeXBlXCcgaXMgXCdcJyBvciBcJ3RleHRcJyAod2FzIFwnYXJyYXlidWZmZXJcJykuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlWE1MKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnVU5TRU5UJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyVW5zZW50CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnT1BFTkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyT3BlbmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnSEVBREVSU19SRUNFSVZFRCcsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockhlYWRlcnNSZWNlaXZlZAogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwgJ0xPQURJTkcnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJMb2FkaW5nCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnRE9ORScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockRvbmUKICAgICAgICB9KTsKICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdCwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgfSkoJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NCk7CiAgICBjb25zdCAkX19fbW9ja19jN2NhZWM1MDFkY2EyMzg3ID0ge307CiAgICAoZXhwb3J0cyA9PiB7CiAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgIGxldCBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgIGNsYXNzIFN0b3JhZ2UgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgbGVuZ3RoKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBrZXkoaW5kZXgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBrZXlzW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRJdGVtKGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBrZXkpID8gdGhpc1trZXldIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IFN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlSXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFN0b3JhZ2UsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMubG9jYWxTdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLnNlc3Npb25TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgfSkoJF9fX21vY2tfYzdjYWVjNTAxZGNhMjM4Nyk7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge30sIHdpbmRvdy5fc2F0ZWxsaXRlLmNvbnRhaW5lciA9IHsKICAgICAgICAgICAgYnVpbGRJbmZvOiB7CiAgICAgICAgICAgICAgICBtaW5pZmllZDogITAsCiAgICAgICAgICAgICAgICBidWlsZERhdGU6ICcyMDIxLTA2LTE5VDExOjAyOjIxWicsCiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgdHVyYmluZUJ1aWxkRGF0ZTogJzIwMjEtMDQtMjZUMTY6NTQ6MjhaJywKICAgICAgICAgICAgICAgIHR1cmJpbmVWZXJzaW9uOiAnMjcuMS4zJwogICAgICAgICAgICB9LAogICAgICAgICAgICBkYXRhRWxlbWVudHM6IHsKICAgICAgICAgICAgICAgICdnVGFnOmJ0bkZCUGFnZUxpc3RNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwnOiAnQWRkVG9DYXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCc6ICdMZWFkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZGZhOnBhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2c6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1zZy9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCc6ICdodHRwczovLzkxODgyMDUuZmxzLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eWk7c3JjPTkxODgyMDU7dHlwZT1pbnZtZWRpYTtjYXQ9cGVyc28wO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O3RmdWE9O25wYT07b3JkPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tc2cvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sJzogJyBodHRwczovLzkxODgyMDUuZmxzLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eWk7c3JjPTkxODgyMDU7dHlwZT1pbnZtZWRpYTtjYXQ9Y29ycG8wMDtkY19sYXQ9O2RjX3JkaWQ9O3RhZ19mb3JfY2hpbGRfZGlyZWN0ZWRfdHJlYXRtZW50PTt0ZnVhPTtucGE9O29yZD0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLXR3L29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sP2ludGNtcD1CQUwtMTAwNTI0NS00LTEtOTYyLTEwMDAwMDAtQVBBQy1UVy1aSC1GWTE5UTRQQUNDTE5LWEEnOiAnaHR0cHM6Ly85MTg4MjA1LmZscy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHlpO3NyYz05MTg4MjA1O3R5cGU9aW52bWVkaWE7Y2F0PXBlcnNvMDAxO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O3RmdWE9O25wYT07b3JkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi10dy9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbD9pbnRjbXA9QkFMLTEwMDUyNDUtNC0xLTk2Mi0xMDAwMDAwLUFQQUMtVFctWkgtRlkxOVE0UEFDQ0xOS1hBJzogJ2h0dHBzOi8vOTE4ODIwNS5mbHMuZG91YmxlY2xpY2submV0L2FjdGl2aXR5aTtzcmM9OTE4ODIwNTt0eXBlPWludm1lZGlhO2NhdD1wZXJzbzAwMTtkY19sYXQ9O2RjX3JkaWQ9O3RhZ19mb3JfY2hpbGRfZGlyZWN0ZWRfdHJlYXRtZW50PTt0ZnVhPTtucGE9O29yZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OmxvY2FsZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ubG9jYWxlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6cmVnaW9uJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ucmVnaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdlbl9pbicgPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6bG9jYWxlJykgJiYgJ21laXNhJyAhPT0gZSAmJiAoZSA9ICdtZWlzYScpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdkb3RUYWc6ZW5hYmxlZFBhZ2VMaXN0JzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJzE1OTA5Njk1OTkwMDAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2hvbGlkYXkvY29uc3VtZXItc2hpcHBpbmctZGVsaXZlcnktZ3VpZGUuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6ICcxNTc4MjY4Nzk5MDAwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJzE1ODg1NTAzOTkwMDAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnMTU3ODI2ODc5OTAwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcxNTg4NTUwMzk5MDAwJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9ob2xpZGF5Lmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NvdXBvbi1vZmZlcnMvZ3JvdW5kLmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaGVhbHRoY2FyZS92YWNjaW5lLXNoaXBwaW5nLmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Vjb21tZXJjZS9vZmZlci1zdG9yZS1waWNrdXAtYXQtY2hlY2tvdXQuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbi1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLW5vLWFjY291bnQuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbi1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW4tY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0Lmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnItY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS1uby1hY2NvdW50Lmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnItY2Evc2hpcHBpbmctdG9vbHMvZnJlaWdodC1xdW90ZS5odG1sJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2V4cHJlc3MtZnJlaWdodC5odG1sJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUaW1lOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zbWFsbC1idXNpbmVzcy9lY29tbWVyY2Utc29sdXRpb25zLmh0bWwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWU6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NtYWxsLWJ1c2luZXNzL2Vjb21tZXJjZS1zb2x1dGlvbnMuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc21hbGwtYnVzaW5lc3MuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc21hbGwtYnVzaW5lc3MuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0L2ludGVybmF0aW9uYWwtYWlyLWZyZWlnaHQtcXVvdGUuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0L2ludGVybmF0aW9uYWwtYWlyLWZyZWlnaHQtcXVvdGUuaHRtbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZTogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OmRldmljZVR5cGUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCcobWluLXdpZHRoOiA5OTNweCknKS5tYXRjaGVzICYmIChlID0gJ2Rlc2t0b3AnKSwgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDk5MnB4KScpLm1hdGNoZXMgJiYgKGUgPSAndGFibGV0JyksIHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA3NjdweCknKS5tYXRjaGVzICYmIChlID0gJ21vYmlsZScpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnBhZ2UgdHlwZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIGZvcmNlTG93ZXJDYXNlOiAhMCwKICAgICAgICAgICAgICAgICAgICBjbGVhblRleHQ6ICEwLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UuY2F0ZWdvcnkucGFnZVR5cGUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpBZFdvcmRzRXZlbnRNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdBVy04NjMyMzg3OTMveXNaVENNT1I3NFlCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS5odG1sJzogJ0FXLTg2MzIzODc5My8wWnVGQ056WDVZWUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvcGFja2luZy5odG1sJzogJ0FXLTg2MzIzODc5My9qcnA1Q09xQzc0WUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwnOiAnQVctODYzMjM4NzkzL0VBWFlDUFNENzRZQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL2J1c2luZXNzLXRvb2xraXQuaHRtbCc6ICdBVy04NjMyMzg3OTMvOW5EdkNJajc3TGNCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvYnVzaW5lc3MuaHRtbCc6ICdBVy04NjMyMzg3OTMvYjZJZENMZm5oN2dCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwvaG93LXRvLXNoaXAuaHRtbCc6ICdBVy04NjMyMzg3OTMvYlpzM0NLSHBoN2dCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nLzctZGF5LWRlbGl2ZXJ5Lmh0bWwnOiAnQVctODYzMjM4NzkzL2JqblFDT3FKN2JjQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9lY29tbWVyY2UvZnVsZmlsbG1lbnQtc2hpcHBpbmcuaHRtbCc6ICdBVy04NjMyMzg3OTMvdEtTTENMWHJfTGNCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2FnMTMzOTg2MDIuaHRtbCc6ICcvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvYWcxMzM5ODYwMi5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9lY29tbWVyY2UuaHRtbCc6ICdBVy04NjMyMzg3OTMvcGc0NENQT0g2TUlCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2JpZy1jb21tZXJjZS5odG1sJzogJ0FXLTg2MzIzODc5My9PQWZSQ0xHVHlNMEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sJzogJ0FXLTg2MzIzODc5My9fd2Z1Q0tQUXRjOEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwnOiAnQVctODYzMjM4NzkzL1ZpVWlDSzJubnRBQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwnOiAnQVctODYzMjM4NzkzL2VTN2JDTXJoM053QkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL21hbmFnZS15b3VyLWRlbGl2ZXJpZXMuaHRtbCc6ICdBVy04NjMyMzg3OTMvblVlRkNMRHY1ZHdCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2hvbGlkYXkvY29uc3VtZXItc2hpcHBpbmctZGVsaXZlcnktZ3VpZGUuaHRtbCc6ICdBVy04NjMyMzg3OTMvRjV2NUNKX0tydUVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2hvbGlkYXkuaHRtbCc6ICdBVy04NjMyMzg3OTMvS19BeUNQNjFrLUVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2NvbnN1bWVyLW9mZmVycy5odG1sJzogJ0FXLTg2MzIzODc5My9pMzdmQ05YcGtPSUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlL3dhbGdyZWVucy1wYWNrYWdlLXBpY2t1cC5odG1sJzogJ0FXLTg2MzIzODc5My9DT3NLQ01lRWhlSUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZmxhc2gtc2FsZS1vZmZlcnMuaHRtbCc6ICdBVy04NjMyMzg3OTMvQzQwMkNPXzlrT0lCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UuaHRtbCc6ICdBVy04NjMyMzg3OTMvU1kwcUNONjc4LUVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2hvbGQtYXQtbG9jYXRpb24uaHRtbCc6ICdBVy04NjMyMzg3OTMvbTBGeENKcTFsdU1CRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NvdXBvbi1vZmZlcnMvZ3JvdW5kLmh0bWwnOiAnQVctODYzMjM4NzkzL1ZtbHdDSU95LWVFQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9oZWFsdGhjYXJlL3ZhY2NpbmUtc2hpcHBpbmcuaHRtbCc6ICdBVy04NjMyMzg3OTMvdkZ6c0NPZnFuUEVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Vjb21tZXJjZS9vZmZlci1zdG9yZS1waWNrdXAtYXQtY2hlY2tvdXQuaHRtbCc6ICdBVy04NjMyMzg3OTMvUkNTTENJUF9sZk1CRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL3JldHVybnMvdGVjaG5vbG9neS5odG1sJzogJ0FXLTg2MzIzODc5My9UTHlZQ01QN3pPMEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZWNvbW1lcmNlL3NoaXBwaW5nLW9wdGlvbnMuaHRtbCc6ICdBVy04NjMyMzg3OTMvUzBhNENNT2c4TzBCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwuaHRtbCc6ICdBVy04NjMyMzg3OTMvdkN3Q0NLbTUzLTBCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2hvbWUtZGVsaXZlcnkuaHRtbCc6ICdBVy04NjMyMzg3OTMvT0UzOUNNcjN6ZTBCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Vjb21tZXJjZS90b29scy1hbmQtc2VydmljZXMuaHRtbCc6ICdBVy04NjMyMzg3OTMvSTNZWUNJM0tsTzRCRUluMXo1c0QnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXphL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdBVy02OTg1MjA4MTcvWnNmekNQLWlxck1CRVBHcGlzMEMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXphL29wZW4tYWNjb3VudC5odG1sJzogJ0FXLTY5ODUyMDgxNy9YUnE2Q0p2bm5iTUJFUEdwaXMwQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4temEvY2FtcGFpZ24vZGVsaXZlcmluZy13aGF0LW1hdHRlcnMuaHRtbCc6ICdBVy02MzQzNzM2MDcvYXBKS0NMcUY0ZEVCRU9lTHY2NEMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L2NhbXBhaWduL3R0Lmh0bWwnOiAnQVctNjgzOTg3MDgyLzhyU29DTkRCa0xnQkVJcWhrOFlDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1hdS9uZXctY3VzdG9tZXIuaHRtbCc6ICdBVy02ODM5ODcwODIvcHItckNKX2JoYmdCRUlxaGs4WUMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuejogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW56L2NhbXBhaWduL3R0Lmh0bWwnOiAnQVctNjgzOTg3MDgyL2NxaldDUExnaGJnQkVJcWhrOFlDJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1uei9uZXctY3VzdG9tZXIuaHRtbCc6ICdBVy02ODM5ODcwODIvZVQ3dENQeUc5cmNCRUlxaGs4WUMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW4nOiB7ICcvZW4taW4vb3Blbi1hY2NvdW50L3RoYW5rLXlvdS5odG1sJzogJ0FXLTEwNjY1MDExMDcvekFqdUNJWGE4Z0VRODRmR19BTScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnbG9naW46ZmR4X2NiaWQnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoJ2ZkeF9jYmlkJykgPyBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoJ2ZkeF9jYmlkJykgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZXh0ZXJuYWwtY2FtcGFpZ246bGluayc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0xJTksnLAogICAgICAgICAgICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmU6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50Omhpc3RvcmljYWxQYWdlTmFtZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8uaGlzdG9yaWNhbFBhZ2VOYW1lJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6cGFnZSBuYW1lJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ25vIHBhZ2VOYW1lIGZvdW5kJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX2ZkeC5wY2ZVdGlsKCksIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubWF0Y2goL3d3dyhzYm94LmlkZXZ8YmFzZS5pZGV2fGRldi5pZGV2fGRydC5pZGV2fHN0cmVzcy5kbXouaWRldnxiaXQuaWRldnx0ZXN0fCkuZmVkZXguY29tL2dpKSA/IHQgPSAnZmVkZXgvJyA6IGUubWF0Y2goLyh3ZWJhcHAuZGV2Lnx3d3cufClmdG4uZmVkZXguY29tL2dpKSAmJiAodCA9ICdmdG4vJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OnBhZ2VQYXRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAhPSBuLnNsaWNlKDAsIHQubGVuZ3RoKSAmJiAobiA9IHQgKyBuKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpDb25maWdMb2dpYyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6Q29uZmlnSURNYXBwaW5nJyksIHQgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpjb3VudHJ5Q29kZScpLCBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmICcnICE9PSBlICYmIHZvaWQgMCAhPT0gdCAmJiAnJyAhPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xIDwgdC5pbmRleE9mKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnID09PSBuICYmIChuID0gZS51cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc0FjY291bnQ6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpyZWdpb24nKSwgdCA9ICdmZWRleGdsYmxkZXYnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZSAmJiAnJyAhPSBlICYmICgnd3d3LmZlZGV4LmNvbScgIT0gd2luZG93LmxvY2F0aW9uLmhvc3QgJiYgJ2RldmVsb3Blci5mZWRleC5jb20nICE9IHdpbmRvdy5sb2NhdGlvbi5ob3N0IHx8ICh0ID0gJ2ZlZGV4Z2xibCcsICdjYW4nID09IGUgPyB0ICs9ICcsZmVkZXhjYScgOiB0ID0gdCArICcsZmVkZXgnICsgZSkpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnVGFnOmJ0bk9yYW5nZUFXUGFnZUxpc3RNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25VcENvbnRpbnVlQnV0dG9uOiAnQVctODYzMjM4NzkzL1NwRzFDUHJxM053QkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRQaW5CdXR0b246ICdBVy04NjMyMzg3OTMvbnAyRENLNy0tTndCRUluMXo1c0QnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhYW06Y291bnRyeUZsYWcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdhYW06Y291bnRyaWVzJyksIHQgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpjb3VudHJ5Q29kZScpLCBuID0gdm9pZCAwICE9PSB0ICYmICcnICE9PSB0ID8gdCA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICE9PSBuICYmIC0xIDwgZS5pbmRleE9mKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGRvdFRhZ1BpeGVsTWFwcGluZzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICcxMDAwNjQ1OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9ob2xpZGF5L2NvbnN1bWVyLXNoaXBwaW5nLWRlbGl2ZXJ5LWd1aWRlLmh0bWwnOiAnMTAwMDY0NTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sJzogJzEwMDkyOTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6ICcxMDA5MjkwNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9ob2xpZGF5Lmh0bWwnOiAnMTAwMDY0NTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvY291cG9uLW9mZmVycy9ncm91bmQuaHRtbCc6ICcxMDE0MjIyNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwnOiAnMTAxNDIyMjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaGVhbHRoY2FyZS92YWNjaW5lLXNoaXBwaW5nLmh0bWwnOiAnMTAxNDIyMjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZWNvbW1lcmNlL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dC5odG1sJzogJzEwMTQyMjI3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL3NoaXBwaW5nLXRvb2xzL2ZyZWlnaHQtcXVvdGUtbm8tYWNjb3VudC5odG1sJzogJzEwMTQ1NjcwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL3NoaXBwaW5nLXRvb2xzL2ZyZWlnaHQtcXVvdGUuaHRtbCc6ICcxMDE0OTYwOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQuaHRtbCc6ICcxMDE0NTY3MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLW5vLWFjY291bnQuaHRtbCc6ICcxMDE0NTY4MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zaGlwcGluZy10b29scy9mcmVpZ2h0LXF1b3RlLmh0bWwnOiAnMTAxNDk2MTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0Lmh0bWwnOiAnMTAxNDU2ODQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc21hbGwtYnVzaW5lc3MvZWNvbW1lcmNlLXNvbHV0aW9ucy5odG1sJzogJzEwMTQ3NjMxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NtYWxsLWJ1c2luZXNzL2Vjb21tZXJjZS1zb2x1dGlvbnMuaHRtbCc6ICcxMDE0NzYzMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zbWFsbC1idXNpbmVzcy5odG1sJzogJzEwMTQ3NjMzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NtYWxsLWJ1c2luZXNzLmh0bWwnOiAnMTAxNDc2MzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvZXhwcmVzcy1mcmVpZ2h0L2ludGVybmF0aW9uYWwtYWlyLWZyZWlnaHQtcXVvdGUuaHRtbCc6ICcxMDE0OTUwNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQvaW50ZXJuYXRpb25hbC1haXItZnJlaWdodC1xdW90ZS5odG1sJzogJzEwMTQ5NTA2JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnbG9naW46dXNlci1pZCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoJ2ZjbF91dWlkJykgPyBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoJ2ZjbF91dWlkJykgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndHJhZGVkZXNrOnBhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJy8vaW5zaWdodC5hZHNydnIub3JnL3RyYWNrL2NvbnYvP2Fkdj1zdWVudHZiYSYnLCB0ID0gJy8vaW5zaWdodC5hZHNydnIub3JnL3RyYWNrL3B4bC8/YWR2PXN1ZW50dmJhJic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZnJlaWdodC1zZXJ2aWNlcy9pbm5vdmF0aW9uLmh0bWwnOiBlICsgJ2N0PTA6aDl2YWhobCZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9jdXN0b20tcHJvZmVzc2lvbmFsLXByaW50aW5nLmh0bWwnOiBlICsgJ2N0PTA6Z2Y4YjJnYSZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9zbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzLmh0bWwnOiBlICsgJ2N0PTA6M216OG9hdSZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9mcmVpZ2h0LXNlcnZpY2VzL2x0bC9xdW90ZS5odG1sJzogZSArICdjdD0wOjNpZDNmamcmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcG9zc2liaWxpdGllcy5odG1sJzogZSArICdjdD0wOm56dXk4ZWImZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZmxhc2gtc2FsZS1vZmZlcnMuaHRtbCc6IGUgKyAnY3Q9MDpwbnAycDVjJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL29ubGluZS1wcmludGluZy5odG1sJzogZSArICdjdD0wOmRvaDJmdGcmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwnOiBlICsgJ2N0PTA6d2JucTdvciZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9lbTE1NjkyMjEzLmh0bWwnOiBlICsgJ2N0PTA6em4zNG9jNyZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jcmVhdGUtYWNjb3VudC5odG1sJzogZSArICdjdD0wOjhxc2w4aHcmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvZW0xNTY5MjAxMy5odG1sJzogZSArICdjdD0wOnYxNHdlbzAmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvZW0xNTY5MjExMy5odG1sJzogZSArICdjdD0wOmpnM3A1bXomZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaG9saWRheS9jb25zdW1lci1zaGlwcGluZy1kZWxpdmVyeS1ndWlkZS5odG1sJzogdCArICdjdD0wOjhpaWNvMWgmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvYnVzaW5lc3Mtc29sdXRpb25zL2tub3dsZWRnZS1jZW50ZXIuaHRtbCc6IHQgKyAnY3Q9MDoyb3RsbDA4JmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2FnMTMzOTg2MDIuaHRtbCc6IHQgKyAnY3Q9MDp6aHRzbHN3JmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2Rlc2lnbi1zZXJ2aWNlcy5odG1sJzogdCArICdjdD0wOmQ1ZjE4b3MmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb2ZmaWNlLWRlcG90LW9mZmljZW1heC5odG1sJzogdCArICdjdD0wOnppdWEzMHomZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvbmF0aW9uYWwtYmlkLWNlbnRlci5odG1sJzogdCArICdjdD0wOmZtenJrNGYmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlL3RhcmdldC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UuaHRtbCc6IHQgKyAnY3Q9MDp6cmc2OGViJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCc6IHQgKyAnY3Q9MDozbXo4b2F1JmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2Rlc2lnbi1zZXJ2aWNlcy5odG1sJzogdCArICdjdD0wOmQ1ZjE4b3MmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaG9saWRheS9jb25zdW1lci1zaGlwcGluZy1kZWxpdmVyeS1ndWlkZS5odG1sJzogdCArICdjdD0wOmRrOHdxc28mZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaG9saWRheS5odG1sJzogdCArICdjdD0wOnFrMnJ0bGImZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvY29uc3VtZXItb2ZmZXJzLmh0bWwnOiB0ICsgJ2N0PTA6NnM4NHV4eCZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwnOiB0ICsgJ2N0PTA6amVyb21wcCZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvZG9sbGFyLWdlbmVyYWwtcGljay11cC1kcm9wLW9mZi1wYWNrYWdlLmh0bWwnOiB0ICsgJ2N0PTA6N3c4YnF6ayZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9ob2xkLWF0LWxvY2F0aW9uLmh0bWwnOiB0ICsgJ2N0PTA6bzRjaHBybiZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwnOiB0ICsgJ2N0PTA6M2hwdzF1cSZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9yZXR1cm5zL2J1c2luZXNzLmh0bWwnOiB0ICsgJ2N0PTA6eGx3Yjh4ZCZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9yZXR1cm5zL3RlY2hub2xvZ3kuaHRtbCc6IHQgKyAnY3Q9MDoyYmVhbXBkJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL3JldHVybnMuaHRtbCc6IHQgKyAnY3Q9MDptcjByc2ZmJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NvdXBvbi1vZmZlcnMvZ3JvdW5kLmh0bWwnOiB0ICsgJ2N0PTA6ODBsaXpnMyZmbXQ9MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9oZWFsdGhjYXJlL3ZhY2NpbmUtc2hpcHBpbmcuaHRtbCc6IHQgKyAnY3Q9MDo2bnR0ZjZiJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Vjb21tZXJjZS9vZmZlci1zdG9yZS1waWNrdXAtYXQtY2hlY2tvdXQuaHRtbCc6IHQgKyAnY3Q9MDpxczJrZnFiJmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIvbWFuYWdlLXlvdXItZGVsaXZlcmllcy5odG1sJzogdCArICdjdD0wOmVld2M3aTMmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc21hbGwtYnVzaW5lc3MvZ3JhbnQtY29udGVzdC5odG1sJzogdCArICdjdD0wOng4MjVyeWgmZm10PTMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQQ0Y6VXRpbCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ1BDRjpBbGxvd2VkUHJvZERvbWFpbnMnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQubWF0Y2goL3d3dyhiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpID8gdCA6IDAgPCBlLmxlbmd0aCAmJiAtMSA8IGUuaW5kZXhPZih0KSA/ICd3d3cuZmVkZXguY29tJyA6ICd3d3d0ZXN0LmZlZGV4LmNvbSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3ZhOmNhYXNEaXNhYmxlZENvdW50cnlMaXN0JzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aV92bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc191cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCB0ID0gX2ZkeC5wYWdlRmxhZyhlLCBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpsb2NhbGUnKSksIG4gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZmVkZXh0cmFjay8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZlZGV4dHJhY2tpbmcvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHIgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIGkgPSBfZmR4LnBhZ2VGbGFnKG4sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0IHx8ICFpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnNpdGUgc2VjdGlvbic6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UuY2F0ZWdvcnkucHJpbWFyeUNhdGVnb3J5JyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6Y291bnRyeUNvZGUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnRkRYLkRBVEFMQVlFUi5wYWdlLnBhZ2VJbmZvLmNvdW50cnknIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpjdGFPcmFuZ2VBV1BhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIvYnVzaW5lc3MtdG9vbGtpdC5odG1sJzogJ0FXLTg2MzIzODc5My9hUms0Q0lmcTBia0JFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9yZXR1cm5zL2J1c2luZXNzLmh0bWwnOiAnQVctODYzMjM4NzkzL3k2a3NDTmVRd2JrQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwvaG93LXRvLXNoaXAuaHRtbCc6ICdBVy04NjMyMzg3OTMvTkFQY0NPT1czYmtCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvNy1kYXktZGVsaXZlcnkuaHRtbCc6ICdBVy04NjMyMzg3OTMvOTE3R0NPbnkwYmtCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvYWcxMzM5ODYwMi5odG1sJzogJ0FXLTg2MzIzODc5My9tb2FNQ0lmd3A3b0JFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9iaWctY29tbWVyY2UuaHRtbCc6ICdBVy04NjMyMzg3OTMvZ2RGdkNNS0s2TTBCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwnOiAnQVctODYzMjM4NzkzL1NicHZDTWlVcnRBQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCc6ICdBVy04NjMyMzg3OTMvS3MxLUNOS1hoTkVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGVsaXZlcnktbWFuYWdlci5odG1sJzogJ0FXLTg2MzIzODc5My9vbWY5Q09MMDVkd0JFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9jb25zdW1lci1vZmZlcnMuaHRtbCc6ICdBVy04NjMyMzg3OTMvREZIb0NKYXpoZUlCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlL3dhbGdyZWVucy1wYWNrYWdlLXBpY2t1cC5odG1sJzogJ0FXLTg2MzIzODc5My9oR092Q0xmTGtPSUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvZG9sbGFyLWdlbmVyYWwtcGljay11cC1kcm9wLW9mZi1wYWNrYWdlLmh0bWwnOiAnQVctODYzMjM4NzkzL2FLLU1DTHV0NC1FQkVJbjF6NXNEJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnYWFtOmNvbnRhaW5lck5TSURNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW46ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1czogJzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWM6ICczJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldTogJzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYzogJzUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1laXNhOiAnNicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3NlYXJjaDpzcERhdGEgLSBKU09iamVjdENoYW5nZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnNlYXJjaC5yZXN1bHQudG90YWxSZXN1bHRDb3VudCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhYW06cmVnaW9uRmxhZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2FhbTpyZWdpb25zJyksIHQgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpyZWdpb24nKSwgbiA9IHZvaWQgMCAhPT0gdCAmJiAnJyAhPT0gdCA/IHQgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyAhPSBuICYmIC0xIDwgZS5pbmRleE9mKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnVGFnOlRhcmdldEVuYWJsZWRNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFB8WFR8VVNJU3xZVFB8SEVST3xDVEF8Q2hlY2tJbnRsU2VydmljZXMnOiAnQVctODYzMjM4NzkzL05XdDNDTzJqOE8wQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFB8WFR8VVNJU3xZVFB8SEVST3xDVEF8Q0FfQ2hlY2tJbnRsU2VydmljZXMnOiAnQVctODYzMjM4NzkzL05XdDNDTzJqOE8wQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFB8WFR8VVNFVFN8WVRQfEhFUk98Q1RBfEhvd1RvU2F2ZSc6ICdBVy04NjMyMzg3OTMvQXBMWENQUzloTzRCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUHxYVHxVU0hEfFlUUHxIRVJPfENUQXxDaGVja1RyYW5zaXRUaW1lcyc6ICdBVy04NjMyMzg3OTMvemZ5dENQNkQ0dTBCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUHxBQnxVU1M3RHxMZW5zcmVudGFsQXxIRVJPfENUQXxDaGVja1RoZVNlcnZpY2VNYXAnOiAnQVctODYzMjM4NzkzL3ZOdTFDTkQyZy00QkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFB8QUJ8VVNTN0R8TGVuc1JlbnRhbEJ8SEVST3xDVEF8R2V0QVJhdGVOb3cnOiAnQVctODYzMjM4NzkzL1BpQlNDTDM0Zy00QkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFB8QUJ8VVNTN0R8UmVzaXxIRVJPfENUQXxTZXJ2aWNlTWFwJzogJ0FXLTg2MzIzODc5My96Q2lHQ1A3QjdQWUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RQfEFCfFVTUzdEfFJlc2l8SEVST3xDVEF8R2V0QVJhdGVOb3cnOiAnQVctODYzMjM4NzkzL1ZBRERDT2lZOXZZQkVJbjF6NXNEJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdub3JtYWwnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8uZGVsYXlUeXBlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3ZhOmRpc2FibGVkUGFnZUxpc3QnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvY3VzdG9tZXItc3VwcG9ydC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2NvbnRhY3QtdXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lcy11cy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItbXEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2VydmljZWFsZXJ0Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvcXVpY2staGVscCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9kYS1kay8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvbm8tbm8vJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3N2LXNlLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1ncC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItaHQvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3ZpLXZuLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9hci1hZS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvb2ZmaWNlL3NhbXN1bmctcmVwYWlyLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc3BhY2UuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9vZmZpY2UvcHNnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3RydXN0LWNlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jcmVhdGUtYWNjb3VudC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Vjb21tZXJjZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zbWFsbC1idXNpbmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9zbWFsbC1idXNpbmVzcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWdiLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1pZS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tZGsvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW5vLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1zZS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tbmwvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL25sLW5sLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1mci8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItZnIvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWl0LycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9pdC1pdC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYmUvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWJlLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9ubC1iZS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tZXMvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VzLWVzLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1hdC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tZGUvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2RlLWRlLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1wbC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvcGwtcGwvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnYWFtOmNvdW50cmllcyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpFbmFibGVkTG9jYWxlRXBpYyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpsb2NhbGUnKS5tYXRjaCgvYXJfYWV8ZW5fYWV8ZW5fYmh8ZW5fYnJ8ZW5fY2x8ZW5fY258ZW5fY298ZW5fa3d8ZW5fbXh8ZW5femF8ZXNfY2x8ZXNfY298ZXNfbXh8cHRfYnJ8emhfY24vZ2kpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdsb2dpbjpzdGF0dXMnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoJ2ZkeF9sb2dpbicpICYmIF9zYXRlbGxpdGUuY29va2llLmdldCgnZmR4X2xvZ2luJykgPyAnTG9nZ2VkIEluJyA6ICdMb2dnZWQgT3V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnc2l0ZS1kaWFnbm9zdGljczp2aWV3cG9ydCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIEZEWC5CUkVBS1BPSU5UUyAmJiAoZSA9IHZvaWQgMCAhPT0gRkRYLkJSRUFLUE9JTlRTLmdldFZpZXdQb3J0KCkgPyBGRFguQlJFQUtQT0lOVFMuZ2V0Vmlld1BvcnQoKSA6ICcnKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndmE6Y2Fhc0VuYWJsZWRDb3VudHJ5TGlzdCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX2NoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdF9jaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2JyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9teCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2FyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fYm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9jbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2NvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fY3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9kbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fZ3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9obicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX25pJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fcGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9weScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3BlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fcHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl91eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3ZlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fYnonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9haScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2FnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fZ2YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9neScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3NyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fYXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9icycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2JiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fYm0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9icScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3ZnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fa3knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9jdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2RtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fam0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9tcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX21mJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fc3gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9rbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2xjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fdmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl90dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX3RjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fdmknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9ncCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX21xJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5faHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl91cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX2NhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fY2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9jaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX214JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19ibycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX2NsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19jcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX2RvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfZWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19zdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX2d0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfaG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19uaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX3BhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfcHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19wZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX3ByJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfdXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc192ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX2luJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fYWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl96YScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2FwcDpzaGlwU2VnSWRzJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc4MDkyNjg2JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnRmxhc2hUYWxraW5nOnBhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7ICcvZW4tdXMvcG9zc2liaWxpdGllcy5odG1sJzogJ2h0dHBzOi8vc2VydmVkYnkuZmxhc2h0YWxraW5nLmNvbS9zcG90LzEvNTI4NDsxMTc5NjQ7MTI1MDkvP3Nwb3ROYW1lPUZlZEV4XzIwMjBfTGFuZGluZ19QYWdlJmNhY2hlYnVzdGVyPScgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpDb25maWdJRE1hcHBpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQ29uZmlnSUQ6ICdEQy00MTkxMjYzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVdDb25maWdJRDogJ0FXLTg2MzIzODc5MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQ29uZmlnSUQ6ICdEQy00MTkxMjYzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVdDb25maWdJRDogJ0FXLTEwMTU3Njc0OTAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVdDb25maWdJRDogJzY5ODUyMDgxNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQ29uZmlnSUQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBV0NvbmZpZ0lEOiAnQVctNjgzOTg3MDgyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbno6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENDb25maWdJRDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICdBVy02ODM5ODcwODInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtMjUyNjI4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtMjUyNjI4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtMjUyNjI4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtMjUyNjI4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtOTkyOTk2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtOTkyOTk2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtOTkyOTk2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoazogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtOTkyOTk2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0NvbmZpZ0lEOiAnREMtOTkyOTk2OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFXQ29uZmlnSUQ6ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkb3RUYWdQaXhlbElkOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbElkcyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdkb3RUYWdQaXhlbE1hcHBpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBlICYmICcnICE9IGUgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHBpeGVsSWRzICYmICcnICE9IHBpeGVsSWRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gcGl4ZWxJZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBlLmluZGV4T2YobikgJiYgKHQgPSBwaXhlbElkc1tuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY2xpY2s6YmxvY2tMaXN0JzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9sZCBhdCBsb2NhdGlvbixmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludGVybmF0aW9uYWwgdHJhZmZpYyBpbiBhcm1zIHJlZ3VsYXRpb25zLGZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVsaXZlcnkgb24gaW52b2ljZSBhY2NlcHRhbmNlLGZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2F2ZSBkaWEgcmV0dXJuIGFkZHJlc3MsZmFsc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5zIGNsZWFyYW5jZSxmYWxzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5ncGFnZTF0cmFja2luZ251bWJlcnNwcmVzZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXN1bW1hcnlwYWdlLXRyYWNrYnRuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLWNkby1idXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ3BhZ2UtdHJhY2tidG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LWN1cnJlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtY3VycmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay10cmFja2J5cmVmZXJlbmNlLWFjY291bnRudW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1hc3Njc2hpcG1lbnRpY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1ub3RpZmljYXRpb25wYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay10cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcnlleGNlcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcnlleGNlcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y2hlY2tib3gtZGVsaXZlcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljaGVja2JveC1kZWxpdmVyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LWV4Y2VwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNlbmRub3RpZnljaGVja2JveC1leGNlcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1hY3Rpb25iYXItbW9yZWFjdGlvbnNfaGVhZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXRyYWNrbW9kdWxlLXBsYWNhcmQtcHJlc3NlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ210cmstZGV0YWlscGFnZS1zY2hlZHVsZWRkZWxpdmVyeWRhdGVpY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNvbnRpbnVlYnRuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWRlbGl2ZXJlZHN0YXR1c3NlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljb250aW51ZWJ0bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNlbmRub3RpZnllc3RkZWx1cGRhdGVzdGF0dXNzZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ210cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5ZGVsaXZlcmVkc3RhdHVzc2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstZGV0YWlscGFnZS1zZW5kbm90aWZ5Y3VycmVucnN0YXR1c3NlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnljdXJyZW5yc3RhdHVzc2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstdHJhY2ttb2R1bGUtd2F0Y2hsaXN0dGFiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnllc3RkZWx1cGRhdGVzdGF0dXNzZWxlY3RlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNlbmRub3RpZnlleGNlcHRpb25zc3RhdHVzc2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLXRyYWNrbW9kdWxlLWFsbHNoaXBtZW50c3RhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNoaXBtZW50c25hcHNob3QtZGVzdGluYXRpb24taGVscCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXRpbWV6b25lZHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LXRlbmRlcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWRldGFpbHBhZ2Utc2VuZG5vdGlmeWNoZWNrYm94LXRlbmRlcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLXNlbmRub3RpZnlleGNlcHRpb25zc3RhdHVzc2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstdHJhY2tieXJlZmVyZW5jZS1kZXN0aW5hdGlvbmNvdW50cnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2Utc2hpcGRhdGVpY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay10cmFja21vZHVsZS13YXRjaGxpc3R0YWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2Utc3RhbmRhcmR0cmFuc2l0aGVscGljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstdHJhY2tieXJlZmVyZW5jZS10cmFja2J0bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNoaXBtZW50ZmFjdHMtaGVscC1pY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXRyYWNrbW9kdWxlLWFsbHNoaXBtZW50c3RhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay10cmFja2J5dGNuLXRjbi1pbnB1dGZpZWxkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRyay1kZXRhaWxwYWdlLW9wb2RwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWxwYWdlLXNhdmV0cmFja251bWJlcmNoa2JveC1jaGVja2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXN1bW1hcnlwYWdlMXRyYWNraW5nbnVtYmVyc3ByZXNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdHJrLWRldGFpbHBhZ2UtdHJhdmVsaGlzdG9yeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ210cmstdHJhY2ttb2R1bGUtZXhjZXB0aW9uc3RhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ210cmstdHJhY2ttb2R1bGUtcGxhY2FyZC1wcmVzc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWRldGFpbHBhZ2UtdHJhdmVsaGlzdG9yeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1kZXRhaWx2aWV3LXNjcm9sbGluZ2xpc3QtcGxhY2FyZC1wcmVzc2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXRyYWNrbW9kdWxlLXdhdGNobGlzdHRhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay10cmFja21vZHVsZS1leGNlcHRpb25zdGFiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGluayBjbGljazogYWRkcmVzc2NoZWNrLCB0cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0Y3VzdG9taXplZHZpZXdzZnJvbWFkbWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rIGNsaWNrOiBhZGRyZXNzcmVzdWx0LCB0cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2F2ZSBhcyBkZWZhdWx0IHJldHVybiBhZGRyZXNzLGZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmV0dXJuczpzYXR1cmRheSBkZWxpdmVyeSBhbGxvd2VkLGZhbHNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGRyfHRhYnwxfFNoaXBwaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGRyfHRhYnwyfFRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGRyfHRhYnwzfFByaW50aW5nIFNlcnZpY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGRyfHRhYnw0fExvY2F0aW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hkcnx0YWJ8NXxTdXBwb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVyb3xjdWJlfFJBVEUmU0hJUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm98Y3ViZXxUUkFDSycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm98Y3ViZXxMT0NBVElPTlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdob21lfE9wZW4gQSBGZWRFeCBBY2NvdW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFifGVudmVsb3BlfHBhY2thZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFifGZyZWlnaHR8c2hpcHBpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YWJ8ZXhwZWRpdGVkfGV4dHJhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFifGFpcnxmcmVpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLXRyYWNrQnlUQ04tVENOLUlucHV0RmllbGQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ1BhZ2UtcHJvbXB0VG9Mb2dpbmZvckJPTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1yYWRpb0J0bi1CaWxsT2ZMYWRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ1BhZ2UtcmFkaW9CdG4tUHJvb2ZPZkRlbGl2ZXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWxhbmRpbmdQYWdlLXJhZGlvQnRuLUZheExldHRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1yYWRpb0J0bi1WaWV3UHJpbnRMZXR0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstdHJhY2tCeVRDTi1UcmFja0J0bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS1tdWxpdGlwbGVUcmFja2luZ051bWJlckxpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ1BhZ2Utc2luZ2xlVHJhY2tpbmdOdW1iZXJMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJrLWxhbmRpbmdQYWdlLXRyYWNrLWhlbHBMaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGRyfExvZ2luJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBfZmR4VXRpbDogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fZmR4ID0ge30sIHdpbmRvdywgZSA9IF9mZHggfHwge30sIGYgPSBlIHx8IHt9LCBmLmlzT2JqZWN0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAhPT0gdW5kZWZpbmVkICYmIG51bGwgIT09IGUgJiYgZS5jb25zdHJ1Y3RvciA9PSBPYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmLmlzTGl2ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAhMCwgciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICcnICE9PSBlICYmIHIgPCBlICYmIChuID0gITEpLCBudWxsICE9PSB0ICYmICcnICE9PSB0ICYmIHQgPCByICYmIChuID0gITEpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5wYWdlRmxhZyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZSAmJiAnJyAhPT0gZSAmJiB2b2lkIDAgIT09IHQgJiYgJycgIT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA8IHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHIudG9Mb3dlckNhc2UoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZmR4LmlzT2JqZWN0KGVbcl0pID8gJ2NvdW50cnknID09IG4gPyBlW3JdIDogKGVuYWJsZWRUaW1lID0gX2ZkeC5pc0xpdmUoZVtyXS5zdGFydFRpbWUsIGVbcl0uZW5kVGltZSksICEhZW5hYmxlZFRpbWUgJiYgKHNyY1ZhbHVlID0gZVtyXS5waXhlbCwgJ3VuZGVmaW5lZCcgPT0gc3JjVmFsdWUgfHwgc3JjVmFsdWUpKSA6IGVbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA8IHQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGVbcl0udG9Mb3dlckNhc2UoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmLnBjZlV0aWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcignUENGOkFsbG93ZWRQcm9kRG9tYWlucycpLCB0ID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHQubWF0Y2goL3d3dyhiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpID8gdCA6IDAgPCBlLmxlbmd0aCAmJiAtMSA8IGUuaW5kZXhPZih0KSA/ICd3d3cuZmVkZXguY29tJyA6ICd3d3d0ZXN0LmZlZGV4LmNvbSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmLmdldFRlc3RMZXZlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICcnLCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3c2JveDogJ0wxUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3d3diYXNlOiAnTDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3ZGV2OiAnTDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3ZHJ0OiAnTDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3c3RyZXNzOiAnTDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3Yml0OiAnTDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3d3dGVzdDogJ0w2JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gd3d3SG9zdC5zcGxpdCgnLicpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgdFtuXSAmJiAnJyAhPT0gdFtuXSAmJiAoZSA9IHRbbl0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5nZXRHdGFnTGFiZWwgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbcl0gPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3Zlcml6b246cGFnZUxpc3QnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICdodHRwczovL3NwLmFuYWx5dGljcy55YWhvby5jb20vc3BwLnBsP2E9MTAwMDAmLnlwPTEwMDkyOTA3JmVjPSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy9yZWd1bGF0b3J5LWZvcm0vdGhhbmsteW91Lmh0bWwnOiBlICsgJ0ZlZEV4X1JlZ3VsYXRvcnlfRm9ybV9UaGFua19Zb3VfRW5nbGlzaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nL3JlZ3VsYXRvcnktZm9ybS90aGFuay15b3UuaHRtbCc6IGUgKyAnRmVkRXhfUmVndWxhdG9yeV9Gb3JtX1RoYW5rX1lvdV9GcmVuY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sJzogZSArICdGZWRFeF9JbnRlcm5hdGlvbmFsX1NoaXBwaW5nX0VOJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6IGUgKyAnRmVkRXhfSW50ZXJuYXRpb25hbF9TaGlwcGluZ19GUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nL29mZmVyL3RoYW5rLXlvdS5odG1sJzogZSArICdGZWRFeF9BZGRpdGlvbmFsX1RoYW5rX1lvdV9QYWdlX0VuZ2xpc2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy9vZmZlci90aGFuay15b3UuaHRtbCc6IGUgKyAnRmVkRXhfQWRkaXRpb25hbF9UaGFua19Zb3VfUGFnZV9GcmVuY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9leHByZXNzLWZyZWlnaHQuaHRtbCc6IGUgKyAnRmVkRXhfQWRkaXRpb25hbF9UaGFua19Zb3VfUGFnZV9GcmVuY2gxMjMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhYW06UmVnaW9uQ29udGFpbmVyTlNJRCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnJyAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2FhbTpjb250YWluZXJOU0lETWFwcGluZycpID8gX3NhdGVsbGl0ZS5nZXRWYXIoJ2FhbTpjb250YWluZXJOU0lETWFwcGluZycpIDogJycsIHQgPSAwLCBuID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6cmVnaW9uJyksIHIgPSBGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ubG9jYWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gL1thLXpdezJ9X1thLXpdezJ9L2cuZXhlYyhyKSAmJiA1ID09IHIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gZSAmJiAnJyAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xIDwgbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnVGFnOlRhcmdldFZpZGVvTWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIyNzU0NDE4NTAwMTogJ0FXLTg2MzIzODc5My9nZW0wQ1BIbmctNEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIyNzU0NTY1ODAwMTogJ0FXLTg2MzIzODc5My9wVkEtQ0tPUTR1OEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIzNDM5OTU1OTAwMTogJ0FXLTg2MzIzODc5My83VnVCQ05yTWxPNEJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjIzMzgyNzE0MTAwMTogJ0FXLTg2MzIzODc5My9VdVBuQ1BDNDFmY0JFSW4xejVzRCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dUYWc6REZBRXZlbnRNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDA1L2ZlZGV4MDJpK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jb3Vwb24tb2ZmZXJzLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyMStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZHJvcGJveC5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMjArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2ZyZWlnaHQtc2VydmljZXMvbHRsL3ZvbHVtZS1zZXJ2aWNlcy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMXUrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2N1c3RvbWVyLXN1cHBvcnQuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDB5K3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9ob21lLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAweCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDB3K3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMHYrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3RyYWNraW5nLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwdStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvb2ZmaWNlLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwcytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvaW50ZXJuYXRpb25hbC1ncm91bmQtY2FuYWRhLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwbCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvb25saW5lLXByaW50aW5nLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwaCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwYitzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZ3JvdW5kLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwYStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvcGFja2luZy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMC0rc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3Bvc3RlcnMvY2FudmFzLXByaW50cy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9wcm9tb3Rpb25zMS5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGYrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3Byb21vdGlvbnMyLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwZStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvcHJvbW90aW9uczMuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDBnK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9wcm9tb3Rpb25zNC5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMGQrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3Byb21vdGlvbnM1Lmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAwYytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZmxhc2gtc2FsZS1vZmZlcnMuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJlK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9ob2xkLWF0LWxvY2F0aW9uLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyaCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvc21hbGwtbWVkaXVtLWJ1c2luZXNzLW9mZmVycy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMmcrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL29mZmljZS93YWxtYXJ0Lmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAyaStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlL3dhbGdyZWVucy1wYWNrYWdlLXBpY2t1cC5odG1sJzogJ0RDLTQxOTEyNjMvd2FsZ3IwL2ZlZGV4MCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAybitzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvcGFja2luZy1zdXBwbGllcy9jdXN0b20tYnJhbmRlZC1ib3hlcy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMmsrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIvaG93LXRvLXByZXZlbnQtc3RvbGVuLW1pc3NpbmctcGFja2FnZXMuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDJsK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9mcmVpZ2h0LXNlcnZpY2VzL2x0bC9xdW90ZS5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMnIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2N1c3RvbS1wcm9mZXNzaW9uYWwtcHJpbnRpbmcuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2Z5MTlfMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZnJlaWdodC1zZXJ2aWNlcy9pbm5vdmF0aW9uLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAydStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvaG9saWRheS9jb25zdW1lci1zaGlwcGluZy1kZWxpdmVyeS1ndWlkZS5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwMnkrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2Rpc2NvdW50LXByb2dyYW1zL2VtMTU2OTIwMTMuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2Z5MjBfMDAxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9lbTE1NjkyMjEzLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9meTIwXzAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvY3JlYXRlLWFjY291bnQuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2Z5MjBfMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGlzY291bnQtcHJvZ3JhbXMvZW0xNTY5MjExMy5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZnkyMF8wMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvYnVzaW5lc3Mtc29sdXRpb25zL2tub3dsZWRnZS1jZW50ZXIuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDMxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9hZzEzMzk4NjAyLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAzOCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvZGVzaWduLXNlcnZpY2VzLmh0bWwnOiAnREMtNDE5MTI2My9mZWRleDAwaC9mZWRleDAzaCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb2ZmaWNlLWRlcG90LW9mZmljZW1heC5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM2Erc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL25hdGlvbmFsLWJpZC1jZW50ZXIuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDMtK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvdGFyZ2V0LXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM2Irc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NtYWxsLWJ1c2luZXNzL21ha2luZy1pdC13b3JrLXBvZGNhc3QuaHRtbCc6ICdEQy00MTkxMjYzL2ZlZGV4MDBoL2ZlZGV4MDNqK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwnOiAnREMtNDE5MTI2My9mZG1lbjAvZmRtbGEwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kZWxpdmVyeS1tYW5hZ2VyL21hbmFnZS15b3VyLWRlbGl2ZXJpZXMuaHRtbCc6ICdEQy00MTkxMjYzL2ZkbWVuMC9mZG1sYTAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jb3Vwb24tb2ZmZXJzL2dyb3VuZC5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM20rc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2NvbnN1bWVyLW9mZmVycy5odG1sJzogJ0RDLTQxOTEyNjMvY29uc3UwL2ZlZGV4MCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvb25zaXRlL2RvbGxhci1nZW5lcmFsLXBpY2stdXAtZHJvcC1vZmYtcGFja2FnZS5odG1sJzogJ0RDLTQxOTEyNjMvZmVkZXgwMGgvZmVkZXgwM2wrc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6ICdEQy05NzQ3MTQvZmVkZXgxNy9mZWRleDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6ICdEQy05NzQ3MTQvZmVkZXgxNy9mZWRleDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nL3JlZ3VsYXRvcnktZm9ybS90aGFuay15b3UuaHRtbCc6ICdEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDA4K3VuaXF1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy9yZWd1bGF0b3J5LWZvcm0vdGhhbmsteW91Lmh0bWwnOiAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwOSt1bmlxdWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaDogeyAnL2VuLWJoL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdEQy0xOTgyNTc0L2VueDJ4MC9mZWRleDAwK3N0YW5kYXJkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3OiB7ICcvZW4ta3cvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTE5ODI1NzQvZW54MngwL2ZlZGV4MDAwK3N0YW5kYXJkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvYXItYWUvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTE5ODI1NzQvYXI0NHgwL2ZlZGV4MCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYWUvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTE5ODI1NzQvZW54MngwL2ZlZGV4MCtzdGFuZGFyZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcva28ta3Ivb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwnOiAnREMtOTkyOTk2OS9rb3JlYTAvZmVkZXgwMDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2tvLWtyL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCc6ICdEQy05OTI5OTY5L2tvcmVhMC9mZWRleDAwMStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcva28ta3Ivc21hbGwtYnVzaW5lc3MuaHRtbCc6ICdEQy05OTI5OTY5L2tvcmVhMC9mZWRleDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2tvLWtyL29wZW4tYWNjb3VudC5odG1sJzogJ0RDLTk5Mjk5Njkva29yZWEwL2ZlZGV4MDArc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLXR3L2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdEQy01NjUzMDIwL2Z5MjBhMC9meTIwXzAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdHcvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTU2NTMwMjAvZnkyMGEwL2Z5MjBfMDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC10dy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwMDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLXR3L29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sJzogJ0RDLTk5Mjk5NjkvdGFpd2EwL2ZlZGV4MDAxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC10dy9zaGlwcGluZy9mZWRleC1yZXdhcmRzLmh0bWwnOiAnREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwMDIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLXR3L3NtYWxsLWJ1c2luZXNzLmh0bWwnOiAnREMtOTkyOTk2OS90YWl3YTAvZmVkZXgwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC10dy9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy05OTI5OTY5L3RhaXdhMC9mZWRleDAwK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2c6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1zZy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTkyOTk2OS9zaW5nYTAvZmVkZXgwMDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXNnL29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sJzogJ0RDLTk5Mjk5Njkvc2luZ2EwL2ZlZGV4MDAxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1zZy9zaGlwcGluZy9mZWRleC1yZXdhcmRzLmh0bWwnOiAnREMtOTkyOTk2OS9zaW5nYTAvZmVkZXgwMDIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXNnL3NtYWxsLWJ1c2luZXNzLmh0bWwnOiAnREMtOTkyOTk2OS9zaW5nYTAvZmVkZXgwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1zZy9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy05OTI5OTY5L3NpbmdhMC9mZWRleDAwK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9qYS1qcC9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTkyOTk2OS9qYXBhbjAvZmVkZXgwMDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2phLWpwL29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sJzogJ0RDLTk5Mjk5NjkvamFwYW4wL2ZlZGV4MDAxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9qYS1qcC9zaGlwcGluZy9mZWRleC1yZXdhcmRzLmh0bWwnOiAnREMtOTkyOTk2OS9qYXBhbjAvZmVkZXgwMDIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2phLWpwL3NtYWxsLWJ1c2luZXNzLmh0bWwnOiAnREMtOTkyOTk2OS9qYXBhbjAvZmVkZXgwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9qYS1qcC9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy05OTI5OTY5L2phcGFuMC9mZWRleDAwK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGs6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC1oay9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCc6ICdEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwNCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwnOiAnREMtOTkyOTk2OS9ob25nazAvZmVkZXgwMDUrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLWhrL3NoaXBwaW5nL2ZlZGV4LXJld2FyZHMuaHRtbCc6ICdEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwNitzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvc2hpcHBpbmcvZmVkZXgtcmV3YXJkcy5odG1sJzogJ0RDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDA3K3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC1oay9zbWFsbC1idXNpbmVzcy5odG1sJzogJ0RDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvc21hbGwtYnVzaW5lc3MuaHRtbCc6ICdEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC1oay9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvb3Blbi1hY2NvdW50Lmh0bWwnOiAnREMtOTkyOTk2OS9ob25nazAvZmVkZXgwMDErc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLWhrL29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCc6ICdEQy05OTI5OTY5L2hvbmdrMC9mZWRleDAwMitzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sJzogJ0RDLTk5Mjk5NjkvaG9uZ2swL2ZlZGV4MDAzK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1hdS9zaGlwcGluZy9mZWRleC1yZXdhcmRzLmh0bWwnOiAnREMtOTkyOTk2OS9hdXN0cjAvZmVkZXgwMDIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L3NtYWxsLWJ1c2luZXNzLmh0bWwnOiAnREMtOTkyOTk2OS9hdXN0cjAvZmVkZXgwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1hdS9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy05OTI5OTY5L2F1c3RyMC9mZWRleDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1hdS9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTkyOTk2OS9hdXN0cjAvZmVkZXgwMDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sJzogJ0RDLTk5Mjk5NjkvYXVzdHIwL2ZlZGV4MDAxK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lcy1jby9vcGVuLWFjY291bnQuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwbytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vY3VzdG9tZXItc3VwcG9ydC5odG1sJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDBqK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lcy1jby9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWw/Q01QPVBBQy1Qb3NzaWJpbGl0aWVzLTAtMC0xMDUyLTEwMDAwMC1MQUMtY28tZXMtVmFuaXR5VVJMI2Zvb2QtYmV2ZXJhZ2UnOiAnREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vc2hpcHBpbmcuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwMitzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vYWJvdXQvcG9zc2liaWxpdGllcy5odG1sP0NNUD1QQUMtUG9zc2liaWxpdGllcy0wLTAtMTA1Mi0xMDAwMDAtTEFDLWNvLWVzLVZhbml0eVVSTCN0ZWNobm9sb2d5JzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lcy1jby9hYm91dC9wb3NzaWJpbGl0aWVzLmh0bWw/Q01QPVBBQy1Qb3NzaWJpbGl0aWVzLTAtMC0xMDUyLTEwMDAwMC1MQUMtY28tZXMtVmFuaXR5VVJMJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vc2hpcHBpbmcvcmF0ZXMuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwNytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vaG9tZS5odG1sJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDBwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lcy1jby9vbmxpbmUvcmF0aW5nLmh0bWwnOiAnREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMDUrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VzLWNvL3RyYWNraW5nLmh0bWwnOiAnREMtMjUyNjI4OS9iYmNqbTAvYWxsX2YwMGIrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VzLWNvL2N1c3RvbXMtdG9vbHMuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwYytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY28vYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDArc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VzLWNsL2JpbGxpbmcuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwcytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZXMtY2wvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDArc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicjogeyAnL3B0LWJyL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCc6ICdEQy0yNTI2Mjg5L2JiY2ptMC9hbGxfZjAwK3N0YW5kYXJkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14OiB7ICcvZXMtbXgvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJzogJ0RDLTI1MjYyODkvYmJjam0wL2FsbF9mMDArc3RhbmRhcmQnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2V2ZW50OnZhQ2xpY2snOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnRkRYLkRBVEFMQVlFUi5WQS5zdGF0dXMnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAncXVhbHRyaWNzOnBhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9nZXQtc3RhcnRlZC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NvdXBvbi1vZmZlcnMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jb3Vwb24tb2ZmZXJzL2dyb3VuZC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL29mZmljZS93YWxtYXJ0Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9kcm9wYm94Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvaG9sZC1hdC1sb2NhdGlvbi5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL3BhY2tpbmctYm94ZXMvc2VydmljZXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9wYWNraW5nLXN1cHBsaWVzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvZ3JvdW5kLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvdHJhY2tpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9iaWxsaW5nLW9ubGluZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NyZWF0ZS1hY2NvdW50Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvY3JlYXRlLWFjY291bnQvYWNjb3VudC1tYW5hZ2VtZW50Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy8yLTMtZGF5Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZmVkZXgtc21hcnRwb3N0Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZ3JvdW5kLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvaG9tZS1kZWxpdmVyeS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL2ludGVybmF0aW9uYWwtZ3JvdW5kLWNhbmFkYS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL292ZXJuaWdodC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL3NhbWUtZGF5Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc2NoZWR1bGUtbWFuYWdlLXBpY2t1cHMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9zZXJ2aWNlcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2N1c3RvbWVyLXN1cHBvcnQuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jdXN0b21lci1zdXBwb3J0L2NsYWltcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NlcnZpY2UtZ3VpZGUuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zZXJ2aWNlLWd1aWRlL3BpY2t1cC1kZWxpdmVyeS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL21vYmlsZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2ZhcS9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvc2hpcHBpbmctc2VydmljZXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9vbnNpdGUvd2FsZ3JlZW5zLXBhY2thZ2UtcGlja3VwLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvcHJpbnRpbmcvb25saW5lLXByaW50aW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvc3RvcmUvYWxsLWxvY2F0aW9uLXR5cGVzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdHcvY2FtcGFpZ24vZ2V0c3RhcnRlZC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLXR3L2NhbXBhaWduL2dldHN0YXJ0ZWQuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1qcC9vbmxpbmUvc2hpcHBpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1qcC9vbmxpbmUvc2hpcHBpbmcuaHRtbCMvc2hpcG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvamEtanAvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvY3VzdG9tZXItc3VwcG9ydC9ob3ctdG8vZG9vci10YWcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9jdXN0b21lci1zdXBwb3J0L2hvdy10by9zY2hlZHVsZS1hLXBpY2t1cC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsL2V4cG9ydC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L29ubGluZS9zaGlwcGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW56L29ubGluZS9zaGlwcGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L2NhbXBhaWduL3NtYWxsLWJ1c2luZXNzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tbnovY2FtcGFpZ24vc21hbGwtYnVzaW5lc3MuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9vbmxpbmUvcmF0aW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtaGsvb3Blbi1hY2NvdW50Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvb3Blbi1hY2NvdW50Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtY24vY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtdHcvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvamEtanAvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcva28ta3IvY2FtcGFpZ24vZnJvbnRkb29yLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc21hbGwtYnVzaW5lc3MuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zbWFsbC1idXNpbmVzcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWF1L2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1ndS9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvYmlsbGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLWhrL2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1qcC9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvamEtanAvYmlsbGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWtyL2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9rby1rci9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tbW8vYmlsbGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW15L2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1uei9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tcGgvYmlsbGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXNnL2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi10dy9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtdHcvYmlsbGluZy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXRoL2JpbGxpbmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy90aC10aC9iaWxsaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGV2ZWxvcGVyLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvZGV2ZWxvcGVyL3dlYi1zZXJ2aWNlcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2RldmVsb3Blci93ZWItc2VydmljZXMvcHJvY2Vzcy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL2NvbnRhY3QtdXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9jb250YWN0LXVzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taW4vb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY24vb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvdGgtdGgvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdGgvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtaGsvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtY24vb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYWYvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYWwvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tZHovb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYW8vb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYW0vb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tbXkvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tc2cvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tcGgvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYWUvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi10aC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS96aC1jbi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS96aC1oay8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9qYS1qcC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1nYi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1oay8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1wbC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1pbi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1ubC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9ubC1ubC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1jbi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1qcC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9wbC1wbC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS90aC10aC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1hdS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1pZC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9pZC1pZC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9rby1rci8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1rci8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1teS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1uei8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc2hpcG1lbnQtaGlzdG9yeS9lbi1zZy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvaW50ZXJuYXRpb25hbC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL29mZmljZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uZS1yYXRlLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tdXMvc2hpcHBpbmcvZnJlaWdodC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2hvbWUuaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dUYWc6YnRuQVdQYWdlTGlzdE1hcHBpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9zaGlwcGluZy9yZXR1cm5zL2J1c2luZXNzLmh0bWwnOiAnQVctODYzMjM4NzkzL2FmNVVDTlNUM2JrQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL2Rlc2lnbi1zZXJ2aWNlcy5odG1sJzogJ0FXLTg2MzIzODc5My9FNjhMQ0x5RnZOQUJFSW4xejVzRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9zbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzLmh0bWwnOiAnQVctODYzMjM4NzkzLzN6MURDTDNsODlBQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2NvdXBvbi1vZmZlcnMvZ3JvdW5kLmh0bWwnOiAnQVctODYzMjM4NzkzL29OamlDUDJMaGVJQkVJbjF6NXNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UuaHRtbCc6ICdBVy04NjMyMzg3OTMvNkdlN0NKLUE3LUVCRUluMXo1c0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taW4vc2hpcHBpbmcvaW5kdXN0cnktc29sdXRpb25zL2hlYWx0aGNhcmUvY29udGFjdC11cy5odG1sJzogJ0FXLTY3MzY4MTgyOS8yWVQzQ01fQjVzNEJFS1dqbnNFQycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3VzZXI6ZW1haWxJRCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2V0X3JpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdGFyZ2V0ZW5hYmxlZFVybExpc3Q6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsnL29ubGluZS9yYXRpbmcuaHRtbCddOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhYW06cmVnaW9ucyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndXMsY2FuLGFwYWMnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjbGljazpibG9ja0ZsYWcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmlzQmxvY2tlZCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBfc2F0ZWxsaXRlLmdldFZhcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IG4ubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IG4ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobltyXS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gZS50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpc0Jsb2NrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3NlYXJjaDpzcERhdGEnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnRkRYLkRBVEFMQVlFUi5zZWFyY2gucmVzdWx0JyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1BDRjpBbGxvd2VkUHJvZERvbWFpbnMnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFpbi5mZWRleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcm5hdGlvbmFsc2hpcHBpbmdhc3Npc3QudmFuLmZlZGV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmxldHMuZG16LmFwYWMuZmVkZXguY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndmE6Y2Fhc01vYkVuYWJsZWRVcmwnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWycvZmVkZXh0cmFjay8nXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndmVyaXpvbjp0aW1lRnJhbWUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJzE1NzgyNjg3OTkwMDAnLCB0ID0gJycsIG4gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKSwgX2ZkeC5pc0xpdmUoZSwgdCkgJiYgKG4gPSAhMCksIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3RyYWNrOmJ0bk1hcHBpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ1BhZ2UxVHJhY2tpbmdOdW1iZXJzUHJlc2VudCc6ICdUcmFja2luZyBOdW1iZXJ8VFJBQ0snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstdHJhY2tCeVRDTi1UcmFja0J0bic6ICdUcmFjayBieSBUQ058VFJBQ0snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmstbGFuZGluZ3BhZ2Utdmlld1BvZFN1Ym1pdEJ1dHRvbic6ICdPYnRhaW4gUE9EfFZpZXcgUE9EfFNVQk1JVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay10cmFja0J5UmVmZXJlbmNlLVRyYWNrQnRuJzogJ1RyYWNrIEJ5IFJlZmVyZW5jZXxUUkFDSycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ryay1sYW5kaW5nUGFnZS10cmFjay1oZWxwTGluayc6ICdUcmFja3xORUVEIEhFTFAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdUYXJnZXQ6YXRfcHJvcGVydHknOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICcnLCB0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6cmVnaW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT0gdCAmJiAnJyAhPT0gdCAmJiAoJ3VzJyA9PSB0ID8gZSA9ICc0YmEwNjVjMC02YjkyLTEzYTUtY2NjOC0yYjhjZmIyMWFiZGEnIDogJ2NhbicgPT0gdCA/IGUgPSAnYzI0MjEwZmYtOGM2NC05MTYwLTNhN2ItZmRjNDk4NGE3NDYwJyA6ICdhcGFjJyA9PSB0ID8gZSA9ICdlYjY0MTZkNy0wYTY0LTkyZDktMzdkMC1jNjJkNWI2ZTE2ZWQnIDogJ2xhYycgPT0gdCA/IGUgPSAnYjE3ZTMzMjItYWY1MC1iZjdmLWNiOGItOTBjYTdkYWVjZjQ5JyA6ICdtZWlzYScgPT0gdCA/IGUgPSAnMWVhZWNhZjUtYTMyNC1jODJlLTdlMGUtMzNkNjI1MWNmZGI4JyA6ICdldScgPT0gdCAmJiAoZSA9ICcxOTI0MjNlZS1jMWM5LTY2ZGYtODA0ZC01ZmI3MzQ3NTM1YmMnKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3ZhOmVuYWJsZWRDb3VudHJ5TGlzdCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnanAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2d5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3phJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2d0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdreScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21mJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RjJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ214JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21xJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemEnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdnVGFnOmJ0bkRDUGFnZUxpc3RNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDAyK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RDLTk3NDcxNC9mZWRleDAvZmVkZXgwMDQrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwNitzdGFuZGFyZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2Evc2hpcHBpbmctc2VydmljZXMvaW50ZXJuYXRpb25hbC1zaGlwcGluZy5odG1sJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwMStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MDAzK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RDLTk3NDcxNC9mZWRleDAvZmVkZXgwMDUrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwNytzdGFuZGFyZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4taGsvY2FtcGFpZ24vcmV0YWlsZnJlaWdodC5odG1sJzogJ0RDLTU2NjczMDAvZnkyMF8wL2ZlZGV4MDAzK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3poLWhrL2NhbXBhaWduL3JldGFpbGZyZWlnaHQuaHRtbCc6ICdEQy01NjY3MzAwL2Z5MjBfMC9mZWRleDAwMStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1teS9vcGVuLWFjY291bnQvcGVyc29uYWwuaHRtbCc6ICdEQy05ODExMzEzL2ludm1lZGlhL215X3BlMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1teS9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTgxMTMxMy9pbnZtZWRpYS9teV9jbzArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYXUvb3Blbi1hY2NvdW50L3BlcnNvbmFsLmh0bWwnOiAnREMtOTgxMTMxMy9pbnZtZWRpYS9hdV9wZTArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tYXUvb3Blbi1hY2NvdW50L2NvcnBvcmF0ZS5odG1sJzogJ0RDLTk4MTEzMTMvaW52bWVkaWEvYXVfY28wK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW56L29wZW4tYWNjb3VudC9wZXJzb25hbC5odG1sJzogJ0RDLTk4MTEzMTMvaW52bWVkaWEvbnpfcGUwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLW56L29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCc6ICdEQy05ODExMzEzL2ludm1lZGlhL256X2NvMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi10dy9vcGVuLWFjY291bnQvcGVyc29uYWwvZWd1aS1mb3JtLmh0bWwnOiAnREMtOTgxMTMxMy9pbnZtZWRpYS90d19wZTArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvemgtdHcvb3Blbi1hY2NvdW50L3BlcnNvbmFsL2VndWktZm9ybS5odG1sJzogJ0RDLTk4MTEzMTMvaW52bWVkaWEvdHdfcGUwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXR3L29wZW4tYWNjb3VudC9jb3Jwb3JhdGUuaHRtbCc6ICdEQy05ODExMzEzL2ludm1lZGlhL3R3X2NvMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy96aC10dy9vcGVuLWFjY291bnQvY29ycG9yYXRlLmh0bWwnOiAnREMtOTgxMTMxMy9pbnZtZWRpYS90d19jbzArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tcGgvb3Blbi1hY2NvdW50Lmh0bWwnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTgxMTMxMy9pbnZtZWRpYS9waF9jbzArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnREMtOTgxMTMxMy9pbnZtZWRpYS9waF9wZTArc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBnVGFnRGlzYWJsZUxvY2FsZTogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OmxvY2FsZScpLm1hdGNoKC9lbl9hdHxkZV9hdHxubF9iZXxmcl9iZXxlbl9iZXxiZ19iZ3xlbl9iZ3xlbl9jeXxjc19jenxlbl9jenxkYV9ka3xlbl9ka3xldF9lZXxlbl9lZXxmaV9maXxlbl9maXxmcl9mcnxlbl9mcnxlbl9kZXxkZV9kZXxlbl9ncnxlbF9ncnxlbl9odXxodV9odXxlbl9pc3xlbl9pZXxlbl9pdHxpdF9pdHxlbl9sdnxsdl9sdnxlbl9saXxlbl9sdHxsdF9sdHxmcl9sdXxlbl9sdXxlbl9tdHxlbl9ub3xub19ub3xlbl9wbHxwbF9wbHxlbl9wdHxwdF9wdHxlbl9yb3xyb19yb3xlbl9za3xza19za3xlbl9zaXxzbF9zaXxlbl9lc3xlc19lc3xlbl9zZXxzdl9zZXxubF9ubHxlbl9ubHxlbl9nYnxlbl90aHx0aF90aHxlbl9waHxlbl9teS9naSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dUYWc6Y3RhT3JhbmdlRkJQYWdlTGlzdE1hcHBpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9kaXNjb3VudC1wcm9ncmFtcy9hZzEzMzk4NjAyLmh0bWwnOiAnSW5pdGlhdGVDaGVja291dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9kZXNpZ24tc2VydmljZXMuaHRtbCc6ICdDdXN0b21pemVQcm9kdWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3ByaW50aW5nL3NtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnMuaHRtbCc6ICdBZGRUb0NhcnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnBhZ2VQYXRoJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ0ZEWC5EQVRBTEFZRVIucGFnZS5wYWdlSW5mby5wYWdlUGF0aCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG1jb3JnSUQ6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFRhcmdldFJlZ2lvbnM6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1cywgY2FuLCBhcGFjLCBsYWMsIG1laXNhLCBldSc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3NlYXJjaDp0ZXJtJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncScsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2dUYWc6VmlkZW9QbGF5SWRMaXN0JzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTY0ODAwODU0NjE2ODQ5OTMzMSc6ICdEQy0yMjkwNzk0L2NhbXBhMC9mZWRleDAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjQ4MDA4NTQ3MTI4MDM4NDM2JzogJ0RDLTIyOTA3OTQvY2FtcGEwL2ZlZGV4MDAxK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE2NDgyODIyMjk1Mzg2NjIxNDcnOiAnREMtMjI5MDc5NC9jYW1wYTAvZmVkZXgwMDIrc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTY0ODAwODU0NTYwODU5MTcxOCc6ICdEQy04MzU4MDA2L2ludm1lZGlhL2ZlZGV4MDByK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE2NDgwMDg1MDUyOTI5OTEyNjYnOiAnREMtODM1ODAwNi9pbnZtZWRpYS9mZWRleDAwcytzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjUwMTg1NzA4NDA2NDQ1NTg1JzogJ0RDLTgzNTgwMDYvaW52bWVkaWEvZmVkZXgwMHQrc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTY0ODAwODQ3MDkwMzc2MDY0MCc6ICdEQy01NjUzMDIwL2Z5MjBhMC9meTIwXzAwMStzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjQ4MDA4NDk0NDMyODkxMjUwJzogJ0RDLTU2NTMwMjAvZnkyMGEwL2Z5MjBfMDAyK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE2NTAxODU3MDg0MDY0NDU1ODUnOiAnREMtNTY1MzAyMC9meTIwYTAvZnkyMF8wMDMrc3RhbmRhcmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpWaWRlb1BsYXlCdG5JZExpc3QnOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjUwMTkwMDU5NDM0NzgwNjA0JzogJ0RDLTIyOTA3OTQvY2FtcGEwL2ZlZGV4MDArc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjUwNjU0Mjk2NDIzNjA0OTc1JzogJ0RDLTgzNTgwMDYvaW52bWVkaWEvZmVkZXgwMHUrc3RhbmRhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNjUwNjU1MDk5NzkyMjY2NzY5JzogJ0RDLTU2NTMwMjAvZnkyMGEwL2Z5MjBfMDA0K3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAncXVhbHRyaWNzOnBhZ2VOYW1lJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmNyL2NyZWF0ZS1uZXctcmVwb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmNyL3ZpZXctcmVwb3J0LXN0YXR1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zjci92aWV3LXJlY3VycmluZy1yZXBvcnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICd0YWdJRDpjb250ZW50U3F1YXJlJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpLCAnd3d3LmZlZGV4LmNvbScgPT09IF9mZHgucGNmVXRpbCgpID8gJzljMDcyZWJkLTBkOWEtNGIzNy05ZTU0LWJhMGMzYmIwNTg4ZCcgOiAnMjNhOWMyZjgtYWViNC00NTRjLWJlMzctODg2MTI4NWU5ZDBjJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY29udGVudDpsYW5ndWFnZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIGZvcmNlTG93ZXJDYXNlOiAhMCwKICAgICAgICAgICAgICAgICAgICBjbGVhblRleHQ6ICEwLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdGRFguREFUQUxBWUVSLnBhZ2UucGFnZUluZm8ubGFuZ3VhZ2UnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndXNlcjp1c2VyLWFnZW50JzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ25hdmlnYXRvci51c2VyQWdlbnQnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpidG5PcmFuZ2VEQ1BhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduVXBDb250aW51ZUJ1dHRvbjogJ0RDLTQxOTEyNjMvZmRtZW4wL2ZkbS1pMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0UGluQnV0dG9uOiAnREMtNDE5MTI2My9mZG1lbjAvZmRtLWMwK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB2ZXJpem9uQnRuQ2xpY2tNYXBwaW5nOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfEVOLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDU2NzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9FTicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfEZSLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDU2ODMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9GUicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfEZSLUZyZWlnaHQgUXVvdGUnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTQ1NjgzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmVkRXhfSGVhdnl3ZWlnaHRfRnJlaWdodF9RdW90ZV9CdXR0b25fRlInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRm9ybXxGcmVpZ2h0IFF1b3RlIHdpdGggQWNjb3VudCc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDU2NzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9IZWF2eXdlaWdodF9GcmVpZ2h0X1F1b3RlX0J1dHRvbl9FTicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfEJleW9uZCB0aGUgQnV5IEJ1dHRvbi1GUic6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDc2MzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9lQ29tbWVyY2VfR0VUIE5PVyBCdXR0b25fRlInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRm9ybXxCZXlvbmQgdGhlIEJ1eSBCdXR0b24nOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTQ3NjI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmVkRXhfZUNvbW1lcmNlX0dFVCBOT1cgQnV0dG9uX0VOJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmt8U3RhcnQgeW91ciBxdW90ZSc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDk2MjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9IZWF2eXdlaWdodF9CdXR0b25fTm9BY2NfRU4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua3xDb21tZW5jZXogdm90cmUgZXN0aW1hdGlvbic6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNDk2MzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGZWRFeF9IZWF2eXdlaWdodF9CdXR0b25fTm9BY2NfRlInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAndHJhZGVkZXNrOmJ0bkNsaWNrUGFnZUxpc3RNYXBwaW5nJzogewogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmt8c2lnbiB1cCBmb3IgZnJlZSc6ICcvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOmxhbnRpNmQmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rfGZpbmQgYSBkb2xsYXIgZ2VuZXJhbCc6ICcvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOnllOW4xOG4mZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZXJvfGZpbmQgYSB3YWxncmVlbnMgbmVhciB5b3UnOiAnLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svcHhsLz9hZHY9c3VlbnR2YmEmY3Q9MDp6MGE2b242JmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVyb3xzZWUgY3VycmVudCBvZmZlcnMnOiAnLy9pbnNpZ2h0LmFkc3J2ci5vcmcvdHJhY2svcHhsLz9hZHY9c3VlbnR2YmEmY3Q9MDo4ejRmYmg0JmZtdD0zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua3xzaWduIHVwIG5vdyc6ICcvL2luc2lnaHQuYWRzcnZyLm9yZy90cmFjay9weGwvP2Fkdj1zdWVudHZiYSZjdD0wOmtmMDZ2NjEmZm10PTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rfG5leHQgdGltZSB1c2UgZmVkZXggZGVsaXZlcnkgbWFuYWdlcnxzaWduIHVwIGZvciBmcmVlJzogJy8vaW5zaWdodC5hZHNydnIub3JnL3RyYWNrL3B4bC8/YWR2PXN1ZW50dmJhJmN0PTA6OXB5bmk2ciZmbXQ9MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3ZhOm1vYkVuYWJsZWRVcmwnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJy90cmFja2luZy9hZHZhbmNlZC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cycgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZW4tY2EnICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ZyLWNhJyArIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi1jYS9kZWxpdmVyeS1tYW5hZ2VyL3BlcnNvbmFsLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvZnItY2EvZGVsaXZlcnktbWFuYWdlci9wZXJzb25hbC5odG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnYWFtOklkU3luY0Rpc2FibGUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2ZhbHNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnZ1RhZzpjdGFPcmFuZ2VEQ1BhZ2VMaXN0TWFwcGluZyc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLWNhL3NoaXBwaW5nLXNlcnZpY2VzL2ludGVybmF0aW9uYWwtc2hpcHBpbmcuaHRtbCc6ICdEQy05NzQ3MTQvZmVkZXgwL2ZlZGV4MCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9mci1jYS9zaGlwcGluZy1zZXJ2aWNlcy9pbnRlcm5hdGlvbmFsLXNoaXBwaW5nLmh0bWwnOiAnREMtOTc0NzE0L2ZlZGV4MC9mZWRleDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL2RlbGl2ZXJ5LW1hbmFnZXIuaHRtbCc6ICdEQy00MTkxMjYzL2ZkbWVuMC9mZG1sYTAwMCtzdGFuZGFyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9lbi11cy9wcmludGluZy9jb25zdW1lci1vZmZlcnMuaHRtbCc6ICdEQy00MTkxMjYzL2NvbnN1MC9mZWRleDAwK3N0YW5kYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2VuLXVzL3NoaXBwaW5nL29uc2l0ZS93YWxncmVlbnMtcGFja2FnZS1waWNrdXAuaHRtbCc6ICdEQy00MTkxMjYzL3dhbGdyMC9mZWRleDAwK3N0YW5kYXJkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgJ2Fkb2JlLW1jaWQnOiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdFeHBlcmllbmNlIENsb3VkIElEIFNlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLW1jaWQvc3JjL2xpYi9zaGFyZWRNb2R1bGVzL21jaWRJbnN0YW5jZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpLCBpID0gbignLi4vY29kZUxpYnJhcnkvVmlzaXRvckFQSScpLCBtID0gbignLi4vLi4vdmlldy91dGlscy90aW1lVW5pdHMnKSwgaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IC9eKHRydWV8ZmFsc2UpJC9pLnRlc3QodC52YWx1ZSkgPyBKU09OLnBhcnNlKHQudmFsdWUpIDogdC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0Lm5hbWVdID0gbiwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGcuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgdC5vcmdJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPcmcgSUQgaXMgbm90IGEgc3RyaW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBoKHQudmFyaWFibGVzIHx8IFtdKSwgciA9IHQuZG9lc09wdEluQXBwbHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmICgnYm9vbGVhbicgPT0gdHlwZW9mIHIgPyBuLmRvZXNPcHRJbkFwcGx5ID0gciA6IHQub3B0SW5DYWxsYmFjayAmJiAobi5kb2VzT3B0SW5BcHBseSA9IHQub3B0SW5DYWxsYmFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0LmlzT3B0SW5TdG9yYWdlRW5hYmxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKG4uaXNPcHRJblN0b3JhZ2VFbmFibGVkID0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHQub3B0SW5Db29raWVEb21haW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChuLm9wdEluQ29va2llRG9tYWluID0gYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHQub3B0SW5TdG9yYWdlRXhwaXJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHQudGltZVVuaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgJiYgbVtzXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG8gKiBtW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm9wdEluU3RvcmFnZUV4cGlyeSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgPT09IGkgJiYgKG4ub3B0SW5TdG9yYWdlRXhwaXJ5ID0gMzM2OTYwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB0LnByZXZpb3VzUGVybWlzc2lvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIChuLnByZXZpb3VzUGVybWlzc2lvbnMgPSB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gdC5wcmVPcHRJbkFwcHJvdmFsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHJlT3B0SW5BcHByb3ZhbHMgPSBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0LnByZU9wdEluQXBwcm92YWxJbnB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIChuLnByZU9wdEluQXBwcm92YWxzID0gZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHQuaXNJYWJDb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiAobi5pc0lhYkNvbnRleHQgPSBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZS5nZXRJbnN0YW5jZSh0Lm9yZ0lkLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmxvZ2dlci5pbmZvKCdDcmVhdGVkIGluc3RhbmNlIHVzaW5nIG9yZ0lkOiAiJyArIHQub3JnSWQgKyAnIicpLCBnLmxvZ2dlci5pbmZvKCdTZXQgdmFyaWFibGVzOiAnICsgSlNPTi5zdHJpbmdpZnkobikpLCBwLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5sb2dnZXIuaW5mbygnT2J0YWluZWQgTWFya2V0aW5nIENsb3VkIFZpc2l0b3IgSWQ6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKSwgcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGcuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKS5wYXRoRXhjbHVzaW9ucyB8fCBbXSkuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKS50ZXN0KHQpIDogZS52YWx1ZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLmdldFZpc2l0b3JJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyhyLmxvY2F0aW9uLnBhdGhuYW1lKSA/IGcubG9nZ2VyLndhcm4oJ01DSUQgbGlicmFyeSBub3QgbG9hZGVkLiBPbmUgb2YgdGhlIHBhdGggZXhjbHVzaW9ucyBtYXRjaGVzIHRoZSBjdXJyZW50IHBhdGguJykgOiBzID0gYShpKSwgZS5leHBvcnRzID0gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWNpZC1pbnN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1tY2lkL3NyYy9saWIvY29kZUxpYnJhcnkvVmlzaXRvckFQSS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChxID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSBuLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrc1tlXSA9IHRoaXMuY2FsbGJhY2tzW2VdIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuY2FsbGJhY2tzW2VdLnB1c2godCkgLSAxLCByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2tzW2VdLnNwbGljZShuLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrc1tlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICh0ID0gdm9pZCAwID09PSB0ID8gW10gOiB0KSBpbnN0YW5jZW9mIEFycmF5ID8gdCA6IFt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHRoaXMuY2FsbGJhY2tzW2VdLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmNhbGxiYWNrc1tlXS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBuID8gbi5hcHBseShudWxsLCB0KSA6IG4gaW5zdGFuY2VvZiBBcnJheSAmJiBuWzFdLmFwcGx5KG5bMF0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVBbGw6IGZ1bmN0aW9uIChuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIHx8IG4gJiYgIVcuaXNPYmplY3RFbXB0eShuKSkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsYmFja3MpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwICE9PSBuW2VdID8gbltlXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRlKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihPYmplY3Qua2V5cyh0aGlzLmNhbGxiYWNrcykubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsID09IGUgPyB2b2lkIDAgOiBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gciA/IG4gOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IC9eXGQrJC8sIG4gPSAwLCByID0gZS5sZW5ndGg7IG4gPCByOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LnRlc3QoZVtuXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBlLmxlbmd0aCA8IHQubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB0Lmxlbmd0aCA8IGUubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcGFyc2VJbnQoZVtuXSwgMTApLCBpID0gcGFyc2VJbnQodFtuXSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPCBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKSwgciA9IHQudG9TdHJpbmcoKS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkobi5jb25jYXQocikpID8gKGEobiwgciksIG8obiwgcikpIDogTmFOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IE9iamVjdChlKSAmJiAwID09PSBPYmplY3Qua2V5cyhlKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSB8fCBlIGluc3RhbmNlb2YgQXJyYXkgJiYgZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZSA/IGFyZ3VtZW50c1swXSA6ICcnLCByID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nID0gZmUoJ2xvZycsIG4sIHIpLCB0aGlzLndhcm4gPSBmZSgnd2FybicsIG4sIHIpLCB0aGlzLmVycm9yID0gZmUoJ2Vycm9yJywgbiwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICgwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGUgPyBhcmd1bWVudHNbMF0gOiB7fSkuY29va2llTmFtZSwgYSA9ICgxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IHQgPyBhcmd1bWVudHNbMV0gOiB7fSkuY29va2llczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaSB8fCAhYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IERlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ6IERlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmU6IERlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnJlbW92ZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuZ2V0KGkpLCB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvLmdldCgpLCByID0gT2JqZWN0LmFzc2lnbihuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zZXQoaSwgSlNPTi5zdHJpbmdpZnkociksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogdC5vcHRJbkNvb2tpZURvbWFpbiB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpZmV0aW1lOiB0Lm9wdEluU3RvcmFnZUV4cGlyeSB8fCAzNDE5MDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSwgdGhpcy5tZXNzYWdlID0gZSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKSA6IHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoZSkuc3RhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHZlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxlbmd0aCA/IG4uZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGJlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKFQpLCBQKHJlLkNPTVBMRVRFKSwgeChDLnN0YXR1cywgQy5wZXJtaXNzaW9ucyksIHUgJiYgXy5zZXQoQy5wZXJtaXNzaW9ucywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJbkNvb2tpZURvbWFpbjogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0SW5TdG9yYWdlRXhwaXJ5OiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGsuZXhlY3V0ZShqZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5ZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW09wdEluXSBJbnZhbGlkIGNhdGVnb3J5KC1pZXMpLiBQbGVhc2UgdXNlIHRoZSBgT3B0SW4uQ2F0ZWdvcmllc2AgZW51bS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAocmUuQ0hBTkdFRCksIE9iamVjdC5hc3NpZ24oVCwgX2UodmUoZSksIG4pKSwgdCB8fCByKCksIEM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gYXJndW1lbnRzWzBdIDoge30sIG8gPSBhLmRvZXNPcHRJbkFwcGx5LCBzID0gYS5wcmV2aW91c1Blcm1pc3Npb25zLCBjID0gYS5wcmVPcHRJbkFwcHJvdmFscywgdSA9IGEuaXNPcHRJblN0b3JhZ2VFbmFibGVkLCBsID0gYS5vcHRJbkNvb2tpZURvbWFpbiwgZCA9IGEub3B0SW5TdG9yYWdlRXhwaXJ5LCBmID0gYS5pc0lhYkNvbnRleHQsIHAgPSAoMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ID8gYXJndW1lbnRzWzFdIDoge30pLmNvb2tpZXMsIGcgPSBBZShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlKGcsICdJbnZhbGlkIGBwcmV2aW91c1Blcm1pc3Npb25zYCEnKSwgU2UoYywgJ0ludmFsaWQgYHByZU9wdEluQXBwcm92YWxzYCEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtLCBoLCB2LCBiLCB5LCBfID0gaih7IGNvb2tpZU5hbWU6ICdhZG9iZXVqcy1vcHRpbicgfSwgeyBjb29raWVzOiBwIH0pLCBDID0gdGhpcywgeCA9IFUoQyksIGsgPSB1ZSgpLCBFID0ga2UoZyksIEkgPSBrZShjKSwgdyA9IHUgPyBfLmdldCgpIDoge30sIEQgPSB7fSwgQSA9ICh5ID0gdywgRWUoRSkgfHwgeSAmJiBFZSh5KSA/IHJlLkNPTVBMRVRFIDogcmUuUEVORElORyksIFMgPSAobSA9IEksIGggPSBFLCB2ID0gdywgYiA9IF9lKGNlLCAhbyksIG8gPyBPYmplY3QuYXNzaWduKHt9LCBiLCBtLCBoLCB2KSA6IGIpLCBUID0gQ2UoUyksIFAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5kZW55ID0gaSghMSksIEMuYXBwcm92ZSA9IGkoITApLCBDLmRlbnlBbGwgPSBDLmRlbnkuYmluZChDLCBjZSksIEMuYXBwcm92ZUFsbCA9IEMuYXBwcm92ZS5iaW5kKEMsIGNlKSwgQy5pc0FwcHJvdmVkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCBDLnBlcm1pc3Npb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEMuaXNQcmVBcHByb3ZlZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgSSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDLmZldGNoUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ICYmIGFyZ3VtZW50c1sxXSwgciA9IG4gPyBDLm9uKHJlLkNPTVBMRVRFLCBlKSA6IERlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbyB8fCBvICYmIEMuaXNDb21wbGV0ZSB8fCBjID8gZShDLnBlcm1pc3Npb25zKSA6IG4gfHwgay5hZGQoamUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoQy5wZXJtaXNzaW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDLmNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMuc3RhdHVzID09PSByZS5DSEFOR0VEICYmIHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEMucmVnaXN0ZXJQbHVnaW4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhZS5uYW1lIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGUub25SZWdpc3RlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKExlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEW2UubmFtZV0gfHwgKERbZS5uYW1lXSA9IGUpLm9uUmVnaXN0ZXIuY2FsbChlLCBDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEMuZXhlY3V0ZSA9IE9lKEQpLCBDLm1lbW9pemVDb250ZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShlKSAmJiBfLnNldChlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEluQ29va2llRG9tYWluOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJblN0b3JhZ2VFeHBpcnk6IGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEMuZ2V0TWVtb2l6ZWRDb250ZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IF8uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yaWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGllOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzT3B0SW5BcHBseTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVuZGluZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDLnN0YXR1cyA9PT0gcmUuUEVORElORzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDLnN0YXR1cyA9PT0gcmUuQ09NUExFVEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcGx1Z2luczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJYWJDb250ZXh0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG51bGwsIGUuY2FsbChlLCBuZXcgbCgnVGhlIGNhbGwgdG9vayBsb25nZXIgdGhhbiB5b3Ugd2FudGVkIScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAoY2xlYXJUaW1lb3V0KGkpLCBlLmFwcGx5KGUsIGFyZ3VtZW50cykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gc2V0VGltZW91dChuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fdGNmYXBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuX190Y2ZhcGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICE9PSB3aW5kb3cudG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbzsgIW87KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZnJhbWVzLl9fdGNmYXBpTG9jYXRvciAmJiAobyA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHdpbmRvdy50b3ApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5fX3RjZmFwaSA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE1hdGgucmFuZG9tKCkgKyAnJywgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX190Y2ZhcGlDYWxsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJZDogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbaV0gPSBuLCBvLnBvc3RNZXNzYWdlKGEsICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBKU09OLnBhcnNlKGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Ll9fdGNmYXBpUmV0dXJuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0Ll9fdGNmYXBpUmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIHNbbi5jYWxsSWRdICYmIChzW24uY2FsbElkXShuLnJldHVyblZhbHVlLCBuLnN1Y2Nlc3MpLCBkZWxldGUgc1tuLmNhbGxJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMSksIHdpbmRvdy5fX3RjZmFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUuZXJyb3IoJ19fdGNmYXBpIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUuZXJyb3IoJ19fdGNmYXBpIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IG4gPyBhcmd1bWVudHNbMl0gOiBbXSwgaSA9ICEwID09PSB0LnZlbmRvci5jb25zZW50c1tlXSwgYSA9IHIuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSB0LnB1cnBvc2UuY29uc2VudHNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAmJiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm5hbWUgPSAnaWFiUGx1Z2luJywgbi52ZXJzaW9uID0gJzAuMC4yJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvID0gdWUoKSwgcyA9IHsgdHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGE6IG51bGwgfSwgYyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2VdID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mZXRjaENvbnNlbnREYXRhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGYoZS5jYWxsYmFjaywgZS50aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHsgY2FsbGJhY2s6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmlzQXBwcm92ZWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jYWxsYmFjaywgciA9IGUuY2F0ZWdvcnksIHQgPSBlLnRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKG51bGwsIGcocy50cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YSwgYWVbcl0sIG9lW3JdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBmKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oZSwgZyh0LCBhZVtyXSwgb2Vbcl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLm9uUmVnaXN0ZXIgPSBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmtleXMoYWUpLCBlID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFlICYmIG4gJiYgKHQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZyhuLCBhZVtlXSwgb2VbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbdCA/ICdhcHByb3ZlJyA6ICdkZW55J10oZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIuY29tcGxldGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5mZXRjaENvbnNlbnREYXRhKHsgY2FsbGJhY2s6IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQobnVsbCwgcy50cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uYWRkKCdGRVRDSF9DT05TRU5UX0RBVEEnLCB0KSwgcihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IENlKGUpLCByID0gYS5nZXRNZW1vaXplZENvbnRlbnQoJ2lhYkNvbnNlbnRIYXNoJyksIGkgPSBnZShuLnRjU3RyaW5nKS50b1N0cmluZygzMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jb25zZW50U3RyaW5nID0gZS50Y1N0cmluZywgbi5oYXNDb25zZW50Q2hhbmdlZFNpbmNlTGFzdENtcFB1bGwgPSByICE9PSBpLCBjKCd0cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YScsIG4pLCBhLm1lbW9pemVDb250ZW50KHsgaWFiQ29uc2VudEhhc2g6IGkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmV4ZWN1dGUoJ0ZFVENIX0NPTlNFTlRfREFUQScsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBQZShhZSksIG4gPSBwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIG4gJiYgbignZ2V0VENEYXRhJywgMiwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBnbG9iYWxUaGlzID8gZ2xvYmFsVGhpcyA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiB3aW5kb3cgPyB3aW5kb3cgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZ2xvYmFsID8gZ2xvYmFsIDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHNlbGYgPyBzZWxmIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCBuLCByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7ICsrcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gbiA9IGFyZ3VtZW50c1tyXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHQpICYmIChlW3RdID0gblt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGgsIHYsIGIsIHksIEggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORFNIQUtFOiAnSEFORFNIQUtFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUU1RBVEU6ICdHRVRTVEFURScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVFNUQVRFOiAnUEFSRU5UU1RBVEUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURV9LRVlTX01BUDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogJ01DTUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBSUQ6ICdNQ0FJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogJ01DQUFNQicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdNQ0FBTUxIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPUFRPVVQ6ICdNQ09QVE9VVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTUVSSURTOiAnQ1VTVE9NRVJJRFMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1lOQ19BUElfTUFQOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DTUlEOiAnZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FJRDogJ2dldEFuYWx5dGljc1Zpc2l0b3JJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogJ2dldEF1ZGllbmNlTWFuYWdlckJsb2InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiAnZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPUFRPVVQ6ICdpc09wdGVkT3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMRklFTERTOiAnZ2V0VmlzaXRvclZhbHVlcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZTkNfQVBJX01BUDogeyBDVVNUT01FUklEUzogJ2dldEN1c3RvbWVySURzJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMTF9BUElTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DTUlEOiAnZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICdnZXRBdWRpZW5jZU1hbmFnZXJCbG9iJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogJ2dldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnaXNPcHRlZE91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUlEOiAnZ2V0QW5hbHl0aWNzVmlzaXRvcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VTVE9NRVJJRFM6ICdnZXRDdXN0b21lcklEcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMTEZJRUxEUzogJ2dldFZpc2l0b3JWYWx1ZXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMREdST1VQX1RPX0ZJRUxEOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DOiAnTUNNSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBOiAnTUNBSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQU06ICdNQ0FBTUInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNNSUQ6ICdNQ01JRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnTUNPUFRPVVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FJRDogJ01DQUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogJ01DQUFNTEgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICdNQ0FBTUInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX1NUQVRFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOS05PV046IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FURUQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFRF9PVVQ6IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVQ6IHsgR0xPQkFMOiAnZ2xvYmFsJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfID0gSC5TVEFURV9LRVlTX01BUCwgQyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYSgwLCBuKSwgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbbl0gPSBlLCBpLnNldFN0YXRlQW5kUHVibGlzaCh0KSwgcihlKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5maW5kRmllbGQoXy5NQ01JRCwgZSksIG4gPSBpLmNhbGwodGhpcywgXy5NQ01JRCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgPyB0IDogbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZ2V0VmlzaXRvclZhbHVlcyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoeyBNQ01JRDogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHggPSBILk1FU1NBR0VTLCBrID0gSC5BU1lOQ19BUElfTUFQLCBFID0gSC5TWU5DX0FQSV9NQVAsIEkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNhbGxiYWNrUmVnaXN0cnkuYWRkKGUsIHQpLCBuLm1lc3NhZ2VQYXJlbnQoeC5HRVRTVEFURSksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1trW3JdXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmZpbmRGaWVsZChyLCBlKSwgbiA9IGEuY2FsbCh0aGlzLCByLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQgPyB0IDogbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tFW2VdXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaWVsZChlLCBpKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaykuZm9yRWFjaChlLCB0aGlzKSwgT2JqZWN0LmtleXMoRSkuZm9yRWFjaCh0LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcgPSBILkFTWU5DX0FQSV9NQVAsIEQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModykuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3dbdF1dID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tSZWdpc3RyeS5hZGQodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBXID0gKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5pc09iamVjdEVtcHR5ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IE9iamVjdChlKSAmJiAwID09PSBPYmplY3Qua2V5cyhlKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5pc1ZhbHVlRW1wdHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgPT09IGUgfHwgdC5pc09iamVjdEVtcHR5KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmF2aWdhdG9yLmFwcE5hbWUsIHQgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ01pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlcicgPT09IGUgfHwgMCA8PSB0LmluZGV4T2YoJ01TSUUgJykgfHwgMCA8PSB0LmluZGV4T2YoJ1RyaWRlbnQvJykgJiYgMCA8PSB0LmluZGV4T2YoJ1dpbmRvd3MgTlQgNicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRJZVZlcnNpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiBuKCkgPyA3IDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmVuY29kZUFuZEJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5pc09iamVjdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmICdvYmplY3QnID09PSBxKGUpICYmICExID09PSBBcnJheS5pc0FycmF5KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZGVmaW5lR2xvYmFsTmFtZXNwYWNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmFkb2JlID0gdC5pc09iamVjdCh3aW5kb3cuYWRvYmUpID8gd2luZG93LmFkb2JlIDoge30sIHdpbmRvdy5hZG9iZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBsdWNrID0gZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gblt0XSAmJiAoZVt0XSA9IG5bdF0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LnBhcnNlT3B0T3V0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB8fCAodCA9IG4sIGUuZF9vcHRvdXQgJiYgZS5kX29wdG91dCBpbnN0YW5jZW9mIEFycmF5ICYmICh0ID0gZS5kX29wdG91dC5qb2luKCcsJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwYXJzZUludChlLmRfb3R0bCwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4ocikgJiYgKHIgPSA3MjAwKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0T3V0OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9vdHRsOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5ub3JtYWxpemVCb29sZWFuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RydWUnID09PSBlID8gdCA9ICEwIDogJ2ZhbHNlJyA9PT0gZSAmJiAodCA9ICExKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh5ID0geyBleHBvcnRzOiB7fSB9LCB5LmV4cG9ydHMpLCB5LmV4cG9ydHMpLCBBID0gKFcuaXNPYmplY3RFbXB0eSwgVy5pc1ZhbHVlRW1wdHksIFcuZ2V0SWVWZXJzaW9uLCBXLmVuY29kZUFuZEJ1aWxkUmVxdWVzdCwgVy5pc09iamVjdCwgVy5kZWZpbmVHbG9iYWxOYW1lc3BhY2UsIFcucGx1Y2ssIFcucGFyc2VPcHRPdXQsIFcubm9ybWFsaXplQm9vbGVhbiwgdCksIFMgPSBILk1FU1NBR0VTLCBUID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6ICdwcmVmaXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6ICdvcmdJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjogJ3N0YXRlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgRyA9IGZ1bmN0aW9uIChhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGF0YS5zcGxpdCgnfCcpLmZvckVhY2goZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGUgJiYgKG5bVFt0XV0gPSAyICE9PSB0ID8gZSA6IEpTT04ucGFyc2UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuaXNJbnZhbGlkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgT2JqZWN0LmtleXModCkubGVuZ3RoIDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhICE9PSB0Lm9yZ0lELCByID0gIW8gfHwgZS5vcmlnaW4gIT09IG8sIGkgPSAtMSA9PT0gT2JqZWN0LmtleXMoUykuaW5kZXhPZih0LnByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuIHx8IHIgfHwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNlbmQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQgKyAnfCcgKyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIG4gPT09IE9iamVjdChuKSAmJiAociArPSAnfCcgKyBKU09OLnN0cmluZ2lmeShuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBvc3RNZXNzYWdlKHIsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUCA9IEguTUVTU0FHRVMsIE8gPSBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHAsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwLnN0YXRlLCBlKSwgT2JqZWN0LmFzc2lnbihwLnN0YXRlLkFMTEZJRUxEUywgZSksIHAuY2FsbGJhY2tSZWdpc3RyeS5leGVjdXRlQWxsKHAuc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoLmlzSW52YWxpZChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBoLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXRTdGF0ZUFuZFB1Ymxpc2godC5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtICYmIGcgJiYgKG0gPSAhMCwgaC5zZW5kKHIsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShuZXcgQyhuLl9nZW5lcmF0ZUlEKSksIHAuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKSwgcC5jYWxsYmFja1JlZ2lzdHJ5LmV4ZWN1dGVBbGwocC5zdGF0ZSwgITApLCB6LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaC5pc0ludmFsaWQoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaC5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSAhMSwgei5jbGVhclRpbWVvdXQocC5faGFuZHNoYWtlVGltZW91dCksIHoucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHUpLCBpKG5ldyBJKHApKSwgei5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbyksIHAuc2V0U3RhdGVBbmRQdWJsaXNoKHQuc3RhdGUpLCBwLmNhbGxiYWNrUmVnaXN0cnkuaGFzQ2FsbGJhY2tzKCkgJiYgcyhQLkdFVFNUQVRFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICYmIHBvc3RNZXNzYWdlID8gKHouYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHUpLCBzKFAuSEFORFNIQUtFKSwgcC5faGFuZHNoYWtlVGltZW91dCA9IHNldFRpbWVvdXQoYywgMjUwKSkgOiBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouc19jX2luIHx8ICh6LnNfY19pbCA9IFtdLCB6LnNfY19pbiA9IDApLCBwLl9jID0gJ1Zpc2l0b3InLCBwLl9pbCA9IHouc19jX2lsLCBwLl9pbiA9IHouc19jX2luLCBwLl9pbFtwLl9pbl0gPSBwLCB6LnNfY19pbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIT09IGUuaW5kZXhPZignXycpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIG5bZV0gJiYgKHBbZV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGUpLCBwLmdldFN1cHBsZW1lbnRhbERhdGFJRCA9IG4uZ2V0U3VwcGxlbWVudGFsRGF0YUlELCBwLmlzQWxsb3dlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0aGlzLCBnID0gdC53aGl0ZWxpc3RQYXJlbnREb21haW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdGF0ZSA9IHsgQUxMRklFTERTOiB7fSB9LCBwLnZlcnNpb24gPSBuLnZlcnNpb24sIHAubWFya2V0aW5nQ2xvdWRPcmdJRCA9IGUsIHAuY29va2llRG9tYWluID0gbi5jb29raWVEb21haW4gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSAhKHAuX2luc3RhbmNlVHlwZSA9ICdjaGlsZCcpLCBoID0gbmV3IEcoZSwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5jYWxsYmFja1JlZ2lzdHJ5ID0gQSgpLCBwLmluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoKSwgZigpLCBpKG5ldyBEKHApKSwgbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAuZmluZEZpZWxkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gcC5zdGF0ZVtlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KHAuc3RhdGVbZV0pLCBwLnN0YXRlW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAubWVzc2FnZVBhcmVudCA9IHMsIHAuc2V0U3RhdGVBbmRQdWJsaXNoID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEwgPSBILk1FU1NBR0VTLCBNID0gSC5BTExfQVBJUywgViA9IEguQVNZTkNfQVBJX01BUCwgUiA9IEguRklFTERHUk9VUF9UT19GSUVMRCwgWSA9IGZ1bmN0aW9uIChpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKE0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTVtlXSwgbiA9IGlbdF0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcuaXNWYWx1ZUVtcHR5KG4pIHx8IChyW2VdID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5fbG9hZGluZyAmJiBPYmplY3Qua2V5cyhpLl9sb2FkaW5nKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5fbG9hZGluZ1tlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLmxlbmd0aCA/IG4gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBWW2VbMF1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbdF0ociwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2VuZChlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZSksIG4oZSwgTC5IQU5EU0hBS0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGUsIEwuUEFSRU5UU1RBVEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNhbGwoaSwgZSksIHIuc2VuZCh0LCBMLlBBUkVOVFNUQVRFLCB7IENVU1RPTUVSSURTOiBpLmdldEN1c3RvbWVySURzKCkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLnNldEN1c3RvbWVySURzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldEN1c3RvbWVySURzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNJbnZhbGlkKGUpIHx8IChyLnBhcnNlKGUpLnByZWZpeCA9PT0gTC5IQU5EU0hBS0UgPyBzIDogYykoZS5zb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBYID0gZnVuY3Rpb24gKHIsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW3RdID0gZSwgKytvID09PSBzICYmIG4oYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0ge30sIG8gPSAwLCBzID0gT2JqZWN0LmtleXMocikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5mbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmFyZ3MgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnVuc2hpZnQoaShlKSksIHQuZm4uYXBwbHkodC5jb250ZXh0IHx8IG51bGwsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBLID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGVuY29kZVVSSUNvbXBvbmVudChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoJzsnICsgZG9jdW1lbnQuY29va2llKS5zcGxpdCgnICcpLmpvaW4oJzsnKSwgbiA9IHQuaW5kZXhPZignOycgKyBlICsgJz0nKSwgciA9IG4gPCAwID8gbiA6IHQuaW5kZXhPZignOycsIG4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gJycgOiBkZWNvZGVVUklDb21wb25lbnQodC5zdWJzdHJpbmcobiArIDIgKyBlLmxlbmd0aCwgciA8IDAgPyB0Lmxlbmd0aCA6IHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1KG4sICdjb29raWVMaWZldGltZScpLCBpID0gdShuLCAnZXhwaXJlcycpLCBhID0gdShuLCAnZG9tYWluJyksIG8gPSB1KG4sICdzZWN1cmUnKSA/ICdTZWN1cmUnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmICdTRVNTSU9OJyAhPT0gciAmJiAnTk9ORScgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gJycgIT09IHQgPyBwYXJzZUludChyIHx8IDAsIDEwKSA6IC02MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID0gbmV3IERhdGUoKSkuc2V0VGltZShpLmdldFRpbWUoKSArIDEwMDAgKiBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKDEgPT09IGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChpID0gbmV3IERhdGUoKSkuZ2V0WWVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0WWVhcihjICsgMiArIChjIDwgMTkwMCA/IDE5MDAgOiAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdOT05FJyAhPT0gciA/IChkb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQoZSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodCkgKyAnOyBwYXRoPS87JyArIChpID8gJyBleHBpcmVzPScgKyBpLnRvR01UU3RyaW5nKCkgKyAnOycgOiAnJykgKyAoYSA/ICcgZG9tYWluPScgKyBhICsgJzsnIDogJycpICsgbywgdGhpcy5nZXQoZSkgPT09IHQpIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1KHQsICdkb21haW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gPyAnIGRvbWFpbj0nICsgbiArICc7JyA6ICcnLCBkb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQoZSkgKyAnPTsgUGF0aD0vOyBFeHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UOycgKyBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFlICYmIHoubG9jYXRpb24gJiYgKGUgPSB6LmxvY2F0aW9uLmhvc3RuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9ICh0ID0gZSkuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSByLmxlbmd0aCAtIDI7IDAgPD0gbjsgbi0tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IHIuc2xpY2Uobikuam9pbignLicpLCBLLnNldCgndGVzdCcsICdjb29raWUnLCB7IGRvbWFpbjogdCB9KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLnJlbW92ZSgndGVzdCcsIHsgZG9tYWluOiB0IH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xlc3NUaGFuOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCB0KSA8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVWZXJzaW9uc0RpZmZlcmVudDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IG4oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0dyZWF0ZXJUaGFuOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IG4oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VxdWFsOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBGID0gISF6LnBvc3RNZXNzYWdlLCBKID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKEYgPyBuLnBvc3RNZXNzYWdlKGUsIHQucmVwbGFjZSgvKFteOl0rOlwvXC9bXlwvXSspLiovLCAnJDEnKSkgOiB0ICYmIChuLmxvY2F0aW9uID0gdC5yZXBsYWNlKC8jLiokLywgJycpICsgJyMnICsgK25ldyBEYXRlKCkgKyByKysgKyAnJicgKyBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlTWVzc2FnZTogZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGICYmICh0ICYmIChlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIG4gJiYgZS5vcmlnaW4gIT09IG4gfHwgJ1tvYmplY3QgRnVuY3Rpb25dJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4pICYmICExID09PSBuKGUub3JpZ2luKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgei5hZGRFdmVudExpc3RlbmVyID8gelt0ID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInXSgnbWVzc2FnZScsIGUpIDogelt0ID8gJ2F0dGFjaEV2ZW50JyA6ICdkZXRhY2hFdmVudCddKCdvbm1lc3NhZ2UnLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFogPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByID0gJzAxMjM0NTY3ODknLCBpID0gJycsIGEgPSAnJywgbyA9IDgsIHMgPSAxMCwgYyA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyICs9ICdBQkNERUYnLCB0ID0gMDsgdCA8IDE2OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbyksIGkgKz0gci5zdWJzdHJpbmcobiwgbiArIDEpLCBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbyksIGEgKz0gci5zdWJzdHJpbmcobiwgbiArIDEpLCBvID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgJy0nICsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDE5OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzKSwgaSArPSByLnN1YnN0cmluZyhuLCBuICsgMSksIDAgPT09IHQgJiYgOSA9PSBuID8gcyA9IDMgOiAoMSA9PSB0IHx8IDIgPT0gdCkgJiYgMTAgIT0gcyAmJiBuIDwgMiA/IHMgPSAxMCA6IDIgPCB0ICYmIChzID0gMTApLCBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYyksIGEgKz0gci5zdWJzdHJpbmcobiwgbiArIDEpLCAwID09PSB0ICYmIDkgPT0gbiA/IGMgPSAzIDogKDEgPT0gdCB8fCAyID09IHQpICYmIDEwICE9IGMgJiYgbiA8IDIgPyBjID0gMTAgOiAyIDwgdCAmJiAoYyA9IDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlZSA9IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9iY2MyODkzZDg0ODRlNjI5ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfNWRlYjAwZjA0NDg5ZDYxMyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2JjYzI4OTNkODQ4NGU2MjkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzVkZWIwMGYwNDQ4OWQ2MTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNNZXRhZGF0YTogKGUgPSAnbm9uZScsIHQgPSAhMCwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICYmIFhNTEh0dHBSZXF1ZXN0ID09PSBPYmplY3QoWE1MSHR0cFJlcXVlc3QpICYmICgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSA/IGUgPSAnWE1MSHR0cFJlcXVlc3QnIDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFhEb21haW5SZXF1ZXN0ICYmIFhEb21haW5SZXF1ZXN0ID09PSBPYmplY3QoWERvbWFpblJlcXVlc3QpICYmICh0ID0gITEpLCAwIDwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHouSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgJiYgKHQgPSAhMSkpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNUeXBlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzQ29va2llc0VuYWJsZWQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDT1JTSW5zdGFuY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9kMzk0NjQ0YjFkNzM1MjA1ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfYTE2ZTY1M2Y4ZmIyMjYwOSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZDM5NDY0NGIxZDczNTIwNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9hMTZlNjUzZjhmYjIyNjA5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2Y4ZTlhNmQ2MTcyYTMxNDQuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdub25lJyA9PT0gdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGUgPyBudWxsIDogbmV3IHpbdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGVdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9kMzk0NjQ0YjFkNzM1MjA1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfZDM5NDY0NGIxZDczNTIwNSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYTE2ZTY1M2Y4ZmIyMjYwOSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkX2ExNmU2NTNmOGZiMjI2MDkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNPUlM6IGZ1bmN0aW9uIChhLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodCA9IEpTT04ucGFyc2UoZSkpICE9PSBPYmplY3QodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG8uaGFuZGxlQ09SU0Vycm9yKGEsIG51bGwsICdSZXNwb25zZSBpcyBub3QgSlNPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG8uaGFuZGxlQ09SU0Vycm9yKGEsIGUsICdFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGFzIEpTT04nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGEuY2FsbGJhY2ssIHIgPSB6LCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByW25baV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5oYW5kbGVDT1JTRXJyb3IoYSwgZSwgJ0Vycm9yIGZvcm1pbmcgY2FsbGJhY2sgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGEubG9hZEVycm9ySGFuZGxlciA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmdldENPUlNJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5vcGVuKCdnZXQnLCBhLmNvcnNVcmwgKyAnJnRzPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgITApLCAnWE1MSHR0cFJlcXVlc3QnID09PSB0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSAmJiAobi53aXRoQ3JlZGVudGlhbHMgPSAhMCwgbi50aW1lb3V0ID0gci5sb2FkVGltZW91dCwgbi5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyksIG4ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiAyMDAgPT09IHRoaXMuc3RhdHVzICYmIHQodGhpcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4ub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5oYW5kbGVDT1JTRXJyb3IoYSwgZSwgJ29uZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub250aW1lb3V0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmhhbmRsZUNPUlNFcnJvcihhLCBlLCAnb250aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnNlbmQoKSwgci5fbG9nLnJlcXVlc3RzLnB1c2goYS5jb3JzVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDT1JTRXJyb3IoYSwgciwgJ3RyeS1jYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDT1JTRXJyb3I6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuQ09SU0Vycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNEYXRhOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5sb2FkRXJyb3JIYW5kbGVyICYmICgnb250aW1lb3V0JyA9PT0gbiA/IGUubG9hZEVycm9ySGFuZGxlcighMCkgOiBlLmxvYWRFcnJvckhhbmRsZXIoITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9iY2MyODkzZDg0ODRlNjI5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF9iY2MyODkzZDg0ODRlNjI5KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzVkZWIwMGYwNDQ4OWQ2MTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzVkZWIwMGYwNDQ4OWQ2MTMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NUX01FU1NBR0VfRU5BQkxFRDogISF6LnBvc3RNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBWVNfQkVUV0VFTl9TWU5DX0lEX0NBTExTOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTExJU19QRVJfREFZOiA4NjQwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQzogJ2Fkb2JlX21jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQ19TRElEOiAnYWRvYmVfbWNfc2RpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURfVklTSVRPUl9JRF9SRUdFWDogL15bMC05YS1mQS1GXC1dKyQvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFET0JFX01DX1RUTF9JTl9NSU46IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9SRUdFWDogL3ZWZXJzaW9uXHwoKFxkK1wuKT8oXGQrXC4pPyhcKnxcZCspKSg/PSR8XHwpLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVJTVF9QQVJUWV9TRVJWRVJfQ09PS0lFOiAnc19lY2lkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbmUgPSBmdW5jdGlvbiAoZywgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gei5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJPVFRMRV9TVEFSVDogMzAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TWU5DU19MRU5HVEg6IDY0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lclNldDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VQaXhlbHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVIb3N0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZnJhbWVIb3N0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKyAnLy8nICsgdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZG9tYWluOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVybDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSAnaHR0cDovL2Zhc3QuJywgbiA9ICc/ZF9uc2lkPScgKyBnLmlkU3luY0NvbnRhaW5lcklEICsgJyMnICsgZW5jb2RlVVJJQ29tcG9uZW50KGkubG9jYXRpb24ub3JpZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YmRvbWFpbiB8fCAodGhpcy5zdWJkb21haW4gPSAnbm9zdWJkb21haW5yZXR1cm5lZCcpLCBnLmxvYWRTU0wgJiYgKHQgPSBnLmlkU3luY1NTTFVzZUFrYW1haSA/ICdodHRwczovL2Zhc3QuJyA6ICdodHRwczovLycpLCBlID0gdCArIHRoaXMuc3ViZG9tYWluICsgJy5kZW1kZXgubmV0L2Rlc3Q1Lmh0bWwnICsgbiwgdGhpcy5pZnJhbWVIb3N0ID0gdGhpcy5nZXRJZnJhbWVIb3N0KGUpLCB0aGlzLmlkID0gJ2Rlc3RpbmF0aW9uX3B1Ymxpc2hpbmdfaWZyYW1lXycgKyB0aGlzLnN1YmRvbWFpbiArICdfJyArIGcuaWRTeW5jQ29udGFpbmVySUQsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRFBJZnJhbWVTcmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJz9kX25zaWQ9JyArIGcuaWRTeW5jQ29udGFpbmVySUQgKyAnIycgKyBlbmNvZGVVUklDb21wb25lbnQoaS5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiBnLmRwSWZyYW1lU3JjICYmIGcuZHBJZnJhbWVTcmMubGVuZ3RoICYmICh0aGlzLmlkID0gJ2Rlc3RpbmF0aW9uX3B1Ymxpc2hpbmdfaWZyYW1lXycgKyAoZy5fc3ViZG9tYWluIHx8IHRoaXMuc3ViZG9tYWluIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArICdfJyArIGcuaWRTeW5jQ29udGFpbmVySUQsIHRoaXMuaWZyYW1lSG9zdCA9IHRoaXMuZ2V0SWZyYW1lSG9zdChnLmRwSWZyYW1lU3JjKSwgdGhpcy51cmwgPSBnLmRwSWZyYW1lU3JjICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ2FsbE5vdFByb2Nlc3NzZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQXR0YWNoSWZyYW1lOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0dGFjaGluZ0lmcmFtZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUhhc0xvYWRlZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lSWRDaGFuZ2VkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJZnJhbWVDcmVhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbElmcmFtZUhhc0xvYWRlZEFscmVhZHk6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUxvYWRlZENhbGxiYWNrczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNoYW5nZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlZ2lvbkNoYW5nZWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRpbmdNZXNzYWdlczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNQb3N0ZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1JlY2VpdmVkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVNlbmRpbmdJbnRlcnZhbDogdGUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgPyBudWxsIDogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VEZXN0aW5hdGlvbnNGaXJlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25Gb3JDb21wYXJpc29uOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbkR1cGxpY2F0ZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uV2FpdGluZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25Qcm9jZXNzZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5TZXRUaGlyZFBhcnR5Q29va2llczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGhpcmRQYXJ0eUNvb2tpZXNOb3RpZmljYXRpb246ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeVRvQXR0YWNoSWZyYW1lUHJlbGltaW5hcnk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGcuaWRTeW5jRGlzYWJsZVN5bmNzIHx8IGcuZGlzYWJsZUlkU3luY3MgfHwgZy5pZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nIHx8IGcuZGlzYWJsZVRoaXJkUGFydHlDb29raWVzIHx8IGcuZGlzYWJsZVRoaXJkUGFydHlDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5VG9BdHRhY2hJZnJhbWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeSgpICYmICh0aGlzLmRvQXR0YWNoSWZyYW1lIHx8IGcuX2RvQXR0YWNoSWZyYW1lKSAmJiAodGhpcy5zdWJkb21haW4gJiYgJ25vc3ViZG9tYWlucmV0dXJuZWQnICE9PSB0aGlzLnN1YmRvbWFpbiB8fCBnLl9zdWJkb21haW4pICYmIHRoaXMudXJsICYmICF0aGlzLnN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaElmcmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociA9IGkuY3JlYXRlRWxlbWVudCgnaWZyYW1lJykpLnNhbmRib3ggPSAnYWxsb3ctc2NyaXB0cyBhbGxvdy1zYW1lLW9yaWdpbicsIHIudGl0bGUgPSAnQWRvYmUgSUQgU3luY2luZyBpRnJhbWUnLCByLmlkID0gbi5pZCwgci5uYW1lID0gbi5pZCArICdfbmFtZScsIHIuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBub25lOyB3aWR0aDogMDsgaGVpZ2h0OiAwOycsIHIuc3JjID0gbi51cmwsIG4ubmV3SWZyYW1lQ3JlYXRlZCA9ICEwLCB0KCksIGkuYm9keS5hcHBlbmRDaGlsZChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jbGFzc05hbWUgPSAnYWFtSWZyYW1lTG9hZGVkJywgbi5pZnJhbWVIYXNMb2FkZWQgPSAhMCwgbi5maXJlSWZyYW1lTG9hZGVkQ2FsbGJhY2tzKGUpLCBuLnJlcXVlc3RUb1Byb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRlZEF0dGFjaGluZ0lmcmFtZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCByID0gaS5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPyAnSUZSQU1FJyAhPT0gci5ub2RlTmFtZSA/ICh0aGlzLmlkICs9ICdfMicsIHRoaXMuaWZyYW1lSWRDaGFuZ2VkID0gITAsIGUoKSkgOiAodGhpcy5uZXdJZnJhbWVDcmVhdGVkID0gITEsICdhYW1JZnJhbWVMb2FkZWQnICE9PSByLmNsYXNzTmFtZSA/ICh0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeSA9ICExLCB0KCdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgYWxyZWFkeSBleGlzdHMgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LCBidXQgaGFkblwndCBsb2FkZWQgeWV0LicpKSA6ICh0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeSA9ICEwLCB0aGlzLmlmcmFtZUhhc0xvYWRlZCA9ICEwLCB0aGlzLmlmcmFtZSA9IHIsIHRoaXMuZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrcygnVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGFscmVhZHkgZXhpc3RzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSwgYW5kIGhhZCBsb2FkZWQgYWxyZXNhZHkuJyksIHRoaXMucmVxdWVzdFRvUHJvY2VzcygpKSkgOiBlKCksIHRoaXMuaWZyYW1lID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrczogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlICYmIGUoeyBtZXNzYWdlOiB0IHx8ICdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgd2FzIGF0dGFjaGVkIGFuZCBsb2FkZWQgc3VjY2Vzc2Z1bGx5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5pZnJhbWVMb2FkZWRDYWxsYmFja3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRvUHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5qc29uRm9yQ29tcGFyaXNvbi5wdXNoKGUpLCByLmpzb25XYWl0aW5nLnB1c2goZSksIHIucHJvY2Vzc1N5bmNPblBhZ2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gT2JqZWN0KGUpICYmIGUuaWJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gSlNPTi5zdHJpbmdpZnkoZS5pYnMgfHwgW10pLCB0aGlzLmpzb25Gb3JDb21wYXJpc29uLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgYSwgbywgcyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBhID0gdGhpcy5qc29uRm9yQ29tcGFyaXNvbi5sZW5ndGg7IGkgPCBhOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9IHRoaXMuanNvbkZvckNvbXBhcmlzb25baV0sIG4gPT09IEpTT04uc3RyaW5naWZ5KG8uaWJzIHx8IFtdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA/IHRoaXMuanNvbkR1cGxpY2F0ZXMucHVzaChlKSA6IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnJlY2VpdmVkVGhpcmRQYXJ0eUNvb2tpZXNOb3RpZmljYXRpb24gfHwgIXRlLlBPU1RfTUVTU0FHRV9FTkFCTEVEIHx8IHRoaXMuaWZyYW1lSGFzTG9hZGVkKSAmJiB0aGlzLmpzb25XYWl0aW5nLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gdGhpcy5qc29uV2FpdGluZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcyhjKSwgdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmlkU3luY0Rpc2FibGVTeW5jcyB8fCBnLmRpc2FibGVJZFN5bmNzIHx8ICF0aGlzLmlmcmFtZUhhc0xvYWRlZCB8fCAhdGhpcy5tZXNzYWdlcy5sZW5ndGggfHwgdGhpcy5zZW5kaW5nTWVzc2FnZXMgfHwgKHRoaXMudGhyb3R0bGVUaW1lclNldCB8fCAodGhpcy50aHJvdHRsZVRpbWVyU2V0ID0gITAsIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubWVzc2FnZVNlbmRpbmdJbnRlcnZhbCA9IHRlLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gbnVsbCA6IDE1MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuVEhST1RUTEVfU1RBUlQpKSwgdGhpcy5zZW5kaW5nTWVzc2FnZXMgPSAhMCwgdGhpcy5zZW5kTWVzc2FnZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lvbkFuZENoZWNrSWZDaGFuZ2VkOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBnLl9nZXRGaWVsZCgnTUNBQU1MSCcpLCByID0gZS5kX3JlZ2lvbiB8fCBlLmRjc19yZWdpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHIgJiYgKGcuX3NldEZpZWxkRXhwaXJlKCdNQ0FBTUxIJywgdCksIGcuX3NldEZpZWxkKCdNQ0FBTUxIJywgciksIHBhcnNlSW50KG4sIDEwKSAhPT0gciAmJiAodGhpcy5yZWdpb25DaGFuZ2VkID0gITAsIHRoaXMudGltZXNSZWdpb25DaGFuZ2VkKyssIGcuX3NldEZpZWxkKCdNQ1NZTkNTT1AnLCAnJyksIGcuX3NldEZpZWxkKCdNQ1NZTkNTJywgJycpLCBuID0gcikpIDogKG4gPSByKSAmJiAoZy5fc2V0RmllbGRFeHBpcmUoJ01DQUFNTEgnLCB0KSwgZy5fc2V0RmllbGQoJ01DQUFNTEgnLCBuKSksIG4gfHwgKG4gPSAnJyksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTeW5jT25QYWdlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBlLmlicykgJiYgdCBpbnN0YW5jZW9mIEFycmF5ICYmIChuID0gdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBuOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID0gdFtyXSkuc3luY09uUGFnZSAmJiB0aGlzLmNoZWNrRmlyc3RQYXJ0eUNvb2tpZShpLCAnJywgJ3N5bmNPblBhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBpLCBhLCBvID0gZW5jb2RlVVJJQ29tcG9uZW50LCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBlLmlicykgJiYgdCBpbnN0YW5jZW9mIEFycmF5ICYmIChuID0gdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9ICEwLCByID0gMDsgciA8IG47IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRbcl0sIGEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKCdpYnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oaS5pZCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGkudGFnIHx8ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0KGkudXJsIHx8IFtdLCAnLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhpLnR0bCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5maXJlVVJMU3luYyA/ICd0cnVlJyA6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaS5zeW5jT25QYWdlIHx8ICh0aGlzLmNhblNldFRoaXJkUGFydHlDb29raWVzID8gdGhpcy5hZGRNZXNzYWdlKGEuam9pbignfCcpKSA6IGkuZmlyZVVSTFN5bmMgJiYgdGhpcy5jaGVja0ZpcnN0UGFydHlDb29raWUoaSwgYS5qb2luKCd8JykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgJiYgdGhpcy5qc29uUHJvY2Vzc2VkLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRmlyc3RQYXJ0eUNvb2tpZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ3N5bmNPblBhZ2UnID09PSBuLCBpID0gciA/ICdNQ1NZTkNTT1AnIDogJ01DU1lOQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5fcmVhZFZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvLCBzID0gZy5fZ2V0RmllbGQoaSksIGMgPSAhMSwgdSA9ICExLCBsID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gdGUuTUlMTElTX1BFUl9EQVkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA/IChhID0gcy5zcGxpdCgnKicpLCBjID0gKG8gPSB0aGlzLnBydW5lU3luY0RhdGEoYSwgZS5pZCwgbCkpLmRhdGFQcmVzZW50LCB1ID0gby5kYXRhVmFsaWQsIGMgJiYgdSB8fCB0aGlzLmZpcmVTeW5jKHIsIGUsIHQsIGEsIGksIGwpKSA6IChhID0gW10sIHRoaXMuZmlyZVN5bmMociwgZSwgdCwgYSwgaSwgbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZVN5bmNEYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGksIGEsIG8gPSAhMSwgcyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGVbaV0sIGEgPSBwYXJzZUludChyLnNwbGl0KCctJylbMV0sIDEwKSwgci5tYXRjaCgnXicgKyB0ICsgJy0nKSA/IChvID0gITAsIG4gPCBhID8gcyA9ICEwIDogKGUuc3BsaWNlKGksIDEpLCBpLS0pKSA6IGEgPD0gbiAmJiAoZS5zcGxpY2UoaSwgMSksIGktLSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQcmVzZW50OiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFWYWxpZDogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlU3luY3NTaXplOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuam9pbignKicpLmxlbmd0aCA+IHRoaXMuTUFYX1NZTkNTX0xFTkdUSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUuc3BsaXQoJy0nKVsxXSwgMTApIC0gcGFyc2VJbnQodC5zcGxpdCgnLScpWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyBlLmpvaW4oJyonKS5sZW5ndGggPiB0aGlzLk1BWF9TWU5DU19MRU5HVEg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVTeW5jOiBmdW5jdGlvbiAoZSwgdCwgbiwgciwgbCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2ltZycgPT09IHQudGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvLCBzLCBjLCB1ID0gdC51cmwsIGYgPSBnLmxvYWRTU0wgPyAnaHR0cHM6JyA6ICdodHRwOic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDAsIG8gPSB1Lmxlbmd0aDsgYSA8IG87IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHVbYV0sIGMgPSAvXlwvXC8vLnRlc3Qocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKG8sIHMsIGMsIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm9uUGFnZVBpeGVsc1tvXSA9IG51bGwsIGcuX3JlYWRWaXNpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCBuLCByLCBpID0gZy5fZ2V0RmllbGQobCksIGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwLCBuID0gKGUgPSBpLnNwbGl0KCcqJykpLmxlbmd0aDsgdCA8IG47IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociA9IGVbdF0pLm1hdGNoKCdeJyArIHMuaWQgKyAnLScpIHx8IGEucHVzaChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zZXRTeW5jVHJhY2tpbmdEYXRhKGEsIHMsIGMsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMub25QYWdlUGl4ZWxzLmxlbmd0aCwgdCwgbCwgaSkpLCBwLnNyYyA9IChjID8gZiA6ICcnKSArIHMsIHRoaXMub25QYWdlUGl4ZWxzLnB1c2gocCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobiksIHRoaXMuc2V0U3luY1RyYWNraW5nRGF0YShyLCB0LCBsLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZW5jb2RlVVJJQ29tcG9uZW50KGcuX2VuYWJsZUVycm9yUmVwb3J0aW5nID8gJy0tLWRlc3RwdWItZGVidWctLS0nIDogJy0tLWRlc3RwdWItLS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCgodGUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgPyAnJyA6IHQpICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN5bmNUcmFja2luZ0RhdGE6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2godC5pZCArICctJyArIChyICsgTWF0aC5jZWlsKHQudHRsIC8gNjAgLyAyNCkpKSwgdGhpcy5tYW5hZ2VTeW5jc1NpemUoZSksIGcuX3NldEZpZWxkKG4sIGUuam9pbignKicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IHRoaXMsIG4gPSAnJywgciA9IGVuY29kZVVSSUNvbXBvbmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaW9uQ2hhbmdlZCAmJiAobiA9IHIoJy0tLWRlc3RwdWItY2xlYXItZGV4dHAtLS0nKSwgdGhpcy5yZWdpb25DaGFuZ2VkID0gITEpLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCA/IHRlLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gKGUgPSBuICsgcignLS0tZGVzdHB1Yi1jb21iaW5lZC0tLScpICsgdGhpcy5tZXNzYWdlcy5qb2luKCclMDEnKSwgdGhpcy5wb3N0TWVzc2FnZShlKSwgdGhpcy5tZXNzYWdlcyA9IFtdLCB0aGlzLnNlbmRpbmdNZXNzYWdlcyA9ICExKSA6IChlID0gdGhpcy5tZXNzYWdlcy5zaGlmdCgpLCB0aGlzLnBvc3RNZXNzYWdlKG4gKyBlKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZW5kTWVzc2FnZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubWVzc2FnZVNlbmRpbmdJbnRlcnZhbCkpIDogdGhpcy5zZW5kaW5nTWVzc2FnZXMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLnBvc3RNZXNzYWdlKGUsIHRoaXMudXJsLCB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSwgdGhpcy5tZXNzYWdlc1Bvc3RlZC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlTWVzc2FnZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gL14tLS1kZXN0cHViLXRvLXBhcmVudC0tLS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiBuLnRlc3QoZSkgJiYgKCdjYW5TZXRUaGlyZFBhcnR5Q29va2llcycgPT09ICh0ID0gZS5yZXBsYWNlKG4sICcnKS5zcGxpdCgnfCcpKVswXSAmJiAodGhpcy5jYW5TZXRUaGlyZFBhcnR5Q29va2llcyA9ICd0cnVlJyA9PT0gdFsxXSwgdGhpcy5yZWNlaXZlZFRoaXJkUGFydHlDb29raWVzTm90aWZpY2F0aW9uID0gITAsIHRoaXMucmVxdWVzdFRvUHJvY2VzcygpKSwgdGhpcy5tZXNzYWdlc1JlY2VpdmVkLnB1c2goZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzSURDYWxsRGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IHRoaXMudXJsIHx8IGUuc3ViZG9tYWluICYmICdub3N1YmRvbWFpbnJldHVybmVkJyA9PT0gdGhpcy5zdWJkb21haW4pICYmICgnc3RyaW5nJyA9PSB0eXBlb2YgZy5fc3ViZG9tYWluICYmIGcuX3N1YmRvbWFpbi5sZW5ndGggPyB0aGlzLnN1YmRvbWFpbiA9IGcuX3N1YmRvbWFpbiA6IHRoaXMuc3ViZG9tYWluID0gZS5zdWJkb21haW4gfHwgJycsIHRoaXMudXJsID0gdGhpcy5nZXRVcmwoKSksIGUuaWJzIGluc3RhbmNlb2YgQXJyYXkgJiYgZS5pYnMubGVuZ3RoICYmICh0aGlzLmRvQXR0YWNoSWZyYW1lID0gITApLCB0aGlzLnJlYWR5VG9BdHRhY2hJZnJhbWUoKSAmJiAoZy5pZFN5bmNBdHRhY2hJZnJhbWVPbldpbmRvd0xvYWQgPyAodC53aW5kb3dMb2FkZWQgfHwgJ2NvbXBsZXRlJyA9PT0gaS5yZWFkeVN0YXRlIHx8ICdsb2FkZWQnID09PSBpLnJlYWR5U3RhdGUpICYmIHRoaXMuYXR0YWNoSWZyYW1lKCkgOiB0aGlzLmF0dGFjaElmcmFtZUFTQVAoKSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGcuaWRTeW5jSURDYWxsUmVzdWx0ID8gZy5pZFN5bmNJRENhbGxSZXN1bHQoZSkgOiB0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoZSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGcuaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQgJiYgZy5pZFN5bmNBZnRlcklEQ2FsbFJlc3VsdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuTWFrZVN5bmNJRENhbGw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5fZm9yY2VTeW5jSURDYWxsIHx8ICFlIHx8IHQgLSBlID4gdGUuREFZU19CRVRXRUVOX1NZTkNfSURfQ0FMTFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaElmcmFtZUFTQVA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdGFydGVkQXR0YWNoaW5nSWZyYW1lIHx8IChpLmJvZHkgPyB0LmF0dGFjaElmcmFtZSgpIDogc2V0VGltZW91dChlLCAzMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaWVuY2VNYW5hZ2VyU2VydmVyOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZURvbWFpbjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llTGlmZXRpbWU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNPcHRJbkFwcGx5OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVGhpcmRQYXJ0eUNhbGxzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkVHJhY2tpbmdTZXJ2ZXJFQ0lEOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNBZnRlcklEQ2FsbFJlc3VsdDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jQXR0YWNoSWZyYW1lT25XaW5kb3dMb2FkOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNDb250YWluZXJJRDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVRoaXJkUGFydHlDb29raWVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNEaXNhYmxlU3luY3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVJZFN5bmNzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNJRENhbGxSZXN1bHQ6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkU3luY1NTTFVzZUFrYW1haToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb29wU2FmZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJYWJDb250ZXh0OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09wdEluU3RvcmFnZUVuYWJsZWQ6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTU0w6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUaW1lb3V0OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdDbG91ZFNlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEluQ29va2llRG9tYWluOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJblN0b3JhZ2VFeHBpcnk6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUNyb3NzRG9tYWluTUNJREFuZEFJRDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlT3B0SW5BcHByb3ZhbHM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUGVybWlzc2lvbnM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0QmVmb3JlVmVyc2lvbjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RpZFBhcmFtRXhwaXJ5OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTdGF0ZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvb2tpZU5hbWU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvb2tpZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVRpbWVvdXRNZXRyaWNzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tpbmdTZXJ2ZXJTZWN1cmU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdElmcmFtZURvbWFpbnM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdFBhcmVudERvbWFpbjoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnTmFtZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKE4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUNvbmZpZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgIT0gdHlwZW9mIGUgPyBlIDogZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub24gPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW09OXSBDYWxsYmFjayBzaG91bGQgYmUgYSBmdW5jdGlvbi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSB8fCAoaVtlXSA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpW2VdLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZV0uc3BsaWNlKHIsIDEpLCBpW2VdLmxlbmd0aCB8fCBkZWxldGUgaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLm9mZiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaGFzT3duUHJvcGVydHkoZSkgJiYgKGlbZV0gPSBpW2VdLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2sgIT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnB1Ymxpc2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5oYXNPd25Qcm9wZXJ0eShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2VdLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGxiYWNrLmFwcGx5KGUuY29udGV4dCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUucHVibGlzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTkRJTkc6ICdwZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOR0VEOiAnY2hhbmdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExFVEU6ICdjb21wbGV0ZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGllID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTTogJ2FhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDTE9VRDogJ2FkY2xvdWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZVElDUzogJ2FhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1QQUlHTjogJ2NhbXBhaWduJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0lEOiAnZWNpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElWRUZZUkU6ICdsaXZlZnlyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUOiAndGFyZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9BTkFMWVRJQ1M6ICdtZWRpYWFhJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWUgPSAoZShoID0ge30sIGllLkFBTSwgNTY1KSwgZShoLCBpZS5FQ0lELCA1NjUpLCBoKSwgb2UgPSAoZSh2ID0ge30sIGllLkFBTSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlKHYsIGllLkVDSUQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgdiksIHNlID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlb2FhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWFiQ29uc2VudEhhc2gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBjZSA9IChiID0gaWUsIE9iamVjdC5rZXlzKGIpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCB1ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGxiYWNrcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHIuYWRkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbY2FsbGJhY2tSZWdpc3RyeUZhY3RvcnldIE1ha2Ugc3VyZSBjYWxsYmFjayBpcyBhIGZ1bmN0aW9uIG9yIGFuIGFycmF5IG9mIGZ1bmN0aW9ucy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsYmFja3NbZV0gPSByLmNhbGxiYWNrc1tlXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLmNhbGxiYWNrc1tlXS5wdXNoKHQpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuY2FsbGJhY2tzW2VdLnNwbGljZShuLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLmV4ZWN1dGUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5jYWxsYmFja3NbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA9IHZvaWQgMCA9PT0gdCA/IFtdIDogdCkgaW5zdGFuY2VvZiBBcnJheSA/IHQgOiBbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyByLmNhbGxiYWNrc1tlXS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5jYWxsYmFja3NbZV0uc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbiA/IG4uYXBwbHkobnVsbCwgdCkgOiBuIGluc3RhbmNlb2YgQXJyYXkgJiYgblsxXS5hcHBseShuWzBdLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHIuY2FsbGJhY2tzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci5leGVjdXRlQWxsID0gZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUgfHwgbiAmJiAhcyhuKSkgJiYgT2JqZWN0LmtleXMoci5jYWxsYmFja3MpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwICE9PSBuW2VdID8gbltlXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5leGVjdXRlKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLmhhc0NhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oT2JqZWN0LmtleXMoci5jYWxsYmFja3MpLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93LmNvbnNvbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZmUgPSBmdW5jdGlvbiAociwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCkgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZShyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIG4gPSAwOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlW3JdLmFwcGx5KGNvbnNvbGUsIFtpXS5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGUgPSByLCBnZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gW10sIGUgPSAwOyBlIDwgMjU2OyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IGUsIG4gPSAwOyBuIDwgODsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDEgJiB0ID8gMzk4ODI5MjM4NCBeIHQgPj4+IDEgOiB0ID4+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKSwgdCB8fCAodCA9IDApLCB0IF49IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMjU1ICYgKHQgXiBlLmNoYXJDb2RlQXQobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgPj4+IDggXiBpW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodCBePSAtMSkgPj4+IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgbWUgPSBuZXcgcGUoJ1tBRE9CRSBPUFQtSU5dJyksIGhlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcShlKSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEFycmF5ID8gZSA6IGhlKGUsICdzdHJpbmcnKSA/IFtlXSA6IHQgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBiZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBPYmplY3Qua2V5cyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlLmxlbmd0aCAmJiBlLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHllID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCAmJiBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgeGUoZSkpICYmIHZlKGUpLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA8IGNlLmluZGV4T2YoZSkgfHwgbiAmJiAtMSA8IHNlLmluZGV4T2YoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfZSA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdID0gbiwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCBBcnJheV0nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkgJiYgIWUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwga2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3ZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgRWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgfHwgKHdlKGUpID8geWUoT2JqZWN0LmtleXMoZSksICEwKSA6IEllKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEllID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgaGUoZSwgJ3N0cmluZycpICYmIHllKE9iamVjdC5rZXlzKHQpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgd2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmIGhlKGUsICdvYmplY3QnKSAmJiAhMSA9PT0gQXJyYXkuaXNBcnJheShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIERlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZShlLCAnZnVuY3Rpb24nKSA/IGUoKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWUoZSkgfHwgbWUuZXJyb3IoJycuY29uY2F0KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFRlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZShlKS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9lID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGUgPyBhcmd1bWVudHNbMF0gOiB7fSwgbiA9IHQuY29tbWFuZCwgciA9IHQucGFyYW1zLCBpID0gdm9pZCAwID09PSByID8ge30gOiByLCBhID0gdC5jYWxsYmFjaywgbyA9IHZvaWQgMCA9PT0gYSA/IERlIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuIHx8IC0xID09PSBuLmluZGV4T2YoJy4nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW09wdEluLmV4ZWN1dGVdIFBsZWFzZSBwcm92aWRlIGEgdmFsaWQgY29tbWFuZC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5zcGxpdCgnLicpLCBjID0gZFtzWzBdXSwgdSA9IHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgY1t1XSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ha2Ugc3VyZSB0aGUgcGx1Z2luIGFuZCBBUEkgbmFtZSBleGlzdC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gT2JqZWN0LmFzc2lnbihpLCB7IGNhbGxiYWNrOiBvIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1t1XS5jYWxsKGMsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZS5lcnJvcignW2V4ZWN1dGVdIFNvbWV0aGluZyB3ZW50IHdyb25nOiAnICsgZC5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSwgbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgamUgPSAnZmV0Y2hQZXJtaXNzaW9ucycsIExlID0gJ1tPcHRJbiNyZWdpc3RlclBsdWdpbl0gUGx1Z2luIGlzIGludmFsaWQuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5DYXRlZ29yaWVzID0gaWUsIGQuVGltZW91dEVycm9yID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE1lID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0SW46IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWFiUGx1Z2luOiBtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgVmUgPSBmdW5jdGlvbiAoZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVibGlzaERlc3RpbmF0aW9ucyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdCwgaSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaSA/IGkgOiBlLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdzdWJkb21haW4gaXMgbm90IGEgcG9wdWxhdGVkIHN0cmluZy4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHIgaW5zdGFuY2VvZiBBcnJheSAmJiByLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkoeyBlcnJvcjogJ21lc3NhZ2VzIGlzIG5vdCBhIHBvcHVsYXRlZCBhcnJheS4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgZS5sZW5ndGggJiYgKGEuYWRkTWVzc2FnZShlKSwgbyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdOb25lIG9mIHRoZSBtZXNzYWdlcyBhcmUgcG9wdWxhdGVkIHN0cmluZ3MuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFXLmlzT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkLicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgKGUgPSBzLnN1YmRvbWFpbikgfHwgIWUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdjb25maWcuc3ViZG9tYWluIGlzIG5vdCBhIHBvcHVsYXRlZCBzdHJpbmcuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHMudXJsRGVzdGluYXRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBBcnJheSAmJiBjLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkoeyBlcnJvcjogJ2NvbmZpZy51cmxEZXN0aW5hdGlvbnMgaXMgbm90IGEgcG9wdWxhdGVkIGFycmF5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVy5pc09iamVjdChlKSAmJiAoZS5oaWRlUmVmZXJyZXIgPyBlLm1lc3NhZ2UgJiYgYS5hZGRNZXNzYWdlKGUubWVzc2FnZSkgOiB1LnB1c2goZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Lmxlbmd0aCAmJiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IEltYWdlKCksIHQgPSB1LnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNyYyA9IHQudXJsLCBhLm9uUGFnZURlc3RpbmF0aW9uc0ZpcmVkLnB1c2godCksIGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmlmcmFtZSA/IChpKHsgbWVzc2FnZTogJ1RoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSBpcyBhbHJlYWR5IGF0dGFjaGVkIGFuZCBsb2FkZWQuJyB9KSwgYS5yZXF1ZXN0VG9Qcm9jZXNzKCkpIDogIWQuc3ViZG9tYWluICYmIGQuX2dldEZpZWxkKCdNQ01JRCcpID8gKGEuc3ViZG9tYWluID0gZSwgYS5kb0F0dGFjaElmcmFtZSA9ICEwLCBhLnVybCA9IGEuZ2V0VXJsKCksIGEucmVhZHlUb0F0dGFjaElmcmFtZSgpID8gKGEuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHsgbWVzc2FnZTogJ0F0dGVtcHRlZCB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4gUmVzdWx0OiAnICsgKGUubWVzc2FnZSB8fCAnbm8gcmVzdWx0JykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5hdHRhY2hJZnJhbWUoKSkgOiBpKHsgZXJyb3I6ICdFbmNvdW50ZXJlZCBhIHByb2JsZW0gaW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4nIH0pKSA6IGEuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHsgbWVzc2FnZTogJ0F0dGVtcHRlZCB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggbm9ybWFsIFZpc2l0b3IgQVBJIHByb2Nlc3NpbmcuIFJlc3VsdDogJyArIChlLm1lc3NhZ2UgfHwgJ25vIHJlc3VsdCcpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh7IGVycm9yOiAnVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGlzIGRpc2FibGVkIGluIHRoZSBWaXNpdG9yIGxpYnJhcnkuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUmUgPSBmdW5jdGlvbiBxKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPj4+IHQgfCBlIDw8IDMyIC0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgciwgaSA9IE1hdGgucG93LCBhID0gaSgyLCAzMiksIG8gPSAnJywgcyA9IFtdLCBjID0gOCAqIGUubGVuZ3RoLCB1ID0gcS5oID0gcS5oIHx8IFtdLCBsID0gcS5rID0gcS5rIHx8IFtdLCBkID0gbC5sZW5ndGgsIGYgPSB7fSwgcCA9IDI7IGQgPCA2NDsgcCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZbcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAzMTM7IG4gKz0gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW25dID0gcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbZF0gPSBpKHAsIDAuNSkgKiBhIHwgMCwgbFtkKytdID0gaShwLCAxIC8gMykgKiBhIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSArPSAnXHg4MCc7IGUubGVuZ3RoICUgNjQgLSA1NjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPSBlLmNoYXJDb2RlQXQobikpID4+IDgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbbiA+PiAyXSB8PSByIDw8ICgzIC0gbikgJSA0ICogODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzW3MubGVuZ3RoXSA9IGMgLyBhIHwgMCwgc1tzLmxlbmd0aF0gPSBjLCByID0gMDsgciA8IHMubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IHMuc2xpY2UociwgciArPSAxNiksIG0gPSB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHUgPSB1LnNsaWNlKDAsIDgpLCBuID0gMDsgbiA8IDY0OyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZ1tuIC0gMTVdLCB2ID0gZ1tuIC0gMl0sIGIgPSB1WzBdLCB5ID0gdVs0XSwgXyA9IHVbN10gKyAodCh5LCA2KSBeIHQoeSwgMTEpIF4gdCh5LCAyNSkpICsgKHkgJiB1WzVdIF4gfnkgJiB1WzZdKSArIGxbbl0gKyAoZ1tuXSA9IG4gPCAxNiA/IGdbbl0gOiBnW24gLSAxNl0gKyAodChoLCA3KSBeIHQoaCwgMTgpIF4gaCA+Pj4gMykgKyBnW24gLSA3XSArICh0KHYsIDE3KSBeIHQodiwgMTkpIF4gdiA+Pj4gMTApIHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSA9IFtfICsgKCh0KGIsIDIpIF4gdChiLCAxMykgXiB0KGIsIDIyKSkgKyAoYiAmIHVbMV0gXiBiICYgdVsyXSBeIHVbMV0gJiB1WzJdKSkgfCAwXS5jb25jYXQodSkpWzRdID0gdVs0XSArIF8gfCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCA4OyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1W25dID0gdVtuXSArIG1bbl0gfCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSAzOyByICsgMTsgci0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IHVbbl0gPj4gOCAqIHIgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvICs9IChDIDwgMTYgPyAwIDogJycpICsgQy50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEZlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1NIQS0yNTYnICE9PSB0ICYmICdTSEEyNTYnICE9PSB0ICYmICdzaGEyNTYnICE9PSB0ICYmICdzaGEtMjU2JyAhPT0gdCB8fCAoZSA9IFJlKGUpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE5lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQmUgPSBNZS5PcHRJbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVy5kZWZpbmVHbG9iYWxOYW1lc3BhY2UoKSwgd2luZG93LmFkb2JlLk9wdEluQ2F0ZWdvcmllcyA9IEJlLkNhdGVnb3JpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBVZSA9IGZ1bmN0aW9uIChyLCBuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlIHx8IGsubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZXh0cmFjdFBhcmFtRnJvbVVyaSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGLnBhcnNlUGlwZURlbGltZXRlZEtleVZhbHVlcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUubWF0Y2godGUuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkgJiYgKG4gPT09IEQgJiYgKHggPSAhMCksIHQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGVbRF0sIHYuc2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQsIEQpLCB2Ll9zZXRGaWVsZEV4cGlyZShPLCAtMSksIHQoZVtUXSwgdi5zZXRBbmFseXRpY3NWaXNpdG9ySUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwge30sIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgPSBlLnN1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgfHwgJycsIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCA9IGUuc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkIHx8IHt9LCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0ID0gZS5zdXBwbGVtZW50YWxEYXRhSURMYXN0IHx8ICcnLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgPSBlLnN1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSBuID8gbiArPSAnfCcgOiBuKSArIChlICsgJz0nKSArIGVuY29kZVVSSUNvbXBvbmVudCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFswXSwgciA9IHRbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IHIgJiYgciAhPT0gaiAmJiAoZSA9IGkobiwgciwgZSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IGUucmVkdWNlKHQsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAobiA9IHIpID8gbiArPSAnfCcgOiBuKSArICdUUz0nICsgRi5nZXRUaW1lc3RhbXBJblNlY29uZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5taW51dGVzVG9MaXZlLCBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2LmlkU3luY0Rpc2FibGVTeW5jcyB8fCB2LmRpc2FibGVJZFN5bmNzKSAmJiAobiA9IG4gfHwgJ0Vycm9yOiBpZCBzeW5jcyBoYXZlIGJlZW4gZGlzYWJsZWQnKSwgJ3N0cmluZycgPT0gdHlwZW9mIGUuZHBpZCAmJiBlLmRwaWQubGVuZ3RoIHx8IChuID0gbiB8fCAnRXJyb3I6IGNvbmZpZy5kcGlkIGlzIGVtcHR5JyksICdzdHJpbmcnID09IHR5cGVvZiBlLnVybCAmJiBlLnVybC5sZW5ndGggfHwgKG4gPSBuIHx8ICdFcnJvcjogY29uZmlnLnVybCBpcyBlbXB0eScpLCB2b2lkIDAgPT09IHQgPyB0ID0gMjAxNjAgOiAodCA9IHBhcnNlSW50KHQsIDEwKSwgKGlzTmFOKHQpIHx8IHQgPD0gMCkgJiYgKG4gPSBuIHx8ICdFcnJvcjogY29uZmlnLm1pbnV0ZXNUb0xpdmUgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXInKSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCF2LmNvbmZpZ3MuZG9lc09wdEluQXBwbHkgfHwgYi5vcHRJbi5pc0NvbXBsZXRlICYmIGQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmNvbmZpZ3MuZG9lc09wdEluQXBwbHkgJiYgdi5jb25maWdzLmlzSWFiQ29udGV4dCA/IGIub3B0SW4uaXNBcHByb3ZlZChiLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgJiYgQyA6IGIub3B0SW4uaXNBcHByb3ZlZChiLm9wdEluLkNhdGVnb3JpZXMuRUNJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydnZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0Q3VzdG9tZXJJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeW5jSWRlbnRpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QW5hbHl0aWNzVmlzaXRvcklEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0TG9jYXRpb25IaW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiddCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVswXSwgbiA9IDIgPT09IGUubGVuZ3RoID8gZVsxXSA6ICcnLCByID0gdlt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlt0XSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCgpICYmIHYuaXNBbGxvd2VkKCkgPyByLmFwcGx5KHYsIGFyZ3VtZW50cykgOiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiB2Ll9jYWxsQ2FsbGJhY2soZSwgW25dKSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgpLCB0ID0gZS51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2xvYWREYXRhKHcsIHQsIG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEMgPSAhMCwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSUFCIHBsdWdpbl0gOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmdkcHJBcHBsaWVzICYmICh5ID0gdC5jb25zZW50U3RyaW5nLCBfID0gdC5oYXNDb25zZW50Q2hhbmdlZFNpbmNlTGFzdENtcFB1bGwgPyAxIDogMCksIGwoKSwgaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEMgPSAhMCwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSUFCIHBsdWdpbl0gOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZHByQXBwbGllcyAmJiAoeSA9IHQuY29uc2VudFN0cmluZywgXyA9IHQuaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsID8gMSA6IDApLCB2LmluaXQoKSwgaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm9wdEluLmlzQ29tcGxldGUgJiYgKGIub3B0SW4uaXNBcHByb3ZlZChiLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgPyB2LmNvbmZpZ3MuaXNJYWJDb250ZXh0ID8gYi5vcHRJbi5leGVjdXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ2lhYlBsdWdpbi5mZXRjaENvbnNlbnREYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICh2LmluaXQoKSwgaCgpKSA6IHYuY29uZmlncy5pc0lhYkNvbnRleHQgPyBiLm9wdEluLmV4ZWN1dGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAnaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHUoKSwgaCgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIub3B0SW4ub2ZmKCdjb21wbGV0ZScsIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8IGUuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSAhPT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2UgYFZpc2l0b3IuZ2V0SW5zdGFuY2VgIHRvIGluc3RhbnRpYXRlIFZpc2l0b3IuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMsIGIgPSB3aW5kb3cuYWRvYmUsIHkgPSAnJywgXyA9IDAsIEMgPSAhMSwgeCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi52ZXJzaW9uID0gJzUuMC4xJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0geiwgRSA9IGsuVmlzaXRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUudmVyc2lvbiA9IHYudmVyc2lvbiwgRS5BdXRoU3RhdGUgPSBILkFVVEhfU1RBVEUsIEUuT3B0T3V0ID0gSC5PUFRfT1VULCBrLnNfY19pbiB8fCAoay5zX2NfaWwgPSBbXSwgay5zX2NfaW4gPSAwKSwgdi5fYyA9ICdWaXNpdG9yJywgdi5faWwgPSBrLnNfY19pbCwgdi5faW4gPSBrLnNfY19pbiwgdi5faWxbdi5faW5dID0gdiwgay5zX2NfaW4rKywgdi5faW5zdGFuY2VUeXBlID0gJ3JlZ3VsYXInLCB2Ll9sb2cgPSB7IHJlcXVlc3RzOiBbXSB9LCB2Lm1hcmtldGluZ0Nsb3VkT3JnSUQgPSByLCB2LmNvb2tpZU5hbWUgPSAnQU1DVl8nICsgciwgdi5zZXNzaW9uQ29va2llTmFtZSA9ICdBTUNWU18nICsgciwgdi5jb29raWVEb21haW4gPSBRKCksIHYubG9hZFNTTCA9ICEwLCB2LmxvYWRUaW1lb3V0ID0gMzAwMDAsIHYuQ09SU0Vycm9ycyA9IFtdLCB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyID0gdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIgPSAnZHBtLmRlbWRleC5uZXQnLCB2LnNkaWRQYXJhbUV4cGlyeSA9IDMwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEkgPSBudWxsLCB3ID0gJ01DJywgRCA9ICdNQ01JRCcsIEEgPSAnTUNJRFRTJywgUyA9ICdBJywgVCA9ICdNQ0FJRCcsIFAgPSAnQUFNJywgTyA9ICdNQ0FBTUInLCBqID0gJ05PTkUnLCBMID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3QucHJvdG90eXBlW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE0gPSBlZSh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuRklFTERTID0gSC5GSUVMRFMsIHYuY29va2llUmVhZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5jb29raWVXcml0ZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2LmNvb2tpZUxpZmV0aW1lID8gKCcnICsgdi5jb29raWVMaWZldGltZSkudG9VcHBlckNhc2UoKSA6ICcnLCBpID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuY29uZmlncyAmJiB2LmNvbmZpZ3Muc2VjdXJlQ29va2llICYmICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbCAmJiAoaSA9ICEwKSwgSy5zZXQoZSwgJycgKyB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogdi5jb29raWVEb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpZmV0aW1lOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYucmVzZXRTdGF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA/IHYuX21lcmdlU2VydmVyU3RhdGUoZSkgOiBhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9pc0FsbG93ZWREb25lID0gITEsIHYuX2lzQWxsb3dlZEZsYWcgPSAhMSwgdi5pc0FsbG93ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2lzQWxsb3dlZERvbmUgfHwgKHYuX2lzQWxsb3dlZERvbmUgPSAhMCwgKHYuY29va2llUmVhZCh2LmNvb2tpZU5hbWUpIHx8IHYuY29va2llV3JpdGUodi5jb29raWVOYW1lLCAnVCcsIDEpKSAmJiAodi5faXNBbGxvd2VkRmxhZyA9ICEwKSksICdUJyA9PT0gdi5jb29raWVSZWFkKHYuY29va2llTmFtZSkgJiYgdi5faGVscGVycy5yZW1vdmVDb29raWUodi5jb29raWVOYW1lKSwgdi5faXNBbGxvd2VkRmxhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuc2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3NldE1hcmtldGluZ0Nsb3VkRmllbGRzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciA9ICExLCB2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyICYmIHYubWFya2V0aW5nQ2xvdWRTZXJ2ZXIuaW5kZXhPZignLmRlbWRleC5uZXQnKSA8IDAgJiYgKHYuX3VzZTFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCdfc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMnKSwgciA9IG4udXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9nZXRSZW1vdGVGaWVsZChELCByLCBlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgViA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2VdID0gdi5fZ2V0RmllbGQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgLTEgIT09IGUuaW5kZXhPZignTUNPUFRPVVQnKSA/IHYuaXNPcHRlZE91dChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5NQ09QVE9VVCA9IGUsIHQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwsICEwKSA6IHQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0VmlzaXRvclZhbHVlcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiB2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFshMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IHYuaXNPcHRlZE91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FJRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiB2LmdldEFuYWx5dGljc1Zpc2l0b3JJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFshMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiB2LmdldEF1ZGllbmNlTWFuYWdlckJsb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogWyEwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSB0ICYmIHQubGVuZ3RoID8gVy5wbHVjayhuLCB0KSA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAtMSA9PT0gdC5pbmRleE9mKCdNQ0FJRCcpID8gVihlLCB0KSA6IFgociwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMgPSB7fSwgdi5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCA9ICExLCB2Ll9uZXdDdXN0b21lcklEc0hhc2ggPSAnJywgdi5zZXRDdXN0b21lcklEcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzT3B0ZWRPdXQoKSAmJiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVy5pc09iamVjdChlKSB8fCBXLmlzT2JqZWN0RW1wdHkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gKHYuX3JlYWRWaXNpdG9yKCksIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEwobikgJiYgKHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyA9IHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyB8fCB7fSwgdCA9IChyID0gZVtuXSkuaGFzT3duUHJvcGVydHkoJ2hhc2hUeXBlJykgPyByLmhhc2hUeXBlIDogdCwgcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBxKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgPSBGZShOZShyLmlkKSwgdCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pZCA9IGEsIG8uaGFzaFR5cGUgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pZCA9IHIuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSByLmF1dGhTdGF0ZSAmJiAoby5hdXRoU3RhdGUgPSByLmF1dGhTdGF0ZSksIHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc1tuXSA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgPSBGZShOZShyKSwgdCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbbl0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hUeXBlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlc1tuXSA9IHsgaWQ6IHIgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB2LmdldEN1c3RvbWVySURzKCEwKSwgYyA9IHYuX2dldEZpZWxkKCdNQ0NJREgnKSwgdSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gKGMgfHwgKGMgPSAwKSwgcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVy5pc09iamVjdEVtcHR5KGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiBpbiBsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKG4pICYmICh1ICs9ICh1ID8gJ3wnIDogJycpICsgbiArICd8JyArICgociA9IGxbbl0pLmlkID8gci5pZCA6ICcnKSArIChyLmF1dGhTdGF0ZSA/IHIuYXV0aFN0YXRlIDogJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9uZXdDdXN0b21lcklEc0hhc2ggPSBTdHJpbmcodi5faGFzaCh1KSksIHYuX25ld0N1c3RvbWVySURzSGFzaCAhPT0gYyAmJiAodi5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCA9ICEwLCB2Ll9tYXBDdXN0b21lcklEcyhmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5zeW5jSWRlbnRpdHkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pc09wdGVkT3V0KCkgJiYgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVcuaXNPYmplY3QoZSkgfHwgVy5pc09iamVjdEVtcHR5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaSwgYSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuIGluICh2Ll9yZWFkVmlzaXRvcigpLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMKG4pICYmICh2Ll9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlcyA9IHYuX2N1cnJlbnRDdXN0b21lcklEcy5uYW1lU3BhY2VzIHx8IHt9LCB0ID0gKHIgPSBlW25dKS5oYXNPd25Qcm9wZXJ0eSgnaGFzaFR5cGUnKSA/IHIuaGFzaFR5cGUgOiB0LCByICYmICdvYmplY3QnID09PSBxKHIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGkgPSBGZShOZShyLmlkKSwgdCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaWQgPSBpLCBzLmhhc2hUeXBlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmlkID0gci5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSByLmF1dGhTdGF0ZSAmJiAocy5hdXRoU3RhdGUgPSByLmF1dGhTdGF0ZSksIHIuZGF0YVNvdXJjZSAmJiAodi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzID0gdi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzIHx8IHt9LCBhID0gci5kYXRhU291cmNlLCB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbYV0gPSBzKSwgdi5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXNbbl0gPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHYuZ2V0Q3VzdG9tZXJJRHMoITApLCB1ID0gdi5fZ2V0RmllbGQoJ01DQ0lESCcpLCBsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobyBpbiAodSB8fCAodSA9ICcwJyksIGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGNbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVcuaXNPYmplY3RFbXB0eShkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTChuKSAmJiAobCArPSAobCA/ICd8JyA6ICcnKSArIG4gKyAnfCcgKyAoKHIgPSBkW25dKS5pZCA/IHIuaWQgOiAnJykgKyAoci5hdXRoU3RhdGUgPyByLmF1dGhTdGF0ZSA6ICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fbmV3Q3VzdG9tZXJJRHNIYXNoID0gU3RyaW5nKHYuX2hhc2gobCkpLCB2Ll9uZXdDdXN0b21lcklEc0hhc2ggIT09IHUgJiYgKHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgPSAhMCwgdi5fbWFwQ3VzdG9tZXJJRHMoZikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuZ2V0Q3VzdG9tZXJJRHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3JlYWRWaXNpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gdi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKHQpICYmIChuID0gaVt0XSkuaWQgJiYgKHIuZGF0YVNvdXJjZXNbdF0gfHwgKHIuZGF0YVNvdXJjZXNbdF0gPSB7fSksIHIuZGF0YVNvdXJjZXNbdF0uaWQgPSBuLmlkLCBudWxsICE9IG4uYXV0aFN0YXRlID8gci5kYXRhU291cmNlc1t0XS5hdXRoU3RhdGUgPSBuLmF1dGhTdGF0ZSA6IHIuZGF0YVNvdXJjZXNbdF0uYXV0aFN0YXRlID0gRS5BdXRoU3RhdGUuVU5LTk9XTiwgbi5oYXNoVHlwZSAmJiAoci5kYXRhU291cmNlc1t0XS5oYXNoVHlwZSA9IG4uaGFzaFR5cGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHYuX2N1cnJlbnRDdXN0b21lcklEcy5uYW1lU3BhY2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCBpbiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKHQpICYmIChuID0gYVt0XSkuaWQgJiYgKHIubmFtZVNwYWNlc1t0XSB8fCAoci5uYW1lU3BhY2VzW3RdID0ge30pLCByLm5hbWVTcGFjZXNbdF0uaWQgPSBuLmlkLCBudWxsICE9IG4uYXV0aFN0YXRlID8gci5uYW1lU3BhY2VzW3RdLmF1dGhTdGF0ZSA9IG4uYXV0aFN0YXRlIDogci5uYW1lU3BhY2VzW3RdLmF1dGhTdGF0ZSA9IEUuQXV0aFN0YXRlLlVOS05PV04sIG4uaGFzaFR5cGUgJiYgKHIubmFtZVNwYWNlc1t0XS5oYXNoVHlwZSA9IG4uaGFzaFR5cGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IHIgOiByLmRhdGFTb3VyY2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5zZXRBbmFseXRpY3NWaXNpdG9ySUQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3NldEFuYWx5dGljc0ZpZWxkcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuZ2V0QW5hbHl0aWNzVmlzaXRvcklEID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUYuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmICFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fY2FsbENhbGxiYWNrKGUsIFsnJ10pLCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIHx8IChyID0gdi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldEFuYWx5dGljc1Zpc2l0b3JJRChlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgciB8fCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbiA/IHYubWFya2V0aW5nQ2xvdWRTZXJ2ZXIgOiB2LnRyYWNraW5nU2VydmVyLCBhID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubG9hZFNTTCAmJiAobiA/IHYubWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmUgJiYgKGkgPSB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyU2VjdXJlKSA6IHYudHJhY2tpbmdTZXJ2ZXJTZWN1cmUgJiYgKGkgPSB2LnRyYWNraW5nU2VydmVyU2VjdXJlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICdodHRwJyArICh2LmxvYWRTU0wgPyAncycgOiAnJykgKyAnOi8vJyArIGkgKyAnL2lkJywgYyA9ICdkX3Zpc2lkX3Zlcj0nICsgdi52ZXJzaW9uICsgJyZtY29yZ2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQodi5tYXJrZXRpbmdDbG91ZE9yZ0lEKSArIChyID8gJyZtaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChyKSA6ICcnKSArICh2LmlkU3luY0Rpc2FibGUzcmRQYXJ0eVN5bmNpbmcgfHwgdi5kaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXMgPyAnJmRfY29wcGE9dHJ1ZScgOiAnJyksIHUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzX2NfaWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19zZXQnICsgKG4gPyAnTWFya2V0aW5nQ2xvdWQnIDogJ0FuYWx5dGljcycpICsgJ0ZpZWxkcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHMgKyAnPycgKyBjICsgJyZjYWxsYmFjaz1zX2NfaWwlNUInICsgdi5faW4gKyAnJTVELl9zZXQnICsgKG4gPyAnTWFya2V0aW5nQ2xvdWQnIDogJ0FuYWx5dGljcycpICsgJ0ZpZWxkcycsIG8uY29yc1VybCA9IHMgKyAnPycgKyBjLCBvLmNhbGxiYWNrID0gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby51cmwgPSBhLCB2Ll9nZXRSZW1vdGVGaWVsZChuID8gRCA6IFQsIGEsIGUsIHQsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmdldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX2dldEZpZWxkKFQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gJiYgRi5pc1RyYWNraW5nU2VydmVyUG9wdWxhdGVkKCkgJiYgKG4gPSB2LmdldEFuYWx5dGljc1Zpc2l0b3JJRChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuIHx8ICFGLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCksIGkgPSByLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9nZXRSZW1vdGVGaWVsZCgnTUNBQU1MSCcsIGksIGUsIHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuZ2V0TG9jYXRpb25IaW50ID0gdi5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQsIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2Ll9nZXRGaWVsZChUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuICYmIEYuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmIChuID0gdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYihlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIG4gfHwgIUYuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHYuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoKSwgaSA9IHIudXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgJiYgdi5fc2V0RmllbGRFeHBpcmUoTywgLTEpLCB2Ll9nZXRSZW1vdGVGaWVsZChPLCBpLCBlLCB0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gJycsIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCA9IHt9LCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0ID0gJycsIHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFIgPSAhKHYuZ2V0U3VwcGxlbWVudGFsRGF0YUlEID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50IHx8IHQgfHwgKHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgPSB2Ll9nZW5lcmF0ZUlEKDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3QgJiYgIXYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZFtlXSA/IChuID0gdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCwgdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkW2VdID0gITApIDogbiAmJiAodi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkW2VdICYmICh2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0ID0gdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCwgdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkID0gdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gbiA9IHQgPyAnJyA6IHYuX2dlbmVyYXRlSUQoMSksIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCA9IHt9KSwgbiAmJiAodi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkW2VdID0gITApKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fbGliZXJhdGVkT3B0T3V0ID0gbnVsbCwgdi5nZXRPcHRPdXQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgnX3NldE1hcmtldGluZ0Nsb3VkRmllbGRzJyksIHIgPSBuLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fZ2V0UmVtb3RlRmllbGQoJ01DT1BUT1VUJywgciwgZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuX3JlZ2lzdGVyQ2FsbGJhY2soJ2xpYmVyYXRlZE9wdE91dCcsIGUpLCBudWxsICE9PSB2Ll9saWJlcmF0ZWRPcHRPdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9jYWxsQWxsQ2FsbGJhY2tzKCdsaWJlcmF0ZWRPcHRPdXQnLCBbdi5fbGliZXJhdGVkT3B0T3V0XSksIFIgPSAhMSwgdi5fbGliZXJhdGVkT3B0T3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnbGliZXJhdGVkR2V0T3B0T3V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jb3JzVXJsID0gbi5jb3JzVXJsLnJlcGxhY2UoL1wuZGVtZGV4XC5uZXRcL2lkXD8vLCAnLmRlbWRleC5uZXQvb3B0T3V0U3RhdHVzPycpLCBuLmNhbGxiYWNrID0gW2ldLCB6W2ldID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIgPSBXLnBhcnNlT3B0T3V0KGUsIHQsIGopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHIub3B0T3V0LCBuID0gMTAwMCAqIHIuZF9vdHRsLCB2Ll9saWJlcmF0ZWRPcHRPdXQgPSB0LCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9saWJlcmF0ZWRPcHRPdXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fY2FsbEFsbENhbGxiYWNrcygnbGliZXJhdGVkT3B0T3V0JywgW3RdKSwgUiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE0uZmlyZUNPUlMobiksIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmlzT3B0ZWRPdXQgPSBmdW5jdGlvbiAobiwgciwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgfHwgKHIgPSBFLk9wdE91dC5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdi5nZXRPcHRPdXQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlID09PSBFLk9wdE91dC5HTE9CQUwgfHwgMCA8PSBlLmluZGV4T2Yocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NhbGxDYWxsYmFjayhuLCBbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdCA9PT0gRS5PcHRPdXQuR0xPQkFMIHx8IDAgPD0gdC5pbmRleE9mKHIpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2ZpZWxkcyA9IG51bGwsIHYuX2ZpZWxkc0V4cGlyZWQgPSBudWxsLCB2Ll9oYXNoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChuIDw8IDUpIC0gbiArIGUuY2hhckNvZGVBdCh0KSwgbiAmPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2VuZXJhdGVJRCA9IFosIHYuX2dlbmVyYXRlTG9jYWxNSUQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB2Ll9nZW5lcmF0ZUlEKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVLmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gITAsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9jYWxsYmFja0xpc3QgPSBudWxsLCB2Ll9jYWxsQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBlLmFwcGx5KGssIHQpIDogZVsxXS5hcHBseShlWzBdLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fcmVnaXN0ZXJDYWxsYmFjayA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAobnVsbCA9PSB2Ll9jYWxsYmFja0xpc3QgJiYgKHYuX2NhbGxiYWNrTGlzdCA9IHt9KSwgbnVsbCA9PSB2Ll9jYWxsYmFja0xpc3RbZV0gJiYgKHYuX2NhbGxiYWNrTGlzdFtlXSA9IFtdKSwgdi5fY2FsbGJhY2tMaXN0W2VdLnB1c2godCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fY2FsbEFsbENhbGxiYWNrcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gdi5fY2FsbGJhY2tMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fY2FsbGJhY2tMaXN0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAwIDwgbi5sZW5ndGg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NhbGxDYWxsYmFjayhuLnNoaWZ0KCksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0gPSBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZW5jb2RlVVJJQ29tcG9uZW50KHQpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4pLCBhID0gRi5wYXJzZUhhc2goZSksIG8gPSBGLmhhc2hsZXNzVXJsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gby5pbmRleE9mKCc/JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvICsgJz8nICsgaSArIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBvLnNwbGl0KCc/JyksIGMgPSBzWzBdICsgJz8nLCB1ID0gc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyArIEYuYWRkUXVlcnlQYXJhbUF0TG9jYXRpb24odSwgaSwgcikgKyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZXh0cmFjdFBhcmFtRnJvbVVyaSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgUmVnRXhwKCdbXFw/JiNdJyArIHQgKyAnPShbXiYjXSopJykuZXhlYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBuLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChuWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3BhcnNlQWRvYmVNY0Zyb21VcmwgPSB0KHRlLkFET0JFX01DKSwgdi5fcGFyc2VBZG9iZU1jU2RpZEZyb21VcmwgPSB0KHRlLkFET0JFX01DX1NESUQpLCB2Ll9hdHRlbXB0VG9Qb3B1bGF0ZVNkaWRGcm9tVXJsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHYuX3BhcnNlQWRvYmVNY1NkaWRGcm9tVXJsKGUpLCBuID0gMTAwMDAwMDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuVFMgJiYgKG4gPSBGLmdldFRpbWVzdGFtcEluU2Vjb25kcygpIC0gdC5UUyksIHQgJiYgdC5TRElEICYmIHQuTUNPUkdJRCA9PT0gciAmJiBuIDwgdi5zZGlkUGFyYW1FeHBpcnkgJiYgKHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgPSB0LlNESUQsIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZC5TRElEX1VSTF9QQVJBTSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHYuX3BhcnNlQWRvYmVNY0Zyb21VcmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLlRTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRi5nZXRUaW1lc3RhbXBJblNlY29uZHMoKSAtIGUuVFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLmZsb29yKHQgLyA2MCkgPiB0ZS5BRE9CRV9NQ19UVExfSU5fTUlOIHx8IGUuTUNPUkdJRCAhPT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9tZXJnZVNlcnZlclN0YXRlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID0gZSwgKGUgPSBGLmlzT2JqZWN0KHIpID8gciA6IEpTT04ucGFyc2UocikpW3YubWFya2V0aW5nQ2xvdWRPcmdJRF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbdi5tYXJrZXRpbmdDbG91ZE9yZ0lEXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdC5jdXN0b21lcklEcywgRi5pc09iamVjdChuKSAmJiB2LnNldEN1c3RvbWVySURzKG4pLCBhKHQuc2RpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYHNlcnZlclN0YXRlYCBoYXMgYW4gaW52YWxpZCBmb3JtYXQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3RpbWVvdXQgPSBudWxsLCB2Ll9sb2FkRGF0YSA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0odCwgJ2RfZmllbGRncm91cCcsIGUsIDEpLCByLnVybCA9IHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0oci51cmwsICdkX2ZpZWxkZ3JvdXAnLCBlLCAxKSwgci5jb3JzVXJsID0gdi5fYWRkUXVlcnlzdHJpbmdQYXJhbShyLmNvcnNVcmwsICdkX2ZpZWxkZ3JvdXAnLCBlLCAxKSwgVS5maWVsZEdyb3VwT2JqW2VdID0gITAsIHIgPT09IE9iamVjdChyKSAmJiByLmNvcnNVcmwgJiYgJ1hNTEh0dHBSZXF1ZXN0JyA9PT0gTS5jb3JzTWV0YWRhdGEuY29yc1R5cGUgJiYgTS5maXJlQ09SUyhyLCBuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2NsZWFyVGltZW91dCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB2Ll90aW1lb3V0ICYmIHYuX3RpbWVvdXRbZV0gJiYgKGNsZWFyVGltZW91dCh2Ll90aW1lb3V0W2VdKSwgdi5fdGltZW91dFtlXSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0dGluZ3NEaWdlc3QgPSAwLCB2Ll9nZXRTZXR0aW5nc0RpZ2VzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuX3NldHRpbmdzRGlnZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdi52ZXJzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmF1ZGllbmNlTWFuYWdlclNlcnZlciAmJiAoZSArPSAnfCcgKyB2LmF1ZGllbmNlTWFuYWdlclNlcnZlciksIHYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlICYmIChlICs9ICd8JyArIHYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlKSwgdi5fc2V0dGluZ3NEaWdlc3QgPSB2Ll9oYXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fc2V0dGluZ3NEaWdlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9yZWFkVmlzaXRvckRvbmUgPSAhMSwgdi5fcmVhZFZpc2l0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2Ll9yZWFkVmlzaXRvckRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fcmVhZFZpc2l0b3JEb25lID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCBuLCByLCBpLCBhLCBvID0gdi5fZ2V0U2V0dGluZ3NEaWdlc3QoKSwgcyA9ICExLCBjID0gdi5jb29raWVSZWFkKHYuY29va2llTmFtZSksIHUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyB8fCB4IHx8IHYuZGlzY2FyZFRyYWNraW5nU2VydmVyRUNJRCB8fCAoYyA9IHYuY29va2llUmVhZCh0ZS5GSVJTVF9QQVJUWV9TRVJWRVJfQ09PS0lFKSksIG51bGwgPT0gdi5fZmllbGRzICYmICh2Ll9maWVsZHMgPSB7fSksIGMgJiYgJ1QnICE9PSBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgoYyA9IGMuc3BsaXQoJ3wnKSlbMF0ubWF0Y2goL15bXC0wLTldKyQvKSAmJiAocGFyc2VJbnQoY1swXSwgMTApICE9PSBvICYmIChzID0gITApLCBjLnNoaWZ0KCkpLCBjLmxlbmd0aCAlIDIgPT0gMSAmJiBjLnBvcCgpLCBlID0gMDsgZSA8IGMubGVuZ3RoOyBlICs9IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICh0ID0gY1tlXS5zcGxpdCgnLScpKVswXSwgciA9IGNbZSArIDFdLCAxIDwgdC5sZW5ndGggPyAoaSA9IHBhcnNlSW50KHRbMV0sIDEwKSwgYSA9IDAgPCB0WzFdLmluZGV4T2YoJ3MnKSkgOiAoaSA9IDAsIGEgPSAhMSksIHMgJiYgKCdNQ0NJREgnID09PSBuICYmIChyID0gJycpLCAwIDwgaSAmJiAoaSA9IHUuZ2V0VGltZSgpIC8gMTAwMCAtIDYwKSksIG4gJiYgciAmJiAodi5fc2V0RmllbGQobiwgciwgMSksIDAgPCBpICYmICh2Ll9maWVsZHNbJ2V4cGlyZScgKyBuXSA9IGkgKyAoYSA/ICdzJyA6ICcnKSwgKHUuZ2V0VGltZSgpID49IDEwMDAgKiBpIHx8IGEgJiYgIXYuY29va2llUmVhZCh2LnNlc3Npb25Db29raWVOYW1lKSkgJiYgKHYuX2ZpZWxkc0V4cGlyZWQgfHwgKHYuX2ZpZWxkc0V4cGlyZWQgPSB7fSksIHYuX2ZpZWxkc0V4cGlyZWRbbl0gPSAhMCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXYuX2dldEZpZWxkKFQpICYmIEYuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmIChjID0gdi5jb29raWVSZWFkKCdzX3ZpJykpICYmIDEgPCAoYyA9IGMuc3BsaXQoJ3wnKSkubGVuZ3RoICYmIDAgPD0gY1swXS5pbmRleE9mKCd2MScpICYmICgwIDw9IChlID0gKHIgPSBjWzFdKS5pbmRleE9mKCdbJykpICYmIChyID0gci5zdWJzdHJpbmcoMCwgZSkpLCByICYmIHIubWF0Y2godGUuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkgJiYgdi5fc2V0RmllbGQoVCwgcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2FwcGVuZFZlcnNpb25UbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAndlZlcnNpb258JyArIHYudmVyc2lvbiwgbiA9IGUgPyB2Ll9nZXRDb29raWVWZXJzaW9uKGUpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/ICQuYXJlVmVyc2lvbnNEaWZmZXJlbnQobiwgdi52ZXJzaW9uKSAmJiAoZSA9IGUucmVwbGFjZSh0ZS5WRVJTSU9OX1JFR0VYLCB0KSkgOiBlICs9IChlID8gJ3wnIDogJycpICsgdCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3dyaXRlVmlzaXRvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgbiA9IHYuX2dldFNldHRpbmdzRGlnZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlIGluIHYuX2ZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTChlKSAmJiB2Ll9maWVsZHNbZV0gJiYgJ2V4cGlyZScgIT09IGUuc3Vic3RyaW5nKDAsIDYpICYmICh0ID0gdi5fZmllbGRzW2VdLCBuICs9IChuID8gJ3wnIDogJycpICsgZSArICh2Ll9maWVsZHNbJ2V4cGlyZScgKyBlXSA/ICctJyArIHYuX2ZpZWxkc1snZXhwaXJlJyArIGVdIDogJycpICsgJ3wnICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHYuX2FwcGVuZFZlcnNpb25UbyhuKSwgdi5jb29raWVXcml0ZSh2LmNvb2tpZU5hbWUsIG4sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2V0RmllbGQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsID09IHYuX2ZpZWxkcyB8fCAhdCAmJiB2Ll9maWVsZHNFeHBpcmVkICYmIHYuX2ZpZWxkc0V4cGlyZWRbZV0gPyBudWxsIDogdi5fZmllbGRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0RmllbGQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gdi5fZmllbGRzICYmICh2Ll9maWVsZHMgPSB7fSksIHYuX2ZpZWxkc1tlXSA9IHQsIG4gfHwgdi5fd3JpdGVWaXNpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9nZXRGaWVsZExpc3QgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0RmllbGQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyBuLnNwbGl0KCcqJykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0RmllbGRMaXN0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9zZXRGaWVsZChlLCB0ID8gdC5qb2luKCcqJykgOiAnJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9nZXRGaWVsZE1hcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2Ll9nZXRGaWVsZExpc3QoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IG4ubGVuZ3RoOyByICs9IDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW25bcl1dID0gbltyICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldEZpZWxkTWFwID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociBpbiAoaSA9IFtdLCB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwocikgJiYgKGkucHVzaChyKSwgaS5wdXNoKHRbcl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9zZXRGaWVsZExpc3QoZSwgaSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRGaWVsZEV4cGlyZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0VGltZShyLmdldFRpbWUoKSArIDEwMDAgKiB0KSwgbnVsbCA9PSB2Ll9maWVsZHMgJiYgKHYuX2ZpZWxkcyA9IHt9KSwgdi5fZmllbGRzWydleHBpcmUnICsgZV0gPSBNYXRoLmZsb29yKHIuZ2V0VGltZSgpIC8gMTAwMCkgKyAobiA/ICdzJyA6ICcnKSwgdCA8IDAgPyAodi5fZmllbGRzRXhwaXJlZCB8fCAodi5fZmllbGRzRXhwaXJlZCA9IHt9KSwgdi5fZmllbGRzRXhwaXJlZFtlXSA9ICEwKSA6IHYuX2ZpZWxkc0V4cGlyZWQgJiYgKHYuX2ZpZWxkc0V4cGlyZWRbZV0gPSAhMSksIG4gJiYgKHYuY29va2llUmVhZCh2LnNlc3Npb25Db29raWVOYW1lKSB8fCB2LmNvb2tpZVdyaXRlKHYuc2Vzc2lvbkNvb2tpZU5hbWUsICcxJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZmluZFZpc2l0b3JJRCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKCdvYmplY3QnID09PSBxKGUpICYmIChlID0gZS5kX21pZCA/IGUuZF9taWQgOiBlLnZpc2l0b3JJRCA/IGUudmlzaXRvcklEIDogZS5pZCA/IGUuaWQgOiBlLnV1aWQgPyBlLnV1aWQgOiAnJyArIGUpLCBlICYmICdOT1RBUkdFVCcgPT09IChlID0gZS50b1VwcGVyQ2FzZSgpKSAmJiAoZSA9IGopLCBlICYmIChlID09PSBqIHx8IGUubWF0Y2godGUuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkpIHx8IChlID0gJycpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldEZpZWxkcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuX2NsZWFyVGltZW91dChlKSwgbnVsbCAhPSB2Ll9sb2FkaW5nICYmICh2Ll9sb2FkaW5nW2VdID0gITEpLCBVLmZpZWxkR3JvdXBPYmpbZV0gJiYgVS5zZXRTdGF0ZShlLCAhMSksIGUgPT09IHcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgIT09IFUuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgJiYgKFUuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0RmllbGQoRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiB8fCB2Lm92ZXJ3cml0ZUNyb3NzRG9tYWluTUNJREFuZEFJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobiA9ICdvYmplY3QnID09PSBxKHQpICYmIHQubWlkID8gdC5taWQgOiB2Ll9maW5kVmlzaXRvcklEKHQpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Ll91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyICYmICF2LnRyaWVkMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudHJpZWQxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyID0gITAsIHZvaWQgdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQobnVsbCwgITEsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdi5fZ2VuZXJhdGVMb2NhbE1JRCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fc2V0RmllbGQoRCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuICE9PSBqIHx8IChuID0gJycpLCAnb2JqZWN0JyA9PT0gcSh0KSAmJiAoKHQuZF9yZWdpb24gfHwgdC5kY3NfcmVnaW9uIHx8IHQuZF9ibG9iIHx8IHQuYmxvYikgJiYgdi5fc2V0RmllbGRzKFAsIHQpLCB2Ll91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyICYmIHQubWlkICYmIHYuX3NldEZpZWxkcyhTLCB7IGlkOiB0LmlkIH0pKSwgdi5fY2FsbEFsbENhbGxiYWNrcyhELCBbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gUCAmJiAnb2JqZWN0JyA9PT0gcSh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDYwNDgwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSB0LmlkX3N5bmNfdHRsICYmIHQuaWRfc3luY190dGwgJiYgKHIgPSBwYXJzZUludCh0LmlkX3N5bmNfdHRsLCAxMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE4uZ2V0UmVnaW9uQW5kQ2hlY2tJZkNoYW5nZWQodCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NhbGxBbGxDYWxsYmFja3MoJ01DQUFNTEgnLCBbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHYuX2dldEZpZWxkKE8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC5kX2Jsb2IgfHwgdC5ibG9iKSAmJiAoKGEgPSB0LmRfYmxvYikgfHwgKGEgPSB0LmJsb2IpLCB2Ll9zZXRGaWVsZEV4cGlyZShPLCByKSwgdi5fc2V0RmllbGQoTywgYSkpLCBhIHx8IChhID0gJycpLCB2Ll9jYWxsQWxsQ2FsbGJhY2tzKE8sIFthXSksICF0LmVycm9yX21zZyAmJiB2Ll9uZXdDdXN0b21lcklEc0hhc2ggJiYgdi5fc2V0RmllbGQoJ01DQ0lESCcsIHYuX25ld0N1c3RvbWVySURzSGFzaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSBTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdi5fZ2V0RmllbGQoVCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgIXYub3ZlcndyaXRlQ3Jvc3NEb21haW5NQ0lEQW5kQUlEIHx8ICgobyA9IHYuX2ZpbmRWaXNpdG9ySUQodCkpID8gbyAhPT0gaiAmJiB2Ll9zZXRGaWVsZEV4cGlyZShPLCAtMSkgOiBvID0gaiwgdi5fc2V0RmllbGQoVCwgbykpLCBvICYmIG8gIT09IGogfHwgKG8gPSAnJyksIHYuX2NhbGxBbGxDYWxsYmFja3MoVCwgW29dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuaWRTeW5jRGlzYWJsZVN5bmNzIHx8IHYuZGlzYWJsZUlkU3luY3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4uaWRDYWxsTm90UHJvY2Vzc3NlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOLmlkQ2FsbE5vdFByb2Nlc3NzZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pYnMgPSB0Lmlicywgcy5zdWJkb21haW4gPSB0LnN1YmRvbWFpbiwgTi5wcm9jZXNzSURDYWxsRGF0YShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT09IE9iamVjdCh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCgpICYmIHYuaXNBbGxvd2VkKCkgJiYgKGMgPSB2Ll9nZXRGaWVsZCgnTUNPUFRPVVQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gVy5wYXJzZU9wdE91dCh0LCBjLCBqKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGwub3B0T3V0LCB1ID0gbC5kX290dGwsIHYuX3NldEZpZWxkRXhwaXJlKCdNQ09QVE9VVCcsIHUsICEwKSwgdi5fc2V0RmllbGQoJ01DT1BUT1VUJywgYyksIHYuX2NhbGxBbGxDYWxsYmFja3MoJ01DT1BUT1VUJywgW2NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9sb2FkaW5nID0gbnVsbCwgdi5fZ2V0UmVtb3RlRmllbGQgPSBmdW5jdGlvbiAobiwgZSwgdCwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvID0gJycsIHMgPSBGLmlzRmlyc3RQYXJ0eUFuYWx5dGljc1Zpc2l0b3JJRENhbGwobiksIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCgpICYmIHYuaXNBbGxvd2VkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Ll9yZWFkVmlzaXRvcigpLCAhKCEobyA9IHYuX2dldEZpZWxkKG4sICEwID09PSBjW25dKSkgfHwgdi5fZmllbGRzRXhwaXJlZCAmJiB2Ll9maWVsZHNFeHBpcmVkW25dKSB8fCB2LmRpc2FibGVUaGlyZFBhcnR5Q2FsbHMgJiYgIXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIHx8IChuID09PSBEID8gKHYuX3JlZ2lzdGVyQ2FsbGJhY2sobiwgdCksIG8gPSB2Ll9nZW5lcmF0ZUxvY2FsTUlEKCksIHYuc2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQobykpIDogbiA9PT0gVCA/ICh2Ll9yZWdpc3RlckNhbGxiYWNrKG4sIHQpLCBvID0gJycsIHYuc2V0QW5hbHl0aWNzVmlzaXRvcklEKG8pKSA6IHIgPSAhKG8gPSAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuID09PSBEIHx8ICdNQ09QVE9VVCcgPT09IG4gPyBhID0gdyA6ICdNQ0FBTUxIJyA9PT0gbiB8fCBuID09PSBPID8gYSA9IFAgOiBuID09PSBUICYmIChhID0gUyksIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgbnVsbCAhPSB2Ll9sb2FkaW5nICYmIHYuX2xvYWRpbmdbYV0gfHwgKG51bGwgPT0gdi5fbG9hZGluZyAmJiAodi5fbG9hZGluZyA9IHt9KSwgdi5fbG9hZGluZ1thXSA9ICEwLCBhID09PSBQICYmIChfID0gMCksIHYuX2xvYWREYXRhKGEsIGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2Ll9nZXRGaWVsZChuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIFUuc2V0U3RhdGUoYSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID09PSBEID8gdCA9IHYuX2dlbmVyYXRlTG9jYWxNSUQoKSA6IGEgPT09IFAgJiYgKHQgPSB7IGVycm9yX21zZzogJ3RpbWVvdXQnIH0pLCB2Ll9zZXRGaWVsZHMoYSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSkpLCB2Ll9yZWdpc3RlckNhbGxiYWNrKG4sIHQpLCBvIHx8IChlIHx8IHYuX3NldEZpZWxkcyhhLCB7IGlkOiBqIH0pLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gIT09IEQgJiYgbiAhPT0gVCB8fCBvICE9PSBqIHx8IChyID0gIShvID0gJycpKSwgdCAmJiByICYmIHYuX2NhbGxDYWxsYmFjayh0LCBbb10pLCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3JlYWRWaXNpdG9yKCksIHYuX3NldEZpZWxkcyh3LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX21hcEN1c3RvbWVySURzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldEF1ZGllbmNlTWFuYWdlckJsb2IoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0QW5hbHl0aWNzRmllbGRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9yZWFkVmlzaXRvcigpLCB2Ll9zZXRGaWVsZHMoUywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRBdWRpZW5jZU1hbmFnZXJGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3JlYWRWaXNpdG9yKCksIHYuX3NldEZpZWxkcyhQLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIsIG4gPSAnJywgciA9IHYuX2dldEZpZWxkKEQpLCBpID0gdi5fZ2V0RmllbGQoTywgITApLCBhID0gdi5fZ2V0RmllbGQoVCksIG8gPSBhICYmIGEgIT09IGogPyAnJmRfY2lkX2ljPUFWSUQlMDEnICsgZW5jb2RlVVJJQ29tcG9uZW50KGEpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYubG9hZFNTTCAmJiB2LmF1ZGllbmNlTWFuYWdlclNlcnZlclNlY3VyZSAmJiAodCA9IHYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlKSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgYywgdSwgbCA9IHYuZ2V0Q3VzdG9tZXJJRHMoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyBpbiBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBsW2NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVy5pc09iamVjdEVtcHR5KGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gJ25hbWVTcGFjZXMnID09PSBjID8gJyZkX2NpZF9ucz0nIDogJyZkX2NpZF9pYz0nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgaW4gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwocykgJiYgKHUgPSBkW3NdLCBvICs9IGYgKyBlbmNvZGVVUklDb21wb25lbnQocykgKyAnJTAxJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkID8gdS5pZCA6ICcnKSArICh1LmF1dGhTdGF0ZSA/ICclMDEnICsgdS5hdXRoU3RhdGUgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSB8fCAoZSA9ICdfc2V0QXVkaWVuY2VNYW5hZ2VyRmllbGRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gJ2h0dHAnICsgKHYubG9hZFNTTCA/ICdzJyA6ICcnKSArICc6Ly8nICsgdCArICcvaWQnLCBnID0gJ2RfdmlzaWRfdmVyPScgKyB2LnZlcnNpb24gKyAoeSAmJiAtMSAhPT0gcC5pbmRleE9mKCdkZW1kZXgubmV0JykgPyAnJmdkcHI9MSZnZHByX2NvbnNlbnQ9JyArIHkgOiAnJykgKyAoXyAmJiAtMSAhPT0gcC5pbmRleE9mKCdkZW1kZXgubmV0JykgPyAnJmRfY2Y9JyArIF8gOiAnJykgKyAnJmRfcnRiZD1qc29uJmRfdmVyPTInICsgKCFyICYmIHYuX3VzZTFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIgPyAnJmRfdmVyaWZ5PTEnIDogJycpICsgJyZkX29yZ2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQodi5tYXJrZXRpbmdDbG91ZE9yZ0lEKSArICcmZF9uc2lkPScgKyAodi5pZFN5bmNDb250YWluZXJJRCB8fCAwKSArIChyID8gJyZkX21pZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHIpIDogJycpICsgKHYuaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZyB8fCB2LmRpc2FibGVUaGlyZFBhcnR5Q29va2llcyA/ICcmZF9jb3BwYT10cnVlJyA6ICcnKSArICghMCA9PT0gSSA/ICcmZF9jb29wX3NhZmU9MScgOiAhMSA9PT0gSSA/ICcmZF9jb29wX3Vuc2FmZT0xJyA6ICcnKSArIChpID8gJyZkX2Jsb2I9JyArIGVuY29kZVVSSUNvbXBvbmVudChpKSA6ICcnKSArIG8sIG0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NfY19pbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5faW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiA9IHAgKyAnPycgKyBnICsgJyZkX2NiPXNfY19pbCU1QicgKyB2Ll9pbiArICclNUQuJyArIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzVXJsOiBwICsgJz8nICsgZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHVybDogbiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5hcHBlbmRWaXNpdG9ySURzVG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fZ2V0RmllbGQoRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9nZXRGaWVsZChUKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUNPUkdJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5tYXJrZXRpbmdDbG91ZE9yZ0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9hZGRRdWVyeXN0cmluZ1BhcmFtKGUsIHRlLkFET0JFX01DLCBvKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuYXBwZW5kU3VwcGxlbWVudGFsRGF0YUlEVG8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSB0IHx8IHYuZ2V0U3VwcGxlbWVudGFsRGF0YUlEKEYuZ2VuZXJhdGVSYW5kb21TdHJpbmcoKSwgITApKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0RJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUNPUkdJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5tYXJrZXRpbmdDbG91ZE9yZ0lECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fYWRkUXVlcnlzdHJpbmdQYXJhbShlLCB0ZS5BRE9CRV9NQ19TRElELCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUhhc2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pbmRleE9mKCcjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgdCA/IGUuc3Vic3RyKHQpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNobGVzc1VybDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmluZGV4T2YoJyMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCB0ID8gZS5zdWJzdHIoMCwgdCkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkUXVlcnlQYXJhbUF0TG9jYXRpb246IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5zcGxpdCgnJicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IG51bGwgIT0gbiA/IG4gOiByLmxlbmd0aCwgci5zcGxpY2UobiwgMCwgdCksIHIuam9pbignJicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGaXJzdFBhcnR5QW5hbHl0aWNzVmlzaXRvcklEQ2FsbDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IFQgJiYgKHQgfHwgKHQgPSB2LnRyYWNraW5nU2VydmVyKSwgbiB8fCAobiA9IHYudHJhY2tpbmdTZXJ2ZXJTZWN1cmUpLCAhKCdzdHJpbmcnICE9IHR5cGVvZiAociA9IHYubG9hZFNTTCA/IG4gOiB0KSB8fCAhci5sZW5ndGgpICYmIHIuaW5kZXhPZignMm83Lm5ldCcpIDwgMCAmJiByLmluZGV4T2YoJ29tdHJkYy5uZXQnKSA8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihlICYmIGUgPT09IE9iamVjdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb29raWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsucmVtb3ZlKGUsIHsgZG9tYWluOiB2LmNvb2tpZURvbWFpbiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdi50cmFja2luZ1NlcnZlciB8fCAhIXYudHJhY2tpbmdTZXJ2ZXJTZWN1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lc3RhbXBJblNlY29uZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGlwZURlbGltZXRlZEtleVZhbHVlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3BsaXQoJ3wnKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbblswXV0gPSBkZWNvZGVVUklDb21wb25lbnQoblsxXSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmFuZG9tU3RyaW5nOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCA1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gJycsIG4gPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JzsgZS0tOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gbltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBuLmxlbmd0aCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUJvb2xlYW46IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IGUgfHwgJ2ZhbHNlJyAhPT0gZSAmJiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VCb29sZWFuOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RydWUnID09PSBlIHx8ICdmYWxzZScgIT09IGUgJiYgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VNZXRob2RzV2l0aEZ1bmN0aW9uOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KG4pICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGVbbl0gJiYgKGVbbl0gPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2hlbHBlcnMgPSBGOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE4gPSBuZSh2LCBFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2Rlc3RpbmF0aW9uUHVibGlzaGluZyA9IE4sIHYudGltZW91dE1ldHJpY3NMb2cgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCLCBVID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJRENhbGxUaW1lZE91dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHl0aWNzSURDYWxsVGltZWRPdXQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTUlEQ2FsbFRpbWVkT3V0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEdyb3VwT2JqOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdCA/ICEwICE9PSB0aGlzLk1DSURDYWxsVGltZWRPdXQgJiYgKHRoaXMuTUNJRENhbGxUaW1lZE91dCA9ICExKSA6IHRoaXMuTUNJRENhbGxUaW1lZE91dCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITEgPT09IHQgPyAhMCAhPT0gdGhpcy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCAmJiAodGhpcy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCA9ICExKSA6IHRoaXMuQW5hbHl0aWNzSURDYWxsVGltZWRPdXQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICExID09PSB0ID8gITAgIT09IHRoaXMuQUFNSURDYWxsVGltZWRPdXQgJiYgKHRoaXMuQUFNSURDYWxsVGltZWRPdXQgPSAhMSkgOiB0aGlzLkFBTUlEQ2FsbFRpbWVkT3V0ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVLmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5NQ0lEQ2FsbFRpbWVkT3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVLk1DSURDYWxsVGltZWRPdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5BQU1JRENhbGxUaW1lZE91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVS5BQU1JRENhbGxUaW1lZE91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuaWRTeW5jR2V0T25QYWdlU3luY0luZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX3JlYWRWaXNpdG9yKCksIHYuX2dldEZpZWxkKCdNQ1NZTkNTT1AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuaWRTeW5jQnlVUkwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pc09wdGVkT3V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzKGUgfHwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5lcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaSA9IGUudXJsLCBhID0gZW5jb2RlVVJJQ29tcG9uZW50LCBvID0gTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSBpLnJlcGxhY2UoL15odHRwczovLCAnJykucmVwbGFjZSgvXmh0dHA6LywgJycpLCBuID0gVy5lbmNvZGVBbmRCdWlsZFJlcXVlc3QoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRwdXVpZCB8fCAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCAnLCcpLCByID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2licycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKGUuZHBpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR0bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBvLmFkZE1lc3NhZ2Uoci5qb2luKCd8JykpLCBvLnJlcXVlc3RUb1Byb2Nlc3MoKSwgJ1N1Y2Nlc3NmdWxseSBxdWV1ZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuaWRTeW5jQnlEYXRhU291cmNlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuaXNPcHRlZE91dCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gT2JqZWN0KGUpICYmICdzdHJpbmcnID09IHR5cGVvZiBlLmRwdXVpZCAmJiBlLmRwdXVpZC5sZW5ndGggPyAoZS51cmwgPSAnLy9kcG0uZGVtZGV4Lm5ldC9pYnM6ZHBpZD0nICsgZS5kcGlkICsgJyZkcHV1aWQ9JyArIGUuZHB1dWlkLCB2LmlkU3luY0J5VVJMKGUpKSA6ICdFcnJvcjogY29uZmlnIG9yIGNvbmZpZy5kcHV1aWQgaXMgZW1wdHknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVmUodiwgTiksIHYuX2dldENvb2tpZVZlcnNpb24gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IHYuY29va2llUmVhZCh2LmNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGUuVkVSU0lPTl9SRUdFWC5leGVjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIDEgPCB0Lmxlbmd0aCA/IHRbMV0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fcmVzZXRBbWN2Q29va2llID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHYuX2dldENvb2tpZVZlcnNpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICEkLmlzTGVzc1RoYW4odCwgZSkgfHwgRi5yZW1vdmVDb29raWUodi5jb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuc2V0QXNDb29wU2FmZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LnNldEFzQ29vcFVuc2FmZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuY29uZmlncyA9IE9iamVjdC5jcmVhdGUobnVsbCksIEYuaXNPYmplY3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwoZSkgJiYgKHZbZV0gPSBuW2VdLCB2LmNvbmZpZ3NbZV0gPSBuW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgdSgpLCB2LmluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygpICYmIChiLm9wdEluLmZldGNoUGVybWlzc2lvbnMobSwgITApLCAhYi5vcHRJbi5pc0FwcHJvdmVkKGIub3B0SW4uQ2F0ZWdvcmllcy5FQ0lEKSkgfHwgQiB8fCAoQiA9ICEwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGLmlzT2JqZWN0KG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmlkU3luY0NvbnRhaW5lcklEID0gdi5pZFN5bmNDb250YWluZXJJRCB8fCAwLCBJID0gJ2Jvb2xlYW4nID09IHR5cGVvZiB2LmlzQ29vcFNhZmUgPyB2LmlzQ29vcFNhZmUgOiBGLnBhcnNlQm9vbGVhbih2LmlzQ29vcFNhZmUpLCB2LnJlc2V0QmVmb3JlVmVyc2lvbiAmJiB2Ll9yZXNldEFtY3ZDb29raWUodi5yZXNldEJlZm9yZVZlcnNpb24pLCB2Ll9hdHRlbXB0VG9Qb3B1bGF0ZUlkc0Zyb21VcmwoKSwgdi5fYXR0ZW1wdFRvUG9wdWxhdGVTZGlkRnJvbVVybCgpLCB2Ll9yZWFkVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB2Ll9nZXRGaWVsZChBKSwgdCA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIHRlLk1JTExJU19QRVJfREFZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuaWRTeW5jRGlzYWJsZVN5bmNzIHx8IHYuZGlzYWJsZUlkU3luY3MgfHwgIU4uY2FuTWFrZVN5bmNJRENhbGwoZSwgdCkgfHwgKHYuX3NldEZpZWxkRXhwaXJlKE8sIC0xKSwgdi5fc2V0RmllbGQoQSwgdCkpLCB2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCksIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KCksIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYigpLCB2Ll9tZXJnZVNlcnZlclN0YXRlKHYuc2VydmVyU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybCgpLCB2Ll9hdHRlbXB0VG9Qb3B1bGF0ZVNkaWRGcm9tVXJsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pZFN5bmNEaXNhYmxlU3luY3MgJiYgIXYuZGlzYWJsZUlkU3luY3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4uY2hlY2tEUElmcmFtZVNyYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVhZHlUb0F0dGFjaElmcmFtZSgpICYmIGUuYXR0YWNoSWZyYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUud2luZG93TG9hZGVkID0gITAsIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLnJlY2VpdmVNZXNzYWdlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ucmVjZWl2ZU1lc3NhZ2UoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBOLmlmcmFtZUhvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB2LndoaXRlbGlzdElmcmFtZURvbWFpbnMgJiYgdGUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgJiYgKHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucyA9IHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucyBpbnN0YW5jZW9mIEFycmF5ID8gdi53aGl0ZWxpc3RJZnJhbWVEb21haW5zIDogW3Yud2hpdGVsaXN0SWZyYW1lRG9tYWluc10sIHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEcociwgZSksIG4gPSBZKHYsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLnJlY2VpdmVNZXNzYWdlKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVZS5jb25maWcgPSBCOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcWUgPSB6LlZpc2l0b3IgPSBVZSwgemUgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXLmlzT2JqZWN0KGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycgIT09IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBCLm5vcm1hbGl6ZUNvbmZpZyhpW3RdKSwgciA9IFcubm9ybWFsaXplQm9vbGVhbihuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdID0gciwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBIZSA9IE1lLk9wdEluLCBXZSA9IE1lLklhYlBsdWdpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWUuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbiAociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmlzaXRvciByZXF1aXJlcyBBZG9iZSBNYXJrZXRpbmcgQ2xvdWQgT3JnIElELicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmRleE9mKCdAJykgPCAwICYmIChyICs9ICdAQWRvYmVPcmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gei5zX2NfaWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgJ1Zpc2l0b3InID09PSBuLl9jICYmIG4ubWFya2V0aW5nQ2xvdWRPcmdJRCA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgbiA9IHplKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG4gfHwge30sIHouYWRvYmUub3B0SW4gPSB6LmFkb2JlLm9wdEluIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFcucGx1Y2soaSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvZXNPcHRJbkFwcGx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmV2aW91c1Blcm1pc3Npb25zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVPcHRJbkFwcHJvdmFscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNPcHRJblN0b3JhZ2VFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRJblN0b3JhZ2VFeHBpcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzSWFiQ29udGV4dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHQgPSBpLm9wdEluQ29va2llRG9tYWluIHx8IGkuY29va2llRG9tYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA9IHQgfHwgUSgpKSA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID8gJycgOiB0LCBlLm9wdEluQ29va2llRG9tYWluID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBIZShlLCB7IGNvb2tpZXM6IEsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaXNJYWJDb250ZXh0ICYmIGUuZG9lc09wdEluQXBwbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgV2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5yZWdpc3RlclBsdWdpbihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHIuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSwgbyA9IG5ldyBxZShyLCBudWxsLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcuaXNPYmplY3QobikgJiYgbi5jb29raWVEb21haW4gJiYgKG8uY29va2llRG9tYWluID0gbi5jb29raWVEb21haW4pLCB6LnNfY19pbC5zcGxpY2UoLS16LnNfY19pbiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IFcuZ2V0SWVWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgPT0gdHlwZW9mIHMgJiYgcyA8IDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLl9oZWxwZXJzLnJlcGxhY2VNZXRob2RzV2l0aEZ1bmN0aW9uKG8sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCB1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHouc2VsZiAhPT0gei5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSAmJiAoKGMgPSBvKS5jb29raWVXcml0ZSgnVEVTVF9BTUNWX0NPT0tJRScsICdUJywgMSksICdUJyAhPT0gYy5jb29raWVSZWFkKCdURVNUX0FNQ1ZfQ09PS0lFJykgfHwgKGMuX2hlbHBlcnMucmVtb3ZlQ29va2llKCdURVNUX0FNQ1ZfQ09PS0lFJyksIDApKSAmJiB6LnBhcmVudCA/IG5ldyBPKHIsIG4sIG8sIHoucGFyZW50KSA6IG5ldyBxZShyLCBuLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gbnVsbCwgdS5pbml0KCksIHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWUud2luZG93TG9hZGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LmFkZEV2ZW50TGlzdGVuZXIgPyB6LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBlKSA6IHouYXR0YWNoRXZlbnQgJiYgei5hdHRhY2hFdmVudCgnb25sb2FkJywgZSksIHFlLmNvZGVMb2FkRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIFZpc2l0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtbWNpZC9zcmMvdmlldy91dGlscy90aW1lVW5pdHMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvdXJzOiAzNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXlzOiA4NjQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vla3M6IDYwNDgwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9udGhzOiAyNTkyMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyczogMzE1MzYwMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ0lkOiAnJW1jb3JnSUQlJywKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2xvYWRUaW1lb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJzcwMDAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0cmFja2luZ1NlcnZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdtZXRyaWNzLmZlZGV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3RyYWNraW5nU2VydmVyU2VjdXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ3NtZXRyaWNzLmZlZGV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21hcmtldGluZ0Nsb3VkU2VydmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ21ldHJpY3MuZmVkZXguY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnc21ldHJpY3MuZmVkZXguY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGlzYWJsZUlkU3luY3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWFhbTpJZFN5bmNEaXNhYmxlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2lkU3luY0NvbnRhaW5lcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVhYW06UmVnaW9uQ29udGFpbmVyTlNJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQNjQzN2ZhNzhhYjAyNDk0NmEyMTEzOTc2ODkwNTIzODEvJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3MnOiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdBZG9iZSBBbmFseXRpY3MnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NldC12YXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTZXQgVmFyaWFibGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuKCcuLi9zaGFyZWRNb2R1bGVzL2dldFRyYWNrZXInKSwgYSA9IG4oJy4uL2hlbHBlcnMvYXBwbHlUcmFja2VyVmFyaWFibGVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvZ2dlci5pbmZvKCdTZXQgdmFyaWFibGVzIG9uIHRoZSB0cmFja2VyLicpLCBhKGUsIHQudHJhY2tlclByb3BlcnRpZXMpLCB0LmN1c3RvbVNldHVwICYmIHQuY3VzdG9tU2V0dXAuc291cmNlICYmIHQuY3VzdG9tU2V0dXAuc291cmNlLmNhbGwobi5lbGVtZW50LCBuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubG9nZ2VyLmVycm9yKCdDYW5ub3Qgc2V0IHZhcmlhYmxlczogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlbmQtYmVhY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnU2VuZCBCZWFjb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4uL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlcicpLCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUubm9kZU5hbWUgJiYgJ2EnID09PSBlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSkgPyBlLmlubmVySFRNTCA6ICdsaW5rIGNsaWNrZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncGFnZScgPT09IHQudHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ2dlci5pbmZvKCdGaXJpbmcgcGFnZSB2aWV3IGJlYWNvbi4nKSwgZS50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6IHQubGlua1R5cGUgfHwgJ28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogdC5saW5rTmFtZSB8fCBvKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ2dlci5pbmZvKCdGaXJpbmcgbGluayB0cmFjayBiZWFjb24gdXNpbmcgdGhlIHZhbHVlczogJyArIEpTT04uc3RyaW5naWZ5KHIpICsgJy4nKSwgZS50bChhKG4pID8gbiA6ICd0cnVlJywgci5saW5rVHlwZSwgci5saW5rTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGUsIHQsIG4uZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZ2dlci5lcnJvcignQ2Fubm90IHNlbmQgYmVhY29uOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NsZWFyLXZhcmlhYmxlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0NsZWFyIFZhcmlhYmxlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbignLi4vc2hhcmVkTW9kdWxlcy9nZXRUcmFja2VyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSgpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2xlYXJWYXJzICYmIChyLmxvZ2dlci5pbmZvKCdDbGVhciB2YXJpYWJsZXMuJyksIGUuY2xlYXJWYXJzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBjbGVhciB2YXJpYWJsZXM6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGEgPSBuKCdAYWRvYmUvcmVhY3Rvci1jb29raWUnKSwgbyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgcyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCBjID0gbignLi4vaGVscGVycy9zZXR0aW5nc0hlbHBlcicpLCB1ID0gbignLi4vaGVscGVycy9hdWdtZW50ZXJzJyksIGwgPSBuKCcuLi9oZWxwZXJzL2FwcGx5VHJhY2tlclZhcmlhYmxlcycpLCBkID0gbignLi4vaGVscGVycy9sb2FkTGlicmFyeScpLCBmID0gbignLi4vaGVscGVycy9nZW5lcmF0ZVZlcnNpb24nKShyLmJ1aWxkSW5mby50dXJiaW5lQnVpbGREYXRlKSwgcCA9ICdiZWZvcmVTZXR0aW5ncycsIGcgPSByLmdldFNoYXJlZE1vZHVsZSgnYWRvYmUtbWNpZCcsICdtY2lkLWluc3RhbmNlJyksIG0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlIHx8ICd0cnVlJyA9PT0gYS5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGggPSBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uYWxsKHUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5yZXNvbHZlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcgJiYgKHIubG9nZ2VyLmluZm8oJ1NldHRpbmcgTUNJRCBpbnN0YW5jZSBvbiB0aGUgdHJhY2tlci4nKSwgZS52aXNpdG9yID0gZyksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9nZ2VyLmluZm8oJ1NldHRpbmcgdmVyc2lvbiBvbiB0cmFja2VyOiAiJyArIGYgKyAnIi4nKSwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUudGFnQ29udGFpbmVyTWFya2VyID8gZS50YWdDb250YWluZXJNYXJrZXIgPSBmIDogJ3N0cmluZycgPT0gdHlwZW9mIGUudmVyc2lvbiAmJiBlLnZlcnNpb24uc3Vic3RyaW5nKGUudmVyc2lvbi5sZW5ndGggLSA1KSAhPT0gJy0nICsgZiAmJiAoZS52ZXJzaW9uICs9ICctJyArIGYpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB5ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxvYWRQaGFzZSA9PT0gcCAmJiB0LnNvdXJjZSAmJiAoci5sb2dnZXIuaW5mbygnQ2FsbGluZyBjdXN0b20gc2NyaXB0IGJlZm9yZSBzZXR0aW5ncy4nKSwgdC5zb3VyY2UuY2FsbChzLCBuKSksIGwobiwgZSB8fCB7fSksIHQubG9hZFBoYXNlICE9PSBwICYmIHQuc291cmNlICYmIChyLmxvZ2dlci5pbmZvKCdDYWxsaW5nIGN1c3RvbSBzY3JpcHQgYWZ0ZXIgc2V0dGluZ3MuJyksIHQuc291cmNlLmNhbGwocywgbikpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBfID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmlzQXVkaWVuY2VNYW5hZ2VtZW50RW5hYmxlZChlKSAmJiAodC5sb2FkTW9kdWxlKCdBdWRpZW5jZU1hbmFnZW1lbnQnKSwgci5sb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIEF1ZGllbmNlTWFuYWdlbWVudCBtb2R1bGUnKSwgdC5BdWRpZW5jZU1hbmFnZW1lbnQuc2V0dXAoZS5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQyA9IChpID0gci5nZXRFeHRlbnNpb25TZXR0aW5ncygpLCBtKGkudHJhY2tpbmdDb29raWVOYW1lKSA/IGQoaSkudGhlbihoKS50aGVuKHYpLnRoZW4oYikudGhlbih5LmJpbmQobnVsbCwgaS50cmFja2VyUHJvcGVydGllcywgaS5jdXN0b21TZXR1cCB8fCB7fSkpLnRoZW4oXy5iaW5kKG51bGwsIGkpKSA6IG8ucmVqZWN0KCdFVSBjb21wbGlhbmNlIHdhcyBub3QgYWNrbm93bGVkZ2VkIGJ5IHRoZSB1c2VyLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dldC10cmFja2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL3NoYXJlZE1vZHVsZXMvYXVnbWVudFRyYWNrZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYXVnbWVudC10cmFja2VyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbignLi4vaGVscGVycy9hdWdtZW50ZXJzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2FwcGx5VHJhY2tlclZhcmlhYmxlcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuKCdAYWRvYmUvcmVhY3Rvci1xdWVyeS1zdHJpbmcnKSwgYSA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCBzID0gL2VWYXIoWzAtOV0rKS8sIGMgPSAvcHJvcChbMC05XSspLywgdSA9IG5ldyBSZWdFeHAoJ14oZVZhclswLTldKyl8KHByb3BbMC05XSspfChoaWVyWzAtOV0rKXxjYW1wYWlnbnxwdXJjaGFzZUlEfGNoYW5uZWx8c2VydmVyfHN0YXRlfHppcHxwYWdlVHlwZSQnKSwgbCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5pbmRleE9mKGUpID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LmtleXModCkuZmlsdGVyKHUudGVzdC5iaW5kKHUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIHIucHVzaCgnZXZlbnRzJyksIChyID0gci5jb25jYXQoKGUubGlua1RyYWNrVmFycyB8fCAnJykuc3BsaXQoJywnKSkpLmZpbHRlcihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTm9uZScgIT09IGUgJiYgZSAmJiBsKGUsIHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSBuLmNvbmNhdCgoZS5saW5rVHJhY2tFdmVudHMgfHwgJycpLnNwbGl0KCcsJykpKS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vbmUnICE9PSBlICYmIGwoZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSA9IG5bdF0uam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwID0gZnVuY3Rpb24gKGksIGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdC5keW5hbWljVmFyaWFibGVQcmVmaXggfHwgJ0Q9JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndmFsdWUnID09PSBlLnR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMuZXhlYyhlLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gYSArICd2JyArIG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBjLmV4ZWMoZS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmICh0ID0gYSArICdjJyArIHJbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZS5uYW1lXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtEb3dubG9hZEZpbGVUeXBlczogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFeHRlcm5hbEZpbHRlcnM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rSW50ZXJuYWxGaWx0ZXJzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2hpZXM6IGZ1bmN0aW9uICh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltlXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZS5uYW1lXSA9IGUuc2VjdGlvbnMuam9pbihlLmRlbGltaXRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbXBhaWduOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgncXVlcnlQYXJhbScgPT09IG5bdF0udHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkucGFyc2UoYS5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdID0gcltuW3RdLnZhbHVlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSA9IG5bdF0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gblt0XS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlkICYmICh0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCc6JykpLCBlLnZhbHVlICYmICh0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCc9JykpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gPSByLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gciB8fCB7fSwgT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBnW2VdLCBuID0gcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPyB0KGksIGUsIHIpIDogaVtlXSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmV2ZW50cyAmJiB0LmV2ZW50cyAmJiAwIDwgdC5ldmVudHMubGVuZ3RoICYmIChpLmV2ZW50cyA9IHQuZXZlbnRzICsgJywnICsgaS5ldmVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIgJiYgci5ldmVudHMgJiYgMCA8IHIuZXZlbnRzLmxlbmd0aCwgbiA9IGQodCwgaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKGkubGlua1RyYWNrVmFycyA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGYodCwgci5ldmVudHMgfHwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChpLmxpbmtUcmFja0V2ZW50cyA9IGEpLCBvLmxvZ2dlci5pbmZvKCdBcHBseWluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb24gdHJhY2tlcjogIicgKyBKU09OLnN0cmluZ2lmeShpKSArICciLicpLCBPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvc2V0dGluZ3NIZWxwZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJfVFlQRVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQU5BR0VEOiAnbWFuYWdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFSU5TVEFMTEVEOiAncHJlaW5zdGFsbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1PVEU6ICdyZW1vdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTTogJ2N1c3RvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQU5BR0VEX0xJQl9QQVRIUzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUF9NRUFTVVJFTUVOVDogJ0FwcE1lYXN1cmVtZW50LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVklUWV9NQVA6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQWN0aXZpdHlNYXAuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElFTkNFX01BTkFHRU1FTlQ6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQXVkaWVuY2VNYW5hZ2VtZW50LmpzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcG9ydFN1aXRlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucHJvZHVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyLmJ1aWxkSW5mby5lbnZpcm9ubWVudF0gJiYgKHQgPSBlW3IuYnVpbGRJbmZvLmVudmlyb25tZW50XSksIHQuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZpdHlNYXBFbmFibGVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGUubGlicmFyeUNvZGUgJiYgIWUubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXAgJiYgITEgPT09IGUubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXVkaWVuY2VNYW5hZ2VtZW50RW5hYmxlZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUubW9kdWxlUHJvcGVydGllcyAmJiBlLm1vZHVsZVByb3BlcnRpZXMuYXVkaWVuY2VNYW5hZ2VyICYmIGUubW9kdWxlUHJvcGVydGllcy5hdWRpZW5jZU1hbmFnZXIuY29uZmlnICYmIGkgJiYgaS5fc2F0ZWxsaXRlICYmIGkuX3NhdGVsbGl0ZS5jb21wYW55ICYmIGkuX3NhdGVsbGl0ZS5jb21wYW55Lm9yZ0lkICYmICh0ID0gITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2F1Z21lbnRlcnMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvaGVscGVycy9sb2FkTGlicmFyeS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuKCdAYWRvYmUvcmVhY3Rvci1sb2FkLXNjcmlwdCcpLCBhID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIG8gPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIHMgPSBuKCcuL3NldHRpbmdzSGVscGVyJyksIGMgPSBuKCcuL3BvbGxIZWxwZXInKSwgdSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuc19naSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjcmVhdGUgQXBwTWVhc3VyZW1lbnQgdHJhY2tlciwgYHNfZ2lgIGZ1bmN0aW9uIG5vdCBmb3VuZC4nICsgYS5BcHBNZWFzdXJlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvZ2dlci5pbmZvKCdDcmVhdGluZyBBcHBNZWFzdXJlbWVudCB0cmFja2VyIHdpdGggdGhlc2UgcmVwb3J0IHN1aXRlczogIicgKyB0ICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYS5zX2dpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubGlicmFyeUNvZGUuc2NvcGVUcmFja2VyR2xvYmFsbHkgJiYgKHIubG9nZ2VyLmluZm8oJ1NldHRpbmcgdGhlIHRyYWNrZXIgYXMgd2luZG93LnMnKSwgYS5zID0gbiksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5saWJyYXJ5Q29kZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuTElCX1RZUEVTLk1BTkFHRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKHIuZ2V0SG9zdGVkTGliRmlsZVVybChzLk1BTkFHRURfTElCX1BBVEhTLkFQUF9NRUFTVVJFTUVOVCkpLCBzLmlzQWN0aXZpdHlNYXBFbmFibGVkKGUpICYmIHQucHVzaChyLmdldEhvc3RlZExpYkZpbGVVcmwocy5NQU5BR0VEX0xJQl9QQVRIUy5BQ1RJVklUWV9NQVApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugcy5MSUJfVFlQRVMuQ1VTVE9NOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChlLmxpYnJhcnlDb2RlLnNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuTElCX1RZUEVTLlJFTU9URToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goJ2h0dHBzOicgPT09IGEubG9jYXRpb24ucHJvdG9jb2wgPyBlLmxpYnJhcnlDb2RlLmh0dHBzVXJsIDogZS5saWJyYXJ5Q29kZS5odHRwVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmlzQXVkaWVuY2VNYW5hZ2VtZW50RW5hYmxlZChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geyBuYW1lc3BhY2U6IGEuX3NhdGVsbGl0ZS5jb21wYW55Lm9yZ0lkIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcudmlzaXRvclNlcnZpY2UgPSBuLCB0LnB1c2goci5nZXRIb3N0ZWRMaWJGaWxlVXJsKHMuTUFOQUdFRF9MSUJfUEFUSFMuQVVESUVOQ0VfTUFOQUdFTUVOVCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uYWxsKGwoZSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9nZ2VyLmluZm8oJ0xvYWRpbmcgc2NyaXB0OiAnICsgZSksIGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGYgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubGlicmFyeUNvZGUuYWNjb3VudHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzLmdldFJlcG9ydFN1aXRlcyhlLmxpYnJhcnlDb2RlLmFjY291bnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sb2dnZXIuaW5mbygnU2V0dGluZyB0aGUgZm9sbG93aW5nIHJlcG9ydCBzdWl0ZXMgb24gdGhlIHRyYWNrZXI6ICInICsgbiArICciJyksIHQuc2Eobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubG9nZ2VyLndhcm4oJ0Nhbm5vdCBzZXQgcmVwb3J0IHN1aXRlcyBvbiB0cmFja2VyLiBgc2FgIG1ldGhvZCBub3QgYXZhaWxhYmxlLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9nZ2VyLmluZm8oJ0ZvdW5kIHRyYWNrZXIgbG9jYXRlZCBhdDogIicgKyBlICsgJyIuJyksIGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgbmFtZTogIicgKyBlICsgJyIuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUubGlicmFyeUNvZGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuTElCX1RZUEVTLk1BTkFHRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMuZ2V0UmVwb3J0U3VpdGVzKGUubGlicmFyeUNvZGUuYWNjb3VudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudGhlbih1LmJpbmQobnVsbCwgZSwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuTElCX1RZUEVTLlBSRUlOU1RBTExFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRoZW4oYy5wb2xsLmJpbmQobnVsbCwgYSwgZS5saWJyYXJ5Q29kZS50cmFja2VyVmFyaWFibGVOYW1lKSkudGhlbihmLmJpbmQobnVsbCwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHMuTElCX1RZUEVTLkNVU1RPTToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzLkxJQl9UWVBFUy5SRU1PVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50aGVuKHAuYmluZChudWxsLCBlLmxpYnJhcnlDb2RlLnRyYWNrZXJWYXJpYWJsZU5hbWUpKS50aGVuKGYuYmluZChudWxsLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsb2FkIGxpYnJhcnkuIFR5cGUgbm90IHN1cHBvcnRlZC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2dlbmVyYXRlVmVyc2lvbi5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSA4LCBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFVUQ0RhdGUoKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3Vic3RyKGUubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZS5nZXRVVENIb3VycygpIC8gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoZS5nZXRVVENNb250aCgpICsgMSArIDEyICogaShlKSkudG9TdHJpbmcoMzYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlLmdldFVUQ0Z1bGxZZWFyKCkgLSAyMDEwKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRGF0ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGUgcHJvdmlkZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnTCcgKyBvKHQpICsgYSh0KSArIG4odCkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvcG9sbEhlbHBlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIHMgPSA0MCwgYyA9IDI1MCwgdSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvZ2dlci5pbmZvKCdGb3VuZCBwcm9wZXJ0eSBsb2NhdGVkIGF0OiAiJyArIHQgKyAnIl0uJyksIGUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBmdW5jdGlvbiAoaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlbYV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KGUsIGEsIGlbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSwgciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbYV0gJiYgKHUoZSwgYSwgaVthXSksIGNsZWFySW50ZXJ2YWwocikpLCBzIDw9IG4gJiYgKGNsZWFySW50ZXJ2YWwociksIHQobmV3IEVycm9yKCdCYWlsaW5nIG91dC4gQ2Fubm90IGZpbmQgdGhlIHZhcmlhYmxlIG5hbWU6ICInICsgYSArICciXS4nKSkpLCBuKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9nZ2VyLmluZm8oJ1dhaXRpbmcgZm9yIHRoZSBwcm9wZXJ0eSB0byBiZWNvbWUgYWNjZXNzaWJsZSBhdDogIicgKyB0ICsgJyJdLicpLCBpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgb3JnSWQ6ICcxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcnLAogICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5Q29kZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvRVhjMmYyYzgxZDg0MzQ0MWJmYmUzZWYwOTRhOWNmZjM5ZC1saWJyYXJ5Q29kZV9zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2luZzogWydmZWRleGdsYmxkZXYnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uOiBbJyVzQWNjb3VudCUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZlbG9wbWVudDogWydmZWRleGdsYmxkZXYnXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJWYXJpYWJsZU5hbWU6ICdzJwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6Y291bnRyeUNvZGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50Omxhbmd1YWdlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmVyOiAnbWV0cmljcy5mZWRleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmxpbmVTdGF0czogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0Rvd25sb2FkTGlua3M6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tFeHRlcm5hbExpbmtzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFeHRlcm5hbEZpbHRlcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3Blbi5zcG90aWZ5LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvZGNhc3RzLmFwcGxlLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdW5kY2xvdWQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd3d3LnN0aXRjaGVyLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50Lm9uMjQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tYnJhbmRlZGJveGVzLmZlZGV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpdC5seScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nwb3RpLmZpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGUuY28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0ludGVybmFsRmlsdGVyczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZlclNlY3VyZTogJ3NtZXRyaWNzLmZlZGV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRG93bmxvYWRGaWxlVHlwZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9jeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VwcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pwZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N2ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwdHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZGYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bHN4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnNkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnhkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3bWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdmknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3bXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtcDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtNHYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqcGVnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBob3N0ZWRMaWJGaWxlc0Jhc2VVcmw6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vZXh0ZW5zaW9ucy9FUGJkZTJmN2NhMTRlNTQwMzk5ZGNjMWY4MjA4ODYwYjdiLycKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb3JlOiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDb3JlJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY3VzdG9tLWNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDdXN0b20gQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNvdXJjZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnamF2YXNjcmlwdC12YXJpYWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0phdmFTY3JpcHQgVmFyaWFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4uL2hlbHBlcnMvZ2V0T2JqZWN0UHJvcGVydHkuanMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcih3aW5kb3csIGUucGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncXVlcnktc3RyaW5nLXBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1F1ZXJ5IFN0cmluZyBQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCBzID0gbignQGFkb2JlL3JlYWN0b3ItcXVlcnktc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzLnBhcnNlKG8ubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmNhc2VJbnNlbnNpdGl2ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2UubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBlLm5hbWUudG9Mb3dlckNhc2UoKSwgciA9IE9iamVjdC5rZXlzKHQpLCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnRvTG93ZXJDYXNlKCkgPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjdXN0b20tY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0N1c3RvbSBDb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc291cmNlLmNhbGwodC5lbGVtZW50LCB0LCB0LnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsaWJyYXJ5LWxvYWRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xpYnJhcnkgTG9hZGVkIChQYWdlIFRvcCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4vaGVscGVycy9wYWdlTGlmZWN5Y2xlRXZlbnRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yZWdpc3RlckxpYnJhcnlMb2FkZWRUcmlnZ2VyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2N1c3RvbS1jb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ3VzdG9tIENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgYSwgbywgcyA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGMgPSBuKCcuL2hlbHBlcnMvZGVjb3JhdGVDb2RlJyksIHUgPSBuKCcuL2hlbHBlcnMvbG9hZENvZGVTZXF1ZW50aWFsbHknKSwgbCA9IG4oJy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZScpLCBkID0gci5nZXRFeHRlbnNpb25TZXR0aW5ncygpLCBmID0gKGkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbChzLmJvZHksIGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVXcml0ZVRva2VuOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5jc3BOb25jZSAmJiAnc2NyaXB0JyA9PT0gZS50YWdOYW1lICYmIChlLmF0dHJzLm5vbmNlID0gZC5jc3BOb25jZSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sb2dnZXIuZXJyb3IoZS5tc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhID0gW10sIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5ib2R5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBhLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoYS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KG8sIDIwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChlKSwgbygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmN1cnJlbnRTY3JpcHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuY3VycmVudFNjcmlwdC5hc3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8obGF1bmNofHNhdGVsbGl0ZUxpYiktW15cL10rLmpzKFw/LiopPyQvLnRlc3Qobi5zcmMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hc3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gbi5zZXR0aW5ncy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2V0dGluZ3MuaXNFeHRlcm5hbCA/IHUocikudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZihjKG4sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdm9pZCAocCB8fCAnbG9hZGluZycgIT09IHMucmVhZHlTdGF0ZSA/IGYoYyhuLCByKSkgOiBzLndyaXRlID8gcy53cml0ZShjKG4sIHIpKSA6IGYoYyhuLCByKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2N1c3RvbUV2ZW50LmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2N1c3RvbS1ldmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0N1c3RvbSBFdmVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbignLi9oZWxwZXJzL2NyZWF0ZUJ1YmJseScpKCksIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUudHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IGkuaW5kZXhPZihuKSAmJiAoaS5wdXNoKG4pLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihuLCByLmV2YWx1YXRlRXZlbnQsICEwKSksIHIuYWRkTGlzdGVuZXIoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmF0aXZlRXZlbnQudHlwZSA9PT0gbiAmJiAoZS5kZXRhaWwgPSBlLm5hdGl2ZUV2ZW50LmRldGFpbCwgdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGF0aC1hbmQtcXVlcnlzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdQYXRoIEFuZCBRdWVyeSBTdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGkgPSBuKCcuLi9oZWxwZXJzL3RleHRNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5sb2NhdGlvbi5wYXRobmFtZSArIHIubG9jYXRpb24uc2VhcmNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXRocy5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudmFsdWVJc1JlZ2V4ID8gbmV3IFJlZ0V4cChlLnZhbHVlLCAnaScpIDogZS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKG4sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BhZ2UtYm90dG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnUGFnZSBCb3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4vaGVscGVycy9wYWdlTGlmZWN5Y2xlRXZlbnRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yZWdpc3RlclBhZ2VCb3R0b21UcmlnZ2VyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ2xpY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCBvID0gbignLi9oZWxwZXJzL2NyZWF0ZUJ1YmJseScpKCksIHMgPSBuZXcgKG4oJy4vaGVscGVycy93ZWFrTWFwJykpKCksIGMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGU7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgJ2EnID09PSB0LnRvTG93ZXJDYXNlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmdldEF0dHJpYnV0ZSgnaHJlZicpLCByID0gZS5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAoIXIgfHwgJ19zZWxmJyA9PT0gciB8fCAnX3RvcCcgPT09IHIgJiYgYS50b3AgPT09IGEgfHwgciA9PT0gYS5uYW1lKSA/IGUgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvLmV2YWx1YXRlRXZlbnQsICEwKSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5hZGRMaXN0ZW5lcihyLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm5hdGl2ZUV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LnNfZmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5hbmNob3JEZWxheSAmJiAhcy5oYXModCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjKHQudGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAodC5wcmV2ZW50RGVmYXVsdCgpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9jYXRpb24gPSBuLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIuYW5jaG9yRGVsYXkpKSwgcy5zZXQodCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmV4cG9ydHMuX19yZXNldCA9IG8uX19yZXNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1BhdGggV2l0aG91dCBRdWVyeSBTdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGkgPSBuKCcuLi9oZWxwZXJzL3RleHRNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gci5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGF0aHMuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKSA6IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvbWVkaWFUaW1lUGxheWVkLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21lZGlhLXRpbWUtcGxheWVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWVkaWEgVGltZSBQbGF5ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG4oJy4vaGVscGVycy9jcmVhdGVCdWJibHknKSgpLCBjID0gbmV3IChuKCcuL2hlbHBlcnMvd2Vha01hcCcpKSgpLCB1ID0gW10sIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkQ6ICdzZWNvbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVDogJ3BlcmNlbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnNlZWthYmxlICYmIG4uc2Vla2FibGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuLnNlZWthYmxlLCByID0gdC5zdGFydCgwKSwgaSA9IHQuZW5kKDApLCBhID0gbi5jdXJyZW50VGltZSAtIHIsIG8gPSBjLmdldChuKSB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudW5pdCA9PT0gbC5TRUNPTkQgPyBlLmFtb3VudCA6IChpIC0gcikgKiAoZS5hbW91bnQgLyAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIDwgdCAmJiB0IDw9IGEgJiYgcy5ldmFsdWF0ZUV2ZW50KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogZS5hbW91bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiBlLnVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjLnNldChuLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgciwgITApLCBlLmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hbW91bnQgPT09IHQuYW1vdW50ICYmIGUudW5pdCA9PT0gdC51bml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnNvbWUoZSkgfHwgdS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogdC5hbW91bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiB0LnVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMuYWRkTGlzdGVuZXIodCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmFtb3VudCAhPT0gdC5hbW91bnQgfHwgZS51bml0ICE9PSB0LnVuaXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGF0YUVsZW1lbnRDaGFuZ2UuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YS1lbGVtZW50LWNoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0RhdGEgRWxlbWVudCBDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHt9LCBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04uc3RyaW5naWZ5KGkuZ2V0RGF0YUVsZW1lbnRWYWx1ZShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPT0gb1tlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geyBkYXRhRWxlbWVudE5hbWU6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2VdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgb1tlXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDApLCBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubmFtZSwgciA9IGFbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgfHwgKHIgPSBhW25dID0gW10sIG9bbl0gPSBKU09OLnN0cmluZ2lmeShpLmdldERhdGFFbGVtZW50VmFsdWUobikpKSwgci5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jb29raWUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci1jb29raWUnKSwgaSA9IG4oJy4uL2hlbHBlcnMvdGV4dE1hdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKSA6IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHIuZ2V0KGUubmFtZSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RvbS1yZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0RPTSBSZWFkeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbignLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJlZ2lzdGVyRG9tUmVhZHlUcmlnZ2VyKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZWxlbWVudC1leGlzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdFbGVtZW50IEV4aXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMzAwMCwgcyA9IG5ldyAobignLi9oZWxwZXJzL3dlYWtNYXAnKSkoKSwgYyA9IG4oJy4vaGVscGVycy9tYXRjaGVzUHJvcGVydGllcycpLCB1ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh1KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdVtlXSwgbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSksIHIgPSAwOyByIDwgbi5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbltyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMuaGFzKGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2V0KGksICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCB0Lmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGksIG8uc2V0dGluZ3MuZWxlbWVudFByb3BlcnRpZXMpICYmIChvLnRyaWdnZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5zcGxpY2UoYSwgMSksIGEtLSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByKSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1W2UuZWxlbWVudFNlbGVjdG9yXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCAobiA9IHVbZS5lbGVtZW50U2VsZWN0b3JdID0gW10pLCBuLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2NoYW5nZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4vaGVscGVycy9jcmVhdGVCdWJibHknKSgpLCBpID0gbignLi4vaGVscGVycy90ZXh0TWF0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByLmV2YWx1YXRlRXZlbnQsICEwKSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudmFsdWUgIT09IHVuZGVmaW5lZCAmJiAobiA9IGUudmFsdWVJc1JlZ2V4ID8gbmV3IFJlZ0V4cChlLnZhbHVlLCAnaScpIDogZS52YWx1ZSksIHIuYWRkTGlzdGVuZXIoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICE9PSB1bmRlZmluZWQgJiYgIWkoZS50YXJnZXQudmFsdWUsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvaGVscGVycy9nZXRPYmplY3RQcm9wZXJ0eS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQuc3BsaXQoJy4nKSwgciA9IGUsIGkgPSAwLCBhID0gbi5sZW5ndGg7IGkgPCBhOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByW25baV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgaSA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGEgPSAtMSAhPT0gci5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNU0lFIDEwJyksIG8gPSAnV0lORE9XX0xPQURFRCcsIHMgPSAnRE9NX1JFQURZJywgYyA9ICdQQUdFX0JPVFRPTScsIHUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgbCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LnNsaWNlKDAsIGcoZSkgKyAxKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjb21wbGV0ZScgPT09IGkucmVhZHlTdGF0ZSA/IG8gOiAnaW50ZXJhY3RpdmUnID09PSBpLnJlYWR5U3RhdGUgPyBhID8gbnVsbCA6IHMgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW2VdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGRbZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudHJpZ2dlciwgciA9IHQuc3ludGhldGljRXZlbnRGbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ociA/IHIoZSkgOiBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLl9zYXRlbGxpdGUgPSByLl9zYXRlbGxpdGUgfHwge30sIHIuX3NhdGVsbGl0ZS5wYWdlQm90dG9tID0gZi5iaW5kKG51bGwsIGMpLCBpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmLmJpbmQobnVsbCwgcyksICEwKSwgci5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZi5iaW5kKG51bGwsIG8pLCAhMCksIHIuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCksIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJMaWJyYXJ5TG9hZGVkVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQYWdlQm90dG9tVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbY10ucHVzaCh7IHRyaWdnZXI6IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRG9tUmVhZHlUcmlnZ2VyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtzXS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50Rm46IGwuYmluZChudWxsLCBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyV2luZG93TG9hZGVkVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbb10ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudEZuOiBsLmJpbmQobnVsbCwgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdGVDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDAsIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2V0dGluZ3MuaXNFeHRlcm5hbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzY3JpcHQ+XG4nICsgdCArICdcbjwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMgPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAnX19ydW5TY3JpcHQnICsgKytpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGVbbl0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbCh0LmV2ZW50LmVsZW1lbnQsIHQuZXZlbnQsIHQuZXZlbnQudGFyZ2V0KSwgZGVsZXRlIF9zYXRlbGxpdGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnPHNjcmlwdD5fc2F0ZWxsaXRlWyInICsgbiArICciXShmdW5jdGlvbihldmVudCwgdGFyZ2V0KSB7XG4nICsgZSArICdcbn0pOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNldHRpbmdzLmdsb2JhbCA/IG8oZSwgdCkgOiBzKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSkgPyByLnJlcGxhY2VUb2tlbnModCwgZS5ldmVudCkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjW2Uuc2V0dGluZ3MubGFuZ3VhZ2VdKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2xvYWRDb2RlU2VxdWVudGlhbGx5LmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgaSA9IG4oJy4vZ2V0U291cmNlQnlVcmwnKSwgYSA9IHIucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IHIoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWxsKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiByICYmICdvYmplY3QnID09IHR5cGVvZiBuID8gbi5leHBvcnRzID0gdCgpIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoW10sIHQpIDogJ29iamVjdCcgPT0gdHlwZW9mIHIgPyByLnBvc3RzY3JpYmUgPSB0KCkgOiBlLnBvc3RzY3JpYmUgPSB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpW2VdLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpW2VdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2VdLmNhbGwodC5leHBvcnRzLCB0LCB0LmV4cG9ydHMsIHIpLCB0LmxvYWRlZCA9ICEwLCB0LmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubSA9IG4sIHIuYyA9IGksIHIucCA9ICcnLCByKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSByKG4oMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGlbJ2RlZmF1bHQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WydkZWZhdWx0J10gPSBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgJ2RlZmF1bHQnOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBvLmxhc3QoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFmdGVyRGVxdWV1ZSgpLCBlLnN0cmVhbSA9IGEuYXBwbHkodW5kZWZpbmVkLCBlKSwgdC5hZnRlclN0cmVhbVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHIuYmVmb3JlV3JpdGUoZSksIG0ud3JpdGUoZSksIHIuYWZ0ZXJXcml0ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobSA9IG5ldyBwWydkZWZhdWx0J10oZSwgcikpLmlkID0gZysrLCBtLm5hbWUgPSByLm5hbWUgfHwgbS5pZCwgZC5zdHJlYW1zW20ubmFtZV0gPSBtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUub3duZXJEb2N1bWVudCwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogbi5jbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuOiBuLm9wZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGU6IG4ud3JpdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVsbjogbi53cml0ZWxuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbjogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCB0ID0gQXJyYXkoZSksIG4gPSAwOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W25dID0gYXJndW1lbnRzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHQuam9pbignJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlbG46IGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBBcnJheShlKSwgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodC5qb2luKCcnKSArICdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBtLndpbi5vbmVycm9yIHx8IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtLndpbi5vbmVycm9yID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZXJyb3IoeyBtc2c6IGUgKyAnIC0gJyArIHQgKyAnOiAnICsgbiB9KSwgby5hcHBseShtLndpbiwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbS53cml0ZSh0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmKG4sIGEpLCBtLndpbi5vbmVycm9yID0gbywgci5kb25lKCksIG0gPSBudWxsLCBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uaXNGdW5jdGlvbihuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB7IGRvbmU6IG4gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2NsZWFyJyA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gW10sIG0gPSBudWxsLCB2b2lkIChnID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBvLmRlZmF1bHRzKG4sIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAvXiMvLnRlc3QoZSkgPyB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZS5zdWJzdHIoMSkpIDogZS5qcXVlcnkgPyBlWzBdIDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBvc3RzY3JpYmUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw6IGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zdHJlYW0gPyByLnN0cmVhbS5hYm9ydCgpIDogclsxXSA9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uYmVmb3JlRW5xdWV1ZShyKSwgYy5wdXNoKHIpLCBtIHx8IGwoKSwgZS5wb3N0c2NyaWJlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFsnZGVmYXVsdCddID0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGkobigyKSksIG8gPSByKG4oNCkpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBc3luYzogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyRGVxdWV1ZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyU3RyZWFtU3RhcnQ6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcldyaXRlOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVFbnF1ZXVlOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlV3JpdGVUb2tlbjogZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlV3JpdGU6IGZ1bmN0aW9uIHYoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUubXNnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlQXN5bmM6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGcgPSAwLCBjID0gW10sIG0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYoZCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtOiBwWydkZWZhdWx0J10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WydkZWZhdWx0J10gPSBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgJ2RlZmF1bHQnOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdyArIHQsIHIgPSBlLmdldEF0dHJpYnV0ZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUuZXhpc3R5KHIpID8gU3RyaW5nKHIpIDogcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgbiAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogbnVsbCwgaSA9IHcgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLmV4aXN0eShyKSAmJiAnJyAhPT0gciA/IGUuc2V0QXR0cmlidXRlKGksIHIpIDogZS5yZW1vdmVBdHRyaWJ1dGUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19lc01vZHVsZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGsgPSBpKG4oMykpLCBFID0gcihuKDQpKSwgSSA9ICExLCB3ID0gJ2RhdGEtcHMtJywgRCA9ICdwcy1zdHlsZScsIEEgPSAncHMtc2NyaXB0JywgYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSh0aGlzLCByKSwgdGhpcy5yb290ID0gZSwgdGhpcy5vcHRpb25zID0gbiwgdGhpcy5kb2MgPSBlLm93bmVyRG9jdW1lbnQsIHRoaXMud2luID0gdGhpcy5kb2MuZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2MucGFyZW50V2luZG93LCB0aGlzLnBhcnNlciA9IG5ldyBrWydkZWZhdWx0J10oJycsIHsgYXV0b0ZpeDogbi5hdXRvRml4IH0pLCB0aGlzLmFjdHVhbHMgPSBbZV0sIHRoaXMucHJveHlIaXN0b3J5ID0gJycsIHRoaXMucHJveHlSb290ID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudChlLm5vZGVOYW1lKSwgdGhpcy5zY3JpcHRTdGFjayA9IFtdLCB0aGlzLndyaXRlUXVldWUgPSBbXSwgQyh0aGlzLnByb3h5Um9vdCwgJ3Byb3h5b2YnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICgoZSA9IHRoaXMud3JpdGVRdWV1ZSkucHVzaC5hcHBseShlLCBhcmd1bWVudHMpOyAhdGhpcy5kZWZlcnJlZFJlbW90ZSAmJiB0aGlzLndyaXRlUXVldWUubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMud3JpdGVRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLmlzRnVuY3Rpb24odCkgPyB0aGlzLl9jYWxsRnVuY3Rpb24odCkgOiB0aGlzLl93cml0ZUltcGwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci5wcm90b3R5cGUuX2NhbGxGdW5jdGlvbiA9IGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS5uYW1lIHx8IGUudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25TY3JpcHRTdGFydCh0KSwgZS5jYWxsKHRoaXMud2luLCB0aGlzLmRvYyksIHRoaXMuX29uU2NyaXB0RG9uZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl93cml0ZUltcGwgPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlci5hcHBlbmQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHZvaWQgMCwgbiA9IHZvaWQgMCwgciA9IHZvaWQgMCwgaSA9IFtdOyAodCA9IHRoaXMucGFyc2VyLnJlYWRUb2tlbigpKSAmJiAhKG4gPSBFLmlzU2NyaXB0KHQpKSAmJiAhKHIgPSBFLmlzU3R5bGUodCkpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPSB0aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbih0KSkgJiYgaS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBpLmxlbmd0aCAmJiB0aGlzLl93cml0ZVN0YXRpY1Rva2VucyhpKSwgbiAmJiB0aGlzLl9oYW5kbGVTY3JpcHRUb2tlbih0KSwgciAmJiB0aGlzLl9oYW5kbGVTdHlsZVRva2VuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci5wcm90b3R5cGUuX3dyaXRlU3RhdGljVG9rZW5zID0gZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLl9idWlsZENodW5rKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdHVhbCA/ICh0Lmh0bWwgPSB0aGlzLnByb3h5SGlzdG9yeSArIHQuYWN0dWFsLCB0aGlzLnByb3h5SGlzdG9yeSArPSB0LnByb3h5LCB0aGlzLnByb3h5Um9vdC5pbm5lckhUTUwgPSB0Lmh0bWwsIEkgJiYgKHQucHJveHlJbm5lckhUTUwgPSB0aGlzLnByb3h5Um9vdC5pbm5lckhUTUwpLCB0aGlzLl93YWxrQ2h1bmsoKSwgSSAmJiAodC5hY3R1YWxJbm5lckhUTUwgPSB0aGlzLnJvb3QuaW5uZXJIVE1MKSwgdCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci5wcm90b3R5cGUuX2J1aWxkQ2h1bmsgPSBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5hY3R1YWxzLmxlbmd0aCwgbiA9IFtdLCByID0gW10sIGkgPSBbXSwgYSA9IGUubGVuZ3RoLCBvID0gMDsgbyA8IGE7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGVbb10sIGMgPSBzLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnB1c2goYyksIHMuYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghL15ub3NjcmlwdCQvaS50ZXN0KHMudGFnTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goYy5yZXBsYWNlKC8oXC8/PikvLCAnICcgKyB3ICsgJ2lkPScgKyB1ICsgJyAkMScpKSwgcy5hdHRycy5pZCAhPT0gQSAmJiBzLmF0dHJzLmlkICE9PSBEICYmIGkucHVzaCgnYXRvbWljVGFnJyA9PT0gcy50eXBlID8gJycgOiAnPCcgKyBzLnRhZ05hbWUgKyAnICcgKyB3ICsgJ3Byb3h5b2Y9JyArIHUgKyAocy51bmFyeSA/ICcgLz4nIDogJz4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGMpLCBpLnB1c2goJ2VuZFRhZycgPT09IHMudHlwZSA/IGMgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBuLmpvaW4oJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw6IHIuam9pbignJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5OiBpLmpvaW4oJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl93YWxrQ2h1bmsgPSBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB2b2lkIDAsIHQgPSBbdGhpcy5wcm94eVJvb3RdOyBFLmV4aXN0eShlID0gdC5zaGlmdCgpKTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxID09PSBlLm5vZGVUeXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgIV8oZSwgJ3Byb3h5b2YnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBDKHRoaXMuYWN0dWFsc1tfKGUsICdpZCcpXSA9IGUsICdpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnBhcmVudE5vZGUgJiYgXyhlLnBhcmVudE5vZGUsICdwcm94eW9mJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIHRoaXMuYWN0dWFsc1tyXS5hcHBlbmRDaGlsZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnVuc2hpZnQuYXBwbHkodCwgRS50b0FycmF5KGUuY2hpbGROb2RlcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9oYW5kbGVTY3JpcHRUb2tlbiA9IGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgbiA9IHRoaXMucGFyc2VyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiB0aGlzLndyaXRlUXVldWUudW5zaGlmdChuKSwgZS5zcmMgPSBlLmF0dHJzLnNyYyB8fCBlLmF0dHJzLlNSQywgKGUgPSB0aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbihlKSkgJiYgKGUuc3JjICYmIHRoaXMuc2NyaXB0U3RhY2subGVuZ3RoID8gdGhpcy5kZWZlcnJlZFJlbW90ZSA9IGUgOiB0aGlzLl9vblNjcmlwdFN0YXJ0KGUpLCB0aGlzLl93cml0ZVNjcmlwdFRva2VuKGUsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fb25TY3JpcHREb25lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9oYW5kbGVTdHlsZVRva2VuID0gZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLnBhcnNlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgdGhpcy53cml0ZVF1ZXVlLnVuc2hpZnQodCksIGUudHlwZSA9IGUuYXR0cnMudHlwZSB8fCBlLmF0dHJzLlRZUEUgfHwgJ3RleHQvY3NzJywgKGUgPSB0aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbihlKSkgJiYgdGhpcy5fd3JpdGVTdHlsZVRva2VuKGUpLCB0ICYmIHRoaXMud3JpdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl93cml0ZVN0eWxlVG9rZW4gPSBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2J1aWxkU3R5bGUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0Q3Vyc29yKHQsIEQpLCBlLmNvbnRlbnQgJiYgKHQuc3R5bGVTaGVldCAmJiAhdC5zaGVldCA/IHQuc3R5bGVTaGVldC5jc3NUZXh0ID0gZS5jb250ZW50IDogdC5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZShlLmNvbnRlbnQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByLnByb3RvdHlwZS5fYnVpbGRTdHlsZSA9IGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudChlLnRhZ05hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnNldEF0dHJpYnV0ZSgndHlwZScsIGUudHlwZSksIEUuZWFjaEtleShlLmF0dHJzLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9pbnNlcnRDdXJzb3IgPSBmdW5jdGlvbiBmKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZUltcGwoJzxzcGFuIGlkPSInICsgdCArICciLz4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9vblNjcmlwdFN0YXJ0ID0gZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5vdXRlcldyaXRlcyA9IHRoaXMud3JpdGVRdWV1ZSwgdGhpcy53cml0ZVF1ZXVlID0gW10sIHRoaXMuc2NyaXB0U3RhY2sudW5zaGlmdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9vblNjcmlwdERvbmUgPSBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID09PSB0aGlzLnNjcmlwdFN0YWNrWzBdID8gKHRoaXMuc2NyaXB0U3RhY2suc2hpZnQoKSwgdGhpcy53cml0ZS5hcHBseSh0aGlzLCBlLm91dGVyV3JpdGVzKSwgIXRoaXMuc2NyaXB0U3RhY2subGVuZ3RoICYmIHRoaXMuZGVmZXJyZWRSZW1vdGUgJiYgKHRoaXMuX29uU2NyaXB0U3RhcnQodGhpcy5kZWZlcnJlZFJlbW90ZSksIHRoaXMuZGVmZXJyZWRSZW1vdGUgPSBudWxsKSkgOiB0aGlzLm9wdGlvbnMuZXJyb3IoeyBtc2c6ICdCYWQgc2NyaXB0IG5lc3Rpbmcgb3Igc2NyaXB0IGZpbmlzaGVkIHR3aWNlJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl93cml0ZVNjcmlwdFRva2VuID0gZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLl9idWlsZFNjcmlwdChlKSwgciA9IHRoaXMuX3Nob3VsZFJlbGVhc2UobiksIGkgPSB0aGlzLm9wdGlvbnMuYWZ0ZXJBc3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNyYyAmJiAobi5zcmMgPSBlLnNyYywgdGhpcy5fc2NyaXB0TG9hZEhhbmRsZXIobiwgciA/IGkgOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKSwgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRDdXJzb3IobiwgQSksIG4uc3JjICYmICFyIHx8IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lcnJvcihhKSwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9idWlsZFNjcmlwdCA9IGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudChlLnRhZ05hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFLmVhY2hLZXkoZS5hdHRycywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zZXRBdHRyaWJ1dGUoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuY29udGVudCAmJiAobi50ZXh0ID0gZS5jb250ZW50KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9zY3JpcHRMb2FkSGFuZGxlciA9IGZ1bmN0aW9uIHYodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0Lm9ubG9hZCA9IHQub25yZWFkeXN0YXRlY2hhbmdlID0gdC5vbmVycm9yID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcigpLCBudWxsICE9IG4gJiYgbigpLCBuID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoKSwgbyhlKSwgbnVsbCAhPSBuICYmIG4oKSwgbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbJ29uJyArIHRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IG4gJiYgKGVbJ19vbicgKyB0XSA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMub3B0aW9ucy5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQsICdsb2FkJyksIGUodCwgJ2Vycm9yJyksIHgodCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmxvYWQ6IGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5fb25sb2FkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX29ubG9hZC5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoeyBtc2c6ICdvbmxvYWQgaGFuZGxlciBmYWlsZWQgJyArIGUgKyAnIEAgJyArIHQuc3JjIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Ll9vbmVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX29uZXJyb3IuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBhKHsgbXNnOiAnb25lcnJvciBoYW5kbGVyIGZhaWxlZCAnICsgZSArICcgQCAnICsgdC5zcmMgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSh7IG1zZzogJ3JlbW90ZSBzY3JpcHQgZmFpbGVkICcgKyB0LnNyYyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlOiBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL14obG9hZGVkfGNvbXBsZXRlKSQvLnRlc3QodC5yZWFkeVN0YXRlKSAmJiBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLl9zaG91bGRSZWxlYXNlID0gZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEvXnNjcmlwdCQvaS50ZXN0KGUubm9kZU5hbWUpIHx8ICEhKHRoaXMub3B0aW9ucy5yZWxlYXNlQXN5bmMgJiYgZS5zcmMgJiYgZS5oYXNBdHRyaWJ1dGUoJ2FzeW5jJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbJ2RlZmF1bHQnXSA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZXhwb3J0cyA9IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KDAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVtlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbZV0uZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGlbZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bZV0uY2FsbCh0LmV4cG9ydHMsIHQsIHQuZXhwb3J0cywgciksIHQubG9hZGVkID0gITAsIHQuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5tID0gbiwgci5jID0gaSwgci5wID0gJycsIHIoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7ICdkZWZhdWx0JzogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIobigxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gaVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFsnZGVmYXVsdCddID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGkobigyKSksIGYgPSBpKG4oMykpLCBwID0gcihuKDYpKSwgYSA9IG4oNSksIGcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50OiAvXjwhLS0vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGFnOiAvXjxcLy8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9taWNUYWc6IC9ePFxzKihzY3JpcHR8c3R5bGV8bm9zY3JpcHR8aWZyYW1lfHRleHRhcmVhKVtcc1wvPl0vaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGFnOiAvXjwvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnM6IC9eW148XS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcywgciA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIGUgIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnLCBpID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCh0aGlzLCBjKSwgdGhpcy5zdHJlYW0gPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gITEsIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzIGluIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaGFzT3duUHJvcGVydHkocykgJiYgKGkuYXV0b0ZpeCAmJiAob1tzICsgJ0ZpeCddID0gITApLCBhID0gYSB8fCBvW3MgKyAnRml4J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPyAodGhpcy5fcmVhZFRva2VuID0gKDAsIHBbJ2RlZmF1bHQnXSkodGhpcywgbywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5fcmVhZFRva2VuSW1wbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLl9wZWVrVG9rZW4gPSAoMCwgcFsnZGVmYXVsdCddKSh0aGlzLCBvLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLl9wZWVrVG9rZW5JbXBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogKHRoaXMuX3JlYWRUb2tlbiA9IHRoaXMuX3JlYWRUb2tlbkltcGwsIHRoaXMuX3BlZWtUb2tlbiA9IHRoaXMuX3BlZWtUb2tlbkltcGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtICs9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBlICsgdGhpcy5zdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5fcmVhZFRva2VuSW1wbCA9IGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLl9wZWVrVG9rZW5JbXBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbSA9IHRoaXMuc3RyZWFtLnNsaWNlKGUubGVuZ3RoKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLl9wZWVrVG9rZW5JbXBsID0gZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLmhhc093blByb3BlcnR5KGUpICYmIGdbZV0udGVzdCh0aGlzLnN0cmVhbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZltlXSh0aGlzLnN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0YXJ0VGFnJyA9PT0gdC50eXBlICYmIC9zY3JpcHR8c3R5bGUvaS50ZXN0KHQudGFnTmFtZSkgPyBudWxsIDogKHQudGV4dCA9IHRoaXMuc3RyZWFtLnN1YnN0cigwLCB0Lmxlbmd0aCksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5wZWVrVG9rZW4gPSBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZWVrVG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLnJlYWRUb2tlbiA9IGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWRUb2tlbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUucmVhZFRva2VucyA9IGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB2b2lkIDA7IHQgPSB0aGlzLnJlYWRUb2tlbigpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbdC50eXBlXSAmJiAhMSA9PT0gZVt0LnR5cGVdKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcy5zdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtID0gJycsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5yZXN0ID0gZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiAoKHRbJ2RlZmF1bHQnXSA9IG8pLnRva2VuVG9TdHJpbmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5lc2NhcGVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eShuKSAmJiAodFtuXSA9ICgwLCBhLmVzY2FwZVF1b3RlcykoZVtuXSwgbnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8uc3VwcG9ydHMgPSBkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5oYXNPd25Qcm9wZXJ0eShzKSAmJiAoby5icm93c2VySGFzRmxhdyA9IG8uYnJvd3Nlckhhc0ZsYXcgfHwgIWRbc10gJiYgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAhKHQuX19lc01vZHVsZSA9ICEwKSwgciA9ICExLCBpID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJzxQPjxJPjwvUD48L0k+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5pbm5lckhUTUwgPSBhLCB0LnRhZ1NvdXAgPSBuID0gaS5pbm5lckhUTUwgIT09IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRhZ1NvdXAgPSBuID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuaW5uZXJIVE1MID0gJzxQPjxpPjxQPjwvUD48L2k+PC9QPicsIHQuc2VsZkNsb3NlID0gciA9IDIgPT09IGkuY2hpbGROb2Rlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNlbGZDbG9zZSA9IHIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG51bGwsIHQudGFnU291cCA9IG4sIHQuc2VsZkNsb3NlID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmluZGV4T2YoJy0tPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBsLkNvbW1lbnRUb2tlbihlLnN1YnN0cig0LCB0IC0gMSksIHQgKyAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pbmRleE9mKCc8Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgbC5DaGFyc1Rva2VuKDAgPD0gdCA/IHQgOiBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgcywgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9PSBlLmluZGV4T2YoJz4nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm1hdGNoKGQuc3RhcnRUYWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IChvID0ge30sIHMgPSB7fSwgYyA9IHRbMl0sIHRbMl0ucmVwbGFjZShkLmF0dHIsIGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgciB8fCBpIHx8IGEgPyBhcmd1bWVudHNbNV0gPyAob1thcmd1bWVudHNbNV1dID0gJycsIHNbYXJndW1lbnRzWzVdXSA9ICEwKSA6IG9bdF0gPSBhcmd1bWVudHNbMl0gfHwgYXJndW1lbnRzWzNdIHx8IGFyZ3VtZW50c1s0XSB8fCBkLmZpbGxBdHRyLnRlc3QodCkgJiYgdCB8fCAnJyA6IG9bdF0gPSAnJywgYyA9IGMucmVwbGFjZShlLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHsgdjogbmV3IGwuU3RhcnRUYWdUb2tlbih0WzFdLCB0WzBdLmxlbmd0aCwgbywgcywgISF0WzNdLCBjLnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCAnJykpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PT0gKHZvaWQgMCA9PT0gbiA/ICd1bmRlZmluZWQnIDogdShuKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5zbGljZSh0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5tYXRjaChuZXcgUmVnRXhwKCc8L1xccyonICsgdC50YWdOYW1lICsgJ1xccyo+JywgJ2knKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4ubWF0Y2gobmV3IFJlZ0V4cCgnKFtcXHNcXFNdKj8pPC9cXHMqJyArIHQudGFnTmFtZSArICdcXHMqPicsICdpJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGwuQXRvbWljVGFnVG9rZW4odC50YWdOYW1lLCByWzBdLmxlbmd0aCArIHQubGVuZ3RoLCB0LmF0dHJzLCB0LmJvb2xlYW5BdHRycywgclsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5tYXRjaChkLmVuZFRhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBsLkVuZFRhZ1Rva2VuKHRbMV0sIHRbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29tbWVudCA9IHIsIHQuY2hhcnMgPSBpLCB0LnN0YXJ0VGFnID0gYSwgdC5hdG9taWNUYWcgPSBvLCB0LmVuZFRhZyA9IHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBuKDQpLCBkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUYWc6IC9ePChbXC1BLVphLXowLTlfXSspKCg/OlxzK1tcd1wtXSsoPzpccyo9P1xzKig/Oig/OiJbXiJdKiIpfCg/OidbXiddKicpfFtePlxzXSspKT8pKilccyooXC8/KT4vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGFnOiAvXjxcLyhbXC1BLVphLXowLTlfXSspW14+XSo+LywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IC8oPzooW1wtQS1aYS16MC05X10rKVxzKj1ccyooPzooPzoiKCg/OlxcLnxbXiJdKSopIil8KD86JygoPzpcXC58W14nXSkqKScpfChbXj5cc10rKSkpfCg/OihbXC1BLVphLXowLTlfXSspKFxzfCQpKykvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxBdHRyOiAvXihjaGVja2VkfGNvbXBhY3R8ZGVjbGFyZXxkZWZlcnxkaXNhYmxlZHxpc21hcHxtdWx0aXBsZXxub2hyZWZ8bm9yZXNpemV8bm9zaGFkZXxub3dyYXB8cmVhZG9ubHl8c2VsZWN0ZWQpJC9pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5FbmRUYWdUb2tlbiA9IHQuQXRvbWljVGFnVG9rZW4gPSB0LlN0YXJ0VGFnVG9rZW4gPSB0LlRhZ1Rva2VuID0gdC5DaGFyc1Rva2VuID0gdC5Db21tZW50VG9rZW4gPSB0LlRva2VuID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbig1KSwgciA9IHQuVG9rZW4gPSBmdW5jdGlvbiByKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModGhpcywgciksIHRoaXMudHlwZSA9IGUsIHRoaXMubGVuZ3RoID0gdCwgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSAodC5Db21tZW50VG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRoaXMsIG4pLCB0aGlzLnR5cGUgPSAnY29tbWVudCcsIHRoaXMubGVuZ3RoID0gdCB8fCAoZSA/IGUubGVuZ3RoIDogMCksIHRoaXMudGV4dCA9ICcnLCB0aGlzLmNvbnRlbnQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzwhLS0nICsgdGhpcy5jb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB0LkNoYXJzVG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRoaXMsIHQpLCB0aGlzLnR5cGUgPSAnY2hhcnMnLCB0aGlzLmxlbmd0aCA9IGUsIHRoaXMudGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB0LlRhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0LCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0aGlzLCBhKSwgdGhpcy50eXBlID0gZSwgdGhpcy5sZW5ndGggPSBuLCB0aGlzLnRleHQgPSAnJywgdGhpcy50YWdOYW1lID0gdCwgdGhpcy5hdHRycyA9IHIsIHRoaXMuYm9vbGVhbkF0dHJzID0gaSwgdGhpcy51bmFyeSA9ICExLCB0aGlzLmh0bWw1VW5hcnkgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmZvcm1hdFRhZyA9IGZ1bmN0aW9uIG8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbCwgciA9ICc8JyArIGUudGFnTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGUuYXR0cnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmF0dHJzLmhhc093blByb3BlcnR5KGkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9ICcgJyArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUuYXR0cnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5ib29sZWFuQXR0cnMgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGUuYm9vbGVhbkF0dHJzW2ldIHx8IChyICs9ICc9IicgKyAoMCwgYy5lc2NhcGVRdW90ZXMpKGEpICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlc3QgJiYgKHIgKz0gJyAnICsgZS5yZXN0KSwgZS51bmFyeSAmJiAhZS5odG1sNVVuYXJ5ID8gciArPSAnLz4nIDogciArPSAnPicsIG4gIT09IHVuZGVmaW5lZCAmJiBudWxsICE9PSBuICYmIChyICs9IG4gKyAnPC8nICsgZS50YWdOYW1lICsgJz4nKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5TdGFydFRhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQsIG4sIHIsIGksIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModGhpcywgbyksIHRoaXMudHlwZSA9ICdzdGFydFRhZycsIHRoaXMubGVuZ3RoID0gdCwgdGhpcy50ZXh0ID0gJycsIHRoaXMudGFnTmFtZSA9IGUsIHRoaXMuYXR0cnMgPSBuLCB0aGlzLmJvb2xlYW5BdHRycyA9IHIsIHRoaXMuaHRtbDVVbmFyeSA9ICExLCB0aGlzLnVuYXJ5ID0gaSwgdGhpcy5yZXN0ID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZm9ybWF0VGFnKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgdC5BdG9taWNUYWdUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0LCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHRoaXMsIGEpLCB0aGlzLnR5cGUgPSAnYXRvbWljVGFnJywgdGhpcy5sZW5ndGggPSB0LCB0aGlzLnRleHQgPSAnJywgdGhpcy50YWdOYW1lID0gZSwgdGhpcy5hdHRycyA9IG4sIHRoaXMuYm9vbGVhbkF0dHJzID0gciwgdGhpcy51bmFyeSA9ICExLCB0aGlzLmh0bWw1VW5hcnkgPSAhMSwgdGhpcy5jb250ZW50ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZm9ybWF0VGFnKHRoaXMsIHRoaXMuY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB0LkVuZFRhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHModGhpcywgbiksIHRoaXMudHlwZSA9ICdlbmRUYWcnLCB0aGlzLmxlbmd0aCA9IHQsIHRoaXMudGV4dCA9ICcnLCB0aGlzLnRhZ05hbWUgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzwvJyArIHRoaXMudGFnTmFtZSArICc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gZS5yZXBsYWNlKC8oW14iXSopIi9nLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9cXC8udGVzdCh0KSA/IHQgKyAnIicgOiB0ICsgJ1xcIic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHQuZXNjYXBlUXVvdGVzID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ3N0YXJ0VGFnJyA9PT0gZS50eXBlICYmIChlLnVuYXJ5ID0gci50ZXN0KGUudGFnTmFtZSkgfHwgZS51bmFyeSwgZS5odG1sNVVuYXJ5ID0gIS9cLz4kLy50ZXN0KGUudGV4dCkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnN0cmVhbSwgciA9IHUodCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RyZWFtID0gbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmVwZW5kKCc8LycgKyBuLnRhZ05hbWUgKyAnPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sYXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5sYXN0VGFnTmFtZUVxID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5sYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0LnRhZ05hbWUgJiYgdC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09IGUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5jb250YWluc1RhZ05hbWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgbiA9IDA7IHQgPSB0aGlzW25dOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQudGFnTmFtZSA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKG4sIHIsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbChuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgb1tlLnR5cGVdICYmIG9bZS50eXBlXShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGYoKSwgbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRhZzogZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS50YWdOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFInID09PSB0LnRvVXBwZXJDYXNlKCkgJiYgYS5sYXN0VGFnTmFtZUVxKCdUQUJMRScpID8gKG4ucHJlcGVuZCgnPFRCT0RZPicpLCBpKCkpIDogci5zZWxmQ2xvc2VGaXggJiYgcC50ZXN0KHQpICYmIGEuY29udGFpbnNUYWdOYW1lKHQpID8gYS5sYXN0VGFnTmFtZUVxKHQpID8gZChuLCBhKSA6IChuLnByZXBlbmQoJzwvJyArIGUudGFnTmFtZSArICc+JyksIGkoKSkgOiBlLnVuYXJ5IHx8IGEucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRhZzogZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubGFzdCgpID8gci50YWdTb3VwRml4ICYmICFhLmxhc3RUYWdOYW1lRXEoZS50YWdOYW1lKSA/IGQobiwgYSkgOiBhLnBvcCgpIDogci50YWdTb3VwRml4ICYmICh0KCksIGkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSgpLCB1KHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19lc01vZHVsZSA9ICEwLCB0WydkZWZhdWx0J10gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gL14oQVJFQXxCQVNFfEJBU0VGT05UfEJSfENPTHxGUkFNRXxIUnxJTUd8SU5QVVR8SVNJTkRFWHxMSU5LfE1FVEF8UEFSQU18RU1CRUQpJC9pLCBwID0gL14oQ09MR1JPVVB8RER8RFR8TEl8T1BUSU9OU3xQfFREfFRGT09UfFRIfFRIRUFEfFRSKSQvaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdm9pZCAwLCBpID0gZSAmJiBlLmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSAwOyByIDwgaTsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jYWxsKG4sIGVbcl0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eShyKSAmJiB0LmNhbGwobiwgciwgZVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8obiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IG4gfHwge30sIGEoZSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIobltlXSkgfHwgKG5bZV0gPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChuID0gW10sIGkoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeyB2OiBuIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSAodm9pZCAwID09PSB0ID8gJ3VuZGVmaW5lZCcgOiBmKHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC52OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbZS5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlIHx8ICdzdGFydFRhZycgIT09IGUudHlwZSAmJiAnYXRvbWljVGFnJyAhPT0gZS50eXBlIHx8ICEoJ3RhZ05hbWUnIGluIGUpIHx8ICF+ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlLCAnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlLCAnc3R5bGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhpc3R5ID0gciwgdC5pc0Z1bmN0aW9uID0gbiwgdC5lYWNoID0gaSwgdC5lYWNoS2V5ID0gYSwgdC5kZWZhdWx0cyA9IG8sIHQudG9BcnJheSA9IHMsIHQubGFzdCA9IGMsIHQuaXNUYWcgPSB1LCB0LmlzU2NyaXB0ID0gbCwgdC5pc1N0eWxlID0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2dldFNvdXJjZUJ5VXJsLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLWxvYWQtc2NyaXB0JyksIGkgPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIGEgPSB7fSwgbyA9IHt9LCBzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2VdIHx8IChvW2VdID0gcihlKSksIG9bZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5fX3JlZ2lzdGVyU2NyaXB0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbdF0gPyBpLnJlc29sdmUoYVt0XSkgOiBuZXcgaShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyh0KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGFbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL2NyZWF0ZUJ1YmJseS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKCcuL3dlYWtNYXAnKSwgcCA9IG4oJy4vbWF0Y2hlc1Byb3BlcnRpZXMnKSwgZyA9IG4oJy4vbWF0Y2hlc1NlbGVjdG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IFtdLCBmID0gbmV3IHIoKSwgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUV2ZW50OiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5sZW5ndGggJiYgIWYuaGFzKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdC50YXJnZXQsIHIgPSAhMTsgbjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gITEsIGEgPSAhMSwgbyA9IDA7IG8gPCBkLmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZFtvXSwgYyA9IHMuc2V0dGluZ3MuZWxlbWVudFNlbGVjdG9yLCB1ID0gcy5zZXR0aW5ncy5lbGVtZW50UHJvcGVydGllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghMSAhPT0gcy5zZXR0aW5ncy5idWJibGVGaXJlSWZDaGlsZEZpcmVkIHx8ICFyKSAmJiAobiA9PT0gdC50YXJnZXQgfHwgITEgIT09IHMuc2V0dGluZ3MuYnViYmxlRmlyZUlmUGFyZW50KSAmJiAobiA9PT0gdC50YXJnZXQgfHwgYyB8fCB1ICYmIE9iamVjdC5rZXlzKHUpLmxlbmd0aCkgJiYgKCFjIHx8IGcobiwgYykpICYmICghdSB8fCBwKG4sIHUpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFtlXSA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGwubmF0aXZlRXZlbnQgPSB0LCBsLmVsZW1lbnQgPSBuLCBsLnRhcmdldCA9IHQudGFyZ2V0LCAhMSAhPT0gcy5jYWxsYmFjayhsKSAmJiAoYSA9ICEwLCBzLnNldHRpbmdzLmJ1YmJsZVN0b3AgJiYgKGkgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmIChyID0gITApLCBuID0gbi5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXQodCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL3dlYWtNYXAuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JykuV2Vha01hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCBhID0gRGF0ZS5ub3coKSAlIDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gJ19fc3QnICsgKDEwMDAwMDAwMDAgKiBNYXRoLnJhbmRvbSgpID4+PiAwKSArIGErKyArICdfXyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbdGhpcy5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBuWzBdID09PSBlID8gblsxXSA9IHQgOiBpKGUsIHRoaXMubmFtZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodCA9IGVbdGhpcy5uYW1lXSkgJiYgdFswXSA9PT0gZSA/IHRbMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3RoaXMubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIXQgfHwgdFswXSAhPT0gZSB8fCAodFswXSA9IHRbMV0gPSB1bmRlZmluZWQsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3RoaXMubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiB0WzBdID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL21hdGNoZXNQcm9wZXJ0aWVzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4oJy4vLi4vLi4vaGVscGVycy90ZXh0TWF0Y2gnKSwgYSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0B0ZXh0JyA9PT0gdCB8fCAnaW5uZXJUZXh0JyA9PT0gdCA/IGUudGV4dENvbnRlbnQgfHwgZS5pbm5lclRleHQgOiB0IGluIGUgPyBlW3RdIDogZS5nZXRBdHRyaWJ1dGUgPyBlLmdldEF0dHJpYnV0ZSh0KSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgZS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhKHIsIGUubmFtZSksIG4gPSBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKSA6IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9tYXRjaGVzU2VsZWN0b3IuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5tYXRjaGVzIHx8IGUubXNNYXRjaGVzU2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxvZ2dlci53YXJuKCdNYXRjaGluZyBlbGVtZW50IGZhaWxlZC4gJyArIHQgKyAnIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yLicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvaGVscGVycy90ZXh0TWF0Y2guanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgQXJndW1lbnQ6IFBhdHRlcm4gaXMgbm90IHByZXNlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAoJ3N0cmluZycgPT0gdHlwZW9mIHQgPyBlID09PSB0IDogdCBpbnN0YW5jZW9mIFJlZ0V4cCAmJiB0LnRlc3QoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQMGZlNmIxYjMxNzBiNDE0ZTkyZThmN2FkNGY3NGY4NTcvJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjInOiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdBZG9iZSBUYXJnZXQgdjInLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLXRhcmdldC12Mi9saWIvbG9hZFRhcmdldC5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsb2FkLXRhcmdldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0xvYWQgVGFyZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYyhmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA/IGUudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKG4uYWJvcnQgPSAhMCksIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBjKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBiLnRhcmdldFNldHRpbmdzLnRpbWVvdXQpLCByID0gZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRldGFpbCAmJiAhMCA9PT0gZS5kZXRhaWwucmVkaXJlY3QgPyB0KCEwKSA6IHQoITEpLCBjbGVhclRpbWVvdXQobiksIGcocywgZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoITEpLCBjbGVhclRpbWVvdXQobiksIGcocywgZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcChzLCBfLCByKSwgcChzLCBDLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgcyA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGMgPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIHUgPSBuKCcuL21vZHVsZXMvbG9hZC10YXJnZXQnKSwgbCA9IHUuaW5pdExpYnJhcnlTZXR0aW5ncywgZCA9IHUub3ZlcnJpZGVQdWJsaWNBcGksIGYgPSBuKCcuL21vZHVsZXMvZXZlbnQtdXRpbCcpLCBwID0gZi5hZGRFdmVudExpc3RlbmVyLCBnID0gZi5yZW1vdmVFdmVudExpc3RlbmVyLCBtID0gbignLi9tb2R1bGVzL29wdGluJyksIGggPSBtLnNob3VsZFVzZU9wdEluLCB2ID0gbS5pc1RhcmdldEFwcHJvdmVkLCBiID0gbignLi90YXJnZXRTZXR0aW5ncycpLmV4dGVuc2lvblNldHRpbmdzLCB5ID0gci5nZXRTaGFyZWRNb2R1bGUoJ2Fkb2JlLWFuYWx5dGljcycsICdhdWdtZW50LXRyYWNrZXInKSwgXyA9ICdhdC1yZXF1ZXN0LXN1Y2NlZWRlZCcsIEMgPSAnYXQtcmVxdWVzdC1mYWlsZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5lbmFibGVkID8gKCgwLCBuKCcuL21vZHVsZXMvbGlicy9hdC1sYXVuY2gnKS5pbml0KShvLCBzLCBlKSwgaCgpICYmICF2KCkgfHwgYSh5KSkgOiBkKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL2ZpcmVQYWdlTG9hZC5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmaXJlLXBhZ2UtbG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0ZpcmUgUGFnZSBMb2FkIFJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hZG9iZSAmJiBhLmFkb2JlLnRhcmdldCAmJiBhLmFkb2JlLnRhcmdldC5WRVJTSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCBvID0gbignLi9tb2R1bGVzL2xpYnMvYXQtbGF1bmNoJyksIHMgPSBvLmluaXRDb25maWcsIGMgPSBvLmluaXREZWxpdmVyeSwgdSA9IG4oJy4vbW9kdWxlcy9wYWdlLWxvYWQnKSwgbCA9IG4oJy4vbWVzc2FnZXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoKSA/IChzKHQpLCBjKCkpIDogYS5jb25zb2xlICYmIHIubG9nZ2VyLndhcm4obC5OT19SRVFVRVNUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9hZGRQYWdlTG9hZFBhcmFtcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhZGQtcGFnZS1sb2FkLXBhcmFtcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0FkZCBQYXJhbXMgdG8gUGFnZSBMb2FkIFJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4vbW9kdWxlcy9wYXJhbXMtc3RvcmUnKS5tZXJnZVBhZ2VMb2FkUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZS5wYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL21vZHVsZXMvbG9hZC10YXJnZXQuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY29tcGF0TW9kZSwgbiA9IGUuZG9jdW1lbnRNb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnQ1NTMUNvbXBhdCcgPT09IHQgJiYgKCFuIHx8IDkgPD0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkb2JlID0gZS5hZG9iZSB8fCB7fSwgZS5hZG9iZS50YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9mZmVyOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2ZmZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlPZmZlcjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5T2ZmZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbnM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0V2ZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclZpZXc6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckV4dGVuc2lvbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5tYm94Q3JlYXRlID0gdCwgZS5tYm94RGVmaW5lID0gdCwgZS5tYm94VXBkYXRlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRvYmUgJiYgYy5hZG9iZS50YXJnZXQgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGMuYWRvYmUudGFyZ2V0LmdldE9mZmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbygpID8gKHIubG9nZ2VyLndhcm4oZC5BTFJFQURZX0lOSVRJQUxJWkVEKSwgbnVsbCkgOiAobS5tYm94UGFyYW1zID0gcCgpLCBtLmdsb2JhbE1ib3hQYXJhbXMgPSBnKCksIGgobSwgYy50YXJnZXRHbG9iYWxTZXR0aW5ncyB8fCB7fSwgYiksIGgobSwgdiB8fCB7fSwgWyd2ZXJzaW9uJ10pLCBpKHUpIHx8IChtLmVuYWJsZWQgPSAhMSwgci5sb2dnZXIud2FybihkLkRFTElWRVJZX0RJU0FCTEVEKSksIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpLCB1ID0gbignQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKSwgbCA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgZCA9IG4oJy4uL21lc3NhZ2VzJyksIGYgPSBuKCcuL3BhcmFtcy1zdG9yZScpLCBwID0gZi5nZXRQYXJhbXMsIGcgPSBmLmdldFBhZ2VMb2FkUGFyYW1zLCBtID0gbignLi4vdGFyZ2V0U2V0dGluZ3MnKS50YXJnZXRTZXR0aW5ncywgaCA9IG4oJy4vb2JqZWN0LW92ZXJyaWRlJyksIHYgPSBuKCcuLi9saWJyYXJ5U2V0dGluZ3MnKS5UQVJHRVRfREVGQVVMVF9TRVRUSU5HUywgYiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmFibGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGllbnRDb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXNPcmdJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyRG9tYWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb29raWVEb21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRDb250ZW50SGlkZGVuU3R5bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRDb250ZW50VmlzaWJsZVN0eWxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib2R5SGlkZGVuU3R5bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvZHlIaWRpbmdFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWxlY3RvcnNQb2xsaW5nVGltZW91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlzaXRvckFwaVRpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ292ZXJyaWRlTWJveEVkZ2VTZXJ2ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ292ZXJyaWRlTWJveEVkZ2VTZXJ2ZXJUaW1lb3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRvdXRFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpbkVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlY3VyZU9ubHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1cHBsZW1lbnRhbERhdGFJZFBhcmFtVGltZW91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yaW5nU2NyaXB0VXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmxTaXplTGltaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuZHBvaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlTG9hZEVuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZXdzRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5hbHl0aWNzTG9nZ2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyU3RhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbE1ib3hOYW1lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdExpYnJhcnlTZXR0aW5nczogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVQdWJsaWNBcGk6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9tb2R1bGVzL2V2ZW50LXV0aWwuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkZEV2ZW50TGlzdGVuZXIodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL21vZHVsZXMvb3B0aW4uanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgPT09ICh2b2lkIDAgPT09IGUgPyAndW5kZWZpbmVkJyA6IGwoZSkpIHx8IG51bGwgPT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZvaWQgMCA9PT0gZSA/ICd1bmRlZmluZWQnIDogbChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgKCdvYmplY3QnID09PSB0IHx8ICdmdW5jdGlvbicgPT09IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZVttXSkgJiYgaShlW2ZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQgJiYgIXIoZSkgJiYgIXIoZVtnXSkgJiYgYShlW2ddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2ZdKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGRbZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIGVbaF1bdl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGJbcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JykuYWRvYmUsIGYgPSAnaXNBcHByb3ZlZCcsIHAgPSAnb3B0aW5FbmFibGVkJywgZyA9ICdvcHRJbicsIG0gPSAnZmV0Y2hQZXJtaXNzaW9ucycsIGggPSAnQ2F0ZWdvcmllcycsIHYgPSAnVEFSR0VUJywgYiA9IG4oJy4uL3RhcmdldFNldHRpbmdzJykudGFyZ2V0U2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVc2VPcHRJbjogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUYXJnZXRBcHByb3ZlZDogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL3RhcmdldFNldHRpbmdzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKSwgYSA9IGkudGFyZ2V0U2V0dGluZ3MgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25TZXR0aW5nczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2V0dGluZ3M6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9tb2R1bGVzL2xpYnMvYXQtbGF1bmNoLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgJ2RlZmF1bHQnIGluIGUgPyBlWydkZWZhdWx0J10gOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChlLCBOdW1iZXIobikgfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhsLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHR0ID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gZSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSBuLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAoJ29iamVjdCcgPT09IHQgfHwgJ2Z1bmN0aW9uJyA9PT0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFkKGUpICYmIHMoZSkgPT09IHZsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlKSA/IGUgOiBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoZSkgPyBbXSA6IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcodCkgPyBbXSA6IChtbCh0KSA/IF9sIDogQ2wpKGYoZSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5sZW5ndGggPyBlWzBdIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoZSkgPyBbXSA6IFtdLmNvbmNhdC5hcHBseShbXSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gdGhpcywgcyA9IGEgPyBhLmxlbmd0aCA6IDAsIGUgPSBzOyBlIC09IDE7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGFbZV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCB0ID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheSh0KSwgciA9IDA7IHIgPCB0OyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzID8gYVtlXS5hcHBseShvLCBuKSA6IG5bMF07IChlICs9IDEpIDwgczspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGFbZV0uY2FsbChvLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh0KSB8fCAobWwodCkgPyBibCA6IHlsKShmKGUpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGUgJiYgJ29iamVjdCcgPT09IHR0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlIHx8ICFtbChlKSAmJiBfKGUpICYmIHMoZSkgPT09IHhsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgbiA9IGUubGVuZ3RoLCByID0gMDsgciA8IG47IHIgKz0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA8PCA1KSAtIHQgKyBlLmNoYXJDb2RlQXQocikgJiA0Mjk0OTY3Mjk1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgZSAmJiAtMSA8IGUgJiYgZSAlIDEgPT0gMCAmJiBlIDw9IGtsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiBrKGUubGVuZ3RoKSAmJiAhdShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFbChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIG4gPSBlLmxlbmd0aCwgciA9IEFycmF5KG4pOyB0IDwgbjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW3RdID0gZVt0XSwgdCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNwbGl0KCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUpID8gW10gOiBFKGUpID8gQyhlKSA/IEQoZSkgOiB3KGUpIDogSShwKGUpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFKGUpICYmIChtbChlKSB8fCBDKGUpIHx8IHUoZS5zcGxpY2UpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJbC5jYWxsKGUsIHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoZSkgPyAnJyA6IHdsLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhlKSA/ICFUKGUpIDogUyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghXyhlKSB8fCBzKGUpICE9PSBEbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBQbC5jYWxsKHQsICdjb25zdHJ1Y3RvcicpICYmIHQuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBuICYmIG4gaW5zdGFuY2VvZiBuICYmIFRsLmNhbGwobikgPT09IE9sOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8oZSkgJiYgMSA9PT0gZS5ub2RlVHlwZSAmJiAhaihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgZSB8fCBfKGUpICYmIHMoZSkgPT09IExsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1sKHQpID8gdC5qb2luKGUgfHwgJycpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyh0KSA/IFtdIDogKG1sKHQpID8gRWwgOiBNbCkoZihlKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKG4pID8gdCA6IChtbChuKSA/IFZsIDogUmwpKGYoZSksIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBVKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gZSA/IGUgOiBGbC5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAodCkgPyBbXSA6IHQuc3BsaXQoZSB8fCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqICh0IC0gZSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBOKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKG4gKyB6KDAsIDE2KSkgJSAxNiB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IE1hdGguZmxvb3IobiAvIDE2KSwgKCd4JyA9PT0gZSA/IHQgOiAzICYgdCB8IDgpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFcodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W3FmXSAmJiAoZyhuW1hmXSkgfHwgKHRbRHBdID0gbltYZl0pLCB5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKG5bZV0pIHx8ICh0W2VdID0gbltlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZG9jdW1lbnRNb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgMTAgPD0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jb21wYXRNb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnQ1NTMUNvbXBhdCcgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2cudGVzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gVShxKCcuJywgZSkpLCBuID0gdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAzIDw9IG4gJiYgdWcudGVzdCh0WzFdKSA/IHRbMl0gKyAnLicgKyB0WzFdICsgJy4nICsgdFswXSA6IDEgPT09IG4gPyB0WzBdIDogdFsxXSArICcuJyArIHRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFEoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmxvY2F0aW9uLnByb3RvY29sID09PSBzZyB8fCAociA9IEsoZS5sb2NhdGlvbi5ob3N0bmFtZSkpLCBuW2xwXSA9IHIsIG5bcWZdID0gWSh0KSAmJiBHKHQpLCBXKG4sIGVbeHBdIHx8IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFEoY2wsIHVsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjbC5sb2NhdGlvbi5wcm90b2NvbCA9PT0gc2c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZyA9IGxsKHt9LCBlKSlbWmZdID0gZVtaZl0gLyAxMDAwLCBsZ1tlcF0gPSBlW2VwXSAvIDEwMDAsIGxnW3VwXSA9IGxnW29wXSB8fCB0ID8gJ2h0dHBzOicgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBaKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5lKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhnW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhnW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZy5ocmVmID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmZyhtZy5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucXVlcnlLZXkgPSBKKHQucXVlcnkpLCBoZ1tlXSA9IHQsIGhnW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGllKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBxKCcjJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKHQpIHx8IHQubGVuZ3RoIDwgMyA/IG51bGwgOiBpc05hTihwYXJzZUludCh0WzJdLCAxMCkpID8gbnVsbCA6IHJlKGVlKHRbMF0pLCBlZSh0WzFdKSwgTnVtYmVyKHRbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUChlKSA/IFtdIDogcSgnfCcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBSKGllLCBhZSh2ZyhfZykpKSwgdCA9IE1hdGguY2VpbChOKCkgLyAxMDAwKSwgbiA9IGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUpICYmIHQgPD0gZS5leHBpcmVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3QubmFtZV0gPSB0LCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSwgbShuLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBvZSgpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh0KSA/IHQudmFsdWUgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVignIycsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlKGUubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZShlLnZhbHVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwaXJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5leHBpcmVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUih1ZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShudWxsLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEEoZSksIHIgPSBNYXRoLmFicygxMDAwICogbGUobikgLSBOKCkpLCBpID0gVignfCcsIFIoY2UsIG4pKSwgYSA9IG5ldyBEYXRlKE4oKSArIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZyhfZywgaSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUubmFtZSwgbiA9IGUudmFsdWUsIHIgPSBlLmV4cGlyZXMsIGkgPSBlLmRvbWFpbiwgYSA9IG9lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbdF0gPSByZSh0LCBuLCBNYXRoLmNlaWwociArIE4oKSAvIDEwMDApKSwgZGUoYSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpsKHZnKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2UoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEooZS5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwoblt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1lKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZShlLnJlZmVycmVyKS5xdWVyeUtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFnKG4pICYmIGpsKG5bdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwZShuKSB8fCBnZShlLCBuKSB8fCBtZSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdmUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbnQoKVtscF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnKHhkLCBrZCwgeyBkb21haW46IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdmcoeGQpID09PSBrZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlnKHhkKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYmUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZShjbCwgdWwsIF9kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudCgpW3FmXSAmJiB2ZSgpICYmICFiZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlKGNsLCB1bCwgeWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlKGNsLCB1bCwgQ2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4ZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jb25zb2xlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcobikgJiYgdShuW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga2UoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY29uc29sZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGUoZSwgJ3dhcm4nKSAmJiBuLndhcm4uYXBwbHkobiwgW0NnXS5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5jb25zb2xlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZShlLCAnZGVidWcnKSAmJiBfZSgpICYmIG4uZGVidWcuYXBwbHkobiwgW0NnXS5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBJZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIG4gPSAwOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2UoY2wsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSksIG4gPSAwOyBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWUoY2wsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBEZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IG5bdF0sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9LCBkZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFlKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW0NwXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbQ3BdID0gciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSByLnB1c2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW0tmXSA9IHhnLCByW2JwXSA9IERlKHQpLCByW3lwXSA9IFtdLCByW19wXSA9IFtdLCByLnB1c2ggPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW19wXS5wdXNoKGxsKHsgdGltZXN0YW1wOiBOKCkgfSwgZSkpLCBpLmNhbGwodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNlKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9PT0gX3AgJiYgZVtDcF0ucHVzaChuKSwgciAmJiB0ICE9PSBfcCAmJiBlW0NwXVt0XS5wdXNoKGxsKHsgdGltZXN0YW1wOiBOKCkgfSwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWUoY2wsIG50KCksIF9lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlKGNsLCBfcCwgZSwgX2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE9lKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2UoY2wsIHlwLCBlLCBfZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gamUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KEVnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1bC5jcmVhdGVUZXh0Tm9kZSgnJyksIHQgPSBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPSAwIDwgZS50ZXh0Q29udGVudC5sZW5ndGggPyAnJyA6ICdhJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBuLmxlbmd0aCwgdCA9IDA7IHQgPCBlOyB0ICs9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zcGxpY2UoMCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm9ic2VydmUoZSwgeyBjaGFyYWN0ZXJEYXRhOiAhMCB9KSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChlKSwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBWZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGtnKCc8c2NyaXB0PicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5vbigncmVhZHlzdGF0ZWNoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm9uKCdyZWFkeXN0YXRlY2hhbmdlJywgbnVsbCksIHQucmVtb3ZlKCksIHQgPSBudWxsLCBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwga2codWwuZG9jdW1lbnRFbGVtZW50KS5hcHBlbmQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZSgpID8gcGwuX3NldEltbWVkaWF0ZUZuKE1lKCkpIDogLTEgIT09IGNsLm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSAxMCcpICYmIHBsLl9zZXRJbW1lZGlhdGVGbihWZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRmUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHBsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbC5yZXNvbHZlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbC5yZWplY3QoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFVlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1sKGUpID8gcGwucmFjZShlKSA6IEJlKG5ldyBUeXBlRXJyb3IoSWcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWwoZSkgPyBwbC5hbGwoZSkgOiBCZShuZXcgVHlwZUVycm9yKElnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHplKGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQobmV3IEVycm9yKHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYShpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEhlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcoZVtXcF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbV3BdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyh0W0dwXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtHcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KG5bWHBdKSAmJiB1KG5bWXBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV2UoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0ICYmIEhlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSGUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtXcF1bR3BdLCByID0gKGVbV3BdW0dwXVtLcF0gfHwge30pW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltZcF0ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFllKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFIZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZSghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtXcF1bR3BdLCByID0gKGVbV3BdW0dwXVtLcF0gfHwge30pW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bWHBdKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW1lwXShyKSA/IGUoITApIDogdChacCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudCgpW0pwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdlKGNsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gS2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHZShjbCwgUXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBRZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdlKGNsLCAkcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWWUoY2wsIFFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSmUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKKGNsLmxvY2F0aW9uLnNlYXJjaClbcHBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBaZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGhwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiB0W2VwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogdFtscF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGV0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWGUoKSAmJiAhS2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudCgpLCB0ID0gSmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpsKHQpID8gWmUodCwgZSkgOiBQKHNlKGhwKSkgJiYgWmUod2csIGUpLCBzZShocCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJ0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBncCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogdFtaZl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHRbbHBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlKGdwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYXQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBEZy5leGVjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyh0KSB8fCAyICE9PSB0Lmxlbmd0aCA/ICcnIDogdFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbnQoKVtycF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdmcobXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUChlKSA/ICcnIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3QoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0W3JwXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W2xwXSwgciA9IG5ldyBEYXRlKE4oKSArIHRbaXBdKSwgaSA9IHZnKG1wKSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqbChpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZyhtcCwgaSwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGF0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAobykgfHwgYmcobXAsIG8sIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGN0KGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IHQgfHwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmluaXRDdXN0b21FdmVudChlLCB0LmJ1YmJsZXMsIHQuY2FuY2VsYWJsZSwgdC5kZXRhaWwpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUoZS5DdXN0b21FdmVudCkgfHwgKHQucHJvdG90eXBlID0gZS5FdmVudC5wcm90b3R5cGUsIGUuQ3VzdG9tRXZlbnQgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdXQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUoKSwgciA9IHQoKSwgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5zZXNzaW9uSWQgPSBuLCBqbChyKSAmJiAoaS5kZXZpY2VJZCA9IHIpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsdChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IGUuQ3VzdG9tRXZlbnQobiwgeyBkZXRhaWw6IHIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZGlzcGF0Y2hFdmVudChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZHQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQubWJveCwgciA9IHQuZXJyb3IsIGkgPSB0LnVybCwgYSA9IHQuYW5hbHl0aWNzRGV0YWlscywgbyA9IHQucmVzcG9uc2VUb2tlbnMsIHMgPSB0LmV4ZWN1dGlvbiwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nOiB1dChldCwgaXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhuKSB8fCAoYy5tYm94ID0gbiksIGcocikgfHwgKGMuZXJyb3IgPSByKSwgZyhpKSB8fCAoYy51cmwgPSBpKSwgUyhhKSB8fCAoYy5hbmFseXRpY3NEZXRhaWxzID0gYSksIFMobykgfHwgKGMucmVzcG9uc2VUb2tlbnMgPSBvKSwgUyhzKSB8fCAoYy5leGVjdXRpb24gPSBzKSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZHQoQWcsIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQoY2wsIHVsLCBBZywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkdChTZywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0KGNsLCB1bCwgU2csIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBndChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZHQoVGcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnJlZGlyZWN0ID0gdCwgbHQoY2wsIHVsLCBUZywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG10KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkdChQZywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0KGNsLCB1bCwgUGcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBodChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZHQoT2csIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdChjbCwgdWwsIE9nLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdnQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGR0KGpnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQoY2wsIHVsLCBqZywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkdChMZywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx0KGNsLCB1bCwgTGcsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5dChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZHQoTWcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdChjbCwgdWwsIE1nLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX3QoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGR0KFZnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHQoY2wsIHVsLCBWZywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEN0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmNoYXJBdCgwKSwgbiA9IGUuY2hhckF0KDEpLCByID0gZS5jaGFyQXQoMiksIGkgPSB7IGtleTogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS52YWwgPSAnLScgPT09IG4gPyAnJyArIHQgKyBuICsgJ1xcMycgKyByICsgJyAnIDogdCArICdcXDMnICsgbiArICcgJywgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUubWF0Y2goQmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyh0KSA/IGUgOiBCKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKHQua2V5LCB0LnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUsIFIoQ3QsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3QoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCBuLCByLCBpLCBhID0gW10sIG8gPSBUKGUpLCBzID0gby5pbmRleE9mKFJnKTsgLTEgIT09IHM7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFQoby5zdWJzdHJpbmcoMCwgcykpLCBpID0gKG4gPSBUKG8uc3Vic3RyaW5nKHMpKSkuaW5kZXhPZihGZyksIHIgPSBUKG4uc3Vic3RyaW5nKE5nLCBpKSksIHMgPSAobyA9IFQobi5zdWJzdHJpbmcoaSArIDEpKSkuaW5kZXhPZihSZyksIHQgJiYgciAmJiBhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcTogTnVtYmVyKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8gJiYgYS5wdXNoKHsgc2VsOiBvIH0pLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUMoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2coZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtMSA9PT0gdC5pbmRleE9mKFJnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBrdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5zZWwsIHIgPSB0LmVxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBlLmZpbmQobiksIE0ocikgJiYgKGUgPSBlLmVxKHIpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwga2codWwpLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSXQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IEV0KGUpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd3QoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2coJzwnICsgTmQgKyAnLz4nKS5hcHBlbmQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIER0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdChlKS5wcmV2KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFN0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV0KGUpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQoZSkucGFyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV0KHQpLmlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5maW5kKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdChlKS5jaGlsZHJlbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xbemddID0gY2xbemddIHx8IHt9LCBjbFt6Z10ucXVlcnlTZWxlY3RvckFsbCA9IEV0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbVnBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xbemddW1dnXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVsLmFkZEV2ZW50TGlzdGVuZXIoamQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGNsW3pnXVtIZ10pICYmIGNsW3pnXVtIZ10oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUnQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudCgpW2NwXSwgdCA9IGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSBmdW5jdGlvbiBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoVWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShxZyksIGdsKGUpLnRoZW4odClbJ2NhdGNoJ10obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRnQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZSwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTih0KSA/IG51bGwgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxKEpnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVXQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHEoSmcsIGUpLCBuID0gTnQodFswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWN0aXZpdHlJbmRleCA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gTnQodFsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGkpIHx8IChyLmV4cGVyaWVuY2VJbmRleCA9IGkpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKFpnLCBSKFV0LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHp0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1sKGUpID8gcXQoZSkgOiBxdChbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBIdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gSihlKSwgbiA9IHRbWWddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnRva2VuID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0W0tnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamwoaSkgJiYgaSA9PT0ga2QgJiYgKHIubGlzdGVkQWN0aXZpdGllc09ubHkgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdFtRZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsKGEpICYmIChyLmV2YWx1YXRlQXNUcnVlQXVkaWVuY2VJZHMgPSBCdChhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdFskZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsKG8pICYmIChyLmV2YWx1YXRlQXNGYWxzZUF1ZGllbmNlSWRzID0gQnQobykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRbWGddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhzKSB8fCAoci5wcmV2aWV3SW5kZXhlcyA9IHp0KHMpKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV3QoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEh0KGUubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBEYXRlKE4oKSArIDE4NjAwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmcoR2csIEpTT04uc3RyaW5naWZ5KHQpLCB7IGV4cGlyZXM6IG4gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gR3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdmcoR2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWXQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQoZSkuZW1wdHkoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWHQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQodCkuYWZ0ZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEt0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV0KHQpLmJlZm9yZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUXQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQodCkuYXBwZW5kKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAkdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5wcmVwZW5kKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5odG1sKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBadChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdChlKS5odG1sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV0KHQpLnRleHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8JyArIFZkICsgJyAnICsgUGQgKyAnPSInICsgZSArICciICcgKyBPZCArICc9IicgKyBOZiArICciPicgKyB0ICsgJzwvJyArIFZkICsgJz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBubihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0bihlbSArIHgodCksIHQgKyAnIHsnICsgZSArICd9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRuKHJtLCB0ICsgJyB7JyArIGUgKyAnfScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gZVtKZl0gJiYgIUl0KG5tKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlWyRmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF0KHRuKHRtLCB0KSwgTGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgPT09IGVbSmZdICYmIEl0KG5tKSAmJiBZdChubSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUl0KCcjJyArIChlbSArIHgoZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gbShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUyhyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZVtRZl0sIGEgPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBubihpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdChWKCdcbicsIFIoYSwgcikpLCBMZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY24oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKHQpIHx8IEl0KCcjJyArIHJtKSB8fCBRdChybihlW1FmXSwgVignLCAnLCB0KSksIExkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuKG50KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24obnQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc24obnQoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24obnQoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWXQoJyMnICsgKGVtICsgeChlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnIycgKyBybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQoZSkgJiYgWXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFnKGVbUGRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcoZVtBcF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2bihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Vua25vd24nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2F1dGhlbnRpY2F0ZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2xvZ2dlZF9vdXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmtub3duJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBibihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtbihlKSB8fCBobihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geW4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGVbbG1dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW2xtXSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh0KSA/IEIoZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltUcF0gPSBuLCBtbih0KSAmJiAocltQZF0gPSB0W1BkXSksIGhuKHQpICYmIChyW1NwXSA9IHZuKHRbQXBdKSksIGUucHVzaChyKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10sIG0oYm4sIHQpKSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUpID8gbnVsbCA6IHUoZVt1bV0pID8gZVt1bV0odCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcobikgPyBudWxsIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geG4oZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyhlW3BtXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGVbcG1dW2dtXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlW3BtXVtnbV0odCwgeyBzZGlkUGFyYW1FeHBpcnk6IG4gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKHIpICYmIHUoclttbV0pICYmIHJbbW1dKCkgPyByIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga24oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUoZS5nZXRWaXNpdG9yVmFsdWVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZSh7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIG4ucHVzaChjbSksIEZlKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFZpc2l0b3JWYWx1ZXMoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRW4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2Uodm0sIGUpLCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSW4oZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhlKSA/IE5lKHt9KSA6IHplKGtuKGUsIG4pLCB0LCBobSlbJ2NhdGNoJ10oRW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3bihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdShlLmdldFZpc2l0b3JWYWx1ZXMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIG4ucHVzaChjbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFZpc2l0b3JWYWx1ZXMoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbChyLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIERuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoZSkgPyB7fSA6IHduKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudCgpLCB0ID0gZVtIZl0sIG4gPSBlW3NwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhuKGNsLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gU24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gQW4oKSwgdCA9IG50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbihlLCB0W25wXSwgdFthcF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERuKEFuKCksIG50KClbYXBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5bihBbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gT24oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX24oQW4oKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGpuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENuKEFuKCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtW2VdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTW4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm1bZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFZuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3hwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFtFcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFtbChuKSB8fCBTKG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUm4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbU2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUModCkgfHwgUyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW0tmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDKG4pIHx8IFMobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZVtHZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFnKHIpICYmICFNKHIpIHx8ICF1KGVbUmZdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZlKGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyhlKSA/IG4odCkgOiByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBObihlLCB0LCBuLCByLCBpLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bZV0gPSB0LCBvW25dID0gciwgb1tpXSA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2twXSA9IG8sIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEJuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW1NmXSwgciA9IGVbS2ZdLCB0ID0gZVtHZl0gfHwgQ207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6ZShGbihlW1JmXSksIHQsIF9tKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE5uKFNmLCBuLCBLZiwgciwgUGYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHltLCBFZiwgdCksIE9lKHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBObihTZiwgbiwgS2YsIHIsIF9mLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZSh5bSwgX2YsIHQpLCBPZSh0KSwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBVbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMbihFcCwgdCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHFuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZuKGUpID8gcWUoUihCbiwgbShSbiwgZVt4cF1bRXBdKSkpLnRoZW4oVW4pIDogTmUoe30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB6bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBNbihFcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUpID8ge30gOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBIbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFuKGNsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gSihlLmxvY2F0aW9uLnNlYXJjaClbeG1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUCh0KSA/IG51bGwgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB2ZyhrbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQKGUpID8gbnVsbCA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFhuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEduKGNsKSwgdCA9IFluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIHx8IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEtuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFTKGUpICYmIDIgPT09IGUubGVuZ3RoICYmIGpsKGVbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBRbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gdCA/IFtdIDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdWJzdHIoMCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnN1YnN0cih0ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJG4oZSwgbiwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGUpID8gKG4ucHVzaCh0KSwgJG4oZSwgbiwgciwgaSksIG4ucG9wKCkpIDogUyhuKSA/IHJbaSh0KV0gPSBlIDogcltpKFYoJy4nLCBuLmNvbmNhdCh0KSkpXSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEooZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBabihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtlZShUKHRbMF0pKV0gPSBlZShUKHRbMV0pKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30sIG0oS24sIEIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnB1c2goUW4odCkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSwgbShqbCwgZSkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVyKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcodCkgPyAkbihlLCBbXSwgbiwgbCkgOiAkbihlLCBbXSwgbiwgdCksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcodCkgPyB7fSA6IG1sKHQpID8gWm4odCkgOiBDKHQpICYmIGpsKHQpID8gSm4odCkgOiBkKHQpID8gZXIodCkgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbnIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGwoe30sIGUsIHRyKGNsLnRhcmdldFBhZ2VQYXJhbXNBbGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcnIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGwoe30sIGUsIHRyKGNsLnRhcmdldFBhZ2VQYXJhbXMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG50KCksIG4gPSB0W1lmXSwgciA9IHRbZHBdLCBpID0gdFtmcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICE9PSBlID8gbnIociB8fCB7fSkgOiBsbChucihyIHx8IHt9KSwgcnIoaSB8fCB7fSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1bC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKSwgdCA9IGUuZ2V0Q29udGV4dCgnd2ViZ2wnKSB8fCBlLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuZ2V0RXh0ZW5zaW9uKCdXRUJHTF9kZWJ1Z19yZW5kZXJlcl9pbmZvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5nZXRQYXJhbWV0ZXIobi5VTk1BU0tFRF9SRU5ERVJFUl9XRUJHTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHIpID8gbnVsbCA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9yKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNsLmRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjbC5zY3JlZW4sIG4gPSB0LnN5c3RlbVhEUEksIHIgPSB0LmxvZ2ljYWxYRFBJOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcobikgJiYgIWcocikgJiYgciA8IG4gJiYgKGUgPSBuIC8gciksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGNsLnNjcmVlbiwgdCA9IGUub3JpZW50YXRpb24sIG4gPSBlLndpZHRoLCByID0gZS5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPCBuID8gJ2xhbmRzY2FwZScgOiAncG9ydHJhaXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyh0LnR5cGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gcSgnLScsIHQudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoYSkgPyBudWxsIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY3IoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gd207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSBlLmluZGV4T2YoSW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBEbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gQW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IFNtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBncihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBUbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gUG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IE9tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2cihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBscihlKSB8fCB1cihlKSB8fCBkcihlKSB8fCBmcihlKSB8fCBwcihlKSB8fCBncihlKSB8fCBtcihlKSB8fCBocihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYnIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJzdHJpbmcoSW0ubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt3bV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9yKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbRG1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBDcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW0FtXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtTbV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGtyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBSKFQsIHEoJywnLCBlW1RtXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbShqbCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEVyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbUG1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBJcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW09tXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd3IoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZyKG4pIHx8IChlW25dID0gZyh0KSA/ICcnIDogdCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFscihuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYnIobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUChyKSB8fCAoZVtyXSA9IGcodCkgPyAnJyA6IHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFyKGksIGEsIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAxMjIzID09PSBpLnN0YXR1cyA/IDIwNCA6IGkuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPCAxMDAgfHwgNTk5IDwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKG5ldyBFcnJvcihMbSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IEpTT04ucGFyc2UoaS5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbyhuZXcgRXJyb3IoVm0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpLmdldEFsbFJlc3BvbnNlSGVhZGVycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNyKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQobmV3IEVycm9yKExtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRyKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudGltZW91dCA9IHQsIGUub250aW1lb3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihuZXcgRXJyb3IoTW0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUHIobiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWwoZSkgJiYgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0UmVxdWVzdEhlYWRlcih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiBlICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE9yKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLnVybCwgaSA9IGUuaGVhZGVycywgYSA9IGUuYm9keSwgbyA9IGUudGltZW91dCwgcyA9IGUuYXN5bmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF82YjllZDc4YzQ4MjljZDk0ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfMjBlNmU4NWI5MmQwNDFmZiA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF82YjllZDc4YzQ4MjljZDk0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19mOGU5YTZkNjE3MmEzMTQ0LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMjBlNmU4NWI5MmQwNDFmZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfZjhlOWE2ZDYxNzJhMzE0NC5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiA9IFNyKG4gPSBBcihuLCBlLCB0KSwgdCkpLm9wZW4oam0sIHIsIHMpLCBuLndpdGhDcmVkZW50aWFscyA9ICEwLCBuID0gUHIobiwgaSksIHMgJiYgKG4gPSBUcihuLCBvLCB0KSksIG4uc2VuZChKU09OLnN0cmluZ2lmeShhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF82YjllZDc4YzQ4MjljZDk0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzZiOWVkNzhjNDgyOWNkOTQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yMGU2ZTg1YjkyZDA0MWZmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzIwZTZlODViOTJkMDQxZmYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlc3BvbnNlLCBuID0gdC5zdGF0dXMsIHIgPSB0Lm1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcobikgJiYgIWcocikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlW2NtXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihpbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTbigpLCB0ID0gSG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGhlbihqciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXbigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFZyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBudCgpW1lmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxsKHt9LCBlLCBpcih0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJyKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLW5ldyBEYXRlKCkuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRnIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gY2wuc2NyZWVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGUud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGUuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb246IHNyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckRlcHRoOiBlLmNvbG9yRGVwdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbFJhdGlvOiBvcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE5yKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHVsLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBlLmNsaWVudFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlLmNsaWVudEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IGNsLmxvY2F0aW9uLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ViR0xSZW5kZXJlcjogY3IoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBVcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogY2wubG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmluZ1VybDogdWwucmVmZXJyZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcoZSkgJiYgZS5jaGFubmVsID09PSBSbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChlIHx8IHt9KS5iZWFjb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6IGNsLm5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT2Zmc2V0SW5NaW51dGVzOiBScigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogUm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW46IEZyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IE5yKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyOiBCcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogVXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYWNvbjogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB6cihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRbb21dLCBpID0gcGFyc2VJbnQociwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05hTihpKSB8fCAobi5sb2NhdGlvbkhpbnQgPSBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0W2FtXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpsKGEpICYmIChuLmJsb2IgPSBhKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaWQsIG4gPSBlLmludGVncmF0aW9uQ29kZSwgciA9IGUuYXV0aGVudGljYXRlZFN0YXRlLCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqbCh0KSAmJiAoaS5pZCA9IHQpLCBqbChuKSAmJiAoaS5pbnRlZ3JhdGlvbkNvZGUgPSBuKSwgamwocikgJiYgKGkuYXV0aGVudGljYXRlZFN0YXRlID0gciksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdyKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFIoSHIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHcihlLCB0LCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsKHQpICYmIChhLnRudElkID0gdCksIGpsKG4pICYmIChhLnRoaXJkUGFydHlJZCA9IG4pLCBqbChlLnRoaXJkUGFydHlJZCkgJiYgKGEudGhpcmRQYXJ0eUlkID0gZS50aGlyZFBhcnR5SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHJbc21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwobykgJiYgKGEubWFya2V0aW5nQ2xvdWRWaXNpdG9ySWQgPSBvKSwgamwoZS5tYXJrZXRpbmdDbG91ZFZpc2l0b3JJZCkgJiYgKGEubWFya2V0aW5nQ2xvdWRWaXNpdG9ySWQgPSBlLm1hcmtldGluZ0Nsb3VkVmlzaXRvcklkKSwgUyhlLmN1c3RvbWVySWRzKSA/IFMoaSkgfHwgKGEuY3VzdG9tZXJJZHMgPSBXcihpKSkgOiBhLmN1c3RvbWVySWRzID0gZS5jdXN0b21lcklkcywgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWXIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9LCByID0genIoZS5hdWRpZW5jZU1hbmFnZXIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhyKSB8fCAobi5hdWRpZW5jZU1hbmFnZXIgPSByKSwgUyhlLmFuYWx5dGljcykgfHwgKG4uYW5hbHl0aWNzID0gZS5hbmFseXRpY3MpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyhlKSAmJiBqbChlLnRva2VuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9LCByID0gX3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqbChyKSAmJiAobi50b2tlbiA9IHIpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBLcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyhlKSAmJiBqbChlLmF1dGhvcml6YXRpb25Ub2tlbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgbiA9IFhuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqbChuKSAmJiAodC5hdXRob3JpemF0aW9uVG9rZW4gPSBuKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUXIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhlKSA/IEd0KCkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAkcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIG4gPSBDcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyhuKSB8fCAodC5pZCA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHhyKGUpLCBpID0gcGFyc2VGbG9hdChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOYU4oaSkgfHwgKHQudG90YWwgPSBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBrcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoYSkgfHwgKHQucHVyY2hhc2VkUHJvZHVjdElkcyA9IGEpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge30sIG4gPSBFcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyhuKSB8fCAodC5pZCA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IElyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhyKSB8fCAodC5jYXRlZ29yeUlkID0gciksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFpyKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fSwgciA9IGxsKHt9LCB3cih0KSwgZS5wYXJhbWV0ZXJzIHx8IHt9KSwgaSA9IGxsKHt9LCBEcih0KSwgZS5wcm9maWxlUGFyYW1ldGVycyB8fCB7fSksIGEgPSBsbCh7fSwgJHIodCksIGUub3JkZXIgfHwge30pLCBvID0gbGwoe30sIEpyKHQpLCBlLnByb2R1Y3QgfHwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhyKSB8fCAobi5wYXJhbWV0ZXJzID0gciksIFMoaSkgfHwgKG4ucHJvZmlsZVBhcmFtZXRlcnMgPSBpKSwgUyhhKSB8fCAobi5vcmRlciA9IGEpLCBTKG8pIHx8IChuLnByb2R1Y3QgPSBvKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZWkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuaW5kZXgsIHIgPSBlLm5hbWUsIGkgPSBlLmFkZHJlc3MsIGEgPSBacihlLCBsbCh7fSwgdCwgaXIocikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcobikgfHwgKGEuaW5kZXggPSBuKSwgamwocikgJiYgKGEubmFtZSA9IHIpLCBTKGkpIHx8IChhLmFkZHJlc3MgPSBpKSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdGkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubmFtZSwgciA9IGUuYWRkcmVzcywgaSA9IFpyKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwobikgJiYgKGkubmFtZSA9IG4pLCBTKHIpIHx8IChpLmFkZHJlc3MgPSByKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZXhlY3V0ZSwgciA9IHZvaWQgMCA9PT0gbiA/IHt9IDogbiwgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyhyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHIucGFnZUxvYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcoYSkgfHwgKGkucGFnZUxvYWQgPSBacihhLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gci5tYm94ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyhvKSAmJiBtbChvKSAmJiAhUyhvKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBtKEJtLCBSKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyhzKSB8fCAoaS5tYm94ZXMgPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUucHJlZmV0Y2gsIHIgPSB2b2lkIDAgPT09IG4gPyB7fSA6IG4sIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMocikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByLm1ib3hlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyhhKSB8fCAhbWwoYSkgfHwgUyhhKSB8fCAoaS5tYm94ZXMgPSBSKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSByLnZpZXdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhvKSB8fCAhbWwobykgfHwgUyhvKSB8fCAoaS52aWV3cyA9IFIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbykpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChYZSgpICYmICFRZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnQoKSwgciA9IE9uKGUpLCBpID0gam4oZG0pLCBhID0gam4oZm0pLCBvID0gdC5leHBlcmllbmNlQ2xvdWQsIHMgPSAodm9pZCAwID09PSBvID8ge30gOiBvKS5hbmFseXRpY3MsIGMgPSB2b2lkIDAgPT09IHMgPyB7fSA6IHMsIHUgPSBjLmxvZ2dpbmcsIGwgPSBjLnN1cHBsZW1lbnRhbERhdGFJZCwgZCA9IGMudHJhY2tpbmdTZXJ2ZXIsIGYgPSBjLnRyYWNraW5nU2VydmVyU2VjdXJlLCBwID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHUpID8gcC5sb2dnaW5nID0gbltlZ10gOiBwLmxvZ2dpbmcgPSB1LCBnKGwpIHx8IChwLnN1cHBsZW1lbnRhbERhdGFJZCA9IGwpLCBqbChyKSAmJiAocC5zdXBwbGVtZW50YWxEYXRhSWQgPSByKSwgZyhkKSB8fCAocC50cmFja2luZ1NlcnZlciA9IGQpLCBqbChpKSAmJiAocC50cmFja2luZ1NlcnZlciA9IGkpLCBnKGYpIHx8IChwLnRyYWNraW5nU2VydmVyU2VjdXJlID0gZiksIGpsKGEpICYmIChwLnRyYWNraW5nU2VydmVyU2VjdXJlID0gYSksIFMocCkgPyBudWxsIDogcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYWkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFZyKG4pLCBpID0gaXQoKSwgYSA9IHlyKHIpLCBvID0gUG4oKSwgcyA9IEdyKGUuaWQgfHwge30sIGksIGEsIHQsIG8pLCBjID0gWHIoZS5wcm9wZXJ0eSwgciksIHUgPSBZcihlLmV4cGVyaWVuY2VDbG91ZCB8fCB7fSwgdCksIGwgPSBLcihlLnRyYWNlKSwgZCA9IFFyKGUucWFNb2RlKSwgZiA9IG5pKGUsIHIpLCBwID0gcmkoZSwgciksIGcgPSBlLm5vdGlmaWNhdGlvbnMsIG0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0ucmVxdWVzdElkID0gSCgpLCBtLmNvbnRleHQgPSBxcihlLmNvbnRleHQpLCBTKHMpIHx8IChtLmlkID0gcyksIFMoYykgfHwgKG0ucHJvcGVydHkgPSBjKSwgUyhsKSB8fCAobS50cmFjZSA9IGwpLCBTKHUpIHx8IChtLmV4cGVyaWVuY2VDbG91ZCA9IHUpLCBTKGQpIHx8IChtLnFhTW9kZSA9IGQpLCBTKGYpIHx8IChtLmV4ZWN1dGUgPSBmKSwgUyhwKSB8fCAobS5wcmVmZXRjaCA9IHApLCBTKGcpIHx8IChtLm5vdGlmaWNhdGlvbnMgPSBnKSwgbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb2koZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5bMF0sIGkgPSBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWkoZSwgciwgbGwoe30sIGksIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2kodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTHIoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2kodCwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvaShlLCB0LCBNcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdWkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTSh0KSA/IHQgPCAwID8gZVtHZl0gOiB0IDogZVtHZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW1dmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlW3JwXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG90KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQKG4pID8gdCA6ICcnICsgRm0gKyBuICsgTm07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdXBdICsgJy8vJyArIGxpKGUpICsgZVtJcF0gKyAnPycgKyBaKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudDogZVt6Zl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IGV0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBlW0tmXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmkodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG50KCksIHIgPSBkaShuKSwgaSA9IGMoe30sIEZwLCBbTnBdKSwgYSA9IHVpKG4sIGUpLCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luYzogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShWZiwgdCksIE9lKHsgcmVxdWVzdDogdCB9KSwgT3IobykudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKE1mLCBlKSwgT2UoeyByZXNwb25zZTogZSB9KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IEVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2koZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBfZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1pKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhbWkoZSkgJiYgamwoZS5ldmVudFRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdmkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIVMoZSkgJiYgIVAoZS50eXBlKSAmJiBqbChlLmV2ZW50VG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXZpKGUpICYmIGpsKGUuc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5aShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQodCkgJiYgamwodC50bnRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9pKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWkodCkgJiYgcnQodC5pZC50bnRJZCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWkodCkgJiYgc3QodC5pZC50bnRJZCksIHN0KG51bGwpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4aShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIGUgIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9KS50cmFjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyh0KSB8fCBQZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga2koZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucmVzcG9uc2UsIG4gPSB0LmV4ZWN1dGUsIHIgPSB2b2lkIDAgPT09IG4gPyB7fSA6IG4sIGkgPSB0LnByZWZldGNoLCBhID0gdm9pZCAwID09PSBpID8ge30gOiBpLCBvID0gci5wYWdlTG9hZCwgcyA9IHZvaWQgMCA9PT0gbyA/IHt9IDogbywgYyA9IHIubWJveGVzLCB1ID0gdm9pZCAwID09PSBjID8gW10gOiBjLCBsID0gYS5tYm94ZXMsIGQgPSB2b2lkIDAgPT09IGwgPyBbXSA6IGwsIGYgPSBhLnZpZXdzLCBwID0gdm9pZCAwID09PSBmID8gW10gOiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geGkocyksIHkoeGksIHUpLCB5KHhpLCBkKSwgeSh4aSwgcCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEVpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnF1ZXJ5S2V5LCBuID0gdFtvaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQyhuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE1hdGgucm91bmQoTigpIC8gMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W29oXSA9IG4ucmVwbGFjZSgvXHxUUz1cZCsvLCAnfFRTPScgKyByKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSWkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5xdWVyeUtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd2koZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5lKGUpLCBpID0gci5wcm90b2NvbCwgYSA9IHIuaG9zdCwgbyA9IHIucGF0aCwgcyA9ICcnID09PSByLnBvcnQgPyAnJyA6ICc6JyArIHIucG9ydCwgYyA9IFAoci5hbmNob3IpID8gJycgOiAnIycgKyByLmFuY2hvciwgdSA9IG4ociksIGwgPSBaKGxsKHt9LCB1LCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgJzovLycgKyBhICsgcyArIG8gKyAoUChsKSA/ICcnIDogJz8nICsgbCkgKyBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBEaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aShlLCB0LCBFaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFpKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpKGUsIHQsIElpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gU2koZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UoZGYsIGUpLCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGxsKHt9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY29udGVudCA9IERpKHQsIHt9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW2ZoXSB8fCBsaCwgbiA9IGVbcGhdIHx8IFRpKHVoKSwgciA9IGVbZ2hdIHx8IHt9LCBpID0gZVttaF0gfHwgbnVsbCwgYSA9IGVbaGhdIHx8ICExLCBvID0gZVt2aF0gfHwgMzAwMCwgcyA9ICEhZyhlW2JoXSkgfHwgITAgPT09IGVbYmhdLCBjID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjW2ZoXSA9IHQsIGNbcGhdID0gbiwgY1tnaF0gPSByLCBjW21oXSA9IGksIGNbaGhdID0gYSwgY1t2aF0gPSBvLCBjW2JoXSA9IHMsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE9pKHIsIGksIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIub25sb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAxMjIzID09PSByLnN0YXR1cyA/IDIwNCA6IHIuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPCAxMDAgfHwgNTk5IDwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKG5ldyBFcnJvcihzaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByLnJlc3BvbnNlVGV4dCwgbiA9IHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gamkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChuZXcgRXJyb3Ioc2gpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTGkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50aW1lb3V0ID0gdCwgZS5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKG5ldyBFcnJvcihjaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNaShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gdCAmJiAoZS53aXRoQ3JlZGVudGlhbHMgPSB0KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVmkobiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnNldFJlcXVlc3RIZWFkZXIodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJpKHIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBQaShlKSwgaSA9IHRbZmhdLCBhID0gdFtwaF0sIG8gPSB0W2doXSwgcyA9IHRbbWhdLCBjID0gdFtoaF0sIHUgPSB0W3ZoXSwgbCA9IHRbYmhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHIuWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuID0gamkobiA9IE9pKG4sIGUsIHQpLCB0KSkub3BlbihpLCBhLCBsKSwgbiA9IFZpKG4gPSBNaShuLCBjKSwgbyksIGwgJiYgKG4gPSBMaShuLCB1LCB0KSksIG4uc2VuZChzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJpKGNsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTmkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcltmaF0gPSBsaCwgcltwaF0gPSBBaShlLCB0KSwgclt2aF0gPSBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyMDAgPD0gZSAmJiBlIDwgMzAwIHx8IDMwNCA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVWkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJpKGUuc3RhdHVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnR5cGUgPSBEZCwgbi5jb250ZW50ID0gdCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcWkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmkoTmkoZS5jb250ZW50LCB7fSwgbnQoKVt2aF0pKS50aGVuKFVpKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHppKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW1hsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0geWguZXhlYyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMobikgfHwgMiAhPT0gbi5sZW5ndGggPyAnJyA6IG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEhpKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KE5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5pbm5lckhUTUwgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4uZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHIpID8gdCA6IChyLmlkID0gZSwgci5vdXRlckhUTUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBXaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVtCbF0sIG4gPSB6aShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAobikgfHwgUCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGVbWGxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtYbF0gPSByLnJlcGxhY2UoX2gsICcnKSwgZVtCbF0gPSBIaShuLCB0KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gR2koZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcoZS5zZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFlpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFhpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEtpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFFpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICRpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEppKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFppKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHaShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFdpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh0W0JsXSkgPyB0IDogKHdlKGFmLCB0KSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdpKGUpID8gQyhlW0JsXSkgPyBlIDogKHdlKGFmLCBlKSwgbnVsbCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0YShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHaShlKSA/IGQoZVtCbF0pID8gZSA6ICh3ZShvZiwgZSksIG51bGwpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbmEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2koZSkgPyBDKGVbQmxdKSA/IGUgOiAod2UoZmYsIGUpLCBudWxsKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdpKGUpID8gZChlW0JsXSkgPyBlIDogKHdlKHNmLCBlKSwgbnVsbCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHaShlKSA/IGQoZVtCbF0pID8gZSA6ICh3ZShjZiwgZSksIG51bGwpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYWEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2koZSkgPyBkKGVbQmxdKSA/IGUgOiAod2UodWYsIGUpLCBudWxsKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9hKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdpKGUpID8gZSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdpKGUpID8gZChlW0JsXSkgPyBlIDogKHdlKGxmLCBlKSwgbnVsbCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUCh0KSA/ICh3ZShkZiwgZSksIG51bGwpIDogKGUuY29udGVudCA9IERpKHQsIHt9KSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW05sXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWWkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSmw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gS2koZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUWkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSmkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2EoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2EoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgY2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2EoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVtCbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWwodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFModCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBtKENoLCBSKHVhLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbGwoe30sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5jb250ZW50ID0gbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICgwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiBlICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSkub3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1sKHQpID8gUyh0KSA/IFtdIDogWG0oUigkbSwgdCkpIDogW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiBlICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSwgbiA9IHQuZXhlY3V0ZSwgciA9IHZvaWQgMCA9PT0gbiA/IHt9IDogbiwgaSA9IHQucHJlZmV0Y2gsIGEgPSB2b2lkIDAgPT09IGkgPyB7fSA6IGksIG8gPSByLnBhZ2VMb2FkLCBzID0gdm9pZCAwID09PSBvID8ge30gOiBvLCBjID0gci5tYm94ZXMsIHUgPSB2b2lkIDAgPT09IGMgPyBbXSA6IGMsIGwgPSBhLm1ib3hlcywgZCA9IHZvaWQgMCA9PT0gbCA/IFtdIDogbCwgZiA9IGEudmlld3MsIHAgPSB2b2lkIDAgPT09IGYgPyBbXSA6IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhKHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdihSKGRhLCB1KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KFIoZGEsIGQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYoUihkYSwgcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIGUgIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9KS5leGVjdXRlLCBuID0gdm9pZCAwID09PSB0ID8ge30gOiB0LCByID0gbi5wYWdlTG9hZCwgaSA9IHZvaWQgMCA9PT0gciA/IHt9IDogciwgYSA9IG4ubWJveGVzLCBvID0gdm9pZCAwID09PSBhID8gW10gOiBhLCBzID0gdihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS20oaSkgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdihYbShSKEttLCBvKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgYyA9IHYoUihRbSwgbShHbSwgcykpKSwgdSA9IG0oWW0sIHMpLCBsID0gbShZbSwgYyksIGQgPSB1LmNvbmNhdChsKSwgZiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyhkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGRbMF0uY29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAocCkgfHwgKGYudXJsID0gcCksIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgZSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge30pLmFuYWx5dGljczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFModCkgPyBbXSA6IFt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbWEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIGUgIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LCBuID0gdC5leGVjdXRlLCByID0gdm9pZCAwID09PSBuID8ge30gOiBuLCBpID0gdC5wcmVmZXRjaCwgYSA9IHZvaWQgMCA9PT0gaSA/IHt9IDogaSwgbyA9IHIucGFnZUxvYWQsIHMgPSB2b2lkIDAgPT09IG8gPyB7fSA6IG8sIGMgPSByLm1ib3hlcywgdSA9IHZvaWQgMCA9PT0gYyA/IFtdIDogYywgbCA9IGEubWJveGVzLCBkID0gdm9pZCAwID09PSBsID8gW10gOiBsLCBmID0gYS52aWV3cywgcCA9IHZvaWQgMCA9PT0gZiA/IFtdIDogZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2EocyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KFIoZ2EsIHUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYoUihnYSwgZCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdihSKGdhLCBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXJhbWV0ZXJzID0gdC5wYXJhbWV0ZXJzLCBlLnByb2ZpbGVQYXJhbWV0ZXJzID0gdC5wcm9maWxlUGFyYW1ldGVycywgZS5vcmRlciA9IHQub3JkZXIsIGUucHJvZHVjdCA9IHQucHJvZHVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdmEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbMF0sIHIgPSB0WzFdLCBpID0gIVMobiksIGEgPSAhUyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpIHx8IGEpICYmIChpICYmIChlLm9wdGlvbnMgPSBuKSwgYSAmJiAoZS5tZXRyaWNzID0gcikpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgY2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUoU2koZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFpKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9mOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5lKGxhKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5YShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWwoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMobikgPyBOZShbXSkgOiBxZShSKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pKS50aGVuKFhtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2EoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWwoZSkgPyBTKGUpID8gTmUoW10pIDogTmUobSh0LCBlKSkgOiBOZShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlc3BvbnNlLmV4ZWN1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnBhZ2VMb2FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5hbmFseXRpY3MsIGkgPSBuLm9wdGlvbnMsIGEgPSBuLm1ldHJpY3MsIG8gPSB7IGFuYWx5dGljczogciB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWEoaSwgbWkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EoYSwgYmkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YShvLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm5hbWUsIG4gPSBlLmFuYWx5dGljcywgciA9IGUub3B0aW9ucywgaSA9IGUubWV0cmljcywgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5dGljczogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlhKHIsIG1pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hKGksIHZpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmEoYSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5yZXNwb25zZS5leGVjdXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQubWJveGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW1sKG4pIHx8IFMobikgPyBOZShbXSkgOiBxZShSKHhhLCBtKGVoLCBuKSkpLnRoZW4oWG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFYShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmluZGV4ID09PSB0ICYmIGUubmFtZSA9PT0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSWEoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUucHJlZmV0Y2gsIGkgPSAodm9pZCAwID09PSByID8ge30gOiByKS5tYm94ZXMsIGEgPSB2b2lkIDAgPT09IGkgPyBbXSA6IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGEpID8gbnVsbCA6IGgobShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVhKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LmluZGV4LCByID0gdC5uYW1lLCBpID0gdC5zdGF0ZSwgYSA9IHQuYW5hbHl0aWNzLCBvID0gdC5vcHRpb25zLCBzID0gdC5tZXRyaWNzLCBjID0gSWEoZSwgbiwgciksIHUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXRpY3M6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGMpIHx8IGhhKHUsIGMpLCBxZShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YShvLCBoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYShzLCB2aSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhKHUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucmVxdWVzdCwgbiA9IGUucmVzcG9uc2UucHJlZmV0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5tYm94ZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWwocikgfHwgUyhyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbSh0aCwgciksIGEgPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2EodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoUihhLCBpKSkudGhlbihYbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnByZWZldGNoLCBuID0gKHZvaWQgMCA9PT0gdCA/IHt9IDogdCkudmlld3MsIHIgPSB2b2lkIDAgPT09IG4gPyBbXSA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKHIpID8gbnVsbCA6IHJbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0Lm5hbWUsIHIgPSB0LnN0YXRlLCBpID0gdC5hbmFseXRpY3MsIGEgPSB0Lm9wdGlvbnMsIG8gPSB0Lm1ldHJpY3MsIHMgPSBBYShlKSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuLnRvTG93ZXJDYXNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyhzKSB8fCBoYShjLCBzKSwgcWUoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWEoYSwgaGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2EobywgYmkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YShjLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlcXVlc3QsIG4gPSBlLnJlc3BvbnNlLnByZWZldGNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4udmlld3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbWwocikgfHwgUyhyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOZShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbShuaCwgciksIGEgPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2EodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoUihhLCBpKSkudGhlbihYbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlc3BvbnNlLnByZWZldGNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCh0KSA/IF9hKHQubWV0cmljcywgYmkpIDogTmUoW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVswXSwgbiA9IGVbMV0sIHIgPSBlWzJdLCBpID0gZVszXSwgYSA9IGVbNF0sIG8gPSB7fSwgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKHQpICYmIChzLnBhZ2VMb2FkID0gdCksIFMobikgfHwgKHMubWJveGVzID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKHIpIHx8IChjLm1ib3hlcyA9IHIpLCBTKGkpIHx8IChjLnZpZXdzID0gaSksIFMoYSkgfHwgKGMubWV0cmljcyA9IGEpLCBTKHMpIHx8IChvLmV4ZWN1dGUgPSBzKSwgUyhjKSB8fCAoby5wcmVmZXRjaCA9IGMpLCBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxZShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYSh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGthKHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGEodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYSh0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oT2EpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhUyhwYShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE1hKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmYShlKSwgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyh0KSB8fCAobi5yZXNwb25zZVRva2VucyA9IHQpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBWYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTWEoZSksIG4gPSBtYShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMobikgfHwgKHQuYW5hbHl0aWNzRGV0YWlscyA9IG4pLCB3ZSh0ZiwgZSksIGd0KHQsIExhKGUpKSwgTmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBNYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubWJveCA9IGUsIHdlKHRmLCB0KSwgZ3QobiwgTGEodCkpLCBOZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRmEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoZWYsIGUpLCBtdCh7IGVycm9yOiBlIH0pLCBCZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTmEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoZWYsIHQpLCBtdCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYm94OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEJlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbnQoKVtZZl0sIG4gPSBlLm1ib3gsIHIgPSBlLnRpbWVvdXQsIGkgPSBkKGUucGFyYW1zKSA/IGUucGFyYW1zIDoge30sIGEgPSBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmEobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyA9IHt9LCBjID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPT09IHQgPyBjLnBhZ2VMb2FkID0ge30gOiBjLm1ib3hlcyA9IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sIHMuZXhlY3V0ZSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gaWkobiwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUyh1KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuYW5hbHl0aWNzID0gdSwgcy5leHBlcmllbmNlQ2xvdWQgPSBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwdCh7IG1ib3g6IG4gfSksIHNpKHMsIGkpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaShlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihqYSkudGhlbihhKVsnY2F0Y2gnXShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVWEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG50KClbWWZdLCBuID0gZS5jb25zdW1lcklkLCByID0gdm9pZCAwID09PSBuID8gdCA6IG4sIGkgPSBlLnJlcXVlc3QsIGEgPSBlLnRpbWVvdXQsIG8gPSBpaShyLCBpKSwgcyA9IGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMgPSBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMobykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gaS5leHBlcmllbmNlQ2xvdWQgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmFuYWx5dGljcyA9IG8sIGkuZXhwZXJpZW5jZUNsb3VkID0gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHQoe30pLCBzaShpLCB7fSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpKGUsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGphKS50aGVuKHMpWydjYXRjaCddKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5hZGRDbGFzcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gemEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQodCkuY3NzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBIYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5hdHRyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBXYShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdChuKS5hdHRyKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdCh0KS5yZW1vdmVBdHRyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZYShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gSGEoZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpsKHIpICYmIChHYShlLCBuKSwgV2EodCwgciwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqbChIYShlLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEthKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQ6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUWEociwgaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUpIHx8IChuLmRpc2Nvbm5lY3QoKSwgdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZGlzY29ubmVjdCgpLCBlKEthKHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpLCBuLm9ic2VydmUodWwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZExpc3Q6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICRhKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWxbeGhdID09PSBraDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSmEociwgaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMoZSkgPyBjbC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobikgOiB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpLCBvKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKEthKHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWmEociwgaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUoZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMoZSkgPyBvKG4sIEVoKSA6IHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKCksIG8oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoS2EocikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlbyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnQoKVt0cF0sIGkgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiBuICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBFdCwgYSA9IGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGEpID8gamUoKSA/IFFhKGUsIHIsIGkpIDogJGEoKSA/IEphKGUsIHIsIGkpIDogWmEoZSwgciwgaSkgOiBOZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGEoSWQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBubyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYYShJZCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBZYShUZCwgSWQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBBKE90KEZkLCBlKSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWWEoSWQsIFRkLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQShPdChGZCwgZSkpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYW8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UoZ2YsIGUpLCBIYShUZCwgV2EoVGQsIGUsIER0KCc8JyArIEZkICsgJy8+JykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb28oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0obm8sIEEoT3QoRmQsIGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKHQpIHx8IHkoYW8sIFIodG8sIHQpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc28oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBIYShUZCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqbCh0KSA/IHQgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1byhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGpsLCBSKGNvLCBBKE90KFNkLCBlKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHlmLCB0KSwgT2UoeyByZW1vdGVTY3JpcHQ6IHQgfSksIGdsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE5lKCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJZShaZCwgdCksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gRXQodFtYbF0pLCBpID0gc28od3QodFtCbF0pKSwgYSA9IHVvKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IE5lKGUociwgaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQmUocG8odCwgbykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGEpID8gbi50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBuLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwbyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1vKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB3dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFYoJycsIEIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnB1c2goWnQod3QodCkpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10sIEEoT3QoSWgsIHQpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBobyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbGwoe30sIGUpLCBuID0gdFtCbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gRXQodFtYbF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHQoTGQsIHIpICYmICh0W05sXSA9IHBkLCB0W0JsXSA9IG1vKG4pKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdm8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pbmRleE9mKCdweCcpID09PSBlLmxlbmd0aCAtIDIgPyBlIDogZSArICdweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEp0KFp0KHQpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geW8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UocmYsIGUpLCBnbyhibywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9vKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBFdChlW1hsXSksIG4gPSBlW0JsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHJmLCBlKSwgT2UoeyBhY3Rpb246IGUgfSksIGVuKG4sIHQpLCBOZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQ28oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUXQoWnQodCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4byhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShyZiwgZSksIGdvKENvLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga28oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHQoWnQodCksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShyZiwgZSksIGdvKGtvLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSW8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFR0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWXQoS3QoWnQodCksIGUpKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd28oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UocmYsIGUpLCBnbyhJbywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIERvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF0KEt0KFp0KHQpLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEFvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHJmLCBlKSwgZ28oRG8sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdChYdChadCh0KSwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBUbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShyZiwgZSksIGdvKFNvLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUG8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHQoS3QoWnQodCksIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gT28oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UocmYsIGUpLCBnbyhQbywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGpvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW0JsXSwgbiA9IEV0KGVbWGxdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHJmLCBlKSwgT2UoeyBhY3Rpb246IGUgfSksIEdhKFRkLCBuKSwgV2EoVGQsIGFvKHQpLCBuKSwgTmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIExvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW0JsXSwgbiA9IEV0KGVbWGxdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHJmLCBlKSwgT2UoeyBhY3Rpb246IGUgfSksIHkoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXYSh0LCBlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCksIE5lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNbyhlLCB0LCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5zdHlsZS5zZXRQcm9wZXJ0eSh0LCBlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBBKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVm8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEV0KGVbWGxdKSwgbiA9IGVbQmxdLCByID0gbltZbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShyZiwgZSksIE9lKHsgYWN0aW9uOiBlIH0pLCBQKHIpID8gemEobiwgdCkgOiBNbyh0LCBuLCByKSwgTmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBFdChlW1hsXSksIG4gPSBlW0JsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bcWxdID0gdm8obltxbF0pLCBuW1VsXSA9IHZvKG5bVWxdKSwgd2UocmYsIGUpLCBPZSh7IGFjdGlvbjogZSB9KSwgemEobiwgdCksIE5lKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBGbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRXQoZVtYbF0pLCBuID0gZVtCbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW3psXSA9IHZvKG5bemxdKSwgbltIbF0gPSB2byhuW0hsXSksIHdlKHJmLCBlKSwgT2UoeyBhY3Rpb246IGUgfSksIHphKG4sIHQpLCBOZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTm8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEV0KGVbWGxdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHJmLCBlKSwgT2UoeyBhY3Rpb246IGUgfSksIFl0KHQpLCBOZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQm8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEV0KGVbWGxdKSwgbiA9IGVbQmxdLCByID0gbltXbF0sIGkgPSBuW0dsXSwgYSA9IEEoanQodCkpLCBvID0gYVtyXSwgcyA9IGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJdChvKSAmJiBJdChzKSA/ICh3ZShyZiwgZSksIE9lKHsgYWN0aW9uOiBlIH0pLCByIDwgaSA/IFh0KG8sIHMpIDogS3QobywgcyksIE5lKGUpKSA6ICh3ZShwZiwgZSksIEJlKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVW8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGhvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRbTmxdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUWw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geW8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSmw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX28odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geG8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRW8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd28odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQW8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVG8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT28odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgdGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gam8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgaWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm8odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcW8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtObF0gPT09IHVkIHx8IGVbTmxdID09PSBsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gem8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbWGxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwodCkgfHwgTCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUua2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVAodCkgJiYgem8oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVtYbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYSh3aCwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV28oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbS2xdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQKHQpIHx8IHBuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh6byhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW1hsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvKGUpID8gcWEoVWYsIHQpIDogKHFhKEJmLCB0KSwgV28oZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoR28sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5rZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVtObF0gPT09IHNkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbUHBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbWGxdLCByID0gSGEod2gsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAhPT0gdCB8fCByID09PSB0ICYmICFlW1BwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gS28obikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWG8obikgPyBVbyhuKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShuZiwgbiksIE9lKHsgYWN0aW9uOiBuIH0pLCBIbyhuKSwgR28obiksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZShaZCwgZSksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBHbyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbGwoe30sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbX2ZdID0gITAsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKEdvKG4pLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUW8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZVtfZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyh0KSA/IE5lKCkgOiAoWW8odCksIEJlKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJG8odCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW8odFtYbF0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbGwoe30sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbX2ZdID0gITAsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkbyhlKS50aGVuKEtvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWm8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoUihKbywgZSkpLnRoZW4oUW8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlcyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdChuKS5vbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdHMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXQobikub2ZmKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBucyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbyhlW1hsXSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2UoeyBtZXRyaWM6IGUgfSksIGxsKHsgZm91bmQ6ICEwIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoRGgsIGUpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IERoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJzKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbQWhdW1NoXSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW0ZwXSA9IFtOcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZmhdID0gZGgsIGlbcGhdID0gdCwgaVttaF0gPSBuLCBpW2hoXSA9ICEwLCBpW2JoXSA9ICExLCBpW2doXSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBaCBpbiBlICYmIFNoIGluIGVbQWhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcyhjbCkgPyBycyhjbCwgZSwgdCkgOiBpcyhGaSwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm5hbWUsIG4gPSBNbihqcCkgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bdF0gPSBlLCBMbihqcCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSwgciA9IG4ucGFnZSwgaSA9IHZvaWQgMCA9PT0gciB8fCByLCBhID0gKE1uKGpwKSB8fCB7fSlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbi5pbXByZXNzaW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKG8pID8gYSA6IGxsKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uSWQ6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShzcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpaShlLCB7fSksIG4gPSB7IGNvbnRleHQ6IHsgYmVhY29uOiAhMCB9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUyh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYW5hbHl0aWNzID0gdCwgbi5leHBlcmllbmNlQ2xvdWQgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkcyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gY2kobHMoZSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5ub3RpZmljYXRpb25zID0gbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZnMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2kobHMoZSksIHQpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm5vdGlmaWNhdGlvbnMgPSBuLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBIKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBOKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBlLnBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlUGFyYW1ldGVyczogZS5wcm9maWxlUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiBlLm9yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdDogZS5wcm9kdWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKG4pIHx8IChyLnRva2VucyA9IG4pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBncyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5uYW1lLCBpID0gZS5zdGF0ZSwgYSA9IHBzKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5tYm94ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1zKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLm5hbWUsIGkgPSBlLnN0YXRlLCBhID0gcHMoZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnZpZXcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRpKG50KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ModCwgSlNPTi5zdHJpbmdpZnkoZSkpID8gKHdlKFRoLCB0LCBlKSwgITApIDogKEllKFBoLCB0LCBlKSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB2cyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gaXIobnQoKVtZZl0pLCBpID0gcHMoWnIoe30sIHIpLCB0LCBbbl0pLCBhID0gZHMoSCgpLCByLCBbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShNaCwgZSwgaSksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaHMoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJzKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpcihlKSwgaSA9IHBzKFpyKHt9LCByKSwgdCwgW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5tYm94ID0geyBuYW1lOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZHMoZSwgciwgW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UoVmgsIGUsIGkpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYm94OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBocyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geXMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG50KClbWWZdLCBhID0gW10sIG8gPSBScDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUubWJveCwgbiA9IGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLmV2ZW50VG9rZW5zLCBpID0gdm9pZCAwID09PSByID8gW10gOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGkpIHx8IGEucHVzaChncyh0LCBvLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSksICFTKGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGRzKHQsIHt9LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlKExoLCBhKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogRmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IE5oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBocyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfcyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gaXIobnQoKVtZZl0pLCBpID0gcHMoWnIoe30sIHIpLCB0LCBbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnZpZXcgPSB7IG5hbWU6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBkcyhIKCksIHIsIFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlKFJoLCBlLCBpKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaHMoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnZpZXdOYW1lLCBuID0gZS5pbXByZXNzaW9uSWQsIHIgPSBpcihudCgpW1lmXSksIGkgPSBwcyhacih7fSwgciksIFJwLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudmlldyA9IHsgbmFtZTogdCB9LCB3ZShPaCwgdCksIGZzKHQsIHIsIFtpXSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbXByZXNzaW9uSWQgPSBuLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogQmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGhzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS52aWV3LCBuID0gZS5kYXRhLCByID0gKHZvaWQgMCA9PT0gbiA/IHt9IDogbikuZXZlbnRUb2tlbnMsIGkgPSB2b2lkIDAgPT09IHIgPyBbXSA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHQubmFtZSwgbyA9IHQuaW1wcmVzc2lvbklkLCBzID0gY3MoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZHMoYSwge30sIFttcyhzLCBScCwgaSldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pbXByZXNzaW9uSWQgPSBvLCB3ZShqaCwgYSwgaSksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXc6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogTmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBocyhjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24ga3MoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID09PSBqZCAmJiBxYShVZiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEVzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFnKFVoW2VdKSAmJiAhZyhVaFtlXVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIElzKGUsIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcoVWhbZV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHAoVWgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyh0KSB8fCB5KGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFVoW25dW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cyhyLCB0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwKFVoW25dKSksIGRlbGV0ZSBVaFtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHdzKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWhbZV0gPSBVaFtlXSB8fCB7fSwgVWhbZV1bdF0gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBEcyhlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi50eXBlLCBhID0gbi5zZWxlY3RvciwgbyA9IG4uZXZlbnRUb2tlbiwgcyA9IHgoaSArICc6JyArIGEgKyAnOicgKyBvKSwgYyA9IGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoZSwgaSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyhpLCBhKSwgdCA/IEVzKGUsIHMpIHx8IChJcyhlLCBpLCBhKSwgd3MoZSwgcywgYyksIGVzKGksIGMsIGEpKSA6IGVzKGksIGMsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBcyh0LCBuLCBlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxZShSKG5zLCBlKSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHModCwgbiwgZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBtKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm91bmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSksIFdoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKEdoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gU3MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXMoZS5uYW1lLCAhMSwgSGgoZSksIGJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXMoZS5uYW1lLCAhMCwgSGgoZSksIF9zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXMocWgsICExLCBIaChlKSwgdnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcyh6aCwgITEsIEhoKGUpLCB2cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGpzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBSKFhoLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG4oWG0odCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUihYaCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKFhtKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTXMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0oR20sIEttKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYoUihZaCwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBWcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUpICYmIGUudHlwZSAhPT0gWmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFJzKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBtKFZzLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEZzKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmV2ZW50VG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBabyhScyhlLmNvbnRlbnQsIHQsIG4pKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLaChyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oUWgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGUpICYmIGUudHlwZSAhPT0gd2Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEJzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFIoZSwgbShOcywgS20odCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVXMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGMoeyBzdGF0dXM6IEVmIH0sIGUsIHQpLCBpID0gUihpaCwgbShXbSwgbikpLCBhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGkpIHx8IChyLnN0YXR1cyA9IF9mLCBhLmVycm9ycyA9IGkpLCBTKGEpIHx8IChyLmRhdGEgPSBhKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcXMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGMoeyBzdGF0dXM6IEVmIH0sIGUsIHQpLCBpID0gUihpaCwgbShXbSwgbikpLCBhID0gUihpaCwgbSgkaCwgbikpLCBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKGkpIHx8IChyLnN0YXR1cyA9IF9mLCBvLmVycm9ycyA9IGkpLCBTKGEpIHx8IChvLmV2ZW50VG9rZW5zID0gYSksIFMobykgfHwgKHIuZGF0YSA9IG8pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB6cyh0LCBlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnMoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoQnMociwgdCkpLnRoZW4oZSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4odCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBIcyh0LCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbi5uYW1lLCBvID0gZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZzKGUsIGEsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFlKEJzKG8sIG4pKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXModCwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKG4pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV3ModCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVzKERmLCB0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpzKHQsIG4sIFNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gR3MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHMoRGYsIGUsICEwLCBTcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFlzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganMoTXMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBYcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHQgIT09IHVuZGVmaW5lZCAmJiBhcmd1bWVudHNbMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZXhlY3V0ZSwgciA9ICh2b2lkIDAgPT09IG4gPyB7fSA6IG4pLnBhZ2VMb2FkLCBpID0gdm9pZCAwID09PSByID8ge30gOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyhpKSB8fCBZcyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBLcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5wcmVmZXRjaCwgbiA9ICh2b2lkIDAgPT09IHQgPyB7fSA6IHQpLnZpZXdzLCByID0gdm9pZCAwID09PSBuID8gW10gOiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKHIpIHx8IExzKHYoUihNcywgcikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUXMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcyhNcyhlKSksIGduKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICRzKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVcyhGZiwgdCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6cyh0LCBuLCBQcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEpzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFlKFIoV3MsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWnMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWUoUihHcywgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxZShbT3MoZSldKS50aGVuKFVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucGFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEhzKE9wLCBlLCB0LCBUcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5jKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpYyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZW1pdCh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYWMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm9uKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljKGV2LCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2MoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYyhldiwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGNkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogZS51cmwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdWMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlID0gUWwsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnR5cGUgPSBKbCwgdC5jb250ZW50ID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSA9IHBkLCB0LmNvbnRlbnQgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlID0gbWQsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnR5cGUgPSB2ZCwgdC5jb250ZW50ID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSA9IGRkLCB0LmNvbnRlbnQgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbWMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlID0gZmQsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnR5cGUgPSBzZCwgdC5jb250ZW50ID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHZjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgZS5hdHRyaWJ1dGUgPT09IFRkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudHlwZSA9IHRkLCB0LmNvbnRlbnQgPSBlLnZhbHVlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSBlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bZS5hdHRyaWJ1dGVdID0gZS52YWx1ZSwgdC5jb250ZW50ID0gbiwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYmMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3R5bGUsIG4gPSB2b2lkIDAgPT09IHQgPyB7fSA6IHQsIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCByLmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgZyhuLmxlZnQpIHx8IGcobi50b3ApID8gZyhuLndpZHRoKSB8fCBnKG4uaGVpZ2h0KSA/IHIudHlwZSA9IG5kIDogci50eXBlID0gaWQgOiByLnR5cGUgPSBhZCwgci5jb250ZW50ID0gbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geWMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50eXBlID0gb2QsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZyb20gPSBlLmZyb20sIHQudG8gPSBlLnRvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi50eXBlID0gcmQsIG4uc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCBuLmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3Rvciwgbi5jb250ZW50ID0gdCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQ2MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwoZS5zZWxlY3RvcikgJiYgamwoZS5jc3NTZWxlY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbXSwgciA9IFtdLCBpID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5hY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJGw6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2MoZSkgPyBpLnB1c2godWMoZSkpIDogbi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGUuY29udGVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBabDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUuY29udGVudCkgfHwgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHdkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2gobGMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goZGMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBoZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goZmMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBiZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2gocGMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBkZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goZ2MoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2gobWMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goaGMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2godmMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goYmMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goeWMoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSByZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goX2MoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goY2MoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB1ZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBqZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IGUuc2VsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VG9rZW46IGUuY2xpY2tUcmFja0lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMoaSkgJiYgbi5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBPZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgIVMobikgJiYgKGEub3B0aW9ucyA9IG4pLCAhUyhyKSAmJiAoYS5tZXRyaWNzID0gciksIFMoYSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ucGFnZUxvYWQgPSBhLCB0LmV4ZWN1dGUgPSBvLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAkbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBEZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogZS5jb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFpsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMoZS5jb250ZW50KSB8fCB5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogd2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGNkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIucHVzaChjYyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGxkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGpkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRva2VuOiBlLmNsaWNrVHJhY2tJZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7IG5hbWU6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTKHIpICYmIChhLm9wdGlvbnMgPSByKSwgIVMoaSkgJiYgKGEubWV0cmljcyA9IGkpLCBTKGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge30sIHMgPSBbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLm1ib3hlcyA9IHMsIG4uZXhlY3V0ZSA9IG8sIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEVjKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyB4Yyh0KSA6IGtjKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBJYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zdGF0dXMsIG4gPSBlLmRhdGEsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMb2FkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcobikgfHwgKHIuZGF0YSA9IG4pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB3YyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zdGF0dXMsIG4gPSBlLm1ib3gsIHIgPSBlLmRhdGEsIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ib3g6IG4ubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcocikgfHwgKGkuZGF0YSA9IHIpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBEYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zdGF0dXMsIG4gPSBlLnZpZXcsIHIgPSBlLmRhdGEsIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXc6IG4ubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcocikgfHwgKGkuZGF0YSA9IHIpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBBYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zdGF0dXMsIG4gPSBlLmRhdGEsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZldGNoTWV0cmljczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKG4pIHx8IChyLmRhdGEgPSBuKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gU2MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUihJYywgW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF2KHQpICYmIEllKHR2LCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUih3YywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdih0KSAmJiBJZShudiwgZSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFBjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB5czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFIod2MsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXYocikgJiYgSWUobnYsIGUpLCBuKGUpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBPYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdCAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogeHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBSKERjLCBbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXYocikgJiYgSWUocnYsIGUpLCBlLnZpZXcucGFnZSAmJiBuKGUpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBSKEFjLCBbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXYodCkgJiYgSWUoaXYsIGUpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2MoZVswXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGMoZVsxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGMoZVsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamMoZVszXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBuID0gbSh6bSwgdCksIHIgPSBtKFdtLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMocikgPyBOZShuKSA6IEJlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBNYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVmMociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5vcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyh0KSB8fCB5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gRGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBRbCwgbiA9IGUuY29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gT2YsIGUuY29udGVudCA9IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBSYyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5tZXRyaWNzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubmFtZSA9IHIsIGUuc2VsZWN0b3IgPSBlLnNlbGVjdG9yIHx8IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBGYyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbGwoe30sIGUpLCByID0gbi5leGVjdXRlLCBpID0gdm9pZCAwID09PSByID8ge30gOiByLCBhID0gbi5wcmVmZXRjaCwgbyA9IHZvaWQgMCA9PT0gYSA/IHt9IDogYSwgcyA9IGkucGFnZUxvYWQsIGMgPSB2b2lkIDAgPT09IHMgPyB7fSA6IHMsIHUgPSBpLm1ib3hlcywgbCA9IHZvaWQgMCA9PT0gdSA/IFtdIDogdSwgZCA9IG8ubWJveGVzLCBmID0gdm9pZCAwID09PSBkID8gW10gOiBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmModCwgYyksIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbCksIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbCksIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiksIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSYyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE5jKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnByZWZldGNoLCBuID0gKHZvaWQgMCA9PT0gdCA/IHt9IDogdCkudmlld3MsIHIgPSB2b2lkIDAgPT09IG4gPyBbXSA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMocikgfHwgdXMocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEJjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9IGUuZXhlY3V0ZSwgciA9IHZvaWQgMCA9PT0gbiA/IHt9IDogbiwgaSA9IHIucGFnZUxvYWQsIGEgPSB2b2lkIDAgPT09IGkgPyB7fSA6IGksIG8gPSByLm1ib3hlcywgcyA9IHZvaWQgMCA9PT0gbyA/IFtdIDogbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyhhKSA/IHQucHVzaChOZShudWxsKSkgOiB0LnB1c2goJHMoYSkpLCBTKHMpID8gdC5wdXNoKE5lKG51bGwpKSA6IHQucHVzaChKcyhzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZS5wcmVmZXRjaCwgdSA9IHZvaWQgMCA9PT0gYyA/IHt9IDogYywgbCA9IHUubWJveGVzLCBkID0gdm9pZCAwID09PSBsID8gW10gOiBsLCBmID0gdS5tZXRyaWNzLCBwID0gdm9pZCAwID09PSBmID8gW10gOiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhkKSA/IHQucHVzaChOZShudWxsKSkgOiB0LnB1c2goWnMoZCkpLCBtbChwKSAmJiAhUyhwKSA/IHQucHVzaChlYyh1KSkgOiB0LnB1c2goTmUobnVsbCkpLCBsbigpLCBxZSh0KS50aGVuKExjKVsnY2F0Y2gnXShNYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFVjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5sb2NhdGlvbi5yZXBsYWNlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcWMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwoZSkgPyBlIDogTChlKSA/IGUgOiBMZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gemMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYShCZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEhjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm1ib3gsIG4gPSBlLnNlbGVjdG9yLCByID0gZS5vZmZlciwgaSA9IG50KCksIGEgPSB0ID09PSBpW1lmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMocikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UodmYpLCB6YyhuKSwgbG4oKSwgdm9pZCB5dCh7IG1ib3g6IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gRmMobiwgRWModCwgciwgYSkpLCBzID0gcGEobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUyhzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZShiZiwgcyksIF90KHsgdXJsOiBjIH0pLCB2b2lkIFVjKGNsLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodCh7IG1ib3g6IHQgfSksIFhzKG8pLCBCYyhvKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUpIHx8IHZ0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYm94OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbjogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnQoeyBlcnJvcjogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFdjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgJiYgYXJndW1lbnRzWzFdLCByID0gZS5zZWxlY3RvciwgaSA9IGUucmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKHZmKSwgemMociksIGxuKCksIHl0KHt9KSwgb2MoYWcpLCBOZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IEZjKHIsIGkpLCBvID0gcGEoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKG8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGh0KHt9KSwgTmMoYSksIG9jKGlnKSwgWHMoYSwgbiksIEJjKGEpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUpIHx8IHZ0KHsgZXhlY3V0aW9uOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnQoeyBlcnJvcjogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG8udXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UoYmYsIG8pLCBfdCh7IHVybDogcyB9KSwgb2Mob2cpLCBVYyhjbCwgcyksIE5lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEdjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3RnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFModCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5yZXF1ZXN0LCByID0gdC5yZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFTKG4pICYmICFTKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBZYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZShvdiwgVXAsIGUpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IG92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGxuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEtjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgJiYgYXJndW1lbnRzWzFdLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBMZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Uob3YsIE1mLCBlKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBXYyhyLCBuKVsnY2F0Y2gnXShYYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFFjKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBsbCh7fSwgdCksIHIgPSBuLmV4ZWN1dGUsIGkgPSBuLnByZWZldGNoLCBhID0gZVtEcF0sIG8gPSBlW3dwXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgKG4uZXhlY3V0ZS5tYm94ZXMgPSBudWxsKSwgciAmJiAhYSAmJiAobi5leGVjdXRlLnBhZ2VMb2FkID0gbnVsbCksIGkgJiYgKG4ucHJlZmV0Y2gubWJveGVzID0gbnVsbCksIGkgJiYgIW8gJiYgKG4ucHJlZmV0Y2gudmlld3MgPSBudWxsKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFljKGUpLCBuID0gdC5yZXF1ZXN0LCByID0gdC5yZXNwb25zZSwgaSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShvdiwgSHApLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IG92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyU3RhdGU6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gUWMoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhzKGEpLCBLcyhhKSwgamEoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLYyhlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oWGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEllKG92LCBCZCksIHZvaWQgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogb3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoR2MoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbRHBdLCBuID0gZVt3cF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgJiYgIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlKG92LCB6cCksIHZvaWQgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IG92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogenAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHsgcGFnZUxvYWQ6IHt9IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5leGVjdXRlID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7IHZpZXdzOiBbe31dIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wcmVmZXRjaCA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGVbR2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Uob3YsIFZmLCByKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogb3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYZSgpICYmICFLZSgpID8gJGUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVYShzKS50aGVuKEtjKVsnY2F0Y2gnXShYYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShYYykgOiBVYShzKS50aGVuKEtjKVsnY2F0Y2gnXShYYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWmMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2tmXSA9ICEwLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBldShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2tmXSA9ICExLCB0W19mXSA9IGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHR1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAoZSkgPyBldShYZCkgOiBlLmxlbmd0aCA+IEVkID8gZXUoS2QpIDogWmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbnUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXUocWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHR1KGVbRGZdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRba2ZdID8gdShlW0VmXSkgPyB1KGVbX2ZdKSA/IFpjKCkgOiBldSgkZCkgOiBldShRZCkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBydShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldShxZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5yZXF1ZXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXUoemQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuZXhlY3V0ZSwgciA9IHQucHJlZmV0Y2g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKG4pIHx8IGQocikgPyBaYygpIDogZXUoV2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldShxZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5yZXF1ZXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXUoemQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuZXhlY3V0ZSwgciA9IHQucHJlZmV0Y2gsIGkgPSB0Lm5vdGlmaWNhdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKG4pIHx8IGQocikgPyBldShHZCkgOiBtbChpKSA/IFpjKCkgOiBldShZZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGF1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV1KHFkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0dShlW0RmXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdFtrZl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW0FmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1sKG4pID8gWmMoKSA6IGV1KEpkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gb3UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlKSA/IGQoZS5yZXNwb25zZSkgPyBaYygpIDogZXUoSGQpIDogZXUocWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldShxZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdHUoZVtEZl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtrZl0gPyBaYygpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY3UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBjZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZS5jb250ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHV1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0aW9uID0gJGwsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGlvbiA9IEpsLCB0LmNvbnRlbnQgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hY3Rpb24gPSBnZCwgdC5jb250ZW50ID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZ1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0aW9uID0gaGQsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGlvbiA9IGJkLCB0LmNvbnRlbnQgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ3UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hY3Rpb24gPSBkZCwgdC5jb250ZW50ID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0aW9uID0gZmQsIHQuY29udGVudCA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBodShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGlvbiA9IHNkLCB0LmNvbnRlbnQgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdnUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHAoZS5jb250ZW50KVswXSwgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hY3Rpb24gPSBlZCwgbi5hdHRyaWJ1dGUgPSB0LCBuLnZhbHVlID0gZS5jb250ZW50W3RdLCBuLnNlbGVjdG9yID0gZS5zZWxlY3Rvciwgbi5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0aW9uID0gZWQsIHQuYXR0cmlidXRlID0gVGQsIHQudmFsdWUgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geXUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hY3Rpb24gPSBuZCwgdC5zdHlsZSA9IGUuY29udGVudCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGlvbiA9IG5kLCB0LnN0eWxlID0gZS5jb250ZW50LCB0LnNlbGVjdG9yID0gZS5zZWxlY3RvciwgdC5jc3NTZWxlY3RvciA9IGUuY3NzU2VsZWN0b3IsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEN1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0aW9uID0gbmQsIHQuc3R5bGUgPSBlLmNvbnRlbnQsIHQuc2VsZWN0b3IgPSBlLnNlbGVjdG9yLCB0LmNzc1NlbGVjdG9yID0gZS5jc3NTZWxlY3RvciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hY3Rpb24gPSBvZCwgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmFjdGlvbiA9IHJkLCB0LmZyb20gPSBlLmNvbnRlbnQuZnJvbSwgdC50byA9IGUuY29udGVudC50bywgdC5zZWxlY3RvciA9IGUuc2VsZWN0b3IsIHQuY3NzU2VsZWN0b3IgPSBlLmNzc1NlbGVjdG9yLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2godXUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKbDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gobHUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goZHUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goZnUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB2ZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gocHUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBkZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goZ3UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBmZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gobXUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goaHUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2godnUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB0ZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goYnUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBuZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goeXUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBpZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goX3UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goQ3UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goeHUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSByZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goa3UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBjZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goY3UoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSXUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudHlwZSA9PT0gamQgJiYgKHJoKGUpID8gdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBlLnNlbGVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVHJhY2tJZDogZS5ldmVudFRva2VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlja1RyYWNrSWQ6IGUuZXZlbnRUb2tlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gd3UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9IFtdLCByID0gW10sIGkgPSBlLm9wdGlvbnMsIGEgPSB2b2lkIDAgPT09IGkgPyBbXSA6IGksIG8gPSBlLm1ldHJpY3MsIHMgPSB2b2lkIDAgPT09IG8gPyBbXSA6IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIERkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChlLmNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3ZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZS5jb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgY2Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKGN1KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgT2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoLmFwcGx5KHIsIEV1KGUuY29udGVudCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKSwgUyh0KSB8fCByLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAkbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHQuam9pbignJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIFMobikgfHwgci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogWmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IEl1KHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhjKSB8fCByLnB1c2guYXBwbHkociwgYyksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIER1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmV4ZWN1dGUsIG4gPSB2b2lkIDAgPT09IHQgPyB7fSA6IHQsIHIgPSBuLnBhZ2VMb2FkLCBpID0gdm9pZCAwID09PSByID8ge30gOiByLCBhID0gbi5tYm94ZXMsIG8gPSB2b2lkIDAgPT09IGEgPyBbXSA6IGEsIHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMucHVzaC5hcHBseShzLCB3dShpKSksIHMucHVzaC5hcHBseShzLCB2KFIod3UsIG8pKSksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEF1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBEdSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtFZl0obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFN1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W1RmXSB8fCB4ZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtfZl0obiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFR1KHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBudSh0KSwgbiA9IGVbX2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVba2ZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEllKHN2LCBuKSwgdm9pZCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8odFtfZl0oQ2YsIEJkKSksIEllKHN2LCBCZCksIHZvaWQgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogQmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBdSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3UodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShzdiwgdCksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogc3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBYZSgpICYmICFLZSgpID8gJGUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhKHQpLnRoZW4ocilbJ2NhdGNoJ10oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogQmEodCkudGhlbihyKVsnY2F0Y2gnXShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gUHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHJ1KGUpLCBuID0gdFtfZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2tmXSA/IHllKCkgPyAod2UoY3YsIGUpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGN2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgIVhlKCkgfHwgS2UoKSA/IFVhKGUpIDogJGUoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVYShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogKEllKGN2LCBCZCksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogY3YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBCZShuZXcgRXJyb3IoQmQpKSkgOiAoSWUoY3YsIG4pLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGN2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBCZSh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE91KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBxYyhlLnNlbGVjdG9yKSwgbiA9IGF1KGUpLCByID0gbltfZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2tmXSA/IHllKCkgPyAoZS5zZWxlY3RvciA9IHQsIHdlKHV2LCBlKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiB1diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZvaWQgSGMoZSkpIDogKEllKHV2LCBCZCksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEJkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB2b2lkIHpjKHQpKSA6IChJZSh1diwgZSwgciksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHZvaWQgemModCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBqdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcWMoZS5zZWxlY3RvciksIG4gPSBvdShlKSwgciA9IG5bX2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltrZl0gPyB5ZSgpID8gKGUuc2VsZWN0b3IgPSB0LCB3ZShsdiwgZSksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogbHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBXYyhlKSkgOiAoSWUobHYsIEJkKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBsdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogQmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHpjKHQpLCBCZShuZXcgRXJyb3IoQmQpKSkgOiAoSWUobHYsIGUsIHIpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGx2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB6Yyh0KSwgQmUobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBMdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbnQoKVtZZl0sIG4gPSBlLmNvbnN1bWVySWQsIHIgPSB2b2lkIDAgPT09IG4gPyB0IDogbiwgaSA9IGUucmVxdWVzdCwgYSA9IGl1KGUpLCBvID0gYVtfZl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYVtrZl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoZHYsIG8pLCB2b2lkIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXllKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSWUoZHYsIEJkKSwgdm9pZCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBkdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBCZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlKGR2LCBlKSwgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBkdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gZHMociwge30sIGkubm90aWZpY2F0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFYZSgpIHx8IEtlKCkgPyBocyhzKSA6IEllKGR2LCBacCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE11KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0W0RmXSwgciA9IGxsKHt9LCB0KSwgaSA9IGQodC5wYXJhbXMpID8gdC5wYXJhbXMgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbUGZdID0gbGwoe30sIGlyKG4pLCBpKSwgcltHZl0gPSB1aShlLCB0W0dmXSksIHJbRWZdID0gdSh0W0VmXSkgPyB0W0VmXSA6IEYsIHJbX2ZdID0gdSh0W19mXSkgPyB0W19mXSA6IEYsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFZ1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW05sXSwgbiA9IGVbWGxdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwodCkgJiYgKGpsKG4pIHx8IEwobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBSdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5tYm94LCBuID0gZChlLnBhcmFtcykgPyBlLnBhcmFtcyA6IHt9LCByID0gbGwoe30sIGlyKHQpLCBuKSwgaSA9IFJwLCBhID0gcHMoWnIoe30sIHIpLCBpLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm1ib3ggPSB7IG5hbWU6IHQgfSwgaHMoZHModCwgciwgW2FdKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UobWYsIGUpLCB2b2lkIGVbRWZdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEllKGhmLCBlKSwgZVtfZl0oeGYsIGhmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRnUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoWGUoKSAmJiAhS2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJZShoZiwgWnApLCB2b2lkIGVbX2ZdKF9mLCBacCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGdShlKSwgIWUucHJldmVudERlZmF1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEJ1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW1hsXSwgbiA9IGVbTmxdLCByID0gQShFdCh0KSksIGkgPSBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcyhuLCBpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFV1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBzdShlKSwgbiA9IHRbX2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRba2ZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEllKGZ2LCBuKSwgdm9pZCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBNdShudCgpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5ZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEllKGZ2LCBCZCksIG8ocltfZl0oQ2YsIEJkKSksIHZvaWQgT2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogQmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZShmdiwgciksIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBWdShyKSA/IEJ1KHIpIDogRnUocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHF1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFzKGUpLCB0YyhlKS50aGVuKE9jKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUpIHx8IHZ0KHsgZXhlY3V0aW9uOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWUoQnAsIGUpLCBidCh7IGVycm9yOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24genUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyAwIDwgZ3YubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBndi5wb3AoKSwgdCA9IGNzKGUudmlld05hbWUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh0KSB8fCBxdSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBIdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHYgPSBtdiwgenUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gV3UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjKGlnLCBIdSksIHNjKGFnLCBIdSksIHNjKG9nLCBIdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEd1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udmlld05hbWUgPSBlLCBuLmltcHJlc3Npb25JZCA9IEgoKSwgbi5wYWdlID0gITAsIFModCkgfHwgKG4ucGFnZSA9ICEhdC5wYWdlKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWXUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdChlKSwgZyhjcyhlLnZpZXdOYW1lLCBlKSkgJiYgZS5wYWdlICYmIENzKGUpLCBndi5wdXNoKGUpLCBodiA9PT0gbXYgJiYgenUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gWHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUMoZSkgfHwgUChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJZShwdiwgcXAsIGUpLCB2b2lkIE9lKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXc6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRvTG93ZXJDYXNlKCksIHIgPSBHdShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UocHYsIG4sIHIpLCBPZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHB2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIFl1KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBLdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWUoYnYsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFF1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZSh5diwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gJHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEllKF92LCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBKdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWUoQ3YsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFp1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9IGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFkb2JlID0gZS5hZG9iZSB8fCB7fSwgZS5hZG9iZS50YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE9mZmVyOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T2ZmZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlPZmZlcjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5T2ZmZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE5vdGlmaWNhdGlvbnM6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0V2ZW50OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclZpZXc6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckV4dGVuc2lvbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5tYm94Q3JlYXRlID0gdCwgZS5tYm94RGVmaW5lID0gdCwgZS5tYm94VXBkYXRlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZWwoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hZG9iZSAmJiBlLmFkb2JlLnRhcmdldCAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5hZG9iZS50YXJnZXQuZ2V0T2ZmZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZShVZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbnQoKSwgaSA9IHJbS2ZdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYWRvYmUgPSBlLmFkb2JlIHx8IHt9LCBlLmFkb2JlLnRhcmdldCA9IGUuYWRvYmUudGFyZ2V0IHx8IHt9LCBlLmFkb2JlLnRhcmdldC5WRVJTSU9OID0gaSwgZS5hZG9iZS50YXJnZXQuZXZlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlJBUllfTE9BREVEOiBBZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVF9TVEFSVDogU2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RfU1VDQ0VFREVEOiBUZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVF9GQUlMRUQ6IFBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05URU5UX1JFTkRFUklOR19TVEFSVDogT2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfUkVOREVSSU5HX1NVQ0NFRURFRDogamcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfUkVOREVSSU5HX0ZBSUxFRDogTGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfUkVOREVSSU5HX05PX09GRkVSUzogTWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRFTlRfUkVOREVSSU5HX1JFRElSRUNUOiBWZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICFyW3FmXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWnUoZSksIHZvaWQgSWUoQmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGUoKSwgUnQoKSwgV3QoZSksIGUuYWRvYmUudGFyZ2V0LmdldE9mZmVyID0gVHUsIGUuYWRvYmUudGFyZ2V0LmdldE9mZmVycyA9IFB1LCBlLmFkb2JlLnRhcmdldC5hcHBseU9mZmVyID0gT3UsIGUuYWRvYmUudGFyZ2V0LmFwcGx5T2ZmZXJzID0ganUsIGUuYWRvYmUudGFyZ2V0LnNlbmROb3RpZmljYXRpb25zID0gTHUsIGUuYWRvYmUudGFyZ2V0LnRyYWNrRXZlbnQgPSBVdSwgZS5hZG9iZS50YXJnZXQudHJpZ2dlclZpZXcgPSBYdSwgZS5hZG9iZS50YXJnZXQucmVnaXN0ZXJFeHRlbnNpb24gPSBLdSwgZS5tYm94Q3JlYXRlID0gUXUsIGUubWJveERlZmluZSA9ICR1LCBlLm1ib3hVcGRhdGUgPSBKdSwgZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGwsIG5sLCBybCwgaWwsIGFsLCBvbCwgc2wsIGNsID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIHVsID0gbignQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKSwgbGwgPSByKG4oJ0BhZG9iZS9yZWFjdG9yLW9iamVjdC1hc3NpZ24nKSksIGRsID0gcihuKCdAYWRvYmUvcmVhY3Rvci1jb29raWUnKSksIGZsID0gcihuKCdAYWRvYmUvcmVhY3Rvci1xdWVyeS1zdHJpbmcnKSksIHBsID0gcihuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJykpLCBnbCA9IHIobignQGFkb2JlL3JlYWN0b3ItbG9hZC1zY3JpcHQnKSksIG1sID0gQXJyYXkuaXNBcnJheSwgaGwgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLCB2bCA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsIGJsID0gZnVuY3Rpb24gYmwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZm9yRWFjaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeWwgPSBmdW5jdGlvbiB5bCh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KG5bZV0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcChuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIF9sID0gZnVuY3Rpb24gX2woZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZmlsdGVyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBDbCA9IGZ1bmN0aW9uIENsKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWwoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGUsIHQpICYmIChyW3RdID0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeGwgPSAnW29iamVjdCBTdHJpbmddJywga2wgPSA5MDA3MTk5MjU0NzQwOTkxLCBFbCA9IGZ1bmN0aW9uIEVsKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm1hcChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSWwgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB3bCA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwgRGwgPSAnW29iamVjdCBPYmplY3RdJywgQWwgPSBGdW5jdGlvbi5wcm90b3R5cGUsIFNsID0gT2JqZWN0LnByb3RvdHlwZSwgVGwgPSBBbC50b1N0cmluZywgUGwgPSBTbC5oYXNPd25Qcm9wZXJ0eSwgT2wgPSBUbC5jYWxsKE9iamVjdCksIGpsID0gZnVuY3Rpb24gamwoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFQKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBMbCA9ICdbb2JqZWN0IE51bWJlcl0nLCBNbCA9IGZ1bmN0aW9uIE1sKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWwoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW3RdID0gbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBWbCA9IGZ1bmN0aW9uIFZsKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnJlZHVjZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUmwgPSBmdW5jdGlvbiBSbChuLCBlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geWwoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbihyLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBGbCA9IEFycmF5LnByb3RvdHlwZS5yZXZlcnNlLCBObCA9ICd0eXBlJywgQmwgPSAnY29udGVudCcsIFVsID0gJ2hlaWdodCcsIHFsID0gJ3dpZHRoJywgemwgPSAnbGVmdCcsIEhsID0gJ3RvcCcsIFdsID0gJ2Zyb20nLCBHbCA9ICd0bycsIFlsID0gJ3ByaW9yaXR5JywgWGwgPSAnc2VsZWN0b3InLCBLbCA9ICdjc3NTZWxlY3RvcicsIFFsID0gJ3NldEh0bWwnLCAkbCA9ICdzZXRDb250ZW50JywgSmwgPSAnc2V0VGV4dCcsIFpsID0gJ3NldEpzb24nLCBlZCA9ICdzZXRBdHRyaWJ1dGUnLCB0ZCA9ICdzZXRJbWFnZVNvdXJjZScsIG5kID0gJ3NldFN0eWxlJywgcmQgPSAncmVhcnJhbmdlJywgaWQgPSAncmVzaXplJywgYWQgPSAnbW92ZScsIG9kID0gJ3JlbW92ZScsIHNkID0gJ2N1c3RvbUNvZGUnLCBjZCA9ICdyZWRpcmVjdCcsIHVkID0gJ3RyYWNrQ2xpY2snLCBsZCA9ICdzaWduYWxDbGljaycsIGRkID0gJ2luc2VydEJlZm9yZScsIGZkID0gJ2luc2VydEFmdGVyJywgcGQgPSAnYXBwZW5kSHRtbCcsIGdkID0gJ2FwcGVuZENvbnRlbnQnLCBtZCA9ICdwcmVwZW5kSHRtbCcsIGhkID0gJ3ByZXBlbmRDb250ZW50JywgdmQgPSAncmVwbGFjZUh0bWwnLCBiZCA9ICdyZXBsYWNlQ29udGVudCcsIHlkID0gJ21ib3hEZWJ1ZycsIF9kID0gJ21ib3hEaXNhYmxlJywgQ2QgPSAnbWJveEVkaXQnLCB4ZCA9ICdhdF9jaGVjaycsIGtkID0gJ3RydWUnLCBFZCA9IDI1MCwgSWQgPSAnZGF0YS1hdC1zcmMnLCB3ZCA9ICdqc29uJywgRGQgPSAnaHRtbCcsIEFkID0gJ2R5bmFtaWMnLCBTZCA9ICdzY3JpcHQnLCBUZCA9ICdzcmMnLCBQZCA9ICdpZCcsIE9kID0gJ2NsYXNzJywgamQgPSAnY2xpY2snLCBMZCA9ICdoZWFkJywgTWQgPSAnc2NyaXB0JywgVmQgPSAnc3R5bGUnLCBSZCA9ICdsaW5rJywgRmQgPSAnaW1nJywgTmQgPSAnZGl2JywgQmQgPSAnQWRvYmUgVGFyZ2V0IGNvbnRlbnQgZGVsaXZlcnkgaXMgZGlzYWJsZWQuIEVuc3VyZSB0aGF0IHlvdSBjYW4gc2F2ZSBjb29raWVzIHRvIHlvdXIgY3VycmVudCBkb21haW4sIHRoZXJlIGlzIG5vICJtYm94RGlzYWJsZSIgY29va2llIGFuZCB0aGVyZSBpcyBubyAibWJveERpc2FibGUiIHBhcmFtZXRlciBpbiBxdWVyeSBzdHJpbmcuJywgVWQgPSAnQWRvYmUgVGFyZ2V0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuJywgcWQgPSAnb3B0aW9ucyBhcmd1bWVudCBpcyByZXF1aXJlZCcsIHpkID0gJ3JlcXVlc3Qgb3B0aW9uIGlzIHJlcXVpcmVkJywgSGQgPSAncmVzcG9uc2Ugb3B0aW9uIGlzIHJlcXVpcmVkJywgV2QgPSAnZXhlY3V0ZSBvciBwcmVmZXRjaCBpcyByZXF1aXJlZCcsIEdkID0gJ2V4ZWN1dGUgb3IgcHJlZmV0Y2ggaXMgbm90IGFsbG93ZWQnLCBZZCA9ICdub3RpZmljYXRpb25zIGFyZSByZXF1aXJlZCcsIFhkID0gJ21ib3ggb3B0aW9uIGlzIHJlcXVpcmVkJywgS2QgPSAnbWJveCBvcHRpb24gaXMgdG9vIGxvbmcnLCBRZCA9ICdzdWNjZXNzIG9wdGlvbiBpcyByZXF1aXJlZCcsICRkID0gJ2Vycm9yIG9wdGlvbiBpcyByZXF1aXJlZCcsIEpkID0gJ29mZmVyIG9wdGlvbiBpcyByZXF1aXJlZCcsIFpkID0gJ1VuZXhwZWN0ZWQgZXJyb3InLCBlZiA9ICdyZXF1ZXN0IGZhaWxlZCcsIHRmID0gJ3JlcXVlc3Qgc3VjY2VlZGVkJywgbmYgPSAnQWN0aW9uIHJlbmRlcmVkIHN1Y2Nlc3NmdWxseScsIHJmID0gJ1JlbmRlcmluZyBhY3Rpb24nLCBhZiA9ICdBY3Rpb24gaGFzIG5vIGNvbnRlbnQnLCBvZiA9ICdBY3Rpb24gaGFzIG5vIGF0dHJpYnV0ZXMnLCBzZiA9ICdBY3Rpb24gaGFzIG5vIENTUyBwcm9wZXJ0aWVzJywgY2YgPSAnQWN0aW9uIGhhcyBubyBoZWlnaHQgb3Igd2lkdGgnLCB1ZiA9ICdBY3Rpb24gaGFzIG5vIGxlZnQsIHRvcCBvciBwb3NpdGlvbicsIGxmID0gJ0FjdGlvbiBoYXMgbm8gZnJvbSBvciB0bycsIGRmID0gJ0FjdGlvbiBoYXMgbm8gdXJsJywgZmYgPSAnQWN0aW9uIGhhcyBubyBpbWFnZSB1cmwnLCBwZiA9ICdSZWFycmFuZ2UgZWxlbWVudHMgYXJlIG1pc3NpbmcnLCBnZiA9ICdMb2FkaW5nIGltYWdlJywgbWYgPSAnVHJhY2sgZXZlbnQgcmVxdWVzdCBzdWNjZWVkZWQnLCBoZiA9ICdUcmFjayBldmVudCByZXF1ZXN0IGZhaWxlZCcsIHZmID0gJ05vIGFjdGlvbnMgdG8gYmUgcmVuZGVyZWQnLCBiZiA9ICdSZWRpcmVjdCBhY3Rpb24nLCB5ZiA9ICdTY3JpcHQgbG9hZCcsIF9mID0gJ2Vycm9yJywgQ2YgPSAnd2FybmluZycsIHhmID0gJ3Vua25vd24nLCBrZiA9ICd2YWxpZCcsIEVmID0gJ3N1Y2Nlc3MnLCBJZiA9ICdyZW5kZXInLCB3ZiA9ICdtZXRyaWMnLCBEZiA9ICdtYm94JywgQWYgPSAnb2ZmZXInLCBTZiA9ICduYW1lJywgVGYgPSAnc3RhdHVzJywgUGYgPSAncGFyYW1zJywgT2YgPSAnYWN0aW9ucycsIGpmID0gJ3Jlc3BvbnNlVG9rZW5zJywgTGYgPSAnZGF0YScsIE1mID0gJ3Jlc3BvbnNlJywgVmYgPSAncmVxdWVzdCcsIFJmID0gJ3Byb3ZpZGVyJywgRmYgPSAncGFnZUxvYWQnLCBOZiA9ICdhdC1mbGlja2VyLWNvbnRyb2wnLCBCZiA9ICdhdC1lbGVtZW50LW1hcmtlcicsIFVmID0gJ2F0LWVsZW1lbnQtY2xpY2stdHJhY2tpbmcnLCBxZiA9ICdlbmFibGVkJywgemYgPSAnY2xpZW50Q29kZScsIEhmID0gJ2ltc09yZ0lkJywgV2YgPSAnc2VydmVyRG9tYWluJywgR2YgPSAndGltZW91dCcsIFlmID0gJ2dsb2JhbE1ib3hOYW1lJywgWGYgPSAnZ2xvYmFsTWJveEF1dG9DcmVhdGUnLCBLZiA9ICd2ZXJzaW9uJywgUWYgPSAnZGVmYXVsdENvbnRlbnRIaWRkZW5TdHlsZScsICRmID0gJ2JvZHlIaWRkZW5TdHlsZScsIEpmID0gJ2JvZHlIaWRpbmdFbmFibGVkJywgWmYgPSAnZGV2aWNlSWRMaWZldGltZScsIGVwID0gJ3Nlc3Npb25JZExpZmV0aW1lJywgdHAgPSAnc2VsZWN0b3JzUG9sbGluZ1RpbWVvdXQnLCBucCA9ICd2aXNpdG9yQXBpVGltZW91dCcsIHJwID0gJ292ZXJyaWRlTWJveEVkZ2VTZXJ2ZXInLCBpcCA9ICdvdmVycmlkZU1ib3hFZGdlU2VydmVyVGltZW91dCcsIGFwID0gJ29wdG91dEVuYWJsZWQnLCBvcCA9ICdzZWN1cmVPbmx5Jywgc3AgPSAnc3VwcGxlbWVudGFsRGF0YUlkUGFyYW1UaW1lb3V0JywgY3AgPSAnYXV0aG9yaW5nU2NyaXB0VXJsJywgdXAgPSAnc2NoZW1lJywgbHAgPSAnY29va2llRG9tYWluJywgZHAgPSAnbWJveFBhcmFtcycsIGZwID0gJ2dsb2JhbE1ib3hQYXJhbXMnLCBwcCA9ICdtYm94U2Vzc2lvbicsIGdwID0gJ1BDJywgbXAgPSAnbWJveEVkZ2VDbHVzdGVyJywgaHAgPSAnc2Vzc2lvbicsIHZwID0gJ1RyYWNlcycsIGJwID0gJ3NldHRpbmdzJywgeXAgPSAnY2xpZW50JyArIHZwLCBfcCA9ICdzZXJ2ZXInICsgdnAsIENwID0gJ19fX3RhcmdldF90cmFjZXMnLCB4cCA9ICd0YXJnZXRHbG9iYWxTZXR0aW5ncycsIGtwID0gJ2RhdGFQcm92aWRlcicsIEVwID0ga3AgKyAncycsIElwID0gJ2VuZHBvaW50Jywgd3AgPSAndmlld3NFbmFibGVkJywgRHAgPSAncGFnZUxvYWRFbmFibGVkJywgQXAgPSAnYXV0aFN0YXRlJywgU3AgPSAnYXV0aGVudGljYXRlZFN0YXRlJywgVHAgPSAnaW50ZWdyYXRpb25Db2RlJywgUHAgPSAncGFnZScsIE9wID0gJ3ZpZXcnLCBqcCA9ICd2aWV3cycsIExwID0gJ29wdGlvbnMnLCBNcCA9ICdtZXRyaWNzJywgVnAgPSAndmlld05hbWUnLCBScCA9ICdkaXNwbGF5JywgRnAgPSAnQ29udGVudC1UeXBlJywgTnAgPSAndGV4dC9wbGFpbicsIEJwID0gJ1ZpZXcgcmVuZGVyaW5nIGZhaWxlZCcsIFVwID0gJ1ZpZXcgZGVsaXZlcnkgZXJyb3InLCBxcCA9ICdWaWV3IG5hbWUgc2hvdWxkIGJlIGEgbm9uLWVtcHR5IHN0cmluZycsIHpwID0gJ1BhZ2UgbG9hZCBkaXNhYmxlZCcsIEhwID0gJ1VzaW5nIHNlcnZlciBzdGF0ZScsIFdwID0gJ2Fkb2JlJywgR3AgPSAnb3B0SW4nLCBZcCA9ICdpc0FwcHJvdmVkJywgWHAgPSAnZmV0Y2hQZXJtaXNzaW9ucycsIEtwID0gJ0NhdGVnb3JpZXMnLCBRcCA9ICdUQVJHRVQnLCAkcCA9ICdBTkFMWVRJQ1MnLCBKcCA9ICdvcHRpbkVuYWJsZWQnLCBacCA9ICdBZG9iZSBUYXJnZXQgaXMgbm90IG9wdGVkIGluJywgZWcgPSAnYW5hbHl0aWNzTG9nZ2luZycsIHRnID0gJ3NlcnZlclN0YXRlJywgbmcgPSAnY3NwU2NyaXB0Tm9uY2UnLCByZyA9ICdjc3BTdHlsZU5vbmNlJywgaWcgPSAnY2FjaGUtdXBkYXRlZC1ldmVudCcsIGFnID0gJ25vLW9mZmVycy1ldmVudCcsIG9nID0gJ3JlZGlyZWN0LW9mZmVyLWV2ZW50Jywgc2cgPSAnZmlsZTonLCBjZyA9IC9eKD8hMCkoPyEuKlwuJCkoKDE/XGQ/XGR8MjVbMC01XXwyWzAtNF1cZCkoXC58JCkpezR9JC8sIHVnID0gL14oY29tfGVkdXxnb3Z8bmV0fG1pbHxvcmd8bm9tfGNvfG5hbWV8aW5mb3xiaXopJC9pLCBsZyA9IHt9LCBkZyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0Q29udGVudFZpc2libGVTdHlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsU2l6ZUxpbWl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZmcgPSBmdW5jdGlvbiBrdihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvdG9jb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VySW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVsYXRpdmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0b3J5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1ZXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncXVlcnlLZXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcjogLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiAvXig/OihbXjpcLz8jXSspOik/KD86XC9cLygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykpPygoKCg/OltePyNcL10qXC8pKikoW14/I10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29zZTogL14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9IHIucGFyc2VyW3Quc3RyaWN0TW9kZSA/ICdzdHJpY3QnIDogJ2xvb3NlJ10uZXhlYyhlKSwgaSA9IHt9LCBhID0gMTQ7IGEtLTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtyLmtleVthXV0gPSBuW2FdIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbci5xLm5hbWVdID0ge30sIGlbci5rZXlbMTJdXS5yZXBsYWNlKHIucS5wYXJzZXIsIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoaVtyLnEubmFtZV1bdF0gPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwZyA9IGZsLnBhcnNlLCBnZyA9IGZsLnN0cmluZ2lmeSwgbWcgPSB1bC5jcmVhdGVFbGVtZW50KCdhJyksIGhnID0ge30sIHZnID0gZGwuZ2V0LCBiZyA9IGRsLnNldCwgeWcgPSBkbC5yZW1vdmUsIF9nID0gJ21ib3gnLCBDZyA9ICdBVDonLCB4ZyA9ICcxJywga2cgPSAodGwgPSB3aW5kb3csIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5femlkIHx8IChlLl96aWQgPSB0KyspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID0gcCh0KSkubnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYSh0Lm5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGtbZihlKV0gfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAoIXQuZSB8fCBlLmUgPT0gdC5lKSAmJiAoIXQubnMgfHwgaS50ZXN0KGUubnMpKSAmJiAoIW4gfHwgZihlLmZuKSA9PT0gZihuKSkgJiYgKCFyIHx8IGUuc2VsID09IHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoJycgKyBlKS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU6IHRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zOiB0LnNsaWNlKDEpLnNvcnQoKS5qb2luKCcgJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoJyg/Ol58ICknICsgZS5yZXBsYWNlKCcgJywgJyAuKiA/JykgKyAnKD86IHwkKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGVsICYmICFuICYmIGUuZSBpbiByIHx8ICEhdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFW2VdIHx8IG4gJiYgcltlXSB8fCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaChhLCBlLCB0LCBvLCBzLCBjLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmKGEpLCBsID0ga1tuXSB8fCAoa1tuXSA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNwbGl0KC9ccy8pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdyZWFkeScgPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGRvY3VtZW50KS5yZWFkeSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBwKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmZuID0gdCwgbi5zZWwgPSBzLCBuLmUgaW4gRSAmJiAodCA9IGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnJlbGF0ZWRUYXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgdCAhPT0gdGhpcyAmJiAhZC5jb250YWlucyh0aGlzLCB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5mbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAobi5kZWwgPSBjKSB8fCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnByb3h5ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgPSBiKGUpKS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kYXRhID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHIuYXBwbHkoYSwgZS5fYXJncyA9PSBfID8gW2VdIDogW2VdLmNvbmNhdChlLl9hcmdzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExID09PSB0ICYmIChlLnByZXZlbnREZWZhdWx0KCksIGUuc3RvcFByb3BhZ2F0aW9uKCkpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmkgPSBsLmxlbmd0aCwgbC5wdXNoKG4pLCAnYWRkRXZlbnRMaXN0ZW5lcicgaW4gYSAmJiBhLmFkZEV2ZW50TGlzdGVuZXIobShuLmUpLCBuLnByb3h5LCBnKG4sIHUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYodCwgZSwgbiwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSB8fCAnJykuc3BsaXQoL1xzLykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHQsIGUsIG4sIHIpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBrW2FdW2UuaV0sICdyZW1vdmVFdmVudExpc3RlbmVyJyBpbiB0ICYmIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcihtKGUuZSksIGUucHJveHksIGcoZSwgaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIociwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIHx8ICFyLmlzRGVmYXVsdFByZXZlbnRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIHx8IChpID0gciksIGQuZWFjaChsLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltlXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t0XSA9IGMsIG4gJiYgbi5hcHBseShpLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgclt0XSA9IEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci50aW1lU3RhbXAgfHwgKHIudGltZVN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZGVmYXVsdFByZXZlbnRlZCAhPT0gXyA/IGkuZGVmYXVsdFByZXZlbnRlZCA6ICdyZXR1cm5WYWx1ZScgaW4gaSA/ICExID09PSBpLnJldHVyblZhbHVlIDogaS5nZXRQcmV2ZW50RGVmYXVsdCAmJiBpLmdldFByZXZlbnREZWZhdWx0KCkpICYmIChyLmlzRGVmYXVsdFByZXZlbnRlZCA9IGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0geyBvcmlnaW5hbEV2ZW50OiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUudGVzdCh0KSB8fCBlW3RdID09PSBfIHx8IChuW3RdID0gZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgXywgdCA9IDEsIEMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsIGkgPSBkLmlzRnVuY3Rpb24sIHggPSBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGsgPSB7fSwgcyA9IHt9LCBuID0gJ29uZm9jdXNpbicgaW4gdGwsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiAnZm9jdXNpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdXI6ICdmb2N1c291dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBFID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VsZWF2ZTogJ21vdXNlb3V0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNsaWNrID0gcy5tb3VzZWRvd24gPSBzLm1vdXNldXAgPSBzLm1vdXNlbW92ZSA9ICdNb3VzZUV2ZW50cycsIGQuZXZlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5wcm94eSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAyIGluIGFyZ3VtZW50cyAmJiBDLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hcHBseSh0LCBuID8gbi5jb25jYXQoQy5jYWxsKGFyZ3VtZW50cykpIDogYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuX3ppZCA9IGYoZSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IChuLnVuc2hpZnQoZVt0XSwgZSksIGQucHJveHkuYXBwbHkobnVsbCwgbikpIDogZC5wcm94eShlW3RdLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdleHBlY3RlZCBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5mbi5iaW5kID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vbihlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQuZm4udW5iaW5kID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkLmZuLm9uZSA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub24oZSwgdCwgbiwgciwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSSA9IGZ1bmN0aW9uIEkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1ID0gL14oW0EtWl18cmV0dXJuVmFsdWUkfGxheWVyW1hZXSR8d2Via2l0TW92ZW1lbnRbWFldJCkvLCBsID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogJ2lzRGVmYXVsdFByZXZlbnRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogJ2lzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAnaXNQcm9wYWdhdGlvblN0b3BwZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZm4uZGVsZWdhdGUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9uKHQsIGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5mbi51bmRlbGVnYXRlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vZmYodCwgZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkLmZuLmxpdmUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGRvY3VtZW50LmJvZHkpLmRlbGVnYXRlKHRoaXMuc2VsZWN0b3IsIGUsIHQpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZC5mbi5kaWUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKGRvY3VtZW50LmJvZHkpLnVuZGVsZWdhdGUodGhpcy5zZWxlY3RvciwgZSwgdCksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkLmZuLm9uID0gZnVuY3Rpb24gKG4sIGEsIG8sIHMsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSwgbCwgciA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgIXgobikgPyAoZC5lYWNoKG4sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIub24oZSwgYSwgbywgdCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIpIDogKHgoYSkgfHwgaShzKSB8fCAhMSA9PT0gcyB8fCAocyA9IG8sIG8gPSBhLCBhID0gXyksIHMgIT09IF8gJiYgITEgIT09IG8gfHwgKHMgPSBvLCBvID0gXyksICExID09PSBzICYmIChzID0gSSksIHIuZWFjaChmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmICh1ID0gZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdihyLCBlLnR5cGUsIHMpLCBzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhICYmIChsID0gZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IGQoZS50YXJnZXQpLmNsb3Nlc3QoYSwgcikuZ2V0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgbiAhPT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IGQuZXh0ZW5kKHkoZSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUZpcmVkOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICh1IHx8IHMpLmFwcGx5KG4sIFt0XS5jb25jYXQoQy5jYWxsKGFyZ3VtZW50cywgMSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGgociwgbiwgcywgbywgYSwgbCB8fCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkLmZuLm9mZiA9IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICF4KGUpID8gKGQuZWFjaChlLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm9mZihlLCBuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcikgOiAoeChuKSB8fCBpKHQpIHx8ICExID09PSB0IHx8ICh0ID0gbiwgbiA9IF8pLCAhMSA9PT0gdCAmJiAodCA9IEkpLCByLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KHRoaXMsIGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQuZm4udHJpZ2dlciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlID0geChlKSB8fCBkLmlzUGxhaW5PYmplY3QoZSkgPyBkLkV2ZW50KGUpIDogYihlKSkuX2FyZ3MgPSB0LCB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnR5cGUgaW4gciAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0aGlzW2UudHlwZV0gPyB0aGlzW2UudHlwZV0oKSA6ICdkaXNwYXRjaEV2ZW50JyBpbiB0aGlzID8gdGhpcy5kaXNwYXRjaEV2ZW50KGUpIDogZCh0aGlzKS50cmlnZ2VySGFuZGxlcihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQuZm4udHJpZ2dlckhhbmRsZXIgPSBmdW5jdGlvbiAobiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkgPSB5KHgobikgPyBkLkV2ZW50KG4pIDogbikpLl9hcmdzID0gciwgaS50YXJnZXQgPSB0LCBkLmVhY2gobyh0LCBuLnR5cGUgfHwgbiksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9IHQucHJveHkoaSksIGkuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2ZvY3VzaW4gZm9jdXNvdXQgZm9jdXMgYmx1ciBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvcicuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5mblt0XSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIGluIGFyZ3VtZW50cyA/IHRoaXMuYmluZCh0LCBlKSA6IHRoaXMudHJpZ2dlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGQuRXZlbnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgoZSkgfHwgKGUgPSAodCA9IGUpLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoc1tlXSB8fCAnRXZlbnRzJyksIHIgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZXMnID09IGkgPyByID0gISF0W2ldIDogbltpXSA9IHRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5pdEV2ZW50KGUsIHIsICEwKSwgYihuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oc2wgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBlID8gU3RyaW5nKGUpIDogS1tRLmNhbGwoZSldIHx8ICdvYmplY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gbyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGUgJiYgZSA9PSBlLndpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGUgJiYgZS5ub2RlVHlwZSA9PSBlLkRPQ1VNRU5UX05PREU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gbyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByKGUpICYmICFhKGUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSA9PSBPYmplY3QucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAhIWUgJiYgJ2xlbmd0aCcgaW4gZSAmJiBlLmxlbmd0aCwgbiA9IHcudHlwZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyAhPSBuICYmICFhKGUpICYmICgnYXJyYXknID09IG4gfHwgMCA9PT0gdCB8fCAnbnVtYmVyJyA9PSB0eXBlb2YgdCAmJiAwIDwgdCAmJiB0IC0gMSBpbiBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmNhbGwoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgZS5sZW5ndGggPyB3LmZuLmNvbmNhdC5hcHBseShbXSwgZSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgvOjovZywgJy8nKS5yZXBsYWNlKC8oW0EtWl0rKShbQS1aXVthLXpdKS9nLCAnJDFfJDInKS5yZXBsYWNlKC8oW2EtelxkXSkoW0EtWl0pL2csICckMV8kMicpLnJlcGxhY2UoL18vZywgJy0nKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW4gdCA/IHRbZV0gOiB0W2VdID0gbmV3IFJlZ0V4cCgnKF58XFxzKScgKyBlICsgJyhcXHN8JCknKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyAhPSB0eXBlb2YgdCB8fCBWW2YoZSldID8gdCA6IHQgKyAncHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1bZV0gfHwgKHQgPSBMLmNyZWF0ZUVsZW1lbnQoZSksIEwuYm9keS5hcHBlbmRDaGlsZCh0KSwgbiA9IGdldENvbXB1dGVkU3R5bGUodCwgJycpLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSwgdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLCAnbm9uZScgPT0gbiAmJiAobiA9ICdibG9jaycpLCBNW2VdID0gbiksIE1bZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NoaWxkcmVuJyBpbiBlID8gai5jYWxsKGUuY2hpbGRyZW4pIDogdy5tYXAoZS5jaGlsZE5vZGVzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PSBlLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IGUgPyBlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IHI7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tuXSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSByLCB0aGlzLnNlbGVjdG9yID0gdCB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICh1KHRbSV0pIHx8IGVlKHRbSV0pKSA/ICh1KHRbSV0pICYmICF1KGVbSV0pICYmIChlW0ldID0ge30pLCBlZSh0W0ldKSAmJiAhZWUoZVtJXSkgJiYgKGVbSV0gPSBbXSksIGgoZVtJXSwgdFtJXSwgbikpIDogdFtJXSAhPT0gRSAmJiAoZVtJXSA9IHRbSV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gdCA/IHcoZSkgOiB3KGUpLmZpbHRlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHQpID8gdC5jYWxsKGUsIG4sIHIpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gbiA/IGUucmVtb3ZlQXR0cmlidXRlKHQpIDogZS5zZXRBdHRyaWJ1dGUodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY2xhc3NOYW1lIHx8ICcnLCByID0gbiAmJiBuLmJhc2VWYWwgIT09IEU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT09IEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID8gbi5iYXNlVmFsIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gbi5iYXNlVmFsID0gdCA6IGUuY2xhc3NOYW1lID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gJ3RydWUnID09IGUgfHwgJ2ZhbHNlJyAhPSBlICYmICgnbnVsbCcgPT0gZSA/IG51bGwgOiArZSArICcnID09IGUgPyArZSA6IC9eW1xbXHtdLy50ZXN0KGUpID8gdy5wYXJzZUpTT04oZSkgOiBlKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gZS5jaGlsZE5vZGVzLmxlbmd0aDsgbiA8IHI7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeChlLmNoaWxkTm9kZXNbbl0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaW5uZXJIVE1MID0gdCwgamwobikgJiYgYS5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbiksIGkuYXBwZW5kQ2hpbGQoYSksIGkucmVtb3ZlQ2hpbGQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSwgSSwgdywgRCwgQSwgUywgVCA9IFtdLCBQID0gVC5jb25jYXQsIE8gPSBULmZpbHRlciwgaiA9IFQuc2xpY2UsIEwgPSB0bC5kb2N1bWVudCwgTSA9IHt9LCB0ID0ge30sIFYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2x1bW4tY291bnQnOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC13ZWlnaHQnOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGluZS1oZWlnaHQnOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnei1pbmRleCc6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb206IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBSID0gL15ccyo8KFx3K3whKVtePl0qPi8sIEYgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLCBOID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSwgQiA9IC9eKD86Ym9keXxodG1sKSQvaSwgVSA9IC8oW0EtWl0pL2csIHEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlaWdodCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZmZzZXQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgeiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXBlbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVmb3JlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGVuZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBIID0gTC5jcmVhdGVFbGVtZW50KCd0YWJsZScpLCBXID0gTC5jcmVhdGVFbGVtZW50KCd0cicpLCBHID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cjogTC5jcmVhdGVFbGVtZW50KCd0Ym9keScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ym9keTogSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlYWQ6IEgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmb290OiBILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZDogVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGg6IFcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJzogTC5jcmVhdGVFbGVtZW50KCdkaXYnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFkgPSAvY29tcGxldGV8bG9hZGVkfGludGVyYWN0aXZlLywgWCA9IC9eW1x3LV0qJC8sIEsgPSB7fSwgUSA9IEsudG9TdHJpbmcsICQgPSB7fSwgSiA9IEwuY3JlYXRlRWxlbWVudCgnZGl2JyksIFogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4OiAndGFiSW5kZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seTogJ3JlYWRPbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcic6ICdodG1sRm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzJzogJ2NsYXNzTmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aDogJ21heExlbmd0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzcGFjaW5nOiAnY2VsbFNwYWNpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxscGFkZGluZzogJ2NlbGxQYWRkaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogJ3Jvd1NwYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzcGFuOiAnY29sU3BhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZW1hcDogJ3VzZU1hcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYm9yZGVyOiAnZnJhbWVCb3JkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ZWRpdGFibGU6ICdjb250ZW50RWRpdGFibGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZWUgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLm1hdGNoZXMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAhZSB8fCAxICE9PSBlLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLm1hdGNoZXMgfHwgZS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZS5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZS5vTWF0Y2hlc1NlbGVjdG9yIHx8IGUubWF0Y2hlc1NlbGVjdG9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpID0gZS5wYXJlbnROb2RlLCBhID0gIWk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgKGkgPSBKKS5hcHBlbmRDaGlsZChlKSwgciA9IH4kLnFzYShpLCB0KS5pbmRleE9mKGUpLCBhICYmIEoucmVtb3ZlQ2hpbGQoZSksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBBID0gZnVuY3Rpb24gQShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgvLSsoLik/L2csIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdC50b1VwcGVyQ2FzZSgpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTID0gZnVuY3Rpb24gUyhuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uY2FsbChuLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5pbmRleE9mKGUpID09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAkLmZyYWdtZW50ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRi50ZXN0KGUpICYmIChyID0gdyhMLmNyZWF0ZUVsZW1lbnQoUmVnRXhwLiQxKSkpLCByIHx8IChlLnJlcGxhY2UgJiYgKGUgPSBlLnJlcGxhY2UoTiwgJzwkMT48LyQyPicpKSwgdCA9PT0gRSAmJiAodCA9IFIudGVzdChlKSAmJiBSZWdFeHAuJDEpLCB0IGluIEcgfHwgKHQgPSAnKicpLCAoYSA9IEdbdF0pLmlubmVySFRNTCA9ICcnICsgZSwgciA9IHcuZWFjaChqLmNhbGwoYS5jaGlsZE5vZGVzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgdShuKSAmJiAoaSA9IHcociksIHcuZWFjaChuLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA8IHEuaW5kZXhPZihlKSA/IGlbZV0odCkgOiBpLmF0dHIoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJC5aID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAkLmlzWiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiAkLlo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAkLmluaXQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuWigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCc8JyA9PSAoZSA9IGUudHJpbSgpKVswXSAmJiBSLnRlc3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJC5mcmFnbWVudChlLCBSZWdFeHAuJDEsIHQpLCBlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPT0gRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyh0KS5maW5kKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICQucXNhKEwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoTCkucmVhZHkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLmlzWihlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocihlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBbZV0sIGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChSLnRlc3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gJC5mcmFnbWVudChlLnRyaW0oKSwgUmVnRXhwLiQxLCB0KSwgZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgIT09IEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcodCkuZmluZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAkLnFzYShMLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5aKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgKHcgPSBmdW5jdGlvbiB3KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5pbml0KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZXh0ZW5kID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgZSA9IGouY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYm9vbGVhbicgPT0gdHlwZW9mIHQgJiYgKG4gPSB0LCB0ID0gZS5zaGlmdCgpKSwgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgodCwgZSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAkLnFzYSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIgPSAnIycgPT0gdFswXSwgaSA9ICFyICYmICcuJyA9PSB0WzBdLCBhID0gciB8fCBpID8gdC5zbGljZSgxKSA6IHQsIG8gPSBYLnRlc3QoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0RWxlbWVudEJ5SWQgJiYgbyAmJiByID8gKG4gPSBlLmdldEVsZW1lbnRCeUlkKGEpKSA/IFtuXSA6IFtdIDogMSAhPT0gZS5ub2RlVHlwZSAmJiA5ICE9PSBlLm5vZGVUeXBlICYmIDExICE9PSBlLm5vZGVUeXBlID8gW10gOiBqLmNhbGwobyAmJiAhciAmJiBlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPyBpID8gZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpIDogZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSA6IGUucXVlcnlTZWxlY3RvckFsbCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3LmNvbnRhaW5zID0gTC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgPyBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICE9PSB0ICYmIGUuY29udGFpbnModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdCAmJiAodCA9IHQucGFyZW50Tm9kZSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3LnR5cGUgPSBvLCB3LmlzRnVuY3Rpb24gPSBzLCB3LmlzV2luZG93ID0gYSwgdy5pc0FycmF5ID0gZWUsIHcuaXNQbGFpbk9iamVjdCA9IHUsIHcuaXNFbXB0eU9iamVjdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3LmlzTnVtZXJpYyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBOdW1iZXIoZSksIG4gPSB0dChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSBlICYmICdib29sZWFuJyAhPSBuICYmICgnc3RyaW5nJyAhPSBuIHx8IGUubGVuZ3RoKSAmJiAhaXNOYU4odCkgJiYgaXNGaW5pdGUodCkgfHwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3LmluQXJyYXkgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmluZGV4T2YuY2FsbCh0LCBlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcuY2FtZWxDYXNlID0gQSwgdy50cmltID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBlID8gJycgOiBTdHJpbmcucHJvdG90eXBlLnRyaW0uY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcudXVpZCA9IDAsIHcuc3VwcG9ydCA9IHt9LCB3LmV4cHIgPSB7fSwgdy5ub29wID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdy5tYXAgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBpLCBhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSAobiA9IHQoZVtyXSwgcikpICYmIGEucHVzaChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSAobiA9IHQoZVtpXSwgaSkpICYmIGEucHVzaChuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcuZWFjaCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgPT09IHQuY2FsbChlW25dLCBuLCBlW25dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgPT09IHQuY2FsbChlW3JdLCByLCBlW3JdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcuZ3JlcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uY2FsbChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRsLkpTT04gJiYgKHcucGFyc2VKU09OID0gSlNPTi5wYXJzZSksIHcuZWFjaCgnQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvcicuc3BsaXQoJyAnKSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLWydbb2JqZWN0ICcgKyB0ICsgJ10nXSA9IHQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB3LmZuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiAkLlosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvckVhY2g6IFQuZm9yRWFjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2U6IFQucmVkdWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2g6IFQucHVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0OiBULnNvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlOiBULnNwbGljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleE9mOiBULmluZGV4T2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY2F0OiBmdW5jdGlvbiB0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQsIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gMDsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBhcmd1bWVudHNbZV0sIG5bZV0gPSAkLmlzWih0KSA/IHQudG9BcnJheSgpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAuYXBwbHkoJC5pc1oodGhpcykgPyB0aGlzLnRvQXJyYXkoKSA6IHRoaXMsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBmdW5jdGlvbiBuZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KHcubWFwKHRoaXMsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUsIHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZTogZnVuY3Rpb24gcmUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KGouYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeTogZnVuY3Rpb24gaWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWS50ZXN0KEwucmVhZHlTdGF0ZSkgJiYgTC5ib2R5ID8gZSh3KSA6IEwuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICExKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gYWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gRSA/IGouY2FsbCh0aGlzKSA6IHRoaXNbMCA8PSBlID8gZSA6IGUgKyB0aGlzLmxlbmd0aF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0FycmF5OiBmdW5jdGlvbiBvZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBmdW5jdGlvbiBzZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiBjZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IHRoaXMucGFyZW50Tm9kZSAmJiB0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaDogZnVuY3Rpb24gdWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCBuID0gdGhpcy5sZW5ndGgsIHIgPSAwOyByIDwgbiAmJiAodCA9IHRoaXNbcl0sICExICE9PSBlLmNhbGwodCwgciwgdCkpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIGxlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModCkgPyB0aGlzLm5vdCh0aGlzLm5vdCh0KSkgOiB3KE8uY2FsbCh0aGlzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQubWF0Y2hlcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiBmdW5jdGlvbiBkZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KFModGhpcy5jb25jYXQodyhlLCB0KSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzOiBmdW5jdGlvbiBmZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgdGhpcy5sZW5ndGggJiYgJC5tYXRjaGVzKHRoaXNbMF0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90OiBmdW5jdGlvbiBwZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKHQpICYmIHQuY2FsbCAhPT0gRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY2FsbCh0aGlzLCBlKSB8fCBuLnB1c2godGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdzdHJpbmcnID09IHR5cGVvZiB0ID8gdGhpcy5maWx0ZXIodCkgOiBsKHQpICYmIHModC5pdGVtKSA/IGouY2FsbCh0KSA6IHcodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmluZGV4T2YoZSkgPCAwICYmIG4ucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzOiBmdW5jdGlvbiBnZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihlKSA/IHcuY29udGFpbnModGhpcywgZSkgOiB3KHRoaXMpLmZpbmQoZSkuc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVxOiBmdW5jdGlvbiBtZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gZSA/IHRoaXMuc2xpY2UoZSkgOiB0aGlzLnNsaWNlKGUsICtlICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdDogZnVuY3Rpb24gaGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgIXIoZSkgPyBlIDogdyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q6IGZ1bmN0aW9uIHZlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXNbdGhpcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgIXIoZSkgPyBlIDogdyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uIGJlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/ICdvYmplY3QnID09IHR0KGUpID8gdyhlKS5maWx0ZXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQuc29tZS5jYWxsKG4sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcuY29udGFpbnMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAxID09IHRoaXMubGVuZ3RoID8gdygkLnFzYSh0aGlzWzBdLCBlKSkgOiB0aGlzLm1hcChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5xc2EodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdDogZnVuY3Rpb24geWUobiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdLCBhID0gJ29iamVjdCcgPT0gdHQobikgJiYgdyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IHQgJiYgIShhID8gMCA8PSBhLmluZGV4T2YodCkgOiAkLm1hdGNoZXModCwgbikpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCAhPT0gciAmJiAhYyh0KSAmJiB0LnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIGkuaW5kZXhPZih0KSA8IDAgJiYgaS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHM6IGZ1bmN0aW9uIF9lKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFtdLCBuID0gdGhpczsgMCA8IG4ubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB3Lm1hcChuLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSA9IGUucGFyZW50Tm9kZSkgJiYgIWMoZSkgJiYgdC5pbmRleE9mKGUpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHVzaChlKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogZnVuY3Rpb24gQ2UoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdihTKHRoaXMucGx1Y2soJ3BhcmVudE5vZGUnKSksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IGZ1bmN0aW9uIHhlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYodGhpcy5tYXAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBmdW5jdGlvbiBrZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnREb2N1bWVudCB8fCBqLmNhbGwodGhpcy5jaGlsZE5vZGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nczogZnVuY3Rpb24gRWUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdih0aGlzLm1hcChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uY2FsbChnKHQucGFyZW50Tm9kZSksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgIT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHk6IGZ1bmN0aW9uIEllKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Y2s6IGZ1bmN0aW9uIHdlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcubWFwKHRoaXMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93OiBmdW5jdGlvbiBEZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9uZScgPT0gdGhpcy5zdHlsZS5kaXNwbGF5ICYmICh0aGlzLnN0eWxlLmRpc3BsYXkgPSAnJyksICdub25lJyA9PSBnZXRDb21wdXRlZFN0eWxlKHRoaXMsICcnKS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXNwbGF5JykgJiYgKHRoaXMuc3R5bGUuZGlzcGxheSA9IGUodGhpcy5ub2RlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VXaXRoOiBmdW5jdGlvbiBBZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJlZm9yZShlKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGZ1bmN0aW9uIFNlKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1swXSAmJiAhbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdyh0KS5nZXQoMCksIGkgPSByLnBhcmVudE5vZGUgfHwgMSA8IHRoaXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KHRoaXMpLndyYXBBbGwobiA/IHQuY2FsbCh0aGlzLCBlKSA6IGkgPyByLmNsb25lTm9kZSghMCkgOiByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwQWxsOiBmdW5jdGlvbiBUZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodyh0aGlzWzBdKS5iZWZvcmUoZSA9IHcoZSkpOyAodCA9IGUuY2hpbGRyZW4oKSkubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdC5maXJzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyhlKS5hcHBlbmQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwSW5uZXI6IGZ1bmN0aW9uIFBlKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBzKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHcodGhpcyksIG4gPSB0LmNvbnRlbnRzKCksIHIgPSBhID8gaS5jYWxsKHRoaXMsIGUpIDogaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ubGVuZ3RoID8gbi53cmFwQWxsKHIpIDogdC5hcHBlbmQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwOiBmdW5jdGlvbiBPZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KHRoaXMpLnJlcGxhY2VXaXRoKHcodGhpcykuY2hpbGRyZW4oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uIGplKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmVOb2RlKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRlOiBmdW5jdGlvbiBMZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2dsZTogZnVuY3Rpb24gTWUodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ID09PSBFID8gJ25vbmUnID09IGUuY3NzKCdkaXNwbGF5JykgOiB0KSA/IGUuc2hvdygpIDogZS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldjogZnVuY3Rpb24gVmUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdyh0aGlzLnBsdWNrKCdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJykpLmZpbHRlcihlIHx8ICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiBSZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KHRoaXMucGx1Y2soJ25leHRFbGVtZW50U2libGluZycpKS5maWx0ZXIoZSB8fCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbDogZnVuY3Rpb24gRmUobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCBpbiBhcmd1bWVudHMgPyB0aGlzLmVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KHRoaXMpLmVtcHR5KCkuYXBwZW5kKGIodGhpcywgbiwgZSwgdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IDAgaW4gdGhpcyA/IHRoaXNbMF0uaW5uZXJIVE1MIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uIE5lKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgaW4gYXJndW1lbnRzID8gdGhpcy5lYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGIodGhpcywgbiwgZSwgdGhpcy50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gbnVsbCA9PSB0ID8gJycgOiAnJyArIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogMCBpbiB0aGlzID8gdGhpcy5wbHVjaygndGV4dENvbnRlbnQnKS5qb2luKCcnKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiBmdW5jdGlvbiBCZSh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgIT0gdHlwZW9mIHQgfHwgMSBpbiBhcmd1bWVudHMgPyB0aGlzLmVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSB0aGlzLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEkgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkodGhpcywgSSwgdFtJXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KHRoaXMsIHQsIGIodGhpcywgbiwgZSwgdGhpcy5nZXRBdHRyaWJ1dGUodCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAwIGluIHRoaXMgJiYgMSA9PSB0aGlzWzBdLm5vZGVUeXBlICYmIG51bGwgIT0gKGUgPSB0aGlzWzBdLmdldEF0dHJpYnV0ZSh0KSkgPyBlIDogRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUF0dHI6IGZ1bmN0aW9uIFVlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSB0aGlzLm5vZGVUeXBlICYmIGUuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6IGZ1bmN0aW9uIHFlKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBaW3RdIHx8IHQsIDEgaW4gYXJndW1lbnRzID8gdGhpcy5lYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3RdID0gYih0aGlzLCBuLCBlLCB0aGlzW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiB0aGlzWzBdICYmIHRoaXNbMF1bdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVQcm9wOiBmdW5jdGlvbiB6ZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gWltlXSB8fCBlLCB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24gZSh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gJ2RhdGEtJyArIHQucmVwbGFjZShVLCAnLSQxJykudG9Mb3dlckNhc2UoKSwgZSA9IDEgaW4gYXJndW1lbnRzID8gdGhpcy5hdHRyKHIsIG4pIDogdGhpcy5hdHRyKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSA/IEMoZSkgOiBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsOiBmdW5jdGlvbiBIZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIGluIGFyZ3VtZW50cyA/IChudWxsID09IHQgJiYgKHQgPSAnJyksIHRoaXMuZWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGIodGhpcywgdCwgZSwgdGhpcy52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IHRoaXNbMF0gJiYgKHRoaXNbMF0ubXVsdGlwbGUgPyB3KHRoaXNbMF0pLmZpbmQoJ29wdGlvbicpLmZpbHRlcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucGx1Y2soJ3ZhbHVlJykgOiB0aGlzWzBdLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDogZnVuY3Rpb24gV2UoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHcodGhpcyksIG4gPSBiKHRoaXMsIGEsIGUsIHQub2Zmc2V0KCkpLCByID0gdC5vZmZzZXRQYXJlbnQoKS5vZmZzZXQoKSwgaSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbi50b3AgLSByLnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IG4ubGVmdCAtIHIubGVmdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0aWMnID09IHQuY3NzKCdwb3NpdGlvbicpICYmIChpLnBvc2l0aW9uID0gJ3JlbGF0aXZlJyksIHQuY3NzKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEwuZG9jdW1lbnRFbGVtZW50ICE9PSB0aGlzWzBdICYmICF3LmNvbnRhaW5zKEwuZG9jdW1lbnRFbGVtZW50LCB0aGlzWzBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGUubGVmdCArIHRsLnBhZ2VYT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlLnRvcCArIHRsLnBhZ2VZT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQoZS53aWR0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQoZS5oZWlnaHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3M6IGZ1bmN0aW9uIGUodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnN0eWxlW0EodCldIHx8IGdldENvbXB1dGVkU3R5bGUociwgJycpLmdldFByb3BlcnR5VmFsdWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWUodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHt9LCBhID0gZ2V0Q29tcHV0ZWRTdHlsZShyLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcuZWFjaCh0LCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW3RdID0gci5zdHlsZVtBKHQpXSB8fCBhLmdldFByb3BlcnR5VmFsdWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IG8odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIHx8IDAgPT09IG4gPyBlID0gZih0KSArICc6JyArIHAodCwgbikgOiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoZih0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtJXSB8fCAwID09PSB0W0ldID8gZSArPSBmKEkpICsgJzonICsgcChJLCB0W0ldKSArICc7JyA6IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoZihJKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGZ1bmN0aW9uIEdlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyB0aGlzLmluZGV4T2YodyhlKVswXSkgOiB0aGlzLnBhcmVudCgpLmNoaWxkcmVuKCkuaW5kZXhPZih0aGlzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NsYXNzOiBmdW5jdGlvbiBZZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgVC5zb21lLmNhbGwodGhpcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3QoXyhlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4oZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3M6IGZ1bmN0aW9uIFhlKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyB0aGlzLmVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY2xhc3NOYW1lJyBpbiB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gXyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKHRoaXMsIG4sIGUsIHQpLnNwbGl0KC9ccysvZykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3KHRoaXMpLmhhc0NsYXNzKGUpIHx8IEQucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKSwgRC5sZW5ndGggJiYgXyh0aGlzLCB0ICsgKHQgPyAnICcgOiAnJykgKyBELmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzOiBmdW5jdGlvbiBLZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY2xhc3NOYW1lJyBpbiB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT09IEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfKHRoaXMsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEID0gXyh0aGlzKSwgYih0aGlzLCB0LCBlLCBEKS5zcGxpdCgvXHMrL2cpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRCA9IEQucmVwbGFjZShuKGUpLCAnICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBfKHRoaXMsIEQudHJpbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVDbGFzczogZnVuY3Rpb24gUWUobiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHRoaXMuZWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB3KHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYih0aGlzLCBuLCBlLCBfKHRoaXMpKS5zcGxpdCgvXHMrL2cpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociA9PT0gRSA/ICF0Lmhhc0NsYXNzKGUpIDogcikgPyB0LmFkZENsYXNzKGUpIDogdC5yZW1vdmVDbGFzcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IGZ1bmN0aW9uICRlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdzY3JvbGxUb3AnIGluIHRoaXNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gRSA/IHQgPyB0aGlzWzBdLnNjcm9sbFRvcCA6IHRoaXNbMF0ucGFnZVlPZmZzZXQgOiB0aGlzLmVhY2godCA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvcCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5zY3JvbGxYLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxMZWZ0OiBmdW5jdGlvbiBKZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnc2Nyb2xsTGVmdCcgaW4gdGhpc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBFID8gdCA/IHRoaXNbMF0uc2Nyb2xsTGVmdCA6IHRoaXNbMF0ucGFnZVhPZmZzZXQgOiB0aGlzLmVhY2godCA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbExlZnQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvKGUsIHRoaXMuc2Nyb2xsWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IGZ1bmN0aW9uIFplKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpc1swXSwgdCA9IHRoaXMub2Zmc2V0UGFyZW50KCksIG4gPSB0aGlzLm9mZnNldCgpLCByID0gQi50ZXN0KHRbMF0ubm9kZU5hbWUpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdC5vZmZzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnRvcCAtPSBwYXJzZUZsb2F0KHcoZSkuY3NzKCdtYXJnaW4tdG9wJykpIHx8IDAsIG4ubGVmdCAtPSBwYXJzZUZsb2F0KHcoZSkuY3NzKCdtYXJnaW4tbGVmdCcpKSB8fCAwLCByLnRvcCArPSBwYXJzZUZsb2F0KHcodFswXSkuY3NzKCdib3JkZXItdG9wLXdpZHRoJykpIHx8IDAsIHIubGVmdCArPSBwYXJzZUZsb2F0KHcodFswXSkuY3NzKCdib3JkZXItbGVmdC13aWR0aCcpKSB8fCAwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBuLnRvcCAtIHIudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IG4ubGVmdCAtIHIubGVmdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50OiBmdW5jdGlvbiBldCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSB0aGlzLm9mZnNldFBhcmVudCB8fCBMLmJvZHk7IGUgJiYgIUIudGVzdChlLm5vZGVOYW1lKSAmJiAnc3RhdGljJyA9PSB3KGUpLmNzcygncG9zaXRpb24nKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUub2Zmc2V0UGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcuZm4uZGV0YWNoID0gdy5mbi5yZW1vdmUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIucmVwbGFjZSgvLi8sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzBdLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy5mbltyXSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuID0gdGhpc1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IEUgPyBhKG4pID8gblsnaW5uZXInICsgaV0gOiBjKG4pID8gbi5kb2N1bWVudEVsZW1lbnRbJ3Njcm9sbCcgKyBpXSA6IChlID0gdGhpcy5vZmZzZXQoKSkgJiYgZVtyXSA6IHRoaXMuZWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSB3KHRoaXMpKS5jc3MociwgYih0aGlzLCB0LCBlLCBuW3JdKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB6LmZvckVhY2goZnVuY3Rpb24gKHQsIGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGwgJSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcuZm5bdF0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBzLCBjID0gdy5tYXAoYXJndW1lbnRzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhcnJheScgPT0gKG4gPSBvKGUpKSA/IChlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubm9kZVR5cGUgIT09IEUgPyB0LnB1c2goZSkgOiB3LnplcHRvLmlzWihlKSA/IHQgPSB0LmNvbmNhdChlLmdldCgpKSA6IHZvaWQgKHQgPSB0LmNvbmNhdCgkLmZyYWdtZW50KGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQpIDogJ29iamVjdCcgPT0gbiB8fCBudWxsID09IGUgPyBlIDogJC5mcmFnbWVudChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB1ID0gMSA8IHRoaXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5sZW5ndGggPCAxID8gdGhpcyA6IHRoaXMuZWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGQgPyB0IDogdC5wYXJlbnROb2RlLCB0ID0gMCA9PSBsID8gdC5uZXh0U2libGluZyA6IDEgPT0gbCA/IHQuZmlyc3RDaGlsZCA6IDIgPT0gbCA/IHQgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB3LmNvbnRhaW5zKEwuZG9jdW1lbnRFbGVtZW50LCBzKSwgciA9IC9eKHRleHR8YXBwbGljYXRpb24pXC8oamF2YXNjcmlwdHxlY21hc2NyaXB0KSQvLCBpID0gbnQoKSwgYSA9IGlbbmddLCBvID0gaVtyZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUuY2xvbmVOb2RlKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoZSkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamwoYSkgJiYgJ1NDUklQVCcgPT09IGUudGFnTmFtZSAmJiBlLnNldEF0dHJpYnV0ZSgnbm9uY2UnLCBhKSwgamwobykgJiYgJ1NUWUxFJyA9PT0gZS50YWdOYW1lICYmIGUuc2V0QXR0cmlidXRlKCdub25jZScsIG8pLCBzLmluc2VydEJlZm9yZShlLCB0KSwgbiAmJiB4KGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gZS5ub2RlTmFtZSB8fCAnU0NSSVBUJyAhPT0gZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpIHx8IGUudHlwZSAmJiAhci50ZXN0KGUudHlwZS50b0xvd2VyQ2FzZSgpKSB8fCBlLnNyYyB8fCBrKEwsIGUuaW5uZXJIVE1MLCBlLm5vbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3LmZuW2QgPyB0ICsgJ1RvJyA6ICdpbnNlcnQnICsgKGwgPyAnQmVmb3JlJyA6ICdBZnRlcicpXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KGUpW3RdKHRoaXMpLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgJC5aLnByb3RvdHlwZSA9IG0ucHJvdG90eXBlID0gdy5mbiwgJC51bmlxID0gUywgJC5kZXNlcmlhbGl6ZVZhbHVlID0gQywgdy56ZXB0byA9ICQsIHc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZSh1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZ2V0Q29tcHV0ZWRTdHlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bC5nZXRDb21wdXRlZFN0eWxlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFb2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBybCA9IChubCA9IHNsKS56ZXB0bywgaWwgPSBybC5xc2EsIGFsID0gL15ccyo+Lywgb2wgPSAnWmVwdG8nICsgK25ldyBEYXRlKCksIHJsLnFzYSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPyBhbC50ZXN0KGkpICYmIChyID0gbmwoZSkuYWRkQ2xhc3Mob2wpLCBpID0gJy4nICsgb2wgKyAnICcgKyBpKSA6IGkgPSAnKicsIG4gPSBpbChlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIHIucmVtb3ZlQ2xhc3Mob2wpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNsKSwgRWcgPSBjbC5NdXRhdGlvbk9ic2VydmVyIHx8IGNsLldlYmtpdE11dGF0aW9uT2JzZXJ2ZXIsIElnID0gJ0V4cGVjdGVkIGFuIGFycmF5IG9mIHByb21pc2VzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbC5fc2V0SW1tZWRpYXRlRm4gJiYgUmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2cgPSBIKCksIERnID0gLy4qXC4oXGQrKV9cZCsvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0KGNsLCB1bCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEFnID0gJ2F0LWxpYnJhcnktbG9hZGVkJywgU2cgPSAnYXQtcmVxdWVzdC1zdGFydCcsIFRnID0gJ2F0LXJlcXVlc3Qtc3VjY2VlZGVkJywgUGcgPSAnYXQtcmVxdWVzdC1mYWlsZWQnLCBPZyA9ICdhdC1jb250ZW50LXJlbmRlcmluZy1zdGFydCcsIGpnID0gJ2F0LWNvbnRlbnQtcmVuZGVyaW5nLXN1Y2NlZWRlZCcsIExnID0gJ2F0LWNvbnRlbnQtcmVuZGVyaW5nLWZhaWxlZCcsIE1nID0gJ2F0LWNvbnRlbnQtcmVuZGVyaW5nLW5vLW9mZmVycycsIFZnID0gJ2F0LWNvbnRlbnQtcmVuZGVyaW5nLXJlZGlyZWN0JywgUmcgPSAnOmVxKCcsIEZnID0gJyknLCBOZyA9IFJnLmxlbmd0aCwgQmcgPSAvKChcLnwjKSgtKT9cZHsxfSkvZywgVWcgPSAnVW5hYmxlIHRvIGxvYWQgdGFyZ2V0LXZlYy5qcycsIHFnID0gJ0xvYWRpbmcgdGFyZ2V0LXZlYy5qcycsIHpnID0gJ19BVCcsIEhnID0gJ2NsaWNrSGFuZGxlckZvckV4cGVyaWVuY2VFZGl0b3InLCBXZyA9ICdjdXJyZW50VmlldycsIEdnID0gJ2F0X3FhX21vZGUnLCBZZyA9ICdhdF9wcmV2aWV3X3Rva2VuJywgWGcgPSAnYXRfcHJldmlld19pbmRleCcsIEtnID0gJ2F0X3ByZXZpZXdfbGlzdGVkX2FjdGl2aXRpZXNfb25seScsIFFnID0gJ2F0X3ByZXZpZXdfZXZhbHVhdGVfYXNfdHJ1ZV9hdWRpZW5jZV9pZHMnLCAkZyA9ICdhdF9wcmV2aWV3X2V2YWx1YXRlX2FzX2ZhbHNlX2F1ZGllbmNlX2lkcycsIEpnID0gJ18nLCBaZyA9IGZ1bmN0aW9uIFpnKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZW0gPSAnYXQtJywgdG0gPSAnYXQtYm9keS1zdHlsZScsIG5tID0gJyMnICsgdG0sIHJtID0gZW0gKyAndmlld3MnLCBpbSA9ICdEaXNhYmxlZCBkdWUgdG8gb3B0b3V0JywgYW0gPSAnTUNBQU1CJywgb20gPSAnTUNBQU1MSCcsIHNtID0gJ01DTUlEJywgY20gPSAnTUNPUFRPVVQnLCB1bSA9ICdnZXRTdXBwbGVtZW50YWxEYXRhSUQnLCBsbSA9ICdnZXRDdXN0b21lcklEcycsIGRtID0gJ3RyYWNraW5nU2VydmVyJywgZm0gPSBkbSArICdTZWN1cmUnLCBwbSA9ICdWaXNpdG9yJywgZ20gPSAnZ2V0SW5zdGFuY2UnLCBtbSA9ICdpc0FsbG93ZWQnLCBobSA9ICdWaXNpdG9yIEFQSSByZXF1ZXN0cyB0aW1lZCBvdXQnLCB2bSA9ICdWaXNpdG9yIEFQSSByZXF1ZXN0cyBlcnJvcicsIGJtID0ge30sIHltID0gJ0RhdGEgcHJvdmlkZXInLCBfbSA9ICd0aW1lZCBvdXQnLCBDbSA9IDIwMDAsIHhtID0gJ2F1dGhvcml6YXRpb24nLCBrbSA9ICdtYm94RGVidWdUb29scycsIEVtID0gYXIoKSwgSW0gPSAncHJvZmlsZS4nLCB3bSA9ICdtYm94M3JkUGFydHlJZCcsIERtID0gJ2F0X3Byb3BlcnR5JywgQW0gPSAnb3JkZXJJZCcsIFNtID0gJ29yZGVyVG90YWwnLCBUbSA9ICdwcm9kdWN0UHVyY2hhc2VkSWQnLCBQbSA9ICdwcm9kdWN0SWQnLCBPbSA9ICdjYXRlZ29yeUlkJywgam0gPSAnUE9TVCcsIExtID0gJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnLCBNbSA9ICdSZXF1ZXN0IHRpbWVkIG91dCcsIFZtID0gJ01hbGZvcm1lZCByZXNwb25zZSBKU09OJywgUm0gPSAnd2ViJywgRm0gPSAnbWJveGVkZ2UnLCBObSA9ICcudHQub210cmRjLm5ldCcsIEJtID0gZnVuY3Rpb24gQm0oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFTKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBVbSA9IGZ1bmN0aW9uIFVtKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcW0gPSBmdW5jdGlvbiBxbSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB6bSA9IHFtKGcpLCBIbSA9IGZ1bmN0aW9uIEhtKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgV20gPSBmdW5jdGlvbiBXbShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdGF0dXMgPT09IF9mOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBHbSA9IGZ1bmN0aW9uIEdtKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGUgPT09IE9mOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBZbSA9IGZ1bmN0aW9uIFltKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGUgPT09IGNkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBYbSA9IEhtKHptKSwgS20gPSBVbShMcCksIFFtID0gVW0oQmwpLCAkbSA9IFVtKGpmKSwgSm0gPSBmdW5jdGlvbiBKbShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamwoZS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgWm0gPSBmdW5jdGlvbiBabShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcoZS5pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGVoID0gZnVuY3Rpb24gZWgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSkgJiYgSm0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoID0gZnVuY3Rpb24gdGgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSkgJiYgSm0oZSkgJiYgWm0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5oID0gZnVuY3Rpb24gbmgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSkgJiYgSm0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJoID0gZnVuY3Rpb24gcmgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpsKGUuc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpaCA9IFVtKExmKSwgYWggPSBiKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIG9oID0gJ2Fkb2JlX21jX3NkaWQnLCBzaCA9ICdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJywgY2ggPSAnUmVxdWVzdCB0aW1lZCBvdXQnLCB1aCA9ICdVUkwgaXMgcmVxdWlyZWQnLCBsaCA9ICdHRVQnLCBkaCA9ICdQT1NUJywgZmggPSAnbWV0aG9kJywgcGggPSAndXJsJywgZ2ggPSAnaGVhZGVycycsIG1oID0gJ2RhdGEnLCBoaCA9ICdjcmVkZW50aWFscycsIHZoID0gJ3RpbWVvdXQnLCBiaCA9ICdhc3luYycsIHloID0gL0NMS1RSSyMoXFMrKS8sIF9oID0gL0NMS1RSSyMoXFMrKVxzLywgQ2ggPSBmdW5jdGlvbiBaZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHhoID0gJ3Zpc2liaWxpdHlTdGF0ZScsIGtoID0gJ3Zpc2libGUnLCBFaCA9IDEwMCwgSWggPSBNZCArICcsJyArIFJkICsgJywnICsgVmQsIHdoID0gJ2F0LWFjdGlvbi1rZXknLCBEaCA9ICdtZXRyaWMgZWxlbWVudCBub3QgZm91bmQnLCBBaCA9ICduYXZpZ2F0b3InLCBTaCA9ICdzZW5kQmVhY29uJywgVGggPSAnQmVhY29uIGRhdGEgc2VudCcsIFBoID0gJ0JlYWNvbiBkYXRhIHNlbnQgZmFpbGVkJywgT2ggPSAnVmlldyB0cmlnZ2VyZWQgbm90aWZpY2F0aW9uJywgamggPSAnVmlldyByZW5kZXJlZCBub3RpZmljYXRpb24nLCBMaCA9ICdNYm94ZXMgcmVuZGVyZWQgbm90aWZpY2F0aW9uJywgTWggPSAnRXZlbnQgaGFuZGxlciBub3RpZmljYXRpb24nLCBWaCA9ICdNYm94IGV2ZW50IGhhbmRsZXIgbm90aWZpY2F0aW9uJywgUmggPSAnVmlldyBldmVudCBoYW5kbGVyIG5vdGlmaWNhdGlvbicsIEZoID0gJ3ByZWZldGNoTWJveGVzJywgTmggPSAncmVuZGVyZWQnLCBCaCA9ICd0cmlnZ2VyZWQnLCBVaCA9IHt9LCBxaCA9ICdwYWdlTG9hZE1ldHJpY3MnLCB6aCA9ICdwcmVmZXRjaE1ldHJpY3MnLCBIaCA9IFVtKE1wKSwgV2ggPSBmdW5jdGlvbiBXaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwaSh3Zik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEdoID0gZnVuY3Rpb24gR2goZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdpKHdmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgWWggPSBVbShCbCksIFhoID0gVW0oS2wpLCBLaCA9IGZ1bmN0aW9uIEtoKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwaShJZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFFoID0gZnVuY3Rpb24gUWgoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdpKElmLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJGggPSBmdW5jdGlvbiAkaChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcW0oV20pKGUpICYmIGFoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb246IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRoaXMuZSB8fCAodGhpcy5lID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyW2VdIHx8IChyW2VdID0gW10pKS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHg6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLm9mZihlLCByKSwgdC5hcHBseShuLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuXyA9IHQsIHRoaXMub24oZSwgciwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCBuID0gKCh0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSlbZV0gfHwgW10pLnNsaWNlKCksIHIgPSAwLCBpID0gbi5sZW5ndGg7IHIgPCBpOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltyXS5mbi5hcHBseShuW3JdLmN0eCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KSwgciA9IG5bZV0sIGkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICYmIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDAsIG8gPSByLmxlbmd0aDsgYSA8IG87IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclthXS5mbiAhPT0gdCAmJiByW2FdLmZuLl8gIT09IHQgJiYgaS5wdXNoKHJbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubGVuZ3RoID8gbltlXSA9IGkgOiBkZWxldGUgbltlXSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEpoID0gbmMsIFpoID0gbmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmguVGlueUVtaXR0ZXIgPSBaaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXYgPSByYygpLCB0diA9ICdQYWdlIGxvYWQgcmVuZGVyaW5nIGZhaWxlZCcsIG52ID0gJ01ib3hlcyByZW5kZXJpbmcgZmFpbGVkJywgcnYgPSAnVmlldyByZW5kZXJpbmcgZmFpbGVkJywgaXYgPSAnUHJlZmV0Y2ggcmVuZGVyaW5nIGZhaWxlZCcsIGF2ID0gZnVuY3Rpb24gYXYoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFTKG0oV20sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgb3YgPSAnW3BhZ2UtaW5pdF0nLCBzdiA9ICdbZ2V0T2ZmZXIoKV0nLCBjdiA9ICdbZ2V0T2ZmZXJzKCldJywgdXYgPSAnW2FwcGx5T2ZmZXIoKV0nLCBsdiA9ICdbYXBwbHlPZmZlcnMoKV0nLCBkdiA9ICdbc2VuZE5vdGlmaWNhdGlvbnMoKV0nLCBmdiA9ICdbdHJhY2tFdmVudCgpXScsIHB2ID0gJ1t0cmlnZ2VyVmlldygpXScsIGd2ID0gW10sIG12ID0gMSwgaHYgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFd1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZ2ID0gJ2Z1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgZ2V0T2ZmZXIoKSBhbmQgYXBwbHlPZmZlcigpIGZ1bmN0aW9ucyBpbnN0ZWFkLicsIGJ2ID0gJ2Fkb2JlLnRhcmdldC5yZWdpc3RlckV4dGVuc2lvbigpIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXZpZXcgdGhlIGRvY3VtZW50YXRpb24gZm9yIGFsdGVybmF0aXZlcy4nLCB5diA9ICdtYm94Q3JlYXRlKCkgJyArIHZ2LCBfdiA9ICdtYm94RGVmaW5lKCkgJyArIHZ2LCBDdiA9ICdtYm94VXBkYXRlKCkgJyArIHZ2LCB4diA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ6IGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbmZpZzogJCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXREZWxpdmVyeTogSmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB4djsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLXRhcmdldC12Mi9saWIvbWVzc2FnZXMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxSRUFEWV9JTklUSUFMSVpFRDogJ0FUOiBBZG9iZSBUYXJnZXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUxJVkVSWV9ESVNBQkxFRDogJ0FUOiBBZG9iZSBUYXJnZXQgY29udGVudCBkZWxpdmVyeSBpcyBkaXNhYmxlZC4gVXBkYXRlIHlvdXIgRE9DVFlQRSB0byBzdXBwb3J0IFN0YW5kYXJkcyBtb2RlLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX1JFUVVFU1Q6ICdBVDogVGFyZ2V0IGxpYnJhcnkgaXMgZWl0aGVyIG5vdCBsb2FkZWQgb3IgZGlzYWJsZWQsIG5vIHJlcXVlc3Qgd2lsbCBiZSBleGVjdXRlZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9tb2R1bGVzL3BhcmFtcy1zdG9yZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGUudmFsdWUgJiYgbnVsbCAhPSBlLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8odCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuY2hlY2tlZCwgciA9IHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAnJyA9PT0gciB8fCAoYVtlXSA9IHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGQsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gbignLi9vYmplY3Qtb3ZlcnJpZGUnKSwgbCA9IHt9LCBkID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZVBhcmFtczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VQYWdlTG9hZFBhcmFtczogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1zOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWdlTG9hZFBhcmFtczogYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL21vZHVsZXMvb2JqZWN0LW92ZXJyaWRlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSAhPT0gciAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHRoaXMuc3Vic2V0KSB8fCAtMSAhPT0gdGhpcy5zdWJzZXQuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobikuZmlsdGVyKGksIHsgc3Vic2V0OiBlIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIodCwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL2xpYnJhcnlTZXR0aW5ncy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IHZlcnNpb246ICcyLjMuMicgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7IFRBUkdFVF9ERUZBVUxUX1NFVFRJTkdTOiB0IH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS10YXJnZXQtdjIvbGliL21vZHVsZXMvcGFnZS1sb2FkLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJy4uL2xpYnJhcnlTZXR0aW5ncycpLCBpID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIGEgPSBuKCcuL29iamVjdC1vdmVycmlkZScpLCBvID0gbignLi9wYXJhbXMtc3RvcmUnKSwgcyA9IG8uZ2V0UGFyYW1zLCBjID0gby5nZXRQYWdlTG9hZFBhcmFtcywgdSA9IG4oJy4uL3RhcmdldFNldHRpbmdzJykudGFyZ2V0U2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUubWJveFBhcmFtcyA9IHMoKSwgdS5nbG9iYWxNYm94UGFyYW1zID0gYygpLCBhKHUsIGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib2R5SGlkaW5nRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9keUhpZGRlblN0eWxlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgYSh1LCBpLnRhcmdldEdsb2JhbFNldHRpbmdzIHx8IHt9LCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9keUhpZGluZ0VuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvZHlIaWRkZW5TdHlsZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGEodSwgci5UQVJHRVRfREVGQVVMVF9TRVRUSU5HUyB8fCB7fSwgWyd2ZXJzaW9uJ10pLCB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDMwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi4yLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6ICcvcmVzdC92MS9kZWxpdmVyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXNPcmdJZDogJzFFMjIxNzFCNTIwRTkzQkYwQTQ5MEQ0NEBBZG9iZU9yZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDb2RlOiAnZmVkZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlT25seTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTdGF0ZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbkVuYWJsZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRG9tYWluOiAnZmVkZXgudHQub210cmRjLm5ldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxTaXplTGltaXQ6IDIwNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3c0VuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0b3V0RW5hYmxlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5SGlkZGVuU3R5bGU6ICdib2R5IHtvcGFjaXR5OiAwfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTG9hZEVuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbHl0aWNzTG9nZ2luZzogJ3NlcnZlcl9zaWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkTGlmZXRpbWU6IDYzMjQ0ODAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUhpZGluZ0VuYWJsZWQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkTGlmZXRpbWU6IDE4NjAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdG9yQXBpVGltZW91dDogMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcmluZ1NjcmlwdFVybDogJy8vY2RuLnR0Lm9tdHJkYy5uZXQvY2RuL3RhcmdldC12ZWMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVNYm94RWRnZVNlcnZlcjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnNQb2xsaW5nVGltZW91dDogNTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250ZW50SGlkZGVuU3R5bGU6ICd2aXNpYmlsaXR5OiBoaWRkZW47JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRDb250ZW50VmlzaWJsZVN0eWxlOiAndmlzaWJpbGl0eTogdmlzaWJsZTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVNYm94RWRnZVNlcnZlclRpbWVvdXQ6IDE4NjAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGVtZW50YWxEYXRhSWRQYXJhbVRpbWVvdXQ6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQMjY5NzkyYWE3MzE5NDU3ZWE3ZGQ2NzBkM2YyZjY4ZTUvJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNvbnRlbnRzcXVhcmU6IHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0NvbnRlbnRTcXVhcmUnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzcXVhcmUvc3JjL2xpYi9hY3Rpb25zL3V4YUluc3RhbGxhdGlvbi5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd1eGEtaW5zdGFsbGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnTWFpbiBUcmFja2luZyBUYWcgaW5zdGFsbGF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGksIGEgPSBvLmdldEV4dGVuc2lvblNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICE9PSBlLnNldFBhdGhJbnB1dCA/IChyID0gZS5zZXRQYXRoSW5wdXQsIHIgKz0gd2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICc/X18nKSkgOiByID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLmhhc2gucmVwbGFjZSgnIycsICc/X18nKSwgaSA9ICcnICE9PSBlLnNldFF1ZXJ5SW5wdXQgPyBlLnNldFF1ZXJ5SW5wdXQgOiB3aW5kb3cubG9jYXRpb24uc2VhcmNoLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX3V4YSA9IHdpbmRvdy5fdXhhIHx8IFtdLCB3aW5kb3cuX3V4YS5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0UGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHdpbmRvdy5fdXhhLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXRRdWVyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIDwgYS5jdmFycy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYS5jdmFycy5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fdXhhLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXRDdXN0b21WYXJpYWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmN2YXJzW2VdLmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmN2YXJzW2VdLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBDU19DT05GKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JywgdC5hc3luYyA9ICEwLCB0LnNyYyA9ICcvL3QuY29udGVudHNxdWFyZS5uZXQvdXhhLycgKyBhLnByb2plY3RfaWQgKyAnLmpzJywgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fdXhhLnB1c2goWyd0cmFja1BhZ2V2aWV3J10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgY3ZhcnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X2lkOiAnJXRhZ0lEOmNvbnRlbnRTcXVhcmUlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaG9zdGVkTGliRmlsZXNCYXNlVXJsOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVBhYmM0MDI2OTA4MmY0MzQ4YmE4ZmFmMmM2NmM3OTk3Yy8nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGNvbXBhbnk6IHsgb3JnSWQ6ICcxRTIyMTcxQjUyMEU5M0JGMEE0OTBENDRAQWRvYmVPcmcnIH0sCiAgICAgICAgICAgIHByb3BlcnR5OiB7CiAgICAgICAgICAgICAgICBuYW1lOiAnRmVkRXgnLAogICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICBkb21haW5zOiBbJ2ZlZGV4LmNvbSddLAogICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eTogITEsCiAgICAgICAgICAgICAgICAgICAgcnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkOiAhMQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBydWxlczogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw0NDM1NDU0ZGExYTE0MGQyOGJjMWEzNWY1ZGY5YjU1ZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6R2xvYmFsJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9saWJyYXJ5TG9hZGVkLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9mZHgucGNmVXRpbCgpLm1hdGNoKC93d3coc2JveC5pZGV2fGJhc2UuaWRldnxkZXYuaWRldnxkcnQuaWRldnxzdHJlc3MuZG16LmlkZXZ8Yml0LmlkZXZ8dGVzdHwpLmZlZGV4LmNvbS9naSksIHQgPSAnJyA9PSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZ0Rpc2FibGVMb2NhbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEobnVsbCA9PT0gZSB8fCAhdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8IS0tIExvZ2ljIHRvIGZldGNoIEdUQUcgR2xvYmFsIERDICYgQVcgSUQgLS0+XG48IS0tIFxuLy9TdGFydCBvZiBnbG9iYWwgc25pcHBldDogUGxlYXNlIGRvIG5vdCByZW1vdmVcbi8vUGxhY2UgdGhpcyBzbmlwcGV0IGJldHdlZW4gdGhlIDxoZWFkPiBhbmQgPC9oZWFkPiB0YWdzIG9uIGV2ZXJ5IHBhZ2Ugb2YgeW91ciBzaXRlLlxuLS0+XG48IS0tIEdsb2JhbCBzaXRlIHRhZyAoZ3RhZy5qcykgLSBEb3VibGVDbGljayAtLT5cbjxzY3JpcHQ+XG52YXIgY29uZmlnRENJRCA9ICIiO1xudmFyIGNvbmZpZ0FXSUQgPSAiIjtcbnZhciBvYmpDb25maWcgPSBfc2F0ZWxsaXRlLmdldFZhcigiZ1RhZzpDb25maWdMb2dpYyIpO1xuLy92YXIgY250cnlfY29kZSA9IEZEWC5EQVRBTEFZRVIucGFnZS5wYWdlSW5mby5jb3VudHJ5O1xuaWYgKHR5cGVvZiBvYmpDb25maWcgIT09ICJ1bmRlZmluZWQiICYmIG9iakNvbmZpZyAhPT0gIiIpIHtcblx0Y29uZmlnRENJRCA9IG9iakNvbmZpZ1siRENDb25maWdJRCJdO1xuXHRjb25maWdBV0lEID0gb2JqQ29uZmlnWyJBV0NvbmZpZ0lEIl07XG59XG4vL0dsb2JhbCBzaXRlIHRhZyAoZ3RhZy5qcykgXG5pZiAodHlwZW9mIGd0YWcgPT0gXCd1bmRlZmluZWRcJyl7XG5cdHZhciBzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO1xuXHRpZigoX3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKSkgIT09ICIiKSB7XG5cdFx0c2Muc2V0QXR0cmlidXRlKCJzcmMiLCAiaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1EQy0xOTgyNTc0Iilcblx0fVxuXG5cdGVsc2V7XG5cdFx0aWYoY29uZmlnRENJRCAhPT0gIiIpe1xuXHRcdFx0c2Muc2V0QXR0cmlidXRlKCJzcmMiLCAiaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD0iICsgY29uZmlnRENJRClcblx0XHR9XG5cdFx0ZWxzZSBpZihjb25maWdBV0lEICE9PSAiIil7XG5cdFx0XHRzYy5zZXRBdHRyaWJ1dGUoInNyYyIsICJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPSIgKyBjb25maWdBV0lEKVxuXHRcdH1cblx0fVxuXHRzYy5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0Iik7XG5cdHNjLnNldEF0dHJpYnV0ZShcJ2FzeW5jXCcsIHRydWUpO1xuXHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjKTtcblx0d2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107XG5cdGZ1bmN0aW9uIGd0YWcoKSB7XG5cdFx0ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTtcblx0fVxuXHRndGFnKFwnanNcJywgbmV3IERhdGUoKSk7XG59XG5lbHNle1xuXHRpZigoX3NhdGVsbGl0ZS5nZXRWYXIoImdUYWc6RW5hYmxlZExvY2FsZUVwaWMiKSkgIT09ICIiKXtcblx0Z3RhZyhcJ2NvbmZpZ1wnLCBcJ0RDLTE5ODI1NzRcJyk7XHRcbn1cblx0ZWxzZXtcblxuXHRcdGlmIChjb25maWdEQ0lEICE9PSAiIikge1xuXHRcdFx0Z3RhZyhcJ2NvbmZpZ1wnLCBjb25maWdEQ0lELCB7XG5cdFx0XHRcdFwncGFnZV9sb2NhdGlvblwnIDogd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZSgvZW1haWw9W14mO10qL2dpLFxuXHRcdFx0XHRcJ2VtYWlsPXJlZGFjdGVkXCcpXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY29uZmlnQVdJRCAhPT0gIiIpIHtcblx0XHRcdGd0YWcoXCdjb25maWdcJywgY29uZmlnQVdJRCwge1xuXHRcdFx0XHRcJ3BhZ2VfbG9jYXRpb25cJyA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnJlcGxhY2UoL2VtYWlsPVteJjtdKi9naSxcblx0XHRcdFx0XCdlbWFpbD1yZWRhY3RlZFwnKVxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1cbn1cblxuXG5cbjwvc2NyaXB0PlxuPCEtLSBFbmQgb2YgZ2xvYmFsIHNuaXBwZXQ6IFBsZWFzZSBkbyBub3QgcmVtb3ZlIC0tPlxuXG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDU2ODBhNWFiNmNjODRkNDE4NzdjOGRlZWJlZWNjOGNlJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYWRUYWc6dHJhZGVkZXNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9saWJyYXJ5TG9hZGVkLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3RyYWRlZGVzazpwYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpLCBfc2F0ZWxsaXRlLnNldFZhcigndHJhZGVkZXNrVVJMJywgX2ZkeC5wYWdlRmxhZyhlLCB0KSksICExICE9PSBfc2F0ZWxsaXRlLmdldFZhcigndHJhZGVkZXNrVVJMJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJib3JkZXItc3R5bGU6bm9uZTsiIGFsdD0iIiBzcmM9JXRyYWRlZGVza1VSTCUgLz4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDMwMzIyNzUxMTFiNDQ1NjZhZDk4NTY2ODFlMjdhZWYzJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnTUFHSUMgUE9DJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jdXN0b21FdmVudC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdldmVudC12aWV3LXN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdib2R5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDOGM2OWQxOGFlZGRlNDU4ODlhNmUwNWFlNGJkZGE0Y2Ytc291cmNlLm1pbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYzRkZGU1NTQ5ZWViNGY5MDhjMDAwYzFhNmViNWFjYTMnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzcDpkaXJlY3RIaXRzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ3NlYXJjaD10cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodm9pZCAwICE9PSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZScpICYmICdkZWxheWVkJyA9PSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZScpIHx8IC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignc2VhcmNoLmh0bWw/cT0nKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3JlZ2lzdGVyLmh0bWwnKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJy9vbmxpbmUvcmF0aW5nLmh0bWwnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpLmdldCgnc3B0ZXJtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IG4gJiYgJycgIT0gbiAmJiBudWxsICE9PSBuID8gKG4gPSBuLnJlcGxhY2UoL1w7LiovLCAnJyksIHQucHJvcDEgPSB0LmVWYXIxID0gbiwgdC5saW5rVHJhY2tFdmVudHMgPSB0LmV2ZW50cyA9IHQuYXBsKHQuZXZlbnRzLCAnZXZlbnQxMTgnLCAnLCcsIDIpKSA6IHQubGlua1RyYWNrRXZlbnRzID0gdC5ldmVudHMgPSB0LmFwbCh0LmV2ZW50cywgJ2V2ZW50MTE5JywgJywnLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGI4ZDcwZjZjYmE1MjQzZThiNTUzYTJkZjczZTFiZmZkJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpUYXJnZXRWaWRlb0V4cGVyaWVuY2UnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnLnZqcy1iaWctcGxheS1idXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnL2VuLXVzL2Vjb21tZXJjZS8oc2hpcHBpbmctb3B0aW9ucy5odG1sfHRvb2xzLWFuZC1zZXJ2aWNlcy5odG1sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6VGFyZ2V0VmlkZW9NYXBwaW5nJyksIHQgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLWlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigndGFyZ2V0VmlkZW9HdGFnTGFiZWwnLCBuKSwgITEgIT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM5MjBiYzFhM2FlYzg0Nzk3OTBmMjFmNzU2NWZlOGE5OC1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxiN2IzMDAxYzY2ZTk0ZTEyODZmMGM4MTU3YmEwNjMwNScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZpZGVvOlBsYXknLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL21lZGlhVGltZVBsYXllZC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6ICdwZXJjZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnLmJyaWdodGNvdmUtY29udGFpbmVyIHZpZGVvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgdGhpcy5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJyksIHIgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLWlkJyksIGkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdicmlnaHRjb3ZlLWNvbnRhaW5lcicpLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09IGlbYV0uZ2V0QXR0cmlidXRlKCdkYXRhLXBsYXllcmlkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmpzLWRvY2stdGl0bGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZVZhcjQyID0gb1thXS5pbm5lclRleHQsIHQuZVZhcjMxID0gciwgdC5saW5rVHJhY2tWYXJzID0gdC5hcGwodC5saW5rVHJhY2tWYXJzLCAnZVZhcjQyLGVWYXIzMScsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmtUcmFja0V2ZW50cyA9IHQuZXZlbnRzID0gJ2V2ZW50MjAzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdWaWRlbzpQbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2MmRkMGI2YmRmZjE0ZjdkOTQyOTJjZjMyNGM1ZTIyZScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWdJbmRpYTpBZHdvcmRzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLWluXFwvKHRyYWNraW5nfGhvbWV8Y29yb25hdmlydXN8c2hpcHBpbmd8YmlsbGluZykuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4taW5cXC8oY3VzdG9tZXItc3VwcG9ydHxvcGVuLWFjY291bnR8Y3VzdG9tcy10b29sc3xjb25kaXRpb25zLW9mLWNhcnJpYWdlKS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXC9lbi1pblxcLyhhYm91dHxjYW1wYWlnbnxvcGVuLWFjY291bnR8c2hpcHBpbmd8dHJ1c3QtY2VudGVyfG9ubGluZSlcXC8ocG9zc2liaWxpdGllc3xkZWxpdmVyaW5nLXdoYXQtbWF0dGVyc3xzdGFydC1zaGlwcGluZ3xzdXJjaGFyZ2VzfGdldHN0YXJ0ZWR8cmVzb3VyY2VzfHJhdGVzfHNtYWxsLWJ1c2luZXNzfHJlcG9ydC1mcmF1ZHxyYXRpbmcpLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLWluXFwvYWJvdXRcXC9wb3NzaWJpbGl0aWVzXFwvYXJ0aWNsZXNcXC9mbG93ZXJzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLWluXFwvYWJvdXRcXC9wb3NzaWJpbGl0aWVzXFwvbWFraW5nLWl0LXdvcmsuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4taW5cXC9zaGlwcGluZ1xcL2luZHVzdHJ5LXNvbHV0aW9uc1xcLyhoZWFsdGhjYXJlLmh0bWx8KGhlYWx0aGNhcmVcXC90ZW1wZXJhdHVyZS1jb250cm9sLmh0bWwpfChoZWFsdGhjYXJlXFwvY29udGFjdC11cy5odG1sKSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdndGFnKFwnZXZlbnRcJywgXCdwYWdlX3ZpZXdcJywge1xuICAgIFwnc2VuZF90b1wnOiBcJ0FXLTY3MzY4MTgyOVwnLFxufSk7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwzNGNlZmM5NTlmZGE0YTU2YTliNWIwZjNjMjRhMTI4YScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6QnV0dG9uRXZlbnQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnI3N1YnNjcmliZWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpFbmFibGVkTG9jYWxlRXBpYycpICE9PSB1bmRlZmluZWQgJiYgbnVsbCAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6RW5hYmxlZExvY2FsZUVwaWMnKSAmJiAnJyAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6RW5hYmxlZExvY2FsZUVwaWMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2I2N2QzNDY5NGE1ZjRhMzdiZTE2YzAwYTZjNzk2NzViLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGI3MGE4NTNiMGI3ZDQ0NDE5ZTZmN2Y1ODdjMDIyYmQyJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZXZlbnQ6c29jaWFsIHNoYXJlJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2ltZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnRpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YS1hbmFseXRpY3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdzb2NpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoMCA8PSBlLmluZGV4T2YoJ05ld3NsZXR0ZXInKSAmJiAoZmR4X3NldExpbmtWaWV3KGUpLCAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGlua1RyYWNrVmFycyA9IHQuYXBsKHQubGlua1RyYWNrVmFycywgJ3Byb3AxOCxwcm9wMTkscHJvcDIwLGVWYXI2NScsICcsJywgMiksIHQuZXZlbnRzID0gdC5hcGwodC5ldmVudHMsICdldmVudDU2JywgJywnLCAyKSwgJ05vbmUnICE9PSB0LmxpbmtUcmFja0V2ZW50cyA/IHQubGlua1RyYWNrRXZlbnRzID0gdC5saW5rVHJhY2tFdmVudHMgKyAnLGV2ZW50NTYnIDogdC5saW5rVHJhY2tFdmVudHMgPSAnZXZlbnQ1NicsIHdpbmRvdy5ubHRyayA9ICd5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gbiAmJiBudWxsICE9PSBuICYmICh0LmVWYXI2NSA9IG4uc3Vic3RyaW5nKG4ubGFzdEluZGV4T2YoJ3wnKSArIDEpLCB0LnByb3AxOCA9IHQucGFnZU5hbWUsIHQucHJvcDE5ID0gbiwgdC5wcm9wMjAgPSB0LnBhZ2VOYW1lICsgJyB8ICcgKyBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMmZkZTVlNDA4ZTViNDc5NmIxMTY2ZDc0MTA5MDI1M2MnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdldmVudDpocCBsaW5rIGNsaWNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnLionLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB2b2lkIDAgIT09IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcycpID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzJykgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5saW5rTmFtZSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdm9pZCAwICE9PSB0aGlzLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykgJiYgbnVsbCAhPT0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpICYmICcnICE9PSB0aGlzLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykgPyAnbmV3UGFnZScgOiAnc2FtZVBhZ2UnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycgIT0gZSAmJiAtMSA8IGUuaW5kZXhPZignbWZ4cicpICYmICh0ID0gJ3NhbWVQYWdlJyksICdzYW1lUGFnZScgPT0gdCAmJiAtMSA8IGUuaW5kZXhPZignL2NvbnRlbnQvZGFtL2ZlZGV4JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9ICcnLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBfc2F0ZWxsaXRlLmdldFZhcignY2xpY2s6YmxvY2tGbGFnJykoZSwgJ2NsaWNrOmJsb2NrTGlzdCcpLCByID0geyBoZXJvOiAnZXZlbnQyMDAnIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGEgPSAnJywgRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZSA9ICcnLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCduZXdQYWdlJyA9PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGEgPSAnJywgRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZSA9ICcnLCBmZHhfc2V0TGlua1ZpZXcoZSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NhbWVQYWdlJyA9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHJbZS5zcGxpdCgnfCcpWzBdLnRvTG93ZXJDYXNlKCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGEgPSAnJywgRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZSA9ICcnLCAtMSA8IHRoaXMuaHJlZi5pbmRleE9mKCd0ZWw6JykgfHwgZmR4X2xvZ0xpbmtWaWV3KGUsIGkpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW10KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDIxNDg4OGIyMDllZjQ1MDY5YjI4YjcwZjZjNDNhNWQzJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZmJUYWc6R2xvYmFsJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLXVzXFwvc2hpcHBpbmdcXC8oKGZyZWlnaHQtc2VydmljZXMpfChzY2hlZHVsZS1tYW5hZ2UtcGlja3Vwcyl8KHN0b3JlXFwvZ3JvdW5kKXwocGFja2luZy1zdXBwbGllcyl8KHBhY2tpbmctc3VwcGxpZXNcXC9jdXN0b20tYnJhbmRlZC1ib3hlcyl8KG9mZmljZS1kZXBvdC1vZmZpY2VtYXgpfChob2xkLWF0LWxvY2F0aW9uKSkuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4tdXNcXC9zaGlwcGluZ1xcL3JldHVybnMoKChcXC9idXNpbmVzcyl8KFxcL3RlY2hub2xvZ3kpKVxcLmh0bWx8XFwuaHRtbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLXVzXFwvc2hpcHBpbmdcXC9vbnNpdGUoKChcXC93YWxncmVlbnMtcGFja2FnZS1waWNrdXApfChcXC9kb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UpfChcXC90YXJnZXQtcGljay11cC1kcm9wLW9mZi1wYWNrYWdlKSlcXC5odG1sfFxcLmh0bWwpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXC9lbi11c1xcL3ByaW50aW5nXFwvKChzbWFsbC1tZWRpdW0tYnVzaW5lc3Mtb2ZmZXJzKXwoY29uc3VtZXItb2ZmZXJzKXwoZmxhc2gtc2FsZS1vZmZlcnMpfChwYXNzcG9ydC1waG90byl8KG5hdGlvbmFsLWJpZC1jZW50ZXIpfChidXNpbmVzcy1zb2x1dGlvbnNcXC9rbm93bGVkZ2UtY2VudGVyKXwoZGVzaWduLXNlcnZpY2VzKSlcXC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXC9lbi11c1xcL2Rpc2NvdW50LXByb2dyYW1zXFwvKGVtMTU2OTIxMTN8ZW0xNTY5MjIxM3xlbTE1NjkyMDEzfGFnMTMzOTg2MDIpXFwuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4tdXNcXC9kZWxpdmVyeS1tYW5hZ2VyKChcXC9ob3ctdG8tcHJldmVudC1zdG9sZW4tbWlzc2luZy1wYWNrYWdlc3xcXC9tYW5hZ2UteW91ci1kZWxpdmVyaWVzKS5odG1sfC5odG1sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICcvZW4tdXMvaG9tZS5odG1sP2xvY2F0aW9uPWhvbWUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4tdXNcXC8ocG9zc2liaWxpdGllc3xvZmZpY2VcXC93YWxtYXJ0fGNyZWF0ZS1hY2NvdW50fGJpZy1jb21tZXJjZXxjb3Vwb24tb2ZmZXJzXFwvZ3JvdW5kfGhlYWx0aGNhcmVcXC92YWNjaW5lLXNoaXBwaW5nfGVjb21tZXJjZVxcL29mZmVyLXN0b3JlLXBpY2t1cC1hdC1jaGVja291dCkuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4tdXNcXC8oc21hbGwtYnVzaW5lc3N8c3VzdGFpbmFiaWxpdHkpLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLXVzXFwvaG9saWRheShcXC9jb25zdW1lci1zaGlwcGluZy1kZWxpdmVyeS1ndWlkZS5odG1sfC5odG1sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzwhLS0gRmFjZWJvb2sgUGl4ZWwgQ29kZSAtLT5cbjxzY3JpcHQ+XG4gICFmdW5jdGlvbihmLGIsZSx2LG4sdCxzKVxuICB7aWYoZi5mYnEpcmV0dXJuO249Zi5mYnE9ZnVuY3Rpb24oKXtuLmNhbGxNZXRob2Q/XG4gIG4uY2FsbE1ldGhvZC5hcHBseShuLGFyZ3VtZW50cyk6bi5xdWV1ZS5wdXNoKGFyZ3VtZW50cyl9O1xuICBpZighZi5fZmJxKWYuX2ZicT1uO24ucHVzaD1uO24ubG9hZGVkPSEwO24udmVyc2lvbj1cJzIuMFwnO1xuICBuLnF1ZXVlPVtdO3Q9Yi5jcmVhdGVFbGVtZW50KGUpO3QuYXN5bmM9ITA7XG4gIHQuc3JjPXY7cz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpWzBdO1xuICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQscyl9KHdpbmRvdywgZG9jdW1lbnQsXCdzY3JpcHRcJyxcbiAgXCdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL2ZiZXZlbnRzLmpzXCcpO1xuICBmYnEoXCdpbml0XCcsIFwnMzk4NjEzODUzOTk5Mjk3XCcpO1xuICBmYnEoXCd0cmFja1wnLCBcJ1BhZ2VWaWV3XCcpO1xuPC9zY3JpcHQ+XG48bm9zY3JpcHQ+PGltZyBoZWlnaHQ9IjEiIHdpZHRoPSIxIiBzdHlsZT0iZGlzcGxheTpub25lIlxuICBzcmM9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS90cj9pZD0zOTg2MTM4NTM5OTkyOTcmZXY9UGFnZVZpZXcmbm9zY3JpcHQ9MSJcbi8+PC9ub3NjcmlwdD5cbjwhLS0gRW5kIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxjODU4ZjFkNjE1MGY0YmY0YWYwMzVhNDExY2MyMzIyMycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2V2ZW50OnBob25lIGNsaWNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2hyZWYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICd0ZWw6JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigndGVsZScsIHRoaXMudGV4dCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmtUcmFja0V2ZW50cyA9IHQuZXZlbnRzID0gdC5hcGwodC5ldmVudHMsICdldmVudDEnLCAnLCcsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE0NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyV0ZWxlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGhvbmUgTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwwNjAxNTk2ZTQxZDE0Nzk4OWU2NWRhNTZmZGIyMGMzNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ29uZVRhZzpGbGFzaHRhbGtpbmcgVGFnJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0ZsYXNoVGFsa2luZzpwYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gLy5jb20oLiopLy5leGVjKHQpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDEwMDAwMDAwMDAwMDAwICogKE1hdGgucmFuZG9tKCkgKyAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9IHIgJiYgKF9zYXRlbGxpdGUuc2V0VmFyKCdmbGFzaHRhbGtpbmdVUkwnLCByICsgbiksICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzxpZnJhbWUgc3JjPSVmbGFzaHRhbGtpbmdVUkwlIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZyYW1lYm9yZGVyPSIwIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGUiPjwvaWZyYW1lPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMODdlZTVhY2ViMTQ1NGU4ZGEyY2EwNzM1OTY0NTcwYmQnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnVGFnOmJ0bkFXJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5kZWZhdWx0LmZ4Zy1saW5rLS1hbGlnbi1sZWZ0LmZ4Zy1saW5rLS1tb2JpbGUtYWxpZ24tY2VudGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWxpbmsuanMtZnhnYy1pbml0LmZ4Zy1saW5rLS1tZC5meGctbGluay0tcm91bmRlZF9idXR0b24uZnhnLWxpbmstLWFsaWduLWxlZnQuc3VwLnN1YicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tYmx1ZS5meGctbGluay0tbW9iaWxlLWFsaWduLWNlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tcm91bmRlZF9idXR0b24uZnhnLWxpbmstLWFsaWduLWNlbnRlci5meGctbGluay0tbW9iaWxlLWFsaWduLWNlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tcm91bmRlZF9idXR0b24uZnhnLWJ1dHRvbi0tcm91bmQuZnhnLWxpbmstLWFsaWduLWNlbnRlci5meGctbGluay0tbW9iaWxlLWFsaWduLWNlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1zdWJtaXQuZnhnLWJ1dHRvbi0tb3JhbmdlLmpzLWNtcy1mb3JtLXN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6YnRuQVdQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdhd0xhYmVsJywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdhd0xhYmVsJywgX2ZkeC5nZXRHdGFnTGFiZWwobiwgciwgaSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2E0M2IyMjk2ZDliMzQzNmJiNGU3NGIwMzA2NDc1OTkwLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDJjOWE2ZTZmNjY3NjQyOThiN2IxMmY3MzM2YjZmODJjJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYWRUYWc6ZGZhJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2RmYTpwYWdlTGlzdE1hcHBpbmcnKSwgdCA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OmNvdW50cnlDb2RlJyksIG4gPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IC8uY29tKC4qKS8uZXhlYyhuKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAxMDAwMDAwMDAwMDAwMCAqIChNYXRoLnJhbmRvbSgpICsgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBfZmR4LnBhZ2VGbGFnKGUsIHQsICdjb3VudHJ5JyksIGEgPSBfZmR4LnBhZ2VGbGFnKGksIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoJ2RmYUxhYmVsJywgYSArIHIpLCAhMSAhPT0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzxpZnJhbWUgc3JjPSVkZmFMYWJlbCUgd2lkdGg9IjEiIGhlaWdodD0iMSIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMDYzZDVhYTA4NTZhNGVmZWJiNzkzMTkwYzQxYmU3MTQnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdldmVudDpjdWJlIGNsaWNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2RpdiAuZnhnLWN1YmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnaGVyby4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2b2lkIDAgIT09IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcycpID8gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzJykgOiAnJywgciA9ICh0ID0gdm9pZCAwICE9PSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1saW5rLXRhcmdldCcpID8gJ25ld1BhZ2UnIDogJ3NhbWVQYWdlJywgeyBoZXJvOiAnZXZlbnQyMDAnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgLTEgPCBuLmluZGV4T2YoJ1RSQUNLJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsuZGF0YSA9ICcnLCBGRFguREFUQUxBWUVSLnBhZ2UubGluay50eXBlID0gJycsICEod2luZG93Lm5sdHJrID0gJ3knKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCduZXdQYWdlJyA9PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGEgPSAnJywgRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZSA9ICcnLCBmZHhfc2V0TGlua1ZpZXcobiksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NhbWVQYWdlJyA9PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHJbbi5zcGxpdCgnfCcpWzBdLnRvTG93ZXJDYXNlKCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZEWC5EQVRBTEFZRVIucGFnZS5saW5rLmRhdGEgPSAnJywgRkRYLkRBVEFMQVlFUi5wYWdlLmxpbmsudHlwZSA9ICcnLCBmZHhfbG9nTGlua1ZpZXcobiwgaSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNDY1NTlmMTY5Y2FkNDk5ZThmYTBjNGIxZmE4YTUyZDAnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICd2aWRlbzo3NSUgVmlld2VkJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiAncGVyY2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiA3NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICcuYnJpZ2h0Y292ZS1jb250YWluZXIgdmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiB0aGlzLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKSwgciA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKSwgaSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2JyaWdodGNvdmUtY29udGFpbmVyJyksIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gaVthXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGxheWVyaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2anMtZG9jay10aXRsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5lVmFyNDIgPSBvW2FdLmlubmVyVGV4dCwgdC5lVmFyMzEgPSByLCB0LmxpbmtUcmFja1ZhcnMgPSB0LmFwbCh0LmxpbmtUcmFja1ZhcnMsICdlVmFyNDIsZVZhcjMxJywgJywnLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGlua1RyYWNrRXZlbnRzID0gdC5ldmVudHMgPSAnZXZlbnQyMDYnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1ZpZGVvOjc1JSBWaWV3ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGNjNTJjOTAyOTQ3NDQ2MGM4MGY3NTYzYzc2ZmM4MmFhJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndHJhZGVkZXNrOmV2ZW50QnRuQ2xpY2tUVEQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnKGxpbmtcXHxGaW5kIGEgRG9sbGFyIEdlbmVyYWwpfChsaW5rXFx8U2lnbiB1cCBmb3IgZnJlZSl8KGhlcm9cXHxGaW5kIGEgV2FsZ3JlZW5zIE5lYXIgWW91KXwoaGVyb1xcfFNlZSBDdXJyZW50IE9mZmVycyknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWxpbmsuanMtZnhnYy1pbml0LmZ4Zy1saW5rLS1yb3VuZGVkX2J1dHRvbi5meGctYnV0dG9uLS1yb3VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnRpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YS1hbmFseXRpY3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcobGlua1xcfHNpZ24gdXAgbm93KXwobGlua1xcfE5leHQgdGltZSB1c2UgRmVkRXggRGVsaXZlcnkgTWFuYWdlclxcfFNJR04gVVAgRk9SIEZSRUUpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXC9lbi11c1xcL3NoaXBwaW5nXFwvb25zaXRlXFwvKHdhbGdyZWVucy1wYWNrYWdlLXBpY2t1cHxkb2xsYXItZ2VuZXJhbC1waWNrLXVwLWRyb3Atb2ZmLXBhY2thZ2UpLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLXVzXFwvcHJpbnRpbmdcXC9jb25zdW1lci1vZmZlcnMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvZW4tdXNcXC9kZWxpdmVyeS1tYW5hZ2VyLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCd0cmFkZWRlc2s6YnRuQ2xpY2tQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWFuYWx5dGljcycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigndGRQaXhlbCcsIG4pLCAhMSAhPT0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzk1ZmM4YzdkODA4NDQ4YjdhZjkzMTRmMWQ3YjM1ZjAyLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGJjYzFhNTBjYmJmMDQyYjU5YTJmODNiNjNjNGI2OThkJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcjpMb2dnZWQgSW4nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RhdGFFbGVtZW50Q2hhbmdlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IG5hbWU6ICdsb2dpbjpzdGF0dXMnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY29va2llLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2ZkeF9sb2dpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcuKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmtUcmFja1ZhcnMgPSB0LmxpbmtUcmFja1ZhcnMgKyAnLGV2ZW50cycsIHQubGlua1RyYWNrRXZlbnRzID0gdC5saW5rVHJhY2tFdmVudHMgKyAnLGV2ZW50MyxldmVudDQnLCAnJyAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2xvZ2luOnVzZXItaWQnKSAmJiBfc2F0ZWxsaXRlLmdldFZhcignbG9naW46dXNlci1pZCcpICYmICh0LmV2ZW50cyA9IHQuYXBsKHQuZXZlbnRzLCAnZXZlbnQzJywgJywnLCAyKSwgdC5ldmVudHMgPSB0LmFwbCh0LmV2ZW50cywgJ2V2ZW50NCcsICcsJywgMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVsb2dpbjpzdGF0dXMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWxvZ2luOmZkeF9jYmlkJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI2MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyV1c2VyOmVtYWlsSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclbG9naW46dXNlci1pZCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnZVZhcjQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2VWYXI2JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDc1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJXVzZXI6dXNlci1hZ2VudCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OmNvdW50cnlDb2RlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6bGFuZ3VhZ2UlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnaGRyfExvZ2dlZCBJbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMDNiM2UzOGNhNGQ4NDc3ZWE1YzQxY2UzOWVhMTIwMmUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnVGFnOmJ0bkRDJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1zdWJtaXQuZnhnLWJ1dHRvbi0tb3JhbmdlLmpzLWNtcy1mb3JtLXN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEZWxheTogNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWxpbmsuanMtZnhnYy1pbml0LmZ4Zy1saW5rLS1zbS5meGctbGluay0tcm91bmRlZF9idXR0b24uZnhnLWxpbmstLWFsaWduLWNlbnRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNDAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6YnRuRENQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdkY0xhYmVsJywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdkY0xhYmVsJywgX2ZkeC5nZXRHdGFnTGFiZWwobiwgciwgaSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2FiZGIwNjE4OTc1MTRmNWY5ODRlMzM4YzUwMzQyYmViLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGFhY2ZhNWRhYmE3MTQwOTBiYzZjMTkyMjE1YWNlYWIyJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpUYXJnZXRFeHBlcmllbmNlJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRlbGF5OiAxMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnKFRQXFx8KScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2VuLXVzXFwvc2hpcHBpbmdcXC8oaW50ZXJuYXRpb25hbC5odG1sfDctZGF5LWRlbGl2ZXJ5Lmh0bWx8aG9tZS1kZWxpdmVyeS5odG1sKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICcvZW4tdXMvZWNvbW1lcmNlL3Rvb2xzLWFuZC1zZXJ2aWNlcy5odG1sJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdnVGFnOlRhcmdldEVuYWJsZWRNYXBwaW5nJyksIHQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCd0YXJnZXRHdGFnTGFiZWwnLCBuKSwgITEgIT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkMzYjUwYWNjNTA5NDI0NTI2YTkyMDA4ODY1YTNhODgyMS1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxlMWU5YzI1ZGQ5MTk0M2JmYmJiYmI5M2UzODY2MmNiNCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3RhcmdldDpsb2dpbiBzdGF0dXMgdHJpZ2dlcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRvYmUudGFyZ2V0ICE9PSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpZiAodHlwZW9mIChhZG9iZS50YXJnZXQpICE9ICJ1bmRlZmluZWQiKXtcbiQoImJvZHkiKS5vbigibG9nZ2VkSW4iLCBmdW5jdGlvbiAoZSkge1xuICBhZG9iZS50YXJnZXQuZ2V0T2ZmZXJzKHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBleGVjdXRlOiB7XG4gICAgICAgIHBhZ2VMb2FkOiB7XG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgbG9nZ2VkSW46IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGFkb2JlLnRhcmdldC5hcHBseU9mZmVycyh7XG4gICAgICByZXNwb25zZTogcmVzcG9uc2VcbiAgICB9KTtcbiAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIDtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgcmV0dXJuIDtcbiAgfSk7XG59KTtcbiQoImJvZHkiKS5vbigibG9nZ2VkT3V0IiwgZnVuY3Rpb24gKCkge1xuICBhZG9iZS50YXJnZXQuZ2V0T2ZmZXJzKHtcbiAgICByZXF1ZXN0OiB7XG4gICAgICBleGVjdXRlOiB7XG4gICAgICAgIHBhZ2VMb2FkOiB7XG4gICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgbG9nZ2VkSW46IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIHJldHVybiBhZG9iZS50YXJnZXQuYXBwbHlPZmZlcnMoe1xuICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlXG4gICAgfSk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiA7XG4gIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgIHJldHVybiA7XG4gIH0pO1xufSk7XG59JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxiNWQwMjNlMDI0YjY0ZDkzYjQ3YjZkOGYyMTRiYjkxNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6Y3RhT3JhbmdlREMnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGVsYXk6IDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydGllczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhLWFuYWx5dGljcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyhsaW5rIFxcfCBTSUdOIFVQIE5PVyl8KGxpbmtcXHxTaWduIHVwIGZvciBmcmVlKXwoaGVyb1xcfFNlZSBDdXJyZW50IE9mZmVycyl8KGhlcm9cXHxGaW5kIGEgV2FsZ3JlZW5zIE5lYXIgWW91KScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDQwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdnVGFnOmN0YU9yYW5nZURDUGFnZUxpc3RNYXBwaW5nJyksIHQgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcignZGNPcmFuZ2VMYWJlbCcsIG4pLCAhMSAhPT0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuY2xhc3NOYW1lKSwgaSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcignZGNPcmFuZ2VMYWJlbCcsIF9mZHguZ2V0R3RhZ0xhYmVsKG4sIHIsIGkpKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkMyZmIxODI5NTI2OTM0MTcxYTY1MjYwODcyNDcwMzc0NS1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxkN2JkZDJmZjFkMzM0YzYwYTA2NWRmZjE3MWYzMDM5NScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6Y3RhT3JhbmdlQVcnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGVsYXk6IDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydGllczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhLWFuYWx5dGljcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyhoZXJvXFx8ZnJlZSBkb3dubG9hZCl8KGxpbmtcXHxDcmVhdGUgYSBsYWJlbCl8KGhlcm9cXHxzaGlwIG5vdyl8KGhlcm9cXHxDaGF0IHdpdGggYSBzYWxlcyBzcGVjaWFsaXN0KXwoaGVyb1xcfEFwcGx5IE5vdyl8KGxpbmtcXHxTdGFydCBhIGZyZWUgQmlnQ29tbWVyY2UgdHJpYWwpfChoZXJvXFx8R2V0IFN0YXJ0ZWQpfChsaW5rXFx8U3RhcnQgT3JkZXIpfChsaW5rXFx8U2lnbiB1cCBmb3IgZnJlZSl8KGxpbmtcXHxGaW5kIGEgRG9sbGFyIEdlbmVyYWwpfChoZXJvXFx8U2VlIEN1cnJlbnQgT2ZmZXJzKXwoaGVyb1xcfEZpbmQgYSBXYWxncmVlbnMgTmVhciBZb3UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6Y3RhT3JhbmdlQVdQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdhd09yYW5nZUxhYmVsJywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdhd09yYW5nZUxhYmVsJywgX2ZkeC5nZXRHdGFnTGFiZWwobiwgciwgaSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2VmZmM2ZjJhOWY4ZjRlMGY5ZTA3OWJjNmJmZmMwM2E0LXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDFjYjJhY2IzYTJjMTQ2NjY4NDk3ZmYyOGMxYWNiNDViJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpCdXR0b25FdmVudF9Qb3NzaWJpbGl0aWVzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRlbGF5OiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnI3N1YnNjcmliZWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6RW5hYmxlZExvY2FsZUVwaWMnKSAhPT0gdW5kZWZpbmVkICYmIG51bGwgIT09IF9zYXRlbGxpdGUuZ2V0VmFyKCdnVGFnOkVuYWJsZWRMb2NhbGVFcGljJykgJiYgJycgIT09IF9zYXRlbGxpdGUuZ2V0VmFyKCdnVGFnOkVuYWJsZWRMb2NhbGVFcGljJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGhzOiBbeyB2YWx1ZTogJy9hYm91dC9wb3NzaWJpbGl0aWVzJyB9XSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzU0NzJiODdkYjAxOTQyYjdhYzk4NmE0MGU5MGJmZTVlLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDU5OTkwZjZmMDM2ZDRkNjQ4MjU5NzBiYWJhMTA4ZDlhJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29udGVudDphbGwgcGFnZXMnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodm9pZCAwICE9PSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZScpICYmICdkZWxheWVkJyA9PSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpEZWxheWVkIFBhZ2UgVHlwZScpIHx8IC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignc2VhcmNoLmh0bWw/cT0nKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3JlZ2lzdGVyLmh0bWwnKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJy9vbmxpbmUvcmF0aW5nLmh0bWwnKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJy9vbmxpbmUvc2hpcHBpbmcuaHRtbCcpIHx8IC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignL3VzZXItcHJvZmlsZS1jb21wbGV0aW9uL2VtYWlsP2xvY2FsZScpIHx8IC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignL2ZlZGV4dHJhY2tpbmcvJykgfHwgLTEgPCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCdmZWRleC5jb20vZmRtZW5yb2xsbWVudC8nKSB8fCAtMSA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJy9zaGlwbWVudC1oaXN0b3J5JykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3dpbmRvdy5mZHhfbG9jYWxlID0gX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6bG9jYWxlIik7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVzaXRlLWRpYWdub3N0aWNzOnZpZXdwb3J0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBhZ2UgbmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclZXh0ZXJuYWwtY2FtcGFpZ246bGluayUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6Y291bnRyeUNvZGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpsYW5ndWFnZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnJlZ2lvbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMjMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpoaXN0b3JpY2FsUGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDMzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6cGFnZSB0eXBlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AzOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2VWYXIzOCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A1OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2VWYXI1OCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A2NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ2VWYXIzMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogJyVjb250ZW50OnNpdGUgc2VjdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3F1ZXJ5UGFyYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdDTVAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lOiAnJWNvbnRlbnQ6cGFnZSBuYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDJhYmIyNmQ3ZTYyODRiYjI5MDE4OTA4YjI2YTI3MjRlJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpEQ1BhZ2VFdmVudF9Qb3NzaWJpbGl0aWVzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuZ2V0VmFyKCdnVGFnOkVuYWJsZWRMb2NhbGVFcGljJykgIT09IHVuZGVmaW5lZCAmJiBudWxsICE9PSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpFbmFibGVkTG9jYWxlRXBpYycpICYmICcnICE9PSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpFbmFibGVkTG9jYWxlRXBpYycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoczogW3sgdmFsdWU6ICcvYWJvdXQvcG9zc2liaWxpdGllcy5odG1sJyB9XSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzkxNmRlNmJiY2Y2ZDQ3NTg4MjE4MDQ2NTgxNGJlOTQ0LXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGMxZGNiYzZmNDU3MTRjZjY4ZDI3MTVjZTFlNzAxZjM2JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmlkZW86MTAwJSBWaWV3ZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL21lZGlhVGltZVBsYXllZC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6ICdwZXJjZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICcuYnJpZ2h0Y292ZS1jb250YWluZXIgdmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiB0aGlzLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKSwgciA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKSwgaSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2JyaWdodGNvdmUtY29udGFpbmVyJyksIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gaVthXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGxheWVyaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2anMtZG9jay10aXRsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5lVmFyNDIgPSBvW2FdLmlubmVyVGV4dCwgdC5lVmFyMzEgPSByLCB0LmxpbmtUcmFja1ZhcnMgPSB0LmFwbCh0LmxpbmtUcmFja1ZhcnMsICdlVmFyNDIsZVZhcjMxJywgJywnLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGlua1RyYWNrRXZlbnRzID0gdC5ldmVudHMgPSAnZXZlbnQyMDcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1ZpZGVvOkNvbXBsZXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwyM2FmYmRlNjNiOGI0MGRiYmU3MTM0NjkzMmU3MGU3OCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6QWRXb3Jkc0V2ZW50JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9mZHgucGNmVXRpbCgpLm1hdGNoKC93d3coc2JveC5pZGV2fGJhc2UuaWRldnxkZXYuaWRldnxkcnQuaWRldnxzdHJlc3MuZG16LmlkZXZ8Yml0LmlkZXZ8dGVzdHwpLmZlZGV4LmNvbS9naSksIHQgPSAnJyA9PSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZ0Rpc2FibGVMb2NhbGUnKSwgbiA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgciA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OmNvdW50cnlDb2RlJyksIGkgPSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpBZFdvcmRzRXZlbnRNYXBwaW5nJyksIGEgPSBfZmR4LnBhZ2VGbGFnKGksIHIsICdjb3VudHJ5JyksIG8gPSBfZmR4LnBhZ2VGbGFnKGEsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoJ2F3TGFiZWwnLCBvKSwgISghMSA9PT0gbyB8fCBudWxsID09PSBlIHx8ICF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzxzY3JpcHQ+XG4gIGd0YWcoXCdldmVudFwnLCBcJ2NvbnZlcnNpb25cJyxcbiAgICB7XG4gICAgICAgIFwnc2VuZF90b1wnOiBfc2F0ZWxsaXRlLmdldFZhcigiYXdMYWJlbCIpXG4gICAgfSk7XG48L3NjcmlwdD5cbjwhLS1cbnZhciBhZHdvcmRzTWFwcGluZyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkFkV29yZHNFdmVudE1hcHBpbmciKTsgIFxudmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsgXG52YXIgb2JqQWRXb3JkcyA9IiI7XG52YXIgZXZlbnRfdHlwZSA9ICIiO1xudmFyIGV2ZW50X25hbWUgPSAiIjtcbnZhciBldmVudF9wYXJhbSA9ICIiO1xuaWYgKCh0eXBlb2YgYWR3b3Jkc01hcHBpbmcgIT09ICJ1bmRlZmluZWQiICYmIGFkd29yZHNNYXBwaW5nICE9PSAiIikgJiYgKHR5cGVvZiB1cmwgIT09ICJ1bmRlZmluZWQiICYmIHVybCAhPT0gIiIpKXtcblx0Zm9yKHZhciBrZXkgaW4gYWR3b3Jkc01hcHBpbmcpe1x0XHRcdFx0XG5cdFx0aWYodXJsLmluZGV4T2Yoa2V5KSA+IC0xKXtcblx0XHRcdG9iakFkV29yZHMgPSBhZHdvcmRzTWFwcGluZ1trZXldO1x0XHRcdCBcblx0XHRcdGJyZWFrO1x0XHRcdFx0ICBcblx0XHR9XG5cdH1cbn0gICAgXG5pZiAoKHR5cGVvZiBvYmpBZFdvcmRzICE9PSAidW5kZWZpbmVkIiAmJiBvYmpBZFdvcmRzICE9PSAiIikgKXtcblx0ZXZlbnRfdHlwZSA9IG9iakFkV29yZHMuZXZlbnRfdHlwZTtcblx0ZXZlbnRfbmFtZSA9IG9iakFkV29yZHMuZXZlbnRfbmFtZTtcblx0ZXZlbnRfcGFyYW0gPSBvYmpBZFdvcmRzLmV2ZW50X3BhcmFtO1xufVxuZ3RhZyhldmVudF90eXBlLCBldmVudF9uYW1lLCBldmVudF9wYXJhbSk7XG48L3NjcmlwdD4tLT4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGRiMWUzOTVjOTU2NzRmZjdhY2EyNjYxNjIxOWUwYWY3JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQWRvYmVUYXJnZXQ6Q2F0ZWdvcnkgQWZmaW5pdHknLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnL2VuLXVzL3NoaXBwaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcvZW4tdXMvdHJhY2tpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy9lbi11cy9wcmludGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnL2VuLXVzL2N1c3RvbWVyLXN1cHBvcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy9lbi11cy9lY29tbWVyY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy9lbi11cy9zbWFsbC1idXNpbmVzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2Fkb2JlLnRhcmdldC50cmFja0V2ZW50KHtcbiAgIm1ib3giOiAiY2F0ZWdvcnktYWZmaW5pdHkiLFxuICAicGFyYW1zIjoge1xuICAgICAidXNlci5jYXRlZ29yeUlkIjogX3NhdGVsbGl0ZS5nZXRWYXIoImNvbnRlbnQ6cGFnZVBhdGgiKVxuICB9XG59KTtcbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMY2IzMDc0YzRmNmNkNDY2ZmI3YWNhZmJkNTNlYmQzZTYnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnVGFnOmJ0bkZCJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdhLmZ4Zy1saW5rLmpzLWZ4Z2MtaW5pdC5meGctbGluay0tbWQuZnhnLWxpbmstLXJvdW5kZWRfYnV0dG9uLmZ4Zy1saW5rLS1hbGlnbi1sZWZ0LnN1cC5zdWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDYwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnYS5meGctbGluay5qcy1meGdjLWluaXQuZnhnLWxpbmstLWJsdWUuZnhnLWxpbmstLW1vYmlsZS1hbGlnbi1jZW50ZXIuZnhnLW1vYmlsZS0taGlkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNjAKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6YnRuRkJQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdmYkV2ZW50JywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdmYkV2ZW50JywgX2ZkeC5nZXRHdGFnTGFiZWwobiwgciwgaSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzBkM2Y0MTc5NDg4YjQ4MzQ4NTNmYzY0MWIwMWZiNjY0LXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDBhZjVmZmE4MDNjMDQzOWM5YzdlYzE0NDRkNjI2YjBjJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2VhcmNoIC0gUyZQJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kYXRhRWxlbWVudENoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBuYW1lOiAnc2VhcmNoOnNwRGF0YSAtIEpTT2JqZWN0Q2hhbmdlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignc2VhcmNoLmh0bWw/cT0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzE2Mzk3YmFkODMxNTRlM2E5ZWU1NDE4ZTQyMDg0MDVlLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDRlMDEyMGI4YWU2YzQ2NDY5OWJkNGIyNGE0MDQzZWU2JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndXNlcjp1c2VyIGluZm8nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvZ2dlZCBJbicgPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2xvZ2luOnN0YXR1cycpICYmICh0LmV2ZW50cyA9IHQuYXBsKHQuZXZlbnRzLCAnZXZlbnQzJywgJywnLCAyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWxvZ2luOnN0YXR1cyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclbG9naW46ZmR4X2NiaWQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjYwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJXVzZXI6ZW1haWxJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnZVZhcjQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNzUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcldXNlcjp1c2VyLWFnZW50JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGQwYTYzYWMwNWUyYzRhY2VhM2NhMmQ4MTI2YTlmNTY1JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmE6cG9waW4nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RvbVJlYWR5LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OmRldmljZVR5cGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3ZhOmVuYWJsZWRDb3VudHJ5TGlzdCcpLCBuID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6Y291bnRyeUNvZGUnKSwgciA9IF9zYXRlbGxpdGUuZ2V0VmFyKCd2YTptb2JFbmFibGVkVXJsJyksIGkgPSBfZmR4LnBhZ2VGbGFnKHQsIG4pLCBhID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3ZhOmNhYXNFbmFibGVkQ291bnRyeUxpc3QnKSwgbyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCd2YTpjYWFzTW9iRW5hYmxlZFVybCcpLCBzID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6bG9jYWxlJyksIGMgPSBfc2F0ZWxsaXRlLmdldFZhcigndmE6Y2Fhc0Rpc2FibGVkQ291bnRyeUxpc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPCBhLmluZGV4T2YocykgPyBpc0NhYXNNb2JFbmFibGVkID0gITAgOiBpc0NhYXNNb2JFbmFibGVkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBsID0gJy8nICsgX3NhdGVsbGl0ZS5nZXRWYXIoJ2NvbnRlbnQ6bG9jYWxlJykucmVwbGFjZSgnXycsICctJykgKyAnLycsIGQgPSBfc2F0ZWxsaXRlLmdldFZhcigndmE6ZGlzYWJsZWRQYWdlTGlzdCcpLCBmID0gIV9mZHgucGFnZUZsYWcoZCwgdSksIHAgPSAhX2ZkeC5wYWdlRmxhZyhkLCBsKSwgZyA9IF9mZHgucGFnZUZsYWcociwgdSksIG0gPSBfZmR4LnBhZ2VGbGFnKG8sIHUpLCBoID0gaSAmJiBmLCB2ID0gaSAmJiBwICYmIGMsIGIgPSBpICYmIGcsIHkgPSBpICYmIHAgJiYgbSAmJiBpc0NhYXNNb2JFbmFibGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkRYLkNBQVMgPT09IHVuZGVmaW5lZCA/ICEoJ2Rlc2t0b3AnICE9IGUgfHwgIWgpIHx8ICEoJ21vYmlsZScgIT0gZSB8fCAhYikgOiAhKCdkZXNrdG9wJyAhPSBlIHx8ICF2KSB8fCAhKCdtb2JpbGUnICE9IGUgfHwgIXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuY29va2llLmdldCgnd2NtbW9kZScpID09IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQ2UwN2U1MDRmZTNlZTQ0YTA4Y2FiYjYyYTc4MDk3YjIxLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDdmYjllODNlMGYyZjQ5ODdiM2FiM2E4Y2Y5YzgzOTc1JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZXZlbnQ6dmFQb3BpbiBjbGljaycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGF0YUVsZW1lbnRDaGFuZ2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgbmFtZTogJ2V2ZW50OnZhQ2xpY2snIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBGRFguREFUQUxBWUVSLlZBICYmIEZEWC5EQVRBTEFZRVIuVkEgPyBGRFguREFUQUxBWUVSLlZBIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGZkeF9sb2dDaGF0ICYmIGUgJiYgZmR4X2xvZ0NoYXQoZSwgJ3ZhX05JTkEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxiNzVjNGM2MWI2YWY0OTliOGJmZGVmZTM1OGQ3MDE1ZScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21lZGFsbGlhJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy8oKChlbnxmcnxkZXxpdCktY2gpfChoZS1pbCl8KHJ1LXJ1KXwodHItdHIpfCh1ay11YSkpL3RyYWNraW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy8oKGVuLShpbHxydXx0cikpfChmci1mcil8KChlbnxkZXxpdCktY2gpfChoZS1pbCl8KHJ1LXJ1KXwodHItdHIpfCgoZW58cnV8dWspLXVhKSkvb25saW5lL3NoaXBwaW5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICd2YXIgdmVyc2lvbiA9ICIyMDA2LjA3MjQyMDIwLjAxIjtcbmlmICh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUgPT0gInd3dy5mZWRleC5jb20iIHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA9PSAid3d3LnNwYWluLmZlZGV4LmNvbSIpIHtcbiAgICB3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVggPSAiaHR0cHM6Ly9vbi1wcmVtLmthbXB5bGUuY29tL0ZlZGV4UHJvZC9DT0xPIjtcbn0gZWxzZSB7XG4gICAgd2luZG93Lk1ESUdJVEFMX09OX1BSRU1fUFJFRklYID0gImh0dHBzOi8vb24tcHJlbS5rYW1weWxlLmNvbS9GZWRleFRlc3QvQ09MTyI7XG59XG4oZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF3aW5kb3cuS0FNUFlMRV9FTUJFRCkge1xuICAgICAgICB2YXIgb25QcmVtRW1iZWRSZWdleCA9IC9cXC9bYS16QS1aXFxkLV0rXFwvXFxkK1xcL29uc2l0ZVxcL21lZGFsbGlhLWRpZ2l0YWwtZW1iZWRcXC5qcyQvO1xuICAgICAgICB2YXIgZ2VuZXJpY1BhdGhSZWdleCA9IC9cXC9bYS16QS1aXFxkLV0rXFwvXFxkK1xcL29uc2l0ZVxcL2dlbmVyaWNcXGR7MTN9XFwuanMkLztcbiAgICAgICAgd2luZG93LktBTVBZTEVfRU1CRUQgPSB7XG4gICAgICAgICAgICBrYW1weWxlSW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpO1xuICAgICAgICAgICAgICAgIHQudHlwZSA9IFwndGV4dC9qYXZhc2NyaXB0XCc7XG4gICAgICAgICAgICAgICAgdC5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdC5zcmMgPSBLQU1QWUxFX0VNQkVELmdldEdlbmVyaWNMb2NhdGlvbigpO1xuICAgICAgICAgICAgICAgIHQuY2hhcnNldCA9IFwnVVRGLThcJztcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGthbXB5bGVMb2FkTG9nZ2VyOiBmdW5jdGlvbigpIHt9LFxuICAgICAgICAgICAga2FtcHlsZUV2ZW50SGFuZGxlcjogZnVuY3Rpb24oZWxlbSwgZXZlbnRUeXBlLCBoYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLmF0dGFjaEV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYXR0YWNoRXZlbnQoXCdvblwnICsgZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNTdXBwb3J0ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlzSUU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlVmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW5nVmVyc2lvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eU1vZGU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB2YXIgdHJpZGVudCA9IHdpbmRvdy5LQU1QWUxFX0VNQkVELmdldFVzZXJBZ2VudCgpLm1hdGNoKC9UcmlkZW50XFwvKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKHRyaWRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlzSUUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHJ1ZVZlcnNpb24gPSBwYXJzZUludCh0cmlkZW50WzFdLCAxMCkgKyA0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgbXNpZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01TSUUgKFxcZCspLyk7XG4gICAgICAgICAgICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmlzSUUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWN0aW5nVmVyc2lvbiA9IHBhcnNlSW50KG1zaWVbMV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hY3RpbmdWZXJzaW9uID0gcmVzdWx0LnRydWVWZXJzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzSUUgJiYgcmVzdWx0LnRydWVWZXJzaW9uID4gMCAmJiByZXN1bHQuYWN0aW5nVmVyc2lvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbXBhdGliaWxpdHlNb2RlID0gcmVzdWx0LnRydWVWZXJzaW9uICE9IHJlc3VsdC5hY3RpbmdWZXJzaW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gIXJlc3VsdC5pc0lFIHx8IHJlc3VsdC50cnVlVmVyc2lvbiA+IDkgfHwgKHJlc3VsdC5hY3RpbmdWZXJzaW9uID49IDkgJiYgcmVzdWx0LmNvbXBhdGliaWxpdHlNb2RlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXRVc2VyQWdlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldEdlbmVyaWNMb2NhdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyaWNMb2NhdGlvbiA9IGxvY2F0aW9uLnByb3RvY29sICsgXCcvL1wnICsgXCdyZXNvdXJjZXMuZGlnaXRhbC1jbG91ZC1wcmVtLm1lZGFsbGlhLmV1L3dkY2V1cHJlbS8xMDE4OS9vbnNpdGUvZ2VuZXJpYzE1ODI5MTIwMzYwMTMuanNcJztcbiAgICAgICAgICAgICAgICB2YXIgZ2VuZXJpY1BhdGggPSAoZ2VuZXJpY0xvY2F0aW9uLm1hdGNoKGdlbmVyaWNQYXRoUmVnZXgpIHx8IFtdKVswXTtcbiAgICAgICAgICAgICAgICBnZW5lcmljTG9jYXRpb24gPSB3aW5kb3cuS0FNUFlMRV9FTUJFRC5nZXRSZXNvdXJjZXNQcmVmaXgoKSArIGdlbmVyaWNQYXRoO1xuICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmljTG9jYXRpb247XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXNPblByZW1TY3JpcHQ6IGZ1bmN0aW9uKHNjcmlwdFBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb25QcmVtRW1iZWRSZWdleC50ZXN0KHNjcmlwdFBhdGgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlzT25QcmVtOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk1ESUdJVEFMX09OX1BSRU1fUFJFRklYKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc2NyaXB0cyA9IChkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ3NjcmlwdFwnKSB8fCBbXSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LktBTVBZTEVfRU1CRUQuaXNPblByZW1TY3JpcHQoc2NyaXB0c1tpXS5zcmMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0UmVzb3VyY2VzUHJlZml4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk1ESUdJVEFMX09OX1BSRU1fUFJFRklYKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuTURJR0lUQUxfT05fUFJFTV9QUkVGSVg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCdzY3JpcHRcJyk7XG4gICAgICAgICAgICAgICAgdmFyIG5lZWRlZFNyY1BhdGggPSBudWxsO1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoc2NyaXB0cyAmJiAhbmVlZGVkU3JjUGF0aCAmJiBpIDwgc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdHNbaV0uc3JjICYmIG9uUHJlbUVtYmVkUmVnZXgudGVzdChzY3JpcHRzW2ldLnNyYykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRlZFNyY1BhdGggPSBzY3JpcHRzW2ldLnNyYztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChuZWVkZWRTcmNQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5NRElHSVRBTF9PTl9QUkVNX1BSRUZJWCA9IG5lZWRlZFNyY1BhdGgucmVwbGFjZShvblByZW1FbWJlZFJlZ2V4LCBcJ1wnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5NRElHSVRBTF9PTl9QUkVNX1BSRUZJWDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCdcJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHdpbmRvdy5LQU1QWUxFX0VNQkVELmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcJ2NvbXBsZXRlXCcpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuS0FNUFlMRV9FTUJFRC5rYW1weWxlSW5pdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuS0FNUFlMRV9FTUJFRC5rYW1weWxlRXZlbnRIYW5kbGVyKHdpbmRvdywgXCdsb2FkXCcsIHdpbmRvdy5LQU1QWUxFX0VNQkVELmthbXB5bGVJbml0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pKCk7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw3ZmU4MDJlOGVjMTY0YjQ5YTFlZjc2YWZhMjEzZjc1ZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2V2ZW50OmJ1dHRvbiBjbGljaycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEZWxheTogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2J1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdDaGVjayBJbnRlcnZhbCcpLCB0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0RlbGF5IFRpbWUnKSwgciA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVyb3x0cmFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm98Y3ViZXxyYXRlICYgc2hpcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm98Y3ViZXxyYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVyb3xjdWJlfHRyYWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVyb3xjdWJlfGxvY2F0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlcm98Y3ViZXxzaGlwJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEZEWC5EQVRBTEFZRVIucGFnZS5idXR0b24uZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IG4gJiYgbiAmJiAoY2xlYXJJbnRlcnZhbChpKSwgYSAmJiBjbGVhclRpbWVvdXQoYSksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICd1bmRlZmluZWQnICE9PSBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uICYmICcnICE9PSBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLmRhdGEgPyBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLmRhdGEgOiAnJywgdCA9ICd1bmRlZmluZWQnICE9PSBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uICYmICcnICE9PSBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLnR5cGUgPyBGRFguREFUQUxBWUVSLnBhZ2UuYnV0dG9uLnR5cGUgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZSAmJiAnJyAhPSBlICYmICgnJyAhPT0gdCAmJiAnbmV3UGFnZScgPT0gdCA/IChmZHhfc2V0TGlua1ZpZXcoZSksICExKSA6IHZvaWQgMCAhPT0gdCAmJiAnc2FtZVBhZ2UnID09IHQgPyAoLTEgPCByLmluZGV4T2Yobi50b0xvd2VyQ2FzZSgpKSA/IGZkeF9zZXRMaW5rVmlldyhlKSA6IGZkeF9sb2dMaW5rVmlldyhlKSwgITEpIDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKSwgYSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxkOWVlNDI4NTg0MDA0NjZkYmEwMDVkM2M3MWZjOGU0NCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2d0YWc6VmlkZW9QbGF5JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiAncGVyY2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJy5icmlnaHRjb3ZlLWNvbnRhaW5lciB2aWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy8oa28ta3J8emgtdHd8ZW4tc2cpL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6VmlkZW9QbGF5SWRMaXN0JyksIHQgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLWlkJyksIG4gPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpjb3VudHJ5Q29kZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBfZmR4LnBhZ2VGbGFnKGUsIG4sICdjb3VudHJ5JyksIGkgPSBfZmR4LnBhZ2VGbGFnKHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoJ3ZpZGVvR3RhZ0xhYmVsJywgaSksICExICE9PSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDNTcwYTY5MDc1N2IxNDQ0ZTk0YjBjYzMwZjljMjFiZDItc291cmNlLm1pbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOWQ1ZGIzYTZiZTBmNGU3YmI2MzNkMzdlZjdiN2YzNjMnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBZG9iZVRhcmdldDpiZWFjb25WMicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gRkRYLkRBVEFMQVlFUi5wYWdlLmNhdGVnb3J5LCB0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3RhcmdldGVuYWJsZWRVcmxMaXN0JyksIG4gPSAvLlthLXpdezJ9LVthLXpdezJ9KC4qKS8uZXhlYyh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gbiAmJiAobiA9IG5bMV0pLCAnZmFsc2UnID09IGUuaXNBcHBsaWNhdGlvbiAmJiAnc2hhcmVkbmF2JyAhPT0gRkRYLkRBVEFMQVlFUi5wYWdlLmNhdGVnb3J5LnBhZ2VUeXBlIHx8ICd0cnVlJyA9PSBlLmlzQXBwbGljYXRpb24gJiYgbnVsbCAhPT0gbiAmJiB2b2lkIDAgIT09IHQgJiYgJycgIT09IHQgJiYgMCA8IHQubGVuZ3RoICYmIC0xIDwgdC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9sb2FkVGFyZ2V0LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9hZGRQYWdlTG9hZFBhcmFtcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdF9wcm9wZXJ0eTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclVGFyZ2V0OmF0X3Byb3BlcnR5JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWRpblN0YXR1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclbG9naW46c3RhdHVzJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtdGFyZ2V0LXYyL2xpYi9maXJlUGFnZUxvYWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5SGlkZGVuU3R5bGU6ICdib2R5IHtvcGFjaXR5OiAwfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUhpZGluZ0VuYWJsZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxiOTY5MmIyZjFlYjE0MzgyYmI4MjI2N2Y5NTUwZjcyZScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2FkVGFnOnZlcml6b24nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcigndmVyaXpvbjpwYWdlTGlzdCcpLCB0ID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKSwgX3NhdGVsbGl0ZS5zZXRWYXIoJ3Zlcml6b25VUkwnLCBfZmR4LnBhZ2VGbGFnKGUsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAhMSAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3Zlcml6b25VUkwnKSwgciA9ICcnICE9PSBfc2F0ZWxsaXRlLmdldFZhcigndmVyaXpvbjp0aW1lRnJhbWUnKSAmJiAhMSAhPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3Zlcml6b246dGltZUZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJib3JkZXItc3R5bGU6bm9uZTsiIGFsdD0iIiBzcmM9JXZlcml6b25VUkwlIC8+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxmNzViMWEzY2QzOTc0NmQ0ODY2NWU0YzI5ZTJkNWMzNCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3JlZGlyZWN0OmFwcFNlZ0lkVGFyZ2V0JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kb21SZWFkeS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDZDU3OTRlYmFkZWE2NDY2OGE1NGM4MmE5NDQ5OThlYjItc291cmNlLm1pbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOTEwMTNjMjg0ZDI2NDE3ZGJkN2I0MzUzYjhjYTBjYTMnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhZFRhZzpkb3RUYWcgJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2RvdFRhZzplbmFibGVkUGFnZUxpc3QnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpLCAhMSAhPT0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3ZhciBkb3RUYWdQaXhlbElkID0gX3NhdGVsbGl0ZS5nZXRWYXIoImRvdFRhZ1BpeGVsSWQiKTtcbihmdW5jdGlvbih3LGQsdCxyLHUpe3dbdV09d1t1XXx8W107d1t1XS5wdXNoKHtcJ3Byb2plY3RJZFwnOlwnMTAwMDBcJyxcJ3Byb3BlcnRpZXNcJzp7XCdwaXhlbElkXCc6ZG90VGFnUGl4ZWxJZH19KTt2YXIgcz1kLmNyZWF0ZUVsZW1lbnQodCk7cy5zcmM9cjtzLmFzeW5jPXRydWU7cy5vbmxvYWQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgeSxycz10aGlzLnJlYWR5U3RhdGUsYz13W3VdO2lmKHJzJiZycyE9ImNvbXBsZXRlIiYmcnMhPSJsb2FkZWQiKXtyZXR1cm59dHJ5e3k9WUFIT08ueXdhLkkxM04uZmlyZUJlYWNvbjt3W3VdPVtdO3dbdV0ucHVzaD1mdW5jdGlvbihwKXt5KFtwXSl9O3koYyl9Y2F0Y2goZSl7fX07dmFyIHNjcj1kLmdldEVsZW1lbnRzQnlUYWdOYW1lKHQpWzBdLHBhcj1zY3IucGFyZW50Tm9kZTtwYXIuaW5zZXJ0QmVmb3JlKHMsc2NyKX0pKHdpbmRvdyxkb2N1bWVudCwic2NyaXB0IiwiaHR0cHM6Ly9zLnlpbWcuY29tL3dpL3l0Yy5qcyIsImRvdHEiKTtcblxuXG5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYWNjMmE4NTBiN2RiNGNlYThmZjgwNzA1OTliMTgwMjMnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICd2aWRlbzo1MCUgVmlld2VkJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9tZWRpYVRpbWVQbGF5ZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0OiAncGVyY2VudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50OiA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICcuYnJpZ2h0Y292ZS1jb250YWluZXIgdmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiB0aGlzLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5wYXJlbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKSwgciA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8taWQnKSwgaSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2JyaWdodGNvdmUtY29udGFpbmVyJyksIGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gaVthXS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGxheWVyaWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2anMtZG9jay10aXRsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5lVmFyNDIgPSBvW2FdLmlubmVyVGV4dCwgdC5lVmFyMzEgPSByLCB0LmxpbmtUcmFja1ZhcnMgPSB0LmFwbCh0LmxpbmtUcmFja1ZhcnMsICdlVmFyNDIsZVZhcjMxJywgJywnLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubGlua1RyYWNrRXZlbnRzID0gdC5ldmVudHMgPSAnZXZlbnQyMDUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1ZpZGVvOjUwJSBWaWV3ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGJmYTJmNDBkMGYxZjQ3Y2RiZWQ3ODQwMzZjZDljZmNhJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSFBUcmFja0J0bjpWYWxpZERhdGEnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgZWxlbWVudFNlbGVjdG9yOiAnZGl2IC5yZWRlc2lnblNuYXBzaG90VFZDJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM3ODkwOWQ1NDgyMzg0OWZlYmQ1YWQ2Y2RlOTRhN2Y2MC1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwyNTIzNzM3MjM4Mzc0MDYzOTFlYzZiOWEwNTI0NmY1NScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2dUYWc6VmlkZW9FdmVudENsaWNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJy52anMtYmlnLXBsYXktYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJy8oa28ta3J8emgtdHd8ZW4tc2cpL2Fib3V0L3Bvc3NpYmlsaXRpZXMuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6VmlkZW9QbGF5QnRuSWRMaXN0JyksIHQgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLWlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigndmlkZW9HdGFnTGFiZWwnLCBuKSwgITEgIT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkMwYjMzNjIwMWU1Y2U0MzYzYmU5OTYyM2YyMTVjMTdlNS1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwzZWZhYWYxZjJhYzg0MjE2YjYyNGFmN2Q1N2Q3MzcyZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2Zvcm1zT25DaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJy5qcy1mb3JtLWNhdGVnb3J5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydGllczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhLWluZGV4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCB0ID0gdGhpcy5jaGlsZHJlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbbl0uc2VsZWN0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xIDwgZS5pbmRleE9mKCdjb250YWN0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnQ29udGFjdCBmb3JtOicgKyB0W25dLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldFZhcignZm9ybTpsaW5rTmFtZScsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gJ0NTIEFnZW50IEZvcm06JyArIHRbbl0udmFsdWUsIF9zYXRlbGxpdGUuc2V0VmFyKCdmb3JtOmxpbmtOYW1lJywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnL2VuLWdiL2N1c3RvbWVyLXN1cHBvcnQvY29udGFjdC5odG1sJyA9PSBlIHx8ICcvZW4tZ2IvY3VzdG9tZXItc3VwcG9ydC5odG1sJyA9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICclZm9ybTpsaW5rTmFtZSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGU4MGRlYzgwYmIxYjQ1NjZiZDQ4MTc4Yzg2YjYyYTM4JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpidG5PcmFuZ2VEQycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdidXR0b24uZnhnLWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnRpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcoc2lnblVwQ29udGludWVCdXR0b24pfChzdWJtaXRQaW5CdXR0b24pJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2ZkbWVucm9sbG1lbnRcXC9cXD9zaWdudXBcXD10cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpidG5PcmFuZ2VEQ1BhZ2VMaXN0TWFwcGluZycpLCB0ID0gdGhpcy5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdkY09yYW5nZUJ0bkxhYmVsJywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDNDVlMTk4OGY4YmFmNDlkNGE3ZjE3OWE4MDJlMDRhMTItc291cmNlLm1pbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOTA4ZTc0ZWE0OTYyNDhiODg0ZWFjMDU0NDRiODM2NzQnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnVGFnOmJ0bk9yYW5nZUFXJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2J1dHRvbi5meGctYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50UHJvcGVydGllczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyhzaWduVXBDb250aW51ZUJ1dHRvbil8KHN1Ym1pdFBpbkJ1dHRvbiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcL2ZkbWVucm9sbG1lbnRcXC9cXD9zaWdudXBcXD10cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdcXC9zaGlwcGluZy9pbmR1c3RyeS1zb2x1dGlvbnMvaGVhbHRoY2FyZS9jb250YWN0LXVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcignZ1RhZzpidG5PcmFuZ2VBV1BhZ2VMaXN0TWFwcGluZycpLCB0ID0gdGhpcy5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdhd09yYW5nZUJ0bkxhYmVsJywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzY4NmI4ZjBjNDUyMC80Y2U0MDFjNTFiNTEvMTkwODQ3MzViMTc5L1JDNGI1NzNiNGQyODgxNGZhYWEzYmI0YWVlNGQ2YjhiYWItc291cmNlLm1pbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4dGVybmFsOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMODRjNGUxM2Q5MTYxNDFiOWE2YjQ4ZjhjZTZkOTRkMDMnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdnVGFnOmN0YU9yYW5nZUZCJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnKGhlcm9cXHxBcHBseSBOb3cpfChoZXJvXFx8R2V0IFN0YXJ0ZWQpfChsaW5rXFx8U3RhcnQgT3JkZXIpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNjAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6Y3RhT3JhbmdlRkJQYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIF9mZHggJiYgX3NhdGVsbGl0ZS5nZXRWYXIoJ19mZHhVdGlsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX2ZkeC5wYWdlRmxhZyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdmYk9yYW5nZUV2ZW50JywgbiksICExICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5jbGFzc05hbWUpLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYXRlbGxpdGUuc2V0VmFyKCdmYk9yYW5nZUV2ZW50JywgX2ZkeC5nZXRHdGFnTGFiZWwobiwgciwgaSkpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS82ODZiOGYwYzQ1MjAvNGNlNDAxYzUxYjUxLzE5MDg0NzM1YjE3OS9SQzE4YTE2Y2QxM2IyMDRlNzc5OTNhMGI5OTEwNDJjMzdjLXNvdXJjZS5taW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDVkNzFhNzUwYTA5ZTRjNTFhYmZiYzI4MzliZDhkNDc4JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncXVhbHRyaWNzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3F1YWx0cmljczpwYWdlTGlzdE1hcHBpbmcnKSwgdCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgbiA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdxdWFsdHJpY3M6cGFnZU5hbWUnKSwgciA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdjb250ZW50OnBhZ2VQYXRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpIHx8IF9mZHgucGFnZUZsYWcobiwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8c2NyaXB0PlxuLy8vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8gICAgIFFVQUxUUklDUyBTSVRFIElOVEVSQ0VQVCB8IDE1NTAuMDYyNzIwMTQuMDEgXG4vLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8qIEJFR0lOIFFVQUxUUklDUyBTSVRFIElOVEVSQ0VQVCAqL1xuLy9GRURFWCAtIEFkZGVkIHZlcnNpb24gaW5mby5cbnZhciBpbnRlcmNlcHRWZXJzaW9uID0gIjE1NTAuMDYyNzIwMTQuMDEiO1xuLy9GRURFWCAtIFJlbW92ZWQgZm9yIGxhenkgbG9hZC5cbi8vPHNjcmlwdCB0eXBlPVwndGV4dC9qYXZhc2NyaXB0XCc+XG4vL0ZFREVYIC0gQWRkZWQgb3V0c2lkZSB0cnkvY2F0Y2guXG50cnkge1xuXHQvL0ZFREVYIC0gUmVwbGFjZSBpbmxpbmUgRElWIGFuZCBjcmVhdGUgZHluYW1pY2FsbHkuXG5cdHZhciBpbnRlcmNlcHREaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnZGl2XCcpO1xuXHRpbnRlcmNlcHREaXYuaWQgPSBcJ1pOX2FnejRqTzg3bE1JVU8xS1wnO1xuXHR2YXIgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnYm9keVwnKVswXTtcblx0Yi5hcHBlbmRDaGlsZChpbnRlcmNlcHREaXYpO1xuXG5cdChmdW5jdGlvbigpe3ZhciBnPWZ1bmN0aW9uKGUsaCxmLGcpe1xuXHRcdHRoaXMuZ2V0PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYT1hKyI9IixjPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLGI9MCxlPWMubGVuZ3RoO2I8ZTtiKyspe2Zvcih2YXIgZD1jW2JdOyIgIj09ZC5jaGFyQXQoMCk7KWQ9ZC5zdWJzdHJpbmcoMSxkLmxlbmd0aCk7aWYoMD09ZC5pbmRleE9mKGEpKXJldHVybiBkLnN1YnN0cmluZyhhLmxlbmd0aCxkLmxlbmd0aCl9cmV0dXJuIG51bGx9O1xuXHRcdHRoaXMuc2V0PWZ1bmN0aW9uKGEsYyl7dmFyIGI9IiIsYj1uZXcgRGF0ZTtiLnNldFRpbWUoYi5nZXRUaW1lKCkrNjA0OEU1KTtiPSI7IGV4cGlyZXM9IitiLnRvR01UU3RyaW5nKCk7ZG9jdW1lbnQuY29va2llPWErIj0iK2MrYisiOyBwYXRoPS87ICJ9O1xuXHRcdHRoaXMuY2hlY2s9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldChmKTtpZihhKWE9YS5zcGxpdCgiOiIpO2Vsc2UgaWYoMTAwIT1lKSJ2Ij09aCYmKGU9TWF0aC5yYW5kb20oKT49ZS8xMDA/MDoxMDApLGE9W2gsZSwwXSx0aGlzLnNldChmLGEuam9pbigiOiIpKTtlbHNlIHJldHVybiEwO3ZhciBjPWFbMV07aWYoMTAwPT1jKXJldHVybiEwO3N3aXRjaChhWzBdKXtjYXNlICJ2IjpyZXR1cm4hMTtjYXNlICJyIjpyZXR1cm4gYz1hWzJdJU1hdGguZmxvb3IoMTAwL2MpLGFbMl0rKyx0aGlzLnNldChmLGEuam9pbigiOiIpKSwhY31yZXR1cm4hMH07XG5cdFx0Ly9GRURFWCAtIEFkZGVkIHRyeS9jYXRjaCBmb3Igd2hlbiB0aGlzIGlzIGEgY2FsbGJhY2sgZnJvbSBsb2FkIGV2ZW50LlxuXHRcdHRoaXMuZ289ZnVuY3Rpb24oKXt0cnl7aWYodGhpcy5jaGVjaygpKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnR5cGU9InRleHQvamF2YXNjcmlwdCI7YS5zcmM9ZysgIiZ0PSIgKyAobmV3IERhdGUoKSkuZ2V0VGltZSgpO2RvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9fWNhdGNoKGUpe319O1xuXHRcdC8vdGhpcy5zdGFydD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7d2luZG93LmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7YS5nbygpfSwhMSk6d2luZG93LmF0dGFjaEV2ZW50JiZ3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsZnVuY3Rpb24oKXthLmdvKCl9KX19O1xuXHRcdC8vRkVERVggLSBSZXBsYWNlZCBsaW5lIGFib3ZlIHRvIHVwZGF0ZSB0byBmaXJlIHdoZW4gZG9jdW1lbnQucmVhZHlTdGF0ZSBpcyBhbHJlYWR5IGNvbXBsZXRlIGZvciBsYXp5IGxvYWQuXG5cdFx0dGhpcy5zdGFydD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7KGRvY3VtZW50LnJlYWR5U3RhdGUhPSJjb21wbGV0ZSIpPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXthLmdvKCl9LCExKTp3aW5kb3cuYXR0YWNoRXZlbnQmJndpbmRvdy5hdHRhY2hFdmVudCgib25sb2FkIixmdW5jdGlvbigpe2EuZ28oKX0pKTphLmdvKCk7fX07XG5cdFx0Ly9GRURFWCAtIEhhbmRsZSBkZXYvdGVzdCBhbmQgcHJvZC5cblx0XHR2YXIgZmR4X1FTSV9wYXJhbV9lbnY9KHdpbmRvdy5sb2NhdGlvbi5ob3N0PT09Ind3dy5mZWRleC5jb20iKSA/ICIiOiImUV9WRVJTSU9OPTAiOyBcblx0XHR0cnl7XG5cdFx0XHQobmV3IGcoMTAwLCJyIiwiUVNJX1NfWk5fYWd6NGpPODdsTUlVTzFLIiwiLy96bl9hZ3o0am84N2xtaXVvMWstZmVkZXguc2l0ZWludGVyY2VwdC5xdWFsdHJpY3MuY29tL1dSU2l0ZUludGVyY2VwdEVuZ2luZS8/UV9aSUQ9Wk5fYWd6NGpPODdsTUlVTzFLJlFfTE9DPSIrZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKStmZHhfUVNJX3BhcmFtX2VudikpLnN0YXJ0KClcblx0XHR9XG5cdFx0Y2F0Y2goaSl7fVxuXHR9KSgpO1xufVxuY2F0Y2goZSl7fVxuXG48L3NjcmlwdD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGRlOTk1MDE1MjA4OTQ5NmZhMzNlNzE4NzliOTg5YThmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ1RhZzpERkFFdmVudCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PSB0eXBlb2YgX2ZkeCAmJiBfc2F0ZWxsaXRlLmdldFZhcignX2ZkeFV0aWwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfZmR4LnBjZlV0aWwoKS5tYXRjaCgvd3d3KHNib3guaWRldnxiYXNlLmlkZXZ8ZGV2LmlkZXZ8ZHJ0LmlkZXZ8c3RyZXNzLmRtei5pZGV2fGJpdC5pZGV2fHRlc3R8KS5mZWRleC5jb20vZ2kpLCB0ID0gJycgPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWdEaXNhYmxlTG9jYWxlJyksIG4gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIHIgPSBfc2F0ZWxsaXRlLmdldFZhcignY29udGVudDpjb3VudHJ5Q29kZScpLCBpID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2dUYWc6REZBRXZlbnRNYXBwaW5nJyksIGEgPSBfZmR4LnBhZ2VGbGFnKGksIHIsICdjb3VudHJ5JyksIG8gPSBfZmR4LnBhZ2VGbGFnKGEsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NhdGVsbGl0ZS5zZXRWYXIoJ2RjTGFiZWwnLCBvKSwgISghMSA9PT0gbyB8fCBudWxsID09PSBlIHx8ICF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzxzY3JpcHQ+XG4gIGd0YWcoXCdldmVudFwnLCBcJ2NvbnZlcnNpb25cJyxcbiAgICB7XG4gICAgICAgICJhbGxvd19jdXN0b21fc2NyaXB0cyI6IGZhbHNlLFxuICAgICAgICBcJ3NlbmRfdG9cJzogX3NhdGVsbGl0ZS5nZXRWYXIoImRjTGFiZWwiKVxuICAgIH0pO1xuPC9zY3JpcHQ+XG48IS0tXG52YXIgZGZhTWFwcGluZyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCJnVGFnOkRGQUV2ZW50TWFwcGluZyIpOyAgXG52YXIgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG51cmwgPSAgLy5jb20oLiopLy5leGVjKHVybClbMV07XG52YXIgb2JqREZBID0iIjsgXG52YXIgZXZlbnRfdHlwZSA9ICIiO1xudmFyIGV2ZW50X25hbWUgPSAiIjtcbnZhciBldmVudF9wYXJhbSA9ICIiO1xuaWYgKCh0eXBlb2YgZGZhTWFwcGluZyAhPT0gInVuZGVmaW5lZCIgJiYgZGZhTWFwcGluZyAhPT0gIiIpICYmICh0eXBlb2YgdXJsICE9PSAidW5kZWZpbmVkIiAmJiB1cmwgIT09ICIiKSl7XG5cdGZvcih2YXIga2V5IGluIGRmYU1hcHBpbmcpe1x0XHRcdFx0XG5cdFx0aWYodXJsLmluZGV4T2Yoa2V5KSA+IC0xKXtcblx0XHRcdG9iakRGQSA9IGRmYU1hcHBpbmdba2V5XTtcdFx0XHQgXG5cdFx0XHRicmVhaztcdFx0XHRcdCAgXG5cdFx0fVxuXHR9XG59ICBcbmlmICgodHlwZW9mIG9iakRGQSAhPT0gInVuZGVmaW5lZCIgJiYgb2JqREZBICE9PSAiIikgKXtcblx0ZXZlbnRfdHlwZSA9IG9iakRGQVsiZXZlbnRfdHlwZSJdO1xuXHRldmVudF9uYW1lID0gb2JqREZBWyJldmVudF9uYW1lIl07XG5cdGV2ZW50X3BhcmFtID0gb2JqREZBWyJldmVudF9wYXJhbSJdO1xufVxuZ3RhZyhldmVudF90eXBlLCBldmVudF9uYW1lLCBldmVudF9wYXJhbSk7XG48L3NjcmlwdD4tLT4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGU3Y2I5YjQxYTU4MTQzM2RiNTNhOWFlYThhYmIyODEzJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmlkZW86MjUlIFZpZXdlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvbWVkaWFUaW1lUGxheWVkLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogJ3BlcmNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudDogMjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnLmJyaWdodGNvdmUtY29udGFpbmVyIHZpZGVvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgdGhpcy5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHRoaXMucGFyZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2lkJyksIHIgPSB0aGlzLnBhcmVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLWlkJyksIGkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdicmlnaHRjb3ZlLWNvbnRhaW5lcicpLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09IGlbYV0uZ2V0QXR0cmlidXRlKCdkYXRhLXBsYXllcmlkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmpzLWRvY2stdGl0bGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZVZhcjQyID0gb1thXS5pbm5lclRleHQsIHQuZVZhcjMxID0gciwgdC5saW5rVHJhY2tWYXJzID0gdC5hcGwodC5saW5rVHJhY2tWYXJzLCAnZVZhcjQyLGVWYXIzMScsICcsJywgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmtUcmFja0V2ZW50cyA9IHQuZXZlbnRzID0gJ2V2ZW50MjA0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdWaWRlbzoyNSUgVmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYjMyOGNlODgxNmJhNDhkOWI2ZDg0Y2FiNjM0ZjRhY2UnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZWFyY2hSZXN1bHRUcmFjaycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICcuY3Etc25wLXJlc3VsdHNldC1oZWFkZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5rVHJhY2tWYXJzID0gJ3Byb3AzMSxlVmFyNDMscHJvcDUxLGVWYXI1MSxlVmFyNTMscHJvcDI5LHByb3AxOCxwcm9wMTkscHJvcDIwLGV2ZW50cycsIHQubGlua1RyYWNrRXZlbnRzID0gJ05vbmUnLCB0LmxpbmtUcmFja0V2ZW50cyA9IHQuZXZlbnRzID0gJ2V2ZW50MTIyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5maXJzdEVsZW1lbnRDaGlsZC5ocmVmLCByID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3NlYXJjaDp0ZXJtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gciArICd8JyArIG4sIHQuZVZhcjQzID0gJ0w6SW50U3JjaDonICsgciwgdC5lVmFyNTEgPSB0LnByb3A1MSA9IG4sIHQuZVZhcjUzID0gJysxJywgdC5wcm9wMTggPSB0LnBhZ2VOYW1lLCB0LnByb3AxOSA9IG4sIHQucHJvcDIwID0gdC5wYWdlTmFtZSArICc6JyArIG4sIHQucHJvcDMxID0gJycgIT09IHQudmlzaXRvci5nZXRBbmFseXRpY3NWaXNpdG9ySUQoKSA/ICdbQ1NddjF8JyArIHQudmlzaXRvci5nZXRBbmFseXRpY3NWaXNpdG9ySUQoKSArICdbQ0VdJyA6IHQudmlzaXRvci5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLCBubHRyayA9ICd5JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTZWFyY2ggUmVzdWx0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2MDI2MGFmZjBlNmM0YWExYjUyOGE4ZWY3MzQ4NDNmNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Zlcml6b246Y3RhT3JhbmdlQnV0dG9uJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICdidXR0b24uZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1zdWJtaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnKEZvcm1cXHxGcmVpZ2h0IFF1b3RlIHdpdGggQWNjb3VudCl8KEZvcm1cXHxFTi1GcmVpZ2h0IFF1b3RlLU5vLUFjY291bnQpfChGb3JtXFx8RlItRnJlaWdodCBRdW90ZS1Oby1BY2NvdW50KXwoRm9ybVxcfEZSLUZyZWlnaHQgUXVvdGUpfChGb3JtXFx8QmV5b25kIHRoZSBCdXkgQnV0dG9uKXwoRm9ybVxcfEJleW9uZCB0aGUgQnV5IEJ1dHRvbi1GUiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRlbGF5OiA2MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJ2EuZnhnLWJ1dHRvbi5meGctYnV0dG9uLS1vcmFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0aWVzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdGEtYW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnKGxpbmtcXHxTdGFydCB5b3VyIHF1b3RlKXwobGlua1xcfENvbW1lbmNleiB2b3RyZSBlc3RpbWF0aW9uKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcLygoZW58ZnIpLWNhKVxcL3NoaXBwaW5nLXRvb2xzXFwvKGZyZWlnaHQtcXVvdGUuaHRtbHxmcmVpZ2h0LXF1b3RlLW5vLWFjY291bnQuaHRtbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcLygoZW58ZnIpLWNhKVxcL3NtYWxsLWJ1c2luZXNzXFwvZWNvbW1lcmNlLXNvbHV0aW9ucy5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcobGlua1xcfFN0YXJ0IHlvdXIgcXVvdGUpfChsaW5rXFx8Q29tbWVuY2V6IHZvdHJlIGVzdGltYXRpb24pJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBfc2F0ZWxsaXRlLmdldFZhcigndmVyaXpvbkJ0bkNsaWNrTWFwcGluZycpLCB0ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtYW5hbHl0aWNzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09IHR5cGVvZiBfZmR4ICYmIF9zYXRlbGxpdGUuZ2V0VmFyKCdfZmR4VXRpbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IF9mZHgucGFnZUZsYWcoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc2F0ZWxsaXRlLnNldFZhcigncGl4ZWxJZCcsIG5bMF0pLCBfc2F0ZWxsaXRlLnNldFZhcignRUMnLCBuWzFdKSwgITEgIT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vNjg2YjhmMGM0NTIwLzRjZTQwMWM1MWI1MS8xOTA4NDczNWIxNzkvUkM5YWIxZmU2NDEwMGM0NmRmODg3Y2NjNjA3NjQ0ZDQyMS1zb3VyY2UubWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWw6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxlMTI0YWVmNDc1NGU0ZDcyYTQ1YTk3NzkzODFlNjY1YycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2V2ZW50OmZvcm1TdWJtaXRCdXR0b24nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnYnV0dG9uLmZ4Zy1idXR0b24uZnhnLWJ1dHRvbi0tb3JhbmdlICcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnRpZXM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YS1hbmFseXRpY3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcoRm9ybVxcfEVOLUZyZWlnaHQgUXVvdGUtTm8tQWNjb3VudCl8KEZvcm1cXHxTdWJtaXQgQnV0dG9uLUxvZ2lzdGljcyBDb250YWN0IFVzKXwoRm9ybVxcfFNvdW1ldHRyZS1Mb2dpc3RpY3MgQ29udGFjdCBVcy1GUiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1hbmFseXRpY3MnKSwgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRm9ybXxFTi1GcmVpZ2h0IFF1b3RlLU5vLUFjY291bnQnOiAnZXZlbnQxOTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfFN1Ym1pdCBCdXR0b24tTG9naXN0aWNzIENvbnRhY3QgVXMnOiAnZXZlbnQxOTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGb3JtfFNvdW1ldHRyZS1Mb2dpc3RpY3MgQ29udGFjdCBVcy1GUic6ICdldmVudDE5NCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSBfZmR4LnBhZ2VGbGFnKHQsIGUpLCBfc2F0ZWxsaXRlLnNldFZhcignZm9ybUV2ZW50JywgbiksICd1bmRlZmluZWQnICE9PSBuICYmICcnICE9PSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2Zvcm1FdmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5rVHJhY2tFdmVudHMgPSB0LmV2ZW50cyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOWJmZWIzZGYxMGM3NGE0ZjllNjdlYzAwYTYxNDE4OTgnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdyZWN0YWc6Q29udGVudFNxdWFyZScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnXFwvKGVuLXVzKVxcLyhwcmludGluZ3xvZmZpY2UpXFwvKHBlcnNvbmFsLXByb2plY3RzfG9ubGluZS1wcmludGluZ3xiYW5uZXJzfGJ1c2luZXNzLWNhcmRzfGNvbnN1bWVyLW9mZmVyc3xkZXNpZ24tc2VydmljZXN8Zmxhc2gtc2FsZS1vZmZlcnN8Z3JlZXRpbmctY2FyZHN8bWFya2V0aW5nLW1hdGVyaWFsc3xtZW51c3xuYXRpb25hbC1iaWQtY2VudGVyfG9ubGluZS1jdXN0b20tZnJhbWVzfHBhc3Nwb3J0LXBob3RvfHBob3RvYm9va3N8cG9zdGVyc3xwb3N0ZXItc2lnbi1iYW5uZXItcHJpbnRpbmd8cHJpbnQtcHJlZmVycmVkfHNpZ25zfHNtYWxsLW1lZGl1bS1idXNpbmVzcy1vZmZlcnN8c2VydmljZXN8cHJpbnRhbmRnb3xjdXN0b21lcnN1cHBvcnQpLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcLyhlbi11cylcXC8oc2hpcHBpbmd8cHJpbnRpbmcpXFwvKG1hcmtldGluZy1tYXRlcmlhbHN8cGFja2luZy1zdXBwbGllc3xwb3N0ZXJzKVxcLyhicm9jaHVyZXN8Zmx5ZXJzfHBvc3RjYXJkc3xjdXN0b20tYnJhbmRlZC1ib3hlc3xwcmludHMpLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJc1JlZ2V4OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJ1xcLyhlbi11cylcXC8ob2ZmaWNlfHByaW50aW5nfGNvdXBvbi1vZmZlcnN8KS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlSXNSZWdleDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb250ZW50c3F1YXJlL3NyYy9saWIvYWN0aW9ucy91eGFJbnN0YWxsYXRpb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXRoSW5wdXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFF1ZXJ5SW5wdXQ6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhdGhDaGVja2JveDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UXVlcnlDaGVja2JveDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH07CiAgICAgICAgdmFyICRfX192YXJfMTFjNGI3MGFkN2NlOGNmYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICBmdW5jdGlvbiBlKG4pIHsKICAgICAgICAgICAgICAgIGlmIChuLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sIGUpOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBlLCB0LmdldCA/IHQgOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGUodCwgdC5leHBvcnRzKSwgdC5leHBvcnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG4odCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnJlc29sdmUodCgpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihlICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiBlLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpKGUsIHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZS5hcHBseSh0LCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBhKSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXcnKTsKICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDAsIHRoaXMuX2hhbmRsZWQgPSAhMSwgdGhpcy5fdmFsdWUgPSB1bmRlZmluZWQsIHRoaXMuX2RlZmVycmVkcyA9IFtdLCBmKGUsIHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG8ociwgaSkgewogICAgICAgICAgICAgICAgZm9yICg7IDMgPT09IHIuX3N0YXRlOykKICAgICAgICAgICAgICAgICAgICByID0gci5fdmFsdWU7CiAgICAgICAgICAgICAgICAwICE9PSByLl9zdGF0ZSA/IChyLl9oYW5kbGVkID0gITAsIGEuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDEgPT09IHIuX3N0YXRlID8gaS5vbkZ1bGZpbGxlZCA6IGkub25SZWplY3RlZDsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlKHIuX3ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYyhpLnByb21pc2UsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHMoaS5wcm9taXNlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKDEgPT09IHIuX3N0YXRlID8gcyA6IGMpKGkucHJvbWlzZSwgci5fdmFsdWUpOwogICAgICAgICAgICAgICAgfSkpIDogci5fZGVmZXJyZWRzLnB1c2goaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICh0ID09PSBlKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmICgnb2JqZWN0JyA9PSB0eXBlb2YgdCB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiB0KSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX3N0YXRlID0gMywgZS5fdmFsdWUgPSB0LCB2b2lkIGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZihpKG4sIHQpLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZS5fc3RhdGUgPSAxLCBlLl92YWx1ZSA9IHQsIGwoZSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgYyhlLCByKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuX3N0YXRlID0gMiwgZS5fdmFsdWUgPSB0LCBsKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgMiA9PT0gZS5fc3RhdGUgJiYgMCA9PT0gZS5fZGVmZXJyZWRzLmxlbmd0aCAmJiBhLl9pbW1lZGlhdGVGbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZS5faGFuZGxlZCB8fCBhLl91bmhhbmRsZWRSZWplY3Rpb25GbihlLl92YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCBuID0gZS5fZGVmZXJyZWRzLmxlbmd0aDsgdCA8IG47IHQrKykKICAgICAgICAgICAgICAgICAgICBvKGUsIGUuX2RlZmVycmVkc1t0XSk7CiAgICAgICAgICAgICAgICBlLl9kZWZlcnJlZHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdGhpcy5vbkZ1bGZpbGxlZCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBlIDogbnVsbCwgdGhpcy5vblJlamVjdGVkID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCA/IHQgOiBudWxsLCB0aGlzLnByb21pc2UgPSBuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSAhMTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuIHx8IChuID0gITAsIHModCwgZSkpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgKG4gPSAhMCwgYyh0LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBuID0gITAsIGModCwgcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCBlID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3QuYXNzaWduKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgU3RyaW5nKCdhYmMnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZVs1XSA9ICdkZScsICc1JyA9PT0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSlbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0ge30sIG4gPSAwOyBuIDwgMTA7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgdFsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXSA9IG47CiAgICAgICAgICAgICAgICAgICAgaWYgKCcwMTIzNDU2Nzg5JyAhPT0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJbZV0gPSBlOwogICAgICAgICAgICAgICAgICAgIH0pLCAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnID09PSBPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCByKSkuam9pbignJyk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2luZG93LmF0b2IpIHsKICAgICAgICAgICAgICAgIHZhciBoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5ldmVudHMgJiYgdC5ldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZXZlbnQucnVsZU9yZGVyIC0gdC5ldmVudC5ydWxlT3JkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIHYgPSAnZGVidWcnLCBiID0gZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cnVlJyA9PT0gdC5nZXRJdGVtKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXRJdGVtKHYsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IFtdLCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5vdXRwdXRFbmFibGVkID0gbigpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlYnVnQ2hhbmdlZDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlYnVnRW5hYmxlZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERlYnVnRW5hYmxlZDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKCkgIT09IHQgJiYgKHIodCksIGUub3V0cHV0RW5hYmxlZCA9IHQsIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCB5ID0gJ01vZHVsZSBkaWQgbm90IGV4cG9ydCBhIGZ1bmN0aW9uLicsIF8gPSBmdW5jdGlvbiAoYSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhLmdldE1vZHVsZUV4cG9ydHMoZS5tb2R1bGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbyhlLnNldHRpbmdzIHx8IHt9LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmJpbmQobnVsbCwgaSkuYXBwbHkobnVsbCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgQyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IGUucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpIDogZTsKICAgICAgICAgICAgICAgICAgICB9LCB4ID0gewogICAgICAgICAgICAgICAgICAgICAgICBMT0c6ICdsb2cnLAogICAgICAgICAgICAgICAgICAgICAgICBJTkZPOiAnaW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHOiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBXQVJOOiAnd2FybicsCiAgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SOiAnZXJyb3InCiAgICAgICAgICAgICAgICAgICAgfSwgayA9ICdcdUQ4M0RcdURFODAnLCBFID0gMTAgPT09IHBhcnNlSW50KCgvbXNpZSAoXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpIHx8IFtdKVsxXSkgPyAnW0xhdW5jaF0nIDogaywgSSA9ICExLCB3ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEkgJiYgd2luZG93LmNvbnNvbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudW5zaGlmdChFKSwgZSAhPT0geC5ERUJVRyB8fCB3aW5kb3cuY29uc29sZVtlXSB8fCAoZSA9IHguSU5GTyksIHdpbmRvdy5jb25zb2xlW2VdLmFwcGx5KHdpbmRvdy5jb25zb2xlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIEQgPSB3LmJpbmQobnVsbCwgeC5MT0cpLCBBID0gdy5iaW5kKG51bGwsIHguSU5GTyksIFMgPSB3LmJpbmQobnVsbCwgeC5ERUJVRyksIFQgPSB3LmJpbmQobnVsbCwgeC5XQVJOKSwgUCA9IHcuYmluZChudWxsLCB4LkVSUk9SKSwgTyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nOiBELAogICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBBLAogICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZzogUywKICAgICAgICAgICAgICAgICAgICAgICAgd2FybjogVCwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJID0gITAsIHcuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLmNvbmNhdCh4LldBUk4sIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKSwgZSB8fCAoSSA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IG91dHB1dEVuYWJsZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG91dHB1dEVuYWJsZWQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVByZWZpeGVkTG9nZ2VyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnWycgKyBlICsgJ10nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2c6IEQuYmluZChudWxsLCB0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBBLmJpbmQobnVsbCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc6IFMuYmluZChudWxsLCB0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuOiBULmJpbmQobnVsbCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IFAuYmluZChudWxsLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGogPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGdsb2JhbCA/IGdsb2JhbCA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBzZWxmID8gc2VsZiA6IHt9LCBMID0gdChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLmV4cG9ydHMgPSBlKCksICEhMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93LkNvb2tpZXMsIG4gPSB3aW5kb3cuQ29va2llcyA9IGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuQ29va2llcyA9IHQsIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwLCB0ID0ge307IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbcl0gPSBuW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoLyglWzAtOUEtWl17Mn0pKy9nLCBkZWNvZGVVUklDb21wb25lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInID09IHR5cGVvZiAobiA9IGMoeyBwYXRoOiAnLycgfSwgcy5kZWZhdWx0cywgbikpLmV4cGlyZXMgJiYgKG4uZXhwaXJlcyA9IG5ldyBEYXRlKDEgKiBuZXcgRGF0ZSgpICsgODY0MDAwMDAgKiBuLmV4cGlyZXMpKSwgbi5leHBpcmVzID0gbi5leHBpcmVzID8gbi5leHBpcmVzLnRvVVRDU3RyaW5nKCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBKU09OLnN0cmluZ2lmeSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXltce1xbXS8udGVzdChyKSAmJiAodCA9IHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHUud3JpdGUgPyB1LndyaXRlKHQsIGUpIDogZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh0KSkucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnwzQXwzQ3wzRXwzRHwyRnwzRnw0MHw1Qnw1RHw1RXw2MHw3Qnw3RHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KSwgZSA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZSkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvW1woXCldL2csIGVzY2FwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bYV0gJiYgKGkgKz0gJzsgJyArIGEsICEwICE9PSBuW2FdICYmIChpICs9ICc9JyArIG5bYV0uc3BsaXQoJzsnKVswXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNvb2tpZSA9IGUgKyAnPScgKyB0ICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBkb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHt9LCByID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW10sIGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcltpXS5zcGxpdCgnPScpLCBvID0gYS5zbGljZSgxKS5qb2luKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCB8fCAnIicgIT09IG8uY2hhckF0KDApIHx8IChvID0gby5zbGljZSgxLCAtMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbChhWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPSAodS5yZWFkIHx8IHUpKG8sIHMpIHx8IGwobyksIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBKU09OLnBhcnNlKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobltzXSA9IG8sIGUgPT09IHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBuW2VdIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zZXQgPSBuLCBzLmdldCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmdldEpTT04gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy5yZW1vdmUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGUsICcnLCBjKHQsIHsgZXhwaXJlczogLTEgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMuZGVmYXVsdHMgPSB7fSwgcy53aXRoQ29udmVydGVyID0gZSwgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgTSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBMLmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBMLnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBMLnJlbW92ZQogICAgICAgICAgICAgICAgICAgIH0sIFYgPSB3aW5kb3csIFIgPSAnY29tLmFkb2JlLnJlYWN0b3IuJywgRiA9IGZ1bmN0aW9uIChyLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gUiArIChlIHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEl0ZW06IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF8xYmNmNzE2NGFlZTFlNGFiID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzFiY2Y3MTY0YWVlMWU0YWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfYzdjYWVjNTAxZGNhMjM4Ny5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZbcl0uZ2V0SXRlbShpICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8xYmNmNzE2NGFlZTFlNGFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfMWJjZjcxNjRhZWUxZTRhYikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfYTJkMGYzNTc5ZWIwNTcxYyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9hMmQwZjM1NzllYjA1NzFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrX2M3Y2FlYzUwMWRjYTIzODcubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWW3JdLnNldEl0ZW0oaSArIGUsIHQpLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9hMmQwZjM1NzllYjA1NzFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfYTJkMGYzNTc5ZWIwNTcxYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBOID0gJ19zZHNhdF8nLCBCID0gJ2RhdGFFbGVtZW50cy4nLCBVID0gJ2RhdGFFbGVtZW50Q29va2llc01pZ3JhdGVkJywgcSA9IEYoJ2xvY2FsU3RvcmFnZScpLCB6ID0gRignc2Vzc2lvblN0b3JhZ2UnLCBCKSwgSCA9IEYoJ2xvY2FsU3RvcmFnZScsIEIpLCBXID0gewogICAgICAgICAgICAgICAgICAgICAgICBQQUdFVklFVzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgU0VTU0lPTjogJ3Nlc3Npb24nLAogICAgICAgICAgICAgICAgICAgICAgICBWSVNJVE9SOiAndmlzaXRvcicKICAgICAgICAgICAgICAgICAgICB9LCBHID0ge30sIFkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBKU09OLnN0cmluZ2lmeShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0sIFggPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVy5QQUdFVklFVzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIChHW2VdID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVy5TRVNTSU9OOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKChyID0gWShuKSkgJiYgei5zZXRJdGVtKGUsIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXLlZJU0lUT1I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAoKHIgPSBZKG4pKSAmJiBILnNldEl0ZW0oZSwgcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgSyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTS5nZXQoTiArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBuICE9PSB1bmRlZmluZWQgJiYgWChlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICB9LCBRID0gewogICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZTogWCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBXLlBBR0VWSUVXOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHLmhhc093blByb3BlcnR5KGUpID8gR1tlXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFcuU0VTU0lPTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKG4gPSB6LmdldEl0ZW0oZSkpID8gbiA6IEpTT04ucGFyc2Uobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFcuVklTSVRPUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PT0gKG4gPSBILmdldEl0ZW0oZSkpID8gbiA6IEpTT04ucGFyc2Uobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1pZ3JhdGVDb29raWVEYXRhOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5nZXRJdGVtKFUpIHx8IChPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyhlLCB0W2VdLnN0b3JhZ2VEdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcS5zZXRJdGVtKFUsICEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCAkID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdGYWlsZWQgdG8gZXhlY3V0ZSBkYXRhIGVsZW1lbnQgbW9kdWxlICcgKyBlLm1vZHVsZVBhdGggKyAnIGZvciBkYXRhIGVsZW1lbnQgJyArIHQgKyAnLiAnICsgbiArIChyID8gJ1xuJyArIHIgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgSiA9IGZ1bmN0aW9uIChzLCBjLCB1LCBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsID8gJycgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSA9IG4uc3RvcmFnZUR1cmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gcy5nZXRNb2R1bGVFeHBvcnRzKG4ubW9kdWxlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgTy5lcnJvcigkKG4sIGUsIG8ubWVzc2FnZSwgby5zdGFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gcih1KG4uc2V0dGluZ3MsIHQpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE8uZXJyb3IoJChuLCBlLCBvLm1lc3NhZ2UsIG8uc3RhY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgKG51bGwgIT0gYSA/IFEuc2V0VmFsdWUoZSwgaSwgYSkgOiBhID0gUS5nZXRWYWx1ZShlLCBpKSksIG51bGwgPT0gYSAmJiBudWxsICE9IG4uZGVmYXVsdFZhbHVlICYmIChhID0gbi5kZWZhdWx0VmFsdWUpLCAnc3RyaW5nJyA9PSB0eXBlb2YgYSAmJiAobi5jbGVhblRleHQgJiYgKGEgPSBDKGEpKSwgbi5mb3JjZUxvd2VyQ2FzZSAmJiAoYSA9IGEudG9Mb3dlckNhc2UoKSkpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5lcnJvcigkKG4sIGUsICdNb2R1bGUgZGlkIG5vdCBleHBvcnQgYSBmdW5jdGlvbi4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgWiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblRleHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhlLnRleHRDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIGVlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciwgaSA9IGUsIGEgPSAwLCBvID0gdC5sZW5ndGg7IGEgPCBvOyBhKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdFthXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmICdAJyA9PT0gcy5jaGFyQXQoMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHMuc2xpY2UoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IFpbY10oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkuZ2V0QXR0cmlidXRlICYmIChyID0gcy5tYXRjaCgvXmdldEF0dHJpYnV0ZVwoKC4rKVwpJC8pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1ID0gclsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS5nZXRBdHRyaWJ1dGUodSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaVtzXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCB0ZSA9IGZ1bmN0aW9uIChhLCBvLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyhlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5zcGxpdCgnLicpLCBpID0gci5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzJyA9PT0gaSA/IHQgJiYgKG4gPSBlZSh0LmVsZW1lbnQsIHIsICEwKSkgOiAnZXZlbnQnID09PSBpID8gdCAmJiAobiA9IGVlKHQsIHIpKSA6ICd0YXJnZXQnID09PSBpID8gdCAmJiAobiA9IGVlKHQudGFyZ2V0LCByKSkgOiBuID0gZWUoYVtpXSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBuZSA9IGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KCcuJylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihyKGUpIHx8ICd0aGlzJyA9PT0gdCB8fCAnZXZlbnQnID09PSB0IHx8ICd0YXJnZXQnID09PSB0IHx8IG4uaGFzT3duUHJvcGVydHkodCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHJlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7IGV4cG9ydHM6IHt9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGwoci5leHBvcnRzLCByLCByLmV4cG9ydHMsIHQsIG4pLCByLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgfSwgaWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge30sIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gb1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICcgKyBlICsgJyBub3QgZm91bmQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgJyArIGUgKyAnLiAnICsgbi5tZXNzYWdlICsgKG4uc3RhY2sgPyAnXG4nICsgbi5zdGFjayA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uZXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5oYXNPd25Qcm9wZXJ0eSgnZXhwb3J0cycpIHx8ICh0LmV4cG9ydHMgPSByZSh0LmRlZmluaXRpb24uc2NyaXB0LCB0LnJlcXVpcmUsIHQudHVyYmluZSkpLCB0LmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJNb2R1bGU6IGZ1bmN0aW9uIChlLCB0LCBuLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbk5hbWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJpbmU6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucmVxdWlyZSA9IHIsIG9bZV0gPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5ZHJhdGVDYWNoZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZUV4cG9ydHM6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGVEZWZpbml0aW9uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuKGUpLmRlZmluaXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlRXh0ZW5zaW9uTmFtZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlKS5leHRlbnNpb25OYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIGFlID0gITEsIG9lID0gZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIuX21vbml0b3JzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAoYWUgfHwgKE8ud2FybignVGhlIF9zYXRlbGxpdGUuX21vbml0b3JzIEFQSSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcuJyksIGFlID0gITApLCBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdICYmIGVbdF0obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgc2UgPSBmdW5jdGlvbiAoaSwgYSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgcywgYywgdSA9IFtdLCBsID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUucG9wKCksIG51bGwgPT0gciAmJiBvID8gJycgOiByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAvXiUoW14lXSspJSQvLmV4ZWMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGwoZSwgdFsxXSwgbikgOiBlLnJlcGxhY2UoLyUoLis/KSUvZywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbChlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSB7fSwgciA9IE9iamVjdC5rZXlzKGUpLCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHJbaV0sIG8gPSBlW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bYV0gPSBjKG8sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IFtdLCByID0gMCwgaSA9IGUubGVuZ3RoOyByIDwgaTsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChjKGVbcl0sIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IG4oZSwgdCkgOiBBcnJheS5pc0FycmF5KGUpID8gcyhlLCB0KSA6ICdvYmplY3QnID09IHR5cGVvZiBlICYmIG51bGwgIT09IGUgPyByKGUsIHQpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMCA8IHUubGVuZ3RoID8gKE8uZXJyb3IoJ0RhdGEgZWxlbWVudCBjaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICcgKyB1LmpvaW4oJyAtPiAnKSksIGUpIDogYyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBjZSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbYXJndW1lbnRzWzBdXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmd1bWVudHNbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbcl0gPSBuW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHVlID0gc2V0VGltZW91dDsKICAgICAgICAgICAgICAgIGEucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIGUpOwogICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyh0aGlzLCBuZXcgZChlLCB0LCBuKSksIG47CiAgICAgICAgICAgICAgICB9LCBhLnByb3RvdHlwZVsnZmluYWxseSddID0gbiwgYS5hbGwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYShmdW5jdGlvbiAoaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgKCdvYmplY3QnID09IHR5cGVvZiBlIHx8ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS50aGVuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG4uY2FsbChlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8odCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1t0XSA9IGUsIDAgPT0gLS1jICYmIGkocyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5JykpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBzLmxlbmd0aCwgZSA9IDA7IGUgPCBzLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhlLCBzW2VdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGEucmVzb2x2ZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgJ29iamVjdCcgPT0gdHlwZW9mIHQgJiYgdC5jb25zdHJ1Y3RvciA9PT0gYSA/IHQgOiBuZXcgYShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlKHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgYS5yZWplY3QgPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0KG4pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgYS5yYWNlID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGEoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQobmV3IFR5cGVFcnJvcignUHJvbWlzZS5yYWNlIGFjY2VwdHMgYW4gYXJyYXknKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gaS5sZW5ndGg7IG4gPCByOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnJlc29sdmUoaVtuXSkudGhlbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGEuX2ltbWVkaWF0ZUZuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2Ygc2V0SW1tZWRpYXRlICYmIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGUpOwogICAgICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHVlKGUsIDApOwogICAgICAgICAgICAgICAgfSwgYS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4gPSBmdW5jdGlvbiBEdChlKSB7CiAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGNvbnNvbGUgJiYgY29uc29sZSAmJiBjb25zb2xlLndhcm4oJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbGUgPSBlKE9iamVjdC5mcmVlemUoewogICAgICAgICAgICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0JzogYQogICAgICAgICAgICAgICAgICAgIH0pKSwgZGUgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ICYmIHdpbmRvdy5Qcm9taXNlIHx8IHZvaWQgMCAhPT0gaiAmJiBqLlByb21pc2UgfHwgbGVbJ2RlZmF1bHQnXSB8fCBsZSwgZmUgPSBmdW5jdGlvbiAodSwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHMsIHQsIGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvID0gcy5kZWxheU5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBkZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHUocywgYywgW2NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBzLnRpbWVvdXQsIGkgPSBuZXcgZGUoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQobmV3IEVycm9yKCdBIHRpbWVvdXQgb2NjdXJyZWQgYmVjYXVzZSB0aGUgYWN0aW9uIHRvb2sgbG9uZ2VyIHRoYW4gJyArIHIgLyAxMDAwICsgJyBzZWNvbmRzIHRvIGNvbXBsZXRlLiAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGUucmFjZShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS50aGVuKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWydjYXRjaCddKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoYSksIGUgPSBuKGUpLCByKHMsIHQsIGUpLCBkZS5yZWplY3QoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHBlID0gZnVuY3Rpb24gKGMsIG4sIHIsIGksIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvLCB0LCBzLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGRlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYyhvLCBzLCBbc10pLCByID0gby50aW1lb3V0LCBpID0gbmV3IGRlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KG5ldyBFcnJvcignQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0b29rIGxvbmdlciB0aGFuICcgKyByIC8gMTAwMCArICcgc2Vjb25kcyB0byBjb21wbGV0ZS4gJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlLnJhY2UoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkudGhlbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KGEpLCBlID0gbihlKSwgaShvLCB0LCBlKSwgZGUucmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyVGltZW91dChhKSwgIXIobywgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShvLCB0KSwgZGUucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBnZSA9IGRlLnJlc29sdmUoKSwgbWUgPSBmdW5jdGlvbiAociwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmNvbmRpdGlvbnMgJiYgdC5jb25kaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZSA9IHIoZSwgdCwgbiwgZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQuYWN0aW9ucyAmJiB0LmFjdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlID0gaShlLCB0LCBuLCBnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZ2UgPSAoZ2UgPSBnZS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIGhlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZSAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnRoZW4pOwogICAgICAgICAgICAgICAgICAgIH0sIHZlID0gZnVuY3Rpb24gKG8sIHMsIGMsIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNvbmRpdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmNvbmRpdGlvbnMubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGUuY29uZGl0aW9uc1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbyhuLCB0LCBbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUnVsZSBjb21wb25lbnQgc2VxdWVuY2luZyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIHByb3BlcnR5IGZvciB0aGlzIGNvbmRpdGlvbiB0byBmdW5jdGlvbiBwcm9wZXJseS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcyhuLCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhuLCBlKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1KG4sIGUsIGEpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBiZSA9IGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbihlLCB0KSAmJiByKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHllID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4uZ2V0TW9kdWxlRGVmaW5pdGlvbihlLm1vZHVsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgdC5kaXNwbGF5TmFtZSB8fCBlLm1vZHVsZVBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgX2UgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5ydWxlLCBuID0gZS5ldmVudCwgciA9IGkuZ2V0TW9kdWxlRGVmaW5pdGlvbihuLm1vZHVsZVBhdGgpLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlOiBpLmdldE1vZHVsZUV4dGVuc2lvbk5hbWUobi5tb2R1bGVQYXRoKSArICcuJyArIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHQubmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgQ2UgPSBmdW5jdGlvbiAocywgYywgdSwgbCwgZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5ydWxlLCB0ID0gZS5ldmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0dGluZ3MgPSB0LnNldHRpbmdzIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyh0LCBudWxsLCBbZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmVycm9yKGwodCwgciwgbykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHhlID0gZnVuY3Rpb24gKGksIGEsIG8sIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmVycm9yKGkociwgdC5uYW1lLCBuKSksIHMoJ3J1bGVBY3Rpb25GYWlsZWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIGtlID0gZnVuY3Rpb24gKGksIGEsIG8sIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmVycm9yKGkociwgdC5uYW1lLCBuKSksIHMoJ3J1bGVDb25kaXRpb25GYWlsZWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIEVlID0gZnVuY3Rpb24gKHIsIGksIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmxvZygnQ29uZGl0aW9uICInICsgbiArICciIGZvciBydWxlICInICsgdC5uYW1lICsgJyIgd2FzIG5vdCBtZXQuJyksIGEoJ3J1bGVDb25kaXRpb25GYWlsZWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIEllID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxvZygnUnVsZSAiJyArIGUubmFtZSArICciIGZpcmVkLicpLCBuKCdydWxlQ29tcGxldGVkJywgeyBydWxlOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHdlID0gZnVuY3Rpb24gKGEsIG8sIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmFjdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmFjdGlvbnMubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGUuYWN0aW9uc1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEobiwgdCwgW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgbyhuLCBlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgRGUgPSBmdW5jdGlvbiAobiwgciwgaSwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoJ3J1bGVUcmlnZ2VyZWQnLCB7IHJ1bGU6IHQgfSksIG4gPyBpKHQsIGUpIDogcih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBBZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRmFpbGVkIHRvIGV4ZWN1dGUgIicgKyBlICsgJyIgZm9yICInICsgdCArICciIHJ1bGUuICcgKyBuLm1lc3NhZ2UgKyAobi5zdGFjayA/ICdcbicgKyBuLnN0YWNrIDogJycpOwogICAgICAgICAgICAgICAgICAgIH0sIFNlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgIWUubmVnYXRlIHx8ICF0ICYmIGUubmVnYXRlOwogICAgICAgICAgICAgICAgICAgIH0sIFRlID0gW10sIFBlID0gITEsIE9lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUGUgPyBlKCkgOiBUZS5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgIH0sIGplID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKE9lLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIFBlID0gITAsIFRlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIFRlID0gW107CiAgICAgICAgICAgICAgICAgICAgfSwgTGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSB8fCAoZSA9IG5ldyBFcnJvcignVGhlIGV4dGVuc2lvbiB0cmlnZ2VyZWQgYW4gZXJyb3IsIGJ1dCBubyBlcnJvciBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQuJykpLCAhKGUgaW5zdGFuY2VvZiBFcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ29iamVjdCcgPT0gdHlwZW9mIGUgPyBKU09OLnN0cmluZ2lmeShlKSA6IFN0cmluZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgRXJyb3IodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgTWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLCBWZSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksIFJlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSwgRmUgPSBnKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgbiwgciA9IHAoZSksIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluIHQgPSBPYmplY3QoYXJndW1lbnRzW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZS5jYWxsKHQsIGEpICYmIChyW2FdID0gdFthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gTWUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCBuLmxlbmd0aDsgbysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZS5jYWxsKHQsIG5bb10pICYmIChyW25bb11dID0gdFtuW29dXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfSwgTmUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmUodCA9IHQgfHwge30sIGUpLCB0Lmhhc093blByb3BlcnR5KCd0eXBlJykgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICd0eXBlJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uZGVwcmVjYXRpb24oJ0FjY2Vzc2luZyBldmVudC50eXBlIGluIEFkb2JlIExhdW5jaCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgc29vbi4gUGxlYXNlIHVzZSBldmVudC4kdHlwZSBpbnN0ZWFkLicpLCB0LiR0eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICB9LCBCZSA9IGZ1bmN0aW9uIChjLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4ubW9kdWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5rZXlzKHIpLCBhID0gMDsgYSA8IGkubGVuZ3RoOyBhKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gaVthXSwgcyA9IHJbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5zaGFyZWQgJiYgcy5uYW1lID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmdldE1vZHVsZUV4cG9ydHMobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBVZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGUodCkgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBxZSA9IGZ1bmN0aW9uIChuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNwbGljZSh0Lmxlbmd0aCAtIDEgfHwgMSwgMCwgJ21pbicpLCBlID0gdC5qb2luKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiArIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgemUgPSAnLmpzJywgSGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJzdHIoMCwgZS5sYXN0SW5kZXhPZignLycpKTsKICAgICAgICAgICAgICAgICAgICB9LCBXZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gZS5pbmRleE9mKHQsIGUubGVuZ3RoIC0gdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIH0sIEdlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgV2UodCwgemUpIHx8ICh0ICs9IHplKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnNwbGl0KCcvJyksIHIgPSBIZShlKS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmICcuJyAhPT0gZSAmJiAoJy4uJyA9PT0gZSA/IHIubGVuZ3RoICYmIHIucG9wKCkgOiByLnB1c2goZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgfSwgWWUgPSBkb2N1bWVudCwgWGUgPSBmdW5jdGlvbiAobiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGRlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgci5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBzY3JpcHQgJyArIG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIEtlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zcmMgPSBlLCB0LmFzeW5jID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gWGUoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHQpLCBuOwogICAgICAgICAgICAgICAgICAgIH0sIFFlID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgfHwgJyYnLCBuID0gbiB8fCAnPSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgZSB8fCAwID09PSBlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IC9cKy9nOwogICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5zcGxpdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICByICYmICdudW1iZXInID09IHR5cGVvZiByLm1heEtleXMgJiYgKG8gPSByLm1heEtleXMpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAwIDwgbyAmJiBvIDwgcyAmJiAocyA9IG8pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHM7ICsrYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUsIGwsIGQsIGYsIHAgPSBlW2NdLnJlcGxhY2UoYSwgJyUyMCcpLCBnID0gcC5pbmRleE9mKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8PSBnID8gKHUgPSBwLnN1YnN0cigwLCBnKSwgbCA9IHAuc3Vic3RyKGcgKyAxKSkgOiAodSA9IHAsIGwgPSAnJyksIGQgPSBkZWNvZGVVUklDb21wb25lbnQodSksIGYgPSBkZWNvZGVVUklDb21wb25lbnQobCksIG0oaSwgZCkgPyBBcnJheS5pc0FycmF5KGlbZF0pID8gaVtkXS5wdXNoKGYpIDogaVtkXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2RdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0gOiBpW2RdID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICB9LCAkZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gJ3RydWUnIDogJ2ZhbHNlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZShlKSA/IGUgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIEplID0gZnVuY3Rpb24gKG4sIHIsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSByIHx8ICcmJywgaSA9IGkgfHwgJz0nLCBudWxsID09PSBuICYmIChuID0gdW5kZWZpbmVkKSwgJ29iamVjdCcgPT0gdHlwZW9mIG4gPyBPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZW5jb2RlVVJJQ29tcG9uZW50KCRlKGUpKSArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShuW2VdKSA/IG5bZV0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgKyBlbmNvZGVVUklDb21wb25lbnQoJGUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihyKSA6IHQgKyBlbmNvZGVVUklDb21wb25lbnQoJGUobltlXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKHIpIDogZSA/IGVuY29kZVVSSUNvbXBvbmVudCgkZShlKSkgKyBpICsgZW5jb2RlVVJJQ29tcG9uZW50KCRlKG4pKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIH0sIFplID0gdChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmRlY29kZSA9IHQucGFyc2UgPSBRZSwgdC5lbmNvZGUgPSB0LnN0cmluZ2lmeSA9IEplOwogICAgICAgICAgICAgICAgICAgIH0pLCBldCA9ICdAYWRvYmUvcmVhY3Rvci0nLCB0dCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llOiBNLAogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudDogWWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdsb2FkLXNjcmlwdCc6IEtlLAogICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0LWFzc2lnbic6IEZlLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBkZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3F1ZXJ5LXN0cmluZyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAoZSA9IGUudHJpbSgpLnJlcGxhY2UoL15bPyMmXS8sICcnKSksIFplLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmUuc3RyaW5naWZ5KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3c6IFYKICAgICAgICAgICAgICAgICAgICB9LCBudCA9IGZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGUuaW5kZXhPZihldCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3Vic3RyKGV0Lmxlbmd0aCksIG4gPSB0dFt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZS5pbmRleE9mKCcuLycpIHx8IDAgPT09IGUuaW5kZXhPZignLi4vJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNvbHZlIG1vZHVsZSAiJyArIGUgKyAnIi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBydCA9IGZ1bmN0aW9uIChlLCBvLCBzLCBjLCB1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gZS5leHRlbnNpb25zLCBkID0gZS5idWlsZEluZm8sIGYgPSBlLnByb3BlcnR5LnNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBCZShsLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGwpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGxbcl0sIGUgPSBVZShjLCBpLnNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5tb2R1bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTy5jcmVhdGVQcmVmaXhlZExvZ2dlcihpLmRpc3BsYXlOYW1lKSwgbiA9IHFlKGkuaG9zdGVkTGliRmlsZXNCYXNlVXJsLCBkLm1pbmlmaWVkKSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEluZm86IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUVsZW1lbnRWYWx1ZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFeHRlbnNpb25TZXR0aW5nczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRIb3N0ZWRMaWJGaWxlVXJsOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoYXJlZE1vZHVsZTogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlTZXR0aW5nczogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlVG9rZW5zOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRGVidWdDaGFuZ2VkOiBzLm9uRGVidWdDaGFuZ2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBkZWJ1Z0VuYWJsZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLmdldERlYnVnRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGkubW9kdWxlcykuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpLm1vZHVsZXNbbl0sIHQgPSBudChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEdlKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5nZXRNb2R1bGVFeHBvcnRzKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5yZWdpc3Rlck1vZHVsZShuLCBlLCByLCB0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uaHlkcmF0ZUNhY2hlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgfSwgaXQgPSBmdW5jdGlvbiAoZSwgdCwgbiwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE8uY3JlYXRlUHJlZml4ZWRMb2dnZXIoJ0N1c3RvbSBTY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS50cmFjayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmxvZygnIicgKyBlICsgJyIgZG9lcyBub3QgbWF0Y2ggYW55IGRpcmVjdCBjYWxsIGlkZW50aWZpZXJzLicpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmdldFZpc2l0b3JJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnByb3BlcnR5ID0geyBuYW1lOiB0LnByb3BlcnR5Lm5hbWUgfSwgZS5jb21wYW55ID0gdC5jb21wYW55LCBlLmJ1aWxkSW5mbyA9IHQuYnVpbGRJbmZvLCBlLmxvZ2dlciA9IGEsIGUubm90aWZ5ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoTy5kZXByZWNhdGlvbignX3NhdGVsbGl0ZS5ub3RpZnkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgYF9zYXRlbGxpdGUubG9nZ2VyYCBBUEkuJyksIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmluZm8oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS53YXJuKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmdldFZhciA9IHIsIGUuc2V0VmFyID0gaSwgZS5zZXRDb29raWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnJywgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAociA9ICcsIHsgZXhwaXJlczogJyArIG4gKyAnIH0nLCBpLmV4cGlyZXMgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJ19zYXRlbGxpdGUuc2V0Q29va2llIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgX3NhdGVsbGl0ZS5jb29raWUuc2V0KCInICsgZSArICciLCAiJyArIHQgKyAnIicgKyByICsgJykuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uZGVwcmVjYXRpb24oYSksIE0uc2V0KGUsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnJlYWRDb29raWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uZGVwcmVjYXRpb24oJ19zYXRlbGxpdGUucmVhZENvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLmdldCgiJyArIGUgKyAnIikuJyksIE0uZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnJlbW92ZUNvb2tpZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmRlcHJlY2F0aW9uKCdfc2F0ZWxsaXRlLnJlbW92ZUNvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLnJlbW92ZSgiJyArIGUgKyAnIikuJyksIE0ucmVtb3ZlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmNvb2tpZSA9IE0sIGUucGFnZUJvdHRvbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5zZXREZWJ1ZyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCAnX2NvbnRhaW5lcicsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvIHx8IChPLndhcm4oJ19zYXRlbGxpdGUuX2NvbnRhaW5lciBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcuJyksIG8gPSAhMCksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGF0ID0gd2luZG93Ll9zYXRlbGxpdGU7CiAgICAgICAgICAgICAgICBpZiAoYXQgJiYgIXdpbmRvdy5fX3NhdGVsbGl0ZUxvYWRlZCkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX3NhdGVsbGl0ZUxvYWRlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgIHZhciBvdCA9IGF0LmNvbnRhaW5lcjsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgYXQuY29udGFpbmVyOwogICAgICAgICAgICAgICAgICAgIHZhciBzdCA9IG90LnByb3BlcnR5LnNldHRpbmdzLnVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSwgY3QgPSBvdC5wcm9wZXJ0eS5zZXR0aW5ncy5ydWxlQ29tcG9uZW50U2VxdWVuY2luZ0VuYWJsZWQsIHV0ID0gb3QuZGF0YUVsZW1lbnRzIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIFEubWlncmF0ZUNvb2tpZURhdGEodXQpOwogICAgICAgICAgICAgICAgICAgIHZhciBsdCwgZHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdCA9IGllKCksIHB0ID0gSihmdCwgZHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBzdCksIGd0ID0ge30sIG10ID0gY2UoZ3QpLCBodCA9IG5lKGd0LCBkdCksIHZ0ID0gdGUoZ3QsIGR0LCBwdCk7CiAgICAgICAgICAgICAgICAgICAgbHQgPSBzZShodCwgdnQsIHN0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgYnQgPSBiKEYoJ2xvY2FsU3RvcmFnZScpLCBPKTsKICAgICAgICAgICAgICAgICAgICBpdChhdCwgb3QsIGJ0LnNldERlYnVnRW5hYmxlZCwgdnQsIG10KSwgcnQob3QsIGZ0LCBidCwgbHQsIHB0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgeXQgPSBvZShhdCksIF90ID0gXyhmdCwgbHQpLCBDdCA9IHllKGZ0KSwgeHQgPSBFZShDdCwgTywgeXQpLCBrdCA9IGtlKEFlLCBDdCwgTywgeXQpLCBFdCA9IHhlKEFlLCBDdCwgTywgeXQpLCBJdCA9IEllKE8sIHl0KSwgd3QgPSBDZShEZShjdCwgYmUodmUoX3QsIFNlLCB4dCwga3QpLCB3ZShfdCwgRXQsIEl0KSksIG1lKHBlKF90LCBMZSwgU2UsIGt0LCB4dCksIGZlKF90LCBMZSwgRXQpLCBJdCksIHl0KSwgX3QsIE5lLCBBZSwgX2UoZnQpLCBPKTsKICAgICAgICAgICAgICAgICAgICBqZShoLCBvdC5ydWxlcyB8fCBbXSwgd3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGF0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnNvbGUud2FybignQWRvYmUgTGF1bmNoIGlzIHVuc3VwcG9ydGVkIGluIElFIDkgYW5kIGJlbG93LicpOwogICAgICAgIH0oKTsKICAgICAgICBfc2F0ZWxsaXRlID0gJF9fX3Zhcl8xMWM0YjcwYWQ3Y2U4Y2ZiOwogICAgfSgpKQp9"},{"name":"sugarcoat-launch-EN4bb51babc17241a383667e402e6cbd09","aliases":["sugarcoat-launch-EN4bb51babc17241a383667e402e6cbd09"],"kind":{"mime":"application/javascript"},"content":"dmFyIF9zYXRlbGxpdGU7CnsKICAgIGNvbnN0ICRfX19tb2NrX2JlYWNkZmNiN2JkYWI3MWEgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgeGhyVW5zZW50ID0gMDsKICAgICAgICBjb25zdCB4aHJPcGVuZWQgPSAxOwogICAgICAgIGNvbnN0IHhockhlYWRlcnNSZWNlaXZlZCA9IDI7CiAgICAgICAgY29uc3QgeGhyTG9hZGluZyA9IDM7CiAgICAgICAgY29uc3QgeGhyRG9uZSA9IDQ7CiAgICAgICAgY29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wgPSBTeW1ib2woJ2RlZmVycmVkSGFuZGxlJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZHN0YXJ0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Qcm9ncmVzc1N5bWJvbCA9IFN5bWJvbCgnb25wcm9ncmVzcycpOwogICAgICAgIGNvbnN0IHhock9uQWJvcnRTeW1ib2wgPSBTeW1ib2woJ29uYWJvcnQnKTsKICAgICAgICBjb25zdCB4aHJPbkVycm9yU3ltYm9sID0gU3ltYm9sKCdvbmVycm9yJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3ltYm9sID0gU3ltYm9sKCdvbmxvYWQnKTsKICAgICAgICBjb25zdCB4aHJPblRpbWVvdXRTeW1ib2wgPSBTeW1ib2woJ29udGltZW91dCcpOwogICAgICAgIGNvbnN0IHhock9uTG9hZEVuZFN5bWJvbCA9IFN5bWJvbCgnb25sb2FkZW5kJyk7CiAgICAgICAgY29uc3QgeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sID0gU3ltYm9sKCdvbnJlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICBjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sID0gU3ltYm9sKCdyZWFkeVN0YXRlJyk7CiAgICAgICAgY29uc3QgeGhyVGltZW91dFN5bWJvbCA9IFN5bWJvbCgndGltZW91dCcpOwogICAgICAgIGNvbnN0IHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCA9IFN5bWJvbCgnd2l0aENyZWRlbnRpYWxzJyk7CiAgICAgICAgY29uc3QgeGhyVXBsb2FkU3ltYm9sID0gU3ltYm9sKCd1cGxvYWQnKTsKICAgICAgICBjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2wgPSBTeW1ib2woJ3Jlc3BvbnNlVHlwZScpOwogICAgICAgIGNvbnN0IGRlZmluZUV2ZW50ID0gKG9iaiwgc3ltYm9sKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW1ib2wsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbc3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBjaGFuZ2VSZWFkeVN0YXRlID0gKHhociwgcmVhZHlTdGF0ZSkgPT4gewogICAgICAgICAgICB4aHJbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPSByZWFkeVN0YXRlOwogICAgICAgICAgICB4aHIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnKSk7CiAgICAgICAgfTsKICAgICAgICBsZXQgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgIGNsYXNzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkgJiYgISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3RhcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Qcm9ncmVzc1N5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkFib3J0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uRXJyb3JTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uVGltZW91dFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRFbmRTeW1ib2wpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmxvYWRzdGFydCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2Fkc3RhcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucHJvZ3Jlc3MoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25wcm9ncmVzcyh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmFib3J0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25BYm9ydFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uYWJvcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25BYm9ydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25lcnJvcigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmVycm9yKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uRXJyb3JTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9udGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9udGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZGVuZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ubG9hZGVuZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0VXBsb2FkLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNvbnN0IHhoclVwbG9hZCA9IG5ldyBYTUxIdHRwUmVxdWVzdFVwbG9hZCgpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhockRlZmVycmVkSGFuZGxlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclJlYWR5U3RhdGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclRpbWVvdXRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVXBsb2FkU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeGhyVXBsb2FkLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVzcG9uc2VUeXBlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbnJlYWR5c3RhdGVjaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnJlYWR5c3RhdGVjaGFuZ2UodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZWFkeVN0YXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlbihtZXRob2QsIHVybCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhock9wZW5lZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJUaW1lb3V0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB3aXRoQ3JlZGVudGlhbHMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB3aXRoQ3JlZGVudGlhbHModmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJVbnNlbnQ6CiAgICAgICAgICAgICAgICBjYXNlIHhock9wZW5lZDogewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwnd2l0aENyZWRlbnRpYWxzXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF0gPSAhIXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB1cGxvYWQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmQoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSA9PT0geGhyT3BlbmVkICYmIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhockRvbmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlIFwnc2VuZFwnIG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIG9iamVjdFwncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhYm9ydCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0pOwogICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhoclVuc2VudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCdhYm9ydCcpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVVJMKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgc3RhdHVzVGV4dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlKG1pbWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUeXBlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgcmVzcG9uc2VUeXBlKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gc2V0IHRoZSBcJ3Jlc3BvbnNlVHlwZVwnIHByb3BlcnR5IG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0XCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgY2FzZSAnYXJyYXlidWZmZXInOgogICAgICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6CiAgICAgICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlKCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyAnJyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICcnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhZCB0aGUgXCdyZXNwb25zZVRleHRcJyBwcm9wZXJ0eSBmcm9tIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0XCdzIFwncmVzcG9uc2VUeXBlXCcgaXMgXCdcJyBvciBcJ3RleHRcJyAod2FzIFwnYXJyYXlidWZmZXJcJykuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlWE1MKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnVU5TRU5UJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyVW5zZW50CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnT1BFTkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyT3BlbmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnSEVBREVSU19SRUNFSVZFRCcsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockhlYWRlcnNSZWNlaXZlZAogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwgJ0xPQURJTkcnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJMb2FkaW5nCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnRE9ORScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockRvbmUKICAgICAgICB9KTsKICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdCwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgfSkoJF9fX21vY2tfYmVhY2RmY2I3YmRhYjcxYSk7CiAgICBjb25zdCAkX19fbW9ja19lOTZlZjBkOTYxOWU2OGMyID0ge307CiAgICAoZXhwb3J0cyA9PiB7CiAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgIGxldCBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgIGNsYXNzIFN0b3JhZ2UgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgbGVuZ3RoKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBrZXkoaW5kZXgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBrZXlzW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRJdGVtKGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBrZXkpID8gdGhpc1trZXldIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IFN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlSXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFN0b3JhZ2UsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMubG9jYWxTdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLnNlc3Npb25TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgfSkoJF9fX21vY2tfZTk2ZWYwZDk2MTllNjhjMik7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge307CiAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlLmNvbnRhaW5lciA9IHsKICAgICAgICAgICAgICAgICdidWlsZEluZm8nOiB7CiAgICAgICAgICAgICAgICAgICAgJ2J1aWxkRGF0ZSc6ICcyMDIxLTA2LTExVDE1OjMzOjM1WicsCiAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50JzogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICd0dXJiaW5lQnVpbGREYXRlJzogJzIwMjEtMDQtMjZUMTY6NTQ6MjhaJywKICAgICAgICAgICAgICAgICAgICAndHVyYmluZVZlcnNpb24nOiAnMjcuMS4zJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdkYXRhRWxlbWVudHMnOiB7CiAgICAgICAgICAgICAgICAgICAgJ09yZGVyIElkICh3YngpJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ1tubyBvcmRlcklkXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3BhdGgnOiAnb3JkZXJJZCcgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3B1cmNoYXNlZF9iaWxsaW5nX21vZGUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NsZWFuVGV4dCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZHVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gc3BhcmtfZGF0YS5wcm9kdWN0X25hbWVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiaWxsID0gL2FubnVhbHxtb250aGx5L2kuZXhlYyhwcm9kdWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmlsbFswXSA/IGJpbGxbMF0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0RSIFNob3BwaW5nIENhcnQgLSBPcmRlciBUb3RhbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcwLjAnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdwYXRoJzogJ3NwYXJrX2RhdGEub3JkZXJfdG90YWwnIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdnZW9MYW5ndWFnZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdlbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZUxvd2VyQ2FzZSc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eCwgYXQsIGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCd1c2VyX2xhbmcnKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCdsYW5nJykuc3BsaXQoJ18nKVswXSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gc3BhcmtfZGF0YS5zaXRlX3JlZ2lvbi5zcGxpdCgnXycpWzBdIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyLmxlbmd0aCA+IDAgPyBkciA6IGF0Lmxlbmd0aCA+IDAgPyBhdCA6IHd4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnUHJvbW8gQ29kZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyT2JqLnByb21vdGlvbkNvZGUgIT0gJycgJiYgdXNlck9iai5wcm9tb3Rpb25Db2RlICE9ICdOb1Byb21vJyAmJiB1c2VyT2JqLnByb21vdGlvbkNvZGUgIT0gJ1BST01PX0NBTkNFTExFRCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21vQ29kZSA9IGNoYW5nZU9yZGVyQmVhbi5wcm9tb0NvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkLmNvb2tpZSgncHJvbW9fY29kZScpICYmIHVzZXJPYmoucHJvbW90aW9uQ29kZSA9PSAnTm9Qcm9tbycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21vQ29kZSA9ICQuY29va2llKCdwcm9tb19jb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21vQ29kZSA9ICdOb1Byb21vdGlvbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9tb0NvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdUcmlhbCBGbGFnJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ2VtcHR5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdzZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jb29raWUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICduYW1lJzogJ1RyaWFsRmxhZycgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2N1cnJlbnREaXNwbGF5TmFtZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdbZW1wdHldJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdjdXJyZW50RGlzcGxheU5hbWUnIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdkX3ByZWZpeCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmVmaXggPSAnd3gnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdDdXJyZW50IFBhZ2UgTmFtZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdbbmFdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdzLnBhZ2VOYW1lJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnZnJlZWN0YSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0X2J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dieC1oZWFkZXItbWVudScpWzBdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3dieC1oZWFkZXItdHJ5LWl0LWZyZWUnKVswXS50ZXh0Q29udGVudC50cmltKCksIHZhbGlkVHh0S2V5MSA9IC9pbml6aWEgZ3JhdHVpdGFtZW50ZXxzdGFydCBmb3IgZnJlZXxjb21pZW5jZSBkZSBtYW5lcmEgZ3JhdHVpdGF8RXNzYXlleiBNZWV0aW5ncyBncmF0dWl0ZW1lbnR854Sh5paZ44Gn6Kmm44GZL2k7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRUeHRLZXkyID0gL2luaXppYSBncmF0dWl0YW1lbnRlfHRyeSB0ZWFtcyBmcmVlfGNvbWllbmNlIGRlIG1hbmVyYSBncmF0dWl0YXxFc3NheWV6IFRlYW1zIGdyYXR1aXRlbWVudC9pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFR4dEtleTEudGVzdChzdF9idG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdF9idG4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHZhbGlkVHh0S2V5MSwgJ3N0YXJ0IGZvciBmcmVlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZFR4dEtleTIudGVzdChzdF9idG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdF9idG4udG9Mb3dlckNhc2UoKS5yZXBsYWNlKHZhbGlkVHh0S2V5MiwgJ3RyeSB0ZWFtcyBmcmVlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0X2J0bjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdSZWZlcnJlcjogZnVsbCBVUkwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnW25vIHJlZmVycmVyIGF2YWlsYWJsZV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzQmxhbmsoc3RyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhc3RyIHx8IC9eXHMqJC8udGVzdChzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmVVJMID0gZG9jdW1lbnQucmVmZXJyZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vUmVmVVJMID0gJ1tubyByZWZlcnJlcl0nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0JsYW5rKHJlZlVSTCkgPyBub1JlZlVSTCA6IHJlZlVSTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3Bfbic6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGVhbk5hbWUgPSBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXC4oaHRtfHBocHxhc3B4KS4qLywgJycpLnJlcGxhY2UoLyhcP3wjKS4qLywgJycpLnJlcGxhY2UoL1wvKyQvLCAnJykucmVwbGFjZSgvXC9pbmRleCQvaSwgJycpLnJlcGxhY2UoL15cLyhicnxkZXxlc3xmcnxoa3xpdHxqYXxrb3xwdHx6aClcLy9pLCAnLycpLnJlcGxhY2UoL1wvKy9nLCAnOicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMgfHwgJzpob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5OYW1lKGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnU3lzdGVtRG93biBFcnJvciBDb2RlIFZhbHVlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ1tubyBlcnJvciBjb2RlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2RvbUF0dHJpYnV0ZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50UHJvcGVydHknOiAndGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJ2RpdltlcnJvckNvZGVWYWx1ZV0nCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdEUiBTaG9wcGluZyBDYXJ0IC0gT3JkZXIgQ3VycmVuY3knOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdzcGFya19kYXRhLm9yZGVyX2N1cnJlbmN5JyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAncGFnZU5hbWUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdzLnBhZ2VOYW1lJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgcHVyY2hhc2UgY29uZmlybWF0aW9uIHBhZ2UgaXMgY2hhbmdlIG9yZGVyJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkaXZbY2xhc3MqPSJjaGFuZ2VPcmRlciJdJykgIT09IG51bGwgPyAndHJ1ZScgOiAnZmFsc2UnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnY2RfcCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5VUkwuaW5kZXhPZignLmNvbS4nKSA+IC0xIHx8IGRvY3VtZW50LlVSTC5pbmRleE9mKCcuY28uJykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnMic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgU2hvcHBpbmcgQ2FydCAtIFByb2R1Y3QgSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdzcGFya19kYXRhLnByb2R1Y3RfaWQnIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdTaWduVXAgRXJyb3IgQ29va2llJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ1tlcnJvciBjb29raWUgbm90IGRlZmluZWRdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY29va2llLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnbmFtZSc6ICdzdGVwJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnTWFyaW4gVHJhY2tpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnRW1wdHknLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ21zaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nhc2VJbnNlbnNpdGl2ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2NrX2Z0Yyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VMb3dlckNhc2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJfbG9jYWxlID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCd1c2VyX2xvY2FsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyX2xvY2FsZSA9PSAnJyB8fCB1c2VyX2xvY2FsZSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5DQVJUX0xPQ0FMRSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLkNBUlRfTE9DQUxFLnJlcGxhY2UoJyInLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlcl9sb2NhbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAncHJvZC10eXBlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZUxvd2VyQ2FzZSc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuVVJMLmluZGV4T2YoJ3ByaWNpbmcvY2FydC5odG1sJykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgnLnByb2R1Y3QtdHlwZSAuc2VsZWN0LXNlbGVjdGVkJykudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnREcgQ2hhbm5lbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VMb3dlckNhc2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuZ2V0VmFyKCdkZy1jaGFubmVsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdkci1vcmRlclR5cGUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNwYXJrX2RhdGEucGxhbl9vbGQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnY2hhbmdlIG9yZGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RpcmVjdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnR28gUmVkaXJlY3QgSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnRW1wdHknLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2dvaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nhc2VJbnNlbnNpdGl2ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3V0bV9jaGFubmVsJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICd1dG1fY2hhbm5lbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgU2hvcHBpbmcgQ2FydCAtIE9yZGVyIElEJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3BhdGgnOiAnc3BhcmtfZGF0YS5vcmRlcl9pZCcgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0RSIFNob3BwaW5nIENhcnQgLSBTZXJ2ZXIgRXJyb3IgTnVtYmVyJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlcnZlckVycm9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnZHJfZXJyb3InKVswXS5jaGlsZHJlblsyXS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdsYXN0X29yZGVyX3RvdGFsJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJzAuMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2xvY2FsU3RvcmFnZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ25hbWUnOiAnbGFzdF9vcmRlcl90b3RhbCcgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2dlb0N1cnJlbmN5JzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ3VzZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eCwgYXQsIGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCd1c2VyX2N1cnJlbmN5JykgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCA9IF9zYXRlbGxpdGUuY29va2llLmdldCgnY3VycmVuY3knKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gc3BhcmtfZGF0YS5zaXRlX2N1cnJlbmN5IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyLmxlbmd0aCA+IDAgPyBkci50b1VwcGVyQ2FzZSgpIDogYXQubGVuZ3RoID4gMCA/IGF0LnRvVXBwZXJDYXNlKCkgOiB3eC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAndXRtX3NvdXJjZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndXRtX3NvdXJjZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnZnQtc2l0ZS11cmwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdzVVJMJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXNlSW5zZW5zaXRpdmUnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdyc191cCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICd1dG1fbWVkaXVtJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICd1dG1fbWVkaXVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXNlSW5zZW5zaXRpdmUnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICd1dG1fY2FtcGFpZ24nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3V0bV9jYW1wYWlnbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnY2FydC1hZGQtb24nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsbC1tZS1kb21lc3RpYycpLmNoZWNrZWQgPT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NhbGwtbWUtZG9tZXN0aWMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGwtbWUtaW50ZXInKS5jaGVja2VkID09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjYWxsLW1lLWludGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdmdC1zaXRlLXVybC1zJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2Z0LXNpdGUtdXJsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3QgPSBndC5zdWJzdHJpbmcoMCwgMjApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBndDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0RSIFNob3BwaW5nIENhcnQgLSBVcGRhdGVkIFN1YnNjcmlwdGlvbiBRdWFudGl0eSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cGRhdGVkU3VicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2RyX3Byb2R1Y3ROYW1lIGRyX2Z1dHVyZVN1YlJlbmV3YWxTdGF0ZVBsYW4nKVswXS5jaGlsZHJlblswXS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN1YnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdja192bCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3Zpc2l0b3InLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2Nvb2tpZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ25hbWUnOiAnY2hrbycgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0ludGVybmFsIFNlYXJjaCBLZXl3b3JkJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05BJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdxdWVyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgU2hvcHBpbmcgQ2FydCAtIFBhZ2UgVHlwZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdwYXRoJzogJ3NwYXJrX2RhdGEucGFnZV90eXBlJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnZHItY24nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAncGF0aCc6ICdzcGFya19kYXRhLnNpdGVfY291bnRyeScgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2JpbGwtY3ljbGUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuVVJMLmluZGV4T2YoJ3ByaWNpbmcvY2FydC5odG1sJykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJCgnLnByb2QtY3ljbGUgLnNlbGVjdC1zZWxlY3RlZCcpLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ25vbmNlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RlZmF1bHQtc3JjIFwnc2VsZlwnIFwndW5zYWZlLWlubGluZVwnICouYWRvYmVkdG0uY29tICoub210cmRjLm5ldDsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnU0VNSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnRW1wdHknLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3NlbWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXNlSW5zZW5zaXRpdmUnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdwcm9tby1jb2RlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05vIFByb21vdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2Nvb2tpZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ25hbWUnOiAncHJvbW9fY29kZScgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3Byb2QtbGljZW4nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5VUkwuaW5kZXhPZigncHJpY2luZy9jYXJ0Lmh0bWwnKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKCcucHJvZC1saWNlbnNlIC5zZWxlY3Qtc2VsZWN0ZWQnKS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdnZW9Db3VudHJ5JzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZUxvd2VyQ2FzZSc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3eCwgYXQsIGRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCd1c2VyX2xvY2FsZScpIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3ggPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgPSBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQucmVhZENvb2tpZSgnbGFuZycpLnNwbGl0KCdfJylbMV0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IHNwYXJrX2RhdGEuc2l0ZV9jb3VudHJ5IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyLmxlbmd0aCA+IDAgPyBkciA6IGF0Lmxlbmd0aCA+IDAgPyBhdCA6IHd4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnTUMtU3BhcmsgRnJlZSBUcmlhbCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jb29raWUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICduYW1lJzogJ21jLXNwYXJrLWZ0JyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgUHJvbW8gQ29kZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9tb2NvZGUgPSAkKCcjcHJvbW9Db2RlJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21vY29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ09mZmVyIFR5cGUgRmxhZyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICd1bmRlZmluZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jb29raWUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICduYW1lJzogJ29mZmVyRmxhZycgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0ZUIENvdW50cnknOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnY2hvb3NlIHlvdXIgY291bnRyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZUxvd2VyQ2FzZSc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LlVSTC5pbmRleE9mKCdwcmljaW5nL3NpZ251cC5odG1sJykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3NhbWUtYXMtc2VsZWN0ZWQnKVswXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdzYW1lLWFzLXNlbGVjdGVkJylbMF0uZ2V0QXR0cmlidXRlKCdkYXRhLXZhbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnc2NyZWVuX2hlaWdodCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NsZWFuVGV4dCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB3aW5kb3cuc2NyZWVuLmhlaWdodCB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3NjcmVlbl93aWR0aCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NsZWFuVGV4dCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB3aW5kb3cuc2NyZWVuLndpZHRoIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAndmlld3BvcnRfd2lkdGgnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JjZUxvd2VyQ2FzZSc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhblRleHQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gd2luZG93LmlubmVyV2lkdGggfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdDb3VudHJ5Q29kZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNfcGFyc2VVcmkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBhcmd1bWVudHNbMF0gKyAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5ocmVmID0gYS5oYXNoID0gYS5ob3N0ID0gYS5ob3N0bmFtZSA9IGEucGF0aG5hbWUgPSBhLnBvcnQgPSBhLnByb3RvY29sID0gYS5zZWFyY2ggPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgnaHJlZicsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISgnaW5kZXhPZicgaW4gQXJyYXkucHJvdG90eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIChmaW5kLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gdGhpcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdGhpcy5sZW5ndGg7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgaW4gdGhpcyAmJiB0aGlzW2ldID09PSBmaW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZFVSTHModCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgdSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogd2luZG93LmxvY2F0aW9uLmhyZWYsIHYgPSBzX3BhcnNlVXJpKHUpLmhvc3RuYW1lICsgc19wYXJzZVVyaSh1KS5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5pbmRleE9mKHRbaV0uc2l0ZSkgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWRUZXN0ID0gJ3dlYmV4dGVzdCcsIHJzdWl0cyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy9VUy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4dWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICd1cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy9HQi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4dWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdHQlAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICd1aycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy9GUi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4ZnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdFVVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdmcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy9ERS8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdFVVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdkZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy9FUy8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4ZXNwYW5hJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnRVVSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnZXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcvQ0EvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleGNhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnY2EnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcvSVQvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleGl0YWx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnRVVSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnaXQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcvTkwvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleHVrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnR0JQJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnbmwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICd3ZWJleC5jb20uYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4YnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdCUkwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdicicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ3dlYmV4LmNvbS5jbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhjaGluYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0NOWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2NuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnd2ViZXguY29tLmhrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleGhvbmdrb25nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnSEtEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnaGsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICd3ZWJleC5jby5pbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhpbmRpYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0lOUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2luJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnd2ViZXguY28ua3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4c2tvcmVhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnS1JXJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAna3InCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICd3ZWJleC5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhpdGFseScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0VVUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2l0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnd2ViZXguY28uanAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4amFwYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdKUFknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdqcCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ3dlYmV4LmNvbS5teCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhsYXRhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ214JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnd2ViZXguY28udWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4dWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdHQlAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICd1aycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ215LnVrLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXh1aycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0dCUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ3VrJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnd2ViZXguY2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4Y2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdDQUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdjYScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ215dHJpYWwud2ViZXguY29tL3VrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleHVrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnR0JQJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAndWsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICdteXRyaWFsLndlYmV4LmNvbS9mcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhmcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0VVUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2ZyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnbXl0cmlhbC53ZWJleC5jb20vZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4ZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdFVVInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdkZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ215dHJpYWwud2ViZXguY29tL2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleGVzcGFuYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0VVUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2VzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnbXl0cmlhbC53ZWJleC5jb20vaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4aW5kaWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdJTlInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICdpbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ215dHJpYWwud2ViZXguY29tL2pwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleGphcGFuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnSlBZJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnanAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICdteXRyaWFsLndlYmV4LmNvbS9hdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhhdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ0FVRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ2F1JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnLndlYmV4LmNvbS9jaXNjb3NwYXJrLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXhzcXVhcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAndXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICdqYWJiZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNpZDogJ3dlYmV4dXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY286ICd1cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ3Bvc3RwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzaWQ6ICd3ZWJleHVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAndXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICdjaXNjbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXh1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ3VzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnLndlYmV4LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc2lkOiAnd2ViZXh1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYzogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJ3VzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNvZGVUID0gZmluZFVSTHMocnN1aXRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyeUNvZGVULmNvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAndmlld3BvcnRfaGVpZ2h0JzogewogICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VMb3dlckNhc2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnY2xlYW5UZXh0JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ051bWJlciBvZiBTZWFyY2ggUmVzdWx0cyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdObyBSZXN1bHRzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvZG9tQXR0cmlidXRlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRQcm9wZXJ0eSc6ICd0ZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLnRvdGFsLXJlc3VsdHMnCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdzLlByb2R1Y3QnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnW25hXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdieFByb2R1Y3QgPSBwcm9kdWN0U2t1VFAgKyAnO2V2ZW50MTY9JyArIGJvb2tpbmdWYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdieFByb2R1Y3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdjb29raWVEb21haW4nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcmNlTG93ZXJDYXNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llRG9tYWluID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4LmNvbSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4LmF1J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguYnInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd3ZWJleC5jYSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4LmNvLmluJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY28uaXQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd3ZWJleC5jby5qcCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4LmNvLmtyJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY29tLmF1J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY29tLmJyJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY29tLmNuJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY29tLmhrJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY29tLm14J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguY28udWsnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd3ZWJleC5kZSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4LmVzJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnd2ViZXguZnInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyd3ZWJleC5pdCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ3dlYmV4Lm14J10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVEb21haW5WYWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb29raWVEb21haW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY29va2llRG9tYWluW2ldWzBdLnRvTG93ZXJDYXNlKCkpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZURvbWFpblZhbHVlID0gY29va2llRG9tYWluW2ldWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWVEb21haW5WYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ3NsX2NuJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mICQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxDb3VudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsQ291bnRyeSA9ICQoJy53YngtcmVnaW9uLW5hbWUnKS50ZXh0KCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VsQ291bnRyeSA9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbENvdW50cnkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0RSIFNob3BwaW5nIENhcnQgLSBDb25maXJtYXRpb24gUHJvZHVjdHMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJhY2tQcm9kdWN0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIxID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IHNwYXJrX2RhdGEucHJvZHVjdF9uYW1lLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJrX2RhdGEucHJvZHVjdF9uYW1lW2ldLmluZGV4T2YoJ0FubnVhbCcpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib29rQW1vdW50ID0gc3BhcmtfZGF0YS5wcm9kdWN0X3VuaXRfcHJpY2VbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9wcm9tb1NhbGVzID0gc3BhcmtfZGF0YS5wcm9kdWN0X2xpc3RfcHJpY2VbaV0gKiBzcGFya19kYXRhLnByb2R1Y3RfcXVhbnRpdHlbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYm9va0Ftb3VudCA9IHNwYXJrX2RhdGEucHJvZHVjdF91bml0X3ByaWNlW2ldICogMTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9wcm9tb1NhbGVzID0gc3BhcmtfZGF0YS5wcm9kdWN0X2xpc3RfcHJpY2VbaV0gKiBzcGFya19kYXRhLnByb2R1Y3RfcXVhbnRpdHlbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIxICs9ICc7JyArIHNwYXJrX2RhdGEucHJvZHVjdF9uYW1lW2ldICsgJzsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIxICs9IHNwYXJrX2RhdGEucHJvZHVjdF9xdWFudGl0eVtpXSArICc7JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMSArPSBzcGFya19kYXRhLnByb2R1Y3RfdW5pdF9wcmljZVtpXSArICc7JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMSArPSAnZXZlbnQxNj0nICsgYm9va0Ftb3VudCArICd8JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMSArPSAnZXZlbnQxMDE9JyArIHNwYXJrX2RhdGEucHJvZHVjdF91bml0X3ByaWNlW2ldICsgJ3wnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIxICs9ICdldmVudDEwMj0nICsgbm9wcm9tb1NhbGVzICsgJzsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1Byb2R1Y3RzLnB1c2goc3RyMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFja1Byb2R1Y3RzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnV2ViZXggT2ZmZXIgVHlwZSBGbGFnJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ3VuZGVmaW5lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2Nvb2tpZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ25hbWUnOiAnd2J4b2ZmZXJGbGFnJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnTUMtU3BhcmsgUHVyY2hhc2UnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY29va2llLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnbmFtZSc6ICdtYy1zcGFyaycgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ1RyYWNrIElEJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ0VtcHR5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdUcmFja0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXNlSW5zZW5zaXRpdmUnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdBZHdvcmRzIGdjbGlkJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ1t1bmRlZmluZWRdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY29va2llLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnbmFtZSc6ICdnY2xpZCcgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ1RyYWNrSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnW25hXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnbmFtZSc6ICdUcmFja0lEJyB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnc191cmwnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc192YWwsIGd0X3ZhbCA9IGRvY3VtZW50LlVSTC5yZXBsYWNlKCdodHRwczonLCAnJykucmVwbGFjZSgvZnRfZS4kLywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChndF92YWwuaW5kZXhPZignd3d3LndlYmV4LmNvbS9wcmljaW5nL2NhcnQuaHRtbD90b2tlbj0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfdmFsID0gZ3RfdmFsLnN1YnN0cigwLCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3RfdmFsLmluZGV4T2YoJ3d3dy53ZWJleC5jb20vcHJpY2luZy9idXkvYWNjb3VudC1jcmVhdGUnKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfdmFsID0gZ3RfdmFsLnN1YnN0cigwLCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfdmFsID0gZ3RfdmFsLnN1YnN0cigwLCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc192YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdPcmRlciBCb29raW5nIFZhbHVlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYWNrUHJvZHVjdHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gc3BhcmtfZGF0YS5wcm9kdWN0X25hbWUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhcmtfZGF0YS5wcm9kdWN0X25hbWVbaV0uaW5kZXhPZignQW5udWFsJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvb2tBbW91bnQgPSBzcGFya19kYXRhLnByb2R1Y3RfdW5pdF9wcmljZVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3Byb21vU2FsZXMgPSBzcGFya19kYXRhLnByb2R1Y3RfbGlzdF9wcmljZVtpXSAqIHNwYXJrX2RhdGEucHJvZHVjdF9xdWFudGl0eVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib29rQW1vdW50ID0gc3BhcmtfZGF0YS5wcm9kdWN0X3VuaXRfcHJpY2VbaV0gKiAxMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3Byb21vU2FsZXMgPSBzcGFya19kYXRhLnByb2R1Y3RfbGlzdF9wcmljZVtpXSAqIHNwYXJrX2RhdGEucHJvZHVjdF9xdWFudGl0eVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9va0Ftb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdMYW5ndWFnZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdFbXB0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnbGFuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnUmVmZXJyZXInOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnW25vIHJlZmVycmVyIGF2YWlsYWJsZV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzQmxhbmsoc3RyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhc3RyIHx8IC9eXHMqJC8udGVzdChzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVmVVJMID0gZG9jdW1lbnQucmVmZXJyZXIuc3BsaXQoJz8nKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9SZWZVUkwgPSAnW25vIHJlZmVycmVyXSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmxhbmsocmVmVVJMKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9SZWZVUkw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZlVSTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdidXkgY291bnRyeSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VMb3dlckNhc2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnY2xlYW5UZXh0JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3gsIGF0LCBkcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eCA9IF9zYXRlbGxpdGUuY29va2llLmdldCgnYnV5X2NvdW50cnknKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCdsYW5nJykuc3BsaXQoJ18nKVsxXSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gc3BhcmtfZGF0YS5zaXRlX2NvdW50cnkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHIubGVuZ3RoID4gMCA/IGRyIDogYXQubGVuZ3RoID4gMCA/IGF0IDogd3g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdwX3ZsJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LlVSTC5pbmRleE9mKCdjYXJ0LndlYmV4LmNvbScpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd3eDpmcmVlLXRyaWFsJyArIF9zYXRlbGxpdGUuZ2V0VmFyKCdwX24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3d4JyArIF9zYXRlbGxpdGUuZ2V0VmFyKCdwX24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdEUiBTaG9wcGluZyBDYXJ0IC0gUHJvZHVjdCBRdWFudGl0eSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdwYXRoJzogJ3NwYXJrX2RhdGEucHJvZHVjdF9xdWFudGl0eScgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ0RSIFNob3BwaW5nIENhcnQgLSBQYXltZW50IE1vZGFsaXR5JzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdFZhbHVlJzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3BhdGgnOiAnc3BhcmtfZGF0YS5wYXltZW50X21ldGhvZCcgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRMYW5ndWFnZSc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZm9yY2VMb3dlckNhc2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAnY2xlYW5UZXh0JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd3gsIGF0LCBkcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3eCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ21ldGFbbmFtZT1cJ2xhbmd1YWdlXCddJylbMF0uY29udGVudCB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd4ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCdsYW5nJykuc3BsaXQoJ18nKVswXSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gc3BhcmtfZGF0YS5zaXRlX3JlZ2lvbi5zcGxpdCgnXycpWzBdIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyLmxlbmd0aCA+IDAgPyBkciA6IGF0Lmxlbmd0aCA+IDAgPyBhdCA6IHd4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnRFIgU2hvcHBpbmcgQ2FydCAtIFNlbGVjdGlvbiBQcm9kdWN0cyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdbbmFdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JhZ2VEdXJhdGlvbic6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJhY2tQcm9kdWN0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIxID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxlbiA9IHNwYXJrX2RhdGEucHJvZHVjdF9uYW1lLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIxICs9ICc7JyArIHNwYXJrX2RhdGEucHJvZHVjdF9uYW1lW2ldICsgJzsnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1Byb2R1Y3RzLnB1c2goc3RyMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFja1Byb2R1Y3RzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnUHVyY2hhc2UgSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0VmFsdWUnOiAnW25hXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlRHVyYXRpb24nOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3BhdGgnOiAnd2luZG93Lm9yZGVySUQnIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICdEUiBTaG9wcGluZyBDYXJ0IC0gUGFpZCBTdWJzY3JpcHRpb24gRGV0YWlscyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZUR1cmF0aW9uJzogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdleHRlbnNpb25zJzogewogICAgICAgICAgICAgICAgICAgICdjb3JlJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnQ29yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2phdmFzY3JpcHQtdmFyaWFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdKYXZhU2NyaXB0IFZhcmlhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRPYmplY3RQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvZ2V0T2JqZWN0UHJvcGVydHkuanMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPYmplY3RQcm9wZXJ0eSh3aW5kb3csIHNldHRpbmdzLnBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2N1c3RvbS1jb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnQ3VzdG9tIENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Muc291cmNlKGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY29va2llLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ0Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29va2llID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3ItY29va2llJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29va2llLmdldChzZXR0aW5ncy5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvZG9tQXR0cmlidXRlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2RvbS1hdHRyaWJ1dGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdET00gQXR0cmlidXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2V0dGluZ3MuZWxlbWVudFNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gc2V0dGluZ3MuZWxlbWVudFByb3BlcnR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW4gZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFtwcm9wZXJ0eV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncXVlcnktc3RyaW5nLXBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ1F1ZXJ5IFN0cmluZyBQYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbmRvdyA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1xdWVyeS1zdHJpbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IHF1ZXJ5U3RyaW5nLnBhcnNlKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmNhc2VJbnNlbnNpdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb3dlckNhc2VOYW1lID0gc2V0dGluZ3MubmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS50b0xvd2VyQ2FzZSgpID09PSBsb3dlckNhc2VOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXNba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1zW3NldHRpbmdzLm5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9sb2NhbFN0b3JhZ2UuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnbG9jYWwtc3RvcmFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ0xvY2FsIFN0b3JhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbmRvdyA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHNldHRpbmdzLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3BhZ2UtYm90dG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnUGFnZSBCb3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VMaWZlY3ljbGVFdmVudHMgPSByZXF1aXJlKCcuL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncywgdHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxpZmVjeWNsZUV2ZW50cy5yZWdpc3RlclBhZ2VCb3R0b21UcmlnZ2VyKHRyaWdnZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2RvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ0RvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hPcGVyYXRvcnNSZWdleCA9IC9bfFxce30oKVtcXV4kKyo/Li1dL2c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlc2NhcGVGb3JSZWdleCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgc3RyaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UobWF0Y2hPcGVyYXRvcnNSZWdleCwgJ1xcJCYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21haW4gPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5kb21haW5zLnNvbWUoZnVuY3Rpb24gKGFjY2VwdGFibGVEb21haW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9tYWluLm1hdGNoKG5ldyBSZWdFeHAoJyhefFxcLiknICsgZXNjYXBlRm9yUmVnZXgoYWNjZXB0YWJsZURvbWFpbikgKyAnJCcsICdpJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncGF0aC1hbmQtcXVlcnlzdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdQYXRoIEFuZCBRdWVyeSBTdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRNYXRjaCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvdGV4dE1hdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lICsgZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldHRpbmdzLnBhdGhzLnNvbWUoZnVuY3Rpb24gKGFjY2VwdGFibGVQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdGFibGVWYWx1ZSA9IGFjY2VwdGFibGVQYXRoLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoYWNjZXB0YWJsZVBhdGgudmFsdWUsICdpJykgOiBhY2NlcHRhYmxlUGF0aC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dE1hdGNoKHBhdGgsIGFjY2VwdGFibGVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnY3VzdG9tLWNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdDdXN0b20gQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlQ29kZSA9IHJlcXVpcmUoJy4vaGVscGVycy9kZWNvcmF0ZUNvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRDb2RlU2VxdWVudGlhbGx5ID0gcmVxdWlyZSgnLi9oZWxwZXJzL2xvYWRDb2RlU2VxdWVudGlhbGx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwb3N0c2NyaWJlID0gcmVxdWlyZSgnLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3Bvc3RzY3JpYmUvZGlzdC9wb3N0c2NyaWJlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1bmVzY2FwZUhUTUxFbnRpdGllcyA9IHJlcXVpcmUoJy4vaGVscGVycy91bmVzY2FwZUh0bWxDb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjc3BOb25jZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvc3RzY3JpYmVXcml0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3cml0ZSA9IGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0c2NyaWJlKGRvY3VtZW50LmJvZHksIHNvdXJjZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVXcml0ZVRva2VuOiBmdW5jdGlvbiAodG9rZW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWdOYW1lID0gdG9rZW4udGFnTmFtZSAmJiB0b2tlbi50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3NwTm9uY2UgJiYgdGFnTmFtZSA9PT0gJ3NjcmlwdCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5hdHRycy5ub25jZSA9IGNzcE5vbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgPT09ICdzY3JpcHQnIHx8IHRhZ05hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0b2tlbi5hdHRycyB8fCB7fSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmF0dHJzW2tleV0gPSB1bmVzY2FwZUhUTUxFbnRpdGllcyh0b2tlbi5hdHRyc1trZXldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4uc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnNyYyA9IHVuZXNjYXBlSFRNTEVudGl0aWVzKHRva2VuLnNyYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5lcnJvcihlcnJvci5tc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXVlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmx1c2hRdWV1ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZShxdWV1ZS5zaGlmdCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZmx1c2hRdWV1ZSwgMjApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaFF1ZXVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaWJyYXJ5V2FzTG9hZGVkQXN5bmNocm9ub3VzbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jdXJyZW50U2NyaXB0LmFzeW5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NyaXB0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gc2NyaXB0c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8obGF1bmNofHNhdGVsbGl0ZUxpYiktW15cL10rLmpzKFw/LiopPyQvLnRlc3Qoc2NyaXB0LnNyYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzY3JpcHQuYXN5bmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzBhOTRkYzdlZDlhMjI5NzEgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKSwgJF9fX29sZF8zNzYwZTI0ZTI4NDg3MGY4ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ2xvY2FsU3RvcmFnZScpLCAkX19fb2xkXzM1MjMxMTY2N2VlZTc4MWIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMGE5NGRjN2VkOWEyMjk3MSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYmVhY2RmY2I3YmRhYjcxYS5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzM3NjBlMjRlMjg0ODcwZjgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19lOTZlZjBkOTYxOWU2OGMyLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzM1MjMxMTY2N2VlZTc4MWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2JlYWNkZmNiN2JkYWI3MWEuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3BOb25jZSA9IHR1cmJpbmUuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKS5jc3BOb25jZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlZFJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBzZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gYWN0aW9uLnNldHRpbmdzLnNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLnNldHRpbmdzLmlzRXh0ZXJuYWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2FkQ29kZVNlcXVlbnRpYWxseShzb3VyY2UpLnRoZW4oZnVuY3Rpb24gKHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGVkUmVzdWx0ID0gZGVjb3JhdGVDb2RlKGFjdGlvbiwgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmliZVdyaXRlKGRlY29yYXRlZFJlc3VsdC5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlZFJlc3VsdC5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRlZFJlc3VsdCA9IGRlY29yYXRlQ29kZShhY3Rpb24sIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpYnJhcnlXYXNMb2FkZWRBc3luY2hyb25vdXNseSAmJiBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQud3JpdGUgJiYgdHVyYmluZS5wcm9wZXJ0eVNldHRpbmdzLnJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQud3JpdGUoZGVjb3JhdGVkUmVzdWx0LmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RzY3JpYmVXcml0ZShkZWNvcmF0ZWRSZXN1bHQuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0c2NyaWJlV3JpdGUoZGVjb3JhdGVkUmVzdWx0LmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlZFJlc3VsdC5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8wYTk0ZGM3ZWQ5YTIyOTcxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkXzBhOTRkYzdlZDlhMjI5NzEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8zNzYwZTI0ZTI4NDg3MGY4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF8zNzYwZTI0ZTI4NDg3MGY4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMzUyMzExNjY3ZWVlNzgxYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8zNTIzMTE2NjdlZWU3ODFiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnbGlicmFyeS1sb2FkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdMaWJyYXJ5IExvYWRlZCAoUGFnZSBUb3ApJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlTGlmZWN5Y2xlRXZlbnRzID0gcmVxdWlyZSgnLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMaWZlY3ljbGVFdmVudHMucmVnaXN0ZXJMaWJyYXJ5TG9hZGVkVHJpZ2dlcih0cmlnZ2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdzdWJkb21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdTdWJkb21haW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRNYXRjaCA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvdGV4dE1hdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViZG9tYWluID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Muc3ViZG9tYWlucy5zb21lKGZ1bmN0aW9uIChhY2NlcHRhYmxlU3ViZG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdGFibGVWYWx1ZSA9IGFjY2VwdGFibGVTdWJkb21haW4udmFsdWVJc1JlZ2V4ID8gbmV3IFJlZ0V4cChhY2NlcHRhYmxlU3ViZG9tYWluLnZhbHVlLCAnaScpIDogYWNjZXB0YWJsZVN1YmRvbWFpbi52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dE1hdGNoKHN1YmRvbWFpbiwgYWNjZXB0YWJsZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdjbGljaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ0NsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW5kb3cgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1YmJseSA9IHJlcXVpcmUoJy4vaGVscGVycy9jcmVhdGVCdWJibHknKSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgV2Vha01hcCA9IHJlcXVpcmUoJy4vaGVscGVycy93ZWFrTWFwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmFsdWF0ZWRFdmVudHMgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTUlERExFX01PVVNFX0JVVFRPTiA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXN0VG9OdW1iZXJJZlN0cmluZyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvc3RyaW5nQW5kTnVtYmVyVXRpbHMnKS5jYXN0VG9OdW1iZXJJZlN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldERlbGF5YWJsZUxpbmsgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkgfHwgZS5idXR0b24gPT09IE1JRERMRV9NT1VTRV9CVVRUT04pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBlLnRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ05hbWUgPSBub2RlLnRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ05hbWUgJiYgdGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ3RhcmdldCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaHJlZiAmJiAoIXRhcmdldCB8fCB0YXJnZXQgPT09ICdfc2VsZicgfHwgdGFyZ2V0ID09PSAnX3RvcCcgJiYgd2luZG93LnRvcCA9PT0gd2luZG93IHx8IHRhcmdldCA9PT0gd2luZG93Lm5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBidWJibHkuZXZhbHVhdGVFdmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzLCB0cmlnZ2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibHkuYWRkTGlzdGVuZXIoc2V0dGluZ3MsIGZ1bmN0aW9uIChzeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVFdmVudCA9IHN5bnRoZXRpY0V2ZW50Lm5hdGl2ZUV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5zX2ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuY2hvckRlbGF5ID0gY2FzdFRvTnVtYmVySWZTdHJpbmcoc2V0dGluZ3MuYW5jaG9yRGVsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNob3JEZWxheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2YWx1YXRlZEV2ZW50cy5oYXMobmF0aXZlRXZlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsYXlhYmxlTGluayA9IGdldERlbGF5YWJsZUxpbmsobmF0aXZlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5YWJsZUxpbmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBkZWxheWFibGVMaW5rLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYW5jaG9yRGVsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkRXZlbnRzLnNldChuYXRpdmVFdmVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcihzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMuX19yZXNldCA9IGJ1YmJseS5fX3Jlc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2RpcmVjdC1jYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnRGlyZWN0IENhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJzQnlJZGVudGlmaWVyID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlLnRyYWNrID0gZnVuY3Rpb24gKGlkZW50aWZpZXIsIGRldGFpbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXIudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJzID0gdHJpZ2dlcnNCeUlkZW50aWZpZXJbaWRlbnRpZmllcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ludGhldGljRXZlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogZGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycy5mb3JFYWNoKGZ1bmN0aW9uICh0cmlnZ2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoc3ludGhldGljRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2dNZXNzYWdlID0gJ1J1bGVzIHVzaW5nIHRoZSBkaXJlY3QgY2FsbCBldmVudCB0eXBlIHdpdGggaWRlbnRpZmllciAiJyArIGlkZW50aWZpZXIgKyAnIiBoYXZlIGJlZW4gdHJpZ2dlcmVkJyArIChkZXRhaWwgPyAnIHdpdGggYWRkaXRpb25hbCBkZXRhaWw6JyA6ICcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvZ0FyZ3MgPSBbbG9nTWVzc2FnZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFpbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dBcmdzLnB1c2goZGV0YWlsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIubG9nLmFwcGx5KHR1cmJpbmUubG9nZ2VyLCBsb2dBcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIubG9nKCciJyArIGlkZW50aWZpZXIgKyAnIiBkb2VzIG5vdCBtYXRjaCBhbnkgZGlyZWN0IGNhbGwgaWRlbnRpZmllcnMuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzLCB0cmlnZ2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZ2dlcnMgPSB0cmlnZ2Vyc0J5SWRlbnRpZmllcltzZXR0aW5ncy5pZGVudGlmaWVyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VycyA9IHRyaWdnZXJzQnlJZGVudGlmaWVyW3NldHRpbmdzLmlkZW50aWZpZXJdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycy5wdXNoKHRyaWdnZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFyaWFibGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndmFyaWFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdWYXJpYWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0T2JqZWN0UHJvcGVydHkgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2dldE9iamVjdFByb3BlcnR5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0TWF0Y2ggPSByZXF1aXJlKCcuLi9oZWxwZXJzL3RleHRNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdGFibGVWYWx1ZSA9IHNldHRpbmdzLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoc2V0dGluZ3MudmFsdWUsICdpJykgOiBzZXR0aW5ncy52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0TWF0Y2goZ2V0T2JqZWN0UHJvcGVydHkod2luZG93LCBzZXR0aW5ncy5uYW1lKSwgYWNjZXB0YWJsZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvZW50ZXJzVmlld3BvcnQuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZW50ZXJzLXZpZXdwb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnRW50ZXJzIFZpZXdwb3J0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudCA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW5kb3cgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFdlYWtNYXAgPSByZXF1aXJlKCcuL2hlbHBlcnMvd2Vha01hcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVib3VuY2UgPSByZXF1aXJlKCcuL2hlbHBlcnMvZGVib3VuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuYWJsZVdlYWtNYXBEZWZhdWx0VmFsdWUgPSByZXF1aXJlKCcuL2hlbHBlcnMvZW5hYmxlV2Vha01hcERlZmF1bHRWYWx1ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlc1NlbGVjdG9yID0gcmVxdWlyZSgnLi9oZWxwZXJzL21hdGNoZXNTZWxlY3RvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlc1Byb3BlcnRpZXMgPSByZXF1aXJlKCcuL2hlbHBlcnMvbWF0Y2hlc1Byb3BlcnRpZXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhc3RUb051bWJlcklmU3RyaW5nID0gcmVxdWlyZSgnLi4vaGVscGVycy9zdHJpbmdBbmROdW1iZXJVdGlscycpLmNhc3RUb051bWJlcklmU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUE9MTF9JTlRFUlZBTCA9IDMwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBERUJPVU5DRV9ERUxBWSA9IDIwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyZXF1ZW5jaWVzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklSU1RfRU5UUlk6ICdmaXJzdEVudHJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRVJZX0VOVFJZOiAnZXZlcnlFbnRyeScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSUUxMCA9IHdpbmRvdy5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNU0lFIDEwJykgIT09IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhdGVCeUVsZW1lbnQgPSBlbmFibGVXZWFrTWFwRGVmYXVsdFZhbHVlKG5ldyBXZWFrTWFwKCksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dElkczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkTGlzdGVuZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZpZXdwb3J0OiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lcnNCeVNlbGVjdG9yID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBmdW5jdGlvbiAoZWxlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJveDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJvZHkgPSBkb2N1bWVudC5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNsaWVudFRvcCA9IGRvY0VsZW0uY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxUb3AgPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxUb3AgfHwgYm9keS5zY3JvbGxUb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvcCA9IGJveC50b3AgKyBzY3JvbGxUb3AgLSBjbGllbnRUb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGxlZnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRWaWV3cG9ydEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IGRvY3VtZW50LmNvbXBhdE1vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IG1vZGUgPT09ICdDU1MxQ29tcGF0JyA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgOiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRTY3JvbGxUb3AgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRJc0luVmlldyA9IGZ1bmN0aW9uIChlbGVtZW50LCB2aWV3cG9ydEhlaWdodCwgc2Nyb2xsVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9wID0gb2Zmc2V0KGVsZW1lbnQpLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsZW1lbnQpICYmICEoc2Nyb2xsVG9wID4gdG9wICsgaGVpZ2h0IHx8IHNjcm9sbFRvcCArIHZpZXdwb3J0SGVpZ2h0IDwgdG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZUVsZW1lbnRJbnNpZGVWaWV3cG9ydCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudFN0YXRlID0gc3RhdGVCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRTdGF0ZS5pblZpZXdwb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YXRlLmluVmlld3BvcnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobGlzdGVuZXJzQnlTZWxlY3RvcikuZm9yRWFjaChmdW5jdGlvbiAoc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNTZWxlY3RvcihlbGVtZW50LCBzZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNCeVNlbGVjdG9yW3NlbGVjdG9yXS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXNQcm9wZXJ0aWVzKGVsZW1lbnQsIGxpc3RlbmVyLnNldHRpbmdzLmVsZW1lbnRQcm9wZXJ0aWVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50U3RhdGUuY29tcGxldGVkTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxheUNvbXBsZXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZyZXF1ZW5jeSA9IGxpc3RlbmVyLnNldHRpbmdzLmZyZXF1ZW5jeSB8fCBmcmVxdWVuY2llcy5GSVJTVF9FTlRSWTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmVxdWVuY3kgPT09IGZyZXF1ZW5jaWVzLkZJUlNUX0VOVFJZKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YXRlLmNvbXBsZXRlZExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLnRyaWdnZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiBsaXN0ZW5lci5zZXR0aW5ncy5kZWxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lci5zZXR0aW5ncy5kZWxheSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50SXNJblZpZXcoZWxlbWVudCwgZ2V0Vmlld3BvcnRIZWlnaHQoKSwgZ2V0U2Nyb2xsVG9wKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5Q29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsaXN0ZW5lci5zZXR0aW5ncy5kZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U3RhdGUudGltZW91dElkcy5wdXNoKHRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheUNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlRWxlbWVudE91dHNpZGVWaWV3cG9ydCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudFN0YXRlID0gc3RhdGVCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YXRlLmluVmlld3BvcnQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50U3RhdGUudGltZW91dElkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U3RhdGUudGltZW91dElkcy5mb3JFYWNoKGNsZWFyVGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFN0YXRlLnRpbWVvdXRJZHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrRm9yRWxlbWVudHNJblZpZXdwb3J0ID0gZGVib3VuY2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IE9iamVjdC5rZXlzKGxpc3RlbmVyc0J5U2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcnMuam9pbignLCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aWV3cG9ydEhlaWdodCA9IGdldFZpZXdwb3J0SGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gZ2V0U2Nyb2xsVG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudElzSW5WaWV3KGVsZW1lbnQsIHZpZXdwb3J0SGVpZ2h0LCBzY3JvbGxUb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRJbnNpZGVWaWV3cG9ydChlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbGVtZW50T3V0c2lkZVZpZXdwb3J0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgREVCT1VOQ0VfREVMQVkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdGlhbGl6ZUNvbnRlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckVsZW1lbnRzSW5WaWV3cG9ydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW50ZXJ2YWwoY2hlY2tGb3JFbGVtZW50c0luVmlld3BvcnQsIFBPTExfSU5URVJWQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNoZWNrRm9yRWxlbWVudHNJblZpZXdwb3J0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBjaGVja0ZvckVsZW1lbnRzSW5WaWV3cG9ydCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0lFMTApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbnRlbnRMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBpbml0aWFsaXplQ29udGVudExpc3RlbmVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNvbnRlbnRMaXN0ZW5lcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXRpYWxpemVDb250ZW50TGlzdGVuZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncywgdHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IGxpc3RlbmVyc0J5U2VsZWN0b3Jbc2V0dGluZ3MuZWxlbWVudFNlbGVjdG9yXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzQnlTZWxlY3RvcltzZXR0aW5ncy5lbGVtZW50U2VsZWN0b3JdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5kZWxheSA9IGNhc3RUb051bWJlcklmU3RyaW5nKHNldHRpbmdzLmRlbGF5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2N1c3RvbS1jb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnQ3VzdG9tIENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3Muc291cmNlLmNhbGwoZXZlbnQuZWxlbWVudCwgZXZlbnQsIGV2ZW50LnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZWxlbWVudC1leGlzdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdFbGVtZW50IEV4aXN0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUE9MTF9JTlRFUlZBTCA9IDMwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBXZWFrTWFwID0gcmVxdWlyZSgnLi9oZWxwZXJzL3dlYWtNYXAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlZW5FbGVtZW50cyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzUHJvcGVydGllcyA9IHJlcXVpcmUoJy4vaGVscGVycy9tYXRjaGVzUHJvcGVydGllcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXJzQnlTZWxlY3RvciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhsaXN0ZW5lcnNCeVNlbGVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChzZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNCeVNlbGVjdG9yW3NlbGVjdG9yXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VlbkVsZW1lbnRzLmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlbkVsZW1lbnRzLnNldChlbGVtZW50LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbGlzdGVuZXJzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzUHJvcGVydGllcyhlbGVtZW50LCBsaXN0ZW5lci5zZXR0aW5ncy5lbGVtZW50UHJvcGVydGllcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIudHJpZ2dlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGssIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxpc3RlbmVyc0J5U2VsZWN0b3Jbc2VsZWN0b3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUE9MTF9JTlRFUlZBTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzLCB0cmlnZ2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gbGlzdGVuZXJzQnlTZWxlY3RvcltzZXR0aW5ncy5lbGVtZW50U2VsZWN0b3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnNCeVNlbGVjdG9yW3NldHRpbmdzLmVsZW1lbnRTZWxlY3Rvcl0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdxdWVyeS1zdHJpbmctcGFyYW1ldGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnUXVlcnkgU3RyaW5nIFBhcmFtZXRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2luZG93ID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3Itd2luZG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXF1ZXJ5LXN0cmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dE1hdGNoID0gcmVxdWlyZSgnLi4vaGVscGVycy90ZXh0TWF0Y2gnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NlcHRhYmxlVmFsdWUgPSBzZXR0aW5ncy52YWx1ZUlzUmVnZXggPyBuZXcgUmVnRXhwKHNldHRpbmdzLnZhbHVlLCAnaScpIDogc2V0dGluZ3MudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBxdWVyeVN0cmluZy5wYXJzZSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0TWF0Y2gocXVlcnlQYXJhbXNbc2V0dGluZ3MubmFtZV0sIGFjY2VwdGFibGVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3BhdGgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdQYXRoIFdpdGhvdXQgUXVlcnkgU3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudCA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0TWF0Y2ggPSByZXF1aXJlKCcuLi9oZWxwZXJzL3RleHRNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncy5wYXRocy5zb21lKGZ1bmN0aW9uIChhY2NlcHRhYmxlUGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NlcHRhYmxlVmFsdWUgPSBhY2NlcHRhYmxlUGF0aC52YWx1ZUlzUmVnZXggPyBuZXcgUmVnRXhwKGFjY2VwdGFibGVQYXRoLnZhbHVlLCAnaScpIDogYWNjZXB0YWJsZVBhdGgudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRNYXRjaChwYXRoLCBhY2NlcHRhYmxlVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2RhdGFFbGVtZW50Q2hhbmdlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2RhdGEtZWxlbWVudC1jaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdEYXRhIEVsZW1lbnQgQ2hhbmdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQT0xMX0lOVEVSVkFMID0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJzQnlOYW1lID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYWNoZWRTdHJpbmdpZmllZFZhbHVlQnlOYW1lID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRyaWdnZXJzQnlOYW1lKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ2lmaWVkVmFsdWUgPSBKU09OLnN0cmluZ2lmeSh0dXJiaW5lLmdldERhdGFFbGVtZW50VmFsdWUobmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdpZmllZFZhbHVlICE9PSBjYWNoZWRTdHJpbmdpZmllZFZhbHVlQnlOYW1lW25hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW50aGV0aWNFdmVudCA9IHsgZGF0YUVsZW1lbnROYW1lOiBuYW1lIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzQnlOYW1lW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoc3ludGhldGljRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVkU3RyaW5naWZpZWRWYWx1ZUJ5TmFtZVtuYW1lXSA9IHN0cmluZ2lmaWVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFBPTExfSU5URVJWQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncywgdHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBzZXR0aW5ncy5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyaWdnZXJzID0gdHJpZ2dlcnNCeU5hbWVbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyaWdnZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnMgPSB0cmlnZ2Vyc0J5TmFtZVtuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZFN0cmluZ2lmaWVkVmFsdWVCeU5hbWVbbmFtZV0gPSBKU09OLnN0cmluZ2lmeSh0dXJiaW5lLmdldERhdGFFbGVtZW50VmFsdWUobmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnMucHVzaCh0cmlnZ2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZG9tLXJlYWR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnRE9NIFJlYWR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlTGlmZWN5Y2xlRXZlbnRzID0gcmVxdWlyZSgnLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VMaWZlY3ljbGVFdmVudHMucmVnaXN0ZXJEb21SZWFkeVRyaWdnZXIodHJpZ2dlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy92YWx1ZUNvbXBhcmlzb24uanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndmFsdWUtY29tcGFyaXNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ1ZhbHVlIENvbXBhcmlzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzU3RyaW5nID0gcmVxdWlyZSgnLi4vaGVscGVycy9zdHJpbmdBbmROdW1iZXJVdGlscycpLmlzU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNOdW1iZXIgPSByZXF1aXJlKCcuLi9oZWxwZXJzL3N0cmluZ0FuZE51bWJlclV0aWxzJykuaXNOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXN0VG9TdHJpbmdJZk51bWJlciA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvc3RyaW5nQW5kTnVtYmVyVXRpbHMnKS5jYXN0VG9TdHJpbmdJZk51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhc3RUb051bWJlcklmU3RyaW5nID0gcmVxdWlyZSgnLi4vaGVscGVycy9zdHJpbmdBbmROdW1iZXJVdGlscycpLmNhc3RUb051bWJlcklmU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXBkYXRlQ2FzZSA9IGZ1bmN0aW9uIChvcGVyYW5kLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYXNlSW5zZW5zaXRpdmUgJiYgaXNTdHJpbmcob3BlcmFuZCkgPyBvcGVyYW5kLnRvTG93ZXJDYXNlKCkgOiBvcGVyYW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ3VhcmRTdHJpbmdDb21wYXJlID0gZnVuY3Rpb24gKGNvbXBhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCwgY2FzZUluc2Vuc2l0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdE9wZXJhbmQgPSBjYXN0VG9TdHJpbmdJZk51bWJlcihsZWZ0T3BlcmFuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRPcGVyYW5kID0gY2FzdFRvU3RyaW5nSWZOdW1iZXIocmlnaHRPcGVyYW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNTdHJpbmcobGVmdE9wZXJhbmQpICYmIGlzU3RyaW5nKHJpZ2h0T3BlcmFuZCkgJiYgY29tcGFyZShsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kLCBjYXNlSW5zZW5zaXRpdmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd1YXJkTnVtYmVyQ29tcGFyZSA9IGZ1bmN0aW9uIChjb21wYXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0T3BlcmFuZCA9IGNhc3RUb051bWJlcklmU3RyaW5nKGxlZnRPcGVyYW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodE9wZXJhbmQgPSBjYXN0VG9OdW1iZXJJZlN0cmluZyhyaWdodE9wZXJhbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc051bWJlcihsZWZ0T3BlcmFuZCkgJiYgaXNOdW1iZXIocmlnaHRPcGVyYW5kKSAmJiBjb21wYXJlKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd1YXJkQ2FzZVNlbnNpdGl2aXR5ID0gZnVuY3Rpb24gKGNvbXBhcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCwgY2FzZUluc2Vuc2l0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUodXBkYXRlQ2FzZShsZWZ0T3BlcmFuZCwgY2FzZUluc2Vuc2l0aXZlKSwgdXBkYXRlQ2FzZShyaWdodE9wZXJhbmQsIGNhc2VJbnNlbnNpdGl2ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHM6IGd1YXJkQ2FzZVNlbnNpdGl2aXR5KGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRPcGVyYW5kID09IHJpZ2h0T3BlcmFuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc05vdEVxdWFsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb25kaXRpb25zLmVxdWFscy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zOiBndWFyZFN0cmluZ0NvbXBhcmUoZ3VhcmRDYXNlU2Vuc2l0aXZpdHkoZnVuY3Rpb24gKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE9wZXJhbmQuaW5kZXhPZihyaWdodE9wZXJhbmQpICE9PSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNOb3RDb250YWluOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb25kaXRpb25zLmNvbnRhaW5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzV2l0aDogZ3VhcmRTdHJpbmdDb21wYXJlKGd1YXJkQ2FzZVNlbnNpdGl2aXR5KGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRPcGVyYW5kLmluZGV4T2YocmlnaHRPcGVyYW5kKSA9PT0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNOb3RTdGFydFdpdGg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWNvbmRpdGlvbnMuc3RhcnRzV2l0aC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHNXaXRoOiBndWFyZFN0cmluZ0NvbXBhcmUoZ3VhcmRDYXNlU2Vuc2l0aXZpdHkoZnVuY3Rpb24gKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE9wZXJhbmQuc3Vic3RyaW5nKGxlZnRPcGVyYW5kLmxlbmd0aCAtIHJpZ2h0T3BlcmFuZC5sZW5ndGgsIGxlZnRPcGVyYW5kLmxlbmd0aCkgPT09IHJpZ2h0T3BlcmFuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNOb3RFbmRXaXRoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb25kaXRpb25zLmVuZHNXaXRoLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1JlZ2V4OiBndWFyZFN0cmluZ0NvbXBhcmUoZnVuY3Rpb24gKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHJpZ2h0T3BlcmFuZCwgY2FzZUluc2Vuc2l0aXZlID8gJ2knIDogJycpLnRlc3QobGVmdE9wZXJhbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzTm90TWF0Y2hSZWdleDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhY29uZGl0aW9ucy5tYXRjaGVzUmVnZXguYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbjogZ3VhcmROdW1iZXJDb21wYXJlKGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRPcGVyYW5kIDwgcmlnaHRPcGVyYW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXNzVGhhbk9yRXF1YWw6IGd1YXJkTnVtYmVyQ29tcGFyZShmdW5jdGlvbiAobGVmdE9wZXJhbmQsIHJpZ2h0T3BlcmFuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0T3BlcmFuZCA8PSByaWdodE9wZXJhbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXJUaGFuOiBndWFyZE51bWJlckNvbXBhcmUoZnVuY3Rpb24gKGxlZnRPcGVyYW5kLCByaWdodE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE9wZXJhbmQgPiByaWdodE9wZXJhbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXJUaGFuT3JFcXVhbDogZ3VhcmROdW1iZXJDb21wYXJlKGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCwgcmlnaHRPcGVyYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnRPcGVyYW5kID49IHJpZ2h0T3BlcmFuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnVlOiBmdW5jdGlvbiAobGVmdE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE9wZXJhbmQgPT09IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnV0aHk6IGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGxlZnRPcGVyYW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhbHNlOiBmdW5jdGlvbiAobGVmdE9wZXJhbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdE9wZXJhbmQgPT09IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFsc3k6IGZ1bmN0aW9uIChsZWZ0T3BlcmFuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbGVmdE9wZXJhbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uc1tzZXR0aW5ncy5jb21wYXJpc29uLm9wZXJhdG9yXShzZXR0aW5ncy5sZWZ0T3BlcmFuZCwgc2V0dGluZ3MucmlnaHRPcGVyYW5kLCBCb29sZWFuKHNldHRpbmdzLmNvbXBhcmlzb24uY2FzZUluc2Vuc2l0aXZlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2hpc3RvcnlDaGFuZ2UuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaGlzdG9yeS1jaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdIaXN0b3J5IENoYW5nZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVib3VuY2UgPSByZXF1aXJlKCcuL2hlbHBlcnMvZGVib3VuY2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9uY2UgPSByZXF1aXJlKCcuL2hlbHBlcnMvb25jZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGlzdG9yeSA9IHdpbmRvdy5oaXN0b3J5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdFVSSSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJpZ2dlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxUaHJvdWdoID0gZnVuY3Rpb24gKG9iamVjdCwgbWV0aG9kTmFtZSwgZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IG9iamVjdFttZXRob2ROYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmV0dXJuVmFsdWUgPSBvcmlnaW5hbC5hcHBseShvYmplY3QsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbFRyaWdnZXJzSWZVUklDaGFuZ2VkID0gZGVib3VuY2UoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVyaSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RVUkkgIT09IHVyaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJzLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RVUkkgPSB1cmk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2F0Y2hGb3JIaXN0b3J5Q2hhbmdlID0gb25jZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5LnB1c2hTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsVGhyb3VnaChoaXN0b3J5LCAncHVzaFN0YXRlJywgY2FsbFRyaWdnZXJzSWZVUklDaGFuZ2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnkucmVwbGFjZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxUaHJvdWdoKGhpc3RvcnksICdyZXBsYWNlU3RhdGUnLCBjYWxsVHJpZ2dlcnNJZlVSSUNoYW5nZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGNhbGxUcmlnZ2Vyc0lmVVJJQ2hhbmdlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIGNhbGxUcmlnZ2Vyc0lmVVJJQ2hhbmdlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzZXR0aW5ncywgdHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hGb3JIaXN0b3J5Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycy5wdXNoKHRyaWdnZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2hlbHBlcnMvZ2V0T2JqZWN0UHJvcGVydHkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmosIHByb3BlcnR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlDaGFpbiA9IHByb3BlcnR5LnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudFZhbHVlID0gb2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHByb3BlcnR5Q2hhaW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlID0gY3VycmVudFZhbHVlW3Byb3BlcnR5Q2hhaW5baV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9wYWdlTGlmZWN5Y2xlRXZlbnRzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdpbmRvdyA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXdpbmRvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNJRTEwID0gd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uLmluZGV4T2YoJ01TSUUgMTAnKSAhPT0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBXSU5ET1dfTE9BREVEID0gJ1dJTkRPV19MT0FERUQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgRE9NX1JFQURZID0gJ0RPTV9SRUFEWSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQQUdFX0JPVFRPTSA9ICdQQUdFX0JPVFRPTSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaWZlY3ljbGVFdmVudHNPcmRlciA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfQk9UVE9NLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NX1JFQURZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORE9XX0xPQURFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3JlYXRlU3ludGhldGljRXZlbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmF0aXZlRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQ6IG5hdGl2ZUV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVnaXN0cnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlRXZlbnRzT3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5W2V2ZW50XSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NSZWdpc3RyeSA9IGZ1bmN0aW9uIChsaWZlY3ljbGVFdmVudCwgbmF0aXZlRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpZmVjeWNsZUV2ZW50c09yZGVyLnNsaWNlKDAsIGdldExpZmVjeWNsZUV2ZW50SW5kZXgobGlmZWN5Y2xlRXZlbnQpICsgMSkuZm9yRWFjaChmdW5jdGlvbiAobGlmZWN5Y2xlRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzVHJpZ2dlcnMobmF0aXZlRXZlbnQsIGxpZmVjeWNsZUV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGV0ZWN0TGlmZWN5Y2xlRXZlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5ET1dfTE9BREVEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc0lFMTAgPyBET01fUkVBRFkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0TGlmZWN5Y2xlRXZlbnRJbmRleCA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpZmVjeWNsZUV2ZW50c09yZGVyLmluZGV4T2YoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc1RyaWdnZXJzID0gZnVuY3Rpb24gKG5hdGl2ZUV2ZW50LCBsaWZlY3ljbGVFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnlbbGlmZWN5Y2xlRXZlbnRdLmZvckVhY2goZnVuY3Rpb24gKHRyaWdnZXJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1RyaWdnZXIobmF0aXZlRXZlbnQsIHRyaWdnZXJEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnlbbGlmZWN5Y2xlRXZlbnRdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzVHJpZ2dlciA9IGZ1bmN0aW9uIChuYXRpdmVFdmVudCwgdHJpZ2dlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyID0gdHJpZ2dlckRhdGEudHJpZ2dlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW50aGV0aWNFdmVudEZuID0gdHJpZ2dlckRhdGEuc3ludGhldGljRXZlbnRGbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoc3ludGhldGljRXZlbnRGbiA/IHN5bnRoZXRpY0V2ZW50Rm4obmF0aXZlRXZlbnQpIDogbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlLnBhZ2VCb3R0b20gPSBwcm9jZXNzUmVnaXN0cnkuYmluZChudWxsLCBQQUdFX0JPVFRPTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBwcm9jZXNzUmVnaXN0cnkuYmluZChudWxsLCBET01fUkVBRFkpLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBwcm9jZXNzUmVnaXN0cnkuYmluZChudWxsLCBXSU5ET1dfTE9BREVEKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaWZlY3ljbGVFdmVudCA9IGRldGVjdExpZmVjeWNsZUV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlmZWN5Y2xlRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVnaXN0cnkobGlmZWN5Y2xlRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckxpYnJhcnlMb2FkZWRUcmlnZ2VyOiBmdW5jdGlvbiAodHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlclBhZ2VCb3R0b21UcmlnZ2VyOiBmdW5jdGlvbiAodHJpZ2dlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5W1BBR0VfQk9UVE9NXS5wdXNoKHsgdHJpZ2dlcjogdHJpZ2dlciB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckRvbVJlYWR5VHJpZ2dlcjogZnVuY3Rpb24gKHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeVtET01fUkVBRFldLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudEZuOiBjcmVhdGVTeW50aGV0aWNFdmVudC5iaW5kKG51bGwsIGRvY3VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyV2luZG93TG9hZGVkVHJpZ2dlcjogZnVuY3Rpb24gKHRyaWdnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeVtXSU5ET1dfTE9BREVEXS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhldGljRXZlbnRGbjogY3JlYXRlU3ludGhldGljRXZlbnQuYmluZChudWxsLCB3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvaGVscGVycy90ZXh0TWF0Y2guanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIHBhdHRlcm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgQXJndW1lbnQ6IFBhdHRlcm4gaXMgbm90IHByZXNlbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyID09PSBwYXR0ZXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdChzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2RlY29yYXRlQ29kZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0ZUdsb2JhbEphdmFTY3JpcHRDb2RlID0gcmVxdWlyZSgnLi9kZWNvcmF0b3JzL2RlY29yYXRlR2xvYmFsSmF2YVNjcmlwdENvZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlY29yYXRlTm9uR2xvYmFsSmF2YVNjcmlwdENvZGUgPSByZXF1aXJlKCcuL2RlY29yYXRvcnMvZGVjb3JhdGVOb25HbG9iYWxKYXZhU2NyaXB0Q29kZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVjb3JhdGVIdG1sQ29kZSA9IHJlcXVpcmUoJy4vZGVjb3JhdG9ycy9kZWNvcmF0ZUh0bWxDb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWNvcmF0b3JzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdDogZnVuY3Rpb24gKGFjdGlvbiwgc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5zZXR0aW5ncy5nbG9iYWwgPyBkZWNvcmF0ZUdsb2JhbEphdmFTY3JpcHRDb2RlKGFjdGlvbiwgc291cmNlKSA6IGRlY29yYXRlTm9uR2xvYmFsSmF2YVNjcmlwdENvZGUoYWN0aW9uLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6IGRlY29yYXRlSHRtbENvZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYWN0aW9uLCBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvcmF0b3JzW2FjdGlvbi5zZXR0aW5ncy5sYW5ndWFnZV0oYWN0aW9uLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2FjdGlvbnMvaGVscGVycy9sb2FkQ29kZVNlcXVlbnRpYWxseS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQcm9taXNlID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3ItcHJvbWlzZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0U291cmNlQnlVcmwgPSByZXF1aXJlKCcuL2dldFNvdXJjZUJ5VXJsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2aW91c0V4ZWN1dGVDb2RlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzb3VyY2VVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXF1ZW50aWFsbHlMb2FkQ29kZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkQ29kZVByb21pc2UgPSBnZXRTb3VyY2VCeVVybChzb3VyY2VVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZENvZGVQcm9taXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0V4ZWN1dGVDb2RlUHJvbWlzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzRXhlY3V0ZUNvZGVQcm9taXNlID0gc2VxdWVudGlhbGx5TG9hZENvZGVQcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbnRpYWxseUxvYWRDb2RlUHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvbm9kZV9tb2R1bGVzL3Bvc3RzY3JpYmUvZGlzdC9wb3N0c2NyaWJlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZShbXSwgZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0c1sncG9zdHNjcmliZSddID0gZmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RbJ3Bvc3RzY3JpYmUnXSA9IGZhY3RvcnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vZHVsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZHVsZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd2VicGFja19yZXF1aXJlX18ucCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcG9zdHNjcmliZSA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcG9zdHNjcmliZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3N0c2NyaWJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBfcG9zdHNjcmliZTJbJ2RlZmF1bHQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0c1snZGVmYXVsdCddID0gcG9zdHNjcmliZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF93cml0ZVN0cmVhbSA9IF9fd2VicGFja19yZXF1aXJlX18oMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfd3JpdGVTdHJlYW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd3JpdGVTdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09iaiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09ialsnZGVmYXVsdCddID0gb2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdPYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZG9Ob3RoaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBPUFRJT05TID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBc3luYzogZG9Ob3RoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJEZXF1ZXVlOiBkb05vdGhpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclN0cmVhbVN0YXJ0OiBkb05vdGhpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlcldyaXRlOiBkb05vdGhpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4OiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlRW5xdWV1ZTogZG9Ob3RoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlV3JpdGVUb2tlbjogZnVuY3Rpb24gYmVmb3JlV3JpdGVUb2tlbih0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZVdyaXRlOiBmdW5jdGlvbiBiZWZvcmVXcml0ZShzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGRvTm90aGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiBlcnJvcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUubXNnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlQXN5bmM6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXh0SWQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGl2ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5leHRTdHJlYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IHF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gdXRpbHMubGFzdChhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFmdGVyRGVxdWV1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RyZWFtID0gcnVuU3RyZWFtLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hZnRlclN0cmVhbVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcnVuU3RyZWFtKGVsLCBodG1sLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUgPSBuZXcgX3dyaXRlU3RyZWFtMlsnZGVmYXVsdCddKGVsLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS5pZCA9IG5leHRJZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgYWN0aXZlLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmliZS5zdHJlYW1zW2FjdGl2ZS5uYW1lXSA9IGFjdGl2ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb2MgPSBlbC5vd25lckRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXNoID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiBkb2MuY2xvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbjogZG9jLm9wZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGRvYy53cml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWxuOiBkb2Mud3JpdGVsbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF93cml0ZShzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBvcHRpb25zLmJlZm9yZVdyaXRlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLndyaXRlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hZnRlcldyaXRlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXh0ZW5kcyhkb2MsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZTogZG9Ob3RoaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46IGRvTm90aGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBzdHIgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cltfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dyaXRlKHN0ci5qb2luKCcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWxuOiBmdW5jdGlvbiB3cml0ZWxuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHN0ciA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dyaXRlKHN0ci5qb2luKCcnKSArICdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZE9uRXJyb3IgPSBhY3RpdmUud2luLm9uZXJyb3IgfHwgZG9Ob3RoaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLndpbi5vbmVycm9yID0gZnVuY3Rpb24gKG1zZywgdXJsLCBsaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5lcnJvcih7IG1zZzogbXNnICsgJyAtICcgKyB1cmwgKyAnOiAnICsgbGluZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRPbkVycm9yLmFwcGx5KGFjdGl2ZS53aW4sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUud3JpdGUoaHRtbCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9leHRlbmRzKGRvYywgc3Rhc2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS53aW4ub25lcnJvciA9IG9sZE9uRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY3RpdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcG9zdHNjcmliZShlbCwgaHRtbCwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzLmlzRnVuY3Rpb24ob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0geyBkb25lOiBvcHRpb25zIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMgPT09ICdjbGVhcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dElkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gdXRpbHMuZGVmYXVsdHMob3B0aW9ucywgT1BUSU9OUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL14jLy50ZXN0KGVsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLnN1YnN0cigxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gZWwuanF1ZXJ5ID8gZWxbMF0gOiBlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhcmdzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnBvc3RzY3JpYmUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsOiBmdW5jdGlvbiBjYW5jZWwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzLnN0cmVhbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zdHJlYW0uYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBkb05vdGhpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5iZWZvcmVFbnF1ZXVlKGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaChhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnBvc3RzY3JpYmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V4dGVuZHMocG9zdHNjcmliZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogcXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmVhbTogX3dyaXRlU3RyZWFtMlsnZGVmYXVsdCddCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3ByZXNjcmliZSA9IF9fd2VicGFja19yZXF1aXJlX18oMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfcHJlc2NyaWJlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ByZXNjcmliZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfdXRpbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3T2JqID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqWydkZWZhdWx0J10gPSBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld09iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBERUJVR19DSFVOSyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQkFTRUFUVFIgPSAnZGF0YS1wcy0nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUFJPWFlfU1RZTEUgPSAncHMtc3R5bGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUFJPWFlfU0NSSVBUID0gJ3BzLXNjcmlwdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldERhdGEoZWwsIG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdHRyID0gQkFTRUFUVFIgKyBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9IGVsLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdXRpbHMuZXhpc3R5KHZhbCkgPyB2YWwgOiBTdHJpbmcodmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzZXREYXRhKGVsLCBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IEJBU0VBVFRSICsgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1dGlscy5leGlzdHkodmFsdWUpICYmIHZhbHVlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShhdHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgV3JpdGVTdHJlYW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBXcml0ZVN0cmVhbShyb290KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBXcml0ZVN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jID0gcm9vdC5vd25lckRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2luID0gdGhpcy5kb2MuZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2MucGFyZW50V2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VyID0gbmV3IF9wcmVzY3JpYmUyWydkZWZhdWx0J10oJycsIHsgYXV0b0ZpeDogb3B0aW9ucy5hdXRvRml4IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0dWFscyA9IFtyb290XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3h5SGlzdG9yeSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHlSb290ID0gdGhpcy5kb2MuY3JlYXRlRWxlbWVudChyb290Lm5vZGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdFN0YWNrID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVF1ZXVlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YSh0aGlzLnByb3h5Um9vdCwgJ3Byb3h5b2YnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfd3JpdGVRdWV1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3dyaXRlUXVldWUgPSB0aGlzLndyaXRlUXVldWUpLnB1c2guYXBwbHkoX3dyaXRlUXVldWUsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCF0aGlzLmRlZmVycmVkUmVtb3RlICYmIHRoaXMud3JpdGVRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IHRoaXMud3JpdGVRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMuaXNGdW5jdGlvbihhcmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsRnVuY3Rpb24oYXJnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlSW1wbChhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5fY2FsbEZ1bmN0aW9uID0gZnVuY3Rpb24gX2NhbGxGdW5jdGlvbihmbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2sgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmbi5uYW1lIHx8IGZuLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU2NyaXB0U3RhcnQodG9rKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbi5jYWxsKHRoaXMud2luLCB0aGlzLmRvYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25TY3JpcHREb25lKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLl93cml0ZUltcGwgPSBmdW5jdGlvbiBfd3JpdGVJbXBsKGh0bWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlci5hcHBlbmQoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvayA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0b2sgPSB0aGlzLnBhcnNlci5yZWFkVG9rZW4oKSkgJiYgIShzY3JpcHQgPSB1dGlscy5pc1NjcmlwdCh0b2spKSAmJiAhKHN0eWxlID0gdXRpbHMuaXNTdHlsZSh0b2spKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sgPSB0aGlzLm9wdGlvbnMuYmVmb3JlV3JpdGVUb2tlbih0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaCh0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZVN0YXRpY1Rva2Vucyh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVNjcmlwdFRva2VuKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVTdHlsZVRva2VuKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5fd3JpdGVTdGF0aWNUb2tlbnMgPSBmdW5jdGlvbiBfd3JpdGVTdGF0aWNUb2tlbnModG9rZW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNodW5rID0gdGhpcy5fYnVpbGRDaHVuayh0b2tlbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2h1bmsuYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5odG1sID0gdGhpcy5wcm94eUhpc3RvcnkgKyBjaHVuay5hY3R1YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eUhpc3RvcnkgKz0gY2h1bmsucHJveHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm94eVJvb3QuaW5uZXJIVE1MID0gY2h1bmsuaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfQ0hVTkspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsucHJveHlJbm5lckhUTUwgPSB0aGlzLnByb3h5Um9vdC5pbm5lckhUTUw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dhbGtDaHVuaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVR19DSFVOSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVuay5hY3R1YWxJbm5lckhUTUwgPSB0aGlzLnJvb3QuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2h1bms7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLl9idWlsZENodW5rID0gZnVuY3Rpb24gX2J1aWxkQ2h1bmsodG9rZW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRJZCA9IHRoaXMuYWN0dWFscy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhdyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJveHkgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVuID0gdG9rZW5zLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2sgPSB0b2tlbnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlblJhdyA9IHRvay50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXcucHVzaCh0b2tlblJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2suYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghL15ub3NjcmlwdCQvaS50ZXN0KHRvay50YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IG5leHRJZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5wdXNoKHRva2VuUmF3LnJlcGxhY2UoLyhcLz8+KS8sICcgJyArIEJBU0VBVFRSICsgJ2lkPScgKyBpZCArICcgJDEnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvay5hdHRycy5pZCAhPT0gUFJPWFlfU0NSSVBUICYmIHRvay5hdHRycy5pZCAhPT0gUFJPWFlfU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkucHVzaCh0b2sudHlwZSA9PT0gJ2F0b21pY1RhZycgPyAnJyA6ICc8JyArIHRvay50YWdOYW1lICsgJyAnICsgQkFTRUFUVFIgKyAncHJveHlvZj0nICsgaWQgKyAodG9rLnVuYXJ5ID8gJyAvPicgOiAnPicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwucHVzaCh0b2tlblJhdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eS5wdXNoKHRvay50eXBlID09PSAnZW5kVGFnJyA/IHRva2VuUmF3IDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuczogdG9rZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHJhdy5qb2luKCcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsOiBhY3R1YWwuam9pbignJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5OiBwcm94eS5qb2luKCcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLl93YWxrQ2h1bmsgPSBmdW5jdGlvbiBfd2Fsa0NodW5rKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IFt0aGlzLnByb3h5Um9vdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHV0aWxzLmV4aXN0eShub2RlID0gc3RhY2suc2hpZnQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzRWxlbWVudCA9IG5vZGUubm9kZVR5cGUgPT09IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1Byb3h5ID0gaXNFbGVtZW50ICYmIGdldERhdGEobm9kZSwgJ3Byb3h5b2YnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Byb3h5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxzW2dldERhdGEobm9kZSwgJ2lkJyldID0gbm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREYXRhKG5vZGUsICdpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudElzUHJveHlPZiA9IG5vZGUucGFyZW50Tm9kZSAmJiBnZXREYXRhKG5vZGUucGFyZW50Tm9kZSwgJ3Byb3h5b2YnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJc1Byb3h5T2YpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbHNbcGFyZW50SXNQcm94eU9mXS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay51bnNoaWZ0LmFwcGx5KHN0YWNrLCB1dGlscy50b0FycmF5KG5vZGUuY2hpbGROb2RlcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUuX2hhbmRsZVNjcmlwdFRva2VuID0gZnVuY3Rpb24gX2hhbmRsZVNjcmlwdFRva2VuKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmRlciA9IHRoaXMucGFyc2VyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlUXVldWUudW5zaGlmdChyZW1haW5kZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2suc3JjID0gdG9rLmF0dHJzLnNyYyB8fCB0b2suYXR0cnMuU1JDOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rLnNyYyAmJiB0aGlzLnNjcmlwdFN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmVycmVkUmVtb3RlID0gdG9rOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU2NyaXB0U3RhcnQodG9rKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd3JpdGVTY3JpcHRUb2tlbih0b2ssIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX29uU2NyaXB0RG9uZSh0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5faGFuZGxlU3R5bGVUb2tlbiA9IGZ1bmN0aW9uIF9oYW5kbGVTdHlsZVRva2VuKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZW1haW5kZXIgPSB0aGlzLnBhcnNlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5kZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53cml0ZVF1ZXVlLnVuc2hpZnQocmVtYWluZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLnR5cGUgPSB0b2suYXR0cnMudHlwZSB8fCB0b2suYXR0cnMuVFlQRSB8fCAndGV4dC9jc3MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvayA9IHRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZVN0eWxlVG9rZW4odG9rKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5fd3JpdGVTdHlsZVRva2VuID0gZnVuY3Rpb24gX3dyaXRlU3R5bGVUb2tlbih0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSB0aGlzLl9idWlsZFN0eWxlKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0Q3Vyc29yKGVsLCBQUk9YWV9TVFlMRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvay5jb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5zdHlsZVNoZWV0ICYmICFlbC5zaGVldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc3R5bGVTaGVldC5jc3NUZXh0ID0gdG9rLmNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmRvYy5jcmVhdGVUZXh0Tm9kZSh0b2suY29udGVudCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5fYnVpbGRTdHlsZSA9IGZ1bmN0aW9uIF9idWlsZFN0eWxlKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQodG9rLnRhZ05hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgndHlwZScsIHRvay50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5lYWNoS2V5KHRvay5hdHRycywgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5faW5zZXJ0Q3Vyc29yID0gZnVuY3Rpb24gX2luc2VydEN1cnNvcihlbCwgd2hpY2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl93cml0ZUltcGwoJzxzcGFuIGlkPSInICsgd2hpY2ggKyAnIi8+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKHdoaWNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChlbCwgY3Vyc29yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLl9vblNjcmlwdFN0YXJ0ID0gZnVuY3Rpb24gX29uU2NyaXB0U3RhcnQodG9rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLm91dGVyV3JpdGVzID0gdGhpcy53cml0ZVF1ZXVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVRdWV1ZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NyaXB0U3RhY2sudW5zaGlmdCh0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyZWFtLnByb3RvdHlwZS5fb25TY3JpcHREb25lID0gZnVuY3Rpb24gX29uU2NyaXB0RG9uZSh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rICE9PSB0aGlzLnNjcmlwdFN0YWNrWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lcnJvcih7IG1zZzogJ0JhZCBzY3JpcHQgbmVzdGluZyBvciBzY3JpcHQgZmluaXNoZWQgdHdpY2UnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NyaXB0U3RhY2suc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndyaXRlLmFwcGx5KHRoaXMsIHRvay5vdXRlcldyaXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjcmlwdFN0YWNrLmxlbmd0aCAmJiB0aGlzLmRlZmVycmVkUmVtb3RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU2NyaXB0U3RhcnQodGhpcy5kZWZlcnJlZFJlbW90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmZXJyZWRSZW1vdGUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUuX3dyaXRlU2NyaXB0VG9rZW4gPSBmdW5jdGlvbiBfd3JpdGVTY3JpcHRUb2tlbih0b2ssIGRvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSB0aGlzLl9idWlsZFNjcmlwdCh0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhc3luY1JlbGVhc2UgPSB0aGlzLl9zaG91bGRSZWxlYXNlKGVsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWZ0ZXJBc3luYyA9IHRoaXMub3B0aW9ucy5hZnRlckFzeW5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2suc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNyYyA9IHRvay5zcmM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjcmlwdExvYWRIYW5kbGVyKGVsLCAhYXN5bmNSZWxlYXNlID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBc3luYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogYWZ0ZXJBc3luYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc2VydEN1cnNvcihlbCwgUFJPWFlfU0NSSVBUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbC5zcmMgfHwgYXN5bmNSZWxlYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUuX2J1aWxkU2NyaXB0ID0gZnVuY3Rpb24gX2J1aWxkU2NyaXB0KHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQodG9rLnRhZ05hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLmVhY2hLZXkodG9rLmF0dHJzLCBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rLmNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwudGV4dCA9IHRvay5jb250ZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW0ucHJvdG90eXBlLl9zY3JpcHRMb2FkSGFuZGxlciA9IGZ1bmN0aW9uIF9zY3JpcHRMb2FkSGFuZGxlcihlbCwgZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFudXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsID0gZWwub25sb2FkID0gZWwub25yZWFkeXN0YXRlY2hhbmdlID0gZWwub25lcnJvciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IHRoaXMub3B0aW9ucy5lcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzdWNjZXNzKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbnVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZmFpbHVyZShlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlYXR0YWNoRXZlbnRMaXN0ZW5lcihlbCwgZXZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGVyID0gZWxbJ29uJyArIGV2dF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsWydfb24nICsgZXZ0XSA9IGhhbmRsZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhdHRhY2hFdmVudExpc3RlbmVyKGVsLCAnbG9hZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXR0YWNoRXZlbnRMaXN0ZW5lcihlbCwgJ2Vycm9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V4dGVuZHMoZWwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25sb2FkOiBmdW5jdGlvbiBvbmxvYWQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwuX29ubG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLl9vbmxvYWQuYXBwbHkodGhpcywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUoeyBtc2c6ICdvbmxvYWQgaGFuZGxlciBmYWlsZWQgJyArIGVyciArICcgQCAnICsgZWwuc3JjIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcnJvcjogZnVuY3Rpb24gb25lcnJvcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbC5fb25lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLl9vbmVycm9yLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKHsgbXNnOiAnb25lcnJvciBoYW5kbGVyIGZhaWxlZCAnICsgZXJyICsgJyBAICcgKyBlbC5zcmMgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlKHsgbXNnOiAncmVtb3RlIHNjcmlwdCBmYWlsZWQgJyArIGVsLnNyYyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25yZWFkeXN0YXRlY2hhbmdlOiBmdW5jdGlvbiBvbnJlYWR5c3RhdGVjaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL14obG9hZGVkfGNvbXBsZXRlKSQvLnRlc3QoZWwucmVhZHlTdGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmVhbS5wcm90b3R5cGUuX3Nob3VsZFJlbGVhc2UgPSBmdW5jdGlvbiBfc2hvdWxkUmVsZWFzZShlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NjcmlwdCA9IC9ec2NyaXB0JC9pLnRlc3QoZWwubm9kZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNTY3JpcHQgfHwgISEodGhpcy5vcHRpb25zLnJlbGVhc2VBc3luYyAmJiBlbC5zcmMgJiYgZWwuaGFzQXR0cmlidXRlKCdhc3luYycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV3JpdGVTdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0c1snZGVmYXVsdCddID0gV3JpdGVTdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUoW10sIGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHNbJ1ByZXNjcmliZSddID0gZmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RbJ1ByZXNjcmliZSddID0gZmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobW9kdWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbW9kdWxlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUubG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9IdG1sUGFyc2VyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9IdG1sUGFyc2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0h0bWxQYXJzZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IF9IdG1sUGFyc2VyMlsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3VwcG9ydHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3VwcG9ydHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfc3VwcG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N0cmVhbVJlYWRlcnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtUmVhZGVycyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9zdHJlYW1SZWFkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9maXhlZFJlYWRUb2tlbkZhY3RvcnkgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2ZpeGVkUmVhZFRva2VuRmFjdG9yeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9maXhlZFJlYWRUb2tlbkZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld09iaiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPYmpba2V5XSA9IG9ialtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09ialsnZGVmYXVsdCddID0gb2JqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdPYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGV0ZWN0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogL148IS0tLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRhZzogL148XC8vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljVGFnOiAvXjxccyooc2NyaXB0fHN0eWxlfG5vc2NyaXB0fGlmcmFtZXx0ZXh0YXJlYSlbXHNcLz5dL2ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRhZzogL148LywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzOiAvXltePF0vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBIdG1sUGFyc2VyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSHRtbFBhcnNlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgSHRtbFBhcnNlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpeCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaXhlZFRva2VuT3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdXBwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXV0b0ZpeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkVG9rZW5PcHRpb25zW2tleSArICdGaXgnXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXggPSBmaXggfHwgZml4ZWRUb2tlbk9wdGlvbnNba2V5ICsgJ0ZpeCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVhZFRva2VuID0gKDAsIF9maXhlZFJlYWRUb2tlbkZhY3RvcnkyWydkZWZhdWx0J10pKHRoaXMsIGZpeGVkVG9rZW5PcHRpb25zLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX3JlYWRUb2tlbkltcGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlZWtUb2tlbiA9ICgwLCBfZml4ZWRSZWFkVG9rZW5GYWN0b3J5MlsnZGVmYXVsdCddKSh0aGlzLCBmaXhlZFRva2VuT3B0aW9ucywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9wZWVrVG9rZW5JbXBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlYWRUb2tlbiA9IHRoaXMuX3JlYWRUb2tlbkltcGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BlZWtUb2tlbiA9IHRoaXMuX3BlZWtUb2tlbkltcGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gYXBwZW5kKHN0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtICs9IHN0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdG1sUGFyc2VyLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gcHJlcGVuZChzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0ciArIHRoaXMuc3RyZWFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxQYXJzZXIucHJvdG90eXBlLl9yZWFkVG9rZW5JbXBsID0gZnVuY3Rpb24gX3JlYWRUb2tlbkltcGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gdGhpcy5fcGVla1Rva2VuSW1wbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHRoaXMuc3RyZWFtLnNsaWNlKHRva2VuLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5wcm90b3R5cGUuX3BlZWtUb2tlbkltcGwgPSBmdW5jdGlvbiBfcGVla1Rva2VuSW1wbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0eXBlIGluIGRldGVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0Lmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGV0ZWN0W3R5cGVdLnRlc3QodGhpcy5zdHJlYW0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gc3RyZWFtUmVhZGVyc1t0eXBlXSh0aGlzLnN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50eXBlID09PSAnc3RhcnRUYWcnICYmIC9zY3JpcHR8c3R5bGUvaS50ZXN0KHRva2VuLnRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnRleHQgPSB0aGlzLnN0cmVhbS5zdWJzdHIoMCwgdG9rZW4ubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdG1sUGFyc2VyLnByb3RvdHlwZS5wZWVrVG9rZW4gPSBmdW5jdGlvbiBwZWVrVG9rZW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlZWtUb2tlbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxQYXJzZXIucHJvdG90eXBlLnJlYWRUb2tlbiA9IGZ1bmN0aW9uIHJlYWRUb2tlbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5wcm90b3R5cGUucmVhZFRva2VucyA9IGZ1bmN0aW9uIHJlYWRUb2tlbnMoaGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0b2sgPSB0aGlzLnJlYWRUb2tlbigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyc1t0b2sudHlwZV0gJiYgaGFuZGxlcnNbdG9rLnR5cGVdKHRvaykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdCA9IHRoaXMuc3RyZWFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5wcm90b3R5cGUucmVzdCA9IGZ1bmN0aW9uIHJlc3QoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIdG1sUGFyc2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IEh0bWxQYXJzZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0bWxQYXJzZXIudG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uICh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2sudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5lc2NhcGVBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKGF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXNjYXBlZEF0dHJzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuYW1lIGluIGF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRBdHRyc1tuYW1lXSA9ICgwLCBfdXRpbHMuZXNjYXBlUXVvdGVzKShhdHRyc1tuYW1lXSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVzY2FwZWRBdHRyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5zdXBwb3J0cyA9IHN1cHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3VwcG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHRtbFBhcnNlci5icm93c2VySGFzRmxhdyA9IEh0bWxQYXJzZXIuYnJvd3Nlckhhc0ZsYXcgfHwgIXN1cHBvcnRzW2tleV0gJiYga2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhZ1NvdXAgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGZDbG9zZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd29yayA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxQPjxJPjwvUD48L0k+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMudGFnU291cCA9IHRhZ1NvdXAgPSB3b3JrLmlubmVySFRNTCAhPT0gaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy50YWdTb3VwID0gdGFnU291cCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLmlubmVySFRNTCA9ICc8UD48aT48UD48L1A+PC9pPjwvUD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5zZWxmQ2xvc2UgPSBzZWxmQ2xvc2UgPSB3b3JrLmNoaWxkTm9kZXMubGVuZ3RoID09PSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLnNlbGZDbG9zZSA9IHNlbGZDbG9zZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLnRhZ1NvdXAgPSB0YWdTb3VwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLnNlbGZDbG9zZSA9IHNlbGZDbG9zZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuY29tbWVudCA9IGNvbW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuY2hhcnMgPSBjaGFyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5zdGFydFRhZyA9IHN0YXJ0VGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmF0b21pY1RhZyA9IGF0b21pY1RhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5lbmRUYWcgPSBlbmRUYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfdG9rZW5zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFJFR0VYRVMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRhZzogL148KFtcLUEtWmEtejAtOV9dKykoKD86XHMrW1x3XC1dKyg/OlxzKj0/XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pPi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUYWc6IC9ePFwvKFtcLUEtWmEtejAtOV9dKylbXj5dKj4vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjogLyg/OihbXC1BLVphLXowLTlfXSspXHMqPVxzKig/Oig/OiIoKD86XFwufFteIl0pKikiKXwoPzonKCg/OlxcLnxbXiddKSopJyl8KFtePlxzXSspKSl8KD86KFtcLUEtWmEtejAtOV9dKykoXHN8JCkrKS9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbEF0dHI6IC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3Jlc2l6ZXxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkL2kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29tbWVudChzdHJlYW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHN0cmVhbS5pbmRleE9mKCctLT4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfdG9rZW5zLkNvbW1lbnRUb2tlbihzdHJlYW0uc3Vic3RyKDQsIGluZGV4IC0gMSksIGluZGV4ICsgMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY2hhcnMoc3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBzdHJlYW0uaW5kZXhPZignPCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfdG9rZW5zLkNoYXJzVG9rZW4oaW5kZXggPj0gMCA/IGluZGV4IDogc3RyZWFtLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RhcnRUYWcoc3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kVGFnSW5kZXggPSBzdHJlYW0uaW5kZXhPZignPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFRhZ0luZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaChSRUdFWEVTLnN0YXJ0VGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBib29sZWFuQXR0cnMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN0ID0gbWF0Y2hbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXS5yZXBsYWNlKFJFR0VYRVMuYXR0ciwgZnVuY3Rpb24gKG1hdGNoLCBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoYXJndW1lbnRzWzJdIHx8IGFyZ3VtZW50c1szXSB8fCBhcmd1bWVudHNbNF0gfHwgYXJndW1lbnRzWzVdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1tuYW1lXSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzWzVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzW2FyZ3VtZW50c1s1XV0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbkF0dHJzW2FyZ3VtZW50c1s1XV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzW25hbWVdID0gYXJndW1lbnRzWzJdIHx8IGFyZ3VtZW50c1szXSB8fCBhcmd1bWVudHNbNF0gfHwgUkVHRVhFUy5maWxsQXR0ci50ZXN0KG5hbWUpICYmIG5hbWUgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0LnJlcGxhY2UobWF0Y2gsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdjogbmV3IF90b2tlbnMuU3RhcnRUYWdUb2tlbihtYXRjaFsxXSwgbWF0Y2hbMF0ubGVuZ3RoLCBhdHRycywgYm9vbGVhbkF0dHJzLCAhIW1hdGNoWzNdLCByZXN0LnJlcGxhY2UoL15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLCAnJykpIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgX3JldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoX3JldCkpID09PSAnb2JqZWN0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcmV0LnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGF0b21pY1RhZyhzdHJlYW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHN0YXJ0VGFnKHN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdCA9IHN0cmVhbS5zbGljZShzdGFydC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0Lm1hdGNoKG5ldyBSZWdFeHAoJzwvXFxzKicgKyBzdGFydC50YWdOYW1lICsgJ1xccyo+JywgJ2knKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gcmVzdC5tYXRjaChuZXcgUmVnRXhwKCcoW1xcc1xcU10qPyk8L1xccyonICsgc3RhcnQudGFnTmFtZSArICdcXHMqPicsICdpJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgX3Rva2Vucy5BdG9taWNUYWdUb2tlbihzdGFydC50YWdOYW1lLCBtYXRjaFswXS5sZW5ndGggKyBzdGFydC5sZW5ndGgsIHN0YXJ0LmF0dHJzLCBzdGFydC5ib29sZWFuQXR0cnMsIG1hdGNoWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlbmRUYWcoc3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBzdHJlYW0ubWF0Y2goUkVHRVhFUy5lbmRUYWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBfdG9rZW5zLkVuZFRhZ1Rva2VuKG1hdGNoWzFdLCBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5FbmRUYWdUb2tlbiA9IGV4cG9ydHMuQXRvbWljVGFnVG9rZW4gPSBleHBvcnRzLlN0YXJ0VGFnVG9rZW4gPSBleHBvcnRzLlRhZ1Rva2VuID0gZXhwb3J0cy5DaGFyc1Rva2VuID0gZXhwb3J0cy5Db21tZW50VG9rZW4gPSBleHBvcnRzLlRva2VuID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3V0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVG9rZW4gPSBleHBvcnRzLlRva2VuID0gZnVuY3Rpb24gVG9rZW4odHlwZSwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDb21tZW50VG9rZW4gPSBleHBvcnRzLkNvbW1lbnRUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENvbW1lbnRUb2tlbihjb250ZW50LCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tbWVudFRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSAnY29tbWVudCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGggfHwgKGNvbnRlbnQgPyBjb250ZW50Lmxlbmd0aCA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50VG9rZW4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8IS0tJyArIHRoaXMuY29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tbWVudFRva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDaGFyc1Rva2VuID0gZXhwb3J0cy5DaGFyc1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQ2hhcnNUb2tlbihsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2hhcnNUb2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gJ2NoYXJzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9rZW4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hhcnNUb2tlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVGFnVG9rZW4gPSBleHBvcnRzLlRhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVGFnVG9rZW4odHlwZSwgdGFnTmFtZSwgbGVuZ3RoLCBhdHRycywgYm9vbGVhbkF0dHJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRhZ1Rva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkF0dHJzID0gYm9vbGVhbkF0dHJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5hcnkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmh0bWw1VW5hcnkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhZ1Rva2VuLmZvcm1hdFRhZyA9IGZ1bmN0aW9uIGZvcm1hdFRhZyh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gJzwnICsgdG9rLnRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRvay5hdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rLmF0dHJzLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSAnICcgKyBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gdG9rLmF0dHJzW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRvay5ib29sZWFuQXR0cnMgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0b2suYm9vbGVhbkF0dHJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICc9IicgKyAoMCwgX3V0aWxzLmVzY2FwZVF1b3RlcykodmFsKSArICciJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rLnJlc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9ICcgJyArIHRvay5yZXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9rLnVuYXJ5ICYmICF0b2suaHRtbDVVbmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJy8+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gJz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGNvbnRlbnQgKyAnPC8nICsgdG9rLnRhZ05hbWUgKyAnPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRhZ1Rva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTdGFydFRhZ1Rva2VuID0gZXhwb3J0cy5TdGFydFRhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gU3RhcnRUYWdUb2tlbih0YWdOYW1lLCBsZW5ndGgsIGF0dHJzLCBib29sZWFuQXR0cnMsIHVuYXJ5LCByZXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXJ0VGFnVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9ICdzdGFydFRhZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ib29sZWFuQXR0cnMgPSBib29sZWFuQXR0cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5odG1sNVVuYXJ5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmFyeSA9IHVuYXJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdCA9IHJlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRhZ1Rva2VuLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUYWdUb2tlbi5mb3JtYXRUYWcodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXJ0VGFnVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEF0b21pY1RhZ1Rva2VuID0gZXhwb3J0cy5BdG9taWNUYWdUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEF0b21pY1RhZ1Rva2VuKHRhZ05hbWUsIGxlbmd0aCwgYXR0cnMsIGJvb2xlYW5BdHRycywgY29udGVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBBdG9taWNUYWdUb2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlID0gJ2F0b21pY1RhZyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJzID0gYXR0cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ib29sZWFuQXR0cnMgPSBib29sZWFuQXR0cnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmFyeSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHRtbDVVbmFyeSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNUYWdUb2tlbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGFnVG9rZW4uZm9ybWF0VGFnKHRoaXMsIHRoaXMuY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEF0b21pY1RhZ1Rva2VuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFbmRUYWdUb2tlbiA9IGV4cG9ydHMuRW5kVGFnVG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFbmRUYWdUb2tlbih0YWdOYW1lLCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW5kVGFnVG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9ICdlbmRUYWcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRUYWdUb2tlbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzwvJyArIHRoaXMudGFnTmFtZSArICc+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRW5kVGFnVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmVzY2FwZVF1b3RlcyA9IGVzY2FwZVF1b3RlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZXNjYXBlUXVvdGVzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdFZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdmFsdWUgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZS5yZXBsYWNlKC8oW14iXSopIi9nLCBmdW5jdGlvbiAoXywgcHJlZml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9cXC8udGVzdChwcmVmaXgpID8gcHJlZml4ICsgJyInIDogcHJlZml4ICsgJ1xcIic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHNbJ2RlZmF1bHQnXSA9IGZpeGVkUmVhZFRva2VuRmFjdG9yeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEVNUFRZID0gL14oQVJFQXxCQVNFfEJBU0VGT05UfEJSfENPTHxGUkFNRXxIUnxJTUd8SU5QVVR8SVNJTkRFWHxMSU5LfE1FVEF8UEFSQU18RU1CRUQpJC9pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQ0xPU0VTRUxGID0gL14oQ09MR1JPVVB8RER8RFR8TEl8T1BUSU9OU3xQfFREfFRGT09UfFRIfFRIRUFEfFRSKSQvaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gY29ycmVjdCh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2sgJiYgdG9rLnR5cGUgPT09ICdzdGFydFRhZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2sudW5hcnkgPSBFTVBUWS50ZXN0KHRvay50YWdOYW1lKSB8fCB0b2sudW5hcnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rLmh0bWw1VW5hcnkgPSAhL1wvPiQvLnRlc3QodG9rLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwZWVrVG9rZW4ocGFyc2VyLCByZWFkVG9rZW5JbXBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gcGFyc2VyLnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2sgPSBjb3JyZWN0KHJlYWRUb2tlbkltcGwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc3RyZWFtID0gdG1wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbG9zZUxhc3QocGFyc2VyLCBzdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvayA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnByZXBlbmQoJzwvJyArIHRvay50YWdOYW1lICsgJz4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuZXdTdGFjaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2subGFzdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmxhc3RUYWdOYW1lRXEgPSBmdW5jdGlvbiAodGFnTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gdGhpcy5sYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3QgJiYgbGFzdC50YWdOYW1lICYmIGxhc3QudGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suY29udGFpbnNUYWdOYW1lID0gZnVuY3Rpb24gKHRhZ05hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdG9rOyB0b2sgPSB0aGlzW2ldOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvay50YWdOYW1lID09PSB0YWdOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpeGVkUmVhZFRva2VuRmFjdG9yeShwYXJzZXIsIG9wdGlvbnMsIHJlYWRUb2tlbkltcGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFjayA9IG5ld1N0YWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFuZGxlcnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUYWc6IGZ1bmN0aW9uIHN0YXJ0VGFnKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFnTmFtZSA9IHRvay50YWdOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnVFInICYmIHN0YWNrLmxhc3RUYWdOYW1lRXEoJ1RBQkxFJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wcmVwZW5kKCc8VEJPRFk+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlTmV4dFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zZWxmQ2xvc2VGaXggJiYgQ0xPU0VTRUxGLnRlc3QodGFnTmFtZSkgJiYgc3RhY2suY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2subGFzdFRhZ05hbWVFcSh0YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTGFzdChwYXJzZXIsIHN0YWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnByZXBlbmQoJzwvJyArIHRvay50YWdOYW1lICsgJz4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlTmV4dFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRvay51bmFyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucHVzaCh0b2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUYWc6IGZ1bmN0aW9uIGVuZFRhZyh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3QgPSBzdGFjay5sYXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50YWdTb3VwRml4ICYmICFzdGFjay5sYXN0VGFnTmFtZUVxKHRvay50YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTGFzdChwYXJzZXIsIHN0YWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy50YWdTb3VwRml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVG9rZW5JbXBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwYXJlTmV4dFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcHJlcGFyZU5leHRUb2tlbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG9rID0gcGVla1Rva2VuKHBhcnNlciwgcmVhZFRva2VuSW1wbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvayAmJiBoYW5kbGVyc1t0b2sudHlwZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbdG9rLnR5cGVdKHRvayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZpeGVkUmVhZFRva2VuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBhcmVOZXh0VG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ycmVjdChyZWFkVG9rZW5JbXBsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIG9iajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuZXhpc3R5ID0gZXhpc3R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmVhY2ggPSBlYWNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmVhY2hLZXkgPSBlYWNoS2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmRlZmF1bHRzID0gZGVmYXVsdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMudG9BcnJheSA9IHRvQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMubGFzdCA9IGxhc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMuaXNUYWcgPSBpc1RhZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cy5pc1NjcmlwdCA9IGlzU2NyaXB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzLmlzU3R5bGUgPSBpc1N0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBleGlzdHkodGhpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGluZyAhPT0gdm9pZCAwICYmIHRoaW5nICE9PSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24oeCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT09IHR5cGVvZiB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVhY2goYXJyLCBmbiwgdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW4gPSBhcnIgJiYgYXJyLmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbCh0YXJnZXQsIGFycltpXSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZWFjaEtleShvYmosIGZuLCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uY2FsbCh0YXJnZXQsIGtleSwgb2JqW2tleV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZWZhdWx0cyhvcHRpb25zLCBfZGVmYXVsdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaEtleShfZGVmYXVsdHMsIGZ1bmN0aW9uIChrZXksIHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3R5KG9wdGlvbnNba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1trZXldID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdG9BcnJheShvYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9yZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaChvYmosIGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2OiByZXQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlb2YgX3JldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoX3JldCkpID09PSAnb2JqZWN0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXQudjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXNUYWcodG9rLCB0YWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdG9rIHx8ICEodG9rLnR5cGUgPT09ICdzdGFydFRhZycgfHwgdG9rLnR5cGUgPT09ICdhdG9taWNUYWcnKSB8fCAhKCd0YWdOYW1lJyBpbiB0b2spID8gITEgOiAhIX50b2sudGFnTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpc1NjcmlwdCh0b2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1RhZyh0b2ssICdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpc1N0eWxlKHRvaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzVGFnKHRvaywgJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL3VuZXNjYXBlSHRtbENvZGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaHRtbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuaW5uZXJIVE1MID0gaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC50ZXh0Q29udGVudCB8fCBlbC5pbm5lclRleHQgfHwgaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdG9ycy9kZWNvcmF0ZUdsb2JhbEphdmFTY3JpcHRDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb21pc2UgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKF8sIHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnPHNjcicgKyAnaXB0PlxuJyArIHNvdXJjZSArICdcbjwvc2NyJyArICdpcHQ+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlLnJlc29sdmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdG9ycy9kZWNvcmF0ZU5vbkdsb2JhbEphdmFTY3JpcHRDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb21pc2UgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFjdGlvbiwgc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcnVuU2NyaXB0Rm5OYW1lID0gJ19ydW5TY3JpcHQnICsgKytpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGVbcnVuU2NyaXB0Rm5OYW1lXSA9IGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NhdGVsbGl0ZVtydW5TY3JpcHRGbk5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvbWlzZShmdW5jdGlvbiAoX3Jlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNDgyOWJhMTJkZDJhNmI5NyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNDgyOWJhMTJkZDJhNmI5NykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrX2U5NmVmMGQ5NjE5ZTY4YzIubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc29sdmUoZm4uY2FsbChhY3Rpb24uZXZlbnQuZWxlbWVudCwgYWN0aW9uLmV2ZW50LCBhY3Rpb24uZXZlbnQudGFyZ2V0LCBQcm9taXNlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80ODI5YmExMmRkMmE2Yjk3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF80ODI5YmExMmRkMmE2Yjk3KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29kZSA9ICc8c2NyJyArICdpcHQ+X3NhdGVsbGl0ZVsiJyArIHJ1blNjcmlwdEZuTmFtZSArICciXShmdW5jdGlvbihldmVudCwgdGFyZ2V0LCBQcm9taXNlKSB7XG4nICsgc291cmNlICsgJ1xufSk7PC9zY3InICsgJ2lwdD4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IHByb21pc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2RlY29yYXRvcnMvZGVjb3JhdGVIdG1sQ29kZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBQcm9taXNlID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3ItcHJvbWlzZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2tJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBodG1sQ29kZVByb21pc2VzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlLl9vbkN1c3RvbUNvZGVTdWNjZXNzID0gZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlSGFuZGxlcnMgPSBodG1sQ29kZVByb21pc2VzW2NhbGxiYWNrSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9taXNlSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaHRtbENvZGVQcm9taXNlc1tjYWxsYmFja0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VIYW5kbGVycy5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlLl9vbkN1c3RvbUNvZGVGYWlsdXJlID0gZnVuY3Rpb24gKGNhbGxiYWNrSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlSGFuZGxlcnMgPSBodG1sQ29kZVByb21pc2VzW2NhbGxiYWNrSWRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9taXNlSGFuZGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgaHRtbENvZGVQcm9taXNlc1tjYWxsYmFja0lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VIYW5kbGVycy5yZWplY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlYWN0b3JDYWxsYmFja0lkU2hvdWxkQmVSZXBsYWNlZCA9IGZ1bmN0aW9uIChzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UuaW5kZXhPZignJHtyZWFjdG9yQ2FsbGJhY2tJZH0nKSAhPT0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBsYWNlQ2FsbGJhY2tzSWRzID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2tJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5yZXBsYWNlKC9cJHtyZWFjdG9yQ2FsbGJhY2tJZH0vZywgY2FsbGJhY2tJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NvdXJjZUxvYWRlZEZyb21GaWxlID0gZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbi5zZXR0aW5ncy5pc0V4dGVybmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhY3Rpb24sIHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU291cmNlTG9hZGVkRnJvbUZpbGUoYWN0aW9uKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHR1cmJpbmUucmVwbGFjZVRva2Vucyhzb3VyY2UsIGFjdGlvbi5ldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFjdG9yQ2FsbGJhY2tJZFNob3VsZEJlUmVwbGFjZWQoc291cmNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxDb2RlUHJvbWlzZXNbU3RyaW5nKGNhbGxiYWNrSWQpXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IHJlamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IHJlcGxhY2VDYWxsYmFja3NJZHMoc291cmNlLCBjYWxsYmFja0lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0lkICs9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IHByb21pc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2dldFNvdXJjZUJ5VXJsLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRTY3JpcHQgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1sb2FkLXNjcmlwdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVCeVNvdXJjZVVybCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2NyaXB0U3RvcmUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRTY3JpcHRPbmx5T25jZSA9IGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NyaXB0U3RvcmVbdXJsXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFN0b3JlW3VybF0gPSBsb2FkU2NyaXB0KHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NyaXB0U3RvcmVbdXJsXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5fX3JlZ2lzdGVyU2NyaXB0ID0gZnVuY3Rpb24gKHNvdXJjZVVybCwgY29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUJ5U291cmNlVXJsW3NvdXJjZVVybF0gPSBjb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzb3VyY2VVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlQnlTb3VyY2VVcmxbc291cmNlVXJsXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29kZUJ5U291cmNlVXJsW3NvdXJjZVVybF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFNjcmlwdE9ubHlPbmNlKHNvdXJjZVVybCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvZGVCeVNvdXJjZVVybFtzb3VyY2VVcmxdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9jcmVhdGVCdWJibHkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgV2Vha01hcCA9IHJlcXVpcmUoJy4vd2Vha01hcCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2hlc1Byb3BlcnRpZXMgPSByZXF1aXJlKCcuL21hdGNoZXNQcm9wZXJ0aWVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzU2VsZWN0b3IgPSByZXF1aXJlKCcuL21hdGNoZXNTZWxlY3RvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9jZXNzZWRFdmVudHMgPSBuZXcgV2Vha01hcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1YmJseSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24gKHNldHRpbmdzLCBjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogc2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUV2ZW50OiBmdW5jdGlvbiAoZXZlbnQsIGV2ZW50SXNTeW50aGV0aWMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NlZEV2ZW50cy5oYXMoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBldmVudC50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZEhhc1RyaWdnZXJlZFJ1bGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcmV2ZW50RXZhbHVhdGlvbk9uQW5jZXN0b3JzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbm9kZVRyaWdnZXJlZFJ1bGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50U2VsZWN0b3IgPSBsaXN0ZW5lci5zZXR0aW5ncy5lbGVtZW50U2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnRQcm9wZXJ0aWVzID0gbGlzdGVuZXIuc2V0dGluZ3MuZWxlbWVudFByb3BlcnRpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLnNldHRpbmdzLmJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQgPT09IGZhbHNlICYmIGNoaWxkSGFzVHJpZ2dlcmVkUnVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT09IGV2ZW50LnRhcmdldCAmJiBsaXN0ZW5lci5zZXR0aW5ncy5idWJibGVGaXJlSWZQYXJlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPT0gZXZlbnQudGFyZ2V0ICYmICFlbGVtZW50U2VsZWN0b3IgJiYgKCFlbGVtZW50UHJvcGVydGllcyB8fCAhT2JqZWN0LmtleXMoZWxlbWVudFByb3BlcnRpZXMpLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50U2VsZWN0b3IgJiYgIW1hdGNoZXNTZWxlY3Rvcihub2RlLCBlbGVtZW50U2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFByb3BlcnRpZXMgJiYgIW1hdGNoZXNQcm9wZXJ0aWVzKG5vZGUsIGVsZW1lbnRQcm9wZXJ0aWVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bnRoZXRpY0V2ZW50Rm9yQ2FsbGJhY2sgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRJc1N5bnRoZXRpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhldmVudCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudEZvckNhbGxiYWNrW2tleV0gPSBldmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudEZvckNhbGxiYWNrLm5hdGl2ZUV2ZW50ID0gZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50Rm9yQ2FsbGJhY2suZWxlbWVudCA9IG5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGhldGljRXZlbnRGb3JDYWxsYmFjay50YXJnZXQgPSBldmVudC50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrUmVzcG9uc2UgPSBsaXN0ZW5lci5jYWxsYmFjayhzeW50aGV0aWNFdmVudEZvckNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZVRyaWdnZXJlZCA9IGNhbGxiYWNrUmVzcG9uc2UgIT09IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlVHJpZ2dlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVUcmlnZ2VyZWRSdWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyLnNldHRpbmdzLmJ1YmJsZVN0b3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRFdmFsdWF0aW9uT25BbmNlc3RvcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZlbnRFdmFsdWF0aW9uT25BbmNlc3RvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVHJpZ2dlcmVkUnVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSGFzVHJpZ2dlcmVkUnVsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZEV2ZW50cy5zZXQoZXZlbnQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibHkuX19yZXNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnViYmx5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL3dlYWtNYXAuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2luZG93ID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3Itd2luZG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBXZWFrTWFwID0gd2luZG93LldlYWtNYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgV2Vha01hcCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3VudGVyID0gRGF0ZS5ub3coKSAlIDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFrTWFwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICdfX3N0JyArIChNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMCA+Pj4gMCkgKyAoY291bnRlcisrICsgJ19fJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vha01hcC5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5ICYmIGVudHJ5WzBdID09PSBrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVsxXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShrZXksIHRoaXMubmFtZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5ID0ga2V5W3RoaXMubmFtZV0pICYmIGVudHJ5WzBdID09PSBrZXkgPyBlbnRyeVsxXSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZTogZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRyeSB8fCBlbnRyeVswXSAhPT0ga2V5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeVswXSA9IGVudHJ5WzFdID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhczogZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBrZXlbdGhpcy5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5WzBdID09PSBrZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IFdlYWtNYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvaGVscGVycy9zdHJpbmdBbmROdW1iZXJVdGlscy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc051bWJlciA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNTdHJpbmcgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FzdFRvU3RyaW5nSWZOdW1iZXIgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc051bWJlcih2YWx1ZSkgPyBTdHJpbmcodmFsdWUpIDogdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXN0VG9OdW1iZXJJZlN0cmluZyA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSA/IE51bWJlcih2YWx1ZSkgOiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc051bWJlcjogaXNOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N0cmluZzogaXNTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0VG9TdHJpbmdJZk51bWJlcjogY2FzdFRvU3RyaW5nSWZOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0VG9OdW1iZXJJZlN0cmluZzogY2FzdFRvTnVtYmVySWZTdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9tYXRjaGVzUHJvcGVydGllcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0TWF0Y2ggPSByZXF1aXJlKCcuLy4uLy4uL2hlbHBlcnMvdGV4dE1hdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRFbGVtZW50UHJvcGVydHkgPSBmdW5jdGlvbiAoZWxlbWVudCwgcHJvcGVydHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ0B0ZXh0JyB8fCBwcm9wZXJ0eSA9PT0gJ2lubmVyVGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC50ZXh0Q29udGVudCB8fCBlbGVtZW50LmlubmVyVGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW4gZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50W3Byb3BlcnR5XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5nZXRBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUocHJvcGVydHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlbGVtZW50LCBwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmV2ZXJ5KGZ1bmN0aW9uIChwcm9wZXJ0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsVmFsdWUgPSBnZXRFbGVtZW50UHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjcml0ZXJpb25WYWx1ZSA9IHByb3BlcnR5LnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAocHJvcGVydHkudmFsdWUsICdpJykgOiBwcm9wZXJ0eS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHRNYXRjaChhY3R1YWxWYWx1ZSwgY3JpdGVyaW9uVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2hlbHBlcnMvbWF0Y2hlc1NlbGVjdG9yLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZWxlbWVudCwgc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXRjaGVzID0gZWxlbWVudC5tYXRjaGVzIHx8IGVsZW1lbnQubXNNYXRjaGVzU2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVzLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJpbmUubG9nZ2VyLndhcm4oJ01hdGNoaW5nIGVsZW1lbnQgZmFpbGVkLiAnICsgc2VsZWN0b3IgKyAnIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL2RlYm91bmNlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIGRlbGF5LCBjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltZW91dElkID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN0eCA9IGNvbnRleHQgfHwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkoY3R4LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL2VuYWJsZVdlYWtNYXBEZWZhdWx0VmFsdWUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh3ZWFrTWFwLCBkZWZhdWx0VmFsdWVGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxHZXQgPSB3ZWFrTWFwLmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtNYXAuZ2V0ID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd2Vha01hcC5oYXMoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrTWFwLnNldChrZXksIGRlZmF1bHRWYWx1ZUZhY3RvcnkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWFrTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL29uY2UuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZuLmFwcGx5KGNvbnRleHQgfHwgdGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2NzcE5vbmNlJzogJyVub25jZSUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdob3N0ZWRMaWJGaWxlc0Jhc2VVcmwnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVBhODI3MzJmZTc5ZGQ0NjEzOGIzMjkxZmM1NGU2YjhhMC8nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnYWRvYmUtbWNpZCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ0V4cGVyaWVuY2UgQ2xvdWQgSUQgU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLW1jaWQvc3JjL2xpYi9zaGFyZWRNb2R1bGVzL21jaWRJbnN0YW5jZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb2N1bWVudCA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWaXNpdG9yQVBJID0gcmVxdWlyZSgnLi4vY29kZUxpYnJhcnkvVmlzaXRvckFQSScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGltZVVuaXRzID0gcmVxdWlyZSgnLi4vLi4vdmlldy91dGlscy90aW1lVW5pdHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYW5zZm9ybUFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiAoY29uZmlncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRDb25maWcgPSBjb25maWdzLnJlZHVjZShmdW5jdGlvbiAob2JqLCBjb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAvXih0cnVlfGZhbHNlKSQvaS50ZXN0KGNvbmZpZy52YWx1ZSkgPyBKU09OLnBhcnNlKGNvbmZpZy52YWx1ZSkgOiBjb25maWcudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqW2NvbmZpZy5uYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdENvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRpYWxpemVWaXNpdG9ySWQgPSBmdW5jdGlvbiAoVmlzaXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuc2lvblNldHRpbmdzID0gdHVyYmluZS5nZXRFeHRlbnNpb25TZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25TZXR0aW5ncy5vcmdJZCAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdPcmcgSUQgaXMgbm90IGEgc3RyaW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRDb25maWcgPSB0cmFuc2Zvcm1BcnJheVRvT2JqZWN0KGV4dGVuc2lvblNldHRpbmdzLnZhcmlhYmxlcyB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9lc09wdEluQXBwbHkgPSBleHRlbnNpb25TZXR0aW5ncy5kb2VzT3B0SW5BcHBseTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2VzT3B0SW5BcHBseSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZG9lc09wdEluQXBwbHkgPT09ICdib29sZWFuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29uZmlnWydkb2VzT3B0SW5BcHBseSddID0gZG9lc09wdEluQXBwbHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChleHRlbnNpb25TZXR0aW5ncy5vcHRJbkNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWdbJ2RvZXNPcHRJbkFwcGx5J10gPSBleHRlbnNpb25TZXR0aW5ncy5vcHRJbkNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc09wdEluU3RvcmFnZUVuYWJsZWQgPSBleHRlbnNpb25TZXR0aW5ncy5pc09wdEluU3RvcmFnZUVuYWJsZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPcHRJblN0b3JhZ2VFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbmZpZ1snaXNPcHRJblN0b3JhZ2VFbmFibGVkJ10gPSBpc09wdEluU3RvcmFnZUVuYWJsZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0SW5Db29raWVEb21haW4gPSBleHRlbnNpb25TZXR0aW5ncy5vcHRJbkNvb2tpZURvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRJbkNvb2tpZURvbWFpbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWdbJ29wdEluQ29va2llRG9tYWluJ10gPSBvcHRJbkNvb2tpZURvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRJblN0b3JhZ2VFeHBpcnkgPSBleHRlbnNpb25TZXR0aW5ncy5vcHRJblN0b3JhZ2VFeHBpcnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0SW5TdG9yYWdlRXhwaXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVVbml0ID0gZXh0ZW5zaW9uU2V0dGluZ3MudGltZVVuaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVbml0ICYmIHRpbWVVbml0c1t0aW1lVW5pdF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZHMgPSBvcHRJblN0b3JhZ2VFeHBpcnkgKiB0aW1lVW5pdHNbdGltZVVuaXRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29uZmlnWydvcHRJblN0b3JhZ2VFeHBpcnknXSA9IHNlY29uZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc09wdEluU3RvcmFnZUVuYWJsZWQgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29uZmlnWydvcHRJblN0b3JhZ2VFeHBpcnknXSA9IDEzICogMzAgKiAyNCAqIDM2MDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNQZXJtaXNzaW9ucyA9IGV4dGVuc2lvblNldHRpbmdzLnByZXZpb3VzUGVybWlzc2lvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNQZXJtaXNzaW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWdbJ3ByZXZpb3VzUGVybWlzc2lvbnMnXSA9IHByZXZpb3VzUGVybWlzc2lvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlT3B0SW5BcHByb3ZhbHMgPSBleHRlbnNpb25TZXR0aW5ncy5wcmVPcHRJbkFwcHJvdmFsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVPcHRJbkFwcHJvdmFscykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWdbJ3ByZU9wdEluQXBwcm92YWxzJ10gPSBwcmVPcHRJbkFwcHJvdmFsczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByZU9wdEluQXBwcm92YWxJbnB1dCA9IGV4dGVuc2lvblNldHRpbmdzLnByZU9wdEluQXBwcm92YWxJbnB1dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlT3B0SW5BcHByb3ZhbElucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRDb25maWdbJ3ByZU9wdEluQXBwcm92YWxzJ10gPSBwcmVPcHRJbkFwcHJvdmFsSW5wdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSWFiQ29udGV4dCA9IGV4dGVuc2lvblNldHRpbmdzLmlzSWFiQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0lhYkNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Q29uZmlnWydpc0lhYkNvbnRleHQnXSA9IGlzSWFiQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IFZpc2l0b3IuZ2V0SW5zdGFuY2UoZXh0ZW5zaW9uU2V0dGluZ3Mub3JnSWQsIGluaXRDb25maWcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnQ3JlYXRlZCBpbnN0YW5jZSB1c2luZyBvcmdJZDogIicgKyBleHRlbnNpb25TZXR0aW5ncy5vcmdJZCArICciJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdTZXQgdmFyaWFibGVzOiAnICsgSlNPTi5zdHJpbmdpZnkoaW5pdENvbmZpZykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnT2J0YWluZWQgTWFya2V0aW5nIENsb3VkIFZpc2l0b3IgSWQ6ICcgKyBpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4Y2x1ZGVQYXRoc01hdGNoZWQgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuc2lvblNldHRpbmdzID0gdHVyYmluZS5nZXRFeHRlbnNpb25TZXR0aW5ncygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhFeGNsdXNpb25zID0gZXh0ZW5zaW9uU2V0dGluZ3MucGF0aEV4Y2x1c2lvbnMgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aEV4Y2x1c2lvbnMuc29tZShmdW5jdGlvbiAocGF0aEV4Y2x1c2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoRXhjbHVzaW9uLnZhbHVlSXNSZWdleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXRoRXhjbHVzaW9uLnZhbHVlLCAnaScpLnRlc3QocGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGhFeGNsdXNpb24udmFsdWUgPT09IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2aXNpdG9ySWRJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuZ2V0VmlzaXRvcklkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3JJZEluc3RhbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZVBhdGhzTWF0Y2hlZChkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJpbmUubG9nZ2VyLndhcm4oJ01DSUQgbGlicmFyeSBub3QgbG9hZGVkLiBPbmUgb2YgdGhlIHBhdGggZXhjbHVzaW9ucyBtYXRjaGVzIHRoZSAnICsgJ2N1cnJlbnQgcGF0aC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3JJZEluc3RhbmNlID0gaW5pdGlhbGl6ZVZpc2l0b3JJZChWaXNpdG9yQVBJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHZpc2l0b3JJZEluc3RhbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnbWNpZC1pbnN0YW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtbWNpZC9zcmMvbGliL2NvZGVMaWJyYXJ5L1Zpc2l0b3JBUEkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdAYmFiZWwvaGVscGVycyAtIHR5cGVvZic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gbiwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbZV0gPSB0aGlzLmNhbGxiYWNrc1tlXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuY2FsbGJhY2tzW2VdLnB1c2godCkgLSAxLCBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmNhbGxiYWNrc1tlXS5zcGxpY2UobiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrc1tlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdm9pZCAwID09PSB0ID8gW10gOiB0LCB0ID0gdCBpbnN0YW5jZW9mIEFycmF5ID8gdCA6IFt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB0aGlzLmNhbGxiYWNrc1tlXS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmNhbGxiYWNrc1tlXS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIG4gPyBuLmFwcGx5KG51bGwsIHQpIDogbiBpbnN0YW5jZW9mIEFycmF5ICYmIG5bMV0uYXBwbHkoblswXSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5jYWxsYmFja3NbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQWxsOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0IHx8IGUgJiYgIVUuaXNPYmplY3RFbXB0eShlKSkgJiYgT2JqZWN0LmtleXModGhpcy5jYWxsYmFja3MpLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2b2lkIDAgIT09IGVbdF0gPyBlW3RdIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihPYmplY3Qua2V5cyh0aGlzLmNhbGxiYWNrcykubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCA9PSBlID8gdm9pZCAwIDogZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gaSA/IG4gOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IC9eXGQrJC8sIG4gPSAwLCBpID0gZS5sZW5ndGg7IG4gPCBpOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQudGVzdChlW25dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBlLmxlbmd0aCA8IHQubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVzaCgnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdC5sZW5ndGggPCBlLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBwYXJzZUludChlW25dLCAxMCksIHIgPSBwYXJzZUludCh0W25dLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA+IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRvU3RyaW5nKCkuc3BsaXQoJy4nKSwgaSA9IHQudG9TdHJpbmcoKS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihuLmNvbmNhdChpKSkgPyAoYShuLCBpKSwgbyhuLCBpKSkgOiBOYU47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gT2JqZWN0KGUpICYmIDAgPT09IE9iamVjdC5rZXlzKGUpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBlIHx8IGUgaW5zdGFuY2VvZiBBcnJheSAmJiBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6ICcnLCB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cgPSBJZSgnbG9nJywgZSwgdCksIHRoaXMud2FybiA9IEllKCd3YXJuJywgZSwgdCksIHRoaXMuZXJyb3IgPSBJZSgnZXJyb3InLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHt9LCB0ID0gZS5jb29raWVOYW1lLCBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7fSwgaSA9IG4uY29va2llczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICFpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IE5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogTmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBOZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnJlbW92ZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGkuZ2V0KHQpLCBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHIuZ2V0KCksIG8gPSBPYmplY3QuYXNzaWduKGEsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0KHQsIEpTT04uc3RyaW5naWZ5KG8pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogbi5vcHRJbkNvb2tpZURvbWFpbiB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llTGlmZXRpbWU6IG4ub3B0SW5TdG9yYWdlRXhwaXJ5IHx8IDM0MTkwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSwgdGhpcy5tZXNzYWdlID0gZSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UgPyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKSA6IHRoaXMuc3RhY2sgPSBuZXcgRXJyb3IoZSkuc3RhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBBZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmxlbmd0aCA/IG4uZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTShBKSwgTyhkZS5DT01QTEVURSksIF8oaC5zdGF0dXMsIGgucGVybWlzc2lvbnMpLCBzICYmIG0uc2V0KGgucGVybWlzc2lvbnMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJbkNvb2tpZURvbWFpbjogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJblN0b3JhZ2VFeHBpcnk6IHUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBDLmV4ZWN1dGUoSGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFNZShuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbT3B0SW5dIEludmFsaWQgY2F0ZWdvcnkoLWllcykuIFBsZWFzZSB1c2UgdGhlIGBPcHRJbi5DYXRlZ29yaWVzYCBlbnVtLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPKGRlLkNIQU5HRUQpLCBPYmplY3QuYXNzaWduKEEsIGtlKEFlKG4pLCBlKSksIGkgfHwgdCgpLCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHIgPSBpLmRvZXNPcHRJbkFwcGx5LCBhID0gaS5wcmV2aW91c1Blcm1pc3Npb25zLCBvID0gaS5wcmVPcHRJbkFwcHJvdmFscywgcyA9IGkuaXNPcHRJblN0b3JhZ2VFbmFibGVkLCBjID0gaS5vcHRJbkNvb2tpZURvbWFpbiwgdSA9IGkub3B0SW5TdG9yYWdlRXhwaXJ5LCBsID0gaS5pc0lhYkNvbnRleHQsIGYgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHt9LCBwID0gZi5jb29raWVzLCBnID0geGUoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlKGcsICdJbnZhbGlkIGBwcmV2aW91c1Blcm1pc3Npb25zYCEnKSwgRmUobywgJ0ludmFsaWQgYHByZU9wdEluQXBwcm92YWxzYCEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBkKHsgY29va2llTmFtZTogJ2Fkb2JldWpzLW9wdGluJyB9LCB7IGNvb2tpZXM6IHAgfSksIGggPSB0aGlzLCBfID0gbGUoaCksIEMgPSBfZSgpLCBTID0gTGUoZyksIEkgPSBMZShvKSwgdiA9IHMgPyBtLmdldCgpIDoge30sIEQgPSB7fSwgeSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBlKGUpIHx8IHQgJiYgUGUodCkgPyBkZS5DT01QTEVURSA6IGRlLlBFTkRJTkc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KFMsIHYpLCBiID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGtlKGhlLCAhcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPyBPYmplY3QuYXNzaWduKHt9LCBpLCBlLCB0LCBuKSA6IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KEksIFMsIHYpLCBBID0gRWUoYiksIE8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguZGVueSA9IG4oITEpLCBoLmFwcHJvdmUgPSBuKCEwKSwgaC5kZW55QWxsID0gaC5kZW55LmJpbmQoaCwgaGUpLCBoLmFwcHJvdmVBbGwgPSBoLmFwcHJvdmUuYmluZChoLCBoZSksIGguaXNBcHByb3ZlZCA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0LCBoLnBlcm1pc3Npb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaC5pc1ByZUFwcHJvdmVkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHQsIEkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBoLmZldGNoUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV0sIG4gPSB0ID8gaC5vbihkZS5DT01QTEVURSwgZSkgOiBOZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhciB8fCByICYmIGguaXNDb21wbGV0ZSB8fCAhIW8gPyBlKGgucGVybWlzc2lvbnMpIDogdCB8fCBDLmFkZChIZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKGgucGVybWlzc2lvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGguY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLnN0YXR1cyA9PT0gZGUuQ0hBTkdFRCAmJiB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGgucmVnaXN0ZXJQbHVnaW4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLm5hbWUgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZS5vblJlZ2lzdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihCZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEW2UubmFtZV0gfHwgKERbZS5uYW1lXSA9IGUsIGUub25SZWdpc3Rlci5jYWxsKGUsIGgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaC5leGVjdXRlID0gVWUoRCksIGgubWVtb2l6ZUNvbnRlbnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UoZSkgJiYgbS5zZXQoZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEluQ29va2llRG9tYWluOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEluU3RvcmFnZUV4cGlyeTogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGguZ2V0TWVtb2l6ZWRDb250ZW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhoLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yaWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc09wdEluQXBwbHk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQZW5kaW5nOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoLnN0YXR1cyA9PT0gZGUuUEVORElORzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5zdGF0dXMgPT09IGRlLkNPTVBMRVRFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BsdWdpbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lhYkNvbnRleHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbnVsbCwgZS5jYWxsKGUsIG5ldyBmKCdUaGUgY2FsbCB0b29rIGxvbmdlciB0aGFuIHlvdSB3YW50ZWQhJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIChjbGVhclRpbWVvdXQociksIGUuYXBwbHkoZSwgYXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHNldFRpbWVvdXQobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fdGNmYXBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5fX3RjZmFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB3aW5kb3cudG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgeWUuZXJyb3IoJ19fdGNmYXBpIG5vdCBmb3VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0OyAhdDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mcmFtZXMuX190Y2ZhcGlMb2NhdG9yICYmICh0ID0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gd2luZG93LnRvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCB5ZS5lcnJvcignX190Y2ZhcGkgbm90IGZvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuX190Y2ZhcGkgPSBmdW5jdGlvbiAoZSwgaSwgciwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBNYXRoLnJhbmRvbSgpICsgJycsIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGNmYXBpQ2FsbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW29dID0gciwgdC5wb3N0TWVzc2FnZShzLCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gSlNPTi5wYXJzZShlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5fX3RjZmFwaVJldHVybikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5fX3RjZmFwaVJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBuW2kuY2FsbElkXSAmJiAobltpLmNhbGxJZF0oaS5yZXR1cm5WYWx1ZSwgaS5zdWNjZXNzKSwgZGVsZXRlIG5baS5jYWxsSWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpLCB3aW5kb3cuX190Y2ZhcGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDogW10sIGkgPSAhMCA9PT0gZS52ZW5kb3IuY29uc2VudHNbdF0sIHIgPSBuLmV2ZXJ5KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlLnB1cnBvc2UuY29uc2VudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5hbWUgPSAnaWFiUGx1Z2luJywgZS52ZXJzaW9uID0gJzAuMC4yJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBfZSgpLCBpID0geyB0cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YTogbnVsbCB9LCByID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbZV0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mZXRjaENvbnNlbnREYXRhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5jYWxsYmFjaywgbiA9IGUudGltZW91dCwgaSA9IGcodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKHsgY2FsbGJhY2s6IGkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuaXNBcHByb3ZlZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuY2FsbGJhY2ssIG4gPSBlLmNhdGVnb3J5LCByID0gZS50aW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQobnVsbCwgaChpLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhLCBwZVtuXSwgZ2Vbbl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZyhmdW5jdGlvbiAoZSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSwgaChpLCBwZVtuXSwgZ2Vbbl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLm9uUmVnaXN0ZXIgPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5rZXlzKHBlKSwgciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFlICYmIHQgJiYgKGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBoKHQsIHBlW2VdLCBnZVtlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW2kgPyAnYXBwcm92ZScgOiAnZGVueSddKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4uY29tcGxldGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZmV0Y2hDb25zZW50RGF0YSh7IGNhbGxiYWNrOiByIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShudWxsLCBpLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFkZCgnRkVUQ0hfQ09OU0VOVF9EQVRBJywgYSksIG8oZnVuY3Rpb24gKGUsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gRWUoZSksIHMgPSB0LmdldE1lbW9pemVkQ29udGVudCgnaWFiQ29uc2VudEhhc2gnKSwgYyA9IERlKG8udGNTdHJpbmcpLnRvU3RyaW5nKDMyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29uc2VudFN0cmluZyA9IGUudGNTdHJpbmcsIG8uaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsID0gcyAhPT0gYywgcigndHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEnLCBvKSwgdC5tZW1vaXplQ29udGVudCh7IGlhYkNvbnNlbnRIYXNoOiBjIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZXhlY3V0ZSgnRkVUQ0hfQ09OU0VOVF9EQVRBJywgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFZlKHBlKSwgbiA9IG0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBuICYmIG4oJ2dldFRDRGF0YScsIDIsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGdsb2JhbCA/IGdsb2JhbCA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBzZWxmID8gc2VsZiA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIG4sIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gYXJndW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHQpICYmIChlW3RdID0gblt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUywgSSwgdiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRTSEFLRTogJ0hBTkRTSEFLRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRTVEFURTogJ0dFVFNUQVRFJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkVOVFNUQVRFOiAnUEFSRU5UU1RBVEUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogJ01DTUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUlEOiAnTUNBSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1COiAnTUNBQU1CJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdNQ0FBTUxIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnTUNPUFRPVVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VTVE9NRVJJRFM6ICdDVVNUT01FUklEUycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DTUlEOiAnZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBSUQ6ICdnZXRBbmFseXRpY3NWaXNpdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1COiAnZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiAnZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnaXNPcHRlZE91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExGSUVMRFM6ICdnZXRWaXNpdG9yVmFsdWVzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBiID0geyBDVVNUT01FUklEUzogJ2dldEN1c3RvbWVySURzJyB9LCBBID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNNSUQ6ICdnZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICdnZXRBdWRpZW5jZU1hbmFnZXJCbG9iJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdnZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPUFRPVVQ6ICdpc09wdGVkT3V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUlEOiAnZ2V0QW5hbHl0aWNzVmlzaXRvcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTUVSSURTOiAnZ2V0Q3VzdG9tZXJJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxMRklFTERTOiAnZ2V0VmlzaXRvclZhbHVlcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DOiAnTUNNSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogJ01DQUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTTogJ01DQUFNQicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DTUlEOiAnTUNNSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPUFRPVVQ6ICdNQ09QVE9VVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FJRDogJ01DQUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdNQ0FBTUxIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogJ01DQUFNQicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgayA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOS05PV046IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVEVEOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VEX09VVDogMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBFID0geyBHTE9CQUw6ICdnbG9iYWwnIH0sIFQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVg6ICdMYXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSUNUOiAnU3RyaWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTkU6ICdOb25lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBMID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVTU0FHRVM6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFURV9LRVlTX01BUDogRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTWU5DX0FQSV9NQVA6IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU5DX0FQSV9NQVA6IGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExfQVBJUzogQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxER1JPVVBfVE9fRklFTEQ6IE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRFM6IE0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIX1NUQVRFOiBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVDogRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTUVfU0lURV9WQUxVRVM6IFQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUCA9IEwuU1RBVEVfS0VZU19NQVAsIFIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUoMCwgdCksIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbdF0gPSByLCBpLnNldFN0YXRlQW5kUHVibGlzaChhKSwgbihyKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuZmluZEZpZWxkKFAuTUNNSUQsIGUpLCByID0gbi5jYWxsKHRoaXMsIFAuTUNNSUQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IGkgPyBpIDogcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5nZXRWaXNpdG9yVmFsdWVzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoeyBNQ01JRDogdCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHcgPSBMLk1FU1NBR0VTLCBOID0gTC5BU1lOQ19BUElfTUFQLCB4ID0gTC5TWU5DX0FQSV9NQVAsIEYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNhbGxiYWNrUmVnaXN0cnkuYWRkKGUsIHQpLCBuLm1lc3NhZ2VQYXJlbnQody5HRVRTVEFURSksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW05bbl1dID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgfHwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLmZpbmRGaWVsZChuLCBpKSwgYSA9IHQuY2FsbCh0aGlzLCBuLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gciA/IHIgOiBhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbeFt0XV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRGaWVsZCh0LCBlKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoTikuZm9yRWFjaChuLCB0aGlzKSwgT2JqZWN0LmtleXMoeCkuZm9yRWFjaChpLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaiA9IEwuQVNZTkNfQVBJX01BUCwgViA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGopLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2pbZV1dID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1JlZ2lzdHJ5LmFkZChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSB7IGV4cG9ydHM6IHt9IH0sIGUodCwgdC5leHBvcnRzKSwgdC5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzT2JqZWN0RW1wdHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBPYmplY3QoZSkgJiYgMCA9PT0gT2JqZWN0LmtleXMoZSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5pc1ZhbHVlRW1wdHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyA9PT0gZSB8fCBuLmlzT2JqZWN0RW1wdHkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuYXZpZ2F0b3IuYXBwTmFtZSwgdCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXInID09PSBlIHx8IHQuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHQuaW5kZXhPZignVHJpZGVudC8nKSA+PSAwICYmIHQuaW5kZXhPZignV2luZG93cyBOVCA2JykgPj0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmdldEllVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRNb2RlID8gZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDogaSgpID8gNyA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLmVuY29kZUFuZEJ1aWxkUmVxdWVzdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4uaXNPYmplY3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSB0ICYmICdvYmplY3QnID09PSBlKHQpICYmICExID09PSBBcnJheS5pc0FycmF5KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5kZWZpbmVHbG9iYWxOYW1lc3BhY2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5hZG9iZSA9IG4uaXNPYmplY3Qod2luZG93LmFkb2JlKSA/IHdpbmRvdy5hZG9iZSA6IHt9LCB3aW5kb3cuYWRvYmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnBsdWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbbl0gJiYgKHRbbl0gPSBlW25dKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ucGFyc2VPcHRPdXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgfHwgKHQgPSBuLCBlLmRfb3B0b3V0ICYmIGUuZF9vcHRvdXQgaW5zdGFuY2VvZiBBcnJheSAmJiAodCA9IGUuZF9vcHRvdXQuam9pbignLCcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBwYXJzZUludChlLmRfb3R0bCwgMTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihpKSAmJiAoaSA9IDcyMDApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdE91dDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9vdHRsOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ubm9ybWFsaXplQm9vbGVhbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IGUgPyB0ID0gITAgOiAnZmFsc2UnID09PSBlICYmICh0ID0gITEpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEggPSAoVS5pc09iamVjdEVtcHR5LCBVLmlzVmFsdWVFbXB0eSwgVS5nZXRJZVZlcnNpb24sIFUuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0LCBVLmlzT2JqZWN0LCBVLmRlZmluZUdsb2JhbE5hbWVzcGFjZSwgVS5wbHVjaywgVS5wYXJzZU9wdE91dCwgVS5ub3JtYWxpemVCb29sZWFuLCBuKSwgQiA9IEwuTUVTU0FHRVMsIEcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOiAncHJlZml4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6ICdvcmdJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiAnc3RhdGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGF0YS5zcGxpdCgnfCcpLmZvckVhY2goZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W0dbbl1dID0gMiAhPT0gbiA/IGUgOiBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5pc0ludmFsaWQgPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5wYXJzZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgT2JqZWN0LmtleXMoaSkubGVuZ3RoIDwgMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZSAhPT0gaS5vcmdJRCwgYSA9ICF0IHx8IG4ub3JpZ2luICE9PSB0LCBvID0gLTEgPT09IE9iamVjdC5rZXlzKEIpLmluZGV4T2YoaS5wcmVmaXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByIHx8IGEgfHwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VuZCA9IGZ1bmN0aW9uIChuLCBpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpICsgJ3wnICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIHIgPT09IE9iamVjdChyKSAmJiAoYSArPSAnfCcgKyBKU09OLnN0cmluZ2lmeShyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5wb3N0TWVzc2FnZShhLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcSA9IEwuTUVTU0FHRVMsIFggPSBmdW5jdGlvbiAoZSwgdCwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihwLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocC5zdGF0ZSwgZSksIE9iamVjdC5hc3NpZ24ocC5zdGF0ZS5BTExGSUVMRFMsIGUpLCBwLmNhbGxiYWNrUmVnaXN0cnkuZXhlY3V0ZUFsbChwLnN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaC5pc0ludmFsaWQoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGgucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuc2V0U3RhdGVBbmRQdWJsaXNoKHQuc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtICYmIGcgJiYgKG0gPSAhMCwgaC5zZW5kKGksIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuZXcgUihuLl9nZW5lcmF0ZUlEKSksIHAuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKSwgcC5jYWxsYmFja1JlZ2lzdHJ5LmV4ZWN1dGVBbGwocC5zdGF0ZSwgITApLCBDLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaC5pc0ludmFsaWQoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBoLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gITEsIEMuY2xlYXJUaW1lb3V0KHAuX2hhbmRzaGFrZVRpbWVvdXQpLCBDLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB1KSwgcihuZXcgRihwKSksIEMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG8pLCBwLnNldFN0YXRlQW5kUHVibGlzaCh0LnN0YXRlKSwgcC5jYWxsYmFja1JlZ2lzdHJ5Lmhhc0NhbGxiYWNrcygpICYmIHMocS5HRVRTVEFURSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICYmIHBvc3RNZXNzYWdlID8gKEMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHUpLCBzKHEuSEFORFNIQUtFKSwgcC5faGFuZHNoYWtlVGltZW91dCA9IHNldFRpbWVvdXQoYywgMjUwKSkgOiBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMuc19jX2luIHx8IChDLnNfY19pbCA9IFtdLCBDLnNfY19pbiA9IDApLCBwLl9jID0gJ1Zpc2l0b3InLCBwLl9pbCA9IEMuc19jX2lsLCBwLl9pbiA9IEMuc19jX2luLCBwLl9pbFtwLl9pbl0gPSBwLCBDLnNfY19pbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAhPT0gZS5pbmRleE9mKCdfJykgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbltlXSAmJiAocFtlXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZSksIHAuZ2V0U3VwcGxlbWVudGFsRGF0YUlEID0gbi5nZXRTdXBwbGVtZW50YWxEYXRhSUQsIHAuaXNBbGxvd2VkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gdGhpcywgZyA9IHQud2hpdGVsaXN0UGFyZW50RG9tYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zdGF0ZSA9IHsgQUxMRklFTERTOiB7fSB9LCBwLnZlcnNpb24gPSBuLnZlcnNpb24sIHAubWFya2V0aW5nQ2xvdWRPcmdJRCA9IGUsIHAuY29va2llRG9tYWluID0gbi5jb29raWVEb21haW4gfHwgJycsIHAuX2luc3RhbmNlVHlwZSA9ICdjaGlsZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9ICExLCBoID0gbmV3IFkoZSwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmNhbGxiYWNrUmVnaXN0cnkgPSBIKCksIHAuaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKCksIGYoKSwgcihuZXcgVihwKSksIGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAuZmluZEZpZWxkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBwLnN0YXRlW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChwLnN0YXRlW2VdKSwgcC5zdGF0ZVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAubWVzc2FnZVBhcmVudCA9IHMsIHAuc2V0U3RhdGVBbmRQdWJsaXNoID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVyA9IEwuTUVTU0FHRVMsIEsgPSBMLkFMTF9BUElTLCBKID0gTC5BU1lOQ19BUElfTUFQLCB6ID0gTC5GSUVMREdST1VQX1RPX0ZJRUxELCBRID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoSykuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IEtbbl0sIHIgPSBlW2ldKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUuaXNWYWx1ZUVtcHR5KHIpIHx8ICh0W25dID0gcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuX2xvYWRpbmcgJiYgT2JqZWN0LmtleXMoZS5fbG9hZGluZykuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5fbG9hZGluZ1tuXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB6W25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQubGVuZ3RoID8gdCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gbihyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBKW2FbMF1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtvXShuLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNlbmQoZSwgaSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGUpLCBhKGUsIFcuSEFORFNIQUtFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKGUsIFcuUEFSRU5UU1RBVEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsKGUsIGkpLCB0LnNlbmQobiwgVy5QQVJFTlRTVEFURSwgeyBDVVNUT01FUklEUzogZS5nZXRDdXN0b21lcklEcygpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuc2V0Q3VzdG9tZXJJRHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRDdXN0b21lcklEcyA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQuaXNJbnZhbGlkKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0LnBhcnNlKGUpLnByZWZpeCA9PT0gVy5IQU5EU0hBS0UgPyBvIDogcykoZS5zb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZV0gPSBuLCByKyssIHIgPT09IGEgJiYgdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fSwgciA9IDAsIGEgPSBPYmplY3Qua2V5cyhlKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gaS5hcmdzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnVuc2hpZnQobih0KSksIGkuZm4uYXBwbHkoaS5jb250ZXh0IHx8IG51bGwsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBaID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAoJzsnICsgZG9jdW1lbnQuY29va2llKS5zcGxpdCgnICcpLmpvaW4oJzsnKSwgbiA9IHQuaW5kZXhPZignOycgKyBlICsgJz0nKSwgaSA9IG4gPCAwID8gbiA6IHQuaW5kZXhPZignOycsIG4gKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyAnJyA6IGRlY29kZVVSSUNvbXBvbmVudCh0LnN1YnN0cmluZyhuICsgMiArIGUubGVuZ3RoLCBpIDwgMCA/IHQubGVuZ3RoIDogaSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGkobiwgJ2Nvb2tpZUxpZmV0aW1lJyksIGEgPSBpKG4sICdleHBpcmVzJyksIG8gPSBpKG4sICdkb21haW4nKSwgcyA9IGkobiwgJ3NlY3VyZScpLCBjID0gaShuLCAnc2FtZVNpdGUnKSwgdSA9IHMgPyAnU2VjdXJlJyA6ICcnLCBsID0gYyA/ICdTYW1lU2l0ZT0nICsgYyArICc7JyA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmICdTRVNTSU9OJyAhPT0gciAmJiAnTk9ORScgIT09IHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAnJyAhPT0gdCA/IHBhcnNlSW50KHIgfHwgMCwgMTApIDogLTYwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBuZXcgRGF0ZSgpLCBhLnNldFRpbWUoYS5nZXRUaW1lKCkgKyAxMDAwICogZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKDEgPT09IGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLmdldFllYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0WWVhcihmICsgMiArIChmIDwgMTkwMCA/IDE5MDAgOiAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ05PTkUnICE9PSByID8gKGRvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChlKSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0KSArICc7IHBhdGg9LzsnICsgKGEgPyAnIGV4cGlyZXM9JyArIGEudG9HTVRTdHJpbmcoKSArICc7JyA6ICcnKSArIChvID8gJyBkb21haW49JyArIG8gKyAnOycgOiAnJykgKyBsICsgdSwgdGhpcy5nZXQoZSkgPT09IHQpIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBpKHQsICdkb21haW4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiA/ICcgZG9tYWluPScgKyBuICsgJzsnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKHQsICdzZWN1cmUnKSwgYSA9IGkodCwgJ3NhbWVTaXRlJyksIG8gPSByID8gJ1NlY3VyZScgOiAnJywgcyA9IGEgPyAnU2FtZVNpdGU9JyArIGEgKyAnOycgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBlbmNvZGVVUklDb21wb25lbnQoZSkgKyAnPTsgUGF0aD0vOyBFeHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UOycgKyBuICsgcyArIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGVlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWUgJiYgQy5sb2NhdGlvbiAmJiAoZSA9IEMubG9jYXRpb24uaG9zdG5hbWUpLCBuID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCByID0gbi5zcGxpdCgnLicpLCBhID0gdCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHIubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZG9tYWluID0gci5zbGljZShpKS5qb2luKCcuJyksIFouc2V0KCd0ZXN0JywgJ2Nvb2tpZScsIGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWi5yZW1vdmUoJ3Rlc3QnLCBhKSwgYS5kb21haW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZTogcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTGVzc1RoYW46IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSwgdCkgPCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZVZlcnNpb25zRGlmZmVyZW50OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSBzKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR3JlYXRlclRoYW46IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSwgdCkgPiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXF1YWw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IHMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5lID0gISFDLnBvc3RNZXNzYWdlLCBpZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RNZXNzYWdlOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChuZSA/IG4ucG9zdE1lc3NhZ2UoZSwgdC5yZXBsYWNlKC8oW146XSs6XC9cL1teXC9dKykuKi8sICckMScpKSA6IHQgJiYgKG4ubG9jYXRpb24gPSB0LnJlcGxhY2UoLyMuKiQvLCAnJykgKyAnIycgKyArbmV3IERhdGUoKSArIGkrKyArICcmJyArIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlTWVzc2FnZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZSAmJiAoZSAmJiAobiA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgbi5vcmlnaW4gIT09IHQgfHwgJ1tvYmplY3QgRnVuY3Rpb25dJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpICYmICExID09PSB0KG4ub3JpZ2luKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgQy5hZGRFdmVudExpc3RlbmVyID8gQ1tlID8gJ2FkZEV2ZW50TGlzdGVuZXInIDogJ3JlbW92ZUV2ZW50TGlzdGVuZXInXSgnbWVzc2FnZScsIG4pIDogQ1tlID8gJ2F0dGFjaEV2ZW50JyA6ICdkZXRhY2hFdmVudCddKCdvbm1lc3NhZ2UnLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGkgPSAnMDEyMzQ1Njc4OScsIHIgPSAnJywgYSA9ICcnLCBvID0gOCwgcyA9IDEwLCBjID0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpICs9ICdBQkNERUYnLCB0ID0gMDsgMTYgPiB0OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBvKSwgciArPSBpLnN1YnN0cmluZyhuLCBuICsgMSksIG4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBvKSwgYSArPSBpLnN1YnN0cmluZyhuLCBuICsgMSksIG8gPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciArICctJyArIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyAxOSA+IHQ7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcyksIHIgKz0gaS5zdWJzdHJpbmcobiwgbiArIDEpLCAwID09PSB0ICYmIDkgPT0gbiA/IHMgPSAzIDogKDEgPT0gdCB8fCAyID09IHQpICYmIDEwICE9IHMgJiYgMiA+IG4gPyBzID0gMTAgOiAyIDwgdCAmJiAocyA9IDEwKSwgbiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGMpLCBhICs9IGkuc3Vic3RyaW5nKG4sIG4gKyAxKSwgMCA9PT0gdCAmJiA5ID09IG4gPyBjID0gMyA6ICgxID09IHQgfHwgMiA9PSB0KSAmJiAxMCAhPSBjICYmIDIgPiBuID8gYyA9IDEwIDogMiA8IHQgJiYgKGMgPSAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciArIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGFlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc01ldGFkYXRhOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfMjMwMTU3MDQwNWRiNjhiYSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpLCAkX19fb2xkXzcwMWQ2NTJmOWRhNDU1MWUgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzIzMDE1NzA0MDVkYjY4YmEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYmVhY2RmY2I3YmRhYjcxYS5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNzAxZDY1MmY5ZGE0NTUxZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19iZWFjZGZjYjdiZGFiNzFhLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJ25vbmUnLCB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCAmJiBYTUxIdHRwUmVxdWVzdCA9PT0gT2JqZWN0KFhNTEh0dHBSZXF1ZXN0KSAmJiAoJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KCkgPyBlID0gJ1hNTEh0dHBSZXF1ZXN0JyA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBYRG9tYWluUmVxdWVzdCAmJiBYRG9tYWluUmVxdWVzdCA9PT0gT2JqZWN0KFhEb21haW5SZXF1ZXN0KSAmJiAodCA9ICExKSwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEMuSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgPiAwICYmICh0ID0gITEpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzVHlwZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc0Nvb2tpZXNFbmFibGVkOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzIzMDE1NzA0MDVkYjY4YmEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8yMzAxNTcwNDA1ZGI2OGJhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF83MDFkNjUyZjlkYTQ1NTFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfNzAxZDY1MmY5ZGE0NTUxZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENPUlNJbnN0YW5jZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzJkMDU5MTY4Zjg0ZDlhZmYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnKSwgJF9fX29sZF9hNTM5MTA1MjM1ZTYwOWM1ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yZDA1OTE2OGY4NGQ5YWZmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2JlYWNkZmNiN2JkYWI3MWEuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2E1MzkxMDUyMzVlNjA5YzUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX21vY2tfYmVhY2RmY2I3YmRhYjcxYS5YTUxIdHRwUmVxdWVzdCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ25vbmUnID09PSB0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSA/IG51bGwgOiBuZXcgQ1t0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZV0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzJkMDU5MTY4Zjg0ZDlhZmYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF8yZDA1OTE2OGY4NGQ5YWZmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9hNTM5MTA1MjM1ZTYwOWM1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfYTUzOTEwNTIzNWU2MDljNSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlQ09SUzogZnVuY3Rpb24gKHQsIG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChuID0gSlNPTi5wYXJzZShlKSkgIT09IE9iamVjdChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYS5oYW5kbGVDT1JTRXJyb3IodCwgbnVsbCwgJ1Jlc3BvbnNlIGlzIG5vdCBKU09OJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgYS5oYW5kbGVDT1JTRXJyb3IodCwgZSwgJ0Vycm9yIHBhcnNpbmcgcmVzcG9uc2UgYXMgSlNPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdC5jYWxsYmFjaywgciA9IEMsIG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHJbaVtvXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhbmRsZUNPUlNFcnJvcih0LCBlLCAnRXJyb3IgZm9ybWluZyBjYWxsYmFjayBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAodC5sb2FkRXJyb3JIYW5kbGVyID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRoaXMuZ2V0Q09SU0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLm9wZW4oJ2dldCcsIHQuY29yc1VybCArICcmdHM9JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCAhMCksICdYTUxIdHRwUmVxdWVzdCcgPT09IHRoaXMuY29yc01ldGFkYXRhLmNvcnNUeXBlICYmIChvLndpdGhDcmVkZW50aWFscyA9ICEwLCBvLnRpbWVvdXQgPSBlLmxvYWRUaW1lb3V0LCBvLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKSwgby5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9PT0gdGhpcy5yZWFkeVN0YXRlICYmIDIwMCA9PT0gdGhpcy5zdGF0dXMgJiYgcih0aGlzLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhbmRsZUNPUlNFcnJvcih0LCBlLCAnb25lcnJvcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5vbnRpbWVvdXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaGFuZGxlQ09SU0Vycm9yKHQsIGUsICdvbnRpbWVvdXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8uc2VuZCgpLCBlLl9sb2cucmVxdWVzdHMucHVzaCh0LmNvcnNVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNPUlNFcnJvcih0LCBlLCAndHJ5LWNhdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNPUlNFcnJvcjogZnVuY3Rpb24gKHQsIG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5DT1JTRXJyb3JzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc0RhdGE6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmxvYWRFcnJvckhhbmRsZXIgJiYgKCdvbnRpbWVvdXQnID09PSBpID8gdC5sb2FkRXJyb3JIYW5kbGVyKCEwKSA6IHQubG9hZEVycm9ySGFuZGxlcighMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG9lID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TVF9NRVNTQUdFX0VOQUJMRUQ6ICEhQy5wb3N0TWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBWVNfQkVUV0VFTl9TWU5DX0lEX0NBTExTOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlMTElTX1BFUl9EQVk6IDg2NDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURPQkVfTUM6ICdhZG9iZV9tYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQ19TRElEOiAnYWRvYmVfbWNfc2RpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxJRF9WSVNJVE9SX0lEX1JFR0VYOiAvXlswLTlhLWZBLUZcLV0rJC8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQ19UVExfSU5fTUlOOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9SRUdFWDogL3ZWZXJzaW9uXHwoKFxkK1wuKT8oXGQrXC4pPyhcKnxcZCspKSg/PSR8XHwpLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJUlNUX1BBUlRZX1NFUlZFUl9DT09LSUU6ICdzX2VjaWQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gQy5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhST1RUTEVfU1RBUlQ6IDMwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TWU5DU19MRU5HVEg6IDY0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdHRsZVRpbWVyU2V0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VQaXhlbHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUhvc3Q6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWZyYW1lSG9zdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WzBdICsgJy8vJyArIHRbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRvbWFpbjogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXJsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpID0gJ2h0dHA6Ly9mYXN0LicsIHIgPSAnP2RfbnNpZD0nICsgZS5pZFN5bmNDb250YWluZXJJRCArICcjJyArIGVuY29kZVVSSUNvbXBvbmVudChuLmxvY2F0aW9uLm9yaWdpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YmRvbWFpbiB8fCAodGhpcy5zdWJkb21haW4gPSAnbm9zdWJkb21haW5yZXR1cm5lZCcpLCBlLmxvYWRTU0wgJiYgKGkgPSBlLmlkU3luY1NTTFVzZUFrYW1haSA/ICdodHRwczovL2Zhc3QuJyA6ICdodHRwczovLycpLCB0ID0gaSArIHRoaXMuc3ViZG9tYWluICsgJy5kZW1kZXgubmV0L2Rlc3Q1Lmh0bWwnICsgciwgdGhpcy5pZnJhbWVIb3N0ID0gdGhpcy5nZXRJZnJhbWVIb3N0KHQpLCB0aGlzLmlkID0gJ2Rlc3RpbmF0aW9uX3B1Ymxpc2hpbmdfaWZyYW1lXycgKyB0aGlzLnN1YmRvbWFpbiArICdfJyArIGUuaWRTeW5jQ29udGFpbmVySUQsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0RQSWZyYW1lU3JjOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJz9kX25zaWQ9JyArIGUuaWRTeW5jQ29udGFpbmVySUQgKyAnIycgKyBlbmNvZGVVUklDb21wb25lbnQobi5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUuZHBJZnJhbWVTcmMgJiYgZS5kcElmcmFtZVNyYy5sZW5ndGggJiYgKHRoaXMuaWQgPSAnZGVzdGluYXRpb25fcHVibGlzaGluZ19pZnJhbWVfJyArIChlLl9zdWJkb21haW4gfHwgdGhpcy5zdWJkb21haW4gfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkpICsgJ18nICsgZS5pZFN5bmNDb250YWluZXJJRCwgdGhpcy5pZnJhbWVIb3N0ID0gdGhpcy5nZXRJZnJhbWVIb3N0KGUuZHBJZnJhbWVTcmMpLCB0aGlzLnVybCA9IGUuZHBJZnJhbWVTcmMgKyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ2FsbE5vdFByb2Nlc3NzZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9BdHRhY2hJZnJhbWU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUhhc0xvYWRlZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVJZENoYW5nZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SWZyYW1lQ3JlYXRlZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbElmcmFtZUhhc0xvYWRlZEFscmVhZHk6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lTG9hZGVkQ2FsbGJhY2tzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25DaGFuZ2VkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlZ2lvbkNoYW5nZWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZGluZ01lc3NhZ2VzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNQb3N0ZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzUmVjZWl2ZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VTZW5kaW5nSW50ZXJ2YWw6IG9lLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gbnVsbCA6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VEZXN0aW5hdGlvbnNGaXJlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbkZvckNvbXBhcmlzb246IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25EdXBsaWNhdGVzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uV2FpdGluZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvblByb2Nlc3NlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuU2V0VGhpcmRQYXJ0eUNvb2tpZXM6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGhpcmRQYXJ0eUNvb2tpZXNOb3RpZmljYXRpb246ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShlLmlkU3luY0Rpc2FibGVTeW5jcyB8fCBlLmRpc2FibGVJZFN5bmNzIHx8IGUuaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZyB8fCBlLmRpc2FibGVUaGlyZFBhcnR5Q29va2llcyB8fCBlLmRpc2FibGVUaGlyZFBhcnR5Q2FsbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlUb0F0dGFjaElmcmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeVRvQXR0YWNoSWZyYW1lUHJlbGltaW5hcnkoKSAmJiAodGhpcy5kb0F0dGFjaElmcmFtZSB8fCBlLl9kb0F0dGFjaElmcmFtZSkgJiYgKHRoaXMuc3ViZG9tYWluICYmICdub3N1YmRvbWFpbnJldHVybmVkJyAhPT0gdGhpcy5zdWJkb21haW4gfHwgZS5fc3ViZG9tYWluKSAmJiB0aGlzLnVybCAmJiAhdGhpcy5zdGFydGVkQXR0YWNoaW5nSWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoSWZyYW1lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbi5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKSwgci5zYW5kYm94ID0gJ2FsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4nLCByLnRpdGxlID0gJ0Fkb2JlIElEIFN5bmNpbmcgaUZyYW1lJywgci5pZCA9IGkuaWQsIHIubmFtZSA9IGkuaWQgKyAnX25hbWUnLCByLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogbm9uZTsgd2lkdGg6IDA7IGhlaWdodDogMDsnLCByLnNyYyA9IGkudXJsLCBpLm5ld0lmcmFtZUNyZWF0ZWQgPSAhMCwgdCgpLCBuLmJvZHkuYXBwZW5kQ2hpbGQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jbGFzc05hbWUgPSAnYWFtSWZyYW1lTG9hZGVkJywgaS5pZnJhbWVIYXNMb2FkZWQgPSAhMCwgaS5maXJlSWZyYW1lTG9hZGVkQ2FsbGJhY2tzKGUpLCBpLnJlcXVlc3RUb1Byb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRlZEF0dGFjaGluZ0lmcmFtZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIHIgPSBuLmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID8gJ0lGUkFNRScgIT09IHIubm9kZU5hbWUgPyAodGhpcy5pZCArPSAnXzInLCB0aGlzLmlmcmFtZUlkQ2hhbmdlZCA9ICEwLCBlKCkpIDogKHRoaXMubmV3SWZyYW1lQ3JlYXRlZCA9ICExLCAnYWFtSWZyYW1lTG9hZGVkJyAhPT0gci5jbGFzc05hbWUgPyAodGhpcy5vcmlnaW5hbElmcmFtZUhhc0xvYWRlZEFscmVhZHkgPSAhMSwgdCgnVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGFscmVhZHkgZXhpc3RzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSwgYnV0IGhhZG5cJ3QgbG9hZGVkIHlldC4nKSkgOiAodGhpcy5vcmlnaW5hbElmcmFtZUhhc0xvYWRlZEFscmVhZHkgPSAhMCwgdGhpcy5pZnJhbWVIYXNMb2FkZWQgPSAhMCwgdGhpcy5pZnJhbWUgPSByLCB0aGlzLmZpcmVJZnJhbWVMb2FkZWRDYWxsYmFja3MoJ1RoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSBhbHJlYWR5IGV4aXN0cyBmcm9tIGEgZGlmZmVyZW50IGxpYnJhcnksIGFuZCBoYWQgbG9hZGVkIGFscmVzYWR5LicpLCB0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoKSkpIDogZSgpLCB0aGlzLmlmcmFtZSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlSWZyYW1lTG9hZGVkQ2FsbGJhY2tzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlmcmFtZUxvYWRlZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiB0ICYmIHQoeyBtZXNzYWdlOiBlIHx8ICdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgd2FzIGF0dGFjaGVkIGFuZCBsb2FkZWQgc3VjY2Vzc2Z1bGx5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0aGlzLmlmcmFtZUxvYWRlZENhbGxiYWNrcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRvUHJvY2VzczogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuanNvbkZvckNvbXBhcmlzb24ucHVzaCh0KSwgci5qc29uV2FpdGluZy5wdXNoKHQpLCByLnByb2Nlc3NTeW5jT25QYWdlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT09IE9iamVjdCh0KSAmJiB0LmlicykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID0gSlNPTi5zdHJpbmdpZnkodC5pYnMgfHwgW10pLCB0aGlzLmpzb25Gb3JDb21wYXJpc29uLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvLCBzLCBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gMCwgbyA9IHRoaXMuanNvbkZvckNvbXBhcmlzb24ubGVuZ3RoOyBhIDwgbzsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9IHRoaXMuanNvbkZvckNvbXBhcmlzb25bYV0sIGkgPT09IEpTT04uc3RyaW5naWZ5KHMuaWJzIHx8IFtdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID8gdGhpcy5qc29uRHVwbGljYXRlcy5wdXNoKHQpIDogbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMucmVjZWl2ZWRUaGlyZFBhcnR5Q29va2llc05vdGlmaWNhdGlvbiB8fCAhb2UuUE9TVF9NRVNTQUdFX0VOQUJMRUQgfHwgdGhpcy5pZnJhbWVIYXNMb2FkZWQpICYmIHRoaXMuanNvbldhaXRpbmcubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHRoaXMuanNvbldhaXRpbmcuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzcyh1KSwgdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pZFN5bmNEaXNhYmxlU3luY3MgfHwgZS5kaXNhYmxlSWRTeW5jcyB8fCAhdGhpcy5pZnJhbWVIYXNMb2FkZWQgfHwgIXRoaXMubWVzc2FnZXMubGVuZ3RoIHx8IHRoaXMuc2VuZGluZ01lc3NhZ2VzIHx8ICh0aGlzLnRocm90dGxlVGltZXJTZXQgfHwgKHRoaXMudGhyb3R0bGVUaW1lclNldCA9ICEwLCBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubWVzc2FnZVNlbmRpbmdJbnRlcnZhbCA9IG9lLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gbnVsbCA6IDE1MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5USFJPVFRMRV9TVEFSVCkpLCB0aGlzLnNlbmRpbmdNZXNzYWdlcyA9ICEwLCB0aGlzLnNlbmRNZXNzYWdlcygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lvbkFuZENoZWNrSWZDaGFuZ2VkOiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuX2dldEZpZWxkKCdNQ0FBTUxIJyksIHIgPSB0LmRfcmVnaW9uIHx8IHQuZGNzX3JlZ2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPyByICYmIChlLl9zZXRGaWVsZEV4cGlyZSgnTUNBQU1MSCcsIG4pLCBlLl9zZXRGaWVsZCgnTUNBQU1MSCcsIHIpLCBwYXJzZUludChpLCAxMCkgIT09IHIgJiYgKHRoaXMucmVnaW9uQ2hhbmdlZCA9ICEwLCB0aGlzLnRpbWVzUmVnaW9uQ2hhbmdlZCsrLCBlLl9zZXRGaWVsZCgnTUNTWU5DU09QJywgJycpLCBlLl9zZXRGaWVsZCgnTUNTWU5DUycsICcnKSwgaSA9IHIpKSA6IChpID0gcikgJiYgKGUuX3NldEZpZWxkRXhwaXJlKCdNQ0FBTUxIJywgbiksIGUuX3NldEZpZWxkKCdNQ0FBTUxIJywgaSkpLCBpIHx8IChpID0gJycpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1N5bmNPblBhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBpLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBlLmlicykgJiYgdCBpbnN0YW5jZW9mIEFycmF5ICYmIChuID0gdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gdFtpXSwgci5zeW5jT25QYWdlICYmIHRoaXMuY2hlY2tGaXJzdFBhcnR5Q29va2llKHIsICcnLCAnc3luY09uUGFnZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGksIHIsIGEsIG8gPSBlbmNvZGVVUklDb21wb25lbnQsIHMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0ID0gZS5pYnMpICYmIHQgaW5zdGFuY2VvZiBBcnJheSAmJiAobiA9IHQubGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9ICEwLCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gdFtpXSwgYSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbygnaWJzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oci5pZCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oci50YWcgfHwgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChyLnVybCB8fCBbXSwgJywnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhyLnR0bCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5maXJlVVJMU3luYyA/ICd0cnVlJyA6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCByLnN5bmNPblBhZ2UgfHwgKHRoaXMuY2FuU2V0VGhpcmRQYXJ0eUNvb2tpZXMgPyB0aGlzLmFkZE1lc3NhZ2UoYS5qb2luKCd8JykpIDogci5maXJlVVJMU3luYyAmJiB0aGlzLmNoZWNrRmlyc3RQYXJ0eUNvb2tpZShyLCBhLmpvaW4oJ3wnKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmIHRoaXMuanNvblByb2Nlc3NlZC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGaXJzdFBhcnR5Q29va2llOiBmdW5jdGlvbiAodCwgbiwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdzeW5jT25QYWdlJyA9PT0gaSwgYSA9IHIgPyAnTUNTWU5DU09QJyA6ICdNQ1NZTkNTJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fcmVhZFZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHMsIGMgPSBlLl9nZXRGaWVsZChhKSwgdSA9ICExLCBsID0gITEsIGQgPSBNYXRoLmNlaWwobmV3IERhdGUoKS5nZXRUaW1lKCkgLyBvZS5NSUxMSVNfUEVSX0RBWSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPyAobyA9IGMuc3BsaXQoJyonKSwgcyA9IHRoaXMucHJ1bmVTeW5jRGF0YShvLCB0LmlkLCBkKSwgdSA9IHMuZGF0YVByZXNlbnQsIGwgPSBzLmRhdGFWYWxpZCwgdSAmJiBsIHx8IHRoaXMuZmlyZVN5bmMociwgdCwgbiwgbywgYSwgZCkpIDogKG8gPSBbXSwgdGhpcy5maXJlU3luYyhyLCB0LCBuLCBvLCBhLCBkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZVN5bmNEYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgciwgYSwgbyA9ICExLCBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGVbcl0sIGEgPSBwYXJzZUludChpLnNwbGl0KCctJylbMV0sIDEwKSwgaS5tYXRjaCgnXicgKyB0ICsgJy0nKSA/IChvID0gITAsIG4gPCBhID8gcyA9ICEwIDogKGUuc3BsaWNlKHIsIDEpLCByLS0pKSA6IG4gPj0gYSAmJiAoZS5zcGxpY2UociwgMSksIHItLSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHJlc2VudDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFWYWxpZDogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlU3luY3NTaXplOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5qb2luKCcqJykubGVuZ3RoID4gdGhpcy5NQVhfU1lOQ1NfTEVOR1RIKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlLnNvcnQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUuc3BsaXQoJy0nKVsxXSwgMTApIC0gcGFyc2VJbnQodC5zcGxpdCgnLScpWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7IGUuam9pbignKicpLmxlbmd0aCA+IHRoaXMuTUFYX1NZTkNTX0xFTkdUSDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZVN5bmM6IGZ1bmN0aW9uICh0LCBuLCBpLCByLCBhLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaW1nJyA9PT0gbi50YWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgdSwgbCwgZCwgZiA9IG4udXJsLCBwID0gZS5sb2FkU1NMID8gJ2h0dHBzOicgOiAnaHR0cDonOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IDAsIHUgPSBmLmxlbmd0aDsgYyA8IHU7IGMrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gZltjXSwgZCA9IC9eXC9cLy8udGVzdChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKHQsIG4sIGksIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vblBhZ2VQaXhlbHNbdF0gPSBudWxsLCBlLl9yZWFkVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBjID0gZS5fZ2V0RmllbGQoYSksIHUgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gYy5zcGxpdCgnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCwgZCwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMCwgZCA9IG8ubGVuZ3RoOyBsIDwgZDsgbCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IG9bbF0sIGYubWF0Y2goJ14nICsgbi5pZCArICctJykgfHwgdS5wdXNoKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNldFN5bmNUcmFja2luZ0RhdGEodSwgbiwgaSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMub25QYWdlUGl4ZWxzLmxlbmd0aCwgbiwgYSwgbykpLCBnLnNyYyA9IChkID8gcCA6ICcnKSArIGwsIHRoaXMub25QYWdlUGl4ZWxzLnB1c2goZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWVzc2FnZShpKSwgdGhpcy5zZXRTeW5jVHJhY2tpbmdEYXRhKHIsIG4sIGEsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlbmNvZGVVUklDb21wb25lbnQsIGkgPSBuKGUuX2VuYWJsZUVycm9yUmVwb3J0aW5nID8gJy0tLWRlc3RwdWItZGVidWctLS0nIDogJy0tLWRlc3RwdWItLS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlcy5wdXNoKChvZS5QT1NUX01FU1NBR0VfRU5BQkxFRCA/ICcnIDogaSkgKyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN5bmNUcmFja2luZ0RhdGE6IGZ1bmN0aW9uICh0LCBuLCBpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChuLmlkICsgJy0nICsgKHIgKyBNYXRoLmNlaWwobi50dGwgLyA2MCAvIDI0KSkpLCB0aGlzLm1hbmFnZVN5bmNzU2l6ZSh0KSwgZS5fc2V0RmllbGQoaSwgdC5qb2luKCcqJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0ID0gdGhpcywgbiA9ICcnLCBpID0gZW5jb2RlVVJJQ29tcG9uZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2lvbkNoYW5nZWQgJiYgKG4gPSBpKCctLS1kZXN0cHViLWNsZWFyLWRleHRwLS0tJyksIHRoaXMucmVnaW9uQ2hhbmdlZCA9ICExKSwgdGhpcy5tZXNzYWdlcy5sZW5ndGggPyBvZS5QT1NUX01FU1NBR0VfRU5BQkxFRCA/IChlID0gbiArIGkoJy0tLWRlc3RwdWItY29tYmluZWQtLS0nKSArIHRoaXMubWVzc2FnZXMuam9pbignJTAxJyksIHRoaXMucG9zdE1lc3NhZ2UoZSksIHRoaXMubWVzc2FnZXMgPSBbXSwgdGhpcy5zZW5kaW5nTWVzc2FnZXMgPSAhMSkgOiAoZSA9IHRoaXMubWVzc2FnZXMuc2hpZnQoKSwgdGhpcy5wb3N0TWVzc2FnZShuICsgZSksIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZW5kTWVzc2FnZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5tZXNzYWdlU2VuZGluZ0ludGVydmFsKSkgOiB0aGlzLnNlbmRpbmdNZXNzYWdlcyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllLnBvc3RNZXNzYWdlKGUsIHRoaXMudXJsLCB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSwgdGhpcy5tZXNzYWdlc1Bvc3RlZC5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZU1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gL14tLS1kZXN0cHViLXRvLXBhcmVudC0tLS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiBlICYmIG4udGVzdChlKSAmJiAodCA9IGUucmVwbGFjZShuLCAnJykuc3BsaXQoJ3wnKSwgJ2NhblNldFRoaXJkUGFydHlDb29raWVzJyA9PT0gdFswXSAmJiAodGhpcy5jYW5TZXRUaGlyZFBhcnR5Q29va2llcyA9ICd0cnVlJyA9PT0gdFsxXSwgdGhpcy5yZWNlaXZlZFRoaXJkUGFydHlDb29raWVzTm90aWZpY2F0aW9uID0gITAsIHRoaXMucmVxdWVzdFRvUHJvY2VzcygpKSwgdGhpcy5tZXNzYWdlc1JlY2VpdmVkLnB1c2goZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0lEQ2FsbERhdGE6IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IHRoaXMudXJsIHx8IGkuc3ViZG9tYWluICYmICdub3N1YmRvbWFpbnJldHVybmVkJyA9PT0gdGhpcy5zdWJkb21haW4pICYmICgnc3RyaW5nJyA9PSB0eXBlb2YgZS5fc3ViZG9tYWluICYmIGUuX3N1YmRvbWFpbi5sZW5ndGggPyB0aGlzLnN1YmRvbWFpbiA9IGUuX3N1YmRvbWFpbiA6IHRoaXMuc3ViZG9tYWluID0gaS5zdWJkb21haW4gfHwgJycsIHRoaXMudXJsID0gdGhpcy5nZXRVcmwoKSksIGkuaWJzIGluc3RhbmNlb2YgQXJyYXkgJiYgaS5pYnMubGVuZ3RoICYmICh0aGlzLmRvQXR0YWNoSWZyYW1lID0gITApLCB0aGlzLnJlYWR5VG9BdHRhY2hJZnJhbWUoKSAmJiAoZS5pZFN5bmNBdHRhY2hJZnJhbWVPbldpbmRvd0xvYWQgPyAodC53aW5kb3dMb2FkZWQgfHwgJ2NvbXBsZXRlJyA9PT0gbi5yZWFkeVN0YXRlIHx8ICdsb2FkZWQnID09PSBuLnJlYWR5U3RhdGUpICYmIHRoaXMuYXR0YWNoSWZyYW1lKCkgOiB0aGlzLmF0dGFjaElmcmFtZUFTQVAoKSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuaWRTeW5jSURDYWxsUmVzdWx0ID8gZS5pZFN5bmNJRENhbGxSZXN1bHQoaSkgOiB0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoaSksICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQgJiYgZS5pZFN5bmNBZnRlcklEQ2FsbFJlc3VsdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbk1ha2VTeW5jSURDYWxsOiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fZm9yY2VTeW5jSURDYWxsIHx8ICF0IHx8IG4gLSB0ID4gb2UuREFZU19CRVRXRUVOX1NZTkNfSURfQ0FMTFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hJZnJhbWVBU0FQOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWUgfHwgKG4uYm9keSA/IHQuYXR0YWNoSWZyYW1lKCkgOiBzZXRUaW1lb3V0KGUsIDMwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgY2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpZW5jZU1hbmFnZXJTZXJ2ZXI6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZURvbWFpbjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVMaWZldGltZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXNPcHRJbkFwcGx5OiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVRoaXJkUGFydHlDYWxsczogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFja2luZ1NlcnZlckVDSUQ6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNBZnRlcklEQ2FsbFJlc3VsdDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNBdHRhY2hJZnJhbWVPbldpbmRvd0xvYWQ6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNDb250YWluZXJJRDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZVRoaXJkUGFydHlDb29raWVzOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jRGlzYWJsZVN5bmNzOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUlkU3luY3M6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNJRENhbGxSZXN1bHQ6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jU1NMVXNlQWthbWFpOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb29wU2FmZTogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSWFiQ29udGV4dDogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3B0SW5TdG9yYWdlRW5hYmxlZDogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRTU0w6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGltZW91dDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdDbG91ZFNlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdDbG91ZFNlcnZlclNlY3VyZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJbkNvb2tpZURvbWFpbjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJblN0b3JhZ2VFeHBpcnk6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcndyaXRlQ3Jvc3NEb21haW5NQ0lEQW5kQUlEOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlT3B0SW5BcHByb3ZhbHM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQZXJtaXNzaW9uczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldEJlZm9yZVZlcnNpb246IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RpZFBhcmFtRXhwaXJ5OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclN0YXRlOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Db29raWVOYW1lOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvb2tpZTogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVTaXRlQ29va2llOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VUaW1lb3V0TWV0cmljczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZlclNlY3VyZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZWxpc3RJZnJhbWVEb21haW5zOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdFBhcmVudERvbWFpbjoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWdOYW1lczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVDb25maWc6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNlW2VdICYmICdib29sZWFuJyA9PT0gY2VbZV0udHlwZSA/ICdmdW5jdGlvbicgIT0gdHlwZW9mIHQgPyB0IDogdCgpIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm9uID0gZnVuY3Rpb24gKGUsIG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbT05dIENhbGxiYWNrIHNob3VsZCBiZSBhIGZ1bmN0aW9uLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuaGFzT3duUHJvcGVydHkoZSkgfHwgKHRbZV0gPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0W2VdLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdLnNwbGljZShyLCAxKSwgdFtlXS5sZW5ndGggfHwgZGVsZXRlIHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUub2ZmID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmhhc093blByb3BlcnR5KGUpICYmICh0W2VdID0gdFtlXS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuY2FsbGJhY2sgIT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnB1Ymxpc2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Lmhhc093blByb3BlcnR5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdLnNsaWNlKDApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbGJhY2suYXBwbHkoZS5jb250ZXh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wdWJsaXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTkRJTkc6ICdwZW5kaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HRUQ6ICdjaGFuZ2VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVRFOiAnY29tcGxldGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFNOiAnYWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEQ0xPVUQ6ICdhZGNsb3VkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZVElDUzogJ2FhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTVBBSUdOOiAnY2FtcGFpZ24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNJRDogJ2VjaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElWRUZZUkU6ICdsaXZlZnlyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVQ6ICd0YXJnZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfQU5BTFlUSUNTOiAnbWVkaWFhYScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGUgPSAoUyA9IHt9LCB0KFMsIGZlLkFBTSwgNTY1KSwgdChTLCBmZS5FQ0lELCA1NjUpLCBTKSwgZ2UgPSAoSSA9IHt9LCB0KEksIGZlLkFBTSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCB0KEksIGZlLkVDSUQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgSSksIG1lID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvYWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lhYkNvbnNlbnRIYXNoJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBoZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShmZSksIF9lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGxiYWNrcyA9IE9iamVjdC5jcmVhdGUobnVsbCksIGUuYWRkID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXUobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW2NhbGxiYWNrUmVnaXN0cnlGYWN0b3J5XSBNYWtlIHN1cmUgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBmdW5jdGlvbnMuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jYWxsYmFja3NbdF0gPSBlLmNhbGxiYWNrc1t0XSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuY2FsbGJhY2tzW3RdLnB1c2gobikgLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbGJhY2tzW3RdLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5leGVjdXRlID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jYWxsYmFja3NbdF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHZvaWQgMCA9PT0gbiA/IFtdIDogbiwgbiA9IG4gaW5zdGFuY2VvZiBBcnJheSA/IG4gOiBbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZS5jYWxsYmFja3NbdF0ubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZS5jYWxsYmFja3NbdF0uc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBpID8gaS5hcHBseShudWxsLCBuKSA6IGkgaW5zdGFuY2VvZiBBcnJheSAmJiBpWzFdLmFwcGx5KGlbMF0sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGUuY2FsbGJhY2tzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmV4ZWN1dGVBbGwgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuIHx8IHQgJiYgIWModCkpICYmIE9iamVjdC5rZXlzKGUuY2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdm9pZCAwICE9PSB0W25dID8gdFtuXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4ZWN1dGUobiwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmhhc0NhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihPYmplY3Qua2V5cyhlLmNhbGxiYWNrcykubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIENlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdywgbiA9IHQuY29uc29sZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIW4gJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oKSA/IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2UoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGkgPSBuZXcgQXJyYXkobiksIHIgPSAwOyByIDwgbjsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtyXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVtlXS5hcHBseShjb25zb2xlLCBbdF0uY29uY2F0KGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogQ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZlID0gbCwgRGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gW10sIHQgPSAwOyB0IDwgMjU2OyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCwgaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAxICYgbiA/IDM5ODgyOTIzODQgXiBuID4+PiAxIDogbiA+Pj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHQpKSwgbiB8fCAobiA9IDApLCBuIF49IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDI1NSAmIChuIF4gdC5jaGFyQ29kZUF0KGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gPj4+IDggXiBlW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gXj0gLTEpID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB5ZSA9IG5ldyB2ZSgnW0FET0JFIE9QVC1JTl0nKSwgYmUgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodCkgPT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEFlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgQXJyYXkgPyBlIDogYmUoZSwgJ3N0cmluZycpID8gW2VdIDogdCB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgT2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQubGVuZ3RoICYmIHQuZXZlcnkoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISghZSB8fCBUZShlKSkgJiYgQWUoZSkuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGUuaW5kZXhPZihlKSA+IC0xIHx8IHQgJiYgbWUuaW5kZXhPZihlKSA+IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGtlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW25dID0gdCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgRWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXldJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpICYmICFlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFBlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGUgfHwgKHdlKGUpID8gTWUoT2JqZWN0LmtleXMoZSksICEwKSA6IFJlKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUmUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZSAmJiBiZShlLCAnc3RyaW5nJykgJiYgTWUoT2JqZWN0LmtleXModCksICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlICYmIGJlKGUsICdvYmplY3QnKSAmJiAhMSA9PT0gQXJyYXkuaXNBcnJheShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHhlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiZShlLCAnZnVuY3Rpb24nKSA/IGUoKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEZlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlKGUpIHx8IHllLmVycm9yKCcnLmNvbmNhdCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGplID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBWZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gamUoZSkuZmlsdGVyKGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBVZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgbiA9IHQuY29tbWFuZCwgaSA9IHQucGFyYW1zLCByID0gdm9pZCAwID09PSBpID8ge30gOiBpLCBhID0gdC5jYWxsYmFjaywgbyA9IHZvaWQgMCA9PT0gYSA/IE5lIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgLTEgPT09IG4uaW5kZXhPZignLicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tPcHRJbi5leGVjdXRlXSBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGNvbW1hbmQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuLnNwbGl0KCcuJyksIGMgPSBlW3NbMF1dLCB1ID0gc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGNbdV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ha2Ugc3VyZSB0aGUgcGx1Z2luIGFuZCBBUEkgbmFtZSBleGlzdC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBPYmplY3QuYXNzaWduKHIsIHsgY2FsbGJhY2s6IG8gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbdV0uY2FsbChjLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllLmVycm9yKCdbZXhlY3V0ZV0gU29tZXRoaW5nIHdlbnQgd3Jvbmc6ICcgKyBlLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksIGYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSGUgPSAnZmV0Y2hQZXJtaXNzaW9ucycsIEJlID0gJ1tPcHRJbiNyZWdpc3RlclBsdWdpbl0gUGx1Z2luIGlzIGludmFsaWQuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLkNhdGVnb3JpZXMgPSBmZSwgcC5UaW1lb3V0RXJyb3IgPSBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHZSA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0SW46IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJYWJQbHVnaW46IF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIFllID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHVibGlzaERlc3RpbmF0aW9ucyA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHNbMV0sIHIgPSBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIHIgPyByIDogbi5jYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEucmVhZHlUb0F0dGFjaElmcmFtZVByZWxpbWluYXJ5KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHIoeyBlcnJvcjogJ1RoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSBpcyBkaXNhYmxlZCBpbiB0aGUgVmlzaXRvciBsaWJyYXJ5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCByKHsgZXJyb3I6ICdzdWJkb21haW4gaXMgbm90IGEgcG9wdWxhdGVkIHN0cmluZy4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpIGluc3RhbmNlb2YgQXJyYXkgJiYgaS5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcih7IGVycm9yOiAnbWVzc2FnZXMgaXMgbm90IGEgcG9wdWxhdGVkIGFycmF5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiBlLmxlbmd0aCAmJiAoYS5hZGRNZXNzYWdlKGUpLCBvID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcih7IGVycm9yOiAnTm9uZSBvZiB0aGUgbWVzc2FnZXMgYXJlIHBvcHVsYXRlZCBzdHJpbmdzLicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVLmlzT2JqZWN0KG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcih7IGVycm9yOiAnSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZC4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgKG4gPSBzLnN1YmRvbWFpbikgfHwgIW4ubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcih7IGVycm9yOiAnY29uZmlnLnN1YmRvbWFpbiBpcyBub3QgYSBwb3B1bGF0ZWQgc3RyaW5nLicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gcy51cmxEZXN0aW5hdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBBcnJheSAmJiBjLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCByKHsgZXJyb3I6ICdjb25maWcudXJsRGVzdGluYXRpb25zIGlzIG5vdCBhIHBvcHVsYXRlZCBhcnJheS4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUuaXNPYmplY3QoZSkgJiYgKGUuaGlkZVJlZmVycmVyID8gZS5tZXNzYWdlICYmIGEuYWRkTWVzc2FnZShlLm1lc3NhZ2UpIDogdS5wdXNoKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5sZW5ndGggJiYgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgSW1hZ2UoKSwgbiA9IHUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNyYyA9IG4udXJsLCBhLm9uUGFnZURlc3RpbmF0aW9uc0ZpcmVkLnB1c2gobiksIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZnJhbWUgPyAocih7IG1lc3NhZ2U6ICdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgaXMgYWxyZWFkeSBhdHRhY2hlZCBhbmQgbG9hZGVkLicgfSksIGEucmVxdWVzdFRvUHJvY2VzcygpKSA6ICFlLnN1YmRvbWFpbiAmJiBlLl9nZXRGaWVsZCgnTUNNSUQnKSA/IChhLnN1YmRvbWFpbiA9IG4sIGEuZG9BdHRhY2hJZnJhbWUgPSAhMCwgYS51cmwgPSBhLmdldFVybCgpLCBhLnJlYWR5VG9BdHRhY2hJZnJhbWUoKSA/IChhLmlmcmFtZUxvYWRlZENhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoeyBtZXNzYWdlOiAnQXR0ZW1wdGVkIHRvIGF0dGFjaCBhbmQgbG9hZCB0aGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgdGhyb3VnaCB0aGlzIEFQSSBjYWxsLiBSZXN1bHQ6ICcgKyAoZS5tZXNzYWdlIHx8ICdubyByZXN1bHQnKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5hdHRhY2hJZnJhbWUoKSkgOiByKHsgZXJyb3I6ICdFbmNvdW50ZXJlZCBhIHByb2JsZW0gaW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4nIH0pKSA6IGEuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcih7IG1lc3NhZ2U6ICdBdHRlbXB0ZWQgdG8gYXR0YWNoIGFuZCBsb2FkIHRoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSB0aHJvdWdoIG5vcm1hbCBWaXNpdG9yIEFQSSBwcm9jZXNzaW5nLiBSZXN1bHQ6ICcgKyAoZS5tZXNzYWdlIHx8ICdubyByZXN1bHQnKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHFlID0gZnVuY3Rpb24gZSh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA+Pj4gdCB8IGUgPDwgMzIgLSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSwgciwgYSA9IE1hdGgucG93LCBvID0gYSgyLCAzMiksIHMgPSAnJywgYyA9IFtdLCB1ID0gOCAqIHQubGVuZ3RoLCBsID0gZS5oID0gZS5oIHx8IFtdLCBkID0gZS5rID0gZS5rIHx8IFtdLCBmID0gZC5sZW5ndGgsIHAgPSB7fSwgZyA9IDI7IGYgPCA2NDsgZysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcFtnXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzEzOyBpICs9IGcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW2ldID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFtmXSA9IGEoZywgMC41KSAqIG8gfCAwLCBkW2YrK10gPSBhKGcsIDEgLyAzKSAqIG8gfCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCArPSAnXHg4MCc7IHQubGVuZ3RoICUgNjQgLSA1NjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAnXDAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPSB0LmNoYXJDb2RlQXQoaSkpID4+IDgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW2kgPj4gMl0gfD0gciA8PCAoMyAtIGkpICUgNCAqIDg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNbYy5sZW5ndGhdID0gdSAvIG8gfCAwLCBjW2MubGVuZ3RoXSA9IHUsIHIgPSAwOyByIDwgYy5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBjLnNsaWNlKHIsIHIgKz0gMTYpLCBoID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSBsLnNsaWNlKDAsIDgpLCBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF8gPSBtW2kgLSAxNV0sIEMgPSBtW2kgLSAyXSwgUyA9IGxbMF0sIEkgPSBsWzRdLCB2ID0gbFs3XSArIChuKEksIDYpIF4gbihJLCAxMSkgXiBuKEksIDI1KSkgKyAoSSAmIGxbNV0gXiB+SSAmIGxbNl0pICsgZFtpXSArIChtW2ldID0gaSA8IDE2ID8gbVtpXSA6IG1baSAtIDE2XSArIChuKF8sIDcpIF4gbihfLCAxOCkgXiBfID4+PiAzKSArIG1baSAtIDddICsgKG4oQywgMTcpIF4gbihDLCAxOSkgXiBDID4+PiAxMCkgfCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IFt2ICsgKChuKFMsIDIpIF4gbihTLCAxMykgXiBuKFMsIDIyKSkgKyAoUyAmIGxbMV0gXiBTICYgbFsyXSBeIGxbMV0gJiBsWzJdKSkgfCAwXS5jb25jYXQobCksIGxbNF0gPSBsWzRdICsgdiB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxbaV0gPSBsW2ldICsgaFtpXSB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDM7IHIgKyAxOyByLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEQgPSBsW2ldID4+IDggKiByICYgMjU1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IChEIDwgMTYgPyAwIDogJycpICsgRC50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFhlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnU0hBLTI1NicgIT09IHQgJiYgJ1NIQTI1NicgIT09IHQgJiYgJ3NoYTI1NicgIT09IHQgJiYgJ3NoYS0yNTYnICE9PSB0IHx8IChlID0gcWUoZSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBXZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBLZSA9IEdlLk9wdEluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUuZGVmaW5lR2xvYmFsTmFtZXNwYWNlKCksIHdpbmRvdy5hZG9iZS5PcHRJbkNhdGVnb3JpZXMgPSBLZS5DYXRlZ29yaWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBKZSA9IGZ1bmN0aW9uICh0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9jdXN0b21lcklEc0hhc2hDaGFuZ2VkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUgfHwgQS5sb2NhdGlvbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gUy5fZXh0cmFjdFBhcmFtRnJvbVVyaShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS5wYXJzZVBpcGVEZWxpbWV0ZWRLZXlWYWx1ZXMoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUubWF0Y2gob2UuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkgJiYgKG4gPT09IFQgJiYgKGIgPSAhMCksIHQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlW1RdLCBTLnNldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklELCBUKSwgUy5fc2V0RmllbGRFeHBpcmUoeCwgLTEpLCB0KGVbd10sIFMuc2V0QW5hbHl0aWNzVmlzaXRvcklEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IHt9LCBTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gZS5zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50IHx8ICcnLCBTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQgPSBlLnN1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCB8fCB7fSwgUy5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCA9IGUuc3VwcGxlbWVudGFsRGF0YUlETGFzdCB8fCAnJywgUy5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkID0gZS5zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IG4gPyBuICs9ICd8JyA6IG4sIG4gKz0gZSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gblswXSwgciA9IG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gciAmJiByICE9PSBGICYmIChlID0gdChpLCByLCBlKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUucmVkdWNlKG4sICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gcS5nZXRUaW1lc3RhbXBJblNlY29uZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGUgPyBlICs9ICd8JyA6IGUsIGUgKz0gJ1RTPScgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5taW51dGVzVG9MaXZlLCBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFMuaWRTeW5jRGlzYWJsZVN5bmNzIHx8IFMuZGlzYWJsZUlkU3luY3MpICYmIChuID0gbiB8fCAnRXJyb3I6IGlkIHN5bmNzIGhhdmUgYmVlbiBkaXNhYmxlZCcpLCAnc3RyaW5nJyA9PSB0eXBlb2YgZS5kcGlkICYmIGUuZHBpZC5sZW5ndGggfHwgKG4gPSBuIHx8ICdFcnJvcjogY29uZmlnLmRwaWQgaXMgZW1wdHknKSwgJ3N0cmluZycgPT0gdHlwZW9mIGUudXJsICYmIGUudXJsLmxlbmd0aCB8fCAobiA9IG4gfHwgJ0Vycm9yOiBjb25maWcudXJsIGlzIGVtcHR5JyksIHZvaWQgMCA9PT0gdCA/IHQgPSAyMDE2MCA6ICh0ID0gcGFyc2VJbnQodCwgMTApLCAoaXNOYU4odCkgfHwgdCA8PSAwKSAmJiAobiA9IG4gfHwgJ0Vycm9yOiBjb25maWcubWludXRlc1RvTGl2ZSBuZWVkcyB0byBiZSBhIHBvc2l0aXZlIG51bWJlcicpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhUy5jb25maWdzLmRvZXNPcHRJbkFwcGx5ICYmICEoSS5vcHRJbi5pc0NvbXBsZXRlICYmIGQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmNvbmZpZ3MuZG9lc09wdEluQXBwbHkgJiYgUy5jb25maWdzLmlzSWFiQ29udGV4dCA/IEkub3B0SW4uaXNBcHByb3ZlZChJLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgJiYgeSA6IEkub3B0SW4uaXNBcHByb3ZlZChJLm9wdEluLkNhdGVnb3JpZXMuRUNJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2dldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0Q3VzdG9tZXJJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5bmNJZGVudGl0eScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydnZXRBbmFseXRpY3NWaXNpdG9ySUQnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2dldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0TG9jYXRpb25IaW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydnZXRBdWRpZW5jZU1hbmFnZXJCbG9iJ10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVswXSwgbiA9IDIgPT09IGUubGVuZ3RoID8gZVsxXSA6ICcnLCBpID0gU1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTW3RdID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoKSAmJiBTLmlzQWxsb3dlZCgpID8gaS5hcHBseShTLCBhcmd1bWVudHMpIDogKCdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgUy5fY2FsbENhbGxiYWNrKGUsIFtuXSksIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTLl9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCksIHQgPSBlLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLl9sb2FkRGF0YShFLCB0LCBudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID0gITAsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSUFCIHBsdWdpbl0gOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQuZ2RwckFwcGxpZXMgJiYgKHYgPSB0LmNvbnNlbnRTdHJpbmcsIEQgPSB0Lmhhc0NvbnNlbnRDaGFuZ2VkU2luY2VMYXN0Q21wUHVsbCA/IDEgOiAwKSwgcCgpLCBfKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA9ICEwLCBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW0lBQiBwbHVnaW5dIDogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZHByQXBwbGllcyAmJiAodiA9IHQuY29uc2VudFN0cmluZywgRCA9IHQuaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsID8gMSA6IDApLCBTLmluaXQoKSwgXygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLm9wdEluLmlzQ29tcGxldGUgJiYgKEkub3B0SW4uaXNBcHByb3ZlZChJLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgPyBTLmNvbmZpZ3MuaXNJYWJDb250ZXh0ID8gSS5vcHRJbi5leGVjdXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAnaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IChTLmluaXQoKSwgXygpKSA6IFMuY29uZmlncy5pc0lhYkNvbnRleHQgPyBJLm9wdEluLmV4ZWN1dGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICdpYWJQbHVnaW4uZmV0Y2hDb25zZW50RGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKGYoKSwgXygpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkub3B0SW4ub2ZmKCdjb21wbGV0ZScsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaSB8fCBpLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJykgIT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2UgYFZpc2l0b3IuZ2V0SW5zdGFuY2VgIHRvIGluc3RhbnRpYXRlIFZpc2l0b3IuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTID0gdGhpcywgSSA9IHdpbmRvdy5hZG9iZSwgdiA9ICcnLCBEID0gMCwgeSA9ICExLCBiID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMudmVyc2lvbiA9ICc1LjIuMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBBID0gQywgTyA9IEEuVmlzaXRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTy52ZXJzaW9uID0gUy52ZXJzaW9uLCBPLkF1dGhTdGF0ZSA9IEwuQVVUSF9TVEFURSwgTy5PcHRPdXQgPSBMLk9QVF9PVVQsIEEuc19jX2luIHx8IChBLnNfY19pbCA9IFtdLCBBLnNfY19pbiA9IDApLCBTLl9jID0gJ1Zpc2l0b3InLCBTLl9pbCA9IEEuc19jX2lsLCBTLl9pbiA9IEEuc19jX2luLCBTLl9pbFtTLl9pbl0gPSBTLCBBLnNfY19pbisrLCBTLl9pbnN0YW5jZVR5cGUgPSAncmVndWxhcicsIFMuX2xvZyA9IHsgcmVxdWVzdHM6IFtdIH0sIFMubWFya2V0aW5nQ2xvdWRPcmdJRCA9IHQsIFMuY29va2llTmFtZSA9ICdBTUNWXycgKyB0LCBTLnNlc3Npb25Db29raWVOYW1lID0gJ0FNQ1ZTXycgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgTSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIG4uc2VjdXJlQ29va2llICYmIG4uc2FtZVNpdGVDb29raWUgJiYgKE0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lU2l0ZTogbi5zYW1lU2l0ZUNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZTogbi5zZWN1cmVDb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIFMuY29va2llRG9tYWluID0gUy51c2VMb2NhbFN0b3JhZ2UgPyAnJyA6IGVlKG51bGwsIE0pLCBTLmxvYWRTU0wgPSAhMCwgUy5sb2FkVGltZW91dCA9IDMwMDAwLCBTLkNPUlNFcnJvcnMgPSBbXSwgUy5tYXJrZXRpbmdDbG91ZFNlcnZlciA9IFMuYXVkaWVuY2VNYW5hZ2VyU2VydmVyID0gJ2RwbS5kZW1kZXgubmV0JywgUy5zZGlkUGFyYW1FeHBpcnkgPSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBudWxsLCBFID0gJ01DJywgVCA9ICdNQ01JRCcsIFAgPSAnTUNJRFRTJywgUiA9ICdBJywgdyA9ICdNQ0FJRCcsIE4gPSAnQUFNJywgeCA9ICdNQ0FBTUInLCBGID0gJ05PTkUnLCBqID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIU9iamVjdC5wcm90b3R5cGVbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBWID0gYWUoUyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuRklFTERTID0gTC5GSUVMRFMsIFMuY29va2llUmVhZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy51c2VMb2NhbFN0b3JhZ2UgPyBlID09PSBTLnNlc3Npb25Db29raWVOYW1lID8gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShlKSA6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpIDogWi5nZXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuY29va2llV3JpdGUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnJyArIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUy51c2VMb2NhbFN0b3JhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IFMuc2Vzc2lvbkNvb2tpZU5hbWUgPyBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsIGkpIDogbG9jYWxTdG9yYWdlLnNldEl0ZW0oZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFMuY29va2llTGlmZXRpbWUgPyAoJycgKyBTLmNvb2tpZUxpZmV0aW1lKS50b1VwcGVyQ2FzZSgpIDogJycsIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXM6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogUy5jb29raWVEb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpZmV0aW1lOiByCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmNvbmZpZ3MgJiYgUy5jb25maWdzLnNlY3VyZUNvb2tpZSAmJiAnaHR0cHM6JyA9PT0gbG9jYXRpb24ucHJvdG9jb2wgJiYgKGEuc2VjdXJlID0gITApLCBTLmNvbmZpZ3MgJiYgUy5jb25maWdzLnNhbWVTaXRlQ29va2llICYmICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbCAmJiAoYS5zYW1lU2l0ZSA9IEwuU0FNRV9TSVRFX1ZBTFVFU1tTLmNvbmZpZ3Muc2FtZVNpdGVDb29raWUudG9VcHBlckNhc2UoKV0gfHwgJ0xheCcpLCBaLnNldChlLCBpLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5yZW1vdmVDb29raWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMudXNlTG9jYWxTdG9yYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBTLnNlc3Npb25Db29raWVOYW1lID8gc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShlKSA6IGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IGRvbWFpbjogUy5jb29raWVEb21haW4gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmNvbmZpZ3MgJiYgUy5jb25maWdzLnNlY3VyZUNvb2tpZSAmJiAnaHR0cHM6JyA9PT0gbG9jYXRpb24ucHJvdG9jb2wgJiYgKHQuc2VjdXJlID0gITApLCBTLmNvbmZpZ3MgJiYgUy5jb25maWdzLnNhbWVTaXRlQ29va2llICYmICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbCAmJiAodC5zYW1lU2l0ZSA9IEwuU0FNRV9TSVRFX1ZBTFVFU1tTLmNvbmZpZ3Muc2FtZVNpdGVDb29raWUudG9VcHBlckNhc2UoKV0gfHwgJ0xheCcpLCBaLnJlbW92ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5yZXNldFN0YXRlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBTLl9tZXJnZVNlcnZlclN0YXRlKGUpIDogcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9pc0FsbG93ZWREb25lID0gITEsIFMuX2lzQWxsb3dlZEZsYWcgPSAhMSwgUy5pc0FsbG93ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5faXNBbGxvd2VkRG9uZSB8fCAoUy5faXNBbGxvd2VkRG9uZSA9ICEwLCAoUy5jb29raWVSZWFkKFMuY29va2llTmFtZSkgfHwgUy5jb29raWVXcml0ZShTLmNvb2tpZU5hbWUsICdUJywgMSkpICYmIChTLl9pc0FsbG93ZWRGbGFnID0gITApKSwgJ1QnID09PSBTLmNvb2tpZVJlYWQoUy5jb29raWVOYW1lKSAmJiBTLnJlbW92ZUNvb2tpZShTLmNvb2tpZU5hbWUpLCBTLl9pc0FsbG93ZWRGbGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLnNldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX3NldE1hcmtldGluZ0Nsb3VkRmllbGRzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyID0gITEsIFMuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5tYXJrZXRpbmdDbG91ZFNlcnZlciAmJiBTLm1hcmtldGluZ0Nsb3VkU2VydmVyLmluZGV4T2YoJy5kZW1kZXgubmV0JykgPCAwICYmIChTLl91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBTLl9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCdfc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMnKSwgaSA9IG4udXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMuX2dldFJlbW90ZUZpZWxkKFQsIGksIGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bZV0gPSBTLl9nZXRGaWVsZChlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIC0xICE9PSB0LmluZGV4T2YoJ01DT1BUT1VUJykgPyBTLmlzT3B0ZWRPdXQoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5NQ09QVE9VVCA9IHQsIGUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgITApIDogZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5nZXRWaXNpdG9yVmFsdWVzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IFMuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ09QVE9VVDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IFMuaXNPcHRlZE91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUlEOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogUy5nZXRBbmFseXRpY3NWaXNpdG9ySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogUy5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiBTLmdldEF1ZGllbmNlTWFuYWdlckJsb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IHQgJiYgdC5sZW5ndGggPyBVLnBsdWNrKG4sIHQpIDogbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgLTEgPT09IHQuaW5kZXhPZignTUNBSUQnKSA/IEgoZSwgdCkgOiAkKGksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9jdXJyZW50Q3VzdG9tZXJJRHMgPSB7fSwgUy5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCA9ICExLCBTLl9uZXdDdXN0b21lcklEc0hhc2ggPSAnJywgUy5zZXRDdXN0b21lcklEcyA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMuaXNPcHRlZE91dCgpICYmIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVUuaXNPYmplY3QodCkgfHwgVS5pc09iamVjdEVtcHR5KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgYSwgbywgczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGooaSkgJiYgKFMuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyA9IFMuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyB8fCB7fSwgYSA9IHRbaV0sIG4gPSBhLmhhc093blByb3BlcnR5KCdoYXNoVHlwZScpID8gYS5oYXNoVHlwZSA6IG4sIGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBlKGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocyA9IFhlKFdlKGEuaWQpLCBuKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZCA9IHMsIGMuaGFzaFR5cGUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuaWQgPSBhLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT0gYS5hdXRoU3RhdGUgJiYgKGMuYXV0aFN0YXRlID0gYS5hdXRoU3RhdGUpLCBTLl9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbaV0gPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocyA9IFhlKFdlKGEpLCBuKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbaV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoVHlwZTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbaV0gPSB7IGlkOiBhIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBTLmdldEN1c3RvbWVySURzKCEwKSwgbCA9IFMuX2dldEZpZWxkKCdNQ0NJREgnKSwgZCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgfHwgKGwgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG8gaW4gdSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHVbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVS5pc09iamVjdEVtcHR5KGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaihpKSAmJiAoYSA9IGZbaV0sIGQgKz0gKGQgPyAnfCcgOiAnJykgKyBpICsgJ3wnICsgKGEuaWQgPyBhLmlkIDogJycpICsgKGEuYXV0aFN0YXRlID8gYS5hdXRoU3RhdGUgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9uZXdDdXN0b21lcklEc0hhc2ggPSBTdHJpbmcoUy5faGFzaChkKSksIFMuX25ld0N1c3RvbWVySURzSGFzaCAhPT0gbCAmJiAoUy5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCA9ICEwLCBTLl9tYXBDdXN0b21lcklEcyhyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuc3luY0lkZW50aXR5ID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUy5pc09wdGVkT3V0KCkgJiYgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVS5pc09iamVjdCh0KSB8fCBVLmlzT2JqZWN0RW1wdHkodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9yZWFkVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBhLCBvLCBzLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaihpKSAmJiAoUy5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXMgPSBTLl9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlcyB8fCB7fSwgYSA9IHRbaV0sIG4gPSBhLmhhc093blByb3BlcnR5KCdoYXNoVHlwZScpID8gYS5oYXNoVHlwZSA6IG4sIGEgJiYgJ29iamVjdCcgPT09IGUoYSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShvID0gWGUoV2UoYS5pZCksIG4pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pZCA9IG8sIHUuaGFzaFR5cGUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmlkID0gYS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPSBhLmF1dGhTdGF0ZSAmJiAodS5hdXRoU3RhdGUgPSBhLmF1dGhTdGF0ZSksIGEuZGF0YVNvdXJjZSAmJiAoUy5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzID0gUy5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzIHx8IHt9LCBzID0gYS5kYXRhU291cmNlLCBTLl9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbc10gPSB1KSwgUy5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXNbaV0gPSB1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBTLmdldEN1c3RvbWVySURzKCEwKSwgZCA9IFMuX2dldEZpZWxkKCdNQ0NJREgnKSwgZiA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgfHwgKGQgPSAnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyBpbiBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbFtjXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFVLmlzT2JqZWN0RW1wdHkocCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKGkpICYmIChhID0gcFtpXSwgZiArPSAoZiA/ICd8JyA6ICcnKSArIGkgKyAnfCcgKyAoYS5pZCA/IGEuaWQgOiAnJykgKyAoYS5hdXRoU3RhdGUgPyBhLmF1dGhTdGF0ZSA6ICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX25ld0N1c3RvbWVySURzSGFzaCA9IFN0cmluZyhTLl9oYXNoKGYpKSwgUy5fbmV3Q3VzdG9tZXJJRHNIYXNoICE9PSBkICYmIChTLl9jdXN0b21lcklEc0hhc2hDaGFuZ2VkID0gITAsIFMuX21hcEN1c3RvbWVySURzKHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5nZXRDdXN0b21lcklEcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9yZWFkVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gUy5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaih0KSAmJiAobiA9IHJbdF0sIG4uaWQgJiYgKGkuZGF0YVNvdXJjZXNbdF0gfHwgKGkuZGF0YVNvdXJjZXNbdF0gPSB7fSksIGkuZGF0YVNvdXJjZXNbdF0uaWQgPSBuLmlkLCB2b2lkIDAgIT0gbi5hdXRoU3RhdGUgPyBpLmRhdGFTb3VyY2VzW3RdLmF1dGhTdGF0ZSA9IG4uYXV0aFN0YXRlIDogaS5kYXRhU291cmNlc1t0XS5hdXRoU3RhdGUgPSBPLkF1dGhTdGF0ZS5VTktOT1dOLCBuLmhhc2hUeXBlICYmIChpLmRhdGFTb3VyY2VzW3RdLmhhc2hUeXBlID0gbi5oYXNoVHlwZSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gUy5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKHQpICYmIChuID0gYVt0XSwgbi5pZCAmJiAoaS5uYW1lU3BhY2VzW3RdIHx8IChpLm5hbWVTcGFjZXNbdF0gPSB7fSksIGkubmFtZVNwYWNlc1t0XS5pZCA9IG4uaWQsIHZvaWQgMCAhPSBuLmF1dGhTdGF0ZSA/IGkubmFtZVNwYWNlc1t0XS5hdXRoU3RhdGUgPSBuLmF1dGhTdGF0ZSA6IGkubmFtZVNwYWNlc1t0XS5hdXRoU3RhdGUgPSBPLkF1dGhTdGF0ZS5VTktOT1dOLCBuLmhhc2hUeXBlICYmIChpLm5hbWVTcGFjZXNbdF0uaGFzaFR5cGUgPSBuLmhhc2hUeXBlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBpIDogaS5kYXRhU291cmNlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5zZXRBbmFseXRpY3NWaXNpdG9ySUQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fc2V0QW5hbHl0aWNzRmllbGRzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLmdldEFuYWx5dGljc1Zpc2l0b3JJRCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXEuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmICFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLl9jYWxsQ2FsbGJhY2soZSwgWycnXSksICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuIHx8IChpID0gUy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEFuYWx5dGljc1Zpc2l0b3JJRChlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBpIHx8IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4gPyBTLm1hcmtldGluZ0Nsb3VkU2VydmVyIDogUy50cmFja2luZ1NlcnZlciwgYSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMubG9hZFNTTCAmJiAobiA/IFMubWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmUgJiYgKHIgPSBTLm1hcmtldGluZ0Nsb3VkU2VydmVyU2VjdXJlKSA6IFMudHJhY2tpbmdTZXJ2ZXJTZWN1cmUgJiYgKHIgPSBTLnRyYWNraW5nU2VydmVyU2VjdXJlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICdodHRwJyArIChTLmxvYWRTU0wgPyAncycgOiAnJykgKyAnOi8vJyArIHIgKyAnL2lkJywgYyA9ICdkX3Zpc2lkX3Zlcj0nICsgUy52ZXJzaW9uICsgJyZtY29yZ2lkPScgKyBlbmNvZGVVUklDb21wb25lbnQoUy5tYXJrZXRpbmdDbG91ZE9yZ0lEKSArIChpID8gJyZtaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChpKSA6ICcnKSArIChTLmlkU3luY0Rpc2FibGUzcmRQYXJ0eVN5bmNpbmcgfHwgUy5kaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXMgPyAnJmRfY29wcGE9dHJ1ZScgOiAnJyksIHUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NfY19pbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5faW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19zZXQnICsgKG4gPyAnTWFya2V0aW5nQ2xvdWQnIDogJ0FuYWx5dGljcycpICsgJ0ZpZWxkcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBzICsgJz8nICsgYyArICcmY2FsbGJhY2s9c19jX2lsJTVCJyArIFMuX2luICsgJyU1RC5fc2V0JyArIChuID8gJ01hcmtldGluZ0Nsb3VkJyA6ICdBbmFseXRpY3MnKSArICdGaWVsZHMnLCBvLmNvcnNVcmwgPSBzICsgJz8nICsgYywgby5jYWxsYmFjayA9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLnVybCA9IGEsIFMuX2dldFJlbW90ZUZpZWxkKG4gPyBUIDogdywgYSwgZSwgdCwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUy5fZ2V0RmllbGQodyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuICYmIHEuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmIChuID0gUy5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuIHx8ICFxLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFMuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoKSwgciA9IGkudXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fZ2V0UmVtb3RlRmllbGQoJ01DQUFNTEgnLCByLCBlLCB0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuZ2V0TG9jYXRpb25IaW50ID0gUy5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQsIFMuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEF1ZGllbmNlTWFuYWdlckJsb2IoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBTLl9nZXRGaWVsZCh3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gJiYgcS5pc1RyYWNraW5nU2VydmVyUG9wdWxhdGVkKCkgJiYgKG4gPSBTLmdldEFuYWx5dGljc1Zpc2l0b3JJRChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuIHx8ICFxLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFMuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoKSwgciA9IGkudXJsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fY3VzdG9tZXJJRHNIYXNoQ2hhbmdlZCAmJiBTLl9zZXRGaWVsZEV4cGlyZSh4LCAtMSksIFMuX2dldFJlbW90ZUZpZWxkKHgsIHIsIGUsIHQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCA9ICcnLCBTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQgPSB7fSwgUy5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCA9ICcnLCBTLl9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgPSB7fSwgUy5nZXRTdXBwbGVtZW50YWxEYXRhSUQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCB8fCB0IHx8IChTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gUy5fZ2VuZXJhdGVJRCgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFMuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCAmJiAhUy5fc3VwcGxlbWVudGFsRGF0YUlETGFzdENvbnN1bWVkW2VdID8gKG4gPSBTLl9zdXBwbGVtZW50YWxEYXRhSURMYXN0LCBTLl9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWRbZV0gPSAhMCkgOiBuICYmIChTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWRbZV0gJiYgKFMuX3N1cHBsZW1lbnRhbERhdGFJRExhc3QgPSBTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50LCBTLl9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgPSBTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQsIFMuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgPSBuID0gdCA/ICcnIDogUy5fZ2VuZXJhdGVJRCgxKSwgUy5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkID0ge30pLCBuICYmIChTLl9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWRbZV0gPSAhMCkpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9saWJlcmF0ZWRPcHRPdXQgPSBudWxsLCBTLmdldE9wdE91dCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFMuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoJ19zZXRNYXJrZXRpbmdDbG91ZEZpZWxkcycpLCBpID0gbi51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLl9nZXRSZW1vdGVGaWVsZCgnTUNPUFRPVVQnLCBpLCBlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTLl9yZWdpc3RlckNhbGxiYWNrKCdsaWJlcmF0ZWRPcHRPdXQnLCBlKSwgbnVsbCAhPT0gUy5fbGliZXJhdGVkT3B0T3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLl9jYWxsQWxsQ2FsbGJhY2tzKCdsaWJlcmF0ZWRPcHRPdXQnLCBbUy5fbGliZXJhdGVkT3B0T3V0XSksIEIgPSAhMSwgUy5fbGliZXJhdGVkT3B0T3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdsaWJlcmF0ZWRHZXRPcHRPdXQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY29yc1VybCA9IG4uY29yc1VybC5yZXBsYWNlKC9cLmRlbWRleFwubmV0XC9pZFw/LywgJy5kZW1kZXgubmV0L29wdE91dFN0YXR1cz8nKSwgbi5jYWxsYmFjayA9IFtyXSwgQ1tyXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IE9iamVjdChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgaSA9IFUucGFyc2VPcHRPdXQoZSwgdCwgRik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBpLm9wdE91dCwgbiA9IDEwMDAgKiBpLmRfb3R0bCwgUy5fbGliZXJhdGVkT3B0T3V0ID0gdCwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9saWJlcmF0ZWRPcHRPdXQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fY2FsbEFsbENhbGxiYWNrcygnbGliZXJhdGVkT3B0T3V0JywgW3RdKSwgQiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVi5maXJlQ09SUyhuKSwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5pc09wdGVkT3V0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgfHwgKHQgPSBPLk9wdE91dC5HTE9CQUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBTLmdldE9wdE91dChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbiA9PT0gTy5PcHRPdXQuR0xPQkFMIHx8IG4uaW5kZXhPZih0KSA+PSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2NhbGxDYWxsYmFjayhlLCBbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/IGkgPT09IE8uT3B0T3V0LkdMT0JBTCB8fCBpLmluZGV4T2YodCkgPj0gMCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3M6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMub25SZWNlaXZlRWNpZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcuc3Vic2NyaWJlZCA9ICEwLCBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgRy5jYWxsYmFja3MucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fZmllbGRzID0gbnVsbCwgUy5fZmllbGRzRXhwaXJlZCA9IG51bGwsIFMuX2hhc2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLmNoYXJDb2RlQXQodCksIGkgPSAoaSA8PCA1KSAtIGkgKyBuLCBpICY9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fZ2VuZXJhdGVJRCA9IHJlLCBTLl9nZW5lcmF0ZUxvY2FsTUlEID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTLl9nZW5lcmF0ZUlEKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFcuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSAhMCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fY2FsbGJhY2tMaXN0ID0gbnVsbCwgUy5fY2FsbENhbGxiYWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSA/IGUuYXBwbHkoQSwgdCkgOiBlWzFdLmFwcGx5KGVbMF0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9yZWdpc3RlckNhbGxiYWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG51bGwgPT0gUy5fY2FsbGJhY2tMaXN0ICYmIChTLl9jYWxsYmFja0xpc3QgPSB7fSksIHZvaWQgMCA9PSBTLl9jYWxsYmFja0xpc3RbZV0gJiYgKFMuX2NhbGxiYWNrTGlzdFtlXSA9IFtdKSwgUy5fY2FsbGJhY2tMaXN0W2VdLnB1c2godCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9jYWxsQWxsQ2FsbGJhY2tzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IFMuX2NhbGxiYWNrTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUy5fY2FsbGJhY2tMaXN0W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgbi5sZW5ndGggPiAwOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2NhbGxDYWxsYmFjayhuLnNoaWZ0KCksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9hZGRRdWVyeXN0cmluZ1BhcmFtID0gZnVuY3Rpb24gKGUsIHQsIG4sIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZW5jb2RlVVJJQ29tcG9uZW50KHQpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4pLCBhID0gcS5wYXJzZUhhc2goZSksIG8gPSBxLmhhc2hsZXNzVXJsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xID09PSBvLmluZGV4T2YoJz8nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyArICc/JyArIHIgKyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBvLnNwbGl0KCc/JyksIGMgPSBzWzBdICsgJz8nLCB1ID0gc1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjICsgcS5hZGRRdWVyeVBhcmFtQXRMb2NhdGlvbih1LCByLCBpKSArIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX2V4dHJhY3RQYXJhbUZyb21VcmkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgUmVnRXhwKCdbXFw/JiNdJyArIHQgKyAnPShbXiYjXSopJyksIGkgPSBuLmV4ZWMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAmJiBpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGlbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9wYXJzZUFkb2JlTWNGcm9tVXJsID0gYShvZS5BRE9CRV9NQyksIFMuX3BhcnNlQWRvYmVNY1NkaWRGcm9tVXJsID0gYShvZS5BRE9CRV9NQ19TRElEKSwgUy5fYXR0ZW1wdFRvUG9wdWxhdGVTZGlkRnJvbVVybCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFMuX3BhcnNlQWRvYmVNY1NkaWRGcm9tVXJsKGUpLCBpID0gMTAwMDAwMDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbi5UUyAmJiAoaSA9IHEuZ2V0VGltZXN0YW1wSW5TZWNvbmRzKCkgLSBuLlRTKSwgbiAmJiBuLlNESUQgJiYgbi5NQ09SR0lEID09PSB0ICYmIGkgPCBTLnNkaWRQYXJhbUV4cGlyeSAmJiAoUy5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCA9IG4uU0RJRCwgUy5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkLlNESURfVVJMX1BBUkFNID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9hdHRlbXB0VG9Qb3B1bGF0ZUlkc0Zyb21VcmwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFMuX3BhcnNlQWRvYmVNY0Zyb21VcmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuVFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHEuZ2V0VGltZXN0YW1wSW5TZWNvbmRzKCksIGkgPSBuIC0gZS5UUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihpIC8gNjApID4gb2UuQURPQkVfTUNfVFRMX0lOX01JTiB8fCBlLk1DT1JHSUQgIT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9tZXJnZVNlcnZlclN0YXRlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS5pc09iamVjdChlKSA/IGUgOiBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSwgZVtTLm1hcmtldGluZ0Nsb3VkT3JnSURdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVbUy5tYXJrZXRpbmdDbG91ZE9yZ0lEXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEuaXNPYmplY3QoZSkgJiYgUy5zZXRDdXN0b21lcklEcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odC5jdXN0b21lcklEcyksIHModC5zZGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgc2VydmVyU3RhdGVgIGhhcyBhbiBpbnZhbGlkIGZvcm1hdC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX3RpbWVvdXQgPSBudWxsLCBTLl9sb2FkRGF0YSA9IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gUy5fYWRkUXVlcnlzdHJpbmdQYXJhbSh0LCAnZF9maWVsZGdyb3VwJywgZSwgMSksIGkudXJsID0gUy5fYWRkUXVlcnlzdHJpbmdQYXJhbShpLnVybCwgJ2RfZmllbGRncm91cCcsIGUsIDEpLCBpLmNvcnNVcmwgPSBTLl9hZGRRdWVyeXN0cmluZ1BhcmFtKGkuY29yc1VybCwgJ2RfZmllbGRncm91cCcsIGUsIDEpLCBXLmZpZWxkR3JvdXBPYmpbZV0gPSAhMCwgaSA9PT0gT2JqZWN0KGkpICYmIGkuY29yc1VybCAmJiAnWE1MSHR0cFJlcXVlc3QnID09PSBWLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSAmJiBWLmZpcmVDT1JTKGksIG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPSBTLl90aW1lb3V0ICYmIFMuX3RpbWVvdXRbZV0gJiYgKGNsZWFyVGltZW91dChTLl90aW1lb3V0W2VdKSwgUy5fdGltZW91dFtlXSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9zZXR0aW5nc0RpZ2VzdCA9IDAsIFMuX2dldFNldHRpbmdzRGlnZXN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTLl9zZXR0aW5nc0RpZ2VzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gUy52ZXJzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuYXVkaWVuY2VNYW5hZ2VyU2VydmVyICYmIChlICs9ICd8JyArIFMuYXVkaWVuY2VNYW5hZ2VyU2VydmVyKSwgUy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUgJiYgKGUgKz0gJ3wnICsgUy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUpLCBTLl9zZXR0aW5nc0RpZ2VzdCA9IFMuX2hhc2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fc2V0dGluZ3NEaWdlc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX3JlYWRWaXNpdG9yRG9uZSA9ICExLCBTLl9yZWFkVmlzaXRvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUy5fcmVhZFZpc2l0b3JEb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3JEb25lID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQsIG4sIGksIHIsIGEsIG8gPSBTLl9nZXRTZXR0aW5nc0RpZ2VzdCgpLCBzID0gITEsIGMgPSBTLmNvb2tpZVJlYWQoUy5jb29raWVOYW1lKSwgdSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgfHwgYiB8fCBTLmRpc2NhcmRUcmFja2luZ1NlcnZlckVDSUQgfHwgKGMgPSBTLmNvb2tpZVJlYWQob2UuRklSU1RfUEFSVFlfU0VSVkVSX0NPT0tJRSkpLCBudWxsID09IFMuX2ZpZWxkcyAmJiAoUy5fZmllbGRzID0ge30pLCBjICYmICdUJyAhPT0gYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gYy5zcGxpdCgnfCcpLCBjWzBdLm1hdGNoKC9eW1wtMC05XSskLykgJiYgKHBhcnNlSW50KGNbMF0sIDEwKSAhPT0gbyAmJiAocyA9ICEwKSwgYy5zaGlmdCgpKSwgYy5sZW5ndGggJSAyID09IDEgJiYgYy5wb3AoKSwgZSA9IDA7IGUgPCBjLmxlbmd0aDsgZSArPSAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGNbZV0uc3BsaXQoJy0nKSwgbiA9IHRbMF0sIGkgPSBjW2UgKyAxXSwgdC5sZW5ndGggPiAxID8gKHIgPSBwYXJzZUludCh0WzFdLCAxMCksIGEgPSB0WzFdLmluZGV4T2YoJ3MnKSA+IDApIDogKHIgPSAwLCBhID0gITEpLCBzICYmICgnTUNDSURIJyA9PT0gbiAmJiAoaSA9ICcnKSwgciA+IDAgJiYgKHIgPSB1LmdldFRpbWUoKSAvIDEwMDAgLSA2MCkpLCBuICYmIGkgJiYgKFMuX3NldEZpZWxkKG4sIGksIDEpLCByID4gMCAmJiAoUy5fZmllbGRzWydleHBpcmUnICsgbl0gPSByICsgKGEgPyAncycgOiAnJyksICh1LmdldFRpbWUoKSA+PSAxMDAwICogciB8fCBhICYmICFTLmNvb2tpZVJlYWQoUy5zZXNzaW9uQ29va2llTmFtZSkpICYmIChTLl9maWVsZHNFeHBpcmVkIHx8IChTLl9maWVsZHNFeHBpcmVkID0ge30pLCBTLl9maWVsZHNFeHBpcmVkW25dID0gITApKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVMuX2dldEZpZWxkKHcpICYmIHEuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmIChjID0gUy5jb29raWVSZWFkKCdzX3ZpJykpICYmIChjID0gYy5zcGxpdCgnfCcpLCBjLmxlbmd0aCA+IDEgJiYgY1swXS5pbmRleE9mKCd2MScpID49IDAgJiYgKGkgPSBjWzFdLCBlID0gaS5pbmRleE9mKCdbJyksIGUgPj0gMCAmJiAoaSA9IGkuc3Vic3RyaW5nKDAsIGUpKSwgaSAmJiBpLm1hdGNoKG9lLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpICYmIFMuX3NldEZpZWxkKHcsIGkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX2FwcGVuZFZlcnNpb25UbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICd2VmVyc2lvbnwnICsgUy52ZXJzaW9uLCBuID0gZSA/IFMuX2dldENvb2tpZVZlcnNpb24oZSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyB0ZS5hcmVWZXJzaW9uc0RpZmZlcmVudChuLCBTLnZlcnNpb24pICYmIChlID0gZS5yZXBsYWNlKG9lLlZFUlNJT05fUkVHRVgsIHQpKSA6IGUgKz0gKGUgPyAnfCcgOiAnJykgKyB0LCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl93cml0ZVZpc2l0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgbiA9IFMuX2dldFNldHRpbmdzRGlnZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgaW4gUy5fZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGooZSkgJiYgUy5fZmllbGRzW2VdICYmICdleHBpcmUnICE9PSBlLnN1YnN0cmluZygwLCA2KSAmJiAodCA9IFMuX2ZpZWxkc1tlXSwgbiArPSAobiA/ICd8JyA6ICcnKSArIGUgKyAoUy5fZmllbGRzWydleHBpcmUnICsgZV0gPyAnLScgKyBTLl9maWVsZHNbJ2V4cGlyZScgKyBlXSA6ICcnKSArICd8JyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IFMuX2FwcGVuZFZlcnNpb25UbyhuKSwgUy5jb29raWVXcml0ZShTLmNvb2tpZU5hbWUsIG4sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9nZXRGaWVsZCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSBTLl9maWVsZHMgfHwgIXQgJiYgUy5fZmllbGRzRXhwaXJlZCAmJiBTLl9maWVsZHNFeHBpcmVkW2VdID8gbnVsbCA6IFMuX2ZpZWxkc1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc2V0RmllbGQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBTLl9maWVsZHMgJiYgKFMuX2ZpZWxkcyA9IHt9KSwgUy5fZmllbGRzW2VdID0gdCwgbiB8fCBTLl93cml0ZVZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fZ2V0RmllbGRMaXN0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUy5fZ2V0RmllbGQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IG4uc3BsaXQoJyonKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX3NldEZpZWxkTGlzdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9zZXRGaWVsZChlLCB0ID8gdC5qb2luKCcqJykgOiAnJywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX2dldEZpZWxkTWFwID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUy5fZ2V0RmllbGRMaXN0KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSArPSAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByW25baV1dID0gbltpICsgMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc2V0RmllbGRNYXAgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGooaSkgJiYgKHIucHVzaChpKSwgci5wdXNoKHRbaV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX3NldEZpZWxkTGlzdChlLCByLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc2V0RmllbGRFeHBpcmUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zZXRUaW1lKGkuZ2V0VGltZSgpICsgMTAwMCAqIHQpLCBudWxsID09IFMuX2ZpZWxkcyAmJiAoUy5fZmllbGRzID0ge30pLCBTLl9maWVsZHNbJ2V4cGlyZScgKyBlXSA9IE1hdGguZmxvb3IoaS5nZXRUaW1lKCkgLyAxMDAwKSArIChuID8gJ3MnIDogJycpLCB0IDwgMCA/IChTLl9maWVsZHNFeHBpcmVkIHx8IChTLl9maWVsZHNFeHBpcmVkID0ge30pLCBTLl9maWVsZHNFeHBpcmVkW2VdID0gITApIDogUy5fZmllbGRzRXhwaXJlZCAmJiAoUy5fZmllbGRzRXhwaXJlZFtlXSA9ICExKSwgbiAmJiAoUy5jb29raWVSZWFkKFMuc2Vzc2lvbkNvb2tpZU5hbWUpIHx8IFMuY29va2llV3JpdGUoUy5zZXNzaW9uQ29va2llTmFtZSwgJzEnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX2ZpbmRWaXNpdG9ySUQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgKCdvYmplY3QnID09PSBlKHQpICYmICh0ID0gdC5kX21pZCA/IHQuZF9taWQgOiB0LnZpc2l0b3JJRCA/IHQudmlzaXRvcklEIDogdC5pZCA/IHQuaWQgOiB0LnV1aWQgPyB0LnV1aWQgOiAnJyArIHQpLCB0ICYmICdOT1RBUkdFVCcgPT09ICh0ID0gdC50b1VwcGVyQ2FzZSgpKSAmJiAodCA9IEYpLCB0ICYmICh0ID09PSBGIHx8IHQubWF0Y2gob2UuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkpIHx8ICh0ID0gJycpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc2V0RmllbGRzID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTLl9jbGVhclRpbWVvdXQodCksIG51bGwgIT0gUy5fbG9hZGluZyAmJiAoUy5fbG9hZGluZ1t0XSA9ICExKSwgVy5maWVsZEdyb3VwT2JqW3RdICYmIFcuc2V0U3RhdGUodCwgITEpLCB0ID09PSBFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgIT09IFcuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgJiYgKFcuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBTLl9nZXRGaWVsZChUKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgUy5vdmVyd3JpdGVDcm9zc0RvbWFpbk1DSURBbmRBSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaSA9ICdvYmplY3QnID09PSBlKG4pICYmIG4ubWlkID8gbi5taWQgOiBTLl9maW5kVmlzaXRvcklEKG4pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMuX3VzZTFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIgJiYgIVMudHJpZWQxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTLnRyaWVkMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciA9ICEwLCB2b2lkIFMuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKG51bGwsICExLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gUy5fZ2VuZXJhdGVMb2NhbE1JRCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX3NldEZpZWxkKFQsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIGkgIT09IEYgfHwgKGkgPSAnJyksICdvYmplY3QnID09PSBlKG4pICYmICgobi5kX3JlZ2lvbiB8fCBuLmRjc19yZWdpb24gfHwgbi5kX2Jsb2IgfHwgbi5ibG9iKSAmJiBTLl9zZXRGaWVsZHMoTiwgbiksIFMuX3VzZTFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIgJiYgbi5taWQgJiYgUy5fc2V0RmllbGRzKFIsIHsgaWQ6IG4uaWQgfSkpLCBTLl9jYWxsQWxsQ2FsbGJhY2tzKFQsIFtpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gTiAmJiAnb2JqZWN0JyA9PT0gZShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gNjA0ODAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPSBuLmlkX3N5bmNfdHRsICYmIG4uaWRfc3luY190dGwgJiYgKHIgPSBwYXJzZUludChuLmlkX3N5bmNfdHRsLCAxMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gWC5nZXRSZWdpb25BbmRDaGVja0lmQ2hhbmdlZChuLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9jYWxsQWxsQ2FsbGJhY2tzKCdNQ0FBTUxIJywgW2FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFMuX2dldEZpZWxkKHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuLmRfYmxvYiB8fCBuLmJsb2IpICYmIChvID0gbi5kX2Jsb2IsIG8gfHwgKG8gPSBuLmJsb2IpLCBTLl9zZXRGaWVsZEV4cGlyZSh4LCByKSwgUy5fc2V0RmllbGQoeCwgbykpLCBvIHx8IChvID0gJycpLCBTLl9jYWxsQWxsQ2FsbGJhY2tzKHgsIFtvXSksICFuLmVycm9yX21zZyAmJiBTLl9uZXdDdXN0b21lcklEc0hhc2ggJiYgUy5fc2V0RmllbGQoJ01DQ0lESCcsIFMuX25ld0N1c3RvbWVySURzSGFzaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gUy5fZ2V0RmllbGQodyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAmJiAhUy5vdmVyd3JpdGVDcm9zc0RvbWFpbk1DSURBbmRBSUQgfHwgKHMgPSBTLl9maW5kVmlzaXRvcklEKG4pLCBzID8gcyAhPT0gRiAmJiBTLl9zZXRGaWVsZEV4cGlyZSh4LCAtMSkgOiBzID0gRiwgUy5fc2V0RmllbGQodywgcykpLCBzICYmIHMgIT09IEYgfHwgKHMgPSAnJyksIFMuX2NhbGxBbGxDYWxsYmFja3ModywgW3NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTLmlkU3luY0Rpc2FibGVTeW5jcyB8fCBTLmRpc2FibGVJZFN5bmNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFguaWRDYWxsTm90UHJvY2Vzc3NlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWC5pZENhbGxOb3RQcm9jZXNzc2VkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmlicyA9IG4uaWJzLCBjLnN1YmRvbWFpbiA9IG4uc3ViZG9tYWluLCBYLnByb2Nlc3NJRENhbGxEYXRhKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT09IE9iamVjdChuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1LCBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoKSAmJiBTLmlzQWxsb3dlZCgpICYmICh1ID0gUy5fZ2V0RmllbGQoJ01DT1BUT1VUJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gVS5wYXJzZU9wdE91dChuLCB1LCBGKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gZi5vcHRPdXQsIGwgPSBmLmRfb3R0bCwgUy5fc2V0RmllbGRFeHBpcmUoJ01DT1BUT1VUJywgbCwgITApLCBTLl9zZXRGaWVsZCgnTUNPUFRPVVQnLCB1KSwgUy5fY2FsbEFsbENhbGxiYWNrcygnTUNPUFRPVVQnLCBbdV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9sb2FkaW5nID0gbnVsbCwgUy5fZ2V0UmVtb3RlRmllbGQgPSBmdW5jdGlvbiAoZSwgdCwgbiwgaSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIG8gPSAnJywgcyA9IHEuaXNGaXJzdFBhcnR5QW5hbHl0aWNzVmlzaXRvcklEQ2FsbChlKSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNQjogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQoKSAmJiBTLmlzQWxsb3dlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3IoKSwgbyA9IFMuX2dldEZpZWxkKGUsICEwID09PSBjW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICghbyB8fCBTLl9maWVsZHNFeHBpcmVkICYmIFMuX2ZpZWxkc0V4cGlyZWRbZV0pICYmICghUy5kaXNhYmxlVGhpcmRQYXJ0eUNhbGxzIHx8IHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IFQgfHwgJ01DT1BUT1VUJyA9PT0gZSA/IGEgPSBFIDogJ01DQUFNTEgnID09PSBlIHx8IGUgPT09IHggPyBhID0gTiA6IGUgPT09IHcgJiYgKGEgPSBSKSwgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdCB8fCBudWxsICE9IFMuX2xvYWRpbmcgJiYgUy5fbG9hZGluZ1thXSB8fCAobnVsbCA9PSBTLl9sb2FkaW5nICYmIChTLl9sb2FkaW5nID0ge30pLCBTLl9sb2FkaW5nW2FdID0gITAsIGEgPT09IE4gJiYgKEQgPSAwKSwgUy5fbG9hZERhdGEoYSwgdCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMuX2dldEZpZWxkKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgVy5zZXRTdGF0ZShhLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT09IFQgPyBuID0gUy5fZ2VuZXJhdGVMb2NhbE1JRCgpIDogYSA9PT0gTiAmJiAobiA9IHsgZXJyb3JfbXNnOiAndGltZW91dCcgfSksIFMuX3NldEZpZWxkcyhhLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByKSksIFMuX3JlZ2lzdGVyQ2FsbGJhY2soZSwgbiksIG8gfHwgKHQgfHwgUy5fc2V0RmllbGRzKGEsIHsgaWQ6IEYgfSksICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCAoZSA9PT0gVCA/IChTLl9yZWdpc3RlckNhbGxiYWNrKGUsIG4pLCBvID0gUy5fZ2VuZXJhdGVMb2NhbE1JRCgpLCBTLnNldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKG8pKSA6IGUgPT09IHcgPyAoUy5fcmVnaXN0ZXJDYWxsYmFjayhlLCBuKSwgbyA9ICcnLCBTLnNldEFuYWx5dGljc1Zpc2l0b3JJRChvKSkgOiAobyA9ICcnLCBpID0gITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICE9PSBUICYmIGUgIT09IHcgfHwgbyAhPT0gRiB8fCAobyA9ICcnLCBpID0gITApLCBuICYmIGkgJiYgUy5fY2FsbENhbGxiYWNrKG4sIFtvXSksIGUgPT09IFQgJiYgRy5zdWJzY3JpYmVkICYmIChHLmNhbGxiYWNrcyAmJiBHLmNhbGxiYWNrcy5sZW5ndGggJiYgRy5jYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2NhbGxDYWxsYmFjayhlLCBbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEcuc3Vic2NyaWJlZCA9ICExLCBHLmNhbGxiYWNrcy5sZW5ndGggPSAwKSwgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5fc2V0TWFya2V0aW5nQ2xvdWRGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3IoKSwgUy5fc2V0RmllbGRzKEUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9tYXBDdXN0b21lcklEcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLmdldEF1ZGllbmNlTWFuYWdlckJsb2IoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9zZXRBbmFseXRpY3NGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3IoKSwgUy5fc2V0RmllbGRzKFIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9zZXRBdWRpZW5jZU1hbmFnZXJGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fcmVhZFZpc2l0b3IoKSwgUy5fc2V0RmllbGRzKE4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLl9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIsIG4gPSAnJywgaSA9IFMuX2dldEZpZWxkKFQpLCByID0gUy5fZ2V0RmllbGQoeCwgITApLCBhID0gUy5fZ2V0RmllbGQodyksIG8gPSBhICYmIGEgIT09IEYgPyAnJmRfY2lkX2ljPUFWSUQlMDEnICsgZW5jb2RlVVJJQ29tcG9uZW50KGEpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUy5sb2FkU1NMICYmIFMuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlICYmICh0ID0gUy5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIGMsIHUsIGwgPSBTLmdldEN1c3RvbWVySURzKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbFtjXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVS5pc09iamVjdEVtcHR5KGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAnbmFtZVNwYWNlcycgPT09IGMgPyAnJmRfY2lkX25zPScgOiAnJmRfY2lkX2ljPSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzIGluIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoocykgJiYgKHUgPSBkW3NdLCBvICs9IGYgKyBlbmNvZGVVUklDb21wb25lbnQocykgKyAnJTAxJyArIGVuY29kZVVSSUNvbXBvbmVudCh1LmlkID8gdS5pZCA6ICcnKSArICh1LmF1dGhTdGF0ZSA/ICclMDEnICsgdS5hdXRoU3RhdGUgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSB8fCAoZSA9ICdfc2V0QXVkaWVuY2VNYW5hZ2VyRmllbGRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAnaHR0cCcgKyAoUy5sb2FkU1NMID8gJ3MnIDogJycpICsgJzovLycgKyB0ICsgJy9pZCcsIGcgPSAnZF92aXNpZF92ZXI9JyArIFMudmVyc2lvbiArICh2ICYmIC0xICE9PSBwLmluZGV4T2YoJ2RlbWRleC5uZXQnKSA/ICcmZ2Rwcj0xJmdkcHJfY29uc2VudD0nICsgdiA6ICcnKSArIChEICYmIC0xICE9PSBwLmluZGV4T2YoJ2RlbWRleC5uZXQnKSA/ICcmZF9jZj0nICsgRCA6ICcnKSArICcmZF9ydGJkPWpzb24mZF92ZXI9MicgKyAoIWkgJiYgUy5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciA/ICcmZF92ZXJpZnk9MScgOiAnJykgKyAnJmRfb3JnaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChTLm1hcmtldGluZ0Nsb3VkT3JnSUQpICsgJyZkX25zaWQ9JyArIChTLmlkU3luY0NvbnRhaW5lcklEIHx8IDApICsgKGkgPyAnJmRfbWlkPScgKyBlbmNvZGVVUklDb21wb25lbnQoaSkgOiAnJykgKyAoUy5pZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nIHx8IFMuZGlzYWJsZVRoaXJkUGFydHlDb29raWVzID8gJyZkX2NvcHBhPXRydWUnIDogJycpICsgKCEwID09PSBrID8gJyZkX2Nvb3Bfc2FmZT0xJyA6ICExID09PSBrID8gJyZkX2Nvb3BfdW5zYWZlPTEnIDogJycpICsgKHIgPyAnJmRfYmxvYj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHIpIDogJycpICsgbywgbSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzX2NfaWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5faW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPSBwICsgJz8nICsgZyArICcmZF9jYj1zX2NfaWwlNUInICsgUy5faW4gKyAnJTVELicgKyBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yc1VybDogcCArICc/JyArIGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHVybDogbiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLmFwcGVuZFZpc2l0b3JJRHNUbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5fZ2V0RmllbGQoVCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2dldEZpZWxkKHcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQ09SR0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMubWFya2V0aW5nQ2xvdWRPcmdJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fYWRkUXVlcnlzdHJpbmdQYXJhbShlLCBvZS5BRE9CRV9NQywgYyh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuYXBwZW5kU3VwcGxlbWVudGFsRGF0YUlEVG8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IHQgfHwgUy5nZXRTdXBwbGVtZW50YWxEYXRhSUQocS5nZW5lcmF0ZVJhbmRvbVN0cmluZygpLCAhMCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGMoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0RJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQ09SR0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMubWFya2V0aW5nQ2xvdWRPcmdJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0oZSwgb2UuQURPQkVfTUNfU0RJRCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VIYXNoOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pbmRleE9mKCcjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPiAwID8gZS5zdWJzdHIodCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNobGVzc1VybDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaW5kZXhPZignIycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID4gMCA/IGUuc3Vic3RyKDAsIHQpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRRdWVyeVBhcmFtQXRMb2NhdGlvbjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGUuc3BsaXQoJyYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IG51bGwgIT0gbiA/IG4gOiBpLmxlbmd0aCwgaS5zcGxpY2UobiwgMCwgdCksIGkuam9pbignJicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmlyc3RQYXJ0eUFuYWx5dGljc1Zpc2l0b3JJRENhbGw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT09IHcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCB8fCAodCA9IFMudHJhY2tpbmdTZXJ2ZXIpLCBuIHx8IChuID0gUy50cmFja2luZ1NlcnZlclNlY3VyZSksICEoJ3N0cmluZycgIT0gdHlwZW9mIChpID0gUy5sb2FkU1NMID8gbiA6IHQpIHx8ICFpLmxlbmd0aCkgJiYgKGkuaW5kZXhPZignMm83Lm5ldCcpIDwgMCAmJiBpLmluZGV4T2YoJ29tdHJkYy5uZXQnKSA8IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGUgJiYgZSA9PT0gT2JqZWN0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb29raWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWi5yZW1vdmUoZSwgeyBkb21haW46IFMuY29va2llRG9tYWluIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFTLnRyYWNraW5nU2VydmVyIHx8ICEhUy50cmFja2luZ1NlcnZlclNlY3VyZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lc3RhbXBJblNlY29uZHM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUGlwZURlbGltZXRlZEtleVZhbHVlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zcGxpdCgnfCcpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuc3BsaXQoJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbblswXV0gPSBkZWNvZGVVUklDb21wb25lbnQoblsxXSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmFuZG9tU3RyaW5nOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICcnLCBuID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7IGUtLTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgKz0gbltNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBuLmxlbmd0aCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUJvb2xlYW46IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cnVlJyA9PT0gZSB8fCAnZmFsc2UnICE9PSBlICYmIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VCb29sZWFuOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IGUgfHwgJ2ZhbHNlJyAhPT0gZSAmJiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VNZXRob2RzV2l0aEZ1bmN0aW9uOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eShuKSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBlW25dICYmIChlW25dID0gdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2hlbHBlcnMgPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgWCA9IHNlKFMsIE8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTLl9kZXN0aW5hdGlvblB1Ymxpc2hpbmcgPSBYLCBTLnRpbWVvdXRNZXRyaWNzTG9nID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBXID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0lEQ2FsbFRpbWVkT3V0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5hbHl0aWNzSURDYWxsVGltZWRPdXQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQU1JRENhbGxUaW1lZE91dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkR3JvdXBPYmo6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdCA/ICEwICE9PSB0aGlzLk1DSURDYWxsVGltZWRPdXQgJiYgKHRoaXMuTUNJRENhbGxUaW1lZE91dCA9ICExKSA6IHRoaXMuTUNJRENhbGxUaW1lZE91dCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITEgPT09IHQgPyAhMCAhPT0gdGhpcy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCAmJiAodGhpcy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCA9ICExKSA6IHRoaXMuQW5hbHl0aWNzSURDYWxsVGltZWRPdXQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE46CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICExID09PSB0ID8gITAgIT09IHRoaXMuQUFNSURDYWxsVGltZWRPdXQgJiYgKHRoaXMuQUFNSURDYWxsVGltZWRPdXQgPSAhMSkgOiB0aGlzLkFBTUlEQ2FsbFRpbWVkT3V0ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVy5pc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5NQ0lEQ2FsbFRpbWVkT3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFcuTUNJRENhbGxUaW1lZE91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLkFBTUlEQ2FsbFRpbWVkT3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFcuQUFNSURDYWxsVGltZWRPdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuaWRTeW5jR2V0T25QYWdlU3luY0luZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUy5fcmVhZFZpc2l0b3IoKSwgUy5fZ2V0RmllbGQoJ01DU1lOQ1NPUCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLmlkU3luY0J5VVJMID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUy5pc09wdGVkT3V0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUoZSB8fCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBpLCByID0gZS51cmwsIGEgPSBlbmNvZGVVUklDb21wb25lbnQsIG8gPSBYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gci5yZXBsYWNlKC9eaHR0cHM6LywgJycpLnJlcGxhY2UoL15odHRwOi8sICcnKSwgbiA9IFUuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0KFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5kcHV1aWQgfHwgJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCAnLCcpLCBpID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShlLmRwaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC50dGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgby5hZGRNZXNzYWdlKGkuam9pbignfCcpKSwgby5yZXF1ZXN0VG9Qcm9jZXNzKCksICdTdWNjZXNzZnVsbHkgcXVldWVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5pZFN5bmNCeURhdGFTb3VyY2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTLmlzT3B0ZWRPdXQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gT2JqZWN0KGUpICYmICdzdHJpbmcnID09IHR5cGVvZiBlLmRwdXVpZCAmJiBlLmRwdXVpZC5sZW5ndGggPyAoZS51cmwgPSAnLy9kcG0uZGVtZGV4Lm5ldC9pYnM6ZHBpZD0nICsgZS5kcGlkICsgJyZkcHV1aWQ9JyArIGUuZHB1dWlkLCBTLmlkU3luY0J5VVJMKGUpKSA6ICdFcnJvcjogY29uZmlnIG9yIGNvbmZpZy5kcHV1aWQgaXMgZW1wdHknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBZZShTLCBYKSwgUy5fZ2V0Q29va2llVmVyc2lvbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBTLmNvb2tpZVJlYWQoUy5jb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gb2UuVkVSU0lPTl9SRUdFWC5leGVjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgdC5sZW5ndGggPiAxID8gdFsxXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFMuX3Jlc2V0QW1jdkNvb2tpZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFMuX2dldENvb2tpZVZlcnNpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgIXRlLmlzTGVzc1RoYW4odCwgZSkgfHwgUy5yZW1vdmVDb29raWUoUy5jb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUy5zZXRBc0Nvb3BTYWZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTLnNldEFzQ29vcFVuc2FmZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFMuY29uZmlncyA9IE9iamVjdC5jcmVhdGUobnVsbCksIHEuaXNPYmplY3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKGUpICYmIChTW2VdID0gbltlXSwgUy5jb25maWdzW2VdID0gbltlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgpICYmIChJLm9wdEluLmZldGNoUGVybWlzc2lvbnMoaCwgITApLCAhSS5vcHRJbi5pc0FwcHJvdmVkKEkub3B0SW4uQ2F0ZWdvcmllcy5FQ0lEKSkgfHwgSyB8fCAoSyA9ICEwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEuaXNPYmplY3QobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pZFN5bmNDb250YWluZXJJRCA9IFMuaWRTeW5jQ29udGFpbmVySUQgfHwgMCwgayA9ICdib29sZWFuJyA9PSB0eXBlb2YgUy5pc0Nvb3BTYWZlID8gUy5pc0Nvb3BTYWZlIDogcS5wYXJzZUJvb2xlYW4oUy5pc0Nvb3BTYWZlKSwgUy5yZXNldEJlZm9yZVZlcnNpb24gJiYgUy5fcmVzZXRBbWN2Q29va2llKFMucmVzZXRCZWZvcmVWZXJzaW9uKSwgUy5fYXR0ZW1wdFRvUG9wdWxhdGVJZHNGcm9tVXJsKCksIFMuX2F0dGVtcHRUb1BvcHVsYXRlU2RpZEZyb21VcmwoKSwgUy5fcmVhZFZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTLl9nZXRGaWVsZChQKSwgdCA9IE1hdGguY2VpbChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIG9lLk1JTExJU19QRVJfREFZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUy5pZFN5bmNEaXNhYmxlU3luY3MgfHwgUy5kaXNhYmxlSWRTeW5jcyB8fCAhWC5jYW5NYWtlU3luY0lEQ2FsbChlLCB0KSB8fCAoUy5fc2V0RmllbGRFeHBpcmUoeCwgLTEpLCBTLl9zZXRGaWVsZChQLCB0KSksIFMuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKSwgUy5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQoKSwgUy5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKCksIFMuX21lcmdlU2VydmVyU3RhdGUoUy5zZXJ2ZXJTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybCgpLCBTLl9hdHRlbXB0VG9Qb3B1bGF0ZVNkaWRGcm9tVXJsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVMuaWRTeW5jRGlzYWJsZVN5bmNzICYmICFTLmRpc2FibGVJZFN5bmNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFguY2hlY2tEUElmcmFtZVNyYygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVhZHlUb0F0dGFjaElmcmFtZSgpICYmIGUuYXR0YWNoSWZyYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ud2luZG93TG9hZGVkID0gITAsIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZS5yZWNlaXZlTWVzc2FnZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgucmVjZWl2ZU1lc3NhZ2UoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFguaWZyYW1lSG9zdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMud2hpdGVsaXN0SWZyYW1lRG9tYWlucyAmJiBvZS5QT1NUX01FU1NBR0VfRU5BQkxFRCAmJiAoUy53aGl0ZWxpc3RJZnJhbWVEb21haW5zID0gUy53aGl0ZWxpc3RJZnJhbWVEb21haW5zIGluc3RhbmNlb2YgQXJyYXkgPyBTLndoaXRlbGlzdElmcmFtZURvbWFpbnMgOiBbUy53aGl0ZWxpc3RJZnJhbWVEb21haW5zXSwgUy53aGl0ZWxpc3RJZnJhbWVEb21haW5zLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgWSh0LCBlKSwgaSA9IFEoUywgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllLnJlY2VpdmVNZXNzYWdlKGksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZS5jb25maWcgPSB1ZSwgQy5WaXNpdG9yID0gSmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHplID0gSmUsIFFlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChVLmlzT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICE9PSBlW3RdICYmIHVlLmdldENvbmZpZ3MoKVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB1ZS5ub3JtYWxpemVDb25maWcobiwgZVtuXSksIHIgPSBVLm5vcm1hbGl6ZUJvb2xlYW4oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W25dID0gciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJGUgPSBHZS5PcHRJbiwgWmUgPSBHZS5JYWJQbHVnaW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHplLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaXNpdG9yIHJlcXVpcmVzIEFkb2JlIE1hcmtldGluZyBDbG91ZCBPcmcgSUQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5kZXhPZignQCcpIDwgMCAmJiAoZSArPSAnQEFkb2JlT3JnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBDLnNfY19pbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICYmICdWaXNpdG9yJyA9PT0gaS5fYyAmJiBpLm1hcmtldGluZ0Nsb3VkT3JnSUQgPT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBRZSh0KSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLmFkb2JlLm9wdEluID0gQy5hZG9iZS5vcHRJbiB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBVLnBsdWNrKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb2VzT3B0SW5BcHBseScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmlvdXNQZXJtaXNzaW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlT3B0SW5BcHByb3ZhbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzT3B0SW5TdG9yYWdlRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0SW5TdG9yYWdlRXhwaXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0lhYkNvbnRleHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBuID0gZS5vcHRJbkNvb2tpZURvbWFpbiB8fCBlLmNvb2tpZURvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiB8fCBlZSgpLCBuID0gbiA9PT0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID8gJycgOiBuLCB0Lm9wdEluQ29va2llRG9tYWluID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyAkZSh0LCB7IGNvb2tpZXM6IFogfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuaXNJYWJDb250ZXh0ICYmIHQuZG9lc09wdEluQXBwbHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgWmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWdpc3RlclBsdWdpbihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSB8fCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZSwgYSA9IHIuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSwgbyA9IG5ldyB6ZShlLCBudWxsLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jb29raWVEb21haW4gJiYgKG8uY29va2llRG9tYWluID0gaS5jb29raWVEb21haW4pLCBpLnNhbWVTaXRlQ29va2llICYmIGkuc2VjdXJlQ29va2llICYmIChvLmNvbmZpZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lU2l0ZUNvb2tpZTogaS5zYW1lU2l0ZUNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZUNvb2tpZTogaS5zZWN1cmVDb29raWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMuc19jX2lsLnNwbGljZSgtLUMuc19jX2luLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IFUuZ2V0SWVWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PSB0eXBlb2YgcyAmJiBzIDwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5faGVscGVycy5yZXBsYWNlTWV0aG9kc1dpdGhGdW5jdGlvbihvLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDLnNlbGYgIT09IEMucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpICYmICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY29va2llV3JpdGUoJ1RFU1RfQU1DVl9DT09LSUUnLCAnVCcsIDEpLCAnVCcgPT09IGUuY29va2llUmVhZCgnVEVTVF9BTUNWX0NPT0tJRScpICYmIChlLnJlbW92ZUNvb2tpZSgnVEVTVF9BTUNWX0NPT0tJRScpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obykgJiYgQy5wYXJlbnQgPyBuZXcgWChlLCBpLCBvLCBDLnBhcmVudCkgOiBuZXcgemUoZSwgaSwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gbnVsbCwgYy5pbml0KCksIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemUud2luZG93TG9hZGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5hZGRFdmVudExpc3RlbmVyID8gQy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZSkgOiBDLmF0dGFjaEV2ZW50ICYmIEMuYXR0YWNoRXZlbnQoJ29ubG9hZCcsIGUpLCB6ZS5jb2RlTG9hZEVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmlzaXRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtbWNpZC9zcmMvdmlldy91dGlscy90aW1lVW5pdHMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVVbml0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvdXJzOiAzNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5czogMjQgKiAzNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2Vla3M6IDcgKiAyNCAqIDM2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aHM6IDMwICogMjQgKiAzNjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhcnM6IDM2NSAqIDI0ICogMzYwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHRpbWVVbml0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmdJZCc6ICc1QzBBMTIzRjUyNDVBRUVBMEE0OTBENDVAQWRvYmVPcmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Nvb2tpZURvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclY29va2llRG9tYWluJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndHJhY2tpbmdTZXJ2ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnbWV0cmljcy53ZWJleC5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3RyYWNraW5nU2VydmVyU2VjdXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NtZXRyaWNzLndlYmV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdob3N0ZWRMaWJGaWxlc0Jhc2VVcmwnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVBmMDQxMmE1YzY1ZTU0MjlhYjBlNWVkOGJhMjI1NjUxMC8nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzJzogewogICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheU5hbWUnOiAnQWRvYmUgQW5hbHl0aWNzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnc2V0LXZhcmlhYmxlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXlOYW1lJzogJ1NldCBWYXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldFRyYWNrZXIgPSByZXF1aXJlKCcuLi9zaGFyZWRNb2R1bGVzL2dldFRyYWNrZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFwcGx5VHJhY2tlclZhcmlhYmxlcyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvYXBwbHlUcmFja2VyVmFyaWFibGVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHNldHRpbmdzLCBldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFRyYWNrZXIoKS50aGVuKGZ1bmN0aW9uICh0cmFja2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnU2V0IHZhcmlhYmxlcyBvbiB0aGUgdHJhY2tlci4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVRyYWNrZXJWYXJpYWJsZXModHJhY2tlciwgc2V0dGluZ3MudHJhY2tlclByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5jdXN0b21TZXR1cCAmJiBzZXR0aW5ncy5jdXN0b21TZXR1cC5zb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VzdG9tU2V0dXAuc291cmNlLmNhbGwoZXZlbnQuZWxlbWVudCwgZXZlbnQsIHRyYWNrZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvck1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5lcnJvcignQ2Fubm90IHNldCB2YXJpYWJsZXM6ICcgKyBlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnc2VuZC1iZWFjb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdTZW5kIEJlYWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0VHJhY2tlciA9IHJlcXVpcmUoJy4uL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNMaW5rID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQubm9kZU5hbWUgJiYgZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRMaW5rTmFtZSA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMaW5rKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJIVE1MOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2xpbmsgY2xpY2tlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZW5kQmVhY29uID0gZnVuY3Rpb24gKHRyYWNrZXIsIHNldHRpbmdzLCB0YXJnZXRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MudHlwZSA9PT0gJ3BhZ2UnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnRmlyaW5nIHBhZ2UgdmlldyBiZWFjb24uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlci50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rU2V0dGluZ3MgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiBzZXR0aW5ncy5saW5rVHlwZSB8fCAnbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiBzZXR0aW5ncy5saW5rTmFtZSB8fCBnZXRMaW5rTmFtZSh0YXJnZXRFbGVtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnRmlyaW5nIGxpbmsgdHJhY2sgYmVhY29uIHVzaW5nIHRoZSB2YWx1ZXM6ICcgKyBKU09OLnN0cmluZ2lmeShsaW5rU2V0dGluZ3MpICsgJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLnRsKGlzTGluayh0YXJnZXRFbGVtZW50KSA/IHRhcmdldEVsZW1lbnQgOiAndHJ1ZScsIGxpbmtTZXR0aW5ncy5saW5rVHlwZSwgbGlua1NldHRpbmdzLmxpbmtOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHJhY2tlcigpLnRoZW4oZnVuY3Rpb24gKHRyYWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kQmVhY29uKHRyYWNrZXIsIHNldHRpbmdzLCBldmVudC5lbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvck1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5lcnJvcignQ2Fubm90IHNlbmQgYmVhY29uOiAnICsgZXJyb3JNZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdjbGVhci12YXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5TmFtZSc6ICdDbGVhciBWYXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldFRyYWNrZXIgPSByZXF1aXJlKCcuLi9zaGFyZWRNb2R1bGVzL2dldFRyYWNrZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHJhY2tlcigpLnRoZW4oZnVuY3Rpb24gKHRyYWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2tlci5jbGVhclZhcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnQ2xlYXIgdmFyaWFibGVzLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLmNsZWFyVmFycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvck1lc3NhZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5lcnJvcignQ2Fubm90IGNsZWFyIHZhcmlhYmxlczogJyArIGVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1jb29raWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb21pc2UgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW5kb3cgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzSGVscGVyID0gcmVxdWlyZSgnLi4vaGVscGVycy9zZXR0aW5nc0hlbHBlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXVnbWVudGVycyA9IHJlcXVpcmUoJy4uL2hlbHBlcnMvYXVnbWVudGVycycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXBwbHlUcmFja2VyVmFyaWFibGVzID0gcmVxdWlyZSgnLi4vaGVscGVycy9hcHBseVRyYWNrZXJWYXJpYWJsZXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWRMaWJyYXJ5ID0gcmVxdWlyZSgnLi4vaGVscGVycy9sb2FkTGlicmFyeScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2VuZXJhdGVWZXJzaW9uID0gcmVxdWlyZSgnLi4vaGVscGVycy9nZW5lcmF0ZVZlcnNpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBnZW5lcmF0ZVZlcnNpb24odHVyYmluZS5idWlsZEluZm8udHVyYmluZUJ1aWxkRGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCRUZPUkVfU0VUVElOR1NfTE9BRF9QSEFTRSA9ICdiZWZvcmVTZXR0aW5ncyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtY2lkSW5zdGFuY2UgPSB0dXJiaW5lLmdldFNoYXJlZE1vZHVsZSgnYWRvYmUtbWNpZCcsICdtY2lkLWluc3RhbmNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja0V1Q29tcGxpYW5jZSA9IGZ1bmN0aW9uICh0cmFja2luZ0Nvb29raWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNraW5nQ29vb2tpZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldUNvb2tpZVZhbHVlID0gY29va2llLmdldCh0cmFja2luZ0Nvb29raWVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldUNvb2tpZVZhbHVlID09PSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhdWdtZW50VHJhY2tlciA9IGZ1bmN0aW9uICh0cmFja2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYXVnbWVudGVycy5tYXAoZnVuY3Rpb24gKGF1Z21lbnRlckZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhdWdtZW50ZXJGbih0cmFja2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlua1Zpc2l0b3JJZCA9IGZ1bmN0aW9uICh0cmFja2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWNpZEluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnU2V0dGluZyBNQ0lEIGluc3RhbmNlIG9uIHRoZSB0cmFja2VyLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIudmlzaXRvciA9IG1jaWRJbnN0YW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFja2VyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdXBkYXRlVHJhY2tlclZlcnNpb24gPSBmdW5jdGlvbiAodHJhY2tlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnU2V0dGluZyB2ZXJzaW9uIG9uIHRyYWNrZXI6ICInICsgdmVyc2lvbiArICciLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFja2VyLnRhZ0NvbnRhaW5lck1hcmtlciAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLnRhZ0NvbnRhaW5lck1hcmtlciA9IHZlcnNpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0cmFja2VyLnZlcnNpb24gPT09ICdzdHJpbmcnICYmIHRyYWNrZXIudmVyc2lvbi5zdWJzdHJpbmcodHJhY2tlci52ZXJzaW9uLmxlbmd0aCAtIDUpICE9PSAnLScgKyB2ZXJzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlci52ZXJzaW9uICs9ICctJyArIHZlcnNpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVwZGF0ZVRyYWNrZXJWYXJpYWJsZXMgPSBmdW5jdGlvbiAodHJhY2tlclByb3BlcnRpZXMsIGN1c3RvbVNldHVwLCB0cmFja2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VzdG9tU2V0dXAubG9hZFBoYXNlID09PSBCRUZPUkVfU0VUVElOR1NfTE9BRF9QSEFTRSAmJiBjdXN0b21TZXR1cC5zb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdDYWxsaW5nIGN1c3RvbSBzY3JpcHQgYmVmb3JlIHNldHRpbmdzLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwLnNvdXJjZS5jYWxsKHdpbmRvdywgdHJhY2tlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVRyYWNrZXJWYXJpYWJsZXModHJhY2tlciwgdHJhY2tlclByb3BlcnRpZXMgfHwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1c3RvbVNldHVwLmxvYWRQaGFzZSAhPT0gQkVGT1JFX1NFVFRJTkdTX0xPQURfUEhBU0UgJiYgY3VzdG9tU2V0dXAuc291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnQ2FsbGluZyBjdXN0b20gc2NyaXB0IGFmdGVyIHNldHRpbmdzLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwLnNvdXJjZS5jYWxsKHdpbmRvdywgdHJhY2tlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRpYWxpemVBdWRpZW5jZU1hbmFnZW1lbnQgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIHRyYWNrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0hlbHBlci5pc0F1ZGllbmNlTWFuYWdlbWVudEVuYWJsZWQoc2V0dGluZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlci5sb2FkTW9kdWxlKCdBdWRpZW5jZU1hbmFnZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgQXVkaWVuY2VNYW5hZ2VtZW50IG1vZHVsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIuQXVkaWVuY2VNYW5hZ2VtZW50LnNldHVwKHNldHRpbmdzLm1vZHVsZVByb3BlcnRpZXMuYXVkaWVuY2VNYW5hZ2VyLmNvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRpYWxpemUgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0V1Q29tcGxpYW5jZShzZXR0aW5ncy50cmFja2luZ0Nvb2tpZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRMaWJyYXJ5KHNldHRpbmdzKS50aGVuKGF1Z21lbnRUcmFja2VyKS50aGVuKGxpbmtWaXNpdG9ySWQpLnRoZW4odXBkYXRlVHJhY2tlclZlcnNpb24pLnRoZW4odXBkYXRlVHJhY2tlclZhcmlhYmxlcy5iaW5kKG51bGwsIHNldHRpbmdzLnRyYWNrZXJQcm9wZXJ0aWVzLCBzZXR0aW5ncy5jdXN0b21TZXR1cCB8fCB7fSkpLnRoZW4oaW5pdGlhbGl6ZUF1ZGllbmNlTWFuYWdlbWVudC5iaW5kKG51bGwsIHNldHRpbmdzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnRVUgY29tcGxpYW5jZSB3YXMgbm90IGFja25vd2xlZGdlZCBieSB0aGUgdXNlci4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBpbml0aWFsaXplKHR1cmJpbmUuZ2V0RXh0ZW5zaW9uU2V0dGluZ3MoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdnZXQtdHJhY2tlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvc2hhcmVkTW9kdWxlcy9hdWdtZW50VHJhY2tlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdhdWdtZW50LXRyYWNrZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZWQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF1Z21lbnRlcnMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2F1Z21lbnRlcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Z21lbnRlcnMucHVzaChmbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2FwcGx5VHJhY2tlclZhcmlhYmxlcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXF1ZXJ5LXN0cmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2luZG93ID0gcmVxdWlyZSgnQGFkb2JlL3JlYWN0b3Itd2luZG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlVmFyUmVnRXhwID0gL2VWYXIoWzAtOV0rKS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wUmVnRXhwID0gL3Byb3AoWzAtOV0rKS87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rVHJhY2tWYXJzS2V5cyA9IG5ldyBSZWdFeHAoJ14oZVZhclswLTldKyl8KHByb3BbMC05XSspfChoaWVyWzAtOV0rKXxjYW1wYWlnbnxwdXJjaGFzZUlEfCcgKyAnY2hhbm5lbHxzZXJ2ZXJ8c3RhdGV8emlwfHBhZ2VUeXBlJCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb25seVVuaXF1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJ1aWxkTGlua1RyYWNrVmFycyA9IGZ1bmN0aW9uICh0cmFja2VyLCBuZXdUcmFja2VyUHJvcGVydGllcywgYWRkRXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGlua1RyYWNrVmFyc1ZhbHVlcyA9IE9iamVjdC5rZXlzKG5ld1RyYWNrZXJQcm9wZXJ0aWVzKS5maWx0ZXIobGlua1RyYWNrVmFyc0tleXMudGVzdC5iaW5kKGxpbmtUcmFja1ZhcnNLZXlzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkRXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1RyYWNrVmFyc1ZhbHVlcy5wdXNoKCdldmVudHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUcmFja1ZhcnNWYWx1ZXMgPSBsaW5rVHJhY2tWYXJzVmFsdWVzLmNvbmNhdCgodHJhY2tlci5saW5rVHJhY2tWYXJzIHx8ICcnKS5zcGxpdCgnLCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rVHJhY2tWYXJzVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSAnTm9uZScgJiYgdmFsdWUgJiYgb25seVVuaXF1ZSh2YWx1ZSwgaW5kZXgsIGxpbmtUcmFja1ZhcnNWYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRMaW5rVHJhY2tFdmVudHMgPSBmdW5jdGlvbiAodHJhY2tlciwgZXZlbnRzRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmtUcmFja0V2ZW50c1ZhbHVlcyA9IGV2ZW50c0RhdGEubWFwKGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHJhY2tFdmVudHNWYWx1ZXMgPSBsaW5rVHJhY2tFdmVudHNWYWx1ZXMuY29uY2F0KCh0cmFja2VyLmxpbmtUcmFja0V2ZW50cyB8fCAnJykuc3BsaXQoJywnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlua1RyYWNrRXZlbnRzVmFsdWVzLmZpbHRlcihmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSAnTm9uZScgJiYgb25seVVuaXF1ZSh2YWx1ZSwgaW5kZXgsIGxpbmtUcmFja0V2ZW50c1ZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb21tYUpvaW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleU5hbWUsIHRyYWNrZXJQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtrZXlOYW1lXSA9IHRyYWNrZXJQcm9wZXJ0aWVzW2tleU5hbWVdLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhcmlhYmxlc1RyYW5zZm9ybSA9IGZ1bmN0aW9uIChzdG9yZSwga2V5TmFtZSwgdHJhY2tlclByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkeW5hbWljVmFyaWFibGVQcmVmaXggPSB0cmFja2VyUHJvcGVydGllcy5keW5hbWljVmFyaWFibGVQcmVmaXggfHwgJ0Q9JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzW2tleU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKHZhcmlhYmxlRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEYXRhLnR5cGUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YXJpYWJsZURhdGEudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVWYXJEYXRhID0gZVZhclJlZ0V4cC5leGVjKHZhcmlhYmxlRGF0YS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlVmFyRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkeW5hbWljVmFyaWFibGVQcmVmaXggKyAndicgKyBlVmFyRGF0YVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9wRGF0YSA9IHByb3BSZWdFeHAuZXhlYyh2YXJpYWJsZURhdGEudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBkeW5hbWljVmFyaWFibGVQcmVmaXggKyAnYycgKyBwcm9wRGF0YVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVt2YXJpYWJsZURhdGEubmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNmb3JtZXJzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0Rvd25sb2FkRmlsZVR5cGVzOiBjb21tYUpvaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRXh0ZXJuYWxGaWx0ZXJzOiBjb21tYUpvaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rSW50ZXJuYWxGaWx0ZXJzOiBjb21tYUpvaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWVyYXJjaGllczogZnVuY3Rpb24gKHN0b3JlLCBrZXlOYW1lLCB0cmFja2VyUHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzW2tleU5hbWVdLmZvckVhY2goZnVuY3Rpb24gKGhpZXJhcmNoeURhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVbaGllcmFyY2h5RGF0YS5uYW1lXSA9IGhpZXJhcmNoeURhdGEuc2VjdGlvbnMuam9pbihoaWVyYXJjaHlEYXRhLmRlbGltaXRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHZhcmlhYmxlc1RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiB2YXJpYWJsZXNUcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbjogZnVuY3Rpb24gKHN0b3JlLCBrZXlOYW1lLCB0cmFja2VyUHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFja2VyUHJvcGVydGllc1trZXlOYW1lXS50eXBlID09PSAncXVlcnlQYXJhbScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5UGFyYW1zID0gcXVlcnlTdHJpbmcucGFyc2Uod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2tleU5hbWVdID0gcXVlcnlQYXJhbXNbdHJhY2tlclByb3BlcnRpZXNba2V5TmFtZV0udmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlW2tleU5hbWVdID0gdHJhY2tlclByb3BlcnRpZXNba2V5TmFtZV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZnVuY3Rpb24gKHN0b3JlLCBrZXlOYW1lLCB0cmFja2VyUHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudHMgPSB0cmFja2VyUHJvcGVydGllc1trZXlOYW1lXS5tYXAoZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZGF0YS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCc6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZVtrZXlOYW1lXSA9IGV2ZW50cy5qb2luKCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRyYWNrZXIsIHRyYWNrZXJQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UHJvcGVydGllcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXMgPSB0cmFja2VyUHJvcGVydGllcyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRyYWNrZXJQcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnNmb3JtID0gdHJhbnNmb3JtZXJzW3Byb3BlcnR5TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdHJhY2tlclByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybShuZXdQcm9wZXJ0aWVzLCBwcm9wZXJ0eU5hbWUsIHRyYWNrZXJQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdQcm9wZXJ0aWVzLmV2ZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFja2VyLmV2ZW50cyAmJiB0cmFja2VyLmV2ZW50cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMuZXZlbnRzID0gdHJhY2tlci5ldmVudHMgKyAnLCcgKyBuZXdQcm9wZXJ0aWVzLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGFzRXZlbnRzID0gdHJhY2tlclByb3BlcnRpZXMgJiYgdHJhY2tlclByb3BlcnRpZXMuZXZlbnRzICYmIHRyYWNrZXJQcm9wZXJ0aWVzLmV2ZW50cy5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxpbmtUcmFja1ZhcnMgPSBidWlsZExpbmtUcmFja1ZhcnModHJhY2tlciwgbmV3UHJvcGVydGllcywgaGFzRXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rVHJhY2tWYXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydGllcy5saW5rVHJhY2tWYXJzID0gbGlua1RyYWNrVmFyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaW5rVHJhY2tFdmVudHMgPSBidWlsZExpbmtUcmFja0V2ZW50cyh0cmFja2VyLCB0cmFja2VyUHJvcGVydGllcy5ldmVudHMgfHwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmtUcmFja0V2ZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMubGlua1RyYWNrRXZlbnRzID0gbGlua1RyYWNrRXZlbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnQXBwbHlpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9uIHRyYWNrZXI6ICInICsgSlNPTi5zdHJpbmdpZnkobmV3UHJvcGVydGllcykgKyAnIi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG5ld1Byb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKHByb3BlcnR5TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJbcHJvcGVydHlOYW1lXSA9IG5ld1Byb3BlcnRpZXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvaGVscGVycy9zZXR0aW5nc0hlbHBlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW5kb3cgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzSGVscGVyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCX1RZUEVTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFOQUdFRDogJ21hbmFnZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRUlOU1RBTExFRDogJ3ByZWluc3RhbGxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVNT1RFOiAncmVtb3RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVNUT006ICdjdXN0b20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFOQUdFRF9MSUJfUEFUSFM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUFBfTUVBU1VSRU1FTlQ6ICdBcHBNZWFzdXJlbWVudC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSVZJVFlfTUFQOiAnQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0FjdGl2aXR5TWFwLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJRU5DRV9NQU5BR0VNRU5UOiAnQXBwTWVhc3VyZW1lbnRfTW9kdWxlX0F1ZGllbmNlTWFuYWdlbWVudC5qcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXBvcnRTdWl0ZXM6IGZ1bmN0aW9uIChyZXBvcnRTdWl0ZXNEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcG9ydFN1aXRlVmFsdWVzID0gcmVwb3J0U3VpdGVzRGF0YS5wcm9kdWN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvcnRTdWl0ZXNEYXRhW3R1cmJpbmUuYnVpbGRJbmZvLmVudmlyb25tZW50XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRTdWl0ZVZhbHVlcyA9IHJlcG9ydFN1aXRlc0RhdGFbdHVyYmluZS5idWlsZEluZm8uZW52aXJvbm1lbnRdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0U3VpdGVWYWx1ZXMuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZpdHlNYXBFbmFibGVkOiBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShzZXR0aW5ncy5saWJyYXJ5Q29kZSAmJiAhc2V0dGluZ3MubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXAgJiYgc2V0dGluZ3MubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXAgPT09IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0F1ZGllbmNlTWFuYWdlbWVudEVuYWJsZWQ6IGZ1bmN0aW9uIChzZXR0aW5ncykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MgJiYgc2V0dGluZ3MubW9kdWxlUHJvcGVydGllcyAmJiBzZXR0aW5ncy5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlciAmJiBzZXR0aW5ncy5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcgJiYgd2luZG93ICYmIHdpbmRvdy5fc2F0ZWxsaXRlICYmIHdpbmRvdy5fc2F0ZWxsaXRlLmNvbXBhbnkgJiYgd2luZG93Ll9zYXRlbGxpdGUuY29tcGFueS5vcmdJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNFbmFibGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHNldHRpbmdzSGVscGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvaGVscGVycy9hdWdtZW50ZXJzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQnOiBmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzLCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvbG9hZExpYnJhcnkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZFNjcmlwdCA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLWxvYWQtc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aW5kb3cgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb21pc2UgPSByZXF1aXJlKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXR0aW5nc0hlbHBlciA9IHJlcXVpcmUoJy4vc2V0dGluZ3NIZWxwZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvbGxIZWxwZXIgPSByZXF1aXJlKCcuL3BvbGxIZWxwZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNyZWF0ZVRyYWNrZXIgPSBmdW5jdGlvbiAoc2V0dGluZ3MsIHJlcG9ydFN1aXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cuc19naSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNyZWF0ZSBBcHBNZWFzdXJlbWVudCB0cmFja2VyLCBgc19naWAgZnVuY3Rpb24gbm90IGZvdW5kLicgKyB3aW5kb3cuQXBwTWVhc3VyZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVyYmluZS5sb2dnZXIuaW5mbygnQ3JlYXRpbmcgQXBwTWVhc3VyZW1lbnQgdHJhY2tlciB3aXRoIHRoZXNlIHJlcG9ydCBzdWl0ZXM6ICInICsgcmVwb3J0U3VpdGVzICsgJyInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0cmFja2VyID0gd2luZG93LnNfZ2kocmVwb3J0U3VpdGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5saWJyYXJ5Q29kZS5zY29wZVRyYWNrZXJHbG9iYWxseSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJpbmUubG9nZ2VyLmluZm8oJ1NldHRpbmcgdGhlIHRyYWNrZXIgYXMgd2luZG93LnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucyA9IHRyYWNrZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldFVybHNUb0xvYWQgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLmxpYnJhcnlDb2RlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugc2V0dGluZ3NIZWxwZXIuTElCX1RZUEVTLk1BTkFHRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5wdXNoKHR1cmJpbmUuZ2V0SG9zdGVkTGliRmlsZVVybChzZXR0aW5nc0hlbHBlci5NQU5BR0VEX0xJQl9QQVRIUy5BUFBfTUVBU1VSRU1FTlQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NIZWxwZXIuaXNBY3Rpdml0eU1hcEVuYWJsZWQoc2V0dGluZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHMucHVzaCh0dXJiaW5lLmdldEhvc3RlZExpYkZpbGVVcmwoc2V0dGluZ3NIZWxwZXIuTUFOQUdFRF9MSUJfUEFUSFMuQUNUSVZJVFlfTUFQKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZXR0aW5nc0hlbHBlci5MSUJfVFlQRVMuQ1VTVE9NOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHMucHVzaChzZXR0aW5ncy5saWJyYXJ5Q29kZS5zb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZXR0aW5nc0hlbHBlci5MSUJfVFlQRVMuUkVNT1RFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHMucHVzaCh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gc2V0dGluZ3MubGlicmFyeUNvZGUuaHR0cHNVcmwgOiBzZXR0aW5ncy5saWJyYXJ5Q29kZS5odHRwVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0hlbHBlci5pc0F1ZGllbmNlTWFuYWdlbWVudEVuYWJsZWQoc2V0dGluZ3MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpc2l0b3JTZXJ2aWNlQ29uZmlnID0geyBuYW1lc3BhY2U6IHdpbmRvdy5fc2F0ZWxsaXRlLmNvbXBhbnkub3JnSWQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tb2R1bGVQcm9wZXJ0aWVzLmF1ZGllbmNlTWFuYWdlci5jb25maWcudmlzaXRvclNlcnZpY2UgPSB2aXNpdG9yU2VydmljZUNvbmZpZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxzLnB1c2godHVyYmluZS5nZXRIb3N0ZWRMaWJGaWxlVXJsKHNldHRpbmdzSGVscGVyLk1BTkFHRURfTElCX1BBVEhTLkFVRElFTkNFX01BTkFHRU1FTlQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmxzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZExpYnJhcnlTY3JpcHRzID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZ2V0VXJsc1RvTG9hZChzZXR0aW5ncykubWFwKGZ1bmN0aW9uICh1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdMb2FkaW5nIHNjcmlwdDogJyArIHVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRTY3JpcHQodXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNldFJlcG9ydFN1aXRlc09uVHJhY2tlciA9IGZ1bmN0aW9uIChzZXR0aW5ncywgdHJhY2tlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmxpYnJhcnlDb2RlLmFjY291bnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFja2VyLnNhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cmJpbmUubG9nZ2VyLndhcm4oJ0Nhbm5vdCBzZXQgcmVwb3J0IHN1aXRlcyBvbiB0cmFja2VyLiBgc2FgIG1ldGhvZCBub3QgYXZhaWxhYmxlLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBvcnRTdWl0ZXMgPSBzZXR0aW5nc0hlbHBlci5nZXRSZXBvcnRTdWl0ZXMoc2V0dGluZ3MubGlicmFyeUNvZGUuYWNjb3VudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdTZXR0aW5nIHRoZSBmb2xsb3dpbmcgcmVwb3J0IHN1aXRlcyBvbiB0aGUgdHJhY2tlcjogIicgKyByZXBvcnRTdWl0ZXMgKyAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyLnNhKHJlcG9ydFN1aXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRUcmFja2VyRnJvbVZhcmlhYmxlID0gZnVuY3Rpb24gKHRyYWNrZXJWYXJpYWJsZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3dbdHJhY2tlclZhcmlhYmxlTmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdGb3VuZCB0cmFja2VyIGxvY2F0ZWQgYXQ6ICInICsgdHJhY2tlclZhcmlhYmxlTmFtZSArICciLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3dbdHJhY2tlclZhcmlhYmxlTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lOiAiJyArIHRyYWNrZXJWYXJpYWJsZU5hbWUgKyAnIi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkTGlicmFyaWVzID0gbG9hZExpYnJhcnlTY3JpcHRzKHNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3MubGlicmFyeUNvZGUudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBzZXR0aW5nc0hlbHBlci5MSUJfVFlQRVMuTUFOQUdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVwb3J0U3VpdGVzID0gc2V0dGluZ3NIZWxwZXIuZ2V0UmVwb3J0U3VpdGVzKHNldHRpbmdzLmxpYnJhcnlDb2RlLmFjY291bnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZExpYnJhcmllcy50aGVuKGNyZWF0ZVRyYWNrZXIuYmluZChudWxsLCBzZXR0aW5ncywgcmVwb3J0U3VpdGVzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNldHRpbmdzSGVscGVyLkxJQl9UWVBFUy5QUkVJTlNUQUxMRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRMaWJyYXJpZXMudGhlbihwb2xsSGVscGVyLnBvbGwuYmluZChudWxsLCB3aW5kb3csIHNldHRpbmdzLmxpYnJhcnlDb2RlLnRyYWNrZXJWYXJpYWJsZU5hbWUpKS50aGVuKHNldFJlcG9ydFN1aXRlc09uVHJhY2tlci5iaW5kKG51bGwsIHNldHRpbmdzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNldHRpbmdzSGVscGVyLkxJQl9UWVBFUy5DVVNUT006CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHNldHRpbmdzSGVscGVyLkxJQl9UWVBFUy5SRU1PVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRMaWJyYXJpZXMudGhlbihnZXRUcmFja2VyRnJvbVZhcmlhYmxlLmJpbmQobnVsbCwgc2V0dGluZ3MubGlicmFyeUNvZGUudHJhY2tlclZhcmlhYmxlTmFtZSkpLnRoZW4oc2V0UmVwb3J0U3VpdGVzT25UcmFja2VyLmJpbmQobnVsbCwgc2V0dGluZ3MpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbG9hZCBsaWJyYXJ5LiBUeXBlIG5vdCBzdXBwb3J0ZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2dlbmVyYXRlVmVyc2lvbi5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0JzogZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cywgcmVxdWlyZSwgdHVyYmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBUSElSRF9PRl9EQVkgPSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0RGF5RmllbGQgPSBmdW5jdGlvbiAoZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKDM2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldExhc3RDaGFyID0gZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RyLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0UmV2aXNpb24gPSBmdW5jdGlvbiAoZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoZGF0ZS5nZXRVVENIb3VycygpIC8gVEhJUkRfT0ZfREFZKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldE1vbnRoRmllbGQgPSBmdW5jdGlvbiAoZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vbnRoTnVtYmVyID0gZGF0ZS5nZXRVVENNb250aCgpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXZpc2lvbiA9IGdldFJldmlzaW9uKGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vbnRoRmllbGQgPSAobW9udGhOdW1iZXIgKyByZXZpc2lvbiAqIDEyKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGFzdENoYXIobW9udGhGaWVsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRZZWFyRmllbGQgPSBmdW5jdGlvbiAoZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAyMDEwKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGRhdGVTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoZGF0ZVN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4oZGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZSBwcm92aWRlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgnTCcgKyBnZXRZZWFyRmllbGQoZGF0ZSkgKyBnZXRNb250aEZpZWxkKGRhdGUpICsgZ2V0RGF5RmllbGQoZGF0ZSkpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL3BvbGxIZWxwZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdCc6IGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvbWlzZSA9IHJlcXVpcmUoJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE1BWF9JVEVSQVRJT05TID0gNDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBJTlRFUlZBTCA9IDI1MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZnVuY3Rpb24gKHJlc29sdmUsIHZhcmlhYmxlTmFtZSwgcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdGb3VuZCBwcm9wZXJ0eSBsb2NhdGVkIGF0OiAiJyArIHZhcmlhYmxlTmFtZSArICciXS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldFByb21pc2UgPSBmdW5jdGlvbiAob2JqZWN0LCB2YXJpYWJsZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFt2YXJpYWJsZU5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZChyZXNvbHZlLCB2YXJpYWJsZU5hbWUsIG9iamVjdFt2YXJpYWJsZU5hbWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0W3ZhcmlhYmxlTmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kKHJlc29sdmUsIHZhcmlhYmxlTmFtZSwgb2JqZWN0W3ZhcmlhYmxlTmFtZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBNQVhfSVRFUkFUSU9OUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0JhaWxpbmcgb3V0LiBDYW5ub3QgZmluZCB0aGUgdmFyaWFibGUgbmFtZTogIicgKyB2YXJpYWJsZU5hbWUgKyAnIl0uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBJTlRFUlZBTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsOiBmdW5jdGlvbiAob2JqZWN0LCB2YXJpYWJsZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lLmxvZ2dlci5pbmZvKCdXYWl0aW5nIGZvciB0aGUgcHJvcGVydHkgdG8gYmVjb21lIGFjY2Vzc2libGUgYXQ6ICInICsgdmFyaWFibGVOYW1lICsgJyJdLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQcm9taXNlKG9iamVjdCwgdmFyaWFibGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmdJZCc6ICc1QzBBMTIzRjUyNDVBRUVBMEE0OTBENDVAQWRvYmVPcmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXB2YWx1ZXMobGlzdCwgbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGxpc3QgJiYgbWF0Y2gpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSB1bmVzY2FwZShtYXRjaCkudG9Mb3dlckNhc2UoKSwgdiwgZXhhY3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0W2ldLnN0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdFtpXS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGxpc3RbaV0uc3RyLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2IHx8IChleGFjdCA/IG0gPT0gdiA6IG0uaW5kZXhPZih2KSA+IC0xKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdFtpXS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbWFwdmFsdWVzUmV2ZXJzZShsaXN0LCBtYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobGlzdCAmJiBtYXRjaCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHVuZXNjYXBlKG1hdGNoKS50b0xvd2VyQ2FzZSgpLCB2LCBleGFjdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpIGluIGxpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxpc3RbaV0uaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RbaV0uc3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gbGlzdFtpXS5pZC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdiB8fCAoZXhhY3QgPyBtID09IHYgOiBtLmluZGV4T2YodikgPiAtMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RbaV0uc3RyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzX3BhcnNlVXJpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGFyZ3VtZW50c1swXSArICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBhLmhhc2ggPSBhLmhvc3QgPSBhLmhvc3RuYW1lID0gYS5wYXRobmFtZSA9IGEucG9ydCA9IGEucHJvdG9jb2wgPSBhLnNlYXJjaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgnaHJlZicsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc19tYXBVUkx0b1JTSUQodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLCB2ID0gc19wYXJzZVVyaSh1KS5ob3N0bmFtZSArIHNfcGFyc2VVcmkodSkucGF0aG5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5pbmRleE9mKHRbaV0uc2l0ZSkgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzX2dldFNob3J0SG4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc19wYXJzZVVyaShhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5ob3N0bmFtZS5yZXBsYWNlKC9ed3d3WzAtOV0qXC4vaSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyLmluZGV4T2Yoc3VmZml4LCBzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgIT09IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNfc3BsaXQobCwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHggPSAwLCBhID0gbmV3IEFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICcsJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGwuaW5kZXhPZihkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSA+IC0xID8gaSA6IGwubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbeCsrXSA9IGwuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsLnN1YnN0cmluZyhpICsgZC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19yc2lkczIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ3d3dy53ZWJleC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVWYWx1ZTogJ3dlYmV4Om1hcmtldGluZzonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJ3N1cHBvcnQud2ViZXguJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlVmFsdWU6ICd3ZWJleDpzdXBwb3J0OicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnYnV5LndlYmV4LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZVZhbHVlOiAnd2ViZXg6bWFya2V0aW5nOicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2M6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvOiAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAndmlldy53ZWJleC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVWYWx1ZTogJ3dlYmV4Om1hcmtldGluZzonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbzogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluUGVyaW9kcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnL1VTLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NWYWw6ICd1cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy5jb20uYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnYnInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY28udWsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAndWsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnZXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY29tLm14JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY1ZhbDogJ214JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnLmNvbS5hdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NWYWw6ICdhdScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy5kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NWYWw6ICdkZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NWYWw6ICdpdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogJy5jb20uaGsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnaGsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY28ua3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAna3InCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY28uaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnaW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY28uanAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnanAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjVmFsOiAnY2EnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6ICcuY29tLmNuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY1ZhbDogJ2NuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlOiAnLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NWYWw6ICd1cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNfY29udGVudE1hcDIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAndW5pdmVyc2l0eS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3VuaScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnd3d3LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnd3gzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJpZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0F1c3RyYWxpYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnYXUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0JlbGdpdW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2JlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdDaGluYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnY24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0Rlbm1hcmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2RrJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdGaW5sYW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdmaScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnRnJhbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdmcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnR2VybWFueScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnZGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0dyZWVjZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnZ3InCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0hvbmcgS29uZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaGsnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0luZGlhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnSXJlbGFuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnaWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ0l0YWx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdpdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnTGF0aW4gQW1lcmljYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnbGF0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdNZXhpY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ214JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdOZXRoZXJsYW5kcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnbmwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ05vcndheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnbm8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ1BvcnR1Z2FsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnU291dGggQWZyaWNhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICd6YScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnU3BhaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2VzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdTd2VkZW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3NlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHI6ICdTd2l0emVybGFuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnY2gnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICd1aycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyOiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAndXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnPz8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cjogJ3Byb2R1Y3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwcm9kdWN0cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc19yc2lkMiA9IHNfbWFwVVJMdG9SU0lEKHNfcnNpZHMyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNpdGVOYW1lID0gc19yc2lkMiAmJiB0eXBlb2Ygc19yc2lkMi5zaXRlVmFsdWUgPT0gJ3N0cmluZycgPyBzX3JzaWQyLnNpdGVWYWx1ZSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeU1hcCA9IHNfbWFwVVJMdG9SU0lEKGRvbWFpblBlcmlvZHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeVZhbCA9IGNvdW50cnlNYXAgJiYgdHlwZW9mIGNvdW50cnlNYXAuY2NWYWwgPT0gJ3N0cmluZycgPyBjb3VudHJ5TWFwLmNjVmFsIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaXRlQ291bnRyeVJldmVyc2UgPSBtYXB2YWx1ZXNSZXZlcnNlKHNfY29udGVudE1hcDIuY291bnRyaWVzLCBjb3VudHJ5VmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhOYW1lID0gc19wYXJzZVVyaSgpLnBhdGhuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BsaXRQYXRoID0gc19zcGxpdChwYXRoTmFtZS5pbmRleE9mKCcvJykgPT0gMCA/IHBhdGhOYW1lLnN1YnN0cmluZygxKSA6IHBhdGhOYW1lLCAnLycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BsaXRQYXRoLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25OYW1lID0gbWFwdmFsdWVzKHNfY29udGVudE1hcDIuc2VjdGlvbnMsIHBhdGhOYW1lKSA/IG1hcHZhbHVlcyhzX2NvbnRlbnRNYXAyLnNlY3Rpb25zLCBwYXRoTmFtZSkgOiBwYXRoTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGgoZG9jdW1lbnQuVVJMLCAnLycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uTmFtZSA9IG1hcHZhbHVlcyhzX2NvbnRlbnRNYXAyLnNlY3Rpb25zLCBzcGxpdFBhdGhbMF0pID8gbWFwdmFsdWVzKHNfY29udGVudE1hcDIuc2VjdGlvbnMsIHNwbGl0UGF0aFswXSkgOiBzcGxpdFBhdGhbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09ICd1bmRlZmluZWQnIHx8IHNlY3Rpb25OYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxQYXJ0cyA9IHNfc3BsaXQobG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignLycpID09IDAgPyBsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMSkgOiBsb2NhdGlvbi5wYXRobmFtZSwgJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoUGFydHMgPSBzX3NwbGl0KGxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJy8nKSA9PSAwID8gbG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyaW5nKDEpIDogbG9jYXRpb24ucGF0aG5hbWUsICcvJykubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VUaXRsZSA9IHBhdGhQYXJ0cyAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEZvbGRlciA9IHBhdGhQYXJ0cyAtIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGgobG9jYXRpb24ucGF0aG5hbWUsICdpbmRleC5odG1sJykgfHwgZW5kc1dpdGgobG9jYXRpb24ucGF0aG5hbWUsICdpbmRleC5waHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja0luZGV4ID0gJ3RydWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoUGFydHMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSAnaG9tZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cyA9PSAxICYmIGVuZHNXaXRoKGxvY2F0aW9uLnBhdGhuYW1lLCAnLycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY3Rpb25OYW1lID0gdXJsUGFydHNbcGF0aFBhcnRzIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gJ2hvbWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydHMgPT0gMSAmJiBjaGVja0luZGV4ID09ICd0cnVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSAnaG9tZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cyA9PSAxICYmIGVuZHNXaXRoKGxvY2F0aW9uLnBhdGhuYW1lLCAnLmh0bWwnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzaG9ydFRpdGxlID0gdXJsUGFydHNbcGFnZVRpdGxlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFRpdGxlID0gc2hvcnRUaXRsZS5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBzaG9ydFRpdGxlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja0luZGV4ID09ICd0cnVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWN0aW9uTmFtZSA9IHVybFBhcnRzW2xhc3RGb2xkZXJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNob3J0VGl0bGUgPSB1cmxQYXJ0c1twYWdlVGl0bGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VGl0bGUgPSBzaG9ydFRpdGxlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY3Rpb25OYW1lID0gdXJsUGFydHNbbGFzdEZvbGRlcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gc2hvcnRUaXRsZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBteVBhZ2VOYW1lID0gc2l0ZU5hbWUgKyBjb3VudHJ5VmFsICsgJzonICsgc2VjdGlvbk5hbWUgKyAnOicgKyBmaWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1cmxQYXJ0cyA9IHNfc3BsaXQobG9jYXRpb24ucGF0aG5hbWUuaW5kZXhPZignLycpID09IDAgPyBsb2NhdGlvbi5wYXRobmFtZS5zdWJzdHJpbmcoMSkgOiBsb2NhdGlvbi5wYXRobmFtZSwgJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoUGFydHMgPSBzX3NwbGl0KGxvY2F0aW9uLnBhdGhuYW1lLmluZGV4T2YoJy8nKSA9PSAwID8gbG9jYXRpb24ucGF0aG5hbWUuc3Vic3RyaW5nKDEpIDogbG9jYXRpb24ucGF0aG5hbWUsICcvJykubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VUaXRsZSA9IHBhdGhQYXJ0cyAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFzdEZvbGRlciA9IHBhdGhQYXJ0cyAtIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kc1dpdGgobG9jYXRpb24ucGF0aG5hbWUsICdpbmRleC5odG1sJykgfHwgZW5kc1dpdGgobG9jYXRpb24ucGF0aG5hbWUsICdpbmRleC5waHAnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGVja0luZGV4ID0gJ3RydWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoUGFydHMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aFBhcnRzID09IDEgJiYgZW5kc1dpdGgobG9jYXRpb24ucGF0aG5hbWUsICcvJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSAnaG9tZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhQYXJ0cyA9PSAxICYmIGNoZWNrSW5kZXggPT0gJ3RydWUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gJ2hvbWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoUGFydHMgPT0gMSAmJiBlbmRzV2l0aChsb2NhdGlvbi5wYXRobmFtZSwgJy5odG1sJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2hvcnRUaXRsZSA9IHVybFBhcnRzW3BhZ2VUaXRsZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRUaXRsZSA9IHNob3J0VGl0bGUuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWUgPSBzaG9ydFRpdGxlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja0luZGV4ID09ICd0cnVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9ICdob21lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNob3J0VGl0bGUgPSB1cmxQYXJ0c1twYWdlVGl0bGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VGl0bGUgPSBzaG9ydFRpdGxlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVOYW1lID0gc2hvcnRUaXRsZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBteVBhZ2VOYW1lID0gc2l0ZU5hbWUgKyBjb3VudHJ5VmFsICsgJzonICsgc2VjdGlvbk5hbWUgKyAnOicgKyBmaWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQubG9jYXRpb24ucGF0aG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdsYngvY2FsbC1tZS1jb3VudHJ5LW1hcC5odG1sJykgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LlVSTC5pbmRleE9mKCcvbGJ4L2dsb2JhbF9zYWxlc19udW0uaHRtbCcpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5VUkwuaW5kZXhPZigncHJpY2luZy90cmlhbC9jb25maXJtYXRpb25wYWdlLmh0bWwnKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmVWYXIxMDggPSBzLmdldFRpbWVUb0NvbXBsZXRlKCdzdG9wJywgJ2VtLWNoaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lVmFyMTAwID0gcy5nZXRUaW1lVG9Db21wbGV0ZSgnc3RvcCcsICdndHRjY29uZmlybWF0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LlVSTC5pbmRleE9mKCcvcHJpY2luZy90cmlhbC9sb2FkaW5ncGFnZS5odG1sJykgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lVmFyOTkgPSBzLmdldFRpbWVUb0NvbXBsZXRlKCdzdG9wJywgJ2d0dGNsb2FkaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy52aXNpdG9yTmFtZXNwYWNlID0gJ2Npc2Nvd2ViZXgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnRyYWNraW5nU2VydmVyID0gJ21ldHJpY3Mud2ViZXguY29tJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy50cmFja2luZ1NlcnZlclNlY3VyZSA9ICdzbWV0cmljcy53ZWJleC5jb20nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlicmFyeUNvZGUnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnY3VzdG9tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9FWDNlMjhmYzU2ZWNkZTRkZTNhN2E4YTg2NzEwMDFmYWMxLWxpYnJhcnlDb2RlX3NvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJWYXJpYWJsZU5hbWUnOiAncycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NoYXJTZXQnOiAnVVRGLTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlVVJMJzogJyVzX3VybCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJyZW5jeUNvZGUnOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tpbmdTZXJ2ZXInOiAnbWV0cmljcy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja0lubGluZVN0YXRzJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlzaXRvck5hbWVzcGFjZSc6ICdjaXNjb3dlYmV4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tEb3dubG9hZExpbmtzJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tFeHRlcm5hbExpbmtzJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua0V4dGVybmFsRmlsdGVycyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rSW50ZXJuYWxGaWx0ZXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2lzY29zcGFyay5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamF2YXNjcmlwdDonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFpbHRvOicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmlnaW4td2ViZXgtdWF0LmNpc2NvLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZWw6JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaXNjby5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tpbmdTZXJ2ZXJTZWN1cmUnOiAnc21ldHJpY3Mud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnBDb29raWVEb21haW5QZXJpb2RzJzogJyVjZF9wJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtEb3dubG9hZEZpbGVUeXBlcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F2aScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RtZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb2MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9jeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pwZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtNHYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW92JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21wMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtc2knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGRmJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHB0eCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnNkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Z4ZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd21hJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dtdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneGxzeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemlwJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3RlZExpYkZpbGVzQmFzZVVybCc6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vZXh0ZW5zaW9ucy9FUGJkZTJmN2NhMTRlNTQwMzk5ZGNjMWY4MjA4ODYwYjdiLycKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbXBhbnknOiB7ICdvcmdJZCc6ICc1QzBBMTIzRjUyNDVBRUVBMEE0OTBENDVAQWRvYmVPcmcnIH0sCiAgICAgICAgICAgICAgICAncHJvcGVydHknOiB7CiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQ2lzY28gV2ViZXggU2l0ZXMnLAogICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RvbWFpbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2lzY28uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY28uaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvLml0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jby5qcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY28ua3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY29tLmF1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20uYnInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbS5jbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY29tLmhrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20ubXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvLnVrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmZyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5pdCcKICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSc6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAncnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ3J1bGVzJzogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMDIyN2U3ZTk2MGZlNDM2ZGIzZTkxZDcxZmE0MWQ1OGEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdXZWJFeCBNZWV0aW5ncyBGcmVlIFRyaWFsIC1BY3RpdmF0aW9uIENvbmZpcm1hdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3ByaWNpbmdcXC90cmlhbFxcL2NvbmZpcm1hdGlvbnBhZ2VcXC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaXNjby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxMzUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdldmVudDEwMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclZnQtc2l0ZS11cmwtcyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnKGZ1bmN0aW9uKGgsbyx0LGosYSxyKXtcbmguaGo9aC5oanx8ZnVuY3Rpb24oKXsoaC5oai5xPWguaGoucXx8W10pLnB1c2goYXJndW1lbnRzKX07XG5oLl9oalNldHRpbmdzPXtoamlkOjU2NjUwMSxoanN2OjZ9O1xuYT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnaGVhZFwnKVswXTtcbnI9by5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpO3IuYXN5bmM9MTtcbnIuc3JjPXQraC5faGpTZXR0aW5ncy5oamlkK2oraC5faGpTZXR0aW5ncy5oanN2O1xuYS5hcHBlbmRDaGlsZChyKTtcbn0pKHdpbmRvdyxkb2N1bWVudCxcJ2h0dHBzOi8vc3RhdGljLmhvdGphci5jb20vYy9ob3RqYXItXCcsXCcuanM/c3Y9XCcpOycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw3OWNhNjA2ZGRkYmM0OTI2OTA1NWJmOTE2YWZmZTA2YicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1BMIC0gQUVNIHByb2QgLSBBbXBsaXR1ZGUgLSBjb25maWcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA0MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXnd3d1xcLndlYmV4XFwuY28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdedXNlXFwud2ViZXhcXC5jb20kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXnd3dzMtd2ViZXhcXC5jaXNjb1xcLmNvbSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeaGFyZHdhcmVcXC53ZWJleFxcLmNvbSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcL2xieFxcL2dsb2JhbF9zYWxlc3xsYnhcXC9jYWxsLW1lLWNvdW50cnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC9MUD1cXGR7MSw0fScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5hbXBsaXR1ZGV8fHtfcTpbXSxfaXE6e319O3ZhciByPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0IilcbjtyLnR5cGU9InRleHQvamF2YXNjcmlwdCJcbjtyLmludGVncml0eT0ic2hhMzg0LWErbXE3dGlMd2RlLzAwT2M3YXZGSExuL3R0R2ZkQXExcnRaYzd1OTdTRXpJaXlZb1QySXNPS1dDa0FUaHdkRXUiXG47ci5jcm9zc09yaWdpbj0iYW5vbnltb3VzIjtyLmFzeW5jPWZhbHNlXG47ci5zcmM9Imh0dHBzOi8vY2RuLmFtcGxpdHVkZS5jb20vbGlicy9hbXBsaXR1ZGUtNS4zLjAtbWluLmd6LmpzIlxuO3Iub25sb2FkPWZ1bmN0aW9uKCl7aWYoIWUuYW1wbGl0dWRlLnJ1blF1ZXVlZEZ1bmN0aW9ucyl7XG5jb25zb2xlLmxvZygiW0FtcGxpdHVkZV0gRXJyb3I6IGNvdWxkIG5vdCBsb2FkIFNESyIpfX1cbjt2YXIgaT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXTtpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsaSlcbjtmdW5jdGlvbiBzKGUsdCl7ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtcbnRoaXMuX3EucHVzaChbdF0uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSkpO3JldHVybiB0aGlzfX1cbnZhciBvPWZ1bmN0aW9uKCl7dGhpcy5fcT1bXTtyZXR1cm4gdGhpc31cbjt2YXIgYT1bImFkZCIsImFwcGVuZCIsImNsZWFyQWxsIiwicHJlcGVuZCIsInNldCIsInNldE9uY2UiLCJ1bnNldCJdXG47Zm9yKHZhciB1PTA7dTxhLmxlbmd0aDt1Kyspe3MobyxhW3VdKX1uLklkZW50aWZ5PW87dmFyIGM9ZnVuY3Rpb24oKXt0aGlzLl9xPVtdXG47cmV0dXJuIHRoaXN9XG47dmFyIGw9WyJzZXRQcm9kdWN0SWQiLCJzZXRRdWFudGl0eSIsInNldFByaWNlIiwic2V0UmV2ZW51ZVR5cGUiLCJzZXRFdmVudFByb3BlcnRpZXMiXVxuO2Zvcih2YXIgcD0wO3A8bC5sZW5ndGg7cCsrKXtzKGMsbFtwXSl9bi5SZXZlbnVlPWNcbjt2YXIgZD1bImluaXQiLCJsb2dFdmVudCIsImxvZ1JldmVudWUiLCJzZXRVc2VySWQiLCJzZXRVc2VyUHJvcGVydGllcyIsInNldE9wdE91dCIsInNldFZlcnNpb25OYW1lIiwic2V0RG9tYWluIiwic2V0RGV2aWNlSWQiLCJzZXRHbG9iYWxVc2VyUHJvcGVydGllcyIsImlkZW50aWZ5IiwiY2xlYXJVc2VyUHJvcGVydGllcyIsInNldEdyb3VwIiwibG9nUmV2ZW51ZVYyIiwicmVnZW5lcmF0ZURldmljZUlkIiwiZ3JvdXBJZGVudGlmeSIsIm9uSW5pdCIsImxvZ0V2ZW50V2l0aFRpbWVzdGFtcCIsImxvZ0V2ZW50V2l0aEdyb3VwcyIsInNldFNlc3Npb25JZCIsInJlc2V0U2Vzc2lvbklkIl1cbjtmdW5jdGlvbiB2KGUpe2Z1bmN0aW9uIHQodCl7ZVt0XT1mdW5jdGlvbigpe1xuZS5fcS5wdXNoKFt0XS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKSl9fVxuZm9yKHZhciBuPTA7bjxkLmxlbmd0aDtuKyspe3QoZFtuXSl9fXYobik7bi5nZXRJbnN0YW5jZT1mdW5jdGlvbihlKXtcbmU9KCFlfHxlLmxlbmd0aD09PTA/IiRkZWZhdWx0X2luc3RhbmNlIjplKS50b0xvd2VyQ2FzZSgpXG47aWYoIW4uX2lxLmhhc093blByb3BlcnR5KGUpKXtuLl9pcVtlXT17X3E6W119O3Yobi5faXFbZV0pfXJldHVybiBuLl9pcVtlXX1cbjtlLmFtcGxpdHVkZT1ufSkod2luZG93LGRvY3VtZW50KTtcblxuXG4vL3ZhciBhbXBfd3ggPSBuZXcgYW1wbGl0dWRlLmdldEluc3RhbmNlKCk7XG4vL3ZhciBBUElfS0VZO2lmKF9zYXRlbGxpdGUuYnVpbGRJbmZvLmVudmlyb25tZW50PT1cJ3Byb2R1Y3Rpb25cJyl7IEFQSV9LRVk9ICIyMTIzZjBjODA1ODc3MTkwN2NmMWUyOWI4ZTIwYWRmZSI7fWVsc2V7QVBJX0tFWT0gImNiMmU0OTI1ZGViOGMyNzliNjc2YTMwYWEzODU1YjQzIn1cbnZhciBBUElfS0VZID0gIjIxMjNmMGM4MDU4NzcxOTA3Y2YxZTI5YjhlMjBhZGZlIjtcbnZhciBpc0V4dGVybmFsUmVmZXJyZXIgPSAvKD8hd3d3XFwud2ViZXhcXC5jbykvLnRlc3QoZG9jdW1lbnQucmVmZXJyZXIpO1xuXG52YXIgYW1wX3d4ID0gYW1wbGl0dWRlLmdldEluc3RhbmNlKCk7XG5hbXBfd3guaW5pdChBUElfS0VZLCBudWxsLCB7XG4gICAgc2F2ZUV2ZW50czogdHJ1ZSxcbiAgICBpbmNsdWRlVXRtOiB0cnVlLFxuXHRpbmNsdWRlUmVmZXJyZXI6IGlzRXh0ZXJuYWxSZWZlcnJlcixcbiAgICBzZWN1cmVDb29raWU6dHJ1ZSxcblx0aW5jbHVkZUdjbGlkOnRydWUsXG4gICAgc2F2ZVBhcmFtc1JlZmVycmVyT25jZVBlclNlc3Npb246ZmFsc2UsXG4gICAgYXBpRW5kcG9pbnQ6IFwnYXBpMi5hbXBsaXR1ZGUuY29tXCcsXG4gICAgdHJhY2tpbmdPcHRpb25zOiB7XG4gICAgICBpcF9hZGRyZXNzOiBmYWxzZVxuICAgIH1cbn0pO1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMDc4N2NhNTEwMWVkNGUxZmE0MGQxYjAwOTRkNWZlNmEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGb290ZXIgLSBTb2NpYWwgbGlua3MnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjd2J4LWZvb3Rlci1ycyAud2J4LWZvb3Rlci1zb2NpYWwgYS53YngtaWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmb290ZXI6c3ZnOiV0aGlzLmdldEF0dHJpYnV0ZSh0aXRsZSklOiVwYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI5MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLmdldEF0dHJpYnV0ZSh0aXRsZSklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI5MicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxODEnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAnbmFtZSc6ICdldmVudDE4MCcgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5nZXRBdHRyaWJ1dGUodGl0bGUpJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwwZDNkNjgzYjY2ZWU0OTQ5OTJhZTI3ZjgyMWIyMDE4NicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0RCIC0gQWN0aXZhdGlvbiBGYWlsdXJlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdpZGVudGlmaWVyJzogJ2FjdERiRmFpbCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdwYWdlTmFtZSc6ICd3eDpkaXJlY3QtYnV5OmFjdGl2YXRpb246ZmFpbHVyZScgfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAndHlwZSc6ICdwYWdlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNTdiMGRmNWE5NTBiNGVhMzgyMWUxZWNlZTVhZjc2M2EnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTZW5kIEJlYWNvbiBvbiBldmVyeSBwYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogMTQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGYzMmJjNTQxMDY1ODRiMDViYzY2MDFjZmQzOGM1ODJmJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZ2xvYmFsVHJhY2snLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLndieC1wcm9kdWN0LWhlcm8tcGlsbCBhW2hyZWYqPWNvbnRhY3Qtc2FsZXNdJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3RyYWluaW5nLW9ubGluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3dcXC53ZWJleFxcLmNvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzlmOWU2ZTRjNzBhMzRiYjQ5OGZiNGU3OWY0ZjJkZTI0LXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMN2YxMjkxNGQ0OGE0NGZhMTljN2NlMDE0YmUwNGE0NDMnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdQTCAtIEFFTSB0ZXN0IC0gQW1wbGl0dWRlIC0gY29uZmlnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9saWJyYXJ5TG9hZGVkLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogMTA5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdvcmlnaW4td2ViZXgtKGRldnxxYXxsdHxzYnxzdGd8dWF0KVxcLmNpc2NvXFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3LWF1dGgtd2ViZXguY2lzY28uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd2J4YXBwLXB1Yi1wcmQyLTAxOjQ1MDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcL2xieFxcL2dsb2JhbF9zYWxlc3xsYnhcXC9jYWxsLW1lLWNvdW50cnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC9MUD1cXGR7MSw0fScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5hbXBsaXR1ZGV8fHtfcTpbXSxfaXE6e319O3ZhciByPXQuY3JlYXRlRWxlbWVudCgic2NyaXB0IilcbjtyLnR5cGU9InRleHQvamF2YXNjcmlwdCJcbjtyLmludGVncml0eT0ic2hhMzg0LWErbXE3dGlMd2RlLzAwT2M3YXZGSExuL3R0R2ZkQXExcnRaYzd1OTdTRXpJaXlZb1QySXNPS1dDa0FUaHdkRXUiXG47ci5jcm9zc09yaWdpbj0iYW5vbnltb3VzIjtyLmFzeW5jPXRydWVcbjtyLnNyYz0iaHR0cHM6Ly9jZG4uYW1wbGl0dWRlLmNvbS9saWJzL2FtcGxpdHVkZS01LjMuMC1taW4uZ3ouanMiXG47ci5vbmxvYWQ9ZnVuY3Rpb24oKXtpZighZS5hbXBsaXR1ZGUucnVuUXVldWVkRnVuY3Rpb25zKXtcbmNvbnNvbGUubG9nKCJbQW1wbGl0dWRlXSBFcnJvcjogY291bGQgbm90IGxvYWQgU0RLIil9fVxuO3ZhciBpPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdO2kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixpKVxuO2Z1bmN0aW9uIHMoZSx0KXtlLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe1xudGhpcy5fcS5wdXNoKFt0XS5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKSk7cmV0dXJuIHRoaXN9fVxudmFyIG89ZnVuY3Rpb24oKXt0aGlzLl9xPVtdO3JldHVybiB0aGlzfVxuO3ZhciBhPVsiYWRkIiwiYXBwZW5kIiwiY2xlYXJBbGwiLCJwcmVwZW5kIiwic2V0Iiwic2V0T25jZSIsInVuc2V0Il1cbjtmb3IodmFyIHU9MDt1PGEubGVuZ3RoO3UrKyl7cyhvLGFbdV0pfW4uSWRlbnRpZnk9bzt2YXIgYz1mdW5jdGlvbigpe3RoaXMuX3E9W11cbjtyZXR1cm4gdGhpc31cbjt2YXIgbD1bInNldFByb2R1Y3RJZCIsInNldFF1YW50aXR5Iiwic2V0UHJpY2UiLCJzZXRSZXZlbnVlVHlwZSIsInNldEV2ZW50UHJvcGVydGllcyJdXG47Zm9yKHZhciBwPTA7cDxsLmxlbmd0aDtwKyspe3MoYyxsW3BdKX1uLlJldmVudWU9Y1xuO3ZhciBkPVsiaW5pdCIsImxvZ0V2ZW50IiwibG9nUmV2ZW51ZSIsInNldFVzZXJJZCIsInNldFVzZXJQcm9wZXJ0aWVzIiwic2V0T3B0T3V0Iiwic2V0VmVyc2lvbk5hbWUiLCJzZXREb21haW4iLCJzZXREZXZpY2VJZCIsInNldEdsb2JhbFVzZXJQcm9wZXJ0aWVzIiwiaWRlbnRpZnkiLCJjbGVhclVzZXJQcm9wZXJ0aWVzIiwic2V0R3JvdXAiLCJsb2dSZXZlbnVlVjIiLCJyZWdlbmVyYXRlRGV2aWNlSWQiLCJncm91cElkZW50aWZ5Iiwib25Jbml0IiwibG9nRXZlbnRXaXRoVGltZXN0YW1wIiwibG9nRXZlbnRXaXRoR3JvdXBzIiwic2V0U2Vzc2lvbklkIiwicmVzZXRTZXNzaW9uSWQiXVxuO2Z1bmN0aW9uIHYoZSl7ZnVuY3Rpb24gdCh0KXtlW3RdPWZ1bmN0aW9uKCl7XG5lLl9xLnB1c2goW3RdLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpKX19XG5mb3IodmFyIG49MDtuPGQubGVuZ3RoO24rKyl7dChkW25dKX19dihuKTtuLmdldEluc3RhbmNlPWZ1bmN0aW9uKGUpe1xuZT0oIWV8fGUubGVuZ3RoPT09MD8iJGRlZmF1bHRfaW5zdGFuY2UiOmUpLnRvTG93ZXJDYXNlKClcbjtpZighbi5faXEuaGFzT3duUHJvcGVydHkoZSkpe24uX2lxW2VdPXtfcTpbXX07dihuLl9pcVtlXSl9cmV0dXJuIG4uX2lxW2VdfVxuO2UuYW1wbGl0dWRlPW59KSh3aW5kb3csZG9jdW1lbnQpO1xuXG52YXIgQVBJX0tFWSA9ICJjYjJlNDkyNWRlYjhjMjc5YjY3NmEzMGFhMzg1NWI0MyI7XG5hbXBsaXR1ZGUuZ2V0SW5zdGFuY2UoKS5pbml0KEFQSV9LRVksIG51bGwsIHtcbiAgICBzYXZlRXZlbnRzOiB0cnVlLFxuICAgIGluY2x1ZGVVdG06IHRydWUsXG4vL1x0aW5jbHVkZVJlZmVycmVyOiBhbW1GbGFnLFxuICAgIHNlY3VyZUNvb2tpZTp0cnVlLFxuXHRpbmNsdWRlR2NsaWQ6dHJ1ZSxcbiAgICBzYXZlUGFyYW1zUmVmZXJyZXJPbmNlUGVyU2Vzc2lvbjpmYWxzZSxcbiAgICBhcGlFbmRwb2ludDogXCdhcGkyLmFtcGxpdHVkZS5jb21cJyxcbiAgICB0cmFja2luZ09wdGlvbnM6IHtcbiAgICAgIGlwX2FkZHJlc3M6IGZhbHNlXG4gICAgfVxufSk7XG5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDExMjdkYTlhY2Y1ODQ4MTg4ODRmNGZlMDAzN2IwYzUxJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnU3BhcmsgUHVyY2hhc2UgLSBCaWxsaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy92YXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdzcGFya19kYXRhLnBhZ2VfbmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdUaHJlZVBnQ2hlY2tvdXRBZGRyZXNzUGF5bWVudEluZm9QYWdlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTExJyB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlTmFtZSc6ICd3eDpkci1zaG9wcGluZy1jYXJ0OmJpbGxpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwxNjU5OWJkZjFmMWM0OTZkYTc0N2QyMGQwOTk2ZmE5MycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZyZWUgdHJpYWwgMi4wIHNpZ251cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZW50ZXJzVmlld3BvcnQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZXF1ZW5jeSc6ICdldmVyeUVudHJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjcmVhY3QtYXJpYS1tb2RhbC1kaWFsb2cnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3N1YmRvbWFpbnMnOiBbeyAndmFsdWUnOiAnY2FydC53ZWJleC5jb20nIH1dIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NpZ24tdXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vN2NkNTU0OWM3MThjL2IyMjkzYjU2OWU0OS9hYWQ4MjZmOTJiNGUvUkNiZDE3YjYzOGFmMmY0ZDlhYjUzZDg3MTk4Yjg3NjQxYS1zb3VyY2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVybmFsJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDNjNGRiNGRmOGRjZTQxMzU4MTY0OWFhOTQ2MTRhNmIzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnREIgLSBBY3RpdmF0aW9uIHByb2dyZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdpZGVudGlmaWVyJzogJ2FjdERiUHJvZ3Jlc3MnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAncGFnZU5hbWUnOiAnd3g6ZGlyZWN0LWJ1eTphY3RpdmF0aW9uOmluLXByb2dyZXNzJyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwzZTg5YjA4ZmIyOGY0ZjViYTVmNTZkM2EwODdhZmJhMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1N3aXRjaCB0byBGcmVlIFBsYW4gLSBSZWFzb24gYW5kIENvbW1lbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnYSNidG4tcmVhc29uLXRvLWZyZWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RWYWx1ZSA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5wYXJlbnQoKS5maW5kKCcjcmVhc29uLXR5cGUgb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1lbnRzID0galF1ZXJ5KHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoJ3RleHRhcmVhLmNhbmNlbC1jb21tZW50cycpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmNhdCA9IHNlbGVjdFZhbHVlICsgJyB8ICcgKyBjb21tZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0VmFyKCdjYW5jZWwgcmVhc29ucycsIGNvbmNhdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNzgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclY2FuY2VsIHJlYXNvbnMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJ1N3aXRjaCB0byBGcmVlIC0gQ2FuY2VsIFBsYW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMjNhZTQzMjQ4NmVkNDFmMTlhMDI5MjNkODdjYTllZmMnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdQTCAtIGhvbWVwYWdlIHN0YXJ0IGZvciBmcmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmZpcnN0LWJhbm5lci1sZWZ0IGEuQnV0dG9uLS1ibHVlLS0zQXQwdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3cud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDNDFjMDVlOWEwOTU0NDVkZTg2NTA1NWMxZTY0MDFhYTItc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw0MThmNjEwMTk1Zjg0N2UwOGNlNTM3MDNhNzJiZTFkNicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3RyYWNrVmlkZW9GaW5pc2gnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2VsZW1lbnRTZWxlY3Rvcic6ICcudmpzLWVuZGVkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA5MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3dcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwnOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vN2NkNTU0OWM3MThjL2IyMjkzYjU2OWU0OS9hYWQ4MjZmOTJiNGUvUkM0MDJlZWJiZGYyYTc0MGJhYTRiNTg4MjNjMTU0NTVjMy1zb3VyY2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVybmFsJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGVmMDlmMmY2ZGU4YjRiM2U4MTQ5M2MzNzIyOTVkNjUyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRkFRcyBUZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJ2R0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRQcm9wZXJ0aWVzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdjbGFzc05hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdxdWVzdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxcyA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoKS5maW5kKCcucXVlc3Rpb24nKS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldFZhcignUXVlc3Rpb24nLCBxcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdGQVEgLSAlUXVlc3Rpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJ0ZBUSBRcyAtICVRdWVzdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNDM0NjBlMzc1NWVhNGQ2YmFiNDBmNzEwYjY0ZmM5ZDQnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTaWduIFVwIEVycm9yIFBhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2lkZW50aWZpZXInOiAnd2ViZXgtc2lnbnVwZXJyb3InIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJvcDI1ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ1N5c3RlbURvd24gRXJyb3IgQ29kZSBWYWx1ZScpICsgJyA6ICcgKyBfc2F0ZWxsaXRlLmdldFZhcignU2lnblVwIEVycm9yIENvb2tpZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJvcDMxID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ1JlZmVycmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5hYm9ydCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQ3MScgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw5YjFhMmM2N2E3NWE0OTRiODg1M2Q2OGEyN2JlOWMzNicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZXIC0gaHAgYXJ0aWNsZSBjbGljaycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5ob21lLXNlY3Rpb24tY29udGVudCBhcnRpY2xlIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd0ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChndC5zZWFyY2goJ2Z1dHVyZW9md29yay53ZWJleC5jb20nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxua0Nsa04gPSBndC5yZXBsYWNlKGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QgKyAnLycsICcnKS5yZXBsYWNlKC9cLyQvLCAnJykucmVwbGFjZSgnLycsICc6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxua0Nsa04gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0VmFyKCdsaW5rTmFtZScsIGxua0Nsa04pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0VmFyKCdsaW5rTmFtZScsICdob21lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmdXR1cmVvZndvcmtcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOmFydGljbGU6JWxpbmtOYW1lJTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVsaW5rTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICclbGlua05hbWUlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDhjMTFiM2IxODIyYjQ1YTZhOTJkNjkzMmVjNmExMjI5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnU3lzdGVtIERvd24gRXJyb3IgUGFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICd3ZWJleC1zeXN0ZW1kb3duJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21TZXR1cCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByb3AyNSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdTeXN0ZW1Eb3duIEVycm9yIENvZGUgVmFsdWUnKSArICcgOiAnICsgX3NhdGVsbGl0ZS5nZXRWYXIoJ1NpZ25VcCBFcnJvciBDb29raWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByb3AzMSA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdSZWZlcnJlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWJvcnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDcxJyB9XSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3R5cGUnOiAncGFnZScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDlmNTMzMTQzM2VlMjRmOTZhN2M2MmQ1OWMzNThlNTExJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRm9vdGVyLWNsaWNrcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy53YngtZm9vdGVyLWxpbmtzLXdyYXBwZXIgLndieC1mb290ZXItbGlua3MtbGlzdC1pdGVtIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3XFwud2ViZXhcXC5jbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Zvb3RlcjpsaW5rOiV0aGlzLkBjbGVhblRleHQlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjczJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI3MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxNzknIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAnbmFtZSc6ICdldmVudDE4MScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5AY2xlYW5UZXh0JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQ2MwNzg1MTNiNmY3ZTQyZmNiMzg4Y2FlNWI0MDg5ZDQyLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGY1NmYxZmFjYmI2ZTRiMzNhMGQyZjJlYmUyOTAyMGFhJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnUEwgLSBBRU0gLSBEQiBlbWFpbCAtIFRlc3QgVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDgwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdwcmljaW5nXFwvYnV5XFwvYWNjb3VudFxcLWNyZWF0ZVxcLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ3NldFRpbWVvdXQoZnVuY3Rpb24oKXsgXG5pZiAodHlwZW9mIGFtcGxpdHVkZSAhPT0gInVuZGVmaW5lZCIpIHsgXG52YXIgdEFtcE5vZGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNpZ251cEJ1dHRvbiIpLFRlc3RFbWFpbF9GbGFnO1xuaWYodm9pZCAwIT09dEFtcE5vZGV8fG51bGwhPT10QW1wTm9kZSl7dmFyIFRFU1RfRU1BSUxfU1RSSU5HUz0vY29sbGFiY3RnXFwrfG1haWxpbmF0b3JcXC5jb218d2J4bWNvbmxpbmVcXCt8eW9wbWFpbFxcLmNvbXxtY29ubGluZWF1dG9cXCt8d2J4bWNhdXRvXFwrLyxjb25BbXBmaWc9e2F0dHJpYnV0ZXM6ITAsY2hpbGRMaXN0OiExLHN1YnRyZWU6ITF9LHN0RmxnVmFsPSEwLGNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7YS5mb3JFYWNoKGZ1bmN0aW9uKGEsYil7aWYoc3RGbGdWYWwpe2lmKCJhdHRyaWJ1dGVzIj09PWEudHlwZSYmMT09VEVTVF9FTUFJTF9TVFJJTkdTLnRlc3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVtYWlsIikudmFsdWUpKXtUZXN0RW1haWxfRmxhZz0obmV3IGFtcGxpdHVkZS5JZGVudGlmeSgpKS5zZXRPbmNlKCJ0ZXN0IiwidHJ1ZSIpO3RyeXthbXBsaXR1ZGUuZ2V0SW5zdGFuY2UoKS5pZGVudGlmeShUZXN0RW1haWxfRmxhZyl9Y2F0Y2goYyl7fX1zdEZsZ1ZhbD0hMX19KX0sXG5vYnJNdXQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO29ick11dC5vYnNlcnZlKHRBbXBOb2RlLGNvbkFtcGZpZyl9XG59XG59LCAxMDAwKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGZjZDg5NjA4ODU0ZTQwNDVhZWQwMTJiNDMzZDE4NTUyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnUEwgLSBob21lcGFnZSBzZWUgcHJpY2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5maXJzdC1iYW5uZXItbGVmdCBhLkJ1dHRvbi0tdHJhbnNwYXJlbnQtLTJ1ZUR6JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDZTdhZjA3YjJmYzU0NGZlMGIxNzk0N2RmZTFkY2VkODMtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw3ZDJjMjZmYzcxZWY0NzQ2ODBiY2NkNDIzYTFhYmMxNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1BMIC0gQUVNIHwgcGFnZXZpZXdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDYwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3dcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3VzZVxcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3XFwud2ViZXhcXC5lcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3d3d1xcLndlYmV4XFwuY29cXC4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdvcmlnaW4td2ViZXgtKGRldnxxYXxsdHxzYnxzdGd8dWF0KVxcLmNpc2NvXFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3LWF1dGgtd2ViZXhcXC5jaXNjb1xcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3dieGFwcC1wdWItcHJkMi0wMTo0NTAzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnaGFyZHdhcmVcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcL0xQPVxcZHsxLDR9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZWdhdGUnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAndmFyIHdlYmV4ID0gd2ViZXggfHwge307XG53ZWJleC51dGlsID0gd2ViZXgudXRpbCB8fCB7fTtcbndlYmV4LnV0aWwuZGF0YSA9IChmdW5jdGlvbiAoKSB7XG4gIHZhciBnYXRoZXJlZCA9IHt9O1xuXG4gIHZhciB1dGlsVVJMID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdXJsQ2xlYW5lZDtcblxuICAgIHZhciB1cGRhdGVVUkxQYXJhbWV0ZXIgPSBmdW5jdGlvbiAodXJsLCBwYXJhbUtleSwgcGFyYW1WYWx1ZSkge1xuICAgICAgdmFyIGNhc2VJbnNlbnNpdGl2ZUtleSA9IG5ldyBSZWdFeHAoXCdeXCcgKyBwYXJhbUtleSArIFwnJFwnLCBcJ2lcJyk7XG4gICAgICB2YXIgc3BsaXRzO1xuICAgICAgdmFyIHBhcmFtZXRlcnM7XG4gICAgICB2YXIgdXJsRnVsbCA9IG51bGw7XG4gICAgICB2YXIgdXJsQmFzZSA9IG51bGw7XG4gICAgICB2YXIgdXJsQW5jaG9yID0gbnVsbDtcbiAgICAgIHZhciB1cmxRdWVyeVN0cmluZyA9IG51bGw7XG4gICAgICB2YXIgdXJsUGFyYW1ldGVycyA9IG51bGw7XG4gICAgICB2YXIga2V5O1xuICAgICAgdmFyIGk7XG5cbiAgICAgIHNwbGl0cyA9IHVybC5zcGxpdChcJz9cJyk7XG4gICAgICB1cmxCYXNlID0gc3BsaXRzWzBdO1xuICAgICAgdXJsUXVlcnlTdHJpbmcgPSBzcGxpdHNbMV07XG5cbiAgICAgIGlmICh1cmxRdWVyeVN0cmluZykge1xuICAgICAgICBzcGxpdHMgPSB1cmxRdWVyeVN0cmluZy5zcGxpdChcJyNcJyk7XG4gICAgICAgIHVybFBhcmFtZXRlcnMgPSBzcGxpdHNbMF07XG4gICAgICAgIHVybEFuY2hvciA9IHNwbGl0c1sxXTtcblxuICAgICAgICBwYXJhbWV0ZXJzID0gdXJsUGFyYW1ldGVycy5zcGxpdChcJyZcJyk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBrZXkgPSBwYXJhbWV0ZXJzW2ldLnNwbGl0KFwnPVwnKVswXTtcbiAgICAgICAgICBpZiAoY2FzZUluc2Vuc2l0aXZlS2V5LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsdWUuIEtlZXAgdGhlIG9yaWdpbmFsIGNhc2Ugb2YgdGhlIGtleS5cbiAgICAgICAgICAgIHBhcmFtZXRlcnNbaV0gPSBrZXkgKyBcJz1cJyArIHBhcmFtVmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdXJsUGFyYW1ldGVycyA9IHBhcmFtZXRlcnMuam9pbihcJyZcJyk7XG4gICAgICB9XG5cbiAgICAgIHVybEZ1bGwgPSB1cmxCYXNlO1xuICAgICAgdXJsRnVsbCArPSB1cmxQYXJhbWV0ZXJzID8gXCc/XCcgKyB1cmxQYXJhbWV0ZXJzIDogXCdcJztcbiAgICAgIHVybEZ1bGwgKz0gdXJsQW5jaG9yID8gXCcjXCcgKyB1cmxBbmNob3IgOiBcJ1wnO1xuXG4gICAgICByZXR1cm4gdXJsRnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIHBhcnNlUXVlcnlTdHJpbmcgPSBmdW5jdGlvbiAocSkge1xuICAgICAgLy8gUGFyYW1ldGVyIGtleXMgYXJlIGNvbnZlcnRlZCB0byBhbGwgbG93ZXIgY2FzZS5cbiAgICAgIHFzID0gKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgIHZhciBiID0ge307XG4gICAgICAgIHZhciBwO1xuICAgICAgICBpZiAoYSA9PT0gXCdcJykgcmV0dXJuIGI7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIHAgPSBhW2ldLnNwbGl0KFwnPVwnLCAyKTtcbiAgICAgICAgICBpZiAocC5sZW5ndGggPT09IDEpIGJbcFswXV0gPSBcJ1wnO1xuICAgICAgICAgIC8vIGVsc2UgYltwWzBdLnRvTG93ZXJDYXNlKCldID0gZGVjb2RlVVJJQ29tcG9uZW50KHBbMV0ucmVwbGFjZSgvXFwrL2csIFwnIFwnKSk7XG4gICAgICAgICAgZWxzZSBiW3BbMF0udG9Mb3dlckNhc2UoKV0gPSBwWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSkocS5zcGxpdChcJyZcJykpO1xuXG4gICAgICByZXR1cm4gcXM7XG4gICAgfTtcblxuICAgIHZhciBnZXRQYXJhbWV0ZXJGcm9tUGFnZVVybCA9IGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgdmFyIHVybFJhdyA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gICAgICB2YXIgdXJsQ2xlYW5lZCA9IGNsZWFuKHVybFJhdyk7XG5cbiAgICAgIHJldHVybiBnZXRQYXJhbWV0ZXJGcm9tVXJsKHBhcmFtLCB1cmxDbGVhbmVkKTtcbiAgICB9O1xuXG4gICAgdmFyIGdldFBhcmFtZXRlckZyb21VcmwgPSBmdW5jdGlvbiAocGFyYW0sIHVybCkge1xuICAgICAgdmFyIHF1ZXJ5U3RyaW5nID0gdXJsLnN1YnN0cih1cmwuaW5kZXhPZihcJz9cJykgKyAxKTtcbiAgICAgIHZhciBxcyA9IHBhcnNlUXVlcnlTdHJpbmcocXVlcnlTdHJpbmcpO1xuICAgICAgLy8gUGFyYW1ldGVyIGtleSBtdXN0IGJlIGFsbCBsb3dlciBjYXNlIGZvciBsb29rdXAuXG4gICAgICB2YXIgdmFsdWUgPSBxc1twYXJhbS50b0xvd2VyQ2FzZSgpXSB8fCBcJ1wnO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHZhciBjbGVhbkVtYWlsQWRkcmVzcyA9IGZ1bmN0aW9uIChlbWFpbCwgcmVwbGFjZW1lbnQpIHtcbiAgICAgIHZhciBzcGxpdHM7XG5cbiAgICAgIGVtYWlsID0gZGVjb2RlVVJJQ29tcG9uZW50KGVtYWlsKTtcbiAgICAgIHNwbGl0cyA9IGVtYWlsLnNwbGl0KFwnQFwnKTtcbiAgICAgIC8vIEVtYWlsIGRvbWFpbiBpcyBub3QgUElJLlxuICAgICAgZW1haWwgPSBzcGxpdHMubGVuZ3RoID09PSAyID8gcmVwbGFjZW1lbnQgKyBcJ0BcJyArIHNwbGl0c1sxXSA6IHJlcGxhY2VtZW50O1xuICAgICAgZW1haWwgPSBlbmNvZGVVUklDb21wb25lbnQoZW1haWwpO1xuXG4gICAgICByZXR1cm4gZW1haWw7XG4gICAgfTtcblxuICAgIHZhciByZW1vdmVQSUkgPSBmdW5jdGlvbiAodXJsLCByZXBsYWNlbWVudCkge1xuICAgICAgLy8gUmVtb3ZlIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIChQSUkpLlxuICAgICAgdmFyIGNsZWFuZWQgPSB1cmw7XG4gICAgICB2YXIgQUQgPSBjbGVhbkVtYWlsQWRkcmVzcyhnZXRQYXJhbWV0ZXJGcm9tVXJsKFwnQURcJywgdXJsKSB8fCBcJ1wnLCByZXBsYWNlbWVudCk7XG4gICAgICB2YXIgZW1haWwgPSBjbGVhbkVtYWlsQWRkcmVzcyhnZXRQYXJhbWV0ZXJGcm9tVXJsKFwnZW1haWxcJywgdXJsKSB8fCBcJ1wnLCByZXBsYWNlbWVudCk7XG5cbiAgICAgIC8vIFJlbW92ZSBlbWFpbCBhZGRyZXNzLlxuICAgICAgY2xlYW5lZCA9IHVwZGF0ZVVSTFBhcmFtZXRlcihjbGVhbmVkLCBcJ2VtYWlsXCcsIGVtYWlsKTtcbiAgICAgIC8vIFJlbW92ZSBmaXJzdCBuYW1lLlxuICAgICAgY2xlYW5lZCA9IHVwZGF0ZVVSTFBhcmFtZXRlcihjbGVhbmVkLCBcJ0ZOXCcsIHJlcGxhY2VtZW50KTtcbiAgICAgIC8vIFJlbW92ZSBsYXN0IG5hbWUuXG4gICAgICBjbGVhbmVkID0gdXBkYXRlVVJMUGFyYW1ldGVyKGNsZWFuZWQsIFwnTE5cJywgcmVwbGFjZW1lbnQpO1xuICAgICAgLy8gUmVtb3ZlIHBfdXJsLlxuICAgICAgY2xlYW5lZCA9IHVwZGF0ZVVSTFBhcmFtZXRlcihjbGVhbmVkLCBcJ3BfdXJsXCcsIHJlcGxhY2VtZW50KTtcbiAgICAgIC8vIFJlbW92ZSBmb3IgcG9zdC1tZWV0aW5nIGxhbmRpbmcgcGFnZS5cbiAgICAgIGNsZWFuZWQgPSB1cGRhdGVVUkxQYXJhbWV0ZXIoY2xlYW5lZCwgXCdBRFwnLCBBRCk7XG4gICAgICBjbGVhbmVkID0gdXBkYXRlVVJMUGFyYW1ldGVyKGNsZWFuZWQsIFwnZGlzcGxheU5hbWVcJywgcmVwbGFjZW1lbnQpO1xuICAgICAgY2xlYW5lZCA9IHVwZGF0ZVVSTFBhcmFtZXRlcihjbGVhbmVkLCBcJ05NXCcsIHJlcGxhY2VtZW50KTtcblxuICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfTtcblxuICAgIHZhciBjbGVhbiA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgIHZhciByZWRhY3RlZCA9IFwnUkVEQUNURURcJztcbiAgICAgIHZhciBjbGVhbmVkID0gcmVtb3ZlUElJKHVybCwgcmVkYWN0ZWQpO1xuXG4gICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICB9O1xuXG4gICAgdmFyIGluaXQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHVybFJhdyA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gICAgICB1cmxDbGVhbmVkID0gY2xlYW4odXJsUmF3KTtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmFtZXRlcjogZ2V0UGFyYW1ldGVyRnJvbVBhZ2VVcmwsXG4gICAgICBjbGVhbjogY2xlYW4sXG4gICAgICB1cmxDbGVhbmVkOiB1cmxDbGVhbmVkLFxuICAgIH07XG4gIH0pKCk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB2YXIgdXRpbERHSUQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhID0ge307XG4gICAgdmFyIGludmFsaWQgPSBcJ2ludmFsaWRcJztcbiAgICB2YXIgZnVuY3Rpb25zID0ge1xuICAgICAgMTogXCdNZWRpYVwnLFxuICAgICAgMjogXCdTb2NpYWxcJyxcbiAgICAgIDM6IFwnUHVzaCBDb21tdW5pY2F0aW9uXCcsXG4gICAgICA0OiBcJ0luLVByb2R1Y3QgTWVzc2FnaW5nXCcsXG4gICAgICA1OiBcJ1ZpZGVvXCcsXG4gICAgICA2OiBcJ0Npc2NvXCcsXG4gICAgICA3OiBcJ0NDVEdcJyxcbiAgICAgIDg6IFwnUGFydG5lcnNcJyxcbiAgICB9O1xuICAgIHZhciBjaGFubmVscyA9IHtcbiAgICAgIDE6IFwnT3JnYW5pYyBTb2NpYWxcJyxcbiAgICAgIDI6IFwnUGFpZCBTb2NpYWxcJyxcbiAgICAgIDM6IFwnUHJvZ3JhbW1hdGljXCcsXG4gICAgICA0OiBcJ1NFTVwnLFxuICAgICAgNTogXCdDb250ZW50IFN5bmRpY2F0aW9uIFwnLFxuICAgICAgNjogXCdTcG9uc29yZWQgQ29udGVudCBcJyxcbiAgICAgIDc6IFwnRW1haWxcJyxcbiAgICAgIDg6IFwnVGV4dC9TTVMgTWVzc2FnZVwnLFxuICAgICAgOTogXCdQdXNoIE5vdGlmaWNhdGlvblwnLFxuICAgICAgMTA6IFwnV2ViIFByb2R1Y3QgTWVzc2FnaW5nXCcsXG4gICAgICAxMTogXCdNb2JpbGUgQXBwIE1lc3NhZ2luZ1wnLFxuICAgICAgMTI6IFwnQnJpZ2h0Y292ZVwnLFxuICAgICAgMTM6IFwnV2ViXCcsXG4gICAgICAxNDogXCdDQ1RHIC0gUGFpZCBTb2NpYWxcJyxcbiAgICAgIDE1OiBcJ0NDVEcgLSBPcmdhbmljIFNvY2lhbFwnLFxuICAgICAgMTY6IFwnT3V0IG9mIEhvbWVcJyxcbiAgICAgIDE3OiBcJ0NDVEcgLSBFbWVyZ2VcJyxcbiAgICAgIDE4OiBcJ0NDVEcgLSBTYWxlc1wnLFxuICAgICAgMTk6IFwnQ0NURyAtIEVtYWlsXCcsXG4gICAgICAyMDogXCdBZmZpbGlhdGVcJyxcbiAgICB9O1xuICAgIHZhciBwbGFjZW1lbnRzID0ge1xuICAgICAgMTogXCdCaW5nXCcsXG4gICAgICAyOiBcJ0JpbmdcJyxcbiAgICAgIDM6IFwnRmFjZWJvb2tcJyxcbiAgICAgIDQ6IFwnRkJYXCcsXG4gICAgICA1OiBcJ0dETlwnLFxuICAgICAgNjogXCdHbWFpbFwnLFxuICAgICAgNzogXCdHb29nbGVcJyxcbiAgICAgIDg6IFwnR29vZ2xlK1wnLFxuICAgICAgOTogXCdMaW5rZWRJblwnLFxuICAgICAgMTA6IFwnUGFuZG9yYVwnLFxuICAgICAgMTE6IFwnU3BvdGlmeVwnLFxuICAgICAgMTI6IFwnVHJpcGxlbGlmdFwnLFxuICAgICAgMTM6IFwnVHdpdHRlclwnLFxuICAgICAgMTQ6IFwnV2ViXCcsXG4gICAgICAxNTogXCdZYWhvb1wnLFxuICAgICAgMTY6IFwnWW91dHViZVwnLFxuICAgICAgMTc6IFwnQmFpZHVcJyxcbiAgICAgIDE4OiBcJ0Vsb3F1YVwnLFxuICAgICAgMTk6IFwnTWFya2V0Rmlyc3RcJyxcbiAgICAgIDIwOiBcJ1NhbGVzcGVyc29uXCcsXG4gICAgICAyMTogXCdNb2JpbGUgRGV2aWNlXCcsXG4gICAgICAyMjogXCdTcGFyayBQb3N0IFNlc3Npb25cJyxcbiAgICAgIDIzOiBcJ1cxMSBQb3N0LUF0dGVuZGVlXCcsXG4gICAgICAyNDogXCdNQyBQb3N0LU1lZXRpbmdcJyxcbiAgICAgIDI1OiBcJ1cxMSBUb3AgQmFyXCcsXG4gICAgICAyNjogXCdXMTEgU2lkZWJhclwnLFxuICAgICAgMjc6IFwnVzExIFRpY2tlclwnLFxuICAgICAgMjg6IFwnVzExIEFjY291bnQgU2lkZWJhclwnLFxuICAgICAgMjk6IFwnVzExIEFjY291bnQgVGlja2VyXCcsXG4gICAgICAzMDogXCdTcGFyayBBcHBcJyxcbiAgICAgIDMxOiBcJ1dlYkV4IEFwcFwnLFxuICAgICAgMzI6IFwnTGFuZGluZyBQYWdlXCcsXG4gICAgICAzMzogXCdIdWJcJyxcbiAgICAgIDM0OiBcJ0Npc2NvIEV4cGVydCBUYWxrc1wnLFxuICAgICAgMzU6IFwnQXV0by1Db24gRW1haWxcJyxcbiAgICAgIDM2OiBcJ1NwYXJrIEFkb3B0aW9uIEdhbGxlcnlcJyxcbiAgICAgIDM3OiBcJ01DIEN1cnRhaW5cJyxcbiAgICAgIDM4OiBcJ01DIEludml0ZSBXaWRnZXRcJyxcbiAgICAgIDM5OiBcJ01DIFNjaGVkdWxlclwnLFxuICAgICAgNDA6IFwnTUMgVG9wIEJhclwnLFxuICAgICAgNDE6IFwnU25hcGNoYXRcJyxcbiAgICAgIDQyOiBcJ0FpcnBvcnQgLSBQdWJsaWNcJyxcbiAgICAgIDQzOiBcJ0FpcnBvcnQgLSBNZW1iZXJzIEFyZWFcJyxcbiAgICAgIDQ0OiBcJ0NDVEcgLSBFbWVyZ2UgV2Vic2l0ZVwnLFxuICAgICAgNDU6IFwnQ0NURyAtIFRlYW1UViBXZWJzaXRlXCcsXG4gICAgICA0NjogXCdDQ1RHIC0gU3BhcmtWUiBXZWJzaXRlXCcsXG4gICAgICA0NzogXCdDQ1RHIC0gU2FsZXMgRW1haWxcJyxcbiAgICAgIDQ4OiBcJ0NDVEcgLSBNb25pY2EgV2Vic2l0ZVwnLFxuICAgICAgNDk6IFwnQ2lzY28gLSBOZXdzcm9vbVwnLFxuICAgICAgNTA6IFwnQ2lzY28gLSBFbWFpbCBTZW5kXCcsXG4gICAgICA1MTogXCdQYXJ0bmVyXCcsXG4gICAgICA1MjogXCdJbi1Db250ZW50IENUQVwnLFxuICAgICAgNTM6IFwnSW5zdGFncmFtXCcsXG4gICAgfTtcbiAgICB2YXIgY2hhbm5lbFRhY3RpY3MgPSB7XG4gICAgICAxOiBcJ0FjcXVpc2l0aW9uLU1vZGVsaW5nXCcsXG4gICAgICAyOiBcJ0FydGljbGVcJyxcbiAgICAgIDM6IFwnQ2FzZSBTdHVkeVwnLFxuICAgICAgNDogXCdDUk1cJyxcbiAgICAgIDU6IFwnRGlnaXRhbCBSYWRpb1wnLFxuICAgICAgNjogXCdHcmFwaGljXCcsXG4gICAgICA3OiBcJ0ltYWdlXCcsXG4gICAgICA4OiBcJ0luZm9ncmFwaGljXHRcJyxcbiAgICAgIDk6IFwnTW9iaWxlXCcsXG4gICAgICAxMDogXCdOYXRpdmVcJyxcbiAgICAgIDExOiBcJ1JlbWFya2V0aW5nXCcsXG4gICAgICAxMjogXCdTZWFyY2hcJyxcbiAgICAgIDEzOiBcJ1NlYXJjaCBSZXRhcmdldGluZ1wnLFxuICAgICAgMTQ6IFwnVGV4dFwnLFxuICAgICAgMTU6IFwnVmlkZW9cJyxcbiAgICAgIDE2OiBcJ1ZpZGVvXCcsXG4gICAgICAxNzogXCdWaXN1YWwgQmxvZ1wnLFxuICAgICAgMTg6IFwnV2ViY2FzdFwnLFxuICAgICAgMTk6IFwnV2ViRXggQmxvZ1wnLFxuICAgICAgMjA6IFwnV2hpdGVwYXBlclwnLFxuICAgICAgMjE6IFwnQ3VzdG9tZXIgUmVzZWFyY2hcJyxcbiAgICAgIDIyOiBcJ0FuYWx5c3QgUmVzZWFyY2hcJyxcbiAgICAgIDIzOiBcJ0hvdy10b1wnLFxuICAgICAgMjQ6IFwnVXNhZ2UgVGlwc1wnLFxuICAgICAgMjU6IFwnVHJhbnNhY3Rpb25cJyxcbiAgICAgIDI2OiBcJ1Byb2R1Y3QgT2ZmZXJcJyxcbiAgICAgIDI3OiBcJ1Byb21vdGlvbi9EaXNjb3VudFwnLFxuICAgICAgMjg6IFwnSW5mbHVlbmNlciBQcm9ncmFtXCcsXG4gICAgICAyOTogXCdDb250YWN0IFNhbGVzXCcsXG4gICAgICAzMDogXCdSQURcJyxcbiAgICAgIDMxOiBcJ1ZpZGVvIFRlc3RpbW9uaWFsXCcsXG4gICAgICAzMjogXCdWaWRlbyBIb3ctVG9cJyxcbiAgICAgIDMzOiBcJ1ZpZGVvIENvbW1lcmNpYWxcJyxcbiAgICAgIDM0OiBcJ1ZpZGVvIEFkdmVydGlzZW1lbnRcJyxcbiAgICAgIDM1OiBcJ1ZpZGVvIExpdmUgRGVtb1wnLFxuICAgICAgMzY6IFwnSHViIFJlZmVycmFsXCcsXG4gICAgICAzNzogXCdXZWJpbmFyXCcsXG4gICAgICAzODogXCdDQ1RHIC0gUHJvZHVjdCBXZWJzaXRlXCcsXG4gICAgICAzOTogXCdFLUJvb2tcJyxcbiAgICAgIDQwOiBcJ0VtYWlsIC0gQ29udGVudCBTeW5kaWNhdGlvblwnLFxuICAgICAgNDE6IFwnVGVsZW1hcmtldGluZ1wnLFxuICAgICAgNDI6IFwnQ2hlY2tsaXN0XCcsXG4gICAgICA0MzogXCdOYXRpdmUgQWR2ZXJ0aXNpbmdcJyxcbiAgICB9O1xuICAgIHZhciBwZXJzb25hcyA9IHtcbiAgICAgIDE6IFwnVW5kZWZpbmVkXCcsXG4gICAgICAyOiBcJ0VuYWJsZXJzXCcsXG4gICAgICAzOiBcJ0VuZCBVc2Vyc1wnLFxuICAgICAgNDogXCdTZWxsZXJzXCcsXG4gICAgICA1OiBcJ1N0YWJsZSwgVGVudXJlZFwnLFxuICAgICAgNjogXCdUZWxsZXJzXCcsXG4gICAgICA3OiBcJ1VwIGFuZCBDb21lcnNcJyxcbiAgICB9O1xuICAgIHZhciBnb2FscyA9IHtcbiAgICAgIDE6IFwnQXdhcmVuZXNzXCcsXG4gICAgICAyOiBcJ0Jhc2ljIEFjY291bnRcJyxcbiAgICAgIDM6IFwnQmFzaWMgdG8gUHJlbWl1bVwnLFxuICAgICAgNDogXCdDYWxsIFNhbGVzIFRlYW1cJyxcbiAgICAgIDU6IFwnRnJlZSBUcmlhbFwnLFxuICAgICAgNjogXCdQcmVtaXVtIDEwMFwnLFxuICAgICAgNzogXCdSZXF1ZXN0IGEgRGVtb1wnLFxuICAgICAgODogXCdVcGdyYWRlXCcsXG4gICAgICA5OiBcJ0Rvd25sb2FkIEFwcFwnLFxuICAgICAgMTA6IFwnTnVydHVyZVwnLFxuICAgICAgMTE6IFwnQWN0aXZhdGlvblwnLFxuICAgICAgMTI6IFwnQWRvcHRpb25cJyxcbiAgICAgIDEzOiBcJ0NhcnQgYWJhbmRvblwnLFxuICAgICAgMTQ6IFwnRHJpcFwnLFxuICAgICAgMTU6IFwnSG90bGluZSAvIENoYXRcJyxcbiAgICAgIDE2OiBcJ09uLWJvYXJkXCcsXG4gICAgICAxNzogXCdSZWN5Y2xlXCcsXG4gICAgICAxODogXCdSZXRlbnRpb25cJyxcbiAgICAgIDE5OiBcJ1Vwc2VsbFwnLFxuICAgICAgMjA6IFwnV2FuZXJcJyxcbiAgICAgIDIxOiBcJ0xpdmUgZGVtb1wnLFxuICAgICAgMjI6IFwnUHJlbWl1bVwnLFxuICAgICAgMjM6IFwnTVFMXCcsXG4gICAgfTtcbiAgICB2YXIgcHJvZHVjdHMgPSB7XG4gICAgICAxOiBcJ0Npc2NvIFNwYXJrXCcsXG4gICAgICAyOiBcJ0NvbGxhYm9yYXRpb24gTWVldGluZyBSb29tcyAoQ01SKVwnLFxuICAgICAgMzogXCdDb2xsYWJvcmF0aW9uIFNvbHV0aW9uc1wnLFxuICAgICAgNDogXCdXZWJFeCBFdmVudCBDZW50ZXJcJyxcbiAgICAgIDU6IFwnV2ViRXggTWVldGluZyBDZW50ZXJcJyxcbiAgICAgIDY6IFwnV2ViRXggTWVldGluZ3NcJyxcbiAgICAgIDc6IFwnV2ViRXggVHJhaW5pbmcgQ2VudGVyXCcsXG4gICAgICA4OiBcJ1dlYkV4IFN1cHBvcnQgQ2VudGVyXCcsXG4gICAgICA5OiBcJ1Byb2plY3QgU3Rvcm1cJyxcbiAgICAgIDEwOiBcJ01DK1NwYXJrXCcsXG4gICAgICAxMTogXCdTcGFyayBCb2FyZFwnLFxuICAgIH07XG5cbiAgICB2YXIgZ2V0Q291bnRyeSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgdmFyIGNvdW50cnkgPSBpbnZhbGlkO1xuXG4gICAgICAvLyBGb3JtYXQgdmFsdWVzIHByb3Blcmx5LlxuICAgICAgaWYgKC9eW2Etel17Mn0kL2kudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgY291bnRyeSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9IGVsc2UgaWYgKC9eR2xvYmFsJC9pLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIGNvdW50cnkgPSBcJ0dsb2JhbFwnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY291bnRyeTtcbiAgICB9O1xuXG4gICAgdmFyIGxvb2t1cCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlcykge1xuICAgICAgdmFyIGNsZWFuZWRLZXkgPSBjbGVhbktleShrZXkpO1xuICAgICAgdmFyIHZhbHVlID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlcywgY2xlYW5lZEtleSkgPyB2YWx1ZXNbY2xlYW5lZEtleV0gOiBpbnZhbGlkO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHZhciB0cmltTGVhZGluZ1plcm9lcyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5yZXBsYWNlKC9eMCsvLCBcJ1wnKTtcbiAgICB9O1xuXG4gICAgdmFyIGNsZWFuS2V5ID0gZnVuY3Rpb24gKHMpIHtcbiAgICAgIC8vIEEga2V5IG11c3QgaGF2ZSAxLTQgZGlnaXRzLiBXZSB3aWxsIHRyaW0gYW55IGxlYWRpbmcgemVyb2VzIGZvciBzdWJzZXF1ZW50IGxvb2t1cC5cbiAgICAgIHZhciB2YWxpZEtleSA9IC9eXFxkezEsNH0kLztcbiAgICAgIHZhciBjbGVhbmVkID0gcztcblxuICAgICAgaWYgKHZhbGlkS2V5LnRlc3QoY2xlYW5lZCkpIHtcbiAgICAgICAgY2xlYW5lZCA9IHRyaW1MZWFkaW5nWmVyb2VzKGNsZWFuZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xlYW5lZCA9IGludmFsaWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgIH07XG5cbiAgICB2YXIgdmFsaWRhdGVEZ2lkID0gZnVuY3Rpb24gKGRnaWQpIHtcbiAgICAgIC8vIERHSUQga2V5IHNob3VsZCBoYXZlIDggcG9zaXRpb25zIGRlbGltaXRlZCBieSAiLSIuXG4gICAgICB2YXIgaXNWYWxpZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodHlwZW9mIGRnaWQgPT09IFwnc3RyaW5nXCcpIHtcbiAgICAgICAgaXNWYWxpZCA9IGRnaWQuc3BsaXQoXCctXCcpLmxlbmd0aCA9PT0gODtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGlzVmFsaWQ7XG4gICAgfTtcblxuICAgIHZhciBkZWNvZGVEZ2lkID0gZnVuY3Rpb24gKGRnaWQpIHtcbiAgICAgIHZhciBpc1ZhbGlkRGdpZCA9IHZhbGlkYXRlRGdpZChkZ2lkKTtcbiAgICAgIHZhciBrZXlzO1xuICAgICAgdmFyIGRlY29kZWQgPSB7fTtcbiAgICAgIHZhciBkZ0Z1bmN0aW9uID0gaW52YWxpZDtcbiAgICAgIHZhciBkZ0NoYW5uZWwgPSBpbnZhbGlkO1xuICAgICAgdmFyIGRnUGxhY2VtZW50ID0gaW52YWxpZDtcbiAgICAgIHZhciBkZ0NvdW50cnkgPSBpbnZhbGlkO1xuICAgICAgdmFyIGRnQ2hhbm5lbFRhY3RpYyA9IGludmFsaWQ7XG4gICAgICB2YXIgZGdQZXJzb25hID0gaW52YWxpZDtcbiAgICAgIHZhciBkZ0dvYWwgPSBpbnZhbGlkO1xuICAgICAgdmFyIGRnUHJvZHVjdCA9IGludmFsaWQ7XG5cbiAgICAgIGlmIChpc1ZhbGlkRGdpZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGtleXMgPSBkZ2lkLnNwbGl0KFwnLVwnKTtcbiAgICAgICAgICBkZ0Z1bmN0aW9uID0gbG9va3VwKGtleXNbMF0sIGZ1bmN0aW9ucyk7XG4gICAgICAgICAgZGdDaGFubmVsID0gbG9va3VwKGtleXNbMV0sIGNoYW5uZWxzKTtcbiAgICAgICAgICBkZ1BsYWNlbWVudCA9IGxvb2t1cChrZXlzWzJdLCBwbGFjZW1lbnRzKTtcbiAgICAgICAgICBkZ0NvdW50cnkgPSBnZXRDb3VudHJ5KGtleXNbM10pO1xuICAgICAgICAgIGRnQ2hhbm5lbFRhY3RpYyA9IGxvb2t1cChrZXlzWzRdLCBjaGFubmVsVGFjdGljcyk7XG4gICAgICAgICAgZGdQZXJzb25hID0gbG9va3VwKGtleXNbNV0sIHBlcnNvbmFzKTtcbiAgICAgICAgICBkZ0dvYWwgPSBsb29rdXAoa2V5c1s2XSwgZ29hbHMpO1xuICAgICAgICAgIGRnUHJvZHVjdCA9IGxvb2t1cChrZXlzWzddLCBwcm9kdWN0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBEbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRlY29kZWQgPSB7XG4gICAgICAgIGRnX2Z1bmN0aW9uOiBkZ0Z1bmN0aW9uLFxuICAgICAgICBkZ19jaGFubmVsOiBkZ0NoYW5uZWwsXG4gICAgICAgIGRnX3BsYWNlbWVudDogZGdQbGFjZW1lbnQsXG4gICAgICAgIGRnX2NvdW50cnk6IGRnQ291bnRyeSxcbiAgICAgICAgZGdfY2hhbm5lbF90YWN0aWM6IGRnQ2hhbm5lbFRhY3RpYyxcbiAgICAgICAgZGdfcGVyc29uYTogZGdQZXJzb25hLFxuICAgICAgICBkZ19nb2FsOiBkZ0dvYWwsXG4gICAgICAgIGRnX3Byb2R1Y3Q6IGRnUHJvZHVjdCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0REdJRCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEluIG9yZGVyIG9mIHByZWZlcmVuY2UsIGNoZWNrIERHLCB0aGVuIERHSUQgcGFyYW1ldGVycy5cbiAgICAgIHZhciBkZ2lkID0ge307XG4gICAgICBkZ2lkLmtleSA9IHV0aWxVUkwucGFyYW1ldGVyKFwnREdcJyk7XG4gICAgICBpZiAoZGdpZC5rZXkgPT09IFwnXCcpIHtcbiAgICAgICAgZGdpZC5rZXkgPSB1dGlsVVJMLnBhcmFtZXRlcihcJ0RHSURcJyk7XG4gICAgICB9XG4gICAgICBkZ2lkLmRlY29kZWQgPSBkZWNvZGVEZ2lkKGRnaWQua2V5KTtcblxuICAgICAgcmV0dXJuIGRnaWQ7XG4gICAgfTtcblxuICAgIHZhciBpbml0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRhdGEgPSBnZXRER0lEKCk7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG4gIH0pKCk7XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgdmFyIHV0aWxVVE0gPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciB1cmxQYXJhbWV0ZXJzO1xuICAgIHZhciBoYXNVcmxQYXJhbWV0ZXJzO1xuXG4gICAgdmFyIGdldFVybFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBVVE0gU291cmNlOiBQYWlkU2VhcmNoLCBQYWlkU29jaWFsLCBQcm9ncmFtbWF0aWMsIE9yZ2FuaWNTb2NpYWwgZXRjLlxuICAgICAgLy8gVVRNIENoYW5uZWw6IEdvb2dsZUFkcyAvIEZhY2Vib29rQWRzIC8gVHdpdHRlckFkcyBldGNcbiAgICAgIC8vIFVUTSBDYW1wYWlnbjogQ2FtcGFpZ24gbmFtZVxuICAgICAgLy8gVVRNIENvbnRlbnQ6IEFkIFNldCAvIEFkIEdyb3VwXG4gICAgICAvLyBVVE0gTWVkaXVtOiBBZCBuYW1lXG4gICAgICBwYXJhbWV0ZXJzID0ge1xuICAgICAgICBjYW1wYWlnbjogdXRpbFVSTC5wYXJhbWV0ZXIoXCd1dG1fY2FtcGFpZ25cJyksXG4gICAgICAgIGNoYW5uZWw6IHV0aWxVUkwucGFyYW1ldGVyKFwndXRtX2NoYW5uZWxcJyksXG4gICAgICAgIGNvbnRlbnQ6IHV0aWxVUkwucGFyYW1ldGVyKFwndXRtX2NvbnRlbnRcJyksXG4gICAgICAgIG1lZGl1bTogdXRpbFVSTC5wYXJhbWV0ZXIoXCd1dG1fbWVkaXVtXCcpLFxuICAgICAgICBzb3VyY2U6IHV0aWxVUkwucGFyYW1ldGVyKFwndXRtX3NvdXJjZVwnKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICAgIH07XG5cbiAgICB2YXIgaW5pdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICB1cmxQYXJhbWV0ZXJzID0gZ2V0VXJsUGFyYW1ldGVycygpO1xuXG4gICAgICBoYXNVcmxQYXJhbWV0ZXJzID1cbiAgICAgICAgcGFyYW1ldGVycy5jYW1wYWlnbiArIHBhcmFtZXRlcnMuY2hhbm5lbCArIHBhcmFtZXRlcnMuY29udGVudCArIHBhcmFtZXRlcnMubWVkaXVtICsgcGFyYW1ldGVycy5zb3VyY2UgIT09IFwnXCc7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXJhbWV0ZXJzOiB1cmxQYXJhbWV0ZXJzLFxuICAgICAgaGFzUGFyYW1ldGVyczogaGFzVXJsUGFyYW1ldGVycyxcbiAgICB9O1xuICB9KSgpO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHBvc3QtbWVldGluZyBsYW5kaW5nIHBhZ2VcbiAgdmFyIHBtbHAgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBkYXRhID0ge307XG5cbiAgICB2YXIgZ2V0VXNlclR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdXJsID0gdXRpbFVSTC51cmxDbGVhbmVkO1xuICAgICAgdmFyIHVzZXJUeXBlID0gXCdcJztcbiAgICAgIGlmICgvXFwvcG9zdC1tZWV0aW5nXFwvaG9zdFxcLy8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVzZXJUeXBlID0gXCdob3N0XCc7XG4gICAgICB9IGVsc2UgaWYgKC9cXC9wb3N0LW1lZXRpbmdcXC9hdHRlbmRlZVxcLy8udGVzdCh1cmwpKSB7XG4gICAgICAgIHVzZXJUeXBlID0gXCdhdHRlbmRlZVwnO1xuICAgICAgfSBlbHNlIGlmICgvXFwvcG9zdC1tZWV0aW5nXFwvaW5kZXhcXC5odG1sLy50ZXN0KHVybCkpIHtcbiAgICAgICAgdXNlclR5cGUgPSB1dGlsVVJMLnBhcmFtZXRlcihcJ3VzZXJUeXBlXCcpLnRvTG93ZXJDYXNlKCkgfHwgXCdcJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVzZXJUeXBlO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICBiaWxsaW5nTW9kZTogdXRpbFVSTC5wYXJhbWV0ZXIoXCdiaWxsaW5nTW9kZVwnKSxcbiAgICAgICAgdXNlclR5cGU6IGdldFVzZXJUeXBlKCksXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgdmFyIGlzUG1scDtcblxuICAgIHZhciBpbml0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgIGRhdGEgPSBnZXREYXRhKCk7XG5cbiAgICAgIGlzUG1scCA9IGRhdGEudXNlclR5cGUgIT09IFwnXCc7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgaXNQbWxwOiBpc1BtbHAsXG4gICAgfTtcbiAgfSkoKTtcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICB2YXIgZGV2aWNlSW5mbyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRhdGEgPSB7fTtcblxuICAgIHZhciBnZXREYXRhID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGdldEJ1Y2tldCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHZhciBidWNrZXRTaXplID0gMTAwO1xuXG4gICAgICAgIHZhciBsb3dlckJvdW5kID0gTWF0aC5mbG9vcih4IC8gYnVja2V0U2l6ZSk7XG4gICAgICAgIHZhciB1cHBlckJvdW5kID0gKGxvd2VyQm91bmQgKyAxKSAqIGJ1Y2tldFNpemUgLSAxO1xuXG4gICAgICAgIHZhciB2YWx1ZSA9IGxvd2VyQm91bmQgKiBidWNrZXRTaXplICsgXCcgdG8gXCcgKyB1cHBlckJvdW5kO1xuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBtb25pdG9yID0ge1xuICAgICAgICB3aWR0aDogd2luZG93LnNjcmVlbi53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuc2NyZWVuLmhlaWdodCxcbiAgICAgIH07XG4gICAgICBtb25pdG9yLndpZHRoX2J1Y2tldGVkID0gZ2V0QnVja2V0KG1vbml0b3Iud2lkdGgpO1xuICAgICAgbW9uaXRvci5oZWlnaHRfYnVja2V0ZWQgPSBnZXRCdWNrZXQobW9uaXRvci5oZWlnaHQpO1xuXG4gICAgICB2YXIgdmlld3BvcnQgPSB7XG4gICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICB9O1xuICAgICAgdmlld3BvcnQud2lkdGhfYnVja2V0ZWQgPSBnZXRCdWNrZXQodmlld3BvcnQud2lkdGgpO1xuICAgICAgdmlld3BvcnQuaGVpZ2h0X2J1Y2tldGVkID0gZ2V0QnVja2V0KHZpZXdwb3J0LmhlaWdodCk7XG5cbiAgICAgIHZhciBkYXRhID0ge1xuICAgICAgICBzY3JlZW46IG1vbml0b3IsXG4gICAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydCxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH07XG5cbiAgICB2YXIgaW5pdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICBkYXRhID0gZ2V0RGF0YSgpO1xuICAgIH0pKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogZGF0YSxcbiAgICB9O1xuICB9KSgpO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgdmFyIGdldFJlZmVycmVyVVJMID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB1cmwgPSBkb2N1bWVudC5yZWZlcnJlciB8fCBcJ1wnO1xuXG4gICAgdXJsID0gdXRpbFVSTC5jbGVhbih1cmwpO1xuXG4gICAgcmV0dXJuIHVybDtcbiAgfTtcblxuICB2YXIgZ2V0UmVmZXJyZXJEb21haW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGRvbWFpbjtcbiAgICB2YXIgdXJsID0gZG9jdW1lbnQucmVmZXJyZXI7XG5cbiAgICB2YXIgbWF0Y2hlcyA9IHVybC5tYXRjaCgvOlxcL1xcLyguW14vXSspLyk7XG5cbiAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCAmJiBtYXRjaGVzWzFdICE9PSBudWxsKSB7XG4gICAgICBkb21haW4gPSBtYXRjaGVzWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb21haW4gPSBcJ1wnO1xuICAgIH1cblxuICAgIHJldHVybiBkb21haW47XG4gIH07XG5cbiAgdmFyIGdldFJlZmVycmVyQ2hhbm5lbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZG9tYWluID0gZ2V0UmVmZXJyZXJEb21haW4oKTtcbiAgICB2YXIgcGF0dGVybkRpcmVjdCA9IC9eJC87XG4gICAgdmFyIHBhdHRlcm5JbnRlcm5hbCA9IC8oYmxvZ3xoZWxwKVxcLndlYmV4XFwuY29tL2k7XG4gICAgLy8gVXNlIG5vbmUgdG8gYnVja2V0IGV4Y2x1c2lvbnMgd2l0aCBhbGwgbG93ZXIgZW52aXJvbm1lbnQsIHdlYmV4LmNvLiosIGFuZCBub24tIGJsb2cuIGFuZCBoZWxwLiB3ZWJleC5jb20gdHJhZmZpYy5cbiAgICB2YXIgcGF0dGVybk5vbmUgPSAvKHdieGFwcC0oYXV0aHxwdWIpLXxvcmlnaW4td2ViZXgtW2Etel0rLmNpc2NvXFwuY29tfFxcLndlYmV4XFwuY29cXC58KD8hYmxvZ3xoZWxwKVxcLndlYmV4XFwuY29tKS9pO1xuICAgIHZhciBwYXR0ZXJuU2VhcmNoID0gL1xcLihhb2x8YXNrfGFza2plZXZlc3xiYWlkdXxiaW5nfGNoYWNoYXxkdWNrZHVja2dvfGV4Y2l0ZXxnb29nbGV8bHljb3N8bXN4bWx8c2VhcmNoZW5jcnlwdHx5YWhvb3x5YW5kZXgpXFwuL2k7XG4gICAgdmFyIHBhdHRlcm5Tb2NpYWwgPSAvXFwuKGZhY2Vib29rfGxpbmtlZGluKVxcLmNvbS9pO1xuICAgIHZhciBjaGFubmVscyA9IHtcbiAgICAgIGRpcmVjdDogXCdkaXJlY3RcJyxcbiAgICAgIGludGVybmFsOiBcJ2ludGVybmFsXCcsXG4gICAgICBub25lOiBcJ25vbmVcJyxcbiAgICAgIG90aGVyOiBcJ290aGVyXCcsXG4gICAgICBzZWFyY2g6IFwnc2VhcmNoIGVuZ2luZVwnLFxuICAgICAgc29jaWFsOiBcJ3NvY2lhbFwnLFxuICAgIH07XG4gICAgdmFyIGNoYW5uZWwgPSBjaGFubmVscy5vdGhlcjtcblxuICAgIGlmIChwYXR0ZXJuRGlyZWN0LnRlc3QoZG9tYWluKSkge1xuICAgICAgY2hhbm5lbCA9IGNoYW5uZWxzLmRpcmVjdDtcbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5JbnRlcm5hbC50ZXN0KGRvbWFpbikpIHtcbiAgICAgIGNoYW5uZWwgPSBjaGFubmVscy5pbnRlcm5hbDtcbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5Ob25lLnRlc3QoZG9tYWluKSkge1xuICAgICAgY2hhbm5lbCA9IGNoYW5uZWxzLm5vbmU7XG4gICAgfSBlbHNlIGlmIChwYXR0ZXJuU2VhcmNoLnRlc3QoZG9tYWluKSkge1xuICAgICAgY2hhbm5lbCA9IGNoYW5uZWxzLnNlYXJjaDtcbiAgICB9IGVsc2UgaWYgKHBhdHRlcm5Tb2NpYWwudGVzdChkb21haW4pKSB7XG4gICAgICBjaGFubmVsID0gY2hhbm5lbHMuc29jaWFsO1xuICAgIH1cblxuICAgIGlmICgvXihzZWFyY2ggZW5naW5lfHNvY2lhbCkkL2kudGVzdChjaGFubmVsKSkge1xuICAgICAgY2hhbm5lbCA9IGlzUGFpZFRyYWZmaWMoKSA/IGNoYW5uZWwgKyBcJyAtIHBhaWRcJyA6IGNoYW5uZWwgKyBcJyAtIG9yZ2FuaWNcJztcbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbDtcbiAgfTtcblxuICB2YXIgZ2V0UHNlYXJjaElEID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJhbSA9IGRlY29kZVVSSUNvbXBvbmVudCh1dGlsVVJMLnBhcmFtZXRlcihcJ3BzZWFyY2hJRFwnKSk7XG5cbiAgICByZXR1cm4gcGFyYW07XG4gIH07XG5cbiAgdmFyIGdldFRyYWNrSUQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRyYWNrSUQgPSB1dGlsVVJMLnBhcmFtZXRlcihcJ1RyYWNrSURcJyk7XG5cbiAgICByZXR1cm4gdHJhY2tJRDtcbiAgfTtcblxuICB2YXIgaXNQYWlkVHJhZmZpYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBDaGVjayBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZXhpc3QuXG4gICAgdmFyIGlzUGFpZCA9IHV0aWxER0lELmRhdGEua2V5ICE9PSBcJ1wnIHx8IHV0aWxVVE0uaGFzUGFyYW1ldGVycztcblxuICAgIHJldHVybiBpc1BhaWQ7XG4gIH07XG5cbiAgdmFyIGdldFRhcmdldGVyVmFsdWUgPSBmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICB2YXIgdmFsdWU7XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcJ3RhcmdldGVyXCcpKS5mb3JfYW5hbHlzaXNbcHJvcGVydHldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhbHVlID0gXCdcJztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIGdldFBhZ2VOYW1lID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBuYW1lO1xuXG4gICAgdmFyIGlzRmlsZSA9IGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgIHZhciB2YWx1ZSA9IC9eZmlsZTpcXC9cXC8vaS50ZXN0KHVybCk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHZhciBpc1BhZ2VOb3RGb3VuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhbHVlID0gZmFsc2U7XG4gICAgICB2YXIgdHJhbnNsYXRpb25QYWdlTm90Rm91bmQgPSBbXG4gICAgICAgIFwnUGFnZSBub3QgRm91bmRcJywgLy8gZW5cbiAgICAgICAgXCdTZWl0ZSBuaWNodCBnZWZ1bmRlblwnLCAvLyBkZVxuICAgICAgICBcJ1DDoWdpbmEgbm8gZW5jb250cmFkYVwnLCAvLyBlc1xuICAgICAgICBcJ1BhZ2Ugbm9uIHRyb3V2w6llXCcsIC8vIGZyXG4gICAgICAgIFwn44Oa44O844K444GM6KaL44Gk44GL44KK44G+44Gb44KTIC0gQ2lzY28gV2ViZXhcJywgLy8gamFcbiAgICAgICAgXCdQw6FnaW5hIG7Do28gZW5jb250cmFkYVwnLCAvLyBwdFxuICAgICAgICBcJ+mhtemdouacquaJvuWIsFwnLCAvLyB6aF9DTlxuICAgICAgICBcJ+aJvuS4jeWIsOmggemdolwnLCAvLyB6aF9IS1xuICAgICAgICBcJ1BhZ2Ugbm90IEZvdW5kXCcsXG4gICAgICAgIFwn7Y6Y7J207KeA66W8IOywvuydhCDsiJgg7JeG7J2MXCcsIC8vIGtvXG4gICAgICAgIFwnTm8gc2UgZW5jb250csOzIGxhIHDDoWdpbmEuXCcsIC8vIGVzX01YXG4gICAgICBdO1xuICAgICAgdmFyIG1ldGFUaXRsZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbWV0YVRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcJ21ldGFbbmFtZT10aXRsZV1cJykuY29udGVudC50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBtZXRhVGl0bGUgPSBcJ1wnO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0YVRpdGxlICE9PSBcJ1wnKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJhbnNsYXRpb25QYWdlTm90Rm91bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YWx1ZSA9IHRyYW5zbGF0aW9uUGFnZU5vdEZvdW5kW2ldLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihtZXRhVGl0bGUpID4gLTE7XG4gICAgICAgICAgaWYgKHZhbHVlKSBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfTtcblxuICAgIHZhciB1cmwgPSBkb2N1bWVudC5VUkw7XG5cbiAgICBuYW1lID0gaXNQYWdlTm90Rm91bmQoKVxuICAgICAgPyBcJ3BhZ2Utbm90LWZvdW5kXCdcbiAgICAgIDogaXNGaWxlKHVybClcbiAgICAgID8gXCdmaWxlXCdcbiAgICAgIDogL3d3d1xcLndlYmV4XFwuY29tXFwvam9pblxcLy9pLnRlc3QodXJsKVxuICAgICAgPyBcJ2pvaW5cJ1xuICAgICAgOiAvd3d3XFwud2ViZXhcXC5jb21cXC9tZWV0XFwvL2kudGVzdCh1cmwpXG4gICAgICA/IFwnbWVldFwnXG4gICAgICA6IF9zYXRlbGxpdGUuZ2V0VmFyKFwncF9uXCcpLnJlcGxhY2UoXCc6XCcsIFwnXCcpO1xuXG4gICAgcmV0dXJuIG5hbWU7XG4gIH07XG5cbiAgdmFyIGdldFBhZ2VDYXRlZ29yeSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gXCdcJztcbiAgfTtcblxuICB2YXIgZ2F0aGVyRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZGdpZCA9IHV0aWxER0lELmRhdGE7XG4gICAgdmFyIHV0bSA9IHV0aWxVVE0ucGFyYW1ldGVycztcbiAgICB2YXIgaXNQYWlkID0gaXNQYWlkVHJhZmZpYygpO1xuICAgIHZhciBkZXZpY2UgPSBkZXZpY2VJbmZvLmRhdGE7XG4gICAgdmFyIGNsZWFuZWRVUkwgPSB1dGlsVVJMLnVybENsZWFuZWQ7XG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBwYWdlTmFtZTogZ2V0UGFnZU5hbWUoKSxcbiAgICAgIHBhZ2VDYXRlZ29yeTogZ2V0UGFnZUNhdGVnb3J5KCksXG4gICAgICBkZXN0aW5hdGlvblVSTDogY2xlYW5lZFVSTCxcbiAgICAgIHJlZmVycmluZ1VSTDogZ2V0UmVmZXJyZXJVUkwoKSxcbiAgICAgIHJlZmVycmluZ0RvbWFpbjogZ2V0UmVmZXJyZXJEb21haW4oKSxcbiAgICAgIHJlZmVycmluZ0NoYW5uZWw6IGdldFJlZmVycmVyQ2hhbm5lbCgpLFxuICAgICAgdXRtOiB1dG0sXG4gICAgICBER0lEOiBkZ2lkLFxuICAgICAgdHJhY2tJRDogZ2V0VHJhY2tJRCgpLFxuICAgICAgcHNlYXJjaElEOiBnZXRQc2VhcmNoSUQoKSxcbiAgICAgIGlzUGFpZFRyYWZmaWM6IGlzUGFpZCxcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgIH07XG5cbiAgICB2YXIgbWFpblVybCA9IGNsZWFuZWRVUkxcbiAgICAgIC5yZXBsYWNlKC9bXFw/fCNdLisvLCBcJ1wnKVxuICAgICAgLnJlcGxhY2UoL1s/XS9nLCBcJ1wnKVxuICAgICAgLnJlcGxhY2UoL15odHRwKHM/KTpcXC9cXC8vaSwgXCdcJyk7XG4gICAgdmFyIGZ1bGxVcmwgPSBjbGVhbmVkVVJMLnJlcGxhY2UoL15odHRwKHM/KTpcXC9cXC8vaSwgXCdcJyk7XG4gICAgdmFyIHVzZXJMYW5nID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KFwndXNlcl9sYW5nXCcpIHx8IFwnXCc7XG4gICAgdmFyIHVzZXJMb2NhbGU7XG4gICAgaWYgKGNsZWFuZWRVUkwuaW5kZXhPZihcJy93d3cud2ViZXguY28uaW5cJykgPiAwKSB1c2VyTG9jYWxlID0gXCdpblwnO1xuICAgIGVsc2UgaWYgKGNsZWFuZWRVUkwuaW5kZXhPZihcJy93d3cud2ViZXguY29tLmNuXCcpID4gMCkgdXNlckxvY2FsZSA9IFwnY25cJztcbiAgICBlbHNlIGlmIChjbGVhbmVkVVJMLmluZGV4T2YoXCcvd3d3LndlYmV4LmNvbS5iclwnKSA+IDApIHVzZXJMb2NhbGUgPSBcJ2JyXCc7XG4gICAgZWxzZSBpZiAoY2xlYW5lZFVSTC5pbmRleE9mKFwnL3d3dy53ZWJleC5jb20ubXgvXCcpID4gMCkgdXNlckxvY2FsZSA9IFwnbXhcJztcbiAgICBlbHNlIGlmIChjbGVhbmVkVVJMLmluZGV4T2YoXCcvd3d3LndlYmV4LmNvLmtyL1wnKSA+IDApIHVzZXJMb2NhbGUgPSBcJ2tyXCc7XG4gICAgZWxzZSBpZiAoY2xlYW5lZFVSTC5pbmRleE9mKFwnL3d3dy53ZWJleC5lcy9cJykgPiAwKSB1c2VyTG9jYWxlID0gXCdlc1wnO1xuICAgIGVsc2UgaWYgKGNsZWFuZWRVUkwuaW5kZXhPZihcJy93d3cud2ViZXguY28uaXQvXCcpID4gMCkgdXNlckxvY2FsZSA9IFwnaXRcJztcbiAgICBlbHNlIGlmIChjbGVhbmVkVVJMLmluZGV4T2YoXCcvd3d3LndlYmV4LmNvbS9pdC9cJykgPiAwKSB1c2VyTG9jYWxlID0gXCdpdFwnO1xuICAgIGVsc2UgaWYgKGNsZWFuZWRVUkwuaW5kZXhPZihcJy93d3cud2ViZXguY29tL2VzL1wnKSA+IDApIHVzZXJMb2NhbGUgPSBcJ2VzXCc7XG4gICAgZWxzZSBpZiAoY2xlYW5lZFVSTC5pbmRleE9mKFwnL3d3dy53ZWJleC5jb20va28vXCcpID4gMCkgdXNlckxvY2FsZSA9IFwna29cJztcbiAgICBlbHNlIGlmIChjbGVhbmVkVVJMLmluZGV4T2YoXCcvd3d3LndlYmV4LmNvbS9oay9cJykgPiAwKSB1c2VyTG9jYWxlID0gXCdpdFwnO1xuICAgIGVsc2UgaWYgKGNsZWFuZWRVUkwuaW5kZXhPZihcJy93d3cud2ViZXguY29tL2JyL1wnKSA+IDApIHVzZXJMb2NhbGUgPSBcJ2JyXCc7XG4gICAgZWxzZSB1c2VyTG9jYWxlID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KFwndXNlcl9sb2NhbGVcJykgfHwgXCdcJztcblxuICAgIHVzZXJMYW5nID0gdXNlckxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICB1c2VyTG9jYWxlID0gdXNlckxvY2FsZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gQWRkIHRvIHRoZSBkYXRhIG9iamVjdC5cbiAgICBkYXRhLnBhZ2VWaWV3ZWRFdmVudFByb3BlcnRpZXMgPSB7XG4gICAgICBwYWdlX25hbWU6IGRhdGEucGFnZU5hbWUsXG4gICAgICBwYWdlX2NhdGVnb3J5OiBkYXRhLnBhZ2VDYXRlZ29yeSxcbiAgICAgIGN1c3RvbV9yZWZlcnJlcl91cmw6IGRhdGEucmVmZXJyaW5nVVJMLFxuICAgICAgbWFpbl9wYWdlX3VybDogbWFpblVybCxcbiAgICAgIHBhZ2VfdXJsOiBmdWxsVXJsLFxuICAgICAgZG9tYWluOiBsb2NhdGlvbi5ob3N0LFxuICAgICAgbG9jYWxlOiB1c2VyTG9jYWxlLFxuICAgICAgbGFuZzogdXNlckxhbmcsXG4gICAgICBkZ19wYXJhbTogZGF0YS5ER0lELmtleSxcbiAgICAgIHRyYWNrSUQ6IGRhdGEudHJhY2tJRCxcbiAgICAgIHBzZWFyY2hJRDogZGF0YS5wc2VhcmNoSUQsXG4gICAgfTtcblxuICAgIGRhdGEudGFyZ2V0ZXIgPSB7XG4gICAgICBkb21haW46IGdldFRhcmdldGVyVmFsdWUoXCdkb21haW5cJyksXG4gICAgICBjb21wYW55X25hbWU6IGdldFRhcmdldGVyVmFsdWUoXCdjb21wYW55X25hbWVcJyksXG4gICAgICBjb21wYW55X3NpemU6IGdldFRhcmdldGVyVmFsdWUoXCdjb21wYW55X3NpemVcJyksXG4gICAgICBpbmR1c3RyeV9jYXRlZ29yeTogZ2V0VGFyZ2V0ZXJWYWx1ZShcJ2luZHVzdHJ5X2NhdGVnb3J5XCcpLFxuICAgICAgaW5kdXN0cnlfc3ViX2NhdGVnb3J5OiBnZXRUYXJnZXRlclZhbHVlKFwnaW5kdXN0cnlfc3ViX2NhdGVnb3J5XCcpLFxuICAgICAgc2VnbWVudDogZ2V0VGFyZ2V0ZXJWYWx1ZShcJ3NlZ21lbnRcJyksXG4gICAgfTtcblxuICAgIGlmIChwbWxwLmlzUG1scCkge1xuICAgICAgZGF0YS5wbWxwID0gcG1scC5kYXRhO1xuICAgICAgZGF0YS5wYWdlVmlld2VkRXZlbnRQcm9wZXJ0aWVzLnBtbHBfdXNlcl90eXBlID0gZGF0YS5wbWxwLnVzZXJUeXBlO1xuICAgICAgZGF0YS5wYWdlVmlld2VkRXZlbnRQcm9wZXJ0aWVzLnBtbHBfYmlsbGluZ19tb2RlID0gZGF0YS5wbWxwLmJpbGxpbmdNb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIHZhciBpbml0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBnYXRoZXJlZCA9IGdhdGhlckRhdGEoKTtcbiAgfSkoKTtcblxuICByZXR1cm4ge1xuICAgIGdhdGhlcmVkOiBnYXRoZXJlZCxcbiAgICB1dGlsVVJMOiB1dGlsVVJMLFxuICB9O1xufSkoKTtcbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICd2YXIgdXRpbERhdGFMYXllciA9IChmdW5jdGlvbiAoZGF0YSkge1xuICB2YXIgZGlnaXRhbERhdGEgPSB7fTtcblxuICB2YXIgZ2V0UHJvcGVydHkgPSBmdW5jdGlvbiAocCkge1xuICAgIHZhciB2YWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICB2YWx1ZSA9IGRhdGFbcF0gfHwgXCdcJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YWx1ZSA9IFwnXCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHZhciBoYXNVdG0gPSBmdW5jdGlvbiAodXRtKSB7XG4gICAgdmFyIGhhc1V0bSA9IHV0bS5jYW1wYWlnbiArIHV0bS5jaGFubmVsICsgdXRtLmNvbnRlbnQgKyB1dG0ubWVkaXVtICsgdXRtLnNvdXJjZSAhPT0gXCdcJztcblxuICAgIHJldHVybiBoYXNVdG07XG4gIH07XG5cbiAgdmFyIHNldERpZ2l0YWxEYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYWdlTmFtZSA9IGdldFByb3BlcnR5KFwncGFnZU5hbWVcJyk7XG4gICAgdmFyIHBhZ2VDYXRlZ29yeSA9IGdldFByb3BlcnR5KFwncGFnZUNhdGVnb3J5XCcpO1xuICAgIHZhciBUcmFja0lEID0gZ2V0UHJvcGVydHkoXCd0cmFja0lEXCcpO1xuICAgIHZhciBwc2VhcmNoSUQgPSBnZXRQcm9wZXJ0eShcJ3BzZWFyY2hJRFwnKTtcbiAgICB2YXIgZGVzdGluYXRpb25VUkwgPSBnZXRQcm9wZXJ0eShcJ2Rlc3RpbmF0aW9uVVJMXCcpO1xuICAgIHZhciByZWZlcnJpbmdVUkwgPSBnZXRQcm9wZXJ0eShcJ3JlZmVycmluZ1VSTFwnKTtcbiAgICB2YXIgcmVmZXJyaW5nRG9tYWluID0gZ2V0UHJvcGVydHkoXCdyZWZlcnJpbmdEb21haW5cJyk7XG4gICAgdmFyIHJlZmVycmluZ0NoYW5uZWwgPSBnZXRQcm9wZXJ0eShcJ3JlZmVycmluZ0NoYW5uZWxcJyk7XG4gICAgdmFyIGRlbWFuZEdlbmVyYXRpb24gPSBnZXRQcm9wZXJ0eShcJ0RHSURcJyk7XG4gICAgdmFyIHV0bSA9IGdldFByb3BlcnR5KFwndXRtXCcpO1xuICAgIHZhciB0YXJnZXRlciA9IGdldFByb3BlcnR5KFwndGFyZ2V0ZXJcJyk7XG4gICAgdmFyIGRldmljZSA9IGdldFByb3BlcnR5KFwnZGV2aWNlXCcpO1xuXG4gICAgZGlnaXRhbERhdGEgPSB7XG4gICAgICBwYWdlOiB7XG4gICAgICAgIHBhZ2VJbmZvOiB7XG4gICAgICAgICAgcGFnZU5hbWU6IHBhZ2VOYW1lLFxuICAgICAgICAgIHBhZ2VDYXRlZ29yeTogcGFnZUNhdGVnb3J5LFxuICAgICAgICAgIGRlc3RpbmF0aW9uVVJMOiBkZXN0aW5hdGlvblVSTCxcbiAgICAgICAgICByZWZlcnJpbmdVUkw6IHJlZmVycmluZ1VSTCxcbiAgICAgICAgICByZWZlcnJpbmdEb21haW46IHJlZmVycmluZ0RvbWFpbixcbiAgICAgICAgICByZWZlcnJpbmdDaGFubmVsOiByZWZlcnJpbmdDaGFubmVsLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHVzZXI6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb2ZpbGU6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgc2VnbWVudDoge30sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gICAgdmFyIHVzZXJQcm9wZXJ0aWVzID0gZGlnaXRhbERhdGEudXNlclswXS5zZWdtZW50O1xuXG4gICAgLy8gT25seSBhZGQgdXNlciBwcm9wZXJ0aWVzIHRoYXQgZXhpc3QuXG4gICAgaWYgKGRlbWFuZEdlbmVyYXRpb24ua2V5ICE9PSBcJ1wnKSB1c2VyUHJvcGVydGllcy5kZW1hbmRHZW5lcmF0aW9uID0gZGVtYW5kR2VuZXJhdGlvbjtcbiAgICBpZiAoaGFzVXRtKHV0bSkpIHVzZXJQcm9wZXJ0aWVzLnV0bSA9IHV0bTtcbiAgICBpZiAoVHJhY2tJRCAhPT0gXCdcJykgdXNlclByb3BlcnRpZXMuVHJhY2tJRCA9IFRyYWNrSUQ7XG4gICAgaWYgKHBzZWFyY2hJRCAhPT0gXCdcJykgdXNlclByb3BlcnRpZXMucHNlYXJjaElEID0gcHNlYXJjaElEO1xuICAgIGlmICh0YXJnZXRlciAhPT0gXCdcJykgdXNlclByb3BlcnRpZXMudGFyZ2V0ZXIgPSB0YXJnZXRlcjtcbiAgfTtcblxuICB2YXIgaW5pdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgc2V0RGlnaXRhbERhdGEoKTtcbiAgfSkoKTtcblxuICByZXR1cm4ge1xuICAgIGRpZ2l0YWxEYXRhOiBkaWdpdGFsRGF0YSxcbiAgfTtcbn0pKHdlYmV4LnV0aWwuZGF0YS5nYXRoZXJlZCk7XG5cbnZhciBkaWdpdGFsRGF0YSA9IHV0aWxEYXRhTGF5ZXIuZGlnaXRhbERhdGE7XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnKGZ1bmN0aW9uIChkYXRhKSB7XG4gIHZhciBnZXRER0tleSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRhLkRHSUQua2V5IHx8IFwnXCc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdmFsdWUgPSBcJ1wnO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICB2YXIgZ2V0RGV2aWNlUHJvcGVydHkgPSBmdW5jdGlvbiAocCwgc3ViX3ApIHtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRhLmRldmljZVtwXVtzdWJfcF0gfHwgXCdcJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YWx1ZSA9IFwnXCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHZhciBnZXRER1Byb3BlcnR5ID0gZnVuY3Rpb24gKHApIHtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRhLkRHSUQuZGVjb2RlZFtwXSB8fCBcJ1wnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhbHVlID0gXCdcJztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIGdldFBtbHBQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gZGF0YS5wbWxwW3BdIHx8IFwnXCc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdmFsdWUgPSBcJ1wnO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICB2YXIgZ2V0VGFyZ2V0ZXJQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwKSB7XG4gICAgdmFyIHZhbHVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gZGF0YS50YXJnZXRlcltwXSB8fCBcJ1wnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhbHVlID0gXCdcJztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIGdldFV0bVByb3BlcnR5ID0gZnVuY3Rpb24gKHApIHtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRhLnV0bVtwXSB8fCBcJ1wnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHZhbHVlID0gXCdcJztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgdmFyIGdldFByb3BlcnR5ID0gZnVuY3Rpb24gKHApIHtcbiAgICB2YXIgdmFsdWU7XG5cbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRhW3BdIHx8IFwnXCc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdmFsdWUgPSBcJ1wnO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICB2YXIgc2V0VGFyZ2V0ZXJQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSwgdXNlclByb3BlcnRpZXMpIHtcbiAgICAvLyBJZiBcJ3Byb3BlcnR5XCcgZXhpc3RzIGluIHRhcmdldGVyLCBhZGQgaXQgdG8gXCd1c2VyUHJvcGVydGllc1wnLlxuICAgIHZhciB2YWx1ZSA9IGdldFRhcmdldGVyUHJvcGVydHkocHJvcGVydHkpO1xuXG4gICAgaWYgKHZhbHVlICE9PSBcJ1wnKSB1c2VyUHJvcGVydGllc1tcJ3RhcmdldGVyLlwnICsgcHJvcGVydHldID0gdmFsdWU7XG5cbiAgICByZXR1cm4gdXNlclByb3BlcnRpZXM7XG4gIH07XG5cbiAgdmFyIHNlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHVzZXJQcm9wZXJ0aWVzID0ge307XG4gICAgdmFyIGV2ZW50TmFtZTtcbiAgICB2YXIgcHJlZml4ID0gL15oYXJkd2FyZVxcLndlYmV4XFwuY29tJC9pLnRlc3QoZG9jdW1lbnQuZG9tYWluKSA/IFwnd3hfaGFyZHdhcmVfcGFnZXZpZXdlZF9cJyA6IFwnd3hfcGFnZXZpZXdlZF9cJztcbiAgICB2YXIgcGFnZVZpZXdFdmVudFByb3BlcnRpZXMgPSBnZXRQcm9wZXJ0eShcJ3BhZ2VWaWV3ZWRFdmVudFByb3BlcnRpZXNcJyk7XG4gICAgdmFyIHBhZ2VOYW1lID0gZ2V0UHJvcGVydHkoXCdwYWdlTmFtZVwnKTtcbiAgICB2YXIgcGFnZUNhdGVnb3J5ID0gZ2V0UHJvcGVydHkoXCdwYWdlQ2F0ZWdvcnlcJyk7XG4gICAgdmFyIFRyYWNrSUQgPSBnZXRQcm9wZXJ0eShcJ3RyYWNrSURcJyk7XG4gICAgdmFyIHBzZWFyY2hJRCA9IGdldFByb3BlcnR5KFwncHNlYXJjaElEXCcpO1xuICAgIHZhciByZWZlcnJpbmdVUkwgPSBnZXRQcm9wZXJ0eShcJ3JlZmVycmluZ1VSTFwnKTtcbiAgICB2YXIgcmVmZXJyaW5nRG9tYWluID0gZ2V0UHJvcGVydHkoXCdyZWZlcnJpbmdEb21haW5cJyk7XG4gICAgdmFyIHJlZmVycmluZ0NoYW5uZWwgPSBnZXRQcm9wZXJ0eShcJ3JlZmVycmluZ0NoYW5uZWxcJyk7XG4gICAgdmFyIHV0bUNoYW5uZWwgPSBnZXRVdG1Qcm9wZXJ0eShcJ2NoYW5uZWxcJyk7XG4gICAgdmFyIHBtbHBCaWxsaW5nTW9kZSA9IGdldFBtbHBQcm9wZXJ0eShcJ2JpbGxpbmdNb2RlXCcpO1xuICAgIHZhciBwbWxwVXNlclR5cGUgPSBnZXRQbWxwUHJvcGVydHkoXCd1c2VyVHlwZVwnKTtcbiAgICAvLyBWYXJpb3VzIHBhZ2VzIHVzZWQgaW4gZnVubmVscyBhbHJlYWR5IGhhdmUgYSBwYWdlIHZpZXdlZCBldmVudC5cbiAgICAvLyBXZSB3aWxsIG5vdCBzZW5kIGEgcGFnZSB2aWV3IGV2ZW50IGZvciB0aGVzZS5cbiAgICB2YXIgdXJsc1dpdGhPdGhlclBhZ2VWaWV3RXZlbnRzID0gL3d3d1xcLndlYmV4XFwuY29tXFwvcHJpY2luZ1xcL2J1eVxcLy9pO1xuICAgIHZhciBzZW5kUHNlYXJjaElkID0gcHNlYXJjaElEICE9PSBcJ1wnO1xuICAgIHZhciBzZW5kUmVmZXJyaW5nQ2hhbm5lbCA9IHJlZmVycmluZ0NoYW5uZWwgIT09IFwnXCcgJiYgcmVmZXJyaW5nQ2hhbm5lbCAhPT0gXCdub25lXCc7XG4gICAgdmFyIHNlbmRVdG1DaGFubmVsID0gdXRtQ2hhbm5lbCAhPT0gXCdcJztcbiAgICB2YXIgaWRlbnRpZnlBbXA7XG5cbiAgICAvLyBNYWtlIHN1cmUgQW1wbGl0dWRlIGlzIGxvYWRlZC4gRXhjbHVkZSBsaWdodGJveGVzLlxuICAgIGlmICh0eXBlb2YgYW1wbGl0dWRlICE9PSBcJ3VuZGVmaW5lZFwnICYmIGRvY3VtZW50LlVSTC5pbmRleE9mKFwnL2xieC9cJykgPCAwKSB7XG4gICAgICBpZGVudGlmeUFtcCA9IG5ldyBhbXBsaXR1ZGUuSWRlbnRpZnkoKTtcblxuICAgICAgdXNlclByb3BlcnRpZXMuc2NyZWVuX2hlaWdodCA9IGdldERldmljZVByb3BlcnR5KFwnc2NyZWVuXCcsIFwnaGVpZ2h0XCcpO1xuICAgICAgdXNlclByb3BlcnRpZXMuc2NyZWVuX3dpZHRoID0gZ2V0RGV2aWNlUHJvcGVydHkoXCdzY3JlZW5cJywgXCd3aWR0aFwnKTtcbiAgICAgIHVzZXJQcm9wZXJ0aWVzLnNjcmVlbl9oZWlnaHRfYnVja2V0ZWQgPSBnZXREZXZpY2VQcm9wZXJ0eShcJ3NjcmVlblwnLCBcJ2hlaWdodF9idWNrZXRlZFwnKTtcbiAgICAgIHVzZXJQcm9wZXJ0aWVzLnNjcmVlbl93aWR0aF9idWNrZXRlZCA9IGdldERldmljZVByb3BlcnR5KFwnc2NyZWVuXCcsIFwnd2lkdGhfYnVja2V0ZWRcJyk7XG4gICAgICB1c2VyUHJvcGVydGllcy52aWV3cG9ydF9oZWlnaHQgPSBnZXREZXZpY2VQcm9wZXJ0eShcJ3ZpZXdwb3J0XCcsIFwnaGVpZ2h0XCcpO1xuICAgICAgdXNlclByb3BlcnRpZXMudmlld3BvcnRfd2lkdGggPSBnZXREZXZpY2VQcm9wZXJ0eShcJ3ZpZXdwb3J0XCcsIFwnd2lkdGhcJyk7XG4gICAgICB1c2VyUHJvcGVydGllcy52aWV3cG9ydF9oZWlnaHRfYnVja2V0ZWQgPSBnZXREZXZpY2VQcm9wZXJ0eShcJ3ZpZXdwb3J0XCcsIFwnaGVpZ2h0X2J1Y2tldGVkXCcpO1xuICAgICAgdXNlclByb3BlcnRpZXMudmlld3BvcnRfd2lkdGhfYnVja2V0ZWQgPSBnZXREZXZpY2VQcm9wZXJ0eShcJ3ZpZXdwb3J0XCcsIFwnd2lkdGhfYnVja2V0ZWRcJyk7XG5cbiAgICAgIC8vIElmIG5vdCBhIFBNTFAsIGNsZWFyIFBNTFAgdXNlciBwcm9wZXJ0aWVzLlxuICAgICAgaWYgKHBtbHBCaWxsaW5nTW9kZSA9PT0gXCdcJykge1xuICAgICAgICBpZGVudGlmeUFtcC51bnNldChcJ3BtbHBfYmlsbGluZ19tb2RlXCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXNlclByb3BlcnRpZXMucG1scF9iaWxsaW5nX21vZGUgPSBwbWxwQmlsbGluZ01vZGU7XG4gICAgICB9XG4gICAgICBpZiAocG1scFVzZXJUeXBlID09PSBcJ1wnKSB7XG4gICAgICAgIGlkZW50aWZ5QW1wLnVuc2V0KFwncG1scF91c2VyX3R5cGVcJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1c2VyUHJvcGVydGllcy5wbWxwX3VzZXJfdHlwZSA9IHBtbHBVc2VyVHlwZTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgYWRkIHVzZXIgcHJvcGVydGllcyB0aGF0IGV4aXN0LlxuICAgICAgaWYgKGdldFByb3BlcnR5KFwnaXNQYWlkVHJhZmZpY1wnKSkge1xuICAgICAgICB1c2VyUHJvcGVydGllcy5ER0lEID0gZ2V0REdLZXkoKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMuZGdfZnVuY3Rpb24gPSBnZXRER1Byb3BlcnR5KFwnZGdfZnVuY3Rpb25cJyk7XG4gICAgICAgIHVzZXJQcm9wZXJ0aWVzLmRnX2NoYW5uZWwgPSBnZXRER1Byb3BlcnR5KFwnZGdfY2hhbm5lbFwnKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMuZGdfcGxhY2VtZW50ID0gZ2V0REdQcm9wZXJ0eShcJ2RnX3BsYWNlbWVudFwnKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMuZGdfY291bnRyeSA9IGdldERHUHJvcGVydHkoXCdkZ19jb3VudHJ5XCcpO1xuICAgICAgICB1c2VyUHJvcGVydGllcy5kZ19jaGFubmVsX3RhY3RpYyA9IGdldERHUHJvcGVydHkoXCdkZ19jaGFubmVsX3RhY3RpY1wnKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMuZGdfcGVyc29uYSA9IGdldERHUHJvcGVydHkoXCdkZ19wZXJzb25hXCcpO1xuICAgICAgICB1c2VyUHJvcGVydGllcy5kZ19nb2FsID0gZ2V0REdQcm9wZXJ0eShcJ2RnX2dvYWxcJyk7XG4gICAgICAgIHVzZXJQcm9wZXJ0aWVzLmRnX3Byb2R1Y3QgPSBnZXRER1Byb3BlcnR5KFwnZGdfcHJvZHVjdFwnKTtcbiAgICAgIH1cbiAgICAgIGlmIChUcmFja0lEICE9PSBcJ1wnKSB1c2VyUHJvcGVydGllcy5UcmFja0lEID0gVHJhY2tJRDtcbiAgICAgIC8vIEFtcGxpdHVkZVwncyByZWZlcnJpbmcgVVJMIGNhbiBpbmNsdWRlIFBJSS4gT3VycyBkb2VzIG5vdC4gVXNlIG91cnMuXG4gICAgICBpZiAocmVmZXJyaW5nVVJMICE9PSBcJ1wnKSB1c2VyUHJvcGVydGllcy5yZWZlcnJlciA9IHJlZmVycmluZ1VSTDtcbiAgICAgIC8vIFVzZSBBbXBsaXR1ZGVcJ3MgcmVmZXJyaW5nIGRvbWFpbi5cbiAgICAgIC8vIGlmIChyZWZlcnJpbmdEb21haW4gIT09IFwnXCcpIHVzZXJQcm9wZXJ0aWVzLnJlZmVycmluZ19kb21haW4gPSByZWZlcnJpbmdEb21haW47XG5cbiAgICAgIGlmIChzZW5kUHNlYXJjaElkIHx8IHNlbmRSZWZlcnJpbmdDaGFubmVsIHx8IHNlbmRVdG1DaGFubmVsKSB7XG4gICAgICAgIC8vIFNldCB0aGUgaW5pdGlhbCBhbmQgbGFzdC10b3VjaCB2YWx1ZXMgZm9yIGVhY2ggb2YgdGhlc2UgdXNlciBwcm9wZXJ0aWVzLlxuICAgICAgICBpZiAoc2VuZFBzZWFyY2hJZCkge1xuICAgICAgICAgIGlkZW50aWZ5QW1wLnNldE9uY2UoXCdpbml0aWFsX3BzZWFyY2hJRFwnLCBwc2VhcmNoSUQpO1xuICAgICAgICAgIHVzZXJQcm9wZXJ0aWVzLnBzZWFyY2hJRCA9IHBzZWFyY2hJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VuZFJlZmVycmluZ0NoYW5uZWwpIHtcbiAgICAgICAgICBpZGVudGlmeUFtcC5zZXRPbmNlKFwnaW5pdGlhbF9yZWZlcnJpbmdfY2hhbm5lbFwnLCByZWZlcnJpbmdDaGFubmVsKTtcbiAgICAgICAgICB1c2VyUHJvcGVydGllcy5yZWZlcnJpbmdfY2hhbm5lbCA9IHJlZmVycmluZ0NoYW5uZWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbmRVdG1DaGFubmVsKSB7XG4gICAgICAgICAgaWRlbnRpZnlBbXAuc2V0T25jZShcJ2luaXRpYWxfdXRtX2NoYW5uZWxcJywgdXRtQ2hhbm5lbCk7XG4gICAgICAgICAgdXNlclByb3BlcnRpZXMudXRtX2NoYW5uZWwgPSB1dG1DaGFubmVsO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ha2UgYSBzaW5nbGUsIGNvbWJpbmVkIC5pZGVudGlmeSgpIGNhbGwuXG4gICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmlkZW50aWZ5KGlkZW50aWZ5QW1wKTtcbiAgICAgICAgLy8gZGVidWdnZXI7XG5cbiAgICAgICAgdXNlclByb3BlcnRpZXMgPSBzZXRUYXJnZXRlclByb3BlcnR5KFwnZG9tYWluXCcsIHVzZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMgPSBzZXRUYXJnZXRlclByb3BlcnR5KFwnY29tcGFueV9uYW1lXCcsIHVzZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMgPSBzZXRUYXJnZXRlclByb3BlcnR5KFwnY29tcGFueV9zaXplXCcsIHVzZXJQcm9wZXJ0aWVzKTtcbiAgICAgICAgdXNlclByb3BlcnRpZXMgPSBzZXRUYXJnZXRlclByb3BlcnR5KFwnaW5kdXN0cnlfY2F0ZWdvcnlcJywgdXNlclByb3BlcnRpZXMpO1xuICAgICAgICB1c2VyUHJvcGVydGllcyA9IHNldFRhcmdldGVyUHJvcGVydHkoXCdpbmR1c3RyeV9zdWJfY2F0ZWdvcnlcJywgdXNlclByb3BlcnRpZXMpO1xuICAgICAgICB1c2VyUHJvcGVydGllcyA9IHNldFRhcmdldGVyUHJvcGVydHkoXCdzZWdtZW50XCcsIHVzZXJQcm9wZXJ0aWVzKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCB0aGUgdXNlciBwcm9wZXJ0aWVzIHRvIEFtcGxpdHVkZS5cbiAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLnNldFVzZXJQcm9wZXJ0aWVzKHVzZXJQcm9wZXJ0aWVzKTtcblxuICAgICAgaWYgKCF1cmxzV2l0aE90aGVyUGFnZVZpZXdFdmVudHMudGVzdChkb2N1bWVudC5VUkwpKSB7XG4gICAgICAgIC8vIFNlbmQgYSBwYWdlIHZpZXdlZCBldmVudC5cbiAgICAgICAgLy8gTm8gbmVlZCB0byBleGNsdWRlIGNhcnQud2ViZXguY29tIHBhZ2VzIGhlcmUuIFRoZSBkb21haW5zIGNvbmRpdGlvbiBmb3IgdGhpcyBydWxlIGFscmVhZHkgZXhjbHVkZXMgdGhlbS5cbiAgICAgICAgZXZlbnROYW1lID0gL2ZyZWVfdG9fcGFpZC9pLnRlc3QoZG9jdW1lbnQuVVJMKVxuICAgICAgICAgID8gXCdNQ09ubGluZV9DT19wcmljaW5nIHBhZ2UgdXBncmFkZSB2aWV3ZWRcJ1xuICAgICAgICAgIDogcGFnZUNhdGVnb3J5ICE9PSBcJ1wnXG4gICAgICAgICAgPyBwcmVmaXggKyBwYWdlQ2F0ZWdvcnlcbiAgICAgICAgICA6IHByZWZpeCArIHBhZ2VOYW1lO1xuICAgICAgICBhbXBsaXR1ZGUuZ2V0SW5zdGFuY2UoKS5sb2dFdmVudChldmVudE5hbWUsIHBhZ2VWaWV3RXZlbnRQcm9wZXJ0aWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdmFyIGluaXQgPSAoZnVuY3Rpb24gKCkge1xuICAgIHNlbmQoKTtcbiAgfSkoKTtcbn0pKHdlYmV4LnV0aWwuZGF0YS5nYXRoZXJlZCk7XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZmYzYTMyMTQwMzllNDhmMmI0MTJhNzE0YTViY2Q0NDcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdob21lcGFnZSB8IHNpZ24gdXAgZm9ybScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xudHJ5IHtcbi8qd2luZG93LmNoRW1WYWxTdHI9L15bQS1aMC05Ll8lKy1dK0AoW0EtWjAtOS1dK1xcLikrW0EtWl17Miw0fSQvaTt3aW5kb3cuY2hFbVZhbD0vXltBLVowLTkuXyUrLV0vaTtmdW5jdGlvbiBleHNjTG5jaFN0cigpe0xuVHJrRXZlbnQodGhpcywiZXZlbnQxODEiLCJzZWN0aW9uOmhlcm8tYmFubmVyOmJ1dHRvbjoiLCJzdGFydCBmb3IgZnJlZSIpfWZ1bmN0aW9uIGV4c2NMbmNoKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6YnV0dG9uOmNsaWNrZWQ6Iiwic3RhcnQgZm9yIGZyZWUiKX12YXIgZ3RFbVZhbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1haWwiKSxydW5JZW5mZT0hMCxydW5JZW5mZVN0cj0hMDtndEVtVmFsLm9uZm9jdXM9ZnVuY3Rpb24oKXtydW5JZW5mZVN0ciYmKGV4c2NMbmNoU3RyKCkscnVuSWVuZmVTdHI9ITEpfTtcbmd0RW1WYWwub25jbGljaz1mdW5jdGlvbigpe3J1bkllbmZlU3RyJiYoZXhzY0xuY2hTdHIoKSxydW5JZW5mZVN0cj0hMSl9O2d0RW1WYWwub25wYXN0ZT1mdW5jdGlvbigpe3J1bkllbmZlU3RyJiYoZXhzY0xuY2hTdHIoKSxydW5JZW5mZVN0cj0hMSl9O1xud2luZG93LmNoRW1WYWw9L15bQS1aMC05Ll8lKy1dK0AoW0EtWjAtOS1dK1xcLikrW0EtWl17Miw0fSQvaTtcbnZhciBydW5JZW5mZTI9dHJ1ZTtcbiovXG4kKFwnLmhlcm8tY29udGVudCAuaGVyby1jdGExXCcpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6YnV0dG9uOiIsInNlZSBwcmljaW5nIil9KVxuICAkKFwnLmhlcm8tY29udGVudCAuaGVyby1jdGEyXCcpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6YnV0dG9uOiIsInN0YXJ0IGZvciBmcmVlIil9KVxuXG4vL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzaWdudXBCdXR0b24iKS5vbmNsaWNrPWZ1bmN0aW9uKCl7Y2hFbVZhbC50ZXN0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbWFpbCIpLnZhbHVlKSYmKHJ1bkllbmZlJiYoTG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6YnV0dG9uOiIsInN0YXJ0IGZvciBmcmVlOmNsayIpLHJ1bkllbmZlMj0hMSkpfTtcdFxufSBjYXRjaCAoZSkge31cbn0sIDIwMDApO1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZjQ0MmRjZGM0MTQxNDMwNGJiOTMzZWVjMzQyM2Q5YzAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdQTCAtIEFFTSB1bmlmaWVkIC0gY2hhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ153d3dcXC53ZWJleFxcLmNvbSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLyhkZXxlc3xmcnxpdHxqYXxrb3xwdHx6aCkpP1xcLygoY29udGFjdC1zYWxlc3xjb250YWN0LXNhbGVzXFwvY29udGFjdC1zYWxlcy10aGFua3lvdXxjb250YWN0LXNhbGVzLWludGx8Y29udGFjdC1zYWxlcy1pbnRsXFwvY29udGFjdC1zYWxlcy10aGFua3lvdXxkb3dubG9hZHN8ZmFxc3xpbmRleHxwcmljaW5nXFwvaW5kZXh8cHJpY2luZ1xcL3VuaWZpZWQtaW5kZXgtMDgxMjIwMjAxfHJlbW90ZS1zdXBwb3J0fHRlYW0tY29sbGFib3JhdGlvbnx0cmFpbmluZy1vbmxpbmV8dW5pZmllZC1ob21lcGFnZS0wODEyMjAyMDF8dmlkZW8tY29uZmVyZW5jZS1lcXVpcG1lbnR8d2ViaW5hcilcXC5odG1sfHZpZGVvLWNvbmZlcmVuY2luZyk/JCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdjaGF0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJzAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLSBjaGF0IGJlZ2luIC0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii9jb250ZW50L2RhbS93ZWJleC9lb3BpL2xpYi9MaXZlQWdlbnQvYnV0dG9uLmNzcyIgLz5cbjxzY3JpcHQ+XG4gIHZhciB4aHI7XG4gIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAvLyBNb3ppbGxhLCBTYWZhcmkuLi5cbiAgICB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgfSBlbHNlIGlmICh3aW5kb3cuQWN0aXZlWE9iamVjdCkge1xuICAgIC8vIElFXG4gICAgeGhyID0gbmV3IEFjdGl2ZVhPYmplY3QoXCdNc3htbDIuWE1MSFRUUFwnKTtcbiAgfVxuICB4aHIub3BlbihcJ2dldFwnLCBcJy9jb250ZW50L2RhbS93ZWJleC9lb3BpL2xpYi9MaXZlQWdlbnQvYnVmZi1ib3Qtd2ViZXgtMDIwLWQuanNcJywgdHJ1ZSk7XG4gIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCkge1xuICAgICAgaWYgKCh4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwMCkgfHwgeGhyLnN0YXR1cyA9PSAzMDQpIHtcbiAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCdzY3JpcHRcJyk7XG4gICAgICAgIHNjcmlwdC50eXBlID0gXCd0ZXh0L2phdmFzY3JpcHRcJztcbiAgICAgICAgc2NyaXB0LnRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICB4aHIuc2VuZChudWxsKTtcbjwvc2NyaXB0PlxuXG48ZGl2IGNsYXNzPSJjMmMtY29tcG9uZW50Ij5cbiAgPGRpdiBjbGFzcz0iYzJjLWFjdGl2ZSIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPlxuICAgIDxhXG4gICAgICBjbGFzcz0iYzJjLWJ1dHRvbiJcbiAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtZ3JvdXA9InNtX2x1aCJcbiAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtdGl0bGU9InJpZ2h0IHJhaWwiXG4gICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLWl0ZW09IkNoYXQgTm93IlxuICAgICAgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyJcbiAgICA+XG4gICAgICA8aW1nXG4gICAgICAgIHNyYz0iaHR0cHM6Ly93d3cud2ViZXguY29tL2NvbnRlbnQvZGFtL3dlYmV4L2VvcGkvQW1lcmljYXMvVVNBL2VuX3VzL2dsb2JhbC9pbWFnZXMvY2hhdC9jaGF0LWJ1dHRvbi02MC0xLnBuZyJcbiAgICAgICAgYWx0PSIiXG4gICAgICAgIGNsYXNzPSJjaGF0LWljb24iXG4gICAgICAvPlxuICAgIDwvYT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9ImMyYy1pbmFjdGl2ZSI+XG4gICAgPCEtLSBubyBjaGF0IGF2YWlsYWJsZSAtLT5cbiAgPC9kaXY+XG5cbiAgPCEtLSBETTpjb21wb25lbnRzL2xldHVzaGVscC9sZXR1c2hlbHAtZW90OlYyLjcuMyAtLT5cblxuICA8ZGl2IGNsYXNzPSJkbWMtcHJvYWN0aXZlY2hhdCBkbXIgYzJjLXByb2FjdGl2ZS1tb2RhbCAiPlxuICAgIDxkaXYgY2xhc3M9InByb2FjLWhlYWQiPlxuICAgICAgPGRpdiBjbGFzcz0iY2lzY28tbG9nbyI+XG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3d3dy5jaXNjby5jb20vZXRjL2Rlc2lnbnMvY2RjL2RtL2NoYXQvY2lzY28tbG9nby5zdmciIGFsdD0iIiB0aXRsZT0iIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPSJwcm9hYy1jb250ZW50Ij5cbiAgICAgICAgPHA+Q2hhdCBsaXZlIHdpdGggYSBDaXNjbyByZXByZXNlbnRhdGl2ZTwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0iY2lzY28taWNvbiI+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9ImMyYy1wcm9hY3RpdmUtZGlzbWlzcyJcbiAgICAgICAgICBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiXG4gICAgICAgICAgYWx0PSJEZWNsaW5lIHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgdGl0bGU9IkRlY2xpbmUgdGhlIGNoYXQgaW52aXRhdGlvbiJcbiAgICAgICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLWl0ZW09ImRlY2xpbmUgdGhlIGNoYXQgaW52aXRhdGlvbiJcbiAgICAgICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLWdyb3VwPSJwb3AgdXAgY2hhdCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3d3dy5jaXNjby5jb20vZXRjL2Rlc2lnbnMvY2RjL2RtL2NoYXQvY2xvc2UtaWNvbi5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPlxuICAgICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSJwcm9hYy1jb250YWluZXIiPlxuICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPkNpc2NvOjwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPldlbGNvbWUgdG8gQ2lzY28hPC9saT5cbiAgICAgICAgPGxpPkhvdyBjYW4gSSBoZWxwIHlvdT88L2xpPlxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cblxuICAgIDx1bCBjbGFzcz0iY3RhIj5cbiAgICAgIDxsaT5cbiAgICAgICAgPGFcbiAgICAgICAgICBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IlxuICAgICAgICAgIGFsdD0iRGVjbGluZSB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIHRpdGxlPSJEZWNsaW5lIHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgZGF0YS1jb25maWctbWV0cmljcy1pdGVtPSJkZWNsaW5lIHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgZGF0YS1jb25maWctbWV0cmljcy1ncm91cD0icG9wIHVwIGNoYXQiXG4gICAgICAgICAgY2xhc3M9ImRtYy1idXR0b24gYXRsYW50aWMgcGFsLTYgYzJjLXByb2FjdGl2ZS1kaXNtaXNzIlxuICAgICAgICAgID5ObyBUaGFua3M8L2FcbiAgICAgICAgPlxuICAgICAgPC9saT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGFcbiAgICAgICAgICBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IlxuICAgICAgICAgIGFsdD0iQWNjZXB0IHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgdGl0bGU9IkFjY2VwdCB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtaXRlbT0iYWNjZXB0IHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgZGF0YS1jb25maWctbWV0cmljcy1ncm91cD0icG9wIHVwIGNoYXQiXG4gICAgICAgICAgY2xhc3M9ImRtYy1idXR0b24gYXRsYW50aWMgcGFsLTQgYzJjLXByb2FjdGl2ZS1hZ3JlZSJcbiAgICAgICAgICA+Q2hhdCBOb3c8L2FcbiAgICAgICAgPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0gY2hhdCBlbmQgLS0+XG48IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDZkZjNmMTRlOTFhMjQzMDA4YWY4OTFlOWY4YzZmNDgwJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnUEwgLSBBRU0gUHJvZCAtIHd4MTEtbWlncmF0aW9uL21lZXRpbmdzLXVwZ3JhZGUtIHBhZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogMTMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXFwvd3gxMS1taWdyYXRpb25cXC9tZWV0aW5ncy11cGdyYWRlLWlzLW9uLXRoZS13YXlcXC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXFwvd3gxMS1taWdyYXRpb25cXC9tZWV0aW5ncy11cGdyYWRlLWhhcy1hcnJpdmVkXFwuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICchZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUpe3ZhciByO3RyeXtyPUFFTV9kYXRhX2xheWVyLmRpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm9bZV18fCIifWNhdGNoKGUpe3I9IiJ9cmV0dXJuIHJ9IWZ1bmN0aW9uKCl7dmFyIGU9e3BhZ2VfdXJsOnIoImRlc3RpbmF0aW9uVVJMIikscmVmZXJyZXI6cigicmVmZXJyaW5nVVJMIikscmVmZXJyaW5nX2RvbWFpbjpyKCJyZWZlcnJpbmdEb21haW4iKX07dHJ5e2FtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCJ3eDExLW1pZ3JhdGlvbiBwYWdlIHZpZXdlZCIsZSl9Y2F0Y2goZSl7fX0oKX0oKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclUmVmZXJyZXI6IGZ1bGwgVVJMJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICd3eDExLW1pZ3JhdGlvbi1yZWZlcnJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw0YTY5YmViYmRiOTM0NmRiYTc2MTllMzZiNzI1ZjFhNScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ05hdmlnYXRpb24gY2xpY2tzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3XFwud2ViZXhcXC5jbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaWYodHlwZW9mICQhPT1cJ3VuZGVmaW5lZFwnKXtcbnRyeXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JCgiI3dieC1oZWFkZXIgLndieC1oZWFkZXItcHJvZHVjdHMgYS53YngtaGVhZGVyLXBvcHVwLXRvZ2dsZSwud2J4LWhlYWRlci1tZW51LWxpc3QtaXRlbS53YngtaGVhZGVyLWRldmljZXMsI3dieC1oZWFkZXIgLndieC1oZWFkZXItcmVzb3VyY2VzIGEud2J4LWhlYWRlci1wb3B1cC10b2dnbGUsI3dieC1oZWFkZXIgLndieC1oZWFkZXItbWVudS1wbGFucyBhLCN3YngtaGVhZGVyIC53YngtaGVhZGVyLWhlbHAtY2VudGVyIGEsI3dieC1oZWFkZXIgLndieC1oZWFkZXItam9pbiBhLCN3YngtaGVhZGVyIC53YngtaGVhZGVyLXNpZ25pbiBhLlNFT1ByZXZlbnREZWZhdWx0IikuY2xpY2soZnVuY3Rpb24oKXt2YXIgYT0kKHRoaXMpLGI9YS5hdHRyKCJhcmlhLWV4cGFuZGVkIik7YT1hLnRleHQoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsidHJ1ZSIhPT1iJiZDbGlja0xuVHJrTnYodGhpcywiZXZlbnQxNzgsZXZlbnQxODEiLCJoZWFkZXI6bmF2OiIsYSl9KTskKCIjd2J4LWhlYWRlciAud2J4LWhlYWRlci1yZWdpb24gYS53YngtaGVhZGVyLXBvcHVwLXRvZ2dsZSIpLmNsaWNrKGZ1bmN0aW9uKCl7InRydWUiIT09XG4kKHRoaXMpLmF0dHIoImFyaWEtZXhwYW5kZWQiKSYmQ2xpY2tMblRya052KHRoaXMsImV2ZW50MTc4LGV2ZW50MTgxIiwiaGVhZGVyOm5hdjoiLCJjb3VudHJ5IHNlbGVjdG9yIil9KTsgJCgiI3dieC1oZWFkZXIgLndieC1oZWFkZXItcG9wdXAtbGlzdCAud2J4LWhlYWRlci1wb3B1cC1saXN0LWl0ZW0gYS53YngtaGVhZGVyLXByb2R1Y3QtZXllYnJvdyIpLmNsaWNrKGZ1bmN0aW9uKCl7dmFyIGE9JCh0aGlzKSxiPWEucGFyZW50cygiLndieC1oZWFkZXItcG9wdXAtbWVudSIpLmNoaWxkcmVuKCJhOmZpcnN0IikudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO2E9YS50ZXh0KCkudG9Mb3dlckNhc2UoKS50cmltKCk7InVuZGVmaW5lZCIhPT1iJiYidW5kZWZpbmVkIiE9PWEmJkNsaWNrTG5UcmtOdih0aGlzLCJldmVudDE3OCxldmVudDE4MSIsImhlYWRlcjpuYXY6IitiKyI6IixhKX0pOyQoIiN3YngtaGVhZGVyIC53YngtaGVhZGVyLXJlZ2lvbiAud2J4LWhlYWRlci1wb3B1cCAucmVnaW9uLXNlbGVjdC1saXN0IC5yZWdpb24taXRlbSBhIikuY2xpY2soZnVuY3Rpb24oKXt2YXIgYT1cbiQodGhpcykudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpOyJ1bmRlZmluZWQiIT09YSYmQ2xpY2tMblRya052KHRoaXMsImV2ZW50MTc4LGV2ZW50MTgxIiwiaGVhZGVyOm5hdjpjb3VudHJ5IHNlbGVjdG9yOiIsYSl9KTskKCIjd2J4LWhlYWRlciAud2J4LWhlYWRlci1zaWduaW4gLndieC1oZWFkZXItcG9wdXAtbGlzdCAud2J4LWhlYWRlci1wb3B1cC1saXN0LWl0ZW0gYSIpLmNsaWNrKGZ1bmN0aW9uKCl7dmFyIGE9JCh0aGlzKSxiPWEucGFyZW50cygiLndieC1oZWFkZXItcG9wdXAtbWVudSIpLmNoaWxkcmVuKCJhOmZpcnN0IikudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO2E9YS5jaGlsZHJlbigiLndieC1oZWFkZXItcHJvZHVjdC1leWVicm93IikudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpOyJ1bmRlZmluZWQiIT09YiYmInVuZGVmaW5lZCIhPT1hJiYwIT09YS5sZW5ndGgmJkNsaWNrTG5UcmtOdih0aGlzLCJldmVudDE3OCxldmVudDE4MSIsImhlYWRlcjpuYXY6IitiKyI6IixhKX0pXG5pZihkb2N1bWVudC5VUkwuaW5kZXhPZihcJy9mci9cJyk+LTF8fCBkb2N1bWVudC5VUkwuaW5kZXhPZihcJy9kZS9cJyk+LTEpe1xuJCgiI3dieC1oZWFkZXIgLndieC1oZWFkZXItc2lnbmluIC53YngtaGVhZGVyLXBvcHVwLWxpc3QgLndieC1oZWFkZXItcG9wdXAtbGlzdC1pdGVtIGEiKS5jbGljayhmdW5jdGlvbigpe3ZhciBhPSQodGhpcyksYj1hLnBhcmVudHMoIi53YngtaGVhZGVyLXBvcHVwLW1lbnUiKS5jaGlsZHJlbigiYTpmaXJzdCIpLnRleHQoKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTthPWEudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpOyJ1bmRlZmluZWQiIT09YiYmInVuZGVmaW5lZCIhPT1hJiZDbGlja0xuVHJrTnYodGhpcywiZXZlbnQxNzgsZXZlbnQxODEiLCJoZWFkZXI6bmF2OiIrYisiOiIsYSl9KX19LDJFMyk7XG59Y2F0Y2goZSl7fVxufScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDY1MTFkMGNlOWRiNTQ2MWRiMmU2YTYxMGFlOTNjYjg3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnb3JkZXJDb25maXJtUGFnZUJvb2tpbmcgbWJveCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRFIgU2hvcHBpbmcgQ2FydCAtIFBhZ2UgVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdDaGVja291dCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BhcmtfZGF0YS5vcmRlcl9pZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignYnV5LndlYmV4JykgPiAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnPGRpdiBpZD0ib3JkZXJDb25maXJtUGFnZU1ib3hEaXYiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IHZpc2liaWxpdHk6aGlkZGVuOyI+PC9kaXY+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMzJmYmUyYTM2Njk4NDJmNTgyZWRkNGQ5MjdmMzU3MTcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdvcmRlckNvbmZpcm1QYWdlIG1ib3gnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0RSIFNob3BwaW5nIENhcnQgLSBQYWdlIFR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnQ2hlY2tvdXQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJrX2RhdGEub3JkZXJfaWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ2J1eS53ZWJleCcpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJzxkaXYgaWQ9Im9yZGVyQ29uZmlybVBhZ2VNYm94RGl2IiBzdHlsZT0iZGlzcGxheTpub25lOyB2aXNpYmlsaXR5OmhpZGRlbjsiPjwvZGl2PicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDZjMDcxN2U0ZGQyMTQ5ZmE4NzZmYTNlODRmYjc5NzZhJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnU2lnblVwIENvdW50cnkgRHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RhdGFFbGVtZW50Q2hhbmdlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICduYW1lJzogJ0ZUIENvdW50cnknIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdwcmljaW5nXFwvc2lnbnVwLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdkcm9wZG93bjpmb3JtOmNvdW50cnk6JUZUIENvdW50cnklOiVwYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVGVCBDb3VudHJ5JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICclRlQgQ291bnRyeSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMjNlZmQ4ZGYxYmMxNDJjNTk1N2RjZDFlNDdhYWM3ZWInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdPcmlnaW5hbCBUcmFja0lEIENvb2tpZSBDcmVhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZUNydW1iID0gX3NhdGVsbGl0ZS5jb29raWUuZ2V0KCdPcmlnVHJhY2tJRCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvb2tpZUNydW1iID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignVHJhY2tJRD0nKSA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICd2YXIgdXJsVHJhY2tJRCA9IF9zYXRlbGxpdGUuZ2V0VmFyKFwnVHJhY2tJRFwnKTtcbnRyeXtcbiAgX3NhdGVsbGl0ZS5jb29raWUuc2V0KFwnT3JpZ1RyYWNrSURcJywgdXJsVHJhY2tJRCwgeyBleHBpcmVzOiA5MCB9KTtcbi8vX3NhdGVsbGl0ZS5zZXRDb29raWUoIk9yaWdUcmFja0lEIix1cmxUcmFja0lELDkwKTtcbn1jYXRjaChlKXt9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMjUyNTJmZTI3MjdhNDkzYTkyOTQ0OGI4MzQwNTM1MTcnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTeXN0ZW1Eb3duIFBhZ2UgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzeXN0ZW1kb3duLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJvcDI1ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ1N5c3RlbURvd24gRXJyb3IgQ29kZSBWYWx1ZScpICsgJyA6ICcgKyBfc2F0ZWxsaXRlLmdldFZhcignU2lnblVwIEVycm9yIENvb2tpZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJvcDMxID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ1JlZmVycmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50NzEnIH1dIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwxY2NiMjYxZTM2OTI0MTg4YjI5NGNkNDk2MjY4YWM2NScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3pCVC1SdWxlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcL2xieFxcLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAndHJ5e3ZhciBnZXRTaXRlQ2F0YWx5c3RVUkw9d2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShsb2NhdGlvbi5wcm90b2NvbCsiLy8iLCIiKS5zdWJzdHIoMCwyNTApXG5pZihkb2N1bWVudC5VUkwuaW5kZXhPZihcJy9wcmljaW5nL2NhcnQuaHRtbFwnKT4tMSl7Z2V0U2l0ZUNhdGFseXN0VVJMPWdldFNpdGVDYXRhbHlzdFVSTC5zdWJzdHIoMCw1MCl9XG59Y2F0Y2goYil7fVxud2luZG93LkNsaWNrTG5UcmtOdj1mdW5jdGlvbihiLGMsZCxhKXsgcy5hY2NvdW50PSJ3ZWJleGdsb2JhbCx3ZWJleGdsaSI7XG4gIHNfYWNjb3VudD0id2ViZXhnbG9iYWwsd2ViZXhnbGkiO1xuICB2YXIgcz1zX2dpKHNfYWNjb3VudCk7cy5hY2NvdW50PXNfYWNjb3VudDt3aW5kb3cucz1zOyB0cnl7dmFyIGU9YS5sYXN0SW5kZXhPZigiLyIpKzE7cy5wcm9wMTA9cy5wcm9wMTE9IiI7YT1hLnN1YnN0cmluZyhlKTthPWEudG9Mb3dlckNhc2UoKTthPWEucmVwbGFjZSgvXFwvL2csIjoiKS5yZXBsYWNlKCIjIiwiIik7cy5lVmFyNzI9YTtzLnByb3AxMD0iRD12NzIiO2E9ZCthKyI6Iitfc2F0ZWxsaXRlLmdldFZhcihcJ3BfdmxcJyk7cy5lVmFyNDM9YTtzLnByb3AxMT0iRD12NDMiOyJ1bmRlZmluZWQiIT09dHlwZW9mIGdldFNpdGVDYXRhbHlzdFVSTCYmKHMucHJvcDk9Z2V0U2l0ZUNhdGFseXN0VVJMKTtzLmV2ZW50cz1jO3MubGlua1RyYWNrRXZlbnRzPWM7cy5saW5rVHJhY2tWYXJzPSJldmVudHMsZVZhcjQzLGVWYXI3Mixwcm9wOSxwcm9wMTAscHJvcDExIjtzLnRsKGIsIm8iLGEpO3MubGlua1RyYWNrVmFycz0iTm9uZSI7cy5saW5rVHJhY2tFdmVudHM9Ik5vbmUiO3MuZXZlbnRzPVwnXCc7fWNhdGNoKGYpe319O1xud2luZG93LkxuVHJrRXZlbnQ9ZnVuY3Rpb24oYyxiLGQsYSl7dHJ5e3ZhciBlPWEubGFzdEluZGV4T2YoIi8iKSsxO3MucHJvcDEwPXMucHJvcDExPSIiO2E9YS5zdWJzdHJpbmcoZSk7YT1hLnRvTG93ZXJDYXNlKCk7YT1hLnJlcGxhY2UoL1xcLy9nLCI6IikucmVwbGFjZSgiIyIsIiIpO3MuZVZhcjExNz1zLnByb3AxMD1hLnJlcGxhY2UoLzpwbGF5fDpwYXVzZXw6Y29tcGxldGVkfDpjb250aW51ZS10by1wbGF5LyxcJ1wnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBnZXRTaXRlQ2F0YWx5c3RVUkwmJihzLnByb3A5PWdldFNpdGVDYXRhbHlzdFVSTCk7YT1kK2ErIjoiK19zYXRlbGxpdGUuZ2V0VmFyKFwncF92bFwnKTtzLmVWYXI0Mz1hO3MucHJvcDExPSJEPXY0MyI7cy5ldmVudHM9YjtzLmxpbmtUcmFja0V2ZW50cz1iO3MubGlua1RyYWNrVmFycz0iZXZlbnRzLGVWYXI0MyxlVmFyMTE3LHByb3A5LHByb3AxMCxwcm9wMTEiO3MudGwoYywibyIsYSk7cy5saW5rVHJhY2tWYXJzPSJOb25lIjtzLmxpbmtUcmFja0V2ZW50cz0iTm9uZSI7cy5ldmVudHM9XCdcJzt9Y2F0Y2goZil7fX07XG53aW5kb3cuTG5UcmtDcnQ9ZnVuY3Rpb24oYixjLGQsYSxwLGwsaCx1LHEpe3RyeXt2YXIgZT1hLmxhc3RJbmRleE9mKCIvIikrMTtzLnByb3AxMD1zLnByb3AxMT0iIjthPWEuc3Vic3RyaW5nKGUpO2E9YS50b0xvd2VyQ2FzZSgpO2E9YS5yZXBsYWNlKC9cXC8vZywiOiIpLnJlcGxhY2UoIiMiLCIiKTtzLmVWYXIxMTI9aDtzLmVWYXIxMTE9bDtzLmVWYXIxMTA9cDtzLmVWYXIxMTM9cTtzLnByb3AxMD1hO2E9ZCthKyI6Iitfc2F0ZWxsaXRlLmdldFZhcihcJ3BfdmxcJyk7cy5lVmFyNDM9YTtzLnByb3AxMT0iRD12NDMiOyJ1bmRlZmluZWQiIT09dHlwZW9mIGdldFNpdGVDYXRhbHlzdFVSTCYmKHMucHJvcDk9Z2V0U2l0ZUNhdGFseXN0VVJMKTtzLmV2ZW50cz1jO3MuY29udGV4dERhdGFbXCdkYmRiOVwnXT11O3MubGlua1RyYWNrRXZlbnRzPWM7cy5saW5rVHJhY2tWYXJzPSJldmVudHMsZVZhcjQzLGVWYXIxMTAsZVZhcjExMSxlVmFyMTEyLGVWYXIxMTMscHJvcDkscHJvcDEwLHByb3AxMSxjb250ZXh0RGF0YS5kYmRiOSI7cy50bChiLCJvIixhKTtzLmxpbmtUcmFja1ZhcnM9Ik5vbmUiO3MubGlua1RyYWNrRXZlbnRzPSJOb25lIn1jYXRjaChmKXt9fTtcbndpbmRvdy5DbGtQbG5Ucms9ZnVuY3Rpb24oYixjLGQsYSxwLGwpe3RyeXt2YXIgZT1hLmxhc3RJbmRleE9mKCIvIikrMTtzLnByb3AxMD1zLnByb3AxMT0iIjthPWEuc3Vic3RyaW5nKGUpO2E9YS50b0xvd2VyQ2FzZSgpO2E9YS5yZXBsYWNlKC9cXC8vZywiOiIpLnJlcGxhY2UoIiMiLCIiKTtzLmVWYXIxMDU9bDtzLmVWYXIxMDQ9cDtzLnByb3AxMD1hO2E9ZCthKyI6Iitfc2F0ZWxsaXRlLmdldFZhcihcJ3BfdmxcJyk7cy5lVmFyNDM9YTtzLnByb3AxMT0iRD12NDMiOyJ1bmRlZmluZWQiIT09dHlwZW9mIGdldFNpdGVDYXRhbHlzdFVSTCYmKHMucHJvcDk9Z2V0U2l0ZUNhdGFseXN0VVJMKTtzLmV2ZW50cz1jO3MubGlua1RyYWNrRXZlbnRzPWM7cy5saW5rVHJhY2tWYXJzPSJldmVudHMsZVZhcjQzLGVWYXIxMDQsZVZhcjEwNSxwcm9wOSxwcm9wMTAscHJvcDExIjtzLnRsKGIsIm8iLGEpO3MubGlua1RyYWNrVmFycz0iTm9uZSI7cy5saW5rVHJhY2tFdmVudHM9Ik5vbmUiO3MuZXZlbnRzPVwnXCc7fWNhdGNoKGYpe319O1xuXG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwzYTY3YjVlYTIwNmI0M2M5YWMxOGNlOWMzZTFiNjBlZScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2hwLSBidG4xJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmZpcnN0LWJhbm5lci1sZWZ0IC5oZXJvLWJ0bjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDEwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3cud2ViZXguY29tfHd3dy53ZWJleC5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tU2V0dXAnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbENvdW50cnkgPSAkKCcud2J4LXJlZ2lvbi1uYW1lJykudGV4dCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbENvdW50cnkgPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxDb3VudHJ5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbXBsaXR1ZGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldl9wID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1dHRvbl9uYW1lJzogJ3NpZ24gdXAgbm93IGZvciBmcmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2NhdGlvbic6ICdoZXJvYmFubmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlVXJsJzogZG9jdW1lbnQuVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbENvdW50cnknOiBzZWxDb3VudHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCd3eF9jbGtfc3RhcnQtZm9yLWZyZWUnLCBldl9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NlY3Rpb246aGVybzpidXR0b246c2lnbiB1cCBub3cgZm9yIGZyZWU6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjg3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnaG9tZSBwYWdlIGhlcm8gc2VjdGlvbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzaWduIHVwIG5vdyBmb3IgZnJlZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJ3NpZ24gdXAgbm93IGZvciBmcmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDI5NTgzMDkxNDI4MTQyZjU5NDMxZDYzZmYxYWZiYmFlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRlQgLSBBY3RpdmF0aW9uIHN1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2lkZW50aWZpZXInOiAnYWN0U3VjY2VzcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tU2V0dXAnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lVmFyMTA4ID0gcy5nZXRUaW1lVG9Db21wbGV0ZSgnc3RvcCcsICdwY2hrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lVmFyMTAwID0gcy5nZXRUaW1lVG9Db21wbGV0ZSgnc3RvcCcsICdvcmRTdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdwYWdlTmFtZSc6ICd3eDpmcmVlLXRyaWFsOnNpZ251cDpzdWNjZXNzJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3R5cGUnOiAncGFnZScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDdjMDk1OTZjN2FmYTQ3ZmY5YmNlOWFiZmE2YmYwYzBlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXNzZW50aWFsIHwgZ2V0LXN0YXJ0ZWQgfCBjbGljayB0cmFja2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcubWFpbi1jb250ZW50IGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZ2V0LXN0YXJ0ZWQvbXQtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Vzc2VudGlhbHMud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NlY3Rpb246JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGRhNjFhYzBlZmFlMDQ2N2ZhNTQwNjJkZjcwYWZmNjFkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRFIgLSBTZXJ2ZXIgRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2VudGVyc1ZpZXdwb3J0LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdlbGVtZW50U2VsZWN0b3InOiAnI2RyX1NlcnZlckVycm9yLmRyX0NvbnRlbnQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYnV5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZG9tYWlucyc6IFsnY2lzY29zcGFyay5jb20nXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICd3eDp1czpzaG9wcGluZy1jYXJ0OiVEUiBTaG9wcGluZyBDYXJ0IC0gU2VydmVyIEVycm9yIE51bWJlciUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwwZTYyNmE3Nzc1YzE0NTdhODQ3NzJmNzQ2MzA1OTFiMycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0Nsb3VkIGNhbGxpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnI3dieC1jYWxsaW5nIC5jb250YWluZXIgLmN0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdjbG91ZC1jYWxsaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZG9tYWlucyc6IFsnd2ViZXguY29tJ10gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOmJ1dHRvbjpjb250YWN0IHNhbGVzOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnY29udGFjdCBzYWxlcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNDlmMDc1YTNjZTY2NDZjZGFhZGQ4OGYxYWYwYzhlNDUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTcGFyayBQdXJjaGFzZSAtIENoYW5nZSBRdWFudGl0eSBlVmFyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9lbnRlcnNWaWV3cG9ydC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZWxlbWVudFNlbGVjdG9yJzogJ3RkLmRyX3Byb2R1Y3ROYW1lLmRyX2Z1dHVyZVN1YlJlbmV3YWxTdGF0ZVBsYW4gc3BhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdidXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW5zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Npc2NvLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2lzY29zcGFyay5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuY29va2llLnNldCgnb2ZmZXJGbGFnJywgJ2NoYW5nZScsIHsgZXhwaXJlczogNyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdDaGFuZ2UgUXVhbnRpdHknCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI3NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVEUiBTaG9wcGluZyBDYXJ0IC0gVXBkYXRlZCBTdWJzY3JpcHRpb24gUXVhbnRpdHklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnRFIgU3RlcCAxIC0gQ2hhbmdlIFF1YW50aXR5IFBhZ2UgJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDkyYjEyZTZlZjJiZTRkNWViM2U4OWE4MTY0ZWUwYjkxJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnV2ViRXggTWVldGluZ3MgRnJlZSBUcmlhbCBTaWduIFVwJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncHJpY2luZy9zaWdudXAuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvbWFpbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2lzY28uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0cmFja2VyUHJvcGVydGllcyc6IHsgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTUxJyB9XSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbihoLCBvLCB0LCBqLCBhLCByKSB7XG4gIGguaGogPVxuICAgIGguaGogfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIChoLmhqLnEgPSBoLmhqLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKTtcbiAgICB9O1xuICBoLl9oalNldHRpbmdzID0geyBoamlkOiA1NjY1MDEsIGhqc3Y6IDYgfTtcbiAgYSA9IG8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtcbiAgciA9IG8uY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7XG4gIHIuYXN5bmMgPSAxO1xuICByLnNyYyA9IHQgKyBoLl9oalNldHRpbmdzLmhqaWQgKyBqICsgaC5faGpTZXR0aW5ncy5oanN2O1xuICBhLmFwcGVuZENoaWxkKHIpO1xufSkod2luZG93LCBkb2N1bWVudCwgImh0dHBzOi8vc3RhdGljLmhvdGphci5jb20vYy9ob3RqYXItIiwgIi5qcz9zdj0iKTtcbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxjNDU0ZmQ3MjRjMDA0ZjdlODE1YmVhMzUzNzU3NmNlNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3d4IGhvbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihjYXJ0fHB1cmNoYXNlfGVzc2VudGlhbHN8ZnV0dXJlb2Z3b3JrKSgtaW50KT9cXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsJzogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnc2V0VGltZW91dChmdW5jdGlvbigpeyQoXCcuQnV0dG9uLS1idXR0b24tLXdHVmwzXCcpLmNsaWNrKGZ1bmN0aW9uKCl7dmFyIGd0VHh0PSQodGhpcykudGV4dCgpLnRyaW0oKTsgTG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6YnV0dG9uOiIsZ3RUeHQpOyB9KVxuJChcJy5Qcm9kdWN0LS1wcm9kdWN0X19zcmMtLTJoWkVHXCcpLmNsaWNrKGZ1bmN0aW9uKCl7dmFyIGd0VHh0PSQodGhpcykuYXR0cihcJ2FsdFwnKS50b0xvd2VyQ2FzZSgpOyBMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwic2VjdGlvbjppbWFnZToiLGd0VHh0KTsgfSlcbiAgICAgJChcJy5QbGFucy0tcGxhbnNfX2hlYWRlci0tMXFINE4gYSwubGVhcm4tbW9yZS1idG5cJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgZ3RUeHQ9JCh0aGlzKS50ZXh0KCkudHJpbSgpOyBMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwic2VjdGlvbjpidXR0b246IixndFR4dCk7IH0pXG4gICAgICQoXCcuaW1nLXN1Y2NlZWRzLXNwZW5jZXJcJykuY2xpY2soZnVuY3Rpb24oKXsgTG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aW1hZ2U6IixcJ3NwZW5jZXItZGlud2lkZGllXCcpOyB9KVxuICAgICAkKFwnLkhvd1RvLS1ob3dfX2Nhcm91c2VsLS0zMUpvWSAuQ2FyZC0tY2FyZF9faGVhZGluZy0tMVRMSkNcJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgZ3RUeHQ9JCh0aGlzKS50ZXh0KCkudHJpbSgpO2d0VHh0PWd0VHh0LnN1YnN0cigwLDQwKTsgTG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246bGluazoiLGd0VHh0KTsgfSkgICAgICAgICAgICAgICAgIFxuJChcJy5MaW5rQnV0dG9uLS1saW5rLS0xRGdZTSBoMywuTGlua0J1dHRvbi0tbGluay0tMURnWU0gc3BhbiwuSXRlbS0taXRlbV9fYnV0dG9uLS0yYzZZZSwjaGVsbG9CYXIgYSwubWVldGluZ3MtYXBwLC50ZWFtcy1hcHAsLmhlcm8tbGlua3MtYmxvY2sgYSwuc3RheS1saW5rMSwuc3RheS1saW5rMiBcJykuY2xpY2soZnVuY3Rpb24oKXt2YXIgZ3RUeHQ9JCh0aGlzKS50ZXh0KCkudHJpbSgpOyBMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwic2VjdGlvbjpsaW5rOiIsZ3RUeHQpOyB9KVxuJChcJy5oZXJvLWJ0bjMuYXQtZWxlbWVudC1jbGljay10cmFja2luZ1wnKS5jbGljayhmdW5jdGlvbigpeyBMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwic2VjdGlvbjpoZXJvOmJ1dHRvbjoiLCJzaWduIHVwIG5vdyBmb3IgZnJlZSIpOyB9KVxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGEwMDk0Mjg2MWFlZjQxNjY4NWMwYjBlMGJiNzI5YjA1JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndGFyZ2V0TG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3d3d1xcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICd2YXIgd2ViZXggPSB3ZWJleCB8fCB7fTtcbndlYmV4LnRhcmdldGVyID0gd2ViZXgudGFyZ2V0ZXIgfHwge307XG53ZWJleC50YXJnZXRlci5kYXRhID1cbiAgd2ViZXgudGFyZ2V0ZXIuZGF0YSB8fFxuICAoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhdGFSYXcgPSB7fTtcbiAgICB2YXIgZGF0YSA9IHt9O1xuICAgIHZhciBmbGF0dGVuID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgICAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHtcbiAgICAgICAgaWYgKE9iamVjdChjdXIpICE9PSBjdXIpIHtcbiAgICAgICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjdXIubGVuZ3RoOyBpIDwgbDsgaSsrKSByZWN1cnNlKGN1cltpXSwgcHJvcCArIFwnW1wnICsgaSArIFwnXVwnKTtcbiAgICAgICAgICBpZiAobCA9PSAwKSByZXN1bHRbcHJvcF0gPSBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaXNFbXB0eSA9IHRydWU7XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBjdXIpIHtcbiAgICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlY3Vyc2UoY3VyW3BdLCBwcm9wID8gcHJvcCArIFwnLlwnICsgcCA6IHApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVjdXJzZShkYXRhLCBcJ1wnKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICB2YXIgbXNGcm9tTm93ID0gZnVuY3Rpb24obXMpIHtcbiAgICAgIHZhciBkID0gRGF0ZS5ub3coKSArIG1zO1xuXG4gICAgICByZXR1cm4gZDtcbiAgICB9O1xuICAgIHZhciBwcm9jZXNzRGF0YSA9IGZ1bmN0aW9uKGQpIHtcbiAgICAgIHZhciBwcm9jZXNzZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBwcm9jZXNzZWQgPSB7XG4gICAgICAgICAgZXhwaXJlczogbXNGcm9tTm93KDEwMDAgKiA2MCAqIDE1KSxcbiAgICAgICAgICBhbGw6IGZsYXR0ZW4oZCksXG4gICAgICAgICAgZm9yX2FuYWx5c2lzOiB7XG4gICAgICAgICAgICBkb21haW46IGQuZG9tYWluLmRvbWFpbiB8fCBcJ1wnLFxuICAgICAgICAgICAgY29tcGFueV9uYW1lOiBkLmRvbWFpbi5jb21wYW55X25hbWUgfHwgXCdcJyxcbiAgICAgICAgICAgIGNvbXBhbnlfc2l6ZTogZC5hYm0uY29tcGFueV9zaXplIHx8IFwnXCcsXG4gICAgICAgICAgICBpbmR1c3RyeV9jYXRlZ29yeTogZC5kb21haW4uaW5kdXN0cnlfY2F0IHx8IFwnXCcsXG4gICAgICAgICAgICBpbmR1c3RyeV9zdWJfY2F0ZWdvcnk6IGQuZG9tYWluLmluZHVzdHJ5X3N1Yl9jYXQgfHwgXCdcJyxcbiAgICAgICAgICAgIHNlZ21lbnQ6IGQuYWJtLnNlZ21lbnQgfHwgXCdcJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBwcm9jZXNzZWQgPSB7XG4gICAgICAgICAgZXhwaXJlczogbXNGcm9tTm93KDApLFxuICAgICAgICAgIGZvcl9hbmFseXNpczoge1xuICAgICAgICAgICAgZG9tYWluOiBcJ1wnLFxuICAgICAgICAgICAgY29tcGFueV9uYW1lOiBcJ1wnLFxuICAgICAgICAgICAgY29tcGFueV9zaXplOiBcJ1wnLFxuICAgICAgICAgICAgaW5kdXN0cnlfY2F0ZWdvcnk6IFwnXCcsXG4gICAgICAgICAgICBpbmR1c3RyeV9zdWJfY2F0ZWdvcnk6IFwnXCcsXG4gICAgICAgICAgICBzZWdtZW50OiBcJ1wnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvY2Vzc2VkO1xuICAgIH07XG5cblxuICAgIHZhciBpbnRlcnZhbCA9IGZ1bmN0aW9uKGZ1bmMsIHdhaXQsIHRpbWVzKSB7XG4gICAgICB2YXIgaW50ZXJ2ID0gKGZ1bmN0aW9uKHcsIHQpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdCA9PT0gXCd1bmRlZmluZWRcJyB8fCB0LS0gPiAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGludGVydiwgdyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBmdW5jLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHQgPSAwO1xuICAgICAgICAgICAgICB0aHJvdyBlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSkod2FpdCwgdGltZXMpO1xuXG4gICAgICBzZXRUaW1lb3V0KGludGVydiwgd2FpdCk7XG4gICAgfTtcblxuICAgIHZhciBvbkxvYWRlZCA9IGZ1bmN0aW9uKG8pIHtcbiAgICAgIGRhdGFSYXcgPSBvO1xuXG4gICAgICBkYXRhID0gcHJvY2Vzc0RhdGEoZGF0YVJhdyk7XG4gICAgICB2YXIgc2VudFRvTG9jYWxTdG9yYWdlID0gZmFsc2U7XG4gICAgICB2YXIgc2VudFRvQW1wbGl0dWRlID0gZmFsc2U7XG5cbiAgICAgIGludGVydmFsKFxuICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZiAoIXNlbnRUb0xvY2FsU3RvcmFnZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3ZWJleC50YXJnZXRlci5kYXRhLmxvY2FsU3RvcmFnZS5zZW5kICE9PSBcJ3VuZGVmaW5lZFwnKSB7XG4gICAgICAgICAgICAgIHdlYmV4LnRhcmdldGVyLmRhdGEubG9jYWxTdG9yYWdlLnNlbmQoZGF0YSk7XG4gICAgICAgICAgICAgIHNlbnRUb0xvY2FsU3RvcmFnZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAxMDAwLFxuICAgICAgICA1XG4gICAgICApO1xuXG4gXG4gICAgfTtcblxuICAgIHZhciBmZXRjaCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGpzb25fZG5zID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICBqc29uX2Rucy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihiKSB7XG4gICAgICAgIGlmICg0ID09IHRoaXMucmVhZHlTdGF0ZSAmJiAyMDAgPT0gdGhpcy5zdGF0dXMpIHtcbiAgICAgICAgICB2YXIgYSA9IEpTT04ucGFyc2UodGhpcy5yZXNwb25zZSk7XG4gICAgICAgICAgdGFyZ2V0UGFnZVBhcmFtcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfZG9tYWluOiBhLmRvbWFpbi5kb21haW4gfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfY29tcGFueV9uYW1lOiBhLmRvbWFpbi5jb21wYW55X25hbWUgfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfY29tcGFueV9zaXplOiBhLmFibS5jb21wYW55X3NpemUgfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfaW5kdXN0cnlfY2F0ZWdvcnk6IGEuZG9tYWluLmluZHVzdHJ5X2NhdCB8fCBcJ1wnLFxuICAgICAgICAgICAgICB0YXJnZXRlcl9pbmR1c3RyeV9zdWJfY2F0ZWdvcnk6IGEuZG9tYWluLmluZHVzdHJ5X3N1Yl9jYXQgfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfc2VnbWVudDogYS5hYm0uc2VnbWVudCB8fCBcJ1wnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgb25Mb2FkZWQoYSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBqc29uX2Rucy5vcGVuKFwnR0VUXCcsIFwnaHR0cHM6Ly9kc2MuY2lzY28uY29tL3YxL25ldGlkP2FwaWtleT1xeXdicDU4RE8zb1dNSGVoTTZvenBxSUd3cUdyZ29rVFwnLCAhMCk7XG4gICAgICBqc29uX2Rucy5zZW5kKCk7XG4gICAgfTtcblxuICAgIHZhciBkYXRhRXhpc3RzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGFzRGF0YTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgaGFzRGF0YSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCd0YXJnZXRlclwnKSkuZXhwaXJlcyA+IERhdGUubm93KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGhhc0RhdGEgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXNEYXRhO1xuICAgIH07XG5cbiAgICB2YXIgZ2V0RXhpc3RpbmdEYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZGF0YTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwndGFyZ2V0ZXJcJykpLmZvcl9hbmFseXNpcztcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG4gICAgdmFyIGluaXQgPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbXNUb0ZldGNoID0gMDtcbiAgICAgIHZhciBleGlzdGluZ0RhdGE7XG4gICAgICB2YXIgaXNUYXJnZXRlckNvbnN1bWVyID0gL153d3dcXC53ZWJleFxcLmNvbSQvaS50ZXN0KGxvY2F0aW9uLmhvc3RuYW1lKTtcbiAgICAgIGlmIChpc1RhcmdldGVyQ29uc3VtZXIpIHtcbiAgICAgICAgaWYgKGRhdGFFeGlzdHMoKSkge1xuICAgICAgICAgIGV4aXN0aW5nRGF0YSA9IGdldEV4aXN0aW5nRGF0YSgpO1xuICAgICAgICAgIHRhcmdldFBhZ2VQYXJhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHRhcmdldGVyX2RvbWFpbjogZXhpc3RpbmdEYXRhLmRvbWFpbiB8fCBcJ1wnLFxuICAgICAgICAgICAgICB0YXJnZXRlcl9jb21wYW55X25hbWU6IGV4aXN0aW5nRGF0YS5jb21wYW55X25hbWUgfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfY29tcGFueV9zaXplOiBleGlzdGluZ0RhdGEuY29tcGFueV9zaXplIHx8IFwnXCcsXG4gICAgICAgICAgICAgIHRhcmdldGVyX2luZHVzdHJ5X2NhdGVnb3J5OiBleGlzdGluZ0RhdGEuaW5kdXN0cnlfY2F0ZWdvcnkgfHwgXCdcJyxcbiAgICAgICAgICAgICAgdGFyZ2V0ZXJfaW5kdXN0cnlfc3ViX2NhdGVnb3J5OiBleGlzdGluZ0RhdGEuaW5kdXN0cnlfc3ViX2NhdGVnb3J5IHx8IFwnXCcsXG4gICAgICAgICAgICAgIHRhcmdldGVyX3NlZ21lbnQ6IGV4aXN0aW5nRGF0YS5zZWdtZW50IHx8IFwnXCcsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAvLyBmZXRjaCgpO1xuICAgICAgICAgIC8vc2V0VGltZW91dChpbml0VGFyZ2V0LCBtc1RvRmV0Y2gpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgIC8vIGluaXRUYXJnZXQoKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdhdGhlcmVkOiBkYXRhLFxuICAgIH07XG4gIH0pKCk7XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxkODU5MGU3OTJjOTE0NWQ1YTdlMzcyMzNkYTliY2Q0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3NlcnZlclVwZGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwwMGQ4MTJkYjNiMTE0ZjRkOTM4YzY5ZmNhNWYzYjJjOScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Vzc2VudGlhbCB8IG5ldyB3ZWJleCB8IGJveCB8Y2xpY2sgdHJhY2tpbmcgaG9tZXBhZ2Ugam0nLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjdXBkYXRlLXByb2dyYW0tam0gYS5waWxsLWxpbmsud2hpdGUtYmxhY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlc3NlbnRpYWxzLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOnVwZGF0ZS1wcm9ncmFtLWptOiV0aGlzLkBjbGVhblRleHQlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3VwZGF0ZS1wcm9ncmFtLWptOiV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXIxMTcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5AY2xlYW5UZXh0JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxmMDU1ZjMyODFkNmU0ZjgwYTNkZDBjNzQ4ZGI1N2ZmMicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Rvd25sb2FkIENUQScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZG9tUmVhZHkuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZG93bmxvYWRzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQ2MzYWY3NjdhYmNlMjRjMzE5ZTJiZjQ0ODM5MWU5ZDc1LXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNDcyNmRjZDlmY2VhNDA2ZTk5MmVkNzJlMzk5OTAxYzAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdQTCAtIERSIC0gYWxsIHBhZ2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYnV5XFwud2ViZXhcXC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICchZnVuY3Rpb24oKXtmdW5jdGlvbiByKCl7cmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVH1pZigwPGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImRyX2Vycm9yIikubGVuZ3RoKXt2YXIgZT0iIixvPSIiLHQ9IiIsbj1zcGFya19kYXRhLmN1c3RvbWVyX3V1aWQ7dm9pZCAwPT09biYmKG49IlNlc3Npb24gRXhwaXJlZCIpLCJ1bmRlZmluZWQiIT10eXBlb2YgJCYmMDwkKCIjZHJfU2VydmVyRXJyb3IgaDEiKS5sZW5ndGgmJihlPSQoIiNkcl9TZXJ2ZXJFcnJvciBoMSIpLnRleHQoKSx2b2lkIDAhPT0kKCIjZHJfU2VydmVyRXJyb3IgLmRyX2Vycm9yIHAiKVsyXSYmKG89JCgiI2RyX1NlcnZlckVycm9yIC5kcl9lcnJvciBwIilbMl0udGV4dENvbnRlbnQpLGM9ZG9jdW1lbnQsdD1kb2N1bWVudC5jcmVhdGVOb2RlSXRlcmF0b3IoYyxOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCxyLCExKS5uZXh0Tm9kZSgpLm5vZGVWYWx1ZSxkPSJEUl9TZXJ2ZXJfRXJyb3IiLHU9ZSxpPW8sYT10LF89biwoKHM9d2luZG93WyJhZHJ1bS1jb25maWciXXx8KHdpbmRvd1siYWRydW0tY29uZmlnIl09e30pKS51c2VyRXZlbnRJbmZvfHwocy51c2VyRXZlbnRJbmZvPXt9KSkuUGFnZVZpZXc9ZnVuY3Rpb24oKXtyZXR1cm57dXNlckRhdGE6e0Vycm9yX0NvZGU6ZCxFcnJvcl9EZXNjMTp1LEVycm9yX0Rlc2MyOmksRFJfUmVxdWVzdF9JRDphLEN1c3RvbWVyX3V1aWQ6X319fSwkLmdldFNjcmlwdCgiaHR0cHM6Ly9jZG4uYXBwZHluYW1pY3MuY29tL2FkcnVtL2FkcnVtLWxhdGVzdC5qcyIsZnVuY3Rpb24oKXt9KSl9dmFyIGQsdSxpLGEsXyxzLGN9KCk7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMN2M1ZDg2YTZjMTRlNGJiZDljY2FhOTJjY2E3Yzg0ZDInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVCAtIEFjdGl2YXRpb24gRmFpbHVyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICdhY3RGYWlsJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0cmFja2VyUHJvcGVydGllcyc6IHsgJ3BhZ2VOYW1lJzogJ3d4OmZyZWUtdHJpYWw6YWN0aXZhdGlvbjpmYWlsdXJlJyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzM5NTUxNTE2MWZkNDRkZDlhOWJmNjA4YmMzYTdlM2QxLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGFjMGU0YWE4MTQ3ZDQxNGZiY2QwNjljNWM3MDFmZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRlcgLSBob21lcGFnZSBldmVudCBzZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmV2ZW50cy1hbmQtd2ViaW5hcnMgLmV2ZW50LWl0ZW0gYS5ldmVudC11cmwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmdXR1cmVvZndvcmtcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJHxeKC9pbmRleC5odG1sKSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYnV0dG9uOnNlY3Rpb246ZXZlbnQ6JXRoaXMuZ2V0QXR0cmlidXRlKGhyZWYpJToldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMmZlZWY1MDNiOGRkNDhlYzg4N2RlNGZkZjg5NGFjYTgnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw4MzkxM2NhMTM2ZDE0MzZkOWU0NDhkNTQwMmZiNTNlMScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1RlYWxpdW0gLSBKYXZhU2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3N1YmRvbWFpbnMnOiBbeyAndmFsdWUnOiAnd3d3LndlYmV4LmNvbScgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJy8yL3RlYWxpdW0vdGVzdC1iYXJlLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnY29uc29sZS5sb2coIlRlYWxpdW0gSmF2YVNjcmlwdCIpO1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMjk5NzMyMGM5ZjJlNDczMjliZTc0NDRiODFiYThmZTInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdXZWJFeCBNZWV0aW5ncyBGcmVlIFRyaWFsIEVtYWlsIFNlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdwcmljaW5nL2VtYWlsc2VudC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaXNjby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0VGltZVRvQ29tcGxldGUoJ3N0YXJ0JywgJ2VtLWNoaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE0NScgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbihoLG8sdCxqLGEscil7XG5oLmhqPWguaGp8fGZ1bmN0aW9uKCl7KGguaGoucT1oLmhqLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9O1xuaC5faGpTZXR0aW5ncz17aGppZDo1NjY1MDEsaGpzdjo2fTtcbmE9by5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ2hlYWRcJylbMF07XG5yPW8uY3JlYXRlRWxlbWVudChcJ3NjcmlwdFwnKTtyLmFzeW5jPTE7XG5yLnNyYz10K2guX2hqU2V0dGluZ3MuaGppZCtqK2guX2hqU2V0dGluZ3MuaGpzdjtcbmEuYXBwZW5kQ2hpbGQocik7XG59KSh3aW5kb3csZG9jdW1lbnQsXCdodHRwczovL3N0YXRpYy5ob3RqYXIuY29tL2MvaG90amFyLVwnLFwnLmpzP3N2PVwnKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZGQ1ZTMzZDU0MzhhNDE4Yzg0NWU3ZWVmODk1OWY4OGEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVCAtIEFjdGl2YXRpb24gcHJvZ3Jlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2lkZW50aWZpZXInOiAnYWN0UHJvZ3Jlc3MnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAncGFnZU5hbWUnOiAnd3g6ZnJlZS10cmlhbDphY3RpdmF0aW9uOmluLXByb2dyZXNzJyB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzVkOTEyYjdmZTQ5NjRmMDBhNGJlOTJiY2RjNjY1OTA1LXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGRmYzYxYTI2YjZmZTRlZjNiM2UyNTgwNjI4MTY0N2M3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnUEwgLSBBRU0gcHJvZCAtIHd3dy53ZWJleC5jb20vaG9tZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeXFwvaG9tZVxcLmh0bWwkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbigpIHtcblxuICB2YXIgY2xpY2thYmxlcyA9IFtcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ1dvcmsgYmV0dGVyLCB0b2dldGhlci5cJyxcbiAgICAgIGxvY2F0aW9uOiBcJ0NUQSBidXR0b25zXCcsXG4gICAgICBsYWJlbDogXCdTdGFydCBmb3IgRnJlZVwnLFxuICAgICAgdHlwZTogXCdidXR0b25cJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Ib21lcGFnZUhlcm8tLWhvbWVwYWdlSGVyb19fYnV0dG9ucy0taTlRZ1QgLkJ1dHRvbi0tYmx1ZS0tM0F0MHZcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnV29yayBiZXR0ZXIsIHRvZ2V0aGVyLlwnLFxuICAgICAgbG9jYXRpb246IFwnQ1RBIGJ1dHRvbnNcJyxcbiAgICAgIGxhYmVsOiBcJ1NlZSBQcmljaW5nXCcsXG4gICAgICB0eXBlOiBcJ2J1dHRvblwnLFxuICAgICAgc2VsZWN0b3I6IFwnLkhvbWVwYWdlSGVyby0taG9tZXBhZ2VIZXJvX19idXR0b25zLS1pOVFnVCAuQnV0dG9uLS10cmFuc3BhcmVudC0tMnVlRHpcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnSGFzc2xlLWZyZWUgdmlkZW8gLi4uXCcsXG4gICAgICBsb2NhdGlvbjogXCdjb3B5XCcsXG4gICAgICBsYWJlbDogXCdEaXNjb3ZlciBXZWJleCBNZWV0aW5nc1wnLFxuICAgICAgdHlwZTogXCdidXR0b25cJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5JdGVtLS1pdGVtX19idXR0b24tLTJjNlllXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdxdWFkcmFudCBXZWJleCBNZWV0aW5nc1wnLFxuICAgICAgbGFiZWw6IFwnTWVldGluZ3MgcHJvZHVjdFwnLFxuICAgICAgdHlwZTogXCdpbWFnZVwnLFxuICAgICAgc2VsZWN0b3I6IFwnLlByb2R1Y3QtLXByb2R1Y3QtLTFkdkZsOm50aC1jaGlsZCgxKT4uUHJvZHVjdC0tcHJvZHVjdF9faW1nLS0xX0NUZT5hXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdxdWFkcmFudCBXZWJleCBNZWV0aW5nc1wnLFxuICAgICAgbGFiZWw6IFwnRXhwbG9yZSBWaWRlbyBDb25mZXJlbmNpbmdcJyxcbiAgICAgIHR5cGU6IFwndGV4dFwnLFxuICAgICAgc2VsZWN0b3I6IFwnLlByb2R1Y3QtLXByb2R1Y3QtLTFkdkZsOm50aC1jaGlsZCgxKT5hXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdxdWFkcmFudCBXZWJleCBUZWFtc1wnLFxuICAgICAgbGFiZWw6IFwnVGVhbXMgcHJvZHVjdFwnLFxuICAgICAgdHlwZTogXCdpbWFnZVwnLFxuICAgICAgc2VsZWN0b3I6IFwnLlByb2R1Y3QtLXByb2R1Y3QtLTFkdkZsOm50aC1jaGlsZCgyKT4uUHJvZHVjdC0tcHJvZHVjdF9faW1nLS0xX0NUZT5hXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdxdWFkcmFudCBXZWJleCBUZWFtc1wnLFxuICAgICAgbGFiZWw6IFwnRXhwbG9yZSBUZWFtIENvbGxhYm9yYXRpb25cJyxcbiAgICAgIHR5cGU6IFwndGV4dFwnLFxuICAgICAgc2VsZWN0b3I6IFwnLlByb2R1Y3QtLXByb2R1Y3QtLTFkdkZsOm50aC1jaGlsZCgyKT5hXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdxdWFkcmFudCBXZWJleCBDYWxsaW5nXCcsXG4gICAgICBsYWJlbDogXCdDYWxsaW5nIHByb2R1Y3RcJyxcbiAgICAgIHR5cGU6IFwnaW1hZ2VcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0LS1wcm9kdWN0LS0xZHZGbDpudGgtY2hpbGQoMyk+LlByb2R1Y3QtLXByb2R1Y3RfX2ltZy0tMV9DVGU+YVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdHZXQgbW9yZSBkb25lLlwnLFxuICAgICAgbG9jYXRpb246IFwncXVhZHJhbnQgV2ViZXggQ2FsbGluZ1wnLFxuICAgICAgbGFiZWw6IFwnRXhwbG9yZSBDbG91ZCBDYWxsaW5nXCcsXG4gICAgICB0eXBlOiBcJ3RleHRcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0LS1wcm9kdWN0LS0xZHZGbDpudGgtY2hpbGQoMyk+YVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdHZXQgbW9yZSBkb25lLlwnLFxuICAgICAgbG9jYXRpb246IFwncXVhZHJhbnQgV2ViZXggRGV2aWNlc1wnLFxuICAgICAgbGFiZWw6IFwnRGV2aWNlcyBwcm9kdWN0XCcsXG4gICAgICB0eXBlOiBcJ2ltYWdlXCcsXG4gICAgICBzZWxlY3RvcjogXCcuUHJvZHVjdC0tcHJvZHVjdC0tMWR2Rmw6bnRoLWNoaWxkKDQpPi5Qcm9kdWN0LS1wcm9kdWN0X19pbWctLTFfQ1RlPmFcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnR2V0IG1vcmUgZG9uZS5cJyxcbiAgICAgIGxvY2F0aW9uOiBcJ3F1YWRyYW50IFdlYmV4IERldmljZXNcJyxcbiAgICAgIGxhYmVsOiBcJ0V4cGxvcmUgQ29sbGFib3JhdGlvbiBEZXZpY2VzXCcsXG4gICAgICB0eXBlOiBcJ3RleHRcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0LS1wcm9kdWN0LS0xZHZGbDpudGgtY2hpbGQoNCk+YVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdHZXQgbW9yZSBkb25lLlwnLFxuICAgICAgbG9jYXRpb246IFwnZG93bmxvYWRzXCcsXG4gICAgICBsYWJlbDogXCdNZWV0aW5nc1wnLFxuICAgICAgdHlwZTogXCdidXR0b25cJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0cy0tcHJvZHVjdHNfX3NpZGViYXItLTNCTWt4PmRpdj5hOm50aC1jaGlsZCgyKVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdHZXQgbW9yZSBkb25lLlwnLFxuICAgICAgbG9jYXRpb246IFwnZG93bmxvYWRzXCcsXG4gICAgICBsYWJlbDogXCdUZWFtc1wnLFxuICAgICAgdHlwZTogXCdidXR0b25cJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0cy0tcHJvZHVjdHNfX3NpZGViYXItLTNCTWt4PmRpdj5hOm50aC1jaGlsZCgzKVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdHZXQgbW9yZSBkb25lLlwnLFxuICAgICAgbG9jYXRpb246IFwncHJvZHVjdHNcJyxcbiAgICAgIGxhYmVsOiBcJ1RyYWluaW5nXCcsXG4gICAgICB0eXBlOiBcJ3RleHRcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5Qcm9kdWN0cy0tcHJvZHVjdHNfX3NpZGViYXItLTNCTWt4PmRpdj5kaXY+YTpudGgtY2hpbGQoMSlcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnR2V0IG1vcmUgZG9uZS5cJyxcbiAgICAgIGxvY2F0aW9uOiBcJ3Byb2R1Y3RzXCcsXG4gICAgICBsYWJlbDogXCdXZWJpbmFyc1wnLFxuICAgICAgdHlwZTogXCd0ZXh0XCcsXG4gICAgICBzZWxlY3RvcjogXCcuUHJvZHVjdHMtLXByb2R1Y3RzX19zaWRlYmFyLS0zQk1reD5kaXY+ZGl2PmE6bnRoLWNoaWxkKDIpXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0dldCBtb3JlIGRvbmUuXCcsXG4gICAgICBsb2NhdGlvbjogXCdwcm9kdWN0c1wnLFxuICAgICAgbGFiZWw6IFwnVmlkZW8gU3VwcG9ydFwnLFxuICAgICAgdHlwZTogXCd0ZXh0XCcsXG4gICAgICBzZWxlY3RvcjogXCcuUHJvZHVjdHMtLXByb2R1Y3RzX19zaWRlYmFyLS0zQk1reD5kaXY+ZGl2PmE6bnRoLWNoaWxkKDMpXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ1dlYmV4IHdvcmtzIHdlbGwgLi4uXCcsXG4gICAgICBsb2NhdGlvbjogXCdjb3B5XCcsXG4gICAgICBsYWJlbDogXCdMZWFybiBNb3JlXCcsXG4gICAgICB0eXBlOiBcJ2J1dHRvblwnLFxuICAgICAgc2VsZWN0b3I6IFwnLmxlYXJuLW1vcmUtYnRuIGFcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnSW5zaWdodHMgJiBSZXNvdXJjZXMgLi4uXCcsXG4gICAgICBsb2NhdGlvbjogXCdjYXJvdXNlbCB3aGl0ZSBwYXBlcnNcJyxcbiAgICAgIGxhYmVsOiBcJ1RoZSBmdXR1cmUgb2YgLi4uXCcsXG4gICAgICB0eXBlOiBcJ3RleHRcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5DYXJkLS1jYXJkX19ncm91cC0tMTdvRUE6bnRoLWNoaWxkKDEpIGFcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnSW5zaWdodHMgJiBSZXNvdXJjZXMgLi4uXCcsXG4gICAgICBsb2NhdGlvbjogXCdjYXJvdXNlbCBibG9nXCcsXG4gICAgICBsYWJlbDogXCdBcnRpZmljaWFsIGludGVsbGlnZW5jZSBpcyAuLi5cJyxcbiAgICAgIHR5cGU6IFwndGV4dFwnLFxuICAgICAgc2VsZWN0b3I6IFwnLkNhcmQtLWNhcmRfX2dyb3VwLS0xN29FQTpudGgtY2hpbGQoMikgYVwnLFxuICAgIH0sXG4gICAge1xuICAgICAgc2VjdGlvbjogXCdJbnNpZ2h0cyAmIFJlc291cmNlcyAuLi5cJyxcbiAgICAgIGxvY2F0aW9uOiBcJ2Nhcm91c2VsIGVib29rc1wnLFxuICAgICAgbGFiZWw6IFwnVGVhbXdvcmsgbWFrZXMgdGhlIC4uLlwnLFxuICAgICAgdHlwZTogXCd0ZXh0XCcsXG4gICAgICBzZWxlY3RvcjogXCcuQ2FyZC0tY2FyZF9fZ3JvdXAtLTE3b0VBOm50aC1jaGlsZCgzKSBhXCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWN0aW9uOiBcJ0luc2lnaHRzICYgUmVzb3VyY2VzIC4uLlwnLFxuICAgICAgbG9jYXRpb246IFwnY2Fyb3VzZWwgd2hhdFxcXCdzIG5ld1wnLFxuICAgICAgbGFiZWw6IFwnQ29sbGFib3JhdGlvbiB0ZWNobm9sb2d5IGVzc2VudGlhbHMgLi4uXCcsXG4gICAgICB0eXBlOiBcJ3RleHRcJyxcbiAgICAgIHNlbGVjdG9yOiBcJy5DYXJkLS1jYXJkX19ncm91cC0tMTdvRUE6bnRoLWNoaWxkKDQpIGFcJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNlY3Rpb246IFwnR2V0IHN0YXJ0ZWQgd2l0aCAuLi5cJyxcbiAgICAgIGxvY2F0aW9uOiBcJ2NvcHlcJyxcbiAgICAgIGxhYmVsOiBcJ1ZpZXcgUGxhbnMgJiBQcmljaW5nXCcsXG4gICAgICB0eXBlOiBcJ2J1dHRvblwnLFxuICAgICAgc2VsZWN0b3I6IFwnLlBsYW5zLS1wbGFuc19faGVhZGVyLS0xcUg0TiBhXCcsXG4gICAgfSxcbiAgXTtcblxuICB2YXIgY29uZmlndXJlVHJhY2tpbmcgPSBmdW5jdGlvbihjbGlja2FibGUpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNsaWNrYWJsZS5zZWxlY3Rvcik7XG5cbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcJ2NsaWNrXCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBwYXRoID0gY2xpY2thYmxlLnR5cGUgKyBcJzpzZWN0aW9uOlwnICsgY2xpY2thYmxlLnNlY3Rpb24gKyBcJzpcJztcbiAgICAgICAgICB2YXIgY2xpY2thYmxlX25hbWUgPSBjbGlja2FibGUubG9jYXRpb24gKyBcJ3xcJyArIGNsaWNrYWJsZS5sYWJlbDtcbiAgICAgICAgICBMblRya0V2ZW50KHRoaXMsIFwnZXZlbnQxODFcJywgcGF0aCwgY2xpY2thYmxlX25hbWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9EbyBub3RoaW5nLlxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvL0RvIG5vdGhpbmcuXG4gICAgfVxuICB9O1xuXG4gIGNsaWNrYWJsZXMubWFwKGNvbmZpZ3VyZVRyYWNraW5nKTtcblxufSkoKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxhMWFlM2I4NzhjMTc0MTk5ODBkMTBlOWU1ZjIxZjQyMycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3RlYW1zIGNvbGxhYicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAndmlkZW8tY29uZmVyZW5jaW5nfHRlYW0tY29sbGFib3JhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnc2V0VGltZW91dChmdW5jdGlvbigpIHtcbnRyeSB7XG53aW5kb3cuY2hFbVZhbFN0cj0vXltBLVowLTkuXyUrLV0rQChbQS1aMC05LV0rXFwuKStbQS1aXXsyLDR9JC9pO3dpbmRvdy5jaEVtVmFsPS9eW0EtWjAtOS5fJSstXS9pO2Z1bmN0aW9uIGV4c2NMbmNoU3RyKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsInNlY3Rpb246aGVyby1iYW5uZXI6dGV4dC1ib3g6IiwiZW50ZXIgZW1haWwiKX12YXIgZ3RFbVZhbD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1haWwiKSxydW5JZW5mZT0hMCxydW5JZW5mZVN0cj0hMDtndEVtVmFsLm9uZm9jdXM9ZnVuY3Rpb24oKXtydW5JZW5mZVN0ciYmKGV4c2NMbmNoU3RyKCkscnVuSWVuZmVTdHI9ITEpfTtcbmd0RW1WYWwub25jbGljaz1mdW5jdGlvbigpe3J1bkllbmZlU3RyJiYoZXhzY0xuY2hTdHIoKSxydW5JZW5mZVN0cj0hMSl9O2d0RW1WYWwub25wYXN0ZT1mdW5jdGlvbigpe3J1bkllbmZlU3RyJiYoZXhzY0xuY2hTdHIoKSxydW5JZW5mZVN0cj0hMSl9O1xud2luZG93LmNoRW1WYWw9L15bQS1aMC05Ll8lKy1dK0AoW0EtWjAtOS1dK1xcLikrW0EtWl17Miw0fSQvaTtcbnZhciBydW5JZW5mZTI9dHJ1ZTtcblxuXG5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2lnbnVwQnV0dG9uIikub25jbGljaz1mdW5jdGlvbigpe2NoRW1WYWwudGVzdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZW1haWwiKS52YWx1ZSkmJihydW5JZW5mZSYmKExuVHJrRXZlbnQodGhpcywiZXZlbnQxODEiLCJzZWN0aW9uOmhlcm8tYmFubmVyOmJ1dHRvbjoiLCJ0cnkgZnJlZSIpLHJ1bkllbmZlMj0hMSkpfTtcdFxufSBjYXRjaCAoZSkge31cbn0sIDIwMDApOycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGUxNzg0NGJlZTA1NDQ5MTZiMTcyM2ExODcxMjA4NWRjJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnV2ViRXggTWVldGluZ3MgRnJlZSBUcmlhbCAtTG9hZGluZyBQYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncHJpY2luZy90cmlhbC9sb2FkaW5ncGFnZS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaXNjby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZ2V0VGltZVRvQ29tcGxldGUoJ3N0YXJ0JywgJ2d0dGNjb25maXJtYXRpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxNDcnIH1dIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICcoZnVuY3Rpb24oaCxvLHQsaixhLHIpe1xuaC5oaj1oLmhqfHxmdW5jdGlvbigpeyhoLmhqLnE9aC5oai5xfHxbXSkucHVzaChhcmd1bWVudHMpfTtcbmguX2hqU2V0dGluZ3M9e2hqaWQ6NTY2NTAxLGhqc3Y6Nn07XG5hPW8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCdoZWFkXCcpWzBdO1xucj1vLmNyZWF0ZUVsZW1lbnQoXCdzY3JpcHRcJyk7ci5hc3luYz0xO1xuci5zcmM9dCtoLl9oalNldHRpbmdzLmhqaWQraitoLl9oalNldHRpbmdzLmhqc3Y7XG5hLmFwcGVuZENoaWxkKHIpO1xufSkod2luZG93LGRvY3VtZW50LFwnaHR0cHM6Ly9zdGF0aWMuaG90amFyLmNvbS9jL2hvdGphci1cJyxcJy5qcz9zdj1cJyk7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDkyYWIzMWU4Yzk4ZDQxYTM4MDliZDBkNzFmMjI4ZDFjJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRlQgcGluLWNoZWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9lbnRlcnNWaWV3cG9ydC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZWxlbWVudFNlbGVjdG9yJzogJy5yZXNlbmQtbGluaycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3Bpbi1jaGVjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDNWMxZGE1ZDBjOWU0NGVmNjk2OThlNWY0NjcyYWUwMDAtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwzNGQzOWFhODEyMmM0YzQ4ODUxZDYzYTVmNmM2YzUyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1RlYWxpdW0gLSBIVE1MJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3N1YmRvbWFpbnMnOiBbeyAndmFsdWUnOiAnd3d3LndlYmV4LmNvbScgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ15cXC8yXFwvdGVhbGl1bVxcLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJzxoMT5UZWFsaXVtIEhUTUw8L2gxPlxuPHNjcmlwdD5cbiAgY29uc29sZS5sb2coIlRlYWxpdW0gSFRNTCIpO1xuPC9zY3JpcHQ+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYWZmNDJmNzg1ZTA2NDE1NDkxZDBjMDkzOTU3NmY3NWInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdDb250YWN0IExCWCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC9sYnhcXC9nbG9iYWxfc2FsZXN8bGJ4XFwvY2FsbC1tZS1jb3VudHJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICd0cnl7cy5hYm9ydD10cnVlO31jYXRjaChlKXt9JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYTdmNzg0OGE4N2M4NGIzMThlMWZlNWNhODM3N2JiY2EnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdUZWFsaXVtIC0gSmF2YVNjcmlwdCBnbG9iYWxseScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvbGlicmFyeUxvYWRlZC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdzdWJkb21haW5zJzogW3sgJ3ZhbHVlJzogJ3d3dy53ZWJleC5jb20nIH1dIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeXFwvMlxcL3RlYWxpdW1cXC8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnY29uc29sZS5sb2coIlRlYWxpdW0gSmF2YVNjcmlwdCBnbG9iYWxseSIpO1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYjA3NWZjMzk2ZDdkNDFhYzg4ZmFmZjA0ZGI3MGEzOTgnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEUiBDb25maXJtYXRpb24gUGFnZSAtIENsaWNrICJHZXQgU3RhcnRlZCInLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmRyX2FjdGl2YXRpb25VUkwgPiBhOm50aC1jaGlsZCgxKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdEUiBDb25maXJtYXRpb24gUGFnZSAtIENsaWNrICJHZXQgU3RhcnRlZCInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkwxYjY4OWFiYTIxYjk0MGVmOGI1ZmY5ZjE3ZGU2YWZmMScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2ZyZWVUcmlhbEJ1dHRvbkNsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnYVtocmVmKj0icHJpY2luZy9mcmVlLXRyaWFsLiJdLCBhW2lkPSJzaWdudXBCdXR0b24iXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBuID0gbG9jYXRpb24ucGF0aG5hbWUsIGxiID0gdGhpcy5pbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBjID0gdGhpcy5wYXJlbnRFbGVtZW50LmNsYXNzTmFtZSwgcnYgPSAnbi9hJywgdGVhbXNCdXR0b25MYWJlbHMgPSAoJ1RyeSBUZWFtcyBmcmVlJyArICdUZWFtcyBrb3N0ZW5sb3MgdGVzdGVuJyArICdFc3NheWV6IFRlYW1zIGdyYXR1aXRlbWVudCcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjID09PSAnd2J4LWhlYWRlci1tZW51LWxpc3QtaXRlbSB3YngtaGVhZGVyLXRyeS1pdC1mcmVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbi5pbmRleE9mKCcvdGVhbS1jb2xsYWJvcmF0aW9uLmh0bWwnKSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICd0ZWFtIHByb2R1Y3QgcGFnZSBoZWFkZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSAnZ2xvYmFsIGhlYWRlcic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBjID09PSAnaGVyby1jdGEtY29udGFpbmVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICdob21lIHBhZ2UgaGVybyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYyA9PT0gJ2hlcm8taXRlbTItY3RhLWNvbnRhaW5lcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSAnaG9tZSBwYWdlIGNhcm91c2VsIDEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGMgPT09ICd3ZWJleC10ZXN0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICdob21lIHBhZ2UgbGFzdCBzZWN0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBjID09PSAnY29udGFpbmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc05hbWUgPT09ICdocC1zdGFydCBzZWMtNicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gJ2hvbWUgcGFnZSBsYXN0IHNlY3Rpb24nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZWFtc0J1dHRvbkxhYmVscy5pbmRleE9mKGxiKSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gJ3RlYW1zIHBhZ2UgaGVybyBzZWN0aW9uJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbi5pbmRleE9mKCd2aWRlby1jb25mZXJlbmNpbmcnKSA+IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICdtZWV0aW5ncyBwYWdlIGhlcm8gc2VjdGlvbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG4uaW5kZXhPZignZnJlZS10cmlhbCcpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBuLmluZGV4T2YoJy10ZXN0bWVldGluZycpID4gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICd0ZXN0IG1lZXRpbmcgbGFuZGluZyBwYWdlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSAnZGcgbGFuZGluZyBwYWdlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBuLmluZGV4T2YoJy93aHktd2ViZXgvaW5kZXgnKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYyA9PT0gJ21vZHVsZTInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSAnd2h5IHdlYmV4IHNlY3Rpb24gMic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBjID09PSAnbW9kdWxlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gJ3doeSB3ZWJleCBsYXN0IHNlY3Rpb24nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG4uaW5kZXhPZignL3RoZS1mdXR1cmUtb2Ytd29yaycpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBjID09PSAnc2VjdGlvbjYtYnRuLWJveCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydiA9ICdmdXR1cmUgb2Ygd29yayBsYXN0IHNlY3Rpb24nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldFZhcignZnJlZVRyaWFsVmFsdWUnLCBydik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyODcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclZnJlZVRyaWFsVmFsdWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTc2JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdUcnkgTWVldGluZyBDbGljay10aHJ1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGYxYjljNjA1OWE5MTRlZTI4Y2M3YmFmMzkzNWU3N2Q3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaG90amFyIGZyZWUtdHJpYWwgLSA1NjY1MDEnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncHJpY2luZy9mcmVlLXRyaWFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICcoZnVuY3Rpb24oaCwgbywgdCwgaiwgYSwgcikge1xuICBoLmhqID1cbiAgICBoLmhqIHx8XG4gICAgZnVuY3Rpb24oKSB7XG4gICAgICAoaC5oai5xID0gaC5oai5xIHx8IFtdKS5wdXNoKGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgaC5faGpTZXR0aW5ncyA9IHsgaGppZDogNTY2NTAxLCBoanN2OiA2IH07XG4gIGEgPSBvLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07XG4gIHIgPSBvLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO1xuICByLmFzeW5jID0gMTtcbiAgci5zcmMgPSB0ICsgaC5faGpTZXR0aW5ncy5oamlkICsgaiArIGguX2hqU2V0dGluZ3MuaGpzdjtcbiAgYS5hcHBlbmRDaGlsZChyKTtcbn0pKHdpbmRvdywgZG9jdW1lbnQsICJodHRwczovL3N0YXRpYy5ob3RqYXIuY29tL2MvaG90amFyLSIsICIuanM/c3Y9Iik7XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw0NzYxODdkZmRiZTE0YzI4YWJiNDY5Njg1YTViNzZiNycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Vzc2VudGlhbCB8IGdldHRpbmcgc3RhcnRlZCBhZG1pbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICdhPmltZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdnZXQtc3RhcnRlZC1hZG1pbi5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZG9tYWlucyc6IFsnd2ViZXguY29tJ10gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOiV0aGlzLmNsYXNzTmFtZSU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXRoaXMuY2xhc3NOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMWNkMTI1Y2ZkOTdiNDc3M2FiYTg0ZDZjYjcyZDU1YmEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdVUyAtIFByaWNpbmcgUGFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJy9wcmljaW5nL2luZGV4Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW5zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Npc2NvLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbihoLG8sdCxqLGEscil7XG5oLmhqPWguaGp8fGZ1bmN0aW9uKCl7KGguaGoucT1oLmhqLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9O1xuaC5faGpTZXR0aW5ncz17aGppZDo1NjY1MDEsaGpzdjo2fTtcbmE9by5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ2hlYWRcJylbMF07XG5yPW8uY3JlYXRlRWxlbWVudChcJ3NjcmlwdFwnKTtyLmFzeW5jPTE7XG5yLnNyYz10K2guX2hqU2V0dGluZ3MuaGppZCtqK2guX2hqU2V0dGluZ3MuaGpzdjtcbmEuYXBwZW5kQ2hpbGQocik7XG59KSh3aW5kb3csZG9jdW1lbnQsXCdodHRwczovL3N0YXRpYy5ob3RqYXIuY29tL2MvaG90amFyLVwnLFwnLmpzP3N2PVwnKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxjN2Q1NDRjZjIxMTk0NzlhODk3YTMyYmRlNDFjOTc2NScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0FwcER5bmFtaWNzIFRyYWNrZXInLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiAxMDkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXFwvbGJ4XFwvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ3ZhbHVlJzogJy93ZWJleGZyb21zZXJ2aWNlcHJvdmlkZXJzLXN1cHBvcnQuaHRtbCcgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdjYXJ0LndlYmV4LmNvbXxwdXJjaGFzZS53ZWJleC5jb218cHVyY2hhc2UtaW50LndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJzxzY3JpcHQgY2hhcnNldD0iVVRGLTgiPlxuaWYgKC9cXC9cXC9vcmlnaW4td2ViZXgtW2Etel0rXFwuY2lzY29cXC5jb20vaS50ZXN0KGRvY3VtZW50LnJlZmVycmVyKSkge1xuICBfc2F0ZWxsaXRlLmNvb2tpZS5zZXQoXCdhZW1lbnZcJywgXCd0ZXN0XCcpO1xufSBlbHNlIGlmICgvXFwvXFwvd3d3XFwud2ViZXhcXC5jb20vaS50ZXN0KGRvY3VtZW50LnJlZmVycmVyKSkge1xuICBfc2F0ZWxsaXRlLmNvb2tpZS5zZXQoXCdhZW1lbnZcJywgXCdwcm9kXCcpO1xufVxuIFxud2luZG93W1wnYWRydW0tc3RhcnQtdGltZVwnXSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuKGZ1bmN0aW9uKGNvbmZpZyl7XG4gICAgY29uZmlnLmFwcEtleSA9IChfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoXCdhZW1lbnZcJykgPT09IFwndGVzdFwnKSA/IFwnQUQtQUFCLUFBUi1VS1dcJyA6IFwnQUQtQUFCLUFBTS1BQlNcJztcbiAgICBjb25maWcuYWRydW1FeHRVcmxIdHRwID0gXCdodHRwOi8vY2RuLmFwcGR5bmFtaWNzLmNvbVwnO1xuICAgIGNvbmZpZy5hZHJ1bUV4dFVybEh0dHBzID0gXCdodHRwczovL2Nkbi5hcHBkeW5hbWljcy5jb21cJztcbiAgICBjb25maWcuYmVhY29uVXJsSHR0cCA9IFwnaHR0cDovL2NvbC5ldW0tYXBwZHluYW1pY3MuY29tXCc7XG4gICAgY29uZmlnLmJlYWNvblVybEh0dHBzID0gXCdodHRwczovL2NvbC5ldW0tYXBwZHluYW1pY3MuY29tXCc7XG4gICAgY29uZmlnLnhkID0ge2VuYWJsZSA6IHRydWV9O1xufSkod2luZG93W1wnYWRydW0tY29uZmlnXCddIHx8ICh3aW5kb3dbXCdhZHJ1bS1jb25maWdcJ10gPSB7fSkpO1xuaWYgKFwnaHR0cHM6XCcgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sKSB7XG4gICAgZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoXCclM0NzY3JpcHRcJylcbiArICIgc3JjPVwnaHR0cHM6Ly9jZG4uYXBwZHluYW1pY3MuY29tL2FkcnVtL2FkcnVtLTQuNC4zLjcxNy5qc1wnICJcbiArICIgdHlwZT1cJ3RleHQvamF2YXNjcmlwdFwnIGNoYXJzZXQ9XCdVVEYtOFwnIiBcbiArIHVuZXNjYXBlKFwnJTNFJTNDL3NjcmlwdCUzRVwnKSk7XG59IGVsc2Uge1xuICAgIGRvY3VtZW50LndyaXRlKHVuZXNjYXBlKFwnJTNDc2NyaXB0XCcpXG4gKyAiIHNyYz1cJ2h0dHA6Ly9jZG4uYXBwZHluYW1pY3MuY29tL2FkcnVtL2FkcnVtLTQuNC4zLjcxNy5qc1wnICJcbiArICIgdHlwZT1cJ3RleHQvamF2YXNjcmlwdFwnIGNoYXJzZXQ9XCdVVEYtOFwnIiBcbiArIHVuZXNjYXBlKFwnJTNFJTNDL3NjcmlwdCUzRVwnKSk7XG59XG5cbjwvc2NyaXB0PicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDFmYTcwNjZjZWViMjQ4ZDY4MzZlNTA1YTg4MjI4Mjk4JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnV2ViRXggTWVldGluZ3MgRnJlZSBUcmlhbCBJbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL3ByaWNpbmcvaW5mby5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaXNjby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Npc2Nvc3BhcmsuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21TZXR1cCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmdldFRpbWVUb0NvbXBsZXRlKCdzdGFydCcsICdndHRjbG9hZGluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE0OCcgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbihoLG8sdCxqLGEscil7XG5oLmhqPWguaGp8fGZ1bmN0aW9uKCl7KGguaGoucT1oLmhqLnF8fFtdKS5wdXNoKGFyZ3VtZW50cyl9O1xuaC5faGpTZXR0aW5ncz17aGppZDo1NjY1MDEsaGpzdjo2fTtcbmE9by5nZXRFbGVtZW50c0J5VGFnTmFtZShcJ2hlYWRcJylbMF07XG5yPW8uY3JlYXRlRWxlbWVudChcJ3NjcmlwdFwnKTtyLmFzeW5jPTE7XG5yLnNyYz10K2guX2hqU2V0dGluZ3MuaGppZCtqK2guX2hqU2V0dGluZ3MuaGpzdjtcbmEuYXBwZW5kQ2hpbGQocik7XG59KSh3aW5kb3csZG9jdW1lbnQsXCdodHRwczovL3N0YXRpYy5ob3RqYXIuY29tL2MvaG90amFyLVwnLFwnLmpzP3N2PVwnKTsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMjI0ZGJlMDEwNWZmNGRmZDhlZmI4ODJjNzgxYjMwZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdTcGFyayBQdXJjaGFzZSAtIFByb2R1Y3QgVmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0RSIFNob3BwaW5nIENhcnQgLSBQYWdlIFR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnU2hvcHBpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAndHJhY2tlclByb3BlcnRpZXMnOiB7ICdwYWdlTmFtZSc6ICd3eDp1czpkci1zaG9wcGluZy1jYXJ0OnByb2R1Y3QtdmlldycgfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxkOGRlNWM2MWU5MGI0NGFmOTk1MzM1MTk5ODcxN2JmMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZXIC0gaG9tZXBhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcuaG9tZS10YWtlLXN1cnZleSBhLnN1cnZleS1hY3Rpb24sYVtocmVmKj0idXNlLndlYmV4LmNvbSJdLC5ob21lcGFnZS1sZWFybi1tb3JlIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmdXR1cmVvZndvcmtcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJHxeKC9pbmRleC5odG1sKSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYnV0dG9uOnNlY3Rpb246JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDdkYmJjMmJiOGI1YTRlODE4NDQ5YjVkYzExNjNjZmM5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTUMrU3BhcmsgQ2hhbmdlIE9yZGVyIFBhZ2UgTG9hZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL2J1eS9vcmRlci5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL2J1eS9uZXctb3JkZXIuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICd3YnhvZmZlckZsYWc9dXBncmFkZTtleHBpcmVzPTA7ZG9tYWluPS53ZWJleC5jb207cGF0aD0vJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjc3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJWN1cnJlbnREaXNwbGF5TmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZU5hbWUnOiAnd3g6bWMtc3Bhcms6Y2hhbmdlLW9yZGVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNmMyYjQyZDMxZDEyNDM3NzkwM2FjNGNhNDlkMzA4NWInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEUiBQdXJjaGFzZSAtIENvbmZpcm1hdGlvbiBQYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ15UaGFua1lvdVBhZ2UkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2J1eVxcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21TZXR1cCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnByb2R1Y3RzID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0RSIFNob3BwaW5nIENhcnQgLSBDb25maXJtYXRpb24gUHJvZHVjdHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDM0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJURSIFNob3BwaW5nIENhcnQgLSBPcmRlciBJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A3MScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVEUiBTaG9wcGluZyBDYXJ0IC0gUGF5bWVudCBNb2RhbGl0eSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwdXJjaGFzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclRFIgU2hvcHBpbmcgQ2FydCAtIE9yZGVyIElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXZlbnQxMTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJURSIFNob3BwaW5nIENhcnQgLSBPcmRlciBJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICduYW1lJzogJ2V2ZW50MTYnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAnbmFtZSc6ICdldmVudDEwMScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICduYW1lJzogJ2V2ZW50MTAyJyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhZ2VOYW1lJzogJ3d4OmRyLXNob3BwaW5nLWNhcnQ6cHVyY2hhc2UtY29uZmlybWF0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAndmFyIHNwa09mZmVyZiA9IF9zYXRlbGxpdGUuY29va2llLmdldChcJ29mZmVyRmxhZ1wnKTtcbnN3aXRjaChzcGtPZmZlcmYpe1xuIGNhc2UgXCdkaXJlY3RcJzpcblx0XHRfc2F0ZWxsaXRlLnRyYWNrKFwnc3BhcmstZGlyZWN0LXB1cmNoYXNlLXBpeGVsc1wnKTtcbiAgICBicmVhaztcbiBjYXNlIFwndXBncmFkZVwnOlxuICAgX3NhdGVsbGl0ZS50cmFjayhcJ3NwYXJrLWYycC1wdXJjaGFzZS1waXhlbHNcJyk7XG4gICBicmVhaztcbiBjYXNlIFwnY2hhbmdlXCc6XG4gICAgYnJlYWs7XG4gZGVmYXVsdFx0OlxuICBcdGJyZWFrO1xufVxuXG5cbnZhciB3YnhPZmZlcmYgPSBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoXCd3YnhvZmZlckZsYWdcJylcbnN3aXRjaCh3YnhPZmZlcmYpe1xuY2FzZSBcJ2RpcmVjdFwnOlxuX3NhdGVsbGl0ZS50cmFjayhcJ3dieC1kaXJlY3QtcHVyY2hhc2UtcGl4ZWxzXCcpO1xuICAgIHZhciBleGRhdGU9bmV3IERhdGUoKTsgXG5leGRhdGUuc2V0RGF0ZShleGRhdGUuZ2V0RGF0ZSgpICsgMTgwKTtkb2N1bWVudC5jb29raWU9Im1jLXNwYXJrPWRpcmVjdC1wdXJjaGFzZTsgZXhwaXJlcz0iICsgZXhkYXRlLnRvVVRDU3RyaW5nKCkgKyAiOyBwYXRoPS87IGRvbWFpbj0ud2ViZXguY29tIjtcbmJyZWFrO1xuY2FzZSBcJ3VwZ3JhZGVcJzpcbl9zYXRlbGxpdGUudHJhY2soXCd3YngtZjJwLXB1cmNoYXNlLXBpeGVsc1wnKTtcbiAgICB2YXIgZXhkYXRlPW5ldyBEYXRlKCk7IFxuZXhkYXRlLnNldERhdGUoZXhkYXRlLmdldERhdGUoKSArIDE4MCk7ZG9jdW1lbnQuY29va2llPSJtYy1zcGFyaz11cGdyYWRlLXB1cmNoYXNlOyBleHBpcmVzPSIgKyBleGRhdGUudG9VVENTdHJpbmcoKSArICI7IHBhdGg9LzsgZG9tYWluPS53ZWJleC5jb20iO1xuYnJlYWs7XG5jYXNlIFwnY2hhbmdlXCc6XG5icmVhaztcbmRlZmF1bHRcdDpcbmJyZWFrO1xufScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJy8qYWRvYmUudGFyZ2V0LnRyYWNrRXZlbnQoeyBcblx0bWJveDogXCdvcmRlckNvbmZpcm10aW9uXCcsXG5cdHBhcmFtczoge1xuXHRcdHByb2R1Y3RQdXJjaGFzZWRJZDogX3NhdGVsbGl0ZS5nZXRWYXIoIFwnRFIgU2hvcHBpbmcgQ2FydCAtIFByb2R1Y3QgSURcJyApLFxuXHRcdG9yZGVyVG90YWw6IF9zYXRlbGxpdGUuZ2V0VmFyKCBcJ0RSIFNob3BwaW5nIENhcnQgLSBPcmRlciBUb3RhbFwnICksXG5cdFx0b3JkZXJJZDogX3NhdGVsbGl0ZS5nZXRWYXIoIFwnRFIgU2hvcHBpbmcgQ2FydCAtIE9yZGVyIElEXCcgKSxcbiAgICAgICAgYmlsbGluZ01vZGU6IF9zYXRlbGxpdGUuZ2V0VmFyKCBcJ3B1cmNoYXNlZF9iaWxsaW5nX21vZGVcJyApXG5cdH1cbn0pO1xuKi8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNjVjMDRhYzUyMTYyNDhkODk0YTJkN2ZiY2ZjMDdkZjUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdQcmljaW5nIHBhZ2UgcGxhbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC9wcmljaW5nXFwvaW5kZXhcXC5odG1sfFxcL3ByaWNpbmdcXC9pbmRleDRcXC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYodHlwZW9mICQhPT0idW5kZWZpbmVkIil7JCgiI2J1eXN0YXJ0ZXIsI2J1eXBsdXMsI2J1eWJ1cyIpLmNsaWNrKGZ1bmN0aW9uKCl7dmFyIGdldFBsPSQodGhpcykucGFyZW50cygiLm9mZmVyLXBsYW4tYm94IikuZmluZCgiLnBsYW4tbmFtZSIpLnRleHQoKTt2YXIgYlBsYW49JCgiLm9mZmVyLXBsYW4tY29udGFpbiIpLmF0dHIoImNsYXNzIikuc2VhcmNoKCJtb250aCIpO3ZhciBiT3B0aW9uO2lmKGJQbGFuPi0xKWJPcHRpb249Im1vbnRobHkiO2Vsc2UgYk9wdGlvbj0iYW5udWFsIjtDbGtQbG5UcmsodGhpcywiZXZlbnQxODEiLCJidXR0b246c2VjdGlvbjoiLGJPcHRpb24rIi1wbGFuOiIrZ2V0UGwrIjpidXkgbm93IixiT3B0aW9uLGdldFBsKX0pOyQoIiNlbnQxIC5vZmZlci1idG4tY3RhIikuY2xpY2soZnVuY3Rpb24oKXt2YXIgZ2V0UGw9JCh0aGlzKS5wYXJlbnRzKCIub2ZmZXItcGxhbi1ib3giKS5maW5kKCIucGxhbi1uYW1lIikudGV4dCgpO1xudmFyIGJQbGFuPSQoIi5vZmZlci1wbGFuLWNvbnRhaW4iKS5hdHRyKCJjbGFzcyIpLnNlYXJjaCgibW9udGgiKTt2YXIgYk9wdGlvbjtpZihiUGxhbj4tMSliT3B0aW9uPSJtb250aGx5IjtlbHNlIGJPcHRpb249ImFubnVhbCI7aWYoZG9jdW1lbnQuVVJMLmluZGV4T2YoImluZGV4Lmh0bWwiKT4tMSlDbGtQbG5UcmsodGhpcywiZXZlbnQxODEiLCJidXR0b246c2VjdGlvbjoiLGJPcHRpb24rIi1wbGFuOiIrZ2V0UGwrIjpzaWduIHVwIixiT3B0aW9uLGdldFBsKTtlbHNlIENsa1BsblRyayh0aGlzLCJldmVudDE4MSIsImJ1dHRvbjpzZWN0aW9uOiIsYk9wdGlvbisiLXBsYW46IitnZXRQbCsiOmNhbGwgbm93IixiT3B0aW9uLGdldFBsKX0pOyQoIi5vZmZlci1wYWdlLnNlYy0zIC5zcGFyay10aXRsZSIpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImxpbms6c2VjdGlvbjoiLCJTZWUtYWxsLXRlYW1zLWZlYXR1cmUiKX0pOyQoIi5tYy1tb3JlLWluZm8gLnRjLWVjIGEiKS5jbGljayhmdW5jdGlvbigpe0xuVHJrRXZlbnQodGhpcyxcbiJldmVudDE4MSIsImJ1dHRvbjpzZWN0aW9uOndlYmV4LWV2ZW50OiIsImNvbnRhY3Qgc2FsZXMiKX0pOyQoIi5tYy1tb3JlLWluZm8gLnd4LWVkdSBhIikuY2xpY2soZnVuY3Rpb24oKXtMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwiYnV0dG9uOnNlY3Rpb246d2ViZXgtZWR1OiIsImNvbnRhY3Qgc2FsZXMiKX0pOyQoXCcudG91Y2gtdHlwZSAudG91Y2gtYnRuIGFbaHJlZio9ImNvbnRhY3Qtc2FsZSJdXCcpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImJ1dHRvbjpzZWN0aW9uOnRhbGstc3BlY2lhbGlzdDoiLCJjb250YWN0IHNhbGVzIil9KTskKFwnLnRvdWNoLXR5cGUgLnRvdWNoLWJ0biBhW2hyZWYqPSJjaXNjby5jb20vY29udGFjdCJdXCcpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImJ1dHRvbjpzZWN0aW9uOmdldC1zdXBwb3J0OiIsImNvbnRhY3Qgc2FsZXMiKX0pOyQoIi50b3VjaC1zdWJ0aXRsZSBhLmdsb2JhbC1zYWxlcyIpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLFxuImV2ZW50MTgxIiwibGluazpzZWN0aW9uOnRhbGstc3BlY2lhbGlzdDoiLCJjYWxsIHVzIil9KTskKCIuYmx1ZS1tb2R1bGUgYSIpLmNsaWNrKGZ1bmN0aW9uKCl7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImJ1dHRvbjpzZWN0aW9uOmJsdWUtbW9kdWxlOiIsImNvbnRhY3QgdXMiKX0pOyQoIi5xdWUtdGl0bGUiKS5jbGljayhmdW5jdGlvbigpe3ZhciBsdD0kKHRoaXMpLnRleHQoKS50cmltKCkudG9Mb3dlckNhc2UoKTtsdD1sdC5zdWJzdHJpbmcoMCw1MCk7TG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImxpbms6c2VjdGlvbjpxdWVzdGlvbjoiLGx0KX0pOyQoIi5mZWF0dXJlcy1tb3JlIikuY2xpY2soZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKTt2YXIgdGV4dD0kdGhpcy50ZXh0KCk7dmFyIGhlYWQ9JHRoaXMucGFyZW50cygiLm9mZmVyLXBsYW4tYm94LWRldGFpbCIpLnNpYmxpbmdzKCIub2ZmZXItcGxhbi1ib3giKS5maW5kKCIucGxhbi1uYW1lIikudGV4dCgpO1xuTG5UcmtFdmVudCh0aGlzLCJldmVudDE4MSIsImxpbms6YWNjb3JkOiIraGVhZCsiOiIsdGV4dCl9KX19LDQwMCk7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZWIxNjIwNzMyODJmNDM1MmJjNWIwM2Y0NGIyOTJmZmQnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwdXJjaGFzZSB8IGRiIDIuMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGlzdG9yeUNoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhbHVlQ29tcGFyaXNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFyaXNvbic6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVyYXRvcic6ICdtYXRjaGVzUmVnZXgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nhc2VJbnNlbnNpdGl2ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlZnRPcGVyYW5kJzogJyVzX3VybCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmlnaHRPcGVyYW5kJzogJ3B1cmNoYXNlLndlYmV4LmNvbXxwdXJjaGFzZS1pbnQud2ViZXguY29tJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzBjMzgyOTlhOWY2ZTQ2MWE5M2EzMjkwN2M1ZjU3NGVkLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMN2VmYzExOTE0ZTFmNDJiMGI2YWE0NzNhZmE2YWZiYjEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdDYXJ0IHwgc3RlcCAxIHwgIFByb2R1Y3Qgc2VsZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9lbGVtZW50RXhpc3RzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdlbGVtZW50U2VsZWN0b3InOiAnI2FjY291bnRDcmVhdGVCdXknIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDExMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC9wcmljaW5nXFwvY2FydFxcLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3LndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQ2Y5MzZhYjUyYjRkZjQxMmZhOTk2MWMyM2JmZGZjZmY3LXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMODIwOTk1MDA4ZDQ4NDI3M2E5YTZhZTY3NjJlYjZmMmYnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdPcmRlclN0YXR1c1RpbWVTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGlzdG9yeUNoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDIwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ29yZGVyLXN0YXR1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdjYXJ0LndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzcxYWVkMGEzZThlNzRiYjhiNzVlZmM4OTYxMzc5YzVkLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZTFhNDQzNzIzNTVhNDcxZDliMWRiZGUzOGI0NGYzMmInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVyAtIE5hdmlnYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjbW9iaWxlLW1lbnUtdG9nZ2xlciBhLC5oZWFkZXJfX21lbnUgYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmdXR1cmVvZndvcmtcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2hlYWRlcjpuYXY6JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNzInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICduYW1lJzogJ2V2ZW50MTc4JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxODEnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMTI5Yjk4NmQzMzQyNDk4NTgzODMyZDYxYjI3NWIwYjAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVyBGb290ZXItY2xpY2tzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnI2Zvb3Rlci1tb2JpbGUtbWVudS10b2dnbGVyIC5ib3R0b20tc2VjdGlvbi1jb2x1bW5zX19jYXRlZ29yaWVzIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Z1dHVyZW9md29ya1xcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZm9vdGVyOmxpbms6JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNzMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICduYW1lJzogJ2V2ZW50MTc5JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxODEnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vN2NkNTU0OWM3MThjL2IyMjkzYjU2OWU0OS9hYWQ4MjZmOTJiNGUvUkNiNDg0ZGE2ZjRmYTY0OGE4OGU3OGMwMGNmOTZlNGQzNy1zb3VyY2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVybmFsJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw2ZWJhMmFhZTY5OTk0OGU1ODViYzk1YjQ1ZDdlYmM5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ludGVybmFsIFNlYXJjaCAoQ29weSknLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2VudGVyc1ZpZXdwb3J0LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnZGl2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRQcm9wZXJ0aWVzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdjbGFzc05hbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdyZXN1bHRzLWJveCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclSW50ZXJuYWwgU2VhcmNoIEtleXdvcmQlIDogJU51bWJlciBvZiBTZWFyY2ggUmVzdWx0cyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMjknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclSW50ZXJuYWwgU2VhcmNoIEtleXdvcmQlIDogJU51bWJlciBvZiBTZWFyY2ggUmVzdWx0cyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnSW50ZXJuYWwgU2VhcmNoIFBlcmZvcm1lZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw3NTJjZDQzM2YzMjM0YWJmOWRhODM5OTViMjA1OWE1MycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1BMIC0gQUVNIC0gR29vZ2xlIEFuYWx5dGljcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2RvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZG9tYWlucyc6IFsnd2ViZXguY29tJ10gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICded3d3XFwuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcLyhsYnh8cG9zdC1tZWV0aW5nKVxcLycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyhlbWFpbHxGTnxMTnxwX3VybHx1c2VyX2NpX3V1aWQpPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICc8IS0tIEdsb2JhbCBzaXRlIHRhZyAoZ3RhZy5qcykgLSBHb29nbGUgQW5hbHl0aWNzIC0tPlxuPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9VUEtNTg0NTM4LTEiPjwvc2NyaXB0PlxuPHNjcmlwdD5cbndpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdO1xuZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fVxuZ3RhZyhcJ2pzXCcsIG5ldyBEYXRlKCkpO1xuXG5ndGFnKFwnY29uZmlnXCcsIFwnVUEtNTg0NTM4LTFcJyk7XG48L3NjcmlwdD4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw0NmRhZWFkMTIzOGY0M2FkOTE5MThmNWIzMGI3ZTgzZScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZUIC0gSW5jb3JyZWN0IFBpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICdJbnZhbGlkUGluJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0cmFja2VyUHJvcGVydGllcyc6IHsgJ3BhZ2VOYW1lJzogJ3d4OmZyZWUtdHJpYWw6cGluLWNoZWNrOmluY29ycmVjdC1waW4nIH0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ3R5cGUnOiAncGFnZScgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDZjMwYTA1YzNiODc0NDlmNjg0MmY2NTJhZjA3NmNkOTQtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZWRiOGFjZjNiYjQzNDYzZGFiNzFmMTQ2NzBkNDkyOWUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVy4gRm9vdGVyIC0gU29jaWFsIGxpbmtzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnZm9vdGVyIC5zb2NpYWwtaWNvbnMgYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZnV0dXJlb2Z3b3JrXFwud2ViZXhcXC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmb290ZXI6c3ZnOiV0aGlzLmdldEF0dHJpYnV0ZShhcmlhLWxhYmVsKSU6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjkyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXRoaXMuZ2V0QXR0cmlidXRlKGFyaWEtbGFiZWwpJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyOTInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICduYW1lJzogJ2V2ZW50MTgxJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxODAnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuZ2V0QXR0cmlidXRlKHRpdGxlKSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMTdkZjZmMjgwNjg1NGJlNGIzZDE5MGJjZjYxNGQ3MDAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCBnZXQtc3RhcnRlZCB8IGNsaWNrIHRyYWNraW5nIGhvbWVwYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnYS5pY29uLWxpbmsuYXJyb3csYS5waWxsLWxpbmsud2hpdGUsYS5waWxsLWxpbmsuYmx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Vzc2VudGlhbHMud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NlY3Rpb246JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDg4NGUwYTI0ODE4OTQ4ZTI5Njg5Y2VmZDgwMTE2ZDVjJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnUEwgLSBBRU0gfCBjbGljayB0cmFja2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDcwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnb3JpZ2luLXdlYmV4LShkZXZ8cWF8bHR8c2J8c3RnfHVhdClcXC5jaXNjb1xcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3d3dy1hdXRoLXdlYmV4LmNpc2NvLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3dieGFwcC1wdWItcHJkMi0wMTo0NTAzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd3d3XFwud2ViZXhcXC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAndmFyIHdlYmV4ID0gd2ViZXggfHwge307XG53ZWJleC51dGlsID0gd2ViZXgudXRpbCB8fCB7fTtcbndlYmV4LnV0aWwuY2xpY2sgPSAoZnVuY3Rpb24oKSB7XG4gIHZhciBjbGlja2FibGVzO1xuICB2YXIgY2xpY2tFdmVudE5hbWUgPSBcJ3d4X2NsaWNrZWRcJztcbiAgdmFyIHV0aWxVUkwgPSB3ZWJleC51dGlsLmRhdGEudXRpbFVSTDtcbiAgdmFyIHBhZ2VWaWV3ID0gd2ViZXgudXRpbC5kYXRhLmdhdGhlcmVkLnBhZ2VWaWV3ZWRFdmVudFByb3BlcnRpZXM7XG5cbiAgdmFyIG9uQ2xpY2sgPSBmdW5jdGlvbihldmVudCwgZXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KGNsaWNrRXZlbnROYW1lLCBldmVudFByb3BlcnRpZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIERvIG5vdGhpbmcuXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB2YXIgY29uZmlndXJlID0gZnVuY3Rpb24oZWwpIHtcbiAgICB2YXIgY2xpY2tJZCA9IGVsLmdldEF0dHJpYnV0ZShcJ2RhdGEtY2xpY2staWRcJyk7XG4gICAgdmFyIGRlc3RpbmF0aW9uID0gKHR5cGVvZiBlbC5ocmVmICE9PSBcJ3VuZGVmaW5lZFwnKSA/IHV0aWxVUkwuY2xlYW4oZWwuaHJlZikgOiBcJ1wnO1xuICAgIHZhciBldmVudFByb3BlcnRpZXMgPSB7XG4gICAgICBwYWdlX3VybDogcGFnZVZpZXcucGFnZV91cmwsXG4gICAgICBwYWdlX25hbWU6IHBhZ2VWaWV3LnBhZ2VfbmFtZSxcbiAgICAgIGNsaWNrX0lEOiBjbGlja0lkLFxuICAgICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uLFxuICAgIH07XG5cbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCdjbGlja1wnLFxuICAgICAgZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgb25DbGljayhlbCwgZXZlbnRQcm9wZXJ0aWVzKTtcbiAgICAgIH0sXG4gICAgICBmYWxzZVxuICAgICk7XG4gIH07XG5cbiAgdmFyIGdldENsaWNrYWJsZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2xpY2thYmxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCdbZGF0YS1jbGljay1pZF1cJyk7XG5cbiAgICByZXR1cm4gY2xpY2thYmxlcztcbiAgfTtcblxuICB2YXIgaW5pdCA9IChmdW5jdGlvbigpIHtcbiAgICBjbGlja2FibGVzID0gZ2V0Q2xpY2thYmxlcygpO1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoY2xpY2thYmxlcywgY29uZmlndXJlKTtcbiAgfSkoKTtcblxuICByZXR1cm4ge1xuICAgIGNvbmZpZ3VyZTogY29uZmlndXJlLFxuICB9O1xufSkoKTtcbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDg4MjY3MmQ0MGM0NDQ0NzM5ZTZkZTFiMGYxMDdiYzlhJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnTWFpbnRlbmFuY2UgUGFnZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL21haW50ZW5hbmNlc3VwcG9ydC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AzMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVSZWZlcnJlciUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGI3MmNkODQyNWFmMTQ1MDI4ZmRiMTc2N2Q1MzU1MmQ2JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnY29sbGFib3JhdGlvbiBwYWdlIHwgYWNjb3JkaW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5jaXJjbGUtdGl0bGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3RoZS1mdXR1cmUtb2Ytd29yay5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjphY2NvcmRpb246JXRoaXMuQGNsZWFuVGV4dCU6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMWY1MTVlMWI2MDU3NDU4YmI4NGNlYjRiMjJhNzAwYjYnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCBuZXcgd2ViZXggfCBib3ggfGNsaWNrIHRyYWNraW5nIGhvbWVwYWdlIGpvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJyN1cGRhdGUtcHJvZ3JhbS1qb3AgYS5waWxsLWxpbmsud2hpdGUtYmxhY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlc3NlbnRpYWxzLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOnVwZGF0ZS1wcm9ncmFtLWpvcDoldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd1cGRhdGUtcHJvZ3JhbS1qb3A6JXRoaXMuQGNsZWFuVGV4dCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDc0NmM0ZGQyM2Q1YTQ3Y2E5ZmY2ZjdkMzE4MDhlZDk3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXNzZW50aWFsIHwgbmV3IHdlYmV4IHwgYm94IHxjbGljayB0cmFja2luZyBob21lcGFnZSB3bScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJyN1cGRhdGUtcHJvZ3JhbS13bSBhLnBpbGwtbGluay53aGl0ZS1ibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Vzc2VudGlhbHMud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NlY3Rpb246dXBkYXRlLXByb2dyYW0td206JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAndXBkYXRlLXByb2dyYW0td206JXRoaXMuQGNsZWFuVGV4dCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDY2ZGNlY2Y2ZDJlMTQyNmFiYWI2MTcwZDExNzQzNjkzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRlQgLSBSZS1lbnRlciBlbWFpbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICdyZUVudGVyRW1haWwnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjpsaW5rOnJlLWVudGVyLWVtYWlsOiVwYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3JlLWVudGVyLWVtYWlsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlTmFtZSc6ICd3eDpmcmVlLXRyaWFsOnJlLWVudGVyLWVtYWlsJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdzZWN0aW9uOmxpbms6cmUtZW50ZXItZW1haWw6JXBhZ2VOYW1lJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxmNjU3NjhlZTVkYzY0MjhjOGQ1OWI3NzBjN2M1MTI5MicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZXIC0gaG9tZXBhZ2UgZWJvb2snLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICdhW2hyZWYqPSJlYm9va3MuY2lzY28uY29tIl0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdmdXR1cmVvZndvcmtcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJHxeKC9pbmRleC5odG1sKSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBndCA9IHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG5rQ2xrTiA9IGd0LnJlcGxhY2UobG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgJ2Vib29rcy5jaXNjby5jb20vJywgJycpLnJlcGxhY2UoL1wvJC8sICcnKS5yZXBsYWNlKCcvJywgJzonKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsbmtDbGtOICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0VmFyKCdsaW5rTmFtZScsIGxua0Nsa04pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b21TZXR1cCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmV2ZW50cyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucHJvcDEwID0gcy5wcm9wMTEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQ3MCcgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnZS1ib29rOiVsaW5rTmFtZSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZmIzMTJkODMwM2QyNGFkNzllZmFlNDUxZTE3YjRiMDUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB1cGRhdGUtcHJvZ3JhbSB3aXRoIG1lZXRpbmdzIHwgY2xpY2sgdHJhY2tpbmcgJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLm1haW4tY29udGVudCBhLnBpbGwtbGluaywubWFpbi1jb250ZW50IGEuaWNvbi1saW5rLmFycm93LC5tYWluLWNvbnRlbnQgYS5pY29uLWxpbmsuY2hlY2ssLm1haW4tY29udGVudCBhLmljb24tbGluay52aWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdcXC91cGRhdGUtcHJvZ3JhbVxcL3xcXC9tZWV0aW5ncy11cGRhdGVcXC98d2VsY29tZVxcL2VuZC11c2VyXFwvc3RlcHxtaWdyYXRpb25cXC9lbmQtdXNlclxcL3N0ZXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjoldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNDRlYWFjNmQyNmJmNDA0ZWFjOGYwMzY1NDVlZTljZDEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCBuYXZpZ2F0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLm5hdi1kcm9wZG93biBhLCNuYXYtY29tbXVuaXRpZXMgYSwjbmF2LWhlbHAtY2VudGVyIGEsI25hdi1yZXNvdXJjZXMgYSwjbmF2LWFkb3B0aW9uIGEsI25hdi1sZWFybiBhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Vzc2VudGlhbHMud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnbmF2OiV0aGlzLkBjbGVhblRleHQlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ25hdjoldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnbmF2OiV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDAwNTU4ODEwODFjYTQ4ZmFiMzQwZjJkYmFlODU5NjVlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXNzZW50aWFsIHwgYWRvcHRpb24gfCBjbGljayB0cmFja2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5tYWluLWNvbnRlbnQgYS5waWxsLWxpbmsuYnV0dG9uLXdoaXRlLXNvbGlkLC50b3BDb250ZW50Q29udGFpbmVyIC5hZG9wdGlvbkJ1dHRvbiBhLC5tYWluLWNvbnRlbnQgYS5waWxsLWxpbmsuYnV0dG9uLWJsYWNrLWNsZWFyLC5tYWluLWNvbnRlbnQgYS5waWxsLWxpbmsud2hpdGUtYmx1ZSxhLmljb24tbGluay5hcnJvdywudG9wTWFpbkJhbm5lciBhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1xcL2Fkb3B0aW9uLXRvb2xraXRzXFwuaHRtbHxcXC9qb3VybmV5LXRvLXdlYmV4XFwuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlc3NlbnRpYWxzLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOiV0aGlzLkBjbGVhblRleHQlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXIxMTcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5AY2xlYW5UZXh0JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxmMzY2N2QzMzIzMzQ0ZmQ3YTExZDBlMjA5YmFjZTUyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ZyZWUgdHJpYWwgMi4wJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9oaXN0b3J5Q2hhbmdlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFsdWVDb21wYXJpc29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZXJhdG9yJzogJ21hdGNoZXNSZWdleCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FzZUluc2Vuc2l0aXZlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVmdE9wZXJhbmQnOiAnJXNfdXJsJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaWdodE9wZXJhbmQnOiAnY2FydC53ZWJleC5jb20nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDM2U4ZjhiZGVhOGIzNDZkYWJkNGJjNzcxZTJiN2ExODgtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw5NmZjMDY3ZTc1MmQ0NTY1OGFlNTFhZGJmZDAwYTQ0NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1BMIC0gQUVNIGxvY2FsaXplZCAtIGNoYXQnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiAyMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbS5jbiddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeXFwvKChjb250YWN0LXNhbGVzfGluZGV4KVxcLmh0bWwpPyQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnY2hhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcwJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICc8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0gY2hhdCBiZWdpbiAtLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvY29udGVudC9kYW0vd2ViZXgvZW9waS9saWIvTGl2ZUFnZW50L2J1dHRvbi5jc3MiIC8+XG48c2NyaXB0PlxuICB2YXIgeGhyO1xuICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgLy8gTW96aWxsYSwgU2FmYXJpLi4uXG4gICAgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIH0gZWxzZSBpZiAod2luZG93LkFjdGl2ZVhPYmplY3QpIHtcbiAgICAvLyBJRVxuICAgIHhociA9IG5ldyBBY3RpdmVYT2JqZWN0KFwnTXN4bWwyLlhNTEhUVFBcJyk7XG4gIH1cbiAgeGhyLm9wZW4oXCdnZXRcJywgXCcvY29udGVudC9kYW0vd2ViZXgvZW9waS9saWIvTGl2ZUFnZW50L2J1ZmYtYm90LXdlYmV4LTAyMC1kLmpzXCcsIHRydWUpO1xuICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHhoci5yZWFkeVN0YXRlID09IDQpIHtcbiAgICAgIGlmICgoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMDApIHx8IHhoci5zdGF0dXMgPT0gMzA0KSB7XG4gICAgICAgIHZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpO1xuICAgICAgICBzY3JpcHQudHlwZSA9IFwndGV4dC9qYXZhc2NyaXB0XCc7XG4gICAgICAgIHNjcmlwdC50ZXh0ID0geGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgeGhyLnNlbmQobnVsbCk7XG48L3NjcmlwdD5cblxuPGRpdiBjbGFzcz0iYzJjLWNvbXBvbmVudCI+XG4gIDxkaXYgY2xhc3M9ImMyYy1hY3RpdmUiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5cbiAgICA8YVxuICAgICAgY2xhc3M9ImMyYy1idXR0b24iXG4gICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLWdyb3VwPSJzbV9sdWgiXG4gICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLXRpdGxlPSJyaWdodCByYWlsIlxuICAgICAgZGF0YS1jb25maWctbWV0cmljcy1pdGVtPSJDaGF0IE5vdyJcbiAgICAgIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiXG4gICAgPlxuICAgICAgPGltZ1xuICAgICAgICBzcmM9Imh0dHBzOi8vd3d3LndlYmV4LmNvbS9jb250ZW50L2RhbS93ZWJleC9lb3BpL0FtZXJpY2FzL1VTQS9lbl91cy9nbG9iYWwvaW1hZ2VzL2NoYXQvY2hhdC1idXR0b24tNjAtMS5wbmciXG4gICAgICAgIGFsdD0iIlxuICAgICAgICBjbGFzcz0iY2hhdC1pY29uIlxuICAgICAgLz5cbiAgICA8L2E+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPSJjMmMtaW5hY3RpdmUiPlxuICAgIDwhLS0gbm8gY2hhdCBhdmFpbGFibGUgLS0+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRE06Y29tcG9uZW50cy9sZXR1c2hlbHAvbGV0dXNoZWxwLWVvdDpWMi43LjMgLS0+XG5cbiAgPGRpdiBjbGFzcz0iZG1jLXByb2FjdGl2ZWNoYXQgZG1yIGMyYy1wcm9hY3RpdmUtbW9kYWwgIj5cbiAgICA8ZGl2IGNsYXNzPSJwcm9hYy1oZWFkIj5cbiAgICAgIDxkaXYgY2xhc3M9ImNpc2NvLWxvZ28iPlxuICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly93d3cuY2lzY28uY29tL2V0Yy9kZXNpZ25zL2NkYy9kbS9jaGF0L2Npc2NvLWxvZ28uc3ZnIiBhbHQ9IiIgdGl0bGU9IiIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz0icHJvYWMtY29udGVudCI+XG4gICAgICAgIDxwPkNoYXQgbGl2ZSB3aXRoIGEgQ2lzY28gcmVwcmVzZW50YXRpdmU8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9ImNpc2NvLWljb24iPlxuICAgICAgICA8YVxuICAgICAgICAgIGNsYXNzPSJjMmMtcHJvYWN0aXZlLWRpc21pc3MiXG4gICAgICAgICAgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIlxuICAgICAgICAgIGFsdD0iRGVjbGluZSB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIHRpdGxlPSJEZWNsaW5lIHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgZGF0YS1jb25maWctbWV0cmljcy1pdGVtPSJkZWNsaW5lIHRoZSBjaGF0IGludml0YXRpb24iXG4gICAgICAgICAgZGF0YS1jb25maWctbWV0cmljcy1ncm91cD0icG9wIHVwIGNoYXQiXG4gICAgICAgID5cbiAgICAgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly93d3cuY2lzY28uY29tL2V0Yy9kZXNpZ25zL2NkYy9kbS9jaGF0L2Nsb3NlLWljb24ucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz0icHJvYWMtY29udGFpbmVyIj5cbiAgICAgIDxwIGNsYXNzPSJjb250ZW50Ij5DaXNjbzo8L3A+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaT5XZWxjb21lIHRvIENpc2NvITwvbGk+XG4gICAgICAgIDxsaT5Ib3cgY2FuIEkgaGVscCB5b3U/PC9saT5cbiAgICAgIDwvdWw+XG4gICAgPC9kaXY+XG5cbiAgICA8dWwgY2xhc3M9ImN0YSI+XG4gICAgICA8bGk+XG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyJcbiAgICAgICAgICBhbHQ9IkRlY2xpbmUgdGhlIGNoYXQgaW52aXRhdGlvbiJcbiAgICAgICAgICB0aXRsZT0iRGVjbGluZSB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtaXRlbT0iZGVjbGluZSB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtZ3JvdXA9InBvcCB1cCBjaGF0IlxuICAgICAgICAgIGNsYXNzPSJkbWMtYnV0dG9uIGF0bGFudGljIHBhbC02IGMyYy1wcm9hY3RpdmUtZGlzbWlzcyJcbiAgICAgICAgICA+Tm8gVGhhbmtzPC9hXG4gICAgICAgID5cbiAgICAgIDwvbGk+XG4gICAgICA8bGk+XG4gICAgICAgIDxhXG4gICAgICAgICAgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyJcbiAgICAgICAgICBhbHQ9IkFjY2VwdCB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIHRpdGxlPSJBY2NlcHQgdGhlIGNoYXQgaW52aXRhdGlvbiJcbiAgICAgICAgICBkYXRhLWNvbmZpZy1tZXRyaWNzLWl0ZW09ImFjY2VwdCB0aGUgY2hhdCBpbnZpdGF0aW9uIlxuICAgICAgICAgIGRhdGEtY29uZmlnLW1ldHJpY3MtZ3JvdXA9InBvcCB1cCBjaGF0IlxuICAgICAgICAgIGNsYXNzPSJkbWMtYnV0dG9uIGF0bGFudGljIHBhbC00IGMyYy1wcm9hY3RpdmUtYWdyZWUiXG4gICAgICAgICAgPkNoYXQgTm93PC9hXG4gICAgICAgID5cbiAgICAgIDwvbGk+XG4gICAgPC91bD5cbiAgPC9kaXY+XG48L2Rpdj5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG48IS0tIGNoYXQgZW5kIC0tPlxuPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cbjwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw1OTE0NGQ4NjBhZWQ0YjM2OTdhZjcyYzQzYjdiYmYzNicsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2hwLSBidG4yJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmZpcnN0LWJhbm5lci1sZWZ0IC5oZXJvLWJ0bjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDEwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3cud2ViZXguY29tfHd3dy53ZWJleC5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tU2V0dXAnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VsQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbENvdW50cnkgPSAkKCcud2J4LXJlZ2lvbi1uYW1lJykudGV4dCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbENvdW50cnkgPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxDb3VudHJ5ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhbXBsaXR1ZGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldl9wID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1dHRvbl9uYW1lJzogJ3N0YXJ0IGZyZWUgdGVzdCBtZWV0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2NhdGlvbic6ICdoZXJvYmFubmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlVXJsJzogZG9jdW1lbnQuVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbENvdW50cnknOiBzZWxDb3VudHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCd3eF9jbGtfdGVzdGluZy1tZWV0aW5nJywgZXZfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOmhlcm86YnV0dG9uOnN0YXJ0IGZyZWUgdGVzdCBtZWV0aW5nOiVwYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI4NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2hvbWUgcGFnZSBoZXJvIHNlY3Rpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc3RhcnQgZnJlZSB0ZXN0IG1lZXRpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdzdGFydCBmcmVlIHRlc3QgbWVldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw5Zjk5ZjMxYTliODE0ZDljODI5M2ZlNGVlZjk4MWZjNycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3N0YXJ0IGZvciBmcmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLndieC1oZWFkZXItbWVudS1saXN0IC53YngtaGVhZGVyLXRyeS1pdC1mcmVlIGEsLmZ0LWhlYWRlciAuY3RhLWZyZWV0cmlhbCBhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3dcXC53ZWJleFxcLmNvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbENvdW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxDb3VudHJ5ID0gJCgnLndieC1yZWdpb24tbmFtZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxDb3VudHJ5ID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsQ291bnRyeSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYW1wbGl0dWRlICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZfcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidXR0b25fbmFtZSc6ICdzdGFydCBmb3IgZnJlZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9jYXRpb24nOiAnaGVhZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlVXJsJzogZG9jdW1lbnQuVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbENvdW50cnknOiBzZWxDb3VudHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5VUkwuaW5kZXhPZignY29udGFjdC1zYWxlcy5odG1sJykgPCAwICYmIGRvY3VtZW50LlVSTC5pbmRleE9mKCd0ZWFtLWNvbGxhYm9yYXRpb24nKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCd3eF9jbGtfc3RhcnQtZm9yLWZyZWUnLCBldl9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQuVVJMLmluZGV4T2YoJ2NvbnRhY3Qtc2FsZXMuaHRtbCcpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2X3AuYnV0dG9uX25hbWUgPSAndHJ5IG1lZXRpbmdzIGZyZWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1wbGl0dWRlLmdldEluc3RhbmNlKCkubG9nRXZlbnQoJ3d4X2Nsa190cnktbWVldGluZ3MtZnJlZScsIGV2X3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5VUkwuaW5kZXhPZigndGVhbS1jb2xsYWJvcmF0aW9uLmh0bWwnKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldl9wLmJ1dHRvbl9uYW1lID0gJ3RyeSB0ZWFtcyBmcmVlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCd3eF9jbGtfdHJ5LXRlYW1zLWZyZWUnLCBldl9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnaGVhZGVyOm5hdjpidXR0b246JWZyZWVjdGElOiVwYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI3MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVmcmVlY3RhJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjg3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZ2xvYmFsIGhlYWRlcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNzInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTc4JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICclZnJlZWN0YSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYzEwYzRmMmZiNDM3NGZlNzk3NDFhZTBjNGY4NmM2NGYnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdBZHdvcmRzIC0gT2ZmbGluZSBDb252ZXJzaW9uIFRyYWNraW5nIFRhZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2djbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyguKiknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2Z1bmN0aW9uIHNldENvb2tpZShuYW1lLCB2YWx1ZSwgZGF5cyl7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIChkYXlzKjI0KjYwKjYwKjEwMDApKTsgXG4gICAgdmFyIGV4cGlyZXMgPSAiOyBleHBpcmVzPSIgKyBkYXRlLnRvR01UU3RyaW5nKCk7XG4gICAgZG9jdW1lbnQuY29va2llID0gbmFtZSArICI9IiArIHZhbHVlICsgZXhwaXJlcyArICI7cGF0aD0vIjtcbn1cbmZ1bmN0aW9uIGdldFBhcmFtKHApe1xuICAgIHZhciBtYXRjaCA9IFJlZ0V4cChcJ1s/Jl1cJyArIHAgKyBcJz0oW14mXSopXCcpLmV4ZWMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIG1hdGNoICYmIGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFsxXS5yZXBsYWNlKC9cXCsvZywgXCcgXCcpKTtcbn1cbnZhciBnY2xpZCA9IGdldFBhcmFtKFwnZ2NsaWRcJyk7XG5pZihnY2xpZCl7XG4gICAgdmFyIGdjbHNyYyA9IGdldFBhcmFtKFwnZ2Nsc3JjXCcpO1xuICAgIGlmKCFnY2xzcmMgfHwgZ2Nsc3JjLmluZGV4T2YoXCdhd1wnKSAhPT0gLTEpe1xuXHQgICAgc2V0Q29va2llKFwnZ2NsaWRcJywgZ2NsaWQsIDkwKTtcblx0fVxufScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGU0MmQxODEzMGY5MTQ4NTk5ZTI4ZmJhYzBiNTIxZGRjJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnQ0RDIFRyYWNraW5nOiBUZWFsaXVtJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogMTA1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW5zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmF1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5icicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY2EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvLmluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY28uanAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvLmtyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbS5hdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY29tLmJyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jb20uY24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmNvbS5oaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguY29tLm14JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5jby51aycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4LmVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJleC5mcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2ViZXguaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmV4Lm14JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKGZ1dHVyZW9md29yaylcXC53ZWJleFxcLmNvbSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXFwvKGxieHxwb3N0LW1lZXRpbmcpXFwvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAndXNlcl9jaV91dWlkPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0ZSc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdjdG1Qcm9maWxlID0gImNvbGxhYm9yYXRpb24iO1xuICBcbiAgKGZ1bmN0aW9uKGEsYixjLGQpe1xuICAgIGE9XCcvL3d3dy5jaXNjby5jb20vYy9kYW0vY2RjL3QvY3RtLmpzXCc7XG4gICAgYj1kb2N1bWVudDtjPVwnc2NyaXB0XCc7ZD1iLmNyZWF0ZUVsZW1lbnQoYyk7ZC5zcmM9YTtkLnR5cGU9XCd0ZXh0L2phdmFcJytjO2QuYXN5bmM9ZmFsc2U7XG4gICAgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpWzBdO2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZCxhKTtcbiAgICB9KSgpO1xuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYWUyZjUzZTFmMDk4NDUxM2FjZjk1MzczNWZhN2Q3MDAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwY2hrIHRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2hpc3RvcnlDaGFuZ2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiAyMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncGluLWNoZWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICdodHRwczovL2Fzc2V0cy5hZG9iZWR0bS5jb20vN2NkNTU0OWM3MThjL2IyMjkzYjU2OWU0OS9hYWQ4MjZmOTJiNGUvUkM3YTk3YzljNzVlYTc0NmIwYjA1ZWQzZGVmMjA0ZTU5Yy1zb3VyY2UuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnamF2YXNjcmlwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0V4dGVybmFsJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDc2NGFjNTU5ZDhmMDRjZWY5ZTQ1NzhkYjVlYWZhMDUwJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaG90amFyLTU2NjUwMScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdkb21haW5zJzogWyd3ZWJleC5jb20nXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3ByaWNpbmcvZnJlZS10cmlhbC5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL3ByaWNpbmcvaW5mby5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncHJpY2luZy9zaWdudXAuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3ByaWNpbmcvZW1haWxzZW50Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdwcmljaW5nL2ZyZWUtdHJpYWwtREcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJy9wcmljaW5nL2luZGV4Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdTaG9wcGluZ0NhcnRQYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAncHJpY2luZy90cmlhbC9jb25maXJtYXRpb25wYWdlLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdBZGRyZXNzUGF5bWVudEluZm9QYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXFwvbGJ4XFwvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKGNhcnR8ZXNzZW50aWFscylcXC53ZWJleFxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVnYXRlJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJyhmdW5jdGlvbihoLCBvLCB0LCBqLCBhLCByKSB7XG4gIGguaGogPVxuICAgIGguaGogfHxcbiAgICBmdW5jdGlvbigpIHtcbiAgICAgIChoLmhqLnEgPSBoLmhqLnEgfHwgW10pLnB1c2goYXJndW1lbnRzKTtcbiAgICB9O1xuICBoLl9oalNldHRpbmdzID0geyBoamlkOiA1NjY1MDEsIGhqc3Y6IDUgfTtcbiAgYSA9IG8uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTtcbiAgciA9IG8uY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7XG4gIHIuYXN5bmMgPSAxO1xuICByLnNyYyA9IHQgKyBoLl9oalNldHRpbmdzLmhqaWQgKyBqICsgaC5faGpTZXR0aW5ncy5oanN2O1xuICBhLmFwcGVuZENoaWxkKHIpO1xufSkod2luZG93LCBkb2N1bWVudCwgImh0dHBzOi8vc3RhdGljLmhvdGphci5jb20vYy9ob3RqYXItIiwgIi5qcz9zdj0iKTtcbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDU5YTRjNTYyNDk4MzRlMGZiM2NhZDc0NDFiNGZmZjQ5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRnV0dXJlIG9mIHdvcmsgLSBzdGFydCBmb3IgZnJlZSBib3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcuY29nLXNlY3Rpb242IC5zZWN0aW9uNi1idG4tYm94IGEuYnRuLXRyeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogZmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnL3RoZS1mdXR1cmUtb2Ytd29yay5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjpidXR0b246c3RhcnQgZm9yIGZyZWU6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjg3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZnV0dXJlIG9mIHdvcmsgbGFzdCBzZWN0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzdGFydCBmb3IgZnJlZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJ3N0YXJ0IGZvciBmcmVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGIyODIxMTkxN2RjOTRlMWNhNDMzZDNiNmRhNDgzZDZiJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXNzZW50aWFsIHwgYmFubmVyICB8Y2xpY2sgdHJhY2tpbmcgaG9tZXBhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcuY2VudGVyIGEuYnJhbmQtbGluay1jb2xvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50UHJvcGVydGllcyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaHJlZicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Fkb3B0aW9uLXRvb2xraXRzfGJldGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ14oXFwvKSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYmFubmVyOnBvcC11cDoldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdiYW5uZXI6cG9wLXVwOiV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXIxMTcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5AY2xlYW5UZXh0JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxjNjc4ZDM2MWU2MzE0NWIwYjU5MzNiZjM1NzU3MjE2NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ092ZXJsYXkgLSBGcmVlIHRvIFBhaWQgTGlnaHRib3gnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcvTXlBY2NvdW50V2ViL2NoYW5nZW9yZGVyLmRvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3VzZXJVcGdyYWRlT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2dlbmVyaWN1cGdyYWRlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyT2JqLmxvY2FsZSA9PT0gJ2VuX1VTJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFtdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGNlMWY5Njg4ZTg0ZTRmNDg5YjEyMTdmZDg0NzU0OTg3JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnc2VjdGlvbiBjbGsnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcuSXRlbS0taXRlbV9fY29udGVudC0tMVd0ZWUgLkl0ZW0tLWl0ZW1fX2J1dHRvbi0tMmM2WWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3d3cud2ViZXguY29tfHd3dy53ZWJleC5jby5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnXihcXC8pJHxeKC9pbmRleC5odG1sKSQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbENvdW50cnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxDb3VudHJ5ID0gJCgnLndieC1yZWdpb24tbmFtZScpLnRleHQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxDb3VudHJ5ID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsQ291bnRyeSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYW1wbGl0dWRlICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZfcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidXR0b25fbmFtZSc6ICdkaXNjb3ZlciB3ZWJleCBtZWV0aW5ncycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9jYXRpb24nOiAncGFnZS1zZWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlVXJsJzogZG9jdW1lbnQuVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbENvdW50cnknOiBzZWxDb3VudHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtcGxpdHVkZS5nZXRJbnN0YW5jZSgpLmxvZ0V2ZW50KCd3eF9jbGtfdmlkZW8tY29uZmVyZW5jaW5nJywgZXZfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOmxpbms6ZGlzY292ZXIgd2ViZXggbWVldGluZ3M6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZGlzY292ZXIgd2ViZXggbWVldGluZ3MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdkaXNjb3ZlciB3ZWJleCBtZWV0aW5ncycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw3NTUzZTU0NDQ0Njc0YjU4OGZmOWM0MDEyOTUzMjE4ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ1NwYXJrIFB1cmNoYXNlIC0gVmVyaWZ5IFB1cmNoYXNlIERldGFpbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3NwYXJrX2RhdGEucGFnZV9uYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ1RocmVlUGdDaGVja291dENvbmZpcm1PcmRlclBhZ2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VzdG9tU2V0dXAnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5wcm9kdWN0cyA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdEUiBTaG9wcGluZyBDYXJ0IC0gU2VsZWN0aW9uIFByb2R1Y3RzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAnbmFtZSc6ICdzY0NoZWNrb3V0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJ25hbWUnOiAnZXZlbnQxMTInIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZU5hbWUnOiAnd3g6ZHItc2hvcHBpbmctY2FydDpjb25maXJtLWRldGFpbHMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxkMWE0ZTY3MmY4Yzk0N2RjODdhZGIyMGM3YTQzYTBlOScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2hvc3QgYW5kIGpvaW4gY3RhJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3ByaWNpbmdcXC9mcmVlLXRyaWFsXFwuaHRtbHxwcmljaW5nXFwvZnJlZVxcLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ3NldFRpbWVvdXQoZnVuY3Rpb24oKXsgXG4kKFwnLmxpbmstam9pblwnKS5jbGljayhmdW5jdGlvbigpeyR0aGlzVHh0PSQodGhpcykudGV4dCgpOyBMblRya0V2ZW50KHRoaXMsImV2ZW50MTgxIiwiaGVhZGVyOmJ1dHRvbjoiLCR0aGlzVHh0LnRyaW0oKSk7fSlcbn0sIDE1MDApO1xuXG5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTGIyYTg1NDVlYjY1YzRiY2FiYzljNTNjZmM3MjVhNTE5JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnRlQgLSB0aGFua3lvdScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGlzdG9yeUNoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdkb21haW5zJzogWyd3ZWJleC5jb20nXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd0aGFua3lvdScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzE5NTE3OTJlNDBlZDQwMWQ5ZmFmMmFhYzE0YzNjOWI5LXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMZGUzMGZjMmIwM2NiNDg5ZDk5N2ExMmQ3Y2E3NzdmZmUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdGVCAtIENyZWF0ZSB0cmlhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGlzdG9yeUNoYW5nZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdkb21haW5zJzogWyd3ZWJleC5jb20nXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdjcmVhdGUtdHJpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCc6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzRjM2Q0NjhmZTc0ZjQ0YmY5YTQxNTE0ZjU0MGE5ZThmLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNjJhZmIyMzE3YjliNDMwNjg0YjY5YzEwZTQ1OGE4ODUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdVUyBDb250YWN0IFNhbGVzIFN1Ym1pdCBDbGljaycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5jdGEtMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdjb250YWN0LXNhbGVzLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICdkb21haW5zJzogWyd3ZWJleC5jb20nXSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDODcwNmNiMmUzYjZjNDI1ZThmODEwZTRkYjBlM2ExNDEtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2phdmFzY3JpcHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkxiMDFlMTBlNmRhY2M0YjVmYWUyMjQzNDhjOGU4YzdjMScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Vzc2VudGlhbCB8IGJldGEgfGNsaWNrIHRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmxvZ2luLnJpcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdiZXRhLmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnaGVhZGVyOmxvZ2luOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2hlYWRlcjpsb2dpbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYmRlM2FhMDRhNDNkNGRiNjkwZDdiNzljMmRlMzBmODMnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB1cGRhdGUgcHJvZ3JhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICdhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3VwZGF0ZS1wcm9ncmFtXFwvYWRtaW5cXC5odG1sfHVwZGF0ZS1wcm9ncmFtL2VuZC11c2VyLmh0bWx8Z2V0LXN0YXJ0ZWQtYWRtaW4uaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9kb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2RvbWFpbnMnOiBbJ3dlYmV4LmNvbSddIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjoldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICcldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYjcxZDJjYmYyZjgyNDZiNDkwYTlmYTA3YjJmMTgyYjMnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCBiZXRhIG90aGVyc3xjbGljayB0cmFja2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FuY2hvckRlbGF5JzogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudFNlbGVjdG9yJzogJy5idG4tZ2V0LXN0YXJ0ZWQuc2Nyb2xsdG8sLnNsaWRlci1tYWluLnNpZ24tdXAgYSwuZm9vdGVyIC5jYXJkIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnYmV0YS5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2Vzc2VudGlhbHMud2ViZXguY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cmFja2VyUHJvcGVydGllcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlVmFycyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXI0MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3NlY3Rpb246JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjoldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMMzA2OWUwZDAwNDk2NDM2YmIzNjBmN2QwZTcyODI5NGEnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdob3RqYXIgY2FydFdlYmV4JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnY2FydFxcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6ICcoZnVuY3Rpb24oaCxvLHQsaixhLHIpe1xuaC5oaj1oLmhqfHxmdW5jdGlvbigpXG5cbnsoaC5oai5xPWguaGoucXx8W10pLnB1c2goYXJndW1lbnRzKX1cbjtcbmguX2hqU2V0dGluZ3M9e2hqaWQ6MTUyMTUwMyxoanN2OjZ9O1xuYT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnaGVhZFwnKVswXTtcbnI9by5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpO3IuYXN5bmM9MTtcbnIuc3JjPXQraC5faGpTZXR0aW5ncy5oamlkK2oraC5faGpTZXR0aW5ncy5oanN2O1xuYS5hcHBlbmRDaGlsZChyKTtcbn0pKHdpbmRvdyxkb2N1bWVudCxcJ2h0dHBzOi8vc3RhdGljLmhvdGphci5jb20vYy9ob3RqYXItXCcsXCcuanM/c3Y9XCcpOycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDZkMTkyMDNhZTc3YzRhZjQ4NGQ3YWQ3YzIzM2QyNjlmJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAndHJhY2tWaWRlb1BsYXknLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2VsZW1lbnRFeGlzdHMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjSHBQbGF5ZXJfaHRtbDVfYXBpJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViZG9tYWlucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3d3d1xcLndlYmV4XFwuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdeKFxcLykkfF4oL2luZGV4Lmh0bWwpJCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQzIwMjg1YjU5NjU2YTQ4YjVhODhkODk3M2UyMWFiMzBhLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS83Y2Q1NTQ5YzcxOGMvYjIyOTNiNTY5ZTQ5L2FhZDgyNmY5MmI0ZS9SQ2M1YWVhNzI2ODIzMDQ0MGM5OGNhNDM4NWU2NmViZGYxLXNvdXJjZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdqYXZhc2NyaXB0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzRXh0ZXJuYWwnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDk2ZTk5NTY2MTE2NDQ5YTc4M2IyMDVlNDRkMjY2OGMwJywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnSG9zdCBCdXR0b24gRmxvb2RsaWdodCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICdob3N0LWJ1dHRvbi1mbG9vZGxpZ2h0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICdhY3Rpb25zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tLzdjZDU1NDljNzE4Yy9iMjI5M2I1NjllNDkvYWFkODI2ZjkyYjRlL1JDMjg1ODdhNzc4ZjNkNDk4OGFjMTFlNGNlZjZmOGY4NjMtc291cmNlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJ2h0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNFeHRlcm5hbCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw5YzRkNWE2ODdhNDY0YzQzODMxMjc3NWZiYjJlZGExOScsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0ludGVybmFsIFNlYXJjaCAtIE5ldyBTaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9lbnRlcnNWaWV3cG9ydC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnZWxlbWVudFNlbGVjdG9yJzogJyN3Yngtc2VhcmNoLXJlc3VsdHMnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjU4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJUludGVybmFsIFNlYXJjaCBLZXl3b3JkJSA6ICVOdW1iZXIgb2YgU2VhcmNoIFJlc3VsdHMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDI5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJUludGVybmFsIFNlYXJjaCBLZXl3b3JkJSA6ICVOdW1iZXIgb2YgU2VhcmNoIFJlc3VsdHMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJ0ludGVybmFsIFNlYXJjaCBQZXJmb3JtZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNjY4M2Q1ZDBkMDVlNDZlM2JiMzQzNmEwZGVlMThlYWYnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdEQiAtIEFjdGl2YXRpb24gc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogeyAnaWRlbnRpZmllcic6ICdhY3REYlN1Y2Nlc3MnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbVNldHVwJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSc6IGZ1bmN0aW9uIChldmVudCwgcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZVZhcjEwOCA9IHMuZ2V0VGltZVRvQ29tcGxldGUoJ3N0b3AnLCAncGNoaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuZVZhcjEwMCA9IHMuZ2V0VGltZVRvQ29tcGxldGUoJ3N0b3AnLCAnb3JkU3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogeyAncGFnZU5hbWUnOiAnd3g6ZGlyZWN0LWJ1eTpzaWdudXA6c3VjY2VzcycgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7ICd0eXBlJzogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw5Y2U5YjI4MmVkNmM0ZGI2YjcxMGM5OWYyMmYzOGU3NycsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2NvbGxhYm9yYXRpb24gcGFnZSB8IGJ1dHRvbnMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcud2J4LXBlb3BsZS1pbnNpZ2h0cy1jdGEsIGEuYnRuLWRvd25sb2FkLCBhLmJ0bi1yZWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvcGF0aEFuZFF1ZXJ5c3RyaW5nLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ3RoZS1mdXR1cmUtb2Ytd29yay5odG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVJc1JlZ2V4JzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjpidXR0b246JXRoaXMuQGNsZWFuVGV4dCU6JXBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNDViYzliMTY1N2NkNGMyNDkyNjIxZGYzZjkxNzNiMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB3aGF0cy1uZXd8IGNsaWNrIHRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLnRhYmNvbnRlbnQgYS54cmVmLCNzZWN0aW9uLXR3by1jb2x1bW4tYmxhZGUgLmZsZXgtY29udGFpbmVyIGEuYXBwZWFyLWFzLWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZQYXJlbnQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmQ2hpbGRGaXJlZCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydWxlT3JkZXInOiA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb25kaXRpb25zJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3aGF0cy1uZXcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlc3NlbnRpYWxzLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOiV0aGlzLkBjbGVhblRleHQlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXIxMTcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICcldGhpcy5AY2xlYW5UZXh0JScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rVHlwZSc6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAnaWQnOiAnUkw3YWE1YzJiNDNjNTE0ZWEwOGM1ZDZiMWI2YWY4MTU0NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2Vzc2VudGlhbCB8IHdoYXRzLW5ld3wgY29sM3wgY2xpY2sgdHJhY2tpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcuZmxleC1jb250YWluZXIgLmNvbC13aWR0aC0zMyBhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2bHNpYiA9ICQodGhpcykuY2hpbGRyZW4oJ2g0JykudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5zZXRWYXIoJ3BfbmFtZScsIHZsc2liKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd2hhdHMtbmV3Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjolcF9uYW1lJTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclcF9uYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXBfbmFtZSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMODhhZmJkMTNiZmMyNGExMjlhMDA3MjY2ZmEzNWNlZGQnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB3aGF0cy1uZXd8IGxlYXJuIG1vcmV8IGNsaWNrIHRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmNhcm91c2VsLWNhcHRpb24taXRlbSBhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZlBhcmVudCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWJibGVGaXJlSWZDaGlsZEZpcmVkJzogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVPcmRlcic6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc291cmNlJzogZnVuY3Rpb24gKGV2ZW50LCB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2bHNpYiA9ICQodGhpcykuZXEoMCkuc2libGluZ3MoJ2gyJykudGV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5zZXRWYXIoJ3BfbmFtZScsIHZsc2liKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd2hhdHMtbmV3Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjolcF9uYW1lJToldGhpcy5AY2xlYW5UZXh0JTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclcF9uYW1lJToldGhpcy5AY2xlYW5UZXh0JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3BzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICclc191cmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyMTE3JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdhbGlhcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlVmFyNDMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmVudHMnOiBbeyAnbmFtZSc6ICdldmVudDE4MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua05hbWUnOiAnJXBfbmFtZSU6JXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMYzZlOThjZmRkNTU0NDc3ZTllZGNmNTEyNzJmNGQ4NzInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB3aGF0cy1uZXd8IHJlZ2lzdGVyIHwgaHctY3NtIHwgY2xpY2sgdHJhY2tpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmNob3JEZWxheSc6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRTZWxlY3Rvcic6ICcjc2VjdGlvbi1zcGVjaWFsLXdlYmV4LWV2ZW50IC5mbGV4LWNvbnRhaW5lciBhLmFwcGVhci1hcy1idXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd2hhdHMtbmV3Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjpody1jc206JXRoaXMuQGNsZWFuVGV4dCU6JXBfdmwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyMTE3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnaHctY3NtOiV0aGlzLkBjbGVhblRleHQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvcHMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVzX3VybCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXIxMTcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3AxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2FsaWFzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJ2VWYXI0MycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7ICduYW1lJzogJ2V2ZW50MTgxJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rTmFtZSc6ICdody1jc206JXRoaXMuQGNsZWFuVGV4dCUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkJzogJ1JMNmE2MDY0NmMwNjI1NGI1Yjg4YWQ5MWZkYTM5OGZmY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlc3NlbnRpYWwgfCB3aGF0cy1uZXd8IGh5YnJpZCB8IGxlYXJuIG1vcmV8IGNsaWNrIHRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnI3NlY3Rpb24tcmVicmFuZC1iYW5uZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZsc2liID0gJCh0aGlzKS5lcSgwKS5zaWJsaW5ncygnaDInKS50ZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldFZhcigncF9uYW1lJywgdmxzaWIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGhBbmRRdWVyeXN0cmluZy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGF0aHMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICd3aGF0cy1uZXcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9zdWJkb21haW4uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1YmRvbWFpbnMnOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdlc3NlbnRpYWxzLndlYmV4LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlSXNSZWdleCc6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAnYWN0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJhY2tlclByb3BlcnRpZXMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZVZhcnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdzZWN0aW9uOmh5YnJpZC1iYW5uZXI6bGVhcm4tbW9yZTolcF92bCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ2VWYXIxMTcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSc6ICdoeWJyaWQtYmFubmVyOmxlYXJuLW1vcmUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyVwX25hbWUlOiV0aGlzLkBjbGVhblRleHQlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtUeXBlJzogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6ICdSTDkwNGFlZDg5YTI5OTQ1MGFiZjQzOWE2NGU1YTRlMzE0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZXNzZW50aWFsIHwgd2hhdHMtbmV3fCBpbWFnZSB8IGxlYXJuIG1vcmV8IGNsaWNrIHRyYWNraW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2V2ZW50cyc6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yRGVsYXknOiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50U2VsZWN0b3InOiAnLmNhcm91c2VsLWlubmVyIC5jYXJvdXNlbC1pdGVtIGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnViYmxlRmlyZUlmUGFyZW50JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1YmJsZUZpcmVJZkNoaWxkRmlyZWQnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVsZU9yZGVyJzogNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2UnOiBmdW5jdGlvbiAoZXZlbnQsIHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZsc2liID0gJCgnLmNhcm91c2VsLWNhcHRpb24taXRlbScpLm5vdCgnOmhpZGRlbicpLmNoaWxkcmVuKCdoMicpLnRleHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0VmFyKCdwX25hbWVfYScsIHZsc2liKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlUGF0aCc6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9wYXRoQW5kUXVlcnlzdHJpbmcuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhdGhzJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnd2hhdHMtbmV3Lmh0bWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJkb21haW5zJzogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZXNzZW50aWFscy53ZWJleC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZUlzUmVnZXgnOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZVBhdGgnOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrZXJQcm9wZXJ0aWVzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VWYXJzJzogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnc2VjdGlvbjolcF9uYW1lX2ElOmltYWdlOiVwX3ZsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnZVZhcjExNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJzogJyVwX25hbWVfYSU6aW1hZ2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9wcyc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnJXNfdXJsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjExNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAncHJvcDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnYWxpYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsdWUnOiAnZVZhcjQzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzJzogW3sgJ25hbWUnOiAnZXZlbnQxODEnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHRpbmdzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmtOYW1lJzogJyVwX25hbWVfYSU6aW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua1R5cGUnOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGVQYXRoJzogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXR0aW5ncyc6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH07CiAgICAgICAgfSgpKTsKICAgICAgICB2YXIgJF9fX3Zhcl8xNmI1M2Q1YWRkMGJiNDg4ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgIGlmICghd2luZG93LmF0b2IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQWRvYmUgTGF1bmNoIGlzIHVuc3VwcG9ydGVkIGluIElFIDkgYW5kIGJlbG93LicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBidWlsZFJ1bGVFeGVjdXRpb25PcmRlciA9IGZ1bmN0aW9uIChydWxlcykgewogICAgICAgICAgICAgICAgdmFyIHJ1bGVFdmVudFBhaXJzID0gW107CiAgICAgICAgICAgICAgICBydWxlcy5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlRXZlbnRQYWlycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlOiBydWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVFdmVudFBhaXJzLnNvcnQoZnVuY3Rpb24gKHJ1bGVFdmVudFBhaXJBLCBydWxlRXZlbnRQYWlyQikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBydWxlRXZlbnRQYWlyQS5ldmVudC5ydWxlT3JkZXIgLSBydWxlRXZlbnRQYWlyQi5ldmVudC5ydWxlT3JkZXI7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIERFQlVHX0xPQ0FMX1NUT1JBR0VfTkFNRSA9ICdkZWJ1Zyc7CiAgICAgICAgICAgIHZhciBjcmVhdGVEZWJ1Z0NvbnRyb2xsZXIgPSBmdW5jdGlvbiAobG9jYWxTdG9yYWdlLCBsb2dnZXIpIHsKICAgICAgICAgICAgICAgIHZhciBnZXRQZXJzaXN0ZWREZWJ1Z0VuYWJsZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKERFQlVHX0xPQ0FMX1NUT1JBR0VfTkFNRSkgPT09ICd0cnVlJzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgc2V0UGVyc2lzdGVkRGVidWdFbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShERUJVR19MT0NBTF9TVE9SQUdFX05BTUUsIGVuYWJsZWQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBkZWJ1Z0NoYW5nZWRDYWxsYmFja3MgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBvbkRlYnVnQ2hhbmdlZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgIGRlYnVnQ2hhbmdlZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBsb2dnZXIub3V0cHV0RW5hYmxlZCA9IGdldFBlcnNpc3RlZERlYnVnRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBvbkRlYnVnQ2hhbmdlZDogb25EZWJ1Z0NoYW5nZWQsCiAgICAgICAgICAgICAgICAgICAgZ2V0RGVidWdFbmFibGVkOiBnZXRQZXJzaXN0ZWREZWJ1Z0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgc2V0RGVidWdFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0UGVyc2lzdGVkRGVidWdFbmFibGVkKCkgIT09IGVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFBlcnNpc3RlZERlYnVnRW5hYmxlZChlbmFibGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5vdXRwdXRFbmFibGVkID0gZW5hYmxlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnQ2hhbmdlZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVuYWJsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgTU9EVUxFX05PVF9GVU5DVElPTl9FUlJPUiA9ICdNb2R1bGUgZGlkIG5vdCBleHBvcnQgYSBmdW5jdGlvbi4nOwogICAgICAgICAgICB2YXIgY3JlYXRlRXhlY3V0ZURlbGVnYXRlTW9kdWxlID0gZnVuY3Rpb24gKG1vZHVsZVByb3ZpZGVyLCByZXBsYWNlVG9rZW5zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG1vZHVsZURlc2NyaXB0b3IsIHN5bnRoZXRpY0V2ZW50LCBtb2R1bGVDYWxsUGFyYW1ldGVycykgewogICAgICAgICAgICAgICAgICAgIG1vZHVsZUNhbGxQYXJhbWV0ZXJzID0gbW9kdWxlQ2FsbFBhcmFtZXRlcnMgfHwgW107CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUV4cG9ydHMgPSBtb2R1bGVQcm92aWRlci5nZXRNb2R1bGVFeHBvcnRzKG1vZHVsZURlc2NyaXB0b3IubW9kdWxlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVFeHBvcnRzICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihNT0RVTEVfTk9UX0ZVTkNUSU9OX0VSUk9SKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0gcmVwbGFjZVRva2Vucyhtb2R1bGVEZXNjcmlwdG9yLnNldHRpbmdzIHx8IHt9LCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUV4cG9ydHMuYmluZChudWxsLCBzZXR0aW5ncykuYXBwbHkobnVsbCwgbW9kdWxlQ2FsbFBhcmFtZXRlcnMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNsZWFuVGV4dCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ci5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCkgOiBzdHI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsZXZlbHMgPSB7CiAgICAgICAgICAgICAgICBMT0c6ICdsb2cnLAogICAgICAgICAgICAgICAgSU5GTzogJ2luZm8nLAogICAgICAgICAgICAgICAgREVCVUc6ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBXQVJOOiAnd2FybicsCiAgICAgICAgICAgICAgICBFUlJPUjogJ2Vycm9yJwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgUk9DS0VUID0gJ1x1RDgzRFx1REU4MCc7CiAgICAgICAgICAgIHZhciBpZVZlcnNpb24gPSBwYXJzZUludCgoL21zaWUgKFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSB8fCBbXSlbMV0pOwogICAgICAgICAgICB2YXIgbGF1bmNoUHJlZml4ID0gaWVWZXJzaW9uID09PSAxMCA/ICdbTGF1bmNoXScgOiBST0NLRVQ7CiAgICAgICAgICAgIHZhciBvdXRwdXRFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBwcm9jZXNzID0gZnVuY3Rpb24gKGxldmVsKSB7CiAgICAgICAgICAgICAgICBpZiAob3V0cHV0RW5hYmxlZCAmJiB3aW5kb3cuY29uc29sZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2dBcmd1bWVudHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgIGxvZ0FyZ3VtZW50cy51bnNoaWZ0KGxhdW5jaFByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSBsZXZlbHMuREVCVUcgJiYgIXdpbmRvdy5jb25zb2xlW2xldmVsXSkgewogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVscy5JTkZPOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZVtsZXZlbF0uYXBwbHkod2luZG93LmNvbnNvbGUsIGxvZ0FyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsb2cgPSBwcm9jZXNzLmJpbmQobnVsbCwgbGV2ZWxzLkxPRyk7CiAgICAgICAgICAgIHZhciBpbmZvID0gcHJvY2Vzcy5iaW5kKG51bGwsIGxldmVscy5JTkZPKTsKICAgICAgICAgICAgdmFyIGRlYnVnID0gcHJvY2Vzcy5iaW5kKG51bGwsIGxldmVscy5ERUJVRyk7CiAgICAgICAgICAgIHZhciB3YXJuID0gcHJvY2Vzcy5iaW5kKG51bGwsIGxldmVscy5XQVJOKTsKICAgICAgICAgICAgdmFyIGVycm9yID0gcHJvY2Vzcy5iaW5kKG51bGwsIGxldmVscy5FUlJPUik7CiAgICAgICAgICAgIHZhciBsb2dEZXByZWNhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciB3YXNFbmFibGVkID0gb3V0cHV0RW5hYmxlZDsKICAgICAgICAgICAgICAgIG91dHB1dEVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgcHJvY2Vzcy5hcHBseShudWxsLCBBcnJheS5wcm90b3R5cGUuY29uY2F0KGxldmVscy5XQVJOLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICBpZiAoIXdhc0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsb2dnZXIgPSB7CiAgICAgICAgICAgICAgICBsb2c6IGxvZywKICAgICAgICAgICAgICAgIGluZm86IGluZm8sCiAgICAgICAgICAgICAgICBkZWJ1ZzogZGVidWcsCiAgICAgICAgICAgICAgICB3YXJuOiB3YXJuLAogICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yLAogICAgICAgICAgICAgICAgZGVwcmVjYXRpb246IGxvZ0RlcHJlY2F0aW9uLAogICAgICAgICAgICAgICAgZ2V0IG91dHB1dEVuYWJsZWQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dEVuYWJsZWQ7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2V0IG91dHB1dEVuYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbmFibGVkID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY3JlYXRlUHJlZml4ZWRMb2dnZXI6IGZ1bmN0aW9uIChpZGVudGlmaWVyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvZ2dlclNwZWNpZmljUHJlZml4ID0gJ1snICsgaWRlbnRpZmllciArICddJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBsb2c6IGxvZy5iaW5kKG51bGwsIGxvZ2dlclNwZWNpZmljUHJlZml4KSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5mbzogaW5mby5iaW5kKG51bGwsIGxvZ2dlclNwZWNpZmljUHJlZml4KSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc6IGRlYnVnLmJpbmQobnVsbCwgbG9nZ2VyU3BlY2lmaWNQcmVmaXgpLAogICAgICAgICAgICAgICAgICAgICAgICB3YXJuOiB3YXJuLmJpbmQobnVsbCwgbG9nZ2VyU3BlY2lmaWNQcmVmaXgpLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IuYmluZChudWxsLCBsb2dnZXJTcGVjaWZpY1ByZWZpeCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKICAgICAgICAgICAgZnVuY3Rpb24gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKG4pIHsKICAgICAgICAgICAgICAgIGlmIChuLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB2YXIgYSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgIHZhciBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCBrKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgaywgZC5nZXQgPyBkIDogewogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2tdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIganNfY29va2llID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcjsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgT2xkQ29va2llcyA9IHdpbmRvdy5Db29raWVzOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXBpID0gd2luZG93LkNvb2tpZXMgPSBmYWN0b3J5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LkNvb2tpZXMgPSBPbGRDb29raWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwaTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBleHRlbmQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gYXR0cmlidXRlc1trZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRlY29kZShzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlcGxhY2UoLyglWzAtOUEtWl17Mn0pKy9nLCBkZWNvZGVVUklDb21wb25lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbml0KGNvbnZlcnRlcikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUsIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGV4dGVuZCh7IHBhdGg6ICcvJyB9LCBhcGkuZGVmYXVsdHMsIGF0dHJpYnV0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gbmV3IERhdGUobmV3IERhdGUoKSAqIDEgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjQwMDAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXltce1xbXS8udGVzdChyZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydGVyLndyaXRlID8gY29udmVydGVyLndyaXRlKHZhbHVlLCBrZXkpIDogZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyh2YWx1ZSkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGtleSkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCkucmVwbGFjZSgvW1woXCldL2csIGVzY2FwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc9JyArIGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uc3BsaXQoJzsnKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUgPSBrZXkgKyAnPScgKyB2YWx1ZSArIHN0cmluZ2lmaWVkQXR0cmlidXRlczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXQoa2V5LCBqc29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqYXIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvb2tpZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWpzb24gJiYgY29va2llLmNoYXJBdCgwKSA9PT0gJyInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZS5zbGljZSgxLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYW1lID0gZGVjb2RlKHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llID0gKGNvbnZlcnRlci5yZWFkIHx8IGNvbnZlcnRlcikoY29va2llLCBuYW1lKSB8fCBkZWNvZGUoY29va2llKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llID0gSlNPTi5wYXJzZShjb29raWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphcltuYW1lXSA9IGNvb2tpZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSA/IGphcltrZXldIDogamFyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zZXQgPSBzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGtleSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhcGkuZ2V0SlNPTiA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXQoa2V5LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChrZXksICcnLCBleHRlbmQoYXR0cmlidXRlcywgeyBleHBpcmVzOiAtMSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5kZWZhdWx0cyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhcGkud2l0aENvbnZlcnRlciA9IGluaXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciByZWFjdG9yQ29va2llID0gewogICAgICAgICAgICAgICAgZ2V0OiBqc19jb29raWUuZ2V0LAogICAgICAgICAgICAgICAgc2V0OiBqc19jb29raWUuc2V0LAogICAgICAgICAgICAgICAgcmVtb3ZlOiBqc19jb29raWUucmVtb3ZlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciByZWFjdG9yV2luZG93ID0gd2luZG93OwogICAgICAgICAgICB2YXIgTkFNRVNQQUNFID0gJ2NvbS5hZG9iZS5yZWFjdG9yLic7CiAgICAgICAgICAgIHZhciBnZXROYW1lc3BhY2VkU3RvcmFnZSA9IGZ1bmN0aW9uIChzdG9yYWdlVHlwZSwgYWRkaXRpb25hbE5hbWVzcGFjZSkgewogICAgICAgICAgICAgICAgdmFyIGZpbmFsTmFtZXNwYWNlID0gTkFNRVNQQUNFICsgKGFkZGl0aW9uYWxOYW1lc3BhY2UgfHwgJycpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBnZXRJdGVtOiBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzE5MGZiMDBlNTI4MDRhNGIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8xOTBmYjAwZTUyODA0YTRiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19lOTZlZjBkOTYxOWU2OGMyLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RvcldpbmRvd1tzdG9yYWdlVHlwZV0uZ2V0SXRlbShmaW5hbE5hbWVzcGFjZSArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMTkwZmIwMGU1MjgwNGE0YikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF8xOTBmYjAwZTUyODA0YTRiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNldEl0ZW06IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzU2N2Q1NGJkZDM1ZGNjYTQgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF81NjdkNTRiZGQzNWRjY2E0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja19lOTZlZjBkOTYxOWU2OGMyLmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjdG9yV2luZG93W3N0b3JhZ2VUeXBlXS5zZXRJdGVtKGZpbmFsTmFtZXNwYWNlICsgbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF81NjdkNTRiZGQzNWRjY2E0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzU2N2Q1NGJkZDM1ZGNjYTQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBDT09LSUVfUFJFRklYID0gJ19zZHNhdF8nOwogICAgICAgICAgICB2YXIgREFUQV9FTEVNRU5UU19OQU1FU1BBQ0UgPSAnZGF0YUVsZW1lbnRzLic7CiAgICAgICAgICAgIHZhciBNSUdSQVRFRF9LRVkgPSAnZGF0YUVsZW1lbnRDb29raWVzTWlncmF0ZWQnOwogICAgICAgICAgICB2YXIgcmVhY3RvckxvY2FsU3RvcmFnZSA9IGdldE5hbWVzcGFjZWRTdG9yYWdlKCdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgdmFyIGRhdGFFbGVtZW50U2Vzc2lvblN0b3JhZ2UgPSBnZXROYW1lc3BhY2VkU3RvcmFnZSgnc2Vzc2lvblN0b3JhZ2UnLCBEQVRBX0VMRU1FTlRTX05BTUVTUEFDRSk7CiAgICAgICAgICAgIHZhciBkYXRhRWxlbWVudExvY2FsU3RvcmFnZSA9IGdldE5hbWVzcGFjZWRTdG9yYWdlKCdsb2NhbFN0b3JhZ2UnLCBEQVRBX0VMRU1FTlRTX05BTUVTUEFDRSk7CiAgICAgICAgICAgIHZhciBzdG9yYWdlRHVyYXRpb25zID0gewogICAgICAgICAgICAgICAgUEFHRVZJRVc6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICBTRVNTSU9OOiAnc2Vzc2lvbicsCiAgICAgICAgICAgICAgICBWSVNJVE9SOiAndmlzaXRvcicKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHBhZ2V2aWV3Q2FjaGUgPSB7fTsKICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZSA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWQ7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHNldFZhbHVlID0gZnVuY3Rpb24gKGtleSwgc3RvcmFnZUR1cmF0aW9uLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIHNlcmlhbGl6ZWRWYWx1ZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RvcmFnZUR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlIHN0b3JhZ2VEdXJhdGlvbnMuUEFHRVZJRVc6CiAgICAgICAgICAgICAgICAgICAgcGFnZXZpZXdDYWNoZVtrZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY2FzZSBzdG9yYWdlRHVyYXRpb25zLlNFU1NJT046CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFFbGVtZW50U2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHNlcmlhbGl6ZWRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGNhc2Ugc3RvcmFnZUR1cmF0aW9ucy5WSVNJVE9SOgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRWYWx1ZSA9IHNlcmlhbGl6ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhRWxlbWVudExvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgc2VyaWFsaXplZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZ2V0VmFsdWUgPSBmdW5jdGlvbiAoa2V5LCBzdG9yYWdlRHVyYXRpb24pIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZTsKICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RvcmFnZUR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlIHN0b3JhZ2VEdXJhdGlvbnMuUEFHRVZJRVc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2V2aWV3Q2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSA/IHBhZ2V2aWV3Q2FjaGVba2V5XSA6IG51bGw7CiAgICAgICAgICAgICAgICBjYXNlIHN0b3JhZ2VEdXJhdGlvbnMuU0VTU0lPTjoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFFbGVtZW50U2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IHZhbHVlIDogSlNPTi5wYXJzZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBjYXNlIHN0b3JhZ2VEdXJhdGlvbnMuVklTSVRPUjoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFFbGVtZW50TG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgPyB2YWx1ZSA6IEpTT04ucGFyc2UodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgbWlncmF0ZURhdGFFbGVtZW50ID0gZnVuY3Rpb24gKGRhdGFFbGVtZW50TmFtZSwgc3RvcmFnZUR1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgc3RvcmVkVmFsdWUgPSByZWFjdG9yQ29va2llLmdldChDT09LSUVfUFJFRklYICsgZGF0YUVsZW1lbnROYW1lKTsKICAgICAgICAgICAgICAgIGlmIChzdG9yZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoZGF0YUVsZW1lbnROYW1lLCBzdG9yYWdlRHVyYXRpb24sIHN0b3JlZFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1pZ3JhdGVDb29raWVEYXRhID0gZnVuY3Rpb24gKGRhdGFFbGVtZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFyZWFjdG9yTG9jYWxTdG9yYWdlLmdldEl0ZW0oTUlHUkFURURfS0VZKSkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGRhdGFFbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAoZGF0YUVsZW1lbnROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pZ3JhdGVEYXRhRWxlbWVudChkYXRhRWxlbWVudE5hbWUsIGRhdGFFbGVtZW50c1tkYXRhRWxlbWVudE5hbWVdLnN0b3JhZ2VEdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RvckxvY2FsU3RvcmFnZS5zZXRJdGVtKE1JR1JBVEVEX0tFWSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBkYXRhRWxlbWVudFNhZmUgPSB7CiAgICAgICAgICAgICAgICBzZXRWYWx1ZTogc2V0VmFsdWUsCiAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZ2V0VmFsdWUsCiAgICAgICAgICAgICAgICBtaWdyYXRlQ29va2llRGF0YTogbWlncmF0ZUNvb2tpZURhdGEKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGdldEVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uIChkYXRhRGVmLCBkYXRhRWxlbWVudE5hbWUsIGVycm9yTWVzc2FnZSwgZXJyb3JTdGFjaykgewogICAgICAgICAgICAgICAgcmV0dXJuICdGYWlsZWQgdG8gZXhlY3V0ZSBkYXRhIGVsZW1lbnQgbW9kdWxlICcgKyBkYXRhRGVmLm1vZHVsZVBhdGggKyAnIGZvciBkYXRhIGVsZW1lbnQgJyArIGRhdGFFbGVtZW50TmFtZSArICcuICcgKyBlcnJvck1lc3NhZ2UgKyAoZXJyb3JTdGFjayA/ICdcbicgKyBlcnJvclN0YWNrIDogJycpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlR2V0RGF0YUVsZW1lbnRWYWx1ZSA9IGZ1bmN0aW9uIChtb2R1bGVQcm92aWRlciwgZ2V0RGF0YUVsZW1lbnREZWZpbml0aW9uLCByZXBsYWNlVG9rZW5zLCB1bmRlZmluZWRWYXJzUmV0dXJuRW1wdHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAobmFtZSwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YURlZiA9IGdldERhdGFFbGVtZW50RGVmaW5pdGlvbihuYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFEZWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmFnZUR1cmF0aW9uID0gZGF0YURlZi5zdG9yYWdlRHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZUV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlRXhwb3J0cyA9IG1vZHVsZVByb3ZpZGVyLmdldE1vZHVsZUV4cG9ydHMoZGF0YURlZi5tb2R1bGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihnZXRFcnJvck1lc3NhZ2UoZGF0YURlZiwgbmFtZSwgZS5tZXNzYWdlLCBlLnN0YWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGVFeHBvcnRzICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihnZXRFcnJvck1lc3NhZ2UoZGF0YURlZiwgbmFtZSwgJ01vZHVsZSBkaWQgbm90IGV4cG9ydCBhIGZ1bmN0aW9uLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtb2R1bGVFeHBvcnRzKHJlcGxhY2VUb2tlbnMoZGF0YURlZi5zZXR0aW5ncywgc3ludGhldGljRXZlbnQpLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGRhdGFEZWYsIG5hbWUsIGUubWVzc2FnZSwgZS5zdGFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdG9yYWdlRHVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFFbGVtZW50U2FmZS5zZXRWYWx1ZShuYW1lLCBzdG9yYWdlRHVyYXRpb24sIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YUVsZW1lbnRTYWZlLmdldFZhbHVlKG5hbWUsIHN0b3JhZ2VEdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZGF0YURlZi5kZWZhdWx0VmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGRhdGFEZWYuZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YURlZi5jbGVhblRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY2xlYW5UZXh0KHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YURlZi5mb3JjZUxvd2VyQ2FzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBzcGVjaWFsUHJvcGVydHlBY2Nlc3NvcnMgPSB7CiAgICAgICAgICAgICAgICB0ZXh0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjbGVhblRleHQ6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5UZXh0KG9iai50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBnZXRPYmplY3RQcm9wZXJ0eSA9IGZ1bmN0aW9uIChob3N0LCBwcm9wQ2hhaW4sIHN1cHBvcnRTcGVjaWFsKSB7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBob3N0OwogICAgICAgICAgICAgICAgdmFyIGF0dHJNYXRjaDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBwcm9wQ2hhaW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BDaGFpbltpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydFNwZWNpYWwgJiYgcHJvcC5jaGFyQXQoMCkgPT09ICdAJykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3BlY2lhbFByb3AgPSBwcm9wLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNwZWNpYWxQcm9wZXJ0eUFjY2Vzc29yc1tzcGVjaWFsUHJvcF0odmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmdldEF0dHJpYnV0ZSAmJiAoYXR0ck1hdGNoID0gcHJvcC5tYXRjaCgvXmdldEF0dHJpYnV0ZVwoKC4rKVwpJC8pKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9IGF0dHJNYXRjaFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlW3Byb3BdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlR2V0VmFyID0gZnVuY3Rpb24gKGN1c3RvbVZhcnMsIGdldERhdGFFbGVtZW50RGVmaW5pdGlvbiwgZ2V0RGF0YUVsZW1lbnRWYWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YXJpYWJsZSwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdldERhdGFFbGVtZW50RGVmaW5pdGlvbih2YXJpYWJsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREYXRhRWxlbWVudFZhbHVlKHZhcmlhYmxlLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BDaGFpbiA9IHZhcmlhYmxlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YXJpYWJsZUhvc3ROYW1lID0gcHJvcENoYWluLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUhvc3ROYW1lID09PSAndGhpcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0T2JqZWN0UHJvcGVydHkoc3ludGhldGljRXZlbnQuZWxlbWVudCwgcHJvcENoYWluLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZUhvc3ROYW1lID09PSAnZXZlbnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldE9iamVjdFByb3BlcnR5KHN5bnRoZXRpY0V2ZW50LCBwcm9wQ2hhaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhcmlhYmxlSG9zdE5hbWUgPT09ICd0YXJnZXQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldE9iamVjdFByb3BlcnR5KHN5bnRoZXRpY0V2ZW50LnRhcmdldCwgcHJvcENoYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0T2JqZWN0UHJvcGVydHkoY3VzdG9tVmFyc1t2YXJpYWJsZUhvc3ROYW1lXSwgcHJvcENoYWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlSXNWYXIgPSBmdW5jdGlvbiAoY3VzdG9tVmFycywgZ2V0RGF0YUVsZW1lbnREZWZpbml0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhcmlhYmxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuYW1lQmVmb3JlRG90ID0gdmFyaWFibGVOYW1lLnNwbGl0KCcuJylbMF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZ2V0RGF0YUVsZW1lbnREZWZpbml0aW9uKHZhcmlhYmxlTmFtZSkgfHwgbmFtZUJlZm9yZURvdCA9PT0gJ3RoaXMnIHx8IG5hbWVCZWZvcmVEb3QgPT09ICdldmVudCcgfHwgbmFtZUJlZm9yZURvdCA9PT0gJ3RhcmdldCcgfHwgY3VzdG9tVmFycy5oYXNPd25Qcm9wZXJ0eShuYW1lQmVmb3JlRG90KSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZXh0cmFjdE1vZHVsZUV4cG9ydHMgPSBmdW5jdGlvbiAoc2NyaXB0LCByZXF1aXJlLCB0dXJiaW5lKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgICAgICAgICAgc2NyaXB0LmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIHJlcXVpcmUsIHR1cmJpbmUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlTW9kdWxlUHJvdmlkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlQnlSZWZlcmVuY2VQYXRoID0ge307CiAgICAgICAgICAgICAgICB2YXIgZ2V0TW9kdWxlID0gZnVuY3Rpb24gKHJlZmVyZW5jZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gbW9kdWxlQnlSZWZlcmVuY2VQYXRoW3JlZmVyZW5jZVBhdGhdOwogICAgICAgICAgICAgICAgICAgIGlmICghbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlICcgKyByZWZlcmVuY2VQYXRoICsgJyBub3QgZm91bmQuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHJlZ2lzdGVyTW9kdWxlID0gZnVuY3Rpb24gKHJlZmVyZW5jZVBhdGgsIG1vZHVsZURlZmluaXRpb24sIGV4dGVuc2lvbk5hbWUsIHJlcXVpcmUsIHR1cmJpbmUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlID0gewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiBtb2R1bGVEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lOiBleHRlbnNpb25OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlOiByZXF1aXJlLAogICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lOiB0dXJiaW5lCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBtb2R1bGUucmVxdWlyZSA9IHJlcXVpcmU7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlQnlSZWZlcmVuY2VQYXRoW3JlZmVyZW5jZVBhdGhdID0gbW9kdWxlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBoeWRyYXRlQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlQnlSZWZlcmVuY2VQYXRoKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWZlcmVuY2VQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGVFeHBvcnRzKHJlZmVyZW5jZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0Vycm9yIGluaXRpYWxpemluZyBtb2R1bGUgJyArIHJlZmVyZW5jZVBhdGggKyAnLiAnICsgZS5tZXNzYWdlICsgKGUuc3RhY2sgPyAnXG4nICsgZS5zdGFjayA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGdldE1vZHVsZUV4cG9ydHMgPSBmdW5jdGlvbiAocmVmZXJlbmNlUGF0aCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGUocmVmZXJlbmNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2R1bGUuaGFzT3duUHJvcGVydHkoJ2V4cG9ydHMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGV4dHJhY3RNb2R1bGVFeHBvcnRzKG1vZHVsZS5kZWZpbml0aW9uLnNjcmlwdCwgbW9kdWxlLnJlcXVpcmUsIG1vZHVsZS50dXJiaW5lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBnZXRNb2R1bGVEZWZpbml0aW9uID0gZnVuY3Rpb24gKHJlZmVyZW5jZVBhdGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TW9kdWxlKHJlZmVyZW5jZVBhdGgpLmRlZmluaXRpb247CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGdldE1vZHVsZUV4dGVuc2lvbk5hbWUgPSBmdW5jdGlvbiAocmVmZXJlbmNlUGF0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRNb2R1bGUocmVmZXJlbmNlUGF0aCkuZXh0ZW5zaW9uTmFtZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyTW9kdWxlOiByZWdpc3Rlck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBoeWRyYXRlQ2FjaGU6IGh5ZHJhdGVDYWNoZSwKICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGVFeHBvcnRzOiBnZXRNb2R1bGVFeHBvcnRzLAogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZURlZmluaXRpb246IGdldE1vZHVsZURlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlRXh0ZW5zaW9uTmFtZTogZ2V0TW9kdWxlRXh0ZW5zaW9uTmFtZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHdhcm5pbmdMb2dnZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIGNyZWF0ZU5vdGlmeU1vbml0b3JzID0gZnVuY3Rpb24gKF9zYXRlbGxpdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodHlwZSwgZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbW9uaXRvcnMgPSBfc2F0ZWxsaXRlLl9tb25pdG9yczsKICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXJuaW5nTG9nZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignVGhlIF9zYXRlbGxpdGUuX21vbml0b3JzIEFQSSBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIGFuZCBzaG91bGQgb25seSAnICsgJ2JlIHVzZWQgZm9yIGRlYnVnZ2luZy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdMb2dnZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JzLmZvckVhY2goZnVuY3Rpb24gKG1vbml0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb25pdG9yW3R5cGVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvclt0eXBlXShldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVSZXBsYWNlVG9rZW5zID0gZnVuY3Rpb24gKGlzVmFyLCBnZXRWYXIsIHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSkgewogICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VUb2tlbnNJblN0cmluZzsKICAgICAgICAgICAgICAgIHZhciByZXBsYWNlVG9rZW5zSW5PYmplY3Q7CiAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZVRva2Vuc0luQXJyYXk7CiAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZVRva2VuczsKICAgICAgICAgICAgICAgIHZhciB2YXJpYWJsZXNCZWluZ1JldHJpZXZlZCA9IFtdOwogICAgICAgICAgICAgICAgdmFyIGdldFZhclZhbHVlID0gZnVuY3Rpb24gKHRva2VuLCB2YXJpYWJsZU5hbWUsIHN5bnRoZXRpY0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1Zhcih2YXJpYWJsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQmVpbmdSZXRyaWV2ZWQucHVzaCh2YXJpYWJsZU5hbWUpOwogICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBnZXRWYXIodmFyaWFibGVOYW1lLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQmVpbmdSZXRyaWV2ZWQucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCA9PSBudWxsICYmIHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSA/ICcnIDogdmFsOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlcGxhY2VUb2tlbnNJblN0cmluZyA9IGZ1bmN0aW9uIChzdHIsIHN5bnRoZXRpY0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IC9eJShbXiVdKyklJC8uZXhlYyhzdHIpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhclZhbHVlKHN0ciwgcmVzdWx0WzFdLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8lKC4rPyklL2csIGZ1bmN0aW9uICh0b2tlbiwgdmFyaWFibGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFyVmFsdWUodG9rZW4sIHZhcmlhYmxlTmFtZSwgc3ludGhldGljRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmVwbGFjZVRva2Vuc0luT2JqZWN0ID0gZnVuY3Rpb24gKG9iaiwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb2JqW2tleV07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldFtrZXldID0gcmVwbGFjZVRva2Vucyh2YWx1ZSwgc3ludGhldGljRXZlbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlcGxhY2VUb2tlbnNJbkFycmF5ID0gZnVuY3Rpb24gKGFyciwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmV0ID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFyci5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICByZXQucHVzaChyZXBsYWNlVG9rZW5zKGFycltpXSwgc3ludGhldGljRXZlbnQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXBsYWNlVG9rZW5zID0gZnVuY3Rpb24gKHRoaW5nLCBzeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpbmcgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlVG9rZW5zSW5TdHJpbmcodGhpbmcsIHN5bnRoZXRpY0V2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlVG9rZW5zSW5BcnJheSh0aGluZywgc3ludGhldGljRXZlbnQpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaW5nID09PSAnb2JqZWN0JyAmJiB0aGluZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZVRva2Vuc0luT2JqZWN0KHRoaW5nLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRoaW5nLCBzeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZXNCZWluZ1JldHJpZXZlZC5sZW5ndGggPiAxMCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0RhdGEgZWxlbWVudCBjaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICcgKyB2YXJpYWJsZXNCZWluZ1JldHJpZXZlZC5qb2luKCcgLT4gJykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlVG9rZW5zKHRoaW5nLCBzeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlU2V0Q3VzdG9tVmFyID0gZnVuY3Rpb24gKGN1c3RvbVZhcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMF0gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVZhcnNbYXJndW1lbnRzWzBdXSA9IGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3VtZW50c1swXSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFwcGluZyA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG1hcHBpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVZhcnNba2V5XSA9IG1hcHBpbmdba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmFsbHlDb25zdHJ1Y3RvcihjYWxsYmFjaykgewogICAgICAgICAgICAgICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlamVjdChyZWFzb24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHNldFRpbWVvdXRGdW5jID0gc2V0VGltZW91dDsKICAgICAgICAgICAgZnVuY3Rpb24gaXNBcnJheSh4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih4ICYmIHR5cGVvZiB4Lmxlbmd0aCAhPT0gJ3VuZGVmaW5lZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG5vb3AoKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmbi5hcHBseSh0aGlzQXJnLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBQcm9taXNlKGZuKSB7CiAgICAgICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSkpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Jyk7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25vdCBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDA7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkcyA9IFtdOwogICAgICAgICAgICAgICAgZG9SZXNvbHZlKGZuLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBoYW5kbGUoc2VsZiwgZGVmZXJyZWQpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgIHNlbGYgPSBzZWxmLl92YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxmLl9zdGF0ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RlZmVycmVkcy5wdXNoKGRlZmVycmVkKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIFByb21pc2UuX2ltbWVkaWF0ZUZuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDsKICAgICAgICAgICAgICAgICAgICBpZiAoY2IgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX3N0YXRlID09PSAxID8gcmVzb2x2ZSA6IHJlamVjdCkoZGVmZXJyZWQucHJvbWlzZSwgc2VsZi5fdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGRlZmVycmVkLnByb21pc2UsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGVmZXJyZWQucHJvbWlzZSwgcmV0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmUoc2VsZiwgbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLicpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAmJiAodHlwZW9mIG5ld1ZhbHVlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgbmV3VmFsdWUgPT09ICdmdW5jdGlvbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aGVuID0gbmV3VmFsdWUudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsZShzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9SZXNvbHZlKGJpbmQodGhlbiwgbmV3VmFsdWUpLCBzZWxmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICBmaW5hbGUoc2VsZik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHNlbGYsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdChzZWxmLCBuZXdWYWx1ZSkgewogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAyOwogICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgIGZpbmFsZShzZWxmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmaW5hbGUoc2VsZikgewogICAgICAgICAgICAgICAgaWYgKHNlbGYuX3N0YXRlID09PSAyICYmIHNlbGYuX2RlZmVycmVkcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VsZi5faGFuZGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc2VsZi5fZGVmZXJyZWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlKHNlbGYsIHNlbGYuX2RlZmVycmVkc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmLl9kZWZlcnJlZHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHsKICAgICAgICAgICAgICAgIHRoaXMub25GdWxmaWxsZWQgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IG51bGw7CiAgICAgICAgICAgICAgICB0aGlzLm9uUmVqZWN0ZWQgPSB0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uUmVqZWN0ZWQgOiBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHsKICAgICAgICAgICAgICAgIHZhciBkb25lID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGZuKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZiwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICByZWplY3Qoc2VsZiwgcmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZWplY3Qoc2VsZiwgZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIFByb21pc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHZhciBwcm9tID0gbmV3IHRoaXMuY29uc3RydWN0b3Iobm9vcCk7CiAgICAgICAgICAgICAgICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTsKICAgICAgICAgICAgICAgIHJldHVybiBwcm9tOwogICAgICAgICAgICB9OwogICAgICAgICAgICBQcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddID0gZmluYWxseUNvbnN0cnVjdG9yOwogICAgICAgICAgICBQcm9taXNlLmFsbCA9IGZ1bmN0aW9uIChhcnIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGFycikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5JykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFycik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShbXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGFyZ3MubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlcyhpLCB2YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRoZW4gPSB2YWwudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoZW4gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKHZhbCwgZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gdmFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyhpLCBhcmdzW2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIFByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKGFycikgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQXJyYXkoYXJyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ1Byb21pc2UucmFjZSBhY2NlcHRzIGFuIGFycmF5JykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShhcnJbaV0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgUHJvbWlzZS5faW1tZWRpYXRlRm4gPSB0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nICYmIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKGZuKTsKICAgICAgICAgICAgfSB8fCBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXRGdW5jKGZuLCAwKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4gPSBmdW5jdGlvbiBfdW5oYW5kbGVkUmVqZWN0aW9uRm4oZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc3JjID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgICAgICAgICAnZGVmYXVsdCc6IFByb21pc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciByZXF1aXJlJCQwID0gZ2V0QXVnbWVudGVkTmFtZXNwYWNlKHNyYyk7CiAgICAgICAgICAgIHZhciByZWFjdG9yUHJvbWlzZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5Qcm9taXNlIHx8IHR5cGVvZiBjb21tb25qc0dsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgY29tbW9uanNHbG9iYWwuUHJvbWlzZSB8fCByZXF1aXJlJCQwLmRlZmF1bHQgfHwgcmVxdWlyZSQkMDsKICAgICAgICAgICAgdmFyIGNyZWF0ZUFkZEFjdGlvblRvUXVldWUgPSBmdW5jdGlvbiAoZXhlY3V0ZURlbGVnYXRlTW9kdWxlLCBub3JtYWxpemVSdWxlQ29tcG9uZW50RXJyb3IsIGxvZ0FjdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbiwgcnVsZSwgc3ludGhldGljRXZlbnQsIGxhc3RQcm9taXNlSW5RdWV1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsYXN0UHJvbWlzZUluUXVldWUudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxheU5leHRBY3Rpb24gPSBhY3Rpb24uZGVsYXlOZXh0OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uVGltZW91dElkOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHJlYWN0b3JQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVSZXN1bHQgPSBleGVjdXRlRGVsZWdhdGVNb2R1bGUoYWN0aW9uLCBzeW50aGV0aWNFdmVudCwgW3N5bnRoZXRpY0V2ZW50XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbGF5TmV4dEFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZVRpbWVvdXRNcyA9IGFjdGlvbi50aW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVvdXRQcm9taXNlID0gbmV3IHJlYWN0b3JQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGFjdGlvbiB0b29rIGxvbmdlciB0aGFuICcgKyBwcm9taXNlVGltZW91dE1zIC8gMTAwMCArICcgc2Vjb25kcyB0byBjb21wbGV0ZS4gJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHByb21pc2VUaW1lb3V0TXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjdG9yUHJvbWlzZS5yYWNlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFByb21pc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY3Rpb25UaW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5vcm1hbGl6ZVJ1bGVDb21wb25lbnRFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0FjdGlvbkVycm9yKGFjdGlvbiwgcnVsZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RvclByb21pc2UucmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY3Rpb25UaW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVBZGRDb25kaXRpb25Ub1F1ZXVlID0gZnVuY3Rpb24gKGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZSwgbm9ybWFsaXplUnVsZUNvbXBvbmVudEVycm9yLCBpc0NvbmRpdGlvbk1ldCwgbG9nQ29uZGl0aW9uRXJyb3IsIGxvZ0NvbmRpdGlvbk5vdE1ldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb25kaXRpb24sIHJ1bGUsIHN5bnRoZXRpY0V2ZW50LCBsYXN0UHJvbWlzZUluUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFByb21pc2VJblF1ZXVlLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uVGltZW91dElkOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHJlYWN0b3JQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVSZXN1bHQgPSBleGVjdXRlRGVsZWdhdGVNb2R1bGUoY29uZGl0aW9uLCBzeW50aGV0aWNFdmVudCwgW3N5bnRoZXRpY0V2ZW50XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZVRpbWVvdXRNcyA9IGNvbmRpdGlvbi50aW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWVvdXRQcm9taXNlID0gbmV3IHJlYWN0b3JQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25UaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGNvbmRpdGlvbiB0b29rIGxvbmdlciB0aGFuICcgKyBwcm9taXNlVGltZW91dE1zIC8gMTAwMCArICcgc2Vjb25kcyB0byBjb21wbGV0ZS4gJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHByb21pc2VUaW1lb3V0TXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjdG9yUHJvbWlzZS5yYWNlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dFByb21pc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjb25kaXRpb25UaW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5vcm1hbGl6ZVJ1bGVDb21wb25lbnRFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbmRpdGlvbkVycm9yKGNvbmRpdGlvbiwgcnVsZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RvclByb21pc2UucmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjb25kaXRpb25UaW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbmRpdGlvbk1ldChjb25kaXRpb24sIHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dDb25kaXRpb25Ob3RNZXQoY29uZGl0aW9uLCBydWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhY3RvclByb21pc2UucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGxhc3RQcm9taXNlSW5RdWV1ZSA9IHJlYWN0b3JQcm9taXNlLnJlc29sdmUoKTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUFkZFJ1bGVUb1F1ZXVlID0gZnVuY3Rpb24gKGFkZENvbmRpdGlvblRvUXVldWUsIGFkZEFjdGlvblRvUXVldWUsIGxvZ1J1bGVDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocnVsZSwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5jb25kaXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGUuY29uZGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcm9taXNlSW5RdWV1ZSA9IGFkZENvbmRpdGlvblRvUXVldWUoY29uZGl0aW9uLCBydWxlLCBzeW50aGV0aWNFdmVudCwgbGFzdFByb21pc2VJblF1ZXVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmFjdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5hY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFByb21pc2VJblF1ZXVlID0gYWRkQWN0aW9uVG9RdWV1ZShhY3Rpb24sIHJ1bGUsIHN5bnRoZXRpY0V2ZW50LCBsYXN0UHJvbWlzZUluUXVldWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGFzdFByb21pc2VJblF1ZXVlID0gbGFzdFByb21pc2VJblF1ZXVlLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsb2dSdWxlQ29tcGxldGVkKHJ1bGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGxhc3RQcm9taXNlSW5RdWV1ZSA9IGxhc3RQcm9taXNlSW5RdWV1ZS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RQcm9taXNlSW5RdWV1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBpc1Byb21pc2VMaWtlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUV2YWx1YXRlQ29uZGl0aW9ucyA9IGZ1bmN0aW9uIChleGVjdXRlRGVsZWdhdGVNb2R1bGUsIGlzQ29uZGl0aW9uTWV0LCBsb2dDb25kaXRpb25Ob3RNZXQsIGxvZ0NvbmRpdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJ1bGUsIHN5bnRoZXRpY0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbjsKICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5jb25kaXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZS5jb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb24gPSBydWxlLmNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBleGVjdXRlRGVsZWdhdGVNb2R1bGUoY29uZGl0aW9uLCBzeW50aGV0aWNFdmVudCwgW3N5bnRoZXRpY0V2ZW50XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2UocmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bGUgY29tcG9uZW50IHNlcXVlbmNpbmcgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBwcm9wZXJ0eSAnICsgJ2ZvciB0aGlzIGNvbmRpdGlvbiB0byBmdW5jdGlvbiBwcm9wZXJseS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbmRpdGlvbk1ldChjb25kaXRpb24sIHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nQ29uZGl0aW9uTm90TWV0KGNvbmRpdGlvbiwgcnVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nQ29uZGl0aW9uRXJyb3IoY29uZGl0aW9uLCBydWxlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlRXhlY3V0ZVJ1bGUgPSBmdW5jdGlvbiAoZXZhbHVhdGVDb25kaXRpb25zLCBydW5BY3Rpb25zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJ1bGUsIG5vcm1hbGl6ZWRTeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgIGlmIChldmFsdWF0ZUNvbmRpdGlvbnMocnVsZSwgbm9ybWFsaXplZFN5bnRoZXRpY0V2ZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICBydW5BY3Rpb25zKHJ1bGUsIG5vcm1hbGl6ZWRTeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUdldE1vZHVsZURpc3BsYXlOYW1lQnlSdWxlQ29tcG9uZW50ID0gZnVuY3Rpb24gKG1vZHVsZVByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJ1bGVDb21wb25lbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbW9kdWxlRGVmaW5pdGlvbiA9IG1vZHVsZVByb3ZpZGVyLmdldE1vZHVsZURlZmluaXRpb24ocnVsZUNvbXBvbmVudC5tb2R1bGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlRGVmaW5pdGlvbiAmJiBtb2R1bGVEZWZpbml0aW9uLmRpc3BsYXlOYW1lIHx8IHJ1bGVDb21wb25lbnQubW9kdWxlUGF0aDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVHZXRTeW50aGV0aWNFdmVudE1ldGEgPSBmdW5jdGlvbiAobW9kdWxlUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocnVsZUV2ZW50UGFpcikgewogICAgICAgICAgICAgICAgICAgIHZhciBydWxlID0gcnVsZUV2ZW50UGFpci5ydWxlOwogICAgICAgICAgICAgICAgICAgIHZhciBldmVudCA9IHJ1bGVFdmVudFBhaXIuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtb2R1bGVQcm92aWRlci5nZXRNb2R1bGVEZWZpbml0aW9uKGV2ZW50Lm1vZHVsZVBhdGgpLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVuc2lvbk5hbWUgPSBtb2R1bGVQcm92aWRlci5nZXRNb2R1bGVFeHRlbnNpb25OYW1lKGV2ZW50Lm1vZHVsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0eXBlOiBleHRlbnNpb25OYW1lICsgJy4nICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgJHJ1bGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBydWxlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcnVsZS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUluaXRFdmVudE1vZHVsZSA9IGZ1bmN0aW9uICh0cmlnZ2VyUnVsZSwgZXhlY3V0ZURlbGVnYXRlTW9kdWxlLCBub3JtYWxpemVTeW50aGV0aWNFdmVudCwgZ2V0RXJyb3JNZXNzYWdlLCBnZXRTeW50aGV0aWNFdmVudE1ldGEsIGxvZ2dlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChndWFyZFVudGlsQWxsSW5pdGlhbGl6ZWQsIHJ1bGVFdmVudFBhaXIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcnVsZSA9IHJ1bGVFdmVudFBhaXIucnVsZTsKICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBydWxlRXZlbnRQYWlyLmV2ZW50OwogICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldHRpbmdzID0gZXZlbnQuc2V0dGluZ3MgfHwge307CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bnRoZXRpY0V2ZW50TWV0YSA9IGdldFN5bnRoZXRpY0V2ZW50TWV0YShydWxlRXZlbnRQYWlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZURlbGVnYXRlTW9kdWxlKGV2ZW50LCBudWxsLCBbZnVuY3Rpb24gdHJpZ2dlcihzeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkU3ludGhldGljRXZlbnQgPSBub3JtYWxpemVTeW50aGV0aWNFdmVudChzeW50aGV0aWNFdmVudE1ldGEsIHN5bnRoZXRpY0V2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWFyZFVudGlsQWxsSW5pdGlhbGl6ZWQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyUnVsZShub3JtYWxpemVkU3ludGhldGljRXZlbnQsIHJ1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGdldEVycm9yTWVzc2FnZShldmVudCwgcnVsZSwgZSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVMb2dBY3Rpb25FcnJvciA9IGZ1bmN0aW9uIChnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlLCBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudCwgbG9nZ2VyLCBub3RpZnlNb25pdG9ycykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24sIHJ1bGUsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aW9uRGlzcGxheU5hbWUgPSBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudChhY3Rpb24pOwogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlKGFjdGlvbkRpc3BsYXlOYW1lLCBydWxlLm5hbWUsIGUpKTsKICAgICAgICAgICAgICAgICAgICBub3RpZnlNb25pdG9ycygncnVsZUFjdGlvbkZhaWxlZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogcnVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBhY3Rpb24KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVMb2dDb25kaXRpb25FcnJvciA9IGZ1bmN0aW9uIChnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlLCBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudCwgbG9nZ2VyLCBub3RpZnlNb25pdG9ycykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb25kaXRpb24sIHJ1bGUsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgY29uZGl0aW9uRGlzcGxheU5hbWUgPSBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudChjb25kaXRpb24pOwogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlKGNvbmRpdGlvbkRpc3BsYXlOYW1lLCBydWxlLm5hbWUsIGUpKTsKICAgICAgICAgICAgICAgICAgICBub3RpZnlNb25pdG9ycygncnVsZUNvbmRpdGlvbkZhaWxlZCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVsZTogcnVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBjb25kaXRpb24KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBjcmVhdGVMb2dDb25kaXRpb25Ob3RNZXQgPSBmdW5jdGlvbiAoZ2V0TW9kdWxlRGlzcGxheU5hbWVCeVJ1bGVDb21wb25lbnQsIGxvZ2dlciwgbm90aWZ5TW9uaXRvcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoY29uZGl0aW9uLCBydWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbmRpdGlvbkRpc3BsYXlOYW1lID0gZ2V0TW9kdWxlRGlzcGxheU5hbWVCeVJ1bGVDb21wb25lbnQoY29uZGl0aW9uKTsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKCdDb25kaXRpb24gIicgKyBjb25kaXRpb25EaXNwbGF5TmFtZSArICciIGZvciBydWxlICInICsgcnVsZS5uYW1lICsgJyIgd2FzIG5vdCBtZXQuJyk7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5TW9uaXRvcnMoJ3J1bGVDb25kaXRpb25GYWlsZWQnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IHJ1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogY29uZGl0aW9uCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlTG9nUnVsZUNvbXBsZXRlZCA9IGZ1bmN0aW9uIChsb2dnZXIsIG5vdGlmeU1vbml0b3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJ1bGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKCdSdWxlICInICsgcnVsZS5uYW1lICsgJyIgZmlyZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgbm90aWZ5TW9uaXRvcnMoJ3J1bGVDb21wbGV0ZWQnLCB7IHJ1bGU6IHJ1bGUgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlUnVuQWN0aW9ucyA9IGZ1bmN0aW9uIChleGVjdXRlRGVsZWdhdGVNb2R1bGUsIGxvZ0FjdGlvbkVycm9yLCBsb2dSdWxlQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHJ1bGUsIHN5bnRoZXRpY0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbjsKICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5hY3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZS5hY3Rpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBydWxlLmFjdGlvbnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZShhY3Rpb24sIHN5bnRoZXRpY0V2ZW50LCBbc3ludGhldGljRXZlbnRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dBY3Rpb25FcnJvcihhY3Rpb24sIHJ1bGUsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsb2dSdWxlQ29tcGxldGVkKHJ1bGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZVRyaWdnZXJSdWxlID0gZnVuY3Rpb24gKHJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCwgZXhlY3V0ZVJ1bGUsIGFkZFJ1bGVUb1F1ZXVlLCBub3RpZnlNb25pdG9ycykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChub3JtYWxpemVkU3ludGhldGljRXZlbnQsIHJ1bGUpIHsKICAgICAgICAgICAgICAgICAgICBub3RpZnlNb25pdG9ycygncnVsZVRyaWdnZXJlZCcsIHsgcnVsZTogcnVsZSB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJ1bGVUb1F1ZXVlKHJ1bGUsIG5vcm1hbGl6ZWRTeW50aGV0aWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJ1bGUocnVsZSwgbm9ybWFsaXplZFN5bnRoZXRpY0V2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZ2V0UnVsZUNvbXBvbmVudEVycm9yTWVzc2FnZSA9IGZ1bmN0aW9uIChydWxlQ29tcG9uZW50TmFtZSwgcnVsZU5hbWUsIGVycm9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ0ZhaWxlZCB0byBleGVjdXRlICInICsgcnVsZUNvbXBvbmVudE5hbWUgKyAnIiBmb3IgIicgKyBydWxlTmFtZSArICciIHJ1bGUuICcgKyBlcnJvci5tZXNzYWdlICsgKGVycm9yLnN0YWNrID8gJ1xuJyArIGVycm9yLnN0YWNrIDogJycpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgaXNDb25kaXRpb25NZXQgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCByZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQgJiYgIWNvbmRpdGlvbi5uZWdhdGUgfHwgIXJlc3VsdCAmJiBjb25kaXRpb24ubmVnYXRlOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgdHJpZ2dlckNhbGxRdWV1ZSA9IFtdOwogICAgICAgICAgICB2YXIgZXZlbnRNb2R1bGVzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdmFyIGd1YXJkVW50aWxBbGxJbml0aWFsaXplZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICAgICAgaWYgKCFldmVudE1vZHVsZXNJbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDYWxsUXVldWUucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBpbml0UnVsZXMgPSBmdW5jdGlvbiAoYnVpbGRSdWxlRXhlY3V0aW9uT3JkZXIsIHJ1bGVzLCBpbml0RXZlbnRNb2R1bGUpIHsKICAgICAgICAgICAgICAgIGJ1aWxkUnVsZUV4ZWN1dGlvbk9yZGVyKHJ1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlRXZlbnRQYWlyKSB7CiAgICAgICAgICAgICAgICAgICAgaW5pdEV2ZW50TW9kdWxlKGd1YXJkVW50aWxBbGxJbml0aWFsaXplZCwgcnVsZUV2ZW50UGFpcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGV2ZW50TW9kdWxlc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRyaWdnZXJDYWxsUXVldWUuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlckNhbGwpIHsKICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2FsbCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0cmlnZ2VyQ2FsbFF1ZXVlID0gW107CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBub3JtYWxpemVSdWxlQ29tcG9uZW50RXJyb3IgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICAgICAgZSA9IG5ldyBFcnJvcignVGhlIGV4dGVuc2lvbiB0cmlnZ2VyZWQgYW4gZXJyb3IsIGJ1dCBubyBlcnJvciBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmluZ2lmaWVkRXJyb3IgPSB0eXBlb2YgZSA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShlKSA6IFN0cmluZyhlKTsKICAgICAgICAgICAgICAgICAgICBlID0gbmV3IEVycm9yKHN0cmluZ2lmaWVkRXJyb3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzOwogICAgICAgICAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5OwogICAgICAgICAgICB2YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7CiAgICAgICAgICAgIGZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkgewogICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5hc3NpZ24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsKICAgICAgICAgICAgICAgICAgICB0ZXN0MVs1XSA9ICdkZSc7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHRlc3QyID0ge307CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3QyW25dOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5JykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0MyA9IHt9OwogICAgICAgICAgICAgICAgICAgICdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikgewogICAgICAgICAgICAgICAgICAgICAgICB0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9iamVjdEFzc2lnbiA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgdmFyIGZyb207CiAgICAgICAgICAgICAgICB2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpOwogICAgICAgICAgICAgICAgdmFyIHN5bWJvbHM7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykgewogICAgICAgICAgICAgICAgICAgIGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZnJvbSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1trZXldID0gZnJvbVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRvOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcmVhY3Rvck9iamVjdEFzc2lnbiA9IG9iamVjdEFzc2lnbjsKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZVN5bnRoZXRpY0V2ZW50ID0gZnVuY3Rpb24gKHN5bnRoZXRpY0V2ZW50TWV0YSwgc3ludGhldGljRXZlbnQpIHsKICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50ID0gc3ludGhldGljRXZlbnQgfHwge307CiAgICAgICAgICAgICAgICByZWFjdG9yT2JqZWN0QXNzaWduKHN5bnRoZXRpY0V2ZW50LCBzeW50aGV0aWNFdmVudE1ldGEpOwogICAgICAgICAgICAgICAgaWYgKCFzeW50aGV0aWNFdmVudC5oYXNPd25Qcm9wZXJ0eSgndHlwZScpKSB7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bnRoZXRpY0V2ZW50LCAndHlwZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVwcmVjYXRpb24oJ0FjY2Vzc2luZyBldmVudC50eXBlIGluIEFkb2JlIExhdW5jaCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlICcgKyAncmVtb3ZlZCBzb29uLiBQbGVhc2UgdXNlIGV2ZW50LiR0eXBlIGluc3RlYWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ludGhldGljRXZlbnQuJHR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzeW50aGV0aWNFdmVudDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUdldFNoYXJlZE1vZHVsZUV4cG9ydHMgPSBmdW5jdGlvbiAoZXh0ZW5zaW9ucywgbW9kdWxlUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXh0ZW5zaW9uTmFtZSwgbW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdOwogICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZXMgPSBleHRlbnNpb24ubW9kdWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXRocyA9IE9iamVjdC5rZXlzKG1vZHVsZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWZlcmVuY2VQYXRocy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZWZlcmVuY2VQYXRoID0gcmVmZXJlbmNlUGF0aHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZSA9IG1vZHVsZXNbcmVmZXJlbmNlUGF0aF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZHVsZS5zaGFyZWQgJiYgbW9kdWxlLm5hbWUgPT09IG1vZHVsZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVByb3ZpZGVyLmdldE1vZHVsZUV4cG9ydHMocmVmZXJlbmNlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUdldEV4dGVuc2lvblNldHRpbmdzID0gZnVuY3Rpb24gKHJlcGxhY2VUb2tlbnMsIHNldHRpbmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXR0aW5ncyA/IHJlcGxhY2VUb2tlbnMoc2V0dGluZ3MpIDoge307CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlR2V0SG9zdGVkTGliRmlsZVVybCA9IGZ1bmN0aW9uIChob3N0ZWRMaWJGaWxlc0Jhc2VVcmwsIG1pbmlmaWVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWluaWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVQYXJ0cyA9IGZpbGUuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhcnRzLnNwbGljZShmaWxlUGFydHMubGVuZ3RoIC0gMSB8fCAxLCAwLCAnbWluJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmaWxlUGFydHMuam9pbignLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9zdGVkTGliRmlsZXNCYXNlVXJsICsgZmlsZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBKU19FWFRFTlNJT04gPSAnLmpzJzsKICAgICAgICAgICAgdmFyIGRpcm5hbWUgPSBmdW5jdGlvbiAocGF0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyKDAsIHBhdGgubGFzdEluZGV4T2YoJy8nKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBlbmRzV2l0aCA9IGZ1bmN0aW9uIChzdHIsIHN1ZmZpeCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5pbmRleE9mKHN1ZmZpeCwgc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpICE9PSAtMTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlc29sdmVSZWxhdGl2ZVBhdGggPSBmdW5jdGlvbiAoZnJvbVBhdGgsIHJlbGF0aXZlUGF0aCkgewogICAgICAgICAgICAgICAgaWYgKCFlbmRzV2l0aChyZWxhdGl2ZVBhdGgsIEpTX0VYVEVOU0lPTikpIHsKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGggKyBKU19FWFRFTlNJT047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcmVsYXRpdmVQYXRoU2VnbWVudHMgPSByZWxhdGl2ZVBhdGguc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIHZhciByZXNvbHZlZFBhdGhTZWdtZW50cyA9IGRpcm5hbWUoZnJvbVBhdGgpLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICByZWxhdGl2ZVBhdGhTZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChyZWxhdGl2ZVBhdGhTZWdtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGhTZWdtZW50IHx8IHJlbGF0aXZlUGF0aFNlZ21lbnQgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGl2ZVBhdGhTZWdtZW50ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZFBhdGhTZWdtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aFNlZ21lbnRzLnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoU2VnbWVudHMucHVzaChyZWxhdGl2ZVBhdGhTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGhTZWdtZW50cy5qb2luKCcvJyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciByZWFjdG9yRG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICAgICAgdmFyIGdldFByb21pc2UgPSBmdW5jdGlvbiAodXJsLCBzY3JpcHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcmVhY3RvclByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBzY3JpcHQgJyArIHVybCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHJlYWN0b3JMb2FkU2NyaXB0ID0gZnVuY3Rpb24gKHVybCkgewogICAgICAgICAgICAgICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHVybDsKICAgICAgICAgICAgICAgIHNjcmlwdC5hc3luYyA9IHRydWU7CiAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IGdldFByb21pc2UodXJsLCBzY3JpcHQpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhc093blByb3BlcnR5JDEob2JqLCBwcm9wKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRlY29kZSA9IGZ1bmN0aW9uIChxcywgc2VwLCBlcSwgb3B0aW9ucykgewogICAgICAgICAgICAgICAgc2VwID0gc2VwIHx8ICcmJzsKICAgICAgICAgICAgICAgIGVxID0gZXEgfHwgJz0nOwogICAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByZWdleHAgPSAvXCsvZzsKICAgICAgICAgICAgICAgIHFzID0gcXMuc3BsaXQoc2VwKTsKICAgICAgICAgICAgICAgIHZhciBtYXhLZXlzID0gMTAwMDsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsZW4gPSBxcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykgewogICAgICAgICAgICAgICAgICAgIGxlbiA9IG1heEtleXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLCBpZHggPSB4LmluZGV4T2YoZXEpLCBrc3RyLCB2c3RyLCBrLCB2OwogICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTsKICAgICAgICAgICAgICAgICAgICAgICAgdnN0ciA9IHguc3Vic3RyKGlkeCArIDEpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtzdHIgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICB2c3RyID0gJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7CiAgICAgICAgICAgICAgICAgICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc093blByb3BlcnR5JDEob2JqLCBrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvYmpba10gPSB2OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmpba10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrXS5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc3RyaW5naWZ5UHJpbWl0aXZlID0gZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHYpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdiA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICAgICAgICAgICAgICBjYXNlICdudW1iZXInOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJzsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZW5jb2RlID0gZnVuY3Rpb24gKG9iaiwgc2VwLCBlcSwgbmFtZSkgewogICAgICAgICAgICAgICAgc2VwID0gc2VwIHx8ICcmJzsKICAgICAgICAgICAgICAgIGVxID0gZXEgfHwgJz0nOwogICAgICAgICAgICAgICAgaWYgKG9iaiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG9iaiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLm1hcChmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmpba10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2tdLm1hcChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihzZXApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmpba10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oc2VwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghbmFtZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShuYW1lKSkgKyBlcSArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBxdWVyeXN0cmluZyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgICAgICAgICAgICAgIGV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IGRlY29kZTsKICAgICAgICAgICAgICAgIGV4cG9ydHMuZW5jb2RlID0gZXhwb3J0cy5zdHJpbmdpZnkgPSBlbmNvZGU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgcmVhY3RvclF1ZXJ5U3RyaW5nID0gewogICAgICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0cmluZyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeXN0cmluZy5wYXJzZShzdHJpbmcpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHN0cmluZ2lmeTogZnVuY3Rpb24gKG9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWVyeXN0cmluZy5zdHJpbmdpZnkob2JqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIENPUkVfTU9EVUxFX1BSRUZJWCA9ICdAYWRvYmUvcmVhY3Rvci0nOwogICAgICAgICAgICB2YXIgbW9kdWxlcyA9IHsKICAgICAgICAgICAgICAgIGNvb2tpZTogcmVhY3RvckNvb2tpZSwKICAgICAgICAgICAgICAgIGRvY3VtZW50OiByZWFjdG9yRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAnbG9hZC1zY3JpcHQnOiByZWFjdG9yTG9hZFNjcmlwdCwKICAgICAgICAgICAgICAgICdvYmplY3QtYXNzaWduJzogcmVhY3Rvck9iamVjdEFzc2lnbiwKICAgICAgICAgICAgICAgIHByb21pc2U6IHJlYWN0b3JQcm9taXNlLAogICAgICAgICAgICAgICAgJ3F1ZXJ5LXN0cmluZyc6IHJlYWN0b3JRdWVyeVN0cmluZywKICAgICAgICAgICAgICAgIHdpbmRvdzogcmVhY3RvcldpbmRvdwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgY3JlYXRlUHVibGljUmVxdWlyZSA9IGZ1bmN0aW9uIChnZXRNb2R1bGVFeHBvcnRzQnlSZWxhdGl2ZVBhdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKENPUkVfTU9EVUxFX1BSRUZJWCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleVdpdGhvdXRTY29wZSA9IGtleS5zdWJzdHIoQ09SRV9NT0RVTEVfUFJFRklYLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2tleVdpdGhvdXRTY29wZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCcuLycpID09PSAwIHx8IGtleS5pbmRleE9mKCcuLi8nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TW9kdWxlRXhwb3J0c0J5UmVsYXRpdmVQYXRoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc29sdmUgbW9kdWxlICInICsga2V5ICsgJyIuJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgaHlkcmF0ZU1vZHVsZVByb3ZpZGVyID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgbW9kdWxlUHJvdmlkZXIsIGRlYnVnQ29udHJvbGxlciwgcmVwbGFjZVRva2VucywgZ2V0RGF0YUVsZW1lbnRWYWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBjb250YWluZXIuZXh0ZW5zaW9uczsKICAgICAgICAgICAgICAgIHZhciBidWlsZEluZm8gPSBjb250YWluZXIuYnVpbGRJbmZvOwogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5U2V0dGluZ3MgPSBjb250YWluZXIucHJvcGVydHkuc2V0dGluZ3M7CiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIHZhciBnZXRTaGFyZWRNb2R1bGVFeHBvcnRzID0gY3JlYXRlR2V0U2hhcmVkTW9kdWxlRXhwb3J0cyhleHRlbnNpb25zLCBtb2R1bGVQcm92aWRlcik7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXh0ZW5zaW9ucykuZm9yRWFjaChmdW5jdGlvbiAoZXh0ZW5zaW9uTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdldEV4dGVuc2lvblNldHRpbmdzID0gY3JlYXRlR2V0RXh0ZW5zaW9uU2V0dGluZ3MocmVwbGFjZVRva2VucywgZXh0ZW5zaW9uLnNldHRpbmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5tb2R1bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlZml4ZWRMb2dnZXIgPSBsb2dnZXIuY3JlYXRlUHJlZml4ZWRMb2dnZXIoZXh0ZW5zaW9uLmRpc3BsYXlOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnZXRIb3N0ZWRMaWJGaWxlVXJsID0gY3JlYXRlR2V0SG9zdGVkTGliRmlsZVVybChleHRlbnNpb24uaG9zdGVkTGliRmlsZXNCYXNlVXJsLCBidWlsZEluZm8ubWluaWZpZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR1cmJpbmUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRJbmZvOiBidWlsZEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUVsZW1lbnRWYWx1ZTogZ2V0RGF0YUVsZW1lbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFeHRlbnNpb25TZXR0aW5nczogZ2V0RXh0ZW5zaW9uU2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SG9zdGVkTGliRmlsZVVybDogZ2V0SG9zdGVkTGliRmlsZVVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGFyZWRNb2R1bGU6IGdldFNoYXJlZE1vZHVsZUV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOiBwcmVmaXhlZExvZ2dlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVNldHRpbmdzOiBwcm9wZXJ0eVNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VUb2tlbnM6IHJlcGxhY2VUb2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWJ1Z0NoYW5nZWQ6IGRlYnVnQ29udHJvbGxlci5vbkRlYnVnQ2hhbmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGVidWdFbmFibGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVidWdDb250cm9sbGVyLmdldERlYnVnRW5hYmxlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhleHRlbnNpb24ubW9kdWxlcykuZm9yRWFjaChmdW5jdGlvbiAocmVmZXJlbmNlUGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGUgPSBleHRlbnNpb24ubW9kdWxlc1tyZWZlcmVuY2VQYXRoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0TW9kdWxlRXhwb3J0c0J5UmVsYXRpdmVQYXRoID0gZnVuY3Rpb24gKHJlbGF0aXZlUGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZWRSZWZlcmVuY2VQYXRoID0gcmVzb2x2ZVJlbGF0aXZlUGF0aChyZWZlcmVuY2VQYXRoLCByZWxhdGl2ZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlUHJvdmlkZXIuZ2V0TW9kdWxlRXhwb3J0cyhyZXNvbHZlZFJlZmVyZW5jZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHB1YmxpY1JlcXVpcmUgPSBjcmVhdGVQdWJsaWNSZXF1aXJlKGdldE1vZHVsZUV4cG9ydHNCeVJlbGF0aXZlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvdmlkZXIucmVnaXN0ZXJNb2R1bGUocmVmZXJlbmNlUGF0aCwgbW9kdWxlLCBleHRlbnNpb25OYW1lLCBwdWJsaWNSZXF1aXJlLCB0dXJiaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvdmlkZXIuaHlkcmF0ZUNhY2hlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlUHJvdmlkZXI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBoeWRyYXRlU2F0ZWxsaXRlT2JqZWN0ID0gZnVuY3Rpb24gKF9zYXRlbGxpdGUsIGNvbnRhaW5lciwgc2V0RGVidWdFbmFibGVkLCBnZXRWYXIsIHNldEN1c3RvbVZhcikgewogICAgICAgICAgICAgICAgdmFyIGN1c3RvbVNjcmlwdFByZWZpeGVkTG9nZ2VyID0gbG9nZ2VyLmNyZWF0ZVByZWZpeGVkTG9nZ2VyKCdDdXN0b20gU2NyaXB0Jyk7CiAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnRyYWNrID0gZnVuY3Rpb24gKGlkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKCciJyArIGlkZW50aWZpZXIgKyAnIiBkb2VzIG5vdCBtYXRjaCBhbnkgZGlyZWN0IGNhbGwgaWRlbnRpZmllcnMuJyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5nZXRWaXNpdG9ySWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5wcm9wZXJ0eSA9IHsgbmFtZTogY29udGFpbmVyLnByb3BlcnR5Lm5hbWUgfTsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuY29tcGFueSA9IGNvbnRhaW5lci5jb21wYW55OwogICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5idWlsZEluZm8gPSBjb250YWluZXIuYnVpbGRJbmZvOwogICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5sb2dnZXIgPSBjdXN0b21TY3JpcHRQcmVmaXhlZExvZ2dlcjsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUubm90aWZ5ID0gZnVuY3Rpb24gKG1lc3NhZ2UsIGxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlcHJlY2F0aW9uKCdfc2F0ZWxsaXRlLm5vdGlmeSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRoZSBgX3NhdGVsbGl0ZS5sb2dnZXJgIEFQSS4nKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxldmVsKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TY3JpcHRQcmVmaXhlZExvZ2dlci5pbmZvKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNjcmlwdFByZWZpeGVkTG9nZ2VyLndhcm4obWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2NyaXB0UHJlZml4ZWRMb2dnZXIuZXJyb3IobWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNjcmlwdFByZWZpeGVkTG9nZ2VyLmxvZyhtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5nZXRWYXIgPSBnZXRWYXI7CiAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldFZhciA9IHNldEN1c3RvbVZhcjsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuc2V0Q29va2llID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBkYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnNTdHIgPSAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChkYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNTdHIgPSAnLCB7IGV4cGlyZXM6ICcgKyBkYXlzICsgJyB9JzsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gZGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9ICdfc2F0ZWxsaXRlLnNldENvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgKyAnX3NhdGVsbGl0ZS5jb29raWUuc2V0KCInICsgbmFtZSArICciLCAiJyArIHZhbHVlICsgJyInICsgb3B0aW9uc1N0ciArICcpLic7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlcHJlY2F0aW9uKG1zZyk7CiAgICAgICAgICAgICAgICAgICAgcmVhY3RvckNvb2tpZS5zZXQobmFtZSwgdmFsdWUsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUucmVhZENvb2tpZSA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlcHJlY2F0aW9uKCdfc2F0ZWxsaXRlLnJlYWRDb29raWUgaXMgZGVwcmVjYXRlZC4gJyArICdQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLmdldCgiJyArIG5hbWUgKyAnIikuJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWN0b3JDb29raWUuZ2V0KG5hbWUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUucmVtb3ZlQ29va2llID0gZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVwcmVjYXRpb24oJ19zYXRlbGxpdGUucmVtb3ZlQ29va2llIGlzIGRlcHJlY2F0ZWQuICcgKyAnUGxlYXNlIHVzZSBfc2F0ZWxsaXRlLmNvb2tpZS5yZW1vdmUoIicgKyBuYW1lICsgJyIpLicpOwogICAgICAgICAgICAgICAgICAgIHJlYWN0b3JDb29raWUucmVtb3ZlKG5hbWUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUuY29va2llID0gcmVhY3RvckNvb2tpZTsKICAgICAgICAgICAgICAgIF9zYXRlbGxpdGUucGFnZUJvdHRvbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBfc2F0ZWxsaXRlLnNldERlYnVnID0gc2V0RGVidWdFbmFibGVkOwogICAgICAgICAgICAgICAgdmFyIHdhcm5pbmdMb2dnZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfc2F0ZWxsaXRlLCAnX2NvbnRhaW5lcicsIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3YXJuaW5nTG9nZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignX3NhdGVsbGl0ZS5fY29udGFpbmVyIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIHNob3VsZCBvbmx5ICcgKyAnYmUgdXNlZCBmb3IgZGVidWdnaW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ0xvZ2dlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIF9zYXRlbGxpdGUgPSB3aW5kb3cuX3NhdGVsbGl0ZTsKICAgICAgICAgICAgaWYgKF9zYXRlbGxpdGUgJiYgIXdpbmRvdy5fX3NhdGVsbGl0ZUxvYWRlZCkgewogICAgICAgICAgICAgICAgd2luZG93Ll9fc2F0ZWxsaXRlTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBfc2F0ZWxsaXRlLmNvbnRhaW5lcjsKICAgICAgICAgICAgICAgIGRlbGV0ZSBfc2F0ZWxsaXRlLmNvbnRhaW5lcjsKICAgICAgICAgICAgICAgIHZhciB1bmRlZmluZWRWYXJzUmV0dXJuRW1wdHkgPSBjb250YWluZXIucHJvcGVydHkuc2V0dGluZ3MudW5kZWZpbmVkVmFyc1JldHVybkVtcHR5OwogICAgICAgICAgICAgICAgdmFyIHJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCA9IGNvbnRhaW5lci5wcm9wZXJ0eS5zZXR0aW5ncy5ydWxlQ29tcG9uZW50U2VxdWVuY2luZ0VuYWJsZWQ7CiAgICAgICAgICAgICAgICB2YXIgZGF0YUVsZW1lbnRzID0gY29udGFpbmVyLmRhdGFFbGVtZW50cyB8fCB7fTsKICAgICAgICAgICAgICAgIGRhdGFFbGVtZW50U2FmZS5taWdyYXRlQ29va2llRGF0YShkYXRhRWxlbWVudHMpOwogICAgICAgICAgICAgICAgdmFyIGdldERhdGFFbGVtZW50RGVmaW5pdGlvbiA9IGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFFbGVtZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlUHJvdmlkZXIgPSBjcmVhdGVNb2R1bGVQcm92aWRlcigpOwogICAgICAgICAgICAgICAgdmFyIHJlcGxhY2VUb2tlbnM7CiAgICAgICAgICAgICAgICB2YXIgcHJveHlSZXBsYWNlVG9rZW5zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlVG9rZW5zLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGdldERhdGFFbGVtZW50VmFsdWUgPSBjcmVhdGVHZXREYXRhRWxlbWVudFZhbHVlKG1vZHVsZVByb3ZpZGVyLCBnZXREYXRhRWxlbWVudERlZmluaXRpb24sIHByb3h5UmVwbGFjZVRva2VucywgdW5kZWZpbmVkVmFyc1JldHVybkVtcHR5KTsKICAgICAgICAgICAgICAgIHZhciBjdXN0b21WYXJzID0ge307CiAgICAgICAgICAgICAgICB2YXIgc2V0Q3VzdG9tVmFyID0gY3JlYXRlU2V0Q3VzdG9tVmFyKGN1c3RvbVZhcnMpOwogICAgICAgICAgICAgICAgdmFyIGlzVmFyID0gY3JlYXRlSXNWYXIoY3VzdG9tVmFycywgZ2V0RGF0YUVsZW1lbnREZWZpbml0aW9uKTsKICAgICAgICAgICAgICAgIHZhciBnZXRWYXIgPSBjcmVhdGVHZXRWYXIoY3VzdG9tVmFycywgZ2V0RGF0YUVsZW1lbnREZWZpbml0aW9uLCBnZXREYXRhRWxlbWVudFZhbHVlKTsKICAgICAgICAgICAgICAgIHJlcGxhY2VUb2tlbnMgPSBjcmVhdGVSZXBsYWNlVG9rZW5zKGlzVmFyLCBnZXRWYXIsIHVuZGVmaW5lZFZhcnNSZXR1cm5FbXB0eSk7CiAgICAgICAgICAgICAgICB2YXIgbG9jYWxTdG9yYWdlID0gZ2V0TmFtZXNwYWNlZFN0b3JhZ2UoJ2xvY2FsU3RvcmFnZScpOwogICAgICAgICAgICAgICAgdmFyIGRlYnVnQ29udHJvbGxlciA9IGNyZWF0ZURlYnVnQ29udHJvbGxlcihsb2NhbFN0b3JhZ2UsIGxvZ2dlcik7CiAgICAgICAgICAgICAgICBoeWRyYXRlU2F0ZWxsaXRlT2JqZWN0KF9zYXRlbGxpdGUsIGNvbnRhaW5lciwgZGVidWdDb250cm9sbGVyLnNldERlYnVnRW5hYmxlZCwgZ2V0VmFyLCBzZXRDdXN0b21WYXIpOwogICAgICAgICAgICAgICAgaHlkcmF0ZU1vZHVsZVByb3ZpZGVyKGNvbnRhaW5lciwgbW9kdWxlUHJvdmlkZXIsIGRlYnVnQ29udHJvbGxlciwgcmVwbGFjZVRva2VucywgZ2V0RGF0YUVsZW1lbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICB2YXIgbm90aWZ5TW9uaXRvcnMgPSBjcmVhdGVOb3RpZnlNb25pdG9ycyhfc2F0ZWxsaXRlKTsKICAgICAgICAgICAgICAgIHZhciBleGVjdXRlRGVsZWdhdGVNb2R1bGUgPSBjcmVhdGVFeGVjdXRlRGVsZWdhdGVNb2R1bGUobW9kdWxlUHJvdmlkZXIsIHJlcGxhY2VUb2tlbnMpOwogICAgICAgICAgICAgICAgdmFyIGdldE1vZHVsZURpc3BsYXlOYW1lQnlSdWxlQ29tcG9uZW50ID0gY3JlYXRlR2V0TW9kdWxlRGlzcGxheU5hbWVCeVJ1bGVDb21wb25lbnQobW9kdWxlUHJvdmlkZXIpOwogICAgICAgICAgICAgICAgdmFyIGxvZ0NvbmRpdGlvbk5vdE1ldCA9IGNyZWF0ZUxvZ0NvbmRpdGlvbk5vdE1ldChnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudCwgbG9nZ2VyLCBub3RpZnlNb25pdG9ycyk7CiAgICAgICAgICAgICAgICB2YXIgbG9nQ29uZGl0aW9uRXJyb3IgPSBjcmVhdGVMb2dDb25kaXRpb25FcnJvcihnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlLCBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudCwgbG9nZ2VyLCBub3RpZnlNb25pdG9ycyk7CiAgICAgICAgICAgICAgICB2YXIgbG9nQWN0aW9uRXJyb3IgPSBjcmVhdGVMb2dBY3Rpb25FcnJvcihnZXRSdWxlQ29tcG9uZW50RXJyb3JNZXNzYWdlLCBnZXRNb2R1bGVEaXNwbGF5TmFtZUJ5UnVsZUNvbXBvbmVudCwgbG9nZ2VyLCBub3RpZnlNb25pdG9ycyk7CiAgICAgICAgICAgICAgICB2YXIgbG9nUnVsZUNvbXBsZXRlZCA9IGNyZWF0ZUxvZ1J1bGVDb21wbGV0ZWQobG9nZ2VyLCBub3RpZnlNb25pdG9ycyk7CiAgICAgICAgICAgICAgICB2YXIgZXZhbHVhdGVDb25kaXRpb25zID0gY3JlYXRlRXZhbHVhdGVDb25kaXRpb25zKGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZSwgaXNDb25kaXRpb25NZXQsIGxvZ0NvbmRpdGlvbk5vdE1ldCwgbG9nQ29uZGl0aW9uRXJyb3IpOwogICAgICAgICAgICAgICAgdmFyIHJ1bkFjdGlvbnMgPSBjcmVhdGVSdW5BY3Rpb25zKGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZSwgbG9nQWN0aW9uRXJyb3IsIGxvZ1J1bGVDb21wbGV0ZWQpOwogICAgICAgICAgICAgICAgdmFyIGV4ZWN1dGVSdWxlID0gY3JlYXRlRXhlY3V0ZVJ1bGUoZXZhbHVhdGVDb25kaXRpb25zLCBydW5BY3Rpb25zKTsKICAgICAgICAgICAgICAgIHZhciBhZGRDb25kaXRpb25Ub1F1ZXVlID0gY3JlYXRlQWRkQ29uZGl0aW9uVG9RdWV1ZShleGVjdXRlRGVsZWdhdGVNb2R1bGUsIG5vcm1hbGl6ZVJ1bGVDb21wb25lbnRFcnJvciwgaXNDb25kaXRpb25NZXQsIGxvZ0NvbmRpdGlvbkVycm9yLCBsb2dDb25kaXRpb25Ob3RNZXQpOwogICAgICAgICAgICAgICAgdmFyIGFkZEFjdGlvblRvUXVldWUgPSBjcmVhdGVBZGRBY3Rpb25Ub1F1ZXVlKGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZSwgbm9ybWFsaXplUnVsZUNvbXBvbmVudEVycm9yLCBsb2dBY3Rpb25FcnJvcik7CiAgICAgICAgICAgICAgICB2YXIgYWRkUnVsZVRvUXVldWUgPSBjcmVhdGVBZGRSdWxlVG9RdWV1ZShhZGRDb25kaXRpb25Ub1F1ZXVlLCBhZGRBY3Rpb25Ub1F1ZXVlLCBsb2dSdWxlQ29tcGxldGVkKTsKICAgICAgICAgICAgICAgIHZhciB0cmlnZ2VyUnVsZSA9IGNyZWF0ZVRyaWdnZXJSdWxlKHJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCwgZXhlY3V0ZVJ1bGUsIGFkZFJ1bGVUb1F1ZXVlLCBub3RpZnlNb25pdG9ycyk7CiAgICAgICAgICAgICAgICB2YXIgZ2V0U3ludGhldGljRXZlbnRNZXRhID0gY3JlYXRlR2V0U3ludGhldGljRXZlbnRNZXRhKG1vZHVsZVByb3ZpZGVyKTsKICAgICAgICAgICAgICAgIHZhciBpbml0RXZlbnRNb2R1bGUgPSBjcmVhdGVJbml0RXZlbnRNb2R1bGUodHJpZ2dlclJ1bGUsIGV4ZWN1dGVEZWxlZ2F0ZU1vZHVsZSwgbm9ybWFsaXplU3ludGhldGljRXZlbnQsIGdldFJ1bGVDb21wb25lbnRFcnJvck1lc3NhZ2UsIGdldFN5bnRoZXRpY0V2ZW50TWV0YSwgbG9nZ2VyKTsKICAgICAgICAgICAgICAgIGluaXRSdWxlcyhidWlsZFJ1bGVFeGVjdXRpb25PcmRlciwgY29udGFpbmVyLnJ1bGVzIHx8IFtdLCBpbml0RXZlbnRNb2R1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzcmMkMSA9IF9zYXRlbGxpdGU7CiAgICAgICAgICAgIHJldHVybiBzcmMkMTsKICAgICAgICB9KCk7CiAgICAgICAgX3NhdGVsbGl0ZSA9ICRfX192YXJfMTZiNTNkNWFkZDBiYjQ4ODsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min","aliases":["sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min"],"kind":{"mime":"application/javascript"},"content":"dmFyIF9zYXRlbGxpdGU7CnsKICAgIGNvbnN0ICRfX19tb2NrX2RlNjA2NWU1NGQ4YjAxODYgPSB7fTsKICAgIChleHBvcnRzID0+IHsKICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgY29uc3QgeGhyVW5zZW50ID0gMDsKICAgICAgICBjb25zdCB4aHJPcGVuZWQgPSAxOwogICAgICAgIGNvbnN0IHhockhlYWRlcnNSZWNlaXZlZCA9IDI7CiAgICAgICAgY29uc3QgeGhyTG9hZGluZyA9IDM7CiAgICAgICAgY29uc3QgeGhyRG9uZSA9IDQ7CiAgICAgICAgY29uc3QgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wgPSBTeW1ib2woJ2RlZmVycmVkSGFuZGxlJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3RhcnRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZHN0YXJ0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Qcm9ncmVzc1N5bWJvbCA9IFN5bWJvbCgnb25wcm9ncmVzcycpOwogICAgICAgIGNvbnN0IHhock9uQWJvcnRTeW1ib2wgPSBTeW1ib2woJ29uYWJvcnQnKTsKICAgICAgICBjb25zdCB4aHJPbkVycm9yU3ltYm9sID0gU3ltYm9sKCdvbmVycm9yJyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkU3ltYm9sID0gU3ltYm9sKCdvbmxvYWQnKTsKICAgICAgICBjb25zdCB4aHJPblRpbWVvdXRTeW1ib2wgPSBTeW1ib2woJ29udGltZW91dCcpOwogICAgICAgIGNvbnN0IHhock9uTG9hZEVuZFN5bWJvbCA9IFN5bWJvbCgnb25sb2FkZW5kJyk7CiAgICAgICAgY29uc3QgeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sID0gU3ltYm9sKCdvbnJlYWR5c3RhdGVjaGFuZ2UnKTsKICAgICAgICBjb25zdCB4aHJSZWFkeVN0YXRlU3ltYm9sID0gU3ltYm9sKCdyZWFkeVN0YXRlJyk7CiAgICAgICAgY29uc3QgeGhyVGltZW91dFN5bWJvbCA9IFN5bWJvbCgndGltZW91dCcpOwogICAgICAgIGNvbnN0IHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCA9IFN5bWJvbCgnd2l0aENyZWRlbnRpYWxzJyk7CiAgICAgICAgY29uc3QgeGhyVXBsb2FkU3ltYm9sID0gU3ltYm9sKCd1cGxvYWQnKTsKICAgICAgICBjb25zdCB4aHJSZXNwb25zZVR5cGVTeW1ib2wgPSBTeW1ib2woJ3Jlc3BvbnNlVHlwZScpOwogICAgICAgIGNvbnN0IGRlZmluZUV2ZW50ID0gKG9iaiwgc3ltYm9sKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzeW1ib2wuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDIpOwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBzeW1ib2wsIHsKICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXNbc3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBjb25zdCBjaGFuZ2VSZWFkeVN0YXRlID0gKHhociwgcmVhZHlTdGF0ZSkgPT4gewogICAgICAgICAgICB4aHJbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPSByZWFkeVN0YXRlOwogICAgICAgICAgICB4aHIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3JlYWR5c3RhdGVjaGFuZ2UnKSk7CiAgICAgICAgfTsKICAgICAgICBsZXQgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgIGNsYXNzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgZXh0ZW5kcyBFdmVudFRhcmdldCB7CiAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCkgJiYgISh0aGlzIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3RVcGxvYWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSWxsZWdhbCBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3RhcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Qcm9ncmVzc1N5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkFib3J0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uRXJyb3JTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25Mb2FkU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uVGltZW91dFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRFbmRTeW1ib2wpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmxvYWRzdGFydCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZFN0YXJ0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2Fkc3RhcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucHJvZ3Jlc3MoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25wcm9ncmVzcyh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblByb2dyZXNzU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmFib3J0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25BYm9ydFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uYWJvcnQodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25BYm9ydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25lcnJvcigpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uRXJyb3JTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmVycm9yKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uRXJyb3JTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9udGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uVGltZW91dFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9udGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZGVuZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ubG9hZGVuZCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRFbmRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RVcGxvYWQgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3RVcGxvYWQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0VXBsb2FkLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGNvbnN0IHhoclVwbG9hZCA9IG5ldyBYTUxIdHRwUmVxdWVzdFVwbG9hZCgpOwogICAgICAgICAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhockRlZmVycmVkSGFuZGxlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wpOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclJlYWR5U3RhdGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhoclRpbWVvdXRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVXBsb2FkU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeGhyVXBsb2FkLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVzcG9uc2VUeXBlU3ltYm9sLCB7CiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbnJlYWR5c3RhdGVjaGFuZ2UoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnJlYWR5c3RhdGVjaGFuZ2UodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25SZWFkeVN0YXRlQ2hhbmdlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZWFkeVN0YXRlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3BlbihtZXRob2QsIHVybCkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhock9wZW5lZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0VHJ1c3RUb2tlbih0cnVzdFRva2VuKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJUaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgdGltZW91dCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJUaW1lb3V0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB3aXRoQ3JlZGVudGlhbHMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJXaXRoQ3JlZGVudGlhbHNTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB3aXRoQ3JlZGVudGlhbHModmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJVbnNlbnQ6CiAgICAgICAgICAgICAgICBjYXNlIHhock9wZW5lZDogewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwnd2l0aENyZWRlbnRpYWxzXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgbWF5IG9ubHkgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgVU5TRU5UIG9yIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF0gPSAhIXZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCB1cGxvYWQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJVcGxvYWRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbmQoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSA9PT0geGhyT3BlbmVkICYmIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhockRvbmUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Vycm9yJykpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlIFwnc2VuZFwnIG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIG9iamVjdFwncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhYm9ydCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0pOwogICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VSZWFkeVN0YXRlKHRoaXMsIHhoclVuc2VudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBQcm9ncmVzc0V2ZW50KCdhYm9ydCcpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2xvYWRlbmQnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVVJMKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgc3RhdHVzVGV4dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRSZXNwb25zZUhlYWRlcihuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVycmlkZU1pbWVUeXBlKG1pbWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUeXBlKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgcmVzcG9uc2VUeXBlKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyRG9uZTogewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gc2V0IHRoZSBcJ3Jlc3BvbnNlVHlwZVwnIHByb3BlcnR5IG9uIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHJlc3BvbnNlIHR5cGUgY2Fubm90IGJlIHNldCBpZiB0aGUgb2JqZWN0XCdzIHN0YXRlIGlzIExPQURJTkcgb3IgRE9ORS4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYXNlICcnOgogICAgICAgICAgICAgICAgY2FzZSAnYXJyYXlidWZmZXInOgogICAgICAgICAgICAgICAgY2FzZSAnYmxvYic6CiAgICAgICAgICAgICAgICBjYXNlICdkb2N1bWVudCc6CiAgICAgICAgICAgICAgICBjYXNlICdqc29uJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3RleHQnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlKCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcgPyAnJyA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlVGV4dCgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHRoaXNbeGhyUmVzcG9uc2VUeXBlU3ltYm9sXTsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT09ICcnIHx8IHJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhZCB0aGUgXCdyZXNwb25zZVRleHRcJyBwcm9wZXJ0eSBmcm9tIFwnWE1MSHR0cFJlcXVlc3RcJzogVGhlIHZhbHVlIGlzIG9ubHkgYWNjZXNzaWJsZSBpZiB0aGUgb2JqZWN0XCdzIFwncmVzcG9uc2VUeXBlXCcgaXMgXCdcJyBvciBcJ3RleHRcJyAod2FzIFwnYXJyYXlidWZmZXJcJykuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlc3BvbnNlWE1MKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnVU5TRU5UJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyVW5zZW50CiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnT1BFTkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyT3BlbmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnSEVBREVSU19SRUNFSVZFRCcsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockhlYWRlcnNSZWNlaXZlZAogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdCwgJ0xPQURJTkcnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJMb2FkaW5nCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnRE9ORScsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockRvbmUKICAgICAgICB9KTsKICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0ID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBYTUxIdHRwUmVxdWVzdCwKICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9OwogICAgfSkoJF9fX21vY2tfZGU2MDY1ZTU0ZDhiMDE4Nik7CiAgICBjb25zdCAkX19fbW9ja181YmM4NGJhM2ViZjQyYmU4ID0ge307CiAgICAoZXhwb3J0cyA9PiB7CiAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgIGxldCBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgIGNsYXNzIFN0b3JhZ2UgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgbGVuZ3RoKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBrZXkoaW5kZXgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0ga2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBrZXlzW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXRJdGVtKGtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCBrZXkpID8gdGhpc1trZXldIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRJdGVtKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNba2V5XSA9IFN0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3ZlSXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNba2V5XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlN0b3JhZ2UgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFN0b3JhZ2UsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBuZXcgU3RvcmFnZSgpOwogICAgICAgIGV4cG9ydHMubG9jYWxTdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLnNlc3Npb25TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgaXNTZWFsZWQgPSB0cnVlOwogICAgfSkoJF9fX21vY2tfNWJjODRiYTNlYmY0MmJlOCk7CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIHdpbmRvdy5fc2F0ZWxsaXRlID0gd2luZG93Ll9zYXRlbGxpdGUgfHwge30sIHdpbmRvdy5fc2F0ZWxsaXRlLmNvbnRhaW5lciA9IHsKICAgICAgICAgICAgYnVpbGRJbmZvOiB7CiAgICAgICAgICAgICAgICBtaW5pZmllZDogITAsCiAgICAgICAgICAgICAgICBidWlsZERhdGU6ICcyMDIxLTA2LTI4VDEzOjM2OjA2WicsCiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogJ3Byb2R1Y3Rpb24nLAogICAgICAgICAgICAgICAgdHVyYmluZUJ1aWxkRGF0ZTogJzIwMjEtMDQtMjZUMTY6NTQ6MjhaJywKICAgICAgICAgICAgICAgIHR1cmJpbmVWZXJzaW9uOiAnMjcuMS4zJwogICAgICAgICAgICB9LAogICAgICAgICAgICBkYXRhRWxlbWVudHM6IHsKICAgICAgICAgICAgICAgICdldmVudDpqb2JDYXRlZ29yeSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmV2ZW50RGF0YS5qb2JDYXRlZ29yeScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OkxpbmtOYW1lJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlnaXRhbERhdGEuZXZlbnREYXRhLmxpbmtUeXBlICsgJ3wnICsgZGlnaXRhbERhdGEuZXZlbnREYXRhLmxpbmtOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIENNUElEOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBmb3JjZUxvd2VyQ2FzZTogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDTVBJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ0pvYlNlYXJjaDpTb3J0QnknOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuc29ydEJ5JyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ09wdCBPdXQ6IFNvdXJjZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3Nlc3Npb24nLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc28nLAogICAgICAgICAgICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmU6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdPcHQgT3V0OiBCZWFtZXJ5IENhbXBhaWduIElEJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAnc2Vzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvcXVlcnlTdHJpbmdQYXJhbWV0ZXIuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjYScsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6U2l0ZUVycm9yJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLnNpdGVFcnJvcicgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdGb3JtOiBGb3JtRXJyb3JzJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLmZvcm1FcnJvcnMnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnRm9ybTpGb3JtRXJyb3JzJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLmZvcm1FcnJvcnMnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY29udGVudDpQYWdlVHlwZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8ucGFnZVR5cGUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUGFnZSBVUkwnOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnd2luZG93LmxvY2F0aW9uLmhyZWYnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY29udGVudDpDb3VudHJ5TGFuZ3VhZ2UnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLmNvdW50cnlMYW5ndWFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnSm9iU2VhcmNoOlNlYXJjaFBvc2l0aW9uJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLnNlYXJjaFBvc2l0aW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2V2ZW50OmpvYkRpdmlzaW9uJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLmpvYkRpdmlzaW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6UGFnZU5hbWUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLnBhZ2VOYW1lJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ01hcmtldGluZzogU29jaWFsUGxhdGZvcm0nOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuc29jaWFsUGxhdGZvcm0nIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnT3B0IE91dDogQmVhbWVyeSBDb252ZXJzYXRpb24gSUQnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdzZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NuJywKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiAhMAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnam9iRGVzY3JpcHRpb246am9iTmFtZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdObyBKb2IgTmFtZSBGb3VuZCcsCiAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXh0OiAhMCwKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlnaXRhbERhdGEgJiYgZGlnaXRhbERhdGEuam9iICYmIGRpZ2l0YWxEYXRhLmpvYi50aXRsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlnaXRhbERhdGEuam9iLnRpdGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OiBTdWJTZWN0aW9uTGV2ZWwxJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby5wYWdlTGV2ZWwxJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2NvbnRlbnQ6U2l0ZVNlY3Rpb24nOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLnNpdGVTZWN0aW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3VjY2Vzc0NvbmZpcm1hdGlvbjogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3N1bW1hcnk/cmVzdWx0PXN1Y2Nlc3MnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ0pvYlNlYXJjaDogU2VhcmNoU2VsZWN0aW9uJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLnNlYXJjaFNlbGVjdGlvbicgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdPcHQgT3V0OiBTeXN0ZW0nOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdzZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3N5JywKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiAhMAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnY29udGVudDogU3ViU2VjdGlvbkxldmVsMic6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8ucGFnZUxldmVsMicgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnBlcnNvbklEJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby5wZXJzb25JZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdldmVudDpqb2JJRCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuam9iSUQnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnam9iRGVzY3JpcHRpb246am9iQ2F0ZWdvcnknOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5qb2IuY2F0ZWdvcnknIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnSm9iIFJvbGUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnTm8gSm9iIFJvbGUgRm91bmQnLAogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmpvYi5qb2Jfcm9sZScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdGb3JtOiBGb3JtTmFtZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmV2ZW50RGF0YS5mb3JtTmFtZScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqb2JEZXNjcmlwdGlvbjpoaXJpbmdZZWFyJzogewogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLmhpcmluZ195ZWFyJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ0pvYlNlYXJjaDpTZWFyY2hUZXJtJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5zZWFyY2gua2V5d29yZFF1ZXJ5JyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOmpvYkZpbmRpbmdNZXRob2QnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5qb2Iuam9iRmluZGluZ01ldGhvZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnVzZXJUeXBlJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby51c2VyVHlwZScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdldmVudDpqb2JOYW1lJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLmpvYk5hbWUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnam9iQXBwbGljYXRpb246YXBwbGljYXRpb25JZCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmV2ZW50RGF0YS5hcHBsaWNhdGlvbl9pZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnVzZXJJRCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8udXNlcklEJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOmpvYkNvdW50cnknOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnTm8gSm9iIENvdW50cnkgRm91bmQnLAogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLmNvdW50cnknIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDQ1VJRDogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY2N1aWQnLAogICAgICAgICAgICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmU6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OiBTdWJTZWN0aW9uTGV2ZWwzJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby5wYWdlTGV2ZWwzJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOmpvYkRpdmlzaW9uJzogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLmRpdmlzaW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOiByZWxhdGVkSm9iSW1wcmVzc2lvbnMnOiB7CiAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXh0OiAhMCwKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5qb2IucmVsYXRlZEpvYkltcHJlc3Npb25zJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ0pvYlNlYXJjaDpGaWx0ZXJCeSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpZ2l0YWxEYXRhLmV2ZW50RGF0YS5maWx0ZXJUeXBlICsgJ3wnICsgZGlnaXRhbERhdGEuZXZlbnREYXRhLmZpbHRlck5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOnN1YkNhdGVnb3J5JzogewogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLnN1YkNhdGVnb3J5JyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkFwcGxpY2F0aW9uOnJlc3VtZVR5cGUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEucmVzdW1lU291cmNlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcmVsYXRlZEpvYklkOiB7CiAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXh0OiAhMCwKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5qb2IucmVsYXRlZEpvYklkJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ0Zvcm0gOiBmb3JtSW5kZXgnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBjbGVhblRleHQ6ICEwLAogICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VEdXJhdGlvbjogJ3BhZ2V2aWV3JywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuZm9ybV9pbmRleCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqb2JEZXNjcmlwdGlvbjpqb2JUeXBlJzogewogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLnR5cGUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnRm9ybSA6IGZvcm1UaXRsZSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmV2ZW50RGF0YS5mb3JtX3RpdGxlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pvYkRlc2NyaXB0aW9uOmpvYkxvY2F0aW9uJzogewogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuam9iLmxvY2F0aW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1NtcyBWaXNpYmxlJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8uc21zVmlzaWJsZScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqb2JEZXNjcmlwdGlvbjpqb2JJRCc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICdObyBKb2IgSUQgRm91bmQnLAogICAgICAgICAgICAgICAgICAgIGNsZWFuVGV4dDogITAsCiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUR1cmF0aW9uOiAncGFnZXZpZXcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZ2l0YWxEYXRhICYmIGRpZ2l0YWxEYXRhLmpvYiAmJiBkaWdpdGFsRGF0YS5qb2IuaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpZ2l0YWxEYXRhLmpvYi5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnU01TOlNpdGVFcnJvciAnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuZXJyb3JNZXNzYWdlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1NNUyAtIE9wdGlvbiBTZWxlY3RlZCc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEub3B0aW9uJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2V2ZW50OmpvYkNvdW50cnknOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuam9iQ291bnRyeScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdKb2JTZWFyY2g6Tm9PZlJlc3VsdHMnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnNlYXJjaC5ub09mUmVzdWx0cycgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdVc2VyIFN0YXR1cyc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEudXNlclN0YXR1cycgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNhbXBhaWduOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBmb3JjZUxvd2VyQ2FzZTogITAsCiAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXh0OiAhMCwKICAgICAgICAgICAgICAgICAgICBzdG9yYWdlRHVyYXRpb246ICdzZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3V0bV9jYW1wYWlnbicsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1Bob25lTnVtYmVyIE1hdGNoJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8ucGhvbmVOdW1iZXJNYXRjaCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdTTVMgLSBFdmVudCAtIHNtc09wdGVkSW4nOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnREYXRhLnNtc09wdGVkSW4nIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUGhvbmUgTnVtYmVyIEFkZGVkJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8ucGhvbmVOdW1iZXJBZGRlZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqb2JEZXNjcmlwdGlvbjpqb2JCdXNpbmVzc1B1cnBvc2UnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5qb2IuYnVzaW5lc3NQdXJwb3NlJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcGFzc3BvcnRFdmVudFBhcmFtczogewogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEuZXZlbnRQYXJhbXMnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnUGhvbmUgTnVtYmVyIFZlcmlmaWVkJzogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLnBhZ2UucGFnZUluZm8ucGhvbmVOdW1iZXJWZXJpZmllZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdQaG9uZU51bWJlciBDb3VudHJ5Q29kZSc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLnBob25lTnVtYmVyQ291bnRyeUNvZGUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnam9iRGVzY3JpcHRpb246am9iU2hhcmVTb2NpYWxNZWRpYSc6IHsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL2phdmFzY3JpcHRWYXJpYWJsZS5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgcGF0aDogJ2RpZ2l0YWxEYXRhLmV2ZW50RGF0YS5zb2NpYWxNZWRpYScgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdTTVM6U3RlcG5hbWUnOiB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5ldmVudERhdGEuc3RlcE5hbWUnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnU01TIE9wdGVkSW4nOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby5zbXNPcHRlZEluJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ1NNUyBhc3Nlc3NtZW50UmVxdWlyZWQnOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby5hc3Nlc3NtZW50UmVxdWlyZWQnIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBpbnRjbXBpZDogewogICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaW50Y21waWQnLAogICAgICAgICAgICAgICAgICAgICAgICBjYXNlSW5zZW5zaXRpdmU6ICEwCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnBlb3BsZVNvZnRJZCc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLnBlb3BsZVNvZnRJZCcgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb250ZW50OnVzZXJBY3Rpb25TdG9yZSc6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnLAogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHBhdGg6ICdkaWdpdGFsRGF0YS5wYWdlLnBhZ2VJbmZvLnVzZXJBY3Rpb25TdG9yZUlkJyB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgRENMSUQ6IHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9xdWVyeVN0cmluZ1BhcmFtZXRlci5qcycsCiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RjbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZUluc2Vuc2l0aXZlOiAhMAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnVXNlciBBdXRoIE1vZGUnOiB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvamF2YXNjcmlwdFZhcmlhYmxlLmpzJywKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBwYXRoOiAnZGlnaXRhbERhdGEucGFnZS5wYWdlSW5mby51c2VyQXV0aE1vZGUnIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXh0ZW5zaW9uczogewogICAgICAgICAgICAgICAgY29yZTogewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ29yZScsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlczogewogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2RhdGFFbGVtZW50cy9qYXZhc2NyaXB0VmFyaWFibGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnamF2YXNjcmlwdC12YXJpYWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0phdmFTY3JpcHQgVmFyaWFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJy4uL2hlbHBlcnMvZ2V0T2JqZWN0UHJvcGVydHkuanMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSh3aW5kb3csIGUucGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9kYXRhRWxlbWVudHMvY3VzdG9tQ29kZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjdXN0b20tY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0N1c3RvbSBDb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc291cmNlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZGF0YUVsZW1lbnRzL3F1ZXJ5U3RyaW5nUGFyYW1ldGVyLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3F1ZXJ5LXN0cmluZy1wYXJhbWV0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdRdWVyeSBTdHJpbmcgUGFyYW1ldGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgbyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXF1ZXJ5LXN0cmluZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gby5wYXJzZShzLmxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5jYXNlSW5zZW5zaXRpdmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlLm5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gZS5uYW1lLnRvTG93ZXJDYXNlKCksIGEgPSBPYmplY3Qua2V5cyh0KSwgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci50b0xvd2VyQ2FzZSgpID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkaXJlY3QtY2FsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0RpcmVjdCBDYWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX3NhdGVsbGl0ZSA9IHdpbmRvdy5fc2F0ZWxsaXRlIHx8IHt9LCB3aW5kb3cuX3NhdGVsbGl0ZS50cmFjayA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFsnUnVsZXMgdXNpbmcgdGhlIGRpcmVjdCBjYWxsIGV2ZW50IHR5cGUgd2l0aCBpZGVudGlmaWVyICInICsgZSArICciIGhhdmUgYmVlbiB0cmlnZ2VyZWQnICsgKHQgPyAnIHdpdGggYWRkaXRpb25hbCBkZXRhaWw6JyA6ICcuJyldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiBpLnB1c2godCksIHIubG9nZ2VyLmxvZy5hcHBseShyLmxvZ2dlciwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sb2dnZXIubG9nKCciJyArIGUgKyAnIiBkb2VzIG5vdCBtYXRjaCBhbnkgZGlyZWN0IGNhbGwgaWRlbnRpZmllcnMuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBzW2UuaWRlbnRpZmllcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgKG4gPSBzW2UuaWRlbnRpZmllcl0gPSBbXSksIG4ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFsdWVDb21wYXJpc29uLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3ZhbHVlLWNvbXBhcmlzb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdWYWx1ZSBDb21wYXJpc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09IHR5cGVvZiBlICYmIGlzRmluaXRlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSB8fCBlIGluc3RhbmNlb2YgU3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIGkoZSkgPyBlLnRvTG93ZXJDYXNlKCkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGUpID8gU3RyaW5nKGUpIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKSA/IE51bWJlcihlKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBzKGUpLCB0ID0gcyh0KSwgaShlKSAmJiBpKHQpICYmIGEoZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gbyhlKSwgdCA9IG8odCksIGEoZSkgJiYgYSh0KSAmJiBuKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShyKGUsIG4pLCByKHQsIG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbHM6IGMoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzTm90RXF1YWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWwuZXF1YWxzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnM6IHQoYyhmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gZS5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc05vdENvbnRhaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWwuY29udGFpbnMuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHNXaXRoOiB0KGMoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gZS5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc05vdFN0YXJ0V2l0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbC5zdGFydHNXaXRoLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kc1dpdGg6IHQoYyhmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN1YnN0cmluZyhlLmxlbmd0aCAtIHQubGVuZ3RoLCBlLmxlbmd0aCkgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzTm90RW5kV2l0aDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhbC5lbmRzV2l0aC5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNSZWdleDogdChmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHQsIG4gPyAnaScgOiAnJykudGVzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lc05vdE1hdGNoUmVnZXg6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWwubWF0Y2hlc1JlZ2V4LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzc1RoYW46IG4oZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA8IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlc3NUaGFuT3JFcXVhbDogbihmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIDw9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXJUaGFuOiBuKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyVGhhbk9yRXF1YWw6IG4oZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA8PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RydWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJ1dGh5OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFsc2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFsc3k6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsW2UuY29tcGFyaXNvbi5vcGVyYXRvcl0oZS5sZWZ0T3BlcmFuZCwgZS5yaWdodE9wZXJhbmQsIEJvb2xlYW4oZS5jb21wYXJpc29uLmNhc2VJbnNlbnNpdGl2ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFnZS1ib3R0b20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdQYWdlIEJvdHRvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignLi9oZWxwZXJzL3BhZ2VMaWZlY3ljbGVFdmVudHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnJlZ2lzdGVyUGFnZUJvdHRvbVRyaWdnZXIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1BhdGggV2l0aG91dCBRdWVyeSBTdHJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGkgPSBuKCcuLi9oZWxwZXJzL3RleHRNYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYS5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGF0aHMuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKSA6IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShuLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY3VzdG9tLWNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDdXN0b20gQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNvdXJjZS5jYWxsKHQuZWxlbWVudCwgdCwgdC50YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2N1c3RvbS1jb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnQ3VzdG9tIENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgYSwgaSwgbywgYyA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIGwgPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIHUgPSBuKCcuL2hlbHBlcnMvZGVjb3JhdGVDb2RlJyksIGQgPSBuKCcuL2hlbHBlcnMvbG9hZENvZGVTZXF1ZW50aWFsbHknKSwgcCA9IG4oJy4uLy4uLy4uL25vZGVfbW9kdWxlcy9wb3N0c2NyaWJlL2Rpc3QvcG9zdHNjcmliZScpLCBmID0gbignLi9oZWxwZXJzL3VuZXNjYXBlSHRtbENvZGUnKSwgbSA9IChhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoYy5ib2R5LCBlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlV3JpdGVUb2tlbjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LnRhZ05hbWUgJiYgdC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzICYmICdzY3JpcHQnID09PSBlICYmICh0LmF0dHJzLm5vbmNlID0gcyksICdzY3JpcHQnICE9PSBlICYmICdzdHlsZScgIT09IGUgfHwgKE9iamVjdC5rZXlzKHQuYXR0cnMgfHwge30pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYXR0cnNbZV0gPSBmKHQuYXR0cnNbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5zcmMgJiYgKHQuc3JjID0gZih0LnNyYykpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvZ2dlci5lcnJvcihlLm1zZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBbXSwgbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmJvZHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShpLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQobywgMjApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKGUpLCBvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuY3VycmVudFNjcmlwdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5jdXJyZW50U2NyaXB0LmFzeW5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGMucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JyksIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyhsYXVuY2h8c2F0ZWxsaXRlTGliKS1bXlwvXSsuanMoXD8uKik/JC8udGVzdChuLnNyYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFzeW5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSByLmdldEV4dGVuc2lvblNldHRpbmdzKCkuY3NwTm9uY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gYS5zZXR0aW5ncy5zb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuc2V0dGluZ3MuaXNFeHRlcm5hbCA/IGQoaSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gKG4gPSB1KGEsIGUpLCBtKG4uY29kZSksIG4ucHJvbWlzZSkgOiBsLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKG4gPSB1KGEsIGkpLCBnIHx8ICdsb2FkaW5nJyAhPT0gYy5yZWFkeVN0YXRlID8gbShuLmNvZGUpIDogYy53cml0ZSAmJiAhMSA9PT0gci5wcm9wZXJ0eVNldHRpbmdzLnJ1bGVDb21wb25lbnRTZXF1ZW5jaW5nRW5hYmxlZCA/IGMud3JpdGUobi5jb2RlKSA6IG0obi5jb2RlKSwgbi5wcm9taXNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvc3ViZG9tYWluLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3N1YmRvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ1N1YmRvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKSwgaSA9IG4oJy4uL2hlbHBlcnMvdGV4dE1hdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhLmxvY2F0aW9uLmhvc3RuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJkb21haW5zLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS52YWx1ZUlzUmVnZXggPyBuZXcgUmVnRXhwKGUudmFsdWUsICdpJykgOiBlLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbGlicmFyeS1sb2FkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdMaWJyYXJ5IExvYWRlZCAoUGFnZSBUb3ApJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKCcuL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucmVnaXN0ZXJMaWJyYXJ5TG9hZGVkVHJpZ2dlcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjbGljaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0NsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgcyA9IG4oJy4vaGVscGVycy9jcmVhdGVCdWJibHknKSgpLCBvID0gbmV3IChuKCcuL2hlbHBlcnMvd2Vha01hcCcpKSgpLCBjID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBlOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS50YWdOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmICdhJyA9PT0gdC50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSwgYSA9IGUuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgKCFhIHx8ICdfc2VsZicgPT09IGEgfHwgJ190b3AnID09PSBhICYmIHIudG9wID09PSByIHx8IGEgPT09IHIubmFtZSkgPyBlIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcy5ldmFsdWF0ZUV2ZW50LCAhMCksIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuYWRkTGlzdGVuZXIoYSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5uYXRpdmVFdmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5zX2ZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYW5jaG9yRGVsYXkgJiYgIW8uaGFzKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYyh0LnRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKHQucHJldmVudERlZmF1bHQoKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvY2F0aW9uID0gbi5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLmFuY2hvckRlbGF5KSksIG8uc2V0KHQsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzLl9fcmVzZXQgPSBzLl9fcmVzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvaGVscGVycy9nZXRPYmplY3RQcm9wZXJ0eS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQuc3BsaXQoJy4nKSwgYSA9IGUsIGkgPSAwLCByID0gbi5sZW5ndGg7IGkgPCByOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhW25baV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvZXZlbnRzL2hlbHBlcnMvcGFnZUxpZmVjeWNsZUV2ZW50cy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgaSA9IG4oJ0BhZG9iZS9yZWFjdG9yLWRvY3VtZW50JyksIHIgPSAtMSAhPT0gYS5uYXZpZ2F0b3IuYXBwVmVyc2lvbi5pbmRleE9mKCdNU0lFIDEwJyksIHMgPSAnV0lORE9XX0xPQURFRCcsIG8gPSAnRE9NX1JFQURZJywgYyA9ICdQQUdFX0JPVFRPTScsIGwgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgdSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnNsaWNlKDAsIG0oZSkgKyAxKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjb21wbGV0ZScgPT09IGkucmVhZHlTdGF0ZSA/IHMgOiAnaW50ZXJhY3RpdmUnID09PSBpLnJlYWR5U3RhdGUgPyByID8gbnVsbCA6IG8gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkW2VdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGRbZV0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQudHJpZ2dlciwgYSA9IHQuc3ludGhldGljRXZlbnRGbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oYSA/IGEoZSkgOiBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLl9zYXRlbGxpdGUgPSBhLl9zYXRlbGxpdGUgfHwge30sIGEuX3NhdGVsbGl0ZS5wYWdlQm90dG9tID0gcC5iaW5kKG51bGwsIGMpLCBpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBwLmJpbmQobnVsbCwgbyksICEwKSwgYS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgcC5iaW5kKG51bGwsIHMpLCAhMCksIGEuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIHAoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCksIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJMaWJyYXJ5TG9hZGVkVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQYWdlQm90dG9tVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbY10ucHVzaCh7IHRyaWdnZXI6IGUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRG9tUmVhZHlUcmlnZ2VyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtvXS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXRpY0V2ZW50Rm46IHUuYmluZChudWxsLCBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyV2luZG93TG9hZGVkVHJpZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbc10ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGV0aWNFdmVudEZuOiB1LmJpbmQobnVsbCwgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9oZWxwZXJzL3RleHRNYXRjaC5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBBcmd1bWVudDogUGF0dGVybiBpcyBub3QgcHJlc2VudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPSBlICYmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCA/IGUgPT09IHQgOiB0IGluc3RhbmNlb2YgUmVnRXhwICYmIHQudGVzdChlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdGVDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJy4vZGVjb3JhdG9ycy9kZWNvcmF0ZUdsb2JhbEphdmFTY3JpcHRDb2RlJyksIGkgPSBuKCcuL2RlY29yYXRvcnMvZGVjb3JhdGVOb25HbG9iYWxKYXZhU2NyaXB0Q29kZScpLCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXNjcmlwdDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZXR0aW5ncy5nbG9iYWwgPyBhKGUsIHQpIDogaShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodG1sOiBuKCcuL2RlY29yYXRvcnMvZGVjb3JhdGVIdG1sQ29kZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbZS5zZXR0aW5ncy5sYW5ndWFnZV0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvbG9hZENvZGVTZXF1ZW50aWFsbHkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignQGFkb2JlL3JlYWN0b3ItcHJvbWlzZScpLCBpID0gbignLi9nZXRTb3VyY2VCeVVybCcpLCByID0gYS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgYShmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbGwoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvbm9kZV9tb2R1bGVzL3Bvc3RzY3JpYmUvZGlzdC9wb3N0c2NyaWJlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAobiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiBpKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT0gdHlwZW9mIGEgJiYgJ29iamVjdCcgPT0gdHlwZW9mIG4gPyBuLmV4cG9ydHMgPSB0KCkgOiAnZnVuY3Rpb24nID09IHR5cGVvZiBkZWZpbmUgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbXSwgdCkgOiAnb2JqZWN0JyA9PSB0eXBlb2YgYSA/IGEucG9zdHNjcmliZSA9IHQoKSA6IGUucG9zdHNjcmliZSA9IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVtlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbZV0uZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGlbZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bZV0uY2FsbCh0LmV4cG9ydHMsIHQsIHQuZXhwb3J0cywgYSksIHQubG9hZGVkID0gITAsIHQuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5tID0gbiwgYS5jID0gaSwgYS5wID0gJycsIGEoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7ICdkZWZhdWx0JzogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGEobigxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gaVsnZGVmYXVsdCddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbJ2RlZmF1bHQnXSA9IGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMubGFzdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWZ0ZXJEZXF1ZXVlKCksIGUuc3RyZWFtID0gci5hcHBseSh1bmRlZmluZWQsIGUpLCB0LmFmdGVyU3RyZWFtU3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gYS5iZWZvcmVXcml0ZShlKSwgZy53cml0ZShlKSwgYS5hZnRlcldyaXRlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnID0gbmV3IGZbJ2RlZmF1bHQnXShlLCBhKSkuaWQgPSBtKyssIGcubmFtZSA9IGEubmFtZSB8fCBnLmlkLCBkLnN0cmVhbXNbZy5uYW1lXSA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5vd25lckRvY3VtZW50LCByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlOiBuLmNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46IG4ub3BlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZTogbi53cml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWxuOiBuLndyaXRlbG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAobiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2U6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBBcnJheShlKSwgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodC5qb2luKCcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVsbjogZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCwgdCA9IEFycmF5KGUpLCBuID0gMDsgbiA8IGU7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0LmpvaW4oJycpICsgJ1xuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGcud2luLm9uZXJyb3IgfHwgbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcud2luLm9uZXJyb3IgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5lcnJvcih7IG1zZzogZSArICcgLSAnICsgdCArICc6ICcgKyBuIH0pLCBzLmFwcGx5KGcud2luLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBnLndyaXRlKHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAobiwgciksIGcud2luLm9uZXJyb3IgPSBzLCBhLmRvbmUoKSwgZyA9IG51bGwsIHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy5pc0Z1bmN0aW9uKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHsgZG9uZTogbiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnY2xlYXInID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgPSBbXSwgZyA9IG51bGwsIHZvaWQgKG0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHMuZGVmYXVsdHMobiwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IC9eIy8udGVzdChlKSA/IHdpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLnN1YnN0cigxKSkgOiBlLmpxdWVyeSA/IGVbMF0gOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucG9zdHNjcmliZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbDogZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnN0cmVhbSA/IGEuc3RyZWFtLmFib3J0KCkgOiBhWzFdID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5iZWZvcmVFbnF1ZXVlKGEpLCBjLnB1c2goYSksIGcgfHwgdSgpLCBlLnBvc3RzY3JpYmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19lc01vZHVsZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIGEpICYmIChlW2FdID0gblthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WydkZWZhdWx0J10gPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gaShuKDIpKSwgcyA9IGEobig0KSksIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckFzeW5jOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJEZXF1ZXVlOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJTdHJlYW1TdGFydDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyV3JpdGU6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUVucXVldWU6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVXcml0ZVRva2VuOiBmdW5jdGlvbiBiKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVXcml0ZTogZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZS5tc2cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VBc3luYzogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSA9IDAsIGMgPSBbXSwgZyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcChkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZTogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHJlYW06IGZbJ2RlZmF1bHQnXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbJ2RlZmF1bHQnXSA9IGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLl9fZXNNb2R1bGUgPyBlIDogeyAnZGVmYXVsdCc6IGUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBfKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBEICsgdCwgYSA9IGUuZ2V0QXR0cmlidXRlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5leGlzdHkoYSkgPyBTdHJpbmcoYSkgOiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiBuICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBudWxsLCBpID0gRCArIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuZXhpc3R5KGEpICYmICcnICE9PSBhID8gZS5zZXRBdHRyaWJ1dGUoaSwgYSkgOiBlLnJlbW92ZUF0dHJpYnV0ZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIGEpICYmIChlW2FdID0gblthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQyA9IGkobigzKSksIGsgPSBhKG4oNCkpLCBqID0gITEsIEQgPSAnZGF0YS1wcy0nLCB3ID0gJ3BzLXN0eWxlJywgViA9ICdwcy1zY3JpcHQnLCByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KHRoaXMsIGEpLCB0aGlzLnJvb3QgPSBlLCB0aGlzLm9wdGlvbnMgPSBuLCB0aGlzLmRvYyA9IGUub3duZXJEb2N1bWVudCwgdGhpcy53aW4gPSB0aGlzLmRvYy5kZWZhdWx0VmlldyB8fCB0aGlzLmRvYy5wYXJlbnRXaW5kb3csIHRoaXMucGFyc2VyID0gbmV3IENbJ2RlZmF1bHQnXSgnJywgeyBhdXRvRml4OiBuLmF1dG9GaXggfSksIHRoaXMuYWN0dWFscyA9IFtlXSwgdGhpcy5wcm94eUhpc3RvcnkgPSAnJywgdGhpcy5wcm94eVJvb3QgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KGUubm9kZU5hbWUpLCB0aGlzLnNjcmlwdFN0YWNrID0gW10sIHRoaXMud3JpdGVRdWV1ZSA9IFtdLCBQKHRoaXMucHJveHlSb290LCAncHJveHlvZicsIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKChlID0gdGhpcy53cml0ZVF1ZXVlKS5wdXNoLmFwcGx5KGUsIGFyZ3VtZW50cyk7ICF0aGlzLmRlZmVycmVkUmVtb3RlICYmIHRoaXMud3JpdGVRdWV1ZS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy53cml0ZVF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuaXNGdW5jdGlvbih0KSA/IHRoaXMuX2NhbGxGdW5jdGlvbih0KSA6IHRoaXMuX3dyaXRlSW1wbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnByb3RvdHlwZS5fY2FsbEZ1bmN0aW9uID0gZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdmdW5jdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLm5hbWUgfHwgZS50b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblNjcmlwdFN0YXJ0KHQpLCBlLmNhbGwodGhpcy53aW4sIHRoaXMuZG9jKSwgdGhpcy5fb25TY3JpcHREb25lKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3dyaXRlSW1wbCA9IGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VyLmFwcGVuZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdm9pZCAwLCBuID0gdm9pZCAwLCBhID0gdm9pZCAwLCBpID0gW107ICh0ID0gdGhpcy5wYXJzZXIucmVhZFRva2VuKCkpICYmICEobiA9IGsuaXNTY3JpcHQodCkpICYmICEoYSA9IGsuaXNTdHlsZSh0KSk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCA9IHRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKHQpKSAmJiBpLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IGkubGVuZ3RoICYmIHRoaXMuX3dyaXRlU3RhdGljVG9rZW5zKGkpLCBuICYmIHRoaXMuX2hhbmRsZVNjcmlwdFRva2VuKHQpLCBhICYmIHRoaXMuX2hhbmRsZVN0eWxlVG9rZW4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnByb3RvdHlwZS5fd3JpdGVTdGF0aWNUb2tlbnMgPSBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuX2J1aWxkQ2h1bmsoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuYWN0dWFsID8gKHQuaHRtbCA9IHRoaXMucHJveHlIaXN0b3J5ICsgdC5hY3R1YWwsIHRoaXMucHJveHlIaXN0b3J5ICs9IHQucHJveHksIHRoaXMucHJveHlSb290LmlubmVySFRNTCA9IHQuaHRtbCwgaiAmJiAodC5wcm94eUlubmVySFRNTCA9IHRoaXMucHJveHlSb290LmlubmVySFRNTCksIHRoaXMuX3dhbGtDaHVuaygpLCBqICYmICh0LmFjdHVhbElubmVySFRNTCA9IHRoaXMucm9vdC5pbm5lckhUTUwpLCB0KSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnByb3RvdHlwZS5fYnVpbGRDaHVuayA9IGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSB0aGlzLmFjdHVhbHMubGVuZ3RoLCBuID0gW10sIGEgPSBbXSwgaSA9IFtdLCByID0gZS5sZW5ndGgsIHMgPSAwOyBzIDwgcjsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZVtzXSwgYyA9IG8udG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4ucHVzaChjKSwgby5hdHRycykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEvXm5vc2NyaXB0JC9pLnRlc3Qoby50YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gdCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChjLnJlcGxhY2UoLyhcLz8+KS8sICcgJyArIEQgKyAnaWQ9JyArIGwgKyAnICQxJykpLCBvLmF0dHJzLmlkICE9PSBWICYmIG8uYXR0cnMuaWQgIT09IHcgJiYgaS5wdXNoKCdhdG9taWNUYWcnID09PSBvLnR5cGUgPyAnJyA6ICc8JyArIG8udGFnTmFtZSArICcgJyArIEQgKyAncHJveHlvZj0nICsgbCArIChvLnVuYXJ5ID8gJyAvPicgOiAnPicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goYyksIGkucHVzaCgnZW5kVGFnJyA9PT0gby50eXBlID8gYyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5zOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IG4uam9pbignJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYS5qb2luKCcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHk6IGkuam9pbignJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3dhbGtDaHVuayA9IGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IHZvaWQgMCwgdCA9IFt0aGlzLnByb3h5Um9vdF07IGsuZXhpc3R5KGUgPSB0LnNoaWZ0KCkpOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDEgPT09IGUubm9kZVR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiB8fCAhXyhlLCAncHJveHlvZicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIFAodGhpcy5hY3R1YWxzW18oZSwgJ2lkJyldID0gZSwgJ2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUucGFyZW50Tm9kZSAmJiBfKGUucGFyZW50Tm9kZSwgJ3Byb3h5b2YnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgdGhpcy5hY3R1YWxzW2FdLmFwcGVuZENoaWxkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudW5zaGlmdC5hcHBseSh0LCBrLnRvQXJyYXkoZS5jaGlsZE5vZGVzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX2hhbmRsZVNjcmlwdFRva2VuID0gZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBuID0gdGhpcy5wYXJzZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIHRoaXMud3JpdGVRdWV1ZS51bnNoaWZ0KG4pLCBlLnNyYyA9IGUuYXR0cnMuc3JjIHx8IGUuYXR0cnMuU1JDLCAoZSA9IHRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKGUpKSAmJiAoZS5zcmMgJiYgdGhpcy5zY3JpcHRTdGFjay5sZW5ndGggPyB0aGlzLmRlZmVycmVkUmVtb3RlID0gZSA6IHRoaXMuX29uU2NyaXB0U3RhcnQoZSksIHRoaXMuX3dyaXRlU2NyaXB0VG9rZW4oZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9vblNjcmlwdERvbmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX2hhbmRsZVN0eWxlVG9rZW4gPSBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMucGFyc2VyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0aGlzLndyaXRlUXVldWUudW5zaGlmdCh0KSwgZS50eXBlID0gZS5hdHRycy50eXBlIHx8IGUuYXR0cnMuVFlQRSB8fCAndGV4dC9jc3MnLCAoZSA9IHRoaXMub3B0aW9ucy5iZWZvcmVXcml0ZVRva2VuKGUpKSAmJiB0aGlzLl93cml0ZVN0eWxlVG9rZW4oZSksIHQgJiYgdGhpcy53cml0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3dyaXRlU3R5bGVUb2tlbiA9IGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcy5fYnVpbGRTdHlsZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnNlcnRDdXJzb3IodCwgdyksIGUuY29udGVudCAmJiAodC5zdHlsZVNoZWV0ICYmICF0LnNoZWV0ID8gdC5zdHlsZVNoZWV0LmNzc1RleHQgPSBlLmNvbnRlbnQgOiB0LmFwcGVuZENoaWxkKHRoaXMuZG9jLmNyZWF0ZVRleHROb2RlKGUuY29udGVudCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEucHJvdG90eXBlLl9idWlsZFN0eWxlID0gZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KGUudGFnTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc2V0QXR0cmlidXRlKCd0eXBlJywgZS50eXBlKSwgay5lYWNoS2V5KGUuYXR0cnMsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uc2V0QXR0cmlidXRlKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX2luc2VydEN1cnNvciA9IGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3dyaXRlSW1wbCgnPHNwYW4gaWQ9IicgKyB0ICsgJyIvPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5kb2MuZ2V0RWxlbWVudEJ5SWQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX29uU2NyaXB0U3RhcnQgPSBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm91dGVyV3JpdGVzID0gdGhpcy53cml0ZVF1ZXVlLCB0aGlzLndyaXRlUXVldWUgPSBbXSwgdGhpcy5zY3JpcHRTdGFjay51bnNoaWZ0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX29uU2NyaXB0RG9uZSA9IGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT09IHRoaXMuc2NyaXB0U3RhY2tbMF0gPyAodGhpcy5zY3JpcHRTdGFjay5zaGlmdCgpLCB0aGlzLndyaXRlLmFwcGx5KHRoaXMsIGUub3V0ZXJXcml0ZXMpLCAhdGhpcy5zY3JpcHRTdGFjay5sZW5ndGggJiYgdGhpcy5kZWZlcnJlZFJlbW90ZSAmJiAodGhpcy5fb25TY3JpcHRTdGFydCh0aGlzLmRlZmVycmVkUmVtb3RlKSwgdGhpcy5kZWZlcnJlZFJlbW90ZSA9IG51bGwpKSA6IHRoaXMub3B0aW9ucy5lcnJvcih7IG1zZzogJ0JhZCBzY3JpcHQgbmVzdGluZyBvciBzY3JpcHQgZmluaXNoZWQgdHdpY2UnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3dyaXRlU2NyaXB0VG9rZW4gPSBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX2J1aWxkU2NyaXB0KGUpLCBhID0gdGhpcy5fc2hvdWxkUmVsZWFzZShuKSwgaSA9IHRoaXMub3B0aW9ucy5hZnRlckFzeW5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3JjICYmIChuLnNyYyA9IGUuc3JjLCB0aGlzLl9zY3JpcHRMb2FkSGFuZGxlcihuLCBhID8gaSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpLCBpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc2VydEN1cnNvcihuLCBWKSwgbi5zcmMgJiYgIWEgfHwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmVycm9yKHIpLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX2J1aWxkU2NyaXB0ID0gZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KGUudGFnTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsuZWFjaEtleShlLmF0dHJzLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNldEF0dHJpYnV0ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5jb250ZW50ICYmIChuLnRleHQgPSBlLmNvbnRlbnQpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3NjcmlwdExvYWRIYW5kbGVyID0gZnVuY3Rpb24gdih0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQub25sb2FkID0gdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0Lm9uZXJyb3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKCksIG51bGwgIT0gbiAmJiBuKCksIG4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSgpLCBzKGUpLCBudWxsICE9IG4gJiYgbigpLCBuID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVsnb24nICsgdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gbiAmJiAoZVsnX29uJyArIHRdID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gdGhpcy5vcHRpb25zLmVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodCwgJ2xvYWQnKSwgZSh0LCAnZXJyb3InKSwgUyh0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24gbygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Ll9vbmxvYWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fb25sb2FkLmFwcGx5KHRoaXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcih7IG1zZzogJ29ubG9hZCBoYW5kbGVyIGZhaWxlZCAnICsgZSArICcgQCAnICsgdC5zcmMgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuX29uZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fb25lcnJvci5hcHBseSh0aGlzLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHIoeyBtc2c6ICdvbmVycm9yIGhhbmRsZXIgZmFpbGVkICcgKyBlICsgJyBAICcgKyB0LnNyYyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKHsgbXNnOiAncmVtb3RlIHNjcmlwdCBmYWlsZWQgJyArIHQuc3JjIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2U6IGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXihsb2FkZWR8Y29tcGxldGUpJC8udGVzdCh0LnJlYWR5U3RhdGUpICYmIGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5wcm90b3R5cGUuX3Nob3VsZFJlbGVhc2UgPSBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIS9ec2NyaXB0JC9pLnRlc3QoZS5ub2RlTmFtZSkgfHwgISEodGhpcy5vcHRpb25zLnJlbGVhc2VBc3luYyAmJiBlLnNyYyAmJiBlLmhhc0F0dHJpYnV0ZSgnYXN5bmMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFsnZGVmYXVsdCddID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiBhKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5leHBvcnRzID0gdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVtlXS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaVtlXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltlXS5jYWxsKHQuZXhwb3J0cywgdCwgdC5leHBvcnRzLCBhKSwgdC5sb2FkZWQgPSAhMCwgdC5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm0gPSBuLCBhLmMgPSBpLCBhLnAgPSAnJywgYSgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5fX2VzTW9kdWxlID8gZSA6IHsgJ2RlZmF1bHQnOiBlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gYShuKDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBpWydkZWZhdWx0J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuX19lc01vZHVsZSA/IGUgOiB7ICdkZWZhdWx0JzogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0WydkZWZhdWx0J10gPSBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19lc01vZHVsZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gaShuKDIpKSwgcCA9IGkobigzKSksIGYgPSBhKG4oNikpLCByID0gbig1KSwgbSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IC9ePCEtLS8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUYWc6IC9ePFwvLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY1RhZzogL148XHMqKHNjcmlwdHxzdHlsZXxub3NjcmlwdHxpZnJhbWV8dGV4dGFyZWEpW1xzXC8+XS9pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUYWc6IC9ePC8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyczogL15bXjxdLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCBhID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgZSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJycsIGkgPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KHRoaXMsIGMpLCB0aGlzLnN0cmVhbSA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMSwgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gaW4gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5oYXNPd25Qcm9wZXJ0eShvKSAmJiAoaS5hdXRvRml4ICYmIChzW28gKyAnRml4J10gPSAhMCksIHIgPSByIHx8IHNbbyArICdGaXgnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA/ICh0aGlzLl9yZWFkVG9rZW4gPSAoMCwgZlsnZGVmYXVsdCddKSh0aGlzLCBzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLl9yZWFkVG9rZW5JbXBsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXMuX3BlZWtUb2tlbiA9ICgwLCBmWydkZWZhdWx0J10pKHRoaXMsIHMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uX3BlZWtUb2tlbkltcGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiAodGhpcy5fcmVhZFRva2VuID0gdGhpcy5fcmVhZFRva2VuSW1wbCwgdGhpcy5fcGVla1Rva2VuID0gdGhpcy5fcGVla1Rva2VuSW1wbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0gKz0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLnByZXBlbmQgPSBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IGUgKyB0aGlzLnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLl9yZWFkVG9rZW5JbXBsID0gZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMuX3BlZWtUb2tlbkltcGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtID0gdGhpcy5zdHJlYW0uc2xpY2UoZS5sZW5ndGgpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUuX3BlZWtUb2tlbkltcGwgPSBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0uaGFzT3duUHJvcGVydHkoZSkgJiYgbVtlXS50ZXN0KHRoaXMuc3RyZWFtKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBwW2VdKHRoaXMuc3RyZWFtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RhcnRUYWcnID09PSB0LnR5cGUgJiYgL3NjcmlwdHxzdHlsZS9pLnRlc3QodC50YWdOYW1lKSA/IG51bGwgOiAodC50ZXh0ID0gdGhpcy5zdHJlYW0uc3Vic3RyKDAsIHQubGVuZ3RoKSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLnBlZWtUb2tlbiA9IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlZWtUb2tlbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5wcm90b3R5cGUucmVhZFRva2VuID0gZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVhZFRva2VuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5yZWFkVG9rZW5zID0gZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHZvaWQgMDsgdCA9IHRoaXMucmVhZFRva2VuKCk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVt0LnR5cGVdICYmICExID09PSBlW3QudHlwZV0odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJlYW0gPSAnJywgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMucHJvdG90eXBlLnJlc3QgPSBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0cmVhbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvIGluICgodFsnZGVmYXVsdCddID0gcykudG9rZW5Ub1N0cmluZyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmVzY2FwZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KG4pICYmICh0W25dID0gKDAsIHIuZXNjYXBlUXVvdGVzKShlW25dLCBudWxsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy5zdXBwb3J0cyA9IGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmhhc093blByb3BlcnR5KG8pICYmIChzLmJyb3dzZXJIYXNGbGF3ID0gcy5icm93c2VySGFzRmxhdyB8fCAhZFtvXSAmJiBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICEodC5fX2VzTW9kdWxlID0gITApLCBhID0gITEsIGkgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnPFA+PEk+PC9QPjwvST4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmlubmVySFRNTCA9IHIsIHQudGFnU291cCA9IG4gPSBpLmlubmVySFRNTCAhPT0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudGFnU291cCA9IG4gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5pbm5lckhUTUwgPSAnPFA+PGk+PFA+PC9QPjwvaT48L1A+JywgdC5zZWxmQ2xvc2UgPSBhID0gMiA9PT0gaS5jaGlsZE5vZGVzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2VsZkNsb3NlID0gYSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gbnVsbCwgdC50YWdTb3VwID0gbiwgdC5zZWxmQ2xvc2UgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaW5kZXhPZignLS0+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHUuQ29tbWVudFRva2VuKGUuc3Vic3RyKDQsIHQgLSAxKSwgdCArIDMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmluZGV4T2YoJzwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB1LkNoYXJzVG9rZW4oMCA8PSB0ID8gdCA6IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzLCBvLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT09IGUuaW5kZXhPZignPicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUubWF0Y2goZC5zdGFydFRhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gKHMgPSB7fSwgbyA9IHt9LCBjID0gdFsyXSwgdFsyXS5yZXBsYWNlKGQuYXR0ciwgZnVuY3Rpb24gKGUsIHQsIG4sIGEsIGksIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBhIHx8IGkgfHwgciA/IGFyZ3VtZW50c1s1XSA/IChzW2FyZ3VtZW50c1s1XV0gPSAnJywgb1thcmd1bWVudHNbNV1dID0gITApIDogc1t0XSA9IGFyZ3VtZW50c1syXSB8fCBhcmd1bWVudHNbM10gfHwgYXJndW1lbnRzWzRdIHx8IGQuZmlsbEF0dHIudGVzdCh0KSAmJiB0IHx8ICcnIDogc1t0XSA9ICcnLCBjID0gYy5yZXBsYWNlKGUsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgeyB2OiBuZXcgdS5TdGFydFRhZ1Rva2VuKHRbMV0sIHRbMF0ubGVuZ3RoLCBzLCBvLCAhIXRbM10sIGMucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csICcnKSkgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSAodm9pZCAwID09PSBuID8gJ3VuZGVmaW5lZCcgOiBsKG4pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4udjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnNsaWNlKHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLm1hdGNoKG5ldyBSZWdFeHAoJzwvXFxzKicgKyB0LnRhZ05hbWUgKyAnXFxzKj4nLCAnaScpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbi5tYXRjaChuZXcgUmVnRXhwKCcoW1xcc1xcU10qPyk8L1xccyonICsgdC50YWdOYW1lICsgJ1xccyo+JywgJ2knKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdS5BdG9taWNUYWdUb2tlbih0LnRhZ05hbWUsIGFbMF0ubGVuZ3RoICsgdC5sZW5ndGgsIHQuYXR0cnMsIHQuYm9vbGVhbkF0dHJzLCBhWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLm1hdGNoKGQuZW5kVGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHUuRW5kVGFnVG9rZW4odFsxXSwgdFswXS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5jb21tZW50ID0gYSwgdC5jaGFycyA9IGksIHQuc3RhcnRUYWcgPSByLCB0LmF0b21pY1RhZyA9IHMsIHQuZW5kVGFnID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG4oNCksIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRhZzogL148KFtcLUEtWmEtejAtOV9dKykoKD86XHMrW1x3XC1dKyg/OlxzKj0/XHMqKD86KD86IlteIl0qIil8KD86J1teJ10qJyl8W14+XHNdKykpPykqKVxzKihcLz8pPi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRUYWc6IC9ePFwvKFtcLUEtWmEtejAtOV9dKylbXj5dKj4vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cjogLyg/OihbXC1BLVphLXowLTlfXSspXHMqPVxzKig/Oig/OiIoKD86XFwufFteIl0pKikiKXwoPzonKCg/OlxcLnxbXiddKSopJyl8KFtePlxzXSspKSl8KD86KFtcLUEtWmEtejAtOV9dKykoXHN8JCkrKS9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbEF0dHI6IC9eKGNoZWNrZWR8Y29tcGFjdHxkZWNsYXJlfGRlZmVyfGRpc2FibGVkfGlzbWFwfG11bHRpcGxlfG5vaHJlZnxub3Jlc2l6ZXxub3NoYWRlfG5vd3JhcHxyZWFkb25seXxzZWxlY3RlZCkkL2kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuX19lc01vZHVsZSA9ICEwLCB0LkVuZFRhZ1Rva2VuID0gdC5BdG9taWNUYWdUb2tlbiA9IHQuU3RhcnRUYWdUb2tlbiA9IHQuVGFnVG9rZW4gPSB0LkNoYXJzVG9rZW4gPSB0LkNvbW1lbnRUb2tlbiA9IHQuVG9rZW4gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuKDUpLCBhID0gdC5Ub2tlbiA9IGZ1bmN0aW9uIGEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0aGlzLCBhKSwgdGhpcy50eXBlID0gZSwgdGhpcy5sZW5ndGggPSB0LCB0aGlzLnRleHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9ICh0LkNvbW1lbnRUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8odGhpcywgbiksIHRoaXMudHlwZSA9ICdjb21tZW50JywgdGhpcy5sZW5ndGggPSB0IHx8IChlID8gZS5sZW5ndGggOiAwKSwgdGhpcy50ZXh0ID0gJycsIHRoaXMuY29udGVudCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPCEtLScgKyB0aGlzLmNvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIHQuQ2hhcnNUb2tlbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8odGhpcywgdCksIHRoaXMudHlwZSA9ICdjaGFycycsIHRoaXMubGVuZ3RoID0gZSwgdGhpcy50ZXh0ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIHQuVGFnVG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQsIG4sIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKHRoaXMsIHIpLCB0aGlzLnR5cGUgPSBlLCB0aGlzLmxlbmd0aCA9IG4sIHRoaXMudGV4dCA9ICcnLCB0aGlzLnRhZ05hbWUgPSB0LCB0aGlzLmF0dHJzID0gYSwgdGhpcy5ib29sZWFuQXR0cnMgPSBpLCB0aGlzLnVuYXJ5ID0gITEsIHRoaXMuaHRtbDVVbmFyeSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuZm9ybWF0VGFnID0gZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBudWxsLCBhID0gJzwnICsgZS50YWdOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZS5hdHRycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYXR0cnMuaGFzT3duUHJvcGVydHkoaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKz0gJyAnICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5hdHRyc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBlLmJvb2xlYW5BdHRycyAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5ib29sZWFuQXR0cnNbaV0gfHwgKGEgKz0gJz0iJyArICgwLCBjLmVzY2FwZVF1b3RlcykocikgKyAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVzdCAmJiAoYSArPSAnICcgKyBlLnJlc3QpLCBlLnVuYXJ5ICYmICFlLmh0bWw1VW5hcnkgPyBhICs9ICcvPicgOiBhICs9ICc+JywgbiAhPT0gdW5kZWZpbmVkICYmIG51bGwgIT09IG4gJiYgKGEgKz0gbiArICc8LycgKyBlLnRhZ05hbWUgKyAnPicpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LlN0YXJ0VGFnVG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSwgdCwgbiwgYSwgaSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0aGlzLCBzKSwgdGhpcy50eXBlID0gJ3N0YXJ0VGFnJywgdGhpcy5sZW5ndGggPSB0LCB0aGlzLnRleHQgPSAnJywgdGhpcy50YWdOYW1lID0gZSwgdGhpcy5hdHRycyA9IG4sIHRoaXMuYm9vbGVhbkF0dHJzID0gYSwgdGhpcy5odG1sNVVuYXJ5ID0gITEsIHRoaXMudW5hcnkgPSBpLCB0aGlzLnJlc3QgPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5mb3JtYXRUYWcodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB0LkF0b21pY1RhZ1Rva2VuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQsIG4sIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8odGhpcywgciksIHRoaXMudHlwZSA9ICdhdG9taWNUYWcnLCB0aGlzLmxlbmd0aCA9IHQsIHRoaXMudGV4dCA9ICcnLCB0aGlzLnRhZ05hbWUgPSBlLCB0aGlzLmF0dHJzID0gbiwgdGhpcy5ib29sZWFuQXR0cnMgPSBhLCB0aGlzLnVuYXJ5ID0gITEsIHRoaXMuaHRtbDVVbmFyeSA9ICExLCB0aGlzLmNvbnRlbnQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5mb3JtYXRUYWcodGhpcywgdGhpcy5jb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIHQuRW5kVGFnVG9rZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0aGlzLCBuKSwgdGhpcy50eXBlID0gJ2VuZFRhZycsIHRoaXMubGVuZ3RoID0gdCwgdGhpcy50ZXh0ID0gJycsIHRoaXMudGFnTmFtZSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPC8nICsgdGhpcy50YWdOYW1lICsgJz4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB0ICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBlLnJlcGxhY2UoLyhbXiJdKikiL2csIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gL1xcLy50ZXN0KHQpID8gdCArICciJyA6IHQgKyAnXFwiJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMCwgdC5lc2NhcGVRdW90ZXMgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnc3RhcnRUYWcnID09PSBlLnR5cGUgJiYgKGUudW5hcnkgPSBhLnRlc3QoZS50YWdOYW1lKSB8fCBlLnVuYXJ5LCBlLmh0bWw1VW5hcnkgPSAhL1wvPiQvLnRlc3QoZS50ZXh0KSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuc3RyZWFtLCBhID0gbCh0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdHJlYW0gPSBuLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnBvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXBlbmQoJzwvJyArIG4udGFnTmFtZSArICc+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxhc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t0aGlzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmxhc3RUYWdOYW1lRXEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmxhc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQudGFnTmFtZSAmJiB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gZS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLmNvbnRhaW5zVGFnTmFtZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCBuID0gMDsgdCA9IHRoaXNbbl07IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC50YWdOYW1lID09PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obiwgYSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB1KG4sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBzW2UudHlwZV0gJiYgc1tlLnR5cGVdKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gcCgpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGFnOiBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnRhZ05hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUicgPT09IHQudG9VcHBlckNhc2UoKSAmJiByLmxhc3RUYWdOYW1lRXEoJ1RBQkxFJykgPyAobi5wcmVwZW5kKCc8VEJPRFk+JyksIGkoKSkgOiBhLnNlbGZDbG9zZUZpeCAmJiBmLnRlc3QodCkgJiYgci5jb250YWluc1RhZ05hbWUodCkgPyByLmxhc3RUYWdOYW1lRXEodCkgPyBkKG4sIHIpIDogKG4ucHJlcGVuZCgnPC8nICsgZS50YWdOYW1lICsgJz4nKSwgaSgpKSA6IGUudW5hcnkgfHwgci5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGFnOiBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sYXN0KCkgPyBhLnRhZ1NvdXBGaXggJiYgIXIubGFzdFRhZ05hbWVFcShlLnRhZ05hbWUpID8gZChuLCByKSA6IHIucG9wKCkgOiBhLnRhZ1NvdXBGaXggJiYgKHQoKSwgaSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKCksIGwodCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fX2VzTW9kdWxlID0gITAsIHRbJ2RlZmF1bHQnXSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAvXihBUkVBfEJBU0V8QkFTRUZPTlR8QlJ8Q09MfEZSQU1FfEhSfElNR3xJTlBVVHxJU0lOREVYfExJTkt8TUVUQXxQQVJBTXxFTUJFRCkkL2ksIGYgPSAvXihDT0xHUk9VUHxERHxEVHxMSXxPUFRJT05TfFB8VER8VEZPT1R8VEh8VEhFQUR8VFIpJC9pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB2b2lkIDAsIGkgPSBlICYmIGUubGVuZ3RoIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBpOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmNhbGwobiwgZVthXSwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmhhc093blByb3BlcnR5KGEpICYmIHQuY2FsbChuLCBhLCBlW2FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gbiB8fCB7fSwgcihlLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYShuW2VdKSB8fCAobltlXSA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKG4gPSBbXSwgaShlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7IHY6IG4gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09ICh2b2lkIDAgPT09IHQgPyAndW5kZWZpbmVkJyA6IHAodCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtlLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgJ3N0YXJ0VGFnJyAhPT0gZS50eXBlICYmICdhdG9taWNUYWcnICE9PSBlLnR5cGUgfHwgISgndGFnTmFtZScgaW4gZSkgfHwgIX5lLnRhZ05hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKGUsICdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKGUsICdzdHlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9fZXNNb2R1bGUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5leGlzdHkgPSBhLCB0LmlzRnVuY3Rpb24gPSBuLCB0LmVhY2ggPSBpLCB0LmVhY2hLZXkgPSByLCB0LmRlZmF1bHRzID0gcywgdC50b0FycmF5ID0gbywgdC5sYXN0ID0gYywgdC5pc1RhZyA9IGwsIHQuaXNTY3JpcHQgPSB1LCB0LmlzU3R5bGUgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvdW5lc2NhcGVIdG1sQ29kZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKCdAYWRvYmUvcmVhY3Rvci1kb2N1bWVudCcpLmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmlubmVySFRNTCA9IGUsIGEudGV4dENvbnRlbnQgfHwgYS5pbm5lclRleHQgfHwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2FjdGlvbnMvaGVscGVycy9kZWNvcmF0b3JzL2RlY29yYXRlR2xvYmFsSmF2YVNjcmlwdENvZGUuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignQGFkb2JlL3JlYWN0b3ItcHJvbWlzZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnPHNjcmlwdD5cbicgKyB0ICsgJ1xuPC9zY3JpcHQ+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IGEucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdG9ycy9kZWNvcmF0ZU5vbkdsb2JhbEphdmFTY3JpcHRDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGEsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnX3J1blNjcmlwdCcgKyArK3MsIHQgPSBuZXcgcihmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYXRlbGxpdGVbaV0gPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgX3NhdGVsbGl0ZVtpXSwgbmV3IHIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUodC5jYWxsKGEuZXZlbnQuZWxlbWVudCwgYS5ldmVudCwgYS5ldmVudC50YXJnZXQsIHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnPHNjcmlwdD5fc2F0ZWxsaXRlWyInICsgaSArICciXShmdW5jdGlvbihldmVudCwgdGFyZ2V0LCBQcm9taXNlKSB7XG4nICsgZSArICdcbn0pOzwvc2NyaXB0PicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2hlbHBlcnMvZGVjb3JhdG9ycy9kZWNvcmF0ZUh0bWxDb2RlLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgciA9IDAsIHMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX3NhdGVsbGl0ZSA9IHdpbmRvdy5fc2F0ZWxsaXRlIHx8IHt9LCB3aW5kb3cuX3NhdGVsbGl0ZS5fb25DdXN0b21Db2RlU3VjY2VzcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoZGVsZXRlIHNbZV0sIHQucmVzb2x2ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cuX3NhdGVsbGl0ZS5fb25DdXN0b21Db2RlRmFpbHVyZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoZGVsZXRlIHNbZV0sIHQucmVqZWN0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSBlLmluZGV4T2YoJyR7cmVhY3RvckNhbGxiYWNrSWR9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVwbGFjZSgvXCR7cmVhY3RvckNhbGxiYWNrSWR9L2csIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnNldHRpbmdzLmlzRXh0ZXJuYWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKGUpICYmICh0ID0gYS5yZXBsYWNlVG9rZW5zKHQsIGUuZXZlbnQpKSwgbyh0KSA/IChuID0gbmV3IGkoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbU3RyaW5nKHIpXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgPSBjKHQsIHIpLCByICs9IDEpIDogbiA9IGkucmVzb2x2ZSgpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdjb3JlL3NyYy9saWIvYWN0aW9ucy9oZWxwZXJzL2dldFNvdXJjZUJ5VXJsLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG4oJ0BhZG9iZS9yZWFjdG9yLWxvYWQtc2NyaXB0JyksIGkgPSBuKCdAYWRvYmUvcmVhY3Rvci1wcm9taXNlJyksIHIgPSB7fSwgcyA9IHt9LCBvID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2VdIHx8IChzW2VdID0gYShlKSksIHNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5fX3JlZ2lzdGVyU2NyaXB0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltlXSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJbdF0gPyBpLnJlc29sdmUoclt0XSkgOiBuZXcgaShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHJbdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL2NyZWF0ZUJ1YmJseS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKCcuL3dlYWtNYXAnKSwgZiA9IG4oJy4vbWF0Y2hlc1Byb3BlcnRpZXMnKSwgbSA9IG4oJy4vbWF0Y2hlc1NlbGVjdG9yJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IFtdLCBwID0gbmV3IGEoKSwgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZUV2ZW50OiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5sZW5ndGggJiYgIXAuaGFzKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdC50YXJnZXQsIGEgPSAhMTsgbjspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gITEsIHIgPSAhMSwgcyA9IDA7IHMgPCBkLmxlbmd0aDsgcysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZFtzXSwgYyA9IG8uc2V0dGluZ3MuZWxlbWVudFNlbGVjdG9yLCBsID0gby5zZXR0aW5ncy5lbGVtZW50UHJvcGVydGllczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghMSAhPT0gby5zZXR0aW5ncy5idWJibGVGaXJlSWZDaGlsZEZpcmVkIHx8ICFhKSAmJiAobiA9PT0gdC50YXJnZXQgfHwgITEgIT09IG8uc2V0dGluZ3MuYnViYmxlRmlyZUlmUGFyZW50KSAmJiAobiA9PT0gdC50YXJnZXQgfHwgYyB8fCBsICYmIE9iamVjdC5rZXlzKGwpLmxlbmd0aCkgJiYgKCFjIHx8IG0obiwgYykpICYmICghbCB8fCBmKG4sIGwpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdVtlXSA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHUubmF0aXZlRXZlbnQgPSB0LCB1LmVsZW1lbnQgPSBuLCB1LnRhcmdldCA9IHQudGFyZ2V0LCAhMSAhPT0gby5jYWxsYmFjayh1KSAmJiAociA9ICEwLCBvLnNldHRpbmdzLmJ1YmJsZVN0b3AgJiYgKGkgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICYmIChhID0gITApLCBuID0gbi5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5zZXQodCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL3dlYWtNYXAuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JykuV2Vha01hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5LCByID0gRGF0ZS5ub3coKSAlIDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gJ19fc3QnICsgKDEwMDAwMDAwMDAgKiBNYXRoLnJhbmRvbSgpID4+PiAwKSArIHIrKyArICdfXyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnByb3RvdHlwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGVbdGhpcy5uYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBuWzBdID09PSBlID8gblsxXSA9IHQgOiBpKGUsIHRoaXMubmFtZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodCA9IGVbdGhpcy5uYW1lXSkgJiYgdFswXSA9PT0gZSA/IHRbMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3RoaXMubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIXQgfHwgdFswXSAhPT0gZSB8fCAodFswXSA9IHRbMV0gPSB1bmRlZmluZWQsIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3RoaXMubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiB0WzBdID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnY29yZS9zcmMvbGliL2V2ZW50cy9oZWxwZXJzL21hdGNoZXNQcm9wZXJ0aWVzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4oJy4vLi4vLi4vaGVscGVycy90ZXh0TWF0Y2gnKSwgciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0B0ZXh0JyA9PT0gdCB8fCAnaW5uZXJUZXh0JyA9PT0gdCA/IGUudGV4dENvbnRlbnQgfHwgZS5pbm5lclRleHQgOiB0IGluIGUgPyBlW3RdIDogZS5nZXRBdHRyaWJ1dGUgPyBlLmdldEF0dHJpYnV0ZSh0KSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgZS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGEsIGUubmFtZSksIG4gPSBlLnZhbHVlSXNSZWdleCA/IG5ldyBSZWdFeHAoZS52YWx1ZSwgJ2knKSA6IGUudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvcmUvc3JjL2xpYi9ldmVudHMvaGVscGVycy9tYXRjaGVzU2VsZWN0b3IuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5tYXRjaGVzIHx8IGUubXNNYXRjaGVzU2VsZWN0b3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxvZ2dlci53YXJuKCdNYXRjaGluZyBlbGVtZW50IGZhaWxlZC4gJyArIHQgKyAnIGlzIG5vdCBhIHZhbGlkIHNlbGVjdG9yLicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQZGY5NTQzOWFjMjc3NDVlZWE1MGQzYzc1ZmQ2ZWQyMzUvJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdhZG9iZS1tY2lkJzogewogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRXhwZXJpZW5jZSBDbG91ZCBJRCBTZXJ2aWNlJywKICAgICAgICAgICAgICAgICAgICBtb2R1bGVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1tY2lkL3NyYy9saWIvc2hhcmVkTW9kdWxlcy9tY2lkSW5zdGFuY2UuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignQGFkb2JlL3JlYWN0b3ItZG9jdW1lbnQnKSwgaSA9IG4oJy4uL2NvZGVMaWJyYXJ5L1Zpc2l0b3JBUEknKSwgZyA9IG4oJy4uLy4uL3ZpZXcvdXRpbHMvdGltZVVuaXRzJyksIGIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAvXih0cnVlfGZhbHNlKSQvaS50ZXN0KHQudmFsdWUpID8gSlNPTi5wYXJzZSh0LnZhbHVlKSA6IHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbdC5uYW1lXSA9IG4sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBtLmdldEV4dGVuc2lvblNldHRpbmdzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHQub3JnSWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT3JnIElEIGlzIG5vdCBhIHN0cmluZy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYih0LnZhcmlhYmxlcyB8fCBbXSksIGEgPSB0LmRvZXNPcHRJbkFwcGx5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAoJ2Jvb2xlYW4nID09IHR5cGVvZiBhID8gbi5kb2VzT3B0SW5BcHBseSA9IGEgOiB0Lm9wdEluQ2FsbGJhY2sgJiYgKG4uZG9lc09wdEluQXBwbHkgPSB0Lm9wdEluQ2FsbGJhY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5pc09wdEluU3RvcmFnZUVuYWJsZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICYmIChuLmlzT3B0SW5TdG9yYWdlRW5hYmxlZCA9IGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0Lm9wdEluQ29va2llRG9tYWluOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAobi5vcHRJbkNvb2tpZURvbWFpbiA9IHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB0Lm9wdEluU3RvcmFnZUV4cGlyeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0LnRpbWVVbml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvICYmIGdbb10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzICogZ1tvXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5vcHRJblN0b3JhZ2VFeHBpcnkgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSBpICYmIChuLm9wdEluU3RvcmFnZUV4cGlyeSA9IDMzNjk2MDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gdC5wcmV2aW91c1Blcm1pc3Npb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCAmJiAobi5wcmV2aW91c1Blcm1pc3Npb25zID0gbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IHQucHJlT3B0SW5BcHByb3ZhbHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnByZU9wdEluQXBwcm92YWxzID0gdTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdC5wcmVPcHRJbkFwcHJvdmFsSW5wdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAobi5wcmVPcHRJbkFwcHJvdmFscyA9IGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSB0LmlzSWFiQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgJiYgKG4uaXNJYWJDb250ZXh0ID0gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGUuZ2V0SW5zdGFuY2UodC5vcmdJZCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5sb2dnZXIuaW5mbygnQ3JlYXRlZCBpbnN0YW5jZSB1c2luZyBvcmdJZDogIicgKyB0Lm9yZ0lkICsgJyInKSwgbS5sb2dnZXIuaW5mbygnU2V0IHZhcmlhYmxlczogJyArIEpTT04uc3RyaW5naWZ5KG4pKSwgZi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubG9nZ2VyLmluZm8oJ09idGFpbmVkIE1hcmtldGluZyBDbG91ZCBWaXNpdG9yIElkOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMCksIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtLmdldEV4dGVuc2lvblNldHRpbmdzKCkucGF0aEV4Y2x1c2lvbnMgfHwgW10pLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZUlzUmVnZXggPyBuZXcgUmVnRXhwKGUudmFsdWUsICdpJykudGVzdCh0KSA6IGUudmFsdWUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhdGVsbGl0ZS5nZXRWaXNpdG9ySWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHMoYS5sb2NhdGlvbi5wYXRobmFtZSkgPyBtLmxvZ2dlci53YXJuKCdNQ0lEIGxpYnJhcnkgbm90IGxvYWRlZC4gT25lIG9mIHRoZSBwYXRoIGV4Y2x1c2lvbnMgbWF0Y2hlcyB0aGUgY3VycmVudCBwYXRoLicpIDogbyA9IHIoaSksIGUuZXhwb3J0cyA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ21jaWQtaW5zdGFuY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtbWNpZC9zcmMvbGliL2NvZGVMaWJyYXJ5L1Zpc2l0b3JBUEkuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBXKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVyA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBlW3RdID0gbiwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja3NbZV0gPSB0aGlzLmNhbGxiYWNrc1tlXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmNhbGxiYWNrc1tlXS5wdXNoKHQpIC0gMSwgYSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmNhbGxiYWNrc1tlXS5zcGxpY2UobiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFja3NbZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAodCA9IHZvaWQgMCA9PT0gdCA/IFtdIDogdCkgaW5zdGFuY2VvZiBBcnJheSA/IHQgOiBbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyB0aGlzLmNhbGxiYWNrc1tlXS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5jYWxsYmFja3NbZV0uc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbiA/IG4uYXBwbHkobnVsbCwgdCkgOiBuIGluc3RhbmNlb2YgQXJyYXkgJiYgblsxXS5hcHBseShuWzBdLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlQWxsOiBmdW5jdGlvbiAobiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSB8fCBuICYmICFHLmlzT2JqZWN0RW1wdHkobikpICYmIE9iamVjdC5rZXlzKHRoaXMuY2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZvaWQgMCAhPT0gbltlXSA/IG5bZV0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhlY3V0ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDYWxsYmFja3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oT2JqZWN0LmtleXModGhpcy5jYWxsYmFja3MpLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbnVsbCA9PSBlID8gdm9pZCAwIDogZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IGEgPyBuIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAvXlxkKyQvLCBuID0gMCwgYSA9IGUubGVuZ3RoOyBuIDwgYTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC50ZXN0KGVbbl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZS5sZW5ndGggPCB0Lmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wdXNoKCcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgdC5sZW5ndGggPCBlLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKCcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGVuZ3RoOyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHBhcnNlSW50KGVbbl0sIDEwKSwgaSA9IHBhcnNlSW50KHRbbl0sIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhIDwgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS50b1N0cmluZygpLnNwbGl0KCcuJyksIGEgPSB0LnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKG4uY29uY2F0KGEpKSA/IChyKG4sIGEpLCBzKG4sIGEpKSA6IE5hTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBPYmplY3QoZSkgJiYgMCA9PT0gT2JqZWN0LmtleXMoZSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgfHwgZSBpbnN0YW5jZW9mIEFycmF5ICYmIGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGUgPyBhcmd1bWVudHNbMF0gOiAnJywgYSA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZyA9IHBlKCdsb2cnLCBuLCBhKSwgdGhpcy53YXJuID0gcGUoJ3dhcm4nLCBuLCBhKSwgdGhpcy5lcnJvciA9IHBlKCdlcnJvcicsIG4sIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAoMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gYXJndW1lbnRzWzBdIDoge30pLmNvb2tpZU5hbWUsIHIgPSAoMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ID8gYXJndW1lbnRzWzFdIDoge30pLmNvb2tpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgIXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiB3ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiB3ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiB3ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yZW1vdmUoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByLmdldChpKSwgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcy5nZXQoKSwgYSA9IE9iamVjdC5hc3NpZ24obiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0KGksIEpTT04uc3RyaW5naWZ5KGEpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHQub3B0SW5Db29raWVEb21haW4gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVMaWZldGltZTogdC5vcHRJblN0b3JhZ2VFeHBpcnkgfHwgMzQxOTAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHRoaXMubWVzc2FnZSA9IGUsICdmdW5jdGlvbicgPT0gdHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID8gRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3RvcikgOiB0aGlzLnN0YWNrID0gbmV3IEVycm9yKGUpLnN0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5sZW5ndGggPyBuLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBoZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyhUKSwgRShILkNPTVBMRVRFKSwgUyhQLnN0YXR1cywgUC5wZXJtaXNzaW9ucyksIGwgJiYgXy5zZXQoUC5wZXJtaXNzaW9ucywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJbkNvb2tpZURvbWFpbjogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0SW5TdG9yYWdlRXhwaXJ5OiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEMuZXhlY3V0ZShBZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5ZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW09wdEluXSBJbnZhbGlkIGNhdGVnb3J5KC1pZXMpLiBQbGVhc2UgdXNlIHRoZSBgT3B0SW4uQ2F0ZWdvcmllc2AgZW51bS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoSC5DSEFOR0VEKSwgT2JqZWN0LmFzc2lnbihULCBfZSh2ZShlKSwgbikpLCB0IHx8IGEoKSwgUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGUgPyBhcmd1bWVudHNbMF0gOiB7fSwgcyA9IHIuZG9lc09wdEluQXBwbHksIG8gPSByLnByZXZpb3VzUGVybWlzc2lvbnMsIGMgPSByLnByZU9wdEluQXBwcm92YWxzLCBsID0gci5pc09wdEluU3RvcmFnZUVuYWJsZWQsIHUgPSByLm9wdEluQ29va2llRG9tYWluLCBkID0gci5vcHRJblN0b3JhZ2VFeHBpcnksIHAgPSByLmlzSWFiQ29udGV4dCwgZiA9ICgxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IHQgPyBhcmd1bWVudHNbMV0gOiB7fSkuY29va2llcywgbSA9IFZlKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWUobSwgJ0ludmFsaWQgYHByZXZpb3VzUGVybWlzc2lvbnNgIScpLCBJZShjLCAnSW52YWxpZCBgcHJlT3B0SW5BcHByb3ZhbHNgIScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcsIGIsIHYsIGgsIHksIF8gPSBBKHsgY29va2llTmFtZTogJ2Fkb2JldWpzLW9wdGluJyB9LCB7IGNvb2tpZXM6IGYgfSksIFAgPSB0aGlzLCBTID0gVShQKSwgQyA9IGxlKCksIGsgPSBDZShtKSwgaiA9IENlKGMpLCBEID0gbCA/IF8uZ2V0KCkgOiB7fSwgdyA9IHt9LCBWID0gKHkgPSBELCBrZShrKSB8fCB5ICYmIGtlKHkpID8gSC5DT01QTEVURSA6IEguUEVORElORyksIEkgPSAoZyA9IGosIGIgPSBrLCB2ID0gRCwgaCA9IF9lKGNlLCAhcyksIHMgPyBPYmplY3QuYXNzaWduKHt9LCBoLCBnLCBiLCB2KSA6IGgpLCBUID0gUGUoSSksIEUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gViA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC5kZW55ID0gaSghMSksIFAuYXBwcm92ZSA9IGkoITApLCBQLmRlbnlBbGwgPSBQLmRlbnkuYmluZChQLCBjZSksIFAuYXBwcm92ZUFsbCA9IFAuYXBwcm92ZS5iaW5kKFAsIGNlKSwgUC5pc0FwcHJvdmVkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlLCBQLnBlcm1pc3Npb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFAuaXNQcmVBcHByb3ZlZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBQLmZldGNoUGVybWlzc2lvbnMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ICYmIGFyZ3VtZW50c1sxXSwgYSA9IG4gPyBQLm9uKEguQ09NUExFVEUsIGUpIDogd2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFzIHx8IHMgJiYgUC5pc0NvbXBsZXRlIHx8IGMgPyBlKFAucGVybWlzc2lvbnMpIDogbiB8fCBDLmFkZChBZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShQLnBlcm1pc3Npb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFAuY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC5zdGF0dXMgPT09IEguQ0hBTkdFRCAmJiBhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBQLnJlZ2lzdGVyUGx1Z2luID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIWUubmFtZSB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiBlLm9uUmVnaXN0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihNZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1tlLm5hbWVdIHx8ICh3W2UubmFtZV0gPSBlKS5vblJlZ2lzdGVyLmNhbGwoZSwgUCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBQLmV4ZWN1dGUgPSBPZSh3KSwgUC5tZW1vaXplQ29udGVudCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGUoZSkgJiYgXy5zZXQoZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJbkNvb2tpZURvbWFpbjogdSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0SW5TdG9yYWdlRXhwaXJ5OiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBQLmdldE1lbW9pemVkQ29udGVudCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBfLmdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2F0ZWdvcmllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzT3B0SW5BcHBseTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGVuZGluZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQLnN0YXR1cyA9PT0gSC5QRU5ESU5HOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXRlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAuc3RhdHVzID09PSBILkNPTVBMRVRFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3BsdWdpbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSWFiQ29udGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBudWxsLCBlLmNhbGwoZSwgbmV3IGwoJ1RoZSBjYWxsIHRvb2sgbG9uZ2VyIHRoYW4geW91IHdhbnRlZCEnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKGNsZWFyVGltZW91dChpKSwgZS5hcHBseShlLCBhcmd1bWVudHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHNldFRpbWVvdXQobiwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5fX3RjZmFwaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Ll9fdGNmYXBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPT0gd2luZG93LnRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHM7ICFzOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZyYW1lcy5fX3RjZmFwaUxvY2F0b3IgJiYgKHMgPSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB3aW5kb3cudG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuX190Y2ZhcGkgPSBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBNYXRoLnJhbmRvbSgpICsgJycsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdGNmYXBpQ2FsbDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcjogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvW2ldID0gbiwgcy5wb3N0TWVzc2FnZShyLCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gSlNPTi5wYXJzZShlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5fX3RjZmFwaVJldHVybikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5fX3RjZmFwaVJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBvW24uY2FsbElkXSAmJiAob1tuLmNhbGxJZF0obi5yZXR1cm5WYWx1ZSwgbi5zdWNjZXNzKSwgZGVsZXRlIG9bbi5jYWxsSWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpLCB3aW5kb3cuX190Y2ZhcGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlLmVycm9yKCdfX3RjZmFwaSBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlLmVycm9yKCdfX3RjZmFwaSBub3QgZm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtKHQsIGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBuID8gYXJndW1lbnRzWzJdIDogW10sIGkgPSAhMCA9PT0gdC52ZW5kb3IuY29uc2VudHNbZV0sIHIgPSBhLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gdC5wdXJwb3NlLmNvbnNlbnRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgJiYgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5uYW1lID0gJ2lhYlBsdWdpbicsIG4udmVyc2lvbiA9ICcwLjAuMic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgcyA9IGxlKCksIG8gPSB7IHRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhOiBudWxsIH0sIGMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IGFyZ3VtZW50c1sxXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1tlXSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZmV0Y2hDb25zZW50RGF0YSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkKGUuY2FsbGJhY2ssIGUudGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCh7IGNhbGxiYWNrOiB0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5pc0FwcHJvdmVkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuY2FsbGJhY2ssIGEgPSBlLmNhdGVnb3J5LCB0ID0gZS50aW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihudWxsLCBtKG8udHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEsIHJlW2FdLCBzZVthXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gZChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGUsIG0odCwgcmVbYV0sIHNlW2FdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbi5vblJlZ2lzdGVyID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5rZXlzKHJlKSwgZSA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZSAmJiBuICYmICh0LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0obiwgcmVbZV0sIHNlW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW3QgPyAnYXBwcm92ZScgOiAnZGVueSddKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhLmNvbXBsZXRlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uZmV0Y2hDb25zZW50RGF0YSh7IGNhbGxiYWNrOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoby50cmFuc3BhcmVuY3lBbmRDb25zZW50RGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KG51bGwsIG8udHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmFkZCgnRkVUQ0hfQ09OU0VOVF9EQVRBJywgdCksIGEoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBQZShlKSwgYSA9IHIuZ2V0TWVtb2l6ZWRDb250ZW50KCdpYWJDb25zZW50SGFzaCcpLCBpID0gbWUobi50Y1N0cmluZykudG9TdHJpbmcoMzIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY29uc2VudFN0cmluZyA9IGUudGNTdHJpbmcsIG4uaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsID0gYSAhPT0gaSwgYygndHJhbnNwYXJlbmN5QW5kQ29uc2VudERhdGEnLCBuKSwgci5tZW1vaXplQ29udGVudCh7IGlhYkNvbnNlbnRIYXNoOiBpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5leGVjdXRlKCdGRVRDSF9DT05TRU5UX0RBVEEnLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnRyYW5zcGFyZW5jeUFuZENvbnNlbnREYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRWUocmUpLCBuID0gZigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBuICYmIG4oJ2dldFRDRGF0YScsIDIsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEogPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGdsb2JhbCA/IGdsb2JhbCA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBzZWxmID8gc2VsZiA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgbiwgYSA9IDE7IGEgPCBhcmd1bWVudHMubGVuZ3RoOyArK2EpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIG4gPSBhcmd1bWVudHNbYV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCB0KSAmJiAoZVt0XSA9IG5bdF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiLCB2LCBoLCB5LCBxID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRTSEFLRTogJ0hBTkRTSEFLRScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVFNUQVRFOiAnR0VUU1RBVEUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJFTlRTVEFURTogJ1BBUkVOVFNUQVRFJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVEVfS0VZU19NQVA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNNSUQ6ICdNQ01JRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUlEOiAnTUNBSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICdNQ0FBTUInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUxIOiAnTUNBQU1MSCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnTUNPUFRPVVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVNUT01FUklEUzogJ0NVU1RPTUVSSURTJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNZTkNfQVBJX01BUDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogJ2dldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBSUQ6ICdnZXRBbmFseXRpY3NWaXNpdG9ySUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICdnZXRBdWRpZW5jZU1hbmFnZXJCbG9iJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogJ2dldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DT1BUT1VUOiAnaXNPcHRlZE91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMTEZJRUxEUzogJ2dldFZpc2l0b3JWYWx1ZXMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU5DX0FQSV9NQVA6IHsgQ1VTVE9NRVJJRFM6ICdnZXRDdXN0b21lcklEcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExfQVBJUzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ01JRDogJ2dldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1COiAnZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdnZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ09QVE9VVDogJ2lzT3B0ZWRPdXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FJRDogJ2dldEFuYWx5dGljc1Zpc2l0b3JJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTUVSSURTOiAnZ2V0Q3VzdG9tZXJJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExGSUVMRFM6ICdnZXRWaXNpdG9yVmFsdWVzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERHUk9VUF9UT19GSUVMRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQzogJ01DTUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTogJ01DQUlEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFNOiAnTUNBQU1CJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DTUlEOiAnTUNNSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ09QVE9VVDogJ01DT1BUT1VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBSUQ6ICdNQ0FJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQUFNTEg6ICdNQ0FBTUxIJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1COiAnTUNBQU1CJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVUSF9TVEFURTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTktOT1dOOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVVRIRU5USUNBVEVEOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRURfT1VUOiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUOiB7IEdMT0JBTDogJ2dsb2JhbCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQU1FX1NJVEVfVkFMVUVTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBWDogJ0xheCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUUklDVDogJ1N0cmljdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTkU6ICdOb25lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8gPSBxLlNUQVRFX0tFWVNfTUFQLCBQID0gZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByKDAsIG4pLCB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtuXSA9IGUsIGkuc2V0U3RhdGVBbmRQdWJsaXNoKHQpLCBhKGUpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmZpbmRGaWVsZChfLk1DTUlELCBlKSwgbiA9IGkuY2FsbCh0aGlzLCBfLk1DTUlELCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCA/IHQgOiBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5nZXRWaXNpdG9yVmFsdWVzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCh7IE1DTUlEOiBlIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUyA9IHEuTUVTU0FHRVMsIEMgPSBxLkFTWU5DX0FQSV9NQVAsIGsgPSBxLlNZTkNfQVBJX01BUCwgaiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY2FsbGJhY2tSZWdpc3RyeS5hZGQoZSwgdCksIG4ubWVzc2FnZVBhcmVudChTLkdFVFNUQVRFKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW0NbYV1dID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMuZmluZEZpZWxkKGEsIGUpLCBuID0gci5jYWxsKHRoaXMsIGEsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdCA/IHQgOiBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2tbZV1dID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpZWxkKGUsIGkpIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhDKS5mb3JFYWNoKGUsIHRoaXMpLCBPYmplY3Qua2V5cyhrKS5mb3JFYWNoKHQsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgRCA9IHEuQVNZTkNfQVBJX01BUCwgdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhEKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbRFt0XV0gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja1JlZ2lzdHJ5LmFkZCh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEcgPSAoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmlzT2JqZWN0RW1wdHkgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gT2JqZWN0KGUpICYmIDAgPT09IE9iamVjdC5rZXlzKGUpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmlzVmFsdWVFbXB0eSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJyA9PT0gZSB8fCB0LmlzT2JqZWN0RW1wdHkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuYXZpZ2F0b3IuYXBwTmFtZSwgdCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyJyA9PT0gZSB8fCAwIDw9IHQuaW5kZXhPZignTVNJRSAnKSB8fCAwIDw9IHQuaW5kZXhPZignVHJpZGVudC8nKSAmJiAwIDw9IHQuaW5kZXhPZignV2luZG93cyBOVCA2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldEllVmVyc2lvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50TW9kZSA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSA6IG4oKSA/IDcgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0LmlzT2JqZWN0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT09IGUgJiYgJ29iamVjdCcgPT09IFcoZSkgJiYgITEgPT09IEFycmF5LmlzQXJyYXkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5kZWZpbmVHbG9iYWxOYW1lc3BhY2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYWRvYmUgPSB0LmlzT2JqZWN0KHdpbmRvdy5hZG9iZSkgPyB3aW5kb3cuYWRvYmUgOiB7fSwgd2luZG93LmFkb2JlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucGx1Y2sgPSBmdW5jdGlvbiAobiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW3RdICYmIChlW3RdID0gblt0XSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQucGFyc2VPcHRPdXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IHx8ICh0ID0gbiwgZS5kX29wdG91dCAmJiBlLmRfb3B0b3V0IGluc3RhbmNlb2YgQXJyYXkgJiYgKHQgPSBlLmRfb3B0b3V0LmpvaW4oJywnKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHBhcnNlSW50KGUuZF9vdHRsLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihhKSAmJiAoYSA9IDcyMDApLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRPdXQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX290dGw6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Lm5vcm1hbGl6ZUJvb2xlYW4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IGUgPyB0ID0gITAgOiAnZmFsc2UnID09PSBlICYmICh0ID0gITEpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHkgPSB7IGV4cG9ydHM6IHt9IH0sIHkuZXhwb3J0cyksIHkuZXhwb3J0cyksIFYgPSAoRy5pc09iamVjdEVtcHR5LCBHLmlzVmFsdWVFbXB0eSwgRy5nZXRJZVZlcnNpb24sIEcuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0LCBHLmlzT2JqZWN0LCBHLmRlZmluZUdsb2JhbE5hbWVzcGFjZSwgRy5wbHVjaywgRy5wYXJzZU9wdE91dCwgRy5ub3JtYWxpemVCb29sZWFuLCB0KSwgSSA9IHEuTUVTU0FHRVMsIFQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogJ3ByZWZpeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTogJ29yZ0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOiAnc3RhdGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBZID0gZnVuY3Rpb24gKHIsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5kYXRhLnNwbGl0KCd8JykuZm9yRWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gZSAmJiAobltUW3RdXSA9IDIgIT09IHQgPyBlIDogSlNPTi5wYXJzZShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5pc0ludmFsaWQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCBPYmplY3Qua2V5cyh0KS5sZW5ndGggPCAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIgIT09IHQub3JnSUQsIGEgPSAhcyB8fCBlLm9yaWdpbiAhPT0gcywgaSA9IC0xID09PSBPYmplY3Qua2V5cyhJKS5pbmRleE9mKHQucHJlZml4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gfHwgYSB8fCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2VuZCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdCArICd8JyArIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbiA9PT0gT2JqZWN0KG4pICYmIChhICs9ICd8JyArIEpTT04uc3RyaW5naWZ5KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucG9zdE1lc3NhZ2UoYSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBFID0gcS5NRVNTQUdFUywgTyA9IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGYuc3RhdGUsIGUpLCBPYmplY3QuYXNzaWduKGYuc3RhdGUuQUxMRklFTERTLCBlKSwgZi5jYWxsYmFja1JlZ2lzdHJ5LmV4ZWN1dGVBbGwoZi5zdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIuaXNJbnZhbGlkKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGIucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnNldFN0YXRlQW5kUHVibGlzaCh0LnN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWcgJiYgbSAmJiAoZyA9ICEwLCBiLnNlbmQoYSwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKG5ldyBQKG4uX2dlbmVyYXRlSUQpKSwgZi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpLCBmLmNhbGxiYWNrUmVnaXN0cnkuZXhlY3V0ZUFsbChmLnN0YXRlLCAhMCksIEoucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiLmlzSW52YWxpZChlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBiLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICExLCBKLmNsZWFyVGltZW91dChmLl9oYW5kc2hha2VUaW1lb3V0KSwgSi5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbCksIGkobmV3IGooZikpLCBKLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzKSwgZi5zZXRTdGF0ZUFuZFB1Ymxpc2godC5zdGF0ZSksIGYuY2FsbGJhY2tSZWdpc3RyeS5oYXNDYWxsYmFja3MoKSAmJiBvKEUuR0VUU1RBVEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gJiYgcG9zdE1lc3NhZ2UgPyAoSi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbCksIG8oRS5IQU5EU0hBS0UpLCBmLl9oYW5kc2hha2VUaW1lb3V0ID0gc2V0VGltZW91dChjLCAyNTApKSA6IGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSi5zX2NfaW4gfHwgKEouc19jX2lsID0gW10sIEouc19jX2luID0gMCksIGYuX2MgPSAnVmlzaXRvcicsIGYuX2lsID0gSi5zX2NfaWwsIGYuX2luID0gSi5zX2NfaW4sIGYuX2lsW2YuX2luXSA9IGYsIEouc19jX2luKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAhPT0gZS5pbmRleE9mKCdfJykgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbltlXSAmJiAoZltlXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZSksIGYuZ2V0U3VwcGxlbWVudGFsRGF0YUlEID0gbi5nZXRTdXBwbGVtZW50YWxEYXRhSUQsIGYuaXNBbGxvd2VkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHRoaXMsIG0gPSB0LndoaXRlbGlzdFBhcmVudERvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnN0YXRlID0geyBBTExGSUVMRFM6IHt9IH0sIGYudmVyc2lvbiA9IG4udmVyc2lvbiwgZi5tYXJrZXRpbmdDbG91ZE9yZ0lEID0gZSwgZi5jb29raWVEb21haW4gPSBuLmNvb2tpZURvbWFpbiB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9ICEoZi5faW5zdGFuY2VUeXBlID0gJ2NoaWxkJyksIGIgPSBuZXcgWShlLCBtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNhbGxiYWNrUmVnaXN0cnkgPSBWKCksIGYuaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCgpLCBwKCksIGkobmV3IHcoZikpLCB1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5maW5kRmllbGQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBmLnN0YXRlW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZi5zdGF0ZVtlXSksIGYuc3RhdGVbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZi5tZXNzYWdlUGFyZW50ID0gbywgZi5zZXRTdGF0ZUFuZFB1Ymxpc2ggPSByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgTSA9IHEuTUVTU0FHRVMsIEwgPSBxLkFMTF9BUElTLCBOID0gcS5BU1lOQ19BUElfTUFQLCB4ID0gcS5GSUVMREdST1VQX1RPX0ZJRUxELCBLID0gZnVuY3Rpb24gKGksIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoTCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBMW2VdLCBuID0gaVt0XSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRy5pc1ZhbHVlRW1wdHkobikgfHwgKGFbZV0gPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLl9sb2FkaW5nICYmIE9iamVjdC5rZXlzKGkuX2xvYWRpbmcpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLl9sb2FkaW5nW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB4W2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4ubGVuZ3RoID8gbiA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE5bZVswXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVt0XShhLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zZW5kKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbChlKSwgbihlLCBNLkhBTkRTSEFLRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oZSwgTS5QQVJFTlRTVEFURSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY2FsbChpLCBlKSwgYS5zZW5kKHQsIE0uUEFSRU5UU1RBVEUsIHsgQ1VTVE9NRVJJRFM6IGkuZ2V0Q3VzdG9tZXJJRHMoKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGkuc2V0Q3VzdG9tZXJJRHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0Q3VzdG9tZXJJRHMgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pc0ludmFsaWQoZSkgfHwgKGEucGFyc2UoZSkucHJlZml4ID09PSBNLkhBTkRTSEFLRSA/IG8gOiBjKShlLnNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFEgPSBmdW5jdGlvbiAoYSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbdF0gPSBlLCArK3MgPT09IG8gJiYgbihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgcyA9IDAsIG8gPSBPYmplY3Qua2V5cyhhKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQuYXJncyB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udW5zaGlmdChpKGUpKSwgdC5mbi5hcHBseSh0LmNvbnRleHQgfHwgbnVsbCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZW5jb2RlVVJJQ29tcG9uZW50KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICgnOycgKyBkb2N1bWVudC5jb29raWUpLnNwbGl0KCcgJykuam9pbignOycpLCBuID0gdC5pbmRleE9mKCc7JyArIGUgKyAnPScpLCBhID0gbiA8IDAgPyBuIDogdC5pbmRleE9mKCc7JywgbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA8IDAgPyAnJyA6IGRlY29kZVVSSUNvbXBvbmVudCh0LnN1YnN0cmluZyhuICsgMiArIGUubGVuZ3RoLCBhIDwgMCA/IHQubGVuZ3RoIDogYSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHAobiwgJ2Nvb2tpZUxpZmV0aW1lJyksIGkgPSBwKG4sICdleHBpcmVzJyksIHIgPSBwKG4sICdkb21haW4nKSwgcyA9IHAobiwgJ3NlY3VyZScpLCBvID0gcChuLCAnc2FtZVNpdGUnKSwgYyA9IHMgPyAnU2VjdXJlJyA6ICcnLCBsID0gbyA/ICdTYW1lU2l0ZT0nICsgbyArICc7JyA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSAmJiAnU0VTU0lPTicgIT09IGEgJiYgJ05PTkUnICE9PSBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9ICcnICE9PSB0ID8gcGFyc2VJbnQoYSB8fCAwLCAxMCkgOiAtNjA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IG5ldyBEYXRlKCkpLnNldFRpbWUoaS5nZXRUaW1lKCkgKyAxMDAwICogdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgxID09PSBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAoaSA9IG5ldyBEYXRlKCkpLmdldFllYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldFllYXIoZCArIDIgKyAoZCA8IDE5MDAgPyAxOTAwIDogMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnTk9ORScgIT09IGEgPyAoZG9jdW1lbnQuY29va2llID0gZW5jb2RlVVJJQ29tcG9uZW50KGUpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHQpICsgJzsgcGF0aD0vOycgKyAoaSA/ICcgZXhwaXJlcz0nICsgaS50b0dNVFN0cmluZygpICsgJzsnIDogJycpICsgKHIgPyAnIGRvbWFpbj0nICsgciArICc7JyA6ICcnKSArIGwgKyBjLCB0aGlzLmdldChlKSA9PT0gdCkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHAodCwgJ2RvbWFpbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiA/ICcgZG9tYWluPScgKyBuICsgJzsnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcCh0LCAnc2VjdXJlJyksIGkgPSBwKHQsICdzYW1lU2l0ZScpLCByID0gYSA/ICdTZWN1cmUnIDogJycsIHMgPSBpID8gJ1NhbWVTaXRlPScgKyBpICsgJzsnIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGVuY29kZVVSSUNvbXBvbmVudChlKSArICc9OyBQYXRoPS87IEV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQ7JyArIG4gKyBzICsgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBYID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZSAmJiBKLmxvY2F0aW9uICYmIChlID0gSi5sb2NhdGlvbi5ob3N0bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGEgPSBlLnNwbGl0KCcuJyksIGkgPSB0IHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IGEubGVuZ3RoIC0gMjsgMCA8PSBuOyBuLS0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmRvbWFpbiA9IGEuc2xpY2Uobikuam9pbignLicpLCAkLnNldCgndGVzdCcsICdjb29raWUnLCBpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLnJlbW92ZSgndGVzdCcsIGkpLCBpLmRvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBaID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNMZXNzVGhhbjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSwgdCkgPCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlVmVyc2lvbnNEaWZmZXJlbnQ6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9PSBuKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcmVhdGVyVGhhbjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCBuKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFcXVhbDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IG4oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUiA9ICEhSi5wb3N0TWVzc2FnZSwgZWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiAoUiA/IG4ucG9zdE1lc3NhZ2UoZSwgdC5yZXBsYWNlKC8oW146XSs6XC9cL1teXC9dKykuKi8sICckMScpKSA6IHQgJiYgKG4ubG9jYXRpb24gPSB0LnJlcGxhY2UoLyMuKiQvLCAnJykgKyAnIycgKyArbmV3IERhdGUoKSArIGErKyArICcmJyArIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVNZXNzYWdlOiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgJiYgKHQgJiYgKGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgbiAmJiBlLm9yaWdpbiAhPT0gbiB8fCAnW29iamVjdCBGdW5jdGlvbl0nID09PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikgJiYgITEgPT09IG4oZS5vcmlnaW4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBKLmFkZEV2ZW50TGlzdGVuZXIgPyBKW3QgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lciddKCdtZXNzYWdlJywgZSkgOiBKW3QgPyAnYXR0YWNoRXZlbnQnIDogJ2RldGFjaEV2ZW50J10oJ29ubWVzc2FnZScsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBhID0gJzAxMjM0NTY3ODknLCBpID0gJycsIHIgPSAnJywgcyA9IDgsIG8gPSAxMCwgYyA9IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhICs9ICdBQkNERUYnLCB0ID0gMDsgdCA8IDE2OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcyksIGkgKz0gYS5zdWJzdHJpbmcobiwgbiArIDEpLCBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcyksIHIgKz0gYS5zdWJzdHJpbmcobiwgbiArIDEpLCBzID0gMTY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICsgJy0nICsgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IDE5OyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBvKSwgaSArPSBhLnN1YnN0cmluZyhuLCBuICsgMSksIDAgPT09IHQgJiYgOSA9PSBuID8gbyA9IDMgOiAoMSA9PSB0IHx8IDIgPT0gdCkgJiYgMTAgIT0gbyAmJiBuIDwgMiA/IG8gPSAxMCA6IDIgPCB0ICYmIChvID0gMTApLCBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYyksIHIgKz0gYS5zdWJzdHJpbmcobiwgbiArIDEpLCAwID09PSB0ICYmIDkgPT0gbiA/IGMgPSAzIDogKDEgPT0gdCB8fCAyID09IHQpICYmIDEwICE9IGMgJiYgbiA8IDIgPyBjID0gMTAgOiAyIDwgdCAmJiAoYyA9IDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSArIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9mOTlkMmY5YTFmMGEyNDI4ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfZTMzZTZlMWRiNTgyNzRlMyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2Y5OWQyZjlhMWYwYTI0MjgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19kZTYwNjVlNTRkOGIwMTg2LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2UzM2U2ZTFkYjU4Mjc0ZTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19kZTYwNjVlNTRkOGIwMTg2LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNNZXRhZGF0YTogKGUgPSAnbm9uZScsIHQgPSAhMCwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFhNTEh0dHBSZXF1ZXN0ICYmIFhNTEh0dHBSZXF1ZXN0ID09PSBPYmplY3QoWE1MSHR0cFJlcXVlc3QpICYmICgnd2l0aENyZWRlbnRpYWxzJyBpbiBuZXcgWE1MSHR0cFJlcXVlc3QoKSA/IGUgPSAnWE1MSHR0cFJlcXVlc3QnIDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFhEb21haW5SZXF1ZXN0ICYmIFhEb21haW5SZXF1ZXN0ID09PSBPYmplY3QoWERvbWFpblJlcXVlc3QpICYmICh0ID0gITEpLCAwIDwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKEouSFRNTEVsZW1lbnQpLmluZGV4T2YoJ0NvbnN0cnVjdG9yJykgJiYgKHQgPSAhMSkpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNUeXBlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JzQ29va2llc0VuYWJsZWQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDT1JTSW5zdGFuY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgJF9fX29sZF9lYmVlOTAwNmNjYjczNmE4ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JyksICRfX19vbGRfZDE5MDIzYTYyYWU2OTI1NyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZWJlZTkwMDZjY2I3MzZhOCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19kZTYwNjVlNTRkOGIwMTg2LlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9kMTkwMjNhNjJhZTY5MjU3KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19tb2NrX2RlNjA2NWU1NGQ4YjAxODYuWE1MSHR0cFJlcXVlc3QpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdub25lJyA9PT0gdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGUgPyBudWxsIDogbmV3IEpbdGhpcy5jb3JzTWV0YWRhdGEuY29yc1R5cGVdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9lYmVlOTAwNmNjYjczNmE4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfZWJlZTkwMDZjY2I3MzZhOCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZDE5MDIzYTYyYWU2OTI1NykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkX2QxOTAyM2E2MmFlNjkyNTcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUNPUlM6IGZ1bmN0aW9uIChyLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodCA9IEpTT04ucGFyc2UoZSkpICE9PSBPYmplY3QodCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHMuaGFuZGxlQ09SU0Vycm9yKHIsIG51bGwsICdSZXNwb25zZSBpcyBub3QgSlNPTicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHMuaGFuZGxlQ09SU0Vycm9yKHIsIGUsICdFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGFzIEpTT04nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHIuY2FsbGJhY2ssIGEgPSBKLCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhW25baV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oYW5kbGVDT1JTRXJyb3IociwgZSwgJ0Vycm9yIGZvcm1pbmcgY2FsbGJhY2sgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKHIubG9hZEVycm9ySGFuZGxlciA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLmdldENPUlNJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5vcGVuKCdnZXQnLCByLmNvcnNVcmwgKyAnJnRzPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgITApLCAnWE1MSHR0cFJlcXVlc3QnID09PSB0aGlzLmNvcnNNZXRhZGF0YS5jb3JzVHlwZSAmJiAobi53aXRoQ3JlZGVudGlhbHMgPSAhMCwgbi50aW1lb3V0ID0gYS5sb2FkVGltZW91dCwgbi5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyksIG4ub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgPT09IHRoaXMucmVhZHlTdGF0ZSAmJiAyMDAgPT09IHRoaXMuc3RhdHVzICYmIHQodGhpcy5yZXNwb25zZVRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4ub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5oYW5kbGVDT1JTRXJyb3IociwgZSwgJ29uZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4ub250aW1lb3V0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmhhbmRsZUNPUlNFcnJvcihyLCBlLCAnb250aW1lb3V0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuLnNlbmQoKSwgYS5fbG9nLnJlcXVlc3RzLnB1c2goci5jb3JzVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDT1JTRXJyb3IociwgYSwgJ3RyeS1jYXRjaCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDT1JTRXJyb3I6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuQ09SU0Vycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNEYXRhOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZS5sb2FkRXJyb3JIYW5kbGVyICYmICgnb250aW1lb3V0JyA9PT0gbiA/IGUubG9hZEVycm9ySGFuZGxlcighMCkgOiBlLmxvYWRFcnJvckhhbmRsZXIoITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9mOTlkMmY5YTFmMGEyNDI4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ1hNTEh0dHBSZXF1ZXN0JywgJF9fX29sZF9mOTlkMmY5YTFmMGEyNDI4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkX2UzM2U2ZTFkYjU4Mjc0ZTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkX2UzM2U2ZTFkYjU4Mjc0ZTMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT1NUX01FU1NBR0VfRU5BQkxFRDogISFKLnBvc3RNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBWVNfQkVUV0VFTl9TWU5DX0lEX0NBTExTOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTExJU19QRVJfREFZOiA4NjQwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQzogJ2Fkb2JlX21jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRE9CRV9NQ19TRElEOiAnYWRvYmVfbWNfc2RpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMSURfVklTSVRPUl9JRF9SRUdFWDogL15bMC05YS1mQS1GXC1dKyQvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFET0JFX01DX1RUTF9JTl9NSU46IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSU0lPTl9SRUdFWDogL3ZWZXJzaW9uXHwoKFxkK1wuKT8oXGQrXC4pPyhcKnxcZCspKSg/PSR8XHwpLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVJTVF9QQVJUWV9TRVJWRVJfQ09PS0lFOiAnc19lY2lkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaWUgPSBmdW5jdGlvbiAobSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gSi5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJPVFRMRV9TVEFSVDogMzAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TWU5DU19MRU5HVEg6IDY0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3R0bGVUaW1lclNldDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VQaXhlbHM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVIb3N0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZnJhbWVIb3N0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF0gKyAnLy8nICsgdFsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZG9tYWluOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVybDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSAnaHR0cDovL2Zhc3QuJywgbiA9ICc/ZF9uc2lkPScgKyBtLmlkU3luY0NvbnRhaW5lcklEICsgJyMnICsgZW5jb2RlVVJJQ29tcG9uZW50KGkubG9jYXRpb24ub3JpZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YmRvbWFpbiB8fCAodGhpcy5zdWJkb21haW4gPSAnbm9zdWJkb21haW5yZXR1cm5lZCcpLCBtLmxvYWRTU0wgJiYgKHQgPSBtLmlkU3luY1NTTFVzZUFrYW1haSA/ICdodHRwczovL2Zhc3QuJyA6ICdodHRwczovLycpLCBlID0gdCArIHRoaXMuc3ViZG9tYWluICsgJy5kZW1kZXgubmV0L2Rlc3Q1Lmh0bWwnICsgbiwgdGhpcy5pZnJhbWVIb3N0ID0gdGhpcy5nZXRJZnJhbWVIb3N0KGUpLCB0aGlzLmlkID0gJ2Rlc3RpbmF0aW9uX3B1Ymxpc2hpbmdfaWZyYW1lXycgKyB0aGlzLnN1YmRvbWFpbiArICdfJyArIG0uaWRTeW5jQ29udGFpbmVySUQsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRFBJZnJhbWVTcmM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJz9kX25zaWQ9JyArIG0uaWRTeW5jQ29udGFpbmVySUQgKyAnIycgKyBlbmNvZGVVUklDb21wb25lbnQoaS5sb2NhdGlvbi5ocmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiBtLmRwSWZyYW1lU3JjICYmIG0uZHBJZnJhbWVTcmMubGVuZ3RoICYmICh0aGlzLmlkID0gJ2Rlc3RpbmF0aW9uX3B1Ymxpc2hpbmdfaWZyYW1lXycgKyAobS5fc3ViZG9tYWluIHx8IHRoaXMuc3ViZG9tYWluIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSArICdfJyArIG0uaWRTeW5jQ29udGFpbmVySUQsIHRoaXMuaWZyYW1lSG9zdCA9IHRoaXMuZ2V0SWZyYW1lSG9zdChtLmRwSWZyYW1lU3JjKSwgdGhpcy51cmwgPSBtLmRwSWZyYW1lU3JjICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkQ2FsbE5vdFByb2Nlc3NzZWQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvQXR0YWNoSWZyYW1lOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0dGFjaGluZ0lmcmFtZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUhhc0xvYWRlZDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lSWRDaGFuZ2VkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJZnJhbWVDcmVhdGVkOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbElmcmFtZUhhc0xvYWRlZEFscmVhZHk6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZUxvYWRlZENhbGxiYWNrczogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNoYW5nZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc1JlZ2lvbkNoYW5nZWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRpbmdNZXNzYWdlczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNQb3N0ZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1JlY2VpdmVkOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVNlbmRpbmdJbnRlcnZhbDogYWUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgPyBudWxsIDogMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblBhZ2VEZXN0aW5hdGlvbnNGaXJlZDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25Gb3JDb21wYXJpc29uOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbkR1cGxpY2F0ZXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uV2FpdGluZzogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25Qcm9jZXNzZWQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5TZXRUaGlyZFBhcnR5Q29va2llczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkVGhpcmRQYXJ0eUNvb2tpZXNOb3RpZmljYXRpb246ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeVRvQXR0YWNoSWZyYW1lUHJlbGltaW5hcnk6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKG0uaWRTeW5jRGlzYWJsZVN5bmNzIHx8IG0uZGlzYWJsZUlkU3luY3MgfHwgbS5pZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nIHx8IG0uZGlzYWJsZVRoaXJkUGFydHlDb29raWVzIHx8IG0uZGlzYWJsZVRoaXJkUGFydHlDYWxscyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5VG9BdHRhY2hJZnJhbWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeSgpICYmICh0aGlzLmRvQXR0YWNoSWZyYW1lIHx8IG0uX2RvQXR0YWNoSWZyYW1lKSAmJiAodGhpcy5zdWJkb21haW4gJiYgJ25vc3ViZG9tYWlucmV0dXJuZWQnICE9PSB0aGlzLnN1YmRvbWFpbiB8fCBtLl9zdWJkb21haW4pICYmIHRoaXMudXJsICYmICF0aGlzLnN0YXJ0ZWRBdHRhY2hpbmdJZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaElmcmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9IGkuY3JlYXRlRWxlbWVudCgnaWZyYW1lJykpLnNhbmRib3ggPSAnYWxsb3ctc2NyaXB0cyBhbGxvdy1zYW1lLW9yaWdpbicsIGEudGl0bGUgPSAnQWRvYmUgSUQgU3luY2luZyBpRnJhbWUnLCBhLmlkID0gbi5pZCwgYS5uYW1lID0gbi5pZCArICdfbmFtZScsIGEuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBub25lOyB3aWR0aDogMDsgaGVpZ2h0OiAwOycsIGEuc3JjID0gbi51cmwsIG4ubmV3SWZyYW1lQ3JlYXRlZCA9ICEwLCB0KCksIGkuYm9keS5hcHBlbmRDaGlsZChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jbGFzc05hbWUgPSAnYWFtSWZyYW1lTG9hZGVkJywgbi5pZnJhbWVIYXNMb2FkZWQgPSAhMCwgbi5maXJlSWZyYW1lTG9hZGVkQ2FsbGJhY2tzKGUpLCBuLnJlcXVlc3RUb1Byb2Nlc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRlZEF0dGFjaGluZ0lmcmFtZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCBhID0gaS5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPyAnSUZSQU1FJyAhPT0gYS5ub2RlTmFtZSA/ICh0aGlzLmlkICs9ICdfMicsIHRoaXMuaWZyYW1lSWRDaGFuZ2VkID0gITAsIGUoKSkgOiAodGhpcy5uZXdJZnJhbWVDcmVhdGVkID0gITEsICdhYW1JZnJhbWVMb2FkZWQnICE9PSBhLmNsYXNzTmFtZSA/ICh0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeSA9ICExLCB0KCdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgYWxyZWFkeSBleGlzdHMgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LCBidXQgaGFkblwndCBsb2FkZWQgeWV0LicpKSA6ICh0aGlzLm9yaWdpbmFsSWZyYW1lSGFzTG9hZGVkQWxyZWFkeSA9ICEwLCB0aGlzLmlmcmFtZUhhc0xvYWRlZCA9ICEwLCB0aGlzLmlmcmFtZSA9IGEsIHRoaXMuZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrcygnVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGFscmVhZHkgZXhpc3RzIGZyb20gYSBkaWZmZXJlbnQgbGlicmFyeSwgYW5kIGhhZCBsb2FkZWQgYWxyZXNhZHkuJyksIHRoaXMucmVxdWVzdFRvUHJvY2VzcygpKSkgOiBlKCksIHRoaXMuaWZyYW1lID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyZUlmcmFtZUxvYWRlZENhbGxiYWNrczogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlICYmIGUoeyBtZXNzYWdlOiB0IHx8ICdUaGUgZGVzdGluYXRpb24gcHVibGlzaGluZyBpZnJhbWUgd2FzIGF0dGFjaGVkIGFuZCBsb2FkZWQgc3VjY2Vzc2Z1bGx5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5pZnJhbWVMb2FkZWRDYWxsYmFja3MgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRvUHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5qc29uRm9yQ29tcGFyaXNvbi5wdXNoKGUpLCBhLmpzb25XYWl0aW5nLnB1c2goZSksIGEucHJvY2Vzc1N5bmNPblBhZ2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgYSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gT2JqZWN0KGUpICYmIGUuaWJzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gSlNPTi5zdHJpbmdpZnkoZS5pYnMgfHwgW10pLCB0aGlzLmpzb25Gb3JDb21wYXJpc29uLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgciwgcywgbyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCByID0gdGhpcy5qc29uRm9yQ29tcGFyaXNvbi5sZW5ndGg7IGkgPCByOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9IHRoaXMuanNvbkZvckNvbXBhcmlzb25baV0sIG4gPT09IEpTT04uc3RyaW5naWZ5KHMuaWJzIHx8IFtdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA/IHRoaXMuanNvbkR1cGxpY2F0ZXMucHVzaChlKSA6IHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLnJlY2VpdmVkVGhpcmRQYXJ0eUNvb2tpZXNOb3RpZmljYXRpb24gfHwgIWFlLlBPU1RfTUVTU0FHRV9FTkFCTEVEIHx8IHRoaXMuaWZyYW1lSGFzTG9hZGVkKSAmJiB0aGlzLmpzb25XYWl0aW5nLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gdGhpcy5qc29uV2FpdGluZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcyhjKSwgdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmlkU3luY0Rpc2FibGVTeW5jcyB8fCBtLmRpc2FibGVJZFN5bmNzIHx8ICF0aGlzLmlmcmFtZUhhc0xvYWRlZCB8fCAhdGhpcy5tZXNzYWdlcy5sZW5ndGggfHwgdGhpcy5zZW5kaW5nTWVzc2FnZXMgfHwgKHRoaXMudGhyb3R0bGVUaW1lclNldCB8fCAodGhpcy50aHJvdHRsZVRpbWVyU2V0ID0gITAsIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubWVzc2FnZVNlbmRpbmdJbnRlcnZhbCA9IGFlLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gbnVsbCA6IDE1MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuVEhST1RUTEVfU1RBUlQpKSwgdGhpcy5zZW5kaW5nTWVzc2FnZXMgPSAhMCwgdGhpcy5zZW5kTWVzc2FnZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZ2lvbkFuZENoZWNrSWZDaGFuZ2VkOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBtLl9nZXRGaWVsZCgnTUNBQU1MSCcpLCBhID0gZS5kX3JlZ2lvbiB8fCBlLmRjc19yZWdpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IGEgJiYgKG0uX3NldEZpZWxkRXhwaXJlKCdNQ0FBTUxIJywgdCksIG0uX3NldEZpZWxkKCdNQ0FBTUxIJywgYSksIHBhcnNlSW50KG4sIDEwKSAhPT0gYSAmJiAodGhpcy5yZWdpb25DaGFuZ2VkID0gITAsIHRoaXMudGltZXNSZWdpb25DaGFuZ2VkKyssIG0uX3NldEZpZWxkKCdNQ1NZTkNTT1AnLCAnJyksIG0uX3NldEZpZWxkKCdNQ1NZTkNTJywgJycpLCBuID0gYSkpIDogKG4gPSBhKSAmJiAobS5fc2V0RmllbGRFeHBpcmUoJ01DQUFNTEgnLCB0KSwgbS5fc2V0RmllbGQoJ01DQUFNTEgnLCBuKSksIG4gfHwgKG4gPSAnJyksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NTeW5jT25QYWdlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGEsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBlLmlicykgJiYgdCBpbnN0YW5jZW9mIEFycmF5ICYmIChuID0gdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBuOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID0gdFthXSkuc3luY09uUGFnZSAmJiB0aGlzLmNoZWNrRmlyc3RQYXJ0eUNvb2tpZShpLCAnJywgJ3N5bmNPblBhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBhLCBpLCByLCBzID0gZW5jb2RlVVJJQ29tcG9uZW50LCBvID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQgPSBlLmlicykgJiYgdCBpbnN0YW5jZW9mIEFycmF5ICYmIChuID0gdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobyA9ICEwLCBhID0gMDsgYSA8IG47IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHRbYV0sIHIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKCdpYnMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoaS5pZCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKGkudGFnIHx8ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEcuZW5jb2RlQW5kQnVpbGRSZXF1ZXN0KGkudXJsIHx8IFtdLCAnLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhpLnR0bCB8fCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5maXJlVVJMU3luYyA/ICd0cnVlJyA6ICdmYWxzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaS5zeW5jT25QYWdlIHx8ICh0aGlzLmNhblNldFRoaXJkUGFydHlDb29raWVzID8gdGhpcy5hZGRNZXNzYWdlKHIuam9pbignfCcpKSA6IGkuZmlyZVVSTFN5bmMgJiYgdGhpcy5jaGVja0ZpcnN0UGFydHlDb29raWUoaSwgci5qb2luKCd8JykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgdGhpcy5qc29uUHJvY2Vzc2VkLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRmlyc3RQYXJ0eUNvb2tpZTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJ3N5bmNPblBhZ2UnID09PSBuLCBpID0gYSA/ICdNQ1NZTkNTT1AnIDogJ01DU1lOQ1MnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5fcmVhZFZpc2l0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBzLCBvID0gbS5fZ2V0RmllbGQoaSksIGMgPSAhMSwgbCA9ICExLCB1ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gYWUuTUlMTElTX1BFUl9EQVkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA/IChyID0gby5zcGxpdCgnKicpLCBjID0gKHMgPSB0aGlzLnBydW5lU3luY0RhdGEociwgZS5pZCwgdSkpLmRhdGFQcmVzZW50LCBsID0gcy5kYXRhVmFsaWQsIGMgJiYgbCB8fCB0aGlzLmZpcmVTeW5jKGEsIGUsIHQsIHIsIGksIHUpKSA6IChyID0gW10sIHRoaXMuZmlyZVN5bmMoYSwgZSwgdCwgciwgaSwgdSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcnVuZVN5bmNEYXRhOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGksIHIsIHMgPSAhMSwgbyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGVbaV0sIHIgPSBwYXJzZUludChhLnNwbGl0KCctJylbMV0sIDEwKSwgYS5tYXRjaCgnXicgKyB0ICsgJy0nKSA/IChzID0gITAsIG4gPCByID8gbyA9ICEwIDogKGUuc3BsaWNlKGksIDEpLCBpLS0pKSA6IHIgPD0gbiAmJiAoZS5zcGxpY2UoaSwgMSksIGktLSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQcmVzZW50OiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFWYWxpZDogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlU3luY3NTaXplOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuam9pbignKicpLmxlbmd0aCA+IHRoaXMuTUFYX1NZTkNTX0xFTkdUSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGUuc3BsaXQoJy0nKVsxXSwgMTApIC0gcGFyc2VJbnQodC5zcGxpdCgnLScpWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOyBlLmpvaW4oJyonKS5sZW5ndGggPiB0aGlzLk1BWF9TWU5DU19MRU5HVEg7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVTeW5jOiBmdW5jdGlvbiAoZSwgdCwgbiwgYSwgdSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2ltZycgPT09IHQudGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBzLCBvLCBjLCBsID0gdC51cmwsIHAgPSBtLmxvYWRTU0wgPyAnaHR0cHM6JyA6ICdodHRwOic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDAsIHMgPSBsLmxlbmd0aDsgciA8IHM7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGxbcl0sIGMgPSAvXlwvXC8vLnRlc3Qobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24gKHMsIG8sIGMsIGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm9uUGFnZVBpeGVsc1tzXSA9IG51bGwsIG0uX3JlYWRWaXNpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCBuLCBhLCBpID0gbS5fZ2V0RmllbGQodSksIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwLCBuID0gKGUgPSBpLnNwbGl0KCcqJykpLmxlbmd0aDsgdCA8IG47IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9IGVbdF0pLm1hdGNoKCdeJyArIG8uaWQgKyAnLScpIHx8IHIucHVzaChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zZXRTeW5jVHJhY2tpbmdEYXRhKHIsIG8sIGMsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHRoaXMub25QYWdlUGl4ZWxzLmxlbmd0aCwgdCwgdSwgaSkpLCBmLnNyYyA9IChjID8gcCA6ICcnKSArIG8sIHRoaXMub25QYWdlUGl4ZWxzLnB1c2goZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1lc3NhZ2UobiksIHRoaXMuc2V0U3luY1RyYWNraW5nRGF0YShhLCB0LCB1LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWVzc2FnZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZW5jb2RlVVJJQ29tcG9uZW50KG0uX2VuYWJsZUVycm9yUmVwb3J0aW5nID8gJy0tLWRlc3RwdWItZGVidWctLS0nIDogJy0tLWRlc3RwdWItLS0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZXMucHVzaCgoYWUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgPyAnJyA6IHQpICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN5bmNUcmFja2luZ0RhdGE6IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2godC5pZCArICctJyArIChhICsgTWF0aC5jZWlsKHQudHRsIC8gNjAgLyAyNCkpKSwgdGhpcy5tYW5hZ2VTeW5jc1NpemUoZSksIG0uX3NldEZpZWxkKG4sIGUuam9pbignKicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZE1lc3NhZ2VzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCA9IHRoaXMsIG4gPSAnJywgYSA9IGVuY29kZVVSSUNvbXBvbmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVnaW9uQ2hhbmdlZCAmJiAobiA9IGEoJy0tLWRlc3RwdWItY2xlYXItZGV4dHAtLS0nKSwgdGhpcy5yZWdpb25DaGFuZ2VkID0gITEpLCB0aGlzLm1lc3NhZ2VzLmxlbmd0aCA/IGFlLlBPU1RfTUVTU0FHRV9FTkFCTEVEID8gKGUgPSBuICsgYSgnLS0tZGVzdHB1Yi1jb21iaW5lZC0tLScpICsgdGhpcy5tZXNzYWdlcy5qb2luKCclMDEnKSwgdGhpcy5wb3N0TWVzc2FnZShlKSwgdGhpcy5tZXNzYWdlcyA9IFtdLCB0aGlzLnNlbmRpbmdNZXNzYWdlcyA9ICExKSA6IChlID0gdGhpcy5tZXNzYWdlcy5zaGlmdCgpLCB0aGlzLnBvc3RNZXNzYWdlKG4gKyBlKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZW5kTWVzc2FnZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMubWVzc2FnZVNlbmRpbmdJbnRlcnZhbCkpIDogdGhpcy5zZW5kaW5nTWVzc2FnZXMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZS5wb3N0TWVzc2FnZShlLCB0aGlzLnVybCwgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdyksIHRoaXMubWVzc2FnZXNQb3N0ZWQucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZU1lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IC9eLS0tZGVzdHB1Yi10by1wYXJlbnQtLS0vOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgbi50ZXN0KGUpICYmICgnY2FuU2V0VGhpcmRQYXJ0eUNvb2tpZXMnID09PSAodCA9IGUucmVwbGFjZShuLCAnJykuc3BsaXQoJ3wnKSlbMF0gJiYgKHRoaXMuY2FuU2V0VGhpcmRQYXJ0eUNvb2tpZXMgPSAndHJ1ZScgPT09IHRbMV0sIHRoaXMucmVjZWl2ZWRUaGlyZFBhcnR5Q29va2llc05vdGlmaWNhdGlvbiA9ICEwLCB0aGlzLnJlcXVlc3RUb1Byb2Nlc3MoKSksIHRoaXMubWVzc2FnZXNSZWNlaXZlZC5wdXNoKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0lEQ2FsbERhdGE6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0aGlzLnVybCB8fCBlLnN1YmRvbWFpbiAmJiAnbm9zdWJkb21haW5yZXR1cm5lZCcgPT09IHRoaXMuc3ViZG9tYWluKSAmJiAoJ3N0cmluZycgPT0gdHlwZW9mIG0uX3N1YmRvbWFpbiAmJiBtLl9zdWJkb21haW4ubGVuZ3RoID8gdGhpcy5zdWJkb21haW4gPSBtLl9zdWJkb21haW4gOiB0aGlzLnN1YmRvbWFpbiA9IGUuc3ViZG9tYWluIHx8ICcnLCB0aGlzLnVybCA9IHRoaXMuZ2V0VXJsKCkpLCBlLmlicyBpbnN0YW5jZW9mIEFycmF5ICYmIGUuaWJzLmxlbmd0aCAmJiAodGhpcy5kb0F0dGFjaElmcmFtZSA9ICEwKSwgdGhpcy5yZWFkeVRvQXR0YWNoSWZyYW1lKCkgJiYgKG0uaWRTeW5jQXR0YWNoSWZyYW1lT25XaW5kb3dMb2FkID8gKHQud2luZG93TG9hZGVkIHx8ICdjb21wbGV0ZScgPT09IGkucmVhZHlTdGF0ZSB8fCAnbG9hZGVkJyA9PT0gaS5yZWFkeVN0YXRlKSAmJiB0aGlzLmF0dGFjaElmcmFtZSgpIDogdGhpcy5hdHRhY2hJZnJhbWVBU0FQKCkpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBtLmlkU3luY0lEQ2FsbFJlc3VsdCA/IG0uaWRTeW5jSURDYWxsUmVzdWx0KGUpIDogdGhpcy5yZXF1ZXN0VG9Qcm9jZXNzKGUpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBtLmlkU3luY0FmdGVySURDYWxsUmVzdWx0ICYmIG0uaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbk1ha2VTeW5jSURDYWxsOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0uX2ZvcmNlU3luY0lEQ2FsbCB8fCAhZSB8fCB0IC0gZSA+IGFlLkRBWVNfQkVUV0VFTl9TWU5DX0lEX0NBTExTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hJZnJhbWVBU0FQOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc3RhcnRlZEF0dGFjaGluZ0lmcmFtZSB8fCAoaS5ib2R5ID8gdC5hdHRhY2hJZnJhbWUoKSA6IHNldFRpbWVvdXQoZSwgMzApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBGID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGllbmNlTWFuYWdlclNlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVEb21haW46IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpZmV0aW1lOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVOYW1lOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzT3B0SW5BcHBseTogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVGhpcmRQYXJ0eUNhbGxzOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFja2luZ1NlcnZlckVDSUQ6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jQWZ0ZXJJRENhbGxSZXN1bHQ6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkU3luY0F0dGFjaElmcmFtZU9uV2luZG93TG9hZDogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFN5bmNDb250YWluZXJJRDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jRGlzYWJsZTNyZFBhcnR5U3luY2luZzogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlVGhpcmRQYXJ0eUNvb2tpZXM6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jRGlzYWJsZVN5bmNzOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVJZFN5bmNzOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkU3luY0lEQ2FsbFJlc3VsdDoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRTeW5jU1NMVXNlQWthbWFpOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29vcFNhZmU6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJYWJDb250ZXh0OiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3B0SW5TdG9yYWdlRW5hYmxlZDogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkU1NMOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRUaW1lb3V0OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdDbG91ZFNlcnZlcjoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nQ2xvdWRTZXJ2ZXJTZWN1cmU6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdEluQ29va2llRG9tYWluOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRJblN0b3JhZ2VFeHBpcnk6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZUNyb3NzRG9tYWluTUNJREFuZEFJRDogeyB0eXBlOiAnYm9vbGVhbicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVPcHRJbkFwcHJvdmFsczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNQZXJtaXNzaW9uczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRCZWZvcmVWZXJzaW9uOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGlkUGFyYW1FeHBpcnk6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclN0YXRlOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uQ29va2llTmFtZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlQ29va2llOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVTaXRlQ29va2llOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVGltZW91dE1ldHJpY3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmVyOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1NlcnZlclNlY3VyZToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiB7IHR5cGU6ICdib29sZWFuJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdElmcmFtZURvbWFpbnM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlbGlzdFBhcmVudERvbWFpbjoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnTmFtZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKEYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZUNvbmZpZzogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZbZV0gJiYgJ2Jvb2xlYW4nID09PSBGW2VdLnR5cGUgPyAnZnVuY3Rpb24nICE9IHR5cGVvZiB0ID8gdCA6IHQoKSA6IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgVSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5vbiA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbT05dIENhbGxiYWNrIHNob3VsZCBiZSBhIGZ1bmN0aW9uLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc093blByb3BlcnR5KGUpIHx8IChpW2VdID0gW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGlbZV0ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtlXS5zcGxpY2UoYSwgMSksIGlbZV0ubGVuZ3RoIHx8IGRlbGV0ZSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUub2ZmID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAoaVtlXSA9IGlbZV0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jYWxsYmFjayAhPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUucHVibGlzaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmhhc093blByb3BlcnR5KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbZV0uc2xpY2UoMCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbGJhY2suYXBwbHkoZS5jb250ZXh0LCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wdWJsaXNoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRU5ESU5HOiAncGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFRDogJ2NoYW5nZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVRFOiAnY29tcGxldGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB6ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBTTogJ2FhbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURDTE9VRDogJ2FkY2xvdWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOQUxZVElDUzogJ2FhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1QQUlHTjogJ2NhbXBhaWduJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0lEOiAnZWNpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElWRUZZUkU6ICdsaXZlZnlyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFSR0VUOiAndGFyZ2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9BTkFMWVRJQ1M6ICdtZWRpYWFhJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmUgPSAoZShiID0ge30sIHouQUFNLCA1NjUpLCBlKGIsIHouRUNJRCwgNTY1KSwgYiksIHNlID0gKGUodiA9IHt9LCB6LkFBTSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlKHYsIHouRUNJRCwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCB2KSwgb2UgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvYWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpYWJDb25zZW50SGFzaCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGNlID0gKGggPSB6LCBPYmplY3Qua2V5cyhoKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYWxsYmFja3MgPSBPYmplY3QuY3JlYXRlKG51bGwpLCBhLmFkZCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYyh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW2NhbGxiYWNrUmVnaXN0cnlGYWN0b3J5XSBNYWtlIHN1cmUgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiBvciBhbiBhcnJheSBvZiBmdW5jdGlvbnMuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuY2FsbGJhY2tzW2VdID0gYS5jYWxsYmFja3NbZV0gfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYS5jYWxsYmFja3NbZV0ucHVzaCh0KSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmNhbGxiYWNrc1tlXS5zcGxpY2UobiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5leGVjdXRlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuY2FsbGJhY2tzW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPSB2b2lkIDAgPT09IHQgPyBbXSA6IHQpIGluc3RhbmNlb2YgQXJyYXkgPyB0IDogW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYS5jYWxsYmFja3NbZV0ubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGEuY2FsbGJhY2tzW2VdLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIG4gPyBuLmFwcGx5KG51bGwsIHQpIDogbiBpbnN0YW5jZW9mIEFycmF5ICYmIG5bMV0uYXBwbHkoblswXSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhLmNhbGxiYWNrc1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEuZXhlY3V0ZUFsbCA9IGZ1bmN0aW9uIChuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIHx8IG4gJiYgIW8obikpICYmIE9iamVjdC5rZXlzKGEuY2FsbGJhY2tzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHZvaWQgMCAhPT0gbltlXSA/IG5bZV0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZXhlY3V0ZShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS5oYXNDYWxsYmFja3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKE9iamVjdC5rZXlzKGEuY2FsbGJhY2tzKS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB1ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGRlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdy5jb25zb2xlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXQgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHBlID0gZnVuY3Rpb24gKGEsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSgpID8gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGUoYSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCB0ID0gbmV3IEFycmF5KGUpLCBuID0gMDsgbiA8IGU7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W25dID0gYXJndW1lbnRzW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZVthXS5hcHBseShjb25zb2xlLCBbaV0uY29uY2F0KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZlID0gYSwgbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IFtdLCBlID0gMDsgZSA8IDI1NjsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBlLCBuID0gMDsgbiA8IDg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAxICYgdCA/IDM5ODgyOTIzODQgXiB0ID4+PiAxIDogdCA+Pj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSksIHQgfHwgKHQgPSAwKSwgdCBePSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgbisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IDI1NSAmICh0IF4gZS5jaGFyQ29kZUF0KG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0ID4+PiA4IF4gaVthXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHQgXj0gLTEpID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIGdlID0gbmV3IGZlKCdbQURPQkUgT1BULUlOXScpLCBiZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFcoZSkgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheSA/IGUgOiBiZShlLCAnc3RyaW5nJykgPyBbZV0gOiB0IHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaGUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gT2JqZWN0LmtleXModCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZS5sZW5ndGggJiYgZS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB5ZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IHQgJiYgYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlIHx8IFNlKGUpKSAmJiB2ZShlKS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPCBjZS5pbmRleE9mKGUpIHx8IG4gJiYgLTEgPCBvZS5pbmRleE9mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgX2UgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IG4sIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgUGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFNlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXldJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpICYmICFlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIENlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGtlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBlIHx8IChEZShlKSA/IHllKE9iamVjdC5rZXlzKGUpLCAhMCkgOiBqZShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBqZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlICYmIGJlKGUsICdzdHJpbmcnKSAmJiB5ZShPYmplY3Qua2V5cyh0KSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIERlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZSAmJiBiZShlLCAnb2JqZWN0JykgJiYgITEgPT09IEFycmF5LmlzQXJyYXkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmUoZSwgJ2Z1bmN0aW9uJykgPyBlKCkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSWUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlKGUpIHx8IGdlLmVycm9yKCcnLmNvbmNhdCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBUZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEVlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGUoZSkuZmlsdGVyKGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmluZGV4T2YoZSkgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBPZSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gYXJndW1lbnRzWzBdIDoge30sIG4gPSB0LmNvbW1hbmQsIGEgPSB0LnBhcmFtcywgaSA9IHZvaWQgMCA9PT0gYSA/IHt9IDogYSwgciA9IHQuY2FsbGJhY2ssIHMgPSB2b2lkIDAgPT09IHIgPyB3ZSA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiB8fCAtMSA9PT0gbi5pbmRleE9mKCcuJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tPcHRJbi5leGVjdXRlXSBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGNvbW1hbmQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG4uc3BsaXQoJy4nKSwgYyA9IGRbb1swXV0sIGwgPSBvWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjIHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIGNbbF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWtlIHN1cmUgdGhlIHBsdWdpbiBhbmQgQVBJIG5hbWUgZXhpc3QuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IE9iamVjdC5hc3NpZ24oaSwgeyBjYWxsYmFjazogcyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbbF0uY2FsbChjLCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2UuZXJyb3IoJ1tleGVjdXRlXSBTb21ldGhpbmcgd2VudCB3cm9uZzogJyArIGQubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksIGwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEFlID0gJ2ZldGNoUGVybWlzc2lvbnMnLCBNZSA9ICdbT3B0SW4jcmVnaXN0ZXJQbHVnaW5dIFBsdWdpbiBpcyBpbnZhbGlkLic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuQ2F0ZWdvcmllcyA9IHosIHUuVGltZW91dEVycm9yID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIExlID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0SW46IHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWFiUGx1Z2luOiBnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgTmUgPSBmdW5jdGlvbiAoZCwgcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVibGlzaERlc3RpbmF0aW9ucyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdCwgaSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaSA/IGkgOiBlLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLnJlYWR5VG9BdHRhY2hJZnJhbWVQcmVsaW1pbmFyeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdzdWJkb21haW4gaXMgbm90IGEgcG9wdWxhdGVkIHN0cmluZy4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgaW5zdGFuY2VvZiBBcnJheSAmJiBhLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkoeyBlcnJvcjogJ21lc3NhZ2VzIGlzIG5vdCBhIHBvcHVsYXRlZCBhcnJheS4nIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgZS5sZW5ndGggJiYgKHIuYWRkTWVzc2FnZShlKSwgcyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksICFzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdOb25lIG9mIHRoZSBtZXNzYWdlcyBhcmUgcG9wdWxhdGVkIHN0cmluZ3MuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHLmlzT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdJbnZhbGlkIHBhcmFtZXRlcnMgcGFzc2VkLicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgKGUgPSBvLnN1YmRvbWFpbikgfHwgIWUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBpKHsgZXJyb3I6ICdjb25maWcuc3ViZG9tYWluIGlzIG5vdCBhIHBvcHVsYXRlZCBzdHJpbmcuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG8udXJsRGVzdGluYXRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBBcnJheSAmJiBjLmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGkoeyBlcnJvcjogJ2NvbmZpZy51cmxEZXN0aW5hdGlvbnMgaXMgbm90IGEgcG9wdWxhdGVkIGFycmF5LicgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRy5pc09iamVjdChlKSAmJiAoZS5oaWRlUmVmZXJyZXIgPyBlLm1lc3NhZ2UgJiYgci5hZGRNZXNzYWdlKGUubWVzc2FnZSkgOiBsLnB1c2goZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLmxlbmd0aCAmJiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IEltYWdlKCksIHQgPSBsLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnNyYyA9IHQudXJsLCByLm9uUGFnZURlc3RpbmF0aW9uc0ZpcmVkLnB1c2godCksIHUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmlmcmFtZSA/IChpKHsgbWVzc2FnZTogJ1RoZSBkZXN0aW5hdGlvbiBwdWJsaXNoaW5nIGlmcmFtZSBpcyBhbHJlYWR5IGF0dGFjaGVkIGFuZCBsb2FkZWQuJyB9KSwgci5yZXF1ZXN0VG9Qcm9jZXNzKCkpIDogIWQuc3ViZG9tYWluICYmIGQuX2dldEZpZWxkKCdNQ01JRCcpID8gKHIuc3ViZG9tYWluID0gZSwgci5kb0F0dGFjaElmcmFtZSA9ICEwLCByLnVybCA9IHIuZ2V0VXJsKCksIHIucmVhZHlUb0F0dGFjaElmcmFtZSgpID8gKHIuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHsgbWVzc2FnZTogJ0F0dGVtcHRlZCB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4gUmVzdWx0OiAnICsgKGUubWVzc2FnZSB8fCAnbm8gcmVzdWx0JykgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5hdHRhY2hJZnJhbWUoKSkgOiBpKHsgZXJyb3I6ICdFbmNvdW50ZXJlZCBhIHByb2JsZW0gaW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggdGhpcyBBUEkgY2FsbC4nIH0pKSA6IHIuaWZyYW1lTG9hZGVkQ2FsbGJhY2tzLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKHsgbWVzc2FnZTogJ0F0dGVtcHRlZCB0byBhdHRhY2ggYW5kIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIHRocm91Z2ggbm9ybWFsIFZpc2l0b3IgQVBJIHByb2Nlc3NpbmcuIFJlc3VsdDogJyArIChlLm1lc3NhZ2UgfHwgJ25vIHJlc3VsdCcpIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSh7IGVycm9yOiAnVGhlIGRlc3RpbmF0aW9uIHB1Ymxpc2hpbmcgaWZyYW1lIGlzIGRpc2FibGVkIGluIHRoZSBWaXNpdG9yIGxpYnJhcnkuJyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeGUgPSBmdW5jdGlvbiBXKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPj4+IHQgfCBlIDw8IDMyIC0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgYSwgaSA9IE1hdGgucG93LCByID0gaSgyLCAzMiksIHMgPSAnJywgbyA9IFtdLCBjID0gOCAqIGUubGVuZ3RoLCBsID0gVy5oID0gVy5oIHx8IFtdLCB1ID0gVy5rID0gVy5rIHx8IFtdLCBkID0gdS5sZW5ndGgsIHAgPSB7fSwgZiA9IDI7IGQgPCA2NDsgZisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBbZl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCAzMTM7IG4gKz0gZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwW25dID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxbZF0gPSBpKGYsIDAuNSkgKiByIHwgMCwgdVtkKytdID0gaShmLCAxIC8gMykgKiByIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSArPSAnXHg4MCc7IGUubGVuZ3RoICUgNjQgLSA1NjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPSBlLmNoYXJDb2RlQXQobikpID4+IDgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bbiA+PiAyXSB8PSBhIDw8ICgzIC0gbikgJSA0ICogODsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChvW28ubGVuZ3RoXSA9IGMgLyByIHwgMCwgb1tvLmxlbmd0aF0gPSBjLCBhID0gMDsgYSA8IG8ubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IG8uc2xpY2UoYSwgYSArPSAxNiksIGcgPSBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSBsLnNsaWNlKDAsIDgpLCBuID0gMDsgbiA8IDY0OyBuKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gbVtuIC0gMTVdLCB2ID0gbVtuIC0gMl0sIGggPSBsWzBdLCB5ID0gbFs0XSwgXyA9IGxbN10gKyAodCh5LCA2KSBeIHQoeSwgMTEpIF4gdCh5LCAyNSkpICsgKHkgJiBsWzVdIF4gfnkgJiBsWzZdKSArIHVbbl0gKyAobVtuXSA9IG4gPCAxNiA/IG1bbl0gOiBtW24gLSAxNl0gKyAodChiLCA3KSBeIHQoYiwgMTgpIF4gYiA+Pj4gMykgKyBtW24gLSA3XSArICh0KHYsIDE3KSBeIHQodiwgMTkpIF4gdiA+Pj4gMTApIHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCA9IFtfICsgKCh0KGgsIDIpIF4gdChoLCAxMykgXiB0KGgsIDIyKSkgKyAoaCAmIGxbMV0gXiBoICYgbFsyXSBeIGxbMV0gJiBsWzJdKSkgfCAwXS5jb25jYXQobCkpWzRdID0gbFs0XSArIF8gfCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCA4OyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsW25dID0gbFtuXSArIGdbbl0gfCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAzOyBhICsgMTsgYS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUCA9IGxbbl0gPj4gOCAqIGEgJiAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IChQIDwgMTYgPyAwIDogJycpICsgUC50b1N0cmluZygxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFJlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1NIQS0yNTYnICE9PSB0ICYmICdTSEEyNTYnICE9PSB0ICYmICdzaGEyNTYnICE9PSB0ICYmICdzaGEtMjU2JyAhPT0gdCB8fCAoZSA9IHhlKGUpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgQmUgPSBMZS5PcHRJbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRy5kZWZpbmVHbG9iYWxOYW1lc3BhY2UoKSwgd2luZG93LmFkb2JlLk9wdEluQ2F0ZWdvcmllcyA9IEJlLkNhdGVnb3JpZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBVZSA9IGZ1bmN0aW9uIChhLCBuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlIHx8IEMubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZXh0cmFjdFBhcmFtRnJvbVVyaSh0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCLnBhcnNlUGlwZURlbGltZXRlZEtleVZhbHVlcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUubWF0Y2goYWUuVkFMSURfVklTSVRPUl9JRF9SRUdFWCkgJiYgKG4gPT09IFYgJiYgKFMgPSAhMCksIHQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGVbVl0sIHYuc2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQsIFYpLCB2Ll9zZXRGaWVsZEV4cGlyZShBLCAtMSksIHQoZVtFXSwgdi5zZXRBbmFseXRpY3NWaXNpdG9ySUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwge30sIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgPSBlLnN1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQgfHwgJycsIHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCA9IGUuc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudENvbnN1bWVkIHx8IHt9LCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0ID0gZS5zdXBwbGVtZW50YWxEYXRhSURMYXN0IHx8ICcnLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgPSBlLnN1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSBuID8gbiArPSAnfCcgOiBuKSArIChlICsgJz0nKSArIGVuY29kZVVSSUNvbXBvbmVudCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdFswXSwgYSA9IHRbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGEgJiYgYSAhPT0gTSAmJiAoZSA9IGkobiwgYSwgZSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgYSA9IGUucmVkdWNlKHQsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG4gPSAobiA9IGEpID8gbiArPSAnfCcgOiBuKSArICdUUz0nICsgQi5nZXRUaW1lc3RhbXBJblNlY29uZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5taW51dGVzVG9MaXZlLCBuID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2LmlkU3luY0Rpc2FibGVTeW5jcyB8fCB2LmRpc2FibGVJZFN5bmNzKSAmJiAobiA9IG4gfHwgJ0Vycm9yOiBpZCBzeW5jcyBoYXZlIGJlZW4gZGlzYWJsZWQnKSwgJ3N0cmluZycgPT0gdHlwZW9mIGUuZHBpZCAmJiBlLmRwaWQubGVuZ3RoIHx8IChuID0gbiB8fCAnRXJyb3I6IGNvbmZpZy5kcGlkIGlzIGVtcHR5JyksICdzdHJpbmcnID09IHR5cGVvZiBlLnVybCAmJiBlLnVybC5sZW5ndGggfHwgKG4gPSBuIHx8ICdFcnJvcjogY29uZmlnLnVybCBpcyBlbXB0eScpLCB2b2lkIDAgPT09IHQgPyB0ID0gMjAxNjAgOiAodCA9IHBhcnNlSW50KHQsIDEwKSwgKGlzTmFOKHQpIHx8IHQgPD0gMCkgJiYgKG4gPSBuIHx8ICdFcnJvcjogY29uZmlnLm1pbnV0ZXNUb0xpdmUgbmVlZHMgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXInKSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCF2LmNvbmZpZ3MuZG9lc09wdEluQXBwbHkgfHwgaC5vcHRJbi5pc0NvbXBsZXRlICYmIGQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmNvbmZpZ3MuZG9lc09wdEluQXBwbHkgJiYgdi5jb25maWdzLmlzSWFiQ29udGV4dCA/IGgub3B0SW4uaXNBcHByb3ZlZChoLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgJiYgUCA6IGgub3B0SW4uaXNBcHByb3ZlZChoLm9wdEluLkNhdGVnb3JpZXMuRUNJRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydnZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0Q3VzdG9tZXJJRHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeW5jSWRlbnRpdHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QW5hbHl0aWNzVmlzaXRvcklEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0TG9jYXRpb25IaW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYiddCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZVswXSwgbiA9IDIgPT09IGUubGVuZ3RoID8gZVsxXSA6ICcnLCBhID0gdlt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlt0XSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCgpICYmIHYuaXNBbGxvd2VkKCkgPyBhLmFwcGx5KHYsIGFyZ3VtZW50cykgOiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSAmJiB2Ll9jYWxsQ2FsbGJhY2soZSwgW25dKSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgpLCB0ID0gZS51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2xvYWREYXRhKHcsIHQsIG51bGwsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAgPSAhMCwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSUFCIHBsdWdpbl0gOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LmdkcHJBcHBsaWVzICYmICh5ID0gdC5jb25zZW50U3RyaW5nLCBfID0gdC5oYXNDb25zZW50Q2hhbmdlZFNpbmNlTGFzdENtcFB1bGwgPyAxIDogMCksIHUoKSwgYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFAgPSAhMCwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSUFCIHBsdWdpbl0gOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZHByQXBwbGllcyAmJiAoeSA9IHQuY29uc2VudFN0cmluZywgXyA9IHQuaGFzQ29uc2VudENoYW5nZWRTaW5jZUxhc3RDbXBQdWxsID8gMSA6IDApLCB2LmluaXQoKSwgYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLm9wdEluLmlzQ29tcGxldGUgJiYgKGgub3B0SW4uaXNBcHByb3ZlZChoLm9wdEluLkNhdGVnb3JpZXMuRUNJRCkgPyB2LmNvbmZpZ3MuaXNJYWJDb250ZXh0ID8gaC5vcHRJbi5leGVjdXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogJ2lhYlBsdWdpbi5mZXRjaENvbnNlbnREYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IG0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICh2LmluaXQoKSwgYigpKSA6IHYuY29uZmlncy5pc0lhYkNvbnRleHQgPyBoLm9wdEluLmV4ZWN1dGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiAnaWFiUGx1Z2luLmZldGNoQ29uc2VudERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKGwoKSwgYigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgub3B0SW4ub2ZmKCdjb21wbGV0ZScsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8IGUuc3BsaXQoJycpLnJldmVyc2UoKS5qb2luKCcnKSAhPT0gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2UgYFZpc2l0b3IuZ2V0SW5zdGFuY2VgIHRvIGluc3RhbnRpYXRlIFZpc2l0b3IuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHRoaXMsIGggPSB3aW5kb3cuYWRvYmUsIHkgPSAnJywgXyA9IDAsIFAgPSAhMSwgUyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi52ZXJzaW9uID0gJzUuMi4wJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDID0gSiwgayA9IEMuVmlzaXRvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsudmVyc2lvbiA9IHYudmVyc2lvbiwgay5BdXRoU3RhdGUgPSBxLkFVVEhfU1RBVEUsIGsuT3B0T3V0ID0gcS5PUFRfT1VULCBDLnNfY19pbiB8fCAoQy5zX2NfaWwgPSBbXSwgQy5zX2NfaW4gPSAwKSwgdi5fYyA9ICdWaXNpdG9yJywgdi5faWwgPSBDLnNfY19pbCwgdi5faW4gPSBDLnNfY19pbiwgdi5faWxbdi5faW5dID0gdiwgQy5zX2NfaW4rKywgdi5faW5zdGFuY2VUeXBlID0gJ3JlZ3VsYXInLCB2Ll9sb2cgPSB7IHJlcXVlc3RzOiBbXSB9LCB2Lm1hcmtldGluZ0Nsb3VkT3JnSUQgPSBhLCB2LmNvb2tpZU5hbWUgPSAnQU1DVl8nICsgYSwgdi5zZXNzaW9uQ29va2llTmFtZSA9ICdBTUNWU18nICsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIG4uc2VjdXJlQ29va2llICYmIG4uc2FtZVNpdGVDb29raWUgJiYgKGogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZVNpdGU6IG4uc2FtZVNpdGVDb29raWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlOiBuLnNlY3VyZUNvb2tpZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHYuY29va2llRG9tYWluID0gdi51c2VMb2NhbFN0b3JhZ2UgPyAnJyA6IFgobnVsbCwgaiksIHYubG9hZFNTTCA9ICEwLCB2LmxvYWRUaW1lb3V0ID0gMzAwMDAsIHYuQ09SU0Vycm9ycyA9IFtdLCB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyID0gdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIgPSAnZHBtLmRlbWRleC5uZXQnLCB2LnNkaWRQYXJhbUV4cGlyeSA9IDMwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEQgPSBudWxsLCB3ID0gJ01DJywgViA9ICdNQ01JRCcsIEkgPSAnTUNJRFRTJywgVCA9ICdBJywgRSA9ICdNQ0FJRCcsIE8gPSAnQUFNJywgQSA9ICdNQ0FBTUInLCBNID0gJ05PTkUnLCBMID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3QucHJvdG90eXBlW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE4gPSBuZSh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuRklFTERTID0gcS5GSUVMRFMsIHYuY29va2llUmVhZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudXNlTG9jYWxTdG9yYWdlID8gZSA9PT0gdi5zZXNzaW9uQ29va2llTmFtZSA/IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkgOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKSA6ICQuZ2V0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5jb29raWVXcml0ZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAnJyArIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYudXNlTG9jYWxTdG9yYWdlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdi5zZXNzaW9uQ29va2llTmFtZSA/IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZSwgYSkgOiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHYuY29va2llTGlmZXRpbWUgPyAoJycgKyB2LmNvb2tpZUxpZmV0aW1lKS50b1VwcGVyQ2FzZSgpIDogJycsIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiB2LmNvb2tpZURvbWFpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZUxpZmV0aW1lOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuY29uZmlncyAmJiB2LmNvbmZpZ3Muc2VjdXJlQ29va2llICYmICdodHRwczonID09PSBsb2NhdGlvbi5wcm90b2NvbCAmJiAoci5zZWN1cmUgPSAhMCksIHYuY29uZmlncyAmJiB2LmNvbmZpZ3Muc2FtZVNpdGVDb29raWUgJiYgJ2h0dHBzOicgPT09IGxvY2F0aW9uLnByb3RvY29sICYmIChyLnNhbWVTaXRlID0gcS5TQU1FX1NJVEVfVkFMVUVTW3YuY29uZmlncy5zYW1lU2l0ZUNvb2tpZS50b1VwcGVyQ2FzZSgpXSB8fCAnTGF4JyksICQuc2V0KGUsIGEsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5yZW1vdmVDb29raWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LnVzZUxvY2FsU3RvcmFnZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHYuc2Vzc2lvbkNvb2tpZU5hbWUgPyBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpIDogbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7IGRvbWFpbjogdi5jb29raWVEb21haW4gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5jb25maWdzICYmIHYuY29uZmlncy5zZWN1cmVDb29raWUgJiYgJ2h0dHBzOicgPT09IGxvY2F0aW9uLnByb3RvY29sICYmICh0LnNlY3VyZSA9ICEwKSwgdi5jb25maWdzICYmIHYuY29uZmlncy5zYW1lU2l0ZUNvb2tpZSAmJiAnaHR0cHM6JyA9PT0gbG9jYXRpb24ucHJvdG9jb2wgJiYgKHQuc2FtZVNpdGUgPSBxLlNBTUVfU0lURV9WQUxVRVNbdi5jb25maWdzLnNhbWVTaXRlQ29va2llLnRvVXBwZXJDYXNlKCldIHx8ICdMYXgnKSwgJC5yZW1vdmUoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LnJlc2V0U3RhdGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyB2Ll9tZXJnZVNlcnZlclN0YXRlKGUpIDogcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5faXNBbGxvd2VkRG9uZSA9ICExLCB2Ll9pc0FsbG93ZWRGbGFnID0gITEsIHYuaXNBbGxvd2VkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9pc0FsbG93ZWREb25lIHx8ICh2Ll9pc0FsbG93ZWREb25lID0gITAsICh2LmNvb2tpZVJlYWQodi5jb29raWVOYW1lKSB8fCB2LmNvb2tpZVdyaXRlKHYuY29va2llTmFtZSwgJ1QnLCAxKSkgJiYgKHYuX2lzQWxsb3dlZEZsYWcgPSAhMCkpLCAnVCcgPT09IHYuY29va2llUmVhZCh2LmNvb2tpZU5hbWUpICYmIHYucmVtb3ZlQ29va2llKHYuY29va2llTmFtZSksIHYuX2lzQWxsb3dlZEZsYWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LnNldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9zZXRNYXJrZXRpbmdDbG91ZEZpZWxkcyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3VzZTFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIgPSAhMSwgdi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5tYXJrZXRpbmdDbG91ZFNlcnZlciAmJiB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyLmluZGV4T2YoJy5kZW1kZXgubmV0JykgPCAwICYmICh2Ll91c2Uxc3RQYXJ0eU1hcmtldGluZ0Nsb3VkU2VydmVyID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgnX3NldE1hcmtldGluZ0Nsb3VkRmllbGRzJyksIGEgPSBuLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fZ2V0UmVtb3RlRmllbGQoViwgYSwgZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbltlXSA9IHYuX2dldEZpZWxkKGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIC0xICE9PSBlLmluZGV4T2YoJ01DT1BUT1VUJykgPyB2LmlzT3B0ZWRPdXQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uTUNPUFRPVVQgPSBlLCB0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBudWxsLCAhMCkgOiB0KG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldFZpc2l0b3JWYWx1ZXMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNNSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogdi5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ09QVE9VVDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiB2LmlzT3B0ZWRPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBSUQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogWyEwXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuOiB2LmdldEF1ZGllbmNlTWFuYWdlckxvY2F0aW9uSGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbITBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogdi5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFshMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhID0gdCAmJiB0Lmxlbmd0aCA/IEcucGx1Y2sobiwgdCkgOiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgLTEgPT09IHQuaW5kZXhPZignTUNBSUQnKSA/IHgoZSwgdCkgOiBRKGEsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fY3VycmVudEN1c3RvbWVySURzID0ge30sIHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgPSAhMSwgdi5fbmV3Q3VzdG9tZXJJRHNIYXNoID0gJycsIHYuc2V0Q3VzdG9tZXJJRHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pc09wdGVkT3V0KCkgJiYgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUcuaXNPYmplY3QoZSkgfHwgRy5pc09iamVjdEVtcHR5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgYSwgaSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuIGluICh2Ll9yZWFkVmlzaXRvcigpLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMKG4pICYmICh2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXMgPSB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXMgfHwge30sIHQgPSAoYSA9IGVbbl0pLmhhc093blByb3BlcnR5KCdoYXNoVHlwZScpID8gYS5oYXNoVHlwZSA6IHQsIGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PT0gVyhhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyID0gUmUoRmUoYS5pZCksIHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaWQgPSByLCBzLmhhc2hUeXBlID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuaWQgPSBhLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gYS5hdXRoU3RhdGUgJiYgKHMuYXV0aFN0YXRlID0gYS5hdXRoU3RhdGUpLCB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbbl0gPSBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShyID0gUmUoRmUoYSksIHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzW25dID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoVHlwZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMuZGF0YVNvdXJjZXNbbl0gPSB7IGlkOiBhIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdi5nZXRDdXN0b21lcklEcyghMCksIGMgPSB2Ll9nZXRGaWVsZCgnTUNDSURIJyksIGwgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIChjIHx8IChjID0gMCksIG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IG9baV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUcuaXNPYmplY3RFbXB0eSh1KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gdSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTChuKSAmJiAobCArPSAobCA/ICd8JyA6ICcnKSArIG4gKyAnfCcgKyAoKGEgPSB1W25dKS5pZCA/IGEuaWQgOiAnJykgKyAoYS5hdXRoU3RhdGUgPyBhLmF1dGhTdGF0ZSA6ICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fbmV3Q3VzdG9tZXJJRHNIYXNoID0gU3RyaW5nKHYuX2hhc2gobCkpLCB2Ll9uZXdDdXN0b21lcklEc0hhc2ggIT09IGMgJiYgKHYuX2N1c3RvbWVySURzSGFzaENoYW5nZWQgPSAhMCwgdi5fbWFwQ3VzdG9tZXJJRHMocCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuc3luY0lkZW50aXR5ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXYuaXNPcHRlZE91dCgpICYmIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHLmlzT2JqZWN0KGUpIHx8IEcuaXNPYmplY3RFbXB0eShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGEsIGksIHIsIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiBpbiAodi5fcmVhZFZpc2l0b3IoKSwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTChuKSAmJiAodi5fY3VycmVudEN1c3RvbWVySURzLm5hbWVTcGFjZXMgPSB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlcyB8fCB7fSwgdCA9IChhID0gZVtuXSkuaGFzT3duUHJvcGVydHkoJ2hhc2hUeXBlJykgPyBhLmhhc2hUeXBlIDogdCwgYSAmJiAnb2JqZWN0JyA9PT0gVyhhKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShpID0gUmUoRmUoYS5pZCksIHQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmlkID0gaSwgby5oYXNoVHlwZSA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5pZCA9IGEuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gYS5hdXRoU3RhdGUgJiYgKG8uYXV0aFN0YXRlID0gYS5hdXRoU3RhdGUpLCBhLmRhdGFTb3VyY2UgJiYgKHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyA9IHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlcyB8fCB7fSwgciA9IGEuZGF0YVNvdXJjZSwgdi5fY3VycmVudEN1c3RvbWVySURzLmRhdGFTb3VyY2VzW3JdID0gbyksIHYuX2N1cnJlbnRDdXN0b21lcklEcy5uYW1lU3BhY2VzW25dID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB2LmdldEN1c3RvbWVySURzKCEwKSwgbCA9IHYuX2dldEZpZWxkKCdNQ0NJREgnKSwgdSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHMgaW4gKGwgfHwgKGwgPSAnMCcpLCBjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBjW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHLmlzT2JqZWN0RW1wdHkoZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuIGluIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwobikgJiYgKHUgKz0gKHUgPyAnfCcgOiAnJykgKyBuICsgJ3wnICsgKChhID0gZFtuXSkuaWQgPyBhLmlkIDogJycpICsgKGEuYXV0aFN0YXRlID8gYS5hdXRoU3RhdGUgOiAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX25ld0N1c3RvbWVySURzSGFzaCA9IFN0cmluZyh2Ll9oYXNoKHUpKSwgdi5fbmV3Q3VzdG9tZXJJRHNIYXNoICE9PSBsICYmICh2Ll9jdXN0b21lcklEc0hhc2hDaGFuZ2VkID0gITAsIHYuX21hcEN1c3RvbWVySURzKHApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmdldEN1c3RvbWVySURzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9yZWFkVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNvdXJjZXM6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlczoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IHYuX2N1cnJlbnRDdXN0b21lcklEcy5kYXRhU291cmNlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCh0KSAmJiAobiA9IGlbdF0pLmlkICYmIChhLmRhdGFTb3VyY2VzW3RdIHx8IChhLmRhdGFTb3VyY2VzW3RdID0ge30pLCBhLmRhdGFTb3VyY2VzW3RdLmlkID0gbi5pZCwgbnVsbCAhPSBuLmF1dGhTdGF0ZSA/IGEuZGF0YVNvdXJjZXNbdF0uYXV0aFN0YXRlID0gbi5hdXRoU3RhdGUgOiBhLmRhdGFTb3VyY2VzW3RdLmF1dGhTdGF0ZSA9IGsuQXV0aFN0YXRlLlVOS05PV04sIG4uaGFzaFR5cGUgJiYgKGEuZGF0YVNvdXJjZXNbdF0uaGFzaFR5cGUgPSBuLmhhc2hUeXBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2Ll9jdXJyZW50Q3VzdG9tZXJJRHMubmFtZVNwYWNlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCh0KSAmJiAobiA9IHJbdF0pLmlkICYmIChhLm5hbWVTcGFjZXNbdF0gfHwgKGEubmFtZVNwYWNlc1t0XSA9IHt9KSwgYS5uYW1lU3BhY2VzW3RdLmlkID0gbi5pZCwgbnVsbCAhPSBuLmF1dGhTdGF0ZSA/IGEubmFtZVNwYWNlc1t0XS5hdXRoU3RhdGUgPSBuLmF1dGhTdGF0ZSA6IGEubmFtZVNwYWNlc1t0XS5hdXRoU3RhdGUgPSBrLkF1dGhTdGF0ZS5VTktOT1dOLCBuLmhhc2hUeXBlICYmIChhLm5hbWVTcGFjZXNbdF0uaGFzaFR5cGUgPSBuLmhhc2hUeXBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBhIDogYS5kYXRhU291cmNlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuc2V0QW5hbHl0aWNzVmlzaXRvcklEID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9zZXRBbmFseXRpY3NGaWVsZHMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmdldEFuYWx5dGljc1Zpc2l0b3JJRCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFCLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSAmJiAhbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2NhbGxDYWxsYmFjayhlLCBbJyddKSwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiB8fCAoYSA9IHYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGEgfHwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4gPyB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyIDogdi50cmFja2luZ1NlcnZlciwgciA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmxvYWRTU0wgJiYgKG4gPyB2Lm1hcmtldGluZ0Nsb3VkU2VydmVyU2VjdXJlICYmIChpID0gdi5tYXJrZXRpbmdDbG91ZFNlcnZlclNlY3VyZSkgOiB2LnRyYWNraW5nU2VydmVyU2VjdXJlICYmIChpID0gdi50cmFja2luZ1NlcnZlclNlY3VyZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAnaHR0cCcgKyAodi5sb2FkU1NMID8gJ3MnIDogJycpICsgJzovLycgKyBpICsgJy9pZCcsIGMgPSAnZF92aXNpZF92ZXI9JyArIHYudmVyc2lvbiArICcmbWNvcmdpZD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHYubWFya2V0aW5nQ2xvdWRPcmdJRCkgKyAoYSA/ICcmbWlkPScgKyBlbmNvZGVVUklDb21wb25lbnQoYSkgOiAnJykgKyAodi5pZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nIHx8IHYuZGlzYWJsZVRoaXJkUGFydHlDb29raWVzID8gJyZkX2NvcHBhPXRydWUnIDogJycpLCBsID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc19jX2lsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5faW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfc2V0JyArIChuID8gJ01hcmtldGluZ0Nsb3VkJyA6ICdBbmFseXRpY3MnKSArICdGaWVsZHMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBvICsgJz8nICsgYyArICcmY2FsbGJhY2s9c19jX2lsJTVCJyArIHYuX2luICsgJyU1RC5fc2V0JyArIChuID8gJ01hcmtldGluZ0Nsb3VkJyA6ICdBbmFseXRpY3MnKSArICdGaWVsZHMnLCBzLmNvcnNVcmwgPSBvICsgJz8nICsgYywgcy5jYWxsYmFjayA9IGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMudXJsID0gciwgdi5fZ2V0UmVtb3RlRmllbGQobiA/IFYgOiBFLCByLCBlLCB0LCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2Ll9nZXRGaWVsZChFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuICYmIEIuaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZCgpICYmIChuID0gdi5nZXRBbmFseXRpY3NWaXNpdG9ySUQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50KGUsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgbiB8fCAhQi5pc1RyYWNraW5nU2VydmVyUG9wdWxhdGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSgpLCBpID0gYS51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fZ2V0UmVtb3RlRmllbGQoJ01DQUFNTEgnLCBpLCBlLCB0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmdldExvY2F0aW9uSGludCA9IHYuZ2V0QXVkaWVuY2VNYW5hZ2VyTG9jYXRpb25IaW50LCB2LmdldEF1ZGllbmNlTWFuYWdlckJsb2IgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYihlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0RmllbGQoRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiAmJiBCLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSAmJiAobiA9IHYuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmdldEF1ZGllbmNlTWFuYWdlckJsb2IoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBuIHx8ICFCLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB2Ll9nZXRBdWRpZW5jZU1hbmFnZXJVUkxEYXRhKCksIGkgPSBhLnVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9jdXN0b21lcklEc0hhc2hDaGFuZ2VkICYmIHYuX3NldEZpZWxkRXhwaXJlKEEsIC0xKSwgdi5fZ2V0UmVtb3RlRmllbGQoQSwgaSwgZSwgdCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCA9ICcnLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQgPSB7fSwgdi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCA9ICcnLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBSID0gISh2LmdldFN1cHBsZW1lbnRhbERhdGFJRCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCB8fCB0IHx8ICh2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gdi5fZ2VuZXJhdGVJRCgxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0ICYmICF2Ll9zdXBwbGVtZW50YWxEYXRhSURMYXN0Q29uc3VtZWRbZV0gPyAobiA9IHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3QsIHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZFtlXSA9ICEwKSA6IG4gJiYgKHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZFtlXSAmJiAodi5fc3VwcGxlbWVudGFsRGF0YUlETGFzdCA9IHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnQsIHYuX3N1cHBsZW1lbnRhbERhdGFJRExhc3RDb25zdW1lZCA9IHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZCwgdi5fc3VwcGxlbWVudGFsRGF0YUlEQ3VycmVudCA9IG4gPSB0ID8gJycgOiB2Ll9nZW5lcmF0ZUlEKDEpLCB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQgPSB7fSksIG4gJiYgKHYuX3N1cHBsZW1lbnRhbERhdGFJREN1cnJlbnRDb25zdW1lZFtlXSA9ICEwKSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2xpYmVyYXRlZE9wdE91dCA9IG51bGwsIHYuZ2V0T3B0T3V0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX2dldEF1ZGllbmNlTWFuYWdlclVSTERhdGEoJ19zZXRNYXJrZXRpbmdDbG91ZEZpZWxkcycpLCBhID0gbi51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2dldFJlbW90ZUZpZWxkKCdNQ09QVE9VVCcsIGEsIGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Ll9yZWdpc3RlckNhbGxiYWNrKCdsaWJlcmF0ZWRPcHRPdXQnLCBlKSwgbnVsbCAhPT0gdi5fbGliZXJhdGVkT3B0T3V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fY2FsbEFsbENhbGxiYWNrcygnbGliZXJhdGVkT3B0T3V0JywgW3YuX2xpYmVyYXRlZE9wdE91dF0pLCBSID0gITEsIHYuX2xpYmVyYXRlZE9wdE91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJ2xpYmVyYXRlZEdldE9wdE91dCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY29yc1VybCA9IG4uY29yc1VybC5yZXBsYWNlKC9cLmRlbWRleFwubmV0XC9pZFw/LywgJy5kZW1kZXgubmV0L29wdE91dFN0YXR1cz8nKSwgbi5jYWxsYmFjayA9IFtpXSwgSltpXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSBPYmplY3QoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBhID0gRy5wYXJzZU9wdE91dChlLCB0LCBNKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBhLm9wdE91dCwgbiA9IDEwMDAgKiBhLmRfb3R0bCwgdi5fbGliZXJhdGVkT3B0T3V0ID0gdCwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fbGliZXJhdGVkT3B0T3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NhbGxBbGxDYWxsYmFja3MoJ2xpYmVyYXRlZE9wdE91dCcsIFt0XSksIFIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBOLmZpcmVDT1JTKG4pLCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZWQ6ICh2LmlzT3B0ZWRPdXQgPSBmdW5jdGlvbiAobiwgYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHx8IChhID0gay5PcHRPdXQuR0xPQkFMKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2LmdldE9wdE91dChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlID09PSBrLk9wdE91dC5HTE9CQUwgfHwgMCA8PSBlLmluZGV4T2YoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9jYWxsQ2FsbGJhY2sobiwgW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gdCA9PT0gay5PcHRPdXQuR0xPQkFMIHx8IDAgPD0gdC5pbmRleE9mKGEpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAhMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYub25SZWNlaXZlRWNpZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYuc3Vic2NyaWJlZCA9ICEwLCBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgRi5jYWxsYmFja3MucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2ZpZWxkcyA9IG51bGwsIHYuX2ZpZWxkc0V4cGlyZWQgPSBudWxsLCB2Ll9oYXNoID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChuIDw8IDUpIC0gbiArIGUuY2hhckNvZGVBdCh0KSwgbiAmPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2VuZXJhdGVJRCA9IHRlLCB2Ll9nZW5lcmF0ZUxvY2FsTUlEID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdi5fZ2VuZXJhdGVJRCgwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gei5pc0NsaWVudFNpZGVNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCA9ICEwLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fY2FsbGJhY2tMaXN0ID0gbnVsbCwgdi5fY2FsbENhbGxiYWNrID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gZS5hcHBseShDLCB0KSA6IGVbMV0uYXBwbHkoZVswXSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3JlZ2lzdGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKG51bGwgPT0gdi5fY2FsbGJhY2tMaXN0ICYmICh2Ll9jYWxsYmFja0xpc3QgPSB7fSksIG51bGwgPT0gdi5fY2FsbGJhY2tMaXN0W2VdICYmICh2Ll9jYWxsYmFja0xpc3RbZV0gPSBbXSksIHYuX2NhbGxiYWNrTGlzdFtlXS5wdXNoKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2NhbGxBbGxDYWxsYmFja3MgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IHYuX2NhbGxiYWNrTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX2NhbGxiYWNrTGlzdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IG4ubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9jYWxsQ2FsbGJhY2sobi5zaGlmdCgpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9hZGRRdWVyeXN0cmluZ1BhcmFtID0gZnVuY3Rpb24gKGUsIHQsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGVuY29kZVVSSUNvbXBvbmVudCh0KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChuKSwgciA9IEIucGFyc2VIYXNoKGUpLCBzID0gQi5oYXNobGVzc1VybChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPT09IHMuaW5kZXhPZignPycpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyArICc/JyArIGkgKyByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gcy5zcGxpdCgnPycpLCBjID0gb1swXSArICc/JywgbCA9IG9bMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgKyBCLmFkZFF1ZXJ5UGFyYW1BdExvY2F0aW9uKGwsIGksIGEpICsgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2V4dHJhY3RQYXJhbUZyb21VcmkgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IFJlZ0V4cCgnW1xcPyYjXScgKyB0ICsgJz0oW14mI10qKScpLmV4ZWMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoblsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9wYXJzZUFkb2JlTWNGcm9tVXJsID0gdChhZS5BRE9CRV9NQyksIHYuX3BhcnNlQWRvYmVNY1NkaWRGcm9tVXJsID0gdChhZS5BRE9CRV9NQ19TRElEKSwgdi5fYXR0ZW1wdFRvUG9wdWxhdGVTZGlkRnJvbVVybCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2Ll9wYXJzZUFkb2JlTWNTZGlkRnJvbVVybChlKSwgbiA9IDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LlRTICYmIChuID0gQi5nZXRUaW1lc3RhbXBJblNlY29uZHMoKSAtIHQuVFMpLCB0ICYmIHQuU0RJRCAmJiB0Lk1DT1JHSUQgPT09IGEgJiYgbiA8IHYuc2RpZFBhcmFtRXhwaXJ5ICYmICh2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50ID0gdC5TRElELCB2Ll9zdXBwbGVtZW50YWxEYXRhSURDdXJyZW50Q29uc3VtZWQuU0RJRF9VUkxfUEFSQU0gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9hdHRlbXB0VG9Qb3B1bGF0ZUlkc0Zyb21VcmwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB2Ll9wYXJzZUFkb2JlTWNGcm9tVXJsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5UUykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEIuZ2V0VGltZXN0YW1wSW5TZWNvbmRzKCkgLSBlLlRTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5mbG9vcih0IC8gNjApID4gYWUuQURPQkVfTUNfVFRMX0lOX01JTiB8fCBlLk1DT1JHSUQgIT09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fbWVyZ2VTZXJ2ZXJTdGF0ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9IGUsIChlID0gQi5pc09iamVjdChhKSA/IGEgOiBKU09OLnBhcnNlKGEpKVt2Lm1hcmtldGluZ0Nsb3VkT3JnSURdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW3YubWFya2V0aW5nQ2xvdWRPcmdJRF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHQuY3VzdG9tZXJJRHMsIEIuaXNPYmplY3QobikgJiYgdi5zZXRDdXN0b21lcklEcyhuKSwgcih0LnNkaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BzZXJ2ZXJTdGF0ZWAgaGFzIGFuIGludmFsaWQgZm9ybWF0LicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll90aW1lb3V0ID0gbnVsbCwgdi5fbG9hZERhdGEgPSBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB2Ll9hZGRRdWVyeXN0cmluZ1BhcmFtKHQsICdkX2ZpZWxkZ3JvdXAnLCBlLCAxKSwgYS51cmwgPSB2Ll9hZGRRdWVyeXN0cmluZ1BhcmFtKGEudXJsLCAnZF9maWVsZGdyb3VwJywgZSwgMSksIGEuY29yc1VybCA9IHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0oYS5jb3JzVXJsLCAnZF9maWVsZGdyb3VwJywgZSwgMSksIHouZmllbGRHcm91cE9ialtlXSA9ICEwLCBhID09PSBPYmplY3QoYSkgJiYgYS5jb3JzVXJsICYmICdYTUxIdHRwUmVxdWVzdCcgPT09IE4uY29yc01ldGFkYXRhLmNvcnNUeXBlICYmIE4uZmlyZUNPUlMoYSwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9jbGVhclRpbWVvdXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdi5fdGltZW91dCAmJiB2Ll90aW1lb3V0W2VdICYmIChjbGVhclRpbWVvdXQodi5fdGltZW91dFtlXSksIHYuX3RpbWVvdXRbZV0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldHRpbmdzRGlnZXN0ID0gMCwgdi5fZ2V0U2V0dGluZ3NEaWdlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2Ll9zZXR0aW5nc0RpZ2VzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHYudmVyc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIgJiYgKGUgKz0gJ3wnICsgdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXIpLCB2LmF1ZGllbmNlTWFuYWdlclNlcnZlclNlY3VyZSAmJiAoZSArPSAnfCcgKyB2LmF1ZGllbmNlTWFuYWdlclNlcnZlclNlY3VyZSksIHYuX3NldHRpbmdzRGlnZXN0ID0gdi5faGFzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX3NldHRpbmdzRGlnZXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fcmVhZFZpc2l0b3JEb25lID0gITEsIHYuX3JlYWRWaXNpdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5fcmVhZFZpc2l0b3JEb25lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3JlYWRWaXNpdG9yRG9uZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgbiwgYSwgaSwgciwgcyA9IHYuX2dldFNldHRpbmdzRGlnZXN0KCksIG8gPSAhMSwgYyA9IHYuY29va2llUmVhZCh2LmNvb2tpZU5hbWUpLCBsID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgfHwgUyB8fCB2LmRpc2NhcmRUcmFja2luZ1NlcnZlckVDSUQgfHwgKGMgPSB2LmNvb2tpZVJlYWQoYWUuRklSU1RfUEFSVFlfU0VSVkVSX0NPT0tJRSkpLCBudWxsID09IHYuX2ZpZWxkcyAmJiAodi5fZmllbGRzID0ge30pLCBjICYmICdUJyAhPT0gYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoKGMgPSBjLnNwbGl0KCd8JykpWzBdLm1hdGNoKC9eW1wtMC05XSskLykgJiYgKHBhcnNlSW50KGNbMF0sIDEwKSAhPT0gcyAmJiAobyA9ICEwKSwgYy5zaGlmdCgpKSwgYy5sZW5ndGggJSAyID09IDEgJiYgYy5wb3AoKSwgZSA9IDA7IGUgPCBjLmxlbmd0aDsgZSArPSAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAodCA9IGNbZV0uc3BsaXQoJy0nKSlbMF0sIGEgPSBjW2UgKyAxXSwgMSA8IHQubGVuZ3RoID8gKGkgPSBwYXJzZUludCh0WzFdLCAxMCksIHIgPSAwIDwgdFsxXS5pbmRleE9mKCdzJykpIDogKGkgPSAwLCByID0gITEpLCBvICYmICgnTUNDSURIJyA9PT0gbiAmJiAoYSA9ICcnKSwgMCA8IGkgJiYgKGkgPSBsLmdldFRpbWUoKSAvIDEwMDAgLSA2MCkpLCBuICYmIGEgJiYgKHYuX3NldEZpZWxkKG4sIGEsIDEpLCAwIDwgaSAmJiAodi5fZmllbGRzWydleHBpcmUnICsgbl0gPSBpICsgKHIgPyAncycgOiAnJyksIChsLmdldFRpbWUoKSA+PSAxMDAwICogaSB8fCByICYmICF2LmNvb2tpZVJlYWQodi5zZXNzaW9uQ29va2llTmFtZSkpICYmICh2Ll9maWVsZHNFeHBpcmVkIHx8ICh2Ll9maWVsZHNFeHBpcmVkID0ge30pLCB2Ll9maWVsZHNFeHBpcmVkW25dID0gITApKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF2Ll9nZXRGaWVsZChFKSAmJiBCLmlzVHJhY2tpbmdTZXJ2ZXJQb3B1bGF0ZWQoKSAmJiAoYyA9IHYuY29va2llUmVhZCgnc192aScpKSAmJiAxIDwgKGMgPSBjLnNwbGl0KCd8JykpLmxlbmd0aCAmJiAwIDw9IGNbMF0uaW5kZXhPZigndjEnKSAmJiAoMCA8PSAoZSA9IChhID0gY1sxXSkuaW5kZXhPZignWycpKSAmJiAoYSA9IGEuc3Vic3RyaW5nKDAsIGUpKSwgYSAmJiBhLm1hdGNoKGFlLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpICYmIHYuX3NldEZpZWxkKEUsIGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9hcHBlbmRWZXJzaW9uVG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ3ZWZXJzaW9ufCcgKyB2LnZlcnNpb24sIG4gPSBlID8gdi5fZ2V0Q29va2llVmVyc2lvbihlKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPyBaLmFyZVZlcnNpb25zRGlmZmVyZW50KG4sIHYudmVyc2lvbikgJiYgKGUgPSBlLnJlcGxhY2UoYWUuVkVSU0lPTl9SRUdFWCwgdCkpIDogZSArPSAoZSA/ICd8JyA6ICcnKSArIHQsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll93cml0ZVZpc2l0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQsIG4gPSB2Ll9nZXRTZXR0aW5nc0RpZ2VzdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSBpbiB2Ll9maWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwoZSkgJiYgdi5fZmllbGRzW2VdICYmICdleHBpcmUnICE9PSBlLnN1YnN0cmluZygwLCA2KSAmJiAodCA9IHYuX2ZpZWxkc1tlXSwgbiArPSAobiA/ICd8JyA6ICcnKSArIGUgKyAodi5fZmllbGRzWydleHBpcmUnICsgZV0gPyAnLScgKyB2Ll9maWVsZHNbJ2V4cGlyZScgKyBlXSA6ICcnKSArICd8JyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB2Ll9hcHBlbmRWZXJzaW9uVG8obiksIHYuY29va2llV3JpdGUodi5jb29raWVOYW1lLCBuLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2dldEZpZWxkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCA9PSB2Ll9maWVsZHMgfHwgIXQgJiYgdi5fZmllbGRzRXhwaXJlZCAmJiB2Ll9maWVsZHNFeHBpcmVkW2VdID8gbnVsbCA6IHYuX2ZpZWxkc1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldEZpZWxkID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IHYuX2ZpZWxkcyAmJiAodi5fZmllbGRzID0ge30pLCB2Ll9maWVsZHNbZV0gPSB0LCBuIHx8IHYuX3dyaXRlVmlzaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2V0RmllbGRMaXN0ID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX2dldEZpZWxkKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID8gbi5zcGxpdCgnKicpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldEZpZWxkTGlzdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fc2V0RmllbGQoZSwgdCA/IHQuam9pbignKicpIDogJycsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2V0RmllbGRNYXAgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdi5fZ2V0RmllbGRMaXN0KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBuLmxlbmd0aDsgYSArPSAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtuW2FdXSA9IG5bYSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRGaWVsZE1hcCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGkgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgaW4gKGkgPSBbXSwgdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMKGEpICYmIChpLnB1c2goYSksIGkucHVzaCh0W2FdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fc2V0RmllbGRMaXN0KGUsIGksIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fc2V0RmllbGRFeHBpcmUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNldFRpbWUoYS5nZXRUaW1lKCkgKyAxMDAwICogdCksIG51bGwgPT0gdi5fZmllbGRzICYmICh2Ll9maWVsZHMgPSB7fSksIHYuX2ZpZWxkc1snZXhwaXJlJyArIGVdID0gTWF0aC5mbG9vcihhLmdldFRpbWUoKSAvIDEwMDApICsgKG4gPyAncycgOiAnJyksIHQgPCAwID8gKHYuX2ZpZWxkc0V4cGlyZWQgfHwgKHYuX2ZpZWxkc0V4cGlyZWQgPSB7fSksIHYuX2ZpZWxkc0V4cGlyZWRbZV0gPSAhMCkgOiB2Ll9maWVsZHNFeHBpcmVkICYmICh2Ll9maWVsZHNFeHBpcmVkW2VdID0gITEpLCBuICYmICh2LmNvb2tpZVJlYWQodi5zZXNzaW9uQ29va2llTmFtZSkgfHwgdi5jb29raWVXcml0ZSh2LnNlc3Npb25Db29raWVOYW1lLCAnMScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX2ZpbmRWaXNpdG9ySUQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICgnb2JqZWN0JyA9PT0gVyhlKSAmJiAoZSA9IGUuZF9taWQgPyBlLmRfbWlkIDogZS52aXNpdG9ySUQgPyBlLnZpc2l0b3JJRCA6IGUuaWQgPyBlLmlkIDogZS51dWlkID8gZS51dWlkIDogJycgKyBlKSwgZSAmJiAnTk9UQVJHRVQnID09PSAoZSA9IGUudG9VcHBlckNhc2UoKSkgJiYgKGUgPSBNKSwgZSAmJiAoZSA9PT0gTSB8fCBlLm1hdGNoKGFlLlZBTElEX1ZJU0lUT1JfSURfUkVHRVgpKSB8fCAoZSA9ICcnKSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRGaWVsZHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Ll9jbGVhclRpbWVvdXQoZSksIG51bGwgIT0gdi5fbG9hZGluZyAmJiAodi5fbG9hZGluZ1tlXSA9ICExKSwgei5maWVsZEdyb3VwT2JqW2VdICYmIHouc2V0U3RhdGUoZSwgITEpLCBlID09PSB3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwICE9PSB6LmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEICYmICh6LmlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHYuX2dldEZpZWxkKFYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgdi5vdmVyd3JpdGVDcm9zc0RvbWFpbk1DSURBbmRBSUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG4gPSAnb2JqZWN0JyA9PT0gVyh0KSAmJiB0Lm1pZCA/IHQubWlkIDogdi5fZmluZFZpc2l0b3JJRCh0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciAmJiAhdi50cmllZDFzdFBhcnR5TWFya2V0aW5nQ2xvdWRTZXJ2ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LnRyaWVkMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciA9ICEwLCB2b2lkIHYuZ2V0QW5hbHl0aWNzVmlzaXRvcklEKG51bGwsICExLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHYuX2dlbmVyYXRlTG9jYWxNSUQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3NldEZpZWxkKFYsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgbiAhPT0gTSB8fCAobiA9ICcnKSwgJ29iamVjdCcgPT09IFcodCkgJiYgKCh0LmRfcmVnaW9uIHx8IHQuZGNzX3JlZ2lvbiB8fCB0LmRfYmxvYiB8fCB0LmJsb2IpICYmIHYuX3NldEZpZWxkcyhPLCB0KSwgdi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciAmJiB0Lm1pZCAmJiB2Ll9zZXRGaWVsZHMoVCwgeyBpZDogdC5pZCB9KSksIHYuX2NhbGxBbGxDYWxsYmFja3MoViwgW25dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IE8gJiYgJ29iamVjdCcgPT09IFcodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSA2MDQ4MDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gdC5pZF9zeW5jX3R0bCAmJiB0LmlkX3N5bmNfdHRsICYmIChhID0gcGFyc2VJbnQodC5pZF9zeW5jX3R0bCwgMTApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBVLmdldFJlZ2lvbkFuZENoZWNrSWZDaGFuZ2VkKHQsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9jYWxsQWxsQ2FsbGJhY2tzKCdNQ0FBTUxIJywgW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB2Ll9nZXRGaWVsZChBKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQuZF9ibG9iIHx8IHQuYmxvYikgJiYgKChyID0gdC5kX2Jsb2IpIHx8IChyID0gdC5ibG9iKSwgdi5fc2V0RmllbGRFeHBpcmUoQSwgYSksIHYuX3NldEZpZWxkKEEsIHIpKSwgciB8fCAociA9ICcnKSwgdi5fY2FsbEFsbENhbGxiYWNrcyhBLCBbcl0pLCAhdC5lcnJvcl9tc2cgJiYgdi5fbmV3Q3VzdG9tZXJJRHNIYXNoICYmIHYuX3NldEZpZWxkKCdNQ0NJREgnLCB2Ll9uZXdDdXN0b21lcklEc0hhc2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHYuX2dldEZpZWxkKEUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmICF2Lm92ZXJ3cml0ZUNyb3NzRG9tYWluTUNJREFuZEFJRCB8fCAoKHMgPSB2Ll9maW5kVmlzaXRvcklEKHQpKSA/IHMgIT09IE0gJiYgdi5fc2V0RmllbGRFeHBpcmUoQSwgLTEpIDogcyA9IE0sIHYuX3NldEZpZWxkKEUsIHMpKSwgcyAmJiBzICE9PSBNIHx8IChzID0gJycpLCB2Ll9jYWxsQWxsQ2FsbGJhY2tzKEUsIFtzXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmlkU3luY0Rpc2FibGVTeW5jcyB8fCB2LmRpc2FibGVJZFN5bmNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLmlkQ2FsbE5vdFByb2Nlc3NzZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS5pZENhbGxOb3RQcm9jZXNzc2VkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uaWJzID0gdC5pYnMsIG8uc3ViZG9tYWluID0gdC5zdWJkb21haW4sIFUucHJvY2Vzc0lEQ2FsbERhdGEobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID09PSBPYmplY3QodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMsIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoKSAmJiB2LmlzQWxsb3dlZCgpICYmIChjID0gdi5fZ2V0RmllbGQoJ01DT1BUT1VUJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IEcucGFyc2VPcHRPdXQodCwgYywgTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB1Lm9wdE91dCwgbCA9IHUuZF9vdHRsLCB2Ll9zZXRGaWVsZEV4cGlyZSgnTUNPUFRPVVQnLCBsLCAhMCksIHYuX3NldEZpZWxkKCdNQ09QVE9VVCcsIGMpLCB2Ll9jYWxsQWxsQ2FsbGJhY2tzKCdNQ09QVE9VVCcsIFtjXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fbG9hZGluZyA9IG51bGwsIHYuX2dldFJlbW90ZUZpZWxkID0gZnVuY3Rpb24gKG4sIGUsIHQsIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgcyA9ICcnLCBvID0gQi5pc0ZpcnN0UGFydHlBbmFseXRpY3NWaXNpdG9ySURDYWxsKG4pLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBQU1MSDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FBTUI6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQoKSAmJiB2LmlzQWxsb3dlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5fcmVhZFZpc2l0b3IoKSwgISghKHMgPSB2Ll9nZXRGaWVsZChuLCAhMCA9PT0gY1tuXSkpIHx8IHYuX2ZpZWxkc0V4cGlyZWQgJiYgdi5fZmllbGRzRXhwaXJlZFtuXSkgfHwgdi5kaXNhYmxlVGhpcmRQYXJ0eUNhbGxzICYmICFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyB8fCAobiA9PT0gViA/ICh2Ll9yZWdpc3RlckNhbGxiYWNrKG4sIHQpLCBzID0gdi5fZ2VuZXJhdGVMb2NhbE1JRCgpLCB2LnNldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKHMpKSA6IG4gPT09IEUgPyAodi5fcmVnaXN0ZXJDYWxsYmFjayhuLCB0KSwgcyA9ICcnLCB2LnNldEFuYWx5dGljc1Zpc2l0b3JJRChzKSkgOiBhID0gIShzID0gJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobiA9PT0gViB8fCAnTUNPUFRPVVQnID09PSBuID8gciA9IHcgOiAnTUNBQU1MSCcgPT09IG4gfHwgbiA9PT0gQSA/IHIgPSBPIDogbiA9PT0gRSAmJiAociA9IFQpLCByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFlIHx8IG51bGwgIT0gdi5fbG9hZGluZyAmJiB2Ll9sb2FkaW5nW3JdIHx8IChudWxsID09IHYuX2xvYWRpbmcgJiYgKHYuX2xvYWRpbmcgPSB7fSksIHYuX2xvYWRpbmdbcl0gPSAhMCwgciA9PT0gTyAmJiAoXyA9IDApLCB2Ll9sb2FkRGF0YShyLCBlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5fZ2V0RmllbGQobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiB6LnNldFN0YXRlKHIsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9PT0gViA/IHQgPSB2Ll9nZW5lcmF0ZUxvY2FsTUlEKCkgOiByID09PSBPICYmICh0ID0geyBlcnJvcl9tc2c6ICd0aW1lb3V0JyB9KSwgdi5fc2V0RmllbGRzKHIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkpKSwgdi5fcmVnaXN0ZXJDYWxsYmFjayhuLCB0KSwgcyB8fCAoZSB8fCB2Ll9zZXRGaWVsZHMociwgeyBpZDogTSB9KSwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICE9PSBWICYmIG4gIT09IEUgfHwgcyAhPT0gTSB8fCAoYSA9ICEocyA9ICcnKSksIHQgJiYgYSAmJiB2Ll9jYWxsQ2FsbGJhY2sodCwgW3NdKSwgbiA9PT0gViAmJiBGLnN1YnNjcmliZWQgJiYgKEYuY2FsbGJhY2tzICYmIEYuY2FsbGJhY2tzLmxlbmd0aCAmJiBGLmNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2NhbGxDYWxsYmFjayhlLCBbc10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBGLnN1YnNjcmliZWQgPSAhMSwgRi5jYWxsYmFja3MubGVuZ3RoID0gMCksIHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRNYXJrZXRpbmdDbG91ZEZpZWxkcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fcmVhZFZpc2l0b3IoKSwgdi5fc2V0RmllbGRzKHcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fbWFwQ3VzdG9tZXJJRHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZ2V0QXVkaWVuY2VNYW5hZ2VyQmxvYihlLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9zZXRBbmFseXRpY3NGaWVsZHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX3JlYWRWaXNpdG9yKCksIHYuX3NldEZpZWxkcyhULCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuX3NldEF1ZGllbmNlTWFuYWdlckZpZWxkcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fcmVhZFZpc2l0b3IoKSwgdi5fc2V0RmllbGRzKE8sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5fZ2V0QXVkaWVuY2VNYW5hZ2VyVVJMRGF0YSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2LmF1ZGllbmNlTWFuYWdlclNlcnZlciwgbiA9ICcnLCBhID0gdi5fZ2V0RmllbGQoViksIGkgPSB2Ll9nZXRGaWVsZChBLCAhMCksIHIgPSB2Ll9nZXRGaWVsZChFKSwgcyA9IHIgJiYgciAhPT0gTSA/ICcmZF9jaWRfaWM9QVZJRCUwMScgKyBlbmNvZGVVUklDb21wb25lbnQocikgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5sb2FkU1NMICYmIHYuYXVkaWVuY2VNYW5hZ2VyU2VydmVyU2VjdXJlICYmICh0ID0gdi5hdWRpZW5jZU1hbmFnZXJTZXJ2ZXJTZWN1cmUpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBjLCBsLCB1ID0gdi5nZXRDdXN0b21lcklEcyghMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHVbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFHLmlzT2JqZWN0RW1wdHkoZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAnbmFtZVNwYWNlcycgPT09IGMgPyAnJmRfY2lkX25zPScgOiAnJmRfY2lkX2ljPSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobyBpbiBkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTChvKSAmJiAobCA9IGRbb10sIHMgKz0gcCArIGVuY29kZVVSSUNvbXBvbmVudChvKSArICclMDEnICsgZW5jb2RlVVJJQ29tcG9uZW50KGwuaWQgPyBsLmlkIDogJycpICsgKGwuYXV0aFN0YXRlID8gJyUwMScgKyBsLmF1dGhTdGF0ZSA6ICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIHx8IChlID0gJ19zZXRBdWRpZW5jZU1hbmFnZXJGaWVsZHMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAnaHR0cCcgKyAodi5sb2FkU1NMID8gJ3MnIDogJycpICsgJzovLycgKyB0ICsgJy9pZCcsIG0gPSAnZF92aXNpZF92ZXI9JyArIHYudmVyc2lvbiArICh5ICYmIC0xICE9PSBmLmluZGV4T2YoJ2RlbWRleC5uZXQnKSA/ICcmZ2Rwcj0xJmdkcHJfY29uc2VudD0nICsgeSA6ICcnKSArIChfICYmIC0xICE9PSBmLmluZGV4T2YoJ2RlbWRleC5uZXQnKSA/ICcmZF9jZj0nICsgXyA6ICcnKSArICcmZF9ydGJkPWpzb24mZF92ZXI9MicgKyAoIWEgJiYgdi5fdXNlMXN0UGFydHlNYXJrZXRpbmdDbG91ZFNlcnZlciA/ICcmZF92ZXJpZnk9MScgOiAnJykgKyAnJmRfb3JnaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2Lm1hcmtldGluZ0Nsb3VkT3JnSUQpICsgJyZkX25zaWQ9JyArICh2LmlkU3luY0NvbnRhaW5lcklEIHx8IDApICsgKGEgPyAnJmRfbWlkPScgKyBlbmNvZGVVUklDb21wb25lbnQoYSkgOiAnJykgKyAodi5pZFN5bmNEaXNhYmxlM3JkUGFydHlTeW5jaW5nIHx8IHYuZGlzYWJsZVRoaXJkUGFydHlDb29raWVzID8gJyZkX2NvcHBhPXRydWUnIDogJycpICsgKCEwID09PSBEID8gJyZkX2Nvb3Bfc2FmZT0xJyA6ICExID09PSBEID8gJyZkX2Nvb3BfdW5zYWZlPTEnIDogJycpICsgKGkgPyAnJmRfYmxvYj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGkpIDogJycpICsgcywgZyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc19jX2lsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBuID0gZiArICc/JyArIG0gKyAnJmRfY2I9c19jX2lsJTVCJyArIHYuX2luICsgJyU1RC4nICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnNVcmw6IGYgKyAnPycgKyBtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdXJsOiBuIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LmFwcGVuZFZpc2l0b3JJRHNUbyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ll9nZXRGaWVsZChWKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuX2dldEZpZWxkKEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQ09SR0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm1hcmtldGluZ0Nsb3VkT3JnSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYuX2FkZFF1ZXJ5c3RyaW5nUGFyYW0oZSwgYWUuQURPQkVfTUMsIHModCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5hcHBlbmRTdXBwbGVtZW50YWxEYXRhSURUbyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IHQgfHwgdi5nZXRTdXBwbGVtZW50YWxEYXRhSUQoQi5nZW5lcmF0ZVJhbmRvbVN0cmluZygpLCAhMCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHMoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRElEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQ09SR0lEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm1hcmtldGluZ0Nsb3VkT3JnSUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2Ll9hZGRRdWVyeXN0cmluZ1BhcmFtKGUsIGFlLkFET0JFX01DX1NESUQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlSGFzaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmluZGV4T2YoJyMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCB0ID8gZS5zdWJzdHIodCkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hsZXNzVXJsOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuaW5kZXhPZignIycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IHQgPyBlLnN1YnN0cigwLCB0KSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRRdWVyeVBhcmFtQXRMb2NhdGlvbjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBlLnNwbGl0KCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gbnVsbCAhPSBuID8gbiA6IGEubGVuZ3RoLCBhLnNwbGljZShuLCAwLCB0KSwgYS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZpcnN0UGFydHlBbmFseXRpY3NWaXNpdG9ySURDYWxsOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gRSAmJiAodCB8fCAodCA9IHYudHJhY2tpbmdTZXJ2ZXIpLCBuIHx8IChuID0gdi50cmFja2luZ1NlcnZlclNlY3VyZSksICEoJ3N0cmluZycgIT0gdHlwZW9mIChhID0gdi5sb2FkU1NMID8gbiA6IHQpIHx8ICFhLmxlbmd0aCkgJiYgYS5pbmRleE9mKCcybzcubmV0JykgPCAwICYmIGEuaW5kZXhPZignb210cmRjLm5ldCcpIDwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPYmplY3Q6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGUgJiYgZSA9PT0gT2JqZWN0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvb2tpZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5yZW1vdmUoZSwgeyBkb21haW46IHYuY29va2llRG9tYWluIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFja2luZ1NlcnZlclBvcHVsYXRlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF2LnRyYWNraW5nU2VydmVyIHx8ICEhdi50cmFja2luZ1NlcnZlclNlY3VyZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRpbWVzdGFtcEluU2Vjb25kczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VQaXBlRGVsaW1ldGVkS2V5VmFsdWVzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zcGxpdCgnfCcpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChuWzFdKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVSYW5kb21TdHJpbmc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IDU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAnJywgbiA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknOyBlLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSBuW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIG4ubGVuZ3RoKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplQm9vbGVhbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cnVlJyA9PT0gZSB8fCAnZmFsc2UnICE9PSBlICYmIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUJvb2xlYW46IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IGUgfHwgJ2ZhbHNlJyAhPT0gZSAmJiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZU1ldGhvZHNXaXRoRnVuY3Rpb246IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkobikgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZVtuXSAmJiAoZVtuXSA9IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5faGVscGVycyA9IEI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgVSA9IGllKHYsIGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fZGVzdGluYXRpb25QdWJsaXNoaW5nID0gVSwgdi50aW1lb3V0TWV0cmljc0xvZyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEgsIHogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2xpZW50U2lkZU1hcmtldGluZ0Nsb3VkVmlzaXRvcklEOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0lEQ2FsbFRpbWVkT3V0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbmFseXRpY3NJRENhbGxUaW1lZE91dDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFNSURDYWxsVGltZWRPdXQ6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkR3JvdXBPYmo6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB3OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICExID09PSB0ID8gITAgIT09IHRoaXMuTUNJRENhbGxUaW1lZE91dCAmJiAodGhpcy5NQ0lEQ2FsbFRpbWVkT3V0ID0gITEpIDogdGhpcy5NQ0lEQ2FsbFRpbWVkT3V0ID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdCA/ICEwICE9PSB0aGlzLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0ICYmICh0aGlzLkFuYWx5dGljc0lEQ2FsbFRpbWVkT3V0ID0gITEpIDogdGhpcy5BbmFseXRpY3NJRENhbGxUaW1lZE91dCA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITEgPT09IHQgPyAhMCAhPT0gdGhpcy5BQU1JRENhbGxUaW1lZE91dCAmJiAodGhpcy5BQU1JRENhbGxUaW1lZE91dCA9ICExKSA6IHRoaXMuQUFNSURDYWxsVGltZWRPdXQgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHouaXNDbGllbnRTaWRlTWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Lk1DSURDYWxsVGltZWRPdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHouTUNJRENhbGxUaW1lZE91dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuQW5hbHl0aWNzSURDYWxsVGltZWRPdXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHouQW5hbHl0aWNzSURDYWxsVGltZWRPdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2LkFBTUlEQ2FsbFRpbWVkT3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB6LkFBTUlEQ2FsbFRpbWVkT3V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5pZFN5bmNHZXRPblBhZ2VTeW5jSW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5fcmVhZFZpc2l0b3IoKSwgdi5fZ2V0RmllbGQoJ01DU1lOQ1NPUCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5pZFN5bmNCeVVSTCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzT3B0ZWRPdXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG8oZSB8fCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmVycm9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCBhLCBpID0gZS51cmwsIHIgPSBlbmNvZGVVUklDb21wb25lbnQsIHMgPSBVOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9IGkucmVwbGFjZSgvXmh0dHBzOi8sICcnKS5yZXBsYWNlKC9eaHR0cDovLCAnJyksIG4gPSBHLmVuY29kZUFuZEJ1aWxkUmVxdWVzdChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZHB1dWlkIHx8ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sICcsJyksIGEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZS5kcGlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudHRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHMuYWRkTWVzc2FnZShhLmpvaW4oJ3wnKSksIHMucmVxdWVzdFRvUHJvY2VzcygpLCAnU3VjY2Vzc2Z1bGx5IHF1ZXVlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5pZFN5bmNCeURhdGFTb3VyY2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pc09wdGVkT3V0KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBPYmplY3QoZSkgJiYgJ3N0cmluZycgPT0gdHlwZW9mIGUuZHB1dWlkICYmIGUuZHB1dWlkLmxlbmd0aCA/IChlLnVybCA9ICcvL2RwbS5kZW1kZXgubmV0L2liczpkcGlkPScgKyBlLmRwaWQgKyAnJmRwdXVpZD0nICsgZS5kcHV1aWQsIHYuaWRTeW5jQnlVUkwoZSkpIDogJ0Vycm9yOiBjb25maWcgb3IgY29uZmlnLmRwdXVpZCBpcyBlbXB0eSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBOZSh2LCBVKSwgdi5fZ2V0Q29va2llVmVyc2lvbiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwgdi5jb29raWVSZWFkKHYuY29va2llTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBhZS5WRVJTSU9OX1JFR0VYLmV4ZWMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgMSA8IHQubGVuZ3RoID8gdFsxXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2Ll9yZXNldEFtY3ZDb29raWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdi5fZ2V0Q29va2llVmVyc2lvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgIVouaXNMZXNzVGhhbih0LCBlKSB8fCB2LnJlbW92ZUNvb2tpZSh2LmNvb2tpZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdi5zZXRBc0Nvb3BTYWZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYuc2V0QXNDb29wVW5zYWZlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5jb25maWdzID0gT2JqZWN0LmNyZWF0ZShudWxsKSwgQi5pc09iamVjdChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTChlKSAmJiAodltlXSA9IG5bZV0sIHYuY29uZmlnc1tlXSA9IG5bZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBsKCksIHYuaW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCkgJiYgKGgub3B0SW4uZmV0Y2hQZXJtaXNzaW9ucyhnLCAhMCksICFoLm9wdEluLmlzQXBwcm92ZWQoaC5vcHRJbi5DYXRlZ29yaWVzLkVDSUQpKSB8fCBIIHx8IChIID0gITAsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEIuaXNPYmplY3QobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuaWRTeW5jQ29udGFpbmVySUQgPSB2LmlkU3luY0NvbnRhaW5lcklEIHx8IDAsIEQgPSAnYm9vbGVhbicgPT0gdHlwZW9mIHYuaXNDb29wU2FmZSA/IHYuaXNDb29wU2FmZSA6IEIucGFyc2VCb29sZWFuKHYuaXNDb29wU2FmZSksIHYucmVzZXRCZWZvcmVWZXJzaW9uICYmIHYuX3Jlc2V0QW1jdkNvb2tpZSh2LnJlc2V0QmVmb3JlVmVyc2lvbiksIHYuX2F0dGVtcHRUb1BvcHVsYXRlSWRzRnJvbVVybCgpLCB2Ll9hdHRlbXB0VG9Qb3B1bGF0ZVNkaWRGcm9tVXJsKCksIHYuX3JlYWRWaXNpdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHYuX2dldEZpZWxkKEkpLCB0ID0gTWF0aC5jZWlsKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gYWUuTUlMTElTX1BFUl9EQVkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5pZFN5bmNEaXNhYmxlU3luY3MgfHwgdi5kaXNhYmxlSWRTeW5jcyB8fCAhVS5jYW5NYWtlU3luY0lEQ2FsbChlLCB0KSB8fCAodi5fc2V0RmllbGRFeHBpcmUoQSwgLTEpLCB2Ll9zZXRGaWVsZChJLCB0KSksIHYuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKSwgdi5nZXRBdWRpZW5jZU1hbmFnZXJMb2NhdGlvbkhpbnQoKSwgdi5nZXRBdWRpZW5jZU1hbmFnZXJCbG9iKCksIHYuX21lcmdlU2VydmVyU3RhdGUodi5zZXJ2ZXJTdGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5fYXR0ZW1wdFRvUG9wdWxhdGVJZHNGcm9tVXJsKCksIHYuX2F0dGVtcHRUb1BvcHVsYXRlU2RpZEZyb21VcmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlkU3luY0Rpc2FibGVTeW5jcyAmJiAhdi5kaXNhYmxlSWRTeW5jcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS5jaGVja0RQSWZyYW1lU3JjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZWFkeVRvQXR0YWNoSWZyYW1lKCkgJiYgZS5hdHRhY2hJZnJhbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay53aW5kb3dMb2FkZWQgPSAhMCwgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVlLnJlY2VpdmVNZXNzYWdlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUucmVjZWl2ZU1lc3NhZ2UoZS5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBVLmlmcmFtZUhvc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCB2LndoaXRlbGlzdElmcmFtZURvbWFpbnMgJiYgYWUuUE9TVF9NRVNTQUdFX0VOQUJMRUQgJiYgKHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucyA9IHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucyBpbnN0YW5jZW9mIEFycmF5ID8gdi53aGl0ZWxpc3RJZnJhbWVEb21haW5zIDogW3Yud2hpdGVsaXN0SWZyYW1lRG9tYWluc10sIHYud2hpdGVsaXN0SWZyYW1lRG9tYWlucy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IFkoYSwgZSksIG4gPSBLKHYsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZS5yZWNlaXZlTWVzc2FnZShuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVWUuY29uZmlnID0gQjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEhlID0gSi5WaXNpdG9yID0gVWUsIHplID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRy5pc09iamVjdChpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGkpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICE9PSBpW2VdICYmIEIuZ2V0Q29uZmlncygpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gQi5ub3JtYWxpemVDb25maWcodCwgaVt0XSksIGEgPSBHLm5vcm1hbGl6ZUJvb2xlYW4obik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IGEsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgV2UgPSBMZS5PcHRJbiwgSmUgPSBMZS5JYWJQbHVnaW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlLmdldEluc3RhbmNlID0gZnVuY3Rpb24gKGEsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Zpc2l0b3IgcmVxdWlyZXMgQWRvYmUgTWFya2V0aW5nIENsb3VkIE9yZyBJRC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaW5kZXhPZignQCcpIDwgMCAmJiAoYSArPSAnQEFkb2JlT3JnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IEouc19jX2lsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmICdWaXNpdG9yJyA9PT0gbi5fYyAmJiBuLm1hcmtldGluZ0Nsb3VkT3JnSUQgPT09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIG4gPSB6ZShlKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBuIHx8IHt9LCBKLmFkb2JlLm9wdEluID0gSi5hZG9iZS5vcHRJbiB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBHLnBsdWNrKGksIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb2VzT3B0SW5BcHBseScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmlvdXNQZXJtaXNzaW9ucycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlT3B0SW5BcHByb3ZhbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzT3B0SW5TdG9yYWdlRW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0SW5TdG9yYWdlRXhwaXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc0lhYkNvbnRleHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCB0ID0gaS5vcHRJbkNvb2tpZURvbWFpbiB8fCBpLmNvb2tpZURvbWFpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKHQgPSB0IHx8IFgoKSkgPT09IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSA/ICcnIDogdCwgZS5vcHRJbkNvb2tpZURvbWFpbiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgV2UoZSwgeyBjb29raWVzOiAkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmlzSWFiQ29udGV4dCAmJiBlLmRvZXNPcHRJbkFwcGx5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEplKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucmVnaXN0ZXJQbHVnaW4oYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyksIHMgPSBuZXcgSGUoYSwgbnVsbCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmNvb2tpZURvbWFpbiAmJiAocy5jb29raWVEb21haW4gPSBuLmNvb2tpZURvbWFpbiksIG4uc2FtZVNpdGVDb29raWUgJiYgbi5zZWN1cmVDb29raWUgJiYgKHMuY29uZmlncyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lU2l0ZUNvb2tpZTogbi5zYW1lU2l0ZUNvb2tpZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmVDb29raWU6IG4uc2VjdXJlQ29va2llCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgSi5zX2NfaWwuc3BsaWNlKC0tSi5zX2NfaW4sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBHLmdldEllVmVyc2lvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInID09IHR5cGVvZiBvICYmIG8gPCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5faGVscGVycy5yZXBsYWNlTWV0aG9kc1dpdGhGdW5jdGlvbihzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKLnNlbGYgIT09IEoucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkgJiYgKChjID0gcykuY29va2llV3JpdGUoJ1RFU1RfQU1DVl9DT09LSUUnLCAnVCcsIDEpLCAnVCcgIT09IGMuY29va2llUmVhZCgnVEVTVF9BTUNWX0NPT0tJRScpIHx8IChjLnJlbW92ZUNvb2tpZSgnVEVTVF9BTUNWX0NPT0tJRScpLCAwKSkgJiYgSi5wYXJlbnQgPyBuZXcgTyhhLCBuLCBzLCBKLnBhcmVudCkgOiBuZXcgSGUoYSwgbiwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyA9IG51bGwsIGwuaW5pdCgpLCBsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlLndpbmRvd0xvYWRlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSi5hZGRFdmVudExpc3RlbmVyID8gSi5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZSkgOiBKLmF0dGFjaEV2ZW50ICYmIEouYXR0YWNoRXZlbnQoJ29ubG9hZCcsIGUpLCBIZS5jb2RlTG9hZEVuZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBWaXNpdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLW1jaWQvc3JjL3ZpZXcvdXRpbHMvdGltZVVuaXRzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3VyczogMzYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF5czogODY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlZWtzOiA2MDQ4MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoczogMjU5MjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWWVhcnM6IDMxNTM2MDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBvcmdJZDogJ0NDQkM4NzlENTU3MjA3MEU3RjAwMDEwMUBBZG9iZU9yZycsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICd0cmFja2luZ1NlcnZlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdhbWF6b25oci5zYy5vbXRyZGMubmV0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAndHJhY2tpbmdTZXJ2ZXJTZWN1cmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnYW1hem9uaHIuc2Mub210cmRjLm5ldCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaG9zdGVkTGliRmlsZXNCYXNlVXJsOiAnaHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2V4dGVuc2lvbnMvRVBmMDQxMmE1YzY1ZTU0MjlhYjBlNWVkOGJhMjI1NjUxMC8nCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcyc6IHsKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0Fkb2JlIEFuYWx5dGljcycsCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlczogewogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjbGVhci12YXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDbGVhciBWYXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4oJy4uL3NoYXJlZE1vZHVsZXMvZ2V0VHJhY2tlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNsZWFyVmFycyAmJiAoYS5sb2dnZXIuaW5mbygnQ2xlYXIgdmFyaWFibGVzLicpLCBlLmNsZWFyVmFycygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nZ2VyLmVycm9yKCdDYW5ub3QgY2xlYXIgdmFyaWFibGVzOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2VuZC1iZWFjb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTZW5kIEJlYWNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbignLi4vc2hhcmVkTW9kdWxlcy9nZXRUcmFja2VyJyksIHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5ub2RlTmFtZSAmJiAnYScgPT09IGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihlKSA/IGUuaW5uZXJIVE1MIDogJ2xpbmsgY2xpY2tlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdwYWdlJyA9PT0gdC50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nZ2VyLmluZm8oJ0ZpcmluZyBwYWdlIHZpZXcgYmVhY29uLicpLCBlLnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogdC5saW5rVHlwZSB8fCAnbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiB0LmxpbmtOYW1lIHx8IHMobikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nZ2VyLmluZm8oJ0ZpcmluZyBsaW5rIHRyYWNrIGJlYWNvbiB1c2luZyB0aGUgdmFsdWVzOiAnICsgSlNPTi5zdHJpbmdpZnkoYSkgKyAnLicpLCBlLnRsKHIobikgPyBuIDogJ3RydWUnLCBhLmxpbmtUeXBlLCBhLmxpbmtOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSgpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8oZSwgdCwgbi5lbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkubG9nZ2VyLmVycm9yKCdDYW5ub3Qgc2VuZCBiZWFjb246ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NldC12YXJpYWJsZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdTZXQgVmFyaWFibGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuKCcuLi9zaGFyZWRNb2R1bGVzL2dldFRyYWNrZXInKSwgciA9IG4oJy4uL2hlbHBlcnMvYXBwbHlUcmFja2VyVmFyaWFibGVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmxvZ2dlci5pbmZvKCdTZXQgdmFyaWFibGVzIG9uIHRoZSB0cmFja2VyLicpLCByKGUsIHQudHJhY2tlclByb3BlcnRpZXMpLCB0LmN1c3RvbVNldHVwICYmIHQuY3VzdG9tU2V0dXAuc291cmNlICYmIHQuY3VzdG9tU2V0dXAuc291cmNlLmNhbGwobi5lbGVtZW50LCBuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nZ2VyLmVycm9yKCdDYW5ub3Qgc2V0IHZhcmlhYmxlczogJyArIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvc2hhcmVkTW9kdWxlcy9nZXRUcmFja2VyLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgciA9IG4oJ0BhZG9iZS9yZWFjdG9yLWNvb2tpZScpLCBzID0gbignQGFkb2JlL3JlYWN0b3ItcHJvbWlzZScpLCBvID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIGMgPSBuKCcuLi9oZWxwZXJzL3NldHRpbmdzSGVscGVyJyksIGwgPSBuKCcuLi9oZWxwZXJzL2F1Z21lbnRlcnMnKSwgdSA9IG4oJy4uL2hlbHBlcnMvYXBwbHlUcmFja2VyVmFyaWFibGVzJyksIGQgPSBuKCcuLi9oZWxwZXJzL2xvYWRMaWJyYXJ5JyksIHAgPSBuKCcuLi9oZWxwZXJzL2dlbmVyYXRlVmVyc2lvbicpKGEuYnVpbGRJbmZvLnR1cmJpbmVCdWlsZERhdGUpLCBmID0gJ2JlZm9yZVNldHRpbmdzJywgbSA9IGEuZ2V0U2hhcmVkTW9kdWxlKCdhZG9iZS1tY2lkJywgJ21jaWQtaW5zdGFuY2UnKSwgZyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWUgfHwgJ3RydWUnID09PSByLmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5hbGwobC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLnJlc29sdmUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSAmJiAoYS5sb2dnZXIuaW5mbygnU2V0dGluZyBNQ0lEIGluc3RhbmNlIG9uIHRoZSB0cmFja2VyLicpLCBlLnZpc2l0b3IgPSBtKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dnZXIuaW5mbygnU2V0dGluZyB2ZXJzaW9uIG9uIHRyYWNrZXI6ICInICsgcCArICciLicpLCAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS50YWdDb250YWluZXJNYXJrZXIgPyBlLnRhZ0NvbnRhaW5lck1hcmtlciA9IHAgOiAnc3RyaW5nJyA9PSB0eXBlb2YgZS52ZXJzaW9uICYmIGUudmVyc2lvbi5zdWJzdHJpbmcoZS52ZXJzaW9uLmxlbmd0aCAtIDUpICE9PSAnLScgKyBwICYmIChlLnZlcnNpb24gKz0gJy0nICsgcCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHkgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubG9hZFBoYXNlID09PSBmICYmIHQuc291cmNlICYmIChhLmxvZ2dlci5pbmZvKCdDYWxsaW5nIGN1c3RvbSBzY3JpcHQgYmVmb3JlIHNldHRpbmdzLicpLCB0LnNvdXJjZS5jYWxsKG8sIG4pKSwgdShuLCBlIHx8IHt9KSwgdC5sb2FkUGhhc2UgIT09IGYgJiYgdC5zb3VyY2UgJiYgKGEubG9nZ2VyLmluZm8oJ0NhbGxpbmcgY3VzdG9tIHNjcmlwdCBhZnRlciBzZXR0aW5ncy4nKSwgdC5zb3VyY2UuY2FsbChvLCBuKSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIF8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaXNBdWRpZW5jZU1hbmFnZW1lbnRFbmFibGVkKGUpICYmICh0LmxvYWRNb2R1bGUoJ0F1ZGllbmNlTWFuYWdlbWVudCcpLCBhLmxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgQXVkaWVuY2VNYW5hZ2VtZW50IG1vZHVsZScpLCB0LkF1ZGllbmNlTWFuYWdlbWVudC5zZXR1cChlLm1vZHVsZVByb3BlcnRpZXMuYXVkaWVuY2VNYW5hZ2VyLmNvbmZpZykpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBQID0gKGkgPSBhLmdldEV4dGVuc2lvblNldHRpbmdzKCksIGcoaS50cmFja2luZ0Nvb2tpZU5hbWUpID8gZChpKS50aGVuKGIpLnRoZW4odikudGhlbihoKS50aGVuKHkuYmluZChudWxsLCBpLnRyYWNrZXJQcm9wZXJ0aWVzLCBpLmN1c3RvbVNldHVwIHx8IHt9KSkudGhlbihfLmJpbmQobnVsbCwgaSkpIDogcy5yZWplY3QoJ0VVIGNvbXBsaWFuY2Ugd2FzIG5vdCBhY2tub3dsZWRnZWQgYnkgdGhlIHVzZXIuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZ2V0LXRyYWNrZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvc2hhcmVkTW9kdWxlcy9hdWdtZW50VHJhY2tlci5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhdWdtZW50LXRyYWNrZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKCcuLi9oZWxwZXJzL2F1Z21lbnRlcnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvc2V0dGluZ3NIZWxwZXIuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbignQGFkb2JlL3JlYWN0b3Itd2luZG93JyksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJfVFlQRVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQU5BR0VEOiAnbWFuYWdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFSU5TVEFMTEVEOiAncHJlaW5zdGFsbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1PVEU6ICdyZW1vdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVU1RPTTogJ2N1c3RvbScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQU5BR0VEX0xJQl9QQVRIUzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQUF9NRUFTVVJFTUVOVDogJ0FwcE1lYXN1cmVtZW50LmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1RJVklUWV9NQVA6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQWN0aXZpdHlNYXAuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElFTkNFX01BTkFHRU1FTlQ6ICdBcHBNZWFzdXJlbWVudF9Nb2R1bGVfQXVkaWVuY2VNYW5hZ2VtZW50LmpzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcG9ydFN1aXRlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucHJvZHVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVthLmJ1aWxkSW5mby5lbnZpcm9ubWVudF0gJiYgKHQgPSBlW2EuYnVpbGRJbmZvLmVudmlyb25tZW50XSksIHQuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZpdHlNYXBFbmFibGVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGUubGlicmFyeUNvZGUgJiYgIWUubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXAgJiYgITEgPT09IGUubGlicmFyeUNvZGUudXNlQWN0aXZpdHlNYXApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQXVkaWVuY2VNYW5hZ2VtZW50RW5hYmxlZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUubW9kdWxlUHJvcGVydGllcyAmJiBlLm1vZHVsZVByb3BlcnRpZXMuYXVkaWVuY2VNYW5hZ2VyICYmIGUubW9kdWxlUHJvcGVydGllcy5hdWRpZW5jZU1hbmFnZXIuY29uZmlnICYmIGkgJiYgaS5fc2F0ZWxsaXRlICYmIGkuX3NhdGVsbGl0ZS5jb21wYW55ICYmIGkuX3NhdGVsbGl0ZS5jb21wYW55Lm9yZ0lkICYmICh0ID0gITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2F1Z21lbnRlcnMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvaGVscGVycy9hcHBseVRyYWNrZXJWYXJpYWJsZXMuanMnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbignQGFkb2JlL3JlYWN0b3ItcXVlcnktc3RyaW5nJyksIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgbyA9IC9lVmFyKFswLTldKykvLCBjID0gL3Byb3AoWzAtOV0rKS8sIGwgPSBuZXcgUmVnRXhwKCdeKGVWYXJbMC05XSspfChwcm9wWzAtOV0rKXwoaGllclswLTldKyl8Y2FtcGFpZ258cHVyY2hhc2VJRHxjaGFubmVsfHNlcnZlcnxzdGF0ZXx6aXB8cGFnZVR5cGUkJyksIHUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE9iamVjdC5rZXlzKHQpLmZpbHRlcihsLnRlc3QuYmluZChsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiBhLnB1c2goJ2V2ZW50cycpLCAoYSA9IGEuY29uY2F0KChlLmxpbmtUcmFja1ZhcnMgfHwgJycpLnNwbGl0KCcsJykpKS5maWx0ZXIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vbmUnICE9PSBlICYmIGUgJiYgdShlLCB0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gbi5jb25jYXQoKGUubGlua1RyYWNrRXZlbnRzIHx8ICcnKS5zcGxpdCgnLCcpKSkuZmlsdGVyKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdOb25lJyAhPT0gZSAmJiB1KGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gPSBuW3RdLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiA9IGZ1bmN0aW9uIChpLCBlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQuZHluYW1pY1ZhcmlhYmxlUHJlZml4IHx8ICdEPSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3ZhbHVlJyA9PT0gZS50eXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvLmV4ZWMoZS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHIgKyAndicgKyBuWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gYy5leGVjKGUudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAodCA9IHIgKyAnYycgKyBhWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2UubmFtZV0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRG93bmxvYWRGaWxlVHlwZXM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRXh0ZXJuYWxGaWx0ZXJzOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0ludGVybmFsRmlsdGVyczogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZXJhcmNoaWVzOiBmdW5jdGlvbiAodCwgZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bZV0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2UubmFtZV0gPSBlLnNlY3Rpb25zLmpvaW4oZS5kZWxpbWl0ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3F1ZXJ5UGFyYW0nID09PSBuW3RdLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpLnBhcnNlKHIubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSA9IGFbblt0XS52YWx1ZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gPSBuW3RdLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5bdF0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pZCAmJiAodCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignOicpKSwgZS52YWx1ZSAmJiAodCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignPScpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW3RdID0gYS5qb2luKCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEgfHwge30sIE9iamVjdC5rZXlzKGEpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbVtlXSwgbiA9IGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gdChpLCBlLCBhKSA6IGlbZV0gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ldmVudHMgJiYgdC5ldmVudHMgJiYgMCA8IHQuZXZlbnRzLmxlbmd0aCAmJiAoaS5ldmVudHMgPSB0LmV2ZW50cyArICcsJyArIGkuZXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhICYmIGEuZXZlbnRzICYmIDAgPCBhLmV2ZW50cy5sZW5ndGgsIG4gPSBkKHQsIGksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIChpLmxpbmtUcmFja1ZhcnMgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwKHQsIGEuZXZlbnRzIHx8IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAoaS5saW5rVHJhY2tFdmVudHMgPSByKSwgcy5sb2dnZXIuaW5mbygnQXBwbHlpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9uIHRyYWNrZXI6ICInICsgSlNPTi5zdHJpbmdpZnkoaSkgKyAnIi4nKSwgT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlXSA9IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9oZWxwZXJzL2xvYWRMaWJyYXJ5LmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4oJ0BhZG9iZS9yZWFjdG9yLWxvYWQtc2NyaXB0JyksIHIgPSBuKCdAYWRvYmUvcmVhY3Rvci13aW5kb3cnKSwgcyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgbyA9IG4oJy4vc2V0dGluZ3NIZWxwZXInKSwgYyA9IG4oJy4vcG9sbEhlbHBlcicpLCBsID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghci5zX2dpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNyZWF0ZSBBcHBNZWFzdXJlbWVudCB0cmFja2VyLCBgc19naWAgZnVuY3Rpb24gbm90IGZvdW5kLicgKyByLkFwcE1lYXN1cmVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nZ2VyLmluZm8oJ0NyZWF0aW5nIEFwcE1lYXN1cmVtZW50IHRyYWNrZXIgd2l0aCB0aGVzZSByZXBvcnQgc3VpdGVzOiAiJyArIHQgKyAnIicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLnNfZ2kodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5saWJyYXJ5Q29kZS5zY29wZVRyYWNrZXJHbG9iYWxseSAmJiAoYS5sb2dnZXIuaW5mbygnU2V0dGluZyB0aGUgdHJhY2tlciBhcyB3aW5kb3cucycpLCByLnMgPSBuKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlLmxpYnJhcnlDb2RlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5MSUJfVFlQRVMuTUFOQUdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goYS5nZXRIb3N0ZWRMaWJGaWxlVXJsKG8uTUFOQUdFRF9MSUJfUEFUSFMuQVBQX01FQVNVUkVNRU5UKSksIG8uaXNBY3Rpdml0eU1hcEVuYWJsZWQoZSkgJiYgdC5wdXNoKGEuZ2V0SG9zdGVkTGliRmlsZVVybChvLk1BTkFHRURfTElCX1BBVEhTLkFDVElWSVRZX01BUCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvLkxJQl9UWVBFUy5DVVNUT006CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKGUubGlicmFyeUNvZGUuc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5MSUJfVFlQRVMuUkVNT1RFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaCgnaHR0cHM6JyA9PT0gci5sb2NhdGlvbi5wcm90b2NvbCA/IGUubGlicmFyeUNvZGUuaHR0cHNVcmwgOiBlLmxpYnJhcnlDb2RlLmh0dHBVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uaXNBdWRpZW5jZU1hbmFnZW1lbnRFbmFibGVkKGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7IG5hbWVzcGFjZTogci5fc2F0ZWxsaXRlLmNvbXBhbnkub3JnSWQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm1vZHVsZVByb3BlcnRpZXMuYXVkaWVuY2VNYW5hZ2VyLmNvbmZpZy52aXNpdG9yU2VydmljZSA9IG4sIHQucHVzaChhLmdldEhvc3RlZExpYkZpbGVVcmwoby5NQU5BR0VEX0xJQl9QQVRIUy5BVURJRU5DRV9NQU5BR0VNRU5UKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5hbGwodShlKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dnZXIuaW5mbygnTG9hZGluZyBzY3JpcHQ6ICcgKyBlKSwgaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5saWJyYXJ5Q29kZS5hY2NvdW50cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5zYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG8uZ2V0UmVwb3J0U3VpdGVzKGUubGlicmFyeUNvZGUuYWNjb3VudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmxvZ2dlci5pbmZvKCdTZXR0aW5nIHRoZSBmb2xsb3dpbmcgcmVwb3J0IHN1aXRlcyBvbiB0aGUgdHJhY2tlcjogIicgKyBuICsgJyInKSwgdC5zYShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sb2dnZXIud2FybignQ2Fubm90IHNldCByZXBvcnQgc3VpdGVzIG9uIHRyYWNrZXIuIGBzYWAgbWV0aG9kIG5vdCBhdmFpbGFibGUuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocltlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dnZXIuaW5mbygnRm91bmQgdHJhY2tlciBsb2NhdGVkIGF0OiAiJyArIGUgKyAnIi4nKSwgcltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lOiAiJyArIGUgKyAnIi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5saWJyYXJ5Q29kZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5MSUJfVFlQRVMuTUFOQUdFRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gby5nZXRSZXBvcnRTdWl0ZXMoZS5saWJyYXJ5Q29kZS5hY2NvdW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC50aGVuKGwuYmluZChudWxsLCBlLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5MSUJfVFlQRVMuUFJFSU5TVEFMTEVEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQudGhlbihjLnBvbGwuYmluZChudWxsLCByLCBlLmxpYnJhcnlDb2RlLnRyYWNrZXJWYXJpYWJsZU5hbWUpKS50aGVuKHAuYmluZChudWxsLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugby5MSUJfVFlQRVMuQ1VTVE9NOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG8uTElCX1RZUEVTLlJFTU9URToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnRoZW4oZi5iaW5kKG51bGwsIGUubGlicmFyeUNvZGUudHJhY2tlclZhcmlhYmxlTmFtZSkpLnRoZW4ocC5iaW5kKG51bGwsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgbGlicmFyeS4gVHlwZSBub3Qgc3VwcG9ydGVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2hlbHBlcnMvZ2VuZXJhdGVWZXJzaW9uLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDgsIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0VVRDRGF0ZSgpLnRvU3RyaW5nKDM2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJzdHIoZS5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihlLmdldFVUQ0hvdXJzKCkgLyB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChlLmdldFVUQ01vbnRoKCkgKyAxICsgMTIgKiBpKGUpKS50b1N0cmluZygzNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUuZ2V0VVRDRnVsbFllYXIoKSAtIDIwMTApLnRvU3RyaW5nKDM2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNOYU4odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0ZSBwcm92aWRlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdMJyArIHModCkgKyByKHQpICsgbih0KSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvaGVscGVycy9wb2xsSGVscGVyLmpzJzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OiBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IG4oJ0BhZG9iZS9yZWFjdG9yLXByb21pc2UnKSwgbyA9IDQwLCBjID0gMjUwLCBsID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubG9nZ2VyLmluZm8oJ0ZvdW5kIHByb3BlcnR5IGxvY2F0ZWQgYXQ6ICInICsgdCArICciXS4nKSwgZShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IGZ1bmN0aW9uIChpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHMoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaVtyXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwoZSwgciwgaVtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAxLCBhID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtyXSAmJiAobChlLCByLCBpW3JdKSwgY2xlYXJJbnRlcnZhbChhKSksIG8gPD0gbiAmJiAoY2xlYXJJbnRlcnZhbChhKSwgdChuZXcgRXJyb3IoJ0JhaWxpbmcgb3V0LiBDYW5ub3QgZmluZCB0aGUgdmFyaWFibGUgbmFtZTogIicgKyByICsgJyJdLicpKSksIG4rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGw6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dnZXIuaW5mbygnV2FpdGluZyBmb3IgdGhlIHByb3BlcnR5IHRvIGJlY29tZSBhY2Nlc3NpYmxlIGF0OiAiJyArIHQgKyAnIl0uJyksIGkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICBvcmdJZDogJ0NDQkM4NzlENTU3MjA3MEU3RjAwMDEwMUBBZG9iZU9yZycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlDb2RlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFuYWdlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdpbmc6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyam9ic2dhbW1hJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyYW1hem9uaHViLWludGVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyYW1hem9uaHViJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uaHJwcm9kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyYW1hem9uaHViLWludGVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyYW1hem9uaHViJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmhyam9ic2JldGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uaHJhbWF6b25odWItaW50ZWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uaHJhbWF6b25odWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uaHJkZXYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVHJhY2tlckdsb2JhbGx5OiAhMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWU6ICclY29udGVudDpQYWdlTmFtZSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3lDb2RlOiAnVVNEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmVyOiAnYW1hem9uaHIuc2Mub210cmRjLm5ldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lubGluZVN0YXRzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrRG93bmxvYWRMaW5rczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0V4dGVybmFsTGlua3M6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua0ludGVybmFsRmlsdGVyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWNlYm9vay5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5rZWRpbi5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0d2l0dGVyLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pvYnMtYmV0YS5pbnRlZy5hbWF6b24uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1hem9uLmpvYnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50LmFtYXpvbi5qb2JzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nU2VydmVyU2VjdXJlOiAnYW1hem9uaHIuc2Mub210cmRjLm5ldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRG93bmxvYWRGaWxlVHlwZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9jeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VwcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2pwZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N2ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwdHgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZGYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4bHN4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemlwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnNkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndnhkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneG1sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3bWEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3YnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdmknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3bXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtcDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtNHYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQYmRlMmY3Y2ExNGU1NDAzOTlkY2MxZjgyMDg4NjBiN2IvJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdjb21tb24tYW5hbHl0aWNzLXBsdWdpbnMnOiB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdDb21tb24gQW5hbHl0aWNzIFBsdWdpbnMnLAogICAgICAgICAgICAgICAgICAgIG1vZHVsZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbW1vbi1hbmFseXRpY3MtcGx1Z2lucy9zcmMvbGliL2FjdGlvbnMvaW5pdGlhbGl6ZS5qcyc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbml0aWFsaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnSW5pdGlhbGl6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCByID0gYS5nZXRTaGFyZWRNb2R1bGUoJ2Fkb2JlLWFuYWx5dGljcycsICdhdWdtZW50LXRyYWNrZXInKSwgbyA9IGEuZ2V0U2hhcmVkTW9kdWxlKCdhZG9iZS1hbmFseXRpY3MnLCAnZ2V0LXRyYWNrZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIChpID0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdm9pZCAwID09PSBvID8gYS5sb2dnZXIuZXJyb3IoJ1RoZSAiQ29tbW9uIEFuYWx5dGljcyBQbHVnaW5zIiBleHRlbnNpb24gcmVxdWlyZXMgdGhhdCB0aGUgIkFkb2JlIEFuYWx5dGljcyIgZXh0ZW5zaW9uIGJlIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBMYXVuY2ggd2ViIHByb3BlcnR5IGFuZCBpdCBpcyBub3QuJykgOiByKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmdxcCB8fCBpLm12IHx8IGkucHQpICYmIChlLnB0ID0gZnVuY3Rpb24gKGUsIHQsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCByID0gKGUgPSBlLnNwbGl0KHQgfHwgJywnKSkubGVuZ3RoOyBpIDwgcjsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID0gdGhpc1tuXShlW2ldLCBhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoaS5mdCB8fCBpLmFwbCB8fCBpLmlsIHx8IGkuZ3RiZSB8fCBpLmd0dGMpICYmIChlLmluTGlzdCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnNwbGl0KG4gfHwgJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdvYmplY3QnICE9IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IGUubGVuZ3RoOyBuIDwgaTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09IGEgJiYgdCA9PT0gZVtuXSB8fCB0LnRvTG93ZXJDYXNlKCkgPT09IGVbbl0udG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGkuZnBvIHx8IGkuZ3BsdCB8fCBpLmdwcHYpICYmIChlLnBfZm8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuX19mbyB8fCAodC5fX2ZvID0ge30pLCAhdC5fX2ZvW2VdICYmICh0Ll9fZm9bZV0gPSB7fSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5nZ2MgJiYgKGUuZ2V0R2VvQ29vcmRpbmF0ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMsIGEgPSAnJywgZSA9IG4uY19yKCdzX2dnYycpLnNwbGl0KCd8JyksIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDUwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW1BZ2U6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUuY29vcmRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0VGltZSh0LmdldFRpbWUoKSArIDE4MDAwMDApLCBuLmNfdygnc19nZ2MnLCBwYXJzZUZsb2F0KGUubGF0aXR1ZGUudG9GaXhlZCg0KSkgKyAnfCcgKyBwYXJzZUZsb2F0KGUubG9uZ2l0dWRlLnRvRml4ZWQoNCkpLCB0KSwgYSA9ICdsYXRpdHVkZT0nICsgcGFyc2VGbG9hdChlLmxhdGl0dWRlLnRvRml4ZWQoNCkpICsgJyB8IGxvbmdpdHVkZT0nICsgcGFyc2VGbG9hdChlLmxvbmdpdHVkZS50b0ZpeGVkKDQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCByID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gJ2Vycm9yIHJldHJpZXZpbmcgZ2VvIGNvb3JkaW5hdGVzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEgPCBlLmxlbmd0aCAmJiAoYSA9ICdsYXRpdHVkZT0nICsgZVswXSArICcgfCBsb25naXR1ZGU9JyArIGVbMV0pLCBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24gJiYgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihpLCByLCB0KSwgJycgPT09IGEgJiYgKGEgPSAnZ2VvIGNvb3JkaW5hdGVzIG5vdCBzdXBwb3J0ZWQnKSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkubnMgJiYgKHdpbmRvdy56ZXJvUGFkID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gcGFyc2VJbnQoZSksIHQgPSBwYXJzZUludCh0KSwgaXNOYU4oZSkgfHwgaXNOYU4odCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0IC0gZS50b1N0cmluZygpLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkoKygwIDwgbiAmJiBuKSkuam9pbignMCcpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgd2luZG93LnJhbmRvbU51bWJlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gJ251bWJlcicgPT0gdHlwZW9mIGUgPyBNYXRoLmFicyhlKSA8IDE3ID8gTWF0aC5yb3VuZChNYXRoLmFicyhlKSkgOiAxNyA6IDEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9ICcxJywgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCArPSAnMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA9IE51bWJlcih0KSwgKHQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkudG9GaXhlZChlKSAqIHQpICsgJycpLmxlbmd0aCAhPT0gZSAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgemVyb1BhZCAmJiAodCA9IHplcm9QYWQodCwgZSkpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cudHdvRGVjaW1hbHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSB8fCB2b2lkIDAgPT09IGUgfHwgaXNOYU4oZSkgPyAwIDogTnVtYmVyKE51bWJlcihlKS50b0ZpeGVkKDIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuYXB2ICYmIChlLmFkZFByb2R1Y3RFdmFyID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgdCAmJiAnJyAhPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9IG4gfHwgITEsIHRoaXMucHJvZHVjdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGkgPSB0aGlzLnByb2R1Y3RzLnNwbGl0KCcsJyksIHIgPSBpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gbiA/IDAgOiByIC0gMTsgbiA8IHI7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gaVtuXS5zcGxpdCgnOycpKVs1XSAmJiAtMSA8IGFbNV0udG9Mb3dlckNhc2UoKS5pbmRleE9mKCdldmFyJykgPyBhWzVdID0gYVs1XSArICd8JyArIGUgKyAnPScgKyB0IDogYVs1XSA/IGFbNV0gPSBlICsgJz0nICsgdCA6IGFbNV0gfHwgKGFbNF0gfHwgKGFbNF0gPSAnJyksIGFbM10gfHwgKGFbM10gPSAnJyksIGFbMl0gfHwgKGFbMl0gPSAnJyksIGFbMV0gfHwgKGFbMV0gPSAnJyksIGFbNV0gPSBlICsgJz0nICsgdCksIGlbbl0gPSBhLmpvaW4oJzsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0cyA9IGkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RzID0gJzs7Ozs7JyArIGUgKyAnPScgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5hcGUgJiYgKGUuYWRkUHJvZHVjdEV2ZW50ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IGlzTmFOKHQpID8gJzEnIDogU3RyaW5nKHQpLCBuID0gbiB8fCAhMSwgYS5ldmVudHMgPSBhLmFwbChhLmV2ZW50cywgZSksIGEucHJvZHVjdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHIgPSBhLnByb2R1Y3RzLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IG4gPyAwIDogci5sZW5ndGggLSAxOyBuIDwgci5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpID0gcltuXS5zcGxpdCgnOycpKVs0XSAmJiBpWzRdLmluY2x1ZGVzKCdldmVudCcpID8gaVs0XSA9IGlbNF0gKyAnfCcgKyBlICsgJz0nICsgdCA6IGlbNV0gPyBpWzRdID0gZSArICc9JyArIHQgOiBpWzRdIHx8IChpWzNdIHx8IChpWzNdID0gJycpLCBpWzJdIHx8IChpWzJdID0gJycpLCBpWzFdIHx8IChpWzFdID0gJycpLCBpWzRdID0gZSArICc9JyArIHQpLCByW25dID0gaS5qb2luKCc7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHJvZHVjdHMgPSByLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wcm9kdWN0cyA9ICc7Ozs7JyArIGUgKyAnPScgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5hcGwgJiYgKGUuYXBsID0gZnVuY3Rpb24gKGUsIHQsIG4sIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgdGhpcy5pbkxpc3QgfHwgJ3N0cmluZycgIT0gdHlwZW9mIHQgfHwgJycgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuIHx8ICcsJywgMSA9PSAoYSA9IGEgfHwgbikgJiYgKGEgPSBuLCBpIHx8IChpID0gMSkpLCAyID09IGEgJiYgMSAhPSBpICYmIChhID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9ICh0ID0gdC5zcGxpdCgnLCcpKS5sZW5ndGgsIHMgPSAwOyBzIDwgcjsgcysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluTGlzdChlLCB0W3NdLCBuLCBpKSB8fCAoZSA9IGUgPyBlICsgYSArIHRbc10gOiB0W3NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGkuY3MgfHwgaS5tdikgJiYgKHdpbmRvdy5jbGVhblN0ciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gKGUgPSAoZSA9IChlID0gKGUgPSBlLnJlcGxhY2UoLzxcLz9bXj5dKyg+fCQpL2csICcnKSkucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSkucmVwbGFjZSgvW1x1MjAxOFx1MjAxOVx1MjAxQV0vZywgJ1wnJykpLnJlcGxhY2UoL1x0Ky9nLCAnJykpLnJlcGxhY2UoL1tcblxyXS9nLCAnICcpOyAtMSA8IGUuaW5kZXhPZignICAnKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUucmVwbGFjZSgvXHNccy9nLCAnICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLnJmbCAmJiAoZS5yZmwgPSBmdW5jdGlvbiAoZSwgdCwgbiwgYSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIHMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhIHx8IG4sIGkgPSAhIWksIG4gPSAoZSA9IGUuc3BsaXQobiB8fCAnLCcpKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IG47IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA8IGVbb10uaW5kZXhPZignOicpICYmICgocyA9IGVbb10uc3BsaXQoJzonKSlbMV0gPSBzWzBdICsgJzonICsgc1sxXSwgZVtvXSA9IHNbMF0pLCAtMSA8IGVbb10uaW5kZXhPZignPScpICYmICgocyA9IGVbb10uc3BsaXQoJz0nKSlbMV0gPSBzWzBdICsgJz0nICsgc1sxXSwgZVtvXSA9IHNbMF0pLCBlW29dICE9PSB0ICYmIHMgPyByLnB1c2goc1sxXSkgOiBlW29dICE9PSB0ID8gci5wdXNoKGVbb10pIDogZVtvXSA9PT0gdCAmJiBpICYmIChzID8gci5wdXNoKHNbMV0pIDogci5wdXNoKGVbb10pLCBpID0gITEpLCBzID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5qb2luKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ndm8gJiYgKGUuZ2V0VmFsT25jZSA9IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9IHQgfHwgJ3NfZ3ZvJywgbiA9IG4gfHwgMCwgYSA9ICdtJyA9PT0gYSA/IDYwMDAwIDogODY0MDAwMDAsIGUgJiYgZSAhPT0gdGhpcy5jX3IodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuc2V0VGltZShpLmdldFRpbWUoKSArIG4gKiBhKSwgdGhpcy5jX3codCwgZSwgMCA9PT0gbiA/IDAgOiBpKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZ3B2ICYmIChlLmdldFByZXZpb3VzVmFsdWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLCBpID0gJycsIHIgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ID0gdCB8fCAnc19ncHYnLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9ICExLCBuID0gbi5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSBhLmV2ZW50cyA/IGEuZXZlbnRzLnNwbGl0KCcsJykgOiAnJywgbyA9IDAsIGMgPSBuLmxlbmd0aDsgbyA8IGM7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gMCwgdSA9IHMubGVuZ3RoOyBsIDwgdTsgbCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5bb10gPT09IHNbbF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gciAmJiAoKHIgPSBuZXcgRGF0ZSgpKS5zZXRUaW1lKHIuZ2V0VGltZSgpICsgMTgwMDAwMCksIGEuY19yKHQpICYmIChpID0gYS5jX3IodCkpLCBlID8gYS5jX3codCwgZSwgcikgOiBhLmNfdyh0LCAnbm8gcHJldmlvdXMgdmFsdWUnLCByKSksIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmdhcHYgJiYgKGUuZ2V0QW5kUGVyc2lzdFZhbHVlID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0gdCB8fCAnc19nYXB2JywgKG4gPSBuIHx8IDApID8gYS5zZXRUaW1lKGEuZ2V0VGltZSgpICsgODY0MDAwMDAgKiBuKSA6IGEuc2V0VGltZShhLmdldFRpbWUoKSArIDE4MDAwMDApLCBlIHx8IChlID0gdGhpcy5jX3IodCkpLCB0aGlzLmNfdyh0LCBlLCBhKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIChpLmZ0IHx8IGkuZ3RiZSB8fCBpLmd0dGMpICYmIChlLmZvcm1hdFRpbWUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEodm9pZCAwID09PSBlIHx8IGlzTmFOKGUpIHx8IE51bWJlcihlKSA8IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiB0ICYmICdkJyA9PT0gdCB8fCAoJ3N0cmluZycgIT0gdHlwZW9mIHQgfHwgIWEuaW5MaXN0KCdoLG0scycsIHQpKSAmJiA4NjQwMCA8PSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSA4NjQwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnZGF5cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpc05hTihuKSA/IDQgOiB0IC8gKG4gKiB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgJ2gnID09PSB0IHx8ICgnc3RyaW5nJyAhPSB0eXBlb2YgdCB8fCAhYS5pbkxpc3QoJ20scycsIHQpKSAmJiAzNjAwIDw9IGUgPyAodCA9IDM2MDAsIGkgPSAnaG91cnMnLCBuID0gaXNOYU4obikgPyA0IDogdCAvIChuICogdCkpIDogJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgJ20nID09PSB0IHx8ICgnc3RyaW5nJyAhPSB0eXBlb2YgdCB8fCAhYS5pbkxpc3QoJ3MnLCB0KSkgJiYgNjAgPD0gZSA/ICh0ID0gNjAsIGkgPSAnbWludXRlcycsIG4gPSBpc05hTihuKSA/IDIgOiB0IC8gKG4gKiB0KSkgOiAodCA9IDEsIGkgPSAnc2Vjb25kcycsIG4gPSBpc05hTihuKSA/IDAuMiA6IHQgLyBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gKGUgPSBNYXRoLnJvdW5kKGUgKiBuIC8gdCkgLyBuICsgJyAnICsgaSkuaW5kZXhPZignMSAnKSAmJiAoZSA9IGUuc3Vic3RyaW5nKDAsIGUubGVuZ3RoIC0gMSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ndHNsdiAmJiAoZS5nZXRUaW1lU2luY2VMYXN0VmlzaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHRoaXMsIHQgPSBuZXcgRGF0ZSgpLCBuID0gdC5nZXRUaW1lKCksIGEgPSBlLmNfcignc190c2x2JykgfHwgMCwgaSA9IE1hdGgucm91bmQoKG4gLSBhKSAvIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2V0VGltZShuICsgNjMwNzIwMDAwMDApLCBlLmNfdygnc190c2x2JywgbiwgdCksIGEgPyAxODAwIDwgaSAmJiBlLmZvcm1hdFRpbWUgPyBlLmZvcm1hdFRpbWUoaSkgOiAnJyA6ICdOZXcgVmlzaXRvcic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmdkc2x2ICYmIChlLmdldERheXNTaW5jZUxhc3RWaXNpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IERhdGUoKSwgdCA9IGUuZ2V0VGltZSgpLCBuID0gdGhpcy5jX3IoJ3NfZHNsdicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc2V0VGltZSh0ICsgOTQ2MDgwMDAwMDApLCB0aGlzLmNfdygnc19kc2x2JywgdCwgZSksIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMTgwMDAwMCA8IChlID0gdCAtIG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgzMTUzNjAwMDAwMCA8IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ01vcmUgdGhhbiBhIHllYXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMjU5MjAwMDAwMCA8IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ01vcmUgdGhhbiAzMCBkYXlzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPCAyNTkyMDAwMDAwICsgMSAmJiA2MDQ4MDAwMDAgPCBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNb3JlIHRoYW4gNyBkYXlzJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPCA2MDQ4MDAwMDAgKyAxICYmIDg2NDAwMDAwIDwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTGVzcyB0aGFuIDcgZGF5cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlIDwgODY0MDAwMDAgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdMZXNzIHRoYW4gMSBkYXknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05ldyBWaXNpdG9yJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZ25yICYmIChlLmdldE5ld1JlcGVhdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMsIG4gPSAnc19ucicgKyAoZSA9IGUgfHwgMzApLCBhID0gbmV3IERhdGUoKSwgaSA9IHQuY19yKG4pLCByID0gaS5zcGxpdCgnLScpLCBzID0gYS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5zZXRUaW1lKHMgKyA4NjQwMDAwMCAqIGUpLCAnJyA9PT0gaSB8fCBzIC0gclswXSA8IDE4MDAwMCAmJiAnTmV3JyA9PT0gclsxXSA/ICh0LmNfdyhuLCBzICsgJy1OZXcnLCBhKSwgJ05ldycpIDogKHQuY193KG4sIHMgKyAnLVJlcGVhdCcsIGEpLCAnUmVwZWF0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmdwbHQgJiYgKGUuZ2V0UGFnZUxvYWRUaW1lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBwZXJmb3JtYW5jZSAmJiBlLnBfZm8oJ3BlcmZvcm1hbmNlJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHBlcmZvcm1hbmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY2xlYXJSZXNvdXJjZVRpbWluZ3MoKSwgJycgIT09IGUuY19yKCdzX3BsdCcpICYmICgwIDwgdC50aW1pbmcubG9hZEV2ZW50RW5kICYmIGNsZWFySW50ZXJ2YWwoZS5waSksIGUuX3BsdExvYWRUaW1lID0gZS5jX3IoJ3NfcGx0JyksIGUuX3BsdFByZXZpb3VzUGFnZSA9IGUuY19yKCdzX3BsdHAnKSwgZS5jX3coJ3NfcGx0JywgJycpLCBlLmNfdygnc19wbHRwJywgJycpKSwgMCA9PT0gdC50aW1pbmcubG9hZEV2ZW50RW5kID8gZS5waSA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wZXJmb3JtYW5jZVdyaXRlRnVsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDI1MCkgOiAwIDwgdC50aW1pbmcubG9hZEV2ZW50RW5kICYmIChlLnB0YyA/IGUucHRjID09PSB0LnRpbWluZy5sb2FkRXZlbnRFbmQgJiYgMSA9PT0gdC5nZXRFbnRyaWVzKCkubGVuZ3RoICYmIChlLnB3cCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wZXJmb3JtYW5jZVdyaXRlUGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCkpIDogZS5wZXJmb3JtYW5jZVdyaXRlRnVsbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wZXJmb3JtYW5jZVdyaXRlRnVsbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdGhpcywgdCA9IHBlcmZvcm1hbmNlLnRpbWluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCB0LmxvYWRFdmVudEVuZCAmJiAoY2xlYXJJbnRlcnZhbChlLnBpKSwgJycgPT09IGUuY19yKCdzX3BsdCcpICYmIChlLmNfdygnc19wbHQnLCBlLnBlcmZvcm1hbmNlQ2hlY2sodC5sb2FkRXZlbnRFbmQsIHQubmF2aWdhdGlvblN0YXJ0KSksIGUuY193KCdzX3BsdHAnLCBlLnBhZ2VOYW1lKSkpLCBlLnB0YyA9IHQubG9hZEV2ZW50RW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnBlcmZvcm1hbmNlV3JpdGVQYXJ0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLCB0ID0gcGVyZm9ybWFuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgdC5nZXRFbnRyaWVzKCkubGVuZ3RoICYmIChlLnBwZmUgPT09IHQuZ2V0RW50cmllcygpLmxlbmd0aCA/IGNsZWFySW50ZXJ2YWwoZS5wd3ApIDogZS5wcGZlID0gdC5nZXRFbnRyaWVzKCkubGVuZ3RoKSwgJycgPT09IGUuY19yKCdzX3BsdCcpICYmIChlLmNfdygnc19wbHQnLCAoKHQuZ2V0RW50cmllcygpW3QuZ2V0RW50cmllcygpLmxlbmd0aCAtIDFdLnJlc3BvbnNlRW5kIC0gdC5nZXRFbnRyaWVzKClbMF0uc3RhcnRUaW1lKSAvIDEwMDApLnRvRml4ZWQoMikpLCBlLmNfdygnc19wbHRwJywgZS5wYWdlTmFtZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnBlcmZvcm1hbmNlQ2hlY2sgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gZSAmJiAwIDw9IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgLSB0IDwgNjAwMDAgJiYgMCA8PSBlIC0gdCA/IHBhcnNlRmxvYXQoKGUgLSB0KSAvIDEwMDApLnRvRml4ZWQoMikgOiA2MDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZ3BuICYmICh3aW5kb3cuZ2V0UGFnZU5hbWUgPSBmdW5jdGlvbiAoZSwgdCwgbiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBsb2NhdGlvbi5ob3N0bmFtZSwgciA9IGxvY2F0aW9uLnBhdGhuYW1lLnN1YnN0cmluZygxKS5zcGxpdCgnLycpLCBzID0gci5sZW5ndGgsIG8gPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCcmJyksIGMgPSBvLmxlbmd0aCwgbCA9IGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLnNwbGl0KCcmJyksIHUgPSBsLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID0gYSB8fCAnfCcsIGUgPSBlIHx8IGksIHQgPSB0IHx8ICcnLCBuID0gbiB8fCAnJywgMSA9PT0gcyAmJiAnJyA9PT0gclswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSArIGEgKyAnaG9tZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgKyBhICsgZGVjb2RlVVJJQ29tcG9uZW50KHJbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgKDEgIT09IGMgfHwgJycgIT09IG9bMF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocyA9IChyID0gdC5zcGxpdCgnLCcpKS5sZW5ndGgsIGkgPSAwOyBpIDwgczsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSAwOyB0IDwgYzsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJbaV0gPT09IG9bdF0uc3BsaXQoJz0nKVswXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlICsgYSArIGRlY29kZVVSSUNvbXBvbmVudChvW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmICgxICE9PSB1IHx8ICcnICE9PSBsWzBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG8gPSAobiA9IG4uc3BsaXQoJywnKSkubGVuZ3RoLCBpID0gMDsgaSA8IG87IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IHU7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuW2ldID09PSBsW3RdLnNwbGl0KCc9JylbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZSArIGEgKyBkZWNvZGVVUklDb21wb25lbnQobFt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdWJzdHJpbmcoZS5sZW5ndGggLSBhLmxlbmd0aCkgPT09IGEgPyBlLnN1YnN0cmluZygwLCBlLmxlbmd0aCAtIGEubGVuZ3RoKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmdybCAmJiAod2luZG93LmdldFJlc3BvbnNpdmVMYXlvdXQgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaXNOYU4oZSkgfHwgaXNOYU4odCkgfHwgaXNOYU4obikgfHwgdCA8IGUgfHwgbiA8IHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUgPCB0ICYmIGEgPD0gdCA/IGEgPD0gZSA/ICdwaG9uZSBwb3J0cmFpdCBsYXlvdXQnIDogJ3Bob25lIGxhbmRzY2FwZSBsYXlvdXQnIDogYSA8PSB0ID8gJ3Bob25lIGxheW91dCcgOiBhIDw9IG4gPyAndGFibGV0IGxheW91dCcgOiAnZGVza3RvcCBsYXlvdXQnKSArICc6JyArIGEgKyAneCcgKyAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ncXAgJiYgKGUuZ2V0UXVlcnlQYXJhbSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMsIGEgPSAnJywgciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gKHQgPSAodCA9IHQuc3BsaXQoJz8nKS5qb2luKCcmJykpLnNwbGl0KCcjJykuam9pbignJicpKS5pbmRleE9mKCcmJyksIGEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKC0xIDwgbiB8fCB0LmluZGV4T2YoJz0nKSA+IG4pICYmIChuID0gdC5zdWJzdHJpbmcobiArIDEpLCBhID0gaS5wdChuLCAnJicsICdncHZhbCcsIGUpKSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzID0gKGUgPSBlLnNwbGl0KCcsJykpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpLmdwdmFsID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5zcGxpdCgnPScpLCBhID0gblswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID0gIW5bMV0gfHwgblsxXSwgdC50b0xvd2VyQ2FzZSgpID09IGEudG9Mb3dlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nID09IHR5cGVvZiBuID8gbiA6IHRoaXMudW5lc2NhcGUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQgPSB0IHx8ICcnLCBuID0gKG4gfHwgKGkucGFnZVVSTCA/IGkucGFnZVVSTCA6IGxvY2F0aW9uLmhyZWYpKSArICcnLCAoNCA8IHQubGVuZ3RoIHx8IC0xIDwgdC5pbmRleE9mKCc9JykpICYmIG4gJiYgbi5sZW5ndGggPCA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuLCBuID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgczsgYysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiAobyA9IHIoZVtjXSwgbikpID8gKG8gPSAtMSA8IG8uaW5kZXhPZignIycpID8gby5zdWJzdHJpbmcoMCwgby5pbmRleE9mKCcjJykpIDogbywgYSArPSBhID8gdCArIG8gOiBvKSA6IGEgPSAnJyA9PT0gYSA/IG8gOiBhICsgKHQgKyBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ndHAgJiYgKHdpbmRvdy5nZXRUaW1lUGFydGluZyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSA/IHZvaWQgMCA6IGUgfHwgJ0V0Yy9HTVQnLCBlID0gbmV3IERhdGUoKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLVVTJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVab25lOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXI6ICdudW1lcmljJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5OiAnbnVtZXJpYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAneWVhcj0nICsgKGUgPSAvKFthLXpBLVpdKykuKj8oW2EtekEtWl0rKS4qPyhbMC05XSspLio/KFswLTldKykoLio/KShbMC05XSkoLiopLy5leGVjKGUpKVs0XSArICcgfCBtb250aD0nICsgZVsyXSArICcgfCBkYXRlPScgKyBlWzNdICsgJyB8IGRheT0nICsgZVsxXSArICcgfCB0aW1lPScgKyAoZVs2XSArIGVbN10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ndGJlICYmIChlLmdldFRpbWVCZXR3ZWVuRXZlbnRzID0gZnVuY3Rpb24gKGUsIHQsIG4sIGEsIGksIHIsIHMsIG8sIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSAmJiB2b2lkIDAgIT09IHQgJiYgJ3N0cmluZycgPT0gdHlwZW9mIG4gJiYgdm9pZCAwICE9PSBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgfHwgJ3NfdGJlJywgciA9IGlzTmFOKHIpID8gMSA6IE51bWJlcihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9ICExLCBkID0gITEsIHAgPSBlLnNwbGl0KCcsJyksIGYgPSBuLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMgPyBjLnNwbGl0KCcsJykgOiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtLCBnID0gbC5jX3IoaSksIGIgPSBuZXcgRGF0ZSgpLCB2ID0gYi5nZXRUaW1lKCksIGggPSBuZXcgRGF0ZSgpLCB5ID0gMDsgeSA8IGMubGVuZ3RoOyArK3kpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLmluTGlzdChsLmV2ZW50cywgY1t5XSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5zZXREYXRlKGguZ2V0RGF0ZSgpIC0gMSksIHZvaWQgbC5jX3coaSwgJycsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaC5zZXRUaW1lKGguZ2V0VGltZSgpICsgODY0MDAwMDAgKiByKSwgeSA9IDA7IHkgPCBwLmxlbmd0aCAmJiAhdSAmJiAhMCAhPT0gKHUgPSBsLmluTGlzdChsLmV2ZW50cywgcFt5XSkpOyArK3kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBmLmxlbmd0aCAmJiAhZCAmJiAhMCAhPT0gKGQgPSBsLmluTGlzdChsLmV2ZW50cywgZlt5XSkpOyArK3kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxID09PSBwLmxlbmd0aCAmJiAxID09PSBmLmxlbmd0aCAmJiBlID09PSBuICYmIHUgJiYgZCA/IChnICYmIChtID0gKHYgLSBnKSAvIDEwMDApLCBsLmNfdyhpLCB2LCByID8gaCA6IDApKSA6ICghdSB8fCAxICE9IHQgJiYgZyB8fCBsLmNfdyhpLCB2LCByID8gaCA6IDApLCBkICYmIGcgJiYgKG0gPSAoYi5nZXRUaW1lKCkgLSBnKSAvIDEwMDAsICEwID09PSBhICYmIChoLnNldERhdGUoaC5nZXREYXRlKCkgLSAxKSwgbC5jX3coaSwgJycsIGgpKSkpLCBtID8gbC5mb3JtYXRUaW1lKG0sIHMsIG8pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmd0dGMgJiYgKGUuZ2V0VGltZVRvQ29tcGxldGUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdG9wJyA9PT0gKGUgPSBlID8gZS50b0xvd2VyQ2FzZSgpIDogJ3N0YXJ0JykgfHwgJ3N0YXJ0JyA9PT0gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0IHx8ICdzX2d0dGMnLCBuID0gbiB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcywgaSA9IGEuY19yKHQpLCByID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0YXJ0JyAhPT0gZSB8fCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RvcCcgPT09IGUgJiYgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gTWF0aC5yb3VuZCgoci5nZXRUaW1lKCkgLSBpKSAvIDEwMDApLCBhLmNfdyh0LCAnJywgMCksIGEuZm9ybWF0VGltZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jX3codCwgci5nZXRUaW1lKCksIG4gPyBuZXcgRGF0ZShyLmdldFRpbWUoKSArIDg2NDAwMDAwICogbikgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuZ3ZkICYmIChlLmdldFZpc2l0RHVyYXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBEYXRlKCksIHQgPSBlLmdldFRpbWUoKSwgbiA9IHRoaXMuY19yKCdzX2R1cicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzTmFOKG4pIHx8IDE4MDAwMDAgPCB0IC0gbikgJiYgKG4gPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdCAtIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zZXRUaW1lKHQgKyAxODAwMDAwKSwgdGhpcy5jX3coJ3NfZHVyJywgbiArICcnLCBlKSwgMCA9PT0gYSA/ICdmaXJzdCBoaXQgb2YgdmlzaXQnIDogMCA9PT0gKGEgPSBNYXRoLmZsb29yKGEgLyA2MDAwMCkpID8gJ2xlc3MgdGhhbiBhIG1pbnV0ZScgOiAxID09PSBhID8gJzEgbWludXRlJyA6IGEgKyAnIG1pbnV0ZXMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaS5ndm4gJiYgKGUuZ2V0VmlzaXROdW0gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzLCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTihlKSAmJiAoMCB8IHBhcnNlRmxvYXQoZSkpID09PSBwYXJzZUZsb2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9IGUgfHwgMzY1LCAnYm9vbGVhbicgPT0gdHlwZW9mICh0ID0gdCA/ICEhdCA6ICEhYShlKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCByID0gZW5kT2ZEYXRlUGVyaW9kKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLmNfcignc192bmMnICsgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gbi5jX3IoJ3Nfdm5jJyArIGUpLnNwbGl0KCcmdm49JyksIG8gPSBzWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmNfcignc19pdmMnKSA/IG8gPyAoci5zZXRUaW1lKGkgKyAxODAwMDAwKSwgbi5jX3coJ3NfaXZjJywgITAsIHIpLCBvKSA6ICd1bmtub3duIHZpc2l0IG51bWJlcicgOiB2b2lkIDAgIT09IG8gPyAobysrLCBhID0gdCAmJiBhKGUpID8gaSArIDg2NDAwMDAwICogZSA6IHNbMF0sIHIuc2V0VGltZShhKSwgbi5jX3coJ3Nfdm5jJyArIGUsIGEgKyAnJnZuPScgKyBvLCByKSwgci5zZXRUaW1lKGkgKyAxODAwMDAwKSwgbi5jX3coJ3NfaXZjJywgITAsIHIpLCBvKSA6IChhID0gYShlKSA/IGkgKyA4NjQwMDAwMCAqIGUgOiBlbmRPZkRhdGVQZXJpb2QoZSkuZ2V0VGltZSgpLCBuLmNfdygnc192bmMnICsgZSwgYSArICcmdm49MScsIHIpLCByLnNldFRpbWUoaSArIDE4MDAwMDApLCBuLmNfdygnc19pdmMnLCAhMCwgciksICcxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdpbmRvdy5lbmRPZkRhdGVQZXJpb2QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgpLCBuID0gaXNOYU4oZSkgPyAwIDogTWF0aC5mbG9vcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnNldEhvdXJzKDIzKSwgdC5zZXRNaW51dGVzKDU5KSwgdC5zZXRTZWNvbmRzKDU5KSwgJ3cnID09PSBlICYmIChuID0gNiAtIHQuZ2V0RGF5KCkpLCAnbScgPT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gdC5nZXRNb250aCgpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHQuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbmV3IERhdGUoYSB8fCAxOTcwLCBuIHx8IDEsIDApLmdldERhdGUoKSAtIHQuZ2V0RGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuc2V0RGF0ZSh0LmdldERhdGUoKSArIG4pLCAneScgPT09IGUgJiYgKHQuc2V0TW9udGgoMTEpLCB0LnNldERhdGUoMzEpKSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkubXYgJiYgKGUubWFuYWdlVmFycyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHQgfHwgJycsIG4gPSBuIHx8ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIHIgPSAncGFnZU5hbWUscHVyY2hhc2VJRCxjaGFubmVsLHNlcnZlcixwYWdlVHlwZSxjYW1wYWlnbixzdGF0ZSx6aXAsZXZlbnRzLHByb2R1Y3RzLHRyYW5zYWN0aW9uSUQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDc2OyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSAnLHByb3AnICsgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAyNTE7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9ICcsZVZhcicgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDY7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9ICcsaGllcicgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDQ7IGkrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByICs9ICcsbGlzdCcgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpIGluIGEuY29udGV4dERhdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSAnLGNvbnRleHREYXRhLicgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gdC5yZXBsYWNlKCdbXCcnLCAnLicpLnJlcGxhY2UoJ1wnXScsICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgwID09IG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4IGluICh0ID0gdC5zcGxpdCgnLCcpLCBuID0gci5zcGxpdCgnLCcpLCByID0gJycsIHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5IGluICgnc3RyaW5nJyA9PSB0eXBlb2YgdFt4XSAmJiAtMSA8IHRbeF0uaW5kZXhPZignY29udGV4dERhdGEnKSAmJiAodFt4XSA9ICdjb250ZXh0RGF0YS4nICsgdFt4XS5zcGxpdCgnXCcnKVsxXSksIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbeF0gPT09IG5beV0gJiYgKG5beV0gPSAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSBuW3ldID8gJywnICsgblt5XSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wdChyLCAnLCcsIGUsIDApLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCcnICE9PSB0IHx8ICFuIHx8IChhLnB0KHIsICcsJywgZSwgMCksIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5sb3dlckNhc2VWYXJzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0gJiYgKCdldmVudHMnICE9PSBlICYmIC0xID09PSBlLmluZGV4T2YoJ2NvbnRleHREYXRhJykgPyAodFtlXSA9IHRbZV0udG9TdHJpbmcoKSwgMCAhPT0gdFtlXS5pbmRleE9mKCdEPScpICYmICh0W2VdID0gdFtlXS50b0xvd2VyQ2FzZSgpKSkgOiAtMSA8IGUuaW5kZXhPZignY29udGV4dERhdGEnKSAmJiAoZSA9IGUuc3Vic3RyaW5nKGUuaW5kZXhPZignLicpICsgMSksIHQuY29udGV4dERhdGFbZV0gJiYgKHQuY29udGV4dERhdGFbZV0gPSB0LmNvbnRleHREYXRhW2VdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcy5jbGVhblN0ciA9IHdpbmRvdy5jbGVhblN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGhvc3RlZExpYkZpbGVzQmFzZVVybDogJ2h0dHBzOi8vYXNzZXRzLmFkb2JlZHRtLmNvbS9leHRlbnNpb25zL0VQNjI3YTI1YzUxOTY3NDA1NTkwY2NjNTFiYmExMDFkMDcvJwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBjb21wYW55OiB7IG9yZ0lkOiAnQ0NCQzg3OUQ1NTcyMDcwRTdGMDAwMTAxQEFkb2JlT3JnJyB9LAogICAgICAgICAgICBwcm9wZXJ0eTogewogICAgICAgICAgICAgICAgbmFtZTogJ0FtYXpvbiBIUicsCiAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgIGRvbWFpbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbi5qb2JzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2JpenphYm8uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbmNhcmVlcmRheS5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAnZXZlbnRzLmJpenphYm8uY29tJwogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkVmFyc1JldHVybkVtcHR5OiAhMSwKICAgICAgICAgICAgICAgICAgICBydWxlQ29tcG9uZW50U2VxdWVuY2luZ0VuYWJsZWQ6ICExCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHJ1bGVzOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGZhMzdmZjRiNmY1MDQ1OGI5MzFjZTM1NDY4M2I4ZmI5JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSm9iQXBwbGljYXRpb246UmVsYXRlZEpvYkNsaWNrcycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnUmVsYXRlZEpvYkNsaWNrcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQ2F0ZWdvcnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkRpdmlzaW9uJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JDb3VudHJ5JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1OCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjphcHBsaWNhdGlvblR5cGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjYwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUpvYiBSb2xlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI4MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpoaXJpbmdZZWFyJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMjYnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUmVsYXRlZEpvYkNsaWNrcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYzI2MmNiOTUzZmYyNDQ3N2JjZjIxMTYyYjEyYThhNTInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpTb2NpYWxMb2dpbkV4aXN0aW5nQWNjb3VudExpbmtlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRTb2NpYWxMb2dpbkV4aXN0aW5nQWNjb3VudExpbmtlZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnVzZXJUeXBlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnVzZXJJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY2FtcGFpZ24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDQwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJXBhc3Nwb3J0RXZlbnRQYXJhbXMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NzMnIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiAnJWNvbnRlbnQ6U2l0ZVNlY3Rpb24lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxiOWJhZWE4YmU5ZWI0NjcyOGZlNWY5N2FlNTI3ZjM0MycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Vuc3Vic2NyaWJlOmFscmVhZHlVbnN1YnNjcmliZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2FscmVhZHlVbnN1YnNjcmliZWQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjM5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IFN5c3RlbSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclT3B0IE91dDogU291cmNlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0MScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVPcHQgT3V0OiBCZWFtZXJ5IENhbXBhaWduIElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVPcHQgT3V0OiBCZWFtZXJ5IENvbnZlcnNhdGlvbiBJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NTQnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnQWxyZWFkeSBVbnN1YnNjcmliZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGM4OTZmMmNlMWUwYzQ4MDk4MDc4ZDNjODEzNzAzMTVlJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnam9iRGVzY3JpcHRpb246am9iVmlldycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvdmFsdWVDb21wYXJpc29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogJ2VxdWFscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VJbnNlbnNpdGl2ZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRPcGVyYW5kOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodE9wZXJhbmQ6ICdBbWF6b24uam9icyB8IEpvYiBEZXRhaWxzIFBhZ2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lmxpc3QxID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ3JlbGF0ZWRKb2JJZCcpLCAxID09IGRpZ2l0YWxEYXRhLmpvYi5yZWxhdGVkSm9iSWQubGVuZ3RoICYmICh0LmV2ZW50cyA9IHQuYXBsKHQuZXZlbnRzLCAnZXZlbnQxMjQnKSksIHQubGlua1RyYWNrVmFycyA9ICdsaXN0MScsIHQubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50MTI0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JGaW5kaW5nTWV0aG9kJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JDYXRlZ29yeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iRGl2aXNpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjI4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6cGVyc29uSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDUnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZjU1MDEwNjE3MzJkNGU5ODkzYjE5MTMyZGM5NjdkMGUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdqb2JBcHBsaWNhdGlvbjpqb2JBcHBsaWNhdGlvbkNvbXBsZXRlLSBTdWNjZXNzIFBhZ2UnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2pvYkFwcGxpY2F0aW9uQ29tcGxldGUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYk5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjI4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6cGVyc29uSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjMzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkFwcGxpY2F0aW9uOmFwcGxpY2F0aW9uSWQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjM3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWV2ZW50OmpvYkNvdW50cnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkJ1c2luZXNzUHVycG9zZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50OScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdKb2IgQXBwbGljYXRpb24gQ29tcGxldGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGU1ZWZmNzZjZWIyOTRlZTI4ZmRiMzgyNDBkOWFiMGM3JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUGFnZSBCb3R0b20gLSBTZW5kIEJlYWNvbicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDIwMAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3BhdGguanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnL3NlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwyMmM4MzExMDY4N2I0MTNmYmRlNTBmYTNiZjg0ZDhiNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Vuc3Vic2NyaWJlOnVuc3Vic2NyaWJlJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICd1bnN1YnNjcmliZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclT3B0IE91dDogU3lzdGVtJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVPcHQgT3V0OiBTb3VyY2UlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ2FtcGFpZ24gSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ29udmVyc2F0aW9uIElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ1MycgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdVbnN1YnNjcmliZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNDk3ZjNhNjBlZDhlNGE0YjhlYzIwODEwNzgwZWQyYjYnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdqb2JBcHBsaWNhdGlvbjpqb2JXaXRoZHJhdycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZGFzaF93aXRoZHJhd193aXRoZHJhdycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQ2F0ZWdvcnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkRpdmlzaW9uJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVldmVudDpqb2JDb3VudHJ5JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdKb2IgQXBwbGljYXRpb24gV2l0aGRyYXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGJmYTM5M2RiZDVlZjQ3NDhiMmUzN2Q1MjQ3NTQ1MTNmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29tbXVuaWNhdGlvblByZWZlcmVuY2VzOnN1YnNjcmliZScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnY29tbXVuaWNhdGlvblByZWZlcmVuY2VzU3Vic2NyaWJlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclT3B0IE91dDogU3lzdGVtJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVPcHQgT3V0OiBTb3VyY2UlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ2FtcGFpZ24gSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ29udmVyc2F0aW9uIElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ1MicgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDb21tdW5pY2F0aW9uIFByZWZlcmVuY2VzIFN1YnNjcmliZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOTkyMTIyY2UyZjg5NDE2MTkxMjVjYWJjMDA0ZDQxZTInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdqb2JBcHBsaWNhdGlvbjpqb2IgcmVzdW1lJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdkYXNoX3Jlc3VtZV9hcHAnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYk5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkNhdGVnb3J5JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JEaXZpc2lvbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpwZXJzb25JRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclZXZlbnQ6am9iQ291bnRyeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQnVzaW5lc3NQdXJwb3NlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQyNycgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdKb2IgQXBwbGljYXRpb24gLSBSZXN1bWUgdGhlIGZsb3cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGNiZGJjNTU5NzA2NzQ3MGVhODZmYTQ0ZTQ3OGEyYjNmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSm9iIEFwcGxpY2F0aW9uIDogQXBwbHkgTm93IChQYWdlIExvYWQpJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdqb2JTdGFydCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNDAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpwZXJzb25JRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclZXZlbnQ6am9iQ291bnRyeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQnVzaW5lc3NQdXJwb3NlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQyJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBBcHBsaWNhdGlvbiBTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOGFlMTlhMmRkMzEyNDFkNWE3YTY2YTc2ZjMzNjVkMzUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdqb2JBcGxpY2F0aW9uRmxvdycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnYXBwX2Zvcm1fc2F2ZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5saW5rVHJhY2tWYXJzID0gJ2VWYXIxLGVWYXIyLGVWYXIzNCxlVmFyMzUsZVZhcjM2LGVWYXIxMCxldmVudHMnLCB0LmxpbmtUcmFja0V2ZW50cyA9ICdldmVudDEzJywgdC5lVmFyMzQgPSBfc2F0ZWxsaXRlLmdldFZhcignRm9ybSA6IGZvcm1JbmRleCcpICsgMSwgdC5lVmFyMzUgPSBfc2F0ZWxsaXRlLmdldFZhcignRm9ybSA6IGZvcm1UaXRsZScpLCB0LmVWYXIzNiA9IHQuZVZhcjM0ICsgJ3wnICsgdC5lVmFyMzUsICdSRVNVTUUnID09IF9zYXRlbGxpdGUuZ2V0VmFyKCdGb3JtIDogZm9ybVRpdGxlJykgJiYgKHQuZVZhcjEwID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ2pvYkFwcGxpY2F0aW9uOnJlc3VtZVR5cGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYk5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjI4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6cGVyc29uSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjM3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWV2ZW50OmpvYkNvdW50cnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDEzJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBBcHBsaWNhdGlvbiBGbG93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw3ZDk1MjkwYWVjNDk0ZTZmYTBhNTE3ODU2M2MwNTlhNycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0Zvcm06Rm9ybVN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZm9ybVN1Ym1pdCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVGb3JtOiBGb3JtTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQzOScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdGb3JtIFN1Ym1pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMDc3ZGU4ZjQxYzU2NDc4MGEyNTc3NmZjYjFkNDAxNjknLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdGb3JtOkZvcm1TdGFydCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZm9ybVN0YXJ0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUZvcm06IEZvcm1OYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDEwJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0Zvcm0gU3RhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDIzMTY5MzY1ZDE1ZTQxNzhhNWMzMjI2OThjYzZjMDUxJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnSm9iU2VhcmNoOlNvcnRpbmcnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3NlYXJjaFNvcnRCeScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVKb2JTZWFyY2g6U29ydEJ5JScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDM2JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBTZWFyY2ggU29ydGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZmJmYmZjZjA1MDA1NDAzZWE3YTRhNjc3NGM0OWZiZWYnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdqb2JEZXNjcmlwdGlvbjpqb2JTaGFyZScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnam9iU2hhcmUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JTaGFyZVNvY2lhbE1lZGlhJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDYnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnSm9iIFNoYXJlIG9uIFNvY2lhbCBNZWRpYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYmZkNjc1ZTNlMjU1NDI0MmE3YzcyNDJmZTBmZGM3N2InLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2JBcHBsaWNhdGlvbjpKb2JBcHBseScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnYXBwbGljYXRpb25TdGFydCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQ2F0ZWdvcnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkRpdmlzaW9uJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ4JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBBcHBseScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMTY3MWU4MjQ2OTcwNDJmMmFhMTdiZGY5Y2U1YTE1M2UnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2JTZWFyY2g6RmlsdGVyJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdzZWFyY2hGaWx0ZXJCeScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVKb2JTZWFyY2g6RmlsdGVyQnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MzMnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnSm9iIFNlYXJjaCBGaWx0ZXJpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGI2OTk2NzQ2ZjgwODQwMzhiNWZkZWUzMGEwNTU2MzE3JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVXNlcjogUmVnaXN0cmF0aW9uIFN0YXJ0JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdyZWdpc3RyYXRpb25TdGFydCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTcnIH1dIH0gfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUmVnaXN0cmF0aW9uIFN0YXJ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxlNTVjYzBmMTdlZDM0OWJmOGU0ZDQ2MjBkNDg4NzU2NCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0NaIExhbmRpbmcgUGFnZSAtIFJNSyBTS0xJSyB0YWcnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdodHRwczovL3d3dy5hbWF6b24uam9icy9jcy9sYW5kaW5nX3BhZ2VzL3ByYWNlJyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnXG48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+XG5cdC8qIDwhW0NEQVRBWyAqL1xuXHR2YXIgc2V6bmFtX3JldGFyZ2V0aW5nX2lkID0gNTYzMDY7XG5cdC8qIF1dPiAqL1xuPC9zY3JpcHQ+XG48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIvL2MuaW1lZGlhLmN6L2pzL3JldGFyZ2V0aW5nLmpzIj48L3NjcmlwdD5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNGZkNzM1ZDI0MWUzNDA1NWJkMWU4OTYwMTljOTFhZDUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb21tdW5pY2F0aW9uUHJlZmVyZW5jZXM6dW5zdWJzY3JpYmUnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2NvbW11bmljYXRpb25QcmVmZXJlbmNlc1Vuc3Vic2NyaWJlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclT3B0IE91dDogU3lzdGVtJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVPcHQgT3V0OiBTb3VyY2UlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ2FtcGFpZ24gSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU9wdCBPdXQ6IEJlYW1lcnkgQ29udmVyc2F0aW9uIElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ1MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDb21tdW5pY2F0aW9uIFByZWZlcmVuY2VzIFVuc3Vic2NyaWJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwwYjM4NjFiM2U5Mzg0ZjA0YTkwYzZiNDljYjU0ODM2OCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2pvYkFwcGxpY2F0aW9uOmV4aXRBcHBsaWNhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZXhpdEFwcGxpY2F0aW9uJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmxpbmtUcmFja1ZhcnMgPSAnZVZhcjEsZVZhcjIsZVZhcjM0LGVWYXIzNSxlVmFyMzYsZXZlbnRzJywgdC5saW5rVHJhY2tFdmVudHMgPSAnZXZlbnQxMicsIHQuZVZhcjEgPSBfc2F0ZWxsaXRlLmdldFZhcignam9iRGVzY3JpcHRpb246am9iSUQnKSwgdC5lVmFyMiA9IF9zYXRlbGxpdGUuZ2V0VmFyKCdqb2JEZXNjcmlwdGlvbjpqb2JOYW1lJyksIHQuZVZhcjM0ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0Zvcm0gOiBmb3JtSW5kZXgnKSArIDEsIHQuZVZhcjM1ID0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0Zvcm0gOiBmb3JtVGl0bGUnKSwgdC5lVmFyMzYgPSB0LmVWYXIzNCArICd8JyArIHQuZVZhcjM1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpwZXJzb25JRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclZXZlbnQ6am9iQ291bnRyeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTInIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnSm9iIEFwcGxpY2F0aW9uIC0gRXhpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMY2RiZWZjZjhhY2UzNGEwNzkxMjA0N2E4Y2Q5NTkwYzInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb250ZW50OmFsbFBhZ2VzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNDAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5zX2xvYWRUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQgPSB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS50aW1pbmcgOiAwLCBuID0gdCA/IHQucmVxdWVzdFN0YXJ0IDogd2luZG93LmluSGVhZFRTIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfbG9hZFQgPSBuID8gTWF0aC5yb3VuZCgoZSAtIG4pIC8gMTAwKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc19sb2FkVDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRpZ2l0YWxEYXRhLCBudWxsLCAnXHQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFZpc2l0b3IuZ2V0SW5zdGFuY2UoJ0NDQkM4NzlENTU3MjA3MEU3RjAwMDEwMUBBZG9iZU9yZycpLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICYmICh0LmVWYXI2ID0gYSksIHQucHJvcDUgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgVmlzaXRvciA/ICdWaXNpdG9yQVBJIFByZXNlbnQnIDogJ1Zpc2l0b3JBUEkgTWlzc2luZycsIHQucHJvcDIgPSAnRD10JywgMCA8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJzQwNCcpICYmICh0LnBhZ2VUeXBlID0gJ2Vycm9yUGFnZScpLCB0LmVWYXIxNSA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgdC5lVmFyMTYgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIHQucHJvcDEzID0gd2luZG93LmxvY2F0aW9uLmhyZWYsIHQucHJvcDE3ID0gJ0Q9aicsIHQucHJvcDE4ID0gZG9jdW1lbnQudGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGxvY2F0aW9uLnNlYXJjaC5zcGxpdCgnPScpLCByID0gaVswXS5zdWJzdHIoMSwgaVswXS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcm9wMTkgPSByLCB0LnVzZVBsdWdpbnMgPSAhMCwgdC5kb1BsdWdpbnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJvcDE0ID0gbigpLCBlLlV0aWwuZ2V0UXVlcnlQYXJhbSgndXRtX21lZGl1bScpICYmIChlLmVWYXIxNyA9IGUuVXRpbC5nZXRRdWVyeVBhcmFtKCd1dG1fbWVkaXVtJykgKyAnOicgKyBlLlV0aWwuZ2V0UXVlcnlQYXJhbSgndXRtX3NvdXJjZScpICsgJzonICsgZS5VdGlsLmdldFF1ZXJ5UGFyYW0oJ3V0bV90ZXJtJykgKyAnOicgKyBlLlV0aWwuZ2V0UXVlcnlQYXJhbSgndXRtX2NvbnRlbnQnKSksIGUuZVZhcjE3ID0gZS5nZXRWYWxPbmNlKGUuZVZhcjE3LCAnc19lVmFyMTcnKSwgZGlnaXRhbERhdGEucGFnZS5zZWFyY2ggJiYgJ1plcm8nID09IGRpZ2l0YWxEYXRhLnBhZ2Uuc2VhcmNoLm5vT2ZSZXN1bHRzICYmIChlLmV2ZW50cyA9IGUuYXBsKGUuZXZlbnRzLCAnZXZlbnQzNCcsICcsJywgMikpLCBlLnByb3AyNSA9IGUuZ2V0RGF5c1NpbmNlTGFzdFZpc2l0KCdzX2x2JyksIGUucHJvcDIyID0gZS5nZXROZXdSZXBlYXQoMzAsICdzX2dldE5ld1JlcGVhdCcpLCBlLnByb3AxMCA9IGUuZ2V0UHJldmlvdXNWYWx1ZShlLnBhZ2VOYW1lLCAnZ3B2JywgJycpLCBlLnByb3AxMCAmJiAoZS5lVmFyMjUgPSAnRD1jMTAnLCBlLnByb3AxMSA9IGUuZ2V0UGVyY2VudFBhZ2VWaWV3ZWQoKSwgZS5wcm9wMTAgJiYgJ25vIHZhbHVlJyAhPSBlLnByb3AxMCB8fCAoZS5wcm9wMTEgPSAnJykpLCBlLmVWYXIzMiA9IGUucHJvcDMgPSBnZXRUaW1lUGFydGluZygnQW1lcmljYS9Mb3NfQW5nZWxlcycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdC5zcGxpdCA9IG5ldyBGdW5jdGlvbignbCcsICdkJywgJ3ZhciBpLHg9MCxhPW5ldyBBcnJheTt3aGlsZShsKXtpPWwuaW5kZXhPZihkKTtpPWk+LTE/aTpsLmxlbmd0aDthW3grK109bC5zdWJzdHJpbmcoMCxpKTtsPWwuc3Vic3RyaW5nKGkrZC5sZW5ndGgpO31yZXR1cm4gYScpLCB0LmdldFBlcmNlbnRQYWdlVmlld2VkID0gbmV3IEZ1bmN0aW9uKCduJywgJ3ZhciBzPXRoaXMsVz13aW5kb3csRUw9Vy5hZGRFdmVudExpc3RlbmVyLEFFPVcuYXR0YWNoRXZlbnQsRT1bXCdsb2FkXCcsXCd1bmxvYWRcJyxcJ3Njcm9sbFwnLFwncmVzaXplXCcsXCd6b29tXCcsXCdrZXl1cFwnLFwnbW91c2V1cFwnLFwndG91Y2hlbmRcJyxcJ29yaWVudGF0aW9uY2hhbmdlXCcsXCdwYW5cJ107Vy5zX09iaj1zO3NfUFBWaWQ9KG49PVwnLVwnP3MucGFnZU5hbWU6bil8fHMucGFnZU5hbWV8fGxvY2F0aW9uLmhyZWY7aWYoIVcuc19QUFZldmVudCl7cy5zX1BQVmc9ZnVuY3Rpb24obixyKXt2YXIgaz1cJ3NfcHB2XCcscD1rK1wnbFwnLGM9cy5jX3Iobnx8cj9rOnApLGE9Yy5pbmRleE9mKFwnLFwnKT4tMT9jLnNwbGl0KFwnLFwnLDEwKTpbXCdcJ10sbD1hLmxlbmd0aCxpO2FbMF09dW5lc2NhcGUoYVswXSk7cj1yfHwobiYmbiE9YVswXSl8fDA7YS5sZW5ndGg9MTA7aWYodHlwZW9mIGFbMF0hPVwnc3RyaW5nXCcpYVswXT1cJ1wnO2ZvcihpPTE7aTwxMDtpKyspYVtpXT0hciYmaTxsP3BhcnNlSW50KGFbaV0pfHwwOjA7aWYobDwxMHx8dHlwZW9mIGFbOV0hPVwnc3RyaW5nXCcpYVs5XT1cJ1wnO2lmKHIpe3MuY193KHAsYyk7cy5jX3coayxcJz9cJyl9cmV0dXJuIGF9O1cuc19QUFZldmVudD1mdW5jdGlvbihlKXt2YXIgVz13aW5kb3csRD1kb2N1bWVudCxCPUQuYm9keSxFPUQuZG9jdW1lbnRFbGVtZW50LFM9d2luZG93LnNjcmVlbnx8MCxIbz1cJ29mZnNldEhlaWdodFwnLEhzPVwnc2Nyb2xsSGVpZ2h0XCcsVHM9XCdzY3JvbGxUb3BcJyxXYz1cJ2NsaWVudFdpZHRoXCcsSGM9XCdjbGllbnRIZWlnaHRcJyxDPTEwMCxNPU1hdGgsSj1cJ29iamVjdFwnLE49XCdudW1iZXJcJyxzPVcuc19PYmp8fFcuc3x8MDtlPWUmJnR5cGVvZiBlPT1KP2UudHlwZXx8XCdcJzpcJ1wnO2lmKCFlLmluZGV4T2YoXCdvblwnKSllPWUuc3Vic3RyaW5nKDIpO3NfUFBWaT1XLnNfUFBWaXx8MDtpZihXLnNfUFBWdCYmIWUpe2NsZWFyVGltZW91dChzX1BQVnQpO3NfUFBWdD0wO2lmKHNfUFBWaTwyKXNfUFBWaSsrfWlmKHR5cGVvZiBzPT1KKXt2YXIgaD1NLm1heChCW0hzXXx8RVtIc10sQltIb118fEVbSG9dLEJbSGNdfHxFW0hjXSksWD1XLmlubmVyV2lkdGh8fEVbV2NdfHxCW1djXXx8MCxZPVcuaW5uZXJIZWlnaHR8fEVbSGNdfHxCW0hjXXx8MCx4PVM/Uy53aWR0aDowLHk9Uz9TLmhlaWdodDowLHI9TS5yb3VuZChDKihXLmRldmljZVBpeGVsUmF0aW98fDEpKS9DLGI9KEQucGFnZVlPZmZzZXR8fEVbVHNdfHxCW1RzXXx8MCkrWSxwPWg+MCYmYj4wP00ucm91bmQoQypiL2gpOjAsTz1XLm9yaWVudGF0aW9uLG89IWlzTmFOKE8pP00uYWJzKG8pJTE4MDpZPlg/MDo5MCxMPWU9PVwnbG9hZFwnfHxzX1BQVmk8MSxhPXMuc19QUFZnKHNfUFBWaWQsTCksVj1mdW5jdGlvbihpLHYsZixuKXtpPXBhcnNlSW50KHR5cGVvZiBhPT1KJiZhLmxlbmd0aD5pP2FbaV06XCcwXCcpfHwwO3Y9dHlwZW9mIHYhPU4/aTp2O3Y9Znx8dj5pP3Y6aTtyZXR1cm4gbj92OnY+Qz9DOnY8MD8wOnZ9O2lmKG5ldyBSZWdFeHAoXCcoaVBvZHxpUGFkfGlQaG9uZSlcJykuZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50fHxcJ1wnKSYmbyl7bz14O3g9eTt5PW99bz1vP1wnUFwnOlwnTFwnO2FbOV09TD9cJ1wnOmFbOV0uc3Vic3RyaW5nKDAsMSk7cy5jX3coXCdzX3BwdlwnLGVzY2FwZShXLnNfUFBWaWQpK1wnLFwnK1YoMSxwLEwpK1wnLFwnKyhMfHwhVigyKT9wOlYoMikpK1wnLFwnK1YoMyxiLEwsMSkrXCcsXCcrWCtcJyxcJytZK1wnLFwnK3grXCcsXCcreStcJyxcJytyK1wnLFwnK2FbOV0rKGFbOV09PW8/XCdcJzpvKSl9aWYoIVcuc19QUFZ0JiZlIT1cJ3VubG9hZFwnKVcuc19QUFZ0PXNldFRpbWVvdXQoVy5zX1BQVmV2ZW50LDMzMyl9O2Zvcih2YXIgZj1XLnNfUFBWZXZlbnQsaT0wO2k8RS5sZW5ndGg7aSsrKWlmKEVMKUVMKEVbaV0sZixmYWxzZSk7ZWxzZSBpZihBRSlBRShcJ29uXCcrRVtpXSxmKTtmKCl9O3ZhciBhPXMuc19QUFZnKCk7cmV0dXJuIW58fG49PVwnLVwnP2FbMV06YScpLCB0LmdldFF1ZXJ5UGFyYW0gPSBuZXcgRnVuY3Rpb24oJ3AnLCAnZCcsICd1JywgJ3ZhciBzPXRoaXMsdj1cJ1wnLGksdDtkPWQ/ZDpcJ1wnO3U9dT91OihzLnBhZ2VVUkw/cy5wYWdlVVJMOnMud2QubG9jYXRpb24pO2lmKHU9PVwnZlwnKXU9cy5ndGZzKCkubG9jYXRpb247d2hpbGUocCl7aT1wLmluZGV4T2YoXCcsXCcpO2k9aTwwP3AubGVuZ3RoOmk7dD1zLnBfZ3B2KHAuc3Vic3RyaW5nKDAsaSksdStcJ1wnKTtpZih0KXt0PXQuaW5kZXhPZihcJyNcJyk+LTE/dC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoXCcjXCcpKTp0O31pZih0KXYrPXY/ZCt0OnQ7cD1wLnN1YnN0cmluZyhpPT1wLmxlbmd0aD9pOmkrMSl9cmV0dXJuIHYnKSwgdC5wX2dwdiA9IG5ldyBGdW5jdGlvbignaycsICd1JywgJ3ZhciBzPXRoaXMsdj1cJ1wnLGk9dS5pbmRleE9mKFwnP1wnKSxxO2lmKGsmJmk+LTEpe3E9dS5zdWJzdHJpbmcoaSsxKTt2PXMucHQocSxcJyZcJyxcJ3BfZ3ZmXCcsayl9cmV0dXJuIHYnKSwgdC5wX2d2ZiA9IG5ldyBGdW5jdGlvbigndCcsICdrJywgJ2lmKHQpe3ZhciBzPXRoaXMsaT10LmluZGV4T2YoXCc9XCcpLHA9aTwwP3Q6dC5zdWJzdHJpbmcoMCxpKSx2PWk8MD9cJ1RydWVcJzp0LnN1YnN0cmluZyhpKzEpO2lmKHAudG9Mb3dlckNhc2UoKT09ay50b0xvd2VyQ2FzZSgpKXJldHVybiBzLmVwYSh2KX1yZXR1cm4gXCdcJycpLCB0LmdldERheXNTaW5jZUxhc3RWaXNpdCA9IG5ldyBGdW5jdGlvbignYycsICd2YXIgcz10aGlzLGU9bmV3IERhdGUoKSxlcz1uZXcgRGF0ZSgpLGN2YWwsY3ZhbF9zLGN2YWxfc3MsY3Q9ZS5nZXRUaW1lKCksZGF5PTI0KjYwKjYwKjEwMDAsZjEsZjIsZjMsZjQsZjU7ZS5zZXRUaW1lKGN0KzMqMzY1KmRheSk7ZXMuc2V0VGltZShjdCszMCo2MCoxMDAwKTtmMD1cJ0Nvb2tpZXMgTm90IFN1cHBvcnRlZFwnO2YxPVwnRmlyc3QgVmlzaXRcJztmMj1cJ01vcmUgdGhhbiAzMCBkYXlzXCc7ZjM9XCdNb3JlIHRoYW4gNyBkYXlzXCc7ZjQ9XCdMZXNzIHRoYW4gNyBkYXlzXCc7ZjU9XCdMZXNzIHRoYW4gMSBkYXlcJztjdmFsPXMuY19yKGMpO2lmKGN2YWwubGVuZ3RoPT0wKXtzLmNfdyhjLGN0LGUpO3MuY193KGMrXCdfc1wnLGYxLGVzKTt9ZWxzZXt2YXIgZD1jdC1jdmFsO2lmKGQ+MzAqNjAqMTAwMCl7aWYoZD4zMCpkYXkpe3MuY193KGMsY3QsZSk7cy5jX3coYytcJ19zXCcsZjIsZXMpO31lbHNlIGlmKGQ8MzAqZGF5KzEgJiYgZD43KmRheSl7cy5jX3coYyxjdCxlKTtzLmNfdyhjK1wnX3NcJyxmMyxlcyk7fWVsc2UgaWYoZDw3KmRheSsxICYmIGQ+ZGF5KXtzLmNfdyhjLGN0LGUpO3MuY193KGMrXCdfc1wnLGY0LGVzKTt9ZWxzZSBpZihkPGRheSsxKXtzLmNfdyhjLGN0LGUpO3MuY193KGMrXCdfc1wnLGY1LGVzKTt9fWVsc2V7cy5jX3coYyxjdCxlKTtjdmFsX3NzPXMuY19yKGMrXCdfc1wnKTtzLmNfdyhjK1wnX3NcJyxjdmFsX3NzLGVzKTt9fWN2YWxfcz1zLmNfcihjK1wnX3NcJyk7aWYoY3ZhbF9zLmxlbmd0aD09MCkgcmV0dXJuIGYwO2Vsc2UgaWYoY3ZhbF9zIT1mMSYmY3ZhbF9zIT1mMiYmY3ZhbF9zIT1mMyYmY3ZhbF9zIT1mNCYmY3ZhbF9zIT1mNSkgcmV0dXJuIFwnXCc7ZWxzZSByZXR1cm4gY3ZhbF9zOycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnVzZXJUeXBlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWludGNtcGlkJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjYW1wYWlnbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpwZXJzb25JRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQ0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUNDVUlEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0NicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVVc2VyIEF1dGggTW9kZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclRENMSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjYxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6dXNlckFjdGlvblN0b3JlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI2MicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlb3BsZVNvZnRJZCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU21zIFZpc2libGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjkyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVBob25lIE51bWJlciBBZGRlZCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclUGhvbmUgTnVtYmVyIFZlcmlmaWVkJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5NCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVMgT3B0ZWRJbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclUGhvbmVOdW1iZXIgQ291bnRyeUNvZGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjk2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVBob25lTnVtYmVyIE1hdGNoJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVMgYXNzZXNzbWVudFJlcXVpcmVkJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VyVHlwZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OlBhZ2VUeXBlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6IFN1YlNlY3Rpb25MZXZlbDElJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDogU3ViU2VjdGlvbkxldmVsMiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OiBTdWJTZWN0aW9uTGV2ZWwzJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OkNvdW50cnlMYW5ndWFnZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MycgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6ICclY29udGVudDpTaXRlU2VjdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUNNUElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYmQxYzU5NDg0OGM0NDYzMGE3MWViMTJjNjlhMzgyZWUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpQYXNzd29yZElucHV0RXJyb3InLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3Bhc3Nwb3J0UGFzc3dvcmRJbnB1dEVycm9yJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDI5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJXBhc3Nwb3J0RXZlbnRQYXJhbXMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NTUnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw4ODJmOTEyNmQ3N2E0MTA4YWQ0NTI3YjZhOGMzNzBmZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0Zvcm06Rm9ybUVycm9ycycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZm9ybUVycm9ycycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVGb3JtOkZvcm1FcnJvcnMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTYnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnRm9ybSBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZmU1NmQyOGYwNDdmNGE5NzgzNDk5OGRhYjM1ZjVlN2InLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2JTZWFyY2g6Q2xpY2tUaHJvdWdoJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdzZWFyY2hDbGlja1Rocm91Z2gnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVKb2JTZWFyY2g6U2VhcmNoUG9zaXRpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjI3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUpvYlNlYXJjaDogU2VhcmNoU2VsZWN0aW9uJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQzNScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdKb2IgU2VhcmNoIENsaWNrdGhyb3VnaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMODZkODI1NGY0Y2YwNGE3Y2FlYjdlNGE0NzE0OTU1ZjYnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2JTZWFyY2g6Sm9iU2VhcmNoUmVzdWx0cycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnc2VhcmNoJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRpZ2l0YWxEYXRhLCBudWxsLCAnXHQnKSksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShkaWdpdGFsRGF0YSwgbnVsbCwgJ1x0JykpLCB0LmxpbmtUcmFja1ZhcnMgPSAnZXZlbnRzLGVWYXI3LGVWYXI4LHByb3AyMScsIHQubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50MyxldmVudDcsZXZlbnQzNCcsIGNvbnNvbGUubG9nKF9zYXRlbGxpdGUuZ2V0VmFyKCdKb2JTZWFyY2g6Tm9PZlJlc3VsdHMnKSArICdmaXJlZCcpLCAnemVybycgPT0gX3NhdGVsbGl0ZS5nZXRWYXIoJ0pvYlNlYXJjaDpOb09mUmVzdWx0cycpID8gdC5ldmVudHMgPSB0LmFwbCh0LmV2ZW50cywgJ2V2ZW50MzQnLCAnLCcsIDEpIDogdC5ldmVudHMgPSB0LmFwbCh0LmV2ZW50cywgJ2V2ZW50NycsICcsJywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUpvYlNlYXJjaDpTZWFyY2hUZXJtJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUpvYlNlYXJjaDpOb09mUmVzdWx0cyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpwZXJzb25JRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclSm9iU2VhcmNoOlNlYXJjaFRlcm0lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGNlM2NkNWNmZjhlNDQxMGViNmZlZDBjZWJhMjY3MTA2JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6Q29uZmlybVBhc3N3b3JkSW5wdXRFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRDb25maXJtUGFzc3dvcmRJbnB1dEVycm9yJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHJhY2tlclByb3BlcnRpZXM6IHsgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ1NicgfV0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdQYXNzcG9ydCBFdmVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGVhMTllYmIwZDdiMjQ2YTQ4OWRmMDc3MzA4OTVjMjhkJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ1ogTGFuZGluZyBQYWdlIC0gQWRGb3JtJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaHR0cHM6Ly93d3cuYW1hem9uLmpvYnMvY3MvbGFuZGluZ19wYWdlcy9wcmFjZScgPT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJzwhLS0gQWRmb3JtIFRyYWNraW5nIENvZGUgQkVHSU4gLS0+XG48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+XG4gICAgd2luZG93Ll9hZGZ0cmFjayA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9hZGZ0cmFjaykgPyB3aW5kb3cuX2FkZnRyYWNrIDogKHdpbmRvdy5fYWRmdHJhY2sgPyBbd2luZG93Ll9hZGZ0cmFja10gOiBbXSk7XG4gICAgd2luZG93Ll9hZGZ0cmFjay5wdXNoKHtcbiAgICAgICAgSHR0cEhvc3Q6IFwndHJhY2suYWRmb3JtLm5ldFwnLFxuICAgICAgICBwbTogMTQwNTczNCxcbiAgICAgICAgZGl2aWRlcjogZW5jb2RlVVJJQ29tcG9uZW50KFwnfFwnKSxcbiAgICAgICAgcGFnZW5hbWU6IGVuY29kZVVSSUNvbXBvbmVudChcJ2FtYXpvbl9yZW1hcmtldGluZ19taWNyb3NpdGVfdmlzaXRzX2N6XCcpXG4gICAgfSk7XG4gICAgKGZ1bmN0aW9uICgpIHsgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpOyBzLnR5cGUgPSBcJ3RleHQvamF2YXNjcmlwdFwnOyBzLmFzeW5jID0gdHJ1ZTsgcy5zcmMgPSBcJ2h0dHBzOi8vczIuYWRmb3JtLm5ldC9iYW5uZXJzL3NjcmlwdHMvc3QvdHJhY2twb2ludC1hc3luYy5qc1wnOyB2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnc2NyaXB0XCcpWzBdOyB4LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMsIHgpOyB9KSgpO1xuXG48L3NjcmlwdD5cbjxub3NjcmlwdD5cbiAgICA8cCBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowOyI+XG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3RyYWNrLmFkZm9ybS5uZXQvU2VydmluZy9UcmFja1BvaW50Lz9wbT0xNDA1NzM0JkFERlBhZ2VOYW1lPWFtYXpvbl9yZW1hcmtldGluZ19taWNyb3NpdGVfdmlzaXRzX2N6JkFERmRpdmlkZXI9fCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiIC8+XG4gICAgPC9wPlxuPC9ub3NjcmlwdD5cbjwhLS0gQWRmb3JtIFRyYWNraW5nIENvZGUgRU5EIC0tPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMTk3MTUzOGQzYjlhNDE1M2E5M2NhMThiMDQzOTA2Y2EnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb250ZW50OkxpbmtDbGljaycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnbGlua0NsaWNrJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6TGlua05hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMjMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpMaW5rTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQzNycgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdMaW5rIENsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2MzRkZjZiZTc0ODI0OWUzYTViZjZhNjA4ZjI2ZDg3NicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2pvYkFwcGxpY2F0aW9uOkRhc2hib2FyZCBWaWV3cycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnam9iQXBwbGljYXRpb25WaWV3cycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDIwJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBBcHBsaWNhdGlvbiBEYXNoYm9hcmQgVmlld3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDU1Y2JiOGVkODg2NjRiY2ZiNjYzZWMzMTJlZDlhMDE4JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVXNlcjpMb2dpbiBTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnbG9naW5TdGFydCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MScgfV0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdMb2dpbiBTdGFydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZmZlMTA2Y2U2MmE3NGM4MGJlNzkzOTc5YzQ5ZWVhZDAnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdNYXJrZXRpbmc6U29jaWFsQ2xpY2tzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdzb2NpYWxTaGFyZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJU1hcmtldGluZzogU29jaWFsUGxhdGZvcm0lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTb2NpYWwgQ2xpY2tzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwwNGU4NWM3N2Q0YzE0NGVlOWNjNDczNzZhMjAwOThmNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0pvYkFwcGxpY2F0aW9uOkpvYlJlZmVyJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdqb2JSZWZlcicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iQ2F0ZWdvcnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkRpdmlzaW9uJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ5NCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdKb2IgUmVmZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDUyMTk0N2I0YThiMTRhZTdiNTRjZWNkZjJlYTZiZWVmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ1RBIENsaWNrJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdjdGFDbGljaycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUNUQSBOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDM3JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJyVDVEEgTmFtZSUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDYwODZhYWRhZGExMTQ0YTZiMDU4NzQwNTBmMzVkOGYzJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUmVzdW1lUGFyc2luZ1NlcnZpY2U6UHJvZmlsZURpZmZlcmVudEZyb21Qb3B1bGF0ZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2V4dGVybmFsX3BhcnNlZF9yZXN1bWVfZGlmZmVyZW50X2Zyb21fcHJvZmlsZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7fSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGEyN2U0YjkxNzk2NjRkYzhhNmI5YjM3ZTI4MTEyMzIyJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUmVzdW1lUGFyc2luZ1NlcnZpY2U6Q2FsbCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZXh0ZXJuYWxfcGFyc2VkX3Jlc3VtZV9jYWxsX2Zyb21fQTJEMScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7fSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHlwZTogJ3BhZ2UnIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGY0MmZjYWJhMTU0YzRkMTQ5YTg0Njk3NzM4ZTgxMjQ5JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0sgTGFuZGluZyBQYWdlIC0gU0tMSUsnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdodHRwczovL3d3dy5hbWF6b24uam9icy9lbi9sYW5kaW5nX3BhZ2VzL3ByYWNhLXYtbG9naXN0aWtlJyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPlxuXHQvKiA8IVtDREFUQVsgKi9cblx0dmFyIHNlem5hbV9yZXRhcmdldGluZ19pZCA9IDU2MzA2O1xuXHQvKiBdXT4gKi9cbjwvc2NyaXB0PlxuPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iLy9jLmltZWRpYS5jei9qcy9yZXRhcmdldGluZy5qcyI+PC9zY3JpcHQ+XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGRmMzc1OGI0MDNkYzQ1MTE4MjkyZmI3MjY1NGFjNjExJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnUmVzdW1lUGFyc2luZ1NlcnZpY2U6UG9wdWxhdGVkVmFsdWVDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2V4dGVybmFsX3BhcnNlZF9yZXN1bWVfdmFsdWVfdXBkYXRlJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHJhY2tlclByb3BlcnRpZXM6IHt9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyB0eXBlOiAncGFnZScgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMjZkYmZmMGVmNzFmNGU2ZjliNzgyNzMyOGRjZjg0MTcnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDWiBMYW5kaW5nIFBhZ2UgLSBHVGFnJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaHR0cHM6Ly93d3cuYW1hem9uLmpvYnMvY3MvbGFuZGluZ19wYWdlcy9wcmFjZScgPT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ1xuPHNjcmlwdD5cbiAgZ3RhZyhcJ2V2ZW50XCcsIFwncGFnZV92aWV3XCcsIHtcbiAgICBcJ3NlbmRfdG9cJzogXCdBVy03OTU2NzQ1NjBcJyxcbiAgICBcJ3ZhbHVlXCc6IFwncmVwbGFjZSB3aXRoIHZhbHVlXCcsXG4gICAgXCdpdGVtc1wnOiBbe1xuICAgICAgXCdpZFwnOiBcJ3JlcGxhY2Ugd2l0aCB2YWx1ZVwnLFxuICAgICAgXCdsb2NhdGlvbl9pZFwnOiBcJ3JlcGxhY2Ugd2l0aCB2YWx1ZVwnLFxuICAgICAgXCdnb29nbGVfYnVzaW5lc3NfdmVydGljYWxcJzogXCdqb2JzXCdcbiAgICB9XVxuICB9KTtcbjwvc2NyaXB0PicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMmY1Y2I2ZjljNGQwNDE5NWE3MDA3ZDBkMDA1ZThhOWInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDWiBMYW5kaW5nIFBhZ2UgLSBGQiBQaXhlbCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2h0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL2NzL2xhbmRpbmdfcGFnZXMvcHJhY2UnID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdcbjwhLS0gRmFjZWJvb2sgUGl4ZWwgQ29kZSAtLT5cbjxzY3JpcHQ+XG4hZnVuY3Rpb24oZixiLGUsdixuLHQscylcbntpZihmLmZicSlyZXR1cm47bj1mLmZicT1mdW5jdGlvbigpe24uY2FsbE1ldGhvZD9cbm4uY2FsbE1ldGhvZC5hcHBseShuLGFyZ3VtZW50cyk6bi5xdWV1ZS5wdXNoKGFyZ3VtZW50cyl9O1xuaWYoIWYuX2ZicSlmLl9mYnE9bjtuLnB1c2g9bjtuLmxvYWRlZD0hMDtuLnZlcnNpb249XCcyLjBcJztcbm4ucXVldWU9W107dD1iLmNyZWF0ZUVsZW1lbnQoZSk7dC5hc3luYz0hMDtcbnQuc3JjPXY7cz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpWzBdO1xucy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHMpfSh3aW5kb3csIGRvY3VtZW50LFwnc2NyaXB0XCcsXG5cJ2h0dHBzOi8vY29ubmVjdC5mYWNlYm9vay5uZXQvZW5fVVMvZmJldmVudHMuanNcJyk7XG5mYnEoXCdpbml0XCcsIFwnODQyNTY5OTQyNjA1MDE4XCcpO1xuZmJxKFwndHJhY2tcJywgXCdQYWdlVmlld1wnKTtcbjwvc2NyaXB0PlxuPG5vc2NyaXB0PjxpbWcgaGVpZ2h0PSIxIiB3aWR0aD0iMSIgc3R5bGU9ImRpc3BsYXk6bm9uZSJcbnNyYz0iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3RyP2lkPTg0MjU2OTk0MjYwNTAxOCZldj1QYWdlVmlldyZub3NjcmlwdD0xIlxuLz48L25vc2NyaXB0PlxuPCEtLSBFbmQgRmFjZWJvb2sgUGl4ZWwgQ29kZSAtLT5cbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMOWU4ZWI3MTRhNDk3NDRmMDljNjJiYTk0M2M3ZTRkYTEnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdjb250ZW50OlNpdGVFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnc2l0ZUVycm9yJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6U2l0ZUVycm9yJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDM4JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0Vycm9yIE9jY3VyZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDMzZDRhODkwMjU0YzQzZDE5ODYwNTY0YmU0M2RmY2QxJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0sgTGFuZGluZyBQYWdlIC0gRkIgUGl4ZWwnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3ZhbHVlQ29tcGFyaXNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb246IHsgb3BlcmF0b3I6ICdlcXVhbHMnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdE9wZXJhbmQ6ICclUGFnZSBVUkwlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodE9wZXJhbmQ6ICdodHRwczovL3d3dy5hbWF6b24uam9icy9lbi9sYW5kaW5nX3BhZ2VzL3ByYWNhLXYtbG9naXN0aWtlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8IS0tIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+XG48c2NyaXB0PlxuIWZ1bmN0aW9uKGYsYixlLHYsbix0LHMpXG57aWYoZi5mYnEpcmV0dXJuO249Zi5mYnE9ZnVuY3Rpb24oKXtuLmNhbGxNZXRob2Q/XG5uLmNhbGxNZXRob2QuYXBwbHkobixhcmd1bWVudHMpOm4ucXVldWUucHVzaChhcmd1bWVudHMpfTtcbmlmKCFmLl9mYnEpZi5fZmJxPW47bi5wdXNoPW47bi5sb2FkZWQ9ITA7bi52ZXJzaW9uPVwnMi4wXCc7XG5uLnF1ZXVlPVtdO3Q9Yi5jcmVhdGVFbGVtZW50KGUpO3QuYXN5bmM9ITA7XG50LnNyYz12O3M9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShlKVswXTtcbnMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCxzKX0od2luZG93LCBkb2N1bWVudCxcJ3NjcmlwdFwnLFxuXCdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL2ZiZXZlbnRzLmpzXCcpO1xuZmJxKFwnaW5pdFwnLCBcJzg0MjU2OTk0MjYwNTAxOFwnKTtcbmZicShcJ3RyYWNrXCcsIFwnUGFnZVZpZXdcJyk7XG48L3NjcmlwdD5cbjxub3NjcmlwdD48aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmUiXG5zcmM9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS90cj9pZD04NDI1Njk5NDI2MDUwMTgmZXY9UGFnZVZpZXcmbm9zY3JpcHQ9MSJcbi8+PC9ub3NjcmlwdD5cbjwhLS0gRW5kIEZhY2Vib29rIFBpeGVsIENvZGUgLS0+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2ODUyNGM3MmZlMzU0YjAwYTdlZjQxNjRjMmI2YzkwOScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NLIExhbmRpbmcgUGFnZSAtIEdsb2JhbCBSTUsnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdodHRwczovL3d3dy5hbWF6b24uam9icy9lbi9sYW5kaW5nX3BhZ2VzL3ByYWNhLXYtbG9naXN0aWtlJyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFkczogNzk1Njc0NTYwIC0tPlxuPHNjcmlwdCBhc3luYyBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZXRhZ21hbmFnZXIuY29tL2d0YWcvanM/aWQ9QVctNzk1Njc0NTYwIj48L3NjcmlwdD5cbjxzY3JpcHQ+XG4gIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdO1xuICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9XG4gIGd0YWcoXCdqc1wnLCBuZXcgRGF0ZSgpKTtcblxuICBndGFnKFwnY29uZmlnXCcsIFwnQVctNzk1Njc0NTYwXCcpO1xuPC9zY3JpcHQ+XG4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDc3MmQwMTBlYjI2OTQyM2ZhZTdiNmNiYzBhNzY0NTBlJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ1ogTGFuZGluZyBQYWdlIC0gUk1LIHRhZycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2h0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL2NzL2xhbmRpbmdfcGFnZXMvcHJhY2UnID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdcbjwhLS0gR2xvYmFsIHNpdGUgdGFnIChndGFnLmpzKSAtIEdvb2dsZSBBZHM6IDc5NTY3NDU2MCAtLT5cbjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUFXLTc5NTY3NDU2MCI+PC9zY3JpcHQ+XG48c2NyaXB0PlxuICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTtcbiAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fVxuICBndGFnKFwnanNcJywgbmV3IERhdGUoKSk7XG5cbiAgZ3RhZyhcJ2NvbmZpZ1wnLCBcJ0FXLTc5NTY3NDU2MFwnKTtcbjwvc2NyaXB0PlxuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxjODNiMzNlODBiNmQ0NDNmODQ0N2EzZmM2YTY3N2JjNScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1BMIExhbmRpbmcgUGFnZSAtIFBpeGVsJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9wYWdlQm90dG9tLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvY29uZGl0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaHR0cHM6Ly93d3cuYW1hem9uLmpvYnMvcGwvbGFuZGluZ19wYWdlcy9wcmFjYScgPT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZiB8fCAnaHR0cHM6Ly93d3cuYW1hem9uLmpvYnMvcGwvbGFuZGluZ19wYWdlcy9wcmFjYS1rYXRvd2ljZScgPT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZiB8fCAnaHR0cHM6Ly93d3cuYW1hem9uLmpvYnMvcGwvbGFuZGluZ19wYWdlcy9wcmFjYS13cm9jbGF3JyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmIHx8ICdodHRwczovL3d3dy5hbWF6b24uam9icy9wbC9sYW5kaW5nX3BhZ2VzL3ByYWNhLWxvZHonID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL3BsL2xhbmRpbmdfcGFnZXMvcHJhY2EtU3pjemVjaW4nID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYgfHwgJ2h0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL3BsL2xhbmRpbmdfcGFnZXMvcHJhY2EtcG96bmFuJyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmIHx8ICdodHRwczovL3d3dy5hbWF6b24uam9icy9wbC9sYW5kaW5nX3BhZ2VzL3ByYWNhLXN3aWVib2R6aW4nID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICc8IS0tXG5TdGFydCBvZiBGbG9vZGxpZ2h0IFRhZzogUGxlYXNlIGRvIG5vdCByZW1vdmVcbkFjdGl2aXR5IG5hbWUgb2YgdGhpcyB0YWc6IEFtYXpvbi5Kb2JzX0hQXG5VUkwgb2YgdGhlIHdlYnBhZ2Ugd2hlcmUgdGhlIHRhZyBpcyBleHBlY3RlZCB0byBiZSBwbGFjZWQ6IGh0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL3BsL2xhbmRpbmdfcGFnZXMvXG5UaGlzIHRhZyBtdXN0IGJlIHBsYWNlZCBiZXR3ZWVuIHRoZSA8Ym9keT4gYW5kIDwvYm9keT4gdGFncywgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIG9wZW5pbmcgdGFnLlxuQ3JlYXRpb24gRGF0ZTogMDMvMDQvMjAyMVxuLS0+XG48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+XG52YXIgYXhlbCA9IE1hdGgucmFuZG9tKCkgKyAiIjtcbnZhciBhID0gYXhlbCAqIDEwMDAwMDAwMDAwMDAwO1xuZG9jdW1lbnQud3JpdGUoXCc8aWZyYW1lIHNyYz0iaHR0cHM6Ly84NzYwNjYwLmZscy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHlpO3NyYz04NzYwNjYwO3R5cGU9bGFuZGkwO2NhdD1hbWF6bzA7ZGNfbGF0PTtkY19yZGlkPTt0YWdfZm9yX2NoaWxkX2RpcmVjdGVkX3RyZWF0bWVudD07dGZ1YT07bnBhPTtnZHByPSR7R0RQUn07Z2Rwcl9jb25zZW50PSR7R0RQUl9DT05TRU5UXzc1NX07b3JkPVwnICsgYSArIFwnPyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPlwnKTtcbjwvc2NyaXB0PlxuPG5vc2NyaXB0PlxuPGlmcmFtZSBzcmM9Imh0dHBzOi8vODc2MDY2MC5mbHMuZG91YmxlY2xpY2submV0L2FjdGl2aXR5aTtzcmM9ODc2MDY2MDt0eXBlPWxhbmRpMDtjYXQ9YW1hem8wO2RjX2xhdD07ZGNfcmRpZD07dGFnX2Zvcl9jaGlsZF9kaXJlY3RlZF90cmVhdG1lbnQ9O3RmdWE9O25wYT07Z2Rwcj0ke0dEUFJ9O2dkcHJfY29uc2VudD0ke0dEUFJfQ09OU0VOVF83NTV9O29yZD0xPyIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZnJhbWVib3JkZXI9IjAiIHN0eWxlPSJkaXNwbGF5Om5vbmUiPjwvaWZyYW1lPlxuPC9ub3NjcmlwdD5cbjwhLS0gRW5kIG9mIEZsb29kbGlnaHQgVGFnOiBQbGVhc2UgZG8gbm90IHJlbW92ZSAtLT4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiAnaHRtbCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDljNDQ4YmI0MThlZjRlYjU4YWVkYzM4MzEzZTI0NzZmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU0sgTGFuZGluZyBQYWdlIC0gQWRGb3JtICcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2NvbmRpdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2h0dHBzOi8vd3d3LmFtYXpvbi5qb2JzL2VuL2xhbmRpbmdfcGFnZXMvcHJhY2Etdi1sb2dpc3Rpa2UnID09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9hY3Rpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UcmFja2luZyBDb2RlOiBTdGFuZGFyZCAoQXN5bmNocm9ub3VzKSAiYW1hem9uX3JlbWFya2V0aW5nX21pY3Jvc2l0ZV92aXNpdHNfc2siXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbjwhLS0gQWRmb3JtIFRyYWNraW5nIENvZGUgQkVHSU4gLS0+XG48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+XG4gICAgd2luZG93Ll9hZGZ0cmFjayA9IEFycmF5LmlzQXJyYXkod2luZG93Ll9hZGZ0cmFjaykgPyB3aW5kb3cuX2FkZnRyYWNrIDogKHdpbmRvdy5fYWRmdHJhY2sgPyBbd2luZG93Ll9hZGZ0cmFja10gOiBbXSk7XG4gICAgd2luZG93Ll9hZGZ0cmFjay5wdXNoKHtcbiAgICAgICAgSHR0cEhvc3Q6IFwndHJhY2suYWRmb3JtLm5ldFwnLFxuICAgICAgICBwbTogMTQwNTczNCxcbiAgICAgICAgZGl2aWRlcjogZW5jb2RlVVJJQ29tcG9uZW50KFwnfFwnKSxcbiAgICAgICAgcGFnZW5hbWU6IGVuY29kZVVSSUNvbXBvbmVudChcJ2FtYXpvbl9yZW1hcmtldGluZ19taWNyb3NpdGVfdmlzaXRzX3NrXCcpXG4gICAgfSk7XG4gICAgKGZ1bmN0aW9uICgpIHsgdmFyIHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwnc2NyaXB0XCcpOyBzLnR5cGUgPSBcJ3RleHQvamF2YXNjcmlwdFwnOyBzLmFzeW5jID0gdHJ1ZTsgcy5zcmMgPSBcJ2h0dHBzOi8vczIuYWRmb3JtLm5ldC9iYW5uZXJzL3NjcmlwdHMvc3QvdHJhY2twb2ludC1hc3luYy5qc1wnOyB2YXIgeCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwnc2NyaXB0XCcpWzBdOyB4LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMsIHgpOyB9KSgpO1xuXG48L3NjcmlwdD5cbjxub3NjcmlwdD5cbiAgICA8cCBzdHlsZT0ibWFyZ2luOjA7cGFkZGluZzowO2JvcmRlcjowOyI+XG4gICAgICAgIDxpbWcgc3JjPSJodHRwczovL3RyYWNrLmFkZm9ybS5uZXQvU2VydmluZy9UcmFja1BvaW50Lz9wbT0xNDA1NzM0JkFERlBhZ2VOYW1lPWFtYXpvbl9yZW1hcmtldGluZ19taWNyb3NpdGVfdmlzaXRzX3NrJkFERmRpdmlkZXI9fCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgYWx0PSIiIC8+XG4gICAgPC9wPlxuPC9ub3NjcmlwdD5cbjwhLS0gQWRmb3JtIFRyYWNraW5nIENvZGUgRU5EIC0tPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdodG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZDEzN2NlYjdhMWUyNGQ1MTlkZmE0M2QyYzZhZThlYmUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTSyBMYW5kaW5nIFBhZ2UgLSBSTUsnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL3BhZ2VCb3R0b20uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL2N1c3RvbUNvZGUuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdodHRwczovL3d3dy5hbWF6b24uam9icy9lbi9sYW5kaW5nX3BhZ2VzL3ByYWNhLXYtbG9naXN0aWtlJyA9PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvYWN0aW9ucy9jdXN0b21Db2RlLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnPHNjcmlwdD5cbiAgZ3RhZyhcJ2V2ZW50XCcsIFwncGFnZV92aWV3XCcsIHtcbiAgICBcJ3NlbmRfdG9cJzogXCdBVy03OTU2NzQ1NjBcJyxcbiAgICBcJ3ZhbHVlXCc6IFwncmVwbGFjZSB3aXRoIHZhbHVlXCcsXG4gICAgXCdpdGVtc1wnOiBbe1xuICAgICAgXCdpZFwnOiBcJ3JlcGxhY2Ugd2l0aCB2YWx1ZVwnLFxuICAgICAgXCdsb2NhdGlvbl9pZFwnOiBcJ3JlcGxhY2Ugd2l0aCB2YWx1ZVwnLFxuICAgICAgXCdnb29nbGVfYnVzaW5lc3NfdmVydGljYWxcJzogXCdqb2JzXCdcbiAgICB9XVxuICB9KTtcbjwvc2NyaXB0PlxuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogJ2h0bWwnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2MWVmODhhOWViNDM0ZjBjYmZlNjE3OGYxYmVkZTgyOCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2pvYkFwcGxpY2F0aW9uOmZvcm1FcnJvcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnZm9ybUVycm9yc0pvYkFwcGxpY2F0aW9uJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjI4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6cGVyc29uSUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NDAnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnSm9iIEFwcGxpY2F0aW9uIC0gRm9ybSBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMTFiZGY2M2FmNmY2NDlkOWI5YWU3ODkzN2Y3YThjNTInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2JBcHBsaWNhdGlvbjpjZW50cmFsaXplZEhpcmluZ0FwcGx5JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdjZW50cmFsaXplZEhpcmluZ0FwcGx5JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JDYXRlZ29yeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iRGl2aXNpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjM3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYkNvdW50cnklJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjU4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnQ2VudHJhbGl6ZWQgSGlyaW5nIFByb2Nlc3MnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclSm9iIFJvbGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjgwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmhpcmluZ1llYXIlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDEyOScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDZW50cmFsaXplZCBIaXJpbmcgQXBwbHkgTm93IENsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwxMmIyODQ2OGU2OWE0ZGZjYTcxNGQ4N2I2ZmMyYjdhYicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1R5cGUgQWhlYWQgU2VhcmNoIFNlbmQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3NlYXJjaFRlcm1TZWxlY3QnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVldmVudC5kZXRhaWwuc2VhcmNoVGVybSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxNScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTZWFyY2ggfCBUeXBlIEFoZWFkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZGQ2Mzg1MTM2MTZhNDYxYmE5NjIwNmQ4M2QxNTkwOTEnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdUeXBlIEFoZWFkIFNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvcGFnZUJvdHRvbS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2FjdGlvbnMvY3VzdG9tQ29kZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnJChcJ2JvZHlcJykub24oXCdjbGlja1wnLFwnZGl2LnN1Z2dlc3Rpb24tbGlua1wnLCBmdW5jdGlvbigpIHtcblx0c3VnZ2VzdGlvbkxpbmtUZXh0ID0gdGhpcy5pbm5lclRleHQudHJpbSgpO1xuICAgIF9zYXRlbGxpdGUudHJhY2soXCdzZWFyY2hUZXJtU2VsZWN0XCcseyJzZWFyY2hUZXJtIjogc3VnZ2VzdGlvbkxpbmtUZXh0fSk7XG59KScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6ICdqYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMWMxZjU5YjNkMWEyNDlhMjk4ZTczZGMwNjZhNzkzMjgnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTTVMgU3VjY2Vzc2Z1bCBWZXJpZmljYXRpb25zJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdWZXJpZmljYXRpb24tU3VjY2VzcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjg5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVVzZXIgU3RhdHVzJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVM6U3RlcG5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDEyMCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgLSBWZXJpZmljYXRpb24tU3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMTU0NGRhOTQ3ZDJmNDgyYjg0YzRhMWY4NzcyZGNlNjAnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpVcGRhdGVQYXNzd29yZFN1Y2NlZWRlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRVcGRhdGVQYXNzd29yZFN1Y2NlZWRlZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NDcnIH1dIH0gfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwxZmMyYmUxM2JiYzc0YmI4ODM5YzM1MTBhYTk5Njk0MCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBTZW5kIE5ldyBDb2RlJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdTTVMgU2VuZCBOZXcgQ29kZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjg5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVVzZXIgU3RhdHVzJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVM6U3RlcG5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDEzNScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgLSBTZW5kIG5ldyBDb2RlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwyMDhiYWEzNDYwZjQ0NDZkYTcyOGNhOWY5YjNhMGM1NycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBHZXQgdmVyaWZpY2F0aW9uIGNvZGUnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ1NNUyBHZXQgdmVyaWZpY2F0aW9uIGNvZGUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI4OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVVc2VyIFN0YXR1cyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU01TOlN0ZXBuYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMDknIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnU01TIEdldCB2ZXJpZmljYXRpb24gY29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNGM2ZWQ0N2E5MjMwNDVlMjhmYTVmZGU5OTVkNmJkYWUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDphc3luY1BhZ2VMb2FkJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdhc3luY1BhZ2VMb2FkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA0MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9jb25kaXRpb25zL3N1YmRvbWFpbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmRvbWFpbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICdwYXNzcG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnYWthXFwuY29ycFxcLmFtYXpvblxcLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUlzUmVnZXg6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5zX2xvYWRUKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IERhdGUoKS5nZXRUaW1lKCksIHQgPSB3aW5kb3cucGVyZm9ybWFuY2UgPyBwZXJmb3JtYW5jZS50aW1pbmcgOiAwLCBuID0gdCA/IHQucmVxdWVzdFN0YXJ0IDogd2luZG93LmluSGVhZFRTIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfbG9hZFQgPSBuID8gTWF0aC5yb3VuZCgoZSAtIG4pIC8gMTAwKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc19sb2FkVDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gVmlzaXRvci5nZXRJbnN0YW5jZSgnNEVFMUJCNjU1NUY5MzY5QTdGMDAwMTAxQEFkb2JlT3JnJykuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgKHQuZVZhcjYgPSBhKSwgdC5wcm9wNSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBWaXNpdG9yID8gJ1Zpc2l0b3JBUEkgUHJlc2VudCcgOiAnVmlzaXRvckFQSSBNaXNzaW5nJywgdC5wcm9wMiA9ICdEPXQnLCAwIDwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignNDA0JykgJiYgKHQucGFnZVR5cGUgPSAnZXJyb3JQYWdlJyksIHQuZVZhcjE1ID0gd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCB0LmVWYXIxNiA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwgdC5wcm9wMTMgPSB3aW5kb3cubG9jYXRpb24uaHJlZiwgdC5wcm9wMTQgPSBuKCksIHQucHJvcDE3ID0gJ0Q9aicsIHQucHJvcDE4ID0gZG9jdW1lbnQudGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGxvY2F0aW9uLnNlYXJjaC5zcGxpdCgnPScpLCByID0gaVswXS5zdWJzdHIoMSwgaVswXS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wcm9wMTkgPSByLCB0LnVzZVBsdWdpbnMgPSAhMCwgdC5kb1BsdWdpbnMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuVXRpbC5nZXRRdWVyeVBhcmFtKCd1dG1fbWVkaXVtJykgJiYgKGUuZVZhcjE3ID0gZS5VdGlsLmdldFF1ZXJ5UGFyYW0oJ3V0bV9tZWRpdW0nKSArICc6JyArIGUuVXRpbC5nZXRRdWVyeVBhcmFtKCd1dG1fc291cmNlJykgKyAnOicgKyBlLlV0aWwuZ2V0UXVlcnlQYXJhbSgndXRtX3Rlcm0nKSArICc6JyArIGUuVXRpbC5nZXRRdWVyeVBhcmFtKCd1dG1fY29udGVudCcpKSwgZS5lVmFyMTcgPSBlLmdldFZhbE9uY2UoZS5lVmFyMTcsICdzX2VWYXIxNycpLCBkaWdpdGFsRGF0YS5wYWdlLnNlYXJjaCAmJiAnWmVybycgPT0gZGlnaXRhbERhdGEucGFnZS5zZWFyY2gubm9PZlJlc3VsdHMgJiYgKGUuZXZlbnRzID0gZS5hcGwoZS5ldmVudHMsICdldmVudDM0JywgJywnLCAyKSksIGUucHJvcDI1ID0gZS5nZXREYXlzU2luY2VMYXN0VmlzaXQoJ3NfbHYnKSwgZS5wcm9wMjIgPSBlLmdldE5ld1JlcGVhdCgzMCwgJ3NfZ2V0TmV3UmVwZWF0JyksIGUucHJvcDEwID0gZS5nZXRQcmV2aW91c1ZhbHVlKGUucGFnZU5hbWUsICdncHYnLCAnJyksIGUucHJvcDEwICYmIChlLmVWYXIyNSA9ICdEPWMxMCcsIGUucHJvcDExID0gZS5nZXRQZXJjZW50UGFnZVZpZXdlZCgpLCBlLnByb3AxMCAmJiAnbm8gdmFsdWUnICE9IGUucHJvcDEwIHx8IChlLnByb3AxMSA9ICcnKSksIGUuZVZhcjMyID0gZS5wcm9wMyA9IGUuZ2V0VGltZVBhcnRpbmcoJ24nLCAnLTgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuX3RwRFNUID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTI6ICc0LzEsMTAvNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxMzogJzQvNywxMC82JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE0OiAnNC82LDEwLzUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTU6ICc0LzUsMTAvNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxNjogJzQvMywxMC8yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE3OiAnNC8yLDEwLzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTg6ICc0LzEsMTAvNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxOTogJzQvNywxMC82JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIwOiAnNC81LDEwLzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjE6ICc0LzQsMTAvMycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuX3RwRFNUID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTI6ICczLzExLDExLzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTM6ICczLzEwLDExLzMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTQ6ICczLzksMTEvMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxNTogJzMvOCwxMS8xJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE2OiAnMy8xMywxMS82JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE3OiAnMy8xMiwxMS81JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE4OiAnMy8xMSwxMS80JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE5OiAnMy8xMCwxMS8zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIwOiAnMy84LDExLzEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjE6ICczLzE0LDExLzcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0Ll90cERTVCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDEyOiAnMy8yNSwxMC8yOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxMzogJzMvMzEsMTAvMjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTQ6ICczLzMwLDEwLzI2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE1OiAnMy8yOSwxMC8yNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxNjogJzMvMjcsMTAvMzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMTc6ICczLzI2LDEwLzI5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDE4OiAnMy8yNSwxMC8yOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxOTogJzMvMzEsMTAvMjcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjA6ICczLzI5LDEwLzI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIxOiAnMy8yOCwxMC8zMScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQuZ2V0UHJldmlvdXNWYWx1ZSA9IG5ldyBGdW5jdGlvbigndicsICdjJywgJ2VsJywgJ3ZhciBzPXRoaXMsdD1uZXcgRGF0ZSxpLGoscj1cJ1wnO3Quc2V0VGltZSh0LmdldFRpbWUoKSsxODAwMDAwKTtpZihlbCl7aWYocy5ldmVudHMpe2k9cy5zcGxpdChlbCxcJyxcJyk7aj1zLnNwbGl0KHMuZXZlbnRzLFwnLFwnKTtmb3IoeCBpbiBpKXtmb3IoeSBpbiBqKXtpZihpW3hdPT1qW3ldKXtpZihzLmNfcihjKSkgcj1zLmNfcihjKTt2P3MuY193KGMsdix0KTpzLmNfdyhjLFwnbm8gdmFsdWVcJyx0KTtyZXR1cm4gcn19fX19ZWxzZXtpZihzLmNfcihjKSkgcj1zLmNfcihjKTt2P3MuY193KGMsdix0KTpzLmNfdyhjLFwnbm8gdmFsdWVcJyx0KTtyZXR1cm4gcn0nKSwgdC5zcGxpdCA9IG5ldyBGdW5jdGlvbignbCcsICdkJywgJ3ZhciBpLHg9MCxhPW5ldyBBcnJheTt3aGlsZShsKXtpPWwuaW5kZXhPZihkKTtpPWk+LTE/aTpsLmxlbmd0aDthW3grK109bC5zdWJzdHJpbmcoMCxpKTtsPWwuc3Vic3RyaW5nKGkrZC5sZW5ndGgpO31yZXR1cm4gYScpLCB0LmdldFBlcmNlbnRQYWdlVmlld2VkID0gbmV3IEZ1bmN0aW9uKCduJywgJ3ZhciBzPXRoaXMsVz13aW5kb3csRUw9Vy5hZGRFdmVudExpc3RlbmVyLEFFPVcuYXR0YWNoRXZlbnQsRT1bXCdsb2FkXCcsXCd1bmxvYWRcJyxcJ3Njcm9sbFwnLFwncmVzaXplXCcsXCd6b29tXCcsXCdrZXl1cFwnLFwnbW91c2V1cFwnLFwndG91Y2hlbmRcJyxcJ29yaWVudGF0aW9uY2hhbmdlXCcsXCdwYW5cJ107Vy5zX09iaj1zO3NfUFBWaWQ9KG49PVwnLVwnP3MucGFnZU5hbWU6bil8fHMucGFnZU5hbWV8fGxvY2F0aW9uLmhyZWY7aWYoIVcuc19QUFZldmVudCl7cy5zX1BQVmc9ZnVuY3Rpb24obixyKXt2YXIgaz1cJ3NfcHB2XCcscD1rK1wnbFwnLGM9cy5jX3Iobnx8cj9rOnApLGE9Yy5pbmRleE9mKFwnLFwnKT4tMT9jLnNwbGl0KFwnLFwnLDEwKTpbXCdcJ10sbD1hLmxlbmd0aCxpO2FbMF09dW5lc2NhcGUoYVswXSk7cj1yfHwobiYmbiE9YVswXSl8fDA7YS5sZW5ndGg9MTA7aWYodHlwZW9mIGFbMF0hPVwnc3RyaW5nXCcpYVswXT1cJ1wnO2ZvcihpPTE7aTwxMDtpKyspYVtpXT0hciYmaTxsP3BhcnNlSW50KGFbaV0pfHwwOjA7aWYobDwxMHx8dHlwZW9mIGFbOV0hPVwnc3RyaW5nXCcpYVs5XT1cJ1wnO2lmKHIpe3MuY193KHAsYyk7cy5jX3coayxcJz9cJyl9cmV0dXJuIGF9O1cuc19QUFZldmVudD1mdW5jdGlvbihlKXt2YXIgVz13aW5kb3csRD1kb2N1bWVudCxCPUQuYm9keSxFPUQuZG9jdW1lbnRFbGVtZW50LFM9d2luZG93LnNjcmVlbnx8MCxIbz1cJ29mZnNldEhlaWdodFwnLEhzPVwnc2Nyb2xsSGVpZ2h0XCcsVHM9XCdzY3JvbGxUb3BcJyxXYz1cJ2NsaWVudFdpZHRoXCcsSGM9XCdjbGllbnRIZWlnaHRcJyxDPTEwMCxNPU1hdGgsSj1cJ29iamVjdFwnLE49XCdudW1iZXJcJyxzPVcuc19PYmp8fFcuc3x8MDtlPWUmJnR5cGVvZiBlPT1KP2UudHlwZXx8XCdcJzpcJ1wnO2lmKCFlLmluZGV4T2YoXCdvblwnKSllPWUuc3Vic3RyaW5nKDIpO3NfUFBWaT1XLnNfUFBWaXx8MDtpZihXLnNfUFBWdCYmIWUpe2NsZWFyVGltZW91dChzX1BQVnQpO3NfUFBWdD0wO2lmKHNfUFBWaTwyKXNfUFBWaSsrfWlmKHR5cGVvZiBzPT1KKXt2YXIgaD1NLm1heChCW0hzXXx8RVtIc10sQltIb118fEVbSG9dLEJbSGNdfHxFW0hjXSksWD1XLmlubmVyV2lkdGh8fEVbV2NdfHxCW1djXXx8MCxZPVcuaW5uZXJIZWlnaHR8fEVbSGNdfHxCW0hjXXx8MCx4PVM/Uy53aWR0aDowLHk9Uz9TLmhlaWdodDowLHI9TS5yb3VuZChDKihXLmRldmljZVBpeGVsUmF0aW98fDEpKS9DLGI9KEQucGFnZVlPZmZzZXR8fEVbVHNdfHxCW1RzXXx8MCkrWSxwPWg+MCYmYj4wP00ucm91bmQoQypiL2gpOjAsTz1XLm9yaWVudGF0aW9uLG89IWlzTmFOKE8pP00uYWJzKG8pJTE4MDpZPlg/MDo5MCxMPWU9PVwnbG9hZFwnfHxzX1BQVmk8MSxhPXMuc19QUFZnKHNfUFBWaWQsTCksVj1mdW5jdGlvbihpLHYsZixuKXtpPXBhcnNlSW50KHR5cGVvZiBhPT1KJiZhLmxlbmd0aD5pP2FbaV06XCcwXCcpfHwwO3Y9dHlwZW9mIHYhPU4/aTp2O3Y9Znx8dj5pP3Y6aTtyZXR1cm4gbj92OnY+Qz9DOnY8MD8wOnZ9O2lmKG5ldyBSZWdFeHAoXCcoaVBvZHxpUGFkfGlQaG9uZSlcJykuZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50fHxcJ1wnKSYmbyl7bz14O3g9eTt5PW99bz1vP1wnUFwnOlwnTFwnO2FbOV09TD9cJ1wnOmFbOV0uc3Vic3RyaW5nKDAsMSk7cy5jX3coXCdzX3BwdlwnLGVzY2FwZShXLnNfUFBWaWQpK1wnLFwnK1YoMSxwLEwpK1wnLFwnKyhMfHwhVigyKT9wOlYoMikpK1wnLFwnK1YoMyxiLEwsMSkrXCcsXCcrWCtcJyxcJytZK1wnLFwnK3grXCcsXCcreStcJyxcJytyK1wnLFwnK2FbOV0rKGFbOV09PW8/XCdcJzpvKSl9aWYoIVcuc19QUFZ0JiZlIT1cJ3VubG9hZFwnKVcuc19QUFZ0PXNldFRpbWVvdXQoVy5zX1BQVmV2ZW50LDMzMyl9O2Zvcih2YXIgZj1XLnNfUFBWZXZlbnQsaT0wO2k8RS5sZW5ndGg7aSsrKWlmKEVMKUVMKEVbaV0sZixmYWxzZSk7ZWxzZSBpZihBRSlBRShcJ29uXCcrRVtpXSxmKTtmKCl9O3ZhciBhPXMuc19QUFZnKCk7cmV0dXJuIW58fG49PVwnLVwnP2FbMV06YScpLCB0LmdldFRpbWVQYXJ0aW5nID0gbmV3IEZ1bmN0aW9uKCdoJywgJ3onLCAndmFyIHM9dGhpcyxvZDtvZD1uZXcgRGF0ZShcJzEvMS8yMDAwXCcpO2lmKG9kLmdldERheSgpIT02fHxvZC5nZXRNb250aCgpIT0wKXtyZXR1cm5cJ0RhdGEgTm90IEF2YWlsYWJsZVwnO31lbHNle3ZhciBILE0sRCxVLGRzLGRlLHRtLGRhPVtcJ1N1bmRheVwnLFwnTW9uZGF5XCcsXCdUdWVzZGF5XCcsXCdXZWRuZXNkYXlcJyxcJ1RodXJzZGF5XCcsXCdGcmlkYXlcJyxcJ1NhdHVyZGF5XCddLGQ9bmV3IERhdGUoKTt6PXo/ejowO3o9cGFyc2VGbG9hdCh6KTtpZihzLl90cERTVCl7dmFyIGRzbz1zLl90cERTVFtkLmdldEZ1bGxZZWFyKCldLnNwbGl0KC8sLyk7ZHM9bmV3IERhdGUoZHNvWzBdK1wnL1wnK2QuZ2V0RnVsbFllYXIoKSk7ZGU9bmV3IERhdGUoZHNvWzFdK1wnL1wnK2QuZ2V0RnVsbFllYXIoKSk7aWYoaD09XCduXCcmJmQ+ZHMmJmQ8ZGUpe3o9eisxO31lbHNlIGlmKGg9PVwnc1wnJiYoZD5kZXx8ZDxkcykpe3o9eisxO319ZD1kLmdldFRpbWUoKSsoZC5nZXRUaW1lem9uZU9mZnNldCgpKjYwMDAwKTtkPW5ldyBEYXRlKGQrKDM2MDAwMDAqeikpO0g9ZC5nZXRIb3VycygpO009ZC5nZXRNaW51dGVzKCk7TT0oTTwxMCk/XCcwXCcrTTpNO0Q9ZC5nZXREYXkoKTtVPVwnIEFNXCc7aWYoSD49MTIpe1U9XCcgUE1cJztIPUgtMTI7fWlmKEg9PTApe0g9MTI7fUQ9ZGFbRF07dG09SCtcJzpcJytNK1U7cmV0dXJuKHRtK1wnfFwnK0QpO30nKSwgdC5nZXROZXdSZXBlYXQgPSBuZXcgRnVuY3Rpb24oJ2QnLCAnY24nLCAndmFyIHM9dGhpcyxlPW5ldyBEYXRlKCksY3ZhbCxzdmFsLGN0PWUuZ2V0VGltZSgpO2Q9ZD9kOjMwO2NuPWNuP2NuOlwnc19uclwnO2Uuc2V0VGltZShjdCtkKjI0KjYwKjYwKjEwMDApO2N2YWw9cy5jX3IoY24pO2lmKGN2YWwubGVuZ3RoPT0wKXtzLmNfdyhjbixjdCtcJy1OZXdcJyxlKTtyZXR1cm5cJ05ld1wnO31zdmFsPXMuc3BsaXQoY3ZhbCxcJy1cJyk7aWYoY3Qtc3ZhbFswXTwzMCo2MCoxMDAwJiZzdmFsWzFdPT1cJ05ld1wnKXtzLmNfdyhjbixjdCtcJy1OZXdcJyxlKTtyZXR1cm5cJ05ld1wnO31lbHNle3MuY193KGNuLGN0K1wnLVJlcGVhdFwnLGUpO3JldHVyblwnUmVwZWF0XCc7fScpLCB0LnNwbGl0ID0gbmV3IEZ1bmN0aW9uKCdsJywgJ2QnLCAndmFyIGkseD0wLGE9bmV3IEFycmF5O3doaWxlKGwpe2k9bC5pbmRleE9mKGQpO2k9aT4tMT9pOmwubGVuZ3RoO2FbeCsrXT1sLnN1YnN0cmluZygwLGkpO2w9bC5zdWJzdHJpbmcoaStkLmxlbmd0aCk7fXJldHVybiBhJyksIHQuZ2V0VmFsT25jZSA9IG5ldyBGdW5jdGlvbigndicsICdjJywgJ2UnLCAndCcsICd2YXIgcz10aGlzLGE9bmV3IERhdGUsdj12P3Y6XCdcJyxjPWM/YzpcJ3NfZ3ZvXCcsZT1lP2U6MCxpPXQ9PVwnbVwnPzYwMDAwOjg2NDAwMDAwLGs9cy5jX3IoYyk7aWYodil7YS5zZXRUaW1lKGEuZ2V0VGltZSgpK2UqaSk7cy5jX3coYyx2LGU9PTA/MDphKTt9cmV0dXJuIHY9PWs/XCdcJzp2JyksIHQuYXBsID0gbmV3IEZ1bmN0aW9uKCdsJywgJ3YnLCAnZCcsICd1JywgJ3ZhciBzPXRoaXMsbT0wO2lmKCFsKWw9XCdcJztpZih1KXt2YXIgaSxuLGE9cy5zcGxpdChsLGQpO2ZvcihpPTA7aTxhLmxlbmd0aDtpKyspe249YVtpXTttPW18fCh1PT0xPyhuPT12KToobi50b0xvd2VyQ2FzZSgpPT12LnRvTG93ZXJDYXNlKCkpKTt9fWlmKCFtKWw9bD9sK2Qrdjp2O3JldHVybiBsJyksIHQuc3BsaXQsIHQuZ2V0UXVlcnlQYXJhbSA9IG5ldyBGdW5jdGlvbigncCcsICdkJywgJ3UnLCAndmFyIHM9dGhpcyx2PVwnXCcsaSx0O2Q9ZD9kOlwnXCc7dT11P3U6KHMucGFnZVVSTD9zLnBhZ2VVUkw6cy53ZC5sb2NhdGlvbik7aWYodT09XCdmXCcpdT1zLmd0ZnMoKS5sb2NhdGlvbjt3aGlsZShwKXtpPXAuaW5kZXhPZihcJyxcJyk7aT1pPDA/cC5sZW5ndGg6aTt0PXMucF9ncHYocC5zdWJzdHJpbmcoMCxpKSx1K1wnXCcpO2lmKHQpe3Q9dC5pbmRleE9mKFwnI1wnKT4tMT90LnN1YnN0cmluZygwLHQuaW5kZXhPZihcJyNcJykpOnQ7fWlmKHQpdis9dj9kK3Q6dDtwPXAuc3Vic3RyaW5nKGk9PXAubGVuZ3RoP2k6aSsxKX1yZXR1cm4gdicpLCB0LnBfZ3B2ID0gbmV3IEZ1bmN0aW9uKCdrJywgJ3UnLCAndmFyIHM9dGhpcyx2PVwnXCcsaT11LmluZGV4T2YoXCc/XCcpLHE7aWYoayYmaT4tMSl7cT11LnN1YnN0cmluZyhpKzEpO3Y9cy5wdChxLFwnJlwnLFwncF9ndmZcJyxrKX1yZXR1cm4gdicpLCB0LnBfZ3ZmID0gbmV3IEZ1bmN0aW9uKCd0JywgJ2snLCAnaWYodCl7dmFyIHM9dGhpcyxpPXQuaW5kZXhPZihcJz1cJykscD1pPDA/dDp0LnN1YnN0cmluZygwLGkpLHY9aTwwP1wnVHJ1ZVwnOnQuc3Vic3RyaW5nKGkrMSk7aWYocC50b0xvd2VyQ2FzZSgpPT1rLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHMuZXBhKHYpfXJldHVybiBcJ1wnJyksIHQuZ2V0RGF5c1NpbmNlTGFzdFZpc2l0ID0gbmV3IEZ1bmN0aW9uKCdjJywgJ3ZhciBzPXRoaXMsZT1uZXcgRGF0ZSgpLGVzPW5ldyBEYXRlKCksY3ZhbCxjdmFsX3MsY3ZhbF9zcyxjdD1lLmdldFRpbWUoKSxkYXk9MjQqNjAqNjAqMTAwMCxmMSxmMixmMyxmNCxmNTtlLnNldFRpbWUoY3QrMyozNjUqZGF5KTtlcy5zZXRUaW1lKGN0KzMwKjYwKjEwMDApO2YwPVwnQ29va2llcyBOb3QgU3VwcG9ydGVkXCc7ZjE9XCdGaXJzdCBWaXNpdFwnO2YyPVwnTW9yZSB0aGFuIDMwIGRheXNcJztmMz1cJ01vcmUgdGhhbiA3IGRheXNcJztmND1cJ0xlc3MgdGhhbiA3IGRheXNcJztmNT1cJ0xlc3MgdGhhbiAxIGRheVwnO2N2YWw9cy5jX3IoYyk7aWYoY3ZhbC5sZW5ndGg9PTApe3MuY193KGMsY3QsZSk7cy5jX3coYytcJ19zXCcsZjEsZXMpO31lbHNle3ZhciBkPWN0LWN2YWw7aWYoZD4zMCo2MCoxMDAwKXtpZihkPjMwKmRheSl7cy5jX3coYyxjdCxlKTtzLmNfdyhjK1wnX3NcJyxmMixlcyk7fWVsc2UgaWYoZDwzMCpkYXkrMSAmJiBkPjcqZGF5KXtzLmNfdyhjLGN0LGUpO3MuY193KGMrXCdfc1wnLGYzLGVzKTt9ZWxzZSBpZihkPDcqZGF5KzEgJiYgZD5kYXkpe3MuY193KGMsY3QsZSk7cy5jX3coYytcJ19zXCcsZjQsZXMpO31lbHNlIGlmKGQ8ZGF5KzEpe3MuY193KGMsY3QsZSk7cy5jX3coYytcJ19zXCcsZjUsZXMpO319ZWxzZXtzLmNfdyhjLGN0LGUpO2N2YWxfc3M9cy5jX3IoYytcJ19zXCcpO3MuY193KGMrXCdfc1wnLGN2YWxfc3MsZXMpO319Y3ZhbF9zPXMuY19yKGMrXCdfc1wnKTtpZihjdmFsX3MubGVuZ3RoPT0wKSByZXR1cm4gZjA7ZWxzZSBpZihjdmFsX3MhPWYxJiZjdmFsX3MhPWYyJiZjdmFsX3MhPWYzJiZjdmFsX3MhPWY0JiZjdmFsX3MhPWY1KSByZXR1cm4gXCdcJztlbHNlIHJldHVybiBjdmFsX3M7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VyVHlwZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNhbXBhaWduJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDogU3ViU2VjdGlvbkxldmVsMSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OiBTdWJTZWN0aW9uTGV2ZWwyJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6IFN1YlNlY3Rpb25MZXZlbDMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDI0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6Q291bnRyeUxhbmd1YWdlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6dXNlclR5cGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpQYWdlVHlwZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MycgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6ICclY29udGVudDpTaXRlU2VjdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1wYWlnbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJUNNUElEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHR5cGU6ICdwYWdlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxhMTdiZGQyZjAwODQ0MjRhOTU3OGVjNWY0OTJlYmFmMycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBBbGxvdycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnU01TIEFsbG93JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjk5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVNNUzpTdGVwbmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMzYnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnU01TIEFsbG93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw3OTdlZjU4NDY1ZTE0ZTBmYmQyY2Q4MTZmZWZlMWIxOScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bhc3Nwb3J0OlVwZGF0ZVBhc3N3b3JkU3RhcnRlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRVcGRhdGVQYXNzd29yZFN0YXJ0ZWQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyB0cmFja2VyUHJvcGVydGllczogeyBldmVudHM6IFt7IG5hbWU6ICdldmVudDQ1JyB9XSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMjZiNWEwYTAzNzIwNDM5NmJlOWI0NzM4NWUwODY2ZTknLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTTVMgRGVjbGluZScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnU01TIERlY2xpbmUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU01TOlN0ZXBuYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExNicgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgRGVjbGluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMN2NiNDU1M2I5ZjUxNDFmNTlmNmYxODExYjg3MTY4ZTgnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpBY2NvdW50Q3JlYXRlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRBY2NvdW50Q3JlYXRlZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NDEnIH1dIH0gfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxhMzAwOWJlY2JiMWQ0YTg2ODcwYTEyYjFhMzVlZTZkNScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bhc3Nwb3J0TG9naW5GYWlsdXJlJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFtdLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFtdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkwyYmM3N2IwNTZlNTE0ZDQ0YWZjZmJkY2RmMDZkYTUxNycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBFZGl0IE51bWJlcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnRWRpdCBOdW1iZXInIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU01TOlN0ZXBuYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExMCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgRWRpdCBOdW1iZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGE1YTA2OTVlMDA3ZjQ0ZWRhYzJmNDc4N2ViYjM2YjVhJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6VXBkYXRlUGFzc3dvcmRFeGl0JywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdwYXNzcG9ydFVwZGF0ZVBhc3N3b3JkRXhpdCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NDYnIH1dIH0gfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw0YTk5ODExMzA2ZDg0MjgzODY2M2E3ZGQxNmFkM2JiZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnU01TIEVycm9yJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNTQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU01TOlNpdGVFcnJvciAlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjg5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVVzZXIgU3RhdHVzJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVM6U3RlcG5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExOCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGIyYmE1NGU1MWRiMzRmNzU4ZTMyZGYwMjdjZWU3MjQzJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6QWNjb3VudENvbmZpcm1lZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRBY2NvdW50Q29uZmlybWVkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHJhY2tlclByb3BlcnRpZXM6IHsgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ0MicgfV0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdQYXNzcG9ydCBFdmVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDVlOGQxOTVjODMwYjQyOTFhNjJhMDQ5Nzc5NTI2MjZhJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU01TIFZlcmlmeSBOdW1iZXInLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ1NNUyBWZXJpZnkgTnVtYmVyJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyODknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclVXNlciBTdGF0dXMlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjk5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVNNUzpTdGVwbmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTM0JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1NNUyBWZXJpZnkgTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw2ZDVkYmQzNzY4ZjY0OGI1YTlhODY0YzkxNjIwOWYzZScsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyAtIENvbnNpZGVyRm9yT3RoZXJKb2JPcHBvcnR1bml0aWVzT3B0aW9uU2VsZWN0ZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ0NvbnNpZGVyRm9yT3RoZXJKb2JPcHBvcnR1bml0aWVzT3B0aW9uU2VsZWN0ZWQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyOTgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclU01TIC0gT3B0aW9uIFNlbGVjdGVkJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExOScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDb25zaWRlckZvck90aGVySm9iT3Bwb3J0dW5pdGllc09wdGlvblNlbGVjdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxjOWY0MWE5M2RmM2E0YjcwODVjZTZmNTFmMTIzNWQ3OCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bhc3Nwb3J0OkZvcmdvdFBhc3N3b3JkU3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRGb3Jnb3RQYXNzd29yZFN1Y2Nlc3MnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyB0cmFja2VyUHJvcGVydGllczogeyBldmVudHM6IFt7IG5hbWU6ICdldmVudDQ5JyB9XSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNzAyYzQ5YzI1ZDUwNDM4M2FjMGY3YTJiYTlhNTc0NDYnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTTVMgRmxvdyBDYW5jZWxsZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ1NNUyBGbG93IENhbmNlbGxlZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjg5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVVzZXIgU3RhdHVzJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVM6U3RlcG5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExNCcgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdTTVMgRmxvdyBDYW5jZWxsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDNmNDdhYmIxNTM1YjRmNDc5NDM3YWZjZjQ5Y2QwYmViJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6TG9naW5TdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdwYXNzcG9ydExvZ2luU3VjY2VzcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDQ0JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZDA0MDdhYWQwZTQ4NGU1NmEyYjE0NmM5NDMwOTkwNDInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpGb3Jnb3RQYXNzd29yZFJlcXVlc3QnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3Bhc3Nwb3J0Rm9yZ290UGFzc3dvcmRSZXF1ZXN0JyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgdHJhY2tlclByb3BlcnRpZXM6IHsgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ0OCcgfV0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdQYXNzcG9ydCBFdmVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDJhMzIzMWU4MzM4MTQ0ZWJiYzY2NzhlNWQ5ZmViNGZmJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU01TIC1TYXZlIE51bWJlciBhbmQgVmVyaWZ5IExhdGVyJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdTTVMgU2F2ZSBOdW1iZXIgYW5kIFZlcmlmeSBMYXRlcicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTM3JyB9XSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1NNUyBTYXZlIE51bWJlciBhbmQgVmVyaWZ5IExhdGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxlMjFkODgyNzNjZTQ0YjViOGI5NmM0NDViYmMyZjZmNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bhc3Nwb3J0OkZvcmdvdFBhc3N3b3JkRXJyb3InLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3Bhc3Nwb3J0Rm9yZ290UGFzc3dvcmRFcnJvcicgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50NTAnIH1dIH0gfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnUGFzc3BvcnQgRXZlbnRzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxhOTJlNTM4NTcyZmE0ZmNhOWI1ZGY4NDY2MTliOWVkZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1NNUyBFbmFibGUgU01TIFVwZGF0ZXMnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ0VuYWJsZSBTTVMgVXBkYXRlcycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI5OScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVTTVM6U3RlcG5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTMwJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1NNUyBFbmFibGUgU01TIFVwZGF0ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGJmNzA3ZDhhYTAwNTQ3NWI4ZjIxNzE1ZGE5YmRiODA0JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU01TIC0gU01TT3B0ZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ1NNU09wdGVkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjU2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVNNUyAtIEV2ZW50IC0gc21zT3B0ZWRJbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMTcnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnU01TT3B0ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGQ2ZWI4ZTBiNjg1ZTRhNTBiNTFiMjVhNzZhNDM5MmMxJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbGF1bmNoX2Fzc2Vzc21lbnQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3R5X2FwcF9sYXVuY2hfYXNzZXNzbWVudCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IHRyYWNrZXJQcm9wZXJ0aWVzOiB7IGV2ZW50czogW3sgbmFtZTogJ2V2ZW50MTMzJyB9XSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ2xhdW5jaF9hc3Nlc3NtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkxmZDA1MTAxZDFkMzk0YzkwYWYwNTQxM2NhN2FhOTUwNicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Bhc3Nwb3J0OkxvZ2luRmFpbHVyZScsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRMb2dpbkZhaWx1cmUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMjYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclZXZlbnQuZGV0YWlsLmV2ZW50RGV0YWlsJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDQzJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMNDM5ZjE5MzE2ODAwNGQwN2E2MWJmMGY1MTk4ZmJjY2InLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdJbml0aWFsaXplIFBsdWdpbnMnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2xpYnJhcnlMb2FkZWQuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiAzMAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvbW1vbi1hbmFseXRpY3MtcGx1Z2lucy9zcmMvbGliL2FjdGlvbnMvaW5pdGlhbGl6ZS5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBsOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHY6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwbzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2djOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbnI6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwbjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B2OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncXA6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdybDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RwOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndmQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ZvOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmw6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcHY6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwbHQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0YmU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0dGM6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkc2x2OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndHNsdjogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGQ3MWU3NjVmMzRmODQ1MjY4MTVhOTczOTMyYTk0ZTdkJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU01TIC0gRGl2ZXJnZW50TnVtYmVyQWN0aW9uQ2xpY2tlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAnRGl2ZXJnZW50TnVtYmVyQWN0aW9uQ2xpY2tlZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkaWdpdGFsRGF0YS5ldmVudERhdGEuYWN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5lVmFyODggPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogeyBldmVudHM6IFt7IG5hbWU6ICdldmVudDEzMScgfV0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnRGl2ZXJnZW50TnVtYmVyQWN0aW9uQ2xpY2tlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMYTcyODkzMDViYWUxNDBhOGIwNmE1Nzg0NDRlYjM2MzUnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpTb2NpYWxMb2dpblN1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3Bhc3Nwb3J0U29jaWFsTG9naW5TdWNjZXNzJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnVzZXJUeXBlJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNhbXBhaWduJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIzMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnVzZXJJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclcGFzc3BvcnRFdmVudFBhcmFtcyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ3MScgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6ICclY29udGVudDpTaXRlU2VjdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZTogJyVjb250ZW50OlBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdQYXNzcG9ydCBFdmVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDg1ZTZlNzJhMjY4NDRjZjNhZWFjMmEwMTlkNmNmMjk1JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6U29jaWFsTG9naW5TdWNjZXNzQWxyZWFkeUxpbmtlZCcsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvZGlyZWN0Q2FsbC5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogeyBpZGVudGlmaWVyOiAncGFzc3BvcnRTb2NpYWxMb2dpblN1Y2Nlc3NBbHJlYWR5TGlua2VkJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OlBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6dXNlclR5cGUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjMwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6dXNlcklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjYW1wYWlnbiUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wNDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclcGFzc3BvcnRFdmVudFBhcmFtcyUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ3NCcgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWw6ICclY29udGVudDpTaXRlU2VjdGlvbiUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTmFtZTogJyVjb250ZW50OlBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdQYXNzcG9ydCBFdmVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDk4YjhjYWI4ODMwZDRjMTc5ZDdkNWU0ZDY1NDZhNDY4JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFzc3BvcnQ6U29jaWFsTG9naW5Jbml0aWF0ZWQnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ3Bhc3Nwb3J0U29jaWFsTG9naW5Jbml0aWF0ZWQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VyVHlwZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNhbXBhaWduJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVwYXNzcG9ydEV2ZW50UGFyYW1zJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDcwJyB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogJyVjb250ZW50OlNpdGVTZWN0aW9uJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZjE3Zjg1MGE0ZGZkNDY4YWFhYjQzZWU2MjZmNDVlNjEnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwYXNzcG9ydDpTb2NpYWxMb2dpbkFjY291bnRDcmVhdGVkJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdwYXNzcG9ydFNvY2lhbExvZ2luQWNjb3VudENyZWF0ZWQnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VyVHlwZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMzAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDp1c2VySUQlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjE0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNhbXBhaWduJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3A0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVwYXNzcG9ydEV2ZW50UGFyYW1zJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDcyJyB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDogJyVjb250ZW50OlNpdGVTZWN0aW9uJScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ1Bhc3Nwb3J0IEV2ZW50cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMZmNmMmVjMzQyNDk4NDg5Yzg3YmU4OTIxZTBhZjEzMGQnLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDb25zZW50IC0gQ29va2llIEFjY2VwdCBGb3JtJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJyNidG4tYWNjZXB0LWNvb2tpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gVmlzaXRvci5nZXRJbnN0YW5jZSgnQ0NCQzg3OUQ1NTcyMDcwRTdGMDAwMTAxQEFkb2JlT3JnJykuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKHQuZVZhcjYgPSBuKSwgdC5saW5rVHJhY2tWYXJzID0gJ2V2ZW50cyxlVmFyNixlVmFyNSxwcm9wMTMnLCB0LmxpbmtUcmFja0V2ZW50cyA9ICdldmVudDkwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXI1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWNvbnRlbnQ6UGFnZU5hbWUlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwcm9wMTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclUGFnZSBVUkwlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sgbmFtZTogJ2V2ZW50OTAnIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnQ29uc2VudCBGb3JtIC0gQ29va2llIEFjY2VwdCBBbGwgQnV0dG9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw3NjA4NDE1MzgyOTM0MTlhOWFlYWIwZjE5ZjY3OWY4NycsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1x1MjAyMlx0TG9naW4gd2l0aCBBbWF6b24gaW5pdGlhbGl6YXRpb24nLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnI2J0bi1sd2EtaW5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBWaXNpdG9yLmdldEluc3RhbmNlKCc0RUUxQkI2NTU1RjkzNjlBN0YwMDAxMDFAQWRvYmVPcmcnKS5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAodC5lVmFyNiA9IG4pLCB0LmxpbmtUcmFja1ZhcnMgPSAnZXZlbnRzLGVWYXI2LGVWYXI1LHByb3AxMycsIHQubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50OTInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVQYWdlIFVSTCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ5MicgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDb25zZW50IEZvcm0tQ3VzdG9taXplIENvb2tpZSBCdXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTGNlNzc1YjZlMzZkZjQwMzk5YWM0N2ZmMjAwY2FjZTM2JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQ29uc2VudCAtIEN1c3RvbWl6ZSBDb29raWUgQ2xpY2snLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2NsaWNrLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFNlbGVjdG9yOiAnI2J0bi1jdXN0b21pemUtY29va2llcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmUGFyZW50OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZDaGlsZEZpcmVkOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tU2V0dXA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBWaXNpdG9yLmdldEluc3RhbmNlKCdDQ0JDODc5RDU1NzIwNzBFN0YwMDAxMDFAQWRvYmVPcmcnKS5nZXRNYXJrZXRpbmdDbG91ZFZpc2l0b3JJRCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAodC5lVmFyNiA9IG4pLCB0LmxpbmtUcmFja1ZhcnMgPSAnZXZlbnRzLGVWYXI2LGVWYXI1LHByb3AxMycsIHQubGlua1RyYWNrRXZlbnRzID0gJ2V2ZW50OTEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OlBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OnBlcnNvbklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVQYWdlIFVSTCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQ5MScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdDb25zZW50IEZvcm0tQ3VzdG9taXplIENvb2tpZSBCdXR0b24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDkzOWQ4ZjJkZTU2ZDQ5YjJhODgyZDU0YWJlYTFiMjQ1JywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnRW1haWwgVmVyaWZ5IGJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2NvcmUvc3JjL2xpYi9ldmVudHMvY2xpY2suanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50U2VsZWN0b3I6ICcuYnRuLmJ0bi1tYWluLmJ0bi5idG4tZGVmYXVsdC5idG4tYmxvY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZlBhcmVudDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnViYmxlRmlyZUlmQ2hpbGRGaXJlZDogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlT3JkZXI6IDUwCiAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIGFjdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvY2xlYXJWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NldFZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbVNldHVwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gVmlzaXRvci5nZXRJbnN0YW5jZSgnNEVFMUJCNjU1NUY5MzY5QTdGMDAwMTAxQEFkb2JlT3JnJykuZ2V0TWFya2V0aW5nQ2xvdWRWaXNpdG9ySUQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKHQuZVZhcjYgPSBuKSwgdC5saW5rVHJhY2tWYXJzID0gJ2V2ZW50cyxlVmFyNixlVmFyNSxwcm9wMTMnLCB0LmxpbmtUcmFja0V2ZW50cyA9ICdldmVudDExMSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXJQcm9wZXJ0aWVzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVWYXJzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVjb250ZW50OlBhZ2VOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcDEzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJVBhZ2UgVVJMJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDExMScgfV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL3NlbmRCZWFjb24uanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua05hbWU6ICdFbWFpbCBWZXJpZnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUeXBlOiAnbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWQ6ICdSTDliNjc2ZDhhNTk3YzQ4MDU4MmYxNmQ4YjZhMDYxNTcxJywKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnU2VuZCBNZSBOZXcgQ29kZSBidXR0b24gJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9jbGljay5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRTZWxlY3RvcjogJy5idG4uYnRuLXNlY29uZGFyeS5idG4uYnRuLWRlZmF1bHQuYnRuLWJsb2NrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWJibGVGaXJlSWZQYXJlbnQ6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1YmJsZUZpcmVJZkNoaWxkRmlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TZXR1cDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFZpc2l0b3IuZ2V0SW5zdGFuY2UoJzRFRTFCQjY1NTVGOTM2OUE3RjAwMDEwMUBBZG9iZU9yZycpLmdldE1hcmtldGluZ0Nsb3VkVmlzaXRvcklEKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICh0LmVWYXI2ID0gbiksIHQubGlua1RyYWNrVmFycyA9ICdldmVudHMsZVZhcjYsZVZhcjUscHJvcDEzJywgdC5saW5rVHJhY2tFdmVudHMgPSAnZXZlbnQxMTInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZVZhcjUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclY29udGVudDpQYWdlTmFtZSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3Byb3AxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVQYWdlIFVSTCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBbeyBuYW1lOiAnZXZlbnQxMTInIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZW5kQmVhY29uLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2xpbmsnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtOYW1lOiAnU2VuZCBNZSBOZXcgQ29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua1R5cGU6ICdvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZDogJ1JMMGRkZDM5MTI3YWQ0NGJmN2E0ZGNjZGU2ZTNlM2ExYzInLAogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdKb2IgcGFnZSAtIE5vdCBmb3IgbWUgYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnY29yZS9zcmMvbGliL2V2ZW50cy9kaXJlY3RDYWxsLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7IGlkZW50aWZpZXI6ICdKb2JOb3RGb3JNZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcmRlcjogNTAKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uczogW10sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9jbGVhclZhcmlhYmxlcy5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2V0VmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tlclByb3BlcnRpZXM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVZhcnM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndmFsdWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJWpvYkRlc2NyaXB0aW9uOmpvYklEJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDkzJyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBOb3QgRm9yIE1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw5ZGUzZGE3NjJjZTE0OWVjODA0NDBjMTU4N2IxN2ViMCcsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0pvYkFwcGxpY2F0aW9uOkpvYlJlZmVyTW9kYWxDbGlja1Rocm91Z2gnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2pvYlJlZmVyQ2xpY2tUaHJvdWdoJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JDYXRlZ29yeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iRGl2aXNpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDk2JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBSZWZlciBNb2RhbCBDbGljayBUaHJvdWdoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlkOiAnUkw5MTBjMWQ5YjVjYzc0YjM1ODcyNjBkNjRmMGFlMjNhZicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0pvYkFwcGxpY2F0aW9uOkpvYkFwcGx5TW9kYWxDbGlja1Rocm91Z2gnLAogICAgICAgICAgICAgICAgICAgIGV2ZW50czogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdjb3JlL3NyYy9saWIvZXZlbnRzL2RpcmVjdENhbGwuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsgaWRlbnRpZmllcjogJ2pvYkFwcGx5Q2xpY2tUaHJvdWdoJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9yZGVyOiA1MAogICAgICAgICAgICAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zOiBbXSwKICAgICAgICAgICAgICAgICAgICBhY3Rpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVBhdGg6ICdhZG9iZS1hbmFseXRpY3Mvc3JjL2xpYi9hY3Rpb25zL2NsZWFyVmFyaWFibGVzLmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7fQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQYXRoOiAnYWRvYmUtYW5hbHl0aWNzL3NyYy9saWIvYWN0aW9ucy9zZXRWYXJpYWJsZXMuanMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyUHJvcGVydGllczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVmFyczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JJRCUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JOYW1lJScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VWYXIyMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJyVqb2JEZXNjcmlwdGlvbjpqb2JDYXRlZ29yeSUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlVmFyMjInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICclam9iRGVzY3JpcHRpb246am9iRGl2aXNpb24lJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHM6IFt7IG5hbWU6ICdldmVudDk1JyB9XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUGF0aDogJ2Fkb2JlLWFuYWx5dGljcy9zcmMvbGliL2FjdGlvbnMvc2VuZEJlYWNvbi5qcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaW5rJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rTmFtZTogJ0pvYiBBcHBseSBNb2RhbCBDbGljayBUaHJvdWdoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rVHlwZTogJ28nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICB9OwogICAgICAgIHZhciAkX19fdmFyXzIxYjMwZjhmNzA4MTNhNzggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICBpZiAobi5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgdmFyIGEgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCBlKTsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwgZSwgdC5nZXQgPyB0IDogewogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSksIGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IHsgZXhwb3J0czoge30gfTsKICAgICAgICAgICAgICAgIHJldHVybiBlKHQsIHQuZXhwb3J0cyksIHQuZXhwb3J0czsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBuKHQpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5yZXNvbHZlKHQoKSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnJlamVjdChlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZSAmJiAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaShlLCB0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGUuYXBwbHkodCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgcikpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvbWlzZXMgbXVzdCBiZSBjb25zdHJ1Y3RlZCB2aWEgbmV3Jyk7CiAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAwLCB0aGlzLl9oYW5kbGVkID0gITEsIHRoaXMuX3ZhbHVlID0gdW5kZWZpbmVkLCB0aGlzLl9kZWZlcnJlZHMgPSBbXSwgcChlLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzKGEsIGkpIHsKICAgICAgICAgICAgICAgIGZvciAoOyAzID09PSBhLl9zdGF0ZTspCiAgICAgICAgICAgICAgICAgICAgYSA9IGEuX3ZhbHVlOwogICAgICAgICAgICAgICAgMCAhPT0gYS5fc3RhdGUgPyAoYS5faGFuZGxlZCA9ICEwLCByLl9pbW1lZGlhdGVGbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAxID09PSBhLl9zdGF0ZSA/IGkub25GdWxmaWxsZWQgOiBpLm9uUmVqZWN0ZWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZShhLl92YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGMoaS5wcm9taXNlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvKGkucHJvbWlzZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICgxID09PSBhLl9zdGF0ZSA/IG8gOiBjKShpLnByb21pc2UsIGEuX3ZhbHVlKTsKICAgICAgICAgICAgICAgIH0pKSA6IGEuX2RlZmVycmVkcy5wdXNoKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSwgdCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBpZiAodCA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAoJ29iamVjdCcgPT0gdHlwZW9mIHQgfHwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnRoZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9zdGF0ZSA9IDMsIGUuX3ZhbHVlID0gdCwgdm9pZCB1KGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHAoaShuLCB0KSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGUuX3N0YXRlID0gMSwgZS5fdmFsdWUgPSB0LCB1KGUpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgIGMoZSwgYSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCB0KSB7CiAgICAgICAgICAgICAgICBlLl9zdGF0ZSA9IDIsIGUuX3ZhbHVlID0gdCwgdShlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgIDIgPT09IGUuX3N0YXRlICYmIDAgPT09IGUuX2RlZmVycmVkcy5sZW5ndGggJiYgci5faW1tZWRpYXRlRm4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGUuX2hhbmRsZWQgfHwgci5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oZS5fdmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgbiA9IGUuX2RlZmVycmVkcy5sZW5ndGg7IHQgPCBuOyB0KyspCiAgICAgICAgICAgICAgICAgICAgcyhlLCBlLl9kZWZlcnJlZHNbdF0pOwogICAgICAgICAgICAgICAgZS5fZGVmZXJyZWRzID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHRoaXMub25GdWxmaWxsZWQgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBlID8gZSA6IG51bGwsIHRoaXMub25SZWplY3RlZCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgPyB0IDogbnVsbCwgdGhpcy5wcm9taXNlID0gbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gITE7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCAobiA9ICEwLCBvKHQsIGUpKTsKICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBuIHx8IChuID0gITAsIGModCwgZSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgbiA9ICEwLCBjKHQsIGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGUgfHwgZSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG0oKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LmFzc2lnbikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IFN0cmluZygnYWJjJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVbNV0gPSAnZGUnLCAnNScgPT09IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IHt9LCBuID0gMDsgbiA8IDEwOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHRbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShuKV0gPSBuOwogICAgICAgICAgICAgICAgICAgIGlmICgnMDEyMzQ1Njc4OScgIT09IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJycpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhW2VdID0gZTsKICAgICAgICAgICAgICAgICAgICB9KSwgJ2FiY2RlZmdoaWprbG1ub3BxcnN0JyA9PT0gT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgYSkpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBnKGUsIHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHdpbmRvdy5hdG9iKSB7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZXZlbnRzICYmIHQuZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuLnNvcnQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmV2ZW50LnJ1bGVPcmRlciAtIHQuZXZlbnQucnVsZU9yZGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCB2ID0gJ2RlYnVnJywgaCA9IGZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndHJ1ZScgPT09IHQuZ2V0SXRlbSh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0SXRlbSh2LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkgPSBbXSwgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUub3V0cHV0RW5hYmxlZCA9IG4oKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWJ1Z0NoYW5nZWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWJ1Z0VuYWJsZWQ6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREZWJ1Z0VuYWJsZWQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpICE9PSB0ICYmIChhKHQpLCBlLm91dHB1dEVuYWJsZWQgPSB0LCBpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgeSA9ICdNb2R1bGUgZGlkIG5vdCBleHBvcnQgYSBmdW5jdGlvbi4nLCBfID0gZnVuY3Rpb24gKHIsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gci5nZXRNb2R1bGVFeHBvcnRzKGUubW9kdWxlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHMoZS5zZXR0aW5ncyB8fCB7fSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5iaW5kKG51bGwsIGkpLmFwcGx5KG51bGwsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIFAgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgPyBlLnJlcGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgfSwgUyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgTE9HOiAnbG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgSU5GTzogJ2luZm8nLAogICAgICAgICAgICAgICAgICAgICAgICBERUJVRzogJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgV0FSTjogJ3dhcm4nLAogICAgICAgICAgICAgICAgICAgICAgICBFUlJPUjogJ2Vycm9yJwogICAgICAgICAgICAgICAgICAgIH0sIEMgPSAnXHVEODNEXHVERTgwJywgayA9IDEwID09PSBwYXJzZUludCgoL21zaWUgKFxkKykvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSB8fCBbXSlbMV0pID8gJ1tMYXVuY2hdJyA6IEMsIGogPSAhMSwgRCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICYmIHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnVuc2hpZnQoayksIGUgIT09IFMuREVCVUcgfHwgd2luZG93LmNvbnNvbGVbZV0gfHwgKGUgPSBTLklORk8pLCB3aW5kb3cuY29uc29sZVtlXS5hcHBseSh3aW5kb3cuY29uc29sZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCB3ID0gRC5iaW5kKG51bGwsIFMuTE9HKSwgViA9IEQuYmluZChudWxsLCBTLklORk8pLCBJID0gRC5iaW5kKG51bGwsIFMuREVCVUcpLCBUID0gRC5iaW5kKG51bGwsIFMuV0FSTiksIEUgPSBELmJpbmQobnVsbCwgUy5FUlJPUiksIE8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZzogdywKICAgICAgICAgICAgICAgICAgICAgICAgaW5mbzogViwKICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc6IEksCiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm46IFQsCiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBFLAogICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9ICEwLCBELmFwcGx5KG51bGwsIEFycmF5LnByb3RvdHlwZS5jb25jYXQoUy5XQVJOLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSksIGUgfHwgKGogPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBvdXRwdXRFbmFibGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGo7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBvdXRwdXRFbmFibGVkKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVQcmVmaXhlZExvZ2dlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ1snICsgZSArICddJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nOiB3LmJpbmQobnVsbCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbzogVi5iaW5kKG51bGwsIHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiBJLmJpbmQobnVsbCwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybjogVC5iaW5kKG51bGwsIHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBFLmJpbmQobnVsbCwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBBID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzIDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdyA6ICd1bmRlZmluZWQnICE9IHR5cGVvZiBnbG9iYWwgPyBnbG9iYWwgOiAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygc2VsZiA/IHNlbGYgOiB7fSwgTSA9IHQoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5leHBvcnRzID0gZSgpLCAhITApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdy5Db29raWVzLCBuID0gd2luZG93LkNvb2tpZXMgPSBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LkNvb2tpZXMgPSB0LCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgdCA9IHt9OyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2FdID0gblthXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8oJVswLTlBLVpdezJ9KSsvZywgZGVjb2RlVVJJQ29tcG9uZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUobCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGRvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PSB0eXBlb2YgKG4gPSBjKHsgcGF0aDogJy8nIH0sIG8uZGVmYXVsdHMsIG4pKS5leHBpcmVzICYmIChuLmV4cGlyZXMgPSBuZXcgRGF0ZSgxICogbmV3IERhdGUoKSArIDg2NDAwMDAwICogbi5leHBpcmVzKSksIG4uZXhwaXJlcyA9IG4uZXhwaXJlcyA/IG4uZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gSlNPTi5zdHJpbmdpZnkodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL15bXHtcW10vLnRlc3QoYSkgJiYgKHQgPSBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBsLndyaXRlID8gbC53cml0ZSh0LCBlKSA6IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodCkpLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCksIGUgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGUpKS5yZXBsYWNlKC8lKDIzfDI0fDI2fDJCfDVFfDYwfDdDKS9nLCBkZWNvZGVVUklDb21wb25lbnQpLnJlcGxhY2UoL1tcKFwpXS9nLCBlc2NhcGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdICYmIChpICs9ICc7ICcgKyByLCAhMCAhPT0gbltyXSAmJiAoaSArPSAnPScgKyBuW3JdLnNwbGl0KCc7JylbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5jb29raWUgPSBlICsgJz0nICsgdCArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSB7fSwgYSA9IGRvY3VtZW50LmNvb2tpZSA/IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOyAnKSA6IFtdLCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGFbaV0uc3BsaXQoJz0nKSwgcyA9IHIuc2xpY2UoMSkuam9pbignPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgfHwgJyInICE9PSBzLmNoYXJBdCgwKSB8fCAocyA9IHMuc2xpY2UoMSwgLTEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHUoclswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID0gKGwucmVhZCB8fCBsKShzLCBvKSB8fCB1KHMpLCB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gSlNPTi5wYXJzZShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5bb10gPSBzLCBlID09PSBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gbltlXSA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uc2V0ID0gbiwgby5nZXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChlLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgby5nZXRKU09OID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZSwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8ucmVtb3ZlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihlLCAnJywgYyh0LCB7IGV4cGlyZXM6IC0xIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvLmRlZmF1bHRzID0ge30sIG8ud2l0aENvbnZlcnRlciA9IGUsIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIEwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogTS5nZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogTS5zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogTS5yZW1vdmUKICAgICAgICAgICAgICAgICAgICB9LCBOID0gd2luZG93LCB4ID0gJ2NvbS5hZG9iZS5yZWFjdG9yLicsIFIgPSBmdW5jdGlvbiAoYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHggKyAoZSB8fCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJdGVtOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNTM4NWJmZGFhZWEyOTc1ZSA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKSwgJF9fX29sZF84ZDNiZTNjYjQ0Mjc3ZWE0ID0ge30uY29uc3RydWN0b3IuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNTM4NWJmZGFhZWEyOTc1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja181YmM4NGJhM2ViZjQyYmU4LmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF84ZDNiZTNjYjQ0Mjc3ZWE0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJywgJF9fX21vY2tfNWJjODRiYTNlYmY0MmJlOC5zZXNzaW9uU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlthXS5nZXRJdGVtKGkgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzUzODViZmRhYWVhMjk3NWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF81Mzg1YmZkYWFlYTI5NzVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzhkM2JlM2NiNDQyNzdlYTQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnc2Vzc2lvblN0b3JhZ2UnLCAkX19fb2xkXzhkM2JlM2NiNDQyNzdlYTQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2Q3YzFlNTc4ZGYzMTNjN2YgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZDdjMWU1NzhkZjMxM2M3ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja181YmM4NGJhM2ViZjQyYmU4LmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlthXS5zZXRJdGVtKGkgKyBlLCB0KSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfZDdjMWU1NzhkZjMxM2M3ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkX2Q3YzFlNTc4ZGYzMTNjN2YpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgRiA9ICdfc2RzYXRfJywgQiA9ICdkYXRhRWxlbWVudHMuJywgVSA9ICdkYXRhRWxlbWVudENvb2tpZXNNaWdyYXRlZCcsIEggPSBSKCdsb2NhbFN0b3JhZ2UnKSwgeiA9IFIoJ3Nlc3Npb25TdG9yYWdlJywgQiksIFcgPSBSKCdsb2NhbFN0b3JhZ2UnLCBCKSwgSiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUEFHRVZJRVc6ICdwYWdldmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgIFNFU1NJT046ICdzZXNzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgVklTSVRPUjogJ3Zpc2l0b3InCiAgICAgICAgICAgICAgICAgICAgfSwgcSA9IHt9LCBHID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gSlNPTi5zdHJpbmdpZnkoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9LCBZID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEouUEFHRVZJRVc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAocVtlXSA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEouU0VTU0lPTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkICgoYSA9IEcobikpICYmIHouc2V0SXRlbShlLCBhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSi5WSVNJVE9SOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKChhID0gRyhuKSkgJiYgVy5zZXRJdGVtKGUsIGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIEsgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEwuZ2V0KEYgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbiAhPT0gdW5kZWZpbmVkICYmIFkoZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgfSwgUSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWU6IFksCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSi5QQUdFVklFVzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcS5oYXNPd25Qcm9wZXJ0eShlKSA/IHFbZV0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKLlNFU1NJT046CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IChuID0gei5nZXRJdGVtKGUpKSA/IG4gOiBKU09OLnBhcnNlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBKLlZJU0lUT1I6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IChuID0gVy5nZXRJdGVtKGUpKSA/IG4gOiBKU09OLnBhcnNlKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBtaWdyYXRlQ29va2llRGF0YTogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguZ2V0SXRlbShVKSB8fCAoT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsoZSwgdFtlXS5zdG9yYWdlRHVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIEguc2V0SXRlbShVLCAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgJCA9IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRmFpbGVkIHRvIGV4ZWN1dGUgZGF0YSBlbGVtZW50IG1vZHVsZSAnICsgZS5tb2R1bGVQYXRoICsgJyBmb3IgZGF0YSBlbGVtZW50ICcgKyB0ICsgJy4gJyArIG4gKyAoYSA/ICdcbicgKyBhIDogJycpOwogICAgICAgICAgICAgICAgICAgIH0sIFggPSBmdW5jdGlvbiAobywgYywgbCwgdSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIGkgPSBuLnN0b3JhZ2VEdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IG8uZ2V0TW9kdWxlRXhwb3J0cyhuLm1vZHVsZVBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIE8uZXJyb3IoJChuLCBlLCBzLm1lc3NhZ2UsIHMuc3RhY2spKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGEobChuLnNldHRpbmdzLCB0KSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBPLmVycm9yKCQobiwgZSwgcy5tZXNzYWdlLCBzLnN0YWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICYmIChudWxsICE9IHIgPyBRLnNldFZhbHVlKGUsIGksIHIpIDogciA9IFEuZ2V0VmFsdWUoZSwgaSkpLCBudWxsID09IHIgJiYgbnVsbCAhPSBuLmRlZmF1bHRWYWx1ZSAmJiAociA9IG4uZGVmYXVsdFZhbHVlKSwgJ3N0cmluZycgPT0gdHlwZW9mIHIgJiYgKG4uY2xlYW5UZXh0ICYmIChyID0gUChyKSksIG4uZm9yY2VMb3dlckNhc2UgJiYgKHIgPSByLnRvTG93ZXJDYXNlKCkpKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8uZXJyb3IoJChuLCBlLCAnTW9kdWxlIGRpZCBub3QgZXhwb3J0IGEgZnVuY3Rpb24uJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIFogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5UZXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAoZS50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBlZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIGkgPSBlLCByID0gMCwgcyA9IHQubGVuZ3RoOyByIDwgczsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHRbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiAnQCcgPT09IG8uY2hhckF0KDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBvLnNsaWNlKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBaW2NdKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpLmdldEF0dHJpYnV0ZSAmJiAoYSA9IG8ubWF0Y2goL15nZXRBdHRyaWJ1dGVcKCguKylcKSQvKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGFbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkuZ2V0QXR0cmlidXRlKGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGlbb107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgdGUgPSBmdW5jdGlvbiAociwgcywgbykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG8oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUuc3BsaXQoJy4nKSwgaSA9IGEuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcycgPT09IGkgPyB0ICYmIChuID0gZWUodC5lbGVtZW50LCBhLCAhMCkpIDogJ2V2ZW50JyA9PT0gaSA/IHQgJiYgKG4gPSBlZSh0LCBhKSkgOiAndGFyZ2V0JyA9PT0gaSA/IHQgJiYgKG4gPSBlZSh0LnRhcmdldCwgYSkpIDogbiA9IGVlKHJbaV0sIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgbmUgPSBmdW5jdGlvbiAobiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5zcGxpdCgnLicpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oYShlKSB8fCAndGhpcycgPT09IHQgfHwgJ2V2ZW50JyA9PT0gdCB8fCAndGFyZ2V0JyA9PT0gdCB8fCBuLmhhc093blByb3BlcnR5KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBhZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0geyBleHBvcnRzOiB7fSB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxsKGEuZXhwb3J0cywgYSwgYS5leHBvcnRzLCB0LCBuKSwgYS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIH0sIGllID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHt9LCBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHNbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZSAnICsgZSArICcgbm90IGZvdW5kLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdFcnJvciBpbml0aWFsaXppbmcgbW9kdWxlICcgKyBlICsgJy4gJyArIG4ubWVzc2FnZSArIChuLnN0YWNrID8gJ1xuJyArIG4uc3RhY2sgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaGFzT3duUHJvcGVydHkoJ2V4cG9ydHMnKSB8fCAodC5leHBvcnRzID0gYWUodC5kZWZpbml0aW9uLnNjcmlwdCwgdC5yZXF1aXJlLCB0LnR1cmJpbmUpKSwgdC5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyTW9kdWxlOiBmdW5jdGlvbiAoZSwgdCwgbiwgYSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25OYW1lOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJiaW5lOiBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnJlcXVpcmUgPSBhLCBzW2VdID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWRyYXRlQ2FjaGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGVFeHBvcnRzOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlRGVmaW5pdGlvbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbihlKS5kZWZpbml0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZUV4dGVuc2lvbk5hbWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oZSkuZXh0ZW5zaW9uTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCByZSA9ICExLCBzZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLl9tb25pdG9yczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKHJlIHx8IChPLndhcm4oJ1RoZSBfc2F0ZWxsaXRlLl9tb25pdG9ycyBBUEkgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLicpLCByZSA9ICEwKSwgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSAmJiBlW3RdKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIG9lID0gZnVuY3Rpb24gKGksIHIsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIGEsIG8sIGMsIGwgPSBbXSwgdSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLnBvcCgpLCBudWxsID09IGEgJiYgcyA/ICcnIDogYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gL14lKFteJV0rKSUkLy5leGVjKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyB1KGUsIHRbMV0sIG4pIDogZS5yZXBsYWNlKC8lKC4rPyklL2csIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0ge30sIGEgPSBPYmplY3Qua2V5cyhlKSwgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhW2ldLCBzID0gZVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gYyhzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBvID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBbXSwgYSA9IDAsIGkgPSBlLmxlbmd0aDsgYSA8IGk7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goYyhlW2FdLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgPyBuKGUsIHQpIDogQXJyYXkuaXNBcnJheShlKSA/IG8oZSwgdCkgOiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBudWxsICE9PSBlID8gYShlLCB0KSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAgPCBsLmxlbmd0aCA/IChPLmVycm9yKCdEYXRhIGVsZW1lbnQgY2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAnICsgbC5qb2luKCcgLT4gJykpLCBlKSA6IGMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgY2UgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2FyZ3VtZW50c1swXV0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJndW1lbnRzWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpW2FdID0gblthXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBsZSA9IHNldFRpbWVvdXQ7CiAgICAgICAgICAgICAgICByLnByb3RvdHlwZVsnY2F0Y2gnXSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBlKTsKICAgICAgICAgICAgICAgIH0sIHIucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHRoaXMuY29uc3RydWN0b3IoYSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHModGhpcywgbmV3IGQoZSwgdCwgbikpLCBuOwogICAgICAgICAgICAgICAgfSwgci5wcm90b3R5cGVbJ2ZpbmFsbHknXSA9IG4sIHIuYWxsID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHIoZnVuY3Rpb24gKGksIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcyh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmICgnb2JqZWN0JyA9PSB0eXBlb2YgZSB8fCAnZnVuY3Rpb24nID09IHR5cGVvZiBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBuLmNhbGwoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzKHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bdF0gPSBlLCAwID09IC0tYyAmJiBpKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIobmV3IFR5cGVFcnJvcignUHJvbWlzZS5hbGwgYWNjZXB0cyBhbiBhcnJheScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IG8ubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoW10pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gby5sZW5ndGgsIGUgPSAwOyBlIDwgby5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMoZSwgb1tlXSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCByLnJlc29sdmUgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdvYmplY3QnID09IHR5cGVvZiB0ICYmIHQuY29uc3RydWN0b3IgPT09IHIgPyB0IDogbmV3IHIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHIucmVqZWN0ID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHIoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdChuKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHIucmFjZSA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyByKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbChpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KG5ldyBUeXBlRXJyb3IoJ1Byb21pc2UucmFjZSBhY2NlcHRzIGFuIGFycmF5JykpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgYSA9IGkubGVuZ3RoOyBuIDwgYTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5yZXNvbHZlKGlbbl0pLnRoZW4oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCByLl9pbW1lZGlhdGVGbiA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIHNldEltbWVkaWF0ZSAmJiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZShlKTsKICAgICAgICAgICAgICAgIH0gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBsZShlLCAwKTsKICAgICAgICAgICAgICAgIH0sIHIuX3VuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gd3QoZSkgewogICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBjb25zb2xlICYmIGNvbnNvbGUgJiYgY29uc29sZS53YXJuKCdQb3NzaWJsZSBVbmhhbmRsZWQgUHJvbWlzZSBSZWplY3Rpb246JywgZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHVlID0gZShPYmplY3QuZnJlZXplKHsKICAgICAgICAgICAgICAgICAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCc6IHIKICAgICAgICAgICAgICAgICAgICB9KSksIGRlID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHdpbmRvdyAmJiB3aW5kb3cuUHJvbWlzZSB8fCB2b2lkIDAgIT09IEEgJiYgQS5Qcm9taXNlIHx8IHVlWydkZWZhdWx0J10gfHwgdWUsIHBlID0gZnVuY3Rpb24gKGwsIG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvLCB0LCBjLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgcyA9IG8uZGVsYXlOZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZGUoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBsKG8sIGMsIFtjXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gby50aW1lb3V0LCBpID0gbmV3IGRlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KG5ldyBFcnJvcignQSB0aW1lb3V0IG9jY3VycmVkIGJlY2F1c2UgdGhlIGFjdGlvbiB0b29rIGxvbmdlciB0aGFuICcgKyBhIC8gMTAwMCArICcgc2Vjb25kcyB0byBjb21wbGV0ZS4gJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlLnJhY2UoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkudGhlbihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVsnY2F0Y2gnXShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KHIpLCBlID0gbihlKSwgYShvLCB0LCBlKSwgZGUucmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBmZSA9IGZ1bmN0aW9uIChjLCBuLCBhLCBpLCBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAocywgdCwgbywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBkZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGMocywgbywgW29dKSwgYSA9IHMudGltZW91dCwgaSA9IG5ldyBkZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChuZXcgRXJyb3IoJ0EgdGltZW91dCBvY2N1cnJlZCBiZWNhdXNlIHRoZSBjb25kaXRpb24gdG9vayBsb25nZXIgdGhhbiAnICsgYSAvIDEwMDAgKyAnIHNlY29uZHMgdG8gY29tcGxldGUuICcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZS5yYWNlKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChyKSwgZSA9IG4oZSksIGkocywgdCwgZSksIGRlLnJlamVjdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhclRpbWVvdXQociksICFhKHMsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwocywgdCksIGRlLnJlamVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgbWUgPSBkZS5yZXNvbHZlKCksIGdlID0gZnVuY3Rpb24gKGEsIGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jb25kaXRpb25zICYmIHQuY29uZGl0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUgPSBhKGUsIHQsIG4sIG1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0LmFjdGlvbnMgJiYgdC5hY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSA9IGkoZSwgdCwgbiwgbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG1lID0gKG1lID0gbWUudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVsnY2F0Y2gnXShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBiZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKGUgJiYgJ29iamVjdCcgPT0gdHlwZW9mIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS50aGVuKTsKICAgICAgICAgICAgICAgICAgICB9LCB2ZSA9IGZ1bmN0aW9uIChzLCBvLCBjLCBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5jb25kaXRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZS5jb25kaXRpb25zLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLmNvbmRpdGlvbnNbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHMobiwgdCwgW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bGUgY29tcG9uZW50IHNlcXVlbmNpbmcgbXVzdCBiZSBlbmFibGVkIG9uIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBjb25kaXRpb24gdG8gZnVuY3Rpb24gcHJvcGVybHkuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8obiwgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMobiwgZSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbChuLCBlLCByKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgaGUgPSBmdW5jdGlvbiAobiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oZSwgdCkgJiYgYShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCB5ZSA9IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuLmdldE1vZHVsZURlZmluaXRpb24oZS5tb2R1bGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuZGlzcGxheU5hbWUgfHwgZS5tb2R1bGVQYXRoOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIF9lID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucnVsZSwgbiA9IGUuZXZlbnQsIGEgPSBpLmdldE1vZHVsZURlZmluaXRpb24obi5tb2R1bGVQYXRoKS5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdHlwZTogaS5nZXRNb2R1bGVFeHRlbnNpb25OYW1lKG4ubW9kdWxlUGF0aCkgKyAnLicgKyBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRydWxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0Lm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIFBlID0gZnVuY3Rpb24gKG8sIGMsIGwsIHUsIGQsIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUucnVsZSwgdCA9IGUuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldHRpbmdzID0gdC5zZXR0aW5ncyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGModCwgbnVsbCwgW2Z1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBsKGksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyh0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5lcnJvcih1KHQsIGEsIHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBTZSA9IGZ1bmN0aW9uIChpLCByLCBzLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lcnJvcihpKGEsIHQubmFtZSwgbikpLCBvKCdydWxlQWN0aW9uRmFpbGVkJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBDZSA9IGZ1bmN0aW9uIChpLCByLCBzLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5lcnJvcihpKGEsIHQubmFtZSwgbikpLCBvKCdydWxlQ29uZGl0aW9uRmFpbGVkJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBrZSA9IGZ1bmN0aW9uIChhLCBpLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5sb2coJ0NvbmRpdGlvbiAiJyArIG4gKyAnIiBmb3IgcnVsZSAiJyArIHQubmFtZSArICciIHdhcyBub3QgbWV0LicpLCByKCdydWxlQ29uZGl0aW9uRmFpbGVkJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBqZSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5sb2coJ1J1bGUgIicgKyBlLm5hbWUgKyAnIiBmaXJlZC4nKSwgbigncnVsZUNvbXBsZXRlZCcsIHsgcnVsZTogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9LCBEZSA9IGZ1bmN0aW9uIChyLCBzLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5hY3Rpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgZS5hY3Rpb25zLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLmFjdGlvbnNbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKG4sIHQsIFt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHMobiwgZSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHdlID0gZnVuY3Rpb24gKG4sIGEsIGksIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByKCdydWxlVHJpZ2dlcmVkJywgeyBydWxlOiB0IH0pLCBuID8gaSh0LCBlKSA6IGEodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgVmUgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0ZhaWxlZCB0byBleGVjdXRlICInICsgZSArICciIGZvciAiJyArIHQgKyAnIiBydWxlLiAnICsgbi5tZXNzYWdlICsgKG4uc3RhY2sgPyAnXG4nICsgbi5zdGFjayA6ICcnKTsKICAgICAgICAgICAgICAgICAgICB9LCBJZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICFlLm5lZ2F0ZSB8fCAhdCAmJiBlLm5lZ2F0ZTsKICAgICAgICAgICAgICAgICAgICB9LCBUZSA9IFtdLCBFZSA9ICExLCBPZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVlID8gZSgpIDogVGUucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICB9LCBBZSA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUodCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbihPZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBFZSA9ICEwLCBUZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBUZSA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0sIE1lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgfHwgKGUgPSBuZXcgRXJyb3IoJ1RoZSBleHRlbnNpb24gdHJpZ2dlcmVkIGFuIGVycm9yLCBidXQgbm8gZXJyb3IgaW5mb3JtYXRpb24gd2FzIHByb3ZpZGVkLicpKSwgIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdvYmplY3QnID09IHR5cGVvZiBlID8gSlNPTi5zdHJpbmdpZnkoZSkgOiBTdHJpbmcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbmV3IEVycm9yKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0sIExlID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywgTmUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB4ZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsIFJlID0gbSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIG4sIGEgPSBmKGUpLCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiB0ID0gT2JqZWN0KGFyZ3VtZW50c1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmUuY2FsbCh0LCByKSAmJiAoYVtyXSA9IHRbcl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IExlKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgPSAwOyBzIDwgbi5sZW5ndGg7IHMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGUuY2FsbCh0LCBuW3NdKSAmJiAoYVtuW3NdXSA9IHRbbltzXV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH0sIEZlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlKHQgPSB0IHx8IHt9LCBlKSwgdC5oYXNPd25Qcm9wZXJ0eSgndHlwZScpIHx8IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAndHlwZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmRlcHJlY2F0aW9uKCdBY2Nlc3NpbmcgZXZlbnQudHlwZSBpbiBBZG9iZSBMYXVuY2ggaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIHNvb24uIFBsZWFzZSB1c2UgZXZlbnQuJHR5cGUgaW5zdGVhZC4nKSwgdC4kdHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwgQmUgPSBmdW5jdGlvbiAoYywgbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gY1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuLm1vZHVsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBPYmplY3Qua2V5cyhhKSwgciA9IDA7IHIgPCBpLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGlbcl0sIG8gPSBhW3NdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uc2hhcmVkICYmIG8ubmFtZSA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5nZXRNb2R1bGVFeHBvcnRzKHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgVWUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBlKHQpIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgSGUgPSBmdW5jdGlvbiAobiwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zcGxpY2UodC5sZW5ndGggLSAxIHx8IDEsIDAsICdtaW4nKSwgZSA9IHQuam9pbignLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gKyBlOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHplID0gJy5qcycsIFdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3Vic3RyKDAsIGUubGFzdEluZGV4T2YoJy8nKSk7CiAgICAgICAgICAgICAgICAgICAgfSwgSmUgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IGUuaW5kZXhPZih0LCBlLmxlbmd0aCAtIHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICB9LCBxZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEplKHQsIHplKSB8fCAodCArPSB6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdC5zcGxpdCgnLycpLCBhID0gV2UoZSkuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAnLicgIT09IGUgJiYgKCcuLicgPT09IGUgPyBhLmxlbmd0aCAmJiBhLnBvcCgpIDogYS5wdXNoKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEuam9pbignLycpOwogICAgICAgICAgICAgICAgICAgIH0sIEdlID0gZG9jdW1lbnQsIFllID0gZnVuY3Rpb24gKG4sIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBkZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgc2NyaXB0ICcgKyBuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBLZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc3JjID0gZSwgdC5hc3luYyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFllKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZCh0KSwgbjsKICAgICAgICAgICAgICAgICAgICB9LCBRZSA9IGZ1bmN0aW9uIChlLCB0LCBuLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0IHx8ICcmJywgbiA9IG4gfHwgJz0nOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGUgfHwgMCA9PT0gZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAvXCsvZzsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUuc3BsaXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzID0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAnbnVtYmVyJyA9PSB0eXBlb2YgYS5tYXhLZXlzICYmIChzID0gYS5tYXhLZXlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgMCA8IHMgJiYgcyA8IG8gJiYgKG8gPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBvOyArK2MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsLCB1LCBkLCBwLCBmID0gZVtjXS5yZXBsYWNlKHIsICclMjAnKSwgbSA9IGYuaW5kZXhPZihuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gbSA/IChsID0gZi5zdWJzdHIoMCwgbSksIHUgPSBmLnN1YnN0cihtICsgMSkpIDogKGwgPSBmLCB1ID0gJycpLCBkID0gZGVjb2RlVVJJQ29tcG9uZW50KGwpLCBwID0gZGVjb2RlVVJJQ29tcG9uZW50KHUpLCBnKGksIGQpID8gQXJyYXkuaXNBcnJheShpW2RdKSA/IGlbZF0ucHVzaChwKSA6IGlbZF0gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVtkXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogaVtkXSA9IHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwgJGUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNGaW5pdGUoZSkgPyBlIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBYZSA9IGZ1bmN0aW9uIChuLCBhLCBpLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID0gYSB8fCAnJicsIGkgPSBpIHx8ICc9JywgbnVsbCA9PT0gbiAmJiAobiA9IHVuZGVmaW5lZCksICdvYmplY3QnID09IHR5cGVvZiBuID8gT2JqZWN0LmtleXMobikubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGVuY29kZVVSSUNvbXBvbmVudCgkZShlKSkgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkobltlXSkgPyBuW2VdLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICsgZW5jb2RlVVJJQ29tcG9uZW50KCRlKGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oYSkgOiB0ICsgZW5jb2RlVVJJQ29tcG9uZW50KCRlKG5bZV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihhKSA6IGUgPyBlbmNvZGVVUklDb21wb25lbnQoJGUoZSkpICsgaSArIGVuY29kZVVSSUNvbXBvbmVudCgkZShuKSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICB9LCBaZSA9IHQoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5kZWNvZGUgPSB0LnBhcnNlID0gUWUsIHQuZW5jb2RlID0gdC5zdHJpbmdpZnkgPSBYZTsKICAgICAgICAgICAgICAgICAgICB9KSwgZXQgPSAnQGFkb2JlL3JlYWN0b3ItJywgdHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogTCwKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQ6IEdlLAogICAgICAgICAgICAgICAgICAgICAgICAnbG9hZC1zY3JpcHQnOiBLZSwKICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC1hc3NpZ24nOiBSZSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICdxdWVyeS1zdHJpbmcnOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgKGUgPSBlLnRyaW0oKS5yZXBsYWNlKC9eWz8jJl0vLCAnJykpLCBaZS5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnk6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplLnN0cmluZ2lmeShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93OiBOCiAgICAgICAgICAgICAgICAgICAgfSwgbnQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBlLmluZGV4T2YoZXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnN1YnN0cihldC5sZW5ndGgpLCBuID0gdHRbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGUuaW5kZXhPZignLi8nKSB8fCAwID09PSBlLmluZGV4T2YoJy4uLycpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVzb2x2ZSBtb2R1bGUgIicgKyBlICsgJyIuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgYXQgPSBmdW5jdGlvbiAoZSwgcywgbywgYywgbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGUuZXh0ZW5zaW9ucywgZCA9IGUuYnVpbGRJbmZvLCBwID0gZS5wcm9wZXJ0eS5zZXR0aW5nczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gQmUodSwgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh1KS5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB1W2FdLCBlID0gVWUoYywgaS5zZXR0aW5ncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkubW9kdWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE8uY3JlYXRlUHJlZml4ZWRMb2dnZXIoaS5kaXNwbGF5TmFtZSksIG4gPSBIZShpLmhvc3RlZExpYkZpbGVzQmFzZVVybCwgZC5taW5pZmllZCksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRJbmZvOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERhdGFFbGVtZW50VmFsdWU6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXh0ZW5zaW9uU2V0dGluZ3M6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SG9zdGVkTGliRmlsZVVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaGFyZWRNb2R1bGU6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5U2V0dGluZ3M6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVRva2VuczogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkRlYnVnQ2hhbmdlZDogby5vbkRlYnVnQ2hhbmdlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZGVidWdFbmFibGVkKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5nZXREZWJ1Z0VuYWJsZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpLm1vZHVsZXMpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaS5tb2R1bGVzW25dLCB0ID0gbnQoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBxZShuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TW9kdWxlRXhwb3J0cyh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucmVnaXN0ZXJNb2R1bGUobiwgZSwgYSwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzLmh5ZHJhdGVDYWNoZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgIH0sIGl0ID0gZnVuY3Rpb24gKGUsIHQsIG4sIGEsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPLmNyZWF0ZVByZWZpeGVkTG9nZ2VyKCdDdXN0b20gU2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudHJhY2sgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5sb2coJyInICsgZSArICciIGRvZXMgbm90IG1hdGNoIGFueSBkaXJlY3QgY2FsbCBpZGVudGlmaWVycy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5nZXRWaXNpdG9ySWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5wcm9wZXJ0eSA9IHsgbmFtZTogdC5wcm9wZXJ0eS5uYW1lIH0sIGUuY29tcGFueSA9IHQuY29tcGFueSwgZS5idWlsZEluZm8gPSB0LmJ1aWxkSW5mbywgZS5sb2dnZXIgPSByLCBlLm5vdGlmeSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKE8uZGVwcmVjYXRpb24oJ19zYXRlbGxpdGUubm90aWZ5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIGBfc2F0ZWxsaXRlLmxvZ2dlcmAgQVBJLicpLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5pbmZvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIud2FybihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmVycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmxvZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5nZXRWYXIgPSBhLCBlLnNldFZhciA9IGksIGUuc2V0Q29va2llID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJycsIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKGEgPSAnLCB7IGV4cGlyZXM6ICcgKyBuICsgJyB9JywgaS5leHBpcmVzID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICdfc2F0ZWxsaXRlLnNldENvb2tpZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIF9zYXRlbGxpdGUuY29va2llLnNldCgiJyArIGUgKyAnIiwgIicgKyB0ICsgJyInICsgYSArICcpLic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmRlcHJlY2F0aW9uKHIpLCBMLnNldChlLCB0LCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5yZWFkQ29va2llID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmRlcHJlY2F0aW9uKCdfc2F0ZWxsaXRlLnJlYWRDb29raWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBfc2F0ZWxsaXRlLmNvb2tpZS5nZXQoIicgKyBlICsgJyIpLicpLCBMLmdldChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5yZW1vdmVDb29raWUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5kZXByZWNhdGlvbignX3NhdGVsbGl0ZS5yZW1vdmVDb29raWUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBfc2F0ZWxsaXRlLmNvb2tpZS5yZW1vdmUoIicgKyBlICsgJyIpLicpLCBMLnJlbW92ZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZS5jb29raWUgPSBMLCBlLnBhZ2VCb3R0b20gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUuc2V0RGVidWcgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgJ19jb250YWluZXInLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyB8fCAoTy53YXJuKCdfc2F0ZWxsaXRlLl9jb250YWluZXIgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLicpLCBzID0gITApLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBydCA9IHdpbmRvdy5fc2F0ZWxsaXRlOwogICAgICAgICAgICAgICAgaWYgKHJ0ICYmICF3aW5kb3cuX19zYXRlbGxpdGVMb2FkZWQpIHsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX19zYXRlbGxpdGVMb2FkZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICB2YXIgc3QgPSBydC5jb250YWluZXI7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ0LmNvbnRhaW5lcjsKICAgICAgICAgICAgICAgICAgICB2YXIgb3QgPSBzdC5wcm9wZXJ0eS5zZXR0aW5ncy51bmRlZmluZWRWYXJzUmV0dXJuRW1wdHksIGN0ID0gc3QucHJvcGVydHkuc2V0dGluZ3MucnVsZUNvbXBvbmVudFNlcXVlbmNpbmdFbmFibGVkLCBsdCA9IHN0LmRhdGFFbGVtZW50cyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICBRLm1pZ3JhdGVDb29raWVEYXRhKGx0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdXQsIGR0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsdFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcHQgPSBpZSgpLCBmdCA9IFgocHQsIGR0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXQuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgb3QpLCBtdCA9IHt9LCBndCA9IGNlKG10KSwgYnQgPSBuZShtdCwgZHQpLCB2dCA9IHRlKG10LCBkdCwgZnQpOwogICAgICAgICAgICAgICAgICAgIHV0ID0gb2UoYnQsIHZ0LCBvdCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGh0ID0gaChSKCdsb2NhbFN0b3JhZ2UnKSwgTyk7CiAgICAgICAgICAgICAgICAgICAgaXQocnQsIHN0LCBodC5zZXREZWJ1Z0VuYWJsZWQsIHZ0LCBndCksIGF0KHN0LCBwdCwgaHQsIHV0LCBmdCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHl0ID0gc2UocnQpLCBfdCA9IF8ocHQsIHV0KSwgUHQgPSB5ZShwdCksIFN0ID0ga2UoUHQsIE8sIHl0KSwgQ3QgPSBDZShWZSwgUHQsIE8sIHl0KSwga3QgPSBTZShWZSwgUHQsIE8sIHl0KSwganQgPSBqZShPLCB5dCksIER0ID0gUGUod2UoY3QsIGhlKHZlKF90LCBJZSwgU3QsIEN0KSwgRGUoX3QsIGt0LCBqdCkpLCBnZShmZShfdCwgTWUsIEllLCBDdCwgU3QpLCBwZShfdCwgTWUsIGt0KSwganQpLCB5dCksIF90LCBGZSwgVmUsIF9lKHB0KSwgTyk7CiAgICAgICAgICAgICAgICAgICAgQWUoYiwgc3QucnVsZXMgfHwgW10sIER0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Fkb2JlIExhdW5jaCBpcyB1bnN1cHBvcnRlZCBpbiBJRSA5IGFuZCBiZWxvdy4nKTsKICAgICAgICB9KCk7CiAgICAgICAgX3NhdGVsbGl0ZSA9ICRfX192YXJfMjFiMzBmOGY3MDgxM2E3ODsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-moatheader","aliases":["sugarcoat-moatheader"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfNzIzNWVhNzExZTQ0MzdkYSA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja183MjM1ZWE3MTFlNDQzN2RhKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgKGZ1bmN0aW9uIChBLCB3KSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2YSgpIHsKICAgICAgICAgICAgICAgICAgICB1LmsuYS5zeGF6KCd0cmFja2luZ1JlYWR5JywgeyBjYWxsYmFjazogdmEgfSk7CiAgICAgICAgICAgICAgICAgICAgcWEgPSByLmg7CiAgICAgICAgICAgICAgICAgICAgci5oKys7CiAgICAgICAgICAgICAgICAgICAgci5pW3FhXSA9ICExOwogICAgICAgICAgICAgICAgICAgIHZhciBhID0ge307CiAgICAgICAgICAgICAgICAgICAgdS5hcC5hKGEpOwogICAgICAgICAgICAgICAgICAgIHUuZi5hZyhhKTsKICAgICAgICAgICAgICAgICAgICB1LmFjLmwoKTsKICAgICAgICAgICAgICAgICAgICB1LmwuZSh1LmouZiwgMTAwKTsKICAgICAgICAgICAgICAgICAgICB1LmFtLmIoKTsKICAgICAgICAgICAgICAgICAgICB1LmJiLmEoKTsKICAgICAgICAgICAgICAgICAgICB1LmsuYS5henN4KCdhZEluaXRpYWxpemVkJywgdS5heS5hKTsKICAgICAgICAgICAgICAgICAgICB1LmMuYXguYyB8fCAodS5jLmF4LmMgPSAhMCwgci5kY3N4ICYmIChyLmRjc3gueW5kcyh3aW5kb3csICd1bmxvYWQnLCAndW5sb2FkLScgKyB1LmMuYXguYSwgJ3VubG9hZEZuJyArIHUuYy5heC5hKSwgci5kY3N4LnluZHMod2luZG93LCAnYmVmb3JldW5sb2FkJywgJ3VubG9hZC0nICsgdS5jLmF4LmEsICdiZWZvcmV1bmxvYWRGbicgKyB1LmMuYXguYSkpKTsKICAgICAgICAgICAgICAgICAgICByLnN3ZGUuYXpzeCgndW5sb2FkLScgKyB1LmMuYXguYSwgRmEsIHsgb25jZTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgdS5hei5jKCk7CiAgICAgICAgICAgICAgICAgICAgdS5hei5kKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdSA9IHt9OwogICAgICAgICAgICAgICAgdy5mbG9vcih3LnJhbmRvbSgpICogdy5wb3coMTAsIDEyKSk7CiAgICAgICAgICAgICAgICB2YXIgVywgcmEsIG5hLCBxYSA9IDAsIG9hID0ge30sIE8gPSB7fSwgRiA9IHt9LCBYID0gW10sIEIgPSB7fSwgamEgPSAhMSwgc2EgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIDE1OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgMTI6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICA2OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgNzogJycKICAgICAgICAgICAgICAgICAgICB9LCB0YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdS5kLmEobnVsbCwgMCkgfHwgdS5kLmIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBPKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5oYXNPd25Qcm9wZXJ0eSAmJiBPLmhhc093blByb3BlcnR5KGEpICYmIE9bYV0gJiYgdS5hLmEoT1thXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYSA9IDA7IGEgPCBYLmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5hLmIoWFthXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gRikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYuaGFzT3duUHJvcGVydHkgJiYgRi5oYXNPd25Qcm9wZXJ0eShrKSAmJiBGW2tdICYmICh1LmEuYShGW2tdLnRpZCksIEZba10gPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIE8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgWCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBMID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdS5iID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdS5jLmEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB1LmUgPSB0YTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIgPSBhLmEuYy50b1N0cmluZy5jYWxsKGIpKSAmJiAoJ1tvYmplY3QgQXJyYXldJyA9PT0gYiB8fCAnW29iamVjdCBBcnJheSBJdGVyYXRvcl0nID09PSBiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5hID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hLmMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBmID0gNjUsIGcgPSAnJywgYyA9IDAsIGMgPSAwOyBjIDwgZC5sZW5ndGg7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDA7IGIgPCBkW2NdWzFdOyBiKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZiksIGYgKz0gZFtjXVswXTsKICAgICAgICAgICAgICAgICAgICBnICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoZik7CiAgICAgICAgICAgICAgICAgICAgYS5hLmQgPSBnOwogICAgICAgICAgICAgICAgICAgIGEuYS5lID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9ICcnLCBsID0gMDsgbCA8IGEubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhc093blByb3BlcnR5KGwpICYmIChoICs9IGdbYVtsXV0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5mID0gazsKICAgICAgICAgICAgICAgICAgICBhLmEuZyA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIShiICYmIGIuZG9jdW1lbnQgJiYgYi5sb2NhdGlvbiAmJiBiW2EuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKICAgICAgICAgICAgICAgICAgICAgICAgXSldICYmIGJbYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3CiAgICAgICAgICAgICAgICAgICAgICAgIF0pXSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuaCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGIgfHwgYS5hLmcoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gYi5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxID09PSBiLm5vZGVUeXBlICYmIGggPyAhMCA6ICdzdHJpbmcnID09PSB0eXBlb2YgYiB8fCBrKGIpIHx8IDAgPT09IGggfHwgJ251bWJlcicgPT09IHR5cGVvZiBoICYmIDAgPCBoICYmIGggLSAxIGluIGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaCA9IGZ1bmN0aW9uIChiLCBoLCBsLCBwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCBkID0gdHlwZW9mIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdwcm90b3R5cGUnICE9IGMgJiYgJ2xlbmd0aCcgIT0gYyAmJiAnbmFtZScgIT0gYyAmJiAocCB8fCAhYi5oYXNPd25Qcm9wZXJ0eSB8fCBiLmhhc093blByb3BlcnR5KGMpKSAmJiAoZCA9IGguY2FsbChsLCBiW2NdLCBjKSwgJ2Jvb2xlYW4nID09PSB0eXBlb2YgZCAmJiAhZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnbnVtYmVyJyA9PT0gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYiAmJiAoZCA9IGguY2FsbChsLCBiLCBjKSwgJ2Jvb2xlYW4nICE9PSB0eXBlb2YgZCB8fCBkKTsgYysrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBiLmV2ZXJ5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZXZlcnkoZnVuY3Rpb24gKGEsIGIsIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGguY2FsbChsLCBhLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ2Jvb2xlYW4nID09PSB0eXBlb2YgYSAmJiAhYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLmEuaChiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYi5sZW5ndGggJiYgKGQgPSBoLmNhbGwobCwgYltjXSwgYyksICdib29sZWFuJyAhPT0gdHlwZW9mIGQgfHwgZCk7IGMrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIHx8IGIuaGFzT3duUHJvcGVydHkoYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA9IGguY2FsbChsLCBiW2NdLCBjKSwgJ2Jvb2xlYW4nID09PSB0eXBlb2YgZCAmJiAhZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuaSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICE9PSBPYmplY3QoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5hLmgoYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgPSAwLCBwID0gYi5sZW5ndGg7IGwgPCBwOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFtsXSA9IGJbbF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsIGluIChoID0ge30sIGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhbbF0gPSBiW2xdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5qID0gZnVuY3Rpb24gKGIsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAwIDw9IFN0cmluZyhiKS5pbmRleE9mKCdbbmF0aXZlIGNvZGVdJykgPyBsID0gITAgOiBhLmMuYiB8fCBiID09PSBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgfHwgKGwgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgJiYgaCAmJiAobCA9IGIudG9TdHJpbmcgJiYgYi50b1N0cmluZyA9PT0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5sID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwgYS5hLmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIS9pUGFkfGlQaG9uZXxpUG9kfFNpbGt8S2luZGxlfEFuZHJvaWR8QmxhY2tCZXJyeXxQbGF5Qm9va3xCQjEwfFdpbmRvd3MgUGhvbmV8U3ByZWFkVHJ1bXxNQVVJLy5leGVjKGIpICYmICFhLmEubShiKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEubiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IGEuYS5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIS9BbmRyb2lkLy5leGVjKGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLm0gPSBmdW5jdGlvbiAoYSwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGggfHwgZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhISgvTWFjaW50b3NoLy5leGVjKGEpICYmICdvbnRvdWNoZW5kJyBpbiBsKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5vID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwgYS5hLmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAvU2FmYXJpfENyaU9TL2k7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCEvaVBob25lfGlQb2R8aVBhZC8uZXhlYyhiKSAmJiAhYS5hLm0oYikgfHwgaC5leGVjKGIpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5wID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEucSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IGEuYS5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEubihiKSA/ICEhL1ZlcnNpb24vLmV4ZWMoYikgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5yID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYXZpZ2F0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwgYS5hLmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPyAoYiA9IGIubWF0Y2goL0VkZ2VcLyhcZHsxLH0oLlxkezEsfSk/KS8pKSA/IHBhcnNlRmxvYXQoYlsxXSkgOiBudWxsIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hdmlnYXRvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYjsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5rKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyJyA9PSBuYXZpZ2F0b3IuYXBwTmFtZSA/IHBhcnNlSW50KGIucmVwbGFjZSgvXi4qTVNJRSAoXGQrKS4qJC8sICckMScpLCAxMCkgOiAnTmV0c2NhcGUnID09IG5hdmlnYXRvci5hcHBOYW1lICYmIChiID0gYi5tYXRjaCgvKD86VHJpZGVudFwvLipydjp8TVNJRSApKFxkKykvKSkgPyBwYXJzZUludChiWzFdLCAxMCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9IGEuYS5zKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEudSA9IGZ1bmN0aW9uIChiLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoaCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPj0gcCB8fCBoICE9PSBPYmplY3QoaCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGgudG9TdHJpbmcgJiYgaC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBlLnRvU3RyaW5nICYmIGUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPCBwICYmIGEuYS5mb3JFYWNoKGgsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbChhLCBiICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHcubWluKDEwLCBoIHx8IDIpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwoYiwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IG5ldyBSZWdFeHAoJyhefCApJyArIGEgKyAnKCR8ICknKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLmNsYXNzTmFtZSAmJiBhLmNsYXNzTmFtZS5tYXRjaChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0ge30sIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiBpbiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgPT09IHR5cGVvZiBhW2JdICYmIChsW2JdID0gdy5yb3VuZChhW2JdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYS52ID0gMjUwMDsKICAgICAgICAgICAgICAgICAgICBhLmEudyA9IDEwMDA7CiAgICAgICAgICAgICAgICAgICAgYS5hLnggPSAhMTsKICAgICAgICAgICAgICAgICAgICBhLmEueSA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuYS56ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IC9GaXJlZm94XC8oXGQrKS8uZXhlYyhhLmEuaygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggPyAoaCA9IHBhcnNlSW50KGhbMV0sIDEwKSwgMjEgPiBoICYmIDE0IDwgaCkgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5hLmFhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgbCA9IC9eKD86W2Etel0rOlwvXC98Oj9cLz9cLyk/KD86d3d3XC4pPyhbXlwvOl0qKS9pOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuYyB8fCAoaCA9IGEuYS5hYigpLCAhaCAmJiBhLmMuZCAmJiAoaCA9IGEuYy5kKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGggfHwgKGggPSBhLmMuZS5sb2NhdGlvbi5ob3N0bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoaCA9IGggJiYgaC5tYXRjaCAmJiBoLm1hdGNoKGwpKSAmJiBoWzFdIHx8IGEuYy5lLmxvY2F0aW9uLmhvc3RuYW1lOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFjID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEuYS5hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCAmJiBoLnVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEuZy5hKCksIGwgPSBhLmEuYWIoKSwgYiA9IGEuYS5hZShoLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiYgYi51cmwgfHwgKGIgPSBhLmEuYWYoaCkpICYmIGIudXJsID8gYiA6IChsID0gYS5hLmFnKGwpKSAmJiBsLnVybCA/IGwgOiAoaCA9IGEuYS5haChoKSkgPyBoIDogYS5hLmFpKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYWkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5mKDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvcnJlY3Q6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5jLmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gd2luZG93LnRvcCAmJiB3aW5kb3cudG9wLmxvY2F0aW9uICYmIHdpbmRvdy50b3AubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmYoNCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb3JyZWN0OiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5hZyA9IGZ1bmN0aW9uIChoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSBoIHx8IGEuYS5hYigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5mKDIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb3JyZWN0OiAhMQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFoID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGggJiYgaC5kb2N1bWVudCAmJiBoLmRvY3VtZW50LnJlZmVycmVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5mKDMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb3JyZWN0OiAhMQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFmID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGEuYS5haihoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBoLnBhcmVudElzVG9wID8gYS5jLmYoMykgOiBhLmMuZig5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMICYmIFVSTC5jb25zdHJ1Y3RvciAmJiBVUkwuY29uc3RydWN0b3IubmFtZSAmJiAnRnVuY3Rpb24nID09PSBVUkwuY29uc3RydWN0b3IubmFtZSA/IGIgPSBuZXcgVVJMKGgudXJsKSA6IChiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpLCBiLmhyZWYgPSBoLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gJycgPT09IGIucGF0aG5hbWUgfHwgJy8nID09PSBiLnBhdGhuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvcnJlY3Q6ICFsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYWogPSBmdW5jdGlvbiAoaCwgbCwgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsID0gYS5jLmM7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCB8fCBsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBsID0gaC5kb2N1bWVudCAmJiBoLmRvY3VtZW50LnJlZmVycmVyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWwgfHwgIWEuYS5hayhsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgucGFyZW50ID09PSBoLnRvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElzVG9wOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGxvY2F0aW9uICYmIGxvY2F0aW9uLmFuY2VzdG9yT3JpZ2luczsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGxvY2F0aW9uICYmIGxvY2F0aW9uLm9yaWdpbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoIHx8IDAgPT09IGgubGVuZ3RoIHx8ICFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMsIGQgPSAwOyBkIDwgaC5sZW5ndGg7IGQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID0gaFtkXSwgYiAhPT0gYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAwID09PSBsLnNlYXJjaChoW2gubGVuZ3RoIC0gMV0pID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXNUb3A6ICExCiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5hZSA9IGZ1bmN0aW9uIChoLCBsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsIHx8IGEuYS5hYigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5hLmFsKGgsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmFrKGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5mKDYpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29ycmVjdDogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYWwgPSBmdW5jdGlvbiAoYSwgbCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYjsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEgJiYgYS5sb2NhdGlvbiAmJiBhLmxvY2F0aW9uLmhvc3RuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gJ3N0cmluZycgIT09IHR5cGVvZiBiID8gITEgOiBiLm1hdGNoKC9eKFteXC5dK1wuKSooZ29vZ2xlc3luZGljYXRpb25cLmNvbXxkb3VibGVjbGlja1wubmV0fGFkbnhzXC5jb20pJC8pICYmIGEubG9jYXRpb24uaHJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICFsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGVuY29kZVVSSUNvbXBvbmVudChsKS5yZXBsYWNlKC9bLiorXiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIgPSBiLm1hdGNoKG5ldyBSZWdFeHAoJ1s/Jl0oPzp1cmx8cmVmZXJyZXIpPSgnICsgZSArICcoPzolMkZbXiZdKnwkKSknKSkpID8gZGVjb2RlVVJJQ29tcG9uZW50KGJbMV0pIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYW0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PT0gdHlwZW9mIGEuYy5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5nOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICExLCBsLCBiID0gL15odHRwcz86XC9cLyguKj8pXC8oW14/I10qKS87CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jID8gKGggPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUucmVwbGFjZSgnd3d3LicsICcnKSwgaCArPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpIDogKGwgPSBhLmcuYSgpLCBsLnBhcmVudCA9PT0gd2luZG93LnRvcCAmJiAoaCA9IGwuZG9jdW1lbnQucmVmZXJyZXIpICYmIChsID0gYi5leGVjKGgpKSAmJiAoaCA9IGxbMV0ucmVwbGFjZSgnd3d3LicsICcnKSArICcvJyArIGxbMl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT09IHR5cGVvZiBoICYmICcvJyA9PT0gaC5jaGFyQXQoaC5sZW5ndGggLSAxKSAmJiAoaCA9IGguc3Vic3RyKDAsIGgubGVuZ3RoIC0gMSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5hbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jID8gaCA9IDIgOiAoaCA9IGEuZy5hKCksIGggPSBoLnBhcmVudCA9PT0gd2luZG93LnRvcCA/IDIgOiBsb2NhdGlvbiAmJiBsb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFiID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGxvY2F0aW9uICYmIGxvY2F0aW9uLmFuY2VzdG9yT3JpZ2luczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPyAwID09PSBhLmxlbmd0aCA/ICExIDogYVthLmxlbmd0aCAtIDFdIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYW8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoLCBsID0gYS5hLmFhKCksIGIgPSBsICYmIGwuc3BsaXQoJy4nKSwgZSA9IGIgJiYgYi5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIDMgPD0gZSA/IGggPSAnY28nID09PSBiW2UgLSAyXSB8fCAnY29tJyA9PT0gYltlIC0gMl0gPyBiW2UgLSAzXSArICcuJyArIGJbZSAtIDJdICsgJy4nICsgYltlIC0gMV0gOiBiW2UgLSAyXSArICcuJyArIGJbZSAtIDFdIDogMiA9PSBlICYmIChoID0gYltlIC0gMl0gKyAnLicgKyBiW2UgLSAxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoICYmIGRlY29kZVVSSUNvbXBvbmVudChoKSB8fCBkZWNvZGVVUklDb21wb25lbnQobCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYXAgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEubWF0Y2goL14oW146XXsyLH06XC9cL1teXC9dKikvKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiBiWzFdICYmIChhID0gYlsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFxID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYSB8fCAnc3RyaW5nJyAhPT0gdHlwZW9mIGIgfHwgJycgPT09IGEgfHwgJycgPT09IGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gbmV3IFJlZ0V4cChiICsgJz0oW14/JjsjXSopKD86JHxbPyY7I10pJykuZXhlYyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAgJiYgcFsxXTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5hciA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSBbYV0sIGUgPSAxOyBlIDw9IGI7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucHVzaChhICsgZSksIHAucHVzaChhIC0gZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwW3cuZmxvb3Iody5yYW5kb20oKSAqIHAubGVuZ3RoKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSB3LmZsb29yKHcucmFuZG9tKCkgKiBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXI6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGU6IDAgPT0gZQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFzID0gZnVuY3Rpb24gKGgsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBhLmEuYXIoaCwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5hdChwLm11bHRpcGxpZXIsIHAuc2FtcGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYXUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuYXMoYS5oLCBhLmkpLnNhbXBsZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5hdCA9IGZ1bmN0aW9uIChoLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5hcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllcjogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGU6IGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYXYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gYS5hLnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDUgPT09IGggfHwgNiA9PT0gaCB8fCA3ID09PSBoOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmF3ID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhLnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAhMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5zYWZlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAhMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc2FmZSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3NhZmUnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYXggPSBmdW5jdGlvbiAoaCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IGEuYS5pbmRleE9mKGgsIGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmF5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gaC5tYXRjaCgvW1xkXSsvZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmxlbmd0aCA9IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5qb2luKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAhMSwgcCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLnBsdWdpbnMgJiYgbmF2aWdhdG9yLnBsdWdpbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2gnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgKGIgPSAhMCwgZS5kZXNjcmlwdGlvbiAmJiAocCA9IGEoZS5kZXNjcmlwdGlvbikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2ggMi4wJ10gJiYgKGIgPSAhMCwgcCA9ICcyLjAuMC4xMScpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hdmlnYXRvci5taW1lVHlwZXMgJiYgbmF2aWdhdG9yLm1pbWVUeXBlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYiA9IChlID0gbmF2aWdhdG9yLm1pbWVUeXBlc1snYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnXSkgJiYgZS5lbmFibGVkUGx1Z2luICYmIGUuZW5hYmxlZFBsdWdpbi5kZXNjcmlwdGlvbikgJiYgKHAgPSBhKGUuZW5hYmxlZFBsdWdpbi5kZXNjcmlwdGlvbikpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgQWN0aXZlWE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNycpLCBiID0gITAsIHAgPSBhKGUuR2V0VmFyaWFibGUoJyR2ZXJzaW9uJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuZXcgQWN0aXZlWE9iamVjdCgnU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2guNicpLCBiID0gITAsIHAgPSAnNi4wLjIxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gbmV3IEFjdGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoJyksIGIgPSAhMCwgcCA9IGEoZS5HZXRWYXJpYWJsZSgnJHZlcnNpb24nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPyBwIDogJzAnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBmdW5jdGlvbiAoYSwgYiwgcCkgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gYiB8fCAnKic7CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwIHx8IGRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IFtdLCBjID0gcC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCcqJyAhPT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocCA9IGMubGVuZ3RoOyBhIDwgcDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gY1thXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC50YWdOYW1lID09PSBiICYmIGUucHVzaChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBwLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBwID0gayhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGIubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgZDsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGJbYV0sIHAoZSkgJiYgYy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5heiA9IGs7CiAgICAgICAgICAgICAgICAgICAgYS5hLmJhID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBSZWdFeHAoJyhefCApJyArIGIgKyAnKCR8ICknKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuY2xhc3NOYW1lICYmIGEuY2xhc3NOYW1lLm1hdGNoKHApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJiID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBKCkgLSBhLmRlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJjID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucmVwbGFjZSgvXmh0dHA6LywgJycpLnJlcGxhY2UoL15cL1wvLywgJycpLnJlcGxhY2UoL153d3dbXi5dKlwuLywgJycpLnNwbGl0KCcvJylbMF07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYmQgPSBmdW5jdGlvbiAoaCwgYiwgcCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCd1bmRlZmluZWQnID09PSB0eXBlb2YgcCB8fCAhcCkgJiYgaCAmJiAocCA9IGEuYS5iZShoKSwgIXApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCAmJiBoLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgTm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxICE9IGgubm9kZVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaC5ub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmdldENvbXB1dGVkU3R5bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcC5nZXRDb21wdXRlZFN0eWxlKGgsICcnKSAmJiBwLmdldENvbXB1dGVkU3R5bGUoaCwgJycpW2JdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHAgPSBiLmluZGV4T2YoJy0nKTsgLTEgPCBwOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBwID09IGIubGVuZ3RoIC0gMSA/IGIuc3Vic3RyKDAsIHApIDogYi5zdWJzdHIoMCwgcCkgKyBiLmNoYXJBdChwICsgMSkudG9VcHBlckNhc2UoKSArIGIuc3Vic3RyKHAgKyAyKSwgcCA9IGIuaW5kZXhPZignLScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaC5jdXJyZW50U3R5bGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5jdXJyZW50U3R5bGVbYl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoLnN0eWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguc3R5bGVbYl07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYmYgPSBmdW5jdGlvbiAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5hLmJkKGgsICdiYWNrZ3JvdW5kLWltYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgfHwgKGIgPSBhLmEuYmQoaCwgJ2JhY2tncm91bmRJbWFnZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgKHAgPSAocCA9IGIubWF0Y2goJ3VybFxcKCguKilcXCknKSkgJiYgcFsxXS5yZXBsYWNlKC9ceDIyL2csICcnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJnID0gZnVuY3Rpb24gKGgsIGIsIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICdib29sZWFuJyA9PT0gdHlwZW9mIHAgPyBwIDogITEsIGMgPSBbaF0sIGQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goJ251bWJlcicgPT09IHR5cGVvZiBiID8gYiA6IDUwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGQgPSBhLmEuYmgoaCkpICYmIDEgPT0gZC5ub2RlVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZCwgYy5wdXNoKGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSAmJiBkICYmIDkgPT0gZC5ub2RlVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGQgPSBhLmcuYihoKSkgJiYgMSA9PSBkLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZCwgYy5wdXNoKGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJpID0gZnVuY3Rpb24gKGgsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBhLmEuYmcoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwICYmIC0xICE9PSBhLmEuaW5kZXhPZihwLCBiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5iaCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnBhcmVudE5vZGUgfHwgYS5wYXJlbnRFbGVtZW50IHx8ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJqID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGggfHwgYS5hLmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhL2lQaG9uZXxpUG9kLy5leGVjKGgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJrID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGggfHwgYS5hLmsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIS9pUGFkLy5leGVjKGgpICYmICFhLmEubShoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYmwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgaFtiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaFtiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhbYl0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBhLmEuZShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgYiA9IGEuYS5lKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBsID0gYS5hLmUoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBwID0gYS5hLmUoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGUgPSBhLmEuZShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgYyA9IGEuYS5lKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBkID0gYS5hLmUoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQjogJ1xcWycgKyBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUd2l0dGVyOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaW50ZXJlc3Q6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxlTmV3czogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFncmFtOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWxwOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbmFwY2hhdDogZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChhLmEuYm0ocCksIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBSZWdFeHAocFthXSkudGVzdChiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhbYl0gPSBhLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhbYl07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIGEuYS5ibiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX2hlaWdodDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfcHJvcGVydGllczogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdmljb246ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2RhdGE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2FydGljbGVzOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX2hlaWdodF9yYXRpbzogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9wcm9wZXJ0eV9tYXRjaGVzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEuYy5lICYmIGEuYy5lLmRvY3VtZW50LCBwID0gKGIgJiYgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYXJ0aWNsZScpKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgcCAmJiAoaC5yZXN1bHRzLmFydGljbGUgPSAhMCwgaC5tZXRhX2RhdGEubnVtX2FydGljbGVzID0gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGEuYy5oLCBlID0gYS5jLmUgJiYgYS5jLmUuaW5uZXJIZWlnaHQsIHAgPSBwICYmIGUgJiYgcCAvIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUgPD0gcCAmJiAoaC5yZXN1bHRzLnBhZ2VfaGVpZ2h0ID0gITAsIGgubWV0YV9kYXRhLnBhZ2VfaGVpZ2h0X3JhdGlvID0gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGIgJiYgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbWV0YScpLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmI6YXBwX2lkJzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29nOnNpdGVfbmFtZSc6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZzp0eXBlJzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZiOnBhZ2VfaWQnOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHdpdHRlcjphY2NvdW50X2lkJzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R3aXR0ZXI6c2l0ZSc6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2gocCwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEgPSBhLmdldEF0dHJpYnV0ZSgncHJvcGVydHknKSkgJiYgYy5oYXNPd25Qcm9wZXJ0eShhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgucmVzdWx0cy5tZXRhX3Byb3BlcnRpZXMgPSAhMCwgaC5tZXRhX2RhdGEubWV0YV9wcm9wZXJ0eV9tYXRjaGVzLnB1c2goYSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYiAmJiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdsaW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChiLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnaWNvbicgPT09IGEuZ2V0QXR0cmlidXRlKCdyZWwnKSAmJiAvZmF2aWNvblwuLy50ZXN0KGEuZ2V0QXR0cmlidXRlKCdocmVmJykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaC5yZXN1bHRzLmZhdmljb24gPSAhMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmEuYm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gYS5hLmJuKCkucmVzdWx0cywgYjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiIGluIGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaC5oYXNPd25Qcm9wZXJ0eShiKSAmJiBoW2JdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBiID0gJycsIHAgPSAwLCBlID0gaC5sZW5ndGg7IHAgPCBlOyBwKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoaFtwXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKCdeW14uXSsuJyArIGIpLnRlc3QoYS5hLmFhKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJxID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEuYy5lLnNjcmVlbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5vKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiB3aW5kb3cub3JpZW50YXRpb24gPyAwID09PSB3aW5kb3cub3JpZW50YXRpb24gfHwgMTgwID09PSB3aW5kb3cub3JpZW50YXRpb24gPyAoYiA9IGgud2lkdGgsIGggPSBoLmhlaWdodCkgOiAoYiA9IGguaGVpZ2h0LCBoID0gaC53aWR0aCkgOiBiID0gaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLnEoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYy5lLmRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA1ID4gdy5hYnMoaC53aWR0aCAvIGEuYy5lLmlubmVyV2lkdGggLSBiKSAmJiAoZSA9IGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBoLndpZHRoIC8gZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoLmhlaWdodCAvIGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGgud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBoLmhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgbmF2aWdhdG9yLmRvTm90VHJhY2sgPyBhID0gbmF2aWdhdG9yLmRvTm90VHJhY2sgOiAnc3RyaW5nJyA9PT0gdHlwZW9mIG5hdmlnYXRvci5tc0RvTm90VHJhY2sgPyBhID0gbmF2aWdhdG9yLm1zRG9Ob3RUcmFjayA6ICdzdHJpbmcnID09PSB0eXBlb2Ygd2luZG93LmRvTm90VHJhY2sgJiYgKGEgPSB3aW5kb3cuZG9Ob3RUcmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhYSB8fCAnMScgIT09IGFbMF0gJiYgJ3llcycgIT09IGEgPyAhMSA6ICEwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEuYS5hbygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGEuYS5heChlLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmEuZ2V0QXR0cmlidXRlID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbYl0gfHwgYS5nZXRBdHRyaWJ1dGUoYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IFtmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICdJRlJBTUUnICE9PSBhLm5vZGVOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4oYikgfHwgMTUgPCBiIHx8ICdnb29nbGVfY29udmVyc2lvbl9mcmFtZScgIT09IGEubmFtZSA/ICExIDogITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICAgICAgICAgIGEuYS5idCA9IGZ1bmN0aW9uIChoLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGggfHwgbnVsbCA9PT0gaCB8fCAhMSA9PT0gaCB8fCAhYS5hLmJ1KGgpIHx8IGgubm9kZU5hbWUgJiYgJ0lNRycgPT0gaC5ub2RlTmFtZSAmJiAhaC5jb21wbGV0ZSB8fCBhLmEuZmlsdGVyKGcsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkubGVuZ3RoIHx8ICEwID09PSBoW0RdID8gITEgOiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5idiA9IGZ1bmN0aW9uIChoLCBiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuai5hKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gZSAmJiBiLmFhICYmIChiLmFhW01dID0gdm9pZCAwLCBiLmFhW0RdID0gdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIWIuaGFzSWZyYW1lTGlzdGVuZXIgJiYgaC50YWdOYW1lICYmICdpZnJhbWUnID09PSBoLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAmJiAoYi5oYXNJZnJhbWVMaXN0ZW5lciA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5jb21wb25lbnRzICYmIGIuY29tcG9uZW50cy5zcGxpY2UoMCwgMSwgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYWEgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdhZEVsZW1lbnRVcGRhdGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmJ3KGIuYWEpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmouYihiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5wZXJpc2NvcGVNYW5hZ2VyICYmIGIucGVyaXNjb3BlTWFuYWdlci5yZWJ1aWxkUGl4ZWxUYXJnZXRzKGgsIGgucGFyZW50Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYnggPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5yZXBsYWNlKC86L2csICclM0EnKS5yZXBsYWNlKC89L2csICclM0QnKS5yZXBsYWNlKC8sL2csICclMkMnKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5ieSA9IGZ1bmN0aW9uIChoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGgsIGZ1bmN0aW9uIChoLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHR5cGVvZiBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgPT0gYyA/IGIucHVzaChhLmEuYngoZSkgKyAnOicgKyBhLmEuYngoaCArICcnKSkgOiAnc3RyaW5nJyA9PSBjID8gYi5wdXNoKGEuYS5ieChlKSArICc6JyArIGEuYS5ieCgnIicgKyBoICsgJyInKSkgOiAndW5kZWZpbmVkJyA9PSBjID8gYi5wdXNoKGEuYS5ieChlKSArICc6JyArIGEuYS5ieCgndW5kZWZpbmVkJykpIDogJ2Jvb2xlYW4nID09IGMgPyBiLnB1c2goYS5hLmJ4KGUpICsgJzonICsgYS5hLmJ4KGggPyAndHJ1ZScgOiAnZmFsc2UnKSkgOiBudWxsID09PSBoID8gYi5wdXNoKGEuYS5ieChlKSArICc6JyArIGEuYS5ieCgnbnVsbCcpKSA6ICdvYmplY3QnICE9IGMgJiYgJ2Z1bmN0aW9uJyAhPSBjIHx8ICFoLnRvU3RyaW5nIHx8IGIucHVzaChhLmEuYngoZSkgKyAnOicgKyBhLmEuYngoJyInICsgaC50b1N0cmluZygpICsgJyInKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5zb3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAneycgKyBiLmpvaW4oJywnKSArICd9JzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5ieiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyAhPSB0eXBlb2YgYSB8fCAneycgIT0gYS5jaGFyQXQoMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnNsaWNlKDEsIC0xKS5zcGxpdCgnLCcpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMDsgZSA8IGEubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYVtlXS5zcGxpdCgnOicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY1sxXSA9IHVuZXNjYXBlKGNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RydWUnID09IGNbMV0gPyBjWzFdID0gITAgOiAnZmFsc2UnID09IGNbMV0gPyBjWzFdID0gITEgOiAnIicgPT0gY1sxXS5jaGFyQXQoMCkgPyBjWzFdID0gY1sxXS5zbGljZSgxLCAtMSkgOiBjWzFdID0gJ3VuZGVmaW5lZCcgPT0gY1sxXSA/IHZvaWQgMCA6ICdudWxsJyA9PSBjWzFdID8gbnVsbCA6ICdOYU4nID09IGNbMV0gPyBOYU4gOiBwYXJzZUZsb2F0KGNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYlt1bmVzY2FwZShjWzBdKV0gPSBjWzFdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJ1ID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBoLm9mZnNldFdpZHRoLCBlID0gaC5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5hLmNhICYmICFhLmEuY2EoYiwgZSkgfHwgYS5hLnggJiYgZSA8IGEuYS54IHx8IGEuYS55ICYmIGIgPCBhLmEueSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYS5hLmJnKGgsIDMpLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBhLnN0eWxlICYmIGEuc3R5bGUud2lkdGgsIGMgPSBhLnN0eWxlICYmIGEuc3R5bGUuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiBhLnN0eWxlICYmICdoaWRkZW4nID09IGEuc3R5bGUub3ZlcmZsb3cgJiYgKCcnICE9IGggfHwgJycgIT0gYykgJiYgKGEgPSBwYXJzZUZsb2F0KGgpLCBjID0gcGFyc2VGbG9hdChjKSwgYiA9ICFpc05hTihhKSAmJiBhIDwgYiA/IGEgOiBiLCBlID0gIWlzTmFOKGMpICYmIGMgPCBlID8gYyA6IGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgKGggPSBhLmEuY2IoaCkpICYmIGgud2lkdGggKiBoLmhlaWdodCA8IGEuYS52ICYmIChiID0gaC53aWR0aCA8IGIgPyBoLndpZHRoIDogYiwgZSA9IGguaGVpZ2h0IDwgZSA/IGguaGVpZ2h0IDogZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICogZSA+PSBhLmEudjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBjID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hLmNiID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoIHx8ICFoLm5vZGVOYW1lIHx8ICdJTUcnID09ICFoLm5vZGVOYW1lIHx8ICFoLmNvbXBsZXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGguZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY1tiXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjW2JdOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgaC5uYXR1cmFsSGVpZ2h0ICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2YgaC5uYXR1cmFsV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGgubmF0dXJhbFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGgubmF0dXJhbEhlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNbaC5zcmNdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuYSAmJiAoYS5jLmEuc3JjID0gYiwgYS5jLmEuYSkgPyAoZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBwYXJzZUludChhLmMuYS5iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogcGFyc2VJbnQoYS5jLmEuYykKICAgICAgICAgICAgICAgICAgICAgICAgfSwgY1tiXSA9IGUpIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY2MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5jLmkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gYS5jLCBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZG9jdW1lbnQuY3VycmVudFNjcmlwdCAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEhUTUxTY3JpcHRFbGVtZW50ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuY29uc3RydWN0b3IgPT09IEhUTUxTY3JpcHRFbGVtZW50ICYmICFkb2N1bWVudC5jdXJyZW50U2NyaXB0W0RdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdCwgYltEXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpLCBjID0gZS5sZW5ndGggLSAxOyAtMSA8IGM7IGMtLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBiID0gZVtjXSwgZiA9IG5ldyBSZWdFeHAoJ3JldXRlcnNoZWFkZXIxOTQ4ODM1NTIwMjQoL3wlMkYpJyArICcobW9hdGhlYWRlcnx5aXx5aWVsZCkuanMnLnJlcGxhY2UoL1wuLywgJ1xcLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmIGQuc3JjICYmIGYudGVzdChkLnNyYykgJiYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgYltEXSB8fCAhMCAhPT0gYltEXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW0RdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguaSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5pID8gKGEuYy5pW0RdID0gITAsIGEuYy5pKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY2QgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgZSkgJiYgKGFbZV0gPSBiW2VdKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5jZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiLCBlID0gL2h0dHBzOi9pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBlLnRlc3QoYS5zcmMgfHwgYS5ocmVmIHx8ICdodHRwOicpID8gJ2h0dHBzOicgOiAnaHR0cDonOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSwgYS5ocmVmID0gJycsIGIgPSBhLnByb3RvY29sOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2h0dHBzOicgPT09IGIgPyAnaHR0cHM6JyA6ICdodHRwOic7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY2YgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSAoYS5zcmMgfHwgYS5nZXRBdHRyaWJ1dGUoJ3NyYycpKS5pbmRleE9mKCdwc2Q9MScpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5jZyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSBbXSwgZSA9IDA7IGUgPCBhLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKGFbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5uZXh0RWxlbWVudFNpYmxpbmcgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5uZXh0RWxlbWVudFNpYmxpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5uZXh0RWxlbWVudFNpYmxpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBhID0gYS5uZXh0U2libGluZzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gYS5ub2RlVHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucHJldmlvdXNFbGVtZW50U2libGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyAoYSA9IGEucHJldmlvdXNTaWJsaW5nKSAmJiAxMDAwID4gYjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIrKywgYSAmJiAxID09PSBhLm5vZGVUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNoID0gZnVuY3Rpb24gKGEsIGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBlICYmIChhW2JdID0gZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY2kgPSBmdW5jdGlvbiAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLmYoaCkgPyAwID09PSBoLmxlbmd0aCA6ICEwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmZpbHRlciA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBbXSwgYyA9IDA7IGMgPCBhLmxlbmd0aDsgYysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYihhW2NdKSAmJiBlLnB1c2goYVtjXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNqID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBjID0gMDsgYyA8IGIubGVuZ3RoOyBjKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnB1c2goYShiW2NdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNrID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IFtdLCBjID0gMDsgYyA8IGIubGVuZ3RoOyBjKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYShiW2NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT0gZCAmJiBlLnB1c2goZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEucmVkdWNlID0gZnVuY3Rpb24gKGgsIGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmEuaChoKSB8fCAnZnVuY3Rpb24nICE9PSB0eXBlb2YgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgPyBiKGUsIGhbMF0pIDogaFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDE7IGMgPCBoLmxlbmd0aDsgYysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGIoZSwgaFtjXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmluZGV4T2YgPSBmdW5jdGlvbiAoaCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuZihoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDAsIGMgPSBoLmxlbmd0aDsgZSA8IGM7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFtlXSA9PT0gYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgaCA/IGIgfHwgJ3N0cmluZycgIT09IHR5cGVvZiBiID8gaC5pbmRleE9mKGIpIDogLTEgOiAtMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIChoLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5mKGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gaC5sZW5ndGggLSAxOyAwIDw9IGU7IGUtLSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaFtlXSA9PT0gYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09PSB0eXBlb2YgaCA/ICcnID09PSBiID8gLTEgOiBoLmxhc3RJbmRleE9mKGIpIDogLTE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYmluZCA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwbHkoYSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY2wgPSBmdW5jdGlvbiAoaCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWggfHwgIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5hLmNtKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuaGFzQ2hpbGROb2RlcyhlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlLmNoaWxkTm9kZXNbdy5tYXgoMCwgZS5jaGlsZE5vZGVzLmxlbmd0aCAtIDEpXSB8fCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pbnNlcnRCZWZvcmUoaCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBlbmRDaGlsZChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY24gPSBmdW5jdGlvbiAoaCwgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGggfHwgIWIgfHwgIWRvY3VtZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmEuY2woZSwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5zcmMgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5oYXNDaGlsZE5vZGVzID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgYS5jaGlsZE5vZGVzICYmIDAgPCBhLmNoaWxkTm9kZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNtID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ09CSkVDVCcgIT09IGgubm9kZU5hbWUgJiYgJ0VNQkVEJyAhPT0gaC5ub2RlTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICBoID0gYS5hLmJnKGgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChoLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgJ09CSkVDVCcgIT09IGEubm9kZU5hbWUgJiYgJ0VNQkVEJyAhPT0gYS5ub2RlTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiA9IGEsICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY28gPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMCwgYyA9IGIubGVuZ3RoOyBlIDwgYzsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBiW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGFbYltlXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNwID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhICYmIEJbYV0gPyBCW2FdIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY3EgPSBmdW5jdGlvbiAoaCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWggfHwgJ29iamVjdCcgIT09IHR5cGVvZiBoIHx8ICdudW1iZXInICE9PSB0eXBlb2YgaC56cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmEuY3AoaC56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIGIgPT09IGg7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY3IgPSBmdW5jdGlvbiAoaCwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYS5hLmJnKGgsIDUwLCAhMCksIGMgPSAwOyBjIDwgZS5sZW5ndGg7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlW2NdID09PSBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmNzID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFhLmFhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ251bWJlcicgIT09IHR5cGVvZiBhLkFEQVJFQSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc0NvbXBvc2l0ZUFkICYmIGEuY29tcG9uZW50cyAmJiAxIDwgYS5jb21wb25lbnRzLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSBhLkFEQVJFQSA9IDA7IGIgPCBhLmNvbXBvbmVudHMubGVuZ3RoOyBiKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuQURBUkVBICs9IGEuY29tcG9uZW50c1tiXS5vZmZzZXRXaWR0aCAqIGEuY29tcG9uZW50c1tiXS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5lbGVtZW50UmVjdCA/IChiID0gYS5lbGVtZW50UmVjdC5yaWdodCAtIGEuZWxlbWVudFJlY3QubGVmdCwgZSA9IGEuZWxlbWVudFJlY3QuYm90dG9tIC0gYS5lbGVtZW50UmVjdC50b3AsIGEuQURBUkVBID0gYiAqIGUpIDogYS5BREFSRUEgPSBhLmFhLm9mZnNldFdpZHRoICogYS5hYS5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuQURBUkVBOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmJ3ID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoIWIgfHwgYiAmJiBiLkNMSVBDSEVDS0lOR1RBUkdFVCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5hLmJnKGIsIDMpLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAwIDwgZS5sZW5ndGggJiYgKGEuYS5mb3JFYWNoKGUsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgYS5zdHlsZSAmJiBhLnN0eWxlLmNsaXApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgIWMgJiYgYi5zdHlsZSAmJiBiLnN0eWxlLmNsaXAgJiYgKGMgPSBiKSwgYyAmJiAoYi5DTElQQ0hFQ0tJTkdUQVJHRVQgPSBjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBiID0gL3JlY3RcKChcZCspcHgsPyA/KFxkKylweCw/ID8oXGQrKXB4LD8gPyhcZCspcHhcKS87CiAgICAgICAgICAgICAgICAgICAgYS5hLmN0ID0gZnVuY3Rpb24gKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGgubWF0Y2goYik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGggJiYgKGggPSBhLmEuY2ooZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChhLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGgpLCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBoWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IGhbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IGhbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBoWzRdCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5jdSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJycsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyBpbiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuaGFzT3duUHJvcGVydHkoYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlbmNvZGVVUklDb21wb25lbnQoYVtjXSksIGUgPSBlICsgKCcmJyArIGMgKyAnPScgKyBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2xpY2UoMSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY3YgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID4gYS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBhLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmNoYXJDb2RlQXQoZSksIGIgPSAoYiA8PCA1KSAtIGIgKyBjLCBiID0gYiAmIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3LmFicyhiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5jdyA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IEEoKSwgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmdldEZ1bGxZZWFyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcwJyArIChjLmdldE1vbnRoKCkgKyAxKSkuc2xpY2UoLTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnMCcgKyBjLmdldERhdGUoKSkuc2xpY2UoLTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5jdihiICsgKGUgKyBjKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY3ggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB3aW5kb3cucGFnZVhPZmZzZXQgPyB3aW5kb3cucGFnZVhPZmZzZXQgKyB3aW5kb3cuaW5uZXJXaWR0aCAtIDEgOiAwLCBiID0gd2luZG93LnBhZ2VZT2Zmc2V0ID8gd2luZG93LnBhZ2VZT2Zmc2V0ICsgd2luZG93LmlubmVySGVpZ2h0IC0gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSB8fCBiID8gIWRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoYSwgYikgOiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGIsIGUsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5kZWZhdWx0VmlldyB8fCBjLnBhcmVudFdpbmRvdyB8fCB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiArPSBkLnBhZ2VYT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gZC5wYWdlWU9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmVsZW1lbnRGcm9tUG9pbnQoYiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIGEuYS5jeSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuY3ogPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIgfHwgIWIuc3R5bGUgfHwgIWIuc3R5bGUuZmlsdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gYi5zdHlsZS5maWx0ZXIuc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5tYXRjaCgvXGQrLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNlYXJjaCgvb3BhY2l0eS8pICYmIGIgJiYgMCA8IGIubGVuZ3RoICYmIChjID0gcGFyc2VGbG9hdChiLmpvaW4oJycpKSwgITEgPT09IGUgfHwgYyA8IGUpICYmIChlID0gYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kYSA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBiLnN0eWxlICYmICdoaWRkZW4nID09PSBiLnN0eWxlLnZpc2liaWxpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGIuc3R5bGUgJiYgYi5zdHlsZS5vcGFjaXR5ID8gcGFyc2VGbG9hdChiLnN0eWxlLm9wYWNpdHkpIDogYS5hLmN6KGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLmRiKGMpID8gYyA6IDEwMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kYyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmJhY2tncm91bmRDb2xvciA/IChhID0gYS5iYWNrZ3JvdW5kQ29sb3IsICd0cmFuc3BhcmVudCcgPT09IGEgPyAwIDogLTEgIT09IGEuaW5kZXhPZigncmdiJykgPyA0ID4gYS5zcGxpdCgnLCcpLmxlbmd0aCA/IDEgOiBwYXJzZUZsb2F0KGEuc3BsaXQoJywnKVszXS5zcGxpdCgnKScpWzBdKSA6IDEpIDogLTE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZGQgPSBmdW5jdGlvbiAoYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmUuZ2V0Q29tcHV0ZWRTdHlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmMuZS5nZXRDb21wdXRlZFN0eWxlKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgJ2hpZGRlbicgPT09IGQudmlzaWJpbGl0eSB8fCAnY29sbGFwc2UnID09PSBkLnZpc2liaWxpdHkgfHwgZSAmJiAwID09PSBhLmEuZGMoZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gcGFyc2VGbG9hdChkLm9wYWNpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmRlID0gZnVuY3Rpb24gKGIsIGUsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICFiLmFhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGIucGFyZW50Tm9kZVRyZWUgJiYgKGIucGFyZW50Tm9kZVRyZWUgPSBhLmEuYmcoYi5hYS5wYXJlbnRFbGVtZW50LCA1MCwgITApLCBlICYmIGIucGFyZW50Tm9kZVRyZWUucHVzaChiLmFhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gMTAwLCBmLCBnOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChiLnBhcmVudE5vZGVUcmVlLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGEuYS5kYShiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGYgJiYgKGcgPSBhLmEuZGQoYiwgYyksIGEuYS5kYihnKSAmJiBnID49IGYgJiYgKGYgPSBnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmIDwgZCAmJiAoZCA9IGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZGYgPSBmdW5jdGlvbiAoYSwgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBseShlIHx8IG51bGwsIGEuY29uY2F0KGEuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYmUgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhICYmIGEub3duZXJEb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIChiLmRlZmF1bHRWaWV3IHx8IGIucGFyZW50V2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZGcgPSBmdW5jdGlvbiAoYiwgZSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIgfHwgIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInICE9PSB0eXBlb2YgYyAmJiAoYyA9IDUwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZiA9IDA7IGYgPCBjOyBmKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPSBlLnBhcmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gYS5nLmIoYiwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kaCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB3Lm1heCg0LCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoMSArIHcucmFuZG9tKCkpICogdy5wb3coMTYsIGEpIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLCBhKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kaSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmEuZGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKDQpICsgJy0nICsgYig0KSArICctJyArIGIoNCkgKyAnLScgKyBiKDQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmEgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgJiYgd2luZG93LmNsZWFyVGltZW91dCAmJiB3aW5kb3cuY2xlYXJUaW1lb3V0KGEpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmIgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgJiYgd2luZG93LmNsZWFySW50ZXJ2YWwgJiYgd2luZG93LmNsZWFySW50ZXJ2YWwoYSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuaihlLnRvU3RyaW5nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuaihiICYmIGIuRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nID0gYi5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcsIGUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmMuZSAhPT0gYiAmJiBhLmMuZSAmJiBhLmMuZS5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuaihjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRvU3RyaW5nID0gYywgZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmogJiYgOCA+PSBhLmEucygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBiIHx8IHdpbmRvdywgZCA9IGMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnSUZSQU1FJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgZC5zdHlsZS53aWR0aCA9ICcwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICBkLnN0eWxlLmhlaWdodCA9ICcwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICBkLndpZHRoID0gJzAnOwogICAgICAgICAgICAgICAgICAgICAgICBkLmhlaWdodCA9ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNsKGQsIGMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5jb250ZW50V2luZG93ICYmIChlLnRvU3RyaW5nID0gZC5jb250ZW50V2luZG93LkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICBjLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEudG9TdHJpbmcgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBjID0gYyB8fCBhLmMuZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZShjLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kaiA9IGZ1bmN0aW9uIChiLCBlLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmEudG9TdHJpbmcoYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmMuaygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5ldmFsKCcoJyArIGIgKyAnKSgnICsgZSArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEuYy5sKGMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGMuRnVuY3Rpb24oJygnICsgYiArICcpKCcgKyBlICsgJyknKSgpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC50ZXh0ID0gJygnICsgYiArICcpKCcgKyBlICsgJyknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNsKGQsIGMuZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kayA9IGZ1bmN0aW9uIChiLCBlLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChiW2FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZywgeDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGQgJiYgKGQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBnID0gd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICB4ID0gZihiLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gYS5nLmMoZywgJ251bWJlcicgPT09IHR5cGVvZiBlID8gZSA6IDIwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgbSA9IGUubGVuZ3RoOyBuIDwgbSAmJiAoZyA9IGVbbl0sIHggPSBmKGIsIGcpLCAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHgpOyBuKyspOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcKICAgICAgICAgICAgICAgICAgICAgICAgXSA6IHg7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZGwgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiAoZSA9ICcoJyArIGUgKyAnKCcgKyBiICsgJykpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKGZ1bmN0aW9uKCl7dHJ5e3JldHVybignICsgZSArICcpKCl9Y2F0Y2goZSl7cmV0dXJuIGZhbHNlfX0pKCknOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmRtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEuYS5rKCksIGUgPSBiICYmICdzdHJpbmcnID09PSB0eXBlb2YgYiwgYyA9IC9WZXJzaW9uXC8oXGQqKS8sIGQgPSAvQ1BVLipPU1xzKFxkKilfLywgYyA9IChjID0gZSAmJiBiLm1hdGNoKGMpKSAmJiAxIDwgYy5sZW5ndGggPyBwYXJzZUludChjWzFdLCAxMCkgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgIT09IHR5cGVvZiBjICYmIChjID0gKGMgPSBlICYmIGIubWF0Y2goZCkpICYmIDEgPCBjLmxlbmd0aCA/IHBhcnNlSW50KGNbMV0sIDEwKSA6ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuYm0gPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHR5cGVvZiBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBbXSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSBpbiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZXZlcnkgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBhIHx8ICFhIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShlKSAmJiAhMCAhPT0gYihhW2VdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kbiA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnMXB4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzFweCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6ICctOTk5OXB4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICctOTk5OXB4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5oYXNPd25Qcm9wZXJ0eShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0eWxlJyA9PT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgYltlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKGUsIGJbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIGJbZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYltlXS5oYXNPd25Qcm9wZXJ0eShjKSAmJiAoYVtlXVtjXSA9IGJbZV1bY10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlXSA9IGJbZV07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuc29tZSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIGEgfHwgIWEgfHwgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgaW4gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmhhc093blByb3BlcnR5KGUpICYmICEwID09PSBiKGFbZV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hWydkbyddID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gYSB8fCBudWxsID09PSBhIHx8ICExID09PSBhIHx8ICcnID09PSBhID8gITAgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kcCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIGEuYS5mKGIpICYmIDAgPCBiLmxlbmd0aCA/IGJbMF0gOiBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmRxID0gZnVuY3Rpb24gKGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlIHx8IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjIHx8ICFjLnBlcmZvcm1hbmNlIHx8ICFjLnBlcmZvcm1hbmNlLmdldEVudHJpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBtc2c6ICducycgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjLnBlcmZvcm1hbmNlLmdldEVudHJpZXMoKSwgZiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChjLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi50ZXN0KGEubmFtZSkgJiYgZi5wdXNoKGQoYSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IGYubGVuZ3RoID8geyBtc2c6ICduZicgfSA6IGY7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZHIgPSBmdW5jdGlvbiAoYiwgZSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hLmRiKGIpICYmIGEuYS5kYihlKSAmJiBhLmEuZGIoYykgPyB3LmFicyhiIC0gZSkgPD0gYyA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmRiID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInID09PSB0eXBlb2YgYSAmJiAhaXNOYU4oYSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZHMgPSBmdW5jdGlvbiAoYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYS5mKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGUsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID09PSBiICYmIGMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmFrID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnICE9PSB0eXBlb2YgYSA/ICExIDogL14oPzpodHRwcz86XC9cLyk/W14uOlwvXSsoPzpcLlteLjpcL10rKS8udGVzdChhKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5kdCA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuZXZlcnkoYiwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuYXgoYi52YWx1ZXMsIGVbYi5sb29rdXBdIHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZHUgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEgfHwgJ29iamVjdCcgIT09IHR5cGVvZiBhIHx8ICdzdHJpbmcnICE9PSB0eXBlb2YgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhW2IudG9Mb3dlckNhc2UoKV0sIGMgPSBhLmFsbDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZSA/ICExICE9PSBlIDogJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBjICYmICExICE9PSBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmR2ID0gZnVuY3Rpb24gKGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmEuZihiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuZHUoYiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmR1KGIsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gITAsICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZHcgPSBmdW5jdGlvbiAoYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYS5mKGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5kdShiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5hLmR1KGIsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5keCA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmICdvYmplY3QnID09PSB0eXBlb2YgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgIT09IHR5cGVvZiBiICYmIChiID0gJ2FsbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhW2JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZSA/IGUgOiBhLmFsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmR5ID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYSB8fCAnc3RyaW5nJyAhPT0gdHlwZW9mIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5tYXRjaChiKSB8fCAoYSArPSBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmEuZHogPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLl9BRF9GT1JNQVQgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5lYSA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hLmR6KGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWMgfHwgYS5hLmF4KGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmViID0gZjsKICAgICAgICAgICAgICAgICAgICBhLmEuZWMgPSBmOwogICAgICAgICAgICAgICAgICAgIGEuYS5lZCA9IGY7CiAgICAgICAgICAgICAgICAgICAgYS5hLmVlID0gZjsKICAgICAgICAgICAgICAgICAgICBhLmEuZWYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYS5lZyA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiLnggPyBiLnggOiBiLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiLnkgPyBiLnkgOiBiLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgZiwgZywgeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYi53IHx8IGIud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgZCAmJiAwICE9IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBlICsgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChnID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiLnIgPyBiLnIgOiBiLnJpZ2h0LCAnbnVtYmVyJyA9PT0gdHlwZW9mIGcgJiYgZyA+IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBnIC0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gYi5oIHx8IGIuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIGYgJiYgMCAhPSBmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gYyArIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgYi5iID8gYi5iIDogYi5ib3R0b20sICdudW1iZXInID09PSB0eXBlb2YgeCAmJiBjIDwgeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHggLSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5jZChiLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHI6IGcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6IHgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hLmVoID0gZnVuY3Rpb24gKGIsIGUsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgZSB8fCAwID49IGUgfHwgaXNOYU4oZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gYi5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyAhPT0gdHlwZW9mIGMgfHwgMCA+PSBjIHx8IGlzTmFOKGMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHcubWluKGIubGVuZ3RoLCA1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmEuY2soYS5hLmVnLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi53ICogYi5oIC0gYS53ICogYS5oOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuc2xpY2UoMCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGIueCwgYyA9IGIueSwgZiA9IGIuciwgZyA9IGIuYiwgcCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZCwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEueSwgZSA9IGEuciwgZCA9IGEuYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID49IGEueCAmJiBjID49IGIgJiYgZiA8PSBlICYmIGcgPD0gZCAmJiAocCA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAmJiBkLnB1c2goYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5sZW5ndGggPCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5nID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5nLmQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB0eXBlb2YgYS5sb2NhdGlvbi50b1N0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gZCB8fCAndW5rbm93bicgPT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0eXBlb2YgYS5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gZiB8fCAndW5rbm93bicgPT09IGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmlubmVyV2lkdGggfHwgYS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgYS5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcicgIT09IHR5cGVvZiAoYS5zY3JlZW5YIHx8IGEuc2NyZWVuTGVmdCB8fCAwKSB8fCAnbnVtYmVyJyAhPT0gdHlwZW9mIGcgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBhLmcuZSA9IGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsubW9hdEhvc3RpbGVJZnJhbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGsuZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmIGQuc2xpY2UgJiYgJ2h0dHAnID09PSBkLnNsaWNlKDAsIDQpICYmIGEuYS5iYyhkKSAhPSBhLmEuYmMod2EubG9jYXRpb24udG9TdHJpbmcoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsubW9hdEhvc3RpbGVJZnJhbWUgPSAhMCwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gayAmJiAoay5jb250ZW50RG9jdW1lbnQgfHwgay5jb250ZW50V2luZG93ICYmIGsuY29udGVudFdpbmRvdy5kb2N1bWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGYubG9jYXRpb24udG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsubW9hdEhvc3RpbGVJZnJhbWUgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5tb2F0SG9zdGlsZUlmcmFtZSA9ICEwLCBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmcuYiA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkIHx8IGEuYS5iZShrKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGQuZnJhbWVFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZy5mID0gZnVuY3Rpb24gKGssIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGsuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lmcmFtZScpLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgYS5jb250ZW50V2luZG93ICYmIGEuY29udGVudFdpbmRvdyA9PSBkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZy5nID0gZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPSBhLmcuYihrKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmcuaCA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAwLCBnID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCA9IGQgfHwgMTA7IGYgPCBkOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmKyssIGsgPSBhLmcuYihrKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnB1c2goayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmcuYyA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAwLCBnID0gW2tdLCBjOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSBkIHx8IDEwOyBmIDwgZDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgPSAoYyA9IGsuZnJhbWVFbGVtZW50KSAmJiBhLmEuYmUoYyksIGMgJiYgayAmJiAhYS5nLmQoaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcucHVzaChrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5nLmkgPSBmdW5jdGlvbiAoaywgZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGMsIGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmIGgucHVzaChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMTAgPCBlIHx8ICFjIHx8ICFjLmZyYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gaXNOYU4oYy5mcmFtZXMubGVuZ3RoKSA/IDEwMCA6IGMuZnJhbWVzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gMTAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBkOyBwKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT0gYy5mcmFtZXNbcF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgIWEuZy5qKGMuZnJhbWVzW3BdKSA/IGgucHVzaChjLmZyYW1lc1twXSkgOiBoID0gaC5jb25jYXQoZyhjLmZyYW1lc1twXSwgYiwgZSArIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGssIGQsIGYpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5nLmsgPSBmdW5jdGlvbiAoYSwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gJ251bWJlcicgPT0gdHlwZW9mIGQgJiYgMCA8IGQgPyBkIDogMTU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gW10sIGc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBhLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGQ7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhID0gYS5wYXJlbnQpICYmIGEgIT0gYS50b3ApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYucHVzaChnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5nLmwgPSBbXTsKICAgICAgICAgICAgICAgICAgICBhLmcuaiA9IGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQsIGYgPSAwLCBnID0gYS5nLmwubGVuZ3RoOyBmIDwgZzsgZisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nLmxbZl0ud2luID09IGsgJiYgKGQgPSBhLmcubFtmXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW46IGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJpZW5kbHk6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmRvY3VtZW50ICYmIChkLmZyaWVuZGx5ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmZyaWVuZGx5OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5nLm0gPSBmdW5jdGlvbiAoaywgZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICBrID0gYS5nLmMoaykucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBhLmcuaShrLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSAwLCBjID0gay5sZW5ndGg7IGcgPCBjOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa1tnXSA9PSBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgJiYgZC5wYXJlbnQgJiYgYS5nLmQoZC5wYXJlbnQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZy5hID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDAsIGQgPSB3aW5kb3c7IDUwID4gazspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID09PSB3aW5kb3cudG9wIHx8IGEuZy5kKGQucGFyZW50KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCAmJiBkLmFwcGx5ID8gZC5hcHBseShudWxsLCBhcmd1bWVudHMpIDogZChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ01vYXQjRVRTJ10gfHwgKHRoaXNbJ01vYXQjRVRTJ10gPSBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ01vYXQjRU1DJ10gfHwgKHRoaXNbJ01vYXQjRU1DJ10gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMzYwMDAwMCA8PSBiIC0gdGhpc1snTW9hdCNFVFMnXSwgaCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSAnZmFpbGVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSB4Lm5hbWUgKyAnIGluIGNsb3N1cmUgKGNiKTogJyArIHgubWVzc2FnZSArICcsIHN0YWNrPScgKyB4LnN0YWNrICsgJywgXG5jYj0nICsgaCArICdcbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUgJiYgMTAgPiB0aGlzWydNb2F0I0VNQyddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1snTW9hdCNFTUMnXSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBvbWlkTmF0aXZlICYmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEltYWdlIHx8IEltYWdlICYmIEltYWdlLl9Nb2F0UHJveHlPZiksIHAgPSBsID8gJycgOiBkb2N1bWVudC5yZWZlcnJlciwgdCA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgYSAmJiBhLmMgJiYgYS5jLm4gPyBhLmMubiA6ICcnLCBxID0gJ2h0dHBzOi8vcHgubW9hdGFkcy5jb20vcGl4ZWwuZ2lmP2U9MjQmZD1kYXRhJTNBZGF0YSUzQWRhdGElM0FkYXRhJmk9JyArIGVzY2FwZSgnUkVVVEVSU19IRUFERVIxJykgKyAnJmFjPTEmaz0nICsgZXNjYXBlKGgpICsgJyZhcj0nICsgZXNjYXBlKCcyOWFkNTlkLWNsZWFuJykgKyAnJml3PScgKyBlc2NhcGUoJzMxZDY5NjUnKSArICcmYnE9JyArIGVzY2FwZSh0KSArICcmaj0nICsgZXNjYXBlKHApICsgJyZjcz0nICsgbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pZE5hdGl2ZS5zZW5kVXJsKHEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gbmV3IEltYWdlKDEsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5zcmMgPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ01vYXQjRU1DJ10gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbJ01vYXQjRVRTJ10gPSBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAobCA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygb21pZE5hdGl2ZSAmJiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBJbWFnZSB8fCBJbWFnZSAmJiBJbWFnZS5fTW9hdFByb3h5T2YpKSA/ICcnIDogZG9jdW1lbnQucmVmZXJyZXIsIHQgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGEgJiYgYS5jICYmIGEuYy5uID8gYS5jLm4gOiAnJywgcSA9ICdodHRwczovL3B4Lm1vYXRhZHMuY29tL3BpeGVsLmdpZj9lPTI0JmQ9ZGF0YSUzQWRhdGElM0FkYXRhJTNBZGF0YSZpPScgKyBlc2NhcGUoJ1JFVVRFUlNfSEVBREVSMScpICsgJyZhYz0xJms9JyArIGVzY2FwZShoKSArICcmYXI9JyArIGVzY2FwZSgnMjlhZDU5ZC1jbGVhbicpICsgJyZpdz0nICsgZXNjYXBlKCczMWQ2OTY1JykgKyAnJmJxPScgKyBlc2NhcGUodCkgKyAnJmo9JyArIGVzY2FwZShwKSArICcmY3M9JyArIG5ldyBBKCkuZ2V0VGltZSgpLCBsID8gb21pZE5hdGl2ZS5zZW5kVXJsKHEpIDogKGsgPSBuZXcgSW1hZ2UoMSwgMSksIGsuc3JjID0gcSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5sID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmwuYSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgYS5sLmIgPSBmdW5jdGlvbiAoZCwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgJ3N0cmluZycgIT09IHR5cGVvZiBnIHx8ICFkW2ddIHx8IGQgPT0gd2luZG93KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBkLm5vZGVOYW1lICYmICgnT0JKRUNUJyA9PT0gZC5ub2RlTmFtZSB8fCAnRU1CRUQnID09PSBkLm5vZGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhICYmIGEuYiAmJiBhLmJbZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBkW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5jID0gZnVuY3Rpb24gKGYsIGcsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGgsIGwgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdWNoc3RhcnQnID09PSBnICYmIGEuYy5vICYmIChsID0geyBwYXNzaXZlOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA/IGRbZyArIGJdID8gYyA9IGRbZyArIGJdIDogKGMgPSBrKGMpLCBkW2cgKyBiXSA9IGMpIDogYyA9IGsoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gJ2FkZEV2ZW50TGlzdGVuZXInLCBlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGYuYXR0YWNoRXZlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gJ2F0dGFjaEV2ZW50JywgZSA9ICdvbic7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPSBhLmwuYihmLCBiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5jYWxsKGYsIGUgKyBnLCBjLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW2JdKGUgKyBnLCBjLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZiAmJiBiICYmIGZbYl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZbYl0oZSArIGcsIGMsIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5kID0gZnVuY3Rpb24gKGYsIGcsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBiID8gZFtnICsgYl0gOiBjOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZFtnICsgYl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZi5kZXRhY2hFdmVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAnZGV0YWNoRXZlbnQnLCBlID0gJ29uJzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IGEubC5iKGYsIGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmNhbGwoZiwgZSArIGcsIGMsICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW2JdKGUgKyBnLCBjLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltiXShlICsgZywgYywgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5sLmUgPSBmdW5jdGlvbiAoZCwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gayhkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyAmJiB3aW5kb3cuc2V0SW50ZXJ2YWwgJiYgKGMgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZCwgZyksIDEgPT0gYyAmJiAoYS5hLmIoYyksIGMgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZCwgZykpLCBYLnB1c2goYykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5mID0gZnVuY3Rpb24gKGQsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMsIGIgPSBrKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9bY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgJiYgZC5hcHBseSA/IGQuYXBwbHkobnVsbCwgYXJndW1lbnRzKSA6IGQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93ICYmIHdpbmRvdy5zZXRUaW1lb3V0ICYmIChjID0gd2luZG93LnNldFRpbWVvdXQoYiwgZyksIDEgPT0gYyAmJiAoYS5hLmEoYyksIGMgPSB3aW5kb3cuc2V0VGltZW91dChiLCBnKSksIE9bY10gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5sLmcgPSBmdW5jdGlvbiAoZCwgZywgYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgKz0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIEZbYl0gJiYgYS5hLmEoRltiXS50aWQpOwogICAgICAgICAgICAgICAgICAgICAgICBGW2JdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIEZbYl0uY2FsbGJhY2sgPSBrKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBGW2JdLnBhcmFtcyA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIEZbYl0uaW50ZXJ2YWwgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICBGW2JdLnRpZCA9IGEubC5mKGEubC5oKGIpLCBjKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5oID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRiB8fCAhRltkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IEZbZF0uY2FsbGJhY2soRltkXS5wYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdib29sZWFuJyA9PT0gdHlwZW9mIGcgJiYgITEgPT09IGcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5hKEZbZF0udGlkKSwgRltkXSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRltkXS50aWQgPSBhLmwuZihhLmwuaChkKSwgRltkXS5pbnRlcnZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmwuaSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZbZF0gJiYgKGEuYS5hKEZbZF0udGlkKSwgRltkXSA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5qID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5rID0gZnVuY3Rpb24gKGQsIGcsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAwLCBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCAhPT0gZCgpICYmIChlIDwgZyA/IGEubC5mKGgsIGMpIDogJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGIgJiYgYigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGgoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEubC5sID0gazsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdudW1iZXInID09PSB0eXBlb2YgYS5hLnIoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmEuaygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGQgPSBkICYmIGQubWF0Y2goL0Nocm9tKGV8aXVtKVwvKFswLTldKylcLi8pKSA/IHBhcnNlSW50KGRbMl0sIDEwKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmMgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuZy5kKHdpbmRvdy5wYXJlbnQpOwogICAgICAgICAgICAgICAgICAgIGEuYy5wID0gd2luZG93ICE9IHdpbmRvdy5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgYS5jLnEgPSBhLmMucCAmJiAhZDsKICAgICAgICAgICAgICAgICAgICBhLmMuYyA9IGQgPyAhMSA6ICFhLmcuZCh3aW5kb3cudG9wKTsKICAgICAgICAgICAgICAgICAgICBhLmMuZSA9IGEuYy5jID8gd2luZG93LnRvcCA6IGEuYy5xID8gd2luZG93LnBhcmVudCA6IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICBhLmMuciA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkLCBjLCBiLCBlID0gMCwgaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA9IGEuZG9jdW1lbnQsIGMgPSBkLmRvY3VtZW50RWxlbWVudCwgYiA9IGQuYm9keSwgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhLmlubmVyV2lkdGgpID8gKGUgPSBhLmlubmVyV2lkdGgsIGggPSBhLmlubmVySGVpZ2h0KSA6ICdDU1MxQ29tcGF0JyA9PT0gZC5jb21wYXRNb2RlICYmIDUgIT09IGQuZG9jdW1lbnRNb2RlIHx8ICFiIHx8ICd1bmRlZmluZWQnID09PSB0eXBlb2YgYi5jbGllbnRXaWR0aCA/IGMgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBjLmNsaWVudFdpZHRoICYmIChlID0gYy5jbGllbnRXaWR0aCwgaCA9IGMuY2xpZW50SGVpZ2h0KSA6IChlID0gYi5jbGllbnRXaWR0aCwgaCA9IGIuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAobCkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogaAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5jLmUgfHwgIWEuYy5lLnNjcmVlbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYy5lLnNjcmVlbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBkLmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsV2lkdGg6IGQuYXZhaWxXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsSGVpZ2h0OiBkLmF2YWlsSGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmMuZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBkLmRvY3VtZW50ICYmIGQuZG9jdW1lbnQuYm9keSwgYyA9IGQuZG9jdW1lbnQgJiYgZC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMucygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiAoYS5jLnUgPSBiLmF2YWlsV2lkdGgsIGEuYy52ID0gYi5hdmFpbEhlaWdodCwgYS5jLncgPSBiLndpZHRoLCBhLmMueCA9IGIuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLnUgPSBhLmMudSB8fCAwLCBhLmMudiA9IGEuYy52IHx8IDAsIGEuYy53ID0gYS5jLncgfHwgMCwgYS5jLnggPSBhLmMueCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmMucihkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLnkgPSBiLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMueiA9IGIuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmFhID0gZC5vdXRlcldpZHRoIHx8IGQuZG9jdW1lbnQgJiYgZC5kb2N1bWVudC5ib2R5ICYmIGQuZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCB8fCAwLCBhLmMuYWIgPSBkLm91dGVySGVpZ2h0IHx8IGQuZG9jdW1lbnQgJiYgZC5kb2N1bWVudC5ib2R5ICYmIGQuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmFhID0gMCwgYS5jLmFiID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBnICYmIGMgJiYgKGEuYy5oID0gdy5tYXgoZy5zY3JvbGxIZWlnaHQsIGcub2Zmc2V0SGVpZ2h0LCBjLmNsaWVudEhlaWdodCwgYy5zY3JvbGxIZWlnaHQsIGMub2Zmc2V0SGVpZ2h0KSwgYS5jLmFjID0gZy5zY3JvbGxUb3AgfHwgYy5zY3JvbGxUb3AgfHwgZC5wYWdlWU9mZnNldCB8fCAwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy50KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmIgPSAwIDw9IFN0cmluZyhGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcpLmluZGV4T2YoJ1tuYXRpdmUgY29kZV0nKTsKICAgICAgICAgICAgICAgICAgICBhLmMuYWQgPSAtMSAhPT0gYS5hLmsoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZpcmVmb3gnKTsKICAgICAgICAgICAgICAgICAgICBhLmMuaiA9IGEuYS50KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmFlID0gISF3aW5kb3cuY2hyb21lICYmIGEuYS5qKHdpbmRvdy5jaHJvbWUuY3NpLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmFmID0gISEoJ29wcicgaW4gd2luZG93ICYmICdhZGRvbnMnIGluIHdpbmRvdy5vcHIgJiYgYS5hLmood2luZG93LkRldGFjaGVkVmlld0NvbnRyb2xFdmVudCkpOwogICAgICAgICAgICAgICAgICAgIGEuYy5hZyA9ICFhLmMuYWUgJiYgRXJyb3IucHJvcGVydHlJc0VudW1lcmFibGUoJ2NhcHR1cmVTdGFja1RyYWNlJykgJiYgdm9pZCAwICE9PSB3aW5kb3cub25vcmllbnRhdGlvbmNoYW5nZTsKICAgICAgICAgICAgICAgICAgICBhLmMuYWggPSBhLmMuYWYgfHwgYS5jLmFnOwogICAgICAgICAgICAgICAgICAgIGEuYy5haSA9IGEuYy5hZSAmJiAoISF3aW5kb3cuQXRvbWljcyAmJiAhIXdpbmRvdy5BdG9taWNzLm5vdGlmeSB8fCAhIXdpbmRvdy5FbnRlclBpY3R1cmVJblBpY3R1cmVFdmVudCB8fCAhIXdpbmRvdy5jaHJvbWUud2Vic3RvcmUpOwogICAgICAgICAgICAgICAgICAgIGEuYy5haiA9IGEuYy5hZSAmJiAhYS5jLmFoICYmIHZvaWQgMCAhPT0gd2luZG93Lm9ub3JpZW50YXRpb25jaGFuZ2U7CiAgICAgICAgICAgICAgICAgICAgYS5jLmFrID0gYS5jLmFpIHx8IGEuYy5hajsKICAgICAgICAgICAgICAgICAgICBhLmMuYWwgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gJiYgLTEgPCBuYXZpZ2F0b3IuYXBwVmVyc2lvbi5zZWFyY2goL0VkZ2VcL1xkKi5cZCovKSAmJiAhZG9jdW1lbnQuZG9jdW1lbnRNb2RlICYmICEhd2luZG93LlN0eWxlTWVkaWE7CiAgICAgICAgICAgICAgICAgICAgYS5jLm0gPSAwIDwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5IVE1MRWxlbWVudCkuaW5kZXhPZignQ29uc3RydWN0b3InKSB8fCB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudCAmJiB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudC5wcm90b3R5cGUgJiYgJ3dlYmtpdFdpcmVsZXNzVmlkZW9QbGF5YmFja0Rpc2FibGVkJyBpbiB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudC5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgYS5jLmFtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5BcHA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiAnTm90IGFwcCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEucCgpID8gKGQuaXNJbkFwcCA9IDEsIGQuZW52ID0gJ3R2T1MnKSA6IGEuYS5vKCkgPyAoZC5pc0luQXBwID0gMSwgZC5lbnYgPSAnaU9TJykgOiBhLmEucSgpICYmIChkLmlzSW5BcHAgPSAxLCBkLmVudiA9ICdBbmRyb2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmFuID0gazsKICAgICAgICAgICAgICAgICAgICBhLmMuYW8gPSBhLmMuYWkgJiYgNDAgPD0gaygpOwogICAgICAgICAgICAgICAgICAgIGEuYy5hcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmMuYW8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yICYmIG5hdmlnYXRvcltkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDY2ID4gaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBnID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBjID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93W2RdICYmICEod2luZG93W2RdICYmIHdpbmRvd1tkXVtnXSAmJiB3aW5kb3dbZF1bZ11bY10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5hcSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZi5iICE9PSBhLmYuYy50b1N0cmluZygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MwogICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdyAmJiB3aW5kb3cubmF2aWdhdG9yICYmIHdpbmRvdy5uYXZpZ2F0b3JbZF07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuYXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmYuYiAhPT0gYS5mLmQudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBnID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgYyA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhYS5jLmFtKCkuaXNJbkFwcCAmJiBhLmMubSAmJiBhLmMuYiAmJiAhYS5hLmood2luZG93W2RdLCAhMCkgJiYgIWEuYS5qKHdpbmRvd1tnXSwgITApICYmICFhLmEuaih3aW5kb3dbY10sICEwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IDE5IC50b1N0cmluZygyKS5sZW5ndGggLSAxLCBjID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPDw9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICE9IGMgPj4gYSAmJiAoYyBePSAxOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA5ID09PSBhID8gMzAgOiAxMCA9PT0gYSA/IDMxIDogYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5mID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5mLmUgPSAwOwogICAgICAgICAgICAgICAgICAgIGEuZi5jID0gMTsKICAgICAgICAgICAgICAgICAgICBhLmYuZiA9IDI7CiAgICAgICAgICAgICAgICAgICAgYS5mLmQgPSAzOwogICAgICAgICAgICAgICAgICAgIGEuZi5nID0gNDsKICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGEuYS5kOwogICAgICAgICAgICAgICAgICAgIGEuZi5oID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9ICcnLCBiID0gMDsgYiA8IGEubGVuZ3RoOyBiKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuY2hhckNvZGVBdChiKSBeIDg1LCBjID0gYyArIFN0cmluZy5mcm9tQ2hhckNvZGUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gJycsIGUgPSBiID0gMCwgaCwgZCwgcCwgdCA9IDA7IHQgPCBhLmxlbmd0aDsgKyt0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwID0gYS5jaGFyQ29kZUF0KHQpLCBkID0gMjU1IDwgcCA/IDAgOiAxOyAyID4gZDsgKytkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSAwID09PSBkID8gYiB8IChwICYgNjUyODApIC8gMjU2IDw8IGUgOiBiIHwgKHAgJiAyNTUpIDw8IGUsIGUgKz0gOCwgMTMgPCBlICYmIChoID0gYiAmIDgxOTEsIDg4IDwgaCA/IChiID4+PSAxMywgZSAtPSAxMykgOiAoaCA9IGIgJiAxNjM4MywgYiA+Pj0gMTQsIGUgLT0gMTQpLCBjICs9IGYuY2hhckF0KGggJSA5MSksIGMgKz0gZi5jaGFyQXQoaCAvIDkxIHwgMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAwIDwgZSAmJiAoYyArPSBmLmNoYXJBdChiICUgOTEpLCA3IDwgZSB8fCA5MCA8IGIpICYmIChjICs9IGYuY2hhckF0KGIgLyA5MSB8IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmYuaSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IGEubGVuZ3RoOyBiKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuY2hhckNvZGVBdChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjggPiBlID8gYy5wdXNoKGUpIDogMjA0OCA+IGUgPyBjLnB1c2goMTkyIHwgZSA+PiA2LCAxMjggfCBlICYgNjMpIDogNTUyOTYgPiBlIHx8IDU3MzQ0IDw9IGUgPyBjLnB1c2goMjI0IHwgZSA+PiAxMiwgMTI4IHwgZSA+PiA2ICYgNjMsIDEyOCB8IGUgJiA2MykgOiBiIDwgYS5sZW5ndGggLSAxICYmIChiKyssIGUgPSA2NTUzNiArICgoZSAmIDEwMjMpIDw8IDEwIHwgYS5jaGFyQ29kZUF0KGIpICYgMTAyMyksIGMucHVzaCgyNDAgfCBlID4+IDE4LCAxMjggfCBlID4+IDEyICYgNjMsIDEyOCB8IGUgPj4gNiAmIDYzLCAxMjggfCBlICYgNjMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHcuZmxvb3IoMTAwMCAqIHcucmFuZG9tKCkpICUgMjUxOwogICAgICAgICAgICAgICAgICAgICAgICBhID0gWzQwICogYiAlIDI1MV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCBjLmxlbmd0aDsgZSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IChiICogYiArIChlICsgMSkpICUgMjUxLCBhLnB1c2goY1tlXSBeIGIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHdpbmRvdy5idG9hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBhLmxlbmd0aDsgYisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGFbYl0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBidG9hKGMuam9pbignJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLmogPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gJycsIGIgPSBrKCksIGUgPSAwOyBlIDwgYS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZChhLmNoYXJDb2RlQXQoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSAwID09PSBlICUgMiA/IGIoKSA6IC0xICogYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IDAgPT09IGwgPyBoIDogMTI2IDwgaCArIGwgPyAzMCArIChsIC0gKDEyNiAtIGgpIC0gMSkgOiAzMCA+IGggKyBsID8gMTI2ICsgKGwgKyAoaCAtIDMwKSArIDEpIDogaCArIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoMzAgPT09IGggPyA5IDogMzEgPT09IGggPyAxMCA6IGgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLmsgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gJycsIGIgPSBrKCksIGUgPSAwOyBlIDwgYS5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBiKCksIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gZChhW2VdLmNoYXJDb2RlQXQoMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IDAgPT09IGUgJSAyID8gaCA6IC0xICogaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSAwID09PSBoID8gbCA6IDMwID4gbCAtIGggPyAxMjYgLSAoaCAtIChsIC0gMzApIC0gMSkgOiAxMjYgPCBsIC0gaCA/IDMwIC0gKGggKyAoMTI2IC0gbCkgKyAxKSA6IGwgLSBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMwID09PSBsID8gOSA6IDMxID09PSBsID8gMTAgOiBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5sID0gZnVuY3Rpb24gKGQsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZCwgZnVuY3Rpb24gKGEsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IGEgJiYgKCdzdHJpbmcnID09PSB0eXBlb2YgKGMgPyBhW2NdIDogYSkgfHwgJ251bWJlcicgPT09IHR5cGVvZiAoYyA/IGFbY10gOiBhKSB8fCAnYm9vbGVhbicgPT09IHR5cGVvZiAoYyA/IGFbY10gOiBhKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IFN0cmluZyhjID8gYVtjXSA6IGEpLnNwbGl0KCcmJykuam9pbignJTI2Jykuc3BsaXQoJz0nKS5qb2luKCclM0QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnB1c2goKCdudW1iZXInID09PSB0eXBlb2YgaCA/ICcnIDogaCArICc9JykgKyBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICBiLnNvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuam9pbignJicpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLmEgPSBhLmEuZTsKICAgICAgICAgICAgICAgICAgICBhLmYubSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmYubiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSAoISF3aW5kb3cuY2hyb21lICYmICghIXdpbmRvdy5BdG9taWNzICYmICEhd2luZG93LkF0b21pY3Mubm90aWZ5IHx8ICEhd2luZG93LkVudGVyUGljdHVyZUluUGljdHVyZUV2ZW50IHx8ICEhd2luZG93LmNocm9tZS53ZWJzdG9yZSkpID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgSW5zdGFsbFRyaWdnZXIgfHwgJ01vekFwcGVhcmFuY2UnIGluIGQpID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gISF3aW5kb3cub3BlcmEgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSBhLmMubSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgPT09ICghKydceDBCMScgfHwgISFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgISF3aW5kb3cuQWN0aXZlWE9iamVjdCB8fCAnLW1zLXNjcm9sbC1saW1pdCcgaW4gZCAmJiAnLW1zLWltZS1hbGlnbicgaW4gZCkgPyAxIDogMAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gITEsIGMgPSAwOyBjIDwgYS5mLm4ubGVuZ3RoOyBjKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gYS5mLm5bY10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgITEgIT09IGQgJiYgKGEuZi5iID0gZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmYuYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5iID0gYS5mLm0oKTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmMuYXMgPSAnMjYnOwogICAgICAgICAgICAgICAgICAgIGEuYy5hdCA9ICdNb2F0U3VwZXJWJzsKICAgICAgICAgICAgICAgICAgICBhLmMuYXUgPSAnLSc7CiAgICAgICAgICAgICAgICAgICAgYS5jLmYgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGEuYy5nICYmIChhLmMuYXUgPSBiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5hdiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYy5hdyA9IGEuYy5hdCArIGEuYy5hczsKICAgICAgICAgICAgICAgICAgICBhLmMubiA9IDExOwogICAgICAgICAgICAgICAgICAgIGEuYy5heCA9IHdpbmRvdyAmJiB3aW5kb3dbJ01vYXQjRycgKyBhLmMuYXNdIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYy5heSA9ICdNb2F0I0cnICsgYS5jLmFzOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd1thLmMuYXldID0gYS5jLmF4OwogICAgICAgICAgICAgICAgICAgIGEuYy5heC5hIHx8IChhLmMuYXguYSA9IHcuZmxvb3Iody5yYW5kb20oKSAqIHcucG93KDEwLCAxMikpKTsKICAgICAgICAgICAgICAgICAgICBhLmMuYXogPSB3LmZsb29yKHcucmFuZG9tKCkgKiB3LnBvdygxMCwgMTIpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYS5hYygpOwogICAgICAgICAgICAgICAgICAgIGEuYy5iYSA9IGQudXJsOwogICAgICAgICAgICAgICAgICAgIGEuYy5iYiA9IGQuaXNDb3JyZWN0OwogICAgICAgICAgICAgICAgICAgIGQgPSBhLmwubChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGEuYy5iYyA9IGQoKTsKICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJyAhPT0gdHlwZW9mIGEuYy5iYyAmJiAoYS5jLmJjID0gJycpOwogICAgICAgICAgICAgICAgICAgIGEuYy5iZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF3aW5kb3cub21pZDNwICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93Lm9taWQzcC5jdXN0b21OYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuYmYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5iZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuYmYoKSB8fCBhLmMuYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmMuYmggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIGEuYy5iaSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJqID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJrID0gITA7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJsID0gITA7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJtID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJtID0gITA7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJuID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IDMgPiBlOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gcGFyc2VJbnQoYVtlXSksIGQgPSBwYXJzZUludChiW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIGlzTmFOKGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgaXNOYU4oYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA+IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuYm8gPSBrOwogICAgICAgICAgICAgICAgICAgIGEuYy5icCA9IGs7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJxID0gazsKICAgICAgICAgICAgICAgICAgICBhLmMuYnIgPSBrOwogICAgICAgICAgICAgICAgICAgIGEuYy5icyA9IGs7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJ0ID0gazsKICAgICAgICAgICAgICAgICAgICBhLmMuYnUgPSBrOwogICAgICAgICAgICAgICAgICAgIGEuYy5idiA9IGs7CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmFtKCkuaXNJbkFwcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5tICYmIGEubS5hKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5idyB8fCBlIHx8IGEuYy5ieCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmJ3IHx8IGUgfHwgYS5jLmJ4KCksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmEuY28oYiwgWyckc2YnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBiLmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gaCAmJiBoLmdlb207CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3InCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYgYiB0IGwgciBoIHcgeGl2IHlpdicuc3BsaXQoJyAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBjLCBkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgYiAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYiA9IGIoKSkgJiYgYi53aW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmZvckVhY2goYi53aW4sIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiAoJ251bWJlcicgPT09IHR5cGVvZiBhIHx8ICdzdHJpbmcnID09PSB0eXBlb2YgYSkgJiYgMCAhPT0gcGFyc2VGbG9hdChhLCAxMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPSAhMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIucGFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGggPSAwLCBsID0gZS5sZW5ndGg7IGggPCBsOyBoKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gZVtoXVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMSwgZiA9IGVbaF0ubGVuZ3RoOyBnIDwgZjsgZysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiW2NdW2VbaF1bZ11dKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLCBjLCBkLCBnOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuYnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gISghZyAmJiAhZS4kc2YpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnICYmIGEuYy5xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyAyMCA+IGYgJiYgIWc7IGYrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IGEuZy5iKGMuYm9keSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSAhPT0geCAmJiAheCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKGUgPSBhLmEuYmUoeCkpICYmIGUuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnIHx8IGIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkIHx8IGcgfHwgZS4kc2Y7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5ieiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuYnkoKSAmJiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuY2EgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGcgJiYgYS5jLmJ5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jYiA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuYy5jYyA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuYy5jZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgYS5jLmJ6ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuYnooKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZigpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmNhKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuYnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5ieSgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmNlKCkgPyAhMSA6IGEuYS5jbyhiLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ic2VydmVJbnRlcnNlY3Rpb24nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSA9IHdpbmRvdywgYyA9IGRvY3VtZW50LCBkID0gYihlKSwgZyA9ICEoIWQgJiYgIWUuY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCAmJiBhLmMucSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSAwOyAyMCA+IGYgJiYgIWQ7IGYrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhLmcuYihjLmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSAhPT0gYyAmJiAhYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChlID0gYS5hLmJlKGMpKSAmJiBlLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkIHx8IGIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGcgfHwgZCB8fCBlLmNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jZyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vbGVhbicgPT09IHR5cGVvZiBhICYmIChkID0gYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY2YgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5jZigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBnKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuY2goKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmNnKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY2kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5hLmRrKCdjb250ZXh0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGEuYS5jbyhiLCBbJ29ic2VydmVJbnRlcnNlY3Rpb24nXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5kaygnQU1QX0NPTlRFWFRfREFUQScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmNvKGIsIFsnaW5pdGlhbEludGVyc2VjdGlvbiddKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiLCBlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIgPSBhLmEuY28oZSwgWydhbWF6b25tb2JpbGVhZHN2aWV3YWJsZWJyaWRnZSddKSkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lciAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYi5nZXRWZXJzaW9uID8gITAgOiBiID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBjID0gZG9jdW1lbnQsIGQgPSB3aW5kb3csIGcgPSBlKGQpLCBmID0gYiAmJiAxLjEgPD0gYi5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyAmJiBhLmMucSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyAyMCA+IHggJiYgIWc7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhLmcuYihjLmJvZHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSAhPT0gYyAmJiAhYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChkID0gYS5hLmJlKGMpKSAmJiBkLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnIHx8IGUoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGYgfHwgYiAmJiAxLjEgPD0gYi5nZXRWZXJzaW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jaiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnICYmIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuY2wgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmNtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY2ogPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5jaigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuY2soKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmNsKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY20gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5jbSgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmNuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmNrKCkgJiYgYS5jLmNsKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMubyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmNvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuYy5lLCBjID0gYS5hLmJxKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmUubmF2aWdhdG9yLnN0YW5kYWxvbmUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlLmlubmVyV2lkdGggLyBjLncsIGUgPSBlLmlubmVySGVpZ2h0IC8gYy5oLCBkID0gIWlzTmFOKGQpICYmIGlzRmluaXRlKGQpICYmIDAuOSA8PSBkICYmIDEuMSA+PSBkLCBlID0gIWlzTmFOKGUpICYmIGlzRmluaXRlKGUpICYmIDAuNzUgPD0gZSAmJiAxLjEgPj0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gZCAmJiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmUuTW9hdE1BSyA/IGEuYy5lLk1vYXRNQUsubmFtZXNwYWNlICYmIChiID0gITEpIDogKGQgPSBhLmMuZSkgJiYgZC5pbXJhaWQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQuaW1yYWlkLmdldFZlbmRvck5hbWUgJiYgJ2lubW9iaScgPT09IGQuaW1yYWlkLmdldFZlbmRvck5hbWUoKSAmJiAoYiA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmMuY3AgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5jLmFtKCkuaXNJbkFwcCA/IDAgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jZSgpID8gYiA9IDMgOiBhLmMuY3EoKSAmJiAoYiA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jcSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuY28oKSwgZSA9IGEuYS5hbygpLCBjID0gYS5jLmJvKCksIGQgPSB3aW5kb3cubG9jYXRpb24gJiYgKCdhcHBsZXdlYmRhdGE6JyA9PT0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sIHx8ICdkYXRhOicgPT09IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnLScgPT09IGUgfHwgJycgPT09IGUucmVwbGFjZSgvXlxzK3xccyskL2dtLCAnJykgfHwgYyB8fCBkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiB8fCBhLmEuYmwoYS5jLmJjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5hcChhLmMuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuY3IoYikgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmNyID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGMsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT0gYi5pbmRleE9mKGEpIHx8IDAgPT0gYi5pbmRleE9mKCdodHRwczovLycgKyBhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSAhMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLmEucSgpIHx8IGEuYS5vKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiA9IGEuYy5jcygpIHx8IGUgJiYgYS5jLmJnKCkgfHwgYS5jLmJpKCkgPyAhMCA6IGEuYy5jcSgpID8gITEgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmMuY3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuZS53ZWJraXQgJiYgYS5jLmUud2Via2l0Lm1lc3NhZ2VIYW5kbGVycyAmJiBhLmMuZS53ZWJraXQubWVzc2FnZUhhbmRsZXJzLl9fel9tb2F0X2JyaWRnZV9fOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY3UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jdiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm4gJiYgYS5uLmEoYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY3cgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5jeCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmN5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuY3ogPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5jeSgpIHx8IGEuYy5jeigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmMgfHwgYS5jLmNjID8gYiA9IGIgfHwgYS5jLmNjIHx8IGEuYy5jcSgpIHx8IGEuYy5icigpIHx8IGEuYy5jbigpIDogYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5wcm90b2NvbCA9IGEuYS5jZSgpOwogICAgICAgICAgICAgICAgICAgIGEuYy5kYiA9IGEuYS5sKCk7CiAgICAgICAgICAgICAgICAgICAgYS5jLmRjID0gIWEuYy5jOwogICAgICAgICAgICAgICAgICAgIGEuYy5kZCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwgd2luZG93OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmMuYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IDIwID4gYyAmJiBiICE9IHdpbmRvdy50b3A7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuYyB8fCBhLmEuYWIoKSB8fCAxID09IGEuYy5kZChhLmcuYSgpKSA/IGEuYy5kZSA9IDEgOiBhLmMuZGUgPSAwOwogICAgICAgICAgICAgICAgICAgIGEuYy5lW2EuYy5heV0gfHwgKGEuYy5lW2EuYy5heV0gPSBuZXcgYS5jLmUuT2JqZWN0KCkpOwogICAgICAgICAgICAgICAgICAgIGEuYy5hbSgpLmlzSW5BcHAgJiYgYS5jLmMgJiYgKGEuYy5jID0gYS5jLmRhKCkgfHwgYS5jLmNlKCkpOwogICAgICAgICAgICAgICAgICAgIGEuYy5kZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmRnID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuZCA9IGEuYy5lLmRvY3VtZW50LnJlZmVycmVyIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5kaCA9IGEuYy5lLmhpc3RvcnkgJiYgYS5jLmUuaGlzdG9yeS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoaCkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmMuZGkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCLmhhc093blByb3BlcnR5KGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kaiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIgJiYgYi5wYXJlbnROb2RlICYmIGIucGFyZW50Tm9kZS5jaGlsZE5vZGVzLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5heChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdESVYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSUZSQU1FJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0EnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRU1CRUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT0JKRUNUJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGIubm9kZU5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSBpbiBCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEIuaGFzT3duUHJvcGVydHkoYSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IEJbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5hYSAmJiBiLmFhW0RdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5hbSgpLmlzSW5BcHAgPyBhLmMuY3EoKSA/IGEuYy5jIDogYS5jLmRhKCkgOiBhLmMuYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5ieCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5kbSAmJiBhLmMuZG0oKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5jYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuY1snZG8nXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5ieSAmJiBhLmMuYnkoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYy5jZyAmJiBhLmMuY2coKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kcSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubSAmJiBhLm0uYSgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmRyID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5vICYmIGEuby5hICYmIChiICYmIGIucGVyaXNjb3BlTWFuYWdlciA/IGIucGVyaXNjb3BlTWFuYWdlci5tZWFzdXJhYmxlICYmIChlID0gITApIDogZSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuZHMgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmRxKCkgfHwgYS5jLmRyKGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmR0ID0gZnVuY3Rpb24gKGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFiIHx8IGIgJiYgYi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpIHx8IGEuZC5jKCkgJiYgIWUgPyAhMSA6IGEuYy5kbCgpIHx8IGEuYy5kdSgpIHx8IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kdiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYiB8fCBiICYmIGIuaXNNZWFzdXJhYmlsaXR5RGlzYWJsZWQoKSB8fCBhLmQuYygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLm0gJiYgYS5tLmEoKSA/IGUgPSAhMCA6IGEubyAmJiBhLm8uYSAmJiBiLnBlcmlzY29wZU1hbmFnZXIgJiYgYi5wZXJpc2NvcGVNYW5hZ2VyLmZ1bGx5TWVhc3VyYWJsZSAmJiBiLmFvICYmIDEgIT0gYi5hby5za2luICYmIChlID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmRsKCkgfHwgYS5jLmR1KCkgfHwgZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5kdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmJrID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5ibCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuYm0gPSAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5keCA9ICEwOwogICAgICAgICAgICAgICAgICAgIGEuYy5keSA9ICEwOwogICAgICAgICAgICAgICAgICAgICdtbGIuY29tJyA9PT0gYS5hLmFvKCkgJiYgKGEuYS5iaigpIHx8IGEuYS5iaygpKSAmJiAoYS5jLmR5ID0gITEpOwogICAgICAgICAgICAgICAgICAgIGEuYy5keiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmVhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmMuY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmViID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuZWMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5lZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuYmM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9IGIgJiYgYi5tYXRjaCgvRmlyZWZveFwvKFswLTldKylcLi8pKSA/IHBhcnNlSW50KGJbMV0sIDEwKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmJ3ID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5jLmVlID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5jLmEgPSBuZXcgYS5jLmUuSW1hZ2UoKTsKICAgICAgICAgICAgICAgICAgICBhLmMuayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgYS5jLmVbJ01vYXQjRVZBJ10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhLmMuZS5ldmFsICYmIChhLmMuZS5ldmFsKCcoZnVuY3Rpb24od2luKXsgd2luW1wnTW9hdCNFVkFcJ10gPSB0cnVlOyB9KSh3aW5kb3cpJyksICd1bmRlZmluZWQnICE9PSB0eXBlb2YgYS5jLmVbJ01vYXQjRVZBJ10pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYikgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5sID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYS5GdW5jdGlvbignJyksICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5lZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24gJiYgbmF2aWdhdG9yLmFwcFZlcnNpb24ubWF0Y2goL1dpbmRvd3MgTlQgKFxkXGR7MCwxfVwuXGQpLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID8gcGFyc2VGbG9hdChhWzFdKSA6IC0xOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmVnID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNi4xID09PSBhLmMuZWYoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5laCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIubmF2aWdhdG9yICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBiLm5hdmlnYXRvci5nZXRCYXR0ZXJ5OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5jLmR1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuZWkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5laiA9IGEuYS5icigpOwogICAgICAgICAgICAgICAgICAgIGEuYy5layA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiID0gKGIgPSBhLmMuZWopIHx8IGEuYS5icygpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiAnYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAnYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjOiAnYycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiAnZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmOiAnZicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6ICd3YWl0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI6ICdub0hpc3REYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM6ICdkYXRhQXZhaWxhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ6ICdzbG90V2FpdGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAnc2xvdE5vSGlzdERhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZjogJ3Nsb3ROb1Nsb3REYXRhJwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYy5lbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbYV0gPSBlW2JdOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZSwgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbYV0gPSBhOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgIGEuYy5lbSA9IGU7CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYSwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgaW4gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhc093blByb3BlcnR5KGMpICYmIGIuY2FsbChudWxsLCBhW2NdLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGEsIGZ1bmN0aW9uIChhLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhID0gZlthXTsKICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiBhLnhhLnNvZGUgfHwgKGEueGEuc29kZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54ZmdmID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hpbmdfID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhrY2QgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWR3cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnhhLnNvZGUucHJvdG90eXBlLnV4aW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGcubWF4KDQsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKDEgKyBnLnJhbmRvbSgpKSAqIGcucG93KDE2LCBhKSB8IDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoNCkgKyAnLScgKyBhKDQpICsgJy0nICsgYSg0KSArICctJyArIGEoNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KCksIGEueGEuc29kZS5wcm90b3R5cGUueHN6YSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3dbYV0gfHwgKHRoaXMuZGVzd1thXSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3dbYV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEueGEuc29kZS5wcm90b3R5cGUuZXNnZiA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hpbmdfID8gdGhpcy54ZmdmLnB1c2goYXJndW1lbnRzKSA6IHRoaXMuemF4cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnhhLnNvZGUucHJvdG90eXBlLmtzd2EgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IHRoaXMueGtjZFthXSB8fCBbXSwgZCA9IGMgJiYgYy5sZW5ndGgsIGcgPSAwOyBnIDwgZDsgZysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjW2ddID09PSBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnB1c2goYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueGtjZFthXSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEueGEuc29kZS5wcm90b3R5cGUuYWtzdyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMueGtjZFthXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gdGhpcy54a2NkW2FdLCBkID0gLTEsIGcgPSBjICYmIGMubGVuZ3RoLCBmID0gMDsgZiA8IGc7IGYrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY1tmXSA9PT0gYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT0gZCAmJiBjLnNwbGljZShkLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueGtjZFthXSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEueGEuc29kZS5wcm90b3R5cGUuX2dldEV2ZW50UHJpb3JpdGllc18gPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueGtjZFthXSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS54YS5zb2RlLnByb3RvdHlwZS5henN4ID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBjLmlkIHx8IHRoaXMudXhpbigpLCBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGMucHJpb3JpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gIWlzTmFOKGcpICYmIGlzRmluaXRlKGcpID8gcGFyc2VJbnQoZywgMTApIDogMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gdGhpcy54c3phKGEpLCBrID0gMDsgZltkXSAmJiAhYy5pZCAmJiAxMCA+IGs7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKywgZCA9IHRoaXMudXhpbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZltnXSB8fCAoZltnXSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua3N3YShhLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucHJpb3JpdHkgPSBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZltnXVtkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYjogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEueGEuc29kZS5wcm90b3R5cGUuemF4cyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVzd1thXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hpbmdfID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gdGhpcy5lZHdzLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgZCA9IHRoaXMuX2dldEV2ZW50UHJpb3JpdGllc18oYSkuc2xpY2UoMCksIGcgPSAwLCBmID0gZC5sZW5ndGg7IGcgPCBmOyBnKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IHRoaXMuZGVzd1thXVtkW2ddXSwgeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHggaW4gaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuaGFzT3duUHJvcGVydHkoeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ga1t4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IG4ub3B0aW9ucyAmJiBuLm9wdGlvbnMuaW5jbHVkZUlkID8gW3hdLmNvbmNhdChjKSA6IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuLm9wdGlvbnMgfHwgIW4ub3B0aW9ucy5jb25kaXRpb24gfHwgbi5vcHRpb25zLmNvbmRpdGlvbiAmJiBuLm9wdGlvbnMuY29uZGl0aW9uLmFwcGx5KG51bGwsIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLm9wdGlvbnMgJiYgbi5vcHRpb25zLm9uY2UgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBuLm9wdGlvbnMucHJpb3JpdHkgJiYgdGhpcy5zeGF6KGEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IG4ub3B0aW9ucy5wcmlvcml0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5jYi5hcHBseShudWxsLCBtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoaW5nXyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgMCA8IHRoaXMueGZnZi5sZW5ndGggJiYgNTAwID4gYzsgYysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuemF4cy5hcHBseSh0aGlzLCB0aGlzLnhmZ2YucG9wKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBhLnhhLnNvZGUucHJvdG90eXBlLnN3YXEgPSBmdW5jdGlvbiAoYSwgYywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3dbYV0gJiYgdGhpcy5kZXN3W2FdW2RdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlc3dbYV1bZF1bY10sIGcgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gYih0aGlzLmRlc3dbYV1bZF0pLmxlbmd0aCAmJiB0aGlzLmFrc3coYSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYS54YS5zb2RlLnByb3RvdHlwZS5zeGF6ID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYiB8fCAnb2JqZWN0JyAhPSB0eXBlb2YgYiB8fCAhdGhpcy5kZXN3W2FdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmlkICYmIHZvaWQgMCAhPT0gYi5wcmlvcml0eSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zd2FxKGEsIGIuaWQsIGIucHJpb3JpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuaWQgfHwgYi5jYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gdGhpcy5fZ2V0RXZlbnRQcmlvcml0aWVzXyhhKSwgZCA9IDAsIGcgPSBjLmxlbmd0aDsgZCA8IGc7IGQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGNbZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmlkICYmIGIuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3dbYV1bZl1bYi5pZF0gJiYgdGhpcy5kZXN3W2FdW2ZdW2IuaWRdLmNiID09IGIuY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3dhcShhLCBiLmlkLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiLmlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXN3W2FdW2ZdW2IuaWRdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN3YXEoYSwgYi5pZCwgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLmRlc3dbYV1bZl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVzd1thXVtmXVtrXSAmJiB0aGlzLmRlc3dbYV1bZl1ba10uY2IgPT0gYi5jYWxsYmFjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3dhcShhLCBrLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEueGEuc29kZS5wcm90b3R5cGUudWdpbiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlc3dbYV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRlc3dbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN3ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmsgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmsuYiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQueGEuc29kZSB8fCAoZC54YiA9PSB3aW5kb3cgPyBrKGEuYy5hdywgd2luZG93LCB3KSA6IGEuYS5kaihrLCAnXCcnICsgYS5jLmF3ICsgJ1wnLHdpbmRvdywgTWF0aCcsIGQueGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEgPSBuZXcgZC54YS5zb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhhLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBlLnhiLk1hdGgucG93LCBjID0gZS54Yi5NYXRoLnJhbmRvbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAoMCwgZS54Yi5NYXRoLm1heCkoNCwgYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgxICsgYygpKSAqIGIoMTYsIGEpIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygwLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSB8fCAnc3RyaW5nJyAhPT0gdHlwZW9mIGIgfHwgIWFbYl0gfHwgYSA9PSB3aW5kb3cpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgYS5ub2RlTmFtZSAmJiAoJ09CSkVDVCcgPT09IGEubm9kZU5hbWUgfHwgJ0VNQkVEJyA9PT0gYS5ub2RlTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keVtiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlICE9PSBhW2JdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmW2FdID0gZlthXSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6czogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6cjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlmOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YToge30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YjogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5ZHM6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZlthXSwgaCA9IHt9LCBsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLmRvd2cgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAoZS54eWRzIHx8IChlLnh5ZHMgPSB7fSksIGUgJiYgZS54eWRzICYmIChlLnh5ZHNbYl0gPyBlLnh5ZHNbYl0ucHVzaChhKSA6IGUueHlkc1tiXSA9IFthXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLmhzeGsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmRjc3ggJiYgZS5kY3N4LmRjd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgYSAmJiBhICYmIGUueGMuZXNkZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS54Yy5leGRlKGUueGMuaHN4aywgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGUueGMuZXNkZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgJiYgd2luZG93LmNsZWFyVGltZW91dCAmJiB3aW5kb3cuY2xlYXJUaW1lb3V0KGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLnluZHMgPSBmdW5jdGlvbiAoYSwgZSwgZCwgZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYsIG4sIG0gPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0b3VjaHN0YXJ0JyA9PT0gZSAmJiBsICYmIChtID0geyBwYXNzaXZlOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPyBoW2UgKyBnXSA/IGQgPSBoW2UgKyBnXSA6IChkID0gYyhkKSwgaFtlICsgZ10gPSBkKSA6IGQgPSBjKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWRkRXZlbnRMaXN0ZW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gJ2FkZEV2ZW50TGlzdGVuZXInLCBmID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLmF0dGFjaEV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAnYXR0YWNoRXZlbnQnLCBmID0gJ29uJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA9IGIoYSwgZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5jYWxsKGEsIGYgKyBlLCBkLCBtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbZ10oZiArIGUsIGQsIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEgJiYgZyAmJiBhW2ddKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbZ10oZiArIGUsIGQsIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZS54Yy5lbmduID0gZnVuY3Rpb24gKGEsIGUsIGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnLCBmID0gZSArIGQsIGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBoW2ZdLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAhMSAhPT0gZCA/IGhbZl0gOiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBnID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLmRldGFjaEV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAnZGV0YWNoRXZlbnQnLCBnID0gJ29uJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlIGhbZl0sICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgPSBiKGEsIGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwuY2FsbChhLCBnICsgZSwgYywgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtkXShnICsgZSwgYywgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2RdKGcgKyBlLCBjLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBoW2ZdOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLmV4ZGUgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGMoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyAmJiB3aW5kb3cuc2V0VGltZW91dCAmJiAoZSA9IHdpbmRvdy5zZXRUaW1lb3V0KGEsIGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLmV4YWUgPSBmdW5jdGlvbiAoYSwgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGx5KGUgfHwgbnVsbCwgYS5jb25jYXQoYS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGUueGMudXhpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKDQpICsgJy0nICsgZyg0KSArICctJyArIGcoNCkgKyAnLScgKyBnKDQpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBlLnhjLnR3ZXIgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAoZS55ZiB8fCAoZS55ZiA9IHt9KSwgZSAmJiBlLnlmICYmIChlLnlmW2JdID8gZS55ZltiXS5wdXNoKGEpIDogZS55ZltiXSA9IFthXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLnAgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnAuYSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5wLmIoZCksIGcgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZiB8fCAoZiA9IGEucC5jKGQpLCBnID0gITAsIGYueGMuZXhkZShmLnhjLmhzeGssIDEwMDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93W2EuYy5hd10gPSBmOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYihmKTsKICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiAoZi5zd2RlID0gbmV3IGYueGEuc29kZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRLaWxsZWQnLCBhLnAuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5wLmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5pID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5wLmYoYS5jLmF4LmEsIGEuYy5heik7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnN4YXooJ2FkS2lsbGVkJywgeyBjYWxsYmFjazogYS5wLmQgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEucC5nKHIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5wLmQgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHIueWZbYS5jLmF4LmFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5hLmluZGV4T2YoZiwgZC55Zyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIDwgZyAmJiBmLnNwbGljZShnLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnAuZyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5wLmggPSBmdW5jdGlvbiAoZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGEucC5iKGEuYy5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiBnLnhjLnR3ZXIoZCwgZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnAuaSA9IGZ1bmN0aW9uIChkLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5wLmIoYS5jLmUpOwogICAgICAgICAgICAgICAgICAgICAgICBnICYmIGcueGMuZG93ZyhmLCBkKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEucC5mID0gZnVuY3Rpb24gKGQsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSByLnh5ZHNbZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuYS5pbmRleE9mKGcsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPCBjICYmIGcuc3BsaWNlKGMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnAuZyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnAuYyA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPT0gd2luZG93ID8gayhhLmMuYXcsIHdpbmRvdykgOiBhLmEuZGooaywgJ1wnJyArIGEuYy5hdyArICdcJyx3aW5kb3cnLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEucC5iKGQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5wLmIgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPSBkIHx8IGEuYy5lLCBkW2EuYy5hd107CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnAuaiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQgfHwgYS5jLmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmMuYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgUmVnRXhwKCdeJyArIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGQsIGZ1bmN0aW9uIChhLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPCBlLnNlYXJjaChjKSAmJiBhICYmICdudW1iZXInID09PSB0eXBlb2YgYS56ciAmJiBmLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEucC5rID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZCB8fCBhLmMuZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkID8gKGYgPSBhLnAuaihkKSkgPyAwIDwgZi5sZW5ndGggPyAhMCA6ICExIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnAubCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5wLmIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiAoZi5pW2RdID0gITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIHZhciByID0gdS5wLmEodS5jLmUpLCBrYSA9IHUuYy5jLCBVID0gdS5hLmwoKSwgUiA9IHUuYy5iaiwgd2EgPSB1LmMuZTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYSwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGZbYV07CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgYy54YS50eGFlIHx8IChjLnhhLnR4YWUgPSBmdW5jdGlvbiAoYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zeGRjID0gYy54Yy51eGluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNkeHMgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN3ZGUgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnhhLnR4YWUucHJvdG90eXBlLndzZWQgPSBmdW5jdGlvbiAoYSwgZSwgZCwgZywgZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddIHx8ICh0aGlzLnhzY2RbZ10gPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnhzY2RbZ10uZXZ0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueHNjZFtnXS50YXJnZXQgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddLnBlcmlvZGljID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBjLnhjLmV4YWUoW3RoaXNdLCBmdW5jdGlvbiAoaywgeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMueGMuZW5nbihhLCBlLCBudWxsLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay54c2NkW2ddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsueHNjZFtnXS50aWQgJiYgYy54Yy5lc2RlKGsueHNjZFtnXS50aWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnhzY2RbZ10udGlkID0gYy54Yy5leGRlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsueHNjZFtnXS50aWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy54Yy55bmRzKGEsIGUsIHQsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuc3dkZS56YXhzKGQsIHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMueGMueW5kcyhhLCBlLCB0LCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy54YS50eGFlLnByb3RvdHlwZS53c3FhID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueHNjZFthXSAmJiAoYy54Yy5lc2RlKHRoaXMueHNjZFthXS50aWQpLCBjLnhjLmVuZ24odGhpcy54c2NkW2FdLnRhcmdldCwgdGhpcy54c2NkW2FdLmV2dCwgbnVsbCwgYSksIGRlbGV0ZSB0aGlzLnhzY2RbYV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnhhLnR4YWUucHJvdG90eXBlLnFhd3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZWQodGhpcy5jZHhzLCAnc2Nyb2xsJywgJ3Njcm9sbCcsICdnbG9iYWxTY3JvbGxldmVudCcgKyB0aGlzLnN4ZGMsIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0aGlzLmNkeHMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2VkKGEsICdtb3VzZWRvd24nLCAnbW91c2VFdmVudCcsICdnbG9iYWxNb3VzZURvd24nICsgdGhpcy5zeGRjLCAxMDAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud3NlZChhLCAnbW91c2VvdmVyJywgJ21vdXNlRXZlbnQnLCAnZ2xvYmFsTW91c2VPdmVyJyArIHRoaXMuc3hkYywgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZWQoYSwgJ21vdXNlbW92ZScsICdtb3VzZUV2ZW50JywgJ2dsb2JhbE1vdXNlTW92ZScgKyB0aGlzLnN4ZGMsIDUwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2VkKHRoaXMuY2R4cywgJ21vdXNld2hlZWwnLCAnbW91c2VFdmVudCcsICdnbG9iYWxNb3VzZVdoZWVsJyArIHRoaXMuc3hkYywgNTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZWQodGhpcy5jZHhzLCAnRE9NTW91c2VTY3JvbGwnLCAnbW91c2VFdmVudCcsICdnbG9iYWxNb3VzZVNjcm9sbCcgKyB0aGlzLnN4ZGMsIDUwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53c2VkKGEsICd0b3VjaHN0YXJ0JywgJ21vdXNlRXZlbnQnLCAnZ2xvYmFsVG91Y2hTdGFydEV2ZW50JyArIHRoaXMuc3hkYywgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndzZWQoYSwgJ2tleWRvd24nLCAna2V5Ym9hcmRFdmVudCcsICdnbG9iYWxLZXlib2FyZEV2ZW50JyArIHRoaXMuc3hkYywgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMueGEudHhhZS5wcm90b3R5cGUuYXFzdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgaW4gdGhpcy54c2NkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5nbih7IGxpc3RlbmVyTmFtZTogYSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy54YS50eGFlLnByb3RvdHlwZS55bmRzID0gZnVuY3Rpb24gKGEsIGUsIGQsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy54c2NkW2ddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddLmV2dCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddLnRhcmdldCA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2ddLnB1Ymxpc2hFdnQgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjLnhjLmV4YWUoW3RoaXNdLCBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnhzY2RbZ10gJiYgYS5zd2RlLnpheHMoZCwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy54Yy55bmRzKGEsIGUsIGYsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnhhLnR4YWUucHJvdG90eXBlLmVuZ24gPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS54c2NkW2JdLnBlcmlvZGljID8gYS53c3FhKGIpIDogKGMueGMuZW5nbihhLnhzY2RbYl0udGFyZ2V0LCBhLnhzY2RbYl0uZXZ0LCBudWxsLCBiKSwgZGVsZXRlIGEueHNjZFtiXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudGFyZ2V0ICYmIGEuZXZ0LCBnID0gYS50YXJnZXQgJiYgIWEuZXZ0LCBmID0gYS5hbGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5saXN0ZW5lck5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy54c2NkW2EubGlzdGVuZXJOYW1lXSAmJiBlKHRoaXMsIGEubGlzdGVuZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiB0aGlzLnhzY2QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkID0gdGhpcy54c2NkW3RdKSAmJiBkLmV2dCA9PSBhLmV2dCAmJiBkLnRhcmdldCA9PSBhLnRhcmdldCAmJiBlKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHQgaW4gdGhpcy54c2NkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA9IHRoaXMueHNjZFt0XSkgJiYgZC50YXJnZXQgPT0gYS50YXJnZXQgJiYgZSh0aGlzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0IGluIHRoaXMueHNjZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQgPSB0aGlzLnhzY2RbdF0pICYmIGUodGhpcywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGMueGEudHhhZS5wcm90b3R5cGUua2RtdyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnN3ZGUuZXNnZihhLnB1Ymxpc2hFdnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBjLnhhLnR4YWUucHJvdG90eXBlLmRjd24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHRoaXMueHNjZCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSBpbiBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmxvYWQnID09PSBjLmV2dCAmJiBjLnRhcmdldCAmJiBjLnRhcmdldC5jbG9zZWQgJiYgdGhpcy5rZG13KGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5xID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5xLmEgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkICYmIChkLnhhLnR4YWUgfHwgKGQueGIgPT0gd2luZG93ID8gayhhLmMuYXcsIHdpbmRvdywgdykgOiBhLmEuZGooaywgJ1wnJyArIGEuYy5hdyArICdcJyx3aW5kb3csIE1hdGgnLCBkLnhiKSksIGQuenMgfHwgKGQuZGNzeCA9IG5ldyBkLnhhLnR4YWUoYS5jLmUsIGQuc3dkZSksIGQuenMgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnbW9kdWxlc1JlYWR5JywgYS5xLmEsIHsgb25jZTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnc3RhcnRBZFRyYWNraW5nJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgciAmJiByLnpzICYmICFyLnh6ICYmIChyLmRjc3ggPyAoci54eiA9ICEwLCByLmRjc3gucWF3cygpKSA6IGEucS5hKHIpLCBhLmZvY3VzLnNldEZvY3VzTGlzdGVuZXJzKCkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGEsIGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5JUjUuTUlOW2VdID0gdy5taW4oYiwgYS5JUjUuTUlOW2VdKSB8fCBiIHx8IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuSVI1Lk1BWFtlXSA9IHcubWF4KGIsIGEuSVI1Lk1BWFtlXSkgfHwgYjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHIuc3dkZS5henN4KCdmb2N1c1N0YXRlQ2hhbmdlJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0geyB0eXBlOiAnYmx1cicgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgfHwgKGEuci5nKGMsIGIpLCBhLnIuaChjLCBiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3dkZS5zeGF6KCdmb2N1c1N0YXRlQ2hhbmdlJywgeyBpZDogZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuenIgPT0gYS56cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYmUgPSB3Lm1heCgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGIuYmUgPyBiLmJlIDogMCwgYSAtIGIuYmYpOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGIuYnkgJiYgNTAwIDw9IGIuYmUgJiYgKGIuYnkgPSBiLmJrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYXogPT09IGEuci5hLmQuYSA/IGIuYXogPSBhLnIuYS5kLmIgOiBiLmF6ID09PSBhLnIuYS5kLmIgJiYgKGIuYXogPSBhLnIuYS5kLmEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYi5iYSA9PT0gYS5yLmEuZC5hID8gYi5iYSA9IGEuci5hLmQuYiA6IGIuYmEgPT09IGEuci5hLmQuYiAmJiAoYi5iYSA9IGEuci5hLmQuYSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYikgewogICAgICAgICAgICAgICAgICAgICAgICBiLmF4ID09PSBhLnIuYS5iLmEgPyBiLmF4ID0gYS5yLmEuYi5iIDogYi5heCA9PT0gYS5yLmEuYi5iICYmIChiLmF4ID0gYS5yLmEuYi5hKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYXkgPT09IGEuci5hLmMuYSA/IGIuYXkgPSBhLnIuYS5jLmIgOiBiLmF5ID09PSBhLnIuYS5jLmIgJiYgKGIuYXkgPSBhLnIuYS5jLmEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiLmJrICYmIChiLmJrID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYmsgKz0gYSAtIGIuYm87CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYm8gPSBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiLmJsICYmIChiLmJsID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYmwgKz0gYSAtIGIuYnA7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYnAgPSBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBiLmJnICYmIChiLmJnID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09PSB0eXBlb2YgYi5iYyAmJiAoYi5iYyA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICBiLmJ1ID0gYSAtIGIuYnM7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYnUgPiBiLmJjICYmIChiLmJjID0gYi5idSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYmcgKz0gYSAtIGIuYnE7CiAgICAgICAgICAgICAgICAgICAgICAgIDUwMCA8PSBiLmJjICYmICd1bmRlZmluZWQnID09PSB0eXBlb2YgYi5idyAmJiAoYi5iayArPSBhIC0gYi5ibywgYi5idyA9IGIuYmspOwogICAgICAgICAgICAgICAgICAgICAgICBiLmJxID0gYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09PSB0eXBlb2YgYi5iaCAmJiAoYi5iaCA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGIuYmQgJiYgKGIuYmQgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5idiA9IGEgLSBiLmJ0OwogICAgICAgICAgICAgICAgICAgICAgICBiLmJ2ID4gYi5iZCAmJiAoYi5iZCA9IGIuYnYpOwogICAgICAgICAgICAgICAgICAgICAgICBiLmJoICs9IGEgLSBiLmJyOwogICAgICAgICAgICAgICAgICAgICAgICA1MDAgPD0gYi5iZCAmJiAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGIuYnggJiYgKGIuYmwgKz0gYSAtIGIuYnAsIGIuYnggPSBiLmJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5iciA9IGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuciA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBxID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5yLmEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5hID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuYS5hID0gMDsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5hLmIgPSAxOwogICAgICAgICAgICAgICAgICAgIGEuci5hLmIgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5iLmEgPSAwOwogICAgICAgICAgICAgICAgICAgIGEuci5hLmIuYiA9IDE7CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuci5hLmMuYSA9IDA7CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuYy5iID0gMTsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5kID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuZC5hID0gMDsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5kLmIgPSAxOwogICAgICAgICAgICAgICAgICAgIGEuci5hLmUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5lLmEgPSAwOwogICAgICAgICAgICAgICAgICAgIGEuci5hLmUuYiA9IDE7CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuZiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuci5hLmYuYSA9IDA7CiAgICAgICAgICAgICAgICAgICAgYS5yLmEuZi5iID0gMTsKICAgICAgICAgICAgICAgICAgICBhLnIuYS5mLmMgPSAyOwogICAgICAgICAgICAgICAgICAgIGEuci5iID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgayhhLCBhLmFqLCAneCcpOwogICAgICAgICAgICAgICAgICAgICAgICBrKGEsIGEuYWssICd5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuSVI1LkFSRUEgPSAoYS5JUjUuTUFYLnggLSBhLklSNS5NSU4ueCkgKiAoYS5JUjUuTUFYLnkgLSBhLklSNS5NSU4ueSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnIuYyA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAgPD0gbmV3IEEoKS5nZXRUaW1lKCkgLSByYSAmJiAoYS5yLmQoeyB0eXBlOiAncGFyaycgfSwgYiksIGNsZWFySW50ZXJ2YWwoZCksIGIuYXUgPSBhLnIuYS5hLmEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi5hdTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT09IGEuci5hLmEuYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmEgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5sLmUoZSwgNTApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5hdSA9IGEuci5hLmEuYjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09PSBhLnIuYS5hLmIgJiYgKHJhID0gbmV3IEEoKS5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5yLmUgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAwMCA8PSBuZXcgQSgpLmdldFRpbWUoKSAtIG5hICYmIChhLnIuZih7IHR5cGU6ICdwYXJrJyB9LCBiKSwgY2xlYXJJbnRlcnZhbChkKSwgYi5hdiA9IGEuci5hLmEuYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBiLmF2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gYS5yLmEuYS5hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYSA9IG5ldyBBKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmwuZShlLCA1MCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmF2ID0gYS5yLmEuYS5iOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT09IGEuci5hLmEuYiAmJiAobmEgPSBuZXcgQSgpLmdldFRpbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnIuZyA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICBkKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5heiA9PT0gYS5yLmEuZC5hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21vdXNlb3ZlcicgPT09IGMgfHwgJ21vdXNlbW92ZScgPT09IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ibyA9IG5ldyBBKCkuZ2V0VGltZSgpLCBnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuYXogPT09IGEuci5hLmQuYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vdXNlbW92ZScgPT09IGMgJiYgaChuZXcgQSgpLmdldFRpbWUoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21vdXNlb3V0JyA9PT0gYyB8fCAnYmx1cicgPT09IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaChuZXcgQSgpLmdldFRpbWUoKSwgZSksIGcoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Nvb3BlcicgPT09IGMgJiYgaChuZXcgQSgpLmdldFRpbWUoKSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuci5oID0gZnVuY3Rpb24gKGIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBiLnR5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmJhID09PSBhLnIuYS5kLmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbW91c2VvdmVyJyA9PT0gaCB8fCAnbW91c2Vtb3ZlJyA9PT0gaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJwID0gbmV3IEEoKS5nZXRUaW1lKCksIGMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5iYSA9PT0gYS5yLmEuZC5iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW91c2Vtb3ZlJyA9PT0gaCAmJiBsKG5ldyBBKCkuZ2V0VGltZSgpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbW91c2VvdXQnID09PSBoIHx8ICdibHVyJyA9PT0gaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKG5ldyBBKCkuZ2V0VGltZSgpLCBlKSwgYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY29vcGVyJyA9PT0gaCAmJiBsKG5ldyBBKCkuZ2V0VGltZSgpLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5yLmQgPSBmdW5jdGlvbiAoZSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiAhPSBjLmFuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGUudHlwZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmF4ID09PSBhLnIuYS5iLmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21vdXNlb3ZlcicgPT09IGQgfHwgJ21vdXNlbW92ZScgPT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYnEgPSBuZXcgQSgpLmdldFRpbWUoKSwgYy5icyA9IG5ldyBBKCkuZ2V0VGltZSgpLCBiKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5heCA9PT0gYS5yLmEuYi5iICYmICgnbW91c2Vtb3ZlJyAhPT0gZCAmJiAnbW91c2VvdXQnICE9PSBkIHx8IHAobmV3IEEoKS5nZXRUaW1lKCksIGMpLCAncGFyaycgPT09IGQgJiYgcChuZXcgQSgpLmdldFRpbWUoKSAtIDUwMCwgYyksICdtb3VzZW91dCcgIT09IGQgJiYgJ3BhcmsnICE9PSBkIHx8IGIoYykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnIuZiA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyICE9IGMuYW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYi50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuYXkgPT09IGEuci5hLmMuYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbW91c2VvdmVyJyA9PT0gZCB8fCAnbW91c2Vtb3ZlJyA9PT0gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5iciA9IG5ldyBBKCkuZ2V0VGltZSgpLCBjLmJ0ID0gbmV3IEEoKS5nZXRUaW1lKCksIGUoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmF5ID09PSBhLnIuYS5jLmIgJiYgKCdtb3VzZW1vdmUnICE9PSBkICYmICdtb3VzZW91dCcgIT09IGQgfHwgdChuZXcgQSgpLmdldFRpbWUoKSwgYyksICdwYXJrJyA9PT0gZCAmJiB0KG5ldyBBKCkuZ2V0VGltZSgpIC0gMzAwMCwgYyksICdtb3VzZW91dCcgIT09IGQgJiYgJ3BhcmsnICE9PSBkIHx8IGUoYykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnIuaSA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi50eXBlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5iYiA9PSBhLnIuYS5lLmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbW91c2VvdmVyJyA9PSBjIHx8ICdtb3VzZW1vdmUnID09IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5iZiA9IG5ldyBBKCkuZ2V0VGltZSgpLCBlLmJiID0gYS5yLmEuZS5iOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmIgPT0gYS5yLmEuZS5iICYmICgnbW91c2VvdXQnID09IGMgPyAoZihuZXcgQSgpLmdldFRpbWUoKSwgZSksIGUuYmIgPSBhLnIuYS5lLmEpIDogJ21vdXNlbW92ZScgIT0gYyAmJiAnc2Nvb3BlcicgIT0gYyB8fCBmKG5ldyBBKCkuZ2V0VGltZSgpLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKSB8fCAoYS5rLmEuemF4cygnbm9Mb25nZXJQcmVSZW5kZXJlZCcpLCBhLmwuZChkb2N1bWVudCwgcCwgaywgJ3ByJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIGUgJiYgKGUgPSBhKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBmID0gITEsIGcgPSBhLmMuYmMsIGcgPSAtMSA8IGcuaW5kZXhPZignU2FmYXJpJykgJiYgLTEgPT0gZy5pbmRleE9mKCdDaHJvbWUnKSAmJiAtMSA9PSBnLmluZGV4T2YoJ0Nocm9taXVtJykgJiYgIWEuYS5sKCksIGMgPSBhLmEudCgpICYmICFhLmEubCgpLCBiID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkb2N1bWVudC5oYXNGb2N1cywgZSwgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW46IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVyZW5kZXI6IDIKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbCwgcCwgdCwgcTsKICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGRvY3VtZW50LmhpZGRlbiA/IChsID0gJ2hpZGRlbicsIHAgPSAndmlzaWJpbGl0eWNoYW5nZScpIDogJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkb2N1bWVudC5tb3pIaWRkZW4gPyAobCA9ICdtb3pIaWRkZW4nLCBwID0gJ21venZpc2liaWxpdHljaGFuZ2UnKSA6ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZG9jdW1lbnQubXNIaWRkZW4gPyAobCA9ICdtc0hpZGRlbicsIHAgPSAnbXN2aXNpYmlsaXR5Y2hhbmdlJykgOiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGRvY3VtZW50LndlYmtpdEhpZGRlbiAmJiAobCA9ICd3ZWJraXRIaWRkZW4nLCBwID0gJ3dlYmtpdHZpc2liaWxpdHljaGFuZ2UnKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB5ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW96VicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21zVicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmtpdFYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCB4ID0gMDsgeCA8IHkubGVuZ3RoOyB4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB5W3hdICsgJ2lzaWJpbGl0eVN0YXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgZG9jdW1lbnRbbl0gJiYgbnVsbCAhPT0gZG9jdW1lbnRbbl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcSA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgbDsKICAgICAgICAgICAgICAgICAgICB2YXIgbSwgSTsKICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyBtID0gJ3JlcXVlc3RBbmltYXRpb25GcmFtZScgOiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgKG0gPSAnd2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgSSA9IGcgJiYgJ3N0cmluZycgPT0gdHlwZW9mIG0gJiYgIXE7CiAgICAgICAgICAgICAgICAgICAgdmFyIEcgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBJICYmIGZ1bmN0aW9uIEUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEcgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93W21dKEUpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmZvY3VzLmZvY3VzU3RhcnRUaW1lID0gITE7CiAgICAgICAgICAgICAgICAgICAgdmFyIEogPSByLnN3ZGUuYXpzeCgnZm9jdXNTdGF0ZUNoYW5nZScsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgKGEuZm9jdXMuZm9jdXNTdGFydFRpbWUgPSBuZXcgQSgpLmdldFRpbWUoKSwgci5zd2RlLnN4YXooJ2ZvY3VzU3RhdGVDaGFuZ2UnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogSiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9LCB7IHByaW9yaXR5OiAxIH0pOwogICAgICAgICAgICAgICAgICAgIGEuZm9jdXMuZ2V0Rm9jdXNNZXRob2QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy52aXNpYmlsaXR5Y2hhbmdlID0gcDsKICAgICAgICAgICAgICAgICAgICBhLmZvY3VzLnNldEZvY3VzTGlzdGVuZXJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy5nZXRRdWVyeVN0cmluZyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5lbSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHogJiYgKGEuZW8gPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHQgJiYgKGEuZW4gPSBoW2RvY3VtZW50W3RdXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy5zdXBwb3J0c1BhZ2VWaXNBUEkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy5jaGVja0ZvY3VzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5mb2N1cy5zdXBwb3J0c1BhZ2VWaXNBUEkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKDApLCAhZG9jdW1lbnRbbF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoMSksIDEwMCA+IG5ldyBBKCkuZ2V0VGltZSgpIC0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKDIpLCBkb2N1bWVudC5oYXNGb2N1cygpOwogICAgICAgICAgICAgICAgICAgICAgICBkKDMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB2YXIgQyA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuZm9jdXMucGFnZUlzVmlzaWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmZvY3VzLmNoZWNrRm9jdXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEMgIT0gYiAmJiByICYmIHIuc3dkZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zd2RlLnpheHMoJ2ZvY3VzU3RhdGVDaGFuZ2UnLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMgPSBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy5wYWdlSXNQcmVyZW5kZXJlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgdCA/ICdwcmVyZW5kZXInID09IGRvY3VtZW50W3RdIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhbGxMb2NhbEFkc0tpbGxlZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgYS5mb2N1cy5wYWdlSXNQcmVyZW5kZXJlZCgpICYmIGEubC5jKGRvY3VtZW50LCBwLCBrLCAncHInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IGEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5zID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5zLmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gYS50LmE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudC5iKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZnJhbWVbaWRePVwnZWJCYW5uZXJJRnJhbWVcJ10nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyRbaWR8ZWJCYW5uZXJJRnJhbWVfKFswLTldK19bMC05XSspXS8uLi4vYm9keS8jZXllRGl2L2lmcmFtZVtpZF49XCdlYkFkXCddW2lkKj1cJ3BhbmVsXCddW2lkKj1cJ2lmcmFtZVwnXVtpZCo9XCckMFwnXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZFVubG9hZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VJc0ZvdW5kQWRLbm93bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bldpdGhvdXRFeHBhbmQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIF0sICdTaXptZWsgYmFja3JlZicpOwogICAgICAgICAgICAgICAgICAgICAgICBhLnQuYihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWZyYW1lW2lkXj1cJ2ViQmFubmVySUZyYW1lXCddJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4vYm9keS8jZXllRGl2L2lmcmFtZVtpZF49XCdlYkFkXCddW2lkKj1cJ3BhbmVsXCddW2lkKj1cJ2lmcmFtZVwnXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGFuZFVubG9hZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VJc0ZvdW5kQWRLbm93bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bldpdGhvdXRFeHBhbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXRDb2xsYXBzZVByb3h5SW5Mb29wJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi9ib2R5LyNleWVEaXYnCiAgICAgICAgICAgICAgICAgICAgICAgIF0sICdTaXptZWsgY3VzdG9tJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudC5iKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbaWRePVwnZW52SXBvbGxpXCddW25hbWVePVwnZW52SXBvbGxpXCddJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbaWRePVwnZW52SXBvbGxpXCddW25hbWVePVwnZW52SXBvbGxpXCddLyRbaWR8ZW52SXBvbGxpKFxcZCspXS8uLi4vYm9keS9pZnJhbWVbaWQ9XCdleHBJcG9sbGkkMF9pZnJhbWVcJ10nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydW5XaXRob3V0RXhwYW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kVW5sb2FkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vQ29sbGFwc2VWYWxpZGF0aW9uJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICBdLCAnSXBvbGxpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudC5iKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbaWRePVwnT3JpZ2luUGxhdGZvcm1BZFVuaXRcJ11baWQkPVwnaW5wYWdlXCddJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICckW2lkfE9yaWdpblBsYXRmb3JtQWRVbml0LShcXGQrKS1pbnBhZ2VdLy4uLi4uL1tpZD1cJ09yaWdpblBsYXRmb3JtQWRVbml0LSQwLW92ZXJ0aGVwYWdlXCddJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwYW5kVW5sb2FkcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZUlzRm91bmRBZEtub3duJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVuV2l0aG91dEV4cGFuZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgXSwgJ09yaWdpbiBwbGF0Zm9ybScpOwogICAgICAgICAgICAgICAgICAgICAgICBhLnQuYihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnI2NhY19hZGhlcmUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi4vJFtpZHxjbUFkRnJhbWVfX2NyaXNwLSguKildLy4uLi4uL2lmcmFtZSNjYWNQYW5lbElmcmFtZV9fY3Jpc3AtJDAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VJc0ZvdW5kQWRLbm93bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRFeHBhbmRJbkxvb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXRFeHBhbmRQcm94eUluTG9vcCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmcmFtZS89Pi9kaXZbaWQ9XCdwYW5lbENvbnRhaW5lckRpdlwnXScKICAgICAgICAgICAgICAgICAgICAgICAgXSwgJ2NhY19hZGhlcmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmJ0ICYmIGEuYy5idCgpICYmICdBZE1hcnZlbCcgPT0gYS5jLmJ0KCkgJiYgKGEudC5iKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXYjbm9ybWFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXYjZXhwYW5kZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWydub0luaXRpYWxWYWxpZGF0aW9uJ10KICAgICAgICAgICAgICAgICAgICAgICAgXSwgJ09wZXJhIE1SQUlEIDEnKSwgYS50LmIoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpdiNub3JtYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpdiNyZXNpemVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbm9Jbml0aWFsVmFsaWRhdGlvbiddCiAgICAgICAgICAgICAgICAgICAgICAgIF0sICdPcGVyYSBNUkFJRCAyJykpOwogICAgICAgICAgICAgICAgICAgICAgICBrLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3BpY3RlbGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5kQWQ6IGZ1bmN0aW9uIChkLCBmLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkID0gYS5jLmRiID8gYS51LmEoWydkaXZbaWRePVwncHRlbGFfdW5pdFdyYXBwZXJcJ10nXSwgZClbMF0gOiBhLnUuYShbJ2RpdltpZF49XCdwdGVsYXN3ZmhvbGRlclwnXSddLCBkKVswXSkgJiYgYS5hLmJ0KGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0ZsYXNodGFsa2luZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWRSZTogL2Z0ZGl2XGQrLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkUmU6IC9mdGluXGQrLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZTogL3JlY3RcKChcZCspcHgsPyAoXGQrKXB4LD8gKFxkKylweCw/IChcZCspcHhcKS8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmRBZDogZnVuY3Rpb24gKGQsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEudC5jKGQsIHRoaXMuY29sbGFwc2VkUmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLnQuYyhkLCB0aGlzLmV4cGFuZGVkUmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnQuZFtmXSA9IGEudC5lKGMsIGYsIGcpLCBhLnQuZFtmXS5leHBhbmRlZEVsID0gZCwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkxvb3A6IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAhMSwgZyA9IGQuZXhwYW5kZWRFbC5zdHlsZS5jbGlwLCBnID0gZyAmJiBnLm1hdGNoKHRoaXMuY2xpcFJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCcgPT09IChnICYmIGdbNF0pICYmIChmID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgIWQuZXhwYW5kZWRJc09wZW4gPyBhLnQuZihkLmV4cGFuZGVkRWwsICdkaXYnLCBudWxsLCBkLmFkTnVtKSA6ICFmICYmIGQuZXhwYW5kZWRJc09wZW4gJiYgYS50LmcoZCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZG91YmxlY2xpY2sgc2lkZWtpY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmU6IC8oRElWKV8oXGR7Nn0pXzFfKFxkezEzfSkvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5kQWQ6IGZ1bmN0aW9uIChkLCBmLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPSBhLnQuYyhkLCB0aGlzLnJlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudC5kW2ZdID0gYS50LmUoZCwgZiwgZyksIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEV4cGFuZGVkOiBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID0gYS5pZC5tYXRjaCh0aGlzLnJlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKGFbM10pICsgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGcgPSAwOyBnIDwgZi5sZW5ndGg7IGcrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RJVicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltnXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5qb2luKCdfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdQb2ludHJvbGwgMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZTogL3ByKGZsc2gpKFtBLVowLTldKykvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5kQWQ6IGZ1bmN0aW9uIChkLCBmLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5kYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHdpbmRvdy5wckJucjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgMSA9PT0gYy5ub2RlVHlwZSAmJiBhLmEuYnQoYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZCAmJiBkLmlubmVySFRNTCAmJiBkLmlubmVySFRNTC5tYXRjaCgvcHJhZGkoW0EtWjAtOV0rKS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiID0gYiAmJiBiWzFdKSAmJiBjLmlkICYmIGMuaWQubWF0Y2goYikgJiYgKGQgPSBkLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZicgKyBiKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudC5kW2ZdID0gYS50LmUoYywgZiwgZyksIGEudC5kW2ZdLnVuY2xlID0gZCwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkxvb3A6IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAhMSwgZyA9IGQudW5jbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiBnLmNoaWxkcmVuICYmIDEgPT09IGcuY2hpbGRyZW4ubGVuZ3RoICYmIChnID0gZy5jaGlsZHJlblswXSkgJiYgMSA9PT0gZy5jaGlsZHJlbi5sZW5ndGggJiYgKGQuZXhwYW5kZWRFbCA9IGcsIGYgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiAhZC5leHBhbmRlZElzT3BlbiA/IGEudC5mKGQuZXhwYW5kZWRFbCwgJ2RpdicsIG51bGwsIGQuYWROdW0pIDogIWYgJiYgZC5leHBhbmRlZElzT3BlbiAmJiBhLnQuZyhkLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdQb2ludHJvbGwgMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZTogL3ByYWRpKFtBLVowLTldKykvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5kQWQ6IGZ1bmN0aW9uIChkLCBmLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBkICYmIGQuaW5uZXJIVE1MICYmIGQuaW5uZXJIVE1MLm1hdGNoKHRoaXMucmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYi5nZXRFbGVtZW50QnlJZCgncHJmJyArIGNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZW1iZWQnKSwgbCA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ29iamVjdCcpLCBwID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICYmIGhbMF0gJiYgYS5hLmJ1KGhbMF0pID8gZSA9IGhbMF0gOiBsICYmIGxbMF0gJiYgYS5hLmJ1KGxbMF0pID8gZSA9IGxbMF0gOiBwICYmIDAgPCBwLmxlbmd0aCAmJiBhLmEuZm9yRWFjaChwLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgJ21hbC1hZC1jb250YWluZXInID09PSBiLmlkICYmIGEuYS5idChiKSAmJiAoZSA9IGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZSAmJiBkLmNoaWxkcmVuICYmIDEgPT09IGQuY2hpbGRyZW4ubGVuZ3RoICYmIChoID0gZC5jaGlsZHJlblswXSkgJiYgMSA9PT0gaC5jaGlsZHJlbi5sZW5ndGggJiYgYS5hLmJ0KGguY2hpbGRyZW5bMF0pICYmIChlID0gaC5jaGlsZHJlblswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSB8fCAoYyA9IGIuZ2V0RWxlbWVudEJ5SWQoJ3BydycgKyBjWzFdKSkgJiYgYS5hLmJ0KGMpICYmIChlID0gYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudC5kW2ZdID0gYS50LmUoZSwgZiwgZyksIGEudC5kW2ZdLnVuY2xlID0gZCwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25OZXdBZDogZnVuY3Rpb24gKGQsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIGQudW5jbGUgJiYgYS5qLmMoZiwgZC51bmNsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdVbmljYXN0IDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmU6IC9Wd1AoXGQrKURpdi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmRBZDogZnVuY3Rpb24gKGQsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA9IGEudC5jKGQsIHRoaXMucmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZC5pZC5tYXRjaCh0aGlzLnJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgJiYgKGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnVndQJyArIGNbMV0gKyAnRGl2MicpKSAmJiAoYyA9IGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpLCAzICE9PSBjLmxlbmd0aCAmJiAxID09PSBjLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5idChjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudC5kW2ZdID0gYS50LmUoZCwgZiwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kRXhwYW5kZWQ6IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkID0gZC5pZC5tYXRjaCh0aGlzLnJlKSkgJiYgKGQgPSAoZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdWd1AnICsgZFsxXSArICdEaXYyJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpKSAmJiBkWzBdKSAmJiBhLmEuYnQoZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgay5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdCbGVlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmRBZDogZnVuY3Rpb24gKGQsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS51LmEoWydzY3JpcHRbc3JjKj1cJ2pldHBhY2tkaWdpdGFsXCddJ10sIGQpWzBdICYmIChkID0gYS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pwc3VwZXJoZWFkZXInKSkgJiYgYS5hLmJ0KGQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb2JqZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIDEgPT09IGMubGVuZ3RoICYmIGNbMF0uaWQgJiYgY1swXS5pZC5tYXRjaCgnanBfZW1iZWQnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjID0gY1swXSwgYS50LmRbZl0gPSBhLnQuZShkLCBmLCBnKSwgYS50LmRbZl0uZXhwYW5kZWRFbCA9IGMsIGEudC5kW2ZdLmJnQ2hlY2sgPSBjICYmIGMucGFyZW50Tm9kZSAmJiBjLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Mb29wOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5iZ0NoZWNrLmNsYXNzTmFtZSAmJiBkLmJnQ2hlY2suY2xhc3NOYW1lLm1hdGNoKCdiYWNrZ3JvdW5kMScpICYmIChmID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgIWQuZXhwYW5kZWRJc09wZW4gPyAoYS50LmYoZC5leHBhbmRlZEVsLCBudWxsLCBudWxsLCBkLmFkTnVtKSwgYS5qLmIoQltkLmFkTnVtXSwgc3RhZ2UuYmdDaGVjaykpIDogIWYgJiYgZC5leHBhbmRlZElzT3BlbiAmJiBhLnQuZyhkLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBrLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0pQRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZvdW5kQWRLbm93bjogZnVuY3Rpb24gKGQsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC5jbGFzc05hbWUgJiYgZC5jbGFzc05hbWUubWF0Y2goJ2pwcGxhdGZvcm0nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmMuZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanBfb3ZlcmxheScpLCBiID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnBhcmVudE5vZGUgJiYgZC5wYXJlbnROb2RlLmlkICYmICdqcGRfZXhwZm9vdGVyJyA9PT0gZC5wYXJlbnROb2RlLmlkICYmIChjID0gYS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pwZF9leHBmb290ZXJfb3ZlcmxheScpLCBiID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2pwcGFuZWwnLCAnRElWJywgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIDAgPCBlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gYS50LmUoZCwgZiwgZyksIGEudC5kW2ZdID0gZCwgYS50LmRbZl0ub3ZlcmxheSA9IGMsIGEudC5kW2ZdLnBhbmVscyA9IGUsIGEudC5kW2ZdLmlnbm9yZVZpZGVvID0gYiwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9vcDogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiwgZyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLm92ZXJsYXkgJiYgZC5vdmVybGF5LnN0eWxlICYmICctOTk5OXB4JyAhPT0gZC5vdmVybGF5LnN0eWxlLnRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQuZXhwYW5kZWRFbCB8fCBkLmV4cGFuZGVkRWwgJiYgZC5leHBhbmRlZEVsLnN0eWxlICYmICctOTk5OXB4JyA9PT0gZC5leHBhbmRlZEVsLnN0eWxlLnRvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaWdub3JlVmlkZW8gPyBhLmEuZm9yRWFjaChkLnBhbmVscywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnN0eWxlICYmICctOTk5OXB4JyAhPT0gYS5zdHlsZS50b3AgJiYgMCA9PT0gYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndmlkZW8nKS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGEuYS5mb3JFYWNoKGQucGFuZWxzLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEuc3R5bGUgJiYgJy05OTk5cHgnICE9PSBhLnN0eWxlLnRvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgPSBhLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmICYmIGEuYS5idChmKSAmJiAoZC5leHBhbmRlZEVsID0gZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZXhwYW5kZWRFbCAmJiAoZyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiAhZC5leHBhbmRlZElzT3BlbiA/IGEudC5mKGQuZXhwYW5kZWRFbCwgJ2RpdicsIG51bGwsIGQuYWROdW0pIDogIWcgJiYgZC5leHBhbmRlZElzT3BlbiAmJiBhLnQuZyhkLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBrLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FkZm9ybSBUd29FbGVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm91bmRBZEtub3duOiBmdW5jdGlvbiAoZCwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gQltmXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5hZGZvcm1Db2xsYXBzZWRFbCAmJiBjLmFkZm9ybUV4cGFuZGVkRWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gYS50LmUoZCwgZiwgZyksIGEudC5kW2ZdID0gZCwgYS50LmRbZl0uZXhwYW5kZWRFbCA9IGMuYWRmb3JtRXhwYW5kZWRFbCwgYS50LmRbZl0uaGlkZGVuQ2xhc3NSeCA9IC8oXnwgKWFkZm9ybS1hZGJveC1oaWRkZW4oJHwgKS8sICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9vcDogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuaGlkZGVuQ2xhc3NSeC50ZXN0KGQuY29sbGFwc2VkRWwuY2xhc3NOYW1lKSAmJiAoZiA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmICFkLmV4cGFuZGVkSXNPcGVuID8gYS50LmYoZC5leHBhbmRlZEVsLCBudWxsLCBudWxsLCBkLmFkTnVtKSA6ICFmICYmIGQuZXhwYW5kZWRJc09wZW4gJiYgYS50LmcoZCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgay5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdTaXptZWsgTGVhdmViZWhpbmQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZENvbGxhcHNlZEFkOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID0gZC5nZXRFbGVtZW50QnlJZCgnZXllRGl2JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYsIGcgPSAvZWJBZFxkK19jb250cmFjdGVkcGFuZWxfYXNzZXRfLiovaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb2JqZWN0JykpICYmIDAgPCBkLmxlbmd0aCAmJiAoYS5hLmZvckVhY2goZCwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLmlkLm1hdGNoKGcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiA9IGEsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kRXhwYW5kZWRBZDogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA9IGQuZ2V0RWxlbWVudEJ5SWQoJ2V5ZURpdicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmLCBnID0gL2ViQWRcZCtfZXhwYW5kZWRwYW5lbFxkKl9hc3NldF8uKi9pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGQgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvYmplY3QnKSkgJiYgMCA8IGQubGVuZ3RoICYmIChhLmEuZm9yRWFjaChkLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEuaWQubWF0Y2goZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWRFeHBhbmRlZDogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kRXhwYW5kZWRBZChhKSA/ICEwIDogITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5kQWQ6IGZ1bmN0aW9uIChkLCBmLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8ICFhLnUuYShbJ2RpdiNtbUJpbGxib2FyZFNoaW0nXSwgZClbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuYy5lICYmIGEuYy5lLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB0aGlzLmZpbmRDb2xsYXBzZWRBZChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gdGhpcy5maW5kRXhwYW5kZWRBZChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCB8fCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmICFkW0RdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcgPSBhLnQuZShkLCBmLCBnKSwgYS50LmRbZl0gPSBnLCBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBhLmEuYnQoYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyA9IGEudC5lKGMsIGYsIGcpLCBhLnQuZFtmXSA9IGcsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWRTdGF0ZUNyZWF0ZWQ6IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wYWdlRG9jdW1lbnQgPSBhLmMuZS5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmNvbGxhcHNlVW5sb2FkcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9vcDogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHRoaXMuaXNBZEV4cGFuZGVkKGQucGFnZURvY3VtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMSA9PT0gZC5leHBhbmRlZElzT3BlbiAmJiBmID8gKGQuZXhwYW5kZWRFbCA9IHRoaXMuZmluZEV4cGFuZGVkQWQoZC5wYWdlRG9jdW1lbnQpLCBhLnQuZihkLmV4cGFuZGVkRWwsIG51bGwsIG51bGwsIGQuYWROdW0pKSA6IGQuZXhwYW5kZWRJc09wZW4gJiYgMCA9PSBmICYmIChkLmNvbGxhcHNlZEVsID0gdGhpcy5maW5kQ29sbGFwc2VkQWQoZC5wYWdlRG9jdW1lbnQpLCBhLnQuaChkLmNvbGxhcHNlZEVsLCBudWxsLCBudWxsLCBkLmFkTnVtKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBrLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ1Npem1layBQdXNoZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kRXhwYW5kZWRBZDogZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA9IGQuZ2V0RWxlbWVudEJ5SWQoJ2V5ZURpdicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmLCBnID0gL2ViYWRcZCtfcGFuZWxcZCpfYXNzZXRfLiovaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb2JqZWN0JykpICYmIDAgPCBkLmxlbmd0aCAmJiAoYS5hLmZvckVhY2goZCwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLmlkLm1hdGNoKGcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiA9IGEsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FkRXhwYW5kZWQ6IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEV4cGFuZGVkQWQoYSkgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm91bmRBZEtub3duOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmlkICYmIGQuaWQubWF0Y2goJ2ViUmljaEJhbm5lckZsYXNoJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IEwgJiYgTC5wYXJlbnROb2RlICYmIEwucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGQsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnNyYyAmJiBhLnNyYy5tYXRjaCgnZWJFeHBCYW5uZXInKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiA9ICEwLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckFkU3RhdGVDcmVhdGVkOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucGFnZURvY3VtZW50ID0gYS5jLmUuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Mb29wOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5pc0FkRXhwYW5kZWQoZC5wYWdlRG9jdW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICExID09PSBkLmV4cGFuZGVkSXNPcGVuICYmIGYgPyAoZC5leHBhbmRlZEVsID0gdGhpcy5maW5kRXhwYW5kZWRBZChkLnBhZ2VEb2N1bWVudCksIGEudC5mKGQuZXhwYW5kZWRFbCwgbnVsbCwgbnVsbCwgZC5hZE51bSkpIDogZC5leHBhbmRlZElzT3BlbiAmJiAwID09IGYgJiYgYS50LmcoZCwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgay5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdDZWx0cmEgQmFubmVyL1ZpZGVvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRFeHBhbmRlZEFkOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmV4cGFuZGVkRWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmV4cGFuZGVkRWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYsIGcsIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdiYW5uZXInID09PSBkLmV4cGFuZFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGEudi5hKGQucGFnZURvYy5ib2R5LCBhLnYuYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSBnLmxlbmd0aCAtIDE7IDAgPD0gYjsgYi0tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjID0gZ1tiXS5jb250ZW50V2luZG93KSAmJiBjLnJ1bnRpbWVQYXJhbXMgJiYgYy5ydW50aW1lUGFyYW1zLnBsYWNlbWVudElkICYmIGMucnVudGltZVBhcmFtcy5jbGllbnRUaW1lc3RhbXAgJiYgYy5ydW50aW1lUGFyYW1zLnBsYWNlbWVudElkID09PSBkLmNlbHRyYUlkICYmIGMucnVudGltZVBhcmFtcy5jbGllbnRUaW1lc3RhbXAgPT09IGQuY2VsdHJhVGltZXN0YW1wICYmIChmID0gYy5kb2N1bWVudCAmJiBjLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjZWx0cmEtbW9kYWwnKSkgJiYgYS5hLmJ0KGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLnBhcmVudEZyYW1lIHx8IChkLnBhcmVudEZyYW1lID0gYS5nLmcoZikpLCBkLmV4cGFuZGVkRWwgPSBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ3ZpZGVvJyA9PT0gZC5leHBhbmRUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBkLnBhZ2VEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3ZpZGVvJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmFkV2luICYmIGQuYWRXaW4udmlkZW9Db250ZXh0ICYmIGQuYWRXaW4udmlkZW9Db250ZXh0LnVybCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBkLmFkV2luLnZpZGVvQ29udGV4dC51cmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChnLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEuc3JjID09PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiA9IGEsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnNyYyAmJiBhLnNyYy5tYXRjaCAmJiBhLnNyYy5tYXRjaCgnY2VsdHJhJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgJiYgYS5hLmJ0KGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZXhwYW5kZWRFbCA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FkRXhwYW5kZWQ6IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0aGlzLmZpbmRFeHBhbmRlZEFkKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmID8gKGQgPSBkLnBhcmVudEZyYW1lIHx8IGEuZy5nKGYpKSAmJiBkLnN0eWxlICYmICdub25lJyA9PT0gZC5zdHlsZS5kaXNwbGF5ID8gITEgOiAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm91bmRBZEtub3duOiBmdW5jdGlvbiAoZCwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmlkICYmIGQuaWQubWF0Y2goJ2NlbHRyYScpIHx8IGQuY2xhc3NOYW1lICYmIGQuY2xhc3NOYW1lLm1hdGNoKCdjZWx0cmEnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGQub3duZXJEb2N1bWVudCAmJiAoZC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IGQub3duZXJEb2N1bWVudC5wYXJlbnRXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjLkV4cGFuZGFibGVCYW5uZXIgJiYgYy5ydW50aW1lUGFyYW1zICYmIGMucnVudGltZVBhcmFtcy5wbGFjZW1lbnRJZCAmJiBjLnJ1bnRpbWVQYXJhbXMuY2xpZW50VGltZXN0YW1wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPSBhLnQuZShkLCBmLCBnKSwgYS50LmRbZl0gPSBkLCBhLnQuZFtmXS5leHBhbmRUeXBlID0gJ2Jhbm5lcicsIGEudC5kW2ZdLnBhZ2VEb2MgPSBhLmMuZS5kb2N1bWVudCwgYS50LmRbZl0uY2VsdHJhSWQgPSBjLnJ1bnRpbWVQYXJhbXMucGxhY2VtZW50SWQsIGEudC5kW2ZdLmNlbHRyYVRpbWVzdGFtcCA9IGMucnVudGltZVBhcmFtcy5jbGllbnRUaW1lc3RhbXAsICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjLlZpZGVvQ29udGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gYS50LmUoZCwgZiwgZyksIGEudC5kW2ZdID0gZCwgYS50LmRbZl0uZXhwYW5kVHlwZSA9ICd2aWRlbycsIGEudC5kW2ZdLnBhZ2VEb2MgPSBhLmMuZS5kb2N1bWVudCwgYS50LmRbZl0uYWRXaW4gPSBjLCAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Mb29wOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdGhpcy5pc0FkRXhwYW5kZWQoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiAhZC5leHBhbmRlZElzT3BlbiA/IGEudC5mKGQuZXhwYW5kZWRFbCwgJ2RpdicsIG51bGwsIGQuYWROdW0pIDogIWYgJiYgZC5leHBhbmRlZElzT3BlbiAmJiBhLnQuZyhkLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlZEVsID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRlZEVsID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRlZElzT3BlbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkTnVtID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWdJbmRleCA9IGM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudC5kW2NdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoITAgIT09IGQuZmluZGluZ0V4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmZpbmRpbmdFeHBhbmRlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZmluZGluZ0V4cGFuZGVkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgayA9IEJbY10uYWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmwuayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBiLmZpbmRFeHBhbmRlZChrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudi5jKGQsIGMsIGYsICExLCBnKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA1LCA1MDAsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYiwgYywgZCwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBiW01dID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgYltEXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gQltnXTsKICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGEudC5kW2ddOwogICAgICAgICAgICAgICAgICAgICAgICBnLmV4cGFuZGVkSXNPcGVuID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5idihiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy5maW5kaW5nRXhwYW5kZWQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmJ2KGIuY29sbGFwc2VkRWwsIEJbYi5hZE51bV0sICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5leHBhbmRlZElzT3BlbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBjIHx8IChiLmV4cGFuZGVkRWwgJiYgKGIuZXhwYW5kZWRFbFtNXSA9IHZvaWQgMCwgYi5leHBhbmRlZEVsW0RdID0gdm9pZCAwKSwgYi5leHBhbmRlZEVsID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYiwgYywgZCwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJbTV0gPSBnOwogICAgICAgICAgICAgICAgICAgICAgICBiW0RdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudC5kW2ddLmV4cGFuZGVkSXNPcGVuID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5idihiLCBCW2ddKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLnQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnQuaSA9ICdiYWMnOwogICAgICAgICAgICAgICAgICAgIHZhciBiID0gW107CiAgICAgICAgICAgICAgICAgICAgYS50LmEgPSBiOwogICAgICAgICAgICAgICAgICAgIGEudC5kID0ge307CiAgICAgICAgICAgICAgICAgICAgYS50LmUgPSBmdW5jdGlvbiAoYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGsoYSwgYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQuaiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS50LmRbYi56cl07CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGMuY29sbGFwc2VkRWwgPSBudWxsLCBjLmV4cGFuZGVkRWwgPSBudWxsLCBkZWxldGUgYS50LmRbYi56cl0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS50LmsgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIgPSBhLnQuZFtiXSkgJiYgITAgPT09IGIuZXhwYW5kZWRJc09wZW47CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQubCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiA9IGEudC5kW2JdKSAmJiAhMCA9PT0gYi5jb2xsYXBzZVVubG9hZHM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQubSA9IGZ1bmN0aW9uIChlLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UoL15vbi8sICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLnQuZFtoXSwgcCA9IEJbaF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGJbZi5jb25maWdJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21vdXNlZG93bicgPT09IGUgJiYgay5maW5kRXhwYW5kZWQgJiYgIWYuZXhwYW5kZWRJc09wZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZChrLCBoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdtb3VzZW92ZXInID09PSBlICYmIGsub25Nb3VzZU92ZXIgJiYgIWYuZXhwYW5kZWRJc09wZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5vbk1vdXNlT3ZlcihmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdsb29wJyA9PT0gZSAmJiBrLm9uTG9vcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLm9uTG9vcChmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdkZXBhcnRlZCcgPT09IGUgJiYgZi5leHBhbmRlZElzT3BlbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ2NvbGxhcHNlVW5sb2FkcycgPT09IGUgJiYgZi5leHBhbmRlZElzT3BlbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGYuY29sbGFwc2VkRWwsIG51bGwsIG51bGwsIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ25ld2FkJyA9PT0gZSAmJiBrLm9uTmV3QWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5vbk5ld0FkKGYsIHApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQubiA9IGZ1bmN0aW9uIChlLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgPSBjLmFkTnVtLCBnID0gMDsgZyA8IGIubGVuZ3RoOyBnKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYltnXSwgayA9IGYub25GaW5kQWQgJiYgZi5vbkZpbmRBZChlLCBkLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGEudy5hLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS56ciA9PSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEudC5kW2RdICYmIGYuYWZ0ZXJBZFN0YXRlQ3JlYXRlZCAmJiBmLmFmdGVyQWRTdGF0ZUNyZWF0ZWQoYS50LmRbZF0pLCBjLmFjdGl2ZUNvbmZpZyA9IGYubmFtZSwgazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS50Lm8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAhPT0gYS50LmkgJiYgZS5hYSAmJiBlLmFvICYmICFhLnQuZFtkXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBlLmFhLCBkID0gZS5hby5hZE51bSwgZyA9IDA7IGcgPCBiLmxlbmd0aDsgZysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBiW2ddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmICYmIGYuaXNGb3VuZEFkS25vd24gJiYgZi5pc0ZvdW5kQWRLbm93bihjLCBkLCBnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGEudy5hLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS56ciA9PSBlLnpyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS50LmRbZF0gfHwgKGMgPSBuZXcgayhjLCBkLCBnKSwgYS50LmRbZF0gPSBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hZnRlckFkU3RhdGVDcmVhdGVkICYmIGYuYWZ0ZXJBZFN0YXRlQ3JlYXRlZChhLnQuZFtkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYW8uYWN0aXZlQ29uZmlnID0gZi5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQucCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSU1HJyA9PT0gYS50YWdOYW1lICYmIGEuaWQgJiYgYS5pZC5tYXRjaCgvXnByYWRpWzAtOUEtWl0rJC8pICYmIGEub25sb2FkICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLm9ubG9hZC50b1N0cmluZyAmJiBhLm9ubG9hZC50b1N0cmluZygpLm1hdGNoKC9zaG9ja3dhdmUvKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudC5xID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS50LmsoYy56cikgJiYgKGEudC5sKGMuenIpID8gYS50Lm0oJ2NvbGxhcHNlVW5sb2FkcycsIGMuenIpIDogYS50Lm0oJ2RlcGFydGVkJywgYy56ciksIGIuc2hvdWxkS2lsbEFkID0gITEpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYmVmb3JlQWRLaWxsZWQnLCBhLnQucSwgeyBwcmlvcml0eTogNSB9KTsKICAgICAgICAgICAgICAgICAgICBhLnQuYiA9IGZ1bmN0aW9uIChlLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gW2VbMF1dLCBwID0gW2VbMV1dLCB0ID0gZVsyXSwgcSA9IGVbM10gJiYgW2VbM11dLCB5ID0gZVs0XSAmJiBbZVs0XV0sIHggPSBlWzVdICYmIFtlWzVdXSwgbiA9IGVbNl0sIG0gPSBlWzddLCBJID0gITEsIEcgPSAhMSwgSiA9ICExLCBDID0gITEsIHogPSAhMSwgSyA9ICExLCBFID0gITEsIFAsIHYgPSBQID0gITEsIEggPSAhMSwgciA9ICExLCB1ID0gITEsIHcgPSAhMSwgUSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIChhLmEuYXgodCwgJ2NoZWNrSGlkZGVuU3R5bGVzJykgJiYgKEkgPSAhMCksIGEuYS5heCh0LCAnbm9Jbml0aWFsVmFsaWRhdGlvbicpICYmIChHID0gITApLCBhLmEuYXgodCwgJ25vTG9vcFZhbGlkYXRpb24nKSAmJiAoSiA9ICEwKSwgYS5hLmF4KHQsICdub0NvbGxhcHNlVmFsaWRhdGlvbicpICYmIChDID0gITApLCBhLmEuYXgodCwgJ3J1bldpdGhvdXRFeHBhbmQnKSAmJiAoeiA9ICEwKSwgYS5hLmF4KHQsICdjb2xsYXBzZVVubG9hZHMnKSAmJiAoSyA9ICEwKSwgYS5hLmF4KHQsICdleHBhbmRVbmxvYWRzJykgJiYgKEUgPSAhMCksIGEuYS5heCh0LCAndXNlSXNGb3VuZEFkS25vd24nKSAmJiAoUCA9ICEwKSwgYS5hLmF4KHQsICdzZXRDb2xsYXBzZVByb3h5SW5Mb29wJykgJiYgKHYgPSAhMCksIGEuYS5heCh0LCAnc2V0RXhwYW5kUHJveHlJbkxvb3AnKSAmJiAoSCA9ICEwKSwgYS5hLmF4KHQsICdmaW5kRXhwYW5kSW5Mb29wJykgJiYgKHogPSByID0gITApLCBhLmEuYXgodCwgJ2FkZEV4cGFuZFRhZycpICYmICh1ID0gITApLCBhLmEuYXgodCwgJ3NldElmcmFtZUFzc2V0VHlwZScpICYmICh3ID0gITApLCBhLmEuYXgodCwgJ3ByZWZlckNvbGxhcHNlJykgJiYgKFEgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICBiLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRm91bmRBZEtub3duOiBmdW5jdGlvbiAoYiwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghUCB8fCAhYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmIG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChiID0gKGIgPSBCW2NdLmFvKSAmJiBiW25dKSAmJiAhYS5hLmF4KG0sIGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYS51LmEobCwgYilbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS50LmRbY10gPSBuZXcgayhiLCBjLCBlKSwgYS50LmRbY10uY29sbGFwc2VkUXVlcnkgPSBsLCBhLnQuZFtjXS5leHBhbmRlZFF1ZXJ5ID0gcCwgYS50LmRbY10uc2VhcmNoYWJsZUVsID0gYiwgYS50LmRbY10uY2hlY2tIaWRkZW5TdHlsZXMgPSBJLCBhLnQuZFtjXS5jb2xsYXBzZVVubG9hZHMgPSBLLCBhLnQuZFtjXS5ub0xvb3BWYWxpZGF0aW9uID0gSiwgYS50LmRbY10uZXhwYW5kVW5sb2FkcyA9IEUsIGEudC5kW2NdLmV4cGFuZGVkU2VsZWN0b3IgPSBxLCBhLnQuZFtjXS5jb2xsYXBzZVByb3h5RWwgPSB5LCBhLnQuZFtjXS5leHBhbmRQcm94eUVsID0geCwgYS50LmRbY10uY29sbGFwc2VVbmxvYWRzID0gSywgYS50LmRbY10uc2V0Q29sbGFwc2VQcm94eUluTG9vcCA9IHYsIGEudC5kW2NdLnNldEV4cGFuZFByb3h5SW5Mb29wID0gSCwgYS50LmRbY10uZmluZEV4cGFuZEluTG9vcCA9IHIsIGEudC5kW2NdLmFkZEV4cGFuZFRhZyA9IHUsIGEudC5kW2NdLnNldElmcmFtZUFzc2V0VHlwZSA9IHcsIGEudC5kW2NdLnByZWZlckNvbGxhcHNlID0gUSwgeSAmJiBhLnUuYih5LCBCW2NdLCBiKSwgITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS51LmEocCwgYilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmIChHIHx8IGEuYS5idShkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS50LmRbY10gPSBuZXcgayhiLCBjLCBlKSwgYS50LmRbY10uY29sbGFwc2VkUXVlcnkgPSBsLCBhLnQuZFtjXS5leHBhbmRlZFF1ZXJ5ID0gcCwgYS50LmRbY10uc2VhcmNoYWJsZUVsID0gYiwgYS50LmRbY10uY2hlY2tIaWRkZW5TdHlsZXMgPSBJLCBhLnQuZFtjXS5jb2xsYXBzZVVubG9hZHMgPSBLLCBhLnQuZFtjXS5ub0xvb3BWYWxpZGF0aW9uID0gSiwgYS50LmRbY10uZXhwYW5kVW5sb2FkcyA9IEUsIGEudC5kW2NdLmV4cGFuZGVkU2VsZWN0b3IgPSBxLCBhLnQuZFtjXS5leHBhbmRlZEVsID0gZCwgYS50LmRbY10uY29sbGFwc2VQcm94eUVsID0geSwgYS50LmRbY10uZXhwYW5kUHJveHlFbCA9IHgsIGEudC5kW2NdLmNvbGxhcHNlVW5sb2FkcyA9IEssIGEudC5kW2NdLnNldENvbGxhcHNlUHJveHlJbkxvb3AgPSB2LCBhLnQuZFtjXS5zZXRFeHBhbmRQcm94eUluTG9vcCA9IEgsIGEudC5kW2NdLmZpbmRFeHBhbmRJbkxvb3AgPSByLCBhLnQuZFtjXS5hZGRFeHBhbmRUYWcgPSB1LCBhLnQuZFtjXS5zZXRJZnJhbWVBc3NldFR5cGUgPSB3LCBhLnQuZFtjXS5wcmVmZXJDb2xsYXBzZSA9IFEsIHkgJiYgYS51LmIoeSwgQltjXSwgYiksIHggJiYgYS51LmIoeCwgQltjXSwgZCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmRBZDogZnVuY3Rpb24gKGIsIGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS51LmEobCwgYilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgQyAmJiAhZFtEXSB8fCBhLmEuYnQoZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS50LmRbY10gPSBuZXcgayhkLCBjLCBlKSwgYS50LmRbY10uY29sbGFwc2VkUXVlcnkgPSBsLCBhLnQuZFtjXS5leHBhbmRlZFF1ZXJ5ID0gcCwgYS50LmRbY10uc2VhcmNoYWJsZUVsID0gYiwgYS50LmRbY10uY2hlY2tIaWRkZW5TdHlsZXMgPSBJLCBhLnQuZFtjXS5jb2xsYXBzZVVubG9hZHMgPSBLLCBhLnQuZFtjXS5ub0xvb3BWYWxpZGF0aW9uID0gSiwgYS50LmRbY10uZXhwYW5kVW5sb2FkcyA9IEUsIGEudC5kW2NdLmV4cGFuZGVkU2VsZWN0b3IgPSBxLCBhLnQuZFtjXS5jb2xsYXBzZVByb3h5RWwgPSB5LCBhLnQuZFtjXS5leHBhbmRQcm94eUVsID0geCwgYS50LmRbY10uY29sbGFwc2VVbmxvYWRzID0gSywgYS50LmRbY10uc2V0Q29sbGFwc2VQcm94eUluTG9vcCA9IHYsIGEudC5kW2NdLnNldEV4cGFuZFByb3h5SW5Mb29wID0gSCwgYS50LmRbY10uZmluZEV4cGFuZEluTG9vcCA9IHIsIGEudC5kW2NdLmFkZEV4cGFuZFRhZyA9IHUsIGEudC5kW2NdLnNldElmcmFtZUFzc2V0VHlwZSA9IHcsIGEudC5kW2NdLnByZWZlckNvbGxhcHNlID0gUSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBhLnUuYShwLCBiKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgKEcgfHwgYS5hLmJ1KGgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnQuZFtjXSA9IG5ldyBrKGQsIGMsIGUpLCBhLnQuZFtjXS5jb2xsYXBzZWRRdWVyeSA9IGwsIGEudC5kW2NdLmV4cGFuZGVkUXVlcnkgPSBwLCBhLnQuZFtjXS5zZWFyY2hhYmxlRWwgPSBiLCBhLnQuZFtjXS5jaGVja0hpZGRlblN0eWxlcyA9IEksIGEudC5kW2NdLmNvbGxhcHNlVW5sb2FkcyA9IEssIGEudC5kW2NdLm5vTG9vcFZhbGlkYXRpb24gPSBKLCBhLnQuZFtjXS5leHBhbmRVbmxvYWRzID0gRSwgYS50LmRbY10uZXhwYW5kZWRTZWxlY3RvciA9IHEsIGEudC5kW2NdLmV4cGFuZGVkRWwgPSBoLCBhLnQuZFtjXS5jb2xsYXBzZVByb3h5RWwgPSB5LCBhLnQuZFtjXS5leHBhbmRQcm94eUVsID0geCwgYS50LmRbY10uY29sbGFwc2VVbmxvYWRzID0gSywgYS50LmRbY10uc2V0Q29sbGFwc2VQcm94eUluTG9vcCA9IHYsIGEudC5kW2NdLnNldEV4cGFuZFByb3h5SW5Mb29wID0gSCwgYS50LmRbY10uZmluZEV4cGFuZEluTG9vcCA9IHIsIGEudC5kW2NdLmFkZEV4cGFuZFRhZyA9IHUsIGEudC5kW2NdLnNldElmcmFtZUFzc2V0VHlwZSA9IHcsIGEudC5kW2NdLnByZWZlckNvbGxhcHNlID0gUSwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25OZXdBZDogZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmNvbGxhcHNlUHJveHlFbCAmJiAhYi51c2VJc0ZvdW5kQWRLbm93biAmJiBhLnUuYihiLmNvbGxhcHNlUHJveHlFbCwgYywgYy5hYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Mb29wOiBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLnN0b3BMb29wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnNldElmcmFtZUFzc2V0VHlwZSAmJiAoQltiLmFkTnVtXS5oYXNJZnJhbWVMaXN0ZW5lciA9ICEwLCBiLnNldElmcmFtZUFzc2V0VHlwZSA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5leHBhbmRVbmxvYWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS51LmEoYi5leHBhbmRlZFF1ZXJ5LCBiLnNlYXJjaGFibGVFbClbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZXhwYW5kZWRFbCA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuZmluZEV4cGFuZEluTG9vcCAmJiAhYi5leHBhbmRlZEVsICYmIChkID0gYS51LmEoYi5leHBhbmRlZFF1ZXJ5LCBiLnNlYXJjaGFibGVFbClbMF0sIGIuZXhwYW5kZWRFbCA9IGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmV4cGFuZGVkRWwgJiYgKGIubm9Mb29wVmFsaWRhdGlvbiB8fCBhLmEuYnUoYi5leHBhbmRlZEVsKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiLmNoZWNrSGlkZGVuU3R5bGVzICYmIChiLmV4cGFuZGVkRWwuc3R5bGUgJiYgJ2hpZGRlbicgPT09IGIuZXhwYW5kZWRFbC5zdHlsZS52aXNpYmlsaXR5IHx8ICdub25lJyA9PT0gYi5leHBhbmRlZEVsLnN0eWxlLmRpc3BsYXkpIHx8ICcwJyA9PT0gYS5hLmJkKGIuZXhwYW5kZWRFbCwgJ29wYWNpdHknKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYi5leHBhbmRlZFNlbGVjdG9yICYmICFhLnUuYShiLmV4cGFuZGVkU2VsZWN0b3IsIGIuZXhwYW5kZWRFbClbMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUgPSAhMCwgYi5zZXRDb2xsYXBzZVByb3h5SW5Mb29wICYmIGIuY29sbGFwc2VQcm94eUVsICYmICFiLmNvbGxhcHNlUHJveHlTZXQgJiYgKGIuY29sbGFwc2VQcm94eVNldCA9IGEudS5iKGIuY29sbGFwc2VQcm94eUVsLCBCW2IuYWROdW1dLCBiLmNvbGxhcHNlZEVsKSksIGIuc2V0RXhwYW5kUHJveHlJbkxvb3AgJiYgYi5leHBhbmRQcm94eUVsICYmICFiLmV4cGFuZFByb3h5U2V0ICYmIChiLmV4cGFuZFByb3h5U2V0ID0gYS51LmIoYi5leHBhbmRQcm94eUVsLCBCW2IuYWROdW1dLCBiLmV4cGFuZGVkRWwpKSwgYi5hZGRFeHBhbmRUYWcgJiYgYi5leHBhbmRlZEVsLnBhcmVudE5vZGUgJiYgKGQgPSBMICYmIEwuc3JjICYmIEwuc3JjLnJlcGxhY2UoL21vYXRDbGllbnRMZXZlbDQ9W14mXSomLywgJ21vYXRDbGllbnRMZXZlbDQ9RXhwYW5kZWQmJykpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5jbihkLCBiLmV4cGFuZGVkRWwucGFyZW50Tm9kZSksIGIuYWRkRXhwYW5kVGFnID0gITEsIGIuc3RvcExvb3AgPSAhMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wcmVmZXJDb2xsYXBzZSAmJiBhLmEuYnUoYi5jb2xsYXBzZWRFbCkgJiYgKGUgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAhYi5leHBhbmRlZElzT3BlbiA/IGYoYi5leHBhbmRlZEVsLCAnZGl2JywgbnVsbCwgYi5hZE51bSkgOiAhZSAmJiBiLmV4cGFuZGVkSXNPcGVuICYmIChiLmNvbGxhcHNlVW5sb2FkcyA/IChlID0gYS51LmEoYi5jb2xsYXBzZWRRdWVyeSwgYi5zZWFyY2hhYmxlRWwpWzBdLCBjKGUsIG51bGwsIG51bGwsIGIuYWROdW0pKSA6IGcoYiwgITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnQuZiA9IGY7CiAgICAgICAgICAgICAgICAgICAgYS50LmcgPSBnOwogICAgICAgICAgICAgICAgICAgIGEudC5oID0gYzsKICAgICAgICAgICAgICAgICAgICBhLnQuYyA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICBkLmluY2xTZWFyY2hhYmxlRWwgJiYgKGcgPSBhLmEuY2coZyksIGcucHVzaChiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBnLmxlbmd0aDsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGdbYl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5pZC5tYXRjaChjKSAmJiAoZC5hbnlTaXplIHx8IGEuYS5idChmKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEucy5hKCk7CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYiwgYywgZSwgZCwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICAoJ3JlbW92ZScgPT09IGggPyBhLmwuZCA6IGEubC5jKShiLCBjLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMgfHwgdGhpcy5ldmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5jdXJyZW50VGFyZ2V0IHx8IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZFtNXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gZFtNXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoID0gQltoXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gLTEgIT0gZi50eXBlLmluZGV4T2YoJ3RvdWNoJykgJiYgZi5jaGFuZ2VkVG91Y2hlcyAmJiAwIDwgZi5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHBhcnNlSW50KGYuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCAtIG4ubGVmdCwgMTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBwYXJzZUludChmLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFkgLSBuLnRvcCwgMTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcGFyc2VJbnQoZi5jbGllbnRYIC0gbi5sZWZ0LCAxMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHBhcnNlSW50KGYuY2xpZW50WSAtIG4udG9wLCAxMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguYWogPSBmLng7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5hayA9IGYueTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmRtIHx8IChoLmNiID0gMiA9PSBhLmZvY3VzLmdldEZvY3VzTWV0aG9kKCkgPyBoLmNvdW50ZXJzLmxheER3ZWxsLnRDdXIgOiBoLmNvdW50ZXJzLnN0cmljdER3ZWxsLnRDdXIsIGguZG0gPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGwoYiwgYywgZCwgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sICdnZW5tb3VzZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGIsIGUsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgayhiLCAnY2xpY2snLCB0LCBlLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgayhiLCAnbW91c2Vkb3duJywgZywgZSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIFUgPyBhLmMuZHkgJiYgayhiLCAndG91Y2hzdGFydCcsIGMsIGUsIGQpIDogKGsoYiwgJ21vdXNlbW92ZScsIGYsIGUsIGQpLCBrKGIsICdtb3VzZW92ZXInLCBsLCBlLCBkKSwgayhiLCAnbW91c2VvdXQnLCBwLCBlLCBkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYiwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdtb3VzZUV2ZW50T25BZCcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gYiB8fCB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBiLnRhcmdldCB8fCBiLnNyY0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxICE9IGUuYW8uc2tpbiB8fCAhYS54LmEoYywgZS5hZENvbnRlbnQsIGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVUgJiYgKGUuYWogIT09IGUuYWwgfHwgZS5hayAhPT0gZS5hbSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuZChiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuZihiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuZyhiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuaShiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuaChiLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuYihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuYyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnIuZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBlLmFyLmxlbmd0aCAmJiAoZS5haSA9IHkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxMDAgPiBlLmFyLmxlbmd0aCB8fCAxMDAgPiBlLmFzLmxlbmd0aCB8fCAxMDAgPiBlLmF0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5hci5wdXNoKGUuYWopLCBlLmFzLnB1c2goZS5hayksIGUuYXQucHVzaChhLmEuYmIoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWwgPSBlLmFqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYW0gPSBlLmFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5haSAhPT0geShlKSAmJiAxIDwgZS5hci5sZW5ndGggJiYgcShlLCAnb25Nb3VzZU1vdmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGIsIGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnbW91c2VFdmVudE9uQWQnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwgd2luZG93LmV2ZW50OwogICAgICAgICAgICAgICAgICAgICAgICBjID0gYi50YXJnZXQgfHwgYi5zcmNFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAxID09IGUuYW8uc2tpbiAmJiBhLnguYShjLCBlLmFkQ29udGVudCwgYikgfHwgKGMgPSB7IGU6IDIgfSwgYy5xID0gZS5hcVsyXSsrLCBjLnggPSBlLmFqLCBjLnkgPSBlLmFrLCBhLnkuYShlLCBjKSwgYS5hLmVhKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZWF0aGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgXSwgZS5hbykgJiYgYS50Lm0oYi50eXBlLCBlLnpyKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYiwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdtb3VzZUV2ZW50JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ21vdXNlRXZlbnRPbkFkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGIudGFyZ2V0IHx8IGIuc3JjRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgIT0gZS5hby5za2luIHx8ICFhLnguYShjLCBlLmFkQ29udGVudCwgYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB7IGU6IDIzIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnEgPSBlLmFxWzIzXSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi54ID0gZS5hajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIueSA9IGUuYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBlLmN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY3QgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBjIC0gZS5jdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmN0ID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmN1ID0gdy5taW4oZS5jdSwgZCkgfHwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnogPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnkuYShlLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGIsIGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyID09IGIuYW4gfHwgYi5oYXNJZnJhbWVMaXN0ZW5lcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBjLmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGIuY2s7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID09IGEuci5hLmYuYSAmJiA2ID09PSBnID8gKGUoYiwgMCksIGIuY2wgPSBhLmEuYmIoYiksIGIuY2sgPSBhLnIuYS5mLmIpIDogZiA9PSBhLnIuYS5mLmIgPyAyMiA9PT0gZyA/IChoKGIsIGMpLCBlKGIsIGQpLCBiLmNsID0gYS5hLmJiKGIpKSA6IDcgPT09IGcgJiYgKDEwMDAgPCBhLmEuYmIoYikgLSBiLmNsID8gKGNsZWFyVGltZW91dChiLmNtKSwgYy5lID0gMjIsIGgoYiwgYyksIGIuY24gPSAwLCBiLmNrID0gYS5yLmEuZi5hKSA6IGIuY2sgPSBhLnIuYS5mLmMpIDogZiA9PSBhLnIuYS5mLmMgJiYgKDYgPT0gZyA/ICgxMDAwIDwgYS5hLmJiKGIpIC0gYi5jbCAmJiAoY2xlYXJUaW1lb3V0KGIuY20pLCBiLmNuID0gMCwgYi5jbCA9IGEuYS5iYihiKSwgZShiLCAwKSksIGIuY2sgPSBhLnIuYS5mLmIpIDogMjIgPT0gZyAmJiAoaChiLCBjKSwgYi5jayA9IGEuci5hLmYuYSwgYi5jbiA9IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZm9jdXMuY2hlY2tGb2N1cygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDUgPiBjLmNuID8gMTAwMCA6IDIgKiBlLCBoID0geyBlOiAyMiB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jbSA9IGEubC5mKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKGMsIGgsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYihjLCB7IGU6IDcgfSwgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBjLnEgPSBiLmFxW2MuZV0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgYy5tID0gYS5hLmJiKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBiLmNsID0gYy5tOwogICAgICAgICAgICAgICAgICAgICAgICBhLnkuYShiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5jbisrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGMsIGUsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnbW91c2VFdmVudCcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdtb3VzZUV2ZW50T25BZCcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gYyB8fCB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjLnRhcmdldCB8fCBjLnNyY0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIDEgPT0gZC5hby5za2luICYmIGEueC5hKGUsIGQuYWRDb250ZW50LCBjKSB8fCAoYS5yLmQoYywgZCksIGEuci5mKGMsIGQpLCBhLnIuZyhjLCBkKSwgYS5yLmkoYywgZCksIGEuci5oKGMsIGQpLCBiKGQsIHsgZTogNiB9LCAwKSwgYS5hLmVhKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZWF0aGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgXSwgZC5hbykgJiYgYS50Lm0oYy50eXBlLCBkLnpyKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoYywgZSwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdtb3VzZUV2ZW50T25BZCcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gYyB8fCB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBjLnRhcmdldCB8fCBjLnNyY0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIDEgPT0gZC5hby5za2luICYmIGEueC5hKGUsIGQuYWRDb250ZW50LCBjKSB8fCAoYS5yLmQoYywgZCksIGEuci5mKGMsIGQpLCBhLnIuZyhjLCBkKSwgYS5yLmkoYywgZCksIGEuci5oKGMsIGQpLCBiKGQsIHsgZTogNyB9LCAwKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoYiwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdtb3VzZUV2ZW50JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ21vdXNlRXZlbnRPbkFkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGIudGFyZ2V0IHx8IGIuc3JjRWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PSBlLmFvLnNraW4gJiYgYS54LmEoYywgZS5hZENvbnRlbnQsIGIpIHx8IChiID0geyBlOiAzIH0sIGIucSA9IGUuYXFbM10rKywgYi54ID0gZS5haiwgYi55ID0gZS5haywgYS55LmEoZSwgYikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYi5haSA9IHkoYik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geyBlOiAxIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGUucSA9IGIuYXFbMV0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgZS54ID0gYi5hci5qb2luKCdhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUueSA9IGIuYXMuam9pbignYScpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gYS5hLmJiKGIpLCBoID0gYi5hdCwgZyA9IFtdLCBmID0gMDsgZiA8IGgubGVuZ3RoOyBmKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc05hTihoW2ZdKSB8fCBnLnB1c2gody5hYnMoaFtmXSAtIGQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5jID0gZy5qb2luKCdhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUubSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGEueS5hKGIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBiLmFyID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5hdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcuZmxvb3IoYS5hLmJiKGIpIC8gMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuaiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuai5kID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5keCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRLaWxsZWQnLCBhLmouZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuenIgPT0gYS56cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubW91c2VFdmVudEVsZW1lbnRzIHx8IChiLm1vdXNlRXZlbnRFbGVtZW50cyA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi5hYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuai5iKGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5tb3VzZUV2ZW50RWxlbWVudHMucHVzaChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5qLmIgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBiIHx8IGEuYWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmIGQoYywgYS56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuai5hID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYiB8fCBhLmFhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiBkKGMsIGEuenIsICdyZW1vdmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5qLmYgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmhhc093blByb3BlcnR5KGMpICYmIChiID0gQltjXSkgJiYgKGEuci5nKHsgdHlwZTogJ3Njb29wZXInIH0sIGIpLCBhLnIuaSh7IHR5cGU6ICdzY29vcGVyJyB9LCBiKSwgYS5yLmgoeyB0eXBlOiAnc2Nvb3BlcicgfSwgYiksIDEgPCBiLmFyLmxlbmd0aCAmJiBiLmFpICE9PSB5KGIpICYmIHEoYiwgJ3Njb29wZXInKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmouYyA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYyB8fCAhYiB8fCAnbnVtYmVyJyA9PT0gdHlwZW9mIGNbTV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICFiLmhhc0lmcmFtZUxpc3RlbmVyICYmIGMudGFnTmFtZSAmJiAnaWZyYW1lJyA9PT0gYy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgJiYgKGIuaGFzSWZyYW1lTGlzdGVuZXIgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICFiLmhhc05vbklmcmFtZUxpc3RlbmVyICYmIGMudGFnTmFtZSAmJiAnaWZyYW1lJyAhPT0gYy50YWdOYW1lLnRvTG93ZXJDYXNlKCkgJiYgKGIuaGFzTm9uSWZyYW1lTGlzdGVuZXIgPSAhMCwgYi5hbiA9IGEuZC5kKGMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY1tNXSA9IGIuenI7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuai5iKGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICBiLm1vdXNlRXZlbnRFbGVtZW50cyB8fCAoYi5tb3VzZUV2ZW50RWxlbWVudHMgPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIubW91c2VFdmVudEVsZW1lbnRzLnB1c2goYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLnByb3h5VHJhY2tpbmdFbmFibGVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmouZSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIubW91c2VFdmVudEVsZW1lbnRzLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmouYShiLCBjKSwgY1tNXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYiwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IG5ldyBhLnouaihiLnBhcmVudE5vZGUsIGMpIDogbmV3IGEuei5qKGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICdudW1iZXInID09IHR5cGVvZiBhLnpyLCBlLCBkOwogICAgICAgICAgICAgICAgICAgICAgICBjID8gKGUgPSBhLmFhLCBkID0gYS5fY2FsY1ZpZGVvQmFzZWRPbkNvbnRhaW5lcikgOiBlID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGsoZSwgYiwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBlLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBlLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBjICYmIChhLkFEX1JFQ1QgPSBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGUuY2FsY0FyZWEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWE6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUFyZWE6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY3Y6IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZyhlKSwgbCA9IGYudmlzaWJsZVJlY3QuY2FsY0FyZWEoKSwgcCA9IGwgLyBjLCB0OwogICAgICAgICAgICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IGYuY3VtdWxSZWN0LCB2ID0gZi5jdW11bFJlY3QuZ2V0Vmlld3BvcnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA+IHEudG9wICYmIDAgPCBxLmJvdHRvbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gLXEudG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoMCA8PSBxLnRvcCAmJiBxLnRvcCA8PSB2LmhlaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlNaW46IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5TWF4OiAtMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDw9IHEuYm90dG9tICYmIHEuYm90dG9tIDw9IHYuaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBxLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHEuYm90dG9tID4gdi5oZWlnaHQgJiYgcS50b3AgPCB2LmhlaWdodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcS5oZWlnaHQgLSAocS5ib3R0b20gLSB2LmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5TWluOiAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeU1heDogLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlNaW46IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeU1heDogcQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYTogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVBcmVhOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJlY3Q6IGYudmlzaWJsZVJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bFJlY3Q6IGYuY3VtdWxSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY3Y6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5TWluTWF4OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxHZW86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEhlaWdodDogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbFdpZHRoOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRUb3A6IGYuY3VtdWxSZWN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEFyZWE6IGYucGFyZW50QXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Q6IGUucmVjdAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IFtdLCBlID0gMDsgZSA8IGIubGVuZ3RoOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnB1c2goYShiW2VdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMsIGUgPSBbXSwgZCA9IGEuYS5kZyhiLmVsLCBiLndpbiwgYiAmJiBiLmVsICYmIGIuZWwuX21vYXRQYXJlbnRDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgKGUgPSBmKGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGEuei5qKGIpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBkKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudW5zaGlmdChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gbmV3IGEuei5qKGIuZWwsIGEuYy5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCBkOyBoKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gZVtoXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IGggPyBjID0gZyA6IChjLmNoYW5nZVJlZmVyZW5jZUZyYW1lKGcpLCBiLmNoYW5nZVJlZmVyZW5jZUZyYW1lKGcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnLmdldFZpZXdwb3J0UmVjdChoIDwgZCAtIDEgPyBlW2ggKyAxXSA6ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhLnoubShjLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJlY3Q6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bFJlY3Q6IGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRBcmVhOiBlW2UubGVuZ3RoIC0gMV0uY2FsY0FyZWEoKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGEsIGIsIGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHcubWF4KGEsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gdy5taW4oYiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiID4gYSA/IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiCiAgICAgICAgICAgICAgICAgICAgICAgIF0gOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdy5tYXgoYS50b3AsIGIudG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogdy5tYXgoYS5yaWdodCwgYi5yaWdodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiB3Lm1pbihhLmJvdHRvbSwgYi5ib3R0b20pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IHcubWluKGEubGVmdCwgYi5sZWZ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgZCwgaDsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5hLmYoYikgfHwgMCA9PT0gYi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmN1bXVsUmVjdCAmJiBhLnZpc2libGVSZWN0ICYmIChkLnB1c2goYS5jdW11bFJlY3QpLCBlLnB1c2goYS52aXNpYmxlUmVjdCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5yZWR1Y2UoZCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSBhLmEucmVkdWNlKGUsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxSZWN0OiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVJlY3Q6IGgKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIGIubm9kZU5hbWUgJiYgJ21hcCcgPT09IGIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA/ICEwIDogKGIgPSBhLmEuY2IoYikpICYmICgxID49IGIud2lkdGggfHwgMSA+PSBiLmhlaWdodCkgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPyAwID09PSBhLmEuZGUoeyBhYTogYiB9LCAhMCwgITApID8gITAgOiAwID09PSBhLmEuZGQoYiwgITApIDogITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoYiwgYywgZywgZiwgbCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSA9IGEuY3VtdWxSZWN0KSA/IDEwMCA8PSBhLndpZHRoICYmIDUwIDw9IGEuaGVpZ2h0IDogITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZSQU1FOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFTzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JKRUNUOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTUJFRDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1HOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCA9IGQoYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoKGIpIHx8ICFwKHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IFtdLCBFID0gQltsXTsKICAgICAgICAgICAgICAgICAgICAgICAgZy5lbGVtZW50c0Zyb21Qb2ludCAmJiAhRS5lbGVtZW50c0Zyb21Qb2ludENhY2hlID8gKGMgPSBnLmVsZW1lbnRzRnJvbVBvaW50KGMubVswXSwgYy5tWzFdKSB8fCBbXSwgRS5lbGVtZW50c0Zyb21Qb2ludENhY2hlID0gYywgcSA9IHEuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMpKSkgOiAoYyA9IGEuYS5jeChjLm1bMF0sIGMubVsxXSwgZyksIEUuZWxlbWVudHNGcm9tUG9pbnRDYWNoZSAmJiAocSA9IHEuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKEUuZWxlbWVudHNGcm9tUG9pbnRDYWNoZSkpKSwgYyAmJiAocSA9IFtjXS5jb25jYXQocSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgRSA9IHEuaW5kZXhPZihiKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0xID09IEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBxLnNsaWNlKDAsIEUpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEUgPSAwOyBFIDwgcS5sZW5ndGg7IEUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZyA9IChjID0gcVtFXSkgJiYgYyAhPT0gZiAmJiBjW01dICE9PSBsICYmIGtbYy5ub2RlTmFtZV0gJiYgIWEuYS5jcihjLCBiKSAmJiAhYS5hLmNyKGIsIGMpICYmICFlKGMpICYmICFoKGMpKSAmJiAoYyA9IGQoYykpICYmIHAoYykgJiYgdCAmJiBjICYmIDAuNSA8PSBhLnoucSh0LmN1bXVsUmVjdCwgYy5jdW11bFJlY3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAwLjAxICogYS53aWR0aCwgYyA9IDAuMDEgKiBhLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sZWZ0ICsgYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnRvcCArIGMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sZWZ0ICsgKGEucmlnaHQgLSBhLmxlZnQpIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnRvcCArIChhLmJvdHRvbSAtIGEudG9wKSAvIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucmlnaHQgLSBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYm90dG9tIC0gYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbXSwgZCA9IGEuZy5oKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBkICYmIChlID0gZihmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBnKG5ldyBhLnouaihiKSkudmlzaWJsZVJlY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgYS56LmooYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Q6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWU6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jOiBjLm93bmVyRG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS51bnNoaWZ0KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Q6IGcobmV3IGEuei5qKGIpKS52aXNpYmxlUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jOiBiLm93bmVyRG9jdW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCA9IDA7IGQgPCBlLmxlbmd0aDsgZCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHAoZVtkXS5yZWN0KSwgayA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gaC50bFswXSB8fCAwICE9IGgudGxbMV0gfHwgMCAhPSBoLmJyWzBdIHx8IDAgIT0gaC5iclsxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayAmJiBsKGIsIGgsIGVbZF0uZG9jLCBlW2RdLmZyYW1lLCBjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLnogPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgcSA9IGEuYy5jLCB5ID0ge307CiAgICAgICAgICAgICAgICAgICAgYS56LmEgPSAwLjU7CiAgICAgICAgICAgICAgICAgICAgYS56LmIgPSAwLjM7CiAgICAgICAgICAgICAgICAgICAgYS56LmMgPSAwLjk4OwogICAgICAgICAgICAgICAgICAgIGEuei5kID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIGEuei5lID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMgfHwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBlLmFvLnNraW4gPyBhLnouZihlLCBoKSA6IGQoZSwgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmlzVmlzaWJsZSA9IGMgPyBnLnBlcmN2ID4gYiA6IGcucGVyY3YgPj0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZWxHZW8gJiYgKGcuZWxHZW8udGhyZXNob2xkID0gYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuei5mID0gZnVuY3Rpb24gKGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmlzTXVsdGlwYXJ0QWQgJiYgYy5tdWx0aXBhcnRDb21wb25lbnRzICYmIDAgPCBjLm11bHRpcGFydENvbXBvbmVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgYiA9IDAsIGcgPSAwOyBnIDwgYy5tdWx0aXBhcnRDb21wb25lbnRzLmxlbmd0aDsgZysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZChjLm11bHRpcGFydENvbXBvbmVudHNbZ10sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnZpc2libGVBcmVhID49IGIgJiYgKGIgPSBmLnZpc2libGVBcmVhLCBhID0gYy5tdWx0aXBhcnRDb21wb25lbnRzW2ddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoYSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmlzQ29tcG9zaXRlQWQgJiYgYy5jb21wb25lbnRzICYmIDEgPCBjLmNvbXBvbmVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVBcmVhOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmN2OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVSZWN0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bFJlY3Q6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlNaW5NYXg6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsR2VvOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZXN1bHRzOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiwgbCA9IDA7IGwgPCBjLmNvbXBvbmVudHMubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBkKGMuY29tcG9uZW50c1tsXSwgZSksIGguYXJlYSArPSBmLmFyZWEsIGgudmlzaWJsZUFyZWEgKz0gZi52aXNpYmxlQXJlYSwgaC5jb21wb25lbnRSZXN1bHRzLnB1c2goZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5wZXJjdiA9IGgudmlzaWJsZUFyZWEgLyBoLmFyZWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jb21wb3NpdGVBZEFyZWFQeCA9IGguYXJlYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZiA9IGIoaC5jb21wb25lbnRSZXN1bHRzKSkgJiYgJ3N0cmljdCcgPT09IGEudy5iKGMuenIpICYmIGEuay5hLnpheHMoJ3JlY3RzQXZhaWxhYmxlJywgYy56ciwgZi5lbFJlY3QsIGYudmlzaWJsZVJlY3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGQoYywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjLnZpZXdhYmlsaXR5TWV0aG9kLnN0cmljdCB8fCAoYy52aWV3YWJpbGl0eU1ldGhvZC5zdHJpY3QgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT0gYy5hby5za2luKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHt9LCBsID0gYS5jLmUuc2Nyb2xsWSB8fCBhLmMuZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd3aWR0aCcgPT0gYS54LmIgJiYgYS54LmMgPD0gYy5hZENvbnRlbnQgJiYgNDUgPCBsIHx8ICFhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5pc1Zpc2libGUgPSAhMSwgZi5pc0Z1bGx5VmlzaWJsZSA9ICExLCBmLnBlcmN2ID0gMCwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXNWaXNpYmxlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmlzRnVsbHlWaXNpYmxlID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmlzRGVudHN1VmlzaWJsZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5wZXJjdiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdhZEVkZ2VzVmlld1N0YXR1cycsIGMuenIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBjLmlzTXVsdGlwYXJ0QWQgPyBoKGMsIGUpIDogYy5pc0NvbXBvc2l0ZUFkID8gZyhjLCBlKSA6IGQoYywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpY3QnID09PSBhLncuYihjLnpyKSAmJiBhLmMuYyAmJiAhYS5jLmNlKCkgJiYgYS5rLmEuemF4cygncmVjdHNBdmFpbGFibGUnLCBjLnpyLCBmLmN1bXVsUmVjdCwgZi52aXNpYmxlUmVjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gYS56LmcoZiwgYyksIHAgPSBhLnouYzsKICAgICAgICAgICAgICAgICAgICAgICAgZi5pc1Zpc2libGUgPSBmLnBlcmN2ID49IGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGYuaXNGdWxseVZpc2libGUgPSBmLnBlcmN2ID49IHA7CiAgICAgICAgICAgICAgICAgICAgICAgIGYuZWxHZW8gJiYgKGYuZWxHZW8udGhyZXNob2xkID0gbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMudmlkZW9Jc0Z1bGxzY3JlZW4gJiYgMCA8IGYucGVyY3YgJiYgKGYuaXNWaXNpYmxlID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAwLjggPD0gZi5wZXJjdiAmJiAoZi5pc0RlbnRzdVZpc2libGUgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuei5kID8gZi5wZXJjdiA+IGEuei5kICYmIChhLnouZCA9IGYucGVyY3YpIDogYS56LmQgPSBmLnBlcmN2OwogICAgICAgICAgICAgICAgICAgICAgICBjLkFEX1JFQ1QgPSBmICYmIGYucmVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnouZyA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmFhLmEoYi5hcmVhKSA/IChjLnZpZXdzdGF0cyB8fCAoYy52aWV3c3RhdHMgPSB7fSksIGMudmlld3N0YXRzLmlzQmlnQWQgPSAhMCwgYS56LmIpIDogYS56LmE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnouaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnouaSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgYS56LmsgPSBrOwogICAgICAgICAgICAgICAgICAgIGEuei5sID0gYS5jLnI7CiAgICAgICAgICAgICAgICAgICAgYS56LmogPSBmdW5jdGlvbiAoYiwgYywgZSwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWN0ID0gZSB8fCBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY3QgPSBlIHx8IGIgJiYgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogYi5vZmZzZXRUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogYi5vZmZzZXRMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBiLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYi5vZmZzZXRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBiLm9mZnNldFRvcCArIGIub2Zmc2V0SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBiLm9mZnNldExlZnQgKyBiLm9mZnNldFdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAnbGVmdCByaWdodCB0b3AgYm90dG9tIHdpZHRoIGhlaWdodCcuc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChkID0gMDsgZCA8IGUubGVuZ3RoOyBkKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gZVtkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbZ10gPSB0aGlzLnJlY3RbZ107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiBiLkNMSVBDSEVDS0lOR1RBUkdFVCAmJiBiLkNMSVBDSEVDS0lOR1RBUkdFVC5zdHlsZSAmJiAnYWJzb2x1dGUnID09PSBiLkNMSVBDSEVDS0lOR1RBUkdFVC5zdHlsZS5wb3NpdGlvbiAmJiAoZSA9IGEuYS5jdChiLkNMSVBDSEVDS0lOR1RBUkdFVC5zdHlsZS5jbGlwKSkgJiYgKHRoaXMucmlnaHQgPSB0aGlzLmxlZnQgKyBlLnJpZ2h0LCB0aGlzLmxlZnQgKz0gZS5sZWZ0LCB0aGlzLmJvdHRvbSA9IHRoaXMudG9wICsgZS5ib3R0b20sIHRoaXMudG9wICs9IGUudG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMucmlnaHQgLSB0aGlzLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5ib3R0b20gLSB0aGlzLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbCA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2luID0gYyB8fCBiICYmIGEuYS5iZShiKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VSZWZlcmVuY2VGcmFtZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQgKz0gYS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yaWdodCArPSBhLmxlZnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcCArPSBhLnRvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm90dG9tICs9IGEudG9wOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGNBcmVhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0KSAqICh0aGlzLmJvdHRvbSAtIHRoaXMudG9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRWaWV3cG9ydFJlY3QgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmMucih0aGlzLndpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYmIChiLndpZHRoIDwgYy53aWR0aCAmJiAoYy53aWR0aCA9IGIud2lkdGgsIGMucmlnaHQgPSBjLmxlZnQgKyBjLndpZHRoKSwgYi5oZWlnaHQgPCBjLmhlaWdodCAmJiAoYy5oZWlnaHQgPSBiLmhlaWdodCwgYy5ib3R0b20gPSBjLnRvcCArIGMuaGVpZ2h0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuei5uID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnID09PSB0eXBlb2YgYSA/ICExIDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogTnVtYmVyKGIpICsgTnVtYmVyKGEubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogTnVtYmVyKGIpICsgTnVtYmVyKGEucmlnaHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBOdW1iZXIoYykgKyBOdW1iZXIoYS50b3ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBOdW1iZXIoYykgKyBOdW1iZXIoYS5ib3R0b20pCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnoubSA9IGZ1bmN0aW9uIChiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGIgfHwgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGMoYi5sZWZ0LCBiLnJpZ2h0LCBlLmxlZnQsIGUucmlnaHQpLCBoID0gYyhiLnRvcCwgYi5ib3R0b20sIGUudG9wLCBlLmJvdHRvbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYS56Lmoodm9pZCAwLCB2b2lkIDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IGRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodDogZFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogaFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbTogaFsxXQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuei5vID0gZnVuY3Rpb24gKGIsIGMsIGUsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICFjIHx8ICFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gYS56LmkoYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGQgfHwgYS56Lm0oYywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuei5uKGIudmlzaWJsZVJlY3QsIGMubGVmdCwgYy50b3ApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA/IChlID0gYS56Lm0oZCwgZSkpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlY3Q6IGEuei5uKGIuY3VtdWxSZWN0LCBjLmxlZnQsIGMudG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVSZWN0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlYTogYi5hcmVhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY1Zpc2libGVQZXJjdjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy52aXNpYmxlUmVjdC5yaWdodCAtIHRoaXMudmlzaWJsZVJlY3QubGVmdCkgKiAodGhpcy52aXNpYmxlUmVjdC5ib3R0b20gLSB0aGlzLnZpc2libGVSZWN0LnRvcCkgLyB0aGlzLmFyZWE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiAhMSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS56LnAgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICBiIHx8IChiID0gd2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIGUgPSBiLmRvY3VtZW50LmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQnID09PSBhID8gYi5wYWdlWE9mZnNldCB8fCBjICYmIGMuc2Nyb2xsTGVmdCB8fCBlICYmIGUuc2Nyb2xsTGVmdCA6IGIucGFnZVlPZmZzZXQgfHwgYyAmJiBjLnNjcm9sbFRvcCB8fCBlICYmIGUuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuei5pID0gZDsKICAgICAgICAgICAgICAgICAgICBhLnouciA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYi5hYTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIuenI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLnEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHQoYywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBnKG5ldyBhLnouaihjKSkudmlzaWJsZVJlY3QsIGUgPSBwKGUpLCBjID0gbChjLCBlLCBhLmMuZS5kb2N1bWVudCwgbnVsbCwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS56LnMgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA/IChhLnJpZ2h0IC0gYS5sZWZ0KSAqIChhLmJvdHRvbSAtIGEudG9wKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS56LnQgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuZGIoYikgfHwgJ3N0cmluZycgPT09IHR5cGVvZiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gdHlwZW9mIGIgJiYgYyhiLmxlZnQpICYmIGMoYi5yaWdodCkgJiYgYyhiLnRvcCkgJiYgYyhiLmJvdHRvbSkgPyAhMCA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS56LnEgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuei50KGIpIHx8ICFhLnoudChjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhLnoubShiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuei5zKGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jYWxjQXJlYSgpIC8gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2FkS2lsbGVkJywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAhYS5lcCAmJiBkZWxldGUgeVthLnpyXTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gMCwgZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAgPCBnIC0gYyAmJiAoZCA9IGEuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgYyA9IGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYikgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgYi5vdmVycmlkZVZpZXdNZXRob2QgJiYgKGEudmlld2FiaWxpdHlNZXRob2RbeV0gPSBiLm92ZXJyaWRlVmlld01ldGhvZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGIuaXNWaXNpYmxlRm4sIGcgPSBiLmlzTWVhc3VyYWJsZUZuLCBwID0gYi5wYXVzZUNoZWNraW5nRm4sIGsgPSBiLmNhcmVGb2MsIHEgPSBiLnFzS2V5cywgeSA9IGIuY291bnRlckxhYmVsLCB4ID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmFtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10sIG0gPSBkLCBJID0gMCwgRyA9IDAsIEogPSAwLCBDID0gMCwgeiA9IDAsIEsgPSAwLCBFID0gMCwgUCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9ICExLCBIID0gITEsIHIgPSAhMSwgdSA9ICExLCBHYSwgUSwgQiwgVCwgbGEgPSAwLCBEID0gMCwgRiA9ICExLCBNID0gITEsIEwgPSAwLCBPID0gMCwgeWEgPSAwLCBSID0gITEsIEhhID0gITEsIGVhID0gITEsIFUgPSBhLmMuYywgbWEsIHVhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBZID0gJ2FzJywgWiA9ICdhZycsIE4gPSAnYW4nLCBhYSA9ICdjaycsIGZhID0gJ2t3JywgViA9ICdhaCcsIGdhID0gJ2FqJywgVyA9ICdwZycsIFggPSAncGYnLCBoYSA9ICdnaScsIGJhID0gJ2dmJywgY2EgPSAnaXgnLCBpYSA9ICdnZycsIGRhID0gJ2V6JywgRiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSBxID8gKFkgPSAnY2MnLCBaID0gJ2J3JywgTiA9ICdieCcsIGFhID0gJ2NpJywgZmEgPSAnanonLCBWID0gJ2J1JywgZ2EgPSAnZGonKSA6IDIgPT09IHEgPyAoWSA9ICdjZycsIFogPSAnY2UnLCBOID0gJ2NmJywgYWEgPSAnY2onLCBmYSA9ICd0cycsIFYgPSAnYWgnLCBnYSA9ICdkaycsIGhhID0gJ2dqJywgYmEgPSAnZ2InLCBjYSA9ICdpZycsIGlhID0gJ2dlJywgZGEgPSAnZXonKSA6IDMgPT09IHEgPyAoWSA9ICdjZycsIFogPSAnY2UnLCBOID0gJ2NmJywgYWEgPSAnY2onLCBmYSA9ICd0cycsIFYgPSAnYWgnLCBnYSA9ICdkaycsIGhhID0gJ2dpJywgYmEgPSAnZ2YnLCBjYSA9ICdpeCcsIGlhID0gJ2dnJywgZGEgPSAnZXonKSA6IDUgPT09IHEgPyAoWSA9ICdhYScsIFogPSAnYWQnLCBOID0gJ2NuJywgYWEgPSAnY28nLCBmYSA9ICdjcCcsIFYgPSAnYWgnLCBnYSA9ICdjcScsIGhhID0gJ2duJywgYmEgPSAnZ2snLCBjYSA9ICdpaycsIGlhID0gJ2dsJywgZGEgPSAnZXonKSA6IDYgPT09ICgnbnVtYmVyJyA9PT0gdHlwZW9mIHEgPyBxIDogcS50eXBlKSAmJiAoWSA9IHEub3RzS2V5LCBaID0gcS5pdnRLZXksIE4gPSBxLmxhc3RpdnRLZXksIGFhID0gcS5pdnRBdE90c0tleSwgZmEgPSBxLnRpbWVUb1ZpZXdTZW5kS2V5LCBWID0gcS50aW1lVG9WaWV3QXNrS2V5LCBnYSA9IHEudmlzT25Mb2FkS2V5LCBoYSA9IHEuZnVsbHlJdnRPdHNLZXksIGJhID0gcS5mdWxseUl2dEtleSwgY2EgPSBxLm1heGZ1bGx5SXZ0S2V5LCBpYSA9IHEubGFzdEZ1bGx5SXZ0S2V5LCBkYSA9IHEud2FzUGFydGlhbGx5SW52aWV3S2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRMYWJlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChuLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09PSBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA9ICEwLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCBuLnB1c2goYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiwgYyA9IG4ubGVuZ3RoOyBiIDwgYzsgYisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMSwgZCA9ICExLCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaCBpbiBuW2JdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCB8fCAoZCA9ICEwKSwgbltiXVtoXSAhPT0gYVtoXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmICFlICYmIG4uc3BsaWNlKGIsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhZE9UUyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhZEZ1bGxPVFMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYWRGSVQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IEc7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFkVmlkZW8yU2VjT1RTID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9IHR5cGVvZiBfaGFkVmlkZW8yU2VjT3RzICYmIF9oYWRWaWRlbzJTZWNPdHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFkRGVudHN1VmlkZW9PVFMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFkRGVudHN1RGlzcGxheU9UUyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEluVmlld1RpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRGdWxseUluVmlld1RocmVzaG9sZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjk4OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldExhc3RJbnZpZXdQZXJjZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEw7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TGFzdEludmlld1BlcmNlbnRXaXRoVGhyZXNob2xkQ2FwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuOTggPD0gTCA/IDEgOiBMOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENhcmVBYm91dEZvY3VzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGs7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGF1c2VDaGVja2luZ0ZuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bGx5VmlzaWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBIOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhc1BhcnRpYWxseUludmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEZ1bGxJbnZpZXdUaW1lVG90YWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYXhpbXVtQ29udGludW91c0luVmlld1RpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdy5tYXgoeiwgSyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWF4aW11bUNvbnRpbnVvdXNGdWxseUluVmlld1RpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdy5tYXgoUCwgRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGVudHN1SW5WaWV3VGltZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERlbnRzdUF1ZGlibGVBbmRWaXNpYmxlVGltZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWRNZWFzdXJhYmxlID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGcgJiYgZyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgYS5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpICYmIChiID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRTdGFydGVkT25TY3JlZW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoYiwgZCwgaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVhID09PSBoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhID0gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSAnZnVuY3Rpb24nID09PSB0eXBlb2YgZyAmJiBnKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiBiLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkgJiYgKGggPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBJIHx8IDAsIEogPSBHIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IGMoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDLnJlY3QgJiYgKGIuZWxlbWVudFJlY3QgPSBDLnJlY3QsIGIuY3VycmVudFdpZHRoID0gYi5lbGVtZW50UmVjdC5yaWdodCAtIGIuZWxlbWVudFJlY3QubGVmdCwgYi5jdXJyZW50SGVpZ2h0ID0gYi5lbGVtZW50UmVjdC5ib3R0b20gLSBiLmVsZW1lbnRSZWN0LnRvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnZpZXdhYmlsaXR5UGVyY2VudFt4XSA9IGEuYS5kYihDLnBlcmN2KSA/IHcucm91bmQoMTAwICogQy5wZXJjdikgOiAnLSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PT0gdHlwZW9mIEMuYXJlYSAmJiAoYi5BREFSRUEgPSBDLmFyZWEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHkgPSBDLmlzVmlzaWJsZSwgQSA9IEMuaXNGdWxseVZpc2libGUsIEQgPSBDLmlzRGVudHN1VmlzaWJsZSwgTiA9IEMucGVyY3YgJiYgMCA8IEMucGVyY3Y7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMID0gQy5wZXJjdjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtICYmIEMucGVyY3YgJiYgYS5rLmEuemF4cygnYWRFbnRlcnNWaWV3JywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUyA9IHAoYiksIFMgPSAoIWsgfHwgYS5hYy5lKGIpKSAmJiAhUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ2FkQ2hlY2tpbmdTdGF0ZScsIGIsIHgsIFMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHkgJiYgUzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPSBBICYmIFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOID0gTiAmJiBTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAmJiBhLmsuYS56YXhzKCdhZEZ1bGx5VmlzaWJsZScsIGIsIHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWEgPSBEICYmIFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhTSAmJiBOICYmIChNID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgJiYgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJICs9IGQsIHogKz0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHkgfHwgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEID0gdy5yb3VuZChkIC8gMiksIEkgKz0gRCwgeiArPSBEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEgJiYgSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHICs9IGQsIEUgKz0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEEgfHwgSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEID0gdy5yb3VuZChkIC8gMiksIEcgKz0gRCwgRSArPSBEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVhICYmIEhhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gKz0gZCwgeWEgKz0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVhIHx8IEhhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgPSB3LnJvdW5kKGQgLyAyKSwgTyArPSBELCB5YSArPSBEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXIgJiYgMTAwMCA8PSB6ICYmIChoID0gciA9ICEwLCB0aGlzLnRpbWVUb1ZpZXcgPSBHYSA9IGIuY291bnRlcnMucXVlcnkoKVtWXSwgUSA9IEkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXUgJiYgMTAwMCA8PSBFICYmICh1ID0gITAsIGEuay5hLnpheHMoJ2Z1bGxPdHNSZWFjaGVkJywgYiwgeCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBCICYmIChEID0gYi5jb3VudGVycy5xdWVyeSgpLmJ1LCAxMDAwID49IEQgPyB5ICYmIChCID0gITApIDogQiA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnID09PSB0eXBlb2YgVCAmJiAoRCA9IGIuY291bnRlcnMucXVlcnkoKS5idSwgMTAwMCA+PSBEID8gTiAmJiAoVCA9ICEwKSA6IFQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYi5lbCA9IFUpICYmICd1bmRlZmluZWQnID09PSB0eXBlb2YgbWEgJiYgMiAhPT0gcSAmJiAzICE9PSBxICYmIEMuZWxHZW8gJiYgKEQgPSBmKCkueSArIEMuZWxHZW8uZm9sZFRvcCwgUyA9IEMuZWxHZW8udGhyZXNob2xkICogQy5lbEdlby5lbEhlaWdodCwgRCA9IEQgPiBhLncuYygpIC0gUywgMCA8IEMuZWxHZW8udG90YWxBcmVhICYmIChtYSA9IEQsIGIuZG4gPSBtYSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRiAmJiBOICYmIChsYSA9IHcubWluKHcubWF4KEwsIGxhKSwgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSyA8IHogJiYgKEsgPSB6KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgPCBFICYmIChQID0gRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5IHx8ICh6ID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIHx8IChFID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0geTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEggPSBBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCA8PSB5YSAmJiAoUiA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhIHx8ICh5YSA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGEgPSBlYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKG4sIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBDICYmIEMucGVyY3YsIGIgPSAnbnVtYmVyJyA9PT0gdHlwZW9mIGIgJiYgMTAwICogYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5vbkluVmlld1RpbWVDb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5vbkluVmlld1RpbWVDb3VudChkLCBJIC0gbSwgYiwgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEub25GdWxseUluVmlld1RpbWVDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHcubWF4KEcgLSBKLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5vbkZ1bGx5SW5WaWV3VGltZUNvdW50KGQsIGMsIGIsIHgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UVMgPSBmdW5jdGlvbiAoYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSiA+IEkgJiYgKEogPSBJKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMgPiBHICYmIChDID0gRyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW1ldID0gTnVtYmVyKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtaXSA9IEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW05dID0gSjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBxIHx8IDIgPT09IHEgfHwgMyA9PT0gcSB8fCA1ID09PSBxIHx8ICgnbnVtYmVyJyA9PT0gdHlwZW9mIHEgPyBxIDogcS50eXBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICYmIGhhICYmIChhW2hhXSA9IDEpLCBiID0gMCA9PT0gcSAmJiBjICYmICdzZnJhbWUnID09PSBjLCBiYSAmJiAhYiAmJiAoYVtiYV0gPSBHLCBhW2lhXSA9IEMsIGIgPSB0aGlzLmdldE1heGltdW1Db250aW51b3VzRnVsbHlJblZpZXdUaW1lKCksIGFbY2FdID0gYiwgeCA9PT0gYyAmJiAoYS5pYyA9IGIpKSwgTSAmJiBkYSAmJiAoYVtkYV0gPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgUSAmJiAoYVthYV0gPSBRKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgR2EgJiYgKGFbZmFdID0gR2EpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBCICYmIChhW2dhXSA9IE51bWJlcihCKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gRiAmJiAoYyA9IHcucm91bmQoMTAwICogbGEpLCBiID0gdy5yb3VuZCgxMDAgKiBEKSwgYVtXXSA9IGMsIGFbWF0gPSBiLCBEID0gbGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBtYSAmJiAoYS5pYiA9IE51bWJlcihtYSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSiA9IEk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDID0gRzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuZSwgYyA9IGIuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHk6IHZvaWQgMCAhPT0gYi5wYWdlWU9mZnNldCA/IGIucGFnZVlPZmZzZXQgOiAoYy5kb2N1bWVudEVsZW1lbnQgfHwgYy5ib2R5LnBhcmVudE5vZGUgfHwgYy5ib2R5KS5zY3JvbGxUb3AgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS53ID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSB7fSwgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEudy5jID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVSA/IGEuYy5yKGEuYy5lKS5oZWlnaHQgOiA3NTA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLncuZCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYi56cjsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRLaWxsZWQnLCBhLncuYSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb246IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuenIgPT0gYi56cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGdbZV0gPSBnW2VdIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBiLnZpZXdzdGF0cyA9IHsgaXNCaWdBZDogITEgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmRsKCkgfHwgYS5jLmFtKCkuaXNJbkFwcCAmJiBhLmMuYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBrKGEuei5mKSwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jZSgpIHx8IGEuYWIgJiYgYS5hYi5hKCkgPyBhLmMuY3koKSB8fCBhLmMuY3goKSAmJiBhLmMuYW0oKSA6IGYgPSBuZXcgZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlRm46IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZWFzdXJhYmxlRm46IGEuYy5kbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXVzZUNoZWNraW5nRm46IGEuYWMuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJlRm9jOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxc0tleXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckxhYmVsOiAnc3RyaWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmIChnW2VdLnN0cmljdCA9IGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IG5ldyBkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGVGbjogaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lYXN1cmFibGVGbjogYS5jLmRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdXNlQ2hlY2tpbmdGbjogYS5hYy5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmVGb2M6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzS2V5czogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyTGFiZWw6ICdsYXgnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdbZV0ubGF4ID0gaDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCAhPT0gYi5pc1NraW4gJiYgYS5tICYmIGEubS5hKCkgJiYgKGggPSBuZXcgZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWaXNpYmxlRm46IGEubS5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVhc3VyYWJsZUZuOiBhLmMuZHEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VDaGVja2luZ0ZuOiBhLmFjLmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZUZvYzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNLZXlzOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJMYWJlbDogJ3BzY29wZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnW2VdLnBzY29wZSA9IGgpOwogICAgICAgICAgICAgICAgICAgICAgICBhLm8gJiYgYS5vLmIoKSAmJiAhZ1tlXS5wc2NvcGUgJiYgKGggPSBuZXcgZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Zpc2libGVGbjogYS5vLmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01lYXN1cmFibGVGbjogYS5jLmRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VDaGVja2luZ0ZuOiBhLmFjLmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJlRm9jOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzS2V5czogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJMYWJlbDogJ3BzY29wZScKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGdbZV0ucHNjb3BlID0gaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBhLmsuYS5henN4KCd2aWV3OnRpY2snLCBhLmEuZGYoW2JdLCBhLncuZSksIHsgcHJpb3JpdHk6IDUgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNbYi56cl0gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCd2aWV3Q291bnRlclN0YXJ0ZWQnLCBiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5mID0gZnVuY3Rpb24gKGIsIGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiYgYyAmJiBkID8gKGIgPSBhLncuZyhiLnpyLCBjKSkgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgYltkXSAmJiBiW2RdKCkgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5oID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBhLmMuZWkoKSwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjLnNmcmFtZSAmJiBoICYmIChmID0gaC5tZWFzdXJhYmxlRm4sIGggPSBoLm5hbWUsIGdbYi56cl0uc2ZyYW1lID0gbmV3IGQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmlzaWJsZUZuOiBhLmFkLmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNZWFzdXJhYmxlRm46IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VDaGVja2luZ0ZuOiBhLmFjLmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld2FiaWxpdHlBcGlOYW1lOiBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmVGb2M6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzS2V5czogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyTGFiZWw6ICdzZnJhbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5rLmEuemF4cygndmlld0NvdW50ZXJTdGFydGVkJywgYikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLncuZSA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuY3EoYikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZ1tiLnpyXSwgcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudy5oKGIsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaGFzT3duUHJvcGVydHkoaykgJiYgZltrXS51cGRhdGUoYiwgYywgZCkgJiYgKHAgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmZpcmVGdWxsVmlld0V2ZW50ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChiLnNlY29uZGFyeUNvdW50ZXJzLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudXBkYXRlKGIsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmZpcmVGdWxsVmlld0V2ZW50ICYmIChhLmFjLmIoYiksIGIuZmlyZUZ1bGxWaWV3RXZlbnQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICYmIGEuYWMuYyhiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuYihiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYW8gJiYgMSA9PSBiLmFvLnNraW4gJiYgJ3dpZHRoJyA9PSBhLnguYiAmJiBhLnguZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kLmUoYikgJiYgYS5hYy5kKGIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLncuaSA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLncuaihiKSA+PSBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LmogPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIChiID0gYiAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGIuenIgJiYgYS53ICYmIGEudy5rKGIuenIpKSAmJiAoYyA9IGIuZ2V0SW5WaWV3VGltZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLncubCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdoYWRPVFMnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53Lm0gPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIGIgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGIuenIgPyBjID8gYS53LmYoYiwgYywgZCkgOiBhLncuZihiLCBhLncuYihiLnpyKSwgZCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53Lm4gPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5vKGIuenIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5vICYmIGEuby5hICYmIGQgJiYgZC5wc2NvcGUgJiYgZC5wc2NvcGVbYyA/ICdoYWRWaWRlbzJTZWNPVFMnIDogJ2hhZE9UUyddKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLncucCA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS53Lm8oYi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm8gJiYgYS5vLmEgJiYgZCAmJiBkLnBzY29wZSAmJiBkLnBzY29wZVtjID8gJ2hhZERlbnRzdVZpZGVvT1RTJyA6ICdoYWREZW50c3VEaXNwbGF5T1RTJ10oKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5xID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLncgJiYgYS53Lm8oYi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm8gJiYgYS5vLmEgJiYgZCAmJiBkLnBzY29wZSAmJiBkLnBzY29wZS5nZXRGdWxsSW52aWV3VGltZVRvdGFsKCkgPj0gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5yID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAoYiA9IGIgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiLnpyICYmIGEudyAmJiBhLncuayhiLnpyKSkgJiYgKGMgPSBiLmdldEZ1bGxJbnZpZXdUaW1lVG90YWwoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LnMgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS53LnIoYikgPj0gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5hID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGdbYi56cl07CiAgICAgICAgICAgICAgICAgICAgICAgIGMuaGFzT3duUHJvcGVydHkoYi56cikgJiYgYS5rLmEuc3hheigndmlldzp0aWNrJywgeyBpZDogY1tiLnpyXSB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudy5vID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGdbYV0gPyBjID0gZ1thXSA6IGdbYV0gPSBjID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LmcgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5vKGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCAmJiBkW2NdOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LnQgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgZCwgZzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICFiLnN0cmljdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYy5hbSgpLmlzSW5BcHA7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhLmMuY3EoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuYy5jdygpOwogICAgICAgICAgICAgICAgICAgICAgICBnID0gYS5jLmN1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjICYmIGEuYy5jIHx8IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIGMgfHwgIShiIHx8IGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LmIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gbnVsbCwgcCA9IGdbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLncudChwKSA/IGYgPSAnc3RyaWN0JyA6IHAgJiYgcC5zZnJhbWUgPyBmID0gJ3NmcmFtZScgOiBwICYmIHAucHNjb3BlICYmIChmID0gJ3BzY29wZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIEIgJiYgQltjXSkgJiYgcC5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpICYmIChmID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmQuYygpICYmICFkICYmIChmID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICE9IGYgJiYgKGIgPSBmLCBhLmsuYS5lc2dmKCdwcmVmZXJyZWRWaWV3Q291bnRlclVwZGF0ZScsIEJbY10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLncuayA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBCICYmIEJbYl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCB8fCAhZC5pc01lYXN1cmFiaWxpdHlEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5iKGIsIGMpLCBmID0gZ1tiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5kLmMoKSB8fCBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmICYmIGQgJiYgZltkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS53LnUgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHt9LCBmID0gZ1tiXSwgcCA9IGEudy5iKGIpLCBrOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgaW4gZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaGFzT3duUHJvcGVydHkoaykgJiYgZltrXS5nZXRRUyhkLCBjLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5jKGIsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFlLmEoYiwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudy5rKGIpICYmIGEudy5rKGIpLmhhZERlbnRzdURpc3BsYXlPVFMoKSAmJiAoZC5uYiA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAoZiA9IEJbYl0pICYmIGYudmlld3N0YXRzICYmIGYudmlld3N0YXRzLmlzQmlnQWQgJiYgKGQuZWwgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5hZiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWYuYSA9IGZ1bmN0aW9uIChhLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmOwogICAgICAgICAgICAgICAgICAgICAgICBkLm91dGVySFRNTCA/IGYgPSBkLm91dGVySFRNTCA6IChmID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIGYuYXBwZW5kQ2hpbGQoZC5jbG9uZU5vZGUoITApKSwgZiA9IGYuaW5uZXJIVE1MKTsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9mbGFzaHZhcnNccyo9XHMqKCIuKj8ifCcuKj8nKS9pLmV4ZWMoZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvbmFtZVxzKj1ccypbIiddZmxhc2h2YXJzWyInXVxzKnZhbHVlXHMqPVxzKigiLio/InwnLio/JykvaS5leGVjKGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgL3ZhbHVlXHMqPVxzKigiLio/InwnLio/JylccypuYW1lXHMqPVxzKlsiJ11mbGFzaHZhcnNbIiddL2kuZXhlYyhmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZywgYywgYiA9IHt9LCBlID0gMDsgZSA8IGYubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZyA9IGZbZV0pICYmICdvYmplY3QnID09PSB0eXBlb2YgZyAmJiBnWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnWzFdLnJlcGxhY2UoLyZhbXA7L2csICcmJykucmVwbGFjZSgvJnF1b3Q7L2csICciJykucmVwbGFjZSgvXiIvZywgJycpLnJlcGxhY2UoLyIkL2csICcnKS5yZXBsYWNlKC9eJy9nLCAnJykucmVwbGFjZSgvJyQvZywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnLnNwbGl0KCc/JylbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnLnNwbGl0KCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaCA9IDA7IGggPCBnLmxlbmd0aDsgaCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gZ1toXS5zcGxpdCgnPScpLCAyID4gYy5sZW5ndGggfHwgJ2Z1bmN0aW9uJyA9PSBjWzBdLnNsaWNlKDAsIDgpIHx8IChiW2NbMF1dID0gW2NbMV1dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBhLnggPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLnguZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEueC5iID0gJ2RpdnMnOwogICAgICAgICAgICAgICAgICAgIGEueC5lLmEgfHwgKGEueC5iID0gJ3dpZHRoJywgYS54LmUuYSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMDAwOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGEueC5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGEuYy5lLCBkID0gYS5jLnEgJiYgay5kb2N1bWVudCB8fCBkb2N1bWVudCwgZiA9IGQuZG9jdW1lbnRFbGVtZW50LCBkID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS54LmMgPSBrICYmIGsuaW5uZXJXaWR0aCB8fCBmICYmIGYuY2xpZW50V2lkdGggfHwgZCAmJiBkLmNsaWVudFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueC5hID0gZnVuY3Rpb24gKGssIGQsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdkaXZzJyA9PSBhLnguYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuX010X3dJQykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5fTXRfd09DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gZi5jdXJyZW50VGFyZ2V0LCBjID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZiA9IDA7IDEwMDAgPiBmICYmICFhLmEuYXgoZCwgYyk7IGYrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IGcgfHwgbnVsbCA9PSBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5fTXRfd09DID0gITAsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5fTXRfd0lDID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd3aWR0aCcgPT0gYS54LmIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBkIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBhLnguYyAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gZi5jbGllbnRYOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGYuY2xpZW50WTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5jLmUuc2Nyb2xsWSB8fCBhLmMuZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEueC5jID4gZCAmJiAoYyA+IGcgKyBrIHx8IGMgPCBnIC0gaykgfHwgOTAgPiBmICsgYiA/ICExIDogITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdhZC1lbHMnID09PSBhLnguYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuX010X3dJQykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5fTXRfd09DKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBmLmN1cnJlbnRUYXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZiA9IDA7IDEwMDAgPiBmOyBmKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmF4KGQsIGMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5fTXRfd09DID0gITAsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IGcgfHwgbnVsbCA9PSBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gYy5wYXJlbnRFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsuX010X3dJQyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5hZyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBrID0gW107CiAgICAgICAgICAgICAgICAgICAgYS5hZy5hID0gZnVuY3Rpb24gKGEsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgay5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGYKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAnJzsgMCA8IGM7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gYS5mLmEoW2MgJSA2Ml0pLCBjID0gdy5mbG9vcihjIC8gNjIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0aG9kczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGMuc3BsaXQoJy4nKSwgZCA9IGEsIGggPSBlWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPCBlLmxlbmd0aCAmJiAoZCA9IGVbMF0sIGggPSBlWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVtkXS5oYXNPd25Qcm9wZXJ0eShoKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoITEpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYy5zcGxpdCgnLicpLCBkID0gYSwgaCA9IGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8IGUubGVuZ3RoICYmIChkID0gZVswXSwgaCA9IGVbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGFbZF0pW2hdLmdldC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLnNwbGl0KCcuJyksIGQgPSBhLCBoID0gZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDwgZS5sZW5ndGggJiYgKGQgPSBlWzBdLCBoID0gZVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYVtkXSlbaF0uZ2V0LnRvU3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk1ldGhvZHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLkZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGIudG9TdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCdwcm90b3R5cGUnIGluIGEpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICghMSkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGggPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGcgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcxXycgKyBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9ICcnLCBjID0gZS5jb25jYXQoaCksIGQgPSAwOyBkIDwgYy5sZW5ndGg7IGQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gY1tkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IGFbZ10sIGYgPSAwOyBmIDwgZy5sZW5ndGg7IGYrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgKz0gZ1tmXSArICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSB7fSwgaCA9IGMod2luZG93KSwgZiA9IHt9LCBsID0gMDsgbCA8IGUubGVuZ3RoOyBsKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZltlW2xdXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGcubGVuZ3RoOyBsKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGdbbF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtrXSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDID0gaC5mdW5jdGlvbk1ldGhvZHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5oYXNPd25Qcm9wZXJ0eShrKSAmJiAoQyA9IGgucHJvcGVydHlNZXRob2RzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB6LCB5ID0gd2luZG93LCBFID0gay5zcGxpdCgnLicpLCBQID0gMDsgUCA8IEUubGVuZ3RoOyBQKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geVtFW1BdXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBDLmxlbmd0aDsgeSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IENbeV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFba10ucHVzaChiKGQodih6LCBrKS5yZXBsYWNlKC9cLS9nLCAnJTJEJykucmVwbGFjZSgvXHMqL2csICcnKSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2tdLnB1c2goJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2tdLnB1c2goJ0UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gMCwgYyA9IGEubGVuZ3RoLCBlLCBkOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IDA7IGUgPCBjOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYS5jaGFyQ29kZUF0KGUpLCBiID0gKGIgPDwgNSkgLSBiICsgZCwgYiAmPSBiOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiA+Pj4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmcuZCh3aW5kb3cudG9wKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBbXSwgZSA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBkID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGggPSAnXCcnICsgZSArICctJyArIGQgKyAnOi8vXCddJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b3AuZG9jdW1lbnQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHdpbmRvdy50b3AuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCAmJiAoYyA9IHdpbmRvdy50b3AuZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NyY149JyArIGggKyAnLFtkYXRhXj0nICsgaCArICcsW2hyZWZePScgKyBoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICE9PSBjLmxlbmd0aCAmJiB3aW5kb3cuU3RyaW5nICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB3aW5kb3cuU3RyaW5nLnByb3RvdHlwZS5tYXRjaCAmJiBhLmEuZm9yRWFjaChjLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gYS5vdXRlckhUTUwubWF0Y2goJ1thLXpdKz0iJyArIGUgKyAnLScgKyBkICsgJzovLyhbYS16XSspJykpICYmIDEgPCBhLmxlbmd0aCAmJiAtMSA9PT0gYi5pbmRleE9mKGFbMV0pICYmIGIucHVzaChhWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBiLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LlN0cmluZyAmJiB3aW5kb3cuU3RyaW5nLnByb3RvdHlwZS5zbGljZSAmJiAoYyA9IGMuc2xpY2UoMCwgMTUwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmYuaShjKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhhLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfYzcyNjk2MGQ3M2RlYTIxYyA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYzcyNjk2MGQ3M2RlYTIxYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja183MjM1ZWE3MTFlNDQzN2RhLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5zcGxpdChoKSwgZiA9IGMgfHwgd2luZG93LCBsLCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZy5sZW5ndGg7IG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGdbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZiB8fCB0eXBlb2YgZiA9PT0gYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmW2xdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZiA9PT0gYiA/IDIgOiBudWxsID09PSBmID8gMyA6IDQgKyBkKGEgKyBlICsgZi50b1N0cmluZygpKSAlIDU4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYzcyNjk2MGQ3M2RlYTIxYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fb2xkX2M3MjY5NjBkNzNkZWEyMWMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgYiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYyQkYicgIT09ICdjYWInLnJlcGxhY2UoJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyQkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBldmFsKCdjbGFzcyBBIHsgY29uc3RydWN0b3IocHApIHsgdGhpcy5wcCA9IHBwOyB9XG4gY2FsbCgpIHsgcmV0dXJuIHRoaXMucHA7IH1cbiB9XG4gY2xhc3MgQiBleHRlbmRzIEEgeyB0UyhhKSB7IHJldHVybiBzdXBlci5jYWxsKCk7IH1cbiB0VChhKXsgcmV0dXJuIHRoaXMuY2FsbCgpOyB9IH1cbiAgY29uc3Qgb2JqID0gbmV3IEIoImNhYiIpOyAgKG9iai50UygpICE9PSBvYmoudFQoKSk7ICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCgnXCdcXFxuXHJcJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCgnKChuZXcgRGF0ZSgiMTMwMC0wMi0yOFQyMToxMToxMS4wMDBaIikpLnRvSVNPU3RyaW5nKCkgIT09ICIxMzAwLTAyLTI4VDIxOjExOjExLjAwMFoiKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCgnKG5ldyBEYXRlKCIyODM1IikpLnRvSVNPU3RyaW5nKCkgIT09ICIyODM1LTAxLTAxVDAwOjAwOjAwLjAwMFoiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAhPT0gJzIyJy5sb2NhbGVDb21wYXJlKCcxMjInLCAnZGUnLCB7IG51bWVyaWM6ICEwIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3AnID09PSB3aW5kb3cuYXRvYignY2FiPT0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdjYWInICE9PSAnY2FiJy5zcGxpdCgvXGIvKS5wb3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gQXJyYXkucHJvdG90eXBlLmZpbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oJ01BWF9TQUZFX0lOVEVHRVInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC8oRykrfChYKStYLy50ZXN0KCdYICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2JlYycgIT0gJ2NhYmVjYWInLm1hdGNoKCcuP2UuPycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FiJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uc29ydChhLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBQcm94eShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0uY29uY2F0KGEpWzNdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZhbCgnbGV0IHggPSAoZSkgPT4geyBsZXQgZSA9IHRydWU7fTsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPT09IG5ldyBBcnJheUJ1ZmZlcig1KS5zbGljZSgzLCA0Mzk0ODc4Mzk4KS5ieXRlTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSAnMS0nOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGIubGVuZ3RoOyBjKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gKDAsIGJbY10pKCkgPyAnMScgOiAnMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICcyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKz0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5haCA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5CiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBlID0gYS5mLmEoWzc3XSksIGggPSBhLmYuYShbNzJdKSwgbDsKICAgICAgICAgICAgICAgICAgICBhLmFoLmEgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwICE9PSBsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5pKGwpOwogICAgICAgICAgICAgICAgICAgICAgICBsID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5jLmU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGUuZG9jdW1lbnQsIHkgPSBoLmJvZHksIHggPSBlLmlubmVyV2lkdGggfHwgaC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgeS5jbGllbnRXaWR0aCwgbiA9IGUuaW5uZXJIZWlnaHQgfHwgaC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IHkuY2xpZW50SGVpZ2h0LCBtID0gZS5vdXRlcldpZHRoIHx8IHkub2Zmc2V0V2lkdGgsIEkgPSBlLm91dGVySGVpZ2h0IHx8IHkub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBHID0gZS5zY3JlZW5YIHx8IGUuc2NyZWVuTGVmdCB8fCBlLnNjcmVlblgsIEogPSBlLnNjcmVlblkgfHwgZS5zY3JlZW5Ub3AgfHwgZS5zY3JlZW5ZOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSBuZXcgQSgpLmdldFRpbWV6b25lT2Zmc2V0KCksIHo7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC5ib2R5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgSyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLLndpZHRoID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsuaGVpZ2h0ID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEsuc3R5bGUubGVmdCA9ICctJyArIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLLnN0eWxlLnRvcCA9ICctJyArIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLLnN0eWxlLnBvc2l0aW9uID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoSyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gSzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRSA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIFAgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCB2ID0gITAgPT09ICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgZVtFXSB8fCAndW5kZWZpbmVkJyAhPSB0eXBlb2YgZVtQXSkgPyAxIDogMCwgSCwgdSA9IHosIHcgPSAvKD86TWFjIE9TIFggKShcZHsyfV9cZHsyfSkoPzouKlZlcnNpb25cLykoXGR7Mn0pLywgQiA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIFEgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBEID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgVCA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGxhID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBGID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgTSA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIEwsIE8sIFIsIFUsIFcsIFggPSAyLCBlYSA9IDIsIGphID0gMiwgbWEgPSBlLmRvY3VtZW50ICYmIGUuZG9jdW1lbnRbQl0gPyAxIDogMCwgdWEsIFksIFosIE4sIGFhID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgZmEgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LlN0cmluZyAmJiB3aW5kb3cuU3RyaW5nLnByb3RvdHlwZS5tYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFYgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IG51bGwgIT0gViAmJiAnMTBfMTInID09IFZbMV0gJiYgJzEwJyA9PSBWWzJdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZ2EgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgKyAnICcgKyBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkgKyAnICcgKyBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHFhID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDczLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pICsgJyAnICsgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHJhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKSwgaGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhdWRpbycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPID0gcmEuY2FuUGxheVR5cGUoZ2EpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gPSAnRSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSBoYS5jYW5QbGF5VHlwZShxYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9ICdFJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmEgPSBbXSwgY2EsIGlhOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgWSA9ICh1YSA9IHdpbmRvdy5uYXZpZ2F0b3JbTV0pICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzICYmIHZvaWQgMCAhPT0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobmF2aWdhdG9yKVtNXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yW1RdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWEgPSB3aW5kb3dbbGFdICYmIHdpbmRvd1tsYV0ucHJvdG90eXBlID09PSBuYXZpZ2F0b3JbVF0uX19wcm90b19fOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYSA9IHdpbmRvdy5uYXZpZ2F0b3JbVF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2EgPSBkYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMod2luZG93Lm5hdmlnYXRvcilbVF0gJiYgKFUgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeGEgPSAwOyB4YSA8IGNhICYmIDEwID4geGE7IHhhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhLnB1c2goZGFbeGFdLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFogPSBkKGJhLmpvaW4oJyonKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5uYXZpZ2F0b3JbVF1bYWFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiA9IHdpbmRvdy5uYXZpZ2F0b3JbVF1bYWFdKGZhKSA/IDAgOiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiA9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXID0gd2luZG93Lm5hdmlnYXRvcltGXSAmJiB3aW5kb3cubmF2aWdhdG9yW0ZdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhLmcuZCh3aW5kb3cudG9wKSB8fCAoamEgPSB3aW5kb3dbUV0gJiYgJ29iamVjdCcgPT09IHR5cGVvZiB3aW5kb3dbUV1bRF0gPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hID0gdS5jb250ZW50V2luZG93LCBYID0gKGVhID0gJ29iamVjdCcgPT09IHR5cGVvZiBuYVtRXSA/IDEgOiAwKSAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIG5hW1FdW0RdID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIEggPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTgogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvYSA9IFtdLCBrYSA9IDA7IDEwID4ga2E7IGthKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYS5wdXNoKEhba2FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhID0gbCwgc2EsIHRhID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMgJiYgQXJyYXkuZnJvbSAmJiBBcnJheS5mcm9tKHdpbmRvdy5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMpOwogICAgICAgICAgICAgICAgICAgICAgICBzYSA9IGQodGEgPyB0YS5qb2luKCcsJykgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhLm9sID0gc2E7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3YSA9IGwsIElhOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgSmEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgUyA9IHt9LCB6YSA9IDA7IHphIDwgSmEubGVuZ3RoOyB6YSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNbSmFbemFdXSA9IHdpbmRvdy5uYXZpZ2F0b3JbSmFbemFdXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElhID0gYS5mLmgoYS5mLmwoUykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJYSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhLnFuID0gSWE7CiAgICAgICAgICAgICAgICAgICAgICAgIGwudGYgPSBrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFYSA9IGwsIE9hLCBQYSA9ICd0b29sYmFyIHNjcm9sbGJhcnMgbG9jYXRpb25iYXIgbWVudWJhciBwZXJzb25hbGJhciBzdGF0dXNiYXInLnNwbGl0KCcgJyksIHBhID0gW10sIEFhLCBCYTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChCYSA9IDA7IEJhIDwgUGEubGVuZ3RoOyBCYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYSA9IFBhW0JhXSwgITAgPT09IHdpbmRvd1tBYV0udmlzaWJsZSA/IHBhLnB1c2goMSkgOiAhMSA9PT0gd2luZG93W0FhXS52aXNpYmxlID8gcGEucHVzaCgwKSA6IHZvaWQgMCA9PT0gd2luZG93W0FhXS52aXNpYmxlID8gcGEucHVzaCgyKSA6IHBhLnB1c2goMyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEucHVzaCg0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgT2EgPSBwYS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgRWEudmkgPSBPYTsKICAgICAgICAgICAgICAgICAgICAgICAgbC5yYyA9IG9hLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgbC5yYiA9ICcxLScgKyBhLmYuaShILmpvaW4oJywnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBGYSA9IGwsIFFhOwogICAgICAgICAgICAgICAgICAgICAgICBRYSA9ICdpc1NlY3VyZUNvbnRleHQnIGluIHdpbmRvdyA/IHdpbmRvdy5pc1NlY3VyZUNvbnRleHQgPyAxIDogMCA6IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIEZhLnNjID0gUWE7CiAgICAgICAgICAgICAgICAgICAgICAgIGwub3MgPSAnMS0nICsgZigpOwogICAgICAgICAgICAgICAgICAgICAgICBsLnFwID0gYS5mLm4uam9pbignJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhYiA9IGwsIEthOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUmEgPSB6OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBTYSA9IGEuZi5rKCcmXXhvdWwjKWtdbWRyY2ZheGd1bTpobV9tZlJfanJ1KlVjaFlxbkxeOnZ3amRtcWgxTSRiZ2VzNXtUfHIwaG1rbWhzXCcuYyBUfGRxLFlLSFlcXEdUTmBRVUJbXkdPPlxcSUNZQVlLWzJbOkZdR0BIPVdIMXtxZXJidm8wZXZmekcjaGxoejJcbnBvYU1saGxtaXRoNWBwYG4rJmZ7YHVheyl5cHxkO2NmbGtsayZNY25jaGZ4YnctcF11YjI1e2t2YnFSIGBwbEdZZmJxI046Uzc7NHlvbmVrXnpdemlNWnFZciVWTEc5RkJROTE3e2F8XFxscjBhXG5gblV5Ym9cJ3xSelxcLT94Z3Bjb2gzaXthIFg3bWNpbSlHaHpoc1xcIFxuI1hsYzJkaGhzaW0iSGYiZTdTR1RcXFxcVENPQDY6IWVcdCVtY3Jfd2I4NnpacGE9X25taXBwKUdpb2R5XCd8UnpcXC0/eWxyXXtidWJsZnQ4e3Fxbk1za2JcdClMTlAzWUBPRWNISztfOjE4bFh+ZW5LcV1sQnxZeW84Z29eciNDY2pndV9hY3FlaFZUaW5tdipLRUdCUkA2O3pmcmtwbXhgVV95ZHlbTjNjR01kdV96ZnZoem04Z29eciNDanldd2l7aW1IbF9+Z25GQ1BcXFBrZiBgfFwnelZ7XnVmMDtHO2A2WFtqZnhidy1uYXZkelxcNz5dTDxcXFVxL2ppZmpudCFISVogIFhwaHVwbW9WZnprb2shajtjZmxrbGsmT0hYOXZnfWducVVwIGlrRlxuZ29cJ1k2Zj1TP1E9VlleSlE7MzViRkxud2p8YnhHXHR0dl5gZnlcXC9RWUhTSV5JWFVZR1s4NUJVT05sdGhRXFxtXmBmeVxcL0xFRUhNXFw2SDtmRGQ/TitFT1tEeGNcbmtzZ3VDIWNmLEpHUU5rO0Y5TFFhSFVELj9bUE9he2p8bWBmeVxcL0lJUUlMTUJKSWZEZD9OK0VPW0hrbXFta2ZzZF9sbWMyPlJIYFRLN0o3bkVeS0coS1BZP3B0IGhcblVjWG1zaSZvX3pcXHleMzViRlZgdmRVXn4ieVxcd146NGBKT3NxXXVjbzZ3aGhrPV9ubWlwcClJR15La2BzQyFjZixXTFxcRlFUV0tTNzs2XFxSUm5xam9odHFvT29dIVxcL0FXS2I/WUgxOVpFYmcha2dPcGJraDlnb2d1ZXUjRGZlamRdXG5adzpoZnAhTU5FUVVCVEhqS1lMV0VWRk9dVEpIPVE5TkROXHRSX3JkcHBaYmloOWlrZnN+UGNqbmZnZGxwI3NXdFc7NnVocl53XnhYUHFvZyFcbk5LYFJFSko/YCFIYnBicWJqcWZBfmJ0aDk+S0liRl9AT0VjSEs7XzoxOXNbXHRVeGB0YE1za2JcdClOO1o0WUBESTA7b2N8V3RXeVZYZ25sMGhta21oc1wnTWgiXyBIdmN5YXFhX2l3V3tXdmw3bWNpbSlJZnBfb2chWm5jL2ppZmpudCFIaGxWdGF9aGNoNmtnYXBcJ01uIGV8ZEZ0aWZ3KFc6XkZZN2JGNUNRSVpiaWhXZH1tPF1yZWhybCRHSVlIamp7U3FfblNxZ21rUl1+bzhnb15yI0VfeFlXbG1jeFxcbGRYZ25sMGppamsgT1xcflpiY25ldGRpakxucWJRX3pmPWFqbGcoTGJoaXIpfV4hP3xlVnFpakZpcFpKbmpXXHRncm5wbzRBdVdcbmhvZyFcblFGRFNRPVFOa0leRkxRXUJNRC5Ad2B7YXBpfj9cblJ0ZGZseCZTTFs4SklaO106aEhQT1xcT1s3X0RZR20/XFw7RipIZ2ZveVpzak1kcFp2ZHBwNlFLTF9aWEhSNjk7cGF5ZWhoXG5JfmZsIFJCVkxHSlxcXFxUQ09ANj56VnpcXG9yMjtHO2A2ZElMNWM8WE1hSldBSyBQZ29mc18gQG9yaWpxW3hoM2RoX3Rcbk5tdmF6TW9XXHRwfF5XX11gZHJ5amg/IVpzajU1UENdVFRFVkRlRFM8XT46NntrZnBUYWZuIGdqP3VCeFZ9dHRhTXNrYlx0KVhIXFw2OTxzcHNqSHBxY3kkSEZuR0pRSUFcXClLamxnT2tcbmBcdCVtY3Jfd2I4OntbdWZiYn5xZWE2QFJDXkBOJVRaeVxcRnB2Z3UoXUpUSkhRVEtMREdATUFlOV1NNj93XXJKenF4XXBAdWFqO3VmIGw3bWNpbSlMY31oTlohUlJtZmx4JkY7XFxJWkhQQFZSWUdDT00pTGN9aE5aIVJSbWZseCZxW3laMT1oX3RjamNHcm1reiJOPFpNY0NWRUhdVEBETVEhTFd0V1x0VG1HY2x8Zmk1bm9cdFohYFx0JW1jcl93Yjg8amVzYXJUfWhxalhseV1cdGR5Z1NjXHRmcyxyWXBfOD1ZQ1Mze19Mbm5obWB6XXppOGdvXnIjSVJRRFBbfmZ6W2w3e1h2ZHBwNmlrYnJvciVWRVpDUWdnbHhscTpxW3RXfWc3a2dqb3FuIFNPV0VhXXxrRmppZWhoXG4jcVt1WSJbNUdWSVRReFVuZk9lc15yZXUsUEdEPlE5MT9LNFJoe3JxbjZrZ2FwXCdTPVA8cnBTX3JfaCh4ZHxbeTR+aHdjMGhta21oc1wnUz1QR3JpdGdzZkZibWNsW0xodGF9LU9LXVBLQVpRTyVXSVBWMy45VzMtRCk1LTglRSk6LzkwQS86Ik5cXHhLIl87ZWJraSRMXnhaSVtoVntcXHdkMGhta21oc1wnU2ZvWHIlb19xXS9DemlxJFVnfFVucUhrempnaDluXHRpfmBcdGtmYlBnZlt4WnhFbSB7WHdmdmQ0RnRodylcXF56UiBgd2NYYXBfUmR3Y2hmPV9ubWlwcClPYlx0ZzhvRjNcdFxcYmlNbGhsbWl0aDVlI2N5bnRwbWFSY25cXHZeIEBzJW1jcl93YjhAam9MaHRhfS1GS1VcXFxcP2pOT0lPQ05LUFAwQ2hzUWtqZHsgU0JWXlhHZ1RPQmpKT0ZtMmFLTypPXXxcXHtWd1pMaHRhfS1GS1VcXFxcP2o+U0tRRlo9TUNcXCROXyRXdFd5VlRpbm12KkxMU1NhRmk+OjxycGNtZWpnPyFac2o1Nl5AaFVNW04uNyBWYCJbfVJcdFtGdGlmdyhQRFJVXT1uOTo0LkdtdmhjbG1uPiNWe2svQlNFYlBXVFNLVEJQN0IrTWEgX3VVfV9Pb3NfICVFTVFXWUVrSTFDUDZYNGxiZ297K3RVeGA2Rlc1VkZ2cnRtd0dtZTNkaF90XG5WSEZFWGx4aDlnb2d1ZXUjTlFRWXFjfGpxV3tbfmFOdWdqfCtTR2pIS0dXQWJDQlJNR1FZX0lGSkxRX0VOUkdITUBaIFhOV15yWm5CZndJanVpfiNSSWY/VDdSQGFHTVZLRl1aTkhbMlZFLUtlbGsodWJ6YjVgcGBuK09hbGZnOHBxc1xcczp7XXAscllwXzhCalpwU1pYIUxnb3tebVlQcW9nIVxuUDhRUllKTEhTVFU+SEVUXG5WZGZlaUhrbX4pdl58WCBfLUtpXFxsW1laeVdrUyJUN2tnam9xbiBYYG5ibz5ya2JiZWxkKHpWclszP3RXcmBVYXxxb2JyblxcWnxYciVvX3FdL0dxWW5XWmEjZWxkMGppamsgWGBuYm9EIGlmX3E9eV96aTNibGB2Z3ErUGtsYjQ3TzxeOm1EUjpVR1NGYkhbOUoiVWFzWDdDUT9dSktCX1paSGE6YUBQTGM+UkZYRFxcP1U5O0F4Y2cqWE9VN1BOXUJcXDhsQE9RWEpYPWA+VERmQF43TitQa3xmbF1uXFx+Yn1fO2Via2kkUlxcdlpoajVZdGdZcXFwd3FcdGRwSnBcJ3xSelxcLU1qXnZdflpqZEpTfWlqcjBobWttaHNcJ1lfdGRwaWZjcjtkaCFWeCR1U3xYNU54YXpgdWJ+b3xad19yW0Zwdmd1KHhac117WjtDanhvYXZxT2J+b3xue1Z7a3QscllwXzhFZm90V31nW2RzcW1wekl7X2ttczYiXFxvcjI6WDxOQU5ETlFfO0pSRyhYXlx0YXBpfktzYiFcXHRyWWhnW1xuWkpsbGAiIVdOUEE0TWtmcWp8Zm9fcFxcRmppZWhoXG5JbmNwYHYhd2BvYTRNa2Zxanxmb19wXFxTY3dneGxvWllfdFt9WjdrZ2pvcW4gW2pzZyFWXHQ8d2NybDFRUTdQP1tRVUJbQkdbSVFlOlpNTT5tPlxcTFRDYzxSUVohVWV6WyJcXHhtMGppamsgW21vbHNfIFh1Z3NmMWZxY2xqb1x0X2VucmdqfF56XXppTWh8X3JadWdzZkRwbV5xV2ledDhcdGRwcDZLVUJQXCdaa3NkcmV1X3hhcmhPZHNkbFUiXFx4bUVod3BrOSBgeG08P1xcRUYqVGpobXFjeVd7W35hTG5wam1gel16aVZiIGU7ZWJraSRTbHtlamh7a11ibWROZXtxNGJsaG8lXmZvY2phT118PX5aaVt1ZnhUdS1rb11wa2ZhYHxidGp2ZWhOcFl3YHtncjd8ZndYd3NrX2lxdWZMcWtielJvY2YscF1xYVxuXTFGfGV3Rn5hdV96ZnZodGp4XCd8UnpcXC1OeWtrTSBXeFl5W1x0Z3JucEt4cW9jeW44ZXNfdGtpKlZMRj5gQktKdmB0NnFgcGNtQnxZeW84PF0/YUlQSmNFRE1XIVdKSjZwZ2pCal12a2tgUHFvZyFcbltGT0MwSlc9UGlxaVtkcGF8b3FufCt0VXhgNktiNFZaZlJ2WXFtfGR3ajVgcGBuK1RQS01rWX0+eWd8VnBram1yJm9felxceV4zRGM2W3NyP3dremZ0XVx0bXdfdEpwc3ZbaCh6VnJbM0RjNltzck9ta2pZfSl2XnxYIF8tUGlZZ1tuYWpJe2R0VHYtcF11YjJGcFxcblpwXXJKdXBpWXA+cVtma3NmYVhqY2duNmtnYXBcJ1xcXnRdclp1LGhdb19cblpVaHZidGV9eDBqaWprIF1gcGVzVCAlZmx5ZWhsbWlqJHNXfVp9Zy5ObWNyWW5vOGIgNiRrZmx3YWVmcSNzV3RXO0VuZW5ha3E0Z3BvOGVzX3RraSpWXXBpXG5aVWJoa3FUbGowaG1rbWhzXCdcXF5+YFx0a2psa0dlbXFne1t5IH1UdmQuTm1wdmN5bm9cJ3pWe151ZjBLWUFNY25jaGZ0V11xY2p7Y3VmeEdzbCFcbnlcXG9leGAvTWI8SztJXnRhbURuYXVidGg5TmBAbTdSOU1DUjxiR1s5SlVLO1U5TlFHSktCMkdhQlA+VGZ7WkhDcF1wX3ppM2JsYHZncStVUk9DdWJcdEFrXFxzRlx0YEZqaWVoaFxuI3FbdVkiWzVSWENVXnlfUGdvZnNfICVUVEtXWEhVSWRKYEJUUl5SR05bTUc3UEpYTmE2OUpXRVRZd2JfWmwkVzNjO1xcRElbVUxcXDlfSmlLUz05SldFVFl3Yl9abDd5VVBVfC1SPVxcRVk5UlpXSGQ2YUZgUElEL01iPFVXe1piWHBAdF9aYnIiWzxeQWE2VFZWTE9GUlFaIVhMTkJwZ3FSZ2NLaXVncEtrbXZcbl04VUZXPUpZTUdIVUg0YlxuXFxVSUxpcW5HcGJNblxuZ3JrcE95WWdsbWluWUhUISF3YG9hNFBcXDtbXFx+YWFWdENqbGlsckxxYTNGSEZXRk5GYUhRS0tIWlpcXD5afmBNSE5lbGtNcVxcUV91VyJiX2R0cHFgZ2BMXX1cJ3xSelxcLVFaP1NbXG5dWFtuPnhhbnNxUm1vel1uXFx2S3NdO0dCUkxLSEFrOFFFWjdfNF1HLk9eRFZVXHRjXV51PXZqdSxwXXFhXG5dMUlsZCRcXGxkWWt6aGtmOWdvZ3VldSNUZmVqaF5NZ3dXXG40I1lvZHQqcXBcXF1wcjhlc190a2kqV2BkbHFZRmh5U1wnNX5laGF6K3JZeWJ+YTpEdVhzY2g5dWxtbkdrbVh0ZTdtY2ltKVlcXGxtb11lYFx0YmZwMmRoaHNpbSJaZn5lamZnSWlrZ1twbThlc190a2kqV2x1Y3pcXDNjaGZyWzdtY2ltKVlofWR4YDxkfWNqcjJmZGdxIVhqeVt9WjdzdGV1K3JZeWJ+YTpEIHBtY1dgaF9cbkFuaXsge1h3ZnZkNFFrbFx0T3xacVxcUGxmSm1rdyh4WnNde1o7R3JsZ05pa21Zfil4WntWOUtwc2dgMWZxY2xqb1x0Y2VqYm1BfmJ0aDk+S0liRl9AT0VjSEs7XzoxSnlnIWduY1Z1eGJ5InRuXVxcXG5afWtWUFAmcVt5WjFKeWchZ25jV05UK3JZeWJ+YTpGPz0vTVhASExrOldIVkQ7SFJEeGF2cTRBUE9LWFsyYEItU1ZBSGx+ZHckc1d9Wn1nLlFaRktmfWp8XCcgZW5abFJ2WWZfWF5yX3tcdGRGS0h1a2tleGN5alx0bFdfYWlibHdeaGxeWnhrc2Y9YWpsZyhdcGtmTF5+YiNSIGBwbDJmZGdxIVtKW0R0WnJucCp0YnRbXHRjNk93VXJmVXBlW25GdWh5JHNXfVp9Zy5TTT9NQGpeeWZ+Y3JqdGNoV3dfI2l6aGxRISZ9YjA/V0pWRlBOXT5SUF8+Qz9jSzZOT1RJTlslbjhhUy5TbV9HZ35gd1t6ajs6cGt0YW9fUWd3ZXkgIWdqYm1Qel5pWVdkd2IhfmRcXGM/d2toZ25hfiRZZ31ncmxnQXpvdWY5Z29ndWV1I1hjZjl2bXFiZ2JcbiAkVHVoZl18YjRibGhvJWVWbz5NMEdncGogaWpIbGBzWHtocGNLbHRocHN+XCdPRVxcREpBYztST1pJSkhmNGQ5T0RUW1FLSjljXCdhXnA4WSlEbXFoeG5xR2pka1cgXFx3ZkVrdnFrbFx0KU1IXkpsSUY/SFdFT1I7SkhmNFhBTUhQQzRUa1ZSRzw8fV59bHVjVl1xXnFnbmRuNX5hfWR6cDZCUjlYQFhNbTJfSUJXYzpYQFI6V1VJO103Uk1JKF9iaDtXLU1oe2Eha2ZQaWZnX35ec11KYX1nbnd2Kk5PR0FQPV8/VDZfI1hjZj9PLE9kcmZ8ZnRFbm1mYXpmdFtOanhtc2kgJU4/XFxXVkJNOUpIZkVjQltASUFnP1JDTkZpTFdLUiNYY2Y/TyxPZHJmfGZ0RW5tZmF6ZnRbTmp4bXNpICVOP1xcV1dMTUNYPFZEXFxST0RHQEo+ST9qRFhNU0NZPEJUSTxiPVtCVUVVN11HXFwrWWFqRFImXWB4XXNjdmVoQXNmd18jaTM7UzdcXDhXU2E9Wk9HTWo9Xz9UNl8jWGNmP08sXlpzWmxkeGFwQnFqfGJ+aDlBXFw6WzZPTEdESUpiO2BJRjlPP1RBXV5JTk1CVFNeRGQ+OkhyWUhKNkpoaHBad191WVJid3NndHwrUzVjWl0+YEdSSWBVRUFXWWA+UjtWR2NcbmBkZENUL1hZeV9va3dfdDpwbHhde246SU5DTEFkR2hEWkxRT0s4N1JvW1U9P0lmbGhddWN6XFxIZXVmdGt9LVdKUUNVRlhaTEVdNFhWQkFYQVk/a0pTP01BYUBoSFBAUUBLRzdSb1tVPT9JZmxoXXVjelxcSGV1ZnRrfS1XSlFDVUZYWkxOVDdSSWBATUZHQ1o8MU1sVFY/O1FnamxieF15Yk1ofGVyb3UsWUZWQ1NDSjpmO11HNVZnXk9JOEZwaW5eXG5ae15EbXJsaHJcbiNxW3VZIls1VmdeT0lYWXlfb2t3X3Q6cGx4XXtuOjdURVNRZThMMS5TbV9NQF1geF1zY3ZlaEFzZndfI2kzQlBAVDRbK1lhakRSRnBpbl5cblp7XkRtcmxoclxuI1RETFFcXDxXVFVbS0xUR188WE1tNFxcQ1BQME9oXFxTQVdbdVZ0ZXJtaT93a3pZIm84SV09Zj5QTGNHSUBfOllVXFxAWEdcXCtZYWpEUkZwaW5eXG5ae15EbXJsaHJcbiNXPUkzQ1xuYGRkQ1RPa2JvYHxifFhQZm9yaXB3KF82UkZTN242WFVHTklESyBiYGxEd2VOZWprZWxsaXo6e1t1Zj0+TlhXTDRUa1ZWZH46fFp6WHVnc2ZIcHFjeSR1U3xYNVZnXlNmejdeTlVeJldcdFhuY3dKeGZxI3NXdFc7Sm5hTWV8QFlHWFxcfmt3aTtdc21xPm9pbWk4KEhkIFQhLW5hdmR6XFw3Um9bWVogS3NfcmtsbnVkczt9V31nN0BWW1xcPlg7UE82UHNTWGB1UnZZcW11aW5ldTckWHdzMElXUlk5T01LQDpIcllMZ3hMdVt6aG5qcGF9OFx0ZHBwNmlrYnJvciVlVm9KcGFvXXcoT0FUSVBAVlxuYGRkT3dgcVlcdCl4WntWOU5zZ3hZZWZxSHlobFN8N25lY3F0cV1mdG9vazxfbmRmKlxcRU9CXG5pdUhsYyNYfHMwSFc+Sj1ZQjZRYT1hR3NtZ112bXtnM2RoX3RcbmpvcmhxYGdodGp4PG9UdVxcL0dIREgmbWV1YnBVcGdybnA/aWBuWTlQWj1PRVJJRj9IUS9bfGVxX2pTIlxceG1FXWtlayJ4aiM6clU7ZWJraSRkanxhblloZnhid0JjX3BiNGchXFx6PG9UdVxcL2ppZmpudCFmZndeeFZqc2trdkBnV3NgOG5+VW5rZixyWXBfOFd3ZX5ldGVSbXZhemNnV3ApTmIgUm9jZkJ2WWpPfGF0V2sge1h3ZnZkNGBnV3NgfVwnclZ5XFx1YzJkaGhzaW0ialNyW25yMGRpcDRibGhvJXFScF9mcTJlZG5vXTNibGB2Z3ErZV1rZWtnOWp6XnxcbnlcXG9leGAvXXRndGNsIHJmci1uYXZkelxcN15ya31eciVkcW0mcVt5WjFZb2R+YG4taWx9P2tibmN3WlxuXFx2ZWgsZ2pkbXQ8dWtXZH5WbnJ1KnRidFtcdGM2XFx2Y3xkZixwZ2ReYF5yW3oge1h3ZnZkNGBuZnpob1wnfGV9KTQyOSZqX1xuRHdfblt9VHVGd2VsYlZVcmA4ZXNfdGtpKmdgdWl5WjNtbFQhZ3hxZypxa3lobGd2XCd6VntedWYwW2tse2JqJH5XcWZ9bnRhNmx0OHpyeGV9UnFHc21ramhtXHQjZlprRCNfbnIwaG1rbWhzXCdtYVxuYHpcXC91aVp2bntnaiR2YFNiXG5tbmtpYVZmemJ8XiBkO1tqcXRZd110I3FbdVkiWzViam53amsiIWBsbCFgXHRcXC9tcjxycXphdFdrQiBicHFnb3sral1+a2ttcVk7ZWJraSRmYn5kcls1aXRVfHNxbm0rdWJPaiBnemBuW1Fwc191X1x0aDNdbGZhaHVkdSp0YnRbXHRjNlxcdmN8ZGYse11lbVxuZHdbNWF9N3h2cGh3XmpEfWpxa3NkXG4laV93RGxtXG5ac1t5IHtYd2Z2ZDRgbmZ6aG9cJyRWb2p1bXZdMWl6OXRtdV5+VG1PdGtvb2tnfil8XntgIlxcTWd3bGhocWczYmxgdmdxK2VocW1oY2xtbj1vZW4lZXBzaEhgclpoajNVfmF8bm5hNmFrVlxuYjhlc190a2kqZ2dxbXthaiRsZCBiey1uYXZkelxcN155ZyBgeVxcL2V2Z3hqOmNmY2xcdHJid3JxaG0rbWZ6cHo8fV15WHFxaVxcMWZxY2xqb1x0cmJ3cnFobStyY3Ipdl58WCBfLWFzZnZpeFozY2hkekdybGdocWtrIndgeGAhWTlacGx3Z29fOmhoaGxXfWZxbnYqdGJ0W1x0YzZcXH1fXG5mbWMybGxncSNxW3VZIls1YnFqe2xyWTlvc2ZzRCBYbm4yZGhoc2ltImpkXCdjfW4wb31femBwKW5ecWMlZ3UscllwXzhYd293Zn4hfHRkcHRiNFl5XnxyfmU7Y2Zsa2xrJm9nfmZ7YT1mfmF2aG0rbVl5YHxaIVZYXFx6LHJZcF84WW0tblNGX3Foamg2dHhdXHRgdmc8X25kZipoYXZqbWloXkxodGF9LXBddWIyWSJvb2t8UnklQmJoS2hbflhtRnlhJFxcbWR0KnRidFtcdGM2XiVlcmlvX3AmTG1fWmZoalpfZXh1a2Btb09ifm9rZXpWcSV1cGdMa2x7aXlibCAiZWxBa2psK3NZXHRjeV13a3IjZ2N4W2soelZyWzNYI191UmVubWJ0IHMwdl5zX0JrNGg5JnpsdWlqJHVTfFg1Z2tvfGx4bTlheWskUlx0Wy9qaWZqbnQhbV96Zn5lIS10YXhpZ1dwTn5aIVY7Y2Zsa2xrJnVjaVtcdFdzN0sra2psYn5Zbz9MXCdyUiBYY193XXYoeFpzXXtaO1xcfFJnX31vazd6aX5eJWU5YnEvNm45c21lOV81aSBcXH1kbmo2aWticm9yJXpbbi5rZGhuZl06bHdfe1d7YTdrZ2pvcW4geFxcITx9X3tcXGRybWdxbVxcWndJbGQkWHsrb2F2cmhVfSlcbmIgWm9jZipxZ31MYDhYW3pleGJ3Q2dva29vZFx0ZHlnPF9uZGYqcll5Y3NWeWV5IHBjeU1jaW0pdFUgZHFaIWBcdCVkbXNjbF9RY2ZYc1dzXG53YHhlb156Y30pbWtzVXJldWdlZHYoflp2a3BkdEh8ZHRJbWFvVVx0ZHlnPF1yZWhybCRxWyFebFd7YSAhcnJSbndxdVd6Z1JafFV5XFxzUGlfbG1cblp3W2sgfVR2ZC5qaXNvW2xveWs8XlxuRGJ2WGd4XXRFdF91ZiFcbndgeGVvXnpjfSl6XlxuXnZqdGdzZnYofWpqaFxuIH1UdmQuamlzb1tsb3lrPGF8YG9yaWpIaG1XcVtrXHR9VFx0aGldfGx4In1ge25zZCBEZmJtWU5fJEh+aXtXfDRsYmdveyt0VXhgNmdvZ3ZeYnJzajFtcWd7X2pXZmJ7amduNmB1Ylx0bXllelZcdCVwbGlqdWl+IXNXfVt2VH1udCp7YnhqdF5vUH1jeFxccyxnZ3FufmRxYmxkPWJ3cnZdfGJpXFxsaXFeOl9ubWplZWxybDpoamh9W3JYYG50Z21vNGdcdFxcfG1bVlxuamJlaWsxZnFjbGpvXHR+Y25tMGhta21oc1wneWlzX1FYdV9mWXZfOmNmY2xcdH5la2h2cXU/eGMhbm9rPGdyaXRnc2YvaX5eamR7UyJcXHhtLmxtb2xjfWhrZ3FWO1ptY2VqUF9taHpobGU9YWpsZyh4Ynhaem13WnxUciVvX3phaltcbl50ZDVmfj1cXE5QKnRidFtcdGM2aXNjc2Zza2VmZl86Y2ZscFlwZ3JucCp8dnZZN2t8YnxlO2Via2kkc2x7YnVqNWBwYG4rdV11cHticjx8XCdxUntKaW17JnFbeVoxaWpkfl91QXsqdGJ0W1x0YzZscWN8Y21ScyZvX3pcXHleM2V0Z11ob2F3cnoid2B4YCFZOWpmclhhcF97ankkdVN8WDVycmFtYG5HI2l+YXNkdmovYWVmZl94I3FbdVkiWzVycmFtYG5HI2l+YXNkdmovZWlsWWl1WGppNV50YXBzaih7bWtZbmNdcnxldVxcdGd3JnNfelluZG5cdCRcXHx0Y2heZmtre2p8bTxZcmBoZngkeWNcdGpmYl1bdGp5bnRwNm1nW3BHb18hfiJgdHNlZFljcWx1ZXlmPWpyY3ZkNHRrVkxrelwnc2IhWG1xMmZkZ3EhfFtpXXhnTGBwX21pR2J0aGttd2B7PXNfcV0xaG1iaiJ+V3FecnNUYXlya2dcdEFzZXNEJWp1Y3Emb196XFx5XjNpdFV0aHZObXB1YCBgVmhxUnk9amppS3xtXG5acktZPj1fbm1pcHApfVltZnNtYWFyXFxkZktqZGd5Vnckc1d9Wn1nLnNtX3FdXHROel5zVHVJZmFzX3FjXG5edGRMZCBiey1wXXViMmtwXXViIUR9XFxmYWxKaF17XFxzX3tbfmFOdWdqfCtJNVtPX0tXP1RWUUZFS0gmJFZzWmxqPWN+YW5la0NrVVx0cHxePFVyXWJzcGxFbHtseFt5QiBidm92RXs+cmB6cm9dPF9uZGYqfVlxXnFtM2Z8VHtcXGxFZ118cnhZOWJvbVdebl5mUW1yaCh4WnNde1o7bGptZmFcbit2aW1nc1xcVFZua3ZwaSZsbVBaa1d8XiI1e255b21vNGBwaXFtdn4lWG9iaXAxaiBXcV9qOHRUfXR0YTZmeUdcdFxcfmIgZXZadENyWWVmcVkzZGhfdCcpLnNwbGl0KGEuZi5hKFs3MV0pKSwgYmIgPSBTYS5sZW5ndGgsIENhLCBUYSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDYSA9IDA7IENhIDwgYmI7IENhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGEucHVzaChnKFNhW0NhXSwgUmEuY29udGVudFdpbmRvdykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2EgPSBhLmYuYShUYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2EgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgYWIuaXMgPSBLYTsKICAgICAgICAgICAgICAgICAgICAgICAgbC5pdiA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgIGwucXQgPSB2OwogICAgICAgICAgICAgICAgICAgICAgICBsLmd6ID0gYS5jLmFwKCkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgbC5oaCA9IGEuYy5hcSgpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGwuaG4gPSBhLmMuYXIoKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2IgPSBsLCBMYTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhID0gIWEuZy5kKHdpbmRvdy50b3ApICYmIHdpbmRvdy50b3AubmFtZSA/IGEuZi5oKHdpbmRvdy50b3AubmFtZS5zdWJzdHJpbmcoMCwgNTAgPiB3aW5kb3cudG9wLm5hbWUubGVuZ3RoID8gd2luZG93LnRvcC5uYW1lLmxlbmd0aCA6IDUwKSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTGEgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYi50dyA9IExhOwogICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IEcgJiYgKGwucWMgPSBHKTsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBKICYmIChsLnFkID0gSik7CiAgICAgICAgICAgICAgICAgICAgICAgIGwucWYgPSB4OwogICAgICAgICAgICAgICAgICAgICAgICBsLnFlID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgbC5xaCA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgIGwucWcgPSBJOwogICAgICAgICAgICAgICAgICAgICAgICBsLnFtID0gQzsKICAgICAgICAgICAgICAgICAgICAgICAgbC5xYSA9IGEuYy53OwogICAgICAgICAgICAgICAgICAgICAgICBsLnFiID0gYS5jLng7CiAgICAgICAgICAgICAgICAgICAgICAgIGwucWkgPSBhLmMudTsKICAgICAgICAgICAgICAgICAgICAgICAgbC5xaiA9IGEuYy52OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGIgPSBsLCBVYSwgRGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlYiA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGZiID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBnYiA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBoYiA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93W2ZiXSwgaWIgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIHdpbmRvd1tnYl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYS5wdXNoKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygd2luZG93W2ViXSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhLnB1c2goaGIgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYS5wdXNoKGliID8gMSA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgVWEgPSBEYS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGIudG8gPSBVYTsKICAgICAgICAgICAgICAgICAgICAgICAgbC5wbyA9IGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGpiID0gbCwgVmEsIGtiID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgV2EgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBsYiA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIG1iID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgbmIgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgb2IgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHBiID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgcWIgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCByYiA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgWGEgPSBhLmYuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIHNiID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBZYSA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIE1hID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgWmEgPSBkb2N1bWVudFtyYl0oa2IpLCBOYSA9IFphW1hhXShXYSkgfHwgWmFbWGFdKGxiICsgJy0nICsgV2EpLCAkYSA9IE5hW3NiXShtYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYVtwYl0gPSBOYVtZYV0oJGFbbmJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hW3FiXSA9IE5hW1lhXSgkYVtvYl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgVmEgPSBhLmYuaChhLmYubChNYSkpOwogICAgICAgICAgICAgICAgICAgICAgICBqYi52eSA9IFZhOwogICAgICAgICAgICAgICAgICAgICAgICBiICYmIChsLm1zdCA9IGIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoeikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh6KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5pKGwpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuZi5yKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9ICdodHRwczovL2dlby5tb2F0YWRzLmNvbS9uLmpzPycgKyBhLnkuYigzNSwgYiwgYywgITEsICEwKS5yZXMucXVlcnlzdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWsuYSgnZGF0YScsICdNb2F0RGF0YUpzb25wUmVxdWVzdCcsIGIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmYubyA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuZi5wID0gW107CiAgICAgICAgICAgICAgICAgICAgYS5mLnEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmYucS5hID0gJ2FwcGVuZFNwZWNpZmljcyc7CiAgICAgICAgICAgICAgICAgICAgYS5mLnEuYiA9ICdhcHBlbmRNYW51YWwnOwogICAgICAgICAgICAgICAgICAgIGEuZi5xLmMgPSAnb25seUhvb21hbic7CiAgICAgICAgICAgICAgICAgICAgYS5mLnEuZCA9ICdvbmx5Qm90JzsKICAgICAgICAgICAgICAgICAgICBhLmYucS5lID0gJ29ubHlOb25IaWRkZW5BZCc7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmMuZWgoKSAmJiBhLmwuZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5lLm5hdmlnYXRvci5nZXRCYXR0ZXJ5KCkudGhlbihmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmNoYXJnaW5nID0gYS5jaGFyZ2luZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sZXZlbCA9IGEubGV2ZWw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlbJ2NhdGNoJ10oZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgICAgICBhLmYuciA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5fYyAmJiAhYS5hLnUoci5fYywgMSkgPyBjID0gci5fYyA6IChjID0gYS5haC5hKCksIHIuX2MgPSBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGEuYWguYSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGIgfHwgITEgPT09IGIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnFsID0gYS5mLnMsIGMucW8gPSBhLmYudDsKICAgICAgICAgICAgICAgICAgICAgICAgYy5xciA9IGEuZi51KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkLmNoYXJnaW5nICYmIGEuYS5kYihkLmxldmVsKSAmJiAoYy52ZiA9IGQuY2hhcmdpbmcgPyAxIDogMCwgYy52ZyA9IDEwMCAqIGQubGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBnID0gYS5mLmEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMAogICAgICAgICAgICAgICAgICAgICAgICBdKSwgYyA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAKICAgICAgICAgICAgICAgICAgICAgICAgXSksIGIgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZwogICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJy0nKSwgZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgICAgICAgICAgIF0uam9pbignLScpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5zID0gYS5mLmgoYS5mLmwoYS5jLmUubmF2aWdhdG9yLnBsdWdpbnMsICduYW1lJykpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHApIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5mLnUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLnQgPSAwOwogICAgICAgICAgICAgICAgICAgIGEuZi52ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSAnbnUgaWIgZGMgb2Igb2ggbHQgYWIgbiBubSBzcCBwdCcuc3BsaXQoJyAnKTsKICAgICAgICAgICAgICAgICAgICBhLmYudyA9IGZ1bmN0aW9uIChiLCBjLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYS5mLnEuYSBpbiBjIHx8IGEuZi5xLmIgaW4gYykgJiYgdm9pZCAwID09PSBhLmYueCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmEuaShhLmYueCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZC5uICYmIGEuYWkuYShlKSAmJiAoZC5uID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5xLmEgaW4gYyA/IGEuYS5mb3JFYWNoKGgsIGZ1bmN0aW9uIChhLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYSBpbiBkID8gYiArICgnJicgKyBhICsgJz0xJykgOiBiICsgKCcmJyArIGEgKyAnPTAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBhLmYucS5iIGluIGMgJiYgYS5hLmZvckVhY2goaCwgZnVuY3Rpb24gKGMsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5heChhLmYucS5iLCBjKSAmJiAoYiA9IGMgaW4gZCA/IGIgKyAoJyYnICsgYyArICc9MScpIDogYiArICgnJicgKyBjICsgJz0wJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZi5xLmMgaW4gYyAmJiBhLmYucS5lIGluIGMgPyBhLmYueShlKSA/IGEuZi56KGIpIDogITEgOiBhLmYucS5jIGluIGMgPyAwID09PSBhLmYuYWEgPyBhLmYueihiKSA6ICExIDogYS5mLnEuZCBpbiBjID8gMSA9PT0gYS5mLmFhID8gYS5mLnooYikgOiAhMSA6IGEuZi56KGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLnogPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXcgYS5jLmUuSW1hZ2UoKS5zcmMgPSBiOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmYuYWIgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBiKGEuZi5hYSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmYuYWMgPSBmdW5jdGlvbiAoYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBsLmFkZChhLCBiLCBjKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5hZCA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGEuZi5hYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmYucC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzOiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5mLmFiKGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLmFlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiID0gMDsgYiA8IGEuZi5wLmxlbmd0aDsgYisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZi5wLmhhc093blByb3BlcnR5KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmYucFtiXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYWIoYy5jYWxsYmFjaywgYy5vcHRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5hZiA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5mLnIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5haiAmJiBhLmFqLmEgJiYgYS5hai5hLmltYVNESyA/IGIubW9hdENsaWVudExldmVsMyAmJiBhLnkuYigzNCwgYiwgZSwgITEsICEwKSA6IGEueS5iKDM0LCBiLCBlLCAhMSwgITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLmFnID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmEuZHooYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCAhPT0gYS5mLmFoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYuYWggPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi5hZihjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5kdSh7IGFsbDogITAgfSwgZCkgJiYgayhjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnFyID0gYS5mLnUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5xbyA9IGEuZi50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnkuYigzNiwgYywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IGEuYy5lLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sLmMoZywgYiwgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmwuZChnLCBiLCBudWxsLCAnbXN3ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi51ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdtc3dlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmwuYyhnLCBlLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEubC5kKGcsIGUsIG51bGwsICdtc3dlcicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZi51ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICdtc3dlcicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmYuYWkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5jLmUuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5kKGMsIGIsIG51bGwsICdtc3dlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5kKGMsIGUsIG51bGwsICdtc3dlcicpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5mLnkgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PSBhLmYuYWEgJiYgITEgPT09IGEuYWkuYShiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5haiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmICdvYmplY3QnID09PSB0eXBlb2YgYSAmJiAnbicgaW4gYTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZi5hayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSB3ICYmIHcuc2luaCA/IDEwMDAwMDAwMDAwICogKHcuc2luaCh3LnNpbmgody5zaW5oKHcuc2luaCgxKSkpKSAtIDMuODEyNzgwMDMpIDogLTI7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSBhLmluZGV4T2YoJzcuNjAwJykgPyBhLnN1YnN0cmluZyg1KSA6IC0xOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYSwgYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhlbCA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdHMgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZE51bSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGUsIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mLncoYi5waXhlbCwgYi5vcHRzLCBiLmFkTnVtKSAmJiBkZWxldGUgZVtjXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2hpZGRlbkFkczp1cGRhdGVkJywgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChkLCBoLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IG5ldyBiKGQsIGgsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBhLmEuZGkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW2hdID0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tQaXhlbHM6IGMKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdzogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50OiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhcXVlOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0OiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3B1OiA0CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnRU1CRUQnID09PSBiLnRhZ05hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYS5nZXRBdHRyaWJ1dGUoYiwgJ3dtb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCdPQkpFQ1QnID09PSBiLnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwYXJhbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCBiLmxlbmd0aDsgZysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBiW2ddLCBrID0gYS5hLmdldEF0dHJpYnV0ZShmLCAnbmFtZScpLCBmID0gYS5hLmdldEF0dHJpYnV0ZShmLCAndmFsdWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3dtb2RlJyA9PT0gaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGNbZC50b0xvd2VyQ2FzZSgpXSB8fCA1OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGIsIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0RJVicgPT09IGMudGFnTmFtZSB8fCAnQScgPT09IGMudGFnTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0VNQkVEJylbMF0pIHx8IChjID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnT0JKRUNUJylbMF0pLCBjIHx8IChjID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnSU1HJylbMF0pLCBjIHx8IChjID0gYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSBjLm5vZGVUeXBlICYmICdJTUcnICE9PSBjLm5vZGVOYW1lICYmICdFTUJFRCcgIT09IGMubm9kZU5hbWUgJiYgJ09CSkVDVCcgIT09IGMubm9kZU5hbWUgJiYgKGMgPSBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdFTUJFRCcpWzBdIHx8IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ09CSkVDVCcpWzBdIHx8IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0lNRycpWzBdIHx8IGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdPQkpFQ1QnID09PSBjLnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgYy5jaGlsZHJlbi5sZW5ndGg7IGIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdtb3ZpZScgPT09IGMuY2hpbGRyZW5bYl0ubmFtZSB8fCAnTW92aWUnID09PSBjLmNoaWxkcmVuW2JdLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYy5jaGlsZHJlbltiXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLm9iamVjdCAmJiBjLm9iamVjdC5Nb3ZpZSA/IGQgPSBjLm9iamVjdC5Nb3ZpZSA6IGMuZGF0YSAmJiAtMSAhPT0gYy5kYXRhLmluZGV4T2YoJ3N3ZicpICYmIChkID0gYy5kYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFTUJFRCcgIT09IGMudGFnTmFtZSAmJiAnSU1HJyAhPT0gYy50YWdOYW1lIHx8ICFjLnNyYyB8fCAoZCA9IGMuc3JjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgfHwgKGQgPSBhLmEuYmYoYykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmFmLmEoZCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVVJMOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXNoVmFyczogZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGIuZWwsIGggPSBiLnVybCwgZyA9IGIuZmxhc2hWYXJzLCBmID0gYi5hZElkcywgdCA9IGEuYS5keihmKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRGb3JtYXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgMSA9PT0gYi5hZElkcy5za2luICYmICh0aGlzLmFkQ29udGVudCA9IGIuYWRDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW8gPSBmOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkZJTkRfQURfVFJJRVMgPSBmLm51bVRyaWVzIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gZChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgJiYgcS5hZFVSTCAmJiBnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSBpbiBxLmZsYXNoVmFycykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmZsYXNoVmFycy5oYXNPd25Qcm9wZXJ0eSh5KSAmJiAoZ1t5XSA9IHEuZmxhc2hWYXJzW3ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgcSAmJiBxLmZsYXNoVmFycyAmJiAoZyA9IHEuZmxhc2hWYXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgaCB8fCAnZGl2JyA9PT0gaC50b0xvd2VyQ2FzZSgpIHx8ICdhJyA9PT0gaC50b0xvd2VyQ2FzZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IHEgJiYgcS5hZFVSTCB8fCAnLSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGggJiYgMCAhPT0gaC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2h0dHA6JykgJiYgMCAhPT0gaC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2h0dHBzOicpICYmICgnLy8nID09PSBoLnN1YnN0cmluZygwLCAyKSA/IGggPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyBoIDogJy8nID09PSBoWzBdID8gaCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCArICcvLycgKyB3aW5kb3cubG9jYXRpb24uaG9zdCArIGggOiAocSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJyksIGggPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyAnLycgKyBxICsgKHEgPyAnLycgOiAnJykgKyBoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdJRlJBTUUnICE9PSBjLnRhZ05hbWUgJiYgJ0lNRycgIT09IGMudGFnTmFtZSAmJiAtMSA9PT0gaC5pbmRleE9mKCdnb29nbGVzeW5kaWNhdGlvbicpICYmIChoID0gaC5zcGxpdCgnPycpWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy56ciA9IGYuYWROdW07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuTU1BS19JRCA9IGYubW1ha0FkS2V5ID8gZi5tbWFrQWRLZXkgOiAnbScgKyB0aGlzLnpyOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnlnID0gYS5hLmRpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuVEFHSUQgPSBhLmMuYXo7CiAgICAgICAgICAgICAgICAgICAgICAgIGEucC5oKHRoaXMueWcsIGEuYy5heC5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgQlt0aGlzLnpyXSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZC5oKHRoaXMuenIsIFtjXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWUgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFhID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnYWRFbGVtZW50VXBkYXRlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNJbklmcmFtZSA9ICh0aGlzLldJTkRPVyA9IGggPSBhLmEuYmUodGhpcy5hYSkpICYmIGggIT0gaC5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHlUcmFja2luZ0VuYWJsZWQgPSB0aGlzLmlzU1JFTWVhc3VyYWJsZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVWaXNpYmxlUGVyY2VudDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRydWVWaXNpYmxlUGVyY2VudCA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gJ251bWJlcicgPT09IHR5cGVvZiB0aGlzLnRydWVWaXNpYmxlUGVyY2VudCA/IHcucm91bmQoMTAwICogdGhpcy50cnVlVmlzaWJsZVBlcmNlbnQpIDogJy0nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnZlcnNpb24gKyAnOicgKyBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBuZXcgYS56LmooYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklOSVRJQUxfV0lEVEggPSBwYXJzZUludChiLndpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuSU5JVElBTF9IRUlHSFQgPSBwYXJzZUludChiLmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGltZW5zaW9ucygpOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGcgJiYgKGcgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEucC5sKHFhKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lZyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5hKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUuYSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hZS5iKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkRmcFNsb3QgPSAoZi50cmFja2VkRnJvbURmcEhlYWRlclRhZyB8fCBmLnRyYWNrZWRGcm9tU2xvdFRhZykgJiYgZi5zbG90TWFwcGluZ0lkID8gYS5hbi5hKClbZi5zbG90TWFwcGluZ0lkXSA6IGEuYW4uYigpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZHUoeyBhbGw6IDMwIH0sIHQpICYmIGEuYW8uYSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRfd2lkdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5pbml0V2lkdGggPyBmLmluaXRXaWR0aCA6IHRoaXMuSU5JVElBTF9XSURUSCA/IHRoaXMuSU5JVElBTF9XSURUSCA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldF9oZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5pbml0SGVpZ2h0ID8gZi5pbml0SGVpZ2h0IDogdGhpcy5JTklUSUFMX0hFSUdIVCA/IHRoaXMuSU5JVElBTF9IRUlHSFQgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTY3JlZW5SZWFsRXN0YXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIsIGMsIGUgPSBhLmMudywgZCA9IGEuYy54OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHRoaXMuSU5JVElBTF9XSURUSDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB0aGlzLklOSVRJQUxfSEVJR0hUOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZCAmJiBiICYmIGMgPyB3Lm1heCgwLCB3Lm1pbigxLCBiICogYyAvIChlICogZCkpKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWMuZih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZyA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWkgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuID0gdGhpcy5hbSA9IHRoaXMuYWwgPSB0aGlzLmFrID0gdGhpcy5haiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdiA9IHRoaXMuYXUgPSBhLnIuYS5hLmE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXggPSBhLnIuYS5iLmE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXkgPSBhLnIuYS5jLmE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmEgPSB0aGlzLmF6ID0gYS5yLmEuZC5hOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJiID0gYS5yLmEuZS5hOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ5ID0gdGhpcy5ieCA9IHRoaXMuYncgPSB0aGlzLmJ2ID0gdGhpcy5idSA9IHRoaXMuYnQgPSB0aGlzLmJzID0gdGhpcy5iciA9IHRoaXMuYnEgPSB0aGlzLmJwID0gdGhpcy5ibyA9IHRoaXMuYm0gPSB0aGlzLmJsID0gdGhpcy5iayA9IHRoaXMuYmkgPSB0aGlzLmJoID0gdGhpcy5iZyA9IHRoaXMuYmYgPSB0aGlzLmJlID0gdGhpcy5iZCA9IHRoaXMuYmMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2EgPSB0aGlzLmJ6ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2IgPSB0aGlzLmN1ID0gdGhpcy5jdCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYyA9ICtuZXcgQSgpICsgMTIwMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNpID0gK25ldyBBKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2wgPSB0aGlzLmNtID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNuID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jayA9IGEuci5hLmYuYTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN5ID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmR0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGIgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2YgPSB0aGlzLmNlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWYgPSBOdW1iZXIodGhpcy5lZik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXEgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcyA9IHRoaXMuY2ggPSB0aGlzLmRyID0gdGhpcy5jZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHEgPSB0aGlzLmJuID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLklSNSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVg6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJFQTogMAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRtID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcCA9IHRoaXMuZGQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxLmcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzFdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVsyXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbM10gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzEzXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbMF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzRdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVs1XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbNl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzddID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVs5XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbOF0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzE1XSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbMTZdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVsyMV0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxWzIyXSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXFbMjNdID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVszN10gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFxLnRjID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcVs0Nl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZG9hID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FzRXZlckluVmlldyA9IHRoaXMuaXNDdXJyZW50bHlUcmFuc3BhcmVudCA9IHRoaXMuaXNDdXJyZW50bHlTdGFja2VkID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuID0gYi5hZFR5cGUgfHwgYi5vcHRfcHJvcHMgJiYgYi5vcHRfcHJvcHMuYWRUeXBlIHx8IGEuZC5kKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAwID09PSB0aGlzLmFuICYmICh0aGlzLldNT0RFID0gayhjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5idyh0aGlzLmFhKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5vcHRfcHJvcHMgJiYgYi5vcHRfcHJvcHMuY29tcG9uZW50cyAmJiAodGhpcy5jb21wb25lbnRzID0gYi5vcHRfcHJvcHMuY29tcG9uZW50cywgdGhpcy5pc0NvbXBvc2l0ZUFkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNZWFzdXJhYmlsaXR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZU1lYXN1cmFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNZWFzdXJhYmlsaXR5RGlzYWJsZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgPT09IHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlld2FiaWxpdHlNZXRob2QgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3YWJpbGl0eVBlcmNlbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q6ICctJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmcmFtZTogJy0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNjb3BlOiAnLScKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkQWRTaXplID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5idSh0aGlzLmFhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnYWRJbml0aWFsaXplZCcsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmQuZyh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgPSAwLCBnID0gYy5sZW5ndGg7IGQgPCBnOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmouYyhiLCBjW2RdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAhMDsKICAgICAgICAgICAgICAgICAgICBhLmQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmQuZiA9IGZ1bmN0aW9uIChiLCBjLCBkLCBnLCBwLCB0LCBxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgfHwgYS5mLmFnKHApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeTsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IDEgPT0gYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1swXSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hWYXJzOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRJZHM6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfcHJvcHM6IHEKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEueC5lLmEgJiYgMSA9PSBwLnNraW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGEueC5lLmEoYiwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LmFkQ29udGVudCA9IHg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09PSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChiLCBjLCBnLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmVtID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCW3QuenJdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbTV0gPSB0LnpyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYltEXSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hYSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdhZEVsZW1lbnRVcGRhdGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuSU5JVElBTF9XSURUSCA9IGIub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LklOSVRJQUxfSEVJR0hUID0gYi5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFlID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYW4gPSBhLmQuZChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHQuYW4gJiYgKHQuV01PREUgPSBrKGIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYWcgPSBnIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5qLmQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geyBlOiAwIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LnEgPSB0LmFxWzBdKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnkuYSh0LCB5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ2FkTG9hZGVkJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQltwLmFkTnVtXSA/IEJbcC5hZE51bV0gOiBuZXcgZih5KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5nID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYi5kZSA9IGlzTmFOKGIuYW8uc3RhcnRUaW1lKSA/ICtuZXcgQSgpIDogYi5hby5zdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuUkFORCA9IGIuYW8ucmFuZDsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudy5kKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuYyB8fCBhLmFsLmEuYSgpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmouZChiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmVhKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZWF0aGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgXSwgYi5hbykgJiYgYS50Lm0oJ25ld2FkJywgYi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuYWEucGFyZW50Tm9kZSAmJiAnc3dpZmZ5Y29udGFpbmVyJyA9PT0gYi5hYS5wYXJlbnROb2RlLmlkICYmIGEudS5iKFsnLi4uLi8uLi9pZnJhbWUgfiAjY2xpY2t0YWcnXSwgYiwgYi5hYS5wYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnc3RhcnRBZFRyYWNraW5nJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuZGQgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IGU6IDAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYy5xID0gYi5hcVswXSsrOwogICAgICAgICAgICAgICAgICAgICAgICBhLnkuYShiLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hbS5hKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdhZExvYWRlZCcsIGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5kLmIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiLCBjOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgaW4gQikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIuaGFzT3duUHJvcGVydHkoYykgJiYgKGIgPSBCW2NdKSAmJiAhYi5lcCAmJiBhLmFjLmcoYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQuZSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gK25ldyBBKCksIGQgPSBjIC0gYi5jaTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBiLmRvYS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gMTAwMCAqIGIuZG9hWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIuY291bnRlcnMubGF4RHdlbGwudEN1ciA+PSBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5kb2Euc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGIuZXMubGVuZ3RoID8gYi5lc1swXSA6IDYwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnIDwgZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICg1MDAwIDwgZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgYi5lcy5sZW5ndGggJiYgKGYgPSAxMDAwICogYi5lc1swXSwgYS53LmkoYiwgZikpID8gKGIuZXMuc2hpZnQoKSwgITApIDogMCA9PT0gYi5kb2EubGVuZ3RoICYmIGMgPiBiLmNjID8gKGIuY2MgKj0gMiwgITApIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQuaCA9IGZ1bmN0aW9uIChhLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgPSAwOyBkIDwgYy5sZW5ndGg7IGQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBjW2RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1tNXSA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnW0RdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5kID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJRlJBTUUnID09PSBhLnRhZ05hbWUgPyAyIDogJ0lNRycgPT09IGEudGFnTmFtZSA/IDEgOiAnRU1CRUQnID09PSBhLnRhZ05hbWUgfHwgJ09CSkVDVCcgPT09IGEudGFnTmFtZSA/IDAgOiAzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5kLmkgPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBhLmEuYShjLmNjKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5kLmooYyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQuayA9IGZ1bmN0aW9uIChhLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQuYSA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gMCwgZzsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChnIGluIEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmhhc093blByb3BlcnR5ICYmIEIuaGFzT3duUHJvcGVydHkoZykgJiYgZCsrOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA8PSAoYyB8fCAwKSA/IChhLmsuYS5lc2dmKCdhbGxMb2NhbEFkc0tpbGxlZCcpLCAhMCkgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5sID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5lcCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgQlthLnpyXTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEgJiYgKGEuYWFbRF0gPSBudWxsLCBhLmFhW01dID0gbnVsbCwgYS5hYSA9IG51bGwsIGEuRGZwU2xvdCA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYS5ncm91cG1WMiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuZ3JvdXBtVjMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBhLnBlcmlzY29wZU1hbmFnZXIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBhLnNlY29uZGFyeUNvdW50ZXJzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5tb3VzZUV2ZW50RWxlbWVudHMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBhLnB1YmxpY2lzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5qID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYi52aWRlbyAmJiAhYi52aWRlby5zdGFydGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHsgZTogMjEgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYy5xID0gYi5hcVsyMV0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgYS55LmEoYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIudW5sb2FkUGl4ZWxTZW50ID0gITA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQubSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEudmlkZW87CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGEuZC5pLCB7IGluY2x1ZGVJZDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWROb3RGb3VuZCcsIGEuZC5rLCB7IGluY2x1ZGVJZDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgYS5kLm4gPSBnOwogICAgICAgICAgICAgICAgICAgIGEuZC5vID0gZnVuY3Rpb24gKGIsIGMsIGQsIGYsIHAsIGssIHEsIHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHggPSB7IGFyZWE6IDAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IGEuei5qKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hcmVhID0gYy5oZWlnaHQgKiBjLndpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiBjLmFyZWEgPj0geC5hcmVhICYmICh4ID0gYiwgeC5hcmVhID0gYy5hcmVhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuYWRGaW5kaW5nTWV0aG9kID0gJ01VTFRJUEFSVF9BRFMnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9IGEuZC5mKHgsIGMsIGQsIGYsIHAsIGssIHEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaXNNdWx0aXBhcnRBZCA9ICEwLCBjLm11bHRpcGFydENvbXBvbmVudHMgPSBiLCBhLmEuaCh5KSAmJiB5Lmxlbmd0aCA9PT0gYi5sZW5ndGggPyBnKGMsIHkpIDogZyhjLCBiKSwgYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5wID0gZnVuY3Rpb24gKGIsIGMsIGQsIGYsIHAsIGssIHEsIHkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIHEuY29tcG9uZW50cyA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuYWRGaW5kaW5nTWV0aG9kID0gJ0NPTVBPU0lURV9BRFMnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9IGEuZC5mKGJbMF0sIGMsIGQsIGYsIHAsIGssIHEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaXNDb21wb3NpdGVBZCA9ICEwLCBjLmNvbXBvbmVudHMgPSBiLCBhLmEuaCh5KSAmJiB5Lmxlbmd0aCA9PT0gYi5sZW5ndGggPyBnKGMsIHkpIDogZyhjLCBiKSwgYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuZC5xID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmQuciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICEwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5kLmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMSA9PT0gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZywgZiA9ICExLCBrID0gLyguKj9bXlxcXSkoPzpcXFxcKSpcLy87IGE7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyhhLCAnLi4uLycpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSAnLi4uLyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjKGEsICcuLi4uLi8nKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gJy4uLi4uLyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjKGEsICcuLi8nKSB8fCBjKGEsICcuLi4uLycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGMoYSwgJy4uLycpID8gJy4uLycgOiAnLi4uLi8nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHEgPSBnLmxlbmd0aDsgYyhhLnN1YnN0cmluZyhxKSwgZyk7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxICs9IGcubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBhLnN1YnN0cmluZygwLCBxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoYSwgJz0+LycpID8gZyA9ICc9Pi8nIDogYyhhLCAnLS8nKSA/IGcgPSAnLS8nIDogYyhhLCAnKy8nKSA/IGcgPSAnKy8nIDogYyhhLCAnJFsnKSA/IChnID0gYS5sZW5ndGgsIHEgPSBiKGEsICddLycpICsgMiwgZyA9IGEuc3Vic3RyaW5nKDAsIHcubWluKGcsIHEpKSkgOiBjKGEsICdeLycpID8gZyA9ICdeLycgOiBjKGEsICdJTl9JRlJBTUUvJykgPyBnID0gJ0lOX0lGUkFNRS8nIDogYyhhLCAnSU5fWF9GUkFNRS8nKSA/IGcgPSAnSU5fWF9GUkFNRS8nIDogKGMoYSwgJyR7JykgPyAoZyA9IGEubGVuZ3RoLCBxID0gYihhLCAnfS8nKSArIDIsIGcgPSBhLnN1YnN0cmluZygwLCB3Lm1pbihnLCBxKSkpIDogZyA9IChmID0gay5leGVjKGEpKSAmJiBmWzBdID8gZlswXSA6IGEsIGYgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9IGEuc3Vic3RyaW5nKGcubGVuZ3RoKSkgJiYgZiAmJiAoZyA9IGcuc3Vic3RyaW5nKDAsIGcubGVuZ3RoIC0gMSksIGYgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnB1c2goZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5jLmogfHwgMTAgPCBhLmEucygpIHx8IGIucXVlcnlTZWxlY3RvckFsbCAmJiBiLnF1ZXJ5U2VsZWN0b3IgJiYgKCFiLk1vYXRRU1NoaW1TZXQgfHwgYltnXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGIucXVlcnlTZWxlY3RvciA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubGVuZ3RoID8gYVswXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGIucXVlcnlTZWxlY3RvckFsbCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IFtdLCBjID0gdGhpcy5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LCBkID0gYy5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPSBjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0pICYmIGMuaW5zZXJ0QmVmb3JlKGQsIGMuY2hpbGROb2Rlc1t3Lm1heChjLmNoaWxkTm9kZXMubGVuZ3RoIC0gMSwgMCldIHx8IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiBkLnN0eWxlU2hlZXQgJiYgKGQuc3R5bGVTaGVldC5jc3NUZXh0ID0gYSArICd7c2hpbXRlc3Q6YmFyfScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBhLmxlbmd0aCwgZSA9IDA7IGUgPCBjOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtlXS5jdXJyZW50U3R5bGUgJiYgJ2JhcicgPT09IGFbZV0uY3VycmVudFN0eWxlLnNoaW10ZXN0ICYmIChiW2IubGVuZ3RoXSA9IGFbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGIuTW9hdFFTU2hpbVNldCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYltnXSA9ICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGIsIGgsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeCAmJiAwIDwgeC5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IHgubGVuZ3RoLCBjID0gMDsgYyA8IGI7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEucmVwbGFjZSgnJCcgKyBjLCB4W2NdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYiB8fCAhYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5tYXRjaGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiLm1hdGNoZXMoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQoYi5wYXJlbnROb2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGIucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID09PSBiICYmIChoID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBrKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHEgPSBoLCB5ID0gMCwgeCA9IFtdLCBuID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiYgYS5nLmIoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBJID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPyAoYiA9IGEuZy5lKGIpKSAmJiBiLmJvZHkgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBHID0gZnVuY3Rpb24gKGEsIGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPyAoYSA9IGEuZ2V0QXR0cmlidXRlKGIpKSAmJiAoYyA9IG5ldyBSZWdFeHAoYykuZXhlYyhhKSkgJiYgYy5sZW5ndGggJiYgMCA8IGMubGVuZ3RoID8gY1tjLmxlbmd0aCAtIDFdIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBKID0gMDsgSiA8IGIubGVuZ3RoICYmIDEwMCA+IHk7IEorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSBiW0pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhDLCAnJHsnKSAmJiAoQyA9IEMuc3Vic3RyaW5nKDIsIEMubGVuZ3RoIC0gMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMoQywgJy4uLycpIHx8IGMoQywgJy4uLi4vJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiwgSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKEMsICcuLi8nKSA/ICh6ID0gJy4uLycsIEsgPSBtKSA6ICh6ID0gJy4uLi4vJywgSyA9IG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9PSBDLmxlbmd0aCAlIHoubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgRSA9IDA7IEUgPCBDLmxlbmd0aCAvIHoubGVuZ3RoOyBFKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxIHx8ICdIVE1MJyA9PT0gcS5ub2RlTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IEsocSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCcuLi4vJyA9PT0gQykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMgPSBiW0ogKyAxXSAmJiBmKGJbSiArIDFdKTsgMTAwID4geTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgJiYgdChxLCBDKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSisrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxIHx8ICdIVE1MJyA9PT0gcS5ub2RlTmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCcuLi4uLi8nID09PSBDKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGEuYy5lICYmIGEuYy5lLmRvY3VtZW50ICYmIGEuYy5lLmRvY3VtZW50LmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnPT4vJyA9PT0gQykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBJKHEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJy0vJyA9PT0gQykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBhLmEucHJldmlvdXNFbGVtZW50U2libGluZyhxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCcrLycgPT09IEMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSA9IGEuYS5uZXh0RWxlbWVudFNpYmxpbmcocSksICFxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMoQywgJyRbJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEMgPSAoeiA9IChDID0gQy5zdWJzdHJpbmcoMiwgQy5sZW5ndGggLSAyKSkgJiYgQy5zcGxpdCgnfCcpKSAmJiB6WzBdLCB6ID0geiAmJiB6WzFdLCBDICYmIHopCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDID0gRyhxLCBDLCB6KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgucHVzaChDKSwgeSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnXi8nID09PSBDKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnSU5fSUZSQU1FLycgPT09IEMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgnSU5fWF9GUkFNRS8nID09PSBDKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmMuZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEMgPSBmKEMpLCAhdChxLCBDKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZChxKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBxLnF1ZXJ5U2VsZWN0b3JBbGwoQyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgJiYgSiA9PT0gYi5sZW5ndGggLSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcSA/IHEgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXEgfHwgMSAhPT0gcS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gcVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS51ID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSAnTW9hdFFTU2hpbU9yZF9SRVVURVJTX0hFQURFUjFfJyArIGEuYy5iaiwgYyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gYS5pbmRleE9mKGIpICYmIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmluZGV4T2YoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA+IGMgPyBhLmxlbmd0aCArIDEgOiBjOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudS5hID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhID0gZihhLCBjKSkgJiYgZC5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnUuYyA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSA9IGYoYSwgYywgITApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGIgPSAwOyBiIDwgYS5sZW5ndGg7IGIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKGFbYl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnUuYiA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLnUuYShiLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuai5jKGMsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhYjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGIsIGMsIGQsIGUsIGcsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaCB8fCAoaCA9IHdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEudi5kID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLnYuZiwgbCA9IGEudi5nLCBrID0gYS52LmgsIHAgPSAwLCBtID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMubnVtVHJpZXMgPSBwKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5lbyAmJiBhLnYuZShtLCBudWxsLCBjKSB8fCBhLmMuZXAgJiYgYS52LmUobSwgbnVsbCwgYykgfHwgYS5nLmooaCkgJiYgaC5lYkNmZyAmJiA0MyA9PSBoLmViQ2ZnLmZvcm1hdElkICYmIDEgPT0gaC5lYkNmZy5kbG0gJiYgKGEuYy5lcSA9ICEwLCBhLnYuZShtLCBudWxsLCBjKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICYmIChnID0gbChiLCBjLCBkLCBlLCBudWxsLCBoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyAmJiAoZyA9IGYoYiwgYywgZCwgZSwgbnVsbCwgaCksICEwID09PSBnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuZWEobiwgYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHogPSAhIWMuYWN0aXZlQ29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICYmIGEudC5vKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFjdGl2ZUNvbmZpZyAmJiAheiAmJiAoYy5hZEZpbmRpbmdNZXRob2QgPSAnc3RyaW5nJyA9PT0gdHlwZW9mIGMuYWRGaW5kaW5nTWV0aG9kID8gJ0V4cHM6ICcgKyBjLmFjdGl2ZUNvbmZpZyArICcgfCAnICsgYy5hZEZpbmRpbmdNZXRob2QgOiAnRXhwczogJyArIGMuYWN0aXZlQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGcgJiYgZyAhPT0gYS50Lmk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBnICYmICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5jICYmIGEuYS5lYShuLCBjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmICh0ID0gJ3NraW4nIGluIGMgJiYgMSA9PSBjLnNraW4sIHEgPSAnZm9ybWF0JyBpbiBjICYmICdXYWxscGFwZXInID09IGMuZm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IHx8IHEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyA9PSBhLnguYiAmJiBhLnguZCgpLCBjLnNraW4gPSAxLCB0ID8gKGMuaXNTa2luID0gMSwgYy5hZEZpbmRpbmdNZXRob2QgPSAnc2tpbjEnKSA6IHEgJiYgKGMuaXNBb2xTa2luID0gMSwgYy5hZEZpbmRpbmdNZXRob2QgPSAnQU9MIFNraW4nKSwgbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhLmMuZS5kb2N1bWVudC5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLm51bVRyaWVzID0gcCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS54LmUuYShiLCBjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYS5hLmJ0KGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYS5hLmJmKGIpLCBlID0gYS5kLmYoYiwgZSB8fCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBnID0gYS5hLmJpbmQobnVsbCwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEueS5iKDExLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5rKG0sIGssIDUwMCwgZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYiwgYywgZCwgZSwgZykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgZiwgbCwgaywgbiA9IGEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleWVEaXYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEwgJiYgTC5pZCAmJiAwIDw9IEwuaWQuaW5kZXhPZignZWJlYkRubFNjcmlwdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IEwuaWQuc3BsaXQoJ18nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgJiYgMyA9PT0gcC5sZW5ndGggJiYgKGwgPSBwWzFdLCBrID0gcFsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGwgfHwgZy5lYkFkSUQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrIHx8IGcuZWJSYW5kOwogICAgICAgICAgICAgICAgICAgICAgICBsICYmIGsgJiYgKGYgPSBsICsgJ18nICsgayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmICYmICdvYmplY3QnID09PSB0eXBlb2YgZy5lYkFkcyAmJiBnLmViQWRzW2ZdICYmIChrID0gZy5lYkFkc1tmXS52aXNpYmlsaXR5TWdyICYmIGcuZWJBZHNbZl0udmlzaWJpbGl0eU1nci5fcmVzKSAmJiBhLmEuYnQoaykgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ1NJWk1FS0FEUycsIGggPSBhLmQuZihrLCBrLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBbXSwgZSA9IGEudS5hKFsnaWZyYW1lW2lkKj1cJ2hlYWRlcl9pZnJhbWVfJyArIGYgKyAnXCddJ10sIG4pWzBdLCBnID0gYS51LmEoWydpZnJhbWVbaWQqPVwnbGVmdGd1dHRlcl9pZnJhbWVfJyArIGYgKyAnXCddJ10sIG4pWzBdLCBsID0gYS51LmEoWydpZnJhbWVbaWQqPVwncmlnaHRndXR0ZXJfaWZyYW1lXycgKyBmICsgJ1wnXSddLCBuKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5idChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmJ0KGcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wdXNoKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuYnQobCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnB1c2gobCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiAwIDwgYi5sZW5ndGggJiYgKGggPSBhLmQucChiLCBiWzBdLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmFkRmluZGluZ01ldGhvZCA9ICdTSVpNRUtBRFMtMScsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSBhLmMuZXEgPyAnU0laTUVLQURTLUNvbXBvc2l0ZS1QTCcgOiAnU0laTUVLQURTLUNvbXBvc2l0ZScsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmMuZXEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsICYmIGcuZ0ViQmFubmVycyAmJiBhLmEuZihnLmdFYkJhbm5lcnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZy5nRWJCYW5uZXJzLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEuYWREYXRhICYmIGEuYWREYXRhLm5BZElEID09IGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIChnID0gbS5kaXNwbGF5VW5pdCAmJiBtLmRpc3BsYXlVbml0LmRlZmF1bHRQYW5lbCAmJiBtLmRpc3BsYXlVbml0LmRlZmF1bHRQYW5lbC5wYW5lbERpdikgJiYgZy5ub2RlTmFtZSAmJiAnZGl2JyA9PSBnLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgJiYgKGggPSB5KGcsIGMsIGQsIGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnU0laTUVLQURTIGJhbm5lcicsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgICAgICBnID0gYS5hLmNnKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAnRElWJyA9PT0gYi5ub2RlTmFtZSAmJiBnLnB1c2goYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnICYmIDAgPCBnLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGcsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiBhLmlkICYmIGEuaWQubWF0Y2goL2ViRGl2XGQrLykgJiYgdC5wdXNoKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiAwIDwgdC5sZW5ndGggJiYgYS5jLmUgJiYgYS5jLmUuZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaCh0LCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEgPSBjLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IHkocSwgYywgZCwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEgJiYgYS5hLmJ0KHEpICYmIGUocSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLmFkRmluZGluZ01ldGhvZCA9ICdTSVpNRUtBRFMgYWREdmknLCBoID0gYS5kLmYocSwgcS5ub2RlTmFtZSwgITEsIHZvaWQgMCwgYywgZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gcS5pZC5zcGxpdCgnZWJEaXYnKVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFJlZ0V4cCgnZWJCYW5uZXJJRnJhbWVfXFxkK18nICsgZyksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiAwIDwgYi5sZW5ndGggJiYgKGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICYmIGIuaWQgJiYgYi5pZC5tYXRjaCh4KSAmJiBhLmEuYnQoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IGIsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByICYmIGUocikgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ1NJWk1FS0FEUyBiYW5uZXIgaWZyYW1lJywgaCA9IGEuZC5mKHIsIHIubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgJiYgbiAmJiAoKGUgPSBhLnUuYShbJ2RpdltpZCo9XCcnICsgZiArICdcJ10nXSwgbilbMF0pIHx8IChlID0gYS51LmEoWydkaXZbaWRePVwnZWJcJ11baWQqPVwnJyArIGYgKyAnXCddJ10sIG4pWzBdKSwgZSAmJiAoKGggPSB5KGUsIGMsIGQpKSB8fCBhLmEuYnQoZSkgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ1NJWk1FS0FEUy1CcmVha291dCcsIGggPSBhLmQuZihlLCBlLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGIsIGMsIGQsIGUsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiA/IGEudS5hKFsnZGl2Lmpwc3RhZ2UnXSwgYilbMF0gfHwgITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGgoYiksIGwgPSBhLmMuZS5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiAhZiAmJiAoZiA9IGEudS5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4uLy4uL2Rpdi5qcHBsYXRmb3JtXycgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi4uL2RpdltpZD1cJ2pwcGxhdGZvcm1fJyArIGUgKyAnXCddJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4uLi9kaXYuanBwbGF0Zm9ybV8nICsgZQogICAgICAgICAgICAgICAgICAgICAgICBdLCBiKVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgfHwgKGYgPSBoKGwuZ2V0RWxlbWVudEJ5SWQoJ2pwc3VwZXJoZWFkZXInKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBmIHx8IChmID0gaChhLmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanBlZGl0b3JpYWx1bml0JywgJ0RJVicsIGwuYm9keSlbMF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgZiB8fCAoZiA9IGgobC5nZXRFbGVtZW50QnlJZCgnanBkX2FkaGVzaW9uJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZiB8fCAoYiA9IChiID0gbC5nZXRFbGVtZW50QnlJZCgnanBfb3ZlcmxheScpIHx8IGUgJiYgbC5nZXRFbGVtZW50QnlJZCgnanBfb3ZlcmxheV8nICsgZSkpICYmIGEuYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdqcHBhbmVsJywgJ0RJVicsIGIpKSAmJiAxIDw9IGIubGVuZ3RoICYmIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiBhLmEuYnQoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgPSBiLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgfHwgKGwgPSBsLmdldEVsZW1lbnRCeUlkKCdqcGRfZXhwZm9vdGVyJyksIGYgPSBoKGwpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgJiYgYS5hLmJ0KGYpICYmIGcoZikgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ0pFVFBBQ0tESUdJVEFMQURTJywgYWQgPSBhLmQuZihmLCBmLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoYiwgYywgZCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPSBhLmEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnb3JpZ2lucGxhdGZvcm0tYWQnLCAnU0NSSVBUJywgYS5jLnEgPyBiLm93bmVyRG9jdW1lbnQgJiYgYi5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBiIDogYilbMF0pICYmIGIuaWQgJiYgKGIgPSBiLmlkLm1hdGNoKC9lbWJlZF9vcmlnaW5fKFxkKykvKSkgJiYgYlsxXSAmJiAoYiA9ICdPcmlnaW5QbGF0Zm9ybUFkVW5pdC0nICsgYlsxXSArICctaW5wYWdlJywgYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpIHx8IGEuYy5xICYmIGEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKSAmJiAoYy5hZEZpbmRpbmdNZXRob2QgPSAnT1JJR0lOQURTJywgYyA9IGEuZC5mKGIsIGIubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGIsIGMsIGQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcsIGgsIGYsIGwgPSBiLmNoaWxkTm9kZXMsIGsgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gbC5sZW5ndGggLSAxOyAwIDw9IGc7IGctLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBsW2ddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyNjb21tZW50JyA9PT0gbi5ub2RlTmFtZSAmJiAvdW5kZXJ0b25lL2kudGVzdChuLm5vZGVWYWx1ZSkgPyBrID0gITAgOiAnU1RZTEUnID09PSBuLm5vZGVOYW1lICYmIChuID0gbi5pbm5lckhUTUwubWF0Y2goLyh1dHBnYVxkKykuKy9pKSkgJiYgMiA9PT0gbi5sZW5ndGggJiYgKGYgPSBuWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGEuYy5xID8gKGcgPSBhLmcuZyhiKSkgJiYgZy5vd25lckRvY3VtZW50ID8gZy5vd25lckRvY3VtZW50IDogZG9jdW1lbnQgOiBkb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgKGggPSBnLmdldEVsZW1lbnRCeUlkKGYpLCAhaCAmJiBhLmMucSAmJiAoaCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlJZChmKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCB8fCAoZiA9IGcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RpdicpLCBhLmEuZm9yRWFjaChmLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmIGEuaWQgJiYgYS5pZC5tYXRjaCgndXRwZ2EnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGggPSBhLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAhaCAmJiBhLmMucSAmJiAoZiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkaXYnKSwgYS5hLmZvckVhY2goZiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLmlkICYmIGEuaWQubWF0Y2goJ3V0cGdhJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoID0gYSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgKChmID0geShoLCBjLCBkLCBlKSkgfHwgYS5hLmJ0KGgpICYmIGUoaCkgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ1VOREVSVE9ORSBwYWdlR3JhYmJlckRpdicsIGYgPSBhLmQuZihoLCBoLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3V0YmFubmVyJykgfHwgYS5jLnEgJiYgYS5jLmUuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3V0YmFubmVyJykpICYmIChmID0gYS5nLmUoZikpICYmIGYuYm9keSAmJiAoZiA9IHkoZi5ib2R5LCBjLCBkLCBlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ1VOREVSVE9ORSBmdWxsUGFnZUFkSWZyYW1lJywgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZiA9IGEuYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd1dF9jb250YWluZXInLCAnRElWJylbMF0gfHwgYS5jLnEgJiYgYS5hLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3V0X2NvbnRhaW5lcicsICdESVYnLCBhLmMuZS5kb2N1bWVudClbMF0pICYmIGEuYS5idChmKSAmJiBlKGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmFkRmluZGluZ01ldGhvZCA9ICdVTkRFUlRPTkUgc2NyZWVuc2hpZnQnLCBmID0gYS5kLmYoZiwgZi5ub2RlTmFtZSwgITEsIHZvaWQgMCwgYywgZCwgeyBhZFR5cGU6IDIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleWVEaXYnKSB8fCBhLmMucSAmJiBhLmMuZS5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXllRGl2JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChkID0gZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnb2JqZWN0JyksIGcgPSAwOyBnIDwgZC5sZW5ndGg7IGcrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPSBkW2ddLCAnZml4ZWQnID09IGYuc3R5bGUucG9zaXRpb24gJiYgYS5hLmJ0KGYpICYmIGUoZikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnVU5ERVJUT05FIHNsaWRlcicsIGYgPSBhLmQuZih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWw6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRJZHM6IGMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYiwgYywgZCwgZSwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPSBjLnRsdmlld19pZCB8fCBjLnRsdmlld0lEKSAmJiAoYiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpIHx8IGEuYy5lLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKSAmJiBhLmEuYnQoYikgJiYgKGMgPSBhLmQuZihiLCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShiLCBjLCBkLCBlLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gYS52LmsoWydbdGxlaWRdJ10sIGIsIGMsIGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoYiwgYywgZCwgZSwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5fdGxDcmVhdGl2ZXMgJiYgMSA9PT0gZy5fdGxDcmVhdGl2ZXMubGVuZ3RoICYmIGcuX3RsQ3JlYXRpdmVzWzBdLmhvb2sgJiYgKGMgPSAoYiA9IGcuX3RsQ3JlYXRpdmVzWzBdLmhvb2spICYmIGEudi5rKFsnLS9bdGxlaWRdJ10sIGIsIGMsIGQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGIsIGMsIGQsIGUsIGcsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYsIGwsIGssIG4sIG0gPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPSBlID8gZSA6IGguQWRmb3JtICYmIGguQWRmb3JtLkFERkJhbm5lckRhdGEgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBoLkFkZm9ybS5BREZCYW5uZXJEYXRhLkJOICYmIGguQWRmb3JtLkFERkJhbm5lckRhdGEuQk4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gKGIgPSBoLkFkZm9ybSAmJiBoLkFkZm9ybS5hZFJlZ2lzdGVyKSAmJiBiW2ZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBlLmNvbGxhcHNlZENvbnRlbnQgJiYgZS5jb2xsYXBzZWRDb250ZW50Ll9lbGVtZW50LCBuID0gZS5leHBhbmRlZENvbnRlbnQgJiYgZS5leHBhbmRlZENvbnRlbnQuX2VsZW1lbnQsIGwgPSBlLmFkQm94ICYmIGUuYWRCb3guX2F0dHJpYnV0ZXMgJiYgZS5hZEJveC5fYXR0cmlidXRlcy5lbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbCB8fCBhLmEuZm9yRWFjaChoLkFkZm9ybSAmJiBoLkFkZm9ybS5hZERhdGEsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgPSBhICYmIGEuYm4gJiYgYS5ibiA9PSBmICYmIGEuY29udGFpbmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrICYmIG4gJiYgKGEuYS5idChrKSB8fCBhLmEuYnQobikpICYmIChjLmFkRmluZGluZ01ldGhvZCA9ICdBREZPUk1BRFMgdHdvLWVsZW1lbnQgZXhwYW5kYWJsZScsIGggPSBhLmQuZihrLCBrLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkLCB7IGFkVHlwZTogMiB9KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGguYWRmb3JtQ29sbGFwc2VkRWwgPSBrLCBoLmFkZm9ybUV4cGFuZGVkRWwgPSBuLCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgYS5hLmJ0KG4pICYmIChjLmFkRmluZGluZ01ldGhvZCA9ICdBREZPUk1BRFMgU2luZ2xlLWVsZW1lbnQgZXhwYW5kYWJsZScsIGggPSBhLmQuZihuLCBuLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkLCB7IGFkVHlwZTogMiB9KSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCAmJiBhLmEuYnQobCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICYmIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIGMuaW5kZXhPZiAmJiAtMSA8IGMuaW5kZXhPZihmICsgJyMnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBiICYmIGIuYWRCb3ggJiYgYi5hZEJveC5fYXR0cmlidXRlcyAmJiBiLmFkQm94Ll9hdHRyaWJ1dGVzLmVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIGQgIT09IGwgJiYgYS5hLmJ0KGQpICYmIG0ucHVzaChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgbS5sZW5ndGggJiYgKG0udW5zaGlmdChsKSwgaCA9IGEuZC5wKG0sIG1bMF0ubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQsIHsgYWRUeXBlOiAyIH0pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0FERk9STUFEUyBjb21wb3NpdGUnLCBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0FERk9STUFEUy0xJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IGEuZC5mKGwsIGwubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQsIHsgYWRUeXBlOiAyIH0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGIsIGMsIGQsIGUsIGcsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcgJiYgaCAmJiAoZSA9IGEudi5rKFsnZGl2W2lkPVwneW1fJyArIGcgKyAnXCddID4gaWZyYW1lLz0+L2RpdltpZD1cJycgKyBoICsgJ1wnXSddLCBiLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnWUlFTERNT0FEUycsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gYS52LmsoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4uL2lmcmFtZVtpZCQ9XCdfdHBpXCddLyRbaWR8KFswLTldKilfdHBpXS8uLi9baWQ9XCckMFwnXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi4vaWZyYW1lW2lkJD1cJ190cGlcJ10vLi4vZGl2LnltLyRbZGF0YS1sZi1pZHwoWzAtOV0rKV0vaWZyYW1lLz0+L1tpZD1cJyQwXCddJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgYiwgYywgZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnWUlFTERNT0FEUy0xJywgZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSBhLnYuayhbJ2Rpdi55bS9pZnJhbWUvPT4vYm9keS92aWRlby52aWRlby1lbGVtJ10sIGIsIGMsIGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ1lJRUxETU9BRFMtMicsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gYS52LmsoWydkaXYueW0nXSwgYiwgYywgZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnWUlFTERNT0FEUy0zJywgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChiLCBjLCBkLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLm1vYXRPYmplY3QgJiYgYS5tb2F0T2JqZWN0W2JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudS5hKFsnZGl2Lm1vYXRfdHJhY2thYmxlJ10sIGIpWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZiA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChiID0gKGIgPSBhLmcuZShiKSkgJiYgYi5kb2N1bWVudEVsZW1lbnQpICYmIGgoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYS52LmEoYiwgYS52LmIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGIsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID0gZihhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBnKG4sICdhZEVsZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPT0gbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5idChiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW01dID0gYy5hZE51bTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1bRF0gPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5idihtLCBkLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYiA9IGcobiwgJ2FkUHJveHlFbGVtZW50JykpICYmIGEuai5jKHAsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5idShtKSB8fCAoYiA9IG0sIGEuYWMuZyhwKSwgbi5yZW1vdmVFdmVudExpc3RlbmVyKCdhZExvYWRlZCcsIGspLCBiW01dID0gdm9pZCAwLCBiW0RdID0gdm9pZCAwLCB0YSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGcobiwgJ2NyZWF0aXZlVHlwZScpLCBoID0gZyhuLCAnYWRQcm94eUVsZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdiYW5uZXInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmJ0KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFkRmluZGluZ01ldGhvZCA9ICdDcmVhdGl2ZSBBUEkgLSBCYW5uZXInOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLmQuZihiLCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICYmIGEuZC5uKGYsIFtoXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ211bHRpcGFydCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID0gYS5kLm8oYiwgJ0RJVicsICExLCB2b2lkIDAsIGMsIGQsIG51bGwsIGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0NyZWF0aXZlIEFQSSAtIE11bHRpcGFydCcsIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tcG9zaXRlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPSBhLmQucChiLCAnRElWJywgITEsIHZvaWQgMCwgYywgZCwgbnVsbCwgaCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnQ3JlYXRpdmUgQVBJIC0gQ29tcG9zaXRlJywgZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdleHBhbmRhYmxlJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5idChiKSAmJiAoYy5hZEZpbmRpbmdNZXRob2QgPSAnQ3JlYXRpdmUgQVBJIC0gRXhwYW5kYWJsZScsIGYgPSBhLmQuZihiLCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSwgaCAmJiBhLmQubihmLCBbaF0pLCBuLmFkZEV2ZW50TGlzdGVuZXIoJ2FkTG9hZGVkJywgaykpLCBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5lcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmVwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBoKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCAoYyA9IGwoYikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCAoYS5jLnAgPyAoYyA9IGEuZy5iKGIpLCBjID0gZihjKSkgOiBjID0gdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmMucSAmJiAoYiA9IGEuZy5nKGIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmEuYmUoYikgPT09IGEuYy5lLCBkID0gYS5jLmMgJiYgJ0JPRFknID09PSBiLm5vZGVOYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjIHx8ICFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGgoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGEuYy5lcCA9IGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcobiwgJ2FkTG9hZGVkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBnKG4sICdhZEVsZW1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGUobSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcCA/IHAgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGIsIGMsIGQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudS5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGl2LmNlbHRyYS1hZC12MycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpdi5jZWx0cmEtYWQtdjQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBiKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgZSA9IGEudi5hKGIsIGEudi5iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGUsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIub2Zmc2V0V2lkdGggKiBiLm9mZnNldEhlaWdodCA9PT0gYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPSBhLmcuZShiKS5ib2R5LCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPyBkIDogITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCBkID0gYS52LmEoYiwgYS52LmIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGQsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYiA9IChiID0gYS5nLmUoYikpICYmIGIuZG9jdW1lbnRFbGVtZW50KSAmJiBnKGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgPSBnKGIpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5nLmcoYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYS5iZShjKSA9PT0gYS5jLmUsIGUgPSBhLmMuYyAmJiAnQk9EWScgPT09IGMubm9kZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIGUgfHwgKGNlbHRyYURpdmlJblBhcmVudEZyYW1lID0gZyhjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBsOwogICAgICAgICAgICAgICAgICAgICAgICBhLmMuZW8gPyBsID0gYS5jLmVvIDogKChsID0gZyhiKSkgfHwgKGwgPSBoKCkpLCBsIHx8IChsID0gZigpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrOwogICAgICAgICAgICAgICAgICAgICAgICBsICYmIChrID0gbCAmJiBsLmNlbHRyYSAmJiBsLmNlbHRyYS52aWV3YWJpbGl0eU9ic2VydmVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgJiYgYS5hLmJ0KGspKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0NlbHRyYSBBUEknLCBjID0gYS5kLmYoaywgay5ub2RlTmFtZSwgITEsIHZvaWQgMCwgYywgZCksIGQgPSBhLmEuY3MoYyksIChrID0gZShrLCBkKSkgJiYgYS5qLmMoYywgayksIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGwgJiYgIWsgJiYgKGEuYy5lbyA9IGwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoYiwgYywgZCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLnUuYShbJ2Rpdi52b3hBZERhdGEnXSwgYilbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZyA9IGcgJiYgZy5lbGVtZW50VG9UcmFjaykgJiYgYS5hLmJ0KGcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ1ZveCBBUEknLCBhLmQuZihnLCBnLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmEucygpLCBoID0gbnVsbCAhPT0gZyAmJiAxMSA+IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGYgPSBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdlbWJlZCcpLCBnID0gMDsgZyA8IGYubGVuZ3RoOyBnKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGZbZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwICE9PSBsW0RdICYmIC0xID09PSBsLmlkLmluZGV4T2YoJ21vYXRQeCcpICYmIGEuYS5idChsKSAmJiBsLmdldEF0dHJpYnV0ZSgnc3JjJykgJiYgZShsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IGwuZ2V0QXR0cmlidXRlKCdzcmMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGEuYWYuYShrLCBsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hZEZpbmRpbmdNZXRob2QgPSAnQU9MLTEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayA9IGEuZC5mKGwsIGssICExLCBlLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdvYmplY3QnKSwgZyA9IDA7IGcgPCBuLmxlbmd0aDsgZysrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPSBuW2ddLCBhLmEuYnQoZikgJiYgZShmKSAmJiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBmW0RdIHx8ICEwICE9PSBmW0RdKSAmJiAtMSA9PSBmLmlkLmluZGV4T2YoJ21vYXRQeCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBmLmNoaWxkcmVuLmxlbmd0aDsgbSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ21vdmllJyA9PT0gZi5jaGlsZHJlblttXS5uYW1lIHx8ICdNb3ZpZScgPT09IGYuY2hpbGRyZW5bbV0ubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrID0gZi5jaGlsZHJlblttXS52YWx1ZSwgIWsgfHwgIWsubWF0Y2goJ3Njb3JlY2FyZHJlc2VhcmNoJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBmLmNoaWxkcmVuLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaCAmJiAnRU1CRUQnID09PSBmLmNoaWxkcmVuW3BdLnRhZ05hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBmLmNoaWxkcmVuW3BdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbFtEXSAmJiAhMCA9PT0gbFtEXSB8fCAtMSAhPSBsLmlkLmluZGV4T2YoJ21vYXRQeCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5idChsKSAmJiBlKGwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID0gYS5hZi5hKGssIGwpLCBjLmFkRmluZGluZ01ldGhvZCA9ICdBT0wgRW1iZWQnLCBrID0gYS5kLmYobCwgaywgITEsIGUsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnT0JKRUNUJyA9PT0gZi5jaGlsZHJlbltwXS50YWdOYW1lICYmIChsID0gZi5jaGlsZHJlbltwXSwgYS5hLmJ0KGwpICYmICEwICE9PSBsW0RdICYmIC0xID09PSBsLmlkLmluZGV4T2YoJ21vYXRQeCcpICYmIGUobCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0FPTCBPYmplY3QnLCBrID0gYS5kLmYobCwgdm9pZCAwLCAhMSwgdm9pZCAwLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5vYmplY3QgJiYgZi5vYmplY3QuTW92aWUgPyBrID0gZi5vYmplY3QuTW92aWUgOiBmLmRhdGEgJiYgKGsgPSBmLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghayB8fCAhay5tYXRjaCgnc2NvcmVjYXJkcmVzZWFyY2gnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBhLmFmLmEoaywgZiksIGMuYWRGaW5kaW5nTWV0aG9kID0gJ1NXRiBhZHMnLCBrID0gYS5kLmYoZiwgaywgITEsIGUsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA9IGEudi5tKGIsIGMsIGQsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGs7CiAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGsubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IGtbZ10sICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGhbRF0gfHwgITAgIT09IGhbRF0pICYmIGEuYS5idChoKSAmJiAobCA9IGguZ2V0QXR0cmlidXRlKCdzcmMnKSkgJiYgJycgIT09IGwgJiYgLTEgPT09IGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihsKSAmJiBlKGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmFkRmluZGluZ01ldGhvZCA9ICdTdGFuZGFyZCBJbWFnZSBBZCBmaW5kaW5nICcsIGEuZC5mKGgsIGwsICExLCB2b2lkIDAsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA9IChrID0gYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY2FudmFzJykpICYmIGtbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSBrLmxlbmd0aCAmJiBhLmEuYnQoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ0FLUUFHQVBHRU4gQ2FudmFzJywgYyA9IGEuZC5mKGIsIGIubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPCBrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKGIucGFyZW50Tm9kZSkgJiYgYS5hLmJ0KGIucGFyZW50Tm9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmFkRmluZGluZ01ldGhvZCA9ICdBS1FBR0FQR0VOLTEnLCBjID0gYS5kLmYoYi5wYXJlbnROb2RlLCBiLnBhcmVudE5vZGUubm9kZU5hbWUsICExLCB2b2lkIDAsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuYnQoYikgJiYgKGMuYWRGaW5kaW5nTWV0aG9kID0gJ0FLUUFHQVBHRU4tMicsIGMgPSBhLmQuZihiLCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMucCA/IGEudS5iKFsnLi4uL2JvZHknXSwgYywgYikgOiBhLnUuYihbJy4uL2RpdiddLCBjLCBiKSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGEuYS5mKGIpID8gYiA6IGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lmcmFtZScpLCBnLCBoID0gMDsgaCA8IGUubGVuZ3RoOyBoKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyA9IGVbaF0sICFnW0RdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLmcuZShnKSA/ICExIDogITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPT09IGMgJiYgZiAmJiBhLmEuYnQoZykgfHwgMiA9PT0gYyAmJiAhZikgJiYgZC5wdXNoKGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS52ID0ge307CiAgICAgICAgICAgICAgICAgICAgYS52LmQgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdmZWF0aGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXknCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICBhLnYuZSA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuYXYuYWRGaW5kaW5nVGltZW91dCA/IChhLmEuYShhLmMuYXYuYWRGaW5kaW5nVGltZW91dCksIGEuYy5hdi5hZEZpbmRpbmdUaW1lb3V0ID0gbnVsbCwgYyB8fCAoYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEueS5iKDExLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEubC5rKGIsIDk5OTksIDUwMCwgYyksICEwKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52LmMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICBhLmZvY3VzLnBhZ2VJc1ByZXJlbmRlcmVkKCkgPyBhLmsuYS5henN4KCdub0xvbmdlclByZVJlbmRlcmVkJywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuYXBwbHkodGhpcywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogITAgfSkgOiBrLmFwcGx5KHRoaXMsIGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52Lm0gPSBmdW5jdGlvbiAoYiwgYywgZCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB4KGIsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlswXSAmJiBhLmEuYnQoYlswXSkgJiYgZShiWzBdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmFkRmluZGluZ01ldGhvZCA9ICdmaW5kSWZyYW1lQWRzJywgYS5kLmYoYlswXSwgYlswXS5zcmMsICExLCB2b2lkIDAsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52LmwgPSBmdW5jdGlvbiAoYiwgYywgZCwgZSwgZykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEudi5hKGUgfHwgYiwgYS52LmIpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgYi5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmID0gYltlXSwgKGcgPSBhLmcuZShmKSkgJiYgZy5kb2N1bWVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmlkICYmIGYuaWQubWF0Y2goJ2ViQmFubmVySUZyYW1lJykgJiYgYS5hLmJ0KGYpICYmIChoLmFkRmluZGluZ01ldGhvZCA9ICdzaXptZWsgYmFubmVyIGlmcmFtZScsIGggPSBhLmQuZihmLCBmLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBoLCBsKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPSBhLnYuayhbJ1tpZD1cJ2FkXCddJ10sIGcuZG9jdW1lbnRFbGVtZW50LCBjLCBkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuYWRGaW5kaW5nTWV0aG9kID0gJ2FkJywgaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCA9IHkoZy5kb2N1bWVudEVsZW1lbnQsIGMsIGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnRG9tc2VhcmNoIGZyaWVuZGx5IGlmcmFtZScsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoID0gYS52Lm4oZy5kb2N1bWVudEVsZW1lbnQsIGMsIGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnRG9tc2VhcmNoIGFnYWluIGluIGZyaWVuZGx5IGlmcmFtZScsIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnYubiA9IGZ1bmN0aW9uIChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gYS52LmEoYiwgYS52LmIpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gMDsgZyA8IGIubGVuZ3RoOyBnKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9IGJbZ10sIChlID0gYS5nLmUoZSkpICYmIGUuZG9jdW1lbnRFbGVtZW50ICYmIChlID0geShlLmRvY3VtZW50RWxlbWVudCwgYywgZCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52LmogPSBmdW5jdGlvbiAoYiwgYywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYS5lYShuLCBjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBkICYmIChiID0gYS50Lm4oYiwgYykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PT0gYS50LmkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudC5pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hZEZpbmRpbmdNZXRob2QgPSBjLmFjdGl2ZUNvbmZpZyA/ICdFWFA6ICcgKyBjLmFjdGl2ZUNvbmZpZyA6ICdFWFAgVW5tYXBwZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZC5mKGIsICdkaXYnLCAhMSwgdm9pZCAwLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52Lm8gPSBmdW5jdGlvbiAoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWphICYmICExICE9PSBiLnNob3VsZEtpbGxBZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgQSgpLmdldFRpbWUoKSAtIGMuYW8uc3RhcnRUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgIT09IGMuZW0gJiYgITAgIT09IGMucHJldmVudFRyeUZpbmRpbmdBZEFnYWluICYmIDUwMDAgPiBkICYmIChhLnYucChjKSwgYi5zaG91bGRLaWxsQWQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2JlZm9yZUFkS2lsbGVkJywgYS52Lm8pOwogICAgICAgICAgICAgICAgICAgIGEudi5xID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudi5wID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwICE9PSBiLmVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgQltiLnpyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5hKGIuY2MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5wZXJpc2NvcGVNYW5hZ2VyICYmIGIucGVyaXNjb3BlTWFuYWdlci5raWxsQWxsUGl4ZWxzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjID0gTCAmJiBMLnBhcmVudE5vZGUpICYmIGEudi5jKGMsIGIuYW8sIGIsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWMuZyhiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudi5rID0gZnVuY3Rpb24gKGIsIGMsIGQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEudS5hKGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goYiwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuYnQoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcgPSBiLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgPSBhLmEuYmYoZykgfHwgZy5zcmMgfHwgJ0RJVicsIGQuYWRGaW5kaW5nTWV0aG9kID0gJ0RPTVNFQVJDSCcsIGEuZC5mKGcsIGIsICExLCB2b2lkIDAsIGQsIGUpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBmdW5jdGlvbiAoYiwgYywgZCwgZSwgZywgaCkgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gYS51LmEoYywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmEuZmlsdGVyKGQsIGEuYS5idCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmxlbmd0aCA+PSAoaCA/IGMubGVuZ3RoIDogMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA9IGEuYS5iZihkWzBdKSB8fCBkWzBdLmdldEF0dHJpYnV0ZSgnc3JjJykgfHwgJ0RJVicsIGIoZCwgYywgITEsIHZvaWQgMCwgZSwgZyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnYuciA9IGZ1bmN0aW9uIChiLCBjLCBkLCBlLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKGEuZC5wLCBiLCBjLCBkLCBlLCBnKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEudi5zID0gZnVuY3Rpb24gKGIsIGMsIGQsIGUsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oYS5kLm8sIGIsIGMsIGQsIGUsIGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS52LmkgPSB5OwogICAgICAgICAgICAgICAgICAgIGEudi5mID0gZnVuY3Rpb24gKGssIG4sIG0sIHgsIHksIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5nLmQocikgJiYgKHIgPSB3aW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICByIHx8IChyID0gd2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGEudi5pLCB3ID0gYS52Lmo7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmMucCAmJiAnSEVBRCcgPT09IGsudGFnTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBrLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSFRNTCcgPT09IHYudGFnTmFtZSAmJiAodiA9IHYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKSwgMCA8IHYubGVuZ3RoICYmIChrID0gdlswXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gcShrLCBuLCBtLCB5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmVvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IHQoaywgbiwgbSwgeSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5lcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPSBhLnYuayhbJ1tpZD1cJ2FkXCddJ10sIGssIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ0RPTSBJZCA9IGFkJywgdjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPSBhLnYuayhbJy4uL2JvZHkvaW5zW2NsYXNzPVwnZGNtYWRzXCddW2RhdGEtZGNtLXJlbmRlcmluZy1tb2RlPVwnc2NyaXB0XCddJ10sIGssIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ0RDTSBpbnMnLCB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGEudi5rKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGl2LnRlYWRzLXBsYXllci9pZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXZbaWRePVwncGxheUFyZWFcJ10nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBrLCBuLCBtKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkRmluZGluZ01ldGhvZCA9ICd0ZWFkcycsIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gYS52LmsoWydkaXYuYXZhbGFuY2hlJ10sIGssIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ2F2YWxhbmNoZScsIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gZChrLCBuLCBtLCB5LCByKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLmVxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IG4gJiYgbi5udHZEb21TZWFyY2gpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayA9IGEuYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHYpLCBrID0gYS5hLmZpbHRlcihrLCBhLmEuYnQpLCAxIDwgay5sZW5ndGggJiYgKHYgPSBhLmQucChrLCAnRElWJywgITEsIHZvaWQgMCwgbiwgbSkpID8gKG4uYWRGaW5kaW5nTWV0aG9kID0gJ05hdGl2b0FkcyBjb21wb3NpdGUgYWRzJywgdikgOiAxID09PSBrLmxlbmd0aCAmJiAobi5hZEZpbmRpbmdNZXRob2QgPSAnTmF0aXZvQWRzIHNpbmdsZSBhZCcsIHYgPSBhLmQuZihrWzBdLCBrWzBdLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBuLCBtKSkgPyB2IDogITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gYS52LmsoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXYuc3RyLWFkdW5pdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tkYXRhLXN0ci1uYXRpdmUta2V5XScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tkYXRhLXN0ci1zaWJsaW5nXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi4vLi4vW2RhdGEtc3RyLW5hdGl2ZS1rZXldJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaywgbiwgbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZEZpbmRpbmdNZXRob2QgPSAnU2hhcmV0aHJvdWdoJywgdjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPSBhLnYuayhbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi9bZGF0YS1nZy1tb2F0XS9bZGF0YS1nZy1tb2F0LWlmcl0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4vW2RhdGEtZ2ctbW9hdF0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS1nZy1tb2F0XScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGssIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ0d1bUd1bScsIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2ID0gKHYgPSBhLmMucCA/IGsub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBrKSAmJiB2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKSwgQSA9IHt9LCBCLCBEOwogICAgICAgICAgICAgICAgICAgICAgICB2ICYmIDAgPCB2Lmxlbmd0aCAmJiAoQS5qcGQgPSAvYWRzXC5qZXRwYWNrZGlnaXRhbFwuY29tXC9saW5laXRlbXNcLyhcZCspXC9qcGQvLCBBLmFkZm9ybSA9IC9hZGZvcm1cLig/OmNvbXxuZXQpXC9hZGZzY3JpcHRcLz9cP2JuPShbMC05XSspLywgQS5xdWFydHogPSAvYWRzXC5xc1wuY29tLywgQS55aWVsZG1vID0gL2Fkc1wueWllbGRtb1wuY29tXC8uKlwmcD0oWzAtOV0rKS4qXCZsZj0oWzAtOV0rKS8sIEEueWllbGRtbzIgPSAvc3RhdGljXC55aWVsZG1vXC5jb21cL3ltXC5bYS16MC05XXsyfVwuanMvLCBhLmEuZm9yRWFjaCh2LCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiBpbiBBKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBLmhhc093blByb3BlcnR5KGIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYSAmJiBhLmdldEF0dHJpYnV0ZSgnc3JjJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIChCID0gYy5tYXRjaChBW2JdKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRCA9IGIsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICBhLnUuYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4uL1tjbGFzcyo9XCdqcGVkaXRvcmlhbHVuaXRcJ10nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi9bY2xhc3MqPVwnanBiYW5uZXJcJ10nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uLi9baWQqPVwnanBwbGF0Zm9ybVwnXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4uL1tpZCo9XCdqcGRfYWRoZXNpb25cJ10nCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIGspWzBdICYmIChEID0gJ2pwZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoRCAmJiAnanBkJyA9PT0gRCAmJiAodiA9IGYoaywgbiwgbSwgQiAmJiBCWzFdLCB5KSkgfHwgKHYgPSBnKGssIG4sIG0sIHkpKSB8fCBEICYmICdhZGZvcm0nID09PSBEICYmICh2ID0gbChrLCBuLCBtLCBCICYmIEJbMV0sIHksIHIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGIoaywgbiwgbSwgeSwgcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZEZpbmRpbmdNZXRob2QgPSAnVFJJUExFTElGVEFEUzogTW9hdCBzY3JpcHQgcXVlcnkgc3RyaW5nIGxvZ2ljIC0gJyArIChuLnRsdmlld19pZCA/ICd0bHZpZXdfaWQnIDogJ3Rsdmlld0lEJyksIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gZShrLCBuLCBtLCB5LCByKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkRmluZGluZ01ldGhvZCA9ICdUUklQTEVMSUZUQURTOiBEb21zZWFyY2ggdGxlaWQgYXR0cmlidXRlJywgdjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPSBoKGssIG4sIG0sIHksIHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ1RSSVBMRUxJRlRBRFM6IERvbXNlYXJjaCBiYXNlZCBvbiB3aW5kb3cnLCB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGEudi5rKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW2lkPVwncXphZFwnXScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpdiNxemMtY29udGFpbmVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgaywgbiwgbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZEZpbmRpbmdNZXRob2QgPSAnUXVhcnR6JywgdjsKICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHYgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgRCAmJiBhLmEuYXgoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lpZWxkbW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lpZWxkbW8yJwogICAgICAgICAgICAgICAgICAgICAgICBdLCBEKSAmJiAodiA9IEIgJiYgQlsxXSwgeCA9IEIgJiYgQlsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gcChrLCBuLCBtLCB5LCB2LCB4KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9IHIud2Vib3JhbWFfZGlzcGxheV90YWcgJiYgci53ZWJvcmFtYV9kaXNwbGF5X3RhZy5tZWRpYXBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAvaHR0cHM/OlwvXC8oWzAtOWEtekEtWlwuXC9dKykvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHIubWF0Y2ggJiYgci5tYXRjaCh2KVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBhLnUuYyhbJy4uLi4uL2RpdltpZF49XCdzY3JfXCddW2lkKj1cJ3JlbW90ZWRpdlwnXSddLCBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIEYgPSAwOyBGIDwgeC5sZW5ndGg7IEYrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGEudi5rKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcke1tzcmMqPVwnJyArIHIgKyAnXCddfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKy8ke1tzcmMqPVwnJyArIHIgKyAnXCddfScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgeFtGXSwgbiwgbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkRmluZGluZ01ldGhvZCA9ICdXZWJvcmFtYScsIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2ID0gdyhrLCBuLCBtKSkgfHwgKHYgPSB1KGssIG4sIG0sIHkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGEudi5sKGssIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYWRGaW5kaW5nTWV0aG9kID0gJ2ZyaWVuZGx5IGlmcmFtZScsIHY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID0gYS5nLmcoaykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IGEudi5sKHgsIG4sIG0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkRmluZGluZ01ldGhvZCA9ICdmaW5kIGlmcmFtZSBwYXJlbnQnLCB2OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5jLnEgfHwgeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID0geCB8fCBhLmcuZyhrKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9IGEuYS5iZSh4KSA9PT0gYS5jLmUsIHYgPSBhLmMuYyAmJiAnQk9EWScgPT09IHgubm9kZU5hbWUsICFyIHx8ICF2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID0gdyh4LCBuLCBtKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLmFkRmluZGluZ01ldGhvZCA9ICdpZnJhbWUgcGFyZW50IGV4cGFuZGFibGUnLCB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9IHUoeCwgbiwgbSwgeSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hZEZpbmRpbmdNZXRob2QgPSAnaWZyYW1lIHBhcmVudCBmaW5kQWQnLCB2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID0gYyhrLCBuLCBtLCB5KSkgPyAobi5hZEZpbmRpbmdNZXRob2QgPSAnVW5kZXJ0b25lJywgdikgOiAodiA9IGEudi5rKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi9pZnJhbWUjdmVydmUtYmFubmVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuLi4vYm9keS9pZnJhbWUjdmVydmUtZXhwYW5kYWJsZS89Pi9kaXYuY29udGVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4uL2JvZHkvaWZyYW1lI3ZlcnZlLWV4cGFuZGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmcmFtZSN2ZXJ2ZS1iYW5uZXIvPT4vZGl2LmNvbnRlbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lmcmFtZSN2ZXJ2ZS1iYW5uZXInCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIGssIG4sIG0pKSA/IChuLmFkRmluZGluZ01ldGhvZCA9ICdWZXJ2ZScsIHYpIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnYuYSA9IHg7CiAgICAgICAgICAgICAgICAgICAgYS52LnQgPSBmdW5jdGlvbiAoYiwgYywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYS5lYShuLCBjKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYy5jICYmIGIgJiYgYS5hLmJ0KGIpICYmIGEueC5lLmEoYiwgYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcgPT0gYS54LmIgJiYgYS54LmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuc2tpbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuYS5iZihiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiID0gYS5kLmYoYiwgZSB8fCBiLm5vZGVOYW1lLCAhMSwgdm9pZCAwLCBjLCBkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hZEZpbmRpbmdNZXRob2QgPSAnV0FMTFBBUEVSUyBBRFMnLCBiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnYudSA9IDE7CiAgICAgICAgICAgICAgICAgICAgYS52LmIgPSAyOwogICAgICAgICAgICAgICAgICAgIGEudi52ID0gNTAwOwogICAgICAgICAgICAgICAgICAgIGEudi5oID0gMjA7CiAgICAgICAgICAgICAgICAgICAgYS52LncgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWQ6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGltZzogMSwKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiAxCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhkLCBnLCBjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLnJlcGxhY2UoLyZhbXA7L2csICcmJykucmVwbGFjZSgvKF5ccyt8XHMrJCkvZywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBoID0gZC5zcGxpdCgnJicpLCBsID0gMDsgbCA8IGgubGVuZ3RoOyBsKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gaFtsXS5zcGxpdCgnPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2Yga1sxXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtbMF0gJiYga1swXS5tYXRjaCgnbW9hdENsaWVudCcpICYmIChlWydyYXdNJyArIGtbMF0uc2xpY2UoMSldID0ga1sxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBrLCBxLCB5ID0gcSA9IGtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IDEwMCA+IHggJiYgKHEgPSBkZWNvZGVVUklDb21wb25lbnQocSksIHkgIT0gcSkgJiYgIXEubWF0Y2goL15odHRwKHMpP1w6Lyk7IHgrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEucmVwbGFjZSgvKF5ccyt8XHMrJCkvZywgJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbMV0gPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1sxXSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZVtrWzBdXSA9IGtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hcC5mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGMgJiYgKGUuY2xpZW50Wm9uZSA9ICd1bmRlZmluZWQnICE9PSBjID8gYyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnZ2V0QWRJZGVudGlmaWVyc0Zyb21RdWVyeVN0cmluZycsIGUsIGQsIGcsIGMsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IGEuYXAuZyhlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChkLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhID0gYS5tYXRjaCgnaHR0cHM/Oi8vKD86W2EtekEtWjAtOVxcLVxcX10qKS5kb3VibGVjbGljay5uZXQvKD86W2EtekEtWjAtOV0qKS9hZGovKC4qKScpKSAmJiBhWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhWzFdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT09IHR5cGVvZiBhZHNyYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhZHNyYzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGEuYy5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBlLm1hdGNoKCdeYWRzcmNfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgaFswXSAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGEuYy5lW2VdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmMuZVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZSA9IGcucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JyksIGggPSAwOyBoIDwgZS5sZW5ndGg7IGgrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVbaF0uc3JjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IGMoZVtoXS5zcmMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiB8fCAhYS5jLnAgfHwgYS5jLnEgfHwgKGUgPSBjKGEuYy5lLmxvY2F0aW9uLmhyZWYpKSAmJiAoYiA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGQuek1vYXRSYXdTbGljZXIxID0gZC5tb2F0Q2xpZW50U2xpY2VyMSB8fCAndW5jbGFzc2lmaWVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgZC56TW9hdFJhd1NsaWNlcjIgPSBkLm1vYXRDbGllbnRTbGljZXIyIHx8ICd1bmNsYXNzaWZpZWQnOwogICAgICAgICAgICAgICAgICAgICAgICBiID8gKGIgPSBiLnNwbGl0KCc7JylbMF0uc3BsaXQoJy8nKSwgZC56TW9hdFJldXRlcnNTbGljZXIxID0gYlswXSB8fCBkLm1vYXRDbGllbnRTbGljZXIxIHx8ICd1bmNsYXNzaWZpZWQnLCBkLnpNb2F0UmV1dGVyc1NsaWNlcjIgPSBiWzFdIHx8IGQubW9hdENsaWVudFNsaWNlcjIgfHwgJ3VuY2xhc3NpZmllZCcpIDogKGQuek1vYXRSZXV0ZXJzU2xpY2VyMSA9IGQubW9hdENsaWVudFNsaWNlcjEgfHwgJ3VuY2xhc3NpZmllZCcsIGQuek1vYXRSZXV0ZXJzU2xpY2VyMiA9IGQubW9hdENsaWVudFNsaWNlcjIgfHwgJ3VuY2xhc3NpZmllZCcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5hcCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYXAuYSA9IGZ1bmN0aW9uIChkLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgZC5zdGFydFRpbWUgfHwgZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuc3RhcnRUaW1lID0gYS5jLmJqOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBkLnJhbmQgfHwgZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucmFuZCA9IHcuZmxvb3Iody5yYW5kb20oKSAqIHcucG93KDEwLCAxMikpOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIGQuYWROdW0gJiYgKGQuYWROdW0gPSByLnpyLCByLnpyKyspOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcC5iID0gZnVuY3Rpb24gKGQsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuYS5hYSgpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuYW8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KGMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXAuYyA9IGZ1bmN0aW9uIChkLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hcC5kKGQsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICBjICYmIChjLl9BRF9GT1JNQVQgPSBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRJbml0aWFsaXplZCcsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGIuRGZwU2xvdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiLmFvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZHooYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5mdWxsQWRVbml0UGF0aCA9IGEuYW4uYyhjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmRmcFNsb3RJZCA9IGEuYW4uZChjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gYS5hbi5lKGMpLCBkID0gMDsgZCA8IGMubGVuZ3RoOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbJ2RmcEFkVW5pdExhYmVsJyArIGRdID0gY1tkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ2dldElkcycsIGMsIGQsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXAuZCA9IGZ1bmN0aW9uIChhLCBnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuY2xhc3NOYW1lLCBiID0gYS5nZXRBdHRyaWJ1dGUoJ3NyYycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zcGxpdCgnXG4nKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgIT09IGMuaW5kZXhPZignbW9hdGZvb3RlcicpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYi5zcGxpdCgnPycpLCBoID0gYi5zcGxpdCgnIycpLCBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDwgZS5sZW5ndGggJiYgMSA8IGgubGVuZ3RoICYmIGVbMV0ubGVuZ3RoIDwgaFsxXS5sZW5ndGggJiYgKGMgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PSBlLmxlbmd0aCB8fCBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPCBlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gayhlWzFdLCBnLCAndW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwgPSBkKGwsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXAuZSA9IGZ1bmN0aW9uIChhLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYSAmJiBhLmNsYXNzTmFtZS5yZXBsYWNlKCdhbXA7JywgJycpLnNwbGl0KCc/JylbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9IGIgJiYgayhiLCBkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLl9BRF9GT1JNQVQgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcC5mID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmEuYW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiAoZC56TW9hdENVUkwgPSBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnYXBwZW5kTm9uUXNBZElkcycsIGQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcC5nID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGQgaW4gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmhhc093blByb3BlcnR5KGQpICYmIGQgJiYgZC5tYXRjaCgnbW9hdENsaWVudExldmVsJykgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBhW2RdICYmIChhW2RdID0gYVtkXS5yZXBsYWNlKC9cOi9nLCAnXycpLnJlcGxhY2UoLyUzQS9naSwgJ18nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcC5oID0gZnVuY3Rpb24gKGEsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgfHwge307CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFwLmkgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBhID0gZGVjb2RlVVJJQ29tcG9uZW50KGRlY29kZVVSSUNvbXBvbmVudChhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC0xIDwgYS5pbmRleE9mKCdhbm9ueW1vdXMuZ29vZ2xlJykgJiYgKGEgPSAnYW5vbnltb3VzLmdvb2dsZScpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEubWF0Y2goL14oPzpbXjpdezEsfTpcL1wvKT8oPzo6KlwvP1wvPyk/KD86d3d3XC4pPyhbXlwvOl0qKS8pOwogICAgICAgICAgICAgICAgICAgICAgICBkICYmIGRbMV0gJiYgKGEgPSBkWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuc3BsaXQoJy8nKVswXTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXAuaiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYXAuYShkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hcC5rKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBkID0gYS5hcC5nKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFwLmwgJiYgYS5hcC5sKGQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHR5cGVvZiBhICYmIChhLmZxID0gMCwgYS5nbSA9IDAsIGEuY2ggPSAwLCBhLmdhID0gMCwgYS5naCA9IDAsIGEuaGFzT3duUHJvcGVydHkoJ2x4JykgJiYgZGVsZXRlIGEubHgsIGEudW0gPSAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChiLCBjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmEuZHooYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5kdSh7IGFsbDogITAgfSwgZCkgJiYgKGIuekdTUlMgPSAnMScpOwogICAgICAgICAgICAgICAgICAgICAgICBiLnpHU1JDID0gJzEnOwogICAgICAgICAgICAgICAgICAgICAgICBjLnpNb2F0Q0hOTFMgJiYgKGIuZ3YgPSBjLnpNb2F0Q0hOTFMpOwogICAgICAgICAgICAgICAgICAgICAgICBjLnpNb2F0R1NDQUNIRSAmJiAoYi5odyA9IGMuek1vYXRHU0NBQ0hFKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuaSA9IGEgJiYgYS5zbGkgJiYgJ2ZhbHNlJyAhPT0gYS51c2VTbG90SWtleSAmJiAhMSAhPT0gYS51c2VTbG90SWtleSA/IGEuc2xpIDogJ1JFVVRFUlNfSEVBREVSMSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXZfaWQnCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgMCA8IGQubGVuZ3RoICYmIGMuZGZwSGVhZGVyU2xvdHMgJiYgYS5hLmNkKGIsIGMuZGZwSGVhZGVyU2xvdHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmMuZS5nb29nbGV0YWcsIGMgPSBjICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBjLnB1YmFkcyAmJiBjLnB1YmFkcygpLCBkID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBjLmdldFNsb3RzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGMuZ2V0U2xvdHMoKSwgZCA9IGEuYS5mKGUpID8gZS5sZW5ndGggOiAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYi52YiA9IGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBhLmEuYWsoYS5jLmJhKSAmJiA1MDAwID4gZW5jb2RlVVJJQ29tcG9uZW50KGEuYy5iYSkubGVuZ3RoICYmIChiLmd1ID0gYS5jLmJhKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5pZCA9IGEuYy5iYiA/ICcxJyA6ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgYi5paSA9IGEuYy5hdTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYm8gPSBiLm1vYXRDbGllbnRTbGljZXIxOwogICAgICAgICAgICAgICAgICAgICAgICBhLmJkID0gYi5tb2F0Q2xpZW50U2xpY2VyMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmMuZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYi5jbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInID09PSB0eXBlb2YgZCAmJiAoYi5wYyA9IGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5jbSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkLCBlID0gW10sIGcsIGggPSBhLmEuYXYoKSA/IDIwNDggOiA3NzUwLCBmID0gYyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBiLmZzID0gJzE5MzIyNCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCBpbiBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5oYXNPd25Qcm9wZXJ0eShkKSAmJiAoMSAhPSBiLmUgfHwgJ3gnICE9PSBkICYmICd5JyAhPT0gZCAmJiAnYycgIT09IGQgPyBlLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KGQpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pKSA6IGdbZF0gPSBiW2RdLnNwbGl0KCdhJykpOwogICAgICAgICAgICAgICAgICAgICAgICBkID0gZS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaCAtIGQubGVuZ3RoLCBsID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgZy54KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gMCwgcCA9IDA7IHAgPCBnLngubGVuZ3RoOyBwKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgKz0gZy54W3BdLmxlbmd0aCArIChnLnlbcF0gPyBnLnlbcF0ubGVuZ3RoIDogMCkgKyAoZy5jW3BdID8gZy5jW3BdLmxlbmd0aCA6IDApLCBrIDwgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgbCAmJiAoZCArPSAnJng9JyArIGcueC5zbGljZSgwLCBsIC0gMSkuam9pbignYScpLCBkICs9ICcmeT0nICsgZy55LnNsaWNlKDAsIGwgLSAxKS5qb2luKCdhJyksIGQgKz0gJyZjPScgKyBnLmMuc2xpY2UoMCwgbCAtIDEpLmpvaW4oJ2EnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5oYXNPd25Qcm9wZXJ0eSh0KSAmJiAoZyA9ICcmJyArIGVuY29kZVVSSUNvbXBvbmVudCh0KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChmW3RdKSwgZy5sZW5ndGggKyBkLmxlbmd0aCA8IGggJiYgKGQgKz0gZykpOwogICAgICAgICAgICAgICAgICAgICAgICBkID0gZC5yZXBsYWNlKC9ceDI3L2csICclMjcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gJyZuYT0nICsgYS5hLmN3KGQsIGIuaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuaiA9IDI1ID09IGMgPyAnc3RyaW5nJyA9PSB0eXBlb2YgYS5jLmQgJiYgYS5jLmQuc2xpY2UoMCwgNTAwKSB8fCAnJyA6IGEuYS5hcChhLmMuZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYS5hYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAoYi5scCA9IGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEoYiwgYywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuYS5keihkKSwgZyA9IGEuYS5kdSh7IGFsbDogITAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGMsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYlthXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID8gZFthXSAmJiAnLScgIT09IGRbYV0gJiYgKGJbYV0gPSBkW2FdKSA6IGJbYV0gPSBkW2FdIHx8ICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLnkgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgeSA9ICd6TW9hdFBTIHpNb2F0VFAgek1vYXRTVCB6TW9hdEFSQkwgek1vYXRBZFVuaXQxIHpNb2F0U3Rvcnkgek1vYXRBVSB6TW9hdFBpeGVsRGlzdGFuY2Ugek1vYXRSYXdTbGljZXIxIHpNb2F0UmF3U2xpY2VyMiB6TW9hdFJldXRlcnNTbGljZXIxIHpNb2F0UmV1dGVyc1NsaWNlcjIgek1vYXRCbGFja2xpc3Qgek1vYXRKUycuc3BsaXQoJyAnKSwgeCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkeDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw1OiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXRoZXI6IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdnRfb25seTogNwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueS5jID0gZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLmEuZHooYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuaHAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBjLnpNb2F0QWRVbml0MSAmJiAoYi56TW9hdEFkVW5pdDEgPSBjLnpNb2F0QWRVbml0MSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuek1vYXRBZFVuaXQyICYmIChiLnpNb2F0QWRVbml0MiA9IGMuek1vYXRBZFVuaXQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgYy56TW9hdEFkVW5pdDMgJiYgKGIuek1vYXRBZFVuaXQzID0gYy56TW9hdEFkVW5pdDMpOwogICAgICAgICAgICAgICAgICAgICAgICBjLnpNb2F0QWRVbml0NCAmJiAoYi56TW9hdEFkVW5pdDQgPSBjLnpNb2F0QWRVbml0NCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jICYmIHdpbmRvdy50b3AuZG9jdW1lbnQgJiYgd2luZG93LnRvcC5kb2N1bWVudC5oYXNGb2N1cyAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2Ygd2luZG93LnRvcC5kb2N1bWVudC5oYXNGb2N1cyAmJiAoYi53ZiA9IHdpbmRvdy50b3AuZG9jdW1lbnQuaGFzRm9jdXMoKSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHhbZF07CiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZCAmJiAoYi5yYSA9IGQpOwogICAgICAgICAgICAgICAgICAgICAgICBjLmFsdEtleSAmJiAoYltjLmFsdEtleV0gPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYi5weG0gPSAnNyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuc2dzID0gMzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnYXBwZW5kQ29tbW9uS2V5cycsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS55LmIgPSBmdW5jdGlvbiAobiwgbSwgeCwgRywgdSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IGEuYS5keihtKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hcC5hKG0sIEcpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB6LmUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2QoeiwgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGYobSwgeik7CiAgICAgICAgICAgICAgICAgICAgICAgIGEueS5jKHosIG0pOwogICAgICAgICAgICAgICAgICAgICAgICBjKHopOwogICAgICAgICAgICAgICAgICAgICAgICBhLmggJiYgKHouY20gPSBhLmEuYXMoYS5oLCBhLmkpLm11bHRpcGxpZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5rcSA9IGEuYy5lICYmIGEuYy5lLmRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHoua3EgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHouaHEgPSBhLmMubSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICB6LmhzID0gYS5jLmogPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgei5odSA9IGEuYy5haCA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICB6LmhyID0gYS5jLmFkID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHouaHQgPSBhLmMuYWsgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgei5kbnQgPSBhLmMuZWogPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDExID09PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdhZE5vdEZvdW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQSA9IFtdLCBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChFIGluIG9hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9hLmhhc093blByb3BlcnR5KEUpICYmIEEucHVzaChFICsgJz0nICsgb2FbRV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5rID0gQS5qb2luKCcmJykuc2xpY2UoMCwgMzAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh6LmUgaW4gc2EpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LmJxID0gYS5jLm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSBtLnNraW4gJiYgKHoud3AgPSAxID09PSBtLmlzU2tpbiA/IDEgOiAxID09PSBtLmlzQW9sU2tpbiA/IDIgOiAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouZiA9IE51bWJlcigha2EpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmRjICYmICh6Lm5oID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLklTX1BBR0VfTEVWRUwgfHwgcCh6LCB6LmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCh6LCB6LmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei50ID0gbS5zdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LmRlID0gbS5yYW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5yeCA9IGEuYy5heC5hOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5tID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHouYXIgPSAnMjlhZDU5ZC1jbGVhbic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lml3ID0gJzMxZDY5NjUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNoKHosICdhaScsIHIueik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2goeiwgJ3dyJywgci5BQ1RJVkVUSU1FVU5USUxTQ1JPTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5xID0gci5tKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LmNiID0gVSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5jdSA9IFI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6LmxsID0gYS5jLmRoIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2goeiwgJ2xtJywgYS5jLmRkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5sbiA9IGEuYy5wID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2QoeiwgYS5mb2N1cy5nZXRRdWVyeVN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXAuaChtLCB6KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlZmluZWQnICE9PSB0eXBlb2YgbSAmJiAoei5kID0gbS5tb2F0Q2xpZW50TGV2ZWwxICsgJzonICsgbS5tb2F0Q2xpZW50TGV2ZWwyICsgJzonICsgbS5tb2F0Q2xpZW50TGV2ZWwzICsgJzonICsgbS5tb2F0Q2xpZW50TGV2ZWw0LCBBID0gYS5hLmR4KHsgYWxsOiAnek1vYXRQUyB6TW9hdFRQIHpNb2F0U1Qgek1vYXRBUkJMIHpNb2F0QWRVbml0MSB6TW9hdFN0b3J5IHpNb2F0QVUgek1vYXRQaXhlbERpc3RhbmNlIHpNb2F0UmF3U2xpY2VyMSB6TW9hdFJhd1NsaWNlcjIgek1vYXRSZXV0ZXJzU2xpY2VyMSB6TW9hdFJldXRlcnNTbGljZXIyIHpNb2F0QmxhY2tsaXN0IHpNb2F0SlMnLnNwbGl0KCcgJykgfSwgQykgfHwgeSwgcSh6LCBBLCBtKSwgbS5hZEZpbmRpbmdNZXRob2QgJiYgKHouaHYgPSBtLmFkRmluZGluZ01ldGhvZCksIGQoeiwgbSwgQyksIGIoeiwgbSksIG0gJiYgKHouek1vYXRSYXdTbGljZXIxID0gbS56TW9hdFJhd1NsaWNlcjEgfHwgJ3VuY2xhc3NpZmllZCcsIHouek1vYXRSYXdTbGljZXIyID0gbS56TW9hdFJhd1NsaWNlcjIgfHwgJ3VuY2xhc3NpZmllZCcpLCBBID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyMDE1OTIzMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzMzNzc0OTEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjc2MzU4MzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICczMjI3NjgzMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE5OTcxNjcyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgbSAmJiBtLm1vYXRDbGllbnRMZXZlbDEgJiYgIWEuYS5heChBLCBtLm1vYXRDbGllbnRMZXZlbDEpICYmICh6LnpNb2F0QmxhY2tsaXN0ID0gITApLCBhLmEuZHUoeyBhbGw6ICEwIH0sIEMpICYmIGUoeiwgbSksIHouZ3cgPSAncmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNCcsIHouZmQgPSAnMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgei5hYyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6Lml0ID0gYS52LnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmMuYW0oKS5pc0luQXBwICYmICh6Lmx2ID0gYS5jLmNwKCksIHouemwgPSBhLmMuZWEoKSA/IDEgOiAwLCBhLmMuY3EoKSA/IChhLmEuYnAoKSAmJiAoei53byA9IDEpLCAoQyA9IGEuYS5ibChhLmMuYmMpKSAmJiAoei56TW9hdE1NQUtucyA9IEMpKSA6IGEuYy5kYSgpICYmICh6Lmx4ID0gMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kLmMoKSAmJiBrKHopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh6LCBtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDID0gYS5hcS5hKCkpICYmICh6LnBlID0gQyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdkcm9wTm9uQWRQaXhlbCcsIHosIG4sIG0sIHgsIEcsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCh6LCB1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBsKHopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IFc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gYS55LmQobSwgeCArICcmY3M9MCcsIHopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwID09PSB1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzOiB6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXM6IG0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5zaG91bGRTZW5kUGl4ZWwgJiYgbS5xdWVyeXN0cmluZyAmJiByLnloLnlpKG0ucXVlcnlzdHJpbmcsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnkuYSA9IGZ1bmN0aW9uIChuLCBtLCB4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmNsb3NlZCB8fCAhbiB8fCAhMCA9PT0gbi5lcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEcgPSBuLmdldEZvcm1hdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBhLnkuYyhtLCBuLmFvKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyhtKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ua3EgPSBhLmMuZSAmJiBhLmMuZS5kZXZpY2VQaXhlbFJhdGlvOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh1KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmtxID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhLnYucShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2Ygbi5hbyAmJiAoMiAhPT0gbi5hbiB8fCAxICE9PSBtLmUgJiYgMyAhPT0gbS5lKSAmJiAhKG0uZSBpbiBzYSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubG8gPSBuLkZJTkRfQURfVFJJRVM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnByb3h5VHJhY2tpbmdFbmFibGVkICYmIChtLnRyID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnVrID0gYS5hLmJsKGEuYy5iYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgQSA9IGEuYS5ibigpLCBDID0gYS5hLmJtKEEucmVzdWx0cyksIHogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGU6ICdwaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VfaGVpZ2h0OiAnd2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX3Byb3BlcnRpZXM6ICdyaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdmljb246ICd0aycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goQywgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW3pbYV1dID0gQS5yZXN1bHRzW2FdID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uaGFzTm9uSWZyYW1lTGlzdGVuZXIgJiYgKG0ubmkgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBCID0gbi5hZywgQyA9IHt9LCBFID0gYS53LmIobi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoOSA9PT0gbS5lICYmIDIgPT09IG0ucSB8fCAyNSA9PT0gbS5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgRCBpbiBCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmhhc093blByb3BlcnR5KEQpICYmICcnICE9PSBEICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2YgQltEXSAmJiAtMSA9PT0gRC5pbmRleE9mKCdkdkNvbnRhaW5zJykgJiYgLTEgPT09IEQuaW5kZXhPZignaW5kZXhPZicpICYmIC0xID09PSBELnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY2xpY2t0YWcnKSAmJiAoQ1sneicgKyBEXSA9IEJbRF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZSA9IDI1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PT0gbi5hbiAmJiAobS5kYyA9IG4uV01PREUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgIT09IHR5cGVvZiBuLmFlIHx8IDAgIT0gbS5lICYmIDI1ICE9IG0uZSA/IG0uYWsgPSAnLScgOiAoRCA9IGEuYy5qID8gNzAwIDogMTIwMCwgbS5hayA9IG4uYWUubGVuZ3RoIDw9IEQgPyBuLmFlIDogbi5hZS5zbGljZSgwLCBEKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJpID4gbi5iZyAmJiAobi5iZyA9IG4uYmkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5ibSA+IG4uYmsgJiYgKG4uYmsgPSBuLmJtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYobi5hbywgbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2QobSwgYS5mLnIoITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uYnEgPSBhLmMubjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcobSwgbi5hbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID09PSBuLmFvLnNraW4gJiYgKG0ud3AgPSAxID09PSBuLmFvLmlzU2tpbiA/IDEgOiAxID09PSBuLmFvLmlzQW9sU2tpbiA/IDIgOiAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZyA9IG4uYXEuZysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHYsIEg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmlzU1JFTWVhc3VyYWJsZSB8fCBuLnNldERpbWVuc2lvbnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uSVNfUEFHRV9MRVZFTCB8fCAoMSA9PT0gbi5hby5za2luID8gKEggPSBhLmMucihhLmMuZSksIHYgPSBILndpZHRoLCBIID0gSC5oZWlnaHQpIDogbi5jb21wb3NpdGVBZEFyZWFQeCA/ICh2ID0gbi5jb21wb3NpdGVBZEFyZWFQeCwgSCA9IDEpIDogKHYgPSBuLklOSVRJQUxfV0lEVEgsIEggPSBuLklOSVRJQUxfSEVJR0hUKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdiB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSCA9IEggfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCB2ICYmIDAgPCBIICYmIChuLmlzU1JFTWVhc3VyYWJsZSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uaHEgPSBhLmMubSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5ocyA9IGEuYy5qID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmh1ID0gYS5jLmFoID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmhyID0gYS5jLmFkID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmh0ID0gYS5jLmFrID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmRudCA9IGEuYy5laiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5oID0gSDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udyA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnJtID0gbi5pc1NSRU1lYXN1cmFibGUgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmRsKCkgJiYgbiAmJiBuLmVsZW1lbnRSZWN0ICYmIChtLmZ5ID0gbi5lbGVtZW50UmVjdC5sZWZ0LCBtLmdwID0gbi5lbGVtZW50UmVjdC50b3ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZChtLCBuLmFvLCBHKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIobSwgbi5hbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmggJiYgKG0uY20gPSBhLmEuYXMoYS5oLCBhLmkpLm11bHRpcGxpZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5mID0gTnVtYmVyKCFrYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLklTX1BBR0VfTEVWRUwgfHwgcChtLCBtLmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdChtLCBtLmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS50ID0gbi5hby5zdGFydFRpbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmRlID0gbi5hby5yYW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5yeCA9IGEuYy5heC5hOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5jdSA9IFI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm0gPSBtLm0gfHwgYS5hLmJiKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5hciA9ICcyOWFkNTlkLWNsZWFuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uaXcgPSAnMzFkNjk2NSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNiID0gVSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNoKG0sICdyZCcsIG4ucmVmcmVzaERlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5jaChtLCAnek1vYXRBUicsIG4ubW9hdEF1dG9SZWZyZXNoZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNoKG0sICd6TW9hdFdEQUMnLCBuLndhc0R1cGVBdXRvQ3JlYXRpdmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5sbCA9IGEuYy5kaCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNoKG0sICdsbScsIGEuYy5kZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubG4gPSBhLmMucCA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmMgJiYgKG0uZ2ggPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5kYyAmJiAobS5uaCA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS54eCA9IGEuYy5lciArICc6JyArIGEuZi5haygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS50ZCA9IGEuYy5kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFhID0gYS5jLnc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFiID0gYS5jLng7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFpID0gYS5jLnU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFqID0gYS5jLnY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFmID0gYS5jLnk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFlID0gYS5jLno7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnFoID0gYS5jLmFhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5xZyA9IGEuYy5hYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5sayA9IG4gJiYgbi5lbGVtZW50UmVjdCAmJiBuLmVsZW1lbnRSZWN0LnRvcCArIGEuYy5hYyB8fCAndW5kZWZpbmVkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzTmFOKGEuYy5oKSB8fCAobS5sYiA9IGEuYy5oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubGUgPSBFYSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mICYmIHZvaWQgMCAhPT0gYS5mLmFsICYmIChtLmxmID0gYS5mLmFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZiAmJiB2b2lkIDAgIT09IGEuZi5hYSAmJiAobS5sZyA9IGEuZi5hYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmYgJiYgdm9pZCAwICE9PSBhLmYuYW0gJiYgKG0ubGggPSBhLmYuYW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmNiICYmIChtLmZhID0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyAhPT0gdHlwZW9mIGEuYy5jZCB8fCBpc05hTihhLmMuY2QpIHx8IChtLnp6ID0gYS5jLmNkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLm0gJiYgYS5tLmEoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNoID0gMSwgbS5naCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLm8gJiYgYS5vLmEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmMuYncgJiYgKG0uc3MgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBuLnBlcmlzY29wZU1hbmFnZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICFhLmZvY3VzLnBhZ2VJc1Zpc2libGUoKSAmJiBuICYmIG4uY291bnRlcnMgJiYgbi5jb3VudGVycy5zdHJpY3REd2VsbCAmJiAwID09IG4uY291bnRlcnMuc3RyaWN0RHdlbGwudEN1ciAmJiAyMSA9PSBtLmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEggPSBhLmEuYXkgJiYgJzAnICE9IGEuYS5heSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5wZXJpc2NvcGVNYW5hZ2VyLm1lYXN1cmFibGUgfHwgIWEuYy5jICYmIHYgJiYgSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uY2ggPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnBlcmlzY29wZU1hbmFnZXIuZnVsbHlNZWFzdXJhYmxlICYmIG4uYW8gJiYgMSAhPSBuLmFvLnNraW4gJiYgKG0uZ2EgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5jaCA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhLm8uZCAmJiBuICYmIG4uYW8gJiYgbi5hby5zdGFydFRpbWUgJiYgIWlzTmFOKG4uYW8uc3RhcnRUaW1lKSAmJiAodiA9IGEuby5kIC0gbi5hby5zdGFydFRpbWUsIG0uZmcgPSAwIDw9IHYgPyB2IDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNoID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udnYgPSBFID8gbi52aWV3YWJpbGl0eU1ldGhvZFtFXSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gbi52aWV3YWJpbGl0eU1ldGhvZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udncgPSAodi5zdHJpY3QgfHwgMCkgKyAnOicgKyAodi5zZnJhbWUgfHwgMCkgKyAnOicgKyAodi5wc2NvcGUgfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gbi52aWV3YWJpbGl0eVBlcmNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnZwID0gdltFXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udnggPSB2LnN0cmljdCArICc6JyArIHYuc2ZyYW1lICsgJzonICsgdi5wc2NvcGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodiA9IGEuYXEuYSgpKSAmJiAobS5wZSA9IHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNkKG0sIGEudy51KG4uenIsIG0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5jZChtLCBhLmZvY3VzLmdldFF1ZXJ5U3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNkKG0sIGEuYWkuYihuLnpyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2QobSwgYS5hci5hKG4uenIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5jZChtLCBuLmNvdW50ZXJzLmdldFFzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5weDIgJiYgbi5weDIuaW5TYW1wbGUgJiYgIW4ucHgyLnN1Y2Nlc3MgJiYgKG0uek1vYXRJREYgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucHgyICYmIChtLnhkID0gKG4ucHgyLmluU2FtcGxlID8gJzEnIDogJzAnKSArIChuLnB4Mi5maXJlZFBpeGVsID8gJzEnIDogJzAnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFzLmEobiwgbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmF0LmEobiwgbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2FpJywgci56KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5jaChtLCAnd3InLCByLkFDVElWRVRJTUVVTlRJTFNDUk9MTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2FwJywgbi5jYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2F4Jywgbi5iZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2F5Jywgbi5iaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2F6Jywgbi5iayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JhJywgbi5ibSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2F3Jywgbi5iYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JnJywgbi5iZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JlJywgbi5iZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JjJywgbi5idyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JmJywgbi5ieSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2JoJywgbi5ieCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY2gobSwgJ2J6Jywgbi5jdSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmNsID0gdy5yb3VuZCgxMDAgKiBuLklSNS5BUkVBIC8gKG0udyAqIG0uaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IG4uYXFbMl0gJiYgKG0uYXUgPSBuLmFxWzJdIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgbi5hcVszXSAmJiAobS5hdiA9IG4uYXFbM10gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBuLmFxWzIzXSAmJiAobS5ieSA9IG4uYXFbMjNdIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmF0ID0gbi5kbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXAuaChuLmFvLCBtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uZCA9IG4uYW8ubW9hdENsaWVudExldmVsMSArICc6JyArIG4uYW8ubW9hdENsaWVudExldmVsMiArICc6JyArIG4uYW8ubW9hdENsaWVudExldmVsMyArICc6JyArIG4uYW8ubW9hdENsaWVudExldmVsNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYW8gJiYgKG0uek1vYXRSYXdTbGljZXIxID0gbi5hby56TW9hdFJhd1NsaWNlcjEgfHwgJ3VuY2xhc3NpZmllZCcsIG0uek1vYXRSYXdTbGljZXIyID0gbi5hby56TW9hdFJhd1NsaWNlcjIgfHwgJ3VuY2xhc3NpZmllZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjAxNTkyMzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICczMzc3NDkxMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzI3NjM1ODMyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMzIyNzY4MzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxOTk3MTY3MicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFvICYmIG4uYW8ubW9hdENsaWVudExldmVsMSAmJiAhYS5hLmF4KHYsIG4uYW8ubW9hdENsaWVudExldmVsMSkgJiYgKG0uek1vYXRCbGFja2xpc3QgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZHUoeyBhbGw6ICEwIH0sIEcpICYmIGUobSwgbi5hbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmd3ID0gJ3JldXRlcnNoZWFkZXIxOTQ4ODM1NTIwMjQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRyA9IGEuYS5keCh7IGFsbDogJ3pNb2F0UFMgek1vYXRUUCB6TW9hdFNUIHpNb2F0QVJCTCB6TW9hdEFkVW5pdDEgek1vYXRTdG9yeSB6TW9hdEFVIHpNb2F0UGl4ZWxEaXN0YW5jZSB6TW9hdFJhd1NsaWNlcjEgek1vYXRSYXdTbGljZXIyIHpNb2F0UmV1dGVyc1NsaWNlcjEgek1vYXRSZXV0ZXJzU2xpY2VyMiB6TW9hdEJsYWNrbGlzdCB6TW9hdEpTJy5zcGxpdCgnICcpIH0sIEcpIHx8IHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gYS5hLmkobi5hbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxKG0sIEcsIHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5hby5hZEZpbmRpbmdNZXRob2QgJiYgKG0uaHYgPSBuLmFvLmFkRmluZGluZ01ldGhvZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmFiID0gbi5hbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uYWMgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5mZCA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ua3QgPSBFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5pdCA9IGEudi52OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5iaSA9IG4uYmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmJtID0gbi5iazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZihuKSAmJiAobS5meiA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IGEuYWEuZyhuLnpyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ub3EgPSBFID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG4uenIgJiYgKG0ub3QgPSBhLmFhLmhbbi56cl0uc3RhdGVNYXNrLnRvU3RyaW5nKDE2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmMuYW0oKS5pc0luQXBwICYmIChtLmx2ID0gYS5jLmNwKCksIG0uemwgPSBhLmMuZWEoKSA/IDEgOiAwLCBhLmMuY3EoKSA/IChhLmEuYnAoKSAmJiAobS53byA9IDEpLCAoRSA9IGEuYS5ibChhLmMuYmMpKSAmJiAobS56TW9hdE1NQUtucyA9IEUpKSA6IGEuYy5kYSgpICYmIChtLmx4ID0gMSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5kZWJ1Z0RhdGEgJiYgKG0uek1vYXRKUyA9IG4uZGVidWdEYXRhLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkgJiYgayhtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZC5jKCkgJiYgayhtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5heChbMl0sIG0uZSkgJiYgbi5hcS50YysrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbS50YyA9IG4uYXEudGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdkcm9wUGl4ZWwnLCBuLCBtLCB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgobSwgeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHID0gbChtLCBDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgPSBXOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gYS55LmQobi5hbywgRyArICcmY3M9MCcsIG0sIEMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5zaG91bGRTZW5kUGl4ZWwgJiYgbi5xdWVyeXN0cmluZyAmJiByLnloLnlpKG4ucXVlcnlzdHJpbmcsIEUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnkuZSA9IGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5hLmR6KGMpOwogICAgICAgICAgICAgICAgICAgICAgICBiLnpNb2F0U3JjZCA9IGIuZDsKICAgICAgICAgICAgICAgICAgICAgICAgYi56TW9hdFNyY2JvID0gYi5ibzsKICAgICAgICAgICAgICAgICAgICAgICAgYi56TW9hdFNyY2JwID0gYi5icDsKICAgICAgICAgICAgICAgICAgICAgICAgYi56TW9hdFNyY2JkID0gYi5iZDsKICAgICAgICAgICAgICAgICAgICAgICAgYi5kID0gKGMubW9hdENsaWVudExldmVsMSB8fCAnJykgKyAnOic7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuZCArPSAoYy5tb2F0Q2xpZW50TGV2ZWwyIHx8ICcnKSArICc6JzsKICAgICAgICAgICAgICAgICAgICAgICAgYi5kICs9IChjLm1vYXRDbGllbnRMZXZlbDMgfHwgJycpICsgJzonOwogICAgICAgICAgICAgICAgICAgICAgICBiLmQgKz0gYy5tb2F0Q2xpZW50TGV2ZWw0IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZHUoeyBhbGw6ICEwIH0sIGQpICYmIGUoYiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS55LmYgPSBmdW5jdGlvbiAoYiwgYywgZCwgZSwgZywgaCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gJ2V4dHJhUHhfJyArIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNbYl0gfHwgKGNbYl0gPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBhLmEuaShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS56TW9hdFNyY2kgPSBlLmk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuaSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgKGUgPSBhLnkuZShlLCBmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmYuYW4gJiYgIWNbYl0udGltZXN0YW1wc1Jlc2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBhLmYuYW4ubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IGEuZi5hbltrXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnpNb2F0U3JjaSA9IHAuaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLmkgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgKHAgPSBhLnkuZShwLCBmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGwocCkgKyAnJmNzPTAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueWgueWkocCwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNbYl0udGltZXN0YW1wc1Jlc2V0IHx8IChjW2JdLnRpbWVzdGFtcHNSZXNldCA9ICEwLCBlLmxjICYmIChlLmxjID0gMCksIGUuY2QgJiYgKGUuY2QgPSAwKSwgZS5zbSAmJiAoZS5zbSA9IDApLCBlLmZ2ICYmIChlLmZ2ID0gMCksIGUucG4gJiYgKGUucG4gPSAwKSwgZS5sdCAmJiAoZS5sdCA9IDApLCBlLmJhICYmIChlLmJhID0gMCksIGUuc3EgJiYgKGUuc3EgPSAwKSwgZS5nZyAmJiAoZS5nZyA9IDApLCBlLm11ICYmIChlLm11ID0gMCksIGUuc2kgJiYgKGUuc2kgPSAwKSwgZS5tYyAmJiAoZS5tYyA9IDApLCBlLmR0ICYmIChlLmR0ID0gMCksIGUuZ3QgJiYgKGUuZ3QgPSAwKSwgZS5hbyAmJiAoZS5hbyA9IDApLCBlLm1rICYmIChlLm1rID0gMCksIGUuZHIgJiYgKGUuZHIgPSAwKSwgZS5ldiAmJiAoZS5ldiA9IDApLCBlLmdlICYmIChlLmdlID0gMCksIGUubXggJiYgKGUubXggPSAwKSwgZS5hbiAmJiAoZS5hbiA9IDApLCBlLmNmICYmIChlLmNmID0gMCksIGUuZ2wgJiYgKGUuZ2wgPSAwKSwgZS5tdyAmJiAoZS5tdyA9IDApLCBlLnhiICYmIChlLnhiID0gMCksIGUuZGIgJiYgKGUuZGIgPSAwKSwgZS5hbSAmJiAoZS5hbSA9IDApLCBlLmZqICYmIChlLmZqID0gMCksIGUubXkgJiYgKGUubXkgPSAwKSwgZS5teiAmJiAoZS5teiA9IDApLCBlLmNuICYmIChlLmNuID0gMCksIGUuZXMgJiYgKGUuZXMgPSAwKSwgZS5zYSAmJiAoZS5zYSA9IDApLCBlLnBmICYmIChlLnBmID0gMCksIGUuYXkgJiYgKGUuYXkgPSAwKSwgZS5ieCAmJiAoZS5ieCA9IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGwoZSwgaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIueWgueWkoYiArICcmY3M9MCcsIGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS55LmQgPSBmdW5jdGlvbiAoYiwgYywgZCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBiID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmggJiYgKGIgPSBhLmEuYXUoKSwgIWIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBnID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBoID0gMCwgZiA9IGcubGVuZ3RoOyBoIDwgZjsgaCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLmUgPT0gZ1toXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgKGQuY20gPSAwLCBjID0gbChkLCBlKSwgYyArPSAnJmNzPTAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2VuZFBpeGVsOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlzdHJpbmc6IGMKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueS5nID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgIT09IGEuYW4gfHwgMSAhPT0gYi5lICYmIDMgIT09IGIuZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbWFnZSgxLCAxKS5zcmMgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueS5oID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLnkuaShiLmRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICBjLmkgPSBhLmEuZHkoYy5pLCBiLmlLZXlTdWZmaXgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGwoYywgYi5mbGFzaFZhcnNGb3JRUykgKyAnJmNzPTAnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYi5zZW5kTm93KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5mLmFuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgYS5mLmFuLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS5mLmFuW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmkgPSBhLmEuZHkoZy5pLCBiLmlLZXlTdWZmaXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gbChnKSArICcmY3M9MCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueWgueWkoZywgYi5waXhlbFVSTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgci55aC55aShkLCBiLnBpeGVsVVJMKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueS5pID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5pKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gJ2FtIGFuIGFvIGF5IGJhIGJ4IGNkIGNmIGRiIGRyIGR0IGVzIGV2IHNhIHNxIHNpIHNtIG1jIGxjIHBmIHhiIGdlIGdnIGNuIGdsIHBuIGZqIGx0IG11IG1rIG13IG14IG15IG16IGZ2Jy5zcGxpdCgnICcpLCBkID0gMDsgZCA8IGMubGVuZ3RoOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW2NbZF1dICYmIChiW2NbZF1dID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS55LmogPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbChhLCBiKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEueS5rID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IGU6IDE2IH07CiAgICAgICAgICAgICAgICAgICAgICAgIGMucSA9IGIuYXFbMTZdKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGEueS5hKGIsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS55LmwgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICExLCBkID0gISFiICYmIGIuZ2V0Rm9ybWF0KCksIGUgPSBhLnkuYig4LCBiLmFvLCAhMSwgITEsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5xcyAmJiBlLnFzLmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBlLnFzLmQuc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0hhc2g6ICdSRVVURVJTX0hFQURFUjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRDbGllbnRMZXZlbDE6IGNbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9hdENsaWVudExldmVsMjogY1sxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2F0Q2xpZW50TGV2ZWwzOiBjWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vYXRDbGllbnRMZXZlbDQ6IGNbM10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnU3RhcnRUaW1lOiBhLmMuYmoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAmJiBiLmFvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGcgaW4gYi5hbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5hby5oYXNPd25Qcm9wZXJ0eShnKSAmJiAtMSAhPSBnLmluZGV4T2YoJ3pNb2F0JykgJiYgKGNbZ10gPSBiLmFvW2ddKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZyBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoZykgJiYgLTEgIT0gZy5pbmRleE9mKCd6TW9hdCcpICYmIChjW2ddID0gZVtnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZHUoeyBhbGw6ICEwIH0sIGQpICYmIChiID0gYywgZSA9IGUucXMsIGIubW9hdENsaWVudFNsaWNlcjEgPSBlLmJvLCBiLm1vYXRDbGllbnRTbGljZXIyID0gZS5iZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLnkubSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0geyBlOiA4IH07CiAgICAgICAgICAgICAgICAgICAgICAgIGMucSA9IGIuYXFbOF0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEueS5hKGIsIGMsICEwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGQsIGMsIGIsIGUsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAxMDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmFtKCkuaXNJbkFwcCAmJiAoZiA9IDUwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRNYXhDb250aW51b3VzID0gdGhpcy50Q29udGludW91cyA9IHRoaXMudExhc3QgPSB0aGlzLnRDdXIgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1heENvbnRpbnVvdXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdy5tYXgodGhpcy50Q29udGludW91cywgdGhpcy50TWF4Q29udGludW91cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRMYXN0ID0gdGhpcy50Q3VyID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoYSwgYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZChhKSA/IChiID0gdy5taW4oYiwgZiksIGEgPSB0eXBlb2YgZSwgYiAmJiAwID4gYiAmJiAoYiA9IDApLCB0aGlzLnRDdXIgKz0gYiwgdGhpcy50Q29udGludW91cyArPSBiLCAnbnVtYmVyJyA9PT0gYSAmJiAwIDwgZSA/IHRoaXMudEN1ciA+IGUgJiYgKHRoaXMudEN1ciA9IGUpIDogJ2Z1bmN0aW9uJyA9PT0gYSAmJiAoYiA9IGUoKSwgJ251bWJlcicgPT09IHR5cGVvZiBiICYmIHRoaXMudEN1ciA+IGIgJiYgMCA8IGIgJiYgKHRoaXMudEN1ciA9IGIpKSkgOiAodGhpcy50TWF4Q29udGludW91cyA8IHRoaXMudENvbnRpbnVvdXMgJiYgKHRoaXMudE1heENvbnRpbnVvdXMgPSB0aGlzLnRDb250aW51b3VzKSwgdGhpcy50Q29udGludW91cyA9IDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAmJiBoKHRoaXMudEN1cik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UXMgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHRoaXMucXVlcnkoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRMYXN0ID0gdGhpcy50Q3VyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRMYXN0ID4gdGhpcy50Q3VyICYmICh0aGlzLnRMYXN0ID0gdGhpcy50Q3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgYiAmJiAoYVtjXSA9IHRoaXMudEN1ciwgYVtiXSA9IHRoaXMudExhc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYWMgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmggPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmguYSA9IFtdOwogICAgICAgICAgICAgICAgICAgIGEuYWMuaC5iID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAhMSwgZiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWMuaSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc3dkZS5henN4KCdzY3JvbGwnLCBhLmFjLmopOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmsgPSBmdW5jdGlvbiAoZCwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkLmFhLCBlID0gYS5hLmJnKGIsIDUpLCBoID0gZSAmJiAoNiA9PSBlLmxlbmd0aCB8fCAxIDw9IGUubGVuZ3RoICYmICdIVE1MJyA9PT0gZVtlLmxlbmd0aCAtIDFdLm5vZGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjIHx8IGQuV0lORE9XIHx8IGEuYS5iZShiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGIgJiYgYyAmJiBoKSB8fCBhLmEuZWEoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZWF0aGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZC5hbykgJiYgJ1VuaWNhc3QgR2VuZXJpYycgPT09IGQuYW8uYWN0aXZlQ29uZmlnICYmIGEudC5rKGQuenIpICYmICgzID4gYi5vZmZzZXRXaWR0aCB8fCAzID4gYi5vZmZzZXRIZWlnaHQpIHx8IGIub3duZXJEb2N1bWVudCAmJiBiLm93bmVyRG9jdW1lbnQuYm9keSAmJiAhYi5vd25lckRvY3VtZW50LmJvZHkuY29udGFpbnMoYikgPyAhMSA6ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWMubCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gITAsIGMoaCksIGYgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGYgPSAhMSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuTW9hdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBhLmRvbU5vZGVzSWRUb0FkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCBpbiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaGFzT3duUHJvcGVydHkoZCkgJiYgYy5hLmVhKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZlYXRoZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBhW2RdLmFvKSAmJiBjLnQubSgnbG9vcCcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hYy5tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gdy5tYXgody5taW4oZCAtIGIsIGUpLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuay5hLnpheHMoJ3ZpZXc6dGljaycsIGEsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmFvLmIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IG5ldyBBKCkuZ2V0VGltZSgpLCBlID0gMTAwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5hbSgpLmlzSW5BcHAgJiYgKGUgPSA1MDApOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2F0OiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbU5vZGVzSWRUb0FkOiBCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ3BlcmlzY29wZTpvblN0YXRlQ2hhbmdlJywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ3ZpZXdDb3VudGVyU3RhcnRlZCcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9ICdNT0FUX1ZJRVdfTE9PUF9JRF8nICsgbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5nKGMsIGgsIDIwMCwgayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuZGYoW2hdLCBjKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgYS5hYy5tID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjIGluIEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmhhc093blByb3BlcnR5KGMpICYmIChkID0gQltjXSwgYS5hYy5rKGQsIGQuV0lORE9XKSB8fCBhLmFjLmcoZCkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYy5nID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwICE9PSBkLmVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWphKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IHNob3VsZEtpbGxBZDogITAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS56YXhzKCdiZWZvcmVBZEtpbGxlZCcsIGMsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYy5zaG91bGRLaWxsQWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnpheHMoJ2FkS2lsbGVkJywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmQubChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYy5jID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZC5lcSB8fCAoZC5lcSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IGU6IDUgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYy5xID0gZC5hcVs1XSsrOwogICAgICAgICAgICAgICAgICAgICAgICBhLnkuYShkLCBjKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWMuYiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCB8fCAhZC5hcSB8fCAhZC5hcVswXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB7IGU6IDM3IH07CiAgICAgICAgICAgICAgICAgICAgICAgIGMucSA9IGQuYXFbMzddKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGEueS5hKGQsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYy5uID0gW107CiAgICAgICAgICAgICAgICAgICAgYS5hYy5vID0gZnVuY3Rpb24gKGQsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8ICFkLmFxIHx8ICFkLmFxWzI5XSB8fCAzID4gZC5hcVsyOV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgYy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSBjW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IGEuYS5pbmRleE9mKGEuYWMubiwgaCkgJiYgKGIgPSAhMCwgYS5hYy5uLnB1c2goaCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgKGIgPSB7IGU6IDM3IH0sIGIucSA9IGQuYXFbMzddKyssIGEueS5hKGQsIGIpKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWMuYSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gZC5hYTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPT0gZC5hby5za2luKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5haS5jKGQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICBkLmVsZW1lbnRSZWN0IHx8IChkLmN1cnJlbnRXaWR0aCA9IGMub2Zmc2V0V2lkdGgsIGQuY3VycmVudEhlaWdodCA9IGMub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGQuY3VycmVudFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICBkID0gZC5jdXJyZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMyA+IGMgfHwgMyA+IGQgfHwgIWEuYy5jZSgpICYmIGEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKSA/ICEwIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmUgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA/IGEuZm9jdXMucGFnZUlzVmlzaWJsZSgpIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLnAgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5kZXZpY2VYRFBJID8gYyA9IHNjcmVlbi5kZXZpY2VYRFBJIC8gc2NyZWVuLnN5c3RlbVhEUEkgOiBkLmRldmljZVBpeGVsUmF0aW8gJiYgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkLm1veklubmVyU2NyZWVuWCAmJiAoYyA9IGQuZGV2aWNlUGl4ZWxSYXRpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA9IGEuYy5zKCkpID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogYyAqIGQud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBjICogZC5oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmYgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkLmNvdW50ZXJzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGQuY291bnRlcnMubGF4RHdlbGwgPSBuZXcgayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWEuZm9jdXMucGFnZUlzUHJlcmVuZGVyZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ2J1JywgJ2NkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuY291bnRlcnMuc3RyaWN0RHdlbGwgPSBuZXcgayhhLmZvY3VzLnBhZ2VJc1Zpc2libGUsICdhaCcsICdhbScpOwogICAgICAgICAgICAgICAgICAgICAgICBkLmNvdW50ZXJzLnF1ZXJ5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7fSwgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyBpbiB0aGlzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc093blByb3BlcnR5KGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gdGhpc1tjXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQucXVlcnkgJiYgZC5xdWVyeShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5jb3VudGVycy5nZXRRcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0ge30sIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgaW4gdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHRoaXNbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBkLmdldFFzICYmIGQuZ2V0UXMoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGQuY291bnRlcnMudXBkYXRlID0gZnVuY3Rpb24gKGEsIGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGcgaW4gdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHRoaXNbZ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBmLnVwZGF0ZSAmJiAhMCAhPT0gYS5lcCAmJiBmLnVwZGF0ZShhLCBjLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ3N0YXJ0QWRUcmFja2luZycsIGEuYWMuaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5rLmEuYXpzeCgndmlldzp0aWNrJywgYS5hLmRmKFtkXSwgZC5jb3VudGVycy51cGRhdGUsIGQuY291bnRlcnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZltkLnpyXSA9IGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLnEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHIueiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgci5BQ1RJVkVUSU1FVU5USUxTQ1JPTEwgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuenMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgci54eiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICByLmRjc3gud3NxYSgnZ2xvYmFsU2Nyb2xsZXZlbnQnICsgci5kY3N4LnVpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGEuYWMuaC5hLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYy5qID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZm9jdXMucGFnZUlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHIueiAmJiAoci56ID0gZCAtIFIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09PSB0eXBlb2Ygci5BQ1RJVkVUSU1FVU5USUxTQ1JPTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuZm9jdXMuZm9jdXNTdGFydFRpbWUgfHwgUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjIDwgUiAmJiAoYyA9IFIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuQUNUSVZFVElNRVVOVElMU0NST0xMID0gZCAtIGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiBpbiBCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQi5oYXNPd25Qcm9wZXJ0eShiKSAmJiAoZCA9IEJbYl0pICYmICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZC5hbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB7IGU6IDQgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucSA9IGQuYXFbNF0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuYWkgPSByLno7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLndyID0gci5BQ1RJVkVUSU1FVU5USUxTQ1JPTEw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnkuYShkLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuY2UgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuZGNzeC53c3FhKCdnbG9iYWxTY3JvbGxldmVudCcgKyByLmRjc3gudWlkKSwgci5zd2RlLnN4YXooJ3Njcm9sbCcsIHsgY2FsbGJhY2s6IGEuYWMuaiB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFjLmQgPSBmdW5jdGlvbiAoZCwgYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IHsgZTogOSB9OwogICAgICAgICAgICAgICAgICAgICAgICBiLnEgPSBkLmFxWzldKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuY2kgPSArbmV3IEEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIGMgJiYgYS5hLmZvckVhY2goYywgZnVuY3Rpb24gKGEsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbY10gPSBhOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYS55LmEoZCwgYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgIWQuZXAgJiYgZi5oYXNPd25Qcm9wZXJ0eShkLnpyKSAmJiBhLmsuYS5zeGF6KCd2aWV3OnRpY2snLCB7IGlkOiBmW2QuenJdIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGEsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2VuZGluZyAmJiAoYS5zZW5kaW5nID0gITEsIGsgPSAwLCBjKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzZDogYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGEuaW5kZXhPZignZT0yMSYnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKGMsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2goYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBrICYmIDAgPCBsLmxlbmd0aCAmJiAoaysrLCBjID0gbC5zaGlmdCgpLCBjLnNlbmRpbmcgPSAhMCwgYy51aWQgPSBmLk1hdGguZmxvb3IoMTAwMDAwMDAwMDAgKiBmLk1hdGgucmFuZG9tKCkpLCBjLnRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZyhjKSwgMjAwMCksIHhbYy51aWRdID0gYywgZShjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0KDEsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuaGVpZ2h0ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLndpZHRoID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKGEsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC50b1NlbmQgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCAoZC5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy50b1NlbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mYWlsZWRBdHRlbXB0cyA9ICdudW1iZXInID09IHR5cGVvZiBhLmZhaWxlZEF0dGVtcHRzID8gYS5mYWlsZWRBdHRlbXB0cyArIDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKGEuanNkICsgJy9waXhlbC5naWY/JyArIGEucXMpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID4gYS5mYWlsZWRBdHRlbXB0cyA/IGUoYSkgOiBtICYmIGIgPiByICYmIGgoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBkLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKHRoaXMudG9TZW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zcmMgPSBhLmpzZCArICcvcGl4ZWwuZ2lmPycgKyBhLnFzOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBhICYmIGEudWlkICYmIHggJiYgeFthLnVpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiBhLnFzICYmICd0cmFjZXI9JyA9PSBhLnFzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFthLnVpZF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB4W2EudWlkXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChiLnRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Jvb2xlYW4nICE9IHR5cGVvZiBiLnNlbmRpbmcgfHwgYi5zZW5kaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnNlbmRpbmcgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBrICYmIGstLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IFtdLCBrID0gMCwgdCwgcSA9IGZbYV0sIHkgPSBmLk1hdGguZmxvb3IoMTAwMDAwMDAwMDAgKiBmLk1hdGgucmFuZG9tKCkpLCB4ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIHEueWggPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHEueWg7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBmLkltYWdlOwogICAgICAgICAgICAgICAgICAgICAgICBxLnlpID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoYSwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHEueHEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIG0sIHIgPSAyMDgzOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBuLmlubmVySFRNTCA9ICc8IS0tW2lmIElFIDhdPng8IVtlbmRpZl0tLT4nLCBtID0gJ3gnID09PSBuLmlubmVySFRNTDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYXUgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmF1LmEgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIueWgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmRqKGssICdcJycgKyBhLmMuYXcgKyAnXCcsd2luZG93JywgZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5hdiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYXYuYSA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgYS5jLmR0KGssICEwKSB8fCAoZiA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgZC5nZXRDYXJlQWJvdXRGb2N1cyAmJiAoZiA9IGQuZ2V0Q2FyZUFib3V0Rm9jdXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGEuYWMuYShrKSwgZiA9ICghZiB8fCBhLmFjLmUoaykpICYmICFnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdi5iID0gZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGs7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1RpY2tVcGRhdGVNZXRyaWNzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0ID0gZnVuY3Rpb24gKGEsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljc1thXSA9IHRoaXMubWV0cmljc1thXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljc1thXS52YWx1ZSA9IGYgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgJiYgKHRoaXMuaGFzVGlja1VwZGF0ZU1ldHJpY3MgfHwgKHRoaXMuaGFzVGlja1VwZGF0ZU1ldHJpY3MgPSAhMCksIHRoaXMubWV0cmljc1thXS5pbmNyZW1lbnRWYWx1ZSA9IGcuaW5jcmVtZW50VmFsdWUgfHwgJ2RlbHRhJywgdGhpcy5tZXRyaWNzW2FdLmlnbm9yZVN0YXRlQ2hlY2sgPSBnLmlnbm9yZVN0YXRlQ2hlY2sgfHwgITEsIHRoaXMubWV0cmljc1thXS5zaG91bGRJbmNyZW1lbnRGbiA9IGcuc2hvdWxkSW5jcmVtZW50Rm4sIHRoaXMubWV0cmljc1thXS5wb3N0SW5jcmVtZW50YXRpb25GbiA9IGcucG9zdEluY3JlbWVudGF0aW9uRm4gfHwgITEsIHRoaXMubWV0cmljc1thXS5pZ25vcmVPbWlkQ2hlY2sgPSBnLmlnbm9yZU9taWRDaGVjayB8fCAhMSwgZy51c2VEZWx0YUNvbXBlbnNhdGlvbiAmJiAodGhpcy5tZXRyaWNzW2FdLnVzZURlbHRhQ29tcGVuc2F0aW9uID0gITAsIHRoaXMubWV0cmljc1thXS5pbmNyZW1lbnRlZExhc3RUaWNrID0gITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldHJpY3NbYV0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50ID0gZnVuY3Rpb24gKGEsIGYsIGcsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gIXRoaXMubWV0cmljc1thXSB8fCAnbnVtYmVyJyAhPT0gdHlwZW9mIHRoaXMubWV0cmljc1thXS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuZGVidWdEYXRhICYmIGUgJiYgJ3B1YmxpY2lzX2NvdW50ZXInID09IHRoaXMubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljc1thXSA/IHRoaXMubWV0cmljc1thXS52YWx1ZSAmJiAoaCA9IHRoaXMubWV0cmljc1thXS52YWx1ZSkgOiBoID0gJ05PTkUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5kZWJ1Z0RhdGEuY2FjaGUucHVzaChsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gZSA/IHRoaXMuc2V0KGEsIGYpIDogdGhpcy5tZXRyaWNzW2FdLnZhbHVlICs9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyJyA9PT0gdHlwZW9mIGcgJiYgKGYgPSB0aGlzLmNhcChhLCBmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXAgPSBmdW5jdGlvbiAoYSwgZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V0KGEsIHcubWluKHRoaXMuZ2V0KGEpLCBmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4ID0gZnVuY3Rpb24gKGEsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldChhLCB3Lm1heCh0aGlzLmdldChhKSwgZikpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldCA9IGZ1bmN0aW9uIChkLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuZC5jKCkgfHwgJ3Zpc09uTGFzdENoZWNrJyA9PT0gZCB8fCB0aGlzLm1ldHJpY3NbZF0gJiYgdGhpcy5tZXRyaWNzW2RdLmlnbm9yZU9taWRDaGVjaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiB0aGlzLm1ldHJpY3NbZF0gPyB0aGlzLnNldChkLCAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGYgPyBmIDogMCkgOiB0aGlzLm1ldHJpY3NbZF0udmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlID0gZnVuY3Rpb24gKGQsIGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmIHRoaXMuaGFzVGlja1VwZGF0ZU1ldHJpY3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gYS53LmsoZC56ciwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hdi5hKGQsIGcpLCBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiBpbiB0aGlzLm1ldHJpY3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuY3kodGhpcy5tZXRyaWNzLCBiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLm1ldHJpY3NbYl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaG91bGRJbmNyZW1lbnRGbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoID0gKGMgfHwgITAgPT09IGUuaWdub3JlU3RhdGVDaGVjaykgJiYgZS5zaG91bGRJbmNyZW1lbnRGbihkLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnVzZURlbHRhQ29tcGVuc2F0aW9uID8gKGggJiYgZS5pbmNyZW1lbnRlZExhc3RUaWNrID8gdGhpcy5pbmNyZW1lbnQoYiwgZiwgdm9pZCAwLCBkLCAxKSA6IChoIHx8IGUuaW5jcmVtZW50ZWRMYXN0VGljaykgJiYgdGhpcy5pbmNyZW1lbnQoYiwgdy5yb3VuZChmIC8gMiksIHZvaWQgMCwgZCwgMiksIGUuaW5jcmVtZW50ZWRMYXN0VGljayA9IGgpIDogaCAmJiAoJ2RlbHRhJyA9PT0gZS5pbmNyZW1lbnRWYWx1ZSA/IHRoaXMuaW5jcmVtZW50KGIsIGYsIHZvaWQgMCwgZCwgMykgOiAnYWRkUmV0dXJuVmFsdWUnID09PSBlLmluY3JlbWVudFZhbHVlID8gdGhpcy5pbmNyZW1lbnQoYiwgaCwgdm9pZCAwLCBkLCA0KSA6ICdzZXRSZXR1cm5WYWx1ZScgPT09IGUuaW5jcmVtZW50VmFsdWUgJiYgdGhpcy5zZXQoYiwgaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBlLnBvc3RJbmNyZW1lbnRhdGlvbkZuICYmIGUucG9zdEluY3JlbWVudGF0aW9uRm4oaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXYuYyA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGtbZF0gPyBmID0ga1tkXSA6IChmID0gbmV3IGEuYXYuYihkKSwga1tkXSA9IGYpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXYuZCA9IGZ1bmN0aW9uIChrLCBkLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuYXYuYyhkLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgay5zZWNvbmRhcnlDb3VudGVycyA9IGsuc2Vjb25kYXJ5Q291bnRlcnMgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIGsuc2Vjb25kYXJ5Q291bnRlcnMucHVzaChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhkLCBjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVhY2hlZEluVmlld1RpbWVUaHJlc2hvbGQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHdheXNJbnZpZXcgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeVN0cmluZ0tleSA9IGIucXVlcnlTdHJpbmdLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZVRocmVzaG9sZCA9IGIudGltZVRocmVzaG9sZCB8fCAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhd1BlcmNUaHJlc2hvbGQgPSBiLnBlcmNUaHJlc2hvbGQgLyAxMDAgfHwgNTA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyY1RocmVzaG9sZCA9IHcubWluKGIucGVyY1RocmVzaG9sZCAvIDEwMCwgMC45OCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGludW91cyA9IGIuY29udGludW91cyB8fCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lUGVyY2VudCA9IGIudGltZVBlcmNlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FwVGltZVRocmVzaG9sZCA9IGIuY2FwVGltZVRocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpYmxlID0gYi5hdWRpYmxlIHx8ICExOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZGVvID0gYi52aWRlbyB8fCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdWxsc2NyZWVuID0gYi5mdWxsc2NyZWVuIHx8ICExOwogICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdGhpcy50aW1lVGhyZXNob2xkICYmICh0aGlzLnRpbWVUaHJlc2hvbGQgPSB3Lm1heCh0aGlzLnRpbWVUaHJlc2hvbGQsIDEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVyU3RhdGUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuYXYuYyh0aGlzLmNvdW50ZXJTdGF0ZSwgJ2N1c3RvbUluVmlld0NvdW50ZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5zZXQoJ2luVmlld1RpbWUnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5zZXQoJ2NvbnRpbnVvdXNJblZpZXdUaW1lJywgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuc2V0KCdtYXhDb250aW51b3VzSW5WaWV3VGltZScsIDApOwogICAgICAgICAgICAgICAgICAgICAgICBkLnNldCgndmlzT25MYXN0Q2hlY2snLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuc2V0KCdfdExhc3RDaGVja2VkJywgbmV3IEEoKS5nZXRUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmF0ID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB7fSwgZiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYXQuYiA9IGZ1bmN0aW9uIChhLCBjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYy56cjsKICAgICAgICAgICAgICAgICAgICAgICAgZFtlXSB8fCAoZFtlXSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbZV0uaGFzT3duUHJvcGVydHkoYSkgfHwgdm9pZCAwID09IGIucGVyY1RocmVzaG9sZCAmJiB2b2lkIDAgPT0gYi5mdWxsc2NyZWVuIHx8IHZvaWQgMCA9PSBiLnRpbWVUaHJlc2hvbGQgJiYgdm9pZCAwID09IGIudGltZVBlcmNlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBuZXcgayhhLCBjLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbYy56cl1bYV0gPSBiOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdC5jID0gZnVuY3Rpb24gKGcsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFhLmQuYygpICYmIGRbY10gJiYgZFtjXS5oYXNPd25Qcm9wZXJ0eShnKSA/IGRbY11bZ10gOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXQuZCA9IGZ1bmN0aW9uIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZFtnXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZFtnXSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5yZWFjaGVkSW5WaWV3VGltZVRocmVzaG9sZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBrLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZCwgYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCAmJiB0aGlzLmlzTWVhc3VyYWJsZShkKSAmJiAhdGhpcy5yZWFjaGVkSW5WaWV3VGltZVRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGggPSBhLmF2LmModGhpcy5jb3VudGVyU3RhdGUsICdjdXN0b21JblZpZXdDb3VudGVyJyksIGYgPSBhLncuayhkLnpyLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gZi5nZXRMYXN0SW52aWV3UGVyY2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSAoZSA9IGYuZ2V0RnVsbHlJblZpZXdUaHJlc2hvbGQoKSkgJiYgJ251bWJlcicgPT09IHR5cGVvZiBlID8gdy5taW4odGhpcy5wZXJjVGhyZXNob2xkLCBlKSA6IHRoaXMucGVyY1RocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmdldCgnX3RMYXN0Q2hlY2tlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguc2V0KCdfdExhc3RDaGVja2VkJywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0Q2FyZUFib3V0Rm9jdXMgJiYgKGIgPSBmLmdldENhcmVBYm91dEZvY3VzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBmLmdldFBhdXNlQ2hlY2tpbmdGbiA/IGYuZ2V0UGF1c2VDaGVja2luZ0ZuKCkoZCkgOiBhLmFjLmEoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGsgPj0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gIWIgfHwgYS5mb2N1cy5wYWdlSXNWaXNpYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hdC5lICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmF0LmUgJiYgKGsgPSBhLmF0LmUoaykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXQuZiAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5hdC5mICYmIChmID0gYS5hdC5mKGYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gayAmJiBmICYmICFkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBoLmdldCgndmlzT25MYXN0Q2hlY2snKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayAmJiBkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmluY3JlbWVudCgnaW5WaWV3VGltZScsIGMpLCBoLmluY3JlbWVudCgnY29udGludW91c0luVmlld1RpbWUnLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrIHx8IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB3LnJvdW5kKGMgLyAyKSwgaC5pbmNyZW1lbnQoJ2luVmlld1RpbWUnLCBjKSwgaC5pbmNyZW1lbnQoJ2NvbnRpbnVvdXNJblZpZXdUaW1lJywgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayB8fCAodGhpcy5hbHdheXNJbnZpZXcgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5zZXQoJ3Zpc09uTGFzdENoZWNrJywgayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5nZXQoJ2NvbnRpbnVvdXNJblZpZXdUaW1lJykgPiBoLmdldCgnbWF4Q29udGludW91c0luVmlld1RpbWUnKSAmJiBoLnNldCgnbWF4Q29udGludW91c0luVmlld1RpbWUnLCBoLmdldCgnY29udGludW91c0luVmlld1RpbWUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayB8fCBoLnNldCgnY29udGludW91c0luVmlld1RpbWUnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluVmlld1RpbWVSZWFjaGVkKCkgJiYgKHRoaXMucmVhY2hlZEluVmlld1RpbWVUaHJlc2hvbGQgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGsucHJvdG90eXBlLmdldEluVmlld1RpbWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5hdi5jKHRoaXMuY291bnRlclN0YXRlLCAnY3VzdG9tSW5WaWV3Q291bnRlcicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250aW51b3VzID8gZC5nZXQoJ21heENvbnRpbnVvdXNJblZpZXdUaW1lJykgOiBkLmdldCgnaW5WaWV3VGltZScpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgay5wcm90b3R5cGUuaW5WaWV3VGltZVJlYWNoZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJyAhPT0gdGhpcy50aW1lVGhyZXNob2xkICYmIHRoaXMuZ2V0SW5WaWV3VGltZSgpID49IHRoaXMudGltZVRocmVzaG9sZDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGsucHJvdG90eXBlLmlzTWVhc3VyYWJsZSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHRoaXMudGltZVRocmVzaG9sZCAmJiAoJ3BzY29wZScgPT0gYS53LmIoZC56ciwgITApICYmIGQuY3VzdG9taW52aWV3LnBlcmlzY29wZVRocmVzaG9sZHMgPyBhLmEuYXgoZC5jdXN0b21pbnZpZXcucGVyaXNjb3BlVGhyZXNob2xkcywgdGhpcy5yYXdQZXJjVGhyZXNob2xkKSAmJiBhLmMuZHQoZCkgJiYgKGMgPSAhMCkgOiBhLmMuZHQoZCwgITApICYmIChjID0gITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF0LmcgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCAmJiBkLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYXQuYignZnVsbF92aXNfMl9zZWNfY29udGludW91cycsIGQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNUaHJlc2hvbGQ6IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVUaHJlc2hvbGQ6IDIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlbzogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RyaW5nS2V5OiAnd2InCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdC5oID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hdC5nKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBkLmN1c3RvbWludmlldyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBkLmN1c3RvbWludmlldy5ldmVudElkcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBkLmN1c3RvbWludmlldy5ldmVudElkcy52aWV3Q291bnRlclN0YXJ0ZWQgPSBhLmsuYS5henN4KCd2aWV3Q291bnRlclN0YXJ0ZWQnLCBhLmF0LmkpOwogICAgICAgICAgICAgICAgICAgICAgICBkLmN1c3RvbWludmlldy5ldmVudElkc1sncGVyaXNjb3BlOm9uU3RhdGVDaGFuZ2UnXSA9IGEuay5hLmF6c3goJ3BlcmlzY29wZTpvblN0YXRlQ2hhbmdlJywgYS5hdC5pLCB7IHByaW9yaXR5OiA1IH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkLmN1c3RvbWludmlldy5ldmVudElkcy5hZEtpbGxlZCA9IGEuay5hLmF6c3goJ2FkS2lsbGVkJywgYS5hdC5qKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hdC5pKGQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdC5pID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBkICYmIChpc05hTihkKSB8fCAoZCA9IEJbZF0pLCBkICYmIGQuY3VzdG9taW52aWV3ICYmIGQuY3VzdG9taW52aWV3LmV2ZW50SWRzICYmIGEuYy5kdChkLCAhMCkgJiYgIWQuY3VzdG9taW52aWV3LmV2ZW50SWRzWyd2aWV3OnRpY2snXSAmJiAoZC5jdXN0b21pbnZpZXcuZXZlbnRJZHNbJ3ZpZXc6dGljayddID0gYS5rLmEuYXpzeCgndmlldzp0aWNrJywgYS5hLmRmKFtkXSwgYS5hdC5rKSwgeyBwcmlvcml0eTogNiB9KSkpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdC5rID0gZnVuY3Rpb24gKGYsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmLnpyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRbZV0gfHwgZiAmJiBmLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGRbZV0sIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnVwZGF0ZShmLCBjLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF0LmogPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkICYmIGQuY3VzdG9taW52aWV3ICYmIGQuY3VzdG9taW52aWV3LmV2ZW50SWRzICYmIChhLmsuYS5zeGF6KCd2aWV3OnRpY2snLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZC5jdXN0b21pbnZpZXcuZXZlbnRJZHNbJ3ZpZXc6dGljayddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHk6IDYKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEuay5hLnN4YXooJ3ZpZXdDb3VudGVyU3RhcnRlZCcsIHsgaWQ6IGQuY3VzdG9taW52aWV3LmV2ZW50SWRzLnZpZXdDb3VudGVyU3RhcnRlZCB9KSwgYS5rLmEuc3hheigncGVyaXNjb3BlOm9uU3RhdGVDaGFuZ2UnLCB7IGlkOiBkLmN1c3RvbWludmlldy5ldmVudElkc1sncGVyaXNjb3BlOm9uU3RhdGVDaGFuZ2UnXSB9KSwgYS5rLmEuc3hheignYWRLaWxsZWQnLCB7IGlkOiBkLmN1c3RvbWludmlldy5ldmVudElkcy5hZEtpbGxlZCB9KSwgYS5rLmEuc3hheigndmlkZW86QWRWaWRlb0NvbXBsZXRlJywgeyBpZDogZC5jdXN0b21pbnZpZXcuZXZlbnRJZHNbJ3ZpZGVvOkFkVmlkZW9Db21wbGV0ZSddIH0pKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXQubCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuc3hheignc3RhcnRBZFRyYWNraW5nJywgeyBpZDogZi5zdGFydEFkVHJhY2tpbmcgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLnN4YXooJ2FsbExvY2FsQWRzS2lsbGVkJywgeyBpZDogZi5hbGxMb2NhbEFkc0tpbGxlZCB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXQuYSA9IGZ1bmN0aW9uIChmLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5mb3JFYWNoKGRbZi56cl0sIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbV9pbnZpZXdfbW9kdWxlX2NvdW50ZXInID09PSBiLm5hbWUgPyAoYy53bSA9IDAsIGMud2kgPSAwLCAhYS5kLmMoKSAmJiBiLmlzTWVhc3VyYWJsZShmKSAmJiAoYy53bSA9IDEsIGIuaW5WaWV3VGltZVJlYWNoZWQoKSAmJiAoYy53aSA9IDEpKSkgOiB2b2lkIDAgIT0gYi5xdWVyeVN0cmluZ0tleSAmJiAoY1tiLnF1ZXJ5U3RyaW5nS2V5XSA9IDAsICFhLmQuYygpICYmIGIuaXNNZWFzdXJhYmxlKGYpICYmIChjW2IucXVlcnlTdHJpbmdLZXldID0gMSwgYi5pblZpZXdUaW1lUmVhY2hlZCgpICYmIChjW2IucXVlcnlTdHJpbmdLZXldID0gMikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdC5tID0gZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBmID0gZi56cjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkW2ZdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChkW2ZdLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbV9pbnZpZXdfbW9kdWxlX2NvdW50ZXInID09PSBhLm5hbWUgJiYgKGMgPSBhLnJlYWNoZWRJblZpZXdUaW1lVGhyZXNob2xkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZi5zdGFydEFkVHJhY2tpbmcgPSBhLmsuYS5henN4KCdzdGFydEFkVHJhY2tpbmcnLCBhLmF0LmgpOwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBhLmFrID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hay5iID0gdy5mbG9vcigxMDAwMDAwMDAgKiB3LnJhbmRvbSgpKTsKICAgICAgICAgICAgICAgICAgICBhLmFrLmEgPSBmdW5jdGlvbiAoaywgZCwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAociAmJiAoZCAmJiAoZCArPSAnXycgKyBhLmFrLmIpLCAhci5qc29ucCB8fCAhci5qc29ucFtrXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuanNvbnAgPSByLmpzb25wIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5qc29ucFtrXSA9IHIuanNvbnBba10gfHwgeyBjYWNoZWRSZXNwb25zZTogITEgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gci54YiB8fCB3aW5kb3csIGIgPSBjLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tkXSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IEpTT04ucGFyc2UoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5qc29ucFtrXS5jYWNoZWRSZXNwb25zZSA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zd2RlLnpheHMoayArICdKc29ucFJlYWR5JywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tkXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBrICsgJyBKU09OUCByZXF1ZXN0IGhhbmRsaW5nIGZhaWxlZCcgKyAoYiA/IGIgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG9taWROYXRpdmUgJiYgKCd1bmRlZmluZWQnID09PSB0eXBlb2YgSW1hZ2UgfHwgSW1hZ2UgJiYgSW1hZ2UuX01vYXRQcm94eU9mKSwgZCA9IGMgPyAnJyA6IGRvY3VtZW50LnJlZmVycmVyLCBlID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhICYmIGEuYyAmJiBhLmMubiA/IGEuYy5uIDogJycsIGggPSAnaHR0cHM6Ly9weC5tb2F0YWRzLmNvbS9waXhlbC5naWY/ZT0yNCZkPWRhdGElM0FkYXRhJTNBZGF0YSUzQWRhdGEmaT0nICsgZXNjYXBlKCdSRVVURVJTX0hFQURFUjEnKSArICcmYWM9MSZrPScgKyBlc2NhcGUoYikgKyAnJmFyPScgKyBlc2NhcGUoJzI5YWQ1OWQtY2xlYW4nKSArICcmaXc9JyArIGVzY2FwZSgnMzFkNjk2NScpICsgJyZicT0nICsgZXNjYXBlKGUpICsgJyZqPScgKyBlc2NhcGUoZCkgKyAnJmNzPScgKyBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA/IG9taWROYXRpdmUuc2VuZFVybChoKSA6IG5ldyBJbWFnZSgxLCAxKS5zcmMgPSBoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEuYy5iZCgpLCBsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBnICYmIChnID0gJ2NhbGxiYWNrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJycpLCBlID0gYi5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSwgaCA9IGIuYm9keSB8fCBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0gfHwgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuY24oYywgaCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBoID8gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGguZG93bmxvYWRKYXZhU2NyaXB0UmVzb3VyY2UgJiYgaC5kb3dubG9hZEphdmFTY3JpcHRSZXNvdXJjZShmLCBjW2RdLCBlKSA6IGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFrLmMgPSBmdW5jdGlvbiAoaywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICByLmpzb25wICYmIHIuanNvbnBba10gJiYgci5qc29ucFtrXS5jYWNoZWRSZXNwb25zZSA/IGEuYS5kZihbci5qc29ucFtrXS5jYWNoZWRSZXNwb25zZV0sIGQpKCkgOiByLnN3ZGUuYXpzeChrICsgJ0pzb25wUmVhZHknLCBkLCB7IG9uY2U6ICEwIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hay5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgayA9IHt9LCBkOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGYsIGcsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtbZl0gPyBhLmFrLmMoZiwgZyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6ICgnc3RyaW5nJyA9PT0gdHlwZW9mIGMgPyBkID0gYyA6ICdvYmplY3QnID09PSB0eXBlb2YgYyAmJiAoZCA9IGEuYWsuZShjLCBmKSksIGEuYWsuYShmLCBmICsgJ2NhbGxiYWNrJywgZCksIGcgJiYgYS5hay5jKGYsIGcpLCBrW2ZdID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgICAgICBhLmFrLmUgPSBmdW5jdGlvbiAoaywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZjsKICAgICAgICAgICAgICAgICAgICAgICAgYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQnJhbmRTYWZldHlOYWRvcyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICcvcy92Mic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ09uZVRhZ05hZG9zJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gJy9vdC92MSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IFsndXJsPScgKyBlbmNvZGVVUklDb21wb25lbnQoYS5jLmJhKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGssIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGMgKyAnPScgKyBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmF4KGcsIGQpIHx8IGcucHVzaChkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZy5qb2luKCcmJyksIGMgPSBjICsgKCcmb3JkPScgKyBhLmMuYmogKyAnJmp2PScgKyBhLmEuY3YoYS5jLmJqICsgYykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2h0dHBzOi8vbWIubW9hdGFkcy5jb20nICsgZiArICc/JyArIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhiLCBkLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5hYS5oW2JdLnN0YXRlTWFzazsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPSBjW2RdICogKGggPyAxNiA6IDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5oW2JdLnN0YXRlTWFzayA9IGYgfCBkIDw8IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYiwgYywgZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gYS5hLmRyKGIueCwgYy54LCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGEuYS5kcihiLnksIGMueSwgZik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYiwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBhLmFhICYmIGEuYWEuaFtiXSAmJiAoYS5hYS5oW2JdLmFsbEVkZ2VzU2VlbiA9ICEwLCBhLmEuZm9yRWFjaChhLmFhLmhbYl0ubWVkaWF0b3JJZHMsIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS5zeGF6KGMsIHsgaWQ6IGIgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjICYmIChhLmFhLmhbYl0uZmFpbHNhZmUgPSAhMCksIGEuay5hLnpheHMoJ3Bhc3N0aHJvdWdoJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmkgPSAyNDI1MDA7CiAgICAgICAgICAgICAgICAgICAgYS5hYS5qID0gMTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmggPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdDogOCwKICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQ6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQ6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiAxCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmsgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWIgfHwgYiAmJiBiLmlzTWVhc3VyYWJpbGl0eURpc2FibGVkKCkgfHwgYS5kLmMoKSA/ICExIDogYS5jLmRsKCkgfHwgYS5jLmR1KCkgfHwgdm9pZCAwIHx8IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEuYSA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyAhPT0gdHlwZW9mIGIgfHwgYS5hLmwoKSA/ICExIDogMjM2NDI1IDw9IGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmwgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLmFvID8gJ3NsYXZlJyA9PSBhLmFvLm1vYXRDbGllbnRBVCA/ICEwIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEubSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEuYW8gPyAnY3BjJyA9PSBhLmFvLm1vYXRDbGllbnRCVCA/ICEwIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEubiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEuYW8gPyAnY3BjdicgPT0gYS5hby5tb2F0Q2xpZW50QlQgPyAhMCA6ICExIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLm8gPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiBhLmFvID8gJ2ZsYXRyYXRlJyA9PSBhLmFvLm1vYXRDbGllbnRCVCA/ICEwIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEucCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmIGEuYW8gPyAnc2tpbicgPT0gYS5hby5tb2F0Q2xpZW50QVQgfHwgJ2hwdG8nID09IGEuYW8ubW9hdENsaWVudEFUIHx8IDEgPT0gYS5hby5za2luID8gITAgOiAhMSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYS5mID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiIHx8ICFiLmFhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGIuZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5lcjsKICAgICAgICAgICAgICAgICAgICAgICAgYi52aWRlbyA/ICFhLmFhLmsoYikgfHwgYS5hYS5uKGIpICYmICFiLnZpZGVvLnJlYWNoZWRDb21wbGV0ZSB8fCAoYi5lciA9ICEwKSA6IGEuYWEubChiKSB8fCBhLmFhLm0oYikgfHwgYS5hYS5vKGIpID8gYi5lciA9ICExIDogYS5hYS5wKGIpIHx8IGIuaXNDb21wb3NpdGVBZCB8fCBhLmFhLmEoYS5hLmNzKGIpKSA/IGIuZXIgPSAhMCA6IGEuYWEuayhiKSAmJiBhLncucyhiLCBhLmFhLmosICEwKSAmJiAoYi5lciA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuZXIgfHwgITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmIgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIgfHwgYi5TRU5UX0ZJVCAmJiBiLmV0IHx8ICFhLmFhLmsoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCBkLCBmID0gYS53LmIoYi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuU0VOVF9GSVQgfHwgKGMgPSBhLncuZihiLCBmLCAnaGFkRklUJykpOwogICAgICAgICAgICAgICAgICAgICAgICBiLmV0IHx8IChkID0gYS53LmYoYiwgZiwgJ2hhZEZ1bGxPVFMnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIHx8IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFjLmIoYiksIGIuU0VOVF9GSVQgPSBiLlNFTlRfRklUIHx8ICEhYywgYi5ldCA9IGIuZXQgfHwgISFkOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyB8fCBkOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hYS5xID0gZnVuY3Rpb24gKGIsIGMsIGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMQogICAgICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPSBjID09PSBhIHx8IGggPT09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEwID09PSBmIHx8ICEwICE9PSAoYS5hLmRiKGMudG9wKSAmJiBhLmEuZGIoYy5ib3R0b20pICYmIGEuYS5kYihoLmJvdHRvbSkgJiYgYS5hLmRiKGgudG9wKSkgfHwgYy50b3AgPT09IGMuYm90dG9tIHx8IGMubGVmdCA9PT0gYy5yaWdodCB8fCBoLnRvcCA9PT0gaC5ib3R0b20gfHwgaC5sZWZ0ID09PSBoLnJpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGMucmlnaHQgLSBjLmxlZnQsIGsgPSBjLmJvdHRvbSAtIGMudG9wLCBxID0gZyAqICgxIC0gMC45OCksIHkgPSBrICogKDEgLSAwLjk4KSwgeCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBjLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogYy50b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogYy5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBjLnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBjLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogYy5ib3R0b20KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogYy5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBjLmJvdHRvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdSA9IGMubGVmdCArIHEsIEEgPSBjLnRvcCArIHksIEMgPSBjLnJpZ2h0IC0gcSwgeiA9IGMudG9wICsgeSwgQiA9IGMubGVmdCArIHEsIEUgPSBjLmJvdHRvbSAtIHksIHEgPSBjLnJpZ2h0IC0gcSwgeSA9IGMuYm90dG9tIC0geSwgRCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBoLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaC50b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaC5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBoLnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBoLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaC5ib3R0b20KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaC5yaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBoLmJvdHRvbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZyA9IHcuY2VpbCgwLjAxICogZyksIGsgPSB3LmNlaWwoMC4wMSAqIGspLCB4ID0gZCh4LCBELCBnLCBrKSwgbiA9IGQobiwgdiwgZywgayksIG0gPSBkKG0sIEgsIGcsIGspLCByID0gZChyLCBGLCBnLCBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5yKGIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQ6IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQ6IG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodDogcgogICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0OiB1ID49IGgubGVmdCAmJiBBID49IGgudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQ6IEMgPD0gaC5yaWdodCAmJiB6ID49IGgudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdDogQiA+PSBoLmxlZnQgJiYgRSA8PSBoLmJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiBxIDw9IGgucmlnaHQgJiYgeSA8PSBoLmJvdHRvbQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEucyA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGIgJiYgMCA8PSBiICYmICFhLmFhLmhbYl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuaFtiXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5oW2JdLmFsbEVkZ2VzU2VlbiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5oW2JdLm1lZGlhdG9ySWRzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmhbYl0ub3V0ZXIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wUmlnaHQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbUxlZnQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuaFtiXS5pbm5lciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BSaWdodDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tTGVmdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5oW2JdLnN0YXRlTWFzayA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICdyZWN0c0F2YWlsYWJsZScsIGQgPSBhLmsuYS5henN4KGMsIGEuYWEucSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmhbYl0ubWVkaWF0b3JJZHNbY10gPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICdhZEVkZ2VzVmlld1N0YXR1cyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gYS5rLmEuYXpzeChjLCBhLmFhLnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5oW2JdLm1lZGlhdG9ySWRzW2NdID0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnYWRGdWxseVZpc2libGUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuay5hLmF6c3goYywgZiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIgJiYgYyAmJiAhYS5hYS5nKGIuenIpICYmIGEudyAmJiBhLncuYiAmJiBjID09PSBhLncuYihiLnpyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuaFtiXS5tZWRpYXRvcklkc1tjXSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWEudCA9IGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmFhLmhbYl0uZmFpbHNhZmU7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLnIgPSBmdW5jdGlvbiAoYiwgYywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGwsIHksIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggJiYgKGEuYS5mb3JFYWNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9wTGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcFJpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm90dG9tTGVmdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbVJpZ2h0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcFthXSAmJiBjW2FdICYmIChwW2FdID0gITAsIGsoYiwgYSwgITApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdFthXSAmJiBkW2FdICYmICh0W2FdID0gITAsIGsoYiwgYSwgITEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAocC50b3BMZWZ0ICYmIHAudG9wUmlnaHQgJiYgdC5ib3R0b21MZWZ0ICYmIHQuYm90dG9tUmlnaHQgfHwgdC50b3BMZWZ0ICYmIHQudG9wUmlnaHQgJiYgcC5ib3R0b21MZWZ0ICYmIHAuYm90dG9tUmlnaHQgfHwgcC50b3BMZWZ0ICYmIHAuYm90dG9tTGVmdCAmJiB0LnRvcFJpZ2h0ICYmIHQuYm90dG9tUmlnaHQgfHwgdC50b3BMZWZ0ICYmIHQuYm90dG9tTGVmdCAmJiBwLnRvcFJpZ2h0ICYmIHAuYm90dG9tUmlnaHQpICYmIGYoYikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCAhPT0gYS5hYS5oW2JdLmFsbEVkZ2VzU2VlbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIGQgfHwgKGQgPSBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gYS5hYS5oW2JdLm91dGVyLCB0ID0gYS5hYS5oW2JdLmlubmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRDaGVja2luZ1N0YXRlJywgZywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudy5iKGIuenIpID09PSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFhLmcgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBiICYmIGIgaW4gYS5hYS5oID8gYS5hYS5oW2JdLmFsbEVkZ2VzU2VlbiA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLm1heENvbnRpbnVvdXNseUluVmlld1RpbWUsIGUgPSBiLmdldCgnY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID4gZCAmJiAoYS5tYXhDb250aW51b3VzbHlJblZpZXdUaW1lID0gZSwgYS5jaGVja01pbGVzdG9uZVJlYWNoZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyB8fCBiLnNldCgnY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5maXhlZEluVmlld1RpbWVSZXF1aXJlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyY3ZSZXF1aXJlZCA9IGMucGVyY3ZSZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvdWxkQ29uc2lkZXJMYXJnZUFkcyA9IGEuYS5kYihjLmxhcmdlQWRTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFyZ2VBZFNpemUgPSBjLmxhcmdlQWRTaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXJnZVBlcmN2UmVxdWlyZWQgPSBjLmxhcmdlUGVyY3ZSZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZXNQYXNzdGhyb3VnaCA9IGMucmVxdWlyZXNQYXNzdGhyb3VnaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXNLZXkgPSBjLnFzS2V5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wZXJjdlJlcXVpcmVkUGFzc3Rocm91Z2ggJiYgKHRoaXMucGVyY3ZSZXF1aXJlZFBhc3N0aHJvdWdoID0gYy5wZXJjdlJlcXVpcmVkUGFzc3Rocm91Z2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRJblZpZXdUaW1lUmVxdWlyZW1lbnQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGMsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEubCgpID8gZCA9PT0gYS5hYS5kLm4gPyBhLmFhLmQubi5iIDogYS5hYS5lLm0uYiA6IGQgPT09IGEuYWEuZC5uID8gYS5hYS5kLm4uYSA6IGEuYWEuZS5tLmE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdChkLCBmLCBoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnID0gZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBtTWlsZXN0b25lUmVhY2hlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhDb250aW51b3VzbHlJblZpZXdUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWQgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mdWxsVmlld0V2ZW50UGl4ZWxGaXJlZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGEuYXYuZChkLCBhLmFhLnUsICdncm91cG1fY291bnRlcl8nICsgZC55ZyArIHcucmFuZG9tKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBjKGssIGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgPT09IGEuYWEuZS5tLmEgfHwgZiA9PT0gYS5hYS5lLm0uYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gYS5rLmEuYXpzeCgnZnVsbE90c1JlYWNoZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuZ3JvdXBtTWlsZXN0b25lUmVhY2hlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLm1pbGVzdG9uZUZhaWxzYWZlVHJpZ2dlcmVkID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmNlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmdW5jdGlvbiAoYywgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBhLncuYihkLnpyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnpyID09PSBkLnpyICYmIGUgPT09IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgZ1tkLnpyXSA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTWlsZXN0b25lUmVhY2hlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gay5tYXhDb250aW51b3VzbHlJblZpZXdUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gay5ncm91cG1NaWxlc3RvbmVSZWFjaGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGsuY29uZmlnLmdldEluVmlld1RpbWVSZXF1aXJlbWVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBrLmNvbmZpZy5yZXF1aXJlc1Bhc3N0aHJvdWdoKGsuYWQpID8gYS5hYS5nKGsuYWQuenIpICYmIGMgPj0gZCA6IGMgPj0gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmdyb3VwbU1pbGVzdG9uZVJlYWNoZWQgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFrLmZ1bGxWaWV3RXZlbnRQaXhlbEZpcmVkICYmIGMgJiYgKGsuZnVsbFZpZXdFdmVudFBpeGVsRmlyZWQgPSAhMCwgay5hZC5maXJlRnVsbFZpZXdFdmVudCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay5ncm91cG1NaWxlc3RvbmVSZWFjaGVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguc2V0KCdjdXJyZW50Q29udGludW91c2x5SW5WaWV3VGltZScsIDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VEZWx0YUNvbXBlbnNhdGlvbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5jcmVtZW50Rm46IGZ1bmN0aW9uIChjLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZC5nZXRMYXN0SW52aWV3UGVyY2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGsuY29uZmlnLnBlcmN2UmVxdWlyZWQsIGcgPSBrLmNvbmZpZy5sYXJnZVBlcmN2UmVxdWlyZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBhLmEuY3MoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBrLmNvbmZpZy5yZXF1aXJlc1Bhc3N0aHJvdWdoKGsuYWQpID8gZSA+PSBrLmNvbmZpZy5wZXJjdlJlcXVpcmVkUGFzc3Rocm91Z2ggOiAoZiA9IGsuY29uZmlnLnNob3VsZENvbnNpZGVyTGFyZ2VBZHMgJiYgZiA+PSBrLmNvbmZpZy5sYXJnZUFkU2l6ZSkgPyBlID49IGcgOiBlID49IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdEluY3JlbWVudGF0aW9uRm46IGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEudSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmIgPSAwLjk4OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmQuYyA9IDIzNzY1MDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmQgPSAwLjU7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5lID0gYS5hYS5kLmI7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5mID0gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmcgPSBhLmFhLmQuZjsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmggPSAwLjk4OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmQuaSA9IDI5NDAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmogPSAwLjg7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5rID0gMTUwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5sID0gJ2ltJzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLm0gPSAnaGonOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmQubiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmQubi5hID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5uLmIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjdlJlcXVpcmVkOiBhLmFhLmQuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlQWRTaXplOiBhLmFhLmQuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlUGVyY3ZSZXF1aXJlZDogYS5hYS5kLmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc1Bhc3N0aHJvdWdoOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRJblZpZXdUaW1lUmVxdWlyZW1lbnQ6IGEuYWEuZC5mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1RpbWVDYXA6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNLZXk6IGEuYWEuZC5sCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZC5uLmEgPSBuZXcgZihxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLm4uYiA9IGEuYWEuZC5uLmE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUuYiA9IDAuOTg7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5jID0gMjM3NjUwOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUuZCA9IDAuNTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5lLmUgPSAwLjk4OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUuZiA9IDAuMDAwMTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5lLmcgPSAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUuaCA9IDEwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5pID0gMC45ODsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5lLmogPSAyOTQwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5rID0gMC44OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUubCA9IDE1MDAwOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUubSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUubS5hID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5tLmIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5lLm4gPSAnaW4nOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmUubyA9ICdoaic7CiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjdlJlcXVpcmVkOiBhLmFhLmUuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlQWRTaXplOiBhLmFhLmUuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlUGVyY3ZSZXF1aXJlZDogYS5hYS5lLmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc1Bhc3N0aHJvdWdoOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRJblZpZXdUaW1lUmVxdWlyZW1lbnQ6IGEuYWEuZS5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1RpbWVDYXA6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNLZXk6IGEuYWEuZS5uCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5tLmEgPSBuZXcgZihxKTsKICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmN2UmVxdWlyZWQ6IGEuYWEuZS5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY3ZSZXF1aXJlZFBhc3N0aHJvdWdoOiBhLmFhLmUuZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlQWRTaXplOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlUGVyY3ZSZXF1aXJlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc1Bhc3N0aHJvdWdoOiBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmMucihhLmMuZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLmN1cnJlbnRXaWR0aCB8fCAwLCBmID0gYy5jdXJyZW50SGVpZ2h0IHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmRjID8gKGMgPSBhLmMudywgZCA9IGEuYy54KSA6IChjID0gZC53aWR0aCB8fCAwLCBkID0gZC5oZWlnaHQgfHwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMgJiYgZCA/IGYgPiBkIHx8IGUgPiBjIDogITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRJblZpZXdUaW1lUmVxdWlyZW1lbnQ6IGEuYWEuZS5oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1RpbWVDYXA6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNLZXk6IGEuYWEuZS5uCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5tLmIgPSBuZXcgZihxKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hYS5kLmEgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBrKGMsIGEuYWEuZC5uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSAhPT0gZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5hYS5zKGMuenIpLCBjLmdyb3VwbVYyID0gYy5ncm91cG1WMiB8fCBuZXcgdChjLCBkLCAnR3JvdXBNIFYyJyksIGMuZ3JvdXBtVjI7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWEuZS5hID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gayhjLCBhLmFhLmUubSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgIT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYWEucyhjLnpyKSwgYy5ncm91cG1WMyA9IGMuZ3JvdXBtVjMgfHwgbmV3IHQoYywgZCwgJ0dyb3VwTSBWMycpLCBjLmdyb3VwbVYzOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhLmFhLmMgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IEJbYV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSB0eXBlb2YgYy5ncm91cG1WMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5ncm91cG1WMi5jb25maWcucXNLZXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYltkXSA9IGMuZ3JvdXBtVjIuY2hlY2tNaWxlc3RvbmVSZWFjaGVkKCkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB0eXBlb2YgYy5ncm91cG1WMyAmJiAoZCA9IGMuZ3JvdXBtVjMuY29uZmlnLnFzS2V5LCBiW2RdID0gYy5ncm91cG1WMy5jaGVja01pbGVzdG9uZVJlYWNoZWQoKSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0oYSkpOwogICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2FkS2lsbGVkJywgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgIWIuZXAgJiYgKGcuaGFzT3duUHJvcGVydHkoYi56cikgJiYgYS5rLmEuc3hheignZnVsbE90c1JlYWNoZWQnLCB7IGlkOiBnW2IuenJdIH0pLCBhLmFhICYmIGEuYWEudSAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIGEuYWEudSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIGEuYWEudSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFhLnUuaGFzT3duUHJvcGVydHkoYykgJiYgLTEgPCBhLmEuaW5kZXhPZihjLCAnZ3JvdXBtX2NvdW50ZXJfJyArIGIueWcpICYmIGRlbGV0ZSBhLmFhLnVbY107CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGIsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmLCBnID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXJnZTogYy5jb25maWcuTEFSR0VfU0laRV9SRVEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbDogYy5jb25maWcuTk9STUFMX1NJWkVfUkVRCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgayA9IGQuZ2V0TGFzdEludmlld1BlcmNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSAoZiA9IGEuYS5jcyhiKSA+PSBjLmNvbmZpZy5MQVJHRV9BRF9USFJFU0hPTEQpICYmIGsgPj0gZy5sYXJnZSB8fCAhZiAmJiBrID49IGcubm9ybWFsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuZnVsbHlWaXNPbkxhc3RDaGVjayA9IGY7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYy5tYXhDb250aW51b3VzbHlJblZpZXdUaW1lLCBnID0gYi5nZXQoJ2N1cnJlbnRDb250aW51b3VzbHlJblZpZXdUaW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID4gZiAmJiAoYy5tYXhDb250aW51b3VzbHlJblZpZXdUaW1lID0gZywgZiA9IGcgPj0gYy5jb25maWcuVElNRV9USFJFU0hPTEQsIGEuYy5kdChjLmFkLCAhMCkgJiYgIWMuZnVsbFZpZXdFdmVudFBpeGVsRmlyZWQgJiYgZiAmJiAoYy5mdWxsVmlld0V2ZW50UGl4ZWxGaXJlZCA9ICEwLCBiLnNldCgnY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUnLCAwLCB7fSksIGMuYWQuZmlyZUZ1bGxWaWV3RXZlbnQgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCB8fCBiLnNldCgnY3VycmVudENvbnRpbnVvdXNseUluVmlld1RpbWUnLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWQgPSBjOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudGVycyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGcuY29uZmlnOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1bGxWaWV3RXZlbnRQaXhlbEZpcmVkID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4Q29udGludW91c2x5SW5WaWV3VGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbHlWaXNPbkxhc3RDaGVjayA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuYXYuZCh0aGlzLmFkLCB0aGlzLmNvdW50ZXJzLCAncHVibGljaXNfY291bnRlcl8nICsgYy55ZyArIHcucmFuZG9tKCkpLCBmID0gayh0aGlzLCBlKSwgbCA9IGQodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0KCdjdXJyZW50Q29udGludW91c2x5SW5WaWV3VGltZScsIDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU9taWRDaGVjazogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VEZWx0YUNvbXBlbnNhdGlvbjogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRJbmNyZW1lbnRGbjogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RJbmNyZW1lbnRhdGlvbkZuOiBsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmFlID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHYxOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgZy52MS5kaXNwbGF5ID0ge307CiAgICAgICAgICAgICAgICAgICAgZy52MS5kaXNwbGF5LkxBUkdFX0FEX1RIUkVTSE9MRCA9IDIzNzY1MDsKICAgICAgICAgICAgICAgICAgICBnLnYxLmRpc3BsYXkuTk9STUFMX1NJWkVfUkVRID0gMC45ODsKICAgICAgICAgICAgICAgICAgICBnLnYxLmRpc3BsYXkuTEFSR0VfU0laRV9SRVEgPSAwLjM7CiAgICAgICAgICAgICAgICAgICAgZy52MS5kaXNwbGF5LlRJTUVfVEhSRVNIT0xEID0gMTAwMDsKICAgICAgICAgICAgICAgICAgICBnLnYxLnZpZGVvID0ge307CiAgICAgICAgICAgICAgICAgICAgZy52MS52aWRlby5MQVJHRV9BRF9USFJFU0hPTEQgPSAyMzc2NTA7CiAgICAgICAgICAgICAgICAgICAgZy52MS52aWRlby5OT1JNQUxfU0laRV9SRVEgPSAwLjk4OwogICAgICAgICAgICAgICAgICAgIGcudjEudmlkZW8uTEFSR0VfU0laRV9SRVEgPSAwLjU7CiAgICAgICAgICAgICAgICAgICAgZy52MS52aWRlby5USU1FX1RIUkVTSE9MRCA9IDIwMDA7CiAgICAgICAgICAgICAgICAgICAgZy52MS5kaXNwbGF5LlZJRVdBQkxFX0tFWSA9ICdwZCc7CiAgICAgICAgICAgICAgICAgICAgZy52MS52aWRlby5WSUVXQUJMRV9LRVkgPSAncHYnOwogICAgICAgICAgICAgICAgICAgIGcuY29uZmlnID0gZy52MS5kaXNwbGF5OwogICAgICAgICAgICAgICAgICAgIGEuYWUuYiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEucHVibGljaXMgPSBhLnB1YmxpY2lzIHx8IG5ldyBmKGEsICdQdWJsaWNpcyBWMScpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wdWJsaWNpczsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWUuYSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBiIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IEJbYV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyAhPT0gdHlwZW9mIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQucHVibGljaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB0eXBlb2YgZCAmJiAoYltkLmNvbmZpZy5WSUVXQUJMRV9LRVldID0gZC5mdWxsVmlld0V2ZW50UGl4ZWxGaXJlZCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmICFjLmVwICYmIGMucHVibGljaXMgJiYgYy5wdWJsaWNpcy5jb3VudGVycyAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIGMucHVibGljaXMuY291bnRlcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBiIGluIGMucHVibGljaXMuY291bnRlcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5wdWJsaWNpcy5jb3VudGVycy5oYXNPd25Qcm9wZXJ0eShiKSAmJiAtMSA8IGEuYS5pbmRleE9mKGIsICdwdWJsaWNpc19jb3VudGVyXycgKyBjLnlnKSAmJiBkZWxldGUgYy5wdWJsaWNpcy5jb3VudGVyc1tiXTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5nZXRGb3JtYXQoKSwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGEuYS5keCh7IGFsbDogMzAgfSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5kYihmKSB8fCAoYS5hLmRiKDMwKSwgZiA9IDMwKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuZi5haihiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlZnJlc2hEZWNpc2lvbiA9IDEsICExOwogICAgICAgICAgICAgICAgICAgICAgICBjLmF1dG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBjLmFvOwogICAgICAgICAgICAgICAgICAgICAgICBnKFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogMzAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZWxpc3Q6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwOiAndHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6ICdsZWFkZXJib2FyZCBsZWFkZXJib2FyZGNlbnRlciBsZWFkZXJib2FyZGxvdyBtcHUgbXB1bG93IGZsZXggbXB1MiBtcHUzIG1wdTQgTVBVUGx1cyBtb2JpbGVfaHBfbXB1IGJpX2NvbnRlbnQnLnNwbGl0KCcgJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwOiAnek1vYXRBZFVuaXQxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqcC5yZXV0ZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY24ucmV1dGVycycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dLCBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmR6KGspOwogICAgICAgICAgICAgICAgICAgICAgICBrID0gYS5hby5kOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFvLmkgJiYgKGsgPSBhLmFvLmkpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcDsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmRiKGspICYmIDAgPCBrID8gcCA9ICEwIDogKGEuYW8gJiYgYS5hby5jICYmIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coJ01vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZTonLCAnQ3VzdG9tIG1heCByZWZyZXNoIGtleSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywgb3IgTmFOOyBub3QgZW5hYmxpbmcgcmVmcmVzaCcpLCBjICYmIChjLnJlZnJlc2hEZWNpc2lvbiA9IDYpLCBwID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgYy5EZnBTbG90ID8gcCA9ICEwIDogKGMgJiYgKGMucmVmcmVzaERlY2lzaW9uID0gNyksIHAgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGEuYW4uZihjLkRmcFNsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgcCAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIHAgPyB0ID0gITAgOiAoYyAmJiAoYy5yZWZyZXNoRGVjaXNpb24gPSA4KSwgdCA9ICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB0ID0gcC5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5kKGMuRGZwU2xvdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uaChjLkRmcFNsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICByLmF1dG9fcmVmcmVzaCA9IHIuYXV0b19yZWZyZXNoIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByLmF1dG9fcmVmcmVzaFt0XSA9IHIuYXV0b19yZWZyZXNoW3RdIHx8IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQmxhY2tsaXN0ZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFJlZnJlc2hlZEJ5TW9hdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoQ291bnQ6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgITAgPT09IHIuYXV0b19yZWZyZXNoW3RdLmxhc3RSZWZyZXNoZWRCeU1vYXQgJiYgKGMubW9hdEF1dG9SZWZyZXNoZWQgPSAxLCByLmF1dG9fcmVmcmVzaFt0XS5sYXN0UmVmcmVzaGVkQnlNb2F0ID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHIuYXV0b19yZWZyZXNoW3RdLnJlZnJlc2hDb3VudCA8IGsgPyBrID0gITAgOiAoYS5hbyAmJiBhLmFvLmMgJiYgd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZygnTW9hdCBJbnZlbnRvcnkgSW50ZWxsaWdlbmNlOicsICdSZWFjaGVkIG1heCByZWZyZXNoIGxpbWl0IGZvciAnICsgdCArICcsIGRpc2FibGluZyByZWZyZXNoJyksIGMgJiYgKGMucmVmcmVzaERlY2lzaW9uID0gOSksIGsgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmFvLmooYykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hdXRvX3JlZnJlc2hbdF0uaXNCbGFja2xpc3RlZCA9ICEwLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgayA9ICdNb2F0IEludmVudG9yeSBJbnRlbGxpZ2VuY2U6JzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hbyAmJiBhLmFvLmMgJiYgd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZyhrLCAnQWRkaW5nIGxpc3RlbmVyIHRvIGFkIHNsb3QgJyArIHQpOwogICAgICAgICAgICAgICAgICAgICAgICBrID0gJ01vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZTonOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFvICYmIGEuYW8uYyAmJiB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgJiYgd2luZG93LmNvbnNvbGUubG9nKGssIHApOwogICAgICAgICAgICAgICAgICAgICAgICBmID0gYS5hby5oID8gYS5hby5oIDogMTAwMCAqIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFvLmsoYy56ciwgJ2ludmlldycsIGYpLCBhLmEuZHUoe30sIGQpIHx8IChjLmF1dG8ubW91c2VFdnRJZCA9IGEuay5hLmF6c3goJ21vdXNlRXZlbnRPbkFkJywgYS5hLmRmKFtjXSwgYS5hby5sKSkpLCBjLnJlZnJlc2hEZWNpc2lvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGMucmVmcmVzaERlY2lzaW9uID0gMjApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYW8gPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFvLmMgPSAhMTsKICAgICAgICAgICAgICAgICAgICBhLmFvLmMgPSAnMScgPT09IGEuYS5hcShhLmMuYmEsICdtb2F0X2xvZycpOwogICAgICAgICAgICAgICAgICAgIGEuYW8uZCA9IDU7CiAgICAgICAgICAgICAgICAgICAgYS5hby5lID0gNTAwMDsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IHt9LCBmID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52aWV3OiBmdW5jdGlvbiAoYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLncuaShjLCBiLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEludmlldzogZnVuY3Rpb24gKGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS53LnMoYywgYiwgITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUludmlldzogZnVuY3Rpb24gKGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5jIHx8ICFjLmFjdGl2ZXRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5iKGMuenIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA9IGEuYXYuYyhjLmFjdGl2ZXRpbWUuY291bnRlcnMsIGQpKSAmJiBkLmdldCgnYWN0aXZlSW52aWV3VGltZScpID49IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGcgPSBmdW5jdGlvbiAoYywgYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hby5mID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFvLmcgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgYS5hLmYoYykgJiYgYS5hLmZvckVhY2goYywgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5oYXNPd25Qcm9wZXJ0eSgnYmxhY2tsaXN0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPSBjLmJsYWNrbGlzdCwgYS5hLmNpKGMpIHx8IGEuYS5kdChjLCBiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW8uZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5oYXNPd25Qcm9wZXJ0eSgnd2hpdGVsaXN0JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBjLndoaXRlbGlzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5jaShkKSB8fCBhLmEuZHQoZCwgYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFvLmYgPSAhMCwgYS5hby5oID0gYy5yYXRlLCBhLmFvLmkgPSBjLm1heDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFvLmogPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGMuYW87CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uYyhjLkRmcFNsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmUoYy5EZnBTbG90KTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5kKGMuRGZwU2xvdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5hbi5mKGMuRGZwU2xvdCkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Rm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSBiLnNraW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5yZWZyZXNoRGVjaXNpb24gPSAxMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gciAmJiByLmF1dG9fcmVmcmVzaCAmJiByLmF1dG9fcmVmcmVzaFtkXSAmJiByLmF1dG9fcmVmcmVzaFtkXS5jcmVhdGl2ZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiBiLm1vYXRDbGllbnRMZXZlbDQgJiYgZiA9PT0gYi5tb2F0Q2xpZW50TGV2ZWw0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYW8gJiYgYS5hby5jICYmIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coJ01vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZTonLCAnU2VydmVkIHNhbWUgY3JlYXRpdmUgYXMgbGFzdCBpbXByZXNzaW9uLCBkaXNhYmxpbmcgZnVydGhlciByZWZyZXNoaW5nIGZvciAnICsgZCksIGMud2FzRHVwZUF1dG9DcmVhdGl2ZSA9ICEwLCBjLnJlZnJlc2hEZWNpc2lvbiA9IDEzLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYW8uZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnJlZnJlc2hEZWNpc2lvbiA9IDE0LCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmFvLmYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5yZWZyZXNoRGVjaXNpb24gPSAxNSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnYWRTaG91bGRSZWZyZXNoJywgYiwgYywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSA9PT0gYi5jYW5SZWZyZXNoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBjLnJlZnJlc2hEZWNpc2lvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW8uYSA9IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWsuYygnZGF0YScsIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYS5hLmRmKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sIGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5nKGIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW8uayA9IGZ1bmN0aW9uIChhLCBiLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuaGFzT3duUHJvcGVydHkoYSkgfHwgKGRbYV0gPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRbYV1bYl0gPSBlOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hby5sID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAgPD0gKGMuYXV0by5sYXN0TW91c2VUaW1lc3RhbXAgJiYgYiAtIGMuYXV0by5sYXN0TW91c2VUaW1lc3RhbXAgfHwgMCkgfHwgIWMuYXV0by5oYWRSZWNlbnRNb3VzZUV2ZW50ID8gKGMuYXV0by5tb3VzZUNoZWNrSWQgJiYgYS5hLmEoYy5hdXRvLm1vdXNlQ2hlY2tJZCksIGMuYXV0by5oYWRSZWNlbnRNb3VzZUV2ZW50ID0gITAsIGMuYXV0by5sYXN0TW91c2VUaW1lc3RhbXAgPSBiLCBiID0gYS5hby5lLCBhLmFvICYmIGEuYW8uYyAmJiB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgJiYgd2luZG93LmNvbnNvbGUubG9nKCdNb2F0IEludmVudG9yeSBJbnRlbGxpZ2VuY2U6JywgJ01vdXNlIGV2ZW50ISBEaXNhYmxpbmcgcmVmcmVzaCBmb3IgJyArIGIgKyAnIG1pbGxpc2Vjb25kcycpLCBjLmF1dG8ubW91c2VDaGVja0lkID0gYS5sLmYoYS5hLmRmKFtjXSwgYS5hby5tKSwgYiksIGMuYXV0by5tb3VzZUNoZWNrSWQpIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFvLm0gPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICBjLmF1dG8uaGFkUmVjZW50TW91c2VFdmVudCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFvICYmIGEuYW8uYyAmJiB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5sb2cgJiYgd2luZG93LmNvbnNvbGUubG9nKCdNb2F0IEludmVudG9yeSBJbnRlbGxpZ2VuY2U6JywgJ01vdXNlIHNsZWVwIHRpbWUgb3ZlciwgcmUtZW5hYmxpbmcgcmVmcmVzaCcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hby5uID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYy5hbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2V0Rm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYW4uZihjLkRmcFNsb3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQuZ2V0QXR0cmlidXRlKCd3aWR0aCcpLCBkLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JyksIGQgPSBkLmlkLCBhLmFuLmQoYy5EZnBTbG90KSwgYS5hbi5oKGMuRGZwU2xvdCksIGEuYW4uaSgpLCBkICYmIGMuRGZwU2xvdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITAgPT09IHIuYXV0b19yZWZyZXNoW2RdLmlzQmxhY2tsaXN0ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5yZWZyZXNoRGVjaXNpb24gPSByLmF1dG9fcmVmcmVzaFtkXS5yZWZyZXNoRGVjaXNpb24gfHwgMTQsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmF1dG9fcmVmcmVzaFtkXS5yZWZyZXNoQ291bnQgPSAxICsgci5hdXRvX3JlZnJlc2hbZF0ucmVmcmVzaENvdW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmF1dG9fcmVmcmVzaFtkXS5sYXN0UmVmcmVzaGVkQnlNb2F0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXV0b19yZWZyZXNoW2RdLmNyZWF0aXZlSWQgPSBiLm1vYXRDbGllbnRMZXZlbDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYXV0b19yZWZyZXNoW2RdLnJlZnJlc2hEZWNpc2lvbiA9IGMucmVmcmVzaERlY2lzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmooYy5EZnBTbG90LCAnbWl2cicsIHIuYXV0b19yZWZyZXNoW2RdLnJlZnJlc2hDb3VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjLkRmcFNsb3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW8gJiYgYS5hby5jICYmIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZyAmJiB3aW5kb3cuY29uc29sZS5sb2coJ01vYXQgSW52ZW50b3J5IEludGVsbGlnZW5jZTonLCAnUmVmcmVzaGluZyBzbG90IGZvciAnICsgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uayhbYl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFjLmcoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucmVmcmVzaERlY2lzaW9uID0gNzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnJlZnJlc2hEZWNpc2lvbiA9IDg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW8uYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyBpbiBCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEIuaGFzT3duUHJvcGVydHkoYykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IEJbY107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiLmF1dG8gfHwgIWIuYXV0by5oYWRSZWNlbnRNb3VzZUV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZFtjXSwgaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNPd25Qcm9wZXJ0eShoKSAmJiBmW2hdKGIsIGVbaF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hby5uKGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGVbaF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuc3hheignbW91c2VFdmVudE9uQWQnLCB7IGlkOiBiLmF1dG8ubW91c2VFdnRJZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFvLm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0ge30sIGIgPSBhLmFuLmEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChiLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPSAoYSA9IGEuZ2V0UmVzcG9uc2VJbmZvcm1hdGlvbigpKSAmJiBhLmxpbmVJdGVtSWQpICYmIChjW2FdID0gMSArIChjW2FdIHx8IDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRLaWxsZWQnLCBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICBjICYmICFjLmVwICYmIGMuYXV0byAmJiBjLmF1dG8ubW91c2VFdnRJZCAmJiBhLmsuYS5zeGF6KCdtb3VzZUV2ZW50T25BZCcsIHsgaWQ6IGMuYXV0by5tb3VzZUV2dElkIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQudmVyc2lvbiA9PSBhLmF3LmEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hdy5hICsgJy1iZXRhJyA9PT0gZC52ZXJzaW9uLCBiID0gYS5hdy5hID09PSBkLnZlcnNpb24gKyAnLWJldGEnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCdtb2F0ZnJhbWUnID09PSBkLnR5cGUgfHwgJ2FkZFRoaXMnID09PSBkLnR5cGUpICYmIChjIHx8IGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmF3ID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hdy5hID0gJzEuMic7CiAgICAgICAgICAgICAgICAgICAgYS5hdy5wcmVmaXggPSAnTVNGQVBJJzsKICAgICAgICAgICAgICAgICAgICBhLmF3LmIgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmF3LmMgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYy5heC5hLCBmID0gYS5jLmF6OwogICAgICAgICAgICAgICAgICAgIGEuYXcuZCA9IC8oW2Etel0rKSMoW2EtejAtOS4tXSspIyhbMC05XSspIyhbYS16MC05XSspIyhbMC05XSspIyguKykvaTsKICAgICAgICAgICAgICAgICAgICBhLmF3LmUgPSAvQChbYS16MC05XSspQEAoLiopL2k7CiAgICAgICAgICAgICAgICAgICAgYS5hdy5mID0gZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hdy5nKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5saXN0ZW5pbmcgfHwgKHIuZGNzeCAmJiByLmRjc3gueW5kcyhmLCAnbWVzc2FnZScsICdtZXNzYWdlLScgKyBkLCAnTUUtJyArIGQpLCBjLmxpc3RlbmluZyA9ICEwLCByLnN3ZGUuYXpzeCgnYWxsQWRzS2lsbGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXcuaChmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsgb25jZTogITAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zd2RlLmF6c3goJ21lc3NhZ2UtJyArIGQsIGEuYXcuaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCd2aWV3OnRpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5kY3N4ICYmICFjLmxpc3RlbmluZyAmJiAoci5kY3N4LnluZHMoZiwgJ21lc3NhZ2UnLCAnbWVzc2FnZS0nICsgZCwgJ01FLScgKyBkKSwgYy5saXN0ZW5pbmcgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdy5nID0gZnVuY3Rpb24gKGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSAnTW9hdCNQTUwjJyArIGEuYy5hcyArICcjJyArIGEuYXcuYTsKICAgICAgICAgICAgICAgICAgICAgICAgZltjXSB8fCAoZltjXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nOiAhMQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZbY107CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF3LmggPSBmdW5jdGlvbiAoZikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGYgJiYgYS5hdy5nKGYpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmwuZChmLCAnbWVzc2FnZScsIGEuYXcuaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuZGNzeCAmJiByLmRjc3guZW5nbih7IGxpc3RlbmVyTmFtZTogJ01FLScgKyBkIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByLnN3ZGUuc3hheignbWVzc2FnZS0nICsgZCwgeyBjYWxsYmFjazogYS5hdy5pIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjICYmIChjLmxpc3RlbmluZyA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXcuaiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmF3LnByZWZpeCArICcjJyArIGQgKyAnIyc7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF3LmsgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGQubWF0Y2goYS5hdy5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBjICYmIDcgPT0gYy5sZW5ndGggJiYgKGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg6IGNbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiBjWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkOiBjWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogY1s0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IGNbNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjWzZdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIChjID0gZC5kYXRhLm1hdGNoKGEuYXcuZSkpICYmIDMgPT0gYy5sZW5ndGggJiYgKGQuY21kID0gY1sxXSwgZC5hcmcgPSBjWzJdKSwgZC52ZXJzaW9uICYmIC0xICE9PSBhLmEuaW5kZXhPZihkLnZlcnNpb24sICctYmV0YScpICYmIChkLmlzQmV0YSA9ICEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hdy5pID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZCAmJiBkLm9yaWdpbiAmJiBkLmRhdGEgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBkLmRhdGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuYXcuayhkLmRhdGEpLCBiID0gYyAmJiBjLnVpZCA9PSBmLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmICFiICYmIGsoYykgJiYgKGQubXNnRGF0YSA9IGMsIGMucmVxdWVzdCBpbiBhLmF3LmMgJiYgKGQudHJpZ2dlckNhbGxiYWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXcuY1tjLnJlcXVlc3RdICYmIChhLmF3LmNbYy5yZXF1ZXN0XShkKSwgJ2FkZFRoaXMnICE9PSBjLnR5cGUgJiYgKGEuYXcuY1tjLnJlcXVlc3RdID0gbnVsbCwgZGVsZXRlIGEuYXcuY1tjLnJlcXVlc3RdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5hdy5iW2MudHlwZV0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IDAsIGUgPSBhLmF3LmJbYy50eXBlXS5sZW5ndGg7IGIgPCBlOyBiKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5iW2MudHlwZV1bYl0oZCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF3LmwgPSBmdW5jdGlvbiAoZCwgYykgewogICAgICAgICAgICAgICAgICAgICAgICBhLmF3LmJbZF0gPSBbY107CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF3Lm0gPSBmdW5jdGlvbiAoZCwgYywgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2YgYyAmJiAoYyA9IGEuYS5ieShjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IHcuZmxvb3IoMTAwMDAwMDAwMDAgKiB3LnJhbmRvbSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgYiAmJiAoYS5hdy5jW2VdID0gYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmF3LmooYS5hdy5hKSArIGYgKyAnIycgKyBkICsgJyMnICsgZSArICcjJyArIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnOiBkCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF3Lm4gPSBmdW5jdGlvbiAoZCwgYywgYiwgZSwgZikgewogICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0JyA9PSB0eXBlb2YgYiAmJiAoYiA9IGEuYS5ieShiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmF3Lm0oZCwgJ0AnICsgYyArICdAQCcgKyBiLCBlLCBmKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXcubyA9IGZ1bmN0aW9uIChkLCBjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgIWQgfHwgIWQuc291cmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuc291cmNlLnBvc3RNZXNzYWdlKGEuYXcubShkLm1zZ0RhdGEudHlwZSwgYywgYiwgZC5tc2dEYXRhLnJlcXVlc3QpLm1zZywgJyonKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXcucCA9IGZ1bmN0aW9uIChkLCBjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGEuZy5pKGMgfHwgd2luZG93LnRvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubC5mKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5wKGQsIGMsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmID0gMDsgZiA8IGUubGVuZ3RoOyBmKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAmJiBlW2ZdID09IHdpbmRvdyB8fCBlW2ZdLnBvc3RNZXNzYWdlKGQsICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnbW9kdWxlc1JlYWR5JywgYS5hLmRmKFt3aW5kb3ddLCBhLmF3LmYpLCB7IG9uY2U6ICEwIH0pOwogICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ3N0b3BQb3N0TWVzc2FnZUxpc3RlbmVycycsIGEuYS5kZihbd2luZG93XSwgYS5hdy5oKSwgeyBvbmNlOiAhMCB9KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5hbCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuYiA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuYi5hID0gJ0NGJzsKICAgICAgICAgICAgICAgICAgICBhLmFsLmIuYiA9ICdDTkYnOwogICAgICAgICAgICAgICAgICAgIGEuYWwuYi5jID0gJ0NOUyc7CiAgICAgICAgICAgICAgICAgICAgYS5hbC5hID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hbC5hLmIgPSAhMTsKICAgICAgICAgICAgICAgICAgICBhLmFsLmEuYyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGEuYWwuYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuZCA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBrID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5hbC5hLmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5hbC5lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWwuYS5iIHx8IGEuYy5jIHx8IChkID0gYS5hdy5uKCdtb2F0ZnJhbWUnLCAnY2hlY2snLCBkLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuYS5ieihkLm1zZ0RhdGEuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9ICdzdHJpbmcnID09PSB0eXBlb2YgYS5jLmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmICdzdHJpbmcnID09PSB0eXBlb2YgZC5mdWxsVXJsICYmICdudW1iZXInID09PSB0eXBlb2YgZC51cmxTcmMgJiYgIWcgJiYgYS5hLmFrKGQuZnVsbFVybCkgJiYgIWEuYy5iYiAmJiAoYS5jLmYoZC51cmxTcmMpLCBhLmMuZyA9IGQuY2xlYW5VcmwsIGEuYy5ldSA9IGQuZnVsbFVybCwgYS5jLmJhID0gZC5mdWxsVXJsLCBhLmMuYmIgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICYmIGQuYXZhaWxhYmxlICYmICFhLmFsLmEuYiAmJiAoYS5jLmNiID0gITAsIGEuYWwuYS5iID0gITAsIGQgPSAnTW9hdEZyYW1lI2dlb20jJyArIG5ldyBBKCkuZ2V0VGltZSgpLCBhLmwuZyhhLmFsLmEuZCwgbnVsbCwgMjAwLCBkKSwgYS5hbC5hLmMucHVzaChkKSwgYS5rLmEuemF4cygnTW9hdGZyYW1lOlJlYWR5JywgZCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS5hdy5wKGQubXNnLCAhMSwgITApKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5sKCdtb2F0ZnJhbWUnLCBhLmFsLmcpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmF3LmwoJ2FkZFRoaXMnLCBhLmFsLmcpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmF3LnAoYS5hdy5tKCdtb2F0ZnJhbWUnLCAncGluZycpLm1zZywgITEsICEwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuaCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5hbC5hLmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLnouaShkLmFhKSwgYyA9IGEuei5uKGcucmVjdCwgZi5lbCwgZi5ldCksIGIgPSBhLnoubihnLnZpc2libGVSZWN0LCBmLmVsLCBmLmV0KSwgYiA9IGEuei5tKGIsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBmLnZsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBmLnZyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZi52dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b206IGYudmIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBnID0gKGIucmlnaHQgLSBiLmxlZnQpICogKGIuYm90dG9tIC0gYi50b3ApIC8gZy5hcmVhLCBlID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgJ251bWJlcicgPT09IHR5cGVvZiBmLnB2ICYmICFpc05hTihmLnB2KSAmJiAoYS5hLmRyKGcsIGYucHYsIDAuMDEpICYmICdzZnJhbWUnID09PSBhLncuYihkLnpyKSAmJiAoZSA9ICEwKSwgZyA9IHcubWluKGcsIGYucHYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZi5tIHx8IChlID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICBlICYmIGEuay5hLnpheHMoJ3JlY3RzQXZhaWxhYmxlJywgZC56ciwgYywgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgJ2Jvb2xlYW4nID09PSB0eXBlb2YgZi5pYSAmJiAoYS5jLmNjID0gZi5pYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgJiYgJ251bWJlcicgPT09IHR5cGVvZiBmLm0gJiYgIWlzTmFOKGYubSkgJiYgKGEuYy5jZCA9IGYubSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5pID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1bmRlZmluZWQnICE9PSB0eXBlb2YgZCAmJiBhLmFsLmQgJiYgYS5hbC5kW2RdID8gKGEuYWwuZFtkXSA9IG51bGwsICEwKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5qID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYXcubSgnbW9hdGZyYW1lJywgJ2tpbGwnLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5wKGQubXNnLCAhMSwgITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEuYy55LCBmID0gYS5jLno7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGYgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogZgogICAgICAgICAgICAgICAgICAgICAgICB9IDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFsLmsgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmMuYzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwubCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGEuYWwuYiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYgPSAhMCwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuZyA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZC5tc2dEYXRhLmNtZCB8fCBkLm1zZ0RhdGEuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC50cmlnZ2VyQ2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC50cmlnZ2VyQ2FsbGJhY2soZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLmFsLmNbZl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbC5jW2ZdKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWwubChmKSB8fCBhLmF3Lm8oZCwgYS5hbC5iLmIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5tID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB7fSwgZyA9IGQubXNnRGF0YS5hcmcgJiYgYS5hLmJ6KGQubXNnRGF0YS5hcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hbC5uKHdpbmRvdywgZC5zb3VyY2UsIGQubXNnRGF0YS51aWQsIGcpICYmIGEuYWwuaygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi5hdmFpbGFibGUgPSAhMCwgYS5jLmJiICYmIChnID0gYS5jLmJhKSAmJiBhLmMuYmIgJiYgYS5hLmFrKGcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBhLmMuZXQgfHwgYS5hLmFtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jLmV0ID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsZWFuVXJsID0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmZ1bGxVcmwgPSBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYudXJsU3JjID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmF2YWlsYWJsZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmF3Lm8oZCwgZik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFsLm8gPSBmdW5jdGlvbiAoZCwgZikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWQgfHwgIWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSBhLmcuYyh3aW5kb3cpLnBvcCgpLCBjID0gYS5nLmsoZCwgMTApLCBiID0gITEsIGUgPSAhMSwgaCA9IG51bGwsIGsgPSBudWxsLCBwLCB0ID0gYy5sZW5ndGggLSAxOyAwIDw9IHQ7IHQtLSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjW3RdID09IGcgJiYgKGIgPSAhMCksIGIgJiYgIWEuZy5qKGNbdF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGIgJiYgayAmJiAoKGggPSBrICYmIGsucGFyZW50ICYmIGsucGFyZW50LmRvY3VtZW50KSAmJiAocCA9IGEuZy5mKGgsIGspKSwgcCAmJiAoZyA9IHAub2Zmc2V0V2lkdGgsIGMgPSBwLm9mZnNldEhlaWdodCwgZyA9PSBmLndpZHRoICYmIGMgPT0gZi5oZWlnaHQgPyBlID0gITAgOiAoZyAqPSBjLCBjID0gZi53aWR0aCAqIGYuaGVpZ2h0LCBlID0gMC45OCA8PSB3Lm1pbihnLCBjKSAvIHcubWF4KGcsIGMpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXN0ZWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVQYXJlbnREb2M6IGgKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwucCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGQucGFyZW50ICYmIGEuZy5mKGQucGFyZW50LmRvY3VtZW50LCBkKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwucSA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChkID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBkICYmIGEuYWwuZCAmJiBhLmFsLmRbZF0pICYmICdib29sZWFuJyA9PSB0eXBlb2YgZC5pc1dpdGhpblJlYWNoICYmIChkLmlzTmVzdGVkICYmICFkLmlmcmFtZVBhcmVudERvYyAmJiAoZC5pc1dpdGhpblJlYWNoID0gITEpLCBkLmlzTmVzdGVkIHx8IGQud2luICYmICFhLmcuZChkLndpbikgfHwgKGQuaXNXaXRoaW5SZWFjaCA9ICExKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5uID0gZnVuY3Rpb24gKGQsIGYsIGcsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIsIGUsIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXN0ZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVQYXJlbnREb2M6IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYiA9IGEuYWwucShnKSkgJiYgYi5pc1dpdGhpblJlYWNoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICBlID0gYS5nLm0oZCwgZiwgITApOwogICAgICAgICAgICAgICAgICAgICAgICBiICYmICd1bmRlZmluZWQnID09IHR5cGVvZiBiLmlzV2l0aGluUmVhY2ggPyBiLmlzV2l0aGluUmVhY2ggPSBlIDogKGUgPyBmID0gYS5hbC5wKGYpIDogKGggPSBhLmFsLm8oZiwgYyksIChmID0gaC5pZnJhbWUpICYmIChlID0gITApKSwgYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWU6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWVQYXJlbnREb2M6IGguaWZyYW1lUGFyZW50RG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXN0ZWQ6IGguaXNOZXN0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dpdGhpblJlYWNoOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luOiBkCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEuYWwuZFtnXSA9IGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5pc1dpdGhpblJlYWNoOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5yID0gZnVuY3Rpb24gKGEsIGYsIGcsIGMsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogYS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGEuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWw6IGEubGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0OiBhLnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyOiBhLnJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWI6IGEuYm90dG9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmw6IGYubGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0OiBmLnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyOiBmLnJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmI6IGYuYm90dG9tCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICdib29sZWFuJyA9PT0gdHlwZW9mIGMgJiYgKGEuaWEgPSBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgIT09IHR5cGVvZiBnIHx8IGlzTmFOKGcpIHx8IChhLm0gPSBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ251bWJlcicgIT09IHR5cGVvZiBiIHx8IGlzTmFOKGIpIHx8IChhLnB2ID0gMSA8IGIgPyBiIC8gMTAwIDogYik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5zID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQgPyAoZCA9IGEuei5pKGQpKSA/IGEuYWwucihkLmN1bXVsUmVjdCwgZC52aXNpYmxlUmVjdCwgMCwgITEpIDogITEgOiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuYS5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYS5hdy5tKCdtb2F0ZnJhbWUnLCAnZ2VvbScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWwubChkLm1zZ0RhdGEuZGF0YSkgfHwgKGEuYWwuYS5lID0gYS5hLmJ6KGQubXNnRGF0YS5kYXRhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXcucChkLm1zZywgITEsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbC5jLnBpbmcgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICBkICYmIGQuc291cmNlID09PSB3aW5kb3cgfHwgYS5hLmVmKCkgJiYgZC5tc2dEYXRhLmlzQmV0YSB8fCAhYS5jLmMgJiYgYS5jLmRpKCkgJiYgYS5hbC5hLmEoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuYy5jaGVjayA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5hLmVlKCkgfHwgZC5tc2dEYXRhLmlzQmV0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5jZSgpICYmIChmID0gITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiAmJiBhLmFsLm0oZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWwuYy5nZW9tID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmEuZWUoKSB8fCBkLm1zZ0RhdGEuaXNCZXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYWwubih3aW5kb3csIGQuc291cmNlLCBkLm1zZ0RhdGEudWlkKSAmJiBhLmFsLmsoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gYS5hbC5kICYmIGEuYWwuZFtkLm1zZ0RhdGEudWlkXSAmJiBhLmFsLmRbZC5tc2dEYXRhLnVpZF0uaWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmICYmIChmID0gYS5hbC5zKGYpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmF3Lm8oZCwgZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5vKGQsIGEuYWwuYi5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXcubyhkLCBhLmFsLmIuYyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFsLmMua2lsbCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWwuaShkLm1zZ0RhdGEudWlkKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBhLmFzID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5hcy5iID0gNTAwMDsKICAgICAgICAgICAgICAgICAgICBhLmFzLmMgPSBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5jKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBrLmFjdGl2ZXRpbWUgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgay5hY3RpdmV0aW1lLmNvdW50ZXJzID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYXMuZChrKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRLaWxsZWQnLCBhLmFzLmUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbjogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gay56ciA9PSBhLnpyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2U6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFzLmYoayk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFzLmYgPSBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5hY3RpdmV0aW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGEudy5vKGsuenIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuYWN0aXZldGltZS5vbkluVmlld1RpbWVDb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmIGluIGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbZl0ucmVtb3ZlTGlzdGVuZXIgJiYgZFtmXS5yZW1vdmVMaXN0ZW5lcihrLmFjdGl2ZXRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuYWN0aXZldGltZS5vbkluVmlld1RpbWVDb3VudCA9IGEuYS5kZihba10sIGEuYXMuZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA9IGEudy5rKGsuenIsICEwKSkgJiYgZC5hZGRMaXN0ZW5lcihrLmFjdGl2ZXRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFzLmQgPSBmdW5jdGlvbiAoaykgewogICAgICAgICAgICAgICAgICAgICAgICBrLmFjdGl2ZXRpbWUubW91c2VTdWJJZCA9IHIuc3dkZS5henN4KCdtb3VzZUV2ZW50JywgYS5hLmRmKFtrXSwgYS5hcy5oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGsuYWN0aXZldGltZS5tb3VzZUxvY2FsU3ViSWQgPSBhLmsuYS5henN4KCdtb3VzZUV2ZW50JywgYS5hLmRmKFtrXSwgYS5hcy5oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGsuYWN0aXZldGltZS5rZXlib2FyZFN1YklkID0gci5zd2RlLmF6c3goJ2tleWJvYXJkRXZlbnQnLCBhLmEuZGYoW2tdLCBhLmFzLmkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgay5hY3RpdmV0aW1lLmZvY3VzU3ViSWQgPSByLnN3ZGUuYXpzeCgnZm9jdXNTdGF0ZUNoYW5nZScsIGEuYS5kZihba10sIGEuYXMuaikpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcy5lID0gZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuYWN0aXZldGltZSAmJiAoci5zd2RlLnN4YXooJ21vdXNlRXZlbnQnLCB7IGlkOiBrLmFjdGl2ZXRpbWUubW91c2VTdWJJZCB9KSwgYS5rLmEuc3hheignbW91c2VFdmVudCcsIHsgaWQ6IGsuYWN0aXZldGltZS5tb3VzZUxvY2FsU3ViSWQgfSksIHIuc3dkZS5zeGF6KCdrZXlib2FyZEV2ZW50JywgeyBpZDogay5hY3RpdmV0aW1lLmtleWJvYXJkU3ViSWQgfSksIHIuc3dkZS5zeGF6KCdmb2N1c1N0YXRlQ2hhbmdlJywgeyBpZDogay5hY3RpdmV0aW1lLmZvY3VzU3ViSWQgfSksIGsuYWN0aXZldGltZSAmJiBrLmFjdGl2ZXRpbWUuY291bnRlcnMgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBrLmFjdGl2ZXRpbWUuY291bnRlcnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCBpbiBrLmFjdGl2ZXRpbWUuY291bnRlcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGsuYWN0aXZldGltZS5jb3VudGVyc1tkXTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXMuayA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYXMubChrLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFzLmggPSBmdW5jdGlvbiAoaywgZCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmFzLmwoaywgITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcy5pID0gZnVuY3Rpb24gKGssIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hcy5sKGssICEwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXMuaiA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgYS5hcy5sKGssICEwKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXMubCA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEEoKS5nZXRUaW1lKCksIGYgPSBrLmFjdGl2ZXRpbWUuYWN0aXZlVFMgJiYgZiAtIGsuYWN0aXZldGltZS5hY3RpdmVUUyB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICBkICYmICgxMDAwIDwgZiB8fCAhay5hY3RpdmV0aW1lLmFjdGl2ZSkgJiYgKGsuYWN0aXZldGltZS5jaGVja0lEICYmIGEuYS5hKGsuYWN0aXZldGltZS5jaGVja0lEKSwgay5hY3RpdmV0aW1lLmFjdGl2ZVRTID0gbmV3IEEoKS5nZXRUaW1lKCksIGsuYWN0aXZldGltZS5jaGVja0lEID0gYS5sLmYoYS5hLmRmKFtrXSwgYS5hcy5tKSwgYS5hcy5iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGsuYWN0aXZldGltZS5hY3RpdmUgPSBkOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hcy5tID0gZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsuYWN0aXZldGltZS5hY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IEEoKS5nZXRUaW1lKCkgLSBrLmFjdGl2ZXRpbWUuYWN0aXZlVFMgPCBhLmFzLmI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFzLmwoaywgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXMuZyA9IGZ1bmN0aW9uIChrLCBkLCBmLCBnLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBhLmF2LmMoay5hY3RpdmV0aW1lLmNvdW50ZXJzLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGEudy5nKGsuenIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gKGsgPSBrLmFjdGl2ZXRpbWUuYWN0aXZlKSAmJiBjICYmIGMudmlzaWJsZSAmJiBjLnZpc2libGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGYuZ2V0KCdsYXN0QWN0aXZlVmlzJywgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAhZi5nZXQoJ3dhc0V2ZXJBY3RpdmVBbmRGb2N1c2VkJykgJiYgayAmJiBmLnNldCgnd2FzRXZlckFjdGl2ZUFuZEZvY3VzZWQnLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiBjID8gZi5pbmNyZW1lbnQoJ2FjdGl2ZUludmlld1RpbWUnLCB3Lm1heChkLCAwKSkgOiAoZyB8fCBjKSAmJiBmLmluY3JlbWVudCgnYWN0aXZlSW52aWV3VGltZScsIHcubWF4KHcucm91bmQoMC41ICogZCksIDApKTsKICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXQoJ2xhc3RBY3RpdmVWaXMnLCBjKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXMuYSA9IGZ1bmN0aW9uIChrLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYS5kLmMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5yZiA9IGEuYy5ldiA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gYS5jLmV2OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhLmMuYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZiA9IGYgfHwgYS5mb2N1cy5wYWdlSXNWaXNpYmxlKCkgfHwgayAmJiBrLmNvdW50ZXJzICYmIGsuY291bnRlcnMuc3RyaWN0RHdlbGwgJiYgay5jb3VudGVycy5zdHJpY3REd2VsbC50Q3VyICYmIDAgPCBrLmNvdW50ZXJzLnN0cmljdER3ZWxsLnRDdXIsIGQucmUgPSBmID8gMSA6IDAsIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWsuYWN0aXZldGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gYS53LmIoay56ciksIGcgPSBhLmF2LmMoay5hY3RpdmV0aW1lLmNvdW50ZXJzLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmIHx8IGcuZ2V0KCd3YXNFdmVyQWN0aXZlQW5kRm9jdXNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5yZSA9IGYgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgJiYgMCA8IGcuZ2V0KCdhY3RpdmVJbnZpZXdUaW1lJykgJiYgKGQuZnQgPSBnLmdldCgnYWN0aXZlSW52aWV3VGltZScpLCBkLmZ2ID0gZy5nZXQoJ2xhc3RBY3RpdmVJbnZpZXdUaW1lJyksIGQuZncgPSBnLmdldCgnYWN0aXZlSW52aWV3VGltZUZpcnN0RGVsdGEnLCBnLmdldCgnYWN0aXZlSW52aWV3VGltZScpKSwgZy5zZXQoJ2xhc3RBY3RpdmVJbnZpZXdUaW1lJywgZy5nZXQoJ2FjdGl2ZUludmlld1RpbWUnKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ3ZpZXdDb3VudGVyU3RhcnRlZCcsIGEuYXMuZik7CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnc3RhcnRBZFRyYWNraW5nJywgYS5hcy5jKTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuZnVuY3Rpb25JblByb2dyZXNzID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgYy5wZW5kaW5nRnVuY3Rpb25zLmxlbmd0aCA/IChjID0gYy5wZW5kaW5nRnVuY3Rpb25zLnNoaWZ0KCksIGEuYS5kZihjLCBhLmF4LmNhbGwsIGEuYXgpKCksICEwKSA6ICExOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHdpbmRvdy5fX2IsICgwLCB3aW5kb3cuX193KSgnSU5ORVJfRlVOQ1RJT04nKSwgd2luZG93Ll9fdyA9IHZvaWQgMCwgd2luZG93Ll9fYiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBkLm5hbWUgKyAnIGluIGNsb3N1cmUgKG1vYXQuY3VzdG9tSWZyYW1lKTogJyArIGQubWVzc2FnZSArICcsIHN0YWNrPScgKyBkLnN0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygb21pZE5hdGl2ZSAmJiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBJbWFnZSB8fCBJbWFnZSAmJiBJbWFnZS5fTW9hdFByb3h5T2YpLCBlID0gYiA/ICcnIDogZG9jdW1lbnQucmVmZXJyZXIsIGYgPSAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGEgJiYgYS5jICYmIGEuYy5uID8gYS5jLm4gOiAnJywgZyA9ICdodHRwczovL3B4Lm1vYXRhZHMuY29tL3BpeGVsLmdpZj9lPTI0JmQ9ZGF0YSUzQWRhdGElM0FkYXRhJTNBZGF0YSZpPScgKyBlc2NhcGUoJ1JFVVRFUlNfSEVBREVSMScpICsgJyZhYz0xJms9JyArIGVzY2FwZShjKSArICcmYXI9JyArIGVzY2FwZSgnMjlhZDU5ZC1jbGVhbicpICsgJyZpdz0nICsgZXNjYXBlKCczMWQ2OTY1JykgKyAnJmJxPScgKyBlc2NhcGUoZikgKyAnJmo9JyArIGVzY2FwZShlKSArICcmY3M9JyArIG5ldyBBKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPyBvbWlkTmF0aXZlLnNlbmRVcmwoZykgOiBuZXcgSW1hZ2UoMSwgMSkuc3JjID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGMuaWZyYW1lLCBlID0gYi5jb250ZW50V2luZG93LmRvY3VtZW50LCBmID0gYy5pbm5lckZ1bmN0aW9uLCBnID0gYy5pbm5lckZ1bmN0aW9uQ2JOYW1lLCBwID0gYy5wcmVzZXJ2ZURvbTsKICAgICAgICAgICAgICAgICAgICAgICAgITEgIT09IGEuYy5lZCgpID8gKHAgPSBlLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpLCBwLmlubmVySFRNTCA9IGQudG9TdHJpbmcoKS5yZXBsYWNlKCciSU5ORVJfRlVOQ1RJT04iJywgZiksIGUuYm9keS5hcHBlbmRDaGlsZChwKSkgOiAoZiA9ICc8aHRtbD48aGVhZD48L2hlYWQ+PGJvZHk+PHNjcmlwdD4nICsgZC50b1N0cmluZygpLnJlcGxhY2UoJyJJTk5FUl9GVU5DVElPTiInLCBmKSArICc8L3NjcmlwdD4nLCBwIHx8IChmICs9ICc8c2NyaXB0PnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGRvY3VtZW50LmNsb3NlKCk7IH0sIDEpOzwvc2NyaXB0PicpLCBlLndyaXRlKGYgKyAnPC9ib2R5PjwvaHRtbD4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuY29udGVudFdpbmRvdy5fX2IgPSBjLk1vYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuY29udGVudFdpbmRvdy5fX3cgPSBjLndyYXBwZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIGIuY29udGVudFdpbmRvd1tkLnRvU3RyaW5nKCkubWF0Y2goL2Z1bmN0aW9uIChcdyspXChcKS8pWzFdXSgpOwogICAgICAgICAgICAgICAgICAgICAgICBnICYmIGEuYy5heFtnXSAmJiAoYS5jLmF4W2ddID0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghayhjLmZyYW1lRGF0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID0gYy5zZXRJZnJhbWVEb21haW4sIGMgPSBjLnByZXNlcnZlRG9tLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBiLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICExID09PSBhLmMuZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA/IGUgPyBiLnNyYyA9ICdqYXZhc2NyaXB0OmRvY3VtZW50LmNsb3NlKCk7JyA6IHQuY2xvc2UoKSA6IGUgPyBiLnNyYyA9IGcgPyAnamF2YXNjcmlwdDpkb2N1bWVudC5vcGVuKCk7IGRvY3VtZW50LmNsb3NlKCk7JyA6ICdqYXZhc2NyaXB0OmRvY3VtZW50LmhlYWQgJiYgKGRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPSIiKTsgZG9jdW1lbnQuYm9keSAmJiAoZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IiIpOycgOiBnID8gKHQub3BlbigpLCB0LmNsb3NlKCkpIDogKHQuaGVhZCAmJiAodC5oZWFkLmlubmVySFRNTCA9ICcnKSwgdC5ib2R5ICYmICh0LmJvZHkuaW5uZXJIVE1MID0gJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEuY2hhckF0KDApOwogICAgICAgICAgICAgICAgICAgICAgICAnXCcnICE9PSBiICYmICciJyAhPT0gYiAmJiAoYSA9ICdcJycgKyBhICsgJ1wnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhLmF4ID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5heC5hID0gZnVuY3Rpb24gKGMsIGIsIGQsIGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKSwgcCA9IGIgfHwgYS5hLmRpKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmRuKGcsIGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID8gKGQgPSBhLmEuY20oZCksIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNsKGcsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiAoZCA9IGEuYy5lLmRvY3VtZW50LmJvZHksIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5pbnNlcnRCZWZvcmUoZywgZC5pbnNlcnRCZWZvcmVbMF0gfHwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkluUHJvZ3Jlc3M6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdGdW5jdGlvbnM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5jb250ZW50V2luZG93ICYmIGcuY29udGVudERvY3VtZW50ICYmICFxLmxvYWRlZCAmJiAocS5sb2FkZWQgPSAhMCwgayhxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5sb2FkZWQgPSBxLmxvYWRlZCB8fCBnLmNvbnRlbnREb2N1bWVudCAmJiAnY29tcGxldGUnID09PSBnLmNvbnRlbnREb2N1bWVudC5yZWFkeVN0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jdXN0b21JZnJhbWVzIHx8IChjLmN1c3RvbUlmcmFtZXMgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmN1c3RvbUlmcmFtZXNbcF0gPSBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5sb2FkZWQgJiYgayhxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2FkS2lsbGVkJywgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGIuY3VzdG9tSWZyYW1lcywgZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGQgaW4gYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5oYXNPd25Qcm9wZXJ0eShkKSAmJiBhLmF4LmIoYiwgY1tkXS5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uOiBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy56ciA9PSBhLnpyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25jZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF4LmIgPSBmdW5jdGlvbiAoYSwgYiwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGEuY3VzdG9tSWZyYW1lc1tiXTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGYgJiYgZi5pZnJhbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZiB8fCAhZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGYucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnJlbW92ZUNoaWxkKGQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYS5jdXN0b21JZnJhbWVzW2JdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGEuY3VzdG9tSWZyYW1lc1tiXTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5heC5jYWxsID0gZnVuY3Rpb24gKGMsIGIsIGQsIGgsIGssIHApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjIHx8ICd1bmRlZmluZWQnID09PSB0eXBlb2YgYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjICYmIGMuY3VzdG9tSWZyYW1lcyAmJiBjLmN1c3RvbUlmcmFtZXNbYl07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAhZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGggJiYgJ3N0cmluZycgIT09IHR5cGVvZiBoID8gaC50b1N0cmluZygpIDogZyhoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCAmJiAnc3RyaW5nJyAhPT0gdHlwZW9mIGQgJiYgKGQgPSBhLmEuZGwoZCwgaCkpOwogICAgICAgICAgICAgICAgICAgICAgICBrICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBrIHx8IChrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQuZnVuY3Rpb25JblByb2dyZXNzIHx8ICF0LmxvYWRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnBlbmRpbmdGdW5jdGlvbnMucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHQuaWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB0LmZ1bmN0aW9uSW5Qcm9ncmVzcyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQuaWZyYW1lLmNvbnRlbnREb2N1bWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEubC5sKGEuYS5kZihbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZTogYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZURhdGE6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9hdDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJGdW5jdGlvbjogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckZ1bmN0aW9uQ2JOYW1lOiBxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElmcmFtZURvbWFpbjogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZURvbTogcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sIGYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gJ01vYXQjaXFjYicgKyB3LmZsb29yKDEwMDAwICogdy5yYW5kb20oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoYS5jLmF4W3FdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYy5lW2EuYy5heV1bcV0gPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zcmMgPSAnamF2YXNjcmlwdDpkb2N1bWVudC5vcGVuKCk7IGRvY3VtZW50LmRvbWFpbj0iJyArIGRvY3VtZW50LmRvbWFpbiArICciOyB3aW5kb3cucGFyZW50WyInICsgYS5jLmF5ICsgJyJdWyInICsgcSArICciXSgpOyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fcXMgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAoYSA9IHdpbmRvdy5fX2IpICYmIGEuYS5jbignaHR0cHM6Ly96Lm1vYXRhZHMuY29tL3B4Mi9jbGllbnQuanMnLCBkb2N1bWVudC5ib2R5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdS5heSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHUuYXkuYSA9IGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IDAgPT09IHcuZmxvb3IoMTAwMCAqIHcucmFuZG9tKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgay5weDIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TYW1wbGU6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmVkUGl4ZWw6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgKGsucHgyLmluU2FtcGxlID0gITAsIGQgPSB1LmF4LmEoaywgJ2l2dCcpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gay5jdXN0b21JZnJhbWVzICYmIGsuY3VzdG9tSWZyYW1lc1tkXSAmJiBrLmN1c3RvbUlmcmFtZXNbZF0uaWZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmIChmLmNvbnRlbnRXaW5kb3cuX19QWDJfXyA9IGsucHgyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSB1LmYucigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSB1LnkuYigzNiwgay5hbywgZiwgITEsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLnFzLmkgPSB1LmEuZHkoJ1JFVVRFUlNfSEVBREVSMScsICdQWDInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gdS55LmooZi5xcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5heC5jYWxsKGssIGQsIGEsIGYsIG51bGwsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnB4Mi5zdWNjZXNzID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSB7IG96OiAhMCB9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYy5hbSgpLmlzSW5BcHAgfHwgYS5jLmNxKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnN1ID0gITAsIGQub2YgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiW2NdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIGJbY10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFtlXSAmJiBiW2NdLmhhc093blByb3BlcnR5KGUpICYmICFiW2NdW2VdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5haS5lKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFpLmYoYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWkuZyhiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5haS5oKGIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGsoYi56cik7CiAgICAgICAgICAgICAgICAgICAgICAgICFiLmhhc0FkTG9hZGVkZmlyZWQgJiYgYyA/IGUgPSAhMCA6ICFlICYmIGMgJiYgKGMgPSB7IGU6IDkgfSwgYy5xID0gYi5hcVs5XSsrLCBhLnkuYShiLCBjKSwgZSA9ICEwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZjogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvejogITEKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSAwLCBjLCBiID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5haSA9IHt9OwogICAgICAgICAgICAgICAgICAgIGEuYWkuYyA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWkuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBuZXcgQSgpLmdldFRpbWUoKSwgYyA9IGIgLSBnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZyAmJiAhKDEwMDAgPiBjKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlIGluIEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQi5oYXNPd25Qcm9wZXJ0eShlKSAmJiBkKEJbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5rLmEuemF4cygnaGlkZGVuQWRzOnVwZGF0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAhMTsKICAgICAgICAgICAgICAgICAgICBhLmFpLmUgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICBiW2MuenJdIHx8IChiW2MuenJdID0gZihjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCAhPT0gYltjLnpyXS5zdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBhLncuayhjLnpyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPyAoYy5pc0N1cnJlbnRseVN0YWNrZWQgPSBhLnoucihjKSwgITEgPT09IGJbYy56cl0uc3QgJiYgKGJbYy56cl0uc3QgPSAhMSA9PT0gZC5hZFN0YXJ0ZWRPblNjcmVlbigpIHx8ICExID09PSBjLmlzQ3VycmVudGx5U3RhY2tlZCkpIDogYltjLnpyXS5zdCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFpLmYgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGIsIGUgPSBjLnpyOwogICAgICAgICAgICAgICAgICAgICAgICBkW2VdID0gYltlXSB8fCBmKGMpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGRbZV0uc3U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBjLldJTkRPVyB8fCB3aW5kb3csIGcgPSBjLkFEX1JFQ1QgfHwgYS56LmsoYy5hYSwgaywgYy5fY2FsY1ZpZGVvQmFzZWRPbkNvbnRhaW5lciksIGsgPSBhLmMucihrKSwgZyA9IGMuaXNJbklmcmFtZSA/IGcgJiYgayAmJiAhKGcubGVmdCA+PSBrLndpZHRoIHx8IDAgPj0gZy5yaWdodCB8fCBnLnRvcCA+PSBrLmhlaWdodCB8fCAwID49IGcuYm90dG9tKSA6ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtlXS5zdSA9IGc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYWkuZyA9IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYiwgZSA9IGMuenI7CiAgICAgICAgICAgICAgICAgICAgICAgIGRbZV0gPSBiW2VdIHx8IGYoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gZFtlXS5vZjsKICAgICAgICAgICAgICAgICAgICAgICAgZyB8fCAoZyA9IGEuYy5yKGMuV0lORE9XKSwgZyA9IGMuaXNJbklmcmFtZSA/IGcgJiYgISg1ID49IGcud2lkdGggfHwgNSA+PSBnLmhlaWdodCkgOiAhMCwgZFtlXS5vZiA9IGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5haS5oID0gZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBiW2MuenJdOwogICAgICAgICAgICAgICAgICAgICAgICBiW2MuenJdID0gYltjLnpyXSB8fCBmKGMpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5hYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAwIDwgYS5hLmRlKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pc0N1cnJlbnRseVRyYW5zcGFyZW50ID0gIWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm96ID0gZC5veiB8fCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQub3o7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFpLmIgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9LCBkLCBlOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgaW4gYlthXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJbYV0uaGFzT3duUHJvcGVydHkoZSkgJiYgKGQgPSBiW2FdW2VdLCBjW2VdID0gZCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFpLmEgPSBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jLmVhKCkgPyAhMSA6ICFrKGIpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5rLmEuYXpzeCgnYWRMb2FkZWQnLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmhhc0FkTG9hZGVkZmlyZWQgPSAhMDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdzdGFydEFkVHJhY2tpbmcnLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBkKGIpOwogICAgICAgICAgICAgICAgICAgICAgICBnID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgfHwgKGMgPSBuZXcgQSgpLmdldFRpbWUoKSArICdoYScsIGEuay5hLmF6c3goJ3ZpZXc6dGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWkuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7IGlkOiBjIH0pKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEVudGVyc1ZpZXcnLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICBhLmFpLmUoYik7CiAgICAgICAgICAgICAgICAgICAgfSwgeyBvbmNlOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgIWEuZXAgJiYgKGRlbGV0ZSBhLmVsZW1lbnRzRnJvbVBvaW50Q2FjaGUsIGRlbGV0ZSBiW2EuenJdKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgYS5hbiA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBrLCBkOwogICAgICAgICAgICAgICAgICAgIGEuYW4uZyA9IGZ1bmN0aW9uIChmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZigpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChrLmdvb2dsZXRhZyAmJiBrLmdvb2dsZXRhZy5hcGlSZWFkeSAmJiBrLmdvb2dsZXRhZy5wdWJhZHMoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBrLmdvb2dsZXRhZy5wdWJhZHMoKSwgZigpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuZ29vZ2xldGFnID0gay5nb29nbGV0YWcgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmdvb2dsZXRhZy5jbWQgPSBrLmdvb2dsZXRhZy5jbWQgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGEubC5sKGYpLCBjID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGsuZ29vZ2xldGFnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZCA9IGEgJiYgYS5hcGlSZWFkeSAmJiBhLnB1YmFkcygpKSAmJiBnKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuay5hLmF6c3goJ2FkS2lsbGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gay5nb29nbGV0YWc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgYS5hWydkbyddKGIuYXBpUmVhZHkpICYmIGIuY21kICYmIGEuYS5mKGIuY21kKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGIuY21kLmluZGV4T2YoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICE9PSBkICYmIGIuY21kLnNwbGljZShkLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuZ29vZ2xldGFnLmNtZC5wdXNoKGMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmICdmdW5jdGlvbicgIT09IHR5cGVvZiBkLmdldFNsb3RzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0U2xvdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBkLmdldFNsb3RJZE1hcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmdldFNsb3RJZE1hcCgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi5tID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0VGFyZ2V0aW5nKGEpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi5uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGQuZ2V0VGFyZ2V0aW5nS2V5cyB8fCAnZnVuY3Rpb24nICE9PSB0eXBlb2YgZC5nZXRUYXJnZXRpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gZC5nZXRUYXJnZXRpbmdLZXlzKCksIGcgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdbYV0gPSBkLmdldFRhcmdldGluZyhhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi5vID0gZnVuY3Rpb24gKGEsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgIT09IHR5cGVvZiBkLnNldFRhcmdldGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5zZXRUYXJnZXRpbmcoYSwgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW4ucCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgZC5jbGVhclRhcmdldGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5jbGVhclRhcmdldGluZyhhKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW4ucSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmdldFRhcmdldGluZ0tleXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5nZXRUYXJnZXRpbmdLZXlzKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLnIgPSBmdW5jdGlvbiAoYSwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5nZXRUYXJnZXRpbmcgJiYgZCA/IGEuZ2V0VGFyZ2V0aW5nKGQpIDogITE7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLnMgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IHt9LCBjID0gYS5hbi5xKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmEuZihjKSAmJiBhLmEuZm9yRWFjaChjLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1tiXSA9IGEuYW4ucihkLCBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi50ID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmFuLnMoZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGEuYW4ubigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2goZCwgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnW2JdID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW4uaiA9IGZ1bmN0aW9uIChhLCBkLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGEgJiYgZCAmJiBjICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLnNldFRhcmdldGluZykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0VGFyZ2V0aW5nKGQsIGMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi51ID0gZnVuY3Rpb24gKGEsIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBhLmNsZWFyVGFyZ2V0aW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICBhLmNsZWFyVGFyZ2V0aW5nKGQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi52ID0gZnVuY3Rpb24gKGYsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgJiYgZyAmJiBkICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBkLmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5sLmwoZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmFkZEV2ZW50TGlzdGVuZXIoZiwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW4uZCA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmdldFNsb3RFbGVtZW50SWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5nZXRTbG90RWxlbWVudElkKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmYgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5nZXRTbG90SWQgJiYgKGEgPSBhLmdldFNsb3RJZCgpKSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5nZXRJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhID0gYS5nZXRJZCgpLCBrLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnb29nbGVfYWRzX2lmcmFtZV8nICsgYSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmMgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgYS5nZXRBZFVuaXRQYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZ2V0QWRVbml0UGF0aCgpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi5lID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgPSBhLmFuLmMoZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkICYmIGQuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmEuZm9yRWFjaChkLCBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBhLmxlbmd0aCAmJiBnLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmggPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBkICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBkLmdldFNpemVzICYmIGEuYS5mb3JFYWNoKGQuZ2V0U2l6ZXMoKSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmdldFdpZHRoICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmdldEhlaWdodCAmJiBnLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmdldEhlaWdodCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi53ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGsgJiYgay5nb29nbGV0YWcgJiYgay5nb29nbGV0YWcuc2l6ZU1hcHBpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW4uYiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmLCBnID0gZG9jdW1lbnQuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKDMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gYS5nLmIoZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hbi54KGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09PSB0eXBlb2YgYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZC5nZXRTbG90SWRNYXAoKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgaW4gYikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBlICYmIGUgPT09IGMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYltlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi54ID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgYS5pZCAmJiAtMSA8IGEuaWQuaW5kZXhPZignZ29vZ2xlX2Fkc19pZnJhbWUnKSA/IGEuaWQucmVwbGFjZSgvZ29vZ2xlX2Fkc19pZnJhbWVfPy8sICcnKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFuLmkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hbi5rID0gZnVuY3Rpb24gKGEsIGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGQucmVmcmVzaCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5yZWZyZXNoKGEsIGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgayA9IHdpbmRvdzsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5nKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxICYmIHQgIT09IGguTE9BRElORykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hei5hLmFsbERhdGEgPSBuZXcgQSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gd2luZG93Lm1vYXRZaWVsZFJlYWR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGIgJiYgYS5sLmwoYikoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBmKGIpID8gcC5jIDogcC5iOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmcoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5vKGwuZCwgYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLm8obC5lLCBjKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT09IHR5cGVvZiBhICYmICExICE9PSBhLl9wYmQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiBjb25zb2xlLmxvZygnPj4+TU9BVCBZSUVMRCBJTlRFTExJR0VOQ0UvJyArIGEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYiwgZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5jaihmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYyA9IGEuYW4ucihiLCBjKSkgJiYgYy5sZW5ndGggJiYgMSA8PSBjLmxlbmd0aCA/IGNbMF0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGQpLmpvaW4oJ3wnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoLCBrLCBtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogTm8gTW9hdCBBUEkgcmVzcG9uc2UgZm9yIHNsb3QgbGV2ZWwgZGF0YSwgbm90IHNldHRpbmcgdGFyZ2V0aW5nLicpLCBhLmFuLmooZywgbC5kLCBwLmQpLCBhLmFuLmooZywgbC5lLCBwLmQpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZih0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYignc2V0TW9hdFRhcmdldGluZ0ZvclNsb3Q6IE5vIGhpc3RvcmljYWwgc2xvdCBkYXRhIGF2YWlsYWJsZSwgbm90IHNldHRpbmcgdGFyZ2V0aW5nLicpLCBhLmFuLmooZywgbC5kLCBwLmUpLCBhLmFuLmooZywgbC5lLCBwLmUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZyB8fCAnZnVuY3Rpb24nICE9PSB0eXBlb2YgZy5nZXRTbG90RWxlbWVudElkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogU2xvdCBpcyBtaXNzaW5nLCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGcuZ2V0U2xvdEVsZW1lbnRJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5mKCdkaXZfaWQnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gYyhnLCAnZGl2X2lkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gYS5hbi5yKGcsICdkaXZfaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogc2xvdElkICcgKyBoICsgJzsgRmFpbGVkIHRvIGdldCBkaXZfaWQgdGFyZ2V0aW5nIGFycmF5LCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBrWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogc2xvdElkICcgKyBoICsgJzsgTm8gdGFyZ2V0aW5nIGRhdGEgc2V0IGZvciBkaXZfaWQsIG5vdCBzZXR0aW5nIHRhcmdldGluZy4nKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gdFttXSAmJiB0W21dW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogc2xvdElkICcgKyBoICsgJzsgTm8gaGlzdG9yaWNhbCBkYXRhIGZvdW5kIGZvciBkaXZfaWQgb2YgJyArIG0gKyAnLCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuJyksIGEuYW4uaihnLCBsLmQsIHAuZiksIGEuYW4uaihnLCBsLmUsIHAuZiksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcSBpbiBrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhLmEuY3koaywgcSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBrW3FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmRiKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKCdzZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogc2xvdElkICcgKyBoICsgJzsgU2V0dGluZyAnICsgcSArICcgdmFsdWUgb2YgJyArIHIgKyAnLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHBhcnNlSW50KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHIudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnbnVtYmVyJyA9PT0gdHlwZW9mIG0gJiYgMCA9PT0gbSAlIDEwICYmIDEwIDwgbSAmJiAxMDAgPj0gbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHIgPSBbcl0sIG0gPSBtIC8gMTAgLSAxOyAwIDwgbTsgbS0tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnB1c2goKDEwICogbSkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmooZywgcSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGcgPSAhMSwgaCwgaywgcSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGEuYy5kYiA/ICdNb2JpbGUnIDogJ0Rlc2t0b3AnOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNsb3REYXRhQXZhaWxhYmxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYodCkgPyAhIXQgOiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRGF0YUF2YWlsYWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zYWZldHlEYXRhQXZhaWxhYmxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUxvZ2dpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVMb2dnaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vYXRUYXJnZXRpbmdGb3JTbG90ID0gZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBhLmEuZGYoW2JdLCBkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uZyhiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNb2F0VGFyZ2V0aW5nRm9yQWxsU2xvdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmcoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hbi5sKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYignc2V0TW9hdFRhcmdldGluZ0ZvckFsbFNsb3RzOiBGYWlsZWQgdG8gZ2V0IHNsb3RzIGZyb20gR1BULCBub3Qgc2V0dGluZyB0YXJnZXRpbmcuJyksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGMsIGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdCA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiwgZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBhLmFuLmwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEuYS5mKG0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIoJ2dldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBObyB2YWxpZCBzbG90IGlkZW50aWZpZXIgcHJvdmlkZWQsIGV4aXRpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2gobSwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT09IHR5cGVvZiBhLmdldFNsb3RFbGVtZW50SWQgJiYgYS5nZXRTbG90RWxlbWVudElkKCkgPT09IGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyA9IGEsICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIGQuZ2V0U2xvdEVsZW1lbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKCdnZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogTm8gdmFsaWQgc2xvdCBpZGVudGlmaWVyIHByb3ZpZGVkLCBleGl0aW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgPSBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZ2V0U2xvdEVsZW1lbnRJZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKCdnZXRNb2F0VGFyZ2V0aW5nRm9yU2xvdDogTm8gdmFsaWQgc2xvdCBpZGVudGlmaWVyIHByb3ZpZGVkLCBleGl0aW5nLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSB0eXBlb2YgZyAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZy5nZXRUYXJnZXRpbmcgPyBhLmEuZignZGl2X2lkJykgPyBmID0gYyhnLCAnZGl2X2lkJykgOiAobSA9IGEuYW4ucihnLCAnZGl2X2lkJykpICYmIG0ubGVuZ3RoICYmIDEgPD0gbS5sZW5ndGggJiYgKGYgPSBtWzBdKSA6IGIoJ2dldE1vYXRUYXJnZXRpbmdGb3JTbG90OiBGYWlsZWQgdG8gZ2V0IHNsb3QgdGFyZ2V0aW5nLCBHUFQgc2xvdCBvYmplY3QgaXMgaW52YWxpZC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnICE9PSB0eXBlb2YgZiAmJiAoZiA9ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSB0ICYmIHRbZl0gJiYgdFtmXVtlXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZbbC5iXSA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmW2wuY10gPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZltsLmFdID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1vYXRUYXJnZXRpbmdGb3JQYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbbC5iXSA9IGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2wuY10gPSBrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtsLmFdID0gcTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fQSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBiOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fQiA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX0MgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYXogPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHcuZmxvb3Iody5yYW5kb20oKSAqIHcucG93KDEwLCAxMikpLCBiID0gYS5hLmFvKCksIGUgPSBhLmEuYW0oKTsKICAgICAgICAgICAgICAgICAgICBhLmF6LmEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXI6IHdpbmRvdy5tb2F0SGVhZGVySW5pdFRpbWUgfHwgYS5jLmJqLAogICAgICAgICAgICAgICAgICAgICAgICBhcGlSZWFkeTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgbmFkb0RhdGE6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERhdGE6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYXouYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RUYXJnZXRpbmdMb2FkZWQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RUYXJnZXRpbmdTZXQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VEYXRhVGFyZ2V0aW5nU2V0OiAwLAogICAgICAgICAgICAgICAgICAgICAgICBzYWZldHlUYXJnZXRpbmdTZXQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5U2xvdDogMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0FESU5HOiAnMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0FERUQ6ICcxJwogICAgICAgICAgICAgICAgICAgICAgICB9LCBsID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYTogJ21fZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOiAnbV9zYWZldHknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYzogJ21fY2F0ZWdvcmllcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiAnbV9tdicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiAnbV9ndicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgcCA9IGEuYy5lbSwgdCA9IGguTE9BRElORywgcSA9ICExOwogICAgICAgICAgICAgICAgICAgIGEuYXouYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYihhLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9ICdzYWZlJyA9PT0gYyA/ICdtb2F0X3NhZmUnIDogJ21vYXRfdW5zYWZlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgLTEgIT09IGEuaW5kZXhPZignbW9hdF91bnN1cmUnKSA/IChhLnNwbGljZShhLmluZGV4T2YoJ21vYXRfdW5zdXJlJyksIDEpLCBhLnB1c2goZCkpIDogMCA9PT0gYS5sZW5ndGggJiYgYS5wdXNoKGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWIgfHwgIWEuYS5mKGIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAnZ3ZfYWR1bHQgZ3ZfYXJtcyBndl9jcmltZSBndl9kZWF0aF9pbmp1cnkgZ3ZfZG93bmxvYWQgZ3ZfZHJ1Z3MgZ3ZfaGF0ZXNwZWVjaCBndl9taWxpdGFyeSBndl9vYnNjZW5pdHkgZ3ZfdGVycm9yaXNtIGd2X3RvYmFjY28gbW9hdF9zYWZlIG1vYXRfdW5zYWZlIG1vYXRfc2Vuc2l0aXZlJy5zcGxpdCgnICcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYS5maWx0ZXIoYiwgZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiAtMSAhPT0gZC5pbmRleE9mKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgZygpOwogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubW9hdFByZWJpZEFwaSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hei5hLmFwaVJlYWR5ID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYWsuYygnbmFkby1hbGwnLCBmdW5jdGlvbiAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcsIHAsIHE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IHR5cGVvZiBmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgPSAnMCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmICduJyBpbiBmICYmIChxID0gJzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uZyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbi5vKGwuYSwgcSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGFnZURhdGFBdmFpbGFibGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19CKHEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBhLmEuZHEobmV3IFJlZ0V4cCgnLipjYWxsYmFjaz0nICsgZi5jYWxsYmFjayArICcuKicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyID0gYS5hLmRwKHIpKSAmJiByLnJlc3BvbnNlRW5kICYmIGYuaCAmJiAoYS5hei5hLm5hZG9SZXNwb25zZUVuZCA9IHIucmVzcG9uc2VFbmQsIGEuYXouYS5uYWRvUmVzcG9uc2VFeGVjdXRpb24gPSB3LnJvdW5kKGYuaCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGEuYS5hdyhmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYyAmJiBhLmEuZihmLmMpICYmIChwID0gZi5jKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcgJiYgYS5hbi5nKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLm8obC5iLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAmJiAocCA9IGMocCksIHAgPSBiKHAsIGcpLCBhLmFuLmcoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4ubyhsLmMsIHApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zYWZldHlEYXRhQXZhaWxhYmxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9fQShnLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmLnlpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZChmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX19DKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hei5hLm5hZG9EYXRhID0gbmV3IEEoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gaC5MT0FERUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYS5hei5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGEuYS5kZihbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xvdFJlbmRlckVuZGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgYiAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGIuc2xvdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHdpbmRvdy5tb2F0UHJlYmlkQXBpLCBkID0gYi5zbG90OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdFRhcmdldGluZ0xvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90VGFyZ2V0aW5nU2V0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VEYXRhVGFyZ2V0aW5nU2V0OiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmV0eVRhcmdldGluZ1NldDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVNsb3Q6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2xvdFRhcmdldGluZ0xvYWRlZCA9IGMuc2xvdERhdGFBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBhLmFuLnIoZCwgbC5kKVswXSAmJiAoZS5zbG90VGFyZ2V0aW5nU2V0ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmlzRW1wdHkgJiYgKGUuZW1wdHlTbG90ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGEuYW4ubShsLmEpWzBdICYmIChlLnBhZ2VEYXRhVGFyZ2V0aW5nU2V0ID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGEuYW4ubShsLmIpWzBdICYmIChlLnNhZmV0eVRhcmdldGluZ1NldCA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hei5iLnJlbmRlcmVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKGUsIGZ1bmN0aW9uIChiLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMCA9PT0gYiAmJiBhLmF6LmJbY10rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLCBhLmFuLnYpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmcoYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmF6LmUgPSBmdW5jdGlvbiAoZCwgZiwgZykgewogICAgICAgICAgICAgICAgICAgICAgICBnID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGcuZSA9IGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGcudCA9IGEuYy5iajsKICAgICAgICAgICAgICAgICAgICAgICAgZy5kZSA9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgIGcuZCA9ICdSRVVURVJTX0hFQURFUjE6JyArIChhLmMuZGIgPyAnTW9iaWxlJyA6ICdEZXNrdG9wJykgKyAnOi06LSc7CiAgICAgICAgICAgICAgICAgICAgICAgIGcuaSA9ICdZSUVMRF9JTlRFTExJR0VOQ0VfSU5URVJOQUwxJzsKICAgICAgICAgICAgICAgICAgICAgICAgZy5zZ3MgPSA1OwogICAgICAgICAgICAgICAgICAgICAgICBnLmFyID0gJzI5YWQ1OWQtY2xlYW4nOwogICAgICAgICAgICAgICAgICAgICAgICBnLml3ID0gJzMxZDY5NjUnOwogICAgICAgICAgICAgICAgICAgICAgICA0MyA9PT0gZCAmJiAndW5kZWZpbmVkJyAhPT0gdHlwZW9mIGYgJiYgKGQgPSBmLmdldFNsb3RFbGVtZW50SWQoKSwgZy56TW9hdERmcFNsb3RJZCA9IGQgfHwgJy0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy56TW9hdFJlbmRlcmVkID0gYS5hei5iLnJlbmRlcmVkOwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0U2xvdFRhcmdldGluZ0xvYWRlZCA9IGEuYXouYi5zbG90VGFyZ2V0aW5nTG9hZGVkOwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0U2xvdFRhcmdldGluZ1NldCA9IGEuYXouYi5zbG90VGFyZ2V0aW5nU2V0OwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0UGFnZURhdGFUYXJnZXRpbmdTZXQgPSBhLmF6LmIucGFnZURhdGFUYXJnZXRpbmdTZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGcuek1vYXRTYWZldHlUYXJnZXRpbmdTZXQgPSBhLmF6LmIuc2FmZXR5VGFyZ2V0aW5nU2V0OwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0RW1wdHlTbG90ID0gYS5hei5iLmVtcHR5U2xvdDsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGEuYXouYS53cmFwcGVyOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9IGEuYXouYS5uYWRvRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuYXouYS5hbGxEYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0TmFkb0RhdGFMb2FkVGltZSA9IGggJiYgaCAtIGYgfHwgJ05vdCBMb2FkZWQnOwogICAgICAgICAgICAgICAgICAgICAgICBnLnpNb2F0QWxsRGF0YUxvYWRUaW1lID0gZCAmJiBkIC0gZiB8fCAnTm90IExvYWRlZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYXouYS5uYWRvUmVzcG9uc2VFbmQgJiYgYS5hei5hLm5hZG9SZXNwb25zZUV4ZWN1dGlvbiAmJiAoZy56TW9hdE5MID0gYS5hei5hLm5hZG9SZXNwb25zZUV4ZWN1dGlvbiAtIGEuYXouYS5uYWRvUmVzcG9uc2VFbmQpOwogICAgICAgICAgICAgICAgICAgICAgICBnLmJvID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgZy5iZCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGcuYWMgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBnLmJxID0gYS5jLm47CiAgICAgICAgICAgICAgICAgICAgICAgIGcuZiA9IE51bWJlcigha2EpOwogICAgICAgICAgICAgICAgICAgICAgICAoZiA9IHdpbmRvdy5tb2F0UHJlYmlkQXBpKSAmJiAnZnVuY3Rpb24nID09PSB0eXBlb2YgZi5zbG90RGF0YUF2YWlsYWJsZSAmJiAoZy56biA9IGYuc2xvdERhdGFBdmFpbGFibGUoKSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQgJiYgZCAtIGEuYy5iajsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmRiKGQpICYmIChnWydpZiddID0gZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmEuY3UoZywgITApOwogICAgICAgICAgICAgICAgICAgICAgICBkICs9ICcmbmE9JyArIGEuYS5jdyhkLCBnLmkpOwogICAgICAgICAgICAgICAgICAgICAgICByLnloLnlpKGQgKyAnJmNzPTAnLCBXLCBudWxsLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmFuLmcoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmZvckVhY2gobCwgZnVuY3Rpb24gKGIsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLm8oYiwgcC5hKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KCkpOwogICAgICAgICAgICAgICAgICAgIHZhciB1ID0gYS5mLnIoITApOwogICAgICAgICAgICAgICAgICAgIHUudXJsID0gYS5jLmJhOwogICAgICAgICAgICAgICAgICAgIHUucGNvZGUgPSAncmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNCc7CiAgICAgICAgICAgICAgICAgICAgdSA9IGEuYS5jdSh1LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgYS5hay5hKCduYWRvLWFsbCcsICdNb2F0TmFkb0FsbEpzb25wUmVxdWVzdCcsICdodHRwczovL21iLm1vYXRhZHMuY29tL3lpL3YyPycgKyB1KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhjLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYy5zbG90LCBmID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQuZ2V0QWRVbml0UGF0aCAmJiBkLmdldEFkVW5pdFBhdGgoKSwgZyA9IGEuYXAuYyhhLmEuY2MoKSwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgIGcgfHwgKGcgPSB7fSwgZy5fQURfRk9STUFUID0gYiwgYS5hcC5mKGcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy50cmFja2VkRnJvbURmcEhlYWRlclRhZyA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICBnLmRmcEFkSWQgPSBkLmdldFNsb3RFbGVtZW50SWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy5zbG90TWFwcGluZ0lkID0gJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGQuZ2V0U2xvdElkICYmIGQuZ2V0U2xvdElkKCkuZ2V0SWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZy5tb2F0Q2xpZW50TGV2ZWwxID0gYy5hZHZlcnRpc2VySWQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGcubW9hdENsaWVudExldmVsMiA9IGMuY2FtcGFpZ25JZCB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgZy5tb2F0Q2xpZW50TGV2ZWwzID0gYy5saW5lSXRlbUlkIHx8IGMuc291cmNlQWdub3N0aWNMaW5lSXRlbUlkIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBnLm1vYXRDbGllbnRMZXZlbDQgPSBjLmNyZWF0aXZlSWQgfHwgYy5zb3VyY2VBZ25vc3RpY0NyZWF0aXZlSWQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYS5mb3JFYWNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2F0Q2xpZW50TGV2ZWwxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2F0Q2xpZW50TGV2ZWwyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2F0Q2xpZW50TGV2ZWwzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2F0Q2xpZW50TGV2ZWw0JwogICAgICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmRiKGdbYl0pICYmIChnW2JdID0gZ1tiXS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGcuZGZwSGVhZGVyU2xvdHMgfHwgKGcuZGZwSGVhZGVyU2xvdHMgPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpdl9pZCcKICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgayAmJiAwIDwgay5sZW5ndGggJiYgYS5hLmZvckVhY2goaywgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gYS5hbi5yKGQsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiBhLmEuZihjKSAmJiAwIDwgYy5sZW5ndGggPyBnLmRmcEhlYWRlclNsb3RzWyd6TW9hdCcgKyBiXSA9IGMgOiBnLmRmcEhlYWRlclNsb3RzWyd6TW9hdCcgKyBiXSA9ICctJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09PSB0eXBlb2YgZiAmJiAoayA9ICcvJyA9PSBmWzBdID8gMiA6IDEsIGYgPSBmLnNwbGl0KCcvJykuc2xpY2UoayksIGsgPSBmW2YubGVuZ3RoIC0gMV0sIGcubW9hdENsaWVudFNsaWNlcjEgPSBmWzBdIHx8ICcnLCBnLm1vYXRDbGllbnRTbGljZXIyID0gayB8fCAnJywgYS5hLmZvckVhY2goZiwgZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdbJ3pNb2F0QWRVbml0JyArIChiICsgMSldID0gYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gYSAmJiBhW2JdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCAmJiBkLnRvU3RyaW5nID8gZC50b1N0cmluZygpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYywgYiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjID0gYyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZWxpc3RWYWx1ZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzgyMDA1NzQ1NjU3NjI4NzQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjAwNjU2MzInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZChjLCAnYWR2ZXJ0aXNlcklkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1vYXQ6ICd6TW9hdERGUEFkSWRzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZChjLCAnc291cmNlQWdub3N0aWNMaW5lSXRlbUlkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem1vYXQ6ICd6TW9hdERGUExpbmVJdGVtSWRzJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZChjLCAnY2FtcGFpZ25JZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHptb2F0OiAnek1vYXRERlBPcmRlcklkcycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYS5zb21lKGMsIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjLmlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBiW2Muem1vYXRdICYmIGJbYy56bW9hdF0uc3BsaXQoJzonKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLndoaXRlbGlzdFZhbHVlcyAmJiBjLndoaXRlbGlzdFZhbHVlcy5sZW5ndGggJiYgKGQgPSBkLmNvbmNhdChjLndoaXRlbGlzdFZhbHVlcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmEuYXgoZCwgYy5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSB8fCAnaHRtbDUnID09PSBiLl9BRF9GT1JNQVQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoYykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IGMuc2xvdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgIWMuaXNFbXB0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSAnZnVuY3Rpb24nID09PSB0eXBlb2YgYi5nZXRIdG1sICYmIGIuZ2V0SHRtbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBkID8gMCA8PSBkLnNlYXJjaCgvYmFubmVyX2h0bWxfaW5wYWdlX3JlbmRlcmluZ19saWIuKlwuanMvKSA6ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGsoYywgZCA/ICdodG1sNScgOiAnYWR4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZihjLCBkLCBiKSAmJiAoYS55LmIoMTcsIGQpLCBjID0gKGMgPSBhLmFuLmQoYikpICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gKGIgPSBjLnF1ZXJ5U2VsZWN0b3IoJ2lmcmFtZScpKSAmJiBiLmNvbnRlbnRXaW5kb3csIGc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9ICFhLmcuZChiKSAmJiBiLmRvY3VtZW50ICYmIGIuZG9jdW1lbnQuYm9keSAmJiBiLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4gJiYgMCA8IGIuZG9jdW1lbnQuYm9keS5jaGlsZHJlbi5sZW5ndGggJiYgYi5kb2N1bWVudC5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyB8fCAoZyA9IGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudi5jKGcsIGQsIHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYW0gPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFtLmIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEuYW4uZyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmFuLnYoJ3Nsb3RSZW5kZXJFbmRlZCcsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGEuYW0uYSA9IGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYS5hLmRmKFtjXSwgZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWMuZyhiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5jKGMuV0lORE9XLCAndW5sb2FkJywgYiwgJ2RmcGhlYWQtdW5sb2FkJyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmsuYS5henN4KCdhZEtpbGxlZCcsIGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgIWMuZXAgJiYgYS5sLmQoYy5XSU5ET1csICd1bmxvYWQnLCBudWxsLCAnZGZwaGVhZC11bmxvYWQnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0odSkpOwogICAgICAgICAgICAgICAgKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gayhjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgJiYgKGEuYy5heC5iIHx8IChhLmMuYXguYiA9ICEwLCByLmRjc3ggJiYgci5kY3N4LnluZHMod2luZG93LCAnZGV2aWNlb3JpZW50YXRpb24nLCAnZGV2aWNlb3JpZW50YXRpb24tJyArIGEuYy5heC5hLCAnZGV2aWNlb3JpZW50YXRpb25GbicgKyBhLmMuYXguYSkpLCBoIHx8IChoID0gITAsIHIuc3dkZS5henN4KCdkZXZpY2VvcmllbnRhdGlvbi0nICsgYS5jLmF4LmEsIGYpKSwgYi5oYXNPd25Qcm9wZXJ0eShjLnpyKSB8fCAoYltjLnpyXSA9IG5ldyBnKCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgZGVsZXRlIGJbYS56cl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IEEubm93KCksIGQgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgMjAwIDwgYyAtIGUgJiYgKGUgPSBjLCBkID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmIGluIEIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmhhc093blByb3BlcnR5KGYpICYmIGIuaGFzT3duUHJvcGVydHkoZikgJiYgKGMgPSBiW2ZdLCAxNTAwID4gYy5ldmVudHNDb3VudCAmJiAoYy5ldmVudHNDb3VudCArPSAxLCBkICYmIGMuaGFuZGxlT3JpZW50YXRpb25FdmVudChhKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkRXZlbnRzSGFuZGxlZENvdW50ID0gdGhpcy5ldmVudHNIYW5kbGVkQ291bnQgPSB0aGlzLmV2ZW50c0NvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbHBoYSA9IG5ldyBjKDAsIDM2MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmV0YSA9IG5ldyBjKC0xODAsIDE4MCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2FtbWEgPSBuZXcgYygtOTAsIDkwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhhLCBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluRXhwZWN0ZWRWYWwgPSBhOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heEV4cGVjdGVkVmFsID0gYjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkTWF4ID0gdy5hYnModGhpcy5taW5FeHBlY3RlZFZhbCkgKyB0aGlzLm1heEV4cGVjdGVkVmFsOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJhbmdlUmlnaHQgPSB0aGlzLnJhbmdlTGVmdCA9IHRoaXMub3JpZ2luID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYS5hciA9IHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBiID0ge30sIGUgPSAwLCBoID0gITE7CiAgICAgICAgICAgICAgICAgICAgZy5wcm90b3R5cGUuaXNWYWxpZEV2ZW50ID0gZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFhLmFscGhhICYmIDAgIT09IGEuYWxwaGEgfHwgIWEuYmV0YSAmJiAwICE9PSBhLmJldGEgfHwgIWEuYmV0YSAmJiAwICE9PSBhLmJldGEgfHwgMCA9PT0gYS5hbHBoYSAmJiAwID09PSBhLmJldGEgJiYgMCA9PSBhLmdhbW1hID8gITEgOiAhMDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGcucHJvdG90eXBlLmhhbmRsZU9yaWVudGF0aW9uRXZlbnQgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50c0hhbmRsZWRDb3VudCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVmFsaWRFdmVudChhKSAmJiAodGhpcy52YWxpZEV2ZW50c0hhbmRsZWRDb3VudCArPSAxLCB0aGlzLmFscGhhLmFkZFZhbHVlKGEuYWxwaGEpLCB0aGlzLmJldGEuYWRkVmFsdWUoYS5iZXRhKSwgdGhpcy5nYW1tYS5hZGRWYWx1ZShhLmdhbW1hKSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZS5pc091dHNpZGVSYW5nZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJhbmdlTGVmdCA+IHRoaXMucmFuZ2VSaWdodCA/IHRoaXMucmFuZ2VMZWZ0ID4gYSAmJiBhID4gdGhpcy5yYW5nZVJpZ2h0IDogYSA8IHRoaXMucmFuZ2VMZWZ0IHx8IGEgPiB0aGlzLnJhbmdlUmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZS5leHRlbmRSYW5nZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPdXRzaWRlUmFuZ2UoYSkgJiYgKChhIDwgdGhpcy5yYW5nZUxlZnQgPyB0aGlzLnJhbmdlTGVmdCAtIGEgOiB0aGlzLnJhbmdlTGVmdCArIHRoaXMubm9ybWFsaXplZE1heCAtIGEpIDw9IChhID4gdGhpcy5yYW5nZVJpZ2h0ID8gYSAtIHRoaXMucmFuZ2VSaWdodCA6IHRoaXMubm9ybWFsaXplZE1heCAtIHRoaXMucmFuZ2VSaWdodCArIGEpID8gdGhpcy5yYW5nZUxlZnQgPSBhIDogdGhpcy5yYW5nZVJpZ2h0ID0gYSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZS5hZGRWYWx1ZSA9IGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gYSArIHcuYWJzKHRoaXMubWluRXhwZWN0ZWRWYWwpOwogICAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSB0aGlzLm9yaWdpbiA/ICh0aGlzLm9yaWdpbiA9IGEudG9GaXhlZCgzKSwgdGhpcy5yYW5nZVJpZ2h0ID0gdGhpcy5yYW5nZUxlZnQgPSBiKSA6IHRoaXMuZXh0ZW5kUmFuZ2UoYik7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBjLnByb3RvdHlwZS5nZXRSYW5nZUxlbmd0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT09IHRoaXMub3JpZ2luID8gLTEgOiB0aGlzLnJhbmdlUmlnaHQgPj0gdGhpcy5yYW5nZUxlZnQgPyAodGhpcy5yYW5nZVJpZ2h0IC0gdGhpcy5yYW5nZUxlZnQpLnRvRml4ZWQoMykgOiAodGhpcy5ub3JtYWxpemVkTWF4IC0gdGhpcy5yYW5nZUxlZnQgKyB0aGlzLnJhbmdlUmlnaHQpLnRvRml4ZWQoMyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmFyLmEgPSBmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBiW2FdICYmIChhID0gYlthXSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9lOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5ldmVudHNDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmV2ZW50c0hhbmRsZWRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnZhbGlkRXZlbnRzSGFuZGxlZENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYWxwaGEub3JpZ2luID8gYS5hbHBoYS5vcmlnaW4gOiAnbnVsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hbHBoYS5nZXRSYW5nZUxlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmV0YS5vcmlnaW4gPyBhLmJldGEub3JpZ2luIDogJ251bGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmV0YS5nZXRSYW5nZUxlbmd0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZ2FtbWEub3JpZ2luID8gYS5nYW1tYS5vcmlnaW4gOiAnbnVsbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5nYW1tYS5nZXRSYW5nZUxlbmd0aCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBhLmMuZS5EZXZpY2VPcmllbnRhdGlvbkV2ZW50ICYmIChhLmsuYS5henN4KCdhZEluaXRpYWxpemVkJywgayksIGEuay5hLmF6c3goJ2FkS2lsbGVkJywgZCksIGEuay5hLmF6c3goJ2FsbExvY2FsQWRzS2lsbGVkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByICYmIHIuZGNzeCAmJiByLmRjc3guZW5nbiAmJiByLmRjc3guZW5nbih7IGxpc3RlbmVyTmFtZTogJ2RldmljZW9yaWVudGF0aW9uRm4nICsgYS5jLmF4LmEgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIuc3dkZS5zeGF6KCdkZXZpY2VvcmllbnRhdGlvbi0nICsgYS5jLmF4LmEsIHsgY2FsbGJhY2s6IGYgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGEuYy5heC5iID0gITE7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICBhLmJhID0ge307CiAgICAgICAgICAgICAgICAgICAgYS5iYS5hID0gITE7CiAgICAgICAgICAgICAgICAgICAgYS5iYS5iID0gZnVuY3Rpb24gKGspIHsKICAgICAgICAgICAgICAgICAgICAgICAgayAmJiBrLnpNb2F0RU5WICYmICd4JyA9PT0gay56TW9hdEVOViAmJiAoYS5iYS5hID0gITApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEubC5sKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnNyYyA9ICdodHRwczovL3oubW9hdGFkcy5jb20vaGQwOTgyNDA5Mi9pZnJhbWUuaHRtbCNoZWFkZXI9MSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnN0eWxlLndpZHRoID0gJzBweCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLnN0eWxlLmhlaWdodCA9ICcwcHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi53aWR0aCA9ICcwJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuaGVpZ2h0ID0gJzAnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAncmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNF9NT0FUX0lGUkFNRScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5hLmNsKGIsIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuZi5hKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICE9PSAnUkVVVEVSU19IRUFERVIxJy5pbmRleE9mKGMpICYmIChiID0gYS5hLmR5KGIsIGMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiBmLm1zZ0RhdGEgJiYgJ3N0cmluZycgPT09IHR5cGVvZiBmLm1zZ0RhdGEuZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBmLm1zZ0RhdGEuZGF0YS5zcGxpdCgnQEBAJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMiA9PT0gZy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KGdbMF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBkZWNvZGVVUklDb21wb25lbnQoZ1sxXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiB7IGlubmVySFRNTDogJycgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NsYXNzJyA9PT0gYSA/IHRoaXMuY2xhc3NOYW1lIDogdGhpc1thXSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VkRnJvbVNsb3RUYWc6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGsgPSBhLmFwLmMoZywgJ2ZlYXRoZXInKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLnNsaSA9IGQoay5zbGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuX0FEX0ZPUk1BVCA9ICdmZWF0aGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmJhLmIoayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuYmEuYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5iYS5hID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEueS5iKDE3LCBrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBiKGYuc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5sLmsoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gdC5sZW5ndGggLSAxOyAwIDw9IGQ7IGQtLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0W2RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYgIT09IGYudG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSBhLmcuYihudWxsLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmJ0KGcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gZzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gYyhmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5hLmJ0KGcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPyAoay5hZEZpbmRpbmdNZXRob2QgPSAnbW9hdCBzbG90IHRhZycsIGsudHJhY2tlZEZyb21TbG90VGFnID0gITAsIGUodCwgayksIGEuZC5mKGIsIGIubm9kZU5hbWUsICExLCB2b2lkIDAsIGssIG51bGwpLCBiID0gITApIDogYiA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEudi5oLCBhLnYudiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS55LmIoMTEsIGspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhjLCBmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyAmJiBjLnNyYyAmJiAnc3RyaW5nJyA9PT0gdHlwZW9mIGMubm9kZU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMudHJhY2tlZEZyb21TbG90VGFnID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGEuYXAuYyhjLCAnZmVhdGhlcicpIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy50cmFja2VkRnJvbVNsb3RUYWcgPSAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuX0FEX0ZPUk1BVCA9ICdmZWF0aGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYWx0S2V5ICYmIChnLmFsdEtleSA9IGYuYWx0S2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc2xpID0gZChmLnNsaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnVzZVNsb3RJa2V5ID0gZi51c2VTbG90SWtleTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gYS5hLmJlKGMpLCBrID0gYihrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoaywgZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmJhLmIoZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS5iYS5hKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYmEuYSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS55LmIoMTcsIGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gYS5hLmJoKGMpLCBxID0gYS5hLmJlKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEudi5jKGssIGcsIG51bGwsIG51bGwsIG51bGwsIHEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoYikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYzsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBiLnBhcmVudC5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuZy5mKGMsIGIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGEuZy5rKGIsIDI1KTsKICAgICAgICAgICAgICAgICAgICAgICAgYy51bnNoaWZ0KGIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShiLCBkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYiB8fCAhYS5hLmYoYikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBiLmxlbmd0aCAtIDE7IDAgPD0gZTsgZS0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IGJbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi50b3AgIT09IGYgJiYgKGYgPSBhLmcuYihudWxsLCBmKSB8fCBjKGYpLCBmID0gYS5hbi54KGYpLCAnc3RyaW5nJyA9PT0gdHlwZW9mIGYpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIChkLnNsb3RNYXBwaW5nSWQgPSBmKSwgZjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGEuYmIgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmJiLmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGsoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5hdy5sKCdzY3JpcHRmb3VuZHJldXRlcnNoZWFkZXIxOTQ4ODM1NTIwMjQnLCBhLmwubChmKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX21vYXRTbG90VGFnTG9hZGVkcmV1dGVyc2hlYWRlcjE5NDg4MzU1MjAyNCA9IGEubC5sKGcpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KHUpKTsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoYSkgewogICAgICAgICAgICAgICAgICAgIGEuYXEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBhLmFxLmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrID0gYS5nLmEoKSwgZCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWsgfHwgIWsucGVyZm9ybWFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gay5wZXJmb3JtYW5jZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmIHx8ICdmdW5jdGlvbicgIT09IHR5cGVvZiBmLmdldEVudHJpZXNCeVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSBrID09PSB3aW5kb3cudG9wID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSBmLmdldEVudHJpZXNCeVR5cGUoJ3BhaW50JyksIGMgPSAwOyBjIDwgZy5sZW5ndGg7IGMrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBnW2NdLCAnZmlyc3QtcGFpbnQnID09PSBrLm5hbWUgJiYgKGRbMV0gPSB3LnJvdW5kKGsuc3RhcnRUaW1lKSksICdmaXJzdC1jb250ZW50ZnVsLXBhaW50JyA9PT0gay5uYW1lICYmIChkWzJdID0gdy5yb3VuZChrLnN0YXJ0VGltZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBmID0gZi5nZXRFbnRyaWVzQnlUeXBlKCduYXZpZ2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIDAgPCBmLmxlbmd0aCAmJiAoayA9IGZbMF0sICdkdXJhdGlvbicgaW4gayAmJiAoZFszXSA9IHcucm91bmQoay5kdXJhdGlvbikpLCAnZG9tSW50ZXJhY3RpdmUnIGluIGsgJiYgKGRbNF0gPSB3LnJvdW5kKGsuZG9tSW50ZXJhY3RpdmUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmpvaW4oJzonKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSh1KSk7CiAgICAgICAgICAgICAgICB1LmsuYS56YXhzKCdtb2R1bGVzUmVhZHknLCByKTsKICAgICAgICAgICAgICAgIHZhciBFYSA9IHUuZm9jdXMucGFnZUlzVmlzaWJsZSgpOwogICAgICAgICAgICAgICAgdS5jLmV2ID0gMSA9PSB3aW5kb3cuaGlzdG9yeS5sZW5ndGggJiYgIUVhICYmICh1LmMuYyAmJiAnJyAhPSBkb2N1bWVudC5yZWZlcnJlciB8fCAhdS5jLmMpOwogICAgICAgICAgICAgICAgdS5jLmogfHwgdS5jLmFsIHx8IHUuYy5kdygpOwogICAgICAgICAgICAgICAgKHUuYy5qICYmIHUuYy5lZygpIHx8ICdkdW1teS51cmwnID09PSB1LmEuYW8oKSkgJiYgdS5jLmR3KCk7CiAgICAgICAgICAgICAgICB2YXIgRCA9ICdtb2F0Rm91bmRSRVVURVJTX0hFQURFUjEnLCBNID0gJ19fbW9hdF9fUkVVVEVSU19IRUFERVIxJzsKICAgICAgICAgICAgICAgIHUuYy5hbSgpLmlzSW5BcHAgfHwgdS5hbC5mKCk7CiAgICAgICAgICAgICAgICB2YXIgTCA9IHUuYS5jYygpOwogICAgICAgICAgICAgICAgVyA9ICdodHRwczovL3B4Lm1vYXRhZHMuY29tJzsKICAgICAgICAgICAgICAgIHUuYXUuYSh3YSk7CiAgICAgICAgICAgICAgICB2YXIgRmEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgci56cyAmJiByLmRjc3ggJiYgKHIuZGNzeC5lbmduKHsgbGlzdGVuZXJOYW1lOiAndW5sb2FkRm4nICsgdS5jLmF4LmEgfSksIHIuZGNzeC5lbmduKHsgbGlzdGVuZXJOYW1lOiAnYmVmb3JldW5sb2FkRm4nICsgdS5jLmF4LmEgfSkpOwogICAgICAgICAgICAgICAgICAgIGphIHx8IChqYSA9ICEwLCB1LmQuYigpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB1LmEuYW8oKTsKICAgICAgICAgICAgICAgIHUuYXouZSgxNyk7CiAgICAgICAgICAgICAgICB1LnAuaSh1LmMuYXguYSwgdS5jLmF6KTsKICAgICAgICAgICAgICAgIHUuay5hLmF6c3goJ3RyYWNraW5nUmVhZHknLCB2YSwgeyBvbmNlOiAhMCB9KTsKICAgICAgICAgICAgICAgIHUuay5hLnpheHMoJ3RyYWNraW5nUmVhZHknKTsKICAgICAgICAgICAgfShEYXRlLCBNYXRoKSk7CiAgICAgICAgfSBjYXRjaCAoQSkgewogICAgICAgICAgICB2YXIgY3QgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgd2luZG93WydNb2F0I0VUUyddIHx8ICh3aW5kb3dbJ01vYXQjRVRTJ10gPSBjdCk7CiAgICAgICAgICAgIHdpbmRvd1snTW9hdCNFTUMnXSB8fCAod2luZG93WydNb2F0I0VNQyddID0gMCk7CiAgICAgICAgICAgIHZhciBldCA9IGN0IC0gd2luZG93WydNb2F0I0VUUyddLCBob3VyRWxhcHNlZCA9IDM2MDAwMDAgPD0gZXQsIG1zZyA9IEEubmFtZSArICcgaW4gY2xvc3VyZSAoZ2xvYmFsKTogJyArIEEubWVzc2FnZSArICcsIHN0YWNrPScgKyBBLnN0YWNrOwogICAgICAgICAgICBpZiAoIWhvdXJFbGFwc2VkICYmIDEwID4gd2luZG93WydNb2F0I0VNQyddKSB7CiAgICAgICAgICAgICAgICB3aW5kb3dbJ01vYXQjRU1DJ10rKzsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBpeGVsRG9tYWluID0gJ3B4Lm1vYXRhZHMuY29tJywgaXNEb21sZXNzID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBvbWlkTmF0aXZlICYmICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEltYWdlIHx8IEltYWdlICYmIEltYWdlLl9Nb2F0UHJveHlPZiksIGRvY3VtZW50UmVmZXJyZXIgPSBpc0RvbWxlc3MgPyAnJyA6IGRvY3VtZW50LnJlZmVycmVyLCBpc0JldGEgPSAhMSwgdmlld0hhc2ggPSAndW5kZWZpbmVkJyA9PT0gdHlwZW9mIEFEX1ZJRVdfSEFTSCA/IGlzQmV0YSA/ICdSRVVURVJTX0hFQURFUjFfQkVUQScgOiAnUkVVVEVSU19IRUFERVIxJyA6IEFEX1ZJRVdfSEFTSCwgdGFnVHlwZSA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2YgTW9hdCAmJiBNb2F0LmMgJiYgTW9hdC5jLm4gPyBNb2F0LmMubiA6ICcnLCBweFNyYyA9ICdodHRwczovLycgKyBwaXhlbERvbWFpbiArICcvcGl4ZWwuZ2lmP2U9MjQmZD1kYXRhJTNBZGF0YSUzQWRhdGElM0FkYXRhJmk9JyArIGVzY2FwZSh2aWV3SGFzaCkgKyAnJmFjPTEmaz0nICsgZXNjYXBlKG1zZykgKyAnJmFyPScgKyBlc2NhcGUoJzI5YWQ1OWQtY2xlYW4nKSArICcmaXc9JyArIGVzY2FwZSgnMzFkNjk2NScpICsgJyZicT0nICsgZXNjYXBlKHRhZ1R5cGUpICsgJyZqPScgKyBlc2NhcGUoZG9jdW1lbnRSZWZlcnJlcikgKyAnJmNzPScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNEb21sZXNzKQogICAgICAgICAgICAgICAgICAgICAgICBvbWlkTmF0aXZlLnNlbmRVcmwocHhTcmMpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW9hdF9weCA9IG5ldyBJbWFnZSgxLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9hdF9weC5zcmMgPSBweFNyYzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoICh3KSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaG91ckVsYXBzZWQpIHsKICAgICAgICAgICAgICAgIHdpbmRvd1snTW9hdCNFTUMnXSA9IDE7CiAgICAgICAgICAgICAgICB3aW5kb3dbJ01vYXQjRVRTJ10gPSBjdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcGl4ZWxEb21haW4gPSAncHgubW9hdGFkcy5jb20nLCBkb2N1bWVudFJlZmVycmVyID0gKGlzRG9tbGVzcyA9ICd1bmRlZmluZWQnICE9PSB0eXBlb2Ygb21pZE5hdGl2ZSAmJiAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiBJbWFnZSB8fCBJbWFnZSAmJiBJbWFnZS5fTW9hdFByb3h5T2YpKSA/ICcnIDogZG9jdW1lbnQucmVmZXJyZXIsIGlzQmV0YSA9ICExLCB2aWV3SGFzaCA9ICd1bmRlZmluZWQnID09PSB0eXBlb2YgQURfVklFV19IQVNIID8gaXNCZXRhID8gJ1JFVVRFUlNfSEVBREVSMV9CRVRBJyA6ICdSRVVURVJTX0hFQURFUjEnIDogQURfVklFV19IQVNILCB0YWdUeXBlID0gJ3VuZGVmaW5lZCcgIT09IHR5cGVvZiBNb2F0ICYmIE1vYXQuYyAmJiBNb2F0LmMubiA/IE1vYXQuYy5uIDogJycsIHB4U3JjID0gJ2h0dHBzOi8vJyArIHBpeGVsRG9tYWluICsgJy9waXhlbC5naWY/ZT0yNCZkPWRhdGElM0FkYXRhJTNBZGF0YSUzQWRhdGEmaT0nICsgZXNjYXBlKHZpZXdIYXNoKSArICcmYWM9MSZrPScgKyBlc2NhcGUobXNnKSArICcmYXI9JyArIGVzY2FwZSgnMjlhZDU5ZC1jbGVhbicpICsgJyZpdz0nICsgZXNjYXBlKCczMWQ2OTY1JykgKyAnJmJxPScgKyBlc2NhcGUodGFnVHlwZSkgKyAnJmo9JyArIGVzY2FwZShkb2N1bWVudFJlZmVycmVyKSArICcmY3M9JyArIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBpc0RvbWxlc3MgPyBvbWlkTmF0aXZlLnNlbmRVcmwocHhTcmMpIDogKG1vYXRfcHggPSBuZXcgSW1hZ2UoMSwgMSksIG1vYXRfcHguc3JjID0gcHhTcmMpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAodykgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIDsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-optanon-v1.1.0","aliases":["sugarcoat-optanon-v1.1.0"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfMGMzNWIxZTFjNjI4MDU4NCA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBsZXQgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICBjbGFzcyBTdG9yYWdlIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5KGluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0SXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywga2V5KSA/IHRoaXNba2V5XSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0SXRlbShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBTdG9yYWdlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLmxvY2FsU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5zZXNzaW9uU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlzU2VhbGVkID0gdHJ1ZTsKICAgIH0pKCRfX19tb2NrXzBjMzViMWUxYzYyODA1ODQpOwogICAgY29uc3QgJF9fX21vY2tfZTA4OGRkZDE2Njk2MjJiZSA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBjb25zdCB4aHJVbnNlbnQgPSAwOwogICAgICAgIGNvbnN0IHhock9wZW5lZCA9IDE7CiAgICAgICAgY29uc3QgeGhySGVhZGVyc1JlY2VpdmVkID0gMjsKICAgICAgICBjb25zdCB4aHJMb2FkaW5nID0gMzsKICAgICAgICBjb25zdCB4aHJEb25lID0gNDsKICAgICAgICBjb25zdCB4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbCA9IFN5bWJvbCgnZGVmZXJyZWRIYW5kbGUnKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTdGFydFN5bWJvbCA9IFN5bWJvbCgnb25sb2Fkc3RhcnQnKTsKICAgICAgICBjb25zdCB4aHJPblByb2dyZXNzU3ltYm9sID0gU3ltYm9sKCdvbnByb2dyZXNzJyk7CiAgICAgICAgY29uc3QgeGhyT25BYm9ydFN5bWJvbCA9IFN5bWJvbCgnb25hYm9ydCcpOwogICAgICAgIGNvbnN0IHhock9uRXJyb3JTeW1ib2wgPSBTeW1ib2woJ29uZXJyb3InKTsKICAgICAgICBjb25zdCB4aHJPbkxvYWRTeW1ib2wgPSBTeW1ib2woJ29ubG9hZCcpOwogICAgICAgIGNvbnN0IHhock9uVGltZW91dFN5bWJvbCA9IFN5bWJvbCgnb250aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyT25Mb2FkRW5kU3ltYm9sID0gU3ltYm9sKCdvbmxvYWRlbmQnKTsKICAgICAgICBjb25zdCB4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2wgPSBTeW1ib2woJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgIGNvbnN0IHhoclJlYWR5U3RhdGVTeW1ib2wgPSBTeW1ib2woJ3JlYWR5U3RhdGUnKTsKICAgICAgICBjb25zdCB4aHJUaW1lb3V0U3ltYm9sID0gU3ltYm9sKCd0aW1lb3V0Jyk7CiAgICAgICAgY29uc3QgeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sID0gU3ltYm9sKCd3aXRoQ3JlZGVudGlhbHMnKTsKICAgICAgICBjb25zdCB4aHJVcGxvYWRTeW1ib2wgPSBTeW1ib2woJ3VwbG9hZCcpOwogICAgICAgIGNvbnN0IHhoclJlc3BvbnNlVHlwZVN5bWJvbCA9IFN5bWJvbCgncmVzcG9uc2VUeXBlJyk7CiAgICAgICAgY29uc3QgZGVmaW5lRXZlbnQgPSAob2JqLCBzeW1ib2wpID0+IHsKICAgICAgICAgICAgY29uc3QgdHlwZSA9IHN5bWJvbC5kZXNjcmlwdGlvbi5zdWJzdHJpbmcoMik7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHN5bWJvbCwgewogICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgdmFsdWU6IG51bGwsCiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpc1tzeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYW5nZVJlYWR5U3RhdGUgPSAoeGhyLCByZWFkeVN0YXRlKSA9PiB7CiAgICAgICAgICAgIHhoclt4aHJSZWFkeVN0YXRlU3ltYm9sXSA9IHJlYWR5U3RhdGU7CiAgICAgICAgICAgIHhoci5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVhZHlzdGF0ZWNoYW5nZScpKTsKICAgICAgICB9OwogICAgICAgIGxldCBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgY2xhc3MgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCBleHRlbmRzIEV2ZW50VGFyZ2V0IHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSAmJiAhKHRoaXMgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdFVwbG9hZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTdGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPblByb2dyZXNzU3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uQWJvcnRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25FcnJvclN5bWJvbCk7CiAgICAgICAgICAgICAgICBkZWZpbmVFdmVudCh0aGlzLCB4aHJPbkxvYWRTeW1ib2wpOwogICAgICAgICAgICAgICAgZGVmaW5lRXZlbnQodGhpcywgeGhyT25UaW1lb3V0U3ltYm9sKTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uTG9hZEVuZFN5bWJvbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ubG9hZHN0YXJ0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkU3RhcnRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbmxvYWRzdGFydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkxvYWRTdGFydFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25wcm9ncmVzcygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCBvbnByb2dyZXNzKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uUHJvZ3Jlc3NTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9uYWJvcnQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJPbkFib3J0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25hYm9ydCh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPbkFib3J0U3ltYm9sXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBvbmVycm9yKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25FcnJvclN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9uZXJyb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXNbeGhyT25FcnJvclN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb250aW1lb3V0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25UaW1lb3V0U3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb250aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uVGltZW91dFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgb25sb2FkZW5kKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbeGhyT25Mb2FkRW5kU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXQgb25sb2FkZW5kKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hock9uTG9hZEVuZFN5bWJvbF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBleHBvcnRzLlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdFVwbG9hZCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NlYWxlZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0lsbGVnYWwgY29uc3RydWN0b3InKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5YTUxIdHRwUmVxdWVzdFVwbG9hZCA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogWE1MSHR0cFJlcXVlc3RVcGxvYWQsCiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgfTsKICAgICAgICBjbGFzcyBYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgY29uc3QgeGhyVXBsb2FkID0gbmV3IFhNTEh0dHBSZXF1ZXN0VXBsb2FkKCk7CiAgICAgICAgICAgICAgICBpc1NlYWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyRGVmZXJyZWRIYW5kbGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRlZmluZUV2ZW50KHRoaXMsIHhock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbCk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyUmVhZHlTdGF0ZVN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHhoclVuc2VudCwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgeGhyVGltZW91dFN5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHhocldpdGhDcmVkZW50aWFsc1N5bWJvbCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJVcGxvYWRTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB4aHJVcGxvYWQsCiAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCB4aHJSZXNwb25zZVR5cGVTeW1ib2wsIHsKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hock9uUmVhZHlTdGF0ZUNoYW5nZVN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IG9ucmVhZHlzdGF0ZWNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpc1t4aHJPblJlYWR5U3RhdGVDaGFuZ2VTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHJlYWR5U3RhdGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcGVuKG1ldGhvZCwgdXJsKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgeGhyVW5zZW50OgogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyT3BlbmVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZXRUcnVzdFRva2VuKHRydXN0VG9rZW4pIHsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgdGltZW91dCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclRpbWVvdXRTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCB0aW1lb3V0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW3hoclRpbWVvdXRTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHdpdGhDcmVkZW50aWFscygpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hocldpdGhDcmVkZW50aWFsc1N5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0IHdpdGhDcmVkZW50aWFscyh2YWx1ZSkgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdKSB7CiAgICAgICAgICAgICAgICBjYXNlIHhoclVuc2VudDoKICAgICAgICAgICAgICAgIGNhc2UgeGhyT3BlbmVkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIHNldCB0aGUgXCd3aXRoQ3JlZGVudGlhbHNcJyBwcm9wZXJ0eSBvbiBcJ1hNTEh0dHBSZXF1ZXN0XCc6IFRoZSB2YWx1ZSBtYXkgb25seSBiZSBzZXQgaWYgdGhlIG9iamVjdFwncyBzdGF0ZSBpcyBVTlNFTlQgb3IgT1BFTkVELicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXNbeGhyV2l0aENyZWRlbnRpYWxzU3ltYm9sXSA9ICEhdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHVwbG9hZCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW3hoclVwbG9hZFN5bWJvbF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VuZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzW3hoclJlYWR5U3RhdGVTeW1ib2xdID09PSB4aHJPcGVuZWQgJiYgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyRG9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnZXJyb3InKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgXCdzZW5kXCcgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgb2JqZWN0XCdzIHN0YXRlIG11c3QgYmUgT1BFTkVELicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFib3J0KCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXNbeGhyUmVhZHlTdGF0ZVN5bWJvbF0gPT09IHhock9wZW5lZCAmJiB0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzW3hockRlZmVycmVkSGFuZGxlU3ltYm9sXSk7CiAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJEZWZlcnJlZEhhbmRsZVN5bWJvbF0gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZVJlYWR5U3RhdGUodGhpcywgeGhyVW5zZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2dyZXNzRXZlbnQoJ2Fib3J0JykpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUHJvZ3Jlc3NFdmVudCgnbG9hZGVuZCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VVUkwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IHN0YXR1cygpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCBzdGF0dXNUZXh0KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldFJlc3BvbnNlSGVhZGVyKG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJyaWRlTWltZVR5cGUobWltZSkgewogICAgICAgICAgICB9CiAgICAgICAgICAgIGdldCByZXNwb25zZVR5cGUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldCByZXNwb25zZVR5cGUodmFsdWUpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpc1t4aHJSZWFkeVN0YXRlU3ltYm9sXSkgewogICAgICAgICAgICAgICAgY2FzZSB4aHJEb25lOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byBzZXQgdGhlIFwncmVzcG9uc2VUeXBlXCcgcHJvcGVydHkgb24gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgcmVzcG9uc2UgdHlwZSBjYW5ub3QgYmUgc2V0IGlmIHRoZSBvYmplY3RcJ3Mgc3RhdGUgaXMgTE9BRElORyBvciBET05FLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyc6CiAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICBjYXNlICdibG9iJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2RvY3VtZW50JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2UoKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVR5cGUgPSB0aGlzW3hoclJlc3BvbnNlVHlwZVN5bWJvbF07CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VUeXBlID09PSAnJyB8fCByZXNwb25zZVR5cGUgPT09ICd0ZXh0JyA/ICcnIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VUZXh0KCkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdGhpc1t4aHJSZXNwb25zZVR5cGVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gJycgfHwgcmVzcG9uc2VUeXBlID09PSAndGV4dCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHRoZSBcJ3Jlc3BvbnNlVGV4dFwnIHByb3BlcnR5IGZyb20gXCdYTUxIdHRwUmVxdWVzdFwnOiBUaGUgdmFsdWUgaXMgb25seSBhY2Nlc3NpYmxlIGlmIHRoZSBvYmplY3RcJ3MgXCdyZXNwb25zZVR5cGVcJyBpcyBcJ1wnIG9yIFwndGV4dFwnICh3YXMgXCdhcnJheWJ1ZmZlclwnKS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBnZXQgcmVzcG9uc2VYTUwoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdVTlNFTlQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJVbnNlbnQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdPUEVORUQnLCB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiB4aHJPcGVuZWQKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdIRUFERVJTX1JFQ0VJVkVEJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhySGVhZGVyc1JlY2VpdmVkCiAgICAgICAgfSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFhNTEh0dHBSZXF1ZXN0LCAnTE9BRElORycsIHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHhockxvYWRpbmcKICAgICAgICB9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3QsICdET05FJywgewogICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICB2YWx1ZTogeGhyRG9uZQogICAgICAgIH0pOwogICAgICAgIGV4cG9ydHMuWE1MSHR0cFJlcXVlc3QgPSB7CiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IFhNTEh0dHBSZXF1ZXN0LAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICB9KSgkX19fbW9ja19lMDg4ZGRkMTY2OTYyMmJlKTsKICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIWZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGZ1bmN0aW9uIHQobykgewogICAgICAgICAgICAgICAgaWYgKG5bb10pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bb10uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciByID0gbltvXSA9IHsKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiB7fSwKICAgICAgICAgICAgICAgICAgICBpZDogbywKICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGVbb10uY2FsbChyLmV4cG9ydHMsIHIsIHIuZXhwb3J0cywgdCksIHIubG9hZGVkID0gITAsIHIuZXhwb3J0czsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICByZXR1cm4gdC5tID0gZSwgdC5jID0gbiwgdC5wID0gJycsIHQoMCk7CiAgICAgICAgfShbCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBuKDEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQgPSBlLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIG4gPSBBcnJheShlLmxlbmd0aCk7IHQgPCBlLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XSA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG4oMiksIG4oMyksIG4oNCk7CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oNSksIGEgPSBvKGkpLCBzID0gbigxMiksIGwgPSBuKDEwKSwgdSA9IG8obCksIGMgPSBuKDExKSwgZCA9IG8oYyksIGYgPSBuKDEzKSwgZyA9IG8oZiksIHAgPSBuKDE4KSwgXyA9IG8ocCksIGggPSBuKDE0KSwgdiA9IG8oaCksIE8gPSBuKDE5KSwgYiA9IG8oTyksIEEgPSBuKDE1KSwgRSA9IG8oQSksIFQgPSBuKDIwKSwgeSA9IG8oVCksIEMgPSBuKDE3KSwgdyA9IG8oQyksIG0gPSBuKDE2KSwgUyA9IG8obSksIEwgPSBuKDIxKSwgTiA9IG8oTCksIEkgPSBuKDIyKSwgRCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9tOiBhLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHM6IHUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogZCwKICAgICAgICAgICAgICAgICAgICAgICAgb3Q6IGcsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TnBhRmxhZzogcy5nZXROcGFGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFkc2Vuc2VQZXJzb25hbGl6YXRpb246IHMuaW5pdEFkc2Vuc2VQZXJzb25hbGl6YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY21kOiBfLAogICAgICAgICAgICAgICAgICAgICAgICBvbklmcmFtZXNSZWFkeTogSS5vbklmcmFtZXNSZWFkeSwKICAgICAgICAgICAgICAgICAgICAgICAgb25Gb3Jtc1JlYWR5OiBJLm9uRm9ybXNSZWFkeSwKICAgICAgICAgICAgICAgICAgICAgICAgb25TY3JpcHRzUmVhZHk6IEkub25TY3JpcHRzUmVhZHksCiAgICAgICAgICAgICAgICAgICAgICAgIG9uQWRzUmVhZHk6IEkub25BZHNSZWFkeSwKICAgICAgICAgICAgICAgICAgICAgICAgb25Tb2NpYWxSZWFkeTogSS5vblNvY2lhbFJlYWR5LAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhhbmRsZXJzOiBiLAogICAgICAgICAgICAgICAgICAgICAgICBsZWF2ZWJlaGluZDogRSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbGl1bTogeSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFnczogdywKICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWM6IFMsCiAgICAgICAgICAgICAgICAgICAgICAgIHRjZjogTgogICAgICAgICAgICAgICAgICAgIH0sIFAgPSBhLmdsb2JhbHMud2luZG93LmNic29wdGFub24sIFIgPSBQID8gW10uY29uY2F0KHIoUC5jb25maWcpKSA6IFtdLCBNID0gW107CiAgICAgICAgICAgICAgICBNLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLnRlYWxpdW0uc2V0U3RhdHVzKGUudGVhbGl1bS5QRU5ESU5HKSwgZS50ZWFsaXVtLmluaXQoKSwgZS5hZHMuaW5pdEFkc2Vuc2VQZXJzb25hbGl6YXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF0sIG4gPSBhLmdsb2JhbHMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgbi5zcmMgPSB1LkNQU19OT1RJQ0VfRU5EUE9JTlQsIG4uYXN5bmMgPSAhMCwgdC5hcHBlbmRDaGlsZChuKTsKICAgICAgICAgICAgICAgIH0pLCBQICYmIChNID0gTS5jb25jYXQoW10uY29uY2F0KHIoUC5jbWQpKSkpLCBNLnB1c2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLm90LmF3YWl0T25lVHJ1c3RTZXR0aW5ncygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBhLndyaXRlbG9nKCdPbmVUcnVzdCBnbG9iYWxzIHByZXNlbnQnKTsKICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLndyaXRlbG9nKCdPbmVUcnVzdCBmYWlsZWQgdG8gbG9hZCwgT3B0YW5vbiBwYW5pY2tlZCcpLCBhLndyaXRlbG9nKGUudG9TdHJpbmcoKSksIFMuX2luaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KSwgZS5vdC5hd2FpdENvb2tpZVNldHRpbmdzKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEud3JpdGVsb2coJ0Nvb2tpZSBzZXR0aW5ncyBsb2FkZWQnKTsKICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGEud3JpdGVsb2coJ0ZhaWxlZCB0byBkZXRlY3QgY29va2llIHNldHRpbmdzLCBPcHRhbm9uIHBhbmlja2VkJyksIFMuX2luaXQoKTsKICAgICAgICAgICAgICAgICAgICB9KSwgZS5vdC5hd2FpdE9uZVRydXN0U2V0dGluZ3MoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEud3JpdGVsb2coJ0xvYWRlZCBjb25zZW50IG1vZGVsOiAnICsgZS5vdC5nZXRDb25zZW50TW9kZWwoKSksIGEud3JpdGVsb2coJ29uQ29uc2VudENoYW5nZWQgY2FsbGJhY2sgcXVldWUgcmVnaXN0ZXJlZCcpLCBhLmdsb2JhbHMuT3B0YW5vbi5PbkNvbnNlbnRDaGFuZ2VkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm90Ll9vbkNvbnNlbnRDaGFuZ2VkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgYS53cml0ZWxvZygnTG9hZGluZyBPbmVUcnVzdCBQYXRjaGVzJyksIGEuZ2V0Q29uc2VudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLndyaXRlbG9nKCdDaGVja2luZyBmb3IgT25lVHJ1c3QgQmFubmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5nbG9iYWxzLk9uZVRydXN0ICYmIGEuZ2xvYmFscy5PbmVUcnVzdC5Jc0FsZXJ0Qm94Q2xvc2VkICYmIGEuZ2xvYmFscy5PbmVUcnVzdC5Jc0FsZXJ0Qm94Q2xvc2VkKCkgPyAoYS53cml0ZWxvZygnT25lVHJ1c3QgQmFubmVyIEFscmVhZHkgQ2xvc2VkJyksIHZvaWQgY2xlYXJJbnRlcnZhbCh0KSkgOiB2b2lkIChhLmdsb2JhbHMuT25lVHJ1c3QgJiYgYS5nbG9iYWxzLk9uZVRydXN0LkNsb3NlICYmICFhLmdsb2JhbHMuT25lVHJ1c3QuSXNBbGVydEJveENsb3NlZCgpICYmIChhLndyaXRlbG9nKCdDbG9zaW5nIE9uZVRydXN0IEJhbm5lcicpLCBhLmdsb2JhbHMuT25lVHJ1c3QuQ2xvc2UoKSwgY2xlYXJJbnRlcnZhbCh0KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS53cml0ZWxvZygnRXJyb3IgY2F1Z2h0IHdoaWxlIGxvYWRpbmcgT25lVHJ1c3QgSW50ZWdyYXRpb25zJyksIGEud3JpdGVsb2coZS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pLCBhLmdsb2JhbHMud2luZG93LmNic29wdGFub24gPSBELCBELmNvbmZpZy5faW5pdChSKSwgRC5jbWQuX2luaXQoTSksIEQuY2hhbmdlSGFuZGxlcnMuX2luaXQoKSwgRC5sZWF2ZWJlaGluZC5faW5pdCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgT2JqZWN0LmFzc2lnbiAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LCAnYXNzaWduJywgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gZSB8fCB2b2lkIDAgPT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IE9iamVjdChlKSwgbyA9IDE7IG8gPCBhcmd1bWVudHMubGVuZ3RoOyBvKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW29dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHIgJiYgdm9pZCAwICE9PSByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgaW4gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsIGkpICYmIChuW2ldID0gcltpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMgfHwgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2luY2x1ZGVzJywgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSB0IHx8ICdudW1iZXInID09IHR5cGVvZiBlICYmICdudW1iZXInID09IHR5cGVvZiB0ICYmIGlzTmFOKGUpICYmIGlzTmFOKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IHRoaXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCcidGhpcyIgaXMgbnVsbCBvciBub3QgZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE9iamVjdCh0aGlzKSwgciA9IG8ubGVuZ3RoID4+PiAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAgfCB0LCBhID0gTWF0aC5tYXgoaSA+PSAwID8gaSA6IHIgLSBNYXRoLmFicyhpKSwgMCk7IGEgPCByOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4ob1thXSwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgQXJyYXkuZnJvbSB8fCAoQXJyYXkuZnJvbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIHQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgfHwgJ1tvYmplY3QgRnVuY3Rpb25dJyA9PT0gZS5jYWxsKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gTnVtYmVyKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKHQpID8gMCA6IDAgIT09IHQgJiYgaXNGaW5pdGUodCkgPyAodCA+IDAgPyAxIDogLTEpICogTWF0aC5mbG9vcihNYXRoLmFicyh0KSkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LCBvID0gTWF0aC5wb3coMiwgNTMpIC0gMSwgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgodCwgMCksIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMsIG8gPSBPYmplY3QoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5mcm9tIHJlcXVpcmVzIGFuIGFycmF5LWxpa2Ugb2JqZWN0IC0gbm90IG51bGwgb3IgdW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBhID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiAoaSA9IGFyZ3VtZW50c1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcywgbCA9IHIoby5sZW5ndGgpLCB1ID0gdChuKSA/IE9iamVjdChuZXcgbihsKSkgOiBuZXcgQXJyYXkobCksIGMgPSAwOyBjIDwgbDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gb1tjXSwgYSA/IHVbY10gPSAndW5kZWZpbmVkJyA9PSB0eXBlb2YgaSA/IGEocywgYykgOiBhLmNhbGwoaSwgcywgYykgOiB1W2NdID0gcywgYyArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5sZW5ndGggPSBsLCB1OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyB8fCAoU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInICE9IHR5cGVvZiB0ICYmICh0ID0gMCksICEodCArIGUubGVuZ3RoID4gdGhpcy5sZW5ndGgpICYmIHRoaXMuaW5kZXhPZihlLCB0KSAhPT0gLTE7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSwgbykgewogICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQgPSBlLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3Byb2R1Y3Rpb24nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ2RldmVsb3BtZW50JyAhPSB0LmdldEVudmlyb25tZW50KCkgJiYgJ3Byb2R1Y3Rpb24nICE9IHQuZ2V0RW52aXJvbm1lbnQoKSB8fCAhdC5nbG9iYWxzLmRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5pbmNsdWRlcyhlICsgJz10cnVlJykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNUZXN0RmxhZyhnLkZMQUdfU0hPV19MT0dTKSAmJiB0Lmdsb2JhbHMuY29uc29sZS5sb2coJyVjY2Jzb3B0YW5vbjonLCAnYmFja2dyb3VuZC1jb2xvcjogIzAwYWVlZjsgY29sb3I6ICNmZmY7IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiAxMDUlOycsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNUZXN0RmxhZyhnLkZMQUdfU0hPV19MT0dTKSAmJiB0Lmdsb2JhbHMuY29uc29sZS5sb2coJyVjW0RFUFJFQ0FURURdIGNic29wdGFub246JywgJ2JhY2tncm91bmQtY29sb3I6ICNlZjAwMDA7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiAycHg7IGZvbnQtc2l6ZTogMTA1JTsnLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0Lmdsb2JhbHMuZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoLm1hdGNoKGgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gcGFyc2VJbnQoZVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKG4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBvID0ge30sIHIgPSAwOyByIDwgdjsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBPW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9baV0gPSAwICE9IChuICYgMSA8PCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF8uZ2V0Q29uc2VudENvb2tpZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gdC5nbG9iYWxzLmRlY29kZVVSSUNvbXBvbmVudChlLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKGIsIGZ1bmN0aW9uIChlLCB0LCBvLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0LmdldENvbnNlbnRDb29raWVEYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW0FdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0WzFdICYmICcxJyA9PSB0WzFdICYmIG8ucHVzaCh0WzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8uam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnY29tcGxldGUnID09PSB0Lmdsb2JhbHMuZG9jdW1lbnQucmVhZHlTdGF0ZSB8fCAnaW50ZXJhY3RpdmUnID09PSB0Lmdsb2JhbHMuZG9jdW1lbnQucmVhZHlTdGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFySW50ZXJ2YWwobiksIGUoITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgRSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5DT05TRU5UX0dST1VQX0tFWSA9IHQuQ09OU0VOVEVEX0NBVEVHT1JJRVNfUkVHRVggPSB0LkNPTlNFTlRfS0VZUyA9IHQuZ2xvYmFscyA9IHZvaWQgMCwgdC5nZXRFbnZpcm9ubWVudCA9IGksIHQuaGFzVGVzdEZsYWcgPSBhLCB0LndyaXRlbG9nID0gcywgdC53cml0ZURlcHJlY2F0aW9uTm90aWNlID0gbCwgdC5nZXRDb25zZW50ID0gdSwgdC5nZXRDb25zZW50Q29va2llRGF0YSA9IGMsIHQuZ2V0Q29uc2VudGVkQ2F0ZWdvcmllcyA9IGQsIHQucmVhZHkgPSBmOwogICAgICAgICAgICAgICAgICAgIHZhciBnID0gbigxMCksIHAgPSBuKDExKSwgXyA9IHIocCksIGggPSAodC5nbG9iYWxzID0gZSwgL1xvcHRhbm9uQ29uc2VudD0oWzAtOV0rKVwmPy9pKSwgdiA9IDUsIE8gPSB0LkNPTlNFTlRfS0VZUyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZXJmb3JtYW5jZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb25hbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFya2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb2NpYWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlYXZlYmVoaW5kJwogICAgICAgICAgICAgICAgICAgICAgICBdLCBiID0gdC5DT05TRU5URURfQ0FURUdPUklFU19SRUdFWCA9IG5ldyBSZWdFeHAoJyhbXj89Jl0rKSg9KFteJl0qKSk/JywgJ2cnKSwgQSA9IHQuQ09OU0VOVF9HUk9VUF9LRVkgPSAnZ3JvdXBzJywgRSA9IDEwMDsKICAgICAgICAgICAgICAgIH0uY2FsbCh0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9KCksIG4oNikpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4oNykuUHJvbWlzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAodCwgbywgcikgewogICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBuKCk7CiAgICAgICAgICAgICAgICAgICAgfSh0aGlzLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZSB8fCAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBudWxsICE9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBaID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5leHRUaWNrKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxKGYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAwLCB0ID0gbmV3ICQoZiksIG4gPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5vYnNlcnZlKG4sIHsgY2hhcmFjdGVyRGF0YTogITAgfSksIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmRhdGEgPSBlID0gKytlICUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wb3J0MS5vbm1lc3NhZ2UgPSBmLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucG9ydDIucG9zdE1lc3NhZ2UoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHNldFRpbWVvdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKGYsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBLOyBlICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5lW2VdLCBuID0gbmVbZSArIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQobiksIG5lW2VdID0gdm9pZCAwLCBuZVtlICsgMV0gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IG4oOSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHEgPSBlLnJ1bk9uTG9vcCB8fCBlLnJ1bk9uQ29udGV4dCwgbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50cywgbyA9IHRoaXMsIHIgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gcltyZV0gJiYgRyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gby5fc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/ICFmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuW2kgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAoaSwgciwgZSwgby5fcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSA6IEwobywgciwgZSwgdCksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBlLmNvbnN0cnVjdG9yID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdChoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDKG4sIGUpLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZUVycm9yKCdBIHByb21pc2VzIGNhbGxiYWNrIGNhbm5vdCByZXR1cm4gdGhhdCBzYW1lIHByb21pc2UuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRoZW47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlLmVycm9yID0gZSwgbGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlLCB0LCBuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbCh0LCBuLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFcoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9ICExLCByID0gQShuLCB0LCBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCAobyA9ICEwLCB0ICE9PSBuID8gQyhlLCBuKSA6IG0oZSwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyB8fCAobyA9ICEwLCBTKGUsIHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgJ1NldHRsZTogJyArIChlLl9sYWJlbCB8fCAnIHVua25vd24gcHJvbWlzZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbyAmJiByICYmIChvID0gITAsIFMoZSwgcikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9zdGF0ZSA9PT0gYWUgPyBtKGUsIHQuX3Jlc3VsdCkgOiB0Ll9zdGF0ZSA9PT0gc2UgPyBTKGUsIHQuX3Jlc3VsdCkgOiBMKHQsIHZvaWQgMCwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29uc3RydWN0b3IgPT09IGUuY29uc3RydWN0b3IgJiYgbiA9PT0gcCAmJiB0LmNvbnN0cnVjdG9yLnJlc29sdmUgPT09IF8gPyBUKGUsIHQpIDogbiA9PT0gbGUgPyBTKGUsIGxlLmVycm9yKSA6IHZvaWQgMCA9PT0gbiA/IG0oZSwgdCkgOiBvKG4pID8gRShlLCB0LCBuKSA6IG0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gQyh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID09PSBuID8gUyh0LCB2KCkpIDogZShuKSA/IHkodCwgbiwgYihuKSkgOiBtKHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5fb25lcnJvciAmJiBlLl9vbmVycm9yKGUuX3Jlc3VsdCksIE4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9zdGF0ZSA9PT0gaWUgJiYgKGUuX3Jlc3VsdCA9IHQsIGUuX3N0YXRlID0gYWUsIDAgIT09IGUuX3N1YnNjcmliZXJzLmxlbmd0aCAmJiBXKE4sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3N0YXRlID09PSBpZSAmJiAoZS5fc3RhdGUgPSBzZSwgZS5fcmVzdWx0ID0gdCwgVyh3LCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTChlLCB0LCBuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuX3N1YnNjcmliZXJzLCBpID0gci5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLl9vbmVycm9yID0gbnVsbCwgcltpXSA9IHQsIHJbaSArIGFlXSA9IG4sIHJbaSArIHNlXSA9IG8sIDAgPT09IGkgJiYgZS5fc3RhdGUgJiYgVyhOLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5fc3Vic2NyaWJlcnMsIG4gPSBlLl9zdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9PSB0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSB2b2lkIDAsIHIgPSB2b2lkIDAsIGkgPSBlLl9yZXN1bHQsIGEgPSAwOyBhIDwgdC5sZW5ndGg7IGEgKz0gMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHRbYV0sIHIgPSB0W2EgKyBuXSwgbyA/IFAobiwgbywgciwgaSkgOiByKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuX3N1YnNjcmliZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gSSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWUuZXJyb3IgPSBlLCB1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbyhuKSwgYSA9IHZvaWQgMCwgcyA9IHZvaWQgMCwgbCA9IHZvaWQgMCwgdSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgPSBEKG4sIHIpLCBhID09PSB1ZSA/ICh1ID0gITAsIHMgPSBhLmVycm9yLCBhID0gbnVsbCkgOiBsID0gITAsIHQgPT09IGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIFModCwgTygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSByLCBsID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Ll9zdGF0ZSAhPT0gaWUgfHwgKGkgJiYgbCA/IEModCwgYSkgOiB1ID8gUyh0LCBzKSA6IGUgPT09IGFlID8gbSh0LCBhKSA6IGUgPT09IHNlICYmIFModCwgYSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2UrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcmVdID0gY2UrKywgZS5fc3RhdGUgPSB2b2lkIDAsIGUuX3Jlc3VsdCA9IHZvaWQgMCwgZS5fc3Vic2NyaWJlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IgPSBlLCB0aGlzLnByb21pc2UgPSBuZXcgZShoKSwgdGhpcy5wcm9taXNlW3JlXSB8fCBHKHRoaXMucHJvbWlzZSksIFYodCkgPyAodGhpcy5faW5wdXQgPSB0LCB0aGlzLmxlbmd0aCA9IHQubGVuZ3RoLCB0aGlzLl9yZW1haW5pbmcgPSB0Lmxlbmd0aCwgdGhpcy5fcmVzdWx0ID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKSwgMCA9PT0gdGhpcy5sZW5ndGggPyBtKHRoaXMucHJvbWlzZSwgdGhpcy5fcmVzdWx0KSA6ICh0aGlzLmxlbmd0aCA9IHRoaXMubGVuZ3RoIHx8IDAsIHRoaXMuX2VudW1lcmF0ZSgpLCAwID09PSB0aGlzLl9yZW1haW5pbmcgJiYgbSh0aGlzLnByb21pc2UsIHRoaXMuX3Jlc3VsdCkpKSA6IFModGhpcy5wcm9taXNlLCBGKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXknKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgayh0aGlzLCBlKS5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0KFYoZSkgPyBmdW5jdGlvbiAobiwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBlLmxlbmd0aCwgaSA9IDA7IGkgPCByOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzb2x2ZShlW2ldKS50aGVuKG4sIG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQobmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBuID0gbmV3IHQoaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUyhuLCBlKSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvcicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGYWlsZWQgdG8gY29uc3RydWN0IFwnUHJvbWlzZVwnOiBQbGVhc2UgdXNlIHRoZSBcJ25ld1wnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3JlXSA9IE0oKSwgdGhpcy5fcmVzdWx0ID0gdGhpcy5fc3RhdGUgPSB2b2lkIDAsIHRoaXMuX3N1YnNjcmliZXJzID0gW10sIGggIT09IGUgJiYgKCdmdW5jdGlvbicgIT0gdHlwZW9mIGUgJiYgeCgpLCB0aGlzIGluc3RhbmNlb2YgeiA/IFIodGhpcywgZSkgOiBZKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBzZWxmKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBzZWxmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwb2x5ZmlsbCBmYWlsZWQgYmVjYXVzZSBnbG9iYWwgb2JqZWN0IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuUHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5yZXNvbHZlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdbb2JqZWN0IFByb21pc2VdJyA9PT0gbiAmJiAhdC5jYXN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLlByb21pc2UgPSB6OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBIID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICBIID0gQXJyYXkuaXNBcnJheSA/IEFycmF5LmlzQXJyYXkgOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEFycmF5XScgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFYgPSBILCBLID0gMCwgcSA9IHZvaWQgMCwgWiA9IHZvaWQgMCwgVyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVbS10gPSBlLCBuZVtLICsgMV0gPSB0LCBLICs9IDIsIDIgPT09IEsgJiYgKFogPyBaKGYpIDogb2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBKID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIHdpbmRvdyA/IHdpbmRvdyA6IHZvaWQgMCwgUSA9IEogfHwge30sICQgPSBRLk11dGF0aW9uT2JzZXJ2ZXIgfHwgUS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLCBlZSA9ICd1bmRlZmluZWQnID09IHR5cGVvZiBzZWxmICYmICd1bmRlZmluZWQnICE9IHR5cGVvZiB0ICYmICdbb2JqZWN0IHByb2Nlc3NdJyA9PT0ge30udG9TdHJpbmcuY2FsbCh0KSwgdGUgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGltcG9ydFNjcmlwdHMgJiYgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsLCBuZSA9IG5ldyBBcnJheSgxMDAwKSwgb2UgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIG9lID0gZWUgPyBzKCkgOiAkID8gdSgpIDogdGUgPyBjKCkgOiB2b2lkIDAgPT09IEogPyBnKCkgOiBkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygxNiksIGllID0gdm9pZCAwLCBhZSA9IDEsIHNlID0gMiwgbGUgPSBuZXcgSSgpLCB1ZSA9IG5ldyBJKCksIGNlID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsucHJvdG90eXBlLl9lbnVtZXJhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gdGhpcy5sZW5ndGgsIHQgPSB0aGlzLl9pbnB1dCwgbiA9IDA7IHRoaXMuX3N0YXRlID09PSBpZSAmJiBuIDwgZTsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VhY2hFbnRyeSh0W25dLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgay5wcm90b3R5cGUuX2VhY2hFbnRyeSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRoaXMuX2luc3RhbmNlQ29uc3RydWN0b3IsIG8gPSBuLnJlc29sdmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobyA9PT0gXykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PT0gcCAmJiBlLl9zdGF0ZSAhPT0gaWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldHRsZWRBdChlLl9zdGF0ZSwgdCwgZS5fcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1haW5pbmctLSwgdGhpcy5fcmVzdWx0W3RdID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuID09PSB6KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbmV3IG4oaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoaSwgZSwgciksIHRoaXMuX3dpbGxTZXR0bGVBdChpLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG5ldyBuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2lsbFNldHRsZUF0KG8oZSksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBrLnByb3RvdHlwZS5fc2V0dGxlZEF0ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdGhpcy5wcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgby5fc3RhdGUgPT09IGllICYmICh0aGlzLl9yZW1haW5pbmctLSwgZSA9PT0gc2UgPyBTKG8sIG4pIDogdGhpcy5fcmVzdWx0W3RdID0gbiksIDAgPT09IHRoaXMuX3JlbWFpbmluZyAmJiBtKG8sIHRoaXMuX3Jlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGsucHJvdG90eXBlLl93aWxsU2V0dGxlQXQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgTChlLCB2b2lkIDAsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uX3NldHRsZWRBdChhZSwgdCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLl9zZXR0bGVkQXQoc2UsIHQsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHouYWxsID0gQiwgei5yYWNlID0gaiwgei5yZXNvbHZlID0gXywgei5yZWplY3QgPSBVLCB6Ll9zZXRTY2hlZHVsZXIgPSBpLCB6Ll9zZXRBc2FwID0gYSwgei5fYXNhcCA9IFcsIHoucHJvdG90eXBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2g6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgWCgpLCB6LnBvbHlmaWxsID0gWCwgei5Qcm9taXNlID0geiwgejsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0uY2FsbCh0LCBuKDgpLCBuKDYpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9KCkpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PT0gc2V0VGltZW91dCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChjID09PSBuIHx8ICFjKSAmJiBzZXRUaW1lb3V0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA9IHNldFRpbWVvdXQsIHNldFRpbWVvdXQoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMoZSwgMCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuY2FsbChudWxsLCBlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuY2FsbCh0aGlzLCBlLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChkID09PSBjbGVhclRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQoZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChkID09PSBvIHx8ICFkKSAmJiBjbGVhclRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gY2xlYXJUaW1lb3V0LCBjbGVhclRpbWVvdXQoZSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuY2FsbChudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuY2FsbCh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgXyAmJiBnICYmIChfID0gITEsIGcubGVuZ3RoID8gcCA9IGcuY29uY2F0KHApIDogaCA9IC0xLCBwLmxlbmd0aCAmJiBzKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcygpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIV8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSByKGEpOwogICAgICAgICAgICAgICAgICAgICAgICBfID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBwLmxlbmd0aDsgdDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZyA9IHAsIHAgPSBbXTsgKytoIDwgdDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAmJiBnW2hdLnJ1bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IC0xLCB0ID0gcC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZyA9IG51bGwsIF8gPSAhMSwgaShlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmZ1biA9IGUsIHRoaXMuYXJyYXkgPSB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjLCBkLCBmID0gZS5leHBvcnRzID0ge307CiAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBzZXRUaW1lb3V0ID8gc2V0VGltZW91dCA6IG47CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjID0gbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGNsZWFyVGltZW91dCA/IGNsZWFyVGltZW91dCA6IG87CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBkID0gbzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB2YXIgZywgcCA9IFtdLCBfID0gITEsIGggPSAtMTsKICAgICAgICAgICAgICAgIGYubmV4dFRpY2sgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAxOyBuIDwgYXJndW1lbnRzLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuIC0gMV0gPSBhcmd1bWVudHNbbl07CiAgICAgICAgICAgICAgICAgICAgcC5wdXNoKG5ldyBsKGUsIHQpKSwgMSAhPT0gcC5sZW5ndGggfHwgXyB8fCByKHMpOwogICAgICAgICAgICAgICAgfSwgbC5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpOwogICAgICAgICAgICAgICAgfSwgZi50aXRsZSA9ICdicm93c2VyJywgZi5icm93c2VyID0gITAsIGYuZW52ID0ge30sIGYuYXJndiA9IFtdLCBmLnZlcnNpb24gPSAnJywgZi52ZXJzaW9ucyA9IHt9LCBmLm9uID0gdSwgZi5hZGRMaXN0ZW5lciA9IHUsIGYub25jZSA9IHUsIGYub2ZmID0gdSwgZi5yZW1vdmVMaXN0ZW5lciA9IHUsIGYucmVtb3ZlQWxsTGlzdGVuZXJzID0gdSwgZi5lbWl0ID0gdSwgZi5wcmVwZW5kTGlzdGVuZXIgPSB1LCBmLnByZXBlbmRPbmNlTGlzdGVuZXIgPSB1LCBmLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgfSwgZi5iaW5kaW5nID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgICAgICAgICAgICB9LCBmLmN3ZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy8nOwogICAgICAgICAgICAgICAgfSwgZi5jaGRpciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTsKICAgICAgICAgICAgICAgIH0sIGYudW1hc2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9ICh0Lk9UX0JBTk5FUl9JRCA9ICdvbmV0cnVzdC1iYW5uZXItc2RrJywgdC5PVF9MRUFWRUJFSElORF9JRCA9ICdvdC1zZGstYnRuJywgdC5PVF9BTEVSVF9CT1hfQ0xPU0VEX0NPT0tJRSA9ICdPcHRhbm9uQWxlcnRCb3hDbG9zZWQnLCB0Lk9UX0NPTlNFTlRfQ09PS0lFID0gJ09wdGFub25Db25zZW50JywgdC5PVF9QRVJGT1JNQU5DRV9DTEFTU19SRUdFWCA9IC8yLywgdC5PVF9GVU5DVElPTkFMX0NMQVNTX1JFR0VYID0gLzMvLCB0Lk9UX1RBUkdFVElOR19DTEFTU19SRUdFWCA9IC80LywgdC5PVF9TT0NJQUxfQ0xBU1NfUkVHRVggPSAvNS8sIHQuRkxBR19QRVJTT05BTElaRV9BRFMgPSAnb3B0YW5vblBlcnNvbmFsaXplQWRzJywgdC5GTEFHX0RJU0FCTEVfUEVSU09OQUxJWkVEX0FEUyA9ICdvcHRhbm9uRGlzYWJsZVBlcnNvbmFsaXplZEFkcycsIHQuRkxBR19TSE9XX0xPR1MgPSAnb3B0YW5vbkRpc3BsYXlMb2dzJywgdC5GTEFHX0VVX1VTRVIgPSAnb3B0YW5vbkVVJywgdC5GTEFHX0RJU0FCTEVfVEFSR0VUSU5HID0gJ21hcmtldGluZycsIHQuRkxBR19ESVNBQkxFX1BFUkZPUk1BTkNFID0gJ3BlcmZvcm1hbmNlJywgdC5GTEFHX0RJU0FCTEVfU09DSUFMID0gJ3NvY2lhbCcsIHQuRkxBR19ESVNBQkxFX0ZVTkNUSU9OQUwgPSAnZnVuY3Rpb25hbCcsIHQuRkxBR19ESVNQTEFZX0xFQVZFQkVISU5EID0gJ2xlYXZlYmVoaW5kJywgdC5DT05GSUdfRElTQUJMRV9FTkFCTEVfU0VSVklDRVNfS0VZID0gJ2VuYWJsZVNlcnZpY2VzJywgdC5DT05GSUdfU0VUX05QQV9PTl9DT05TRU5UQ0hBTkdFID0gJ3NldE5wYU9uQ29uc2VudENoYW5nZScsIHQuQ09ORklHX0VVX01BWF9BVFRFTVBUUyA9ICdldU1heEF0dGVtcHRzJywgdC5DT05GSUdfQ09VTlRSWV9DT0RFX01BWF9BVFRFTVBUUyA9ICdjb3VudHJ5Q29kZU1heEF0dGVtcHRzJywgdC5DT05GSUdfT1RfVElNRU9VVCA9ICdvbmVUcnVzdFRpbWVvdXQnLCB0LkNPTlNFTlRfTU9ERUxfTk9USUNFX09OTFlfTkFNRSA9ICdub3RpY2Ugb25seScpOwogICAgICAgICAgICAgICAgdC5DT05TRU5UX01PREVMX0RFRkFVTFQgPSBvLCB0LkRFRkFVTFRfRVVfTUFYX0FUVEVNUFRTID0gMjUwLCB0LkRFRkFVTFRfQ09VTlRSWV9DT0RFX01BWF9BVFRFTVBUUyA9IDI1MCwgdC5ERUZBVUxUX09UX1RJTUVPVVQgPSAyNTAwLCB0Lk9UX1JFQURZX0VWRU5UID0gJ2Nicy5vdHJlYWR5JywgdC5PVF9TVEFURV9HTE9CQUwgPSAnX2Nic290c3RhdGUnLCB0LkNCU09QVF9QQU5JQ19DTEFTUyA9ICdjYnNvcHRhbm9uLXBhbmljJywgdC5WRVJTSU9OID0gewogICAgICAgICAgICAgICAgICAgIG1ham9yOiAxLAogICAgICAgICAgICAgICAgICAgIG1pbm9yOiAxLAogICAgICAgICAgICAgICAgICAgIG1haW50ZW5hbmNlOiA0CiAgICAgICAgICAgICAgICB9LCB0LkNQU19OT1RJQ0VfRU5EUE9JTlQgPSAnLy9wcm9kdWN0aW9uLWNtcC5pc2dwcml2YWN5LmNic2kuY29tL2Nwcy9zaGFtYW5Ob3RpZmllci5qcycsIHQuVENGX0NPT0tJRV9OQU1FID0gJ2V1cHViY29uc2VudC12Mic7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdCA9IGUsIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gYy5nbG9iYWxzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmRvY3VtZW50ID8gZS5kb2N1bWVudC5jb29raWUuc3BsaXQoJzsnKSA6IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldEFsbENvb2tpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdC50cmltKCkuc3BsaXQoL1w9KC4rKS8pOwogICAgICAgICAgICAgICAgICAgICAgICBvWzBdID09PSBlICYmIChuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvWzFdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4udmFsdWUgPSBuLnZhbHVlLnNwbGl0KCcgJylbMF0pOwogICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRDb29raWUoZC5PVF9BTEVSVF9CT1hfQ0xPU0VEX0NPT0tJRSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldENvb2tpZShkLk9UX0NPTlNFTlRfQ09PS0lFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGMuZ2xvYmFscy5kb2N1bWVudC5jb29raWUgPSBlICsgJz0nICsgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmdldEFsbENvb2tpZXMgPSByLCB0LmdldENvb2tpZSA9IGksIHQuZ2V0T3B0QW5vbkRpc3BsYXlDb29raWUgPSBhLCB0LmdldENvbnNlbnRDb29raWUgPSBzLCB0LnNldENvb2tpZSA9IGw7CiAgICAgICAgICAgICAgICB2YXIgdSA9IG4oNSksIGMgPSBvKHUpLCBkID0gbigxMCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0ID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGwsIG8gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV0sIHIgPSBudWxsICE9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvIHx8IG51bGwgPT0gdC5ub25QZXJzb25hbGl6ZWRBZHMgPyB1LnRhcmdldGluZ0FsbG93ZWQoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/ICh0Lm5vblBlcnNvbmFsaXplZEFkcyA9IGMsIHIgJiYgbihjKSkgOiB0Lm5vblBlcnNvbmFsaXplZEFkcyA9IGQsIHIgJiYgbih0Lm5vblBlcnNvbmFsaXplZEFkcyksIHQubm9uUGVyc29uYWxpemVkQWRzOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ub25QZXJzb25hbGl6ZWRBZHMgPSBkLCByICYmIG4oZCksIGQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogKHIgJiYgbih0Lm5vblBlcnNvbmFsaXplZEFkcyksIG5ldyBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSh0Lm5vblBlcnNvbmFsaXplZEFkcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0TnBhRmxhZygpLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocy5nbG9iYWxzLmFkc2J5Z29vZ2xlID0gcy5nbG9iYWxzLmFkc2J5Z29vZ2xlIHx8IFtdKS5yZXF1ZXN0Tm9uUGVyc29uYWxpemVkQWRzID0gZSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0Lk5PTl9QRVJTT05BTElaRURfQURTID0gdC5QRVJTT05BTElaRURfQURTID0gdC5ub25QZXJzb25hbGl6ZWRBZHMgPSB0LnNlcnZpY2VzRW5hYmxlZCA9IHZvaWQgMCwgdC5nZXROcGFGbGFnID0gciwgdC5pbml0QWRzZW5zZVBlcnNvbmFsaXphdGlvbiA9IGk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuKDUpLCBzID0gbyhhKSwgbCA9IG4oMTMpLCB1ID0gbyhsKSwgYyA9IChuKDEwKSwgdC5zZXJ2aWNlc0VuYWJsZWQgPSAhMSwgdC5ub25QZXJzb25hbGl6ZWRBZHMgPSBudWxsLCB0LlBFUlNPTkFMSVpFRF9BRFMgPSAwKSwgZCA9IHQuTk9OX1BFUlNPTkFMSVpFRF9BRFMgPSAxOwogICAgICAgICAgICAgICAgfS5jYWxsKHQsIG4oNikpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQgPSBlLCB0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCBuID0gQXJyYXkoZS5sZW5ndGgpOyB0IDwgZS5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3RdID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5kb21haW5EYXRhVmFsaWQoKSB8fCAoMCwgdy5wYW5pY2tlZCkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEMuZ2V0T25lVHJ1c3RUaW1lb3V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAwLCBpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLmdsb2JhbHMuT3B0YW5vbkFjdGl2ZUdyb3VwcyB8fCAociArPSBTKSwgbnVsbCAhPSBBLmdsb2JhbHMuT3B0YW5vbkFjdGl2ZUdyb3VwcyAmJiB2b2lkIDAgIT0gQS5nbG9iYWxzLk9wdGFub25BY3RpdmVHcm91cHMgJiYgbnVsbCAhPSBBLmdsb2JhbHMuT3B0YW5vbiAmJiB2b2lkIDAgIT0gQS5nbG9iYWxzLk9wdGFub24gJiYgKHQuZG9tYWluRGF0YSA9IEEuZ2xvYmFscy5PcHRhbm9uLkdldERvbWFpbkRhdGEoKSwgZSghMCksIGNsZWFySW50ZXJ2YWwoaSkpLCByID49IG4gJiYgKG8oJ0ZhaWxlZCB0byBsb2FkIE9uZVRydXN0IGRvbWFpbiBkYXRhJyksIEEud3JpdGVsb2coJ0ZhaWxlZCB0byBPbmVUcnVzdCBkb21haW4gZGF0YScpLCBjbGVhckludGVydmFsKGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gQy5nZXRPbmVUcnVzdFRpbWVvdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKHQuY29uc2VudENvb2tpZUxvYWRlZCA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShBLmdldENvbnNlbnRlZENhdGVnb3JpZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiAoMCwgdy5wYW5pY2tlZCkoKSA/IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdChMKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDAsIGkgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghVC5nZXRDb25zZW50Q29va2llKCkgfHwgVC5nZXRDb25zZW50Q29va2llKCkgJiYgIUEuZ2V0Q29uc2VudENvb2tpZURhdGEoKVtBLkNPTlNFTlRfR1JPVVBfS0VZXSkgJiYgKHIgKz0gUyksIFQuZ2V0Q29uc2VudENvb2tpZSgpICYmIEEuZ2V0Q29uc2VudENvb2tpZURhdGEoKVtBLkNPTlNFTlRfR1JPVVBfS0VZXSAmJiAodC5jb25zZW50Q29va2llTG9hZGVkID0gITAsIGUoQS5nZXRDb25zZW50ZWRDYXRlZ29yaWVzKCkpLCBjbGVhckludGVydmFsKGkpKSwgciA+PSBuICYmIChvKCdGYWlsZWQgdG8gbG9hZCBjb29raWUgZGF0YScpLCBBLndyaXRlbG9nKCdGYWlsZWQgdG8gbG9hZCBjb29raWUgZGF0YScpLCBjbGVhckludGVydmFsKGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBTKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBOLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEEud3JpdGVsb2coJ0NvbnNlbnQgQ2hhbmdlZCcpLCBOLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCF0LmRvbWFpbkRhdGEgfHwgIXQuZG9tYWluRGF0YS5Db25zZW50TW9kZWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kb21haW5EYXRhVmFsaWQoKSA/IHQuZG9tYWluRGF0YS5Db25zZW50TW9kZWwuTmFtZSB8fCBtLkNPTlNFTlRfTU9ERUxfREVGQVVMVCA6IG0uQ09OU0VOVF9NT0RFTF9ERUZBVUxUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRDb25zZW50TW9kZWwoKSA9PSBtLkNPTlNFTlRfTU9ERUxfTk9USUNFX09OTFlfTkFNRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihuLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiBudWxsLCBpID0gbnVsbCAhPSByLCBhID0gQS5nZXRDb25zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByKGFbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS53cml0ZWxvZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZShhW29dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmF3YWl0Q29va2llU2V0dGluZ3MoKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkX2EyOTA0YzY2YTIxMjY0MDIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyksICRfX19vbGRfMjRhNzBiOTJhYjNhNWJkMCA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF9hMjkwNGM2NmEyMTI2NDAyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX21vY2tfMGMzNWIxZTFjNjI4MDU4NC5sb2NhbFN0b3JhZ2UpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yNGE3MGI5MmFiM2E1YmQwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnWE1MSHR0cFJlcXVlc3QnLCAkX19fbW9ja19lMDg4ZGRkMTY2OTYyMmJlLlhNTEh0dHBSZXF1ZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZS5tYXRjaChuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcighMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLndyaXRlbG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcighMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS53cml0ZWxvZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfYTI5MDRjNjZhMjEyNjQwMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfYTI5MDRjNjZhMjEyNjQwMikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzI0YTcwYjkyYWIzYTViZDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdYTUxIdHRwUmVxdWVzdCcsICRfX19vbGRfMjRhNzBiOTJhYjNhNWJkMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQS53cml0ZWxvZygnRXJyb3IgKCcgKyBuICsgJyk6IGZhaWxlZCB0byBnZXQgT25lVHJ1c3Qgc3RhdGUsIGRlZmF1bHRpbmcgdG8gb3B0LWluJyksIGkgJiYgcighMCksICEwOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldENvbnNlbnRQcmVmZXJlbmNlcyhtLk9UX1RBUkdFVElOR19DTEFTU19SRUdFWCwgbS5GTEFHX0RJU0FCTEVfVEFSR0VUSU5HLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldENvbnNlbnRQcmVmZXJlbmNlcyhtLk9UX1BFUkZPUk1BTkNFX0NMQVNTX1JFR0VYLCBtLkZMQUdfRElTQUJMRV9QRVJGT1JNQU5DRSwgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRDb25zZW50UHJlZmVyZW5jZXMobS5PVF9GVU5DVElPTkFMX0NMQVNTX1JFR0VYLCBtLkZMQUdfRElTQUJMRV9GVU5DVElPTkFMLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmdldENvbnNlbnRQcmVmZXJlbmNlcyhtLk9UX1NPQ0lBTF9DTEFTU19SRUdFWCwgbS5GTEFHX0RJU0FCTEVfU09DSUFMLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGwsIG8gPSBudWxsICE9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFsbChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRhcmdldGluZ0FsbG93ZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGVyZm9ybWFuY2VBbGxvd2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmZ1bmN0aW9uYWxBbGxvd2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNvY2lhbEFsbG93ZWQoKQogICAgICAgICAgICAgICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFwcGx5KHZvaWQgMCwgcihlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLndyaXRlbG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQS53cml0ZWxvZygnRXJyb3IgKGdldFN0YXRlKTogZmFpbGVkIHRvIGdldCBPbmVUcnVzdCBzdGF0ZSwgZGVmYXVsdGluZyB0byBvcHQtaW4nKSwgbyAmJiBuKCEwLCAhMCwgITAsICEwKSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGwsIG8gPSBudWxsICE9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmF3YWl0T25lVHJ1c3RTZXR0aW5ncygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQubm90aWNlT25seSgpIHx8IEEuZ2V0Q29uc2VudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS53cml0ZWxvZygnYXdhaXRJbml0aWFsQ29uc2VudCAtIG5vdGljZSBvbmx5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBBLmdldENvbnNlbnQoKSA/ICdjb25zZW50IG92ZXJyaWRlJyA6ICdub3RpY2Ugb25seSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLndyaXRlbG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS53cml0ZWxvZygnYXdhaXRJbml0aWFsQ29uc2VudCAtIHdhaXRpbmcgZm9yIGJhbm5lciBpbnRlcmFjdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVC5nZXRPcHRBbm9uRGlzcGxheUNvb2tpZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQS53cml0ZWxvZygnYXdhaXRJbml0aWFsQ29uc2VudCAtIGJhbm5lciBjbG9zZWQnKSwgY2xlYXJJbnRlcnZhbCh0KSwgbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKCdiYW5uZXIgaW50ZXJhY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEud3JpdGVsb2coZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoJ2Jhbm5lciBpbnRlcmFjdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgSSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmNvbnNlbnRDb29raWVMb2FkZWQgPSB0LmRvbWFpbkRhdGEgPSB0LmNvbnNlbnRIYW5kbGVycyA9IHZvaWQgMCwgdC5hd2FpdE9uZVRydXN0U2V0dGluZ3MgPSBpLCB0LmF3YWl0Q29va2llU2V0dGluZ3MgPSBhLCB0LmFkZE9uQ29uc2VudENoYW5nZWRIYW5kbGVyID0gcywgdC5fb25Db25zZW50Q2hhbmdlZCA9IGwsIHQuZG9tYWluRGF0YVZhbGlkID0gdSwgdC5nZXRDb25zZW50TW9kZWwgPSBjLCB0Lm5vdGljZU9ubHkgPSBkLCB0LmdldENvbnNlbnRQcmVmZXJlbmNlcyA9IGYsIHQudGFyZ2V0aW5nQWxsb3dlZCA9IGcsIHQucGVyZm9ybWFuY2VBbGxvd2VkID0gcCwgdC5mdW5jdGlvbmFsQWxsb3dlZCA9IF8sIHQuc29jaWFsQWxsb3dlZCA9IGgsIHQuZ2V0U3RhdGUgPSB2LCB0LmF3YWl0SW5pdGlhbENvbnNlbnQgPSBPOwogICAgICAgICAgICAgICAgICAgIHZhciBiID0gbig1KSwgQSA9IG8oYiksIEUgPSBuKDExKSwgVCA9IG8oRSksIHkgPSBuKDE0KSwgQyA9IG8oeSksIHcgPSAobigxNSksIG4oMTYpKSwgbSA9IG4oMTApLCBTID0gMTAsIEwgPSAnMSwyLDMsNCw1JywgTiA9IHQuY29uc2VudEhhbmRsZXJzID0gW10sIEkgPSAodC5kb21haW5EYXRhID0gbnVsbCwgdC5jb25zZW50Q29va2llTG9hZGVkID0gITEsIDE1MCk7CiAgICAgICAgICAgICAgICB9LmNhbGwodCwgbig2KSkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0LnNldHRpbmdzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIHQuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCB0LnNldHRpbmdzLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFPYmplY3Qua2V5cyh0LnNldHRpbmdzKS5pbmNsdWRlcyhjLkNPTkZJR19ESVNBQkxFX0VOQUJMRV9TRVJWSUNFU19LRVkpIHx8IHQuc2V0dGluZ3NbYy5DT05GSUdfRElTQUJMRV9FTkFCTEVfU0VSVklDRVNfS0VZXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhT2JqZWN0LmtleXModC5zZXR0aW5ncykuaW5jbHVkZXMoYy5DT05GSUdfU0VUX05QQV9PTl9DT05TRU5UQ0hBTkdFKSAmJiB0LnNldHRpbmdzW2MuQ09ORklHX1NFVF9OUEFfT05fQ09OU0VOVENIQU5HRV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0LnNldHRpbmdzKS5pbmNsdWRlcyhjLkNPTkZJR19FVV9NQVhfQVRURU1QVFMpID8gdC5zZXR0aW5nc1tjLkNPTkZJR19FVV9NQVhfQVRURU1QVFNdIDogYy5ERUZBVUxUX0VVX01BWF9BVFRFTVBUUzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQuc2V0dGluZ3MpLmluY2x1ZGVzKGMuQ09ORklHX0NPVU5UUllfQ09ERV9NQVhfQVRURU1QVFMpID8gdC5zZXR0aW5nc1tjLkNPTkZJR19DT1VOVFJZX0NPREVfTUFYX0FUVEVNUFRTXSA6IGMuREVGQVVMVF9DT1VOVFJZX0NPREVfTUFYX0FUVEVNUFRTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModC5zZXR0aW5ncykuaW5jbHVkZXMoYy5DT05GSUdfT1RfVElNRU9VVCkgPyB0LnNldHRpbmdzW2MuQ09ORklHX09UX1RJTUVPVVRdIDogYy5ERUZBVUxUX09UX1RJTUVPVVQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5zZXR0aW5ncyA9IHZvaWQgMCwgdC5faW5pdCA9IG8sIHQucHVzaCA9IHIsIHQuZW5hYmxlU2VydmljZXMgPSBpLCB0LnNldE5wYU9uQ29uc2VudENoYW5nZSA9IGEsIHQuZ2V0RVVNYXhBdHRlbXB0cyA9IHMsIHQuZ2V0Q291bnRyeUNvZGVNYXhBdHRlbXB0cyA9IGwsIHQuZ2V0T25lVHJ1c3RUaW1lb3V0ID0gdTsKICAgICAgICAgICAgICAgIHZhciBjID0gbigxMCk7CiAgICAgICAgICAgICAgICB0LnNldHRpbmdzID0ge307CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0ID0gZSwgdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmdsb2JhbHMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZC5PVF9CQU5ORVJfSUQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gZ2V0dGluZyBsZWF2ZWJlaGluZCBmcm9tIGRvbSB3aGVuIHJlYWR5JyksIGcucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmdsb2JhbHMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZC5PVF9MRUFWRUJFSElORF9JRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy53cml0ZWxvZygnTGVhdmVCZWhpbmQgLSBnZXRMZWF2ZWJlaGluZCBkb20ucmVhZHkgdGltZW91dDogJyArIGUpLCBnLmdsb2JhbHMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZC5PVF9MRUFWRUJFSElORF9JRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZ2V0TGVhdmViZWhpbmQoKS50aGVuKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZy5nZXRDb25zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA/IChnLndyaXRlbG9nKCdMZWF2ZUJlaGluZCAtIGNvbnNlbnQgZmxhZyBvdmVycmlkZTogJyArIGUpLCB0LnN0eWxlLmRpc3BsYXkgPSBuW2QuRkxBR19ESVNQTEFZX0xFQVZFQkVISU5EXSA/ICdibG9jaycgOiAnbm9uZScpIDogKGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gc2V0dGluZyBkaXNwbGF5OiAnICsgZSksIHQuc3R5bGUuZGlzcGxheSA9IGUpLCB0LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJywgdC5zdHlsZS5ib3R0b20gPSAnMTBweCcsIHQuc3R5bGUubGVmdCA9ICcxMHB4JywgdC5zdHlsZVsnei1pbmRleCddID0gJzMwMDAwMDEnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMCwgbyA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gPj0gTyA/IChjbGVhckludGVydmFsKG8pLCBnLndyaXRlbG9nKCdMZWF2ZUJlaGluZCAtIGJhbm5lciB0aW1lZCBvdXQnKSwgZSh0LnNldExlYXZlYmVoaW5kRGlzcGxheSgnYmxvY2snKSkpIDogKG4gKz0gYiwgdC5nZXRCYW5uZXIoKS50aGVuKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiAnYmxvY2snID09IGcuZ2xvYmFscy5nZXRDb21wdXRlZFN0eWxlKG4pLmRpc3BsYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gYmFubmVyIHByZXNlbnQsIGhpZGluZyBsZWF2ZWJlaGluZCcpLCB0LmJhbm5lckNsb3NlTGlzdGVuZXIoKSwgY2xlYXJJbnRlcnZhbChvKSwgZSh0LnNldExlYXZlYmVoaW5kRGlzcGxheSgnbm9uZScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGIpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IG51bGwsIG8gPSBudWxsICE9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLm5vdGljZU9ubHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gbm90aWNlIG9ubHkgYmFubmVyIGNsb3NlZCcpLCBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4odC5zZXRMZWF2ZWJlaGluZERpc3BsYXkoJ25vbmUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLndyaXRlbG9nKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKHQuc2V0TGVhdmViZWhpbmREaXNwbGF5KCdub25lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBlKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5nZXRPcHRBbm9uRGlzcGxheUNvb2tpZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLndyaXRlbG9nKCdMZWF2ZUJlaGluZCAtIGJhbm5lciBjbG9zZWQsIGRpc3BsYXlpbmcgbGVhdmViZWhpbmQnKSwgY2xlYXJJbnRlcnZhbChyKSwgbykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbih0LnNldExlYXZlYmVoaW5kRGlzcGxheSgnYmxvY2snKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy53cml0ZWxvZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodC5zZXRMZWF2ZWJlaGluZERpc3BsYXkoJ2Jsb2NrJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIE8gLyBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGcuZ2xvYmFscy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkLk9UX0xFQVZFQkVISU5EX0lEKSwgdCA9IGUgfHwgZy5nbG9iYWxzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXRBdHRyaWJ1dGUoJ2lkJywgJ290LXNkay1idG4nKSwgdC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ290LXNkay1zaG93LXNldHRpbmdzJyksIHQuc3R5bGUuZGlzcGxheSA9ICdub25lJywgdC5pbm5lckhUTUwgPSAnTWFuYWdlIENvb2tpZXMnLCB0Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy53cml0ZWxvZygnTGVhdmVCZWhpbmQgLSBjbGlja2VkJyksIGcuZ2xvYmFscy5PcHRhbm9uICYmIChnLndyaXRlbG9nKCdMZWF2ZUJlaGluZCAtIHRvZ2dlbGluZyBwcmVmZXJlbmNlIGNlbnRlcicpLCBnLmdsb2JhbHMuT3B0YW5vbi5Ub2dnbGVJbmZvRGlzcGxheSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUgfHwgZy5nbG9iYWxzLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbmplY3RMZWF2ZWJlaGluZCgpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBnLmdldENvbnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gKGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gZmxhZyBwcmVzZW50LCBkaXNwbGF5aW5nIGxlYXZlYmVoaW5kJyksIHQuc2V0TGVhdmViZWhpbmREaXNwbGF5KGVbZC5GTEFHX0RJU1BMQVlfTEVBVkVCRUhJTkRdID8gJ2Jsb2NrJyA6ICdub25lJykpIDogXy5hd2FpdE9uZVRydXN0U2V0dGluZ3MoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5ub3RpY2VPbmx5KCkgPyAoZy53cml0ZWxvZygnTGVhdmVCZWhpbmQgLSBub3RpY2Ugb25seSBtb2RlbCwgaGlkZSBsZWF2ZWJlaGluZCcpLCB0LnNldExlYXZlYmVoaW5kRGlzcGxheSgnbm9uZScpKSA6IHZvaWQgKHYuZ2V0T3B0QW5vbkRpc3BsYXlDb29raWUoKSA/IChnLndyaXRlbG9nKCdMZWF2ZUJlaGluZCAtIGRpc3BsYXlpbmcgbGVhdmViZWhpbmQnKSwgdC5zZXRMZWF2ZWJlaGluZERpc3BsYXkoJ2Jsb2NrJykpIDogKGcud3JpdGVsb2coJ0xlYXZlQmVoaW5kIC0gd2FpdGluZyBmb3IgYmFubmVyJyksIHQuaGFuZGxlTGVhdmViZWhpbmQoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNldExlYXZlYmVoaW5kRGlzcGxheSgnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5nZXRCYW5uZXIgPSByLCB0LmdldExlYXZlYmVoaW5kID0gaSwgdC5zZXRMZWF2ZWJlaGluZERpc3BsYXkgPSBhLCB0LmhhbmRsZUxlYXZlYmVoaW5kID0gcywgdC5iYW5uZXJDbG9zZUxpc3RlbmVyID0gbCwgdC5pbmplY3RMZWF2ZWJlaGluZCA9IHUsIHQuX2luaXQgPSBjOwogICAgICAgICAgICAgICAgICAgIHZhciBkID0gbigxMCksIGYgPSBuKDUpLCBnID0gbyhmKSwgcCA9IG4oMTMpLCBfID0gbyhwKSwgaCA9IG4oMTEpLCB2ID0gbyhoKSwgTyA9IDE1MDAsIGIgPSAxMDsKICAgICAgICAgICAgICAgIH0uY2FsbCh0LCBuKDYpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdCA9IGUsIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnN0YXRlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICB0LnN0YXRlID0gITAsIHQubG9hZEFsbFNjcmlwdFRhZ3MoKSwgdC5zZXRBbGVydEJveENvb2tpZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYSgpIHsKICAgICAgICAgICAgICAgICAgICAoMCwgdS5sb2FkRGVmZXJyZWRTY3JpcHRzKSgnb3B0YW5vbi1jYXRlZ29yeS0yJyksICgwLCB1LmxvYWREZWZlcnJlZFNjcmlwdHMpKCdvcHRhbm9uLWNhdGVnb3J5LTMnKSwgKDAsIHUubG9hZERlZmVycmVkU2NyaXB0cykoJ29wdGFub24tY2F0ZWdvcnktNCcpLCAoMCwgdS5sb2FkRGVmZXJyZWRTY3JpcHRzKSgnb3B0YW5vbi1jYXRlZ29yeS01Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKCkgewogICAgICAgICAgICAgICAgICAgIGQuc2V0Q29va2llKGwuT1RfQUxFUlRfQk9YX0NMT1NFRF9DT09LSUUsICcwMDAwLTAwLTAwVDAwOjAwOjAwLjAwMFonKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LnN0YXRlID0gdm9pZCAwLCB0LnBhbmlja2VkID0gciwgdC5faW5pdCA9IGksIHQubG9hZEFsbFNjcmlwdFRhZ3MgPSBhLCB0LnNldEFsZXJ0Qm94Q29va2llID0gczsKICAgICAgICAgICAgICAgIHZhciBsID0gbigxMCksIHUgPSBuKDE3KSwgYyA9IG4oMTEpLCBkID0gbyhjKTsKICAgICAgICAgICAgICAgIHQuc3RhdGUgPSAhMTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0ID0gZSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBfOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmdldFN0YXRlKCkudGhlbihmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHUobywgNCksIGkgPSByWzBdLCBhID0gclsxXSwgcyA9IHJbMl0sIGwgPSByWzNdOwogICAgICAgICAgICAgICAgICAgICAgICBhICYmIChmLndyaXRlbG9nKCdMb2FkaW5nIHBlcmZvcm1hbmNlIGlmcmFtZXMnKSwgdC5sb2FkRGVmZXJyZWRUYXJnZXQoJ29wdGFub24tY2F0ZWdvcnktMicsIGUsIG4pKSwgcyAmJiAoZi53cml0ZWxvZygnTG9hZGluZyBmdW5jdGlvbmFsIGlmcmFtZXMnKSwgdC5sb2FkRGVmZXJyZWRUYXJnZXQoJ29wdGFub24tY2F0ZWdvcnktMycsIGUsIG4pKSwgaSAmJiAoZi53cml0ZWxvZygnTG9hZGluZyB0YXJnZXRpbmcgaWZyYW1lcycpLCB0LmxvYWREZWZlcnJlZFRhcmdldCgnb3B0YW5vbi1jYXRlZ29yeS00JywgZSwgbikpLCBsICYmIChmLndyaXRlbG9nKCdMb2FkaW5nIHNvY2lhbCBpZnJhbWVzJyksIHQubG9hZERlZmVycmVkVGFyZ2V0KCdvcHRhbm9uLWNhdGVnb3J5LTUnLCBlLCBuKSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIG4sIG8pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGYuZ2xvYmFscy5kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpOwogICAgICAgICAgICAgICAgICAgIGYud3JpdGVsb2coJ0ZvdW5kIHRhZyBjb3VudCB3aXRoIGNsYXNzICgnICsgZSArICcpOiAnICsgci5sZW5ndGgpLCByLmxlbmd0aCA+IDAgJiYgdC5sb2FkVGFncyhBcnJheS5mcm9tKHIpLCBuLCBvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnRhZ05hbWUgPT0gdCAmJiAoZi53cml0ZWxvZygnTG9hZGluZyAnICsgdCArICc6ICcgKyBlLmRhdGFzZXRbbl0pLCBudWxsICE9IGUuZGF0YXNldFtuXSAmJiB2b2lkIDAgIT0gZS5kYXRhc2V0W25dICYmIGUuc2V0QXR0cmlidXRlKG4sIGUuZGF0YXNldFtuXSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmLmdsb2JhbHMuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKTsKICAgICAgICAgICAgICAgICAgICBmLndyaXRlbG9nKCdGb3VuZCB0YWcgY291bnQgd2l0aCBjbGFzcyAoJyArIGUgKyAnKTogJyArIG4ubGVuZ3RoKSwgbi5sZW5ndGggPiAwICYmIHQubG9hZFNjcmlwdENoYWluKEFycmF5LmZyb20obikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFtdLCBuID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9bT10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnY29udGludWUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghby5kYXRhc2V0W19dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGVsb2coJ0V4ZWN1dGluZyBzY3JpcHQ6ICcgKyBvLnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGYuZ2xvYmFscy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuc2V0QXR0cmlidXRlKGgsIG8uZGF0YXNldFtoXSB8fCAndGV4dC9qYXZhc2NyaXB0JyksIHIuc2V0QXR0cmlidXRlKE8sICEwKSwgci50ZXh0ID0gby50ZXh0LCBPYmplY3Qua2V5cyhvLmRhdGFzZXQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2V0QXR0cmlidXRlKCdkYXRhLScgKyBlLCBvLmRhdGFzZXRbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pLCBmLmdsb2JhbHMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChyKSwgJ2NvbnRpbnVlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8uZ2V0QXR0cmlidXRlKHYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGVsb2coJ0xvYWRpbmcgc2NyaXB0IGFzeW5jOiAnICsgby5kYXRhc2V0W19dKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBmLmdsb2JhbHMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnNldEF0dHJpYnV0ZShoLCBvLmRhdGFzZXRbaF0gfHwgJ3RleHQvamF2YXNjcmlwdCcpLCBpLnNldEF0dHJpYnV0ZShPLCAhMCksIGkuc2V0QXR0cmlidXRlKHYsICEwKSwgaS5zZXRBdHRyaWJ1dGUoXywgby5kYXRhc2V0W19dKSwgT2JqZWN0LmtleXMoby5kYXRhc2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNldEF0dHJpYnV0ZSgnZGF0YS0nICsgZSwgby5kYXRhc2V0W2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKSwgZi5nbG9iYWxzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSksICdjb250aW51ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZi5nbG9iYWxzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKGgsIG8uZGF0YXNldFtoXSB8fCAndGV4dC9qYXZhc2NyaXB0JyksIGEuc2V0QXR0cmlidXRlKE8sICEwKSwgYS5zZXRBdHRyaWJ1dGUoXywgby5kYXRhc2V0W19dKSwgT2JqZWN0LmtleXMoby5kYXRhc2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc2V0QXR0cmlidXRlKCdkYXRhLScgKyBlLCBvLmRhdGFzZXRbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobyksIHQucHVzaChhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8gPSAwOyBvIDw9IGUubGVuZ3RoIC0gMTsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG4obyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSB2b2lkIDAsIG8gPSB0Lmxlbmd0aCAtIDE7IG8gPj0gMDsgby0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdFtvXTsKICAgICAgICAgICAgICAgICAgICAgICAgMCA9PSBvICYmIChmLndyaXRlbG9nKCdUb3Agb2Ygc2NyaXB0IGRlcGVuZGVuY3kgY2hhaW46ICcgKyBpW19dKSwgZi5nbG9iYWxzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaSkpLCBvICE9IHQubGVuZ3RoIC0gMSAmJiAoaS5vbmxvYWQgPSByKSwgciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUsIG8gPSB0W25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlbG9nKCdDYWxsYmFjayBsb2FkaW5nOiAnICsgb1tfXSksIGYuZ2xvYmFscy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfShvKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5TQ1JJUFRfTE9BREVEX0FUVFJJQlVURSA9IHQuU0NSSVBUX0FTWU5DX0FUVFJJQlVURSA9IHQuU0NSSVBUX1RZUEVfQVRUUklCVVRFID0gdC5UQUdfREFUQV9TUkNfQVRUUiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciB1ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdLCBvID0gITAsIHIgPSAhMSwgaSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIHMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShvID0gKGEgPSBzLm5leHQoKSkuZG9uZSkgJiYgKG4ucHVzaChhLnZhbHVlKSwgIXQgfHwgbi5sZW5ndGggIT09IHQpOyBvID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gITAsIGkgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbyAmJiBzLnJldHVybiAmJiBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUodCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UnKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdC5sb2FkID0gciwgdC5sb2FkRGVmZXJyZWRUYXJnZXQgPSBpLCB0LmxvYWRUYWdzID0gYSwgdC5sb2FkRGVmZXJyZWRTY3JpcHRzID0gcywgdC5sb2FkU2NyaXB0Q2hhaW4gPSBsOwogICAgICAgICAgICAgICAgdmFyIGMgPSBuKDEwKSwgZCA9IChvKGMpLCBuKDUpKSwgZiA9IG8oZCksIGcgPSBuKDEzKSwgcCA9IG8oZyksIF8gPSB0LlRBR19EQVRBX1NSQ19BVFRSID0gJ3NyYycsIGggPSB0LlNDUklQVF9UWVBFX0FUVFJJQlVURSA9ICd0eXBlJywgdiA9IHQuU0NSSVBUX0FTWU5DX0FUVFJJQlVURSA9ICdhc3luYycsIE8gPSB0LlNDUklQVF9MT0FERURfQVRUUklCVVRFID0gJ2RhdGEtY2Jzb3B0YW5vbi1sb2FkZWQnOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQgPSBlLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgcy53cml0ZWxvZygnRXhlY3V0aW5nIGRlZmVycmVkIGNvbW1hbmRzJyksIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzLndyaXRlbG9nKCdleGVjdXRpbmcgY21kICcgKyBlKSwgZShzLmdsb2JhbHMud2luZG93LmNic29wdGFub24pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgcy53cml0ZWxvZygnY21kLnB1c2gnKSwgZShzLmdsb2JhbHMud2luZG93LmNic29wdGFub24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuX2luaXQgPSByLCB0LnB1c2ggPSBpOwogICAgICAgICAgICAgICAgdmFyIGEgPSBuKDUpLCBzID0gbyhhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0ID0gZSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgYy5nbG9iYWxzLmdvb2dsZXRhZyAmJiBjLmdsb2JhbHMuZ29vZ2xldGFnLmNtZCAmJiBwLmdldE5wYUZsYWcobnVsbCwgITApLnRoZW4oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYy5nbG9iYWxzLmdvb2dsZXRhZy5jbWQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLndyaXRlbG9nKCdBZHMgLSBDb25zZW50IENoYW5nZWQgOjogU2V0dGluZyBOUEE6ICcgKyBlKSwgYy5nbG9iYWxzLmdvb2dsZXRhZy5wdWJhZHMoKS5zZXRSZXF1ZXN0Tm9uUGVyc29uYWxpemVkQWRzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgbC5zZXROcGFPbkNvbnNlbnRDaGFuZ2UoKSAmJiAoYy53cml0ZWxvZygnUmVnaXN0ZXJlZCBPbkNvbnNlbnRDaGFuZ2Ugc2V0TnBhQ2FsbGJhY2snKSwgZi5hZGRPbkNvbnNlbnRDaGFuZ2VkSGFuZGxlcih0Ll9ucGFPbkNvbnNlbnRDaGFuZ2VIYW5kbGVyKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgIHQucmVnaXN0ZXJOcGFDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuX25wYU9uQ29uc2VudENoYW5nZUhhbmRsZXIgPSByLCB0LnJlZ2lzdGVyTnBhQ2FsbGJhY2sgPSBpLCB0Ll9pbml0ID0gYTsKICAgICAgICAgICAgICAgIHZhciBzID0gbigxNCksIGwgPSBvKHMpLCB1ID0gbig1KSwgYyA9IG8odSksIGQgPSBuKDEzKSwgZiA9IG8oZCksIGcgPSBuKDEyKSwgcCA9IG8oZyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLl9fZXNNb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIG4pICYmICh0W25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdCA9IGUsIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmF3YWl0T25lVHJ1c3RTZXR0aW5ncygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB1Lm5vdGljZU9ubHkoKSA/IGcuZ2xvYmFsc1tfLk9UX1NUQVRFX0dMT0JBTF0gPSB0Lk5PT1AgOiB0LmRpc3BhdGNoT25CYW5uZXJDbG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZy53cml0ZWxvZygnT25lVHJ1c3QgRXJyb3JlZDogJyArIF8uT1RfU1RBVEVfR0xPQkFMICsgJyA9ICcgKyBnLmdsb2JhbHNbXy5PVF9TVEFURV9HTE9CQUxdKSwgZy5nbG9iYWxzW18uT1RfU1RBVEVfR0xPQkFMXSA9IHQuUkVBRFksIHQuZGlzcGF0Y2hUZWFsaXVtRXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgZy53cml0ZWxvZygnRGlzcGF0Y2hpbmcgZXZlbnQ6ICcgKyBfLk9UX1JFQURZX0VWRU5UKSwgZy5nbG9iYWxzLmRpc3BhdGNoRXZlbnQobmV3IGcuZ2xvYmFscy5FdmVudChfLk9UX1JFQURZX0VWRU5UKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmJhbm5lckNsb3NlTGlzdGVuZXIoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5kaXNwYXRjaFRlYWxpdW1FdmVudCgpLCB0LnNldFN0YXR1cyh0LlJFQURZKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSkgewogICAgICAgICAgICAgICAgICAgIGcuZ2xvYmFsc1tfLk9UX1NUQVRFX0dMT0JBTF0gPSBlLCBnLndyaXRlbG9nKF8uT1RfU1RBVEVfR0xPQkFMICsgJyA9ICcgKyBnLmdsb2JhbHNbXy5PVF9TVEFURV9HTE9CQUxdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LlJFQURZID0gdC5OT09QID0gdC5QRU5ESU5HID0gdm9pZCAwLCB0LmluaXQgPSByLCB0LmRpc3BhdGNoVGVhbGl1bUV2ZW50ID0gaSwgdC5kaXNwYXRjaE9uQmFubmVyQ2xvc2UgPSBhLCB0LnNldFN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICB2YXIgbCA9IG4oMTMpLCB1ID0gbyhsKSwgYyA9IG4oMTUpLCBkID0gbyhjKSwgZiA9IG4oNSksIGcgPSBvKGYpLCBwID0gbigxMCksIF8gPSBvKHApOwogICAgICAgICAgICAgICAgdC5QRU5ESU5HID0gJ1BlbmRpbmcnLCB0Lk5PT1AgPSAnTk9PUCcsIHQuUkVBRFkgPSAnUmVhZHknOwogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5fX2VzTW9kdWxlKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCBuKSAmJiAodFtuXSA9IGVbbl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmRlZmF1bHQgPSBlLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYXdhaXRPbmVUcnVzdFNldHRpbmdzKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGwuZ2xvYmFscy5PbmVUcnVzdC5nZXRWZW5kb3JDb25zZW50c1JlcXVlc3RWMihlKTsKICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUobnVsbCwgITEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZ2V0Q29uc2VudERhdGEgPSByOwogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDEzKSwgYSA9IG8oaSksIHMgPSBuKDUpLCBsID0gbyhzKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUuX19lc01vZHVsZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgKHRbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5kZWZhdWx0ID0gZSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1LndyaXRlbG9nKCdJZnJhbWVzIC0gcmVhZHknKSwgdC5pZnJhbWVzTG9hZGVkID8gdm9pZCBlKHUuZ2xvYmFscy53aW5kb3cuY2Jzb3B0YW5vbikgOiBwLmF3YWl0T25lVHJ1c3RTZXR0aW5ncygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LmlmcmFtZXNMb2FkZWQgPSAhMCwgZSh1Lmdsb2JhbHMud2luZG93LmNic29wdGFub24pOwogICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5pZnJhbWVzTG9hZGVkID0gITAsIGUodS5nbG9iYWxzLndpbmRvdy5jYnNvcHRhbm9uKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB1LndyaXRlbG9nKCdGb3JtcyAtIHJlYWR5JyksIHQuZm9ybXNMb2FkZWQgPyB2b2lkIGUodS5nbG9iYWxzLndpbmRvdy5jYnNvcHRhbm9uKSA6IHAuYXdhaXRPbmVUcnVzdFNldHRpbmdzKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuZm9ybXNMb2FkZWQgPSAhMCwgZSh1Lmdsb2JhbHMud2luZG93LmNic29wdGFub24pOwogICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5mb3Jtc0xvYWRlZCA9ICEwLCBlKHUuZ2xvYmFscy53aW5kb3cuY2Jzb3B0YW5vbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS53cml0ZWxvZygnU2NyaXB0cyAtIHJlYWR5JyksIHQuc2NyaXB0c0xvYWRlZCA/IHZvaWQgZSh1Lmdsb2JhbHMud2luZG93LmNic29wdGFub24pIDogcC5hd2FpdE9uZVRydXN0U2V0dGluZ3MoKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zY3JpcHRzTG9hZGVkID0gITAsIGUodS5nbG9iYWxzLndpbmRvdy5jYnNvcHRhbm9uKTsKICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuc2NyaXB0c0xvYWRlZCA9ICEwLCBlKHUuZ2xvYmFscy53aW5kb3cuY2Jzb3B0YW5vbik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS53cml0ZWxvZygnQWRzIC0gcmVhZHknKSwgdC5hZHNMb2FkZWQgPyAodS53cml0ZWxvZygnQWRzIC0gTlBBIEFscmVhZHkgU2V0ICcgKyBmLm5vblBlcnNvbmFsaXplZEFkcyksIHZvaWQgZSh1Lmdsb2JhbHMud2luZG93LmNic29wdGFub24sIHsgbnBhRmxhZzogZi5ub25QZXJzb25hbGl6ZWRBZHMgfSkpIDogZi5nZXROcGFGbGFnKCkudGhlbihmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICB1Lmdsb2JhbHMuZ29vZ2xldGFnICYmIHUuZ2xvYmFscy5nb29nbGV0YWcuY21kID8gKHUud3JpdGVsb2coJ0FkcyAtIEdvb2dsZSB0YWcgaXMgcHJlc2VudCcpLCB0LmFkc0xvYWRlZCA9ICEwLCB1Lmdsb2JhbHMuZ29vZ2xldGFnLmNtZC5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUud3JpdGVsb2coJ0FkcyAtIFNldHRpbmcgTlBBOiAnICsgbiksIHUuZ2xvYmFscy5nb29nbGV0YWcucHViYWRzKCkuc2V0UmVxdWVzdE5vblBlcnNvbmFsaXplZEFkcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGguZW5hYmxlU2VydmljZXMoKSAmJiB1Lmdsb2JhbHMuZ29vZ2xldGFnLmNtZC5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUud3JpdGVsb2coJ0FkcyAtIEVuYWJsaW5nIFNlcnZpY2VzOiAnICsgbiksIHUuZ2xvYmFscy5nb29nbGV0YWcuZW5hYmxlU2VydmljZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHUuZ2xvYmFscy5nb29nbGV0YWcuY21kLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdS53cml0ZWxvZygnQWRzIC0gUnVubmluZyBjYWxsYmFjazogJyArIG4pLCBlKHUuZ2xvYmFscy53aW5kb3cuY2Jzb3B0YW5vbiwgeyBucGFGbGFnOiBuIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiAodS53cml0ZWxvZygnV0FSTklORzogZ29vZ2xldGFnIGlzIG5vdCBwcmVzZW50LCBmaXJpbmcgb2ZmIHJlcXVlc3QuJyksIGUodS5nbG9iYWxzLndpbmRvdy5jYnNvcHRhbm9uLCB7IG5wYUZsYWc6IG4gfSkpOwogICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHUud3JpdGVsb2coZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5hZHNMb2FkZWQgPSB0LnNjcmlwdHNMb2FkZWQgPSB0LmZvcm1zTG9hZGVkID0gdC5pZnJhbWVzTG9hZGVkID0gdm9pZCAwLCB0Lm9uSWZyYW1lc1JlYWR5ID0gciwgdC5vbkZvcm1zUmVhZHkgPSBpLCB0Lm9uU2NyaXB0c1JlYWR5ID0gYSwgdC5vbkFkc1JlYWR5ID0gczsKICAgICAgICAgICAgICAgIHZhciBsID0gbig1KSwgdSA9IG8obCksIGMgPSBuKDE3KSwgZCA9IChvKGMpLCBuKDEyKSksIGYgPSBvKGQpLCBnID0gbigxMyksIHAgPSBvKGcpLCBfID0gbigxNCksIGggPSBvKF8pOwogICAgICAgICAgICAgICAgdC5pZnJhbWVzTG9hZGVkID0gITEsIHQuZm9ybXNMb2FkZWQgPSAhMSwgdC5zY3JpcHRzTG9hZGVkID0gITEsIHQuYWRzTG9hZGVkID0gITE7CiAgICAgICAgICAgIH0KICAgICAgICBdKTsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat-prebid","aliases":["sugarcoat-prebid"],"kind":{"mime":"application/javascript"},"content":"ewogICAgY29uc3QgJF9fX21vY2tfMTZjNTMzOTVhODIyZGI0OCA9IHt9OwogICAgKGV4cG9ydHMgPT4gewogICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICBsZXQgaXNTZWFsZWQgPSBmYWxzZTsKICAgICAgICBjbGFzcyBTdG9yYWdlIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTZWFsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbGxlZ2FsIGNvbnN0cnVjdG9yJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKS5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5KGluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcyk7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ga2V5c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2V0SXRlbShrZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcywga2V5KSA/IHRoaXNba2V5XSA6IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0SXRlbShrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBTdHJpbmcodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW92ZUl0ZW0oa2V5KSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpc1trZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXhwb3J0cy5TdG9yYWdlID0gewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBTdG9yYWdlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH07CiAgICAgICAgY29uc3QgbG9jYWxTdG9yYWdlID0gbmV3IFN0b3JhZ2UoKTsKICAgICAgICBleHBvcnRzLmxvY2FsU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBjb25zdCBzZXNzaW9uU3RvcmFnZSA9IG5ldyBTdG9yYWdlKCk7CiAgICAgICAgZXhwb3J0cy5zZXNzaW9uU3RvcmFnZSA9IHsKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlzU2VhbGVkID0gdHJ1ZTsKICAgIH0pKCRfX19tb2NrXzE2YzUzMzk1YTgyMmRiNDgpOwogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAhZnVuY3Rpb24gKHUpIHsKICAgICAgICAgICAgdmFyIHMgPSB3aW5kb3cucGJqc0NodW5rOwogICAgICAgICAgICB3aW5kb3cucGJqc0NodW5rID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIGksIG8sIGEgPSAwLCBjID0gW107IGEgPCBlLmxlbmd0aDsgYSsrKQogICAgICAgICAgICAgICAgICAgIGkgPSBlW2FdLCBkW2ldICYmIGMucHVzaChkW2ldWzBdKSwgZFtpXSA9IDA7CiAgICAgICAgICAgICAgICBmb3IgKHIgaW4gdCkKICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKHVbcl0gPSB0W3JdKTsKICAgICAgICAgICAgICAgIGZvciAocyAmJiBzKGUsIHQsIG4pOyBjLmxlbmd0aDspCiAgICAgICAgICAgICAgICAgICAgYy5zaGlmdCgpKCk7CiAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgbi5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGYoZi5zID0gblthXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG4gPSB7fSwgZCA9IHsgNDA3OiAwIH07CiAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgaWYgKG5bZV0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5bZV0uZXhwb3J0czsKICAgICAgICAgICAgICAgIHZhciB0ID0gbltlXSA9IHsKICAgICAgICAgICAgICAgICAgICBpOiBlLAogICAgICAgICAgICAgICAgICAgIGw6ICExLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IHt9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHVbZV0uY2FsbCh0LmV4cG9ydHMsIHQsIHQuZXhwb3J0cywgZiksIHQubCA9ICEwLCB0LmV4cG9ydHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZi5tID0gdSwgZi5jID0gbiwgZi5kID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGYubyhlLCB0KSB8fCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITEsCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgZ2V0OiBuCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgZi5uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0ID0gZSAmJiBlLl9fZXNNb2R1bGUgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZGVmYXVsdDsKICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIGYuZCh0LCAnYScsIHQpLCB0OwogICAgICAgICAgICB9LCBmLm8gPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KTsKICAgICAgICAgICAgfSwgZi5wID0gJycsIGYub2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdGhyb3cgY29uc29sZS5lcnJvcihlKSwgZTsKICAgICAgICAgICAgfSwgZihmLnMgPSA5OTgpOwogICAgICAgIH0oewogICAgICAgICAgICAwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIG4uZCh0LCAnaW50ZXJuYWwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFI7CiAgICAgICAgICAgICAgICB9KSwgdC5nZXRQcmViaWRJbnRlcm5hbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gazsKICAgICAgICAgICAgICAgIH0sIG4uZCh0LCAnYmluZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUDsKICAgICAgICAgICAgICAgIH0pLCB0LmdldFVuaXF1ZUlkZW50aWZpZXJTdHIgPSBxLCB0LmdlbmVyYXRlVVVJRCA9IGZ1bmN0aW9uIGUodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID8gKHQgXiBHKCkgPj4gdCAvIDQpLnRvU3RyaW5nKDE2KSA6IChbMTAwMDAwMDBdICsgLTEwMDAgKyAtNDAwMCArIC04MDAwICsgLTEwMDAwMDAwMDAwMCkucmVwbGFjZSgvWzAxOF0vZywgZSk7CiAgICAgICAgICAgICAgICB9LCB0LmdldEJpZElkUGFyYW1ldGVyID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB0W2VdKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdFtlXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9LCB0LnRyeUFwcGVuZFF1ZXJ5U3RyaW5nID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgKyB0ICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4pICsgJyYnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfSwgdC5wYXJzZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkobikgJiYgKHQgKz0gbiArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChlW25dKSArICcmJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSB0LnJlcGxhY2UoLyYkLywgJycpOwogICAgICAgICAgICAgICAgfSwgdC50cmFuc2Zvcm1BZFNlcnZlclRhcmdldGluZ09iaiA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgJiYgMCA8IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLmxlbmd0aCA/IGdlKHQpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGUsICc9JykuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudCh0W2VdKSk7CiAgICAgICAgICAgICAgICAgICAgfSkuam9pbignJicpIDogJyc7CiAgICAgICAgICAgICAgICB9LCB0LmdldEFkVW5pdFNpemVzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgICAgIGUubWVkaWFUeXBlcyAmJiBlLm1lZGlhVHlwZXMuYmFubmVyICYmIEFycmF5LmlzQXJyYXkoZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcykgPyAobiA9IGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMsIEFycmF5LmlzQXJyYXkoblswXSkgPyB0ID0gbiA6IHQucHVzaChuKSkgOiBBcnJheS5pc0FycmF5KGUuc2l6ZXMpICYmIChBcnJheS5pc0FycmF5KGUuc2l6ZXNbMF0pID8gdCA9IGUuc2l6ZXMgOiB0LnB1c2goZS5zaXplcykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgIH0sIHQucGFyc2VTaXplc0lucHV0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuc3BsaXQoJywnKSwgciA9IC9eKFxkKSt4KFxkKSskL2k7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlKG4sIGkpICYmIG5baV0ubWF0Y2gocikgJiYgdC5wdXNoKG5baV0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJ29iamVjdCcgPT09IGgoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgPT09IG8gJiYgJ251bWJlcicgPT0gdHlwZW9mIGVbMF0gJiYgJ251bWJlcicgPT0gdHlwZW9mIGVbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5wdXNoKFcoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwOyBhIDwgbzsgYSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2goVyhlW2FdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfSwgdC5wYXJzZUdQVFNpbmdsZVNpemVBcnJheSA9IFcsIHQucGFyc2VHUFRTaW5nbGVTaXplQXJyYXlUb1J0YlNpemUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChMKGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0V2luZG93VG9wID0gRiwgdC5nZXRXaW5kb3dTZWxmID0geiwgdC5nZXRXaW5kb3dMb2NhdGlvbiA9IFYsIHQubG9nTWVzc2FnZSA9IEgsIHQubG9nSW5mbyA9IEssIHQubG9nV2FybiA9IEosIHQubG9nRXJyb3IgPSBZLCB0Lmhhc0NvbnNvbGVMb2dnZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgICAgICAgICB9LCB0LmRlYnVnVHVybmVkT24gPSAkLCB0LmNyZWF0ZUludmlzaWJsZUlmcmFtZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlkID0gcSgpLCBlLmhlaWdodCA9IDAsIGUud2lkdGggPSAwLCBlLmJvcmRlciA9ICcwcHgnLCBlLmhzcGFjZSA9ICcwJywgZS52c3BhY2UgPSAnMCcsIGUubWFyZ2luV2lkdGggPSAnMCcsIGUubWFyZ2luSGVpZ2h0ID0gJzAnLCBlLnN0eWxlLmJvcmRlciA9ICcwJywgZS5zY3JvbGxpbmcgPSAnbm8nLCBlLmZyYW1lQm9yZGVyID0gJzAnLCBlLnNyYyA9ICdhYm91dDpibGFuaycsIGUuc3R5bGUuZGlzcGxheSA9ICdub25lJywgZTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0UGFyYW1ldGVyQnlOYW1lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gamUoVigpLnNlYXJjaClbZV0gfHwgJyc7CiAgICAgICAgICAgICAgICB9LCB0LmlzQSA9IFgsIHQuaXNGbiA9IFosIHQuaXNTdHIgPSBlZSwgdC5pc0FycmF5ID0gdGUsIHQuaXNOdW1iZXIgPSBuZSwgdC5pc1BsYWluT2JqZWN0ID0gcmUsIHQuaXNCb29sZWFuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBJKTsKICAgICAgICAgICAgICAgIH0sIHQuaXNFbXB0eSA9IGllLCB0LmlzRW1wdHlTdHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlZShlKSAmJiAoIWUgfHwgMCA9PT0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgfSwgdC5fZWFjaCA9IG9lLCB0LmNvbnRhaW5zID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaWUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICBpZiAoWihlLmluZGV4T2YpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IGUuaW5kZXhPZih0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGZvciAoOyBuLS07KQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVtuXSA9PT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICB9LCB0Ll9tYXAgPSBmdW5jdGlvbiAobiwgcikgewogICAgICAgICAgICAgICAgICAgIGlmIChpZShuKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgIGlmIChaKG4ubWFwKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4ubWFwKHIpOwogICAgICAgICAgICAgICAgICAgIHZhciBpID0gW107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9lKG4sIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaChyKGUsIHQsIG4pKTsKICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgIH0sIHQuaGFzT3duID0gYWUsIHQuaW5zZXJ0RWxlbWVudCA9IGNlLCB0LnRyaWdnZXJQaXhlbCA9IHVlLCB0LmNhbGxCdXJsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuc291cmNlLCBuID0gZS5idXJsOwogICAgICAgICAgICAgICAgICAgIHQgPT09IG0uUzJTLlNSQyAmJiBuICYmIFIudHJpZ2dlclBpeGVsKG4pOwogICAgICAgICAgICAgICAgfSwgdC5pbnNlcnRIdG1sSW50b0lmcmFtZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICB0LmlkID0gcSgpLCB0LndpZHRoID0gMCwgdC5oZWlnaHQgPSAwLCB0LmhzcGFjZSA9ICcwJywgdC52c3BhY2UgPSAnMCcsIHQubWFyZ2luV2lkdGggPSAnMCcsIHQubWFyZ2luSGVpZ2h0ID0gJzAnLCB0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZScsIHQuc3R5bGUuaGVpZ2h0ID0gJzBweCcsIHQuc3R5bGUud2lkdGggPSAnMHB4JywgdC5zY3JvbGxpbmcgPSAnbm8nLCB0LmZyYW1lQm9yZGVyID0gJzAnLCB0LmFsbG93dHJhbnNwYXJlbmN5ID0gJ3RydWUnLCBSLmluc2VydEVsZW1lbnQodCwgZG9jdW1lbnQsICdib2R5JyksIHQuY29udGVudFdpbmRvdy5kb2N1bWVudC5vcGVuKCksIHQuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShlKSwgdC5jb250ZW50V2luZG93LmRvY3VtZW50LmNsb3NlKCk7CiAgICAgICAgICAgICAgICB9LCB0Lmluc2VydFVzZXJTeW5jSWZyYW1lID0gc2UsIHQuY3JlYXRlVHJhY2tQaXhlbEh0bWwgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZW5jb2RlVVJJKGUpLCBuID0gJzxkaXYgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6MHB4O3RvcDowcHg7dmlzaWJpbGl0eTpoaWRkZW47Ij4nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuICs9ICc8aW1nIHNyYz0iJyArIHQgKyAnIj48L2Rpdj4nOwogICAgICAgICAgICAgICAgfSwgdC5jcmVhdGVUcmFja1BpeGVsSWZyYW1lSHRtbCA9IGRlLCB0LmdldFZhbHVlU3RyaW5nID0gZmUsIHQudW5pcXVlcyA9IGxlLCB0LmZsYXR0ZW4gPSBwZSwgdC5nZXRCaWRSZXF1ZXN0ID0gZnVuY3Rpb24gKG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IChlLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBjKCkoZS5iaWRzLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmlkSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZElkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmlkX2lkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbZV0gPT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIChyID0gdCksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSksIHIpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgfSwgdC5nZXRLZXlzID0gZ2UsIHQuZ2V0VmFsdWUgPSBiZSwgdC5nZXRLZXlCeVZhbHVlID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KG4pICYmIGVbbl0gPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0QmlkZGVyQ29kZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHBianMuYWRVbml0cykubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZHMubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShwZSwgW10pOwogICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShwZSkuZmlsdGVyKGxlKTsKICAgICAgICAgICAgICAgIH0sIHQuaXNHcHRQdWJhZHNEZWZpbmVkID0gdmUsIG4uZCh0LCAnZ2V0SGlnaGVzdENwbScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geWU7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdnZXRPbGRlc3RIaWdoZXN0Q3BtQmlkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoZTsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2dldExhdGVzdEhpZ2hlc3RDcG1CaWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lOwogICAgICAgICAgICAgICAgfSksIHQuc2h1ZmZsZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IHQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdCksIHIgPSBlWy0tdF07CiAgICAgICAgICAgICAgICAgICAgICAgIGVbdF0gPSBlW25dLCBlW25dID0gcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCB0LmFkVW5pdHNGaWx0ZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzKCkoZSwgdCAmJiB0LmFkVW5pdENvZGUpOwogICAgICAgICAgICAgICAgfSwgdC5kZWVwQ2xvbmUgPSBBZSwgdC5pbklmcmFtZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUi5nZXRXaW5kb3dTZWxmKCkgIT09IFIuZ2V0V2luZG93VG9wKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgdC5pc1NhZmFyaUJyb3dzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eKCg/IWNocm9tZXxhbmRyb2lkfGNyaW9zfGZ4aW9zKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgICAgICB9LCB0LnJlcGxhY2VBdWN0aW9uUHJpY2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL1wkXHtBVUNUSU9OX1BSSUNFXH0vZywgdCk7CiAgICAgICAgICAgICAgICB9LCB0LnJlcGxhY2VDbGlja1Rocm91Z2ggPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhdCB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlcGxhY2UoL1wke0NMSUNLVEhST1VHSH0vZywgdCk7CiAgICAgICAgICAgICAgICB9LCB0LnRpbWVzdGFtcCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICB9LCB0LmdldFBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyAmJiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgfHwgMDsKICAgICAgICAgICAgICAgIH0sIHQuaGFzRGV2aWNlQWNjZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMSAhPT0gci5iLmdldENvbmZpZygnZGV2aWNlQWNjZXNzJyk7CiAgICAgICAgICAgICAgICB9LCB0LmNoZWNrQ29va2llU3VwcG9ydCA9IEVlLCB0LmRlbGF5RXhlY3V0aW9uID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCA8IDEpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtUmVxdWlyZWRDYWxscyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyLiBHb3QgJy5jb25jYXQodCkpOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0gMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICArK24gPT09IHQgJiYgZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0Lmdyb3VwQnkgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVbdFtuXV0gPSBlW3Rbbl1dIHx8IFtdKS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHt9KTsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0RGVmaW5lZFBhcmFtcyA9IGZ1bmN0aW9uIChuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW2VdOwogICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShlLCB2KHt9LCB0LCBuW3RdKSk7CiAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgfSwgdC5pc1ZhbGlkTWVkaWFUeXBlcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdiYW5uZXInLAogICAgICAgICAgICAgICAgICAgICAgICAnbmF0aXZlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZGVvJwogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhlKS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoKSh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICBpZiAoZS52aWRlbyAmJiBlLnZpZGVvLmNvbnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKCkoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RyZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdXRzdHJlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkcG9kJwogICAgICAgICAgICAgICAgICAgICAgICBdLCBlLnZpZGVvLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0sIHQuZ2V0QmlkZGVyUmVxdWVzdCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMoKShlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IGUuYmlkcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZGRlciA9PT0gdCAmJiBlLmFkVW5pdENvZGUgPT09IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9KSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSWQ6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgdC5nZXRVc2VyQ29uZmlndXJlZFBhcmFtcyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvZGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZHM7CiAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKHBlLCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZGRlciA9PT0gbjsKICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zIHx8IHt9OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgdC5nZXRPcmlnaW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gPyB3aW5kb3cubG9jYXRpb24ub3JpZ2luIDogd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICh3aW5kb3cubG9jYXRpb24ucG9ydCA/ICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0IDogJycpOwogICAgICAgICAgICAgICAgfSwgdC5nZXRETlQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcxJyA9PT0gbmF2aWdhdG9yLmRvTm90VHJhY2sgfHwgJzEnID09PSB3aW5kb3cuZG9Ob3RUcmFjayB8fCAnMScgPT09IG5hdmlnYXRvci5tc0RvTm90VHJhY2sgfHwgJ3llcycgPT09IG5hdmlnYXRvci5kb05vdFRyYWNrOwogICAgICAgICAgICAgICAgfSwgdC5pc0FkVW5pdENvZGVNYXRjaGluZ1Nsb3QgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2UodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHQuaXNTbG90TWF0Y2hpbmdBZFVuaXRDb2RlID0gVGUsIHQuZ2V0R3B0U2xvdEluZm9Gb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICB2ZSgpICYmICh0ID0gYygpKHdpbmRvdy5nb29nbGV0YWcucHViYWRzKCkuZ2V0U2xvdHMoKSwgVGUoZSkpKTsKICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwdFNsb3Q6IHQuZ2V0QWRVbml0UGF0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2SWQ6IHQuZ2V0U2xvdEVsZW1lbnRJZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgfSwgdC51bnN1cHBvcnRlZEJpZGRlck1lc3NhZ2UgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmtleXMoZS5tZWRpYVR5cGVzIHx8IHsgYmFubmVyOiAnYmFubmVyJyB9KS5qb2luKCcsICcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnXG4gICAgJy5jb25jYXQoZS5jb2RlLCAnIGlzIGEgJykuY29uY2F0KG4sICcgYWQgdW5pdFxuICAgIGNvbnRhaW5pbmcgYmlkZGVycyB0aGF0IGRvblwndCBzdXBwb3J0ICcpLmNvbmNhdChuLCAnOiAnKS5jb25jYXQodCwgJy5cbiAgICBUaGlzIGJpZGRlciB3b25cJ3QgZmV0Y2ggZGVtYW5kLlxuICAnKTsKICAgICAgICAgICAgICAgIH0sIHQuaXNJbnRlZ2VyID0gSWUsIHQuY29udmVydENhbWVsVG9VbmRlcnNjb3JlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXBsYWNlKC8oPzpefFwuPykoW0EtWl0pL2csIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnXycgKyB0LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSkucmVwbGFjZSgvXl8vLCAnJyk7CiAgICAgICAgICAgICAgICB9LCB0LmNsZWFuT2JqID0gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobikucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IG5bdF0gJiYgKGVbdF0gPSBuW3RdKSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICB9LCB0LnBpY2sgPSBmdW5jdGlvbiAoYSwgYykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gaChhKSA/IGMucmVkdWNlKGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdCwgaSA9IHQubWF0Y2goL14oLis/KVxzYXNccyguKz8pJC9pKTsKICAgICAgICAgICAgICAgICAgICAgICAgaSAmJiAodCA9IGlbMV0sIHIgPSBpWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBhW3RdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgY1tuICsgMV0gJiYgKG8gPSBjW24gKyAxXShvLCBlKSksIHZvaWQgMCAhPT0gbyAmJiAoZVtyXSA9IG8pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHt9KSA6IHt9OwogICAgICAgICAgICAgICAgfSwgdC50cmFuc2Zvcm1CaWRkZXJQYXJhbUtleXdvcmRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdID8gYXJndW1lbnRzWzFdIDogJ2tleXdvcmRzJywgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZShlLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGUoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZShlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZSA9IGZlKHIgKyAnLicgKyB0LCBlKSkgJiYgJycgIT09IGUgfHwgbi5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlZShlID0gZmUociArICcuJyArIHQsIGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgIH0sIHQuY29udmVydFR5cGVzID0gZnVuY3Rpb24gKHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgaVtlXSAmJiAoWihyW2VdKSA/IGlbZV0gPSByW2VdKGlbZV0pIDogaVtlXSA9ICh0ID0gcltlXSwgbiA9IGlbZV0sICdzdHJpbmcnID09PSB0ID8gbiAmJiBuLnRvU3RyaW5nKCkgOiAnbnVtYmVyJyA9PT0gdCA/IE51bWJlcihuKSA6IG4pLCBpc05hTihpW2VdKSAmJiBkZWxldGUgaS5rZXkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgfSwgdC5pc0FycmF5T2ZOdW1zID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGUoZSkgJiYgKCF0IHx8IGUubGVuZ3RoID09PSB0KSAmJiBlLmV2ZXJ5KEllKTsKICAgICAgICAgICAgICAgIH0sIHQuZmlsbCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IFtdLCByID0gMDsgciA8IHQ7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHJlKGUpID8gQWUoZSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSwgdC5jaHVuayA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IFtdLCByID0gMDsgciA8IE1hdGguY2VpbChlLmxlbmd0aCAvIHQpOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSByICogdCwgbyA9IGkgKyB0OwogICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2goZS5zbGljZShpLCBvKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfSwgdC5nZXRNaW5WYWx1ZUZyb21BcnJheSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsIHAoZSkpOwogICAgICAgICAgICAgICAgfSwgdC5nZXRNYXhWYWx1ZUZyb21BcnJheSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIHAoZSkpOwogICAgICAgICAgICAgICAgfSwgdC5jb21wYXJlT24gPSBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuXSA8IHRbbl0gPyAxIDogZVtuXSA+IHRbbl0gPyAtMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sIHQucGFyc2VRUyA9IGplLCB0LmZvcm1hdFFTID0gQ2UsIHQucGFyc2VVcmwgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgICAgICAgICAgICAgIHQgJiYgJ25vRGVjb2RlV2hvbGVVUkwnIGluIHQgJiYgdC5ub0RlY29kZVdob2xlVVJMID8gbi5ocmVmID0gZSA6IG4uaHJlZiA9IGRlY29kZVVSSUNvbXBvbmVudChlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHQgJiYgJ2RlY29kZVNlYXJjaEFzU3RyaW5nJyBpbiB0ICYmIHQuZGVjb2RlU2VhcmNoQXNTdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHJlZjogbi5ocmVmLAogICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbDogKG4ucHJvdG9jb2wgfHwgJycpLnJlcGxhY2UoLzokLywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZTogbi5ob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydDogK24ucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IG4ucGF0aG5hbWUucmVwbGFjZSgvXig/IVwvKS8sICcvJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaDogciA/IG4uc2VhcmNoIDogUi5wYXJzZVFTKG4uc2VhcmNoIHx8ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaDogKG4uaGFzaCB8fCAnJykucmVwbGFjZSgvXiMvLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IG4uaG9zdCB8fCB3aW5kb3cubG9jYXRpb24uaG9zdAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmJ1aWxkVXJsID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUucHJvdG9jb2wgfHwgJ2h0dHAnKSArICc6Ly8nICsgKGUuaG9zdCB8fCBlLmhvc3RuYW1lICsgKGUucG9ydCA/ICc6Jy5jb25jYXQoZS5wb3J0KSA6ICcnKSkgKyAoZS5wYXRobmFtZSB8fCAnJykgKyAoZS5zZWFyY2ggPyAnPycuY29uY2F0KFIuZm9ybWF0UVMoZS5zZWFyY2ggfHwgJycpKSA6ICcnKSArIChlLmhhc2ggPyAnIycuY29uY2F0KGUuaGFzaCkgOiAnJyk7CiAgICAgICAgICAgICAgICB9LCB0LmRlZXBFcXVhbCA9IHdlLCB0Lm1lcmdlRGVlcCA9IF9lLCB0LmN5cmI1M0hhc2ggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQsIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IDAsIHIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChaKE1hdGguaW11bCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmltdWwoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAoNDE5NDMwMyAmIGUpICogKHQgfD0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyOTA3NzI5OTIgJiBlICYmIChuICs9ICg0MjkwNzcyOTkyICYgZSkgKiB0IHwgMCksIDAgfCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgaSA9IDM3MzU5Mjg1NTkgXiBuLCBvID0gMTEwMzU0Nzk5MSBeIG4sIGEgPSAwOyBhIDwgZS5sZW5ndGg7IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUuY2hhckNvZGVBdChhKSwgaSA9IHIoaSBeIHQsIDI2NTQ0MzU3NjEpLCBvID0gcihvIF4gdCwgMTU5NzMzNDY3Nyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPSByKGkgXiBpID4+PiAxNiwgMjI0NjgyMjUwNykgXiByKG8gXiBvID4+PiAxMywgMzI2NjQ4OTkwOSksICg0Mjk0OTY3Mjk2ICogKDIwOTcxNTEgJiAobyA9IHIobyBeIG8gPj4+IDE2LCAyMjQ2ODIyNTA3KSBeIHIoaSBeIGkgPj4+IDEzLCAzMjY2NDg5OTA5KSkpICsgKGkgPj4+IDApKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByID0gbigzKSwgaSA9IG4oMTYwKSwgbyA9IG4ubihpKSwgYSA9IG4oMTApLCBjID0gbi5uKGEpLCB1ID0gbigxMyksIHMgPSBuLm4odSksIGQgPSBuKDE2MSk7CiAgICAgICAgICAgICAgICBuLmQodCwgJ2RlZXBBY2Nlc3MnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIGYgPSBuKDE2Mik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10sIHIgPSAhMCwgaSA9ICExLCBvID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgYyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKHIgPSAoYSA9IGMubmV4dCgpKS5kb25lKSAmJiAobi5wdXNoKGEudmFsdWUpLCAhdCB8fCBuLmxlbmd0aCAhPT0gdCk7IHIgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgfHwgbnVsbCA9PSBjLnJldHVybiB8fCBjLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGcoZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZyhlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnT2JqZWN0JyA9PT0gbiAmJiBlLmNvbnN0cnVjdG9yICYmIChuID0gZS5jb25zdHJ1Y3Rvci5uYW1lKSwgJ01hcCcgPT09IG4gfHwgJ1NldCcgPT09IG4gPyBBcnJheS5mcm9tKGUpIDogJ0FyZ3VtZW50cycgPT09IG4gfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikgPyBiKGUsIHQpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgciA9IG5ldyBBcnJheSh0KTsgbiA8IHQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgcltuXSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBlID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICB9KSA6IGVbdF0gPSBuLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHkgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChoID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuLmQodCwgJ2RlZXBTZXRWYWx1ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi5hOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IG4oNSksIFMgPSAnQXJyYXknLCBBID0gJ1N0cmluZycsIEUgPSAnRnVuY3Rpb24nLCBPID0gJ051bWJlcicsIFQgPSAnT2JqZWN0JywgSSA9ICdCb29sZWFuJywgaiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsIEMgPSBCb29sZWFuKHdpbmRvdy5jb25zb2xlKSwgdyA9IEJvb2xlYW4oQyAmJiB3aW5kb3cuY29uc29sZS5sb2cpLCBfID0gQm9vbGVhbihDICYmIHdpbmRvdy5jb25zb2xlLmluZm8pLCB4ID0gQm9vbGVhbihDICYmIHdpbmRvdy5jb25zb2xlLndhcm4pLCBCID0gQm9vbGVhbihDICYmIHdpbmRvdy5jb25zb2xlLmVycm9yKSwgVSA9IG4oOSksIFIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29va2llU3VwcG9ydDogRWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRyYWNrUGl4ZWxJZnJhbWVIdG1sOiBkZSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2luZG93U2VsZjogeiwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2luZG93VG9wOiBGLAogICAgICAgICAgICAgICAgICAgICAgICBnZXRXaW5kb3dMb2NhdGlvbjogViwKICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VXNlclN5bmNJZnJhbWU6IHNlLAogICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRFbGVtZW50OiBjZSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNGbjogWiwKICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlclBpeGVsOiB1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgbG9nRXJyb3I6IFksCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1dhcm46IEosCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ01lc3NhZ2U6IEgsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0luZm86IEssCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlUVM6IGplLAogICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRRUzogQ2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbDogd2UKICAgICAgICAgICAgICAgICAgICB9LCBrID0ge307CiAgICAgICAgICAgICAgICB2YXIgRCwgTiA9IHt9LCBQID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKG51bGwsIDEsIE4pKCkgPT09IE4gPyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgbiA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hcHBseShlLCBuLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwgTSA9IChEID0gMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKytEOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gcSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTSgpICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygxNikuc3Vic3RyKDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRygpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93ICYmIHdpbmRvdy5jcnlwdG8gJiYgd2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMgPyBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAlIDE2IDogMTYgKiBNYXRoLnJhbmRvbSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVyhlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEwoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzBdICsgJ3gnICsgZVsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZShlKSAmJiAyID09PSBlLmxlbmd0aCAmJiAhaXNOYU4oZVswXSkgJiYgIWlzTmFOKGVbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LnRvcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSCgpIHsKICAgICAgICAgICAgICAgICAgICAkKCkgJiYgdyAmJiBjb25zb2xlLmxvZy5hcHBseShjb25zb2xlLCBRKGFyZ3VtZW50cywgJ01FU1NBR0U6JykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSygpIHsKICAgICAgICAgICAgICAgICAgICAkKCkgJiYgXyAmJiBjb25zb2xlLmluZm8uYXBwbHkoY29uc29sZSwgUShhcmd1bWVudHMsICdJTkZPOicpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEooKSB7CiAgICAgICAgICAgICAgICAgICAgJCgpICYmIHggJiYgY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsIFEoYXJndW1lbnRzLCAnV0FSTklORzonKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKCkgewogICAgICAgICAgICAgICAgICAgICQoKSAmJiBCICYmIGNvbnNvbGUuZXJyb3IuYXBwbHkoY29uc29sZSwgUShhcmd1bWVudHMsICdFUlJPUjonKSksIFUuZW1pdChtLkVWRU5UUy5BVUNUSU9OX0RFQlVHLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdFUlJPUicsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50czogYXJndW1lbnRzCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBRKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IFtdLnNsaWNlLmNhbGwoZSksIHQgJiYgZS51bnNoaWZ0KHQpLCBlLnVuc2hpZnQoJ2Rpc3BsYXk6IGlubGluZS1ibG9jazsgY29sb3I6ICNmZmY7IGJhY2tncm91bmQ6ICMzYjg4YzM7IHBhZGRpbmc6IDFweCA0cHg7IGJvcmRlci1yYWRpdXM6IDNweDsnKSwgZS51bnNoaWZ0KCclY1ByZWJpZCcpLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gJCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFyLmIuZ2V0Q29uZmlnKCdkZWJ1ZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGouY2FsbChlKSA9PT0gJ1tvYmplY3QgJyArIHQgKyAnXSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBaKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBBKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBTKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG5lKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBPKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWChlLCBUKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGllKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICBpZiAodGUoZSkgfHwgZWUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKDAgPCBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChlLCB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpZShlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoWihlLmZvckVhY2gpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaCh0LCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAwLCByID0gZS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwIDwgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBuIDwgcjsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZVtuXSwgbiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiBpbiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc093blByb3BlcnR5LmNhbGwoZSwgbikgJiYgdC5jYWxsKHRoaXMsIGVbbl0sIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSA/IGUuaGFzT3duUHJvcGVydHkodCkgOiB2b2lkIDAgIT09IGVbdF0gJiYgZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbdF0gIT09IGVbdF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjZShlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgICAgICAgICAgdCA9IHQgfHwgZG9jdW1lbnQsIGkgPSBuID8gdC5nZXRFbGVtZW50c0J5VGFnTmFtZShuKSA6IHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPSBpLmxlbmd0aCA/IGkgOiB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JykpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGlbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHIgPyBudWxsIDogaS5maXJzdENoaWxkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuaW5zZXJ0QmVmb3JlKGUsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICAgICAgICAgIHQgJiYgUi5pc0ZuKHQpICYmIChuLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0KSwgbi5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHQpKSwgbi5zcmMgPSBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2UoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gUi5jcmVhdGVUcmFja1BpeGVsSWZyYW1lSHRtbChlLCAhMSwgJ2FsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4nKSwgciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIHIuaW5uZXJIVE1MID0gbjsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHIuZmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgICAgICB0ICYmIFIuaXNGbih0KSAmJiAoaS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgdCksIGkuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCB0KSksIFIuaW5zZXJ0RWxlbWVudChpLCBkb2N1bWVudCwgJ2h0bWwnLCAhMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkZShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gKCghKDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzFdKSB8fCBhcmd1bWVudHNbMV0pICYmIChlID0gZW5jb2RlVVJJKGUpKSwgdCA9IHQgJiYgJ3NhbmRib3g9IicuY29uY2F0KHQsICciJyksICc8aWZyYW1lICcuY29uY2F0KHQsICcgaWQ9IicpLmNvbmNhdChxKCksICciXG4gICAgICBmcmFtZWJvcmRlcj0iMCJcbiAgICAgIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIlxuICAgICAgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCJcbiAgICAgIHdpZHRoPSIwIiBoc3BhY2U9IjAiIHZzcGFjZT0iMCIgaGVpZ2h0PSIwIlxuICAgICAgc3R5bGU9ImhlaWdodDowcHg7d2lkdGg6MHB4O2Rpc3BsYXk6bm9uZTsiXG4gICAgICBzY3JvbGxpbmc9Im5vIlxuICAgICAgc3JjPSInKS5jb25jYXQoZSwgJyI+XG4gICAgPC9pZnJhbWU+JykpIDogJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgPT0gdCA/IG4gOiBlZSh0KSA/IHQgOiBuZSh0KSA/IHQudG9TdHJpbmcoKSA6IHZvaWQgUi5sb2dXYXJuKCdVbnN1cG9ydGVkIHR5cGUgZm9yIHBhcmFtOiAnICsgZSArICcgcmVxdWlyZWQgdHlwZTogU3RyaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW5kZXhPZihlKSA9PT0gdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYmUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlW3RdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdmUoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5nb29nbGV0YWcgJiYgWih3aW5kb3cuZ29vZ2xldGFnLnB1YmFkcykgJiYgWih3aW5kb3cuZ29vZ2xldGFnLnB1YmFkcygpLmdldFNsb3RzKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHllID0gU2UoJ3RpbWVUb1Jlc3BvbmQnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA8IGU7CiAgICAgICAgICAgICAgICAgICAgfSksIGhlID0gU2UoJ3Jlc3BvbnNlVGltZXN0YW1wJywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPCBlOwogICAgICAgICAgICAgICAgICAgIH0pLCBtZSA9IFNlKCdyZXNwb25zZVRpbWVzdGFtcCcsIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIDwgdDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFNlKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuY3BtID09PSB0LmNwbSA/IHIoZVtuXSwgdFtuXSkgPyB0IDogZSA6IGUuY3BtIDwgdC5jcG0gPyB0IDogZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQWUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvKCkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFZSgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm5hdmlnYXRvci5jb29raWVFbmFibGVkIHx8IGRvY3VtZW50LmNvb2tpZS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBPZSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QWRVbml0UGF0aCgpID09PSB0IHx8IGUuZ2V0U2xvdEVsZW1lbnRJZCgpID09PSB0OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFRlKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9lKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIgPyBOdW1iZXIuaXNJbnRlZ2VyKGUpIDogJ251bWJlcicgPT0gdHlwZW9mIGUgJiYgaXNGaW5pdGUoZSkgJiYgTWF0aC5mbG9vcihlKSA9PT0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGplKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IGUucmVwbGFjZSgvXlw/LywgJycpLnNwbGl0KCcmJykucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbCh0LnNwbGl0KCc9JyksIDIpLCByID0gblswXSwgaSA9IG5bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAvXFtcXSQvLnRlc3QocikgPyAoZVtyID0gci5yZXBsYWNlKCdbXScsICcnKV0gPSBlW3JdIHx8IFtdLCBlW3JdLnB1c2goaSkpIDogZVtyXSA9IGkgfHwgJycsIGU7CiAgICAgICAgICAgICAgICAgICAgfSwge30pIDoge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlW3RdKSA/IGVbdF0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KHQsICdbXT0nKS5jb25jYXQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyYnKSA6ICcnLmNvbmNhdCh0LCAnPScpLmNvbmNhdChlW3RdKTsKICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcmJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3ZShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgIT09IGgoZSkgfHwgbnVsbCA9PT0gZSB8fCAnb2JqZWN0JyAhPT0gaCh0KSB8fCBudWxsID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGUpLmxlbmd0aCAhPT0gT2JqZWN0LmtleXModCkubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdC5oYXNPd25Qcm9wZXJ0eShuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3ZShlW25dLCB0W25dKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gX2UoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBhcmd1bWVudHMubGVuZ3RoLCBuID0gbmV3IEFycmF5KDEgPCB0ID8gdCAtIDEgOiAwKSwgciA9IDE7IHIgPCB0OyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIG5bciAtIDFdID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgIGlmICghbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciBpID0gbi5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZShlKSAmJiByZShpKSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUoaVtvXSkgPyAoZVtvXSB8fCB5KGUsIHYoe30sIG8sIHt9KSksIF9lKGVbb10sIGlbb10pKSA6IHRlKGlbb10pICYmIGVbb10gPyB0ZShlW29dKSAmJiAoZVtvXSA9IGVbb10uY29uY2F0KGlbb10pKSA6IHkoZSwgdih7fSwgbywgaVtvXSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfZS5hcHBseSh2b2lkIDAsIFtlXS5jb25jYXQobikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIG4uZCh0LCAnc3RvcmFnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSTsKICAgICAgICAgICAgICAgIH0pLCB0LnJlZ2lzdGVyQmlkZGVyID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEFycmF5LmlzQXJyYXkoaS5zdXBwb3J0ZWRNZWRpYVR5cGVzKSA/IHsgc3VwcG9ydGVkTWVkaWFUeXBlczogaS5zdXBwb3J0ZWRNZWRpYVR5cGVzIH0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYy5kZWZhdWx0LnJlZ2lzdGVyQmlkQWRhcHRlcih0LCBlLmNvZGUsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvKGkpLCBBcnJheS5pc0FycmF5KGkuYWxpYXNlcykgJiYgaS5hbGlhc2VzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5pc1BsYWluT2JqZWN0KShlKSAmJiAociA9IGUuY29kZSwgdCA9IGUuZ3ZsaWQsIG4gPSBlLnNraXBQYnNBbGlhc2luZyksIGMuZGVmYXVsdC5hbGlhc1JlZ2lzdHJ5W3JdID0gaS5jb2RlLCBvKFQoe30sIGksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBQYnNBbGlhc2luZzogbgogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0Lm5ld0JpZGRlciA9IHcsIG4uZCh0LCAncmVnaXN0ZXJTeW5jSW5uZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF87CiAgICAgICAgICAgICAgICB9KSwgdC5wcmVsb2FkQmlkZGVyTWFwcGluZ0ZpbGUgPSB4LCB0LmdldElhYlN1YkNhdGVnb3J5ID0gZnVuY3Rpb24gKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGMuZGVmYXVsdC5nZXRCaWRBZGFwdGVyKHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChuLmdldFNwZWMoKS5nZXRNYXBwaW5nRmlsZUluZm8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuLmdldFNwZWMoKS5nZXRNYXBwaW5nRmlsZUluZm8oKSwgaSA9IHIubG9jYWxTdG9yYWdlS2V5ID8gci5sb2NhbFN0b3JhZ2VLZXkgOiBuLmdldEJpZGRlckNvZGUoKSwgbyA9IEkuZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBKU09OLnBhcnNlKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChtLmxvZ0Vycm9yKSgnRmFpbGVkIHRvIHBhcnNlICcuY29uY2F0KHQsICcgbWFwcGluZyBkYXRhIHN0b3JlZCBpbiBsb2NhbCBzdG9yYWdlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ubWFwcGluZ1tlXSA/IG8ubWFwcGluZ1tlXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB0LmlzVmFsaWQgPSBCOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDkyKSwgYyA9IG4oOCksIHUgPSBuKDMpLCB2ID0gbigzNCksIHMgPSBuKDQ0KSwgbyA9IG4oMzgpLCBhID0gbigyNSksIGkgPSBuKDUpLCB5ID0gbi5uKGkpLCBkID0gbig5KSwgaCA9IG4ubihkKSwgZiA9IG4oMTMpLCBsID0gbi5uKGYpLCBwID0gbig0KSwgbSA9IG4oMCksIGcgPSBuKDIpLCBiID0gbigxMSksIFMgPSBuKDcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gQShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdLCByID0gITAsIGkgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGEsIGMgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShyID0gKGEgPSBjLm5leHQoKSkuZG9uZSkgJiYgKG4ucHVzaChhLnZhbHVlKSwgIXQgfHwgbi5sZW5ndGggIT09IHQpOyByID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIHx8IG51bGwgPT0gYy5yZXR1cm4gfHwgYy5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSBuICYmIGUuY29uc3RydWN0b3IgJiYgKG4gPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IG4gfHwgJ1NldCcgPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSBuIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfShlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KHQpOyBuIDwgdDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoTyA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAxOyB0IDwgYXJndW1lbnRzLmxlbmd0aDsgdCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGFyZ3VtZW50c1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobiwgcikgJiYgKGVbcl0gPSBuW3JdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEkgPSBPYmplY3QoUy5hKSgnYmlkZGVyRmFjdG9yeScpLCBqID0gWwogICAgICAgICAgICAgICAgICAgICAgICAncmVxdWVzdElkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NwbScsCiAgICAgICAgICAgICAgICAgICAgICAgICd0dGwnLAogICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRpdmVJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICduZXRSZXZlbnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cnJlbmN5JwogICAgICAgICAgICAgICAgICAgIF0sIEMgPSAxOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdyhwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQobmV3IHIuYShwLmNvZGUpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFNwZWM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZnJlZXplKHApOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlclN5bmNzOiBnLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsQmlkczogZnVuY3Rpb24gKG8sIGEsIGUsIG4sIGMsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1LCBzLCB0LCBkLCBpLCBmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKCksIGguYS5lbWl0KHkuYS5FVkVOVFMuQklEREVSX0RPTkUsIG8pLCBnKHMsIG8uZ2RwckNvbnNlbnQsIG8udXNwQ29uc2VudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KG8uYmlkcykgJiYgKHUgPSB7fSwgcyA9IFtdLCAwICE9PSAodCA9IG8uYmlkcy5maWx0ZXIoYikpLmxlbmd0aCA/IChkID0ge30sIHQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkW2UuYmlkSWRdID0gZSkuYWRVbml0Q29kZSB8fCAoZS5hZFVuaXRDb2RlID0gZS5wbGFjZW1lbnRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAoaSA9IHAuYnVpbGRSZXF1ZXN0cyh0LCBvKSkgJiYgMCAhPT0gaS5sZW5ndGggPyAoQXJyYXkuaXNBcnJheShpKSB8fCAoaSA9IFtpXSksIGYgPSBPYmplY3QobS5kZWxheUV4ZWN1dGlvbikocihsKSwgaS5sZW5ndGgpLCBpLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkubWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnR0VUJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbignJy5jb25jYXQoaS51cmwpLmNvbmNhdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc/Jy5jb25jYXQoJ29iamVjdCcgPT09IE8oZSkgPyBPYmplY3QobS5wYXJzZVF1ZXJ5U3RyaW5nUGFyYW1ldGVycykoZSkgOiBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShpLmRhdGEpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogcihlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZvaWQgMCwgVCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBpLm9wdGlvbnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUE9TVCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oaS51cmwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHIoZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnc3RyaW5nJyA9PSB0eXBlb2YgaS5kYXRhID8gaS5kYXRhIDogSlNPTi5zdHJpbmdpZnkoaS5kYXRhKSwgVCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGkub3B0aW9ucykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5sb2dXYXJuKSgnU2tpcHBpbmcgaW52YWxpZCByZXF1ZXN0IGZyb20gJy5jb25jYXQocC5jb2RlLCAnLiBSZXF1ZXN0IHR5cGUgJykuY29uY2F0KGkudHlwZSwgJyBtdXN0IGJlIEdFVCBvciBQT1NUJykpLCBmKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKHAuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsgZ2V0OiB0LmdldFJlc3BvbnNlSGVhZGVyLmJpbmQodCkgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcC5pbnRlcnByZXRSZXNwb25zZShlLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChtLmxvZ0Vycm9yKSgnQmlkZGVyICcuY29uY2F0KHAuY29kZSwgJyBmYWlsZWQgdG8gaW50ZXJwcmV0IHRoZSBzZXJ2ZXJcJ3MgcmVzcG9uc2UuIENvbnRpbnVpbmcgd2l0aG91dCBiaWRzJyksIG51bGwsIGUpLCB2b2lkIGYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBpID0gZFtlLnJlcXVlc3RJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID8gKGUub3JpZ2luYWxDcG0gPSBlLmNwbSwgZS5vcmlnaW5hbEN1cnJlbmN5ID0gZS5jdXJyZW5jeSwgZS5tZXRhID0gZS5tZXRhIHx8IFQoe30sIGVbaS5iaWRkZXJdKSwgdCA9IFQoT2JqZWN0KHYuYSkoeS5hLlNUQVRVUy5HT09ELCBpKSwgZSksIG4gPSBpLmFkVW5pdENvZGUsIHIgPSB0LCB1W25dID0gITAsIEIobiwgciwgW29dKSAmJiBhKG4sIHIpKSA6IE9iamVjdChtLmxvZ1dhcm4pKCdCaWRkZXIgJy5jb25jYXQocC5jb2RlLCAnIG1hZGUgYmlkIGZvciB1bmtub3duIHJlcXVlc3QgSUQ6ICcpLmNvbmNhdChlLnJlcXVlc3RJZCwgJy4gSWdub3JpbmcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgKE9iamVjdChtLmlzQXJyYXkpKG4pID8gbi5mb3JFYWNoKHIpIDogcihuKSksIGYobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKHAuY29kZSksIE9iamVjdChtLmxvZ0Vycm9yKSgnU2VydmVyIGNhbGwgZm9yICcuY29uY2F0KHAuY29kZSwgJyBmYWlsZWQ6ICcpLmNvbmNhdChlLCAnLiBDb250aW51aW5nIHdpdGhvdXQgYmlkcy4nKSksIGYoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBsKCkpIDogbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICBfKHAsIGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBiKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhcC5pc0JpZFJlcXVlc3RWYWxpZChlKSB8fCAoT2JqZWN0KG0ubG9nV2FybikoJ0ludmFsaWQgYmlkIHNlbnQgdG8gYmlkZGVyICcuY29uY2F0KHAuY29kZSwgJzogJykuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpKSksICExKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgXyA9IE9iamVjdChiLmIpKCdhc3luYycsIGZ1bmN0aW9uICh0LCBlLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8sIGEgPSB1LmIuZ2V0Q29uZmlnKCd1c2VyU3luYy5hbGlhc1N5bmNFbmFibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgIXQuZ2V0VXNlclN5bmNzIHx8ICFhICYmIGMuZGVmYXVsdC5hbGlhc1JlZ2lzdHJ5W3QuY29kZV0gfHwgKGkgPSB1LmIuZ2V0Q29uZmlnKCd1c2VyU3luYy5maWx0ZXJTZXR0aW5ncycpLCAobyA9IHQuZ2V0VXNlclN5bmNzKHsKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lRW5hYmxlZDogISghaSB8fCAhaS5pZnJhbWUgJiYgIWkuYWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxFbmFibGVkOiAhKCFpIHx8ICFpLmltYWdlICYmICFpLmFsbCkKICAgICAgICAgICAgICAgICAgICB9LCBlLCBuLCByKSkgJiYgKEFycmF5LmlzQXJyYXkobykgfHwgKG8gPSBbb10pLCBvLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcy5hLnJlZ2lzdGVyU3luYyhlLnR5cGUsIHQuY29kZSwgZS51cmwpOwogICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICB9LCAncmVnaXN0ZXJTeW5jcycpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24geChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF1LmIuZ2V0Q29uZmlnKCdhZHBvZC5icmFuZENhdGVnb3J5RXhjbHVzaW9uJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGwodGhpcywgdCk7CiAgICAgICAgICAgICAgICAgICAgdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChtLmRlZXBBY2Nlc3MpKGUsICdtZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQnKSA9PT0gZy5hOwogICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRzLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UobS5mbGF0dGVuLCBbXSkuZmlsdGVyKG0udW5pcXVlcykuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGMuZGVmYXVsdC5nZXRCaWRBZGFwdGVyKG4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRTcGVjKCkuZ2V0TWFwcGluZ0ZpbGVJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuZ2V0U3BlYygpLmdldE1hcHBpbmdGaWxlSW5mbygpLCByID0gdC5yZWZyZXNoSW5EYXlzID8gdC5yZWZyZXNoSW5EYXlzIDogQywgaSA9IHQubG9jYWxTdG9yYWdlS2V5ID8gdC5sb2NhbFN0b3JhZ2VLZXkgOiBlLmdldFNwZWMoKS5jb2RlLCBvID0gSS5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEobyA9IG8gPyBKU09OLnBhcnNlKG8pIDogdm9pZCAwKSB8fCBPYmplY3QobS50aW1lc3RhbXApKCkgPiBvLmxhc3RVcGRhdGVkICsgMjQgKiByICogNjAgKiA2MCAqIDEwMDApICYmIE9iamVjdChwLmEpKHQudXJsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0VXBkYXRlZDogT2JqZWN0KG0udGltZXN0YW1wKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nOiBlLm1hcHBpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkuc2V0RGF0YUluTG9jYWxTdG9yYWdlKGksIEpTT04uc3RyaW5naWZ5KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5sb2dFcnJvcikoJ0ZhaWxlZCB0byBwYXJzZSAnLmNvbmNhdChuLCAnIGJpZGRlciB0cmFuc2xhdGlvbiBtYXBwaW5nIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5sb2dFcnJvcikoJ0ZhaWxlZCB0byBsb2FkICcuY29uY2F0KG4sICcgYmlkZGVyIHRyYW5zbGF0aW9uIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5sb2dFcnJvcikoJ0ZhaWxlZCB0byBwYXJzZSAnLmNvbmNhdChuLCAnIGJpZGRlciB0cmFuc2xhdGlvbiBtYXBwaW5nIGZpbGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgZS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBiaWQgZnJvbSAnLmNvbmNhdCh0LmJpZGRlckNvZGUsICcuIElnbm9yaW5nIGJpZDogJykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA/IHQgPyAoaSA9IE9iamVjdC5rZXlzKHQpLCBqLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKCkoaSwgZSkgJiYgIWwoKShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHRbZV0pOwogICAgICAgICAgICAgICAgICAgIH0pID8gJ25hdGl2ZScgIT09IHQubWVkaWFUeXBlIHx8IE9iamVjdChvLmcpKHQsIG4pID8gJ3ZpZGVvJyAhPT0gdC5tZWRpYVR5cGUgfHwgT2JqZWN0KGEuZCkodCwgbikgPyAhKCdiYW5uZXInID09PSB0Lm1lZGlhVHlwZSAmJiAhZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0LndpZHRoIHx8IDAgPT09IHBhcnNlSW50KHQud2lkdGgsIDEwKSkgJiYgKHQuaGVpZ2h0IHx8IDAgPT09IHBhcnNlSW50KHQuaGVpZ2h0LCAxMCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQud2lkdGggPSBwYXJzZUludCh0LndpZHRoLCAxMCksIHQuaGVpZ2h0ID0gcGFyc2VJbnQodC5oZWlnaHQsIDEwKSwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBPYmplY3QobS5nZXRCaWRkZXJSZXF1ZXN0KShuLCB0LmJpZGRlckNvZGUsIGUpLCBpID0gciAmJiByLmJpZHMgJiYgci5iaWRzWzBdICYmIHIuYmlkc1swXS5zaXplcywgbyA9IE9iamVjdChtLnBhcnNlU2l6ZXNJbnB1dCkoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxID09PSBvLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBBKG9bMF0uc3BsaXQoJ3gnKSwgMiksIGMgPSBhWzBdLCB1ID0gYVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LndpZHRoID0gcGFyc2VJbnQoYywgMTApLCB0LmhlaWdodCA9IHBhcnNlSW50KHUsIDEwKSwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0oZSwgdCwgbikpIHx8IChPYmplY3QobS5sb2dFcnJvcikocignQmFubmVyIGJpZHMgcmVxdWlyZSBhIHdpZHRoIGFuZCBoZWlnaHQnKSksICExKSA6IChPYmplY3QobS5sb2dFcnJvcikocignVmlkZW8gYmlkIGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgdmFzdFVybCBvciByZW5kZXJlciBwcm9wZXJ0eScpKSwgITEpIDogKE9iamVjdChtLmxvZ0Vycm9yKShyKCdOYXRpdmUgYmlkIG1pc3Npbmcgc29tZSByZXF1aXJlZCBwcm9wZXJ0aWVzLicpKSwgITEpIDogKE9iamVjdChtLmxvZ0Vycm9yKShyKCdCaWRkZXIgJy5jb25jYXQodC5iaWRkZXJDb2RlLCAnIGlzIG1pc3NpbmcgcmVxdWlyZWQgcGFyYW1zLiBDaGVjayBodHRwOi8vcHJlYmlkLm9yZy9kZXYtZG9jcy9iaWRkZXItYWRhcHRlci0xLmh0bWwgZm9yIGxpc3Qgb2YgcGFyYW1zLicpKSksICExKSkgOiAoT2JqZWN0KG0ubG9nV2FybikoJ1NvbWUgYWRhcHRlciB0cmllZCB0byBhZGQgYW4gdW5kZWZpbmVkIGJpZCBmb3IgJy5jb25jYXQoZSwgJy4nKSksICExKSA6IChPYmplY3QobS5sb2dXYXJuKSgnTm8gYWRVbml0Q29kZSB3YXMgc3VwcGxpZWQgdG8gYWRkQmlkUmVzcG9uc2UuJyksICExKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdChiLmEpKCdjaGVja0FkVW5pdFNldHVwJykuYmVmb3JlKHgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbig5OCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMDA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzApLCBpID0gbigxMDEpLCBvID0gbig0NiksIGEgPSBuKDQ3KSwgYyA9IG4oNTUpLCB1ID0gbigyOCksIHMgPSBuKDczKSwgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgICAgICB0LmYgPSByID8gZCA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgPSBhKGUpLCB0ID0gYyh0LCAhMCksIHMpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZChlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHUoZSwgdCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKCFpLmYuY2FsbChlLCB0KSwgZVt0XSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMDE6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLCBpID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciwgbyA9IGkgJiYgIXIuY2FsbCh7IDE6IDIgfSwgMSk7CiAgICAgICAgICAgICAgICB0LmYgPSBvID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkodGhpcywgZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdCAmJiB0LmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICB9IDogcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTAyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjW2EoZSldOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuID09IHMgfHwgbiAhPSB1ICYmICgnZnVuY3Rpb24nID09IHR5cGVvZiB0ID8gaSh0KSA6ICEhdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oMzEpLCBvID0gLyN8XC5wcm90b3R5cGVcLi8sIGEgPSByLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcoZSkucmVwbGFjZShvLCAnLicpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgYyA9IHIuZGF0YSA9IHt9LCB1ID0gci5OQVRJVkUgPSAnTicsIHMgPSByLlBPTFlGSUxMID0gJ1AnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTAzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI3KSwgaSA9IG4oMTA0KSwgbyA9IG4oMjIpKCdzcGVjaWVzJyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUpICYmICgnZnVuY3Rpb24nID09IHR5cGVvZiAobiA9IGUuY29uc3RydWN0b3IpICYmIChuID09PSBBcnJheSB8fCBpKG4ucHJvdG90eXBlKSkgfHwgcihuKSAmJiBudWxsID09PSAobiA9IG5bb10pKSAmJiAobiA9IHZvaWQgMCksIG5ldyAodm9pZCAwID09PSBuID8gQXJyYXkgOiBuKSgwID09PSB0ID8gMCA6IHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTA0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDQ4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0FycmF5JyA9PSByKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTA1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI2KSwgaSA9IG4oMzIpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpKHIsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgclt0XSA9IG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTA2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDc3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIgJiYgIVN5bWJvbC5zaGFtICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3I7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEwNzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIG4oMTA4KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig1Mik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKCdBcnJheScsICdpbmNsdWRlcycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMDg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTQpLCBpID0gbig3OCkuaW5jbHVkZXMsIG8gPSBuKDUxKTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ0FycmF5JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiAhbig2MCkoJ2luZGV4T2YnLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFDQ0VTU09SUzogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIDE6IDAKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSh0aGlzLCBlLCAxIDwgYXJndW1lbnRzLmxlbmd0aCA/IHQgOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBvKCdpbmNsdWRlcycpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMDk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNTgpLCBpID0gTWF0aC5tYXgsIG8gPSBNYXRoLm1pbjsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByKGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuIDwgMCA/IGkobiArIHQsIDApIDogbyhuLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgICAgICAgIH0pLCB0LmQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiAxNTsKICAgICAgICAgICAgICAgICAgICAwID09PSBlLmdldEhvb2tzKHsgaG9vazogdCB9KS5sZW5ndGggJiYgZS5iZWZvcmUodCwgbik7CiAgICAgICAgICAgICAgICB9LCB0LmMgPSBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGEoJ2FzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5hcHBseSh2b2lkIDAsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0ID0gZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ09iamVjdCcgPT09IG4gJiYgZS5jb25zdHJ1Y3RvciAmJiAobiA9IGUuY29uc3RydWN0b3IubmFtZSksICdNYXAnID09PSBuIHx8ICdTZXQnID09PSBuID8gQXJyYXkuZnJvbShlKSA6ICdBcmd1bWVudHMnID09PSBuIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pID8gbyhlLCB0KSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZSkoW10pOwogICAgICAgICAgICAgICAgfSwgdC5lID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gYXJndW1lbnRzLmxlbmd0aCwgbiA9IG5ldyBBcnJheSgxIDwgdCA/IHQgLSAxIDogMCksIHIgPSAxOyByIDwgdDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICBuW3IgLSAxXSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICBjKGUpLmJlZm9yZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0LnB1c2gobiksIGUodCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE2MyksIGkgPSBuLm4ocik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDAsIHIgPSBuZXcgQXJyYXkodCk7IG4gPCB0OyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHJbbl0gPSBlW25dOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGEgPSBpKCkoeyByZWFkeTogaS5hLlNZTkMgfCBpLmEuQVNZTkMgfCBpLmEuUVVFVUUgfSksIGMgPSBhLmdldDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTEwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgbigxMTEpLCBuKDEyOCksIG4oODkpLCBuKDEzMCk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNDMpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gci5TZXQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExMTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMTIpLCBpID0gbigxMTcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcignU2V0JywgZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA/IGUgOiB2b2lkIDApOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCBpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTEyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIGYgPSBuKDE0KSwgbCA9IG4oMjYpLCBwID0gbig4MCksIGcgPSBuKDMxKSwgYiA9IG4oMzIpLCB2ID0gbigxOCksIHkgPSBuKDgzKSwgaCA9IG4oMjcpLCBtID0gbig2NCksIFMgPSBuKDMzKS5mLCBBID0gbig1NikuZm9yRWFjaCwgRSA9IG4oMzApLCByID0gbig1NCksIE8gPSByLnNldCwgVCA9IHIuZ2V0dGVyRm9yOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKG4sIGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciwgYSwgaSA9IC0xICE9PSBuLmluZGV4T2YoJ01hcCcpLCBjID0gLTEgIT09IG4uaW5kZXhPZignV2VhaycpLCBvID0gaSA/ICdzZXQnIDogJ2FkZCcsIHUgPSBsW25dLCBzID0gdSAmJiB1LnByb3RvdHlwZSwgZCA9IHt9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBFICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHUgJiYgKGMgfHwgcy5mb3JFYWNoICYmICFnKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHUoKS5lbnRyaWVzKCkubmV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0pKSA/IChyID0gZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICBPKHkoZSwgciwgbiksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBuZXcgdSgpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBudWxsICE9IHQgJiYgdih0LCBlW29dLCBlLCBpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgYSA9IFQobiksIEEoWwogICAgICAgICAgICAgICAgICAgICAgICAnYWRkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NsZWFyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdmb3JFYWNoJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2dldCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdoYXMnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXMnLAogICAgICAgICAgICAgICAgICAgICAgICAndmFsdWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2VudHJpZXMnCiAgICAgICAgICAgICAgICAgICAgXSwgZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAnYWRkJyA9PSBpIHx8ICdzZXQnID09IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgaW4gcyAmJiAoIWMgfHwgJ2NsZWFyJyAhPSBpKSAmJiBiKHIucHJvdG90eXBlLCBpLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhKHRoaXMpLmNvbGxlY3Rpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW8gJiYgYyAmJiAhaChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2dldCcgPT0gaSAmJiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IG5baV0oMCA9PT0gZSA/IDAgOiBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID8gdGhpcyA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLCBjIHx8IFMoci5wcm90b3R5cGUsICdzaXplJywgewogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKHRoaXMpLmNvbGxlY3Rpb24uc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKSA6IChyID0gdC5nZXRDb25zdHJ1Y3RvcihlLCBuLCBpLCBvKSwgcC5SRVFVSVJFRCA9ICEwKSwgbShyLCBuLCAhMSwgITApLCBkW25dID0gciwgZih7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbDogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlZDogITAKICAgICAgICAgICAgICAgICAgICB9LCBkKSwgYyB8fCB0LnNldFN0cm9uZyhyLCBuLCBpKSwgcjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExMzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigzMSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAhcihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5pc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTE0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDYzKSwgaSA9IG4oNjIpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gciA/IHt9LnRvU3RyaW5nIDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnW29iamVjdCAnICsgaSh0aGlzKSArICddJzsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExNTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigyNiksIGkgPSBuKDExNiksIG8gPSByLldlYWtNYXA7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBvICYmIC9uYXRpdmUgY29kZS8udGVzdChpKG8pKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTE2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDc2KSwgaSA9IEZ1bmN0aW9uLnRvU3RyaW5nOwogICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygci5pbnNwZWN0U291cmNlICYmIChyLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmNhbGwoZSk7CiAgICAgICAgICAgICAgICB9KSwgZS5leHBvcnRzID0gci5pbnNwZWN0U291cmNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMTc6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcyA9IG4oMzMpLmYsIGQgPSBuKDg0KSwgZiA9IG4oMTIyKSwgbCA9IG4oMjQpLCBwID0gbig4MyksIGcgPSBuKDE4KSwgYSA9IG4oNjYpLCBjID0gbigxMjcpLCBiID0gbigzMCksIHYgPSBuKDgwKS5mYXN0S2V5LCByID0gbig1NCksIHkgPSByLnNldCwgaCA9IHIuZ2V0dGVyRm9yOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAoZSwgbiwgciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvID0gYyhlKSwgYSA9IHUoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA/IGEudmFsdWUgPSBuIDogKG8ubGFzdCA9IGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGkgPSB2KHQsICEwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXM6IHIgPSBvLmxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQ6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBvLmZpcnN0IHx8IChvLmZpcnN0ID0gYSksIHIgJiYgKHIubmV4dCA9IGEpLCBiID8gby5zaXplKysgOiBlLnNpemUrKywgJ0YnICE9PSBpICYmIChvLmluZGV4W2ldID0gYSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAoZSwgYSwgbiksIHkoZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogZChudWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3Q6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGIgfHwgKGUuc2l6ZSA9IDApLCBudWxsICE9IHQgJiYgZyh0LCBlW2ldLCBlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBjID0gaChuKSwgdSA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIgPSBjKGUpLCBpID0gdih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0YnICE9PSBpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pbmRleFtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSByLmZpcnN0OyBuOyBuID0gbi5uZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi5rZXkgPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoYS5wcm90b3R5cGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGModGhpcyksIHQgPSBlLmluZGV4LCBuID0gZS5maXJzdDsgbjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ucmVtb3ZlZCA9ICEwLCBuLnByZXZpb3VzICYmIChuLnByZXZpb3VzID0gbi5wcmV2aW91cy5uZXh0ID0gdm9pZCAwKSwgZGVsZXRlIHRbbi5pbmRleF0sIG4gPSBuLm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5maXJzdCA9IGUubGFzdCA9IHZvaWQgMCwgYiA/IGUuc2l6ZSA9IDAgOiB0aGlzLnNpemUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciA9IGModGhpcyksIGkgPSB1KHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpICYmICh0ID0gaS5uZXh0LCBuID0gaS5wcmV2aW91cywgZGVsZXRlIHIuaW5kZXhbaS5pbmRleF0sIGkucmVtb3ZlZCA9ICEwLCBuICYmIChuLm5leHQgPSB0KSwgdCAmJiAodC5wcmV2aW91cyA9IG4pLCByLmZpcnN0ID09IGkgJiYgKHIuZmlyc3QgPSB0KSwgci5sYXN0ID09IGkgJiYgKHIubGFzdCA9IG4pLCBiID8gci5zaXplLS0gOiB0aGlzLnNpemUtLSksICEhaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4sIHIgPSBjKHRoaXMpLCBpID0gbChlLCAxIDwgYXJndW1lbnRzLmxlbmd0aCA/IHQgOiB2b2lkIDAsIDMpOyBuID0gbiA/IG4ubmV4dCA6IHIuZmlyc3Q7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkobi52YWx1ZSwgbi5rZXksIHRoaXMpOyBuICYmIG4ucmVtb3ZlZDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbi5wcmV2aW91czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdSh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYoYS5wcm90b3R5cGUsIHIgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB1KHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHRoaXMsIDAgPT09IGUgPyAwIDogZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8odGhpcywgZSA9IDAgPT09IGUgPyAwIDogZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBiICYmIHMoYS5wcm90b3R5cGUsICdzaXplJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGModGhpcykuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSksIGE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdCArICcgSXRlcmF0b3InLCBpID0gaCh0KSwgbyA9IGgocik7CiAgICAgICAgICAgICAgICAgICAgICAgIGEoZSwgdCwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkodGhpcywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBpKGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IG8odGhpcyksIHQgPSBlLmtpbmQsIG4gPSBlLmxhc3Q7IG4gJiYgbi5yZW1vdmVkOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbi5wcmV2aW91czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRhcmdldCAmJiAoZS5sYXN0ID0gbiA9IG4gPyBuLm5leHQgOiBlLnN0YXRlLmZpcnN0KSA/ICdrZXlzJyA9PSB0ID8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuLmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6ICd2YWx1ZXMnID09IHQgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4udmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5rZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLnRhcmdldCA9IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA/ICdlbnRyaWVzJyA6ICd2YWx1ZXMnLCAhbiwgITApLCBjKHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExODogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigzMCksIGEgPSBuKDMzKSwgYyA9IG4oMTUpLCB1ID0gbigxMTkpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gciA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBjKGUpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4sIHIgPSB1KHQpLCBpID0gci5sZW5ndGgsIG8gPSAwOyBvIDwgaTspCiAgICAgICAgICAgICAgICAgICAgICAgIGEuZihlLCBuID0gcltvKytdLCB0W25dKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDExOTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMjApLCBpID0gbig4NSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByKGUsIGkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmEgPSBpLCB0LmMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhKCFlIHx8ICFlLnVybCk7CiAgICAgICAgICAgICAgICB9LCB0LmIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGUucmVuZGVyKHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciB1ID0gbigzOSksIHMgPSBuKDApLCByID0gbigxMCksIGQgPSBuLm4ociksIGYgPSAnb3V0c3RyZWFtJzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdGhpcywgciA9IGUudXJsLCBuID0gZS5jb25maWcsIGkgPSBlLmlkLCBvID0gZS5jYWxsYmFjaywgYSA9IGUubG9hZGVkLCBjID0gZS5hZFVuaXRDb2RlOwogICAgICAgICAgICAgICAgICAgIHRoaXMudXJsID0gciwgdGhpcy5jb25maWcgPSBuLCB0aGlzLmhhbmRsZXJzID0ge30sIHRoaXMuaWQgPSBpLCB0aGlzLmxvYWRlZCA9IGEsIHRoaXMuY21kID0gW10sIHRoaXMucHVzaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyB0LmxvYWRlZCA/IGUuY2FsbCgpIDogdC5jbWQucHVzaChlKSA6IHMubG9nRXJyb3IoJ0NvbW1hbmRzIGdpdmVuIHRvIFJlbmRlcmVyLnB1c2ggbXVzdCBiZSB3cmFwcGVkIGluIGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmNhbGxiYWNrID0gbyB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQubG9hZGVkID0gITAsIHQucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgIH0sIHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5fcmVuZGVyID8gdC5fcmVuZGVyLmFwcGx5KHQsIG4pIDogcy5sb2dXYXJuKCdObyByZW5kZXIgZnVuY3Rpb24gd2FzIHByb3ZpZGVkLCBwbGVhc2UgdXNlIC5zZXRSZW5kZXIgb24gdGhlIHJlbmRlcmVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLCBuID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcGJqcy5hZFVuaXRzLCBuID0gZCgpKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvZGUgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBzLmRlZXBBY2Nlc3MobiwgJ3JlbmRlcmVyJyksIGkgPSAhIShyICYmIHIudXJsICYmIHIucmVuZGVyKSwgbyA9IHMuZGVlcEFjY2VzcyhuLCAnbWVkaWFUeXBlcy52aWRlby5yZW5kZXJlcicpLCBhID0gISEobyAmJiBvLnVybCAmJiBvLnJlbmRlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoaSAmJiAhMCAhPT0gci5iYWNrdXBPbmx5IHx8IGEgJiYgITAgIT09IG8uYmFja3VwT25seSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0oYykgPyAodGhpcy5jbWQudW5zaGlmdChlKSwgT2JqZWN0KHUuYSkociwgZiwgdGhpcy5jYWxsYmFjaykpIDogKHMubG9nV2FybignRXh0ZXJuYWwgSnMgbm90IGxvYWRlZCBieSBSZW5kZXJlciBzaW5jZSByZW5kZXJlciB1cmwgYW5kIGNhbGxiYWNrIGlzIGFscmVhZHkgZGVmaW5lZCBvbiBhZFVuaXQgJy5jb25jYXQoYykpLCBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkuaW5zdGFsbCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBlLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBlLmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBlLmNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGUubG9hZGVkLAogICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBlLmFkVW5pdENvZGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmdldENvbmZpZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7CiAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5zZXRSZW5kZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlciA9IGU7CiAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5zZXRFdmVudEhhbmRsZXJzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZXJzID0gZTsKICAgICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLmhhbmRsZVZpZGVvRXZlbnQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5pZCwgbiA9IGUuZXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIHRoaXMuaGFuZGxlcnNbbl0gJiYgdGhpcy5oYW5kbGVyc1tuXSgpLCBzLmxvZ01lc3NhZ2UoJ1ByZWJpZCBSZW5kZXJlciBldmVudCBmb3IgaWQgJy5jb25jYXQodCwgJyB0eXBlICcpLmNvbmNhdChuKSk7CiAgICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZvciAoOyAwIDwgdGhpcy5jbWQubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY21kLnNoaWZ0KCkuY2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmxvZ0Vycm9yKCdFcnJvciBwcm9jZXNzaW5nIFJlbmRlcmVyIGNvbW1hbmQ6ICcsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMjA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgYSA9IG4oMjgpLCBjID0gbig0NyksIHUgPSBuKDc4KS5pbmRleE9mLCBzID0gbig1Myk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gYyhlKSwgaSA9IDAsIG8gPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKG4gaW4gcikKICAgICAgICAgICAgICAgICAgICAgICAgIWEocywgbikgJiYgYShyLCBuKSAmJiBvLnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgZm9yICg7IHQubGVuZ3RoID4gaTspCiAgICAgICAgICAgICAgICAgICAgICAgIGEociwgbiA9IHRbaSsrXSkgJiYgKH51KG8sIG4pIHx8IG8ucHVzaChuKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMjE6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjkpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcignZG9jdW1lbnQnLCAnZG9jdW1lbnRFbGVtZW50Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEyMjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciBpID0gbig4Nik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiBuLnVuc2FmZSAmJiBlW3JdID8gZVtyXSA9IHRbcl0gOiBpKGUsIHIsIHRbcl0sIG4pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTIzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBvID0gbig4NykuSXRlcmF0b3JQcm90b3R5cGUsIGEgPSBuKDg0KSwgYyA9IG4oNDYpLCB1ID0gbig2NCksIHMgPSBuKDQwKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0ICsgJyBJdGVyYXRvcic7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucHJvdG90eXBlID0gYShvLCB7IG5leHQ6IGMoMSwgbikgfSksIHUoZSwgciwgITEsICEwKSwgc1tyXSA9IGksIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMjQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzEpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gIXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IG51bGwsIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgZSgpKSAhPT0gZS5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTI1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDE1KSwgbyA9IG4oMTI2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIgPSAhMSwgZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChuID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0KS5jYWxsKGUsIFtdKSwgciA9IGUgaW5zdGFuY2VvZiBBcnJheTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlKSwgbyh0KSwgciA/IG4uY2FsbChlLCB0KSA6IGUuX19wcm90b19fID0gdCwgZTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSgpIDogdm9pZCAwKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTI2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI3KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyKGUpICYmIG51bGwgIT09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignQ2FuXCd0IHNldCAnICsgU3RyaW5nKGUpICsgJyBhcyBhIHByb3RvdHlwZScpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTI3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI5KSwgaSA9IG4oMzMpLCBvID0gbigyMiksIGEgPSBuKDMwKSwgYyA9IG8oJ3NwZWNpZXMnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSByKGUpLCBuID0gaS5mOwogICAgICAgICAgICAgICAgICAgIGEgJiYgdCAmJiAhdFtjXSAmJiBuKHQsIGMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTI4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICB9LAogICAgICAgICAgICAxMjk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIsIGkgPSBTdHJpbmcocyhlKSksIG8gPSB1KHQpLCBhID0gaS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvIDwgMCB8fCBhIDw9IG8gPyBjID8gJycgOiB2b2lkIDAgOiAobiA9IGkuY2hhckNvZGVBdChvKSkgPCA1NTI5NiB8fCA1NjMxOSA8IG4gfHwgbyArIDEgPT09IGEgfHwgKHIgPSBpLmNoYXJDb2RlQXQobyArIDEpKSA8IDU2MzIwIHx8IDU3MzQzIDwgciA/IGMgPyBpLmNoYXJBdChvKSA6IG4gOiBjID8gaS5zbGljZShvLCBvICsgMikgOiByIC0gNTYzMjAgKyAobiAtIDU1Mjk2IDw8IDEwKSArIDY1NTM2OwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdSA9IG4oNTgpLCBzID0gbig0OSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgY29kZUF0OiByKCExKSwKICAgICAgICAgICAgICAgICAgICBjaGFyQXQ6IHIoITApCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigxMDcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTMwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgbigxMzEpOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDEzMiksIGkgPSBuKDI2KSwgbyA9IG4oNjIpLCBhID0gbigzMiksIGMgPSBuKDQwKSwgdSA9IG4oMjIpKCd0b1N0cmluZ1RhZycpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcyBpbiByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBpW3NdLCBmID0gZCAmJiBkLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICBmICYmIG8oZikgIT09IHUgJiYgYShmLCB1LCBzKSwgY1tzXSA9IGMuQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEzMTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbig0NyksIGkgPSBuKDUxKSwgbyA9IG4oNDApLCBhID0gbig1NCksIGMgPSBuKDY2KSwgdSA9ICdBcnJheSBJdGVyYXRvcicsIHMgPSBhLnNldCwgZCA9IGEuZ2V0dGVyRm9yKHUpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gYyhBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBzKHRoaXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiByKGUpLAogICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogMCwKICAgICAgICAgICAgICAgICAgICAgICAga2luZDogdAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gZCh0aGlzKSwgdCA9IGUudGFyZ2V0LCBuID0gZS5raW5kLCByID0gZS5pbmRleCsrOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhdCB8fCByID49IHQubGVuZ3RoID8gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS50YXJnZXQgPSB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSA6ICdrZXlzJyA9PSBuID8gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITEKICAgICAgICAgICAgICAgICAgICB9IDogJ3ZhbHVlcycgPT0gbiA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRbcl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgfSA6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W3JdCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0sICd2YWx1ZXMnKSwgby5Bcmd1bWVudHMgPSBvLkFycmF5LCBpKCdrZXlzJyksIGkoJ3ZhbHVlcycpLCBpKCdlbnRyaWVzJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEzMjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBDU1NSdWxlTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLAogICAgICAgICAgICAgICAgICAgIENTU1ZhbHVlTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBDbGllbnRSZWN0TGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBET01SZWN0TGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBET01TdHJpbmdMaXN0OiAwLAogICAgICAgICAgICAgICAgICAgIERPTVRva2VuTGlzdDogMSwKICAgICAgICAgICAgICAgICAgICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBGaWxlTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBIVE1MQWxsQ29sbGVjdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICBIVE1MQ29sbGVjdGlvbjogMCwKICAgICAgICAgICAgICAgICAgICBIVE1MRm9ybUVsZW1lbnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgSFRNTFNlbGVjdEVsZW1lbnQ6IDAsCiAgICAgICAgICAgICAgICAgICAgTWVkaWFMaXN0OiAwLAogICAgICAgICAgICAgICAgICAgIE1pbWVUeXBlQXJyYXk6IDAsCiAgICAgICAgICAgICAgICAgICAgTmFtZWROb2RlTWFwOiAwLAogICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0OiAxLAogICAgICAgICAgICAgICAgICAgIFBhaW50UmVxdWVzdExpc3Q6IDAsCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luOiAwLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkFycmF5OiAwLAogICAgICAgICAgICAgICAgICAgIFNWR0xlbmd0aExpc3Q6IDAsCiAgICAgICAgICAgICAgICAgICAgU1ZHTnVtYmVyTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBTVkdQYXRoU2VnTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBTVkdQb2ludExpc3Q6IDAsCiAgICAgICAgICAgICAgICAgICAgU1ZHU3RyaW5nTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBTVkdUcmFuc2Zvcm1MaXN0OiAwLAogICAgICAgICAgICAgICAgICAgIFNvdXJjZUJ1ZmZlckxpc3Q6IDAsCiAgICAgICAgICAgICAgICAgICAgU3R5bGVTaGVldExpc3Q6IDAsCiAgICAgICAgICAgICAgICAgICAgVGV4dFRyYWNrQ3VlTGlzdDogMCwKICAgICAgICAgICAgICAgICAgICBUZXh0VHJhY2tMaXN0OiAwLAogICAgICAgICAgICAgICAgICAgIFRvdWNoTGlzdDogMAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTMzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgbigxNCkoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1NldCcsCiAgICAgICAgICAgICAgICAgICAgc3RhdDogITAKICAgICAgICAgICAgICAgIH0sIHsgZnJvbTogbigxMzQpIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMzQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgcyA9IG4oMjEpLCBkID0gbigyNCksIGYgPSBuKDE4KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGksIG8sIGEsIGMgPSBhcmd1bWVudHMubGVuZ3RoLCB1ID0gMSA8IGMgPyB0IDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHRoaXMpLCAociA9IHZvaWQgMCAhPT0gdSkgJiYgcyh1KSwgbnVsbCA9PSBlID8gbmV3IHRoaXMoKSA6IChpID0gW10sIHIgPyAobyA9IDAsIGEgPSBkKHUsIDIgPCBjID8gbiA6IHZvaWQgMCwgMiksIGYoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKGEoZSwgbysrKSk7CiAgICAgICAgICAgICAgICAgICAgfSkpIDogZihlLCBpLnB1c2gsIGkpLCBuZXcgdGhpcyhpKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMzU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBuKDE0KSh7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBzdGF0OiAhMAogICAgICAgICAgICAgICAgfSwgeyBvZjogbigxMzYpIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxMzY6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIHQgPSBuZXcgQXJyYXkoZSk7IGUtLTspCiAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0gPSBhcmd1bWVudHNbZV07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTM3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigxMzgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgYWRkQWxsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDEzODogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciBpID0gbigxNSksIG8gPSBuKDIxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gaSh0aGlzKSwgdCA9IG8oZS5hZGQpLCBuID0gMCwgciA9IGFyZ3VtZW50cy5sZW5ndGg7IG4gPCByOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHQuY2FsbChlLCBhcmd1bWVudHNbbl0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTM5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigxNDApOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlQWxsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24geShyKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyByKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcihlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcihlLCB0LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wcm90b3R5cGUgPSByLnByb3RvdHlwZSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBoID0gbigyNiksIG0gPSBuKDEwMCkuZiwgUyA9IG4oMTAyKSwgQSA9IG4oNDMpLCBFID0gbigyNCksIE8gPSBuKDMyKSwgVCA9IG4oMjgpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgaSwgbywgYSwgYywgdSwgcywgZCA9IGUudGFyZ2V0LCBmID0gZS5nbG9iYWwsIGwgPSBlLnN0YXQsIHAgPSBlLnByb3RvLCBnID0gZiA/IGggOiBsID8gaFtkXSA6IChoW2RdIHx8IHt9KS5wcm90b3R5cGUsIGIgPSBmID8gQSA6IEFbZF0gfHwgKEFbZF0gPSB7fSksIHYgPSBiLnByb3RvdHlwZTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gdCkKICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICFTKGYgPyBpIDogZCArIChsID8gJy4nIDogJyMnKSArIGksIGUuZm9yY2VkKSAmJiBnICYmIFQoZywgaSksIGEgPSBiW2ldLCBuICYmIChjID0gZS5ub1RhcmdldEdldCA/IChzID0gbShnLCBpKSkgJiYgcy52YWx1ZSA6IGdbaV0pLCBvID0gbiAmJiBjID8gYyA6IHRbaV0sIG4gJiYgdHlwZW9mIGEgPT0gdHlwZW9mIG8gfHwgKHUgPSBlLmJpbmQgJiYgbiA/IEUobywgaCkgOiBlLndyYXAgJiYgbiA/IHkobykgOiBwICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIG8gPyBFKEZ1bmN0aW9uLmNhbGwsIG8pIDogbywgKGUuc2hhbSB8fCBvICYmIG8uc2hhbSB8fCBhICYmIGEuc2hhbSkgJiYgTyh1LCAnc2hhbScsICEwKSwgYltpXSA9IHUsIHAgJiYgKFQoQSwgciA9IGQgKyAnUHJvdG90eXBlJykgfHwgTyhBLCByLCB7fSksIEFbcl1baV0gPSBvLCBlLnJlYWwgJiYgdiAmJiAhdltpXSAmJiBPKHYsIGksIG8pKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNDA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgYSA9IG4oMTUpLCBjID0gbigyMSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSwgdCA9IGEodGhpcyksIG4gPSBjKHQuZGVsZXRlKSwgciA9ICEwLCBpID0gMCwgbyA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBvOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBuLmNhbGwodCwgYXJndW1lbnRzW2ldKSwgciA9IHIgJiYgZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFyOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTQxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigxNSksIGEgPSBuKDI0KSwgYyA9IG4oMzcpLCB1ID0gbigxOCk7CiAgICAgICAgICAgICAgICByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdTZXQnLAogICAgICAgICAgICAgICAgICAgIHByb3RvOiAhMCwKICAgICAgICAgICAgICAgICAgICByZWFsOiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6IGkKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBldmVyeTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvKHRoaXMpLCByID0gYyhuKSwgaSA9IGEoZSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1KHIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkoZSwgZSwgbikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUuc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB2b2lkIDAsICExLCAhMCkuc3RvcHBlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTQyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigyOSksIGEgPSBuKDE1KSwgYyA9IG4oMjEpLCB1ID0gbig0MSksIHMgPSBuKDE4KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1NldCcsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIHJlYWw6ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogaQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYSh0aGlzKSwgbiA9IG5ldyAodSh0LCBvKCdTZXQnKSkpKHQpLCByID0gYyhuLmRlbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGwobiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNDM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTQpLCBpID0gbigxNiksIGMgPSBuKDI5KSwgdSA9IG4oMTUpLCBzID0gbigyMSksIGQgPSBuKDI0KSwgZiA9IG4oNDEpLCBsID0gbigzNyksIHAgPSBuKDE4KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1NldCcsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIHJlYWw6ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogaQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1KHRoaXMpLCByID0gbChuKSwgaSA9IGQoZSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCAzKSwgbyA9IG5ldyAoZihuLCBjKCdTZXQnKSkpKCksIGEgPSBzKG8uYWRkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkoZSwgZSwgbikgJiYgYS5jYWxsKG8sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB2b2lkIDAsICExLCAhMCksIG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE0NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMTUpLCBhID0gbigyNCksIGMgPSBuKDM3KSwgdSA9IG4oMTgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgZmluZDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvKHRoaXMpLCByID0gYyhuKSwgaSA9IGEoZSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKGUsIGUsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LnN0b3AoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZvaWQgMCwgITEsICEwKS5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE0NTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMjkpLCBhID0gbigxNSksIGMgPSBuKDIxKSwgdSA9IG4oNDEpLCBzID0gbigxOCk7CiAgICAgICAgICAgICAgICByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdTZXQnLAogICAgICAgICAgICAgICAgICAgIHByb3RvOiAhMCwKICAgICAgICAgICAgICAgICAgICByZWFsOiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6IGkKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYSh0aGlzKSwgbiA9IG5ldyAodSh0LCBvKCdTZXQnKSkpKCksIHIgPSBjKHQuaGFzKSwgaSA9IGMobi5hZGQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5jYWxsKHQsIGUpICYmIGkuY2FsbChuLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE0NjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMTUpLCBhID0gbigyMSksIGMgPSBuKDE4KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1NldCcsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIHJlYWw6ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogaQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGlzRGlzam9pbnRGcm9tOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG8odGhpcyksIG4gPSBhKHQuaGFzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITAgPT09IG4uY2FsbCh0LCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnN0b3BwZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE0NzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMjkpLCBhID0gbigxNSksIGMgPSBuKDIxKSwgdSA9IG4oOTApLCBzID0gbigxOCk7CiAgICAgICAgICAgICAgICByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdTZXQnLAogICAgICAgICAgICAgICAgICAgIHByb3RvOiAhMCwKICAgICAgICAgICAgICAgICAgICByZWFsOiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6IGkKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBpc1N1YnNldE9mOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHUodGhpcyksIG4gPSBhKGUpLCByID0gbi5oYXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZnVuY3Rpb24nICE9IHR5cGVvZiByICYmIChuID0gbmV3IChvKCdTZXQnKSkoZSksIHIgPSBjKG4uaGFzKSksICFzKHQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITEgPT09IHIuY2FsbChuLCBlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZvaWQgMCwgITEsICEwKS5zdG9wcGVkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNDg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTQpLCBpID0gbigxNiksIG8gPSBuKDE1KSwgYSA9IG4oMjEpLCBjID0gbigxOCk7CiAgICAgICAgICAgICAgICByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdTZXQnLAogICAgICAgICAgICAgICAgICAgIHByb3RvOiAhMCwKICAgICAgICAgICAgICAgICAgICByZWFsOiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6IGkKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBpc1N1cGVyc2V0T2Y6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbyh0aGlzKSwgbiA9IGEodC5oYXMpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWMoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMSA9PT0gbi5jYWxsKHQsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuc3RvcHBlZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTQ5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigxNSksIGEgPSBuKDM3KSwgYyA9IG4oMTgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgam9pbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBvKHRoaXMpLCBuID0gYSh0KSwgciA9IHZvaWQgMCA9PT0gZSA/ICcsJyA6IFN0cmluZyhlKSwgaSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhuLCBpLnB1c2gsIGksICExLCAhMCksIGkuam9pbihyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXIoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihTdHJpbmcoZSkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE1MDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgYyA9IG4oMjkpLCB1ID0gbigxNSksIHMgPSBuKDIxKSwgZCA9IG4oMjQpLCBmID0gbig0MSksIGwgPSBuKDM3KSwgcCA9IG4oMTgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgbWFwOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHUodGhpcyksIHIgPSBsKG4pLCBpID0gZChlLCAxIDwgYXJndW1lbnRzLmxlbmd0aCA/IHQgOiB2b2lkIDAsIDMpLCBvID0gbmV3IChmKG4sIGMoJ1NldCcpKSkoKSwgYSA9IHMoby5hZGQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcChyLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5jYWxsKG8sIGkoZSwgZSwgbikpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB2b2lkIDAsICExLCAhMCksIG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE1MTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgYSA9IG4oMTUpLCBjID0gbigyMSksIHUgPSBuKDM3KSwgcyA9IG4oMTgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgcmVkdWNlOiBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGEodGhpcyksIHIgPSB1KG4pLCBpID0gYXJndW1lbnRzLmxlbmd0aCA8IDIsIG8gPSBpID8gdm9pZCAwIDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGModCksIHMociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gaSA/IChpID0gITEsIGUpIDogdChvLCBlLCBlLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHZvaWQgMCwgITEsICEwKSwgaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IHNldCB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE1MjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMTUpLCBhID0gbigyNCksIGMgPSBuKDM3KSwgdSA9IG4oMTgpOwogICAgICAgICAgICAgICAgcih7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnU2V0JywKICAgICAgICAgICAgICAgICAgICBwcm90bzogITAsCiAgICAgICAgICAgICAgICAgICAgcmVhbDogITAsCiAgICAgICAgICAgICAgICAgICAgZm9yY2VkOiBpCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgc29tZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBvKHRoaXMpLCByID0gYyhuKSwgaSA9IGEoZSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKGUsIGUsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgdm9pZCAwLCAhMSwgITApLnN0b3BwZWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE1MzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDE2KSwgbyA9IG4oMjkpLCBhID0gbigxNSksIGMgPSBuKDIxKSwgdSA9IG4oNDEpLCBzID0gbigxOCk7CiAgICAgICAgICAgICAgICByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdTZXQnLAogICAgICAgICAgICAgICAgICAgIHByb3RvOiAhMCwKICAgICAgICAgICAgICAgICAgICByZWFsOiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6IGkKICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICBzeW1tZXRyaWNEaWZmZXJlbmNlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGEodGhpcyksIG4gPSBuZXcgKHUodCwgbygnU2V0JykpKSh0KSwgciA9IGMobi5kZWxldGUpLCBpID0gYyhuLmFkZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmNhbGwobiwgZSkgfHwgaS5jYWxsKG4sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTU0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTYpLCBvID0gbigyOSksIGEgPSBuKDE1KSwgYyA9IG4oMjEpLCB1ID0gbig0MSksIHMgPSBuKDE4KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1NldCcsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIHJlYWw6ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogaQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIHVuaW9uOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGEodGhpcyksIG4gPSBuZXcgKHUodCwgbygnU2V0JykpKSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSwgYyhuLmFkZCksIG4pLCBuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNTU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBuKDg5KSwgbigxNTYpOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDQzKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIuQXJyYXkuZnJvbTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTU2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oMTU3KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ0FycmF5JywKICAgICAgICAgICAgICAgICAgICBzdGF0OiAhMCwKICAgICAgICAgICAgICAgICAgICBmb3JjZWQ6ICFuKDE1OSkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgfSwgeyBmcm9tOiBpIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNTc6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgdiA9IG4oMjQpLCB5ID0gbig1NyksIGggPSBuKDgyKSwgbSA9IG4oODEpLCBTID0gbig1MCksIEEgPSBuKDE1OCksIEUgPSBuKDYxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGksIG8sIGEsIGMsIHUsIHMgPSB5KGUpLCBkID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdGhpcyA/IHRoaXMgOiBBcnJheSwgZiA9IGFyZ3VtZW50cy5sZW5ndGgsIGwgPSAxIDwgZiA/IHQgOiB2b2lkIDAsIHAgPSB2b2lkIDAgIT09IGwsIGcgPSBFKHMpLCBiID0gMDsKICAgICAgICAgICAgICAgICAgICBpZiAocCAmJiAobCA9IHYobCwgMiA8IGYgPyBuIDogdm9pZCAwLCAyKSksIG51bGwgPT0gZyB8fCBkID09IEFycmF5ICYmIG0oZykpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IG5ldyBkKHIgPSBTKHMubGVuZ3RoKSk7IGIgPCByOyBiKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gcCA/IGwoc1tiXSwgYikgOiBzW2JdLCBBKGksIGIsIHUpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gKGEgPSBnLmNhbGwocykpLm5leHQsIGkgPSBuZXcgZCgpOyAhKG8gPSBjLmNhbGwoYSkpLmRvbmU7IGIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBwID8gaChhLCBsLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCAhMCkgOiBvLnZhbHVlLCBBKGksIGIsIHUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmxlbmd0aCA9IGIsIGk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNTg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oNTUpLCBvID0gbigzMyksIGEgPSBuKDQ2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBpKHQpOwogICAgICAgICAgICAgICAgICAgIHIgaW4gZSA/IG8uZihlLCByLCBhKDAsIG4pKSA6IGVbcl0gPSBuOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTU5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDIyKSgnaXRlcmF0b3InKSwgbyA9ICExOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDAsIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogISFyKysgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYVtpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgfSwgQXJyYXkuZnJvbShhLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IDI7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmICghdCAmJiAhbykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0gITE7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcltpXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiBuID0gITAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlKHIpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9ICEwOwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNjA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiBlKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IEFycmF5LmlzQXJyYXkodCkgPyBbXSA6IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgaW4gdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IHRbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBpICYmICdvYmplY3QnID09IHR5cGVvZiBpID8gZShpKSA6IGk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTYxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5hID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHQgPSB0LnNwbGl0ID8gdC5zcGxpdCgnLicpIDogdCwgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICBlID0gZSA/IGVbdFtyXV0gOiBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID09PSBpID8gbiA6IGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAxNjI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmEgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHQuc3BsaXQgJiYgKHQgPSB0LnNwbGl0KCcuJykpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIsIGkgPSAwLCBvID0gdC5sZW5ndGgsIGEgPSBlOyBpIDwgbzsgKytpKQogICAgICAgICAgICAgICAgICAgICAgICByID0gYVt0W2ldXSwgYSA9IGFbdFtpXV0gPSBpID09PSBvIC0gMSA/IG4gOiBudWxsICE9IHIgPyByIDogIX50W2kgKyAxXS5pbmRleE9mKCcuJykgJiYgLTEgPCArdFtpICsgMV0gPyBbXSA6IHt9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMTYzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgaC5TWU5DID0gMSwgaC5BU1lOQyA9IDIsIGguUVVFVUUgPSA0OwogICAgICAgICAgICAgICAgdmFyIGcgPSAnZnVuLWhvb2tzJzsKICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByb3h5OiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHk6IDAKICAgICAgICAgICAgICAgICAgICB9KSwgYiA9IG5ldyBXZWFrTWFwKCksIHIgPSAnMiwxLDAnID09PSBbMV0ucmVkdWNlKGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4KICAgICAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgICAgICB9LCAyKS50b1N0cmluZygpID8gQXJyYXkucHJvdG90eXBlLnJlZHVjZSA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gT2JqZWN0KHRoaXMpLCBpID0gci5sZW5ndGggPj4+IDAsIG8gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBvIDwgaSAmJiAhKG8gaW4gcik7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSByW28rK107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IG8gPCBpOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gaW4gciAmJiAobiA9IGUobiwgcltvXSwgbywgcikpLCBvKys7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwgdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5jYWxsKHYoYXJndW1lbnRzLCAxKSwgZnVuY3Rpb24gKHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlXSA9IG5bZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgodSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzLCBlID0ge30sIGQgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBmLmNhbGwobnVsbCwgJ3N5bmMnLCBlLCB0KSA6ICdzdHJpbmcnID09IHR5cGVvZiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgPyBmLmFwcGx5KG51bGwsIGFyZ3VtZW50cykgOiAnb2JqZWN0JyA9PSB0eXBlb2YgZSA/IGZ1bmN0aW9uIChvLCBlLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlICYmIChlID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobyksIHQgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9LCBuID0gWydjb25zdHJ1Y3RvciddOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IChlID0gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ2Z1bmN0aW9uJyAhPSB0eXBlb2Ygb1tlXSB8fCAtMSAhPT0gbi5pbmRleE9mKGUpIHx8IGUubWF0Y2goL15fLykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gZS5zcGxpdCgnOicpLCByID0gblswXSwgaSA9IG5bMV0gfHwgJ3N5bmMnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW3JdIHx8ICh0ID0gb1tyXSwgY1tyXSA9IG9bcl0gPSBmKGksIHQsIGEgPyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIDogdm9pZCAwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YobyksIHQgJiYgbzspOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkobnVsbCwgYXJndW1lbnRzKSA6IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbChvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gQXJyYXkuaXNBcnJheShvKSA/IG8gOiBvLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoYSwgZnVuY3Rpb24gKHQsIG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdFtuXSwgaSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgfHwgKGUgPT09IGEubGVuZ3RoIC0gMSA/IChzIHx8IGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSB8fCBjb25zb2xlLndhcm4oZyArICc6IHJlZmVyZW5jZWQgXCcnICsgbyArICdcJyBidXQgaXQgd2FzIG5ldmVyIGNyZWF0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0W25dID0gcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbbl0gPSBlLCBpID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiB0W25dID0ge30pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW10sIGEgPSBbXSwgYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKHRoaXMsIG8sICdiZWZvcmUnLCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5jYWxsKHRoaXMsIGEsICdhZnRlcicsIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SG9va3M6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gby5jb25jYXQoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiBuICYmIChlID0gZS5maWx0ZXIoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhuKS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdID09PSBuW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkoZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3IgYWRkaW5nIGByZW1vdmVgIHRvIGFycmF5LCBkaWQgeW91IG1vZGlmeSBBcnJheS5wcm90b3R5cGU/Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVBbGw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SG9va3MoKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGw6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IGUsIChjID0gbikobywgYSksIHIgJiYgcih0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5zZXQoZS5hZnRlciwgdCksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4odCwgZSwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9vazogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiByIHx8IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHQuaW5kZXhPZihpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIT09IGUgJiYgKHQuc3BsaWNlKGUsIDEpLCBjKG8sIGEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHVzaChpKSwgdC5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHJpb3JpdHkgLSBlLnByaW9yaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGMobywgYSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZihmLCBlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5hZnRlciAmJiBiLmdldChlLmFmdGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLnR5cGUgIT09IGYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZyArICc6IHJlY3JlYXRlZCBob29rYWJsZSB3aXRoIGRpZmZlcmVudCB0eXBlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvID0gdCA/IGwodCkgOiBwKCksIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1t0XSB8fCBSZWZsZWN0LmdldC5hcHBseShSZWZsZWN0LCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzIHx8IGQucHVzaChjKSwgdS51c2VQcm94eSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBQcm94eSAmJiBQcm94eS5yZXZvY2FibGUgPyBpID0gbmV3IFByb3h5KGUsIGEpIDogeShpID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuYXBwbHkgPyBhLmFwcGx5KGUsIHRoaXMsIHYoYXJndW1lbnRzKSkgOiBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8pLCBiLmdldChpLmFmdGVyKS5pbnN0YWxsKGYsIGksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcywgZCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGUubGVuZ3RoIHx8IHQubGVuZ3RoID8gKGUuZm9yRWFjaChuKSwgcyA9IGQucHVzaCh2b2lkIDApIC0gMSwgdC5mb3JFYWNoKG4pLCBmdW5jdGlvbiAobiwgciwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gMCwgYSA9ICdhc3luYycgPT09IGYgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZVtlLmxlbmd0aCAtIDFdICYmIGUucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeW5jJyA9PT0gZiA/IGkgPSBlIDogYSAmJiBhLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFtvXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2KGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5iYWlsID0gYywgdC51bnNoaWZ0KHUpLCBkW28rK10uYXBwbHkociwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5bmMnID09PSBmID8gaSA9IGUgOiBhICYmIGEuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbc10gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdihhcmd1bWVudHMsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXN5bmMnID09PSBmICYmIGEgJiYgKGRlbGV0ZSB1LmJhaWwsIGUucHVzaCh1KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbi5hcHBseShyLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5bmMnID09PSBmICYmIHUodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdS5hcHBseShudWxsLCBlKSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5wdXNoKGUuaG9vayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXMgJiYgKCdzeW5jJyAhPT0gZiB8fCB1LnJlYWR5ICYgaC5TWU5DKSAmJiAoJ2FzeW5jJyAhPT0gZiB8fCB1LnJlYWR5ICYgaC5BU1lOQykgPyAnc3luYycgIT09IGYgJiYgdS5yZWFkeSAmIGguUVVFVUUgPyBhLmFwcGx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYXBwbHkoZVsxXSwgZVsyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogYS5hcHBseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBnICsgJzogaG9va2VkIGZ1bmN0aW9uIG5vdCByZWFkeSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogYS5hcHBseSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1ID0geSh7fSwgbiwgdSkpLnJlYWR5ID8gdC5yZWFkeSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICEwLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdDsgdCA9IGUuc2hpZnQoKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGQpOwogICAgICAgICAgICAgICAgICAgIH0gOiBzID0gITAsIHQuZ2V0ID0gbCwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGg7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5hID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cucGJqczsKICAgICAgICAgICAgICAgIH0sIHdpbmRvdy5wYmpzID0gd2luZG93LnBianMgfHwge30sIHdpbmRvdy5wYmpzLmNtZCA9IHdpbmRvdy5wYmpzLmNtZCB8fCBbXSwgd2luZG93LnBianMucXVlID0gd2luZG93LnBianMucXVlIHx8IFtdLCB3aW5kb3cuX3BianNHbG9iYWxzID0gd2luZG93Ll9wYmpzR2xvYmFscyB8fCBbXSwgd2luZG93Ll9wYmpzR2xvYmFscy5wdXNoKCdwYmpzJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDE4OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wcGVkID0gZSwgdGhpcy5yZXN1bHQgPSB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGcgPSBuKDE1KSwgYiA9IG4oODEpLCB2ID0gbig1MCksIHkgPSBuKDI0KSwgaCA9IG4oNjEpLCBtID0gbig4Mik7CiAgICAgICAgICAgICAgICAoZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgYywgdSwgcywgZCwgZiwgbCA9IHkodCwgbiwgciA/IDIgOiAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGU7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiAoYSA9IGgoZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdUYXJnZXQgaXMgbm90IGl0ZXJhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwLCB1ID0gdihlLmxlbmd0aCk7IGMgPCB1OyBjKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzID0gciA/IGwoZyhmID0gZVtjXSlbMF0sIGZbMV0pIDogbChlW2NdKSkgJiYgcyBpbnN0YW5jZW9mIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBwKCExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvID0gYS5jYWxsKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSBvLm5leHQ7ICEoZiA9IGQuY2FsbChvKSkuZG9uZTspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgKHMgPSBtKG8sIGwsIGYudmFsdWUsIHIpKSAmJiBzICYmIHMgaW5zdGFuY2VvZiBwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBwKCExKTsKICAgICAgICAgICAgICAgIH0pLnN0b3AgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcCghMCwgZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9ICduYXRpdmUnLCBpID0gJ3ZpZGVvJywgbyA9ICdiYW5uZXInLCBhID0gJ2FkcG9kJzsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQodCwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBoID0gbigzKSwgbSA9IG4oMCk7CiAgICAgICAgICAgICAgICB2YXIgUywgciA9IChTID0gd2luZG93LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0ID0gW10sIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5sb2NhdGlvbi5hbmNlc3Rvck9yaWdpbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmxvY2F0aW9uLmFuY2VzdG9yT3JpZ2luczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShTKSwgciA9IGguYi5nZXRDb25maWcoJ21heE5lc3RlZElmcmFtZXMnKSwgaSA9ICExLCBvID0gMCwgYSA9ICExLCBjID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB1LCBzLCBkID0gYiwgZiA9IGMsIGwgPSB2b2lkIDAsIHAgPSAhMSwgZyA9IG51bGwsIGMgPSAhMSwgYiA9IGIgPyBiLnBhcmVudCA6IFM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBiLmxvY2F0aW9uLmhyZWYgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IGQuY29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBnID0gdi5zb3VyY2VVcmwsIGEgPSAhMCwgYiA9PT0gUy50b3AgJiYgKGkgPSAhMCksIHYuY2Fub25pY2FsVXJsICYmIChlID0gdi5jYW5vbmljYWxVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QobS5sb2dXYXJuKSgnVHJ5aW5nIHRvIGFjY2VzcyBjcm9zcyBkb21haW4gaWZyYW1lLiBDb250aW51aW5nIHdpdGhvdXQgcmVmZXJyZXIgYW5kIGxvY2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeSA9IGQuZG9jdW1lbnQucmVmZXJyZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICYmIChnID0geSwgYiA9PT0gUy50b3AgJiYgKGkgPSAhMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWcgJiYgbiAmJiBuW28gLSAxXSAmJiAoZyA9IG5bbyAtIDFdKSwgZyAmJiAhYSAmJiAocyA9IGcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICYmIChzID0gZyA9IGwsIGEgPSAhMSwgYiA9PT0gUy50b3AgJiYgKGkgPSAhMCwgKHUgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwnY2Fub25pY2FsXCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5ocmVmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShiLmRvY3VtZW50KSkgJiYgKGUgPSB1KSkpLCBiLmNvbnRleHQgJiYgYi5jb250ZXh0LnNvdXJjZVVybCAmJiAoYyA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaChnKSwgbysrOwogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChiICE9PSBTLnRvcCAmJiBvIDwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnJldmVyc2UoKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlcjogcyB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhY2hlZFRvcDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW1wOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSWZyYW1lczogbyAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjazogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm9uaWNhbFVybDogZSB8fCBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDIxOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhlKSArICcgaXMgbm90IGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDIyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI2KSwgaSA9IG4oNzUpLCBvID0gbigyOCksIGEgPSBuKDU5KSwgYyA9IG4oNzcpLCB1ID0gbigxMDYpLCBzID0gaSgnd2tzJyksIGQgPSByLlN5bWJvbCwgZiA9IHUgPyBkIDogZCAmJiBkLndpdGhvdXRTZXR0ZXIgfHwgYTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8ocywgZSkgfHwgKGMgJiYgbyhkLCBlKSA/IHNbZV0gPSBkW2VdIDogc1tlXSA9IGYoJ1N5bWJvbC4nICsgZSkpLCBzW2VdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQodCwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbigwKSwgcyA9IG4oMzUpLCBpID0gbigxMCksIG8gPSBuLm4oaSksIGEgPSBuKDUpOwogICAgICAgICAgICAgICAgdmFyIGQsIGMsIHUgPSAoZCA9IFtdLCAoYyA9IHt9KS5hZGRXaW5uaW5nQmlkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBvKCkoZCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF1Y3Rpb25JZCgpID09PSB0LmF1Y3Rpb25JZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUgPyAodC5zdGF0dXMgPSBhLkJJRF9TVEFUVVMuUkVOREVSRUQsIGUuYWRkV2lubmluZ0JpZCh0KSkgOiBPYmplY3Qoci5sb2dXYXJuKSgnQXVjdGlvbiBub3QgZm91bmQgd2hlbiBhZGRpbmcgd2lubmluZyBiaWQnKTsKICAgICAgICAgICAgICAgICAgICB9LCBjLmdldEFsbFdpbm5pbmdCaWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFdpbm5pbmdCaWRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShyLmZsYXR0ZW4sIFtdKTsKICAgICAgICAgICAgICAgICAgICB9LCBjLmdldEJpZHNSZXF1ZXN0ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QmlkUmVxdWVzdHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKHIuZmxhdHRlbiwgW10pOwogICAgICAgICAgICAgICAgICAgIH0sIGMuZ2V0Tm9CaWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldE5vQmlkcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2Uoci5mbGF0dGVuLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgYy5nZXRCaWRzUmVjZWl2ZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0QXVjdGlvblN0YXR1cygpID09PSBzLmEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0Qmlkc1JlY2VpdmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShyLmZsYXR0ZW4sIFtdKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBjLmdldEFsbEJpZHNGb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRCaWRzUmVjZWl2ZWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKHIuZmxhdHRlbiwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5hZFVuaXRDb2RlID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LCBjLmdldEFkVW5pdHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0QWRVbml0cygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2Uoci5mbGF0dGVuLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgfSwgYy5nZXRBZFVuaXRDb2RlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBZFVuaXRDb2RlcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2Uoci5mbGF0dGVuLCBbXSkuZmlsdGVyKHIudW5pcXVlcyk7CiAgICAgICAgICAgICAgICAgICAgfSwgYy5jcmVhdGVBdWN0aW9uID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBlLmFkVW5pdHMsIHIgPSBlLmFkVW5pdENvZGVzLCBpID0gZS5jYWxsYmFjaywgbyA9IGUuY2JUaW1lb3V0LCBhID0gZS5sYWJlbHMsIGMgPSBlLmF1Y3Rpb25JZCwgdSA9IE9iamVjdChzLmspKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGVzOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiVGltZW91dDogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSB1LCBkLnB1c2godCksIHU7CiAgICAgICAgICAgICAgICAgICAgfSwgYy5maW5kQmlkQnlBZElkID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8oKShkLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZ2V0Qmlkc1JlY2VpdmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShyLmZsYXR0ZW4sIFtdKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkSWQgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIGMuZ2V0U3RhbmRhcmRCaWRkZXJBZFNlcnZlclRhcmdldGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChzLmopKClbYS5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HXTsKICAgICAgICAgICAgICAgICAgICB9LCBjLnNldFN0YXR1c0ZvckJpZHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciA9IGMuZmluZEJpZEJ5QWRJZChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAoci5zdGF0dXMgPSB0KSwgIXIgfHwgdCAhPT0gYS5CSURfU1RBVFVTLkJJRF9UQVJHRVRJTkdfU0VUIHx8IChuID0gbygpKGQsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdWN0aW9uSWQoKSA9PT0gci5hdWN0aW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSAmJiBuLnNldEJpZFRhcmdldGluZyhyKTsKICAgICAgICAgICAgICAgICAgICB9LCBjLmdldExhc3RBdWN0aW9uSWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkLmxlbmd0aCAmJiBkW2QubGVuZ3RoIC0gMV0uZ2V0QXVjdGlvbklkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgYyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDIzMDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIG4oMjMxKTsKICAgICAgICAgICAgICAgIHZhciByID0gbig1Mik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKCdBcnJheScsICdmaW5kSW5kZXgnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjMxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE0KSwgaSA9IG4oNTYpLmZpbmRJbmRleCwgbyA9IG4oNTEpLCBhID0gbig2MCksIGMgPSAnZmluZEluZGV4JywgdSA9ICEwLCBzID0gYShjKTsKICAgICAgICAgICAgICAgIGMgaW4gW10gJiYgQXJyYXkoMSlbY10oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHUgPSAhMTsKICAgICAgICAgICAgICAgIH0pLCByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdBcnJheScsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogdSB8fCAhcwogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGZpbmRJbmRleDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkodGhpcywgZSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSwgbyhjKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjM4OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5hID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdSwgITEpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByID0gbig5KSwgYiA9IG4ubihyKSwgdiA9IG4oMzgpLCBpID0gbig1KSwgbyA9IG4ubihpKSwgeSA9IG4oMCksIGggPSBuKDIzKSwgYSA9IG4oMTApLCBtID0gbi5uKGEpLCBTID0gbigxMiksIGMgPSBuKDEzKSwgZCA9IG4ubihjKSwgQSA9IG8uYS5FVkVOVFMuQklEX1dPTjsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBpLCBvLCBhLCBjLCB1LCBzLCBkID0gZS5tZXNzYWdlID8gJ21lc3NhZ2UnIDogJ2RhdGEnLCBmID0ge307CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IEpTT04ucGFyc2UoZVtkXSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmICYmIGYuYWRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCwgcCA9IG0oKShoLmEuZ2V0Qmlkc1JlY2VpdmVkKCksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRJZCA9PT0gZi5hZElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICYmICdQcmViaWQgUmVxdWVzdCcgPT09IGYubWVzc2FnZSAmJiAobiA9IGUsIHIgPSAodCA9IHApLmFkSWQsIGkgPSB0LmFkLCBvID0gdC5hZFVybCwgYSA9IHQud2lkdGgsIGMgPSB0LmhlaWdodCwgdSA9IHQucmVuZGVyZXIsIHMgPSB0LmNwbSwgT2JqZWN0KFMuYykodSkgPyBPYmplY3QoUy5iKSh1LCB0KSA6IHIgJiYgKEUodCksIG4uc291cmNlLnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUHJlYmlkIFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZDogT2JqZWN0KHkucmVwbGFjZUF1Y3Rpb25QcmljZSkoaSwgcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVcmw6IE9iamVjdCh5LnJlcGxhY2VBdWN0aW9uUHJpY2UpKG8sIHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkSWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbi5vcmlnaW4pKSwgaC5hLmFkZFdpbm5pbmdCaWQocCksIGIuYS5lbWl0KEEsIHApKSwgcCAmJiAnUHJlYmlkIE5hdGl2ZScgPT09IGYubWVzc2FnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdhc3NldFJlcXVlc3QnID09PSBmLmFjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBnID0gT2JqZWN0KHYuZCkoZiwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgZS5zb3VyY2UucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZyksIGUub3JpZ2luKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnYWxsQXNzZXRSZXF1ZXN0JyA9PT0gZi5hY3Rpb24gPyAobCA9IE9iamVjdCh2LmMpKGYsIHApLCBlLnNvdXJjZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShsKSwgZS5vcmlnaW4pKSA6ICdyZXNpemVOYXRpdmVIZWlnaHQnID09PSBmLmFjdGlvbiAmJiAocC5oZWlnaHQgPSBmLmhlaWdodCwgcC53aWR0aCA9IGYud2lkdGgsIEUocCkpLCAnY2xpY2snID09PSBPYmplY3Qodi5iKShmLCBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmEuYWRkV2lubmluZ0JpZChwKSwgYi5hLmVtaXQoQSwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGUuYWRJZCwgYyA9IGUuYWRVbml0Q29kZSwgdSA9IGUud2lkdGgsIHMgPSBlLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgICdkaXYnLAogICAgICAgICAgICAgICAgICAgICAgICAnaWZyYW1lJwogICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciwgaSwgbyA9ICh0ID0gZSArICc6bm90KFtzdHlsZSo9ImRpc3BsYXk6IG5vbmUiXSknLCBuID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Lmdvb2dsZXRhZyA/IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCkod2luZG93Lmdvb2dsZXRhZy5wdWJhZHMoKS5nZXRTbG90cygpLCBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oKSh0LmdldFRhcmdldGluZ0tleXMoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCgpKHQuZ2V0VGFyZ2V0aW5nKGUpLCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5nZXRTbG90RWxlbWVudElkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSA6IHdpbmRvdy5hcG50YWcgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHdpbmRvdy5hcG50YWcuZ2V0VGFnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiB0LnRhcmdldElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0odCkgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShhLCBjKSwgKHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuKSkgJiYgci5xdWVyeVNlbGVjdG9yKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgbyA/ICgoaSA9IG8uc3R5bGUpLndpZHRoID0gdSArICdweCcsIGkuaGVpZ2h0ID0gcyArICdweCcpIDogT2JqZWN0KHkubG9nV2FybikoJ1VuYWJsZSB0byBsb2NhdGUgbWF0Y2hpbmcgcGFnZSBlbGVtZW50IGZvciBhZFVuaXRDb2RlICcuY29uY2F0KGMsICcuICBDYW5cJ3QgcmVzaXplIGl0IHRvIGFkXCdzIGRpbWVuc2lvbnMuICBQbGVhc2UgcmV2aWV3IHNldHVwLicpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjM5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5hID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzIyZjNiYmExMDMxMTUzNTIgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnc2Vzc2lvblN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yMmYzYmJhMTAzMTE1MzUyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJywgJF9fX21vY2tfMTZjNTMzOTVhODIyZGI0OC5zZXNzaW9uU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlIHx8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSwgdCA9IEpTT04ucGFyc2UoZS5nZXRJdGVtKHUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgcCh0LCAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF8yMmYzYmJhMTAzMTE1MzUyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ3Nlc3Npb25TdG9yYWdlJywgJF9fX29sZF8yMmYzYmJhMTAzMTE1MzUyKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByLCBpLCBvID0gbigzKSwgYSA9IG4oMCksIGMgPSBuKDM1KSwgdSA9ICdwYmpzOmRlYnVnZ2luZyc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QoYS5sb2dNZXNzYWdlKSgnREVCVUc6ICcgKyBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoZSkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdChhLmxvZ1dhcm4pKCdERUJVRzogJyArIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlKSB7CiAgICAgICAgICAgICAgICAgICAgciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiKHRoaXMuYmlkZGVycywgbi5iaWRkZXJDb2RlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIGQoJ2JpZGRlciBcJycuY29uY2F0KG4uYmlkZGVyQ29kZSwgJ1wnIGV4Y2x1ZGVkIGZyb20gYXVjdGlvbiBieSBiaWRkZXIgb3ZlcnJpZGVzJykpOwogICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuYmlkcykgJiYgdGhpcy5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcoZSwgbi5iaWRkZXJDb2RlLCB0KSB8fCB2KGUsIG4sICdiaWRkZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUodCwgbik7CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKGUpLCBjLmMuYmVmb3JlKHIsIDUpLCBpID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLCBuID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWIoci5iaWRkZXJzLCBlLmJpZGRlckNvZGUpIHx8IChkKCdiaWRSZXF1ZXN0IFwnJy5jb25jYXQoZS5iaWRkZXJDb2RlLCAnXCcgZXhjbHVkZWQgZnJvbSBhdWN0aW9uIGJ5IGJpZGRlciBvdmVycmlkZXMnKSksICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHIuYmlkUmVxdWVzdHMpICYmIG4uZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5iaWRSZXF1ZXN0cy5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyh0LCBuLmJpZGRlckNvZGUsIGUuYWRVbml0Q29kZSkgfHwgdih0LCBlLCAnYmlkUmVxdWVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBlKG4pOwogICAgICAgICAgICAgICAgICAgIH0uYmluZChlKSwgYy5lLmJlZm9yZShpLCA1KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAgICAgYy5jLmdldEhvb2tzKHsgaG9vazogciB9KS5yZW1vdmUoKSwgYy5lLmdldEhvb2tzKHsgaG9vazogaSB9KS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSB0ICYmIHQ7CiAgICAgICAgICAgICAgICAgICAgby5iLnNldENvbmZpZyh7IGRlYnVnOiAhMCB9KSwgbCgpLCBmKGUpLCBzKCdiaWRkZXIgb3ZlcnJpZGVzIGVuYWJsZWQnLmNvbmNhdChuID8gJyBmcm9tIHNlc3Npb24nIDogJycpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZGRlciAmJiBlLmJpZGRlciAhPT0gdCB8fCAhKCFlLmFkVW5pdENvZGUgfHwgZS5hZFVuaXRDb2RlID09PSBuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpICYmIC0xID09PSBlLmluZGV4T2YodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KG4sIGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobikuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkVW5pdENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpZGRlcicKICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmRleE9mKGUpOwogICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcygnYmlkZGVyIG92ZXJyaWRlcyBjaGFuZ2VkIFwnJy5jb25jYXQoZS5hZFVuaXRDb2RlLCAnLycpLmNvbmNhdChlLmJpZGRlckNvZGUsICdcJyAnKS5jb25jYXQociwgJy4nKS5jb25jYXQodCwgJyBmcm9tIFwnJykuY29uY2F0KGVbdF0sICcuanNcJyB0byBcJycpLmNvbmNhdChuW3RdLCAnXCcnKSksIGVbdF0gPSBuW3RdLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0odSwgSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcChlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsKCksIHMoJ2JpZGRlciBvdmVycmlkZXMgZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHUpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLmIuZ2V0Q29uZmlnKCdkZWJ1Z2dpbmcnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGUuZGVidWdnaW5nKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAyNDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciBvID0gbigyMSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAociwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChvKHIpLCB2b2lkIDAgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoaSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoaSwgZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmNhbGwoaSwgZSwgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmFwcGx5KGksIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDI1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pLCB0LmQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0KG8uZ2V0QmlkUmVxdWVzdCkoZS5yZXF1ZXN0SWQsIHQpLCByID0gbiAmJiBPYmplY3Qoby5kZWVwQWNjZXNzKShuLCAnbWVkaWFUeXBlcy52aWRlbycpLCBpID0gciAmJiBPYmplY3Qoby5kZWVwQWNjZXNzKShyLCAnY29udGV4dCcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIG4sIHIsIGkpOwogICAgICAgICAgICAgICAgfSwgbi5kKHQsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBuKDgpOwogICAgICAgICAgICAgICAgdmFyIG8gPSBuKDApLCBpID0gbigzKSwgciA9IG4oMTMpLCBhID0gKG4ubihyKSwgbigxMSkpLCBjID0gJ291dHN0cmVhbScsIHUgPSAnaW5zdHJlYW0nOwogICAgICAgICAgICAgICAgdmFyIHMgPSBPYmplY3QoYS5iKSgnc3luYycsIGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0IHx8IG4gJiYgciAhPT0gYyA/IGkuYi5nZXRDb25maWcoJ2NhY2hlLnVybCcpIHx8ICFlLnZhc3RYbWwgfHwgZS52YXN0VXJsID8gISghZS52YXN0VXJsICYmICFlLnZhc3RYbWwpIDogKE9iamVjdChvLmxvZ0Vycm9yKSgnXG4gICAgICAgIFRoaXMgYmlkIGNvbnRhaW5zIG9ubHkgdmFzdFhtbCBhbmQgd2lsbCBub3Qgd29yayB3aGVuIGEgcHJlYmlkIGNhY2hlIHVybCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgICAgICBUcnkgZW5hYmxpbmcgcHJlYmlkIGNhY2hlIHdpdGggcGJqcy5zZXRDb25maWcoeyBjYWNoZToge3VybDogIi4uLiJ9IH0pO1xuICAgICAgJyksICExKSA6IHIgIT09IGMgfHwgISEoZS5yZW5kZXJlciB8fCB0LnJlbmRlcmVyIHx8IG4ucmVuZGVyZXIpOwogICAgICAgICAgICAgICAgfSwgJ2NoZWNrVmlkZW9CaWRTZXR1cCcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAyNjogZnVuY3Rpb24gKG4sIGUsIHQpIHsKICAgICAgICAgICAgICAgIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLk1hdGggPT0gTWF0aCAmJiBlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuLmV4cG9ydHMgPSB0KCdvYmplY3QnID09IHR5cGVvZiBnbG9iYWxUaGlzICYmIGdsb2JhbFRoaXMpIHx8IHQoJ29iamVjdCcgPT0gdHlwZW9mIHdpbmRvdyAmJiB3aW5kb3cpIHx8IHQoJ29iamVjdCcgPT0gdHlwZW9mIHNlbGYgJiYgc2VsZikgfHwgdCgnb2JqZWN0JyA9PSB0eXBlb2YgZSAmJiBlKSB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwogICAgICAgICAgICAgICAgfS5jYWxsKGUsIHQoMzYpKSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDI3OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT0gdHlwZW9mIGUgPyBudWxsICE9PSBlIDogJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDI4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSB7fS5oYXNPd25Qcm9wZXJ0eTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY2FsbChlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDI5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgPyBlIDogdm9pZCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDQzKSwgbyA9IG4oMjYpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyByKGlbZV0pIHx8IHIob1tlXSkgOiBpW2VdICYmIGlbZV1bdF0gfHwgb1tlXSAmJiBvW2VdW3RdOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF87CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gbig0NSksIGkgPSBuKDEwKSwgYSA9IG4ubihpKSwgbyA9IG4oMTMpLCBjID0gbi5uKG8pLCB1ID0gbig3OSksIHMgPSBuLm4odSksIGQgPSBuKDApOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIsIGkgPSB7fSwgbyA9IE9iamVjdC5rZXlzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyID0gMDsgciA8IG8ubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG9bcl0sIDAgPD0gdC5pbmRleE9mKG4pIHx8IChpW25dID0gZVtuXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgICAgICAgICAgfShlLCB0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSksIG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpW29dLCAwIDw9IHQuaW5kZXhPZihuKSB8fCBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSwgbikgJiYgKHJbbl0gPSBlW25dKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IG4sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHAgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChnID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBiID0gbig5MSksIHYgPSBuKDApLCB5ID0gbig1KSwgaCA9ICdUUlVFJyA9PT0gdi5nZXRQYXJhbWV0ZXJCeU5hbWUoeS5ERUJVR19NT0RFKS50b1VwcGVyQ2FzZSgpLCBtID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiwgUyA9ICdyYW5kb20nLCBBID0ge307CiAgICAgICAgICAgICAgICBBW1NdID0gITAsIEEuZml4ZWQgPSAhMDsKICAgICAgICAgICAgICAgIHZhciBFID0gUywgTyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgTE9XOiAnbG93JywKICAgICAgICAgICAgICAgICAgICAgICAgTUVESVVNOiAnbWVkaXVtJywKICAgICAgICAgICAgICAgICAgICAgICAgSElHSDogJ2hpZ2gnLAogICAgICAgICAgICAgICAgICAgICAgICBBVVRPOiAnYXV0bycsCiAgICAgICAgICAgICAgICAgICAgICAgIERFTlNFOiAnZGVuc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBDVVNUT006ICdjdXN0b20nCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBULCBJLCBqLCBDLCB3LCBfID0gKEMgPSBbXSwgdyA9IG51bGwsIHgoKSwgewogICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJyZW50QmlkZGVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uZmlnOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8PSAxICYmICdmdW5jdGlvbicgIT0gdHlwZW9mIChhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB2b2lkIDAgOiBhcmd1bWVudHNbMF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB2b2lkIDAgOiBhcmd1bWVudHNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyB2LmRlZXBBY2Nlc3MoQigpLCBlKSA6IEIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIGUgJiYgKG4gPSBlLCBlID0gJyonKSwgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcGljOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMucHVzaChyKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy5zcGxpY2UoQy5pbmRleE9mKHIpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5sb2dFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uZmlnOiBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmlzUGxhaW5PYmplY3QocikgPyAoZSA9IE9iamVjdC5rZXlzKHIpLCBpID0ge30sIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gJ2ZwZCcgPT09IGUgPyAnb3J0YjInIDogZSwgbiA9ICdmcGQnID09PSBlID8gVShyW2VdKSA6IHJbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5pc1BsYWluT2JqZWN0KFRbdF0pICYmIHYuaXNQbGFpbk9iamVjdChuKSAmJiAobiA9IGcoe30sIFRbdF0sIG4pKSwgaVt0XSA9IElbdF0gPSBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGsoaSkpIDogdi5sb2dFcnJvcignc2V0Q29uZmlnIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGVmYXVsdHM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmlzUGxhaW5PYmplY3QoVCkgPyAoZyhULCBlKSwgZyhJLCBlKSkgOiB2LmxvZ0Vycm9yKCdkZWZhdWx0cyBtdXN0IGJlIGFuIG9iamVjdCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICByZXNldENvbmZpZzogeCwKICAgICAgICAgICAgICAgICAgICAgICAgcnVuV2l0aEJpZGRlcjogRCwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tXaXRoQmlkZGVyOiBmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUsIHQgPSBhcmd1bWVudHMubGVuZ3RoLCBuID0gbmV3IEFycmF5KHQpLCByID0gMDsgciA8IHQ7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQobywgKGUgPSB2LmJpbmQpLmNhbGwuYXBwbHkoZSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5jb25jYXQobikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LmxvZ1dhcm4oJ2NvbmZpZy5jYWxsYmFja1dpdGhCaWRkZXIgY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0QmlkZGVyQ29uZmlnOiBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzUGxhaW5PYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnc2V0QmlkZGVyQ29uZmlnIGJpZGRlciBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuYmlkZGVycykgfHwgIWUuYmlkZGVycy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAnc2V0QmlkZGVyQ29uZmlnIGJpZGRlciBvcHRpb25zIG11c3QgY29udGFpbiBhIGJpZGRlcnMgbGlzdCB3aXRoIGF0IGxlYXN0IDEgYmlkZGVyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzUGxhaW5PYmplY3QoZS5jb25maWcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJ3NldEJpZGRlckNvbmZpZyBiaWRkZXIgb3B0aW9ucyBtdXN0IGNvbnRhaW4gYSBjb25maWcgb2JqZWN0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGkpLCBpLmJpZGRlcnMuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqW3JdIHx8IChqW3JdID0ge30pLCBPYmplY3Qua2V5cyhpLmNvbmZpZykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnZnBkJyA9PT0gZSA/ICdvcnRiMicgOiBlLCBuID0gJ2ZwZCcgPT09IGUgPyBVKGkuY29uZmlnW2VdKSA6IGkuY29uZmlnW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdi5pc1BsYWluT2JqZWN0KG4pID8galtyXVt0XSA9IGcoe30sIGpbcl1bdF0gfHwge30sIG4pIDogaltyXVt0XSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpZGRlckNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGo7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRBZFVuaXRGcGQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZnBkID8gKGUub3J0YjJJbXAgPyB2Lm1lcmdlRGVlcChlLm9ydGIySW1wLCBSKGUuZnBkKSkgOiBlLm9ydGIySW1wID0gUihlLmZwZCksIHQucHVzaCgoZS5mcGQsIGYoZSwgWydmcGQnXSkpKSkgOiB0LnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGVnYWN5RnBkOiBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBwKHIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICdzaXRlJyA9PT0gbiA/ICdjb250ZXh0JyA6IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbZV0gPSAnY29udGV4dCcgPT09IGUgfHwgJ3VzZXInID09PSBlID8gT2JqZWN0LmtleXMocltuXSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RhdGEnICE9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnZXh0JyA9PT0gdCA/IHYubWVyZ2VEZWVwKGUsIHJbbl1bdF0pIDogdi5tZXJnZURlZXAoZSwgbCh7fSwgdCwgcltuXVt0XSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSkgOiByW25dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRMZWdhY3lJbXBGcGQ6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHAodCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmRlZXBBY2Nlc3ModCwgJ2V4dC5kYXRhJykgJiYgT2JqZWN0LmtleXModC5leHQuZGF0YSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGJhZHNsb3QnID09PSBlID8gdi5tZXJnZURlZXAobiwgeyBjb250ZXh0OiB7IHBiQWRTbG90OiB0LmV4dC5kYXRhW2VdIH0gfSkgOiAnYWRzZXJ2ZXInID09PSBlID8gdi5tZXJnZURlZXAobiwgeyBjb250ZXh0OiB7IGFkU2VydmVyOiB0LmV4dC5kYXRhW2VdIH0gfSkgOiB2Lm1lcmdlRGVlcChuLCB7IGNvbnRleHQ6IHsgZGF0YTogbCh7fSwgZSwgdC5leHQuZGF0YVtlXSkgfSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZnVuY3Rpb24geCgpIHsKICAgICAgICAgICAgICAgICAgICBUID0ge307CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZzogaCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRlYnVnKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlYnVnOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgZGVidWcoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVidWcgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfYmlkZGVyVGltZW91dDogMzAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGJpZGRlclRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmlkZGVyVGltZW91dDsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGJpZGRlclRpbWVvdXQoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmlkZGVyVGltZW91dCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9wdWJsaXNoZXJEb21haW46IG0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBwdWJsaXNoZXJEb21haW4oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHVibGlzaGVyRG9tYWluOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgcHVibGlzaGVyRG9tYWluKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3B1Ymxpc2hlckRvbWFpbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9wcmljZUdyYW51bGFyaXR5OiBPLk1FRElVTSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHByaWNlR3JhbnVsYXJpdHkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyhlKSAmJiAoJ3N0cmluZycgPT0gdHlwZW9mIGUgPyB0aGlzLl9wcmljZUdyYW51bGFyaXR5ID0gaShlKSA/IGUgOiBPLk1FRElVTSA6IHYuaXNQbGFpbk9iamVjdChlKSAmJiAodGhpcy5fY3VzdG9tUHJpY2VCdWNrZXQgPSBlLCB0aGlzLl9wcmljZUdyYW51bGFyaXR5ID0gTy5DVVNUT00sIHYubG9nTWVzc2FnZSgnVXNpbmcgY3VzdG9tIHByaWNlIGdyYW51bGFyaXR5JykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHByaWNlR3JhbnVsYXJpdHkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJpY2VHcmFudWxhcml0eTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2N1c3RvbVByaWNlQnVja2V0OiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGN1c3RvbVByaWNlQnVja2V0KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1c3RvbVByaWNlQnVja2V0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfbWVkaWFUeXBlUHJpY2VHcmFudWxhcml0eToge30sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBtZWRpYVR5cGVQcmljZUdyYW51bGFyaXR5KCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBtZWRpYVR5cGVQcmljZUdyYW51bGFyaXR5KG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21lZGlhVHlwZVByaWNlR3JhbnVsYXJpdHkgPSBPYmplY3Qua2V5cyhuKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhuW3RdKSA/ICdzdHJpbmcnID09IHR5cGVvZiBuID8gZVt0XSA9IGkoblt0XSkgPyBuW3RdIDogci5fcHJpY2VHcmFudWxhcml0eSA6IHYuaXNQbGFpbk9iamVjdChuKSAmJiAoZVt0XSA9IG5bdF0sIHYubG9nTWVzc2FnZSgnVXNpbmcgY3VzdG9tIHByaWNlIGdyYW51bGFyaXR5IGZvciAnLmNvbmNhdCh0KSkpIDogdi5sb2dXYXJuKCdJbnZhbGlkIHByaWNlIGdyYW51bGFyaXR5IGZvciBtZWRpYSB0eXBlOiAnLmNvbmNhdCh0KSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9zZW5kQWxsQmlkczogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlbmFibGVTZW5kQWxsQmlkcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZW5kQWxsQmlkczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGVuYWJsZVNlbmRBbGxCaWRzKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbmRBbGxCaWRzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX3VzZUJpZENhY2hlOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHVzZUJpZENhY2hlKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZUJpZENhY2hlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdXNlQmlkQ2FjaGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXNlQmlkQ2FjaGUgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfZGV2aWNlQWNjZXNzOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGRldmljZUFjY2VzcygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXZpY2VBY2Nlc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBkZXZpY2VBY2Nlc3MoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGV2aWNlQWNjZXNzID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2JpZGRlclNlcXVlbmNlOiBFLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQgYmlkZGVyU2VxdWVuY2UoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmlkZGVyU2VxdWVuY2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldCBiaWRkZXJTZXF1ZW5jZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBW2VdID8gdGhpcy5fYmlkZGVyU2VxdWVuY2UgPSBlIDogdi5sb2dXYXJuKCdJbnZhbGlkIG9yZGVyOiAnLmNvbmNhdChlLCAnLiBCaWRkZXIgU2VxdWVuY2Ugd2FzIG5vdCBzZXQuJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBfdGltZW91dEJ1ZmZlcjogNDAwLAogICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGltZW91dEJ1ZmZlcigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aW1lb3V0QnVmZmVyOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGltZW91dEJ1ZmZlcihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lb3V0QnVmZmVyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgX2Rpc2FibGVBamF4VGltZW91dDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBkaXNhYmxlQWpheFRpbWVvdXQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZUFqYXhUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZXQgZGlzYWJsZUFqYXhUaW1lb3V0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVBamF4VGltZW91dCA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9tYXhOZXN0ZWRJZnJhbWVzOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IG1heE5lc3RlZElmcmFtZXMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4TmVzdGVkSWZyYW1lczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG1heE5lc3RlZElmcmFtZXMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF4TmVzdGVkSWZyYW1lcyA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF9hdWN0aW9uT3B0aW9uczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBhdWN0aW9uT3B0aW9ucygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdWN0aW9uT3B0aW9uczsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0IGF1Y3Rpb25PcHRpb25zKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdi5pc1BsYWluT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5sb2dXYXJuKCdBdWN0aW9uIE9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIG4gPSBPYmplY3Qua2V5cyhlKTsgdCA8IG4ubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3NlY29uZGFyeUJpZGRlcnMnICE9PSByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYubG9nV2FybignQXVjdGlvbiBPcHRpb25zIGdpdmVuIGFuIGluY29ycmVjdCBwYXJhbTogJy5jb25jYXQocikpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzZWNvbmRhcnlCaWRkZXJzJyA9PT0gcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2LmlzQXJyYXkoZVtyXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYubG9nV2FybignQXVjdGlvbiBPcHRpb25zICcuY29uY2F0KHIsICcgbXVzdCBiZSBvZiB0eXBlIEFycmF5JykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZVtyXS5ldmVyeSh2LmlzU3RyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5sb2dXYXJuKCdBdWN0aW9uIE9wdGlvbnMgJy5jb25jYXQociwgJyBtdXN0IGJlIG9ubHkgc3RyaW5nJykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpIHx8ICh0aGlzLl9hdWN0aW9uT3B0aW9ucyA9IGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoKShPYmplY3Qua2V5cyhPKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSBPW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaShlKSB8fCB2LmxvZ1dhcm4oJ1ByZWJpZCBXYXJuaW5nOiBzZXRQcmljZUdyYW51bGFyaXR5IHdhcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHNldHRpbmcsIHVzaW5nIGBtZWRpdW1gIGFzIGRlZmF1bHQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2LmlzUGxhaW5PYmplY3QoZSkgJiYgIU9iamVjdChyLmIpKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIHYubG9nRXJyb3IoJ0ludmFsaWQgY3VzdG9tIHByaWNlIHZhbHVlIHBhc3NlZCB0byBgc2V0UHJpY2VHcmFudWxhcml0eSgpYCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdi5sb2dFcnJvcignUHJlYmlkIEVycm9yOiBubyB2YWx1ZSBwYXNzZWQgdG8gYHNldFByaWNlR3JhbnVsYXJpdHkoKWAnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSSAmJiBrKE9iamVjdC5rZXlzKEkpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSVt0XSAhPT0gblt0XSAmJiAoZVt0XSA9IG5bdF0gfHwge30pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHt9KSksIEkgPSBuLCBqID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh3ICYmIGogJiYgdi5pc1BsYWluT2JqZWN0KGpbd10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0galt3XSwgZSA9IG5ldyBzLmEoT2JqZWN0LmtleXMoSSkuY29uY2F0KE9iamVjdC5rZXlzKG4pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGUpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gblt0XSA/IGVbdF0gPSBJW3RdIDogdm9pZCAwICE9PSBJW3RdICYmIHYuaXNQbGFpbk9iamVjdChuW3RdKSA/IGVbdF0gPSBPYmplY3QoZC5tZXJnZURlZXApKHt9LCBJW3RdLCBuW3RdKSA6IGVbdF0gPSBuW3RdLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBnKHt9LCBJKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUocikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAnY29udGV4dCcgPT09IG4gPyAnc2l0ZScgOiBuOwogICAgICAgICAgICAgICAgICAgICAgICB0W2VdID0gJ3NpdGUnID09PSBlIHx8ICd1c2VyJyA9PT0gZSA/IE9iamVjdC5rZXlzKHJbbl0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXRhJyA9PT0gdCA/IHYubWVyZ2VEZWVwKGUsIHsgZXh0OiB7IGRhdGE6IHJbbl1bdF0gfSB9KSA6IHYubWVyZ2VEZWVwKGUsIGwoe30sIHQsIHJbbl1bdF0pKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwge30pIDogcltuXTsKICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIocikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHIpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbnRleHQnID09PSBlOwogICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocltuXSkuZm9yRWFjaChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEnID09PSB0ID8gdi5tZXJnZURlZXAoaSwgeyBleHQ6IHsgZGF0YTogcltuXVt0XSB9IH0pIDogJ29iamVjdCcgIT09IHAocltuXVt0XSkgfHwgQXJyYXkuaXNBcnJheShyW25dW3RdKSA/IHYubWVyZ2VEZWVwKGksIHsgZXh0OiB7IGRhdGE6IGwoe30sIHQudG9Mb3dlckNhc2UoKSwgcltuXVt0XSkgfSB9KSA6IE9iamVjdC5rZXlzKHJbbl1bdF0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Lm1lcmdlRGVlcChpLCB7IGV4dDogeyBkYXRhOiBsKHt9LCB0LnRvTG93ZXJDYXNlKCksIGwoe30sIGUudG9Mb3dlckNhc2UoKSwgcltuXVt0XVtlXSkpIH0gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdC5rZXlzKHQpOwogICAgICAgICAgICAgICAgICAgIEMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKCkobiwgZS50b3BpYyk7CiAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGxiYWNrKGwoe30sIGUudG9waWMsIHRbZS50b3BpY10pKTsKICAgICAgICAgICAgICAgICAgICB9KSwgQy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcqJyA9PT0gZS50b3BpYzsKICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGxiYWNrKHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdyA9IGU7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoKTsKICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICB3ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDMwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDMxKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9ICFyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIDEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pWzFdOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDMxOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzApLCBpID0gbigzMyksIG8gPSBuKDQ2KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIgPyBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLmYoZSwgdCwgbygxLCBuKSk7CiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XSA9IG4sIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAzMzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigzMCksIGkgPSBuKDczKSwgbyA9IG4oMTUpLCBhID0gbig1NSksIGMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgICAgICAgICB0LmYgPSByID8gYyA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG8oZSksIHQgPSBhKHQsICEwKSwgbyhuKSwgaSkKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJ2dldCcgaW4gbiB8fCAnc2V0JyBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd2YWx1ZScgaW4gbiAmJiAoZVt0XSA9IG4udmFsdWUpLCBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmEgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgcihlLCB0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHQgJiYgdC5zcmMgfHwgJ2NsaWVudCcsIHIgPSBlIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaWRkZXJDb2RlID0gdCAmJiB0LmJpZGRlciB8fCAnJywgdGhpcy53aWR0aCA9IDAsIHRoaXMuaGVpZ2h0ID0gMCwgdGhpcy5zdGF0dXNNZXNzYWdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdQZW5kaW5nJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdCaWQgYXZhaWxhYmxlJzsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdCaWQgcmV0dXJuZWQgZW1wdHkgb3IgZXJyb3IgcmVzcG9uc2UnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0JpZCB0aW1lZCBvdXQnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSgpLCB0aGlzLmFkSWQgPSBpLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwgdGhpcy5yZXF1ZXN0SWQgPSB0ICYmIHQuYmlkSWQsIHRoaXMubWVkaWFUeXBlID0gJ2Jhbm5lcicsIHRoaXMuc291cmNlID0gbiwgdGhpcy5nZXRTdGF0dXNDb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndpZHRoICsgJ3gnICsgdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQodCwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEw7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBGOwogICAgICAgICAgICAgICAgfSksIHQuayA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGksIGIsIHYsIG8gPSBlLmFkVW5pdHMsIG4gPSBlLmFkVW5pdENvZGVzLCByID0gZS5jYWxsYmFjaywgYSA9IGUuY2JUaW1lb3V0LCBjID0gZS5sYWJlbHMsIHUgPSBlLmF1Y3Rpb25JZCwgeSA9IG8sIHMgPSBjLCBkID0gbiwgaCA9IFtdLCBmID0gW10sIGwgPSBbXSwgcCA9IHUgfHwgUC5nZW5lcmF0ZVVVSUQoKSwgZyA9IHIsIG0gPSBhLCBTID0gW10sIEEgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gRSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25FbmQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uU3RhdHVzOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0czogeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGVzOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdHM6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub0JpZHM6IGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRzUmVjZWl2ZWQ6IGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5uaW5nQmlkczogUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IG0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gTyhuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCB0OwogICAgICAgICAgICAgICAgICAgICAgICBlICYmIGNsZWFyVGltZW91dCh2KSwgdm9pZCAwID09PSBpICYmIChyID0gW10sIG4gJiYgKFAubG9nTWVzc2FnZSgnQXVjdGlvbiAnLmNvbmNhdChwLCAnIHRpbWVkT3V0JykpLCB0ID0gQSwgKHIgPSBoLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlLmJpZHMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdC5oYXMoZS5iaWRkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShDLmZsYXR0ZW4sIFtdKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IGUuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyOiBlLmJpZGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBlLmFkVW5pdENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiBlLmF1Y3Rpb25JZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLmxlbmd0aCAmJiBxLmVtaXQoRy5FVkVOVFMuQklEX1RJTUVPVVQsIHIpKSwgYiA9IEYsIGkgPSBEYXRlLm5vdygpLCBxLmVtaXQoRy5FVkVOVFMuQVVDVElPTl9FTkQsIEUoKSksIFEoeSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICE9IGcgJiYgKGUgPSBmLmZpbHRlcihQLmJpbmQuY2FsbChDLmFkVW5pdHNGaWx0ZXIsIHRoaXMsIGQpKS5yZWR1Y2UoZWUsIHt9KSwgZy5hcHBseShwYmpzLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSwgZyA9IG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAubG9nRXJyb3IoJ0Vycm9yIGV4ZWN1dGluZyBiaWRzQmFja0hhbmRsZXInLCBudWxsLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5sZW5ndGggJiYgTS5jYWxsVGltZWRPdXRCaWRkZXJzKG8sIHIsIG0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geC5iLmdldENvbmZpZygndXNlclN5bmMnKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmVuYWJsZU92ZXJyaWRlIHx8IE4odC5zeW5jRGVsYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFAubG9nSW5mbygnQmlkcyBSZWNlaXZlZCBmb3IgQXVjdGlvbiB3aXRoIGlkOiAnLmNvbmNhdChwKSwgZiksIGIgPSBGLCBPKCExLCAhMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEkoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBBLmFkZChlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaihuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgbi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlLCBoID0gaC5jb25jYXQodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IHt9LCBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3RzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IE8uYmluZChudWxsLCAhMCksIHQgPSBzZXRUaW1lb3V0KGUsIG0pLCB2ID0gdCwgYiA9IEwsIHEuZW1pdChHLkVWRU5UUy5BVUNUSU9OX0lOSVQsIEUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvLCBhLCBjLCB1LCBzID0gKHIgPSBULCBpID0gZiwgbyA9IDAsIGEgPSAhMSwgYyA9IG5ldyBTZXQoKSwgdSA9IHt9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQmlkUmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbdC5yZXF1ZXN0SWRdID0gITAsIG8rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLmFkVW5pdENvZGUsIG4gPSBlLmJpZCwgciA9IGUuYmlkZGVyUmVxdWVzdCwgaSA9IGUuYXVjdGlvbklkLCBvID0gci5zdGFydCwgYSA9IEQoe30sIG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvbklkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVRpbWVzdGFtcDogT2JqZWN0KEMudGltZXN0YW1wKSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VGltZXN0YW1wOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IHBhcnNlRmxvYXQobi5jcG0pIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogbi5iaWRkZXJDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnRpbWVUb1Jlc3BvbmQgPSBhLnJlc3BvbnNlVGltZXN0YW1wIC0gYS5yZXF1ZXN0VGltZXN0YW1wLCBxLmVtaXQoRy5FVkVOVFMuQklEX0FESlVTVE1FTlQsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSByLmJpZHMgJiYgQigpKHIuYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZSA9PSB0ICYmIGUuYmlkSWQgPT0gYS5yZXF1ZXN0SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHUgPSBjICYmIGMucmVuZGVyZXIsIHMgPSBhLm1lZGlhVHlwZSwgZCA9IGMgJiYgYy5tZWRpYVR5cGVzICYmIGMubWVkaWFUeXBlc1tzXSwgZiA9IGQgJiYgZC5yZW5kZXJlciwgbCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICYmIGYudXJsICYmIGYucmVuZGVyICYmICghMCAhPT0gZi5iYWNrdXBPbmx5IHx8ICFuLnJlbmRlcmVyKSA/IGwgPSBmIDogdSAmJiB1LnVybCAmJiB1LnJlbmRlciAmJiAoITAgIT09IHUuYmFja3VwT25seSB8fCAhbi5yZW5kZXJlcikgJiYgKGwgPSB1KSwgbCAmJiAoYS5yZW5kZXJlciA9IF8uYS5pbnN0YWxsKHsgdXJsOiBsLnVybCB9KSwgYS5yZW5kZXJlci5zZXRSZW5kZXIobC5yZW5kZXIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gWihuLm1lZGlhVHlwZSwgYywgeC5iLmdldENvbmZpZygnbWVkaWFUeXBlUHJpY2VHcmFudWxhcml0eScpKSwgZyA9IE9iamVjdCh3LmEpKGEuY3BtLCAnb2JqZWN0JyA9PT0gayhwKSA/IHAgOiB4LmIuZ2V0Q29uZmlnKCdjdXN0b21QcmljZUJ1Y2tldCcpLCB4LmIuZ2V0Q29uZmlnKCdjdXJyZW5jeS5ncmFudWxhcml0eU11bHRpcGxpZXInKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5wYkxnID0gZy5sb3csIGEucGJNZyA9IGcubWVkLCBhLnBiSGcgPSBnLmhpZ2gsIGEucGJBZyA9IGcuYXV0bywgYS5wYkRnID0gZy5kZW5zZSwgYS5wYkNnID0gZy5jdXN0b20sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSWQ6IGkuZ2V0QXVjdGlvbklkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycgPT09IG4ubWVkaWFUeXBlID8gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gITAsIG8gPSBPYmplY3QoQy5nZXRCaWRSZXF1ZXN0KSh0Lm9yaWdpbmFsUmVxdWVzdElkIHx8IHQucmVxdWVzdElkLCBbbl0pLCBhID0gbyAmJiBPYmplY3QoQy5kZWVwQWNjZXNzKShvLCAnbWVkaWFUeXBlcy52aWRlbycpLCBjID0gYSAmJiBPYmplY3QoQy5kZWVwQWNjZXNzKShhLCAnY29udGV4dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5iLmdldENvbmZpZygnY2FjaGUudXJsJykgJiYgYyAhPT0gUi5iICYmICghdC52aWRlb0NhY2hlS2V5IHx8IHguYi5nZXRDb25maWcoJ2NhY2hlLmlnbm9yZUJpZGRlckNhY2hlS2V5JykgPyAoaSA9ICExLCBYKGUsIHQsIHIsIG8pKSA6IHQudmFzdFVybCB8fCAoUC5sb2dFcnJvcigndmlkZW9DYWNoZUtleSBzcGVjaWZpZWQgYnV0IG5vdCByZXF1aXJlZCB2YXN0VXJsIGZvciB2aWRlbyBiaWQnKSwgaSA9ICExKSksIGkgJiYgKCQoZSwgdCksIHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaSwgbiwgdGhpcywgZCkgOiAoJChpLCBuKSwgZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJEb25lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBlID0gaS5nZXRCaWRSZXF1ZXN0cygpLCBuID0geC5iLmdldENvbmZpZygnYXVjdGlvbk9wdGlvbnMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5hZGQodGhpcyksICFuIHx8IFAuaXNFbXB0eShuKSB8fCAodCA9IG4uc2Vjb25kYXJ5QmlkZGVycykgJiYgIWUuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVKCkodCwgZS5iaWRkZXJDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgJiYgKGUgPSBlLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFVKCkodCwgZS5iaWRkZXJDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBhID0gZS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaGFzKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdGhpcy5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVbZS5iaWRJZF0gfHwgKGkuYWRkTm9CaWQoZSksIHEuZW1pdChHLkVWRU5UUy5OT19CSUQsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEgJiYgMCA9PT0gbyAmJiByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLS0sIGEgJiYgMCA9PT0gbyAmJiByKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5jYWxsQmlkcyh5LCBuLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gYXJndW1lbnRzLmxlbmd0aCwgdCA9IG5ldyBBcnJheShlKSwgbiA9IDA7IG4gPCBlOyBuKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtuXSA9IGFyZ3VtZW50c1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEouYXBwbHkoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoOiBzLmFkZEJpZFJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzLmFkYXB0ZXJEb25lLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcoViwgdCksIGcobCwgZSksIEhbZV0gfHwgKEhbZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNSQTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAxIDwgbFtlXSAmJiAoSFtlXS5TUkEgPSAhMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWW2VdLS0sIEtbMF0gJiYgcChLWzBdKSAmJiBLLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG0sIEkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAhMCwgaSA9IHguYi5nZXRDb25maWcoJ21heFJlcXVlc3RzUGVyT3JpZ2luJykgfHwgejsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZFJlcXVlc3RzLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDEsIG4gPSB2b2lkIDAgIT09IGUuc3JjICYmIGUuc3JjID09PSBHLlMyUy5TUkMgPyAnczJzJyA6IGUuYmlkZGVyQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSFtuXSAmJiAoITEgPT09IEhbbl0uU1JBICYmICh0ID0gTWF0aC5taW4oZS5iaWRzLmxlbmd0aCwgaSkpLCBWW0hbbl0ub3JpZ2luXSArIHQgPiBpICYmIChyID0gITEpKSwgIXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgciAmJiBlLnJ1bigpLCByOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBlW3RdID8gZVt0XSA9IDEgOiBlW3RdKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcChlKSB8fCAoUC5sb2dXYXJuKCdxdWV1ZWluZyBhdWN0aW9uIGR1ZSB0byBsaW1pdGVkIGVuZHBvaW50IGNhcGFjaXR5JyksIEsucHVzaChlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZEJpZFJlY2VpdmVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGYuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBhZGROb0JpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNhbGxiYWNrOiBPLAogICAgICAgICAgICAgICAgICAgICAgICBjYWxsQmlkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IFcsIHQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBNLm1ha2VCaWRSZXF1ZXN0cyh5LCB0LCBwLCBtLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAubG9nSW5mbygnQmlkcyBSZXF1ZXN0ZWQgZm9yIEF1Y3Rpb24gd2l0aCBpZDogJy5jb25jYXQocCksIGUpLCBlLmxlbmd0aCA8IDEgPyAoUC5sb2dXYXJuKCdObyB2YWxpZCBiaWQgcmVxdWVzdHMgcmV0dXJuZWQgZm9yIGF1Y3Rpb24nKSwgVCgpKSA6IFkuY2FsbCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2g6IGosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdpbm5pbmdCaWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTID0gUy5jb25jYXQoZSksIE0uY2FsbEJpZFdvbkJpZGRlcihlLmJpZGRlciwgZSwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpZFRhcmdldGluZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uY2FsbFNldFRhcmdldGluZ0JpZGRlcihlLmJpZGRlciwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFdpbm5pbmdCaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGltZW91dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEF1Y3Rpb25JZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEF1Y3Rpb25TdGF0dXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRBZFVuaXRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWRVbml0Q29kZXM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRCaWRSZXF1ZXN0czogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldEJpZHNSZWNlaXZlZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmlkczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgbi5kKHQsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBKOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWTsKICAgICAgICAgICAgICAgIH0pLCB0LmcgPSBkLCB0LmQgPSAkLCBuLmQodCwgJ2YnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFg7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdpJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0pLCB0LmogPSBnOwogICAgICAgICAgICAgICAgdmFyIEMgPSBuKDApLCB3ID0gbig0NSksIGEgPSBuKDM4KSwgbyA9IG4oOTQpLCBfID0gbigxMiksIHggPSBuKDMpLCByID0gbig0NCksIGkgPSBuKDExKSwgYyA9IG4oMTApLCBCID0gbi5uKGMpLCB1ID0gbigxMyksIFUgPSBuLm4odSksIFIgPSBuKDI1KSwgcyA9IG4oMik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGsgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEQoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChEID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBOID0gci5hLnN5bmNVc2VycywgUCA9IG4oMCksIE0gPSBuKDgpLmRlZmF1bHQsIHEgPSBuKDkpLCBHID0gbig1KSwgVyA9ICdzdGFydGVkJywgTCA9ICdpblByb2dyZXNzJywgRiA9ICdjb21wbGV0ZWQnOwogICAgICAgICAgICAgICAgcS5vbihHLkVWRU5UUy5CSURfQURKVVNUTUVOVCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBlLmJpZGRlckNvZGUsIHIgPSBlLmNwbTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBianMuYmlkZGVyU2V0dGluZ3MgJiYgKG4gJiYgcGJqcy5iaWRkZXJTZXR0aW5nc1tuXSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBwYmpzLmJpZGRlclNldHRpbmdzW25dLmJpZENwbUFkanVzdG1lbnQgPyB0ID0gcGJqcy5iaWRkZXJTZXR0aW5nc1tuXS5iaWRDcG1BZGp1c3RtZW50IDogcGJqcy5iaWRkZXJTZXR0aW5nc1tHLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBwYmpzLmJpZGRlclNldHRpbmdzW0cuSlNPTl9NQVBQSU5HLkJEX1NFVFRJTkdfU1RBTkRBUkRdLmJpZENwbUFkanVzdG1lbnQgJiYgKHQgPSBwYmpzLmJpZGRlclNldHRpbmdzW0cuSlNPTl9NQVBQSU5HLkJEX1NFVFRJTkdfU1RBTkRBUkRdLmJpZENwbUFkanVzdG1lbnQpLCB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHQoZS5jcG0sIEQoe30sIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQLmxvZ0Vycm9yKCdFcnJvciBkdXJpbmcgYmlkIGFkanVzdG1lbnQnLCAnYmlkbWFuYWdlci5qcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAwIDw9IHIgJiYgKGUuY3BtID0gcik7CiAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHogPSA0LCBWID0ge30sIEggPSB7fSwgSyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIEogPSBPYmplY3QoaS5iKSgnYXN5bmMnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoLmNhbGwodGhpcy5iaWRkZXJSZXF1ZXN0LCBlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCAnYWRkQmlkUmVzcG9uc2UnKSwgWSA9IE9iamVjdChpLmIpKCdzeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaC5jYWxsKHRoaXMuY29udGV4dCwgZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgJ2FkZEJpZGRlclJlcXVlc3RzJyksIFEgPSBPYmplY3QoaS5iKSgnYXN5bmMnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0ICYmIHQoKTsKICAgICAgICAgICAgICAgICAgICB9LCAnYmlkc0JhY2tDYWxsYmFjaycpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdC50aW1lVG9SZXNwb25kID4gZS5nZXRUaW1lb3V0KCkgKyB4LmIuZ2V0Q29uZmlnKCd0aW1lb3V0QnVmZmVyJykgJiYgZS5leGVjdXRlQ2FsbGJhY2soITApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gJChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmdldEJpZFJlcXVlc3RzKCksIHIgPSBCKCkobiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZGRlckNvZGUgPT09IHQuYmlkZGVyQ29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuYmlkZGVyQ29kZSAmJiAoMCA8IHQuY3BtIHx8IHQuZGVhbElkKSAmJiAociA9IEIoKShlLmJpZHMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZSA9PT0gdC5hZFVuaXRDb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIG4gPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIGkgPSBwYmpzLmJpZGRlclNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKG8gPSBnKHQubWVkaWFUeXBlLCBlLCBuKSwgYihyLCBvLCB0KSwgZSAmJiBpW2VdICYmIGlbZV1bRy5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HXSAmJiAoYihyLCBpW2VdLCB0KSwgdC5zZW5kU3RhbmRhcmRUYXJnZXRpbmcgPSBpW2VdLnNlbmRTdGFuZGFyZFRhcmdldGluZykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm5hdGl2ZSAmJiAociA9IEQoe30sIHIsIE9iamVjdChhLmUpKHQsIG4pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQuYmlkZGVyQ29kZSwgdCwgcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQuYWRzZXJ2ZXJUYXJnZXRpbmcgPSBEKHQuYWRzZXJ2ZXJUYXJnZXRpbmcgfHwge30sIG4pOwogICAgICAgICAgICAgICAgICAgIH0odCwgciksIHEuZW1pdChHLkVWRU5UUy5CSURfUkVTUE9OU0UsIHQpLCBlLmFkZEJpZFJlY2VpdmVkKHQpLCBkKGUsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFggPSBPYmplY3QoaS5iKSgnYXN5bmMnLCBmdW5jdGlvbiAobiwgciwgaSwgZSkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmIpKFtyXSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSA/IChQLmxvZ1dhcm4oJ0ZhaWxlZCB0byBzYXZlIHRvIHRoZSB2aWRlbyBjYWNoZTogJy5jb25jYXQoZSwgJy4gVmlkZW8gYmlkIG11c3QgYmUgZGlzY2FyZGVkLicpKSwgZChuLCByKSkgOiAnJyA9PT0gdFswXS51dWlkID8gKFAubG9nV2FybignU3VwcGxpZWQgdmlkZW8gY2FjaGUga2V5IHdhcyBhbHJlYWR5IGluIHVzZSBieSBQcmViaWQgQ2FjaGU7IGNhY2hpbmcgYXR0ZW1wdCB3YXMgcmVqZWN0ZWQuIFZpZGVvIGJpZCBtdXN0IGJlIGRpc2NhcmRlZC4nKSwgZChuLCByKSkgOiAoci52aWRlb0NhY2hlS2V5ID0gdFswXS51dWlkLCByLnZhc3RVcmwgfHwgKHIudmFzdFVybCA9IE9iamVjdChvLmEpKHIudmlkZW9DYWNoZUtleSkpLCAkKG4sIHIpLCBpKCkpOwogICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgfSwgJ2NhbGxQcmViaWRDYWNoZScpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gWihlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gcy5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IE9iamVjdChDLmRlZXBBY2Nlc3MpKHQsICdtZWRpYVR5cGVzLicuY29uY2F0KHMuZCwgJy5jb250ZXh0JyksICdpbnN0cmVhbScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5bJycuY29uY2F0KHMuZCwgJy0nKS5jb25jYXQocildKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuWycnLmNvbmNhdChzLmQsICctJykuY29uY2F0KHIpXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltlXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gWihlLCB0LCB4LmIuZ2V0Q29uZmlnKCdtZWRpYVR5cGVQcmljZUdyYW51bGFyaXR5JykpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgbiA/ICdzdHJpbmcnID09IHR5cGVvZiBuID8gbiA6ICdjdXN0b20nIDogeC5iLmdldENvbmZpZygncHJpY2VHcmFudWxhcml0eScpOwogICAgICAgICAgICAgICAgICAgIH0sIGwgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSBHLkdSQU5VTEFSSVRZX09QVElPTlMuQVVUTyA/IGUucGJBZyA6IHQgPT09IEcuR1JBTlVMQVJJVFlfT1BUSU9OUy5ERU5TRSA/IGUucGJEZyA6IHQgPT09IEcuR1JBTlVMQVJJVFlfT1BUSU9OUy5MT1cgPyBlLnBiTGcgOiB0ID09PSBHLkdSQU5VTEFSSVRZX09QVElPTlMuTUVESVVNID8gZS5wYk1nIDogdCA9PT0gRy5HUkFOVUxBUklUWV9PUFRJT05TLkhJR0ggPyBlLnBiSGcgOiB0ID09PSBHLkdSQU5VTEFSSVRZX09QVElPTlMuQ1VTVE9NID8gZS5wYkNnIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sIHAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWV0YSAmJiBlLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMgJiYgMCA8IGUubWV0YS5hZHZlcnRpc2VyRG9tYWlucy5sZW5ndGggPyBlLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnNbMF0gOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw6ICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChDLmdldFZhbHVlKShlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8sIGEgPSBHLlRBUkdFVElOR19LRVlTLCBjID0gZihlLCBuKSwgdSA9IHBianMuYmlkZGVyU2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVbRy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF0gfHwgKHVbRy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF0gPSB7fSksIHVbRy5KU09OX01BUFBJTkcuQkRfU0VUVElOR19TVEFOREFSRF1bRy5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HXSB8fCAodVtHLkpTT05fTUFQUElORy5CRF9TRVRUSU5HX1NUQU5EQVJEXVtHLkpTT05fTUFQUElORy5BRFNFUlZFUl9UQVJHRVRJTkddID0gWwogICAgICAgICAgICAgICAgICAgICAgICByKGEuQklEREVSLCAnYmlkZGVyQ29kZScpLAogICAgICAgICAgICAgICAgICAgICAgICByKGEuQURfSUQsICdhZElkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHIoYS5QUklDRV9CVUNLRVQsIGwoYykpLAogICAgICAgICAgICAgICAgICAgICAgICByKGEuU0laRSwgJ3NpemUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgcihhLkRFQUwsICdkZWFsSWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgcihhLlNPVVJDRSwgJ3NvdXJjZScpLAogICAgICAgICAgICAgICAgICAgICAgICByKGEuRk9STUFULCAnbWVkaWFUeXBlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHIoYS5BRE9NQUlOLCBwKCkpCiAgICAgICAgICAgICAgICAgICAgXSksICd2aWRlbycgPT09IGUgJiYgKGkgPSB1W0cuSlNPTl9NQVBQSU5HLkJEX1NFVFRJTkdfU1RBTkRBUkRdW0cuSlNPTl9NQVBQSU5HLkFEU0VSVkVSX1RBUkdFVElOR10sIFsKICAgICAgICAgICAgICAgICAgICAgICAgYS5VVUlELAogICAgICAgICAgICAgICAgICAgICAgICBhLkNBQ0hFX0lECiAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gQigpKGksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5rZXkgPT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIGkucHVzaChyKHQsICd2aWRlb0NhY2hlS2V5JykpOwogICAgICAgICAgICAgICAgICAgIH0pLCAheC5iLmdldENvbmZpZygnY2FjaGUudXJsJykgfHwgdCAmJiAhMSA9PT0gUC5kZWVwQWNjZXNzKHUsICcnLmNvbmNhdCh0LCAnLnNlbmRTdGFuZGFyZFRhcmdldGluZycpKSB8fCAobyA9IE9iamVjdChDLnBhcnNlVXJsKSh4LmIuZ2V0Q29uZmlnKCdjYWNoZS51cmwnKSksIHZvaWQgMCA9PT0gQigpKGksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmtleSA9PT0gYS5DQUNIRV9IT1NUOwogICAgICAgICAgICAgICAgICAgIH0pICYmIGkucHVzaChyKGEuQ0FDSEVfSE9TVCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAuZGVlcEFjY2VzcyhlLCAnYWRzZXJ2ZXJUYXJnZXRpbmcuJy5jb25jYXQoYS5DQUNIRV9IT1NUKSkgPyBlLmFkc2VydmVyVGFyZ2V0aW5nW2EuQ0FDSEVfSE9TVF0gOiBvLmhvc3RuYW1lOwogICAgICAgICAgICAgICAgICAgIH0pKSkpLCB1W0cuSlNPTl9NQVBQSU5HLkJEX1NFVFRJTkdfU1RBTkRBUkRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYihyLCBpLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBpW0cuSlNPTl9NQVBQSU5HLkFEU0VSVkVSX1RBUkdFVElOR107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uc2l6ZSA9IG8uZ2V0U2l6ZSgpLCBQLl9lYWNoKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5rZXksIG4gPSBlLnZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJbdF0gJiYgUC5sb2dXYXJuKCdUaGUga2V5OiAnICsgdCArICcgaXMgZ2V0dGluZyBvdmV3cml0dGVuJyksIFAuaXNGbihuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4obyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC5sb2dFcnJvcignYmlkbWFuYWdlcicsICdFUlJPUicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAwID09PSBpLnN1cHByZXNzRW1wdHlLZXlzIHx8ICEwICE9PSBpLnN1cHByZXNzRW1wdHlLZXlzKSAmJiB0ICE9PSBHLlRBUkdFVElOR19LRVlTLkRFQUwgfHwgIVAuaXNFbXB0eVN0cihuKSAmJiBudWxsICE9IG4gPyByW3RdID0gbiA6IFAubG9nSW5mbygnc3VwcHJlc3NpbmcgZW1wdHkga2V5IFwnJyArIHQgKyAnXCcgZnJvbSBhZHNlcnZlciB0YXJnZXRpbmcnKTsKICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0LmFkVW5pdENvZGVdIHx8IChlW3QuYWRVbml0Q29kZV0gPSB7IGJpZHM6IFtdIH0pLCBlW3QuYWRVbml0Q29kZV0uYmlkcy5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAzNjogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBuID0gbiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpIHx8ICgwLCBldmFsKSgndGhpcycpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiB3aW5kb3cgJiYgKG4gPSB3aW5kb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzc6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTYpLCBpID0gbig5MCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByID8gaSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNldC5wcm90b3R5cGUudmFsdWVzLmNhbGwoZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAzNzQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBuKDM3NSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNTIpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcignU3RyaW5nJywgJ2luY2x1ZGVzJyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDM3NTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNCksIGkgPSBuKDM3NiksIG8gPSBuKDQ5KTsKICAgICAgICAgICAgICAgIHIoewogICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ1N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogIW4oMzc4KSgnaW5jbHVkZXMnKQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISF+U3RyaW5nKG8odGhpcykpLmluZGV4T2YoaShlKSwgMSA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzc2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDM3Nyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChyKGUpKQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ1RoZSBtZXRob2QgZG9lc25cJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDM3NzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigyNyksIGkgPSBuKDQ4KSwgbyA9IG4oMjIpKCdtYXRjaCcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihlKSAmJiAodm9pZCAwICE9PSAodCA9IGVbb10pID8gISF0IDogJ1JlZ0V4cCcgPT0gaShlKSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICAzNzg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjIpKCdtYXRjaCcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IC8uLzsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAnLy4vJ1t0XShuKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbltyXSA9ICExLCAnLy4vJ1t0XShuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDM4OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdmJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pLCB0LmggPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudHlwZSAmJiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgIWEoKShPYmplY3Qua2V5cyhzKSwgZSkpIHx8IChPYmplY3QoZC5sb2dFcnJvcikoJycuY29uY2F0KGUsICcgbmF0aXZlUGFyYW0gaXMgbm90IHN1cHBvcnRlZCcpKSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUudHlwZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzW2UudHlwZV07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9LCB0LmcgPSBmdW5jdGlvbiAodCwgZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0KGQuZ2V0QmlkUmVxdWVzdCkodC5yZXF1ZXN0SWQsIGUpOwogICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0KGQuZGVlcEFjY2VzcykodCwgJ25hdGl2ZS5jbGlja1VybCcpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdChkLmRlZXBBY2Nlc3MpKHQsICduYXRpdmUuaW1hZ2UnKSAmJiAoIU9iamVjdChkLmRlZXBBY2Nlc3MpKHQsICduYXRpdmUuaW1hZ2UuaGVpZ2h0JykgfHwgIU9iamVjdChkLmRlZXBBY2Nlc3MpKHQsICduYXRpdmUuaW1hZ2Uud2lkdGgnKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0KGQuZGVlcEFjY2VzcykodCwgJ25hdGl2ZS5pY29uJykgJiYgKCFPYmplY3QoZC5kZWVwQWNjZXNzKSh0LCAnbmF0aXZlLmljb24uaGVpZ2h0JykgfHwgIU9iamVjdChkLmRlZXBBY2Nlc3MpKHQsICduYXRpdmUuaWNvbi53aWR0aCcpKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5uYXRpdmVQYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBPYmplY3Qua2V5cyhyKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByW2VdLnJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbyA9IE9iamVjdC5rZXlzKHQubmF0aXZlKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lm5hdGl2ZVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoKShvLCBlKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHQuYiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgJ2NsaWNrJyA9PT0gZS5hY3Rpb24gPyBuID0gdC5uYXRpdmUgJiYgdC5uYXRpdmUuY2xpY2tUcmFja2VycyA6IChuID0gdC5uYXRpdmUgJiYgdC5uYXRpdmUuaW1wcmVzc2lvblRyYWNrZXJzLCB0Lm5hdGl2ZSAmJiB0Lm5hdGl2ZS5qYXZhc2NyaXB0VHJhY2tlcnMgJiYgT2JqZWN0KGQuaW5zZXJ0SHRtbEludG9JZnJhbWUpKHQubmF0aXZlLmphdmFzY3JpcHRUcmFja2VycykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAobiB8fCBbXSkuZm9yRWFjaChkLnRyaWdnZXJQaXhlbCksIGUuYWN0aW9uOwogICAgICAgICAgICAgICAgfSwgdC5lID0gZnVuY3Rpb24gKG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIE9iamVjdChkLmRlZXBBY2Nlc3MpKGEsICduYXRpdmVQYXJhbXMucmVuZGVyZXJVcmwnKSA/IG8ubmF0aXZlLnJlbmRlcmVyVXJsID0gcChhLm5hdGl2ZVBhcmFtcy5yZW5kZXJlclVybCkgOiBPYmplY3QoZC5kZWVwQWNjZXNzKShhLCAnbmF0aXZlUGFyYW1zLmFkVGVtcGxhdGUnKSAmJiAoby5uYXRpdmUuYWRUZW1wbGF0ZSA9IHAoYS5uYXRpdmVQYXJhbXMuYWRUZW1wbGF0ZSkpOwogICAgICAgICAgICAgICAgICAgIHZhciB1ID0gITEgIT09IE9iamVjdChkLmRlZXBBY2Nlc3MpKGEsICduYXRpdmVQYXJhbXMuc2VuZFRhcmdldGluZ0tleXMnKSwgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGQuZGVlcEFjY2VzcykoZSwgJ25hdGl2ZVBhcmFtcy5leHQnKSAmJiBPYmplY3Qua2V5cyhlLm5hdGl2ZVBhcmFtcy5leHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdID0gJ2hiX25hdGl2ZV8nLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoZih7fSwgbC5OQVRJVkVfS0VZUyksIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGEpLCBlID0gZihmKHt9LCBvLm5hdGl2ZSksIG8ubmF0aXZlLmV4dCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBlLmV4dCwgT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciA9IHNbZV0sIGkgPSBwKG8ubmF0aXZlW2VdKSB8fCBwKE9iamVjdChkLmRlZXBBY2Nlc3MpKG8sICduYXRpdmUuZXh0LicuY29uY2F0KGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdhZFRlbXBsYXRlJyAhPT0gZSAmJiByICYmIGkgJiYgKCdib29sZWFuJyAhPSB0eXBlb2YgKHQgPSBPYmplY3QoZC5kZWVwQWNjZXNzKShhLCAnbmF0aXZlUGFyYW1zLicuY29uY2F0KGUsICcuc2VuZElkJykpKSAmJiAodCA9IE9iamVjdChkLmRlZXBBY2Nlc3MpKGEsICduYXRpdmVQYXJhbXMuZXh0LicuY29uY2F0KGUsICcuc2VuZElkJykpKSwgdCAmJiAoaSA9ICcnLmNvbmNhdChyLCAnOicpLmNvbmNhdChvLmFkSWQpKSwgJ2Jvb2xlYW4nICE9IHR5cGVvZiAobiA9IE9iamVjdChkLmRlZXBBY2Nlc3MpKGEsICduYXRpdmVQYXJhbXMuJy5jb25jYXQoZSwgJy5zZW5kVGFyZ2V0aW5nS2V5cycpKSkgJiYgKG4gPSBPYmplY3QoZC5kZWVwQWNjZXNzKShhLCAnbmF0aXZlUGFyYW1zLmV4dC4nLmNvbmNhdChlLCAnLnNlbmRUYXJnZXRpbmdLZXlzJykpKSwgKCdib29sZWFuJyA9PSB0eXBlb2YgbiA/IG4gOiB1KSAmJiAoY1tyXSA9IGkpKTsKICAgICAgICAgICAgICAgICAgICB9KSwgYzsKICAgICAgICAgICAgICAgIH0sIHQuZCA9IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdhc3NldFJlc3BvbnNlJywKICAgICAgICAgICAgICAgICAgICAgICAgYWRJZDogZS5hZElkLAogICAgICAgICAgICAgICAgICAgICAgICBhc3NldHM6IFtdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByLm5hdGl2ZS5oYXNPd25Qcm9wZXJ0eSgnYWRUZW1wbGF0ZScpICYmIChpLmFkVGVtcGxhdGUgPSBwKHIubmF0aXZlLmFkVGVtcGxhdGUpKTsKICAgICAgICAgICAgICAgICAgICByLm5hdGl2ZS5oYXNPd25Qcm9wZXJ0eSgncmVuZGVyZXJVcmwnKSAmJiAoaS5yZW5kZXJlclVybCA9IHAoci5uYXRpdmUucmVuZGVyZXJVcmwpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hc3NldHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdChkLmdldEtleUJ5VmFsdWUpKGwuTkFUSVZFX0tFWVMsIGUpLCBuID0gcChyLm5hdGl2ZVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGkuYXNzZXRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG4KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICB9LCB0LmMgPSBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gewogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnYXNzZXRSZXNwb25zZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkSWQ6IGUuYWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXRzOiBbXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHIubmF0aXZlKS5mb3JFYWNoKGZ1bmN0aW9uIChuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAnYWRUZW1wbGF0ZScgPT09IG4gJiYgci5uYXRpdmVbbl0gPyBpLmFkVGVtcGxhdGUgPSBwKHIubmF0aXZlW25dKSA6ICdyZW5kZXJlclVybCcgPT09IG4gJiYgci5uYXRpdmVbbl0gPyBpLnJlbmRlcmVyVXJsID0gcChyLm5hdGl2ZVtuXSkgOiAnZXh0JyA9PT0gbiA/IE9iamVjdC5rZXlzKHIubmF0aXZlW25dKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubmF0aXZlW25dW2VdICYmICh0ID0gcChyLm5hdGl2ZVtuXVtlXSksIGkuYXNzZXRzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHIubmF0aXZlW25dICYmIGwuTkFUSVZFX0tFWVMuaGFzT3duUHJvcGVydHkobikgJiYgKHQgPSBwKHIubmF0aXZlW25dKSwgaS5hc3NldHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdAogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGQgPSBuKDApLCByID0gbigxMyksIGEgPSBuLm4ocik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGModCwgZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCByID0gT2JqZWN0LmtleXModCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgKG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHQpLCBlICYmIChuID0gbi5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZSkuZW51bWVyYWJsZTsKICAgICAgICAgICAgICAgICAgICB9KSksIHIucHVzaC5hcHBseShyLCBuKSksIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG51bGwgIT0gYXJndW1lbnRzW2VdID8gYXJndW1lbnRzW2VdIDoge307CiAgICAgICAgICAgICAgICAgICAgICAgIGUgJSAyID8gYyhPYmplY3QobyksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBpLCByID0gb1tuID0gZV0sIG4gaW4gdCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCBuLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdFtuXSA9IHI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhpLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSkgOiBjKE9iamVjdChvKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIGUsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobywgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbCA9IG4oNSksIG8gPSBbXSwgdSA9IE9iamVjdC5rZXlzKGwuTkFUSVZFX0tFWVMpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5OQVRJVkVfS0VZU1tlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiB7IHJlcXVpcmVkOiAhMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHsgcmVxdWlyZWQ6ICEwIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG9uc29yZWRCeTogeyByZXF1aXJlZDogITAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVXJsOiB7IHJlcXVpcmVkOiAhMCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogeyByZXF1aXJlZDogITEgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246IHsgcmVxdWlyZWQ6ICExIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT09IGkoZSkgJiYgZS51cmwgPyBlLnVybCA6IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDM5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5hID0gZnVuY3Rpb24gKHIsIGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG8ubG9nRXJyb3IoJ2Nhbm5vdCBsb2FkIGV4dGVybmFsIHNjcmlwdCB3aXRob3V0IHVybCBhbmQgbW9kdWxlQ29kZScpOwogICAgICAgICAgICAgICAgICAgIGlmICghaSgpKGMsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCBvLmxvZ0Vycm9yKCcnLmNvbmNhdChlLCAnIG5vdCB3aGl0ZWxpc3RlZCBmb3IgbG9hZGluZyBleHRlcm5hbCBKYXZhU2NyaXB0JykpOwogICAgICAgICAgICAgICAgICAgIGlmIChhW3JdKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiB0ICYmIChhW3JdLmxvYWRlZCA/IHQoKSA6IGFbcl0uY2FsbGJhY2tzLnB1c2godCkpLCBhW3JdLnRhZzsKICAgICAgICAgICAgICAgICAgICBhW3JdID0gewogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrczogW10KICAgICAgICAgICAgICAgICAgICB9LCB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQgJiYgYVtyXS5jYWxsYmFja3MucHVzaCh0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5sb2dXYXJuKCdtb2R1bGUgJy5jb25jYXQoZSwgJyBpcyBsb2FkaW5nIGV4dGVybmFsIEphdmFTY3JpcHQnKSksIGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG4udHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnLCBuLmFzeW5jID0gITAsIChhW3JdLnRhZyA9IG4pLnJlYWR5U3RhdGUgPyBuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2FkZWQnICE9PSBuLnJlYWR5U3RhdGUgJiYgJ2NvbXBsZXRlJyAhPT0gbi5yZWFkeVN0YXRlIHx8IChuLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBuLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uc3JjID0gZSwgby5pbnNlcnRFbGVtZW50KG4pLCBuOwogICAgICAgICAgICAgICAgICAgIH0ociwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBhW3JdLmxvYWRlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDA7IGUgPCBhW3JdLmNhbGxiYWNrcy5sZW5ndGg7IGUrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW3JdLmNhbGxiYWNrc1tlXSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmxvZ0Vycm9yKCdFcnJvciBleGVjdXRpbmcgY2FsbGJhY2snLCAnYWRsb2FkZXIuanM6bG9hZEV4dGVybmFsU2NyaXB0JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTMpLCBpID0gbi5uKHIpLCBvID0gbigwKSwgYSA9IHt9LCBjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnYWRsb294JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NyaXRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICdvdXRzdHJlYW0nLAogICAgICAgICAgICAgICAgICAgICAgICAnYWRhZ2lvJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Jyb3dzaScKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9LAogICAgICAgICAgICA0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfSksIHQuYiA9IGk7CiAgICAgICAgICAgICAgICB2YXIgbCA9IG4oMyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAocCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBnKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGcgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBiID0gbigwKSwgdiA9IDQsIHIgPSBpKCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiAzMDAwLCBlID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiB7fSwgZCA9IGUucmVxdWVzdCwgZiA9IGUuZG9uZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAzIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8gPSByLm1ldGhvZCB8fCAobiA/ICdQT1NUJyA6ICdHRVQnKSwgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaHJlZiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYywgdSA9ICdvYmplY3QnID09PSBnKHQpICYmIG51bGwgIT09IHQgPyB0IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxvZ01lc3NhZ2UoJ3hociBzdWNjZXNzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5sb2dFcnJvcigneGhyIGVycm9yJywgbnVsbCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdCAmJiAodS5zdWNjZXNzID0gdCksIChpID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpKS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5yZWFkeVN0YXRlID09PSB2ICYmICgnZnVuY3Rpb24nID09IHR5cGVvZiBmICYmIGYoYS5vcmlnaW4pLCAyMDAgPD0gKGUgPSBpLnN0YXR1cykgJiYgZSA8IDMwMCB8fCAzMDQgPT09IGUgPyB1LnN1Y2Nlc3MoaS5yZXNwb25zZVRleHQsIGkpIDogdS5lcnJvcihpLnN0YXR1c1RleHQsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGwuYi5nZXRDb25maWcoJ2Rpc2FibGVBamF4VGltZW91dCcpIHx8IChpLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmxvZ0Vycm9yKCcgIHhociB0aW1lb3V0IGFmdGVyICcsIGkudGltZW91dCwgJ21zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgJ0dFVCcgPT09IG8gJiYgbiAmJiAocCgoYyA9IGIucGFyc2VVcmwoZSwgcikpLnNlYXJjaCwgbiksIGUgPSBiLmJ1aWxkVXJsKGMpKSwgaS5vcGVuKG8sIGUsICEwKSwgbC5iLmdldENvbmZpZygnZGlzYWJsZUFqYXhUaW1lb3V0JykgfHwgKGkudGltZW91dCA9IHMpLCByLndpdGhDcmVkZW50aWFscyAmJiAoaS53aXRoQ3JlZGVudGlhbHMgPSAhMCksIGIuX2VhY2goci5jdXN0b21IZWFkZXJzLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuc2V0UmVxdWVzdEhlYWRlcih0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLnByZWZsaWdodCAmJiBpLnNldFJlcXVlc3RIZWFkZXIoJ1gtUmVxdWVzdGVkLVdpdGgnLCAnWE1MSHR0cFJlcXVlc3QnKSwgaS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCByLmNvbnRlbnRUeXBlIHx8ICd0ZXh0L3BsYWluJyksICdmdW5jdGlvbicgPT0gdHlwZW9mIGQgJiYgZChhLm9yaWdpbiksICdQT1NUJyA9PT0gbyAmJiBuID8gaS5zZW5kKG4pIDogaS5zZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIubG9nRXJyb3IoJ3hociBjb25zdHJ1Y3Rpb24nLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQwOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0ge307CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDE1KSwgbyA9IG4oMjEpLCBhID0gbigyMikoJ3NwZWNpZXMnKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHIgPSBpKGUpLmNvbnN0cnVjdG9yOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgPT09IHIgfHwgbnVsbCA9PSAobiA9IGkocilbYV0pID8gdCA6IG8obik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA0MjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2InLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFI7CiAgICAgICAgICAgICAgICB9KSwgdC5jID0gaywgbi5kKHQsICdkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgQSA9IG4oMCksIEUgPSBuKDMpLCBPID0gbigzOCksIHIgPSBuKDIzKSwgaSA9IG4oOTMpLCBvID0gbigyKSwgYSA9IG4oMTEpLCBjID0gbigxMyksIFQgPSBuLm4oYyksIHUgPSBuKDEwKSwgSSA9IG4ubih1KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChqID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0IGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgIH0pIDogZVt0XSA9IG4sIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlKTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IG4gJiYgZS5jb25zdHJ1Y3RvciAmJiAobiA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IG4gfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KHQpOyBuIDwgdDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfID0gbigwKSwgeCA9IG4oNSksIEIgPSBbXSwgVSA9IE9iamVjdC5rZXlzKHguVEFSR0VUSU5HX0tFWVMpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5UQVJHRVRJTkdfS0VZU1tlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNCaWROb3RFeHBpcmVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucmVzcG9uc2VUaW1lc3RhbXAgKyAxMDAwICogZS50dGwgLSAxMDAwID4gT2JqZWN0KEEudGltZXN0YW1wKSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpc1VudXNlZEJpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIChlLnN0YXR1cyAmJiAhVCgpKFt4LkJJRF9TVEFUVVMuUkVOREVSRURdLCBlLnN0YXR1cykgfHwgIWUuc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFIgPSBPYmplY3QoYS5iKSgnc3luYycsIGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMl0gPyBhcmd1bWVudHNbMl0gOiAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMyA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbM10gJiYgYXJndW1lbnRzWzNdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gW10sIGEgPSBFLmIuZ2V0Q29uZmlnKCdzZW5kQmlkc0NvbnRyb2wuZGVhbFByaW9yaXRpemF0aW9uJyksIGMgPSBPYmplY3QoQS5ncm91cEJ5KShlLCAnYWRVbml0Q29kZScpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9IE9iamVjdChBLmdyb3VwQnkpKGNbZV0sICdiaWRkZXJDb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucHVzaChuW2VdLnJlZHVjZShyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMCA8IGkgPyAodCA9IGEgPyB0LnNvcnQoayghMCkpIDogdC5zb3J0KGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuY3BtIC0gZS5jcG07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5wdXNoLmFwcGx5KG8sIHcodC5zbGljZSgwLCBpKSkpKSA6IG8ucHVzaC5hcHBseShvLCB3KHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG87CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gJiYgYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlLmFkc2VydmVyVGFyZ2V0aW5nLmhiX2RlYWwgJiYgdm9pZCAwID09PSB0LmFkc2VydmVyVGFyZ2V0aW5nLmhiX2RlYWwgPyAtMSA6IHZvaWQgMCA9PT0gZS5hZHNlcnZlclRhcmdldGluZy5oYl9kZWFsICYmIHZvaWQgMCAhPT0gdC5hZHNlcnZlclRhcmdldGluZy5oYl9kZWFsID8gMSA6IG4gPyB0LmNwbSAtIGUuY3BtIDogdC5hZHNlcnZlclRhcmdldGluZy5oYl9wYiAtIGUuYWRzZXJ2ZXJUYXJnZXRpbmcuaGJfcGI7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBELCBOLCBmLCBsID0gKEQgPSByLmEsIGYgPSB7fSwgKE4gPSB7fSkuc2V0TGF0ZXN0QXVjdGlvbkZvckFkVW5pdCA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZbZV0gPSB0OwogICAgICAgICAgICAgICAgICAgIH0sIE4ucmVzZXRQcmVzZXRUYXJnZXRpbmcgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KEEuaXNHcHRQdWJhZHNEZWZpbmVkKSgpICYmIChuID0gTShlKSwgaSA9IEQuZ2V0QWRVbml0cygpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQoKShuLCBlLmNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgd2luZG93Lmdvb2dsZXRhZy5wdWJhZHMoKS5nZXRTbG90cygpLmZvckVhY2goZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gXy5pc0ZuKHQpICYmIHQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuY29kZSA9PT0gbi5nZXRBZFVuaXRQYXRoKCkgfHwgZS5jb2RlID09PSBuLmdldFNsb3RFbGVtZW50SWQoKSB8fCBfLmlzRm4ocikgJiYgcihlLmNvZGUpKSAmJiBuLnNldFRhcmdldGluZyh0LCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSwgTi5yZXNldFByZXNldFRhcmdldGluZ0FTVCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE0oZSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIgPSB3aW5kb3cuYXBudGFnLmdldFRhZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgci5rZXl3b3JkcyAmJiAodCA9IE9iamVjdC5rZXlzKHIua2V5d29yZHMpLCBuID0ge30sIHQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQoKShCLCBlLnRvTG93ZXJDYXNlKCkpIHx8IChuW2VdID0gci5rZXl3b3Jkc1tlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgd2luZG93LmFwbnRhZy5tb2RpZnlUYWcoZSwgeyBrZXl3b3JkczogbiB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIE4uZ2V0QWxsVGFyZ2V0aW5nID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIsIGksIG8sIGEsIGMsIHUsIHMsIGQsIGYgPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IHEoKSwgbCA9IE0oZSksIHAgPSAoYyA9IGwsIHUgPSBmLCBzID0gTi5nZXRXaW5uaW5nQmlkcyhjLCB1KSwgZCA9IEcoKSwgKHMgPSBzLm1hcChmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDKHt9LCBvLmFkVW5pdENvZGUsIE9iamVjdC5rZXlzKG8uYWRzZXJ2ZXJUYXJnZXRpbmcpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBvLnNlbmRTdGFuZGFyZFRhcmdldGluZyB8fCBvLnNlbmRTdGFuZGFyZFRhcmdldGluZyB8fCAtMSA9PT0gZC5pbmRleE9mKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtvLmFkc2VydmVyVGFyZ2V0aW5nW3RdXSwgciA9IEMoe30sIHQuc3Vic3RyaW5nKDAsIDIwKSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICE9PSB4LlRBUkdFVElOR19LRVlTLkRFQUwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10uY29uY2F0KHcoZSksIFtyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gQyh7fSwgJycuY29uY2F0KHQsICdfJykuY29uY2F0KG8uYmlkZGVyQ29kZSkuc3Vic3RyaW5nKDAsIDIwKSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXS5jb25jYXQodyhlKSwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKS5jb25jYXQoKGEgPSBsLCBmLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKCkoYSwgZS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqKHt9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShXLCBbXSkubWFwKEwpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKS5jb25jYXQoRS5iLmdldENvbmZpZygnZW5hYmxlU2VuZEFsbEJpZHMnKSA/IChuID0gbCwgciA9IGYsIGkgPSBVLmNvbmNhdChPLmEpLCBvID0gRS5iLmdldENvbmZpZygnc2VuZEJpZHNDb250cm9sLmJpZExpbWl0JyksIFIociwgQS5nZXRIaWdoZXN0Q3BtLCBvKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUCh0LCBuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIHQuYWRVbml0Q29kZSwgRih0LCBpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gdC5hZHNlcnZlclRhcmdldGluZ1tlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoITAgIT09IEUuYi5nZXRDb25maWcoJ3RhcmdldGluZ0NvbnRyb2xzLmFsd2F5c0luY2x1ZGVEZWFscycpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBVLmNvbmNhdChPLmEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSKHQsIEEuZ2V0SGlnaGVzdENwbSkubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmRlYWxJZCAmJiBQKHQsIGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIHQuYWRVbml0Q29kZSwgRih0LCBuLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIDAgIT09IHQuYWRzZXJ2ZXJUYXJnZXRpbmdbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obCwgZikpLmNvbmNhdCgodCA9IGwsIEQuZ2V0QWRVbml0cygpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKCkodCwgZS5jb2RlKSAmJiBnKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIGUuY29kZSwgKHQgPSBnKGUpLCBPYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIGUsIF8uaXNBcnJheSh0W2VdKSA/IHRbZV0gOiB0W2VdLnNwbGl0KCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KEEuZGVlcEFjY2VzcykoZSwgeC5KU09OX01BUFBJTkcuQURTRVJWRVJfVEFSR0VUSU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlXS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPT09IEIuaW5kZXhPZihPYmplY3Qua2V5cyhlKVswXSkgJiYgKEIgPSBPYmplY3Qua2V5cyhlKS5jb25jYXQoQikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IE9iamVjdC5rZXlzKGooe30sIHguREVGQVVMVF9UQVJHRVRJTkdfS0VZUywgeC5OQVRJVkVfS0VZUykpLCB2ID0gRS5iLmdldENvbmZpZygndGFyZ2V0aW5nQ29udHJvbHMuYWxsb3dUYXJnZXRpbmdLZXlzJykgfHwgYjsKICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh2KSAmJiAwIDwgdi5sZW5ndGggJiYgKHAgPSBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBqKHt9LCB4LlRBUkdFVElOR19LRVlTLCB4Lk5BVElWRV9LRVlTKSwgbyA9IE9iamVjdC5rZXlzKGkpLCBhID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QoQS5sb2dJbmZvKSgnYWxsb3dUYXJnZXRpbmdLZXlzIC0gYWxsb3dlZCBrZXlzIFsgJy5jb25jYXQoci5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywgJyksICcgXScpKSwgZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5rZXlzKGUpWzBdLCBuID0gZVt0XS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmtleXMoZSlbMF0sIHQgPSAwID09PSBvLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gbi5pbmRleE9mKGlbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmxlbmd0aCB8fCBJKCkociwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBpW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA9PT0gbi5pbmRleE9mKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbbl0gPSAhdCwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVt0XSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LmtleXMoYSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoQS5sb2dJbmZvKSgnYWxsb3dUYXJnZXRpbmdLZXlzIC0gcmVtb3ZlZCBrZXlzIFsgJy5jb25jYXQodC5qb2luKCcsICcpLCAnIF0nKSksIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCBlW09iamVjdC5rZXlzKGUpWzBdXS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfShwLCB2KSksIHAgPSBwLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIE9iamVjdC5rZXlzKGUpWzBdLCBlW09iamVjdC5rZXlzKGUpWzBdXS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQyh7fSwgT2JqZWN0LmtleXMoZSlbMF0sIGVbT2JqZWN0LmtleXMoZSlbMF1dLmpvaW4oJywgJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoodCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LmtleXModClbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtuXSA9IGooe30sIGVbbl0sIHRbbl0pLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5LCBoLCBtLCBTID0gRS5iLmdldENvbmZpZygndGFyZ2V0aW5nQ29udHJvbHMuYXVjdGlvbktleU1heENoYXJzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTICYmIChPYmplY3QoQS5sb2dJbmZvKSgnRGV0ZWN0ZWQgXCd0YXJnZXRpbmdDb250cm9scy5hdWN0aW9uS2V5TWF4Q2hhcnNcJyB3YXMgYWN0aXZlIGZvciB0aGlzIGF1Y3Rpb247IHNldCB3aXRoIGEgbGltaXQgb2YgJy5jb25jYXQoUywgJyBjaGFyYWN0ZXJzLiAgUnVubmluZyBjaGVja3Mgb24gYXVjdGlvbiBrZXlzLi4uJykpLCB5ID0gcCwgaCA9IFMsIG0gPSBPYmplY3QoQS5kZWVwQ2xvbmUpKHkpLCBwID0gT2JqZWN0LmtleXMobSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRzZXJ2ZXJUYXJnZXRpbmc6IG1bZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnNvcnQoaygpKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBvID0gKGkgPSB0LmFkc2VydmVyVGFyZ2V0aW5nLCBPYmplY3Qua2V5cyhpKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgKyAnJy5jb25jYXQodCwgJyUzZCcpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoaVt0XSksICclMjYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAnJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArIDEgPT09IHIubGVuZ3RoICYmIChvID0gby5zbGljZSgwLCAtMykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSB0LmFkVW5pdENvZGUsIGMgPSBvLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjIDw9IGggPyAoaCAtPSBjLCBPYmplY3QoQS5sb2dJbmZvKSgnQWRVbml0IFwnJy5jb25jYXQoYSwgJ1wnIGF1Y3Rpb24ga2V5cyBjb21wcmlzZWQgb2YgJykuY29uY2F0KGMsICcgY2hhcmFjdGVycy4gIERlZHVjdGVkIGZyb20gcnVubmluZyB0aHJlc2hvbGQ7IG5ldyBsaW1pdCBpcyAnKS5jb25jYXQoaCksIG1bYV0pLCBlW2FdID0gbVthXSkgOiBPYmplY3QoQS5sb2dXYXJuKSgnVGhlIGZvbGxvd2luZyBrZXlzIGZvciBhZFVuaXRDb2RlIFwnJy5jb25jYXQoYSwgJ1wnIGV4Y2VlZGVkIHRoZSBjdXJyZW50IGxpbWl0IG9mIHRoZSBcJ2F1Y3Rpb25LZXlNYXhDaGFyc1wnIHNldHRpbmcuXG5UaGUga2V5LXNldCBzaXplIHdhcyAnKS5jb25jYXQoYywgJywgdGhlIGN1cnJlbnQgYWxsb3R0ZWQgYW1vdW50IHdhcyAnKS5jb25jYXQoaCwgJy5cbicpLCBtW2FdKSwgbiArIDEgPT09IHIubGVuZ3RoICYmIDAgPT09IE9iamVjdC5rZXlzKGUpLmxlbmd0aCAmJiBPYmplY3QoQS5sb2dFcnJvcikoJ05vIGF1Y3Rpb24gdGFyZ2V0aW5nIGtleXMgd2VyZSBwZXJtaXR0ZWQgZHVlIHRvIHRoZSBzZXR0aW5nIGluIHNldENvbmZpZyh0YXJnZXRpbmdDb250cm9scy5hdWN0aW9uS2V5TWF4Q2hhcnMpLiAgUGxlYXNlIHJldmlldyBzZXR1cCBhbmQgY29uc2lkZXIgYWRqdXN0aW5nLicpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSkpLCBsLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbZV0gfHwgKHBbZV0gPSB7fSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBwOwogICAgICAgICAgICAgICAgICAgIH0sIE4uc2V0VGFyZ2V0aW5nRm9yR1BUID0gZnVuY3Rpb24gKGksIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmdvb2dsZXRhZy5wdWJhZHMoKS5nZXRTbG90cygpLmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGkpLmZpbHRlcigoZSB8fCBPYmplY3QoQS5pc0FkVW5pdENvZGVNYXRjaGluZ1Nsb3QpKShyKSkuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpW25dKS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gaVtuXVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUgJiYgKGUgPSBlLnNwbGl0KCcsJykpLCAoZSA9IDEgPCBlLmxlbmd0aCA/IFtlXSA6IGUpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8ubG9nTWVzc2FnZSgnQXR0ZW1wdGluZyB0byBzZXQga2V5IHZhbHVlIGZvciBzbG90OiAnLmNvbmNhdChyLmdldFNsb3RFbGVtZW50SWQoKSwgJyBrZXk6ICcpLmNvbmNhdCh0LCAnIHZhbHVlOiAnKS5jb25jYXQoZSkpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNldFRhcmdldGluZyh0LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSwgTi5nZXRXaW5uaW5nQmlkcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMV0gPyBhcmd1bWVudHNbMV0gOiBxKCksIHQgPSBNKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUKCkodCwgZS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IGUuY3BtOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkVW5pdENvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihBLnVuaXF1ZXMpLm1hcChmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZSA9PT0gdCA/IGUgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKEEuZ2V0SGlnaGVzdENwbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIE4uc2V0VGFyZ2V0aW5nRm9yQXN0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBOLmdldEFsbFRhcmdldGluZyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4ucmVzZXRQcmVzZXRUYXJnZXRpbmdBU1QoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ubG9nRXJyb3IoJ3VuYWJsZSB0byByZXNldCB0YXJnZXRpbmcgZm9yIEFTVCcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyKS5mb3JFYWNoKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocltuXSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ubG9nTWVzc2FnZSgnQXR0ZW1wdGluZyB0byBzZXQgdGFyZ2V0aW5nIGZvciB0YXJnZXRJZDogJy5jb25jYXQobiwgJyBrZXk6ICcpLmNvbmNhdChlLCAnIHZhbHVlOiAnKS5jb25jYXQocltuXVtlXSkpLCAoXy5pc1N0cihyW25dW2VdKSB8fCBfLmlzQXJyYXkocltuXVtlXSkpICYmICh0ID0ge30sIGUuc2VhcmNoKC9wdFswLTldLykgPCAwID8gdFtlLnRvVXBwZXJDYXNlKCldID0gcltuXVtlXSA6IHRbZV0gPSByW25dW2VdLCB3aW5kb3cuYXBudGFnLnNldEtleXdvcmRzKG4sIHQsIHsgb3ZlcnJpZGVLZXlWYWx1ZTogITAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sIE4uaXNBcG50YWdEZWZpbmVkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmFwbnRhZyAmJiBfLmlzRm4od2luZG93LmFwbnRhZy5zZXRLZXl3b3JkcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSwgTik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZHNlcnZlclRhcmdldGluZyAmJiB0ICYmIChfLmlzQXJyYXkodCkgJiYgVCgpKHQsIGUuYWRVbml0Q29kZSkgfHwgJ3N0cmluZycgPT0gdHlwZW9mIHQgJiYgZS5hZFVuaXRDb2RlID09PSB0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IFtlXSA6IF8uaXNBcnJheShlKSA/IGUgOiBELmdldEFkVW5pdENvZGVzKCkgfHwgW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gRC5nZXRCaWRzUmVjZWl2ZWQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRS5iLmdldENvbmZpZygndXNlQmlkQ2FjaGUnKSB8fCAoZSA9IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmW2UuYWRVbml0Q29kZV0gPT09IGUuYXVjdGlvbklkOwogICAgICAgICAgICAgICAgICAgIH0pKSwgZSA9IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QoQS5kZWVwQWNjZXNzKShlLCAndmlkZW8uY29udGV4dCcpICE9PSBvLmE7CiAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFubmVyJyAhPT0gZS5tZWRpYVR5cGUgfHwgT2JqZWN0KGkuYykoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihkLmlzVW51c2VkQmlkKS5maWx0ZXIoZC5pc0JpZE5vdEV4cGlyZWQpLCBSKGUsIEEuZ2V0T2xkZXN0SGlnaGVzdENwbUJpZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBELmdldFN0YW5kYXJkQmlkZGVyQWRTZXJ2ZXJUYXJnZXRpbmcoKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUua2V5OwogICAgICAgICAgICAgICAgICAgIH0pLmNvbmNhdChVKS5maWx0ZXIoQS51bmlxdWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFcociwgaSwgZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpLmFkc2VydmVyVGFyZ2V0aW5nKS5maWx0ZXIocCgpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuOwogICAgICAgICAgICAgICAgICAgICAgICByLmxlbmd0aCAmJiByLmZpbHRlcigobiA9IGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hZFVuaXRDb2RlID09PSBpLmFkVW5pdENvZGUgJiYgZS5hZHNlcnZlclRhcmdldGluZ1tuXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLmZvckVhY2goKHQgPSBlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5pc0FycmF5KGUuYWRzZXJ2ZXJUYXJnZXRpbmdbdF0pIHx8IChlLmFkc2VydmVyVGFyZ2V0aW5nW3RdID0gW2UuYWRzZXJ2ZXJUYXJnZXRpbmdbdF1dKSwgZS5hZHNlcnZlclRhcmdldGluZ1t0XSA9IGUuYWRzZXJ2ZXJUYXJnZXRpbmdbdF0uY29uY2F0KGkuYWRzZXJ2ZXJUYXJnZXRpbmdbdF0pLmZpbHRlcihBLnVuaXF1ZXMpLCBkZWxldGUgaS5hZHNlcnZlclRhcmdldGluZ1t0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pLCByLnB1c2goaSksIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRygpLmNvbmNhdChPLmEpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IHQuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTCh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoe30sIHQuYWRVbml0Q29kZSwgT2JqZWN0LmtleXModC5hZHNlcnZlclRhcmdldGluZykuZmlsdGVyKHAoKSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDKHt9LCBlLnN1YnN0cmluZygwLCAyMCksIFt0LmFkc2VydmVyVGFyZ2V0aW5nW2VdXSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRih0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDKHt9LCAnJy5jb25jYXQoZSwgJ18nKS5jb25jYXQodC5iaWRkZXJDb2RlKS5zdWJzdHJpbmcoMCwgMjApLCBbdC5hZHNlcnZlclRhcmdldGluZ1tlXV0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICA0MzogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHt9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA0NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIG4uZCh0LCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIGEgPSBuKDApLCByID0gbigzKSwgaSA9IG4oMTMpLCBvID0gbi5uKGkpLCBjID0gbig3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbXSwgciA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBjID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEociA9IChhID0gYy5uZXh0KCkpLmRvbmUpICYmIChuLnB1c2goYS52YWx1ZSksICF0IHx8IG4ubGVuZ3RoICE9PSB0KTsgciA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8fCBudWxsID09IGMucmV0dXJuIHx8IGMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gbiAmJiBlLmNvbnN0cnVjdG9yICYmIChuID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSBuIHx8ICdTZXQnID09PSBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIHQpOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgciA9IG5ldyBBcnJheSh0KTsgbiA8IHQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgcltuXSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoZCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCByKSAmJiAoZVtyXSA9IG5bcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByLmIuc2V0RGVmYXVsdHMoewogICAgICAgICAgICAgICAgICAgIHVzZXJTeW5jOiBhLmRlZXBDbG9uZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNFbmFibGVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyU2V0dGluZ3M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyczogJyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogJ2luY2x1ZGUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNzUGVyQmlkZGVyOiA1LAogICAgICAgICAgICAgICAgICAgICAgICBzeW5jRGVsYXk6IDMwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25EZWxheTogMAogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBmID0gT2JqZWN0KGMuYSkoJ3VzZXJzeW5jJyk7CiAgICAgICAgICAgICAgICB2YXIgbCwgcCwgZywgYiwgdiwgeSwgaCwgbSA9ICFhLmlzU2FmYXJpQnJvd3NlcigpICYmIGYuY29va2llc0FyZUVuYWJsZWQoKSwgUyA9IChsID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHIuYi5nZXRDb25maWcoJ3VzZXJTeW5jJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0c0Nvb2tpZXM6IG0KICAgICAgICAgICAgICAgICAgICB9LCBwID0ge30sIGcgPSBBKCksIGIgPSBuZXcgU2V0KCksIHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiAhKHYgPSB7fSkKICAgICAgICAgICAgICAgICAgICB9LCBoID0gbC5jb25maWcsIHIuYi5nZXRDb25maWcoJ3VzZXJTeW5jJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGUudXNlclN5bmMgJiYgKHQgPSBlLnVzZXJTeW5jLmZpbHRlclNldHRpbmdzLCBhLmlzUGxhaW5PYmplY3QodCkgJiYgKHQuaW1hZ2UgfHwgdC5hbGwgfHwgKGUudXNlclN5bmMuZmlsdGVyU2V0dGluZ3MuaW1hZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6ICdpbmNsdWRlJwogICAgICAgICAgICAgICAgICAgICAgICB9KSkpLCBoID0gZChoLCBlLnVzZXJTeW5jKTsKICAgICAgICAgICAgICAgICAgICB9KSwgcC5yZWdpc3RlclN5bmMgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYi5oYXModCkgPyBhLmxvZ01lc3NhZ2UoJ2FscmVhZHkgZmlyZWQgc3luY3MgZm9yICInLmNvbmNhdCh0LCAnIiwgaWdub3JpbmcgcmVnaXN0ZXJTeW5jIGNhbGwnKSkgOiBoLnN5bmNFbmFibGVkICYmIGEuaXNBcnJheShnW2VdKSA/IHQgPyAwICE9PSBoLnN5bmNzUGVyQmlkZGVyICYmIE51bWJlcih2W3RdKSA+PSBoLnN5bmNzUGVyQmlkZGVyID8gYS5sb2dXYXJuKCdOdW1iZXIgb2YgdXNlciBzeW5jcyBleGNlZWRlZCBmb3IgIicuY29uY2F0KHQsICciJykpIDogcC5jYW5CaWRkZXJSZWdpc3RlclN5bmMoZSwgdCkgPyAoZ1tlXS5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuCiAgICAgICAgICAgICAgICAgICAgICAgIF0pLCAociA9IHYpW2kgPSB0XSA/IHJbaV0gKz0gMSA6IHJbaV0gPSAxLCB2b2lkICh2ID0gcikpIDogYS5sb2dXYXJuKCdCaWRkZXIgIicuY29uY2F0KHQsICciIG5vdCBwZXJtaXR0ZWQgdG8gcmVnaXN0ZXIgdGhlaXIgIicpLmNvbmNhdChlLCAnIiB1c2VyU3luYyBwaXhlbHMuJykpIDogYS5sb2dXYXJuKCdCaWRkZXIgaXMgcmVxdWlyZWQgZm9yIHJlZ2lzdGVyaW5nIHN5bmMnKSA6IGEubG9nV2FybignVXNlciBzeW5jIHR5cGUgIicuY29uY2F0KGUsICciIG5vdCBzdXBwb3J0ZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBpOwogICAgICAgICAgICAgICAgICAgIH0sIHAuc3luY1VzZXJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChFLCBOdW1iZXIoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICBFKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgcC50cmlnZ2VyVXNlclN5bmNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBoLmVuYWJsZU92ZXJyaWRlICYmIHAuc3luY1VzZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgcC5jYW5CaWRkZXJSZWdpc3RlclN5bmMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWguZmlsdGVyU2V0dGluZ3MgfHwgIVQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSwgcCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lOiBbXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChoLnN5bmNFbmFibGVkICYmIGwuYnJvd3NlclN1cHBvcnRzQ29va2llcykgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXkuaW1hZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPKGcuaW1hZ2UsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdShlLCAyKSwgbiA9IHRbMF0sIHIgPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmxvZ01lc3NhZ2UoJ0ludm9raW5nIGltYWdlIHBpeGVsIHVzZXIgc3luYyBmb3IgYmlkZGVyOiAnLmNvbmNhdChuKSksIGEudHJpZ2dlclBpeGVsKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF5LmlmcmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8oZy5pZnJhbWUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdShlLCAyKSwgbiA9IHRbMF0sIHIgPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmxvZ01lc3NhZ2UoJ0ludm9raW5nIGlmcmFtZSB1c2VyIHN5bmMgZm9yIGJpZGRlcjogJy5jb25jYXQobikpLCBhLmluc2VydFVzZXJTeW5jSWZyYW1lKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dFcnJvcignRXJyb3IgZmlyaW5nIHVzZXIgc3luY3MnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBnID0gQSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGEuc2h1ZmZsZShlKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQoZSksIGIuYWRkKGVbMF0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBoLmZpbHRlclNldHRpbmdzOwogICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYWxsICYmIGVbdF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEubG9nV2FybignRGV0ZWN0ZWQgcHJlc2VuY2Ugb2YgdGhlICJmaWx0ZXJTZXR0aW5ncy5hbGwiIGFuZCAiZmlsdGVyU2V0dGluZ3MuJy5jb25jYXQodCwgJyIgaW4gdXNlclN5bmMgY29uZmlnLiAgWW91IGNhbm5vdCBtaXggImFsbCIgd2l0aCAiaWZyYW1lL2ltYWdlIiBjb25maWdzOyB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUuJykpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS5hbGwgPyBlLmFsbCA6IGVbdF0sIHIgPSBlLmFsbCA/ICdhbGwnIDogdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IG4uZmlsdGVyLCBvID0gbi5iaWRkZXJzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgJiYgJ2luY2x1ZGUnICE9PSBpICYmICdleGNsdWRlJyAhPT0gaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sb2dXYXJuKCdVc2VyU3luYyAiZmlsdGVyU2V0dGluZ3MuJy5jb25jYXQociwgJy5maWx0ZXIiIHNldHRpbmcgXCcnKS5jb25jYXQoaSwgJ1wnIGlzIG5vdCBhIHZhbGlkIG9wdGlvbjsgdXNlIGVpdGhlciBcJ2luY2x1ZGVcJyBvciBcJ2V4Y2x1ZGVcJy4nKSksICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKCcqJyA9PT0gbyB8fCBBcnJheS5pc0FycmF5KG8pICYmIDAgPCBvLmxlbmd0aCAmJiBvLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaXNTdHIoZSkgJiYgJyonICE9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IChhLmxvZ1dhcm4oJ0RldGVjdGVkIGFuIGludmFsaWQgc2V0dXAgaW4gdXNlclN5bmMgImZpbHRlclNldHRpbmdzLicuY29uY2F0KHIsICcuYmlkZGVycyI7IHVzZSBlaXRoZXIgXCcqXCcgKHRvIHJlcHJlc2VudCBhbGwgYmlkZGVycykgb3IgYW4gYXJyYXkgb2YgYmlkZGVycy4nKSksICExKTsKICAgICAgICAgICAgICAgICAgICAgICAgfShuLCBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICB5W2VdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5hbGwgPyBuLmFsbCA6IG5bZV0sIGkgPSAnKicgPT09IHIuYmlkZGVycyA/IFt0XSA6IHIuYmlkZGVyczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFvKCkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbygpKGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9W3IuZmlsdGVyIHx8ICdpbmNsdWRlJ10oaSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAheVtlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgNDU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBuLmQodCwgJ2EnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdiJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTApLCB2ID0gbi5uKHIpLCBpID0gbigwKSwgeSA9IDIsIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sIGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICB9LCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICBidWNrZXRzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgICAgICAgIH0sIHUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50OiAwLjAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0czogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heDogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMDUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnQ6IDAuMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXg6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudDogMC41CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IDEsIHIgPSBwYXJzZUZsb2F0KGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihyKSAmJiAociA9ICcnKSwgewogICAgICAgICAgICAgICAgICAgICAgICBsb3c6ICcnID09PSByID8gJycgOiBmKGUsIG8sIG4pLAogICAgICAgICAgICAgICAgICAgICAgICBtZWQ6ICcnID09PSByID8gJycgOiBmKGUsIGEsIG4pLAogICAgICAgICAgICAgICAgICAgICAgICBoaWdoOiAnJyA9PT0gciA/ICcnIDogZihlLCBjLCBuKSwKICAgICAgICAgICAgICAgICAgICAgICAgYXV0bzogJycgPT09IHIgPyAnJyA6IGYoZSwgcywgbiksCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnNlOiAnJyA9PT0gciA/ICcnIDogZihlLCB1LCBuKSwKICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tOiAnJyA9PT0gciA/ICcnIDogZihlLCB0LCBuKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKG4sIGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaSA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICghaChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG8sIGEsIGMsIHUsIHMsIGQsIGYsIGwsIHAgPSBlLmJ1Y2tldHMucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXggPiB0Lm1heCA/IGUgOiB0OwogICAgICAgICAgICAgICAgICAgICAgICB9LCB7IG1heDogMCB9KSwgZyA9IDAsIGIgPSB2KCkoZS5idWNrZXRzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPiBwLm1heCAqIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucHJlY2lzaW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdCAmJiAodCA9IHkpLCBpID0gKGUubWF4ICogcikudG9GaXhlZCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPD0gZS5tYXggKiByICYmIGcgKiByIDw9IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLm1pbiA9IGcsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGUubWF4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiAmJiAodCA9IG4sIGEgPSByLCBjID0gdm9pZCAwICE9PSAobyA9IGIpLnByZWNpc2lvbiA/IG8ucHJlY2lzaW9uIDogeSwgdSA9IG8uaW5jcmVtZW50ICogYSwgcyA9IG8ubWluICogYSwgZCA9IE1hdGgucG93KDEwLCBjICsgMiksIGYgPSAodCAqIGQgLSBzICogZCkgLyAodSAqIGQpLCBsID0gTWF0aC5mbG9vcihmKSAqIHUgKyBzLCBpID0gKGwgPSBOdW1iZXIobC50b0ZpeGVkKDEwKSkpLnRvRml4ZWQoYykpLCBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkuaXNFbXB0eShlKSB8fCAhZS5idWNrZXRzIHx8ICFBcnJheS5pc0FycmF5KGUuYnVja2V0cykpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICEwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJ1Y2tldHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLm1heCAmJiBlLmluY3JlbWVudCB8fCAodCA9ICExKTsKICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgNDY6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEoMSAmIGUpLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEoMiAmIGUpLAogICAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogISg0ICYgZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQ3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDcyKSwgaSA9IG4oNDkpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcihpKGUpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQ4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSB7fS50b1N0cmluZzsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA0OTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdDYW5cJ3QgY2FsbCBtZXRob2Qgb24gJyArIGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBKU09OX01BUFBJTkc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgUExfQ09ERTogJ2NvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICBQTF9TSVpFOiAnc2l6ZXMnLAogICAgICAgICAgICAgICAgICAgICAgICBQTF9CSURTOiAnYmlkcycsCiAgICAgICAgICAgICAgICAgICAgICAgIEJEX0JJRERFUjogJ2JpZGRlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIEJEX0lEOiAncGFyYW1zZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJEX1BMX0lEOiAncGxhY2VtZW50SWQnLAogICAgICAgICAgICAgICAgICAgICAgICBBRFNFUlZFUl9UQVJHRVRJTkc6ICdhZHNlcnZlclRhcmdldGluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIEJEX1NFVFRJTkdfU1RBTkRBUkQ6ICdzdGFuZGFyZCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIERFQlVHX01PREU6ICdwYmpzX2RlYnVnJywKICAgICAgICAgICAgICAgICAgICBTVEFUVVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgR09PRDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgTk9fQklEOiAyCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDQjogewogICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTExfQklEU19CQUNLOiAnYWxsUmVxdWVzdGVkQmlkc0JhY2snLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQURfVU5JVF9CSURTX0JBQ0s6ICdhZFVuaXRCaWRzQmFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSURfV09OOiAnYmlkV29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUVVFU1RfQklEUzogJ3JlcXVlc3RCaWRzJwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBFVkVOVFM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgQVVDVElPTl9JTklUOiAnYXVjdGlvbkluaXQnLAogICAgICAgICAgICAgICAgICAgICAgICBBVUNUSU9OX0VORDogJ2F1Y3Rpb25FbmQnLAogICAgICAgICAgICAgICAgICAgICAgICBCSURfQURKVVNUTUVOVDogJ2JpZEFkanVzdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBCSURfVElNRU9VVDogJ2JpZFRpbWVvdXQnLAogICAgICAgICAgICAgICAgICAgICAgICBCSURfUkVRVUVTVEVEOiAnYmlkUmVxdWVzdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgQklEX1JFU1BPTlNFOiAnYmlkUmVzcG9uc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBOT19CSUQ6ICdub0JpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJJRF9XT046ICdiaWRXb24nLAogICAgICAgICAgICAgICAgICAgICAgICBCSURERVJfRE9ORTogJ2JpZGRlckRvbmUnLAogICAgICAgICAgICAgICAgICAgICAgICBTRVRfVEFSR0VUSU5HOiAnc2V0VGFyZ2V0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgQkVGT1JFX1JFUVVFU1RfQklEUzogJ2JlZm9yZVJlcXVlc3RCaWRzJywKICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUVTVF9CSURTOiAncmVxdWVzdEJpZHMnLAogICAgICAgICAgICAgICAgICAgICAgICBBRERfQURfVU5JVFM6ICdhZGRBZFVuaXRzJywKICAgICAgICAgICAgICAgICAgICAgICAgQURfUkVOREVSX0ZBSUxFRDogJ2FkUmVuZGVyRmFpbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgVENGMl9FTkZPUkNFTUVOVDogJ3RjZjJFbmZvcmNlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFVQ1RJT05fREVCVUc6ICdhdWN0aW9uRGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBCSURfVklFV0FCTEU6ICdiaWRWaWV3YWJsZScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEFEX1JFTkRFUl9GQUlMRURfUkVBU09OOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZFTlRfV1JJVElOR19PTl9NQUlOX0RPQ1VNRU5UOiAncHJldmVudFdyaXRpbmdPbk1haW5Eb2N1bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIE5PX0FEOiAnbm9BZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTjogJ2V4Y2VwdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIENBTk5PVF9GSU5EX0FEOiAnY2Fubm90RmluZEFkJywKICAgICAgICAgICAgICAgICAgICAgICAgTUlTU0lOR19ET0NfT1JfQURJRDogJ21pc3NpbmdEb2NPckFkaWQnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBFVkVOVF9JRF9QQVRIUzogeyBiaWRXb246ICdhZFVuaXRDb2RlJyB9LAogICAgICAgICAgICAgICAgICAgIEdSQU5VTEFSSVRZX09QVElPTlM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgTE9XOiAnbG93JywKICAgICAgICAgICAgICAgICAgICAgICAgTUVESVVNOiAnbWVkaXVtJywKICAgICAgICAgICAgICAgICAgICAgICAgSElHSDogJ2hpZ2gnLAogICAgICAgICAgICAgICAgICAgICAgICBBVVRPOiAnYXV0bycsCiAgICAgICAgICAgICAgICAgICAgICAgIERFTlNFOiAnZGVuc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBDVVNUT006ICdjdXN0b20nCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBUQVJHRVRJTkdfS0VZUzogewogICAgICAgICAgICAgICAgICAgICAgICBCSURERVI6ICdoYl9iaWRkZXInLAogICAgICAgICAgICAgICAgICAgICAgICBBRF9JRDogJ2hiX2FkaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBQUklDRV9CVUNLRVQ6ICdoYl9wYicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNJWkU6ICdoYl9zaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgREVBTDogJ2hiX2RlYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U6ICdoYl9zb3VyY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQ6ICdoYl9mb3JtYXQnLAogICAgICAgICAgICAgICAgICAgICAgICBVVUlEOiAnaGJfdXVpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0lEOiAnaGJfY2FjaGVfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9IT1NUOiAnaGJfY2FjaGVfaG9zdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFET01BSU46ICdoYl9hZG9tYWluJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9UQVJHRVRJTkdfS0VZUzogewogICAgICAgICAgICAgICAgICAgICAgICBCSURERVI6ICdoYl9iaWRkZXInLAogICAgICAgICAgICAgICAgICAgICAgICBBRF9JRDogJ2hiX2FkaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBQUklDRV9CVUNLRVQ6ICdoYl9wYicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNJWkU6ICdoYl9zaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgREVBTDogJ2hiX2RlYWwnLAogICAgICAgICAgICAgICAgICAgICAgICBTT1VSQ0U6ICdoYl9zb3VyY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQ6ICdoYl9mb3JtYXQnLAogICAgICAgICAgICAgICAgICAgICAgICBVVUlEOiAnaGJfdXVpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENBQ0hFX0lEOiAnaGJfY2FjaGVfaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBDQUNIRV9IT1NUOiAnaGJfY2FjaGVfaG9zdCcKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIE5BVElWRV9LRVlTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnaGJfbmF0aXZlX3RpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogJ2hiX25hdGl2ZV9ib2R5JywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTI6ICdoYl9uYXRpdmVfYm9keTInLAogICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5TGluazogJ2hiX25hdGl2ZV9wcml2YWN5JywKICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmFjeUljb246ICdoYl9uYXRpdmVfcHJpdmljb24nLAogICAgICAgICAgICAgICAgICAgICAgICBzcG9uc29yZWRCeTogJ2hiX25hdGl2ZV9icmFuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlOiAnaGJfbmF0aXZlX2ltYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2hiX25hdGl2ZV9pY29uJywKICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tVcmw6ICdoYl9uYXRpdmVfbGlua3VybCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlVcmw6ICdoYl9uYXRpdmVfZGlzcGxheXVybCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGN0YTogJ2hiX25hdGl2ZV9jdGEnLAogICAgICAgICAgICAgICAgICAgICAgICByYXRpbmc6ICdoYl9uYXRpdmVfcmF0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzczogJ2hiX25hdGl2ZV9hZGRyZXNzJywKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRzOiAnaGJfbmF0aXZlX2Rvd25sb2FkcycsCiAgICAgICAgICAgICAgICAgICAgICAgIGxpa2VzOiAnaGJfbmF0aXZlX2xpa2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmU6ICdoYl9uYXRpdmVfcGhvbmUnLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogJ2hiX25hdGl2ZV9wcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogJ2hiX25hdGl2ZV9zYWxlcHJpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlclVybDogJ2hiX3JlbmRlcmVyX3VybCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGFkVGVtcGxhdGU6ICdoYl9hZFRlbXBsYXRlJwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgUzJTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNSQzogJ3MycycsCiAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRU5EUE9JTlQ6ICdodHRwczovL3ByZWJpZC5hZG54cy5jb20vcGJzL3YxL29wZW5ydGIyL2F1Y3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBTWU5DRURfQklEREVSU19LRVk6ICdwYmpzU3luY3MnCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBCSURfU1RBVFVTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJJRF9UQVJHRVRJTkdfU0VUOiAndGFyZ2V0aW5nU2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUkVOREVSRUQ6ICdyZW5kZXJlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJJRF9SRUpFQ1RFRDogJ2JpZFJlamVjdGVkJwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDUwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDU4KSwgaSA9IE1hdGgubWluOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IGUgPyBpKHIoZSksIDkwMDcxOTkyNTQ3NDA5OTEpIDogMDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDUxOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjkpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcjsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7fTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTQ6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciwgaSwgbywgYSwgYywgdSwgcywgZCwgZiA9IG4oMTE1KSwgbCA9IG4oMjYpLCBwID0gbigyNyksIGcgPSBuKDMyKSwgYiA9IG4oMjgpLCB2ID0gbig2NSksIHkgPSBuKDUzKSwgaCA9IGwuV2Vha01hcDsKICAgICAgICAgICAgICAgIHMgPSBmID8gKHIgPSBuZXcgaCgpLCBpID0gci5nZXQsIG8gPSByLmhhcywgYSA9IHIuc2V0LCBjID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYWxsKHIsIGUsIHQpLCB0OwogICAgICAgICAgICAgICAgfSwgdSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkuY2FsbChyLCBlKSB8fCB7fTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8uY2FsbChyLCBlKTsKICAgICAgICAgICAgICAgIH0pIDogKHlbZCA9IHYoJ3N0YXRlJyldID0gITAsIGMgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUsIGQsIHQpLCB0OwogICAgICAgICAgICAgICAgfSwgdSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoZSwgZCkgPyBlW2RdIDoge307CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBiKGUsIGQpOwogICAgICAgICAgICAgICAgfSksIGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICBzZXQ6IGMsCiAgICAgICAgICAgICAgICAgICAgZ2V0OiB1LAogICAgICAgICAgICAgICAgICAgIGhhczogcywKICAgICAgICAgICAgICAgICAgICBlbmZvcmNlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhlKSA/IHUoZSkgOiBjKGUsIHt9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldHRlckZvcjogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcChlKSB8fCAodCA9IHUoZSkpLnR5cGUgIT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBuICsgJyByZXF1aXJlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTQxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDU0Mik7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICA1NDI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBuKDU0Myk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNDMpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gci5OdW1iZXIuaXNJbnRlZ2VyOwogICAgICAgICAgICB9LAogICAgICAgICAgICA1NDM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBuKDE0KSh7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiAnTnVtYmVyJywKICAgICAgICAgICAgICAgICAgICBzdGF0OiAhMAogICAgICAgICAgICAgICAgfSwgeyBpc0ludGVnZXI6IG4oNTQ0KSB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTQ0OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDI3KSwgaSA9IE1hdGguZmxvb3I7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhcihlKSAmJiBpc0Zpbml0ZShlKSAmJiBpKGUpID09PSBlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNTU6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oMjcpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciBuLCByOwogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIChuID0gZS50b1N0cmluZykgJiYgIWkociA9IG4uY2FsbChlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiAobiA9IGUudmFsdWVPZikgJiYgIWkociA9IG4uY2FsbChlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIGlmICghdCAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiAobiA9IGUudG9TdHJpbmcpICYmICFpKHIgPSBuLmNhbGwoZSkpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoJ0NhblwndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUnKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDU2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGcgPSAxID09IHAsIGIgPSAyID09IHAsIHYgPSAzID09IHAsIHkgPSA0ID09IHAsIGggPSA2ID09IHAsIG0gPSA1ID09IHAgfHwgaDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSwgbywgYSA9IEUoZSksIGMgPSBBKGEpLCB1ID0gUyh0LCBuLCAzKSwgcyA9IE8oYy5sZW5ndGgpLCBkID0gMCwgZiA9IHIgfHwgVCwgbCA9IGcgPyBmKGUsIHMpIDogYiA/IGYoZSwgMCkgOiB2b2lkIDA7IGQgPCBzOyBkKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG0gfHwgZCBpbiBjKSAmJiAobyA9IHUoaSA9IGNbZF0sIGQsIGEpLCBwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFtkXSA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJLmNhbGwobCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoID8gLTEgOiB2IHx8IHkgPyB5IDogbDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFMgPSBuKDI0KSwgQSA9IG4oNzIpLCBFID0gbig1NyksIE8gPSBuKDUwKSwgVCA9IG4oMTAzKSwgSSA9IFtdLnB1c2g7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgZm9yRWFjaDogcigwKSwKICAgICAgICAgICAgICAgICAgICBtYXA6IHIoMSksCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiByKDIpLAogICAgICAgICAgICAgICAgICAgIHNvbWU6IHIoMyksCiAgICAgICAgICAgICAgICAgICAgZXZlcnk6IHIoNCksCiAgICAgICAgICAgICAgICAgICAgZmluZDogcig1KSwKICAgICAgICAgICAgICAgICAgICBmaW5kSW5kZXg6IHIoNikKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDU3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDQ5KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyKGUpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDU4OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgdmFyIG4gPSBNYXRoLmNlaWwsIHIgPSBNYXRoLmZsb29yOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4oZSA9ICtlKSA/IDAgOiAoMCA8IGUgPyByIDogbikoZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA1OTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgIHZhciBuID0gMCwgciA9IE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnU3ltYm9sKCcgKyBTdHJpbmcodm9pZCAwID09PSBlID8gJycgOiBlKSArICcpXycgKyAoKytuICsgcikudG9TdHJpbmcoMzYpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNjA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGMgPSBuKDMwKSwgdSA9IG4oMzEpLCBzID0gbigyOCksIGQgPSBPYmplY3QuZGVmaW5lUHJvcGVydHksIGYgPSB7fTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHMoZiwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmW2VdOwogICAgICAgICAgICAgICAgICAgIHZhciBuID0gW11bZV0sIHIgPSAhIXModCA9IHQgfHwge30sICdBQ0NFU1NPUlMnKSAmJiB0LkFDQ0VTU09SUywgaSA9IHModCwgMCkgPyB0WzBdIDogYSwgbyA9IHModCwgMSkgPyB0WzFdIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmW2VdID0gISFuICYmICF1KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgJiYgIWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0geyBsZW5ndGg6IC0xIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHIgPyBkKGUsIDEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogZVsxXSA9IDEsIG4uY2FsbChlLCBpLCBvKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDYxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDYyKSwgaSA9IG4oNDApLCBvID0gbigyMikoJ2l0ZXJhdG9yJyk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW29dIHx8IGVbJ0BAaXRlcmF0b3InXSB8fCBpW3IoZSldOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNjI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oNjMpLCBpID0gbig0OCksIG8gPSBuKDIyKSgndG9TdHJpbmdUYWcnKSwgYSA9ICdBcmd1bWVudHMnID09IGkoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzOwogICAgICAgICAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByID8gaSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHI7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZSA/ICdVbmRlZmluZWQnIDogbnVsbCA9PT0gZSA/ICdOdWxsJyA6ICdzdHJpbmcnID09IHR5cGVvZiAobiA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVt0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSh0ID0gT2JqZWN0KGUpLCBvKSkgPyBuIDogYSA/IGkodCkgOiAnT2JqZWN0JyA9PSAociA9IGkodCkpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHQuY2FsbGVlID8gJ0FyZ3VtZW50cycgOiByOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNjM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgcltuKDIyKSgndG9TdHJpbmdUYWcnKV0gPSAneicsIGUuZXhwb3J0cyA9ICdbb2JqZWN0IHpdJyA9PT0gU3RyaW5nKHIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA2NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciBvID0gbig2MyksIGEgPSBuKDMzKS5mLCBjID0gbigzMiksIHUgPSBuKDI4KSwgcyA9IG4oMTE0KSwgZCA9IG4oMjIpKCd0b1N0cmluZ1RhZycpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgICAgICAgICBlICYmIChpID0gbiA/IGUgOiBlLnByb3RvdHlwZSwgdShpLCBkKSB8fCBhKGksIGQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHQKICAgICAgICAgICAgICAgICAgICB9KSwgciAmJiAhbyAmJiBjKGksICd0b1N0cmluZycsIHMpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDY1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDc1KSwgaSA9IG4oNTkpLCBvID0gcigna2V5cycpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb1tlXSB8fCAob1tlXSA9IGkoZSkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNjY6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGggPSBuKDE0KSwgbSA9IG4oMTIzKSwgUyA9IG4oODgpLCBBID0gbigxMjUpLCBFID0gbig2NCksIE8gPSBuKDMyKSwgVCA9IG4oODYpLCByID0gbigyMiksIEkgPSBuKDE2KSwgaiA9IG4oNDApLCBpID0gbig4NyksIEMgPSBpLkl0ZXJhdG9yUHJvdG90eXBlLCB3ID0gaS5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLCBfID0gcignaXRlcmF0b3InKSwgeCA9ICd2YWx1ZXMnLCBCID0gJ2VudHJpZXMnOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gZnVuY3Rpb24gKGUsIHQsIG4sIHIsIGksIG8sIGEpIHsKICAgICAgICAgICAgICAgICAgICBtKG4sIHQsIHIpOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gaSAmJiBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdyAmJiBlIGluIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcFtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2tleXMnOgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHg6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBuKHRoaXMsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBuKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdSwgcywgZCwgZiA9IHQgKyAnIEl0ZXJhdG9yJywgbCA9ICExLCBwID0gZS5wcm90b3R5cGUsIGcgPSBwW19dIHx8IHBbJ0BAaXRlcmF0b3InXSB8fCBpICYmIHBbaV0sIGIgPSAhdyAmJiBnIHx8IGMoaSksIHYgPSAnQXJyYXknID09IHQgJiYgcC5lbnRyaWVzIHx8IGc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHYgJiYgKHUgPSBTKHYuY2FsbChuZXcgZSgpKSksIEMgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgdS5uZXh0ICYmIChJIHx8IFModSkgPT09IEMgfHwgKEEgPyBBKHUsIEMpIDogJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdVtfXSAmJiBPKHUsIF8sIHkpKSwgRSh1LCBmLCAhMCwgITApLCBJICYmIChqW2ZdID0geSkpKSwgaSA9PSB4ICYmIGcgJiYgZy5uYW1lICE9PSB4ICYmIChsID0gITAsIGIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZy5jYWxsKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgSSAmJiAhYSB8fCBwW19dID09PSBiIHx8IE8ocCwgXywgYiksIGpbdF0gPSBiLCBpKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGMoeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5czogbyA/IGIgOiBjKCdrZXlzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllczogYyhCKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZCBpbiBzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3ICYmICFsICYmIGQgaW4gcCB8fCBUKHAsIGQsIHNbZF0pOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlZDogdyB8fCBsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDY3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMCksIGMgPSB7fTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBpLCBvLCBhID0gKGkgPSBuLCBvID0gY1tyID0gZV0gPSBjW3JdIHx8IHsgYmlkZGVyczoge30gfSwgaSA/IG8uYmlkZGVyc1tpXSA9IG8uYmlkZGVyc1tpXSB8fCB7fSA6IG8pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhW3RdID0gKGFbdF0gfHwgMCkgKyAxLCBhW3RdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50UmVxdWVzdHNDb3VudGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlLCAncmVxdWVzdHNDb3VudGVyJyk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRCaWRkZXJSZXF1ZXN0c0NvdW50ZXI6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKGUsICdyZXF1ZXN0c0NvdW50ZXInLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGluY3JlbWVudEJpZGRlcldpbnNDb3VudGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlLCAnd2luc0NvdW50ZXInLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RzQ291bnRlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChyLmRlZXBBY2Nlc3MpKGMsICcnLmNvbmNhdChlLCAnLnJlcXVlc3RzQ291bnRlcicpKSB8fCAwOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0QmlkZGVyUmVxdWVzdHNDb3VudGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuZGVlcEFjY2VzcykoYywgJycuY29uY2F0KGUsICcuYmlkZGVycy4nKS5jb25jYXQodCwgJy5yZXF1ZXN0c0NvdW50ZXInKSkgfHwgMDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldEJpZGRlcldpbnNDb3VudGVyOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KHIuZGVlcEFjY2VzcykoYywgJycuY29uY2F0KGUsICcuYmlkZGVycy4nKS5jb25jYXQodCwgJy53aW5zQ291bnRlcicpKSB8fCAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDY5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDIzMCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgbi5kKHQsICdjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgIH0pLCB0LmEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlVHlwZTogJ2NvcmUnCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCB0LmIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvKHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWU6IHQKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTEpLCB1ID0gbigwKSwgaSA9IG4oMTMpLCBkID0gbi5uKGkpLCBmID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnY29yZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdwcmViaWQtbW9kdWxlJwogICAgICAgICAgICAgICAgICAgIF0sIGwgPSBbXTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gZSA6IHt9LCBpID0gdC5ndmxpZCwgbyA9IHQubW9kdWxlTmFtZSwgYSA9IHQubW9kdWxlVHlwZTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQoKShmLCBhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4oeyB2YWxpZDogITAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGksIG8sIHsgaGFzRW5mb3JjZW1lbnRIb29rOiAhMSB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZSAmJiBlLmhhc0VuZm9yY2VtZW50SG9vayA/IG4oZSkgOiAodCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFbmZvcmNlbWVudEhvb2s6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkOiB1Lmhhc0RldmljZUFjY2VzcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBuKHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzczOTZlMDFiNGI4MzEzZWQgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzczOTZlMDFiNGI4MzEzZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja18xNmM1MzM5NWE4MjJkYjQ4LmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudmFsaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXdpbmRvdy5sb2NhbFN0b3JhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5sb2dFcnJvcignTG9jYWwgc3RvcmFnZSBhcGkgZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfNzM5NmUwMWI0YjgzMTNlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19vbGRfNzM5NmUwMWI0YjgzMTNlZCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMobik7CiAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHMobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZTogZnVuY3Rpb24gKGksIG8sIGEsIGMsIHUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS52YWxpZCAmJiAodCA9IHUgJiYgJycgIT09IHUgPyAnIDtkb21haW49Jy5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHUpKSA6ICcnLCBuID0gYSAmJiAnJyAhPT0gYSA/ICcgO2V4cGlyZXM9Jy5jb25jYXQoYSkgOiAnJywgciA9IG51bGwgIT0gYyAmJiAnbm9uZScgPT0gYy50b0xvd2VyQ2FzZSgpID8gJzsgU2VjdXJlJyA6ICcnLCBkb2N1bWVudC5jb29raWUgPSAnJy5jb25jYXQoaSwgJz0nKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KG8pKS5jb25jYXQobiwgJzsgcGF0aD0vJykuY29uY2F0KHQpLmNvbmNhdChjID8gJzsgU2FtZVNpdGU9Jy5jb25jYXQoYykgOiAnJykuY29uY2F0KHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHMobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb29raWU6IGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gd2luZG93LmRvY3VtZW50LmNvb2tpZS5tYXRjaCgnKF58OylcXHMqJyArIG4gKyAnXFxzKj1cXHMqKFteO10qKVxccyooO3wkKScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/IGRlY29kZVVSSUNvbXBvbmVudCh0WzJdKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUlzRW5hYmxlZDogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRfX19vbGRfNGJmMTJmZTk0ZjJhYjQ5NiA9IHt9LmNvbnN0cnVjdG9yLmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3csICdsb2NhbFN0b3JhZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJF9fX29sZF80YmYxMmZlOTRmMmFiNDk2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHt9LmNvbnN0cnVjdG9yLmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ2xvY2FsU3RvcmFnZScsICRfX19tb2NrXzE2YzUzMzk1YTgyMmRiNDgubG9jYWxTdG9yYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnZhbGlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncHJlYmlkLmNvb2tpZVRlc3QnLCAnMScpLCAnMScgPT09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwcmViaWQuY29va2llVGVzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3ByZWJpZC5jb29raWVUZXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkX19fb2xkXzRiZjEyZmU5NGYyYWI0OTYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoe30uY29uc3RydWN0b3IuZGVmaW5lUHJvcGVydHkod2luZG93LCAnbG9jYWxTdG9yYWdlJywgJF9fX29sZF80YmYxMmZlOTRmMmFiNDk2KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0IHx8ICdmdW5jdGlvbicgIT0gdHlwZW9mIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLnB1c2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXNBcmVFbmFibGVkOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIWUgfHwgIWUudmFsaWQpICYmICghIXUuY2hlY2tDb29raWVTdXBwb3J0KCkgfHwgKHdpbmRvdy5kb2N1bWVudC5jb29raWUgPSAncHJlYmlkLmNvb2tpZVRlc3QnLCAtMSAhPT0gd2luZG93LmRvY3VtZW50LmNvb2tpZS5pbmRleE9mKCdwcmViaWQuY29va2llVGVzdCcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUluTG9jYWxTdG9yYWdlOiBmdW5jdGlvbiAodCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLnZhbGlkICYmIGMoKSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0odCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2U6IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkX19fb2xkXzE1YjJkMDY1MjBmOGU3NjYgPSB7fS5jb25zdHJ1Y3Rvci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LCAnbG9jYWxTdG9yYWdlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMTViMmQwNjUyMGY4ZTc2NikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fbW9ja18xNmM1MzM5NWE4MjJkYjQ4LmxvY2FsU3RvcmFnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS52YWxpZCAmJiBjKCkgPyB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRfX19vbGRfMTViMmQwNjUyMGY4ZTc2NikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7fS5jb25zdHJ1Y3Rvci5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCAkX19fb2xkXzE1YjJkMDY1MjBmOGU3NjYpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4gfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRGF0YUZyb21Mb2NhbFN0b3JhZ2U6IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUudmFsaWQgJiYgYygpICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbiB8fCAnZnVuY3Rpb24nICE9IHR5cGVvZiBuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5wdXNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHMocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBoYXNMb2NhbFN0b3JhZ2U6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTaW1pbGFyQ29va2llczogZnVuY3Rpb24gKG8sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4oZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGUudmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUuaGFzRGV2aWNlQWNjZXNzKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7IG4ubGVuZ3RoOykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbi5wb3AoKSwgaSA9IChpID0gci5pbmRleE9mKCc9JykpIDwgMCA/IHIubGVuZ3RoIDogaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDw9IGRlY29kZVVSSUNvbXBvbmVudChyLnNsaWNlKDAsIGkpLnJlcGxhY2UoL15ccysvLCAnJykpLmluZGV4T2YobykgJiYgdC5wdXNoKGRlY29kZVVSSUNvbXBvbmVudChyLnNsaWNlKGkgKyAxKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQgfHwgJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyhuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBzKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcCA9IE9iamVjdChyLmIpKCdhc3luYycsIGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgcihuKTsKICAgICAgICAgICAgICAgIH0sICd2YWxpZGF0ZVN0b3JhZ2VFbmZvcmNlbWVudCcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3MDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCBuLmQodCwgJ2FkVW5pdFNldHVwQ2hlY2tzJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBWOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnY2hlY2tBZFVuaXRTZXR1cCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSDsKICAgICAgICAgICAgICAgIH0pLCB0LmV4ZWN1dGVDYWxsYmFja3MgPSBZOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE3KSwgaSA9IG4oMCksIG8gPSBuKDIzOCksIGEgPSBuKDQ0KSwgbCA9IG4oMyksIG0gPSBuKDIzKSwgcCA9IG4oNDIpLCBjID0gbigxMSksIHUgPSBuKDIzOSksIHMgPSBuKDEzKSwgZyA9IG4ubihzKSwgYiA9IG4oNjcpLCBTID0gbigxMiksIGQgPSBuKDM0KSwgZiA9IG4oNyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShlKTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyAhPSB0eXBlb2YgU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IG4gJiYgZS5jb25zdHJ1Y3RvciAmJiAobiA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IG4gfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geShlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geShlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KHQpOyBuIDwgdDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChoID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBBID0gT2JqZWN0KHIuYSkoKSwgRSA9IG4oNSksIE8gPSBuKDApLCBUID0gbig4KS5kZWZhdWx0LCBJID0gbig5KSwgaiA9IGEuYS50cmlnZ2VyVXNlclN5bmNzLCBDID0gRS5FVkVOVFMsIHcgPSBDLkFERF9BRF9VTklUUywgXyA9IEMuQklEX1dPTiwgeCA9IEMuUkVRVUVTVF9CSURTLCBCID0gQy5TRVRfVEFSR0VUSU5HLCBVID0gQy5BRF9SRU5ERVJfRkFJTEVELCBSID0gRS5BRF9SRU5ERVJfRkFJTEVEX1JFQVNPTiwgayA9IFIuUFJFVkVOVF9XUklUSU5HX09OX01BSU5fRE9DVU1FTlQsIEQgPSBSLk5PX0FELCBOID0gUi5FWENFUFRJT04sIFAgPSBSLkNBTk5PVF9GSU5EX0FELCBNID0gUi5NSVNTSU5HX0RPQ19PUl9BRElELCBxID0gewogICAgICAgICAgICAgICAgICAgICAgICBiaWRXb246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0uYS5nZXRCaWRzUmVxdWVzdGVkKCkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkcy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShpLmZsYXR0ZW4pLmZpbHRlcihpLnVuaXF1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhTy5jb250YWlucyh0LCBlKSB8fCB2b2lkIE8ubG9nRXJyb3IoJ1RoZSAiJyArIGUgKyAnIiBwbGFjZW1lbnQgaXMgbm90IGRlZmluZWQuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRyhlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZS5kZWZhdWx0VmlldyAmJiBlLmRlZmF1bHRWaWV3LmZyYW1lRWxlbWVudCAmJiAoZS5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQud2lkdGggPSB0LCBlLmRlZmF1bHRWaWV3LmZyYW1lRWxlbWVudC5oZWlnaHQgPSBuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFcoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8uaXNBcnJheShlKSAmJiAodCA/IGUubGVuZ3RoID09PSB0IDogMCA8IGUubGVuZ3RoKSAmJiAoZS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0KGkuaXNBcnJheU9mTnVtcykoZSwgMik7CiAgICAgICAgICAgICAgICAgICAgfSkgPyBuID0gZSA6IE9iamVjdChpLmlzQXJyYXlPZk51bXMpKGUsIDIpICYmIG4ucHVzaChlKSksIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE8uZGVlcENsb25lKGUpLCBuID0gdC5tZWRpYVR5cGVzLmJhbm5lciwgciA9IFcobi5zaXplcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCByLmxlbmd0aCA/IChuLnNpemVzID0gciwgdC5zaXplcyA9IHIpIDogKE8ubG9nRXJyb3IoJ0RldGVjdGVkIGEgbWVkaWFUeXBlcy5iYW5uZXIgb2JqZWN0IHdpdGhvdXQgYSBwcm9wZXIgc2l6ZXMgZmllbGQuICBQbGVhc2UgZW5zdXJlIHRoZSBzaXplcyBhcmUgbGlzdGVkIGxpa2U6IFtbMzAwLCAyNTBdLCAuLi5dLiAgUmVtb3ZpbmcgaW52YWxpZCBtZWRpYVR5cGVzLmJhbm5lciBvYmplY3QgZnJvbSByZXF1ZXN0LicpLCBkZWxldGUgdC5tZWRpYVR5cGVzLmJhbm5lciksIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciA9IE8uZGVlcENsb25lKGUpLCBpID0gci5tZWRpYVR5cGVzLnZpZGVvOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpLnBsYXllclNpemUgJiYgKHQgPSAnbnVtYmVyJyA9PSB0eXBlb2YgaS5wbGF5ZXJTaXplWzBdID8gMiA6IDEsIDAgPCAobiA9IFcoaS5wbGF5ZXJTaXplLCB0KSkubGVuZ3RoID8gKDIgPT0gdCAmJiBPLmxvZ0luZm8oJ1RyYW5zZm9ybWluZyB2aWRlby5wbGF5ZXJTaXplIGZyb20gWzY0MCw0ODBdIHRvIFtbNjQwLDQ4MF1dIHNvIGl0XCdzIGluIHRoZSBwcm9wZXIgZm9ybWF0LicpLCBpLnBsYXllclNpemUgPSBuLCByLnNpemVzID0gbikgOiAoTy5sb2dFcnJvcignRGV0ZWN0ZWQgaW5jb3JyZWN0IGNvbmZpZ3VyYXRpb24gb2YgbWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplLiAgUGxlYXNlIHNwZWNpZnkgb25seSBvbmUgc2V0IG9mIGRpbWVuc2lvbnMgaW4gYSBmb3JtYXQgbGlrZTogW1s2NDAsIDQ4MF1dLiBSZW1vdmluZyBpbnZhbGlkIG1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZSBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSByLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZSkpLCByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPLmRlZXBDbG9uZShlKSwgbiA9IHQubWVkaWFUeXBlcy5uYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uaW1hZ2UgJiYgbi5pbWFnZS5zaXplcyAmJiAhQXJyYXkuaXNBcnJheShuLmltYWdlLnNpemVzKSAmJiAoTy5sb2dFcnJvcignUGxlYXNlIHVzZSBhbiBhcnJheSBvZiBzaXplcyBmb3IgbmF0aXZlLmltYWdlLnNpemVzIGZpZWxkLiAgUmVtb3ZpbmcgaW52YWxpZCBtZWRpYVR5cGVzLm5hdGl2ZS5pbWFnZS5zaXplcyBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSB0Lm1lZGlhVHlwZXMubmF0aXZlLmltYWdlLnNpemVzKSwgbi5pbWFnZSAmJiBuLmltYWdlLmFzcGVjdF9yYXRpb3MgJiYgIUFycmF5LmlzQXJyYXkobi5pbWFnZS5hc3BlY3RfcmF0aW9zKSAmJiAoTy5sb2dFcnJvcignUGxlYXNlIHVzZSBhbiBhcnJheSBvZiBzaXplcyBmb3IgbmF0aXZlLmltYWdlLmFzcGVjdF9yYXRpb3MgZmllbGQuICBSZW1vdmluZyBpbnZhbGlkIG1lZGlhVHlwZXMubmF0aXZlLmltYWdlLmFzcGVjdF9yYXRpb3MgcHJvcGVydHkgZnJvbSByZXF1ZXN0LicpLCBkZWxldGUgdC5tZWRpYVR5cGVzLm5hdGl2ZS5pbWFnZS5hc3BlY3RfcmF0aW9zKSwgbi5pY29uICYmIG4uaWNvbi5zaXplcyAmJiAhQXJyYXkuaXNBcnJheShuLmljb24uc2l6ZXMpICYmIChPLmxvZ0Vycm9yKCdQbGVhc2UgdXNlIGFuIGFycmF5IG9mIHNpemVzIGZvciBuYXRpdmUuaWNvbi5zaXplcyBmaWVsZC4gIFJlbW92aW5nIGludmFsaWQgbWVkaWFUeXBlcy5uYXRpdmUuaWNvbi5zaXplcyBwcm9wZXJ0eSBmcm9tIHJlcXVlc3QuJyksIGRlbGV0ZSB0Lm1lZGlhVHlwZXMubmF0aXZlLmljb24uc2l6ZXMpLCB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0KHUuYSkoKSwgQS5iaWRkZXJTZXR0aW5ncyA9IEEuYmlkZGVyU2V0dGluZ3MgfHwge30sIEEubGliTG9hZGVkID0gITAsIEEudmVyc2lvbiA9ICd2NC4zNi4wJywgTy5sb2dJbmZvKCdQcmViaWQuanMgdjQuMzYuMCBsb2FkZWQnKSwgQS5pbnN0YWxsZWRNb2R1bGVzID0gW10sIEEuYWRVbml0cyA9IEEuYWRVbml0cyB8fCBbXSwgQS50cmlnZ2VyVXNlclN5bmNzID0gajsKICAgICAgICAgICAgICAgIHZhciBWID0gewogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUJhbm5lck1lZGlhVHlwZTogTCwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVWaWRlb01lZGlhVHlwZTogRiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVOYXRpdmVNZWRpYVR5cGU6IHosCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlU2l6ZXM6IFcKICAgICAgICAgICAgICAgICAgICB9LCBIID0gT2JqZWN0KGMuYikoJ3N5bmMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciwgaSwgbyA9IGUubWVkaWFUeXBlcywgYSA9IGUuYmlkczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgJiYgTy5pc0FycmF5KGEpID8gbyAmJiAwICE9PSBPYmplY3Qua2V5cyhvKS5sZW5ndGggPyAoby5iYW5uZXIgJiYgKHQgPSBMKGUpKSwgby52aWRlbyAmJiAobiA9IEYodCB8fCBlKSksIG8ubmF0aXZlICYmIChyID0geihuIHx8ICh0IHx8IGUpKSksIGkgPSBoKHt9LCB0LCBuLCByKSwgYy5wdXNoKGkpKSA6IE8ubG9nRXJyb3IoJ0RldGVjdGVkIGFkVW5pdC5jb2RlIFwnJy5jb25jYXQoZS5jb2RlLCAnXCcgZGlkIG5vdCBoYXZlIGEgXCdtZWRpYVR5cGVzXCcgb2JqZWN0IGRlZmluZWQuICBUaGlzIGlzIGEgcmVxdWlyZWQgZmllbGQgZm9yIHRoZSBhdWN0aW9uLCBzbyB0aGlzIGFkVW5pdCBoYXMgYmVlbiByZW1vdmVkLicpKSA6IE8ubG9nRXJyb3IoJ0RldGVjdGVkIGFkVW5pdC5jb2RlIFwnJy5jb25jYXQoZS5jb2RlLCAnXCcgZGlkIG5vdCBoYXZlIFwnYWRVbml0LmJpZHNcJyBkZWZpbmVkIG9yIFwnYWRVbml0LmJpZHNcJyBpcyBub3QgYW4gYXJyYXkuIFJlbW92aW5nIGFkVW5pdCBmcm9tIGF1Y3Rpb24uJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgYzsKICAgICAgICAgICAgICAgICAgICB9LCAnY2hlY2tBZFVuaXRTZXR1cCcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gSyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBtLmFbZV0oKS5maWx0ZXIoTy5iaW5kLmNhbGwoaS5hZFVuaXRzRmlsdGVyLCB0aGlzLCBtLmEuZ2V0QWRVbml0Q29kZXMoKSkpLCByID0gbS5hLmdldExhc3RBdWN0aW9uSWQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZTsKICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoaS51bmlxdWVzKS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5hdWN0aW9uSWQgPT09IHIgJiYgZS5hZFVuaXRDb2RlID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZVswXSAmJiBlWzBdLmFkVW5pdENvZGU7CiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ID0ge30sIG4gPSBlWzBdLmFkVW5pdENvZGUsIHIgPSB7IGJpZHM6IGUgfSwgbiBpbiB0ID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIG4sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdFtuXSA9IHIsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByOwogICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaChlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBKKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucmVhc29uLCBuID0gZS5tZXNzYWdlLCByID0gZS5iaWQsIGkgPSBlLmlkLCBvID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogbgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHIgJiYgKG8uYmlkID0gciksIGkgJiYgKG8uYWRJZCA9IGkpLCBPLmxvZ0Vycm9yKG4pLCBJLmVtaXQoVSwgbyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBuKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdDsgdCA9IGUuc2hpZnQoKTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG4oZi5jKSwgbihRKSwgZS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQS5nZXRBZHNlcnZlclRhcmdldGluZ0ZvckFkVW5pdENvZGVTdHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPLmxvZ0luZm8oJ0ludm9raW5nIHBianMuZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlU3RyJywgYXJndW1lbnRzKSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IEEuZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTy50cmFuc2Zvcm1BZFNlcnZlclRhcmdldGluZ09iaih0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTy5sb2dNZXNzYWdlKCdOZWVkIHRvIGNhbGwgZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlU3RyIHdpdGggYWR1bml0Q29kZScpOwogICAgICAgICAgICAgICAgfSwgQS5nZXRIaWdoZXN0VW51c2VkQmlkUmVzcG9uc2VGb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG0uYS5nZXRBbGxCaWRzRm9yQWRVbml0Q29kZShlKS5maWx0ZXIocC5hLmlzVW51c2VkQmlkKS5maWx0ZXIocC5hLmlzQmlkTm90RXhwaXJlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lmxlbmd0aCA/IHQucmVkdWNlKGkuZ2V0SGlnaGVzdENwbSkgOiB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgTy5sb2dNZXNzYWdlKCdOZWVkIHRvIGNhbGwgZ2V0SGlnaGVzdFVudXNlZEJpZFJlc3BvbnNlRm9yQWRVbml0Q29kZSB3aXRoIGFkdW5pdENvZGUnKTsKICAgICAgICAgICAgICAgIH0sIEEuZ2V0QWRzZXJ2ZXJUYXJnZXRpbmdGb3JBZFVuaXRDb2RlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQS5nZXRBZHNlcnZlclRhcmdldGluZyhlKVtlXTsKICAgICAgICAgICAgICAgIH0sIEEuZ2V0QWRzZXJ2ZXJUYXJnZXRpbmcgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPLmxvZ0luZm8oJ0ludm9raW5nIHBianMuZ2V0QWRzZXJ2ZXJUYXJnZXRpbmcnLCBhcmd1bWVudHMpLCBwLmQuZ2V0QWxsVGFyZ2V0aW5nKGUpOwogICAgICAgICAgICAgICAgfSwgQS5nZXROb0JpZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8ubG9nSW5mbygnSW52b2tpbmcgcGJqcy5nZXROb0JpZHMnLCBhcmd1bWVudHMpLCBLKCdnZXROb0JpZHMnKTsKICAgICAgICAgICAgICAgIH0sIEEuZ2V0Tm9CaWRzRm9yQWRVbml0Q29kZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogbS5hLmdldE5vQmlkcygpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgQS5nZXRCaWRSZXNwb25zZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8ubG9nSW5mbygnSW52b2tpbmcgcGJqcy5nZXRCaWRSZXNwb25zZXMnLCBhcmd1bWVudHMpLCBLKCdnZXRCaWRzUmVjZWl2ZWQnKTsKICAgICAgICAgICAgICAgIH0sIEEuZ2V0QmlkUmVzcG9uc2VzRm9yQWRVbml0Q29kZSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogbS5hLmdldEJpZHNSZWNlaXZlZCgpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZSA9PT0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSwgQS5zZXRUYXJnZXRpbmdGb3JHUFRBc3luYyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG47CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnNldFRhcmdldGluZ0ZvckdQVEFzeW5jJywgYXJndW1lbnRzKSwgT2JqZWN0KGkuaXNHcHRQdWJhZHNEZWZpbmVkKSgpID8gKG4gPSBwLmQuZ2V0QWxsVGFyZ2V0aW5nKGUpLCBwLmQucmVzZXRQcmVzZXRUYXJnZXRpbmcoZSwgdCksIHAuZC5zZXRUYXJnZXRpbmdGb3JHUFQobiwgdCksIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoblt0XSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hiX2FkaWQnID09PSBlICYmIG0uYS5zZXRTdGF0dXNGb3JCaWRzKG5bdF1bZV0sIEUuQklEX1NUQVRVUy5CSURfVEFSR0VUSU5HX1NFVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pLCBJLmVtaXQoQiwgbikpIDogTy5sb2dFcnJvcignd2luZG93Lmdvb2dsZXRhZyBpcyBub3QgZGVmaW5lZCBvbiB0aGUgcGFnZScpOwogICAgICAgICAgICAgICAgfSwgQS5zZXRUYXJnZXRpbmdGb3JBc3QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIE8ubG9nSW5mbygnSW52b2tpbmcgcGJqcy5zZXRUYXJnZXRpbmdGb3JBbicsIGFyZ3VtZW50cyksIHAuZC5pc0FwbnRhZ0RlZmluZWQoKSA/IChwLmQuc2V0VGFyZ2V0aW5nRm9yQXN0KGUpLCBJLmVtaXQoQiwgcC5kLmdldEFsbFRhcmdldGluZygpKSkgOiBPLmxvZ0Vycm9yKCd3aW5kb3cuYXBudGFnIGlzIG5vdCBkZWZpbmVkIG9uIHRoZSBwYWdlJyk7CiAgICAgICAgICAgICAgICB9LCBBLnJlbmRlckFkID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnJlbmRlckFkJywgYXJndW1lbnRzKSwgTy5sb2dNZXNzYWdlKCdDYWxsaW5nIHJlbmRlckFkIHdpdGggYWRJZCA6JyArIHQpLCBlICYmIHQpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSwgbywgYSwgYywgdSwgcywgZCwgZiwgbCwgcCwgZywgYiwgdiA9IG0uYS5maW5kQmlkQnlBZElkKHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA/ICh2LmFkID0gTy5yZXBsYWNlQXVjdGlvblByaWNlKHYuYWQsIHYuY3BtKSwgdi5hZFVybCA9IE8ucmVwbGFjZUF1Y3Rpb25QcmljZSh2LmFkVXJsLCB2LmNwbSksIG4gJiYgbi5jbGlja1Rocm91Z2ggJiYgKHIgPSBuLmNsaWNrVGhyb3VnaCwgdi5hZCA9IE8ucmVwbGFjZUNsaWNrVGhyb3VnaCh2LmFkLCByKSwgdi5hZFVybCA9IE8ucmVwbGFjZUNsaWNrVGhyb3VnaCh2LmFkVXJsLCByKSksIG0uYS5hZGRXaW5uaW5nQmlkKHYpLCBJLmVtaXQoXywgdiksIGkgPSB2LmhlaWdodCwgbyA9IHYud2lkdGgsIGEgPSB2LmFkLCBjID0gdi5tZWRpYVR5cGUsIHUgPSB2LmFkVXJsLCBzID0gdi5yZW5kZXJlciwgZCA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ0NyZWF0aXZlICcuY29uY2F0KHYuY3JlYXRpdmVJZCwgJyBzZXJ2ZWQgYnkgJykuY29uY2F0KHYuYmlkZGVyLCAnIFByZWJpZC5qcyBIZWFkZXIgQmlkZGluZycpKSwgTy5pbnNlcnRFbGVtZW50KGQsIGUsICdib2R5JyksIE9iamVjdChTLmMpKHMpID8gT2JqZWN0KFMuYikocywgdikgOiBlID09PSBkb2N1bWVudCAmJiAhTy5pbklmcmFtZSgpIHx8ICd2aWRlbycgPT09IGMgPyAoZiA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQuIEFkIHJlbmRlciBjYWxsIGFkIGlkICcuY29uY2F0KHQsICcgd2FzIHByZXZlbnRlZCBmcm9tIHdyaXRpbmcgdG8gdGhlIG1haW4gZG9jdW1lbnQuJyksIEooewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogYSA/IChuYXZpZ2F0b3IudXNlckFnZW50ICYmIC0xIDwgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZpcmVmb3gvJykgJiYgKChsID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XC8oW1xkXC5dKykvKVsxXSkgJiYgcGFyc2VJbnQobCwgMTApIDwgNjcgJiYgZS5vcGVuKCd0ZXh0L2h0bWwnLCAncmVwbGFjZScpKSwgZS53cml0ZShhKSwgZS5jbG9zZSgpLCBHKGUsIG8sIGkpLCBPLmNhbGxCdXJsKHYpKSA6IHUgPyAoKHAgPSBPLmNyZWF0ZUludmlzaWJsZUlmcmFtZSgpKS5oZWlnaHQgPSBpLCBwLndpZHRoID0gbywgcC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZScsIHAuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJywgcC5zcmMgPSB1LCBPLmluc2VydEVsZW1lbnQocCwgZSwgJ2JvZHknKSwgRyhlLCBvLCBpKSwgTy5jYWxsQnVybCh2KSkgOiAoZyA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQuIE5vIGFkIGZvciBiaWQgcmVzcG9uc2UgaWQ6ICcuY29uY2F0KHQpLCBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWQ6IHYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkgOiAoYiA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQuIENhbm5vdCBmaW5kIGFkIGJ5IGdpdmVuIGlkIDogJy5jb25jYXQodCksIEooewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB5ID0gJ0Vycm9yIHRyeWluZyB0byB3cml0ZSBhZCBJZCA6Jy5jb25jYXQodCwgJyB0byB0aGUgcGFnZTonKS5jb25jYXQoZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEooewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaCA9ICdFcnJvciB0cnlpbmcgdG8gd3JpdGUgYWQgSWQgOicuY29uY2F0KHQsICcgdG8gdGhlIHBhZ2UuIE1pc3NpbmcgZG9jdW1lbnQgb3IgYWRJZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBKKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBBLnJlbW92ZUFkVW5pdCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnJlbW92ZUFkVW5pdCcsIGFyZ3VtZW50cyksIGUgPyAoTy5pc0FycmF5KGUpID8gZSA6IFtlXSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gQS5hZFVuaXRzLmxlbmd0aCAtIDE7IDAgPD0gdDsgdC0tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQS5hZFVuaXRzW3RdLmNvZGUgPT09IGUgJiYgQS5hZFVuaXRzLnNwbGljZSh0LCAxKTsKICAgICAgICAgICAgICAgICAgICB9KSA6IEEuYWRVbml0cyA9IFtdOwogICAgICAgICAgICAgICAgfSwgQS5yZXF1ZXN0QmlkcyA9IE9iamVjdChjLmIpKCdhc3luYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDoge30sIHQgPSBlLmJpZHNCYWNrSGFuZGxlciwgbiA9IGUudGltZW91dCwgciA9IGUuYWRVbml0cywgaSA9IGUuYWRVbml0Q29kZXMsIG8gPSBlLmxhYmVscywgYSA9IGUuYXVjdGlvbklkOwogICAgICAgICAgICAgICAgICAgIEkuZW1pdCh4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG4gfHwgbC5iLmdldENvbmZpZygnYmlkZGVyVGltZW91dCcpLCByID0gciAmJiBsLmIuY29udmVydEFkVW5pdEZwZChPLmlzQXJyYXkocikgPyByIDogW3JdKSB8fCBBLmFkVW5pdHM7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnJlcXVlc3RCaWRzJywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IFtdLCBzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKGwuYi5nZXRDb25maWcoJ3Myc0NvbmZpZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUuczJzQ29uZmlnICYmICh1ID0gQXJyYXkuaXNBcnJheShlLnMyc0NvbmZpZykgPyBlLnMyc0NvbmZpZyA6IFtlLnMyc0NvbmZpZ10pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB1c2guYXBwbHkocywgdihlLmJpZGRlcnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSBIKHIpLCBpICYmIGkubGVuZ3RoID8gciA9IHIuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZygpKGksIGUuY29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogaSA9IHIgJiYgci5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByLmZvckVhY2goZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gT2JqZWN0LmtleXMoaS5tZWRpYVR5cGVzIHx8IHsgYmFubmVyOiAnYmFubmVyJyB9KSwgZSA9IGkuYmlkcy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYmlkZGVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhID0gVC5iaWRkZXJSZWdpc3RyeSwgdCA9IHMgPyBlLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWcoKShzLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRyYW5zYWN0aW9uSWQgPSBPLmdlbmVyYXRlVVVJRCgpLCB0LmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGFbdF0sIG4gPSBlICYmIGUuZ2V0U3BlYyAmJiBlLmdldFNwZWMoKSwgciA9IG4gJiYgbi5zdXBwb3J0ZWRNZWRpYVR5cGVzIHx8IFsnYmFubmVyJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKCkociwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgPyBiLmEuaW5jcmVtZW50QmlkZGVyUmVxdWVzdHNDb3VudGVyKGkuY29kZSwgdCkgOiAoTy5sb2dXYXJuKE8udW5zdXBwb3J0ZWRCaWRkZXJNZXNzYWdlKGksIHQpKSwgaS5iaWRzID0gaS5iaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXIgIT09IHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGIuYS5pbmNyZW1lbnRSZXF1ZXN0c0NvdW50ZXIoaS5jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgJiYgMCAhPT0gci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBtLmEuY3JlYXRlQXVjdGlvbih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0czogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYlRpbWVvdXQ6IGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGYgPSByLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgMTUgPCBmICYmIE8ubG9nSW5mbygnQ3VycmVudCBhdWN0aW9uICcuY29uY2F0KGQuZ2V0QXVjdGlvbklkKCksICcgY29udGFpbnMgJykuY29uY2F0KGYsICcgYWRVbml0cy4nKSwgciksIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuZC5zZXRMYXRlc3RBdWN0aW9uRm9yQWRVbml0KGUsIGQuZ2V0QXVjdGlvbklkKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgZC5jYWxsQmlkcygpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTy5sb2dNZXNzYWdlKCdObyBhZFVuaXRzIGNvbmZpZ3VyZWQuIE5vIGJpZHMgcmVxdWVzdGVkLicpLCAnZnVuY3Rpb24nID09IHR5cGVvZiB0KQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ0Vycm9yKCdFcnJvciBleGVjdXRpbmcgYmlkc0JhY2tIYW5kbGVyJywgbnVsbCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLCBBLnJlcXVlc3RCaWRzLmJlZm9yZShZLCA0OSksIEEuYWRkQWRVbml0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmFkZEFkVW5pdHMnLCBhcmd1bWVudHMpLCBBLmFkVW5pdHMucHVzaC5hcHBseShBLmFkVW5pdHMsIGwuYi5jb252ZXJ0QWRVbml0RnBkKE8uaXNBcnJheShlKSA/IGUgOiBbZV0pKSwgSS5lbWl0KHcpOwogICAgICAgICAgICAgICAgfSwgQS5vbkV2ZW50ID0gZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBPLmxvZ0luZm8oJ0ludm9raW5nIHBianMub25FdmVudCcsIGFyZ3VtZW50cyksIE8uaXNGbih0KSA/ICFuIHx8IHFbZV0uY2FsbChudWxsLCBuKSA/IEkub24oZSwgdCwgbikgOiBPLmxvZ0Vycm9yKCdUaGUgaWQgcHJvdmlkZWQgaXMgbm90IHZhbGlkIGZvciBldmVudCAiJyArIGUgKyAnIiBhbmQgbm8gaGFuZGxlciB3YXMgc2V0LicpIDogTy5sb2dFcnJvcignVGhlIGV2ZW50IGhhbmRsZXIgcHJvdmlkZWQgaXMgbm90IGEgZnVuY3Rpb24gYW5kIHdhcyBub3Qgc2V0IG9uIGV2ZW50ICInICsgZSArICciLicpOwogICAgICAgICAgICAgICAgfSwgQS5vZmZFdmVudCA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLm9mZkV2ZW50JywgYXJndW1lbnRzKSwgbiAmJiAhcVtlXS5jYWxsKG51bGwsIG4pIHx8IEkub2ZmKGUsIHQsIG4pOwogICAgICAgICAgICAgICAgfSwgQS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8ubG9nSW5mbygnSW52b2tpbmcgcGJqcy5nZXRFdmVudHMnKSwgSS5nZXRFdmVudHMoKTsKICAgICAgICAgICAgICAgIH0sIEEucmVnaXN0ZXJCaWRBZGFwdGVyID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBPLmxvZ0luZm8oJ0ludm9raW5nIHBianMucmVnaXN0ZXJCaWRBZGFwdGVyJywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBULnJlZ2lzdGVyQmlkQWRhcHRlcihlKCksIHQpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgTy5sb2dFcnJvcignRXJyb3IgcmVnaXN0ZXJpbmcgYmlkZGVyIGFkYXB0ZXIgOiAnICsgZS5tZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBBLnJlZ2lzdGVyQW5hbHl0aWNzQWRhcHRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLnJlZ2lzdGVyQW5hbHl0aWNzQWRhcHRlcicsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgVC5yZWdpc3RlckFuYWx5dGljc0FkYXB0ZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ0Vycm9yKCdFcnJvciByZWdpc3RlcmluZyBhbmFseXRpY3MgYWRhcHRlciA6ICcgKyBlLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIEEuY3JlYXRlQmlkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmNyZWF0ZUJpZCcsIGFyZ3VtZW50cyksIE9iamVjdChkLmEpKGUpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBRID0gW10sICQgPSBPYmplY3QoYy5iKSgnYXN5bmMnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlICYmICFPLmlzRW1wdHkoZSkgPyAoTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmVuYWJsZUFuYWx5dGljcyBmb3I6ICcsIGUpLCBULmVuYWJsZUFuYWx5dGljcyhlKSkgOiBPLmxvZ0Vycm9yKCdwYmpzLmVuYWJsZUFuYWx5dGljcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggb3B0aW9uIHt9Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgJ2VuYWJsZUFuYWx5dGljc0NiJyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBYKGUpIHsKICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZS5jYWxsZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuY2FsbCgpLCBlLmNhbGxlZCA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8ubG9nRXJyb3IoJ0Vycm9yIHByb2Nlc3NpbmcgY29tbWFuZCA6JywgJ3ByZWJpZC5qcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQS5lbmFibGVBbmFseXRpY3MgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIFEucHVzaCgkLmJpbmQodGhpcywgZSkpOwogICAgICAgICAgICAgICAgfSwgQS5hbGlhc0JpZGRlciA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgTy5sb2dJbmZvKCdJbnZva2luZyBwYmpzLmFsaWFzQmlkZGVyJywgYXJndW1lbnRzKSwgZSAmJiB0ID8gVC5hbGlhc0JpZEFkYXB0ZXIoZSwgdCwgbikgOiBPLmxvZ0Vycm9yKCdiaWRkZXJDb2RlIGFuZCBhbGlhcyBtdXN0IGJlIHBhc3NlZCBhcyBhcmd1bWVudHMnLCAncGJqcy5hbGlhc0JpZGRlcicpOwogICAgICAgICAgICAgICAgfSwgQS5nZXRBbGxXaW5uaW5nQmlkcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbS5hLmdldEFsbFdpbm5pbmdCaWRzKCk7CiAgICAgICAgICAgICAgICB9LCBBLmdldEFsbFByZWJpZFdpbm5pbmdCaWRzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtLmEuZ2V0Qmlkc1JlY2VpdmVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0YXR1cyA9PT0gRS5CSURfU1RBVFVTLkJJRF9UQVJHRVRJTkdfU0VUOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgQS5nZXRIaWdoZXN0Q3BtQmlkcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuZC5nZXRXaW5uaW5nQmlkcyhlKTsKICAgICAgICAgICAgICAgIH0sIEEubWFya1dpbm5pbmdCaWRBc1VzZWQgPSBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gW107CiAgICAgICAgICAgICAgICAgICAgdC5hZFVuaXRDb2RlICYmIHQuYWRJZCA/IGUgPSBtLmEuZ2V0Qmlkc1JlY2VpdmVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkSWQgPT09IHQuYWRJZCAmJiBlLmFkVW5pdENvZGUgPT09IHQuYWRVbml0Q29kZTsKICAgICAgICAgICAgICAgICAgICB9KSA6IHQuYWRVbml0Q29kZSA/IGUgPSBwLmQuZ2V0V2lubmluZ0JpZHModC5hZFVuaXRDb2RlKSA6IHQuYWRJZCA/IGUgPSBtLmEuZ2V0Qmlkc1JlY2VpdmVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmFkSWQgPT09IHQuYWRJZDsKICAgICAgICAgICAgICAgICAgICB9KSA6IE8ubG9nV2FybignSW1wcm9wZXIgdXNlIG9mIG1hcmtXaW5uaW5nQmlkQXNVc2VkLiBJdCBuZWVkcyBhbiBhZFVuaXRDb2RlIG9yIGFuIGFkSWQgdG8gZnVuY3Rpb24uJyksIDAgPCBlLmxlbmd0aCAmJiAoZVswXS5zdGF0dXMgPSBFLkJJRF9TVEFUVVMuUkVOREVSRUQpOwogICAgICAgICAgICAgICAgfSwgQS5nZXRDb25maWcgPSBsLmIuZ2V0Q29uZmlnLCBBLnNldENvbmZpZyA9IGwuYi5zZXRDb25maWcsIEEuc2V0QmlkZGVyQ29uZmlnID0gbC5iLnNldEJpZGRlckNvbmZpZywgQS5xdWUucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdChvLmEpKCk7CiAgICAgICAgICAgICAgICB9KSwgQS5jbWQucHVzaCA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmNhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTy5sb2dFcnJvcignRXJyb3IgcHJvY2Vzc2luZyBjb21tYW5kIDonLCBlLm1lc3NhZ2UsIGUuc3RhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBPLmxvZ0Vycm9yKCdDb21tYW5kcyB3cml0dGVuIGludG8gcGJqcy5jbWQucHVzaCBtdXN0IGJlIHdyYXBwZWQgaW4gYSBmdW5jdGlvbicpOwogICAgICAgICAgICAgICAgfSwgQS5xdWUucHVzaCA9IEEuY21kLnB1c2gsIEEucHJvY2Vzc1F1ZXVlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGMuYi5yZWFkeSgpLCBYKEEucXVlKSwgWChBLmNtZCk7CiAgICAgICAgICAgICAgICB9LCB0LmRlZmF1bHQgPSBBOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3MTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuYSA9IGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgby5hZFNlcnZlcnMgPSBvLmFkU2VydmVycyB8fCB7fSwgby5hZFNlcnZlcnNbdF0gPSBvLmFkU2VydmVyc1t0XSB8fCB7fSwgT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvLmFkU2VydmVyc1t0XVtlXSA/IE9iamVjdChpLmxvZ1dhcm4pKCdBdHRlbXB0aW5nIHRvIGFkZCBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgZnVuY3Rpb24gcHJvcGVydHkgJy5jb25jYXQoZSwgJyBmb3IgQWRTZXJ2ZXIgJykuY29uY2F0KHQsICcuJykpIDogby5hZFNlcnZlcnNbdF1bZV0gPSBuW2VdOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciByID0gbigxNyksIGkgPSBuKDApLCBvID0gT2JqZWN0KHIuYSkoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNzI6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzEpLCBpID0gbig0OCksIG8gPSAnJy5zcGxpdDsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCk7CiAgICAgICAgICAgICAgICB9KSA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdTdHJpbmcnID09IGkoZSkgPyBvLmNhbGwoZSwgJycpIDogT2JqZWN0KGUpOwogICAgICAgICAgICAgICAgfSA6IE9iamVjdDsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNzM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMzApLCBpID0gbigzMSksIG8gPSBuKDc0KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9ICFyICYmICFpKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gNyAhPSBPYmplY3QuZGVmaW5lUHJvcGVydHkobygnZGl2JyksICdhJywgewogICAgICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkuYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigyNiksIGkgPSBuKDI3KSwgbyA9IHIuZG9jdW1lbnQsIGEgPSBpKG8pICYmIGkoby5jcmVhdGVFbGVtZW50KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPyBvLmNyZWF0ZUVsZW1lbnQoZSkgOiB7fTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDc1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE2KSwgaSA9IG4oNzYpOwogICAgICAgICAgICAgICAgKGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlbZV0gfHwgKGlbZV0gPSB2b2lkIDAgIT09IHQgPyB0IDoge30pOwogICAgICAgICAgICAgICAgfSkoJ3ZlcnNpb25zJywgW10pLnB1c2goewogICAgICAgICAgICAgICAgICAgIHZlcnNpb246ICczLjYuNCcsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogciA/ICdwdXJlJyA6ICdnbG9iYWwnLAogICAgICAgICAgICAgICAgICAgIGNvcHlyaWdodDogJ1x4QTkgMjAyMCBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3NjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigyNiksIGkgPSBuKDEwNSksIG8gPSAnX19jb3JlLWpzX3NoYXJlZF9fJywgYSA9IHJbb10gfHwgaShvLCB7fSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBhOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3NzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIHZhciByID0gbigzMSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAhIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiYgIXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhU3RyaW5nKFN5bWJvbCgpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3ODogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoYykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgaSA9IHUoZSksIG8gPSBzKGkubGVuZ3RoKSwgYSA9IGQobiwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICYmIHQgIT0gdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGEgPCBvOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHIgPSBpW2ErK10pICE9IHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgYSA8IG87IGErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGMgfHwgYSBpbiBpKSAmJiBpW2FdID09PSB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyB8fCBhIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhYyAmJiAtMTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHUgPSBuKDQ3KSwgcyA9IG4oNTApLCBkID0gbigxMDkpOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gewogICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzOiByKCEwKSwKICAgICAgICAgICAgICAgICAgICBpbmRleE9mOiByKCExKQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNzk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTEwKTsKICAgICAgICAgICAgICAgIG4oMTMzKSwgbigxMzUpLCBuKDEzNyksIG4oMTM5KSwgbigxNDEpLCBuKDE0MiksIG4oMTQzKSwgbigxNDQpLCBuKDE0NSksIG4oMTQ2KSwgbigxNDcpLCBuKDE0OCksIG4oMTQ5KSwgbigxNTApLCBuKDE1MSksIG4oMTUyKSwgbigxNTMpLCBuKDE1NCksIGUuZXhwb3J0cyA9IHI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgbi5kKHQsICdnZHByRGF0YUhhbmRsZXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEI7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICd1c3BEYXRhSGFuZGxlcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVTsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2NsaWVudFRlc3RBZGFwdGVycycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUjsKICAgICAgICAgICAgICAgIH0pLCBuLmQodCwgJ2FsbFMyU0JpZGRlcnMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGs7CiAgICAgICAgICAgICAgICB9KSwgdC5nZXRBbGxTMlNCaWRkZXJzID0gRCwgdC5zZXRTMlNUZXN0aW5nTW9kdWxlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBBID0gZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgaCA9IG4oMCksIHAgPSBuKDkzKSwgZyA9IG4oMzgpLCBsID0gbigxKSwgeSA9IG4oNCksIGEgPSBuKDMpLCByID0gbigxMSksIGkgPSBuKDEzKSwgbSA9IG4ubihpKSwgbyA9IG4oMTApLCBTID0gbi5uKG8pLCBiID0gbig2NyksIGMgPSBuKDIwKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbXSwgciA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhLCBjID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEociA9IChhID0gYy5uZXh0KCkpLmRvbmUpICYmIChuLnB1c2goYS52YWx1ZSksICF0IHx8IG4ubGVuZ3RoICE9PSB0KTsgciA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8fCBudWxsID09IGMucmV0dXJuIHx8IGMucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgIH0oZSwgdCkgfHwgZChlLCB0KSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBkKGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSBuICYmIGUuY29uc3RydWN0b3IgJiYgKG4gPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gbiB8fCAnU2V0JyA9PT0gbiA/IEFycmF5LmZyb20oZSkgOiAnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSA/IGYoZSwgdCkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gdCB8fCB0ID4gZS5sZW5ndGgpICYmICh0ID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwLCByID0gbmV3IEFycmF5KHQpOyBuIDwgdDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICByW25dID0gZVtuXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBBLCBFID0gbigwKSwgTyA9IG4oNSksIFQgPSBuKDkpLCBJID0ge30sIGogPSBJLmJpZGRlclJlZ2lzdHJ5ID0ge30sIEMgPSBJLmFsaWFzUmVnaXN0cnkgPSB7fSwgdyA9IFtdOwogICAgICAgICAgICAgICAgYS5iLmdldENvbmZpZygnczJzQ29uZmlnJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBlICYmIGUuczJzQ29uZmlnICYmICh3ID0gQXJyYXkuaXNBcnJheShlLnMyc0NvbmZpZykgPyBlLnMyc0NvbmZpZyA6IFtlLnMyc0NvbmZpZ10pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgXyA9IHt9OwogICAgICAgICAgICAgICAgdmFyIHggPSBPYmplY3Qoci5iKSgnc3luYycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBlLmJpZGRlckNvZGUsIHMgPSBlLmF1Y3Rpb25JZCwgZCA9IGUuYmlkZGVyUmVxdWVzdElkLCB0ID0gZS5hZFVuaXRzLCBmID0gZS5sYWJlbHMsIGwgPSBlLnNyYzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24gKGUsIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QocC5iKShPYmplY3QocC5hKShjLCBmKSwgYy5tZWRpYVR5cGVzLCBjLnNpemVzKSwgbiA9IHQuYWN0aXZlLCB1ID0gdC5tZWRpYVR5cGVzLCByID0gdC5maWx0ZXJSZXN1bHRzOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA/IHIgJiYgRS5sb2dJbmZvKCdTaXplIG1hcHBpbmcgZmlsdGVyZWQgYWRVbml0ICInLmNvbmNhdChjLmNvZGUsICciIGJhbm5lciBzaXplcyBmcm9tICcpLCByLmJlZm9yZSwgJ3RvICcsIHIuYWZ0ZXIpIDogRS5sb2dJbmZvKCdTaXplIG1hcHBpbmcgZGlzYWJsZWQgYWRVbml0ICInLmNvbmNhdChjLmNvZGUsICciJykpLCBuICYmIGUucHVzaChjLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRkZXIgPT09IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBjLm5hdGl2ZVBhcmFtcyB8fCBFLmRlZXBBY2Nlc3MoYywgJ21lZGlhVHlwZXMubmF0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICh0ID0gdih7fSwgdCwgeyBuYXRpdmVQYXJhbXM6IE9iamVjdChnLmgpKG4pIH0pKSwgdCA9IHYoe30sIHQsIE9iamVjdChoLmdldERlZmluZWRQYXJhbXMpKGMsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3J0YjJJbXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZWRpYVR5cGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW5kZXJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0b3JlZEF1Y3Rpb25SZXNwb25zZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0KHAuYikoT2JqZWN0KHAuYSkodCwgZiksIHUpLCBpID0gci5hY3RpdmUsIG8gPSByLm1lZGlhVHlwZXMsIGEgPSByLmZpbHRlclJlc3VsdHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA/IGEgJiYgRS5sb2dJbmZvKCdTaXplIG1hcHBpbmcgZmlsdGVyZWQgYWRVbml0ICInLmNvbmNhdChjLmNvZGUsICciIGJpZGRlciAiJykuY29uY2F0KHQuYmlkZGVyLCAnIiBiYW5uZXIgc2l6ZXMgZnJvbSAnKSwgYS5iZWZvcmUsICd0byAnLCBhLmFmdGVyKSA6IEUubG9nSW5mbygnU2l6ZSBtYXBwaW5nIGRlYWN0aXZhdGVkIGFkVW5pdCAiJy5jb25jYXQoYy5jb2RlLCAnIiBiaWRkZXIgIicpLmNvbmNhdCh0LmJpZGRlciwgJyInKSksIEUuaXNWYWxpZE1lZGlhVHlwZXMobykgPyB0ID0gdih7fSwgdCwgeyBtZWRpYVR5cGVzOiBvIH0pIDogRS5sb2dFcnJvcignbWVkaWFUeXBlcyBpcyBub3QgY29ycmVjdGx5IGNvbmZpZ3VyZWQgZm9yIGFkdW5pdCAnLmNvbmNhdChjLmNvZGUpKSwgaSAmJiBlLnB1c2godih7fSwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGU6IGMuY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOiBjLnRyYW5zYWN0aW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IEUuZGVlcEFjY2VzcyhvLCAnYmFubmVyLnNpemVzJykgfHwgRS5kZWVwQWNjZXNzKG8sICd2aWRlby5wbGF5ZXJTaXplJykgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IHQuYmlkX2lkIHx8IEUuZ2V0VW5pcXVlSWRlbnRpZmllclN0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RJZDogZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWN0aW9uSWQ6IHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZFJlcXVlc3RzQ291bnQ6IGIuYS5nZXRSZXF1ZXN0c0NvdW50ZXIoYy5jb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0c0NvdW50OiBiLmEuZ2V0QmlkZGVyUmVxdWVzdHNDb3VudGVyKGMuY29kZSwgdC5iaWRkZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcldpbnNDb3VudDogYi5hLmdldEJpZGRlcldpbnNDb3VudGVyKGMuY29kZSwgdC5iaWRkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgW10pLnJlZHVjZShoLmZsYXR0ZW4sIFtdKS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnICE9PSBlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwgJ2dldEJpZHMnKTsKICAgICAgICAgICAgICAgIHZhciBCID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50RGF0YTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29uc2VudERhdGE6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCLmNvbnNlbnREYXRhID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc2VudERhdGE6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCLmNvbnNlbnREYXRhOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgVSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudERhdGE6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbnNlbnREYXRhOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVS5jb25zZW50RGF0YSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnNlbnREYXRhOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVS5jb25zZW50RGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIFIgPSBbXSwgayA9IFtdOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRCgpIHsKICAgICAgICAgICAgICAgICAgICBJLnMyU1Rlc3RpbmdFbmFibGVkID0gITEsIHcuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUuZW5hYmxlZCAmJiBlLmJpZGRlcnMgJiYgZS5iaWRkZXJzLmxlbmd0aCAmJiBrLnB1c2guYXBwbHkoaywgcyhlLmJpZGRlcnMpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE4oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuZW5hYmxlZCAmJiBlLnRlc3RpbmcgJiYgQTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFAodCwgbiwgZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0galt0XS5nZXRTcGVjKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgcltuXSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiByW25dICYmIChFLmxvZ0luZm8oJ0ludm9raW5nICcuY29uY2F0KHQsICcuJykuY29uY2F0KG4pKSwgYS5iLnJ1bldpdGhCaWRkZXIodCwgaC5iaW5kLmNhbGwocltuXSwgciwgZSkpKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEUubG9nV2FybignRXJyb3IgY2FsbGluZyAnLmNvbmNhdChuLCAnIG9mICcpLmNvbmNhdCh0KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgSS5tYWtlQmlkUmVxdWVzdHMgPSBPYmplY3Qoci5iKSgnc3luYycsIGZ1bmN0aW9uIChkLCBmLCBsLCBpLCBwKSB7CiAgICAgICAgICAgICAgICAgICAgVC5lbWl0KE8uRVZFTlRTLkJFRk9SRV9SRVFVRVNUX0JJRFMsIGQpOwogICAgICAgICAgICAgICAgICAgIHZhciBlID0gT2JqZWN0KGguZ2V0QmlkZGVyQ29kZXMpKGQpOwogICAgICAgICAgICAgICAgICAgIGEuYi5nZXRDb25maWcoJ2JpZGRlclNlcXVlbmNlJykgPT09IGEuYSAmJiAoZSA9IE9iamVjdChoLnNodWZmbGUpKGUpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IE9iamVjdChjLmEpKCksIGIgPSBlLCB2ID0gW107CiAgICAgICAgICAgICAgICAgICAgMCA9PT0gay5sZW5ndGggJiYgRCgpLCB3LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLmVuYWJsZWQgJiYgTihlKSAmJiAoQS5jYWxjdWxhdGVCaWRTb3VyY2VzKGUpLCBBLmdldFNvdXJjZUJpZGRlck1hcChkLCBrKVtBLkNMSUVOVF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbSgpKFIsIGUpIHx8IFIucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBiID0gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFtKCkoaywgZSkgfHwgbSgpKFIsIGUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciB5ID0gazsKICAgICAgICAgICAgICAgICAgICB3LmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8sIGUsIHQsIG4sIGEsIGMsIHUsIHM7CiAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgci5lbmFibGVkICYmIChzID0gciwgQm9vbGVhbihOKHMpICYmIHMudGVzdFNlcnZlck9ubHkpICYmIChjID0gZCwgdSA9IHIsIEJvb2xlYW4oUygpKGMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUygpKGUuYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGUuYmlkU291cmNlIHx8IHUuYmlkZGVyQ29udHJvbCAmJiB1LmJpZGRlckNvbnRyb2xbZS5iaWRkZXJdKSAmJiBlLmZpbmFsU291cmNlID09PSBBLlNFUlZFUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkpICYmIChFLmxvZ1dhcm4oJ3Rlc3RTZXJ2ZXJPbmx5OiBUcnVlLiAgQWxsIGNsaWVudCByZXF1ZXN0cyB3aWxsIGJlIHN1cHByZXNzZWQuJyksIGIubGVuZ3RoID0gMCksIGUgPSBkLCBuID0gKHQgPSByKS5iaWRkZXJzLCAoYSA9IEUuZGVlcENsb25lKGUpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgPSBlLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oKShuLCBlLmJpZGRlcikgJiYgKCFOKHQpIHx8IGUuZmluYWxTb3VyY2UgIT09IEEuQ0xJRU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZF9pZCA9IEUuZ2V0VW5pcXVlSWRlbnRpZmllclN0cigpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpID0gYSA9IGEuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gZS5iaWRzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG8gPSBFLmdlbmVyYXRlVVVJRCgpLCB5LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gRS5nZXRVbmlxdWVJZGVudGlmaWVyU3RyKCksIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdElkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZHM6IHgoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyQ29kZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3RJZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdHM6IEUuZGVlcENsb25lKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiBPLlMyUy5TUkMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25TdGFydDogZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogci50aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6IE8uUzJTLlNSQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlckluZm86IGcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAhPT0gbi5iaWRzLmxlbmd0aCAmJiB2LnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5iaWRzLmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTKCkodiwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoKShlLmJpZHMsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRJZCA9PT0gdC5iaWRfaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgPSB0OwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdi5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IGUuYWRVbml0c1MyU0NvcHkgJiYgKGUuYWRVbml0c1MyU0NvcHkgPSBpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgZS5iaWRzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCBvID0gKHQgPSBkLCAobiA9IEUuZGVlcENsb25lKHQpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgPSBlLmJpZHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFSLmxlbmd0aCB8fCBlLmZpbmFsU291cmNlICE9PSBBLlNFUlZFUjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgbiA9IG4uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPT0gZS5iaWRzLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBiLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBFLmdldFVuaXF1ZUlkZW50aWZpZXJTdHIoKSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJDb2RlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJSZXF1ZXN0SWQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogeCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlckNvZGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1Y3Rpb25JZDogbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdElkOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBFLmRlZXBDbG9uZShvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM6ICdjbGllbnQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVjdGlvblN0YXJ0OiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlckluZm86IGcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIgPSBqW2VdOwogICAgICAgICAgICAgICAgICAgICAgICByIHx8IEUubG9nRXJyb3IoJ1RyeWluZyB0byBtYWtlIGEgcmVxdWVzdCBmb3IgYmlkZGVyIHRoYXQgZG9lcyBub3QgZXhpc3Q6ICcuY29uY2F0KGUpKSwgciAmJiBuLmJpZHMgJiYgMCAhPT0gbi5iaWRzLmxlbmd0aCAmJiB2LnB1c2gobik7CiAgICAgICAgICAgICAgICAgICAgfSksIEIuZ2V0Q29uc2VudERhdGEoKSAmJiB2LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5nZHByQ29uc2VudCA9IEIuZ2V0Q29uc2VudERhdGEoKTsKICAgICAgICAgICAgICAgICAgICB9KSwgVS5nZXRDb25zZW50RGF0YSgpICYmIHYuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnVzcENvbnNlbnQgPSBVLmdldENvbnNlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgfSksIHY7CiAgICAgICAgICAgICAgICB9LCAnbWFrZUJpZFJlcXVlc3RzJyksIEkuY2FsbEJpZHMgPSBmdW5jdGlvbiAoZSwgdCwgZCwgZiwgbCwgcCwgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuLCByLCBnLCBiLCB2OwogICAgICAgICAgICAgICAgICAgIHQubGVuZ3RoID8gKHIgPSAobiA9IHUodC5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbTnVtYmVyKHZvaWQgMCAhPT0gdC5zcmMgJiYgdC5zcmMgPT09IE8uUzJTLlNSQyldLnB1c2godCksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgWwogICAgICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgW10KICAgICAgICAgICAgICAgICAgICBdKSwgMikpWzBdLCBnID0gblsxXSwgYiA9IFtdLCBnLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IC0xLCBuID0gMDsgbiA8IGIubGVuZ3RoOyArK24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS50aWQgPT09IGJbbl0udGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHQgPD0gLTEgJiYgYi5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgIH0pLCB2ID0gMCwgdy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBpLCBvLCBhLCBjLCB1LCBzOwogICAgICAgICAgICAgICAgICAgICAgICBlICYmIGJbdl0gJiYgbSgpKGUuYmlkZGVycywgYlt2XS5iaWRkZXJDb2RlKSAmJiAodCA9IE9iamVjdCh5LmIpKHAsIGwgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBsLnJlcXVlc3QuYmluZChudWxsLCAnczJzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBsLmRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHZvaWQgMCksIG4gPSBlLmJpZGRlcnMsIHIgPSBqW2UuYWRhcHRlcl0sIGkgPSBiW3ZdLnRpZCwgbyA9IGJbdl0uYWRVbml0c1MyU0NvcHksIGEgPSBnLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudGlkID09PSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgciA/IChjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlkOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRfdW5pdHM6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMnNDb25maWc6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfSkuYWRfdW5pdHMubGVuZ3RoICYmICh1ID0gYS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0YXJ0ID0gT2JqZWN0KGgudGltZXN0YW1wKSgpLCBmLmJpbmQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzID0gYy5hZF91bml0cy5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNvbmNhdCgodC5iaWRzIHx8IFtdKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb25jYXQodC5iaWRkZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pLCBFLmxvZ01lc3NhZ2UoJ0NBTExJTkcgUzJTIEhFQURFUiBCSURERVJTID09PT0gJy5jb25jYXQobi5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCkocywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJywnKSkpLCBhLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuZW1pdChPLkVWRU5UUy5CSURfUkVRVUVTVEVELCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIuY2FsbEJpZHMoYywgZywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0KGguZ2V0QmlkZGVyUmVxdWVzdCkoZywgdC5iaWRkZXJDb2RlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgZC5jYWxsKG4sIGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LCB0KSkgOiBFLmxvZ0Vycm9yKCdtaXNzaW5nICcgKyBlLmFkYXB0ZXIpLCB2KyspOwogICAgICAgICAgICAgICAgICAgIH0pLCByLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdC5zdGFydCA9IE9iamVjdChoLnRpbWVzdGFtcCkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBqW3QuYmlkZGVyQ29kZV07CiAgICAgICAgICAgICAgICAgICAgICAgIEUubG9nTWVzc2FnZSgnQ0FMTElORyBCSURERVIgPT09PT09PSAnLmNvbmNhdCh0LmJpZGRlckNvZGUpKSwgVC5lbWl0KE8uRVZFTlRTLkJJRF9SRVFVRVNURUQsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IE9iamVjdCh5LmIpKHAsIGwgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogbC5yZXF1ZXN0LmJpbmQobnVsbCwgdC5iaWRkZXJDb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBsLmRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiB2b2lkIDApLCByID0gZi5iaW5kKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5iLnJ1bldpdGhCaWRkZXIodC5iaWRkZXJDb2RlLCBoLmJpbmQuY2FsbChlLmNhbGxCaWRzLCBlLCB0LCBkLmJpbmQodCksIHIsIG4sIGksIGEuYi5jYWxsYmFja1dpdGhCaWRkZXIodC5iaWRkZXJDb2RlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLmxvZ0Vycm9yKCcnLmNvbmNhdCh0LmJpZGRlckNvZGUsICcgQmlkIEFkYXB0ZXIgZW1pdHRlZCBhbiB1bmNhdWdodCBlcnJvciB3aGVuIHBhcnNpbmcgdGhlaXIgYmlkUmVxdWVzdCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0OiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpIDogRS5sb2dXYXJuKCdjYWxsQmlkcyBleGVjdXRlZCB3aXRoIG5vIGJpZFJlcXVlc3RzLiAgV2VyZSB0aGV5IGZpbHRlcmVkIGJ5IGxhYmVscyBvciBzaXppbmc/Jyk7CiAgICAgICAgICAgICAgICB9LCBJLnZpZGVvQWRhcHRlcnMgPSBbXSwgSS5yZWdpc3RlckJpZEFkYXB0ZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gKDIgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDoge30pLnN1cHBvcnRlZE1lZGlhVHlwZXMsIHIgPSB2b2lkIDAgPT09IG4gPyBbXSA6IG47CiAgICAgICAgICAgICAgICAgICAgZSAmJiB0ID8gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5jYWxsQmlkcyA/IChqW3RdID0gZSwgbSgpKHIsICd2aWRlbycpICYmIEkudmlkZW9BZGFwdGVycy5wdXNoKHQpLCBtKCkociwgJ25hdGl2ZScpICYmIGcuZi5wdXNoKHQpKSA6IEUubG9nRXJyb3IoJ0JpZGRlciBhZGFwdG9yIGVycm9yIGZvciBiaWRkZXIgY29kZTogJyArIHQgKyAnYmlkZGVyIG11c3QgaW1wbGVtZW50IGEgY2FsbEJpZHMoKSBmdW5jdGlvbicpIDogRS5sb2dFcnJvcignYmlkQWRhcHRlciBvciBiaWRkZXJDb2RlIG5vdCBzcGVjaWZpZWQnKTsKICAgICAgICAgICAgICAgIH0sIEkuYWxpYXNCaWRBZGFwdGVyID0gZnVuY3Rpb24gKG4sIHIsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaTsKICAgICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBqW3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0galtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkZGVycyAmJiBlLmJpZGRlcnMubGVuZ3RoICYmICh0ID0gZSAmJiBlLmJpZGRlcnMsIGUgJiYgbSgpKHQsIHIpID8gQ1tyXSA9IG4gOiBhLnB1c2gobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGEuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUubG9nRXJyb3IoJ2JpZGRlckNvZGUgIicgKyBlICsgJyIgaXMgbm90IGFuIGV4aXN0aW5nIGJpZGRlci4nLCAnYWRhcHRlck1hbmFnZXIuYWxpYXNCaWRBZGFwdGVyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjLCB1LCBzLCBkLCBmID0gKHQgPSBuLCBpID0gW10sIG0oKShJLnZpZGVvQWRhcHRlcnMsIHQpICYmIGkucHVzaCgndmlkZW8nKSwgbSgpKGcuZiwgdCkgJiYgaS5wdXNoKCduYXRpdmUnKSwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgIT0gT2JqZWN0LnByb3RvdHlwZSA/IChkID0gbmV3IG8uY29uc3RydWN0b3IoKSkuc2V0QmlkZGVyQ29kZShyKSA6IChjID0gby5nZXRTcGVjKCksIHUgPSBlICYmIGUuZ3ZsaWQsIHMgPSBlICYmIGUuc2tpcFBic0FsaWFzaW5nLCBkID0gT2JqZWN0KGwubmV3QmlkZGVyKSh2KHt9LCBjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwUGJzQWxpYXNpbmc6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksIENbcl0gPSBuKSwgSS5yZWdpc3RlckJpZEFkYXB0ZXIoZCwgciwgeyBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBmIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUubG9nRXJyb3IobiArICcgYmlkZGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGFsaWFzaW5nLicsICdhZGFwdGVyTWFuYWdlci5hbGlhc0JpZEFkYXB0ZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgRS5sb2dNZXNzYWdlKCdhbGlhcyBuYW1lICInICsgciArICciIGhhcyBiZWVuIGFscmVhZHkgc3BlY2lmaWVkLicpOwogICAgICAgICAgICAgICAgfSwgSS5yZWdpc3RlckFuYWx5dGljc0FkYXB0ZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5hZGFwdGVyLCBuID0gZS5jb2RlLCByID0gZS5ndmxpZDsKICAgICAgICAgICAgICAgICAgICB0ICYmIG4gPyAnZnVuY3Rpb24nID09IHR5cGVvZiB0LmVuYWJsZUFuYWx5dGljcyA/ICh0LmNvZGUgPSBuLCBfW25dID0gewogICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogcgogICAgICAgICAgICAgICAgICAgIH0pIDogRS5sb2dFcnJvcignUHJlYmlkIEVycm9yOiBBbmFseXRpY3MgYWRhcHRvciBlcnJvciBmb3IgYW5hbHl0aWNzICInLmNvbmNhdChuLCAnIlxuICAgICAgICBhbmFseXRpY3MgYWRhcHRlciBtdXN0IGltcGxlbWVudCBhbiBlbmFibGVBbmFseXRpY3MoKSBmdW5jdGlvbicpKSA6IEUubG9nRXJyb3IoJ1ByZWJpZCBFcnJvcjogYW5hbHl0aWNzQWRhcHRlciBvciBhbmFseXRpY3NDb2RlIG5vdCBzcGVjaWZpZWQnKTsKICAgICAgICAgICAgICAgIH0sIEkuZW5hYmxlQW5hbHl0aWNzID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBFLmlzQXJyYXkoZSkgfHwgKGUgPSBbZV0pLCBFLl9lYWNoKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gX1tlLnByb3ZpZGVyXS5hZGFwdGVyOwogICAgICAgICAgICAgICAgICAgICAgICB0ID8gdC5lbmFibGVBbmFseXRpY3MoZSkgOiBFLmxvZ0Vycm9yKCdQcmViaWQgRXJyb3I6IG5vIGFuYWx5dGljcyBhZGFwdGVyIGZvdW5kIGluIHJlZ2lzdHJ5IGZvclxuICAgICAgICAnLmNvbmNhdChlLnByb3ZpZGVyLCAnLicpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIEkuZ2V0QmlkQWRhcHRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpbZV07CiAgICAgICAgICAgICAgICB9LCBJLmdldEFuYWx5dGljc0FkYXB0ZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfW2VdOwogICAgICAgICAgICAgICAgfSwgSS5jYWxsVGltZWRPdXRCaWRkZXJzID0gZnVuY3Rpb24gKHQsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICBuID0gbi5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zID0gRS5nZXRVc2VyQ29uZmlndXJlZFBhcmFtcyh0LCBlLmFkVW5pdENvZGUsIGUuYmlkZGVyKSwgZS50aW1lb3V0ID0gciwgZTsKICAgICAgICAgICAgICAgICAgICB9KSwgbiA9IEUuZ3JvdXBCeShuLCAnYmlkZGVyJyksIE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgUChlLCAnb25UaW1lb3V0JywgbltlXSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBJLmNhbGxCaWRXb25CaWRkZXIgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHQucGFyYW1zID0gRS5nZXRVc2VyQ29uZmlndXJlZFBhcmFtcyhuLCB0LmFkVW5pdENvZGUsIHQuYmlkZGVyKSwgYi5hLmluY3JlbWVudEJpZGRlcldpbnNDb3VudGVyKHQuYWRVbml0Q29kZSwgdC5iaWRkZXIpLCBQKGUsICdvbkJpZFdvbicsIHQpOwogICAgICAgICAgICAgICAgfSwgSS5jYWxsU2V0VGFyZ2V0aW5nQmlkZGVyID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBQKGUsICdvblNldFRhcmdldGluZycsIHQpOwogICAgICAgICAgICAgICAgfSwgSS5jYWxsQmlkVmlld2FibGVCaWRkZXIgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIFAoZSwgJ29uQmlkVmlld2FibGUnLCB0KTsKICAgICAgICAgICAgICAgIH0sIHQuZGVmYXVsdCA9IEk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDgwOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gcihlKSB7CiAgICAgICAgICAgICAgICAgICAgYyhlLCBkLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RJRDogJ08nICsgKytmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha0RhdGE6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBpID0gbig1MyksIG8gPSBuKDI3KSwgYSA9IG4oMjgpLCBjID0gbigzMykuZiwgdSA9IG4oNTkpLCBzID0gbigxMTMpLCBkID0gdSgnbWV0YScpLCBmID0gMCwgbCA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITA7CiAgICAgICAgICAgICAgICAgICAgfSwgcCA9IGUuZXhwb3J0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUkVRVUlSRUQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBmYXN0S2V5OiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3ltYm9sJyA9PSB0eXBlb2YgZSA/IGUgOiAoJ3N0cmluZycgPT0gdHlwZW9mIGUgPyAnUycgOiAnUCcpICsgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYShlLCBkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdGJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlW2RdLm9iamVjdElEOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRXZWFrRGF0YTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYShlLCBkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtkXS53ZWFrRGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb25GcmVlemU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcyAmJiBwLlJFUVVJUkVEICYmIGwoZSkgJiYgIWEoZSwgZCkgJiYgcihlKSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpW2RdID0gITA7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDgxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDIyKSwgaSA9IG4oNDApLCBvID0gcignaXRlcmF0b3InKSwgYSA9IEFycmF5LnByb3RvdHlwZTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gZSAmJiAoaS5BcnJheSA9PT0gZSB8fCBhW29dID09PSBlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDgyOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIG8gPSBuKDE1KTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0LCBlLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPyBlKG8obilbMF0sIG5bMV0pIDogZShuKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdC5yZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHZvaWQgMCAhPT0gaSAmJiBvKGkuY2FsbCh0KSksIGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgODM6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiB0KSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgJyArIChuID8gbiArICcgJyA6ICcnKSArICdpbnZvY2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA4NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzxzY3JpcHQ+JyArIGUgKyAnPC8nICsgZyArICc+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBvLCBhID0gbigxNSksIGMgPSBuKDExOCksIHUgPSBuKDg1KSwgcyA9IG4oNTMpLCBkID0gbigxMjEpLCBmID0gbig3NCksIGwgPSBuKDY1KSwgcCA9ICdwcm90b3R5cGUnLCBnID0gJ3NjcmlwdCcsIGIgPSBsKCdJRV9QUk9UTycpLCB2ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRvY3VtZW50LmRvbWFpbiAmJiBuZXcgQWN0aXZlWE9iamVjdCgnaHRtbGZpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCB0OwogICAgICAgICAgICAgICAgICAgICAgICB2ID0gbyA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLndyaXRlKGkoJycpKSwgZS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnBhcmVudFdpbmRvdy5PYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSA9IG51bGwsIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0obykgOiAoKHQgPSBmKCdpZnJhbWUnKSkuc3R5bGUuZGlzcGxheSA9ICdub25lJywgZC5hcHBlbmRDaGlsZCh0KSwgdC5zcmMgPSBTdHJpbmcoJ2phdmFzY3JpcHQ6JyksIChlID0gdC5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksIGUud3JpdGUoaSgnZG9jdW1lbnQuRj1PYmplY3QnKSksIGUuY2xvc2UoKSwgZS5GKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHUubGVuZ3RoOyBuLS07KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHZbcF1bdVtuXV07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2KCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHNbYl0gPSAhMCwgZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlID8gKHJbcF0gPSBhKGUpLCBuID0gbmV3IHIoKSwgcltwXSA9IG51bGwsIG5bYl0gPSBlKSA6IG4gPSB2KCksIHZvaWQgMCA9PT0gdCA/IG4gOiBjKG4sIHQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgODU6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBbCiAgICAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yJywKICAgICAgICAgICAgICAgICAgICAnaGFzT3duUHJvcGVydHknLAogICAgICAgICAgICAgICAgICAgICdpc1Byb3RvdHlwZU9mJywKICAgICAgICAgICAgICAgICAgICAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICAgICAgICAgICAgICAgICAgICd0b0xvY2FsZVN0cmluZycsCiAgICAgICAgICAgICAgICAgICAgJ3RvU3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAndmFsdWVPZicKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDg2OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDMyKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChlLCB0LCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgciAmJiByLmVudW1lcmFibGUgPyBlW3RdID0gbiA6IGkoZSwgdCwgbik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9LAogICAgICAgICAgICA4NzogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHZhciByLCBpLCBvLCBhID0gbig4OCksIGMgPSBuKDMyKSwgdSA9IG4oMjgpLCBzID0gbigyMiksIGQgPSBuKDE2KSwgZiA9IHMoJ2l0ZXJhdG9yJyksIGwgPSAhMTsKICAgICAgICAgICAgICAgIFtdLmtleXMgJiYgKCduZXh0JyBpbiAobyA9IFtdLmtleXMoKSkgPyAoaSA9IGEoYShvKSkpICE9PSBPYmplY3QucHJvdG90eXBlICYmIChyID0gaSkgOiBsID0gITApLCBudWxsID09IHIgJiYgKHIgPSB7fSksIGQgfHwgdShyLCBmKSB8fCBjKHIsIGYsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0pLCBlLmV4cG9ydHMgPSB7CiAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JQcm90b3R5cGU6IHIsCiAgICAgICAgICAgICAgICAgICAgQlVHR1lfU0FGQVJJX0lURVJBVE9SUzogbAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgODg6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMjgpLCBpID0gbig1NyksIG8gPSBuKDY1KSwgYSA9IG4oMTI0KSwgYyA9IG8oJ0lFX1BST1RPJyksIHUgPSBPYmplY3QucHJvdG90eXBlOwogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gYSA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPSBpKGUpLCByKGUsIGMpID8gZVtjXSA6ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuY29uc3RydWN0b3IgJiYgZSBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3IgPyBlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA6IGUgaW5zdGFuY2VvZiBPYmplY3QgPyB1IDogbnVsbDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDg5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdmFyIGkgPSBuKDEyOSkuY2hhckF0LCByID0gbig1NCksIG8gPSBuKDY2KSwgYSA9ICdTdHJpbmcgSXRlcmF0b3InLCBjID0gci5zZXQsIHUgPSByLmdldHRlckZvcihhKTsKICAgICAgICAgICAgICAgIG8oU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBjKHRoaXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nOiBTdHJpbmcoZSksCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiAwCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHQgPSB1KHRoaXMpLCBuID0gdC5zdHJpbmcsIHIgPSB0LmluZGV4OwogICAgICAgICAgICAgICAgICAgIHJldHVybiByID49IG4ubGVuZ3RoID8gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBkb25lOiAhMAogICAgICAgICAgICAgICAgICAgIH0gOiAoZSA9IGkobiwgciksIHQuaW5kZXggKz0gZS5sZW5ndGgsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6ICExCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgOTogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMTsgdCA8IGFyZ3VtZW50cy5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByIGluIG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sIHIpICYmIChlW3JdID0gbltyXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjLCBpLCB1ID0gbigwKSwgbyA9IG4oNSksIGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsIHMgPSBBcnJheS5wcm90b3R5cGUucHVzaCwgZCA9IHUuX21hcChvLkVWRU5UUywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSksIGYgPSBvLkVWRU5UX0lEX1BBVEhTLCBsID0gW107CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSAoYyA9IHt9LCAoaSA9IHt9KS5vbiA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGk7CiAgICAgICAgICAgICAgICAgICAgaSA9IGUsIHUuY29udGFpbnMoZCwgaSkgPyAociA9IGNbZV0gfHwgeyBxdWU6IFtdIH0sIG4gPyAocltuXSA9IHJbbl0gfHwgeyBxdWU6IFtdIH0sIHJbbl0ucXVlLnB1c2godCkpIDogci5xdWUucHVzaCh0KSwgY1tlXSA9IHIpIDogdS5sb2dFcnJvcignV3JvbmcgZXZlbnQgbmFtZSA6ICcgKyBlICsgJyBWYWxpZCBldmVudCBuYW1lcyA6JyArIGQpOwogICAgICAgICAgICAgICAgfSwgaS5lbWl0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdS5sb2dNZXNzYWdlKCdFbWl0dGluZyBldmVudCBmb3I6ICcgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0WzBdIHx8IHt9LCByID0gbltmW2VdXSwgaSA9IGNbZV0gfHwgeyBxdWU6IFtdIH0sIG8gPSB1Ll9tYXAoaSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGwucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGFwc2VkVGltZTogdS5nZXRQZXJmb3JtYW5jZU5vdygpCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByICYmIHUuY29udGFpbnMobywgcikgJiYgcy5hcHBseShhLCBpW3JdLnF1ZSksIHMuYXBwbHkoYSwgaS5xdWUpLCB1Ll9lYWNoKGEsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcGx5KG51bGwsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5sb2dFcnJvcignRXJyb3IgZXhlY3V0aW5nIGhhbmRsZXI6JywgJ2V2ZW50cy5qcycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfShlLCBhLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICAgICAgICAgICAgICB9LCBpLm9mZiA9IGZ1bmN0aW9uIChlLCBuLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBjW2VdOwogICAgICAgICAgICAgICAgICAgIHUuaXNFbXB0eShpKSB8fCB1LmlzRW1wdHkoaS5xdWUpICYmIHUuaXNFbXB0eShpW3JdKSB8fCByICYmICh1LmlzRW1wdHkoaVtyXSkgfHwgdS5pc0VtcHR5KGlbcl0ucXVlKSkgfHwgKHIgPyB1Ll9lYWNoKGlbcl0ucXVlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGlbcl0ucXVlOwogICAgICAgICAgICAgICAgICAgICAgICBlID09PSBuICYmIHQuc3BsaWNlKHQuaW5kZXhPZihlKSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSkgOiB1Ll9lYWNoKGkucXVlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGkucXVlOwogICAgICAgICAgICAgICAgICAgICAgICBlID09PSBuICYmIHQuc3BsaWNlKHQuaW5kZXhPZihlKSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGNbZV0gPSBpKTsKICAgICAgICAgICAgICAgIH0sIGkuZ2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSwgaS5nZXRFdmVudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBbXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5fZWFjaChsLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHIoe30sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2godCk7CiAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICB9LCBpKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgOTA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTUpLCBpID0gbig2MSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaShlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJ2Z1bmN0aW9uJyAhPSB0eXBlb2YgdCkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhlKSArICcgaXMgbm90IGl0ZXJhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIodC5jYWxsKGUpKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDkxOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDE1NSk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICA5MjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxCaWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpZGRlckNvZGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmlkZGVyQ29kZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgOTM6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB0LmEgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlLmxhYmVsQWxsKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxBbGw6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzOiBlLmxhYmVsQWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGFiZWxzOiB0CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxBbGw6ICExLAogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM6IGUubGFiZWxBbnksCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUxhYmVsczogdAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCB0LmMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdigxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6IGIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhdC5zaG91bGRGaWx0ZXIgfHwgISF0LnNpemVzU3VwcG9ydGVkW2VdOwogICAgICAgICAgICAgICAgfSwgdC5iID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBhcmd1bWVudHNbMF0gPyBhcmd1bWVudHNbMF0gOiB7fSwgdCA9IGUubGFiZWxzLCBuID0gdm9pZCAwID09PSB0ID8gW10gOiB0LCByID0gZS5sYWJlbEFsbCwgaSA9IHZvaWQgMCAhPT0gciAmJiByLCBvID0gZS5hY3RpdmVMYWJlbHMsIGEgPSB2b2lkIDAgPT09IG8gPyBbXSA6IG8sIGMgPSAxIDwgYXJndW1lbnRzLmxlbmd0aCA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgMCwgdSA9IDIgPCBhcmd1bWVudHMubGVuZ3RoID8gYXJndW1lbnRzWzJdIDogdm9pZCAwLCBzID0gdigzIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1szXSA/IGFyZ3VtZW50c1szXSA6IGIpOwogICAgICAgICAgICAgICAgICAgIGMgPSBPYmplY3QocC5pc1BsYWluT2JqZWN0KShjKSA/IE9iamVjdChwLmRlZXBDbG9uZSkoYykgOiB1ID8geyBiYW5uZXI6IHsgc2l6ZXM6IHUgfSB9IDoge307CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBPYmplY3QocC5kZWVwQWNjZXNzKShjLCAnYmFubmVyLnNpemVzJyk7CiAgICAgICAgICAgICAgICAgICAgcy5zaG91bGRGaWx0ZXIgJiYgZCAmJiAoYy5iYW5uZXIuc2l6ZXMgPSBkLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcy5zaXplc1N1cHBvcnRlZFtlXTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBPYmplY3Qua2V5cyhjKSwgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZTogZi5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFubmVyJyAhPT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IGYuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYmFubmVyJyA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pICYmIDAgPCBPYmplY3QocC5kZWVwQWNjZXNzKShjLCAnYmFubmVyLnNpemVzLmxlbmd0aCcpICYmICgwID09PSBuLmxlbmd0aCB8fCAhaSAmJiAobi5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMubGFiZWxzW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgbi5zb21lKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoKShhLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB8fCBpICYmIG4ucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPyBzLmxhYmVsc1t0XSB8fCBnKCkoYSwgdCkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZXM6IGMKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBkICYmIGQubGVuZ3RoICE9PSBjLmJhbm5lci5zaXplcy5sZW5ndGggJiYgKGwuZmlsdGVyUmVzdWx0cyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBkLAogICAgICAgICAgICAgICAgICAgICAgICBhZnRlcjogYy5iYW5uZXIuc2l6ZXMKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMyksIHAgPSBuKDApLCBpID0gbigxMyksIGcgPSBuLm4oaSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG8gPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBiID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5yZWR1Y2UoZnVuY3Rpb24gKG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBvKHIpICYmICdzdHJpbmcnID09IHR5cGVvZiByLm1lZGlhUXVlcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJycgPT09IHIubWVkaWFRdWVyeSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IE9iamVjdChwLmdldFdpbmRvd1RvcCkoKS5tYXRjaE1lZGlhKHIubWVkaWFRdWVyeSkubWF0Y2hlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChwLmxvZ1dhcm4pKCdVbmZyaWVuZGx5IGlGcmFtZSBibG9ja3Mgc2l6ZUNvbmZpZyBmcm9tIGJlaW5nIGNvcnJlY3RseSBldmFsdWF0ZWQnKSwgdCA9IG1hdGNoTWVkaWEoci5tZWRpYVF1ZXJ5KS5tYXRjaGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgKEFycmF5LmlzQXJyYXkoci5zaXplc1N1cHBvcnRlZCkgJiYgKG4uc2hvdWxkRmlsdGVyID0gITApLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVscycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemVzU3VwcG9ydGVkJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyW3RdIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuW3RdW2VdID0gITA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHAubG9nV2FybikoJ3NpemVDb25maWcgcnVsZSBtaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5ICJtZWRpYVF1ZXJ5IicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzU3VwcG9ydGVkOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkRmlsdGVyOiAhMQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgci5iLmdldENvbmZpZygnc2l6ZUNvbmZpZycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPSBlLnNpemVDb25maWcsIHZvaWQgKGIgPSB0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICA5NDogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIHQuYiA9IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7IHB1dHM6IGUubWFwKGMsIG4pIH07CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGkuYSkoby5iLmdldENvbmZpZygnY2FjaGUudXJsJyksIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBKU09OLnBhcnNlKGUpLnJlc3BvbnNlczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIG4oZSwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID8gbihudWxsLCB0KSA6IG4obmV3IEVycm9yKCdUaGUgY2FjaGUgc2VydmVyIGRpZG5cJ3QgcmVzcG9uZCB3aXRoIGEgcmVzcG9uc2VzIHByb3BlcnR5LicpLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihuZXcgRXJyb3IoJ0Vycm9yIHN0b3JpbmcgdmlkZW8gYWQgaW4gdGhlIGNhY2hlOiAnLmNvbmNhdChlLCAnOiAnKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCkpKSwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0odCksIEpTT04uc3RyaW5naWZ5KHIpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sIHQuYSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChvLmIuZ2V0Q29uZmlnKCdjYWNoZS51cmwnKSwgJz91dWlkPScpLmNvbmNhdChlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgaSA9IG4oNCksIG8gPSBuKDMpLCBhID0gbigwKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByLCBpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3htbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZS52YXN0WG1sID8gZS52YXN0WG1sIDogKHQgPSBlLnZhc3RVcmwsIG4gPSBlLnZhc3RJbXBVcmwsIHIgPSBuID8gJzwhW0NEQVRBWycuY29uY2F0KG4sICddXT4nKSA6ICcnLCAnPFZBU1QgdmVyc2lvbj0iMy4wIj5cbiAgICA8QWQ+XG4gICAgICA8V3JhcHBlcj5cbiAgICAgICAgPEFkU3lzdGVtPnByZWJpZC5vcmcgd3JhcHBlcjwvQWRTeXN0ZW0+XG4gICAgICAgIDxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJy5jb25jYXQodCwgJ11dPjwvVkFTVEFkVGFnVVJJPlxuICAgICAgICA8SW1wcmVzc2lvbj4nKS5jb25jYXQociwgJzwvSW1wcmVzc2lvbj5cbiAgICAgICAgPENyZWF0aXZlcz48L0NyZWF0aXZlcz5cbiAgICAgIDwvV3JhcHBlcj5cbiAgICA8L0FkPlxuICA8L1ZBU1Q+JykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsc2Vjb25kczogTnVtYmVyKGUudHRsKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvLmIuZ2V0Q29uZmlnKCdjYWNoZS52YXN0dHJhY2snKSAmJiAoaS5iaWRkZXIgPSBlLmJpZGRlciwgaS5iaWRpZCA9IGUucmVxdWVzdElkLCBhLmlzUGxhaW5PYmplY3QodGhpcykgJiYgdGhpcy5oYXNPd25Qcm9wZXJ0eSgnYXVjdGlvblN0YXJ0JykgJiYgKGkudGltZXN0YW1wID0gdGhpcy5hdWN0aW9uU3RhcnQpKSwgJ3N0cmluZycgPT0gdHlwZW9mIGUuY3VzdG9tQ2FjaGVLZXkgJiYgJycgIT09IGUuY3VzdG9tQ2FjaGVLZXkgJiYgKGkua2V5ID0gZS5jdXN0b21DYWNoZUtleSksIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDk1OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDM3NCk7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByOwogICAgICAgICAgICB9LAogICAgICAgICAgICA5ODogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIG4oOTkpOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDUyKTsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIoJ0FycmF5JywgJ2ZpbmQnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgOTk6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICB2YXIgciA9IG4oMTQpLCBpID0gbig1NikuZmluZCwgbyA9IG4oNTEpLCBhID0gbig2MCksIGMgPSAnZmluZCcsIHUgPSAhMCwgcyA9IGEoYyk7CiAgICAgICAgICAgICAgICBjIGluIFtdICYmIEFycmF5KDEpLmZpbmQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHUgPSAhMTsKICAgICAgICAgICAgICAgIH0pLCByKHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6ICdBcnJheScsCiAgICAgICAgICAgICAgICAgICAgcHJvdG86ICEwLAogICAgICAgICAgICAgICAgICAgIGZvcmNlZDogdSB8fCAhcwogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICAgIGZpbmQ6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKHRoaXMsIGUsIDEgPCBhcmd1bWVudHMubGVuZ3RoID8gdCA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSksIG8oYyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDk5ODogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4oNzApOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcGJqc0NodW5rKFszNTldLCB7CiAgICAgICAgICAgIDI3ODogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHQoMjc5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjc5OiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZChyLCAnc3BlYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHMgPSB0KDApLCBuID0gdCgxKSwgaSA9IHQoMik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBuKSAmJiAoZVtuXSA9IHRbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG8oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBwKFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Rjbj0nLAogICAgICAgICAgICAgICAgICAgICAgICAnJnBvcz0nLAogICAgICAgICAgICAgICAgICAgICAgICAnJmNtZD1iaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHAoWwogICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJy9iaWRSZXF1ZXN0PycKICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBwKFsKICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICcvcHViYXBpLzMuMC8nLAogICAgICAgICAgICAgICAgICAgICAgICAnLycsCiAgICAgICAgICAgICAgICAgICAgICAgICcvJywKICAgICAgICAgICAgICAgICAgICAgICAgJy8nLAogICAgICAgICAgICAgICAgICAgICAgICAnL0FEVEVDSDt2PTI7Y21kPWJpZDtjb3JzPXllczthbGlhcz0nLAogICAgICAgICAgICAgICAgICAgICAgICAnO21pc2M9JywKICAgICAgICAgICAgICAgICAgICAgICAgJzsnLAogICAgICAgICAgICAgICAgICAgICAgICAnJwogICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LCBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPSByIHx8IGUuc2xpY2UoMCksIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSwgeyByYXc6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUocikgfSB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQU9MOiAnYW9sJywKICAgICAgICAgICAgICAgICAgICAgICAgVkVSSVpPTjogJ3Zlcml6b24nLAogICAgICAgICAgICAgICAgICAgICAgICBPTkVNT0JJTEU6ICdvbmVtb2JpbGUnLAogICAgICAgICAgICAgICAgICAgICAgICBPTkVESVNQTEFZOiAnb25lZGlzcGxheScKICAgICAgICAgICAgICAgICAgICB9LCBtID0geyBHRVQ6ICdkaXNwbGF5LWdldCcgfSwgZiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgR0VUOiAnbW9iaWxlLWdldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBPU1Q6ICdtb2JpbGUtcG9zdCcKICAgICAgICAgICAgICAgICAgICB9LCBiID0gewogICAgICAgICAgICAgICAgICAgICAgICBUQUc6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAnaWZyYW1lJwogICAgICAgICAgICAgICAgICAgIH0sIHYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRBRzogJ2ltZycsCiAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6ICdpbWFnZScKICAgICAgICAgICAgICAgICAgICB9LCBoID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnYWRzZXJ2ZXIub3JnJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2NyaXRlby5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAnaWQ1LXN5bmMuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ludGVudGlxLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdsaXZlaW50ZW50LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICdxdWFudGNhc3QuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3Zlcml6b25tZWRpYS5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAnbGl2ZXJhbXAuY29tJwogICAgICAgICAgICAgICAgICAgIF0sIGcgPSBTKGQoKSwgJ2hvc3QnLCAnbmV0d29yaycsICdwbGFjZW1lbnQnLCAncGFnZWlkJywgJ3NpemVpZCcsICdhbGlhcycsICdtaXNjJywgJ2R5bmFtaWNQYXJhbXMnKSwgeSA9IFModSgpLCAnaG9zdCcpLCBPID0gUyhvKCksICdkY24nLCAncG9zJywgJ2R5bmFtaWNQYXJhbXMnKSwgRSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdXM6ICdhZHNlcnZlci11cy5hZHRlY2guYWR2ZXJ0aXNpbmcuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgZXU6ICdhZHNlcnZlci1ldS5hZHRlY2guYWR2ZXJ0aXNpbmcuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgYXM6ICdhZHNlcnZlci1hcy5hZHRlY2guYWR2ZXJ0aXNpbmcuY29tJwogICAgICAgICAgICAgICAgICAgIH0sIEkgPSAnaHR0cHMnLCBQID0gMTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMoYSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCB0ID0gbmV3IEFycmF5KDEgPCBlID8gZSAtIDEgOiAwKSwgciA9IDE7IHIgPCBlOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHRbciAtIDFdID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCBuID0gbmV3IEFycmF5KGUpLCByID0gMDsgciA8IGU7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBhcmd1bWVudHNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbltuLmxlbmd0aCAtIDFdIHx8IHt9LCBvID0gW2FbMF1dOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHMuaXNJbnRlZ2VyKGUpID8gbltlXSA6IGlbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2godCwgYVtyICsgMV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgby5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IGwuQU9MIHx8IGUgPT09IGwuVkVSSVpPTiB8fCBlID09PSBsLk9ORU1PQklMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChUKGUuYmlkZGVyKSAmJiBlLnBhcmFtcy5pZCAmJiBlLnBhcmFtcy5pbXAgJiYgZS5wYXJhbXMuaW1wWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wYXJhbXMuaW1wWzBdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5pZCAmJiByLnRhZ2lkICYmIChyLmJhbm5lciAmJiByLmJhbm5lci53ICYmIHIuYmFubmVyLmggfHwgci52aWRlbyAmJiByLnZpZGVvLm1pbWVzICYmIHIudmlkZW8ubWluZHVyYXRpb24gJiYgci52aWRlby5tYXhkdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQoZS5iaWRkZXIpICYmIGUucGFyYW1zLmRjbiAmJiBlLnBhcmFtcy5wb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChyID0gZS5iaWRkZXIpID09PSBsLkFPTCB8fCByID09PSBsLlZFUklaT04gfHwgciA9PT0gbC5PTkVESVNQTEFZKSAmJiBlLnBhcmFtcy5wbGFjZW1lbnQgJiYgZS5wYXJhbXMubmV0d29yazsKICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnVzZXJJZEFzRWlkcy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSBoLmluZGV4T2YoZS5zb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIE0gPSB7CiAgICAgICAgICAgICAgICAgICAgY29kZTogbC5BT0wsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDI1LAogICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgbC5PTkVNT0JJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgIGwuT05FRElTUExBWSwKICAgICAgICAgICAgICAgICAgICAgICAgbC5WRVJJWk9OCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBbaS5iXSwKICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoZSkgfHwgKFIociA9IGUpIHx8IHgocikpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcywgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciAmJiAoaS5nZHByID0gci5nZHByQ29uc2VudCwgaS51c3BDb25zZW50ID0gci51c3BDb25zZW50KSwgZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCB0ID0gUihyID0gZSkgPyBmLkdFVCA6IHgocikgPyBmLlBPU1QgOiBDKHIpID8gbS5HRVQgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5mb3JtYXRCaWRSZXF1ZXN0KHQsIGUsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdGhpcy5fcGFyc2VCaWRSZXNwb25zZSh0LCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMubG9nRXJyb3IoJ0VtcHR5IGJpZCByZXNwb25zZScsIHIuYmlkZGVyQ29kZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gIXMuaXNFbXB0eShyKSAmJiByWzBdLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHQuZXh0ICYmIHQuZXh0LnBpeGVscyA/IHRoaXMucGFyc2VQaXhlbEl0ZW1zKHQuZXh0LnBpeGVscykgOiBbXTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdEJpZFJlcXVlc3Q6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBtLkdFVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmJ1aWxkTWFya2V0cGxhY2VVcmwociwgdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDYwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZi5HRVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy5idWlsZE9uZU1vYmlsZUdldFVybChyLCB0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0bDogMzYwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGYuUE9TVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmJ1aWxkT25lTW9iaWxlQmFzZVVybChyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDM2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogdGhpcy5idWlsZE9wZW5SdGJSZXF1ZXN0RGF0YShyLCB0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUhlYWRlcnM6IHsgJ3gtb3BlbnJ0Yi12ZXJzaW9uJzogJzIuMicgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYmlkZGVyQ29kZSA9IHIuYmlkZGVyLCBuLmJpZElkID0gci5iaWRJZCwgbi51c2VyU3luY09uID0gci5wYXJhbXMudXNlclN5bmNPbiwgbjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkTWFya2V0cGxhY2VVcmw6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0gZS5wYXJhbXMsIGkgPSBuLnNlcnZlciwgbyA9IG4ucmVnaW9uIHx8ICd1cyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFLmhhc093blByb3BlcnR5KG8pIHx8IChzLmxvZ1dhcm4oJ1Vua25vd24gcmVnaW9uIFwnJy5jb25jYXQobywgJ1wnIGZvciBBT0wgYmlkZGVyLicpKSwgbyA9ICd1cycpLCB0ID0gaSB8fCBFW29dLCBuLnJlZ2lvbiA9IG8sIHRoaXMuYXBwbHlQcm90b2NvbChnKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Q6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrOiBuLm5ldHdvcmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ6IHBhcnNlSW50KG4ucGxhY2VtZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VpZDogbi5wYWdlSWQgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVpZDogbi5zaXplSWQgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBuLmFsaWFzIHx8IHMuZ2V0VW5pcXVlSWRlbnRpZmllclN0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzYzogbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUGFyYW1zOiB0aGlzLmZvcm1hdE1hcmtldHBsYWNlRHluYW1pY1BhcmFtcyhuLCByKQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZE9uZU1vYmlsZUdldFVybDogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlLnBhcmFtcywgbiA9IHQuZGNuLCBpID0gdC5wb3MsIG8gPSB0LmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IGMoZS51c2VySWQpICYmIChvID0gbyB8fCB7fSwgQShlKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvWydlaWQnICsgZS5zb3VyY2VdID0gZS51aWRzWzBdLmlkOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBzID0gdGhpcy5idWlsZE9uZU1vYmlsZUJhc2VVcmwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIGkgJiYgKGEgPSB0aGlzLmZvcm1hdE9uZU1vYmlsZUR5bmFtaWNQYXJhbXMobywgciksIHMgKz0gTyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY246IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljUGFyYW1zOiBhCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgczsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkT25lTW9iaWxlQmFzZVVybDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlQcm90b2NvbCh5KHsgaG9zdDogZS5wYXJhbXMuaG9zdCB8fCAnYzJzaGIuc3NwLnlhaG9vLmNvbScgfSkpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYXBwbHlQcm90b2NvbDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC9eaHR0cHM/OlwvXC8vaS50ZXN0KGUpID8gZSA6IDAgPT09IGUuaW5kZXhPZignLy8nKSA/ICcnLmNvbmNhdChJLCAnOicpLmNvbmNhdChlKSA6ICcnLmNvbmNhdChJLCAnOi8vJykuY29uY2F0KGUpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZm9ybWF0TWFya2V0cGxhY2VEeW5hbWljUGFyYW1zOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZSA/IGUgOiB7fSwgbiA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gciA/IHIgOiB7fSwgaSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB0LmJpZEZsb29yICYmIChpLmJpZGZsb29yID0gdC5iaWRGbG9vciksIGEoaSwgdGhpcy5mb3JtYXRLZXlWYWx1ZXModC5rZXlWYWx1ZXMpKSwgYShpLCB0aGlzLmZvcm1hdENvbnNlbnREYXRhKG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuX2VhY2goaSwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gKz0gJycuY29uY2F0KHIsICc9JykuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChlKSwgJzsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIG87CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXRPbmVNb2JpbGVEeW5hbWljUGFyYW1zOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZSA/IGUgOiB7fSwgbiA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gciA/IHIgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NlY3VyZVByb3RvY29sKCkgJiYgKHQuc2VjdXJlID0gUCksIGEodCwgdGhpcy5mb3JtYXRDb25zZW50RGF0YShuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzLl9lYWNoKHQsIGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9ICcmJy5jb25jYXQociwgJz0nKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZE9wZW5SdGJSZXF1ZXN0RGF0YTogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IHIgPyByIDoge30sIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGUucGFyYW1zLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcDogZS5wYXJhbXMuaW1wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VVQ29uc2VudFJlcXVpcmVkKG4pICYmIChzLmRlZXBTZXRWYWx1ZShpLCAncmVncy5leHQuZ2RwcicsIFApLCBuLmdkcHIuY29uc2VudFN0cmluZyAmJiBzLmRlZXBTZXRWYWx1ZShpLCAndXNlci5leHQuY29uc2VudCcsIG4uZ2Rwci5jb25zZW50U3RyaW5nKSksIG4udXNwQ29uc2VudCAmJiBzLmRlZXBTZXRWYWx1ZShpLCAncmVncy5leHQudXNfcHJpdmFjeScsIG4udXNwQ29uc2VudCksICdvYmplY3QnID09PSBjKGUudXNlcklkKSAmJiAoaS51c2VyID0gaS51c2VyIHx8IHt9LCBpLnVzZXIuZXh0ID0gaS51c2VyLmV4dCB8fCB7fSwgMCA8ICh0ID0gQShlKSkubGVuZ3RoICYmIChpLnVzZXIuZXh0LmVpZHMgPSB0KSksIGk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBpc0VVQ29uc2VudFJlcXVpcmVkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gISEoZSAmJiBlLmdkcHIgJiYgZS5nZHByLmdkcHJBcHBsaWVzKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZvcm1hdEtleVZhbHVlczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuX2VhY2goZSwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbJ2t2Jy5jb25jYXQocildID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb25zZW50RGF0YTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNFVUNvbnNlbnRSZXF1aXJlZChlKSAmJiAoci5nZHByID0gUCwgZS5nZHByLmNvbnNlbnRTdHJpbmcgJiYgKHIuZXVjb25zZW50ID0gZS5nZHByLmNvbnNlbnRTdHJpbmcpKSwgZS51c3BDb25zZW50ICYmIChyLnVzX3ByaXZhY3kgPSBlLnVzcENvbnNlbnQpLCByOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgcGFyc2VQaXhlbEl0ZW1zOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiA9IC9cdyooPz1ccykvLCBpID0gL3NyYz0oInwnKSguKj8pXDEvLCBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZSB8fCAociA9IGUubWF0Y2goLyhpbWd8aWZyYW1lKVtcc1xTXSo/c3JjXHMqPVxzKigifCcpKC4qPylcMi9naSkpICYmIHIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLm1hdGNoKG4pWzBdLCB0ID0gZS5tYXRjaChpKVsyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiYgciAmJiBvLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHIgPT09IHYuVEFHID8gdi5UWVBFIDogYi5UWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgX3BhcnNlQmlkUmVzcG9uc2U6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUuc2VhdGJpZFswXS5iaWRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5leHQgJiYgdC5leHQuZW5jcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0LmV4dC5lbmNwOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChudWxsID09PSAobiA9IHQucHJpY2UpIHx8IGlzTmFOKG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgcy5sb2dFcnJvcignSW52YWxpZCBwcmljZSBpbiBiaWQgcmVzcG9uc2UnLCBsLkFPTCwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJDb2RlOiByLmJpZGRlckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHIuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZDogdC5hZG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogdC53LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0LmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiB0LmNyaWQgfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmFwaUlkOiBlLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGUuY3VyIHx8ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbElkOiB0LmRlYWxpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldFJldmVudWU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiByLnR0bAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaXNPbmVNb2JpbGVCaWRkZXI6IFQsCiAgICAgICAgICAgICAgICAgICAgaXNTZWN1cmVQcm90b2NvbDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2h0dHBzOicgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3Qobi5yZWdpc3RlckJpZGRlcikoTSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbMjc4XSk7CiAgICAgICAgcGJqc0NodW5rKFszNTZdLCB7CiAgICAgICAgICAgIDI4ODogZnVuY3Rpb24gKGUsIHIsIGEpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IGEoMjg5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMjg5OiBmdW5jdGlvbiAoZSwgciwgYSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIGEuZChyLCAnc3BlYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIGYgPSBhKDEyKSwgXyA9IGEoMCksIGsgPSBhKDMpLCB5ID0gYSgxKSwgZyA9IGEoMiksIHAgPSBhKDIzKSwgdCA9IGEoMTApLCBJID0gYS5uKHQpLCBuID0gYSgxMyksIHcgPSBhLm4obiksIHYgPSBhKDI1KSwgaSA9IGEoNyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHMgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChiID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMTsgciA8IGFyZ3VtZW50cy5sZW5ndGg7IHIrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBhcmd1bWVudHNbcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIHQpICYmIChlW3RdID0gYVt0XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBTeW1ib2wgJiYgU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbyhlLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwgLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gYSAmJiBlLmNvbnN0cnVjdG9yICYmIChhID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdNYXAnID09PSBhIHx8ICdTZXQnID09PSBhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gYSB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChhKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKGUsIHIpOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBvKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSByIHx8IHIgPiBlLmxlbmd0aCkgJiYgKHIgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDAsIHQgPSBuZXcgQXJyYXkocik7IGEgPCByOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHRbYV0gPSBlW2FdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGQgPSAnYXBwbmV4dXMnLCB4ID0gJ2h0dHBzOi8vaWIuYWRueHMuY29tL3V0L3YzL3ByZWJpZCcsIGMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdtaW5kdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdtYXhkdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdza2lwcGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAncGxheWJhY2tfbWV0aG9kJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyYW1ld29ya3MnLAogICAgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdza2lwb2Zmc2V0JwogICAgICAgICAgICAgICAgICAgIF0sIEMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICdhZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZXJuYWxVaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2VnbWVudHMnLAogICAgICAgICAgICAgICAgICAgICAgICAnZ2VuZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZScKICAgICAgICAgICAgICAgICAgICBdLCBTID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnZ2VvJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RldmljZV9pZCcKICAgICAgICAgICAgICAgICAgICBdLCBUID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdkb25nbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAnbWVtYmVyX2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RlYnVnX3RpbWVvdXQnCiAgICAgICAgICAgICAgICAgICAgXSwgdSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfbWV0aG9kOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX29uOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX29mZjogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrX3RvX3BsYXk6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZV9vdmVyOiA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b19wbGF5X3NvdW5kX3Vua25vd246IDUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9yb2xsOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkX3JvbGw6IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3JvbGw6IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRzdHJlYW06IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW4tYmFubmVyJzogNQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgbCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogJ2Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keTI6ICdkZXNjMicsCiAgICAgICAgICAgICAgICAgICAgICAgIGN0YTogJ2N0YXRleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBpbWFnZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZTogJ21haW5faW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbXM6IHsgcmVxdWlyZWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyTmFtZTogJ2ljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbXM6IHsgcmVxdWlyZWQ6ICEwIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgc3BvbnNvcmVkQnk6ICdzcG9uc29yZWRfYnknLAogICAgICAgICAgICAgICAgICAgICAgICBwcml2YWN5TGluazogJ3ByaXZhY3lfbGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogJ3NhbGVwcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlVcmw6ICdkaXNwbGF5dXJsJwogICAgICAgICAgICAgICAgICAgIH0sIG0gPSAnPHNjcmlwdCcsIGggPSAvXC9cL2NkblwuYWRueHNcLmNvbVwvdi8sIEUgPSAndHJrLmpzJywgTyA9IE9iamVjdChpLmIpKDMyLCBkKSwgUiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogZCwKICAgICAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDMyLAogICAgICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2FwcG5leHVzQXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogMzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvZGU6ICdicmVhbHRpbWUnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2VteGRpZ2l0YWwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiAxODMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvZGU6ICdwYWdlc2NpZW5jZScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ2RlZnltZWRpYScgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ2dvdXJtZXRhZHMnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvZGU6ICdtYXRvbXknIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvZGU6ICdmZWF0dXJlZm9yd2FyZCcgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY29kZTogJ29mdG1lZGlhJyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdkaXN0cmljdG0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiAxNDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNvZGU6ICdhZGFzdGEnIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2JlaW50b28nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiA2MTgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5jCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGlzQmlkUmVxdWVzdFZhbGlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKGUucGFyYW1zLnBsYWNlbWVudElkIHx8IGUucGFyYW1zLm1lbWJlciAmJiBlLnBhcmFtcy5pbnZDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRSZXF1ZXN0czogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5tYXAoTiksIG4gPSBJKCkoZSwgTSksIGkgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwID09PSBrLmIuZ2V0Q29uZmlnKCdjb3BwYScpICYmIChpID0geyBjb3BwYTogITAgfSksIG4gJiYgT2JqZWN0LmtleXMobi5wYXJhbXMudXNlcikuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcoKShDLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgYSA9IF8uY29udmVydENhbWVsVG9VbmRlcnNjb3JlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWdtZW50cycgPT09IGUgJiYgXy5pc0FycmF5KG4ucGFyYW1zLnVzZXJbZV0pID8gKHIgPSBbXSwgbi5wYXJhbXMudXNlcltlXS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uaXNOdW1iZXIoZSkgPyByLnB1c2goeyBpZDogZSB9KSA6IF8uaXNQbGFpbk9iamVjdChlKSAmJiByLnB1c2goZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGlbYV0gPSByKSA6ICdzZWdtZW50cycgIT09IGUgJiYgKGlbYV0gPSBuLnBhcmFtcy51c2VyW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHMgPSBJKCkoZSwgQik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmIHMucGFyYW1zICYmIHMucGFyYW1zLmFwcCAmJiAoYSA9IHt9LCBPYmplY3Qua2V5cyhzLnBhcmFtcy5hcHApLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KCkoUywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbZV0gPSBzLnBhcmFtcy5hcHBbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgZCA9IEkoKShlLCBEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgJiYgZC5wYXJhbXMgJiYgcy5wYXJhbXMuYXBwICYmIHMucGFyYW1zLmFwcC5pZCAmJiAobyA9IHsgYXBwaWQ6IGQucGFyYW1zLmFwcC5pZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0ge30sIGMgPSB7fSwgdSA9IE8uZ2V0Q29va2llKCdhcG5fcHJlYmlkX2RlYnVnJykgfHwgbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBKU09OLnBhcnNlKHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sb2dFcnJvcignQXBwTmV4dXMgRGVidWcgQXVjdGlvbiBDb29raWUgRXJyb3I6XG5cbicgKyBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbCA9IEkoKShlLCBWKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICYmIGwuZGVidWcgJiYgKHAgPSBsLmRlYnVnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgJiYgcC5lbmFibGVkICYmIE9iamVjdC5rZXlzKHApLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KCkoVCwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY1tlXSA9IHBbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtLCBmLCB5ID0gSSgpKGUsIHopLCBnID0geSA/IHBhcnNlSW50KHkucGFyYW1zLm1lbWJlciwgMTApIDogMCwgdiA9IGVbMF0uc2NoYWluLCBiID0gSSgpKGUsIFcpLCBoID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdzOiBBKHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZGs6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3BianMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzQuMzYuMCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoYWluOiB2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiICYmIChoLmlhYl9zdXBwb3J0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9taWRwbjogJ0FwcG5leHVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbWlkcHY6ICc0LjM2LjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMCA8IGcgJiYgKGgubWVtYmVyX2lkID0gZyksIHMgJiYgKGguZGV2aWNlID0gYSksIGQgJiYgKGguYXBwID0gbyksIGsuYi5nZXRDb25maWcoJ2FkcG9kLmJyYW5kQ2F0ZWdvcnlFeGNsdXNpb24nKSAmJiAoaC5icmFuZF9jYXRlZ29yeV91bmlxdWVuZXNzID0gITApLCBjLmVuYWJsZWQgJiYgKGguZGVidWcgPSBjLCBfLmxvZ0luZm8oJ0FwcE5leHVzIERlYnVnIEF1Y3Rpb24gU2V0dGluZ3M6XG5cbicgKyBKU09OLnN0cmluZ2lmeShjLCBudWxsLCA0KSkpLCByICYmIHIuZ2RwckNvbnNlbnQgJiYgKGguZ2Rwcl9jb25zZW50ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRfc3RyaW5nOiByLmdkcHJDb25zZW50LmNvbnNlbnRTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudF9yZXF1aXJlZDogci5nZHByQ29uc2VudC5nZHByQXBwbGllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgJiYgci51c3BDb25zZW50ICYmIChoLnVzX3ByaXZhY3kgPSByLnVzcENvbnNlbnQpLCByICYmIHIucmVmZXJlckluZm8gJiYgKG0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRfcmVmOiBlbmNvZGVVUklDb21wb25lbnQoci5yZWZlcmVySW5mby5yZWZlcmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF90b3A6IHIucmVmZXJlckluZm8ucmVhY2hlZFRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF9pZnM6IHIucmVmZXJlckluZm8ubnVtSWZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZF9zdGs6IHIucmVmZXJlckluZm8uc3RhY2subWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBoLnJlZmVycmVyX2RldGVjdGlvbiA9IG0pLCBJKCkoZSwgSikgJiYgZS5maWx0ZXIoSikuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gci5tZWRpYVR5cGVzLnZpZGVvLCB0ID0gYS5kdXJhdGlvblJhbmdlU2VjLCBuID0gYS5yZXF1aXJlRXhhY3REdXJhdGlvbiwgaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5hZFBvZER1cmF0aW9uU2VjLCBhID0gZS5kdXJhdGlvblJhbmdlU2VjLCB0ID0gZS5yZXF1aXJlRXhhY3REdXJhdGlvbiwgbiA9IF8uZ2V0TWluVmFsdWVGcm9tQXJyYXkoYSksIGkgPSBNYXRoLmZsb29yKHIgLyBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgPyBNYXRoLm1heChpLCBhLmxlbmd0aCkgOiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oci5tZWRpYVR5cGVzLnZpZGVvKSwgcyA9IF8uZ2V0TWF4VmFsdWVGcm9tQXJyYXkodCksIG8gPSBlLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS51dWlkID09PSByLmJpZElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBkID0gXy5maWxsLmFwcGx5KF8sIEEobykuY29uY2F0KFtpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwLCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPyAocCA9IE1hdGguY2VpbChpIC8gdC5sZW5ndGgpLCBjID0gXy5jaHVuayhkLCBwKSwgdC5mb3JFYWNoKGZ1bmN0aW9uIChyLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbZV0ubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKGUsICdtaW5kdXJhdGlvbicsIHIpLCBGKGUsICdtYXhkdXJhdGlvbicsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiBkLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRihlLCAnbWF4ZHVyYXRpb24nLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQsIHIpLCBhID0gaC50YWdzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudXVpZCAhPT0gci5iaWRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC50YWdzID0gW10uY29uY2F0KEEoYSksIEEoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGVbMF0udXNlcklkICYmIChMKGYgPSBbXSwgXy5kZWVwQWNjZXNzKGVbMF0sICd1c2VySWQuY3JpdGVvSWQnKSwgJ2NyaXRlby5jb20nLCBudWxsKSwgTChmLCBfLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5uZXRJZCcpLCAnbmV0aWQuZGUnLCBudWxsKSwgTChmLCBfLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5pZGxfZW52JyksICdsaXZlcmFtcC5jb20nLCBudWxsKSwgTChmLCBfLmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC50ZGlkJyksICdhZHNlcnZlci5vcmcnLCAnVERJRCcpLCBmLmxlbmd0aCAmJiAoaC5laWRzID0gZikpLCB0WzBdLnB1Ymxpc2hlcl9pZCAmJiAoaC5wdWJsaXNoZXJfaWQgPSB0WzBdLnB1Ymxpc2hlcl9pZCksIGZ1bmN0aW9uIChlLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIGUuZ2RwckNvbnNlbnQgJiYgZS5nZHByQ29uc2VudC5nZHByQXBwbGllcyAmJiAyID09PSBlLmdkcHJDb25zZW50LmFwaVZlcnNpb24gJiYgKHIgPSAhKCEwICE9PSBfLmRlZXBBY2Nlc3MoZS5nZHByQ29uc2VudCwgJ3ZlbmRvckRhdGEucHVycG9zZS5jb25zZW50cy4xJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShhKSAmJiAobiA9IHsgd2l0aENyZWRlbnRpYWxzOiAhMSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFJVRScgIT09IF8uZ2V0UGFyYW1ldGVyQnlOYW1lKCdhcG5fdGVzdCcpLnRvVXBwZXJDYXNlKCkgJiYgITAgIT09IGsuYi5nZXRDb25maWcoJ2Fwbl90ZXN0JykgfHwgKG4uY3VzdG9tSGVhZGVycyA9IHsgJ1gtSXMtVGVzdCc6IDEgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgPCBlLnRhZ3MubGVuZ3RoID8gKGkgPSBfLmRlZXBDbG9uZShlKSwgXy5jaHVuayhlLnRhZ3MsIDE1KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnRhZ3MgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBKU09OLnN0cmluZ2lmeShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdDogYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogKHIgPSBKU09OLnN0cmluZ2lmeShlKSwgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oaCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLCBzID0gci5iaWRkZXJSZXF1ZXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBvID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAhZS5lcnJvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50YWdzICYmIGUudGFncy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhLCB0LCBuID0gKHIgPSBlKSAmJiByLmFkcyAmJiByLmFkcy5sZW5ndGggJiYgSSgpKHIuYWRzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJ0YjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIDAgIT09IG4uY3BtICYmIHcoKShpLnN1cHBvcnRlZE1lZGlhVHlwZXMsIG4uYWRfdHlwZSkgJiYgKChhID0gZnVuY3Rpb24gKHIsIGUsIGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gXy5nZXRCaWRSZXF1ZXN0KHIudXVpZCwgW2FdKSwgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiByLnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogZS5jcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IGUuY3JlYXRpdmVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxJZDogZS5kZWFsX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldFJldmVudWU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogdC5hZFVuaXRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBuZXh1czogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV5ZXJNZW1iZXJJZDogZS5idXllcl9tZW1iZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsUHJpb3JpdHk6IGUuZGVhbF9wcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxDb2RlOiBlLmRlYWxfY29kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYWR2ZXJ0aXNlcl9pZCAmJiAobi5tZXRhID0gYih7fSwgbi5tZXRhLCB7IGFkdmVydGlzZXJJZDogZS5hZHZlcnRpc2VyX2lkIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnJ0Yi52aWRlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYihuLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZS5ydGIudmlkZW8ucGxheWVyX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlLnJ0Yi52aWRlby5wbGF5ZXJfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFzdEltcFVybDogZS5ub3RpZnlfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzNjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBfLmRlZXBBY2Nlc3ModCwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLmE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gT2JqZWN0KHkuZ2V0SWFiU3ViQ2F0ZWdvcnkpKHQuYmlkZGVyLCBlLmJyYW5kX2NhdGVnb3J5X2lkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5tZXRhID0gYih7fSwgbi5tZXRhLCB7IHByaW1hcnlDYXRJZDogbyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBlLmRlYWxfcHJpb3JpdHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4udmlkZW8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBnLmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblNlY29uZHM6IE1hdGguZmxvb3IoZS5ydGIudmlkZW8uZHVyYXRpb25fbXMgLyAxMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYWxUaWVyOiBkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG4udmFzdFVybCA9IGUucnRiLnZpZGVvLmFzc2V0X3VybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSB2LmI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uYWRSZXNwb25zZSA9IHIsIG4uYWRSZXNwb25zZS5hZCA9IG4uYWRSZXNwb25zZS5hZHNbMF0sIG4uYWRSZXNwb25zZS5hZC52aWRlbyA9IG4uYWRSZXNwb25zZS5hZC5ydGIudmlkZW8sIG4udmFzdFhtbCA9IGUucnRiLnZpZGVvLmNvbnRlbnQsIGUucmVuZGVyZXJfdXJsICYmIChpID0gSSgpKGEuYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZElkID09PSByLnV1aWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBzID0gXy5kZWVwQWNjZXNzKGksICdyZW5kZXJlci5vcHRpb25zJyksIG4ucmVuZGVyZXIgPSBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IHt9LCB0ID0gZi5hLmluc3RhbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogci5yZW5kZXJlcl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiByLnJlbmRlcmVyX3VybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRDb2RlOiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0UmVuZGVyKEgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ubG9nV2FybignUHJlYmlkIEVycm9yIGNhbGxpbmcgc2V0UmVuZGVyIG9uIHJlbmRlcmVyJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5zZXRFdmVudEhhbmRsZXJzKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByZXNzaW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfLmxvZ01lc3NhZ2UoJ0FwcE5leHVzIG91dHN0cmVhbSB2aWRlbyBpbXByZXNzaW9uIGV2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8ubG9nTWVzc2FnZSgnQXBwTmV4dXMgb3V0c3RyZWFtIHZpZGVvIGxvYWRlZCBldmVudCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kZWQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5sb2dNZXNzYWdlKCdBcHBOZXh1cyBvdXRzdHJlYW0gcmVuZGVyZXIgdmlkZW8gZXZlbnQnKSwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignIycuY29uY2F0KGUpKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4uYWRVbml0Q29kZSwgZSwgcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHYuYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi52YXN0VXJsID0gZS5ub3RpZnlfdXJsICsgJyZyZWRpcj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGUucnRiLnZpZGVvLmFzc2V0X3VybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLnJ0YltnLmNdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBlLnJ0YltnLmNdLCBjID0gZS52aWV3YWJpbGl0eS5jb25maWcucmVwbGFjZSgnc3JjPScsICdkYXRhLXNyYz0nKSwgdSA9IHAuamF2YXNjcmlwdF90cmFja2VyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsID09IHUgPyB1ID0gYyA6IF8uaXNTdHIodSkgPyB1ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSA6IHUucHVzaChjKSwgbltnLmNdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcC50aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogcC5kZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5MjogcC5kZXNjMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhOiBwLmN0YXRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZzogcC5yYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb25zb3JlZEJ5OiBwLnNwb25zb3JlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmFjeUxpbms6IHAucHJpdmFjeV9saW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzOiBwLmFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkczogcC5kb3dubG9hZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2VzOiBwLmxpa2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG9uZTogcC5waG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbGVQcmljZTogcC5zYWxlcHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVXJsOiBwLmxpbmsudXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VXJsOiBwLmRpc3BsYXl1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrVHJhY2tlcnM6IHAubGluay5jbGlja190cmFja2VycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvblRyYWNrZXJzOiBwLmltcHJlc3Npb25fdHJhY2tlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFzY3JpcHRUcmFja2VyczogdQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHAubWFpbl9pbWcgJiYgKG4ubmF0aXZlLmltYWdlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHAubWFpbl9pbWcudXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHAubWFpbl9pbWcuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogcC5tYWluX2ltZy53aWR0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBwLmljb24gJiYgKG4ubmF0aXZlLmljb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcC5pY29uLnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwLmljb24uaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogcC5pY29uLndpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIobiwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogZS5ydGIuYmFubmVyLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGUucnRiLmJhbm5lci5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkOiBlLnJ0Yi5iYW5uZXIuY29udGVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsLCBtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnJ0Yi50cmFja2VycyAmJiAobCA9IGUucnRiLnRyYWNrZXJzWzBdLmltcHJlc3Npb25fdXJsc1swXSwgbSA9IF8uY3JlYXRlVHJhY2tQaXhlbEh0bWwobCksIG4uYWQgKz0gbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmxvZ0Vycm9yKCdFcnJvciBhcHBlbmRpbmcgdHJhY2tpbmcgcGl4ZWwnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCBuLCBzKSkubWVkaWFUeXBlID0gKHQgPSBuLmFkX3R5cGUpID09PSBnLmQgPyBnLmQgOiB0ID09PSBnLmMgPyBnLmMgOiBnLmIsIG8ucHVzaChhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGUuZGVidWcgJiYgZS5kZWJ1Zy5kZWJ1Z19pbmZvICYmIChhID0gKGEgPSAnQXBwTmV4dXMgRGVidWcgQXVjdGlvbiBmb3IgUHJlYmlkXG5cbicgKyBlLmRlYnVnLmRlYnVnX2luZm8pLnJlcGxhY2UoLyg8dGQ+fDx0aD4pL2dtLCAnXHQnKS5yZXBsYWNlKC8oPFwvdGQ+fDxcL3RoPikvZ20sICdcbicpLnJlcGxhY2UoL148YnI+L2dtLCAnJykucmVwbGFjZSgvKDxicj5cbnw8YnI+KS9nbSwgJ1xuJykucmVwbGFjZSgvPGgxPiguKik8XC9oMT4vZ20sICdcblxuPT09PT0gJDEgPT09PT1cblxuJykucmVwbGFjZSgvPGhbMi02XT4oLiopPFwvaFsyLTZdPi9nbSwgJ1xuXG4qKiogJDEgKioqXG5cbicpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2dpbSwgJycpLCBfLmxvZ01lc3NhZ2UoJ2h0dHBzOi8vY29uc29sZS5hcHBuZXh1cy5jb20vZG9jcy91bmRlcnN0YW5kaW5nLXRoZS1kZWJ1Zy1hdWN0aW9uJyksIF8ubG9nTWVzc2FnZShhKSksIG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICdpbiByZXNwb25zZSBmb3IgJy5jb25jYXQocy5iaWRkZXJDb2RlLCAnIGFkYXB0ZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUuZXJyb3IgJiYgKHQgKz0gJzogJy5jb25jYXQoZS5lcnJvcikpLCBfLmxvZ0Vycm9yKHQpLCBvOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRNYXBwaW5nRmlsZUluZm86IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hY2RuLmFkbnhzLmNvbS9wcmViaWQvYXBwbmV4dXMtbWFwcGluZy9tYXBwaW5ncy5qc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoSW5EYXlzOiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5pZnJhbWVFbmFibGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2lmcmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2FjZG4uYWRueHMuY29tL2RtcC9hc3luY191c2Vyc3luYy5odG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtQmlkUGFyYW1zOiBmdW5jdGlvbiAoYSwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgPSBfLmNvbnZlcnRUeXBlcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZDb2RlOiAnc3RyaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnRJZDogJ251bWJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHM6IF8udHJhbnNmb3JtQmlkZGVyUGFyYW1LZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJJZDogJ251bWJlcicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGEpLCBlICYmIChhLnVzZV9wbXRfcnVsZSA9ICdib29sZWFuJyA9PSB0eXBlb2YgYS51c2VQYXltZW50UnVsZSAmJiBhLnVzZVBheW1lbnRSdWxlLCBhLnVzZVBheW1lbnRSdWxlICYmIGRlbGV0ZSBhLnVzZVBheW1lbnRSdWxlLCBqKGEua2V5d29yZHMpICYmIGEua2V5d29yZHMuZm9yRWFjaChQKSwgT2JqZWN0LmtleXMoYSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gXy5jb252ZXJ0Q2FtZWxUb1VuZGVyc2NvcmUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAhPT0gZSAmJiAoYVtyXSA9IGFbZV0sIGRlbGV0ZSBhW2VdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgYTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb25CaWRXb246IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5hdGl2ZSAmJiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmlzU3RyKGUpICYmIFUoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoXy5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBlW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUodCkgJiYgKHIgPSB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLm5hdGl2ZS5qYXZhc2NyaXB0VHJhY2tlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gJ3BianNfYWRpZD0nICsgZS5hZElkICsgJztwYmpzX2F1Yz0nICsgZS5hZFVuaXRDb2RlLCB0ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmluZGV4T2YoJ3NyYz0iJykgKyA1LCBhID0gZS5pbmRleE9mKCciJywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN1YnN0cmluZyhyLCBhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHIpLCBuID0gdC5yZXBsYWNlKCdkb21faWQ9JW5hdGl2ZV9kb21faWQlJywgYSksIGkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaWZyYW1lJyksIHMgPSAhMSwgbyA9IDA7IG8gPCBpLmxlbmd0aCAmJiAhczsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGlbb107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZC5jb250ZW50RG9jdW1lbnQgfHwgZC5jb250ZW50V2luZG93LmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gcC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JyksIHUgPSAwOyB1IDwgYy5sZW5ndGggJiYgIXM7IHUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBjW3VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjJykgPT0gdCAmJiAobC5zZXRBdHRyaWJ1dGUoJ3NyYycsIG4pLCBsLnNldEF0dHJpYnV0ZSgnZGF0YS1zcmMnLCAnJyksIGwucmVtb3ZlQXR0cmlidXRlICYmIGwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXNyYycpLCBzID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiAnU2VjdXJpdHlFcnJvcicgPT09IGUubmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8uaXNBcnJheShlKSAmJiAwIDwgZS5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUpIHsKICAgICAgICAgICAgICAgICAgICBqKGUudmFsdWUpICYmICcnID09PSBlLnZhbHVlWzBdICYmIGRlbGV0ZSBlLnZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLm1hdGNoKGgpLCBhID0gbnVsbCAhPSByICYmIDEgPD0gci5sZW5ndGgsIHQgPSBlLm1hdGNoKEUpLCBuID0gbnVsbCAhPSB0ICYmIDEgPD0gdC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3RhcnRzV2l0aChtKSAmJiBuICYmIGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSwgciwgbiwgaSwgdCA9IHt9OwogICAgICAgICAgICAgICAgICAgIHQuc2l6ZXMgPSBxKGEuc2l6ZXMpLCB0LnByaW1hcnlfc2l6ZSA9IHQuc2l6ZXNbMF0sIHQuYWRfdHlwZXMgPSBbXSwgdC51dWlkID0gYS5iaWRJZCwgYS5wYXJhbXMucGxhY2VtZW50SWQgPyB0LmlkID0gcGFyc2VJbnQoYS5wYXJhbXMucGxhY2VtZW50SWQsIDEwKSA6IHQuY29kZSA9IGEucGFyYW1zLmludkNvZGUsIHQuYWxsb3dfc21hbGxlcl9zaXplcyA9IGEucGFyYW1zLmFsbG93U21hbGxlclNpemVzIHx8ICExLCB0LnVzZV9wbXRfcnVsZSA9IGEucGFyYW1zLnVzZVBheW1lbnRSdWxlIHx8ICExLCB0LnByZWJpZCA9ICEwLCB0LmRpc2FibGVfcHNhID0gITAsIGEucGFyYW1zLnJlc2VydmUgJiYgKHQucmVzZXJ2ZSA9IGEucGFyYW1zLnJlc2VydmUpLCBhLnBhcmFtcy5wb3NpdGlvbiAmJiAodC5wb3NpdGlvbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93OiAyCiAgICAgICAgICAgICAgICAgICAgfVthLnBhcmFtcy5wb3NpdGlvbl0gfHwgMCksIGEucGFyYW1zLnRyYWZmaWNTb3VyY2VDb2RlICYmICh0LnRyYWZmaWNfc291cmNlX2NvZGUgPSBhLnBhcmFtcy50cmFmZmljU291cmNlQ29kZSksIGEucGFyYW1zLnByaXZhdGVTaXplcyAmJiAodC5wcml2YXRlX3NpemVzID0gcShhLnBhcmFtcy5wcml2YXRlU2l6ZXMpKSwgYS5wYXJhbXMuc3VwcGx5VHlwZSAmJiAodC5zdXBwbHlfdHlwZSA9IGEucGFyYW1zLnN1cHBseVR5cGUpLCBhLnBhcmFtcy5wdWJDbGljayAmJiAodC5wdWJjbGljayA9IGEucGFyYW1zLnB1YkNsaWNrKSwgYS5wYXJhbXMuZXh0SW52Q29kZSAmJiAodC5leHRfaW52X2NvZGUgPSBhLnBhcmFtcy5leHRJbnZDb2RlKSwgYS5wYXJhbXMucHVibGlzaGVySWQgJiYgKHQucHVibGlzaGVyX2lkID0gcGFyc2VJbnQoYS5wYXJhbXMucHVibGlzaGVySWQsIDEwKSksIGEucGFyYW1zLmV4dGVybmFsSW1wSWQgJiYgKHQuZXh0ZXJuYWxfaW1wX2lkID0gYS5wYXJhbXMuZXh0ZXJuYWxJbXBJZCksIF8uaXNFbXB0eShhLnBhcmFtcy5rZXl3b3JkcykgfHwgKDAgPCAoZSA9IF8udHJhbnNmb3JtQmlkZGVyUGFyYW1LZXl3b3JkcyhhLnBhcmFtcy5rZXl3b3JkcykpLmxlbmd0aCAmJiBlLmZvckVhY2goUCksIHQua2V5d29yZHMgPSBlKSwgYS5tZWRpYVR5cGUgIT09IGcuYyAmJiAhXy5kZWVwQWNjZXNzKGEsICdtZWRpYVR5cGVzLicuY29uY2F0KGcuYykpIHx8ICh0LmFkX3R5cGVzLnB1c2goZy5jKSwgMCA9PT0gdC5zaXplcy5sZW5ndGggJiYgKHQuc2l6ZXMgPSBxKFsKICAgICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgIF0pKSwgYS5uYXRpdmVQYXJhbXMgJiYgKG4gPSBhLm5hdGl2ZVBhcmFtcywgaSA9IHt9LCBPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhID0gbFtlXSAmJiBsW2VdLnNlcnZlck5hbWUgfHwgbFtlXSB8fCBlLCB0ID0gbFtlXSAmJiBsW2VdLnJlcXVpcmVkUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICBpW2FdID0gYih7fSwgdCwgbltlXSksIGEgIT09IGwuaW1hZ2Uuc2VydmVyTmFtZSAmJiBhICE9PSBsLmljb24uc2VydmVyTmFtZSB8fCAhaVthXS5zaXplcyB8fCAociA9IGlbYV0uc2l6ZXMsIChfLmlzQXJyYXlPZk51bXMocikgfHwgXy5pc0FycmF5KHIpICYmIDAgPCByLmxlbmd0aCAmJiByLmV2ZXJ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXy5pc0FycmF5T2ZOdW1zKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgJiYgKGlbYV0uc2l6ZXMgPSBxKGlbYV0uc2l6ZXMpKSksIGEgPT09IGwucHJpdmFjeUxpbmsgJiYgKGkucHJpdmFjeV9zdXBwb3J0ZWQgPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgfSksIHIgPSBpLCB0W2cuY10gPSB7IGxheW91dHM6IFtyXSB9KSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBfLmRlZXBBY2Nlc3MoYSwgJ21lZGlhVHlwZXMuJy5jb25jYXQoZy5kKSksIG8gPSBfLmRlZXBBY2Nlc3MoYSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpOwogICAgICAgICAgICAgICAgICAgIHQuaGJfc291cmNlID0gcyAmJiAnYWRwb2QnID09PSBvID8gNyA6IDEsIGEubWVkaWFUeXBlICE9PSBnLmQgJiYgIXMgfHwgdC5hZF90eXBlcy5wdXNoKGcuZCksIChhLm1lZGlhVHlwZSA9PT0gZy5kIHx8IHMgJiYgJ291dHN0cmVhbScgIT09IG8pICYmICh0LnJlcXVpcmVfYXNzZXRfdXJsID0gITApLCBhLnBhcmFtcy52aWRlbyAmJiAodC52aWRlbyA9IHt9LCBPYmplY3Qua2V5cyhhLnBhcmFtcy52aWRlbykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3KCkoYywgZSk7CiAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29udGV4dCc6CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXliYWNrX21ldGhvZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGEucGFyYW1zLnZpZGVvW2VdLCByID0gXy5pc0FycmF5KHIpID8gclswXSA6IHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnZpZGVvW2VdID0gdVtlXVtyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdmcmFtZXdvcmtzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC52aWRlb1tlXSA9IGEucGFyYW1zLnZpZGVvW2VdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSksIGEucGFyYW1zLnZpZGVvLmZyYW1ld29ya3MgJiYgXy5pc0FycmF5KGEucGFyYW1zLnZpZGVvLmZyYW1ld29ya3MpICYmICh0LnZpZGVvX2ZyYW1ld29ya3MgPSBhLnBhcmFtcy52aWRlby5mcmFtZXdvcmtzKSksIGEucmVuZGVyZXIgJiYgKHQudmlkZW8gPSBiKHt9LCB0LnZpZGVvLCB7IGN1c3RvbV9yZW5kZXJlcl9wcmVzZW50OiAhMCB9KSksIGEucGFyYW1zLmZyYW1ld29ya3MgJiYgXy5pc0FycmF5KGEucGFyYW1zLmZyYW1ld29ya3MpICYmICh0LmJhbm5lcl9mcmFtZXdvcmtzID0gYS5wYXJhbXMuZnJhbWV3b3Jrcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBJKCkocC5hLmdldEFkVW5pdHMoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEudHJhbnNhY3Rpb25JZCA9PT0gZS50cmFuc2FjdGlvbklkOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkICYmIGQubWVkaWFUeXBlcyAmJiBkLm1lZGlhVHlwZXMuYmFubmVyICYmIHQuYWRfdHlwZXMucHVzaChnLmIpLCAwID09PSB0LmFkX3R5cGVzLmxlbmd0aCAmJiBkZWxldGUgdC5hZF90eXBlcywgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAoXy5pc0FycmF5KGUpICYmIDIgPT09IGUubGVuZ3RoICYmICFfLmlzQXJyYXkoZVswXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGEud2lkdGggPSBwYXJzZUludChlWzBdLCAxMCksIGEuaGVpZ2h0ID0gcGFyc2VJbnQoZVsxXSwgMTApLCByLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ29iamVjdCcgPT09IHMoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPSB7fSkud2lkdGggPSBwYXJzZUludChuWzBdLCAxMCksIGEuaGVpZ2h0ID0gcGFyc2VJbnQoblsxXSwgMTApLCByLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUucGFyYW1zLnVzZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFwYXJzZUludChlLnBhcmFtcy5tZW1iZXIsIDEwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEIoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlLnBhcmFtcykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZS5wYXJhbXMuYXBwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zICYmIGUucGFyYW1zLmFwcCA/ICEhZS5wYXJhbXMuYXBwLmlkIDogISFlLnBhcmFtcy5hcHA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlLmRlYnVnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWVkaWFUeXBlcyAmJiBlLm1lZGlhVHlwZXMudmlkZW8gJiYgZS5tZWRpYVR5cGVzLnZpZGVvLmNvbnRleHQgPT09IGcuYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFcoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gITEsIGEgPSBlLnBhcmFtcywgdCA9IGUucGFyYW1zLnZpZGVvOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmZyYW1ld29ya3MgJiYgXy5pc0FycmF5KGEuZnJhbWV3b3JrcykgJiYgKHIgPSB3KCkoZS5wYXJhbXMuZnJhbWV3b3JrcywgNikpLCAhciAmJiB0ICYmIHQuZnJhbWV3b3JrcyAmJiBfLmlzQXJyYXkodC5mcmFtZXdvcmtzKSAmJiAociA9IHcoKShlLnBhcmFtcy52aWRlby5mcmFtZXdvcmtzLCA2KSksIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUsIHIsIGEpIHsKICAgICAgICAgICAgICAgICAgICBfLmlzRW1wdHkoZS52aWRlbykgJiYgKGUudmlkZW8gPSB7fSksIGUudmlkZW9bcl0gPSBhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGE7CiAgICAgICAgICAgICAgICAgICAgciA9IGUuYWRVbml0Q29kZSwgKGEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChyKS5xdWVyeVNlbGVjdG9yQWxsKCdkaXZbaWRePVwnZ29vZ2xlX2Fkc1wnXScpKVswXSAmJiBhWzBdLnN0eWxlLnNldFByb3BlcnR5KCdkaXNwbGF5JywgJ25vbmUnKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZSkucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0W2lkXj1cJ3Nhc19zY3JpcHRcJ10nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJbMF0ubmV4dFNpYmxpbmcgJiYgJ2lmcmFtZScgPT09IHJbMF0ubmV4dFNpYmxpbmcubG9jYWxOYW1lICYmIHJbMF0ubmV4dFNpYmxpbmcuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KGUuYWRVbml0Q29kZSksIGUucmVuZGVyZXIucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5BTk91dHN0cmVhbVZpZGVvLnJlbmRlckFkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0lkOiBlLmFkUmVzcG9uc2UudGFnX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZXM6IFtlLmdldFNpemUoKS5zcGxpdCgneCcpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElkOiBlLmFkVW5pdENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiBlLmFkUmVzcG9uc2UudXVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkUmVzcG9uc2U6IGUuYWRSZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyT3B0aW9uczogZS5yZW5kZXJlci5nZXRDb25maWcoKQogICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSwgciwgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5yZW5kZXJlci5oYW5kbGVWaWRlb0V2ZW50KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWU6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LmJpbmQobnVsbCwgZSkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTChlLCByLCBhLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgKHQgPyBlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByLAogICAgICAgICAgICAgICAgICAgICAgICBydGlfcGFydG5lcjogdAogICAgICAgICAgICAgICAgICAgIH0pIDogZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBhLAogICAgICAgICAgICAgICAgICAgICAgICBpZDogcgogICAgICAgICAgICAgICAgICAgIH0pKSwgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdCh5LnJlZ2lzdGVyQmlkZGVyKShSKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFsyODhdKTsKICAgICAgICBwYmpzQ2h1bmsoWzMzNl0sIHsKICAgICAgICAgICAgMzMyOiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCgzMzMpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAzMzM6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKHIsICdicml0ZXBvb2xJZFN1Ym1vZHVsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIGMgPSB0KDApLCBzID0gdCg0KSwgbyA9IHQoMTEpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAocCA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDE7IHIgPCBhcmd1bWVudHMubGVuZ3RoOyByKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYXJndW1lbnRzW3JdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbyBpbiB0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBvKSAmJiAoZVtvXSA9IHRbb10pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZiA9IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAnYnJpdGVwb29sSWQnLAogICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ3N0cmluZycgPT0gdHlwZW9mIGUucHJpbWFyeUJQSUQgPyB7IGJyaXRlcG9vbGlkOiBlLnByaW1hcnlCUElEIH0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZSAmJiBlLnBhcmFtcyB8fCB7fSwgbyA9IGYuY3JlYXRlUGFyYW1zKHQsIHIpLCBuID0gby5wYXJhbXMsIGkgPSBvLmhlYWRlcnMsIGEgPSBvLnVybCwgdSA9IG8uZ2V0dGVyLCBwID0gby5lcnJvcnMsIGwgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgdSAmJiAnZnVuY3Rpb24nICE9IHR5cGVvZiAobCA9IHUobikpID8geyBpZDogZi5ub3JtYWxpemVWYWx1ZShsKSB9IDogKGMuaXNFbXB0eShuKSAmJiBjLnRyaWdnZXJQaXhlbCgnaHR0cHM6Ly9weC5icml0ZXBvb2wuY29tL25ldz9wYXJ0bmVyX2lkPXQnKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBwLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB2b2lkIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0KGYubm9ybWFsaXplVmFsdWUoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnICE9PSBlICYmIGMubG9nRXJyb3IoZSksIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KHMuYSkoYSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGYubm9ybWFsaXplVmFsdWUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdChyID8geyBwcmltYXJ5QlBJRDogci5wcmltYXJ5QlBJRCB9IDogbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycgIT09IGUgJiYgYy5sb2dFcnJvcihlKSwgdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBKU09OLnN0cmluZ2lmeShuKSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSGVhZGVyczogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY3JlYXRlUGFyYW1zOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHIgJiYgJ2Jvb2xlYW4nID09IHR5cGVvZiByLmdkcHJBcHBsaWVzICYmIHIuZ2RwckFwcGxpZXMgPyByLmNvbnNlbnRTdHJpbmcgOiB2b2lkIDAsIG8gPSBbXSwgbiA9IHt9LCBpID0gcCh7fSwgZSwgJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGJyaXRlcG9vbF9wdWJwYXJhbXMgPyBicml0ZXBvb2xfcHVicGFyYW1zIDoge30pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaS5nZXR0ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nICE9IHR5cGVvZiBpLmdldHRlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gby5wdXNoKCd1c2VySWRUYXJnZXRpbmcgLSBicml0ZXBvb2xJZCBzdWJtb2R1bGUgcmVxdWlyZXMgZ2V0dGVyIHRvIGJlIGEgZnVuY3Rpb24nKSwgeyBlcnJvcnM6IG8gfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLmFwaV9rZXkgJiYgKG5bJ3gtYXBpLWtleSddID0gaS5hcGlfa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBpLnVybCB8fCAnaHR0cHM6Ly9hcGkuYnJpdGVwb29sLmNvbS92MS9icml0ZXBvb2wvaWQnLmNvbmNhdCh0ID8gJz9nZHByU3RyaW5nPScgKyBlbmNvZGVVUklDb21wb25lbnQodCkgOiAnJyksIHUgPSBpLmdldHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZSBpLmFwaV9rZXksIGRlbGV0ZSBpLnVybCwgZGVsZXRlIGkuZ2V0dGVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVyOiB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBvCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVWYWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IG4oZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3Qoby5lKSgndXNlcklkJywgZik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbMzMyXSk7CiAgICAgICAgcGJqc0NodW5rKFszMThdLCB7CiAgICAgICAgICAgIDM3MjogZnVuY3Rpb24gKG4sIHQsIGUpIHsKICAgICAgICAgICAgICAgIG4uZXhwb3J0cyA9IGUoMzczKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzczOiBmdW5jdGlvbiAobiwgdCwgZSkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIGUuZCh0LCAnYWxsb3dBdWN0aW9uJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB3OwogICAgICAgICAgICAgICAgfSksIGUuZCh0LCAndXNlckNNUCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDsKICAgICAgICAgICAgICAgIH0pLCBlLmQodCwgJ2NvbnNlbnRUaW1lb3V0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSksIGUuZCh0LCAnZ2RwclNjb3BlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICAgICAgICAgfSksIGUuZCh0LCAnc3RhdGljQ29uc2VudERhdGEnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICB9KSwgdC5yZXF1ZXN0Qmlkc0hvb2sgPSBoLCB0LnJlc2V0Q29uc2VudERhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgQyA9IHZvaWQgMCwgZCA9IHZvaWQgMCwgRCA9IDAsIGEuZ2RwckRhdGFIYW5kbGVyLnNldENvbnNlbnREYXRhKG51bGwpOwogICAgICAgICAgICAgICAgfSwgdC5zZXRDb25zZW50Q29uZmlnID0gXzsKICAgICAgICAgICAgICAgIHZhciB1ID0gZSgwKSwgbyA9IGUoMyksIGEgPSBlKDgpLCBpID0gZSgxMyksIHMgPSBlLm4oaSksIHIgPSBlKDk1KSwgZiA9IGUubihyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMobikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYyA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBuOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgbi5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG4gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBuOwogICAgICAgICAgICAgICAgICAgIH0pKG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChuLCB0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQgaW4gbiA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCB0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlLAogICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkgOiBuW3RdID0gZSwgbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBkLCBsLCBnLCBtLCBDLCB2ID0gJ2lhYicsIGIgPSAxMDAwMCwgeSA9ICEwLCB3ID0gewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogeSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZEluQ29uZmlnOiAhMQogICAgICAgICAgICAgICAgICAgIH0sIEQgPSAwLCBrID0gITEsIE0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlhYjogZnVuY3Rpb24gKG8sIGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG4obiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUubG9nSW5mbygnUmVjZWl2ZWQgYSByZXNwb25zZSBmcm9tIENNUCcsIG4pLCB0ID8gITEgIT09IG4uZ2RwckFwcGxpZXMgJiYgJ3RjbG9hZGVkJyAhPT0gbi5ldmVudFN0YXR1cyAmJiAndXNlcmFjdGlvbmNvbXBsZXRlJyAhPT0gbi5ldmVudFN0YXR1cyB8fCBvKG4sIHMpIDogZSgnQ01QIHVuYWJsZSB0byByZWdpc3RlciBjYWxsYmFjayBmdW5jdGlvbi4gIFBsZWFzZSBjaGVjayBDTVAgc2V0dXAuJywgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuZ2V0Q29uc2VudERhdGEgJiYgdC5nZXRWZW5kb3JDb25zZW50cyAmJiAodS5sb2dJbmZvKCdSZWNlaXZlZCBhbGwgcmVxdWVzdGVkIHJlc3BvbnNlcyBmcm9tIENNUCcsIHQpLCBvKHQsIHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudERhdGFDYWxsYmFjazogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENvbnNlbnREYXRhID0gbiwgZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckNvbnNlbnRzQ2FsbGJhY2s6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRWZW5kb3JDb25zZW50cyA9IG4sIGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIGMgPSB7fSwgYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgdCwgZSA9IHdpbmRvdzsgIW47KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBlLl9fdGNmYXBpIHx8ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuX19jbXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIGUuX190Y2ZhcGkgPyAoRCA9IDIsIGUuX190Y2ZhcGkpIDogKEQgPSAxLCBlLl9fY21wKSwgbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZnJhbWVzLl9fdGNmYXBpTG9jYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEID0gMiwgbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuZnJhbWVzLl9fY21wTG9jYXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEID0gMSwgbiA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlID09PSB3aW5kb3cudG9wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUucGFyZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBGcmFtZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtcEZ1bmN0aW9uOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLCBpID0gYS5jbXBGcmFtZSwgciA9IGEuY21wRnVuY3Rpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUoJ0NNUCBub3QgZm91bmQuJywgcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmlzRm4ocikgPyAodS5sb2dJbmZvKCdEZXRlY3RlZCBDTVAgQVBJIGlzIGRpcmVjdGx5IGFjY2Vzc2libGUsIGNhbGxpbmcgaXQgbm93Li4uJyksIDEgPT09IEQgPyAocignZ2V0Q29uc2VudERhdGEnLCBudWxsLCB0LmNvbnNlbnREYXRhQ2FsbGJhY2spLCByKCdnZXRWZW5kb3JDb25zZW50cycsIG51bGwsIHQudmVuZG9yQ29uc2VudHNDYWxsYmFjaykpIDogMiA9PT0gRCAmJiByKCdhZGRFdmVudExpc3RlbmVyJywgRCwgbikpIDogMSA9PT0gRCAmJiB3aW5kb3cuJHNmICYmIHdpbmRvdy4kc2YuZXh0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHdpbmRvdy4kc2YuZXh0LmNtcCA/ICh1LmxvZ0luZm8oJ0RldGVjdGVkIFByZWJpZC5qcyBpcyBlbmNhc2VkIGluIGEgU2FmZUZyYW1lIGFuZCBDTVAgaXMgcmVnaXN0ZXJlZCwgY2FsbGluZyBpdCBub3cuLi4nKSwgZCgnZ2V0Q29uc2VudERhdGEnLCB0LmNvbnNlbnREYXRhQ2FsbGJhY2spLCBkKCdnZXRWZW5kb3JDb25zZW50cycsIHQudmVuZG9yQ29uc2VudHNDYWxsYmFjaykpIDogKHUubG9nSW5mbygnRGV0ZWN0ZWQgQ01QIGlzIG91dHNpZGUgdGhlIGN1cnJlbnQgaWZyYW1lIHdoZXJlIFByZWJpZC5qcyBpcyBsb2NhdGVkLCBjYWxsaW5nIGl0IG5vdy4uLicpLCAxID09PSBEID8gKGwoJ2dldENvbnNlbnREYXRhJywgaSwgdC5jb25zZW50RGF0YUNhbGxiYWNrKSwgbCgnZ2V0VmVuZG9yQ29uc2VudHMnLCBpLCB0LnZlbmRvckNvbnNlbnRzQ2FsbGJhY2spKSA6IDIgPT09IEQgJiYgbCgnYWRkRXZlbnRMaXN0ZW5lcicsIGksIG4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGQobywgYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0ID0gcy5hZFVuaXRzLCBlID0gMSwgaSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0KSAmJiAwIDwgdC5sZW5ndGggJiYgKGUgPSAobiA9IHUuZ2V0QWRVbml0U2l6ZXModFswXSkpWzBdWzBdLCBpID0gblswXVsxXSksIHdpbmRvdy4kc2YuZXh0LnJlZ2lzdGVyKGUsIGksIGZ1bmN0aW9uIChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY21wUmV0dXJuJyA9PT0gbiAmJiAoZSA9ICdnZXRDb25zZW50RGF0YScgPT09IG8gPyB0LnZlbmRvckNvbnNlbnREYXRhIDogdC52ZW5kb3JDb25zZW50cywgYShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHdpbmRvdy4kc2YuZXh0LmNtcChvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwobiwgaSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gMiA9PT0gRCA/ICdfX3RjZmFwaScgOiAnX19jbXAnLCBzID0gTWF0aC5yYW5kb20oKSArICcnLCByID0gJycuY29uY2F0KGEsICdDYWxsJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBlID0gJycuY29uY2F0KGEsICdSZXR1cm4nKSwgbyA9ICdzdHJpbmcnID09IHR5cGVvZiBuLmRhdGEgJiYgZigpKG4uZGF0YSwgZSkgPyBKU09OLnBhcnNlKG4uZGF0YSkgOiBuLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bZV0gJiYgb1tlXS5jYWxsSWQgJiYgKHQgPSBvW2VdLCB2b2lkIDAgIT09IGNbdC5jYWxsSWRdICYmIGNbdC5jYWxsSWRdKHQucmV0dXJuVmFsdWUsIHQuc3VjY2VzcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID09PSBEID8gKHdpbmRvd1thXSA9IGZ1bmN0aW9uIChuLCB0LCBlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gcCh7fSwgciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb246IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXI6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsSWQ6IHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNbc10gPSBlLCBpLnBvc3RNZXNzYWdlKGEsICcqJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBlLCAhMSksIHdpbmRvd1thXShuLCBELCB0KSkgOiAod2luZG93W2FdID0gZnVuY3Rpb24gKG4sIHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBwKHt9LCByLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjW3NdID0gZSwgaS5wb3N0TWVzc2FnZShvLCAnKicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZSwgITEpLCB3aW5kb3dbYV0obiwgdm9pZCAwLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYzogZnVuY3Rpb24gKG4sIHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4obSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaChuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFt0XSwKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZuOiBuLAogICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiB0LmFkVW5pdHMgfHwgcGJqcy5hZFVuaXRzLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRzQmFja0hhbmRsZXI6IHQuYmlkc0JhY2tIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICBoYXZlRXhpdGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXI6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBDID8gKHUubG9nSW5mbygnVXNlciBjb25zZW50IGluZm9ybWF0aW9uIGFscmVhZHkga25vd24uICBQdWxsaW5nIGludGVybmFsbHkgc3RvcmVkIGluZm9ybWF0aW9uLi4uJyksIFMobnVsbCwgZSkpIDogcygpKE9iamVjdC5rZXlzKE0pLCBkKSA/IChNW2RdLmNhbGwodGhpcywgQSwgUCwgZSksIHZvaWQgKGUuaGF2ZUV4aXRlZCB8fCAoMCA9PT0gbCA/IEEodm9pZCAwLCBlKSA6IGUudGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFAoJ0NNUCB3b3JrZmxvdyBleGNlZWRlZCB0aW1lb3V0IHRocmVzaG9sZC4nLCBuKTsKICAgICAgICAgICAgICAgICAgICB9LmJpbmQobnVsbCwgZSksIGwpKSkpIDogKHUubG9nV2FybignQ01QIGZyYW1ld29yayAoJy5jb25jYXQoZCwgJykgaXMgbm90IGEgc3VwcG9ydGVkIGZyYW1ld29yay4gIEFib3J0aW5nIGNvbnNlbnRNYW5hZ2VtZW50IG1vZHVsZSBhbmQgcmVzdW1pbmcgYXVjdGlvbi4nKSksIGUubmV4dEZuLmFwcGx5KGUuY29udGV4dCwgZS5hcmdzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAnc3RhdGljJyA9PT0gZCAmJiAyID09PSAoRCA9IGUuZ2V0Q29uc2VudERhdGEgPyAxIDogZS5nZXRUQ0RhdGEgPyAyIDogMCkgJiYgKGUgPSBlLmdldFRDRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAxID09PSBEID8gZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuICYmIG4uZ2V0Q29uc2VudERhdGEgJiYgbi5nZXRDb25zZW50RGF0YS5nZHByQXBwbGllczsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ2Jvb2xlYW4nID09IHR5cGVvZiB0ICYmICghMCAhPT0gdCB8fCB1LmlzU3RyKG4uZ2V0Q29uc2VudERhdGEuY29uc2VudERhdGEpICYmIHUuaXNQbGFpbk9iamVjdChuLmdldFZlbmRvckNvbnNlbnRzKSAmJiAxIDwgT2JqZWN0LmtleXMobi5nZXRWZW5kb3JDb25zZW50cykubGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAgICAgfSA6IDIgPT09IEQgPyBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSAmJiAnYm9vbGVhbicgPT0gdHlwZW9mIGUuZ2RwckFwcGxpZXMgPyBlLmdkcHJBcHBsaWVzIDogZywgdCA9IGUgJiYgZS50Y1N0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ2Jvb2xlYW4nID09IHR5cGVvZiBuICYmICghMCAhPT0gbiB8fCB1LmlzU3RyKHQpKSk7CiAgICAgICAgICAgICAgICAgICAgfSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdy5kZWZpbmVkSW5Db25maWcgJiYgMiA9PT0gRCA/IHUubG9nV2FybignXCdhbGxvd0F1Y3Rpb25XaXRob3V0Q29uc2VudFwnIGlnbm9yZWQgZm9yIFRDRiAyJykgOiB3LmRlZmluZWRJbkNvbmZpZyB8fCAxICE9PSBEIHx8IHUubG9nSW5mbygnXCdhbGxvd0F1Y3Rpb25XaXRob3V0Q29uc2VudFwnIHVzaW5nIHN5c3RlbSBkZWZhdWx0OiAoJy5jb25jYXQoeSwgJykuJykpLCB1LmlzRm4odCkgPyB0KGUpID8gUCgnQ01QIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgZHVyaW5nIGxvb2t1cCBwcm9jZXNzLicsIG4sIGUpIDogKGNsZWFyVGltZW91dChuLnRpbWVyKSwgSShlKSwgUyhudWxsLCBuKSkgOiBQKCdVbmFibGUgdG8gZGVyaXZlIENNUCB2ZXJzaW9uIHRvIHByb2Nlc3MgZGF0YS4gIENvbnNlbnQgb2JqZWN0IGRvZXMgbm90IGNvbmZvcm0gdG8gVENGIHYxIG9yIHYyIHNwZWNzLicsIG4sIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUChuLCB0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHQudGltZXIpLCB3LnZhbHVlICYmIDEgPT09IEQgJiYgSSh2b2lkIDApLCBTKG4sIHQsIGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSShuKSB7CiAgICAgICAgICAgICAgICAgICAgMSA9PT0gRCA/IEMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRTdHJpbmc6IG4gPyBuLmdldENvbnNlbnREYXRhLmNvbnNlbnREYXRhIDogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JEYXRhOiBuID8gbi5nZXRWZW5kb3JDb25zZW50cyA6IHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgZ2RwckFwcGxpZXM6IG4gPyBuLmdldENvbnNlbnREYXRhLmdkcHJBcHBsaWVzIDogZwogICAgICAgICAgICAgICAgICAgIH0gOiAoQyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudFN0cmluZzogbiA/IG4udGNTdHJpbmcgOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvckRhdGE6IG4gfHwgdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICBnZHByQXBwbGllczogbiAmJiAnYm9vbGVhbicgPT0gdHlwZW9mIG4uZ2RwckFwcGxpZXMgPyBuLmdkcHJBcHBsaWVzIDogZwogICAgICAgICAgICAgICAgICAgIH0sIG4gJiYgbi5hZGR0bENvbnNlbnQgJiYgdS5pc1N0cihuLmFkZHRsQ29uc2VudCkgJiYgKEMuYWRkdGxDb25zZW50ID0gbi5hZGR0bENvbnNlbnQpKSwgQy5hcGlWZXJzaW9uID0gRCwgYS5nZHByRGF0YUhhbmRsZXIuc2V0Q29uc2VudERhdGEoQyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKG4sIHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbywgYSwgaTsKICAgICAgICAgICAgICAgICAgICAhMSA9PT0gdC5oYXZlRXhpdGVkICYmICh0LmhhdmVFeGl0ZWQgPSAhMCwgbyA9IHQuY29udGV4dCwgYSA9IHQuYXJncywgaSA9IHQubmV4dEZuLCBuID8gdy52YWx1ZSAmJiAxID09PSBEID8gKHUubG9nV2FybihuICsgJyBcJ2FsbG93QXVjdGlvbldpdGhvdXRDb25zZW50XCcgYWN0aXZhdGVkLicsIGUpLCBpLmFwcGx5KG8sIGEpKSA6ICh1LmxvZ0Vycm9yKG4gKyAnIENhbmNlbGluZyBhdWN0aW9uIGFzIHBlciBjb25zZW50TWFuYWdlbWVudCBjb25maWcuJywgZSksICdmdW5jdGlvbicgPT0gdHlwZW9mIHQuYmlkc0JhY2tIYW5kbGVyID8gdC5iaWRzQmFja0hhbmRsZXIoKSA6IHUubG9nRXJyb3IoJ0Vycm9yIGV4ZWN1dGluZyBiaWRzQmFja0hhbmRsZXInKSkgOiBpLmFwcGx5KG8sIGEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIF8obikgewogICAgICAgICAgICAgICAgICAgIChuID0gbiAmJiAobi5nZHByIHx8IG4udXNwID8gbi5nZHByIDogbikpICYmICdvYmplY3QnID09PSBjKG4pID8gKHUuaXNTdHIobi5jbXBBcGkpID8gZCA9IG4uY21wQXBpIDogKGQgPSB2LCB1LmxvZ0luZm8oJ2NvbnNlbnRNYW5hZ2VtZW50IGNvbmZpZyBkaWQgbm90IHNwZWNpZnkgY21wLiAgVXNpbmcgc3lzdGVtIGRlZmF1bHQgc2V0dGluZyAoJy5jb25jYXQodiwgJykuJykpKSwgdS5pc051bWJlcihuLnRpbWVvdXQpID8gbCA9IG4udGltZW91dCA6IChsID0gYiwgdS5sb2dJbmZvKCdjb25zZW50TWFuYWdlbWVudCBjb25maWcgZGlkIG5vdCBzcGVjaWZ5IHRpbWVvdXQuICBVc2luZyBzeXN0ZW0gZGVmYXVsdCBzZXR0aW5nICgnLmNvbmNhdChiLCAnKS4nKSkpLCAnYm9vbGVhbicgPT0gdHlwZW9mIG4uYWxsb3dBdWN0aW9uV2l0aG91dENvbnNlbnQgJiYgKHcudmFsdWUgPSBuLmFsbG93QXVjdGlvbldpdGhvdXRDb25zZW50LCB3LmRlZmluZWRJbkNvbmZpZyA9ICEwKSwgZyA9ICEwID09PSBuLmRlZmF1bHRHZHByU2NvcGUsIHUubG9nSW5mbygnY29uc2VudE1hbmFnZW1lbnQgbW9kdWxlIGhhcyBiZWVuIGFjdGl2YXRlZC4uLicpLCAnc3RhdGljJyA9PT0gZCAmJiAodS5pc1BsYWluT2JqZWN0KG4uY29uc2VudERhdGEpID8gKG0gPSBuLmNvbnNlbnREYXRhLCBsID0gMCkgOiB1LmxvZ0Vycm9yKCdjb25zZW50TWFuYWdlbWVudCBjb25maWcgd2l0aCBjbXBBcGk6IFwnc3RhdGljXCcgZGlkIG5vdCBzcGVjaWZ5IGNvbnNlbnREYXRhLiBObyBjb25zZW50cyB3aWxsIGJlIGF2YWlsYWJsZSB0byBhZGFwdGVycy4nKSksIGsgfHwgcGJqcy5yZXF1ZXN0Qmlkcy5iZWZvcmUoaCwgNTApLCBrID0gITApIDogdS5sb2dXYXJuKCdjb25zZW50TWFuYWdlbWVudCBjb25maWcgbm90IGRlZmluZWQsIGV4aXRpbmcgY29uc2VudCBtYW5hZ2VyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvLmIuZ2V0Q29uZmlnKCdjb25zZW50TWFuYWdlbWVudCcsIGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF8obi5jb25zZW50TWFuYWdlbWVudCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFszNzJdKTsKICAgICAgICBwYmpzQ2h1bmsoWzMxN10sIHsKICAgICAgICAgICAgMzc5OiBmdW5jdGlvbiAodCwgbiwgZSkgewogICAgICAgICAgICAgICAgdC5leHBvcnRzID0gZSgzODApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAzODA6IGZ1bmN0aW9uICh0LCBuLCBlKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgZS5kKG4sICdjb25zZW50QVBJJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSksIGUuZChuLCAnY29uc2VudFRpbWVvdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgZS5kKG4sICdzdGF0aWNDb25zZW50RGF0YScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdTsKICAgICAgICAgICAgICAgIH0pLCBuLnJlcXVlc3RCaWRzSG9vayA9IG0sIG4ucmVzZXRDb25zZW50RGF0YSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBsID0gdm9pZCAwLCBzID0gdm9pZCAwLCBvLnVzcERhdGFIYW5kbGVyLnNldENvbnNlbnREYXRhKG51bGwpOwogICAgICAgICAgICAgICAgfSwgbi5zZXRDb25zZW50Q29uZmlnID0gUDsKICAgICAgICAgICAgICAgIHZhciByID0gZSgwKSwgYSA9IGUoMyksIG8gPSBlKDgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaSh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiB0LmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgdCAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIHQ7CiAgICAgICAgICAgICAgICAgICAgfSkodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcywgYywgdSwgbCwgZCA9ICdpYWInLCBwID0gNTAsIGYgPSAhMSwgZyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWFiOiBmdW5jdGlvbiAoYSwgbywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zZW50RGF0YUNhbGxiYWNrOiBmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgdC51c3BTdHJpbmcgJiYgKGUudXNQcml2YWN5ID0gdC51c3BTdHJpbmcpLCBlLnVzUHJpdmFjeSA/IGEoZSwgaSkgOiBvKCdVbmFibGUgdG8gZ2V0IFVTUCBjb25zZW50IHN0cmluZy4nLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIHMgPSB7fSwgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCwgbiwgZSA9IHdpbmRvdzsgIXQ7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnZnVuY3Rpb24nID09IHR5cGVvZiBlLl9fdXNwYXBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBlLl9fdXNwYXBpLCB0ID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5mcmFtZXMuX191c3BhcGlMb2NhdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PT0gd2luZG93LnRvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNwYXBpRnJhbWU6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c3BhcGlGdW5jdGlvbjogbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgZSA9IG4udXNwYXBpRnJhbWUsIGMgPSBuLnVzcGFwaUZ1bmN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvKCdVU1AgQ01QIG5vdCBmb3VuZC4nLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuaXNGbihjKSA/IChyLmxvZ0luZm8oJ0RldGVjdGVkIFVTUCBDTVAgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSwgY2FsbGluZyBpdCBub3cuLi4nKSwgYygnZ2V0VVNQRGF0YScsIDEsIHQuY29uc2VudERhdGFDYWxsYmFjaykpIDogKHIubG9nSW5mbygnRGV0ZWN0ZWQgVVNQIENNUCBpcyBvdXRzaWRlIHRoZSBjdXJyZW50IGlmcmFtZSB3aGVyZSBQcmViaWQuanMgaXMgbG9jYXRlZCwgY2FsbGluZyBpdCBub3cuLi4nKSwgZnVuY3Rpb24gKHQsIGksIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX191c3BhcGkgPSBmdW5jdGlvbiAodCwgbiwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IE1hdGgucmFuZG9tKCkgKyAnJywgbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VzcGFwaUNhbGw6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbElkOiBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1thXSA9IGUsIGkucG9zdE1lc3NhZ2UobywgJyonKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gdCAmJiB0LmRhdGEgJiYgdC5kYXRhLl9fdXNwYXBpUmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIG4uY2FsbElkICYmIHZvaWQgMCAhPT0gc1tuLmNhbGxJZF0gJiYgKHNbbi5jYWxsSWRdKG4ucmV0dXJuVmFsdWUsIG4uc3VjY2VzcyksIGRlbGV0ZSBzW24uY2FsbElkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgITEpLCB3aW5kb3cuX191c3BhcGkodCwgMSwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCdnZXRVU1BEYXRhJywgZSwgdC5jb25zZW50RGF0YUNhbGxiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYzogZnVuY3Rpb24gKHQsIG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQodSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbSh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtuXSwKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEZuOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBhZFVuaXRzOiBuLmFkVW5pdHMgfHwgcGJqcy5hZFVuaXRzLAogICAgICAgICAgICAgICAgICAgICAgICBiaWRzQmFja0hhbmRsZXI6IG4uYmlkc0JhY2tIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICBoYXZlRXhpdGVkOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgdGltZXI6IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmICghZ1tzXSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIubG9nV2FybignVVNQIGZyYW1ld29yayAoJy5jb25jYXQocywgJykgaXMgbm90IGEgc3VwcG9ydGVkIGZyYW1ld29yay4gQWJvcnRpbmcgY29uc2VudE1hbmFnZW1lbnQgbW9kdWxlIGFuZCByZXN1bWluZyBhdWN0aW9uLicpKSwgZS5uZXh0Rm4uYXBwbHkoZS5jb250ZXh0LCBlLmFyZ3MpOwogICAgICAgICAgICAgICAgICAgIGdbc10uY2FsbCh0aGlzLCBiLCB5LCBlKSwgZS5oYXZlRXhpdGVkIHx8ICgwID09PSBjID8gYih2b2lkIDAsIGUpIDogZS50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeSgnVVNQQVBJIHdvcmtmbG93IGV4Y2VlZGVkIHRpbWVvdXQgdGhyZXNob2xkLicsIHQpOwogICAgICAgICAgICAgICAgICAgIH0uYmluZChudWxsLCBlKSwgYykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYih0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGU7CiAgICAgICAgICAgICAgICAgICAgIXQgfHwgIXQudXNQcml2YWN5ID8geSgnVVNQQVBJIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgZHVyaW5nIGxvb2t1cCBwcm9jZXNzLicsIG4sIHQpIDogKGNsZWFyVGltZW91dChuLnRpbWVyKSwgKGUgPSB0KSAmJiBlLnVzUHJpdmFjeSAmJiAobCA9IGUudXNQcml2YWN5LCBvLnVzcERhdGFIYW5kbGVyLnNldENvbnNlbnREYXRhKGwpKSwgdihudWxsLCBuKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQsIG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQobi50aW1lciksIHYodCwgbiwgZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KHQsIG4sIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSwgbywgaTsKICAgICAgICAgICAgICAgICAgICAhMSA9PT0gbi5oYXZlRXhpdGVkICYmIChuLmhhdmVFeGl0ZWQgPSAhMCwgYSA9IG4uY29udGV4dCwgbyA9IG4uYXJncywgaSA9IG4ubmV4dEZuLCB0ICYmIHIubG9nV2Fybih0ICsgJyBSZXN1bWluZyBhdWN0aW9uIHdpdGhvdXQgY29uc2VudCBkYXRhIGFzIHBlciBjb25zZW50TWFuYWdlbWVudCBjb25maWcuJywgZSksIGkuYXBwbHkoYSwgbykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUCh0KSB7CiAgICAgICAgICAgICAgICAgICAgKHQgPSB0ICYmIHQudXNwKSAmJiAnb2JqZWN0JyA9PT0gaSh0KSA/IChyLmlzU3RyKHQuY21wQXBpKSA/IHMgPSB0LmNtcEFwaSA6IChzID0gZCwgci5sb2dJbmZvKCdjb25zZW50TWFuYWdlbWVudC51c3AgY29uZmlnIGRpZCBub3Qgc3BlY2lmeSBjbXBBcGkuIFVzaW5nIHN5c3RlbSBkZWZhdWx0IHNldHRpbmcgKCcuY29uY2F0KGQsICcpLicpKSksIHIuaXNOdW1iZXIodC50aW1lb3V0KSA/IGMgPSB0LnRpbWVvdXQgOiAoYyA9IHAsIHIubG9nSW5mbygnY29uc2VudE1hbmFnZW1lbnQudXNwIGNvbmZpZyBkaWQgbm90IHNwZWNpZnkgdGltZW91dC4gVXNpbmcgc3lzdGVtIGRlZmF1bHQgc2V0dGluZyAoJy5jb25jYXQocCwgJykuJykpKSwgci5sb2dJbmZvKCdVU1BBUEkgY29uc2VudE1hbmFnZW1lbnQgbW9kdWxlIGhhcyBiZWVuIGFjdGl2YXRlZC4uLicpLCAnc3RhdGljJyA9PT0gcyAmJiAoci5pc1BsYWluT2JqZWN0KHQuY29uc2VudERhdGEpICYmIHIuaXNQbGFpbk9iamVjdCh0LmNvbnNlbnREYXRhLmdldFVTUERhdGEpID8gKHQuY29uc2VudERhdGEuZ2V0VVNQRGF0YS51c3BTdHJpbmcgJiYgKHUgPSB7IHVzUHJpdmFjeTogdC5jb25zZW50RGF0YS5nZXRVU1BEYXRhLnVzcFN0cmluZyB9KSwgYyA9IDApIDogci5sb2dFcnJvcignY29uc2VudE1hbmFnZW1lbnQgY29uZmlnIHdpdGggY21wQXBpOiBcJ3N0YXRpY1wnIGRpZCBub3Qgc3BlY2lmeSBjb25zZW50RGF0YS4gTm8gY29uc2VudHMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYWRhcHRlcnMuJykpLCBmIHx8IHBianMucmVxdWVzdEJpZHMuYmVmb3JlKG0sIDUwKSwgZiA9ICEwKSA6IHIubG9nV2FybignY29uc2VudE1hbmFnZW1lbnQudXNwIGNvbmZpZyBub3QgZGVmaW5lZCwgZXhpdGluZyB1c3AgY29uc2VudCBtYW5hZ2VyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhLmIuZ2V0Q29uZmlnKCdjb25zZW50TWFuYWdlbWVudCcsIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFAodC5jb25zZW50TWFuYWdlbWVudCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFszNzldKTsKICAgICAgICBwYmpzQ2h1bmsoWzMxMF0sIHsKICAgICAgICAgICAgMzk4OiBmdW5jdGlvbiAoZSwgbywgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCgzOTkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAzOTk6IGZ1bmN0aW9uIChlLCBvLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKG8sICdzdG9yYWdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwogICAgICAgICAgICAgICAgfSksIHQuZChvLCAnY3JpdGVvSWRTdWJtb2R1bGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBmID0gdCgwKSwgbSA9IHQoNCksIEkgPSB0KDIwKSwgbiA9IHQoMTEpLCBjID0gdCg3KSwgciA9ICdjcml0ZW8nLCB2ID0gT2JqZWN0KGMuYikoOTEsIHIpLCBVID0gJ2N0b19iaWRpZCcsIGggPSAnY3RvX2J1bmRsZScsIFMgPSBuZXcgRGF0ZSgwKS50b1N0cmluZygpLCBpID0gbmV3IERhdGUoZi50aW1lc3RhbXAoKSArIDMzNjk2MDAwMDAwKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gdyhlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IG8gJiYgbywgbiA9IGYucGFyc2VVcmwoZSwgeyBub0RlY29kZVdob2xlVVJMOiAhMCB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCA/ICcnLmNvbmNhdChuLmhvc3RuYW1lKSA6ICcnLmNvbmNhdChuLnByb3RvY29sLCAnOi8vJykuY29uY2F0KG4uaG9zdG5hbWUpLmNvbmNhdChuLnBvcnQgPyAnOicgKyBuLnBvcnQgOiAnJywgJy8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2LmdldENvb2tpZShlKSB8fCB2LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgZSAmJiBvICYmICh2LnNldENvb2tpZShlLCBvLCBpKSwgdi5zZXREYXRhSW5Mb2NhbFN0b3JhZ2UoZSwgbykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIGMsIHIsIGksIGEsIGQsIHUgPSB2LmNvb2tpZXNBcmVFbmFibGVkKCksIGwgPSB2LmxvY2FsU3RvcmFnZUlzRW5hYmxlZCgpLCBwID0gdyhPYmplY3QoSS5hKSgpLnJlZmVyZXIpLCBzID0gdyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCAhMCksIGIgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2YgY3JpdGVvX3B1YnRhZywgZyA9ICh0ID0gcCwgbiA9IHMsIGMgPSBlLmJ1bmRsZSwgciA9IHUsIGkgPSBsLCBhID0gYiwgZCA9IG8sICdodHRwczovL2d1bS5jcml0ZW8uY29tL3NpZC9qc29uP29yaWdpbj1wcmViaWQnICsgJycuY29uY2F0KHQgPyAnJnRvcFVybD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHQpIDogJycpICsgJycuY29uY2F0KG4gPyAnJmRvbWFpbj0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4pIDogJycpICsgJycuY29uY2F0KGMgPyAnJmJ1bmRsZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGMpIDogJycpICsgJycuY29uY2F0KGQgPyAnJmdkcHJTdHJpbmc9JyArIGVuY29kZVVSSUNvbXBvbmVudChkKSA6ICcnKSArICcnLmNvbmNhdChyID8gJyZjdz0xJyA6ICcnKSArICcnLmNvbmNhdChhID8gJyZwYnQ9MScgOiAnJykgKyAnJy5jb25jYXQoaSA/ICcmbHN3PTEnIDogJycpKTsKICAgICAgICAgICAgICAgICAgICBtLmIoKShnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbywgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuYmlkSWQgPyBDKFUsIHQuYmlkSWQpIDogKG8gPSBVLCB2LnNldENvb2tpZShvLCAnJywgUyksIHYucmVtb3ZlRGF0YUZyb21Mb2NhbFN0b3JhZ2UobykpLCB0LmFjd3NVcmwgPyAoJ3N0cmluZycgPT0gdHlwZW9mIHQuYWN3c1VybCA/IFt0LmFjd3NVcmxdIDogdC5hY3dzVXJsKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZi50cmlnZ2VyUGl4ZWwoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdC5idW5kbGUgJiYgQyhoLCB0LmJ1bmRsZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgdm9pZCAwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB1ID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IHIsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDkxLAogICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKGUsIG8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBvICYmICdib29sZWFuJyA9PSB0eXBlb2Ygby5nZHByQXBwbGllcyAmJiBvLmdkcHJBcHBsaWVzID8gby5jb25zZW50U3RyaW5nIDogdm9pZCAwLCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZTogYShoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRJZDogYShVKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQobiwgdCksIHsgaWQ6IG4uYmlkSWQgPyB7IGNyaXRlb0lkOiBuLmJpZElkIH0gOiB2b2lkIDAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0KG4uZSkoJ3VzZXJJZCcsIHUpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzM5OF0pOwogICAgICAgIHBianNDaHVuayhbMzA5XSwgewogICAgICAgICAgICA0MDA6IGZ1bmN0aW9uIChlLCBuLCByKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKDQwMSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQwMTogZnVuY3Rpb24gKGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByLmQobiwgJ2N1cnJlbmN5U3VwcG9ydEVuYWJsZWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFI7CiAgICAgICAgICAgICAgICB9KSwgci5kKG4sICdjdXJyZW5jeVJhdGVzJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBEOwogICAgICAgICAgICAgICAgfSksIG4uc2V0Q29uZmlnID0gYywgbi5hZGRCaWRSZXNwb25zZUhvb2sgPSBqOwogICAgICAgICAgICAgICAgdmFyIHMgPSByKDE3KSwgdSA9IHIoMzQpLCBhID0gcig1KSwgZiA9IChyLm4oYSksIHIoNCkpLCBkID0gcigwKSwgbyA9IHIoMyksIGwgPSByKDExKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoeSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGcsIHYgPSAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3ByZWJpZC9jdXJyZW5jeS1maWxlQDEvbGF0ZXN0Lmpzb24/ZGF0ZT0kJFRPREFZJCQnLCBwID0gNCwgYiA9IFtdLCBoID0ge30sIEMgPSAhMSwgUyA9ICEwLCBtID0gJ1VTRCcsIFIgPSAhMSwgRCA9IHt9LCBJID0ge307CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbywgYywgdCwgaSA9IHY7CiAgICAgICAgICAgICAgICAgICAgJ29iamVjdCcgPT09IHkoZS5yYXRlcykgJiYgKEQuY29udmVyc2lvbnMgPSBlLnJhdGVzLCBTID0gIShDID0gITApKSwgJ29iamVjdCcgPT09IHkoZS5kZWZhdWx0UmF0ZXMpICYmIChnID0gZS5kZWZhdWx0UmF0ZXMsIEQuY29udmVyc2lvbnMgPSBnLCBDID0gITApLCAnc3RyaW5nJyA9PSB0eXBlb2YgZS5hZFNlcnZlckN1cnJlbmN5ID8gKGQubG9nSW5mbygnZW5hYmxpbmcgY3VycmVuY3kgc3VwcG9ydCcsIGFyZ3VtZW50cyksIG0gPSBlLmFkU2VydmVyQ3VycmVuY3ksIGUuY29udmVyc2lvblJhdGVGaWxlICYmIChkLmxvZ0luZm8oJ2N1cnJlbmN5IHVzaW5nIG92ZXJyaWRlIGNvbnZlcnNpb25SYXRlRmlsZTonLCBlLmNvbnZlcnNpb25SYXRlRmlsZSksIGkgPSBlLmNvbnZlcnNpb25SYXRlRmlsZSksIC0xICE9PSAobiA9IGkuaW5kZXhPZignJCRUT0RBWSQkJykpICYmIChyID0gbmV3IERhdGUoKSwgbyA9ICcnLmNvbmNhdChyLmdldE1vbnRoKCkgKyAxKSwgYyA9ICcnLmNvbmNhdChyLmdldERhdGUoKSksIG8ubGVuZ3RoIDwgMiAmJiAobyA9ICcwJy5jb25jYXQobykpLCBjLmxlbmd0aCA8IDIgJiYgKGMgPSAnMCcuY29uY2F0KGMpKSwgdCA9ICcnLmNvbmNhdChyLmdldEZ1bGxZZWFyKCkpLmNvbmNhdChvKS5jb25jYXQoYyksIGkgPSAnJy5jb25jYXQoaS5zdWJzdHJpbmcoMCwgbikpLmNvbmNhdCh0KS5jb25jYXQoaS5zdWJzdHJpbmcobiArIDksIGkubGVuZ3RoKSkpLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBoID0ge30sIFIgPSAhMCwgZC5sb2dJbmZvKCdJbnN0YWxsaW5nIGFkZEJpZFJlc3BvbnNlIGRlY29yYXRvciBmb3IgY3VycmVuY3kgbW9kdWxlJywgYXJndW1lbnRzKSwgT2JqZWN0KHMuYSkoKS5jb252ZXJ0Q3VycmVuY3kgPSBmdW5jdGlvbiAoZSwgbiwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoZSkgKiBGKG4sIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPYmplY3QobC5hKSgnYWRkQmlkUmVzcG9uc2UnKS5iZWZvcmUoaiwgMTAwKSwgUyAmJiAoUyA9ICExLCBPYmplY3QoZi5hKShlLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQgPSBKU09OLnBhcnNlKG4pLCBkLmxvZ0luZm8oJ2N1cnJlbmN5UmF0ZXMgc2V0IHRvICcgKyBKU09OLnN0cmluZ2lmeShEKSksIEMgPSAhMCwgdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTygnRmFpbGVkIHRvIHBhcnNlIGN1cnJlbmN5UmF0ZXMgcmVzcG9uc2U6ICcgKyBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IE8KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0oaSkpIDogKGQubG9nSW5mbygnZGlzYWJsaW5nIGN1cnJlbmN5IHN1cHBvcnQnKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkLmxvZ0luZm8oJ1VuaW5zdGFsbGluZyBhZGRCaWRSZXNwb25zZSBkZWNvcmF0b3IgZm9yIGN1cnJlbmN5IG1vZHVsZScsIGFyZ3VtZW50cyksIE9iamVjdChsLmEpKCdhZGRCaWRSZXNwb25zZScpLmdldEhvb2tzKHsgaG9vazogaiB9KS5yZW1vdmUoKSwgZGVsZXRlIE9iamVjdChzLmEpKCkuY29udmVydEN1cnJlbmN5LCBtID0gJ1VTRCcsIGggPSB7fSwgQyA9IFIgPSAhMSwgUyA9ICEwLCBEID0ge30sIEkgPSB7fTsKICAgICAgICAgICAgICAgICAgICB9KCkpLCAnb2JqZWN0JyA9PT0geShlLmJpZGRlckN1cnJlbmN5RGVmYXVsdCkgJiYgKEkgPSBlLmJpZGRlckN1cnJlbmN5RGVmYXVsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKGUpIHsKICAgICAgICAgICAgICAgICAgICBnID8gKGQubG9nV2FybihlKSwgZC5sb2dXYXJuKCdDdXJyZW5jeSBmYWlsZWQgbG9hZGluZyByYXRlcywgZmFsbGluZyBiYWNrIHRvIGN1cnJlbmN5LmRlZmF1bHRSYXRlcycpKSA6IGQubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBqKGUsIG4sIHIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGwodGhpcywgbik7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8sIGMsIHQsIGksIHMgPSByLmJpZGRlckNvZGUgfHwgci5iaWRkZXI7CiAgICAgICAgICAgICAgICAgICAgaWYgKElbc10gJiYgKG8gPSBJW3NdLCByLmN1cnJlbmN5ICYmIG8gIT09IHIuY3VycmVuY3kgPyBkLmxvZ1dhcm4oJ0N1cnJlbmN5IGRlZmF1bHQgXCcnLmNvbmNhdChzLCAnOiAnKS5jb25jYXQobywgJ1wnIGlnbm9yZWQuIGFkYXB0ZXIgc3BlY2lmaWVkIFwnJykuY29uY2F0KHIuY3VycmVuY3ksICdcJycpKSA6IHIuY3VycmVuY3kgPSBvKSwgci5jdXJyZW5jeSB8fCAoZC5sb2dXYXJuKCdDdXJyZW5jeSBub3Qgc3BlY2lmaWVkIG9uIGJpZC4gIERlZmF1bHRlZCB0byAiVVNEIicpLCByLmN1cnJlbmN5ID0gJ1VTRCcpLCByLmdldENwbUluTmV3Q3VycmVuY3kgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJzZUZsb2F0KHRoaXMuY3BtKSAqIEYodGhpcy5jdXJyZW5jeSwgZSkpLnRvRml4ZWQoMyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHIuY3VycmVuY3kgPT09IG0pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNhbGwodGhpcywgbiwgcik7CiAgICAgICAgICAgICAgICAgICAgYi5wdXNoKChjID0gZSwgdCA9IHRoaXMsIGkgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgIHIKICAgICAgICAgICAgICAgICAgICBdLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gaVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gbiAmJiAnY3VycmVuY3knIGluIG4gJiYgJ2NwbScgaW4gbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuLmN1cnJlbmN5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IEYoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAhPT0gciAmJiAobi5jcG0gPSAocGFyc2VGbG9hdChuLmNwbSkgKiByKS50b0ZpeGVkKDQpLCBuLmN1cnJlbmN5ID0gbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dXYXJuKCdSZXR1cm5pbmcgTk9fQklELCBnZXRDdXJyZW5jeUNvbnZlcnNpb24gdGhyZXcgZXJyb3I6ICcsIGUpLCBpWzFdID0gT2JqZWN0KHUuYSkoYS5TVEFUVVMuTk9fQklELCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlcjogbi5iaWRkZXJDb2RlIHx8IG4uYmlkZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRJZDogbi5yZXF1ZXN0SWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5hcHBseSh0LCBpKTsKICAgICAgICAgICAgICAgICAgICB9KSksIFIgJiYgIUMgfHwgdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdygpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKDsgMCA8IGIubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgYi5zaGlmdCgpKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciwgbyA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gbiA/IG4gOiBtLCBjID0gbnVsbCwgdCA9ICcnLmNvbmNhdChlLCAnLT4nKS5jb25jYXQobyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgaW4gaCkKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGhbdF0sIGQubG9nTWVzc2FnZSgnVXNpbmcgY29udmVyc2lvbkNhY2hlIHZhbHVlICcgKyBjICsgJyBmb3IgJyArIHQpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCExID09PSBSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnVVNEJyAhPT0gZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUHJlYmlkIGN1cnJlbmN5IHN1cHBvcnQgaGFzIG5vdCBiZWVuIGVuYWJsZWQgYW5kIGZyb21DdXJyZW5jeSBpcyBub3QgVVNEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZSA9PT0gbykKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDE7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZSBpbiBELmNvbnZlcnNpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG8gaW4gKHIgPSBELmNvbnZlcnNpb25zW2VdKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBhZFNlcnZlckN1cnJlbmN5IGluIGNvbmZpZyBcJycgKyBvICsgJ1wnIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVuY3kgcmF0ZXMgZmlsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBjID0gcltvXSwgZC5sb2dJbmZvKCdnZXRDdXJyZW5jeUNvbnZlcnNpb24gdXNpbmcgZGlyZWN0ICcgKyBlICsgJyB0byAnICsgbyArICcgY29udmVyc2lvblJhdGUgJyArIGMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbiBELmNvbnZlcnNpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW4gKHIgPSBELmNvbnZlcnNpb25zW29dKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBmcm9tQ3VycmVuY3kgXCcnICsgZSArICdcJyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbmN5IHJhdGVzIGZpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgYyA9IFUoMSAvIHJbZV0sIHApLCBkLmxvZ0luZm8oJ2dldEN1cnJlbmN5Q29udmVyc2lvbiB1c2luZyByZWNpcHJvY2FsICcgKyBlICsgJyB0byAnICsgbyArICcgY29udmVyc2lvblJhdGUgJyArIGMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gT2JqZWN0LmtleXMoRC5jb252ZXJzaW9ucylbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUgaW4gRC5jb252ZXJzaW9uc1tpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBmcm9tQ3VycmVuY3kgXCcnICsgZSArICdcJyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbmN5IHJhdGVzIGZpbGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSAxIC8gRC5jb252ZXJzaW9uc1tpXVtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEobyBpbiBELmNvbnZlcnNpb25zW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3BlY2lmaWVkIGFkU2VydmVyQ3VycmVuY3kgaW4gY29uZmlnIFwnJyArIG8gKyAnXCcgbm90IGZvdW5kIGluIHRoZSBjdXJyZW5jeSByYXRlcyBmaWxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBVKHMgKiBELmNvbnZlcnNpb25zW2ldW29dLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dJbmZvKCdnZXRDdXJyZW5jeUNvbnZlcnNpb24gdXNpbmcgaW50ZXJtZWRpYXRlICcgKyBlICsgJyB0aHJ1ICcgKyBpICsgJyB0byAnICsgbyArICcgY29udmVyc2lvblJhdGUgJyArIGMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdCBpbiBoIHx8IChkLmxvZ01lc3NhZ2UoJ0FkZGluZyBjb252ZXJzaW9uQ2FjaGUgdmFsdWUgJyArIGMgKyAnIGZvciAnICsgdCksIGhbdF0gPSBjKSwgYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAxLCBvID0gMDsgbyA8IG47IG8rKykKICAgICAgICAgICAgICAgICAgICAgICAgciArPSAnMCc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoZSAqIHIpIC8gcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG8uYi5nZXRDb25maWcoJ2N1cnJlbmN5JywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyhlLmN1cnJlbmN5KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzQwMF0pOwogICAgICAgIHBianNDaHVuayhbMzAyXSwgewogICAgICAgICAgICA0MTY6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDQxNyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDQxNzogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmQociwgJ3NwZWMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CiAgICAgICAgICAgICAgICB9KSwgci5nZXRGbG9vciA9IGgsIHIuY2xlYW5TaXplcyA9IGcsIHIuc2h1ZmZsZSA9IHYsIHIucmVtb3ZlRHVwbGljYXRlID0gQSwgci51cHRvNSA9IEksIHIubWF0Y2hSZXF1ZXN0ID0gUywgci5jaGVja0RlZXBBcnJheSA9IHgsIHIuZGVmYXVsdFNpemUgPSBPLCByLmJpbmRVc2VySWQgPSB3LCByLmdldEFwaSA9IFQsIHIuZ2V0UGxheWJhY2ttZXRob2QgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpICYmIDAgPCBlLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geS5wbGF5YmFja19tZXRob2RbZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBbMl07CiAgICAgICAgICAgICAgICB9LCByLmdldFByb3RvY29scyA9IGosIHIuY2xlYW5WYXN0ID0gejsKICAgICAgICAgICAgICAgIHZhciB1ID0gdCgwKSwgbiA9IHQoMSksIGQgPSB0KDMpLCBpID0gdCgyKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSwgcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0oZSkgfHwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCd1bmRlZmluZWQnID09IHR5cGVvZiBTeW1ib2wgfHwgIShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXSwgbiA9ICEwLCBpID0gITEsIG8gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzLCBhID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7ICEobiA9IChzID0gYS5uZXh0KCkpLmRvbmUpICYmICh0LnB1c2gocy52YWx1ZSksICFyIHx8IHQubGVuZ3RoICE9PSByKTsgbiA9ICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9ICEwLCBvID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCBudWxsID09IGEucmV0dXJuIHx8IGEucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBvOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIH0oZSwgcikgfHwgcyhlLCByKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBzKGUpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPYmplY3QnID09PSB0ICYmIGUuY29uc3RydWN0b3IgJiYgKHQgPSBlLmNvbnN0cnVjdG9yLm5hbWUpLCAnTWFwJyA9PT0gdCB8fCAnU2V0JyA9PT0gdCA/IEFycmF5LmZyb20oZSkgOiAnQXJndW1lbnRzJyA9PT0gdCB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSA/IGEoZSwgcikgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gciB8fCByID4gZS5sZW5ndGgpICYmIChyID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwLCBuID0gbmV3IEFycmF5KHIpOyB0IDwgcjsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICBuW3RdID0gZVt0XTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAocCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbShyLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBPYmplY3Qua2V5cyhyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAodCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMociksIGUgJiYgKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBlKS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgIH0pKSwgbi5wdXNoLmFwcGx5KG4sIHQpKSwgbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoaSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbnVsbCAhPSBhcmd1bWVudHNbZV0gPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAlIDIgPyBtKE9iamVjdChvKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCB0LCBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGksIG4gPSBvW3QgPSBlXSwgdCBpbiByID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiByW3RdID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pKSA6IG0oT2JqZWN0KG8pKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmID0gJ2h0dHBzOi8vZG14LmRpc3RyaWN0bS5pby9iL3YxJywgeSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tfbWV0aG9kOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX3BsYXlfc291bmRfb246IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX3BsYXlfc291bmRfb2ZmOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tfdG9fcGxheTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlX292ZXI6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydF9zb3VuZF9vbjogNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0X3NvdW5kX29mZjogNgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgYiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ2Rpc3RyaWN0bURNWCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiAxNDQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IFsnZG14J10sCiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5kCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZE1lZGlhVHlwZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuYgogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUucGFyYW1zLm1lbWJlcmlkOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRSZXNwb25zZTogZnVuY3Rpb24gKGUsIHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IGUuYm9keSB8fCB7fSkuc2VhdGJpZCAmJiB1LmlzQXJyYXkoZS5zZWF0YmlkKSA/IGUuc2VhdGJpZC5yZWR1Y2UoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHIuYmlkLnJlZHVjZShmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5wcmljZSA8IHIucHJpY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gUyhyLmltcGlkLCBzKSwgbiA9IE8odCksIGkgPSBuLndpZHRoLCBvID0gbi5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5jcG0gPSBwYXJzZUZsb2F0KHIucHJpY2UpLnRvRml4ZWQoMiksIHIuYmlkSWQgPSByLmltcGlkLCByLnJlcXVlc3RJZCA9IHIuaW1waWQsIHIud2lkdGggPSByLncgfHwgaSwgci5oZWlnaHQgPSByLmggfHwgbywgci50dGwgPSAzMDAsIHIubWVkaWFUeXBlID0gdC5tZWRpYVR5cGVzICYmIHQubWVkaWFUeXBlcy52aWRlbyA/ICd2aWRlbycgOiAnYmFubmVyJywgJ3ZpZGVvJyA9PT0gci5tZWRpYVR5cGUgJiYgKHIudmFzdFhtbCA9IHooci5hZG0sIHIubnVybCksIHIudHRsID0gMzYwMCksIHIuZGVhbGlkICYmIChyLmRlYWxJZCA9IHIuZGVhbGlkKSwgci51dWlkID0gci5iaWRJZCwgci5hZCA9IHIuYWRtLCByLm5ldFJldmVudWUgPSAhMCwgci5jcmVhdGl2ZUlkID0gci5jcmlkLCByLmN1cnJlbmN5ID0gJ1VTRCcsIHIubWV0YSA9IHIubWV0YSB8fCB7fSwgci5hZG9tYWluICYmIDAgPCByLmFkb21haW4ubGVuZ3RoICYmIChyLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMgPSByLmFkb21haW4pLCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmNwbSA9IGUucHJpY2UsIGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgeyBwcmljZTogMCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5hZG0gJiYgZS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUuYmlkSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4gPSBkLmIuZ2V0Q29uZmlnKCdiaWRkZXJUaW1lb3V0JyksIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1LmdlbmVyYXRlVVVJRCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXI6IFsnVVNEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtYXg6IG4gLSAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q6IHRoaXMudGVzdCgpIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6IHsgcHVibGlzaGVyOiB7IGlkOiBTdHJpbmcoZVswXS5wYXJhbXMubWVtYmVyaWQpIHx8IG51bGwgfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBkLmIuZ2V0Q29uZmlnKCdkbXgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnVzZXIgPSBvLnVzZXIgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBvLnNpdGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5zaXRlID0gbChsKHt9LCBpLnNpdGUpLCBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlWzBdICYmIGVbMF0udXNlcklkICYmICh3KGEsIHUuZGVlcEFjY2VzcyhlWzBdLCAndXNlcklkLmlkbF9lbnYnKSwgJ2xpdmVyYW1wLmNvbScsIDEpLCB3KGEsIHUuZGVlcEFjY2VzcyhlWzBdLCAndXNlcklkLmlkNWlkLnVpZCcpLCAnaWQ1LXN5bmMuY29tJywgMSksIHcoYSwgdS5kZWVwQWNjZXNzKGVbMF0sICd1c2VySWQucHViY2lkJyksICdwdWJjaWQub3JnJywgMSksIHcoYSwgdS5kZWVwQWNjZXNzKGVbMF0sICd1c2VySWQudGRpZCcpLCAnYWRzZXJ2ZXIub3JnJywgMSksIHcoYSwgdS5kZWVwQWNjZXNzKGVbMF0sICd1c2VySWQuY3JpdGVvSWQnKSwgJ2NyaXRlby5jb20nLCAxKSwgdyhhLCB1LmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5icml0ZXBvb2xpZCcpLCAnYnJpdGVwb29sLmNvbScsIDEpLCB3KGEsIHUuZGVlcEFjY2VzcyhlWzBdLCAndXNlcklkLmxpcGIubGlwYmlkJyksICdsaXZlaW50ZW50LmNvbScsIDEpLCB3KGEsIHUuZGVlcEFjY2VzcyhlWzBdLCAndXNlcklkLmludGVudGlxaWQnKSwgJ2ludGVudGlxLmNvbScsIDEpLCB3KGEsIHUuZGVlcEFjY2VzcyhlWzBdLCAndXNlcklkLmxvdGFtZVBhbm9yYW1hSWQnKSwgJ2xvdGFtZS5jb20nLCAxKSwgdyhhLCB1LmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5wYXJyYWJsZUlkJyksICdwYXJyYWJsZS5jb20nLCAxKSwgdyhhLCB1LmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5uZXRJZCcpLCAnbmV0aWQuZGUnLCAxKSwgdyhhLCB1LmRlZXBBY2Nlc3MoZVswXSwgJ3VzZXJJZC5zaGFyZWRpZCcpLCAnc2hhcmVkaWQub3JnJywgMSksIGkudXNlciA9IGkudXNlciB8fCB7fSwgaS51c2VyLmV4dCA9IGkudXNlci5leHQgfHwge30sIGkudXNlci5leHQuZWlkcyA9IGEpLCBpLnRlc3QgfHwgZGVsZXRlIGkudGVzdCwgci5nZHByQ29uc2VudCAmJiAoaS5yZWdzID0ge30sIGkucmVncy5leHQgPSB7fSwgaS5yZWdzLmV4dC5nZHByID0gITAgPT09IHIuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMgPyAxIDogMCwgITAgPT09IHIuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMgJiYgKGkudXNlciA9IHt9LCBpLnVzZXIuZXh0ID0ge30sIGkudXNlci5leHQuY29uc2VudCA9IHIuZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZykpLCBpLnJlZ3MgPSBpLnJlZ3MgfHwge30sIGkucmVncy5jb3BwYSA9ICEwID09PSBkLmIuZ2V0Q29uZmlnKCdjb3BwYScpID8gMSA6IDAsIHIgJiYgci51c3BDb25zZW50ICYmIChpLnJlZ3MgPSBpLnJlZ3MgfHwge30sIGkucmVncy5leHQgPSBpLnJlZ3MuZXh0IHx8IHt9LCBpLnJlZ3MuZXh0LnVzX3ByaXZhY3kgPSByLnVzcENvbnNlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZVswXS5zY2hhaW4sIGkuc291cmNlID0ge30sIGkuc291cmNlLmV4dCA9IHt9LCBpLnNvdXJjZS5leHQuc2NoYWluID0gdCB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmlkID0gZS5iaWRJZCwgci50YWdpZCA9IFN0cmluZyhlLnBhcmFtcy5kbXhpZCB8fCBlLmFkVW5pdENvZGUpLCByLnNlY3VyZSA9IDEsIHIuYmlkZmxvb3IgPSBoKGUpLCBlLm1lZGlhVHlwZXMgJiYgZS5tZWRpYVR5cGVzLnZpZGVvID8gci52aWRlbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wZnJhbWU6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA6IGUubWVkaWFUeXBlcy52aWRlby5za2lwIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhcml0eTogZS5tZWRpYVR5cGVzLnZpZGVvLmxpbmVhcml0eSB8fCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5kdXJhdGlvbjogZS5tZWRpYVR5cGVzLnZpZGVvLm1pbmR1cmF0aW9uIHx8IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGR1cmF0aW9uOiBlLm1lZGlhVHlwZXMudmlkZW8ubWF4ZHVyYXRpb24gfHwgNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrbWV0aG9kOiBlLm1lZGlhVHlwZXMudmlkZW8ucGxheWJhY2ttZXRob2QgfHwgWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGk6IFQoZS5tZWRpYVR5cGVzLnZpZGVvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IGUubWVkaWFUeXBlcy52aWRlby5taW1lcyB8fCBbJ3ZpZGVvL21wNCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IGooZS5tZWRpYVR5cGVzLnZpZGVvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGUubWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplWzBdWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IHIuYmFubmVyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BmcmFtZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZyhlLnNpemVzLCAndycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBnKGUuc2l6ZXMsICdoJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZyhlLnNpemVzKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyA9PSB0eXBlb2YgZS53ICYmICdudW1iZXInID09IHR5cGVvZiBlLmg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMubGVuZ3RoIDw9IDUgPyAoaS5pbXAgPSBjLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogSShjLCBpLCByLCBmKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVzdDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCdkbVRlc3Q9dHJ1ZScpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUsIHIsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW10sIG8gPSAnaHR0cHM6Ly9jZG4uZGlzdHJpY3RtLmlvL2lkcy9pbmRleC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIHQuZ2RwckFwcGxpZXMgJiYgJ3N0cmluZycgPT0gdHlwZW9mIHQuY29uc2VudFN0cmluZyAmJiBpLnB1c2goWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2RwcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuY29uc2VudFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCBuICYmIGkucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjY3BhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCAwIDwgaS5sZW5ndGggJiYgKG8gKz0gJz8nICsgaS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuam9pbignPScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyYnKSksIGUuaWZyYW1lRW5hYmxlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpZnJhbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCB0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5nZXRGbG9vciAmJiAoJ29iamVjdCcgIT09IHAociA9IGUuZ2V0Rmxvb3IoewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogZS5tZWRpYVR5cGVzLnZpZGVvID8gJ3ZpZGVvJyA6ICdiYW5uZXInLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBlLnNpemVzLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfSkpIHx8ICdVU0QnICE9PSByLmN1cnJlbmN5IHx8IGlzTmFOKHBhcnNlRmxvYXQoci5mbG9vcikpIHx8ICh0ID0gcGFyc2VGbG9hdChyLmZsb29yKSkpLCBudWxsICE9PSB0ID8gdCA6IGUucGFyYW1zLmZsb29yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB2KGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiAxMDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDk1CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzOiA5MAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDg4CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgczogODUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDgwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgczogNzUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHM6IDYwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHIpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF1bMF0gfHwgMDsKICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRbMF1bMV0gfHwgMDsKICAgICAgICAgICAgICAgICAgICBjYXNlICdzaXplJzoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgPT09IHQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChlLnNpemVbMF0sICd4JykuY29uY2F0KGUuc2l6ZVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKCcnLmNvbmNhdChlWzBdLCAneCcpLmNvbmNhdChlWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuID0gZS5yZWR1Y2UoZnVuY3Rpb24gKHIsIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwID09PSByLmxlbmd0aCA/IChyLnB1c2goZSksIHIpIDogKHIucHVzaChlKSwgKHIgPSAociA9IHQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICE9PSByLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGVbMF0sICd4JykuY29uY2F0KGVbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJycuY29uY2F0KGUuc2l6ZVswXSwgJ3gnKS5jb25jYXQoZS5zaXplWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkuc29ydChmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLnMgLSBlLnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBBKFtdLmNvbmNhdChvKG4pLCBvKHIpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5maWx0ZXIoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGVbMF0sICd4JykuY29uY2F0KGVbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKCcnLmNvbmNhdChlWzBdLCAneCcpLmNvbmNhdChlWzFdKSkgPT09IHI7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUsIHIsIHQsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gW107IDAgIT09IGUubGVuZ3RoOykKICAgICAgICAgICAgICAgICAgICAgICAgNSA8PSBlLmxlbmd0aCA/IGkucHVzaChlLnNwbGljZSgwLCA1KSkgOiBpLnB1c2goZS5zcGxpY2UoMCwgZS5sZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaW1wID0gZSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZGRlclJlcXVlc3Q6IHQKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFMociwgZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjKGUuYmlkZGVyUmVxdWVzdC5iaWRzLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5iaWRJZCA9PT0gcjsKICAgICAgICAgICAgICAgICAgICB9KSwgMSlbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB4KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSAmJiBBcnJheS5pc0FycmF5KGVbMF0pID8gZVswXSA6IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBPKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuc2l6ZXMsIHQgPSB7fTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC53aWR0aCA9IHgocilbMF0sIHQuaGVpZ2h0ID0geChyKVsxXSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHcoZSwgciwgdCwgbikgewogICAgICAgICAgICAgICAgICAgIHUuaXNTdHIocikgJiYgQXJyYXkuaXNBcnJheShlKSAmJiBlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpZHM6IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IG4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBUKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuYXBpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIEFycmF5LmlzQXJyYXkocikgJiYgMCA8IHIubGVuZ3RoID8gciA6IFsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gZS5wcm90b2NvbHM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgQXJyYXkuaXNBcnJheShyKSAmJiAwIDwgci5sZW5ndGggPyByIDogWwogICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAzLAogICAgICAgICAgICAgICAgICAgICAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICA2LAogICAgICAgICAgICAgICAgICAgICAgICA3LAogICAgICAgICAgICAgICAgICAgICAgICA4CiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHoociwgdCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlLCBuID0gLzxpbWdcc1tePl0qP3NyY1xzKj1ccypbJ1wiXShbXidcIl0qPylbJ1wiXVtePl0qPz4vLCBpID0gYyhyLm1hdGNoKG4pLCAyKSwgbyA9IGlbMF0sIHMgPSBpWzFdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IHIucmVwbGFjZShuLCAnJyksIG8gJiYgcyAmJiAoZSA9ICc8SW1wcmVzc2lvbj48IVtDREFUQVsnLmNvbmNhdChzLCAnXV0+PC9JbXByZXNzaW9uPicpLCByID0gci5yZXBsYWNlKCc8L0ltcHJlc3Npb24+JywgJzwvSW1wcmVzc2lvbj4nLmNvbmNhdChlKSkpLCByOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJzxJbXByZXNzaW9uPjwhW0NEQVRBWycuY29uY2F0KHQsICddXT48L0ltcHJlc3Npb24+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gci5yZXBsYWNlKCc8L0ltcHJlc3Npb24+JywgJzwvSW1wcmVzc2lvbj4nLmNvbmNhdChhKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0KG4ucmVnaXN0ZXJCaWRkZXIpKGIpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzQxNl0pOwogICAgICAgIHBianNDaHVuayhbMjYwXSwgewogICAgICAgICAgICA1MDQ6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDUwNSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDUwNTogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmQociwgJ0lENV9TVE9SQUdFX05BTUUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgICAgICAgICB9KSwgdC5kKHIsICdJRDVfUFJJVkFDWV9TVE9SQUdFX05BTUUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgICAgICAgICB9KSwgdC5kKHIsICdpZDVJZFN1Ym1vZHVsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKICAgICAgICAgICAgICAgIH0pLCByLmV4cERheXNTdHIgPSBoLCByLm5iQ2FjaGVOYW1lID0gYywgci5zdG9yZU5iSW5DYWNoZSA9IEQsIHIuZ2V0TmJGcm9tQ2FjaGUgPSBwLCByLmdldEZyb21Mb2NhbFN0b3JhZ2UgPSBFLCByLnN0b3JlSW5Mb2NhbFN0b3JhZ2UgPSBDLCByLmlzSW5Db250cm9sR3JvdXAgPSBPOwogICAgICAgICAgICAgICAgdmFyIGQgPSB0KDApLCB1ID0gdCg0KSwgbiA9IHQoMTEpLCBnID0gdCgyMCksIG8gPSB0KDcpLCBsID0gdCg4KSwgbSA9IDMwLCBhID0gJ2lkNWlkJywgZiA9ICcnLmNvbmNhdChhLCAnX3ByaXZhY3knKSwgYiA9ICdodG1sNScsIGkgPSAxMDAwMCwgdiA9ICdVc2VyIElEIC0gSUQ1IHN1Ym1vZHVsZTogJywgSSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3BianMtaWQ1aWQnLAogICAgICAgICAgICAgICAgICAgICAgICAnaWQ1aWQuMXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2lkNWlkJwogICAgICAgICAgICAgICAgICAgIF0sIHkgPSBPYmplY3Qoby5iKSgxMzEsICdpZDVJZCcpLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnaWQ1SWQnLAogICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogMTMxLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiAnc3RyaW5nJyA9PSB0eXBlb2YgZS51bml2ZXJzYWxfdWlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGUudW5pdmVyc2FsX3VpZCwgbiA9IGUubGlua190eXBlIHx8IG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBUKHIpLCBhID0gTyh0LCBvLmNvbnRyb2xHcm91cFBjdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgITAgPT09IG8uZW5hYmxlZCAmJiB2b2lkIDAgPT09IGEgPyBkLmxvZ0Vycm9yKHYgKyAnQS9CIFRlc3RpbmcgY29udHJvbEdyb3VwUGN0IG11c3QgYmUgYSBudW1iZXIgPj0gMCBhbmQgPD0gMSEgU2tpcHBpbmcgQS9CIFRlc3RpbmcnKSA6ICEwID09PSBvLmVuYWJsZWQgJiYgITAgPT09IGEgPyAoZC5sb2dJbmZvKHYgKyAnQS9CIFRlc3RpbmcgRW5hYmxlZCAtIHVzZXIgaXMgaW4gdGhlIENvbnRyb2wgR3JvdXAsIHNvIHRoZSBJRDUgSUQgaXMgTk9UIGV4cG9zZWQnKSwgdCA9ICcnLCBuID0gMCkgOiAhMCA9PT0gby5lbmFibGVkICYmIGQubG9nSW5mbyh2ICsgJ0EvQiBUZXN0aW5nIEVuYWJsZWQgLSB1c2VyIGlzIE5PVCBpbiB0aGUgQ29udHJvbCBHcm91cCwgc28gdGhlIElENSBJRCBpcyBleHBvc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkNWlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQ6IHsgbGlua1R5cGU6IG4gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITAgPT09IG8uZW5hYmxlZCAmJiBkLmRlZXBTZXRWYWx1ZShpLCAnaWQ1aWQuZXh0LmFiVGVzdGluZ0NvbnRyb2xHcm91cCcsIHZvaWQgMCAhPT0gYSAmJiBhKSwgZC5sb2dJbmZvKHYgKyAnRGVjb2RlZCBJRCcsIGkpLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKG8sIGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTKG8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGEgPSAnaHR0cHM6Ly9pZDUtc3luYy5jb20vZy92Mi8nLmNvbmNhdChvLnBhcmFtcy5wYXJ0bmVyLCAnLmpzb24nKSwgbiA9IGUgJiYgJ2Jvb2xlYW4nID09IHR5cGVvZiBlLmdkcHJBcHBsaWVzICYmIGUuZ2RwckFwcGxpZXMgPyAxIDogMCwgaSA9IGwudXNwRGF0YUhhbmRsZXIuZ2V0Q29uc2VudERhdGEoKSwgcyA9IE9iamVjdChnLmEpKCksIGMgPSByICYmIHIuc2lnbmF0dXJlID8gci5zaWduYXR1cmUgOiAoSS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LmdldENvb2tpZShlKSAmJiAodCA9IEpTT04ucGFyc2UoeS5nZXRDb29raWUoZSkpIHx8IHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdCAmJiB0LnNpZ25hdHVyZSB8fCAnJyksIHAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyOiBvLnBhcmFtcy5wYXJ0bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RwcjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iUGFnZTogXyhvLnBhcmFtcy5wYXJ0bmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG86ICdwYmpzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmOiBzLnJlZmVyZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHMucmVhY2hlZFRvcCA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTogcy5zdGFja1swXSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY6ICc0LjM2LjAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW4gfHwgdm9pZCAwID09PSBlLmNvbnNlbnRTdHJpbmcgfHwgZC5pc0VtcHR5KGUuY29uc2VudFN0cmluZykgfHwgZC5pc0VtcHR5U3RyKGUuY29uc2VudFN0cmluZykgfHwgKHAuZ2Rwcl9jb25zZW50ID0gZS5jb25zZW50U3RyaW5nKSwgdm9pZCAwID09PSBpIHx8IGQuaXNFbXB0eShpKSB8fCBkLmlzRW1wdHlTdHIoaSkgfHwgKHAudXNfcHJpdmFjeSA9IGkpLCB2b2lkIDAgPT09IGMgfHwgZC5pc0VtcHR5U3RyKGMpIHx8IChwLnMgPSBjKSwgdm9pZCAwID09PSBvLnBhcmFtcy5wZCB8fCBkLmlzRW1wdHlTdHIoby5wYXJhbXMucGQpIHx8IChwLnBkID0gby5wYXJhbXMucGQpLCB2b2lkIDAgPT09IG8ucGFyYW1zLnByb3ZpZGVyIHx8IGQuaXNFbXB0eVN0cihvLnBhcmFtcy5wcm92aWRlcikgfHwgKHAucHJvdmlkZXIgPSBvLnBhcmFtcy5wcm92aWRlciksICEwID09PSBUKG8pLmVuYWJsZWQgJiYgZC5kZWVwU2V0VmFsdWUocCwgJ2ZlYXR1cmVzLmFiJywgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBKU09OLnBhcnNlKGUpLCBkLmxvZ0luZm8odiArICdyZXNwb25zZSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXInLCByKSwgRChvLnBhcmFtcy5wYXJ0bmVyLCAwKSwgci5wcml2YWN5ICYmIEMoZiwgSlNPTi5zdHJpbmdpZnkoci5wcml2YWN5KSwgbSksIG8uc3RvcmFnZS50eXBlID09PSBiICYmICh0ID0gby5wYXJhbXMucGFydG5lciwgZC5sb2dJbmZvKHYgKyAncmVtb3ZpbmcgbGVnYWN5IGNvb2tpZXMnKSwgSS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkuc2V0Q29va2llKCcnLmNvbmNhdChlKSwgJyAnLCBoKC0xKSksIHkuc2V0Q29va2llKCcnLmNvbmNhdChlLCAnX25iJyksICcgJywgaCgtMSkpLCB5LnNldENvb2tpZSgnJy5jb25jYXQoZSwgJ18nKS5jb25jYXQodCwgJ19uYicpLCAnICcsIGgoLTEpKSwgeS5zZXRDb29raWUoJycuY29uY2F0KGUsICdfbGFzdCcpLCAnICcsIGgoLTEpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dFcnJvcih2ICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dFcnJvcih2ICsgJ2dldElkIGZldGNoIGVuY291bnRlcmVkIGFuIGVycm9yJywgZSksIG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dJbmZvKHYgKyAncmVxdWVzdGluZyBhbiBJRCBmcm9tIHRoZSBzZXJ2ZXInLCBwKSwgT2JqZWN0KHUuYSkoYSwgZSwgSlNPTi5zdHJpbmdpZnkocCksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZElkOiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMoZSksIF8oZSAmJiBlLnBhcmFtcyAmJiBlLnBhcmFtcy5wYXJ0bmVyIHx8IDApLCBkLmxvZ0luZm8odiArICd1c2luZyBjYWNoZWQgSUQnLCB0KSwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBTKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLnBhcmFtcyAmJiBlLnBhcmFtcy5wYXJ0bmVyICYmICdudW1iZXInID09IHR5cGVvZiBlLnBhcmFtcy5wYXJ0bmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnN0b3JhZ2UgJiYgZS5zdG9yYWdlLnR5cGUgJiYgZS5zdG9yYWdlLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zdG9yYWdlLnR5cGUgIT09IGIgJiYgZC5sb2dXYXJuKHYgKyAnc3RvcmFnZSB0eXBlIHJlY29tbWVuZGVkIHRvIGJlIFwnJy5jb25jYXQoYiwgJ1wnLiBJbiBhIGZ1dHVyZSByZWxlYXNlIHRoaXMgbWF5IGJlY29tZSBhIHN0cmljdCByZXF1aXJlbWVudCcpKSwgZS5zdG9yYWdlLm5hbWUgIT09IGEgJiYgZC5sb2dXYXJuKHYgKyAnc3RvcmFnZSBuYW1lIHJlY29tbWVuZGVkIHRvIGJlIFwnJy5jb25jYXQoYSwgJ1wnLiBJbiBhIGZ1dHVyZSByZWxlYXNlIHRoaXMgbWF5IGJlY29tZSBhIHN0cmljdCByZXF1aXJlbWVudCcpKSwgMTsKICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dFcnJvcih2ICsgJ3N0b3JhZ2UgcmVxdWlyZWQgdG8gYmUgc2V0Jyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nRXJyb3IodiArICdwYXJ0bmVyIHJlcXVpcmVkIHRvIGJlIGRlZmluZWQgYXMgYSBudW1iZXInKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgODY0MDAwMDAgKiBlKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdChhLCAnXycpLmNvbmNhdChlLCAnX25iJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBEKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICBDKGMoZSksIHIsIG0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBFKGMoZSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByID8gcGFyc2VJbnQocikgOiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwKGUpICsgMTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRChlLCByKSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0geS5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZSgnJy5jb25jYXQoZSwgJ19leHAnKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnID09PSByIHx8IHIgJiYgMCA8IG5ldyBEYXRlKHIpLmdldFRpbWUoKSAtIERhdGUubm93KCkgPyB5LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGUpIDogKHkucmVtb3ZlRGF0YUZyb21Mb2NhbFN0b3JhZ2UoZSksIG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQyhlLCByLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgeS5zZXREYXRhSW5Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KGUsICdfZXhwJyksIGgodCkpLCB5LnNldERhdGFJbkxvY2FsU3RvcmFnZSgnJy5jb25jYXQoZSksIHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5wYXJhbXMgJiYgZS5wYXJhbXMuYWJUZXN0aW5nIHx8IHsgZW5hYmxlZDogITEgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE8oZSwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgIGlmICghKCFkLmlzTnVtYmVyKHIpIHx8IHIgPCAwIHx8IDEgPCByKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgodCA9IGUpID8gKGQuY3lyYjUzSGFzaCh0KSAlIGkgKyBpKSAlIGkgOiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBpKSkgPCByICogaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdChuLmUpKCd1c2VySWQnLCBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs1MDRdKTsKICAgICAgICBwYmpzQ2h1bmsoWzI1OV0sIHsKICAgICAgICAgICAgNTA5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gbig1MTApOwogICAgICAgICAgICB9LAogICAgICAgICAgICA1MTA6IGZ1bmN0aW9uIChlLCB0LCBuKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgbi5kKHQsICdzdG9yYWdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnaWRlbnRpdHlMaW5rU3VibW9kdWxlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgZCA9IG4oMCksIHIgPSBuKDQpLCBpID0gbigxMSksIG8gPSBuKDcpLCBjID0gT2JqZWN0KG8uYikoKSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2lkZW50aXR5TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiA5NywKICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgaWRsX2VudjogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSAmJiBlLnBhcmFtcyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuICYmICdzdHJpbmcnID09IHR5cGVvZiBuLnBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdCAmJiAnYm9vbGVhbicgPT0gdHlwZW9mIHQuZ2RwckFwcGxpZXMgJiYgdC5nZHByQXBwbGllcyA/IDEgOiAwLCBvID0gaSA/IHQuY29uc2VudFN0cmluZyA6ICcnLCByID0gMiA9PT0gZC5kZWVwQWNjZXNzKHQsICd2ZW5kb3JEYXRhLnRjZlBvbGljeVZlcnNpb24nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWkgfHwgbyAmJiAnJyAhPT0gbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICdodHRwczovL2FwaS5ybGNkbi5jb20vYXBpL2lkZW50aXR5L2VudmVsb3BlP3BpZD0nLmNvbmNhdChuLnBpZCkuY29uY2F0KGkgPyAociA/ICcmY3Q9NCZjdj0nIDogJyZjdD0xJmN2PScpICsgbyA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hdHMgPyAoZC5sb2dJbmZvKCdpZGVudGl0eUxpbms6IEFUUyBleGlzdHMhJyksIHdpbmRvdy5hdHMucmV0cmlldmVFbnZlbG9wZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gKGQubG9nSW5mbygnaWRlbnRpdHlMaW5rOiBBbiBlbnZlbG9wZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gQVRTIScpLCBsKCEwKSwgdChKU09OLnBhcnNlKGUpLmVudmVsb3BlKSkgOiBhKGMsIHQsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSA6IGEoYywgdCwgbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nSW5mbygnaWRlbnRpdHlMaW5rOiBDb25zZW50IHN0cmluZyBpcyByZXF1aXJlZCB0byBjYWxsIGVudmVsb3BlIEFQSS4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nRXJyb3IoJ2lkZW50aXR5TGluazogcmVxdWlyZXMgcGFydG5lciBpZCB0byBiZSBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGksIG8gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQubG9nSW5mbyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4odCAmJiB0LmVudmVsb3BlID8gdC5lbnZlbG9wZSA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmxvZ0luZm8oJ2lkZW50aXR5TGluazogaWRlbnRpdHlMaW5rOiBJRCBmZXRjaCBlbmNvdW50ZXJlZCBhbiBlcnJvcicsIGUpLCBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdC5ub3RVc2UzUCB8fCBjLmdldENvb2tpZSgnX2xyX3JldHJ5X3JlcXVlc3QnKSB8fCAoKGkgPSBuZXcgRGF0ZSgpKS5zZXRUaW1lKGkuZ2V0VGltZSgpICsgMzYwMDAwMCksIGMuc2V0Q29va2llKCdfbHJfcmV0cnlfcmVxdWVzdCcsICd0cnVlJywgaS50b1VUQ1N0cmluZygpKSwgZC5sb2dJbmZvKCdpZGVudGl0eUxpbms6IEEgM1AgcmV0cmlldmFsIGlzIGF0dGVtcHRlZCEnKSwgbCghMSksIE9iamVjdChyLmEpKGUsIG8sIHZvaWQgMCwgewogICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIHQuc2V0VGltZSh0LmdldFRpbWUoKSArIDI1OTIwMDAwMDApLCBjLnNldENvb2tpZSgnX2xyX2Vudl9zcmNfYXRzJywgZSwgdC50b1VUQ1N0cmluZygpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdChpLmUpKCd1c2VySWQnLCBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs1MDldKTsKICAgICAgICBwYmpzQ2h1bmsoWzI1MV0sIHsKICAgICAgICAgICAgNTI3OiBmdW5jdGlvbiAoZSwgbiwgcikgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gcig1MjgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA1Mjg6IGZ1bmN0aW9uIChlLCBuLCByKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgci5kKG4sICdpbnRlbnRJcUlkU3VibW9kdWxlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgdCA9IHIoMCksIG8gPSByKDQpLCBpID0gcigxMSksIGMgPSAnaW50ZW50SXFJZCcsIHUgPSAnTkEnOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJycgIT0gZSAmJiBlICE9IHUgJiYgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZSA9IEpTT04ucGFyc2UoZSkpICYmIGUuUkVTVUxUICE9IHU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxvZ0Vycm9yKGUpLCAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBkID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGMsCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYShlKSA/IHsgaW50ZW50SXFJZDogZSB9IDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZSAmJiBlLnBhcmFtcyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgJ251bWJlcicgPT0gdHlwZW9mIG4ucGFydG5lcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnaHR0cHM6Ly9hcGkuaW50ZW50aXEuY29tL3Byb2ZpbGVzX2VuZ2luZS9Qcm9maWxlc0VuZ2luZVNlcnZsZXQ/YXQ9MzkmbWk9MTAmZHBpPScuY29uY2F0KG4ucGFydG5lciwgJyZwdD0xNyZkcG49MScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSBuLnBjaWQgPyAnJnBjaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChuLnBjaWQpIDogJycsIHIgKz0gbi5wYWkgPyAnJnBhaT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KG4ucGFpKSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEoZSkgPyBuKGUpIDogbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubG9nRXJyb3IoJycuY29uY2F0KGMsICc6IElEIGZldGNoIGVuY291bnRlcmVkIGFuIGVycm9yJyksIGUpLCBuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmEpKHIsIGUsIHZvaWQgMCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0LmxvZ0Vycm9yKCdVc2VyIElEIC0gaW50ZW50SXFJZCBzdWJtb2R1bGUgcmVxdWlyZXMgYSB2YWxpZCBwYXJ0bmVyIHRvIGJlIGRlZmluZWQnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0KGkuZSkoJ3VzZXJJZCcsIGQpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzUyN10pOwogICAgICAgIHBianNDaHVuayhbMjQ2XSwgewogICAgICAgICAgICA1Mzk6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDU0MCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDU0MDogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmQociwgJ3NwZWMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBEID0gdCgwKSwgVCA9IHQoMiksIEogPSB0KDMpLCBpID0gdCgxMCksIGYgPSB0Lm4oaSksIG4gPSB0KDU0MSksIHMgPSB0Lm4obiksIG8gPSB0KDEpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZSk7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhKGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSB0ICYmIGUuY29uc3RydWN0b3IgJiYgKHQgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IHQgfHwgJ1NldCcgPT09IHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSB0IHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLicpOwogICAgICAgICAgICAgICAgICAgIH0oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGEoZSwgcikgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHIgfHwgciA+IGUubGVuZ3RoKSAmJiAociA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgaSA9IG5ldyBBcnJheShyKTsgdCA8IHI7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgaVt0XSA9IGVbdF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKHIsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgaSA9IE9iamVjdC5rZXlzKHIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmICh0ID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKSwgZSAmJiAodCA9IHQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsIGUpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgfSkpLCBpLnB1c2guYXBwbHkoaSwgdCkpLCBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gUihuKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBudWxsICE9IGFyZ3VtZW50c1tlXSA/IGFyZ3VtZW50c1tlXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBlICUgMiA/IGQoT2JqZWN0KHMpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIHQsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gbiwgaSA9IHNbdCA9IGVdLCB0IGluIHIgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgdCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHJbdF0gPSBpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobiwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocykpIDogZChPYmplY3QocykpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHMsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChVID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmICdzeW1ib2wnID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiBlLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgZSAhPT0gU3ltYm9sLnByb3RvdHlwZSA/ICdzeW1ib2wnIDogdHlwZW9mIGU7CiAgICAgICAgICAgICAgICAgICAgfSkoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcSA9ICdyb3VuZGVsJywgeSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgVC5iLAogICAgICAgICAgICAgICAgICAgICAgICBULmQKICAgICAgICAgICAgICAgICAgICBdLCBiID0gMTAwLCBnID0gMzAwLCBoID0gMzYwMCwgdiA9ICEwLCB4ID0geyBKUFk6IDEgfSwgcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgUEJKUzogJ3AnLAogICAgICAgICAgICAgICAgICAgICAgICBJWDogJ3gnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEMoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0ge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaWQgPSBlLmJpZElkLCByLmV4dCA9IHt9LCByLmV4dC5zaXRlSUQgPSBlLnBhcmFtcy5zaXRlSWQsICFlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnaWQnKSB8fCAnc3RyaW5nJyAhPSB0eXBlb2YgZS5wYXJhbXMuaWQgJiYgJ251bWJlcicgIT0gdHlwZW9mIGUucGFyYW1zLmlkID8gci5leHQuc2lkID0gJycuY29uY2F0KGUucGFyYW1zLnNpemVbMF0sICd4JykuY29uY2F0KGUucGFyYW1zLnNpemVbMV0pIDogci5leHQuc2lkID0gU3RyaW5nKGUucGFyYW1zLmlkKSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgciwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCwgbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUucGFyYW1zLmJpZEZsb29yICYmIGUucGFyYW1zLmJpZEZsb29yQ3VyICYmIChpID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3I6IGUucGFyYW1zLmJpZEZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6IGUucGFyYW1zLmJpZEZsb29yQ3VyCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBELmlzRm4oZS5nZXRGbG9vcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMsIG8gPSAnKicsIGEgPSAnKic7CiAgICAgICAgICAgICAgICAgICAgICAgIHQgJiYgRC5jb250YWlucyh5LCB0KSAmJiAoYSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzID0gcltvID0gdF0pLncsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmgKICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZS5nZXRGbG9vcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBELmxvZ1dhcm4oJ3ByaWNlRmxvb3JzIG1vZHVsZSBjYWxsIGdldEZsb29yIGZhaWxlZCwgZXJyb3IgOiAnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaSAmJiBuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5jdXJyZW5jeSAhPT0gbi5jdXJyZW5jeSA/IHZvaWQgRC5sb2dXYXJuKCdUaGUgYmlkIGZsb29yIGN1cnJlbmN5IG1pc21hdGNoIGJldHdlZW4gSVggcGFyYW1zIGFuZCBwcmljZUZsb29ycyBtb2R1bGUgY29uZmlnJykgOiB2b2lkIChpLmZsb29yID4gbi5mbG9vciA/IChyLmJpZGZsb29yID0gaS5mbG9vciwgci5iaWRmbG9vcmN1ciA9IGkuY3VycmVuY3ksIHIuZXh0LmZsID0gcC5JWCkgOiAoci5iaWRmbG9vciA9IG4uZmxvb3IsIHIuYmlkZmxvb3JjdXIgPSBuLmN1cnJlbmN5LCByLmV4dC5mbCA9IHAuUEJKUykpOwogICAgICAgICAgICAgICAgICAgIG4gPyAoci5iaWRmbG9vciA9IG4uZmxvb3IsIHIuYmlkZmxvb3JjdXIgPSBuLmN1cnJlbmN5LCByLmV4dC5mbCA9IHAuUEJKUykgOiBpID8gKHIuYmlkZmxvb3IgPSBpLmZsb29yLCByLmJpZGZsb29yY3VyID0gaS5jdXJyZW5jeSwgci5leHQuZmwgPSBwLklYKSA6IEQubG9nSW5mbygnSVggQmlkIEFkYXB0ZXI6IE5vIGZsb29ycyBhdmFpbGFibGUsIG5vIGZsb29ycyBhcHBsaWVkJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSAmJiAyID09PSBlLmxlbmd0aCAmJiBzKCkoZVswXSkgJiYgcygpKGVbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gayhlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKEkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlWzBdID09PSByWzBdICYmIGVbMV0gPT09IHJbMV07CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZVt0XVswXSA9PT0gclswXSAmJiBlW3RdWzFdID09PSByWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBGKGUsIHIsIHQsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICdodHRwczovL2h0bGIuY2FzYWxlbWVkaWEuY29tL2N5Z251cycsIHMgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXZlcmFtcC5jb20nOiAnaWRsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldGlkLmRlJzogJ05FVElEJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldXN0YXIuYml6JzogJ2ZhYnJpY2tJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6ZW90YXAuY29tJzogJ3plb3RhcElkUGx1cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1aWRhcGkuY29tJzogJ1VJRDInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdCA9IFtdLCBpID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRC5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcltlW25dLnNvdXJjZV0gJiYgRC5kZWVwQWNjZXNzKGVbbl0sICd1aWRzLjAnKSAmJiAoaVtlW25dLnNvdXJjZV0gPSAxLCBlW25dLnVpZHNbMF0uZXh0ID0geyBydGlQYXJ0bmVyOiByW2Vbbl0uc291cmNlXSB9LCBkZWxldGUgZVtuXS51aWRzWzBdLmF0eXBlLCB0LnB1c2goZVtuXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1NlbmQ6IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlblNvdXJjZXM6IGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0oRC5kZWVwQWNjZXNzKGUsICcwLnVzZXJJZEFzRWlkcycpKSwgbyA9IHMudG9TZW5kOwogICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuaGVhZGVydGFnICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHdpbmRvdy5oZWFkZXJ0YWcuZ2V0SWRlbnRpdHlJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhLCBkID0gd2luZG93LmhlYWRlcnRhZy5nZXRJZGVudGl0eUluZm8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQgJiYgJ29iamVjdCcgPT09IFUoZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwIGluIGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZC5oYXNPd25Qcm9wZXJ0eShwKSB8fCAhKGEgPSBkW3BdKS5yZXNwb25zZVBlbmRpbmcgJiYgYS5kYXRhICYmICdvYmplY3QnID09PSBVKGEuZGF0YSkgJiYgT2JqZWN0LmtleXMoYS5kYXRhKS5sZW5ndGggJiYgIXMuc2VlblNvdXJjZXNbYS5kYXRhLnNvdXJjZV0gJiYgby5wdXNoKGEuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChyICYmIHIuYmlkZGVyQ29kZSA9PT0gcSAmJiAhcy5zZWVuU291cmNlc1snbGl2ZXJhbXAuY29tJ10pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IHt9OwogICAgICAgICAgICAgICAgICAgIGMuaWQgPSBlWzBdLmJpZGRlclJlcXVlc3RJZCwgYy5zaXRlID0ge30sIGMuZXh0ID0ge30sIGMuZXh0LnNvdXJjZSA9ICdwcmViaWQnLCBjLmV4dC5peGRpYWcgPSB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgbSwgdSA9IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpLCBuID0gdC5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRyYW5zYWN0aW9uSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaW5kZXhPZihlKSA9PT0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZnU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl1OiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbHU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW46ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogJzQuMzYuMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWRzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gZS51c2VySWQgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JyaXRlcG9vbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkNWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpcGJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYWxvSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3JpdGVvSWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG90YW1lUGFub3JhbWFJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXJrbGVJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJyYWJsZUlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvbm5lY3RpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGFyZWRpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YXBhZElkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YW50Y2FzdElkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B1YmNpZCcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRC5kZWVwQWNjZXNzKHIsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0WzBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlID0gMDsgZSA8IG4ubGVuZ3RoOyBlKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWZ1bmN0aW9uIChyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gdC5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRyYW5zYWN0aW9uSWQgPT09IG5bcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pWzBdLCBELmRlZXBBY2Nlc3MoaSwgJ21lZGlhVHlwZXMnKSAmJiAoMSA8IE9iamVjdC5rZXlzKGkubWVkaWFUeXBlcykubGVuZ3RoICYmIHMubWZ1KyssIEQuZGVlcEFjY2VzcyhpLCAnbWVkaWFUeXBlcy5uYXRpdmUnKSAmJiBzLm51KyssIEQuZGVlcEFjY2VzcyhpLCAnbWVkaWFUeXBlcy5iYW5uZXInKSAmJiBzLmJ1KyssICdvdXRzdHJlYW0nID09PSBELmRlZXBBY2Nlc3MoaSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpICYmIChzLm91KyssIGUgPSAnb2JqZWN0JyA9PT0gVShELmRlZXBBY2Nlc3MoaSwgJ3JlbmRlcmVyJykgfHwgRC5kZWVwQWNjZXNzKGksICdtZWRpYVR5cGVzLnZpZGVvLnJlbmRlcmVyJykpLCBzLnJlbiA9IHMucmVuICYmIGUgPyBELmRlZXBBY2Nlc3MocywgJ3JlbicpIDogZSksICdpbnN0cmVhbScgPT09IEQuZGVlcEFjY2VzcyhpLCAnbWVkaWFUeXBlcy52aWRlby5jb250ZXh0JykgJiYgcy5pdSsrLCBzLmFsbHUrKyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGwgaW4gdSkKICAgICAgICAgICAgICAgICAgICAgICAgYy5leHQuaXhkaWFnW2xdID0gdVtsXTsKICAgICAgICAgICAgICAgICAgICBlWzBdLnNjaGFpbiAmJiAoYy5zb3VyY2UgPSB7IGV4dDogeyBzY2hhaW46IGVbMF0uc2NoYWluIH0gfSksIDAgPCBvLmxlbmd0aCAmJiAoYy51c2VyID0ge30sIGMudXNlci5laWRzID0gbyksIGRvY3VtZW50LnJlZmVycmVyICYmICcnICE9PSBkb2N1bWVudC5yZWZlcnJlciAmJiAoYy5zaXRlLnJlZiA9IGRvY3VtZW50LnJlZmVycmVyKSwgciAmJiAoci5nZHByQ29uc2VudCAmJiAoKG0gPSByLmdkcHJDb25zZW50KS5oYXNPd25Qcm9wZXJ0eSgnZ2RwckFwcGxpZXMnKSAmJiAoYy5yZWdzID0geyBleHQ6IHsgZ2RwcjogbS5nZHByQXBwbGllcyA/IDEgOiAwIH0gfSksIG0uaGFzT3duUHJvcGVydHkoJ2NvbnNlbnRTdHJpbmcnKSAmJiAoYy51c2VyID0gYy51c2VyIHx8IHt9LCBjLnVzZXIuZXh0ID0geyBjb25zZW50OiBtLmNvbnNlbnRTdHJpbmcgfHwgJycgfSwgbS5oYXNPd25Qcm9wZXJ0eSgnYWRkdGxDb25zZW50JykgJiYgbS5hZGR0bENvbnNlbnQgJiYgKGMudXNlci5leHQuY29uc2VudGVkX3Byb3ZpZGVyc19zZXR0aW5ncyA9IHsgY29uc2VudGVkX3Byb3ZpZGVyczogbS5hZGR0bENvbnNlbnQgfSkpKSwgci51c3BDb25zZW50ICYmIEQuZGVlcFNldFZhbHVlKGMsICdyZWdzLmV4dC51c19wcml2YWN5Jywgci51c3BDb25zZW50KSwgci5yZWZlcmVySW5mbyAmJiAoYy5zaXRlLnBhZ2UgPSByLnJlZmVyZXJJbmZvLnJlZmVyZXIpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IHt9LCB5ID0gciAmJiByLmJpZGRlckNvZGUgfHwgJ2l4JywgYiA9IEouYi5nZXRDb25maWcoeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvYmplY3QnID09PSBVKGIuZmlyc3RQYXJ0eURhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZyA9IGIuZmlyc3RQYXJ0eURhdGEsIGggPSAnPyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB2IGluIGcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5oYXNPd25Qcm9wZXJ0eSh2KSAmJiAoaCArPSAnJy5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KHYpLCAnPScpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZ1t2XSksICcmJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGguc2xpY2UoMCwgLTEpLCBjLnNpdGUucGFnZSArPSBoOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICdudW1iZXInID09IHR5cGVvZiBiLnRpbWVvdXQgJiYgKGYudCA9IGIudGltZW91dCksICdib29sZWFuJyA9PSB0eXBlb2YgYi5kZXRlY3RNaXNzaW5nU2l6ZXMgPyBjLmV4dC5peGRpYWcuZG1zID0gYi5kZXRlY3RNaXNzaW5nU2l6ZXMgOiBjLmV4dC5peGRpYWcuZG1zID0gITA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGYucyA9IGVbMF0ucGFyYW1zLnNpdGVJZCwgZi52ID0gaSwgZi5hYyA9ICdqJywgZi5zZCA9IDEsIDguMSA9PT0gaSAmJiAoZi5uZiA9IDEpOwogICAgICAgICAgICAgICAgICAgIHZhciB4ID0gW10sIEkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZgogICAgICAgICAgICAgICAgICAgICAgICB9LCBPID0gbmV3IEJsb2IoWycnLmNvbmNhdChJLnVybCkuY29uY2F0KEQucGFyc2VRdWVyeVN0cmluZ1BhcmFtZXRlcnMoUihSKHt9LCBJLmRhdGEpLCB7fSwgeyByOiBKU09OLnN0cmluZ2lmeShjKSB9KSkpXSkuc2l6ZSwgdyA9IE8sIFAgPSAwLCBTID0gMCwgeiA9IDA7CiAgICAgICAgICAgICAgICAgICAgYy5leHQuaXhkaWFnLm1zZCA9IDAsIGMuZXh0Lml4ZGlhZy5tc2kgPSAwLCBjLmltcCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIEEsIFQsIEMsIGosIGssIEYgPSAwLCBFID0gT2JqZWN0LmtleXModCksIEIgPSBbXTsgRiA8IEUubGVuZ3RoICYmIHgubGVuZ3RoIDwgNDspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdFtFW0ZdXS5oYXNPd25Qcm9wZXJ0eSgnbWlzc2luZ0NvdW50JykgJiYgKHogPSB0W0VbRl1dLm1pc3NpbmdDb3VudCksIE8gPCA4MDAwID8gZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbmV3IEJsb2IoW2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSldKS5zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyByIDwgdDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eSgnbWlzc2luZ0ltcHMnKSAmJiAwIDwgZS5taXNzaW5nSW1wcy5sZW5ndGggPyBlLm1pc3NpbmdJbXBzLnBvcCgpIDogZS5oYXNPd25Qcm9wZXJ0eSgnaXhJbXBzJykgJiYgMCA8IGUuaXhJbXBzLmxlbmd0aCAmJiBlLml4SW1wcy5wb3AoKSwgdCA9IG5ldyBCbG9iKFtlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoZSkpXSkuc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSh0W0VbRl1dLCA4MDAwIC0gTykgOiBELmxvZ0Vycm9yKCdpeCBiaWRkZXI6IEJhc2UgcmVxdWVzdCBzaXplIGhhcyBleGNlZWRlZCBtYXhpbXVtIHJlcXVlc3Qgc2l6ZS4nKSwgdFtFW0ZdXS5oYXNPd25Qcm9wZXJ0eSgnbWlzc2luZ0ltcHMnKSAmJiAoUyA9IHRbRVtGXV0ubWlzc2luZ0ltcHMubGVuZ3RoKSwgKHcgKz0gbmV3IEJsb2IoW2VuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0W0VbRl1dKSldKS5zaXplKSA8IDgwMDAgPyAoKEEgPSBjLmltcCkucHVzaC5hcHBseShBLCBOKHRbRVtGXV0uaXhJbXBzKSksIGMuZXh0Lml4ZGlhZy5tc2QgKz0geiwgYy5leHQuaXhkaWFnLm1zaSArPSBTLCB0W0VbRl1dLmhhc093blByb3BlcnR5KCdtaXNzaW5nSW1wcycpICYmIEIucHVzaC5hcHBseShCLCBOKHRbRVtGXV0ubWlzc2luZ0ltcHMpKSwgRisrKSA6IChDID0gRC5kZWVwQ2xvbmUoZiksIChUID0gYy5pbXApLnB1c2guYXBwbHkoVCwgTihCKSksIGMuZXh0Lml4ZGlhZy5zbiA9IFAsIEMuc24gPSBQLCBQKyssIEMuciA9IEpTT04uc3RyaW5naWZ5KGMpLCB4LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IEMKICAgICAgICAgICAgICAgICAgICAgICAgfSksIEIgPSBbXSwgdyA9IE8sIGMuaW1wID0gW10sIFMgPSB6ID0gMCwgYy5leHQuaXhkaWFnLm1zZCA9IDAsIGMuZXh0Lml4ZGlhZy5tc2kgPSAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE8gPCB3ICYmIHcgPCA4MDAwICYmIHgubGVuZ3RoIDwgNCAmJiAoayA9IEQuZGVlcENsb25lKGYpLCAoaiA9IGMuaW1wKS5wdXNoLmFwcGx5KGosIE4oQikpLCAwIDwgeC5sZW5ndGggJiYgKGMuZXh0Lml4ZGlhZy5zbiA9IFAsIGsuc24gPSBQKSwgay5yID0gSlNPTi5zdHJpbmdpZnkoYyksIHgucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbiwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogawogICAgICAgICAgICAgICAgICAgIH0pKSwgeDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEUoZSwgcikgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJbMF0gPT0gZVt0XVswXSAmJiByWzFdID09IGVbdF1bMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zcGxpY2UodCwgMSksIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYyA9IHsKICAgICAgICAgICAgICAgICAgICBjb2RlOiAnaXgnLAogICAgICAgICAgICAgICAgICAgIGd2bGlkOiAxMCwKICAgICAgICAgICAgICAgICAgICBhbGlhc2VzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBQYnNBbGlhc2luZzogITEKICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogeSwKICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIHQsIGkgPSBELmRlZXBBY2Nlc3MoZSwgJ3BhcmFtcy52aWRlbycpLCBuID0gRC5kZWVwQWNjZXNzKGUsICdwYXJhbXMuc2l6ZScpLCBzID0gRC5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpLCBvID0gRC5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvJyksIGEgPSBELmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpLCBkID0gZS5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ2JpZEZsb29yJyksIHAgPSBlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnYmlkRmxvb3JDdXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJKGUucGFyYW1zLnNpemUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQubG9nRXJyb3IoJ2l4IGJpZGRlciBwYXJhbXM6IGJpZCBzaXplIGhhcyBpbnZhbGlkIGZvcm1hdC4nKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KCdtZWRpYVR5cGUnKSAmJiAhRC5jb250YWlucyh5LCBlLm1lZGlhVHlwZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc093blByb3BlcnR5KCdtZWRpYVR5cGVzJykgJiYgIXMgJiYgIWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghayhlLnNpemVzLCBuKSAmJiAhKGEgJiYgayhhLCBuKSB8fCBzICYmIGsocywgbikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQubG9nRXJyb3IoJ2l4IGJpZGRlciBwYXJhbXM6IGJpZCBzaXplIGlzIG5vdCBpbmNsdWRlZCBpbiBhZCB1bml0IHNpemVzIG9yIHBsYXllciBzaXplLicpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gJiYgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9ICEwLCBtID0gMCwgdSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW1lcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWluZHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heGR1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm90b2NvbHMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07IG0gPCB1Lmxlbmd0aDsgbSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSB1W21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghby5oYXNPd25Qcm9wZXJ0eShsKSAmJiAhaS5oYXNPd25Qcm9wZXJ0eShsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3Byb3RvY29scycgPT09IGwgJiYgKG8uaGFzT3duUHJvcGVydHkoJ3Byb3RvY29sJykgfHwgaS5oYXNPd25Qcm9wZXJ0eSgncHJvdG9jb2wnKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC5sb2dFcnJvcignaXggYmlkZGVyIHBhcmFtczogJyArIGwgKyAnIGlzIG5vdCBpbmNsdWRlZCBpbiBlaXRoZXIgdGhlIGFkdW5pdCBvciBwYXJhbXMgbGV2ZWwnKSwgYyA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnICE9IHR5cGVvZiBlLnBhcmFtcy5zaXRlSWQgJiYgJ251bWJlcicgIT0gdHlwZW9mIGUucGFyYW1zLnNpdGVJZCA/IChELmxvZ0Vycm9yKCdpeCBiaWRkZXIgcGFyYW1zOiBzaXRlSWQgbXVzdCBiZSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlLicpLCAhMSkgOiAhISghZCAmJiAhcCB8fCBkICYmIHAgJiYgKHIgPSBlLnBhcmFtcy5iaWRGbG9vciwgdCA9IGUucGFyYW1zLmJpZEZsb29yQ3VyLCBCb29sZWFuKCdudW1iZXInID09IHR5cGVvZiByICYmICdzdHJpbmcnID09IHR5cGVvZiB0ICYmIHQubWF0Y2goL15bQS1aXXszfSQvKSkpKSB8fCAoRC5sb2dFcnJvcignaXggYmlkZGVyIHBhcmFtczogYmlkRmxvb3IgLyBiaWRGbG9vckN1ciBwYXJhbWV0ZXIgaGFzIGludmFsaWQgZm9ybWF0LicpLCAhMSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCBpLCBuLCBzLCBvLCBhLCBkLCBwLCBjLCBtLCB1LCBsLCBmLCB5LCBiID0gW10sIGcgPSB7fSwgaCA9IHt9LCB2ID0gbnVsbCwgeCA9IHt9LCBJID0gUihSKHt9LCB7IGRldGVjdE1pc3NpbmdTaXplczogITAgfSksIEouYi5nZXRDb25maWcoJ2l4JykpLCBPID0gMDsgTyA8IGUubGVuZ3RoOyBPKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ID0gZVtPXSkubWVkaWFUeXBlICE9PSBULmQgJiYgIUQuZGVlcEFjY2Vzcyh2LCAnbWVkaWFUeXBlcy52aWRlbycpIHx8IHYubWVkaWFUeXBlICE9PSBULmQgJiYgIWsodi5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemUsIHYucGFyYW1zLnNpemUpIHx8IChoLmhhc093blByb3BlcnR5KHYudHJhbnNhY3Rpb25JZCkgfHwgKGhbdi50cmFuc2FjdGlvbklkXSA9IHt9KSwgaFt2LnRyYW5zYWN0aW9uSWRdLmhhc093blByb3BlcnR5KCdpeEltcHMnKSB8fCAoaFt2LnRyYW5zYWN0aW9uSWRdLml4SW1wcyA9IFtdKSwgaFt2LnRyYW5zYWN0aW9uSWRdLml4SW1wcy5wdXNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBDKGUpLCB0ID0gRC5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvJyksIGkgPSBELmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpLCBuID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbWVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5kdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4ZHVyYXRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29scycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvdG9jb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0ZGVsYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYWNlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGluZWFyaXR5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwbWluJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwYWZ0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXR0cicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4ZXh0ZW5kZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pbmJpdHJhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heGJpdHJhdGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JveGluZ2FsbG93ZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXliYWNrbWV0aG9kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGF5YmFja2VuZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVsaXZlcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFuaW9uYWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwaScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFuaW9udHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHMgaW4gKHIudmlkZW8gPSBELmRlZXBDbG9uZShlLnBhcmFtcy52aWRlbyksIHIudmlkZW8udyA9IGUucGFyYW1zLnNpemVbMF0sIHIudmlkZW8uaCA9IGUucGFyYW1zLnNpemVbMV0sIGkgJiYgKCdpbnN0cmVhbScgPT09IGkgPyByLnZpZGVvLnBsYWNlbWVudCA9IDEgOiAnb3V0c3RyZWFtJyA9PT0gaSA/IHIudmlkZW8ucGxhY2VtZW50ID0gNCA6IEQubG9nV2FybignaXggYmlkZGVyIHBhcmFtczogdmlkZW8gY29udGV4dCBcJycuY29uY2F0KGksICdcJyBpcyBub3Qgc3VwcG9ydGVkJykpKSwgdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBuLmluZGV4T2YocykgfHwgci52aWRlby5oYXNPd25Qcm9wZXJ0eShzKSB8fCAoci52aWRlb1tzXSA9IHRbc10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqKGUsIHIsIFQuZCksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHYpKSksICh2Lm1lZGlhVHlwZSA9PT0gVC5iIHx8IEQuZGVlcEFjY2Vzcyh2LCAnbWVkaWFUeXBlcy5iYW5uZXInKSAmJiBrKEQuZGVlcEFjY2Vzcyh2LCAnbWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMnKSwgdi5wYXJhbXMuc2l6ZSkgfHwgIXYubWVkaWFUeXBlICYmICF2Lm1lZGlhVHlwZXMpICYmIChtID0gdm9pZCAwLCAobSA9IEMoYyA9IHYpKS5iYW5uZXIgPSB7fSwgbS5iYW5uZXIudyA9IGMucGFyYW1zLnNpemVbMF0sIG0uYmFubmVyLmggPSBjLnBhcmFtcy5zaXplWzFdLCBtLmJhbm5lci50b3BmcmFtZSA9IEQuaW5JZnJhbWUoKSA/IDAgOiAxLCBqKGMsIG0sIFQuYiksIHQgPSBtLCBnLmhhc093blByb3BlcnR5KHYudHJhbnNhY3Rpb25JZCkgfHwgKGdbdi50cmFuc2FjdGlvbklkXSA9IHt9KSwgZ1t2LnRyYW5zYWN0aW9uSWRdLmhhc093blByb3BlcnR5KCdpeEltcHMnKSB8fCAoZ1t2LnRyYW5zYWN0aW9uSWRdLml4SW1wcyA9IFtdKSwgZ1t2LnRyYW5zYWN0aW9uSWRdLml4SW1wcy5wdXNoKHQpLCBJLmhhc093blByb3BlcnR5KCdkZXRlY3RNaXNzaW5nU2l6ZXMnKSAmJiBJLmRldGVjdE1pc3NpbmdTaXplcyAmJiAobiA9IHgsIHMgPSB0LCBwID0gZCA9IGEgPSBvID0gdm9pZCAwLCBwID0gKGkgPSB2KS50cmFuc2FjdGlvbklkLCBuLmhhc093blByb3BlcnR5KHApID8gKG8gPSBbXSwgbltwXS5oYXNPd25Qcm9wZXJ0eSgnbWlzc2luZ1NpemVzJykgJiYgKG8gPSBuW3BdLm1pc3NpbmdTaXplcyksIEUobywgaS5wYXJhbXMuc2l6ZSksIG5bcF0ubWlzc2luZ1NpemVzID0gbykgOiBELmRlZXBBY2Nlc3MoaSwgJ21lZGlhVHlwZXMuYmFubmVyLnNpemVzJykgJiYgKEUoYSA9IEQuZGVlcENsb25lKGkubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMpLCBpLnBhcmFtcy5zaXplKSwgZCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nU2l6ZXM6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcmVzc2lvbjogcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgbltwXSA9IGQpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdyBpbiB4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHguaGFzT3duUHJvcGVydHkodykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgUCA9IHhbd10ubWlzc2luZ1NpemVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuaGFzT3duUHJvcGVydHkodykgfHwgKGdbd10gPSB7fSksIGdbd10uaGFzT3duUHJvcGVydHkoJ21pc3NpbmdJbXBzJykgfHwgKGdbd10ubWlzc2luZ0ltcHMgPSBbXSwgZ1t3XS5taXNzaW5nQ291bnQgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBTID0geFt3XS5pbXByZXNzaW9uLCB6ID0gMDsgeiA8IFAubGVuZ3RoOyB6KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEEgPSAodSA9IHYsIGwgPSBTLCBmID0gUFt6XSwgeSA9IHZvaWQgMCwgKHkgPSBELmRlZXBDbG9uZShsKSkuZXh0LnNpZCA9ICcnLmNvbmNhdChmWzBdLCAneCcpLmNvbmNhdChmWzFdKSwgeS5iYW5uZXIudyA9IGZbMF0sIHkuYmFubmVyLmggPSBmWzFdLCBqKHUsIHksIFQuYiksIHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnW3ddLm1pc3NpbmdJbXBzLnB1c2goQSksIGdbd10ubWlzc2luZ0NvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IE9iamVjdC5rZXlzKGcpLmxlbmd0aCAmJiBiLnB1c2guYXBwbHkoYiwgTihGKGUsIHIsIGcsIDcuMikpKSwgMCA8IE9iamVjdC5rZXlzKGgpLmxlbmd0aCAmJiBiLnB1c2guYXBwbHkoYiwgTihGKGUsIHIsIGgsIDguMSkpKSwgYjsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaGFzT3duUHJvcGVydHkoJ2JvZHknKSB8fCAhZS5ib2R5Lmhhc093blByb3BlcnR5KCdzZWF0YmlkJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSwgbiwgcywgbywgYSA9IGUuYm9keSwgZCA9IGEuc2VhdGJpZCwgcCA9IDA7IHAgPCBkLmxlbmd0aDsgcCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbcF0uaGFzT3duUHJvcGVydHkoJ2JpZCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBkW3BdLmJpZCwgbSA9IEpTT04ucGFyc2Uoci5kYXRhLnIpLCB1ID0gMDsgdSA8IGMubGVuZ3RoOyB1KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBmdW5jdGlvbiAociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGYoKShlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5pZCA9PT0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShjW3VdLmltcGlkLCBtLmltcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBjW3VdLCBuID0gYS5jdXIsIHMgPSBsLCBvID0gdm9pZCAwLCBvID0ge30sIHguaGFzT3duUHJvcGVydHkobikgPyBvLmNwbSA9IGkucHJpY2UgLyB4W25dIDogby5jcG0gPSBpLnByaWNlIC8gYiwgby5yZXF1ZXN0SWQgPSBpLmltcGlkLCBvLmRlYWxJZCA9IEQuZGVlcEFjY2VzcyhpLCAnZXh0LmRlYWxpZCcpLCBvLm5ldFJldmVudWUgPSB2LCBvLmN1cnJlbmN5ID0gbiwgby5jcmVhdGl2ZUlkID0gaS5oYXNPd25Qcm9wZXJ0eSgnY3JpZCcpID8gaS5jcmlkIDogJy0nLCBELmRlZXBBY2Nlc3MoaSwgJ2V4dC52YXN0dXJsJykgPyAoby52YXN0VXJsID0gaS5leHQudmFzdHVybCwgby53aWR0aCA9IHMudmlkZW8udywgby5oZWlnaHQgPSBzLnZpZGVvLmgsIG8ubWVkaWFUeXBlID0gVC5kLCBvLnR0bCA9IGgpIDogKG8uYWQgPSBpLmFkbSwgby53aWR0aCA9IGkudywgby5oZWlnaHQgPSBpLmgsIG8ubWVkaWFUeXBlID0gVC5iLCBvLnR0bCA9IGcpLCBvLm1ldGEgPSB7fSwgby5tZXRhLm5ldHdvcmtJZCA9IEQuZGVlcEFjY2VzcyhpLCAnZXh0LmRzcGlkJyksIG8ubWV0YS5icmFuZElkID0gRC5kZWVwQWNjZXNzKGksICdleHQuYWR2YnJhbmRpZCcpLCBvLm1ldGEuYnJhbmROYW1lID0gRC5kZWVwQWNjZXNzKGksICdleHQuYWR2YnJhbmQnKSwgaS5hZG9tYWluICYmIDAgPCBpLmFkb21haW4ubGVuZ3RoICYmIChvLm1ldGEuYWR2ZXJ0aXNlckRvbWFpbnMgPSBpLmFkb21haW4pLCB0LnB1c2gobyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJpZFBhcmFtczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQuY29udmVydFR5cGVzKHsgc2l0ZUlEOiAnbnVtYmVyJyB9LCBlKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldFVzZXJTeW5jczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaWZyYW1lRW5hYmxlZCA/IFt7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2lmcmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9qcy1zZWMuaW5kZXh3dy5jb20vdW0vaXhtYXRjaC5odG1sJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0gOiBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0KG8ucmVnaXN0ZXJCaWRkZXIpKGMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzUzOV0pOwogICAgICAgIHBianNDaHVuayhbMl0sIHsKICAgICAgICAgICAgNTczOiBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCg1NzQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA1NzQ6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKG4sICdzdG9yYWdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSksIG4ucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgd2luZG93ICYmIHdpbmRvdy5saVEgJiYgKHdpbmRvdy5saVEgPSBbXSk7CiAgICAgICAgICAgICAgICAgICAgeS5zZXRNb2R1bGVNb2RlKG51bGwpLCB2ID0gITEsIGcgPSBudWxsOwogICAgICAgICAgICAgICAgfSwgdC5kKG4sICdsaXZlSW50ZW50SWRTdWJtb2R1bGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciByID0gdCgwKSwgbyA9IHQoNCksIGkgPSB0KDExKSwgYSA9IHQoNTc1KSwgYyA9IHQoOCksIHUgPSB0KDcpLCBsID0gdCg1NzYpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihuLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIgPSBPYmplY3Qua2V5cyhuKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAodCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobiksIGUgJiYgKHQgPSB0LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCBlKS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgIH0pKSwgci5wdXNoLmFwcGx5KHIsIHQpKSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHMobykgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gbnVsbCAhPSBhcmd1bWVudHNbZV0gPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAlIDIgPyBmKE9iamVjdChpKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuLCB0LCByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG8sIHIgPSBpW3QgPSBlXSwgdCBpbiBuID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIHQsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBuW3RdID0gcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG8sIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGkpKSA6IGYoT2JqZWN0KGkpKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBkID0gJ2xpdmVJbnRlbnRJZCcsIGggPSBPYmplY3QodS5iKShudWxsLCBkKSwgcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYWpheEdldDogZnVuY3Rpb24gKGUsIG4sIHQsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdChvLmIpKHIpKGUsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB2b2lkIDAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEdldDogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qoci50cmlnZ2VyUGl4ZWwpKGUsIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgdiA9ICExLCBnID0gbnVsbDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChnKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAncHJlYmlkJywKICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaGVySWQ6IChlID0gZSB8fCB7fSkucHVibGlzaGVySWQgfHwgJ2FueScKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGUudXJsICYmIChuLnVybCA9IGUudXJsKSwgZS5wYXJ0bmVyICYmIChuLnNvdXJjZSA9IGUucGFydG5lciksIGUuYWpheFRpbWVvdXQgJiYgKG4uYWpheFRpbWVvdXQgPSBlLmFqYXhUaW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciwgbyA9ICh0ID0gZS5saUNvbGxlY3RDb25maWcsIHIgPSB7fSwgKHQgPSB0IHx8IHt9KS5hcHBJZCAmJiAoci5hcHBJZCA9IHQuYXBwSWQpLCB0LmZwaVN0b3JhZ2VTdHJhdGVneSAmJiAoci5zdG9yYWdlU3RyYXRlZ3kgPSB0LmZwaVN0b3JhZ2VTdHJhdGVneSksIHQuZnBpRXhwaXJhdGlvbkRheXMgJiYgKHIuZXhwaXJhdGlvbkRheXMgPSB0LmZwaUV4cGlyYXRpb25EYXlzKSwgdC5jb2xsZWN0b3JVcmwgJiYgKHIuY29sbGVjdG9yVXJsID0gdC5jb2xsZWN0b3JVcmwpLCByKTsKICAgICAgICAgICAgICAgICAgICBvLndyYXBwZXJOYW1lID0gJ3ByZWJpZCcsIG8uaWRlbnRpdHlSZXNvbHV0aW9uQ29uZmlnID0gbiwgby5pZGVudGlmaWVyc1RvUmVzb2x2ZSA9IGUuaWRlbnRpZmllcnNUb1Jlc29sdmUgfHwgW107CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBjLnVzcERhdGFIYW5kbGVyLmdldENvbnNlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgaSAmJiAoby51c1ByaXZhY3lTdHJpbmcgPSBpKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGMuZ2RwckRhdGFIYW5kbGVyLmdldENvbnNlbnREYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgKG8uZ2RwckFwcGxpZXMgPSBhLmdkcHJBcHBsaWVzLCBvLmdkcHJDb25zZW50ID0gYS5jb25zZW50U3RyaW5nKSwgZyA9IHkuZ2V0SW5pdGlhbGl6ZXIoKShvLCBoLCBwKSwgZS5lbWFpbEhhc2ggJiYgZy5wdXNoKHsgaGFzaDogZS5lbWFpbEhhc2ggfSksIGc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KCkgewogICAgICAgICAgICAgICAgICAgICF2ICYmIGcgJiYgKGcuZmlyZSgpLCB2ID0gITApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHkgPSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlTW9kZTogdm9pZCAwLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IGQsCiAgICAgICAgICAgICAgICAgICAgc2V0TW9kdWxlTW9kZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVNb2RlID0gZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldEluaXRpYWxpemVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbWluaW1hbCcgPT09IHRoaXMubW9kdWxlTW9kZSA/IGwuYSA6IGEuYTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHIsIG8gPSBuICYmIG4ucGFyYW1zIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZyB8fCBtKG8pLCB3KCksIGUgJiYgJ3N0cmluZycgPT0gdHlwZW9mIGUudW5pZmllZElkID8gKHIgPSB7IGxpcGJpZDogKHQgPSBlKS51bmlmaWVkSWQgfSwgZGVsZXRlIHQudW5pZmllZElkLCB7IGxpcGI6IHMocyh7fSwgciksIHQpIH0pIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gbShlICYmIGUucGFyYW1zIHx8IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucmVzb2x2ZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubG9nRXJyb3IoJycuY29uY2F0KGQsICc6IElEIGZldGNoIGVuY291bnRlcmVkIGFuIGVycm9yOiAnKSwgZSksIG4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QoaS5lKSgndXNlcklkJywgeSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDU3NTogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHIoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAociA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdC5kKG4sICdhJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2bjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSAnWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JywgaSA9IG5ldyBSZWdFeHAoJ14nLmNvbmNhdChvLCAnJCcpLCAnaScpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZChlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvYmplY3QnID09PSByKGUpID8gSlNPTi5zdHJpbmdpZnkoZSkgOiAnJyArIGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1tvYmplY3QgQXJyYXldJyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGEgPSAhIVN0cmluZy5wcm90b3R5cGUudHJpbTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBhID8gKCcnICsgZSkudHJpbSgpIDogKCcnICsgZSkucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBjKGUpICYmIGMobikgJiYgcChlLnRvTG93ZXJDYXNlKCkpID09PSBwKG4udG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFlICYmICdvYmplY3QnID09PSByKGUpICYmICFoKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzKGUsIDg2NDAwMDAwKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgZSAqIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZyhlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gKHIgPSBuKSAmJiAwIDwgcChyKS5sZW5ndGggPyBbCiAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHYodCkgPyB0KG4pIDogbgogICAgICAgICAgICAgICAgICAgIF0gOiBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnKGUsIG4sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiB1KHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmICF1KG4pICYmIG4ubGVuZ3RoICYmIHIucHVzaChbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCByOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoZSkgPyBlIDoge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIG8gPSB0KGUpLCBpID0gdChuKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByW2VdID0gb1tlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByW2VdID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBTID0gJ19fbGlfX2V2dF9idXMnLCBiID0gJ2xpX2Vycm9ycycsIEkgPSAnbGlwcycsIEMgPSAncHJlX2xpcHMnLCB4ID0gJ19saV9kdWlkJywgRSA9IDEsIE8gPSA1MDAwLCBqID0gJ2h0dHBzOi8vaWR4LmxpYWRtLmNvbS9pZGV4JzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGsoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHdpbmRvdyAmJiB3aW5kb3dbU10gJiYgd2luZG93W1NdLmVtaXQoZSwgbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBSKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBrKGUsIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgRChlLCBuLm1lc3NhZ2UsIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IHQgPyB0IDoge30sIG8gPSBuZXcgRXJyb3IobiB8fCByLm1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgIG8uc3RhY2sgPSByLnN0YWNrLCBvLm5hbWUgPSBlIHx8ICd1bmtub3duIGVycm9yJywgby5saW5lTnVtYmVyID0gci5saW5lTnVtYmVyLCBvLmNvbHVtbk51bWJlciA9IHIuY29sdW1uTnVtYmVyLCBrKGIsIG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFUgPSAwOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlLCByLCB0LCBhKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBlICYmIGUuY29sbGVjdG9yVXJsIHx8ICdodHRwczovL3JwLmxpYWRtLmNvbSc7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkoZSwgJ3AnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIucGl4ZWxHZXQoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuc2VuZHNQaXhlbCgpICYmICh2KGEpICYmIGEoKSwgciA9ICdkdHN0bXA9Jy5jb25jYXQodSgpKSwgaSA9IChvID0gZS5hc1F1ZXJ5U3RyaW5nKCkpID8gJyYnLmNvbmNhdChyKSA6ICc/Jy5jb25jYXQociksIHQoJycuY29uY2F0KGMsICcvJykuY29uY2F0KG4pLmNvbmNhdChvKS5jb25jYXQoaSkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gdSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZS50b1VUQ1N0cmluZygpKS5nZXRUaW1lKCkgKyBlLmdldE1pbGxpc2Vjb25kcygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBzZW5kQWpheDogZnVuY3Rpb24gKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkobiwgJ2onLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIuYWpheEdldChlLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2KHQpICYmIHQoKSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBKU09OLnBhcnNlKGUpLmJha2VyczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBuLmxlbmd0aDsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5waXhlbEdldCgnJy5jb25jYXQoblt0XSwgJz9kdHN0bXA9JykuY29uY2F0KHUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQoJ0NhbGxCYWtlcnMnLCAnRXJyb3Igd2hpbGUgY2FsbGluZyBiYWtlcnMnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvKG4pLCBEKCdBamF4RmFpbGVkJywgZS5tZXNzYWdlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBVKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzZW5kUGl4ZWw6IG8KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gXyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaXplID0gcGFyc2VJbnQoZSkgfHwgNSwgdGhpcy5oID0ge30sIHRoaXMucSA9IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRihlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gJycuY29uY2F0KGUpLCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgyNTUgPCBlLmNoYXJDb2RlQXQocikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCB0ID0gJycsIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIgKz0gMykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMAogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICBvWzBdID0gZS5jaGFyQ29kZUF0KHIpID4+IDIsIG9bMV0gPSAoMyAmIGUuY2hhckNvZGVBdChyKSkgPDwgNCwgZS5sZW5ndGggPiByICsgMSAmJiAob1sxXSB8PSBlLmNoYXJDb2RlQXQociArIDEpID4+IDQsIG9bMl0gPSAoMTUgJiBlLmNoYXJDb2RlQXQociArIDEpKSA8PCAyKSwgZS5sZW5ndGggPiByICsgMiAmJiAob1syXSB8PSBlLmNoYXJDb2RlQXQociArIDIpID4+IDYsIG9bM10gPSA2MyAmIGUuY2hhckNvZGVBdChyICsgMikpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgPT09IG9baV0gPyB0ICs9ICc9JyA6IHQgKz0gMCA8PSAobiA9IG9baV0pICYmIG4gPCA2NCA/IFRbbl0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXy5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgICAgICAgICAgb246IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmhbZV0gfHwgKHRoaXMuaFtlXSA9IFtdKSkucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbjogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eDogdAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9ICh0aGlzLnFbZV0gfHwgW10pLmxlbmd0aCwgbyA9IDA7IG8gPCByOyBvKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFwcGx5KHQsIHRoaXMucVtlXVtvXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgb25jZTogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB0aGlzLCBvID0gdGhpcy5xW2VdIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA8IG8ubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4uYXBwbHkodCwgb1swXSksIHRoaXM7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGkoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm9mZihlLCBpKSwgbi5hcHBseSh0LCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpLl8gPSBuLCB0aGlzLm9uKGUsIGksIHQpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgdCA9ICh0aGlzLmhbZV0gfHwgW10pLnNsaWNlKCksIHIgPSAwLCBvID0gdC5sZW5ndGg7IHIgPCBvOyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W3JdLmZuLmFwcGx5KHRbcl0uY3R4LCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB0aGlzLnFbZV0gfHwgKHRoaXMucVtlXSA9IFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkubGVuZ3RoID49IHRoaXMuc2l6ZSAmJiBpLnNoaWZ0KCksIGkucHVzaChuKSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG9mZjogZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLmhbZV0sIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSAwLCBpID0gdC5sZW5ndGg7IG8gPCBpOyBvKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtvXS5mbiAhPT0gbiAmJiB0W29dLmZuLl8gIT09IG4gJiYgci5wdXNoKHRbb10pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5sZW5ndGggPyB0aGlzLmhbZV0gPSByIDogZGVsZXRlIHRoaXMuaFtlXSwgdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIFQgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBBKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRihlKSB8fCAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBQID0gL1srL118PSskL2csIEcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICcrJzogJy0nLAogICAgICAgICAgICAgICAgICAgICAgICAnLyc6ICdfJwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBWKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gR1tlXSB8fCAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFEoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbCwgdCA9IGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lKFswLTlBLUZdezJ9KS9nLCBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIG4pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBuID0gd2luZG93ICYmIHYod2luZG93LmJ0b2EpID8gd2luZG93LmJ0b2EgOiBBOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbiA9IEE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuKHQpLnJlcGxhY2UoUCwgVik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgSiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gL1xTKyhAfCU0MClcUytcLlxTKy87CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEooKS50ZXN0KGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFcgPSAvIihbXiJdKyhAfCU0MClbXiJdK1suXVthLXpdKihccyspPykoXFwifCIpLzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBXLnRlc3QoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgPT0gdHlwZW9mIG4gJiYgTShwKG4pKSA/ICcqKioqKioqKionIDogbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIHEgPSBbXSwgQiA9IDA7IEIgPCA2NDspCiAgICAgICAgICAgICAgICAgICAgcVtCXSA9IDAgfCA0Mjk0OTY3Mjk2ICogTWF0aC5zaW4oKytCICUgTWF0aC5QSSk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAkKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCwgciwgbywgaSwgYSA9IFtdLCBjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDE3MzI1ODQxOTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDIzMjMzNDE3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzE3MzM4NzgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjg1Mzc3NTIwCiAgICAgICAgICAgICAgICAgICAgICAgIF0sIHUgPSBbXSwgbCA9IHVuZXNjYXBlKGVuY29kZVVSSShlKSkgKyAnXHg4MCcsIGYgPSBsLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHVbZSA9IC0tZiAvIDQgKyAyIHwgMTVdID0gOCAqIGY7IH5mOykKICAgICAgICAgICAgICAgICAgICAgICAgdVtmID4+IDJdIHw9IGwuY2hhckNvZGVBdChmKSA8PCA4ICogfmYtLTsKICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSBmID0gMDsgbiA8IGU7IG4gKz0gMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ID0gYzsgZiA8IDgwOyB0ID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRbNF0gKyAoYVtmXSA9IGYgPCAxNiA/IH5+dVtuICsgZl0gOiAyICogbCB8IGwgPCAwKSArIDE1MTg1MDAyNDkgKyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgJiBvIHwgfnIgJiBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gMzQxMjc1MTQ0ICsgKHIgXiBvIF4gaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjQ1OTQ1OSArIChyICYgbyB8IHIgJiBpIHwgbyAmIGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICsgMTUzNTY5NDM4OQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1bZisrIC8gNSA+PiAyXSArICgobCA9IHRbMF0pIDw8IDUgfCBsID4+PiAyNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIDw8IDMwIHwgciA+Pj4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsID0gYVtmIC0gM10gXiBhW2YgLSA4XSBeIGFbZiAtIDE0XSBeIGFbZiAtIDE2XSwgciA9IHRbMV0sIG8gPSB0WzJdLCBpID0gdFszXTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmID0gNTsgZjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjWy0tZl0gKz0gdFtmXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gJyc7IGYgPCA0MDspCiAgICAgICAgICAgICAgICAgICAgICAgIGwgKz0gKGNbZiA+PiAzXSA+PiA0ICogKDcgLSBmKyspICYgMTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIEssIFggPSAxOCwgWSA9IFtdLCBaID0gW107IDEgPCBYOyBYLS0pCiAgICAgICAgICAgICAgICAgICAgZm9yIChLID0gWDsgSyA8IDMyMDspCiAgICAgICAgICAgICAgICAgICAgICAgIFlbSyArPSBYXSA9IDE7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBlZShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyOTQ5NjcyOTYgKiBNYXRoLnBvdyhlLCAxIC8gbikgfCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChLID0gMDsgSyA8IDY0OykKICAgICAgICAgICAgICAgICAgICBZWysrWF0gfHwgKFpbS10gPSBlZShYLCAyKSwgWVtLKytdID0gZWUoWCwgMykpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbmUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlID4+PiBuIHwgZSA8PCAtbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC8oXHMrKT9bYS1mMC05XXszMiw2NH0oXHMrKT8vZ2k7CiAgICAgICAgICAgICAgICAgICAgfSwgcmUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIDMyOiAnbWQ1JywKICAgICAgICAgICAgICAgICAgICAgICAgNDA6ICdzaGExJywKICAgICAgICAgICAgICAgICAgICAgICAgNjQ6ICdzaGEyNTYnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9lKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubWF0Y2godGUoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgbi5tYXAocClbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpZShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWQ1OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHQsIHIsIG8gPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MzI1ODQxOTMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjMyMzM0MTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xNzMyNTg0MTk0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzE3MzM4NzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBpID0gW10sIGEgPSB1bmVzY2FwZShlbmNvZGVVUkkoZSkpICsgJ1x4ODAnLCBjID0gYS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGUgPSAtLWMgLyA0ICsgMiB8IDE1LCBpWy0tZV0gPSA4ICogYzsgfmM7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlbYyA+PiAyXSB8PSBhLmNoYXJDb2RlQXQoYykgPDwgOCAqIGMtLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQiA9IGEgPSAwOyBCIDwgZTsgQiArPSAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IG87IGEgPCA2NDsgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBjWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiArICgociA9IGNbMF0gKyBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmIHQgfCB+biAmIHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmIG4gfCB+ciAmIHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiBeIHQgXiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgXiAobiB8IH5yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVtjID0gYSA+PiA0XSArIHFbYV0gKyB+fmlbQiB8IDE1ICYgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIGEgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBhICsgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3ICogYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVtjXV0pIDw8IChjID0gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVs0ICogYyArIGErKyAlIDRdKSB8IHIgPj4+IC1jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAwIHwgY1sxXSwgdCA9IGNbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gNDsgYTspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9bLS1hXSArPSBjW2FdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlID0gJyc7IGEgPCAzMjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSArPSAob1thID4+IDNdID4+IDQgKiAoMSBeIGErKykgJiAxNSkudG9TdHJpbmcoMTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0obiksCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYTE6ICQobiksCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYTI1NjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gWi5zbGljZShYID0gSyA9IDAsIDgpLCB0ID0gW10sIHIgPSB1bmVzY2FwZShlbmNvZGVVUkkoZSkpICsgJ1x4ODAnLCBvID0gci5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHRbZSA9IC0tbyAvIDQgKyAyIHwgMTVdID0gOCAqIG87IH5vOykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W28gPj4gMl0gfD0gci5jaGFyQ29kZUF0KG8pIDw8IDggKiB+by0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChvID0gW107IFggPCBlOyBYICs9IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChlZSA9IG4uc2xpY2UoKTsgSyA8IDY0OyBlZS51bnNoaWZ0KHIgKyAobmUociA9IGVlWzBdLCAyKSBeIG5lKHIsIDEzKSBeIG5lKHIsIDIyKSkgKyAociAmIGVlWzFdIF4gZWVbMV0gJiBlZVsyXSBeIGVlWzJdICYgcikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZVszXSArPSByID0gMCB8IChvW0tdID0gSyA8IDE2ID8gfn50W0sgKyBYXSA6IChuZShyID0gb1tLIC0gMl0sIDE3KSBeIG5lKHIsIDE5KSBeIHIgPj4+IDEwKSArIG9bSyAtIDddICsgKG5lKHIgPSBvW0sgLSAxNV0sIDcpIF4gbmUociwgMTgpIF4gciA+Pj4gMykgKyBvW0sgLSAxNl0pICsgZWUucG9wKCkgKyAobmUociA9IGVlWzRdLCA2KSBeIG5lKHIsIDExKSBeIG5lKHIsIDI1KSkgKyAociAmIGVlWzVdIF4gfnIgJiBlZVs2XSkgKyBZW0srK107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChLID0gODsgSzspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bLS1LXSArPSBlZVtLXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9ICcnOyBLIDwgNjQ7KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKz0gKG5bSyA+PiAzXSA+PiA0ICogKDcgLSBLKyspICYgMTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgICAgICAgICB9KG4pCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFlKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gbiA/IG4gOiAxMjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChlLnJlcGxhY2UoL15cLi8sICcnKSkuc3Vic3RyaW5nKDAsIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGNlID0gWwogICAgICAgICAgICAgICAgICAgICAgICAnaXRlbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAnaXRlbWlkcycKICAgICAgICAgICAgICAgICAgICBdLCB1ZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsaGFzaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdoYXNoJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2hhc2hlZGVtYWlsJwogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB2YXIgbGUgPSBbCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiwgdCwgciA9IGUuZXZlbnRTb3VyY2UsIG8gPSAwLCBpID0gT2JqZWN0LmtleXMocik7IG8gPCBpLmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGlbb10sIGMgPSBhLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLTEgPCB1ZS5pbmRleE9mKGMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSBwKGQoclthXSkpLCBsID0gKHQgPSB2b2lkIDAsICh0ID0gdS5tYXRjaChKKCkpKSAmJiB0Lm1hcChwKVswXSksIGYgPSBvZSh1KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGllKGRlY29kZVVSSUNvbXBvbmVudChsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlZEVtYWlsOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5tZDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5zaGExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc2hhMjU2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZiAmJiAobiA9IHZvaWQgMCwgKG4gPSBvZShmKSkgJiYgbnVsbCAhPSByZVtuLmxlbmd0aF0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geSh7IGhhc2hlZEVtYWlsOiBbZi50b0xvd2VyQ2FzZSgpXSB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS5ldmVudFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPCBjZS5pbmRleE9mKG4pICYmIGgodFtlXSkgJiYgMTAgPCB0W2VdLmxlbmd0aCAmJiAodFtlXS5sZW5ndGggPSAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB7fTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgdmFyIGZlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAwID09PSB0Lmxlbmd0aCA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICAgICAgICAgICAgZSAmJiBlLmxlbmd0aCAmJiAyID09PSBlLmxlbmd0aCAmJiBlWzBdICYmIGVbMV0gJiYgKHQgPSAnJy5jb25jYXQodCkuY29uY2F0KG4pLmNvbmNhdChlWzBdLCAnPScpLmNvbmNhdChlWzFdKSk7CiAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gc2UoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSA9PT0gZS5pbmRleE9mKCclJykgPyBlIDogZGVjb2RlVVJJQ29tcG9uZW50KGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZGUoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gZSwgdCA9IGlzTmFOKCtyKSA/IHIgOiArciwgJ2ZhbHNlJyAhPT0gKG4gPSAnbnVsbCcgPT09IHQgfHwgJ3VuZGVmaW5lZCcgPT09IHQgPyBudWxsIDogdCkgJiYgKCd0cnVlJyA9PT0gbiB8fCBuKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBoZSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldGVtYWlsJywKICAgICAgICAgICAgICAgICAgICAgICAgJ3NldGVtYWlsaGFzaCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdzZXRoYXNoZWRlbWFpbCcKICAgICAgICAgICAgICAgICAgICBdLCBwZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYXBwSWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSgnYWlkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50U291cmNlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoJ3NlJywgZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUShKU09OLnN0cmluZ2lmeShlLCB6KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUNvbm5lY3RJZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCdkdWlkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeUlkOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oJ2xkdWlkJywgZSAmJiBlLmR1aWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyTmFtZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCd0bmEnLCBlIHx8ICd1bmtub3duJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VVcmw6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSgncHUnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoJ2FlJywgZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUShKU09OLnN0cmluZ2lmeShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkSWRlbnRpZmllcnM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnB1c2gobSgnZXh0XycuY29uY2F0KGUubmFtZSksIGUudmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXNGcm9tSWRlbnRpZmllcnM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnB1c2gobSgnc2NyZScsICcnLmNvbmNhdChlLm1kNSwgJywnKS5jb25jYXQoZS5zaGExLCAnLCcpLmNvbmNhdChlLnNoYTI1NikpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBuOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWNpc2lvbklkczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCdsaV9kaWQnLCBlLmpvaW4oJywnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlZEVtYWlsOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oJ2UnLCBlLmpvaW4oJywnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzUHJpdmFjeVN0cmluZzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtKCd1c19wcml2YWN5JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJOYW1lOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oJ3dwbicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZHByQXBwbGllczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnKCdnZHByJywgZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUgPyAxIDogMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2RwckNvbnNlbnQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSgnZ2Rwcl9jb25zZW50JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG0oJ3JlZnInLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2ZShuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSB7fTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBlKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4sIHQgPSBvW2VdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBlW2VdIHx8IChuID0gcGVbZV0odCkpICYmIG4ubGVuZ3RoICYmIChuWzBdIGluc3RhbmNlb2YgQXJyYXkgPyByID0gci5jb25jYXQobikgOiByLnB1c2gobikpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgKG8gPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUoZS5ldmVudFNvdXJjZSkgPyBsZS5yZWR1Y2UoZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSwgbihlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZSkgOiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEKCdTdGF0ZUNvbWJpbmVXaXRoJywgJ0Vycm9yIHdoaWxlIGV4dHJhY3RpbmcgZXZlbnQgZGF0YScsIGUpLCBvOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfShuKSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogbywKICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZVdpdGg6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHZlKHkobiwgZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBhc1F1ZXJ5U3RyaW5nOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmUoZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgYXNUdXBsZXM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRzUGl4ZWw6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gdShvLmV2ZW50U291cmNlKSA/IG8uZXZlbnRTb3VyY2UgOiB7fSwgbiA9IE9iamVjdC5rZXlzKGUpLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2V2ZW50bmFtZScgPT09IGUudG9Mb3dlckNhc2UoKSB8fCAnZXZlbnQnID09PSBlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQgPSBuICYmIDEgPD0gbi5sZW5ndGggJiYgblswXSwgciA9IHQgJiYgcChvLmV2ZW50U291cmNlW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhciB8fCAtMSA9PT0gaGUuaW5kZXhPZihyLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdlKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5kb21haW4gfHwgZG9jdW1lbnQubG9jYXRpb24gJiYgZG9jdW1lbnQubG9jYXRpb24uaG9zdCB8fCB3aW5kb3cgJiYgd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5ob3N0IHx8ICdsb2NhbGhvc3QnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbWUoZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlKCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHdlID0gbnVsbDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHllKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2UgPSB3ZSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VVcmw6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuLCB0ID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gZSA6IHdpbmRvdywgciA9IG1lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmxvY2F0aW9uLmFuY2VzdG9yT3JpZ2luczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwge30sIG8gPSBbXSwgaSA9IHQ7IGkgIT09IHRvcDspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5wdXNoKGkpLCBpID0gaS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBhID0gby5sZW5ndGggLSAxOyAwIDw9IGEgJiYgIW47IGEtLSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG1lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2VdLmxvY2F0aW9uLmhyZWY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCAwICE9PSBlICYmIChuID0gKG4gPSBuIHx8IG1lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvW2UgLSAxXS5kb2N1bWVudC5yZWZlcnJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIHx8IHJbZSAtIDFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gZSA/IGUgOiB3aW5kb3c7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnRvcC5kb2N1bWVudC5yZWZlcnJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KCkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFNlID0gbnVsbCwgYmUgPSBudWxsLCBJZSA9IDEyMCwgQ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Vua25vd24gbWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnVW5rbm93biBuYW1lJwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHhlKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9ICtlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNOYU4obikgPyB2b2lkIDAgOiBuOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBFZShlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgZS5sZW5ndGggJiYgZS5sZW5ndGggPiBJZSA/ICcnLmNvbmNhdChlLnN1YnN0cigwLCBJZSksICcuLi4nKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE9lKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICBiZSAmJiBiZS5zZW5kUGl4ZWwobmV3IHZlKChuID0gZSkgPyB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRGV0YWlsczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogRWUobi5tZXNzYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IEVlKG4ubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1RyYWNlOiBFZShuLnN0YWNrKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXI6IHhlKG4ubGluZU51bWJlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQ29sdW1uOiB4ZShuLmxpbmVDb2x1bW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IEVlKG4uZmlsZU5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IDogQ2UpLmNvbWJpbmVXaXRoKFNlIHx8IHt9KS5jb21iaW5lV2l0aCh5ZSgpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgamUgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISktNTlBRUlNUVldYWVonLCBrZSA9IGplLmxlbmd0aCwgUmUgPSBNYXRoLnBvdygyLCA0OCkgLSAxLCBMZSA9IDEwLCBEZSA9IDE2LCBVZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ID8gd2luZG93IDogbnVsbCwgbiA9IGUgJiYgKGUuY3J5cHRvIHx8IGUubXNDcnlwdG8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuZXcgVWludDhBcnJheSgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbi5nZXRSYW5kb21WYWx1ZXMoZSksIGVbMF0gLyAyNTU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTmUoZSwgbikgewogICAgICAgICAgICAgICAgICAgIGlmIChSZSA8IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICh0ID0gbmV3IEVycm9yKCdjYW5ub3QgZW5jb2RlIHRpbWUgZ3JlYXRlciB0aGFuICcgKyBSZSkpLnNvdXJjZSA9ICdVbGlkJywgdDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0LCByLCBvID0gJyc7IDAgPCBuOyBuLS0pCiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBlICUga2UsIG8gPSBqZS5jaGFyQXQocikgKyBvLCBlID0gKGUgLSByKSAvIGtlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gX2UoZSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAnJzsgMCA8IGU7IGUtLSkKICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gTWF0aC5mbG9vcihVZSgpICoga2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PT0ga2UgJiYgKGUgPSBrZSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGplLmNoYXJBdChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSgpICsgbjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBGZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29va2llOiAnY29va2llJywKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlOiAnbHMnLAogICAgICAgICAgICAgICAgICAgICAgICBub25lOiAnbm9uZScKICAgICAgICAgICAgICAgICAgICB9LCBUZSA9ICdfbGMyX2ZwaScsIEFlID0gJ19saV9kY2RtX2MnLCBQZSA9IDczMDsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEdlKGUsIGMpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUuZXhwaXJhdGlvbkRheXMgfHwgUGUsIHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBjLmdldENvb2tpZShBZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBnZSgpLCB0ID0gbi5zcGxpdCgnLicpLCByID0gdC5sZW5ndGg7IDAgPCByOyByLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSAnLicuY29uY2F0KHQuc2xpY2UociAtIDEsIHQubGVuZ3RoKS5qb2luKCcuJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5zZXRDb29raWUoQWUsIG8sIHZvaWQgMCwgJ0xheCcsIG8pLCBjLmdldENvb2tpZShBZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcuJy5jb25jYXQobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KCksIHIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW46IHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ29ubmVjdElkOiAobyA9IFRlLCBpID0gJycuY29uY2F0KGFlKHQpLCAnLS0nKS5jb25jYXQoTmUoRGF0ZS5ub3coKSwgTGUpICsgX2UoRGUpKS50b0xvY2FsZUxvd2VyQ2FzZSgpLCBhID0gciwgbCh1ID0gZS5zdG9yYWdlU3RyYXRlZ3ksIEZlLmxvY2FsU3RvcmFnZSkgPyBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBvLCBpLCBhID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmxvY2FsU3RvcmFnZUlzRW5hYmxlZCgpICYmIChyID0gJycuY29uY2F0KGUsICdfZXhwJyksIG8gPSBjLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKHIpLCBpID0gcyh0LmV4cGlyZXMsIDg2NDAwMDAwKSwgbyAmJiBwYXJzZUludChvKSA8PSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAmJiBjLnJlbW92ZURhdGFGcm9tTG9jYWxTdG9yYWdlKGUpLCBjLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGUpIHx8IGMuc2V0RGF0YUluTG9jYWxTdG9yYWdlKGUsIG4pLCBjLnNldERhdGFJbkxvY2FsU3RvcmFnZShyLCAnJy5jb25jYXQoaSkpLCBhID0gYy5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZShlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEKCdMU0dldE9yQWRkJywgJ0Vycm9yIG1hbmlwdWxhdGluZyBMUycsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obywgaSwgYSkgOiBsKHUsIEZlLm5vbmUpID8gbnVsbCA6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gYy5nZXRDb29raWUoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPyBjLnNldENvb2tpZShlLCBvLCBmKHQuZXhwaXJlcyksICdMYXgnLCB0LmRvbWFpbikgOiBjLnNldENvb2tpZShlLCBuLCBmKHQuZXhwaXJlcyksICdMYXgnLCB0LmRvbWFpbiksIHIgPSBjLmdldENvb2tpZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQoJ0Nvb2tpZUdldE9yQWRkJywgJ0ZhaWxlZCBtYW5pcHVsYXRpbmcgY29va2llIGphcicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0obywgaSwgYSkpCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRCgnSWRlbnRpZmllcnNSZXNvbHZlJywgJ0Vycm9yIHdoaWxlIG1hbmFnaW5nIGlkZW50aWZpZXJzJywgZSksIHt9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbywgaSwgYSwgdTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBWZSA9IGYoMzApLCBRZSA9ICdsaV9kaWQnLCBKZSA9ICdsaWRpZHMuJywgTWUgPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pbmRleE9mKGUpID09PSBuOwogICAgICAgICAgICAgICAgICAgIH0sIFdlID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuID0gZSkgJiYgaS50ZXN0KHAobikpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbjsKICAgICAgICAgICAgICAgICAgICB9LCBIZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIDAgPCBwKGUpLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gemUociwgbykgewogICAgICAgICAgICAgICAgICAgIHZhciBlLCBuLCB0LCBpLCBhLCBjID0ge307CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHUgPSByLnBhZ2VVcmwgJiYgKGUgPSByLnBhZ2VVcmwsIGEgPSB7fSwgZSAmJiAtMSAhPT0gKG4gPSBlLmluZGV4T2YoJz8nKSkgJiYgKHQgPSBlLnNsaWNlKG4gKyAxKSkgJiYgKC0xICE9PSAoaSA9IHQuaW5kZXhPZignIycpKSAmJiAhKHQgPSB0LnNsaWNlKDAsIGkpKSB8fCB0LnNwbGl0KCcmJykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnW10nID09PSAoZSA9ICgoZSA9IGUuc3BsaXQoJz0nKSkgJiYgMiA9PT0gZS5sZW5ndGggPyBlIDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKS5tYXAoc2UpKVswXS5zbGljZSgtMikgJiYgKGFbZVswXSA9IGVbMF0uc2xpY2UoMCwgLTIpXSA9IGFbZVswXV0gfHwgW10pLCAhYVtlWzBdXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhW2VbMF1dID0gZGUoZVsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoYVtlWzBdXSkgPyBhW2VbMF1dLnB1c2goZGUoZVsxXSkpIDogYVtlWzBdXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbZVswXV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZShlWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgYSkgfHwge30sIGwgPSBbXS5jb25jYXQodVtRZV0gfHwgW10pLCBmID0gby5maW5kU2ltaWxhckNvb2tpZXMoSmUpOwogICAgICAgICAgICAgICAgICAgICAgICBsLm1hcChwKS5maWx0ZXIoSGUpLmZpbHRlcihXZSkuZmlsdGVyKE1lKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiA9IGUsIHQgPSByLmRvbWFpbiwgdm9pZCAobiAmJiBvLnNldENvb2tpZSgnJy5jb25jYXQoSmUpLmNvbmNhdChuKSwgbiwgVmUsICdMYXgnLCB0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSB7IGRlY2lzaW9uSWRzOiBsLmNvbmNhdChmKS5tYXAocCkuZmlsdGVyKEhlKS5maWx0ZXIoV2UpLmZpbHRlcihNZSkgfTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEQoJ0RlY2lzaW9uc1Jlc29sdmUnLCAnRXJyb3Igd2hpbGUgbWFuYWdpbmcgZGVjaXNpb24gaWRzJywgZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHFlID0gMTU2Mzg0MDAwMDA7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCZShlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgZSAmJiBuLnNldERhdGFJbkxvY2FsU3RvcmFnZSh4LCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICRlKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHFlKSAvIDEwMDAsIHIgPSBlLmxlZ2FjeUlkIHx8IHt9LCBvID0gci5jdXJyVmlzaXRUcyA/IHBhcnNlSW50KHIuY3VyclZpc2l0VHMpIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuY3VyclZpc2l0VHMgJiYgbyA8IHQgJiYgZS5saXZlQ29ubmVjdElkICYmIEJlKGUubGl2ZUNvbm5lY3RJZCwgbiksIG4uZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UoeCkgfHwgQmUoci5kdWlkIHx8IGUubGl2ZUNvbm5lY3RJZCwgbiksIHsgcGVvcGxlVmVyaWZpZWRJZDogbi5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZSh4KSB9OwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoJ1Blb3BsZVZlcmlmaWVkUmVzb2x2ZScsICdFcnJvciB3aGlsZSBtYW5hZ2luZyBwZW9wbGUgdmVyaWZpZWQnLCBlKSwge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gS2UoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IFtdLCByID0gW10sIG8gPSAwOyBvIDwgZS5sZW5ndGg7IG8rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBhID0gZVtvXSwgYyA9IG4uZ2V0Q29va2llKGEpIHx8IG4uZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UoYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyAmJiAoaSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChIKGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IFtdLCB0ID0gbmV3IFJlZ0V4cChXLnNvdXJjZSwgJ2cnKSwgciA9IHQuZXhlYyhlKTsgcjspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnB1c2gocChyWzFdKSksIHIgPSB0LmV4ZWMoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIHQgPSBbXSwgciA9IDA7IHIgPCBuLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IG5bcl0sIGkgPSBpZShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLnJlcGxhY2UobywgaS5tZDUpLCB0LnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJXaXRob3V0UmF3RW1haWxzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzRnJvbUlkZW50aWZpZXI6IHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE0oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGllKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJXaXRob3V0UmF3RW1haWxzOiBuLm1kNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzRnJvbUlkZW50aWZpZXI6IFtuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJXaXRob3V0UmF3RW1haWxzOiBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlc0Zyb21JZGVudGlmaWVyOiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZChjKSksIHQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLmlkZW50aWZpZXJXaXRob3V0UmF3RW1haWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSByLmNvbmNhdChpLmhhc2hlc0Zyb21JZGVudGlmaWVyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlZElkZW50aWZpZXJzOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hlc0Zyb21JZGVudGlmaWVyczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHt9LCB0ID0gW10sIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbcl0ubWQ1IGluIG4gfHwgKHQucHVzaChlW3JdKSwgbltlW3JdLm1kNV0gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ocikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlkZW50aWZpZXJzVG9SZXNvbHZlICYmIChoKGUuaWRlbnRpZmllcnNUb1Jlc29sdmUpID8gbiA9IGUuaWRlbnRpZmllcnNUb1Jlc29sdmUgOiBjKGUuaWRlbnRpZmllcnNUb1Jlc29sdmUpICYmIChuID0gZS5pZGVudGlmaWVyc1RvUmVzb2x2ZS5zcGxpdCgnLCcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IG4ubGVuZ3RoOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt0XSA9IG5bdF0udHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSksIG4pOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEwoJ0lkZW50aWZpZXJzRW5yaWNoZXInLCBlKSwge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFhlID0gJ1xcKz9cXGQrJywgWWUgPSAnKCcuY29uY2F0KCdbYS16XS1bYS16MC05XXs0fScsICctLScpLmNvbmNhdChvLCAnKVxcLignKS5jb25jYXQoWGUsICcpXFwuKCcpLmNvbmNhdChYZSwgJylcXC4oJykuY29uY2F0KFhlLCAnKVxcLignKS5jb25jYXQoWGUsICcpXFwuKCcpLmNvbmNhdChvLCAnKScpLCBaZSA9IG5ldyBSZWdFeHAoWWUsICdpJyksIGVuID0gJ19saXRyYV9pZC4nOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbm4oZSwgbikgewogICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBvLCBpLCBhID0gKG8gPSBnZSgpLCBpID0gYWUoKHIgPSAodCA9IG8pLmxlbmd0aCwgJy4nID09PSB0LmNoYXJBdCgtLXIpICYmICh0ID0gdC5zbGljZSgwLCByKSksICcqLicgPT09IHQuc2xpY2UoMCwgMikgJiYgKHQgPSB0LnNsaWNlKDEpKSwgdCArICcvJyksIDQpLCAnJy5jb25jYXQoZW4pLmNvbmNhdChpKSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuYXBwSWQgJiYgbi5sb2NhbFN0b3JhZ2VJc0VuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5SWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUubWF0Y2goWmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gJiYgNyA9PT0gbi5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVpZDogblsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25UczogblsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkNvdW50OiBuWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyVmlzaXRUczogbls0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlc3Npb25WaXNpdFRzOiBuWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IG5bNl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShuLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEQoJ0xlZ2FjeUR1aWRFbnJpY2gnLCAnRXJyb3Igd2hpbGUgZ2V0dGluZyBsZWdhY3kgZHVpZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdG4gPSAnX19saV9pZGV4X2NhY2hlJzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJuKHQsIHIsIG8sIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwoJ0lkZW50aXR5UmVzb2x2ZXJQYXJzZXInLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuc2V0Q29va2llKHRuLCBKU09OLnN0cmluZ2lmeShuKSwgcyhvLCAzNjAwMDAwKS50b1VUQ1N0cmluZygpLCAnTGF4Jywgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwoJ0lkZW50aXR5UmVzb2x2ZXJTdG9yYWdlJywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaShuKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gb24oZSwgYywgdSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsID0gZSB8fCB7fSwgbiA9IGwuaWRlbnRpdHlSZXNvbHV0aW9uQ29uZmlnIHx8IHt9LCB0ID0gbC5yZXRyaWV2ZWRJZGVudGlmaWVycyB8fCBbXSwgZiA9IG4uZXhwaXJhdGlvbkhvdXJzIHx8IEUsIHIgPSBuLnNvdXJjZSB8fCAndW5rbm93bicsIG8gPSBuLnB1Ymxpc2hlcklkIHx8ICdhbnknLCBpID0gbi51cmwgfHwgaiwgcyA9IG4uYWpheFRpbWVvdXQgfHwgTywgYSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBhLnB1c2gobSgnZHVpZCcsIGwucGVvcGxlVmVyaWZpZWRJZCkpLCBhLnB1c2gobSgndXNfcHJpdmFjeScsIGwudXNQcml2YWN5U3RyaW5nKSksIGEucHVzaChnKCdnZHByJywgbC5nZHByQXBwbGllcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpLCBhLnB1c2gobSgnZ2Rwcl9jb25zZW50JywgbC5nZHByQ29uc2VudCkpLCB0LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaChtKGUubmFtZSwgZS52YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBhLnNsaWNlKCkuY29uY2F0KHcoZSkpLCB0ID0gZmUobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KGksICcvJykuY29uY2F0KHIsICcvJykuY29uY2F0KG8pLmNvbmNhdCh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGUsIG8gPSBuLCBpID0gdCwgKGEgPSBjLmdldENvb2tpZSh0bikpID8gcihKU09OLnBhcnNlKGEpKSA6IHUuYWpheEdldChkKGkpLCBybihjLCBsLmRvbWFpbiwgZiwgciksIG8sIHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpLCBMKCdJZGVudGl0eVJlc29sdmUnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIG8sIGksIGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXJsOiBkCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTCgnSWRlbnRpdHlSZXNvbHZlcicsIHQpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oKSwgTCgnSWRlbnRpdHlSZXNvbHZlci5yZXNvbHZlJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXJsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCgnSWRlbnRpdHlSZXNvbHZlci5nZXRVcmwnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgYW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gY24obiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByID0gW107CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmIHRbZV0gJiYgdih0W2VdKSA/IHRbZV0gOiAoci5wdXNoKGUpLCBhbik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGUoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbChuLCBGZS5ub25lKSA/IGFuIDogbyhlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUlzRW5hYmxlZDogZSgnbG9jYWxTdG9yYWdlSXNFbmFibGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGdldENvb2tpZTogbygnZ2V0Q29va2llJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvb2tpZTogZSgnc2V0Q29va2llJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGdldERhdGFGcm9tTG9jYWxTdG9yYWdlOiBvKCdnZXREYXRhRnJvbUxvY2FsU3RvcmFnZScpLAogICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVEYXRhRnJvbUxvY2FsU3RvcmFnZTogZSgncmVtb3ZlRGF0YUZyb21Mb2NhbFN0b3JhZ2UnKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF0YUluTG9jYWxTdG9yYWdlOiBlKCdzZXREYXRhSW5Mb2NhbFN0b3JhZ2UnKSwKICAgICAgICAgICAgICAgICAgICAgICAgZmluZFNpbWlsYXJDb29raWVzOiBvKCdmaW5kU2ltaWxhckNvb2tpZXMnKQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCByLmxlbmd0aCAmJiBEKCdTdG9yYWdlSGFuZGxlcicsICdUaGUgc3RvcmFnZSBmdW5jdGlvbnMgXCcnLmNvbmNhdChKU09OLnN0cmluZ2lmeShyKSwgJ1wnIGFyZSBub3QgcHJvdmlkZWQnKSksIGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gbG4obikgewogICAgICAgICAgICAgICAgICAgIHZhciB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZShlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuICYmIG5bZV0gJiYgdihuW2VdKSA/IG5bZV0gOiAodC5wdXNoKGUpLCB1bik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByID0gewogICAgICAgICAgICAgICAgICAgICAgICBhamF4R2V0OiBlKCdhamF4R2V0JyksCiAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsR2V0OiBlKCdwaXhlbEdldCcpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMCA8IHQubGVuZ3RoICYmIEQoJ0NhbGxIYW5kbGVyJywgJ1RoZSBjYWxsIGZ1bmN0aW9ucyBcJycuY29uY2F0KEpTT04uc3RyaW5naWZ5KHQpLCAnXCcgYXJlIG5vdCBwcm92aWRlZCcpKSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmbiA9IHt9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gc24oZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciByLCBvOwogICAgICAgICAgICAgICAgICAgIGUgJiYgdShlKSA/IGUuY29uZmlnID8gRCgnU3RyYXlDb25maWcnLCAnUmVjZWl2ZWQgYSBjb25maWcgYWZ0ZXIgTEMgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXNlZCcsIG5ldyBFcnJvcihlKSkgOiAociA9IHQuY29tYmluZVdpdGgoeyBldmVudFNvdXJjZTogZSB9KSwgZm4uaGFzaGVkRW1haWwgPSBmbi5oYXNoZWRFbWFpbCB8fCByLmRhdGEuaGFzaGVkRW1haWwsIG8gPSB5KHsgZXZlbnRTb3VyY2U6IGUgfSwgZm4pLCBuLnNlbmRBamF4KHQuY29tYmluZVdpdGgobykpKSA6IEQoJ0V2ZW50Tm90QW5PYmplY3QnLCAnUmVjZWl2ZWQgZXZlbnQgd2FzIG5vdCBhbiBvYmplY3QnLCBuZXcgRXJyb3IoZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gZG4oZSkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmxpUSAmJiB3aW5kb3cubGlRLnJlYWR5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiwgdCA9IHdpbmRvdy5saVEuY29uZmlnICYmIGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGUuYXBwSWQgPT09IG4uYXBwSWQgJiYgZS53cmFwcGVyTmFtZSA9PT0gbi53cmFwcGVyTmFtZSAmJiBlLmNvbGxlY3RvclVybCA9PT0gbi5jb2xsZWN0b3JVcmwpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBJZDogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFwcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLmFwcElkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyTmFtZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLndyYXBwZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLndyYXBwZXJOYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3JVcmw6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5jb2xsZWN0b3JVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uY29sbGVjdG9yVXJsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHdpbmRvdy5saVEuY29uZmlnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ICYmICgobiA9IG5ldyBFcnJvcigpKS5uYW1lID0gJ0NvbmZpZ1NlbnQnLCBuLm1lc3NhZ2UgPSAnQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlY2VpdmVkJywgRCgnTENEdXBsaWNhdGlvbicsIEpTT04uc3RyaW5naWZ5KHQpLCBuKSksIHdpbmRvdy5saVE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gaG4oZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUgfHwgNTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IHx8IG4obmV3IEVycm9yKCdCdXMgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gdGhlIHdpbmRvdywgd2hpY2ggaXMgbm90IHByZXNlbnQnKSksIHdpbmRvdyAmJiAhd2luZG93W1NdICYmICh3aW5kb3dbU10gPSBuZXcgXyhlKSksIHdpbmRvd1tTXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbG4odCk7CiAgICAgICAgICAgICAgICAgICAgICAgICFmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgJiYgd2luZG93W1NdICYmIHYod2luZG93W1NdLm9uKSAmJiB3aW5kb3dbU10ub24oYiwgT2UpLCBiZSA9IG5ldyBOKGUsIG4pLCBTZSA9IGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gY24oZS5zdG9yYWdlU3RyYXRlZ3ksIG4pLCBpID0gZnVuY3Rpb24gKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5jb21iaW5lV2l0aChuKGUuZGF0YSwgbykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgYSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgYyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXS5yZWR1Y2UoaSwgbmV3IHZlKGUpKSwgdSA9IGEucmVkdWNlKGksIGMpLCBsID0geShlLCB7IHBlb3BsZVZlcmlmaWVkSWQ6IHUuZGF0YS5wZW9wbGVWZXJpZmllZElkIH0pLCBmID0gbmV3IE4oZSwgciwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSKEksIGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSKEMsICcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcyA9IG9uKHUuZGF0YSwgbywgciksIGQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGgsIG4gPSBuZXcgQXJyYXkoZSksIHQgPSAwOyB0IDwgZTsgdCsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3RdID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgobikgPyBuLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNuKGUsIHQsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogc24obiwgdCwgcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRCgnTENQdXNoJywgJ0ZhaWxlZCBzZW5kaW5nIGFuIGV2ZW50JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KG4sIGYsIHUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2g6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQoe30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZVZlcmlmaWVkSWQ6IHUuZGF0YS5wZW9wbGVWZXJpZmllZElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHk6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogcy5yZXNvbHZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbkNhbGxVcmw6IHMuZ2V0VXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiBlCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBEKCdMQ0NvbnN0cnVjdGlvbicsICdGYWlsZWQgdG8gYnVpbGQgTEMnLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcG4gPSBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gd2luZG93LmxpUSB8fCBbXSwgbyA9IHUoZSkgJiYgZSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiAod2luZG93LmxpUSA9IGRuKG8pIHx8IGhuKG8sIG4sIHQpIHx8IHIpLCBoKHIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5saVEucHVzaChyW2ldKTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEQoJ0xDQ29uc3RydWN0aW9uJywgJ0ZhaWxlZCB0byBidWlsZCBMQycsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxpUTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB2bihlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1KGUpICYmIGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBuKHIsIG4sIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICA1NzY6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHIgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gcihlKSA/IEpTT04uc3RyaW5naWZ5KGUpIDogJycgKyBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdbb2JqZWN0IEFycmF5XScgPT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHQuZChuLCAnYScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIG8gPSAhIVN0cmluZy5wcm90b3R5cGUudHJpbTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGwoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvID8gKCcnICsgZSkudHJpbSgpIDogKCcnICsgZSkucmVwbGFjZSgvXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2csICcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJyA9PSB0eXBlb2YgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUgJiYgJ29iamVjdCcgPT09IHIoZSkgJiYgIXUoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBzKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGwgIT0gKHIgPSBuKSAmJiAwIDwgbChyKS5sZW5ndGggPyBbCiAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHModCkgPyB0KG4pIDogbgogICAgICAgICAgICAgICAgICAgIF0gOiBbXTsKICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHYoZSwgbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwKGUsIG4sIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGgoZSkgPyBlIDoge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByID0ge30sIG8gPSB0KGUpLCBpID0gdChuKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByW2VdID0gb1tlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgT2JqZWN0LmtleXMoaSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByW2VdID0gaVtlXTsKICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBnID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSAwID09PSB0Lmxlbmd0aCA/ICc/JyA6ICcmJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgJiYgZS5sZW5ndGggJiYgMiA9PT0gZS5sZW5ndGggJiYgZVswXSAmJiBlWzFdICYmICh0ID0gJycuY29uY2F0KHQpLmNvbmNhdChuKS5jb25jYXQoZVswXSwgJz0nKS5jb25jYXQoZVsxXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdDsKICAgICAgICAgICAgICAgICAgICB9LCBtID0gJ19fbGlfX2V2dF9idXMnLCB3ID0gJ2xpX2Vycm9ycycsIHkgPSAnX2xpX2R1aWQnLCBTID0gNTAwMCwgYiA9ICdodHRwczovL2lkeC5saWFkbS5jb20vaWRleCc7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBJKGUsIG4pIHsKICAgICAgICAgICAgICAgICAgICBDKGUsIG4ubWVzc2FnZSwgbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciwgbywgaSA9IDIgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IHQgOiB7fSwgYSA9IG5ldyBFcnJvcihuIHx8IGkubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgYS5zdGFjayA9IGkuc3RhY2ssIGEubmFtZSA9IGUgfHwgJ3Vua25vd24gZXJyb3InLCBhLmxpbmVOdW1iZXIgPSBpLmxpbmVOdW1iZXIsIGEuY29sdW1uTnVtYmVyID0gaS5jb2x1bW5OdW1iZXIsIHIgPSB3LCBvID0gYSwgd2luZG93ICYmIHdpbmRvd1ttXSAmJiB3aW5kb3dbbV0uZW1pdChyLCBvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHgoZSwgbiwgbykgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZSB8fCB7fSwgciA9IHQuaWRlbnRpdHlSZXNvbHV0aW9uQ29uZmlnIHx8IHt9LCBpID0gdC5yZXRyaWV2ZWRJZGVudGlmaWVycyB8fCBbXSwgYSA9IHIuc291cmNlIHx8ICd1bmtub3duJywgYyA9IHIucHVibGlzaGVySWQgfHwgJ2FueScsIHUgPSByLnVybCB8fCBiLCBsID0gci5hamF4VGltZW91dCB8fCBTLCBmID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGYucHVzaCh2KCdkdWlkJywgdC5wZW9wbGVWZXJpZmllZElkKSksIGYucHVzaCh2KCd1c19wcml2YWN5JywgdC51c1ByaXZhY3lTdHJpbmcpKSwgZi5wdXNoKHAoJ2dkcHInLCB0LmdkcHJBcHBsaWVzLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlID8gMSA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIGYucHVzaCh2KCdnZHByX2NvbnNlbnQnLCB0LmdkcHJDb25zZW50KSksIGkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5wdXNoKHYoZS5uYW1lLCBlLnZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBmLnNsaWNlKCkuY29uY2F0KGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBoKHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gJiYgIWgobikgJiYgbi5sZW5ndGggJiYgci5wdXNoKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChuKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlKSksIHQgPSBnKG4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQodSwgJy8nKS5jb25jYXQoYSwgJy8nKS5jb25jYXQoYykuY29uY2F0KHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZCA9IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5hamF4R2V0KHModCksIChyID0gZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkoJ0lkZW50aXR5UmVzb2x2ZXJQYXJzZXInLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcihuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgbiwgbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkKGUsIG4sIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbigpLCBJKCdJZGVudGl0eVJlc29sdmUnLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXJsOiBzCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSSgnSWRlbnRpdHlSZXNvbHZlcicsIHQpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4oKSwgSSgnSWRlbnRpdHlSZXNvbHZlci5yZXNvbHZlJywgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXJsOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSgnSWRlbnRpdHlSZXNvbHZlci5nZXRVcmwnLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgRSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gL1xTKyhAfCU0MClcUytcLlxTKy87CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIE8gPSAvIihbXiJdKyhAfCU0MClbXiJdK1suXVthLXpdKihccyspPykoXFwifCIpLzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGooZSwgbikgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5pZGVudGlmaWVyc1RvUmVzb2x2ZSA9IGUuaWRlbnRpZmllcnNUb1Jlc29sdmUgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gdShlLmlkZW50aWZpZXJzVG9SZXNvbHZlKSA/IGUuaWRlbnRpZmllcnNUb1Jlc29sdmUgOiBjKGUuaWRlbnRpZmllcnNUb1Jlc29sdmUpLnNwbGl0KCcsJyksIHIgPSBbXSwgbyA9IDA7IG8gPCB0Lmxlbmd0aDsgbysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBsKHRbb10pLCBhID0gbi5nZXRDb29raWUoaSkgfHwgbi5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZShpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYSB8fCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTy50ZXN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYyhhKSkgfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEUoKS50ZXN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYyhhKSkgfHwgci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGMoYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJldHJpZXZlZElkZW50aWZpZXJzOiByIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgbik7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSSgnSWRlbnRpZmllcnNFbnJpY2gnLCBlKSwge307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGsgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogJ2Nvb2tpZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZTogJ2xzJywKICAgICAgICAgICAgICAgICAgICAgICAgbm9uZTogJ25vbmUnCiAgICAgICAgICAgICAgICAgICAgfSwgUiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiByKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gJiYgbltlXSAmJiBzKG5bZV0pID8gbltlXSA6ICh0LnB1c2goZSksIFIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgbywgaSwgYSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZUlzRW5hYmxlZDogKG8gPSAnbG9jYWxTdG9yYWdlSXNFbmFibGVkJywgaSA9IGUsIGEgPSBrLm5vbmUsIGYoaSkgJiYgZihhKSAmJiBsKGkudG9Mb3dlckNhc2UoKSkgPT09IGwoYS50b0xvd2VyQ2FzZSgpKSA/IFIgOiByKG8pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvb2tpZTogcignZ2V0Q29va2llJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhRnJvbUxvY2FsU3RvcmFnZTogcignZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UnKQogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwIDwgdC5sZW5ndGggJiYgQygnU3RvcmFnZUhhbmRsZXInLCAnVGhlIHN0b3JhZ2UgZnVuY3Rpb25zIFwnJy5jb25jYXQoSlNPTi5zdHJpbmdpZnkodCksICdcJyBhcmUgbm90IHByb3ZpZGVkJykpLCBjOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gaShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAodSA9IHQsIGwgPSBbXSwgZiA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4R2V0OiBjKCdhamF4R2V0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxHZXQ6IGMoJ3BpeGVsR2V0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDAgPCBsLmxlbmd0aCAmJiBDKCdDYWxsSGFuZGxlcicsICdUaGUgY2FsbCBmdW5jdGlvbnMgXCcnLmNvbmNhdChKU09OLnN0cmluZ2lmeShsKSwgJ1wnIGFyZSBub3QgcHJvdmlkZWQnKSksIGYpLCBvID0gTChlLnN0b3JhZ2VTdHJhdGVneSwgbiksIGkgPSBkKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGVvcGxlVmVyaWZpZWRJZDogZS5nZXREYXRhRnJvbUxvY2FsU3RvcmFnZSh5KSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMoJ1Blb3BsZVZlcmlmaWVkRW5yaWNoJywgZS5tZXNzYWdlLCBlKSwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShvKSksIGEgPSB4KGQoaSwgaihpLCBvKSksIDAsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxpUS5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LmxpUS5wdXNoKHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW9wbGVWZXJpZmllZElkOiBpLnBlb3BsZVZlcmlmaWVkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiBhLnJlc29sdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uQ2FsbFVybDogYS5nZXRVcmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGMoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSAmJiB1W2VdICYmIHModVtlXSkgPyB1W2VdIDogKGwucHVzaChlKSwgRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciB1LCBsLCBmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdyAmJiAod2luZG93LmxpUSA9IHdpbmRvdy5saVEgfHwgW10pLCBpKGgoZSkgJiYgZSB8fCB7fSwgbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbNTczXSk7CiAgICAgICAgcGJqc0NodW5rKFsxOThdLCB7CiAgICAgICAgICAgIDY1NTogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHQoNjU2KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgNjU2OiBmdW5jdGlvbiAoZSwgbiwgdCkgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHQuZChuLCAnbmV0SWRTdWJtb2R1bGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciB1ID0gdCgxMSksIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICduZXRJZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICdzdHJpbmcnID09IHR5cGVvZiBlLm5ldElkID8geyBuZXRJZDogZS5uZXRJZCB9IDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdCh1LmUpKCd1c2VySWQnLCBkKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs2NTVdKTsKICAgICAgICBwYmpzQ2h1bmsoWzE5MV0sIHsKICAgICAgICAgICAgNjY5OiBmdW5jdGlvbiAoZSwgciwgaSkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gaSg2NzApOwogICAgICAgICAgICB9LAogICAgICAgICAgICA2NzA6IGZ1bmN0aW9uIChlLCByLCBpKSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgaS5kKHIsICdzcGVjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgdSA9IGkoMCksIGEgPSBpKDEpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYyhlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgfShlKSB8fCBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3VuZGVmaW5lZCcgPT0gdHlwZW9mIFN5bWJvbCB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IFtdLCBhID0gITAsIHQgPSAhMSwgbyA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4sIGQgPSBlW1N5bWJvbC5pdGVyYXRvcl0oKTsgIShhID0gKG4gPSBkLm5leHQoKSkuZG9uZSkgJiYgKGkucHVzaChuLnZhbHVlKSwgIXIgfHwgaS5sZW5ndGggIT09IHIpOyBhID0gITApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gITAsIG8gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHx8IG51bGwgPT0gZC5yZXR1cm4gfHwgZC5yZXR1cm4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfShlLCByKSB8fCBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICdPYmplY3QnID09PSBpICYmIGUuY29uc3RydWN0b3IgJiYgKGkgPSBlLmNvbnN0cnVjdG9yLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IGkgfHwgJ1NldCcgPT09IGkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdBcmd1bWVudHMnID09PSBpIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KGkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQoZSwgcik7CiAgICAgICAgICAgICAgICAgICAgfShlLCByKSB8fCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdChlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gciB8fCByID4gZS5sZW5ndGgpICYmIChyID0gZS5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gbmV3IEFycmF5KHIpOyBpIDwgcjsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICBhW2ldID0gZVtpXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsID0gewogICAgICAgICAgICAgICAgICAgIGNvZGU6ICdvbmVWaWRlbycsCiAgICAgICAgICAgICAgICAgICAgVkVSU0lPTjogJzMuMC43JywKICAgICAgICAgICAgICAgICAgICBFTkRQT0lOVDogJ2h0dHBzOi8vYWRzLmFkYXB0di5hZHZlcnRpc2luZy5jb20vcnRiL29wZW5ydGI/ZXh0X2lkPScsCiAgICAgICAgICAgICAgICAgICAgRTJFVEVTVEVORFBPSU5UOiAnaHR0cHM6Ly9hZHMtd2Mudi5zc3AueWFob28uY29tL3J0Yi9vcGVucnRiP2V4dF9pZD0nLAogICAgICAgICAgICAgICAgICAgIFNZTkNfRU5EUE9JTlQxOiAnaHR0cHM6Ly9waXhlbC5hZHZlcnRpc2luZy5jb20vdXBzLzU3MzA0L3N5bmM/Z2Rwcj0mZ2Rwcl9jb25zZW50PSZfb3JpZ2luPTAmcmVkaXI9dHJ1ZScsCiAgICAgICAgICAgICAgICAgICAgU1lOQ19FTkRQT0lOVDI6ICdodHRwczovL21hdGNoLmFkc3J2ci5vcmcvdHJhY2svY21mL2dlbmVyaWM/dHRkX3BpZD1hZGFwdHYmdHRkX3RwaT0xJywKICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRNZWRpYVR5cGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICd2aWRlbycsCiAgICAgICAgICAgICAgICAgICAgICAgICdiYW5uZXInCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvbmVWaWRlbycgIT09IGUuYmlkZGVyIHx8IHZvaWQgMCA9PT0gZS5wYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGUucGFyYW1zLnZpZGVvIHx8IHZvaWQgMCA9PT0gZS5wYXJhbXMudmlkZW8ucGxheWVyV2lkdGggfHwgdm9pZCAwID09PSBlLnBhcmFtcy52aWRlby5wbGF5ZXJIZWlnaHQgfHwgdm9pZCAwID09PSBlLnBhcmFtcy52aWRlby5taW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUubWVkaWFUeXBlcy52aWRlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvdXRzdHJlYW0nID09PSBlLm1lZGlhVHlwZXMudmlkZW8uY29udGV4dCAmJiAxID09PSBlLnBhcmFtcy52aWRlby5kaXNwbGF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLm1lZGlhVHlwZXMuYmFubmVyICYmICFlLnBhcmFtcy52aWRlby5kaXNwbGF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdm9pZCAwICE9PSBlLnBhcmFtcy5wdWJJZDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gYSA/IGEuZ2RwckNvbnNlbnQgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gbC5FTkRQT0lOVCwgaSA9IGUucGFyYW1zLnB1YklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zLnZpZGVvLmUyZXRlc3QgJiYgKHIgPSBsLkUyRVRFU1RFTkRQT0lOVCwgaSA9ICdIQkV4Y2hhbmdlJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHIgKyBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uIChlLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gaS5yZWZlcmVySW5mby5yZWZlcmVyLCB0ID0gZS5wYXJhbXMuc2l0ZSAmJiBlLnBhcmFtcy5zaXRlLnBhZ2UgPyBlLnBhcmFtcy5zaXRlLnBhZ2UgOiBhLmhyZWYsIG8gPSBlLnBhcmFtcy5zaXRlICYmIGUucGFyYW1zLnNpdGUucmVmZXJyZXIgPyBlLnBhcmFtcy5zaXRlLnJlZmVycmVyIDogaS5yZWZlcmVySW5mby5yZWZlcmVyLCBuID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB1LmdlbmVyYXRlVVVJRCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0OiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cjogZS5jdXIgfHwgJ1VTRCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICcxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZTogJ2h0dHBzOicgPT09IGRvY3VtZW50LmxvY2F0aW9uLnByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZmxvb3I6IGUucGFyYW1zLmJpZGZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYmlkdmVyOiAnNC4zNi4wJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVydmVyOiBsLlZFUlNJT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZTogeyB1YTogbmF2aWdhdG9yLnVzZXJBZ2VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtYXg6IDIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBlLnBhcmFtcy52aWRlby5kaXNwbGF5IHx8IDEgIT0gZS5wYXJhbXMudmlkZW8uZGlzcGxheSA/IChuLmltcFswXS52aWRlbyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVzOiBlLnBhcmFtcy52aWRlby5taW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGUucGFyYW1zLnZpZGVvLnBsYXllcldpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZS5wYXJhbXMudmlkZW8ucGxheWVySGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zOiBlLnBhcmFtcy52aWRlby5wb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlLnBhcmFtcy52aWRlby5tYXhiaXRyYXRlICYmIChuLmltcFswXS52aWRlby5tYXhiaXRyYXRlID0gZS5wYXJhbXMudmlkZW8ubWF4Yml0cmF0ZSksIGUucGFyYW1zLnZpZGVvLm1heGR1cmF0aW9uICYmIChuLmltcFswXS52aWRlby5tYXhkdXJhdGlvbiA9IGUucGFyYW1zLnZpZGVvLm1heGR1cmF0aW9uKSwgZS5wYXJhbXMudmlkZW8ubWluZHVyYXRpb24gJiYgKG4uaW1wWzBdLnZpZGVvLm1pbmR1cmF0aW9uID0gZS5wYXJhbXMudmlkZW8ubWluZHVyYXRpb24pLCBlLnBhcmFtcy52aWRlby5hcGkgJiYgKG4uaW1wWzBdLnZpZGVvLmFwaSA9IGUucGFyYW1zLnZpZGVvLmFwaSksIGUucGFyYW1zLnZpZGVvLmRlbGl2ZXJ5ICYmIChuLmltcFswXS52aWRlby5kZWxpdmVyeSA9IGUucGFyYW1zLnZpZGVvLmRlbGl2ZXJ5KSwgZS5wYXJhbXMudmlkZW8ucG9zaXRpb24gJiYgKG4uaW1wWzBdLnZpZGVvLnBvcyA9IGUucGFyYW1zLnZpZGVvLnBvc2l0aW9uKSwgZS5wYXJhbXMudmlkZW8ucGxheWJhY2ttZXRob2QgJiYgKG4uaW1wWzBdLnZpZGVvLnBsYXliYWNrbWV0aG9kID0gZS5wYXJhbXMudmlkZW8ucGxheWJhY2ttZXRob2QpLCBlLnBhcmFtcy52aWRlby5wbGFjZW1lbnQgJiYgKG4uaW1wWzBdLnZpZGVvLnBsYWNlbWVudCA9IGUucGFyYW1zLnZpZGVvLnBsYWNlbWVudCksIGUucGFyYW1zLnZpZGVvLnJld2FyZGVkICYmIChuLmltcFswXS5leHQucmV3YXJkZWQgPSBlLnBhcmFtcy52aWRlby5yZXdhcmRlZCksIG4uaW1wWzBdLnZpZGVvLmxpbmVhcml0eSA9IDEsIG4uaW1wWzBdLnZpZGVvLnByb3RvY29scyA9IGUucGFyYW1zLnZpZGVvLnByb3RvY29scyB8fCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKSA6IDEgPT0gZS5wYXJhbXMudmlkZW8uZGlzcGxheSAmJiAobi5pbXBbMF0uYmFubmVyID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IGUucGFyYW1zLnZpZGVvLm1pbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZS5wYXJhbXMudmlkZW8ucGxheWVyV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlLnBhcmFtcy52aWRlby5wbGF5ZXJIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3M6IGUucGFyYW1zLnZpZGVvLnBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUucGFyYW1zLnZpZGVvLnBsYWNlbWVudCAmJiAobi5pbXBbMF0uYmFubmVyLnBsYWNlbWVudCA9IGUucGFyYW1zLnZpZGVvLnBsYWNlbWVudCksIGUucGFyYW1zLnZpZGVvLm1heGR1cmF0aW9uICYmIChuLmltcFswXS5iYW5uZXIuZXh0ID0gbi5pbXBbMF0uYmFubmVyLmV4dCB8fCB7fSwgbi5pbXBbMF0uYmFubmVyLmV4dC5tYXhkdXJhdGlvbiA9IGUucGFyYW1zLnZpZGVvLm1heGR1cmF0aW9uKSwgZS5wYXJhbXMudmlkZW8ubWluZHVyYXRpb24gJiYgKG4uaW1wWzBdLmJhbm5lci5leHQgPSBuLmltcFswXS5iYW5uZXIuZXh0IHx8IHt9LCBuLmltcFswXS5iYW5uZXIuZXh0Lm1pbmR1cmF0aW9uID0gZS5wYXJhbXMudmlkZW8ubWluZHVyYXRpb24pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXJhbXMudmlkZW8uaW52ZW50b3J5aWQgJiYgKG4uaW1wWzBdLmV4dC5pbnZlbnRvcnlpZCA9IGUucGFyYW1zLnZpZGVvLmludmVudG9yeWlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXJhbXMudmlkZW8uc2lkID8gKG4uc291cmNlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoYWluOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWQ6IGUucGFyYW1zLnZpZGVvLnNpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWQ6IG4uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxID09IGUucGFyYW1zLnZpZGVvLmhwICYmIChuLnNvdXJjZS5leHQuc2NoYWluLm5vZGVzWzBdLmhwID0gZS5wYXJhbXMudmlkZW8uaHApKSA6IGUuc2NoYWluICYmIChuLnNvdXJjZSA9IHsgZXh0OiB7IHNjaGFpbjogZS5zY2hhaW4gfSB9LCBuLnNvdXJjZS5leHQuc2NoYWluLm5vZGVzWzBdLnJpZCA9IG4uaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnBhcmFtcy5zaXRlICYmIGUucGFyYW1zLnNpdGUuaWQgJiYgKG4uc2l0ZS5pZCA9IGUucGFyYW1zLnNpdGUuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZihyKSB8fCBpICYmIGkudXNwQ29uc2VudCkgJiYgKG4ucmVncyA9IHsgZXh0OiB7fSB9LCBmKHIpICYmIChuLnJlZ3MuZXh0LmdkcHIgPSAxKSwgciAmJiByLmNvbnNlbnRTdHJpbmcgJiYgKG4udXNlciA9IHsgZXh0OiB7IGNvbnNlbnQ6IHIuY29uc2VudFN0cmluZyB9IH0pLCBpICYmIGkudXNwQ29uc2VudCAmJiAobi5yZWdzLmV4dC51c19wcml2YWN5ID0gaS51c3BDb25zZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucGFyYW1zLnZpZGVvLmUyZXRlc3QgJiYgKG4uaW1wWzBdLmJpZGZsb29yID0gbnVsbCwgbi5pbXBbMF0udmlkZW8udyA9IDMwMCwgbi5pbXBbMF0udmlkZW8uaCA9IDI1MCwgbi5pbXBbMF0udmlkZW8ubWltZXMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlkZW8vbXA0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBuLmltcFswXS52aWRlby5hcGkgPSBbMl0sIG4uc2l0ZS5wYWdlID0gJ2h0dHBzOi8vdmVyaXpvbm1lZGlhLmNvbScsIG4uc2l0ZS5yZWYgPSAnaHR0cHM6Ly92ZXJpem9ubWVkaWEuY29tJywgbi50bWF4ID0gMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnBhcmFtcy52aWRlby5jdXN0b20gJiYgdS5pc1BsYWluT2JqZWN0KGUucGFyYW1zLnZpZGVvLmN1c3RvbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBkIGluIChuLmltcFswXS5leHQuY3VzdG9tID0ge30sIGUucGFyYW1zLnZpZGVvLmN1c3RvbSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUuaXNTdHIoZS5wYXJhbXMudmlkZW8uY3VzdG9tW2RdKSB8fCB1LmlzTnVtYmVyKGUucGFyYW1zLnZpZGVvLmN1c3RvbVtkXSkpICYmIChuLmltcFswXS5leHQuY3VzdG9tW2RdID0gZS5wYXJhbXMudmlkZW8uY3VzdG9tW2RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucGFyYW1zLnZpZGVvLmNvbnRlbnQgJiYgdS5pc1BsYWluT2JqZWN0KGUucGFyYW1zLnZpZGVvLmNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuLnNpdGUuY29udGVudCA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aXRsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZXJpZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2Vhc29uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dlbnJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRyYXRpbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwgcCA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VwaXNvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXZlc3RyZWFtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBtID0gWydjYXQnXSwgdiA9IFsnZXh0J107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjIGluIGUucGFyYW1zLnZpZGVvLmNvbnRlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPCBzLmluZGV4T2YoYykgJiYgdS5pc1N0cihlLnBhcmFtcy52aWRlby5jb250ZW50W2NdKSB8fCAtMSA8IHAuaW5kZXhPZihjKSAmJiB1LmlzTnVtYmVyKGUucGFyYW1zLnZpZGVvLmNvbnRlbnRbY10pIHx8IC0xIDwgdi5pbmRleE9mKGMpICYmIHUuaXNQbGFpbk9iamVjdChlLnBhcmFtcy52aWRlby5jb250ZW50W2NdKSB8fCAtMSA8IG0uaW5kZXhPZihjKSAmJiB1LmlzQXJyYXkoZS5wYXJhbXMudmlkZW8uY29udGVudFtjXSkgJiYgZS5wYXJhbXMudmlkZW8uY29udGVudFtjXS5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdS5pc1N0cihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA/IG4uc2l0ZS5jb250ZW50W2NdID0gZS5wYXJhbXMudmlkZW8uY29udGVudFtjXSA6IHUubG9nTWVzc2FnZSgnb25lVmlkZW8gYmlkIGFkYXB0ZXIgdmFsaWRhdGlvbiBlcnJvcjogJywgYywgJyBpcyBlaXRoZXIgbm90IHN1cHBvcnRlZCBpcyBPcGVuUlRCIFYyLjUgb3IgdmFsdWUgaXMgdW5kZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShlLCB0LCBhKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRSZXF1ZXN0OiBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSwgYSwgdCwgbywgbiwgZCwgcywgcCwgbSwgdiA9IGUuYmlkUmVxdWVzdDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAociA9IHIuYm9keSkuc2VhdGJpZFswXS5iaWRbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmIGkgJiYgKGkuYWRtIHx8IGkubnVybCkgJiYgaS5wcmljZSA/IChvID0gdi5zaXplcywgbiA9IHUucGFyc2VTaXplc0lucHV0KG8pLCBkID0gYyhuLmxlbmd0aCA/IG5bMF0uc3BsaXQoJ3gnKSA6IFtdLCAyKSwgcyA9IGRbMF0sIHAgPSBkWzFdLCBhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHBhcnNlSW50KHMsIDEwKSB8fCB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHBhcnNlSW50KHAsIDEwKSB8fCB2b2lkIDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwgKHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQ6IHYuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJDb2RlOiBsLmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcG06IGkucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGl2ZUlkOiBpLmNyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogYS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYS5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeTogci5jdXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDAgPCB2LnBhcmFtcy52aWRlby50dGwgJiYgdi5wYXJhbXMudmlkZW8udHRsIDw9IDM2MDAgPyB2LnBhcmFtcy52aWRlby50dGwgOiAzMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRSZXZlbnVlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGU6IHYuYWRVbml0Q29kZQogICAgICAgICAgICAgICAgICAgICAgICB9KS5tZWRpYVR5cGUgPSB2Lm1lZGlhVHlwZXMuYmFubmVyID8gJ2Jhbm5lcicgOiAndmlkZW8nLCBpLm51cmwgPyB0LnZhc3RVcmwgPSBpLm51cmwgOiBpLmFkbSAmJiAxID09PSB2LnBhcmFtcy52aWRlby5kaXNwbGF5ID8gdC5hZCA9IGkuYWRtIDogaS5hZG0gJiYgKHQudmFzdFhtbCA9IGkuYWRtKSwgdi5tZWRpYVR5cGVzLnZpZGVvICYmICh0LnJlbmRlcmVyID0gJ291dHN0cmVhbScgPT09IHYubWVkaWFUeXBlcy52aWRlby5jb250ZXh0ID8gdm9pZCAoKG0gPSB2KS5yZW5kZXJlciB8fCAobS5yZW5kZXJlciA9IHt9LCBtLnJlbmRlcmVyLnVybCA9ICdodHRwczovL2Nkbi52aWRpYmxlLnR2L3Byb2QvaGItb3V0c3RyZWFtLXJlbmRlcmVyL3JlbmRlcmVyLmpzJywgbS5yZW5kZXJlci5yZW5kZXIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzJQbGF5ZXJSZW5kZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCA3MDApOwogICAgICAgICAgICAgICAgICAgICAgICB9KSkgOiB2b2lkIDApLCB0KSA6ICh1LmxvZ1dhcm4oJ05vIHZhbGlkIGJpZHMgZnJvbSAnLmNvbmNhdChsLmNvZGUsICcgYmlkZGVyJykpLCBbXSk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlLCByLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBpID8gaSA6IHt9LCB0ID0gYS5nZHByQXBwbGllcywgbyA9IGEuY29uc2VudFN0cmluZywgbiA9IHZvaWQgMCA9PT0gbyA/ICcnIDogbzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUucGl4ZWxFbmFibGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogbC5TWU5DX0VORFBPSU5UMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL3N5bmMtdG0uZXZlcmVzdHRlY2gubmV0L3VwaS9waWQvbTd5NXQ5M2s/Z2Rwcj0nLmNvbmNhdCh0ID8gMSA6IDAsICcmZ2Rwcl9jb25zZW50PScpLmNvbmNhdChuLCAnJnJlZGlyPWh0dHBzJTNBJTJGJTJGcGl4ZWwuYWR2ZXJ0aXNpbmcuY29tJTJGdXBzJTJGNTU5ODYlMkZzeW5jJTNGdWlkJTNEJTI0JTdCVVNFUl9JRCU3RCUyNl9vcmlnaW4lM0QwJykgKyBlbmNvZGVVUkkoJyZnZHByPScuY29uY2F0KHQgPyAxIDogMCwgJyZnZHByX2NvbnNlbnQ9JykuY29uY2F0KG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGwuU1lOQ19FTkRQT0lOVDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiBlLmdkcHJBcHBsaWVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgT2JqZWN0KGEucmVnaXN0ZXJCaWRkZXIpKGwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzY2OV0pOwogICAgICAgIHBianNDaHVuayhbMTg4XSwgewogICAgICAgICAgICA2ODE6IGZ1bmN0aW9uIChlLCB0LCByKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSByKDY4Mik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDY4MjogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCByLmQodCwgJ1VTRVJfSURfQ09ERV9UT19RVUVSWV9BUkcnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CiAgICAgICAgICAgICAgICB9KSwgci5kKHQsICdzcGVjJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IHIoMyksIG4gPSByKDEpLCBjID0gcigwKSwgdSA9IHIoMik7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KGUpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gW10sIG4gPSAhMCwgaSA9ICExLCBhID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZCwgcyA9IGVbU3ltYm9sLml0ZXJhdG9yXSgpOyAhKG4gPSAoZCA9IHMubmV4dCgpKS5kb25lKSAmJiAoci5wdXNoKGQudmFsdWUpLCAhdCB8fCByLmxlbmd0aCAhPT0gdCk7IG4gPSAhMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAhMCwgYSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gfHwgbnVsbCA9PSBzLnJldHVybiB8fCBzLnJldHVybigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdzdHJpbmcnID09IHR5cGVvZiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgJ09iamVjdCcgPT09IHIgJiYgZS5jb25zdHJ1Y3RvciAmJiAociA9IGUuY29uc3RydWN0b3IubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnTWFwJyA9PT0gciB8fCAnU2V0JyA9PT0gcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ0FyZ3VtZW50cycgPT09IHIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaShlLCB0KTsKICAgICAgICAgICAgICAgICAgICB9KGUsIHQpIHx8IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4nKTsKICAgICAgICAgICAgICAgICAgICB9KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSB0IHx8IHQgPiBlLmxlbmd0aCkgJiYgKHQgPSBlLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDAsIG4gPSBuZXcgQXJyYXkodCk7IHIgPCB0OyByKyspCiAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlW3JdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGEgPSBbCiAgICAgICAgICAgICAgICAgICAgICAgIHUuYiwKICAgICAgICAgICAgICAgICAgICAgICAgdS5kCiAgICAgICAgICAgICAgICAgICAgXSwgcCA9ICdoYl9wYicsIG0gPSAnMy4wLjMnLCBzID0gJ1VTRCcsIGwgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyaXRlcG9vbGlkOiAnYnJpdGVwb29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICBjcml0ZW9JZDogJ2NyaXRlb2lkJywKICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRydXN0aWQ6ICdkaWdpdHJ1c3RpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGZhYnJpY2tJZDogJ251ZXN0YXJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbG9JZDogJ2F1ZGlnZW50aWQnLAogICAgICAgICAgICAgICAgICAgICAgICBpZDVpZDogJ2lkNWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgaWRsX2VudjogJ2xyZScsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUDogJ3plb3RhcGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgaWR4SWQ6ICdpZHhpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVudElxSWQ6ICdpbnRlbnRpcWlkJywKICAgICAgICAgICAgICAgICAgICAgICAgbGlwYjogJ2xpcGJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvdGFtZVBhbm9yYW1hSWQ6ICdsb3RhbWVpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmtsZUlkOiAnbWVya2xlaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBuZXRJZDogJ25ldGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgcGFycmFibGVJZDogJ3BhcnJhYmxlaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBwdWJjaWQ6ICdwdWJjaWQnLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFudGNhc3RJZDogJ3F1YW50Y2FzdGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkSWQ6ICdzaGFyZWRpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcGFkSWQ6ICd0YXBhZGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgdGRpZDogJ3R0ZHV1aWQnLAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJpem9uTWVkaWFJZDogJ3Zlcml6b25tZWRpYWlkJwogICAgICAgICAgICAgICAgICAgIH0sIGggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdvcGVueCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGd2bGlkOiA2OSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogYSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNCaWRSZXF1ZXN0VmFsaWQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUucGFyYW1zLmRlbERvbWFpbiB8fCBlLnBhcmFtcy5wbGF0Zm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMuYmFubmVyJykgJiYgdCA/ICEhZS5wYXJhbXMudW5pdCB8fCAwIDwgYy5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcy5sZW5ndGgnKSA6ICEoIWUucGFyYW1zLnVuaXQgfHwgIXQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPT09IGUubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW10sIHQgPSBkKGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA9IHQsIGMuZGVlcEFjY2VzcyhyLCAnbWVkaWFUeXBlcy52aWRlbycpICYmICFjLmRlZXBBY2Nlc3MociwgJ21lZGlhVHlwZXMuYmFubmVyJykgfHwgci5tZWRpYVR5cGUgPT09IHUuZCA/IGVbMF0ucHVzaCh0KSA6IGVbMV0ucHVzaCh0KSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pLCAyKSwgciA9IHRbMF0sIGEgPSB0WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgPCBhLmxlbmd0aCAmJiBpLnB1c2goZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IFtdLCBpID0gITEsIHIgPSBmKGUsIHQpLCBhID0gYy5fbWFwKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJhbXMudW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hdXMgPSBjLl9tYXAoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMucGFyc2VTaXplc0lucHV0KGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXMpLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCd8JyksIHIuZGl2SWRzID0gYy5fbWFwKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCcsJyksIGEuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJiAoci5hdWlkID0gYS5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5wYXJhbXMuZG9Ob3RUcmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSAmJiAoci5ucyA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEwICE9PSBvLmIuZ2V0Q29uZmlnKCdjb3BwYScpICYmICFlLnNvbWUoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUucGFyYW1zLmNvcHBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8IChyLnRmY2QgPSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucGFyYW1zLmN1c3RvbVBhcmFtcyA/IChlID0gYy5fbWFwKE9iamVjdC5rZXlzKHQucGFyYW1zLmN1c3RvbVBhcmFtcyksIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHRbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pc0FycmF5KHIpICYmIChyID0gci5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZS50b0xvd2VyQ2FzZSgpICsgJz0nICsgci50b0xvd2VyQ2FzZSgpKS5yZXBsYWNlKCcrJywgJy4nKS5yZXBsYWNlKCcvJywgJ18nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdC5wYXJhbXMuY3VzdG9tUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIgPSB3aW5kb3cuYnRvYShlLmpvaW4oJyYnKSksIGkgPSAhMCwgbi5wdXNoKHIpKSA6IG4ucHVzaCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkgJiYgKHIudHBzID0gbi5qb2luKCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiKHIsIHUuYiwgZSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiByLnBoID8gJ2h0dHBzOi8vdS5vcGVueC5uZXQvdy8xLjAvYXJqJyA6ICdodHRwczovLycuY29uY2F0KGVbMF0ucGFyYW1zLmRlbERvbWFpbiwgJy93LzEuMC9hcmonKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkczogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYSwgbikpLCAwIDwgci5sZW5ndGggJiYgci5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAociA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSA9IGYoW2VdLCB0KSwgYSA9IGMuZGVlcEFjY2VzcyhlLCAncGFyYW1zLnZpZGVvJykgfHwge30sIGQgPSBjLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8uY29udGV4dCcpLCBzID0gYy5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuaXNBcnJheShlLnNpemVzKSAmJiAyID09PSBlLnNpemVzLmxlbmd0aCAmJiAhYy5pc0FycmF5KGUuc2l6ZXNbMF0pID8gKHIgPSBwYXJzZUludChlLnNpemVzWzBdLCAxMCksIG4gPSBwYXJzZUludChlLnNpemVzWzFdLCAxMCkpIDogYy5pc0FycmF5KGUuc2l6ZXMpICYmIGMuaXNBcnJheShlLnNpemVzWzBdKSAmJiAyID09PSBlLnNpemVzWzBdLmxlbmd0aCA/IChyID0gcGFyc2VJbnQoZS5zaXplc1swXVswXSwgMTApLCBuID0gcGFyc2VJbnQoZS5zaXplc1swXVsxXSwgMTApKSA6IGMuaXNBcnJheShzKSAmJiAyID09PSBzLmxlbmd0aCAmJiAociA9IHBhcnNlSW50KHNbMF0sIDEwKSwgbiA9IHBhcnNlSW50KHNbMV0sIDEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ydGInID09PSBlID8gKGFbZV0udyA9IHIgfHwgYVtlXS53LCBhW2VdLnYgPSBuIHx8IGFbZV0udiwgaVtlXSA9IEpTT04uc3RyaW5naWZ5KGFbZV0pKSA6IGUgaW4gaSB8fCAndXJsJyA9PT0gZSB8fCAoaVtlXSA9IGFbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGkuYXVpZCA9IGUucGFyYW1zLnVuaXQsIGkudndkID0gciB8fCBhLnZ3ZCwgaS52aHQgPSBuIHx8IGEudmh0LCAnb3V0c3RyZWFtJyA9PT0gZCAmJiAoaS52b3MgPSAnMTAxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm1pbWVzICYmIChpLnZtaW1lcyA9IGEubWltZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXJhbXMudGVzdCAmJiAoaS52dGVzdCA9IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIoaSwgdS5kLCBbZV0pLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHQgPSBlLCBuKSkucGggPyAnaHR0cHM6Ly91Lm9wZW54Lm5ldC92LzEuMC9hdmpwJyA6ICdodHRwczovLycuY29uY2F0KHQucGFyYW1zLmRlbERvbWFpbiwgJy92LzEuMC9hdmpwJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpZDogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZTogbmV3IERhdGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKC9hdmpwJC8udGVzdCh0LnVybCkgPyB1LmQgOiB1LmIpID09PSB1LmQgPyBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gdC5iaWQsIG4gPSAodC5zdGFydFRpbWUsIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGUgJiYgJycgIT09IGUudmFzdFVybCAmJiAwIDwgZS5wdWJfcmV2ICYmIChpID0gYy5wYXJzZVVybChlLnZhc3RVcmwpLnNlYXJjaCB8fCB7fSwgKGEgPSB7fSkucmVxdWVzdElkID0gci5iaWRJZCwgZS5kZWFsX2lkICYmIChhLmRlYWxJZCA9IGUuZGVhbF9pZCksIGEudHRsID0gMzAwLCBhLm5ldFJldmVudWUgPSAhMCwgYS5jdXJyZW5jeSA9IGUuY3VycmVuY3ksIGEuY3BtID0gcGFyc2VJbnQoZS5wdWJfcmV2LCAxMCkgLyAxMDAwLCBhLndpZHRoID0gcGFyc2VJbnQoZS53aWR0aCwgMTApLCBhLmhlaWdodCA9IHBhcnNlSW50KGUuaGVpZ2h0LCAxMCksIGEuY3JlYXRpdmVJZCA9IGUuYWRpZCwgYS52YXN0VXJsID0gZS52YXN0VXJsLCBhLm1lZGlhVHlwZSA9IHUuZCwgZS5waCA9IGkucGgsIGUuY29sbyA9IGkuY29sbywgZS50cyA9IGkudHMsIG4ucHVzaChhKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IHQuYmlkcywgbiA9ICh0LnN0YXJ0VGltZSwgZS5hZHMuYWQpLCBpID0gW10sIGEgPSAwOyBhIDwgbi5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCwgcyA9IG5bYV0sIG8gPSBwYXJzZUludChzLmlkeCwgMTApLCBjID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMucmVxdWVzdElkID0gcltvXS5iaWRJZCwgcy5wdWJfcmV2ICYmIChjLmNwbSA9IE51bWJlcihzLnB1Yl9yZXYpIC8gMTAwMCwgKGQgPSBzLmNyZWF0aXZlWzBdKSAmJiAoYy53aWR0aCA9IGQud2lkdGgsIGMuaGVpZ2h0ID0gZC5oZWlnaHQpLCBjLmNyZWF0aXZlSWQgPSBkLmlkLCBjLmFkID0gcy5odG1sLCBzLmRlYWxfaWQgJiYgKGMuZGVhbElkID0gcy5kZWFsX2lkKSwgYy50dGwgPSAzMDAsIGMubmV0UmV2ZW51ZSA9ICEwLCBjLmN1cnJlbmN5ID0gcy5jdXJyZW5jeSwgcy50YmQgJiYgKGMudGJkID0gcy50YmQpLCBjLnRzID0gcy50cywgYy5tZXRhID0ge30sIHMuYnJhbmRfaWQgJiYgKGMubWV0YS5icmFuZElkID0gcy5icmFuZF9pZCksIHMuYWR2X2lkICYmIChjLm1ldGEuZHNwaWQgPSBzLmFkdl9pZCksIGkucHVzaChjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkociwgdC5wYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXNlclN5bmNzOiBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaWZyYW1lRW5hYmxlZCB8fCBlLnBpeGVsRW5hYmxlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGUuaWZyYW1lRW5hYmxlZCA/ICdpZnJhbWUnIDogJ2ltYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogYy5kZWVwQWNjZXNzKHQsICcwLmJvZHkuYWRzLnBpeGVscycpIHx8IGMuZGVlcEFjY2Vzcyh0LCAnMC5ib2R5LnBpeGVscycpIHx8IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICYmIChyLnB1c2goJ2dkcHI9JyArIChlLmdkcHJBcHBsaWVzID8gMSA6IDApKSwgci5wdXNoKCdnZHByX2NvbnNlbnQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChlLmNvbnNlbnRTdHJpbmcgfHwgJycpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiByLnB1c2goJ3VzX3ByaXZhY3k9JyArIGVuY29kZVVSSUNvbXBvbmVudCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnLmNvbmNhdCgnaHR0cHM6Ly91Lm9wZW54Lm5ldC93LzEuMC9wZCcpLmNvbmNhdCgwIDwgci5sZW5ndGggPyAnPycgKyByLmpvaW4oJyYnKSA6ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ociwgbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybUJpZFBhcmFtczogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmNvbnZlcnRUeXBlcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmxvb3I6ICdudW1iZXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBmKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgciwgbiwgaSwgYSwgZCA9IGMuaW5JZnJhbWUoKSwgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1OiBvLmIuZ2V0Q29uZmlnKCdwYWdlVXJsJykgfHwgdC5yZWZlcmVySW5mby5yZWZlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2g6IGRvY3VtZW50LmNoYXJTZXQgfHwgZG9jdW1lbnQuY2hhcmFjdGVyU2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzOiAnJy5jb25jYXQoc2NyZWVuLndpZHRoLCAneCcpLmNvbmNhdChzY3JlZW4uaGVpZ2h0LCAneCcpLmNvbmNhdChzY3JlZW4uY29sb3JEZXB0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnI6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ejogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCByLCBuLCBpID0gd2luZG93LCBhID0gZG9jdW1lbnQsIGQgPSBhLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHdpbmRvdy50b3AsIGEgPSB3aW5kb3cudG9wLmRvY3VtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGEuZG9jdW1lbnRFbGVtZW50LCBuID0gYS5ib2R5LCB0ID0gaS5pbm5lcldpZHRoIHx8IGQuY2xpZW50V2lkdGggfHwgbi5jbGllbnRXaWR0aCwgciA9IGkuaW5uZXJIZWlnaHQgfHwgZC5jbGllbnRIZWlnaHQgfHwgbi5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBhLmRvY3VtZW50RWxlbWVudCwgdCA9IGkuaW5uZXJXaWR0aCB8fCBkLmNsaWVudFdpZHRoLCByID0gaS5pbm5lckhlaWdodCB8fCBkLmNsaWVudEhlaWdodDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycuY29uY2F0KHQsICd4JykuY29uY2F0KHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfShkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmM6IGVbMF0ucGFyYW1zLmJjIHx8ICcnLmNvbmNhdChwLCAnXycpLmNvbmNhdChtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkZGlkOiBjLl9tYXAoZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50cmFuc2FjdGlvbklkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9jYWNoZTogbmV3IERhdGUoKS5nZXRUaW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXS5wYXJhbXMucGxhdGZvcm0gJiYgKHMucGggPSBlWzBdLnBhcmFtcy5wbGF0Zm9ybSksIHQuZ2RwckNvbnNlbnQgJiYgKHZvaWQgMCAhPT0gKHIgPSB0LmdkcHJDb25zZW50KS5jb25zZW50U3RyaW5nICYmIChzLmdkcHJfY29uc2VudCA9IHIuY29uc2VudFN0cmluZyksIHZvaWQgMCAhPT0gci5nZHByQXBwbGllcyAmJiAocy5nZHByID0gci5nZHByQXBwbGllcyA/IDEgOiAwKSwgJ2lhYicgPT09IG8uYi5nZXRDb25maWcoJ2NvbnNlbnRNYW5hZ2VtZW50LmNtcEFwaScpICYmIChzLnhfZ2Rwcl9mID0gMSkpLCB0ICYmIHQudXNwQ29uc2VudCAmJiAocy51c19wcml2YWN5ID0gdC51c3BDb25zZW50KSwgYy5kZWVwQWNjZXNzKGVbMF0sICdjcnVtYnMucHViY2lkJykgJiYgYy5kZWVwU2V0VmFsdWUoZVswXSwgJ3VzZXJJZC5wdWJjaWQnLCBjLmRlZXBBY2Nlc3MoZVswXSwgJ2NydW1icy5wdWJjaWQnKSksIG4gPSBzLCBpID0gZVswXS51c2VySWQsIGMuX2VhY2goaSwgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBsW3RdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobC5oYXNPd25Qcm9wZXJ0eSh0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGlnaXRydXN0aWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBjLmRlZXBBY2Nlc3MoZSwgJ2RhdGEuaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xpcGInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlLmxpcGJpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BhcnJhYmxlSWQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlLmVpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2lkNWlkJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3JdID0gZS51aWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bcl0gPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pLCBzID0gbiwgZVswXS5zY2hhaW4gJiYgKHMuc2NoYWluID0gKGEgPSBlWzBdLnNjaGFpbiwgJycuY29uY2F0KGEudmVyLCAnLCcpLmNvbmNhdChhLmNvbXBsZXRlLCAnIScpLmNvbmNhdChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc2knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZG9tYWluJwogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0W2VdIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKCchJyk7CiAgICAgICAgICAgICAgICAgICAgfShhLm5vZGVzKSkpKSwgczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgciwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gW10sIGkgPSAhMTsKICAgICAgICAgICAgICAgICAgICB0LmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fSwgbiA9IG8uYi5nZXRDb25maWcoJ2N1cnJlbmN5LmFkU2VydmVyQ3VycmVuY3knKSB8fCBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5nZXRGbG9vciAmJiAociA9IGUuZ2V0Rmxvb3IoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gci5mbG9vciB8fCBlLnBhcmFtcy5jdXN0b21GbG9vciB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoMTAwMCAqIGkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUsIHIpOwogICAgICAgICAgICAgICAgICAgICAgICB0ID8gKG4ucHVzaCh0KSwgaSA9ICEwKSA6IG4ucHVzaCgwKTsKICAgICAgICAgICAgICAgICAgICB9KSwgaSAmJiAoZS5hdW1mcyA9IG4uam9pbignLCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdChuLnJlZ2lzdGVyQmlkZGVyKShoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs2ODFdKTsKICAgICAgICBwYmpzQ2h1bmsoWzE3OV0sIHsKICAgICAgICAgICAgNzAxOiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCg3MDIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3MDI6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKHIsICdwYXJyYWJsZUlkU3VibW9kdWxlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBsOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgZyA9IHQoMCksIG8gPSB0KDEwKSwgbSA9IHQubihvKSwgTyA9IHQoNCksIG4gPSB0KDExKSwgdiA9IHQoMjApLCBJID0gdCg4KSwgYSA9IHQoNyksIGkgPSAnX3BhcnJhYmxlX2lkJywgaCA9ICdfcGFycmFibGVfZWlkJywgQyA9ICdfcGFycmFibGVfb3B0b3V0JywgcyA9IDMxNDQ5NjAwMDAwLCBrID0gJ1RodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UJywgXyA9IE9iamVjdChhLmIpKDkyOCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlLCB0LCByID0gXy5nZXRDb29raWUoaSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgPyAoZSA9IGRlY29kZVVSSUNvbXBvbmVudChyKSwgdCA9IHt9LCBlLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGUuc3BsaXQoJzonKTsKICAgICAgICAgICAgICAgICAgICAgICAgdFtyWzBdXSA9IDEgPT0gK3JbMV0gfHwgclsxXTsKICAgICAgICAgICAgICAgICAgICB9KSwgdCkgOiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gRShlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIHQsIG87CiAgICAgICAgICAgICAgICAgICAgZSAmJiAociA9IGVuY29kZVVSSUNvbXBvbmVudCgobyA9IFtdLCAodCA9IGUpLmVpZCAmJiBvLnB1c2goJ2VpZDonICsgdC5laWQpLCB0LmliYU9wdG91dCAmJiBvLnB1c2goJ2liYU9wdG91dDoxJyksIHQuY2NwYU9wdG91dCAmJiBvLnB1c2goJ2NjcGFPcHRvdXQ6MScpLCBvLmpvaW4oJywnKSkpLCBfLnNldENvb2tpZShpLCByLCBuZXcgRGF0ZShnLnRpbWVzdGFtcCgpICsgcykudG9HTVRTdHJpbmcoKSwgJ2xheCcpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHUoZSwgcikgewogICAgICAgICAgICAgICAgICAgIGlmIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5wYXJ0bmVycyB8fCBlLnBhcnRuZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnN0b3JhZ2UgJiYgZy5sb2dXYXJuKCdVc2VyIElEIC0gcGFycmFibGVJZCBzdWJtb2R1bGUgZG9lcyBub3QgcmVxdWlyZSBhIHN0b3JhZ2UgY29uZmlnJyksIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5sb2dFcnJvcignVXNlciBJRCAtIHBhcnJhYmxlSWQgc3VibW9kdWxlIHJlcXVpcmVzIHBhcnRuZXIgbGlzdCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5sb2dFcnJvcignVXNlciBJRCAtIHBhcnJhYmxlSWQgc3VibW9kdWxlIHJlcXVpcmVzIGNvbmZpZ1BhcmFtcycpOwogICAgICAgICAgICAgICAgICAgICAgICB9KGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuID0geSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IF8uZ2V0Q29va2llKGgpLCByID0gJ3RydWUnID09PSBfLmdldENvb2tpZShDKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSB8fCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmICh0LmVpZCA9IGUpLCByICYmICh0LmliYU9wdG91dCA9IHIpLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oKSwgKHQgPSBuKSAmJiAoRSh0KSwgdC5laWQgJiYgXy5zZXRDb29raWUoaCwgJycsIGspLCB0LmliYU9wdG91dCAmJiBfLnNldENvb2tpZShDLCAnJywgaykpKSwgZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGUudGltZXpvbmVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgIXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MCwgbiA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICghZy5pc0VtcHR5KHQuYmxvY2tlZFpvbmVzKSB8fCAhZy5pc0VtcHR5KHQuYmxvY2tlZE9mZnNldHMpKSAmJiAoYSh0LmJsb2NrZWRab25lcywgbikgfHwgZy5jb250YWlucyh0LmJsb2NrZWRPZmZzZXRzLCBvKSkgfHwgIShnLmlzRW1wdHkodC5hbGxvd2VkWm9uZXMpICYmIGcuaXNFbXB0eSh0LmFsbG93ZWRPZmZzZXRzKSB8fCBhKHQuYWxsb3dlZFpvbmVzLCBuKSB8fCBnLmNvbnRhaW5zKHQuYWxsb3dlZE9mZnNldHMsIG8pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYShlLCByKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gciAmJiByLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIHIgJiYgbSgpKGUsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS50b0xvd2VyQ2FzZSgpID09PSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUsIG4pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBhLCBpID0gbiA/IG4uZWlkIDogbnVsbCwgcyA9IE9iamVjdCh2LmEpKCksIHUgPSBJLnVzcERhdGFIYW5kbGVyLmdldENvbnNlbnREYXRhKCksIGwgPSByICYmICdib29sZWFuJyA9PSB0eXBlb2Ygci5nZHByQXBwbGllcyAmJiByLmdkcHJBcHBsaWVzLCBwID0gciAmJiBsICYmIHIuY29uc2VudFN0cmluZyB8fCAnJywgZCA9IGUucGFydG5lcnMgfHwgZS5wYXJ0bmVyLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZDogaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja2VyczogJ3N0cmluZycgPT0gdHlwZW9mIGQgPyBkLnNwbGl0KCcsJykgOiBkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogcy5yZWZlcmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWJpZFZlcnNpb246ICc0LjM2LjAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSWZyYW1lOiBnLmluSWZyYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGYgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogKG8gPSBidG9hKEpTT04uc3RyaW5naWZ5KGMpKSwgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJysnOiAnLScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJzogJ18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPSc6ICcuJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG8ucmVwbGFjZSgvWysvPV0vZywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkcHI6IGwgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmFuZDogTWF0aC5yYW5kb20oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdSAmJiAoZi51c19wcml2YWN5ID0gdSksIGwgJiYgKGYuZ2Rwcl9jb25zZW50ID0gcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAobykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuID8gZy5kZWVwQ2xvbmUobikgOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSBKU09OLnBhcnNlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICghMCAhPT0gdC5jY3BhT3B0b3V0ID8gci5laWQgPSB0LmVpZCA6IChyLmVpZCA9IG51bGwsIHIuY2NwYU9wdG91dCA9ICEwKSwgITAgPT09IHQuaWJhT3B0b3V0ICYmIChyLmliYU9wdG91dCA9ICEwKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmxvZ0Vycm9yKGUpLCBvKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUociksIG8ocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmxvZ0Vycm9yKCdwYXJyYWJsZUlkOiBJRCBmZXRjaCByZXR1cm5lZCBhbiBlbXB0eSByZXN1bHQnKSwgbygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcubG9nRXJyb3IoJ3BhcnJhYmxlSWQ6IElEIGZldGNoIGVuY291bnRlcmVkIGFuIGVycm9yJywgZSksIG8oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KE8uYSkoJ2h0dHBzOi8vaC5wYXJyYWJsZS5jb20vcHJlYmlkJywgZSwgZiwgYik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG4KICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbCA9IHsKICAgICAgICAgICAgICAgICAgICBuYW1lOiAncGFycmFibGVJZCcsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDkyOCwKICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmIGcuaXNQbGFpbk9iamVjdChlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcnJhYmxlSWQ6IGUgfTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGdldElkOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdShlICYmIGUucGFyYW1zIHx8IHt9LCByKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0KG4uZSkoJ3VzZXJJZCcsIGwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzcwMV0pOwogICAgICAgIHBianNDaHVuayhbMTc0XSwgewogICAgICAgICAgICA3MTY6IGZ1bmN0aW9uIChlLCB0LCBvKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBvKDcxNyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDcxNzogZnVuY3Rpb24gKGUsIHQsIG8pIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCBvLmQodCwgJ2FsbG93ZWRGaWVsZHMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGc7CiAgICAgICAgICAgICAgICB9KSwgby5kKHQsICdfZmxvb3JEYXRhRm9yQXVjdGlvbicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUjsKICAgICAgICAgICAgICAgIH0pLCBvLmQodCwgJ2ZpZWxkTWF0Y2hpbmdGdW5jdGlvbnMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFU7CiAgICAgICAgICAgICAgICB9KSwgdC5nZXRGaXJzdE1hdGNoaW5nRmxvb3IgPSBFLCB0LmdldEJpZGRlcnNDcG1BZGp1c3RtZW50ID0gdywgdC5jYWxjdWxhdGVBZGp1c3RlZEZsb29yID0gUCwgdC5nZXRGbG9vciA9IE0sIHQuZ2V0Rmxvb3JzRGF0YUZvckF1Y3Rpb24gPSBCLCB0LmdldEZsb29yRGF0YUZyb21BZFVuaXRzID0gViwgdC51cGRhdGVBZFVuaXRzRm9yQXVjdGlvbiA9IHgsIHQucGlja1JhbmRvbU1vZGVsID0gcSwgdC5jcmVhdGVGbG9vcnNEYXRhRm9yQXVjdGlvbiA9IHosIHQuY29udGludWVBdWN0aW9uID0gVywgdC5pc0Zsb29yc0RhdGFWYWxpZCA9IEgsIHQucGFyc2VGbG9vckRhdGEgPSBKLCB0LnJlcXVlc3RCaWRzSG9vayA9IEwsIHQuaGFuZGxlRmV0Y2hSZXNwb25zZSA9IEssIHQuZ2VuZXJhdGVBbmRIYW5kbGVGZXRjaCA9IFgsIHQuaGFuZGxlU2V0Rmxvb3JzQ29uZmlnID0gWiwgdC5hZGRCaWRSZXNwb25zZUhvb2sgPSAkOwogICAgICAgICAgICAgICAgdmFyIE8gPSBvKDE3KSwgciA9IG8oMyksIGogPSBvKDApLCBuID0gbyg0KSwgYSA9IG8oOSksIGkgPSBvLm4oYSksIGMgPSBvKDUpLCBGID0gby5uKGMpLCBzID0gbygxMSksIEEgPSBvKDM0KSwgdSA9IG8oMTApLCBTID0gby5uKHUpLCBkID0gbygyMCk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGwgPSAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgJ3N5bWJvbCcgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgU3ltYm9sICYmIGUuY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBlICE9PSBTeW1ib2wucHJvdG90eXBlID8gJ3N5bWJvbCcgOiB0eXBlb2YgZTsKICAgICAgICAgICAgICAgICAgICB9KShlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGYoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICB2YXIgbywgciA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCByLCBuID0ge30sIGEgPSBPYmplY3Qua2V5cyhlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAociA9IDA7IHIgPCBhLmxlbmd0aDsgcisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBhW3JdLCAwIDw9IHQuaW5kZXhPZihvKSB8fCAobltvXSA9IGVbb10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpLCBhID0gMDsgYSA8IG4ubGVuZ3RoOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvID0gblthXSwgMCA8PSB0LmluZGV4T2YobykgfHwgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsIG8pICYmIChyW29dID0gZVtvXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBDKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoQyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciBpbiBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCByKSAmJiAoZVtyXSA9IG9bcl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwKHQsIGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbywgciA9IE9iamVjdC5rZXlzKHQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICYmIChvID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KSwgZSAmJiAobyA9IG8uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsIGUpLmVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgICAgfSkpLCByLnB1c2guYXBwbHkociwgbykpLCByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gayhuKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBudWxsICE9IGFyZ3VtZW50c1tlXSA/IGFyZ3VtZW50c1tlXSA6IHt9OwogICAgICAgICAgICAgICAgICAgICAgICBlICUgMiA/IHAoT2JqZWN0KGEpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG8sIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gbiwgciA9IGFbbyA9IGVdLCBvIGluIHQgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgbywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA6IHRbb10gPSByOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobiwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYSkpIDogcChPYmplY3QoYSkpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBlLCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsIGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG0sIFQgPSAnUHJpY2UgRmxvb3JzJywgaCA9IE9iamVjdChuLmIpKDEwMDAwKSwgZyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2dwdFNsb3QnLAogICAgICAgICAgICAgICAgICAgICAgICAnYWRVbml0Q29kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICdzaXplJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2RvbWFpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICdtZWRpYVR5cGUnCiAgICAgICAgICAgICAgICAgICAgXSwgeSA9ICExLCBiID0gITEsIHYgPSB7fSwgRCA9IFtdLCBSID0ge307CiAgICAgICAgICAgICAgICB2YXIgVSA9IHsKICAgICAgICAgICAgICAgICAgICBzaXplOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5wYXJzZUdQVFNpbmdsZVNpemVBcnJheSh0LnNpemUpIHx8ICcqJzsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQubWVkaWFUeXBlIHx8ICdiYW5uZXInOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ3B0U2xvdDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGouZ2V0R3B0U2xvdEluZm9Gb3JBZFVuaXRDb2RlKGUuYWRVbml0Q29kZSkuZ3B0U2xvdDsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRvbWFpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbSB8fCAoZSA9IE9iamVjdChkLmEpKCkucmVmZXJlciwgbSA9IGoucGFyc2VVcmwoZSwgeyBub0RlY29kZVdob2xlVVJMOiAhMCB9KS5ob3N0bmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgYWRVbml0Q29kZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuYWRVbml0Q29kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gRSh0LCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHIsIG4sIGEgPSAyIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1syXSA/IGFyZ3VtZW50c1syXSA6IHt9LCBpID0gKG8gPSBqLmRlZXBBY2Nlc3ModCwgJ3NjaGVtYS5maWVsZHMnKSB8fCBbXSwgciA9IGUsIG4gPSBhLCBvLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBVW3RdKHIsIG4pIHx8ICcqJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnB1c2goJyonID09PSBvID8gWycqJ10gOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby50b0xvd2VyQ2FzZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSksIGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFtdKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbWF0Y2hpbmdGbG9vcjogdC5kZWZhdWx0IH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBpLm1hcChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJy0nKSwgcyA9IGouZGVlcEFjY2Vzcyh0LCAnbWF0Y2hpbmdJbnB1dHMuJy5jb25jYXQoYykpOwogICAgICAgICAgICAgICAgICAgIGlmIChzKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gayh7fSwgcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHUsIGQsIGwgPSAodSA9IGksIGQgPSBqLmRlZXBBY2Nlc3ModCwgJ3NjaGVtYS5kZWxpbWl0ZXInKSB8fCAnfCcsIHUucmVkdWNlKGZ1bmN0aW9uIChlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5wdXNoKHQgKyBkICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuc29ydChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3BsaXQoJyonKS5sZW5ndGggLSB0LnNwbGl0KCcqJykubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICB9KSksIGYgPSBTKCkobCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlcy5oYXNPd25Qcm9wZXJ0eShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHAgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vck1pbjogdC5mbG9vck1pbiB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JSdWxlVmFsdWU6IHQudmFsdWVzW2ZdIHx8IHQuZGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nRGF0YTogbFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nUnVsZTogZgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBwLm1hdGNoaW5nRmxvb3IgPSBNYXRoLm1heChwLmZsb29yTWluLCBwLmZsb29yUnVsZVZhbHVlKSwgai5kZWVwU2V0VmFsdWUodCwgJ21hdGNoaW5nSW5wdXRzLicuY29uY2F0KGMpLCBrKHt9LCBwKSksIHA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB3KGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IDIgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzJdID8gYXJndW1lbnRzWzJdIDoge30sIHIgPSBqLmRlZXBBY2Nlc3MoT2JqZWN0KE8uYSkoKSwgJ2JpZGRlclNldHRpbmdzLicuY29uY2F0KGUsICcuYmlkQ3BtQWRqdXN0bWVudCcpKSB8fCBqLmRlZXBBY2Nlc3MoT2JqZWN0KE8uYSkoKSwgJ2JpZGRlclNldHRpbmdzLnN0YW5kYXJkLmJpZENwbUFkanVzdG1lbnQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gciA/IHBhcnNlRmxvYXQocih0LCBrKGsoe30sIG8pLCB7fSwgeyBjcG06IHQgfSkpKSA6IHBhcnNlRmxvYXQodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IE1hdGgucG93KDEwLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgKiBvIC8gKHQgKiBvKSAqIChlICogbykgLyBvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIEkgPSB7CiAgICAgICAgICAgICAgICAgICAgYmFubmVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLmJhbm5lci5zaXplcycpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgdmlkZW86IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqLmRlZXBBY2Nlc3MoZSwgJ21lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZScpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgbmF0aXZlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5kZWVwQWNjZXNzKGUsICdtZWRpYVR5cGVzLm5hdGl2ZS5pbWFnZS5zaXplcycpID8gW2ouZGVlcEFjY2VzcyhlLCAnbWVkaWFUeXBlcy5uYXRpdmUuaW1hZ2Uuc2l6ZXMnKV0gOiBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZnVuY3Rpb24gTSgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSwgdCwgbywgciA9IDAgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gYXJndW1lbnRzWzBdID8gYXJndW1lbnRzWzBdIDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlOiAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnKicKICAgICAgICAgICAgICAgICAgICAgICAgfSwgbiA9IHRoaXMsIGEgPSBSW24uYXVjdGlvbklkXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWEgfHwgYS5za2lwcGVkKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgICAgICAgICAgZSA9IG4sIHQgPSByLCBvID0gT2JqZWN0LmtleXMoZS5tZWRpYVR5cGVzIHx8IHt9KSwgJyonID09PSB0Lm1lZGlhVHlwZSAmJiAxID09PSBvLmxlbmd0aCAmJiAodC5tZWRpYVR5cGUgPSBvWzBdKSwgJyonID09PSB0LnNpemUgJiYgLTEgIT09IG8uaW5kZXhPZih0Lm1lZGlhVHlwZSkgJiYgSVt0Lm1lZGlhVHlwZV0gJiYgMSA9PT0gSVt0Lm1lZGlhVHlwZV0oZSkubGVuZ3RoICYmICh0LnNpemUgPSBJW3QubWVkaWFUeXBlXShlKVswXSksIHIgPSB0OwogICAgICAgICAgICAgICAgICAgIHZhciBpLCBjLCBzLCB1ID0gRShhLmRhdGEsIGsoe30sIG4pLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGU6IHIubWVkaWFUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogci5zaXplCiAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBkID0gci5jdXJyZW5jeSB8fCBhLmRhdGEuY3VycmVuY3k7CiAgICAgICAgICAgICAgICAgICAgaWYgKHUubWF0Y2hpbmdGbG9vciAmJiBkICE9PSBhLmRhdGEuY3VycmVuY3kpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Lm1hdGNoaW5nRmxvb3IgPSBPYmplY3QoTy5hKSgpLmNvbnZlcnRDdXJyZW5jeSh1Lm1hdGNoaW5nRmxvb3IsIGEuZGF0YS5jdXJyZW5jeSwgZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGoubG9nV2FybignJy5jb25jYXQoVCwgJzogVW5hYmxlIHRvIGdldCBjdXJyZW5jeSBjb252ZXJzaW9uIGZvciBnZXRGbG9vciBmb3IgYmlkZGVyICcpLmNvbmNhdChuLmJpZGRlciwgJy4gWW91IG11c3QgaGF2ZSBjdXJyZW5jeSBtb2R1bGUgZW5hYmxlZCB3aXRoIGRlZmF1bHRSYXRlcyBpbiB5b3VyIGN1cnJlbmN5IGNvbmZpZycpKSwgZCA9IGEuZGF0YS5jdXJyZW5jeTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmVuZm9yY2VtZW50LmJpZEFkanVzdG1lbnQgJiYgdS5tYXRjaGluZ0Zsb29yICYmIChpID0gdyhuLmJpZGRlciwgdS5tYXRjaGluZ0Zsb29yKSwgdS5tYXRjaGluZ0Zsb29yID0gaSA/IFAodS5tYXRjaGluZ0Zsb29yLCBpKSA6IHUubWF0Y2hpbmdGbG9vciksIHUubWF0Y2hpbmdGbG9vciA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3I6IChjID0gdS5tYXRjaGluZ0Zsb29yLCBzID0gNCwgTWF0aC5jZWlsKChwYXJzZUZsb2F0KGMpICogTWF0aC5wb3coMTAsIHMpKS50b0ZpeGVkKDEpKSAvIE1hdGgucG93KDEwLCBzKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBkCiAgICAgICAgICAgICAgICAgICAgfSA6IHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gQihlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHIsIG4sIGEsIGksIGMgPSBqLmRlZXBDbG9uZShlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5zY2hlbWEuZGVsaW1pdGVyID0gZS5zY2hlbWEuZGVsaW1pdGVyIHx8ICd8JywgYy52YWx1ZXMgPSAociA9IHQsIG4gPSAobyA9IGMpLnNjaGVtYS5maWVsZHMsIGEgPSBvLnNjaGVtYS5kZWxpbWl0ZXIsIGkgPSByICYmIC0xID09PSBuLmluZGV4T2YoJ2FkVW5pdENvZGUnKSAmJiBuLnVuc2hpZnQoJ2FkVW5pdENvZGUnKSwgT2JqZWN0LmtleXMoby52YWx1ZXMpLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVsoaSA/ICcnLmNvbmNhdChyKS5jb25jYXQoYSkuY29uY2F0KHQpIDogdCkudG9Mb3dlckNhc2UoKV0gPSBvLnZhbHVlc1t0XSwgZTsKICAgICAgICAgICAgICAgICAgICB9LCB7fSkpLCBjLmN1cnJlbmN5ID0gYy5jdXJyZW5jeSB8fCAnVVNEJywgYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFYoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnJlZHVjZShmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEgodC5mbG9vcnMpICYmIChlLnZhbHVlcyA/IChvID0gQih0LmZsb29ycywgdC5jb2RlKS52YWx1ZXMsIEMoZS52YWx1ZXMsIG8pKSA6IChlID0gQih0LmZsb29ycywgdC5jb2RlKSkubG9jYXRpb24gPSAnYWRVbml0JyksIGU7CiAgICAgICAgICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geChlLCB0LCBvKSB7CiAgICAgICAgICAgICAgICAgICAgZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNraXBwZWQgPyBkZWxldGUgZS5nZXRGbG9vciA6IGUuZ2V0Rmxvb3IgPSBNLCBlLmF1Y3Rpb25JZCA9IG8sIGUuZmxvb3JEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQ6IHQuc2tpcHBlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwUmF0ZTogdC5za2lwUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vck1pbjogdC5mbG9vck1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFZlcnNpb246IGouZGVlcEFjY2Vzcyh0LCAnZGF0YS5tb2RlbFZlcnNpb24nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbFdlaWdodDogai5kZWVwQWNjZXNzKHQsICdkYXRhLm1vZGVsV2VpZ2h0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxUaW1lc3RhbXA6IGouZGVlcEFjY2Vzcyh0LCAnZGF0YS5tb2RlbFRpbWVzdGFtcCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBqLmRlZXBBY2Nlc3ModCwgJ2RhdGEubG9jYXRpb24nLCAnbm9EYXRhJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JQcm92aWRlcjogdC5mbG9vclByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoU3RhdHVzOiB2LmZldGNoU3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHEoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG8gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0ICsgMSksIHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChvIC09IGVbcl0ubW9kZWxXZWlnaHQpIDw9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVtyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvLCByLCBuLCBhID0gai5kZWVwQ2xvbmUodik7CiAgICAgICAgICAgICAgICAgICAgMiA9PT0gai5kZWVwQWNjZXNzKGEsICdkYXRhLmZsb29yc1NjaGVtYVZlcnNpb24nKSAmJiAociA9IChvID0gYS5kYXRhKS5tb2RlbEdyb3VwcywgbiA9IGYobywgWydtb2RlbEdyb3VwcyddKSwgYS5kYXRhID0gQyhuLCBxKHIsIG4ubW9kZWxXZWlnaHRTdW0pKSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGksIGMsIHMgPSAwID09PSBPYmplY3Qua2V5cyhqLmRlZXBBY2Nlc3MoYSwgJ2RhdGEudmFsdWVzJykgfHwge30pLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5kYXRhID0gcyA/IFYoZSkgOiBCKGEuZGF0YSksIDAgPT09IE9iamVjdC5rZXlzKGouZGVlcEFjY2VzcyhhLCAnZGF0YS52YWx1ZXMnKSB8fCB7fSkubGVuZ3RoID8gYS5za2lwcGVkID0gITAgOiAoaSA9IGouZ2V0UGFyYW1ldGVyQnlOYW1lKCdwYmpzX3NraXBSYXRlJykgfHwgYS5za2lwUmF0ZSwgYyA9IDEwMCAqIE1hdGgucmFuZG9tKCkgPCBwYXJzZUZsb2F0KGkpLCBhLnNraXBwZWQgPSBjKSwgYS5oYXNPd25Qcm9wZXJ0eSgnZmxvb3JNaW4nKSAmJiAoYS5kYXRhLmZsb29yTWluID0gYS5mbG9vck1pbiksIHgoZSwgYSwgdCksIGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBXKHQpIHsKICAgICAgICAgICAgICAgICAgICB0Lmhhc0V4aXRlZCB8fCAoRCA9IEQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRpbWVyICE9PSB0LnRpbWVyOwogICAgICAgICAgICAgICAgICAgIH0pLCB0LnJlcUJpZHNDb25maWdPYmouYXVjdGlvbklkID0gdC5yZXFCaWRzQ29uZmlnT2JqLmF1Y3Rpb25JZCB8fCBqLmdlbmVyYXRlVVVJRCgpLCBSW3QucmVxQmlkc0NvbmZpZ09iai5hdWN0aW9uSWRdID0geih0LnJlcUJpZHNDb25maWdPYmouYWRVbml0cyB8fCBPYmplY3QoTy5hKSgpLmFkVW5pdHMsIHQucmVxQmlkc0NvbmZpZ09iai5hdWN0aW9uSWQpLCB0Lm5leHRGbi5hcHBseSh0LmNvbnRleHQsIFt0LnJlcUJpZHNDb25maWdPYmpdKSwgdC5oYXNFeGl0ZWQgPSAhMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKGksIGMsIHMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT09IGwoaS52YWx1ZXMpICYmIChpLnZhbHVlcyA9IE9iamVjdC5rZXlzKGkudmFsdWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8sIHIsIG4sIGE7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvID0gdCwgciA9IGkudmFsdWVzW3RdLCBuID0gYywgYSA9IHMsICdzdHJpbmcnID09IHR5cGVvZiBvICYmIG8uc3BsaXQoYSkubGVuZ3RoID09PSBuICYmICdudW1iZXInID09IHR5cGVvZiByICYmIChlW3RdID0gaS52YWx1ZXNbdF0pLCBlOwogICAgICAgICAgICAgICAgICAgIH0sIHt9KSwgMCA8IE9iamVjdC5rZXlzKGkudmFsdWVzKS5sZW5ndGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gTihlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkgJiYgMCA8IGUubGVuZ3RoICYmIGUuZXZlcnkoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgIT09IGcuaW5kZXhPZihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGoubG9nRXJyb3IoJycuY29uY2F0KFQsICc6IEZpZWxkcyByZWNpZXZlZCBkbyBub3QgbWF0Y2ggYWxsb3dlZCBmaWVsZHMnKSk7CiAgICAgICAgICAgICAgICAgICAgfShqLmRlZXBBY2Nlc3MoZSwgJ3NjaGVtYS5maWVsZHMnKSkgJiYgRyhlLCBlLnNjaGVtYS5maWVsZHMubGVuZ3RoLCBlLnNjaGVtYS5kZWxpbWl0ZXIgfHwgJ3wnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBfID0gewogICAgICAgICAgICAgICAgICAgIDE6IE4sCiAgICAgICAgICAgICAgICAgICAgMjogZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoIUFycmF5LmlzQXJyYXkodC5tb2RlbEdyb3VwcykgfHwgMCA9PT0gdC5tb2RlbEdyb3Vwcy5sZW5ndGgpICYmICh0Lm1vZGVsV2VpZ2h0U3VtID0gMCwgdC5tb2RlbEdyb3Vwcy5ldmVyeShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoJ251bWJlcicgIT0gdHlwZW9mIGUubW9kZWxXZWlnaHQgfHwgIU4oZSkpICYmICh0Lm1vZGVsV2VpZ2h0U3VtICs9IGUubW9kZWxXZWlnaHQsICEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBIKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdCcgPT09IGwoZSkgJiYgKGUuZmxvb3JzU2NoZW1hVmVyc2lvbiA9IGUuZmxvb3JzU2NoZW1hVmVyc2lvbiB8fCAxLCAnZnVuY3Rpb24nICE9IHR5cGVvZiBfW2UuZmxvb3JzU2NoZW1hVmVyc2lvbl0gPyAoai5sb2dFcnJvcignJy5jb25jYXQoVCwgJzogVW5rbm93biBmbG9vcnNTY2hlbWFWZXJzaW9uOiAnKSwgZS5mbG9vcnNTY2hlbWFWZXJzaW9uKSwgITEpIDogX1tlLmZsb29yc1NjaGVtYVZlcnNpb25dKGUpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEooZSwgdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICdvYmplY3QnID09PSBsKGUpICYmIEgoZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqLmxvZ0luZm8oJycuY29uY2F0KFQsICc6IEEgJykuY29uY2F0KHQsICcgc2V0IHRoZSBhdWN0aW9uIGZsb29yIGRhdGEgc2V0IHRvICcpLCBlKSwgayhrKHt9LCBlKSwge30sIHsgbG9jYXRpb246IHQgfSk7CiAgICAgICAgICAgICAgICAgICAgai5sb2dFcnJvcignJy5jb25jYXQoVCwgJzogVGhlIGZsb29ycyBkYXRhIGRpZCBub3QgY29udGFpbiBjb3JyZWN0IHZhbHVlcycpLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEwoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICByZXFCaWRzQ29uZmlnT2JqOiB0LAogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0Rm46IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVFeGl0ZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lcjogbnVsbAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgMCA8IHYuYXVjdGlvbkRlbGF5ICYmIHkgPyAoby50aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBqLmxvZ1dhcm4oJycuY29uY2F0KFQsICc6IEZldGNoIGF0dGVtcHQgZGlkIG5vdCByZXR1cm4gaW4gdGltZSBmb3IgYXVjdGlvbicpKSwgdi5mZXRjaFN0YXR1cyA9ICd0aW1lb3V0JywgVyhvKTsKICAgICAgICAgICAgICAgICAgICB9LCB2LmF1Y3Rpb25EZWxheSksIEQucHVzaChvKSkgOiBXKG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWSgpIHsKICAgICAgICAgICAgICAgICAgICBELmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGUudGltZXIpLCBXKGUpOwogICAgICAgICAgICAgICAgICAgIH0pLCBEID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBLKHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbzsKICAgICAgICAgICAgICAgICAgICB5ID0gITEsIHYuZmV0Y2hTdGF0dXMgPSAnc3VjY2Vzcyc7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgbyA9IEpTT04ucGFyc2UodCk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBvID0gdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBKKG8sICdmZXRjaCcpOwogICAgICAgICAgICAgICAgICAgIGUgJiYgKHYuZGF0YSA9IGUsIHYuc2tpcFJhdGUgPSBqLmlzTnVtYmVyKGUuc2tpcFJhdGUpID8gZS5za2lwUmF0ZSA6IHYuc2tpcFJhdGUsIHYuZmxvb3JQcm92aWRlciA9IGUuZmxvb3JQcm92aWRlciB8fCB2LmZsb29yUHJvdmlkZXIpLCBZKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBRKGUpIHsKICAgICAgICAgICAgICAgICAgICB5ID0gITEsIHYuZmV0Y2hTdGF0dXMgPSAnZXJyb3InLCBqLmxvZ0Vycm9yKCcnLmNvbmNhdChULCAnOiBGZXRjaCBlcnJvcmVkIHdpdGg6ICcpLCBlKSwgWSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gWChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS51cmwgJiYgIXkgPyAnR0VUJyAhPT0gKGUubWV0aG9kIHx8ICdHRVQnKSA/IGoubG9nRXJyb3IoJycuY29uY2F0KFQsICc6IFwnR0VUXCcgaXMgdGhlIG9ubHkgcmVxdWVzdCBtZXRob2Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSEnKSkgOiAoaChlLnVybCwgewogICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBLLAogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogUQogICAgICAgICAgICAgICAgICAgIH0sIG51bGwsIHsgbWV0aG9kOiAnR0VUJyB9KSwgeSA9ICEwKSA6IHkgJiYgai5sb2dXYXJuKCcnLmNvbmNhdChULCAnOiBBIGZldGNoIGlzIGFscmVhZHkgb2NjdXJpbmcuIFNraXBwaW5nLicpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFoodCkgewogICAgICAgICAgICAgICAgICAgICh2ID0gai5waWNrKHQsIFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2Zsb29yTWluJywKICAgICAgICAgICAgICAgICAgICAgICAgJ2VuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICExICE9PSBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnYXVjdGlvbkRlbGF5JywKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdmbG9vclByb3ZpZGVyJywKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqLmRlZXBBY2Nlc3ModCwgJ2RhdGEuZmxvb3JQcm92aWRlcicsIGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAnZW5kcG9pbnQnLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdza2lwUmF0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc05hTihqLmRlZXBBY2Nlc3ModCwgJ2RhdGEuc2tpcFJhdGUnKSkgPyB0LnNraXBSYXRlIHx8IDAgOiB0LmRhdGEuc2tpcFJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdlbmZvcmNlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5waWNrKGUgfHwge30sIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5mb3JjZUpTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgIT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5mb3JjZVBCUycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEwID09PSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zsb29yRGVhbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMCA9PT0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaWRBZGp1c3RtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITEgIT09IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdhZGRpdGlvbmFsU2NoZW1hRmllbGRzJywKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0JyA9PT0gbChlKSAmJiAwIDwgT2JqZWN0LmtleXMoZSkubGVuZ3RoID8gKHQgPSBlLCB2b2lkIE9iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9PT0gZy5pbmRleE9mKGUpICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHRbZV0gJiYgKGcucHVzaChlKSwgVVtlXSA9IHRbZV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpIDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIEooZSwgJ3NldENvbmZpZycpIHx8IHYuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0pKS5lbmFibGVkID8gKFgodi5lbmRwb2ludCksIGIgfHwgKGkuYS5vbihGLmEuRVZFTlRTLkFVQ1RJT05fRU5ELCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxldGUgUltlLmF1Y3Rpb25JZF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDMwMDApOwogICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QoTy5hKSgpLnJlcXVlc3RCaWRzLmJlZm9yZShMLCA1MCksIE9iamVjdChzLmEpKCdhZGRCaWRSZXNwb25zZScpLmJlZm9yZSgkLCBqLmRlYnVnVHVybmVkT24oKSA/IDQgOiA1MCksIGIgPSAhMCkpIDogKGoubG9nSW5mbygnJy5jb25jYXQoVCwgJzogVHVybmluZyBvZmYgbW9kdWxlJykpLCB2ID0ge30sIFIgPSB7fSwgT2JqZWN0KHMuYSkoJ2FkZEJpZFJlc3BvbnNlJykuZ2V0SG9va3MoeyBob29rOiAkIH0pLnJlbW92ZSgpLCBPYmplY3QoTy5hKSgpLnJlcXVlc3RCaWRzLmdldEhvb2tzKHsgaG9vazogTCB9KS5yZW1vdmUoKSwgYiA9ICExKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uICQodCwgbywgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gUlt0aGlzLmJpZGRlclJlcXVlc3QuYXVjdGlvbklkXSwgbiA9IFMoKSh0aGlzLmJpZGRlclJlcXVlc3QuYmlkcywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmJpZElkICYmIGUuYmlkSWQgPT09IHIucmVxdWVzdElkOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIXIgfHwgZS5za2lwcGVkIHx8ICFuKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jYWxsKHRoaXMsIG8sIHIpOwogICAgICAgICAgICAgICAgICAgIHZhciBhLCBpID0gRShlLmRhdGEsIGsoe30sIG4pLCBrKGsoe30sIHIpLCB7fSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIGlmICghaS5tYXRjaGluZ0Zsb29yKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5sb2dXYXJuKCcnLmNvbmNhdChULCAnOiB1bmFibGUgdG8gZGV0ZXJtaW5lIGEgbWF0Y2hpbmcgcHJpY2UgZmxvb3IgZm9yIGJpZFJlc3BvbnNlJyksIHIpLCB0LmNhbGwodGhpcywgbywgcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIGMsIHMsIHUsIGQsIGwsIGYsIHAsIG0sIGgsIGcsIHkgPSBlLmRhdGEuY3VycmVuY3kudG9VcHBlckNhc2UoKSwgYiA9IHIuY3VycmVuY3kgfHwgJ1VTRCc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHkgPT09IGIudG9VcHBlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHIuY3BtOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIub3JpZ2luYWxDdXJyZW5jeSAmJiB5ID09PSByLm9yaWdpbmFsQ3VycmVuY3kudG9VcHBlckNhc2UoKSkKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IHIub3JpZ2luYWxDcG07CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IE9iamVjdChPLmEpKCkuY29udmVydEN1cnJlbmN5KHIuY3BtLCBiLnRvVXBwZXJDYXNlKCksIHkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gai5sb2dFcnJvcignJy5jb25jYXQoVCwgJzogVW5hYmxlIGRvIGdldCBjdXJyZW5jeSBjb252ZXJzaW9uIGZvciBiaWRSZXNwb25zZSB0byBGbG9vciBDdXJyZW5jeS4gRG8geW91IGhhdmUgQ3VycmVuY3kgbW9kdWxlIGVuYWJsZWQ/ICcpLmNvbmNhdChyKSksIHQuY2FsbCh0aGlzLCBvLCByKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChhID0gdyhyLmJpZGRlckNvZGUsIGEsIHIpLCBjID0gZSwgcyA9IGksIGQgPSBhLCAodSA9IHIpLmZsb29yRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yVmFsdWU6IHMubWF0Y2hpbmdGbG9vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yUnVsZTogcy5tYXRjaGluZ1J1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9vclJ1bGVWYWx1ZTogcy5mbG9vclJ1bGVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yQ3VycmVuY3k6IGMuZGF0YS5jdXJyZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbUFmdGVyQWRqdXN0bWVudHM6IGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlbWVudHM6IGsoe30sIGMuZW5mb3JjZW1lbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZpZWxkczoge30KICAgICAgICAgICAgICAgICAgICAgICAgfSwgYy5kYXRhLnNjaGVtYS5maWVsZHMuZm9yRWFjaChmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG8gPSBzLm1hdGNoaW5nRGF0YS5zcGxpdChjLmRhdGEuc2NoZW1hLmRlbGltaXRlcilbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LmZsb29yRGF0YS5tYXRjaGVkRmllbGRzW2VdID0gbzsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIGwgPSBlLCBmID0gaSwgcCA9IHIsIG0gPSAhMSAhPT0gai5kZWVwQWNjZXNzKGwsICdlbmZvcmNlbWVudC5lbmZvcmNlSlMnKSwgaCA9ICEwID09PSBqLmRlZXBBY2Nlc3MobCwgJ2VuZm9yY2VtZW50LmZsb29yRGVhbHMnKSB8fCAhcC5kZWFsSWQsIGcgPSBwLmZsb29yRGF0YS5jcG1BZnRlckFkanVzdG1lbnRzIDwgZi5tYXRjaGluZ0Zsb29yLCBtICYmIGcgJiYgaCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IE9iamVjdChBLmEpKEYuYS5TVEFUVVMuTk9fQklELCBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEModiwgai5waWNrKHIsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbG9vckRhdGEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lZGlhVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VycmVuY3knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yaWdpbmFsQ3BtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmlnaW5hbEN1cnJlbmN5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRDcG1Jbk5ld0N1cnJlbmN5JwogICAgICAgICAgICAgICAgICAgICAgICBdKSksIHYuc3RhdHVzID0gRi5hLkJJRF9TVEFUVVMuQklEX1JFSkVDVEVELCB2LmNwbSA9IDAsIGoubG9nV2FybignJy5jb25jYXQoVCwgJzogJykuY29uY2F0KHYuYmlkZGVyQ29kZSwgJ1wncyBCaWQgUmVzcG9uc2UgZm9yICcpLmNvbmNhdChvLCAnIHdhcyByZWplY3RlZCBkdWUgdG8gZmxvb3Igbm90IG1ldCcpLCByKSwgdC5jYWxsKHRoaXMsIG8sIHYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5jYWxsKHRoaXMsIG8sIHIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgci5iLmdldENvbmZpZygnZmxvb3JzJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWihlLmZsb29ycyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs3MTZdKTsKICAgICAgICBwYmpzQ2h1bmsoWzE3MF0sIHsKICAgICAgICAgICAgNzI0OiBmdW5jdGlvbiAoZSwgbywgdCkgewogICAgICAgICAgICAgICAgZS5leHBvcnRzID0gdCg3MjUpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA3MjU6IGZ1bmN0aW9uIChlLCBvLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKG8sICdwdWJDb21tb25JZFN1Ym1vZHVsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gSTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIG0gPSB0KDApLCByID0gdCgxMSksIGEgPSB0KDcpLCBpID0gdCg0KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHAoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAocCA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHYgPSAnUHVibGlzaGVyQ29tbW9uSWQnLCBuID0gJ2Nvb2tpZScsIGQgPSAnaHRtbDUnLCBjID0gJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgbCA9ICdodHRwczovL2lkLnNoYXJlZGlkLm9yZy9pZCcsIHMgPSAnX3NoYXJlZGlkJywgdSA9ICdUaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAxIEdNVCcsIGcgPSBPYmplY3QoYS5iKSg4ODcsICdwdWJDb21tb25JZCcpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZihlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIHI7CiAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKHQgPSBlLnN0b3JhZ2UubmFtZSArIHMsIHIgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgODY0MDAwMDAgKiBnLmV4cGlyZXMpLnRvVVRDU3RyaW5nKCksIGUuc3RvcmFnZS50eXBlID09PSBuID8gZy5jb29raWVzQXJlRW5hYmxlZCgpICYmIGcuc2V0Q29va2llKHQsIG8sIHIsICdMQVgnLCBJLmRvbWFpbk92ZXJyaWRlKCkpIDogZS5zdG9yYWdlLnR5cGUgPT09IGQgJiYgZy5oYXNMb2NhbFN0b3JhZ2UoKSAmJiAoZy5zZXREYXRhSW5Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KHQsICdfZXhwJyksIHIpLCBnLnNldERhdGFJbkxvY2FsU3RvcmFnZSh0LCBvKSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbS5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBoKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGUuc3RvcmFnZS5uYW1lICsgczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuc3RvcmFnZS50eXBlID09PSBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZy5jb29raWVzQXJlRW5hYmxlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmdldENvb2tpZShvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlLnN0b3JhZ2UudHlwZSA9PT0gZCAmJiBnLmhhc0xvY2FsU3RvcmFnZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGcuZ2V0RGF0YUZyb21Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KG8sICdfZXhwJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKG8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPCBuZXcgRGF0ZSh0KS5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKG8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIodCwgciwgYSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IEpTT04ucGFyc2UoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubG9nSW5mbygnUHViQ29tbW9uSWQ6IEdlbmVyYXRlZCBTaGFyZWRJZDogJyArIG8uc2hhcmVkSWQpLCBvLnNoYXJlZElkICYmIChvLnNoYXJlZElkICE9PSBjID8gZihhLCBvLnNoYXJlZElkKSA6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZS5zdG9yYWdlLm5hbWUgKyBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcmFnZS50eXBlID09PSBuID8gZy5jb29raWVzQXJlRW5hYmxlZCgpICYmIGcuc2V0Q29va2llKG8sICcnLCB1KSA6IGUuc3RvcmFnZS50eXBlID09PSBkICYmIChnLnJlbW92ZURhdGFGcm9tTG9jYWxTdG9yYWdlKCcnLmNvbmNhdChvLCAnX2V4cCcpKSwgZy5yZW1vdmVEYXRhRnJvbUxvY2FsU3RvcmFnZShvKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShhKSksIHIodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubG9nSW5mbygnUHViQ29tbW9uSWQ6IGZhaWxlZCB0byBnZXQgc2hhcmVkaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB5KHQsIHIsIGEsIG4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG87CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIHIgJiYgcigpLCBPYmplY3QoaS5hKSgobyA9IG4pICYmICdib29sZWFuJyA9PSB0eXBlb2Ygby5nZHByQXBwbGllcyAmJiBvLmdkcHJBcHBsaWVzID8gJycuY29uY2F0KGwsICc/Z2Rwcj0xJmdkcHJfY29uc2VudD0nKS5jb25jYXQoby5jb25zZW50U3RyaW5nKSA6IGwsIGIodCwgZSwgYSksIHZvaWQgMCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogITAKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBJID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwdWJDb21tb25JZCcsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDg4NywKICAgICAgICAgICAgICAgICAgICBtYWtlQ2FsbGJhY2s6IGZ1bmN0aW9uIChlLCBvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBvID8gbyA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBtLnBhcnNlVXJsKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgci5zZWFyY2guaWQgPSBlbmNvZGVVUklDb21wb25lbnQoJ3B1YmNpZDonICsgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG0uYnVpbGRVcmwocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0udHJpZ2dlclBpeGVsKGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlOiBmdW5jdGlvbiAoZSwgbykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCwgciA9IHsgcHViY2lkOiBlIH0sIGEgPSBvLnBhcmFtcywgbiA9IChhID0gdm9pZCAwID09PSBhID8ge30gOiBhKS5lbmFibGVTaGFyZWRJZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEodm9pZCAwICE9PSBuICYmIG4pIHx8ICh0ID0gaChvKSkgJiYgKHIuc2hhcmVkaWQgPSB7IGlkOiB0IH0pLCByOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZ2V0SWQ6IGZ1bmN0aW9uIChlLCBvLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gZSA6IHt9LCBhID0gMSA8IGFyZ3VtZW50cy5sZW5ndGggPyBvIDogdm9pZCAwLCBuID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCBpID0gci5wYXJhbXMsIGQgPSAoaSA9IHZvaWQgMCA9PT0gaSA/IHt9IDogaSkuY3JlYXRlLCBjID0gdm9pZCAwID09PSBkIHx8IGQsIGwgPSBpLnBpeGVsVXJsLCBzID0gaS5lbmFibGVTaGFyZWRJZCwgdSA9IHZvaWQgMCAhPT0gcyAmJiBzLCBnID0gbjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QnID09PSBwKHdpbmRvd1t2XSkgJiYgKGcgPSB3aW5kb3dbdl0uZ2V0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gZyB8fCAoYyAmJiBtLmhhc0RldmljZUFjY2VzcygpID8gbS5nZW5lcmF0ZVVVSUQoKSA6IHZvaWQgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSB0aGlzLm1ha2VDYWxsYmFjayhsLCBnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IHUgPyB5KGcsIGYsIHIsIGEpIDogZgogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kSWQ6IGZ1bmN0aW9uIChlLCBvLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gMCA8IGFyZ3VtZW50cy5sZW5ndGggJiYgdm9pZCAwICE9PSBlID8gZSA6IHt9LCBhID0gMiA8IGFyZ3VtZW50cy5sZW5ndGggPyB0IDogdm9pZCAwLCBuID0gci5wYXJhbXMsIGkgPSAobiA9IHZvaWQgMCA9PT0gbiA/IHt9IDogbikuZXh0ZW5kLCBkID0gdm9pZCAwICE9PSBpICYmIGksIGMgPSBuLnBpeGVsVXJsLCBsID0gbi5lbmFibGVTaGFyZWRJZCwgcyA9IHZvaWQgMCAhPT0gbCAmJiBsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ29iamVjdCcgPT09IHAod2luZG93W3ZdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgKHMgJiYgZihyLCBoKHIpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYyA/IHsgY2FsbGJhY2s6IHRoaXMubWFrZUNhbGxiYWNrKGMsIGEpIH0gOiAocyAmJiBmKHIsIGgocikpLCB7IGlkOiBhIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBkb21haW5PdmVycmlkZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBlLCBvLCB0ID0gZG9jdW1lbnQuZG9tYWluLnNwbGl0KCcuJyksIHIgPSAnX2dkJy5jb25jYXQoRGF0ZS5ub3coKSksIGEgPSAwOyBhIDwgdC5sZW5ndGg7IGErKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSB0LnNsaWNlKGEpLmpvaW4oJy4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnLnNldENvb2tpZShyLCAnMScsIHZvaWQgMCwgdm9pZCAwLCBuKSwgbyA9IGcuZ2V0Q29va2llKHIpLCBnLnNldENvb2tpZShyLCAnJywgJ1RodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDEgR01UJywgdm9pZCAwLCBuKSwgJzEnICE9PSBvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0KHIuZSkoJ3VzZXJJZCcsIEkpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgWzcyNF0pOwogICAgICAgIHBianNDaHVuayhbMTY3XSwgewogICAgICAgICAgICA3MzI6IGZ1bmN0aW9uIChlLCByLCBhKSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSBhKDczMyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDczMzogZnVuY3Rpb24gKGUsIHIsIGEpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCBhLmQociwgJ3NwZWMnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBUID0gYSgwKSwgdCA9IGEoMSksIFAgPSBhKDIpLCBEID0gYSgzKSwgaSA9IGEoMTIpOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUigpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFIgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAxOyByIDwgYXJndW1lbnRzLmxlbmd0aDsgcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IGFyZ3VtZW50c1tyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgaW4gYSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSwgdCkgJiYgKGVbdF0gPSBhW3RdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKICAgICAgICAgICAgICAgICAgICB9KS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gcyhyLCBlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHQgPSBPYmplY3Qua2V5cyhyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAoYSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMociksIGUgJiYgKGEgPSBhLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLCBlKS5lbnVtZXJhYmxlOwogICAgICAgICAgICAgICAgICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIGEpKSwgdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG0oaSkgewogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSAxOyBlIDwgYXJndW1lbnRzLmxlbmd0aDsgZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gbnVsbCAhPSBhcmd1bWVudHNbZV0gPyBhcmd1bWVudHNbZV0gOiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZSAlIDIgPyBzKE9iamVjdChuKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGksIHQgPSBuW2EgPSBlXSwgYSBpbiByID8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIGEsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlOiAhMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiByW2FdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKSA6IHMoT2JqZWN0KG4pKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaSwgZSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLCBlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFkoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoWSA9ICdmdW5jdGlvbicgPT0gdHlwZW9mIFN5bWJvbCAmJiAnc3ltYm9sJyA9PSB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAmJiAnZnVuY3Rpb24nID09IHR5cGVvZiBTeW1ib2wgJiYgZS5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIGUgIT09IFN5bWJvbC5wcm90b3R5cGUgPyAnc3ltYm9sJyA6IHR5cGVvZiBlOwogICAgICAgICAgICAgICAgICAgIH0pKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG8gPSAncHVibWF0aWMnLCBBID0gJ1B1Yk1hdGljOiAnLCB4ID0gJ1VTRCcsIE4gPSB2b2lkIDAsIG4gPSAnaHR0cHM6Ly9wdWJtYXRpYy5iYnZtcy5jb20vci8nLmNvbmNhdCgnJFJFTkRFUkVSJywgJy5qcycpLCBrID0gewogICAgICAgICAgICAgICAgICAgICAgICBrYWRwYWdldXJsOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZGVyOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgeW9iOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgbGF0OiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgbG9uOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgd2lpZDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZJZDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcklkOiAnJwogICAgICAgICAgICAgICAgICAgIH0sIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUjogJ251bWJlcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFNUUklORzogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU46ICdib29sZWFuJywKICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVk6ICdhcnJheScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9CSkVDVDogJ29iamVjdCcKICAgICAgICAgICAgICAgICAgICB9LCBwID0gewogICAgICAgICAgICAgICAgICAgICAgICBtaW1lczogZC5BUlJBWSwKICAgICAgICAgICAgICAgICAgICAgICAgbWluZHVyYXRpb246IGQuTlVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogZC5OVU1CRVIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZGVsYXk6IGQuTlVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja21ldGhvZDogZC5BUlJBWSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBpOiBkLkFSUkFZLAogICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbHM6IGQuQVJSQVksCiAgICAgICAgICAgICAgICAgICAgICAgIHc6IGQuTlVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICBoOiBkLk5VTUJFUiwKICAgICAgICAgICAgICAgICAgICAgICAgYmF0dHI6IGQuQVJSQVksCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhcml0eTogZC5OVU1CRVIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogZC5OVU1CRVIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmJpdHJhdGU6IGQuTlVNQkVSLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhiaXRyYXRlOiBkLk5VTUJFUgogICAgICAgICAgICAgICAgICAgIH0sIGcgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRJVExFOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ3RpdGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnaW1hZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBJQ09OOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2ljb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTUE9OU09SRURCWTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdzcG9uc29yZWRCeScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJPRFk6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnYm9keScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENMSUNLVVJMOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2NsaWNrVXJsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgVklERU86IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAndmlkZW8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBFWFQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZXh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgREFUQTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdkYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnbG9nbycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNQT05TT1JFRDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnc3BvbnNvcmVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgREVTQzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGF0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAyCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJBVElORzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDEzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAncmF0aW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDMKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTElLRVM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2xpa2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEU6IDQKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRE9XTkxPQURTOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdkb3dubG9hZHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogNQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBQUklDRTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAncHJpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogNgogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTQUxFUFJJQ0U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ3NhbGVwcmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiA3CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBIT05FOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDogMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVk6ICdwaG9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiA4CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFERFJFU1M6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAxOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2FkZHJlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogOQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBERVNDMjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDIwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGVzYzInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRTogMTAKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgRElTUExBWVVSTDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQ6IDIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZOiAnZGlzcGxheXVybCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBDVEE6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEOiAyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWTogJ2N0YScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFOiAxMgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgaCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgSUNPTjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgTE9HTzogMiwKICAgICAgICAgICAgICAgICAgICAgICAgSU1BR0U6IDMKICAgICAgICAgICAgICAgICAgICB9LCBiID0gWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZy5TUE9OU09SRURCWS5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHsgdHlwZTogMSB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnLlRJVExFLklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnLklNQUdFLklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBdLCBjID0gewogICAgICAgICAgICAgICAgICAgICAgICAxOiAnUE1QJywKICAgICAgICAgICAgICAgICAgICAgICAgNTogJ1BSRUYnLAogICAgICAgICAgICAgICAgICAgICAgICA2OiAnUE1QRycKICAgICAgICAgICAgICAgICAgICB9LCBsID0gewogICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBQbGF5ZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsgY29kZTogZS5hZFVuaXRDb2RlIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS52YXN0WG1sID8gci52YXN0WG1sID0gZS52YXN0WG1sIDogZS52YXN0VXJsICYmIChyLnZhc3RVcmwgPSBlLnZhc3RVcmwpLCBlLnZhc3RYbWwgfHwgZS52YXN0VXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYSwgdCA9IGwuZ2V0UmVuZGVyZXJJZCgncHVibWF0aWMnLCBlLnJlbmRlcmVyQ29kZSksIGkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlLmFkVW5pdENvZGUpLCBuID0gMDsgbiA8IHdpbmRvdy5ibHVlYmlsbHl3aWcucmVuZGVyZXJzLmxlbmd0aDsgbisrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmJsdWViaWxseXdpZy5yZW5kZXJlcnNbbl0uX2lkID09PSB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gd2luZG93LmJsdWViaWxseXdpZy5yZW5kZXJlcnNbbl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPyBhLmJvb3RzdHJhcChyLCBpKSA6IFQubG9nV2FybignJy5jb25jYXQoQSwgJzogQ291bGRuXCd0IGZpbmQgYSByZW5kZXJlciB3aXRoICcpLmNvbmNhdCh0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULmxvZ1dhcm4oJycuY29uY2F0KEEsICc6IE5vIHZhc3RYbWwgb3IgdmFzdFVybCBvbiBiaWQsIGJhaWxpbmcuLi4nKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JlbmRlcmVyOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuLnJlcGxhY2UoJyRSRU5ERVJFUicsIGUpLCB0ID0gaS5hLmluc3RhbGwoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkVW5pdENvZGU6IHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXRSZW5kZXIobC5vdXRzdHJlYW1SZW5kZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQubG9nV2FybignJy5jb25jYXQoQSwgJzogRXJyb3IgdHlpbmcgdG8gc2V0UmVuZGVyIG9uIHJlbmRlcmVyJyksIGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHN0cmVhbVJlbmRlcjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucmVuZGVyZXIucHVzaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5ib290c3RyYXBQbGF5ZXIoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVuZGVyZXJJZDogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJy5jb25jYXQoZSwgJy0nKS5jb25jYXQocik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBDID0gMCwgZiA9ICExLCB1ID0ge30sIHkgPSB7fTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFUoZSwgcikgewogICAgICAgICAgICAgICAgICAgIGlmICghVC5pc1N0cihyKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIgJiYgVC5sb2dXYXJuKEEgKyAnSWdub3JpbmcgcGFyYW0ga2V5OiAnICsgZSArICcsIGV4cGVjdHMgc3RyaW5nLXZhbHVlLCBmb3VuZCAnICsgWShyKSksIE47CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAncG16b25laWQnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5zcGxpdCgnLCcpLnNsaWNlKDAsIDUwKS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbigpOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2thZGZsb29yJzoKICAgICAgICAgICAgICAgICAgICBjYXNlICdsYXQnOgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ2xvbic6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHIpIHx8IE47CiAgICAgICAgICAgICAgICAgICAgY2FzZSAneW9iJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KHIpIHx8IE47CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24geihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgZS5wYXJhbXMuYWRVbml0ID0gJycsIGUucGFyYW1zLmFkVW5pdEluZGV4ID0gJzAnLCBlLnBhcmFtcy53aWR0aCA9IDAsIGUucGFyYW1zLmhlaWdodCA9IDAsIGUucGFyYW1zLmFkU2xvdCA9IChyID0gZS5wYXJhbXMuYWRTbG90LCBULmlzU3RyKHIpID8gci5yZXBsYWNlKC9eXHMrL2csICcnKS5yZXBsYWNlKC9ccyskL2csICcnKSA6IChyICYmIFQubG9nV2FybihvICsgJzogYWRTbG90IG11c3QgYmUgYSBzdHJpbmcuIElnbm9yaW5nIGFkU2xvdCcpLCAnJykpOwogICAgICAgICAgICAgICAgICAgIHZhciBhID0gKHQgPSBlLnBhcmFtcy5hZFNsb3QpLnNwbGl0KCc6JyksIHQgPSBhWzBdOwogICAgICAgICAgICAgICAgICAgIGlmICgyID09IGEubGVuZ3RoICYmIChlLnBhcmFtcy5hZFVuaXRJbmRleCA9IGFbMV0pLCBhID0gdC5zcGxpdCgnQCcpLCBlLnBhcmFtcy5hZFVuaXQgPSBhWzBdLCAxIDwgYS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgIT0gKGEgPSBhWzFdLnNwbGl0KCd4JykpLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2b2lkIFQubG9nV2FybihBICsgJ0FkU2xvdCBFcnJvcjogYWRTbG90IG5vdCBpbiByZXF1aXJlZCBmb3JtYXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wYXJhbXMud2lkdGggPSBwYXJzZUludChhWzBdLCAxMCksIGUucGFyYW1zLmhlaWdodCA9IHBhcnNlSW50KGFbMV0sIDEwKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuaGFzT3duUHJvcGVydHkoJ21lZGlhVHlwZXMnKSAmJiBlLm1lZGlhVHlwZXMuaGFzT3duUHJvcGVydHkoUC5iKSAmJiBlLm1lZGlhVHlwZXMuYmFubmVyLmhhc093blByb3BlcnR5KCdzaXplcycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gW107IGkgPCBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PT0gZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplc1tpXS5sZW5ndGggJiYgbi5wdXNoKGUubWVkaWFUeXBlcy5iYW5uZXIuc2l6ZXNbaV0pOwogICAgICAgICAgICAgICAgICAgICAgICBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzID0gbiwgMSA8PSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzLmxlbmd0aCAmJiAoZS5wYXJhbXMud2lkdGggPSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzWzBdWzBdLCBlLnBhcmFtcy5oZWlnaHQgPSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzWzBdWzFdLCBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzID0gZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcy5zcGxpY2UoMSwgZS5tZWRpYVR5cGVzLmJhbm5lci5zaXplcy5sZW5ndGggLSAxKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdihlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGEgPSBlLnBhcmFtcy52aWRlbzsKICAgICAgICAgICAgICAgICAgICBpZiAoYSAhPT0gTikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0IGluIChyID0ge30sIHApKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5oYXNPd25Qcm9wZXJ0eSh0KSAmJiAoclt0XSA9IGZ1bmN0aW9uIChlLCByLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQsIGkgPSAnSWdub3JpbmcgcGFyYW0ga2V5OiAnICsgZSArICcsIGV4cGVjdHMgJyArIGEgKyAnLCBmb3VuZCAnICsgWShyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGQuQk9PTEVBTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFQuaXNCb29sZWFuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGQuTlVNQkVSOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gVC5pc051bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBkLlNUUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFQuaXNTdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZC5BUlJBWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFQuaXNBcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQocikgPyByIDogKFQubG9nV2FybihBICsgaSksIE4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSh0LCBhW3RdLCBwW3RdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFQuaXNBcnJheShlLm1lZGlhVHlwZXMudmlkZW8ucGxheWVyU2l6ZVswXSkgPyAoci53ID0gcGFyc2VJbnQoZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF1bMF0sIDEwKSwgci5oID0gcGFyc2VJbnQoZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF1bMV0sIDEwKSkgOiBULmlzTnVtYmVyKGUubWVkaWFUeXBlcy52aWRlby5wbGF5ZXJTaXplWzBdKSAmJiAoci53ID0gcGFyc2VJbnQoZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMF0sIDEwKSwgci5oID0gcGFyc2VJbnQoZS5tZWRpYVR5cGVzLnZpZGVvLnBsYXllclNpemVbMV0sIDEwKSksIGUucGFyYW1zLnZpZGVvLmhhc093blByb3BlcnR5KCdza2lwcGFibGUnKSAmJiAoci5leHQgPSB7IHZpZGVvX3NraXBwYWJsZTogZS5wYXJhbXMudmlkZW8uc2tpcHBhYmxlID8gMSA6IDAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBOLCBULmxvZ1dhcm4oQSArICdFcnJvcjogVmlkZW8gY29uZmlnIHBhcmFtcyBtaXNzaW5nIGZvciBhZHVuaXQ6ICcgKyBlLnBhcmFtcy5hZFVuaXQgKyAnIHdpdGggbWVkaWFUeXBlIHNldCBhcyB2aWRlby4gSWdub3JpbmcgdmlkZW8gaW1wcmVzc2lvbiBpbiB0aGUgYWR1bml0LicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gSyhlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGEsIHQsIGksIG4sIHMsIG8sIGQgPSB7fSwgcCA9IHt9LCBjID0gZS5oYXNPd25Qcm9wZXJ0eSgnc2l6ZXMnKSA/IGUuc2l6ZXMgOiBbXSwgbCA9ICcnLCB1ID0gW10sIGQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZS5iaWRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ2lkOiBlLnBhcmFtcy5hZFVuaXQgfHwgdm9pZCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZmxvb3I6IFUoJ2thZGZsb29yJywgZS5wYXJhbXMua2FkZmxvb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiB7IHBtWm9uZUlkOiBVKCdwbXpvbmVpZCcsIGUucGFyYW1zLnBtem9uZWlkKSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZmxvb3JjdXI6IGUucGFyYW1zLmN1cnJlbmN5ID8gVSgnY3VycmVuY3knLCBlLnBhcmFtcy5jdXJyZW5jeSkgOiB4CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHQgPSBkLCAoaSA9IGUpLnBhcmFtcy5kZWFscyAmJiAoVC5pc0FycmF5KGkucGFyYW1zLmRlYWxzKSA/IGkucGFyYW1zLmRlYWxzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuaXNTdHIoZSkgJiYgMyA8IGUubGVuZ3RoID8gKHQucG1wIHx8ICh0LnBtcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlX2F1Y3Rpb246IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbHM6IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5wbXAuZGVhbHMucHVzaCh7IGlkOiBlIH0pKSA6IFQubG9nV2FybihBICsgJ0Vycm9yOiBkZWFsLWlkIHByZXNlbnQgaW4gYXJyYXkgYmlkLnBhcmFtcy5kZWFscyBzaG91bGQgYmUgYSBzdHJpbmdzIHdpdGggbW9yZSB0aGFuIDMgY2hhcmF0ZXJzIGxlbmd0aCwgZGVhbC1pZCBpZ25vcmVkOiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogVC5sb2dXYXJuKEEgKyAnRXJyb3I6IGJpZC5wYXJhbXMuZGVhbHMgc2hvdWxkIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJykpLCBlLmhhc093blByb3BlcnR5KCdtZWRpYVR5cGVzJykpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCBpbiBlLm1lZGlhVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUC5iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIsIGEgPSBlLm1lZGlhVHlwZXMuYmFubmVyLnNpemVzLCB0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBOICYmIFQuaXNBcnJheShhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPSB7fSwgZS5wYXJhbXMud2lkdGggfHwgZS5wYXJhbXMuaGVpZ2h0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudyA9IGUucGFyYW1zLndpZHRoLCByLmggPSBlLnBhcmFtcy5oZWlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gYS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID0gTiwgVC5sb2dXYXJuKEEgKyAnRXJyb3I6IG1lZGlhVHlwZXMuYmFubmVyLnNpemUgbWlzc2luZyBmb3IgYWR1bml0OiAnICsgZS5wYXJhbXMuYWRVbml0ICsgJy4gSWdub3JpbmcgdGhlIGJhbm5lciBpbXByZXNzaW9uIGluIHRoZSBhZHVuaXQuJyksIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci53ID0gcGFyc2VJbnQoYVswXVswXSwgMTApLCByLmggPSBwYXJzZUludChhWzBdWzFdLCAxMCksIGEgPSBhLnNwbGljZSgxLCBhLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IGEubGVuZ3RoICYmICh0ID0gW10sIGEuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPCBlLmxlbmd0aCAmJiB0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlWzFdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgMCA8IHQubGVuZ3RoICYmIChyLmZvcm1hdCA9IHQpKSwgci5wb3MgPSAwLCByLnRvcGZyYW1lID0gVC5pbklmcmFtZSgpID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5sb2dXYXJuKEEgKyAnRXJyb3I6IG1lZGlhVHlwZXMuYmFubmVyLnNpemUgbWlzc2luZyBmb3IgYWR1bml0OiAnICsgZS5wYXJhbXMuYWRVbml0ICsgJy4gSWdub3JpbmcgdGhlIGJhbm5lciBpbXByZXNzaW9uIGluIHRoZSBhZHVuaXQuJyksIHIgPSBOOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKSAhPT0gTiAmJiAoZC5iYW5uZXIgPSByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUC5jOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhLCB0LCBpID0geyBhc3NldHM6IFtdIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzT3duUHJvcGVydHkobikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGkuYXNzZXRzICYmIDAgPCBpLmFzc2V0cy5sZW5ndGggJiYgaS5hc3NldHMuaGFzT3duUHJvcGVydHkobikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlRJVExFLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVbbl0ubGVuIHx8IGVbbl0ubGVuZ3RoID8gcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZy5USVRMRS5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZVtuXS5yZXF1aXJlZCA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjogZVtuXS5sZW4gfHwgZVtuXS5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogZVtuXS5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogVC5sb2dXYXJuKEEgKyAnRXJyb3I6IFRpdGxlIExlbmd0aCBpcyByZXF1aXJlZCBmb3IgbmF0aXZlIGFkOiAnICsgSlNPTi5zdHJpbmdpZnkoZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5JTUFHRS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW25dLnNpemVzICYmIDAgPCBlW25dLnNpemVzLmxlbmd0aCA/IHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGcuSU1BR0UuSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVbbl0ucmVxdWlyZWQgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5JTUFHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogZVtuXS53IHx8IGVbbl0ud2lkdGggfHwgKGVbbl0uc2l6ZXMgPyBlW25dLnNpemVzWzBdIDogTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbbl0uaCB8fCBlW25dLmhlaWdodCB8fCAoZVtuXS5zaXplcyA/IGVbbl0uc2l6ZXNbMV0gOiBOKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd21pbjogZVtuXS53bWluIHx8IGVbbl0ubWluaW11bVdpZHRoIHx8IChlW25dLm1pbnNpemVzID8gZVtuXS5taW5zaXplc1swXSA6IE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobWluOiBlW25dLmhtaW4gfHwgZVtuXS5taW5pbXVtSGVpZ2h0IHx8IChlW25dLm1pbnNpemVzID8gZVtuXS5taW5zaXplc1sxXSA6IE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lczogZVtuXS5taW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0OiBlW25dLmV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBULmxvZ1dhcm4oQSArICdFcnJvcjogSW1hZ2Ugc2l6ZXMgaXMgcmVxdWlyZWQgZm9yIG5hdGl2ZSBhZDogJyArIEpTT04uc3RyaW5naWZ5KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuSUNPTi5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlW25dLnNpemVzICYmIDAgPCBlW25dLnNpemVzLmxlbmd0aCA/IHMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGcuSUNPTi5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZVtuXS5yZXF1aXJlZCA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBoLklDT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGVbbl0udyB8fCBlW25dLndpZHRoIHx8IChlW25dLnNpemVzID8gZVtuXS5zaXplc1swXSA6IE4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBlW25dLmggfHwgZVtuXS5oZWlnaHQgfHwgKGVbbl0uc2l6ZXMgPyBlW25dLnNpemVzWzFdIDogTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogVC5sb2dXYXJuKEEgKyAnRXJyb3I6IEljb24gc2l6ZXMgaXMgcmVxdWlyZWQgZm9yIG5hdGl2ZSBhZDogJyArIEpTT04uc3RyaW5naWZ5KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuVklERU8uS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZy5WSURFTy5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZVtuXS5yZXF1aXJlZCA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmR1cmF0aW9uOiBlW25dLm1pbmR1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhkdXJhdGlvbjogZVtuXS5tYXhkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xzOiBlW25dLnByb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZXM6IGVbbl0ubWltZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogZVtuXS5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5FWFQuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZy5FWFQuSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVbbl0ucmVxdWlyZWQgPyAxIDogMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuTE9HTy5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBnLkxPR08uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVbbl0ucmVxdWlyZWQgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWc6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogaC5MT0dPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlW25dLncgfHwgZVtuXS53aWR0aCB8fCAoZVtuXS5zaXplcyA/IGVbbl0uc2l6ZXNbMF0gOiBOKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZVtuXS5oIHx8IGVbbl0uaGVpZ2h0IHx8IChlW25dLnNpemVzID8gZVtuXS5zaXplc1sxXSA6IE4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuU1BPTlNPUkVEQlkuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuQk9EWS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5SQVRJTkcuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuTElLRVMuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuRE9XTkxPQURTLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlBSSUNFLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlNBTEVQUklDRS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5QSE9ORS5LRVk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5BRERSRVNTLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLkRFU0MyLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLkRJU1BMQVlVUkwuS0VZOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuQ1RBLktFWToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB5W25dLCBhID0gZSwgdCA9IHZvaWQgMCwgdCA9IHIuS0VZLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByLklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBhW3RdLnJlcXVpcmVkID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiByLlRZUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjogYVt0XS5sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDogYVt0XS5leHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICYmIHMuaWQgJiYgKGkuYXNzZXRzW2kuYXNzZXRzLmxlbmd0aF0gPSBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGIubGVuZ3RoLCBkID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGIuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IGkuYXNzZXRzLmxlbmd0aCwgYSA9IDA7IGEgPCByOyBhKyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaWQgPT0gaS5hc3NldHNbYV0uaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBmID0gbyAhPSBkLCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oZS5uYXRpdmVQYXJhbXMpKSwgZiA/IFQubG9nV2FybihBICsgJ0Vycm9yOiBFcnJvciBpbiBOYXRpdmUgYWR1bml0ICcgKyBlLnBhcmFtcy5hZFVuaXQgKyAnLiBJZ25vcmluZyB0aGUgYWR1bml0LiBSZWZlciB0byBodHRwOi8vcHJlYmlkLm9yZy9kZXYtZG9jcy9zaG93LW5hdGl2ZS1hZHMuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLicpIDogZC5uYXRpdmUgPSBwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQLmQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGEgPSB2KGUpKSAhPT0gTiAmJiAoZC52aWRlbyA9IGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IGUucGFyYW1zLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaDogZS5wYXJhbXMuaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wZnJhbWU6IFQuaW5JZnJhbWUoKSA/IDAgOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIFQuaXNBcnJheShjKSAmJiAxIDwgYy5sZW5ndGggJiYgKChjID0gYy5zcGxpY2UoMSwgYy5sZW5ndGggLSAxKSkuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGg6IGVbMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5mb3JtYXQgPSB1KSwgZC5iYW5uZXIgPSByOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBuID0gZCwgcyA9IGUsIG8gPSBtKHt9LCBULmRlZXBBY2Nlc3MocywgJ29ydGIySW1wLmV4dC5kYXRhJykpLCBPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICdwYmFkc2xvdCcgPT09IGUgPyAnc3RyaW5nJyA9PSB0eXBlb2Ygb1tlXSAmJiBvW2VdICYmIFQuZGVlcFNldFZhbHVlKG4sICdleHQuZGF0YS5wYmFkc2xvdCcsIG9bZV0pIDogJ2Fkc2VydmVyJyA9PT0gZSA/IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZHNsb3QnCiAgICAgICAgICAgICAgICAgICAgICAgIF0uZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBULmRlZXBBY2Nlc3MobywgJ2Fkc2VydmVyLicuY29uY2F0KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnID09IHR5cGVvZiByICYmIHIgJiYgKFQuZGVlcFNldFZhbHVlKG4sICdleHQuZGF0YS5hZHNlcnZlci4nLmNvbmNhdChlLnRvTG93ZXJDYXNlKCkpLCByKSwgJ2Fkc2xvdCcgPT09IGUgJiYgVC5kZWVwU2V0VmFsdWUobiwgJ2V4dC5kZnBfYWRfdW5pdF9jb2RlJywgcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSA6IFQuZGVlcFNldFZhbHVlKG4sICdleHQuZGF0YS4nLmNvbmNhdChlKSwgb1tlXSk7CiAgICAgICAgICAgICAgICAgICAgfSksIGZ1bmN0aW9uICh0LCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gLTE7CiAgICAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbicgIT0gdHlwZW9mIGkuZ2V0Rmxvb3IgfHwgRC5iLmdldENvbmZpZygncHVibWF0aWMuZGlzYWJsZUZsb29ycycpIHx8IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAuYwogICAgICAgICAgICAgICAgICAgICAgICBdLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByLCBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5oYXNPd25Qcm9wZXJ0eShlKSAmJiAoJ29iamVjdCcgIT09IFkociA9IGkuZ2V0Rmxvb3IoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiB0LmJpZGZsb29yY3VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZTogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAnKicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB8fCByLmN1cnJlbmN5ICE9PSB0LmJpZGZsb29yY3VyIHx8IGlzTmFOKHBhcnNlSW50KHIuZmxvb3IpKSB8fCAoYSA9IHBhcnNlRmxvYXQoci5mbG9vciksIG4gPSAtMSA9PSBuID8gYSA6IE1hdGgubWluKGEsIG4pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB0LmJpZGZsb29yICYmIChuID0gTWF0aC5tYXgobiwgdC5iaWRmbG9vcikpOwogICAgICAgICAgICAgICAgICAgICAgICB0LmJpZGZsb29yID0gIWlzTmFOKG4pICYmIDAgPCBuID8gbiA6IE47CiAgICAgICAgICAgICAgICAgICAgfShkLCBlKSwgZC5oYXNPd25Qcm9wZXJ0eShQLmIpIHx8IGQuaGFzT3duUHJvcGVydHkoUC5jKSB8fCBkLmhhc093blByb3BlcnR5KFAuZCkgPyBkIDogTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFQuX2VhY2goZywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB1W2UuSURdID0gZS5LRVk7CiAgICAgICAgICAgICAgICB9KSwgVC5fZWFjaChnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHlbZS5LRVldID0gZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIEUgPSB7CiAgICAgICAgICAgICAgICAgICAgY29kZTogbywKICAgICAgICAgICAgICAgICAgICBndmxpZDogNzYsCiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkTWVkaWFUeXBlczogWwogICAgICAgICAgICAgICAgICAgICAgICBQLmIsCiAgICAgICAgICAgICAgICAgICAgICAgIFAuZCwKICAgICAgICAgICAgICAgICAgICAgICAgUC5jCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgZS5wYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVC5pc1N0cihlLnBhcmFtcy5wdWJsaXNoZXJJZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFQubG9nV2FybihBICsgJ0Vycm9yOiBwdWJsaXNoZXJJZCBpcyBtYW5kYXRvcnkgYW5kIGNhbm5vdCBiZSBudW1lcmljICh3cmFwIGl0IGluIHF1b3RlcyBpbiB5b3VyIGNvbmZpZykuIENhbGwgdG8gT3BlbkJpZCB3aWxsIG5vdCBiZSBzZW50IGZvciBhZCB1bml0OiAnICsgSlNPTi5zdHJpbmdpZnkoZSkpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgndmlkZW8nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5wYXJhbXMudmlkZW8uaGFzT3duUHJvcGVydHkoJ21pbWVzJykgfHwgIVQuaXNBcnJheShlLnBhcmFtcy52aWRlby5taW1lcykgfHwgMCA9PT0gZS5wYXJhbXMudmlkZW8ubWltZXMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVC5sb2dXYXJuKEEgKyAnRXJyb3I6IEZvciB2aWRlbyBhZHMsIG1pbWVzIGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBzcGVjaWZ5IGF0bGVhc2UgMSBtaW1lIHZhbHVlLiBDYWxsIHRvIE9wZW5CaWQgd2lsbCBub3QgYmUgc2VudCBmb3IgYWQgdW5pdDonICsgSlNPTi5zdHJpbmdpZnkoZSkpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuaGFzT3duUHJvcGVydHkoJ21lZGlhVHlwZXMnKSB8fCAhZS5tZWRpYVR5cGVzLmhhc093blByb3BlcnR5KFAuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmxvZ0Vycm9yKCcnLmNvbmNhdChBLCAnOiBtZWRpYVR5cGVzIG9yIG1lZGlhVHlwZXMudmlkZW8gaXMgbm90IHNwZWNpZmllZC4gUmVqZWN0aW5nIGJpZDogJyksIGUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUubWVkaWFUeXBlc1tQLmRdLmhhc093blByb3BlcnR5KCdjb250ZXh0JykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmxvZ0Vycm9yKCcnLmNvbmNhdChBLCAnOiBubyBjb250ZXh0IHNwZWNpZmllZCBpbiBiaWQuIFJlamVjdGluZyBiaWQ6ICcpLCBlKSwgITE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCdvdXRzdHJlYW0nID09PSBlLm1lZGlhVHlwZXNbUC5kXS5jb250ZXh0ICYmICFULmlzU3RyKGUucGFyYW1zLm91dHN0cmVhbUFVKSAmJiAhZS5oYXNPd25Qcm9wZXJ0eSgncmVuZGVyZXInKSAmJiAhZS5tZWRpYVR5cGVzW1AuZF0uaGFzT3duUHJvcGVydHkoJ3JlbmRlcmVyJykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmxvZ0Vycm9yKCcnLmNvbmNhdChBLCAnOiBmb3IgIm91dHN0cmVhbSIgYmlkcyBlaXRoZXIgb3V0c3RyZWFtQVUgcGFyYW1ldGVyIG11c3QgYmUgcHJvdmlkZWQgb3IgYWQgdW5pdCBzdXBwbGllZCByZW5kZXJlciBpcyByZXF1aXJlZC4gUmVqZWN0aW5nIGJpZDogJyksIGUpLCAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gITE7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBidWlsZFJlcXVlc3RzOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYTsKICAgICAgICAgICAgICAgICAgICAgICAgciAmJiByLnJlZmVyZXJJbmZvICYmIChhID0gci5yZWZlcmVySW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBpLCBuLCBzLCBvLCBkLCBwLCBjLCBsLCB1LCBtLCBnLCBoLCBiLCBmLCB5LCB2ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VVUkw6ICh0ID0gYSkgJiYgdC5yZWZlcmVyID8gdC5yZWZlcmVyIDogd2luZG93LmxvY2F0aW9uLmhyZWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVVJMOiB3aW5kb3cuZG9jdW1lbnQucmVmZXJyZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIEUgPSAoaSA9IHYsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJycgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdDogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXI6IFt4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXA6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogaS5wYWdlVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IGkucmVmVVJMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXI6IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2U6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWE6IG5hdmlnYXRvci51c2VyQWdlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnQ6ICd5ZXMnID09IG5hdmlnYXRvci5kb05vdFRyYWNrIHx8ICcxJyA9PSBuYXZpZ2F0b3IuZG9Ob3RUcmFjayB8fCAnMScgPT0gbmF2aWdhdG9yLm1zRG9Ob3RUcmFjayA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoOiBzY3JlZW4uaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBzY3JlZW4ud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXI6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dDoge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBJID0gJycsIHcgPSBbXSwgTyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSBULmRlZXBDbG9uZShlKSkucGFyYW1zLmFkU2xvdCA9IG4ucGFyYW1zLmFkU2xvdCB8fCAnJywgeihuKSwgbi5wYXJhbXMuaGFzT3duUHJvcGVydHkoJ3ZpZGVvJykgfHwgbi5oYXNPd25Qcm9wZXJ0eSgnbWVkaWFUeXBlcycpICYmIG4ubWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eShQLmMpIHx8IDAgIT09IG4ucGFyYW1zLndpZHRoIHx8IDAgIT09IG4ucGFyYW1zLmhlaWdodCA/ICh2LnB1YklkID0gdi5wdWJJZCB8fCBuLnBhcmFtcy5wdWJsaXNoZXJJZCwgKHYgPSBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSwgdCwgaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChhIGluIChyLmthZHBhZ2V1cmwgfHwgKHIua2FkcGFnZXVybCA9IHIucGFnZVVSTCksIGspKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5oYXNPd25Qcm9wZXJ0eShhKSAmJiAodCA9IGVbYV0pICYmICgnb2JqZWN0JyA9PT0gWShpID0ga1thXSkgJiYgKHQgPSBpLmYodCwgcikpLCBULmlzU3RyKHQpID8gclthXSA9IHQgOiBULmxvZ1dhcm4oQSArICdJZ25vcmluZyBwYXJhbSA6ICcgKyBhICsgJyB3aXRoIHZhbHVlIDogJyArIGtbYV0gKyAnLCBleHBlY3RzIHN0cmluZy12YWx1ZSwgZm91bmQgJyArIFkodCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfShuLnBhcmFtcywgdikpLnRyYW5zYWN0aW9uSWQgPSBuLnRyYW5zYWN0aW9uSWQsICcnID09PSBJID8gSSA9IG4ucGFyYW1zLmN1cnJlbmN5IHx8IE4gOiBuLnBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnY3VycmVuY3knKSAmJiBJICE9PSBuLnBhcmFtcy5jdXJyZW5jeSAmJiBULmxvZ1dhcm4oQSArICdDdXJyZW5jeSBzcGVjaWZpZXIgaWdub3JlZC4gT25seSBvbmUgY3VycmVuY3kgcGVybWl0dGVkLicpLCBuLnBhcmFtcy5jdXJyZW5jeSA9IEksIG4ucGFyYW1zLmhhc093blByb3BlcnR5KCdkY3RyJykgJiYgVC5pc1N0cihuLnBhcmFtcy5kY3RyKSAmJiB3LnB1c2gobi5wYXJhbXMuZGN0ciksIG4ucGFyYW1zLmhhc093blByb3BlcnR5KCdiY2F0JykgJiYgVC5pc0FycmF5KG4ucGFyYW1zLmJjYXQpICYmIChPID0gTy5jb25jYXQobi5wYXJhbXMuYmNhdCkpLCAociA9IEsobikpICYmIEUuaW1wLnB1c2gocikpIDogVC5sb2dXYXJuKEEgKyAnU2tpcHBpbmcgdGhlIG5vbi1zdGFuZGFyZCBhZHNsb3Q6ICcsIG4ucGFyYW1zLmFkU2xvdCwgSlNPTi5zdHJpbmdpZnkobikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIDAgIT0gRS5pbXAubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFLnNpdGUucHVibGlzaGVyLmlkID0gdi5wdWJJZC50cmltKCksIEMgPSB2LnB1YklkLnRyaW0oKSwgRS5leHQud3JhcHBlciA9IHt9LCBFLmV4dC53cmFwcGVyLnByb2ZpbGUgPSBwYXJzZUludCh2LnByb2ZJZCkgfHwgTiwgRS5leHQud3JhcHBlci52ZXJzaW9uID0gcGFyc2VJbnQodi52ZXJJZCkgfHwgTiwgRS5leHQud3JhcHBlci53aWlkID0gdi53aWlkIHx8IHIuYXVjdGlvbklkLCBFLmV4dC53cmFwcGVyLnd2ID0gJ3ByZWJpZF9wcmViaWRfNC4zNi4wJywgRS5leHQud3JhcHBlci50cmFuc2FjdGlvbklkID0gdi50cmFuc2FjdGlvbklkLCBFLmV4dC53cmFwcGVyLndwID0gJ3BianMnLCBFLnVzZXIuZ2VuZGVyID0gdi5nZW5kZXIgPyB2LmdlbmRlci50cmltKCkgOiBOLCBFLnVzZXIuZ2VvID0ge30sIEUudXNlci5nZW8ubGF0ID0gVSgnbGF0Jywgdi5sYXQpLCBFLnVzZXIuZ2VvLmxvbiA9IFUoJ2xvbicsIHYubG9uKSwgRS51c2VyLnlvYiA9IFUoJ3lvYicsIHYueW9iKSwgRS5kZXZpY2UuZ2VvID0gRS51c2VyLmdlbywgRS5zaXRlLnBhZ2UgPSB2LmthZHBhZ2V1cmwudHJpbSgpIHx8IEUuc2l0ZS5wYWdlLnRyaW0oKSwgRS5zaXRlLmRvbWFpbiA9IChzID0gRS5zaXRlLnBhZ2UsIChvID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpKS5ocmVmID0gcywgby5ob3N0bmFtZSksICdvYmplY3QnID09PSBZKEQuYi5nZXRDb25maWcoJ2NvbnRlbnQnKSkgJiYgKEUuc2l0ZS5jb250ZW50ID0gRC5iLmdldENvbmZpZygnY29udGVudCcpKSwgJ29iamVjdCcgPT09IFkoRC5iLmdldENvbmZpZygnZGV2aWNlJykpICYmIChFLmRldmljZSA9IFIoRS5kZXZpY2UsIEQuYi5nZXRDb25maWcoJ2RldmljZScpKSksIFQuZGVlcFNldFZhbHVlKEUsICdzb3VyY2UudGlkJywgdi50cmFuc2FjdGlvbklkKSwgLTEgIT09IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ3B1Ym1hdGljVGVzdD10cnVlJykgJiYgKEUudGVzdCA9IDEpLCBlWzBdLnNjaGFpbiAmJiBULmRlZXBTZXRWYWx1ZShFLCAnc291cmNlLmV4dC5zY2hhaW4nLCBlWzBdLnNjaGFpbiksIHIgJiYgci5nZHByQ29uc2VudCAmJiAoVC5kZWVwU2V0VmFsdWUoRSwgJ3VzZXIuZXh0LmNvbnNlbnQnLCByLmdkcHJDb25zZW50LmNvbnNlbnRTdHJpbmcpLCBULmRlZXBTZXRWYWx1ZShFLCAncmVncy5leHQuZ2RwcicsIHIuZ2RwckNvbnNlbnQuZ2RwckFwcGxpZXMgPyAxIDogMCkpLCByICYmIHIudXNwQ29uc2VudCAmJiBULmRlZXBTZXRWYWx1ZShFLCAncmVncy5leHQudXNfcHJpdmFjeScsIHIudXNwQ29uc2VudCksICEwID09PSBELmIuZ2V0Q29uZmlnKCdjb3BwYScpICYmIFQuZGVlcFNldFZhbHVlKEUsICdyZWdzLmNvcHBhJywgMSksIGQgPSBFLCBjID0gZSwgbSA9ICcnLCAwIDwgKHAgPSB3KS5sZW5ndGggJiYgKGNbMF0ucGFyYW1zLmhhc093blByb3BlcnR5KCdkY3RyJykgPyAobSA9IGNbMF0ucGFyYW1zLmRjdHIsIFQuaXNTdHIobSkgJiYgMCA8IG0ubGVuZ3RoID8gKHUgPSBtLnNwbGl0KCd8JyksIG0gPSAnJywgdS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSArPSAwIDwgZS5sZW5ndGggPyBlLnRyaW0oKSArICd8JyA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIGwgPSBtLmxlbmd0aCwgJ3wnID09PSBtLnN1YnN0cmluZyhsLCBsIC0gMSkgJiYgKG0gPSBtLnN1YnN0cmluZygwLCBsIC0gMSkpLCBkLnNpdGUuZXh0ID0geyBrZXlfdmFsOiBtLnRyaW0oKSB9KSA6IFQubG9nV2FybihBICsgJ0lnbm9yaW5nIHBhcmFtIDogZGN0ciB3aXRoIHZhbHVlIDogJyArIG0gKyAnLCBleHBlY3RzIHN0cmluZy12YWx1ZSwgZm91bmQgZW1wdHkgb3Igbm9uLXN0cmluZyB2YWx1ZScpLCAxIDwgcC5sZW5ndGggJiYgVC5sb2dXYXJuKEEgKyAnZGN0ciB2YWx1ZSBmb3VuZCBpbiBtb3JlIHRoYW4gMSBhZHVuaXRzLiBWYWx1ZSBmcm9tIDFzdCBhZHVuaXQgd2lsbCBiZSBwaWNrZWQuIElnbm9yaW5nIHZhbHVlcyBmcm9tIHN1YnNlcXVlbnQgYWR1bml0cycpKSA6IFQubG9nV2FybihBICsgJ2RjdHIgdmFsdWUgbm90IGZvdW5kIGluIDFzdCBhZHVuaXQsIGlnbm9yaW5nIHZhbHVlcyBmcm9tIHN1YnNlcXVlbnQgYWR1bml0cycpKSwgZyA9IEUsIGggPSBlLCBiID0gVC5kZWVwQWNjZXNzKGgsICcwLnVzZXJJZEFzRWlkcycpLCBULmlzQXJyYXkoYikgJiYgMCA8IGIubGVuZ3RoICYmIFQuZGVlcFNldFZhbHVlKGcsICd1c2VyLmVpZHMnLCBiKSwgZiA9IEUsIDAgPCAoeSA9ICh5ID0gTykuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnID09IHR5cGVvZiBlIHx8IChULmxvZ1dhcm4oQSArICdiY2F0OiBFYWNoIGNhdGVnb3J5IHNob3VsZCBiZSBhIHN0cmluZywgaWdub3JpbmcgY2F0ZWdvcnk6ICcgKyBlKSwgITEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlLCByLCBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMgPCBlLmxlbmd0aCA/IGEuaW5kZXhPZihlKSA9PT0gciA6IHZvaWQgVC5sb2dXYXJuKEEgKyAnYmNhdDogRWFjaCBjYXRlZ29yeSBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIGEgbGVuZ3RoIG9mIG1vcmUgdGhhbiAzIGNoYXJhY3RlcnMsIGlnbm9yaW5nIGNhdGVnb3J5OiAnICsgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkubGVuZ3RoICYmIChULmxvZ1dhcm4oQSArICdiY2F0OiBTZWxlY3RlZDogJywgeSksIGYuYmNhdCA9IHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFMgPSBELmIuZ2V0Q29uZmlnKCdvcnRiMicpIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFMuc2l0ZSAmJiBULm1lcmdlRGVlcChFLCB7IHNpdGU6IFMuc2l0ZSB9KSwgUy51c2VyICYmIFQubWVyZ2VEZWVwKEUsIHsgdXNlcjogUy51c2VyIH0pLCAnb2JqZWN0JyA9PT0gWShELmIuZ2V0Q29uZmlnKCdhcHAnKSkgJiYgKEUuYXBwID0gRC5iLmdldENvbmZpZygnYXBwJyksIEUuYXBwLnB1Ymxpc2hlciA9IEUuc2l0ZS5wdWJsaXNoZXIsIEUuYXBwLmV4dCA9IEUuc2l0ZS5leHQgfHwgTiwgJ29iamVjdCcgIT09IFkoRS5hcHAuY29udGVudCkgJiYgKEUuYXBwLmNvbnRlbnQgPSBFLnNpdGUuY29udGVudCB8fCBOKSwgZGVsZXRlIEUuc2l0ZSksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2hib3BlbmJpZC5wdWJtYXRpYy5jb20vdHJhbnNsYXRvcj9zb3VyY2U9cHJlYmlkLWNsaWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkZGVyUmVxdWVzdDogcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0UmVzcG9uc2U6IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gW10sIG4gPSB4LCBzID0gSlNPTi5wYXJzZSh0LmRhdGEpLCBvID0gcy5zaXRlICYmIHMuc2l0ZS5yZWYgPyBzLnNpdGUucmVmIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmJvZHkgJiYgZS5ib2R5LnNlYXRiaWQgJiYgVC5pc0FycmF5KGUuYm9keS5zZWF0YmlkKSAmJiAobiA9IGUuYm9keS5jdXIgfHwgbiwgZS5ib2R5LnNlYXRiaWQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYmlkICYmIFQuaXNBcnJheShlLmJpZCkgJiYgZS5iaWQuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogci5pbXBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogKHBhcnNlRmxvYXQoci5wcmljZSkgfHwgMCkudG9GaXhlZCgyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByLncsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHIuaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IHIuY3JpZCB8fCByLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVhbElkOiByLmRlYWxpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbmN5OiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0UmV2ZW51ZTogITAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dGw6IDMwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyOiBvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQ6IHIuYWRtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fc2VhdDogZS5zZWF0IHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbV9kc3BpZDogci5leHQgJiYgci5leHQuZHNwaWQgPyByLmV4dC5kc3BpZCA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVySW1wSWQ6IHIuaWQgfHwgJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5pbXAgJiYgMCA8IHMuaW1wLmxlbmd0aCAmJiBzLmltcC5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5pbXBpZCA9PT0gZS5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCFmdW5jdGlvbiAociwgZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHQgPSBuZXcgUmVnRXhwKC9WQVNUXHMrdmVyc2lvbi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgPD0gci5pbmRleE9mKCdzcGFuIGNsYXNzPSJQdWJBUElBZCInKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm1lZGlhVHlwZSA9IFAuYjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQudGVzdChyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm1lZGlhVHlwZSA9IFAuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSA9IEpTT04ucGFyc2Uoci5yZXBsYWNlKC9cXC9nLCAnJykpKSAmJiBhLm5hdGl2ZSAmJiAoZS5tZWRpYVR5cGUgPSBQLmMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5sb2dXYXJuKEEgKyAnRXJyb3I6IENhbm5vdCBwYXJzZSBuYXRpdmUgcmVwb25zZSBmb3IgYWQgcmVzcG9uc2U6ICcgKyByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oci5hZG0sIGEpLCBhLm1lZGlhVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUC5iOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFAuZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS53aWR0aCA9IHIuaGFzT3duUHJvcGVydHkoJ3cnKSA/IHIudyA6IGUudmlkZW8udywgYS5oZWlnaHQgPSByLmhhc093blByb3BlcnR5KCdoJykgPyByLmggOiBlLnZpZGVvLmgsIGEudmFzdFhtbCA9IHIuYWRtLCBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEsIHQsIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5iaWRkZXJSZXF1ZXN0ICYmIHIuYmlkZGVyUmVxdWVzdC5iaWRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCByLmJpZGRlclJlcXVlc3QuYmlkcy5sZW5ndGg7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5iaWRkZXJSZXF1ZXN0LmJpZHNbbl0uYmlkSWQgPT09IGUucmVxdWVzdElkICYmIChhID0gci5iaWRkZXJSZXF1ZXN0LmJpZHNbbl0ucGFyYW1zLCB0ID0gci5iaWRkZXJSZXF1ZXN0LmJpZHNbbl0ubWVkaWFUeXBlc1tQLmRdLmNvbnRleHQsIGkgPSByLmJpZGRlclJlcXVlc3QuYmlkc1tuXS5hZFVuaXRDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ICYmICdvdXRzdHJlYW0nID09PSB0ICYmIGEgJiYgYS5vdXRzdHJlYW1BVSAmJiBpICYmIChlLnJlbmRlcmVyQ29kZSA9IGEub3V0c3RyZWFtQVUsIGUucmVuZGVyZXIgPSBsLm5ld1JlbmRlcmVyKGUucmVuZGVyZXJDb2RlLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oYSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUC5jOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyLm5hdGl2ZSA9IHt9LCBlLmhhc093blByb3BlcnR5KCdhZG0nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IEpTT04ucGFyc2UoZS5hZG0ucmVwbGFjZSgvXFwvZywgJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmxvZ1dhcm4oQSArICdFcnJvcjogQ2Fubm90IHBhcnNlIG5hdGl2ZSByZXBvbnNlIGZvciBhZCByZXNwb25zZTogJyArIHIuYWRtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgJiYgYS5uYXRpdmUgJiYgYS5uYXRpdmUuYXNzZXRzICYmIDAgPCBhLm5hdGl2ZS5hc3NldHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubWVkaWFUeXBlID0gUC5jOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgaSA9IGEubmF0aXZlLmFzc2V0cy5sZW5ndGg7IHQgPCBpOyB0KyspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGEubmF0aXZlLmFzc2V0c1t0XS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlRJVExFLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubmF0aXZlLnRpdGxlID0gYS5uYXRpdmUuYXNzZXRzW3RdLnRpdGxlICYmIGEubmF0aXZlLmFzc2V0c1t0XS50aXRsZS50ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLklNQUdFLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubmF0aXZlLmltYWdlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGEubmF0aXZlLmFzc2V0c1t0XS5pbWcgJiYgYS5uYXRpdmUuYXNzZXRzW3RdLmltZy51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYS5uYXRpdmUuYXNzZXRzW3RdLmltZyAmJiBhLm5hdGl2ZS5hc3NldHNbdF0uaW1nLmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhLm5hdGl2ZS5hc3NldHNbdF0uaW1nICYmIGEubmF0aXZlLmFzc2V0c1t0XS5pbWcudwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuSUNPTi5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm5hdGl2ZS5pY29uID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGEubmF0aXZlLmFzc2V0c1t0XS5pbWcgJiYgYS5uYXRpdmUuYXNzZXRzW3RdLmltZy51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogYS5uYXRpdmUuYXNzZXRzW3RdLmltZyAmJiBhLm5hdGl2ZS5hc3NldHNbdF0uaW1nLmgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBhLm5hdGl2ZS5hc3NldHNbdF0uaW1nICYmIGEubmF0aXZlLmFzc2V0c1t0XS5pbWcudwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuU1BPTlNPUkVEQlkuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuQk9EWS5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5MSUtFUy5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5ET1dOTE9BRFMuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuUFJJQ0U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuU0FMRVBSSUNFLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlBIT05FLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLkFERFJFU1MuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuREVTQzIuSUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGcuQ1RBLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBnLlJBVElORy5JRDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZy5ESVNQTEFZVVJMLklEOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIubmF0aXZlW3VbYS5uYXRpdmUuYXNzZXRzW3RdLmlkXV0gPSBhLm5hdGl2ZS5hc3NldHNbdF0uZGF0YSAmJiBhLm5hdGl2ZS5hc3NldHNbdF0uZGF0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5uYXRpdmUuY2xpY2tVcmwgPSBhLm5hdGl2ZS5saW5rICYmIGEubmF0aXZlLmxpbmsudXJsLCByLm5hdGl2ZS5jbGlja1RyYWNrZXJzID0gYS5uYXRpdmUubGluayAmJiBhLm5hdGl2ZS5saW5rLmNsaWNrdHJhY2tlcnMgfHwgW10sIHIubmF0aXZlLmltcHJlc3Npb25UcmFja2VycyA9IGEubmF0aXZlLmltcHRyYWNrZXJzIHx8IFtdLCByLm5hdGl2ZS5qc3RyYWNrZXIgPSBhLm5hdGl2ZS5qc3RyYWNrZXIgfHwgW10sIHIud2lkdGggfHwgKHIud2lkdGggPSAwKSwgci5oZWlnaHQgfHwgKHIuaGVpZ2h0ID0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KHIsIGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIHIuZXh0ICYmIHIuZXh0LmRlYWxfY2hhbm5lbCAmJiAoYS5kZWFsQ2hhbm5lbCA9IGNbci5leHQuZGVhbF9jaGFubmVsXSB8fCBudWxsKSwgYS5tZXRhID0ge30sIHIuZXh0ICYmIHIuZXh0LmRzcGlkICYmIChhLm1ldGEubmV0d29ya0lkID0gci5leHQuZHNwaWQpLCByLmV4dCAmJiByLmV4dC5hZHZpZCAmJiAoYS5tZXRhLmJ1eWVySWQgPSByLmV4dC5hZHZpZCksIHIuYWRvbWFpbiAmJiAwIDwgci5hZG9tYWluLmxlbmd0aCAmJiAoYS5tZXRhLmFkdmVydGlzZXJEb21haW5zID0gci5hZG9tYWluLCBhLm1ldGEuY2xpY2tVcmwgPSByLmFkb21haW5bMF0pLCBlLmV4dCAmJiBlLmV4dC5idXlpZCAmJiAoYS5hZHNlcnZlclRhcmdldGluZyA9IHsgaGJfYnV5aWRfcHVibWF0aWM6IGUuZXh0LmJ1eWlkIH0pLCBpLnB1c2goYSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQubG9nRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRVc2VyU3luY3M6IGZ1bmN0aW9uIChlLCByLCBhLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gJycgKyBDOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSAmJiAoaSArPSAnJmdkcHI9JyArIChhLmdkcHJBcHBsaWVzID8gMSA6IDApLCBpICs9ICcmZ2Rwcl9jb25zZW50PScgKyBlbmNvZGVVUklDb21wb25lbnQoYS5jb25zZW50U3RyaW5nIHx8ICcnKSksIHQgJiYgKGkgKz0gJyZ1c19wcml2YWN5PScgKyBlbmNvZGVVUklDb21wb25lbnQodCkpLCAhMCA9PT0gRC5iLmdldENvbmZpZygnY29wcGEnKSAmJiAoaSArPSAnJmNvcHBhPTEnKSwgZS5pZnJhbWVFbmFibGVkID8gW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaWZyYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICdodHRwczovL2Fkcy5wdWJtYXRpYy5jb20vQWRTZXJ2ZXIvanMvc2hvd2FkLmpzI1BJWCZrZG50dWlkPTEmcD0nICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0gOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9pbWFnZTgucHVibWF0aWMuY29tL0FkU2VydmVyL0ltZ1N5bmM/cD0nICsgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1CaWRQYXJhbXM6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBULmNvbnZlcnRUeXBlcyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoZXJJZDogJ3N0cmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZFNsb3Q6ICdzdHJpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QodC5yZWdpc3RlckJpZGRlcikoRSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbNzMyXSk7CiAgICAgICAgcGJqc0NodW5rKFsxMzNdLCB7CiAgICAgICAgICAgIDgyNDogZnVuY3Rpb24gKGUsIHQsIHIpIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IHIoODI1KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgODI1OiBmdW5jdGlvbiAoZSwgdCwgcikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIHIuZCh0LCAnc2hhcmV0aHJvdWdoSW50ZXJuYWwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgICAgICB9KSwgci5kKHQsICdzaGFyZXRocm91Z2hBZGFwdGVyU3BlYycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIG4gPSByKDEpLCBkID0gcigwKSwgaSA9IHIoMyk7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoYSA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDE7IHQgPCBhcmd1bWVudHMubGVuZ3RoOyB0KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gYXJndW1lbnRzW3RdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiBpbiByKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCBuKSAmJiAoZVtuXSA9IHJbbl0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIH0pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcyA9ICdzaGFyZXRocm91Z2gnLCBvID0gWwogICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgXSwgYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgYjY0RW5jb2RlVW5pY29kZTogdSwKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSWZyYW1lOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9ICExOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cubG9ja2VkSW5GcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zcmMgPSAnaHR0cHM6Ly9uYXRpdmUuc2hhcmV0aHJvdWdoLmNvbS9hc3NldHMvc2ZwLXNldC10YXJnZXRpbmcuanMnLCB0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXS5hcHBlbmRDaGlsZCh0KSwgZSA9ICEwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5sb2dFcnJvcignVHJvdWJsZSB3cml0aW5nIGZyYW1lIGJ1c3RlciBzY3JpcHQsIGVycm9yIGRldGFpbHM6JywgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoZSA/IHdpbmRvdy50b3AuU1RSICYmIHdpbmRvdy50b3AuU1RSLlRhZyA6IHdpbmRvdy5TVFIgJiYgd2luZG93LlNUUi5UYWcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNyYyA9ICdodHRwczovL25hdGl2ZS5zaGFyZXRocm91Z2guY29tL2Fzc2V0cy9zZnAuanMnLCByLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gd2luZG93LnRvcC5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdLmFwcGVuZENoaWxkKHIpIDogd2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLmxvZ0Vycm9yKCdUcm91YmxlIHdyaXRpbmcgc2ZwIHNjcmlwdCwgZXJyb3IgZGV0YWlsczonLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTG9ja2VkSW5GcmFtZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2tlZEluRnJhbWUgPSAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2tlZEluRnJhbWUgPSAhd2luZG93LnRvcC5kb2N1bWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9ja2VkSW5GcmFtZSA9IGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb247CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb3RvY29sOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQubG9jYXRpb24ucHJvdG9jb2w7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBwID0gewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBzLAogICAgICAgICAgICAgICAgICAgICAgICBpc0JpZFJlcXVlc3RWYWxpZDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWUucGFyYW1zLnBrZXkgJiYgZS5iaWRkZXIgPT09IHM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUmVxdWVzdHM6IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50X2tleTogZS5wYXJhbXMucGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkSWQ6IGUuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNlbnRfcmVxdWlyZWQ6ICExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW50X3BsYXlfY2FwYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSBuYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gL0FuZHJvaWQvaS50ZXN0KGUpLCByID0gL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KGUpLCBuID0gcGFyc2VJbnQoKC9DaHJvbWVcLyhbMC05XSspLy5leGVjKGUpIHx8IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pWzFdKSwgaSA9IHBhcnNlSW50KCgvQ3JpT1NcLyhbMC05XSspLy5leGVjKGUpIHx8IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pWzFdKSwgYSA9IHBhcnNlSW50KCgvVmVyc2lvblwvKFswLTldKykvLmV4ZWMoZSkgfHwgWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSlbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhKHQgJiYgNTMgPD0gbiB8fCByICYmICgxMCA8PSBhIHx8IDUzIDw9IGkpIHx8ICF0ICYmICFyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYlNvdXJjZTogJ3ByZWJpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhiVmVyc2lvbjogJzQuMzYuMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0clZlcnNpb246ICczLjMuMicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEodCwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLnVzZXJJZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSB7fSwgciA9IGQuZGVlcEFjY2VzcyhlLCAndXNlcklkLnRkaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAmJiAodC50dGR1aWQgPSByKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBkLmRlZXBBY2Nlc3MoZSwgJ3VzZXJJZC5wdWJjaWQnKSB8fCBkLmRlZXBBY2Nlc3MoZSwgJ2NydW1icy5wdWJjaWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAmJiAodC5wdWJjaWQgPSBuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBkLmRlZXBBY2Nlc3MoZSwgJ3VzZXJJZC5pZGxfZW52Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgJiYgKHQuaWRsdWlkID0gaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gZC5kZWVwQWNjZXNzKGUsICd1c2VySWQuaWQ1aWQudWlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSAmJiAodC5pZDV1aWQgPSB7IGlkOiBhIH0sIChzID0gZC5kZWVwQWNjZXNzKGUsICd1c2VySWQuaWQ1aWQuZXh0LmxpbmtUeXBlJykpICYmICh0LmlkNXVpZC5saW5rVHlwZSA9IHMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGQuZGVlcEFjY2VzcyhlLCAndXNlcklkLmxpcGIubGlwYmlkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gJiYgKHQubGl1aWQgPSBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBkLmRlZXBBY2Nlc3MoZSwgJ3VzZXJJZC5zaGFyZWRpZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICYmICh0LnNoZHVpZCA9IGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IGMuZ2V0UHJvdG9jb2woKS5pbmRleE9mKCdodHRwJykgPCAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LnNlY3VyZSA9IHIgfHwgLTEgPCBjLmdldFByb3RvY29sKCkuaW5kZXhPZignaHR0cHMnKSwgbiAmJiBuLmdkcHJDb25zZW50ICYmIG4uZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZyAmJiAodC5jb25zZW50X3N0cmluZyA9IG4uZ2RwckNvbnNlbnQuY29uc2VudFN0cmluZyksIG4gJiYgbi5nZHByQ29uc2VudCAmJiAodC5jb25zZW50X3JlcXVpcmVkID0gISFuLmdkcHJDb25zZW50LmdkcHJBcHBsaWVzKSwgbiAmJiBuLnVzcENvbnNlbnQgJiYgKHQudXNfcHJpdmFjeSA9IG4udXNwQ29uc2VudCksICEwID09PSBpLmIuZ2V0Q29uZmlnKCdjb3BwYScpICYmICh0LmNvcHBhID0gITApLCBlLnNjaGFpbiAmJiAodC5zY2hhaW4gPSBKU09OLnN0cmluZ2lmeShlLnNjaGFpbikpLCBlLmJpZGZsb29yICYmICh0LmJpZGZsb29yID0gcGFyc2VGbG9hdChlLmJpZGZsb29yKSksIGUucGFyYW1zLmJhZHYgJiYgKHQuYmFkdiA9IGUucGFyYW1zLmJhZHYpLCBlLnBhcmFtcy5iY2F0ICYmICh0LmJjYXQgPSBlLnBhcmFtcy5iY2F0KSwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9idGxyLnNoYXJldGhyb3VnaC5jb20vV1l1MkJYdjEvdjEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJEYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwSWZyYW1lQnVzdGluZzogZS5wYXJhbXMuaWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lU2l6ZTogZS5wYXJhbXMuaWZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVzOiBlLnNpemVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldFJlc3BvbnNlOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBlLmJvZHk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXIgfHwgIXIuY3JlYXRpdmVzIHx8ICFyLmNyZWF0aXZlcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSByLmNyZWF0aXZlc1swXSwgaSA9IG87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVswXSAqIGVbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHQuc3RyRGF0YS5pZnJhbWVTaXplIHx8IHQuc3RyRGF0YS5zaXplcy5sZW5ndGgpICYmIChpID0gdC5zdHJEYXRhLmlmcmFtZVNpemUgPyB0LnN0ckRhdGEuaWZyYW1lU2l6ZSA6IHQuc3RyRGF0YS5zaXplcy5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSh0KSA+IGEoZSkgPyB0IDogZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSwgW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiB0LmRhdGEuYmlkSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGlbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbTogbi5jcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aXZlSWQ6IG4uY3JlYXRpdmUuY3JlYXRpdmVfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWFsSWQ6IG4uY3JlYXRpdmUuZGVhbF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVuY3k6ICdVU0QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRSZXZlbnVlOiAhMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRsOiAzNjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkOiBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAnc3RyX3Jlc3BvbnNlXycuY29uY2F0KHQuZGF0YS5iaWRJZCksIG4gPSAnXG4gICAgPGRpdiBkYXRhLXN0ci1uYXRpdmUta2V5PSInLmNvbmNhdCh0LmRhdGEucGxhY2VtZW50X2tleSwgJyIgZGF0YS1zdHgtcmVzcG9uc2UtbmFtZT0iJykuY29uY2F0KHIsICciPlxuICAgIDwvZGl2PlxuICAgIDxzY3JpcHQ+dmFyICcpLmNvbmNhdChyLCAnID0gIicpLmNvbmNhdCh1KEpTT04uc3RyaW5naWZ5KGUpKSwgJyI8L3NjcmlwdD5cbiAgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0ckRhdGEuc2tpcElmcmFtZUJ1c3RpbmcgPyBuICs9ICc8c2NyaXB0IHNyYz0iaHR0cHM6Ly9uYXRpdmUuc2hhcmV0aHJvdWdoLmNvbS9hc3NldHMvc2ZwLmpzIj48L3NjcmlwdD4nIDogbiArPSAnXG4gICAgICA8c2NyaXB0PlxuICAgICAgICAoJy5jb25jYXQoYy5pc0xvY2tlZEluRnJhbWUudG9TdHJpbmcoKSwgJykoKVxuICAgICAgPC9zY3JpcHQ+XG4gICAgICA8c2NyaXB0PlxuICAgICAgICAoJykuY29uY2F0KGMuaGFuZGxlSWZyYW1lLnRvU3RyaW5nKCksICcpKClcbiAgICAgIDwvc2NyaXB0PicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0ociwgdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VXNlclN5bmNzOiBmdW5jdGlvbiAoZSwgdCwgciwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGkgPSBuID8gJyZ1c19wcml2YWN5PScuY29uY2F0KG4pIDogJycsIGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnBpeGVsRW5hYmxlZCAmJiAwIDwgdC5sZW5ndGggJiYgdFswXS5ib2R5ICYmIHRbMF0uYm9keS5jb29raWVTeW5jVXJscyAmJiB0WzBdLmJvZHkuY29va2llU3luY1VybHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbWFnZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogZSArIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBhOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBvblRpbWVvdXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb25CaWRXb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgb25TZXRUYXJnZXRpbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB1KGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnRvYShlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvJShbMC05QS1GXXsyfSkvZywgZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoJzB4JyArIHQpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIE9iamVjdChuLnJlZ2lzdGVyQmlkZGVyKShwKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs4MjRdKTsKICAgICAgICBwYmpzQ2h1bmsoWzk1XSwgewogICAgICAgICAgICA5MjA6IGZ1bmN0aW9uIChlLCBuLCB0KSB7CiAgICAgICAgICAgICAgICBlLmV4cG9ydHMgPSB0KDkyMSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDkyMTogZnVuY3Rpb24gKGUsIG4sIHQpIHsKICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JzsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCAnX19lc01vZHVsZScsIHsgdmFsdWU6ICEwIH0pLCB0LmQobiwgJ3VpZDJJZFN1Ym1vZHVsZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIHIgPSB0KDApLCBvID0gdCgxMSksIGkgPSB0KDcpLCB1ID0gJ3VpZDInLCBhID0gJ19fdWlkMl9hZHZlcnRpc2luZ190b2tlbic7CiAgICAgICAgICAgICAgICB2YXIgZCwgYyA9IE9iamVjdChpLmIpKDg4NywgdSksIGwgPSAoZCA9ICdVSUQyOiAnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBhcmd1bWVudHMubGVuZ3RoLCBuID0gbmV3IEFycmF5KGUpLCB0ID0gMDsgdCA8IGU7IHQrKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5bdF0gPSBhcmd1bWVudHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgIHIubG9nSW5mby5hcHBseShyLCBbZCArICcgJ10uY29uY2F0KG4pKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciB2ID0gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IHUsCiAgICAgICAgICAgICAgICAgICAgZ3ZsaWQ6IDg4NywKICAgICAgICAgICAgICAgICAgICBkZWNvZGU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlID8gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0geyBpZDogZSB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuLnVpZDIgPSB0LCBsKCdEZWNvZGVkIHZhbHVlICcgKyBKU09OLnN0cmluZ2lmeShuKSksIG47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0oZSkgOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBsKCdDcmVhdGluZyBVSUQgMi4wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gKGMuY29va2llc0FyZUVuYWJsZWQoKSA/IGMuZ2V0Q29va2llKGEpIDogbnVsbCkgfHwgKGMubG9jYWxTdG9yYWdlSXNFbmFibGVkKCkgPyBjLmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGEpIDogbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsKCdUaGUgYWR2ZXJ0aXNpbmcgdG9rZW46ICcgKyBlKSwgeyBpZDogZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3Qoby5lKSgndXNlcklkJywgdik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbOTIwXSk7CiAgICAgICAgcGJqc0NodW5rKFs5MV0sIHsKICAgICAgICAgICAgOTI4OiBmdW5jdGlvbiAociwgZSwgdCkgewogICAgICAgICAgICAgICAgci5leHBvcnRzID0gdCg5MjkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICA5Mjk6IGZ1bmN0aW9uIChyLCBlLCB0KSB7CiAgICAgICAgICAgICAgICAndXNlIHN0cmljdCc7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiAhMCB9KSwgdC5kKGUsICd1bmlmaWVkSWRTdWJtb2R1bGUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBvID0gdCgwKSwgaSA9IHQoNCksIG4gPSB0KDExKSwgZCA9ICd1bmlmaWVkSWQnLCB1ID0gewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkLAogICAgICAgICAgICAgICAgICAgICAgICBndmxpZDogMjEsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByICYmICdzdHJpbmcnID09IHR5cGVvZiByLlRESUQgPyB7IHRkaWQ6IHIuVERJRCB9IDogdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBnZXRJZDogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gciAmJiByLnBhcmFtcyB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlICYmICgnc3RyaW5nJyA9PSB0eXBlb2YgZS5wYXJ0bmVyIHx8ICdzdHJpbmcnID09IHR5cGVvZiBlLnVybCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGUudXJsIHx8ICdodHRwczovL21hdGNoLmFkc3J2ci5vcmcvdHJhY2svcmlkP3R0ZF9waWQ9Jy5jb25jYXQoZS5wYXJ0bmVyLCAnJmZtdD1qc29uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBKU09OLnBhcnNlKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAocikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8ubG9nRXJyb3Iocik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgby5sb2dFcnJvcignJy5jb25jYXQoZCwgJzogSUQgZmV0Y2ggZW5jb3VudGVyZWQgYW4gZXJyb3InKSwgciksIHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0KGkuYSkobiwgciwgdm9pZCAwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6ICEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmxvZ0Vycm9yKCdVc2VyIElEIC0gdW5pZmllZElkIHN1Ym1vZHVsZSByZXF1aXJlcyBlaXRoZXIgcGFydG5lciBvciB1cmwgdG8gYmUgZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIE9iamVjdChuLmUpKCd1c2VySWQnLCB1KTsKICAgICAgICAgICAgfQogICAgICAgIH0sIFs5MjhdKTsKICAgICAgICBwYmpzQ2h1bmsoWzZdLCB7CiAgICAgICAgICAgIDE5OiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgdC5iID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFtdOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gaW4gZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcjsKICAgICAgICAgICAgICAgICAgICAgICAgZS5oYXNPd25Qcm9wZXJ0eShuKSAmJiAoJ3B1YlByb3ZpZGVkSWQnID09PSBuID8gdCA9IHQuY29uY2F0KGUucHViUHJvdmlkZWRJZCkgOiAociA9IGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IHNbdF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiAmJiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnNvdXJjZSA9IG4uc291cmNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gdS5pc0ZuKG4uZ2V0VmFsdWUpID8gbi5nZXRWYWx1ZShlKSA6IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHUuaXNTdHIobykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGksIGEsIGMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IG4uYXR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdS5pc0ZuKG4uZ2V0VWlkRXh0KSB8fCAoaSA9IG4uZ2V0VWlkRXh0KGUpKSAmJiAoYy5leHQgPSBpKSwgci51aWRzID0gW2NdLCAhdS5pc0ZuKG4uZ2V0RWlkRXh0KSB8fCAoYSA9IG4uZ2V0RWlkRXh0KGUpKSAmJiAoci5leHQgPSBhKSwgcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfShlW25dLCBuKSkgJiYgdC5wdXNoKHIpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9LCB0LmEgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBuID0gW107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1LmlzUGxhaW5PYmplY3QoZS5pZE9iaikgJiYgT2JqZWN0LmtleXMoZS5pZE9iaikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModC5pZE9iaikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5kZWVwQWNjZXNzKHQsICdjb25maWcuYmlkZGVycycpICYmIEFycmF5LmlzQXJyYXkodC5jb25maWcuYmlkZGVycykgJiYgdS5kZWVwQWNjZXNzKHMsIGUgKyAnLnNvdXJjZScpICYmIG4ucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBzW2VdLnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWRkZXJzOiB0LmNvbmZpZy5iaWRkZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSksIG47CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIHUgPSBuKDApLCBzID0gewogICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnRJcUlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpbnRlbnRpcS5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcHViY2lkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdwdWJjaWQub3JnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRkaWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2Fkc2VydmVyLm9yZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVpZEV4dDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJ0aVBhcnRuZXI6ICdURElEJyB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpZDVpZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudWlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2lkNS1zeW5jLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFVpZEV4dDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5leHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFycmFibGVJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAncGFycmFibGUuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZWlkID8gZS5laWQgOiBlLmNjcGFPcHRvdXQgPyAnJyA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlkRXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5waWNrKGUsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2liYU9wdG91dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjY3BhT3B0b3V0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0KS5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBpZGxfZW52OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdsaXZlcmFtcC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDMKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgbGlwYjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubGlwYmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2xpdmVpbnRlbnQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWlkRXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUuc2VnbWVudHMpICYmIGUuc2VnbWVudHMubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzZWdtZW50czogZS5zZWdtZW50cyB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBicml0ZXBvb2xpZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnYnJpdGVwb29sLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBsb3RhbWVQYW5vcmFtYUlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdjcndkY250cmwubmV0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlb0lkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdjcml0ZW8uY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmtsZUlkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdtZXJrbGVpbmMuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlkRXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUua2V5SUQgPyB7IGtleUlEOiBlLmtleUlEIH0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldElkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICduZXRpZC5kZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRpZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnc2hhcmVkaWQub3JnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VWlkRXh0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIGUudGhpcmQgPyB7IHRoaXJkOiBlLnRoaXJkIH0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIElEUDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnemVvdGFwLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBoYWxvSWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2F1ZGlnZW50LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBxdWFudGNhc3RJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAncXVhbnRjYXN0LmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBuZXh0cm9sbElkOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICduZXh0cm9sbC5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaWR4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdpZHgubGF0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAndmVyaXpvbm1lZGlhLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMwogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBmYWJyaWNrSWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ25ldXN0YXIuYml6JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG13T3BlbkxpbmtJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnbWVkaWF3YWxsYWhzY3JpcHQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAxCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcGFkSWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3RhcGFkLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBub3ZhdGlxOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5zbm93Zmxha2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnbm92YXRpcS5jb20nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDEKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdWlkMjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAndWlkYXBpLmNvbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHlwZTogMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmlkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWVwaW50ZW50SWQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2RlZXBpbnRlbnQuY29tJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0eXBlOiAzCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGFkbWl4ZXJJZDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnYWRtaXhlci5uZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR5cGU6IDMKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIDkzMjogZnVuY3Rpb24gKGUsIHQsIG4pIHsKICAgICAgICAgICAgICAgIGUuZXhwb3J0cyA9IG4oOTMzKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgOTMzOiBmdW5jdGlvbiAoZSwgdCwgbikgewogICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogITAgfSksIG4uZCh0LCAnUEJKU19VU0VSX0lEX09QVE9VVF9OQU1FJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBOwogICAgICAgICAgICAgICAgfSksIG4uZCh0LCAnY29yZVN0b3JhZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHc7CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdzeW5jRGVsYXknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE87CiAgICAgICAgICAgICAgICB9KSwgbi5kKHQsICdhdWN0aW9uRGVsYXknLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEk7CiAgICAgICAgICAgICAgICB9KSwgdC5zZXRTdWJtb2R1bGVSZWdpc3RyeSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgVCA9IGU7CiAgICAgICAgICAgICAgICB9LCB0LnNldFN0b3JlZFZhbHVlID0gUCwgdC5zZXRTdG9yZWRDb25zZW50RGF0YSA9IHEsIHQuZmluZFJvb3REb21haW4gPSBSLCB0LnJlcXVlc3RCaWRzSG9vayA9IEcsIG4uZCh0LCAndmFsaWRhdGVHZHByRW5mb3JjZW1lbnQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFE7CiAgICAgICAgICAgICAgICB9KSwgdC5hdHRhY2hJZFN5c3RlbSA9IFosIHQuaW5pdCA9IGVlOwogICAgICAgICAgICAgICAgdmFyIHIgPSBuKDEwKSwgbyA9IG4ubihyKSwgaSA9IG4oMyksIGEgPSBuKDkpLCBjID0gbi5uKGEpLCBsID0gbigwKSwgdSA9IG4oMTcpLCBkID0gbig4KSwgcyA9IG4oNSksIGYgPSBuLm4ocyksIGcgPSBuKDExKSwgcCA9IG4oMTkpLCBtID0gbig3KTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGIoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICAgICAgICAgIGlmICgndW5kZWZpbmVkJyA9PSB0eXBlb2YgU3ltYm9sIHx8IG51bGwgPT0gZVtTeW1ib2wuaXRlcmF0b3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGUpIHx8IChuID0gZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ3N0cmluZycgPT0gdHlwZW9mIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5KGUsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsIC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2JqZWN0JyA9PT0gbiAmJiBlLmNvbnN0cnVjdG9yICYmIChuID0gZS5jb25zdHJ1Y3Rvci5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJ01hcCcgPT09IG4gfHwgJ1NldCcgPT09IG4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnQXJndW1lbnRzJyA9PT0gbiB8fCAvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkoZSwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KGUpKSB8fCB0ICYmIGUgJiYgJ251bWJlcicgPT0gdHlwZW9mIGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuICYmIChlID0gbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgciA9IDAsIG8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczogbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByID49IGUubGVuZ3RoID8geyBkb25lOiAhMCB9IDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogITEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZVtyKytdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZjogbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBpLCBhID0gITAsIGMgPSAhMTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICBzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZVtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIG46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbi5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYSA9IGUuZG9uZSwgZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAhMCwgaSA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGY6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSB8fCBudWxsID09IG4ucmV0dXJuIHx8IG4ucmV0dXJuKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHkoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIChudWxsID09IHQgfHwgdCA+IGUubGVuZ3RoKSAmJiAodCA9IGUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMCwgciA9IG5ldyBBcnJheSh0KTsgbiA8IHQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgICAgcltuXSA9IGVbbl07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdiwgaCwgTywgSSwgaiA9ICdVc2VyIElEJywgayA9ICdjb29raWUnLCBFID0gJ2h0bWw1JywgUyA9IDUwMCwgRCA9IDAsIHggPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdfcGJqc191c2VyaWRfY29uc2VudF9kYXRhJywKICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlczogMzAKICAgICAgICAgICAgICAgICAgICB9LCBBID0gJ19wYmpzX2lkX29wdG91dCcsIHcgPSBPYmplY3QobS5hKSgndXNlcmlkJyksIEMgPSBbXSwgVSA9ICExLCBfID0gW10sIFYgPSBbXSwgVCA9IFtdOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gUChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG4gPSBlLmNvbmZpZy5zdG9yYWdlLCByID0gJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgZS5zdWJtb2R1bGUuZG9tYWluT3ZlcnJpZGUgPyBlLnN1Ym1vZHVsZS5kb21haW5PdmVycmlkZSgpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IGwuaXNQbGFpbk9iamVjdCh0KSA/IEpTT04uc3RyaW5naWZ5KHQpIDogdCwgaSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCAqIG4uZXhwaXJlcykudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgbi50eXBlID09PSBrID8gKHcuc2V0Q29va2llKG4ubmFtZSwgbywgaSwgJ0xheCcsIHIpLCAnbnVtYmVyJyA9PSB0eXBlb2Ygbi5yZWZyZXNoSW5TZWNvbmRzICYmIHcuc2V0Q29va2llKCcnLmNvbmNhdChuLm5hbWUsICdfbGFzdCcpLCBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksIGksICdMYXgnLCByKSkgOiBuLnR5cGUgPT09IEUgJiYgKHcuc2V0RGF0YUluTG9jYWxTdG9yYWdlKCcnLmNvbmNhdChuLm5hbWUsICdfZXhwJyksIGkpLCB3LnNldERhdGFJbkxvY2FsU3RvcmFnZShuLm5hbWUsIGVuY29kZVVSSUNvbXBvbmVudChvKSksICdudW1iZXInID09IHR5cGVvZiBuLnJlZnJlc2hJblNlY29uZHMgJiYgdy5zZXREYXRhSW5Mb2NhbFN0b3JhZ2UoJycuY29uY2F0KG4ubmFtZSwgJ19sYXN0JyksIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSkpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbC5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBMKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiwgciwgbyA9IDEgPCBhcmd1bWVudHMubGVuZ3RoICYmIHZvaWQgMCAhPT0gdCA/IHQgOiB2b2lkIDAsIGkgPSBvID8gJycuY29uY2F0KGUubmFtZSwgJ18nKS5jb25jYXQobykgOiBlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgZS50eXBlID09PSBrID8gbiA9IHcuZ2V0Q29va2llKGkpIDogZS50eXBlID09PSBFICYmICgnJyA9PT0gKHIgPSB3LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKCcnLmNvbmNhdChlLm5hbWUsICdfZXhwJykpKSA/IG4gPSB3LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGkpIDogciAmJiAwIDwgbmV3IERhdGUocikuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSAmJiAobiA9IGRlY29kZVVSSUNvbXBvbmVudCh3LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKGkpKSkpLCAnc3RyaW5nJyA9PSB0eXBlb2YgbiAmJiAneycgPT09IG4udHJpbSgpLmNoYXJBdCgwKSAmJiAobiA9IEpTT04ucGFyc2UobikpOwogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbC5sb2dFcnJvcihlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBOKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc2VudFN0cmluZzogJycsCiAgICAgICAgICAgICAgICAgICAgICAgIGdkcHJBcHBsaWVzOiAhMSwKICAgICAgICAgICAgICAgICAgICAgICAgYXBpVmVyc2lvbjogMAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUgJiYgKHQuY29uc2VudFN0cmluZyA9IGUuY29uc2VudFN0cmluZywgdC5nZHByQXBwbGllcyA9IGUuZ2RwckFwcGxpZXMsIHQuYXBpVmVyc2lvbiA9IGUuYXBpVmVyc2lvbiksIGwuY3lyYjUzSGFzaChKU09OLnN0cmluZ2lmeSh0KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBxKGUpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IG5ldyBEYXRlKERhdGUubm93KCkgKyA4NjQwMDAwMCAqIHguZXhwaXJlcykudG9VVENTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdy5zZXRDb29raWUoeC5uYW1lLCBOKGUpLCB0LCAnTGF4Jyk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEYoKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHcuZ2V0Q29va2llKHgubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBsLmxvZ0Vycm9yKGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIE0oZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChlICYmICdib29sZWFuJyA9PSB0eXBlb2YgZS5nZHByQXBwbGllcyAmJiBlLmdkcHJBcHBsaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZS5jb25zZW50U3RyaW5nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA9PT0gZS5hcGlWZXJzaW9uICYmICExID09PSBsLmRlZXBBY2Nlc3MoZSwgJ3ZlbmRvckRhdGEucHVycG9zZUNvbnNlbnRzLjEnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDIgPT09IGUuYXBpVmVyc2lvbiAmJiAhMSA9PT0gbC5kZWVwQWNjZXNzKGUsICd2ZW5kb3JEYXRhLnB1cnBvc2UuY29uc2VudHMuMScpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFIoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGUgPSAwIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1swXSA/IGFyZ3VtZW50c1swXSA6IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXcuY29va2llc0FyZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgICAgICAgdmFyIHQsIG4sIHIgPSBlLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKDIgPT0gci5sZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgICAgICAgICAgICAgIHZhciBvID0gLTIsIGkgPSAnX3JkYycuY29uY2F0KERhdGUubm93KCkpLCBhID0gJ3dyaXRlYWJsZSc7CiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICB0ID0gci5zbGljZShvKS5qb2luKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IERhdGUobC50aW1lc3RhbXAoKSArIDEwMDAwKS50b1VUQ1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICB3LnNldENvb2tpZShpLCBhLCBjLCAnTGF4JywgdCwgdm9pZCAwKSwgdy5nZXRDb29raWUoaSwgdm9pZCAwKSA9PT0gYSA/IChuID0gITEsIHcuc2V0Q29va2llKGksICcnLCAnVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMSBHTVQnLCB2b2lkIDAsIHQsIHZvaWQgMCkpIDogKG8gKz0gLTEsIG4gPSBNYXRoLmFicyhvKSA8PSByLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBKKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHQgJiYgKG4gPSBsLmRlbGF5RXhlY3V0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGgpLCB0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwgZS5sZW5ndGgpKSwgZS5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHQuY2FsbGJhY2soZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPyAodC5jb25maWcuc3RvcmFnZSAmJiBQKHQsIGUpLCB0LmlkT2JqID0gdC5zdWJtb2R1bGUuZGVjb2RlKGUsIHQuY29uZmlnKSkgOiBsLmxvZ0luZm8oJycuY29uY2F0KGosICc6ICcpLmNvbmNhdCh0LnN1Ym1vZHVsZS5uYW1lLCAnIC0gcmVxdWVzdCBpZCByZXNwb25kZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZScpKSwgbigpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSwgdC5jYWxsYmFjayA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEgoZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpICYmIGUubGVuZ3RoID8gZS5maWx0ZXIoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGwuaXNQbGFpbk9iamVjdChlLmlkT2JqKSAmJiBPYmplY3Qua2V5cyhlLmlkT2JqKS5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uICh0LCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhuLmlkT2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0W2VdID0gbi5pZE9ialtlXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSksIHQ7CiAgICAgICAgICAgICAgICAgICAgfSwge30pIDoge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiB6KGUsIG8pIHsKICAgICAgICAgICAgICAgICAgICBbZV0uc29tZShmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkoZSkgfHwgIWUubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIH0pIHx8IGUuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlLmJpZHMgJiYgbC5pc0FycmF5KGUuYmlkcykgJiYgZS5iaWRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0LCBuLCByID0gKHQgPSBvLCBuID0gZS5iaWRkZXIsIEFycmF5LmlzQXJyYXkodCkgJiYgdC5sZW5ndGggJiYgbiA/IHQuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhZS5jb25maWcuYmlkZGVycyB8fCAhbC5pc0FycmF5KGUuY29uZmlnLmJpZGRlcnMpIHx8IGUuY29uZmlnLmJpZGRlcnMuaW5jbHVkZXMobik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmlzUGxhaW5PYmplY3QoZS5pZE9iaikgJiYgT2JqZWN0LmtleXMoZS5pZE9iaikubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZShmdW5jdGlvbiAodCwgbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobi5pZE9iaikuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFtlXSA9IG4uaWRPYmpbZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHt9KSA6IHt9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHIpLmxlbmd0aCAmJiAoZS51c2VySWQgPSByLCBlLnVzZXJJZEFzRWlkcyA9IE9iamVjdChwLmIpKHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBCKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCwgbiwgciwgbywgaSwgYSA9ICExOwogICAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gdiAmJiAodiA9IGZ1bmN0aW9uIChlLCBuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByID0gRigpOwogICAgICAgICAgICAgICAgICAgICAgICBxKG4pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IFEoZSwgbiksIG8gPSB0LnVzZXJJZE1vZHVsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0Lmhhc1ZhbGlkYXRlZCB8fCBNKG4pID8gby5yZWR1Y2UoZnVuY3Rpb24gKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBYKHQsIG4sIHIsICExKSwgZS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkgOiAobC5sb2dXYXJuKCcnLmNvbmNhdChqLCAnIC0gZ2RwciBwZXJtaXNzaW9uIG5vdCB2YWxpZCBmb3IgbG9jYWwgc3RvcmFnZSBvciBjb29raWVzLCBleGl0IG1vZHVsZScpKSwgW10pOwogICAgICAgICAgICAgICAgICAgIH0oXywgZC5nZHByRGF0YUhhbmRsZXIuZ2V0Q29uc2VudERhdGEoKSkpLmxlbmd0aCAmJiAobyA9IHYsICdmdW5jdGlvbicgPT0gdHlwZW9mIChpID0gT2JqZWN0KGwuZ2V0UHJlYmlkSW50ZXJuYWwpKCkuc2V0RWlkUGVybWlzc2lvbnMpICYmIGwuaXNBcnJheShvKSAmJiBpKE9iamVjdChwLmEpKG8pKSwgKHQgPSB2LmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbC5pc0ZuKGUuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0pKS5sZW5ndGggJiYgKGUgJiYgMCA8IEkgPyAobiA9ICEoYSA9ICEwKSwgciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbiB8fCAobiA9ICEwLCBlKCkpOwogICAgICAgICAgICAgICAgICAgIH0sIGwubG9nSW5mbygnJy5jb25jYXQoaiwgJyAtIGF1Y3Rpb24gZGVsYXllZCBieSAnKS5jb25jYXQoSSwgJyBhdCBtb3N0IHRvIGZldGNoIGlkcycpKSwgaCA9IHNldFRpbWVvdXQociwgSSksIEoodCwgcikpIDogYy5hLm9uKGYuYS5FVkVOVFMuQVVDVElPTl9FTkQsIGZ1bmN0aW9uIGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGMuYS5vZmYoZi5hLkVWRU5UUy5BVUNUSU9OX0VORCwgZSksIDAgPCBPID8gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBKKHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBPKSA6IEoodCk7CiAgICAgICAgICAgICAgICAgICAgfSkpKSwgZSAmJiAhYSAmJiBlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBHKGUsIHQpIHsKICAgICAgICAgICAgICAgICAgICBCKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeih0LmFkVW5pdHMgfHwgT2JqZWN0KHUuYSkoKS5hZFVuaXRzLCB2KSwgZS5jYWxsKHRoaXMsIHQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gVygpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQigpLCBIKHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gJCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQigpLCBPYmplY3QocC5iKShIKHYpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIEsoZSwgdSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzID0gKHMgPSBlID8gZS5zdWJtb2R1bGVOYW1lcyA6IG51bGwpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIEIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGQuZ2RwckRhdGFIYW5kbGVyLmdldENvbnNlbnREYXRhKCksIHQgPSBGKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHEoZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuID0gUShfLCBlKSwgciA9IG4udXNlcklkTW9kdWxlczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4uaGFzVmFsaWRhdGVkIHx8IE0oZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvLCBpID0gW10sIGEgPSBiKHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGEucygpOyAhKG8gPSBhLm4oKSkuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBvLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgcy5sZW5ndGggJiYgLTEgPT09IHMuaW5kZXhPZihjLnN1Ym1vZHVsZS5uYW1lKSB8fCAobC5sb2dJbmZvKCcnLmNvbmNhdChqLCAnIC0gcmVmcmVzaGluZyAnKS5jb25jYXQoYy5zdWJtb2R1bGUubmFtZSkpLCBYKGMsIGUsIHQsICEwKSwgbC5pc0ZuKGMuY2FsbGJhY2spICYmIGkucHVzaChjKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5mKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgaS5sZW5ndGggJiYgSihpKSwgdSAmJiB1KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5sb2dXYXJuKCcnLmNvbmNhdChqLCAnIC0gZ2RwciBwZXJtaXNzaW9uIG5vdCB2YWxpZCBmb3IgbG9jYWwgc3RvcmFnZSBvciBjb29raWVzLCBleGl0IG1vZHVsZScpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBRID0gT2JqZWN0KGcuYikoJ3N5bmMnLCBmdW5jdGlvbiAoZSwgdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZE1vZHVsZXM6IGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbGlkYXRlZDogdCAmJiB0Lmhhc1ZhbGlkYXRlZAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9LCAndmFsaWRhdGVHZHByRW5mb3JjZW1lbnQnKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFgoZSwgdCwgbiwgcikgewogICAgICAgICAgICAgICAgICAgIHZhciBvLCBpLCBhLCBjLCB1LCBzLCBkOwogICAgICAgICAgICAgICAgICAgIGUuY29uZmlnLnN0b3JhZ2UgPyAobyA9IEwoZS5jb25maWcuc3RvcmFnZSksIGMgPSAhMSwgJ251bWJlcicgPT0gdHlwZW9mIGUuY29uZmlnLnN0b3JhZ2UucmVmcmVzaEluU2Vjb25kcyAmJiAoYyA9IChhID0gbmV3IERhdGUoTChlLmNvbmZpZy5zdG9yYWdlLCAnbGFzdCcpKSkgJiYgRGF0ZS5ub3coKSAtIGEuZ2V0VGltZSgpID4gMTAwMCAqIGUuY29uZmlnLnN0b3JhZ2UucmVmcmVzaEluU2Vjb25kcyksICFvIHx8IGMgfHwgciB8fCAoZCA9IHQsIG51bGwgIT0gKHMgPSBuKSAmJiBzICE9PSBOKGQpKSA/IGkgPSBlLnN1Ym1vZHVsZS5nZXRJZChlLmNvbmZpZywgdCwgbykgOiAnZnVuY3Rpb24nID09IHR5cGVvZiBlLnN1Ym1vZHVsZS5leHRlbmRJZCAmJiAoaSA9IGUuc3VibW9kdWxlLmV4dGVuZElkKGUuY29uZmlnLCB0LCBvKSksIGwuaXNQbGFpbk9iamVjdChpKSAmJiAoaS5pZCAmJiAoUChlLCBpLmlkKSwgbyA9IGkuaWQpLCAnZnVuY3Rpb24nID09IHR5cGVvZiBpLmNhbGxiYWNrICYmIChlLmNhbGxiYWNrID0gaS5jYWxsYmFjaykpLCBvICYmIChlLmlkT2JqID0gZS5zdWJtb2R1bGUuZGVjb2RlKG8sIGUuY29uZmlnKSkpIDogZS5jb25maWcudmFsdWUgPyBlLmlkT2JqID0gZS5jb25maWcudmFsdWUgOiAodSA9IGUuc3VibW9kdWxlLmdldElkKGUuY29uZmlnLCB0LCB2b2lkIDApLCBsLmlzUGxhaW5PYmplY3QodSkgJiYgKCdmdW5jdGlvbicgPT0gdHlwZW9mIHUuY2FsbGJhY2sgJiYgKGUuY2FsbGJhY2sgPSB1LmNhbGxiYWNrKSwgdS5pZCAmJiAoZS5pZE9iaiA9IGUuc3VibW9kdWxlLmRlY29kZSh1LmlkLCBlLmNvbmZpZykpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBZKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBlLCBuLCB0LCByID0gKGUgPSBWLCBuID0gQywgQXJyYXkuaXNBcnJheShlKSA/IGUucmVkdWNlKGZ1bmN0aW9uIChlLCB0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIXQgfHwgbC5pc0VtcHR5U3RyKHQubmFtZSkgfHwgKCF0LnN0b3JhZ2UgfHwgbC5pc0VtcHR5U3RyKHQuc3RvcmFnZS50eXBlKSB8fCBsLmlzRW1wdHlTdHIodC5zdG9yYWdlLm5hbWUpIHx8IC0xID09PSBuLmluZGV4T2YodC5zdG9yYWdlLnR5cGUpKSAmJiAhbC5pc1BsYWluT2JqZWN0KHQudmFsdWUpICYmICh0LnN0b3JhZ2UgfHwgdC52YWx1ZSkgfHwgZS5wdXNoKHQpLCBlOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSkgOiBbXSk7CiAgICAgICAgICAgICAgICAgICAgci5sZW5ndGggJiYgKHQgPSBULmZpbHRlcihmdW5jdGlvbiAodCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW8oKShfLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUubmFtZSA9PT0gdC5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KSwgXyA9IHQubWFwKGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlID0gbygpKHIsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYW1lICYmIGUubmFtZS50b0xvd2VyQ2FzZSgpID09PSB0Lm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlICYmIHQubmFtZSAhPT0gZS5uYW1lICYmIChlLm5hbWUgPSB0Lm5hbWUpLCB0LmZpbmRSb290RG9tYWluID0gUiwgZSA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZTogdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiB2b2lkIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZE9iajogdm9pZCAwCiAgICAgICAgICAgICAgICAgICAgICAgIH0gOiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAhPT0gZTsKICAgICAgICAgICAgICAgICAgICB9KSwgIVUgJiYgXy5sZW5ndGggJiYgKE9iamVjdCh1LmEpKCkucmVxdWVzdEJpZHMuYmVmb3JlKEcsIDQwKSwgbC5sb2dJbmZvKCcnLmNvbmNhdChqLCAnIC0gdXNlcnN5bmMgY29uZmlnIHVwZGF0ZWQgZm9yICcpLmNvbmNhdChfLmxlbmd0aCwgJyBzdWJtb2R1bGVzOiAnKSwgXy5tYXAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc3VibW9kdWxlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgfSkpLCBVID0gITApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFoodCkgewogICAgICAgICAgICAgICAgICAgIG8oKShULCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5uYW1lID09PSB0Lm5hbWU7CiAgICAgICAgICAgICAgICAgICAgfSkgfHwgKFQucHVzaCh0KSwgWSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGVlKGUpIHsKICAgICAgICAgICAgICAgICAgICBfID0gW10sIFUgPSAhKFYgPSBbXSksIHYgPSB2b2lkIDAsIC0xICE9PSAoQyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgdy5sb2NhbFN0b3JhZ2VJc0VuYWJsZWQoKSA/IEUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICB3LmNvb2tpZXNBcmVFbmFibGVkKCkgPyBrIDogbnVsbAogICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBlOwogICAgICAgICAgICAgICAgICAgIH0pKS5pbmRleE9mKGspICYmIHcuZ2V0Q29va2llKEEpID8gbC5sb2dJbmZvKCcnLmNvbmNhdChqLCAnIC0gb3B0LW91dCBjb29raWUgZm91bmQsIGV4aXQgbW9kdWxlJykpIDogLTEgIT09IEMuaW5kZXhPZihFKSAmJiB3LmdldERhdGFGcm9tTG9jYWxTdG9yYWdlKEEpID8gbC5sb2dJbmZvKCcnLmNvbmNhdChqLCAnIC0gb3B0LW91dCBsb2NhbFN0b3JhZ2UgZm91bmQsIGV4aXQgbW9kdWxlJykpIDogKGUuZ2V0Q29uZmlnKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gZS51c2VyU3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgdCAmJiB0LnVzZXJJZHMgJiYgKFYgPSB0LnVzZXJJZHMsIE8gPSBsLmlzTnVtYmVyKHQuc3luY0RlbGF5KSA/IHQuc3luY0RlbGF5IDogUywgSSA9IGwuaXNOdW1iZXIodC5hdWN0aW9uRGVsYXkpID8gdC5hdWN0aW9uRGVsYXkgOiBELCBZKCkpOwogICAgICAgICAgICAgICAgICAgIH0pLCBPYmplY3QodS5hKSgpLmdldFVzZXJJZHMgPSBXLCBPYmplY3QodS5hKSgpLmdldFVzZXJJZHNBc0VpZHMgPSAkLCBPYmplY3QodS5hKSgpLnJlZnJlc2hVc2VySWRzID0gSyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlZShpLmIpLCBPYmplY3QoZy5jKSgndXNlcklkJywgWik7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBbOTMyXSk7CiAgICAgICAgcGJqcy5wcm9jZXNzUXVldWUoKTsKICAgIH0oKSkKfQ=="},{"name":"sugarcoat_rules.txt","aliases":["sugarcoat_rules.txt"],"kind":{"mime":"application/javascript"},"content":"aHR0cHM6Ly9hc3NldHMuYWRvYmVkdG0uY29tL2xhdW5jaC1FTmI5N2Q3ZjlkMmQ0YjQ3MjBhYzk3ODJhNzExOTk0OTk1Lm1pbi5qcyRzY3JpcHQsaW1wb3J0YW50LHJlZGlyZWN0PXN1Z2FyY29hdC1sYXVuY2gtRU5iOTdkN2Y5ZDJkNGI0NzIwYWM5NzgyYTcxMTk5NDk5NS5taW4="}] \ No newline at end of file diff --git a/filter_lists/default.json b/filter_lists/default.json index 2ddc4a25..69befc71 100644 --- a/filter_lists/default.json +++ b/filter_lists/default.json @@ -110,5 +110,12 @@ "title": "Brave Android-Specific Rules", "format": "Standard", "support_url": "https://github.com/brave/adblock-lists" + }, + { + "uuid": "b0433353-1144-473c-8e25-19fb035024b7", + "url": "https://raw.githubusercontent.com/brave/adblock-lists/incremental-sugarcoat-rules/brave-lists/brave-sugarcoat.txt", + "title": "SugarCoat Rules", + "format": "Standard", + "support_url": "https://github.com/brave-experiments/sugarcoat-pipeline" } ] diff --git a/generateMetadataJsonFromResources.js b/generateMetadataJsonFromResources.js new file mode 100644 index 00000000..d281bb29 --- /dev/null +++ b/generateMetadataJsonFromResources.js @@ -0,0 +1,20 @@ +const fs = require("fs"); +const path = require("path"); + +const metadataJsonFile = "metadata.json"; +const resourcesDir = "resources"; + +console.debug(`Creating ${metadataJsonFile}...`); +const resources = fs.readdirSync(resourcesDir); +const metadataList = resources.map((file) => { + return { + name: path.basename(file, ".js"), + aliases: [path.basename(file, ".js")], + kind: { mime: "application/javascript" }, + resourcePath: path.basename(file), + }; +}); + +console.debug(`Writing ${metadataJsonFile}... `); +// Pretty print out +fs.writeFileSync(metadataJsonFile, JSON.stringify(metadataList, null, 4)); diff --git a/metadata.json b/metadata.json index 0d4f101c..8303806c 100644 --- a/metadata.json +++ b/metadata.json @@ -1,2 +1,162 @@ [ -] + { + "name": "sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b", + "aliases": [ + "sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b.js" + }, + { + "name": "sugarcoat-5e95376640055da26becf35ea98d15e6", + "aliases": [ + "sugarcoat-5e95376640055da26becf35ea98d15e6" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-5e95376640055da26becf35ea98d15e6.js" + }, + { + "name": "sugarcoat-AppMeasurement_Module_AudienceManagement.min", + "aliases": [ + "sugarcoat-AppMeasurement_Module_AudienceManagement.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-AppMeasurement_Module_AudienceManagement.min.js" + }, + { + "name": "sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min", + "aliases": [ + "sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min.js" + }, + { + "name": "sugarcoat-apstag", + "aliases": [ + "sugarcoat-apstag" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-apstag.js" + }, + { + "name": "sugarcoat-bidbarrel-metacritic-rv.min", + "aliases": [ + "sugarcoat-bidbarrel-metacritic-rv.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-bidbarrel-metacritic-rv.min.js" + }, + { + "name": "sugarcoat-bugsnag.min", + "aliases": [ + "sugarcoat-bugsnag.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-bugsnag.min.js" + }, + { + "name": "sugarcoat-cmp2", + "aliases": [ + "sugarcoat-cmp2" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-cmp2.js" + }, + { + "name": "sugarcoat-cmp2ui-en", + "aliases": [ + "sugarcoat-cmp2ui-en" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-cmp2ui-en.js" + }, + { + "name": "sugarcoat-connatix.player", + "aliases": [ + "sugarcoat-connatix.player" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-connatix.player.js" + }, + { + "name": "sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min", + "aliases": [ + "sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-launch-EN3932511771fb4e5e9dd852ae89372b59.min.js" + }, + { + "name": "sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min", + "aliases": [ + "sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min.js" + }, + { + "name": "sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min", + "aliases": [ + "sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min.js" + }, + { + "name": "sugarcoat-moatheader", + "aliases": [ + "sugarcoat-moatheader" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-moatheader.js" + }, + { + "name": "sugarcoat-optanon-v1.1.0", + "aliases": [ + "sugarcoat-optanon-v1.1.0" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-optanon-v1.1.0.js" + }, + { + "name": "sugarcoat-prebid", + "aliases": [ + "sugarcoat-prebid" + ], + "kind": { + "mime": "application/javascript" + }, + "resourcePath": "sugarcoat-prebid.js" + } +] \ No newline at end of file diff --git a/resources/sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b.js b/resources/sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b.js new file mode 100644 index 00000000..d31c9b8d --- /dev/null +++ b/resources/sugarcoat-5bfb0dd10b7c6d7c07690f78ba444e1b.js @@ -0,0 +1,164 @@ +{ + const $___mock_426638777e368d36 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_426638777e368d36); + (function () { + Bootstrapper.bindDOMParsed(function () { + Bootstrapper.ensEvent.add(['Global: Non Shopping Flow'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.data.resolve([ + '13919', + '59946', + '59947', + '16336', + '13642', + '55415' + ], function (manage_13919, manage_59946, manage_59947, manage_16336, manage_13642, manage_55415) { + var ensVar0 = function () { + return manage_13919; + }; + var ensVar1 = function () { + return manage_59946; + }; + var ensVar2 = function () { + return manage_59947; + }; + var ensVar3 = function () { + return manage_16336; + }; + var ensVar4 = function () { + return manage_13642; + }; + var ensVar5 = function () { + return manage_55415; + }; + var onload = function () { + const $___old_c5b4ca906d30de53 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_c5b4ca906d30de53) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_426638777e368d36.localStorage)); + return function () { + window.criteo_q = window.criteo_q || []; + var account_id = ''.split(','), local_accounts_array = [], emailType = 'hashed', customDataObj = {}, setDataObj = undefined, custObj = undefined, emailObj = undefined, loginObj = undefined, accountType = 'name'; + customDataObj['target'] = ensVar3.call(this); + customDataObj['pagetype'] = ensVar4.call(this); + customDataObj['extra_criteo'] = ensVar5.call(this); + var accountObj = { 'event': 'setAccount' }; + if (accountType == 'name') { + accountObj.account = {}; + accountObj.account.an = ensVar0.call(this); + accountObj.account.cn = ensVar1.call(this); + accountObj.account.ln = ensVar2.call(this); + } else { + for (var i = 0; i < account_id.length; i++) + local_accounts_array[i] = parseInt(account_id[i], 10); + accountObj.account = local_accounts_array; + } + var siteTypeObj = { + 'event': 'setSiteType', + 'type': 'd' ? 'd' : 'd' + }; + if ('') + custObj = { + 'event': 'setCustomerId', + 'id': '' + }; + if ('') + emailObj = { + 'event': emailType === 'plaintext' ? 'setEmail' : 'setHashedEmail', + 'email': ''.split(',') + }; + if ('') + loginObj = { + 'event': emailType === 'plaintext' ? 'setLogin' : 'setHashedLogin', + 'login': ''.split(',') + }; + var viewObj = { 'event': 'viewHome' }; + if ('') + viewObj.user_segment = ''; + if ('') + viewObj.nbra = ''; + if ('') + viewObj.nbrc = ''; + if ('') + viewObj.nbrb = ''; + for (var d in customDataObj) + if (customDataObj.hasOwnProperty(d)) { + setDataObj = customDataObj; + setDataObj.event = 'setData'; + break; + } + criteo_q.push(accountObj, setDataObj, siteTypeObj, custObj, emailObj, loginObj, viewObj); + }.apply(this, arguments); + } finally { + if ($___old_c5b4ca906d30de53) + ({}.constructor.defineProperty(window, 'localStorage', $___old_c5b4ca906d30de53)); + } + }; + Bootstrapper.loadScriptCallback('//static.criteo.net/js/ld/ld.js', onload); + }); + }); + }, 2915406, 603887); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-5e95376640055da26becf35ea98d15e6.js b/resources/sugarcoat-5e95376640055da26becf35ea98d15e6.js new file mode 100644 index 00000000..7f0b3961 --- /dev/null +++ b/resources/sugarcoat-5e95376640055da26becf35ea98d15e6.js @@ -0,0 +1,1164 @@ +{ + const $___mock_d13e8f9c9109d55e = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_d13e8f9c9109d55e); + const $___mock_426638777e368d36 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_426638777e368d36); + const $___mock_b4ba15607b50137b = {}; + (exports => { + 'use strict'; + const fetch = async (resource, init = null) => { + throw new TypeError('Failed to fetch'); + }; + exports.fetch = { + configurable: true, + enumerable: true, + value: fetch, + writable: true + }; + })($___mock_b4ba15607b50137b); + (function () { + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function facebook_pixel_id() { + var win = window, adl = win.analyticsdatalayer, facebookPixelId = '781087591914833'; + if (adl.appenvironment === 'test' || adl.appenvironment === 'stage') + facebookPixelId = '353582448417477'; + return facebookPixelId; + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'page', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'facebook-pixel-id', + collection: 'computed', + source: 'Manage', + priv: 'false' + }, { id: '62359' }); + }, 62359); + }, -1, -1); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function displaylocale_language() { + var win = window, utils = win.haEnsightenUtils, displayLocale = utils.adlExtractor('displaylocale'), localeParts = displayLocale.split('_'); + if (displayLocale && localeParts.length === 2) + return localeParts[0]; + return ''; + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'page', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'displaylocale-language', + collection: 'computed', + source: 'Manage', + priv: 'false' + }, { id: '59947' }); + }, 59947); + }, -1, -1); + Bootstrapper.bindDependencyDOMLoaded(function () { + Bootstrapper.ensEvent.add(['Global: Pageview'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var bs = win.Bootstrapper, utils = win.haEnsightenUtils, shouldSyncCookie = 'ta_timeout', syncCookieValue = utils.getCookie(shouldSyncCookie), timeout = 60, tapAdUrl, eventName, visitorId, replacementString, monikerbrand, syncPayload, encodedSyncUrl, reqUrl; + if (syncCookieValue === null) { + tapAdUrl = 'https://pixel.tapad.com/idsync/ex/receive?partner_id=2485&partner_device_id={HAV_ID}&partner_url={ENCODED_CB_URL}'; + eventName = 'sync:tapad.send'; + visitorId = utils.getVisitorId(); + replacementString = 'RYANREPLACEME123'; + monikerbrand = utils.adlExtractor('monikerbrand', '-1'); + syncPayload = { + tapadid: replacementString, + monikerbrand: monikerbrand + }; + encodedSyncUrl = encodeURIComponent(utils.generateClientLoggingRequest(eventName, syncPayload, false)); + reqUrl = tapAdUrl.replace('{HAV_ID}', visitorId).replace('{ENCODED_CB_URL}', encodedSyncUrl); + reqUrl = reqUrl.replace(replacementString, '${TA_DEVICE_ID}'); + bs.imageRequest(reqUrl); + utils.setCookie(shouldSyncCookie, '1', utils.getLocationHostname(), timeout); + } + }(window)); + }); + }, 2597348, [3383374], 490342, [349938]); + Bootstrapper.bindDOMParsed(function () { + Bootstrapper.ensEvent.add(['Global: Pageview'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + var param_ti = '5668975'; + var param_gv = ''; + var param_ea = ''; + var param_ec = ''; + var param_el = ''; + var param_ev = ''; + var pageLoad = true; + var arrayName = ''; + var onload_function = function () { + const $___old_3e0bea6cf199adef = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_4f23e24877ff56d3 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_c183a00c198c5771 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_3e0bea6cf199adef) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_d13e8f9c9109d55e.XMLHttpRequest)); + if ($___old_4f23e24877ff56d3) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_d13e8f9c9109d55e.XMLHttpRequest)); + if ($___old_c183a00c198c5771) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_426638777e368d36.localStorage)); + return function () { + var name = ''; + if (arrayName === 'uetq' || arrayName === '') + name = window.uetq || []; + else if (arrayName !== undefined && arrayName != 'uetq') + name = window.arrayName || []; + var o = { ti: param_ti }; + o.q = name, name = new UET(o); + if (pageLoad) + name.push('pageLoad'); + var local_object = {}; + param_gv ? local_object['gv'] = +(+param_gv).toFixed(3) : '', param_ea ? local_object['ea'] = param_ea : '', param_ec ? local_object['ec'] = param_ec : '', param_el ? local_object['el'] = param_el : '', param_ev ? local_object['ev'] = param_ev : ''; + name.push(local_object); + }.apply(this, arguments); + } finally { + if ($___old_3e0bea6cf199adef) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_3e0bea6cf199adef)); + if ($___old_4f23e24877ff56d3) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_4f23e24877ff56d3)); + if ($___old_c183a00c198c5771) + ({}.constructor.defineProperty(window, 'localStorage', $___old_c183a00c198c5771)); + } + }; + var local_scr_url = '//' + 'bat.bing.com/bat.js'; + Bootstrapper.loadScriptCallback(local_scr_url, onload_function); + }); + }, 2486911, 513978); + Bootstrapper.bindDOMLoaded(function () { + Bootstrapper.ensEvent.add(['Global: Pageview [essential]'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var bs = win.Bootstrapper, utils = win.haEnsightenUtils, visitorId = utils.getVisitorId(), hostname = utils.getLocationHostname(), haAppEnv = utils.adlExtractor('appenvironment', ''), envMapping = { + test: 'dev', + stage: 'int', + production: 'prod' + }, travelPixelParams = { + guid: visitorId, + serverPlatform: 'homeaway', + tpid: '', + eapid: '', + expUserId: '', + amcv: '', + inAuthId: '', + emailHash: '' + }, egEnv = envMapping[haAppEnv]; + if (!egEnv) + return; + bs.insertScript('https://b.travel-assets.com/travel-pixel-js/1.0.0/app.js'); + win.travelPixel = win.travelPixel || []; + win.travelPixel.push(function (TravelPixelWaiter) { + const $___old_06b2b9f9aefb7280 = {}.constructor.getOwnPropertyDescriptor(window, 'fetch'); + try { + if ($___old_06b2b9f9aefb7280) + ({}.constructor.defineProperty(window, 'fetch', $___mock_b4ba15607b50137b.fetch)); + return function () { + var waiter = new TravelPixelWaiter(hostname, egEnv); + waiter.loadXdidApi(travelPixelParams).then(function (xdid) { + if (xdid) + win.edap.push({ + name: 'xdid.send', + data: { xdid: xdid } + }); + }); + }.apply(this, arguments); + } finally { + if ($___old_06b2b9f9aefb7280) + ({}.constructor.defineProperty(window, 'fetch', $___old_06b2b9f9aefb7280)); + } + }); + }(window)); + }); + }, 3255908, 591453); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function ga_marketing_tracking_id() { + var win = window, adl = win.analyticsdatalayer, trackingId = 'UA-160705394-2'; + if (adl.appenvironment === 'production') + trackingId = 'UA-160705394-1'; + return trackingId; + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'page', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'ga-marketing-tracking-id', + collection: 'computed', + source: 'Manage', + priv: 'false' + }, { id: '62497' }); + }, 62497); + }, -1, -1); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function criteo_incrementality_test_bucket() { + var result; + try { + result = window.__ABACUS__.HA_INCR_CRITEO.bucket.bucketValue; + if (result === undefined) + return undefined; + return '' + result; + } catch (e) { + return undefined; + } + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'instance', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'criteo-incrementality-test-bucket', + collection: 'computed', + source: 'Manage', + priv: 'false' + }, { id: '55415' }); + }, 55415); + }, -1, -1); + Bootstrapper.bindImmediate(function () { + Bootstrapper.ensEvent.add(['Global: Pageview'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var utils = win.haEnsightenUtils, bs = win.Bootstrapper, data_definition_dc_activity_id = 48082, data_definition_visitorid = 43463, data_definition_ga_tracking_id = 62497, local_params = {}, hotelAdsAccountId = utils.adlExtractor('monikerbrand') === 'vrbo' ? 'HA-1173782784' : 'HA-1995858853', hotelAdsAccountId2 = 'HA-1850600648', adWordsAccountId = 'AW-956451546', adWordsAccountId2 = 'AW-838446621', adWordsAccountId3 = 'AW-619800534', adWordsDataLayer = 'adwordsDataLayer', doubleClickAccountId = 'DC-' + bs.data.resolve(data_definition_dc_activity_id), gaTrackingId = bs.data.resolve(data_definition_ga_tracking_id), url = '//www.googletagmanager.com/gtag/js?id=' + adWordsAccountId + '&l=' + adWordsDataLayer, domains = [ + 'abritel.fr', + 'aluguetemporada.com.br', + 'homeaway.es', + 'fewo-direkt.de', + 'homeaway.ca', + 'homeaway.at', + 'homeaway.ca', + 'homeaway.co.nz', + 'homeaway.co.uk', + 'homeaway.com', + 'homeaway.com.ar', + 'homeaway.com.au', + 'homeaway.com.mx', + 'homeaway.com.pe', + 'homeaway.dk', + 'homeaway.es', + 'homeaway.fi', + 'homeaway.gr', + 'homeaway.it', + 'homeaway.lk', + 'homeaway.nl', + 'homeaway.no', + 'homeaway.pl', + 'homeaway.pt', + 'homeaway.se', + 'homelidays.com', + 'stayz.com.au', + 'vacationrentals.com', + 'vrbo.com' + ]; + local_params.user_id = bs.data.resolve(data_definition_visitorid); + win[adWordsDataLayer] = win[adWordsDataLayer] || []; + function callbackFunc() { + win.gtag('config', adWordsAccountId); + win.gtag('config', adWordsAccountId2); + win.gtag('config', adWordsAccountId3); + win.gtag('config', doubleClickAccountId); + win.gtag('config', hotelAdsAccountId, { 'conversion_cookie_prefix': '_ha' }); + win.gtag('config', hotelAdsAccountId2, { 'conversion_cookie_prefix': '_ha2' }); + win.gtag('config', gaTrackingId); + win.gtag('event', 'conversion', local_params); + } + if (!win.gtag) { + win.gtag = win.gtag || function gtag() { + win[adWordsDataLayer].push(arguments); + }; + win.gtag('set', 'linker', { + 'domains': domains, + 'decorate_forms': true + }); + win.gtag('js', new Date()); + bs.loadScriptCallback(url, callbackFunc); + } else + callbackFunc(); + }(window)); + }); + }, 3293935, 562379); + Bootstrapper.bindDOMLoaded(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var TAGGING_REQUEST_TIMEOUT = 2000, GLOBAL_EVENT_PREFIX = 'Global', ESSENTIAL_TAG_EVENT_SUFFIX = ' [essential]', utils = win.haEnsightenUtils, bs = win.Bootstrapper, monikerbrand = utils.adlExtractor('monikerbrand', ''), analyticsbrand = utils.adlExtractor('analyticsbrand', ''), referrer = utils.getDocumentReferrer(), brand; + brand = analyticsbrand || monikerbrand; + brand = brand.toUpperCase(); + if (!brand || brand === '-1') { + bs.reportException('edap event translator requires analyticsbrand or monikerbrand to be set in the ADL'); + return; + } + win.edap = win.edap || []; + function listenerComplete(done) { + setTimeout(function () { + done(); + }, TAGGING_REQUEST_TIMEOUT); + } + function triggerAllEvents(eventNames) { + var i; + utils.runIfFunctionalCookiesAllowed(function () { + var j; + for (j = 0; j < eventNames.length; j++) + bs.ensEvent.trigger(eventNames[j]); + }); + for (i = 0; i < eventNames.length; i++) + bs.ensEvent.trigger(eventNames[i] + ESSENTIAL_TAG_EVENT_SUFFIX); + } + win.edap.push(function (edap) { + edap.on('reservation.request.submit', function (data, setAsync, done) { + var eventStr = ': Booking Request Submit', anyStr = ' (Any)', eventNames, listingType, listingTypeStr, brandEventName, globalEventName; + setAsync(); + utils.storeEventData('reservationid', data.reservationid); + utils.storeEventData('bidtarget', data.bidtarget); + utils.storeEventData('fullorderrentalrate', data.fullorderrentalrate); + utils.storeEventData('currency', data.currency); + utils.storeEventData('ordertotal', data.ordertotal); + utils.storeEventData('lengthofstay', data.lengthofstay); + utils.storeEventData('onlinepayments', data.onlinepayments); + utils.storeEventData('edapeventid', data.edapeventid); + listingType = utils.getListingType(); + listingTypeStr = ' (' + listingType.toUpperCase() + ')'; + brandEventName = brand + eventStr; + globalEventName = GLOBAL_EVENT_PREFIX + eventStr; + eventNames = [ + brandEventName + anyStr, + brandEventName + listingTypeStr, + globalEventName + anyStr, + globalEventName + listingTypeStr + ]; + triggerAllEvents(eventNames); + listenerComplete(done); + }); + edap.on('inquiry.success', function (data, setAsync, done) { + var eventStr = ': Inquiry Success', eventNames; + setAsync(); + eventNames = [ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]; + triggerAllEvents(eventNames); + listenerComplete(done); + }); + edap.on('listing.onboarding.submit', function (data, setAsync, done) { + var newOrExisting, brandEventName, globalEventName; + setAsync(); + if (data.newsupplier === 'true') + newOrExisting = 'New'; + else if (data.newsupplier === 'false') + newOrExisting = 'Existing'; + if (newOrExisting) { + utils.storeEventData('bidtarget', data.bidtarget); + utils.storeEventData('bidtargetuuid', data.bidtargetuuid); + utils.storeEventData('newsupplier', data.newsupplier); + globalEventName = [ + GLOBAL_EVENT_PREFIX, + ': ', + newOrExisting, + ' Supplier Onboarding Completion' + ].join(''); + brandEventName = globalEventName.replace(GLOBAL_EVENT_PREFIX, brand); + triggerAllEvents([ + brandEventName, + globalEventName + ]); + } + listenerComplete(done); + }); + edap.on('user.account.created', function (data, setAsync, done) { + var eventDataPropsToStash = [ + 'newusertype', + 'stubaccount', + 'marketingoptout', + 'publicuuid' + ], eventNames = [], brandEventName, globalEventName, currentProp, stubOrFull, accountTypeStr, i; + setAsync(); + for (i = 0; i < eventDataPropsToStash.length; i++) { + currentProp = eventDataPropsToStash[i]; + utils.storeEventData(currentProp, data[currentProp]); + } + globalEventName = [ + GLOBAL_EVENT_PREFIX, + ': ', + 'Account Created' + ].join(''); + brandEventName = globalEventName.replace(GLOBAL_EVENT_PREFIX, brand); + eventNames.push(brandEventName); + eventNames.push(globalEventName); + if (data.stubaccount === 'true') + stubOrFull = 'stub'; + else + stubOrFull = 'full'; + if (data.newusertype) { + accountTypeStr = ' (' + stubOrFull + ' ' + data.newusertype + ')'; + eventNames.push(brandEventName + accountTypeStr); + eventNames.push(globalEventName + accountTypeStr); + } + triggerAllEvents(eventNames); + listenerComplete(done); + }); + edap.on('generic.modal', function (data, setAsync, done) { + var modalName, eventText; + setAsync(); + if (data.modalaction === 'open') { + modalName = data.modalname; + if (modalName === 'booking') { + eventText = ': Booking Modal Opened'; + triggerAllEvents([ + brand + eventText, + GLOBAL_EVENT_PREFIX + eventText + ]); + } else if (modalName === 'inquiry') { + eventText = ': Inquiry Modal Opened'; + triggerAllEvents([ + brand + eventText, + GLOBAL_EVENT_PREFIX + eventText + ]); + } + } + listenerComplete(done); + }); + edap.on('dated.search.submit', function (data, setAsync, done) { + var eventStr = ': Dated Search Submit'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('cart.newsubscription.submit', function (data, setAsync, done) { + var eventStr = ': Cart New Subscription Completion'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('cart.signup.submit', function (data, setAsync, done) { + var eventStr = ': Cart Signup Completion'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('hearting.heart', function (data, setAsync, done) { + var eventStr = ': Listing Favorite'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('owner.registration.submit', function (data, setAsync, done) { + var eventStr = ': Owner Registration'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('payment.submit', function (data, setAsync, done) { + var eventStr = ': Payment Completion'; + setAsync(); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + edap.on('pageview', function (data, setAsync, done) { + var pagetype = data.pagetype || ''; + var pagename = data.pagename || ''; + var eventNames = []; + utils.storeEventData('edapeventid', data.edapeventid); + eventNames.push(brand + ': Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Pageview'); + if (pagetype && pagetype !== 'property' && pagetype !== 'search' && pagetype !== 'checkout') + eventNames.push(GLOBAL_EVENT_PREFIX + ': Pageview NOT Search-Property-Checkout'); + if (utils.getEdapScopeData('isNewSession')) { + eventNames.push(brand + ': New Session'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': New Session'); + } + if (win.edap.getScopeData('ua').isNewUser) { + eventNames.push(brand + ': New UA Visitor'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': New UA Visitor'); + } + if (pagetype === 'home' || pagetype === 'marketing' || pagetype === 'travel-ideas' || pagetype === 'lyp' || pagetype === 'ownerdash') { + eventNames.push(brand + ': Criteo Homepage Tag'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Criteo Homepage Tag'); + } + if (pagetype !== 'search' && pagetype !== 'property' && pagetype !== 'booking' && pagetype !== 'cart') { + eventNames.push(brand + ': Non Shopping Flow'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Non Shopping Flow'); + } + if (pagetype === 'ppb' && pagename === 'ha: ppb signup: account info') { + eventNames.push(brand + ': PPB: Flow Start'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': PPB: Flow Start'); + } + if (pagetype === 'cart' && pagename === 'ha: list your property: confirm') { + eventNames.push(brand + ': Signup Cart: Confirm'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Signup Cart: Confirm'); + } + if (pagetype === 'cart' && pagename === 'ha: list your property: search position') { + eventNames.push(brand + ': Signup Cart: Tier'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Signup Cart: Tier'); + } + if ((pagetype === 'inquiry confirmation' || pagetype === 'inquiry') && pagename === 'inquiry confirmation') { + eventNames.push(brand + ': Inquiry Confirmation'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Inquiry Confirmation'); + } + if (pagetype === 'ppb' && pagename === 'ha: ppb signup: account info') { + eventNames.push(brand + ': PPB: Flow Start'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': PPB: Flow Start'); + } + if (pagetype !== 'pmdash' && typeof referrer === 'string' && referrer.indexOf(utils.getLocationOrigin()) !== 0) { + eventNames.push(brand + ': Not Self-Referral'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Not Self-Referral'); + } + if (utils.getLocationProtocol() === 'https:') { + eventNames.push(brand + ': HTTPS'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': HTTPS'); + } + if (utils.getLocationProtocol() === 'http:') { + eventNames.push(brand + ': HTTP'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': HTTP'); + } + if (pagetype === 'marketing' && pagename.search(/traveler-service-fee/) !== -1) + eventNames.push(GLOBAL_EVENT_PREFIX + ': Traveler Service Fee/HA3.0 Microsite'); + if (pagetype === 'marketing' && pagename === 'discoveryhub: discoveryhub') + eventNames.push(GLOBAL_EVENT_PREFIX + ': Eloqua: Discovery Hub'); + if (pagetype !== 'home' && pagetype !== 'favorites' && pagetype !== 'search' && pagetype !== 'property' && pagetype !== 'Traveler' && pagetype !== 'dashboard' && pagetype.search(/interstitial/) === -1) { + eventNames.push(brand + ': Eloqua Condition'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Eloqua Condition'); + } + if (pagetype === 'careers') { + eventNames.push(brand + ': Careers Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Careers Pageview'); + } + if (pagetype === 'booking') { + eventNames.push(brand + ': Booking Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Traveler Checkout Pageview'); + } + if (pagetype === 'cart') { + eventNames.push(brand + ': Cart Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Cart Pageview'); + } + if (pagetype === 'error') { + eventNames.push(brand + ': Error Page Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Error Page Pageview'); + } + if (pagetype === 'haolb') { + eventNames.push(brand + ': HAOLB Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': HAOLB Pageview'); + } + if (pagetype.search(/help center/) !== -1) { + eventNames.push(brand + ': Help Center Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Help Center Pageview'); + } + if (pagetype === 'home') { + eventNames.push(brand + ': Home Page Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Home Page Pageview'); + } + if (pagetype === 'landing page') { + eventNames.push(brand + ': Landing Page Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Landing Page Pageview'); + } + if (pagetype === 'lyp') { + eventNames.push(brand + ': LYP Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': LYP Pageview'); + } + if (pagetype === 'marketing') { + eventNames.push(brand + ': Marketing Pages Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Marketing Pages Pageview'); + } + if (pagetype === 'owner profile') { + eventNames.push(brand + ': Owner Profile Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Owner Profile Pageview'); + } + if (pagetype === 'payment setup') { + eventNames.push(brand + ': Payment Setup Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Payment Setup Pageview'); + } + if (pagetype === 'pmdash') { + eventNames.push(brand + ': PM Dash Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': PM Dash Pageview'); + } + if (pagetype === 'ppb') { + eventNames.push(brand + ': PPB Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': PPB Pageview'); + } + if (pagetype === 'property') { + eventNames.push(brand + ': Property Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Property Pageview'); + } + if (pagetype === 'ownerdash') { + eventNames.push(brand + ': Ownerdash Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Ownerdash Pageview'); + } + if (pagetype === 'reviews') { + eventNames.push(brand + ': Reviews Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Reviews Pageview'); + } + if (pagetype === 'search') { + eventNames.push(brand + ': Search Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Search Pageview'); + } + if (pagetype === 'search landing page') { + eventNames.push(brand + ': Search Landing Page Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Search Landing Page Pageview'); + } + if (pagetype === 'travel-ideas') { + eventNames.push(brand + ': Travel Ideas Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Travel Ideas Pageview'); + } + if (pagetype === 'travelerdash') { + eventNames.push(brand + ': Travelerdash Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Travelerdash Pageview'); + } + if (pagetype === 'ums') { + eventNames.push(brand + ': UMS Pageview'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': UMS Pageview'); + } + if (pagetype && pagetype !== 'booking') { + eventNames.push(brand + ': Pageview NOT Booking'); + eventNames.push(GLOBAL_EVENT_PREFIX + ': Pageview NOT Booking'); + } + setAsync(); + triggerAllEvents(eventNames); + listenerComplete(done); + }); + edap.on('email.form.submit', function (data, setAsync, done) { + var eventStr = ': Email Form Submit'; + setAsync(); + utils.storeEventData('formuuid', data.formuuid); + triggerAllEvents([ + brand + eventStr, + GLOBAL_EVENT_PREFIX + eventStr + ]); + listenerComplete(done); + }); + bs.bindPageSpecificCompletion(function () { + edap['public'].playback.replay(); + }); + }); + }(window)); + }, 3506442, 431807); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function edapeventid() { + var win = window, utils = win.haEnsightenUtils; + return utils.getEventData('edapeventid', ''); + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'page', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'edapeventid', + collection: 'eventdata', + source: 'Manage', + priv: 'false' + }, { id: '63171' }); + }, 63171); + }, -1, -1); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function dc_activity_id_gtag() { + var win = window, adl = win.analyticsdatalayer, activityId = 'DC-6519113'; + if (adl.appenvironment === 'test' || adl.appenvironment === 'stage') + activityId = 'DC-6646514'; + return activityId; + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'instance', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'dc-activity-id-gtag', + collection: 'DoubleClick', + source: 'Manage', + priv: 'false' + }, { id: '55426' }); + }, 55426); + }, -1, -1); + Bootstrapper.bindImmediate(function () { + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + Bootstrapper.registerDataDefinition(function () { + Bootstrapper.data.define({ + extract: function displaylocale_country() { + var win = window, utils = win.haEnsightenUtils, displayLocale = utils.adlExtractor('displaylocale'), localeParts = displayLocale.split('_'); + if (displayLocale && localeParts.length === 2) + return localeParts[1]; + return ''; + }, + transform: function (val) { + return val ? val : ''; + }, + load: 'instance', + trigger: Bootstrapper.data.bottomOfBodyTrigger, + dataDefName: 'displaylocale-country', + collection: 'computed', + source: 'Manage', + priv: 'false' + }, { id: '59946' }); + }, 59946); + }, -1, -1); + Bootstrapper.bindDOMParsed(function () { + Bootstrapper.ensEvent.add(['Global: Pageview'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var utils = win.haEnsightenUtils, bs = win.Bootstrapper, locale = 'en_US', data_definition_facebook_pixel_id = 62359, pixelId = bs.data.resolve(data_definition_facebook_pixel_id), matching = {}; + matching.external_id = utils.getVisitorId(); + (function (n) { + if (window.fbq) + return; + n = window.fbq = function () { + if (n.callMethod) + n.callMethod.apply(n, arguments); + else + n.queue.push(arguments); + }; + if (!window._fbq) + window._fbq = n; + n.push = n; + n.loaded = !0; + n.version = '2.0'; + n.queue = []; + bs.insertScript('https://connect.facebook.net/' + locale + '/fbevents.js'); + }()); + window.fbq.agent = 'tmensighten'; + fbq('set', 'autoConfig', false, pixelId); + window.fbq('init', pixelId, matching); + window.fbq('track', 'PageView'); + }(window)); + }); + }, 3383494, 635956); + Bootstrapper.bindDOMParsed(function () { + Bootstrapper.ensEvent.add(['Global: Pageview'], function () { + var ensEventContext = this; + if (ensEventContext == window) + ensEventContext = undefined; + var Bootstrapper = window['Bootstrapper']; + var ensightenOptions = Bootstrapper.ensightenOptions; + (function (win) { + var bs = win.Bootstrapper, utils = win.haEnsightenUtils, pixelId = bs.data.resolve(62359), monikerBrand = bs.data.resolve(13919), edapEventId = bs.data.resolve(63171), pageType = bs.data.resolve(13642), eventType = 'PageView', visitorIdSha256Promise = utils.visitorIdSha256(), reqUrl; + if (visitorIdSha256Promise) + visitorIdSha256Promise.then(function (sha256VisitorId) { + reqUrl = 'https://www.facebook.com/tr?id=' + pixelId + '&ev=' + eventType + '&noscript=1' + '&eid=' + edapEventId + '&ud[external_id]=' + sha256VisitorId + '&cd[monikerbrand]=' + monikerBrand + '&cd[pagetype]=' + pageType; + bs.imageRequest(reqUrl); + }); + }(window)); + }); + }, 3383496, 662442); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-AppMeasurement_Module_AudienceManagement.min.js b/resources/sugarcoat-AppMeasurement_Module_AudienceManagement.min.js new file mode 100644 index 00000000..8afed789 --- /dev/null +++ b/resources/sugarcoat-AppMeasurement_Module_AudienceManagement.min.js @@ -0,0 +1,1083 @@ +var AppMeasurement_Module_AudienceManagement; +{ + const $___mock_06561c44cbd83c01 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_06561c44cbd83c01); + (function () { + AppMeasurement_Module_AudienceManagement = $___var_db5d7f5e518b984b; + ({}.constructor.defineProperty(AppMeasurement_Module_AudienceManagement, 'name', { + configurable: true, + enumerable: false, + value: 'AppMeasurement_Module_AudienceManagement', + writable: false + })); + function $___var_db5d7f5e518b984b(e) { + var t = this; + t.s = e; + var n = window; + n.s_c_in || (n.s_c_il = [], n.s_c_in = 0), t._il = n.s_c_il, t._in = n.s_c_in, t._il[t._in] = t, n.s_c_in++, t._c = 's_m', t.setup = function (e) { + n.DIL && e && (e.disableDefaultRequest = !0, e.disableCORS = !0, e.secureDataCollection = !1, t.instance = n.DIL.create(e), t.tools = n.DIL.tools); + }, t.isReady = function () { + return !!t.instance; + }, t.getEventCallConfigParams = function () { + return t.instance && t.instance.api && t.instance.api.getEventCallConfigParams ? t.instance.api.getEventCallConfigParams() : {}; + }, t.passData = function (e) { + t.instance && t.instance.api && t.instance.api.passData && t.instance.api.passData(e); + }; + } + !function () { + 'use strict'; + var r, o, a; + 'function' != typeof window.DIL && (window.DIL = function (n, e) { + const $___old_ea6c26338f4815d7 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_9c0dc6835270a600 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_ea6c26338f4815d7) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_06561c44cbd83c01.XMLHttpRequest)); + if ($___old_9c0dc6835270a600) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_06561c44cbd83c01.XMLHttpRequest)); + return function () { + function t(e) { + return void 0 === e || !0 === e; + } + function s() { + X || (X = !0, j.registerRequest(), K()); + } + var c, i, I, r, u, h, o, a, d, l, f, p, y, g, m, b, v, D, C, O, S, _ = [], w = {}; + n !== Object(n) && (n = {}), I = n.partner, r = n.containerNSID, u = n.mappings, h = n.uuidCookie, o = !0 === n.enableErrorReporting, a = n.visitorService, d = n.declaredId, l = !0 === n.delayAllUntilWindowLoad, f = t(n.secureDataCollection), p = 'boolean' == typeof n.isCoopSafe ? n.isCoopSafe : null, y = t(n.enableHrefererParam), g = t(n.enableLogging), m = t(n.enableUrlDestinations), b = t(n.enableCookieDestinations), v = !0 === n.disableDefaultRequest, D = n.afterResultForDefaultRequest, C = n.visitorConstructor, O = !0 === n.disableCORS, S = !0 === n.ignoreHardDependencyOnVisitorAPI, o && DIL.errorModule.activate(), S && _.push('Warning: this instance is configured to ignore the hard dependency on the VisitorAPI service. This means that no URL destinations will be fired if the instance has no connection to VisitorAPI. If the VisitorAPI service is not instantiated, ID syncs will not be fired either.'); + var R = !0 === window._dil_unit_tests; + if ((c = e) && _.push(c + ''), !I || 'string' != typeof I) { + var E = { + name: 'error', + message: c = 'DIL partner is invalid or not specified in initConfig', + filename: 'dil.js' + }; + return DIL.errorModule.handleError(E), new Error(c); + } + if (c = 'DIL containerNSID is invalid or not specified in initConfig, setting to default of 0', !r && 'number' != typeof r || (r = parseInt(r, 10), !isNaN(r) && 0 <= r && (c = '')), c && (r = 0, _.push(c), c = ''), (i = DIL.getDil(I, r)) instanceof DIL && i.api.getPartner() === I && i.api.getContainerNSID() === r) + return i; + if (!(this instanceof DIL)) + return new DIL(n, 'DIL was not instantiated with the \'new\' operator, returning a valid instance with partner = ' + I + ' and containerNSID = ' + r); + DIL.registerDil(this, I, r); + var P = { + doesConsoleLogExist: window.console === Object(window.console) && 'function' == typeof window.console.log, + logMemo: {}, + log: function (e) { + _.push(e), g && this.doesConsoleLogExist && Function.prototype.bind.call(window.console.log, window.console).apply(window.console, arguments); + }, + logOnce: function (e) { + this.logMemo[e] || (this.logMemo[e] = !0, P.log(e)); + } + }, L = { + IS_HTTPS: f || 'https:' === document.location.protocol, + SIX_MONTHS_IN_MINUTES: 259200, + IE_VERSION: function () { + if (document.documentMode) + return document.documentMode; + for (var e = 7; 4 < e; e--) { + var t = document.createElement('div'); + if (t.innerHTML = '', t.getElementsByTagName('span').length) + return t = null, e; + } + return null; + }() + }; + L.IS_IE_LESS_THAN_10 = 'number' == typeof L.IE_VERSION && L.IE_VERSION < 10; + var A = { stuffed: {} }, q = {}, j = { + firingQueue: [], + fired: [], + firing: !1, + sent: [], + errored: [], + reservedKeys: { + sids: !0, + pdata: !0, + logdata: !0, + callback: !0, + postCallbackFn: !0, + useImageRequest: !0 + }, + firstRequestHasFired: !1, + abortRequests: !1, + num_of_cors_responses: 0, + num_of_cors_errors: 0, + corsErrorSources: [], + num_of_img_responses: 0, + num_of_img_errors: 0, + platformParams: { + d_nsid: r + '', + d_rtbd: 'json', + d_jsonv: DIL.jsonVersion + '', + d_dst: '1' + }, + nonModStatsParams: { + d_rtbd: !0, + d_dst: !0, + d_cts: !0, + d_rs: !0 + }, + modStatsParams: null, + adms: { + TIME_TO_CATCH_ALL_REQUESTS_RELEASE: 30000, + calledBack: !1, + mid: null, + noVisitorAPI: null, + VisitorAPI: null, + instance: null, + releaseType: 'no VisitorAPI', + isOptedOut: !0, + isOptedOutCallbackCalled: !1, + admsProcessingStarted: !1, + process: function (e) { + try { + if (this.admsProcessingStarted) + return; + this.admsProcessingStarted = !0; + var t, n, s, i = a; + if ('function' != typeof e || 'function' != typeof e.getInstance) + throw this.noVisitorAPI = !0, new Error('Visitor does not exist.'); + if (i !== Object(i) || !(t = i.namespace) || 'string' != typeof t) + throw this.releaseType = 'no namespace', new Error('DIL.create() needs the initConfig property `visitorService`:{namespace:\'\'}'); + if ((n = e.getInstance(t, { idSyncContainerID: r })) !== Object(n) || 'function' != typeof n.isAllowed || 'function' != typeof n.getMarketingCloudVisitorID || 'function' != typeof n.getCustomerIDs || 'function' != typeof n.isOptedOut || 'function' != typeof n.publishDestinations) + throw this.releaseType = 'invalid instance', s = 'Invalid Visitor instance.', n === Object(n) && 'function' != typeof n.publishDestinations && (s += ' In particular, visitorInstance.publishDestinations is not a function. This is needed to fire URL destinations in DIL v8.0+ and should be present in Visitor v3.3.0+ .'), new Error(s); + if (this.VisitorAPI = e, !n.isAllowed()) + return this.releaseType = 'VisitorAPI is not allowed to write cookies', void this.releaseRequests(); + this.instance = n, this.waitForMidToReleaseRequests(); + } catch (e) { + if (!S) + throw new Error('Error in processing Visitor API, which is a hard dependency for DIL v8.0+: ' + e.message); + this.releaseRequests(); + } + }, + waitForMidToReleaseRequests: function () { + var t = this; + this.instance && (this.instance.getMarketingCloudVisitorID(function (e) { + t.mid = e, t.releaseType = 'VisitorAPI', t.releaseRequests(); + }, !0), (!Q.exists || !Q.isIabContext && Q.isApproved() || Q.isIabContext && W.hasGoSignal()) && setTimeout(function () { + 'VisitorAPI' !== t.releaseType && (t.releaseType = 'timeout', t.releaseRequests()); + }, this.getLoadTimeout())); + }, + releaseRequests: function () { + this.calledBack = !0, j.registerRequest(); + }, + getMarketingCloudVisitorID: function () { + return this.instance ? this.instance.getMarketingCloudVisitorID() : null; + }, + getMIDQueryString: function () { + var e = N.isPopulatedString, t = this.getMarketingCloudVisitorID(); + return e(this.mid) && this.mid === t || (this.mid = t), e(this.mid) ? 'd_mid=' + this.mid + '&' : ''; + }, + getCustomerIDs: function () { + return this.instance ? this.instance.getCustomerIDs() : null; + }, + getCustomerIDsQueryString: function (e) { + if (e !== Object(e)) + return ''; + var t, n, s, i, r = '', o = [], a = []; + for (t in e) + e.hasOwnProperty(t) && (n = e[a[0] = t]) === Object(n) && (a[1] = n.id || '', a[2] = n.authState || 0, o.push(a), a = []); + if (i = o.length) + for (s = 0; s < i; s++) + r += '&d_cid_ic=' + F.encodeAndBuildRequest(o[s], '%01'); + return r; + }, + getIsOptedOut: function () { + this.instance ? this.instance.isOptedOut([ + this, + this.isOptedOutCallback + ], this.VisitorAPI.OptOut.GLOBAL, !0) : (this.isOptedOut = !1, this.isOptedOutCallbackCalled = !0); + }, + isOptedOutCallback: function (e) { + this.isOptedOut = e, this.isOptedOutCallbackCalled = !0, j.registerRequest(), Q.isIabContext() && W.checkQueryStringObject(); + }, + getLoadTimeout: function () { + var e = this.instance; + if (e) { + if ('function' == typeof e.getLoadTimeout) + return e.getLoadTimeout(); + if (void 0 !== e.loadTimeout) + return e.loadTimeout; + } + return this.TIME_TO_CATCH_ALL_REQUESTS_RELEASE; + } + }, + declaredId: { + declaredId: { + init: null, + request: null + }, + declaredIdCombos: {}, + setDeclaredId: function (e, t) { + var n = N.isPopulatedString, s = encodeURIComponent; + if (e === Object(e) && n(t)) { + var i = e.dpid, r = e.dpuuid, o = null; + if (n(i) && n(r)) + return o = s(i) + '$' + s(r), !0 === this.declaredIdCombos[o] ? 'setDeclaredId: combo exists for type \'' + t + '\'' : (this.declaredIdCombos[o] = !0, this.declaredId[t] = { + dpid: i, + dpuuid: r + }, 'setDeclaredId: succeeded for type \'' + t + '\''); + } + return 'setDeclaredId: failed for type \'' + t + '\''; + }, + getDeclaredIdQueryString: function () { + var e = this.declaredId.request, t = this.declaredId.init, n = encodeURIComponent, s = ''; + return null !== e ? s = '&d_dpid=' + n(e.dpid) + '&d_dpuuid=' + n(e.dpuuid) : null !== t && (s = '&d_dpid=' + n(t.dpid) + '&d_dpuuid=' + n(t.dpuuid)), s; + } + }, + registerRequest: function (e) { + var t, n = this.firingQueue; + e === Object(e) && (n.push(e), e.isDefaultRequest || (v = !0)), this.firing || !n.length || l && !DIL.windowLoaded || (this.adms.isOptedOutCallbackCalled || this.adms.getIsOptedOut(), this.adms.calledBack && !this.adms.isOptedOut && this.adms.isOptedOutCallbackCalled && (Q.isApproved() || W.hasGoSignal()) && (this.adms.isOptedOutCallbackCalled = !1, (t = n.shift()).src = t.src.replace(/&d_nsid=/, '&' + this.adms.getMIDQueryString() + W.getQueryString() + 'd_nsid='), N.isPopulatedString(t.corsPostData) && (t.corsPostData = t.corsPostData.replace(/^d_nsid=/, this.adms.getMIDQueryString() + W.getQueryString() + 'd_nsid=')), x.fireRequest(t), this.firstRequestHasFired || 'script' !== t.tag && 'cors' !== t.tag || (this.firstRequestHasFired = !0))); + }, + processVisitorAPI: function () { + this.adms.process(C || window.Visitor); + }, + getCoopQueryString: function () { + var e = ''; + return !0 === p ? e = '&d_coop_safe=1' : !1 === p && (e = '&d_coop_unsafe=1'), e; + } + }; + w.requestController = j; + var T, M, V = { + sendingMessages: !1, + messages: [], + messagesPosted: [], + destinations: [], + destinationsPosted: [], + jsonForComparison: [], + jsonDuplicates: [], + jsonWaiting: [], + jsonProcessed: [], + publishDestinationsVersion: null, + requestToProcess: function (e, t) { + function n() { + i.jsonForComparison.push(e), i.jsonWaiting.push([ + e, + t + ]); + } + var s, i = this; + if (e && !N.isEmptyObject(e)) + if (s = JSON.stringify(e.dests || []), this.jsonForComparison.length) { + var r, o, a, d = !1; + for (r = 0, o = this.jsonForComparison.length; r < o; r++) + if (a = this.jsonForComparison[r], s === JSON.stringify(a.dests || [])) { + d = !0; + break; + } + d ? this.jsonDuplicates.push(e) : n(); + } else + n(); + if (this.jsonWaiting.length) { + var u = this.jsonWaiting.shift(); + this.process(u[0], u[1]), this.requestToProcess(); + } + this.messages.length && !this.sendingMessages && this.sendMessages(); + }, + process: function (e) { + if (m) { + var t, n, s, i, r, o, a = encodeURIComponent, d = this.getPublishDestinationsVersion(), u = !1; + if (-1 !== d) { + if ((t = e.dests) && t instanceof Array && (n = t.length)) { + for (s = 0; s < n; s++) + i = t[s], o = [ + a('dests'), + a(i.id || ''), + a(i.y || ''), + a(i.c || '') + ].join('|'), this.addMessage(o), r = { + url: i.c, + hideReferrer: void 0 === i.hr || !!i.hr, + message: o + }, this.addDestination(r), void 0 !== i.hr && (u = !0); + 1 === d && u && P.logOnce('Warning: visitorInstance.publishDestinations version is old (Visitor v3.3.0 to v4.0.0). URL destinations will not have the option of being fired on page, only in the iframe.'); + } + this.jsonProcessed.push(e); + } + } + }, + addMessage: function (e) { + this.messages.push(e); + }, + addDestination: function (e) { + this.destinations.push(e); + }, + sendMessages: function () { + this.sendingMessages || (this.sendingMessages = !0, m && this.messages.length && this.publishDestinations()); + }, + publishDestinations: function () { + function e(e) { + P.log('visitor.publishDestinations() result: ' + (e.error || e.message)), n.sendingMessages = !1, n.requestToProcess(); + } + function t() { + n.messages = [], n.destinations = []; + } + var n = this, s = j.adms.instance, i = [], r = []; + return 1 === this.publishDestinationsVersion ? (F.extendArray(i, this.messages), F.extendArray(this.messagesPosted, this.messages), t(), s.publishDestinations(I, i, e), 'Called visitor.publishDestinations() version 1') : 1 < this.publishDestinationsVersion ? (F.extendArray(r, this.destinations), F.extendArray(this.destinationsPosted, this.destinations), t(), s.publishDestinations({ + subdomain: I, + callback: e, + urlDestinations: r + }), 'Called visitor.publishDestinations() version > 1') : void 0; + }, + getPublishDestinationsVersion: function () { + if (null !== this.publishDestinationsVersion) + return this.publishDestinationsVersion; + var e = j.adms.instance, n = -1; + return e.publishDestinations(null, null, function (e) { + if (e === Object(e)) { + var t = e.error; + 'subdomain is not a populated string.' === t ? n = 1 : 'Invalid parameters passed.' === t && (n = 2); + } + }), this.publishDestinationsVersion = n; + } + }, k = { + traits: function (e) { + return N.isValidPdata(e) && (q.sids instanceof Array || (q.sids = []), F.extendArray(q.sids, e)), this; + }, + pixels: function (e) { + return N.isValidPdata(e) && (q.pdata instanceof Array || (q.pdata = []), F.extendArray(q.pdata, e)), this; + }, + logs: function (e) { + return N.isValidLogdata(e) && (q.logdata !== Object(q.logdata) && (q.logdata = {}), F.extendObject(q.logdata, e)), this; + }, + customQueryParams: function (e) { + return N.isEmptyObject(e) || F.extendObject(q, e, j.reservedKeys), this; + }, + signals: function (e, t) { + var n, s = e; + if (!N.isEmptyObject(s)) { + if (t && 'string' == typeof t) + for (n in (s = {}, e)) + e.hasOwnProperty(n) && (s[t + n] = e[n]); + F.extendObject(q, s, j.reservedKeys); + } + return this; + }, + declaredId: function (e) { + return j.declaredId.setDeclaredId(e, 'request'), this; + }, + result: function (e) { + return 'function' == typeof e && (q.callback = e), this; + }, + afterResult: function (e) { + return 'function' == typeof e && (q.postCallbackFn = e), this; + }, + useImageRequest: function () { + return q.useImageRequest = !0, this; + }, + clearData: function () { + return q = {}, this; + }, + submit: function (e) { + return q.isDefaultRequest = !!e, x.submitRequest(q), q = {}, this; + }, + getPartner: function () { + return I; + }, + getContainerNSID: function () { + return r; + }, + getEventLog: function () { + return _; + }, + getState: function () { + var e = {}, t = {}; + return F.extendObject(e, j, { registerRequest: !0 }), F.extendObject(t, V, { + requestToProcess: !0, + process: !0, + sendMessages: !0 + }), { + initConfig: n, + pendingRequest: q, + otherRequestInfo: e, + destinationPublishingInfo: t, + log: _ + }; + }, + idSync: function () { + throw new Error('Please use the `idSyncByURL` method of the Experience Cloud ID Service (Visitor) instance'); + }, + aamIdSync: function () { + throw new Error('Please use the `idSyncByDataSource` method of the Experience Cloud ID Service (Visitor) instance'); + }, + passData: function (e) { + return N.isEmptyObject(e) ? 'Error: json is empty or not an object' : (x.defaultCallback(e), e); + }, + getPlatformParams: function () { + return j.platformParams; + }, + getEventCallConfigParams: function () { + var e, t = j, n = t.modStatsParams, s = t.platformParams; + if (!n) { + for (e in (n = {}, s)) + s.hasOwnProperty(e) && !t.nonModStatsParams[e] && (n[e.replace(/^d_/, '')] = s[e]); + !0 === p ? n.coop_safe = 1 : !1 === p && (n.coop_unsafe = 1), t.modStatsParams = n; + } + return n; + }, + setAsCoopSafe: function () { + return p = !0, this; + }, + setAsCoopUnsafe: function () { + return p = !1, this; + }, + getEventCallIabSignals: function (e) { + var t; + return e !== Object(e) ? 'Error: config is not an object' : 'function' != typeof e.callback ? 'Error: config.callback is not a function' : (t = parseInt(e.timeout, 10), isNaN(t) && (t = null), void W.getQueryStringObject(e.callback, t)); + } + }, x = { + corsMetadata: (T = 'none', 'undefined' != typeof XMLHttpRequest && XMLHttpRequest === Object(XMLHttpRequest) && 'withCredentials' in new XMLHttpRequest() && (T = 'XMLHttpRequest'), { corsType: T }), + getCORSInstance: function () { + return 'none' === this.corsMetadata.corsType ? null : new window[this.corsMetadata.corsType](); + }, + submitRequest: function (e) { + return j.registerRequest(x.createQueuedRequest(e)), !0; + }, + createQueuedRequest: function (e) { + var t, n, s, i, r, o = e.callback, a = 'img', d = e.isDefaultRequest; + if (delete e.isDefaultRequest, !N.isEmptyObject(u)) + for (s in u) + if (u.hasOwnProperty(s)) { + if (null == (i = u[s]) || '' === i) + continue; + if (s in e && !(i in e) && !(i in j.reservedKeys)) { + if (null == (r = e[s]) || '' === r) + continue; + e[i] = r; + } + } + return N.isValidPdata(e.sids) || (e.sids = []), N.isValidPdata(e.pdata) || (e.pdata = []), N.isValidLogdata(e.logdata) || (e.logdata = {}), e.logdataArray = F.convertObjectToKeyValuePairs(e.logdata, '=', !0), e.logdataArray.push('_ts=' + new Date().getTime()), 'function' != typeof o && (o = this.defaultCallback), t = this.makeRequestSrcData(e), (n = this.getCORSInstance()) && !0 !== e.useImageRequest && (a = 'cors'), { + tag: a, + src: t.src, + corsSrc: t.corsSrc, + callbackFn: o, + postCallbackFn: e.postCallbackFn, + useImageRequest: !!e.useImageRequest, + requestData: e, + corsInstance: n, + corsPostData: t.corsPostData, + isDefaultRequest: d + }; + }, + defaultCallback: function (e, t) { + var n, s, i, r, o, a, d, u, c; + if (b && (n = e.stuff) && n instanceof Array && (s = n.length)) + for (i = 0; i < s; i++) + (r = n[i]) && r === Object(r) && (o = r.cn, a = r.cv, void 0 !== (d = r.ttl) && '' !== d || (d = Math.floor(F.getMaxCookieExpiresInMinutes() / 60 / 24)), u = r.dmn || '.' + document.domain.replace(/^www\./, ''), c = r.type, o && (a || 'number' == typeof a) && ('var' !== c && (d = parseInt(d, 10)) && !isNaN(d) && F.setCookie(o, a, 24 * d * 60, '/', u, !1), A.stuffed[o] = a)); + var l, f, p = e.uuid; + N.isPopulatedString(p) && (N.isEmptyObject(h) || ('string' == typeof (l = h.path) && l.length || (l = '/'), f = parseInt(h.days, 10), isNaN(f) && (f = 100), F.setCookie(h.name || 'aam_did', p, 24 * f * 60, l, h.domain || '.' + document.domain.replace(/^www\./, ''), !0 === h.secure))), j.abortRequests || V.requestToProcess(e, t); + }, + makeRequestSrcData: function (r) { + r.sids = N.removeEmptyArrayValues(r.sids || []), r.pdata = N.removeEmptyArrayValues(r.pdata || []); + var o = j, e = o.platformParams, t = F.encodeAndBuildRequest(r.sids, ','), n = F.encodeAndBuildRequest(r.pdata, ','), s = (r.logdataArray || []).join('&'); + delete r.logdataArray; + var i, a, d = encodeURIComponent, u = L.IS_HTTPS ? 'https://' : 'http://', c = o.declaredId.getDeclaredIdQueryString(), l = o.adms.instance ? o.adms.getCustomerIDsQueryString(o.adms.getCustomerIDs()) : '', f = function () { + var e, t, n, s, i = []; + for (e in r) + if (!(e in o.reservedKeys) && r.hasOwnProperty(e)) + if (t = r[e], e = d(e), t instanceof Array) + for (n = 0, s = t.length; n < s; n++) + i.push(e + '=' + d(t[n])); + else + i.push(e + '=' + d(t)); + return i.length ? '&' + i.join('&') : ''; + }(), p = 'd_dil_ver=' + d(DIL.version), h = 'd_nsid=' + e.d_nsid + o.getCoopQueryString() + c + l + (t.length ? '&d_sid=' + t : '') + (n.length ? '&d_px=' + n : '') + (s.length ? '&d_ld=' + d(s) : ''), g = '&d_rtbd=' + e.d_rtbd + '&d_jsonv=' + e.d_jsonv + '&d_dst=' + e.d_dst, m = y ? '&h_referer=' + d(location.href) : ''; + return a = (i = u + I + '.demdex.net/event') + '?' + p + '&' + h + g + f + m, { + corsSrc: i + '?' + p + '&_ts=' + new Date().getTime(), + src: a, + corsPostData: h + g + f + m, + isDeclaredIdCall: '' !== c + }; + }, + fireRequest: function (e) { + if ('img' === e.tag) + this.fireImage(e); + else { + var t = j.declaredId, n = t.declaredId.request || t.declaredId.init || {}, s = { + dpid: n.dpid || '', + dpuuid: n.dpuuid || '' + }; + this.fireCORS(e, s); + } + }, + fireImage: function (t) { + var e, n, s = j; + s.abortRequests || (s.firing = !0, e = new Image(0, 0), s.sent.push(t), e.onload = function () { + s.firing = !1, s.fired.push(t), s.num_of_img_responses++, s.registerRequest(); + }, n = function (e) { + c = 'imgAbortOrErrorHandler received the event of type ' + e.type, P.log(c), s.abortRequests = !0, s.firing = !1, s.errored.push(t), s.num_of_img_errors++, s.registerRequest(); + }, e.addEventListener('error', n), e.addEventListener('abort', n), e.src = t.src); + }, + fireCORS: function (s, i) { + var r = this, o = j, e = this.corsMetadata.corsType, t = s.corsSrc, n = s.corsInstance, a = s.corsPostData, d = s.postCallbackFn, u = 'function' == typeof d; + if (!o.abortRequests && !O) { + o.firing = !0; + try { + n.open('post', t, !0), 'XMLHttpRequest' === e && (n.withCredentials = !0, n.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'), n.onreadystatechange = function () { + 4 === this.readyState && 200 === this.status && function (e) { + var t; + try { + if ((t = JSON.parse(e)) !== Object(t)) + return r.handleCORSError(s, i, 'Response is not JSON'); + } catch (e) { + return r.handleCORSError(s, i, 'Error parsing response as JSON'); + } + try { + var n = s.callbackFn; + o.firing = !1, o.fired.push(s), o.num_of_cors_responses++, n(t, i), u && d(t, i); + } catch (e) { + e.message = 'DIL handleCORSResponse caught error with message ' + e.message, c = e.message, P.log(c), e.filename = e.filename || 'dil.js', e.partner = I, DIL.errorModule.handleError(e); + try { + n({ error: e.name + '|' + e.message }, i), u && d({ error: e.name + '|' + e.message }, i); + } catch (e) { + } + } finally { + o.registerRequest(); + } + }(this.responseText); + }), n.onerror = function () { + r.handleCORSError(s, i, 'onerror'); + }, n.ontimeout = function () { + r.handleCORSError(s, i, 'ontimeout'); + }, n.send(a); + } catch (e) { + this.handleCORSError(s, i, 'try-catch'); + } + o.sent.push(s), o.declaredId.declaredId.request = null; + } + }, + handleCORSError: function (e, t, n) { + j.num_of_cors_errors++, j.corsErrorSources.push(n); + } + }, N = { + isValidPdata: function (e) { + return !!(e instanceof Array && this.removeEmptyArrayValues(e).length); + }, + isValidLogdata: function (e) { + return !this.isEmptyObject(e); + }, + isEmptyObject: function (e) { + if (e !== Object(e)) + return !0; + var t; + for (t in e) + if (e.hasOwnProperty(t)) + return !1; + return !0; + }, + removeEmptyArrayValues: function (e) { + var t, n = 0, s = e.length, i = []; + for (n = 0; n < s; n++) + null != (t = e[n]) && '' !== t && i.push(t); + return i; + }, + isPopulatedString: function (e) { + return 'string' == typeof e && e.length; + } + }, F = { + convertObjectToKeyValuePairs: function (e, t, n) { + var s, i, r = []; + for (s in (t = t || '=', e)) + e.hasOwnProperty(s) && null != (i = e[s]) && '' !== i && r.push(s + t + (n ? encodeURIComponent(i) : i)); + return r; + }, + encodeAndBuildRequest: function (e, t) { + return e.map(function (e) { + return encodeURIComponent(e); + }).join(t); + }, + getCookie: function (e) { + var t, n, s, i = e + '=', r = document.cookie.split(';'); + for (t = 0, n = r.length; t < n; t++) { + for (s = r[t]; ' ' === s.charAt(0);) + s = s.substring(1, s.length); + if (0 === s.indexOf(i)) + return decodeURIComponent(s.substring(i.length, s.length)); + } + return null; + }, + setCookie: function (e, t, n, s, i, r) { + var o = new Date(); + n = n && 1000 * n * 60, document.cookie = e + '=' + encodeURIComponent(t) + (n ? ';expires=' + new Date(o.getTime() + n).toUTCString() : '') + (s ? ';path=' + s : '') + (i ? ';domain=' + i : '') + (r ? ';secure' : ''); + }, + extendArray: function (e, t) { + return e instanceof Array && t instanceof Array && (Array.prototype.push.apply(e, t), !0); + }, + extendObject: function (e, t, n) { + var s; + if (e !== Object(e) || t !== Object(t)) + return !1; + for (s in t) + if (t.hasOwnProperty(s)) { + if (!N.isEmptyObject(n) && s in n) + continue; + e[s] = t[s]; + } + return !0; + }, + getMaxCookieExpiresInMinutes: function () { + return L.SIX_MONTHS_IN_MINUTES; + }, + replaceMethodsWithFunction: function (e, t) { + var n; + if (e === Object(e) && 'function' == typeof t) + for (n in e) + e.hasOwnProperty(n) && 'function' == typeof e[n] && (e[n] = t); + } + }, Q = (M = w.requestController, { + exists: null, + instance: null, + aamIsApproved: null, + init: function () { + var e = this; + this.checkIfExists() ? (this.exists = !0, this.instance = window.adobe.optIn, this.instance.fetchPermissions(function () { + e.callback(); + }, !0)) : this.exists = !1; + }, + checkIfExists: function () { + return window.adobe === Object(window.adobe) && window.adobe.optIn === Object(window.adobe.optIn); + }, + callback: function () { + this.aamIsApproved = this.instance.isApproved([this.instance.Categories.AAM]), M.adms.waitForMidToReleaseRequests(), M.adms.getIsOptedOut(); + }, + isApproved: function () { + return !this.isIabContext() && !M.adms.isOptedOut && (!this.exists || this.aamIsApproved); + }, + isIabContext: function () { + return this.instance && this.instance.isIabContext; + } + }); + w.optIn = Q; + var H, U, B, G, W = (U = (H = w).requestController, B = H.optIn, G = { + isVendorConsented: null, + doesGdprApply: null, + consentString: null, + queryStringObjectCallbacks: [], + init: function () { + this.fetchConsentData(); + }, + hasGoSignal: function () { + return !(!(B.isIabContext() && this.isVendorConsented && this.doesGdprApply && 'string' == typeof this.consentString && this.consentString.length) || U.adms.isOptedOut); + }, + fetchConsentData: function (n, e) { + var s = this, t = {}; + 'function' != typeof n && (n = function () { + }), B.instance && B.isIabContext() ? (e && (t.timeout = e), B.instance.execute({ + command: 'iabPlugin.fetchConsentData', + params: t, + callback: function (e, t) { + t === Object(t) ? (s.doesGdprApply = !!t.gdprApplies, s.consentString = t.consentString || '') : (s.doesGdprApply = !1, s.consentString = ''), s.isVendorConsented = B.instance.isApproved(B.instance.Categories.AAM), e ? n({}) : s.checkQueryStringObject(n), U.adms.waitForMidToReleaseRequests(); + } + })) : n({}); + }, + getQueryString: function () { + return B.isIabContext() ? 'gdpr=' + (this.doesGdprApply ? 1 : 0) + '&gdpr_consent=' + this.consentString + '&' : ''; + }, + getQueryStringObject: function (e, t) { + this.fetchConsentData(e, t); + }, + checkQueryStringObject: function (e) { + G.hasGoSignal() && 'function' == typeof e && e({ + gdpr: this.doesGdprApply ? 1 : 0, + gdpr_consent: this.consentString + }); + } + }); + w.iab = W, 'error' === I && 0 === r && window.addEventListener('load', function () { + DIL.windowLoaded = !0; + }); + var X = !1, K = function () { + setTimeout(function () { + v || j.firstRequestHasFired || ('function' == typeof D ? k.afterResult(D).submit(!0) : k.submit(!0)); + }, DIL.constants.TIME_TO_DEFAULT_REQUEST); + }, J = document; + 'error' !== I && (DIL.windowLoaded ? s() : 'complete' !== J.readyState && 'loaded' !== J.readyState ? window.addEventListener('load', function () { + DIL.windowLoaded = !0, s(); + }) : (DIL.windowLoaded = !0, s())), j.declaredId.setDeclaredId(d, 'init'), Q.init(), W.init(), j.processVisitorAPI(), L.IS_IE_LESS_THAN_10 && F.replaceMethodsWithFunction(k, function () { + return this; + }), this.api = k, this.getStuffedVariable = function (e) { + var t = A.stuffed[e]; + return t || 'number' == typeof t || (t = F.getCookie(e)) || 'number' == typeof t || (t = ''), t; + }, this.validators = N, this.helpers = F, this.constants = L, this.log = _, this.pendingRequest = q, this.requestController = j, this.destinationPublishing = V, this.requestProcs = x, this.units = w, this.initConfig = n, this.logger = P, R && (this.variables = A, this.callWindowLoadFunctions = s); + }.apply(this, arguments); + } finally { + if ($___old_ea6c26338f4815d7) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_ea6c26338f4815d7)); + if ($___old_9c0dc6835270a600) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_9c0dc6835270a600)); + } + }, DIL.extendStaticPropertiesAndMethods = function (e) { + var t; + if (e === Object(e)) + for (t in e) + e.hasOwnProperty(t) && (this[t] = e[t]); + }, DIL.extendStaticPropertiesAndMethods({ + version: '9.4', + jsonVersion: 1, + constants: { TIME_TO_DEFAULT_REQUEST: 500 }, + variables: { scriptNodeList: document.getElementsByTagName('script') }, + windowLoaded: !1, + dils: {}, + isAddedPostWindowLoad: function (e) { + var t = e; + this.windowLoaded = 'function' == typeof t ? !!t() : 'boolean' != typeof t || t; + }, + create: function (e) { + try { + return new DIL(e); + } catch (e) { + throw new Error('Error in attempt to create DIL instance with DIL.create(): ' + e.message); + } + }, + registerDil: function (e, t, n) { + var s = t + '$' + n; + s in this.dils || (this.dils[s] = e); + }, + getDil: function (e, t) { + var n; + return 'string' != typeof e && (e = ''), (n = e + '$' + (t = t || 0)) in this.dils ? this.dils[n] : new Error('The DIL instance with partner = ' + e + ' and containerNSID = ' + t + ' was not found'); + }, + dexGetQSVars: function (e, t, n) { + var s = this.getDil(t, n); + return s instanceof this ? s.getStuffedVariable(e) : ''; + } + }), DIL.errorModule = (r = DIL.create({ + partner: 'error', + containerNSID: 0, + ignoreHardDependencyOnVisitorAPI: !0 + }), a = !(o = { + harvestererror: 14138, + destpuberror: 14139, + dpmerror: 14140, + generalerror: 14137, + error: 14137, + noerrortypedefined: 15021, + evalerror: 15016, + rangeerror: 15017, + referenceerror: 15018, + typeerror: 15019, + urierror: 15020 + }), { + activate: function () { + a = !0; + }, + handleError: function (e) { + if (!a) + return 'DIL error module has not been activated'; + e !== Object(e) && (e = {}); + var t = e.name ? (e.name + '').toLowerCase() : '', n = t in o ? o[t] : o.noerrortypedefined, s = [], i = { + name: t, + filename: e.filename ? e.filename + '' : '', + partner: e.partner ? e.partner + '' : 'no_partner', + site: e.site ? e.site + '' : document.location.href, + message: e.message ? e.message + '' : '' + }; + return s.push(n), r.api.pixels(s).logs(i).useImageRequest().submit(), 'DIL error report sent'; + }, + pixelMap: o + }), DIL.tools = {}, DIL.modules = { helpers: {} }); + }(); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min.js b/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min.js new file mode 100644 index 00000000..8c3393db --- /dev/null +++ b/resources/sugarcoat-EXc2f2c81d843441bfbe3ef094a9cff39d-libraryCode_source.min.js @@ -0,0 +1,3072 @@ +var fdx_initSCVars, fdx_debug, fdx_setCookie, fdx_getCookie, fdx_campaign, fdx_gup, fdx_fireSDotT, fdx_fireSDotTL, fdx_spSrch, logLinkView, fdx_logLinkView, setLinkView, fdx_setLinkView, fdx_getLinkView, fdx_linkFormat, fdx_trackMapping, fdx_logDownload, logPageView, fdx_logPageView, logPurchase, fdx_logPurchase, fdx_logPurchaseMAGS, isObject, fdx_logPurchase_PageLevel, fdx_logPurchaseMAGR, fdx_logPurchaseWREG, processData, fdx_convertToStr, fdx_logChat, s_doPlugins, fdx_initPlugins, AppMeasurement_Module_Integrate, AppMeasurement_Module_AudienceManagement, AppMeasurement_Module_ActivityMap, AppMeasurement, s_gi, s_pgicq, fdx_runSCode, fdx_initSCode, fdx_createCustomEvent, fdx_dispatchCustomEvent, fdx_fireCustomEvent, MAGSEvarMapping; +{ + const $___mock_c7caec501dca2387 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_c7caec501dca2387); + const $___mock_f8e9a6d6172a3144 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_f8e9a6d6172a3144); + (function () { + fdx_initSCVars = $___var_10ff31349d6e6ecc; + ({}.constructor.defineProperty(fdx_initSCVars, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_initSCVars', + writable: false + })); + fdx_debug = $___var_736976d373e99987; + ({}.constructor.defineProperty(fdx_debug, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_debug', + writable: false + })); + fdx_setCookie = $___var_c8185a8c04ff5cc5; + ({}.constructor.defineProperty(fdx_setCookie, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_setCookie', + writable: false + })); + fdx_getCookie = $___var_4b36f2e57ae588b3; + ({}.constructor.defineProperty(fdx_getCookie, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_getCookie', + writable: false + })); + fdx_campaign = $___var_3e58ad61bf25697b; + ({}.constructor.defineProperty(fdx_campaign, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_campaign', + writable: false + })); + fdx_gup = $___var_816f4d070af00078; + ({}.constructor.defineProperty(fdx_gup, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_gup', + writable: false + })); + fdx_fireSDotT = $___var_0e30bdafb57c5e6c; + ({}.constructor.defineProperty(fdx_fireSDotT, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_fireSDotT', + writable: false + })); + fdx_fireSDotTL = $___var_0828c18ac3e1a798; + ({}.constructor.defineProperty(fdx_fireSDotTL, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_fireSDotTL', + writable: false + })); + fdx_spSrch = $___var_5387c06d0e2d7fa6; + ({}.constructor.defineProperty(fdx_spSrch, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_spSrch', + writable: false + })); + logLinkView = $___var_3e31cbb76ddcac60; + ({}.constructor.defineProperty(logLinkView, 'name', { + configurable: true, + enumerable: false, + value: 'logLinkView', + writable: false + })); + fdx_logLinkView = $___var_bbdf365d789959b7; + ({}.constructor.defineProperty(fdx_logLinkView, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logLinkView', + writable: false + })); + setLinkView = $___var_317cc34c4c6190d2; + ({}.constructor.defineProperty(setLinkView, 'name', { + configurable: true, + enumerable: false, + value: 'setLinkView', + writable: false + })); + fdx_setLinkView = $___var_09ad9b275d610c1b; + ({}.constructor.defineProperty(fdx_setLinkView, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_setLinkView', + writable: false + })); + fdx_getLinkView = $___var_708f39af21cb33b7; + ({}.constructor.defineProperty(fdx_getLinkView, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_getLinkView', + writable: false + })); + fdx_linkFormat = $___var_d9daf397848e68a7; + ({}.constructor.defineProperty(fdx_linkFormat, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_linkFormat', + writable: false + })); + fdx_trackMapping = $___var_299c55932ad0a9de; + ({}.constructor.defineProperty(fdx_trackMapping, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_trackMapping', + writable: false + })); + fdx_logDownload = $___var_b98d4fcd2e1f4acc; + ({}.constructor.defineProperty(fdx_logDownload, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logDownload', + writable: false + })); + logPageView = $___var_9da55740d3cd3d0d; + ({}.constructor.defineProperty(logPageView, 'name', { + configurable: true, + enumerable: false, + value: 'logPageView', + writable: false + })); + fdx_logPageView = $___var_1bfbbaa58509fa95; + ({}.constructor.defineProperty(fdx_logPageView, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPageView', + writable: false + })); + logPurchase = $___var_59931a2e1ee9b507; + ({}.constructor.defineProperty(logPurchase, 'name', { + configurable: true, + enumerable: false, + value: 'logPurchase', + writable: false + })); + fdx_logPurchase = $___var_a88dca13581b76c9; + ({}.constructor.defineProperty(fdx_logPurchase, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPurchase', + writable: false + })); + fdx_logPurchaseMAGS = $___var_85ce99bb18290254; + ({}.constructor.defineProperty(fdx_logPurchaseMAGS, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPurchaseMAGS', + writable: false + })); + isObject = $___var_b4c74d1df2a59429; + ({}.constructor.defineProperty(isObject, 'name', { + configurable: true, + enumerable: false, + value: 'isObject', + writable: false + })); + fdx_logPurchase_PageLevel = $___var_91f1f803d91688f8; + ({}.constructor.defineProperty(fdx_logPurchase_PageLevel, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPurchase_PageLevel', + writable: false + })); + fdx_logPurchaseMAGR = $___var_b5e3cf34acf13f3c; + ({}.constructor.defineProperty(fdx_logPurchaseMAGR, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPurchaseMAGR', + writable: false + })); + fdx_logPurchaseWREG = $___var_992870d603806817; + ({}.constructor.defineProperty(fdx_logPurchaseWREG, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logPurchaseWREG', + writable: false + })); + processData = $___var_643c99472783f4a2; + ({}.constructor.defineProperty(processData, 'name', { + configurable: true, + enumerable: false, + value: 'processData', + writable: false + })); + fdx_convertToStr = $___var_29acb6ddea69c410; + ({}.constructor.defineProperty(fdx_convertToStr, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_convertToStr', + writable: false + })); + fdx_logChat = $___var_8ce62da133895ce9; + ({}.constructor.defineProperty(fdx_logChat, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_logChat', + writable: false + })); + s_doPlugins = $___var_2a8ff80ee0f3ce54; + ({}.constructor.defineProperty(s_doPlugins, 'name', { + configurable: true, + enumerable: false, + value: 's_doPlugins', + writable: false + })); + fdx_initPlugins = $___var_747f7ac24cff9e59; + ({}.constructor.defineProperty(fdx_initPlugins, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_initPlugins', + writable: false + })); + AppMeasurement_Module_Integrate = $___var_845956a58f0481d8; + ({}.constructor.defineProperty(AppMeasurement_Module_Integrate, 'name', { + configurable: true, + enumerable: false, + value: 'AppMeasurement_Module_Integrate', + writable: false + })); + AppMeasurement_Module_AudienceManagement = $___var_fdcb2b5ff88cdd96; + ({}.constructor.defineProperty(AppMeasurement_Module_AudienceManagement, 'name', { + configurable: true, + enumerable: false, + value: 'AppMeasurement_Module_AudienceManagement', + writable: false + })); + AppMeasurement_Module_ActivityMap = $___var_13822a43eeddafac; + ({}.constructor.defineProperty(AppMeasurement_Module_ActivityMap, 'name', { + configurable: true, + enumerable: false, + value: 'AppMeasurement_Module_ActivityMap', + writable: false + })); + AppMeasurement = $___var_2df800538439b811; + ({}.constructor.defineProperty(AppMeasurement, 'name', { + configurable: true, + enumerable: false, + value: 'AppMeasurement', + writable: false + })); + s_gi = $___var_1411bce9e2bc6b85; + ({}.constructor.defineProperty(s_gi, 'name', { + configurable: true, + enumerable: false, + value: 's_gi', + writable: false + })); + s_pgicq = $___var_385189dc7e558eb0; + ({}.constructor.defineProperty(s_pgicq, 'name', { + configurable: true, + enumerable: false, + value: 's_pgicq', + writable: false + })); + fdx_runSCode = $___var_8bf1ab7ed297b2c8; + ({}.constructor.defineProperty(fdx_runSCode, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_runSCode', + writable: false + })); + fdx_initSCode = $___var_9b2a4c2f76e73a16; + ({}.constructor.defineProperty(fdx_initSCode, 'name', { + configurable: true, + enumerable: false, + value: 'fdx_initSCode', + writable: false + })); + function $___var_10ff31349d6e6ecc() { + window.sc_code_ver = '3.0.40', window.sc_code_ver_date = '06152021.01', window.s_version = 'AM.2.22.0', window.s_account = 'fedexglbldev', 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'), window.wwwHost = _fdx.pcfUtil(), 'www.fedex.com' == wwwHost && (s_account = _satellite.getVar('sAccount')), window.s = s_gi(s_account), s.pageLoadComplete = !1, s.trackDownloadLinks = !0, s.trackExternalLinks = !0, s.trackInlineStats = !0, s.linkDownloadFileTypes = 'exe,zip,wav,mp3,mp4,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx,png', s.linkLeaveQueryString = !1, s.linkTrackVars = 'None', s.linkTrackEvents = 'None', s.usePlugins = !0, s.linkInternalFilters = 'javascript:,fedex.com,iamfedex.com,fedexads.designcdt.com,kinkosdev.com,kinkostest.com,senseaware.com,fedexsameday.com,fedex.p.delivery.net,fedex.co.jp,psg.kinkos.com,fedexcares.com,bongous.com', window.nltrk = ''; + } + function $___var_736976d373e99987(e, t, n) { + t = void 0 !== t ? '[' + t + '] ' : '', n = void 0 !== n ? '[' + n + '] ' : '', window.console && console.log ? console.log(t + n + e) : window.opera && opera.postError && opera.postError(t + n + e); + try { + var i = void 0 !== fdx_getCookie('fdx_debug') ? fdx_getCookie('fdx_debug').split(',') : [], r = _fdx.getTestLevel(), a = new Date().getTime() + '|' + t + n + e + '|' + r + '|' + ('undefined' != typeof s && s.pageName ? s.pageName : document.location.href); + i.push(a.replace(/,/g, '##')), fdx_setCookie('fdx_debug', i, 1, '/', '.fedex.com'); + } catch (o) { + } + } + function $___var_c8185a8c04ff5cc5(e, t, n, i, r) { + try { + if (null !== t) { + var a = escape(t); + if ('' !== n) { + var s = new Date(); + s.setDate(s.getDate() + n), a += null === n ? '' : '; expires=' + s.toUTCString(); + } + a += null != i ? '; path=' + i : '', a += null != r ? '; domain=' + r : '', document.cookie = e + '=' + a; + } + } catch (o) { + fdx_debug(o, 'CIM', 'fdx_setCookie'); + } + } + function $___var_4b36f2e57ae588b3(e) { + try { + for (var t, n = {}, i = document.cookie.split('; '), r = 0; r < i.length; r++) + n[(t = i[r].split('='))[0]] = unescape(t[1]); + return n[e]; + } catch (a) { + fdx_debug(a, 'CIM', 'fdx_getCookie'); + } + } + function $___var_3e58ad61bf25697b() { + try { + return fdx_gup(window.location != window.parent.location ? document.referrer : document.location, 'cmp'); + } catch (e) { + return fdx_debug(e, 'SC', 'fdx_campaign'), ''; + } + } + function $___var_816f4d070af00078(e, t) { + t = t.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var n = new RegExp('[\\?&]' + t + '=([^&#]*)', 'i').exec(e); + return null == n ? '' : n[1]; + } + function $___var_0e30bdafb57c5e6c() { + try { + s.delayV = !1; + s.t(); + s.events = '', s.list1 = '', s.list2 = '', s.list3 = '', sEvntsOnce = '', s.c_w('SC_LINKS', ''), s.c_w('setLink', ''); + } catch (e) { + fdx_debug(e, 'SC', 'fdx_fireSDotT'); + } + } + function $___var_0828c18ac3e1a798(e, t, n) { + try { + s.linkTrackVars = s.apl(s.linkTrackVars, 'prop50', ',', 2), s.tl(e, t, n), s.linkTrackVars = 'None', s.linkTrackEvents = 'None', s.events = '', s.list1 = '', s.list2 = '', s.list3 = '', s.c_w('SC_LINKS', ''), s.c_w('setLink', ''); + } catch (i) { + fdx_debug(i, 'SC', 'fdx_fireSDotTL'); + } + } + function $___var_5387c06d0e2d7fa6(e) { + var t = s.Util.getQueryParam('q'), n = _satellite.getVar('content:locale'), r = (0 < e.totalResultCount ? 'Success' : 'Failure') + ':' + e.totalResultCount + ':' + n; + if (t) { + s.prop49 = t, s.prop49 = s.prop49.toLowerCase(), 0 == s.prop49.indexOf('+') && (s.prop49 = s.prop49.replace('+', ' ')), s.prop49 = s.repl(s.prop49, '+', ' '), s.prop49 = s.repl(s.prop49, ' ', ' +').replace(/^\s+/, ''), 0 < e.totalResultCount ? (s.prop1 = s.eVar1 = s.prop49, s.events = s.apl(s.events, 'event118', ',', 2)) : (s.prop1 = s.eVar1 = '0:' + s.prop49, s.events = s.apl(s.events, 'event119', ',', 2)), void 0 !== r && '' !== r && (s.prop49 = r + ':' + s.prop49); + var a = ''; + if ('undefined' != typeof FDX.DATALAYER.search.result.banner && '' != FDX.DATALAYER.search.result.banner && FDX.DATALAYER.search.result.banner) { + var o = document.getElementsByClassName('cq-searchpromote-banners')[0].getElementsByTagName('div'); + for (i = 0; i < o.length; i++) { + var c = o[i]; + if ('fxg-image-component__image' == c.className && ('undefined' != typeof c.children[0].attributes['data-analytics'] && (a += '$' + c.children[0].attributes['data-analytics'].value), 0 <= a.indexOf('SPB|Results Not Found Image'))) { + a = 'SPB|Results Not Found Image'; + break; + } + } + '' !== a && a && (a = a.replace('$', ''), s.prop49 = s.prop49 + ':' + a); + } + s.eVar49 = 'D=c49'; + } + } + function $___var_3e31cbb76ddcac60(e, t, n, i) { + fdx_logLinkView(e, t, n, i); + } + function $___var_bbdf365d789959b7(e, t) { + void 0 === t && (t = ''), -1 < s.events.indexOf('event904') && (s.linkTrackEvents = s.events = s.events = s.rfl(s.events, 'event904')); + var n = [ + 'trk-landingPage1TrackingNumbersPresent', + 'trk-landingPage-TrackBtn', + 'trk-trackByReference-TrackBtn', + 'trk-trackByTCN-TrackBtn', + 'trk-landingPage-track-helpLink', + 'trk-landingPage-mulitipleTrackingNumberLink', + 'trk-landingPage-singleTrackingNumberLink', + 'trk-trackByReference-DestinationCountry', + 'trk-landingPage-promptToLoginforBOL', + 'trk-OPOD-cancel', + 'trk-OPOD-PrintLetter-Submit', + 'trk-OPOD-EmailLetter-Submit', + 'trk-OPOD-Fax-Submit', + 'trk-landingpage-bolDownloadButton', + 'trk-landingPage-track-helpLink' + ]; + if (1 == !!(_satellite.getVar('click:blockFlag')(e, 'click:blockList') || -1 < e.indexOf('vaPopinAsk'))) + return -1 < n.indexOf(e.trim()) && fdx_setLinkView(e), !0; + if (null != e) { + -1 < (e = fdx_linkFormat(e)).indexOf('trk-') && (e = fdx_trackMapping(e)); + var i = new Date(), r = (i.getMonth(), i.getDate(), i.getFullYear(), i.getHours(), i.getMinutes()); + r < 10 && (r = '0' + r); + var a = i.getSeconds(); + a < 10 && (a = '0' + a); + s.linkTrackVars = 'prop2,prop3,prop4,prop5,prop6,prop18,prop19,prop20,prop31,prop33,prop35,prop41,prop48,prop52,prop54,prop55,prop56,prop70,prop71,eVar4,eVar6,eVar11,eVar13,eVar43,eVar50,eVar52,eVar56,eVar53,events', s.eVar4 = _satellite.getVar('login:status'), 'hdr|Login' == e && (t += 'event3'), 'hdr|SIGN OUT' == e && (t += 'event10', s.eVar4 = 'Logged Out'), t && (s.linkTrackEvents = t, s.events = t), s.prop4 = 'D=v4', s.prop5 = _satellite.getVar('content:region'), s.prop6 = 'D=v6', s.prop18 = s.pageName, s.prop19 = e, s.prop20 = s.pageName + ':' + e, s.prop31 = '' !== s.visitor.getAnalyticsVisitorID() ? '[CS]v1|' + s.visitor.getAnalyticsVisitorID() + '[CE]' : s.visitor.getMarketingCloudVisitorID(), s.prop33 = _satellite.getVar('content:page type'), s.prop41 = 'D=v41', s.prop43 = 'D=v43'; + var o = new Date(), c = o.getMonth() + 1, l = o.getDate(), u = o.getFullYear(); + return s.prop52 = s.eVar52 = u + '-' + c + '-' + l, s.prop54 = 'D=v54', s.prop55 = 'D=v55', s.eVar6 = _satellite.getVar('login:user-id'), s.eVar43 = 'L:' + e, s.eVar56 = s.prop56 = e, s.eVar53 = '+1', nltrk = 'y', fdx_fireSDotTL(this, 'o', e), !0; + } + } + function $___var_317cc34c4c6190d2(e) { + fdx_setLinkView(e); + } + function $___var_09ad9b275d610c1b(e) { + -1 < (e = fdx_linkFormat(e)).indexOf('trk-') && (e = fdx_trackMapping(e)); + var t = s.pageName + '^^' + e + '^^' + s.pageName + ' | ' + e + '^^'; + return s.c_w('setLink', t, 0), !0; + } + function $___var_708f39af21cb33b7() { + try { + var e = s.c_r('setLink'); + if (void 0 !== e && '' != e) { + var t = e.split('^^'); + s.prop18 = t[0], s.prop19 = t[1], s.prop20 = t[2], s.c_w('SC_LINKS', ''); + } + } catch (n) { + fdx_debug(n, 'SC', 'fdx_getLinkView'); + } + } + function $___var_d9daf397848e68a7(e) { + for (var t = e.split('|'), n = '', i = 0; i < t.length; i++) + '' != n && (n += '|'), n += t[i].trim(); + return n; + } + function $___var_299c55932ad0a9de(e) { + var t = _satellite.getVar('track:btnMapping'); + return 'undefined' == typeof t[e] ? e : t[e]; + } + function $___var_b98d4fcd2e1f4acc(e, t) { + s.linkTrackVars = 'eVar6,eVar110,eVar43,prop37,prop70,prop71,events'; + try { + if (void 0 !== e) { + if (s.prop37 = e.toString(), 'single' == t.toLowerCase()) + s.events = s.apl(s.events, 'event12', ',', 2), s.linkTrackEvents = 'event12'; + else if ('multiple' == t.toLowerCase()) { + var n = 0; + 'failed' != e.toString().toLowerCase() && (n = e.length), s.events = s.apl(s.events, 'event181=' + n, ',', 2), s.linkTrackEvents = 'event181'; + } + return fdx_fireSDotTL(this, 'd'), !0; + } + } catch (i) { + fdx_debug(i, 'SC', 'fdx_logDownload'); + } + } + function $___var_9da55740d3cd3d0d(e, t, n, i, r, a) { + fdx_logPageView(e, t, n, i, r, a); + } + function $___var_1bfbbaa58509fa95(e, t, n, i, r) { + try { + var a = ''; + wwwHost.match(/www(sbox.idev|base.idev|dev.idev|drt.idev|stress.dmz.idev|bit.idev|test|).fedex.com/gi) && (a = 'fedex/'), a != e.slice(0, a.length) && (e = a + e), s.pageName = e, fdx_getLinkView(), t ? (s.linkTrackEvents = t, s.events = t) : (s.linkTrackEvents = '', s.events = ''); + var o = _satellite.getVar('search:spData'); + void 0 !== o && '' != o && fdx_spSrch(o), n && (s.prop4 = n), i && (s.prop74 = i); + var c = new Date(), l = (c.getMonth(), c.getDate(), c.getFullYear(), c.getHours(), c.getMinutes()); + l < 10 && (l = '0' + l); + var u = c.getSeconds(); + u < 10 && (u = '0' + u); + s.eVar43 = 'V:' + s.pageName, s.prop43 = 'D=v43'; + var d = new Date(), p = d.getMonth() + 1, f = d.getDate(), g = d.getFullYear(); + s.prop52 = s.eVar52 = g + '-' + p + '-' + f, r ? (s.delayV = !0, setTimeout(function () { + try { + fdx_fireSDotT(); + } catch (e) { + console.log('error:' + e); + } + }, 2000)) : fdx_fireSDotT(); + } catch (v) { + console.log('error:' + v); + } + } + function $___var_59931a2e1ee9b507(e, t) { + void 0 !== e && fdx_logPurchase(e, t); + } + function $___var_a88dca13581b76c9(e, t) { + try { + var n = s.events = ''; + return 'undefined' != typeof e.LogPurchaseRequest && null !== e.LogPurchaseRequest && (e.LogPurchaseRequest.clientId && (e.LogPurchaseRequest.clientId = e.LogPurchaseRequest.clientId.toUpperCase()), 'MAGS' == e.LogPurchaseRequest.clientId && (fdx_logPurchaseMAGS(e.LogPurchaseRequest, t), n = 'MAGSShipBtn'), 'MAGR' == e.LogPurchaseRequest.clientId && (fdx_logPurchaseMAGR(e.LogPurchaseRequest, t), n = 'MAGRRateBtn')), null != e && 'MAGS' == e.clientId && 'undefined' !== e.pageName && null !== e.pageName && '' !== e.pageName && (fdx_logPurchase_PageLevel(e, t), n = e.pageName), 'undefined' != typeof e.appId && null !== e.appId && 'WREG' == e.appId && (fdx_logPurchaseWREG(e, t), n = 'WREGRegisterBtn'), '' !== s.events && (nltrk = 'y', s.eVar40 = 'D=events', s.prop40 = 'D=events', s.prop43 = 'D=v43', s.prop18 = _satellite.getVar('content:page name'), s.prop19 = n, s.prop20 = s.pageName + ':' + n, s.linkTrackVars = s.apl(s.linkTrackVars, 'prop6,eVar6,prop18,prop19,prop20,prop31,eVar38,prop40,eVar40,prop43,eVar43,prop46,eVar46,eVar73,eVar75,prop74,eVar112,eVar113,eVar114,eVar115,eVar116,eVar117,eVar118,eVar119,eVar120,eVar121,eVar136,eVar138,eVar139,eVar142,eVar143,eVar145,products,purchaseID,events', ',', 2), s.linkTrackEvents = s.events, fdx_fireSDotTL(this, 'o', n), s.products = '', s.purchaseID = '', s.events = '', s.eVar73 = '', s.eVar75 = '', s.prop74 = '', !(s.eVar43 = '')); + } catch (i) { + return fdx_debug(i, 'SC', 'fdx_logPurchase'), !1; + } + } + function $___var_85ce99bb18290254(e, t) { + try { + var n = '', i = e.clientId + ':INT_' + e.INT; + if ('undefined' != typeof e.clientId && '' !== e.clientId) { + if ('undefined' != typeof e.shipData && null !== e.shipData) + for (var r in e.shipData) { + i += ':' + r + '_' + e.shipData[r]; + } + n = 'Y' == e.INT ? 'event68' : 'event67', s.events = 'purchase,' + n, s.linkTrackEvents = s.events, s.eVar143 = i, s.products = ';MAGS;;;' + n + ';eVar143=' + s.eVar143, s.eVar43 = 'S:MAGS'; + try { + null != t && 'function' == typeof t && t(e); + } catch (a) { + fdx_debug(a, 'SC', 'fdx_logPurchaseMAGS:callback'); + } + } + } catch (a) { + fdx_debug(a, 'SC', 'fdx_logPurchaseMAGS'); + } + } + function $___var_b4c74d1df2a59429(e) { + return e !== undefined && null !== e && e.constructor == Object; + } + function $___var_91f1f803d91688f8(e, t) { + try { + var n = ''; + if (s.linkTrackVars = s.apl(s.linkTrackVars, MAGSEvarMapping[e.pageName][0], ',', 2), isObject(e)) + for (var i in ('undefined' != typeof e.SRC && '' != e.SRC && (s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar166', ',', 2), s.eVar166 = e.SRC), e)) { + var r = e[i]; + if (isObject(r)) { + for (var i in r) + n += i + '_' + r[i] + ':'; + n = n.substring(0, n.length - 1) + ':'; + } + } + var a = n.substring(0, n.length - 1); + s.events = 'ScAdd,' + [MAGSEvarMapping[e.pageName][1]], s.linkTrackEvents = s.events, s[[MAGSEvarMapping[e.pageName][0]]] = a, s.products = ';MAGS;;;;' + MAGSEvarMapping[e.pageName][0] + '=' + s[MAGSEvarMapping[e.pageName][0]], s.eVar43 = 'S:' + e.pageName; + try { + null != t && 'function' == typeof t && t(obj); + } catch (o) { + fdx_debug(o, 'SC', 'fdx_logPurchase_PageLevel:callback'); + } + } catch (o) { + fdx_debug(o, 'SC', 'fdx_logPurchase_PageLevel'); + } + } + function $___var_b5e3cf34acf13f3c(e, t) { + try { + var n = e.clientId + ':INT_' + e.INT, i = e.clientId; + if (void 0 !== e && '' !== e) { + if ('undefined' != typeof e.shipData && null !== e.shipData) + for (var r in e.shipData) { + n += ':' + r + '_' + e.shipData[r]; + } + if ('undefined' != typeof e.comData && null !== e.comData) + for (var r in e.comData) { + i += ':' + r + '_' + e.comData[r]; + } + s.events = 'scAdd,event110', s.linkTrackEvents = s.events, s.eVar136 = n, s.eVar142 = i, s.products = ';MAGR;;;;eVar136=' + s.eVar136 + '|eVar142=' + s.eVar142, s.eVar43 = 'S:RateMAGR'; + try { + null != t && 'function' == typeof t && t(e); + } catch (a) { + fdx_debug(a, 'SC', 'fdx_logPurchaseMAGR:callback'); + } + } + } catch (a) { + fdx_debug(a, 'SC', 'fdx_logPurchaseMAGR'); + } + } + function $___var_992870d603806817(e, t) { + try { + var n = '', i = ''; + null != e && ('undefined' != typeof e.profile && (n = processData(e.profile)), 'undefined' != typeof e.addtData && (i = processData(e.addtData)), s.eVar145 = n + '|' + i), s.events = 'scAdd', s.linkTrackEvents = s.events, s.products = ';' + e.appId + ';;;;eVar145=' + s.eVar145, s.eVar43 = 'S:' + e.appId; + try { + null != t && 'function' == typeof t && t(e); + } catch (r) { + fdx_debug(r, 'SC', 'fdx_logPurchaseWREG:callback'); + } + } catch (r) { + fdx_debug(r, 'SC', 'fdx_logPurchaseWREG'); + } + } + function $___var_643c99472783f4a2(e) { + var t = ''; + if (null != e) { + for (var n in e) + t += ':' + n + '_' + e[n]; + t = t.replace(':', ''); + } + return t; + } + function $___var_29acb6ddea69c410(e) { + try { + var t = []; + if ('object' == typeof e && e.join == undefined) + for (prop in e) + prop && '' != prop && e[prop] && '' != e[prop] && t.push(prop, ':', fdx_convertToStr(e[prop]), ','); + else if ('object' == typeof e && e.join != undefined) + for (prop in e) + prop && '' != prop && e[prop] && '' != e[prop] && t.push(fdx_convertToStr(e[prop]), ','); + else + 'function' != typeof e && '' != e.toString() && t.push(e.toString()); + return t.join(''); + } catch (n) { + fdx_debug(n, 'SC', 'fdx_convertToStr'); + } + } + function $___var_8ce62da133895ce9(e, t) { + try { + if (t) + if (s.linkTrackVars = 'prop6,eVar6,prop31,eVar43,prop52,eVar52,prop56,eVar56,eVar53,prop18,prop19,prop20,prop41,events', l = 'undefined' != typeof e.status && e.status ? e.status : '') { + var n = { + vaPopinAsk: 'event112', + transtoLA: 'event114' + }, i = ''; + for (var r in (a = n[l], s.prop18 = s.pageName, s.prop19 = l, s.prop20 = s.pageName + ':' + l, e)) + e[r] && (i += ':' + e[r]); + s.eVar14 = t + ':' + s.pageName + i, s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar14', ',', 2), s.linkTrackEvents = s.events = a, nltrk = 'y', fdx_fireSDotTL(this, 'o', t); + } + if ('undefined' != typeof e.chatRequest && null !== e.chatRequest) { + var a = '', o = (t = '', ''); + for (var r in (s.linkTrackVars = 'prop6,eVar6,prop31,eVar43,prop52,eVar52,prop56,eVar56,eVar53,prop18,prop19,prop20,prop41,events', e.chatRequest[0].chatData)) { + var c = '' + e.chatRequest[0].chatData[r]; + o += '|' + (r = r.replace('|', '-')) + '_' + (c = c.replace('|', '-')); + } + if ('CHAT' == e.chatRequest[0].clientId) + t = 'liveagent_CHAT', a = 'event45', s.prop59 = s.eVar59 = o.replace('|', ''), s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar59,prop59', ',', 2); + else if ('NINA' == e.chatRequest[0].clientId) + try { + t = 'va_NINA'; + var l = e.chatRequest[0].chatData.status; + a = (n = { + vaPopinOpen: 'event112', + vaPopinClose: 'event113', + transtoLA: 'event114' + })[l], s.eVar14 = o.replace('|', '').replace('vaPopinOpen', 'vaPopin').replace('vaPopinClose', 'vaPopin'), s.linkTrackVars = s.apl(s.linkTrackVars, 'eVar14', ',', 2); + } catch (u) { + fdx_debug(u, 'SC', 'fdx_logChat:NINA'); + } + s.linkTrackEvents = s.events = a, nltrk = 'y', fdx_fireSDotTL(this, 'o', t); + } + } catch (u) { + fdx_debug(u, 'SC', 'fdx_logChat'); + } + } + function $___var_2a8ff80ee0f3ce54(e) { + const $___old_ba23b4b25d7f6ba0 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'), $___old_25652908ba9a61cc = {}.constructor.getOwnPropertyDescriptor(window, 'sessionStorage'); + try { + if ($___old_ba23b4b25d7f6ba0) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_c7caec501dca2387.localStorage)); + if ($___old_25652908ba9a61cc) + ({}.constructor.defineProperty(window, 'sessionStorage', $___mock_c7caec501dca2387.sessionStorage)); + return function () { + window.fdx_controllerVersion, 'undefined' == typeof e.pageName && '' == e.pageName && (_satellite.getVar('content:page name'), 1) && _satellite.getVar('content:page name') && (e.pageName = _satellite.getVar('content:page name')), e.pageName = e.pageName.toLowerCase(), e.eVar38 = 'D=pageName', e.eVar50 = [ + location.host, + location.pathname + ].join(''), e.prop46 = e.eVar46 = 'D=pageName'; + var t = new Date().getFullYear(), n = e.getTimeParting('h', '-6', t), i = e.getTimeParting('d', '-6', t); + e.eVar7 = e.prop7 = n + '|' + i; + var r = new Date(), a = r.getMonth() + 1, s = r.getDate(), o = r.getFullYear(); + e.prop52 = e.eVar52 = o + '-' + a + '-' + s; + var c = e.getPreviousValue(e.pageName, 'gpv_pageName'); + c && (e.prop12 = c, e.eVar2 = 'D=c12'), e.prop35 = 'D=Accept-Language', e.eVar53 = '+1', e.eVar40 = 'D=events'; + try { + var l = e.getPercentPageViewed(e.pageName); + void 0 !== l && 'object' == typeof l && 4 === l.length && 'undefined' != typeof l[2] && (e.prop60 = l[2] + ':' + l[1]); + } catch (g) { + fdx_debug(g, 'SC', 's_doPlugins:ppvArray'); + } + if ('d' == e.linkType && 'undefined' != typeof e.linkObject.dataset.alt && (e.linkType = ''), 'd' == e.linkType && 'undefined' != typeof e.linkObject && 0 !== e.linkObject && void 0 !== e.linkObject.getAttribute('href') && (e.url = e.linkObject.getAttribute('href'), e.prop37 = e.eVar37 = e.url.substring(e.url.lastIndexOf('/') + 1, e.url.length), e.eVar43 = 'D:' + e.prop37, e.events = e.apl(e.events, 'event12', ',', 2), e.linkTrackEvents = 'event12', e.linkTrackVars = 'prop18,prop19,prop20,eVar37,eVar43,events'), 'y' != nltrk && (e.eVar6 = _satellite.getVar('login:user-id'), e.prop6 = 'D=v6', e.linkTrackVars = e.apl(e.linkTrackVars, 'prop2,prop3,prop4,prop5,prop6,prop18,prop19,prop20,prop31,prop33,prop35,prop48,prop50,eVar4,eVar6,eVar13,eVar50', ',', 2), e.setupLinkTrack('prop18,prop19,prop20', 'SC_LINKS'), 'undefined' != typeof e.prop19 && '' !== e.prop19 && (-1 < e.prop19.indexOf('sprite-placeholder.png') && (e.prop19 = 'hdr|Search'), e.prop20 = e.prop18 + ' | ' + e.prop19)), e.eVar45 || (e.eVar45 = e.Util.getQueryParam('INTCMP'), e.eVar45 = e.getValOnce(e.eVar45, 's_intcampaign', 0), e.clickPast(e.eVar45, 'event82', 'event83', 's_cp-bag')), e.eVar45 && (e.list1 = e.eVar45, e.events = e.apl(e.events, 'event44', ',', 2)), !e.campaign) { + e.campaign = e.Util.getQueryParam('CMP'); + var u = e.Util.getQueryParam('LINK'); + e.campaign && u && (e.eVar58 = u), '' == e.campaign && (e.campaign = fdx_campaign()), e.campaign = e.getValOnce(e.campaign, 's_campaign', 0); + } + e.clickPast(e.campaign, 'event23', 'event24'); + var d = e.getAamSegments('aam_sc', 'aamsc').replace(/\|/g, ','); + e.list2 = e.apl(e.list2, d, ',', 2), e.prop48 = s_version + '_' + sc_code_ver + '_' + sc_code_ver_date, e.prop50 = s_account; + var p = _fdx.getTestLevel(); + p && (e.prop50 += '_Launch_' + p), e.eVar41 = e.getVisitNum('d'), e.prop31 = '' !== e.visitor.getAnalyticsVisitorID() ? '[CS]v1|' + e.visitor.getAnalyticsVisitorID() + '[CE]' : e.visitor.getMarketingCloudVisitorID(), nltrk = '', 'undefined' != typeof prp72 && '' != prp72 && (e.prop72 = prp72); + var f = ''; + (f = _satellite.cookie.get('Rbt')) != undefined && '' != f && 'f1' === f && (e.abort = !0); + }.apply(this, arguments); + } finally { + if ($___old_ba23b4b25d7f6ba0) + ({}.constructor.defineProperty(window, 'localStorage', $___old_ba23b4b25d7f6ba0)); + if ($___old_25652908ba9a61cc) + ({}.constructor.defineProperty(window, 'sessionStorage', $___old_25652908ba9a61cc)); + } + } + function $___var_747f7ac24cff9e59() { + function e(e) { + var t, n, i, r = this, a = (new Date(), r.c_rr(e)), s = r.c_rspers(); + return a || (e = r.Util.urlDecode(e), n = (t = (s = (t = s.indexOf(' ' + e + '=')) < 0 ? r.c_rr('s_sess') : s).indexOf(' ' + e + '=')) < 0 ? t : s.indexOf('|', t), i = t < 0 ? t : s.indexOf(';', t), n = 0 < n ? n : i, a = t < 0 ? '' : r.Util.urlDecode(s.substring(t + 2 + e.length, n < 0 ? s.length : n))); + } + function t() { + var e = s.c_rr('s_pers'), t = new Date().getTime(), n = null, i = [], r = ''; + if (!e) + return r; + for (var a = 0, o = (i = e.split(';')).length; a < o; a++) + (n = i[a].match(/\|([0-9]+)$/)) && parseInt(n[1]) >= t && (r += i[a] + ';'); + return r; + } + function n(e, t, n) { + var i, r, a, s, o = this, c = new Date(), l = 0, u = 's_pers', d = 's_sess', p = 0, f = 0; + if (c.setTime(c.getTime() - 60000), o.c_rr(e) && o.c_wr(e, '', c), e = o.Util.urlEncode(e), -1 < (a = (i = o.c_rspers()).indexOf(' ' + e + '=')) && (i = i.substring(0, a) + i.substring(i.indexOf(';', a) + 1), p = 1), -1 < (a = (r = o.c_rr(d)).indexOf(' ' + e + '=')) && (r = r.substring(0, a) + r.substring(r.indexOf(';', a) + 1), f = 1), c = new Date(), n ? n.getTime() > c.getTime() && (i += ' ' + e + '=' + o.Util.urlEncode(t) + '|' + n.getTime() + ';', p = 1) : (r += ' ' + e + '=' + o.Util.urlEncode(t) + ';', f = 1), r = r.replace(/%00/g, ''), i = i.replace(/%00/g, ''), f && o.c_wr(d, r, 0), p) { + for (s = i; s && -1 != s.indexOf(';');) { + var g = parseInt(s.substring(s.indexOf('|') + 1, s.indexOf(';'))); + s = s.substring(s.indexOf(';') + 1), l = l < g ? g : l; + } + c.setTime(l), o.c_wr(u, i, c); + } + return t == o.c_r(o.Util.urlEncode(e)); + } + s.doPlugins = s_doPlugins, s.p_checkInterval = new Array(), s.p_cbct = 0, s.t_cb = function (e, t) { + var n = this; + if (!e) + e = 4000; + t || (t = 's_p_callBackCode'), interval = 100, n.p_cbwait = 0; + var i = 1; + 'undefined' != typeof n.rc && (i = n.rc[n.visitorNamespace]), i > n.p_cbct && (n.p_cbct++, n.p_checkInterval[i] = setInterval('s.p_callBack(' + e + ', ' + i + ', \'' + t + '\')', interval)); + }, s.p_callBack = function (e, t) { + var n = this; + 'undefined' == typeof n.visitorNamespace && (n.visitorNamespace = s_account); + var i = ''; + 1 < t && (i = '_' + (t - 1)); + var r = 's_i_' + n.visitorNamespace + i; + return 'undefined' != typeof window[r] && 0 < window[r].height ? (clearInterval(n.p_checkInterval[t]), !0) : (n.p_cbwait += interval, n.p_cbwait > e && (clearInterval(n.p_checkInterval[t]), 'undefined' != typeof window[r] && (window[r].src = 'https://www.fedex.com/images/ascend/shared/headers/corp_logo.gif?sc_response_failure')), !1); + }, s.lookuplookup = function (e) { + var t, n, r, a, s, o, c, l, u = this, d = 0, p = e ? e.length : 0, f = new Array(), g = new Array(); + for (i = 0; i < p; i++) + -1 < (t = e.indexOf('|', i)) && (f[d] = e.substring(i, t), d++, i = t); + for (i = 0; i < d; i++) { + for (n = 0, a = f[i] ? f[i].length : 0, j = 0; j < a; j++) + if (-1 < (r = f[i].indexOf('~', j))) + g[n] = f[i].substring(j, r), n++, j = r; + else { + if (-1 == r && n < 3 || 3 < n) + break; + if (-1 == r && 3 == n) { + g[n] = f[i].substring(j); + break; + } + } + if (-1 == r && 3 == n) { + if (o = g[0], s = g[1], c = g[2], l = g[3], o && 'c' == c && -1 < u.pageName.indexOf(o)) { + u.events = u.apl(u.events, l, ',', 2); + break; + } + if (o && 'e' == c && u.pageName == o) { + u.events = u.apl(u.events, l, ',', 2); + break; + } + if (s && 'c' == c && -1 < document.URL.indexOf(s)) { + u.events = u.apl(u.events, l, ',', 2); + break; + } + if (s && 'e' == c && document.URL == s) { + u.events = u.apl(u.events, l, ',', 2); + break; + } + } + } + }, s.fae = function (e) { + try { + var t, n; + if (void 0 !== e) { + if (!e.activeElement || !e.activeElement.type) + return; + n = (t = e.activeElement).type; + } else { + if (!document.activeElement || !document.activeElement.type) + return; + n = (t = document.activeElement).type; + } + if ('text' == n || 'textarea' == n || 'checkbox' == n || 'radio' == n || 'select-one' == n || 'button' == n) { + var i = t.id; + if ('' == (i = '' === i ? t.name : i) && t.outerHTML && '' !== t.outerHTML && (i = t.outerHTML.substring(0, 85)), '' === i) { + var r = fdx_getCookie('s_lff'); + i = (i = void 0 !== r ? r : '[PN:' + s.pageName + ']').replace(s.formName + '|', ''); + } + fdx_setCookie('s_lff', s.formName + '|' + i, 30, '/', '.fedex.com'); + } + } catch (a) { + fdx_debug(a, 'SC', 's.fae'); + } + }, s.partnerDFACheck = new Function('cfg', 'var s=this,c=cfg.visitCookie,src=cfg.clickThroughParam,scp=cfg.searchCenterParam,p=cfg.newRsidsProp,tv=cfg.tEvar,dl=\',\',cr,nc,q,g,gs,i,j,k,fnd,v=1,t=new Date,cn=0,ca=new Array,aa=new Array,cs=new Array;t.setTime(t.getTime()+1800000);cr=s.c_r(c);if(cr){v=0;}ca=s.split(cr,dl);if(s.un)aa=s.split(s.un,dl);else aa=s.split(s.account,dl);for(i=0;i-1){s.vpr(p,cr);v=1;}else if(gs>-1){v=0;s.vpr(tv,\'SearchCenter Visitors\');}if(!s.c_w(c,cr,t)){s.c_w(c,cr,0);}if(!s.c_r(c)){v=0;}return v>=1;'), s.vpr = new Function('vs', 'v', 'if(typeof(v)!=\'undefined\' && vs){var s=this; eval(\'s.\'+vs+\'="\'+v+\'"\')}'), s.getActionDepth = new Function('c', 'var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(!s.c_r(c)){v=1}if(s.c_r(c)){v=s.c_r(c);v++}if(!s.c_w(c,v,t)){s.c_w(c,v,0)}return v;'), s.getVisitNum = new Function('tp', 'c', 'c2', 'var s=this,e=new Date,cval,cvisit,ct=e.getTime(),d;if(!tp){tp=\'m\';}if(tp==\'m\'||tp==\'w\'||tp==\'d\'){eo=s.endof(tp),y=eo.getTime();e.setTime(y);}else {d=tp*86400000;e.setTime(ct+d);}if(!c){c=\'s_vnum\';}if(!c2){c2=\'s_invisit\';}cval=s.c_r(c);if(cval){var i=cval.indexOf(\'&vn=\'),str=cval.substring(i+4,cval.length),k;}cvisit=s.c_r(c2);if(cvisit){if(str){e.setTime(ct+1800000);s.c_w(c2,\'true\',e);return str;}else {return \'unknown visit number\';}}else {if(str){str++;k=cval.substring(0,i);e.setTime(k);s.c_w(c,k+\'&vn=\'+str,e);e.setTime(ct+1800000);s.c_w(c2,\'true\',e);return str;}else {s.c_w(c,e.getTime()+\'&vn=1\',e);e.setTime(ct+1800000);s.c_w(c2,\'true\',e);return 1;}}'), s.dimo = new Function('m', 'y', 'var d=new Date(y,m+1,0);return d.getDate();'), s.endof = new Function('x', 'var t=new Date;t.setHours(0);t.setMinutes(0);t.setSeconds(0);if(x==\'m\'){d=s.dimo(t.getMonth(),t.getFullYear())-t.getDate()+1;}else if(x==\'w\'){d=7-t.getDay();}else {d=1;}t.setDate(t.getDate()+d);return t;'), s.getVisitStart = new Function('c', 'var s=this,v=1,t=new Date;t.setTime(t.getTime()+1800000);if(s.c_r(c)){v=0}if(!s.c_w(c,1,t)){s.c_w(c,1,0)}if(!s.c_r(c)){v=0}return v;'), s.crossVisitParticipation = new Function('v', 'cn', 'ex', 'ct', 'dl', 'ev', 'dv', 'var s=this,ce;if(typeof(dv)===\'undefined\')dv=0;if(s.events&&ev){var ay=s.split(ev,\',\');var ea=s.split(s.events,\',\');for(var u=0;u0&&arry[arry.length-1][0]==v)arry[arry.length-1]=[v,new Date().getTime()];else arry[arry.length]=[v,new Date().getTime()];var start=arry.length-ct<0?0:arry.length-ct;var td=new Date();for(var x=start;x-1){q=u.substring(i+1);v=s.pt(q,\'&\',\'p_gvfne\',k)}return v'), s.p_gvfne = new Function('t', 'k', 'if(t){var s=this,i=t.indexOf(\'=\'),p=i<0?t:t.substring(0,i),v=i<0?\'True\':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return v;}return \'\''), s.pt = new Function('x', 'd', 'f', 'a', 'var s=this,t=x,z=0,y,r;while(t){y=t.indexOf(d);y=y<0?t.length:y;t=t.substring(0,y);r=s[f](t,a);if(r)return r;z+=y+d.length;t=x.substring(z,x.length);t=zspr&&cd30){mint=\'30\'}if(thish>=12){ap=\'PM\';thish=thish-12};if (thish==0){thish=12};if(thisd==6||thisd==0){dt=\'Weekend\'};var timestring=thish+\':\'+mint+ap;var daystring=dow;var endstring=dt;if(t==\'h\'){return timestring}if(t==\'d\'){return daystring};if(t==\'w\'){return endstring}}};'), s.setupLinkTrack = new Function('vl', 'c', 'e', 'var s=this;var cv=s.c_r(c);if(vl){var vla=vl.split(\',\');}if(cv!=\'\'){var cva=s.split(cv,\'^^\');if(cva[1]!=\'\'){for(x in vla){s[vla[x]]=cva[x];if(e){s.events=s.apl(s.events,e,\',\',2);}}}}s.c_w(c,\'\',0);if(typeof s.linkObject!=\'undefined\'&&s.hbx_lt!=\'manual\'){s.lta=[];if(typeof s.linkObject!=null){slo=s.linkObject;if(s.linkObject!=0){if(s.linkObject.getAttribute(\'name\')!=null){var b=s.linkObject.getAttribute(\'name\');if(b.indexOf(\'&lpos=\')>-1){s.lta[3]=b.match(\'&lpos=([^&]*)\')[1];}if(b.indexOf(\'&lid=\')>-1){s.lta[1]=b.match(\'&lid=([^&]*)\')[1];}}}if(typeof s.lta[1]==\'undefined\'){if(s.linkName!=0){s.lta[1]=s.linkName;}else if(s.linkObject!=0){if(s.linkObject.innerHTML.indexOf(\'-1){s.lta[1]=s.linkObject.innerHTML.match(\'src="([^"]*)\')[1];}else{s.lta[1]=s.linkObject.innerHTML;}}else if(s.linkURL){s.lta[1]=s.linkURL;}else{s.lta[1]=null;}}if(s.lta[1]!=null){if(typeof s.pageName!=\'undefined\')s.lta[0]=s.pageName;s.lta[2]=s.pageName+\' | \'+s.lta[1];}}if(s.linkType!=0){for(var x=0;x]+(>|$)/g, '')).replace(/^\s+|\s+$/g, ''); + }, s.split = new Function('l', 'd', 'var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x++]=l.substring(0,i);l=l.substring(i+d.length);}return a'), s.apl = new Function('L', 'v', 'd', 'u', 'var s=this,m=0;if(!L)L=\'\';if(u){var i,n,a=s.split(L,d);for(i=0;i\');if(g.indexOf(D[0])!=-1){s.contextData[\'a.socialcontentprovider\']=D[1];}}'), s.socPlatList = 'facebook.com>Facebook|twitter.com>Twitter|t.co/>Twitter|youtube.com>Youtube|clipmarks.com>Clipmarks|dailymotion.com>Dailymotion|delicious.com>Delicious|digg.com>Digg|diigo.com>Diigo|flickr.com>Flickr|flixster.com>Flixster|fotolog.com>Fotolog|friendfeed.com>FriendFeed|google.com/buzz>Google Buzz|buzz.googleapis.com>Google Buzz|plus.google.com>Google+|hulu.com>Hulu|identi.ca>identi.ca|ilike.com>iLike|intensedebate.com>IntenseDebate|myspace.com>MySpace|newsgator.com>Newsgator|photobucket.com>Photobucket|plurk.com>Plurk|slideshare.net>SlideShare|smugmug.com>SmugMug|stumbleupon.com>StumbleUpon|tumblr.com>Tumblr|vimeo.com>Vimeo|wordpress.com>WordPress|xanga.com>Xanga|metacafe.com>Metacafe|pinterest.com>Pinterest', s.socialAuthors = new Function('', 'var s=this,g;g=s.referrer?s.referrer:document.referrer;if(g.indexOf(\'http://t.co/\')===0||g.indexOf(\'https://t.co/\')===0||g.indexOf(\'pinterest.com/pin\')!==-1||g.indexOf(\'tumblr.com\')!==-1||g.indexOf(\'youtube.com\')!==-1){s.Integrate.add(\'SocialAuthor\');s.Integrate.SocialAuthor.get(\'http://sa-services.social.omniture.com/author/name?var=[VAR]&callback=s.socialAuthorSearch&rs=\'+encodeURIComponent(s.account)+\'&q=\'+encodeURIComponent(g));s.Integrate.SocialAuthor.delay();s.Integrate.SocialAuthor.setVars=function(s,p){s.contextData[\'a.socialauthor\']=s.user;}}'), s.socialAuthorSearch = new Function('obj', 'var s=this;if(typeof obj===\'undefined\'||typeof obj.author===\'undefined\'){s.user=\'Not Found\';}else{s.user=obj.author;}s.Integrate.SocialAuthor.ready();'), s.__ccucr || (s.c_rr = s.c_r, s.__ccucr = !0, s.c_rspers = t, s.c_r = e), s.__ccucw || (s.c_wr = s.c_w, s.__ccucw = !0, s.c_w = n), s.p_fo = new Function('n', 'var s=this;if(!s.__fo){s.__fo=new Object;}if(!s.__fo[n]){s.__fo[n]=new Object;return 1;}else {return 0;}'), s.repl = new Function('x', 'o', 'n', 'var i=x.indexOf(o),l=n.length;while(x&&i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.indexOf(o,i+l)}return x'), s.clickPast = new Function('scp', 'ct_ev', 'cp_ev', 'cpc', 'var s=this,scp,ct_ev,cp_ev,cpc,ev,tct;if(s.p_fo(ct_ev)==1){if(!cpc){cpc=\'s_cpc\';}ev=s.events?s.events+\',\':\'\';if(scp){s.events=ev+ct_ev;s.c_w(cpc,1,0);}else{if(s.c_r(cpc)>=1){s.events=ev+cp_ev;s.c_w(cpc,0,0);}}}'), s.manageQueryParam = new Function('p', 'w', 'e', 'u', 'var s=this,x,y,i,qs,qp,qv,f,b;u=u?u:(s.pageURL?s.pageURL:\'\'+window.location);x=u.indexOf(\'?\');qs=x>-1?u.substring(x,u.length):\'\';u=x>-1?u.substring(0,x):u;x=qs.indexOf(\'?\'+p+\'=\');if(x>-1){y=qs.indexOf(\'&\');f=\'\';if(y>-1){qp=qs.substring(x+1,y);b=qs.substring(y+1,qs.length);}else{qp=qs.substring(1,qs.length);b=\'\';}}else{x=qs.indexOf(\'&\'+p+\'=\');if(x>-1){f=qs.substring(1,x);b=qs.substring(x+1,qs.length);y=b.indexOf(\'&\');if(y>-1){qp=b.substring(0,y);b=b.substring(y,b.length);}else{qp=b;b=\'\';}}}if(e&&qp){y=qp.indexOf(\'=\');qv=y>-1?qp.substring(y+1,qp.length):\'\';var eui=0;while(qv.indexOf(\'%25\')>-1){qv=unescape(qv);eui++;if(eui==10)break;}qv=s.replace(qv,\'+\',\' \');qv=escape(qv);qv=s.replace(qv,\'%25\',\'%\');qv=s.replace(qv,\'%7C\',\'|\');qv=s.replace(qv,\'%7c\',\'|\');qp=qp.substring(0,y+1)+qv;}if(w&&qp){if(f)qs=\'?\'+qp+\'&\'+f+b;else if(b)qs=\'?\'+qp+\'&\'+b;else qs=\'?\'+qp}else if(f)qs=\'?\'+f+\'&\'+qp+b;else if(b)qs=\'?\'+qp+\'&\'+b;else if(qp)qs=\'?\'+qp;return u+qs;'), s.handlePPVevents = new Function('', 'var W=window,s=W.s_name&&typeof W[s_name]==\'object\'?W[s_name]:0;if(!s||!s.getPPVid)return;var B=document.body,E=document.documentElement,D=window.document;d=Math.max(B.scrollHeight,E.scrollHeight,B.offsetHeight,E.offsetHeight,B.clientHeight,E.clientHeight),v=window.innerHeight||E.clientHeight||B.clientHeight,t=window.pageYOffset||D.documentElement.scrollTop||D.body.scrollTop,h=t+v,p=Math.min(Math.round(h/d*100),100),c=s.c_r(\'s_ppv\'),a=c.indexOf(\',\')>-1?c.split(\',\',4):[],l=a.length,n=l>0?a[0]:escape(s.getPPVid),P=l>1?parseInt(a[1]):0,f=l>2?parseInt(a[2]):p,H=l>3?parseInt(a[3]):0,cn=p>0?n+\',\'+(p>P?p:P)+\',\'+f+\',\'+(h>H?h:H):\'\';s.c_w(\'s_ppv\',cn)'), s.getPercentPageViewed = new Function('n', 'if(typeof this.linkType!=\'undefined\')return\'\';var s=this,w=window,F=false,e=window.addEventListener||window.attachEvent||\'\';i=3,v=s.c_r(\'s_ppv\'),a=v.indexOf(\',\')>-1?v.split(\',\',4):[];if(a.length<4){while(i>0)a[i--]=i p && (p = e); + })) : 0 < r-- && setTimeout(n, 1000); + } + } + function a(e, t) { + var n, i, r; + if (e && t && (n = d.c[t] || (d.c[t] = t.split(',')))) + for (r = 0; r < n.length && (i = n[r++]);) + if (-1 < e.indexOf(i)) + return null; + return e; + } + function s(e, t, n, i, r) { + var a, s; + if (e.dataset && (s = e.dataset[t]) ? a = s : e.getAttribute && ((s = e.getAttribute('data-' + n)) ? a = s : (s = e.getAttribute(n)) && (a = s)), !a && c.useForcedLinkTracking && r) { + var o; + if (e = e.onclick ? '' + e.onclick : '', varValue = '', i && e && 0 <= (t = e.indexOf(i))) { + for (t += i.length; t < e.length;) + if (n = e.charAt(t++), 0 <= '\'"'.indexOf(n)) { + o = n; + break; + } + for (s = !1; t < e.length && o && (n = e.charAt(t), s || n !== o);) + '\\' === n ? s = !0 : (varValue += n, s = !1), t++; + } + (o = varValue) && (c.w[i] = o); + } + return a || r && c.w[i]; + } + function o(e, t, n) { + var i; + return (i = d[t](e, n)) && a(u(i), d[t + 'Exclusions']); + } + function l(e, t, n) { + var i; + if (e && !(1 === (i = e.nodeType) && (i = e.nodeName) && (i = i.toUpperCase()) && f[i]) && (1 === e.nodeType && (i = e.nodeValue) && (t[t.length] = i), n.a || n.t || n.s || !e.getAttribute || ((i = e.getAttribute('alt')) ? n.a = i : (i = e.getAttribute('title')) ? n.t = i : 'IMG' == ('' + e.nodeName).toUpperCase() && (i = e.getAttribute('src') || e.src) && (n.s = i)), (i = e.childNodes) && i.length)) + for (e = 0; e < i.length; e++) + l(i[e], t, n); + } + function u(e) { + if (null == e || null == e) + return e; + try { + return e.replace(RegExp('^[\\s\\n\\f\\r\\t\t-\r \xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u205F\u3000\uFEFF]+', 'mg'), '').replace(RegExp('[\\s\\n\\f\\r\\t\t-\r \xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u205F\u3000\uFEFF]+$', 'mg'), '').replace(RegExp('[\\s\\n\\f\\r\\t\t-\r \xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u205F\u3000\uFEFF]{1,}', 'mg'), ' ').substring(0, 254); + } catch (t) { + } + } + var d = this; + d.s = c; + var t = window; + t.s_c_in || (t.s_c_il = [], t.s_c_in = 0), d._il = t.s_c_il, d._in = t.s_c_in, d._il[d._in] = d, t.s_c_in++, d._c = 's_m'; + var i, p = 0, r = 60; + d.c = {}; + var f = { + SCRIPT: 1, + STYLE: 1, + LINK: 1, + CANVAS: 1 + }; + d._g = function () { + var e, t, n, i = c.contextData, r = c.linkObject; + (e = c.pageName || c.pageURL) && (t = o(r, 'link', c.linkName)) && (n = o(r, 'region')) && (i['a.activitymap.page'] = e.substring(0, 255), i['a.activitymap.link'] = 128 < t.length ? t.substring(0, 128) : t, i['a.activitymap.region'] = 127 < n.length ? n.substring(0, 127) : n, 0 < p && (i['a.activitymap.xy'] = 10 * Math.floor(p / 10)), i['a.activitymap.pageIDType'] = c.pageName ? 1 : 0); + }, d._d = function () { + d.trackScrollReach && !i && (d.scrollReachSelector ? n() : (e(), t.addEventListener && t.addEventListener('scroll', e, !1)), i = !0); + }, d.link = function (e, t) { + var n; + if (t) + n = a(u(t), d.linkExclusions); + else if ((n = e) && !(n = s(e, 'sObjectId', 's-object-id', 's_objectID', 1))) { + var i, r; + (r = a(u(e.innerText || e.textContent), d.linkExclusions)) || (l(e, i = [], n = { + a: void 0, + t: void 0, + s: void 0 + }), (r = a(u(i.join('')))) || (r = a(u(n.a ? n.a : n.t ? n.t : n.s ? n.s : void 0))) || !(i = (i = e.tagName) && i.toUpperCase ? i.toUpperCase() : '') || ('INPUT' == i || 'SUBMIT' == i && e.value ? r = a(u(e.value)) : 'IMAGE' == i && e.src && (r = a(u(e.src))))), n = r; + } + return n; + }, d.region = function (e) { + for (var t, n = d.regionIDAttribute || 'id'; e && (e = e.parentNode);) { + if (t = s(e, n, n, n)) + return t; + if ('BODY' == e.nodeName) + return 'BODY'; + } + }; + } + function $___var_2df800538439b811(d) { + var f = this; + f.version = '2.22.0'; + var p = window; + p.s_c_in || (p.s_c_il = [], p.s_c_in = 0), f._il = p.s_c_il, f._in = p.s_c_in, f._il[f._in] = f, p.s_c_in++, f._c = 's_c'; + var g = p.AppMeasurement.ic; + g || (g = null); + var l, h, m, b = p; + try { + for (l = b.parent, h = b.location; l && l.location && h && '' + l.location != '' + h && b.location && '' + l.location != '' + b.location && l.location.host === h.host;) + l = (b = l).parent; + } catch (e) { + } + f.C = function (e) { + try { + console.log(e); + } catch (t) { + } + }, f.Ra = function (e) { + return '' + parseInt(e) == '' + e; + }, f.replace = function (e, t, n) { + return !e || e.indexOf(t) < 0 ? e : e.split(t).join(n); + }, f.escape = function (e) { + var t, n; + if (!e) + return e; + for (e = encodeURIComponent(e), t = 0; t < 7; t++) + n = '+~!*()\''.substring(t, t + 1), 0 <= e.indexOf(n) && (e = f.replace(e, n, '%' + n.charCodeAt(0).toString(16).toUpperCase())); + return e; + }, f.unescape = function (e) { + if (!e) + return e; + e = 0 <= e.indexOf('+') ? f.replace(e, '+', ' ') : e; + try { + return decodeURIComponent(e); + } catch (t) { + } + return unescape(e); + }, f.Nb = function () { + var e, t = p.location.hostname, n = f.fpCookieDomainPeriods; + if (n || (n = f.cookieDomainPeriods), t && !f.Ka && !/^[0-9.]+$/.test(t) && (n = 2 < (n = n ? parseInt(n) : 2) ? n : 2, 0 <= (e = t.lastIndexOf('.')))) { + for (; 0 <= e && 1 < n;) + e = t.lastIndexOf('.', e - 1), n--; + f.Ka = 0 < e ? t.substring(e) : t; + } + return f.Ka; + }, f.c_r = f.cookieRead = function (e) { + e = f.escape(e); + var t = ' ' + f.d.cookie, n = t.indexOf(' ' + e + '='), i = n < 0 ? n : t.indexOf(';', n); + return '[[B]]' != (e = n < 0 ? '' : f.unescape(t.substring(n + 2 + e.length, i < 0 ? t.length : i))) ? e : ''; + }, f.c_w = f.cookieWrite = function (e, t, n) { + var i, r = f.Nb(), a = f.cookieLifetime; + return t = '' + t, a = a ? ('' + a).toUpperCase() : '', n && 'SESSION' != a && 'NONE' != a && ((i = '' != t ? parseInt(a || 0) : -60) ? (n = new Date()).setTime(n.getTime() + 1000 * i) : 1 === n && (i = (n = new Date()).getYear(), n.setYear(i + 2 + (i < 1900 ? 1900 : 0)))), e && 'NONE' != a ? (f.d.cookie = f.escape(e) + '=' + f.escape('' != t ? t : '[[B]]') + '; path=/;' + (n && 'SESSION' != a ? ' expires=' + n.toUTCString() + ';' : '') + (r ? ' domain=' + r + ';' : '') + (f.writeSecureCookies ? ' secure;' : ''), f.cookieRead(e) == t) : 0; + }, f.Kb = function () { + var e = f.Util.getIeVersion(); + 'number' == typeof e && e < 10 && (f.unsupportedBrowser = !0, f.xb(f, function () { + })); + }, f.ya = function () { + var e = navigator.userAgent; + return 'Microsoft Internet Explorer' === navigator.appName || 0 <= e.indexOf('MSIE ') || 0 <= e.indexOf('Trident/') && 0 <= e.indexOf('Windows NT 6'); + }, f.xb = function (e, t) { + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && 'function' == typeof e[n] && (e[n] = t); + }, f.K = [], f.fa = function (e, t, n) { + if (f.La) + return 0; + f.maxDelay || (f.maxDelay = 250); + var i = 0, r = new Date().getTime() + f.maxDelay, a = f.d.visibilityState, s = [ + 'webkitvisibilitychange', + 'visibilitychange' + ]; + if (a || (a = f.d.webkitVisibilityState), a && 'prerender' == a) { + if (!f.ga) + for (f.ga = 1, n = 0; n < s.length; n++) + f.d.addEventListener(s[n], function () { + var e = f.d.visibilityState; + e || (e = f.d.webkitVisibilityState), 'visible' == e && (f.ga = 0, f.delayReady()); + }); + i = 1, r = 0; + } else + n || f.u('_d') && (i = 1); + return i && (f.K.push({ + m: e, + a: t, + t: r + }), f.ga || setTimeout(f.delayReady, f.maxDelay)), i; + }, f.delayReady = function () { + var e, t = new Date().getTime(), n = 0; + for (f.u('_d') ? n = 1 : f.Aa(); 0 < f.K.length;) { + if (e = f.K.shift(), n && !e.t && e.t > t) { + f.K.unshift(e), setTimeout(f.delayReady, parseInt(f.maxDelay / 2)); + break; + } + f.La = 1, f[e.m].apply(f, e.a), f.La = 0; + } + }, f.setAccount = f.sa = function (e) { + var t, n; + if (!f.fa('setAccount', arguments)) + if (f.account = e, f.allAccounts) + for (t = f.allAccounts.concat(e.split(',')), f.allAccounts = [], t.sort(), n = 0; n < t.length; n++) + 0 != n && t[n - 1] == t[n] || f.allAccounts.push(t[n]); + else + f.allAccounts = e.split(','); + }, f.foreachVar = function (e, t) { + var n, i, r, a, s = ''; + for (r = i = '', f.lightProfileID ? (n = f.O, (s = f.lightTrackVars) && (s = ',' + s + ',' + f.la.join(',') + ',')) : (n = f.g, (f.pe || f.linkType) && (s = f.linkTrackVars, i = f.linkTrackEvents, f.pe && (r = f.pe.substring(0, 1).toUpperCase() + f.pe.substring(1), f[r] && (s = f[r].ec, i = f[r].cc))), s && (s = ',' + s + ',' + f.F.join(',') + ','), i && s && (s += ',events,')), t && (t = ',' + t + ','), i = 0; i < n.length; i++) + r = n[i], (a = f[r]) && (!s || 0 <= s.indexOf(',' + r + ',')) && (!t || 0 <= t.indexOf(',' + r + ',')) && e(r, a); + }, f.o = function (e, t, n, i, r) { + var a, s, o, c, l = '', u = 0; + if ('contextData' == e && (e = 'c'), t) { + for (a in t) + if (!(Object.prototype[a] || r && a.substring(0, r.length) != r) && t[a] && (!n || 0 <= n.indexOf(',' + (i ? i + '.' : '') + a + ','))) { + if (o = !1, u) + for (s = 0; s < u.length; s++) + if (a.substring(0, u[s].length) == u[s]) { + o = !0; + break; + } + if (!o && ('' == l && (l += '&' + e + '.'), s = t[a], r && (a = a.substring(r.length)), 0 < a.length)) + if (0 < (o = a.indexOf('.'))) + o = (r || '') + (s = a.substring(0, o)) + '.', u || (u = []), u.push(o), l += f.o(s, t, n, i, o); + else if ('boolean' == typeof s && (s = s ? 'true' : 'false'), s) { + if ('retrieveLightData' == i && r.indexOf('.contextData.') < 0) + switch (o = a.substring(0, 4), c = a.substring(4), a) { + case 'transactionID': + a = 'xact'; + break; + case 'channel': + a = 'ch'; + break; + case 'campaign': + a = 'v0'; + break; + default: + f.Ra(c) && ('prop' == o ? a = 'c' + c : 'eVar' == o ? a = 'v' + c : 'list' == o ? a = 'l' + c : 'hier' == o && (a = 'h' + c, s = s.substring(0, 255))); + } + l += '&' + f.escape(a) + '=' + f.escape(s); + } + } + '' != l && (l += '&.' + e); + } + return l; + }, f.usePostbacks = 0, f.Qb = function () { + var e, t, n, i, r, a, s, o, c = '', l = '', u = '', d = i = '', p = f.T(); + if (f.lightProfileID ? (e = f.O, (l = f.lightTrackVars) && (l = ',' + l + ',' + f.la.join(',') + ',')) : (e = f.g, (f.pe || f.linkType) && (l = f.linkTrackVars, u = f.linkTrackEvents, f.pe && (i = f.pe.substring(0, 1).toUpperCase() + f.pe.substring(1), f[i] && (l = f[i].ec, u = f[i].cc))), l && (l = ',' + l + ',' + f.F.join(',') + ','), u && (u = ',' + u + ',', l && (l += ',events,')), f.events2 && (d += ('' != d ? ',' : '') + f.events2)), p && p.getCustomerIDs) { + if (i = g, r = p.getCustomerIDs()) + for (t in r) + Object.prototype[t] || 'object' == typeof (n = r[t]) && (i || (i = {}), n.id && (i[t + '.id'] = n.id), n.authState && (i[t + '.as'] = n.authState)); + i && (c += f.o('cid', i)); + } + for (f.AudienceManagement && f.AudienceManagement.isReady() && (c += f.o('d', f.AudienceManagement.getEventCallConfigParams())), t = 0; t < e.length; t++) { + if (i = e[t], r = f[i], n = i.substring(0, 4), a = i.substring(4), r || ('events' == i && d ? (r = d, d = '') : 'marketingCloudOrgID' == i && p && f.V('ECID') && (r = p.marketingCloudOrgID)), r && (!l || 0 <= l.indexOf(',' + i + ','))) { + switch (i) { + case 'customerPerspective': + i = 'cp'; + break; + case 'marketingCloudOrgID': + i = 'mcorgid'; + break; + case 'supplementalDataID': + i = 'sdid'; + break; + case 'timestamp': + i = 'ts'; + break; + case 'dynamicVariablePrefix': + i = 'D'; + break; + case 'visitorID': + i = 'vid'; + break; + case 'marketingCloudVisitorID': + i = 'mid'; + break; + case 'analyticsVisitorID': + i = 'aid'; + break; + case 'audienceManagerLocationHint': + i = 'aamlh'; + break; + case 'audienceManagerBlob': + i = 'aamb'; + break; + case 'authState': + i = 'as'; + break; + case 'pageURL': + i = 'g', 255 < r.length && (f.pageURLRest = r.substring(255), r = r.substring(0, 255)); + break; + case 'pageURLRest': + i = '-g'; + break; + case 'referrer': + i = 'r'; + break; + case 'vmk': + case 'visitorMigrationKey': + i = 'vmt'; + break; + case 'visitorMigrationServer': + i = 'vmf', f.ssl && f.visitorMigrationServerSecure && (r = ''); + break; + case 'visitorMigrationServerSecure': + i = 'vmf', !f.ssl && f.visitorMigrationServer && (r = ''); + break; + case 'charSet': + i = 'ce'; + break; + case 'visitorNamespace': + i = 'ns'; + break; + case 'cookieDomainPeriods': + i = 'cdp'; + break; + case 'cookieLifetime': + i = 'cl'; + break; + case 'variableProvider': + i = 'vvp'; + break; + case 'currencyCode': + i = 'cc'; + break; + case 'channel': + i = 'ch'; + break; + case 'transactionID': + i = 'xact'; + break; + case 'campaign': + i = 'v0'; + break; + case 'latitude': + i = 'lat'; + break; + case 'longitude': + i = 'lon'; + break; + case 'resolution': + i = 's'; + break; + case 'colorDepth': + i = 'c'; + break; + case 'javascriptVersion': + i = 'j'; + break; + case 'javaEnabled': + i = 'v'; + break; + case 'cookiesEnabled': + i = 'k'; + break; + case 'browserWidth': + i = 'bw'; + break; + case 'browserHeight': + i = 'bh'; + break; + case 'connectionType': + i = 'ct'; + break; + case 'homepage': + i = 'hp'; + break; + case 'events': + if (d && (r += ('' != r ? ',' : '') + d), u) + for (a = r.split(','), r = '', n = 0; n < a.length; n++) + 0 <= (o = (s = a[n]).indexOf('=')) && (s = s.substring(0, o)), 0 <= (o = s.indexOf(':')) && (s = s.substring(0, o)), 0 <= u.indexOf(',' + s + ',') && (r += (r ? ',' : '') + a[n]); + break; + case 'events2': + r = ''; + break; + case 'contextData': + c += f.o('c', f[i], l, i), r = ''; + break; + case 'lightProfileID': + i = 'mtp'; + break; + case 'lightStoreForSeconds': + i = 'mtss', f.lightProfileID || (r = ''); + break; + case 'lightIncrementBy': + i = 'mti', f.lightProfileID || (r = ''); + break; + case 'retrieveLightProfiles': + i = 'mtsr'; + break; + case 'deleteLightProfiles': + i = 'mtsd'; + break; + case 'retrieveLightData': + f.retrieveLightProfiles && (c += f.o('mts', f[i], l, i)), r = ''; + break; + default: + f.Ra(a) && ('prop' == n ? i = 'c' + a : 'eVar' == n ? i = 'v' + a : 'list' == n ? i = 'l' + a : 'hier' == n && (i = 'h' + a, r = r.substring(0, 255))); + } + r && (c += '&' + i + '=' + ('pev' != i.substring(0, 3) ? f.escape(r) : r)); + } + 'pev3' == i && f.e && (c += f.e); + } + return f.ka && (c += '&lrt=' + f.ka, f.ka = null), c; + }, f.B = function (e) { + var t = e.tagName; + return 'undefined' != '' + e.lc || 'undefined' != '' + e.Zb && 'HTML' != ('' + e.Zb).toUpperCase() ? '' : ('SHAPE' == (t = t && t.toUpperCase ? t.toUpperCase() : '') && (t = ''), t && (('INPUT' == t || 'BUTTON' == t) && e.type && e.type.toUpperCase ? t = e.type.toUpperCase() : !t && e.href && (t = 'A')), t); + }, f.Na = function (e) { + var t, n, i, r = p.location, a = e.href ? e.href : ''; + return t = a.indexOf(':'), n = a.indexOf('?'), i = a.indexOf('/'), a && (t < 0 || 0 <= n && n < t || 0 <= i && i < t) && (n = e.protocol && 1 < e.protocol.length ? e.protocol : r.protocol ? r.protocol : '', t = r.pathname.lastIndexOf('/'), a = (n ? n + '//' : '') + (e.host ? e.host : r.host ? r.host : '') + ('/' != a.substring(0, 1) ? r.pathname.substring(0, t < 0 ? 0 : t) + '/' : '') + a), a; + }, f.L = function (e) { + var t, n, i = f.B(e), r = '', a = 0; + return i && (t = e.protocol, n = e.onclick, !e.href || 'A' != i && 'AREA' != i || n && t && !(t.toLowerCase().indexOf('javascript') < 0) ? n ? (r = f.replace(f.replace(f.replace(f.replace('' + n, '\r', ''), '\n', ''), '\t', ''), ' ', ''), a = 2) : 'INPUT' == i || 'SUBMIT' == i ? (e.value ? r = e.value : e.innerText ? r = e.innerText : e.textContent && (r = e.textContent), a = 3) : 'IMAGE' == i && e.src && (r = e.src) : r = f.Na(e), r) ? { + id: r.substring(0, 100), + type: a + } : 0; + }, f.jc = function (e) { + for (var t = f.B(e), n = f.L(e); e && !n && 'BODY' != t;) + (e = e.parentElement ? e.parentElement : e.parentNode) && (t = f.B(e), n = f.L(e)); + return n && 'BODY' != t || (e = 0), e && (0 <= (t = e.onclick ? '' + e.onclick : '').indexOf('.tl(') || 0 <= t.indexOf('.trackLink(')) && (e = 0), e; + }, f.Yb = function () { + var e, t, n, i, r = f.linkObject, a = f.linkType, s = f.linkURL; + if (f.ma = 1, r || (f.ma = 0, r = f.clickObject), r) { + for (e = f.B(r), t = f.L(r); r && !t && 'BODY' != e;) + (r = r.parentElement ? r.parentElement : r.parentNode) && (e = f.B(r), t = f.L(r)); + if (t && 'BODY' != e || (r = 0), r && !f.linkObject) { + var o = r.onclick ? '' + r.onclick : ''; + (0 <= o.indexOf('.tl(') || 0 <= o.indexOf('.trackLink(')) && (r = 0); + } + } else + f.ma = 1; + if (!s && r && (s = f.Na(r)), s && !f.linkLeaveQueryString && (0 <= (n = s.indexOf('?')) && (s = s.substring(0, n))), !a && s) { + var c, l = 0, u = 0; + if (f.trackDownloadLinks && f.linkDownloadFileTypes) + for (n = (o = s.toLowerCase()).indexOf('?'), i = o.indexOf('#'), 0 <= n ? 0 <= i && i < n && (n = i) : n = i, 0 <= n && (o = o.substring(0, n)), n = f.linkDownloadFileTypes.toLowerCase().split(','), i = 0; i < n.length; i++) + (c = n[i]) && o.substring(o.length - (c.length + 1)) == '.' + c && (a = 'd'); + if (f.trackExternalLinks && !a && (o = s.toLowerCase(), f.Qa(o) && (f.linkInternalFilters || (f.linkInternalFilters = p.location.hostname), n = 0, f.linkExternalFilters ? (n = f.linkExternalFilters.toLowerCase().split(','), l = 1) : f.linkInternalFilters && (n = f.linkInternalFilters.toLowerCase().split(',')), n))) { + for (i = 0; i < n.length; i++) + c = n[i], 0 <= o.indexOf(c) && (u = 1); + u ? l && (a = 'e') : l || (a = 'e'); + } + } + f.linkObject = r, f.linkURL = s, f.linkType = a, (f.trackClickMap || f.trackInlineStats) && (f.e = '', r && (a = f.pageName, s = 1, r = r.sourceIndex, a || (a = f.pageURL, s = 0), p.s_objectID && (t.id = p.s_objectID, r = t.type = 1), a && t && t.id && e && (f.e = '&pid=' + f.escape(a.substring(0, 255)) + (s ? '&pidt=' + s : '') + '&oid=' + f.escape(t.id.substring(0, 100)) + (t.type ? '&oidt=' + t.type : '') + '&ot=' + e + (r ? '&oi=' + r : '')))); + }, f.Rb = function () { + var e = f.ma, t = f.linkType, n = f.linkURL, i = f.linkName; + if (t && (n || i) && ('d' != (t = t.toLowerCase()) && 'e' != t && (t = 'o'), f.pe = 'lnk_' + t, f.pev1 = n ? f.escape(n) : '', f.pev2 = i ? f.escape(i) : '', e = 1), f.abort && (e = 0), f.trackClickMap || f.trackInlineStats || f.Ub()) { + t = {}, n = 0; + var r, a, s, o = (c = f.rb()) ? c.split('&') : 0, c = 0; + if (o) + for (r = 0; r < o.length; r++) + a = o[r].split('='), i = f.unescape(a[0]).split(','), t[a = f.unescape(a[1])] = i; + for (s in (i = f.account.split(','), r = {}, f.contextData)) + s && !Object.prototype[s] && 'a.activitymap.' == s.substring(0, 14) && (r[s] = f.contextData[s], f.contextData[s] = ''); + if (f.e = f.o('c', r) + (f.e ? f.e : ''), e || f.e) { + for (a in (e && !f.e && (c = 1), t)) + if (!Object.prototype[a]) + for (s = 0; s < i.length; s++) + for (c && ((o = t[a].join(',')) == f.account && (f.e += ('&' != a.charAt(0) ? '&' : '') + a, t[a] = [], n = 1)), r = 0; r < t[a].length; r++) + (o = t[a][r]) == i[s] && (c && (f.e += '&u=' + f.escape(o) + ('&' != a.charAt(0) ? '&' : '') + a + '&u=0'), t[a].splice(r, 1), n = 1); + if (e || (n = 1), n) { + for (a in (c = '', r = 2, !e && f.e && (c = f.escape(i.join(',')) + '=' + f.escape(f.e), r = 1), t)) + !Object.prototype[a] && 0 < r && 0 < t[a].length && (c += (c ? '&' : '') + f.escape(t[a].join(',')) + '=' + f.escape(a), r--); + f.zb(c); + } + } + } + return e; + }, f.rb = function () { + return f.useLinkTrackSessionStorage ? f.Ea() ? p.sessionStorage.getItem(f.P) : void 0 : f.cookieRead(f.P); + }, f.Ea = function () { + return !!p.sessionStorage; + }, f.zb = function (e) { + f.useLinkTrackSessionStorage ? f.Ea() && p.sessionStorage.setItem(f.P, e) : f.cookieWrite(f.P, e); + }, f.Sb = function () { + if (!f.bc) { + var e, t, n = new Date(), i = b.location, r = t = e = '', a = '', s = '', o = '1.2', c = f.cookieWrite('s_cc', 'true', 0) ? 'Y' : 'N', l = '', u = ''; + if (n.setUTCDate && (o = '1.3', 0 .toPrecision && (o = '1.5', (n = []).forEach))) { + o = '1.6', t = 0, e = {}; + try { + (t = new Iterator(e)).next && (o = '1.7', n.reduce && ((o = '1.8').trim && (o = '1.8.1', Date.parse && (o = '1.8.2', Object.create && (o = '1.8.5'))))); + } catch (d) { + } + } + e = screen.width + 'x' + screen.height, r = navigator.javaEnabled() ? 'Y' : 'N', t = screen.pixelDepth ? screen.pixelDepth : screen.colorDepth, a = f.w.innerWidth ? f.w.innerWidth : f.d.documentElement.offsetWidth, s = f.w.innerHeight ? f.w.innerHeight : f.d.documentElement.offsetHeight; + try { + f.b.addBehavior('#default#homePage'), l = f.b.kc(i) ? 'Y' : 'N'; + } catch (h) { + } + try { + f.b.addBehavior('#default#clientCaps'), u = f.b.connectionType; + } catch (m) { + } + f.resolution = e, f.colorDepth = t, f.javascriptVersion = o, f.javaEnabled = r, f.cookiesEnabled = c, f.browserWidth = a, f.browserHeight = s, f.connectionType = u, f.homepage = l, f.bc = 1; + } + }, f.Q = {}, f.loadModule = function (t, e) { + var n = f.Q[t]; + if (!n) { + n = p['AppMeasurement_Module_' + t] ? new p['AppMeasurement_Module_' + t](f) : {}, f.Q[t] = f[t] = n, n.kb = function () { + return n.ub; + }, n.Ab = function (e) { + (n.ub = e) && (f[t + '_onLoad'] = e, f.fa(t + '_onLoad', [ + f, + n + ], 1) || e(f, n)); + }; + try { + Object.defineProperty ? Object.defineProperty(n, 'onLoad', { + get: n.kb, + set: n.Ab + }) : n._olc = 1; + } catch (i) { + n._olc = 1; + } + } + e && (f[t + '_onLoad'] = e, f.fa(t + '_onLoad', [ + f, + n + ], 1) || e(f, n)); + }, f.u = function (e) { + var t, n; + for (t in f.Q) + if (!Object.prototype[t] && (n = f.Q[t]) && (n._olc && n.onLoad && (n._olc = 0, n.onLoad(f, n)), n[e] && n[e]())) + return 1; + return 0; + }, f.Ub = function () { + return !(!f.ActivityMap || !f.ActivityMap._c); + }, f.Vb = function () { + var e = Math.floor(10000000000000 * Math.random()), t = f.visitorSampling, n = f.visitorSamplingGroup, i = (n = 's_vsn_' + (f.visitorNamespace ? f.visitorNamespace : f.account) + (n ? '_' + n : ''), f.cookieRead(n)); + if (t) { + if (t *= 100, i && (i = parseInt(i)), !i) { + if (!f.cookieWrite(n, e)) + return 0; + i = e; + } + if (t < i % 10000) + return 0; + } + return 1; + }, f.S = function (e, t) { + var n, i, r, a, s, o, c; + for (c = {}, n = 0; n < 2; n++) + for (i = 0 < n ? f.Ga : f.g, r = 0; r < i.length; r++) + if ((s = e[a = i[r]]) || e['!' + a]) { + if (s && !t && ('contextData' == a || 'retrieveLightData' == a) && f[a]) + for (o in f[a]) + s[o] || (s[o] = f[a][o]); + f[a] || (c['!' + a] = 1), c[a] = f[a], f[a] = s; + } + return c; + }, f.hc = function (e) { + var t, n, i, r; + for (t = 0; t < 2; t++) + for (n = 0 < t ? f.Ga : f.g, i = 0; i < n.length; i++) + e[r = n[i]] = f[r], e[r] || 'prop' !== r.substring(0, 4) && 'eVar' !== r.substring(0, 4) && 'hier' !== r.substring(0, 4) && 'list' !== r.substring(0, 4) && 'channel' !== r && 'events' !== r && 'eventList' !== r && 'products' !== r && 'productList' !== r && 'purchaseID' !== r && 'transactionID' !== r && 'state' !== r && 'zip' !== r && 'campaign' !== r && 'events2' !== r && 'latitude' !== r && 'longitude' !== r && 'ms_a' !== r && 'contextData' !== r && 'supplementalDataID' !== r && 'tnt' !== r && 'timestamp' !== r && 'abort' !== r && 'useBeacon' !== r && 'linkObject' !== r && 'clickObject' !== r && 'linkType' !== r && 'linkName' !== r && 'linkURL' !== r && 'bodyClickTarget' !== r && 'bodyClickFunction' !== r || (e['!' + r] = 1); + }, f.Mb = function (e) { + var t, n, i, r, a, s, o = 0, c = '', l = ''; + if (e && 255 < e.length && (0 < (n = (t = '' + e).indexOf('?')) && (s = t.substring(n + 1), i = 0, 'http://' == (r = (t = t.substring(0, n)).toLowerCase()).substring(0, 7) ? i += 7 : 'https://' == r.substring(0, 8) && (i += 8), 0 < (n = r.indexOf('/', i)) && (r = r.substring(i, n), a = t.substring(n), t = t.substring(0, n), 0 <= r.indexOf('google') ? o = ',q,ie,start,search_key,word,kw,cd,' : 0 <= r.indexOf('yahoo.co') ? o = ',p,ei,' : 0 <= r.indexOf('baidu.') && (o = ',wd,word,'), o && s)))) { + if ((e = s.split('&')) && 1 < e.length) { + for (i = 0; i < e.length; i++) + 0 < (n = (r = e[i]).indexOf('=')) && 0 <= o.indexOf(',' + r.substring(0, n) + ',') ? c += (c ? '&' : '') + r : l += (l ? '&' : '') + r; + c && l ? s = c + '&' + l : l = ''; + } + e = t + (0 < (n = 253 - (s.length - l.length) - t.length) ? a.substring(0, n) : '') + '?' + s; + } + return e; + }, f.eb = function (t) { + var e = f.d.visibilityState, n = [ + 'webkitvisibilitychange', + 'visibilitychange' + ]; + if (e || (e = f.d.webkitVisibilityState), e && 'prerender' == e) { + if (t) + for (e = 0; e < n.length; e++) + f.d.addEventListener(n[e], function () { + var e = f.d.visibilityState; + e || (e = f.d.webkitVisibilityState), 'visible' == e && t(); + }); + return !1; + } + return !0; + }, f.ca = !1, f.H = !1, f.Cb = function () { + f.H = !0, f.p(); + }, f.I = !1, f.Db = function (e) { + f.marketingCloudVisitorID = e.MCMID, f.visitorOptedOut = e.MCOPTOUT, f.analyticsVisitorID = e.MCAID, f.audienceManagerLocationHint = e.MCAAMLH, f.audienceManagerBlob = e.MCAAMB, f.I = !1, f.p(); + }, f.cb = function (e) { + return f.maxDelay || (f.maxDelay = 250), !f.u('_d') || (e && setTimeout(function () { + e(); + }, f.maxDelay), !1); + }, f.aa = !1, f.G = !1, f.Aa = function () { + f.G = !0, f.p(); + }, f.isReadyToTrack = function () { + var e = !0; + return !(!f.ob() || !f.mb()) && (f.qb() || (e = !1), f.tb() || (e = !1), e); + }, f.ob = function () { + return f.ca || f.H || (f.eb(f.Cb) ? f.H = !0 : f.ca = !0), !(f.ca && !f.H); + }, f.mb = function () { + var e = f.wa(); + if (e) { + if (!f.ta && !f.ba) + return e.fetchPermissions(f.vb, !0), !(f.ba = !0); + if (!f.ta) + return !1; + if (!e.isApproved(e.Categories.ANALYTICS)) + return !1; + } + return !0; + }, f.V = function (e) { + var t = f.wa(); + return !(t && !t.isApproved(t.Categories[e])); + }, f.wa = function () { + return p.adobe && p.adobe.optIn ? p.adobe.optIn : null; + }, f.Y = !0, f.qb = function () { + var e = f.T(); + return !e || !e.getVisitorValues || (f.Y && (f.Y = !1, f.I || (f.I = !0, e.getVisitorValues(f.Db))), !f.I); + }, f.T = function () { + var e = f.visitor; + return e && !e.isAllowed() && (e = null), e; + }, f.tb = function () { + return f.aa || f.G || (f.cb(f.Aa) ? f.G = !0 : f.aa = !0), !(f.aa && !f.G); + }, f.ba = !1, f.vb = function () { + f.ba = !1, f.ta = !0; + }, f.j = g, f.q = 0, f.callbackWhenReadyToTrack = function (e, t, n) { + var i; + (i = {}).Hb = e, i.Gb = t, i.Eb = n, f.j == g && (f.j = []), f.j.push(i), 0 == f.q && (f.q = setInterval(f.p, 100)); + }, f.p = function () { + var e; + if (f.isReadyToTrack() && (f.Bb(), f.j != g)) + for (; 0 < f.j.length;) + (e = f.j.shift()).Gb.apply(e.Hb, e.Eb); + }, f.Bb = function () { + f.q && (clearInterval(f.q), f.q = 0); + }, f.ua = function (e) { + var t, n = {}; + if (f.hc(n), e != g) + for (t in e) + n[t] = e[t]; + f.callbackWhenReadyToTrack(f, f.Fa, [n]), f.Da(); + }, f.Ob = function () { + var e, t = f.cookieRead('s_fid'), n = '', i = ''; + e = 8; + var r = 4; + if (!t || t.indexOf('-') < 0) { + for (t = 0; t < 16; t++) + e = Math.floor(Math.random() * e), n += '0123456789ABCDEF'.substring(e, e + 1), e = Math.floor(Math.random() * r), i += '0123456789ABCDEF'.substring(e, e + 1), e = r = 16; + t = n + '-' + i; + } + return f.cookieWrite('s_fid', t, 1) || (t = 0), t; + }, f.Fa = function (e) { + var t, n = new Date(), i = 's' + Math.floor(n.getTime() / 10800000) % 10 + Math.floor(10000000000000 * Math.random()), r = n.getYear(), a = (r = 't=' + f.escape(n.getDate() + '/' + n.getMonth() + '/' + (r < 1900 ? r + 1900 : r) + ' ' + n.getHours() + ':' + n.getMinutes() + ':' + n.getSeconds() + ' ' + n.getDay() + ' ' + n.getTimezoneOffset()), f.T()); + e && (t = f.S(e, 1)), f.Vb() && !f.visitorOptedOut && (f.xa() || (f.fid = f.Ob()), f.Yb(), f.usePlugins && f.doPlugins && f.doPlugins(f), f.account && (f.abort || (f.trackOffline && !f.timestamp && (f.timestamp = Math.floor(n.getTime() / 1000)), e = p.location, f.pageURL || (f.pageURL = e.href ? e.href : e), f.referrer || f.$a || (e = f.Util.getQueryParam('adobe_mc_ref', null, null, !0), f.referrer = e || void 0 === e ? void 0 === e ? '' : e : b.document.referrer), f.$a = 1, !f.referrer && f.Z && (f.referrer = f.Z), f.Z = 0, f.referrer = f.Mb(f.referrer), f.u('_g')), f.Rb() && !f.abort && (a && f.V('TARGET') && !f.supplementalDataID && a.getSupplementalDataID && (f.supplementalDataID = a.getSupplementalDataID('AppMeasurement:' + f._in, !f.expectSupplementalData)), f.V('AAM') || (f.contextData['cm.ssf'] = 1), f.Sb(), f.wb(), r += f.Qb(), f.sb(i, r), f.u('_t'), f.referrer = ''))), f.referrer && (f.Z = f.referrer), f.Da(), t && f.S(t, 1); + }, f.t = f.track = function (e, t) { + t && f.S(t), f.Y = !0, f.isReadyToTrack() ? null != f.j && 0 < f.j.length ? (f.ua(e), f.p()) : f.Fa(e) : f.ua(e); + }, f.wb = function () { + f.writeSecureCookies && !f.ssl && f.ab(); + }, f.ab = function () { + f.contextData.excCodes = f.contextData.excCodes ? f.contextData.excCodes : [], f.contextData.excCodes.push(1); + }, f.Da = function () { + f.abort = f.supplementalDataID = f.timestamp = f.pageURLRest = f.linkObject = f.clickObject = f.linkURL = f.linkName = f.linkType = p.s_objectID = f.pe = f.pev1 = f.pev2 = f.pev3 = f.e = f.lightProfileID = f.useBeacon = f.referrer = 0, f.contextData && f.contextData.excCodes && (f.contextData.excCodes = 0); + }, f.Ca = [], f.registerPreTrackCallback = function (e) { + for (var t = [], n = 1; n < arguments.length; n++) + t.push(arguments[n]); + 'function' == typeof e ? f.Ca.push([ + e, + t + ]) : f.debugTracking && f.C('DEBUG: Non function type passed to registerPreTrackCallback'); + }, f.hb = function (e) { + f.va(f.Ca, e); + }, f.Ba = [], f.registerPostTrackCallback = function (e) { + for (var t = [], n = 1; n < arguments.length; n++) + t.push(arguments[n]); + 'function' == typeof e ? f.Ba.push([ + e, + t + ]) : f.debugTracking && f.C('DEBUG: Non function type passed to registerPostTrackCallback'); + }, f.gb = function (e) { + f.va(f.Ba, e); + }, f.va = function (e, t) { + if ('object' == typeof e) + for (var n = 0; n < e.length; n++) { + var i = e[n][0], r = e[n][1].slice(); + if (r.unshift(t), 'function' == typeof i) + try { + i.apply(null, r); + } catch (a) { + f.debugTracking && f.C(a.message); + } + } + }, f.tl = f.trackLink = function (e, t, n, i, r) { + return f.linkObject = e, f.linkType = t, f.linkName = n, r && (f.bodyClickTarget = e, f.bodyClickFunction = r), f.track(i); + }, f.trackLight = function (e, t, n, i) { + return f.lightProfileID = e, f.lightStoreForSeconds = t, f.lightIncrementBy = n, f.track(i); + }, f.clearVars = function () { + var e, t; + for (e = 0; e < f.g.length; e++) + ('prop' == (t = f.g[e]).substring(0, 4) || 'eVar' == t.substring(0, 4) || 'hier' == t.substring(0, 4) || 'list' == t.substring(0, 4) || 'channel' == t || 'events' == t || 'eventList' == t || 'products' == t || 'productList' == t || 'purchaseID' == t || 'transactionID' == t || 'state' == t || 'zip' == t || 'campaign' == t) && (f[t] = void 0); + }, f.tagContainerMarker = '', f.sb = function (e, t) { + var n = f.ib() + '/' + e + '?AQB=1&ndh=1&pf=1&' + (f.za() ? 'callback=s_c_il[' + f._in + '].doPostbacks&et=1&' : '') + t + '&AQE=1'; + f.hb(n), f.fb(n), f.U(); + }, f.ib = function () { + var e = f.jb(); + return 'http' + (f.ssl ? 's' : '') + '://' + e + '/b/ss/' + f.account + '/' + (f.mobile ? '5.' : '') + (f.za() ? '10' : '1') + '/JS-' + f.version + (f.ac ? 'T' : '') + (f.tagContainerMarker ? '-' + f.tagContainerMarker : ''); + }, f.za = function () { + return f.AudienceManagement && f.AudienceManagement.isReady() || 0 != f.usePostbacks; + }, f.jb = function () { + var e = f.dc, t = f.trackingServer; + return t ? f.trackingServerSecure && f.ssl && (t = f.trackingServerSecure) : ('d1' == (e = e ? ('' + e).toLowerCase() : 'd1') ? e = '112' : 'd2' == e && (e = '122'), t = f.lb() + '.' + e + '.2o7.net'), t; + }, f.lb = function () { + var e = f.visitorNamespace; + return e || (e = (e = f.account.split(',')[0]).replace(/[^0-9a-z]/gi, '')), e; + }, f.Za = /{(%?)(.*?)(%?)}/, f.gc = RegExp(f.Za.source, 'g'), f.Lb = function (e) { + if ('object' == typeof e.dests) + for (var t = 0; t < e.dests.length; ++t) { + var n = e.dests[t]; + if ('string' == typeof n.c && 'aa.' == n.id.substr(0, 3)) + for (var i = n.c.match(f.gc), r = 0; r < i.length; ++r) { + var a = i[r], s = a.match(f.Za), o = ''; + '%' == s[1] && 'timezone_offset' == s[2] ? o = new Date().getTimezoneOffset() : '%' == s[1] && 'timestampz' == s[2] && (o = f.Pb()), n.c = n.c.replace(a, f.escape(o)); + } + } + }, f.Pb = function () { + var e = new Date(), t = new Date(60000 * Math.abs(e.getTimezoneOffset())); + return f.k(4, e.getFullYear()) + '-' + f.k(2, e.getMonth() + 1) + '-' + f.k(2, e.getDate()) + 'T' + f.k(2, e.getHours()) + ':' + f.k(2, e.getMinutes()) + ':' + f.k(2, e.getSeconds()) + (0 < e.getTimezoneOffset() ? '-' : '+') + f.k(2, t.getUTCHours()) + ':' + f.k(2, t.getUTCMinutes()); + }, f.k = function (e, t) { + return (Array(e + 1).join(0) + t).slice(-e); + }, f.qa = {}, f.doPostbacks = function (e) { + if ('object' == typeof e) + if (f.Lb(e), 'object' == typeof f.AudienceManagement && 'function' == typeof f.AudienceManagement.isReady && f.AudienceManagement.isReady() && 'function' == typeof f.AudienceManagement.passData) + f.AudienceManagement.passData(e); + else if ('object' == typeof e && 'object' == typeof e.dests) + for (var t = 0; t < e.dests.length; ++t) { + var n = e.dests[t]; + 'object' == typeof n && 'string' == typeof n.c && 'string' == typeof n.id && 'aa.' == n.id.substr(0, 3) && (f.qa[n.id] = new Image(), f.qa[n.id].alt = '', f.qa[n.id].src = n.c); + } + }, f.fb = function (e) { + f.i || f.Tb(), f.i.push(e), f.ja = f.A(), f.Ya(); + }, f.Tb = function () { + f.i = f.Wb(), f.i || (f.i = []); + }, f.Wb = function () { + var e, t; + if (f.pa()) { + try { + (t = p.localStorage.getItem(f.na())) && (e = p.JSON.parse(t)); + } catch (n) { + } + return e; + } + }, f.pa = function () { + var e = !0; + return f.trackOffline && f.offlineFilename && p.localStorage && p.JSON || (e = !1), e; + }, f.Oa = function () { + var e = 0; + return f.i && (e = f.i.length), f.l && e++, e; + }, f.U = function () { + if (!f.l || (f.v && f.v.complete && f.v.D && f.v.R(), !f.l)) + if (f.Pa = g, f.oa) + f.ja > f.N && f.Wa(f.i), f.ra(500); + else { + var e = f.Fb(); + 0 < e ? f.ra(e) : (e = f.Ma()) && (f.l = 1, f.Xb(e), f.$b(e)); + } + }, f.ra = function (e) { + f.Pa || (e || (e = 0), f.Pa = setTimeout(f.U, e)); + }, f.Fb = function () { + var e; + return !f.trackOffline || f.offlineThrottleDelay <= 0 ? 0 : (e = f.A() - f.Ua, f.offlineThrottleDelay < e ? 0 : f.offlineThrottleDelay - e); + }, f.Ma = function () { + if (0 < f.i.length) + return f.i.shift(); + }, f.Xb = function (e) { + if (f.debugTracking) { + var t, n = 'AppMeasurement Debug: ' + e; + for (e = e.split('&'), t = 0; t < e.length; t++) + n += '\n\t' + f.unescape(e[t]); + f.C(n); + } + }, f.xa = function () { + return f.marketingCloudVisitorID || f.analyticsVisitorID; + }, f.X = !1; + try { + m = JSON.parse('{"x":"y"}'); + } catch (v) { + m = null; + } + for (m && 'y' == m.x ? (f.X = !0, f.W = function (e) { + return JSON.parse(e); + }) : p.$ && p.$.parseJSON ? (f.W = function (e) { + return p.$.parseJSON(e); + }, f.X = !0) : f.W = function () { + return null; + }, f.$b = function (e) { + var t, n, i; + if (f.nb(e) && (n = 1, t = { + send: function (e) { + f.useBeacon = !1, navigator.sendBeacon(e) ? t.R() : t.ha(); + } + }), !t && f.xa() && 2047 < e.length && (f.bb() && (n = 2, t = new XMLHttpRequest()), t && (f.AudienceManagement && f.AudienceManagement.isReady() || 0 != f.usePostbacks) && (f.X ? t.Ha = !0 : t = 0)), !t && f.fc && (e = e.substring(0, 2047)), !t && f.d.createElement && (0 != f.usePostbacks || f.AudienceManagement && f.AudienceManagement.isReady()) && (t = f.d.createElement('SCRIPT')) && 'async' in t && ((i = (i = f.d.getElementsByTagName('HEAD')) && i[0] ? i[0] : f.d.body) ? (t.type = 'text/javascript', t.setAttribute('async', 'async'), n = 3) : t = 0), t || ((t = new Image()).alt = '', t.abort || 'undefined' == typeof p.InstallTrigger || (t.abort = function () { + t.src = g; + })), t.Va = Date.now(), t.Ja = function () { + try { + t.D && (clearTimeout(t.D), t.D = 0); + } catch (f) { + } + }, t.onload = t.R = function () { + if (t.Va && (f.ka = Date.now() - t.Va), f.gb(e), t.Ja(), f.Jb(), f.da(), f.l = 0, f.U(), t.Ha) { + t.Ha = !1; + try { + f.doPostbacks(f.W(t.responseText)); + } catch (n) { + } + } + }, t.onabort = t.onerror = t.ha = function () { + t.Ja(), (f.trackOffline || f.oa) && f.l && f.i.unshift(f.Ib), f.l = 0, f.ja > f.N && f.Wa(f.i), f.da(), f.ra(500); + }, t.onreadystatechange = function () { + 4 == t.readyState && (200 == t.status ? t.R() : t.ha()); + }, f.Ua = f.A(), 1 === n) + t.send(e); + else if (2 === n) + i = e.indexOf('?'), n = e.substring(0, i), i = (i = e.substring(i + 1)).replace(/&callback=[a-zA-Z0-9_.\[\]]+/, ''), t.open('POST', n, !0), t.withCredentials = !0, t.send(i); + else if (t.src = e, 3 === n) { + if (f.Sa) + try { + i.removeChild(f.Sa); + } catch (r) { + } + i.firstChild ? i.insertBefore(t, i.firstChild) : i.appendChild(t), f.Sa = f.v; + } + t.D = setTimeout(function () { + t.D && (t.complete ? t.R() : (f.trackOffline && t.abort && t.abort(), t.ha())); + }, 5000), f.Ib = e, f.v = p['s_i_' + f.replace(f.account, ',', '_')] = t, (f.useForcedLinkTracking && f.J || f.bodyClickFunction) && (f.forcedLinkTrackingTimeout || (f.forcedLinkTrackingTimeout = 250), f.ea = setTimeout(f.da, f.forcedLinkTrackingTimeout)); + }, f.nb = function (e) { + var t = !1; + return navigator.sendBeacon && (f.pb(e) ? t = !0 : f.useBeacon && (t = !0)), f.yb(e) && (t = !1), t; + }, f.pb = function (e) { + return !!(e && 0 < e.indexOf('pe=lnk_e')); + }, f.yb = function (e) { + return 64000 <= e.length; + }, f.bb = function () { + return 'undefined' != typeof XMLHttpRequest && 'withCredentials' in new XMLHttpRequest(); + }, f.Jb = function () { + if (f.pa() && !(f.Ta > f.N)) + try { + p.localStorage.removeItem(f.na()), f.Ta = f.A(); + } catch (e) { + } + }, f.Wa = function (e) { + if (f.pa()) { + f.Ya(); + try { + p.localStorage.setItem(f.na(), p.JSON.stringify(e)), f.N = f.A(); + } catch (t) { + } + } + }, f.Ya = function () { + if (f.trackOffline) + for ((!f.offlineLimit || f.offlineLimit <= 0) && (f.offlineLimit = 10); f.i.length > f.offlineLimit;) + f.Ma(); + }, f.forceOffline = function () { + f.oa = !0; + }, f.forceOnline = function () { + f.oa = !1; + }, f.na = function () { + return f.offlineFilename + '-' + f.visitorNamespace + f.account; + }, f.A = function () { + return new Date().getTime(); + }, f.Qa = function (e) { + return 0 != (e = e.toLowerCase()).indexOf('#') && 0 != e.indexOf('about:') && 0 != e.indexOf('opera:') && 0 != e.indexOf('javascript:'); + }, f.setTagContainer = function (e) { + var t, n, i; + for (f.ac = e, t = 0; t < f._il.length; t++) + if ((n = f._il[t]) && 's_l' == n._c && n.tagContainerName == e) { + if (f.S(n), n.lmq) + for (t = 0; t < n.lmq.length; t++) + i = n.lmq[t], f.loadModule(i.n); + if (n.ml) + for (i in n.ml) + if (f[i]) + for (t in (e = f[i], i = n.ml[i])) + !Object.prototype[t] && ('function' != typeof i[t] || ('' + i[t]).indexOf('s_c_il') < 0) && (e[t] = i[t]); + if (n.mmq) + for (t = 0; t < n.mmq.length; t++) + i = n.mmq[t], f[i.m] && ((e = f[i.m])[i.f] && 'function' == typeof e[i.f] && (i.a ? e[i.f].apply(e, i.a) : e[i.f].apply(e))); + if (n.tq) + for (t = 0; t < n.tq.length; t++) + f.track(n.tq[t]); + n.s = f; + break; + } + }, f.Util = { + urlEncode: f.escape, + urlDecode: f.unescape, + cookieRead: f.cookieRead, + cookieWrite: f.cookieWrite, + getQueryParam: function (e, t, n, i) { + var r, a = ''; + return t || (t = f.pageURL ? f.pageURL : p.location), n = n || '&', e && t ? (r = (t = '' + t).indexOf('?')) < 0 ? a : (t = n + t.substring(r + 1) + n, i && (0 <= t.indexOf(n + e + n) || 0 <= t.indexOf(n + e + '=' + n)) ? void 0 : (0 <= (r = t.indexOf('#')) && (t = t.substr(0, r) + n), (r = t.indexOf(n + e + '=')) < 0 || (0 <= (r = (t = t.substring(r + n.length + e.length + 1)).indexOf(n)) && (t = t.substring(0, r)), 0 < t.length && (a = f.unescape(t))), a)) : a; + }, + getIeVersion: function () { + return document.documentMode ? document.documentMode : f.ya() ? 7 : null; + } + }, f.F = 'supplementalDataID timestamp dynamicVariablePrefix visitorID marketingCloudVisitorID analyticsVisitorID audienceManagerLocationHint authState fid vmk visitorMigrationKey visitorMigrationServer visitorMigrationServerSecure charSet visitorNamespace cookieDomainPeriods fpCookieDomainPeriods cookieLifetime pageName pageURL customerPerspective referrer contextData currencyCode lightProfileID lightStoreForSeconds lightIncrementBy retrieveLightProfiles deleteLightProfiles retrieveLightData'.split(' '), f.g = f.F.concat('purchaseID variableProvider channel server pageType transactionID campaign state zip events events2 products audienceManagerBlob tnt'.split(' ')), f.la = 'timestamp charSet visitorNamespace cookieDomainPeriods cookieLifetime contextData lightProfileID lightStoreForSeconds lightIncrementBy'.split(' '), f.O = f.la.slice(0), f.Ga = 'account allAccounts debugTracking visitor visitorOptedOut trackOffline offlineLimit offlineThrottleDelay offlineFilename usePlugins doPlugins configURL visitorSampling visitorSamplingGroup linkObject clickObject linkURL linkName linkType trackDownloadLinks trackExternalLinks trackClickMap trackInlineStats linkLeaveQueryString linkTrackVars linkTrackEvents linkDownloadFileTypes linkExternalFilters linkInternalFilters useForcedLinkTracking forcedLinkTrackingTimeout writeSecureCookies useLinkTrackSessionStorage trackingServer trackingServerSecure ssl abort mobile dc lightTrackVars maxDelay expectSupplementalData useBeacon usePostbacks registerPreTrackCallback registerPostTrackCallback bodyClickTarget bodyClickFunction AudienceManagement'.split(' '), l = 0; l <= 250; l++) + l < 76 && (f.g.push('prop' + l), f.O.push('prop' + l)), f.g.push('eVar' + l), f.O.push('eVar' + l), l < 6 && f.g.push('hier' + l), l < 4 && f.g.push('list' + l); + l = 'pe pev1 pev2 pev3 latitude longitude resolution colorDepth javascriptVersion javaEnabled cookiesEnabled browserWidth browserHeight connectionType homepage pageURLRest marketingCloudOrgID ms_a'.split(' '), f.g = f.g.concat(l), f.F = f.F.concat(l), f.ssl = 0 <= p.location.protocol.toLowerCase().indexOf('https'), f.charSet = 'UTF-8', f.contextData = {}, f.writeSecureCookies = !1, f.offlineThrottleDelay = 0, f.offlineFilename = 'AppMeasurement.offline', f.P = 's_sq', f.Ua = 0, f.ja = 0, f.N = 0, f.Ta = 0, f.linkDownloadFileTypes = 'exe,zip,wav,mp3,mov,mpg,avi,wmv,pdf,doc,docx,xls,xlsx,ppt,pptx', f.w = p, f.d = p.document, f.da = function () { + f.ea && (p.clearTimeout(f.ea), f.ea = g), f.bodyClickTarget && f.J && f.bodyClickTarget.dispatchEvent(f.J), f.bodyClickFunction && ('function' == typeof f.bodyClickFunction ? f.bodyClickFunction() : f.bodyClickTarget && f.bodyClickTarget.href && (f.d.location = f.bodyClickTarget.href)), f.bodyClickTarget = f.J = f.bodyClickFunction = 0; + }, f.Xa = function () { + f.b = f.d.body, f.b ? (f.r = function (e) { + var t, n, i, r, a; + if (!(f.d && f.d.getElementById('cppXYctnr') || e && e['s_fe_' + f._in])) { + if (f.Ia) { + if (!f.useForcedLinkTracking) + return f.b.removeEventListener('click', f.r, !0), void (f.Ia = f.useForcedLinkTracking = 0); + f.b.removeEventListener('click', f.r, !1); + } else + f.useForcedLinkTracking = 0; + f.clickObject = e.srcElement ? e.srcElement : e.target; + try { + if (!f.clickObject || f.M && f.M == f.clickObject || !(f.clickObject.tagName || f.clickObject.parentElement || f.clickObject.parentNode)) + f.clickObject = 0; + else { + var s = f.M = f.clickObject; + if (f.ia && (clearTimeout(f.ia), f.ia = 0), f.ia = setTimeout(function () { + f.M == s && (f.M = 0); + }, 10000), i = f.Oa(), f.track(), i < f.Oa() && f.useForcedLinkTracking && e.target) { + for (r = e.target; r && r != f.b && 'A' != r.tagName.toUpperCase() && 'AREA' != r.tagName.toUpperCase();) + r = r.parentNode; + if (r && (a = r.href, f.Qa(a) || (a = 0), n = r.target, e.target.dispatchEvent && a && (!n || '_self' == n || '_top' == n || '_parent' == n || p.name && n == p.name))) { + try { + t = f.d.createEvent('MouseEvents'); + } catch (o) { + t = new p.MouseEvent(); + } + if (t) { + try { + t.initMouseEvent('click', e.bubbles, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, e.relatedTarget); + } catch (l) { + t = 0; + } + t && (t['s_fe_' + f._in] = t.s_fe = 1, e.stopPropagation(), e.stopImmediatePropagation && e.stopImmediatePropagation(), e.preventDefault(), f.bodyClickTarget = e.target, f.J = t); + } + } + } + } + } catch (c) { + f.clickObject = 0; + } + } + }, f.b && f.b.attachEvent ? f.b.attachEvent('onclick', f.r) : f.b && f.b.addEventListener && (navigator && (0 <= navigator.userAgent.indexOf('WebKit') && f.d.createEvent || 0 <= navigator.userAgent.indexOf('Firefox/2') && p.MouseEvent) && (f.Ia = 1, f.useForcedLinkTracking = 1, f.b.addEventListener('click', f.r, !0)), f.b.addEventListener('click', f.r, !1))) : setTimeout(f.Xa, 30); + }, f.fc = f.ya(), f.Kb(), f.mc || (d ? f.setAccount(d) : f.C('Error, missing Report Suite ID in AppMeasurement initialization'), f.Xa(), f.loadModule('ActivityMap')); + } + function $___var_1411bce9e2bc6b85(e) { + var t, n, i, r, a, s = window.s_c_il, o = e.split(','), c = 0; + if (s) + for (n = 0; !c && n < s.length;) { + if ('s_c' == (t = s[n])._c && (t.account || t.oun)) + if (t.account && t.account == e) + c = 1; + else + for (i = t.account ? t.account : t.oun, i = t.allAccounts ? t.allAccounts : i.split(','), r = 0; r < o.length; r++) + for (a = 0; a < i.length; a++) + o[r] == i[a] && (c = 1); + n++; + } + return c ? t.setAccount && t.setAccount(e) : t = new AppMeasurement(e), t; + } + function $___var_385189dc7e558eb0() { + var e, t, n, i = window, r = i.s_giq; + if (r) + for (e = 0; e < r.length; e++) + (n = s_gi((t = r[e]).oun)).setAccount(t.un), n.setTagContainer(t.tagContainerName); + i.s_giq = 0; + } + function $___var_8bf1ab7ed297b2c8() { + if ('undefined' == typeof pgLvl) { + fdx_getLinkView(), ('undefined' == typeof s.pageName || '' == s.pageName) && (_satellite.getVar('content:page name'), 1) && _satellite.getVar('content:page name') && (s.pageName = _satellite.getVar('content:page name')), s.pageName = s.pageName.toLowerCase(), 'undefined' != typeof s.eVar43 && '' != s.eVar43 || (s.eVar43 = 'P:' + s.pageName), s.prop43 = 'D=v43'; + var e = document.getElementsByClassName('brightcove-container'); + s.eVar31 = e.length; + for (var t = '', n = 0; n < e.length; n++) + s.eVar31 += '|' + e[n].getAttribute('data-video-id'), t = 'event202'; + s.linkTrackEvents = s.events = s.apl(s.events, t, ',', 2); + var i = fdx_getCookie('xacc').toLowerCase(), r = fdx_getCookie('fdx_locale').toLowerCase().split('_'), a = fdx_getCookie('fdx_geo_select'); + fdx_getCookie('fdx_geo_hide') !== r[1] && i !== r[1] && a !== r[1] && (s.linkTrackEvents = s.events = 'event904'); + try { + var o = fdx_getCookie('fdx_debug'); + if (void 0 !== o) { + for (n = 0; n < o.split(',').length; n++) { + var c = 'DBG_' + o.split(',')[n]; + c = (c = c.split('|').slice(1).join('|')).substring(0, Math.min(255, c.length)); + } + s.events = s.apl(s.events, 'event100', ',', 2), fdx_setCookie('fdx_debug', '', -1, '/', '.fedex.com'); + } + } catch (f) { + fdx_debug(f, 'SC', 'fdx_runSCode:log debug errors'); + } + s.eVar60 = s.Util.getQueryParam('et_rid'), s.eVar60 = s.getValOnce(s.eVar60, 's_etrid', 0); + var l = s.c_r('s_etrid'); + window.sc_s_etrid = '', null != l && '' !== l ? (s.getAndPersistValue(l, 'sc_s_etrid', 90), window.sc_s_etrid = l) : window.sc_s_etrid = s.c_r('sc_s_etrid'), s.eVar80 = s.Util.getQueryParam('et_cid'), s.eVar80 = s.getValOnce(s.eVar80, 's_etcid', 0); + var u = s.c_r('s_acxrid'); + window.sc_s_acxrid = '', null != u && '' !== u ? (s.getAndPersistValue(u, 'sc_s_acxrid', 90), window.sc_s_acxrid = u) : window.sc_s_acxrid = s.c_r('sc_s_acxrid'); + var d = fdx_getCookie('fcl_uuid'); + window.sc_fcl_uuid = ''; + var p = new Object(); + if (void 0 === d || null == d) { + if (window.sc_fcl_uuid = s.c_r('sc_fcl_uuid'), '' !== window.sc_fcl_uuid) + window.sc_fcl_uuid.indexOf('@') < 0 && (s.eVar6 = window.sc_fcl_uuid, s.prop6 = 'D=v6', p.fedexcustid = { + id: s.eVar6, + authState: Visitor.AuthState.LOGGED_OUT + }, p.F3eDx = { + id: s.eVar6, + authState: Visitor.AuthState.LOGGED_OUT + }); + window.sc_s_etrid && (p.et_rid = { + id: window.sc_s_etrid, + authState: Visitor.AuthState.LOGGED_OUT + }); + } else + d.indexOf('@') < 0 && (s.eVar6 = d, s.prop6 = 'D=v6', s.getAndPersistValue(d, 'sc_fcl_uuid', 90), window.sc_fcl_uuid = d, p.fedexcustid = { + id: s.eVar6, + authState: Visitor.AuthState.AUTHENTICATED + }, p.F3eDx = { + id: s.eVar6, + authState: Visitor.AuthState.AUTHENTICATED + }), window.sc_s_etrid && (p.et_rid = { + id: window.sc_s_etrid, + authState: Visitor.AuthState.AUTHENTICATED + }); + try { + 'undefined' != typeof s.visitor || (s.visitor = Visitor.getInstance(_satellite.getVar('mcorgID'))), s.visitor.setCustomerIDs(p), s.visitor._setFieldExpire('MCAAMB', -1), s.visitor.getAudienceManagerBlob(); + } catch (f) { + fdx_debug(f, 'SC', 'fdx_runSCode:ID sync for AAM '); + } + } + } + function $___var_9b2a4c2f76e73a16() { + try { + fdx_initSCVars(), fdx_initPlugins(), fdx_runSCode(); + } catch (e) { + fdx_debug(e, 'SC', 'fdx_initSCode'); + } + } + var $___var_66be7d43b28f0162 = fdx_createCustomEvent || function (e) { + try { + var t; + return document.createEvent ? (t = document.createEvent('Event')).initEvent(e, !1, !1) : t = e, t; + } catch (n) { + fdx_debug(n, 'CIM', 'fdx_createCustomEvent'); + } + }, $___var_cef9b7a48b4123da = fdx_dispatchCustomEvent || function (e) { + try { + document.createEvent ? document.dispatchEvent(e) : 'undefined' != typeof document.documentElement[e] ? document.documentElement[e]++ : document.documentElement[e] = 0; + } catch (t) { + fdx_debug(t, 'CIM', 'fdx_dispatchCustomEvent'); + } + }, $___var_0e9c39c2a5bb1be3 = fdx_fireCustomEvent || function (e) { + try { + var t = fdx_createCustomEvent(e); + fdx_dispatchCustomEvent(t); + } catch (n) { + fdx_debug(n, 'CIM', 'fdx_fireCustomEvent'); + } + }, $___var_dbfa334b3fa72327 = { + 'mags-address': [ + 'eVar151', + 'event211' + ], + 'mags-package': [ + 'eVar152', + 'event212' + ], + 'mags-custom': [ + 'eVar155', + 'event214' + ], + 'mags-ratesdisplay': [ + 'eVar153', + 'event216' + ], + 'mags-payment': [ + 'eVar154', + 'event218' + ] + }; + fdx_createCustomEvent = $___var_66be7d43b28f0162; + fdx_dispatchCustomEvent = $___var_cef9b7a48b4123da; + fdx_fireCustomEvent = $___var_0e9c39c2a5bb1be3; + MAGSEvarMapping = $___var_dbfa334b3fa72327; + !function () { + 'use strict'; + var a, s, o; + 'function' != typeof window.DIL && (window.DIL = function (n, e) { + const $___old_e335e0c87fa75cc9 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_137bae8e4712efe2 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_e335e0c87fa75cc9) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_f8e9a6d6172a3144.XMLHttpRequest)); + if ($___old_137bae8e4712efe2) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_f8e9a6d6172a3144.XMLHttpRequest)); + return function () { + function t(e) { + return void 0 === e || !0 === e; + } + function i() { + W || (W = !0, P.registerRequest(), Y()); + } + var u, r, m, a, l, g, s, o, c, d, p, f, b, v, h, _, k, y, w, x, D, I = [], C = {}; + n !== Object(n) && (n = {}), m = n.partner, a = n.containerNSID, l = n.mappings, g = n.uuidCookie, s = !0 === n.enableErrorReporting, o = n.visitorService, c = n.declaredId, d = !0 === n.delayAllUntilWindowLoad, p = t(n.secureDataCollection), f = 'boolean' == typeof n.isCoopSafe ? n.isCoopSafe : null, b = t(n.enableHrefererParam), v = t(n.enableLogging), h = t(n.enableUrlDestinations), _ = t(n.enableCookieDestinations), k = !0 === n.disableDefaultRequest, y = n.afterResultForDefaultRequest, w = n.visitorConstructor, x = !0 === n.disableCORS, D = !0 === n.ignoreHardDependencyOnVisitorAPI, s && DIL.errorModule.activate(), D && I.push('Warning: this instance is configured to ignore the hard dependency on the VisitorAPI service. This means that no URL destinations will be fired if the instance has no connection to VisitorAPI. If the VisitorAPI service is not instantiated, ID syncs will not be fired either.'); + var O = !0 === window._dil_unit_tests; + if ((u = e) && I.push(u + ''), !m || 'string' != typeof m) { + var S = { + name: 'error', + message: u = 'DIL partner is invalid or not specified in initConfig', + filename: 'dil.js' + }; + return DIL.errorModule.handleError(S), new Error(u); + } + if (u = 'DIL containerNSID is invalid or not specified in initConfig, setting to default of 0', !a && 'number' != typeof a || (a = parseInt(a, 10), !isNaN(a) && 0 <= a && (u = '')), u && (a = 0, I.push(u), u = ''), (r = DIL.getDil(m, a)) instanceof DIL && r.api.getPartner() === m && r.api.getContainerNSID() === a) + return r; + if (!(this instanceof DIL)) + return new DIL(n, 'DIL was not instantiated with the \'new\' operator, returning a valid instance with partner = ' + m + ' and containerNSID = ' + a); + DIL.registerDil(this, m, a); + var T = { + doesConsoleLogExist: window.console === Object(window.console) && 'function' == typeof window.console.log, + logMemo: {}, + log: function (e) { + I.push(e), v && this.doesConsoleLogExist && Function.prototype.bind.call(window.console.log, window.console).apply(window.console, arguments); + }, + logOnce: function (e) { + this.logMemo[e] || (this.logMemo[e] = !0, T.log(e)); + } + }, V = { + IS_HTTPS: p || 'https:' === document.location.protocol, + SIX_MONTHS_IN_MINUTES: 259200, + IE_VERSION: function () { + if (document.documentMode) + return document.documentMode; + for (var e = 7; 4 < e; e--) { + var t = document.createElement('div'); + if (t.innerHTML = '', t.getElementsByTagName('span').length) + return t = null, e; + } + return null; + }() + }; + V.IS_IE_LESS_THAN_10 = 'number' == typeof V.IE_VERSION && V.IE_VERSION < 10; + var L = { stuffed: {} }, A = {}, P = { + firingQueue: [], + fired: [], + firing: !1, + sent: [], + errored: [], + reservedKeys: { + sids: !0, + pdata: !0, + logdata: !0, + callback: !0, + postCallbackFn: !0, + useImageRequest: !0 + }, + firstRequestHasFired: !1, + abortRequests: !1, + num_of_cors_responses: 0, + num_of_cors_errors: 0, + corsErrorSources: [], + num_of_img_responses: 0, + num_of_img_errors: 0, + platformParams: { + d_nsid: a + '', + d_rtbd: 'json', + d_jsonv: DIL.jsonVersion + '', + d_dst: '1' + }, + nonModStatsParams: { + d_rtbd: !0, + d_dst: !0, + d_cts: !0, + d_rs: !0 + }, + modStatsParams: null, + adms: { + TIME_TO_CATCH_ALL_REQUESTS_RELEASE: 30000, + calledBack: !1, + mid: null, + noVisitorAPI: null, + VisitorAPI: null, + instance: null, + releaseType: 'no VisitorAPI', + isOptedOut: !0, + isOptedOutCallbackCalled: !1, + admsProcessingStarted: !1, + process: function (e) { + try { + if (this.admsProcessingStarted) + return; + this.admsProcessingStarted = !0; + var t, n, i, r = o; + if ('function' != typeof e || 'function' != typeof e.getInstance) + throw this.noVisitorAPI = !0, new Error('Visitor does not exist.'); + if (r !== Object(r) || !(t = r.namespace) || 'string' != typeof t) + throw this.releaseType = 'no namespace', new Error('DIL.create() needs the initConfig property `visitorService`:{namespace:\'\'}'); + if ((n = e.getInstance(t, { idSyncContainerID: a })) !== Object(n) || 'function' != typeof n.isAllowed || 'function' != typeof n.getMarketingCloudVisitorID || 'function' != typeof n.getCustomerIDs || 'function' != typeof n.isOptedOut || 'function' != typeof n.publishDestinations) + throw this.releaseType = 'invalid instance', i = 'Invalid Visitor instance.', n === Object(n) && 'function' != typeof n.publishDestinations && (i += ' In particular, visitorInstance.publishDestinations is not a function. This is needed to fire URL destinations in DIL v8.0+ and should be present in Visitor v3.3.0+ .'), new Error(i); + if (this.VisitorAPI = e, !n.isAllowed()) + return this.releaseType = 'VisitorAPI is not allowed to write cookies', void this.releaseRequests(); + this.instance = n, this.waitForMidToReleaseRequests(); + } catch (e) { + if (!D) + throw new Error('Error in processing Visitor API, which is a hard dependency for DIL v8.0+: ' + e.message); + this.releaseRequests(); + } + }, + waitForMidToReleaseRequests: function () { + var t = this; + this.instance && (this.instance.getMarketingCloudVisitorID(function (e) { + t.mid = e, t.releaseType = 'VisitorAPI', t.releaseRequests(); + }, !0), (!U.exists || !U.isIabContext && U.isApproved() || U.isIabContext && z.hasGoSignal()) && setTimeout(function () { + 'VisitorAPI' !== t.releaseType && (t.releaseType = 'timeout', t.releaseRequests()); + }, this.getLoadTimeout())); + }, + releaseRequests: function () { + this.calledBack = !0, P.registerRequest(); + }, + getMarketingCloudVisitorID: function () { + return this.instance ? this.instance.getMarketingCloudVisitorID() : null; + }, + getMIDQueryString: function () { + var e = N.isPopulatedString, t = this.getMarketingCloudVisitorID(); + return e(this.mid) && this.mid === t || (this.mid = t), e(this.mid) ? 'd_mid=' + this.mid + '&' : ''; + }, + getCustomerIDs: function () { + return this.instance ? this.instance.getCustomerIDs() : null; + }, + getCustomerIDsQueryString: function (e) { + if (e !== Object(e)) + return ''; + var t, n, i, r, a = '', s = [], o = []; + for (t in e) + e.hasOwnProperty(t) && (n = e[o[0] = t]) === Object(n) && (o[1] = n.id || '', o[2] = n.authState || 0, s.push(o), o = []); + if (r = s.length) + for (i = 0; i < r; i++) + a += '&d_cid_ic=' + F.encodeAndBuildRequest(s[i], '%01'); + return a; + }, + getIsOptedOut: function () { + this.instance ? this.instance.isOptedOut([ + this, + this.isOptedOutCallback + ], this.VisitorAPI.OptOut.GLOBAL, !0) : (this.isOptedOut = !1, this.isOptedOutCallbackCalled = !0); + }, + isOptedOutCallback: function (e) { + this.isOptedOut = e, this.isOptedOutCallbackCalled = !0, P.registerRequest(), U.isIabContext() && z.checkQueryStringObject(); + }, + getLoadTimeout: function () { + var e = this.instance; + if (e) { + if ('function' == typeof e.getLoadTimeout) + return e.getLoadTimeout(); + if (void 0 !== e.loadTimeout) + return e.loadTimeout; + } + return this.TIME_TO_CATCH_ALL_REQUESTS_RELEASE; + } + }, + declaredId: { + declaredId: { + init: null, + request: null + }, + declaredIdCombos: {}, + setDeclaredId: function (e, t) { + var n = N.isPopulatedString, i = encodeURIComponent; + if (e === Object(e) && n(t)) { + var r = e.dpid, a = e.dpuuid, s = null; + if (n(r) && n(a)) + return s = i(r) + '$' + i(a), !0 === this.declaredIdCombos[s] ? 'setDeclaredId: combo exists for type \'' + t + '\'' : (this.declaredIdCombos[s] = !0, this.declaredId[t] = { + dpid: r, + dpuuid: a + }, 'setDeclaredId: succeeded for type \'' + t + '\''); + } + return 'setDeclaredId: failed for type \'' + t + '\''; + }, + getDeclaredIdQueryString: function () { + var e = this.declaredId.request, t = this.declaredId.init, n = encodeURIComponent, i = ''; + return null !== e ? i = '&d_dpid=' + n(e.dpid) + '&d_dpuuid=' + n(e.dpuuid) : null !== t && (i = '&d_dpid=' + n(t.dpid) + '&d_dpuuid=' + n(t.dpuuid)), i; + } + }, + registerRequest: function (e) { + var t, n = this.firingQueue; + e === Object(e) && (n.push(e), e.isDefaultRequest || (k = !0)), this.firing || !n.length || d && !DIL.windowLoaded || (this.adms.isOptedOutCallbackCalled || this.adms.getIsOptedOut(), this.adms.calledBack && !this.adms.isOptedOut && this.adms.isOptedOutCallbackCalled && (U.isApproved() || z.hasGoSignal()) && (this.adms.isOptedOutCallbackCalled = !1, (t = n.shift()).src = t.src.replace(/&d_nsid=/, '&' + this.adms.getMIDQueryString() + z.getQueryString() + 'd_nsid='), N.isPopulatedString(t.corsPostData) && (t.corsPostData = t.corsPostData.replace(/^d_nsid=/, this.adms.getMIDQueryString() + z.getQueryString() + 'd_nsid=')), q.fireRequest(t), this.firstRequestHasFired || 'script' !== t.tag && 'cors' !== t.tag || (this.firstRequestHasFired = !0))); + }, + processVisitorAPI: function () { + this.adms.process(w || window.Visitor); + }, + getCoopQueryString: function () { + var e = ''; + return !0 === f ? e = '&d_coop_safe=1' : !1 === f && (e = '&d_coop_unsafe=1'), e; + } + }; + C.requestController = P; + var E, M, R = { + sendingMessages: !1, + messages: [], + messagesPosted: [], + destinations: [], + destinationsPosted: [], + jsonForComparison: [], + jsonDuplicates: [], + jsonWaiting: [], + jsonProcessed: [], + publishDestinationsVersion: null, + requestToProcess: function (e, t) { + function n() { + r.jsonForComparison.push(e), r.jsonWaiting.push([ + e, + t + ]); + } + var i, r = this; + if (e && !N.isEmptyObject(e)) + if (i = JSON.stringify(e.dests || []), this.jsonForComparison.length) { + var a, s, o, c = !1; + for (a = 0, s = this.jsonForComparison.length; a < s; a++) + if (o = this.jsonForComparison[a], i === JSON.stringify(o.dests || [])) { + c = !0; + break; + } + c ? this.jsonDuplicates.push(e) : n(); + } else + n(); + if (this.jsonWaiting.length) { + var l = this.jsonWaiting.shift(); + this.process(l[0], l[1]), this.requestToProcess(); + } + this.messages.length && !this.sendingMessages && this.sendMessages(); + }, + process: function (e) { + if (h) { + var t, n, i, r, a, s, o = encodeURIComponent, c = this.getPublishDestinationsVersion(), l = !1; + if (-1 !== c) { + if ((t = e.dests) && t instanceof Array && (n = t.length)) { + for (i = 0; i < n; i++) + r = t[i], s = [ + o('dests'), + o(r.id || ''), + o(r.y || ''), + o(r.c || '') + ].join('|'), this.addMessage(s), a = { + url: r.c, + hideReferrer: void 0 === r.hr || !!r.hr, + message: s + }, this.addDestination(a), void 0 !== r.hr && (l = !0); + 1 === c && l && T.logOnce('Warning: visitorInstance.publishDestinations version is old (Visitor v3.3.0 to v4.0.0). URL destinations will not have the option of being fired on page, only in the iframe.'); + } + this.jsonProcessed.push(e); + } + } + }, + addMessage: function (e) { + this.messages.push(e); + }, + addDestination: function (e) { + this.destinations.push(e); + }, + sendMessages: function () { + this.sendingMessages || (this.sendingMessages = !0, h && this.messages.length && this.publishDestinations()); + }, + publishDestinations: function () { + function e(e) { + T.log('visitor.publishDestinations() result: ' + (e.error || e.message)), n.sendingMessages = !1, n.requestToProcess(); + } + function t() { + n.messages = [], n.destinations = []; + } + var n = this, i = P.adms.instance, r = [], a = []; + return 1 === this.publishDestinationsVersion ? (F.extendArray(r, this.messages), F.extendArray(this.messagesPosted, this.messages), t(), i.publishDestinations(m, r, e), 'Called visitor.publishDestinations() version 1') : 1 < this.publishDestinationsVersion ? (F.extendArray(a, this.destinations), F.extendArray(this.destinationsPosted, this.destinations), t(), i.publishDestinations({ + subdomain: m, + callback: e, + urlDestinations: a + }), 'Called visitor.publishDestinations() version > 1') : void 0; + }, + getPublishDestinationsVersion: function () { + if (null !== this.publishDestinationsVersion) + return this.publishDestinationsVersion; + var e = P.adms.instance, n = -1; + return e.publishDestinations(null, null, function (e) { + if (e === Object(e)) { + var t = e.error; + 'subdomain is not a populated string.' === t ? n = 1 : 'Invalid parameters passed.' === t && (n = 2); + } + }), this.publishDestinationsVersion = n; + } + }, j = { + traits: function (e) { + return N.isValidPdata(e) && (A.sids instanceof Array || (A.sids = []), F.extendArray(A.sids, e)), this; + }, + pixels: function (e) { + return N.isValidPdata(e) && (A.pdata instanceof Array || (A.pdata = []), F.extendArray(A.pdata, e)), this; + }, + logs: function (e) { + return N.isValidLogdata(e) && (A.logdata !== Object(A.logdata) && (A.logdata = {}), F.extendObject(A.logdata, e)), this; + }, + customQueryParams: function (e) { + return N.isEmptyObject(e) || F.extendObject(A, e, P.reservedKeys), this; + }, + signals: function (e, t) { + var n, i = e; + if (!N.isEmptyObject(i)) { + if (t && 'string' == typeof t) + for (n in (i = {}, e)) + e.hasOwnProperty(n) && (i[t + n] = e[n]); + F.extendObject(A, i, P.reservedKeys); + } + return this; + }, + declaredId: function (e) { + return P.declaredId.setDeclaredId(e, 'request'), this; + }, + result: function (e) { + return 'function' == typeof e && (A.callback = e), this; + }, + afterResult: function (e) { + return 'function' == typeof e && (A.postCallbackFn = e), this; + }, + useImageRequest: function () { + return A.useImageRequest = !0, this; + }, + clearData: function () { + return A = {}, this; + }, + submit: function (e) { + return A.isDefaultRequest = !!e, q.submitRequest(A), A = {}, this; + }, + getPartner: function () { + return m; + }, + getContainerNSID: function () { + return a; + }, + getEventLog: function () { + return I; + }, + getState: function () { + var e = {}, t = {}; + return F.extendObject(e, P, { registerRequest: !0 }), F.extendObject(t, R, { + requestToProcess: !0, + process: !0, + sendMessages: !0 + }), { + initConfig: n, + pendingRequest: A, + otherRequestInfo: e, + destinationPublishingInfo: t, + log: I + }; + }, + idSync: function () { + throw new Error('Please use the `idSyncByURL` method of the Experience Cloud ID Service (Visitor) instance'); + }, + aamIdSync: function () { + throw new Error('Please use the `idSyncByDataSource` method of the Experience Cloud ID Service (Visitor) instance'); + }, + passData: function (e) { + return N.isEmptyObject(e) ? 'Error: json is empty or not an object' : (q.defaultCallback(e), e); + }, + getPlatformParams: function () { + return P.platformParams; + }, + getEventCallConfigParams: function () { + var e, t = P, n = t.modStatsParams, i = t.platformParams; + if (!n) { + for (e in (n = {}, i)) + i.hasOwnProperty(e) && !t.nonModStatsParams[e] && (n[e.replace(/^d_/, '')] = i[e]); + !0 === f ? n.coop_safe = 1 : !1 === f && (n.coop_unsafe = 1), t.modStatsParams = n; + } + return n; + }, + setAsCoopSafe: function () { + return f = !0, this; + }, + setAsCoopUnsafe: function () { + return f = !1, this; + }, + getEventCallIabSignals: function (e) { + var t; + return e !== Object(e) ? 'Error: config is not an object' : 'function' != typeof e.callback ? 'Error: config.callback is not a function' : (t = parseInt(e.timeout, 10), isNaN(t) && (t = null), void z.getQueryStringObject(e.callback, t)); + } + }, q = { + corsMetadata: (E = 'none', 'undefined' != typeof XMLHttpRequest && XMLHttpRequest === Object(XMLHttpRequest) && 'withCredentials' in new XMLHttpRequest() && (E = 'XMLHttpRequest'), { corsType: E }), + getCORSInstance: function () { + return 'none' === this.corsMetadata.corsType ? null : new window[this.corsMetadata.corsType](); + }, + submitRequest: function (e) { + return P.registerRequest(q.createQueuedRequest(e)), !0; + }, + createQueuedRequest: function (e) { + var t, n, i, r, a, s = e.callback, o = 'img', c = e.isDefaultRequest; + if (delete e.isDefaultRequest, !N.isEmptyObject(l)) + for (i in l) + if (l.hasOwnProperty(i)) { + if (null == (r = l[i]) || '' === r) + continue; + if (i in e && !(r in e) && !(r in P.reservedKeys)) { + if (null == (a = e[i]) || '' === a) + continue; + e[r] = a; + } + } + return N.isValidPdata(e.sids) || (e.sids = []), N.isValidPdata(e.pdata) || (e.pdata = []), N.isValidLogdata(e.logdata) || (e.logdata = {}), e.logdataArray = F.convertObjectToKeyValuePairs(e.logdata, '=', !0), e.logdataArray.push('_ts=' + new Date().getTime()), 'function' != typeof s && (s = this.defaultCallback), t = this.makeRequestSrcData(e), (n = this.getCORSInstance()) && !0 !== e.useImageRequest && (o = 'cors'), { + tag: o, + src: t.src, + corsSrc: t.corsSrc, + callbackFn: s, + postCallbackFn: e.postCallbackFn, + useImageRequest: !!e.useImageRequest, + requestData: e, + corsInstance: n, + corsPostData: t.corsPostData, + isDefaultRequest: c + }; + }, + defaultCallback: function (e, t) { + var n, i, r, a, s, o, c, l, u; + if (_ && (n = e.stuff) && n instanceof Array && (i = n.length)) + for (r = 0; r < i; r++) + (a = n[r]) && a === Object(a) && (s = a.cn, o = a.cv, void 0 !== (c = a.ttl) && '' !== c || (c = Math.floor(F.getMaxCookieExpiresInMinutes() / 60 / 24)), l = a.dmn || '.' + document.domain.replace(/^www\./, ''), u = a.type, s && (o || 'number' == typeof o) && ('var' !== u && (c = parseInt(c, 10)) && !isNaN(c) && F.setCookie(s, o, 24 * c * 60, '/', l, !1), L.stuffed[s] = o)); + var d, p, f = e.uuid; + N.isPopulatedString(f) && (N.isEmptyObject(g) || ('string' == typeof (d = g.path) && d.length || (d = '/'), p = parseInt(g.days, 10), isNaN(p) && (p = 100), F.setCookie(g.name || 'aam_did', f, 24 * p * 60, d, g.domain || '.' + document.domain.replace(/^www\./, ''), !0 === g.secure))), P.abortRequests || R.requestToProcess(e, t); + }, + makeRequestSrcData: function (a) { + a.sids = N.removeEmptyArrayValues(a.sids || []), a.pdata = N.removeEmptyArrayValues(a.pdata || []); + var s = P, e = s.platformParams, t = F.encodeAndBuildRequest(a.sids, ','), n = F.encodeAndBuildRequest(a.pdata, ','), i = (a.logdataArray || []).join('&'); + delete a.logdataArray; + var r, o, c = encodeURIComponent, l = V.IS_HTTPS ? 'https://' : 'http://', u = s.declaredId.getDeclaredIdQueryString(), d = s.adms.instance ? s.adms.getCustomerIDsQueryString(s.adms.getCustomerIDs()) : '', p = function () { + var e, t, n, i, r = []; + for (e in a) + if (!(e in s.reservedKeys) && a.hasOwnProperty(e)) + if (t = a[e], e = c(e), t instanceof Array) + for (n = 0, i = t.length; n < i; n++) + r.push(e + '=' + c(t[n])); + else + r.push(e + '=' + c(t)); + return r.length ? '&' + r.join('&') : ''; + }(), f = 'd_dil_ver=' + c(DIL.version), g = 'd_nsid=' + e.d_nsid + s.getCoopQueryString() + u + d + (t.length ? '&d_sid=' + t : '') + (n.length ? '&d_px=' + n : '') + (i.length ? '&d_ld=' + c(i) : ''), v = '&d_rtbd=' + e.d_rtbd + '&d_jsonv=' + e.d_jsonv + '&d_dst=' + e.d_dst, h = b ? '&h_referer=' + c(location.href) : ''; + return o = (r = l + m + '.demdex.net/event') + '?' + f + '&' + g + v + p + h, { + corsSrc: r + '?' + f + '&_ts=' + new Date().getTime(), + src: o, + corsPostData: g + v + p + h, + isDeclaredIdCall: '' !== u + }; + }, + fireRequest: function (e) { + if ('img' === e.tag) + this.fireImage(e); + else { + var t = P.declaredId, n = t.declaredId.request || t.declaredId.init || {}, i = { + dpid: n.dpid || '', + dpuuid: n.dpuuid || '' + }; + this.fireCORS(e, i); + } + }, + fireImage: function (t) { + var e, n, i = P; + i.abortRequests || (i.firing = !0, e = new Image(0, 0), i.sent.push(t), e.onload = function () { + i.firing = !1, i.fired.push(t), i.num_of_img_responses++, i.registerRequest(); + }, n = function (e) { + u = 'imgAbortOrErrorHandler received the event of type ' + e.type, T.log(u), i.abortRequests = !0, i.firing = !1, i.errored.push(t), i.num_of_img_errors++, i.registerRequest(); + }, e.addEventListener('error', n), e.addEventListener('abort', n), e.src = t.src); + }, + fireCORS: function (i, r) { + var a = this, s = P, e = this.corsMetadata.corsType, t = i.corsSrc, n = i.corsInstance, o = i.corsPostData, c = i.postCallbackFn, l = 'function' == typeof c; + if (!s.abortRequests && !x) { + s.firing = !0; + try { + n.open('post', t, !0), 'XMLHttpRequest' === e && (n.withCredentials = !0, n.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'), n.onreadystatechange = function () { + 4 === this.readyState && 200 === this.status && function (e) { + var t; + try { + if ((t = JSON.parse(e)) !== Object(t)) + return a.handleCORSError(i, r, 'Response is not JSON'); + } catch (e) { + return a.handleCORSError(i, r, 'Error parsing response as JSON'); + } + try { + var n = i.callbackFn; + s.firing = !1, s.fired.push(i), s.num_of_cors_responses++, n(t, r), l && c(t, r); + } catch (e) { + e.message = 'DIL handleCORSResponse caught error with message ' + e.message, u = e.message, T.log(u), e.filename = e.filename || 'dil.js', e.partner = m, DIL.errorModule.handleError(e); + try { + n({ error: e.name + '|' + e.message }, r), l && c({ error: e.name + '|' + e.message }, r); + } catch (e) { + } + } finally { + s.registerRequest(); + } + }(this.responseText); + }), n.onerror = function () { + a.handleCORSError(i, r, 'onerror'); + }, n.ontimeout = function () { + a.handleCORSError(i, r, 'ontimeout'); + }, n.send(o); + } catch (e) { + this.handleCORSError(i, r, 'try-catch'); + } + s.sent.push(i), s.declaredId.declaredId.request = null; + } + }, + handleCORSError: function (e, t, n) { + P.num_of_cors_errors++, P.corsErrorSources.push(n); + } + }, N = { + isValidPdata: function (e) { + return !!(e instanceof Array && this.removeEmptyArrayValues(e).length); + }, + isValidLogdata: function (e) { + return !this.isEmptyObject(e); + }, + isEmptyObject: function (e) { + if (e !== Object(e)) + return !0; + var t; + for (t in e) + if (e.hasOwnProperty(t)) + return !1; + return !0; + }, + removeEmptyArrayValues: function (e) { + var t, n = 0, i = e.length, r = []; + for (n = 0; n < i; n++) + null != (t = e[n]) && '' !== t && r.push(t); + return r; + }, + isPopulatedString: function (e) { + return 'string' == typeof e && e.length; + } + }, F = { + convertObjectToKeyValuePairs: function (e, t, n) { + var i, r, a = []; + for (i in (t = t || '=', e)) + e.hasOwnProperty(i) && null != (r = e[i]) && '' !== r && a.push(i + t + (n ? encodeURIComponent(r) : r)); + return a; + }, + encodeAndBuildRequest: function (e, t) { + return e.map(function (e) { + return encodeURIComponent(e); + }).join(t); + }, + getCookie: function (e) { + var t, n, i, r = e + '=', a = document.cookie.split(';'); + for (t = 0, n = a.length; t < n; t++) { + for (i = a[t]; ' ' === i.charAt(0);) + i = i.substring(1, i.length); + if (0 === i.indexOf(r)) + return decodeURIComponent(i.substring(r.length, i.length)); + } + return null; + }, + setCookie: function (e, t, n, i, r, a) { + var s = new Date(); + n = n && 1000 * n * 60, document.cookie = e + '=' + encodeURIComponent(t) + (n ? ';expires=' + new Date(s.getTime() + n).toUTCString() : '') + (i ? ';path=' + i : '') + (r ? ';domain=' + r : '') + (a ? ';secure' : ''); + }, + extendArray: function (e, t) { + return e instanceof Array && t instanceof Array && (Array.prototype.push.apply(e, t), !0); + }, + extendObject: function (e, t, n) { + var i; + if (e !== Object(e) || t !== Object(t)) + return !1; + for (i in t) + if (t.hasOwnProperty(i)) { + if (!N.isEmptyObject(n) && i in n) + continue; + e[i] = t[i]; + } + return !0; + }, + getMaxCookieExpiresInMinutes: function () { + return V.SIX_MONTHS_IN_MINUTES; + }, + replaceMethodsWithFunction: function (e, t) { + var n; + if (e === Object(e) && 'function' == typeof t) + for (n in e) + e.hasOwnProperty(n) && 'function' == typeof e[n] && (e[n] = t); + } + }, U = (M = C.requestController, { + exists: null, + instance: null, + aamIsApproved: null, + init: function () { + var e = this; + this.checkIfExists() ? (this.exists = !0, this.instance = window.adobe.optIn, this.instance.fetchPermissions(function () { + e.callback(); + }, !0)) : this.exists = !1; + }, + checkIfExists: function () { + return window.adobe === Object(window.adobe) && window.adobe.optIn === Object(window.adobe.optIn); + }, + callback: function () { + this.aamIsApproved = this.instance.isApproved([this.instance.Categories.AAM]), M.adms.waitForMidToReleaseRequests(), M.adms.getIsOptedOut(); + }, + isApproved: function () { + return !this.isIabContext() && !M.adms.isOptedOut && (!this.exists || this.aamIsApproved); + }, + isIabContext: function () { + return this.instance && this.instance.isIabContext; + } + }); + C.optIn = U; + var B, H, G, Q, z = (H = (B = C).requestController, G = B.optIn, Q = { + isVendorConsented: null, + doesGdprApply: null, + consentString: null, + queryStringObjectCallbacks: [], + init: function () { + this.fetchConsentData(); + }, + hasGoSignal: function () { + return !(!(G.isIabContext() && this.isVendorConsented && this.doesGdprApply && 'string' == typeof this.consentString && this.consentString.length) || H.adms.isOptedOut); + }, + fetchConsentData: function (n, e) { + var i = this, t = {}; + 'function' != typeof n && (n = function () { + }), G.instance && G.isIabContext() ? (e && (t.timeout = e), G.instance.execute({ + command: 'iabPlugin.fetchConsentData', + params: t, + callback: function (e, t) { + t === Object(t) ? (i.doesGdprApply = !!t.gdprApplies, i.consentString = t.consentString || '') : (i.doesGdprApply = !1, i.consentString = ''), i.isVendorConsented = G.instance.isApproved(G.instance.Categories.AAM), e ? n({}) : i.checkQueryStringObject(n), H.adms.waitForMidToReleaseRequests(); + } + })) : n({}); + }, + getQueryString: function () { + return G.isIabContext() ? 'gdpr=' + (this.doesGdprApply ? 1 : 0) + '&gdpr_consent=' + this.consentString + '&' : ''; + }, + getQueryStringObject: function (e, t) { + this.fetchConsentData(e, t); + }, + checkQueryStringObject: function (e) { + Q.hasGoSignal() && 'function' == typeof e && e({ + gdpr: this.doesGdprApply ? 1 : 0, + gdpr_consent: this.consentString + }); + } + }); + C.iab = z, 'error' === m && 0 === a && window.addEventListener('load', function () { + DIL.windowLoaded = !0; + }); + var W = !1, Y = function () { + setTimeout(function () { + k || P.firstRequestHasFired || ('function' == typeof y ? j.afterResult(y).submit(!0) : j.submit(!0)); + }, DIL.constants.TIME_TO_DEFAULT_REQUEST); + }, K = document; + 'error' !== m && (DIL.windowLoaded ? i() : 'complete' !== K.readyState && 'loaded' !== K.readyState ? window.addEventListener('load', function () { + DIL.windowLoaded = !0, i(); + }) : (DIL.windowLoaded = !0, i())), P.declaredId.setDeclaredId(c, 'init'), U.init(), z.init(), P.processVisitorAPI(), V.IS_IE_LESS_THAN_10 && F.replaceMethodsWithFunction(j, function () { + return this; + }), this.api = j, this.getStuffedVariable = function (e) { + var t = L.stuffed[e]; + return t || 'number' == typeof t || (t = F.getCookie(e)) || 'number' == typeof t || (t = ''), t; + }, this.validators = N, this.helpers = F, this.constants = V, this.log = I, this.pendingRequest = A, this.requestController = P, this.destinationPublishing = R, this.requestProcs = q, this.units = C, this.initConfig = n, this.logger = T, O && (this.variables = L, this.callWindowLoadFunctions = i); + }.apply(this, arguments); + } finally { + if ($___old_e335e0c87fa75cc9) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_e335e0c87fa75cc9)); + if ($___old_137bae8e4712efe2) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_137bae8e4712efe2)); + } + }, DIL.extendStaticPropertiesAndMethods = function (e) { + var t; + if (e === Object(e)) + for (t in e) + e.hasOwnProperty(t) && (this[t] = e[t]); + }, DIL.extendStaticPropertiesAndMethods({ + version: '9.4', + jsonVersion: 1, + constants: { TIME_TO_DEFAULT_REQUEST: 500 }, + variables: { scriptNodeList: document.getElementsByTagName('script') }, + windowLoaded: !1, + dils: {}, + isAddedPostWindowLoad: function (e) { + var t = e; + this.windowLoaded = 'function' == typeof t ? !!t() : 'boolean' != typeof t || t; + }, + create: function (e) { + try { + return new DIL(e); + } catch (e) { + throw new Error('Error in attempt to create DIL instance with DIL.create(): ' + e.message); + } + }, + registerDil: function (e, t, n) { + var i = t + '$' + n; + i in this.dils || (this.dils[i] = e); + }, + getDil: function (e, t) { + var n; + return 'string' != typeof e && (e = ''), (n = e + '$' + (t = t || 0)) in this.dils ? this.dils[n] : new Error('The DIL instance with partner = ' + e + ' and containerNSID = ' + t + ' was not found'); + }, + dexGetQSVars: function (e, t, n) { + var i = this.getDil(t, n); + return i instanceof this ? i.getStuffedVariable(e) : ''; + } + }), DIL.errorModule = (a = DIL.create({ + partner: 'error', + containerNSID: 0, + ignoreHardDependencyOnVisitorAPI: !0 + }), o = !(s = { + harvestererror: 14138, + destpuberror: 14139, + dpmerror: 14140, + generalerror: 14137, + error: 14137, + noerrortypedefined: 15021, + evalerror: 15016, + rangeerror: 15017, + referenceerror: 15018, + typeerror: 15019, + urierror: 15020 + }), { + activate: function () { + o = !0; + }, + handleError: function (e) { + if (!o) + return 'DIL error module has not been activated'; + e !== Object(e) && (e = {}); + var t = e.name ? (e.name + '').toLowerCase() : '', n = t in s ? s[t] : s.noerrortypedefined, i = [], r = { + name: t, + filename: e.filename ? e.filename + '' : '', + partner: e.partner ? e.partner + '' : 'no_partner', + site: e.site ? e.site + '' : document.location.href, + message: e.message ? e.message + '' : '' + }; + return i.push(n), a.api.pixels(i).logs(r).useImageRequest().submit(), 'DIL error report sent'; + }, + pixelMap: s + }), DIL.tools = {}, DIL.modules = { helpers: {} }); + }(), AppMeasurement.getInstance = s_gi, window.s_objectID || (window.s_objectID = 0), s_pgicq(), fdx_initSCode(); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-apstag.js b/resources/sugarcoat-apstag.js new file mode 100644 index 00000000..86bd5aa8 --- /dev/null +++ b/resources/sugarcoat-apstag.js @@ -0,0 +1,5711 @@ +{ + const $___mock_ba1c6ba55dfe66f1 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_ba1c6ba55dfe66f1); + const $___mock_c4607d10b0acbf6b = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_c4607d10b0acbf6b); + (function () { + !function (t) { + var e = {}; + function n(r) { + if (e[r]) + return e[r].exports; + var i = e[r] = { + i: r, + l: !1, + exports: {} + }; + return t[r].call(i.exports, i, i.exports, n), i.l = !0, i.exports; + } + n.m = t, n.c = e, n.d = function (t, e, r) { + n.o(t, e) || Object.defineProperty(t, e, { + enumerable: !0, + get: r + }); + }, n.r = function (t) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(t, '__esModule', { value: !0 }); + }, n.t = function (t, e) { + if (1 & e && (t = n(t)), 8 & e) + return t; + if (4 & e && 'object' == typeof t && t && t.__esModule) + return t; + var r = Object.create(null); + if (n.r(r), Object.defineProperty(r, 'default', { + enumerable: !0, + value: t + }), 2 & e && 'string' != typeof t) + for (var i in t) + n.d(r, i, function (e) { + return t[e]; + }.bind(null, i)); + return r; + }, n.n = function (t) { + var e = t && t.__esModule ? function () { + return t.default; + } : function () { + return t; + }; + return n.d(e, 'a', e), e; + }, n.o = function (t, e) { + return Object.prototype.hasOwnProperty.call(t, e); + }, n.p = '', n(n.s = 26); + }([ + function (t, e, n) { + 'use strict'; + function r(t) { + return (r = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function i(t) { + try { + var e = parseInt(t, 10); + if (!isNaN(e)) + return !(e <= 0) && (100 <= e || 100 * Math.random() <= e); + } catch (t) { + } + return !1; + } + function o(t, e) { + var n = parseInt(e, 10), r = [], i = 0; + if (!u(t)) + return r; + if (isNaN(n) || n < 1) + return [t]; + for (var o = t.length; i < o;) { + var c = i; + i += n, r.push(t.slice(c, i)); + } + return r; + } + function c() { + return ''.concat(Math.round(1000000000000 * Math.random())).concat(Date.now()); + } + function a(t) { + for (var e = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', n = new Array(t), r = 0; r < t; r++) + n[r] = e[Math.floor(Math.random() * e.length)]; + return n.join(''); + } + function s(t) { + return 'object' === r(t) && null !== t; + } + function u(t) { + return '[object Array]' === Object.prototype.toString.call(t); + } + function d(t, e) { + return s(t) && void 0 !== t[e] && '' !== t[e]; + } + function f() { + const $___old_72df7137a3b242c5 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_72df7137a3b242c5) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_ba1c6ba55dfe66f1.localStorage)); + return function () { + var t = 'amzn_lsTest'; + try { + return window.localStorage.setItem(t, t), window.localStorage.removeItem(t), !0; + } catch (t) { + return !1; + } + }.apply(this, arguments); + } finally { + if ($___old_72df7137a3b242c5) + ({}.constructor.defineProperty(window, 'localStorage', $___old_72df7137a3b242c5)); + } + } + function b(t, e) { + return -1 !== t.indexOf(e); + } + function l() { + return document.cookie.split('; ').map(function (t) { + return t.split('='); + }); + } + function p(t) { + var e = new Date(); + return e.setDate(e.getDate() + t), e.toUTCString(); + } + function m(t) { + try { + var e = t.innerWidth || t.document.documentElement.clientWidth || t.document.body.clientWidth, n = t.innerHeight || t.document.documentElement.clientHeight || t.document.body.clientHeight; + return ''.concat(e, 'x').concat(n); + } catch (t) { + } + return 'x'; + } + function g(t, e) { + return decodeURIComponent(t).split('?')[0].split('#')[0] === decodeURIComponent(e).split('?')[0].split('#')[0]; + } + function y(t) { + var e = Object.keys(t); + return e.filter(function (e) { + return t[e]; + }).length === e.length; + } + n.d(e, 'n', function () { + return i; + }), n.d(e, 'c', function () { + return o; + }), n.d(e, 'e', function () { + return c; + }), n.d(e, 'f', function () { + return a; + }), n.d(e, 'l', function () { + return s; + }), n.d(e, 'k', function () { + return u; + }), n.d(e, 'm', function () { + return d; + }), n.d(e, 'i', function () { + return f; + }), n.d(e, 'j', function () { + return b; + }), n.d(e, 'd', function () { + return l; + }), n.d(e, 'g', function () { + return p; + }), n.d(e, 'h', function () { + return m; + }), n.d(e, 'b', function () { + return g; + }), n.d(e, 'a', function () { + return y; + }); + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return d; + }), n.d(e, 'c', function () { + return f; + }), n.d(e, 'd', function () { + return b; + }), n.d(e, 'a', function () { + return l; + }); + var r = n(0), i = n(3), o = n(2), c = n(5), a = n(6), s = Object(r.n)(10), u = []; + function d(t, e) { + var n = 2 < arguments.length && void 0 !== arguments[2] && arguments[2]; + try { + (n || Object(c.d)('errors')) && console.error(t); + var r = { + ts: Date.now(), + url: encodeURIComponent(Object(a.g)(window)), + r: encodeURIComponent(Object(a.h)(window)), + _type: 'apsLibraryError', + e: { + et: t.name, + el: e, + msg: t.message + } + }; + return u.push(r), o.a.dispatch({ + type: 'LOG_ERROR', + error: r + }), !!s && (Object(i.b)(r), !0); + } catch (t) { + console.error(t); + } + return !1; + } + function f(t, e, n) { + var r = !(3 < arguments.length && void 0 !== arguments[3]) || arguments[3]; + return d({ + name: e, + message: ''.concat(t, ' was of type \'').concat(e, '\' instead of \'').concat(n, '\'') + }, 'TypeError-'.concat(t), r); + } + function b(t, e) { + return function () { + try { + return t.apply(null, arguments); + } catch (t) { + return d(t, e, !0), null; + } + }; + } + function l(t) { + (1 < arguments.length && void 0 !== arguments[1] && arguments[1] || Object(c.d)('errors')) && console.warn(t); + } + !0 === Object(c.c)('exposeErrors') && (window.apstagErrors = u); + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return l; + }); + var r, i = n(4), o = n(0), c = n(5); + function a(t, e) { + var n = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(t); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function s(t) { + for (var e = 1; e < arguments.length; e++) { + var n = null != arguments[e] ? arguments[e] : {}; + e % 2 ? a(Object(n), !0).forEach(function (e) { + u(t, e, n[e]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : a(Object(n)).forEach(function (e) { + Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(n, e)); + }); + } + return t; + } + function u(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + function d(t) { + return function (t) { + if (Array.isArray(t)) + return f(t); + }(t) || function (t) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(t)) + return Array.from(t); + }(t) || function (t, e) { + if (t) { + if ('string' == typeof t) + return f(t, e); + var n = Object.prototype.toString.call(t).slice(8, -1); + return 'Object' === n && t.constructor && (n = t.constructor.name), 'Map' === n || 'Set' === n ? Array.from(t) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? f(t, e) : void 0; + } + }(t) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function f(t, e) { + (null == e || e > t.length) && (e = t.length); + for (var n = 0, r = new Array(e); n < e; n++) + r[n] = t[n]; + return r; + } + function b() { + var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : { + AAXReqs: [], + aaxViewabilityEnabled: !1, + bidConfigs: {}, + bidReqs: {}, + bsPixels: {}, + cfg: { + v: -1, + CSM_JS: '//c.amazon-adsystem.com/aax2/csm.js.gz', + CSM_RTB_COMMUNICATOR_JS: '//c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js', + DEBUG_APP_HTML: '//c.amazon-adsystem.com/aax2/debugApp.html', + DEBUG_APP_HTML_V2: '//c.amazon-adsystem.com/aax2/debug_app_v2.html', + DEFAULT_TIMEOUT: 2000, + DTB_PATH: '/e/dtb', + TEST_PATH_FREQUENCY: 0, + TEST_BID_ENDPOINT: null, + TEST_PATH_LATENCY_SAMPLE_RATE: null, + PIXEL_PATH: '/x/px/', + LATENCY_SAMPLING_RATE: 1, + COOKIE_MATCH_DELAY: 0, + MAX_SLOTS_PER_REQUEST: 1, + CF_ROUTING_RATE: 100, + SLOT_RENDER_SAMPLING_RATE: 1, + FEATURE_SAMPLING_RATE: 1, + CONFIG_CALL_ENABLED: !1, + LIB_CONFIG_PATH: '/cdn/prod/config' + }, + cmpFired: !1, + config: { pubID: '' }, + displayAdServer: { + noBidSlotIDs: [], + shouldSampleRender: !1, + slotRenderEndedSet: !1 + }, + errors: [], + eventLog: [], + experiments: {}, + gamSlotFetchLog: [], + gamSlotRenderPixel: { + aaxReqOffset: 0, + gamSlotFetchLogOffset: 0 + }, + hosts: { + DEFAULT_AAX_BID_HOST: 'aax.amazon-adsystem.com', + DEFAULT_AAX_PIXEL_HOST: 'aax.amazon-adsystem.com' + }, + identityState: {}, + libraryLoadCallLatency: 0, + Q: [], + slotBids: {}, + slotIdMap: [], + sync917: !1, + targetingKeys: {} + }, e = 1 < arguments.length ? arguments[1] : void 0; + return { + AAXReqs: function (t, e) { + switch (e.type) { + case 'RECORD_AAX_REQUEST': + return [].concat(d(t), [e.data]); + case 'RECORD_AAX_REQ_PROP': + return t.map(function (t) { + return (t = s({}, t)).bidReqID === e.bidReqID && (t[e.key] = e.value), t; + }); + default: + return d(t); + } + }(t.AAXReqs, e), + aaxViewabilityEnabled: function (t, e) { + switch (e.type) { + case 'SET_VIEWABILITY': + return e.viewability; + default: + return t; + } + }(t.aaxViewabilityEnabled, e), + bidConfigs: function (t, e) { + switch (e.type) { + case 'RECORD_ORIGINAL_BID_CONFIG': + return s(s({}, t), {}, u({}, e.bidConfig.bidReqID, e.bidConfig)); + default: + return s({}, t); + } + }(t.bidConfigs, e), + bidReqs: function (t, e) { + var n; + switch (e.type) { + case 'ADD_CHUNKED_REQUESTS': + return s(s({}, t), {}, u({}, e.fid, s(s({}, t[e.fid]), {}, { networkReqs: new Array(e.numChunks) }))); + case 'NEW_FETCH_BID_REQUEST': + return s(s({}, t), {}, u({}, e.fid, { + pto: e.pto, + hasCallbackExecuted: !1, + networkReqs: [] + })); + case 'RECORD_CALLBACK': + return s(s({}, t), {}, u({}, e.fid, s(s({}, t[e.fid]), {}, { hasCallbackExecuted: !0 }))); + case 'RECORD_NETWORK_EXCHANGE': + var r = t[e.fid].networkReqs; + return r[e.networkID] = s(s({}, r[e.networkID]), {}, (u(n = {}, ''.concat(e.exchangeType, 'Time'), e.timestamp), u(n, 'inFlight', 'request' === e.exchangeType), n)), s(s({}, t), {}, u({}, e.fid, s(s({}, t[e.fid]), {}, { networkReqs: r }))); + case 'RECORD_TIMEOUT': + return s(s({}, t), {}, u({}, e.fid, s(s({}, t[e.fid]), {}, { + networkReqs: t[e.fid].networkReqs.map(function (t) { + return t.inFlight ? s(s({}, t), {}, { timeOut: e.timeOut }) : t; + }) + }))); + default: + return s({}, t); + } + }(t.bidReqs, e), + bsPixels: function (t, e) { + switch (e.type) { + case 'RECORD_BID_INFO_SENT': + return s(s({}, t), {}, u({}, e.bidInfo.iid, e.bidInfo.state)); + default: + return s({}, t); + } + }(t.bsPixels, e), + cfg: function (t, e) { + switch (e.type) { + case 'SET_CFG': + return s(s({}, t), e.cfg); + default: + return s({}, t); + } + }(t.cfg, e), + cmpFired: function (t, e) { + switch (e.type) { + case 'CMP_FIRED': + return !0; + default: + return t; + } + }(t.cmpFired, e), + config: function (t, e) { + switch (e.type) { + case 'SET_CONFIG': + return s(s({}, e.config), {}, { + gdpr: s({ cmpTimeout: e.defaultCmpTimeout }, e.config.gdpr), + isSelfServePub: void 0 !== e.config.pubID && 5 <= e.config.pubID.length + }); + default: + return s({}, t); + } + }(t.config, e), + displayAdServer: function (t, e) { + switch (e.type) { + case 'SLOT_RENDER_ENDED_SET': + return s(s({}, t), {}, { slotRenderEndedSet: !0 }); + case 'NO_BID_ON_ADSERVER_SLOTS': + return s(s({}, t), {}, { noBidSlotIDs: t.noBidSlotIDs.concat(e.slotIDs) }); + case 'REQUESTED_BID_FOR_ADSERVER_SLOTS': + return s(s({}, t), {}, { + noBidSlotIDs: t.noBidSlotIDs.filter(function (t) { + return !Object(o.j)(e.slotIDs, t); + }) + }); + case 'SHOULD_SAMPLE_SLOT_RENDER': + return s(s({}, t), {}, { shouldSampleRender: e.value }); + default: + return s(s({}, t), {}, { noBidSlotIDs: d(t.noBidSlotIDs) }); + } + }(t.displayAdServer, e), + errors: function (t, e) { + switch (e.type) { + case 'LOG_ERROR': + return [].concat(d(t), [s({}, e.error)]); + default: + return d(t); + } + }(t.errors, e), + eventLog: function (t, e) { + switch (e.type) { + case 'LOG_EVENT': + return [].concat(d(t), [s({}, e.event)]); + default: + return d(t); + } + }(t.eventLog, e), + experiments: function (t, e) { + switch (e.type) { + case 'SHOULD_CHUNK_REQUESTS': + return s({ chunkRequests: !0 === t.shouldSampleLatency && e.value }, t); + case 'SHOULD_CF_ROUTE': + return s(s({}, t), {}, { shouldCFRoute: e.value }); + case 'SHOULD_SAMPLE_LATENCY': + return s(s({}, t), {}, { shouldSampleLatency: e.value }); + case 'SHOULD_SAMPLE_FEATURES': + return s(s({}, t), {}, { shouldSampleFeatures: e.value }); + case 'SHOULD_USE_TEST_BID_ENDPOINT': + return s(s({}, t), {}, { shouldUseTestBidEndpoint: e.value }); + default: + return s({}, t); + } + }(t.experiments, e), + gamSlotFetchLog: function (t, e) { + switch (e.type) { + case 'LOG_GAM_EVENT': + return [].concat(d(t), [s({}, e.event)]); + default: + return d(t); + } + }(t.gamSlotFetchLog, e), + gamSlotRenderPixel: function (t, e) { + switch (e.type) { + case 'UPDATE_RENDER_OFFSETS': + return s(s({}, t), e.offsets); + default: + return s({}, t); + } + }(t.gamSlotRenderPixel, e), + hosts: function (t, e) { + switch (e.type) { + case 'SET_HOST': + return s(s({}, t), {}, u({}, e.hostName, e.hostValue)); + default: + return s({}, t); + } + }(t.hosts, e), + identityState: function (t, e) { + switch (e.type) { + case 'RECORD_IDENTITY_STATE': + return s(s({}, t), {}, u({}, e.vendor, Object(o.m)(t, e.vendor) ? t[e.vendor] : e.identityState)); + default: + return t; + } + }(t.identityState, e), + libraryLoadCallLatency: function (t, e) { + switch (e.type) { + case 'RECORD_LIBRARY_LOAD_CALL_LATENCY': + return e.latency; + default: + return t; + } + }(t.libraryLoadCallLatency, e), + Q: function (t, e) { + switch (e.type) { + case 'SET_Q': + return d(e.Q); + default: + return d(t); + } + }(t.Q, e), + slotBids: function (t, e) { + switch (e.type) { + case 'BID_STATE_CHANGE': + return s(s({}, t), {}, u({}, e.slotID, t[e.slotID].map(function (t) { + return t._targetingSetID === e._targetingSetID && (t.bidState = e.bidState, e.bidState === i.b.rendered ? t.timing.renderTime = e.ts : e.bidState === i.b.set && t.timing.setAtTimes.push(e.ts)), t; + }))); + case 'UPDATE_BID_INFO_PROP': + return void 0 === t[e.slotID] || t[e.slotID].filter(function (t) { + return t.matchesBidCacheId(e.iid); + }).length < 1 ? s({}, t) : s(s({}, t), {}, u({}, e.slotID, t[e.slotID].map(function (t) { + return t.matchesBidCacheId(e.iid) && (t[e.key] = e.value), t; + }))); + case 'UPDATE_SLOT_BIDS': + return s(s({}, t), e.bids.reduce(function (e, n) { + return Object(o.m)(e, n.slotID) ? e[n.slotID] = [].concat(d(e[n.slotID]), [n]) : Object(o.m)(t, n.slotID) ? e[n.slotID] = [].concat(d(t[n.slotID]), [n]) : e[n.slotID] = [n], e; + }, {})); + default: + return s({}, t); + } + }(t.slotBids, e), + slotIdMap: function (t, e) { + switch (e.type) { + case 'ADD_SLOT_ID': + return -1 === t.indexOf(e.slotID) ? [].concat(d(t), [e.slotID]) : t; + default: + return t; + } + }(t.slotIdMap, e), + sync917: function (t, e) { + switch (e.type) { + case 'SET_SYNC_917': + return e.value; + default: + return t; + } + }(t.sync917, e), + targetingKeys: function (t, e) { + switch (e.type) { + case 'UPDATE_SLOT_BIDS': + return s(s({}, t), e.bids.reduce(function (e, n) { + return Object(o.m)(t, n.slotID) ? e[n.slotID] = [].concat(d(t[n.slotID]), d((n.bidConfig.targeting ? n.bidConfig.targeting : i.g).filter(function (e) { + return -1 === t[n.slotID].indexOf(e); + }))) : e[n.slotID] = n.bidConfig.targeting ? n.bidConfig.targeting : i.g, e; + }, {})); + default: + return s({}, t); + } + }(t.targetingKeys, e) + }; + } + var l = { + getState: function () { + return r; + }, + dispatch: function (t) { + r = b(r, t); + } + }; + Object(c.d)('redux') && Object(o.i)() && Object(o.m)(window, '__REDUX_DEVTOOLS_EXTENSION__') && (l = window.__REDUX_DEVTOOLS_EXTENSION__(b)), l.dispatch({ type: 'NOOP' }); + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'e', function () { + return p; + }), n.d(e, 'c', function () { + return v; + }), n.d(e, 'd', function () { + return S; + }), n.d(e, 'b', function () { + return _; + }), n.d(e, 'a', function () { + return E; + }), n.d(e, 'f', function () { + return D; + }); + var r = n(4), i = n(2), o = n(5), c = n(0), a = n(1), s = n(6), u = n(11), d = n(10), f = [], b = !1, l = []; + function p(t) { + var e = new Image(); + return e.src = t, l.push(e), e; + } + !0 === Object(o.c)('exposePixels') && (window.apstagPixelQueue = f, window.apstagPixelsSent = l); + var m, g = { + adServer: [], + ampAdContext: [], + appended: [], + AaxSlotSizes: [], + bidRender: [], + bidRenderState: [], + bidType: [], + 'blockedBidders-fetchBids': [], + 'blockedBidders-init': [], + ccpa: [], + cmpVar: [], + creativeSize: [], + deals: [], + fetchBids: [], + fifFlow: [], + customFloor: [], + gdpr: [], + id: [], + idRemap: [], + iframe: [], + renderFootprint: [], + resizeIframe: [], + schain: [], + simplerGpt: [], + slots: [], + slotType: [], + targeting: [], + tcfVar: [], + unusedDeal: [], + useSafeFrames: [] + }, y = [], h = !1; + function O() { + h && (clearTimeout(m), h = !1), Object(c.c)(y, 5).forEach(function (t) { + _({ + _type: 'featureUsage', + p: t, + u: Object(s.g)(window) + }); + }), y = []; + } + function j() { + h || (h = !0, m = setTimeout(O, 2000)); + } + function v(t, e) { + try { + return !!i.a.getState().experiments.shouldSampleFeatures && (void 0 !== g[t] && !Object(c.j)(g[t], e) && (g[t].push(e), y.push({ + cat: t, + feat: e + }), b && j(), !0)); + } catch (t) { + return Object(a.b)(t, 'sendFeaturePixel'), !1; + } + } + function S() { + try { + var t = i.a.getState().libraryLoadCallLatency, e = Object(u.c)(window, new RegExp('aax2/apstag.js')); + if (null !== e || 0 !== t) { + var n = Object(u.e)(window, 'navigationStart'), r = { + _type: 'libLatency', + pid: d.b, + ns: n + }; + if (null !== e) { + r.fs = Object(u.a)(e, 'fetchStart'), r.re = Object(u.a)(e, 'responseEnd'); + var o = Object(u.f)(e); + null !== o && (r.c = o ? 1 : 0); + } + 0 !== t && (r.tcc = t), _(r); + } + } catch (t) { + Object(a.b)(t, 'sendInitLatencyPixel'); + } + } + function w(t) { + try { + if (b) { + var e = function () { + try { + var t = i.a.getState(), e = t.cfg.PIXEL_PATH, n = t.hosts.DEFAULT_AAX_PIXEL_HOST, c = Object(o.c)('pixelHost', n); + return ''.concat(r.r).concat(c).concat(e); + } catch (t) { + return Object(a.b)(t, 'buildPixelBaseUrl'), ''; + } + }(); + return void 0 === t.bidId ? e += 'p/PH/' : e += ''.concat(t.bidId, '/'), p(e += function (t) { + try { + t._tl = 'aps-tag'; + var e = i.a.getState(), n = null, o = ''; + Object(c.m)(e, 'config') && Object(c.m)(e.config, 'pubID') && '' !== e.config.pubID && (n = e.config.isSelfServePub, o = e.config.pubID), null !== n && (n ? (t.src = r.s, t.pubid = o) : t.src = o), t.lv = r.k; + var s = JSON.stringify(t); + return s = function (t) { + try { + return t.replace(/\\.{1}/g, ''); + } catch (t) { + return Object(a.b)(t, 'escapeJsonForAax'), ''; + } + }(s), s = encodeURIComponent(s); + } catch (t) { + return Object(a.b)(t, 'objectToUrlPath'), ''; + } + }(t.payload)); + } + return f.push(t), !1; + } catch (t) { + return Object(a.b)(t, 'sendPixel'), !1; + } + } + function _(t) { + return w({ payload: t }); + } + function E(t, e) { + return w({ + payload: e, + bidId: t + }); + } + function D() { + try { + if (b) + return; + b = !0, f.forEach(w), 0 < y.length && j(); + } catch (t) { + Object(a.b)(t, 'sendPixels'); + } + } + !0 === Object(o.c)('exposePixels') && (window.apstagFeaturePixelQueue = y); + }, + function (t, e, n) { + const $___old_9fd862f7b9f0ed32 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_06aebda6b5ce7099 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_9fd862f7b9f0ed32) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_c4607d10b0acbf6b.XMLHttpRequest)); + if ($___old_06aebda6b5ce7099) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_c4607d10b0acbf6b.XMLHttpRequest)); + return function () { + 'use strict'; + n.d(e, 'g', function () { + return o; + }), n.d(e, 'w', function () { + return c; + }), n.d(e, 'b', function () { + return r; + }), n.d(e, 'f', function () { + return d; + }), n.d(e, 'v', function () { + return f; + }), n.d(e, 'd', function () { + return b; + }), n.d(e, 'e', function () { + return l; + }), n.d(e, 'c', function () { + return p; + }), n.d(e, 'j', function () { + return m; + }), n.d(e, 'o', function () { + return g; + }), n.d(e, 'm', function () { + return y; + }), n.d(e, 'n', function () { + return a; + }), n.d(e, 'l', function () { + return u; + }), n.d(e, 'u', function () { + return S; + }), n.d(e, 'h', function () { + return h; + }), n.d(e, 't', function () { + return j; + }), n.d(e, 's', function () { + return w; + }), n.d(e, 'k', function () { + return _; + }), n.d(e, 'r', function () { + return E; + }), n.d(e, 'i', function () { + return D; + }), n.d(e, 'a', function () { + return T; + }), n.d(e, 'q', function () { + return I; + }), n.d(e, 'p', function () { + return A; + }), n.d(e, 'x', function () { + return R; + }); + var r, i, o = [ + 'amznbid', + 'amzniid', + 'amznsz', + 'amznp' + ], c = [ + 'amznbid', + 'amzniid', + 'amznp', + 'r_amznbid', + 'r_amzniid', + 'r_amznp' + ]; + (i = r = r || {}).new = 'NEW', i.exposed = 'EXPOSED', i.set = 'SET', i.rendered = 'RENDERED'; + var a, s, u, d = 'apstagDebug', f = [ + 'redux', + 'fake_bids', + 'verbose', + 'console', + 'console_v2', + 'errors' + ], b = 'apstagDebugHeight', l = 'apstagDEBUG', p = 'apstagCfg', m = 'aps3PIds', g = 0, y = 0; + (s = a = a || {}).amznbid = 'testBid', s.amzniid = 'testImpression', s.amznp = 'testP', s.crid = 'testCrid', (u || (u = {})).video = 'v'; + var h, O, j, v, S = [ + 'amznbid', + 'amznp' + ]; + (O = h = h || {}).__apsid = 'ck', O.__aps_id_p = 'ckp', O.aps_ext_917 = 'st', (v = j = j || {}).noRequest = '0', v.bidInFlight = '1', v.noBid = '2'; + var w = '600', _ = '7.67.00', E = 'https://', D = 'function' == typeof XMLHttpRequest && void 0 !== new XMLHttpRequest().withCredentials, T = 'apstagLOADED', I = 13, A = 10000, R = /^1[NY\-]{3}$/; + }.apply(this, arguments); + } finally { + if ($___old_9fd862f7b9f0ed32) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_9fd862f7b9f0ed32)); + if ($___old_06aebda6b5ce7099) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_06aebda6b5ce7099)); + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return d; + }), n.d(e, 'b', function () { + return g; + }), n.d(e, 'd', function () { + return _; + }), n.d(e, 'c', function () { + return D; + }), n.d(e, 'e', function () { + return I; + }); + var r = n(2), i = n(0), o = n(4), c = n(8), a = n(3), s = n(1), u = [ + 'getLog', + 'getState' + ]; + function d(t, e, n) { + try { + switch (Object(i.j)(u, t) && (Object(s.b)(new Error('Debug call made: '.concat(t)), 'debugPublicApi-call-'.concat(t)), u = u.filter(function (e) { + return e !== t; + })), t) { + case 'getLog': + return r.a.getState().eventLog; + case 'getState': + return r.a.getState(); + case 'enable': + return E('fake_bids', !0), 'DEBUG MODE ENABLED'; + case 'disable': + return E('fake_bids', !1), 'DEBUG MODE DISABLED'; + case 'enableConsole': + return g(!1, 'command'), 'Debug console enabled'; + case 'enableConsoleV2': + return g(!0, 'command'), 'Debug console v2 enabled'; + case 'disableConsole': + return function () { + try { + E('console', !1), E('console_v2', !1), null !== f && document.body.removeChild(f), m = !1, Object(i.i)() && window.localStorage.removeItem(o.d); + } catch (t) { + Object(s.b)(t, 'disableDebugConsole', !0); + } + }(), 'Debug console disabled'; + case 'setDebug': + return E(e, n) ? 'Set debug mode \''.concat(e, '\' to \'').concat(n, '\'') : 'Failed to set debug mode \''.concat(e, '\' to \'').concat(n, '\''); + default: + return 'unknown debug argument'; + } + } catch (e) { + return Object(s.b)(e, 'debugPublicApi', !0), 'error'; + } + } + var f, b, l, p, m = !1; + function g() { + var t = 0 < arguments.length && void 0 !== arguments[0] && arguments[0], e = 1 < arguments.length ? arguments[1] : void 0; + try { + if (E(t ? 'console_v2' : 'console', !0), m) + return; + var n = { + url: t ? r.a.getState().cfg.DEBUG_APP_HTML_V2 : r.a.getState().cfg.DEBUG_APP_HTML, + onload: y, + onerror: function () { + return Object(s.b)(new Error('Error Loading Debug Console'), 'enableDebugConsole-'.concat(t ? 'v2' : 'v1', '-onerror'), !0); + } + }; + Object(c.d)(n), setTimeout(function () { + try { + var n = { + _type: 'debugLoad', + mode: t ? 2 : 1 + }; + Object(i.m)(r.a.getState().config, 'pubID') && (n.src = r.a.getState().config.pubID), null !== e && (n.method = e), Object(a.b)(n); + } catch (n) { + Object(s.b)(n, 'enableDebugConsole-setTimeout', !0); + } + }, 5000); + } catch (n) { + Object(s.b)(n, 'enableDebugConsole', !0); + } + } + function y(t) { + try { + var e = t.responseText; + f = document.createElement('div'), b = document.createElement('div'), l = document.createElement('iframe'); + var n = 200; + _('console_v2') && (n = 330), Object(i.i)() && null !== window.localStorage.getItem(o.d) && (n = parseInt(window.localStorage.getItem(o.d), 10)), (isNaN(n) || n > window.innerHeight) && (n = 200), f.style.background = '#eaeded', f.style.zIndex = '2147483647', f.style.bottom = '0', f.style.position = 'fixed !important', f.style.display = 'block !important', f.style.left = '0', f.style.right = '0', f.style.height = ''.concat(n, 'px'), b.style.cursor = 'row-resize', b.style.height = '2px', b.style.position = 'absolute', b.style.top = '0', b.style.left = '0', b.style.right = '0', b.style.backgroundColor = 'RGBA(0,0,0,0)', f.appendChild(b), l.frameBorder = '0', l.marginHeight = '0', l.marginWidth = '0', l.scrolling = 'no', l.id = 'apstag-debug-iframe', l.src = 'about:blank', l.style.display = 'block', l.style.width = '100%', l.style.height = ''.concat(n, 'px'), f.appendChild(l), document.body.appendChild(f), null !== l.contentDocument && (l.contentDocument.open(), l.contentDocument.write(e), l.contentDocument.close()), b.addEventListener('mousedown', j); + } catch (t) { + Object(s.b)(t, 'renderDebugConsole', !0); + } + } + function h(t) { + try { + var e = window.innerHeight - t.clientY; + return e < 200 && (e = 200), f.style.height = ''.concat(e, 'px'), l.style.height = ''.concat(e, 'px'), e; + } catch (t) { + return Object(s.b)(t, 'resizeDebugConsole', !0), 200; + } + } + function O(t) { + try { + return t.stopPropagation && t.stopPropagation(), t.preventDefault && t.preventDefault(), t.cancelBubble = !0, t.returnValue = !1; + } catch (t) { + return Object(s.b)(t, 'preventEvent', !0), !1; + } + } + function j() { + try { + void 0 === p && ((p = document.createElement('div')).style.position = 'fixed', p.style.left = '0', p.style.right = '0', p.style.top = '0', p.style.bottom = '0', p.style.zIndex = '9999999999'), f.appendChild(p), window.addEventListener('mouseup', S), window.addEventListener('mousemove', v); + } catch (t) { + Object(s.b)(t, 'resizeBarMouseDownListener', !0); + } + } + function v(t) { + try { + return h(t), O(t); + } catch (t) { + return Object(s.b)(t, 'resizeBarMouseMoveListener', !0), !1; + } + } + function S(t) { + try { + null !== p && f.removeChild(p), window.removeEventListener('mousemove', v), window.removeEventListener('mouseup', S); + var e = h(t); + return Object(i.i)() && window.localStorage.setItem(o.d, ''.concat(e)), O(t); + } catch (t) { + return Object(s.b)(t, 'resizeBarMouseUpListener', !0), !1; + } + } + function w() { + const $___old_0dfc5fa302637252 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_0dfc5fa302637252) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_ba1c6ba55dfe66f1.localStorage)); + return function () { + try { + if (!Object(i.i)()) + return []; + var t = window.localStorage.getItem(o.f); + null === t || 'false' === t ? t = '[]' : 'true' === t && (t = '["fake_bids"]'); + var e = []; + try { + e = JSON.parse(t); + } catch (t) { + } + return Object(i.k)(e) || (e = []), e.filter(function (t) { + return Object(i.j)(o.v, t); + }); + } catch (t) { + return Object(s.b)(t, 'getCurrentDebugArray'), []; + } + }.apply(this, arguments); + } finally { + if ($___old_0dfc5fa302637252) + ({}.constructor.defineProperty(window, 'localStorage', $___old_0dfc5fa302637252)); + } + } + function _(t) { + try { + return Object(i.j)(w(), t); + } catch (t) { + return Object(s.b)(t, 'isDebugEnabled'), !1; + } + } + function E(t, e) { + try { + if (!Object(i.i)()) + return; + if (-1 === o.v.indexOf(t)) + return; + var n = w(); + return e && -1 === n.indexOf(t) ? n.push(t) : e || (n = n.filter(function (e) { + return e !== t; + })), 0 === n.length ? window.localStorage.removeItem(o.f) : window.localStorage.setItem(o.f, JSON.stringify(n)), I(), 1; + } catch (e) { + return void Object(s.b)(e, 'setDebugMode'); + } + } + function D(t) { + var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : null; + try { + if (Object(i.m)(window, o.e) && Object(i.m)(window[o.e], t)) + return window[o.e][t]; + } catch (t) { + Object(s.b)(t, 'getDebugValue'); + } + return e; + } + var T = []; + function I() { + try { + w().filter(function (t) { + return -1 === T.indexOf(t); + }).forEach(function (t) { + Object(s.b)(new Error('Debug method enabled: '.concat(t)), 'debugPublicApi-enabled-'.concat(t), !0), T.push(t); + }); + } catch (t) { + Object(s.b)(t, 'pixelDebugModes'); + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'c', function () { + return d; + }), n.d(e, 'j', function () { + return f; + }), n.d(e, 'g', function () { + return b; + }), n.d(e, 'h', function () { + return l; + }), n.d(e, 'd', function () { + return p; + }), n.d(e, 'e', function () { + return m; + }), n.d(e, 'f', function () { + return g; + }), n.d(e, 'i', function () { + return h; + }), n.d(e, 'b', function () { + return O; + }), n.d(e, 'a', function () { + return j; + }), n.d(e, 'k', function () { + return v; + }); + var r = n(5), i = n(0), o = n(1), c = n(4), a = n(2), s = n(3); + function u(t) { + return (u = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function d(t) { + try { + return t.split('_').pop(); + } catch (t) { + return Object(o.b)(t, 'getAmpAmznBidValue'), ''; + } + } + function f(t) { + try { + return !Object(i.m)(t, 'slots'); + } catch (t) { + return Object(o.b)(t, 'isAAXPunt'), !0; + } + } + function b(t) { + try { + var e, n = Object(r.c)('url'); + if (null !== n) + return encodeURIComponent(n); + try { + v(t, !1) ? (Object(s.c)('ampAdContext', 'getCurrentUrl'), e = null, t.context && (e = t.context.canonicalUrl || t.context.sourceUrl)) : e = t.top.location.href; + } catch (t) { + e = null; + } + if (null === e || !e || void 0 === e) { + e = ''; + try { + t.top !== t.self && (e = t.document.referrer); + } catch (t) { + } + } + return encodeURIComponent(e); + } catch (t) { + return Object(o.b)(t, 'getCurrentUrl'), ''; + } + } + function l(t) { + try { + var e, n = '', i = Object(r.c)('url'); + if (null !== i) + return encodeURIComponent(i); + try { + try { + e = v(t, !1) ? (Object(s.c)('ampAdContext', 'getReferrerUrl'), t.context ? t.context.referrer : t.top.document.referrer) : t.top.document.referrer; + } catch (n) { + e = t.document.referrer; + } + n = encodeURIComponent(e); + } catch (n) { + } + return n; + } catch (n) { + return Object(o.b)(n, 'getReferrerUrl'), ''; + } + } + function p() { + try { + var t = { cookiesParams: '' }; + return Object(i.d)().forEach(function (e) { + if (e[0] in c.h) + switch (e[0]) { + case 'aps_ext_917': + t.fb = e[1]; + break; + default: + t.cookiesParams += '&'.concat(c.h[e[0]], '=').concat(e[1]); + } + }), t.fb || a.a.getState().sync917 || a.a.dispatch({ + type: 'SET_SYNC_917', + value: !0 + }), t; + } catch (t) { + return Object(o.b)(t, 'getApsFirstPartyCookies'), { cookiesParams: '' }; + } + } + function m(t) { + try { + var e = a.a.getState().config.blockedBidders; + Object(i.m)(t, 'blockedBidders') && Object(i.k)(t.blockedBidders) && (e = t.blockedBidders); + var n = ''; + return Object(i.k)(e) && (n = JSON.stringify(e)), n; + } catch (t) { + return Object(o.b)(t, 'getBlockedBidders', !0), ''; + } + } + function g() { + try { + if (!Object(i.i)()) + return c.o; + var t = a.a.getState(); + return Object(i.m)(t, 'cfg') && Object(i.m)(t.cfg, 'v') && -1 !== t.cfg.v ? t.cfg.v : null; + } catch (t) { + return Object(o.b)(t, 'getCfgVersion'), null; + } + } + function y(t) { + try { + if (-1 === [ + 'string', + 'number' + ].indexOf(u(t))) + return !1; + var e = Math.floor(Number(t)); + if (e > c.m) + return e; + } catch (t) { + Object(o.b)(t, 'parseTimeout', !0); + } + return !1; + } + function h(t, e) { + try { + var n = y(t.timeout); + return !1 === n && (n = y(e.config.bidTimeout)), !1 === n && (n = y(e.cfg.DEFAULT_TIMEOUT)), n; + } catch (t) { + return Object(o.b)(t, 'getTimeout', !0), 2000; + } + } + function O(t, e) { + var n, r = !1; + function i(e) { + if (!r) + try { + t(e); + } catch (e) { + Object(o.b)(e, 'executeFunctionOnceWithTimeout-wrappedFunction', !0); + } + clearTimeout(n), r = !0; + } + try { + return n = setTimeout(i, e, !0), i.bind(null, !1); + } catch (e) { + return Object(o.b)(e, 'executeFunctionOnceWithTimeout', !0), function () { + }; + } + } + function j(t) { + var e = !1; + return function () { + if (!e) + try { + t(); + } catch (t) { + Object(o.b)(t, 'executeFunctionOnceWithTimeout-wrappedFunction', !0); + } + e = !0; + }; + } + function v(t, e) { + try { + var n = e ? t.AMP_CONTEXT_DATA : t.context; + return Boolean(n && Object(i.m)(n, 'tagName') && 'AMP-AD' === n.tagName); + } catch (t) { + return Object(o.b)(t, 'isInAmpAd'), !1; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return D; + }), n.d(e, 'b', function () { + return T; + }); + var r = n(0), i = n(13), o = n(1); + function c(t) { + return (c = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function a(t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function'); + } + function s(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(t, r.key, r); + } + } + function u(t, e, n) { + return e && s(t.prototype, e), n && s(t, n), t; + } + function d(t, e) { + if ('function' != typeof e && null !== e) + throw new TypeError('Super expression must either be null or a function'); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), e && function (t, e) { + (Object.setPrototypeOf || function (t, e) { + return t.__proto__ = e, t; + })(t, e); + }(t, e); + } + function f(t) { + var e = function () { + if ('undefined' == typeof Reflect || !Reflect.construct) + return !1; + if (Reflect.construct.sham) + return !1; + if ('function' == typeof Proxy) + return !0; + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (t) { + return !1; + } + }(); + return function () { + var n, r, i, o = l(t); + if (e) { + var a = l(this).constructor; + n = Reflect.construct(o, arguments, a); + } else + n = o.apply(this, arguments); + return r = this, !(i = n) || 'object' !== c(i) && 'function' != typeof i ? b(r) : i; + }; + } + function b(t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + } + function l(t) { + return (l = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + })(t); + } + function p(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + var m = function () { + d(e, i.c); + var t = f(e); + function e(n) { + var i; + return a(this, e), p(b(i = t.call(this, n.targetId, Object(r.m)(n, 'invCode') ? n.invCode : Object(r.m)(n, 'tagId') ? n.tagId : n.targetId)), 'rawSlot', void 0), p(b(i), 'mediaType', 'display'), i.rawSlot = n, i; + } + return u(e, [ + { + key: 'reportError', + value: function (t, e, n) { + var r = 2 < arguments.length && void 0 !== n && n; + Object(o.b)(t, 'ApnSlot-'.concat(e), r); + } + }, + { + key: 'initKeywords', + value: function () { + try { + Object(r.m)(this.rawSlot, 'keywords') || (this.rawSlot.keywords = {}); + } catch (t) { + this.reportError(t, 'initKeywords'); + } + } + }, + { + key: 'setTargeting', + value: function (t, e) { + try { + this.initKeywords(), this.rawSlot.keywords[t] = e; + } catch (t) { + this.reportError(t, 'setTargeting'); + } + } + }, + { + key: 'getTargeting', + value: function (t) { + try { + return this.initKeywords(), Object(r.m)(this.rawSlot.keywords, t) ? [this.rawSlot.keywords[t]] : []; + } catch (t) { + return this.reportError(t, 'getTargeting'), []; + } + } + }, + { + key: 'clearTargeting', + value: function (t) { + try { + this.initKeywords(), delete this.rawSlot.keywords[t]; + } catch (t) { + this.reportError(t, 'clearTargeting'); + } + } + }, + { + key: 'sizes', + get: function () { + try { + return this.rawSlot.sizes; + } catch (t) { + return this.reportError(t, 'sizes'), []; + } + } + } + ]), e; + }(), g = function () { + d(e, i.b); + var t = f(e); + function e() { + var n; + a(this, e); + for (var r = arguments.length, i = new Array(r), o = 0; o < r; o++) + i[o] = arguments[o]; + return p(b(n = t.call.apply(t, [this].concat(i))), 'isSupported', !0), n; + } + return u(e, [ + { + key: 'reportError', + value: function (t, e) { + Object(o.b)(t, 'AppNexusAdServer-'.concat(e)); + } + }, + { + key: 'cmdQueuePush', + value: function (t) { + try { + window.apntag.anq.push(t); + } catch (t) { + this.reportError(t, 'cmdQueuePush'); + } + } + }, + { + key: 'setTargeting', + value: function (t, e) { + try { + if (!Object(r.m)(window, 'apntag') || !Object(r.m)(window.apntag, 'requests')) + return; + Object(r.m)(window.apntag.requests, 'keywords') || (window.apntag.requests.keywords = {}), window.apntag.requests.keywords[t] = e; + } catch (t) { + this.reportError(t, 'setTargeting'); + } + } + }, + { + key: 'getTargeting', + value: function (t) { + try { + if (!Object(r.m)(window, 'apntag') || !Object(r.m)(window.apntag, 'requests')) + return []; + Object(r.m)(window.apntag.requests, 'keywords') || (window.apntag.requests.keywords = {}); + var e = window.apntag.requests.keywords[t]; + return void 0 === e ? [] : [e]; + } catch (t) { + return this.reportError(t, 'getTargeting'), []; + } + } + }, + { + key: 'clearTargeting', + value: function (t) { + try { + Object(r.m)(window, 'apntag') && Object(r.m)(window.apntag, 'requests') && Object(r.m)(window.apntag.requests, 'keywords') && delete window.apntag.requests.keywords[t]; + } catch (t) { + this.reportError(t, 'clearTargeting'); + } + } + }, + { + key: 'hasAdServerObjectLoaded', + value: function () { + try { + return Object(r.m)(window, 'apntag') && Object(r.m)(window.apntag, 'loaded') && !0 === window.apntag.loaded; + } catch (t) { + return this.reportError(t, 'hasAdServerObjectLoaded'), !1; + } + } + }, + { + key: 'isCommandQueueDefined', + value: function () { + try { + return Object(r.m)(window, 'apntag') && Object(r.m)(window.apntag, 'anq'); + } catch (t) { + return this.reportError(t, 'isCommandQueueDefined'), !1; + } + } + }, + { + key: 'getSlots', + value: function () { + try { + var t = []; + return Object(r.m)(window, 'apntag') && Object(r.m)(window.apntag, 'requests') && Object(r.m)(window.apntag.requests, 'tags') && Object(r.l)(window.apntag.requests.tags) && Object.keys(window.apntag.requests.tags).forEach(function (e) { + var n = window.apntag.requests.tags[e]; + t.push(new m(n)); + }), t; + } catch (t) { + return this.reportError(t, 'getSlots'), []; + } + } + } + ]), e; + }(), y = n(16); + function h(t) { + return (h = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function O(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(t, r.key, r); + } + } + function j(t, e) { + return (j = Object.setPrototypeOf || function (t, e) { + return t.__proto__ = e, t; + })(t, e); + } + function v(t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + } + function S(t) { + return (S = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + })(t); + } + function w(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + var _ = function () { + !function (t, e) { + if ('function' != typeof e && null !== e) + throw new TypeError('Super expression must either be null or a function'); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), e && j(t, e); + }(c, i.b); + var t, e, n = function (t) { + var e = function () { + if ('undefined' == typeof Reflect || !Reflect.construct) + return !1; + if (Reflect.construct.sham) + return !1; + if ('function' == typeof Proxy) + return !0; + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (t) { + return !1; + } + }(); + return function () { + var n, r, i, o = S(t); + if (e) { + var c = S(this).constructor; + n = Reflect.construct(o, arguments, c); + } else + n = o.apply(this, arguments); + return r = this, !(i = n) || 'object' !== h(i) && 'function' != typeof i ? v(r) : i; + }; + }(c); + function c() { + var t; + !function (t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function'); + }(this, c); + for (var e = arguments.length, r = new Array(e), i = 0; i < e; i++) + r[i] = arguments[i]; + return w(v(t = n.call.apply(n, [this].concat(r))), 'isSupported', !0), w(v(t), 'needNewBidObject', !0), t; + } + return t = c, (e = [ + { + key: 'reportError', + value: function (t, e) { + Object(o.b)(t, 'SmartAdServer-'.concat(e)); + } + }, + { + key: 'cmdQueuePush', + value: function (t) { + try { + window.sas.cmd.push(t); + } catch (t) { + this.reportError(t, 'cmdQueuePush'); + } + } + }, + { + key: 'hasAdServerObjectLoaded', + value: function () { + try { + return Object(r.m)(window, 'sas') && Object(r.m)(window.sas, '__smartLoaded') && !0 === window.sas.__smartLoaded; + } catch (t) { + return this.reportError(t, 'hasAdServerObjectLoaded'), !1; + } + } + }, + { + key: 'isCommandQueueDefined', + value: function () { + try { + return Object(r.m)(window, 'sas') && Object(r.m)(window.sas, 'cmd'); + } catch (t) { + return this.reportError(t, 'isCommandQueueDefined'), !1; + } + } + } + ]) && O(t.prototype, e), c; + }(), E = n(3), D = new i.b(); + function T(t) { + try { + switch (t) { + case 'appnexus': + Object(E.c)('adServer', t), D = new g(); + break; + case 'googletag': + Object(E.c)('adServer', t), D = new y.a(); + break; + case 'sas': + Object(E.c)('adServer', t), D = new _(); + break; + default: + 'string' == typeof t ? Object(E.c)('adServer', 'invalid-'.concat(t)) : Object(E.c)('adServer', 'none'), D = new i.b(); + } + } catch (t) { + Object(o.b)(t, 'setDisplayAdServer'); + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'd', function () { + return o; + }), n.d(e, 'b', function () { + return c; + }), n.d(e, 'a', function () { + return a; + }), n.d(e, 'c', function () { + return s; + }); + var r = n(1); + function i(t) { + return (i = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function o(t) { + const $___old_4d989b62c6b1da5d = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_29bf71f730429cbc = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_4d989b62c6b1da5d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_c4607d10b0acbf6b.XMLHttpRequest)); + if ($___old_29bf71f730429cbc) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_c4607d10b0acbf6b.XMLHttpRequest)); + return function () { + var e = t.url, n = t.onload, o = t.onerror, c = t.ontimeout, a = t.withCredentials, s = t.body, u = void 0 === s ? null : s, d = t.headers, f = void 0 === d ? null : d, b = new window.XMLHttpRequest(); + try { + if ('' === e) + return void (void 0 !== o && o.call(b, 'error')); + b.onload = n.bind(null, b), void 0 !== o && (b.onerror = o), void 0 !== c && (b.ontimeout = c), void 0 !== a && (b.withCredentials = a); + var l = 'GET'; + null !== u && (l = 'POST'), b.open(l, e), null !== f && 'object' === i(f) && Object.keys(f).forEach(function (t) { + b.setRequestHeader(t, f[t]); + }), b.send(u); + } catch (t) { + void 0 !== o && o.call(b, 'error'), Object(r.b)(t, 'xhrRequest'); + } + }.apply(this, arguments); + } finally { + if ($___old_4d989b62c6b1da5d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_4d989b62c6b1da5d)); + if ($___old_29bf71f730429cbc) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_29bf71f730429cbc)); + } + } + function c(t, e, n, i) { + try { + if (void 0 === n && (n = document), void 0 === t) + return 'function' == typeof e && e(!0), !1; + var o = n.getElementsByTagName('script')[0] || n.body.firstChild, c = n.createElement('script'); + if (c.type = 'text/javascript', c.async = !0, c.src = t, e && a(c, e), a(c, i || function () { + Object(r.b)(new Error('Error Loading Script Tag'), 'loadScriptTag-onerror'); + }, [], 'onerror'), null !== o.parentNode) + return o.parentNode.insertBefore(c, o), !0; + } catch (t) { + Object(r.b)(t, 'loadScriptTag', !0); + } + return !1; + } + function a(t, e) { + var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : [], i = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : 'onload'; + try { + return 'function' == typeof e && (t[i] = function () { + e.apply(null, n); + }, !0); + } catch (t) { + return Object(r.b)(t, 'addCallbackFunction'), !1; + } + } + function s(t) { + try { + return encodeURIComponent(JSON.stringify(t)); + } catch (t) { + return Object(r.b)(t, 'objToUrlParam'), ''; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return c; + }), n.d(e, 'b', function () { + return a; + }); + var r = n(1), i = n(0); + function o(t) { + return (o = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function c(t) { + try { + return function (t) { + try { + if (!a(t, [ + 'number', + 'string' + ])) + return !1; + if (isNaN(t)) + return !1; + if ('number' == typeof t) + return !0; + var e = parseInt(t, 10); + return !isNaN(e); + } catch (t) { + return Object(r.b)(t, 'isNumber'), !0; + } + }(t) || void 0 === t; + } catch (t) { + return Object(r.b)(t, 'isNumberOrUndefined'), !0; + } + } + function a(t, e) { + try { + return Object(i.j)(e, o(t)); + } catch (t) { + return Object(r.b)(t, 'isVarOfTypes'), !0; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return v; + }), n.d(e, 'b', function () { + return S; + }), n.d(e, 'i', function () { + return w; + }), n.d(e, 'd', function () { + return _; + }), n.d(e, 'g', function () { + return E; + }), n.d(e, 'c', function () { + return D; + }), n.d(e, 'h', function () { + return T; + }), n.d(e, 'f', function () { + return I; + }), n.d(e, 'e', function () { + return A; + }); + var r = n(2), i = n(5), o = n(4), c = n(0), a = n(8), s = n(1), u = n(6), d = n(12), f = n(3), b = n(9), l = n(14); + function p(t) { + return function (t) { + if (Array.isArray(t)) + return h(t); + }(t) || function (t) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(t)) + return Array.from(t); + }(t) || y(t) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function m(t, e) { + var n = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(t); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function g(t) { + for (var e = 1; e < arguments.length; e++) { + var n = null != arguments[e] ? arguments[e] : {}; + e % 2 ? m(Object(n), !0).forEach(function (e) { + j(t, e, n[e]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : m(Object(n)).forEach(function (e) { + Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(n, e)); + }); + } + return t; + } + function y(t, e) { + if (t) { + if ('string' == typeof t) + return h(t, e); + var n = Object.prototype.toString.call(t).slice(8, -1); + return 'Object' === n && t.constructor && (n = t.constructor.name), 'Map' === n || 'Set' === n ? Array.from(t) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? h(t, e) : void 0; + } + } + function h(t, e) { + (null == e || e > t.length) && (e = t.length); + for (var n = 0, r = new Array(e); n < e; n++) + r[n] = t[n]; + return r; + } + function O(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(t, r.key, r); + } + } + function j(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + var v = function () { + function t(e) { + !function (t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function'); + }(this, t), j(this, 'bidConfig', void 0), j(this, 'bidState', o.b.new), j(this, '_targetingSetID', void 0), j(this, 'timing', { setAtTimes: [] }), j(this, 'pixelSent', !1), j(this, 'useSafeFrames', !1), j(this, 'bidReqID', ''), j(this, 'host', void 0), j(this, 'ev', void 0), j(this, 'cfe', void 0), j(this, 'isAmp', !1), j(this, 'doc', void 0), j(this, 'inheritSize', void 0), this.bidConfig = e, this._targetingSetID = Object(c.e)(), r.a.getState().config.useSafeFrames && (this.useSafeFrames = !0), this.useSafeFrames && Object(c.m)(e, 'targeting') && e.targeting.push('amznhost'), Object(c.m)(e, 'meta') ? Object(c.k)(e.meta) || (this.reportError({ + name: 'TypeError', + message: '\'meta\' is not an \'array\': '.concat(JSON.stringify(e.meta)) + }, 'constructor-meta'), e.meta = []) : e.meta = []; + try { + var n = 'd'; + 'video' !== this.bidConfig.mediaType && 'v' !== this.bidConfig.mediaType || (n = 'v'); + var i = []; + Object(c.m)(this.bidConfig, 'amzndeals') && (Object(f.c)('bidType', ''.concat(n, '-amzndeals')), i = this.bidConfig.amzndeals.map(function (t) { + return ''.concat(t, 'amzniid'); + })), this.bidConfig.targeting.filter(function (t) { + return -1 !== t.indexOf('amzniid') && !Object(c.j)(i, t); + }).forEach(function (t) { + return Object(f.c)('bidType', ''.concat(n, '-').concat(t)); + }), Object(c.m)(this.bidConfig, 'fif') && '1' === this.bidConfig.fif ? Object(f.c)('bidRender', 'friendly') : Object(f.c)('bidRender', 'unfriendly'); + } catch (e) { + this.reportError(e, 'pixeling'); + } + } + var e, n; + return e = t, (n = [ + { + key: 'reportError', + value: function (t, e, n) { + var r = 2 < arguments.length && void 0 !== n && n; + Object(s.b)(t, 'Bid-'.concat(e), r); + } + }, + { + key: 'matchesBidCacheId', + value: function (t) { + var e = this; + try { + return this.bidConfig.targeting.reduce(function (n, r) { + return n || -1 !== r.indexOf('amzniid') && e.bidConfig[r] === t; + }, !1); + } catch (t) { + return this.reportError(t, 'matchesBidCacheId'), !1; + } + } + }, + { + key: 'mediaType', + get: function () { + var t = 'd'; + return 'video' !== this.bidConfig.mediaType && 'v' !== this.bidConfig.mediaType && 'v' !== this.bidConfig.mediaType_sp || (t = 'video'), t; + } + }, + { + key: 'targeting', + get: function () { + var t = this; + try { + return this.bidConfig.targeting.map(function (e) { + return 'amznhost' === e ? [ + e, + encodeURIComponent(t.host) + ] : Object(c.m)(t.bidConfig, e) && Object(c.k)(t.bidConfig[e]) ? [ + e, + encodeURIComponent(t.bidConfig[e].join(',')) + ] : Object(c.m)(t.bidConfig, e) ? [ + e, + encodeURIComponent(t.bidConfig[e]) + ] : [ + e, + '' + ]; + }).map(function (t) { + var e = function (t, e) { + return function (t) { + if (Array.isArray(t)) + return t; + }(t) || function (t, e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(t)) { + var n = [], r = !0, i = !1, o = void 0; + try { + for (var c, a = t[Symbol.iterator](); !(r = (c = a.next()).done) && (n.push(c.value), !e || n.length !== e); r = !0); + } catch (t) { + i = !0, o = t; + } finally { + try { + r || null == a.return || a.return(); + } finally { + if (i) + throw o; + } + } + return n; + } + }(t, e) || y(t, e) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + }(t, 2), n = e[0], r = e[1]; + return '&'.concat(n, '=').concat(r); + }).join(''); + } catch (t) { + return this.reportError(t, 'targeting'), ''; + } + } + }, + { + key: 'bidObject', + get: function () { + try { + var t = { + slotID: this.bidConfig.slotID, + amzniid: this.bidConfig.amzniid, + amznbid: this.bidConfig.amznbid, + amznp: this.bidConfig.amznp, + amznsz: this.bidConfig.amznsz, + size: this.bidConfig.amznsz + }; + return 'video' === this.mediaType && (t.mediaType = 'video', t.qsParams = this.targeting, t.encodedQsParams = encodeURIComponent(this.targeting), t.r_amznbid = this.bidConfig.r_amznbid, t.r_amzniid = this.bidConfig.r_amzniid, t.r_amznp = this.bidConfig.r_amznp), this.useSafeFrames && (t.amznhost = this.host), t; + } catch (t) { + return this.reportError(t, 'bidObject', !0), { + slotID: '', + amzniid: 'error', + amznbid: 'error', + amznp: 'error', + amznsz: 'error', + size: 'error' + }; + } + } + }, + { + key: 'newBidObject', + get: function () { + var t = this; + try { + var e = { + slotID: this.bidConfig.slotID, + size: this.bidConfig.amznsz, + mediaType: this.mediaType, + targeting: {}, + helpers: { + targetingKeys: this.bidConfig.targeting, + qsParams: function () { + return t.targeting; + }, + encodedQsParams: function () { + return encodeURIComponent(t.targeting); + } + } + }, n = [ + 'slotID', + 'size', + 'mediaType' + ]; + return this.bidConfig.meta.filter(function (t) { + return -1 === n.indexOf(t); + }).forEach(function (n) { + e[n] = t.bidConfig[n]; + }), this.bidConfig.targeting.forEach(function (n) { + e.targeting[n] = 'amznhost' === n ? t.host : t.bidConfig[n]; + }), void 0 !== this.slotID && -1 !== this.slotID.indexOf('_') && (e.sasTargeting = e.helpers.targetingKeys.map(function (n) { + return ''.concat(n, '_').concat(t.slotID.split('_')[1], '=').concat(e.targeting[n]); + }).join(';')), e; + } catch (t) { + return this.reportError(t, 'newBidObject', !0), { + slotID: '', + size: '', + mediaType: 'd', + targeting: {}, + helpers: { + targetingKeys: [], + qsParams: function () { + return ''; + }, + encodedQsParams: function () { + return ''; + } + } + }; + } + } + }, + { + key: 'slotID', + get: function () { + try { + return this.bidConfig.slotID; + } catch (t) { + return this.reportError(t, 'slotID'), ''; + } + } + } + ]) && O(e.prototype, n), t; + }(), S = Object(c.f)(o.q); + function w(t) { + var e = 'validateSupplyChainObject', n = !1; + function r(t, r) { + return Object(s.b)({ + name: 'TypeError', + message: r + }, ''.concat(e, '-').concat(t), !0), !(n = !0); + } + try { + return Object(c.l)(t) ? (Object(c.m)(t, 'complete') ? -1 === [ + 1, + 0 + ].indexOf(t.complete) && r('schain-complete-type', 'The `schain.complete` property must be a `1` or `0`') : r('schain-complete', 'The `schain.complete` property must be provided'), Object(c.m)(t, 'ver') ? Object(b.b)(t.ver, ['string']) || r('schain-ver-type', 'The `schain.ver` property must be a string') : r('schain-ver', 'The `schain.ver` property must be provided'), Object(c.m)(t, 'nodes') ? Object(c.k)(t.nodes) ? t.nodes.reduce(function (t, e) { + return Object(c.l)(e) ? (Object(c.m)(e, 'asi') ? Object(b.b)(e.asi, ['string']) || r('schain-node-asi-type', 'All `schain.nodes` items must have an `asi` property of type `string`') : r('schain-node-asi', 'All `schain.nodes` items must have an `asi` property'), Object(c.m)(e, 'sid') ? Object(b.b)(e.sid, ['string']) || r('schain-node-sid-type', 'All `schain.nodes` items must have an `sid` property of type `string`') : r('schain-node-sid', 'All `schain.nodes` items must have an `sid` property'), Object(c.m)(e, 'hp') ? -1 === [ + 1, + 0 + ].indexOf(e.hp) && r('schain-node-hp-type', 'All `schain.nodes` items must have an `hp` property which is `1` or `0`') : r('schain-node-hp', 'All `schain.nodes` items must have an `hp` property'), Object(b.b)(e.rid, [ + 'string', + 'undefined' + ]) || r('schain-node-rid-type', 'If provided, the `rid` property on an `schain.nodes` item must be of type `string`'), Object(b.b)(e.name, [ + 'string', + 'undefined' + ]) || r('schain-node-name-type', 'If provided, the `name` property on an `schain.nodes` item must be of type `string`'), Object(b.b)(e.domain, [ + 'string', + 'undefined' + ]) || r('schain-node-domain-type', 'If provided, the `domain` property on an `schain.nodes` item must be of type `string`'), t && !n) : r('schain-node-type', 'All `schain.nodes` items must be objects'); + }, !n) : r('schain-nodes-type', 'The `schain.nodes` property must be an `Array`') : r('schain-nodes', 'The `schain.nodes` property must be provided')) : r('schain', 'The `schain` value must be an object'); + } catch (t) { + return Object(s.b)(t, e, !0), !1; + } + } + function _(t, e, n, d) { + try { + var b = r.a.getState(), m = {}, y = Object(i.c)('host', b.hosts.DEFAULT_AAX_BID_HOST), h = b.cfg.DTB_PATH, O = 'bid'; + b.experiments.shouldUseTestBidEndpoint && null !== b.cfg.TEST_BID_ENDPOINT && (O = b.cfg.TEST_BID_ENDPOINT); + var j = { + src: b.config.pubID, + u: Object(u.g)(window), + pr: Object(u.h)(window), + pid: S, + cb: t.bidReqID, + ws: Object(c.h)(window), + v: o.k, + t: e, + slots: function (t) { + try { + return Object(a.c)(t.map(function (t) { + var e; + if (Object(c.m)(t, 'mediaType') && 'video' === t.mediaType) + e = t.aaxSlot; + else { + if (!(Object(c.m)(t, 'sizes') && 0 < t.sizes.length && Object(c.m)(t, 'slotID'))) + return Object(s.b)({ + name: 'SlotError', + message: 'There was an error with the configuration for this slot: '.concat(JSON.stringify(t.rawSlot)) + }, 'buildSlotsUrlParam-invalidSlot', !0), { + id: 'ERROR', + mt: o.l.video, + error: !0 + }; + var n = t.aaxSlot; + Object(c.m)(t, 'slotName') && t.slotName !== t.slotID ? (Object(f.c)('idRemap', 'y'), r.a.dispatch({ + type: 'ADD_SLOT_ID', + slotID: t.slotID + }), n.sd = ''.concat(r.a.getState().slotIdMap.indexOf(t.slotID)), n.sn = t.slotName) : Object(f.c)('idRemap', 'n'), e = n; + } + return e; + }).filter(function (t) { + return !0 !== t.error; + })); + } catch (t) { + return Object(s.b)(t, 'buildSlotsUrlParam', !0), ''; + } + }(t.validSlots), + pj: function (t, e) { + try { + var n = Object(c.l)(t.config.params) ? t.config.params : {}, r = Object(c.l)(e.params) ? e.params : {}, i = g(g({}, n), r); + return 0 === Object.keys(i).length ? '' : Object(a.c)(i); + } catch (t) { + return Object(s.b)(t, 'getBidParams', !0), ''; + } + }(b, t), + cfgv: Object(u.f)(), + bb: Object(u.e)(t), + schain: function (t) { + try { + var e; + return Object(c.m)(t.config, 'schain') ? (e = t.config.schain, encodeURIComponent([''.concat(e.ver, ',').concat(e.complete)].concat(p(e.nodes.map(function (t) { + return [ + 'asi', + 'sid', + 'hp', + 'rid', + 'name', + 'domain' + ].map(function (e) { + return Object(c.m)(t, e) ? t[e] : ''; + }).map(function (t) { + return encodeURIComponent(t); + }).map(function (t) { + return t.replace(/\!/g, '%21'); + }).join(','); + }))).join('!'))) : ''; + } catch (t) { + return Object(s.b)(t, 'getSupplyChainObject', !0), ''; + } + }(b) + }; + if ('[]' === j.slots || '' === j.slots) + throw new Error('No slots available for bid request'); + if (r.a.dispatch({ + type: 'RECORD_AAX_REQUEST', + data: { + bidConfig: t, + bidReqID: t.bidReqID, + timeout: e, + ws: j.ws, + url: j.u, + rqTs: Date.now() + } + }), b.experiments.chunkRequests) { + var v = t.bidReqID.split('-'); + r.a.dispatch({ + type: 'RECORD_NETWORK_EXCHANGE', + fid: v[0], + networkID: parseInt(v[1], 10), + timestamp: Date.now(), + exchangeType: 'request' + }); + } + b.config.isSelfServePub && (j.pubid = j.src, j.src = 600); + var w = Object(u.d)(); + w.fb && (m[917] = w.fb, j[o.h.aps_ext_917] = Object(a.c)(m)); + var _ = Object(i.c)('bidParams'); + Object(c.l)(_) && (j = g(g({}, j), _)), Object(c.l)(n) && (Object(c.m)(n, 'enabled') && (j.gdpre = encodeURIComponent(n.enabled)), Object(c.m)(n, 'consent') && (j.gdprc = encodeURIComponent(n.consent)), Object(c.m)(n, 'log') && (j.gdprl = Object(a.c)(n.log))), Object(c.m)(b.config, 'useSafeFrames') && b.config.useSafeFrames && (j.sf = '1'); + var E = Object(l.b)(); + E && (Object(f.c)('id', 'bidReq-attachToken'), d.at = E), j.vm = d && 0 !== Object.keys(d).length ? Object(a.c)({ ids: d }) : ''; + var D = Object.keys(j).filter(function (t) { + return Object(c.m)(j, t) && 'undefined' !== j[t] && '' !== j[t] && null !== j[t]; + }).map(function (t) { + return ''.concat(t, '=').concat(j[t]); + }).join('&'); + w.cookiesParams && (D += w.cookiesParams); + var T = ''.concat(o.r).concat(y).concat(h, '/').concat(O, '?').concat(D); + return r.a.dispatch({ + type: 'RECORD_AAX_REQ_PROP', + bidReqID: t.bidReqID, + key: 'urlLength', + value: T.length + }), T; + } catch (t) { + return Object(s.b)(t, 'buildBidUrl', !0), ''; + } + } + function E(t, e) { + try { + return Object(c.m)(t, 'config') && Object(c.m)(t.config, 'deals') && !0 === t.config.deals || !0 === e.needNewBidObject; + } catch (t) { + return Object(s.b)(t, 'isNewBidObjectRequired'), !1; + } + } + function D(t, e, n) { + try { + var r, i = t.map(d.c), a = e.slots.filter(d.d).map(d.c).filter(function (t) { + return !Object(c.j)(i, t); + }); + return r = n ? o.t.bidInFlight : o.t.noBid, t.concat(a.map(function (t) { + return new v({ + size: '0x0', + crid: '', + slotID: t, + mediaType: 'd', + meta: [ + 'slotID', + 'mediaType', + 'size' + ], + amznbid: e = r, + amzniid: '', + amznp: e, + amznsz: '0x0', + targeting: [ + 'amzniid', + 'amznbid', + 'amznp', + 'amznsz' + ] + }); + var e; + })); + } catch (e) { + return Object(s.b)(e, 'addStateTrackingBidsToRealBids'), t; + } + } + function T(t) { + try { + if (Object(c.m)(t, 'slots')) { + var e = r.a.getState().slotIdMap; + t.slots.forEach(function (t) { + null !== t.slotID.match(/^\d+$/) && parseInt(t.slotID, 10) < e.length && (t.slotID = e[parseInt(t.slotID, 10)]); + }); + } + } catch (t) { + Object(s.b)(t, 'mapSlotIDValues'); + } + } + function I(t) { + try { + if (Object(c.j)(r.a.getState().displayAdServer.noBidSlotIDs, t.slotID)) + return !1; + var e = r.a.getState().AAXReqs.filter(function (e) { + return e.bidReqID === t.bidReqID; + })[0]; + return !(Object(c.m)(e, 'rqTs') && Date.now() - e.rqTs > 240000) && (!(Object(c.m)(e, 'url') && !Object(c.b)(e.url, Object(u.g)(window))) && t.bidState !== o.b.rendered); + } catch (e) { + return Object(s.b)(e, 'isBidEligible'), !1; + } + } + function A(t) { + try { + var e = t.map(d.c), n = r.a.getState(); + return Object.keys(n.slotBids).filter(function (t) { + return Object(c.j)(e, t); + }).reduce(function (t, e) { + var i = n.slotBids[e].filter(function (t) { + return t.bidState === o.b.new; + }).filter(I); + if (0 < i.length) { + var c = i[i.length - 1]; + r.a.dispatch({ + type: 'BID_STATE_CHANGE', + slotID: e, + _targetingSetID: c._targetingSetID, + bidState: o.b.exposed + }), t[e] = c; + } + return t; + }, {}); + } catch (t) { + return Object(s.b)(t, 'getNewSlotBidsAndExposeForRequestedSlots'), {}; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return r; + }), n.d(e, 'c', function () { + return i; + }), n.d(e, 'b', function () { + return o; + }), n.d(e, 'e', function () { + return c; + }), n.d(e, 'f', function () { + return a; + }), n.d(e, 'd', function () { + return s; + }); + function r(t, e) { + try { + return 'number' != typeof t[e] ? 0 : Math.round(t[e]); + } catch (t) { + return 0; + } + } + function i(t, e) { + try { + var n = o(t, e)[0]; + if (void 0 !== n) + return n; + } catch (t) { + } + return null; + } + function o(t, e) { + try { + return t.performance.getEntriesByType('resource').filter(function (t) { + return e.test(t.name); + }); + } catch (t) { + return []; + } + } + function c(t, e) { + try { + var n = t.performance.timing[e]; + return void 0 === n ? 0 : n; + } catch (t) { + return 0; + } + } + function a(t) { + try { + if (0 === [ + 'redirectStart', + 'redirectEnd', + 'domainLookupStart', + 'domainLookupEnd', + 'connectStart', + 'connectEnd', + 'requestStart', + 'responseStart', + 'secureConnectionStart' + ].reduce(function (e, n) { + return e + r(t, n); + }, 0)) + return null; + var e = r(t, 'fetchStart'); + return [ + 'domainLookupStart', + 'domainLookupEnd', + 'connectStart', + 'connectEnd' + ].reduce(function (n, i) { + return n && r(t, i) === e; + }, !0); + } catch (t) { + return null; + } + } + function s() { + try { + var t = window.performance.timeOrigin; + return void 0 === t && (t = window.performance.timing.navigationStart), t; + } catch (t) { + return 0; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return o; + }), n.d(e, 'a', function () { + return c; + }), n.d(e, 'd', function () { + return a; + }), n.d(e, 'c', function () { + return s; + }); + var r = n(1), i = n(0); + function o(t) { + var e = []; + try { + t.hasAdServerObjectLoaded() && (e = t.getSlots()); + } catch (t) { + Object(r.b)(t, 'getDisplayAdServerSlots'); + } + return e; + } + function c(t) { + try { + return Object(i.m)(t, 'sizes') && Object(i.k)(t.sizes) && 0 !== t.sizes.length; + } catch (t) { + return Object(r.b)(t, 'doesSlotHaveSizes'), !1; + } + } + function a(t) { + try { + return 'video' !== t.mediaType; + } catch (t) { + return Object(r.b)(t, 'isDisplaySlot'), !0; + } + } + function s(t) { + try { + return t.slotID; + } catch (t) { + return Object(r.b)(t, 'getSlotID'), ''; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return g; + }), n.d(e, 'c', function () { + return y; + }), n.d(e, 'a', function () { + return v; + }); + var r = n(0), i = n(1), o = n(3); + function c(t) { + return (c = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function a(t, e) { + var n = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(t); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function s(t, e, n) { + return (s = 'undefined' != typeof Reflect && Reflect.get ? Reflect.get : function (t, e, n) { + var r = function (t, e) { + for (; !Object.prototype.hasOwnProperty.call(t, e) && null !== (t = f(t));); + return t; + }(t, e); + if (r) { + var i = Object.getOwnPropertyDescriptor(r, e); + return i.get ? i.get.call(n) : i.value; + } + })(t, e, n || t); + } + function u(t, e) { + return (u = Object.setPrototypeOf || function (t, e) { + return t.__proto__ = e, t; + })(t, e); + } + function d(t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + } + function f(t) { + return (f = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + })(t); + } + function b(t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function'); + } + function l(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(t, r.key, r); + } + } + function p(t, e, n) { + return e && l(t.prototype, e), n && l(t, n), t; + } + function m(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + var g = function () { + function t() { + b(this, t), m(this, 'isSupported', !1), m(this, 'needNewBidObject', !1); + } + return p(t, [ + { + key: 'cmdQueuePush', + value: function () { + } + }, + { + key: 'slotRenderEndedEvent', + value: function () { + } + }, + { + key: 'setTargeting', + value: function () { + } + }, + { + key: 'getTargeting', + value: function () { + return []; + } + }, + { + key: 'clearTargeting', + value: function () { + } + }, + { + key: 'hasAdServerObjectLoaded', + value: function () { + return !1; + } + }, + { + key: 'isCommandQueueDefined', + value: function () { + return !1; + } + }, + { + key: 'getSlots', + value: function () { + return []; + } + } + ]), t; + }(), y = function () { + function t(e, n, r) { + b(this, t), m(this, 'mediaType', 'display'), m(this, 'slotID', void 0), m(this, 'slotName', void 0), m(this, 'slotParams', void 0), m(this, 'rawSlot', void 0), this.slotID = e, this.slotName = n, this.slotParams = r; + } + return p(t, [ + { + key: 'reportError', + value: function (t, e, n) { + var r = 2 < arguments.length && void 0 !== n && n; + Object(i.b)(t, 'Slot-'.concat(e), r); + } + }, + { + key: 'setTargeting', + value: function () { + } + }, + { + key: 'getTargeting', + value: function () { + return []; + } + }, + { + key: 'clearTargeting', + value: function () { + } + }, + { + key: 'isValid', + value: function () { + function t(t, e) { + return 'There was an issue with the configuration for this slot: '.concat(JSON.stringify(e), '\n') + t.map(function (t) { + return '- '.concat(t); + }).join('\n'); + } + try { + var e = [], n = []; + if (void 0 === this.slotID ? e.push('\'slotID\' must be provided and a string') : 'string' != typeof this.slotID && n.push('\'slotID\' must be a string'), 'display' === this.mediaType && 0 === this.sizes.length && e.push('\'sizes\' must have at least 1 valid item'), Object(r.m)(this.rawSlot, 'floor') && Object(r.l)(this.rawSlot.floor)) { + var i = this.rawSlot.floor, o = i.currency, c = i.value; + 'USD' !== o && n.push('\'floor\' currency only supports USD'), S(c) || n.push('\'floor\' value must be a positive integer'); + } + return 0 < e.length ? (this.reportError({ + name: 'SlotValidationError', + message: t([].concat(e, n), this.rawSlot) + }, 'validation-error', !0), !1) : (0 < n.length && this.reportError({ + name: 'SlotValidationError', + message: t(n, this.rawSlot) + }, 'validation-warn', !0), !0); + } catch (t) { + return this.reportError(t, 'isValid', !0), !0; + } + } + }, + { + key: 'sizes', + get: function () { + return []; + } + }, + { + key: 'floor', + get: function () { + } + }, + { + key: 'slotConfig', + get: function () { + try { + return { + slotID: this.slotID, + slotName: this.slotName, + sizes: this.sizes + }; + } catch (t) { + return this.reportError(t, 'slotConfig'), { + slotID: '', + slotName: '', + sizes: [] + }; + } + } + }, + { + key: 'aaxSlotParams', + get: function () { + var t = this; + try { + return Object(r.m)(this, 'slotParams') && Object(r.l)(this.slotParams) ? Object.keys(this.slotParams).filter(function (e) { + return function t(e) { + try { + return Object(r.k)(e) ? 0 < e.length && e.reduce(function (e, n) { + return e && t(n); + }, !0) : 'string' == typeof e && 0 < e.length; + } catch (e) { + return Object(i.b)(e, 'validateSlotParamValue'), !1; + } + }(t.slotParams[e]); + }).reduce(function (e, n) { + return e[n] = t.slotParams[n], e; + }, {}) : void 0; + } catch (t) { + return this.reportError(t, 'aaxSlotParams'), this.slotParams; + } + } + }, + { + key: 'aaxSlot', + get: function () { + try { + Object(o.c)('slotType', 'display'); + var t = { + sd: this.slotID, + s: this.sizes.filter(r.k).map(function (t) { + return t.join('x'); + }), + kv: this.aaxSlotParams + }; + return this.slotID !== this.slotName && (t.sn = this.slotName), this.floor && (t.fc = this.floor.currency, t.fp = this.floor.value), t; + } catch (t) { + return this.reportError(t, 'aaxSlot'), { + sd: '', + s: [], + kv: {} + }; + } + } + } + ]), t; + }(), h = [], O = /^[0-9]+x[0-9]+$/, j = /^[0-9]+$/, v = function () { + !function (t, e) { + if ('function' != typeof e && null !== e) + throw new TypeError('Super expression must either be null or a function'); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), e && u(t, e); + }(e, y); + var t = function (t) { + var e = function () { + if ('undefined' == typeof Reflect || !Reflect.construct) + return !1; + if (Reflect.construct.sham) + return !1; + if ('function' == typeof Proxy) + return !0; + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (t) { + return !1; + } + }(); + return function () { + var n, r, i, o = f(t); + if (e) { + var a = f(this).constructor; + n = Reflect.construct(o, arguments, a); + } else + n = o.apply(this, arguments); + return r = this, !(i = n) || 'object' !== c(i) && 'function' != typeof i ? d(r) : i; + }; + }(e); + function e(n) { + var i; + b(this, e), m(d(i = t.call(this, n.slotID, n.slotName, n.slotParams)), 'rawSlot', void 0), m(d(i), 'hasReportedWorkingInvalidSizeError', !1), i.mediaType = 'video' === n.mediaType ? 'video' : 'display', i.rawSlot = function (t) { + for (var e = 1; e < arguments.length; e++) { + var n = null != arguments[e] ? arguments[e] : {}; + e % 2 ? a(Object(n), !0).forEach(function (e) { + m(t, e, n[e]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : a(Object(n)).forEach(function (e) { + Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(n, e)); + }); + } + return t; + }({}, n); + try { + Object(r.m)(i.rawSlot, 'sizes') && Object(r.k)(i.rawSlot.sizes) && (i.rawSlot.sizes = i.rawSlot.sizes.filter(function (t) { + return 'fluid' !== t; + })); + } catch (n) { + i.reportError(n, 'sizeFilter'); + } + return i; + } + return p(e, [ + { + key: 'reportError', + value: function (t, e, n) { + var r = 2 < arguments.length && void 0 !== n && n; + Object(i.b)(t, 'AaxSlot-'.concat(e), r); + } + }, + { + key: 'aaxSlot', + get: function () { + try { + if ('video' !== this.rawSlot.mediaType) + return s(f(e.prototype), 'aaxSlot', this); + Object(o.c)('slotType', 'video'); + var t = { + id: this.slotID, + mt: 'v', + kv: this.aaxSlotParams + }; + return 0 < this.sizes.length && (t.s = this.sizes.filter(r.k).map(function (t) { + return t.join('x'); + })), this.floor && (t.fc = this.floor.currency, t.fp = this.floor.value), t; + } catch (t) { + return this.reportError(t, 'aaxSlot'), { + sd: '', + s: [] + }; + } + } + }, + { + key: 'sizes', + get: function () { + try { + var t = []; + if (Object(r.m)(this.rawSlot, 'sizes') && Object(r.k)(this.rawSlot.sizes)) { + var e = '2d', n = this.rawSlot.sizes; + !(0 < n.length) || Object(r.k)(n[0]) || 'string' == typeof n[0] && O.test(n[0]) || (e = '1d', n = [n]), t = n.filter(function (t) { + return function (t, e) { + function n(t) { + var n = JSON.stringify(t); + -1 === h.indexOf(n) && (h.push(n), Object(i.b)({ + name: 'AaxSlot-InvalidSize', + message: 'Invalid Slot Size: '.concat(JSON.stringify(e)) + }, 'isValidSize-invalid')); + } + try { + return 'string' == typeof e && O.test(e) ? (Object(o.c)('AaxSlotSizes', ''.concat(t, '-compiled')), !0) : Object(r.k)(e) && 1 !== e.length ? (2 < e.length && n(e), e.slice(0, 2).reduce(function (e, n) { + return e ? !('number' != typeof n && 'string' != typeof n || 'string' == typeof n && !j.test(n) || ('string' == typeof n ? Object(o.c)('AaxSlotSizes', ''.concat(t, '-string')) : Object(o.c)('AaxSlotSizes', ''.concat(t, '-number')), 0)) : e; + }, !0)) : (n(e), !1); + } catch (n) { + return Object(i.b)(n, 'isValidSize'), !0; + } + }(e, t); + }).map(function (t) { + return Object(r.k)(t) ? t : t.split('x').map(function (t) { + return parseInt(t, 10); + }); + }); + } + return t; + } catch (t) { + return this.reportError(t, 'sizes'), []; + } + } + }, + { + key: 'floor', + get: function () { + var t; + try { + Object(r.m)(this.rawSlot, 'floor') && 'USD' === this.rawSlot.floor.currency && S(this.rawSlot.floor.value) ? (t = this.rawSlot.floor, Object(o.c)('customFloor', 'y')) : Object(o.c)('customFloor', 'n'); + } catch (t) { + this.reportError(t, 'floor'); + } + return t; + } + } + ]), e; + }(); + function S(t) { + return 'number' == typeof t && 0 < t && t % 1 == 0; + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return y; + }), n.d(e, 'a', function () { + return h; + }), n.d(e, 'd', function () { + return j; + }), n.d(e, 'c', function () { + return v; + }); + var r = n(1), i = n(15), o = n(8), c = n(3), a = n(2), s = n(6), u = n(0); + function d(t) { + return (d = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + var f = ['email'], b = /@/, l = /^[0-9a-fA-F]{64}$/, p = 'noconsent'; + function m(t) { + return t === p ? 'AMZN-NoCookieConsent' : 'AMZN-Token'; + } + function g(t, e, n) { + var i = 0 < arguments.length && void 0 !== t ? t : '', o = 1 < arguments.length && void 0 !== e ? e : 0, c = 2 < arguments.length && void 0 !== n ? n : 'token'; + try { + var a = new Date(o).toUTCString(); + document.cookie = ''.concat(m(c), '=').concat(i, '; expires=').concat(a, '; path=/;'); + } catch (t) { + Object(r.b)(t, 'setAmznToken-'.concat(c), !0); + } + } + function y() { + var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 'token'; + try { + var e = Object(u.d)().filter(function (e) { + return e[0] === m(t); + }); + return 0 === e.length ? '' : e[0][1]; + } catch (e) { + return Object(r.b)(e, 'getAmznToken-'.concat(t), !0), ''; + } + } + function h(t) { + var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 'api'; + try { + if (void 0 !== t && 'function' != typeof t) + throw new Error('Callback function must be a function, '.concat(d(t), ' provided')); + 'function' != typeof t && (t = function () { + }), g(), g('', 0, 'noconsent'), Object(c.c)('id', 'd-'.concat(e)); + } catch (t) { + Object(r.b)(t, 'deleteIdentity', !0); + } + t(); + } + function O(t, e, n) { + try { + e = Object(s.a)(e); + var i = a.a.getState().config; + if (!Object(u.m)(i, 'pubID')) + throw new Error('apstag.init must be called before ID functions'); + var d = { + url: 'https://tk.amazon-adsystem.com/envelope', + onload: function (t) { + try { + if (t.readyState === XMLHttpRequest.DONE && 200 === t.status) { + var n = JSON.parse(t.responseText); + if ('string' != typeof n.AIPToken || 'number' != typeof n.cookieExpiry) + return e(), void Object(r.b)(new Error('Invalid AIPES response'), 'callAipes-response'); + '' === n.AIPToken ? (Object(c.c)('id', 'endReqAipes-tokenEmpty'), g('1', n.cookieExpiry, p)) : (Object(c.c)('id', 'endReqAipes-tokenAvailable'), g(n.AIPToken, n.cookieExpiry), Object(c.f)()); + } else + t.readyState === XMLHttpRequest.DONE && Object(r.b)(new Error('AIPES response code: '.concat(t.status)), 'callAipes-onload', !0); + } catch (t) { + Object(r.b)(t, 'callAipes-onload', !0); + } + e(); + }, + onerror: function () { + Object(r.b)(new Error('AIPES response code: '.concat(this.status)), 'callAipes-onerror', !0), e(); + }, + ontimeout: function () { + Object(r.b)(new Error('AIPES request timeout'), 'callAipes-ontimeout', !0), e(); + }, + headers: { 'Content-Type': 'application/json' }, + body: function (t, e, n) { + try { + var i = { + publisherId: e.pubID, + hashedRecords: t.hashedRecords + }; + return n.enabled ? (i.gdpr = 1, void 0 !== n.consent && (i.gdprConsent = n.consent)) : 0 === n.enabled && (i.gdpr = 0), void 0 !== t.ttl && (i.ttl = t.ttl), JSON.stringify(i); + } catch (t) { + return Object(r.b)(t, 'buildAipesBody', !0), ''; + } + }(t, i, n) + }; + Object(c.c)('id', 'startReqAipes'), Object(o.d)(d); + } catch (t) { + Object(r.b)(t, 'callAipes', !0), e(); + } + } + function j(t, e) { + var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : 'api'; + 'function' != typeof e && (e = function () { + }); + try { + if (!Object(u.l)(t)) + throw new Error('\'tokenConfig\' must be an object, '.concat('object' === d(t) ? 'null' : d(t), ' provided')); + if (t.optOut) + return void h(e, 'u-oo'); + if (h(function () { + }, 'u'), Object(c.c)('id', 'u-'.concat(n)), !function (t) { + try { + var e = []; + return !Object(u.m)(t, 'gdpr') || Object(u.l)(t.gdpr) && !Object(u.k)(t.gdpr) ? Object(u.m)(t, 'gdpr') && (Object(u.m)(t.gdpr, 'enabled') && -1 === [ + !0, + !1 + ].indexOf(t.gdpr.enabled) && e.push('`gdpr.enabled` must be a boolean'), Object(u.m)(t.gdpr, 'consent') && 'string' != typeof t.gdpr.consent && e.push('\'gdpr.consent\' must be a valid IAB-formatted string')) : e.push('`gdpr` must be an Object'), Object(u.m)(t, 'optOut') && -1 === [ + !0, + !1 + ].indexOf(t.optOut) && e.push('\'optOut\' must be a boolean'), Object(u.m)(t, 'hashedRecords') && Object(u.k)(t.hashedRecords) ? 1 !== t.hashedRecords.length ? e.push('\'hashedRecords\' must contain exactly one item') : t.hashedRecords.forEach(function (t) { + Object(u.m)(t, 'type') && -1 !== f.indexOf(t.type) || e.push('\'type\' must be \'email\' in item \''.concat(JSON.stringify(t), '\'')), Object(u.m)(t, 'encrypted') && 'boolean' != typeof t.encrypted && e.push('\'encrypted\' must be a boolean in item \''.concat(JSON.stringify(t), '\'')), Object(u.m)(t, 'record') && 'string' == typeof t.record ? t.encrypted || l.test(t.record) ? t.encrypted && b.test(t.record) && e.push('\'record\' must NOT be an un-hashed, un-encrypted email') : e.push('\'record\' must be a SHA256 hash in item \''.concat(JSON.stringify(t), '\'')) : e.push('\'record\' must be a string in item \''.concat(JSON.stringify(t), '\'')); + }) : e.push('\'hashedRecords\' must be an array'), Object(u.m)(t, 'ttl') && ('number' != typeof t.ttl || isNaN(t.ttl) || t.ttl <= 0 || t.ttl % 1 != 0) && e.push('\'ttl\' must be a positive integer'), 0 < e.length ? void Object(r.b)({ + name: 'TokenConfigValidationError', + message: 'There was an issue with the TokenConfig provided '.concat(JSON.stringify(t), ':\n') + e.map(function (t) { + return '- '.concat(t); + }).join('\n') + }, 'validateTokenConfig-invalid', !0) : 1; + } catch (t) { + return void Object(r.b)(t, 'validateTokenConfig', !0); + } + }(t)) + return void e(); + Object(i.a)(t.gdpr, O.bind(null, t, e)); + } catch (t) { + Object(r.b)(t, 'updateIdentity', !0), e(); + } + } + function v(t, e) { + 'function' != typeof e && (e = function () { + }); + try { + if (!Object(u.l)(t)) + throw new Error('\'tokenConfig\' must be an object, '.concat('object' === d(t) ? 'null' : d(t), ' provided')); + if (t.optOut) + return void h(e, 'r-oo'); + if ('' !== y('noconsent')) + return void e(); + if ('' !== y()) + return e(), void Object(c.c)('id', 'r-noop'); + j(t, e, 'r'); + } catch (t) { + Object(r.b)(t, 'renewIdentity', !0), e(); + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'a', function () { + return b; + }); + var r = n(1), i = n(3), o = n(0); + function c(t) { + return (c = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function a(t, e) { + var n = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(t); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function s(t) { + for (var e = 1; e < arguments.length; e++) { + var n = null != arguments[e] ? arguments[e] : {}; + e % 2 ? a(Object(n), !0).forEach(function (e) { + u(t, e, n[e]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : a(Object(n)).forEach(function (e) { + Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(n, e)); + }); + } + return t; + } + function u(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + Number.isInteger = Number.isInteger || function (t) { + return 'number' == typeof t && isFinite(t) && Math.floor(t) === t; + }; + var d = '__cmp', f = '__tcfapi'; + function b(t, e) { + var n = !1, a = { log: { status: 'no-status' } }, u = 50, b = 'global-func-error'; + function l() { + n || (n = !0, e(s(s({}, a), {}, { log: s({}, a.log) }))); + } + e = Object(r.d)(e, 'GdprCallback'); + var p = 'null'; + function m(t, e) { + try { + if (!e || !Object(o.l)(t)) + return a.log.status = ''.concat(p, '-error'), void l(); + a.log.status = ''.concat(p, '-success'), Object(o.m)(t, 'tcString') ? a.consent = t.tcString : Object(o.m)(t, 'consentData') && (a.consent = t.consentData), a.enabled = t.gdprApplies ? 1 : 0, 0 === a.enabled && delete a.consent, l(); + } catch (t) { + a.log.status = 'func-error', l(), Object(r.b)(t, 'cmpCallback-'.concat(p), !0); + } + } + try { + if (!1 === (t = Object(o.l)(t) ? s({}, t) : {}).enabled || 0 === t.enabled ? (a.log.status = 'explicit-no-gdpr', a.enabled = 0) : !0 === t.enabled || 1 === t.enabled ? (a.log.status = Object(o.m)(t, 'consent') ? 'explicit-consent-passed' : 'explicit-no-consent-passed', a.enabled = 1, a.consent = t.consent) : Object(o.m)(t, 'enabled') && (a.log.status = Object(o.m)(t, 'consent') ? 'malformed-with-consent' : 'malformed-without-consent', a.consent = t.consent, Number.isInteger(t.enabled) ? a.enabled = t.enabled : a.enabled = 1), Object(o.m)(t, 'enabled') && (a.log.enabled = t.enabled), Object(o.m)(t, 'cmpTimeout') && Number.isInteger(t.cmpTimeout) && (u = t.cmpTimeout, a.log.cmpTimeout = u), void 0 !== a.enabled) + return Object(i.c)('gdpr', 'pub-api'), Object(o.m)(a, 'consent') && 'string' != typeof a.consent && (delete a.consent, Object(r.b)(new Error('Invalid consent: must be string, given '.concat(c(a.consent))), 'getGdprConfig-pub-consent-invalid', !0)), void l(); + } catch (t) { + Object(r.b)(t, 'getGdprConfig-parseConfig', !0); + } + try { + if (Object(o.m)(window, f) && 'function' == typeof window[f]) + p = 'tcfv2'; + else { + if (!Object(o.m)(window, d) || 'function' != typeof window[d]) + return Object(i.c)('gdpr', 'no-cmp'), a.log.status = 'no-cmp', void l(); + p = 'cmp'; + } + Object(i.c)('gdpr', p), setTimeout(function () { + a.log.status = ''.concat(p, '-timeout'), l(); + }, u), b = ''.concat(p, '-internal-error'), 'cmp' === p ? window[d]('getConsentData', null, m) : window[f]('getTCData', 2, m); + } catch (t) { + a.log.status = b, l(), Object(r.b)(t, 'getGdprConfig-'.concat(b), !0); + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return m; + }), n.d(e, 'a', function () { + return g; + }); + var r = n(0), i = n(13), o = n(1); + function c(t) { + return (c = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + function a(t, e) { + if (!(t instanceof e)) + throw new TypeError('Cannot call a class as a function'); + } + function s(t, e) { + for (var n = 0; n < e.length; n++) { + var r = e[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(t, r.key, r); + } + } + function u(t, e, n) { + return e && s(t.prototype, e), n && s(t, n), t; + } + function d(t, e) { + if ('function' != typeof e && null !== e) + throw new TypeError('Super expression must either be null or a function'); + t.prototype = Object.create(e && e.prototype, { + constructor: { + value: t, + writable: !0, + configurable: !0 + } + }), e && function (t, e) { + (Object.setPrototypeOf || function (t, e) { + return t.__proto__ = e, t; + })(t, e); + }(t, e); + } + function f(t) { + var e = function () { + if ('undefined' == typeof Reflect || !Reflect.construct) + return !1; + if (Reflect.construct.sham) + return !1; + if ('function' == typeof Proxy) + return !0; + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (t) { + return !1; + } + }(); + return function () { + var n, r, i, o = l(t); + if (e) { + var a = l(this).constructor; + n = Reflect.construct(o, arguments, a); + } else + n = o.apply(this, arguments); + return r = this, !(i = n) || 'object' !== c(i) && 'function' != typeof i ? b(r) : i; + }; + } + function b(t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + } + function l(t) { + return (l = Object.setPrototypeOf ? Object.getPrototypeOf : function (t) { + return t.__proto__ || Object.getPrototypeOf(t); + })(t); + } + function p(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + var m = function () { + d(e, i.c); + var t = f(e); + function e(n) { + var r; + return a(this, e), p(b(r = t.call(this, n.getSlotElementId(), n.getAdUnitPath())), 'rawSlot', void 0), p(b(r), 'mediaType', 'display'), r.rawSlot = n, r; + } + return u(e, [ + { + key: 'reportError', + value: function (t, e, n) { + var r = 2 < arguments.length && void 0 !== n && n; + Object(o.b)(t, 'GptSlot-'.concat(e), r); + } + }, + { + key: 'setTargeting', + value: function (t, e) { + try { + this.rawSlot.setTargeting(t, e); + } catch (t) { + this.reportError(t, 'setTargeting'); + } + } + }, + { + key: 'getTargeting', + value: function (t) { + try { + return this.rawSlot.getTargeting(t); + } catch (t) { + return this.reportError(t, 'getTargeting'), []; + } + } + }, + { + key: 'clearTargeting', + value: function (t) { + try { + this.rawSlot.clearTargeting(t); + } catch (t) { + this.reportError(t, 'clearTargeting'); + } + } + }, + { + key: 'sizes', + get: function () { + try { + var t = Object(r.h)(window).split('x').map(function (t) { + return Number(t); + }), e = this.rawSlot.getSizes(t[0], t[1]); + return null === e ? [] : e.filter(function (t) { + return 'fluid' !== t; + }).map(function (t) { + return [ + t.getWidth(), + t.getHeight() + ]; + }); + } catch (t) { + return this.reportError(t, 'sizes'), []; + } + } + } + ]), e; + }(), g = function () { + d(e, i.b); + var t = f(e); + function e() { + var n; + a(this, e); + for (var r = arguments.length, i = new Array(r), o = 0; o < r; o++) + i[o] = arguments[o]; + return p(b(n = t.call.apply(t, [this].concat(i))), 'isSupported', !0), n; + } + return u(e, [ + { + key: 'reportError', + value: function (t, e) { + Object(o.b)(t, 'GoogletagAdServer-'.concat(e)); + } + }, + { + key: 'cmdQueuePush', + value: function (t) { + try { + window.googletag.cmd.push(t); + } catch (t) { + this.reportError(t, 'cmdQueuePush'); + } + } + }, + { + key: 'slotRenderEndedEvent', + value: function (t) { + try { + window.googletag.pubads().addEventListener('slotRenderEnded', function (e) { + var n = new m(e.slot); + t(n); + }); + } catch (t) { + this.reportError(t, 'slotRenderEndedEvent'); + } + } + }, + { + key: 'setTargeting', + value: function (t, e) { + try { + window.googletag.pubads().setTargeting(t, e); + } catch (t) { + this.reportError(t, 'setTargeting'); + } + } + }, + { + key: 'getTargeting', + value: function (t) { + try { + return window.googletag.pubads().getTargeting(t) || []; + } catch (t) { + return this.reportError(t, 'getTargeting'), []; + } + } + }, + { + key: 'clearTargeting', + value: function (t) { + try { + window.googletag.pubads().clearTargeting(t); + } catch (t) { + this.reportError(t, 'clearTargeting'); + } + } + }, + { + key: 'hasAdServerObjectLoaded', + value: function () { + try { + return Object(r.m)(window, 'googletag') && Object(r.m)(window.googletag, 'apiReady') && !0 === window.googletag.apiReady; + } catch (t) { + return this.reportError(t, 'hasAdServerObjectLoaded'), !1; + } + } + }, + { + key: 'isCommandQueueDefined', + value: function () { + try { + return Object(r.m)(window, 'googletag') && Object(r.m)(window.googletag, 'cmd'); + } catch (t) { + return this.reportError(t, 'isCommandQueueDefined'), !1; + } + } + }, + { + key: 'getSlots', + value: function () { + try { + return window.googletag.pubads().getSlots().map(function (t) { + return new m(t); + }); + } catch (t) { + return this.reportError(t, 'getSlots'), []; + } + } + } + ]), e; + }(); + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'c', function () { + return o; + }), n.d(e, 'a', function () { + return c; + }), n.d(e, 'b', function () { + return a; + }); + var r = n(1), i = n(0); + function o(t) { + try { + return !(!Object(i.m)(t, '$sf') || !Object(i.m)(t.$sf, 'ext')); + } catch (t) { + return Object(r.b)(t, 'isSafeFrame'), !1; + } + } + function c(t, e) { + try { + var n = e.innerWidth, i = e.innerHeight, o = parseInt(t[0], 10), c = parseInt(t[1], 10), a = o - n, s = c - i, u = e.sfAPI || e.$sf.ext; + u && (n === o && i === c || (u.register(o, c), u.expand({ + r: a, + b: s, + push: !0 + }))); + } catch (t) { + Object(r.b)(t, 'expandSf'); + } + } + function a(t) { + try { + return 1 === t.innerWidth && 1 === t.innerHeight; + } catch (t) { + return Object(r.b)(t, 'is1x1Creative'), !1; + } + } + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return r; + }), n.d(e, 'd', function () { + return i; + }), n.d(e, 'c', function () { + return l; + }), n.d(e, 'a', function () { + return g; + }); + var o = n(8), c = n(1), a = n(4), s = n(5), u = n(2), d = n(6), b = n(0), p = n(10), m = n(3); + function r() { + const $___old_f7ecb51abbda9562 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_f7ecb51abbda9562) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_ba1c6ba55dfe66f1.localStorage)); + return function () { + var r = u.a.getState().experiments.shouldSampleLatency; + if (Object(b.i)()) { + var t = window.localStorage.getItem(a.j); + t && (window.apstag.thirdPartyData.ids = JSON.parse(t)); + } + var i = Date.now(), e = { + url: f(), + withCredentials: !0, + onload: function t(e) { + if (200 === e.status) + try { + u.a.dispatch({ + type: 'RECORD_LIBRARY_LOAD_CALL_LATENCY', + latency: Date.now() - i + }), r && setTimeout(m.d, 1000); + var n = JSON.parse(e.response); + eval(n['3pvendor']); + } catch (t) { + Object(c.b)(t, 'load3PLibraryConfig-onload', !0); + } + }, + onerror: function () { + } + }; + try { + Object(o.d)(e); + } catch (t) { + Object(c.b)(t, 'load3PLibraryConfig', !0); + } + r && setTimeout(m.d, 1000); + }.apply(this, arguments); + } finally { + if ($___old_f7ecb51abbda9562) + ({}.constructor.defineProperty(window, 'localStorage', $___old_f7ecb51abbda9562)); + } + } + function f() { + try { + var t, e = u.a.getState(), n = e.config, r = Object(s.c)('host', e.hosts.DEFAULT_AAX_BID_HOST), i = e.cfg.LIB_CONFIG_PATH; + t = { + src: n.isSelfServePub ? a.s : n.pubID, + u: Object(d.g)(window) + }, n.isSelfServePub && (t.pubid = n.pubID); + var o = Object.keys(t).map(function (e) { + return ''.concat(e, '=').concat(t[e]); + }).join('&'); + return ''.concat(a.r).concat(r).concat(i, '?').concat(o); + } catch (e) { + return Object(c.b)(e, 'buildLibraryConfigUrl', !0), ''; + } + } + function i() { + return Object(b.m)(window, 'creativeVendorLibraryLoaded') && !0 === window.creativeVendorLibraryLoaded || Object(b.m)(window, 'confiant'); + } + function l() { + var t; + t = { renderTimes: {} }, window.addEventListener('message', function (e) { + if (Object(b.l)(e.data)) { + var n; + if (Object(b.m)(e.data, 'bidInfo')) + if (Object(b.m)(e.data.bidInfo, 'src')) { + var r = e.data.bidInfo.src; + n = new URL(r).searchParams.get('b'); + } else if (Object(b.m)(e.data.bidInfo, 'jsonp')) { + var i = e.data.bidInfo.jsonp; + n = JSON.parse(i.substr(17, i.length - 20)).amzniid; + } + if (Object(b.m)(e.data, 'renderData')) { + var o = e.data.renderData, c = o.id; + if (Object(b.m)(o, 'renderStart') || Object(b.m)(o, 'renderEnd')) { + var a = o.renderStart, s = o.renderEnd; + if (a) + t.renderTimes[c] = { timeStamp: a }, n && (t.renderTimes[c].bidId = n); + else if (s && Object(b.m)(t.renderTimes, c) && 0 !== t.renderTimes[c].timeStamp) { + var u = s - t.renderTimes[c].timeStamp, d = { + _type: 'iframeRender', + c: 'dtb', + pid: p.b, + crt: u + }; + t.renderTimes[c].bidId && (n = t.renderTimes[c].bidId), n ? Object(m.a)(n, d) : Object(m.b)(d); + } + } + } + if (Object(b.m)(e.data, 'blockData')) { + var f = e.data.blockData.blockInfo, l = { + _type: 'malwareBlock', + c: 'dtb', + tpbr: 1, + pid: p.b, + info: f + }; + n ? Object(m.a)(n, l) : Object(m.b)(l); + } + } + }, !0); + } + function g(t, e) { + window.apstag.thirdPartyData.ids ? e(window.apstag.thirdPartyData.ids) : e({}); + } + }, + function (t, e, n) { + 'use strict'; + function r(t) { + return void 0 !== t.amzniid; + } + function i(t) { + return void 0 !== t.kvMap; + } + n.d(e, 'b', function () { + return r; + }), n.d(e, 'a', function () { + return i; + }); + }, + function (t, e, n) { + 'use strict'; + n.d(e, 'b', function () { + return c; + }), n.d(e, 'a', function () { + return a; + }); + var r = n(4), i = n(0), o = n(1); + function c(t) { + try { + return Object(i.m)(t, 'debug'); + } catch (t) { + return Object(o.b)(t, 'isApstagLibrary'), !1; + } + } + function a(t) { + try { + return !!Object(i.m)(t, r.a) && !0 === t[r.a]; + } catch (t) { + return Object(o.b)(t, 'hasApstagJsLoaded'), !1; + } + } + }, + , + , + , + , + , + function (t, e, n) { + t.exports = n(27); + }, + function (t, e, n) { + 'use strict'; + n.r(e); + var zt = n(15), xt = n(2), Bt = n(6), Lt = n(0), Nt = n(12), qt = n(5), Ft = n(4), Ut = n(11), Mt = n(17), Ht = n(3), Qt = n(1), Xt = n(8), Gt = n(16), r = n(20), Vt = n(7), Kt = n(10), Jt = n(13), Yt = n(19), Wt = n(9), $t = n(18), Zt = n(14); + function te(t) { + return a(t) || c(t) || o(t) || i(); + } + function i() { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + function o(t, e) { + if (t) { + if ('string' == typeof t) + return s(t, e); + var n = Object.prototype.toString.call(t).slice(8, -1); + return 'Object' === n && t.constructor && (n = t.constructor.name), 'Map' === n || 'Set' === n ? Array.from(t) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? s(t, e) : void 0; + } + } + function c(t) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(t)) + return Array.from(t); + } + function a(t) { + if (Array.isArray(t)) + return s(t); + } + function s(t, e) { + (null == e || e > t.length) && (e = t.length); + for (var n = 0, r = new Array(e); n < e; n++) + r[n] = t[n]; + return r; + } + function u(t, e) { + var n = Object.keys(t); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(t); + e && (r = r.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function ee(t) { + for (var e = 1; e < arguments.length; e++) { + var n = null != arguments[e] ? arguments[e] : {}; + e % 2 ? u(Object(n), !0).forEach(function (e) { + ne(t, e, n[e]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(t, Object.getOwnPropertyDescriptors(n)) : u(Object(n)).forEach(function (e) { + Object.defineProperty(t, e, Object.getOwnPropertyDescriptor(n, e)); + }); + } + return t; + } + function ne(t, e, n) { + return e in t ? Object.defineProperty(t, e, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[e] = n, t; + } + function re(t) { + return (re = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (t) { + return typeof t; + } : function (t) { + return t && 'function' == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? 'symbol' : typeof t; + })(t); + } + try { + var d = Object(r.b)(window.apstag); + d ? Object(Qt.b)(new Error('apstag has already loaded - preventing duplicate load'), 'apstag-duplicateLoad', !0) : (Object(r.a)(window) && Object(Qt.b)(new Error('apstag was loaded and then destroyed'), 'apstag-destroyReload', !0), window.apstagLOADED = !0, function () { + var b = Object(Ut.e)(window, 'navigationStart'), t = 'ls', e = Object(qt.d)('console') || function () { + try { + return -1 !== window.location.href.indexOf('amzn_debug_console=1') && (t = 'url', !0); + } catch (t) { + return !1; + } + }(), n = Object(qt.d)('console_v2') || function () { + try { + return -1 !== window.location.href.indexOf('amzn_debug_console=2') && (t = 'url', !0); + } catch (t) { + return !1; + } + }(); + function r(t) { + try { + t.ts = Date.now(), xt.a.dispatch({ + type: 'LOG_EVENT', + event: t + }); + } catch (t) { + Object(Qt.b)(t, '_logEvent'); + } + } + function i(t) { + function e(t) { + try { + if (!xt.a.getState().cmpFired) { + xt.a.dispatch({ type: 'CMP_FIRED' }); + var e = document.createElement('iframe'); + e.style.display = 'none', e.src = t, document.body.appendChild(e); + } + } catch (t) { + Object(Qt.b)(t, '_doCookieMatch-ready'); + } + } + try { + 'loading' === document.readyState ? document.addEventListener && document.addEventListener('DOMContentLoaded', function () { + e(t); + }, !1) : e(t); + } catch (t) { + Object(Qt.b)(t, '_doCookieMatch'); + } + } + function o(t) { + try { + var e = xt.a.getState().cfg.COOKIE_MATCH_DELAY; + setTimeout(function () { + try { + Object(Lt.m)(t, 'cmp') ? i(t.cmp) : Object(Lt.m)(t, 'cmpjs') && Object(Xt.b)(t.cmpjs); + } catch (t) { + Object(Qt.b)(t, '_tryCookieMatch-setTimeout'); + } + }, e); + } catch (t) { + Object(Qt.b)(t, '_tryCookieMatch'); + } + } + function c(t) { + try { + return !xt.a.getState().experiments.chunkRequests || 0 === xt.a.getState().bidReqs[t.split('-')[0]].networkReqs.filter(function (t) { + return t.inFlight; + }).length; + } catch (t) { + return Object(Qt.b)(t, '_isRequestComplete'), 1; + } + } + function a(t, e) { + try { + !xt.a.getState().bidReqs[t].hasCallbackExecuted && c(t) && (xt.a.dispatch({ + type: 'RECORD_CALLBACK', + fid: t + }), e()); + } catch (t) { + Object(Qt.b)(t, '_checkAndCallCallback'); + } + } + function s(t) { + try { + xt.a.getState().experiments.chunkRequests && xt.a.dispatch({ + type: 'RECORD_NETWORK_EXCHANGE', + fid: t[0], + timestamp: Date.now(), + exchangeType: 'response', + networkID: parseInt(t[1], 10) + }); + } catch (t) { + Object(Qt.b)(t, '_recordResponse'); + } + } + function p(t, r, e) { + var i = e.split('-'), n = { + url: t, + withCredentials: !0, + onload: function t(e) { + try { + s(i); + var n = e.responseText; + eval(n), a(i[0], r); + } catch (t) { + Object(Qt.b)(t, '_xhrBid-onload', !0); + } + }, + onerror: function () { + try { + s(i), a(i[0], r); + } catch (t) { + Object(Qt.b)(t, '_xhrBid-onerror', !0); + } + } + }; + try { + Object(Xt.d)(n); + } catch (t) { + Object(Qt.b)(t, '_xhrBid', !0), s(i), a(i[0], r); + } + } + function u(t) { + try { + var e = new Date(); + return e.setTime(e.getTime() + 1000 * t), e.toUTCString(); + } catch (t) { + return Object(Qt.b)(t, '_getCookieExpiry'), 'Thu, 01 Jan 1970 00:00:00 GMT'; + } + } + function d(t) { + try { + Object(Lt.m)(t, 'cr') && t.cr.forEach(function (t) { + document.cookie = ''.concat(t.k, '=').concat(t.v, ';expires=').concat(-1 !== t.exp ? u(t.exp) : Object(Lt.g)(365), ';path=/;'); + }); + } catch (t) { + Object(Qt.b)(t, '_setFirstPartyCookies'); + } + } + function f(t) { + try { + if (Object(Lt.m)(t, 'cb')) { + xt.a.dispatch({ + type: 'RECORD_AAX_REQ_PROP', + bidReqID: t.cb, + key: 'resTs', + value: Date.now() + }); + var e = new RegExp('e/dtb/bid.*cb='.concat(t.cb)); + xt.a.dispatch({ + type: 'RECORD_AAX_REQ_PROP', + bidReqID: t.cb, + key: 'perf', + value: Object(Ut.c)(window, e) + }); + } + Object(Lt.m)(t, 'cfg') && xt.a.dispatch({ + type: 'SET_CFG', + cfg: t.cfg + }), K(t); + } catch (t) { + Object(Qt.b)(t, '_doOnAaxResponse', !0); + } + } + function l(t) { + const $___old_3b148167bec26c06 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_3b148167bec26c06) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_ba1c6ba55dfe66f1.localStorage)); + return function () { + try { + if (o(t), d(t), Object(Lt.m)(t, 'cfg') && localStorage.setItem(Ft.c, JSON.stringify(t.cfg)), Object(Lt.m)(t, 'st') && Object(Lt.j)(t.st, 917) && xt.a.getState().sync917) { + xt.a.dispatch({ + type: 'SET_SYNC_917', + value: !1 + }); + try { + P(); + } catch (t) { + Object(Qt.b)(t, '__error-doFbSync__'); + } + } + m(t), Object(Bt.j)(t) || Object(Ht.f)(); + } catch (t) { + Object(Qt.b)(t, '_doAfterAaxResponse', !0); + } + }.apply(this, arguments); + } finally { + if ($___old_3b148167bec26c06) + ({}.constructor.defineProperty(window, 'localStorage', $___old_3b148167bec26c06)); + } + } + function m(t) { + try { + if (Object(Lt.m)(t, 'fp')) { + var e = t.fp; + Object(Lt.m)(e, 'length') && e.forEach(function (t) { + var e = t.d ? t.d : 0; + setTimeout(function () { + Object(Ht.e)(t.s); + }, e); + }); + } + } catch (t) { + Object(Qt.b)(t, 'fireAAXPixels'); + } + } + function g() { + try { + xt.a.getState().Q.forEach(function (t) { + var e = 'init'; + switch (t[0]) { + case 'i': + e = 'init'; + break; + case 'f': + e = 'fetchBids'; + break; + case 'di': + e = 'deleteId'; + break; + case 'ri': + e = 'renewId'; + break; + case 'ui': + e = 'updateId'; + break; + default: + return; + } + window.apstag[e].apply(null, t[1]); + }); + } catch (t) { + Object(Qt.b)(t, '_QHandler', !0); + } + } + function h(t) { + try { + Object(Lt.l)(t) || (Object(Qt.c)('init.config', re(t), 'object'), t = { pubID: 'err' }), Object(Wt.b)(t.pubID, [ + 'string', + 'number' + ]) ? 'number' == typeof t.pubID && (t.pubID = ''.concat(t.pubID)) : Object(Qt.c)('init.config.pubID', re(t.pubID), 'string'), Object(Wt.b)(t.adServer, [ + 'undefined', + 'string' + ]) || Object(Qt.c)('init.config.adServer', re(t.adServer), 'string'), Object(Wt.a)(t.bidTimeout) || ('string' == typeof t.bidTimeout ? Object(Qt.b)({ + name: 'string-'.concat(t.bidTimeout), + message: 'init.config.bidTimeout was a non-numeric string \''.concat(t.bidTimeout, '\'') + }, 'TypeError-init.config.bidTimeout', !0) : Object(Qt.c)('init.config.bidTimeout', re(t.bidTimeout), 'number')), Object(Wt.b)(t.gdpr, [ + 'undefined', + 'object' + ]) ? 'object' === re(t.gdpr) && (Object(Wt.a)(t.gdpr.cmpTimeout) || (Object(Wt.b)(t.gdpr.cmpTimeout, [ + 'string', + 'undefined' + ]) ? Object(Qt.b)({ + name: 'string-'.concat(t.bidTimeout), + message: 'init.config.gdpr.cmpTimeout was a non-numeric string \''.concat(t.gdpr.cmpTimeout, '\'') + }, 'TypeError-init.config.gdpr.cmpTimeout', !0) : Object(Qt.c)('init.config.gdpr.cmpTimeout', re(t.gdpr.cmpTimeout), 'number'))) : Object(Qt.c)('init.config.gdpr', re(t.gdpr), 'object'), Object(Lt.m)(t, 'params') && !Object(Lt.l)(t.params) ? Object(Qt.c)('init.config.params', re(t.params), 'object') : Object(Lt.m)(t, 'params') && Object.keys(t.params).forEach(function (e) { + return !(!Object(Lt.m)(t, 'params') || 'string' != typeof t.params[e] && 'number' != typeof t.params[e] && (Object(Lt.k)(t.params[e]) ? !t.params[e].reduce(function (t, e) { + return t && ('string' == typeof e || 'number' == typeof e); + }, !0) && (Object(Qt.b)({ + name: 'non-string array item', + message: '\'init.config.params.'.concat(e, ' contains a non-string item') + }, 'TypeError-init.config.params.'.concat(e), !0), 1) : (Object(Qt.c)('init.config.params.'.concat(e), re(t.params[e]), 'string\' or \'array'), 1))); + }), Object(Lt.m)(t, 'params') && Object(Lt.m)(t.params, 'us_privacy') && 'string' == typeof t.params.us_privacy && Ft.x.test(t.params.us_privacy) ? Object(Ht.c)('ccpa', 'y') : Object(Lt.m)(t, 'params') && Object(Lt.m)(t.params, 'us_privacy') ? Object(Ht.c)('ccpa', 'i') : Object(Ht.c)('ccpa', 'n'), Object(Lt.m)(t, 'blockedBidders') && !Object(Lt.k)(t.blockedBidders) ? Object(Qt.c)('init.config.blockedBidders', re(t.blockedBidders), 'array') : Object(Lt.m)(t, 'blockedBidders') && Object(Lt.k)(t.blockedBidders) && (t.blockedBidders.reduce(function (t, e) { + return t && ('string' == typeof e || 'number' == typeof e); + }, !0) || Object(Qt.b)({ + name: 'non-string array item', + message: '\'init.config.blockedBidders contains a non-string item' + }, 'TypeError-init.config.blockedBidders', !0)), Object(Lt.m)(t, 'blockedBidders') ? Object(Ht.c)('blockedBidders-init', 'y') : Object(Ht.c)('blockedBidders-init', 'n'), Object(Wt.b)(t.simplerGPT, [ + 'undefined', + 'boolean' + ]) || Object(Qt.c)('init.config.simplerGPT', re(t.simplerGPT), 'boolean'), t.simplerGPT ? Object(Ht.c)('simplerGpt', 'y') : Object(Ht.c)('simplerGpt', 'n'), Object(Wt.b)(t.deals, [ + 'undefined', + 'boolean' + ]) || Object(Qt.c)('init.config.deals', re(t.deals), 'boolean'), t.deals ? Object(Ht.c)('deals', 'y') : Object(Ht.c)('deals', 'n'), Object(Wt.b)(t.schain, [ + 'undefined', + 'object' + ]) && null !== t.schain ? Object(Lt.m)(t, 'schain') && !Object(Kt.i)(t.schain) && delete t.schain : (Object(Qt.c)('init.config.schain', re(t.schain), 'object'), delete t.schain), Object(Lt.m)(t, 'schain') ? Object(Ht.c)('schain', 'y') : Object(Ht.c)('schain', 'n'), Object(Wt.b)(t.useSafeFrames, [ + 'undefined', + 'boolean' + ]) || (Object(Qt.c)('init.config.useSafeFrames', re(t.useSafeFrames), 'boolean'), delete t.useSafeFrames), t.useSafeFrames ? Object(Ht.c)('useSafeFrames', 'y') : Object(Ht.c)('useSafeFrames', 'n'); + } catch (e) { + Object(Qt.b)(e, '_validateAndStoreConfig-validateConfig'); + } + try { + var e = xt.a.getState().config; + Object(Lt.m)(e, 'pubID') && Object(Lt.m)(t, 'pubID') && e.pubID !== t.pubID && Object(Qt.b)(new Error('`apstag.init` was called multiple times with different pubIDs ('.concat(e.pubID, ' then ').concat(t.pubID, ')')), '_validateAndStoreConfig-diffPubId', !0), xt.a.dispatch({ + type: 'SET_CONFIG', + config: t, + defaultCmpTimeout: xt.a.getState().cfg.GDPR_CMP_TIMEOUT + }); + } catch (e) { + Object(Qt.b)(e, '_validateAndStoreConfig', !0); + } + } + function y(t) { + try { + var e = t.slotID; + if (Object(Lt.m)(t.bidConfig, 'mediaType') && 'v' === t.bidConfig.mediaType) + return; + if (!Vt.a.hasAdServerObjectLoaded()) + return void Object(Qt.a)('displayAdServer Object hasn\'t been defined', !0); + if (!Vt.a.isCommandQueueDefined()) + return void Object(Qt.a)('displayAdServer Object\'s cmd queue hasn\'t been defined', !0); + Vt.a.hasAdServerObjectLoaded() ? null !== O(e) ? A(t) : Object(Qt.a)(''.concat(e, ' isn\'t defined when trying to set amazon bid!')) : Vt.a.cmdQueuePush(function () { + y(t); + }); + } catch (t) { + Object(Qt.b)(t, '_safeApplySlotTargeting', !0); + } + } + function O(t) { + var e = null; + try { + e = Object(Nt.b)(Vt.a).filter(function (e) { + return e.slotID === t; + })[0] || null; + } catch (e) { + Object(Qt.b)(e, '_getAdServerSlot'); + } + return e; + } + function j(t) { + try { + var e = xt.a.getState().targetingKeys[t.slotID]; + Vt.a.hasAdServerObjectLoaded() && Object(Lt.k)(e) && e.forEach(function (e) { + return 0 < t.getTargeting(e).length && t.clearTargeting(e); + }); + } catch (e) { + Object(Qt.b)(e, '_clearTargetingFromSlot', !0); + } + } + function v(t) { + try { + if (Object(Lt.m)(xt.a.getState().slotBids, t.slotID)) { + var e = xt.a.getState().slotBids[t.slotID].filter(function (t) { + return t.bidState === Ft.b.set; + })[0]; + e && e.bidState === Ft.b.set && xt.a.dispatch({ + type: 'BID_STATE_CHANGE', + slotID: t.slotID, + _targetingSetID: e._targetingSetID, + bidState: Ft.b.exposed + }); + } + } catch (t) { + Object(Qt.b)(t, '_clearBidSetOnSlot', !0); + } + } + function S(t, e) { + try { + return t.map(function (t) { + return Object(Lt.j)(e, t); + }).filter(function (t) { + return t; + }).length === t.length; + } catch (t) { + return void Object(Qt.b)(t, '_hasAllItemsInArray'); + } + } + function w() { + var t = {}; + try { + Object.keys(xt.a.getState().slotBids).forEach(function (e) { + var n = xt.a.getState().slotBids[e].filter(Kt.f); + 0 < n.length && (t[e] = n.map(function (t) { + var e = xt.a.getState().AAXReqs.filter(function (e) { + return e.bidReqID === t.bidReqID; + }), n = 0; + if (0 < e.length) + n = e[0].rqTs; + else { + var r = xt.a.getState().AAXReqs.map(function (t) { + return t.bidReqID; + }).join(', '); + Object(Qt.b)({ + name: 'BidError', + message: 'Request not found: '.concat(t.bidReqID, ' not found in ').concat(r) + }, '_getCurrentSlotBids-noRequest'); + } + return { + rqTs: n, + bid: t + }; + }).reduce(function (t, e) { + return t.rqTs > e.rqTs ? t : e; + }).bid); + }); + } catch (t) { + Object(Qt.b)(t, '_getCurrentSlotBids', !0); + } + return t; + } + function _(t, e) { + try { + return Object(Lt.k)(xt.a.getState().targetingKeys[t]) ? e ? ['amzniid_sp'] : xt.a.getState().targetingKeys[t].filter(function (t) { + return -1 < t.indexOf('amzniid') && t.indexOf('amzniid_sp') < 0; + }) : ['amzniid']; + } catch (t) { + return Object(Qt.b)(t, '_getAllBidIdKeys'), []; + } + } + function E(t, e) { + var n, r; + try { + var i = xt.a.getState().slotBids; + Object.keys(i).forEach(function (o) { + i[o].forEach(function (i) { + _(o, e).forEach(function (e) { + i.bidConfig[e] === t && (n = i, 'amzniid_sp' === e ? r = 'sp' : 'amzniid' !== e && (r = e.substr(0, e.indexOf('amzniid')))); + }); + }); + }); + } catch (t) { + Object(Qt.b)(t, '_findSlotBidByBidID', !0); + } + return { + slotBid: n, + dealId: r + }; + } + function D(t, e, n) { + var r = ''; + try { + e.bidConfig[n + 'amzniid'] === t && (r = n.split('_').pop().trim()); + } catch (t) { + Object(Qt.b)(t, '_getPMPBidSize'); + } + return r; + } + function T(t) { + try { + if (void 0 === t.slots) + return []; + var e = {}; + return t.slots.forEach(function (t) { + 'video' !== t.mediaType && 'v' !== t.mediaType && 'v' !== t.mediaType_sp ? e[t.slotID] = new Kt.a(t) : (0 <= t.slotID.indexOf('rsv-') && (t = { + slotID: t.slotID.substring(4), + r_amznbid: t.amznbid, + r_amzniid: t.amzniid, + r_amznp: t.amznp, + mediaType: 'video', + targeting: [ + 'r_amznbid', + 'r_amzniid', + 'r_amznp' + ], + amznsz: t.amznsz, + size: t.size, + crid: t.crid, + meta: t.meta + }), Object(Lt.m)(e, t.slotID) ? t.targeting.forEach(function (n) { + e[t.slotID].bidConfig[n] = t[n], -1 === e[t.slotID].bidConfig.targeting.indexOf(n) && e[t.slotID].bidConfig.targeting.push(n); + }) : e[t.slotID] = new Kt.a(t)); + }), Object.keys(e).map(function (t) { + return e[t]; + }); + } catch (t) { + return Object(Qt.b)(t, '_mergeVideoBids'), []; + } + } + function I(t) { + var e = T(t), n = []; + try { + n = e.map(function (e) { + return e.bidReqID = t.cb, e.host = t.host, e.ev = t.ev, e.cfe = t.cfe, e; + }); + } catch (e) { + Object(Qt.b)(e, '_convertAaxResponse'); + } + return n; + } + function A(t) { + try { + var e = t.slotID, n = t._targetingSetID; + if (t.bidState === Ft.b.set) + return; + var r = O(e); + if (null !== r) { + v(r); + var i = t.newBidObject; + Object.keys(i.targeting).forEach(function (t) { + return r.setTargeting(t, i.targeting[t]); + }), xt.a.dispatch({ + type: 'BID_STATE_CHANGE', + slotID: e, + _targetingSetID: n, + bidState: Ft.b.set, + ts: Date.now() + }); + } + } catch (t) { + Object(Qt.b)(t, '_applyTargetingToAdServerSlot', !0); + } + } + function R(t) { + try { + var e = w(); + t.forEach(function (t) { + e[t] && y(e[t]); + }); + } catch (t) { + Object(Qt.b)(t, '_applySuppliedSlotBidsToAdServerObject', !0); + } + } + function C() { + try { + var t = w(); + Object.keys(t).forEach(function (e) { + return y(t[e]); + }); + } catch (t) { + Object(Qt.b)(t, '_applyAllCurrentSlotBidsTargetingToAdServerObject', !0); + } + } + function k(t) { + try { + t ? (Object(Ht.c)('targeting', 'setDisplayBids-list'), R(t)) : (Object(Ht.c)('targeting', 'setDisplayBids-all'), C()), xt.a.getState().displayAdServer.slotRenderEndedSet || (Vt.a.cmdQueuePush(function () { + try { + Vt.a.slotRenderEndedEvent(function (t) { + try { + j(t), v(t); + } catch (t) { + Object(Qt.b)(t, '_applySlotTargeting-cmdQueue-slotCb', !0); + } + }); + } catch (t) { + Object(Qt.b)(t, '_applySlotTargeting-cmdQueue', !0); + } + }), xt.a.dispatch({ type: 'SLOT_RENDER_ENDED_SET' })); + } catch (t) { + Object(Qt.b)(t, '_applySlotTargeting', !0); + } + } + function P() { + var t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', e = '1881141382166183'; + function n(t) { + try { + var e = JSON.parse(t), n = e.fbToken, r = new Date(parseInt(e.expAfter, 10)).toUTCString(); + document.cookie = 'aps_ext_917='.concat(n, '; expires=').concat(r); + } catch (t) { + Object(Qt.b)(t, '_doFbSync-setFbCookie'); + } + } + function r(e) { + try { + !function (t, e, n) { + try { + !function (t, e) { + try { + var n = { + url: t, + withCredentials: !0, + onload: function (t) { + return e(t.responseText); + } + }; + Object(Xt.d)(n); + } catch (t) { + Object(Qt.b)(t, '_doFbSync-sendTokenRequest'); + } + }(function (t, e) { + try { + return ''.concat('https://www.facebook.com/audiencenetwork/token/update', '?partner=').concat(encodeURIComponent(t), '&vr_token=').concat(encodeURIComponent(e)); + } catch (t) { + return Object(Qt.b)(t, '_doFbSync-getUpdateUrl'), ''; + } + }(t, e), n); + } catch (t) { + Object(Qt.b)(t, '_doFbSync-getV4Token'); + } + }(e, function () { + try { + for (var e = 'VR_', n = 0; n < 197; ++n) + e += t.charAt(Math.floor(Math.random() * t.length)); + return e; + } catch (e) { + return Object(Qt.b)(e, '_doFbSync-getVrToken'), ''; + } + }(), n); + } catch (e) { + Object(Qt.b)(e, '_doFbSync-getTokenResponse'); + } + } + try { + 'complete' === document.readyState ? r(e) : window.addEventListener('load', function () { + r(e); + }); + } catch (e) { + Object(Qt.b)(e, '_doFbSync'); + } + } + function z(t, e) { + function n() { + if (!i) + if (20 <= o++) + Object(Qt.b)({ + name: 'LoopError', + message: 'Too many attempts to append to document.body' + }, '_safeDocumentBodyAppendChild-callback-loops', !0); + else { + try { + if (t && t.body && null !== t.body && 'function' == typeof t.body.appendChild) + return t.body.appendChild(e), r(), void (i = !0); + } catch (t) { + Object(Qt.b)(t, '_safeDocumentBodyAppendChild-callback'); + } + setTimeout(n, 100); + } + } + var r = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : function () { + }, i = !1, o = 0; + try { + 'complete' === t.readyState || 'interactive' === t.readyState ? (Object(Ht.c)('appended', 'sync'), n()) : (Object(Ht.c)('appended', 'async'), t.addEventListener('DOMContentLoaded', n)); + } catch (t) { + Object(Qt.b)(t, '_safeDocumentBodyAppendChild'); + } + } + function x(t) { + try { + var e, n; + return e = ''.concat(t.host).concat(xt.a.getState().cfg.DTB_PATH, '/imp'), n = ''.concat(t.host).concat(xt.a.getState().cfg.DTB_PATH, '/adm'), t.cfe || t.isAmp || t.isSf ? n : e; + } catch (t) { + return Object(Qt.b)(t, 'determineCreativeFetchEndpoint'), ''; + } + } + function B(t) { + try { + var e, n = '?b='.concat(t.bidID, '&rnd=').concat(Object(Lt.e)()); + return Object(Lt.m)(t, 'pp') && (n += '&pp='.concat(t.pp)), Object(Lt.m)(t, 'amznp') && (n += '&p='.concat(t.amznp)), Object(Lt.m)(t, 'crID') && (n += '&crid='.concat(t.crID)), Object(Lt.m)(t, 'isSharedPMP') && !0 === t.isSharedPMP && (n += '&sp=true'), Object($t.d)() && (n += '&ep=%7B%22ce%22%3A%221%22%7D'), e = x(t), t.fif ? ''.concat(e, 'j').concat(n) : ''.concat(e, 'i').concat(n); + } catch (t) { + return Object(Qt.b)(t, '_creativeURL'), ''; + } + } + function L(t) { + try { + var e = t.doc.createElement('iframe'); + return e.frameBorder = '0', e.marginHeight = '0', e.marginWidth = '0', e.style.marginTop = '0', e.style.marginLeft = '0', e.scrolling = 'no', t.inheritSize ? (e.style.width = '100%', e.style.height = '100%') : (e.style.width = ''.concat(t.sizes[0], 'px'), e.style.height = ''.concat(t.sizes[1], 'px')), e; + } catch (t) { + return Object(Qt.b)(t, '_baseIframe'), window.document.createElement('iframe'); + } + } + function N(t) { + try { + if (Object(Lt.m)(t, 'bidType')) { + var e = t.kvMap; + switch (t.bidType) { + case 'sharedPMP': + return { + bidID: e.amzniid_sp[0], + pp: e.amznbid_sp[0], + sizes: e.amznsz_sp[0].split('x'), + amznp: e.amznp_sp[0], + inheritSize: t.inheritSize, + isSharedPMP: t.isSharedPMP + }; + case 'preferredPMP': + if (Object(Yt.a)(t) && Object(Lt.m)(t, 'amzndeal')) { + var n = t.amzndeal.split('_').pop().trim(); + return { + bidID: e[''.concat(t.amzndeal, 'amzniid')][0], + sizes: jt(n) + }; + } + break; + case 'openAuction': + if (Object(Yt.a)(t)) + return { + bidID: e.amzniid[0], + pp: Object(Bt.c)(e.amznbid[0]), + amznp: e.amznp[0], + inheritSize: t.inheritSize, + sizes: e.amznsz[0].split('x') + }; + if (Object(Yt.b)(t)) + return { + bidID: t.amzniid, + pp: Object(Bt.c)(t.amznbid), + amznp: t.amznp, + sizes: t.amznsz.split('x') + }; + break; + default: + Object(Qt.b)({ + name: 'Invalid AMP Bid Type: '.concat(t.bidType), + message: 'No valid AMP bid type' + }, 'getAmpAdData-invalidBidType'); + } + } + } catch (t) { + Object(Qt.b)(t, 'getAmpAdData'); + } + return { + bidID: 'ERROR', + sizes: [] + }; + } + function q(t, e) { + try { + var n = null; + if (void 0 !== e && (Object(Lt.m)(e, 'ampEnv') && e.ampEnv || Object(Lt.m)(e, 'sfEnv') && e.sfEnv) && (n = e, Object(Lt.m)(e, 'bidType') && 'sharedPMP' === e.bidType ? n.isSharedPMP = !0 : n.isSharedPMP = !1, n.document = t, n.amznhost = n.kvMap.amznhost[0]), yt(t) && ((n = t).bidType = 'openAuction', n.ampEnv = !0), null === n) + return void Object(Qt.b)(new Error('Invalid AMP parameters'), '_renderAmpImpression-invalidParams', !0); + var r = N(n); + if ('ERROR' === r.bidID) + return; + if (r.doc = n.document, r.host = n.amznhost.replace('http://', 'https://'), r.adID = 'amznad'.concat(Object(Lt.e)()), r.isAmp = n.ampEnv, r.isSf = Object(Mt.c)(window), xt.a.getState().aaxViewabilityEnabled) + return void wt(r, r.doc); + U(r); + } catch (t) { + Object(Qt.b)(t, '_renderAmpImpression'); + } + } + function F(t) { + var e, n = 'unknown'; + function r(r) { + try { + if (r && (t.hasTimedOut = !0), r && !t.hasRendered && Object(Qt.b)({ + name: 'RenderTimeout', + message: 'renderAd was called from timeout. fifFlowMethod: '.concat(n) + }, '__loadAdIntoFriendlyIframe-renderAd-timeout'), null === e.contentDocument) + return void Object(Qt.b)({ + name: 'NoDocument', + message: 'iframe.contentDocument was null inside renderAd. isFromTimeout: '.concat(r, '. fifFlowMethod: ').concat(n) + }, '__loadAdIntoFriendlyIframe-renderAd-noDocument', !0); + if (t.hasRendered && !t.hasTimedOut) + return void Object(Qt.b)({ + name: 'DupeRender', + message: 'Render was called twice' + }, '__loadAdIntoFriendlyIframe-renderAd-rerender', !0); + if (t.hasRendered) + return; + t.hasRendered = !0, e.contentDocument.open(), e.contentDocument.write(t.html), e.contentDocument.close(); + } catch (r) { + Object(Qt.b)(r, '__loadAdIntoFriendlyIframe-renderAd'); + } + } + try { + if (Object(Ht.c)('iframe', 'friendly'), void 0 === t.html) + throw new Error('No HTML available for ad, most likely the creative has expired'); + t = ee({ + hasRendered: !1, + hasTimedOut: !1 + }, t), (e = L(t)).id = 'apstag-f-iframe-'.concat(Object(Lt.e)()), z(t.doc, e, function () { + var t = r.bind(null, !1); + try { + n = null !== e.contentDocument && Object(Lt.j)([ + 'complete', + 'interactive' + ], e.contentDocument.readyState) ? (t(), 'doc-ready') : null !== e.contentDocument && 'uninitialized' !== e.contentDocument.readyState ? (e.contentDocument.addEventListener('DOMContentLoaded', t), 'dom-listener') : (e.addEventListener('load', t), 'iframe-listener'), Object(Ht.c)('fifFlow', n), setTimeout(r, 1000, !0); + } catch (t) { + Object(Qt.b)(t, '_loadAdIntoFriendlyIframe-setAttributes'); + } + }); + } catch (t) { + Object(Qt.b)(t, '_loadAdIntoFriendlyIframe', !0); + } + } + function U(t) { + var e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : { + states: { + csmLoaded: !1, + iframeLoaded: !1, + shouldRunViewability: !1 + } + }, n = 2 < arguments.length ? arguments[2] : void 0; + try { + Object(Ht.c)('iframe', 'unfriendly'); + var r = L(t); + if (r.id = t.adID, r.setAttribute('sandbox', 'allow-forms allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-top-navigation-by-user-activation'), Object(qt.d)('fake_bids')) { + var i = ''.concat(50 < parseInt(t.sizes[1], 10) ? '

apstag Test Creative

' : '', '

amzniid - ').concat(t.bidID, ' | amznbid: ').concat(t.pp, ' | size: ').concat(t.sizes.join('x'), '

'); + r.src = 'javascript:\''.concat(i, '\''); + } else + r.src = B(t); + !(t.isAmp && t.isSf && Object(Mt.b)(window)) && (!t.isSf || t.isAmp || t.inheritSize) || Object(Mt.a)(t.sizes, window), z(t.doc, r), (e.iframe = r).onload = function () { + e.states.iframeLoaded = !0, n && n(); + }; + } catch (t) { + Object(Qt.b)(t, '_loadAdIntoUnfriendlyIframe', !0); + } + } + function M(t) { + var e = t.states, n = t.doc, r = t.bidID, i = t.iframe; + try { + if (Object(Lt.a)(e)) + return; + var o; + e.shouldRunViewability = !1, Object(Lt.m)(window, 'amzncsm') ? o = window.amzncsm : void 0 !== n && null !== n.defaultView && Object(Lt.m)(n.defaultView, 'amzncsm') && (o = n.defaultView.amzncsm), void 0 !== n && void 0 !== o && Object(Lt.m)(o, 'rmD') && (o.host = Object(qt.c)('host', xt.a.getState().hosts.DEFAULT_AAX_PIXEL_HOST), o.rmD(i, r, n.defaultView, n, xt.a.getState().config.pubID)); + } catch (t) { + Object(Qt.b)(t, '_triggerViewability'); + } + } + function H(t, e) { + return function (n) { + try { + var r = Object(Kt.e)(e.slots), i = Object.keys(r), o = []; + n && (xt.a.dispatch({ + type: 'RECORD_AAX_REQ_PROP', + bidReqID: e.bidReqID, + key: 'timedOutAt', + value: Date.now() + }), xt.a.getState().experiments.chunkRequests && xt.a.dispatch({ + type: 'RECORD_TIMEOUT', + fid: e.bidReqID, + timeOut: Date.now() + })), i.forEach(function (t) { + if (Object(Lt.m)(r, t)) { + var e = r[t]; + Object(Kt.g)(xt.a.getState(), Vt.a) || Object(Lt.m)(e.bidConfig, 'amznbid') ? Object(Lt.m)(e.bidConfig, 'amznp') || (e.bidConfig.amznp = '') : (Object(Ht.c)('unusedDeal', e.mediaType), 'video' !== e.mediaType && (e.bidConfig.targeting.unshift('amznsz'), e.bidConfig.amznsz = '0x0'), e.bidConfig.targeting.unshift('amzniid', 'amznbid', 'amznp'), e.bidConfig.amzniid = '', e.bidConfig.amznbid = Ft.t.noBid, e.bidConfig.amznp = Ft.t.noBid), o.push(e); + } + }), Vt.a.isSupported && (o = Object(Kt.c)(o, e, n)); + var c = { fromTimeout: n }, a = Object(Kt.g)(xt.a.getState(), Vt.a); + try { + t(o.map(function (t) { + return a ? t.newBidObject : t.bidObject; + }), c); + } catch (i) { + console.error(i); + } + } catch (i) { + Object(Qt.b)(i, '_bidCallbackHandler', !0); + try { + t([], { + fromTimeout: n, + fromError: !0 + }); + } catch (i) { + console.error(i); + } + } + }; + } + function Q(t, e) { + try { + var n, r; + e.inheritSize ? Object(Ht.c)('creativeSize', 'inherited') : (r = t.defaultView && t.defaultView.frameElement ? (n = t.defaultView.frameElement, 'defaultView') : (n = window.frameElement, 'frameElement'), Object(Ht.c)('resizeIframe', r), Object(Ht.c)('creativeSize', 'resized'), null !== n ? (n.style.width = ''.concat(e.sizes[0], 'px'), n.style.height = ''.concat(e.sizes[1], 'px')) : Object(Qt.b)({ + name: 'FrameNotFound', + message: '\'win\' is \'null\'. Method used: '.concat(r) + }, '_resizeIframe-win')); + } catch (t) { + Object(Qt.b)(t, '_resizeIframe'); + } + } + function X(t) { + try { + return ''.concat(t[0], 'x').concat(t[1]); + } catch (t) { + return Object(Qt.b)(t, '_sizeArrayToSring'), 'x'; + } + } + function G(t) { + try { + return 1 === t.length ? X(t[0]) : X(t[Math.floor(t.length * Math.random())]); + } catch (t) { + return Object(Qt.b)(t, '_pickRandomSizeForMockBid', !0), ''; + } + } + function V(t) { + try { + var e, n = Object(qt.c)('host', xt.a.getState().hosts.DEFAULT_AAX_BID_HOST), r = Object(Bt.g)(window), i = t.bidReqID, o = Object(Lt.h)(window), c = Object(qt.c)('testBidTimeout', 200); + xt.a.dispatch({ + type: 'RECORD_AAX_REQUEST', + data: { + bidConfig: t, + timeout: c, + bidReqID: i, + ws: o, + url: r, + rqTs: Date.now() + } + }), e = t.slots.map(function (t) { + var e, n = G(t.sizes), r = 'testDeal'.concat(Object(Lt.e)(), '_').concat(n), i = 'testDealIi-'.concat(Object(Lt.e)()), o = G(t.sizes), c = (ne(e = { + slotID: t.slotID, + crid: ''.concat(Ft.n.crid, '-').concat(Object(Lt.e)()), + size: o, + amzniid: ''.concat(Ft.n.amzniid, '-').concat(Object(Lt.e)()), + amznbid: Ft.n.amznbid, + amznp: Ft.n.amznp, + amznsz: o, + amzniid_sp: ''.concat(Ft.n.amzniid, '-').concat(Object(Lt.e)()), + amznbid_sp: ''.concat(Ft.n.amznbid, 'SP'), + amznp_sp: ''.concat(Ft.n.amznp, 'SP'), + amznsz_sp: G(t.sizes), + amzndeals: [r] + }, ''.concat(r, 'amzniid'), i), ne(e, 'mediaType', 'd'), ne(e, 'meta', [ + 'slotID', + 'mediaType', + 'size' + ]), ne(e, 'targeting', [ + 'amzniid', + 'amznbid', + 'amznp', + 'amznsz', + 'amzniid_sp', + 'amznbid_sp', + 'amznp_sp', + 'amznsz_sp', + 'amzndeal_sp', + 'amzndeals', + ''.concat(r, 'amzniid') + ]), e); + return 'video' === t.mediaType && (c.mediaType = 'video', c.amznbid = 'v_'.concat(c.amznbid)), c; + }), setTimeout(function () { + window.apstag.bids({ + slots: e, + host: n, + status: 'ok', + cb: i + }); + }, c); + } catch (t) { + Object(Qt.b)(t, '_doMockBid', !0); + } + } + function K(t) { + try { + var e = xt.a.getState().AAXReqs.filter(function (e) { + return e.bidReqID === t.cb; + })[0]; + if (e && e.bidConfig && e.bidConfig.slots) { + var n = e.bidConfig.slots.filter(Nt.d).map(function (t) { + return t.slotID; + }), r = Object(Lt.m)(t, 'slots') ? t.slots.map(function (t) { + return t.slotID; + }) : [], i = n.filter(function (t) { + return !Object(Lt.j)(r, t); + }); + xt.a.dispatch({ + type: 'NO_BID_ON_ADSERVER_SLOTS', + slotIDs: i + }), Vt.a.hasAdServerObjectLoaded() ? W() : Vt.a.isCommandQueueDefined() && Vt.a.cmdQueuePush(function () { + W(); + }); + } + } catch (e) { + Object(Qt.b)(e, '_determineNoBidStateForAdServerObject'); + } + } + function J(t) { + return Object(Lt.j)(xt.a.getState().AAXReqs.filter(function (t) { + return !t.resTs; + }).map(function (t) { + return t.bidConfig.slots; + }).reduce(function (t, e) { + return t.concat(e); + }, []).map(Nt.c), t); + } + function Y(t) { + try { + var e = t.getTargeting('amznbid'); + return 0 < e.length && 2 < e[0].length; + } catch (t) { + return Object(Qt.b)(t, '_isRealAmznbidTargetingSetOnSlot'), 1; + } + } + function W() { + try { + Vt.a.hasAdServerObjectLoaded() && '1' === Vt.a.getTargeting('amznbid')[0] && Z(), Object(Nt.b)(Vt.a).forEach(function (t) { + !Object(Lt.j)(xt.a.getState().displayAdServer.noBidSlotIDs, t.slotID) || J(t.slotID) || Y(t) || '2' === t.getTargeting('amznbid')[0] || $('noBid', t); + }); + } catch (t) { + Object(Qt.b)(t, '_applyNoBidFromAAXState'); + } + } + function $(t, e) { + Ft.u.forEach(function (n) { + return e.setTargeting(n, Ft.t[t]); + }); + } + function Z() { + Ft.u.forEach(function (t) { + return Vt.a.clearTargeting(t); + }); + } + function tt(t) { + try { + var e = { + _type: 'dupePixel', + dd: Date.now() - t.timing.renderTime + }; + Object(Ht.a)(t.bidConfig.amzniid, e); + } catch (t) { + Object(Qt.b)(t, '_sendDupeBidPixel'); + } + } + !function () { + const $___old_7e9c3fba15bf1db7 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_7e9c3fba15bf1db7) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_ba1c6ba55dfe66f1.localStorage)); + return function () { + if (Object(Lt.i)()) { + var t = localStorage.getItem(Ft.c); + if (t) { + var e = JSON.parse(t); + null !== e && xt.a.dispatch({ + type: 'SET_CFG', + cfg: e + }); + } + } + }.apply(this, arguments); + } finally { + if ($___old_7e9c3fba15bf1db7) + ({}.constructor.defineProperty(window, 'localStorage', $___old_7e9c3fba15bf1db7)); + } + }(), Object($t.c)(); + var et = 0, nt; + function rt() { + try { + if (!Object(Lt.m)(window, 'googletag') || !Object(Lt.m)(window.googletag, 'cmd')) + return void (++et < 5 && setTimeout(rt, 100)); + new Gt.a().cmdQueuePush(function () { + try { + window.googletag.pubads().addEventListener('slotRequested', function (t) { + try { + var e = t.slot; + xt.a.dispatch({ + type: 'LOG_GAM_EVENT', + event: ee(ee({}, new Gt.b(e).slotConfig), {}, { + ts: Date.now(), + targeting: e.getTargetingMap() + }) + }); + } catch (t) { + Object(Qt.b)(t, '_initializeSlotRequestedEventListener-cmdQueue-listener'); + } + }); + } catch (t) { + Object(Qt.b)(t, '_initializeSlotRequestedEventListener-cmdQueue'); + } + }); + } catch (t) { + Object(Qt.b)(t, '_initializeSlotRequestedEventListener'); + } + } + function it(t) { + try { + var e = t.AAXReqs.slice(t.gamSlotRenderPixel.aaxReqOffset).reduce(function (t, e) { + return t.concat(e.bidConfig.slots); + }, []).map(function (t) { + return ee(ee({}, t), {}, { type: 'a' }); + }).filter(function (t) { + return 'video' !== t.mediaType; + }), n = t.gamSlotFetchLog.slice(t.gamSlotRenderPixel.gamSlotFetchLogOffset).map(function (t) { + return ee(ee({}, t), {}, { type: 'g' }); + }), r = [].concat(te(e), te(n)).reduce(function (t, e) { + return void 0 === t[e.slotID] && (t[e.slotID] = { + sd: e.slotID, + a: { c: 0 }, + g: { c: 0 } + }), t[e.slotID][e.type].c++, t[e.slotID][e.type].s = e.sizes, t[e.slotID][e.type].sn = e.slotName || '', t; + }, {}); + return Object.keys(r).map(function (t) { + return r[t]; + }).filter(function (t) { + return 0 !== t.a.c || 0 !== t.g.c; + }); + } catch (t) { + return Object(Qt.b)(t, 'getSlotFetchCounts'), []; + } + } + function ot() { + try { + var t = xt.a.getState(), e = it(t); + 0 < Object.keys(e).length && (Object(Lt.c)(e, 5).forEach(function (e) { + var n = { + slots: e, + pid: Kt.b, + url: Object(Bt.g)(window).split('?')[0], + ws: Object(Lt.h)(window), + pubid: t.config.pubID, + _type: 'slotRenders' + }; + Object(Ht.b)(n); + }), xt.a.dispatch({ + type: 'UPDATE_RENDER_OFFSETS', + offsets: { + aaxReqOffset: t.AAXReqs.length, + gamSlotFetchLogOffset: t.gamSlotFetchLog.length + } + })); + } catch (e) { + Object(Qt.b)(e, 'sendDisplayAdServerRenderPixel'); + } + } + function ct() { + setInterval(function () { + ot(); + }, 5000); + } + function at() { + try { + setTimeout(function () { + try { + var t = ft().filter(function (t) { + return !Object(Lt.m)(xt.a.getState().bsPixels, t.iid) || t.state !== xt.a.getState().bsPixels[t.iid]; + }); + t && t.length && 0 < t.length && (t.forEach(function (t) { + return Object(Ht.a)(t.iid, ut(t)); + }), st(t)); + var e = { + fetchStart: 'a', + domainLookupStart: 'b', + domainLookupEnd: 'c', + connectStart: 'd', + secureConnectionStart: 'e', + connectEnd: 'f', + requestStart: 'g', + responseStart: 'h', + responseEnd: 'i' + }; + Object.keys(xt.a.getState().slotBids).forEach(function (t) { + xt.a.getState().slotBids[t].forEach(function (n) { + if (Object(Lt.m)(n.bidConfig, 'amzniid') && !n.pixelSent) { + var r = xt.a.getState().AAXReqs.filter(function (t) { + return t.bidReqID === n.bidReqID; + })[0]; + if ('object' === re(r) && null !== r) { + var i = r.rqTs - Object(Ut.d)(), o = { + pid: Kt.b, + ns: r.bidConfig.validSlots.length, + fid: n.bidReqID, + fbrq: r.rqTs, + _type: 'latencyBd' + }; + 'object' === re(r.perf) && null !== r.perf && Object.keys(e).forEach(function (t) { + Object(Lt.m)(r, 'perf') && 0 !== Object(Ut.a)(r.perf, t) && (o[e[t]] = Object(Ut.a)(r.perf, t) - i); + }), o.j = r.resTs - r.rqTs, Object(Ht.a)(n.bidConfig.amzniid, o), xt.a.dispatch({ + type: 'UPDATE_BID_INFO_PROP', + slotID: t, + iid: n.bidConfig.amzniid, + key: 'pixelSent', + value: !0 + }); + } + } + }); + }), at(); + } catch (t) { + Object(Qt.b)(t, '_sendBidsSetOnDFPPixel-timeout'); + } + }, 5000); + } catch (t) { + Object(Qt.b)(t, '_sendBidsSetOnDFPPixel'); + } + } + function st(t) { + t.forEach(function (t) { + return xt.a.dispatch({ + type: 'RECORD_BID_INFO_SENT', + bidInfo: t + }); + }); + } + function ut(t) { + try { + var e = dt(t.fid), n = { + status: t.state, + pubid: xt.a.getState().config.pubID, + _type: 'bidSetPixel', + toa: Object(Lt.m)(e.req, 'timedOutAt') ? e.req.timedOutAt : 0, + fbrq: e.req.rqTs, + pto: e.req.timeout, + ns: e.req.bidConfig.validSlots.length, + bla: e.req.resTs - e.req.rqTs, + reqindex: e.index, + fid: t.fid, + tbs: 0, + c: 'dtb' + }; + xt.a.getState().cfg.CHUNK_BID_REQUESTS_PROPORTION && (n.eid = xt.a.getState().experiments.chunkRequests ? 2 : 1, n.fbindex = e.fbIndex, n.fbns = xt.a.getState().bidConfigs[parseInt(t.fid.split('-')[0], 10)].slots.length); + var r = xt.a.getState().experiments; + Object(Lt.m)(r, 'shouldUseTestBidEndpoint') && (n.tbs = r.shouldUseTestBidEndpoint ? 2 : 1), t.delta && (n.delay = t.delta); + var i = e.req.perf; + return void 0 !== i && (n.ul = e.req.urlLength, n.es = Object(Ut.a)(i, 'encodedBodySize')), 0 < Object.keys(xt.a.getState().identityState).length && (n.ids = JSON.stringify(xt.a.getState().identityState)), n; + } catch (t) { + return Object(Qt.b)(t, '_mapBidInfoToPixel'), { + _type: 'bidSetPixel', + status: -1, + pubid: '', + toa: 0, + fbrq: 0, + pto: 0, + ns: 0, + bla: 0, + reqindex: 0, + fid: '', + tbs: 0, + c: 'dtb' + }; + } + } + function dt(t) { + var e = xt.a.getState().AAXReqs.filter(function (e) { + return e.bidReqID === t; + })[0], n = xt.a.getState().AAXReqs.indexOf(e) + 1, r = { + req: e, + index: n, + fbIndex: n + }; + return r.index = xt.a.getState().AAXReqs.indexOf(r.req) + 1, xt.a.getState().experiments.chunkRequests && (r.fbIndex = xt.a.getState().AAXReqs.filter(function (t) { + return -1 === t.bidReqID.indexOf('-') || '0' === t.bidReqID.split('-')[1]; + }).map(function (t) { + return t.bidReqID.split('-')[0]; + }).indexOf(t.split('-')[0]) + 1), r; + } + function ft() { + try { + var t = mt(), e = []; + return null === t || Object.keys(xt.a.getState().slotBids).forEach(function (n) { + 'video' !== xt.a.getState().slotBids[n][0].bidConfig.mediaType && xt.a.getState().slotBids[n].filter(function (t) { + return Object(Lt.m)(t.bidConfig, 'amzniid'); + }).forEach(function (r) { + if (null !== t) { + var i = { + state: -1, + slotID: n, + iid: r.bidConfig.amzniid, + fid: r.bidReqID + }, o = [], c = []; + if (n in t && (o = t[n].fetchedAt.filter(function (t) { + return t.AAXReqInfo && t.AAXReqInfo.bidReqID === r.bidReqID; + }), c = t[n].targetedAt.filter(function (t) { + return t.targeting === r.bidConfig.amzniid; + })), 0 < o.length ? 0 < o.length && c.length >= o.length && o.slice(o.length - 1)[0].ts > c.slice(o.length - 1)[0].ts ? 1 === t[n].fetchWithIID.filter(function (t) { + return t === r.bidConfig.amzniid; + }).length ? i.state = 1 : i.state = 4 : Object(Lt.j)(t[n].fetchWithIID, r.bidConfig.amzniid) ? i.state = 3 : i.state = 2 : i.state = 0, 1 === i.state || 2 === i.state) { + var a = xt.a.getState().AAXReqs.filter(function (t) { + return t.bidReqID === r.bidReqID; + })[0].resTs, s = lt(a, t[n].fetchedAt, 2 === i.state); + s && Object(Lt.m)(s, 'ts') && (i.delta = a - s.ts); + } + e.push(i); + } + }); + }), e; + } catch (t) { + return Object(Qt.b)(t, '_getBidSetInfo'), []; + } + } + function lt(t, e, n) { + var r = e.map(function (e) { + var r = t - e.ts; + return !n && r <= 0 ? -r : n && 0 <= r ? r : null; + }); + return e[bt(r)]; + } + function bt(t) { + for (var e = -1, n = -1, r = 0; r < t.length; r++) + null !== t[r] && (-1 === n || t[r] < e) && (e = t[n = r]); + return n; + } + function pt(t, e) { + return xt.a.getState().AAXReqs.filter(function (t) { + return Object(Lt.j)(t.bidConfig.slots.map(function (t) { + return t.slotID; + }), e); + })[t]; + } + function mt() { + try { + if (!Vt.a.hasAdServerObjectLoaded()) + return null; + var t = xt.a.getState().gamSlotFetchLog.reduce(function (t, e) { + Object(Lt.m)(t, e.slotID) || (t[e.slotID] = { + fetchedAt: [], + targetedAt: [] + }); + var n = t[e.slotID]; + return n.fetchedAt.push({ + ts: e.ts, + AAXReqInfo: pt(n.fetchedAt.length, e.slotID) + }), Object(Lt.m)(e.targeting, 'amzniid') && 0 < e.targeting.amzniid.length ? n.targetedAt.push({ + ts: e.ts - 1, + targeting: e.targeting.amzniid[0] + }) : n.targetedAt.push({ + ts: e.ts - 1, + targeting: '' + }), t; + }, {}); + return Object.keys(t).forEach(function (e) { + if (Object(Lt.m)(t, e)) { + var n = t[e]; + n.fetchWithIID = n.fetchedAt.map(function (t) { + var e = lt(t.ts, n.targetedAt, !0); + return e ? e.targeting : 0; + }), t[e] = n; + } + }), t; + } catch (t) { + return Object(Qt.b)(t, '_getDFPSlotFetches'), null; + } + } + function gt() { + try { + Vt.a.hasAdServerObjectLoaded() ? $('noRequest', Vt.a) : Vt.a.isCommandQueueDefined() && Vt.a.cmdQueuePush(function () { + $('noRequest', Vt.a); + }); + } catch (t) { + Object(Qt.b)(t, '_applyNoRequestToAAXState'); + } + } + function ht(t) { + try { + xt.a.dispatch({ + type: 'REQUESTED_BID_FOR_ADSERVER_SLOTS', + slotIDs: t + }), Vt.a.isCommandQueueDefined() && Vt.a.cmdQueuePush(function () { + try { + var e = Object(Nt.b)(Vt.a); + '0' === Vt.a.getTargeting('amznbid')[0] && Z(), S(t.filter(function (t) { + return void 0 !== t; + }), e.map(function (t) { + return t.slotID; + })) ? e.forEach(function (e) { + Object(Lt.j)(t, e.slotID) && !Y(e) && $('bidInFlight', e); + }) : Vt.a.cmdQueuePush(function () { + try { + $('bidInFlight', Vt.a); + } catch (t) { + Object(Qt.b)(t, '_setRequestToAAXInFlightState-cmdQueue-cmdQueue'); + } + }); + } catch (e) { + Object(Qt.b)(e, '_setRequestToAAXInFlightState-cmdQueue'); + } + }); + } catch (t) { + Object(Qt.b)(t, '_setRequestToAAXInFlightState'); + } + } + function yt(t) { + try { + return Object(Lt.m)(t, 'type') && !(t instanceof Document) && 'amp' === t.type; + } catch (t) { + return Object(Qt.b)(t, '_isLegacyAmpCreative'), !1; + } + } + function Ot(t, e) { + try { + return void 0 !== e && Object(Lt.m)(e, 'ampEnv') && e.ampEnv || yt(t); + } catch (t) { + return void Object(Qt.b)(t, '_isAmpImpression'); + } + } + function jt(t) { + return t.split('x'); + } + function vt(t, e, n) { + try { + Object(Ht.f)(); + } catch (t) { + Object(Qt.b)(t, '_renderImp-pixels'); + } + try { + var r = void 0 === n ? '0.0.0' : n.cv; + if (Ot(t, n) && Object(Bt.k)(window, !0)) + return yt(t) ? Object(Ht.c)('renderFootprint', 'amp') : Object(Ht.c)('renderFootprint', 'multi-amp-'.concat(r)), void q(t, n); + if (Object(Mt.c)(window) && void 0 !== n && Object(Lt.m)(n, 'kvMap') && Object(Lt.m)(n.kvMap, 'amznhost')) + return Object(Ht.c)('renderFootprint', 'multi-sf-'.concat(r)), void q(t, n); + var i = !1; + 'string' == typeof e && 0 === e.indexOf('sp|') && (e = e.substring(3), i = !0); + var o, c = e || t.amzniid, a = E(c, i), s = a.slotBid, u = a.dealId; + if (s) { + if (o = u && 1 <= u.length ? jt('sp' === u ? s.bidConfig.amznsz_sp : D(c, s, u)) : jt(s.bidConfig.amznsz), 1 === arguments.length) + return Object(Ht.c)('renderFootprint', 'JSONp'), void F({ + doc: s.doc, + bidID: s.bidConfig.amzniid, + sizes: o, + html: t.html, + inheritSize: s.inheritSize || !1 + }); + Object(Ht.c)('bidRenderState', s.bidState); + var d = i ? 'sharedpmp' : 'open'; + void 0 !== n ? Object(Ht.c)('renderFootprint', 'multi-'.concat(d, '-').concat(r)) : Object(Ht.c)('renderFootprint', 'standard-'.concat(d, '-').concat(r)), s.bidState === Ft.b.rendered && tt(s), xt.a.dispatch({ + type: 'BID_STATE_CHANGE', + slotID: s.slotID, + _targetingSetID: s._targetingSetID, + bidState: Ft.b.rendered, + ts: Date.now() + }); + var f = s.host, b = 'amznad'.concat(Math.round(1000000 * Math.random())), l = { + bidID: c, + doc: t, + pp: St('amznbid', s, u), + host: f, + adID: b, + sizes: o, + amznp: St('amznp', s, u), + crID: St('crid', s, u), + fif: !1, + dealId: u, + isSharedPMP: i, + cfe: s.cfe, + inheritSize: Object(Lt.l)(n) && Object(Lt.m)(n, 'inheritSize') && !0 === n.inheritSize + }; + '1' === s.bidConfig.fif ? (l.fif = !0, xt.a.dispatch({ + type: 'UPDATE_BID_INFO_PROP', + slotID: s.slotID, + iid: e, + key: 'doc', + value: t + }), xt.a.dispatch({ + type: 'UPDATE_BID_INFO_PROP', + slotID: s.slotID, + iid: e, + key: 'inheritSize', + value: l.inheritSize + }), Object(Xt.b)(B(l), function () { + }, document, function () { + return Object(Qt.b)(new Error('Error Loading JSONP Render Callback'), 'renderImp-fif-callback-load', !0); + })) : xt.a.getState().aaxViewabilityEnabled ? wt(l, t) : U(l), Q(t, l); + } else + Object(Qt.b)(new Error('Invalid bid ID tried to render'), '_renderImp-invalidId', !0); + } catch (t) { + Object(Qt.b)(t, '_renderImp', !0); + } + } + function St(t, e, n) { + try { + var r = ''; + if (void 0 !== n && 1 <= n.length) { + var i = ''.concat(t, '_sp'); + 'sp' === n && Object(Lt.m)(e.bidConfig, i) && (r = e.bidConfig[i]); + } else + Object(Lt.m)(e.bidConfig, t) && (r = e.bidConfig[t]); + return r; + } catch (t) { + return Object(Qt.b)(t, '_getProperBidInfoValue'), ''; + } + } + function wt(t, e) { + try { + var n = e.createElement('script'); + n.type = 'text/javascript', n.async = !0; + var r = { + doc: e, + bidID: t.bidID, + states: { + csmLoaded: !1, + iframeLoaded: !1, + shouldRunViewability: !0 + } + }, i = M.bind(null, r); + Object(Xt.a)(n, function () { + r.states.csmLoaded = !0, i(); + }); + try { + n.addEventListener('error', function (t) { + return Object(Ht.b)({ + _type: 'csm_fail', + ts: Date.now(), + msg: t.message + }); + }); + } catch (t) { + Object(Qt.b)(t, '_loadViewabilityAd-csm'); + } + U(t, r, i), n.src = xt.a.getState().cfg.CSM_JS, z(e, n); + } catch (t) { + Object(Qt.b)(t, '_loadViewabilityAd'); + } + } + function _t(t) { + try { + Object(Kt.h)(t), f(t), Object(Lt.m)(t, 'slots') && (xt.a.dispatch({ + type: 'UPDATE_SLOT_BIDS', + bids: I(t) + }), Object(Lt.m)(t, 'ev') && xt.a.dispatch({ + type: 'SET_VIEWABILITY', + viewability: t.ev + }), Object(Lt.m)(t, 'cfn') && xt.a.dispatch({ + type: 'SET_CFG', + cfg: { CSM_JS: '//' === t.cfn.substring(0, 2) ? t.cfn : '//c.amazon-adsystem.com/'.concat(t.cfn) } + })), l(t); + } catch (t) { + Object(Qt.b)(t, '_bids', !0); + } + } + function Et() { + return 'number' == typeof xt.a.getState().cfg.MAX_SLOTS_PER_REQUEST && 0 < xt.a.getState().cfg.MAX_SLOTS_PER_REQUEST; + } + function Dt(t, e) { + var n = !1, r = []; + try { + var i = [ + zt.a, + $t.a + ], o = [ + xt.a.getState().config.gdpr, + null + ], c = i.map(function () { + return !1; + }); + i.map(function (i, a) { + return i(o[a], function (i) { + r[a] = i, c[a] = !0, !n && c.every(Boolean) && (n = !0, Tt(t, e, r[0], r[1])); + }); + }); + } catch (i) { + Object(Qt.b)(i, '_getConfigsAndFetchBids', !0), n || (n = !0, Tt(t, e, r[0], r[1])); + } + } + function Tt(t, e, n, r) { + try { + Object(Wt.b)(e, [ + 'function', + 'undefined' + ]) || Object(Qt.c)('fetchBids.callback', re(e), 'function'), 'function' != typeof e && (e = function () { + }), Object(Lt.l)(t) || (Object(Qt.c)('fetchBids.bidConfig', re(t), 'object'), t = {}), Object(Wt.a)(t.timeout) || ('string' == typeof t.timeout ? Object(Qt.b)({ + name: 'string-'.concat(t.timeout), + message: 'fetchBids.bidConfig.timeout was a non-numeric string \''.concat(t.timeout, '\'') + }, 'TypeError-fetchBids.bidConfig.timeout', !0) : Object(Qt.c)('fetchBids.bidConfig.timeout', re(t.timeout), 'number')), Object(Lt.m)(t, 'params') && !Object(Lt.l)(t.params) ? Object(Qt.c)('fetchBids.bidConfig.params', re(t.params), 'object') : Object(Lt.m)(t, 'params') && Object(Lt.l)(t.params) && Object.keys(t.params).forEach(function (e) { + return !(void 0 === t.params || 'string' != typeof t.params[e] && 'number' != typeof t.params[e] && (Object(Lt.k)(t.params[e]) ? !t.params[e].reduce(function (t, e) { + return t && ('string' == typeof e || 'number' == typeof e); + }, !0) && (Object(Qt.b)({ + name: 'non-string array item', + message: '\'fetchBids.bidConfig.params.'.concat(e, ' contains a non-string item') + }, 'TypeError-fetchBids.bidConfig.params.'.concat(e), !0), 1) : (Object(Qt.c)('fetchBids.bidConfig.params.'.concat(e), re(t.params[e]), 'string\' or \'array'), 1))); + }), Object(Lt.m)(t, 'blockedBidders') && !Object(Lt.k)(t.blockedBidders) ? Object(Qt.c)('fetchBids.bidConfig.blockedBidders', re(t.blockedBidders), 'array') : Object(Lt.m)(t, 'blockedBidders') && Object(Lt.k)(t.blockedBidders) && (t.blockedBidders.reduce(function (t, e) { + return t && ('string' == typeof e || 'number' == typeof e); + }, !0) || Object(Qt.b)({ + name: 'non-string array item', + message: '\'fetchBids.bidConfig.blockedBidders contains a non-string item' + }, 'TypeError-fetchBids.bidConfig.blockedBidders', !0)), Object(Lt.m)(t, 'blockedBidders') ? Object(Ht.c)('blockedBidders-fetchBids', 'y') : Object(Ht.c)('blockedBidders-fetchBids', 'n'), Object(Lt.m)(t, 'slots') && !Object(Lt.k)(t.slots) && Object(Qt.c)('fetchBids.bidConfig.slots', re(t.slots), 'array'); + } catch (i) { + Object(Qt.b)(i, '_fetchBids-validation', !0); + } + var i = xt.a.getState().config.simplerGPT, o = ee(ee({}, t), {}, { + bidReqID: ''.concat(xt.a.getState().AAXReqs.length), + slots: [], + validSlots: [], + networkReqs: [] + }), c = !1; + try { + !0 === i && (!Object(Lt.m)(t, 'slots') || Object(Lt.m)(t, 'slots') && Object(Lt.k)(t.slots) && 0 < t.slots.length && Object(Lt.m)(t.slots[0], 'getSlotElementId')) ? 0 === Object(Nt.b)(Vt.a).length ? (Object(Qt.b)(new Error('fetchBids was called in simplerGPT mode before any slots were defined in GPT'), '_fetchBids-simplerGpt-NoSlots', !0), c = !0, o.slots = []) : (t.slots ? (Object(Ht.c)('slots', 'gpt-provided'), o.slots = t.slots.map(function (t) { + return new Gt.b(t); + })) : (Object(Ht.c)('slots', 'gpt-fetch'), o.slots = Object(Nt.b)(Vt.a)), o.slots = o.slots.filter(Nt.a), 0 === o.slots.length && (Object(Qt.b)(new Error('No GPT slots provided to apstag.fetchBids() had valid sizes'), '_fetchBids-simplerGpt-NoValidSizes', !0), c = !0)) : Object(Lt.m)(t, 'slots') && Object(Lt.k)(t.slots) && (i ? Object(Ht.c)('slots', 'gpt-aps') : Object(Ht.c)('slots', 'aps'), o.slots = t.slots.map(function (t) { + return new Jt.a(t); + })), o.validSlots = o.slots.filter(function (t) { + return t.isValid(); + }); + } catch (i) { + Object(Qt.b)(i, '_fetchBids-getSlots', !0); + } + var a = Object(Bt.i)(o, xt.a.getState()); + try { + e = Object(Bt.b)(H(e, o), a); + } catch (i) { + Object(Qt.b)(i, '_fetchBids-wrapCallback', !0); + } + try { + if (0 === o.validSlots.length) + return !1 === c && Object(Qt.b)(new Error('No valid slots provided to apstag.fetchBids'), '_fetchBids-noSlots', !0), void setTimeout(e.bind(null, []), 10); + try { + var s = 1 === o.slots.length ? 'single' : 'multi', u = Date.now() - b <= Ft.p ? 'onload' : 'ondelay', d = xt.a.getState().AAXReqs.reduce(function (t, e) { + return e.bidConfig.slots.forEach(function (e) { + Object(Lt.j)(t, e.slotID) || t.push(e.slotID); + }), t; + }, []); + o.slots.map(function (t) { + return t.slotID; + }).map(function (t) { + return Object(Lt.j)(d, t); + }).map(function (t) { + return t ? 'refresh' : 'initial'; + }).filter(function (t, e, n) { + return n.indexOf(t) === e; + }).forEach(function (t) { + return Object(Ht.c)('fetchBids', ''.concat(s, '-').concat(u, '-').concat(t)); + }); + } catch (i) { + Object(Qt.b)(i, '_fetchBids-feature'); + } + var f; + if (ht(o.slots.filter(Nt.d).map(Nt.c)), xt.a.dispatch({ + type: 'NEW_FETCH_BID_REQUEST', + fid: o.bidReqID, + pto: a + }), xt.a.dispatch({ + type: 'RECORD_ORIGINAL_BID_CONFIG', + bidConfig: o + }), Object(qt.d)('fake_bids')) + V(o); + else if (Ft.i) + if (xt.a.dispatch({ + type: 'SHOULD_CHUNK_REQUESTS', + value: Object(Lt.n)(xt.a.getState().cfg.CHUNK_BID_REQUESTS_PROPORTION) + }), xt.a.getState().experiments.chunkRequests && Et()) { + f = It(o); + for (var l = 0; l < f.length; l++) + f[l].bidReqID = ''.concat(o.bidReqID, '-').concat(l); + xt.a.dispatch({ + type: 'ADD_CHUNKED_REQUESTS', + fid: o.bidReqID, + numChunks: f.length + }), f.forEach(function (t) { + p(Object(Kt.d)(t, a, n, r), e, t.bidReqID); + }); + } else + p(Object(Kt.d)(o, a, n, r), e, o.bidReqID); + else + Object(Xt.b)(Object(Kt.d)(o, a, n, r), e); + } catch (i) { + Object(Qt.b)(i, '_fetchBids', !0); + } + } + function It(t) { + try { + for (var e = Math.ceil(t.validSlots.length / xt.a.getState().cfg.MAX_SLOTS_PER_REQUEST), n = new Array(e), r = 0; r < e; r++) { + var i = r * xt.a.getState().cfg.MAX_SLOTS_PER_REQUEST; + n[r] = { slots: t.validSlots.slice(i, i + xt.a.getState().cfg.MAX_SLOTS_PER_REQUEST) }; + } + return n.map(function (e) { + return ee(ee({}, t), e); + }); + } catch (e) { + return Object(Qt.b)(e, 'chunkConfig', !0), []; + } + } + function At(t) { + try { + Object(Lt.m)(xt.a.getState().config, 'adServer') ? Vt.a.isSupported ? (k(t), W()) : Object(Qt.b)(new Error('apstag.setDisplayBids called with unsupported ad server: '.concat(xt.a.getState().config.adServer)), '_setDisplayBids-invalidAdServer', !0) : Object(Qt.b)(new Error('apstag.setDisplayBids called without specifying ad server'), '_setDisplayBids-noAdServer', !0); + } catch (t) { + Object(Qt.b)(t, '_setDisplayBids', !0); + } + } + function Rt(t, e) { + try { + h(t), Object(Vt.b)(t.adServer), gt(), Object($t.b)(); + } catch (t) { + Object(Qt.b)(t, '_init'); + } + 'function' == typeof e && e(); + } + function Ct() { + var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 'display', e = xt.a.getState(); + try { + switch (t) { + case 'display': + return Object(Ht.c)('targeting', 'targetingKeys-display'), e.config.useSafeFrames ? [].concat(te(Ft.g), ['amznhost']) : Ft.g; + case 'video': + return Object(Ht.c)('targeting', 'targetingKeys-video'), e.config.useSafeFrames ? [].concat(te(Ft.w), ['amznhost']) : Ft.w; + default: + if (Object(Kt.g)(xt.a.getState(), Vt.a)) { + if (Object(Ht.c)('targeting', 'targetingKeys-newBid'), Object(Lt.k)(xt.a.getState().targetingKeys[t])) + return xt.a.getState().targetingKeys[t]; + } else + Object(Ht.c)('targeting', 'targetingKeys-invalid'); + return []; + } + } catch (t) { + return Object(Qt.b)(t, '_targetingKeys', !0), []; + } + } + function kt() { + try { + return xt.a.getState().AAXReqs.reduce(function (t, e) { + return e.bidConfig.slots.reduce(function (t, e) { + return t[e.slotID] = e.slotName, t; + }, t); + }, {}); + } catch (t) { + return Object(Qt.b)(t, '_getSlotIdToNameMapping', !0), {}; + } + } + function Pt(t, e) { + var n = e; + return function () { + return r({ + method: t, + args: arguments + }), n.apply(void 0, arguments); + }; + } + try { + Object(Lt.m)(window, 'apstag') && Object(Lt.m)(window.apstag, '_Q') && 0 < window.apstag._Q.length && xt.a.dispatch({ + type: 'SET_Q', + Q: window.apstag._Q + }); + } catch (t) { + Object(Qt.b)(t, 'apstag-storeQ', !0); + } + window.apstag = (nt = { + punt: _t, + init: Rt, + debug: qt.a, + _getSlotIdToNameMapping: kt, + targetingKeys: Ct, + fetchBids: Dt, + setDisplayBids: At, + renderImp: vt, + bids: _t, + deleteId: Zt.a, + updateId: Zt.d, + renewId: Zt.c, + dpa: Zt.a, + upa: Zt.d, + rpa: Zt.c, + thirdPartyData: {} + }, Object.keys(nt).forEach(function (t) { + 'object' !== re(nt[t]) && (nt[t] = Pt(t, nt[t]), nt[t] = Object(Qt.d)(nt[t], t)); + }), n ? Object(qt.b)(!0, t) : e && Object(qt.b)(!1, t), !0 === Object(qt.c)('exposeApi') && (nt._api = { + _getBidSetInfo: ft, + _applyTargetingToGPTSlot: A, + dispatch: xt.a.dispatch, + _clearTargetingFromGPTSlot: j, + _clearBidSetOnSlot: v, + _doFbSync: P, + _getCurrentSlotBids: w, + _creativeURL: B, + getSlotFetchCounts: it, + buildBidUrl: Kt.d + }), nt), function () { + try { + if (xt.a.dispatch({ + type: 'SHOULD_SAMPLE_FEATURES', + value: Object(Lt.n)(xt.a.getState().cfg.FEATURE_SAMPLING_RATE) + }), xt.a.dispatch({ + type: 'SHOULD_CF_ROUTE', + value: Object(Lt.n)(xt.a.getState().cfg.CF_ROUTING_RATE) + }), xt.a.getState().experiments.shouldCFRoute && xt.a.dispatch({ + type: 'SET_HOST', + hostName: 'DEFAULT_AAX_BID_HOST', + hostValue: 'c.amazon-adsystem.com' + }), xt.a.dispatch({ + type: 'SHOULD_SAMPLE_LATENCY', + value: Object(Lt.n)(xt.a.getState().cfg.LATENCY_SAMPLING_RATE) + }), null !== xt.a.getState().cfg.TEST_BID_ENDPOINT) { + var t = Object(Lt.n)(xt.a.getState().cfg.TEST_PATH_FREQUENCY); + xt.a.dispatch({ + type: 'SHOULD_USE_TEST_BID_ENDPOINT', + value: t + }), t && null !== xt.a.getState().cfg.TEST_PATH_LATENCY_SAMPLE_RATE && xt.a.dispatch({ + type: 'SHOULD_SAMPLE_LATENCY', + value: Object(Lt.n)(xt.a.getState().cfg.TEST_PATH_LATENCY_SAMPLE_RATE) + }); + } + xt.a.dispatch({ + type: 'SHOULD_SAMPLE_SLOT_RENDER', + value: Object(Lt.n)(xt.a.getState().cfg.SLOT_RENDER_SAMPLING_RATE) + }); + var e = xt.a.getState(); + (e.experiments.shouldSampleLatency || e.displayAdServer.shouldSampleRender) && rt(), e.displayAdServer.shouldSampleRender && ct(), e.experiments.shouldSampleLatency && at(); + } catch (t) { + Object(Qt.b)(t, 'apstag-sampleLatency'); + } + try { + g(); + } catch (t) { + Object(Qt.b)(t, 'apstag-doLast'); + } + if (!Object(Bt.k)(window, !0)) + try { + var n = function (t) { + t && 'object' !== re(t) || (t = 'Request Timeout or Error'), Object(Qt.b)({ + message: 'csm-rtb-comm-js loading failed', + name: t + }, '__csm-rtb-comm-js__'); + }; + Object(Xt.d)({ + url: xt.a.getState().cfg.CSM_RTB_COMMUNICATOR_JS, + onload: function t(e) { + const $___old_64bd591f2ca69780 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_64bd591f2ca69780) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_c4607d10b0acbf6b.XMLHttpRequest)); + return function () { + e.readyState === XMLHttpRequest.DONE && 200 === e.status ? eval(e.responseText) : n(JSON.stringify({ + status: e.statusText, + response: e.responseXML + })); + }.apply(this, arguments); + } finally { + if ($___old_64bd591f2ca69780) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_64bd591f2ca69780)); + } + }, + onerror: n, + ontimeout: n + }); + } catch (t) { + Object(Qt.b)(t, '__load-csm-rtb-comm-js__'); + } + Object(qt.e)(); + }(); + }()); + } catch (t) { + Object(Qt.b)(t, 'apstag'); + } + } + ]); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-bidbarrel-metacritic-rv.min.js b/resources/sugarcoat-bidbarrel-metacritic-rv.min.js new file mode 100644 index 00000000..87f38f86 --- /dev/null +++ b/resources/sugarcoat-bidbarrel-metacritic-rv.min.js @@ -0,0 +1,25280 @@ +{ + const $___mock_436d6f6f94763253 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_436d6f6f94763253); + const $___mock_6bf28fdad6c63137 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_6bf28fdad6c63137); + const $___mock_a26319b580109d2e = {}; + (exports => { + 'use strict'; + const fetch = async (resource, init = null) => { + throw new TypeError('Failed to fetch'); + }; + exports.fetch = { + configurable: true, + enumerable: true, + value: fetch, + writable: true + }; + })($___mock_a26319b580109d2e); + (function () { + !function (e) { + var t = {}; + function r(n) { + if (t[n]) { + return t[n].exports; + } + var i = t[n] = { + i: n, + l: !1, + exports: {} + }; + return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports; + } + r.m = e, r.c = t, r.d = function (e, t, n) { + r.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }); + }, r.r = function (e) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); + }, r.t = function (e, t) { + if (1 & t && (e = r(e)), 8 & t) { + return e; + } + if (4 & t && 'object' == typeof e && e && e.__esModule) { + return e; + } + var n = Object.create(null); + if (r.r(n), Object.defineProperty(n, 'default', { + enumerable: !0, + value: e + }), 2 & t && 'string' != typeof e) { + for (var i in e) { + r.d(n, i, function (t) { + return e[t]; + }.bind(null, i)); + } + } + return n; + }, r.n = function (e) { + var t = e && e.__esModule ? function () { + return e.default; + } : function () { + return e; + }; + return r.d(t, 'a', t), t; + }, r.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }, r.p = '', r(r.s = 225); + }([ + function (e, t, r) { + 'use strict'; + var n = r(92), i = {}; + i[r(19)('toStringTag')] = 'z', i + '' != '[object z]' && r(41)(Object.prototype, 'toString', function () { + return '[object ' + n(this) + ']'; + }, !0); + }, + function (e, t, r) { + for (var n = r(3), i = r(70), o = r(41), a = r(18), s = r(46), u = r(81), c = r(19), d = c('iterator'), l = c('toStringTag'), f = u.Array, p = { + CSSRuleList: !0, + CSSStyleDeclaration: !1, + CSSValueList: !1, + ClientRectList: !1, + DOMRectList: !1, + DOMStringList: !1, + DOMTokenList: !0, + DataTransferItemList: !1, + FileList: !1, + HTMLAllCollection: !1, + HTMLCollection: !1, + HTMLFormElement: !1, + HTMLSelectElement: !1, + MediaList: !0, + MimeTypeArray: !1, + NamedNodeMap: !1, + NodeList: !0, + PaintRequestList: !1, + Plugin: !1, + PluginArray: !1, + SVGLengthList: !1, + SVGNumberList: !1, + SVGPathSegList: !1, + SVGPointList: !1, + SVGStringList: !1, + SVGTransformList: !1, + SourceBufferList: !1, + StyleSheetList: !0, + TextTrackCueList: !1, + TextTrackList: !1, + TouchList: !1 + }, g = i(p), m = 0; m < g.length; m++) { + var v, b = g[m], y = p[b], h = a[b], S = h && h.prototype; + if (S && (S[d] || s(S, d, f), S[l] || s(S, l, b), u[b] = f, y)) { + for (v in n) { + S[v] || o(S, v, n[v], !0); + } + } + } + }, + function (e, t, r) { + 'use strict'; + var n = r(18), i = r(50), o = r(28), a = r(14), s = r(41), u = r(78).KEY, c = r(24), d = r(104), l = r(79), f = r(63), p = r(19), g = r(160), m = r(161), v = r(228), b = r(162), y = r(27), h = r(23), S = r(47), O = r(57), _ = r(89), E = r(77), I = r(80), w = r(230), A = r(90), T = r(106), x = r(32), C = r(70), P = A.f, j = x.f, R = w.f, D = n.Symbol, k = n.JSON, N = k && k.stringify, M = p('_hidden'), U = p('toPrimitive'), B = {}.propertyIsEnumerable, L = d('symbol-registry'), z = d('symbols'), V = d('op-symbols'), F = Object.prototype, q = 'function' == typeof D && !!T.f, G = n.QObject, W = !G || !G.prototype || !G.prototype.findChild, H = o && c(function () { + return 7 != I(j({}, 'a', { + get: function () { + return j(this, 'a', { value: 7 }).a; + } + })).a; + }) ? function (e, t, r) { + var n = P(F, t); + n && delete F[t], j(e, t, r), n && e !== F && j(F, t, n); + } : j, Y = function (e) { + var t = z[e] = I(D.prototype); + return t._k = e, t; + }, K = q && 'symbol' == typeof D.iterator ? function (e) { + return 'symbol' == typeof e; + } : function (e) { + return e instanceof D; + }, J = function (e, t, r) { + return e === F && J(V, t, r), y(e), t = _(t, !0), y(r), i(z, t) ? (r.enumerable ? (i(e, M) && e[M][t] && (e[M][t] = !1), r = I(r, { enumerable: E(0, !1) })) : (i(e, M) || j(e, M, E(1, {})), e[M][t] = !0), H(e, t, r)) : j(e, t, r); + }, Q = function (e, t) { + y(e); + for (var r, n = v(t = O(t)), i = 0, o = n.length; o > i;) { + J(e, r = n[i++], t[r]); + } + return e; + }, X = function (e) { + var t = B.call(this, e = _(e, !0)); + return !(this === F && i(z, e) && !i(V, e)) && (!(t || !i(this, e) || !i(z, e) || i(this, M) && this[M][e]) || t); + }, $ = function (e, t) { + if (e = O(e), t = _(t, !0), e !== F || !i(z, t) || i(V, t)) { + var r = P(e, t); + return !r || !i(z, t) || i(e, M) && e[M][t] || (r.enumerable = !0), r; + } + }, Z = function (e) { + for (var t, r = R(O(e)), n = [], o = 0; r.length > o;) { + i(z, t = r[o++]) || t == M || t == u || n.push(t); + } + return n; + }, ee = function (e) { + for (var t, r = e === F, n = R(r ? V : O(e)), o = [], a = 0; n.length > a;) { + !i(z, t = n[a++]) || r && !i(F, t) || o.push(z[t]); + } + return o; + }; + q || (s((D = function () { + if (this instanceof D) { + throw TypeError('Symbol is not a constructor!'); + } + var e = f(arguments.length > 0 ? arguments[0] : void 0), t = function (r) { + this === F && t.call(V, r), i(this, M) && i(this[M], e) && (this[M][e] = !1), H(this, e, E(1, r)); + }; + return o && W && H(F, e, { + configurable: !0, + set: t + }), Y(e); + }).prototype, 'toString', function () { + return this._k; + }), A.f = $, x.f = J, r(66).f = w.f = Z, r(91).f = X, T.f = ee, o && !r(64) && s(F, 'propertyIsEnumerable', X, !0), g.f = function (e) { + return Y(p(e)); + }), a(a.G + a.W + a.F * !q, { Symbol: D }); + for (var te = 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','), re = 0; te.length > re;) { + p(te[re++]); + } + for (var ne = C(p.store), ie = 0; ne.length > ie;) { + m(ne[ie++]); + } + a(a.S + a.F * !q, 'Symbol', { + for: function (e) { + return i(L, e += '') ? L[e] : L[e] = D(e); + }, + keyFor: function (e) { + if (!K(e)) { + throw TypeError(e + ' is not a symbol!'); + } + for (var t in L) { + if (L[t] === e) { + return t; + } + } + }, + useSetter: function () { + W = !0; + }, + useSimple: function () { + W = !1; + } + }), a(a.S + a.F * !q, 'Object', { + create: function (e, t) { + return void 0 === t ? I(e) : Q(I(e), t); + }, + defineProperty: J, + defineProperties: Q, + getOwnPropertyDescriptor: $, + getOwnPropertyNames: Z, + getOwnPropertySymbols: ee + }); + var oe = c(function () { + T.f(1); + }); + a(a.S + a.F * oe, 'Object', { + getOwnPropertySymbols: function (e) { + return T.f(S(e)); + } + }), k && a(a.S + a.F * (!q || c(function () { + var e = D(); + return '[null]' != N([e]) || '{}' != N({ a: e }) || '{}' != N(Object(e)); + })), 'JSON', { + stringify: function (e) { + for (var t, r, n = [e], i = 1; arguments.length > i;) { + n.push(arguments[i++]); + } + if (r = t = n[1], (h(t) || void 0 !== e) && !K(e)) { + return b(t) || (t = function (e, t) { + if ('function' == typeof r && (t = r.call(this, e, t)), !K(t)) { + return t; + } + }), n[1] = t, N.apply(k, n); + } + } + }), D.prototype[U] || r(46)(D.prototype, U, D.prototype.valueOf), l(D, 'Symbol'), l(Math, 'Math', !0), l(n.JSON, 'JSON', !0); + }, + function (e, t, r) { + 'use strict'; + var n = r(107), i = r(165), o = r(81), a = r(57); + e.exports = r(133)(Array, 'Array', function (e, t) { + this._t = a(e), this._i = 0, this._k = t; + }, function () { + var e = this._t, t = this._k, r = this._i++; + return !e || r >= e.length ? (this._t = void 0, i(1)) : i(0, 'keys' == t ? r : 'values' == t ? e[r] : [ + r, + e[r] + ]); + }, 'values'), o.Arguments = o.Array, n('keys'), n('values'), n('entries'); + }, + function (e, t, r) { + r(161)('asyncIterator'); + }, + function (e, t, r) { + var n = r(47), i = r(70); + r(167)('keys', function () { + return function (e) { + return i(n(e)); + }; + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(168)(!0); + r(133)(String, 'String', function (e) { + this._t = String(e), this._i = 0; + }, function () { + var e, t = this._t, r = this._i; + return r >= t.length ? { + value: void 0, + done: !0 + } : (e = n(t, r), this._i += e.length, { + value: e, + done: !1 + }); + }); + }, + function (e, t, r) { + 'use strict'; + r(328), Object.defineProperty(t, '__esModule', { value: !0 }), t.getUniqueIdentifierStr = R, t.generateUUID = function e(t) { + return t ? (t ^ (window && window.crypto && window.crypto.getRandomValues ? crypto.getRandomValues(new Uint8Array(1))[0] % 16 : 16 * Math.random()) >> t / 4).toString(16) : ([10000000] + -1000 + -4000 + -8000 + -100000000000).replace(/[018]/g, e); + }, t.getBidIdParameter = function (e, t) { + if (t && t[e]) { + return t[e]; + } + return ''; + }, t.tryAppendQueryString = function (e, t, r) { + if (r) { + return e + t + '=' + encodeURIComponent(r) + '&'; + } + return e; + }, t.parseQueryStringParameters = function (e) { + var t = ''; + for (var r in e) { + e.hasOwnProperty(r) && (t += r + '=' + encodeURIComponent(e[r]) + '&'); + } + return t = t.replace(/&$/, ''); + }, t.transformAdServerTargetingObj = function (e) { + return e && Object.getOwnPropertyNames(e).length > 0 ? ee(e).map(function (t) { + return ''.concat(t, '=').concat(encodeURIComponent(te(e, t))); + }).join('&') : ''; + }, t.getAdUnitSizes = function (e) { + if (!e) { + return; + } + var t = []; + if (e.mediaTypes && e.mediaTypes.banner && Array.isArray(e.mediaTypes.banner.sizes)) { + var r = e.mediaTypes.banner.sizes; + Array.isArray(r[0]) ? t = r : t.push(r); + } else { + Array.isArray(e.sizes) && (Array.isArray(e.sizes[0]) ? t = e.sizes : t.push(e.sizes)); + } + return t; + }, t.parseSizesInput = function (e) { + var t = []; + if ('string' == typeof e) { + var r = e.split(','), n = /^(\d)+x(\d)+$/i; + if (r) { + for (var i in r) { + H(r, i) && r[i].match(n) && t.push(r[i]); + } + } + } else if ('object' === b(e)) { + var o = e.length; + if (o > 0) { + if (2 === o && 'number' == typeof e[0] && 'number' == typeof e[1]) { + t.push(D(e)); + } else { + for (var a = 0; a < o; a++) { + t.push(D(e[a])); + } + } + } + } + return t; + }, t.parseGPTSingleSizeArray = D, t.parseGPTSingleSizeArrayToRtbSize = function (e) { + if (k(e)) { + return { + w: e[0], + h: e[1] + }; + } + }, t.getWindowTop = N, t.getWindowSelf = M, t.getWindowLocation = U, t.hasConsoleLogger = function () { + return O; + }, t.debugTurnedOn = function () { + return !!n.config.getConfig('debug'); + }, t.createInvisibleIframe = function () { + var e = document.createElement('iframe'); + return e.id = R(), e.height = 0, e.width = 0, e.border = '0px', e.hspace = '0', e.vspace = '0', e.marginWidth = '0', e.marginHeight = '0', e.style.border = '0', e.scrolling = 'no', e.frameBorder = '0', e.src = 'about:blank', e.style.display = 'none', e; + }, t.getParameterByName = function (e) { + return fe(U().search)[e] || ''; + }, t.isA = B, t.isFn = L, t.isStr = z, t.isArray = V, t.isNumber = F, t.isPlainObject = q, t.isBoolean = function (e) { + return B(e, 'Boolean'); + }, t.isEmpty = G, t.isEmptyStr = function (e) { + return z(e) && (!e || 0 === e.length); + }, t._each = W, t.contains = function (e, t) { + if (G(e)) { + return !1; + } + if (L(e.indexOf)) { + return -1 !== e.indexOf(t); + } + var r = e.length; + for (; r--;) { + if (e[r] === t) { + return !0; + } + } + return !1; + }, t._map = function (e, t) { + if (G(e)) { + return []; + } + if (L(e.map)) { + return e.map(t); + } + var r = []; + return W(e, function (n, i) { + r.push(t(n, i, e)); + }), r; + }, t.hasOwn = H, t.insertElement = Y, t.triggerPixel = K, t.callBurl = function (e) { + var t = e.source, r = e.burl; + t === y.S2S.SRC && r && T.triggerPixel(r); + }, t.insertHtmlIntoIframe = function (e) { + if (!e) { + return; + } + var t = document.createElement('iframe'); + t.id = R(), t.width = 0, t.height = 0, t.hspace = '0', t.vspace = '0', t.marginWidth = '0', t.marginHeight = '0', t.style.display = 'none', t.style.height = '0px', t.style.width = '0px', t.scrolling = 'no', t.frameBorder = '0', t.allowtransparency = 'true', T.insertElement(t, document, 'body'), t.contentWindow.document.open(), t.contentWindow.document.write(e), t.contentWindow.document.close(); + }, t.insertUserSyncIframe = J, t.createTrackPixelHtml = function (e) { + if (!e) { + return ''; + } + var t = encodeURI(e), r = '
'; + return r += '
'; + }, t.createTrackPixelIframeHtml = Q, t.getValueString = X, t.uniques = $, t.flatten = Z, t.getBidRequest = function (e, t) { + if (!e) { + return; + } + var r; + return t.some(function (t) { + var n = (0, o.default)(t.bids, function (t) { + return [ + 'bidId', + 'adId', + 'bid_id' + ].some(function (r) { + return t[r] === e; + }); + }); + return n && (r = n), n; + }), r; + }, t.getKeys = ee, t.getValue = te, t.getKeyByValue = function (e, t) { + for (var r in e) { + if (e.hasOwnProperty(r) && e[r] === t) { + return r; + } + } + }, t.getBidderCodes = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : pbjs.adUnits; + return e.map(function (e) { + return e.bids.map(function (e) { + return e.bidder; + }).reduce(Z, []); + }).reduce(Z).filter($); + }, t.isGptPubadsDefined = re, t.shuffle = function (e) { + var t = e.length; + for (; t > 0;) { + var r = Math.floor(Math.random() * t); + t--; + var n = e[t]; + e[t] = e[r], e[r] = n; + } + return e; + }, t.adUnitsFilter = function (e, t) { + return (0, a.default)(e, t && t.adUnitCode); + }, t.deepClone = se, t.inIframe = function () { + try { + return T.getWindowSelf() !== T.getWindowTop(); + } catch (e) { + return !0; + } + }, t.isSafariBrowser = function () { + return /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent); + }, t.replaceAuctionPrice = function (e, t) { + if (!e) { + return; + } + return e.replace(/\$\{AUCTION_PRICE\}/g, t); + }, t.replaceClickThrough = function (e, t) { + if (!e || !t || 'string' != typeof t) { + return; + } + return e.replace(/\${CLICKTHROUGH}/g, t); + }, t.timestamp = function () { + return new Date().getTime(); + }, t.getPerformanceNow = function () { + return window.performance && window.performance.now && window.performance.now() || 0; + }, t.hasDeviceAccess = function () { + return !1 !== n.config.getConfig('deviceAccess'); + }, t.checkCookieSupport = ue, t.delayExecution = function (e, t) { + if (t < 1) { + throw new Error('numRequiredCalls must be a positive number. Got '.concat(t)); + } + var r = 0; + return function () { + ++r === t && e.apply(this, arguments); + }; + }, t.groupBy = function (e, t) { + return e.reduce(function (e, r) { + return (e[r[t]] = e[r[t]] || []).push(r), e; + }, {}); + }, t.getDefinedParams = function (e, t) { + return t.filter(function (t) { + return e[t]; + }).reduce(function (t, r) { + return v(t, m({}, r, e[r])); + }, {}); + }, t.isValidMediaTypes = function (e) { + var t = [ + 'banner', + 'native', + 'video' + ]; + if (!Object.keys(e).every(function (e) { + return (0, a.default)(t, e); + })) { + return !1; + } + if (e.video && e.video.context) { + return (0, a.default)([ + 'instream', + 'outstream', + 'adpod' + ], e.video.context); + } + return !0; + }, t.getBidderRequest = function (e, t, r) { + return (0, o.default)(e, function (e) { + return e.bids.filter(function (e) { + return e.bidder === t && e.adUnitCode === r; + }).length > 0; + }) || { + start: null, + auctionId: null + }; + }, t.getUserConfiguredParams = function (e, t, r) { + return e.filter(function (e) { + return e.code === t; + }).map(function (e) { + return e.bids; + }).reduce(Z, []).filter(function (e) { + return e.bidder === r; + }).map(function (e) { + return e.params || {}; + }); + }, t.getOrigin = function () { + return window.location.origin ? window.location.origin : window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); + }, t.getDNT = function () { + return '1' === navigator.doNotTrack || '1' === window.doNotTrack || '1' === navigator.msDoNotTrack || 'yes' === navigator.doNotTrack; + }, t.isAdUnitCodeMatchingSlot = function (e) { + return function (t) { + return ce(e, t); + }; + }, t.isSlotMatchingAdUnitCode = de, t.getGptSlotInfoForAdUnitCode = function (e) { + var t; + re() && (t = (0, o.default)(window.googletag.pubads().getSlots(), de(e))); + if (t) { + return { + gptSlot: t.getAdUnitPath(), + divId: t.getSlotElementId() + }; + } + return {}; + }, t.unsupportedBidderMessage = function (e, t) { + var r = Object.keys(e.mediaTypes || { banner: 'banner' }).join(', '); + return '\n '.concat(e.code, ' is a ').concat(r, ' ad unit\n containing bidders that don\'t support ').concat(r, ': ').concat(t, '.\n This bidder won\'t fetch demand.\n '); + }, t.isInteger = le, t.convertCamelToUnderscore = function (e) { + return e.replace(/(?:^|\.?)([A-Z])/g, function (e, t) { + return '_' + t.toLowerCase(); + }).replace(/^_/, ''); + }, t.cleanObj = function (e) { + return Object.keys(e).reduce(function (t, r) { + return void 0 !== e[r] && (t[r] = e[r]), t; + }, {}); + }, t.pick = function (e, t) { + if ('object' !== b(e)) { + return {}; + } + return t.reduce(function (r, n, i) { + if ('function' == typeof n) { + return r; + } + var o = n, a = n.match(/^(.+?)\sas\s(.+?)$/i); + a && (n = a[1], o = a[2]); + var s = e[n]; + return 'function' == typeof t[i + 1] && (s = t[i + 1](s, r)), void 0 !== s && (r[o] = s), r; + }, {}); + }, t.transformBidderParamKeywords = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'keywords', r = []; + return W(e, function (e, n) { + if (V(e)) { + var i = []; + W(e, function (e) { + ((e = X(t + '.' + n, e)) || '' === e) && i.push(e); + }), e = i; + } else { + if (!z(e = X(t + '.' + n, e))) { + return; + } + e = [e]; + } + r.push({ + key: n, + value: e + }); + }), r; + }, t.convertTypes = function (e, t) { + return Object.keys(e).forEach(function (r) { + var n, i; + t[r] && (L(e[r]) ? t[r] = e[r](t[r]) : t[r] = (n = e[r], i = t[r], 'string' === n ? i && i.toString() : 'number' === n ? Number(i) : i), isNaN(t[r]) && delete t.key); + }), t; + }, t.isArrayOfNums = function (e, t) { + return V(e) && (!t || e.length === t) && e.every(function (e) { + return le(e); + }); + }, t.fill = function (e, t) { + for (var r = [], n = 0; n < t; n++) { + var i = q(e) ? se(e) : e; + r.push(i); + } + return r; + }, t.chunk = function (e, t) { + for (var r = [], n = 0; n < Math.ceil(e.length / t); n++) { + var i = n * t, o = i + t; + r.push(e.slice(i, o)); + } + return r; + }, t.getMinValueFromArray = function (e) { + return Math.min.apply(Math, f(e)); + }, t.getMaxValueFromArray = function (e) { + return Math.max.apply(Math, f(e)); + }, t.compareOn = function (e) { + return function (t, r) { + return t[e] < r[e] ? 1 : t[e] > r[e] ? -1 : 0; + }; + }, t.parseQS = fe, t.formatQS = pe, t.parseUrl = function (e, t) { + var r = document.createElement('a'); + t && 'noDecodeWholeURL' in t && t.noDecodeWholeURL ? r.href = e : r.href = decodeURIComponent(e); + var n = t && 'decodeSearchAsString' in t && t.decodeSearchAsString; + return { + href: r.href, + protocol: (r.protocol || '').replace(/:$/, ''), + hostname: r.hostname, + port: +r.port, + pathname: r.pathname.replace(/^(?!\/)/, '/'), + search: n ? r.search : T.parseQS(r.search || ''), + hash: (r.hash || '').replace(/^#/, ''), + host: r.host || window.location.host + }; + }, t.buildUrl = function (e) { + return (e.protocol || 'http') + '://' + (e.host || e.hostname + (e.port ? ':'.concat(e.port) : '')) + (e.pathname || '') + (e.search ? '?'.concat(T.formatQS(e.search || '')) : '') + (e.hash ? '#'.concat(e.hash) : ''); + }, t.deepEqual = ge, t.mergeDeep = function e(t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + if (!n.length) { + return t; + } + var o = n.shift(); + if (q(t) && q(o)) { + for (var a in o) { + q(o[a]) ? (t[a] || v(t, m({}, a, {})), e(t[a], o[a])) : V(o[a]) && t[a] ? V(t[a]) && (t[a] = t[a].concat(o[a])) : v(t, m({}, a, o[a])); + } + } + return e.apply(void 0, [t].concat(n)); + }, t.cyrb53Hash = function (e) { + for (var t, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = function (e, t) { + if (L(Math.imul)) { + return Math.imul(e, t); + } + var r = (4194303 & e) * (t |= 0); + return 4290772992 & e && (r += (4290772992 & e) * t | 0), 0 | r; + }, i = 3735928559 ^ r, o = 1103547991 ^ r, a = 0; a < e.length; a++) { + t = e.charCodeAt(a), i = n(i ^ t, 2654435761), o = n(o ^ t, 1597334677); + } + return i = n(i ^ i >>> 16, 2246822507) ^ n(o ^ o >>> 13, 3266489909), (4294967296 * (2097151 & (o = n(o ^ o >>> 16, 2246822507) ^ n(i ^ i >>> 13, 3266489909))) + (i >>> 0)).toString(); + }, Object.defineProperty(t, 'deepAccess', { + enumerable: !0, + get: function () { + return s.default; + } + }), Object.defineProperty(t, 'deepSetValue', { + enumerable: !0, + get: function () { + return u.default; + } + }), t.getLatestHighestCpmBid = t.getOldestHighestCpmBid = t.getHighestCpm = t.bind = t.internal = t.logError = t.logWarn = t.logInfo = t.logMessage = void 0, r(9), r(6), r(13), r(26), r(4), r(2), r(329), r(40), r(330), r(1), r(3), r(5), r(102), r(43), r(16), r(214), r(33), r(11), r(0); + var n = r(22), i = d(r(336)), o = d(r(37)), a = d(r(31)), s = d(r(337)), u = d(r(338)), c = r(8); + function d(e) { + return e && e.__esModule ? e : { default: e }; + } + function l(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || p(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function f(e) { + return function (e) { + if (Array.isArray(e)) { + return g(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || p(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function p(e, t) { + if (e) { + if ('string' == typeof e) { + return g(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === r && e.constructor && (r = e.constructor.name), 'Map' === r || 'Set' === r ? Array.from(r) : 'Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? g(e, t) : void 0; + } + } + function g(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function m(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function v() { + return (v = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function b(e) { + return (b = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var y = r(36), h = Object.prototype.toString, S = Boolean(window.console), O = Boolean(S && window.console.log), _ = (Boolean(S && window.console.info), Boolean(S && window.console.warn), Boolean(S && window.console.error), r(60), (0, c.logger)({ + name: 'Prebid', + bgColor: '#3b88c3', + textColor: '#FFF' + }).atVerbosity(3)), E = _.logMessage; + t.logMessage = E; + var I = _.logInfo; + t.logInfo = I; + var w = _.logWarn; + t.logWarn = w; + var A = _.logError; + t.logError = A; + var T = { + checkCookieSupport: ue, + createTrackPixelIframeHtml: Q, + getWindowSelf: M, + getWindowTop: N, + getWindowLocation: U, + insertUserSyncIframe: J, + insertElement: Y, + isFn: L, + triggerPixel: K, + parseQS: fe, + formatQS: pe, + deepEqual: ge + }; + t.internal = T; + var x = {}, C = function (e, t) { + return t; + }.bind(null, 1, x)() === x ? Function.prototype.bind : function (e) { + var t = this, r = Array.prototype.slice.call(arguments, 1); + return function () { + return t.apply(e, r.concat(Array.prototype.slice.call(arguments))); + }; + }; + t.bind = C; + var P, j = (P = 0, function () { + return ++P; + }); + function R() { + return j() + Math.random().toString(16).substr(2); + } + function D(e) { + if (k(e)) { + return e[0] + 'x' + e[1]; + } + } + function k(e) { + return V(e) && 2 === e.length && !isNaN(e[0]) && !isNaN(e[1]); + } + function N() { + return window.top; + } + function M() { + return window.self; + } + function U() { + return window.location; + } + function B(e, t) { + return h.call(e) === '[object ' + t + ']'; + } + function L(e) { + return B(e, 'Function'); + } + function z(e) { + return B(e, 'String'); + } + function V(e) { + return B(e, 'Array'); + } + function F(e) { + return B(e, 'Number'); + } + function q(e) { + return B(e, 'Object'); + } + function G(e) { + if (!e) { + return !0; + } + if (V(e) || z(e)) { + return !(e.length > 0); + } + for (var t in e) { + if (hasOwnProperty.call(e, t)) { + return !1; + } + } + return !0; + } + function W(e, t) { + if (!G(e)) { + if (L(e.forEach)) { + return e.forEach(t, this); + } + var r = 0, n = e.length; + if (n > 0) { + for (; r < n; r++) { + t(e[r], r, e); + } + } else { + for (r in e) { + hasOwnProperty.call(e, r) && t.call(this, e[r], r); + } + } + } + } + function H(e, t) { + return e.hasOwnProperty ? e.hasOwnProperty(t) : void 0 !== e[t] && e.constructor.prototype[t] !== e[t]; + } + function Y(e, t, r, n) { + var i; + t = t || document, i = r ? t.getElementsByTagName(r) : t.getElementsByTagName('head'); + try { + if ((i = i.length ? i : t.getElementsByTagName('body')).length) { + i = i[0]; + var o = n ? null : i.firstChild; + return i.insertBefore(e, o); + } + } catch (e) { + } + } + function K(e, t) { + var r = new Image(); + t && T.isFn(t) && (r.addEventListener('load', t), r.addEventListener('error', t)), r.src = e; + } + function J(e, t) { + var r = T.createTrackPixelIframeHtml(e, !1, 'allow-scripts allow-same-origin'), n = document.createElement('div'); + n.innerHTML = r; + var i = n.firstChild; + t && T.isFn(t) && (i.addEventListener('load', t), i.addEventListener('error', t)), T.insertElement(i, document, 'html', !0); + } + function Q(e) { + var t = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1], r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ''; + return e ? (t && (e = encodeURI(e)), r && (r = 'sandbox="'.concat(r, '"')), '')) : ''; + } + function X(e, t, r) { + return null == t ? r : z(t) ? t : F(t) ? t.toString() : void w('Unsuported type for param: ' + e + ' required type: String'); + } + function $(e, t, r) { + return r.indexOf(e) === t; + } + function Z(e, t) { + return e.concat(t); + } + function ee(e) { + return Object.keys(e); + } + function te(e, t) { + return e[t]; + } + function re() { + if (window.googletag && L(window.googletag.pubads) && L(window.googletag.pubads().getSlots)) { + return !0; + } + } + var ne = ae('timeToRespond', function (e, t) { + return e > t; + }); + t.getHighestCpm = ne; + var ie = ae('responseTimestamp', function (e, t) { + return e > t; + }); + t.getOldestHighestCpmBid = ie; + var oe = ae('responseTimestamp', function (e, t) { + return e < t; + }); + function ae(e, t) { + return function (r, n) { + return r.cpm === n.cpm ? t(r[e], n[e]) ? n : r : r.cpm < n.cpm ? n : r; + }; + } + function se(e) { + return (0, i.default)(e); + } + function ue() { + if (window.navigator.cookieEnabled || document.cookie.length) { + return !0; + } + } + t.getLatestHighestCpmBid = oe; + var ce = function (e, t) { + return e.getAdUnitPath() === t || e.getSlotElementId() === t; + }; + function de(e) { + return function (t) { + return ce(t, e); + }; + } + function le(e) { + return Number.isInteger ? Number.isInteger(e) : 'number' == typeof e && isFinite(e) && Math.floor(e) === e; + } + function fe(e) { + return e ? e.replace(/^\?/, '').split('&').reduce(function (e, t) { + var r = l(t.split('='), 2), n = r[0], i = r[1]; + return /\[\]$/.test(n) ? (e[n = n.replace('[]', '')] = e[n] || [], e[n].push(i)) : e[n] = i || '', e; + }, {}) : {}; + } + function pe(e) { + return Object.keys(e).map(function (t) { + return Array.isArray(e[t]) ? e[t].map(function (e) { + return ''.concat(t, '[]=').concat(e); + }).join('&') : ''.concat(t, '=').concat(e[t]); + }).join('&'); + } + function ge(e, t) { + if (e === t) { + return !0; + } + if ('object' === b(e) && null !== e && 'object' === b(t) && null !== t) { + if (Object.keys(e).length !== Object.keys(t).length) { + return !1; + } + for (var r in e) { + if (!t.hasOwnProperty(r)) { + return !1; + } + if (!ge(e[r], t[r])) { + return !1; + } + } + return !0; + } + return !1; + } + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getLogStack = function () { + return g; + }, t.getVerbosityLevel = function () { + return parseInt(m[d] || 3); + }, t.setDefaultConfig = function (e) { + y = (0, i.default)({}, e, y); + }, t.turnOnDebug = function () { + b = !0, function () { + for (var e in p) { + p.hasOwnProperty(e) && p[e].reset(); + } + }(); + }, t.debugOn = I, t.bbLogger = t.logger = void 0, r(33), r(1), r(3), r(0), r(5), r(9); + var n = r(58), i = u(r(29)), o = r(263), a = r(12), s = u(r(10)); + function u(e) { + return e && e.__esModule ? e : { default: e }; + } + var c = s.default.QUERY_PARAMS, d = c.LOG_VERBOSITY, l = c.PBJS_DEBUG, f = s.default.LOGS.BIDBARREL, p = {}, g = [], m = (0, n.urlQueryAsObject)(), v = m[l], b = !!v && [ + 'true', + 'trace', + 'time' + ].indexOf(v.toLowerCase()) >= 0, y = { + name: f.LABEL, + bgColor: f.COLOR, + textColor: '#FFF' + }, h = { + logMessage: { consoleMethod: 'log' }, + logInfo: { consoleMethod: 'info' }, + logWarn: { consoleMethod: 'warn' }, + logError: { consoleMethod: 'error' } + }, S = function (e, t) { + return (0, a.dom)().window.document.documentMode || /Edge/.test((0, a.dom)().window.navigator.userAgent) ? { + label: ''.concat(t.name), + descriptor: ''.concat(e.toUpperCase(), ':'), + style: '' + } : { + label: '%c'.concat(t.name), + descriptor: ''.concat(e.toUpperCase(), ':'), + style: 'display: inline-block; color: '.concat(t.textColor, '; background: ').concat(t.bgColor, '; padding: 1px 4px; border-radius: 3px;') + }; + }; + var O = 0, _ = function (e) { + var t = e.name, r = e.textColor, n = e.bgColor, i = {}, s = {}; + function u(e) { + return i['@'.concat(e)] || (i['@'.concat(e)] = Object.keys(h).reduce(function (i, u) { + var c = h[u].consoleMethod, l = function (e) { + var t = e.consoleMethod, r = e.level, n = s.allow || {}; + if (n.consoleMethods && n.consoleMethods[t] || n.verbosity && n.verbosity['@'.concat(r)]) { + return !0; + } + return !!I() && parseInt(m[d] || 3) >= parseInt(r); + }({ + level: e, + consoleMethod: c + }), f = v ? v.toLowerCase() : ''; + if ('trace' !== f && 'time' !== f || !l) { + if (l) { + var p = S(c, { + name: t, + textColor: r, + bgColor: n + }), b = p.label, y = p.style, _ = p.descriptor; + i[u] = void 0 === console[c].bind ? Function.prototype.bind.call(console[c], console, b, y, _) : console[c].bind(console, b, y, _); + } else { + i[u] = function () { + return !1; + }; + } + } else { + var E = S(c, { + name: t, + textColor: r, + bgColor: n + }), w = E.label, A = E.style, T = E.descriptor; + i[u] = function () { + var t = (0, a.dom)().window.performance.now(), r = parseInt(t), n = void 0 === console[c].bind ? Function.prototype.bind.call(console[c], console, w, A, '( '.concat(r, ' | +').concat(r - O, ' )'), T) : console[c].bind(console, w, A, '( '.concat(r, ' | +').concat(r - O, ' )'), T); + O = r; + for (var i = arguments.length, s = new Array(i), d = 0; d < i; d++) { + s[d] = arguments[d]; + } + g.push({ + type: u, + input: s, + stack: 'trace' === f ? (0, o.getStackTrace)() : 'omitted', + verbosity: e, + time: t + }), n.apply(void 0, s); + }; + } + return i; + }, { + atVerbosity: u, + reset: c, + setLoggerConfig: function (e) { + s.allow = e, c(); + } + })), i['@'.concat(e)]; + } + function c() { + for (var e in i) { + i.hasOwnProperty(e) && (i[e] = u(e.replace('@', ''))); + } + } + return p[t] = p[t] || u(3), p[t]; + }; + t.logger = _; + var E = _({ + name: f.LABEL, + bgColor: f.COLOR, + textColor: '#FFF' + }); + function I() { + var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; + return e && b ? v.toLowerCase() === e.toLowerCase() : b; + } + t.bbLogger = E; + }, + function (e, t, r) { + var n = r(32).f, i = Function.prototype, o = /^\s*function ([^ (]*)/; + 'name' in i || r(28) && n(i, 'name', { + configurable: !0, + get: function () { + try { + return ('' + this).match(o)[1]; + } catch (e) { + return ''; + } + } + }); + }, + function (e) { + e.exports = JSON.parse('{"STAGE_ENVIRONMENTS":["stage","staging","dev"],"QUERY_PARAMS":{"LOG_VERBOSITY":"bb_logVerbosity","PERF_MEASURE":"bb_perfMeasure","FORCE_RUN":"bb_forceRun","ANALYTICS":"bb_analytics","PBJS_DEBUG":"pbjs_debug","AD_SUPPRESS":"adSuppress","SIZE_SUPPRESS":"sizeSuppress","BID_SUPPRESS":"bidSuppress","MOD_SUPPRESS":"modSuppress","AD_SESSION":"adSession","AD_SUBSESSION":"adSubses","AD_REGION":"bb_regionCode","AD_COUNTRY":"bb_countryCode","SESSION":"session","SUBSESSION":"subsession","FTAG":"ftag","TTAG":"ttag","TARGETING_PREFIX":"adTargeting_"},"LOGS":{"BIDBARREL":{"LABEL":"BidBarrel","COLOR":"#6B5CA5"},"REQUEST_MANAGER":{"LABEL":"requestManager","COLOR":"#777"}},"CONFIG_RESTRICTED_KEYS":["analyticsTimings","consent","timeouts","cookie","prebid","adjustSlotDefinition","refreshOrder","contentAnnotation","api"],"UNIT_CONFIG_ALLOWED_MODIFIERS":["cache","collapseEmptyDiv","sizeMappings","outOfPage","lazyLoad"],"ANALYTICS_RECORD_TYPES":{"NO_BID":"noBid","BID_USED":"usedBid","BID":"bid","TIMING":"timing"},"ANALYTICS_RECORD_DEFAULTS":{"FIRST_INTERACTION":{"SLUG":"ttfi","NAME":"Time to First Interaction"},"FIRST_PAINT":{"SLUG":"ttfp","NAME":"Time to First Paint"},"INTERACTIVE":{"SLUG":"tti","NAME":"Time to Interactive"},"FIRST_CONTENTFUL_PAINT":{"SLUG":"ttfcp","NAME":"Time to First Contentful Paint"},"PAGE_LOAD":{"SLUG":"ttpl","NAME":"Time to Page Load"},"FIRST_BYTE":{"SLUG":"ttfb","NAME":"Time to First Byte"},"VISUALLY_READY":{"SLUG":"ttvr","NAME":"Time to Visually Ready"}},"VIDEO":{"PROTOCOL":{"VAST1":1,"VAST2":2,"VAST3":3,"VAST1_WRAPPER":4,"VAST2_WRAPPER":5,"VAST3_WRAPPER":6,"VAST4":7,"VAST4_WRAPPER":8,"DAAST1":9,"DAAST1_WRAPPER":10},"START_DELAY":{"PREROLL":0,"MIDROLL":-1,"POSTROLL":-2},"PLACEMENT":{"STREAM":1,"BANNER":2,"ARTICLE":3,"FEED":4,"INTERSTITIAL":5},"LINEARITY":{"LINEAR_INSTREAM":1,"NONLINEAR_OVERLAY":2},"BLOCK_ATTRIBUTE":{"AUTOPLAY_AUDIO":1,"MANUAL_AUDIO":2,"AUTO_EXPAND":3,"CLICK_EXPAND":4,"ROLLOVER_EXPAND":5,"AUTOPLAY_INBANNER_VIDEO":6,"MANUAL_INBANNER_VIDEO":7,"POP":8,"SUGGESTIVE":9,"FLICKERING":10,"SURVEYS":11,"TEXT_ONLY":12,"USER_INTERACTIVE":13,"ALERT":14,"AUDIO_ONOFF_UI":15,"PROVIDE_SKIP":16,"FLASH":17},"DELIVERY":{"STREAMING":1,"PROGRESSIVE":2,"DOWNLOAD":3},"API":{"VPAID1":1,"VPAID2":2,"MRAID1":3,"ORMMA":4,"MRAID2":5,"MRAID3":6},"POS":{"UNKNOWN":0,"ATF":1,"ABOVE_THE_FOLD":1,"BTF":3,"BELOW_THE_FOLD":3,"HEADER":4,"FOOTER":5,"SIDEBAR":6,"FULL_SCREEN":7},"COMPANION_TYPE":{"STATIC":1,"HTML":2,"IFRAME":3},"PLAYBACK_METHOD":{"PAGELOAD_SOUND_ON":1,"PAGELOAD_SOUND_OFF":2,"CLICK_SOUND_ON":3,"MOUSEOVER_SOUND_ON":4,"SCROLLIN_SOUND_ON":5,"SCROLLIN_SOUND_OFF":6},"PLAYBACK_END":{"ON_COMPLETE":1,"ON_VP_LEAVE":2,"ON_COMPLETE_WITH_FLOAT":3}},"MODULES":{"PREBID_HEADER_BIDDING":"prebid","PREBID_ANALYTICS":"prebidAnalytics","BIDBARREL_ANALYTICS":"adLibAnalytics","ANALYTICS_TIMINGS":"adLibAnalyticsTimings","ANALYTICS_TIMINGS_MANUAL":"adLibAnalyticsTimingsManual","ANALYTICS_TIMINGS_BOOMR":"adLibAnalyticsTimingsBoomr","ANALYTICS_PREBID":"adLibAnalyticsPrebid","ANALYTICS_AMAZON":"adLibAnalyticsAmazon","DYNAMIC_BIDDERS":"dynamicBidders","DYNAMIC_TARGETING":"dynamicTargeting","GEOLOCATION":"geo","STRING_SIZES_FILTER":"stringSizesFilter","IX_HEADER_BIDDING":"ixUniversal","IX_IDENTITY":"ixIdentity","AMAZON_HEADER_BIDDING":"amazon","CONFIANT_PREBID":"confiantPrebid","CONFIANT_GOOGLETAG":"confiantGoogletag","CONFIANT":"confiant","STACKS":"stacks","MYI":"myi","IAS":"ias","BIDBARREL_FEATURES":"enforceHeaderBiddingFeatures","AUTO_PRIORITY":"autoPriority","CONTENT_ANNOTATION":"contentAnnotation","OPTANON":"cbsoptanon","GOOGLE_PUBLISHER_TAG":"gpt","PREBID_S2S":"prebidS2S","PUBCOMMON_ID":"pubCommonId","VIDEO":"video","IDENTITYLINK_ID":"identityLinkId","PREBID_USER_ID":"prebidUserId","LIVEINTENT_ID":"liveIntentId"},"EVENTS":{"ANALYTICS_RECORD_CREATED":"analyticsRecordCreated","ANALYTICS_REPORTED":"analyticsReported","ANALYTICS_CANCELLED":"analyticsCancelled","ERROR_REPORT":"errorReported","BAD_BID":"badBid","BAD_AD":"badAd","BID_USED":"bidUsed","BID_RECYCLED":"bidRecycled","DISPLAY_CALLED":"displayCalled","LOAD":"load","INITIALIZE":"initialize","HEADER_BIDDING_REQUEST":"headerBiddingRequest","HEADER_BIDDING_RESPONSE":"headerBiddingResponse","MODULE_INITIALIZED":"moduleInitialized","IDENTIFIED":"identified","MODULE_REGISTERED":"moduleRegistered","MODULE_DEREGISTERED":"moduleDeregistered","INSTANTIATED":"instantiated","REFRESH":"refresh","AUCTION":"auction","BIDS_RETURNED":"bidsReturned","BIDS_REQUESTED":"bidsRequested","SLOT_DEFINED":"slotDefined","BATCH_SLOTS_DEFINED":"batchSlotsDefined","AD_VIEWABLE":"viewable","AD_RENDERED":"rendered","AD_LOADED":"loaded","AD_REQUESTED":"requested","AD_RECEIVED":"responseReceived","AD_VISIBILITY_CHANGED":"visibilityChanged","DFP_EVENTS":{"AD_VIEWABLE":"impressionViewable","AD_RENDERED":"slotRenderEnded","AD_LOADED":"slotOnload","AD_REQUESTED":"slotRequested","AD_RECEIVED":"slotResponseReceived","AD_VISIBILITY_CHANGED":"slotVisibilityChanged"}}}'); + }, + function (e, t, r) { + 'use strict'; + r(199); + var n = r(27), i = r(110), o = r(28), a = /./.toString, s = function (e) { + r(41)(RegExp.prototype, 'toString', e, !0); + }; + r(24)(function () { + return '/a/b' != a.call({ + source: 'a', + flags: 'b' + }); + }) ? s(function () { + var e = n(this); + return '/'.concat(e.source, '/', 'flags' in e ? e.flags : !o && e instanceof RegExp ? i.call(e) : void 0); + }) : 'toString' != a.name && s(function () { + return a.call(this); + }); + }, + function (e, t, r) { + 'use strict'; + (function (e) { + Object.defineProperty(t, '__esModule', { value: !0 }), t.dom = d, t.getGlobal = function () { + (0, i.default)(d(), 'window.BidBarrel') || (d().window.BidBarrel = {}, d().window.BidBarrel.queue = []); + return d().window.BidBarrel; + }, r(17), r(2), r(1), r(3), r(0), r(5); + var n = o(r(48)), i = o(r(34)); + function o(e) { + return e && e.__esModule ? e : { default: e }; + } + function a(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function s(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? a(Object(r), !0).forEach(function (t) { + u(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : a(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function u(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var c = 'undefined' == typeof window ? { window: e } : { window: window }; + function d(e) { + return (0, n.default)(e) || (c = s(s({}, c), e)), c; + } + }.call(this, r(169))); + }, + function (e, t, r) { + 'use strict'; + var n = r(53), i = r(14), o = r(47), a = r(195), s = r(144), u = r(38), c = r(159), d = r(145); + i(i.S + i.F * !r(119)(function (e) { + Array.from(e); + }), 'Array', { + from: function (e) { + var t, r, i, l, f = o(e), p = 'function' == typeof this ? this : Array, g = arguments.length, m = g > 1 ? arguments[1] : void 0, v = void 0 !== m, b = 0, y = d(f); + if (v && (m = n(m, g > 2 ? arguments[2] : void 0, 2)), null == y || p == Array && s(y)) { + for (r = new p(t = u(f.length)); t > b; b++) { + c(r, b, v ? m(f[b], b) : f[b]); + } + } else { + for (l = y.call(f), r = new p(); !(i = l.next()).done; b++) { + c(r, b, v ? a(l, m, [ + i.value, + b + ], !0) : i.value); + } + } + return r.length = b, r; + } + }); + }, + function (e, t, r) { + var n = r(18), i = r(62), o = r(46), a = r(41), s = r(53), u = function (e, t, r) { + var c, d, l, f, p = e & u.F, g = e & u.G, m = e & u.S, v = e & u.P, b = e & u.B, y = g ? n : m ? n[t] || (n[t] = {}) : (n[t] || {}).prototype, h = g ? i : i[t] || (i[t] = {}), S = h.prototype || (h.prototype = {}); + for (c in (g && (r = t), r)) { + l = ((d = !p && y && void 0 !== y[c]) ? y : r)[c], f = b && d ? s(l, n) : v && 'function' == typeof l ? s(Function.call, l) : l, y && a(y, c, l, e & u.U), h[c] != l && o(h, c, f), v && S[c] != l && (S[c] = l); + } + }; + n.core = i, u.F = 1, u.G = 2, u.S = 4, u.P = 8, u.B = 16, u.W = 32, u.U = 64, u.R = 128, e.exports = u; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.setConfigPublic = t.setConfig = t.getConfig = t.config = void 0, r(17), r(4), r(2), r(16), r(1), r(3), r(0), r(5); + var n = r(96), i = r(8), o = r(39), a = r(298), s = p(r(56)), u = p(r(301)), c = r(21), d = p(r(48)), l = r(20), f = p(r(10)); + function p(e) { + return e && e.__esModule ? e : { default: e }; + } + function g(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function m(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? g(Object(r), !0).forEach(function (t) { + v(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : g(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function v(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function b(e) { + return (b = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var y = { versionControl: !1 }, h = f.default.EVENTS.ERROR_REPORT, S = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : y, r = (0, n.richObject)(e, t); + function p(e) { + return e = (0, a.concatConfigArrays)(e, r.getValue()), r.setValue(e), r.getValue(); + } + function g(e, t) { + var r = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], n = (0, u.default)(f.default.CONFIG_RESTRICTED_KEYS, e), o = !0; + return 0 !== n.length && (i.bbLogger.atVerbosity(2).logWarn('DEPRECATED: The following keys you provided are not available via implementation in BidBarrel.', n), i.bbLogger.atVerbosity(2).logWarn('Please make the appropriate changes to your site config in the BidBarrel repo(via PR). The full list of config restrictions:', f.default.CONFIG_RESTRICTED_KEYS), o = !1), r ? t = (0, s.default)(t, f.default.CONFIG_RESTRICTED_KEYS) : o; + } + function v(e, t) { + if ('object' === b(e)) { + if ((0, d.default)(e)) { + i.bbLogger.logError('Attempted to set config with empty object'); + var r = new Error('Attempted to set config with empty object.'); + return void l.eventEmitter.emit(h, r); + } + e = g(Object.keys(e), e); + } else if ('*' === e) { + if ((0, d.default)(t)) { + i.bbLogger.logError('Attempted to set config with empty object'); + var n = new Error('Attempted to set config with empty object.'); + return void l.eventEmitter.emit(h, n); + } + t = g(Object.keys(t), t); + } else if (!g([e.split('.')[0]], t, !1)) { + return; + } + return S(e, t); + } + var S = (0, o.hookedFn)('sync', function (e, t) { + if ('object' === b(e)) { + return p(e); + } + if ('*' === e) { + return p(t); + } + var n = r.setValue(e, t), i = r.getValue(); + return r.options.versionControl && (i._revision = n), i; + }); + function O() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; + return r.getValue(e, t); + } + return r.options.versionControl && c.exposureApi.expose({ + configVersioning: { + undo: r.undo, + revertTo: r.revertTo, + getVersion: r.getVersion, + getValueAtVersion: r.getValueAtVersion + } + }), m({ + setConfig: S, + setConfigPublic: v, + getConfig: O + }, r); + }(); + t.config = S; + var O = S.getConfig; + t.getConfig = O; + var _ = S.setConfig; + t.setConfig = _; + var E = S.setConfigPublic; + t.setConfigPublic = E, c.exposureApi.rootScope({ + getConfig: O, + setConfig: _ + }), c.exposureApi.rootScopeGetters({ + config: function () { + return O(); + } + }), O('debug', function (e) { + 'boolean' == typeof e && e ? (0, i.turnOnDebug)() : ((0, i.setDefaultConfig)(e), i.bbLogger.setLoggerConfig(e)); + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(136), i = r(27), o = r(137), a = r(134), s = r(38), u = r(108), c = r(135), d = r(24), l = Math.min, f = [].push, p = 'length', g = !d(function () { + RegExp(4294967295, 'y'); + }); + r(109)('split', 2, function (e, t, r, d) { + var m; + return m = 'c' == 'abbc'.split(/(b)*/)[1] || 4 != 'test'.split(/(?:)/, -1)[p] || 2 != 'ab'.split(/(?:ab)*/)[p] || 4 != '.'.split(/(.?)(.?)/)[p] || '.'.split(/()()/)[p] > 1 || ''.split(/.?/)[p] ? function (e, t) { + var i = String(this); + if (void 0 === e && 0 === t) { + return []; + } + if (!n(e)) { + return r.call(i, e, t); + } + for (var o, a, s, u = [], d = (e.ignoreCase ? 'i' : '') + (e.multiline ? 'm' : '') + (e.unicode ? 'u' : '') + (e.sticky ? 'y' : ''), l = 0, g = void 0 === t ? 4294967295 : t >>> 0, m = new RegExp(e.source, d + 'g'); (o = c.call(m, i)) && !((a = m.lastIndex) > l && (u.push(i.slice(l, o.index)), o[p] > 1 && o.index < i[p] && f.apply(u, o.slice(1)), s = o[0][p], l = a, u[p] >= g));) { + m.lastIndex === o.index && m.lastIndex++; + } + return l === i[p] ? !s && m.test('') || u.push('') : u.push(i.slice(l)), u[p] > g ? u.slice(0, g) : u; + } : '0'.split(void 0, 0)[p] ? function (e, t) { + return void 0 === e && 0 === t ? [] : r.call(this, e, t); + } : r, [ + function (r, n) { + var i = e(this), o = null == r ? void 0 : r[t]; + return void 0 !== o ? o.call(r, i, n) : m.call(String(i), r, n); + }, + function (e, t) { + var n = d(m, e, this, t, m !== r); + if (n.done) { + return n.value; + } + var c = i(e), f = String(this), p = o(c, RegExp), v = c.unicode, b = (c.ignoreCase ? 'i' : '') + (c.multiline ? 'm' : '') + (c.unicode ? 'u' : '') + (g ? 'y' : 'g'), y = new p(g ? c : '^(?:' + c.source + ')', b), h = void 0 === t ? 4294967295 : t >>> 0; + if (0 === h) { + return []; + } + if (0 === f.length) { + return null === u(y, f) ? [f] : []; + } + for (var S = 0, O = 0, _ = []; O < f.length;) { + y.lastIndex = g ? O : 0; + var E, I = u(y, g ? f : f.slice(O)); + if (null === I || (E = l(s(y.lastIndex + (g ? 0 : O)), f.length)) === S) { + O = a(f, O, v); + } else { + if (_.push(f.slice(S, O)), _.length === h) { + return _; + } + for (var w = 1; w <= I.length - 1; w++) { + if (_.push(I[w]), _.length === h) { + return _; + } + } + O = S = E; + } + } + return _.push(f.slice(S)), _; + } + ]; + }); + }, + function (e, t, r) { + var n = r(14), i = r(227), o = r(57), a = r(90), s = r(159); + n(n.S, 'Object', { + getOwnPropertyDescriptors: function (e) { + for (var t, r, n = o(e), u = a.f, c = i(n), d = {}, l = 0; c.length > l;) { + void 0 !== (r = u(n, t = c[l++])) && s(d, t, r); + } + return d; + } + }); + }, + function (e, t) { + var r = e.exports = 'undefined' != typeof window && window.Math == Math ? window : 'undefined' != typeof self && self.Math == Math ? self : Function('return this')(); + 'number' == typeof __g && (__g = r); + }, + function (e, t, r) { + var n = r(104)('wks'), i = r(63), o = r(18).Symbol, a = 'function' == typeof o; + (e.exports = function (e) { + return n[e] || (n[e] = a && o[e] || (a ? o : i)('Symbol.' + e)); + }).store = n; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.eventEmitter = void 0; + var n = r(8), i = r(58), o = r(39), a = r(21), s = r(12), u = c(r(51)); + function c(e) { + return e && e.__esModule ? e : { default: e }; + } + var d = c(r(10)).default.EVENTS.ERROR_REPORT, l = (0, n.logger)({ + name: 'eventEmitter', + bgColor: '#F5F1ED', + textColor: '#252323' + }), f = function () { + var e = this, t = (0, i.urlQueryAsObject)(), r = { once: {} }; + function n(e, t) { + var i = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + if ('once' !== e) { + if (e.constructor !== Array) { + i ? (r.once[e] || (r.once[e] = []), r.once[e].push(t)) : (r[e] || (r[e] = []), r[e].push(t)); + } else { + for (var o = 0; o < e.length; o++) { + var a = e[o]; + n(a, t, i); + } + } + } + } + var c = (0, o.hookedFn)('sync', function (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + if (t.constructor === Array) { + for (var o = 0; o < t.length; o++) { + var a = t[o]; + f.apply(e, [a].concat(n)); + } + } else { + f.apply(e, [t].concat(n)); + } + }); + function f(e) { + for (var n = arguments.length, i = new Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++) { + i[o - 1] = arguments[o]; + } + if ('true' === t.bb_dom_dispatch && (0, s.dom)().window.document.dispatchEvent(new CustomEvent('__bb.'.concat(e), { detail: i })), l.atVerbosity(5).logInfo('Emitting Event', e, 'with arguments', i), r[e] && r[e].length || r.once[e] && r.once[e].length) { + if (r[e]) { + for (var a = 0; a < r[e].length; a++) { + var f = r[e][a]; + try { + l.atVerbosity(4).logInfo(e, 'emitting callback', f), f.apply(null, i); + } catch (t) { + l.atVerbosity(1).logError('Callback for event', e, 'with args', i, 'returned an error', t); + var p = new Error('Callback for event '.concat(e, ' with args ').concat(i, ' returned an error. ').concat(JSON.stringify(t, u.default))); + c(d, p); + } + } + } + if (r.once[e]) { + for (var g = 0; g < r.once[e].length; g++) { + var m = r.once[e][g]; + try { + l.atVerbosity(4).logInfo(e, 'emitting callback', m), m.apply(null, i); + } catch (t) { + l.atVerbosity(1).logError('Run once callback for event', e, 'returned an error', t); + var v = new Error('Run once callback for event '.concat(e, ' returned an error. ').concat(JSON.stringify(t, u.default))); + c(d, v); + } + } + r.once[e] = []; + } + } + } + var p = n, g = n; + return a.exposureApi.rootScope({ on: n }), { + emit: c, + on: n, + addEventListener: p, + subscribe: g + }; + }(); + t.eventEmitter = f; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.expose = function (e) { + f.expose(e); + }, t.exposureApi = void 0; + var n, i = (n = r(29)) && n.__esModule ? n : { default: n }, o = r(55), a = r(8), s = r(12), u = r(188); + var c = (0, a.logger)({ + name: 'ExposureApi', + bgColor: '#F4B835' + }), d = {}, l = {}, f = function () { + var e = {}, t = [], r = {}; + function n(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + for (var r in e) { + Object.prototype.hasOwnProperty.call(e, r) && (t ? l[r] = e[r] : d[r] = e[r]); + } + } + function f(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + for (var r in e) { + Object.prototype.hasOwnProperty.call(e, r) && p(r, e[r], t); + } + } + function p(e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + r ? (0, u.readOnlyGetter)(l, e, t, 'Cannot set read-only property viacbs_at.'.concat(e, '.')) : (0, u.readOnlyGetter)(d, e, t, 'Cannot set read-only property BidBarrel.'.concat(e, '.')); + } + function g() { + return e; + } + return n({ exposedApi: g }), f({ + deprecatedMethods: function () { + return t; + } + }), { + api: g, + expose: function (t) { + var n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + if ('function' != typeof t || n ? n ? r = (0, i.default)({}, t, r) : e = (0, i.default)({}, t, e) : (0, o.makeSafe)(function () { + n ? r = t(r) : e = t(e); + }, c.logError), n) { + for (var a in r) { + Object.prototype.hasOwnProperty.call(r, a) && (l[a] = r[a]); + } + } else { + for (var s in e) { + Object.prototype.hasOwnProperty.call(e, s) && (d[s] = e[s]); + } + } + }, + rootScope: n, + rootScopeGetters: f, + rootScopeGetter: p, + bindToWindow: function () { + (0, s.dom)().window.BidBarrel = d, (0, s.dom)().window.viacbs_at = l; + }, + deprecateMethods: function (e, r) { + for (var n = function (n) { + var i = e[n]; + t.push(i), d[i] = function () { + return a.bbLogger.logWarn('BidBarrel.'.concat(i, ' is deprecated. Please remove all references before version ').concat(r, ' is released. To see all deprecated methods please check BidBarrel.deprecatedMethods')); + }; + }, i = 0; i < e.length; i++) { + n(i); + } + } + }; + }(); + t.exposureApi = f; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.newConfig = v, t.config = t.RANDOM = void 0, r(26), r(121), r(1), r(3), r(0), r(5), r(6), r(13); + var n = r(217), i = s(r(37)), o = s(r(31)), a = r(7); + function s(e) { + return e && e.__esModule ? e : { default: e }; + } + function u() { + return (u = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var c = Array.from, d = r(7), l = r(36), f = 'TRUE' === d.getParameterByName(l.DEBUG_MODE).toUpperCase(), p = window.location.origin; + t.RANDOM = 'random'; + var g = { + random: !0, + fixed: !0 + }, m = { + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high', + AUTO: 'auto', + DENSE: 'dense', + CUSTOM: 'custom' + }; + function v() { + var e, t, r, s = [], l = null; + function v() { + e = {}; + var o = { + _debug: f, + get debug() { + return this._debug; + }, + set debug(e) { + this._debug = e; + }, + _bidderTimeout: 3000, + get bidderTimeout() { + return this._bidderTimeout; + }, + set bidderTimeout(e) { + this._bidderTimeout = e; + }, + _publisherDomain: p, + get publisherDomain() { + return this._publisherDomain; + }, + set publisherDomain(e) { + this._publisherDomain = e; + }, + _priceGranularity: m.MEDIUM, + set priceGranularity(e) { + s(e) && ('string' == typeof e ? this._priceGranularity = a(e) ? e : m.MEDIUM : d.isPlainObject(e) && (this._customPriceBucket = e, this._priceGranularity = m.CUSTOM, d.logMessage('Using custom price granularity'))); + }, + get priceGranularity() { + return this._priceGranularity; + }, + _customPriceBucket: {}, + get customPriceBucket() { + return this._customPriceBucket; + }, + _mediaTypePriceGranularity: {}, + get mediaTypePriceGranularity() { + return this._mediaTypePriceGranularity; + }, + set mediaTypePriceGranularity(e) { + var t = this; + this._mediaTypePriceGranularity = Object.keys(e).reduce(function (r, n) { + return s(e[n]) ? 'string' == typeof e ? r[n] = a(e[n]) ? e[n] : t._priceGranularity : d.isPlainObject(e) && (r[n] = e[n], d.logMessage('Using custom price granularity for '.concat(n))) : d.logWarn('Invalid price granularity for media type: '.concat(n)), r; + }, {}); + }, + _sendAllBids: true, + get enableSendAllBids() { + return this._sendAllBids; + }, + set enableSendAllBids(e) { + this._sendAllBids = e; + }, + _useBidCache: false, + get useBidCache() { + return this._useBidCache; + }, + set useBidCache(e) { + this._useBidCache = e; + }, + _deviceAccess: true, + get deviceAccess() { + return this._deviceAccess; + }, + set deviceAccess(e) { + this._deviceAccess = e; + }, + _bidderSequence: 'random', + get bidderSequence() { + return this._bidderSequence; + }, + set bidderSequence(e) { + g[e] ? this._bidderSequence = e : d.logWarn('Invalid order: '.concat(e, '. Bidder Sequence was not set.')); + }, + _timeoutBuffer: 400, + get timeoutBuffer() { + return this._timeoutBuffer; + }, + set timeoutBuffer(e) { + this._timeoutBuffer = e; + }, + _disableAjaxTimeout: false, + get disableAjaxTimeout() { + return this._disableAjaxTimeout; + }, + set disableAjaxTimeout(e) { + this._disableAjaxTimeout = e; + }, + _auctionOptions: {}, + get auctionOptions() { + return this._auctionOptions; + }, + set auctionOptions(e) { + (function (e) { + if (!d.isPlainObject(e)) { + return d.logWarn('Auction Options must be an object'), !1; + } + for (var t = 0, r = Object.keys(e); t < r.length; t++) { + var n = r[t]; + if ('secondaryBidders' !== n) { + return d.logWarn('Auction Options given an incorrect param: '.concat(n)), !1; + } + if ('secondaryBidders' === n) { + if (!d.isArray(e[n])) { + return d.logWarn('Auction Options '.concat(n, ' must be of type Array')), !1; + } + if (!e[n].every(d.isStr)) { + return d.logWarn('Auction Options '.concat(n, ' must be only string')), !1; + } + } + } + return !0; + }(e) && (this._auctionOptions = e)); + } + }; + function a(e) { + return (0, i.default)(Object.keys(m), function (t) { + return e === m[t]; + }); + } + function s(e) { + if (!e) { + return d.logError('Prebid Error: no value passed to `setPriceGranularity()`'), !1; + } + if ('string' == typeof e) { + a(e) || d.logWarn('Prebid Warning: setPriceGranularity was called with invalid setting, using `medium` as default.'); + } else if (d.isPlainObject(e) && !(0, n.isValidPriceConfig)(e)) { + return d.logError('Invalid custom price value passed to `setPriceGranularity()`'), !1; + } + return !0; + } + t && h(Object.keys(t).reduce(function (e, r) { + return t[r] !== o[r] && (e[r] = o[r] || {}), e; + }, {})), t = o, r = {}; + } + function b() { + if (l && r && d.isPlainObject(r[l])) { + var e = r[l], n = new Set(Object.keys(t).concat(Object.keys(e))); + return c(n).reduce(function (r, n) { + return void 0 === e[n] ? r[n] = t[n] : void 0 === t[n] ? r[n] = e[n] : d.isPlainObject(e[n]) ? r[n] = (0, a.mergeDeep)({}, t[n], e[n]) : r[n] = e[n], r; + }, {}); + } + return u({}, t); + } + function y(e, t) { + var r = t; + if ('string' != typeof e && (r = e, e = '*'), 'function' == typeof r) { + var n = { + topic: e, + callback: r + }; + return s.push(n), function () { + s.splice(s.indexOf(n), 1); + }; + } + d.logError('listener must be a function'); + } + function h(e) { + var t = Object.keys(e); + s.filter(function (e) { + return (0, o.default)(t, e.topic); + }).forEach(function (t) { + var r, n, i; + t.callback((r = {}, n = t.topic, i = e[t.topic], n in r ? Object.defineProperty(r, n, { + value: i, + enumerable: !0, + configurable: !0, + writable: !0 + }) : r[n] = i, r)); + }), s.filter(function (e) { + return '*' === e.topic; + }).forEach(function (t) { + return t.callback(e); + }); + } + function S(e, t) { + l = e; + try { + return t(); + } finally { + l = null; + } + } + return v(), { + getCurrentBidder: function () { + return l; + }, + getConfig: function () { + if (arguments.length <= 1 && 'function' != typeof (arguments.length <= 0 ? void 0 : arguments[0])) { + var e = arguments.length <= 0 ? void 0 : arguments[0]; + return e ? d.deepAccess(b(), e) : b(); + } + return y.apply(void 0, arguments); + }, + setConfig: function (r) { + if (d.isPlainObject(r)) { + var n = Object.keys(r), i = {}; + n.forEach(function (n) { + var o = r[n]; + d.isPlainObject(e[n]) && d.isPlainObject(o) && (o = u({}, e[n], o)), i[n] = t[n] = o; + }), h(i); + } else { + d.logError('setConfig options must be an object'); + } + }, + setDefaults: function (r) { + d.isPlainObject(e) ? (u(e, r), u(t, r)) : d.logError('defaults must be an object'); + }, + resetConfig: v, + runWithBidder: S, + callbackWithBidder: function (e) { + return function (t) { + return function () { + if ('function' == typeof t) { + for (var r, n = arguments.length, i = new Array(n), o = 0; o < n; o++) { + i[o] = arguments[o]; + } + return S(e, (r = d.bind).call.apply(r, [ + t, + this + ].concat(i))); + } + d.logWarn('config.callbackWithBidder callback is not a function'); + }; + }; + }, + setBidderConfig: function (e) { + try { + !function (e) { + if (!d.isPlainObject(e)) { + throw 'setBidderConfig bidder options must be an object'; + } + if (!Array.isArray(e.bidders) || !e.bidders.length) { + throw 'setBidderConfig bidder options must contain a bidders list with at least 1 bidder'; + } + if (!d.isPlainObject(e.config)) { + throw 'setBidderConfig bidder options must contain a config object'; + } + }(e), e.bidders.forEach(function (t) { + r[t] || (r[t] = {}), Object.keys(e.config).forEach(function (n) { + var i = e.config[n]; + d.isPlainObject(i) ? r[t][n] = u({}, r[t][n] || {}, i) : r[t][n] = i; + }); + }); + } catch (e) { + d.logError(e); + } + }, + getBidderConfig: function () { + return r; + } + }; + } + var b = v(); + t.config = b; + }, + function (e, t) { + e.exports = function (e) { + return 'object' == typeof e ? null !== e : 'function' == typeof e; + }; + }, + function (e, t) { + e.exports = function (e) { + try { + return !!e(); + } catch (e) { + return !0; + } + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.moduleManager = void 0, r(17), r(2), r(54), r(1), r(3), r(0), r(5), r(9); + var n = r(20), i = r(8), o = r(55), a = g(r(56)), s = g(r(189)), u = r(35), c = r(193), d = r(21), l = r(72), f = r(52), p = g(r(10)); + function g(e) { + return e && e.__esModule ? e : { default: e }; + } + function m(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function v(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? m(Object(r), !0).forEach(function (t) { + b(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : m(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function b(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var y = (0, i.logger)({ + name: 'moduleManager', + bgColor: '#FF9E1A', + textColor: '#FFF' + }), h = p.default.EVENTS, S = h.MODULE_DEREGISTERED, O = h.LOAD, _ = h.MODULE_REGISTERED, E = h.MODULE_INITIALIZED, I = h.INITIALIZE, w = p.default.QUERY_PARAMS.MOD_SUPPRESS, A = function () { + var e = (0, c.gateway)('moduleManager'), t = [], r = {}; + function i(s) { + var u = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], c = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; + if (c.queue) { + var d = c.queue.push || c.queue; + return d(function (e) { + i(s, u, (0, a.default)(c, ['queue'])), 'function' == typeof e && e(); + }), s; + } + if (c.gate && !e.isOpen(c.gate)) { + return e.onOpen(function () { + i(s, u, (0, a.default)(c, ['gate'])); + }, c.gate), y.logInfo('Delaying registration of module '.concat(s.name, ' for gateway ').concat(c.gate)), s; + } + var f = s.name; + if (u) { + return s.dependencies = u, h(u, s); + } + if (l.features.get([ + ''.concat(w, '.').concat(f), + ''.concat(w, '.all') + ])) { + return y.atVerbosity(2).logInfo('Module Supressed', f, s), s; + } + if (r[f] && r[f].isRegistered) { + r[f] && (s = r[f]); + } else { + r[f] = s, r[f].isRegistered = !0, r[f].index = r[f].index || Object.keys(r).length - 1, r[f].register && (0, o.makeSafe)(function () { + return r[f].register(); + }, y.atVerbosity(1).logError), y.atVerbosity(2).logInfo('Registering Module', f, r[f]), n.eventEmitter.emit([ + _, + ''.concat(s.name, '.').concat(_) + ], f, r[f]); + for (var p = 0; p < t.length; p++) { + var g = t[p]; + g(r[f], f); + } + } + return r[f]; + } + function p(e, n) { + for (var i = (0, s.default)(Object.values(r), ['index'], ['asc']), o = 0; o < i.length; o++) { + var a = r[i[o].name]; + a && e(a, a.name); + } + n && t.push(function (t, r) { + return !!t && e(t, r); + }); + } + function g(e, t) { + var r, n; + r = (0, u.cloneDeep)(t), n = r, p(function (e) { + if (e.bidRequest) { + var t = (0, u.cloneDeep)(n); + (0, o.makeSafe)(function () { + n = e.bidRequest(n); + }, y.atVerbosity(1).logError, function () { + n = t; + }); + } + }), e(t = n); + } + function m(e) { + var t = r[e]; + t.deregister && (0, o.makeSafe)(function () { + return t.deregister(); + }, y.atVerbosity(1).logError), n.eventEmitter.emit([ + S, + ''.concat(e, '.').concat(S) + ], e, t), r = (0, a.default)(r, [e]); + } + function b(e) { + return void 0 !== r[e]; + } + function h(e, t) { + e = e.constructor === Array ? e : [e]; + var r = function () { + return e.reduce(function (e, t) { + return e && b(t); + }, !0); + }; + return n.eventEmitter.on(S, function () { + r() || m(t.name); + }), r() ? i(t) : (n.eventEmitter.on(_, function () { + r() && i(t); + }), t); + } + return n.eventEmitter.on(I, function () { + p(function (e) { + e.initialize && (0, o.makeSafe)(function () { + return e.initialize(); + }, y.atVerbosity(1).logError), e.isInitialized = !0, n.eventEmitter.emit([ + E, + ''.concat(e.name, '.').concat(E) + ], e.name, e); + }, !0); + }), n.eventEmitter.on(O, function (e) { + f.headerBidderRequest.before(g); + }), d.exposureApi.expose({ + getRegisteredModules: function () { + return Object.keys(r); + } + }), { + register: i, + deregister: m, + isEnabled: b, + viaModule: function (e, t) { + var n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + b(e) ? t(v(v({}, r[e]), {}, { isEnabled: !0 })) : n && t({ isEnabled: !1 }); + }, + gateways: e, + apiReady: !0 + }; + }(); + t.moduleManager = A; + }, + function (e, t, r) { + var n = r(14); + n(n.S + n.F, 'Object', { assign: r(201) }); + }, + function (e, t, r) { + var n = r(23); + e.exports = function (e) { + if (!n(e)) { + throw TypeError(e + ' is not an object!'); + } + return e; + }; + }, + function (e, t, r) { + e.exports = !r(24)(function () { + return 7 != Object.defineProperty({}, 'a', { + get: function () { + return 7; + } + }).a; + }); + }, + function (e, t, r) { + 'use strict'; + var n; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = void 0; + var i = ((n = r(172)) && n.__esModule ? n : { default: n }).default; + t.default = i; + }, + function (e, t, r) { + 'use strict'; + var n, i = r(18), o = r(125)(0), a = r(41), s = r(78), u = r(201), c = r(326), d = r(23), l = r(97), f = r(97), p = !i.ActiveXObject && 'ActiveXObject' in i, g = s.getWeak, m = Object.isExtensible, v = c.ufstore, b = function (e) { + return function () { + return e(this, arguments.length > 0 ? arguments[0] : void 0); + }; + }, y = { + get: function (e) { + if (d(e)) { + var t = g(e); + return !0 === t ? v(l(this, 'WeakMap')).get(e) : t ? t[this._i] : void 0; + } + }, + set: function (e, t) { + return c.def(l(this, 'WeakMap'), e, t); + } + }, h = e.exports = r(204)('WeakMap', b, y, c, !0, !0); + f && p && (u((n = c.getConstructor(b, 'WeakMap')).prototype, y), s.NEED = !0, o([ + 'delete', + 'has', + 'get', + 'set' + ], function (e) { + var t = h.prototype, r = t[e]; + a(t, e, function (t, i) { + if (d(t) && !m(t)) { + this._f || (this._f = new n()); + var o = this._f[e](t, i); + return 'set' == e ? this : o; + } + return r.call(this, t, i); + }); + })); + }, + function (e, t, r) { + 'use strict'; + function n(e, t) { + if (!e || !Array.isArray(e)) { + throw new TypeError('In includes(arr, item) arr must be an array.'); + } + return 'function' == typeof e.includes ? e.includes(t) : e.indexOf(t) >= 0; + } + r.r(t), r.d(t, 'default', function () { + return n; + }); + }, + function (e, t, r) { + var n = r(27), i = r(157), o = r(89), a = Object.defineProperty; + t.f = r(28) ? Object.defineProperty : function (e, t, r) { + if (n(e), t = o(t, !0), n(r), i) { + try { + return a(e, t, r); + } catch (e) { + } + } + if ('get' in r || 'set' in r) { + throw TypeError('Accessors not supported!'); + } + return 'value' in r && (e[t] = r.value), e; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(27), i = r(47), o = r(38), a = r(69), s = r(134), u = r(108), c = Math.max, d = Math.min, l = Math.floor, f = /\$([$&`']|\d\d?|<[^>]*>)/g, p = /\$([$&`']|\d\d?)/g; + r(109)('replace', 2, function (e, t, r, g) { + return [ + function (n, i) { + var o = e(this), a = null == n ? void 0 : n[t]; + return void 0 !== a ? a.call(n, o, i) : r.call(String(o), n, i); + }, + function (e, t) { + var i = g(r, e, this, t); + if (i.done) { + return i.value; + } + var l = n(e), f = String(this), p = 'function' == typeof t; + p || (t = String(t)); + var v = l.global; + if (v) { + var b = l.unicode; + l.lastIndex = 0; + } + for (var y = [];;) { + var h = u(l, f); + if (null === h) { + break; + } + if (y.push(h), !v) { + break; + } + '' === String(h[0]) && (l.lastIndex = s(f, o(l.lastIndex), b)); + } + for (var S, O = '', _ = 0, E = 0; E < y.length; E++) { + h = y[E]; + for (var I = String(h[0]), w = c(d(a(h.index), f.length), 0), A = [], T = 1; T < h.length; T++) { + A.push(void 0 === (S = h[T]) ? S : String(S)); + } + var x = h.groups; + if (p) { + var C = [I].concat(A, w, f); + void 0 !== x && C.push(x); + var P = String(t.apply(void 0, C)); + } else { + P = m(I, f, w, A, x, t); + } + w >= _ && (O += f.slice(_, w) + P, _ = w + I.length); + } + return O + f.slice(_); + } + ]; + function m(e, t, n, o, a, s) { + var u = n + e.length, c = o.length, d = p; + return void 0 !== a && (a = i(a), d = f), r.call(s, d, function (r, i) { + var s; + switch (i.charAt(0)) { + case '$': + return '$'; + case '&': + return e; + case '`': + return t.slice(0, n); + case '\'': + return t.slice(u); + case '<': + s = a[i.slice(1, -1)]; + break; + default: + var d = +i; + if (0 === d) { + return r; + } + if (d > c) { + var f = l(d / 10); + return 0 === f ? r : f <= c ? void 0 === o[f - 1] ? i.charAt(1) : o[f - 1] + i.charAt(1) : r; + } + s = o[d - 1]; + } + return void 0 === s ? '' : s; + }); + } + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0; + return (0, i.default)(e, t, r); + }; + var n, i = (n = r(236)) && n.__esModule ? n : { default: n }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.cloneDeepProto = t.cloneDeep = t.cloneDeepCirc = void 0; + var n, i = (n = r(267)) && n.__esModule ? n : { default: n }; + var o = i.default; + t.cloneDeepCirc = o; + var a = i.default; + t.cloneDeep = a; + var s = i.default; + t.cloneDeepProto = s; + }, + function (e) { + e.exports = JSON.parse('{"JSON_MAPPING":{"PL_CODE":"code","PL_SIZE":"sizes","PL_BIDS":"bids","BD_BIDDER":"bidder","BD_ID":"paramsd","BD_PL_ID":"placementId","ADSERVER_TARGETING":"adserverTargeting","BD_SETTING_STANDARD":"standard"},"DEBUG_MODE":"pbjs_debug","STATUS":{"GOOD":1,"NO_BID":2},"CB":{"TYPE":{"ALL_BIDS_BACK":"allRequestedBidsBack","AD_UNIT_BIDS_BACK":"adUnitBidsBack","BID_WON":"bidWon","REQUEST_BIDS":"requestBids"}},"EVENTS":{"AUCTION_INIT":"auctionInit","AUCTION_END":"auctionEnd","BID_ADJUSTMENT":"bidAdjustment","BID_TIMEOUT":"bidTimeout","BID_REQUESTED":"bidRequested","BID_RESPONSE":"bidResponse","NO_BID":"noBid","BID_WON":"bidWon","BIDDER_DONE":"bidderDone","SET_TARGETING":"setTargeting","BEFORE_REQUEST_BIDS":"beforeRequestBids","REQUEST_BIDS":"requestBids","ADD_AD_UNITS":"addAdUnits","AD_RENDER_FAILED":"adRenderFailed","TCF2_ENFORCEMENT":"tcf2Enforcement","AUCTION_DEBUG":"auctionDebug","BID_VIEWABLE":"bidViewable"},"AD_RENDER_FAILED_REASON":{"PREVENT_WRITING_ON_MAIN_DOCUMENT":"preventWritingOnMainDocument","NO_AD":"noAd","EXCEPTION":"exception","CANNOT_FIND_AD":"cannotFindAd","MISSING_DOC_OR_ADID":"missingDocOrAdid"},"EVENT_ID_PATHS":{"bidWon":"adUnitCode"},"GRANULARITY_OPTIONS":{"LOW":"low","MEDIUM":"medium","HIGH":"high","AUTO":"auto","DENSE":"dense","CUSTOM":"custom"},"TARGETING_KEYS":{"BIDDER":"hb_bidder","AD_ID":"hb_adid","PRICE_BUCKET":"hb_pb","SIZE":"hb_size","DEAL":"hb_deal","SOURCE":"hb_source","FORMAT":"hb_format","UUID":"hb_uuid","CACHE_ID":"hb_cache_id","CACHE_HOST":"hb_cache_host","ADOMAIN":"hb_adomain"},"DEFAULT_TARGETING_KEYS":{"BIDDER":"hb_bidder","AD_ID":"hb_adid","PRICE_BUCKET":"hb_pb","SIZE":"hb_size","DEAL":"hb_deal","SOURCE":"hb_source","FORMAT":"hb_format","UUID":"hb_uuid","CACHE_ID":"hb_cache_id","CACHE_HOST":"hb_cache_host"},"NATIVE_KEYS":{"title":"hb_native_title","body":"hb_native_body","body2":"hb_native_body2","privacyLink":"hb_native_privacy","privacyIcon":"hb_native_privicon","sponsoredBy":"hb_native_brand","image":"hb_native_image","icon":"hb_native_icon","clickUrl":"hb_native_linkurl","displayUrl":"hb_native_displayurl","cta":"hb_native_cta","rating":"hb_native_rating","address":"hb_native_address","downloads":"hb_native_downloads","likes":"hb_native_likes","phone":"hb_native_phone","price":"hb_native_price","salePrice":"hb_native_saleprice","rendererUrl":"hb_renderer_url","adTemplate":"hb_adTemplate"},"S2S":{"SRC":"s2s","DEFAULT_ENDPOINT":"https://prebid.adnxs.com/pbs/v1/openrtb2/auction","SYNCED_BIDDERS_KEY":"pbjsSyncs"},"BID_STATUS":{"BID_TARGETING_SET":"targetingSet","RENDERED":"rendered","BID_REJECTED":"bidRejected"}}'); + }, + function (e, t, r) { + 'use strict'; + function n(e, t) { + if (!e || !Array.isArray(e)) { + throw new TypeError('In find(arr, callback) arr must be an array.'); + } + if ('function' != typeof t) { + throw new TypeError('In find(arr, callback) callback must be a function.'); + } + if ('function' == typeof e.find) { + return e.find(t); + } + for (let r = 0; r < e.length; r++) { + const n = e[r]; + if (t(n, r)) { + return n; + } + } + } + r.r(t), r.d(t, 'default', function () { + return n; + }); + }, + function (e, t, r) { + var n = r(69), i = Math.min; + e.exports = function (e) { + return e > 0 ? i(n(e), 9007199254740991) : 0; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.hookedFn = void 0; + var n, i = (n = r(264)) && n.__esModule ? n : { default: n }, o = r(12); + var a = (0, i.default)({ useProxy: void 0 !== (0, o.dom)().window.Proxy }); + t.hookedFn = a; + }, + function (e, t, r) { + 'use strict'; + var n = r(18), i = r(50), o = r(67), a = r(147), s = r(89), u = r(24), c = r(66).f, d = r(90).f, l = r(32).f, f = r(316).trim, p = n.Number, g = p, m = p.prototype, v = 'Number' == o(r(80)(m)), b = 'trim' in String.prototype, y = function (e) { + var t = s(e, !1); + if ('string' == typeof t && t.length > 2) { + var r, n, i, o = (t = b ? t.trim() : f(t, 3)).charCodeAt(0); + if (43 === o || 45 === o) { + if (88 === (r = t.charCodeAt(2)) || 120 === r) { + return NaN; + } + } else if (48 === o) { + switch (t.charCodeAt(1)) { + case 66: + case 98: + n = 2, i = 49; + break; + case 79: + case 111: + n = 8, i = 55; + break; + default: + return +t; + } + for (var a, u = t.slice(2), c = 0, d = u.length; c < d; c++) { + if ((a = u.charCodeAt(c)) < 48 || a > i) { + return NaN; + } + } + return parseInt(u, n); + } + } + return +t; + }; + if (!p(' 0o1') || !p('0b1') || p('+0x1')) { + p = function (e) { + var t = arguments.length < 1 ? 0 : e, r = this; + return r instanceof p && (v ? u(function () { + m.valueOf.call(r); + }) : 'Number' != o(r)) ? a(new g(y(t)), r, p) : y(t); + }; + for (var h, S = r(28) ? c(g) : 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'.split(','), O = 0; S.length > O; O++) { + i(g, h = S[O]) && !i(p, h) && l(p, h, d(g, h)); + } + p.prototype = m, m.constructor = p, r(41)(n, 'Number', p); + } + }, + function (e, t, r) { + var n = r(18), i = r(46), o = r(50), a = r(63)('src'), s = r(226), u = ('' + s).split('toString'); + r(62).inspectSource = function (e) { + return s.call(e); + }, (e.exports = function (e, t, r, s) { + var c = 'function' == typeof r; + c && (o(r, 'name') || i(r, 'name', t)), e[t] !== r && (c && (o(r, a) || i(r, a, e[t] ? '' + e[t] : u.join(String(t)))), e === n ? e[t] = r : s ? e[t] ? e[t] = r : i(e, t, r) : (delete e[t], i(e, t, r))); + })(Function.prototype, 'toString', function () { + return 'function' == typeof this && this[a] || s.call(this); + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.errorReporting = void 0; + var n = r(20), i = r(35), o = r(21), a = r(72), s = r(200), u = r(15), c = r(122), d = r(210), l = g(r(10)), f = g(r(51)), p = r(8); + function g(e) { + return e && e.__esModule ? e : { default: e }; + } + var m = l.default.EVENTS.ERROR_REPORT, v = function () { + var e = !1, t = [], r = [], l = [], g = {}; + function v(n) { + var i = n; + try { + if (!i instanceof Error && (i = 'string' == typeof i ? new Error(i) : new Error(JSON.stringify(i))), !e) { + return void l.push(i); + } + (i = JSON.parse(JSON.stringify(i, f.default))).level || (i.level = 'error'), r.push(i), t.push(i); + } catch (e) { + p.bbLogger.logError('Failure to report error.'); + } + } + return o.exposureApi.expose({ + getAllErrors: function () { + return (0, i.cloneDeep)(r); + }, + getQueuedErrors: function () { + return (0, i.cloneDeep)(l); + } + }), (0, u.getConfig)('errorReporting', function (e) { + g = e; + }), n.eventEmitter.on(m, function (e) { + return v(e); + }), { + setup: function () { + !function () { + if (e) { + return; + } + (a.features.get([ + 'forceRun.errorReporting', + 'forceRun.all' + ]) || (0, s.percentageShouldRun)(g.reportingPercentage)) && (setInterval(function () { + (0, s.percentageRunner)(a.features.get([ + 'forceRun.errorReporting', + 'forceRun.all' + ]) || g.reportingPercentage, function () { + var e = (0, d.chunk)(t, g.chunkSize); + if (0 !== e.length) { + for (var r in e) { + var n = { + cat: 'qMonyWr2w', + records: e[r] + }; + c.api.sendBeacon('log/client', n); + } + } + t = []; + }, !0); + }, g.reportInterval), e = !0, function () { + for (var e = 0; e < l.length; e++) { + v(l[e]); + } + }()); + }(); + }, + report: v + }; + }(); + t.errorReporting = v; + }, + function (e, t, r) { + 'use strict'; + var n = r(27), i = r(38), o = r(134), a = r(108); + r(109)('match', 1, function (e, t, r, s) { + return [ + function (r) { + var n = e(this), i = null == r ? void 0 : r[t]; + return void 0 !== i ? i.call(r, n) : new RegExp(r)[t](String(n)); + }, + function (e) { + var t = s(r, e, this); + if (t.done) { + return t.value; + } + var u = n(e), c = String(this); + if (!u.global) { + return a(u, c); + } + var d = u.unicode; + u.lastIndex = 0; + for (var l, f = [], p = 0; null !== (l = a(u, c));) { + var g = String(l[0]); + f[p] = g, '' === g && (u.lastIndex = o(c, i(u.lastIndex), d)), p++; + } + return 0 === p ? null : f; + } + ]; + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.clearUnits = function () { + t.rawUnits = O = {}, t.unitRegistry = _ = {}, t.unitTemplates = E = {}; + }, t.setupUnits = function (e) { + var r = e; + Array.isArray(r) && (r = (0, n.default)(e, 'code')); + t.unitRegistry = _ = r, t.unitTemplates = E = (0, p.cloneDeep)(_), t.rawUnits = O = (0, p.cloneDeep)(_); + }, t.mergeUnits = function (e) { + var r = (0, n.default)(e, 'code'); + t.unitRegistry = _ = (0, i.default)(r, _), t.unitTemplates = E = (0, p.cloneDeep)(_), t.rawUnits = O = (0, p.cloneDeep)(_); + }, t.getRawUnits = I, t.getUnits = w, t.getUnitTemplates = A, t.getUnitCodes = function (e) { + for (var t = [], r = 0; r < e.length; r++) { + var n = e[r]; + if (Array.isArray(n) && null === n[1]) { + t.push(n[0]); + } else if (Array.isArray(n)) { + var i = (0, l.getConfig)('generateIncrementalUnitCode'); + t.push(i(n[0], n[1])); + } else { + 'string' == typeof n ? t.push(n) : 'object' === b(n) && t.push(n.code); + } + } + return t; + }, t.getSizes = R, t.setOutOfPage = k, t.isLazyLoaded = M, t.displayUnit = t.setSizeMappings = t.setCollapse = t.setLazyLoad = t.getUnitCollection = t.updateUnit = t.defineUnit = t.postProcessUnit = t.unitTemplates = t.unitRegistry = t.rawUnits = void 0, r(4), r(17), r(2), r(54), r(1), r(3), r(0), r(5), r(199); + var n = v(r(149)), i = v(r(29)), o = v(r(150)), a = v(r(190)), s = r(8), u = r(12), c = r(39), d = r(309), l = r(15), f = r(21), p = r(35), g = v(r(10)), m = r(42); + function v(e) { + return e && e.__esModule ? e : { default: e }; + } + function b(e) { + return (b = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function y(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function h(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? y(Object(r), !0).forEach(function (t) { + S(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : y(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function S(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var O = {}; + t.rawUnits = O; + var _ = {}; + t.unitRegistry = _; + var E = {}; + function I() { + return O; + } + function w() { + return _; + } + function A() { + return E; + } + t.unitTemplates = E; + var T = (0, c.hookedFn)('sync', function (e, t) { + return e.isLazyLoaded = function () { + return M(e.code); + }, e.getSizes = function () { + return R(e.code); + }, e.element = (0, u.dom)().window.document.getElementById(e.code), e; + }); + t.postProcessUnit = T; + var x = (0, c.hookedFn)('sync', function (e, t) { + return _[e.code] = e, _[e.code]; + }); + t.defineUnit = x; + var C = (0, c.hookedFn)('sync', function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, r = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; + if (Array.isArray(e)) { + for (var n = 0; n < e.length; n++) { + var i = e[n]; + C(i, t); + } + } else if ('string' == typeof e && !_[e] || 'string' != typeof e && !_[e]) { + s.bbLogger.logError('Attempting to update unit that does not exist', e, t); + var o = new Error('Attempting to update unit that does not exist.'); + m.errorReporting.report(o); + } else { + t || 'string' == typeof e ? 'string' == typeof e && t && (_[e] = h(h({}, _[e]), t), r && (E[e] = h(h({}, E[e]), t))) : (_[e.code] = h(h({}, _[e.code]), e), r && (E[e.code] = h(h({}, E[e.code]), e))); + } + }); + t.updateUnit = C; + var P = (0, c.hookedFn)('sync', function (e) { + return Array.isArray(e) ? e.reduce(function (t, r, n) { + var a = r; + if (null == r) { + s.bbLogger.logError('SKIPPING UNIT: Unit designation is null or undefined at index', n, 'provided:', e); + var u = new Error('SKIPPING UNIT: Unit designation is null or undefined at index '.concat(n, ' provided: ').concat(e, '.')); + return m.errorReporting.report(u), t; + } + var c = null; + if ('object' === b(r) && r.constructor !== Array ? c = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; + return e.orderIndex = t, e.originalCode = e.originalCode || e.code, e; + }(r, n) : r.constructor === Array ? c = null === r[1] ? j(r[0], n, r[2], r[3]) : function (e, t, r) { + var n = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, a = arguments.length > 4 && void 0 !== arguments[4] ? arguments[4] : {}, u = Array.isArray(t) ? e + (t[0] || '') : e + t, c = (0, l.getConfig)(); + c.generateVideoUnitCode && E[e] && E[e].isVideo ? u = c.generateVideoUnitCode(e, t, E[e]) : E[e] && !E[e].incremental && E[e].isVideo ? u = e : c.generateIncrementalUnitCode && (u = c.generateIncrementalUnitCode(e, t, E[e])); + var d = null; + d = _[u] ? _[u] : !(!E[e] || !E[e].incremental && !E[e].isVideo) && (0, p.cloneDeep)(E[e]); + if (d) { + if (d.code = u, null === t || Array.isArray(t) ? null !== t && Array.isArray(t) && 2 === t.length && (d.index = t[0], d.sequenceIndex = t[1]) : (d.index = t, d.isVideo && (d.sequenceIndex = 1)), d.orderIndex = r, d.originalCode = e, n && (d.targeting = (0, i.default)({}, n, d.targeting)), a) { + var f = (0, o.default)(a, g.default.UNIT_CONFIG_ALLOWED_MODIFIERS); + d = (0, i.default)({}, f, d); + } + } else { + s.bbLogger.atVerbosity(2).logError('Unit Template for', e, 'does not exist or is configured improperly(not incremental?). Skipping definition.'); + var v = new Error('Unit Template for\' '.concat(e, ' does not exist or is configured improperly(not incremental?). Skipping definition.')); + m.errorReporting.report(v); + } + return d; + }(r[0], r[1], n, r[2], r[3]) : 'string' == typeof r && (c = j(r, n)), (c = c ? T(c, r) : c) && (!t.flags[c.code] || c.isVideo)) { + if (c.getDesignation = function () { + return a; + }, t.flags[c.code] = !0, (0, d.unitHasElement)(c) || M(c)) { + t.units.push(x(c, r)); + } else { + s.bbLogger.logError(c.code, ': Unit designation does not have an element. If you are lazy loading, this unit is not configured for lazy loading.', c); + var f = new Error(''.concat(c.code, ' : Unit designation does not have an element. If you are lazy loading, this unit is not configured for lazy loading.')); + m.errorReporting.report(f); + } + } + return t; + }, { + flags: {}, + units: [] + }).units : P([e]); + }); + function j(e, t, r, n) { + var a = _[e]; + if (a) { + if (a.orderIndex = t, a.originalCode = a.originalCode || e, r && (a.targeting = (0, i.default)({}, r, a.targeting)), n) { + var u = (0, o.default)(n, g.default.UNIT_CONFIG_ALLOWED_MODIFIERS); + a = (0, i.default)(a, u); + } + } else { + s.bbLogger.atVerbosity(2).logError('Unit', e, 'does not exist. Skipping definition.'); + var c = new Error('Unit '.concat(e, ' does not exist. Skipping definition.')); + m.errorReporting.report(c); + } + return a; + } + function R(e) { + var t = 'string' == typeof e ? _[e] : e; + if (!t.sizeMappings) { + return t.sizes; + } + if (t.mappedSizes) { + return t.mappedSizes; + } + for (var r = (0, a.default)(t.sizeMappings, [ + function (e) { + return -1 * e.viewport[0]; + }, + function (e) { + return -1 * e.viewport[1]; + } + ]), n = 0; n < r.length; n++) { + var i = r[n]; + if ((0, u.dom)().window.innerWidth >= i.viewport[0] && i.viewport[1] <= (0, u.dom)().window.innerHeight) { + return t.mappedSizes = i.sizes, i.sizes; + } + } + return s.bbLogger.atVerbosity(3).logWarn('No matching mappings found for viewport', t.code, r), t.sizes; + } + t.getUnitCollection = P; + var D = (0, c.hookedFn)('sync', function () { + var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + t && 0 !== t.length || (t = Object.keys(_)); + var n = { lazyLoad: e }; + e && (n = { + cache: e, + lazyLoad: e + }), C(t, n, r); + }); + function k(e) { + C(e, { outOfPage: !0 }, !0); + } + t.setLazyLoad = D; + var N = (0, c.hookedFn)('sync', function (e, t) { + return C(e, { collapseEmptyDiv: t }, !0), { + unitCodes: e, + arg: t + }; + }); + function M(e) { + var t = 'object' === b(e) ? e : w()[e]; + if (!t) { + return !1; + } + var r = void 0 === t.lazyLoad ? t.cache : t.lazyLoad; + if (r) { + var n = (0, u.dom)().window.document.getElementById(t.code); + if (n && n.style && 'none' === n.style.display) { + return s.bbLogger.logMessage(''.concat(t.code, ': Cannot lazy load ad units where the element has a style of display:none;. This unit will evaluate as \'not lazy loaded\' until it does not have a style of display: none;')), !1; + } + } + return r; + } + t.setCollapse = N; + var U = (0, c.hookedFn)('sync', function (e, t) { + C(e, { sizeMappings: t }, !0); + }); + t.setSizeMappings = U; + var B = (0, c.hookedFn)('sync', function (e) { + e.constructor === Array && (s.bbLogger.atVerbosity(3).logInfo('Displaying units', e), e.forEach(B)); + }); + t.displayUnit = B, f.exposureApi.rootScope({ + setOutOfPage: k, + setLazyLoad: D, + isLazyLoaded: M, + setCollapse: N, + getSizes: R, + setSizeMappings: U, + getUnitCollection: P + }), f.exposureApi.rootScopeGetters({ + unitRegistry: function () { + return w(); + }, + adUnitsObj: function () { + return w(); + }, + adUnits: function () { + return Object.values(w()); + }, + unitTemplates: function () { + return A(); + }, + UNITS: function () { + return I(); + } + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.ADPOD = t.BANNER = t.VIDEO = t.NATIVE = void 0; + t.NATIVE = 'native'; + t.VIDEO = 'video'; + t.BANNER = 'banner'; + t.ADPOD = 'adpod'; + }, + function (e, t, r) { + var n = r(32), i = r(77); + e.exports = r(28) ? function (e, t, r) { + return n.f(e, t, i(1, r)); + } : function (e, t, r) { + return e[t] = r, e; + }; + }, + function (e, t, r) { + var n = r(68); + e.exports = function (e) { + return Object(n(e)); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e) { + return [ + Object, + Array + ].includes((e || {}).constructor) && !Object.entries(e || {}).length; + }, r(1), r(3), r(0), r(233), r(234), r(235); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.registerBidder = function (e) { + var t = Array.isArray(e.supportedMediaTypes) ? { supportedMediaTypes: e.supportedMediaTypes } : void 0; + function r(e) { + var r = I(e); + i.default.registerBidAdapter(r, e.code, t); + } + r(e), Array.isArray(e.aliases) && e.aliases.forEach(function (t) { + var n, o, a = t; + (0, g.isPlainObject)(t) && (a = t.code, n = t.gvlid, o = t.skipPbsAliasing), i.default.aliasRegistry[a] = e.code, r(O({}, e, { + code: a, + gvlid: n, + skipPbsAliasing: o + })); + }); + }, t.newBidder = I, t.preloadBidderMappingFile = A, t.getIabSubCategory = function (e, t) { + var r = i.default.getBidAdapter(e); + if (r.getSpec().getMappingFileInfo) { + var n = r.getSpec().getMappingFileInfo(), o = n.localStorageKey ? n.localStorageKey : r.getBidderCode(), a = _.getDataFromLocalStorage(o); + if (a) { + try { + a = JSON.parse(a); + } catch (t) { + (0, g.logError)('Failed to parse '.concat(e, ' mapping data stored in local storage')); + } + return a.mapping[t] ? a.mapping[t] : null; + } + } + }, t.isValid = T, t.registerSyncInner = t.storage = void 0, r(6), r(13), r(9), r(11), r(4), r(2), r(26), r(1), r(3), r(0), r(5), r(16), r(219); + var n = b(r(213)), i = b(r(87)), o = r(22), a = r(154), s = r(126), u = r(88), c = r(156), d = b(r(36)), l = b(r(60)), f = b(r(31)), p = r(103), g = r(7), m = r(45), v = r(61); + function b(e) { + return e && e.__esModule ? e : { default: e }; + } + function y(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return h(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return h(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function h(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function S(e) { + return (S = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function O() { + return (O = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var _ = (0, r(75).getCoreStorageManager)('bidderFactory'); + t.storage = _; + var E = [ + 'requestId', + 'cpm', + 'ttl', + 'creativeId', + 'netRevenue', + 'currency' + ]; + function I(e) { + return O(new n.default(e.code), { + getSpec: function () { + return Object.freeze(e); + }, + registerSyncs: t, + callBids: function (n, i, o, s, u, c) { + if (Array.isArray(n.bids)) { + var f = {}, p = [], m = n.bids.filter(r); + if (0 !== m.length) { + var v = {}; + m.forEach(function (e) { + v[e.bidId] = e, e.adUnitCode || (e.adUnitCode = e.placementCode); + }); + var b = e.buildRequests(m, n); + if (b && 0 !== b.length) { + Array.isArray(b) || (b = [b]); + var y = (0, g.delayExecution)(c(h), b.length); + b.forEach(function (t) { + switch (t.method) { + case 'GET': + s(''.concat(t.url).concat(function (e) { + if (e) { + return '?'.concat('object' === S(e) ? (0, g.parseQueryStringParameters)(e) : e); + } + return ''; + }(t.data)), { + success: c(r), + error: o + }, void 0, O({ + method: 'GET', + withCredentials: !0 + }, t.options)); + break; + case 'POST': + s(t.url, { + success: c(r), + error: o + }, 'string' == typeof t.data ? t.data : JSON.stringify(t.data), O({ + method: 'POST', + contentType: 'text/plain', + withCredentials: !0 + }, t.options)); + break; + default: + (0, g.logWarn)('Skipping invalid request from '.concat(e.code, '. Request type ').concat(t.type, ' must be GET or POST')), y(); + } + function r(r, o) { + u(e.code); + try { + r = JSON.parse(r); + } catch (e) { + } + var s; + r = { + body: r, + headers: { get: o.getResponseHeader.bind(o) } + }, p.push(r); + try { + s = e.interpretResponse(r, t); + } catch (t) { + return (0, g.logError)('Bidder '.concat(e.code, ' failed to interpret the server\'s response. Continuing without bids'), null, t), void y(); + } + function c(t) { + var r = v[t.requestId]; + if (r) { + t.originalCpm = t.cpm, t.originalCurrency = t.currency, t.meta = t.meta || O({}, t[r.bidder]); + var o = O((0, a.createBid)(d.default.STATUS.GOOD, r), t); + !function (e, t) { + f[e] = !0, T(e, t, [n]) && i(e, t); + }(r.adUnitCode, o); + } else { + (0, g.logWarn)('Bidder '.concat(e.code, ' made bid for unknown request ID: ').concat(t.requestId, '. Ignoring.')); + } + } + s && ((0, g.isArray)(s) ? s.forEach(c) : c(s)), y(s); + } + function o(t) { + u(e.code), (0, g.logError)('Server call for '.concat(e.code, ' failed: ').concat(t, '. Continuing without bids.')), y(); + } + }); + } else { + h(); + } + } else { + h(); + } + } + function h() { + o(), l.default.emit(d.default.EVENTS.BIDDER_DONE, n), t(p, n.gdprConsent, n.uspConsent); + } + } + }); + function t(t, r, n) { + w(e, t, r, n); + } + function r(t) { + return !!e.isBidRequestValid(t) || ((0, g.logWarn)('Invalid bid sent to bidder '.concat(e.code, ': ').concat(JSON.stringify(t))), !1); + } + } + var w = (0, v.hook)('async', function (e, t, r, n) { + var a = o.config.getConfig('userSync.aliasSyncEnabled'); + if (e.getUserSyncs && (a || !i.default.aliasRegistry[e.code])) { + var u = o.config.getConfig('userSync.filterSettings'), c = e.getUserSyncs({ + iframeEnabled: !(!u || !u.iframe && !u.all), + pixelEnabled: !(!u || !u.image && !u.all) + }, t, r, n); + c && (Array.isArray(c) || (c = [c]), c.forEach(function (t) { + s.userSync.registerSync(t.type, e.code, t.url); + })); + } + }, 'registerSyncs'); + function A(e, t) { + if (!o.config.getConfig('adpod.brandCategoryExclusion')) { + return e.call(this, t); + } + t.filter(function (e) { + return (0, g.deepAccess)(e, 'mediaTypes.video.context') === m.ADPOD; + }).map(function (e) { + return e.bids.map(function (e) { + return e.bidder; + }); + }).reduce(g.flatten, []).filter(g.uniques).forEach(function (e) { + var t = i.default.getBidAdapter(e); + if (t.getSpec().getMappingFileInfo) { + var r = t.getSpec().getMappingFileInfo(), n = r.refreshInDays ? r.refreshInDays : 1, o = r.localStorageKey ? r.localStorageKey : t.getSpec().code, a = _.getDataFromLocalStorage(o); + try { + (!(a = a ? JSON.parse(a) : void 0) || (0, g.timestamp)() > a.lastUpdated + 24 * n * 60 * 60 * 1000) && (0, p.ajax)(r.url, { + success: function (t) { + try { + t = JSON.parse(t); + var r = { + lastUpdated: (0, g.timestamp)(), + mapping: t.mapping + }; + _.setDataInLocalStorage(o, JSON.stringify(r)); + } catch (t) { + (0, g.logError)('Failed to parse '.concat(e, ' bidder translation mapping file')); + } + }, + error: function () { + (0, g.logError)('Failed to load '.concat(e, ' bidder translation file')); + } + }); + } catch (t) { + (0, g.logError)('Failed to parse '.concat(e, ' bidder translation mapping file')); + } + } + }), e.call(this, t); + } + function T(e, t, r) { + function n(e) { + return 'Invalid bid from '.concat(t.bidderCode, '. Ignoring bid: ').concat(e); + } + return e ? t ? (i = Object.keys(t), E.every(function (e) { + return (0, f.default)(i, e) && !(0, f.default)([ + void 0, + null + ], t[e]); + }) ? 'native' !== t.mediaType || (0, u.nativeBidIsValid)(t, r) ? 'video' !== t.mediaType || (0, c.isValidVideoBid)(t, r) ? !('banner' === t.mediaType && !function (e, t, r) { + if ((t.width || 0 === parseInt(t.width, 10)) && (t.height || 0 === parseInt(t.height, 10))) { + return t.width = parseInt(t.width, 10), t.height = parseInt(t.height, 10), !0; + } + var n = (0, g.getBidderRequest)(r, t.bidderCode, e), i = n && n.bids && n.bids[0] && n.bids[0].sizes, o = (0, g.parseSizesInput)(i); + if (1 === o.length) { + var a = y(o[0].split('x'), 2), s = a[0], u = a[1]; + return t.width = parseInt(s, 10), t.height = parseInt(u, 10), !0; + } + return !1; + }(e, t, r)) || ((0, g.logError)(n('Banner bids require a width and height')), !1) : ((0, g.logError)(n('Video bid does not have required vastUrl or renderer property')), !1) : ((0, g.logError)(n('Native bid missing some required properties.')), !1) : ((0, g.logError)(n('Bidder '.concat(t.bidderCode, ' is missing required params. Check http://prebid.org/dev-docs/bidder-adapter-1.html for list of params.'))), !1)) : ((0, g.logWarn)('Some adapter tried to add an undefined bid for '.concat(e, '.')), !1) : ((0, g.logWarn)('No adUnitCode was supplied to addBidResponse.'), !1); + var i; + } + t.registerSyncInner = w, (0, v.getHook)('checkAdUnitSetup').before(A); + }, + function (e, t) { + var r = {}.hasOwnProperty; + e.exports = function (e, t) { + return r.call(e, t); + }; + }, + function (e, t, r) { + 'use strict'; + function n(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function i(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? n(Object(r), !0).forEach(function (t) { + o(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : n(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function o(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + if (t instanceof Error) { + return i(i({}, t), {}, { + name: t.name, + message: t.message, + stack: t.stack + }); + } + return t; + }, r(17), r(2), r(1), r(3), r(0), r(5), r(9); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getQueue = Y, t.setQueue = K, t.auctionAll = ie, t.isMobile = oe, t.instantiateBidBarrel = function (e, t) { + return ue.apply(this, arguments); + }, t.bootstrap = t.headerBidderRequest = t.getAds = t.processAdRequest = t.auction = t.adServerRequest = t.lazyLoad = t.chunkAuction = t.initialize = void 0, r(3), r(5), r(194), r(95), r(9), r(11), r(0), r(6), r(13), r(1), r(4), r(2); + var n = r(39), i = r(146), o = r(20), a = r(8), s = r(99), u = r(74), c = j(r(34)), d = j(r(29)), l = j(r(185)), f = r(15), p = r(44), g = r(59), m = r(12), v = r(21), b = r(35), y = r(122), h = j(r(149)); + r(211); + var S = r(42), O = j(r(51)), _ = j(r(148)), E = j(r(10)), I = r(73), w = j(r(151)), A = r(98), T = r(100), x = r(315), C = r(212), P = r(210); + function j(e) { + return e && e.__esModule ? e : { default: e }; + } + function R(e, t) { + if (null == e) { + return {}; + } + var r, n, i = function (e, t) { + if (null == e) { + return {}; + } + var r, n, i = {}, o = Object.keys(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || (i[r] = e[r]); + } + return i; + }(e, t); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || Object.prototype.propertyIsEnumerable.call(e, r) && (i[r] = e[r]); + } + } + return i; + } + function D(e, t, r, n, i, o, a) { + try { + var s = e[o](a), u = s.value; + } catch (e) { + return void r(e); + } + s.done ? t(u) : Promise.resolve(u).then(n, i); + } + function k(e) { + return function () { + var t = this, r = arguments; + return new Promise(function (n, i) { + var o = e.apply(t, r); + function a(e) { + D(o, n, i, a, s, 'next', e); + } + function s(e) { + D(o, n, i, a, s, 'throw', e); + } + a(void 0); + }); + }; + } + function N(e) { + return (N = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function M(e) { + return function (e) { + if (Array.isArray(e)) { + return U(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return U(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return U(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function U(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var B, L = E.default.EVENTS, z = L.LOAD, V = L.INSTANTIATED, F = L.INITIALIZE, q = L.BIDS_REQUESTED, G = L.BIDS_RETURNED, W = L.REFRESH, H = L.AUCTION; + function Y() { + return B; + } + function K(e) { + B = B ? (0, s.promiseQueue)('BidBarrel Primary Queue', [].concat(M(B.remainingItems), M(e))) : (0, s.promiseQueue)('BidBarrel Primary Queue', e); + } + var J = (0, n.hookedFn)('sync', function (e) { + e.queryTargeting && (e.targeting = (0, d.default)({}, e.targeting, { query: e.queryTargeting })); + var t = e; + t._initOverrides = (0, b.cloneDeep)(e), e.dfpPath && 'string' == typeof e.dfpPath && (t.dfpPath = e.dfpPath), (0, f.setConfigPublic)(t); + var r = (0, f.getConfig)(); + a.bbLogger.atVerbosity(1).logMessage('Initializing BidBarrel. Config:', r), ne(r.pageTargeting || r.siteTargeting), o.eventEmitter.emit(F), a.bbLogger.atVerbosity(4).logInfo('BidBarrel Initialized'); + }); + t.initialize = J; + var Q = function (e) { + var t = (0, f.getConfig)('lazyLoading.auction'); + if (!t.chunk) { + return e; + } + var r = (0, P.chunk)((0, C.elementSort)(e, (0, f.getConfig)('priorityAxis')), t.chunkSize); + if (r.length > 1) { + a.bbLogger.logInfo('Splitting auction call into multiple calls. Chunks:', r, 'Config:', t); + for (var n = {}, i = function (e) { + var i = r[e]; + if (t.lazy) { + var o = i[0].element, a = i[0].code; + n[a] = { + units: i, + element: o + }; + } else { + setTimeout(function () { + return ee(i); + }, 0); + } + }, o = 1; o < r.length; o++) { + i(o); + } + if (t.lazy) { + for (var s = { + rootMargin: t.offset.yAxis + 'px ' + t.offset.xAxis + 'px', + threshold: 0.01 * t.percentageVisible + }, u = new IntersectionObserver(function (e) { + for (var t = 0; t < e.length; t++) { + var r = e[t]; + if (r.intersectionRatio > 0) { + u.unobserve(r.target); + var i = r.target.id; + ee(n[i].units); + } + } + }, s), c = 1; c < r.length; c++) { + var d = r[c][0].element; + u.observe(d); + } + } + } + return r[0]; + }; + t.chunkAuction = Q; + var X = (0, n.hookedFn)('sync', function (e) { + if (e && e.length) { + try { + !function () { + var t = (0, f.getConfig)('lazyLoading.units') || (0, f.getConfig)('lazyLoading'), r = { + rootMargin: t.offset.yAxis + 'px ' + t.offset.xAxis + 'px', + threshold: 0.01 * t.percentageVisible + }; + a.bbLogger.logInfo('Setting up lazy loading for units', e); + var n = e.map(function (e) { + return (0, m.dom)().window.document.getElementById(e.code); + }), i = new IntersectionObserver(function (e) { + e.forEach(function (e) { + e.intersectionRatio > 0 && (i.unobserve(e.target), (0, g.setBidTargeting)([p.unitRegistry[e.target.id]]), o.eventEmitter.emit(''.concat(e.target.id, '.').concat(W), p.unitRegistry[e.target.id]), a.bbLogger.logInfo('Refreshing lazy loaded unit', p.unitRegistry[e.target.id]), delete p.unitRegistry[e.target.id].cancelLazyLoad, te([e.target.id])); + }); + }, r); + n.forEach(function (e) { + e && i.observe(e); + }); + for (var s = function (t) { + var r = e[t]; + p.unitRegistry[r.code].cancelLazyLoad = function () { + i.unobserve((0, m.dom)().window.document.getElementById(r.code)), p.unitRegistry[r.code].cancelLazyLoad && delete p.unitRegistry[r.code].cancelLazyLoad; + }; + }, u = 0; u < e.length; u++) { + s(u); + } + }(); + } catch (i) { + a.bbLogger.logError('Error encountered while attempting to lazy load', i); + var t = new Error('Error encountered while attempting to lazy load. '.concat(JSON.stringify(i, O.default))); + S.errorReporting.report(t); + for (var r = 0; r < e.length; r++) { + var n = e[r]; + o.eventEmitter.emit(''.concat(n.code, '.').concat(W), n); + } + (0, g.setBidTargeting)(e), te(e); + } + } + }); + t.lazyLoad = X; + var $ = (0, n.hookedFn)('sync', function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : function () { + return !1; + }; + if (!e || e.constructor !== Array || 0 === e.length) { + return a.bbLogger.atVerbosity(2).logWarn('Ad server request attempted with invalid units collection', e), void t(); + } + if ('string' == typeof e[0] || e[0].constructor === Array) { + a.bbLogger.logError('This function is meant for internal BidBarrel use only'); + var r = new Error('This function is meant for internal BidBarrel use only.'); + return S.errorReporting.report(r), void t(); + } + var n = e, s = n.filter(function (e) { + return !e.isLazyLoaded(); + }), u = n.filter(function (e) { + return e.isLazyLoaded(); + }); + (0, g.setBidTargeting)(s), o.eventEmitter.emit(W, s); + for (var c = 0; c < s.length; c++) { + var d = s[c]; + o.eventEmitter.emit(''.concat(d.code, '.').concat(W), d); + } + a.bbLogger.atVerbosity(1).logInfo('Refreshing units', s), te(s), X(u), i.requestManager.reset(), t(); + }); + t.adServerRequest = $; + var Z = (0, n.hookedFn)('sync', function (e) { + if (Array.isArray(e) && (e = Array.prototype.slice.call(e)), void 0 === e || -1 === [ + Array, + String, + Object + ].indexOf(e.constructor) || e.constructor === Array && 0 === e.length) { + a.bbLogger.logError('Invalid units array passed to BidBarrel.auction', e); + var t = new Error('Invalid units array passed to BidBarrel.auction.'); + S.errorReporting.report(t); + } else { + a.bbLogger.atVerbosity(1).logInfo('Invoking BidBarrel.auction', e); + var r = (0, p.getUnitCollection)(e); + if (0 !== r.length) { + (0, f.getConfig)('lazyLoading.auction.enabled') && (r = Q(r)), ee(r); + } else { + a.bbLogger.logError('No valid unit designations provided'); + var n = new Error('No valid unit designations provided.'); + S.errorReporting.report(n); + } + } + }); + t.auction = Z; + var ee = (0, n.hookedFn)('sync', function (e) { + for (var t = !1, r = 0; r < e.length; r++) { + var n = e[r]; + t = t || n.bids && n.bids.length > 0, n.cancelLazyLoad && (a.bbLogger.logInfo('Cancelling Lazy Load for unit', n), n.cancelLazyLoad()); + } + Y().push(function (r) { + if (a.bbLogger.atVerbosity(1).logInfo('Running auction in queue. Collection:', e), o.eventEmitter.emit(H, e), t) { + var n = !1, s = (0, f.getConfig)(), u = setTimeout(function () { + n = !0, a.bbLogger.atVerbosity(1).logInfo('Hit failsafe condition'), $(e, r); + }, s.timeouts.failsafe); + i.requestManager.enqueue(function () { + n || (clearTimeout(u), o.eventEmitter.emit(G, e), $(e, r)); + }); + try { + a.bbLogger.logInfo('Making header bidder request', e), re(e); + } catch (e) { + a.bbLogger.logError(e); + var c = new Error('Failed header bidder request. '.concat(JSON.stringify(e, O.default))); + S.errorReporting.report(c); + } + o.eventEmitter.emit(q, e); + } else { + a.bbLogger.atVerbosity(3).logInfo('Short-circuiting header bidding due to no bidders scenario'), $(e, r); + } + }); + }); + t.processAdRequest = ee; + var te = (0, n.hookedFn)('sync', function (e) { + return e; + }); + t.getAds = te; + var re = (0, n.hookedFn)('sync', function (e) { + return e; + }); + t.headerBidderRequest = re; + var ne = (0, n.hookedFn)('sync', function (e) { + var t = (0, f.getConfig)('bootstrap.renderScripts'); + if (t && t.length) { + for (var r = 0; r < t.length; r++) { + var n = t[r]; + (0, u.renderScript)(n); + } + } + (0, g.setInitialPageTargeting)(e); + }); + function ie() { + var e = [], t = (0, p.getUnits)(); + for (var r in t) { + if (Object.prototype.hasOwnProperty.call(t, r)) { + t[r].displayed && e.push(r); + } + } + Z(e); + } + function oe() { + var e = (0, f.getConfig)('dfpPathObj'); + return 'mobile' === e.device || 'm' === e.device; + } + function ae() { + 'object' === N(_.default.debug) ? ((0, a.setDefaultConfig)(_.default.debug), a.bbLogger.setLoggerConfig(_.default.debug)) : _.default.debug && (0, a.turnOnDebug)(), a.bbLogger.atVerbosity(1).logInfo('BidBarrel rv2.23.2 ( core ) Loaded'), o.eventEmitter.emit(z, BidBarrel); + } + function se() { + v.exposureApi.rootScope({ + auction: Z, + auctionAll: ie, + initialize: J, + isStagingEnv: A.isStagingEnv, + isMobile: oe, + getLogStack: a.getLogStack, + refresh: Z, + process: Z + }), v.exposureApi.deprecateMethods([ + 'adServerRequest', + 'bootstrap', + 'create', + 'enableGoogletagServices', + 'headerBidderRequest', + 'lazyLoad', + 'postProcessUnit', + 'setInitialPageTargeting', + 'setBidTargeting', + 'setGptTargeting' + ], 'v3.0.0'), v.exposureApi.rootScopeGetters({ + version: function () { + return 'rv2.23.2'; + }, + variant: function () { + return '$bidbarrel.variant'; + }, + queue: function () { + return Y(); + }, + created: function () { + return !0; + }, + apiReady: function () { + return !0; + }, + bidderTimeout: function () { + return (0, f.getConfig)('highFrequencyAdRequests') ? (0, f.getConfig)('timeouts.hfar') : (0, f.getConfig)('timeouts.bidder'); + } + }); + } + function ue() { + return (ue = k(regeneratorRuntime.mark(function e(t, r) { + var n, i, s, g, E, C, P, j, D, k, N = arguments; + return regeneratorRuntime.wrap(function (e) { + for (;;) { + switch (e.prev = e.next) { + case 0: + if ((0, c.default)((0, m.dom)().window, 'BidBarrel.created')) { + e.next = 38; + break; + } + return ae(), (0, a.debugOn)('true') && (t._static = { + global: (0, b.cloneDeep)(_.default), + site: (0, b.cloneDeep)(t) + }), n = 'metacritic-rv', i = (0, d.default)(t, _.default), s = (0, h.default)(r, 'code'), g = function (e, t) { + a.bbLogger.logWarn('Failed to Apply Remote Config ( '.concat(n, '/').concat(e, ' )'), t || {}); + }, e.prev = 7, e.next = 10, y.api.get(''.concat(n, '/').concat((0, A.getEnvVal)(), '/config/diff'), { + timeout: 3000, + query: { variant: 'core' } + }); + case 10: + E = e.sent, C = E.payload, E.success ? (a.bbLogger.logInfo('Applying Remote Config ( '.concat(n, '/').concat((0, A.getEnvVal)(), ' )'), C), P = C.units, j = R(C, ['units']), D = function (e, t) { + if (Array.isArray(e) && Array.isArray(t)) { + return t; + } + }, i = (0, l.default)(i, j, D), s = (0, l.default)(s, P, D), (0, a.debugOn)('true') && (i._remote = C)) : g((0, A.getEnvVal)(), E), e.next = 21; + break; + case 15: + e.prev = 15, e.t0 = e.catch(7), a.bbLogger.logError(e.t0), k = new Error('Failed to apply remote config. '.concat(JSON.stringify(e.t0, O.default))), S.errorReporting.report(k), g('undetected'); + case 21: + (0, f.setConfig)(i), I.storage.setup(), w.default.setup(), S.errorReporting.setup(), x.adIdentifier.setupListeners(), T.bidCache.setupListeners(), a.bbLogger.atVerbosity(1).logInfo('Instantiating Bid Barrel', N, (0, c.default)((0, m.dom)().window, 'BidBarrel.queue'), 'with config', (0, f.getConfig)()), K((0, c.default)((0, m.dom)().window, 'BidBarrel.queue') || []), se(), s && (0, p.setupUnits)(s), (0, f.getConfig)('oncreate.renderScripts') && (0, u.renderScript)((0, f.getConfig)('oncreate.renderScripts')), v.exposureApi.bindToWindow(), o.eventEmitter.emit(V, (0, m.dom)().window.BidBarrel), Y().run(), a.bbLogger.atVerbosity(4).logInfo('BidBarrel Instantiated'), e.next = 39; + break; + case 38: + a.bbLogger.atVerbosity(1).logWarn('BidBarrel attempted to be instantiated twice. This is usually caused by BidBarrel being included more than once on the page.'); + case 39: + case 'end': + return e.stop(); + } + } + }, e, null, [[ + 7, + 15 + ]]); + }))).apply(this, arguments); + } + t.bootstrap = ne; + }, + function (e, t, r) { + var n = r(65); + e.exports = function (e, t, r) { + if (n(e), void 0 === t) { + return e; + } + switch (r) { + case 1: + return function (r) { + return e.call(t, r); + }; + case 2: + return function (r, n) { + return e.call(t, r, n); + }; + case 3: + return function (r, n, i) { + return e.call(t, r, n, i); + }; + } + return function () { + return e.apply(t, arguments); + }; + }; + }, + function (e, t, r) { + var n = r(14), i = r(164)(!1); + n(n.S, 'Object', { + values: function (e) { + return i(e); + } + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.makeSafe = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : n.bbLogger.logError, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function () { + }; + try { + return e(); + } catch (e) { + return t(e), r(); + } + }; + var n = r(8); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + return (0, i.default)(e, t); + }; + var n, i = (n = r(265)) && n.__esModule ? n : { default: n }; + }, + function (e, t, r) { + var n = r(129), i = r(68); + e.exports = function (e) { + return n(i(e)); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.urlQueryAsObject = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : (0, n.dom)().window.location.href, t = ''; + if (i[e]) { + return i[e]; + } + t = JSON.stringify(e); + (e = e.substring(e.indexOf('?') + 1)).indexOf('#') >= 0 && (e = e.split('#')[0]); + var r, o = /([^&=]+)=?([^&]*)/g, a = /\+/g, s = function (e) { + return decodeURIComponent(e.replace(a, ' ')); + }, u = {}; + for (; r = o.exec(e);) { + var c = s(r[1]), d = s(r[2]); + '[]' === c.substring(c.length - 2) ? (c = c.substring(0, c.length - 2), (u[c] || (u[c] = [])).push(d)) : u[c] = d; + } + var l = function (e, t, r) { + for (var n = t.length - 1, i = 0; i < n; ++i) { + var o = t[i]; + '_proto_' !== o && '__proto__' !== o && (o in e || (e[o] = {}), e = e[o]); + } + e[t[n]] = r; + }; + for (var f in u) { + var p = f.split('['); + if (p.length > 1) { + var g = []; + p.forEach(function (e, t) { + var r = e.replace(/[?[\]\\ ]/g, ''); + g.push(r); + }), l(u, g, u[f]), delete u[f]; + } + } + '' !== t && (i[t] = u); + return u; + }, r(33), r(16); + var n = r(12), i = {}; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.resetQuery = function () { + _ = (0, a.urlQueryAsObject)(); + }, t.getPageTargeting = k, t.getVGuid = N, t.applyTargeting = Q, t.resetTargeting = Z, t.resetAllTargeting = ee, t.clearTargeting = te, t.setTargeting = re, t.clearUnitTargeting = t.clearPageTargeting = t.setPageTargeting = t.setUnitTargeting = t.setInitialPageTargeting = t.setBidTargeting = t.pageTargeting = void 0, r(4), r(2), r(33), r(16); + var n = r(15), i = r(8), o = r(12), a = r(58), s = h(r(29)), u = r(44), c = r(39), d = r(96), l = h(r(56)), f = r(21), p = r(73), g = h(r(310)), m = r(20), v = h(r(10)), b = h(r(209)), y = r(42); + function h(e) { + return e && e.__esModule ? e : { default: e }; + } + function S(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function O(e) { + return (O = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var _ = (0, a.urlQueryAsObject)(), E = !1, I = v.default.QUERY_PARAMS, w = I.AD_SESSION, A = I.AD_SUBSESSION, T = I.SESSION, x = I.SUBSESSION, C = I.FTAG, P = I.TTAG, j = I.TARGETING_PREFIX, R = v.default.EVENTS.AUCTION; + var D = (0, d.richObject)({}); + function k() { + return D.getValue.apply(D, arguments); + } + function N() { + return k('vguid'); + } + t.pageTargeting = D; + var M = (0, c.hookedFn)('sync', function (e) { + return i.bbLogger.logInfo('Setting Bid Targeting', e), e; + }); + t.setBidTargeting = M; + var U = !1, B = !0; + function L() { + U || (U = !0, (0, n.getConfig)('siteTargeting', function (e) { + B || re(e), B = !1; + }), (0, n.getConfig)('pageTargeting', function (e) { + B || re(e), B = !1; + })); + } + var z = (0, c.hookedFn)('sync', function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + re(X(Q(e, !1, t))), K(), L(); + }); + t.setInitialPageTargeting = z; + var V = (0, c.hookedFn)('sync', function (e, t, r) { + var n = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; + u.unitRegistry[e].targeting || (u.unitRegistry[e].targeting = {}), u.unitRegistry[e].targeting[t] = r, n && (u.unitTemplates[e].targeting || (u.unitTemplates[e].targeting = {}), u.unitTemplates[e].targeting[t] = r); + }); + t.setUnitTargeting = V; + var F = (0, c.hookedFn)('sync', function (e, t) { + D.setValue(e, t); + }); + t.setPageTargeting = F; + var q = (0, c.hookedFn)('sync', function (e) { + var t = D.getValue(), r = {}; + Array.isArray(e) && e.length > 0 && (r = (0, l.default)(t, e)), D.setValue('*', r, { forceUpdate: !0 }); + }); + t.clearPageTargeting = q; + var G, W, H = (0, c.hookedFn)('sync', function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : u.unitRegistry; + Array.isArray(t) && t.length > 0 ? r[e].targeting = (0, l.default)(u.unitRegistry[e].targeting, t) : r[e].targeting = {}; + }); + function Y(e, t) { + var r = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; + E = !0, t || (t = $({})); + var o = (0, n.getConfig)(), a = o.targeting.cookie.consolidate, u = o.targeting.cookie.keyMap, c = {}, d = p.storage.getCookie(u.surround || 'surround'), l = null; + if (d) { + l = d.split('|'), a && p.storage.deleteCookie(u.surround || 'surround'); + } else { + var f = [ + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z' + ].slice(0, o.targeting.seats.session), g = f[Math.floor(Math.random() * f.length)], m = Math.floor(Math.random() * o.targeting.seats.subsession) + 1; + l = [ + g, + m + ]; + } + for (var v = [ + p.storage.getCookie('browserSession'), + p.storage.getCookie('dailySession') + ], y = { + session: l[0], + subses: l[1] + }, h = [ + 'firstpg', + 'session', + 'subses', + 'ftag', + 'ttag' + ], S = 0; S < h.length; S++) { + var O = h[S]; + if (u[O]) { + var _ = p.storage.getCookie(u[O]); + _ && (y[O] = _, a && p.storage.deleteCookie(u[O])); + } + } + i.bbLogger.atVerbosity(2).logInfo('Handling autotargeting.', 'Query:', t, 'Publisher Provided:', e, 'Cookies:', y); + var I = v[0] ? v[0] : {}, w = v[1] ? v[1] : {}; + if (a ? c = { + firstpg: parseInt(t.firstpg || e.firstpg || w.firstpg || y.firstpg), + ttag: t.ttag || e.ttag || w.ttag || y.ttag, + ftag: t.ftag || e.ftag || w.ftag || y.ftag, + session: t.session || e.session || I.session || y.session, + subses: t.subses || e.subses || I.subses || y.subses, + pv: parseInt(t.pv || e.pv || w.pv || y.pv || 0) + } : (c = { + firstpg: parseInt(t.firstpg || e.firstpg || y.firstpg || w.firstpg), + pv: parseInt(t.pv || e.pv || y.pv || w.pv || 0), + session: t.session || e.session || y.session || I.session, + subses: t.subses || e.subses || y.subses || I.subses, + ttag: t.ttag || e.ttag || y.ttag || w.ttag, + ftag: t.ftag || e.ftag || y.ftag || w.ftag + }, p.storage.deleteCookie('browserSession'), p.storage.deleteCookie('dailySession')), void 0 === c.pv || e.pv || t.pv || !r || c.pv++, 0 !== c.firstpg && 1 !== c.firstpg && void 0 !== c.pv ? c.firstpg = 1 == c.pv ? '1' : '0' : 0 !== c.firstpg && 1 !== c.firstpg ? c.firstpg = 1 : 1 === c.firstpg && (c.firstpg = 0), a) { + var A = { + session: c.session, + subses: c.subses + }, T = { + firstpg: c.firstpg, + ttag: c.ttag, + ftag: c.ftag, + pv: c.pv + }; + (0, b.default)(v[0], A) || p.storage.setCookie('browserSession', A), (0, b.default)(v[1], T) || p.storage.setCookie('dailySession', T); + } else if (u.surround) { + var x = [ + c.session, + c.subses + ].join('|'); + d !== x && p.storage.setCookie(u.surround || 'surround', [ + c.session, + c.subses + ].join('|')); + } else { + c.session !== y.session && p.storage.setCookie(u.session || 'session', c.session), c.subses !== y.subses && p.storage.setCookie(u.subses || 'subses', c.subses); + } + return a || (c.ftag !== y.ftag && p.storage.setCookie(u.ftag || 'ftag', c.ftag), c.ttag !== y.ttag && p.storage.setCookie(u.ttag || 'ttag', c.ttag), c.firstpg !== y.firstpg && p.storage.setCookie(u.firstpg || 'firstpg', c.firstpg)), (0, s.default)({}, c, t, e); + } + function K() { + (0, n.getConfig)('targeting.auto') && !W && (W = (0, g.default)('object' === O((0, o.dom)().window.utag_data) && (0, o.dom)().window.utag_data.pageViewGuid ? 'utag_data.pageViewGuid' : function () { + return D.getValue('vguid'); + }), m.eventEmitter.on(R, function () { + return W.check(); + }), G = W.onChange(J, { skipInitialRun: !0 })); + } + function J(e) { + if ((0, n.getConfig)('targeting.auto')) { + var t = D.getValue('pv') || 0, r = parseInt(t) + 1; + i.bbLogger.logInfo('Incrementing PV targeting value to', r, 'New Page View Guid detected', e), F('pv', r), function () { + var e = k(), t = e.firstpg, r = e.ttag, i = e.ftag, o = e.pv; + if ((0, n.getConfig)('targeting.cookie.consolidate')) { + p.storage.setCookie('dailySession', { + firstpg: t, + ttag: r, + ftag: i, + pv: o + }); + } else { + var a = { + firstpg: t, + ttag: r, + ftag: i, + pv: o + }, s = (0, n.getConfig)('targeting.cookie.keyMap'); + for (var u in a) { + if (Object.prototype.hasOwnProperty.call(a, u)) { + var c = a[u]; + s[u] && p.storage.setCookie(s[u], c); + } + } + } + }(); + } + } + function Q(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], i = !(arguments.length > 3 && void 0 !== arguments[3]) || arguments[3], o = (0, n.getConfig)(), a = e || {}; + return a = !o.targeting.auto || E && !r ? $(a, t) : Y(a, t, i); + } + function X(e) { + if (!e.vguid && !N()) { + i.bbLogger.logError('No vguid provided! Please update your implementation to provide a vguid in initConfig.pageTargeting.vguid'); + var t = new Error('No vguid provided! Please update your implementation to provide a vguid in initConfig.pageTargeting.vguid.'); + y.errorReporting.report(t); + } + return e; + } + function $(e) { + var t, r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], i = r || (0, a.urlQueryAsObject)((0, o.dom)().window.location.href), s = (0, n.getConfig)('targeting.query.dynamicPrefix'), u = (0, n.getConfig)('targeting.query.keyMap'), c = (S(t = {}, w, 'session'), S(t, A, 'subses'), S(t, T, 'session'), S(t, x, 'subses'), S(t, C, 'ftag'), S(t, P, 'ttag'), t), d = e; + for (var l in i) { + if (Object.prototype.hasOwnProperty.call(i, l)) { + var f = i[l]; + s && l.indexOf(s) >= 0 && (d[l.replace(s, '')] = f), u[l] && (d[u[l]] = f), l.indexOf(j) >= 0 && (d[l.replace(j, '')] = f), c[l] && (d[c[l]] = f); + } + } + return d; + } + function Z(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], n = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; + if (e && 'object' === O(e) && e.constructor === Array) { + i.bbLogger.logError('The first argument of BidBarrel.resetTargeting should be an object or falsy'); + var o = new Error('The first argument of BidBarrel.resetTargeting should be an object or falsy.'); + y.errorReporting.report(o); + } else if (t && t.constructor !== Array) { + i.bbLogger.logError('The second argument of BidBarrel.resetTargeting should be an array or falsy value. Exiting.'); + var a = new Error('The second argument of BidBarrel.resetTargeting should be an array or falsy value. Exiting.'); + y.errorReporting.report(a); + } else if ('boolean' == typeof r || null == r) { + te([], t, n), t && 0 !== t.length ? re(e, t, n) : (E = !1, re(Q(e, !!r && _, !1, !1))); + } else { + i.bbLogger.logError('The third argument of BidBarrel.resetTargeting should be a boolean or falsy value. Exiting.'); + var s = new Error('The third argument of BidBarrel.resetTargeting should be a boolean or falsy value. Exiting.'); + y.errorReporting.report(s); + } + } + function ee(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], n = [], i = (0, u.getUnits)(); + for (var o in i) { + if (Object.prototype.hasOwnProperty.call(i, o)) { + var a = i[o]; + a.displayed && n.push(a.code); + } + } + te([], n, r), Z(e, [], t, r); + } + function te() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + if (t && t.length) { + i.bbLogger.atVerbosity(2).logInfo('Clearing targeting for slots', t, e); + for (var n = (0, u.getUnitCollection)(t), o = 0; o < n.length; o++) { + var a = n[o].code; + H(a, e), u.unitTemplates[a] && r && H(a, e, u.unitTemplates); + } + } else { + q(e), i.bbLogger.atVerbosity(2).logInfo('Clearing targeting for page', e || 'all values'); + } + } + function re(e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + if (e) { + if (t && t.length ? i.bbLogger.atVerbosity(2).logInfo('Applying targeting values', e, 'to units', t) : i.bbLogger.atVerbosity(2).logInfo('Applying targeting values', e, 'to page'), 'string' == typeof t && (t = [t]), t) { + for (var o = (0, u.getUnitCollection)(t), a = 0; a < o.length; a++) { + var s = o[a].code; + for (var c in e) { + if (Object.prototype.hasOwnProperty.call(e, c)) { + var d = e[c]; + null != d ? (V(s, c, d), r && V(s, c, d, u.unitTemplates)) : i.bbLogger.atVerbosity(3).logWarn('Targeting value is null or undefined for '.concat(s, ':').concat(c, '. This will result in the targeting value not being set.')); + } + } + } + } else { + var l = (0, n.getConfig)(); + for (var f in e) { + if (Object.prototype.hasOwnProperty.call(e, f)) { + var p = e[f]; + null != p ? F(f, p) : -1 !== [ + 'ftag', + 'ttag' + ].indexOf(f) && l.targeting.auto || i.bbLogger.atVerbosity(3).logWarn('Targeting value is null or undefined for '.concat(f, '. This will result in the targeting value not being set.')); + } + } + } + } + } + t.clearUnitTargeting = H, f.exposureApi.rootScope({ + setTargeting: re, + resetTargeting: Z, + resetAllTargeting: ee, + clearTargeting: te, + newPage: function () { + G(), J(); + } + }), f.exposureApi.rootScopeGetters({ + vguid: function () { + return N(); + }, + pageTargeting: function () { + return k(); + } + }); + }, + function (e, t, r) { + 'use strict'; + function n() { + return (n = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + r(26); + var i = r(7), o = r(36), a = Array.prototype.slice, s = Array.prototype.push, u = i._map(o.EVENTS, function (e) { + return e; + }), c = o.EVENT_ID_PATHS, d = []; + e.exports = function () { + var e = {}, t = {}; + function r(t, r) { + i.logMessage('Emitting event for: ' + t); + var n = r[0] || {}, o = n[c[t]], a = e[t] || { que: [] }, u = i._map(a, function (e, t) { + return t; + }), l = []; + d.push({ + eventType: t, + args: n, + id: o, + elapsedTime: i.getPerformanceNow() + }), o && i.contains(u, o) && s.apply(l, a[o].que), s.apply(l, a.que), i._each(l, function (e) { + if (e) { + try { + e.apply(null, r); + } catch (e) { + i.logError('Error executing handler:', 'events.js', e); + } + } + }); + } + return t.on = function (t, r, n) { + if (function (e) { + return i.contains(u, e); + }(t)) { + var o = e[t] || { que: [] }; + n ? (o[n] = o[n] || { que: [] }, o[n].que.push(r)) : o.que.push(r), e[t] = o; + } else { + i.logError('Wrong event name : ' + t + ' Valid event names :' + u); + } + }, t.emit = function (e) { + var t = a.call(arguments, 1); + r(e, t); + }, t.off = function (t, r, n) { + var o = e[t]; + i.isEmpty(o) || i.isEmpty(o.que) && i.isEmpty(o[n]) || n && (i.isEmpty(o[n]) || i.isEmpty(o[n].que)) || (n ? i._each(o[n].que, function (e) { + var t = o[n].que; + e === r && t.splice(t.indexOf(e), 1); + }) : i._each(o.que, function (e) { + var t = o.que; + e === r && t.splice(t.indexOf(e), 1); + }), e[t] = o); + }, t.get = function () { + return e; + }, t.getEvents = function () { + var e = []; + return i._each(d, function (t) { + var r = n({}, t); + e.push(r); + }), e; + }, t; + }(); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.setupBeforeHookFnOnce = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 15, n = e.getHooks({ hook: t }); + 0 === n.length && e.before(t, r); + }, t.module = function (e, t) { + a('async', function (e) { + e.forEach(function (e) { + return t.apply(void 0, function (e) { + if (Array.isArray(e)) { + return o(e); + } + }(r = e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(r) || function (e, t) { + if (e) { + if ('string' == typeof e) { + return o(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === r && e.constructor && (r = e.constructor.name), 'Map' === r || 'Set' === r ? Array.from(r) : 'Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? o(e, t) : void 0; + } + }(r) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }()); + var r; + }); + }, e)([]); + }, t.submodule = function (e) { + for (var t = arguments.length, r = new Array(t > 1 ? t - 1 : 0), n = 1; n < t; n++) { + r[n - 1] = arguments[n]; + } + s(e).before(function (e, t) { + t.push(r), e(t); + }); + }, t.getHook = t.hook = void 0, r(9), r(11), r(0), r(6), r(13), r(1), r(4), r(2); + var n, i = (n = r(339)) && n.__esModule ? n : { default: n }; + function o(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var a = (0, i.default)({ ready: i.default.SYNC | i.default.ASYNC | i.default.QUEUE }); + t.hook = a; + var s = a.get; + t.getHook = s; + }, + function (e, t) { + var r = e.exports = { version: '2.6.11' }; + 'number' == typeof __e && (__e = r); + }, + function (e, t) { + var r = 0, n = Math.random(); + e.exports = function (e) { + return 'Symbol('.concat(void 0 === e ? '' : e, ')_', (++r + n).toString(36)); + }; + }, + function (e, t) { + e.exports = !1; + }, + function (e, t) { + e.exports = function (e) { + if ('function' != typeof e) { + throw TypeError(e + ' is not a function!'); + } + return e; + }; + }, + function (e, t, r) { + var n = r(158), i = r(132).concat('length', 'prototype'); + t.f = Object.getOwnPropertyNames || function (e) { + return n(e, i); + }; + }, + function (e, t) { + var r = {}.toString; + e.exports = function (e) { + return r.call(e).slice(8, -1); + }; + }, + function (e, t) { + e.exports = function (e) { + if (null == e) { + throw TypeError('Can\'t call method on ' + e); + } + return e; + }; + }, + function (e, t) { + var r = Math.ceil, n = Math.floor; + e.exports = function (e) { + return isNaN(e = +e) ? 0 : (e > 0 ? n : r)(e); + }; + }, + function (e, t, r) { + var n = r(158), i = r(132); + e.exports = Object.keys || function (e) { + return n(e, i); + }; + }, + function (e, t) { + e.exports = function (e) { + var t = typeof e; + return null != e && ('object' == t || 'function' == t); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.features = void 0; + var n = r(58), i = r(8), o = r(281), a = d(r(34)), s = d(r(94)), u = r(35), c = r(21); + function d(e) { + return e && e.__esModule ? e : { default: e }; + } + var l = d(r(10)).default.QUERY_PARAMS, f = l.AD_SUPPRESS, p = l.BID_SUPPRESS, g = l.MOD_SUPPRESS, m = l.PERF_MEASURE, v = l.SIZE_SUPPRESS, b = l.FORCE_RUN, y = l.AD_REGION, h = l.AD_COUNTRY, S = (0, i.logger)({ + name: 'Features', + bgColor: '#eee', + textColor: '#DA4167' + }), O = { + adSuppress: f, + bidSuppress: p, + modSuppress: g, + sizeSuppress: v, + perfMeasure: m, + forceRun: b + }, _ = { + regionCode: y, + countryCode: h + }, E = function () { + var e = {}, t = (0, n.urlQueryAsObject)(); + function r(t, r) { + var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : e; + for (var i in r) { + if (Object.prototype.hasOwnProperty.call(r, i)) { + var o = r[i]; + (0, s.default)(n, ''.concat(t, '.').concat(i), o); + } + } + } + function i(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + if (t.constructor === Array) { + var n = t.map(function (e) { + return i(e, r); + }); + return r ? -1 === n.indexOf(!1) : n.indexOf(!0) >= 0; + } + var o = (0, a.default)(e, t) || !1; + return 'boolean' == typeof o && o; + } + return c.exposureApi.expose({ + getAllFeatures: function () { + return (0, u.cloneDeep)(e); + }, + getFeature: i + }), function () { + for (var n in O) { + if (Object.prototype.hasOwnProperty.call(O, n)) { + var i = O[n]; + t[i] && r(n, (0, o.stringFlags)(t[i]).results); + } + } + for (var a in _) { + if (Object.prototype.hasOwnProperty.call(_, a)) { + var u = _[a]; + t[u] && (0, s.default)(e, a, t[u]); + } + } + }(), S.atVerbosity(2).logInfo('Features on load', e), { + get: i, + getValue: function (t) { + return (0, a.default)(e, t) || null; + } + }; + }(); + t.features = E; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.storage = void 0; + var n = r(207), i = r(208), o = r(20), a = r(15), s = function () { + function e() { + n.localStorageEngine.setup(), i.cookieStorageEngine.setup(); + } + return { + setup: function () { + var t = (0, a.getConfig)('consent'); + void 0 === t || !0 === t ? e() : !1 === t && o.eventEmitter.on('consentChanged', function (t) { + t && e(); + }); + }, + getLocalStorage: n.localStorageEngine.getValue, + getLs: n.localStorageEngine.getValue, + setLocalStorage: n.localStorageEngine.setValue, + setLs: n.localStorageEngine.setValue, + deleteLs: n.localStorageEngine.deleteKey, + getCookie: i.cookieStorageEngine.getValue, + setCookie: i.cookieStorageEngine.setValue, + deleteCookie: i.cookieStorageEngine.deleteCookie, + raw: { + getCookie: i.cookieStorageEngine.raw.getValue, + setCookie: i.cookieStorageEngine.raw.setValue, + getLs: n.localStorageEngine.raw.getValue, + setLs: n.localStorageEngine.raw.setValue, + deleteFromLs: n.localStorageEngine.raw.deleteKey + } + }; + }(); + t.storage = s; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.renderScript = void 0; + var n, i = (n = r(56)) && n.__esModule ? n : { default: n }, o = r(39), a = r(8), s = r(12); + var u = a.bbLogger.atVerbosity(3).logInfo, c = (0, o.hookedFn)('sync', function (e) { + if (e.constructor !== Array) { + if (!((0, s.dom)().window.document.getElementById(e.id) || e.shouldRender && !e.shouldRender())) { + var t = { + attributes: (0, i.default)(e, [ + 'content', + 'parent', + 'shouldRender' + ]), + parent: e.parent, + content: e.content + }, r = ''; + e.src && (r = e.src.substring(e.src.lastIndexOf('/') + 1)), !e.src || (0, s.dom)().window.document.querySelector('script[src*=\'' + e.src + '\']') || (0, s.dom)().window.document.querySelector('script[src*=\'' + r + '\']') || (u('Rendering script via BidBarrel', e), function (e, t, r, n, i) { + var o, a = e.getElementsByTagName(t)[0], s = void 0 !== i && e.querySelector(i); + if (!r.id || !e.getElementById(r.id)) { + for (var u in ((o = e.createElement(t)).setAttribute('type', 'text/javascript'), r)) { + r.hasOwnProperty(u) && o.setAttribute(u, !0 === r[u] ? '' : r[u]); + } + n && (o.innerHTML = n), s ? s.append(o) : null !== s && a.parentNode.insertBefore(o, a); + } + }((0, s.dom)().window.document, 'script', t.attributes, t.content, t.parent)); + } + } else { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + c(o); + } + } + }); + t.renderScript = c; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.newStorageManager = l, t.getCoreStorageManager = function (e) { + return l({ + moduleName: e, + moduleType: 'core' + }); + }, t.getStorageManager = function (e, t) { + return l({ + gvlid: e, + moduleName: t + }); + }, t.resetData = function () { + t.storageCallbacks = d = []; + }, t.validateStorageEnforcement = t.storageCallbacks = void 0, r(33), r(16), r(43); + var i, o = r(61), a = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = u(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), s = (i = r(31)) && i.__esModule ? i : { default: i }; + function u() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return u = function () { + return e; + }, e; + } + var c = [ + 'core', + 'prebid-module' + ], d = []; + function l() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = e.gvlid, r = e.moduleName, n = e.moduleType; + function i(e) { + if ((0, s.default)(c, n)) { + return e({ valid: !0 }); + } + var i; + return f(t, r, { hasEnforcementHook: !1 }, function (t) { + if (t && t.hasEnforcementHook) { + i = e(t); + } else { + var r = { + hasEnforcementHook: !1, + valid: a.hasDeviceAccess() + }; + i = e(r); + } + }), i; + } + var o = function (e, t, r, n, o, a) { + var s = function (i) { + if (i && i.valid) { + var a = o && '' !== o ? ' ;domain='.concat(encodeURIComponent(o)) : '', s = r && '' !== r ? ' ;expires='.concat(r) : '', u = null != n && 'none' == n.toLowerCase() ? '; Secure' : ''; + document.cookie = ''.concat(e, '=').concat(encodeURIComponent(t)).concat(s, '; path=/').concat(a).concat(n ? '; SameSite='.concat(n) : '').concat(u); + } + }; + if (!a || 'function' != typeof a) { + return i(s); + } + d.push(function () { + var e = i(s); + a(e); + }); + }, u = function (e, t) { + var r = function (t) { + if (t && t.valid) { + var r = window.document.cookie.match('(^|;)\\s*' + e + '\\s*=\\s*([^;]*)\\s*(;|$)'); + return r ? decodeURIComponent(r[2]) : null; + } + return null; + }; + if (!t || 'function' != typeof t) { + return i(r); + } + d.push(function () { + var e = i(r); + t(e); + }); + }, l = function (e) { + var t = function (e) { + const $___old_ec6044a068257c5d = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_ec6044a068257c5d) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + if (e && e.valid) { + try { + return localStorage.setItem('prebid.cookieTest', '1'), '1' === localStorage.getItem('prebid.cookieTest'); + } catch (e) { + } + } + return !1; + }.apply(this, arguments); + } finally { + if ($___old_ec6044a068257c5d) + ({}.constructor.defineProperty(window, 'localStorage', $___old_ec6044a068257c5d)); + } + }; + if (!e || 'function' != typeof e) { + return i(t); + } + d.push(function () { + var r = i(t); + e(r); + }); + }, p = function (e) { + var t = function (e) { + return !(!e || !e.valid) && (!!a.checkCookieSupport() || (window.document.cookie = 'prebid.cookieTest', -1 !== window.document.cookie.indexOf('prebid.cookieTest'))); + }; + if (!e || 'function' != typeof e) { + return i(t); + } + d.push(function () { + var r = i(t); + e(r); + }); + }, g = function (e, t, r) { + var n = function (r) { + r && r.valid && b() && window.localStorage.setItem(e, t); + }; + if (!r || 'function' != typeof r) { + return i(n); + } + d.push(function () { + var e = i(n); + r(e); + }); + }, m = function (e, t) { + var r = function (t) { + const $___old_bc9661238156b06c = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_bc9661238156b06c) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + return t && t.valid && b() ? window.localStorage.getItem(e) : null; + }.apply(this, arguments); + } finally { + if ($___old_bc9661238156b06c) + ({}.constructor.defineProperty(window, 'localStorage', $___old_bc9661238156b06c)); + } + }; + if (!t || 'function' != typeof t) { + return i(r); + } + d.push(function () { + var e = i(r); + t(e); + }); + }, v = function (e, t) { + var r = function (t) { + t && t.valid && b() && window.localStorage.removeItem(e); + }; + if (!t || 'function' != typeof t) { + return i(r); + } + d.push(function () { + var e = i(r); + t(e); + }); + }, b = function (e) { + var t = function (e) { + const $___old_4e99f5932a700eb3 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_4e99f5932a700eb3) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + if (e && e.valid) { + try { + return !!window.localStorage; + } catch (e) { + a.logError('Local storage api disabled'); + } + } + return !1; + }.apply(this, arguments); + } finally { + if ($___old_4e99f5932a700eb3) + ({}.constructor.defineProperty(window, 'localStorage', $___old_4e99f5932a700eb3)); + } + }; + if (!e || 'function' != typeof e) { + return i(t); + } + d.push(function () { + var r = i(t); + e(r); + }); + }, y = function (e, t) { + var r = function (t) { + if (t && t.valid) { + var r = []; + if (a.hasDeviceAccess()) { + for (var n = document.cookie.split(';'); n.length;) { + var i = n.pop(), o = i.indexOf('='); + o = o < 0 ? i.length : o, decodeURIComponent(i.slice(0, o).replace(/^\s+/, '')).indexOf(e) >= 0 && r.push(decodeURIComponent(i.slice(o + 1))); + } + } + return r; + } + }; + if (!t || 'function' != typeof t) { + return i(r); + } + d.push(function () { + var e = i(r); + t(e); + }); + }; + return { + setCookie: o, + getCookie: u, + localStorageIsEnabled: l, + cookiesAreEnabled: p, + setDataInLocalStorage: g, + getDataFromLocalStorage: m, + removeDataFromLocalStorage: v, + hasLocalStorage: b, + findSimilarCookies: y + }; + } + t.storageCallbacks = d; + var f = (0, o.hook)('async', function (e, t, r, n) { + n(r); + }, 'validateStorageEnforcement'); + t.validateStorageEnforcement = f; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.Renderer = c, t.isRendererRequired = function (e) { + return !(!e || !e.url); + }, t.executeRenderer = function (e, t) { + e.render(t); + }; + var i, o = r(346), a = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = u(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), s = (i = r(37)) && i.__esModule ? i : { default: i }; + function u() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return u = function () { + return e; + }, e; + } + function c(e) { + var t = this, r = e.url, n = e.config, i = e.id, s = e.callback, u = e.loaded, c = e.adUnitCode; + this.url = r, this.config = n, this.handlers = {}, this.id = i, this.loaded = u, this.cmd = [], this.push = function (e) { + 'function' == typeof e ? t.loaded ? e.call() : t.cmd.push(e) : a.logError('Commands given to Renderer.push must be wrapped in a function'); + }, this.callback = s || function () { + t.loaded = !0, t.process(); + }, this.render = function () { + d(c) ? a.logWarn('External Js not loaded by Renderer since renderer url and callback is already defined on adUnit '.concat(c)) : (0, o.loadExternalScript)(r, 'outstream', this.callback), this._render ? this._render.apply(this, arguments) : a.logWarn('No render function was provided, please use .setRender on the renderer'); + }.bind(this); + } + function d(e) { + var t = pbjs.adUnits, r = (0, s.default)(t, function (t) { + return t.code === e; + }); + if (!r) { + return !1; + } + var n = a.deepAccess(r, 'renderer'), i = !!(n && n.url && n.render), o = a.deepAccess(r, 'mediaTypes.video.renderer'), u = !!(o && o.url && o.render); + return !!(i && !0 !== n.backupOnly || u && !0 !== o.backupOnly); + } + c.install = function (e) { + return new c({ + url: e.url, + config: e.config, + id: e.id, + callback: e.callback, + loaded: e.loaded, + adUnitCode: e.adUnitCode + }); + }, c.prototype.getConfig = function () { + return this.config; + }, c.prototype.setRender = function (e) { + this._render = e; + }, c.prototype.setEventHandlers = function (e) { + this.handlers = e; + }, c.prototype.handleVideoEvent = function (e) { + var t = e.id, r = e.eventName; + 'function' == typeof this.handlers[r] && this.handlers[r](), a.logMessage('Prebid Renderer event for id '.concat(t, ' type ').concat(r)); + }, c.prototype.process = function () { + for (; this.cmd.length > 0;) { + try { + this.cmd.shift().call(); + } catch (e) { + a.logError('Error processing Renderer command: ', e); + } + } + }; + }, + function (e, t) { + e.exports = function (e, t) { + return { + enumerable: !(1 & e), + configurable: !(2 & e), + writable: !(4 & e), + value: t + }; + }; + }, + function (e, t, r) { + var n = r(63)('meta'), i = r(23), o = r(50), a = r(32).f, s = 0, u = Object.isExtensible || function () { + return !0; + }, c = !r(24)(function () { + return u(Object.preventExtensions({})); + }), d = function (e) { + a(e, n, { + value: { + i: 'O' + ++s, + w: {} + } + }); + }, l = e.exports = { + KEY: n, + NEED: !1, + fastKey: function (e, t) { + if (!i(e)) { + return 'symbol' == typeof e ? e : ('string' == typeof e ? 'S' : 'P') + e; + } + if (!o(e, n)) { + if (!u(e)) { + return 'F'; + } + if (!t) { + return 'E'; + } + d(e); + } + return e[n].i; + }, + getWeak: function (e, t) { + if (!o(e, n)) { + if (!u(e)) { + return !0; + } + if (!t) { + return !1; + } + d(e); + } + return e[n].w; + }, + onFreeze: function (e) { + return c && l.NEED && u(e) && !o(e, n) && d(e), e; + } + }; + }, + function (e, t, r) { + var n = r(32).f, i = r(50), o = r(19)('toStringTag'); + e.exports = function (e, t, r) { + e && !i(e = r ? e : e.prototype, o) && n(e, o, { + configurable: !0, + value: t + }); + }; + }, + function (e, t, r) { + var n = r(27), i = r(229), o = r(132), a = r(131)('IE_PROTO'), s = function () { + }, u = function () { + var e, t = r(128)('iframe'), n = o.length; + for (t.style.display = 'none', r(163).appendChild(t), t.src = 'javascript:', (e = t.contentWindow.document).open(), e.write(''), e.close(), u = e.F; n--;) { + delete u.prototype[o[n]]; + } + return u(); + }; + e.exports = Object.create || function (e, t) { + var r; + return null !== e ? (s.prototype = n(e), r = new s(), s.prototype = null, r[a] = e) : r = u(), void 0 === t ? r : i(r, t); + }; + }, + function (e, t) { + e.exports = {}; + }, + function (e, t, r) { + var n = r(184), i = r(140); + e.exports = function (e, t, r, o) { + var a = !r; + r || (r = {}); + for (var s = -1, u = t.length; ++s < u;) { + var c = t[s], d = o ? o(r[c], e[c], c, r, e) : void 0; + void 0 === d && (d = e[c]), a ? i(r, c, d) : n(r, c, d); + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(14), i = r(65), o = r(47), a = r(24), s = [].sort, u = [ + 1, + 2, + 3 + ]; + n(n.P + n.F * (a(function () { + u.sort(void 0); + }) || !a(function () { + u.sort(null); + }) || !r(266)(s)), 'Array', { + sort: function (e) { + return void 0 === e ? s.call(o(this)) : s.call(o(this), i(e)); + } + }); + }, + function (e, t) { + e.exports = function (e, t, r, n) { + if (!(e instanceof t) || void 0 !== n && n in e) { + throw TypeError(r + ': incorrect invocation!'); + } + return e; + }; + }, + function (e, t, r) { + var n = r(41); + e.exports = function (e, t, r) { + for (var i in t) { + n(e, i, t[i], r); + } + return e; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : n, r = {}; + return function () { + var n = t.apply(void 0, arguments); + return r[n] || (r[n] = e.apply(void 0, arguments)), r[n]; + }; + }; + var n = function () { + return arguments.length <= 0 ? void 0 : arguments[0]; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getAllS2SBidders = k, t.setS2STestingModule = function (e) { + S = e; + }, t.default = t.allS2SBidders = t.clientTestAdapters = t.uspDataHandler = t.gdprDataHandler = void 0, r(9), r(11), r(6), r(13), r(4), r(2), r(26), r(1), r(3), r(0), r(5), r(40); + var n = r(7), i = r(218), o = r(88), a = r(49), s = r(103), u = r(22), c = r(61), d = g(r(31)), l = g(r(37)), f = r(220), p = r(340); + function g(e) { + return e && e.__esModule ? e : { default: e }; + } + function m(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || b(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function v(e) { + return function (e) { + if (Array.isArray(e)) { + return y(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || b(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function b(e, t) { + if (e) { + if ('string' == typeof e) { + return y(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === r && e.constructor && (r = e.constructor.name), 'Map' === r || 'Set' === r ? Array.from(r) : 'Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? y(e, t) : void 0; + } + } + function y(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function h() { + return (h = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var S, O = r(7), _ = r(36), E = r(60), I = {}, w = I.bidderRegistry = {}, A = I.aliasRegistry = {}, T = []; + u.config.getConfig('s2sConfig', function (e) { + e && e.s2sConfig && (T = Array.isArray(e.s2sConfig) ? e.s2sConfig : [e.s2sConfig]); + }); + var x = {}; + var C = (0, c.hook)('sync', function (e) { + var t = e.bidderCode, r = e.auctionId, a = e.bidderRequestId, s = e.adUnits, u = e.labels, c = e.src; + return s.reduce(function (e, s) { + var d = (0, i.resolveStatus)((0, i.getLabels)(s, u), s.mediaTypes, s.sizes), l = d.active, p = d.mediaTypes, g = d.filterResults; + return l ? g && O.logInfo('Size mapping filtered adUnit "'.concat(s.code, '" banner sizes from '), g.before, 'to ', g.after) : O.logInfo('Size mapping disabled adUnit "'.concat(s.code, '"')), l && e.push(s.bids.filter(function (e) { + return e.bidder === t; + }).reduce(function (e, t) { + var d = s.nativeParams || O.deepAccess(s, 'mediaTypes.native'); + d && (t = h({}, t, { nativeParams: (0, o.processNativeAdUnitParams)(d) })), t = h({}, t, (0, n.getDefinedParams)(s, [ + 'fpd', + 'mediaType', + 'renderer', + 'storedAuctionResponse' + ])); + var l = (0, i.resolveStatus)((0, i.getLabels)(t, u), p), g = l.active, m = l.mediaTypes, v = l.filterResults; + return g ? v && O.logInfo('Size mapping filtered adUnit "'.concat(s.code, '" bidder "').concat(t.bidder, '" banner sizes from '), v.before, 'to ', v.after) : O.logInfo('Size mapping deactivated adUnit "'.concat(s.code, '" bidder "').concat(t.bidder, '"')), O.isValidMediaTypes(m) ? t = h({}, t, { mediaTypes: m }) : O.logError('mediaTypes is not correctly configured for adunit '.concat(s.code)), g && e.push(h({}, t, { + adUnitCode: s.code, + transactionId: s.transactionId, + sizes: O.deepAccess(m, 'banner.sizes') || O.deepAccess(m, 'video.playerSize') || [], + bidId: t.bid_id || O.getUniqueIdentifierStr(), + bidderRequestId: a, + auctionId: r, + src: c, + bidRequestsCount: f.adunitCounter.getRequestsCounter(s.code), + bidderRequestsCount: f.adunitCounter.getBidderRequestsCounter(s.code, t.bidder), + bidderWinsCount: f.adunitCounter.getBidderWinsCounter(s.code, t.bidder) + })), e; + }, [])), e; + }, []).reduce(n.flatten, []).filter(function (e) { + return '' !== e; + }); + }, 'getBids'); + var P = { + consentData: null, + setConsentData: function (e) { + P.consentData = e; + }, + getConsentData: function () { + return P.consentData; + } + }; + t.gdprDataHandler = P; + var j = { + consentData: null, + setConsentData: function (e) { + j.consentData = e; + }, + getConsentData: function () { + return j.consentData; + } + }; + t.uspDataHandler = j; + var R = []; + t.clientTestAdapters = R; + var D = []; + function k() { + I.s2STestingEnabled = !1, T.forEach(function (e) { + e && e.enabled && e.bidders && e.bidders.length && D.push.apply(D, v(e.bidders)); + }); + } + function N(e) { + return e && e.enabled && e.testing && S; + } + function M(e, t, r) { + try { + var i = w[e].getSpec(); + i && i[t] && 'function' == typeof i[t] && (O.logInfo('Invoking '.concat(e, '.').concat(t)), u.config.runWithBidder(e, n.bind.call(i[t], i, r))); + } catch (r) { + O.logWarn('Error calling '.concat(t, ' of ').concat(e)); + } + } + t.allS2SBidders = D, I.makeBidRequests = (0, c.hook)('sync', function (e, t, r, i, o) { + E.emit(_.EVENTS.BEFORE_REQUEST_BIDS, e); + var a = (0, n.getBidderCodes)(e); + u.config.getConfig('bidderSequence') === u.RANDOM && (a = (0, n.shuffle)(a)); + var s = (0, p.getRefererInfo)(), c = a, f = []; + 0 === D.length && k(), T.forEach(function (t) { + t && t.enabled && (N(t) && (S.calculateBidSources(t), S.getSourceBidderMap(e, D)[S.CLIENT].forEach(function (e) { + (0, d.default)(R, e) || R.push(e); + }))); + }), c = a.filter(function (e) { + return !(0, d.default)(D, e) || (0, d.default)(R, e); + }); + var g = D; + T.forEach(function (n) { + if (n && n.enabled) { + (function (e) { + return Boolean(N(e) && e.testServerOnly); + }(n) && function (e, t) { + return Boolean((0, l.default)(e, function (e) { + return (0, l.default)(e.bids, function (e) { + return (e.bidSource || t.bidderControl && t.bidderControl[e.bidder]) && e.finalSource === S.SERVER; + }); + })); + }(e, n) && (O.logWarn('testServerOnly: True. All client requests will be suppressed.'), c.length = 0)); + var i = function (e, t) { + var r = t.bidders, n = O.deepClone(e); + return n.forEach(function (e) { + e.bids = e.bids.filter(function (e) { + return (0, d.default)(r, e.bidder) && (!N(t) || e.finalSource !== S.CLIENT); + }).map(function (e) { + return e.bid_id = O.getUniqueIdentifierStr(), e; + }); + }), n.filter(function (e) { + return 0 !== e.bids.length; + }); + }(e, n), a = O.generateUUID(); + g.forEach(function (e) { + var u = O.getUniqueIdentifierStr(), c = { + bidderCode: e, + auctionId: r, + bidderRequestId: u, + tid: a, + bids: C({ + bidderCode: e, + auctionId: r, + bidderRequestId: u, + adUnits: O.deepClone(i), + labels: o, + src: _.S2S.SRC + }), + auctionStart: t, + timeout: n.timeout, + src: _.S2S.SRC, + refererInfo: s + }; + 0 !== c.bids.length && f.push(c); + }), i.forEach(function (e) { + var t = e.bids.filter(function (e) { + return (0, l.default)(f, function (t) { + return (0, l.default)(t.bids, function (t) { + return t.bidId === e.bid_id; + }); + }); + }); + e.bids = t; + }), f.forEach(function (e) { + void 0 === e.adUnitsS2SCopy && (e.adUnitsS2SCopy = i.filter(function (e) { + return e.bids.length > 0; + })); + }); + } + }); + var m = function (e) { + var t = O.deepClone(e); + return t.forEach(function (e) { + e.bids = e.bids.filter(function (e) { + return !R.length || e.finalSource !== S.SERVER; + }); + }), t.filter(function (e) { + return 0 !== e.bids.length; + }); + }(e); + return c.forEach(function (e) { + var n = O.getUniqueIdentifierStr(), a = { + bidderCode: e, + auctionId: r, + bidderRequestId: n, + bids: C({ + bidderCode: e, + auctionId: r, + bidderRequestId: n, + adUnits: O.deepClone(m), + labels: o, + src: 'client' + }), + auctionStart: t, + timeout: i, + refererInfo: s + }, u = w[e]; + u || O.logError('Trying to make a request for bidder that does not exist: '.concat(e)), u && a.bids && 0 !== a.bids.length && f.push(a); + }), P.getConsentData() && f.forEach(function (e) { + e.gdprConsent = P.getConsentData(); + }), j.getConsentData() && f.forEach(function (e) { + e.uspConsent = j.getConsentData(); + }), f; + }, 'makeBidRequests'), I.callBids = function (e, t, r, i, o, a, c) { + if (t.length) { + var l = m(t.reduce(function (e, t) { + return e[Number(void 0 !== t.src && t.src === _.S2S.SRC)].push(t), e; + }, [ + [], + [] + ]), 2), f = l[0], p = l[1], g = []; + p.forEach(function (e) { + for (var t = -1, r = 0; r < g.length; ++r) { + if (e.tid === g[r].tid) { + t = r; + break; + } + } + t <= -1 && g.push(e); + }); + var v = 0; + T.forEach(function (e) { + if (e && g[v] && (0, d.default)(e.bidders, g[v].bidderCode)) { + var t = (0, s.ajaxBuilder)(a, o ? { + request: o.request.bind(null, 's2s'), + done: o.done + } : void 0), u = e.bidders, c = w[e.adapter], l = g[v].tid, f = g[v].adUnitsS2SCopy, m = p.filter(function (e) { + return e.tid === l; + }); + if (c) { + var b = { + tid: l, + ad_units: f, + s2sConfig: e + }; + if (b.ad_units.length) { + var y = m.map(function (e) { + return e.start = (0, n.timestamp)(), i.bind(e); + }), h = b.ad_units.reduce(function (e, t) { + return e.concat((t.bids || []).reduce(function (e, t) { + return e.concat(t.bidder); + }, [])); + }, []); + O.logMessage('CALLING S2S HEADER BIDDERS ==== '.concat(u.filter(function (e) { + return (0, d.default)(h, e); + }).join(','))), m.forEach(function (e) { + E.emit(_.EVENTS.BID_REQUESTED, e); + }), c.callBids(b, p, function (e, t) { + var i = (0, n.getBidderRequest)(p, t.bidderCode, e); + i && r.call(i, e, t); + }, function () { + return y.forEach(function (e) { + return e(); + }); + }, t); + } + } else { + O.logError('missing ' + e.adapter); + } + v++; + } + }), f.forEach(function (e) { + e.start = (0, n.timestamp)(); + var t = w[e.bidderCode]; + O.logMessage('CALLING BIDDER ======= '.concat(e.bidderCode)), E.emit(_.EVENTS.BID_REQUESTED, e); + var d = (0, s.ajaxBuilder)(a, o ? { + request: o.request.bind(null, e.bidderCode), + done: o.done + } : void 0), l = i.bind(e); + try { + u.config.runWithBidder(e.bidderCode, n.bind.call(t.callBids, t, e, r.bind(e), l, d, c, u.config.callbackWithBidder(e.bidderCode))); + } catch (t) { + O.logError(''.concat(e.bidderCode, ' Bid Adapter emitted an uncaught error when parsing their bidRequest'), { + e: t, + bidRequest: e + }), l(); + } + }); + } else { + O.logWarn('callBids executed with no bidRequests. Were they filtered by labels or sizing?'); + } + }, I.videoAdapters = [], I.registerBidAdapter = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, n = r.supportedMediaTypes, i = void 0 === n ? [] : n; + e && t ? 'function' == typeof e.callBids ? (w[t] = e, (0, d.default)(i, 'video') && I.videoAdapters.push(t), (0, d.default)(i, 'native') && o.nativeAdapters.push(t)) : O.logError('Bidder adaptor error for bidder code: ' + t + 'bidder must implement a callBids() function') : O.logError('bidAdapter or bidderCode not specified'); + }, I.aliasBidAdapter = function (e, t, r) { + if (void 0 === w[t]) { + var n = w[e]; + if (void 0 === n) { + var i = []; + T.forEach(function (r) { + if (r.bidders && r.bidders.length) { + var n = r && r.bidders; + r && (0, d.default)(n, t) ? A[t] = e : i.push(e); + } + }), i.forEach(function (e) { + O.logError('bidderCode "' + e + '" is not an existing bidder.', 'adapterManager.aliasBidAdapter'); + }); + } else { + try { + var s, u = function (e) { + var t = []; + return (0, d.default)(I.videoAdapters, e) && t.push('video'), (0, d.default)(o.nativeAdapters, e) && t.push('native'), t; + }(e); + if (n.constructor.prototype != Object.prototype) { + (s = new n.constructor()).setBidderCode(t); + } else { + var c = n.getSpec(), l = r && r.gvlid, f = r && r.skipPbsAliasing; + s = (0, a.newBidder)(h({}, c, { + code: t, + gvlid: l, + skipPbsAliasing: f + })), A[t] = e; + } + I.registerBidAdapter(s, t, { supportedMediaTypes: u }); + } catch (t) { + O.logError(e + ' bidder does not currently support aliasing.', 'adapterManager.aliasBidAdapter'); + } + } + } else { + O.logMessage('alias name "' + t + '" has been already specified.'); + } + }, I.registerAnalyticsAdapter = function (e) { + var t = e.adapter, r = e.code, n = e.gvlid; + t && r ? 'function' == typeof t.enableAnalytics ? (t.code = r, x[r] = { + adapter: t, + gvlid: n + }) : O.logError('Prebid Error: Analytics adaptor error for analytics "'.concat(r, '"\n analytics adapter must implement an enableAnalytics() function')) : O.logError('Prebid Error: analyticsAdapter or analyticsCode not specified'); + }, I.enableAnalytics = function (e) { + O.isArray(e) || (e = [e]), O._each(e, function (e) { + var t = x[e.provider].adapter; + t ? t.enableAnalytics(e) : O.logError('Prebid Error: no analytics adapter found in registry for\n '.concat(e.provider, '.')); + }); + }, I.getBidAdapter = function (e) { + return w[e]; + }, I.getAnalyticsAdapter = function (e) { + return x[e]; + }, I.callTimedOutBidders = function (e, t, r) { + t = t.map(function (t) { + return t.params = O.getUserConfiguredParams(e, t.adUnitCode, t.bidder), t.timeout = r, t; + }), t = O.groupBy(t, 'bidder'), Object.keys(t).forEach(function (e) { + M(e, 'onTimeout', t[e]); + }); + }, I.callBidWonBidder = function (e, t, r) { + t.params = O.getUserConfiguredParams(r, t.adUnitCode, t.bidder), f.adunitCounter.incrementBidderWinsCounter(t.adUnitCode, t.bidder), M(e, 'onBidWon', t); + }, I.callSetTargetingBidder = function (e, t) { + M(e, 'onSetTargeting', t); + }, I.callBidViewableBidder = function (e, t) { + M(e, 'onBidViewable', t); + }; + var U = I; + t.default = U; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.processNativeAdUnitParams = function (e) { + if (e && e.type && function (e) { + if (!e || !(0, o.default)(Object.keys(d), e)) { + return (0, i.logError)(''.concat(e, ' nativeParam is not supported')), !1; + } + return !0; + }(e.type)) { + return d[e.type]; + } + return e; + }, t.nativeBidIsValid = function (e, t) { + var r = (0, i.getBidRequest)(e.requestId, t); + if (!r) { + return !1; + } + if (!(0, i.deepAccess)(e, 'native.clickUrl')) { + return !1; + } + if ((0, i.deepAccess)(e, 'native.image') && (!(0, i.deepAccess)(e, 'native.image.height') || !(0, i.deepAccess)(e, 'native.image.width'))) { + return !1; + } + if ((0, i.deepAccess)(e, 'native.icon') && (!(0, i.deepAccess)(e, 'native.icon.height') || !(0, i.deepAccess)(e, 'native.icon.width'))) { + return !1; + } + var n = r.nativeParams; + if (!n) { + return !0; + } + var a = Object.keys(n).filter(function (e) { + return n[e].required; + }), s = Object.keys(e.native).filter(function (t) { + return e.native[t]; + }); + return a.every(function (e) { + return (0, o.default)(s, e); + }); + }, t.fireNativeTrackers = function (e, t) { + var r; + 'click' === e.action ? r = t.native && t.native.clickTrackers : (r = t.native && t.native.impressionTrackers, t.native && t.native.javascriptTrackers && (0, i.insertHtmlIntoIframe)(t.native.javascriptTrackers)); + return (r || []).forEach(i.triggerPixel), e.action; + }, t.getNativeTargeting = function (e, t) { + var r = {}; + (0, i.deepAccess)(t, 'nativeParams.rendererUrl') ? e.native.rendererUrl = f(t.nativeParams.rendererUrl) : (0, i.deepAccess)(t, 'nativeParams.adTemplate') && (e.native.adTemplate = f(t.nativeParams.adTemplate)); + var n = !1 !== (0, i.deepAccess)(t, 'nativeParams.sendTargetingKeys'); + return Object.keys(e.native).forEach(function (o) { + if ('adTemplate' !== o) { + var a = s.NATIVE_KEYS[o], u = f(e.native[o]); + if ((0, i.deepAccess)(t, 'mediaTypes.native.'.concat(o, '.sendId'))) { + u = ''.concat(a, ':').concat(e.adId); + } + var c = (0, i.deepAccess)(t, 'nativeParams.'.concat(o, '.sendTargetingKeys')); + a && u && ('boolean' == typeof c ? c : n) && (r[a] = u); + } + }), r; + }, t.getAssetMessage = function (e, t) { + var r = { + message: 'assetResponse', + adId: e.adId, + assets: [] + }; + t.native.hasOwnProperty('adTemplate') && (r.adTemplate = f(t.native.adTemplate)); + t.native.hasOwnProperty('rendererUrl') && (r.rendererUrl = f(t.native.rendererUrl)); + return e.assets.forEach(function (e) { + var n = (0, i.getKeyByValue)(s.NATIVE_KEYS, e), o = f(t.native[n]); + r.assets.push({ + key: n, + value: o + }); + }), r; + }, t.getAllAssetsMessage = function (e, t) { + var r = { + message: 'assetResponse', + adId: e.adId, + assets: [] + }; + return Object.keys(t.native).forEach(function (e, n) { + if ('adTemplate' === e && t.native[e]) { + r.adTemplate = f(t.native[e]); + } else if ('rendererUrl' === e && t.native[e]) { + r.rendererUrl = f(t.native[e]); + } else if (t.native[e] && s.NATIVE_KEYS.hasOwnProperty(e)) { + var i = f(t.native[e]); + r.assets.push({ + key: e, + value: i + }); + } + }), r; + }, t.hasNonNativeBidder = t.nativeBidder = t.nativeAdUnit = t.NATIVE_TARGETING_KEYS = t.nativeAdapters = void 0, r(4), r(2), r(1), r(3), r(0), r(5); + var n, i = r(7), o = (n = r(31)) && n.__esModule ? n : { default: n }; + function a(e) { + return (a = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var s = r(36), u = []; + t.nativeAdapters = u; + var c = Object.keys(s.NATIVE_KEYS).map(function (e) { + return s.NATIVE_KEYS[e]; + }); + t.NATIVE_TARGETING_KEYS = c; + var d = { + image: { + image: { required: !0 }, + title: { required: !0 }, + sponsoredBy: { required: !0 }, + clickUrl: { required: !0 }, + body: { required: !1 }, + icon: { required: !1 } + } + }; + t.nativeAdUnit = function (e) { + var t = 'native' === e.mediaType, r = (0, i.deepAccess)(e, 'mediaTypes.native'); + return t || r; + }; + var l = function (e) { + return (0, o.default)(u, e.bidder); + }; + t.nativeBidder = l; + function f(e) { + return 'object' === a(e) && e.url ? e.url : e; + } + t.hasNonNativeBidder = function (e) { + return e.bids.filter(function (e) { + return !l(e); + }).length; + }; + }, + function (e, t, r) { + var n = r(23); + e.exports = function (e, t) { + if (!n(e)) { + return e; + } + var r, i; + if (t && 'function' == typeof (r = e.toString) && !n(i = r.call(e))) { + return i; + } + if ('function' == typeof (r = e.valueOf) && !n(i = r.call(e))) { + return i; + } + if (!t && 'function' == typeof (r = e.toString) && !n(i = r.call(e))) { + return i; + } + throw TypeError('Can\'t convert object to primitive value'); + }; + }, + function (e, t, r) { + var n = r(91), i = r(77), o = r(57), a = r(89), s = r(50), u = r(157), c = Object.getOwnPropertyDescriptor; + t.f = r(28) ? c : function (e, t) { + if (e = o(e), t = a(t, !0), u) { + try { + return c(e, t); + } catch (e) { + } + } + if (s(e, t)) { + return i(!n.f.call(e, t), e[t]); + } + }; + }, + function (e, t) { + t.f = {}.propertyIsEnumerable; + }, + function (e, t, r) { + var n = r(67), i = r(19)('toStringTag'), o = 'Arguments' == n(function () { + return arguments; + }()); + e.exports = function (e) { + var t, r, a; + return void 0 === e ? 'Undefined' : null === e ? 'Null' : 'string' == typeof (r = function (e, t) { + try { + return e[t]; + } catch (e) { + } + }(t = Object(e), i)) ? r : o ? n(t) : 'Object' == (a = n(t)) && 'function' == typeof t.callee ? 'Arguments' : a; + }; + }, + function (e, t) { + e.exports = function (e) { + var t = []; + if (null != e) { + for (var r in Object(e)) { + t.push(r); + } + } + return t; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t, r) { + return (0, i.default)(e, t, r); + }; + var n, i = (n = r(284)) && n.__esModule ? n : { default: n }; + }, + function (e, t, r) { + 'use strict'; + var n, i, o, a, s = r(64), u = r(18), c = r(53), d = r(92), l = r(14), f = r(23), p = r(65), g = r(84), m = r(117), v = r(137), b = r(196).set, y = r(285)(), h = r(198), S = r(286), O = r(287), _ = r(288), E = u.TypeError, I = u.process, w = I && I.versions, A = w && w.v8 || '', T = u.Promise, x = 'process' == d(I), C = function () { + }, P = i = h.f, j = !!function () { + try { + var e = T.resolve(1), t = (e.constructor = {})[r(19)('species')] = function (e) { + e(C, C); + }; + return (x || 'function' == typeof PromiseRejectionEvent) && e.then(C) instanceof t && 0 !== A.indexOf('6.6') && -1 === O.indexOf('Chrome/66'); + } catch (e) { + } + }(), R = function (e) { + var t; + return !(!f(e) || 'function' != typeof (t = e.then)) && t; + }, D = function (e, t) { + if (!e._n) { + e._n = !0; + var r = e._c; + y(function () { + for (var n = e._v, i = 1 == e._s, o = 0, a = function (t) { + var r, o, a, s = i ? t.ok : t.fail, u = t.resolve, c = t.reject, d = t.domain; + try { + s ? (i || (2 == e._h && M(e), e._h = 1), !0 === s ? r = n : (d && d.enter(), r = s(n), d && (d.exit(), a = !0)), r === t.promise ? c(E('Promise-chain cycle')) : (o = R(r)) ? o.call(r, u, c) : u(r)) : c(n); + } catch (e) { + d && !a && d.exit(), c(e); + } + }; r.length > o;) { + a(r[o++]); + } + e._c = [], e._n = !1, t && !e._h && k(e); + }); + } + }, k = function (e) { + b.call(u, function () { + var t, r, n, i = e._v, o = N(e); + if (o && (t = S(function () { + x ? I.emit('unhandledRejection', i, e) : (r = u.onunhandledrejection) ? r({ + promise: e, + reason: i + }) : (n = u.console) && n.error && n.error('Unhandled promise rejection', i); + }), e._h = x || N(e) ? 2 : 1), e._a = void 0, o && t.e) { + throw t.v; + } + }); + }, N = function (e) { + return 1 !== e._h && 0 === (e._a || e._c).length; + }, M = function (e) { + b.call(u, function () { + var t; + x ? I.emit('rejectionHandled', e) : (t = u.onrejectionhandled) && t({ + promise: e, + reason: e._v + }); + }); + }, U = function (e) { + var t = this; + t._d || (t._d = !0, (t = t._w || t)._v = e, t._s = 2, t._a || (t._a = t._c.slice()), D(t, !0)); + }, B = function (e) { + var t, r = this; + if (!r._d) { + r._d = !0, r = r._w || r; + try { + if (r === e) { + throw E('Promise can\'t be resolved itself'); + } + (t = R(e)) ? y(function () { + var n = { + _w: r, + _d: !1 + }; + try { + t.call(e, c(B, n, 1), c(U, n, 1)); + } catch (e) { + U.call(n, e); + } + }) : (r._v = e, r._s = 1, D(r, !1)); + } catch (e) { + U.call({ + _w: r, + _d: !1 + }, e); + } + } + }; + j || (T = function (e) { + g(this, T, 'Promise', '_h'), p(e), n.call(this); + try { + e(c(B, this, 1), c(U, this, 1)); + } catch (e) { + U.call(this, e); + } + }, (n = function (e) { + this._c = [], this._a = void 0, this._s = 0, this._d = !1, this._v = void 0, this._h = 0, this._n = !1; + }).prototype = r(85)(T.prototype, { + then: function (e, t) { + var r = P(v(this, T)); + return r.ok = 'function' != typeof e || e, r.fail = 'function' == typeof t && t, r.domain = x ? I.domain : void 0, this._c.push(r), this._a && this._a.push(r), this._s && D(this, !1), r.promise; + }, + catch: function (e) { + return this.then(void 0, e); + } + }), o = function () { + var e = new n(); + this.promise = e, this.resolve = c(B, e, 1), this.reject = c(U, e, 1); + }, h.f = P = function (e) { + return e === T || e === a ? new o(e) : i(e); + }), l(l.G + l.W + l.F * !j, { Promise: T }), r(79)(T, 'Promise'), r(118)('Promise'), a = r(62).Promise, l(l.S + l.F * !j, 'Promise', { + reject: function (e) { + var t = P(this); + return (0, t.reject)(e), t.promise; + } + }), l(l.S + l.F * (s || !j), 'Promise', { + resolve: function (e) { + return _(s && this === a ? T : this, e); + } + }), l(l.S + l.F * !(j && r(119)(function (e) { + T.all(e).catch(C); + })), 'Promise', { + all: function (e) { + var t = this, r = P(t), n = r.resolve, i = r.reject, o = S(function () { + var r = [], o = 0, a = 1; + m(e, !1, function (e) { + var s = o++, u = !1; + r.push(void 0), a++, t.resolve(e).then(function (e) { + u || (u = !0, r[s] = e, --a || n(r)); + }, i); + }), --a || n(r); + }); + return o.e && i(o.v), r.promise; + }, + race: function (e) { + var t = this, r = P(t), n = r.reject, i = S(function () { + m(e, !1, function (e) { + t.resolve(e).then(r.resolve, n); + }); + }); + return i.e && n(i.v), r.promise; + } + }); + }, + function (e, t, r) { + 'use strict'; + r(26), r(4), r(2), r(1), r(3), r(0), r(5); + var n = r(8), i = g(r(34)), o = g(r(94)), a = g(r(120)), s = r(55), u = r(39), c = r(35), d = g(r(48)), l = g(r(56)), f = g(r(29)), p = r(297); + function g(e) { + return e && e.__esModule ? e : { default: e }; + } + function m() { + return (m = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function v(e) { + return (v = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var b = { versionControl: !1 }; + e.exports = { + richObject: function () { + var e = {}, t = {}, r = {}, g = b; + function y() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : b; + Array.isArray(t) || 'object' !== v(t) ? n.bbLogger.logWarn('Initial value not picked up for eventful object. Invalid type.', t) : (e = t, g = m(g, r)), g.syncValue && I('*', function (e) { + if (Array.isArray(g.syncValue)) { + for (var t = 0; t < g.syncValue.length; t++) { + (0, g.syncValue[t])(e); + } + } else { + 'function' == typeof g.syncValue && g.syncValue(e); + } + }); + } + var h = function (r) { + var n = Array.isArray(r) ? r : [r]; + e = (0, l.default)(e, n), t = (0, l.default)(t, n), S(e); + }, S = (0, u.hookedFn)('sync', function (r, i, a) { + var s = (0, c.cloneDeep)(e); + if ('string' != typeof r && (i = r, r = '*'), 'object' === v(i) || '*' !== r) { + if ('*' === r) { + e = (0, d.default)(i) ? {} : a && a.forceUpdate ? i : (0, f.default)({}, i, e); + } else if ((0, o.default)(e, r, i), a) { + var u = E(r, a); + u && (0, o.default)(t, r, u); + } + T(w(e, s), a); + } else { + n.bbLogger.logError('When setting all topics: value must be an object'); + } + }); + function O() { + return t; + } + function _(e) { + for (var t in e) { + if (Object.prototype.hasOwnProperty.call(e, t)) { + E(t, e[t]); + } + } + } + function E(e, t) { + if (t.expires) { + var r = (0, p.expireAction)(t.expires, function () { + h(e); + }); + return (0, f.default)(t, { expires: r }); + } + return t; + } + function I() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; + if (!r) { + var n = t; + return n && '*' !== n ? (0, i.default)(e, n) : e; + } + return A(t, r); + } + function w(e, t) { + return Object.keys(r).filter(function (r) { + return !(0, a.default)((0, i.default)(e, r), (0, i.default)(t, r)); + }); + } + function A(e, t) { + var i = t; + if ('string' != typeof e && (i = e, e = '*'), 'function' == typeof i) { + return r[e] || (r[e] = []), r[e].push(i), void 0 !== I(e) && (0, s.makeSafe)(function () { + return t(I(e), { id: 'initialSet' }); + }), function () { + r[e].splice(r[e].indexOf(i), 1); + }; + } + n.bbLogger.logError('listener must be a function'); + } + function T(e, t) { + for (var n = function (n) { + var i = e[n]; + if (r[i] && Array.isArray(r[i])) { + for (var o = function (e) { + var n = r[i][e]; + void 0 !== I(i) && (0, s.makeSafe)(function () { + return n(I(i), t); + }); + }, a = 0; a < r[i].length; a++) { + o(a); + } + } + }, i = 0; i < e.length; i++) { + n(i); + } + if (r['*']) { + for (var o = function (e) { + var n = r['*'][e]; + (0, s.makeSafe)(function () { + return n(I('*'), t); + }); + }, a = 0; a < r['*'].length; a++) { + o(a); + } + } + } + return y.apply(void 0, arguments), { + getValue: I, + setValue: S, + deleteKey: h, + getMeta: O, + setMeta: _, + getOptions: function () { + return g; + }, + get value() { + return (0, c.cloneDeep)(e); + }, + get options() { + return (0, c.cloneDeep)(g); + } + }; + } + }; + }, + function (e, t, r) { + var n = r(23); + e.exports = function (e, t) { + if (!n(e) || e._t !== t) { + throw TypeError('Incompatible receiver, ' + t + ' required!'); + } + return e; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getEnvCfg = function (e) { + if ('object' !== l(e) || Array.isArray(e)) { + return e; + } + return f() && (e.dev || e.stage) ? e.dev || e.stage : e.prod; + }, t.getEnvVal = t.isStagingEnv = void 0, r(4), r(2), r(123), r(9), r(124); + var n = r(15), i = r(12), o = r(59), a = d(r(86)), s = r(39), u = d(r(314)), c = r(58); + function d(e) { + return e && e.__esModule ? e : { default: e }; + } + function l(e) { + return (l = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var f = (0, s.hookedFn)('sync', function () { + return 'stage' === (0, c.urlQueryAsObject)().adTargeting_env || 'stage' === g() || (e = (0, o.getPageTargeting)('env'), [ + 'stage', + 'staging', + 'dev' + ].indexOf(e) >= 0) || function () { + var e = (0, n.getConfig)('pageTargeting.env'); + return [ + 'stage', + 'staging', + 'dev' + ].indexOf(e) >= 0; + }(); + var e; + }); + t.isStagingEnv = f; + var p = (0, a.default)(function () { + return (0, c.urlQueryAsObject)().adTargeting_env || g() || (f() ? 'stage' : 'prod'); + }); + function g() { + if (!(0, i.dom)().window.performance.getEntriesByType) { + return null; + } + var e = 'bidbarrel-metacritic-rv.js'.split('.')[0], t = (0, i.dom)().window.performance.getEntriesByType('resource').find(function (t) { + return t.name.indexOf(e) >= 0; + }); + if (!t || !t.name) { + return null; + } + var r = (0, u.default)(t.name); + if (r.hostname && r.hostname.indexOf('at.adtech.redventures.io') >= 0) { + var n = new RegExp('/lib/dist/(.*)/'.concat(e), 'gm').exec(r.pathname); + return n && n.length >= 2 && n[1] ? n[1] : null; + } + return null; + } + t.getEnvVal = p; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.runQueue = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2], i = e, o = r, a = t, s = !1, u = []; + function c(e) { + if (n.bbLogger.atVerbosity(4).logInfo('Run Queue Item Added', e), s) { + l('Executing callback', e); + try { + e.apply(null, u); + } catch (e) { + e && n.bbLogger.logError(i, e); + } + return function () { + }; + } + var t = a.length; + return a.push(e), function () { + a = a.filter(function (e, r) { + return r !== t; + }); + }; + } + function d() { + var e = arguments; + s || (s = !0, u = arguments, a.forEach(function (t) { + l('Executing callback', t); + try { + t.apply(null, e); + } catch (e) { + e && n.bbLogger.logError(i, e); + } + })); + } + function l() { + var e; + o && (e = n.bbLogger.atVerbosity(5)).logInfo.apply(e, [i].concat(Array.prototype.slice.call(arguments))); + } + function f() { + return s; + } + return { + hasRan: s, + hasRanStatus: f, + run: d, + push: c + }; + }, t.promiseQueue = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = t, i = 0, o = !1, a = !1, s = (Promise.resolve(), function (e) { + n.bbLogger.atVerbosity(4).logInfo('Promise Queue Item Added', e), r.push(e), !o && a && d(); + }); + function u() { + return !!o; + } + function c(e) { + o = e; + } + var d = function t() { + a || (a = !0), !u() && r[i] && new Promise(function (t, o) { + n.bbLogger.atVerbosity(5).logMessage('Running', e, 'item', i), c(!0); + var a = function (o) { + o ? n.bbLogger.atVerbosity(5).logError('Error', e, 'item', i, o, 'Callback:', r[i]) : n.bbLogger.atVerbosity(5).logMessage('Finished', e, 'item', i), i++, c(!1), t(); + }; + try { + r[i](a); + } catch (e) { + a(e); + } + }).then(t); + }; + return { + get currentIndex() { + return i; + }, + get isRunning() { + return o; + }, + get remainingItems() { + return r.slice(i + 1); + }, + get stack() { + return r; + }, + push: s, + run: d + }; + }, r(95), r(0); + var n = r(8); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.bidCache = void 0, r(6), r(13), r(9), r(11), r(4), r(2), r(1), r(3), r(0), r(54), r(43), r(16); + var n = r(101), i = r(20), o = r(8), a = r(39), s = b(r(189)), u = b(r(86)), c = r(21), d = r(12), l = r(44), f = (r(15), b(r(209))), p = b(r(10)), g = b(r(36)), m = r(42), v = b(r(51)); + function b(e) { + return e && e.__esModule ? e : { default: e }; + } + function y(e) { + return (y = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function h(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return S(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return S(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function S(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var O = (0, o.logger)({ + name: 'bidCache', + bgColor: '#F7FFF6', + textColor: '#639C67' + }), _ = (0, n.getGlobal)(), E = g.default.EVENTS.BID_WON, I = p.default.EVENTS, w = I.AD_VIEWABLE, A = I.BAD_BID, T = I.BID_USED, x = I.BID_RECYCLED, C = function () { + var e = {}, t = {}, r = {}, n = {}, o = [], p = [], g = {}; + function b(e) { + return Boolean(n[e.adId]); + } + var S = (0, u.default)(function (e, t) { + var r = P(t); + return !!r && (!(!r.isVideo && !r.allowedTypes.video) || (t.constructor === Array ? t.map(function (t) { + return S(e, t); + }).indexOf(!0) >= 0 : r.getSizes().map(function (e) { + return 'string' == typeof e || 'number' == typeof e ? e : e.join('x'); + }).indexOf(e) >= 0)); + }, function (e, t) { + return ''.concat(JSON.stringify(e), '|').concat(t); + }); + function I(e) { + return !!t[e] && t[e].pending; + } + var C = (0, u.default)(function (e, t) { + var r = P(t); + return !(!r.cache && !r.lazyLoad || 'medianet' === e.bidderCode) || e.adUnitCode === t; + }, function (e, t) { + return ''.concat(e.adId, '|').concat(t); + }); + function P(e) { + var t, r, n = e; + if (n.indexOf('--') >= 0) { + var i = h(e.split('--'), 2), o = i[0], a = i[1]; + n = o, t = parseInt(a), (r = (0, l.getUnits)()[n]).video = r.getVideoSpec(t); + } else { + r = (0, l.getUnits)()[n]; + } + return void 0 !== t && r && (r.codeIndex = t), r; + } + var j = (0, u.default)(function (e, t, r) { + var n, i = P(t); + if ('object' === y(r.match)) { + var o = P(e.adUnitCode); + n = (0, f.default)(o, r.match); + } else { + n = !i.isVideo || !i.allowedTypes.video || (i.isVideo || i.allowedTypes.video) && 'video' === e.mediaType; + } + return n; + }, function (e, t) { + return ''.concat(e.adId, '|').concat(t); + }); + function R(e) { + return e < Date.now(); + } + function D(e, t, r) { + return (r.forTargeting ? !I(e.adId) : I(e.adId)) && C(e, t) && function (e, t, r) { + try { + var n = P(t); + return !(!e.mediaType || 'native' !== e.mediaType || !n.allowedTypes.native) || (e.mediaType && 'banner' === e.mediaType && n.allowedTypes.banner ? S(e.size, t) : !(!e.mediaType || 'video' !== e.mediaType || !n.allowedTypes.video && !n.isVideo) && j(e, t, r)); + } catch (e) { + return O.logError(e), !1; + } + }(e, t, r) && function (e, t) { + try { + if ('kargo' === e.bidderCode && '320x50' === ''.concat(e.width, 'x').concat(e.height)) { + return e.originalCode ? e.originalCode === t : e.adUnitCode === t; + } + } catch (e) { + O.logError(e); + var r = new Error(JSON.stringify(e, v.default)); + return m.errorReporting.report(r), !1; + } + return !0; + }(e, t); + } + var k = (0, a.hookedFn)('sync', function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { forTargeting: !1 }; + return !b(e) && (t.forTargeting ? !I(e.adId) : I(e.adId)) && !R(e.expireTime); + }); + function N(e) { + return e.filter(function (e) { + return void 0 !== P(e); + }); + } + function M(n) { + for (var i = Date.now(), o = n.length, a = 0; a < o; a++) { + var s = n[a].ttl > 0 ? n[a].ttl : 300; + !r[n[a].adId] && n[a].cpm > 0 ? (n[a].expireTime = i + 1000 * s, O.atVerbosity(5).logMessage('Caching Bid', n[a]), t[n[a].adId] = n[a], e[n[a].adId] = n[a], r[n[a].adId] = !0) : n <= 0 && (r[n[a].adId] = !0); + } + } + function U(e, r) { + void 0 !== e.adId && (t[e.adId].originalCode || (t[e.adId].originalCode = t[e.adId].adUnitCode), g[e.adUnitCode] = e.adId, t[e.adId].adUnitCode = r, t[e.adId].pendingFor = e.adUnitCode, t[e.adId].pendingTimestamp = Date.now(), t[e.adId].pending = !0); + } + var B = (0, a.hookedFn)('sync', function (e) { + return e; + }); + function L(e, t) { + void 0 !== _.renderAd && _.renderAd(e, t); + } + function z(e) { + return e ? Array.isArray(e) ? e.map(z).reduce(function (e, t) { + return e.concat(t); + }, []) : Object.values(t).filter(function (t) { + return t.adUnitCode === e; + }) : Object.values(t); + } + function V(e) { + var t = !1; + Array.isArray(e) || (e = [e], t = !0); + for (var r = (0, l.getUnitCodes)(e), n = [], i = 0; i < r.length; i++) { + var o = F(r[i]); + o && n.push(o); + } + return t && n.length >= 1 ? n[0] : n; + } + function F(e) { + for (var t = z(), r = [], n = 0; n < t.length; n++) { + var i = t[n]; + i.pendingFor === e && r.push(i); + } + return 1 === r.length ? r[0] : 0 === r.length ? void 0 : (0, s.default)(r, ['pendingTimestamp'], ['desc'])[0]; + } + return (0, d.dom)().window.adFlow = (0, d.dom)().window.adFlow || {}, (0, d.dom)().window.adFlow.renderAd = L, c.exposureApi.expose({ + getCachedBids: z, + getWinningBids: function e(t) { + return t ? Array.isArray(t) ? t.map(e).reduce(function (e, t) { + return e.concat(t); + }, []) : o.filter(function (e) { + return e.adUnitCode === t; + }) : o; + }, + bidFilter: k + }), c.exposureApi.rootScope({ getCachedBids: z }), { + bidFilter: k, + filterAdUnits: N, + getCachedBids: z, + getAllBids: function () { + return e; + }, + makePending: U, + pushBids: M, + evaluateWinningBids: function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = arguments.length > 2 ? arguments[2] : void 0; + if (!r.forTargeting) { + return V(e); + } + e = N(e), e = B(e), O.atVerbosity(5).logInfo('Ad codes by Bid Priority Order', e), t && Array.isArray(t) && t.length > 0 && M(t); + var n = z().filter(function (e) { + return k(e, r); + }); + O.logInfo('Evaluating winning bids for', e.join(', '), n), t = (0, s.default)(n, [ + 'cpm', + 'responseTimestamp' + ], [ + 'desc', + 'asc' + ]); + for (var i = [], o = 0; o < e.length; o++) { + for (var a = e[o], u = 0; u < t.length; u++) { + var c = t[u]; + if (D(c, a, r)) { + r.forTargeting && (O.logMessage('Winning Bid Found for '.concat(a, ' - adId: ').concat(c.adId, ', cpm: ').concat(c.cpm, ', mediaType: ').concat(c.mediaType, ', bidder: ').concat(c.bidderCode)), U(c, a)), i.push(c); + break; + } + } + } + return i; + }, + applyPriorityOrder: B, + getBidByAdId: function (t) { + return e[t]; + }, + getLatestPendingBids: V, + getLatestPendingBid: F, + getLatestPendingBidTargeting: function (e) { + var t = F(e); + return t ? t.adserverTargeting : {}; + }, + setupListeners: function () { + i.eventEmitter.on(A, function (e) { + return function (e) { + if (e) { + for (var t = 0; t < o.length; t++) { + var r = o[t]; + if (r.adId === e) { + p.push(r), n[r.adId] = !0, O.atVerbosity(3).logInfo('Bad bid ad render attempted and intercepted', r); + break; + } + } + } + }(e); + }), i.eventEmitter.on(w, function (e) { + return function (e) { + if (void 0 === e) { + return; + } + if (g[e] && t[g[e]]) { + var r = t[g[e]].adId; + if (n[r]) { + return; + } + O.atVerbosity(1).logMessage('Recycling Bid', t[r]), i.eventEmitter.emit(x, t[r]), t[r].pending = !1, t[r].pendingFor = null, delete g[e]; + } + }(e.code); + }), _.que.push(function () { + _.onEvent(E, function (e) { + return r = e.adId, void (t[r] && (O.atVerbosity(1).logMessage('Used Bid', t[r]), i.eventEmitter.emit(T, t[r]), n[r] = !0, o.push(t[r]))); + var r; + }); + }); + } + }; + }(); + t.bidCache = C; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getGlobal = function () { + return window.pbjs; + }, window.pbjs = window.pbjs || {}, window.pbjs.cmd = window.pbjs.cmd || [], window.pbjs.que = window.pbjs.que || [], window._pbjsGlobals = window._pbjsGlobals || [], window._pbjsGlobals.push('pbjs'); + }, + function (e, t, r) { + 'use strict'; + var n = r(27), i = r(332), o = r(108); + r(109)('search', 1, function (e, t, r, a) { + return [ + function (r) { + var n = e(this), i = null == r ? void 0 : r[t]; + return void 0 !== i ? i.call(r, n) : new RegExp(r)[t](String(n)); + }, + function (e) { + var t = a(r, e, this); + if (t.done) { + return t.value; + } + var s = n(e), u = String(this), c = s.lastIndex; + i(c, 0) || (s.lastIndex = 0); + var d = o(s, u); + return i(s.lastIndex, c) || (s.lastIndex = c), null === d ? -1 : d.index; + } + ]; + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.ajaxBuilder = u, t.ajax = void 0, r(26), r(4), r(2), r(102); + var n = r(22); + function i() { + return (i = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function o(e) { + return (o = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var a = r(7), s = u(); + function u() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 3000, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = t.request, s = t.done; + return function (t, u, c) { + const $___old_0795302c223902ee = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_0795302c223902ee) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_6bf28fdad6c63137.XMLHttpRequest)); + return function () { + var d = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}; + try { + var l, f = d.method || (c ? 'POST' : 'GET'), p = document.createElement('a'); + p.href = t; + var g = 'object' === o(u) && null !== u ? u : { + success: function () { + a.logMessage('xhr success'); + }, + error: function (e) { + a.logError('xhr error', null, e); + } + }; + if ('function' == typeof u && (g.success = u), (l = new window.XMLHttpRequest()).onreadystatechange = function () { + if (4 === l.readyState) { + 'function' == typeof s && s(p.origin); + var e = l.status; + e >= 200 && e < 300 || 304 === e ? g.success(l.responseText, l) : g.error(l.statusText, l); + } + }, n.config.getConfig('disableAjaxTimeout') || (l.ontimeout = function () { + a.logError(' xhr timeout after ', l.timeout, 'ms'); + }), 'GET' === f && c) { + var m = a.parseUrl(t, d); + i(m.search, c), t = a.buildUrl(m); + } + l.open(f, t, !0), n.config.getConfig('disableAjaxTimeout') || (l.timeout = e), d.withCredentials && (l.withCredentials = !0), a._each(d.customHeaders, function (e, t) { + l.setRequestHeader(t, e); + }), d.preflight && l.setRequestHeader('X-Requested-With', 'XMLHttpRequest'), l.setRequestHeader('Content-Type', d.contentType || 'text/plain'), 'function' == typeof r && r(p.origin), 'POST' === f && c ? l.send(c) : l.send(); + } catch (e) { + a.logError('xhr construction', e); + } + }.apply(this, arguments); + } finally { + if ($___old_0795302c223902ee) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_0795302c223902ee)); + } + }; + } + t.ajax = s; + }, + function (e, t, r) { + var n = r(62), i = r(18), o = i['__core-js_shared__'] || (i['__core-js_shared__'] = {}); + (e.exports = function (e, t) { + return o[e] || (o[e] = void 0 !== t ? t : {}); + })('versions', []).push({ + version: n.version, + mode: r(64) ? 'pure' : 'global', + copyright: '\xA9 2019 Denis Pushkarev (zloirock.ru)' + }); + }, + function (e, t, r) { + var n = r(69), i = Math.max, o = Math.min; + e.exports = function (e, t) { + return (e = n(e)) < 0 ? i(e + t, 0) : o(e, t); + }; + }, + function (e, t) { + t.f = Object.getOwnPropertySymbols; + }, + function (e, t, r) { + var n = r(19)('unscopables'), i = Array.prototype; + null == i[n] && r(46)(i, n, {}), e.exports = function (e) { + i[n][e] = !0; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(92), i = RegExp.prototype.exec; + e.exports = function (e, t) { + var r = e.exec; + if ('function' == typeof r) { + var o = r.call(e, t); + if ('object' != typeof o) { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return o; + } + if ('RegExp' !== n(e)) { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return i.call(e, t); + }; + }, + function (e, t, r) { + 'use strict'; + r(232); + var n = r(41), i = r(46), o = r(24), a = r(68), s = r(19), u = r(135), c = s('species'), d = !o(function () { + var e = /./; + return e.exec = function () { + var e = []; + return e.groups = { a: '7' }, e; + }, '7' !== ''.replace(e, '$'); + }), l = function () { + var e = /(?:)/, t = e.exec; + e.exec = function () { + return t.apply(this, arguments); + }; + var r = 'ab'.split(e); + return 2 === r.length && 'a' === r[0] && 'b' === r[1]; + }(); + e.exports = function (e, t, r) { + var f = s(e), p = !o(function () { + var t = {}; + return t[f] = function () { + return 7; + }, 7 != ''[e](t); + }), g = p ? !o(function () { + var t = !1, r = /a/; + return r.exec = function () { + return t = !0, null; + }, 'split' === e && (r.constructor = {}, r.constructor[c] = function () { + return r; + }), r[f](''), !t; + }) : void 0; + if (!p || !g || 'replace' === e && !d || 'split' === e && !l) { + var m = /./[f], v = r(a, f, ''[e], function (e, t, r, n, i) { + return t.exec === u ? p && !i ? { + done: !0, + value: m.call(t, r, n) + } : { + done: !0, + value: e.call(r, t, n) + } : { done: !1 }; + }), b = v[0], y = v[1]; + n(String.prototype, e, b), i(RegExp.prototype, f, 2 == t ? function (e, t) { + return y.call(e, this, t); + } : function (e) { + return y.call(e, this); + }); + } + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(27); + e.exports = function () { + var e = n(this), t = ''; + return e.global && (t += 'g'), e.ignoreCase && (t += 'i'), e.multiline && (t += 'm'), e.unicode && (t += 'u'), e.sticky && (t += 'y'), t; + }; + }, + function (e, t, r) { + var n = r(241), i = r(242), o = r(243), a = r(244), s = r(245); + function u(e) { + var t = -1, r = null == e ? 0 : e.length; + for (this.clear(); ++t < r;) { + var n = e[t]; + this.set(n[0], n[1]); + } + } + u.prototype.clear = n, u.prototype.delete = i, u.prototype.get = o, u.prototype.has = a, u.prototype.set = s, e.exports = u; + }, + function (e, t, r) { + var n = r(113); + e.exports = function (e, t) { + for (var r = e.length; r--;) { + if (n(e[r][0], t)) { + return r; + } + } + return -1; + }; + }, + function (e, t) { + e.exports = function (e, t) { + return e === t || e != e && t != t; + }; + }, + function (e, t) { + var r = Array.isArray; + e.exports = r; + }, + function (e, t) { + e.exports = function (e) { + return null != e && 'object' == typeof e; + }; + }, + function (e, t, r) { + var n = r(141)(Object.keys, Object); + e.exports = n; + }, + function (e, t, r) { + var n = r(53), i = r(195), o = r(144), a = r(27), s = r(38), u = r(145), c = {}, d = {}; + (t = e.exports = function (e, t, r, l, f) { + var p, g, m, v, b = f ? function () { + return e; + } : u(e), y = n(r, l, t ? 2 : 1), h = 0; + if ('function' != typeof b) { + throw TypeError(e + ' is not iterable!'); + } + if (o(b)) { + for (p = s(e.length); p > h; h++) { + if ((v = t ? y(a(g = e[h])[0], g[1]) : y(e[h])) === c || v === d) { + return v; + } + } + } else { + for (m = b.call(e); !(g = m.next()).done;) { + if ((v = i(m, y, g.value, t)) === c || v === d) { + return v; + } + } + } + }).BREAK = c, t.RETURN = d; + }, + function (e, t, r) { + 'use strict'; + var n = r(18), i = r(32), o = r(28), a = r(19)('species'); + e.exports = function (e) { + var t = n[e]; + o && t && !t[a] && i.f(t, a, { + configurable: !0, + get: function () { + return this; + } + }); + }; + }, + function (e, t, r) { + var n = r(19)('iterator'), i = !1; + try { + var o = [7][n](); + o.return = function () { + i = !0; + }, Array.from(o, function () { + throw 2; + }); + } catch (e) { + } + e.exports = function (e, t) { + if (!t && !i) { + return !1; + } + var r = !1; + try { + var o = [7], a = o[n](); + a.next = function () { + return { done: r = !0 }; + }, o[n] = function () { + return a; + }, e(o); + } catch (e) { + } + return r; + }; + }, + function (e, t, r) { + var n = r(202); + e.exports = function (e, t) { + return n(e, t); + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(300), i = r(97); + e.exports = r(204)('Set', function (e) { + return function () { + return e(this, arguments.length > 0 ? arguments[0] : void 0); + }; + }, { + add: function (e) { + return n.def(i(this, 'Set'), e = 0 === e ? 0 : e, e); + } + }, n); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.api = void 0, r(17), r(2), r(1), r(3), r(5), r(95), r(0), r(194), r(33); + var n = r(303), i = r(73), o = r(8), a = r(12), s = r(15), u = m(r(29)), c = m(r(86)), d = m(r(34)), l = m(r(148)), f = m(r(51)), p = r(20), g = r(98); + function m(e) { + return e && e.__esModule ? e : { default: e }; + } + function v(e, t) { + if (null == e) { + return {}; + } + var r, n, i = function (e, t) { + if (null == e) { + return {}; + } + var r, n, i = {}, o = Object.keys(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || (i[r] = e[r]); + } + return i; + }(e, t); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || Object.prototype.propertyIsEnumerable.call(e, r) && (i[r] = e[r]); + } + } + return i; + } + function b(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function y(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? b(Object(r), !0).forEach(function (t) { + h(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : b(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function h(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function S(e, t, r, n, i, o, a) { + try { + var s = e[o](a), u = s.value; + } catch (e) { + return void r(e); + } + s.done ? t(u) : Promise.resolve(u).then(n, i); + } + function O(e) { + return function () { + var t = this, r = arguments; + return new Promise(function (n, i) { + var o = e.apply(t, r); + function a(e) { + S(o, n, i, a, s, 'next', e); + } + function s(e) { + S(o, n, i, a, s, 'throw', e); + } + a(void 0); + }); + }; + } + var _ = m(r(10)).default.EVENTS.ERROR_REPORT, E = { + headers: { + cat: 'qMonyWr2w', + version: 'rv2.23.2', + variant: 'core' + } + }, I = { + cat: 'qMonyWr2w', + version: 'rv2.23.2', + variant: 'core' + }, w = function () { + var e = (0, s.getConfig)('api') || l.default.api; + function t() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ''; + return 0 === e.indexOf('http'); + } + function r() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : ''; + return t(e) || '/' === e.charAt(0) ? e : '/'.concat(e); + } + function m() { + var r = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : '', n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, i = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; + return t(r) ? A(r, n) : A((0, g.getEnvCfg)(e.apiBase) + (i ? '/v'.concat(e.version || '1') : '') + r, n); + } + function b(t, r) { + return e.cache && e.cache[t] || r; + } + var h = (0, c.default)(function (e) { + return 'api:' + e.replace(/https:\/\//gm, '').replace(/http:\/\//gm, '').replace(/\./gm, ''); + }); + function S(e, t) { + if (!t) { + return null; + } + var r = b(e, t), n = h(e); + return r ? i.storage.getLocalStorage(n) : null; + } + function w(t) { + return (0, u.default)(t, E, e.fetchOptions); + } + function A(e, t) { + var r = ''; + if (t && '{}' !== JSON.stringify(t)) { + for (var n in t) { + if (Object.prototype.hasOwnProperty.call(t, n)) { + var i = t[n]; + '' !== r && (r += '&'), i && 'null' !== i && 'undefined' !== i && (r += ''.concat(n, '=').concat(i)); + } + } + } + return '' !== r ? function (e) { + return e.indexOf('?') >= 0 ? e : ''.concat(e, '?'); + }(e) + r : e; + } + function T() { + return (0, a.dom)().window.AbortController ? new AbortController() : { + signal: void 0, + abort: function () { + return !1; + } + }; + } + function x(e, t) { + return C.apply(this, arguments); + } + function C() { + return (C = O(regeneratorRuntime.mark(function e(t, a) { + var s, u, c, l, g, O, E, I, A, x, C, P, j, R, D, k, N; + return regeneratorRuntime.wrap(function (e) { + const $___old_e166cbdbca24afa5 = {}.constructor.getOwnPropertyDescriptor(window, 'fetch'); + try { + if ($___old_e166cbdbca24afa5) + ({}.constructor.defineProperty(window, 'fetch', $___mock_a26319b580109d2e.fetch)); + return function () { + for (;;) { + switch (e.prev = e.next) { + case 0: + if (s = w(a), u = s.expires, c = s.useVersion, l = s.timeout, g = s.abortHandler, O = s.query, E = v(s, [ + 'expires', + 'useVersion', + 'timeout', + 'abortHandler', + 'query' + ]), I = r(t), u = b(I, u), 'GET' !== E.method || !u) { + e.next = 7; + break; + } + if (!(A = S(I, u))) { + e.next = 7; + break; + } + return e.abrupt('return', A); + case 7: + return x = m(I, O, c), l > 0 && (P = g || T(), C = setTimeout(function () { + return P.abort(); + }, l), E.signal = P.signal), e.prev = 9, e.next = 12, (0, n.fetch)(x, E); + case 12: + if (j = e.sent, C && clearTimeout(C), 'application/json' === (0, d.default)(E, 'headers.Accept')) { + e.next = 16; + break; + } + return e.abrupt('return', j); + case 16: + return e.next = 18, j.json(); + case 18: + return R = e.sent, 'GET' === E.method && (D = h(I), k = R, u && j.status >= 200 && j.status < 300 && i.storage.setLocalStorage(D, k, { expires: u })), o.bbLogger.atVerbosity(5).logInfo('API Request Success. url='.concat(x), a, R), e.abrupt('return', y({ _response: j }, R)); + case 24: + return e.prev = 24, e.t0 = e.catch(9), o.bbLogger.logError('API call failed. url='.concat(x)), N = new Error('API call failed. url='.concat(x, '. ').concat(JSON.stringify(e.t0, f.default))), p.eventEmitter.emit(_, N), e.abrupt('return', { + success: !1, + status: 'error', + error: e.t0 + }); + case 30: + case 'end': + return e.stop(); + } + } + }.apply(this, arguments); + } finally { + if ($___old_e166cbdbca24afa5) + ({}.constructor.defineProperty(window, 'fetch', $___old_e166cbdbca24afa5)); + } + }, e, null, [[ + 9, + 24 + ]]); + }))).apply(this, arguments); + } + function P(e) { + return function (t, r) { + return x(t, y({ method: e.toUpperCase() }, r)); + }; + } + return (0, s.getConfig)('api', function (t) { + e = t; + }), { + get: P('GET'), + post: P('POST'), + put: P('PUT'), + delete: P('DELETE'), + fetch: x, + getUrl: function (e, t) { + var n = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; + return m(r(e), t, n); + }, + sendBeacon: function (e, t) { + if ((0, a.dom)().window.navigator.sendBeacon) { + var n = m(r(e), I), i = 'string' == typeof t ? t : JSON.stringify(t), s = (0, a.dom)().window.navigator.sendBeacon(n, i); + return s && o.bbLogger.atVerbosity(5).logInfo('Sent Beacon Data. url='.concat(n), i), s; + } + return !1; + }, + createAbort: T + }; + }(); + t.api = w; + }, + function (e, t, r) { + var n = r(18), i = r(147), o = r(32).f, a = r(66).f, s = r(136), u = r(110), c = n.RegExp, d = c, l = c.prototype, f = /a/g, p = /a/g, g = new c(f) !== f; + if (r(28) && (!g || r(24)(function () { + return p[r(19)('match')] = !1, c(f) != f || c(p) == p || '/a/i' != c(f, 'i'); + }))) { + c = function (e, t) { + var r = this instanceof c, n = s(e), o = void 0 === t; + return !r && n && e.constructor === c && o ? e : i(g ? new d(n && !o ? e.source : e, t) : d((n = e instanceof c) ? e.source : e, n && o ? u.call(e) : t), r ? this : l, c); + }; + for (var m = function (e) { + e in c || o(c, e, { + configurable: !0, + get: function () { + return d[e]; + }, + set: function (t) { + d[e] = t; + } + }); + }, v = a(d), b = 0; v.length > b;) { + m(v[b++]); + } + l.constructor = c, c.prototype = l, r(41)(n, 'RegExp', c); + } + r(118)('RegExp'); + }, + function (e, t, r) { + 'use strict'; + var n = r(14), i = r(125)(5), o = !0; + 'find' in [] && Array(1).find(function () { + o = !1; + }), n(n.P + n.F * o, 'Array', { + find: function (e) { + return i(this, e, arguments.length > 1 ? arguments[1] : void 0); + } + }), r(107)('find'); + }, + function (e, t, r) { + var n = r(53), i = r(129), o = r(47), a = r(38), s = r(306); + e.exports = function (e, t) { + var r = 1 == e, u = 2 == e, c = 3 == e, d = 4 == e, l = 6 == e, f = 5 == e || l, p = t || s; + return function (t, s, g) { + for (var m, v, b = o(t), y = i(b), h = n(s, g, 3), S = a(y.length), O = 0, _ = r ? p(t, S) : u ? p(t, 0) : void 0; S > O; O++) { + if ((f || O in y) && (v = h(m = y[O], O, b), e)) { + if (r) { + _[O] = v; + } else if (v) { + switch (e) { + case 3: + return !0; + case 5: + return m; + case 6: + return O; + case 2: + _.push(m); + } + } else if (d) { + return !1; + } + } + } + return l ? -1 : c || d ? d : _; + }; + }; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.newUserSync = m, t.userSync = t.USERSYNC_DEFAULT_CONFIG = void 0, r(13), r(9), r(11), r(4), r(2), r(26), r(40), r(1), r(3), r(0), r(6), r(121); + var i, o = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = c(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), a = r(22), s = (i = r(31)) && i.__esModule ? i : { default: i }, u = r(75); + function c() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return c = function () { + return e; + }, e; + } + function d(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return l(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return l(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function l(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function f() { + return (f = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var p = { + syncEnabled: !0, + filterSettings: { + image: { + bidders: '*', + filter: 'include' + } + }, + syncsPerBidder: 5, + syncDelay: 3000, + auctionDelay: 0 + }; + t.USERSYNC_DEFAULT_CONFIG = p, a.config.setDefaults({ userSync: o.deepClone(p) }); + var g = (0, u.getCoreStorageManager)('usersync'); + function m(e) { + var t = {}, r = { + image: [], + iframe: [] + }, n = new Set(), i = {}, u = { + image: !0, + iframe: !1 + }, c = e.config; + function l() { + if (c.syncEnabled && e.browserSupportsCookies) { + try { + !function () { + if (!u.image) { + return; + } + p(r.image, function (e) { + var t = d(e, 2), r = t[0], n = t[1]; + o.logMessage('Invoking image pixel user sync for bidder: '.concat(r)), o.triggerPixel(n); + }); + }(), function () { + if (!u.iframe) { + return; + } + p(r.iframe, function (e) { + var t = d(e, 2), r = t[0], n = t[1]; + o.logMessage('Invoking iframe user sync for bidder: '.concat(r)), o.insertUserSyncIframe(n); + }); + }(); + } catch (e) { + return o.logError('Error firing user syncs', e); + } + r = { + image: [], + iframe: [] + }; + } + } + function p(e, t) { + o.shuffle(e).forEach(function (e) { + t(e), n.add(e[0]); + }); + } + function g(e, t) { + var r = c.filterSettings; + if (function (e, t) { + if (e.all && e[t]) { + return o.logWarn('Detected presence of the "filterSettings.all" and "filterSettings.'.concat(t, '" in userSync config. You cannot mix "all" with "iframe/image" configs; they are mutually exclusive.')), !1; + } + var r = e.all ? e.all : e[t], n = e.all ? 'all' : t; + if (!r) { + return !1; + } + var i = r.filter, a = r.bidders; + if (i && 'include' !== i && 'exclude' !== i) { + return o.logWarn('UserSync "filterSettings.'.concat(n, '.filter" setting \'').concat(i, '\' is not a valid option; use either \'include\' or \'exclude\'.')), !1; + } + if ('*' !== a && !(Array.isArray(a) && a.length > 0 && a.every(function (e) { + return o.isStr(e) && '*' !== e; + }))) { + return o.logWarn('Detected an invalid setup in userSync "filterSettings.'.concat(n, '.bidders"; use either \'*\' (to represent all bidders) or an array of bidders.')), !1; + } + return !0; + }(r, e)) { + u[e] = !0; + var n = r.all ? r.all : r[e], i = '*' === n.bidders ? [t] : n.bidders; + return { + include: function (e, t) { + return !(0, s.default)(e, t); + }, + exclude: function (e, t) { + return (0, s.default)(e, t); + } + }[n.filter || 'include'](i, t); + } + return !1; + } + return a.config.getConfig('userSync', function (e) { + if (e.userSync) { + var t = e.userSync.filterSettings; + o.isPlainObject(t) && (t.image || t.all || (e.userSync.filterSettings.image = { + bidders: '*', + filter: 'include' + })); + } + c = f(c, e.userSync); + }), t.registerSync = function (e, a, s) { + return n.has(a) ? o.logMessage('already fired syncs for "'.concat(a, '", ignoring registerSync call')) : c.syncEnabled && o.isArray(r[e]) ? a ? 0 !== c.syncsPerBidder && Number(i[a]) >= c.syncsPerBidder ? o.logWarn('Number of user syncs exceeded for "'.concat(a, '"')) : t.canBidderRegisterSync(e, a) ? (r[e].push([ + a, + s + ]), void (i = function (e, t) { + return e[t] ? e[t] += 1 : e[t] = 1, e; + }(i, a))) : o.logWarn('Bidder "'.concat(a, '" not permitted to register their "').concat(e, '" userSync pixels.')) : o.logWarn('Bidder is required for registering sync') : o.logWarn('User sync type "'.concat(e, '" not supported')); + }, t.syncUsers = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0; + if (e) { + return setTimeout(l, Number(e)); + } + l(); + }, t.triggerUserSyncs = function () { + c.enableOverride && t.syncUsers(); + }, t.canBidderRegisterSync = function (e, t) { + return !c.filterSettings || !g(e, t); + }, t; + } + var v = !o.isSafariBrowser() && g.cookiesAreEnabled(), b = m({ + config: a.config.getConfig('userSync'), + browserSupportsCookies: v + }); + t.userSync = b; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.newAuctionManager = u, t.auctionManager = void 0; + var n, i = r(7), o = r(221), a = (n = r(37)) && n.__esModule ? n : { default: n }; + var s = r(36); + function u() { + var e = [], t = {}; + return t.addWinningBid = function (t) { + var r = (0, a.default)(e, function (e) { + return e.getAuctionId() === t.auctionId; + }); + r ? (t.status = s.BID_STATUS.RENDERED, r.addWinningBid(t)) : (0, i.logWarn)('Auction not found when adding winning bid'); + }, t.getAllWinningBids = function () { + return e.map(function (e) { + return e.getWinningBids(); + }).reduce(i.flatten, []); + }, t.getBidsRequested = function () { + return e.map(function (e) { + return e.getBidRequests(); + }).reduce(i.flatten, []); + }, t.getNoBids = function () { + return e.map(function (e) { + return e.getNoBids(); + }).reduce(i.flatten, []); + }, t.getBidsReceived = function () { + return e.map(function (e) { + if (e.getAuctionStatus() === o.AUCTION_COMPLETED) { + return e.getBidsReceived(); + } + }).reduce(i.flatten, []).filter(function (e) { + return e; + }); + }, t.getAdUnits = function () { + return e.map(function (e) { + return e.getAdUnits(); + }).reduce(i.flatten, []); + }, t.getAdUnitCodes = function () { + return e.map(function (e) { + return e.getAdUnitCodes(); + }).reduce(i.flatten, []).filter(i.uniques); + }, t.createAuction = function (t) { + var r = t.adUnits, n = t.adUnitCodes, i = t.callback, a = t.cbTimeout, s = t.labels, u = t.auctionId, c = (0, o.newAuction)({ + adUnits: r, + adUnitCodes: n, + callback: i, + cbTimeout: a, + labels: s, + auctionId: u + }); + return function (t) { + e.push(t); + }(c), c; + }, t.findBidByAdId = function (t) { + return (0, a.default)(e.map(function (e) { + return e.getBidsReceived(); + }).reduce(i.flatten, []), function (e) { + return e.adId === t; + }); + }, t.getStandardBidderAdServerTargeting = function () { + return (0, o.getStandardBidderSettings)()[s.JSON_MAPPING.ADSERVER_TARGETING]; + }, t.setStatusForBids = function (r, n) { + var i = t.findBidByAdId(r); + if (i && (i.status = n), i && n === s.BID_STATUS.BID_TARGETING_SET) { + var o = (0, a.default)(e, function (e) { + return e.getAuctionId() === i.auctionId; + }); + o && o.setBidTargeting(i); + } + }, t.getLastAuctionId = function () { + return e.length && e[e.length - 1].getAuctionId(); + }, t; + } + var c = u(); + t.auctionManager = c; + }, + function (e, t, r) { + var n = r(23), i = r(18).document, o = n(i) && n(i.createElement); + e.exports = function (e) { + return o ? i.createElement(e) : {}; + }; + }, + function (e, t, r) { + var n = r(67); + e.exports = Object('z').propertyIsEnumerable(0) ? Object : function (e) { + return 'String' == n(e) ? e.split('') : Object(e); + }; + }, + function (e, t, r) { + var n = r(57), i = r(38), o = r(105); + e.exports = function (e) { + return function (t, r, a) { + var s, u = n(t), c = i(u.length), d = o(a, c); + if (e && r != r) { + for (; c > d;) { + if ((s = u[d++]) != s) { + return !0; + } + } + } else { + for (; c > d; d++) { + if ((e || d in u) && u[d] === r) { + return e || d || 0; + } + } + } + return !e && -1; + }; + }; + }, + function (e, t, r) { + var n = r(104)('keys'), i = r(63); + e.exports = function (e) { + return n[e] || (n[e] = i(e)); + }; + }, + function (e, t) { + e.exports = 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(','); + }, + function (e, t, r) { + 'use strict'; + var n = r(64), i = r(14), o = r(41), a = r(46), s = r(81), u = r(231), c = r(79), d = r(166), l = r(19)('iterator'), f = !([].keys && 'next' in [].keys()), p = function () { + return this; + }; + e.exports = function (e, t, r, g, m, v, b) { + u(r, t, g); + var y, h, S, O = function (e) { + if (!f && e in w) { + return w[e]; + } + switch (e) { + case 'keys': + case 'values': + return function () { + return new r(this, e); + }; + } + return function () { + return new r(this, e); + }; + }, _ = t + ' Iterator', E = 'values' == m, I = !1, w = e.prototype, A = w[l] || w['@@iterator'] || m && w[m], T = A || O(m), x = m ? E ? O('entries') : T : void 0, C = 'Array' == t && w.entries || A; + if (C && (S = d(C.call(new e()))) !== Object.prototype && S.next && (c(S, _, !0), n || 'function' == typeof S[l] || a(S, l, p)), E && A && 'values' !== A.name && (I = !0, T = function () { + return A.call(this); + }), n && !b || !f && !I && w[l] || a(w, l, T), s[t] = T, s[_] = p, m) { + if (y = { + values: E ? T : O('values'), + keys: v ? T : O('keys'), + entries: x + }, b) { + for (h in y) { + h in w || o(w, h, y[h]); + } + } else { + i(i.P + i.F * (f || I), t, y); + } + } + return y; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(168)(!0); + e.exports = function (e, t, r) { + return t + (r ? n(e, t).length : 1); + }; + }, + function (e, t, r) { + 'use strict'; + var n, i, o = r(110), a = RegExp.prototype.exec, s = String.prototype.replace, u = a, c = (n = /a/, i = /b*/g, a.call(n, 'a'), a.call(i, 'a'), 0 !== n.lastIndex || 0 !== i.lastIndex), d = void 0 !== /()??/.exec('')[1]; + (c || d) && (u = function (e) { + var t, r, n, i, u = this; + return d && (r = new RegExp('^' + u.source + '$(?!\\s)', o.call(u))), c && (t = u.lastIndex), n = a.call(u, e), c && n && (u.lastIndex = u.global ? n.index + n[0].length : t), d && n && n.length > 1 && s.call(n[0], r, function () { + for (i = 1; i < arguments.length - 2; i++) { + void 0 === arguments[i] && (n[i] = void 0); + } + }), n; + }), e.exports = u; + }, + function (e, t, r) { + var n = r(23), i = r(67), o = r(19)('match'); + e.exports = function (e) { + var t; + return n(e) && (void 0 !== (t = e[o]) ? !!t : 'RegExp' == i(e)); + }; + }, + function (e, t, r) { + var n = r(27), i = r(65), o = r(19)('species'); + e.exports = function (e, t) { + var r, a = n(e).constructor; + return void 0 === a || null == (r = n(a)[o]) ? t : i(r); + }; + }, + function (e, t) { + e.exports = function (e, t, r) { + switch (r.length) { + case 0: + return e.call(t); + case 1: + return e.call(t, r[0]); + case 2: + return e.call(t, r[0], r[1]); + case 3: + return e.call(t, r[0], r[1], r[2]); + } + return e.apply(t, r); + }; + }, + function (e, t, r) { + var n = r(237), i = r(238), o = r(239); + e.exports = function (e, t) { + return o(i(e, t, n), e + ''); + }; + }, + function (e, t, r) { + var n = r(246); + e.exports = function (e, t, r) { + '__proto__' == t && n ? n(e, t, { + configurable: !0, + enumerable: !0, + value: r, + writable: !0 + }) : e[t] = r; + }; + }, + function (e, t) { + e.exports = function (e, t) { + return function (r) { + return e(t(r)); + }; + }; + }, + function (e, t) { + var r = Object.prototype.toString; + e.exports = function (e) { + return r.call(e); + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t, r) { + var n = r(81), i = r(19)('iterator'), o = Array.prototype; + e.exports = function (e) { + return void 0 !== e && (n.Array === e || o[i] === e); + }; + }, + function (e, t, r) { + var n = r(92), i = r(19)('iterator'), o = r(81); + e.exports = r(62).getIteratorMethod = function (e) { + if (null != e) { + return e[i] || e['@@iterator'] || o[n(e)]; + } + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.requestManager = void 0, r(5), r(1), r(3), r(0), r(54); + var n = r(8), i = r(21), o = u(r(48)), a = u(r(10)), s = r(42); + function u(e) { + return e && e.__esModule ? e : { default: e }; + } + var c, d, l = a.default.LOGS.REQUEST_MANAGER, f = (0, n.logger)({ + name: l.LABEL, + bgColor: l.COLOR, + textColor: '#FFF' + }), p = (c = {}, d = [], i.exposureApi.expose({ + getRequesters: function () { + return Object.keys(c); + } + }), { + register: function (e) { + void 0 === c[e] && (c[e] = !1, f.atVerbosity(2).logInfo('Registering Requester', e)); + }, + reset: function () { + for (var e in (f.atVerbosity(2).logInfo('Reseting requests'), c)) { + Object.prototype.hasOwnProperty.call(c, e) && (c[e] = !1); + } + }, + done: function (e) { + f.atVerbosity(2).logInfo('Request done', e), c[e] = !0, ((0, o.default)(c) || -1 === Object.values(c).indexOf(!1)) && function () { + f.atVerbosity(2).logInfo('Running Request Manager callbacks'); + for (var e = 0; e < d.length; e++) { + try { + d[e](); + } catch (e) { + f.atVerbosity(1).logError(e), s.errorReporting.report(e); + } + } + d = []; + }(); + }, + enqueue: function (e) { + (0, o.default)(c) ? (f.logInfo('No registered requesters. Running callback.'), e()) : d.push(e); + } + }); + t.requestManager = p; + }, + function (e, t, r) { + var n = r(23), i = r(205).set; + e.exports = function (e, t, r) { + var o, a = t.constructor; + return a !== r && 'function' == typeof a && (o = a.prototype) !== r.prototype && n(o) && i && i(e, o), e; + }; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return function (e) { + if (Array.isArray(e)) { + return c(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || u(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function i(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function o(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? i(Object(r), !0).forEach(function (t) { + a(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : i(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function a(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function s(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || u(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function u(e, t) { + if (e) { + if ('string' == typeof e) { + return c(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === r && e.constructor && (r = e.constructor.name), 'Map' === r || 'Set' === r ? Array.from(r) : 'Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? c(e, t) : void 0; + } + } + function c(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + r(17), r(3), r(5), r(6), r(13), r(9), r(11), r(0), r(1), r(4), r(2), r(33), r(16); + var d = [ + { + precision: 2, + min: 0, + max: 3, + increment: 0.01 + }, + { + precision: 2, + max: 8, + increment: 0.05 + }, + { + precision: 2, + max: 20, + increment: 0.5 + }, + { + precision: 2, + max: 35, + increment: 1 + } + ]; + e.exports = { + dfpPathDevices: { + desktop: '', + web: '', + mweb: 'm', + mobile: 'm', + app: 'app', + m: 'm', + application: 'app' + }, + confiant: { badAdRefresh: !0 }, + bootstrap: { renderScripts: [] }, + debug: { + consoleMethods: { + error: !0, + warn: !0 + } + }, + api: { + baseUrl: 'https://at.adtech.redventures.io/lib/api', + apiBase: { + prod: 'https://at.adtech.redventures.io/lib/api', + stage: 'https://at.development.adtech.redventures.io/lib/api', + vcbs_prod: 'https://at.cbsi.com/lib/api', + vcbs_stage: 'https://dev.at.cbsi.com/lib/api' + }, + version: 1, + fetchOptions: { + useVersion: !0, + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json' + } + } + }, + cookie: { + defaultOptions: { path: '/' }, + dailySession: { + cookieName: '_BB.d', + defaultOptions: { expires: 'midnightEst' }, + deserialize: { + match: function (e) { + return e && e.indexOf('|') >= 0; + }, + process: function (e) { + if (!e) { + return { + firstpg: void 0, + ftag: void 0, + ttag: void 0, + pv: void 0 + }; + } + var t = s(e.split('|'), 4), r = t[0], n = t[1], i = t[2], o = t[3]; + return { + firstpg: r, + ftag: n, + ttag: i, + pv: parseInt(o) == parseInt(o) ? parseInt(o) : o + }; + } + }, + serialize: { + match: function (e) { + return !!e; + }, + process: function (e) { + return [ + e.firstpg, + e.ftag, + e.ttag, + e.pv + ].join('|').replace(/undefined/gm, ''); + } + } + }, + browserSession: { + cookieName: '_BB.bs', + deserialize: { + match: function (e) { + return e && e.indexOf('|') >= 0; + }, + process: function (e) { + if (!e) { + return { + session: void 0, + subses: void 0 + }; + } + var t = s(e.split('|'), 2); + return { + session: t[0], + subses: t[1] + }; + } + }, + serialize: { + match: function (e) { + return !!e; + }, + process: function (e) { + return [ + e.session, + e.subses + ].join('|').replace(/undefined/gm, ''); + } + } + }, + gaClientId: { + cookieName: '_ga', + readOnly: !0 + }, + aamUuid: { + cookieName: 'aam_uuid', + readOnly: !0 + }, + seg: { + cookieName: 'aamgam', + readOnly: !0, + deserialize: { + match: function (e) { + return !!e; + }, + process: function (e) { + return decodeURI(e).replace('segid=', '').split(','); + } + }, + serialize: { + match: function (e) { + return !!e; + }, + process: function (e) { + return encodeURI('segid='.concat(e.join(','))); + } + } + } + }, + errorReporting: { + chunkSize: 20, + reportInterval: 15000, + reportingPercentage: 1 + }, + analytics: { + bidbarrel: [{ + id: 'rv-bidbarrel-core', + protected: !0, + transport: 'beacon', + frequency: 15000, + session: { reportingPercentage: 50 }, + failThreshold: 3, + url: '/event' + }] + }, + analyticsTimings: { + utag: !0, + allowDuplicates: {}, + timeout: 60000, + sequences: [ + [ + 'event-adlib-init', + 'event-adlib-first-auction' + ], + [ + 'event-adsrvr-first-req', + 'event-first-render', + 'event-first-imp' + ] + ], + scripts: { + 'script-gpt': { + matchPart: 'securepubads.g.doubleclick.net/tag/js/gpt.js', + record: { + slug: 'script-gpt', + name: 'Time to GPT' + } + }, + 'script-pubads': { + matchPart: 'securepubads.g.doubleclick.net/gpt/pubads_impl', + record: { + slug: 'script-pubads', + name: 'Time to pubads_impl' + } + }, + 'script-adlib': { + matchPart: 'at.adtech.redventures.io/lib/dist', + record: { + slug: 'script-adlib', + name: 'Time to Ad Library' + } + }, + 'scripts-cbsoptanon': { + matchPart: '/a/privacy/optanon/optanon-', + record: { + slug: 'script-cbsoptanon', + name: 'Time to CMP' + } + } + }, + events: { + initialize: { + once: !0, + record: { + slug: 'event-adlib-init', + name: 'Time to Ad Library Initialize' + } + }, + auction: { + once: !0, + record: { + slug: 'event-adlib-first-auction', + name: 'Time to First Ad Library Auction' + } + }, + requested: { + once: !0, + event: { + gpt: !0, + name: 'slotRequested' + }, + record: { + slug: 'event-adsrvr-first-req', + name: 'Time to First Ad Server Request' + } + }, + rendered: { + once: !0, + event: { + gpt: !0, + name: 'slotRenderEnded' + }, + record: { + slug: 'event-first-render', + name: 'Time to First Ad Render' + } + }, + viewable: { + once: !0, + event: { + gpt: !0, + name: 'impressionViewable' + }, + record: { + slug: 'event-first-imp', + name: 'Time to First Viewable Impression' + } + } + } + }, + targeting: { + auto: !1, + query: { keyMap: {} }, + seats: { + session: 6, + subsession: 4 + }, + cookie: { + expiration: null, + path: '/', + domain: null, + samesite: 'None', + consolidate: !1, + keyMap: { + ftag: 'ftag', + ttag: 'ttag', + firstpg: 'first_page_today' + }, + getters: {}, + setters: {}, + deleters: {} + } + }, + dfpPath: { + region: 'aw', + network: '22309610186', + device: '' + }, + highFrequencyAdRequests: !1, + timeouts: { + failsafe: 3000, + bidder: 1000, + hfar: 700 + }, + amazon: { + pubID: 5062, + enabled: !0, + adServer: 'googletag', + regionConfig: {}, + allowedSizes: [ + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 300, + 250 + ], + [ + 320, + 50 + ], + [ + 728, + 90 + ], + [ + 970, + 250 + ], + [ + 300, + 600 + ] + ] + }, + priorityAxis: 'y', + lazyLoading: { + auction: { + enabled: !1, + chunkSize: 15, + chunk: !0, + lazy: !1, + offset: { + yAxis: 1000, + xAxis: 1600 + }, + percentageVisible: 1 + }, + units: { + offset: { + yAxis: 400, + xAxis: 800 + }, + percentageVisible: 1 + }, + offset: { + yAxis: 400, + xAxis: 800 + }, + percentageVisible: 1 + }, + autoPriority: { + enabled: !0, + refresh: !0, + bids: !0 + }, + contentAnnotation: { + requestPercentage: 100, + key: { + dev: 'AIzaSyB-aMlpejQughRRsdnu1PQXA-14LqtG2VY', + prod: 'AIzaSyAaD91SRm2g7fngfDE6pwat5F3IlkMJNpc' + }, + endpoints: { + dev: 'https://dev-admiral-mtml.mt.rvapps.io/api/v1/content_suitability_id', + prod: 'https://admiral-mtml.mt.rvapps.io/api/v1/content_suitability_id' + } + }, + optanon: { + setNpaOnConsentChange: !0, + enableServices: !1, + renderScript: !0, + scriptUrls: { + dev: 'https://production-cmp.isgprivacy.cbsi.com/dist/optanon-v1.1.0.js', + prod: 'https://production-cmp.isgprivacy.cbsi.com/dist/optanon-v1.1.0.js' + } + }, + dynamicTargeting: { + rules: [ + { + name: 'Slot Name String', + matcher: function (e) { + return !e.isVideo || !e.allowedTypes.video; + }, + key: 'sl', + level: 'unit', + hook: 'processAdRequest', + getValue: function (e, t) { + var r = { LL: e.isLazyLoaded() }, n = []; + for (var i in r) { + if (Object.prototype.hasOwnProperty.call(r, i)) { + r[i] && n.push(i); + } + } + return t.bidderTimeout && n.push('T-'.concat(t.bidderTimeout)), e.originalCode + (n.length > 0 ? '?' + n.join('|') : ''); + } + }, + { + name: 'Adobe Segment IDs', + matcher: function () { + return !0; + }, + key: 'seg', + level: 'page', + hook: 'processAdRequest', + cacheResult: !0, + getValue: function (e) { + return e.getCookie('seg') || null; + } + }, + { + name: 'Adobe Audience Manager ID', + matcher: function () { + return !0; + }, + key: 'aamid', + level: 'page', + hook: 'processAdRequest', + cacheResult: !0, + getValue: function (e) { + return e.getCookie('aamUuid') || null; + } + }, + { + name: 'Impression ID', + matcher: function () { + return !0; + }, + key: 'iid', + level: 'unit', + hook: 'setBidTargeting', + getValue: function (e, t) { + return 'unit='.concat(e.code, '|').concat(e.generateImpressionId([ + 'vguid', + 'pv', + 'hb_adid', + 'amzniid' + ])); + } + } + ], + units: {} + }, + dynamicBidders: { + sonobi: function (e, t, r) { + if (!e.included || t.isVideo || t.allowedTypes.video) { + return null; + } + var n = r.dfpPath, i = n.network, o = n.device, a = n.region, s = n.property; + return { + dom_id: t.code, + ad_unit: '/'.concat(i, '/').concat(o).concat(a, '-').concat(s, '/').concat(t.originalCode) + (t.incremental ? t.index : '') + }; + }, + pubmatic: function (e, t) { + if (!e.included) { + return null; + } + if (t.isVideo || t.allowedTypes.video) { + return null; + } + var r = t.getSizes(), n = [ + '300x250', + '320x50', + '728x90', + '970x250', + '300x600' + ], i = r.filter(function (e) { + return 'string' != typeof e && n.indexOf(e.join('x')) >= 0; + }); + return i.length <= 0 ? null : i.map(function (e) { + return { + publisherId: '160651', + adSlot: [ + window.BidBarrel.dfpPathObj.property, + t.originalCode || t.code, + e.join('x') + ].join('_') + }; + }); + }, + appnexus: function (e, t) { + var r = t.isVideo, i = t.getLatestVideoSpec; + if (r) { + var a = i(); + e = o(o({}, e), {}, { + video: { + mimes: a.mimes, + minduration: a.minduration, + maxduration: a.maxduration, + startdelay: a.startdelay, + skippable: 1 === a.skip, + playback_method: [ + '', + 'auto_play_sound_on', + 'auto_play_sound_off', + 'click_to_play' + ].filter(function (e, t) { + return a.playbackmethod.indexOf(t) >= 0; + }), + frameworks: [0].concat(n(a.api)) + } + }); + } + return e; + }, + spotx: function (e, t) { + var r = t.isVideo; + t.getSizes; + return r && (e = o(o({}, e), {}, { price_floor: 1 })), e; + }, + aol: function (e, t) { + return o({ network: '58918' }, e); + }, + medianet: function (e, t) { + return o({ cid: '8CU158L2Y' }, e); + }, + openx: function (e, t) { + return e.delDomain ? e : o({ delDomain: 'cbsi-d.openx.net' }, e); + }, + ix: function (e, t) { + return t.isVideo || t.allowedTypes.video ? (e.video = t.getLatestVideoSpec(), e) : e.size && t.getSizes().map(function (e) { + return Array.isArray(e) ? e.join('x') : e; + }).indexOf(e.size.join('x')) >= 0 ? e : null; + }, + trustx: function (e, t, r) { + if (t.incremental && 1 !== t.index) { + return null; + } + var n = r.bidderContext.extraParams; + if (!n && r.pageTargeting.seg && r.pageTargeting.seg.length > 0) { + var i = [ + '1631413', + '66572770', + '13100219', + '743242233' + ], a = r.pageTargeting.seg.filter(function (e) { + return i.indexOf(e) >= 0; + }); + n = a.length >= 0 ? { keywords: { topic: a } } : {}, r.bidderContext.extraParams = n; + } + return o(o({}, e), n); + }, + yieldmo: function (e, t, r) { + return void 0 === r.bidderContext.count ? r.bidderContext.count = 1 : r.bidderContext.count++, r.bidderContext.count > 6 ? null : { placementId: '' + e.placementId }; + }, + teads: function (e) { + return e.placementId && e.pageId ? { + pageId: e.pageId ? parseInt(e.pageId) : '', + placementId: e.placementId ? parseInt(e.placementId) : '' + } : null; + } + }, + geo: { + enabled: !0, + failsafeRegionCode: 'us', + failsafeCountryCode: 'us', + failsafeTimeout: 2000 + }, + moat: { yieldIntelligence: { scriptUrl: 'https://z.moatads.com/redventuresgamheader644747280705/moatheader.js' } }, + ias: { publisherOptimization: { scriptUrl: 'https://cdn.adsafeprotected.com/iasPET.1.js' } }, + video: { + detectCapabilities: !0, + spec: { + mimes: [ + 'video/mp4', + 'video/H264', + 'video/webm' + ], + startdelay: 0, + w: 640, + h: 480, + skip: 0, + minduration: 5, + maxduration: 30, + context: 'instream', + api: [ + 1, + 2 + ], + linearity: 1, + protocols: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8 + ], + playbackmethod: [2], + playbackend: 1 + }, + getSpec: function (e, t, r) { + var n = t.PLAYBACK_METHOD, i = e; + return r.isMobile() && (i.api = i.api.filter(function (e) { + return -1 === [ + 1, + 2 + ].indexOf(e); + })), (i.api.indexOf(1) >= 0 || i.api.indexOf(2) >= 0) && (i.mimes = i.mimes.filter(function (e) { + return -1 === [ + 'video/H264', + 'video/webm' + ].indexOf(e); + })), r.canAutoplayUnmuted ? i.playbackmethod = [ + n.PAGELOAD_SOUND_ON, + n.PAGELOAD_SOUND_OFF + ] : r.canAutoplayMuted ? i.playbackmethod = [n.PAGELOAD_SOUND_OFF] : i.playbackmethod = [n.CLICK_SOUND_ON], i; + }, + getUnitSpec: function (e, t, r) { + r.PLAYBACK_METHOD; + return o({ sequence: t.sequenceIndex }, e); + }, + translateSpec: function (e, t, r, n) { + var i, o = r.PLAYBACK_METHOD, a = e; + return '480v' === a.h ? i = o.PAGELOAD_SOUND_ON : '483v' === a.h ? i = o.PAGELOAD_SOUND_OFF : a.playerSize && 2 === a.playerSize.length && '480v' === a.playerSize[1] ? i = o.PAGELOAD_SOUND_ON : a.playerSize && 2 === a.playerSize.length && '483v' === a.playerSize[1] && (i = o.PAGELOAD_SOUND_OFF), i === o.PAGELOAD_SOUND_OFF && n.canAutoplayMuted ? a.playbackmethod = [o.PAGELOAD_SOUND_OFF] : i === o.PAGELOAD_SOUND_ON && n.canAutoplayUnmuted ? a.playbackmethod = [ + o.PAGELOAD_SOUND_ON, + o.PAGELOAD_SOUND_OFF + ] : i && (a.playbackmethod = [o.CLICK_SOUND_ON]), i && (a.h = 480), a.h && a.w || !a.playerSize || 2 !== a.playerSize.length ? e.playerSize && 2 === a.playerSize.length || (a.playerSize = [ + a.w, + a.h + ]) : (a.w || (a.w = a.playerSize[0]), a.h || (a.h = a.playerSize[1])), a; + }, + defaultParamOptions: { + getParams: function (e, t) { + return {}; + }, + params: {}, + targeting: { + unit: !1, + page: !1, + whitelist: [ + 'vguid', + 'ptype', + 'pv', + 'firstpg', + 'session', + 'subses', + 'ftag', + 'ttag', + 'cid' + ] + } + }, + getDefaultParamOptions: function (e) { + return e; + }, + adServerUrl: 'https://pubads.g.doubleclick.net/gampad/ads' + }, + prebid: { + enabledRegions: [ + 'us', + 'emea', + 'apac' + ], + cacheUrlConfigs: { + prefix: 'bb_vcache_', + bidders: { default: {} } + }, + ids: { + pubCommon: { + enabled: !0, + userSyncConfig: { + name: 'pubCommonId', + storage: { + type: 'cookie', + name: '_pubcid', + expires: 365 + } + } + }, + identityLink: { + enabled: !1, + template: !0, + trackChanges: !0, + shouldRefresh: function (e, t) { + return !(!t || !t.params) && (!!(!e && t || !e.params && t.params) || ('' === e.params.eid && '' !== t.params.eid || '' !== t.params.eid && t.params.eid !== e.params.eid)); + }, + dependencies: '<%= context.getValue(\'config.dfpPath\') %>', + onRemove: { cookies: ['_lr_retry_request'] }, + userSyncConfig: { + name: 'identityLink', + params: { eid: '<%= context.getValue(\'config.firstPartyData.eid\') %>' }, + storage: { + type: 'cookie', + name: '_BB.id.identityLink', + expires: 15 + } + } + }, + liveIntent: { + enabled: !1, + userSyncConfig: { + name: 'liveIntentId', + params: { + identifiersToResolve: ['_pubcid'], + partner: 'prebid' + }, + storage: { + type: 'cookie', + name: '_BB.id.liveIntent', + expires: 1 + } + } + } + }, + allowedSizes: [ + [ + 5, + 5 + ], + [ + 6, + 6 + ], + [ + 300, + 250 + ], + [ + 320, + 50 + ], + [ + 728, + 90 + ], + [ + 640, + 480 + ], + [ + 970, + 250 + ], + [ + 300, + 600 + ], + [ + 160, + 600 + ], + [ + 300, + 251 + ], + [ + 11, + 11 + ] + ], + priceBuckets: d, + pbjsConfig: { + userSync: { syncEnabled: !1 }, + priceGranularity: { buckets: d }, + mediaTypePriceGranularity: { + video: { + buckets: [ + { + precision: 2, + max: 10, + increment: 0.25 + }, + { + precision: 2, + max: 25, + increment: 0.5 + }, + { + precision: 2, + max: 50, + increment: 1 + } + ] + } + }, + enableSendAllBids: !1, + s2sConfig: { + accountId: '12849', + enabled: !0, + bidders: ['appnexus'], + timeout: 1000, + adapter: 'prebidServer', + endpoint: 'https://ib.adnxs.com/openrtb2/prebid' + }, + targetingControls: { alwaysIncludeDeals: !0 }, + cache: { url: 'https://prebid.adnxs.com/pbc/v1/cache' } + } + } + }; + }, + function (e, t, r) { + 'use strict'; + function n(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function i(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? n(Object(r), !0).forEach(function (t) { + o(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : n(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function o(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function a(e, t) { + return (e || []).reduce(function (e, r) { + return i(i({}, e), {}, o({}, t ? r[t] : r, r)); + }, {}); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + var r = e || {}; + return Array.isArray(r) ? a(r, t) : Object.values(a(r, t)); + }, r(17), r(2), r(5), r(1), r(3), r(0), r(54); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + return (0, i.default)(e, t); + }; + var n, i = (n = r(308)) && n.__esModule ? n : { default: n }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = void 0, r(17), r(2), r(1), r(3), r(0), r(5); + var n = r(15), i = r(59), o = r(12), a = r(73), s = r(96), u = r(98), c = g(r(34)), d = g(r(94)), l = r(21), f = r(8), p = r(20); + function g(e) { + return e && e.__esModule ? e : { default: e }; + } + function m(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function v(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? m(Object(r), !0).forEach(function (t) { + b(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : m(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function b(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var y = g(r(10)).default.EVENTS.AUCTION, h = function () { + var e = (0, s.richObject)({}), t = []; + function r() { + (0, c.default)((0, o.dom)().window, 'utag_data._test') || /\$\$TEST_STR\$\$/gm.test('$$TEST_STR$$') || (0, d.default)((0, o.dom)().window, 'utag_data._test', '$$TEST_STR$$'), g(a.storage.getCookie('*', function (t) { + e.setValue({ cookie: t }); + })), g(i.pageTargeting.getValue('*', function (t) { + e.setValue({ targeting: t }); + })), g((0, n.getConfig)('*', function (t) { + e.setValue({ + config: t, + authenticated: void 0 !== (0, n.getConfig)('firstPartyData.eid') + }); + })), e.setValue({ + page: (0, o.dom)().window.location.href, + hostname: (0, o.dom)().window.location.hostname, + abStr: (0, c.default)((0, o.dom)().window, 'utag_data._test') + }), e.setValue('client', { + connectionSpeed: (0, c.default)((0, o.dom)().window, 'navigator.connection.downlink'), + deviceMemory: (0, c.default)((0, o.dom)().window, 'navigator.deviceMemory'), + viewportHeight: (0, c.default)((0, o.dom)().window, 'innerHeight'), + viewportWidth: (0, c.default)((0, o.dom)().window, 'innerWidth'), + maxViewportHeight: (0, c.default)((0, o.dom)().window, 'screen.height'), + maxViewportWidth: (0, c.default)((0, o.dom)().window, 'screen.width') + }), g((0, n.getConfig)('clientInfo.data', function (t) { + e.setValue('client', v(v({}, e.getValue('client')), {}, { + country: (0, c.default)(t, 'country'), + gmtOffset: (0, c.default)(t, 'gmtOffset'), + subregion: (0, c.default)(t, 'region'), + postalCode: (0, c.default)(t, 'postalCode'), + connectionType: (0, c.default)(t, 'connection') + })); + })), g((0, n.getConfig)('geo.regionCode', function (t) { + e.setValue('client.region', t); + })), e.setValue({ + dfpPath: (0, n.getConfig)('dfpPathObj.string'), + bidbarrelVersion: 'rv2.23.2', + isStage: (0, u.isStagingEnv)() + }), f.bbLogger.logInfo('Setup context', e.getValue()); + } + function g(e) { + t.push(e); + } + function m() { + for (var e = 0; e < t.length; e++) { + var n = t[e]; + 'function' == typeof n && n(); + } + t = [], r(); + } + return l.exposureApi.rootScopeGetter('context', function () { + return e.getValue(); + }), l.exposureApi.expose({ reloadContext: m }), p.eventEmitter.on(y, m), { + setup: r, + reload: m, + setValue: e.setValue, + getValue: e.getValue + }; + }(); + t.default = h; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.gptModule = t.gptModuleBase = void 0, r(6), r(13), r(9), r(11), r(4), r(17), r(2), r(43), r(16), r(1), r(3), r(0), r(5); + var n = r(44), i = r(8), o = r(20), a = r(15), s = r(59), u = r(39), c = r(99), d = r(35), l = _(r(29)), f = _(r(150)), p = r(58), g = r(74), m = r(12), v = r(52), b = r(25), y = r(188), h = r(21), S = r(42), O = _(r(10)); + function _(e) { + return e && e.__esModule ? e : { default: e }; + } + function E(e) { + return function (e) { + if (Array.isArray(e)) { + return T(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || A(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function I(e) { + return (I = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function w(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || A(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function A(e, t) { + if (e) { + if ('string' == typeof e) { + return T(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === r && e.constructor && (r = e.constructor.name), 'Map' === r || 'Set' === r ? Array.from(r) : 'Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? T(e, t) : void 0; + } + } + function T(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function x(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function C(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? x(Object(r), !0).forEach(function (t) { + P(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : x(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function P(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var j = O.default.EVENTS, R = j.DFP_EVENTS, D = j.AD_LOADED, k = j.AD_RENDERED, N = j.AD_VIEWABLE, M = j.AD_RECEIVED, U = j.AD_REQUESTED, B = j.AD_VISIBILITY_CHANGED, L = j.DISPLAY_CALLED, z = j.SLOT_DEFINED, V = j.BATCH_SLOTS_DEFINED, F = j.INITIALIZE, q = function () { + var e = {}, t = !1, r = (0, c.runQueue)('post-init queue', [], 5 === (0, i.getVerbosityLevel)()); + function b(e, t, r) { + t.display = function () { + return x(t); + }, t.slot || (0, y.hasGetter)(t, 'slot') || (0, y.readOnlyGetter)(t, 'slot', function () { + return A(t); + }), t.slotTargeting || (0, y.hasGetter)(t, 'slotTargeting') || (0, y.readOnlyGetter)(t, 'slotTargeting', function () { + return j(t.code); + }), t.generateImpressionId || (t.generateImpressionId = function (e) { + var r = C(C({}, (0, s.getPageTargeting)()), j(t.code)); + return e.reduce(function (e, t, n) { + return r[t] && e.push(''.concat(t, '=').concat(r[t])), e; + }, []).join('|'); + }), e(t, r); + } + function _(e, t) { + for (var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : function () { + return !1; + }, n = [], i = 0; i < t.length; i++) { + var o = t[i], a = A(o); + a && n.push(a); + } + n && n.length > 0 && J(function (e) { + return e.pubads().refresh(n); + }), e(t, r); + } + function A(t) { + var r = 'string' == typeof t ? t : t.code; + return e[r]; + } + var T = (0, u.hookedFn)('sync', function (s) { + r.push(function () { + !function (t) { + J(function (r) { + var s = []; + if (t.length > 0) { + i.bbLogger.atVerbosity(1).logInfo('Defining slots', t); + for (var u = (0, a.getConfig)(), c = (0, n.getUnits)(), l = (0, a.getConfig)('dfpPathObj').string, p = 0; p < t.length; p++) { + var g = t[p]; + if (e[g.code]) { + var m = Object.keys(g.targeting), v = (0, f.default)(j(g.code), m); + JSON.stringify(g.targeting) !== JSON.stringify(v) && G(g.targeting, g.code); + } else { + var b = (0, d.cloneDeep)(g); + u.adjustSlotDefinition && u.adjustSlotDefinition[b.code] && (b = u.adjustSlotDefinition[b.code](b), i.bbLogger.atVerbosity(2).logInfo('Adjusting on slot definition', g, 'to', b)), i.bbLogger.logInfo('Defining slot path='.concat(l, ' elementId=').concat(b.code, ' sizes=').concat(b.sizes ? b.sizes.map(function (e) { + return Array.isArray(e) ? e.join('x') : e; + }).join(',') : 'none')), b.outOfPage ? e[b.code] = r.defineOutOfPageSlot(l, b.code) : b.maxSize ? b.minSize ? e[b.code] = r.defineSlot(l, { + fixed: b.sizes, + min: b.minSize, + max: b.maxSize + }, b.code) : e[b.code] = r.defineSlot(l, { + fixed: b.sizes, + max: b.maxSize + }, b.code) : e[b.code] = r.defineSlot(l, b.sizes, b.code), re(b.code), e[b.code].addService(r.pubads()), ie(b.code, b.sizeMappings), c[b.code].servicesApplied = !0, G(b.targeting, b.code), s.push(b), o.eventEmitter.emit([ + z, + ''.concat(b.code, '.').concat(z) + ], b, e[b.code]); + } + } + o.eventEmitter.emit(V, s, s.map(A)); + } + }); + }(s), x(s), t || (i.bbLogger.atVerbosity(3).logInfo('Enabling services'), t = !0, J(function (e) { + e.pubads().enableSingleRequest(), W(e); + })); + }); + }); + function x(t) { + if (Array.isArray(t)) { + for (var r = 0; r < t.length; r++) { + x(t[r]); + } + } else { + J(function (r) { + var n = t; + if (!n.displayed) { + var a = (0, m.dom)().window.document.getElementById(n.code); + if (a) { + r.display(a), n.displayed = !0, o.eventEmitter.emit([ + L, + ''.concat(n.code, '.').concat(L) + ], n, e[n.code]); + } else { + i.bbLogger.logError('Cannot find element for unit. Please ensure ad element is on the page prior to ad request attempts', n); + var s = new Error('Cannot find element for unit. Please ensure ad element is on the page prior to ad request attempts '.concat(n, '.')); + S.errorReporting.report(s); + } + } + }); + } + } + function P(e, t) { + T(t), J(function (r) { + e(t); + }); + } + function j(e) { + if (e.constructor === Array) { + for (var t = [], r = 0; r < e.length; r++) { + var n = e[r]; + t.push(j(n)); + } + return t; + } + var o = 'string' == typeof e ? A(e) : e; + if (!o) { + i.bbLogger.logError('Slot not defined', e); + var a = new Error('Slot not defined '.concat(e, '.')); + return S.errorReporting.report(a), {}; + } + var s = o.getTargetingMap(), u = {}; + for (var c in s) { + if (Object.prototype.hasOwnProperty.call(s, c)) { + var d = s[c]; + u[c] = '' + d; + } + } + return u; + } + var q = (0, u.hookedFn)('sync', function (t, r, n) { + J(function (o) { + e[t] && (i.bbLogger.logInfo('Setting targeting on slot for '.concat(t, ': ').concat(r, '=').concat(n)), e[t].setTargeting(r, '' + n)); + }); + }); + function G(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; + J(function (n) { + for (var o in t) { + if (Object.prototype.hasOwnProperty.call(t, o)) { + var a = t[o]; + r ? e[r] ? q(r, o, a) : i.bbLogger.logWarn('Slot not available for unit, unable to set targeting', r, t) : Q(o, a); + } + } + }); + } + var W = (0, u.hookedFn)('sync', function () { + J(function (e) { + e.enableServices(); + }); + }); + function H(e) { + r.push(function () { + J(function (t) { + i.bbLogger.atVerbosity(3).logInfo('Clearing slots', e); + var r = Array.isArray(e) ? e.map(function (e) { + return A(e); + }) : A(e); + t.pubads().clear(r); + }); + }); + } + function Y(t) { + J(function (r) { + var o = (0, n.getUnitCollection)(t); + i.bbLogger.atVerbosity(3).logInfo('Destroying slots', o); + var a; + a = o.constructor === Array ? o.map(A) : A(o), r.destroySlots(a); + for (var s = (0, n.getUnits)(), u = 0; u < o.length; u++) { + var c = o[u].code; + e[c] && delete e[c], s[c] && (s[c].displayed = !1, s[c].servicesApplied = !1); + } + }); + } + function K() { + Y(Object.keys(e)); + } + function J(e) { + (0, m.dom)().window.googletag.cmd.push(function () { + e((0, m.dom)().window.googletag); + }); + } + function Q(e, t) { + J(function (r) { + i.bbLogger.logInfo('Setting targeting for page: '.concat(e, '=').concat(t)), r.pubads().setTargeting(e, '' + t); + }); + } + function X(e, t, r) { + Q(t, r), e(t, r); + } + function $(e, t, r, n, i) { + q(t, r, n), e(t, r, n, i); + } + function Z(e, t) { + J(function (e) { + e.pubads().clearTargeting(t); + }), e(t); + } + function ee(t, r, n, i) { + J(function (t) { + if (e[r]) { + for (var i = 0; i < n.length; i++) { + var o = n[i]; + e[r].clearTargeting(o); + } + } + }), t(r, n, i); + } + function te(e, t, r) { + re(t), e(t, r); + } + function re(t) { + J(function (r) { + if (Array.isArray(t)) { + for (var o = 0; o < t.length; o++) { + re(t[o]); + } + } else { + var s = (0, n.getUnits)(), u = s[t].collapseEmptyDiv, c = (0, a.getConfig)('collapseEmptyDivs'); + if ((void 0 !== u || void 0 !== c) && e[t]) { + var d, l = u || c; + if (s[t].isLazyLoaded() && Array.isArray(l) && !0 === l[0] && !0 === l[1] && (i.bbLogger.logInfo('Disabling pre-ad request collapsing. Cannot lazy load and collapse empty div before the ad request', s[t]), l = !0), Array.isArray(l)) { + (d = e[t]).setCollapseEmptyDiv.apply(d, E(l)); + } else { + e[t].setCollapseEmptyDiv(l); + } + } + } + }); + } + function ne(t, r, o) { + if (!Array.isArray(r)) { + var a = (0, n.getUnits)(); + e[r] && a[r].servicesApplied && i.bbLogger.atVerbosity(3).logWarn('Unable to apply size mapping, slot has already been defined', r); + } + t(r, o); + } + function ie(t, r) { + r && J(function (r) { + var o = (0, a.getConfig)(), s = (0, n.getUnits)(); + if (e[t] && !s[t].servicesApplied) { + i.bbLogger.atVerbosity(3).logInfo('Applying Size Mapping to slot '.concat(t), s[t].sizeMappings); + for (var u = r.sizeMapping(), c = o.adjustSlotDefinition && o.adjustSlotDefinition[t] ? o.adjustSlotDefinition[t] : function (e) { + return e; + }, l = (0, d.cloneDeep)(s[t]), f = 0; f < s[t].sizeMappings.length; f++) { + var p = s[t].sizeMappings[f]; + l.sizes = p.sizes; + var g = c(l).sizes; + u.addSize(p.viewport, g); + } + e[t].defineSizeMapping(u.build()); + } else { + e[t] && s[t].servicesApplied && i.bbLogger.atVerbosity(3).logWarn('Unable to apply size mapping, slot has already been defined', t); + } + }); + } + function oe() { + return e; + } + return h.exposureApi.rootScope({ + clearSlots: H, + destroySlots: Y, + destroyAllSlots: K, + getSlot: A + }), h.exposureApi.rootScopeGetters({ + slots: function () { + return oe(); + }, + dfpPath: function () { + return (0, a.getConfig)('dfpPathObj.string'); + }, + dfpPathObj: function () { + return (0, a.getConfig)('dfpPathObj'); + }, + query: function () { + return (0, p.urlQueryAsObject)(); + } + }), { + register: function () { + (0, m.dom)().window.googletag = (0, m.dom)().window.googletag || {}, (0, m.dom)().window.googletag.cmd = (0, m.dom)().window.googletag.cmd || [], setTimeout(function () { + (0, g.renderScript)({ + id: 'googletag-script', + src: '//securepubads.g.doubleclick.net/tag/js/gpt.js', + async: !0 + }); + }, 0), J(function (e) { + for (var t = [ + [ + R.AD_VIEWABLE, + N + ], + [ + R.AD_RENDERED, + k + ], + [ + R.AD_LOADED, + D + ], + [ + R.AD_VISIBILITY_CHANGED, + B + ], + [ + R.AD_REQUESTED, + U + ], + [ + R.AD_RECEIVED, + M + ] + ], r = function (r) { + var i = w(t[r], 2), a = i[0], s = i[1]; + e.pubads().addEventListener(a, function (e) { + var t = (0, n.getUnits)(), r = e.slot.getSlotElementId(); + t[r] && o.eventEmitter.emit([ + a, + s, + ''.concat(r, '.').concat(a), + ''.concat(r, '.').concat(s) + ], t[r], e); + }); + }, i = 0; i < t.length; i++) { + r(i); + } + }), s.setPageTargeting.before(X), s.clearPageTargeting.before(Z), s.setUnitTargeting.before($), s.clearUnitTargeting.before(ee), n.setSizeMappings.before(ne), n.setCollapse.before(te), n.defineUnit.after(b), v.processAdRequest.before(P), v.getAds.before(_), (0, a.getConfig)('dfpPath', function (e) { + var t = function (e) { + var t = function (e) { + var t = e, r = (0, a.getConfig)('dfpPathDevices'); + if ('string' == typeof t) { + var n = t.split('/'), i = n[2].split('-'), o = i[0].match(/^(app|m)/), s = o ? o[0] : ''; + t = (0, l.default)({ + string: t, + network: n[1], + property: i[1], + device: void 0 !== r[s.toLowerCase()] ? r[s.toLowerCase()] : s, + region: i[0].substring(s.length), + pagePath: n.slice(3).join('/') + }, (0, a.getConfig)('dfpPathObj')); + } else { + 'object' === I(t) && ((t = (0, l.default)({}, t, (0, a.getConfig)('dfpPathObj'))).device && void 0 !== r[t.device.toLowerCase()] && (t.device = r[t.device.toLowerCase()]), t.isMobile && (t.device = 'm'), t.isApp && (t.device = 'app'), t.isDesktop && (t.device = '')); + } + return t; + }(e), r = (0, p.urlQueryAsObject)(); + r.adNetwork && (t.network = r.adNetwork); + r.adRegion && (t.region = r.adRegion); + t.string = '/'.concat(t.network, '/').concat(t.device).concat(t.region, '-').concat(t.property), t.pagePath && (t.string += '/'.concat(t.pagePath)); + return t; + }(e); + (0, a.setConfig)('dfpPathObj', t); + }), J(function (e) { + e.pubads().disableInitialLoad(); + }), o.eventEmitter.on(F, function () { + return r.run(); + }); + }, + enableGoogletagServices: W, + getSlots: oe, + getSlot: function (t) { + return e[t]; + }, + setUnitTargeting: q, + defineAndDisplay: T, + gptAction: J, + getSlotTargeting: j, + clearSlots: H, + destroyAllSlots: K, + destroySlots: Y, + name: O.default.MODULES.GOOGLE_PUBLISHER_TAG + }; + }(); + t.gptModuleBase = q; + var G = b.moduleManager.register(q, null); + t.gptModule = G; + }, + function (e, t, r) { + 'use strict'; + r(327)('link', function (e) { + return function (t) { + return e(this, 'a', 'href', t); + }; + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.createBid = function (e, t) { + return new i(e, t); + }; + var n = r(7); + function i(e, t) { + var r = t && t.src || 'client', i = e || 0; + this.bidderCode = t && t.bidder || '', this.width = 0, this.height = 0, this.statusMessage = function () { + switch (i) { + case 0: + return 'Pending'; + case 1: + return 'Bid available'; + case 2: + return 'Bid returned empty or error response'; + case 3: + return 'Bid timed out'; + } + }(), this.adId = n.getUniqueIdentifierStr(), this.requestId = t && t.bidId, this.mediaType = 'banner', this.source = r, this.getStatusCode = function () { + return i; + }, this.getSize = function () { + return this.width + 'x' + this.height; + }; + } + }, + function (e, t, r) { + 'use strict'; + var n = r(47), i = r(105), o = r(38); + e.exports = function (e) { + for (var t = n(this), r = o(t.length), a = arguments.length, s = i(a > 1 ? arguments[1] : void 0, r), u = a > 2 ? arguments[2] : void 0, c = void 0 === u ? r : i(u, r); c > s;) { + t[s++] = e; + } + return t; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.isValidVideoBid = function (e, t) { + var r = (0, i.getBidRequest)(e.requestId, t), n = r && (0, i.deepAccess)(r, 'mediaTypes.video'), o = n && (0, i.deepAccess)(n, 'context'); + return d(e, r, n, o); + }, t.checkVideoBidSetup = t.hasNonVideoBidder = t.videoBidder = t.videoAdUnit = t.INSTREAM = t.OUTSTREAM = void 0; + var n = u(r(87)), i = r(7), o = r(22), a = u(r(31)), s = r(61); + function u(e) { + return e && e.__esModule ? e : { default: e }; + } + t.OUTSTREAM = 'outstream'; + t.INSTREAM = 'instream'; + t.videoAdUnit = function (e) { + var t = 'video' === e.mediaType, r = (0, i.deepAccess)(e, 'mediaTypes.video'); + return t || r; + }; + var c = function (e) { + return (0, a.default)(n.default.videoAdapters, e.bidder); + }; + t.videoBidder = c; + t.hasNonVideoBidder = function (e) { + return e.bids.filter(function (e) { + return !c(e); + }).length; + }; + var d = (0, s.hook)('sync', function (e, t, r, n) { + return !t || r && 'outstream' !== n ? o.config.getConfig('cache.url') || !e.vastXml || e.vastUrl ? !(!e.vastUrl && !e.vastXml) : ((0, i.logError)('\n This bid contains only vastXml and will not work when a prebid cache url is not specified.\n Try enabling prebid cache with pbjs.setConfig({ cache: {url: "..."} });\n '), !1) : 'outstream' !== n || !!(e.renderer || t.renderer || r.renderer); + }, 'checkVideoBidSetup'); + t.checkVideoBidSetup = d; + }, + function (e, t, r) { + e.exports = !r(28) && !r(24)(function () { + return 7 != Object.defineProperty(r(128)('div'), 'a', { + get: function () { + return 7; + } + }).a; + }); + }, + function (e, t, r) { + var n = r(50), i = r(57), o = r(130)(!1), a = r(131)('IE_PROTO'); + e.exports = function (e, t) { + var r, s = i(e), u = 0, c = []; + for (r in s) { + r != a && n(s, r) && c.push(r); + } + for (; t.length > u;) { + n(s, r = t[u++]) && (~o(c, r) || c.push(r)); + } + return c; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(32), i = r(77); + e.exports = function (e, t, r) { + t in e ? n.f(e, t, i(0, r)) : e[t] = r; + }; + }, + function (e, t, r) { + t.f = r(19); + }, + function (e, t, r) { + var n = r(18), i = r(62), o = r(64), a = r(160), s = r(32).f; + e.exports = function (e) { + var t = i.Symbol || (i.Symbol = o ? {} : n.Symbol || {}); + '_' == e.charAt(0) || e in t || s(t, e, { value: a.f(e) }); + }; + }, + function (e, t, r) { + var n = r(67); + e.exports = Array.isArray || function (e) { + return 'Array' == n(e); + }; + }, + function (e, t, r) { + var n = r(18).document; + e.exports = n && n.documentElement; + }, + function (e, t, r) { + var n = r(28), i = r(70), o = r(57), a = r(91).f; + e.exports = function (e) { + return function (t) { + for (var r, s = o(t), u = i(s), c = u.length, d = 0, l = []; c > d;) { + r = u[d++], n && !a.call(s, r) || l.push(e ? [ + r, + s[r] + ] : s[r]); + } + return l; + }; + }; + }, + function (e, t) { + e.exports = function (e, t) { + return { + value: t, + done: !!e + }; + }; + }, + function (e, t, r) { + var n = r(50), i = r(47), o = r(131)('IE_PROTO'), a = Object.prototype; + e.exports = Object.getPrototypeOf || function (e) { + return e = i(e), n(e, o) ? e[o] : 'function' == typeof e.constructor && e instanceof e.constructor ? e.constructor.prototype : e instanceof Object ? a : null; + }; + }, + function (e, t, r) { + var n = r(14), i = r(62), o = r(24); + e.exports = function (e, t) { + var r = (i.Object || {})[e] || Object[e], a = {}; + a[e] = t(r), n(n.S + n.F * o(function () { + r(1); + }), 'Object', a); + }; + }, + function (e, t, r) { + var n = r(69), i = r(68); + e.exports = function (e) { + return function (t, r) { + var o, a, s = String(i(t)), u = n(r), c = s.length; + return u < 0 || u >= c ? e ? '' : void 0 : (o = s.charCodeAt(u)) < 55296 || o > 56319 || u + 1 === c || (a = s.charCodeAt(u + 1)) < 56320 || a > 57343 ? e ? s.charAt(u) : o : e ? s.slice(u, u + 2) : a - 56320 + (o - 55296 << 10) + 65536; + }; + }; + }, + function (e, t) { + var r; + r = function () { + return this; + }(); + try { + r = r || new Function('return this')(); + } catch (e) { + 'object' == typeof window && (r = window); + } + e.exports = r; + }, + function (e, t, r) { + var n = r(136), i = r(68); + e.exports = function (e, t, r) { + if (n(t)) { + throw TypeError('String#' + r + ' doesn\'t accept regex!'); + } + return String(i(e)); + }; + }, + function (e, t, r) { + var n = r(19)('match'); + e.exports = function (e) { + var t = /./; + try { + '/./'[e](t); + } catch (r) { + try { + return t[n] = !1, !'/./'[e](t); + } catch (e) { + } + } + return !0; + }; + }, + function (e, t, r) { + var n = r(138), i = r(139), o = r(240), a = r(185), s = i(function (e) { + return e.push(void 0, o), n(a, void 0, e); + }); + e.exports = s; + }, + function (e, t, r) { + var n = r(111), i = r(174), o = r(248), a = r(250), s = r(71), u = r(93), c = r(183); + e.exports = function e(t, r, d, l, f) { + t !== r && o(r, function (o, u) { + if (f || (f = new n()), s(o)) { + a(t, r, u, d, e, l, f); + } else { + var p = l ? l(c(t, u), o, u + '', t, r, f) : void 0; + void 0 === p && (p = o), i(t, u, p); + } + }, u); + }; + }, + function (e, t, r) { + var n = r(140), i = r(113); + e.exports = function (e, t, r) { + (void 0 !== r && !i(e[t], r) || void 0 === r && !(t in e)) && n(e, t, r); + }; + }, + function (e, t, r) { + (function (e) { + var n = r(176), i = t && !t.nodeType && t, o = i && 'object' == typeof e && e && !e.nodeType && e, a = o && o.exports === i ? n.Buffer : void 0, s = a ? a.allocUnsafe : void 0; + e.exports = function (e, t) { + if (t) { + return e.slice(); + } + var r = e.length, n = s ? s(r) : new e.constructor(r); + return e.copy(n), n; + }; + }.call(this, r(251)(e))); + }, + function (e, t, r) { + var n = r(252), i = 'object' == typeof self && self && self.Object === Object && self, o = n || i || Function('return this')(); + e.exports = o; + }, + function (e, t) { + e.exports = function (e, t) { + var r = -1, n = e.length; + for (t || (t = Array(n)); ++r < n;) { + t[r] = e[r]; + } + return t; + }; + }, + function (e, t, r) { + var n = r(256), i = r(179), o = r(257); + e.exports = function (e) { + return 'function' != typeof e.constructor || o(e) ? {} : n(i(e)); + }; + }, + function (e, t, r) { + var n = r(141)(Object.getPrototypeOf, Object); + e.exports = n; + }, + function (e, t, r) { + var n = r(142), i = r(71); + e.exports = function (e) { + if (!i(e)) { + return !1; + } + var t = n(e); + return '[object Function]' == t || '[object GeneratorFunction]' == t || '[object AsyncFunction]' == t || '[object Proxy]' == t; + }; + }, + function (e, t, r) { + var n = r(142), i = r(179), o = r(115), a = Function.prototype, s = Object.prototype, u = a.toString, c = s.hasOwnProperty, d = u.call(Object); + e.exports = function (e) { + if (!o(e) || '[object Object]' != n(e)) { + return !1; + } + var t = i(e); + if (null === t) { + return !0; + } + var r = c.call(t, 'constructor') && t.constructor; + return 'function' == typeof r && r instanceof r && u.call(r) == d; + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t) { + e.exports = function (e, t) { + if (('constructor' !== t || 'function' != typeof e[t]) && '__proto__' != t) { + return e[t]; + } + }; + }, + function (e, t, r) { + var n = r(140), i = r(113), o = Object.prototype.hasOwnProperty; + e.exports = function (e, t, r) { + var a = e[t]; + o.call(e, t) && i(a, r) && (void 0 !== r || t in e) || n(e, t, r); + }; + }, + function (e, t, r) { + var n = r(173), i = r(186)(function (e, t, r, i) { + n(e, t, r, i); + }); + e.exports = i; + }, + function (e, t, r) { + var n = r(139), i = r(187); + e.exports = function (e) { + return n(function (t, r) { + var n = -1, o = r.length, a = o > 1 ? r[o - 1] : void 0, s = o > 2 ? r[2] : void 0; + for (a = e.length > 3 && 'function' == typeof a ? (o--, a) : void 0, s && i(r[0], r[1], s) && (a = o < 3 ? void 0 : a, o = 1), t = Object(t); ++n < o;) { + var u = r[n]; + u && e(t, u, n, a); + } + return t; + }); + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t, r) { + Object.defineProperty(e, t, { + value: r, + writable: !1 + }); + }, t.readOnlyGetter = function (e, t, r) { + var i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 'Cannot set read-only property '.concat(t); + Object.defineProperty(e, t, { + get: r, + set: function () { + n.bbLogger.logError(i); + } + }); + }, t.hasGetter = function (e, t) { + var r = Object.getOwnPropertyDescriptor(e, t); + return !!r && void 0 !== r.get; + }; + var n = r(8); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : ['desc']; + Array.isArray(t) || (t = [t]); + Array.isArray(r) || (r = [r]); + var n = t.reverse(), o = r.reverse(); + return n.reduce(function (e, t, r) { + return (0, i.default)(e, t, o[r] || 'desc'); + }, e); + }; + var n, i = (n = r(190)) && n.__esModule ? n : { default: n }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + var r, n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 'desc'; + r = 'desc' === n ? function (e, r) { + return e[t] < r[t] ? 1 : r[t] < e[t] ? -1 : 0; + } : function (e, r) { + return e[t] > r[t] ? 1 : r[t] > e[t] ? -1 : 0; + }; + return e.sort(r); + }, r(83); + }, + function (e, t, r) { + var n = r(141)(Object.keys, Object); + e.exports = n; + }, + function (e, t) { + var r = Object.prototype.toString; + e.exports = function (e) { + return r.call(e); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.gateway = void 0, r(1), r(3), r(0), r(54); + var n, i = r(55), o = (n = r(48)) && n.__esModule ? n : { default: n }, a = r(8); + t.gateway = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], r = e, n = {}, s = { all: [] }; + if (t.length > 0) { + for (var u = 0; u < t.length; u++) { + var c = t[u]; + d(c); + } + } + function d(e) { + n[e] = !1, s[e] = []; + } + function l(e) { + void 0 !== n[e] && (n[e] = !0, a.bbLogger.atVerbosity(4).logInfo('Opening gate '.concat(r, '.').concat(e)), p(e), -1 === Object.values(n).indexOf(!1) && p('all')); + } + function f(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'all', u = t || 'all'; + if ('all' !== u && void 0 === n[u] || 'all' === u && (0, o.default)(n) || 'all' !== u && void 0 === s[u] || !0 === n[u]) { + return a.bbLogger.atVerbosity(4).logInfo('Running Callback '.concat(r, '.').concat(u)), void (0, i.makeSafe)(function () { + return e(); + }); + } + s[u].push(e); + } + function p() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'all'; + if (s[e]) { + for (var t = function (t) { + var r = s[e][t]; + (0, i.makeSafe)(function () { + return r(); + }); + }, r = 0; r < s[e].length; r++) { + t(r); + } + s[e] = []; + } + } + function g() { + for (var e in n) { + n.hasOwnProperty(e) && (n[e] = !1); + } + } + function m(e) { + return !1 !== n[e]; + } + return { + onOpen: f, + register: d, + open: l, + getGates: function () { + return n; + }, + isOpen: m, + reset: g, + name: r + }; + }; + }, + function (e, t) { + !function (t) { + 'use strict'; + var r = Object.prototype, n = r.hasOwnProperty, i = 'function' == typeof Symbol ? Symbol : {}, o = i.iterator || '@@iterator', a = i.asyncIterator || '@@asyncIterator', s = i.toStringTag || '@@toStringTag', u = 'object' == typeof e, c = t.regeneratorRuntime; + if (c) { + u && (e.exports = c); + } else { + (c = t.regeneratorRuntime = u ? e.exports : {}).wrap = m; + var d = {}, l = {}; + l[o] = function () { + return this; + }; + var f = Object.getPrototypeOf, p = f && f(f(A([]))); + p && p !== r && n.call(p, o) && (l = p); + var g = h.prototype = b.prototype = Object.create(l); + y.prototype = g.constructor = h, h.constructor = y, h[s] = y.displayName = 'GeneratorFunction', c.isGeneratorFunction = function (e) { + var t = 'function' == typeof e && e.constructor; + return !!t && (t === y || 'GeneratorFunction' === (t.displayName || t.name)); + }, c.mark = function (e) { + return Object.setPrototypeOf ? Object.setPrototypeOf(e, h) : (e.__proto__ = h, s in e || (e[s] = 'GeneratorFunction')), e.prototype = Object.create(g), e; + }, c.awrap = function (e) { + return { __await: e }; + }, S(O.prototype), O.prototype[a] = function () { + return this; + }, c.AsyncIterator = O, c.async = function (e, t, r, n) { + var i = new O(m(e, t, r, n)); + return c.isGeneratorFunction(t) ? i : i.next().then(function (e) { + return e.done ? e.value : i.next(); + }); + }, S(g), g[s] = 'Generator', g[o] = function () { + return this; + }, g.toString = function () { + return '[object Generator]'; + }, c.keys = function (e) { + var t = []; + for (var r in e) { + t.push(r); + } + return t.reverse(), function r() { + for (; t.length;) { + var n = t.pop(); + if (n in e) { + return r.value = n, r.done = !1, r; + } + } + return r.done = !0, r; + }; + }, c.values = A, w.prototype = { + constructor: w, + reset: function (e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = 'next', this.arg = undefined, this.tryEntries.forEach(I), !e) { + for (var t in this) { + 't' === t.charAt(0) && n.call(this, t) && !isNaN(+t.slice(1)) && (this[t] = undefined); + } + } + }, + stop: function () { + this.done = !0; + var e = this.tryEntries[0].completion; + if ('throw' === e.type) { + throw e.arg; + } + return this.rval; + }, + dispatchException: function (e) { + if (this.done) { + throw e; + } + var t = this; + function r(r, n) { + return a.type = 'throw', a.arg = e, t.next = r, n && (t.method = 'next', t.arg = undefined), !!n; + } + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var o = this.tryEntries[i], a = o.completion; + if ('root' === o.tryLoc) { + return r('end'); + } + if (o.tryLoc <= this.prev) { + var s = n.call(o, 'catchLoc'), u = n.call(o, 'finallyLoc'); + if (s && u) { + if (this.prev < o.catchLoc) { + return r(o.catchLoc, !0); + } + if (this.prev < o.finallyLoc) { + return r(o.finallyLoc); + } + } else if (s) { + if (this.prev < o.catchLoc) { + return r(o.catchLoc, !0); + } + } else { + if (!u) { + throw new Error('try statement without catch or finally'); + } + if (this.prev < o.finallyLoc) { + return r(o.finallyLoc); + } + } + } + } + }, + abrupt: function (e, t) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var i = this.tryEntries[r]; + if (i.tryLoc <= this.prev && n.call(i, 'finallyLoc') && this.prev < i.finallyLoc) { + var o = i; + break; + } + } + o && ('break' === e || 'continue' === e) && o.tryLoc <= t && t <= o.finallyLoc && (o = null); + var a = o ? o.completion : {}; + return a.type = e, a.arg = t, o ? (this.method = 'next', this.next = o.finallyLoc, d) : this.complete(a); + }, + complete: function (e, t) { + if ('throw' === e.type) { + throw e.arg; + } + return 'break' === e.type || 'continue' === e.type ? this.next = e.arg : 'return' === e.type ? (this.rval = this.arg = e.arg, this.method = 'return', this.next = 'end') : 'normal' === e.type && t && (this.next = t), d; + }, + finish: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var r = this.tryEntries[t]; + if (r.finallyLoc === e) { + return this.complete(r.completion, r.afterLoc), I(r), d; + } + } + }, + catch: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var r = this.tryEntries[t]; + if (r.tryLoc === e) { + var n = r.completion; + if ('throw' === n.type) { + var i = n.arg; + I(r); + } + return i; + } + } + throw new Error('illegal catch attempt'); + }, + delegateYield: function (e, t, r) { + return this.delegate = { + iterator: A(e), + resultName: t, + nextLoc: r + }, 'next' === this.method && (this.arg = undefined), d; + } + }; + } + function m(e, t, r, n) { + var i = t && t.prototype instanceof b ? t : b, o = Object.create(i.prototype), a = new w(n || []); + return o._invoke = function (e, t, r) { + var n = 'suspendedStart'; + return function (i, o) { + if ('executing' === n) { + throw new Error('Generator is already running'); + } + if ('completed' === n) { + if ('throw' === i) { + throw o; + } + return T(); + } + for (r.method = i, r.arg = o;;) { + var a = r.delegate; + if (a) { + var s = _(a, r); + if (s) { + if (s === d) { + continue; + } + return s; + } + } + if ('next' === r.method) { + r.sent = r._sent = r.arg; + } else if ('throw' === r.method) { + if ('suspendedStart' === n) { + throw n = 'completed', r.arg; + } + r.dispatchException(r.arg); + } else { + 'return' === r.method && r.abrupt('return', r.arg); + } + n = 'executing'; + var u = v(e, t, r); + if ('normal' === u.type) { + if (n = r.done ? 'completed' : 'suspendedYield', u.arg === d) { + continue; + } + return { + value: u.arg, + done: r.done + }; + } + 'throw' === u.type && (n = 'completed', r.method = 'throw', r.arg = u.arg); + } + }; + }(e, r, a), o; + } + function v(e, t, r) { + try { + return { + type: 'normal', + arg: e.call(t, r) + }; + } catch (e) { + return { + type: 'throw', + arg: e + }; + } + } + function b() { + } + function y() { + } + function h() { + } + function S(e) { + [ + 'next', + 'throw', + 'return' + ].forEach(function (t) { + e[t] = function (e) { + return this._invoke(t, e); + }; + }); + } + function O(e) { + var t; + this._invoke = function (r, i) { + function o() { + return new Promise(function (t, o) { + !function t(r, i, o, a) { + var s = v(e[r], e, i); + if ('throw' !== s.type) { + var u = s.arg, c = u.value; + return c && 'object' == typeof c && n.call(c, '__await') ? Promise.resolve(c.__await).then(function (e) { + t('next', e, o, a); + }, function (e) { + t('throw', e, o, a); + }) : Promise.resolve(c).then(function (e) { + u.value = e, o(u); + }, a); + } + a(s.arg); + }(r, i, t, o); + }); + } + return t = t ? t.then(o, o) : o(); + }; + } + function _(e, t) { + var r = e.iterator[t.method]; + if (undefined === r) { + if (t.delegate = null, 'throw' === t.method) { + if (e.iterator.return && (t.method = 'return', t.arg = undefined, _(e, t), 'throw' === t.method)) { + return d; + } + t.method = 'throw', t.arg = new TypeError('The iterator does not provide a \'throw\' method'); + } + return d; + } + var n = v(r, e.iterator, t.arg); + if ('throw' === n.type) { + return t.method = 'throw', t.arg = n.arg, t.delegate = null, d; + } + var i = n.arg; + return i ? i.done ? (t[e.resultName] = i.value, t.next = e.nextLoc, 'return' !== t.method && (t.method = 'next', t.arg = undefined), t.delegate = null, d) : i : (t.method = 'throw', t.arg = new TypeError('iterator result is not an object'), t.delegate = null, d); + } + function E(e) { + var t = { tryLoc: e[0] }; + 1 in e && (t.catchLoc = e[1]), 2 in e && (t.finallyLoc = e[2], t.afterLoc = e[3]), this.tryEntries.push(t); + } + function I(e) { + var t = e.completion || {}; + t.type = 'normal', delete t.arg, e.completion = t; + } + function w(e) { + this.tryEntries = [{ tryLoc: 'root' }], e.forEach(E, this), this.reset(!0); + } + function A(e) { + if (e) { + var t = e[o]; + if (t) { + return t.call(e); + } + if ('function' == typeof e.next) { + return e; + } + if (!isNaN(e.length)) { + var r = -1, i = function t() { + for (; ++r < e.length;) { + if (n.call(e, r)) { + return t.value = e[r], t.done = !1, t; + } + } + return t.value = undefined, t.done = !0, t; + }; + return i.next = i; + } + } + return { next: T }; + } + function T() { + return { + value: undefined, + done: !0 + }; + } + }(function () { + return this; + }() || Function('return this')()); + }, + function (e, t, r) { + var n = r(27); + e.exports = function (e, t, r, i) { + try { + return i ? t(n(r)[0], r[1]) : t(r); + } catch (t) { + var o = e.return; + throw void 0 !== o && n(o.call(e)), t; + } + }; + }, + function (e, t, r) { + var n, i, o, a = r(53), s = r(197), u = r(163), c = r(128), d = r(18), l = d.process, f = d.setImmediate, p = d.clearImmediate, g = d.MessageChannel, m = d.Dispatch, v = 0, b = {}, y = function () { + var e = +this; + if (b.hasOwnProperty(e)) { + var t = b[e]; + delete b[e], t(); + } + }, h = function (e) { + y.call(e.data); + }; + f && p || (f = function (e) { + for (var t = [], r = 1; arguments.length > r;) { + t.push(arguments[r++]); + } + return b[++v] = function () { + s('function' == typeof e ? e : Function(e), t); + }, n(v), v; + }, p = function (e) { + delete b[e]; + }, 'process' == r(67)(l) ? n = function (e) { + l.nextTick(a(y, e, 1)); + } : m && m.now ? n = function (e) { + m.now(a(y, e, 1)); + } : g ? (o = (i = new g()).port2, i.port1.onmessage = h, n = a(o.postMessage, o, 1)) : d.addEventListener && 'function' == typeof postMessage && !d.importScripts ? (n = function (e) { + d.postMessage(e + '', '*'); + }, d.addEventListener('message', h, !1)) : n = 'onreadystatechange' in c('script') ? function (e) { + u.appendChild(c('script')).onreadystatechange = function () { + u.removeChild(this), y.call(e); + }; + } : function (e) { + setTimeout(a(y, e, 1), 0); + }), e.exports = { + set: f, + clear: p + }; + }, + function (e, t) { + e.exports = function (e, t, r) { + var n = void 0 === r; + switch (t.length) { + case 0: + return n ? e() : e.call(r); + case 1: + return n ? e(t[0]) : e.call(r, t[0]); + case 2: + return n ? e(t[0], t[1]) : e.call(r, t[0], t[1]); + case 3: + return n ? e(t[0], t[1], t[2]) : e.call(r, t[0], t[1], t[2]); + case 4: + return n ? e(t[0], t[1], t[2], t[3]) : e.call(r, t[0], t[1], t[2], t[3]); + } + return e.apply(r, t); + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(65); + function i(e) { + var t, r; + this.promise = new e(function (e, n) { + if (void 0 !== t || void 0 !== r) { + throw TypeError('Bad Promise constructor'); + } + t = e, r = n; + }), this.resolve = n(t), this.reject = n(r); + } + e.exports.f = function (e) { + return new i(e); + }; + }, + function (e, t, r) { + r(28) && 'g' != /./g.flags && r(32).f(RegExp.prototype, 'flags', { + configurable: !0, + get: r(110) + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(55); + e.exports = { + percentageRunner: function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + 'boolean' == typeof e && e ? t() : 'number' == typeof e ? 100 * Math.random() <= e && t() : 'function' == typeof e ? (0, n.makeSafe)(function () { + return e(); + }, null, function () { + return r; + }) && t() : r && t(); + }, + percentageShouldRun: function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + return 'boolean' == typeof e && e ? e : 'number' == typeof e ? 100 * Math.random() <= e : 'function' == typeof e ? (0, n.makeSafe)(function () { + return e(); + }, null, function () { + return t; + }) : t; + } + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(28), i = r(70), o = r(106), a = r(91), s = r(47), u = r(129), c = Object.assign; + e.exports = !c || r(24)(function () { + var e = {}, t = {}, r = Symbol(), n = 'abcdefghijklmnopqrst'; + return e[r] = 7, n.split('').forEach(function (e) { + t[e] = e; + }), 7 != c({}, e)[r] || Object.keys(c({}, t)).join('') != n; + }) ? function (e, t) { + for (var r = s(e), c = arguments.length, d = 1, l = o.f, f = a.f; c > d;) { + for (var p, g = u(arguments[d++]), m = l ? i(g).concat(l(g)) : i(g), v = m.length, b = 0; v > b;) { + p = m[b++], n && !f.call(g, p) || (r[p] = g[p]); + } + } + return r; + } : c; + }, + function (e, t, r) { + var n = r(289), i = r(115); + e.exports = function e(t, r, o, a, s) { + return t === r || (null == t || null == r || !i(t) && !i(r) ? t != t && r != r : n(t, r, o, a, e, s)); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getDate = function (e) { + return void 0 !== e.getTime ? e : new Date(i(e)); + }, t.getTimestamp = i, t.getExpiration = function (e) { + var t = new Date().getTime(), r = e.expires || e || {}, n = r.expiresTimestamp; + n || (n = i(e.at || e.expires || e), r.expiresTimestamp = n); + return r.fromNowMs = n - t, r.isExpired = r.fromNowMs <= 0, r; + }, t.getTimezoneHourOffset = o, t.getMidnight = a, r(43); + var n = { + seconds: { + isMatch: function (e) { + return [ + 's', + 'sec', + 'seconds', + 'secs' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 1000 * e; + } + }, + minutes: { + isMatch: function (e) { + return [ + 'm', + 'min', + 'minutes', + 'mins' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 60 * e * 1000; + } + }, + hours: { + isMatch: function (e) { + return [ + 'h', + 'hr', + 'hours', + 'hrs' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 60 * e * 60 * 1000; + } + }, + days: { + isMatch: function (e) { + return [ + 'd', + 'day', + 'days' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 24 * e * 60 * 60 * 1000; + } + }, + weeks: { + isMatch: function (e) { + return [ + 'wk', + 'wks', + 'w', + 'week', + 'weeks' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 7 * e * 24 * 60 * 60 * 1000; + } + }, + months: { + isMatch: function (e) { + return [ + 'M', + 'mo', + 'mos', + 'Mo', + 'Mos', + 'month', + 'months' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 30 * e * 7 * 24 * 60 * 60 * 1000; + } + }, + years: { + isMatch: function (e) { + return [ + 'y', + 'yr', + 'years', + 'year', + 'yrs' + ].indexOf(e) >= 0; + }, + getMsAmount: function (e) { + return 12 * e * 30 * 7 * 24 * 60 * 60 * 1000; + } + }, + midnight: { + isMatch: function (e) { + return 'midnight' === e; + }, + absolute: !0, + getMsAmount: function (e) { + return a().getTime(); + } + }, + midnightEst: { + isMatch: function (e) { + return 'midnightEst' === e; + }, + absolute: !0, + getMsAmount: function (e) { + return a(-4).getTime(); + } + } + }; + function i(e) { + return void 0 !== e.getTime ? e.getTime() : 'string' == typeof e ? function (e) { + for (var t = e.match(/(\d+)/), r = e.match(/(\D+)/gm), i = new Date().getTime(), o = 0, a = 0; a < r.length; a++) { + var s = r[a], u = a - o; + for (var c in n) { + if (Object.prototype.hasOwnProperty.call(n, c)) { + var d = n[c]; + if (d.isMatch(s)) { + d.absolute ? (i = d.getMsAmount(t && t[u] ? parseInt(t[u]) : null), o++) : i += d.getMsAmount(t && t[u] ? parseInt(t[u]) : null); + break; + } + } + } + } + return i; + }(e) : 'number' == typeof e && e >= 1500000000000 ? e : 'number' == typeof e ? new Date().getTime() + e : void 0; + } + function o() { + var e = new Date(); + return e.getUTCHours() < e.getHours() ? e.getHours() - (e.getUTCHours() + 24) : e.getHours() - e.getUTCHours(); + } + function a() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : o(), t = new Date(); + return e < 0 ? t.setUTCHours(Math.abs(e), 0, 0, 0) : t.setUTCHours(e, 0, 0, 0), t.setDate(t.getDate() + 1), t; + } + }, + function (e, t, r) { + 'use strict'; + var n = r(18), i = r(14), o = r(41), a = r(85), s = r(78), u = r(117), c = r(84), d = r(23), l = r(24), f = r(119), p = r(79), g = r(147); + e.exports = function (e, t, r, m, v, b) { + var y = n[e], h = y, S = v ? 'set' : 'add', O = h && h.prototype, _ = {}, E = function (e) { + var t = O[e]; + o(O, e, 'delete' == e || 'has' == e ? function (e) { + return !(b && !d(e)) && t.call(this, 0 === e ? 0 : e); + } : 'get' == e ? function (e) { + return b && !d(e) ? void 0 : t.call(this, 0 === e ? 0 : e); + } : 'add' == e ? function (e) { + return t.call(this, 0 === e ? 0 : e), this; + } : function (e, r) { + return t.call(this, 0 === e ? 0 : e, r), this; + }); + }; + if ('function' == typeof h && (b || O.forEach && !l(function () { + new h().entries().next(); + }))) { + var I = new h(), w = I[S](b ? {} : -0, 1) != I, A = l(function () { + I.has(1); + }), T = f(function (e) { + new h(e); + }), x = !b && l(function () { + for (var e = new h(), t = 5; t--;) { + e[S](t, t); + } + return !e.has(-0); + }); + T || ((h = t(function (t, r) { + c(t, h, e); + var n = g(new y(), t, h); + return null != r && u(r, v, n[S], n), n; + })).prototype = O, O.constructor = h), (A || x) && (E('delete'), E('has'), v && E('get')), (x || w) && E(S), b && O.clear && delete O.clear; + } else { + h = m.getConstructor(t, e, v, S), a(h.prototype, r), s.NEED = !0; + } + return p(h, e), _[e] = h, i(i.G + i.W + i.F * (h != y), _), b || m.setStrong(h, e, v), h; + }; + }, + function (e, t, r) { + var n = r(23), i = r(27), o = function (e, t) { + if (i(e), !n(t) && null !== t) { + throw TypeError(t + ': can\'t set as prototype!'); + } + }; + e.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? function (e, t, n) { + try { + (n = r(53)(Function.call, r(90).f(Object.prototype, '__proto__').set, 2))(e, []), t = !(e instanceof Array); + } catch (e) { + t = !0; + } + return function (e, r) { + return o(e, r), t ? e.__proto__ = r : n(e, r), e; + }; + }({}, !1) : void 0), + check: o + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.reduceMerger = m, t.createReduceMerger = function (e) { + var t = e || []; + return { + addConfig: function (e) { + var r = e; + null != r && (Array.isArray(r) || (r = [e]), t = Array.isArray(t) ? [].concat(s(t), s(r)) : [t].concat(s(r))); + }, + processObject: function () { + return m(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t, arguments.length > 1 ? arguments[1] : void 0); + }, + getMergeSet: function () { + return t; + } + }; + }, r(9), r(11), r(6), r(13), r(4), r(17), r(2), r(1), r(3), r(0), r(5); + var n = r(55), i = a(r(29)), o = a(r(48)); + function a(e) { + return e && e.__esModule ? e : { default: e }; + } + function s(e) { + return function (e) { + if (Array.isArray(e)) { + return u(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return u(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return u(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function u(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function c(e) { + return (c = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function d(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function l(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? d(Object(r), !0).forEach(function (t) { + f(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : d(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function f(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function p(e, t) { + if (null == e) { + return {}; + } + var r, n, i = function (e, t) { + if (null == e) { + return {}; + } + var r, n, i = {}, o = Object.keys(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || (i[r] = e[r]); + } + return i; + }(e, t); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || Object.prototype.propertyIsEnumerable.call(e, r) && (i[r] = e[r]); + } + } + return i; + } + var g = { + overwrite: !1, + arguments: [] + }; + function m(e, t, r) { + var a = l(l({}, g), r), u = a.overwrite, d = p(a, ['overwrite']), f = e; + if (null === f) { + f = null; + } else if (Array.isArray(t)) { + for (var v = function (e) { + var r = t[e]; + return null === (f = (0, n.makeSafe)(function () { + return m(f, r, d); + })) ? 'break' : void 0 === f ? (f = void 0, 'break') : void 0; + }, b = 0; b < t.length; b++) { + if ('break' === v(b)) { + break; + } + } + } else if ('object' === c(t) && u) { + f = t; + } else if ('object' === c(t)) { + f = (0, i.default)({}, f, t); + } else if ('function' == typeof t) { + var y = (0, n.makeSafe)(function () { + return t.apply(void 0, [f].concat(s(d.arguments || []))); + }); + f = Array.isArray(y) && !(0, o.default)(f) ? [f].concat(s(y)) : y; + } + return f; + } + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.localStorageEngine = void 0, r(17), r(2), r(1), r(3), r(0), r(5); + var n, i = r(39), o = r(12), a = r(96), s = r(8), u = (n = r(29)) && n.__esModule ? n : { default: n }; + function c(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function d(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? c(Object(r), !0).forEach(function (t) { + l(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : c(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function l(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var f = function (e) { + return e; + }, p = function (e) { + return e; + }, g = function () { + const $___old_55c08df60f42ddb1 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_55c08df60f42ddb1) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + var e = (0, a.richObject)({}), t = void 0 !== (0, o.dom)().window.localStorage, r = (0, o.dom)().window.localStorage, n = (0, i.hookedFn)('sync', function (r) { + if (t && r) { + var n = e.getMeta(); + try { + c('_BB.ls', f(JSON.stringify({ + value: r, + meta: n + }))); + } catch (e) { + s.bbLogger.logInfo('Unable to set value for localStorage', { + value: r, + meta: n + }); + } + } + }), c = (0, i.hookedFn)('sync', function (e, n) { + t && n && r.setItem(e, n); + }), l = (0, i.hookedFn)('sync', function () { + if (t) { + var r = p(g('_BB.ls')); + if (r) { + var n = JSON.parse(r); + for (var i in n.value) { + if (n.value.hasOwnProperty(i)) { + var o = n.value[i], a = n.meta[i]; + e.setValue(i, o, d({ id: 'localStorageUpdate' }, a)); + } + } + } + } + return null; + }), g = (0, i.hookedFn)('sync', function (e) { + return t ? r.getItem(e) : null; + }); + function m() { + var t = l(); + t && (e.setValue('*', t.value, { id: 'localStorageUpdate' }), e.setMeta(t.meta)); + } + return { + name: 'localStorage', + async: !1, + setup: function () { + m(), e.getValue('*', function (e, t) { + t && 'localStorageUpdate' === t.id || n(e); + }), (0, o.dom)().window.addEventListener('storage', function (e) { + '_BB.ls' === e.key && m(); + }); + }, + setValue: function (t, r, n) { + var i = n; + if (i) { + var o = { expires: { id: 'ls.'.concat(t) } }; + i = (0, u.default)(i, o); + } + e.setValue(t, r, i); + }, + getValue: function () { + return e.getValue.apply(e, arguments); + }, + deleteKey: function (t) { + return e.deleteKey(t); + }, + setLs: n, + getLs: l, + raw: { + getValue: g, + setValue: c, + deleteKey: function (e) { + t && r.removeItem(e); + } + } + }; + }.apply(this, arguments); + } finally { + if ($___old_55c08df60f42ddb1) + ({}.constructor.defineProperty(window, 'localStorage', $___old_55c08df60f42ddb1)); + } + }(); + t.localStorageEngine = g; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.cookieStorageEngine = void 0, r(17), r(1), r(3), r(5), r(4), r(2), r(11), r(0), r(43); + var n = r(39), i = r(15), o = r(96), a = p(r(148)), s = p(r(34)), u = p(r(29)), c = p(r(305)), d = r(203), l = r(8), f = p(r(56)); + function p(e) { + return e && e.__esModule ? e : { default: e }; + } + function g(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function m(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? g(Object(r), !0).forEach(function (t) { + v(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : g(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function v(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function b(e) { + return (b = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var y, h, S, O, _ = (y = (0, o.richObject)({}), h = a.default.cookie, S = (0, n.hookedFn)('sync', function (e, t, r) { + if (e) { + var n = (0, s.default)(h, e); + if (!n || !n.readOnly) { + var o = n ? n.cookieName : e, a = t; + n && n.serialize ? n.serialize.match(t) && (a = n.serialize.process(t)) : a = 'object' === b(a) ? JSON.stringify(a) : a; + var u = (0, i.getConfig)('targeting.cookie.setters.'.concat(o)); + u ? u(o, a, r.expires, r.path, r.domain) : (l.bbLogger.atVerbosity(3).logInfo('set cookie key='.concat(o, ' value=').concat(a), r), c.default.set(o, a, r), t && y.setValue(e, t, { id: 'internalSet' })); + } + } + }), O = (0, n.hookedFn)('sync', function (e) { + if (e) { + var t = (0, s.default)(h, e), r = t ? t.cookieName : e, n = (0, i.getConfig)('targeting.cookie.getters.'.concat(r)); + if (n) { + return n(r); + } + var o = c.default.get(r); + return t && t.deserialize && t.deserialize.match(o) && (o = t.deserialize.process(o)), l.bbLogger.atVerbosity(3).logInfo('get cookie key='.concat(r, ' value='), o), o && y.setValue(e, o, { id: 'internalSet' }), o; + } + }), { + name: 'cookie', + async: !1, + setup: function () { + (0, i.getConfig)('cookie', function (e) { + h = e, function () { + var e = (0, f.default)(h, ['defaultOptions']); + for (var t in e) { + Object.prototype.hasOwnProperty.call(e, t) && O(t); + } + }(); + }); + }, + setValue: function (e, t, r) { + var n = r; + if (n) { + var i = { expires: { id: 'cookies.'.concat(e) } }; + n = (0, u.default)(n, i); + } + y.setValue(e, t, n), S(e, t, function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : y.getMeta(), r = (0, s.default)(h, e), n = (0, u.default)({}, (0, s.default)(r, 'defaultOptions', {}), h.defaultOptions, { + expires: null, + path: null, + domain: null + }), i = t[e] || {}; + return n.expires && '[object Date]' !== Object.prototype.toString.call(n.expires) && (n.expires = (0, d.getDate)(n.expires)), i.expires && (i.expires = new Date(i.expires)), m(m({}, n), i); + }(e)); + }, + getValue: function () { + return y.getValue.apply(y, arguments) || O.apply(void 0, arguments); + }, + setCookie: S, + getCookie: O, + deleteCookie: function (e, t) { + var r = (0, s.default)(h, e), n = r ? r.cookieName : e, o = (0, i.getConfig)('targeting.cookie.deleters.'.concat(n)); + o ? o(n, t.expires, t.path, t.domain) : (c.default.remove(n, t), y.deleteKey(e, { id: 'internalSet' })); + }, + raw: { + getValue: O, + setValue: S + } + }); + t.cookieStorageEngine = _; + }, + function (e, t, r) { + var n = r(311), i = r(312); + e.exports = function (e, t) { + return e === t || n(e, t, i(t)); + }; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return function (e) { + if (Array.isArray(e)) { + return i(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return i(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return i(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function i(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.chunk = void 0, r(9), r(11), r(0), r(6), r(13), r(1), r(4), r(2); + t.chunk = function (e, t) { + return e.reduce(function (e, r, i) { + return i % t == 0 ? [].concat(n(e), [[r]]) : [].concat(n(e.slice(0, -1)), [[].concat(n(e.slice(-1)[0]), [r])]); + }, []); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.clientInfo = void 0, r(17), r(2), r(1), r(3), r(5), r(95), r(0); + var n = f(r(48)), i = r(21), o = r(15), a = r(72), s = r(35), u = r(8), c = r(122), d = r(42), l = f(r(51)); + function f(e) { + return e && e.__esModule ? e : { default: e }; + } + function p(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function g(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? p(Object(r), !0).forEach(function (t) { + m(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : p(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function m(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var v = function () { + var e; + function t() { + var t = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; + return new Promise(function (i, a) { + var c = (0, o.getConfig)('clientInfo.data'); + if ((0, n.default)(c)) { + var p = (0, o.getConfig)('clientInfo.data', function (e) { + p(), i(e); + }); + } else { + i((0, s.cloneDeep)(c)); + } + f(t).then(function (t) { + return e = null, t; + }).then(function (e) { + r(e); + }).catch(function (e) { + u.bbLogger.logError(e); + var t = new Error(JSON.stringify(e, l.default)); + d.errorReporting.report(t), r({ + country: 'us', + connection: 'mobile' + }); + }); + }); + } + function r(e) { + (0, o.setConfig)('clientInfo', g(g({}, (0, o.getConfig)('clientInfo')), {}, { data: g(g({}, e), {}, { country: a.features.getValue('countryCode') || e.country }) })); + } + function f(t) { + var r = c.api.createAbort(); + return (e = c.api.get('client-info', { + useVersion: !1, + signal: r.signal, + abortHandler: r + })).geoOnly = t, e.abort = r.abort.bind(r), e; + } + return i.exposureApi.expose({ getClientInfo: t }), (0, o.getConfig)('clientInfo.data.country', function () { + e && e.geoOnly && (u.bbLogger.logInfo('Aborting Inflight ClientInfo request'), e.abort()); + }), { + getInfo: t, + getCountryCode: function () { + return (0, o.getConfig)('clientInfo.data.country') ? Promise.resolve((0, o.getConfig)('clientInfo.data.country')) : t(!0).then(function (e) { + return e.country; + }); + } + }; + }(); + t.clientInfo = v; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.elementSort = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'y', r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : i.bbLogger, o = Array.from(e).some(function (e) { + var t = e.element || e; + return !t || !t.style || 'none' === t.style.display; + }); + if (o) { + return r.logMessage('Element collection has undefined or elements with display: none; unable to apply element sort.', e), e; + } + var a = (0, n.dom)().window.pageYOffset || (0, n.dom)().window.document.documentElement.scrollTop; + return e.sort(function (e, r) { + var n = e.element || e, i = r.element || r, o = 'y' === t ? n.getBoundingClientRect().top : n.getBoundingClientRect().left, s = 'y' === t ? i.getBoundingClientRect().top : i.getBoundingClientRect().left; + return o - a - (s - a) > 0 ? 1 : -1; + }); + }, r(83), r(6), r(13); + var n = r(12), i = r(8); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e) { + var t = e; + return { + callBids: function () { + }, + setBidderCode: function (e) { + t = e; + }, + getBidderCode: function () { + return t; + } + }; + }; + }, + function (e, t, r) { + r(333)('Uint8', 1, function (e) { + return function (t, r, n) { + return e(this, t, r, n); + }; + }); + }, + function (e, t, r) { + for (var n, i = r(18), o = r(46), a = r(63), s = a('typed_array'), u = a('view'), c = !(!i.ArrayBuffer || !i.DataView), d = c, l = 0, f = 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'.split(','); l < 9;) { + (n = i[f[l++]]) ? (o(n.prototype, s, !0), o(n.prototype, u, !0)) : d = !1; + } + e.exports = { + ABV: c, + CONSTR: d, + TYPED: s, + VIEW: u + }; + }, + function (e, t, r) { + var n = r(69), i = r(38); + e.exports = function (e) { + if (void 0 === e) { + return 0; + } + var t = n(e), r = i(t); + if (t !== r) { + throw RangeError('Wrong length!'); + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getPriceBucketString = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 1, n = parseFloat(e); + isNaN(n) && (n = ''); + return { + low: '' === n ? '' : l(e, a, r), + med: '' === n ? '' : l(e, s, r), + high: '' === n ? '' : l(e, u, r), + auto: '' === n ? '' : l(e, d, r), + dense: '' === n ? '' : l(e, c, r), + custom: '' === n ? '' : l(e, t, r) + }; + }, t.isValidPriceConfig = f, r(40); + var n, i = (n = r(37)) && n.__esModule ? n : { default: n }; + var o = r(7), a = { + buckets: [{ + max: 5, + increment: 0.5 + }] + }, s = { + buckets: [{ + max: 20, + increment: 0.1 + }] + }, u = { + buckets: [{ + max: 20, + increment: 0.01 + }] + }, c = { + buckets: [ + { + max: 3, + increment: 0.01 + }, + { + max: 8, + increment: 0.05 + }, + { + max: 20, + increment: 0.5 + } + ] + }, d = { + buckets: [ + { + max: 5, + increment: 0.05 + }, + { + max: 10, + increment: 0.1 + }, + { + max: 20, + increment: 0.5 + } + ] + }; + function l(e, t, r) { + var n = ''; + if (!f(t)) { + return n; + } + var o = t.buckets.reduce(function (e, t) { + return e.max > t.max ? e : t; + }, { max: 0 }), a = 0, s = (0, i.default)(t.buckets, function (t) { + if (e > o.max * r) { + var i = t.precision; + void 0 === i && (i = 2), n = (t.max * r).toFixed(i); + } else { + if (e <= t.max * r && e >= a * r) { + return t.min = a, t; + } + a = t.max; + } + }); + return s && (n = function (e, t, r) { + var n = void 0 !== t.precision ? t.precision : 2, i = t.increment * r, o = t.min * r, a = Math.pow(10, n + 2), s = (e * a - o * a) / (i * a), u = Math.floor(s) * i + o; + return (u = Number(u.toFixed(10))).toFixed(n); + }(e, s, r)), n; + } + function f(e) { + if (o.isEmpty(e) || !e.buckets || !Array.isArray(e.buckets)) { + return !1; + } + var t = !0; + return e.buckets.forEach(function (e) { + e.max && e.increment || (t = !1); + }), t; + } + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.setSizeConfig = c, t.getLabels = function (e, t) { + if (e.labelAll) { + return { + labelAll: !0, + labels: e.labelAll, + activeLabels: t + }; + } + return { + labelAll: !1, + labels: e.labelAny, + activeLabels: t + }; + }, t.sizeSupported = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : u, r = d(t); + if (!r.shouldFilter) { + return !0; + } + return !!r.sizesSupported[e]; + }, t.resolveStatus = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = e.labels, r = void 0 === t ? [] : t, n = e.labelAll, i = void 0 !== n && n, s = e.activeLabels, c = void 0 === s ? [] : s, l = arguments.length > 1 ? arguments[1] : void 0, f = arguments.length > 2 ? arguments[2] : void 0, p = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : u, g = d(p); + l = (0, o.isPlainObject)(l) ? (0, o.deepClone)(l) : f ? { banner: { sizes: f } } : {}; + var m = (0, o.deepAccess)(l, 'banner.sizes'); + g.shouldFilter && m && (l.banner.sizes = m.filter(function (e) { + return g.sizesSupported[e]; + })); + var v = Object.keys(l), b = { + active: v.every(function (e) { + return 'banner' !== e; + }) || v.some(function (e) { + return 'banner' === e; + }) && (0, o.deepAccess)(l, 'banner.sizes.length') > 0 && (0 === r.length || !i && (r.some(function (e) { + return g.labels[e]; + }) || r.some(function (e) { + return (0, a.default)(c, e); + })) || i && r.reduce(function (e, t) { + return e ? g.labels[t] || (0, a.default)(c, t) : e; + }, !0)), + mediaTypes: l + }; + m && m.length !== l.banner.sizes.length && (b.filterResults = { + before: m, + after: l.banner.sizes + }); + return b; + }, r(4), r(2), r(1), r(3), r(0), r(5); + var n, i = r(22), o = r(7), a = (n = r(31)) && n.__esModule ? n : { default: n }; + function s(e) { + return (s = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var u = []; + function c(e) { + u = e; + } + function d(e) { + return e.reduce(function (e, t) { + if ('object' === s(t) && 'string' == typeof t.mediaQuery) { + var r = !1; + if ('' === t.mediaQuery) { + r = !0; + } else { + try { + r = (0, o.getWindowTop)().matchMedia(t.mediaQuery).matches; + } catch (e) { + (0, o.logWarn)('Unfriendly iFrame blocks sizeConfig from being correctly evaluated'), r = matchMedia(t.mediaQuery).matches; + } + } + r && (Array.isArray(t.sizesSupported) && (e.shouldFilter = !0), [ + 'labels', + 'sizesSupported' + ].forEach(function (r) { + return (t[r] || []).forEach(function (t) { + return e[r][t] = !0; + }); + })); + } else { + (0, o.logWarn)('sizeConfig rule missing required property "mediaQuery"'); + } + return e; + }, { + labels: {}, + sizesSupported: {}, + shouldFilter: !1 + }); + } + i.config.getConfig('sizeConfig', function (e) { + return c(e.sizeConfig); + }); + }, + function (e, t, r) { + var n = r(23), i = r(78).onFreeze; + r(167)('freeze', function (e) { + return function (t) { + return e && n(t) ? e(i(t)) : t; + }; + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.adunitCounter = void 0; + var n = r(7), i = {}; + function o(e, t, r) { + var n = function (e, t) { + var r = i[e] = i[e] || { bidders: {} }; + return t ? r.bidders[t] = r.bidders[t] || {} : r; + }(e, r); + return n[t] = (n[t] || 0) + 1, n[t]; + } + var a = { + incrementRequestsCounter: function (e) { + return o(e, 'requestsCounter'); + }, + incrementBidderRequestsCounter: function (e, t) { + return o(e, 'requestsCounter', t); + }, + incrementBidderWinsCounter: function (e, t) { + return o(e, 'winsCounter', t); + }, + getRequestsCounter: function (e) { + return (0, n.deepAccess)(i, ''.concat(e, '.requestsCounter')) || 0; + }, + getBidderRequestsCounter: function (e, t) { + return (0, n.deepAccess)(i, ''.concat(e, '.bidders.').concat(t, '.requestsCounter')) || 0; + }, + getBidderWinsCounter: function (e, t) { + return (0, n.deepAccess)(i, ''.concat(e, '.bidders.').concat(t, '.winsCounter')) || 0; + } + }; + t.adunitCounter = a; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.newAuction = function (e) { + var t, r, i, o, a = e.adUnits, s = e.adUnitCodes, c = e.callback, d = e.cbTimeout, l = e.labels, f = e.auctionId, p = a, g = l, m = s, v = [], b = [], P = [], j = f || h.generateUUID(), R = c, D = d, k = [], N = new Set(); + function M() { + return { + auctionId: j, + timestamp: t, + auctionEnd: r, + auctionStatus: i, + adUnits: p, + adUnitCodes: m, + labels: g, + bidderRequests: v, + noBids: P, + bidsReceived: b, + winningBids: k, + timeout: D + }; + } + function U(e, t) { + if (t && clearTimeout(o), void 0 === r) { + var s = []; + e && (h.logMessage('Auction '.concat(j, ' timedOut')), c = N, (s = v.map(function (e) { + return (e.bids || []).filter(function (e) { + return !c.has(e.bidder); + }); + }).reduce(n.flatten, []).map(function (e) { + return { + bidId: e.bidId, + bidder: e.bidder, + adUnitCode: e.adUnitCode, + auctionId: e.auctionId + }; + })).length && O.emit(_.EVENTS.BID_TIMEOUT, s)), i = 'completed', r = Date.now(), O.emit(_.EVENTS.AUCTION_END, M()), x(p, function () { + try { + if (null != R) { + var t = m, r = b.filter(h.bind.call(n.adUnitsFilter, this, t)).reduce(V, {}); + R.apply(pbjs, [ + r, + e, + j + ]), R = null; + } + } catch (e) { + h.logError('Error executing bidsBackHandler', null, e); + } finally { + s.length && S.callTimedOutBidders(a, s, D); + var i = u.config.getConfig('userSync') || {}; + i.enableOverride || y(i.syncDelay); + } + }); + } + var c; + } + function B() { + h.logInfo('Bids Received for Auction with id: '.concat(j), b), i = 'completed', U(!1, !0); + } + function L(e) { + N.add(e); + } + function z(e) { + var t = this; + e.forEach(function (e) { + var t; + t = e, v = v.concat(t); + }); + var r = {}, n = { + bidRequests: e, + run: function () { + var n, u; + n = U.bind(null, !0), u = setTimeout(n, D), o = u, i = 'inProgress', O.emit(_.EVENTS.AUCTION_INIT, M()); + var c = C(B, t); + S.callBids(p, e, function () { + for (var e = arguments.length, t = new Array(e), r = 0; r < e; r++) { + t[r] = arguments[r]; + } + A.apply({ + dispatch: c.addBidResponse, + bidderRequest: this + }, t); + }, c.adapterDone, { + request: function (e, t) { + s(E, t), s(r, e), I[e] || (I[e] = { + SRA: !0, + origin: t + }), r[e] > 1 && (I[e].SRA = !1); + }, + done: function (e) { + E[e]--, w[0] && a(w[0]) && w.shift(); + } + }, D, L); + } + }; + function a(e) { + var t = !0, r = u.config.getConfig('maxRequestsPerOrigin') || 4; + return e.bidRequests.some(function (e) { + var n = 1, i = void 0 !== e.src && e.src === _.S2S.SRC ? 's2s' : e.bidderCode; + return I[i] && (!1 === I[i].SRA && (n = Math.min(e.bids.length, r)), E[I[i].origin] + n > r && (t = !1)), !t; + }), t && e.run(), t; + } + function s(e, t) { + void 0 === e[t] ? e[t] = 1 : e[t]++; + } + a(n) || (h.logWarn('queueing auction due to limited endpoint capacity'), w.push(n)); + } + return { + addBidReceived: function (e) { + b = b.concat(e); + }, + addNoBid: function (e) { + P = P.concat(e); + }, + executeCallback: U, + callBids: function () { + i = 'started', t = Date.now(); + var e = S.makeBidRequests(p, t, j, D, g); + h.logInfo('Bids Requested for Auction with id: '.concat(j), e), e.length < 1 ? (h.logWarn('No valid bid requests returned for auction'), B()) : T.call({ + dispatch: z, + context: this + }, e); + }, + addWinningBid: function (e) { + k = k.concat(e), S.callBidWonBidder(e.bidder, e, a); + }, + setBidTargeting: function (e) { + S.callSetTargetingBidder(e.bidder, e); + }, + getWinningBids: function () { + return k; + }, + getTimeout: function () { + return D; + }, + getAuctionId: function () { + return j; + }, + getAuctionStatus: function () { + return i; + }, + getAdUnits: function () { + return p; + }, + getAdUnitCodes: function () { + return m; + }, + getBidRequests: function () { + return v; + }, + getBidsReceived: function () { + return b; + }, + getNoBids: function () { + return P; + } + }; + }, t.auctionCallbacks = C, t.doCallbacksIfTimedout = P, t.addBidToAuction = j, t.getMediaTypeGranularity = D, t.getStandardBidderSettings = U, t.getKeyValueTargetingPairs = B, t.adjustBids = z, t.getAdvertiserDomain = t.getPriceByGranularity = t.getPriceGranularity = t.callPrebidCache = t.bidsBackCallback = t.addBidderRequests = t.addBidResponse = t.AUCTION_COMPLETED = t.AUCTION_IN_PROGRESS = t.AUCTION_STARTED = void 0, r(4), r(2), r(26), r(1), r(3), r(0), r(6), r(121); + var n = r(7), i = r(217), o = r(88), a = r(345), s = r(76), u = r(22), c = r(126), d = r(61), l = m(r(37)), f = m(r(31)), p = r(156), g = r(45); + function m(e) { + return e && e.__esModule ? e : { default: e }; + } + function v(e) { + return (v = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function b() { + return (b = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var y = c.userSync.syncUsers, h = r(7), S = r(87).default, O = r(60), _ = r(36); + t.AUCTION_STARTED = 'started'; + t.AUCTION_IN_PROGRESS = 'inProgress'; + t.AUCTION_COMPLETED = 'completed', O.on(_.EVENTS.BID_ADJUSTMENT, function (e) { + z(e); + }); + var E = {}, I = {}, w = []; + var A = (0, d.hook)('async', function (e, t) { + this.dispatch.call(this.bidderRequest, e, t); + }, 'addBidResponse'); + t.addBidResponse = A; + var T = (0, d.hook)('sync', function (e) { + this.dispatch.call(this.context, e); + }, 'addBidderRequests'); + t.addBidderRequests = T; + var x = (0, d.hook)('async', function (e, t) { + t && t(); + }, 'bidsBackCallback'); + function C(e, t) { + var r = 0, o = !1, a = new Set(), c = {}; + function d() { + r--, o && 0 === r && e(); + } + return { + addBidResponse: function (e, o) { + c[o.requestId] = !0, r++; + var a = function (e) { + var t = e.adUnitCode, r = e.bid, o = e.bidderRequest, a = e.auctionId, c = o.start, d = b({}, r, { + auctionId: a, + responseTimestamp: (0, n.timestamp)(), + requestTimestamp: c, + cpm: parseFloat(r.cpm) || 0, + bidder: r.bidderCode, + adUnitCode: t + }); + d.timeToRespond = d.responseTimestamp - d.requestTimestamp, O.emit(_.EVENTS.BID_ADJUSTMENT, d); + var f = o.bids && (0, l.default)(o.bids, function (e) { + return e.adUnitCode == t; + }), p = f && f.renderer, g = d.mediaType, m = f && f.mediaTypes && f.mediaTypes[g], y = m && m.renderer, h = null; + !y || !y.url || !0 === y.backupOnly && y.render ? !p || !p.url || !0 === p.backupOnly && r.renderer || (h = p) : h = y; + h && (d.renderer = s.Renderer.install({ url: h.url }), d.renderer.setRender(h.render)); + var S = D(r.mediaType, f, u.config.getConfig('mediaTypePriceGranularity')), E = (0, i.getPriceBucketString)(d.cpm, 'object' === v(S) ? S : u.config.getConfig('customPriceBucket'), u.config.getConfig('currency.granularityMultiplier')); + return d.pbLg = E.low, d.pbMg = E.med, d.pbHg = E.high, d.pbAg = E.auto, d.pbDg = E.dense, d.pbCg = E.custom, d; + }({ + adUnitCode: e, + bid: o, + bidderRequest: this, + auctionId: t.getAuctionId() + }); + 'video' === a.mediaType ? function (e, t, r, i) { + var o = !0, a = (0, n.getBidRequest)(t.requestId, [r]), s = a && (0, n.deepAccess)(a, 'mediaTypes.video'), c = s && (0, n.deepAccess)(s, 'context'); + u.config.getConfig('cache.url') && c !== p.OUTSTREAM && (t.videoCacheKey ? t.vastUrl || (h.logError('videoCacheKey specified but not required vastUrl for video bid'), o = !1) : (o = !1, R(e, t, i, a))); + o && (j(e, t), i()); + }(t, a, this, d) : (j(t, a), d()); + }, + adapterDone: function () { + var n = t.getBidRequests(), i = u.config.getConfig('auctionOptions'); + if (a.add(this), i && !h.isEmpty(i)) { + var s = i.secondaryBidders; + s && !n.every(function (e) { + return (0, f.default)(s, e.bidderCode); + }) && (n = n.filter(function (e) { + return !(0, f.default)(s, e.bidderCode); + })); + } + o = n.every(function (e) { + return a.has(e); + }), this.bids.forEach(function (e) { + c[e.bidId] || (t.addNoBid(e), O.emit(_.EVENTS.NO_BID, e)); + }), o && 0 === r && e(); + } + }; + } + function P(e, t) { + t.timeToRespond > e.getTimeout() + u.config.getConfig('timeoutBuffer') && e.executeCallback(!0); + } + function j(e, t) { + var r = e.getBidRequests(), n = (0, l.default)(r, function (e) { + return e.bidderCode === t.bidderCode; + }); + !function (e, t) { + var r; + if (e.bidderCode && (e.cpm > 0 || e.dealId)) { + var n = (0, l.default)(t.bids, function (t) { + return t.adUnitCode === e.adUnitCode; + }); + r = B(e.bidderCode, e, n); + } + e.adserverTargeting = b(e.adserverTargeting || {}, r); + }(t, n), O.emit(_.EVENTS.BID_RESPONSE, t), e.addBidReceived(t), P(e, t); + } + t.bidsBackCallback = x; + var R = (0, d.hook)('async', function (e, t, r, n) { + (0, a.store)([t], function (n, i) { + n ? (h.logWarn('Failed to save to the video cache: '.concat(n, '. Video bid must be discarded.')), P(e, t)) : '' === i[0].uuid ? (h.logWarn('Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.'), P(e, t)) : (t.videoCacheKey = i[0].uuid, t.vastUrl || (t.vastUrl = (0, a.getCacheUrl)(t.videoCacheKey)), j(e, t), r()); + }, n); + }, 'callPrebidCache'); + function D(e, t, r) { + if (e && r) { + if (e === g.VIDEO) { + var i = (0, n.deepAccess)(t, 'mediaTypes.'.concat(g.VIDEO, '.context'), 'instream'); + if (r[''.concat(g.VIDEO, '-').concat(i)]) { + return r[''.concat(g.VIDEO, '-').concat(i)]; + } + } + return r[e]; + } + } + t.callPrebidCache = R; + var k = function (e, t) { + var r = D(e, t, u.config.getConfig('mediaTypePriceGranularity')); + return 'string' == typeof e && r ? 'string' == typeof r ? r : 'custom' : u.config.getConfig('priceGranularity'); + }; + t.getPriceGranularity = k; + var N = function (e) { + return function (t) { + return e === _.GRANULARITY_OPTIONS.AUTO ? t.pbAg : e === _.GRANULARITY_OPTIONS.DENSE ? t.pbDg : e === _.GRANULARITY_OPTIONS.LOW ? t.pbLg : e === _.GRANULARITY_OPTIONS.MEDIUM ? t.pbMg : e === _.GRANULARITY_OPTIONS.HIGH ? t.pbHg : e === _.GRANULARITY_OPTIONS.CUSTOM ? t.pbCg : void 0; + }; + }; + t.getPriceByGranularity = N; + var M = function () { + return function (e) { + return e.meta && e.meta.advertiserDomains && e.meta.advertiserDomains.length > 0 ? e.meta.advertiserDomains[0] : ''; + }; + }; + function U(e, t, r) { + function i(e, t) { + return { + key: e, + val: 'function' == typeof t ? function (e) { + return t(e); + } : function (e) { + return (0, n.getValue)(e, t); + } + }; + } + var o = _.TARGETING_KEYS, a = k(e, r), s = pbjs.bidderSettings; + if (s[_.JSON_MAPPING.BD_SETTING_STANDARD] || (s[_.JSON_MAPPING.BD_SETTING_STANDARD] = {}), s[_.JSON_MAPPING.BD_SETTING_STANDARD][_.JSON_MAPPING.ADSERVER_TARGETING] || (s[_.JSON_MAPPING.BD_SETTING_STANDARD][_.JSON_MAPPING.ADSERVER_TARGETING] = [ + i(o.BIDDER, 'bidderCode'), + i(o.AD_ID, 'adId'), + i(o.PRICE_BUCKET, N(a)), + i(o.SIZE, 'size'), + i(o.DEAL, 'dealId'), + i(o.SOURCE, 'source'), + i(o.FORMAT, 'mediaType'), + i(o.ADOMAIN, function (e) { + return e.meta && e.meta.advertiserDomains && e.meta.advertiserDomains.length > 0 ? e.meta.advertiserDomains[0] : ''; + }) + ]), 'video' === e) { + var c = s[_.JSON_MAPPING.BD_SETTING_STANDARD][_.JSON_MAPPING.ADSERVER_TARGETING]; + if ([ + o.UUID, + o.CACHE_ID + ].forEach(function (e) { + void 0 === (0, l.default)(c, function (t) { + return t.key === e; + }) && c.push(i(e, 'videoCacheKey')); + }), u.config.getConfig('cache.url') && (!t || !1 !== h.deepAccess(s, ''.concat(t, '.sendStandardTargeting')))) { + var d = (0, n.parseUrl)(u.config.getConfig('cache.url')); + void 0 === (0, l.default)(c, function (e) { + return e.key === o.CACHE_HOST; + }) && c.push(i(o.CACHE_HOST, function (e) { + return h.deepAccess(e, 'adserverTargeting.'.concat(o.CACHE_HOST)) ? e.adserverTargeting[o.CACHE_HOST] : d.hostname; + })); + } + } + return s[_.JSON_MAPPING.BD_SETTING_STANDARD]; + } + function B(e, t, r) { + if (!t) { + return {}; + } + var n = {}, i = pbjs.bidderSettings; + i && (L(n, U(t.mediaType, e, r), t), e && i[e] && i[e][_.JSON_MAPPING.ADSERVER_TARGETING] && (L(n, i[e], t), t.sendStandardTargeting = i[e].sendStandardTargeting)); + return t.native && (n = b({}, n, (0, o.getNativeTargeting)(t, r))), n; + } + function L(e, t, r) { + var n = t[_.JSON_MAPPING.ADSERVER_TARGETING]; + return r.size = r.getSize(), h._each(n, function (n) { + var i = n.key, o = n.val; + if (e[i] && h.logWarn('The key: ' + i + ' is getting ovewritten'), h.isFn(o)) { + try { + o = o(r); + } catch (e) { + h.logError('bidmanager', 'ERROR', e); + } + } + (void 0 === t.suppressEmptyKeys || !0 !== t.suppressEmptyKeys) && i !== _.TARGETING_KEYS.DEAL || !h.isEmptyStr(o) && null != o ? e[i] = o : h.logInfo('suppressing empty key \'' + i + '\' from adserver targeting'); + }), e; + } + function z(e) { + var t, r = e.bidderCode, n = e.cpm; + if (pbjs.bidderSettings && (r && pbjs.bidderSettings[r] && 'function' == typeof pbjs.bidderSettings[r].bidCpmAdjustment ? t = pbjs.bidderSettings[r].bidCpmAdjustment : pbjs.bidderSettings[_.JSON_MAPPING.BD_SETTING_STANDARD] && 'function' == typeof pbjs.bidderSettings[_.JSON_MAPPING.BD_SETTING_STANDARD].bidCpmAdjustment && (t = pbjs.bidderSettings[_.JSON_MAPPING.BD_SETTING_STANDARD].bidCpmAdjustment), t)) { + try { + n = t(e.cpm, b({}, e)); + } catch (e) { + h.logError('Error during bid adjustment', 'bidmanager.js', e); + } + } + n >= 0 && (e.cpm = n); + } + function V(e, t) { + return e[t.adUnitCode] || (e[t.adUnitCode] = { bids: [] }), e[t.adUnitCode].bids.push(t), e; + } + t.getAdvertiserDomain = M; + }, + function (e, t, r) { + var n = r(142), i = r(115), o = r(181); + e.exports = function (e) { + if (!i(e)) { + return !1; + } + var t = n(e); + return '[object Error]' == t || '[object DOMException]' == t || 'string' == typeof e.message && 'string' == typeof e.name && !o(e); + }; + }, + function (e, t) { + e.exports = /<%=([\s\S]+?)%>/g; + }, + function (e, t) { + e.exports = function (e) { + return e; + }; + }, + function (e, t, r) { + r(25), r(319), r(320), r(322), r(152), r(323), r(324), r(325), r(342), r(349), r(350), r(351), r(357), r(358), r(359), r(360), r(362), r(363), r(377), r(378), r(380), r(381), r(382), r(383), r(384), r(385), r(387), r(389), r(390), r(391), r(392), r(394), e.exports = r(397); + }, + function (e, t, r) { + e.exports = r(104)('native-function-to-string', Function.toString); + }, + function (e, t, r) { + var n = r(66), i = r(106), o = r(27), a = r(18).Reflect; + e.exports = a && a.ownKeys || function (e) { + var t = n.f(o(e)), r = i.f; + return r ? t.concat(r(e)) : t; + }; + }, + function (e, t, r) { + var n = r(70), i = r(106), o = r(91); + e.exports = function (e) { + var t = n(e), r = i.f; + if (r) { + for (var a, s = r(e), u = o.f, c = 0; s.length > c;) { + u.call(e, a = s[c++]) && t.push(a); + } + } + return t; + }; + }, + function (e, t, r) { + var n = r(32), i = r(27), o = r(70); + e.exports = r(28) ? Object.defineProperties : function (e, t) { + i(e); + for (var r, a = o(t), s = a.length, u = 0; s > u;) { + n.f(e, r = a[u++], t[r]); + } + return e; + }; + }, + function (e, t, r) { + var n = r(57), i = r(66).f, o = {}.toString, a = 'object' == typeof window && window && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : []; + e.exports.f = function (e) { + return a && '[object Window]' == o.call(e) ? function (e) { + try { + return i(e); + } catch (e) { + return a.slice(); + } + }(e) : i(n(e)); + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(80), i = r(77), o = r(79), a = {}; + r(46)(a, r(19)('iterator'), function () { + return this; + }), e.exports = function (e, t, r) { + e.prototype = n(a, { next: i(1, r) }), o(e, t + ' Iterator'); + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(135); + r(14)({ + target: 'RegExp', + proto: !0, + forced: n !== /./.exec + }, { exec: n }); + }, + function (e, t, r) { + var n = r(14), i = r(164)(!0); + n(n.S, 'Object', { + entries: function (e) { + return i(e); + } + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(14), i = r(130)(!0); + n(n.P, 'Array', { + includes: function (e) { + return i(this, e, arguments.length > 1 ? arguments[1] : void 0); + } + }), r(107)('includes'); + }, + function (e, t, r) { + 'use strict'; + var n = r(14), i = r(170); + n(n.P + n.F * r(171)('includes'), 'String', { + includes: function (e) { + return !!~i(this, e, 'includes').indexOf(e, arguments.length > 1 ? arguments[1] : void 0); + } + }); + }, + function (e, t) { + e.exports = function (e, t, r) { + if (!e) { + return r; + } + var n, i; + Array.isArray(t) && (n = t.slice(0)); + 'string' == typeof t && (n = t.split('.')); + 'symbol' == typeof t && (n = [t]); + if (!Array.isArray(n)) { + throw new Error('props arg must be an array, a string or a symbol'); + } + for (; n.length;) { + if (i = n.shift(), !e) { + return r; + } + if (void 0 === (e = e[i])) { + return r; + } + } + return e; + }; + }, + function (e, t) { + e.exports = function (e) { + return e; + }; + }, + function (e, t, r) { + var n = r(138), i = Math.max; + e.exports = function (e, t, r) { + return t = i(void 0 === t ? e.length - 1 : t, 0), function () { + for (var o = arguments, a = -1, s = i(o.length - t, 0), u = Array(s); ++a < s;) { + u[a] = o[t + a]; + } + a = -1; + for (var c = Array(t + 1); ++a < t;) { + c[a] = o[a]; + } + return c[t] = r(u), n(e, this, c); + }; + }; + }, + function (e, t) { + e.exports = function (e) { + return e; + }; + }, + function (e, t, r) { + var n = r(173), i = r(71); + e.exports = function e(t, r, o, a, s, u) { + return i(t) && i(r) && (u.set(r, t), n(t, r, void 0, e, u), u.delete(r)), t; + }; + }, + function (e, t) { + e.exports = function () { + this.__data__ = [], this.size = 0; + }; + }, + function (e, t, r) { + var n = r(112), i = Array.prototype.splice; + e.exports = function (e) { + var t = this.__data__, r = n(t, e); + return !(r < 0) && (r == t.length - 1 ? t.pop() : i.call(t, r, 1), --this.size, !0); + }; + }, + function (e, t, r) { + var n = r(112); + e.exports = function (e) { + var t = this.__data__, r = n(t, e); + return r < 0 ? void 0 : t[r][1]; + }; + }, + function (e, t, r) { + var n = r(112); + e.exports = function (e) { + return n(this.__data__, e) > -1; + }; + }, + function (e, t, r) { + var n = r(112); + e.exports = function (e, t) { + var r = this.__data__, i = n(r, e); + return i < 0 ? (++this.size, r.push([ + e, + t + ])) : r[i][1] = t, this; + }; + }, + function (e, t, r) { + var n = r(247), i = function () { + try { + var e = n(Object, 'defineProperty'); + return e({}, '', {}), e; + } catch (e) { + } + }(); + e.exports = i; + }, + function (e, t) { + e.exports = function (e, t) { + return null == e ? void 0 : e[t]; + }; + }, + function (e, t, r) { + var n = r(249)(); + e.exports = n; + }, + function (e, t) { + e.exports = function (e) { + return function (t, r, n) { + for (var i = -1, o = Object(t), a = n(t), s = a.length; s--;) { + var u = a[e ? s : ++i]; + if (!1 === r(o[u], u, o)) { + break; + } + } + return t; + }; + }; + }, + function (e, t, r) { + var n = r(174), i = r(175), o = r(253), a = r(177), s = r(178), u = r(258), c = r(114), d = r(259), l = r(143), f = r(180), p = r(71), g = r(181), m = r(182), v = r(183), b = r(262); + e.exports = function (e, t, r, y, h, S, O) { + var _ = v(e, r), E = v(t, r), I = O.get(E); + if (I) { + n(e, r, I); + } else { + var w = S ? S(_, E, r + '', e, t, O) : void 0, A = void 0 === w; + if (A) { + var T = c(E), x = !T && l(E), C = !T && !x && m(E); + w = E, T || x || C ? c(_) ? w = _ : d(_) ? w = a(_) : x ? (A = !1, w = i(E, !0)) : C ? (A = !1, w = o(E, !0)) : w = [] : g(E) || u(E) ? (w = _, u(_) ? w = b(_) : p(_) && !f(_) || (w = s(E))) : A = !1; + } + A && (O.set(E, w), h(w, E, y, S, O), O.delete(E)), n(e, r, w); + } + }; + }, + function (e, t) { + e.exports = function (e) { + return e.webpackPolyfill || (e.deprecate = function () { + }, e.paths = [], e.children || (e.children = []), Object.defineProperty(e, 'loaded', { + enumerable: !0, + get: function () { + return e.l; + } + }), Object.defineProperty(e, 'id', { + enumerable: !0, + get: function () { + return e.i; + } + }), e.webpackPolyfill = 1), e; + }; + }, + function (e, t, r) { + (function (t) { + var r = 'object' == typeof t && t && t.Object === Object && t; + e.exports = r; + }.call(this, r(169))); + }, + function (e, t, r) { + var n = r(254); + e.exports = function (e, t) { + var r = t ? n(e.buffer) : e.buffer; + return new e.constructor(r, e.byteOffset, e.length); + }; + }, + function (e, t, r) { + var n = r(255); + e.exports = function (e) { + var t = new e.constructor(e.byteLength); + return new n(t).set(new n(e)), t; + }; + }, + function (e, t, r) { + var n = r(176).Uint8Array; + e.exports = n; + }, + function (e, t, r) { + var n = r(71), i = Object.create, o = function () { + function e() { + } + return function (t) { + if (!n(t)) { + return {}; + } + if (i) { + return i(t); + } + e.prototype = t; + var r = new e(); + return e.prototype = void 0, r; + }; + }(); + e.exports = o; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t, r) { + var n = r(260), i = r(115); + e.exports = function (e) { + return i(e) && n(e); + }; + }, + function (e, t, r) { + var n = r(180), i = r(261); + e.exports = function (e) { + return null != e && i(e.length) && !n(e); + }; + }, + function (e, t) { + e.exports = function (e) { + return 'number' == typeof e && e > -1 && e % 1 == 0 && e <= 9007199254740991; + }; + }, + function (e, t, r) { + var n = r(82), i = r(93); + e.exports = function (e) { + return n(e, i(e)); + }; + }, + function (e, t, r) { + 'use strict'; + e.exports = { + getStackTrace: function () { + var e = ''; + try { + throw new Error(''); + } catch (t) { + e = t.stack + '' || ''; + } + return e; + } + }; + }, + function (e, t) { + u.SYNC = 1, u.ASYNC = 2, u.QUEUE = 4; + var r = Object.freeze({ + useProxy: !0, + ready: 0 + }), n = new WeakMap(), i = '2,1,0' === [1].reduce(function (e, t, r) { + return [ + e, + t, + r + ]; + }, 2).toString() ? Array.prototype.reduce : function (e, t) { + var r, n = Object(this), i = n.length >>> 0, o = 0; + if (t) { + r = t; + } else { + for (; o < i && !(o in n);) { + o++; + } + r = n[o++]; + } + for (; o < i;) { + o in n && (r = e(r, n[o], o, n)), o++; + } + return r; + }, o = 4 === function (e, t) { + return t; + }.bind(null, 1, 4)() ? Function.prototype.bind : function (e) { + var t = this, r = a(arguments, 1); + return function () { + return t.apply(e, r.concat(a(arguments))); + }; + }; + function a(e, t) { + return Array.prototype.slice.call(e, t); + } + var s = Object.assign || function (e) { + return i.call(a(arguments, 1), function (e, t) { + return t && Object.keys(t).forEach(function (r) { + e[r] = t[r]; + }), e; + }, e); + }; + function u(e) { + var t, c = {}, d = []; + function l(e, t) { + return 'function' == typeof e ? m.call(null, 'sync', e, t) : 'string' == typeof e && 'function' == typeof t ? m.apply(null, arguments) : 'object' == typeof e ? f.apply(null, arguments) : void 0; + } + function f(e, t, r) { + var n = !0; + void 0 === t && (t = Object.getOwnPropertyNames(e), n = !1); + var i = {}, o = ['constructor']; + do { + (t = t.filter(function (t) { + return !('function' != typeof e[t] || -1 !== o.indexOf(t) || t.match(/^_/)); + })).forEach(function (t) { + var n = t.split(':'), o = n[0], a = n[1] || 'sync'; + if (!i[o]) { + var s = e[o]; + i[o] = e[o] = m(a, s, r ? [ + r, + o + ] : void 0); + } + }), e = Object.getPrototypeOf(e); + } while (n && e); + return i; + } + function p(e) { + var r = Array.isArray(e) ? e : e.split('.'); + return i.call(r, function (n, i, o) { + var a = n[i], s = !1; + return a || (o === r.length - 1 ? (t || d.push(function () { + s || console.warn('fun-hooks: referenced \'' + e + '\' but it was never created'); + }), n[i] = g(function (e) { + n[i] = e, s = !0; + })) : n[i] = {}); + }, c); + } + function g(e) { + var t = [], r = [], i = function () { + }, o = { + before: function (e, r) { + return u.call(this, t, 'before', e, r); + }, + after: function (e, t) { + return u.call(this, r, 'after', e, t); + }, + getHooks: function (e) { + var n = t.concat(r); + return 'object' == typeof e && (n = n.filter(function (t) { + return Object.keys(e).every(function (r) { + return t[r] === e[r]; + }); + })), s(n, { + remove: function () { + return n.forEach(function (e) { + e.remove(); + }), this; + } + }); + }, + removeAll: function () { + return this.getHooks().remove(); + } + }, a = { + install: function (n, o, a) { + this.type = n, i = a, a(t, r), e && e(o); + } + }; + return n.set(o.after, a), o; + function u(e, n, o, a) { + var s = { + hook: o, + type: n, + priority: a || 10, + remove: function () { + var n = e.indexOf(s); + -1 !== n && (e.splice(n, 1), i(t, r)); + } + }; + return e.push(s), e.sort(function (e, t) { + return t.priority - e.priority; + }), i(t, r), this; + } + } + function m(r, i, c) { + var l = i.after && n.get(i.after); + if (l) { + if (l.type !== r) { + throw 'fun-hooks: recreated hookable with different type'; + } + return i; + } + var f, m, v = c ? p(c) : g(), b = { + get: function (e, t) { + return v[t] || Reflect.get.apply(Reflect, arguments); + } + }; + return t || d.push(y), e.useProxy && 'function' == typeof Proxy && Proxy.revocable ? m = new Proxy(i, b) : s(m = function () { + return b.apply ? b.apply(i, this, a(arguments)) : i.apply(this, arguments); + }, v), n.get(m.after).install(r, m, function (e, t) { + if (e.length || t.length) { + var n; + if ('sync' === r) { + var i, a = 'r=t.apply(h,' + (e.length ? 'arguments' : 'g') + ')'; + t.length && (i = u(t, 'a', 'n(function extract(s){r=s},e)')), e.length && (a = u(e, 'b', 'n(function extract(){' + a + ';' + i + '},e)'), i = ''), n = [ + 'var r,e={bail:function(a){r=a}}', + a, + i, + 'return r' + ].join(';'); + } else { + 'async' === r && (n = 't.apply(h,' + (e.length ? 'Array.prototype.slice.call(arguments)' : 'g') + '.concat(' + u(t, 'a', 'z?n(z,e):[]') + '))', e.length && (n = 'n(function partial(){' + n + '},e)'), n = [ + 'var z', + 'typeof g[g.length-1]==="function"&&(z=i.call(g.pop(),null))', + 'var e={bail:z}', + u(e, 'b', n) + ].join(';')); + } + f = o.call(new Function('i,b,a,n,t,h,g', n), null, o, e, t, s); + } else { + f = void 0; + } + function u(e, t, n) { + for (var i = e.length; i-- > 0;) { + 0 !== i || 'async' === r && 'a' === t ? (n = 'i.call(' + t + '[' + i + '].hook, h,' + n + ')', 'async' === r && 'a' === t && 0 === i || (n = 'n(' + n + ',e)')) : n = t + '[' + i + '].hook.apply(h,[' + n + ('b' === t ? '].concat(g))' : ',r])'); + } + return n; + } + y(); + }), m; + function y() { + !t && ('sync' !== r || e.ready & u.SYNC) && ('async' !== r || e.ready & u.ASYNC) ? 'sync' !== r && e.ready & u.QUEUE ? b.apply = function () { + var e = arguments; + d.push(function () { + m.apply(e[1], e[2]); + }); + } : b.apply = function () { + throw 'fun-hooks: hooked function not ready'; + } : b.apply = f; + } + } + return (e = s({}, r, e)).ready ? l.ready = function () { + t = !0, function (e) { + for (var t; t = e.shift();) { + t(); + } + }(d); + } : t = !0, l.get = p, l; + } + e.exports = u; + }, + function (e, t) { + e.exports = function (e, t) { + var r = {}; + 'string' == typeof t && (t = [].slice.call(arguments, 1)); + for (var n in e) { + e.hasOwnProperty && !e.hasOwnProperty(n) || -1 === t.indexOf(n) && (r[n] = e[n]); + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + var n = r(24); + e.exports = function (e, t) { + return !!e && n(function () { + t ? e.call(null, function () { + }, 1) : e.call(null); + }); + }; + }, + function (e, t, r) { + var n = r(268); + e.exports = function (e) { + return n(e, 5); + }; + }, + function (e, t, r) { + var n = r(111), i = r(269), o = r(184), a = r(270), s = r(271), u = r(175), c = r(177), d = r(272), l = r(274), f = r(191), p = r(276), g = r(192), m = r(277), v = r(278), b = r(178), y = r(114), h = r(143), S = r(279), O = r(71), _ = r(280), E = r(116), I = r(93), w = {}; + w['[object Arguments]'] = w['[object Array]'] = w['[object ArrayBuffer]'] = w['[object DataView]'] = w['[object Boolean]'] = w['[object Date]'] = w['[object Float32Array]'] = w['[object Float64Array]'] = w['[object Int8Array]'] = w['[object Int16Array]'] = w['[object Int32Array]'] = w['[object Map]'] = w['[object Number]'] = w['[object Object]'] = w['[object RegExp]'] = w['[object Set]'] = w['[object String]'] = w['[object Symbol]'] = w['[object Uint8Array]'] = w['[object Uint8ClampedArray]'] = w['[object Uint16Array]'] = w['[object Uint32Array]'] = !0, w['[object Error]'] = w['[object Function]'] = w['[object WeakMap]'] = !1, e.exports = function e(t, r, A, T, x, C) { + var P, j = 1 & r, R = 2 & r, D = 4 & r; + if (A && (P = x ? A(t, T, x, C) : A(t)), void 0 !== P) { + return P; + } + if (!O(t)) { + return t; + } + var k = y(t); + if (k) { + if (P = m(t), !j) { + return c(t, P); + } + } else { + var N = g(t), M = '[object Function]' == N || '[object GeneratorFunction]' == N; + if (h(t)) { + return u(t, j); + } + if ('[object Object]' == N || '[object Arguments]' == N || M && !x) { + if (P = R || M ? {} : b(t), !j) { + return R ? l(t, s(P, t)) : d(t, a(P, t)); + } + } else { + if (!w[N]) { + return x ? t : {}; + } + P = v(t, N, j); + } + } + C || (C = new n()); + var U = C.get(t); + if (U) { + return U; + } + C.set(t, P), _(t) ? t.forEach(function (n) { + P.add(e(n, r, A, n, t, C)); + }) : S(t) && t.forEach(function (n, i) { + P.set(i, e(n, r, A, i, t, C)); + }); + var B = k ? void 0 : (D ? R ? p : f : R ? I : E)(t); + return i(B || t, function (n, i) { + B && (n = t[i = n]), o(P, i, e(n, r, A, i, t, C)); + }), P; + }; + }, + function (e, t) { + e.exports = function (e, t) { + for (var r = -1, n = null == e ? 0 : e.length; ++r < n && !1 !== t(e[r], r, e);) { + } + return e; + }; + }, + function (e, t, r) { + var n = r(82), i = r(116); + e.exports = function (e, t) { + return e && n(t, i(t), e); + }; + }, + function (e, t, r) { + var n = r(82), i = r(93); + e.exports = function (e, t) { + return e && n(t, i(t), e); + }; + }, + function (e, t, r) { + var n = r(82), i = r(273); + e.exports = function (e, t) { + return n(e, i(e), t); + }; + }, + function (e, t) { + e.exports = function () { + return []; + }; + }, + function (e, t, r) { + var n = r(82), i = r(275); + e.exports = function (e, t) { + return n(e, i(e), t); + }; + }, + function (e, t) { + e.exports = function () { + return []; + }; + }, + function (e, t) { + e.exports = function (e) { + var t = []; + if (null != e) { + for (var r in Object(e)) { + t.push(r); + } + } + return t; + }; + }, + function (e, t) { + var r = Object.prototype.hasOwnProperty; + e.exports = function (e) { + var t = e.length, n = new e.constructor(t); + return t && 'string' == typeof e[0] && r.call(e, 'index') && (n.index = e.index, n.input = e.input), n; + }; + }, + function (e, t) { + e.exports = function (e) { + return e; + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t) { + e.exports = function () { + return !1; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.stringFlags = function (e) { + var t = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; + e.constructor === Array && (e = (0, i.default)(e).join(',')); + if (o[e]) { + return o[e]; + } + var r = (0, i.default)(e.split(',')).reduce(a, {}), n = {}; + for (var u in r) { + r.hasOwnProperty(u) && ('!' === u.charAt(0) ? (u.indexOf('explicit') >= 0 ? n.all = !0 : u.indexOf('implicit') >= 0 && (n.all = !1), n[u.replace('!', '')] = !1) : (u.indexOf('explicit') >= 0 ? n.all = !1 : u.indexOf('implicit') >= 0 && (n.all = !0), n[u] = !0)); + } + return o[e] = { + string: e, + specified: r, + results: n, + isEnabled: function (e) { + return s(e, n, t); + } + }, o[e]; + }, r(33), r(16); + var n, i = (n = r(282)) && n.__esModule ? n : { default: n }; + var o = {}; + function a(e, t) { + return e[t] = !0, e; + } + function s(e, t) { + var r = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; + return void 0 !== t[e] ? t[e] : void 0 !== t.implicit ? t.implicit : void 0 !== t.explicit ? !t.explicit : void 0 !== t.all ? t.all : r; + } + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function () { + return i.default.apply(void 0, arguments); + }; + var n, i = (n = r(283)) && n.__esModule ? n : { default: n }; + }, + function (e, t) { + e.exports = function (e, t, r) { + if (!Array.isArray(e)) { + throw new Error('expected an array for the first argument'); + } + if (null != t && 'boolean' != typeof t) { + throw new Error('expected a number or boolean for the second argument'); + } + if (null != r && 'boolean' != typeof r) { + throw new Error('expected a number or boolean for the third argument'); + } + if (!t && r && e[0] !== Object(e[0])) { + return function (e) { + for (var t = {}, r = e.length, n = 0; n < r; n++) { + t[e[n]] = !0; + } + return Object.keys(t); + }(e); + } + for (var n, i, o, a = [], s = e.length, u = 0; u < s; u++) { + var c = e[u]; + 'number' == typeof c && isNaN(c) && (n = i, i = !0), (n = n || o && o === c) || t || (n = a.indexOf(c) > -1), n ? n = !1 : (a.push(c), o = c); + } + return a; + }; + }, + function (e, t) { + e.exports = function (e, t, r) { + 'string' == typeof t && (t = t.split('.')); + 'symbol' == typeof t && (t = [t]); + var n, i = t.pop(); + if (!i) { + return !1; + } + for (; n = t.shift();) { + if (void 0 === e[n] && (e[n] = {}), !(e = e[n]) || 'object' != typeof e) { + return !1; + } + } + return e[i] = r, !0; + }; + }, + function (e, t, r) { + var n = r(18), i = r(196).set, o = n.MutationObserver || n.WebKitMutationObserver, a = n.process, s = n.Promise, u = 'process' == r(67)(a); + e.exports = function () { + var e, t, r, c = function () { + var n, i; + for (u && (n = a.domain) && n.exit(); e;) { + i = e.fn, e = e.next; + try { + i(); + } catch (n) { + throw e ? r() : t = void 0, n; + } + } + t = void 0, n && n.enter(); + }; + if (u) { + r = function () { + a.nextTick(c); + }; + } else if (!o || n.navigator && n.navigator.standalone) { + if (s && s.resolve) { + var d = s.resolve(void 0); + r = function () { + d.then(c); + }; + } else { + r = function () { + i.call(n, c); + }; + } + } else { + var l = !0, f = document.createTextNode(''); + new o(c).observe(f, { characterData: !0 }), r = function () { + f.data = l = !l; + }; + } + return function (n) { + var i = { + fn: n, + next: void 0 + }; + t && (t.next = i), e || (e = i, r()), t = i; + }; + }; + }, + function (e, t) { + e.exports = function (e) { + try { + return { + e: !1, + v: e() + }; + } catch (e) { + return { + e: !0, + v: e + }; + } + }; + }, + function (e, t, r) { + var n = r(18).navigator; + e.exports = n && n.userAgent || ''; + }, + function (e, t, r) { + var n = r(27), i = r(23), o = r(198); + e.exports = function (e, t) { + if (n(e), i(t) && t.constructor === e) { + return t; + } + var r = o.f(e); + return (0, r.resolve)(t), r.promise; + }; + }, + function (e, t, r) { + var n = r(111), i = r(290), o = r(295), a = r(296), s = r(192), u = r(114), c = r(143), d = r(182), l = '[object Object]', f = Object.prototype.hasOwnProperty; + e.exports = function (e, t, r, p, g, m) { + var v = u(e), b = u(t), y = v ? '[object Array]' : s(e), h = b ? '[object Array]' : s(t), S = (y = '[object Arguments]' == y ? l : y) == l, O = (h = '[object Arguments]' == h ? l : h) == l, _ = y == h; + if (_ && c(e)) { + if (!c(t)) { + return !1; + } + v = !0, S = !1; + } + if (_ && !S) { + return m || (m = new n()), v || d(e) ? i(e, t, r, p, g, m) : o(e, t, y, r, p, g, m); + } + if (!(1 & r)) { + var E = S && f.call(e, '__wrapped__'), I = O && f.call(t, '__wrapped__'); + if (E || I) { + var w = E ? e.value() : e, A = I ? t.value() : t; + return m || (m = new n()), g(w, A, r, p, m); + } + } + return !!_ && (m || (m = new n()), a(e, t, r, p, g, m)); + }; + }, + function (e, t, r) { + var n = r(291), i = r(292), o = r(293); + e.exports = function (e, t, r, a, s, u) { + var c = 1 & r, d = e.length, l = t.length; + if (d != l && !(c && l > d)) { + return !1; + } + var f = u.get(e), p = u.get(t); + if (f && p) { + return f == t && p == e; + } + var g = -1, m = !0, v = 2 & r ? new n() : void 0; + for (u.set(e, t), u.set(t, e); ++g < d;) { + var b = e[g], y = t[g]; + if (a) { + var h = c ? a(y, b, g, t, e, u) : a(b, y, g, e, t, u); + } + if (void 0 !== h) { + if (h) { + continue; + } + m = !1; + break; + } + if (v) { + if (!i(t, function (e, t) { + if (!o(v, t) && (b === e || s(b, e, r, a, u))) { + return v.push(t); + } + })) { + m = !1; + break; + } + } else if (b !== y && !s(b, y, r, a, u)) { + m = !1; + break; + } + } + return u.delete(e), u.delete(t), m; + }; + }, + function (e, t, r) { + var n = r(114); + e.exports = function () { + if (!arguments.length) { + return []; + } + var e = arguments[0]; + return n(e) ? e : [e]; + }; + }, + function (e, t) { + e.exports = function (e, t) { + for (var r = -1, n = null == e ? 0 : e.length; ++r < n;) { + if (t(e[r], r, e)) { + return !0; + } + } + return !1; + }; + }, + function (e, t, r) { + var n = r(294); + e.exports = function (e, t) { + return !!(null == e ? 0 : e.length) && n(e, t, 0) > -1; + }; + }, + function (e, t) { + e.exports = function (e, t, r) { + for (var n = r - 1, i = e.length; ++n < i;) { + if (e[n] === t) { + return n; + } + } + return -1; + }; + }, + function (e, t) { + e.exports = function (e, t) { + return e === t || e != e && t != t; + }; + }, + function (e, t, r) { + var n = r(191), i = Object.prototype.hasOwnProperty; + e.exports = function (e, t, r, o, a, s) { + var u = 1 & r, c = n(e), d = c.length; + if (d != n(t).length && !u) { + return !1; + } + for (var l = d; l--;) { + var f = c[l]; + if (!(u ? f in t : i.call(t, f))) { + return !1; + } + } + var p = s.get(e), g = s.get(t); + if (p && g) { + return p == t && g == e; + } + var m = !0; + s.set(e, t), s.set(t, e); + for (var v = u; ++l < d;) { + var b = e[f = c[l]], y = t[f]; + if (o) { + var h = u ? o(y, b, f, t, e, s) : o(b, y, f, e, t, s); + } + if (!(void 0 === h ? b === y || a(b, y, r, o, s) : h)) { + m = !1; + break; + } + v || (v = 'constructor' == f); + } + if (m && !v) { + var S = e.constructor, O = t.constructor; + S == O || !('constructor' in e) || !('constructor' in t) || 'function' == typeof S && S instanceof S && 'function' == typeof O && O instanceof O || (m = !1); + } + return s.delete(e), s.delete(t), m; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.expireAction = function (e, t) { + var r = (0, n.getExpiration)(e); + r.isExpired ? t() : !e.forceUpdate && i[e.id] || (i[e.id] = setTimeout(function () { + t(); + }, r.fromNowMs)); + return r; + }; + var n = r(203), i = {}; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.concatConfigArrays = function (e, t) { + if ((0, o.default)(t) && (0, o.default)(e)) { + return {}; + } + if ((0, o.default)(t)) { + return e; + } + if ((0, o.default)(e)) { + return t; + } + (0, i.default)(e, 'bootstrap.renderScripts') && (0, i.default)(t, 'bootstrap.renderScripts') && (e.bootstrap.renderScripts = (0, n.default)(e.bootstrap.renderScripts.concat(t.bootstrap.renderScripts), 'id')); + (0, i.default)(e, 'analytics.bidbarrel') && (0, i.default)(t, 'analytics.bidbarrel') && (e.analytics.bidbarrel = (0, n.default)(e.analytics.bidbarrel.concat(t.analytics.bidbarrel), 'id')); + (0, i.default)(e, 'analytics.prebid') && (0, i.default)(t, 'analytics.prebid') && Array.isArray((0, i.default)(e, 'analytics.prebid')) && Array.isArray((0, i.default)(t, 'analytics.prebid')) ? e.analytics.prebid = (0, n.default)(e.analytics.prebid.concat(t.analytics.prebid), 'provider') : (0, i.default)(e, 'analytics.prebid') && (0, i.default)(t, 'analytics.prebid') && Array.isArray((0, i.default)(t, 'analytics.prebid')) ? e.analytics.prebid = (0, n.default)([].concat(u((0, i.default)(t, 'analytics.prebid')), [(0, i.default)(e, 'analytics.prebid')]), 'provider') : (0, i.default)(e, 'analytics.prebid') && (0, i.default)(t, 'analytics.prebid') && Array.isArray((0, i.default)(e, 'analytics.prebid')) && (e.analytics.prebid = (0, n.default)([].concat(u((0, i.default)(e, 'analytics.prebid')), [(0, i.default)(t, 'analytics.prebid')]), 'provider')); + (0, i.default)(e, 'dynamicTargeting.rules') && (0, i.default)(t, 'dynamicTargeting.rules') && (e.dynamicTargeting.rules = (0, n.default)(e.dynamicTargeting.rules.concat(t.dynamicTargeting.rules), 'name')); + if ((0, i.default)(e, 'video.getUnitSpec') && (0, i.default)(t, 'video.getUnitSpec')) { + var r = (0, a.createReduceMerger)(); + r.addConfig(t.video.getUnitSpec), r.addConfig(e.video.getUnitSpec), e.video.getUnitSpec = r.getMergeSet(); + } + if ((0, i.default)(e, 'video.getSpec') && (0, i.default)(t, 'video.getSpec')) { + var s = (0, a.createReduceMerger)(); + s.addConfig(t.video.getSpec), s.addConfig(e.video.getSpec), e.video.getSpec = s.getMergeSet(); + } + if ((0, i.default)(e, 'video.translateSpec') && (0, i.default)(t, 'video.translateSpec')) { + var c = (0, a.createReduceMerger)(); + c.addConfig(t.video.translateSpec), c.addConfig(e.video.translateSpec), e.video.translateSpec = c.getMergeSet(); + } + if ((0, i.default)(e, 'video.getDefaultParamsOptions') && (0, i.default)(t, 'video.getDefaultParamsOptions')) { + var d = (0, a.createReduceMerger)(); + d.addConfig(t.video.getDefaultParamsOptions), d.addConfig(e.video.getDefaultParamsOptions), e.video.getDefaultParamsOptions = d.getMergeSet(); + } + if (e && e.dynamicBidders) { + for (var l in e.dynamicBidders) { + if (Object.prototype.hasOwnProperty.call(e.dynamicBidders, l)) { + if ('autoApplyBidders' !== l) { + var f = (0, a.createReduceMerger)(); + f.addConfig((0, i.default)(t, 'dynamicBidders.'.concat(l)) || null), f.addConfig(e.dynamicBidders[l]), e.dynamicBidders[l] = f.getMergeSet(); + } else { + for (var p in e.dynamicBidders.autoApplyBidders) { + if (Object.prototype.hasOwnProperty.call(e.dynamicBidders.autoApplyBidders, p)) { + var g = (0, a.createReduceMerger)(); + g.addConfig((0, i.default)(t, 'dynamicBidders.autoApplyBidders.'.concat(p)) || null), g.addConfig(e.dynamicBidders.autoApplyBidders[p]), e.dynamicBidders.autoApplyBidders[p] = g.getMergeSet(); + } + } + } + } + } + } + return e; + }, r(9), r(11), r(0), r(6), r(13), r(1), r(4), r(2); + var n = s(r(299)), i = s(r(34)), o = s(r(48)), a = r(206); + function s(e) { + return e && e.__esModule ? e : { default: e }; + } + function u(e) { + return function (e) { + if (Array.isArray(e)) { + return c(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return c(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return c(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function c(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : new Set(); + return e.filter(function (e) { + return n = 'function' == typeof t ? t(e) : e[t], !r.has(n) && r.add(n); + var n; + }); + }, r(1), r(3), r(0), r(6), r(121); + }, + function (e, t, r) { + 'use strict'; + var n = r(32).f, i = r(80), o = r(85), a = r(53), s = r(84), u = r(117), c = r(133), d = r(165), l = r(118), f = r(28), p = r(78).fastKey, g = r(97), m = f ? '_s' : 'size', v = function (e, t) { + var r, n = p(t); + if ('F' !== n) { + return e._i[n]; + } + for (r = e._f; r; r = r.n) { + if (r.k == t) { + return r; + } + } + }; + e.exports = { + getConstructor: function (e, t, r, c) { + var d = e(function (e, n) { + s(e, d, t, '_i'), e._t = t, e._i = i(null), e._f = void 0, e._l = void 0, e[m] = 0, null != n && u(n, r, e[c], e); + }); + return o(d.prototype, { + clear: function () { + for (var e = g(this, t), r = e._i, n = e._f; n; n = n.n) { + n.r = !0, n.p && (n.p = n.p.n = void 0), delete r[n.i]; + } + e._f = e._l = void 0, e[m] = 0; + }, + delete: function (e) { + var r = g(this, t), n = v(r, e); + if (n) { + var i = n.n, o = n.p; + delete r._i[n.i], n.r = !0, o && (o.n = i), i && (i.p = o), r._f == n && (r._f = i), r._l == n && (r._l = o), r[m]--; + } + return !!n; + }, + forEach: function (e) { + g(this, t); + for (var r, n = a(e, arguments.length > 1 ? arguments[1] : void 0, 3); r = r ? r.n : this._f;) { + for (n(r.v, r.k, this); r && r.r;) { + r = r.p; + } + } + }, + has: function (e) { + return !!v(g(this, t), e); + } + }), f && n(d.prototype, 'size', { + get: function () { + return g(this, t)[m]; + } + }), d; + }, + def: function (e, t, r) { + var n, i, o = v(e, t); + return o ? o.v = r : (e._l = o = { + i: i = p(t, !0), + k: t, + v: r, + p: n = e._l, + n: void 0, + r: !1 + }, e._f || (e._f = o), n && (n.n = o), e[m]++, 'F' !== i && (e._i[i] = o)), e; + }, + getEntry: v, + setStrong: function (e, t, r) { + c(e, t, function (e, r) { + this._t = g(e, t), this._k = r, this._l = void 0; + }, function () { + for (var e = this._k, t = this._l; t && t.r;) { + t = t.p; + } + return this._t && (this._l = t = t ? t.n : this._t._f) ? d(0, 'keys' == e ? t.k : 'values' == e ? t.v : [ + t.k, + t.v + ]) : (this._t = void 0, d(1)); + }, r ? 'entries' : 'values', !r, !0), l(t); + } + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = function () { + return i.default.apply(void 0, arguments); + }; + var n, i = (n = r(302)) && n.__esModule ? n : { default: n }; + }, + function (e, t) { + e.exports = function (e, t) { + if (!Array.isArray(e) || !Array.isArray(t)) { + throw new Error('expected both arguments to be arrays'); + } + for (var r = [], n = e.length, i = 0; i < n; i++) { + var o = e[i]; + t.indexOf(o) > -1 && -1 == r.indexOf(o) && r.push(o); + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.fetchWithAbort = t.fetch = void 0; + var n, i = r(12), o = (n = r(304)) && n.__esModule ? n : { default: n }; + var a = void 0 !== (0, i.dom)().window.AbortController, s = (0, i.dom)().window.fetch || o.default.default || o.default; + t.fetch = s; + t.fetchWithAbort = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = function () { + return !1; + }; + if (a) { + var n = (0, i.dom)().window.AbortController, o = new n(), u = o.signal; + r = function () { + return o.abort(); + }, t.signal = u; + } + var c = s(e, t); + return c.cancel = r, c; + }; + }, + function (e, t, r) { + 'use strict'; + r.r(t), t.default = function (e, t) { + return t = t || {}, new Promise(function (r, n) { + var i = new XMLHttpRequest(), o = [], a = [], s = {}, u = function () { + return { + ok: 2 == (i.status / 100 | 0), + statusText: i.statusText, + status: i.status, + url: i.responseURL, + text: function () { + return Promise.resolve(i.responseText); + }, + json: function () { + return Promise.resolve(JSON.parse(i.responseText)); + }, + blob: function () { + return Promise.resolve(new Blob([i.response])); + }, + clone: u, + headers: { + keys: function () { + return o; + }, + entries: function () { + return a; + }, + get: function (e) { + return s[e.toLowerCase()]; + }, + has: function (e) { + return e.toLowerCase() in s; + } + } + }; + }; + for (var c in (i.open(t.method || 'get', e, !0), i.onload = function () { + i.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, function (e, t, r) { + o.push(t = t.toLowerCase()), a.push([ + t, + r + ]), s[t] = s[t] ? s[t] + ',' + r : r; + }), r(u()); + }, i.onerror = n, i.withCredentials = 'include' == t.credentials, t.headers)) { + i.setRequestHeader(c, t.headers[c]); + } + i.send(t.body || null); + }); + }; + }, + function (e, t, r) { + var n, i; + !function (o) { + if (void 0 === (i = 'function' == typeof (n = o) ? n.call(t, r, t, e) : n) || (e.exports = i), !0, e.exports = o(), !!0) { + var a = window.Cookies, s = window.Cookies = o(); + s.noConflict = function () { + return window.Cookies = a, s; + }; + } + }(function () { + function e() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var r = arguments[e]; + for (var n in r) { + t[n] = r[n]; + } + } + return t; + } + function t(e) { + return e.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); + } + return function r(n) { + function i() { + } + function o(t, r, o) { + if ('undefined' != typeof document) { + 'number' == typeof (o = e({ path: '/' }, i.defaults, o)).expires && (o.expires = new Date(1 * new Date() + 86400000 * o.expires)), o.expires = o.expires ? o.expires.toUTCString() : ''; + try { + var a = JSON.stringify(r); + /^[\{\[]/.test(a) && (r = a); + } catch (e) { + } + r = n.write ? n.write(r, t) : encodeURIComponent(String(r)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), t = encodeURIComponent(String(t)).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent).replace(/[\(\)]/g, escape); + var s = ''; + for (var u in o) { + o[u] && (s += '; ' + u, !0 !== o[u] && (s += '=' + o[u].split(';')[0])); + } + return document.cookie = t + '=' + r + s; + } + } + function a(e, r) { + if ('undefined' != typeof document) { + for (var i = {}, o = document.cookie ? document.cookie.split('; ') : [], a = 0; a < o.length; a++) { + var s = o[a].split('='), u = s.slice(1).join('='); + r || '"' !== u.charAt(0) || (u = u.slice(1, -1)); + try { + var c = t(s[0]); + if (u = (n.read || n)(u, c) || t(u), r) { + try { + u = JSON.parse(u); + } catch (e) { + } + } + if (i[c] = u, e === c) { + break; + } + } catch (e) { + } + } + return e ? i[e] : i; + } + } + return i.set = o, i.get = function (e) { + return a(e, !1); + }, i.getJSON = function (e) { + return a(e, !0); + }, i.remove = function (t, r) { + o(t, '', e(r, { expires: -1 })); + }, i.defaults = {}, i.withConverter = r, i; + }(function () { + }); + }); + }, + function (e, t, r) { + var n = r(307); + e.exports = function (e, t) { + return new (n(e))(t); + }; + }, + function (e, t, r) { + var n = r(23), i = r(162), o = r(19)('species'); + e.exports = function (e) { + var t; + return i(e) && ('function' != typeof (t = e.constructor) || t !== Array && !i(t.prototype) || (t = void 0), n(t) && null === (t = t[o]) && (t = void 0)), void 0 === t ? Array : t; + }; + }, + function (e, t) { + e.exports = function (e, t) { + var r = {}; + 'string' == typeof t && (t = [].slice.call(arguments, 1)); + for (var n = t.length, i = 0; i < n; i++) { + var o = t[i]; + o in e && (r[o] = e[o]); + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.unitHasElement = function (e) { + var t = 'string' == typeof e ? e : e.code; + return !!(0, n.dom)().window.document.getElementById(t); + }; + var n = r(12); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = void 0, r(4), r(2); + var n = r(12), i = r(35), o = s(r(120)), a = s(r(34)); + function s(e) { + return e && e.__esModule ? e : { default: e }; + } + function u(e) { + return (u = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var c = function (e) { + var t, r = [], s = !1; + function c() { + if (!s) { + var u = 'string' == typeof e ? (0, a.default)((0, n.dom)().window, e) : e(); + 'undefined' === u || (0, o.default)(t, u) || (t = (0, i.cloneDeep)(u), function () { + for (var e = 0; e < r.length; e++) { + (0, r[e])(t); + } + }()); + } + } + return c(), { + check: c, + onChange: function (e) { + var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { skipInitialRun: !1 }; + return !t || n && ('object' !== u(n) || n.skipInitialRun) || e(t), r.push(e), function () { + r = r.filter(function (t) { + return t === e; + }); + }; + }, + getResult: function () { + return t; + }, + cancel: function () { + s = !0; + } + }; + }; + t.default = c; + }, + function (e, t, r) { + var n = r(111), i = r(202); + e.exports = function (e, t, r, o) { + var a = r.length, s = a, u = !o; + if (null == e) { + return !s; + } + for (e = Object(e); a--;) { + var c = r[a]; + if (u && c[2] ? c[1] !== e[c[0]] : !(c[0] in e)) { + return !1; + } + } + for (; ++a < s;) { + var d = (c = r[a])[0], l = e[d], f = c[1]; + if (u && c[2]) { + if (void 0 === l && !(d in e)) { + return !1; + } + } else { + var p = new n(); + if (o) { + var g = o(l, f, d, e, t, p); + } + if (!(void 0 === g ? i(f, l, 3, o, p) : g)) { + return !1; + } + } + } + return !0; + }; + }, + function (e, t, r) { + var n = r(313), i = r(116); + e.exports = function (e) { + for (var t = i(e), r = t.length; r--;) { + var o = t[r], a = e[o]; + t[r] = [ + o, + a, + n(a) + ]; + } + return t; + }; + }, + function (e, t, r) { + var n = r(71); + e.exports = function (e) { + return e == e && !n(e); + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.default = void 0; + var n, i = (n = r(86)) && n.__esModule ? n : { default: n }, o = r(12); + var a = (0, i.default)(function (e) { + if (!(0, o.dom)().window.document.createElement) { + return {}; + } + var t = (0, o.dom)().window.document.createElement('a'); + return t.href = e, t; + }); + t.default = a; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.adIdentifier = void 0, r(17), r(2), r(1), r(3), r(5), r(11), r(0), r(40), r(16); + var n = r(20), i = r(8), o = l(r(318)), a = r(100), s = l(r(10)), u = l(r(56)), c = r(55), d = r(21); + function l(e) { + return e && e.__esModule ? e : { default: e }; + } + function f(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function p(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? f(Object(r), !0).forEach(function (t) { + g(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : f(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function g(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var m = o.default.gam.advertiserIds, v = o.default.amazon.providerTranslations, b = o.default.medianet.providerIds, y = [ + 'prebid.kargo', + 'amazon.gumgum', + 'google.33across' + ], h = { + prebid: function (e, t, r) { + return { cpm: parseFloat(t.slot.getTargeting('hb_pb')) }; + } + }, S = s.default.EVENTS.IDENTIFIED, O = function () { + var e = {}; + function t(t, r) { + var o = function (e, t) { + var r = parseInt(t.advertiserId), n = t.slot, i = n.getTargeting('hb_bidder'), o = n.getTargeting('amznp'); + i.length > 0 && (i = i[0]); + o.length > 0 && (o = v[o[0]] ? v[o[0]] : o[0]); + var a = { + '33across': { + provider: 'google', + subprovider: '33across' + }, + prebid: { + provider: 'prebid', + subprovider: i + }, + amazon: { + provider: 'amazon', + subprovider: o + } + }, s = { + provider: 'google', + subprovider: 'unknown' + }; + for (var u in m) { + if (Object.prototype.hasOwnProperty.call(m, u)) { + m[u].indexOf(r) >= 0 && (s = a[u]); + } + } + return s; + }(0, r); + 'prebid' === o.provider && (o.bid = a.bidCache.getLatestPendingBid(t.code)); + var s = p(p({}, o), {}, { code: t.code }); + s.size = 'prebid' === s.provider && s.bid ? s.bid.size.split('x').map(Number) : r.size, s.gpt = { + advertiserId: r.advertiserId, + orderId: r.campaignId, + creativeId: r.creativeId, + lineId: r.lineItemId, + size: r.size + }; + var c = function (e, t, r) { + var n = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : {}, i = 'display'; + t.size && '5x5' === t.size.join('x') && (i = 'skybox'); + ('native' === n.mediaType || t.size && '11x11' === t.size.join('x') || 'prebid' === r.provider && 'medianet' === r.subprovider) && (i = 'native'); + y.indexOf(''.concat(r.provider, '.').concat(r.subprovider)) >= 0 && (i = 'adhesion'); + n && '6x6' === n.size && (i = 'adhesion'); + 'prebid' === r.provider && 'gumgum' === r.subprovider && n.ad.indexOf('= 0 && (i = 'adhesion'); + t.size && '7x7' === t.size.join('x') && (i = 'flex'); + return i; + }(t, r, o, s.bid || {}); + s.type = c; + var d, l, f = function (e, t, r) { + if ('medianet' === r.subprovider) { + var n = a.bidCache.getAllBids()[t.slot.getTargeting('hb_adid')].creativeId.toString(), i = n.substr(3, parseInt(n.charAt(2))); + return b[i] || i; + } + return null; + }(0, r, o); + s.dsp = f, h[s.vendor] && (s = p(p({}, s), h[s.vendor](t, r, s))), e[s.code] && (s = p(p({}, s), e[s.code]), e = (0, u.default)(e, [s.code])), i.bbLogger.logInfo('Ad Identified', t.code, s), n.eventEmitter.emit((d = s, l = t.code, [ + ''.concat(S), + ''.concat(l, '.').concat(S), + ''.concat(S, '.').concat(d.type), + ''.concat(l, '.').concat(S, '.').concat(d.type) + ]), s, t, r); + } + return d.exposureApi.expose({ + selfIdentify: function (t) { + t.code && (0, c.makeSafe)(function () { + e[t.code] = t, n.eventEmitter.on(''.concat(t.code, '.slotRenderEnded'), function () { + setTimeout(function () { + e = (0, u.default)(e, [t.code]); + }, 50); + }, !0); + }); + } + }, !0), { + setupListeners: function () { + n.eventEmitter.on('rendered', t); + } + }; + }(); + t.adIdentifier = O; + }, + function (e, t, r) { + var n = r(14), i = r(68), o = r(24), a = r(317), s = '[' + a + ']', u = RegExp('^' + s + s + '*'), c = RegExp(s + s + '*$'), d = function (e, t, r) { + var i = {}, s = o(function () { + return !!a[e]() || '\u200B\x85' != '\u200B\x85'[e](); + }), u = i[e] = s ? t(l) : a[e]; + r && (i[r] = u), n(n.P + n.F * s, 'String', i); + }, l = d.trim = function (e, t) { + return e = String(i(e)), 1 & t && (e = e.replace(u, '')), 2 & t && (e = e.replace(c, '')), e; + }; + e.exports = d; + }, + function (e, t) { + e.exports = '\t\n\x0B\f\r \xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + }, + function (e) { + e.exports = JSON.parse('{"gam":{"advertiserIds":{"amazon":[5022645737,40701249],"33across":[5023777670,74271009],"prebid":[5024616868,4736223241,4782210656,4601135258,4778097280,4782945040,4650435032,4723722397,4777432019,4782935242]}},"amazon":{"providerTranslations":{"1jspurk":"aarki","121fu9s":"acuity","1x46d4w":"adcolony","t5su0w":"adcolonyuam","ys2m0w":"amazon","1ax2uio":"amobeedsp","1y84qo0":"appnexus","qxw2yo":"beachfront","96m2gw":"conversant","1socv0g":"conversantuam","ptxpfk":"districtm","4qskcg":"dmx","1gguq68":"emx","1qgg3y8":"gumgum","16h9ce8":"gumgumuam","beitj4":"ix","xlmc5c":"inmobi","1hkt3pc":"kargo","135e7sw":"liftoff","gyap6o":"magnite","ypkpog":"openx","10xhgqo":"pubmatic","82noxs":"pulsepoint","3mu6tc":"smaato","fucbnk":"smarttrb+","1uw9m2o":"sonobi","u9r7k0":"sovrn","1c1181s":"spots","1kwo8ao":"triplelift","le47b4":"unrulyxssp","az280":"unrulyx_ssp_aps","6ypbeo":"verizon","ztj37k":"verve","149clc0":"yieldmo","OLDVCBSBELOW":"old","1qnaz9c":"appnexus","i93y0w":"districtm","3tp24g":"dmx","18w0yrk":"emx","1yezlz4":"gumgum","9dgxs0":"rubicon","1tz63uo":"sonobi","lkz2m8":"verizon","16o47pc":"pubmatic","htxj4":"pulsepoint","13c9340":"yieldmo"}},"medianet":{"providerIds":{"199":"sharethrough"}}}'); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.optanon = t.optanonBase = void 0, r(6), r(13), r(9), r(11), r(0), r(1), r(4), r(2), r(33), r(124), r(16); + var n = r(52), i = r(99), o = r(8), a = r(25), s = _(r(56)), u = _(r(34)), c = r(74), d = r(12), l = r(59), f = r(152), p = r(15), g = r(20), m = _(r(48)), v = _(r(29)), b = r(208), y = r(207), h = r(73), S = _(r(10)), O = r(98); + function _(e) { + return e && e.__esModule ? e : { default: e }; + } + function E(e) { + return (E = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function I(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return w(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return w(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function w(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var A = S.default.MODULES.OPTANON, T = function () { + var e, t = !1, r = [ + 'ix-identity', + 'bb-sharethrough' + ], S = (0, i.runQueue)('consentGiven'), _ = (0, i.runQueue)('npaFlagSet'), w = {}; + function T(e) { + (0, d.dom)().window.cbsoptanon.cmd.push(function (t) { + t.ot.addOnConsentChangedHandler(function () { + t.ads.getNpaFlag(function (t) { + e(0 == t); + }); + }); + }); + } + function x(e) { + var r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + o.bbLogger.logInfo('Consent Given', e), t = e, (0, p.setConfig)('consent', t), C(), t && !0 !== a.moduleManager.gateways.isOpen('consentGiven') && a.moduleManager.gateways.open('consentGiven'), !0 !== a.moduleManager.gateways.isOpen('npaFlagSet') && a.moduleManager.gateways.open('npaFlagSet'), r || (g.eventEmitter.emit('consentReady', t), T(function (e) { + o.bbLogger.logInfo('Consent Changed', e), t || x(e, !0), g.eventEmitter.emit('consentChanged', e); + })); + } + function C() { + if (!(0, p.getConfig)('clientInfo.data.country')) { + try { + var e = h.storage.getCookie('OptanonConsent', !1); + if (e) { + var t = e.split('&').reduce(function (e, t) { + var r = I(t.split('='), 2), n = r[0], i = r[1]; + return e[n] = i, e; + }, {}), r = t.geolocation.toLowerCase(), n = null; + if (t.geolocation.indexOf(';') >= 0) { + var i = I(t.geolocation.toLowerCase().split(';'), 2), a = i[0], s = i[1]; + r = a, n = s; + } + var u = t.datestamp.split('+').find(function (e) { + return e.indexOf('GMT') >= 0; + }); + if (u) { + var c = (u = u.replace('GMT', '')).charAt(0), d = parseInt(u.replace(c, '')); + u = c + d; + } + var l = (0, p.getConfig)('clientInfo.data') || {}, f = { + country: r, + gmtOffset: u + }; + n && (f.region = n); + var g = (0, v.default)(f, l); + o.bbLogger.logInfo('Extracted ClientInfo from OptanonConsent cookie', f), (0, p.setConfig)('clientInfo.data', g); + } + } catch (e) { + o.bbLogger.logInfo('Unable to parse OptanonConsent cookie', e); + } + } + } + function P(e) { + e && 'object' === E(e) && !Array.isArray(e) && (0, d.dom)().window.cbsoptanon.config.push(e); + } + return { + onConsentGiven: S.push, + onNpaFlagSet: _.push, + name: A, + register: function () { + var i, o, g, m, v; + (0, p.setConfig)('consent', !1), (0, d.dom)().window.googletag = (0, d.dom)().window.googletag || {}, (0, d.dom)().window.googletag.cmd = (0, d.dom)().window.googletag.cmd || [], i = [ + 'onIframesReady', + 'onFormsReady', + 'onScriptsReady', + 'onAdsReady' + ], o = (0, d.dom)().window, m = 'cmd', v = 'config', o[g = 'cbsoptanon'] = o[g] ? o[g] : {}, o[g][m] = o[g][m] ? o[g][m] : [], o[g][v] = o[g][v] ? o[g][v] : [], i.forEach(function (e) { + o[g][e] = o[g][e] || function () { + var t = arguments; + o[g][m].push(function () { + o[g][e].apply(o[g], t); + }); + }; + }), a.moduleManager.gateways.register('consentGiven'), a.moduleManager.gateways.register('npaFlagSet'), a.moduleManager.gateways.onOpen(function () { + _.run(t ? 0 : 1); + }, 'npaFlagSet'), a.moduleManager.gateways.onOpen(function () { + S.run(t); + }, 'consentGiven'), c.renderScript.before(function (e, t) { + r.indexOf(t.id) >= 0 ? S.push(function () { + return e(t); + }) : e(t); + }, 1), b.cookieStorageEngine.setCookie.before(function (e) { + if (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + e.apply(void 0, n); + } else { + e(null); + } + }, 1), b.cookieStorageEngine.raw.setValue.before(function (e) { + if (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + e.apply(void 0, n); + } else { + e(null); + } + }, 1), b.cookieStorageEngine.getCookie.before(function (e) { + if (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + e.apply(void 0, n); + } else { + e(null); + } + }, 1), b.cookieStorageEngine.raw.getValue.before(function (e) { + if (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + e.apply(void 0, n); + } else { + e(null); + } + }, 1), y.localStorageEngine.raw.setValue.before(function (e) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + t ? e.apply(void 0, n) : S.push(function () { + var e; + return (e = y.localStorageEngine.raw).setValue.apply(e, n); + }); + }, 1), y.localStorageEngine.raw.getValue.before(function (e) { + if (t) { + for (var r = arguments.length, n = new Array(r > 1 ? r - 1 : 0), i = 1; i < r; i++) { + n[i - 1] = arguments[i]; + } + e.apply(void 0, n); + } else { + e(null); + } + }, 1), l.setInitialPageTargeting.before(function (r, n) { + var i = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + t ? r(n, i) : (S.push(function () { + e(), r(n, !0); + }), e = _.push(function () { + return r(n, i); + })); + }, 1), f.gptModule.enableGoogletagServices.before(function (e) { + _.push(function () { + return e(); + }); + }, 1), n.auction.before(function (e, t) { + _.push(function () { + return e(t); + }); + }, 1), (0, d.dom)().window.cbsoptanon.cmd.push(function (e) { + !function (e) { + var t = (0, u.default)(e, 'constants.VERSION.major'), r = (0, u.default)(e, 'constants.VERSION.minor'); + return t && r && t >= 1 && r >= 1; + }(e) ? (0, d.dom)().window.cbsoptanon.onAdsReady(function (e, t) { + x(0 == t.npaFlag); + }) : (0, d.dom)().window.cbsoptanon.cmd.push(function (e) { + e.ot.targetingAllowed(function (e) { + x(e); + }); + }); + }), (0, p.getConfig)('optanon', function (e) { + w = e, P((0, s.default)(e, [ + 'scriptUrls', + 'renderScript' + ])); + }); + }, + initialize: function () { + (0, m.default)(w) && (w = (0, p.getConfig)('optanon'), P((0, s.default)(w, [ + 'scriptUrls', + 'renderScript' + ]))), (0, p.getConfig)('optanon.renderScript') && (0, c.renderScript)({ + async: !0, + id: 'bb-cbsoptanon', + shouldRender: function () { + return 0 === (0, d.dom)().window.document.querySelectorAll('script[src*=\'cmp.isgprivacy.cbsi.com\']').length; + }, + src: (0, O.isStagingEnv)() ? w.scriptUrls.dev : w.scriptUrls.prod + }); + } + }; + }(); + t.optanonBase = T; + var x = a.moduleManager.register(T); + t.optanon = x; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.geo = void 0, r(4), r(2), r(5), r(1), r(3), r(0), r(54); + var n = r(8), i = r(99), o = b(r(48)), a = r(21), s = r(25), u = r(211), c = r(52), d = r(44), l = r(15), f = r(12), p = r(72), g = b(r(10)), m = r(42), v = b(r(321)); + function b(e) { + return e && e.__esModule ? e : { default: e }; + } + function y(e) { + return (y = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var h = g.default.MODULES.GEOLOCATION, S = function () { + var e = {}, t = null, r = null, s = [], g = [], b = {}, S = null, O = !1; + function _(t, i) { + t(i.map(function (t) { + return t.bids = function (t, i) { + var a = C(); + if (e[i + a]) { + return e[i + a]; + } + var s = []; + Array.isArray(t) ? s = t : 'object' === y(t) && void 0 !== t[r] ? s = t[r] : 'object' === y(t) && void 0 !== t[b.failsafeRegionCode] ? (n.bbLogger.logWarn(i, 'Region not configured among bid set.', r, 'Using fallback', b.failsafeRegionCode), s = t[b.failsafeRegionCode], a = b.failsafeRegionCode) : ('object' === y(t) && (0, o.default)(t) || n.bbLogger.logWarn(i, 'Unrecognized bids property', t), s = []); + return e[i + a] = s, s; + }(t.bids, t.code), t; + })); + } + function E(e) { + for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), o = 1; o < t; o++) { + i[o - 1] = arguments[o]; + } + if (!r) { + var a = Math.round(b.failsafeTimeout - ((0, f.dom)().window.performance.now() - S)); + n.bbLogger.logInfo('Geolocation detection module intercepting auction request. Delaying until region can be determined. Failsafes will be applied in', a, 'milleseconds, code:', b.failsafeCountryCode); + } + R(function () { + e.apply(void 0, i); + }); + } + function I(e) { + var r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + e && (r || !r && !t) && (t = p.features.getValue('countryCode') || e, n.bbLogger.logInfo('Country Code Set:', t), w(A(), r), s.run(e)); + } + function w(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + e && (t || !t && !r) && (r = p.features.getValue('regionCode') || e, n.bbLogger.logInfo('Region Code Set:', r), (0, l.setConfig)('geo.regionCode', r), g.run()); + } + function A() { + if (t) { + var e = T(t); + return e || (n.bbLogger.logWarn('Region code for country is not set (', t, ') using failsafe:', b.failsafeCountryCode), e = T(b.failsafeCountryCode)), e; + } + } + function T(e) { + for (var t in v.default) { + if (Object.prototype.hasOwnProperty.call(v.default, t)) { + if (v.default[t].indexOf(e) >= 0) { + return t; + } + } + } + } + function x() { + return t; + } + function C() { + return r; + } + function P() { + return v.default; + } + function j(e) { + s.push(e); + } + function R(e) { + g.push(e); + } + var D = []; + function k() { + return D.length || (D = Object.values(P()).reduce(function (e, t) { + return e.concat(t); + }, [])), D; + } + var N = []; + return a.exposureApi.expose({ + getRegionCode: C, + getRegionMappings: P, + getMappedCountries: k, + getMappedRegions: function () { + return N.length || (N = Object.keys(P())), N; + }, + getCountryCode: x, + onCountrySet: j, + onRegionSet: R + }), { + initialize: function () { + O || (O = !0, n.bbLogger.logInfo('Initializing Geolocation detection module', b), g = (0, i.runQueue)('onRegionSet', g, (0, n.debugOn)()), b.overrideCountryCode || b.overrideRegionCode ? function () { + b.overrideRegionCode && (P()[b.overrideRegionCode] ? w(b.overrideRegionCode, !0) : (n.bbLogger.logWarn('Region code for override is not mapped (', b.overrideRegionCode, ') using failsafe as fallback:', b.failsafeRegionCode), w(b.failsafeRegionCode, !0))); + b.overrideCountryCode && (k().indexOf(b.overrideCountryCode) >= 0 ? (s = { + push: function (e) { + return e(b.overrideCountryCode); + }, + run: function () { + return !1; + }, + cancel: function () { + return !1; + } + }, I(b.overrideCountryCode, !0)) : (n.bbLogger.logWarn('Country code for override is not mapped (', b.overrideCountryCode, ') using failsafe as fallback:', b.failsafeCountryCode), s = { + push: function (e) { + return e(b.failsafeCountryCode); + }, + run: function () { + return !1; + }, + cancel: function () { + return !1; + } + }, I(b.failsafeCountryCode, !0))); + }() : (s = (0, i.runQueue)('onCountrySet', s, (0, n.debugOn)()), u.clientInfo.getCountryCode(), (0, l.getConfig)('clientInfo.data.country', function (e) { + s.run(e.toLowerCase()); + }), s.push(function (e) { + n.bbLogger.logInfo('Successfully applied the location code', e), I(e); + }), function () { + if (b.failsafeCountryCode && b.failsafeTimeout) { + S = (0, f.dom)().window.performance.now(), setTimeout(function () { + t || (n.bbLogger.logInfo('Unable to successfully apply the country code. Using fail safe country code', b.failsafeCountryCode), I(b.failsafeCountryCode)); + }, b.failsafeTimeout); + } else { + n.bbLogger.logError('Geo Module fail safe values not set correctly:', { + failsafeCountryCode: b.failsafeCountryCode, + failsafeTimeout: b.failsafeTimeout + }); + var e = new Error('Geo Module fail safe values not set correctly:', { + failsafeCountryCode: b.failsafeCountryCode, + failsafeTimeout: b.failsafeTimeout + }); + m.errorReporting.report(e); + } + }()), c.auction.before(E), d.getUnitCollection.after(_)); + }, + deregister: function () { + c.auction.getHooks({ hook: E }).remove(), d.getUnitCollection.getHooks({ hook: _ }).remove(); + }, + onRegionSet: R, + onCountrySet: j, + getRegionCode: C, + getCountryCode: x, + protected: !0, + register: function () { + (0, l.getConfig)('geo', function (e) { + b = e; + }); + }, + name: h + }; + }(), O = s.moduleManager.register(S); + t.geo = O; + }, + function (e) { + e.exports = JSON.parse('{"us":["au","nz","us"],"ca":["ca"],"latam":["br","mx"],"emea":["af","ax","al","dz","ad","ao","am","at","az","bh","by","be","bj","ba","ba","bw","bv","bg","bf","bi","cm","cv","cf","td","km","ci","hr","cy","cz","cz","cd","dk","dj","eg","gq","er","ee","et","fk","fo","fi","fr","tf","ga","gm","ge","de","gh","gi","gr","gl","gg","gn","gw","hu","is","iq","ie","im","il","it","ci","je","jo","kz","ke","xk","kw","kg","lv","lb","ls","lr","ly","li","lt","lu","mk","mk","mg","mw","ml","mt","mr","mu","yt","md","mc","me","ma","mz","na","nl","ne","ng","no","om","ps","pl","pt","qa","cg","re","ro","ru","rw","sh","sm","st","sa","sn","rs","sc","sl","sk","si","so","za","gs","es","sd","sj","sz","se","ch","sy","tj","tz","tg","tn","tr","tm","ug","ua","ae","gb","uz","va","eh","ye","za","zm","zw"],"apac":["as","aq","bd","bt","io","bn","kh","cn","cx","cc","ck","fm","fj","pf","gu","hm","hk","in","id","ir","jp","ki","la","mo","my","mv","mh","fm","mn","mm","mm","mr","np","nc","nu","nf","kp","mp","pk","pw","pg","ph","pn","pn","pm","ws","sg","sb","kr","lk","tw","th","tl","tk","to","tv","um","vu","vn","wf"]}'); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.confiant = void 0; + var n = r(20), i = r(25), o = r(74), a = r(12), s = m(r(10)), u = r(44), c = r(8), d = r(100), l = r(15), f = r(52), p = r(42), g = m(r(51)); + function m(e) { + return e && e.__esModule ? e : { default: e }; + } + var v, b = s.default.EVENTS, y = b.BAD_BID, h = b.BAD_AD, S = s.default.MODULES.CONFIANT, O = (v = function () { + return !1; + }, { + name: S, + register: function () { + var e, t; + e = 'J3UXFee1xclY-bfFlWh1mIZ_phU', (t = (0, a.dom)().window).confiant = t.confiant || {}, t.confiant[e] = t.confiant[e] || { clientSettings: {} }, (window.confiant[e].clientSettings || (window.confiant[e].clientSettings = {})).callback = function (e, t, r, i, o, a) { + try { + var s, l = (0, u.getUnits)(); + a && a.prebid && a.prebid.adId ? (s = a.prebid.s, n.eventEmitter.emit.apply(n.eventEmitter, [ + y, + a.prebid.adId, + l[a.prebid.s], + d.bidCache.getBidByAdId(a.prebid.adId) + ].concat(Array.prototype.slice.call(arguments)))) : s = a.dfp.s, c.bbLogger.atVerbosity(4).logInfo('Confiant Blocked an ad', l[s], arguments), n.eventEmitter.emit.apply(n.eventEmitter, [ + h, + l[s] + ].concat(Array.prototype.slice.call(arguments))); + } catch (e) { + c.bbLogger.logError('Error in confiant bad ad detected callback', e); + var f = new Error('Error in confiant bad ad detected callback. '.concat(JSON.stringify(e, g.default))); + p.errorReporting.report(f); + } + }, (0, o.renderScript)({ + src: 'https://confiant-integrations.global.ssl.fastly.net/J3UXFee1xclY-bfFlWh1mIZ_phU/gpt_and_prebid/config.js', + async: !0, + id: 'bb-confiant' + }); + }, + initialize: function () { + (0, l.getConfig)('confiant.badAdRefresh') && (v = n.eventEmitter.on(h, function (e) { + c.bbLogger.logInfo('Refreshing unit due to bad ad detected', e), (0, f.auction)([e.code]); + })); + }, + deregister: function () { + v(); + } + }), _ = i.moduleManager.register(O); + t.confiant = _; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.dynamicBidders = void 0; + var n = r(8), i = r(206), o = r(35), a = v(r(29)), s = r(25), u = r(44), c = r(15), d = r(52), l = v(r(10)), f = v(r(48)), p = r(42), g = v(r(51)), m = r(59); + function v(e) { + return e && e.__esModule ? e : { default: e }; + } + var b = l.default.MODULES.DYNAMIC_BIDDERS, y = function () { + var e = {}, t = {}; + function r(t) { + return e[t] || (e[t] = {}), { + dfpPath: (0, c.getConfig)('dfpPathObj'), + regionCode: function () { + return (0, c.getConfig)('geo.regionCode') || 'us'; + }, + isMobile: d.isMobile, + bidderContext: e[t], + pageTargeting: (0, m.getPageTargeting)() + }; + } + return { + bidRequest: function (s) { + return s = s.map(function (e) { + return e.bids = function (e, s) { + for (var c = [], d = function (d) { + var l = (0, o.cloneDeep)(e[d]); + if (t[l.bidder]) { + try { + var m = function (e, t, n, o) { + return (0, i.createReduceMerger)(e).processObject(n, { + arguments: [ + t, + r(o) + ] + }); + }(t[l.bidder], (0, u.getUnits)()[s], l.params, l.bidder); + if (m) { + var v = function (e) { + if (e) { + var t = { + bidder: l.bidder, + params: (0, a.default)({}, e, l.params) + }; + void 0 !== t.params.included && delete t.params.included, (0, f.default)(t.params) || c.push(t); + } + }; + if (Array.isArray(m)) { + for (var b = 0; b < m.length; b++) { + v(m[b]); + } + } else { + v(m); + } + } else { + n.bbLogger.atVerbosity(3).logInfo('Excluding bidder', l.bidder, 'from', s, 'dynamic bidder evaluated to falsy'); + } + } catch (e) { + n.bbLogger.atVerbosity(1).logError('Issue evaluating dynamic bidder for ad unit', s, e); + var y = new Error('Issue evaluating dynamic bidder for ad unit '.concat(s, '. ').concat(JSON.stringify(e, g.default))); + p.errorReporting.report(y); + } + } else { + c.push(l); + } + }, l = 0; l < e.length; l++) { + d(l); + } + return c; + }(e.bids, e.code), e; + }), n.bbLogger.logInfo('Bidder Contexts:', JSON.parse(JSON.stringify(e))), e = {}, n.bbLogger.atVerbosity(1).logInfo('Applied Dynamic Bidders', s), s; + }, + register: function () { + (0, c.getConfig)('dynamicBidders', function (e) { + t = e; + }); + }, + protected: !0, + name: b + }; + }(), h = s.moduleManager.register(y, null, { gate: 'consentGiven' }); + t.dynamicBidders = h; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.amazon = void 0, r(6), r(13), r(9), r(11), r(4), r(26), r(17), r(2), r(1), r(3), r(5), r(95), r(0); + var n = r(8), i = r(146), o = r(74), a = r(39), s = r(35), u = w(r(86)), c = r(21), d = r(25), l = r(20), f = r(72), p = r(15), g = r(152), m = r(12), v = w(r(10)), b = r(44), y = r(58), h = w(r(94)), S = w(r(34)), O = w(r(172)), _ = w(r(56)), E = r(42), I = w(r(51)); + function w(e) { + return e && e.__esModule ? e : { default: e }; + } + function A(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return T(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return T(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function T(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function x() { + return (x = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function C(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function P(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? C(Object(r), !0).forEach(function (t) { + j(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : C(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function j(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var R = (0, n.logger)({ + name: 'amazon', + textColor: '#FFF', + bgColor: '#f08804' + }), D = v.default.MODULES, k = D.AMAZON_HEADER_BIDDING, N = D.GEOLOCATION, M = D.VIDEO, U = v.default.EVENTS, B = U.HEADER_BIDDING_REQUEST, L = U.HEADER_BIDDING_RESPONSE, z = v.default.QUERY_PARAMS.BID_SUPPRESS, V = function () { + var e = !1, t = !1, r = [], n = [], v = {}, w = (0, a.hookedFn)('sync', function () { + var e; + R.atVerbosity(3).logInfo('Initialized'), e = function (e, t) { + return (0, m.dom)().window.apstag._Q.push([ + e, + t + ]); + }, (0, m.dom)().window.apstag = (0, m.dom)().window.apstag || { + _Q: [], + init: function () { + e('i', arguments); + }, + fetchBids: function () { + e('f', arguments); + }, + setDisplayBids: function () { + } + }, (0, o.renderScript)({ + id: 'bb-amazon', + async: !0, + src: '//c.amazon-adsystem.com/aax2/apstag.js' + }), d.moduleManager.viaModule(M, function (e) { + e.getVideoUnitParams.before(C); + }), i.requestManager.register('amazon'); + }); + var T = (0, u.default)(function (e) { + var t = e.elementId || e.code, r = { + slotID: t, + slotName: (0, p.getConfig)('dfpPathObj.string') + '/' + t + }; + return e.isVideo ? r.mediaType = 'video' : r.sizes = e.getSizes().filter(function (e) { + return 'string' != typeof e && n.indexOf(e.join('x')) >= 0; + }), r; + }, function (e) { + return (0, p.getConfig)('dfpPathObj.string') + (e.elementId || e.code); + }); + function C(e, t, r, n) { + var i = (0, S.default)(n, 'params.cust_params') || {}, o = (0, _.default)(v[t.code], ['timeout']); + (0, h.default)(n, 'params.cust_params', (0, O.default)(o, i)), e(t, r, n); + } + function j() { + return r; + } + return c.exposureApi.expose({ getAmazonBids: j }), { + initialize: w, + register: function () { + (0, p.getConfig)('amazon.allowedSizes', function (e) { + n = e.map(function (e) { + return e.join('x'); + }); + }), t || d.moduleManager.viaModule(N, function (e) { + var r = e.onRegionSet, n = e.getRegionCode; + t = !0; + var i = function () { + var e = {}; + (0, p.getConfig)('amazon.regionConfig.'.concat(n())) && (e = (0, p.getConfig)('amazon.regionConfig.'.concat(n())), R.atVerbosity(3).logInfo('Applying region based config', e)), (0, p.setConfig)('amazon', P(P({}, (0, p.getConfig)('amazon')), e)); + }; + n() ? i() : (R.atVerbosity(3).logInfo('Listening for region code'), r(i)); + }); + }, + getAmazonBids: j, + name: k, + bidRequest: function (t) { + if (f.features.get([ + ''.concat(z, '.amazon'), + ''.concat(z, '.all') + ])) { + return i.requestManager.done('amazon'), t; + } + var n = A(function (e) { + for (var t = [], r = [], n = 0; n < e.length; n++) { + var i = e[n], o = (0, s.cloneDeep)(i); + o.bids = []; + for (var a = 0; a < i.bids.length; a++) { + var u = i.bids[a]; + 'amazon' !== u.bidder || f.features.get([ + ''.concat(z, '.').concat(i.code, '.amazon'), + ''.concat(z, '.').concat(i.code, '.all') + ]) ? o.bids.push(u) : '1' === u.params.included || !0 === u.params.included ? t.push(T(i)) : t.push(x({}, T(i), u.params)); + } + r.push(o); + } + return [ + t, + r + ]; + }(t), 2), o = n[0], a = n[1]; + return o.length > 0 ? function (t) { + var n = this; + new Promise(function (o, a) { + try { + e || ((0, m.dom)().window.apstag.init({ + pubID: (0, p.getConfig)('amazon.pubID'), + timeout: (0, p.getConfig)('bidderTimeout'), + adServer: (0, p.getConfig)('amazon.adServer') + }), e = !0), R.atVerbosity(1).logMessage('Amazon - Fetching bids', t), (0, m.dom)().window.apstag.fetchBids({ + slots: t, + timeout: (0, p.getConfig)('bidderTimeout') + }, function (e) { + !function (e) { + r.push(e), R.atVerbosity(1).logInfo('Amazon - Bids Returned', e), g.gptModule.gptAction(function (t) { + (0, m.dom)().window.apstag.setDisplayBids(); + var r = function (e) { + for (var t = (0, b.getUnits)(), r = [], n = function (n) { + var i = e[n], o = i.slotID, a = i.qsParams; + if (t[o].isVideo) { + var s = (0, y.urlQueryAsObject)('a?'.concat(a)); + v[o] && v[o].timeout && clearTimeout(v[o].timeout), v[o] = s, v[o].timeout = setTimeout(function () { + v[o].amzniid && v[o].amzniid === s.amzniid && (v[o] = {}); + }, 600000); + } else { + r.push(e[n]); + } + }, i = 0; i < e.length; i++) { + n(i); + } + return r; + }(e); + setTimeout(function () { + for (var e = 0; e < r.length; e++) { + var t = r[e]; + if ('2' !== t.amznbid) { + var n = g.gptModule.getSlotTargeting(t.slotID); + if (n.amzniid === t.amzniid && t.slotID && n.amzniid === t.amzniid) { + var i = g.gptModule.getSlot(t.slotID); + i && (R.logInfo('Clearing Amazon Targeting on unit', t.slotID, t), i.clearTargeting(Object.keys(t))); + } + } + } + }, 600000), i.requestManager.done('amazon'); + }); + }(e), l.eventEmitter.emit([ + L, + ''.concat(k, '.').concat(L) + ], k, t, e), o(n); + }), l.eventEmitter.emit([ + B, + ''.concat(k, '.').concat(B) + ], k, t); + } catch (e) { + R.atVerbosity(1).logError('Amazon -', e); + var s = new Error('Amazon - '.concat(e, '. ').concat(JSON.stringify(e, I.default))); + E.errorReporting.report(s), i.requestManager.done('amazon'), a(e); + } + }); + }(o) : i.requestManager.done('amazon'), a; + } + }; + }(), F = d.moduleManager.register(V, null, { gate: 'consentGiven' }); + t.amazon = F; + }, + function (e, t, r) { + 'use strict'; + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.resetSyncedStatus = function () { + T = 0; + }, t.resetWurlMap = function () { + B = {}; + }, t.PrebidServer = F, r(6), r(13), r(9), r(26), r(4), r(2), r(153), r(11), r(16), r(1), r(3), r(0), r(5); + var n = y(r(213)), i = r(154), o = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== E(e) && 'function' != typeof e) { + return { default: e }; + } + var t = b(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), a = r(36), s = y(r(87)), u = r(22), c = r(45), d = r(88), l = r(49), f = y(r(60)), p = y(r(31)), g = r(341), m = r(103), v = y(r(37)); + function b() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return b = function () { + return e; + }, e; + } + function y(e) { + return e && e.__esModule ? e : { default: e }; + } + function h(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function S(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return O(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return O(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function O(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function _() { + return (_ = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function E(e) { + return (E = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var I, w = u.config.getConfig, A = a.S2S.SRC, T = 0, x = { + enabled: !1, + timeout: 1000, + maxBids: 1, + adapter: 'prebidServer', + adapterOptions: {}, + syncUrlModifier: {} + }; + function C(e) { + if (e) { + var t = Array.isArray(e) ? e : [e], r = []; + return t.every(function (e, t, n) { + if (!1 !== function (e) { + if (e.defaultVendor) { + var t = e.defaultVendor, r = Object.keys(e); + if (!g.S2S_VENDORS[t]) { + return o.logError('Incorrect or unavailable prebid server default vendor option: ' + t), !1; + } + Object.keys(g.S2S_VENDORS[t]).forEach(function (n) { + x[n] !== e[n] && (0, p.default)(r, n) || (e[n] = g.S2S_VENDORS[t][n]); + }); + } + }(e) && !1 !== function (e) { + var t = Object.keys(e); + if ([ + 'accountId', + 'bidders', + 'endpoint' + ].filter(function (e) { + return !(0, p.default)(t, e) && (o.logError(e + ' missing in server to server config'), !0); + }).length > 0) { + return !1; + } + }(e)) { + return Array.isArray(e.bidders) && (n[t].bidders = e.bidders.filter(function (e) { + return -1 === r.indexOf(e) && (r.push(e), !0); + })), !0; + } + return !1; + }) ? I = t : void 0; + } + } + function P(e, t) { + if (0 !== e.length) { + var r = e.shift(); + r.no_cookie ? function (e, t, r, n, i) { + if (i.syncUrlModifier && 'function' == typeof i.syncUrlModifier[r]) { + j(e, i.syncUrlModifier[r](e, t, r), r, n); + } else { + j(e, t, r, n); + } + }(r.usersync.type, r.usersync.url, r.bidder, o.bind.call(P, null, e, t), t) : P(e, t); + } + } + function j(e, t, r, n) { + t ? 'image' === e || 'redirect' === e ? (o.logMessage('Invoking image pixel user sync for bidder: "'.concat(r, '"')), o.triggerPixel(t, n)) : 'iframe' == e ? (o.logMessage('Invoking iframe user sync for bidder: "'.concat(r, '"')), o.insertUserSyncIframe(t, n)) : (o.logError('User sync type "'.concat(e, '" not supported for bidder: "').concat(r, '"')), n()) : (o.logError('No sync url for bidder "'.concat(r, '": ').concat(t)), n()); + } + u.config.setDefaults({ s2sConfig: x }), w('s2sConfig', function (e) { + return C(e.s2sConfig); + }); + var R = { + sponsoredBy: 1, + body: 2, + rating: 3, + likes: 4, + downloads: 5, + price: 6, + salePrice: 7, + phone: 8, + address: 9, + body2: 10, + cta: 12 + }, D = Object.keys(R), k = { + icon: 1, + image: 3 + }, N = { + img: 1, + js: 2 + }; + [ + R, + k, + { + impression: 1, + 'viewable-mrc50': 2, + 'viewable-mrc100': 3, + 'viewable-video50': 4 + }, + N + ].forEach(function (e) { + Object.keys(e).forEach(function (t) { + e[e[t]] = t; + }); + }); + var M = {}, U = {}, B = {}; + var L = function (e, t, r, n) { + var i = [], a = {}, c = t[0]; + if (r.forEach(function (e) { + var t, r = (0, d.processNativeAdUnitParams)(o.deepAccess(e, 'mediaTypes.native')); + if (r) { + try { + t = U[e.code] = Object.keys(r).reduce(function (e, t) { + var n = r[t]; + function i(e) { + return _({ required: n.required ? 1 : 0 }, e ? o.cleanObj(e) : {}); + } + switch (t) { + case 'image': + case 'icon': + var a = k[t], s = o.cleanObj({ + type: a, + w: o.deepAccess(n, 'sizes.0'), + h: o.deepAccess(n, 'sizes.1'), + wmin: o.deepAccess(n, 'aspect_ratios.0.min_width'), + hmin: o.deepAccess(n, 'aspect_ratios.0.min_height') + }); + if (!(s.w && s.h || s.hmin && s.wmin)) { + throw 'invalid img sizes (must provide sizes or min_height & min_width if using aspect_ratios)'; + } + Array.isArray(n.aspect_ratios) && (s.ext = { + aspectratios: n.aspect_ratios.map(function (e) { + return ''.concat(e.ratio_width, ':').concat(e.ratio_height); + }) + }), e.push(i({ img: s })); + break; + case 'title': + if (!n.len) { + throw 'invalid title.len'; + } + e.push(i({ title: { len: n.len } })); + break; + default: + var u = R[t]; + u && e.push(i({ + data: { + type: u, + len: n.len + } + })); + } + return e; + }, []); + } catch (e) { + o.logError('error creating native request: ' + String(e)); + } + } + var u = o.deepAccess(e, 'mediaTypes.video'), l = o.deepAccess(e, 'mediaTypes.banner'); + e.bids.forEach(function (t) { + if (M[''.concat(e.code).concat(t.bidder)] = t.bid_id, s.default.aliasRegistry[t.bidder]) { + var r = s.default.bidderRegistry[t.bidder]; + r && !r.getSpec().skipPbsAliasing && (a[t.bidder] = s.default.aliasRegistry[t.bidder]); + } + }); + var f = {}; + if (l && l.sizes) { + var p = o.parseSizesInput(l.sizes).map(function (e) { + var t = S(e.split('x'), 2), r = t[0], n = t[1]; + return { + w: parseInt(r, 10), + h: parseInt(n, 10) + }; + }); + f.banner = { format: p }; + } + if (o.isEmpty(u) || ('outstream' !== u.context || e.renderer ? ('instream' !== u.context || u.hasOwnProperty('placement') || (u.placement = 1), f.video = u) : o.logError('Outstream bid without renderer cannot be sent to Prebid Server.')), t) { + try { + f.native = { + request: JSON.stringify({ + context: 1, + plcmttype: 1, + eventtrackers: [{ + event: 1, + methods: [1] + }], + assets: t + }), + ver: '1.2' + }; + } catch (e) { + o.logError('error creating native request: ' + String(e)); + } + } + var g = e.bids.reduce(function (e, t) { + var r = s.default.bidderRegistry[t.bidder]; + return r && r.getSpec().transformBidParams && (t.params = r.getSpec().transformBidParams(t.params, !0)), e[t.bidder] = n.adapterOptions && n.adapterOptions[t.bidder] ? _({}, t.params, n.adapterOptions[t.bidder]) : t.params, e; + }, {}), m = { + id: e.code, + ext: g, + secure: n.secure + }, b = o.deepAccess(e, 'fpd.context.pbAdSlot'); + 'string' == typeof b && b && o.deepSetValue(m, 'ext.context.data.pbadslot', b), [ + 'name', + 'adSlot' + ].forEach(function (t) { + var r = o.deepAccess(e, 'fpd.context.adserver.'.concat(t)); + 'string' == typeof r && r && o.deepSetValue(m, 'ext.context.data.adserver.'.concat(t.toLowerCase()), r); + }), _(m, f); + var y = (0, v.default)(c.bids, function (t) { + return t.adUnitCode === e.code && t.storedAuctionResponse; + }); + y && o.deepSetValue(m, 'ext.prebid.storedauctionresponse.id', y.storedAuctionResponse.toString()), (m.banner || m.video || m.native) && i.push(m); + }), i.length) { + var l = { + id: e.tid, + source: { tid: e.tid }, + tmax: n.timeout, + imp: i, + test: w('debug') ? 1 : 0, + ext: { + prebid: { + auctiontimestamp: c.auctionStart, + targeting: { + includewinners: !0, + includebidderkeys: !1 + } + } + } + }; + n.extPrebid && 'object' === E(n.extPrebid) && (l.ext.prebid = _(l.ext.prebid, n.extPrebid)); + var f = u.config.getConfig('currency.adServerCurrency'); + f && 'string' == typeof f ? l.cur = [f] : Array.isArray(f) && f.length && (l.cur = [f[0]]), function (e, t, r) { + e && ('object' === E(u.config.getConfig('app')) ? (e.app = u.config.getConfig('app'), e.app.publisher = { id: r }) : (e.site = {}, o.isPlainObject(u.config.getConfig('site')) && (e.site = u.config.getConfig('site')), o.deepAccess(e.site, 'publisher.id') || o.deepSetValue(e.site, 'publisher.id', r), e.site.page || (e.site.page = t)), 'object' === E(u.config.getConfig('device')) && (e.device = u.config.getConfig('device')), e.device || (e.device = {}), e.device.w || (e.device.w = window.innerWidth), e.device.h || (e.device.h = window.innerHeight)); + }(l, t[0].refererInfo.referer, n.accountId); + var p = o.deepAccess(t, '0.bids.0.schain'); + p && (l.source.ext = { schain: p }), o.isEmpty(a) || (l.ext.prebid.aliases = a); + var g = o.deepAccess(t, '0.bids.0.userIdAsEids'); + if (o.isArray(g) && g.length > 0 && o.deepSetValue(l, 'user.ext.eids', g), t) { + var m; + if (c.gdprConsent) { + 'boolean' == typeof c.gdprConsent.gdprApplies && (m = c.gdprConsent.gdprApplies ? 1 : 0), o.deepSetValue(l, 'regs.ext.gdpr', m), o.deepSetValue(l, 'user.ext.consent', c.gdprConsent.consentString), c.gdprConsent.addtlConsent && 'string' == typeof c.gdprConsent.addtlConsent && o.deepSetValue(l, 'user.ext.ConsentedProvidersSettings.consented_providers', c.gdprConsent.addtlConsent); + } + c.uspConsent && o.deepSetValue(l, 'regs.ext.us_privacy', c.uspConsent); + } + !0 === w('coppa') && o.deepSetValue(l, 'regs.coppa', 1); + var b = w('fpd') || {}; + return b.context && o.deepSetValue(l, 'site.ext.data', b.context), b.user && o.deepSetValue(l, 'user.ext.data', b.user), function (e) { + var t = u.config.getBidderConfig(), r = Object.keys(t).reduce(function (e, r) { + var n = t[r]; + if (n.fpd) { + var i = {}; + n.fpd.context && (i.site = n.fpd.context), n.fpd.user && (i.user = n.fpd.user), e.push({ + bidders: [r], + config: { fpd: i } + }); + } + return e; + }, []); + r.length && o.deepSetValue(e, 'ext.prebid.bidderconfig', r); + }(l), l; + } + o.logError('Request to Prebid Server rejected due to invalid media type(s) in adUnit.'); + }, z = function (e, t, r) { + var n = []; + return [ + [ + 'errors', + 'serverErrors' + ], + [ + 'responsetimemillis', + 'serverResponseTimeMs' + ] + ].forEach(function (r) { + return function (e, t, r, n) { + var i = o.deepAccess(t, 'ext.'.concat(r)); + i && Object.keys(i).forEach(function (t) { + var r = (0, v.default)(e, function (e) { + return e.bidderCode === t; + }); + r && (r[n] = i[t]); + }); + }(t, e, r[0], r[1]); + }), e.seatbid && e.seatbid.forEach(function (s) { + (s.bid || []).forEach(function (u) { + var d, l = ''.concat(u.impid).concat(s.seat); + M[l] && (d = o.getBidRequest(M[l], t)); + var f = u.price, p = 0 !== f ? a.STATUS.GOOD : a.STATUS.NO_BID, g = (0, i.createBid)(p, d || { + bidder: s.seat, + src: A + }); + g.cpm = f; + var m = o.deepAccess(e, [ + 'ext', + 'responsetimemillis', + s.seat + ].join('.')); + d && m && (d.serverResponseTimeMs = m); + var v, b, y, S = o.deepAccess(u, 'ext.prebid.bidid'); + o.isStr(S) && (g.pbsBidId = S), o.isStr(o.deepAccess(u, 'ext.prebid.events.win')) && (v = d.auctionId, b = g.adId, y = o.deepAccess(u, 'ext.prebid.events.win'), [ + v, + b + ].every(o.isStr) && (B[''.concat(v).concat(b)] = y)); + var O = o.deepAccess(u, 'ext.prebid.targeting'); + if (o.isPlainObject(O) && (o.isStr(o.deepAccess(u, 'ext.prebid.events.win')) && (O = o.getDefinedParams(O, Object.keys(O).filter(function (e) { + return -1 === e.indexOf('hb_winurl') && -1 === e.indexOf('hb_bidid'); + }))), g.adserverTargeting = O), g.seatBidId = u.id, o.deepAccess(u, 'ext.prebid.type') === c.VIDEO) { + g.mediaType = c.VIDEO; + var _ = d.sizes && d.sizes[0]; + g.playerWidth = _[0], g.playerHeight = _[1], u.ext.prebid.cache && 'object' === E(u.ext.prebid.cache.vastXml) && u.ext.prebid.cache.vastXml.cacheId && u.ext.prebid.cache.vastXml.url ? (g.videoCacheKey = u.ext.prebid.cache.vastXml.cacheId, g.vastUrl = u.ext.prebid.cache.vastXml.url) : O && O.hb_uuid && O.hb_cache_host && O.hb_cache_path && (g.videoCacheKey = O.hb_uuid, g.vastUrl = 'https://'.concat(O.hb_cache_host).concat(O.hb_cache_path, '?uuid=').concat(O.hb_uuid)), u.adm && (g.vastXml = u.adm), !g.vastUrl && u.nurl && (g.vastUrl = u.nurl); + } else if (o.deepAccess(u, 'ext.prebid.type') === c.NATIVE) { + var I, w; + g.mediaType = c.NATIVE, w = 'string' == typeof u.adm ? g.adm = JSON.parse(u.adm) : g.adm = u.adm; + var T = (h(I = {}, N.img, w.imptrackers || []), h(I, N.js, w.jstracker ? [w.jstracker] : []), I); + if (w.eventtrackers && w.eventtrackers.forEach(function (e) { + switch (e.method) { + case N.img: + T[N.img].push(e.url); + break; + case N.js: + T[N.js].push(e.url); + } + }), o.isPlainObject(w) && Array.isArray(w.assets)) { + var x = U[d.adUnitCode]; + g.native = o.cleanObj(w.assets.reduce(function (e, t) { + var r = x[t.id]; + return o.isPlainObject(t.img) ? e[r.img.type ? k[r.img.type] : 'image'] = o.pick(t.img, [ + 'url', + 'w as width', + 'h as height' + ]) : o.isPlainObject(t.title) ? e.title = t.title.text : o.isPlainObject(t.data) && D.forEach(function (n) { + R[n] === r.data.type && (e[n] = t.data.value); + }), e; + }, o.cleanObj({ + clickUrl: w.link, + clickTrackers: o.deepAccess(w, 'link.clicktrackers'), + impressionTrackers: T[N.img], + javascriptTrackers: T[N.js] + }))); + } else { + o.logError('prebid server native response contained no assets'); + } + } else { + u.adm && u.nurl ? (g.ad = u.adm, g.ad += o.createTrackPixelHtml(decodeURIComponent(u.nurl))) : u.adm ? g.ad = u.adm : u.nurl && (g.adUrl = u.nurl); + } + g.width = u.w, g.height = u.h, u.dealid && (g.dealId = u.dealid), g.requestId = d.bidId || d.bid_Id, g.creative_id = u.crid, g.creativeId = u.crid, u.burl && (g.burl = u.burl), g.currency = e.cur ? e.cur : 'USD', g.meta = g.meta || {}, u.adomain && (g.meta.advertiserDomains = u.adomain); + var C = r.defaultTtl || 60; + g.ttl = u.exp ? u.exp : C, g.netRevenue = !u.netRevenue || u.netRevenue, n.push({ + adUnit: u.impid, + bid: g + }); + }); + }), n; + }; + function V(e) { + var t, r, n = function (e, t) { + if ([ + e, + t + ].every(o.isStr)) { + return B[''.concat(e).concat(t)]; + } + }(e.auctionId, e.adId); + o.isStr(n) && (o.logMessage('Invoking image pixel for wurl on BID_WIN: "'.concat(n, '"')), o.triggerPixel(n), t = e.auctionId, r = e.adId, [ + t, + r + ].every(o.isStr) && (B[''.concat(t).concat(r)] = void 0)); + } + function F() { + var e = new n.default('prebidServer'); + return e.callBids = function (e, t, r, n, i) { + var u = o.deepClone(e.ad_units).filter(function (e) { + return e.mediaTypes && (e.mediaTypes.native || e.mediaTypes.banner && e.mediaTypes.banner.sizes || e.mediaTypes.video && e.mediaTypes.video.playerSize); + }), c = u.map(function (e) { + return e.bids.map(function (e) { + return e.bidder; + }).filter(o.uniques); + }).reduce(o.flatten).filter(o.uniques); + if (Array.isArray(I)) { + var d, g; + if (e.s2sConfig && e.s2sConfig.syncEndpoint) { + Array.isArray(t) && t.length > 0 && (d = t[0].gdprConsent, g = t[0].uspConsent), function (e, t, r, n) { + if (I.length !== T) { + T++; + var i = { + uuid: o.generateUUID(), + bidders: e, + account: n.accountId + }, a = n.userSyncLimit; + o.isNumber(a) && a > 0 && (i.limit = a), t && (void 0 !== t.consentString && (i.gdpr = t.gdprApplies ? 1 : 0), !1 !== t.gdprApplies && (i.gdpr_consent = t.consentString)), r && (i.us_privacy = r); + var s = JSON.stringify(i); + (0, m.ajax)(n.syncEndpoint, function (e) { + try { + P((e = JSON.parse(e)).bidder_status, n); + } catch (e) { + o.logError(e); + } + }, s, { + contentType: 'text/plain', + withCredentials: !0 + }); + } + }(e.s2sConfig.bidders.map(function (e) { + return s.default.aliasRegistry[e] || e; + }).filter(function (e, t, r) { + return r.indexOf(e) === t; + }), d, g, e.s2sConfig); + } + var v = L(e, t, u, e.s2sConfig), b = v && JSON.stringify(v); + v && b && i(e.s2sConfig.endpoint, { + success: function (i) { + return function (e, t, r, n, i, u) { + var c; + try { + c = JSON.parse(e), z(c, r, u).forEach(function (e) { + var t = e.adUnit, i = e.bid; + (0, l.isValid)(t, i, r) && n(t, i); + }), r.forEach(function (e) { + return f.default.emit(a.EVENTS.BIDDER_DONE, e); + }); + } catch (e) { + o.logError(e); + } + (!c || c.status && (0, p.default)(c.status, 'Error')) && o.logError('error parsing response: ', c.status); + i(), d = t, d.forEach(function (e) { + var t = s.default.getBidAdapter(e); + t && t.registerSyncs && t.registerSyncs([]); + }); + var d; + }(i, c, t, r, n, e.s2sConfig); + }, + error: n + }, b, { + contentType: 'text/plain', + withCredentials: !0 + }); + } + }, f.default.on(a.EVENTS.BID_WON, V), _(this, { + callBids: e.callBids, + setBidderCode: e.setBidderCode, + type: A + }); + } + s.default.registerBidAdapter(new F(), 'prebidServer'); + }, + function (e, t, r) { + 'use strict'; + var n = r(85), i = r(78).getWeak, o = r(27), a = r(23), s = r(84), u = r(117), c = r(125), d = r(50), l = r(97), f = c(5), p = c(6), g = 0, m = function (e) { + return e._l || (e._l = new v()); + }, v = function () { + this.a = []; + }, b = function (e, t) { + return f(e.a, function (e) { + return e[0] === t; + }); + }; + v.prototype = { + get: function (e) { + var t = b(this, e); + if (t) { + return t[1]; + } + }, + has: function (e) { + return !!b(this, e); + }, + set: function (e, t) { + var r = b(this, e); + r ? r[1] = t : this.a.push([ + e, + t + ]); + }, + delete: function (e) { + var t = p(this.a, function (t) { + return t[0] === e; + }); + return ~t && this.a.splice(t, 1), !!~t; + } + }, e.exports = { + getConstructor: function (e, t, r, o) { + var c = e(function (e, n) { + s(e, c, t, '_i'), e._t = t, e._i = g++, e._l = void 0, null != n && u(n, r, e[o], e); + }); + return n(c.prototype, { + delete: function (e) { + if (!a(e)) { + return !1; + } + var r = i(e); + return !0 === r ? m(l(this, t)).delete(e) : r && d(r, this._i) && delete r[this._i]; + }, + has: function (e) { + if (!a(e)) { + return !1; + } + var r = i(e); + return !0 === r ? m(l(this, t)).has(e) : r && d(r, this._i); + } + }), c; + }, + def: function (e, t, r) { + var n = i(o(t), !0); + return !0 === n ? m(e).set(t, r) : n[e._i] = r, e; + }, + ufstore: m + }; + }, + function (e, t, r) { + var n = r(14), i = r(24), o = r(68), a = /"/g, s = function (e, t, r, n) { + var i = String(o(e)), s = '<' + t; + return '' !== r && (s += ' ' + r + '="' + String(n).replace(a, '"') + '"'), s + '>' + i + ''; + }; + e.exports = function (e, t) { + var r = {}; + r[e] = t(s), n(n.P + n.F * i(function () { + var t = ''[e]('"'); + return t !== t.toLowerCase() || t.split('"').length > 3; + }), 'String', r); + }; + }, + function (e, t, r) { + var n = r(14); + n(n.P, 'Array', { fill: r(155) }), r(107)('fill'); + }, + function (e, t, r) { + var n = r(14), i = Math.imul; + n(n.S + n.F * r(24)(function () { + return -5 != i(4294967295, 5) || 2 != i.length; + }), 'Math', { + imul: function (e, t) { + var r = +e, n = +t, i = 65535 & r, o = 65535 & n; + return 0 | i * o + ((65535 & r >>> 16) * o + i * (65535 & n >>> 16) << 16 >>> 0); + } + }); + }, + function (e, t, r) { + var n = r(14); + n(n.S, 'Number', { isInteger: r(331) }); + }, + function (e, t, r) { + var n = r(23), i = Math.floor; + e.exports = function (e) { + return !n(e) && isFinite(e) && i(e) === e; + }; + }, + function (e, t) { + e.exports = Object.is || function (e, t) { + return e === t ? 0 !== e || 1 / e == 1 / t : e != e && t != t; + }; + }, + function (e, t, r) { + 'use strict'; + if (r(28)) { + var n = r(64), i = r(18), o = r(24), a = r(14), s = r(215), u = r(334), c = r(53), d = r(84), l = r(77), f = r(46), p = r(85), g = r(69), m = r(38), v = r(216), b = r(105), y = r(89), h = r(50), S = r(92), O = r(23), _ = r(47), E = r(144), I = r(80), w = r(166), A = r(66).f, T = r(145), x = r(63), C = r(19), P = r(125), j = r(130), R = r(137), D = r(3), k = r(81), N = r(119), M = r(118), U = r(155), B = r(335), L = r(32), z = r(90), V = L.f, F = z.f, q = i.RangeError, G = i.TypeError, W = i.Uint8Array, H = Array.prototype, Y = u.ArrayBuffer, K = u.DataView, J = P(0), Q = P(2), X = P(3), $ = P(4), Z = P(5), ee = P(6), te = j(!0), re = j(!1), ne = D.values, ie = D.keys, oe = D.entries, ae = H.lastIndexOf, se = H.reduce, ue = H.reduceRight, ce = H.join, de = H.sort, le = H.slice, fe = H.toString, pe = H.toLocaleString, ge = C('iterator'), me = C('toStringTag'), ve = x('typed_constructor'), be = x('def_constructor'), ye = s.CONSTR, he = s.TYPED, Se = s.VIEW, Oe = P(1, function (e, t) { + return Ae(R(e, e[be]), t); + }), _e = o(function () { + return 1 === new W(new Uint16Array([1]).buffer)[0]; + }), Ee = !!W && !!W.prototype.set && o(function () { + new W(1).set({}); + }), Ie = function (e, t) { + var r = g(e); + if (r < 0 || r % t) { + throw q('Wrong offset!'); + } + return r; + }, we = function (e) { + if (O(e) && he in e) { + return e; + } + throw G(e + ' is not a typed array!'); + }, Ae = function (e, t) { + if (!O(e) || !(ve in e)) { + throw G('It is not a typed array constructor!'); + } + return new e(t); + }, Te = function (e, t) { + return xe(R(e, e[be]), t); + }, xe = function (e, t) { + for (var r = 0, n = t.length, i = Ae(e, n); n > r;) { + i[r] = t[r++]; + } + return i; + }, Ce = function (e, t, r) { + V(e, t, { + get: function () { + return this._d[r]; + } + }); + }, Pe = function (e) { + var t, r, n, i, o, a, s = _(e), u = arguments.length, d = u > 1 ? arguments[1] : void 0, l = void 0 !== d, f = T(s); + if (null != f && !E(f)) { + for (a = f.call(s), n = [], t = 0; !(o = a.next()).done; t++) { + n.push(o.value); + } + s = n; + } + for (l && u > 2 && (d = c(d, arguments[2], 2)), t = 0, r = m(s.length), i = Ae(this, r); r > t; t++) { + i[t] = l ? d(s[t], t) : s[t]; + } + return i; + }, je = function () { + for (var e = 0, t = arguments.length, r = Ae(this, t); t > e;) { + r[e] = arguments[e++]; + } + return r; + }, Re = !!W && o(function () { + pe.call(new W(1)); + }), De = function () { + return pe.apply(Re ? le.call(we(this)) : we(this), arguments); + }, ke = { + copyWithin: function (e, t) { + return B.call(we(this), e, t, arguments.length > 2 ? arguments[2] : void 0); + }, + every: function (e) { + return $(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + fill: function (e) { + return U.apply(we(this), arguments); + }, + filter: function (e) { + return Te(this, Q(we(this), e, arguments.length > 1 ? arguments[1] : void 0)); + }, + find: function (e) { + return Z(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + findIndex: function (e) { + return ee(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + forEach: function (e) { + J(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + indexOf: function (e) { + return re(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + includes: function (e) { + return te(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + join: function (e) { + return ce.apply(we(this), arguments); + }, + lastIndexOf: function (e) { + return ae.apply(we(this), arguments); + }, + map: function (e) { + return Oe(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + reduce: function (e) { + return se.apply(we(this), arguments); + }, + reduceRight: function (e) { + return ue.apply(we(this), arguments); + }, + reverse: function () { + for (var e, t = we(this).length, r = Math.floor(t / 2), n = 0; n < r;) { + e = this[n], this[n++] = this[--t], this[t] = e; + } + return this; + }, + some: function (e) { + return X(we(this), e, arguments.length > 1 ? arguments[1] : void 0); + }, + sort: function (e) { + return de.call(we(this), e); + }, + subarray: function (e, t) { + var r = we(this), n = r.length, i = b(e, n); + return new (R(r, r[be]))(r.buffer, r.byteOffset + i * r.BYTES_PER_ELEMENT, m((void 0 === t ? n : b(t, n)) - i)); + } + }, Ne = function (e, t) { + return Te(this, le.call(we(this), e, t)); + }, Me = function (e) { + we(this); + var t = Ie(arguments[1], 1), r = this.length, n = _(e), i = m(n.length), o = 0; + if (i + t > r) { + throw q('Wrong length!'); + } + for (; o < i;) { + this[t + o] = n[o++]; + } + }, Ue = { + entries: function () { + return oe.call(we(this)); + }, + keys: function () { + return ie.call(we(this)); + }, + values: function () { + return ne.call(we(this)); + } + }, Be = function (e, t) { + return O(e) && e[he] && 'symbol' != typeof t && t in e && String(+t) == String(t); + }, Le = function (e, t) { + return Be(e, t = y(t, !0)) ? l(2, e[t]) : F(e, t); + }, ze = function (e, t, r) { + return !(Be(e, t = y(t, !0)) && O(r) && h(r, 'value')) || h(r, 'get') || h(r, 'set') || r.configurable || h(r, 'writable') && !r.writable || h(r, 'enumerable') && !r.enumerable ? V(e, t, r) : (e[t] = r.value, e); + }; + ye || (z.f = Le, L.f = ze), a(a.S + a.F * !ye, 'Object', { + getOwnPropertyDescriptor: Le, + defineProperty: ze + }), o(function () { + fe.call({}); + }) && (fe = pe = function () { + return ce.call(this); + }); + var Ve = p({}, ke); + p(Ve, Ue), f(Ve, ge, Ue.values), p(Ve, { + slice: Ne, + set: Me, + constructor: function () { + }, + toString: fe, + toLocaleString: De + }), Ce(Ve, 'buffer', 'b'), Ce(Ve, 'byteOffset', 'o'), Ce(Ve, 'byteLength', 'l'), Ce(Ve, 'length', 'e'), V(Ve, me, { + get: function () { + return this[he]; + } + }), e.exports = function (e, t, r, u) { + var c = e + ((u = !!u) ? 'Clamped' : '') + 'Array', l = 'get' + e, p = 'set' + e, g = i[c], b = g || {}, y = g && w(g), h = !g || !s.ABV, _ = {}, E = g && g.prototype, T = function (e, r) { + V(e, r, { + get: function () { + return function (e, r) { + var n = e._d; + return n.v[l](r * t + n.o, _e); + }(this, r); + }, + set: function (e) { + return function (e, r, n) { + var i = e._d; + u && (n = (n = Math.round(n)) < 0 ? 0 : n > 255 ? 255 : 255 & n), i.v[p](r * t + i.o, n, _e); + }(this, r, e); + }, + enumerable: !0 + }); + }; + h ? (g = r(function (e, r, n, i) { + d(e, g, c, '_d'); + var o, a, s, u, l = 0, p = 0; + if (O(r)) { + if (!(r instanceof Y || 'ArrayBuffer' == (u = S(r)) || 'SharedArrayBuffer' == u)) { + return he in r ? xe(g, r) : Pe.call(g, r); + } + o = r, p = Ie(n, t); + var b = r.byteLength; + if (void 0 === i) { + if (b % t) { + throw q('Wrong length!'); + } + if ((a = b - p) < 0) { + throw q('Wrong length!'); + } + } else if ((a = m(i) * t) + p > b) { + throw q('Wrong length!'); + } + s = a / t; + } else { + s = v(r), o = new Y(a = s * t); + } + for (f(e, '_d', { + b: o, + o: p, + l: a, + e: s, + v: new K(o) + }); l < s;) { + T(e, l++); + } + }), E = g.prototype = I(Ve), f(E, 'constructor', g)) : o(function () { + g(1); + }) && o(function () { + new g(-1); + }) && N(function (e) { + new g(), new g(null), new g(1.5), new g(e); + }, !0) || (g = r(function (e, r, n, i) { + var o; + return d(e, g, c), O(r) ? r instanceof Y || 'ArrayBuffer' == (o = S(r)) || 'SharedArrayBuffer' == o ? void 0 !== i ? new b(r, Ie(n, t), i) : void 0 !== n ? new b(r, Ie(n, t)) : new b(r) : he in r ? xe(g, r) : Pe.call(g, r) : new b(v(r)); + }), J(y !== Function.prototype ? A(b).concat(A(y)) : A(b), function (e) { + e in g || f(g, e, b[e]); + }), g.prototype = E, n || (E.constructor = g)); + var x = E[ge], C = !!x && ('values' == x.name || null == x.name), P = Ue.values; + f(g, ve, !0), f(E, he, c), f(E, Se, !0), f(E, be, g), (u ? new g(1)[me] == c : me in E) || V(E, me, { + get: function () { + return c; + } + }), _[c] = g, a(a.G + a.W + a.F * (g != b), _), a(a.S, c, { BYTES_PER_ELEMENT: t }), a(a.S + a.F * o(function () { + b.of.call(g, 1); + }), c, { + from: Pe, + of: je + }), 'BYTES_PER_ELEMENT' in E || f(E, 'BYTES_PER_ELEMENT', t), a(a.P, c, ke), M(c), a(a.P + a.F * Ee, c, { set: Me }), a(a.P + a.F * !C, c, Ue), n || E.toString == fe || (E.toString = fe), a(a.P + a.F * o(function () { + new g(1).slice(); + }), c, { slice: Ne }), a(a.P + a.F * (o(function () { + return [ + 1, + 2 + ].toLocaleString() != new g([ + 1, + 2 + ]).toLocaleString(); + }) || !o(function () { + E.toLocaleString.call([ + 1, + 2 + ]); + })), c, { toLocaleString: De }), k[c] = C ? x : P, n || C || f(E, ge, P); + }; + } else { + e.exports = function () { + }; + } + }, + function (e, t, r) { + 'use strict'; + var n = r(18), i = r(28), o = r(64), a = r(215), s = r(46), u = r(85), c = r(24), d = r(84), l = r(69), f = r(38), p = r(216), g = r(66).f, m = r(32).f, v = r(155), b = r(79), y = n.ArrayBuffer, h = n.DataView, S = n.Math, O = n.RangeError, _ = n.Infinity, E = y, I = S.abs, w = S.pow, A = S.floor, T = S.log, x = S.LN2, C = i ? '_b' : 'buffer', P = i ? '_l' : 'byteLength', j = i ? '_o' : 'byteOffset'; + function R(e, t, r) { + var n, i, o, a = new Array(r), s = 8 * r - t - 1, u = (1 << s) - 1, c = u >> 1, d = 23 === t ? w(2, -24) - w(2, -77) : 0, l = 0, f = e < 0 || 0 === e && 1 / e < 0 ? 1 : 0; + for ((e = I(e)) != e || e === _ ? (i = e != e ? 1 : 0, n = u) : (n = A(T(e) / x), e * (o = w(2, -n)) < 1 && (n--, o *= 2), (e += n + c >= 1 ? d / o : d * w(2, 1 - c)) * o >= 2 && (n++, o /= 2), n + c >= u ? (i = 0, n = u) : n + c >= 1 ? (i = (e * o - 1) * w(2, t), n += c) : (i = e * w(2, c - 1) * w(2, t), n = 0)); t >= 8; a[l++] = 255 & i, i /= 256, t -= 8) { + } + for (n = n << t | i, s += t; s > 0; a[l++] = 255 & n, n /= 256, s -= 8) { + } + return a[--l] |= 128 * f, a; + } + function D(e, t, r) { + var n, i = 8 * r - t - 1, o = (1 << i) - 1, a = o >> 1, s = i - 7, u = r - 1, c = e[u--], d = 127 & c; + for (c >>= 7; s > 0; d = 256 * d + e[u], u--, s -= 8) { + } + for (n = d & (1 << -s) - 1, d >>= -s, s += t; s > 0; n = 256 * n + e[u], u--, s -= 8) { + } + if (0 === d) { + d = 1 - a; + } else { + if (d === o) { + return n ? NaN : c ? -_ : _; + } + n += w(2, t), d -= a; + } + return (c ? -1 : 1) * n * w(2, d - t); + } + function k(e) { + return e[3] << 24 | e[2] << 16 | e[1] << 8 | e[0]; + } + function N(e) { + return [255 & e]; + } + function M(e) { + return [ + 255 & e, + e >> 8 & 255 + ]; + } + function U(e) { + return [ + 255 & e, + e >> 8 & 255, + e >> 16 & 255, + e >> 24 & 255 + ]; + } + function B(e) { + return R(e, 52, 8); + } + function L(e) { + return R(e, 23, 4); + } + function z(e, t, r) { + m(e.prototype, t, { + get: function () { + return this[r]; + } + }); + } + function V(e, t, r, n) { + var i = p(+r); + if (i + t > e[P]) { + throw O('Wrong index!'); + } + var o = e[C]._b, a = i + e[j], s = o.slice(a, a + t); + return n ? s : s.reverse(); + } + function F(e, t, r, n, i, o) { + var a = p(+r); + if (a + t > e[P]) { + throw O('Wrong index!'); + } + for (var s = e[C]._b, u = a + e[j], c = n(+i), d = 0; d < t; d++) { + s[u + d] = c[o ? d : t - d - 1]; + } + } + if (a.ABV) { + if (!c(function () { + y(1); + }) || !c(function () { + new y(-1); + }) || c(function () { + return new y(), new y(1.5), new y(NaN), 'ArrayBuffer' != y.name; + })) { + for (var q, G = (y = function (e) { + return d(this, y), new E(p(e)); + }).prototype = E.prototype, W = g(E), H = 0; W.length > H;) { + (q = W[H++]) in y || s(y, q, E[q]); + } + o || (G.constructor = y); + } + var Y = new h(new y(2)), K = h.prototype.setInt8; + Y.setInt8(0, 2147483648), Y.setInt8(1, 2147483649), !Y.getInt8(0) && Y.getInt8(1) || u(h.prototype, { + setInt8: function (e, t) { + K.call(this, e, t << 24 >> 24); + }, + setUint8: function (e, t) { + K.call(this, e, t << 24 >> 24); + } + }, !0); + } else { + y = function (e) { + d(this, y, 'ArrayBuffer'); + var t = p(e); + this._b = v.call(new Array(t), 0), this[P] = t; + }, h = function (e, t, r) { + d(this, h, 'DataView'), d(e, y, 'DataView'); + var n = e[P], i = l(t); + if (i < 0 || i > n) { + throw O('Wrong offset!'); + } + if (i + (r = void 0 === r ? n - i : f(r)) > n) { + throw O('Wrong length!'); + } + this[C] = e, this[j] = i, this[P] = r; + }, i && (z(y, 'byteLength', '_l'), z(h, 'buffer', '_b'), z(h, 'byteLength', '_l'), z(h, 'byteOffset', '_o')), u(h.prototype, { + getInt8: function (e) { + return V(this, 1, e)[0] << 24 >> 24; + }, + getUint8: function (e) { + return V(this, 1, e)[0]; + }, + getInt16: function (e) { + var t = V(this, 2, e, arguments[1]); + return (t[1] << 8 | t[0]) << 16 >> 16; + }, + getUint16: function (e) { + var t = V(this, 2, e, arguments[1]); + return t[1] << 8 | t[0]; + }, + getInt32: function (e) { + return k(V(this, 4, e, arguments[1])); + }, + getUint32: function (e) { + return k(V(this, 4, e, arguments[1])) >>> 0; + }, + getFloat32: function (e) { + return D(V(this, 4, e, arguments[1]), 23, 4); + }, + getFloat64: function (e) { + return D(V(this, 8, e, arguments[1]), 52, 8); + }, + setInt8: function (e, t) { + F(this, 1, e, N, t); + }, + setUint8: function (e, t) { + F(this, 1, e, N, t); + }, + setInt16: function (e, t) { + F(this, 2, e, M, t, arguments[2]); + }, + setUint16: function (e, t) { + F(this, 2, e, M, t, arguments[2]); + }, + setInt32: function (e, t) { + F(this, 4, e, U, t, arguments[2]); + }, + setUint32: function (e, t) { + F(this, 4, e, U, t, arguments[2]); + }, + setFloat32: function (e, t) { + F(this, 4, e, L, t, arguments[2]); + }, + setFloat64: function (e, t) { + F(this, 8, e, B, t, arguments[2]); + } + }); + } + b(y, 'ArrayBuffer'), b(h, 'DataView'), s(h.prototype, a.VIEW, !0), t.ArrayBuffer = y, t.DataView = h; + }, + function (e, t, r) { + 'use strict'; + var n = r(47), i = r(105), o = r(38); + e.exports = [].copyWithin || function (e, t) { + var r = n(this), a = o(r.length), s = i(e, a), u = i(t, a), c = arguments.length > 2 ? arguments[2] : void 0, d = Math.min((void 0 === c ? a : i(c, a)) - u, a - s), l = 1; + for (u < s && s < u + d && (l = -1, u += d - 1, s += d - 1); d-- > 0;) { + u in r ? r[s] = r[u] : delete r[s], s += l, u += l; + } + return r; + }; + }, + function (e, t) { + e.exports = function e(t) { + var r = Array.isArray(t) ? [] : {}; + for (var n in t) { + var i = t[n]; + r[n] = i && 'object' == typeof i ? e(i) : i; + } + return r; + }; + }, + function (e, t, r) { + 'use strict'; + function n(e, t, r, n, i) { + for (t = t.split ? t.split('.') : t, n = 0; n < t.length; n++) { + e = e ? e[t[n]] : i; + } + return e === i ? r : e; + } + r.r(t), r.d(t, 'default', function () { + return n; + }); + }, + function (e, t, r) { + 'use strict'; + r.r(t), t.default = function (e, t, r) { + t.split && (t = t.split('.')); + for (var n, i = 0, o = t.length, a = e; i < o; ++i) { + n = a[t[i]], a = a[t[i]] = i === o - 1 ? r : null != n ? n : !~t[i + 1].indexOf('.') && +t[i + 1] > -1 ? [] : {}; + } + }; + }, + function (e, t) { + s.SYNC = 1, s.ASYNC = 2, s.QUEUE = 4; + var r = Object.freeze({ + useProxy: !0, + ready: 0 + }), n = new WeakMap(), i = '2,1,0' === [1].reduce(function (e, t, r) { + return [ + e, + t, + r + ]; + }, 2).toString() ? Array.prototype.reduce : function (e, t) { + var r, n = Object(this), i = n.length >>> 0, o = 0; + if (t) { + r = t; + } else { + for (; o < i && !(o in n);) { + o++; + } + r = n[o++]; + } + for (; o < i;) { + o in n && (r = e(r, n[o], o, n)), o++; + } + return r; + }; + function o(e, t) { + return Array.prototype.slice.call(e, t); + } + var a = Object.assign || function (e) { + return i.call(o(arguments, 1), function (e, t) { + return t && Object.keys(t).forEach(function (r) { + e[r] = t[r]; + }), e; + }, e); + }; + function s(e) { + var t, u = {}, c = []; + function d(e, t) { + return 'function' == typeof e ? g.call(null, 'sync', e, t) : 'string' == typeof e && 'function' == typeof t ? g.apply(null, arguments) : 'object' == typeof e ? l.apply(null, arguments) : void 0; + } + function l(e, t, r) { + var n = !0; + void 0 === t && (t = Object.getOwnPropertyNames(e), n = !1); + var i = {}, o = ['constructor']; + do { + (t = t.filter(function (t) { + return !('function' != typeof e[t] || -1 !== o.indexOf(t) || t.match(/^_/)); + })).forEach(function (t) { + var n = t.split(':'), o = n[0], a = n[1] || 'sync'; + if (!i[o]) { + var s = e[o]; + i[o] = e[o] = g(a, s, r ? [ + r, + o + ] : void 0); + } + }), e = Object.getPrototypeOf(e); + } while (n && e); + return i; + } + function f(e) { + var r = Array.isArray(e) ? e : e.split('.'); + return i.call(r, function (n, i, o) { + var a = n[i], s = !1; + return a || (o === r.length - 1 ? (t || c.push(function () { + s || console.warn('fun-hooks: referenced \'' + e + '\' but it was never created'); + }), n[i] = p(function (e) { + n[i] = e, s = !0; + })) : n[i] = {}); + }, u); + } + function p(e) { + var t = [], r = [], i = function () { + }, o = { + before: function (e, r) { + return u.call(this, t, 'before', e, r); + }, + after: function (e, t) { + return u.call(this, r, 'after', e, t); + }, + getHooks: function (e) { + var n = t.concat(r); + return 'object' == typeof e && (n = n.filter(function (t) { + return Object.keys(e).every(function (r) { + return t[r] === e[r]; + }); + })), a(n, { + remove: function () { + return n.forEach(function (e) { + e.remove(); + }), this; + } + }); + }, + removeAll: function () { + return this.getHooks().remove(); + } + }, s = { + install: function (n, o, a) { + this.type = n, i = a, a(t, r), e && e(o); + } + }; + return n.set(o.after, s), o; + function u(e, n, o, a) { + var s = { + hook: o, + type: n, + priority: a || 10, + remove: function () { + var n = e.indexOf(s); + -1 !== n && (e.splice(n, 1), i(t, r)); + } + }; + return e.push(s), e.sort(function (e, t) { + return t.priority - e.priority; + }), i(t, r), this; + } + } + function g(r, i, u) { + var d = i.after && n.get(i.after); + if (d) { + if (d.type !== r) { + throw 'fun-hooks: recreated hookable with different type'; + } + return i; + } + var l, g, m = u ? f(u) : p(), v = { + get: function (e, t) { + return m[t] || Reflect.get.apply(Reflect, arguments); + } + }; + return t || c.push(b), e.useProxy && 'function' == typeof Proxy && Proxy.revocable ? g = new Proxy(i, v) : a(g = function () { + return v.apply ? v.apply(i, this, o(arguments)) : i.apply(this, arguments); + }, m), n.get(g.after).install(r, g, function (e, t) { + var n, i = []; + e.length || t.length ? (e.forEach(a), n = i.push(void 0) - 1, t.forEach(a), l = function (e, t, a) { + var s, u = 0, c = 'async' === r && 'function' == typeof a[a.length - 1] && a.pop(); + function d(e) { + 'sync' === r ? s = e : c && c.apply(null, arguments); + } + function l(e) { + if (i[u]) { + var n = o(arguments); + return l.bail = d, n.unshift(l), i[u++].apply(t, n); + } + 'sync' === r ? s = e : c && c.apply(null, arguments); + } + return i[n] = function () { + var n = o(arguments, 1); + 'async' === r && c && (delete l.bail, n.push(l)); + var i = e.apply(t, n); + 'sync' === r && l(i); + }, l.apply(null, a), s; + }) : l = void 0; + function a(e) { + i.push(e.hook); + } + b(); + }), g; + function b() { + !t && ('sync' !== r || e.ready & s.SYNC) && ('async' !== r || e.ready & s.ASYNC) ? 'sync' !== r && e.ready & s.QUEUE ? v.apply = function () { + var e = arguments; + c.push(function () { + g.apply(e[1], e[2]); + }); + } : v.apply = function () { + throw 'fun-hooks: hooked function not ready'; + } : v.apply = l; + } + } + return (e = a({}, r, e)).ready ? d.ready = function () { + t = !0, function (e) { + for (var t; t = e.shift();) { + t(); + } + }(c); + } : t = !0, d.get = f, d; + } + e.exports = s; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.detectReferer = i, t.getRefererInfo = void 0; + var n = r(7); + function i(e) { + function t(e) { + try { + var t = e.querySelector('link[rel=\'canonical\']'); + if (null !== t) { + return t.href; + } + } catch (e) { + } + return null; + } + return function () { + var r, i, o, a = [], s = function (e) { + try { + if (!e.location.ancestorOrigins) { + return; + } + return e.location.ancestorOrigins; + } catch (e) { + } + }(e), u = !1, c = 0, d = !1, l = !1; + do { + var f = r, p = l, g = void 0, m = !1, v = null; + l = !1, r = r ? r.parent : e; + try { + g = r.location.href || null; + } catch (e) { + m = !0; + } + if (m) { + if (p) { + var b = f.context; + try { + i = v = b.sourceUrl, d = !0, r === e.top && (u = !0), b.canonicalUrl && (o = b.canonicalUrl); + } catch (e) { + } + } else { + (0, n.logWarn)('Trying to access cross domain iframe. Continuing without referrer and location'); + try { + var y = f.document.referrer; + y && (v = y, r === e.top && (u = !0)); + } catch (e) { + } + !v && s && s[c - 1] && (v = s[c - 1]), v && !d && (i = v); + } + } else { + if (g && (i = v = g, d = !1, r === e.top)) { + u = !0; + var h = t(r.document); + h && (o = h); + } + r.context && r.context.sourceUrl && (l = !0); + } + a.push(v), c++; + } while (r !== e.top); + return a.reverse(), { + referer: i || null, + reachedTop: u, + isAmp: d, + numIframes: c - 1, + stack: a, + canonicalUrl: o || null + }; + }; + } + var o = i(window); + t.getRefererInfo = o; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.S2S_VENDORS = void 0; + t.S2S_VENDORS = { + appnexus: { + adapter: 'prebidServer', + enabled: !0, + endpoint: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction', + syncEndpoint: 'https://prebid.adnxs.com/pbs/v1/cookie_sync', + timeout: 1000 + }, + rubicon: { + adapter: 'prebidServer', + enabled: !0, + endpoint: 'https://prebid-server.rubiconproject.com/openrtb2/auction', + syncEndpoint: 'https://prebid-server.rubiconproject.com/cookie_sync', + timeout: 500 + } + }; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.runPrebidQueue = R, t.prebidModule = void 0, r(343); + var n = r(101), i = r(146), o = r(25), a = S(r(29)), s = S(r(86)), u = r(58), c = r(21), d = r(20), l = r(8), f = S(r(94)), p = S(r(34)), g = r(12), m = r(15), v = r(52), b = r(59), y = S(r(10)), h = r(74); + function S(e) { + return e && e.__esModule ? e : { default: e }; + } + var O = (0, n.getGlobal)(), _ = y.default.MODULES, E = _.GEOLOCATION, I = _.PREBID_HEADER_BIDDING, w = _.VIDEO, A = _.GOOGLE_PUBLISHER_TAG, T = y.default.EVENTS, x = T.HEADER_BIDDING_REQUEST, C = T.HEADER_BIDDING_RESPONSE, P = function () { + var e = (0, u.urlQueryAsObject)(), t = !1, r = []; + function n(e, t, r, n) { + var i = n, o = (0, p.default)(i, 'params.cust_params') || {}, s = t.code + '--'.concat(r); + l.bbLogger.logInfo('Applying Video params for unit code', s); + var u = O.getAdserverTargetingForAdUnitCode(s, { + forTargeting: !0, + match: { video: t.getVideoSpec(r) } + }), c = (0, p.default)(u, 'hb_bidder'), d = (0, p.default)(u, 'hb_cache_id'); + c && d && (u = (0, a.default)({}, function (e, t) { + var r = (0, m.getConfig)('prebid.cacheUrlConfigs.bidders'), n = (0, m.getConfig)('prebid.cacheUrlConfigs.prefix'), i = (0, a.default)({}, r[e] || {}, r.default, { value: t }), o = {}; + for (var s in i) { + if (Object.prototype.hasOwnProperty.call(i, s)) { + var u = i[s]; + o[''.concat(n).concat(s)] = u; + } + } + return o; + }(c, d), u)), (0, f.default)(i, 'params.cust_params', (0, a.default)(u, o)), e(t, r, i); + } + var y = (0, s.default)(function (e) { + return e.sizes.filter(function (e) { + return 'string' != typeof e && r.indexOf(e.join('x')) >= 0; + }); + }, function (e) { + return e.code; + }); + function h(e) { + var t = y(e), r = e.code; + return e.allowedTypes.banner && (0, f.default)(e, 'mediaTypes.banner.sizes', t), e.allowedTypes.native && ((0, f.default)(e, 'mediaTypes.native.sendTargetingKeys', !1), (0, f.default)(e, 'mediaTypes.native.image.required', !0), (0, f.default)(e, 'mediaTypes.native.image.aspect_ratios', [{ + ratio_width: 4, + ratio_height: 3, + min_width: 400, + min_height: 300 + }]), (0, f.default)(e, 'mediaTypes.native.title.required', !0), (0, f.default)(e, 'mediaTypes.native.title.len', 140), (0, f.default)(e, 'mediaTypes.native.sponsoredBy.required', !0), (0, f.default)(e, 'mediaTypes.native.clickUrl.required', !0), (0, f.default)(e, 'mediaTypes.native.body.required', !1)), (e.allowedTypes.video || e.isVideo) && ((0, f.default)(e, 'mediaTypes.video', (0, a.default)((0, p.default)(e, 'mediaTypes.video') || {}, e.getLatestVideoSpec())), r += '--'.concat(e.getVideoSpecIndex())), { + code: r, + mediaTypes: e.mediaTypes, + bids: e.bids, + sizes: t, + labelAny: e.labelAny, + labelAll: e.labelAll + }; + } + function S(t) { + O.que.push(function () { + O.setConfig((0, a.default)({}, { debug: 'true' === e.pbjs_debug }, t.pbjsConfig)), t.bidderSettings && (O.bidderSettings = t.bidderSettings); + }), t.allowedSizes && (r = t.allowedSizes.map(function (e) { + return e.join('x'); + })), o.moduleManager.viaModule(E, function (e) { + var r = e.isEnabled, n = e.onRegionSet, i = e.getRegionCode; + r && t.enabledRegions && n(function () { + -1 === t.enabledRegions.indexOf(i()) && (l.bbLogger.logInfo('Prebid not enabled for this region, deregistering module.'), o.moduleManager.deregister(I)); + }); + }); + } + function _(e, t) { + O.que.push(function () { + t && t.length && o.moduleManager.viaModule(A, function (e) { + (0, e.gptAction)(function () { + O.setTargetingForGPTAsync(t.filter(function (e) { + return e.bids && e.bids.length > 0; + }).map(function (e) { + return e.code; + })); + }); + }), e(t); + }); + } + return c.exposureApi.rootScope({ + get pbjsUnits() { + return O.adUnits && O.adUnits.length ? O.adUnits[0].constructor === Array ? O.adUnits[0] : O.adUnits : []; + } + }), { + name: I, + register: function () { + (0, g.dom)().window.pbjs = (0, g.dom)().window.pbjs || {}, (0, g.dom)().window.pbjs.que = (0, g.dom)().window.pbjs.que || []; + }, + initialize: function () { + i.requestManager.register(I), b.setBidTargeting.before(_), o.moduleManager.viaModule(w, function (e) { + e.getVideoUnitParams.before(n); + }), t = !0, (0, m.getConfig)('prebid', S), (0, m.setConfig)('bidderTimeout', (0, m.getConfig)('timeouts.bidder')), (0, m.getConfig)('highFrequencyAdRequest', function (e) { + (0, m.setConfig)('bidderTimeout', e ? (0, m.getConfig)('timeouts.hfar') : (0, m.getConfig)('timeouts.bidder')); + }), (0, v.getQueue)().push(function (e) { + R(), e(); + }); + }, + deregister: function () { + t && (b.setBidTargeting.getHook({ hook: _ }).remove(), i.requestManager.deregister(I)); + }, + bidRequest: function (e) { + return O.que.push(function () { + O.adUnits = []; + for (var t = 0; t < e.length; t++) { + var r = e[t]; + if (r.bids && r.bids.length > 0) { + r.isVideo || r.allowedTypes.video; + var n = h(r); + O.addAdUnits(n); + } + } + var o = O.requestBids({ + bidsBackHandler: function (t) { + d.eventEmitter.emit([ + C, + ''.concat(I, '.').concat(C) + ], I, t, e, o), i.requestManager.done(I); + }, + timeout: (0, m.getConfig)('bidderTimeout') + }); + d.eventEmitter.emit([ + x, + ''.concat(I, '.').concat(x) + ], I, e, o); + }), e; + } + }; + }(), j = o.moduleManager.register(P, [A], { gate: 'consentGiven' }); + function R() { + O && O.processQueue && O.processQueue(); + } + t.prebidModule = j, d.eventEmitter.on('identified.native', function (e) { + 'sharethrough' === e.dsp && (0, h.renderScript)({ + src: '//native.sharethrough.com/assets/sfp.js', + id: 'bb-sharethrough', + async: !0, + charset: 'utf-8' + }); + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.executeCallbacks = Q, t.default = t.checkAdUnitSetup = t.adUnitSetupChecks = void 0, r(9), r(11), r(6), r(13), r(4), r(2), r(26), r(1), r(3), r(0), r(5); + var n, i = r(101), o = r(7), a = r(344), s = r(126), u = r(22), c = r(127), d = r(347), l = r(61), f = r(348), p = (n = r(31)) && n.__esModule ? n : { default: n }, g = r(220), m = r(76), v = r(154), b = r(75); + function y(e) { + return (y = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function h(e) { + return function (e) { + if (Array.isArray(e)) { + return S(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return S(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return S(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function S(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function O() { + return (O = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var _ = (0, i.getGlobal)(), E = r(36), I = r(7), w = r(87).default, A = r(60), T = s.userSync.triggerUserSyncs, x = E.EVENTS, C = x.ADD_AD_UNITS, P = x.BID_WON, j = x.REQUEST_BIDS, R = x.SET_TARGETING, D = x.AD_RENDER_FAILED, k = E.AD_RENDER_FAILED_REASON, N = k.PREVENT_WRITING_ON_MAIN_DOCUMENT, M = k.NO_AD, U = k.EXCEPTION, B = k.CANNOT_FIND_AD, L = k.MISSING_DOC_OR_ADID, z = { + bidWon: function (e) { + var t = c.auctionManager.getBidsRequested().map(function (e) { + return e.bids.map(function (e) { + return e.adUnitCode; + }); + }).reduce(o.flatten).filter(o.uniques); + if (!I.contains(t, e)) { + return void I.logError('The "' + e + '" placement is not defined.'); + } + return !0; + } + }; + function V(e, t, r) { + e.defaultView && e.defaultView.frameElement && (e.defaultView.frameElement.width = t, e.defaultView.frameElement.height = r); + } + function F(e, t) { + var r = []; + return I.isArray(e) && (t ? e.length === t : e.length > 0) && (e.every(function (e) { + return (0, o.isArrayOfNums)(e, 2); + }) ? r = e : (0, o.isArrayOfNums)(e, 2) && r.push(e)), r; + } + function q(e) { + var t = I.deepClone(e), r = t.mediaTypes.banner, n = F(r.sizes); + return n.length > 0 ? (r.sizes = n, t.sizes = n) : (I.logError('Detected a mediaTypes.banner object without a proper sizes field. Please ensure the sizes are listed like: [[300, 250], ...]. Removing invalid mediaTypes.banner object from request.'), delete t.mediaTypes.banner), t; + } + function G(e) { + var t = I.deepClone(e), r = t.mediaTypes.video; + if (r.playerSize) { + var n = 'number' == typeof r.playerSize[0] ? 2 : 1, i = F(r.playerSize, n); + i.length > 0 ? (2 === n && I.logInfo('Transforming video.playerSize from [640,480] to [[640,480]] so it\'s in the proper format.'), r.playerSize = i, t.sizes = i) : (I.logError('Detected incorrect configuration of mediaTypes.video.playerSize. Please specify only one set of dimensions in a format like: [[640, 480]]. Removing invalid mediaTypes.video.playerSize property from request.'), delete t.mediaTypes.video.playerSize); + } + return t; + } + function W(e) { + var t = I.deepClone(e), r = t.mediaTypes.native; + return r.image && r.image.sizes && !Array.isArray(r.image.sizes) && (I.logError('Please use an array of sizes for native.image.sizes field. Removing invalid mediaTypes.native.image.sizes property from request.'), delete t.mediaTypes.native.image.sizes), r.image && r.image.aspect_ratios && !Array.isArray(r.image.aspect_ratios) && (I.logError('Please use an array of sizes for native.image.aspect_ratios field. Removing invalid mediaTypes.native.image.aspect_ratios property from request.'), delete t.mediaTypes.native.image.aspect_ratios), r.icon && r.icon.sizes && !Array.isArray(r.icon.sizes) && (I.logError('Please use an array of sizes for native.icon.sizes field. Removing invalid mediaTypes.native.icon.sizes property from request.'), delete t.mediaTypes.native.icon.sizes), t; + } + (0, f.sessionLoader)(), _.bidderSettings = _.bidderSettings || {}, _.libLoaded = !0, _.version = 'v4.26.0', I.logInfo('Prebid.js v4.26.0 loaded'), _.adUnits = _.adUnits || [], _.triggerUserSyncs = T; + var H = { + validateBannerMediaType: q, + validateVideoMediaType: G, + validateNativeMediaType: W, + validateSizes: F + }; + t.adUnitSetupChecks = H; + var Y = (0, l.hook)('sync', function (e) { + var t = []; + return e.forEach(function (e) { + var r, n, i, o = e.mediaTypes, a = e.bids; + if (a && I.isArray(a)) { + if (o && 0 !== Object.keys(o).length) { + o.banner && (r = q(e)), o.video && (n = G(r || e)), o.native && (i = W(n || (r || e))); + var s = O({}, r, n, i); + t.push(s); + } else { + I.logError('Detected adUnit.code \''.concat(e.code, '\' did not have a \'mediaTypes\' object defined. This is a required field for the auction, so this adUnit has been removed.')); + } + } else { + I.logError('Detected adUnit.code \''.concat(e.code, '\' did not have \'adUnit.bids\' defined or \'adUnit.bids\' is not an array. Removing adUnit from auction.')); + } + }), t; + }, 'checkAdUnitSetup'); + function K(e) { + var t = c.auctionManager[e]().filter(I.bind.call(o.adUnitsFilter, this, c.auctionManager.getAdUnitCodes())), r = c.auctionManager.getLastAuctionId(); + return t.map(function (e) { + return e.adUnitCode; + }).filter(o.uniques).map(function (e) { + return t.filter(function (t) { + return t.auctionId === r && t.adUnitCode === e; + }); + }).filter(function (e) { + return e && e[0] && e[0].adUnitCode; + }).map(function (e) { + return function (e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + }({}, e[0].adUnitCode, { bids: e }); + }).reduce(function (e, t) { + return O(e, t); + }, {}); + } + function J(e) { + var t = e.reason, r = e.message, n = e.bid, i = e.id, o = { + reason: t, + message: r + }; + n && (o.bid = n), i && (o.adId = i), I.logError(r), A.emit(D, o); + } + function Q(e, t) { + function r(e) { + for (var t; t = e.shift();) { + t(); + } + } + r(b.storageCallbacks), r(X), e.call(this, t); + } + t.checkAdUnitSetup = Y, _.getAdserverTargetingForAdUnitCodeStr = function (e) { + if (I.logInfo('Invoking pbjs.getAdserverTargetingForAdUnitCodeStr', arguments), e) { + var t = _.getAdserverTargetingForAdUnitCode(e); + return I.transformAdServerTargetingObj(t); + } + I.logMessage('Need to call getAdserverTargetingForAdUnitCodeStr with adunitCode'); + }, _.getAdserverTargetingForAdUnitCode = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { forTargeting: !1 }; + return _.getAdserverTargeting(e, t)[e]; + }, _.getAdserverTargeting = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : { forTargeting: !1 }; + return I.logInfo('Invoking pbjs.getAdserverTargeting', arguments), d.targeting.getAllTargeting(e, d.targeting.getBidsReceived(), t); + }, _.getNoBids = function () { + return I.logInfo('Invoking pbjs.getNoBids', arguments), K('getNoBids'); + }, _.getNoBidsForAdUnitCode = function (e) { + return { + bids: c.auctionManager.getNoBids().filter(function (t) { + return t.adUnitCode === e; + }) + }; + }, _.getBidResponses = function () { + return I.logInfo('Invoking pbjs.getBidResponses', arguments), K('getBidsReceived'); + }, _.getBidResponsesForAdUnitCode = function (e) { + return { + bids: c.auctionManager.getBidsReceived().filter(function (t) { + return t.adUnitCode === e; + }) + }; + }, _.setTargetingForGPTAsync = function (e, t) { + if (I.logInfo('Invoking pbjs.setTargetingForGPTAsync', arguments), (0, o.isGptPubadsDefined)()) { + var r = d.targeting.getAllTargeting(e, d.targeting.getBidsReceived(), { forTargeting: !0 }); + d.targeting.resetPresetTargeting(e, t), d.targeting.setTargetingForGPT(r, t), Object.keys(r).forEach(function (e) { + Object.keys(r[e]).forEach(function (t) { + 'hb_adid' === t && c.auctionManager.setStatusForBids(r[e][t], E.BID_STATUS.BID_TARGETING_SET); + }); + }), A.emit(R, r); + } else { + I.logError('window.googletag is not defined on the page'); + } + }, _.setTargetingForAst = function (e) { + I.logInfo('Invoking pbjs.setTargetingForAn', arguments), d.targeting.isApntagDefined() ? (d.targeting.setTargetingForAst(e), A.emit(R, d.targeting.getAllTargeting())) : I.logError('window.apntag is not defined on the page'); + }, _.renderAd = function (e, t, r) { + if (I.logInfo('Invoking pbjs.renderAd', arguments), I.logMessage('Calling renderAd with adId :' + t), e && t) { + try { + var n = c.auctionManager.findBidByAdId(t); + if (n) { + if (n.ad = I.replaceAuctionPrice(n.ad, n.cpm), n.adUrl = I.replaceAuctionPrice(n.adUrl, n.cpm), r && r.clickThrough) { + var i = r.clickThrough; + n.ad = I.replaceClickThrough(n.ad, i), n.adUrl = I.replaceClickThrough(n.adUrl, i); + } + c.auctionManager.addWinningBid(n), A.emit(P, n); + var o = n.height, a = n.width, s = n.ad, u = n.mediaType, d = n.adUrl, l = n.renderer, f = document.createComment('Creative '.concat(n.creativeId, ' served by ').concat(n.bidder, ' Prebid.js Header Bidding')); + if (I.insertElement(f, e, 'body'), (0, m.isRendererRequired)(l)) { + (0, m.executeRenderer)(l, n); + } else if (e === document && !I.inIframe() || 'video' === u) { + var p = 'Error trying to write ad. Ad render call ad id '.concat(t, ' was prevented from writing to the main document.'); + J({ + reason: N, + message: p, + bid: n, + id: t + }); + } else if (s) { + V(e, a, o), e.write(s), e.close(), I.callBurl(n); + } else if (d) { + var g = I.createInvisibleIframe(); + g.height = o, g.width = a, g.style.display = 'inline', g.style.overflow = 'hidden', g.src = d, I.insertElement(g, e, 'body'), V(e, a, o), I.callBurl(n); + } else { + var v = 'Error trying to write ad. No ad for bid response id: '.concat(t); + J({ + reason: M, + message: v, + bid: n, + id: t + }); + } + } else { + var b = 'Error trying to write ad. Cannot find ad by given id : '.concat(t); + J({ + reason: B, + message: b, + id: t + }); + } + } catch (e) { + var y = 'Error trying to write ad Id :'.concat(t, ' to the page:').concat(e.message); + J({ + reason: U, + message: y, + id: t + }); + } + } else { + var h = 'Error trying to write ad Id :'.concat(t, ' to the page. Missing document or adId'); + J({ + reason: L, + message: h, + id: t + }); + } + }, _.removeAdUnit = function (e) { + (I.logInfo('Invoking pbjs.removeAdUnit', arguments), e) ? (I.isArray(e) ? e : [e]).forEach(function (e) { + for (var t = _.adUnits.length - 1; t >= 0; t--) { + _.adUnits[t].code === e && _.adUnits.splice(t, 1); + } + }) : _.adUnits = []; + }, _.requestBids = (0, l.hook)('async', function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = e.bidsBackHandler, r = e.timeout, n = e.adUnits, i = e.adUnitCodes, o = e.labels, a = e.auctionId; + A.emit(j); + var s = r || u.config.getConfig('bidderTimeout'); + n = n || _.adUnits, I.logInfo('Invoking pbjs.requestBids', arguments); + var l = [], f = []; + if (u.config.getConfig('s2sConfig', function (e) { + e && e.s2sConfig && (l = Array.isArray(e.s2sConfig) ? e.s2sConfig : [e.s2sConfig]); + }), l.forEach(function (e) { + f.push.apply(f, h(e.bidders)); + }), n = Y(n), i && i.length ? n = n.filter(function (e) { + return (0, p.default)(i, e.code); + }) : i = n && n.map(function (e) { + return e.code; + }), n.forEach(function (e) { + var t = Object.keys(e.mediaTypes || { banner: 'banner' }), r = e.bids.map(function (e) { + return e.bidder; + }), n = w.bidderRegistry, i = f ? r.filter(function (e) { + return !(0, p.default)(f, e); + }) : r; + e.transactionId = I.generateUUID(), i.forEach(function (r) { + var i = n[r], o = i && i.getSpec && i.getSpec(), a = o && o.supportedMediaTypes || ['banner']; + t.some(function (e) { + return (0, p.default)(a, e); + }) ? g.adunitCounter.incrementBidderRequestsCounter(e.code, r) : (I.logWarn(I.unsupportedBidderMessage(e, r)), e.bids = e.bids.filter(function (e) { + return e.bidder !== r; + })); + }), g.adunitCounter.incrementRequestsCounter(e.code); + }), n && 0 !== n.length) { + var m = c.auctionManager.createAuction({ + adUnits: n, + adUnitCodes: i, + callback: t, + cbTimeout: s, + labels: o, + auctionId: a + }), v = n.length; + v > 15 && I.logInfo('Current auction '.concat(m.getAuctionId(), ' contains ').concat(v, ' adUnits.'), n), i.forEach(function (e) { + return d.targeting.setLatestAuctionForAdUnit(e, m.getAuctionId()); + }), m.callBids(); + } else if (I.logMessage('No adUnits configured. No bids requested.'), 'function' == typeof t) { + try { + t(); + } catch (e) { + I.logError('Error executing bidsBackHandler', null, e); + } + } + }), _.requestBids.before(Q, 49), _.addAdUnits = function (e) { + I.logInfo('Invoking pbjs.addAdUnits', arguments), I.isArray(e) ? _.adUnits.push.apply(_.adUnits, e) : 'object' === y(e) && _.adUnits.push(e), A.emit(C); + }, _.onEvent = function (e, t, r) { + I.logInfo('Invoking pbjs.onEvent', arguments), I.isFn(t) ? !r || z[e].call(null, r) ? A.on(e, t, r) : I.logError('The id provided is not valid for event "' + e + '" and no handler was set.') : I.logError('The event handler provided is not a function and was not set on event "' + e + '".'); + }, _.offEvent = function (e, t, r) { + I.logInfo('Invoking pbjs.offEvent', arguments), r && !z[e].call(null, r) || A.off(e, t, r); + }, _.getEvents = function () { + return I.logInfo('Invoking pbjs.getEvents'), A.getEvents(); + }, _.registerBidAdapter = function (e, t) { + I.logInfo('Invoking pbjs.registerBidAdapter', arguments); + try { + w.registerBidAdapter(e(), t); + } catch (e) { + I.logError('Error registering bidder adapter : ' + e.message); + } + }, _.registerAnalyticsAdapter = function (e) { + I.logInfo('Invoking pbjs.registerAnalyticsAdapter', arguments); + try { + w.registerAnalyticsAdapter(e); + } catch (e) { + I.logError('Error registering analytics adapter : ' + e.message); + } + }, _.createBid = function (e) { + return I.logInfo('Invoking pbjs.createBid', arguments), (0, v.createBid)(e); + }; + var X = [], $ = (0, l.hook)('async', function (e) { + e && !I.isEmpty(e) ? (I.logInfo('Invoking pbjs.enableAnalytics for: ', e), w.enableAnalytics(e)) : I.logError('pbjs.enableAnalytics should be called with option {}'); + }, 'enableAnalyticsCb'); + function Z(e) { + e.forEach(function (e) { + if (void 0 === e.called) { + try { + e.call(), e.called = !0; + } catch (e) { + I.logError('Error processing command :', 'prebid.js', e); + } + } + }); + } + _.enableAnalytics = function (e) { + X.push($.bind(this, e)); + }, _.aliasBidder = function (e, t, r) { + I.logInfo('Invoking pbjs.aliasBidder', arguments), e && t ? w.aliasBidAdapter(e, t, r) : I.logError('bidderCode and alias must be passed as arguments', 'pbjs.aliasBidder'); + }, _.getAllWinningBids = function () { + return c.auctionManager.getAllWinningBids(); + }, _.getAllPrebidWinningBids = function () { + return c.auctionManager.getBidsReceived().filter(function (e) { + return e.status === E.BID_STATUS.BID_TARGETING_SET; + }); + }, _.getHighestCpmBids = function (e) { + return d.targeting.getWinningBids(e); + }, _.markWinningBidAsUsed = function (e) { + var t = []; + e.adUnitCode && e.adId ? t = c.auctionManager.getBidsReceived().filter(function (t) { + return t.adId === e.adId && t.adUnitCode === e.adUnitCode; + }) : e.adUnitCode ? t = d.targeting.getWinningBids(e.adUnitCode) : e.adId ? t = c.auctionManager.getBidsReceived().filter(function (t) { + return t.adId === e.adId; + }) : I.logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.'), t.length > 0 && (t[0].status = E.BID_STATUS.RENDERED); + }, _.getConfig = u.config.getConfig, _.setConfig = u.config.setConfig, _.setBidderConfig = u.config.setBidderConfig, _.que.push(function () { + return (0, a.listenMessagesFromCreative)(); + }), _.cmd.push = function (e) { + if ('function' == typeof e) { + try { + e.call(); + } catch (e) { + I.logError('Error processing command :', e.message, e.stack); + } + } else { + I.logError('Commands written into pbjs.cmd.push must be wrapped in a function'); + } + }, _.que.push = _.cmd.push, _.processQueue = function () { + l.hook.ready(), Z(_.que), Z(_.cmd); + }; + var ee = _; + t.default = ee; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.listenMessagesFromCreative = function () { + window.addEventListener('message', p, !1); + }, t._sendAdToCreative = g; + var n = l(r(60)), i = r(88), o = l(r(36)), a = r(7), s = r(127), u = l(r(37)), c = r(76), d = l(r(31)); + function l(e) { + return e && e.__esModule ? e : { default: e }; + } + var f = o.default.EVENTS.BID_WON; + function p(e) { + var t = e.message ? 'message' : 'data', r = {}; + try { + r = JSON.parse(e[t]); + } catch (e) { + return; + } + if (r && r.adId) { + var o = (0, u.default)(s.auctionManager.getBidsReceived(), function (e) { + return e.adId === r.adId; + }); + if (o && 'Prebid Request' === r.message && (g(o, e), s.auctionManager.addWinningBid(o), n.default.emit(f, o)), o && 'Prebid Native' === r.message) { + if ('assetRequest' === r.action) { + var a = (0, i.getAssetMessage)(r, o); + return void e.source.postMessage(JSON.stringify(a), e.origin); + } + if ('allAssetRequest' === r.action) { + var c = (0, i.getAllAssetsMessage)(r, o); + e.source.postMessage(JSON.stringify(c), e.origin); + } else { + 'resizeNativeHeight' === r.action && (o.height = r.height, o.width = r.width, m(o)); + } + if ('click' === (0, i.fireNativeTrackers)(r, o)) { + return; + } + s.auctionManager.addWinningBid(o), n.default.emit(f, o); + } + } + } + function g(e, t) { + var r = e.adId, n = e.ad, i = e.adUrl, o = e.width, s = e.height, u = e.renderer, d = e.cpm; + (0, c.isRendererRequired)(u) ? (0, c.executeRenderer)(u, e) : r && (m(e), t.source.postMessage(JSON.stringify({ + message: 'Prebid Response', + ad: (0, a.replaceAuctionPrice)(n, d), + adUrl: (0, a.replaceAuctionPrice)(i, d), + adId: r, + width: o, + height: s + }), t.origin)); + } + function m(e) { + var t = e.adId, r = e.adUnitCode, n = e.width, i = e.height; + [ + 'div', + 'iframe' + ].forEach(function (e) { + var o = function (e) { + var n = function (e, t) { + return window.googletag ? function (e) { + return (0, u.default)(window.googletag.pubads().getSlots(), function (t) { + return (0, u.default)(t.getTargetingKeys(), function (r) { + return (0, d.default)(t.getTargeting(r), e); + }); + }).getSlotElementId(); + }(e) : window.apntag ? function (e) { + var t = window.apntag.getTag(e); + return t && t.targetId; + }(t) : t; + }(t, r), i = document.getElementById(n); + return i && i.querySelector(e); + }(e + ':not([style*="display: none"])'); + if (o) { + var s = o.style; + s.width = n + 'px', s.height = i + 'px'; + } else { + (0, a.logWarn)('Unable to locate matching page element for adUnitCode '.concat(r, '. Can\'t resize it to ad\'s dimensions. Please review setup.')); + } + }); + } + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.store = function (e, t, r) { + var n = { puts: e.map(u, r) }; + (0, i.ajax)(o.config.getConfig('cache.url'), function (e) { + return { + success: function (t) { + var r; + try { + r = JSON.parse(t).responses; + } catch (t) { + return void e(t, []); + } + r ? e(null, r) : e(new Error('The cache server didn\'t respond with a responses property.'), []); + }, + error: function (t, r) { + e(new Error('Error storing video ad in the cache: '.concat(t, ': ').concat(JSON.stringify(r))), []); + } + }; + }(t), JSON.stringify(n), { + contentType: 'text/plain', + withCredentials: !0 + }); + }, t.getCacheUrl = function (e) { + return ''.concat(o.config.getConfig('cache.url'), '?uuid=').concat(e); + }, r(40); + var i = r(103), o = r(22), a = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = s(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)); + function s() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return s = function () { + return e; + }, e; + } + function u(e) { + var t, r, n, i = { + type: 'xml', + value: e.vastXml ? e.vastXml : (t = e.vastUrl, r = e.vastImpUrl, n = r ? '') : '', '\n \n \n prebid.org wrapper\n \n ').concat(n, '\n \n \n \n ')), + ttlseconds: Number(e.ttl) + }; + return o.config.getConfig('cache.vasttrack') && (i.bidder = e.bidder, i.bidid = e.requestId, a.isPlainObject(this) && this.hasOwnProperty('auctionStart') && (i.timestamp = this.auctionStart)), 'string' == typeof e.customCacheKey && '' !== e.customCacheKey && (i.key = e.customCacheKey), i; + } + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.loadExternalScript = function (e, t, r) { + if (!t || !e) { + return void a.logError('cannot load external script without url and moduleCode'); + } + if (!(0, o.default)(c, t)) { + return void a.logError(''.concat(t, ' not whitelisted for loading external JavaScript')); + } + if (u[e]) { + return r && 'function' == typeof r && (u[e].loaded ? r() : u[e].callbacks.push(r)), u[e].tag; + } + u[e] = { + loaded: !1, + tag: null, + callbacks: [] + }, r && 'function' == typeof r && u[e].callbacks.push(r); + return a.logWarn('module '.concat(t, ' is loading external JavaScript')), function (t, r) { + var n = document.createElement('script'); + n.type = 'text/javascript', n.async = !0, u[e].tag = n, n.readyState ? n.onreadystatechange = function () { + 'loaded' !== n.readyState && 'complete' !== n.readyState || (n.onreadystatechange = null, r()); + } : n.onload = function () { + r(); + }; + return n.src = t, a.insertElement(n), n; + }(e, function () { + u[e].loaded = !0; + try { + for (var t = 0; t < u[e].callbacks.length; t++) { + u[e].callbacks[t](); + } + } catch (e) { + a.logError('Error executing callback', 'adloader.js:loadExternalScript', e); + } + }); + }; + var i, o = (i = r(31)) && i.__esModule ? i : { default: i }, a = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = s(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)); + function s() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return s = function () { + return e; + }, e; + } + var u = {}, c = [ + 'criteo', + 'outstream', + 'adagio', + 'browsi' + ]; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.getHighestCpmBidsFromBidPool = _, t.sortByDealAndPriceBucketOrCpm = E, t.newTargeting = I, t.targeting = t.filters = t.TARGETING_KEYS = void 0, r(26), r(9), r(11), r(6), r(13), r(4), r(2), r(102), r(16), r(83), r(1), r(3), r(0), r(5); + var n = r(7), i = r(22), o = r(88), a = r(127), s = r(218), u = r(45), c = f(r(31)), d = f(r(37)), l = r(100); + function f(e) { + return e && e.__esModule ? e : { default: e }; + } + function p() { + return (p = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function g(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function m(e) { + return function (e) { + if (Array.isArray(e)) { + return v(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return v(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return v(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function v(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var b = r(7), y = r(36), h = [], S = Object.keys(y.TARGETING_KEYS).map(function (e) { + return y.TARGETING_KEYS[e]; + }); + t.TARGETING_KEYS = S; + var O = { + isBidNotExpired: function (e) { + return e.responseTimestamp + 1000 * e.ttl + 1000 > (0, n.timestamp)(); + }, + isUnusedBid: function (e) { + return e && (e.status && !(0, c.default)([y.BID_STATUS.RENDERED], e.status) || !e.status); + } + }; + function _(e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, o = [], a = i.config.getConfig('sendBidsControl.dealPrioritization'), s = (0, n.groupBy)(e, 'adUnitCode'); + return Object.keys(s).forEach(function (e) { + var i = [], u = (0, n.groupBy)(s[e], 'bidderCode'); + Object.keys(u).forEach(function (e) { + return i.push(u[e].reduce(t)); + }), r > 0 ? (i = a ? i.sort(E(!0)) : i.sort(function (e, t) { + return t.cpm - e.cpm; + }), o.push.apply(o, m(i.slice(0, r)))) : o.push.apply(o, m(i)); + }), o; + } + function E() { + var e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0]; + return function (t, r) { + return void 0 !== t.adserverTargeting.hb_deal && void 0 === r.adserverTargeting.hb_deal ? -1 : void 0 === t.adserverTargeting.hb_deal && void 0 !== r.adserverTargeting.hb_deal ? 1 : e ? r.cpm - t.cpm : r.adserverTargeting.hb_pb - t.adserverTargeting.hb_pb; + }; + } + function I(e) { + var t = {}, r = {}; + function a(e, t) { + return e.adserverTargeting && t && (b.isArray(t) && (0, c.default)(t, e.adUnitCode) || 'string' == typeof t && e.adUnitCode === t); + } + function f(e, t) { + if (!0 === i.config.getConfig('targetingControls.alwaysIncludeDeals')) { + var r = S.concat(o.NATIVE_TARGETING_KEYS); + return _(t, n.getHighestCpm).map(function (t) { + if (t.dealId && a(t, e)) { + return g({}, t.adUnitCode, N(t, r.filter(function (e) { + return void 0 !== t.adserverTargeting[e]; + }))); + } + }).filter(function (e) { + return e; + }); + } + return []; + } + function v(e, t) { + var r = p({}, y.TARGETING_KEYS, y.NATIVE_KEYS), i = Object.keys(r), o = {}; + (0, n.logInfo)('allowTargetingKeys - allowed keys [ '.concat(t.map(function (e) { + return r[e]; + }).join(', '), ' ]')), e.map(function (e) { + var n = Object.keys(e)[0], a = e[n].filter(function (e) { + var n = Object.keys(e)[0], a = 0 === i.filter(function (e) { + return 0 === n.indexOf(r[e]); + }).length || (0, d.default)(t, function (e) { + var t = r[e]; + return 0 === n.indexOf(t); + }); + return o[n] = !a, a; + }); + e[n] = a; + }); + var a = Object.keys(o).filter(function (e) { + return o[e]; + }); + return (0, n.logInfo)('allowTargetingKeys - removed keys [ '.concat(a.join(', '), ' ]')), e.filter(function (e) { + return e[Object.keys(e)[0]].length > 0; + }); + } + function I(e, t) { + var r = (0, n.deepClone)(e); + return Object.keys(r).map(function (e) { + return { + adUnitCode: e, + adserverTargeting: r[e] + }; + }).sort(E()).reduce(function (e, i, o, a) { + var s, u = (s = i.adserverTargeting, Object.keys(s).reduce(function (e, t) { + return e + ''.concat(t, '%3d').concat(encodeURIComponent(s[t]), '%26'); + }, '')); + o + 1 === a.length && (u = u.slice(0, -3)); + var c = i.adUnitCode, d = u.length; + return d <= t ? (t -= d, (0, n.logInfo)('AdUnit \''.concat(c, '\' auction keys comprised of ').concat(d, ' characters. Deducted from running threshold; new limit is ').concat(t), r[c]), e[c] = r[c]) : (0, n.logWarn)('The following keys for adUnitCode \''.concat(c, '\' exceeded the current limit of the \'auctionKeyMaxChars\' setting.\nThe key-set size was ').concat(d, ', the current allotted amount was ').concat(t, '.\n'), r[c]), o + 1 === a.length && 0 === Object.keys(e).length && (0, n.logError)('No auction targeting keys were permitted due to the setting in setConfig(targetingControls.auctionKeyMaxChars). Please review setup and consider adjusting.'), e; + }, {}); + } + function w(e) { + return e.map(function (e) { + return g({}, Object.keys(e)[0], e[Object.keys(e)[0]].map(function (e) { + return g({}, Object.keys(e)[0], e[Object.keys(e)[0]].join(', ')); + }).reduce(function (e, t) { + return p(t, e); + }, {})); + }).reduce(function (e, t) { + var r = Object.keys(t)[0]; + return e[r] = p({}, e[r], t[r]), e; + }, {}); + } + function A(t) { + return 'string' == typeof t ? [t] : b.isArray(t) ? t : e.getAdUnitCodes() || []; + } + function T() { + var t = e.getBidsReceived(); + return i.config.getConfig('useBidCache') || (t = t.filter(function (e) { + return r[e.adUnitCode] === e.auctionId; + })), t = t.filter(function (e) { + return (0, n.deepAccess)(e, 'video.context') !== u.ADPOD; + }).filter(function (e) { + return 'banner' !== e.mediaType || (0, s.sizeSupported)([ + e.width, + e.height + ]); + }).filter(O.isUnusedBid).filter(O.isBidNotExpired); + } + function x(e, r) { + var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { forTargeting: !1 }, i = t.getWinningBids(e, r, n), o = C(); + return i = i.map(function (e) { + return g({}, e.adUnitCode, Object.keys(e.adserverTargeting).filter(function (t) { + return void 0 === e.sendStandardTargeting || e.sendStandardTargeting || -1 === o.indexOf(t); + }).reduce(function (t, r) { + var n = [e.adserverTargeting[r]], i = g({}, r.substring(0, 20), n); + if (r === y.TARGETING_KEYS.DEAL) { + var o = g({}, ''.concat(r, '_').concat(e.bidderCode).substring(0, 20), n); + return [].concat(m(t), [ + i, + o + ]); + } + return [].concat(m(t), [i]); + }, [])); + }); + } + function C() { + return e.getStandardBidderAdServerTargeting().map(function (e) { + return e.key; + }).concat(S).filter(n.uniques); + } + function P(e, t, r, i) { + return Object.keys(t.adserverTargeting).filter(j()).forEach(function (r) { + e.length && e.filter(function (e) { + return function (r) { + return r.adUnitCode === t.adUnitCode && r.adserverTargeting[e]; + }; + }(r)).forEach(function (e) { + return function (r) { + b.isArray(r.adserverTargeting[e]) || (r.adserverTargeting[e] = [r.adserverTargeting[e]]), r.adserverTargeting[e] = r.adserverTargeting[e].concat(t.adserverTargeting[e]).filter(n.uniques), delete t.adserverTargeting[e]; + }; + }(r)); + }), e.push(t), e; + } + function j() { + var e = C().concat(o.NATIVE_TARGETING_KEYS); + return function (t) { + return -1 === e.indexOf(t); + }; + } + function R(e) { + return g({}, e.adUnitCode, Object.keys(e.adserverTargeting).filter(j()).map(function (t) { + return g({}, t.substring(0, 20), [e.adserverTargeting[t]]); + })); + } + function D(e, t) { + return t.filter(function (t) { + return (0, c.default)(e, t.adUnitCode); + }).map(function (e) { + return p({}, e); + }).reduce(P, []).map(R).filter(function (e) { + return e; + }); + } + function k(e, t) { + var r = S.concat(o.NATIVE_TARGETING_KEYS), s = i.config.getConfig('sendBidsControl.bidLimit'); + return _(t, n.getHighestCpm, s).map(function (t) { + if (a(t, e)) { + return g({}, t.adUnitCode, N(t, r.filter(function (e) { + return void 0 !== t.adserverTargeting[e]; + }))); + } + }).filter(function (e) { + return e; + }); + } + function N(e, t) { + return t.map(function (t) { + return g({}, ''.concat(t, '_').concat(e.bidderCode).substring(0, 20), [e.adserverTargeting[t]]); + }); + } + function M(t) { + function r(e) { + return (0, n.deepAccess)(e, y.JSON_MAPPING.ADSERVER_TARGETING); + } + return e.getAdUnits().filter(function (e) { + return (0, c.default)(t, e.code) && r(e); + }).map(function (e) { + return g({}, e.code, function (e) { + var t = r(e); + return Object.keys(t).map(function (e) { + return g({}, e, b.isArray(t[e]) ? t[e] : t[e].split(',')); + }); + }(e)); + }); + } + return t.setLatestAuctionForAdUnit = function (e, t) { + r[e] = t; + }, t.resetPresetTargeting = function (t, r) { + if ((0, n.isGptPubadsDefined)()) { + var i = A(t), o = e.getAdUnits().filter(function (e) { + return (0, c.default)(i, e.code); + }); + window.googletag.pubads().getSlots().forEach(function (e) { + var t = b.isFn(r) && r(e); + h.forEach(function (r) { + o.forEach(function (n) { + (n.code === e.getAdUnitPath() || n.code === e.getSlotElementId() || b.isFn(t) && t(n.code)) && e.setTargeting(r, null); + }); + }); + }); + } + }, t.resetPresetTargetingAST = function (e) { + A(e).forEach(function (e) { + var t = window.apntag.getTag(e); + if (t && t.keywords) { + var r = Object.keys(t.keywords), n = {}; + r.forEach(function (e) { + (0, c.default)(h, e.toLowerCase()) || (n[e] = t.keywords[e]); + }), window.apntag.modifyTag(e, { keywords: n }); + } + }); + }, t.getAllTargeting = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : T(), r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { forTargeting: !1 }, o = A(e), a = x(o, t, r).concat(D(o, t)).concat(i.config.getConfig('enableSendAllBids') ? k(o, t) : f(o, t)).concat(M(o)); + a.map(function (e) { + Object.keys(e).map(function (t) { + e[t].map(function (e) { + -1 === h.indexOf(Object.keys(e)[0]) && (h = Object.keys(e).concat(h)); + }); + }); + }); + var s = Object.keys(p({}, y.DEFAULT_TARGETING_KEYS, y.NATIVE_KEYS)), u = i.config.getConfig('targetingControls.allowTargetingKeys') || s; + Array.isArray(u) && u.length > 0 && (a = v(a, u)), a = w(a); + var c = i.config.getConfig('targetingControls.auctionKeyMaxChars'); + return c && ((0, n.logInfo)('Detected \'targetingControls.auctionKeyMaxChars\' was active for this auction; set with a limit of '.concat(c, ' characters. Running checks on auction keys...')), a = I(a, c)), o.forEach(function (e) { + a[e] || (a[e] = {}); + }), a; + }, t.setTargetingForGPT = function (e, t) { + window.googletag.pubads().getSlots().forEach(function (r) { + Object.keys(e).filter(t ? t(r) : (0, n.isAdUnitCodeMatchingSlot)(r)).forEach(function (t) { + return Object.keys(e[t]).forEach(function (n) { + var i = e[t][n]; + 'string' == typeof i && (i = i.split(',')), (i = i.length > 1 ? [i] : i).map(function (e) { + return b.logMessage('Attempting to set key value for slot: '.concat(r.getSlotElementId(), ' key: ').concat(n, ' value: ').concat(e)), e; + }).forEach(function (e) { + r.setTargeting(n, e); + }); + }); + }); + }); + }, t.getBidsReceived = T, t.getWinningBids = function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : T(), r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { forTargeting: !1 }, n = A(e); + return l.bidCache.evaluateWinningBids(n, t, r); + }, t.setTargetingForAst = function (e) { + var r = t.getAllTargeting(e); + try { + t.resetPresetTargetingAST(e); + } catch (e) { + b.logError('unable to reset targeting for AST' + e); + } + Object.keys(r).forEach(function (e) { + return Object.keys(r[e]).forEach(function (t) { + if (b.logMessage('Attempting to set targeting for targetId: '.concat(e, ' key: ').concat(t, ' value: ').concat(r[e][t])), b.isStr(r[e][t]) || b.isArray(r[e][t])) { + var n = {}; + t.search(/pt[0-9]/) < 0 ? n[t.toUpperCase()] = r[e][t] : n[t] = r[e][t], window.apntag.setKeywords(e, n, { overrideKeyValue: !0 }); + } + }); + }); + }, t.isApntagDefined = function () { + if (window.apntag && b.isFn(window.apntag.setKeywords)) { + return !0; + } + }, t; + } + t.filters = O; + var w = I(a.auctionManager); + t.targeting = w; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.enableOverrides = f, t.disableOverrides = p, t.bidExcluded = g, t.bidderExcluded = m, t.applyBidOverrides = v, t.addBidResponseHook = b, t.addBidderRequestsHook = y, t.getConfig = h, t.sessionLoader = function (e) { + const $___old_de2b4dba4438a758 = {}.constructor.getOwnPropertyDescriptor(window, 'sessionStorage'); + try { + if ($___old_de2b4dba4438a758) + ({}.constructor.defineProperty(window, 'sessionStorage', $___mock_436d6f6f94763253.sessionStorage)); + return function () { + var t; + try { + e = e || window.sessionStorage, t = JSON.parse(e.getItem('pbjs:debugging')); + } catch (e) { + } + t && f(t, !0); + }.apply(this, arguments); + } finally { + if ($___old_de2b4dba4438a758) + ({}.constructor.defineProperty(window, 'sessionStorage', $___old_de2b4dba4438a758)); + } + }, t.addBidderRequestsBound = t.addBidResponseBound = void 0, r(1), r(3), r(0), r(5); + var n, i, o = r(22), a = r(7), s = r(221); + function u(e) { + (0, a.logMessage)('DEBUG: ' + e); + } + function c(e) { + (0, a.logWarn)('DEBUG: ' + e); + } + function d(e) { + t.addBidResponseBound = n = b.bind(e), s.addBidResponse.before(n, 5), t.addBidderRequestsBound = i = y.bind(e), s.addBidderRequests.before(i, 5); + } + function l() { + s.addBidResponse.getHooks({ hook: n }).remove(), s.addBidderRequests.getHooks({ hook: i }).remove(); + } + function f(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + o.config.setConfig({ debug: !0 }), l(), d(e), u('bidder overrides enabled'.concat(t ? ' from session' : '')); + } + function p() { + l(), u('bidder overrides disabled'); + } + function g(e, t, r) { + return !(!e.bidder || e.bidder === t) || !(!e.adUnitCode || e.adUnitCode === r); + } + function m(e, t) { + return Array.isArray(e) && -1 === e.indexOf(t); + } + function v(e, t, r) { + return Object.keys(e).filter(function (e) { + return -1 === [ + 'adUnitCode', + 'bidder' + ].indexOf(e); + }).reduce(function (t, n) { + return u('bidder overrides changed \''.concat(t.adUnitCode, '/').concat(t.bidderCode, '\' ').concat(r, '.').concat(n, ' from \'').concat(t[n], '.js\' to \'').concat(e[n], '\'')), t[n] = e[n], t; + }, t); + } + function b(e, t, r) { + m(this.bidders, r.bidderCode) ? c('bidder \''.concat(r.bidderCode, '\' excluded from auction by bidder overrides')) : (Array.isArray(this.bids) && this.bids.forEach(function (e) { + g(e, r.bidderCode, t) || v(e, r, 'bidder'); + }), e(t, r)); + } + function y(e, t) { + var r = this, n = t.filter(function (e) { + return !m(r.bidders, e.bidderCode) || (c('bidRequest \''.concat(e.bidderCode, '\' excluded from auction by bidder overrides')), !1); + }); + Array.isArray(r.bidRequests) && n.forEach(function (e) { + r.bidRequests.forEach(function (t) { + e.bids.forEach(function (r) { + g(t, e.bidderCode, r.adUnitCode) || v(t, r, 'bidRequest'); + }); + }); + }), e(n); + } + function h(e) { + if (e.enabled) { + try { + window.sessionStorage.setItem('pbjs:debugging', JSON.stringify(e)); + } catch (e) { + } + f(e); + } else { + p(); + try { + window.sessionStorage.removeItem('pbjs:debugging'); + } catch (e) { + } + } + } + t.addBidResponseBound = n, t.addBidderRequestsBound = i, o.config.getConfig('debugging', function (e) { + return h(e.debugging); + }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.myiModule = void 0; + var n, i = r(25), o = r(74), a = r(21), s = r(20), u = r(8), c = r(44), d = r(12), l = r(15), f = (n = r(10)) && n.__esModule ? n : { default: n }; + var p = (0, u.logger)({ + name: 'myi', + textColor: '#FFF', + bgColor: '#005500' + }), g = f.default.MODULES.MYI, m = function () { + var e = {}, t = !1; + function r(e, t) { + var r = null, n = (0, d.dom)().window.document.getElementById(t.code); + null === n ? p.atVerbosity(3).logInfo('No such element \'' + t.code + '\'. Cannot add data-ad attribute to non-existent element.') : null === n.getAttribute('data-ad') && (r = function (e) { + return e.originalCode + (e.incremental ? e.index : ''); + }(t), n.setAttribute('data-ad', r), p.atVerbosity(3).logInfo('Adding attribute \'data-ad\' with value \'' + r + '\' to element \'' + t.code + '\'.')), e(t); + } + function n() { + p.atVerbosity(3).logInfo('moatYieldReady() (myiReady) fired'), t = !0, i(); + } + function i(e) { + return (0, d.dom)().window.moatPrebidApi && 'function' == typeof (0, d.dom)().window.moatPrebidApi.slotDataAvailable && (0, d.dom)().window.moatPrebidApi.slotDataAvailable() ? void 0 !== e ? (p.atVerbosity(3).logInfo('Slot level data added to one slot!'), (0, d.dom)().window.moatPrebidApi.setMoatTargetingForSlot(e)) : (p.atVerbosity(3).logInfo('Slot level data added to all slots!'), (0, d.dom)().window.moatPrebidApi.setMoatTargetingForAllSlots()) : (!1 === t ? p.atVerbosity(3).logInfo('Slot level data not available. MYI tag has not yet fully rendered.') : p.atVerbosity(3).logInfo('Slot level data not available. This URL has not yet gotten enough traffic to populate the MYI slot data.'), !1); + } + return a.exposureApi.expose({ + myiReady: n, + setMYISlotData: i + }), { + name: g, + register: function () { + s.eventEmitter.on('batchSlotsDefined', function (e, t) { + p.atVerbosity(3).logInfo('Attempting to get slot level targeting from MYI'), i(); + }), (0, l.getConfig)('moat.yieldIntelligence', function (t) { + e = t; + }); + }, + initialize: function () { + c.postProcessUnit.before(r), (0, o.renderScript)({ + src: e.scriptUrl, + async: !0, + id: 'bb-myi' + }), (0, d.dom)().window.moatYieldReady = n, (0, d.dom)().window.setMoatPrebidData = i; + }, + myiReady: n, + setMYISlotData: i, + postProcessUnitHook: r + }; + }(), v = i.moduleManager.register(m, null); + t.myiModule = v; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.autoPriorityModule = void 0, r(83); + var n, i = r(25), o = r(100), a = r(8), s = r(52), u = r(15), c = r(12), d = (n = r(10)) && n.__esModule ? n : { default: n }, l = r(212); + var f = d.default.MODULES.AUTO_PRIORITY, p = function () { + var e = { + enabled: !0, + refresh: !0, + bids: !0 + }, t = 0; + function r(e, t, r) { + e(function (e) { + return (0, l.elementSort)(e, (0, u.getConfig)('priorityAxis')); + }(t), r); + } + function n(e, t) { + t.some(function (e) { + var t = (0, c.dom)().window.document.getElementById(e); + return !t || 'none' === t.style.display; + }) ? (a.bbLogger.logMessage('Ad unit div has a style of display:none;. Autoprioritization for Bid Priority has been turned off for this evaluation. Please ensure your div does not have a style of display: none;.', t), e(t)) : e(t.sort(i)); + } + function i(e, r) { + var n = (0, c.dom)().window.document.getElementById(e), i = (0, c.dom)().window.document.getElementById(r), o = n.getBoundingClientRect().top, a = i.getBoundingClientRect().top; + return o - t - (a - t) > 0 ? 1 : -1; + } + return { + name: f, + register: function () { + (0, u.getConfig)('autoPriority', function (t) { + e = t; + }), (0, c.dom)().window.document.addEventListener('scroll', function () { + t = (0, c.dom)().window.pageYOffset || (0, c.dom)().window.document.documentElement.scrollTop; + }); + }, + initialize: function () { + e.enabled && (e.refresh && s.adServerRequest.before(r), e.bids && o.bidCache.applyPriorityOrder.after(n)); + }, + deregister: function () { + s.adServerRequest.getHook({ hook: r }).remove(), o.bidCache.applyPriorityOrder.getHook({ hook: n }).remove(); + } + }; + }(), g = i.moduleManager.register(p); + t.autoPriorityModule = g; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.timingsAnalyticsHandler = void 0, r(352), r(354), r(11), r(6), r(13), r(4), r(17), r(2), r(1), r(3), r(0), r(5), r(123), r(43), r(124), r(9); + var n, i = r(25), o = r(20), a = (n = r(10)) && n.__esModule ? n : { default: n }, s = r(15), u = r(12), c = r(355), d = r(21), l = r(193), f = r(99); + function p(e, t, r) { + return (p = g() ? Reflect.construct : function (e, t, r) { + var n = [null]; + n.push.apply(n, t); + var i = new (Function.bind.apply(e, n))(); + return r && m(i, r.prototype), i; + }).apply(null, arguments); + } + function g() { + if ('undefined' == typeof Reflect || !Reflect.construct) { + return !1; + } + if (Reflect.construct.sham) { + return !1; + } + if ('function' == typeof Proxy) { + return !0; + } + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (e) { + return !1; + } + } + function m(e, t) { + return (m = Object.setPrototypeOf || function (e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function v(e) { + return function (e) { + if (Array.isArray(e)) { + return b(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return b(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return b(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function b(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function y(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function h(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? y(Object(r), !0).forEach(function (t) { + S(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : y(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function S(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var O = a.default.MODULES, _ = O.BIDBARREL_ANALYTICS, E = O.ANALYTICS_TIMINGS, I = O.GOOGLE_PUBLISHER_TAG, w = function () { + var e, t = { allowDuplicates: {} }, r = { + matchPartRe: null, + matchManual: [], + items: [] + }, n = [], a = {}, g = {}, m = { + lastEntry: null, + timer: null, + reported: !1 + }, b = {}, y = {}, S = (0, f.runQueue)('timingsPostInitializationQueue'); + function O(e, t) { + for (var r = e, n = [], i = 0; i < r.length; i++) { + var o = r[i], a = w(o); + 0 === a.length ? n.push(o) : t(a); + } + return n; + } + function w(e) { + return (0, u.dom)().window.performance.getEntriesByType ? (0, u.dom)().window.performance.getEntriesByType(e) : 'navigation' === e && (0, u.dom)().window.performance.timing ? [(0, u.dom)().window.performance.timing] : []; + } + function A(e) { + for (var n = e.getEntries ? e.getEntries() : e, i = function (e) { + var i = n[e]; + if ('resource' === i.entryType && 'script' === i.initiatorType) { + if (r.matchPartRe && r.matchPartRe.test(i.name)) { + x(i); + } else if (t.utag && /(tags\.tiqcdn\.com\/utag\/cbsi)/gm.test(i.name)) { + !function (e) { + if (m.reported) { + return; + } + m.timer && clearTimeout(m.timer); + m.lastEntry = e, T(); + }(i); + } else if (r.matchManual.length > 0) { + var o = r.matchManual.find(function (e) { + return e.match.test(i.name); + }); + o && x(i, o); + } + } + }, o = 0; o < n.length; o++) { + i(o); + } + } + function T() { + m.timer = setTimeout(function () { + m.lastEntry && (x(m.lastEntry, { + record: { + type: 'timing', + timingType: 'measure', + name: 'Time to UTag', + slug: 'script-utag' + } + }), m.reported = !0); + }, 5000); + } + function x(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, n = t || r.items.find(function (t) { + return t.match.test(e.name); + }); + n && (C({ + type: 'timing', + timingType: 'mark', + name: n.record.name + ' Loaded', + slug: n.record.slug, + amount: e.responseEnd + }), C({ + type: 'timing', + timingType: 'measure', + name: n.record.name + ' Load Duration', + slug: ''.concat(n.record.slug, '-duration'), + amount: e.duration + })); + } + function C(e) { + var r = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + S.push(function () { + if (y.slugMap[e.slug] && !r || a[e.slug] && !t.allowDuplicates[e.slug]) { + if (y.slugMap[e.slug] && !r) { + var n = y.slugMap[e.slug]; + y.slugRecord[e.slug] = e, y.gateways[n].open(e.slug); + } + } else { + a[e.slug] = !0, g[e.slug] = 'number' == typeof e.amount ? Math.round(e.amount) : e.amount, i.moduleManager.viaModule(_, function (t) { + var r = t.addRecord; + e.amount = e.amount.toFixed(3), r(e); + }); + } + }); + } + return d.exposureApi.expose({ + getAnalyticsTimings: function () { + return g; + } + }), { + initialize: function () { + !function () { + if (t.sequences) { + y.gateways = {}, y.slugMap = {}, y.slugRecord = {}; + for (var e = 0; e < t.sequences.length; e++) { + var r = t.sequences[e], n = 'analyticsTimingSeq'.concat(e); + y.gateways[n] = (0, l.gateway)(n, r); + for (var i = function (e) { + var t = r[e]; + y.slugMap[t] = n, y.gateways[n].onOpen(function () { + C(y.slugRecord[t], !0); + }); + }, o = 0; o < r.length; o++) { + i(o); + } + } + } + }(), function () { + var e = t.events, r = function (t) { + if (Object.prototype.hasOwnProperty.call(e, t)) { + var r = e[t], a = r.record, s = r.once, c = r.event; + if (c && c.gpt) { + i.moduleManager.viaModule(I, function (e) { + (0, e.gptAction)(function (e) { + e.pubads().addEventListener(c.name, function () { + b[t] || (C(h(h({ + type: 'timing', + timingType: 'mark' + }, a), {}, { amount: (0, u.dom)().window.performance.now() })), b[t] = !0); + }); + }); + }); + } else { + var d = o.eventEmitter.on(t, function () { + C(h(h({ + type: 'timing', + timingType: 'mark' + }, a), {}, { amount: (0, u.dom)().window.performance.now() })); + }, s || !1); + n.push(d); + } + } + }; + for (var a in e) { + r(a); + } + }(), (0, u.dom)().window.performance.getEntries && (!function (e) { + var t = []; + for (var n in e) { + if (Object.prototype.hasOwnProperty.call(e, n)) { + var i = e[n]; + i.record = h(h({}, r.defaultRecordData), i.record), i.matchPart ? (t.push(i.matchPart), i.match = new RegExp('('.concat(i.matchPart, ')'), 'gm')) : (i.match = p(RegExp, v(Array.isArray(i.match) ? i.match : [ + i.match, + 'gm' + ])), r.matchManual.push(i)), r.items.push(i); + } + } + r.matchPartRe = new RegExp('('.concat(t.join('|'), ')'), 'gm'); + }(t.scripts), t.utag && T(), O(['resource'], A), (e = new c.PerformanceObserver(A)).observe({ entryTypes: ['resource'] }), S.run()); + }, + register: function () { + (0, s.getConfig)('analyticsTimings', function (e) { + t = e; + }); + }, + deregister: function () { + for (var t = 0; t < n.length; t++) { + (0, n[t])(); + } + e.disconnect(); + }, + addTimingRecord: C, + getIncompleteEntryTypes: O, + name: E + }; + }(), A = i.moduleManager.register(w, [_]); + t.timingsAnalyticsHandler = A; + }, + function (e, t, r) { + var n = r(14), i = r(80), o = r(65), a = r(27), s = r(23), u = r(24), c = r(353), d = (r(18).Reflect || {}).construct, l = u(function () { + function e() { + } + return !(d(function () { + }, [], e) instanceof e); + }), f = !u(function () { + d(function () { + }); + }); + n(n.S + n.F * (l || f), 'Reflect', { + construct: function (e, t) { + o(e), a(t); + var r = arguments.length < 3 ? e : o(arguments[2]); + if (f && !l) { + return d(e, t, r); + } + if (e == r) { + switch (t.length) { + case 0: + return new e(); + case 1: + return new e(t[0]); + case 2: + return new e(t[0], t[1]); + case 3: + return new e(t[0], t[1], t[2]); + case 4: + return new e(t[0], t[1], t[2], t[3]); + } + var n = [null]; + return n.push.apply(n, t), new (c.apply(e, n))(); + } + var u = r.prototype, p = i(s(u) ? u : Object.prototype), g = Function.apply.call(e, p, t); + return s(g) ? g : p; + } + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(65), i = r(23), o = r(197), a = [].slice, s = {}, u = function (e, t, r) { + if (!(t in s)) { + for (var n = [], i = 0; i < t; i++) { + n[i] = 'a[' + i + ']'; + } + s[t] = Function('F,a', 'return new F(' + n.join(',') + ')'); + } + return s[t](e, r); + }; + e.exports = Function.bind || function (e) { + var t = n(this), r = a.call(arguments, 1), s = function () { + var n = r.concat(a.call(arguments)); + return this instanceof s ? u(t, n.length, n) : o(t, n, e); + }; + return i(t.prototype) && (s.prototype = t.prototype), s; + }; + }, + function (e, t, r) { + var n = r(14); + n(n.S, 'Object', { setPrototypeOf: r(205).set }); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.PerformanceObserver = void 0; + var n, i = r(12), o = (n = r(356)) && n.__esModule ? n : { default: n }; + var a = (0, i.dom)().window.PerformanceObserver || o.default; + t.PerformanceObserver = a; + }, + function (e, t, r) { + e.exports = function (e) { + var t = {}; + function r(n) { + if (t[n]) { + return t[n].exports; + } + var i = t[n] = { + i: n, + l: !1, + exports: {} + }; + return e[n].call(i.exports, i, i.exports, r), i.l = !0, i.exports; + } + return r.m = e, r.c = t, r.d = function (e, t, n) { + r.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: n + }); + }, r.r = function (e) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); + }, r.t = function (e, t) { + if (1 & t && (e = r(e)), 8 & t) { + return e; + } + if (4 & t && 'object' == typeof e && e && e.__esModule) { + return e; + } + var n = Object.create(null); + if (r.r(n), Object.defineProperty(n, 'default', { + enumerable: !0, + value: e + }), 2 & t && 'string' != typeof e) { + for (var i in e) { + r.d(n, i, function (t) { + return e[t]; + }.bind(null, i)); + } + } + return n; + }, r.n = function (e) { + var t = e && e.__esModule ? function () { + return e.default; + } : function () { + return e; + }; + return r.d(t, 'a', t), t; + }, r.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }, r.p = '', r(r.s = 0); + }([function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function i(e) { + return function (e) { + if (Array.isArray(e)) { + for (var t = 0, r = new Array(e.length); t < e.length; t++) { + r[t] = e[t]; + } + return r; + } + }(e) || function (e) { + if (Symbol.iterator in Object(e) || '[object Arguments]' === Object.prototype.toString.call(e)) { + return Array.from(e); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance'); + }(); + } + function o(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r]; + n.enumerable = n.enumerable || !1, n.configurable = !0, 'value' in n && (n.writable = !0), Object.defineProperty(e, n.key, n); + } + } + function a(e) { + if (void 0 === e) { + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + } + return e; + } + function s(e) { + var t = 'function' == typeof Map ? new Map() : void 0; + return (s = function (e) { + if (null === e || (r = e, -1 === Function.toString.call(r).indexOf('[native code]'))) { + return e; + } + var r; + if ('function' != typeof e) { + throw new TypeError('Super expression must either be null or a function'); + } + if (void 0 !== t) { + if (t.has(e)) { + return t.get(e); + } + t.set(e, n); + } + function n() { + return u(e, arguments, d(this).constructor); + } + return n.prototype = Object.create(e.prototype, { + constructor: { + value: n, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), c(n, e); + })(e); + } + function u(e, t, r) { + return (u = function () { + if ('undefined' == typeof Reflect || !Reflect.construct) { + return !1; + } + if (Reflect.construct.sham) { + return !1; + } + if ('function' == typeof Proxy) { + return !0; + } + try { + return Date.prototype.toString.call(Reflect.construct(Date, [], function () { + })), !0; + } catch (e) { + return !1; + } + }() ? Reflect.construct : function (e, t, r) { + var n = [null]; + n.push.apply(n, t); + var i = new (Function.bind.apply(e, n))(); + return r && c(i, r.prototype), i; + }).apply(null, arguments); + } + function c(e, t) { + return (c = Object.setPrototypeOf || function (e, t) { + return e.__proto__ = t, e; + })(e, t); + } + function d(e) { + return (d = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) { + return e.__proto__ || Object.getPrototypeOf(e); + })(e); + } + r.r(t); + var l = function (e) { + function t(e) { + var r, o, s, u, c; + return function (e, t) { + if (!(e instanceof t)) { + throw new TypeError('Cannot call a class as a function'); + } + }(this, t), o = function (e, t) { + return !t || 'object' !== n(t) && 'function' != typeof t ? a(e) : t; + }(this, (r = d(t)).call.apply(r, [this].concat(i(e)))), c = void 0, (u = '_entries') in (s = a(o)) ? Object.defineProperty(s, u, { + value: c, + enumerable: !0, + configurable: !0, + writable: !0 + }) : s[u] = c, o._entries = e, o; + } + var r, s, u; + return function (e, t) { + if ('function' != typeof t && null !== t) { + throw new TypeError('Super expression must either be null or a function'); + } + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + writable: !0, + configurable: !0 + } + }), t && c(e, t); + }(t, e), r = t, (s = [ + { + key: 'getEntries', + value: function () { + return this._entries; + } + }, + { + key: 'getEntriesByType', + value: function (e) { + return this._entries.filter(function (t) { + return t.entryType === e; + }); + } + }, + { + key: 'getEntriesByName', + value: function (e, t) { + return this._entries.filter(function (t) { + return t.name === e; + }).filter(function (e) { + return !t || e.entryType === t; + }); + } + } + ]) && o(r.prototype, s), u && o(r, u), t; + }(s(Array)); + function f(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r]; + n.enumerable = n.enumerable || !1, n.configurable = !0, 'value' in n && (n.writable = !0), Object.defineProperty(e, n.key, n); + } + } + function p(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function g(e, t) { + for (var r = 0; r < t.length; r++) { + var n = t[r]; + n.enumerable = n.enumerable || !1, n.configurable = !0, 'value' in n && (n.writable = !0), Object.defineProperty(e, n.key, n); + } + } + function m(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var v = [ + 'mark', + 'measure', + 'navigation', + 'resource' + ], b = 'Failed to execute \'observe\' on \'PerformanceObserver\': either an \'entryTypes\' or \'type\' member must be present.', y = 'Failed to execute \'observe\' on \'PerformanceObserver\': either an \'entryTypes\' or \'type\' member must be present, not both.', h = 'Aborting \'observe\' on \'PerformanceObserver\': no valid entry types present in either \'entryTypes\' or \'type\' member.', S = 'Invalid or unsupported entry types provided to \'observe\' on \'PerformanceObserver\'.', O = function (e) { + return v.some(function (t) { + return e === t; + }); + }, _ = new (function () { + function e() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, r = t.registeredObservers, n = void 0 === r ? new Set() : r, i = t.processedEntries, o = void 0 === i ? new Set() : i, a = t.interval, s = void 0 === a ? 100 : a, u = t.context, c = void 0 === u ? self : u; + !function (e, t) { + if (!(e instanceof t)) { + throw new TypeError('Cannot call a class as a function'); + } + }(this, e), p(this, 'registeredObservers', void 0), p(this, 'processedEntries', void 0), p(this, 'interval', void 0), p(this, 'intervalId', void 0), p(this, 'context', void 0), this.registeredObservers = n, this.processedEntries = o, this.interval = s, this.context = c, this.intervalId = null; + } + var t, r, n; + return t = e, (r = [ + { + key: 'getNewEntries', + value: function () { + var e = this; + return this.context.performance.getEntries().filter(function (t) { + return !e.processedEntries.has(t); + }); + } + }, + { + key: 'getObserversForType', + value: function (e, t) { + return Array.from(e).filter(function (e) { + return e.entryTypes.some(function (e) { + return e === t; + }); + }); + } + }, + { + key: 'processBuffer', + value: function (e) { + var t = Array.from(e.buffer), r = new l(t); + e.buffer.clear(), t.length && e.callback && e.callback.call(void 0, r, e); + } + }, + { + key: 'processEntries', + value: function () { + var e = this; + this.getNewEntries().forEach(function (t) { + var r = t.entryType; + e.getObserversForType(e.registeredObservers, r).forEach(function (e) { + e.buffer.add(t); + }), e.processedEntries.add(t); + }); + var t = function () { + return e.registeredObservers.forEach(e.processBuffer); + }; + 'requestAnimationFrame' in this.context ? this.context.requestAnimationFrame(t) : this.context.setTimeout(t, 0); + } + }, + { + key: 'add', + value: function (e) { + this.registeredObservers.add(e), 1 === this.registeredObservers.size && this.observe(); + } + }, + { + key: 'remove', + value: function (e) { + this.registeredObservers.delete(e), this.registeredObservers.size || this.disconnect(); + } + }, + { + key: 'observe', + value: function () { + this.intervalId = this.context.setInterval(this.processEntries.bind(this), this.interval); + } + }, + { + key: 'disconnect', + value: function () { + this.intervalId = this.context.clearInterval(this.intervalId); + } + } + ]) && f(t.prototype, r), n && f(t, n), e; + }())(), E = function () { + function e(t) { + var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : _; + !function (e, t) { + if (!(e instanceof t)) { + throw new TypeError('Cannot call a class as a function'); + } + }(this, e), m(this, 'callback', void 0), m(this, 'buffer', void 0), m(this, 'entryTypes', []), m(this, 'taskQueue', void 0), this.callback = t, this.buffer = new Set(), this.taskQueue = r; + } + var t, r, n; + return t = e, (r = [ + { + key: 'observe', + value: function (e) { + if (!e) { + throw new Error(b); + } + if (e.entryTypes && e.type) { + throw new Error(y); + } + var t; + if (e.entryTypes) { + t = e.entryTypes; + } else { + if (!e.type) { + throw new Error(b); + } + t = [e.type]; + } + var r = t.filter(O); + r.length > 0 && r.length !== t.length && console.warn(S), r.length ? (this.entryTypes = r, this.taskQueue.add(this)) : console.warn(h); + } + }, + { + key: 'disconnect', + value: function () { + this.taskQueue.remove(this); + } + }, + { + key: 'takeRecords', + value: function () { + var e = Array.from(this.buffer); + return new l(e); + } + } + ]) && g(t.prototype, r), n && g(t, n), e; + }(); + m(E, 'supportedEntryTypes', v); + var I = E, w = 'PerformanceObserver' in self && 'function' == typeof PerformanceObserver; + t.default = w ? PerformanceObserver : I; + }]); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.prebidAnalyticsHandler = void 0, r(17), r(2), r(1), r(3), r(5), r(11), r(0); + var n = r(101), i = c(r(10)), o = r(20), a = r(25), s = r(44), u = c(r(150)); + function c(e) { + return e && e.__esModule ? e : { default: e }; + } + function d(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function l(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? d(Object(r), !0).forEach(function (t) { + f(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : d(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function f(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var p = (0, n.getGlobal)(), g = [ + 'bidder', + 'adUnitCode', + 'dealId', + 'pbCg', + 'bidderCode', + 'adId', + 'requestTimestamp', + 'responseTimestamp', + 'statusMessage', + 'height', + 'width', + 'timeToRespond', + 'mediaType' + ], m = i.default.MODULES, v = m.PREBID_HEADER_BIDDING, b = m.BIDBARREL_ANALYTICS, y = m.ANALYTICS_PREBID, h = i.default.ANALYTICS_RECORD_TYPES, S = h.NO_BID, O = h.BID, _ = h.BID_USED, E = i.default.EVENTS.REFRESH, I = function () { + var e = [], t = !1; + function r(t) { + e.push({ + type: S, + wrapperSource: 'prebid', + bidder: t.bidder, + adUnitCode: t.adUnitCode, + createTimestamp: new Date().getTime() + }); + } + function n(t) { + var r = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; + 'boolean' != typeof r && (r = !0), r ? c(l(l({ + type: _, + wrapperSource: 'prebid' + }, (0, u.default)(t, g)), {}, { + cpm: t.cpm.toFixed(5).toString(), + createTimestamp: new Date().getTime() + })) : e.push(l(l({ + type: O, + wrapperSource: 'prebid' + }, (0, u.default)(t, g)), {}, { + cpm: t.cpm.toFixed(5).toString(), + createTimestamp: t.responseTimestamp + })); + } + function i(t) { + for (var r = t.bidsReceived, i = 0; i < r.length; i++) { + n(r[i], !1); + } + !function () { + for (var t = 0; t < e.length; t++) { + c(e[t]); + } + e = []; + }(); + } + function c(e) { + a.moduleManager.viaModule(b, function (t) { + var r = t.addRecord; + -1 === [ + O, + _ + ].indexOf(e.type) ? r(e) : e.type === O ? o.eventEmitter.on(''.concat(e.adUnitCode, '.').concat(E), function (t) { + r(l(l({}, e), {}, { impId: t.targeting.iid })); + }, !0) : r(l(l({}, e), {}, { impId: (0, s.getUnits)()[e.adUnitCode].targeting.iid })); + }); + } + return { + register: function () { + a.moduleManager.viaModule(v, function () { + t || (p.que.push(function () { + p.onEvent('noBid', r), p.onEvent('auctionEnd', i), p.onEvent('bidWon', n); + }), t = !0); + }); + }, + deregister: function () { + t && (p.que.push(function () { + p.offEvent('noBid', r), p.offEvent('auctionEnd', i), p.offEvent('bidWon', n); + }), t = !1); + }, + name: y + }; + }(), w = a.moduleManager.register(I, [ + b, + v + ]); + t.prebidAnalyticsHandler = w; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.amazonAnalyticsHandler = t.amazonHandler = void 0, r(17), r(3), r(5), r(6), r(13), r(9), r(11), r(0), r(1), r(4), r(2), r(16); + var n, i = r(20), o = (n = r(10)) && n.__esModule ? n : { default: n }, a = r(25), s = r(12), u = r(44); + function c(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function d(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? c(Object(r), !0).forEach(function (t) { + l(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : c(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function l(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function f(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return p(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return p(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function p(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var g = o.default.EVENTS, m = g.HEADER_BIDDING_RESPONSE, v = g.HEADER_BIDDING_REQUEST, b = g.IDENTIFIED, y = g.REFRESH, h = o.default.MODULES, S = h.BIDBARREL_ANALYTICS, O = h.AMAZON_HEADER_BIDDING, _ = h.ANALYTICS_AMAZON, E = o.default.ANALYTICS_RECORD_TYPES, I = E.NO_BID, w = E.BID, A = E.BID_USED, T = function () { + var e, t = {}, r = 0, n = 0; + function o(e) { + for (var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null, c = o, l = new Date().getTime(), p = (0, s.dom)().window.performance.now(), g = function (o) { + var s = void 0; + if (c !== A) { + var g = e[o], m = g.amznp, v = g.amzniid, b = g.amznbid, h = g.size, O = g.slotID, _ = g.mediaType; + if ((c = [ + '0', + '1', + '2' + ].indexOf(m) >= 0 ? I : w) === I) { + s = { + type: c, + wrapperSource: 'amazon', + bidder: m, + adUnitCode: O, + createTimestamp: new Date().getTime() + }; + } else { + var E, T; + if ('video' === _) { + E = 640, T = 480; + } else { + var x = f(h.split('x').map(function (e) { + return parseInt(e); + }), 2); + E = x[0], T = x[1]; + } + s = { + type: c, + wrapperSource: 'amazon', + bidder: m, + adUnitCode: O, + bidderCode: m, + cpm: b, + createTimestamp: new Date().getTime(), + adId: v, + statusMessage: 'Bid Available', + width: E, + height: T, + pbCg: b, + requestTimestamp: r, + responseTimestamp: l, + timeToRespond: p - n + }; + } + t[O] = s; + } else { + (s = e[o]).type = A; + } + a.moduleManager.viaModule(S, function (e) { + var t = e.addRecord; + if (-1 === [ + w, + A + ].indexOf(s.type)) { + t(s); + } else if (s.type === w) { + i.eventEmitter.on(''.concat(s.adUnitCode, '.').concat(y), function (e) { + t(d(d({}, s), {}, { impId: e.targeting.iid })); + }, !0); + } else { + var r = (0, u.getUnits)()[s.adUnitCode]; + t(d(d({}, s), {}, { impId: r.targeting.iid })); + } + }); + }, m = 0; m < e.length; m++) { + g(m); + } + } + return { + register: function () { + a.moduleManager.viaModule(O, function () { + var a, u, c; + a = i.eventEmitter.on(''.concat(O, '.').concat(v), function (e, t, i) { + r = new Date().getTime(), n = (0, s.dom)().window.performance.now(); + }), u = i.eventEmitter.on(''.concat(O, '.').concat(m), function (e, t, r) { + o(r); + }), c = i.eventEmitter.on(b, function (e) { + 'amazon' === e.provider && o([t[e.code]], A); + }), e = [ + a, + u, + c + ]; + }); + }, + deregister: function () { + for (var t = 0; t < e.length; t++) { + (0, e[t])(); + } + e = []; + }, + name: _ + }; + }(); + t.amazonHandler = T; + var x = a.moduleManager.register(T, [ + S, + O + ]); + t.amazonAnalyticsHandler = x; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.timingsBoomr = void 0, r(17), r(2), r(5), r(1), r(3), r(0), r(54); + var n, i = r(25), o = d(r(10)), a = r(12), s = d(r(34)), u = r(8), c = r(15); + function d(e) { + return e && e.__esModule ? e : { default: e }; + } + function l(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function f(e, t) { + if (null == e) { + return {}; + } + var r, n, i = function (e, t) { + if (null == e) { + return {}; + } + var r, n, i = {}, o = Object.keys(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || (i[r] = e[r]); + } + return i; + }(e, t); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || Object.prototype.propertyIsEnumerable.call(e, r) && (i[r] = e[r]); + } + } + return i; + } + function p(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var g = o.default.ANALYTICS_RECORD_DEFAULTS, m = g.VISUALLY_READY, v = g.INTERACTIVE, b = g.FIRST_INTERACTION, y = g.FIRST_PAINT, h = g.FIRST_CONTENTFUL_PAINT, S = g.PAGE_LOAD, O = g.FIRST_BYTE, _ = o.default.MODULES, E = _.BIDBARREL_ANALYTICS, I = _.ANALYTICS_TIMINGS_BOOMR, w = _.ANALYTICS_TIMINGS, A = { + timeToFirstInteraction: { + name: b.NAME, + slug: b.SLUG + }, + timeToInteractive: { + name: v.NAME, + slug: v.SLUG + }, + timeToVisuallyReady: { + name: m.NAME, + slug: m.SLUG + } + }, T = (p(n = {}, y.SLUG, { + metricName: 'first-paint', + name: y.NAME, + slug: y.SLUG + }), p(n, y.SLUG, { + metricName: 'first-contentful-paint', + name: h.NAME, + slug: h.SLUG + }), n), x = function () { + var e, t, r, n = { timeout: 60000 }, o = (p(e = {}, m.SLUG, !1), p(e, v.SLUG, !1), p(e, b.SLUG, !1), p(e, y.SLUG, !1), p(e, h.SLUG, !1), p(e, S.SLUG, !1), p(e, O.SLUG, !1), e); + function d() { + if (-1 !== Object.values(o).indexOf(!1)) { + var e = (0, a.dom)().window.BOOMR; + if (e) { + var i = (0, s.default)(e, 'plugins.Continuity'); + if (i && i.is_complete()) { + var c = i.metrics; + for (var l in A) { + if (Object.prototype.hasOwnProperty.call(A, l) && (0, s.default)(c, l)) { + var p = A[l]; + p.amount = c[l](), g(p); + } + } + } else { + u.bbLogger.logInfo('Contintuity not complete'); + } + if (e.getPerformance) { + var m = (0, s.default)(e.getPerformance(), 'timing'); + g({ + timingType: 'measure', + name: O.NAME, + slug: O.SLUG, + amount: m.responseStart - m.requestStart + }), g({ + name: S.NAME, + slug: S.SLUG, + amount: m.domContentLoadedEventEnd - m.domainLookupEnd + }); + } + var v = (0, s.default)(e, 'plugins.PaintTiming'); + if (v && v.is_complete()) { + for (var b in T) { + if (Object.prototype.hasOwnProperty.call(T, b)) { + var y = T[b], h = y.metricName, _ = f(y, ['metricName']); + _.amount = v.getTimingFor(h), g(_); + } + } + } + -1 !== Object.values(o).indexOf(!1) && (0, a.dom)().window.performance.now() - r < n.timeout && (r || (r = (0, a.dom)().window.performance.now()), t = setTimeout(function () { + d(); + }, 500)); + } + } else { + t && clearTimeout(t); + } + } + function g(e) { + void 0 === e.amount || o[e.slug] || (o[e.slug] = !0, i.moduleManager.viaModule(w, function (t) { + (0, t.addTimingRecord)(function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? l(Object(r), !0).forEach(function (t) { + p(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : l(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + }({ + type: 'timing', + timingType: 'mark' + }, e)); + })); + } + function _() { + (0, a.dom)().window.document.addEventListener('onBeforeBoomerangBeacon', function () { + d(); + }, { once: !0 }); + } + return { + name: I, + register: function () { + if ((0, c.getConfig)('analyticsTimings', function (e) { + n = e; + }), (0, s.default)((0, a.dom)().window, 'BOOMR')) { + var e = (0, s.default)((0, a.dom)().window, 'BOOMR.plugins.Continuity.is_complete'); + e && e() ? d() : _(); + } else { + _(); + } + } + }; + }(), C = i.moduleManager.register(x, [ + E, + w + ]); + t.timingsBoomr = C; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.setSubmoduleRegistry = function (e) { + C = e; + }, t.setStoredValue = P, t.setStoredConsentData = D, t.findRootDomain = M, t.requestBidsHook = z, t.attachIdSystem = Y, t.init = K, t.validateGdprEnforcement = t.auctionDelay = t.syncDelay = t.coreStorage = t.PBJS_USER_ID_OPTOUT_NAME = void 0, r(4), r(2), r(6), r(13), r(11), r(1), r(3), r(0), r(5), r(16), r(9); + var i = m(r(37)), o = r(22), a = m(r(60)), s = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = g(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), u = r(101), c = r(87), d = m(r(36)), l = r(61), f = r(361), p = r(75); + function g() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return g = function () { + return e; + }, e; + } + function m(e) { + return e && e.__esModule ? e : { default: e }; + } + function v(e) { + if ('undefined' == typeof Symbol || null == e[Symbol.iterator]) { + if (Array.isArray(e) || (e = function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return b(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return b(e, t); + } + }(e))) { + var t = 0, r = function () { + }; + return { + s: r, + n: function () { + return t >= e.length ? { done: !0 } : { + done: !1, + value: e[t++] + }; + }, + e: function (e) { + throw e; + }, + f: r + }; + } + throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + var n, i, o = !0, a = !1; + return { + s: function () { + n = e[Symbol.iterator](); + }, + n: function () { + var e = n.next(); + return o = e.done, e; + }, + e: function (e) { + a = !0, i = e; + }, + f: function () { + try { + o || null == n.return || n.return(); + } finally { + if (a) { + throw i; + } + } + } + }; + } + function b(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var y = '_pbjs_userid_consent_data', h = 30; + t.PBJS_USER_ID_OPTOUT_NAME = '_pbjs_id_optout'; + var S = (0, p.getCoreStorageManager)('userid'); + t.coreStorage = S; + var O, _, E, I, w = [], A = !1, T = [], x = [], C = []; + function P(e, t) { + var r = e.config.storage, n = 'function' == typeof e.submodule.domainOverride ? e.submodule.domainOverride() : null; + try { + var i = s.isPlainObject(t) ? JSON.stringify(t) : t, o = new Date(Date.now() + 86400000 * r.expires).toUTCString(); + 'cookie' === r.type ? (S.setCookie(r.name, i, o, 'Lax', n), 'number' == typeof r.refreshInSeconds && S.setCookie(''.concat(r.name, '_last'), new Date().toUTCString(), o, 'Lax', n)) : 'html5' === r.type && (S.setDataInLocalStorage(''.concat(r.name, '_exp'), o), S.setDataInLocalStorage(r.name, encodeURIComponent(i)), 'number' == typeof r.refreshInSeconds && S.setDataInLocalStorage(''.concat(r.name, '_last'), new Date().toUTCString())); + } catch (e) { + s.logError(e); + } + } + function j(e) { + var t, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : void 0, n = r ? ''.concat(e.name, '_').concat(r) : e.name; + try { + if ('cookie' === e.type) { + t = S.getCookie(n); + } else if ('html5' === e.type) { + var i = S.getDataFromLocalStorage(''.concat(e.name, '_exp')); + '' === i ? t = S.getDataFromLocalStorage(n) : i && new Date(i).getTime() - Date.now() > 0 && (t = decodeURIComponent(S.getDataFromLocalStorage(n))); + } + 'string' == typeof t && '{' === t.charAt(0) && (t = JSON.parse(t)); + } catch (e) { + s.logError(e); + } + return t; + } + function R(e) { + var t = { + consentString: '', + gdprApplies: !1, + apiVersion: 0 + }; + return e && (t.consentString = e.consentString, t.gdprApplies = e.gdprApplies, t.apiVersion = e.apiVersion), s.cyrb53Hash(JSON.stringify(t)); + } + function D(e) { + try { + var t = new Date(Date.now() + 86400000 * h).toUTCString(); + S.setCookie(y, R(e), t, 'Lax'); + } catch (e) { + s.logError(e); + } + } + function k() { + try { + return S.getCookie(y); + } catch (e) { + s.logError(e); + } + } + function N(e) { + if (e && 'boolean' == typeof e.gdprApplies && e.gdprApplies) { + if (!e.consentString) { + return !1; + } + if (1 === e.apiVersion && !1 === s.deepAccess(e, 'vendorData.purposeConsents.1')) { + return !1; + } + if (2 === e.apiVersion && !1 === s.deepAccess(e, 'vendorData.purpose.consents.1')) { + return !1; + } + } + return !0; + } + function M() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : window.location.hostname; + if (!S.cookiesAreEnabled()) { + return e; + } + var t, r, n = e.split('.'); + if (2 == n.length) { + return e; + } + var i = -2, o = '_rdc'.concat(Date.now()), a = 'writeable'; + do { + t = n.slice(i).join('.'); + var u = new Date(s.timestamp() + 10000).toUTCString(); + S.setCookie(o, a, u, 'Lax', t, void 0); + var c = S.getCookie(o, void 0); + c === a ? (r = !1, S.setCookie(o, '', 'Thu, 01 Jan 1970 00:00:01 GMT', void 0, t, void 0)) : (i += -1, r = Math.abs(i) <= n.length); + } while (r); + return t; + } + function U(e, t) { + var r = function () { + }; + t && (r = s.delayExecution(function () { + clearTimeout(_), t(); + }, e.length)), e.forEach(function (e) { + e.callback(function (t) { + t ? (e.config.storage && P(e, t), e.idObj = e.submodule.decode(t, e.config)) : s.logInfo(''.concat('User ID', ': ').concat(e.submodule.name, ' - request id responded with an empty value')), r(); + }), e.callback = void 0; + }); + } + function B(e) { + return Array.isArray(e) && e.length ? e.filter(function (e) { + return s.isPlainObject(e.idObj) && Object.keys(e.idObj).length; + }).reduce(function (e, t) { + return Object.keys(t.idObj).forEach(function (r) { + e[r] = t.idObj[r]; + }), e; + }, {}) : {}; + } + function L(e) { + var t = !1; + if (void 0 === O && (O = function (e, t) { + var r = k(); + D(t); + var n = G(e, t), i = n.userIdModules; + if (!n.hasValidated && !N(t)) { + return s.logWarn(''.concat('User ID', ' - gdpr permission not valid for local storage or cookies, exit module')), []; + } + return i.reduce(function (e, n) { + return W(n, t, r, !1), e.push(n), e; + }, []); + }(T, c.gdprDataHandler.getConsentData())).length) { + var r = O.filter(function (e) { + return s.isFn(e.callback); + }); + if (r.length) { + if (e && I > 0) { + t = !0; + var n = !1, i = function () { + n || (n = !0, e()); + }; + s.logInfo(''.concat('User ID', ' - auction delayed by ').concat(I, ' at most to fetch ids')), _ = setTimeout(i, I), U(r, i); + } else { + a.default.on(d.default.EVENTS.AUCTION_END, function e() { + a.default.off(d.default.EVENTS.AUCTION_END, e), E > 0 ? setTimeout(function () { + U(r); + }, E) : U(r); + }); + } + } + } + e && !t && e(); + } + function z(e, t) { + L(function () { + !function (e, t) { + if (![e].some(function (e) { + return !Array.isArray(e) || !e.length; + })) { + var r = B(t), n = (0, f.createEidsArray)(r); + Object.keys(r).length && e.forEach(function (e) { + e.bids && s.isArray(e.bids) && e.bids.forEach(function (e) { + e.userId = r, e.userIdAsEids = n; + }); + }); + } + }(t.adUnits || (0, u.getGlobal)().adUnits, O), e.call(this, t); + }); + } + function V() { + return L(), B(O); + } + function F() { + return L(), (0, f.createEidsArray)(B(O)); + } + function q(e, t) { + var r = e ? e.submoduleNames : null; + r || (r = []), L(function () { + var e = c.gdprDataHandler.getConsentData(), n = k(); + D(e); + var i = G(T, e), o = i.userIdModules; + if (i.hasValidated || N(e)) { + var a, u = [], d = v(o); + try { + for (d.s(); !(a = d.n()).done;) { + var l = a.value; + r.length > 0 && -1 === r.indexOf(l.submodule.name) || (s.logInfo(''.concat('User ID', ' - refreshing ').concat(l.submodule.name)), W(l, e, n, !0), s.isFn(l.callback) && u.push(l)); + } + } catch (e) { + d.e(e); + } finally { + d.f(); + } + u.length > 0 && U(u), t && t(); + } else { + s.logWarn(''.concat('User ID', ' - gdpr permission not valid for local storage or cookies, exit module')); + } + }); + } + t.syncDelay = E, t.auctionDelay = I; + var G = (0, l.hook)('sync', function (e, t) { + return { + userIdModules: e, + hasValidated: t && t.hasValidated + }; + }, 'validateGdprEnforcement'); + function W(e, t, r, n) { + if (e.config.storage) { + var i, o = j(e.config.storage), a = !1; + if ('number' == typeof e.config.storage.refreshInSeconds) { + var u = new Date(j(e.config.storage, 'last')); + a = u && Date.now() - u.getTime() > 1000 * e.config.storage.refreshInSeconds; + } + !o || a || n || !function (e, t) { + return null == e || e === R(t); + }(r, t) ? i = e.submodule.getId(e.config, t, o) : 'function' == typeof e.submodule.extendId && (i = e.submodule.extendId(e.config, t, o)), s.isPlainObject(i) && (i.id && (P(e, i.id), o = i.id), 'function' == typeof i.callback && (e.callback = i.callback)), o && (e.idObj = e.submodule.decode(o, e.config)); + } else if (e.config.value) { + e.idObj = e.config.value; + } else { + var c = e.submodule.getId(e.config, t, void 0); + s.isPlainObject(c) && ('function' == typeof c.callback && (e.callback = c.callback), c.id && (e.idObj = e.submodule.decode(c.id, e.config))); + } + } + function H() { + var e = function (e, t, r) { + return Array.isArray(e) ? e.reduce(function (e, t) { + return !t || s.isEmptyStr(t.name) || (!t.storage || s.isEmptyStr(t.storage.type) || s.isEmptyStr(t.storage.name) || -1 === r.indexOf(t.storage.type) ? s.isPlainObject(t.value) ? e.push(t) : t.storage || t.value || e.push(t) : e.push(t)), e; + }, []) : []; + }(x, 0, w); + if (e.length) { + var t = C.filter(function (e) { + return !(0, i.default)(T, function (t) { + return t.name === e.name; + }); + }); + T = t.map(function (t) { + var r = (0, i.default)(e, function (e) { + return e.name === t.name; + }); + return t.findRootDomain = M, r ? { + submodule: t, + config: r, + callback: void 0, + idObj: void 0 + } : null; + }).filter(function (e) { + return null !== e; + }), !A && T.length && ((0, u.getGlobal)().requestBids.before(z, 40), s.logInfo(''.concat('User ID', ' - usersync config updated for ').concat(T.length, ' submodules: '), T.map(function (e) { + return e.submodule.name; + })), A = !0); + } + } + function Y(e) { + (0, i.default)(C, function (t) { + return t.name === e.name; + }) || (C.push(e), H()); + } + function K(e) { + T = [], x = [], A = !1, O = void 0, -1 !== (w = [ + S.localStorageIsEnabled() ? 'html5' : null, + S.cookiesAreEnabled() ? 'cookie' : null + ].filter(function (e) { + return null !== e; + })).indexOf('cookie') && S.getCookie('_pbjs_id_optout') ? s.logInfo(''.concat('User ID', ' - opt-out cookie found, exit module')) : -1 !== w.indexOf('html5') && S.getDataFromLocalStorage('_pbjs_id_optout') ? s.logInfo(''.concat('User ID', ' - opt-out localStorage found, exit module')) : (e.getConfig(function (e) { + var r = e.userSync; + r && r.userIds && (x = r.userIds, t.syncDelay = E = s.isNumber(r.syncDelay) ? r.syncDelay : 500, t.auctionDelay = I = s.isNumber(r.auctionDelay) ? r.auctionDelay : 0, H()); + }), (0, u.getGlobal)().getUserIds = V, (0, u.getGlobal)().getUserIdsAsEids = F, (0, u.getGlobal)().refreshUserIds = q); + } + t.validateGdprEnforcement = G, K(o.config), (0, l.module)('userId', Y); + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.createEidsArray = function (e) { + var t = []; + for (var r in e) { + if (e.hasOwnProperty(r)) { + if ('pubProvidedId' === r) { + t = t.concat(e.pubProvidedId); + } else { + var n = s(e[r], r); + n && t.push(n); + } + } + } + return t; + }, r(1), r(3), r(0), r(5); + var i = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = o(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var a in e) { + if (Object.prototype.hasOwnProperty.call(e, a)) { + var s = i ? Object.getOwnPropertyDescriptor(e, a) : null; + s && (s.get || s.set) ? Object.defineProperty(r, a, s) : r[a] = e[a]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)); + function o() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return o = function () { + return e; + }, e; + } + var a = { + intentIqId: { + source: 'intentiq.com', + atype: 1 + }, + pubcid: { + source: 'pubcid.org', + atype: 1 + }, + tdid: { + source: 'adserver.org', + atype: 1, + getUidExt: function () { + return { rtiPartner: 'TDID' }; + } + }, + id5id: { + getValue: function (e) { + return e.uid; + }, + source: 'id5-sync.com', + atype: 1, + getUidExt: function (e) { + if (e.ext) { + return e.ext; + } + } + }, + parrableId: { + source: 'parrable.com', + atype: 1, + getValue: function (e) { + return e.eid ? e.eid : e.ccpaOptout ? '' : null; + }, + getUidExt: function (e) { + var t = i.pick(e, [ + 'ibaOptout', + 'ccpaOptout' + ]); + if (Object.keys(t).length) { + return t; + } + } + }, + idl_env: { + source: 'liveramp.com', + atype: 1 + }, + lipb: { + getValue: function (e) { + return e.lipbid; + }, + source: 'liveintent.com', + atype: 1, + getEidExt: function (e) { + if (Array.isArray(e.segments) && e.segments.length) { + return { segments: e.segments }; + } + } + }, + britepoolid: { + source: 'britepool.com', + atype: 1 + }, + lotamePanoramaId: { + source: 'crwdcntrl.net', + atype: 1 + }, + criteoId: { + source: 'criteo.com', + atype: 1 + }, + merkleId: { + source: 'merkleinc.com', + atype: 1 + }, + netId: { + source: 'netid.de', + atype: 1 + }, + sharedid: { + source: 'sharedid.org', + atype: 1, + getValue: function (e) { + return e.id; + }, + getUidExt: function (e) { + return e && e.third ? { third: e.third } : void 0; + } + }, + IDP: { + source: 'zeotap.com', + atype: 1 + }, + haloId: { + source: 'audigent.com', + atype: 1 + }, + quantcastId: { + source: 'quantcast.com', + atype: 1 + }, + idx: { + source: 'idx.lat', + atype: 1 + }, + connectid: { + source: 'verizonmedia.com', + atype: 1 + }, + fabrickId: { + source: 'neustar.biz', + atype: 1 + }, + tapadId: { + source: 'tapad.com', + atype: 1 + } + }; + function s(e, t) { + var r = a[t]; + if (r && e) { + var n = {}; + n.source = r.source; + var o = i.isFn(r.getValue) ? r.getValue(e) : e; + if (i.isStr(o)) { + var s = { + id: o, + atype: r.atype + }; + if (i.isFn(r.getUidExt)) { + var u = r.getUidExt(e); + u && (s.ext = u); + } + if (n.uids = [s], i.isFn(r.getEidExt)) { + var c = r.getEidExt(e); + c && (n.ext = c); + } + return n; + } + } + return null; + } + }, + function (e, t, r) { + 'use strict'; + r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.pubCommonIdSubmodule = void 0, r(4), r(2), r(16), r(102), r(9); + var n = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== u(e) && 'function' != typeof e) { + return { default: e }; + } + var t = s(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), i = r(61), o = r(75), a = r(103); + function s() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return s = function () { + return e; + }, e; + } + function u(e) { + return (u = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var c = 'PublisherCommonId', d = (0, o.getStorageManager)(887, 'pubCommonId'); + function l(e, t) { + try { + if (t) { + var r = e.storage.name + '_sharedid', i = new Date(Date.now() + 86400000 * d.expires).toUTCString(); + 'cookie' === e.storage.type ? d.cookiesAreEnabled() && d.setCookie(r, t, i, 'LAX', m.domainOverride()) : 'html5' === e.storage.type && d.hasLocalStorage() && (d.setDataInLocalStorage(''.concat(r, '_exp'), i), d.setDataInLocalStorage(r, t)); + } + } catch (e) { + n.logError(e); + } + } + function f(e) { + try { + var t = e.storage.name + '_sharedid'; + if ('cookie' === e.storage.type) { + if (d.cookiesAreEnabled()) { + return d.getCookie(t); + } + } else if ('html5' === e.storage.type && d.hasLocalStorage()) { + var r = d.getDataFromLocalStorage(''.concat(t, '_exp')); + if (!r) { + return d.getDataFromLocalStorage(t); + } + if (new Date(r).getTime() - Date.now() > 0) { + return d.getDataFromLocalStorage(t); + } + } + } catch (e) { + n.logError(e); + } + } + function p(e, t, r) { + return { + success: function (i) { + if (i) { + try { + var o = JSON.parse(i); + n.logInfo('PubCommonId: Generated SharedId: ' + o.sharedId), o.sharedId && ('00000000000000000000000000' !== o.sharedId ? l(r, o.sharedId) : function (e) { + try { + var t = e.storage.name + '_sharedid'; + 'cookie' === e.storage.type ? d.cookiesAreEnabled() && d.setCookie(t, '', 'Thu, 01 Jan 1970 00:00:01 GMT') : 'html5' === e.storage.type && (d.removeDataFromLocalStorage(''.concat(t, '_exp')), d.removeDataFromLocalStorage(t)); + } catch (e) { + n.logError(e); + } + }(r)), t(e); + } catch (e) { + n.logError(e); + } + } + }, + error: function (e, t) { + n.logInfo('PubCommonId: failed to get sharedid'); + } + }; + } + function g(e, t, r, n) { + return function (i) { + 'function' == typeof t && t(), (0, a.ajax)(function (e) { + return e && 'boolean' == typeof e.gdprApplies && e.gdprApplies ? ''.concat('https://id.sharedid.org/id', '?gdpr=1&gdpr_consent=').concat(e.consentString) : 'https://id.sharedid.org/id'; + }(n), p(e, i, r), void 0, { + method: 'GET', + withCredentials: !0 + }); + }; + } + var m = { + name: 'pubCommonId', + gvlid: 887, + makeCallback: function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : ''; + if (e) { + var r = n.parseUrl(e); + r.search.id = encodeURIComponent('pubcid:' + t); + var i = n.buildUrl(r); + return function () { + n.triggerPixel(i); + }; + } + }, + decode: function (e, t) { + var r = { pubcid: e }, n = t.params, i = (n = void 0 === n ? {} : n).enableSharedId; + if (void 0 !== i && i) { + var o = f(t); + o && (r.sharedid = { id: o }); + } + return r; + }, + getId: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length > 1 ? arguments[1] : void 0, r = arguments.length > 2 ? arguments[2] : void 0, i = e.params, o = (i = void 0 === i ? {} : i).create, a = void 0 === o || o, s = i.pixelUrl, d = i.enableSharedId, l = void 0 !== d && d, f = r; + if (!f) { + try { + 'object' === u(window[c]) && (f = window[c].getId()); + } catch (e) { + } + f || (f = a && n.hasDeviceAccess() ? n.generateUUID() : void 0); + } + var p = this.makeCallback(s, f), m = l ? g(f, p, e, t) : p; + return { + id: f, + callback: m + }; + }, + extendId: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length > 2 ? arguments[2] : void 0, r = e.params, n = (r = void 0 === r ? {} : r).extend, i = void 0 !== n && n, o = r.pixelUrl, a = r.enableSharedId, s = void 0 !== a && a; + if (i) { + try { + if ('object' === u(window[c])) { + return void (s && l(e, f(e))); + } + } catch (e) { + } + if (o) { + var d = this.makeCallback(o, t); + return { callback: d }; + } + return s && l(e, f(e)), { id: t }; + } + }, + domainOverride: function () { + for (var e, t, r = document.domain.split('.'), n = '_gd'.concat(Date.now()), i = 0; i < r.length; i++) { + var o = r.slice(i).join('.'); + if (d.setCookie(n, '1', void 0, void 0, o), t = d.getCookie(n), d.setCookie(n, '', 'Thu, 01 Jan 1970 00:00:01 GMT', void 0, o), '1' !== t) { + return e; + } + e = o; + } + } + }; + t.pubCommonIdSubmodule = m, (0, i.submodule)('userId', m); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.prebidUserId = void 0, r(11), r(0), r(6), r(13), r(1), r(4), r(2), r(9); + var n = r(15), i = r(25), o = r(20), a = v(r(151)), s = r(73), u = v(r(364)), c = v(r(29)), d = v(r(34)), l = r(35), f = r(8), p = v(r(10)), g = v(r(120)), m = r(55); + function v(e) { + return e && e.__esModule ? e : { default: e }; + } + function b(e) { + return function (e) { + if (Array.isArray(e)) { + return y(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return y(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return y(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function y(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var h = p.default.MODULES, S = h.OPTANON, O = h.PREBID_USER_ID, _ = (0, f.logger)({ + name: 'userId', + textColor: '#FFF', + bgColor: '#EB5160' + }), E = function () { + var e = {}; + function t(t) { + t ? (_.logInfo('Applying User ID configs', e), r()) : (_.logInfo('Removing User ID configs', e), f()); + } + function r() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + if (t) { + var o = e[t]; + if (o.template && o.enabled) { + var d = (0, u.default)(JSON.stringify(o)), l = JSON.parse(d({ context: a.default })); + o = (0, c.default)({}, l, o); + } + var p = i(o); + if (o.enabled && p && (!0 === (0, n.getConfig)('consent') || void 0 === (0, n.getConfig)('consent'))) { + if (o.template) { + var v = (0, u.default)(JSON.stringify(o)), y = JSON.parse(v({ context: a.default })); + o = (0, c.default)({}, y, o); + } + if (o.trackChanges) { + var h = s.storage.getLocalStorage(''.concat(o.userSyncConfig.storage.name, '.meta')); + if ((0, g.default)(h, o.userSyncConfig)) { + h || s.storage.setLocalStorage(''.concat(o.userSyncConfig.storage.name, '.meta'), o.userSyncConfig); + } else { + var S = !o.shouldRefresh || (0, m.makeSafe)(function () { + return o.shouldRefresh(h, o.userSyncConfig); + }, _.logError, function () { + return !1; + }); + S && (_.logInfo('Identity config change detected. Refreshing user id for '.concat(t), o), f(t, !1), s.storage.setLocalStorage(''.concat(o.userSyncConfig.storage.name, '.meta'), o.userSyncConfig)); + } + } + var O = (0, n.getConfig)('prebid.pbjsConfig.userSync.userIds'), E = O ? O.filter(function (e) { + return e.name !== o.userSyncConfig.name; + }) : []; + _.logInfo('Updating User ID', o.userSyncConfig), (0, n.setConfig)('prebid.pbjsConfig.userSync.userIds', [].concat(b(E), [o.userSyncConfig])); + } else { + p || _.logInfo('User ID dependencies not met for User ID', t, o); + } + } else { + var I = e; + for (var w in I) { + Object.hasOwnProperty.call(I, w) && r(w); + } + } + } + function i(e) { + if (void 0 === e.dependencies) { + return !0; + } + if (Array.isArray(e.dependencies)) { + for (var t = 0; t < e.dependencies.length; t++) { + var r = e.dependencies[t]; + if (!r || '' === r || [ + 'undefined', + 'false' + ].indexOf(r) >= 0) { + return !1; + } + } + } else { + var n = e.dependencies; + if (!n || '' === n || [ + 'undefined', + 'false' + ].indexOf(n) >= 0) { + return !1; + } + } + return !0; + } + function f() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, r = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; + if (t) { + var i = e[t]; + if (i.template) { + var o = (0, u.default)(JSON.stringify(i)), l = JSON.parse(o({ context: a.default })); + i = (0, c.default)({}, l, i); + } + if ((0, d.default)(i, 'userSyncConfig.storage.name')) { + if ('cookie' === (0, d.default)(i, 'userSyncConfig.storage.type') ? s.storage.deleteCookie(i.userSyncConfig.storage.name) : 'html5' === (0, d.default)(i, 'userSyncConfig.storage.type') && s.storage.raw.deleteFromLs(i.userSyncConfig.storage.name), i.onRemove && i.onRemove.cookies) { + for (var p = 0; p < i.onRemove.cookies.length; p++) { + var g = i.onRemove.cookies[p]; + s.storage.deleteCookie(g); + } + } + if (i.onRemove && i.onRemove.localStorage) { + for (var m = 0; m < i.onRemove.localStorage.length; m++) { + var v = i.onRemove.localStorage[m]; + s.storage.raw.deleteFromLs(v); + } + } + s.storage.raw.deleteFromLs(''.concat(i.userSyncConfig.storage.name, '.meta')); + } + if (r) { + var b = (0, n.getConfig)('prebid.pbjsConfig.userSync.userIds'), y = b ? b.filter(function (e) { + return e.name !== i.userSyncConfig.name; + }) : []; + (0, n.setConfig)('prebid.pbjsConfig.userSync.userIds', y); + } + } else { + var h = e; + for (var S in h) { + Object.hasOwnProperty.call(h, S) && f(S); + } + } + } + return { + name: O, + register: function () { + (0, n.getConfig)('prebid.ids', function (t) { + e = (0, l.cloneDeep)(t); + }), function () { + var t = function (t) { + Object.hasOwnProperty.call(e, t) && (0, n.getConfig)('prebids.ids.'.concat(t, '.enabled'), function (e) { + e ? r(t) : f(t); + }); + }; + for (var i in e) { + t(i); + } + }(); + }, + initialize: function () { + o.eventEmitter.on('consentReady', t), o.eventEmitter.on('consentChanged', t); + var e = (0, n.getConfig)('consent'); + t(void 0 === e || e); + } + }; + }(), I = i.moduleManager.register(E, [S]); + t.prebidUserId = I; + }, + function (e, t, r) { + var n = r(365), i = r(366), o = r(367), a = r(369), s = r(370), u = r(222), c = r(187), d = r(116), l = r(223), f = r(371), p = r(224), g = /\b__p \+= '';/g, m = /\b(__p \+=) '' \+/g, v = /(__e\(.*?\)|\b__t\)) \+\n'';/g, b = /[()=,{}\[\]\/\s]/, y = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g, h = /($^)/, S = /['\n\r\u2028\u2029\\]/g, O = Object.prototype.hasOwnProperty; + e.exports = function (e, t, r) { + var _ = f.imports._.templateSettings || f; + r && c(e, t, r) && (t = void 0), e = p(e), t = n({}, t, _, a); + var E, I, w = n({}, t.imports, _.imports, a), A = d(w), T = o(w, A), x = 0, C = t.interpolate || h, P = '__p += \'', j = RegExp((t.escape || h).source + '|' + C.source + '|' + (C === l ? y : h).source + '|' + (t.evaluate || h).source + '|$', 'g'), R = O.call(t, 'sourceURL') ? '//# sourceURL=' + (t.sourceURL + '').replace(/\s/g, ' ') + '\n' : ''; + e.replace(j, function (t, r, n, i, o, a) { + return n || (n = i), P += e.slice(x, a).replace(S, s), r && (E = !0, P += '\' +\n__e(' + r + ') +\n\''), o && (I = !0, P += '\';\n' + o + ';\n__p += \''), n && (P += '\' +\n((__t = (' + n + ')) == null ? \'\' : __t) +\n\''), x = a + t.length, t; + }), P += '\';\n'; + var D = O.call(t, 'variable') && t.variable; + if (D) { + if (b.test(D)) { + throw new Error('Invalid `variable` option passed into `_.template`'); + } + } else { + P = 'with (obj) {\n' + P + '\n}\n'; + } + P = (I ? P.replace(g, '') : P).replace(m, '$1').replace(v, '$1;'), P = 'function(' + (D || 'obj') + ') {\n' + (D ? '' : 'obj || (obj = {});\n') + 'var __t, __p = \'\'' + (E ? ', __e = _.escape' : '') + (I ? ', __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, \'\') }\n' : ';\n') + P + 'return __p\n}'; + var k = i(function () { + return Function(A, R + 'return ' + P).apply(void 0, T); + }); + if (k.source = P, u(k)) { + throw k; + } + return k; + }; + }, + function (e, t, r) { + var n = r(82), i = r(186), o = r(93), a = i(function (e, t, r, i) { + n(t, o(t), e, i); + }); + e.exports = a; + }, + function (e, t, r) { + var n = r(138), i = r(139), o = r(222), a = i(function (e, t) { + try { + return n(e, void 0, t); + } catch (e) { + return o(e) ? e : new Error(e); + } + }); + e.exports = a; + }, + function (e, t, r) { + var n = r(368); + e.exports = function (e, t) { + return n(t, function (t) { + return e[t]; + }); + }; + }, + function (e, t) { + e.exports = function (e, t) { + for (var r = -1, n = null == e ? 0 : e.length, i = Array(n); ++r < n;) { + i[r] = t(e[r], r, e); + } + return i; + }; + }, + function (e, t, r) { + var n = r(113), i = Object.prototype, o = i.hasOwnProperty; + e.exports = function (e, t, r, a) { + return void 0 === e || n(e, i[r]) && !o.call(a, r) ? t : e; + }; + }, + function (e, t) { + var r = { + '\\': '\\', + '\'': '\'', + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + e.exports = function (e) { + return '\\' + r[e]; + }; + }, + function (e, t, r) { + var n = r(372), i = { + escape: r(375), + evaluate: r(376), + interpolate: r(223), + variable: '', + imports: { _: { escape: n } } + }; + e.exports = i; + }, + function (e, t, r) { + var n = r(373), i = r(224), o = /[&<>"']/g, a = RegExp(o.source); + e.exports = function (e) { + return (e = i(e)) && a.test(e) ? e.replace(o, n) : e; + }; + }, + function (e, t, r) { + var n = r(374)({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' + }); + e.exports = n; + }, + function (e, t) { + e.exports = function (e) { + return function (t) { + return null == e ? void 0 : e[t]; + }; + }; + }, + function (e, t) { + e.exports = /<%-([\s\S]+?)%>/g; + }, + function (e, t) { + e.exports = /<%([\s\S]+?)%>/g; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.enforceFeatures = void 0; + var n, i = r(25), o = r(35), a = r(72), s = r(8), u = r(44), c = (n = r(10)) && n.__esModule ? n : { default: n }; + var d = c.default.MODULES.BIDBARREL_FEATURES, l = c.default.QUERY_PARAMS.BID_SUPPRESS, f = (0, s.logger)({ + name: 'Feature Enforcement', + bgColor: '#FFF', + textColor: '#DA4167' + }), p = function () { + function e(e, t) { + t || e(t); + var r = t; + r.sizes = r.sizes.filter(function (e) { + var t = 'string' == typeof e ? e : e.join('x'); + return !a.features.get([ + 'sizeSuppress.'.concat(t), + 'sizeSuppress.'.concat(r.code, '.').concat(t) + ]); + }), a.features.get([ + 'adSuppress.'.concat(r.code), + 'adSuppress.all' + ]) ? f.atVerbosity(2).logInfo('Suppressing Ad', r) : e(r); + } + return { + bidRequest: function (e) { + for (var t = [], r = 0; r < e.length; r++) { + var n = e[r], i = (0, o.cloneDeep)(n); + i.bids = []; + for (var s = 0; s < n.bids.length; s++) { + var u = n.bids[s]; + a.features.get([ + ''.concat(l, '.').concat(u.bidder), + ''.concat(l, '.').concat(i.code, '.').concat(u.bidder), + ''.concat(l, '.').concat(i.code, '.all'), + ''.concat(l, '.all') + ]) ? f.atVerbosity(2).logInfo('Suppressing Bidder', u, n) : i.bids.push(u); + } + t.push(i); + } + return t; + }, + initialize: function () { + u.postProcessUnit.before(e); + }, + deregister: function () { + u.postProcessUnit.getHooks({ hook: e }).remove(); + }, + name: d + }; + }(), g = i.moduleManager.register(p); + t.enforceFeatures = g; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.ixIdentity = void 0; + var n, i = r(25); + var o = { + name: ((n = r(10)) && n.__esModule ? n : { default: n }).default.MODULES.IX_IDENTITY, + register: function () { + r(379); + } + }, a = i.moduleManager.register(o, null, { gate: 'consentGiven' }); + t.ixIdentity = a; + }, + function (module, exports, __webpack_require__) { + 'use strict'; + var require, require; + function _typeof(e) { + return (_typeof = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + __webpack_require__(4), __webpack_require__(2), __webpack_require__(124), __webpack_require__(9), __webpack_require__(40), __webpack_require__(11), __webpack_require__(43), __webpack_require__(16), __webpack_require__(1), __webpack_require__(3), __webpack_require__(0), __webpack_require__(5), function e(t, r, n) { + function i(a, s) { + if (!r[a]) { + if (!t[a]) { + if (!s && 'function' == typeof require && require) { + return require(a, !0); + } + if (o) { + return o(a, !0); + } + var u = new Error('Cannot find module \'' + a + '\''); + throw u.code = 'MODULE_NOT_FOUND', u; + } + var c = r[a] = { exports: {} }; + t[a][0].call(c.exports, function (e) { + return i(t[a][1][e] || e); + }, c, c.exports, e, t, r, n); + } + return r[a].exports; + } + for (var o = 'function' == typeof require && require, a = 0; a < n.length; a++) { + i(n[a]); + } + return i; + }({ + 1: [ + function (e, t, r) { + var n, i = e(5), o = e(2), a = e(10), s = e(28), u = e(14), c = e(18), d = { + AdserverOrgIp: e(17), + MerkleIp: e(21), + LiveRampIp: e(20), + LiveIntentIp: e(19) + }; + t.exports = function (e) { + function t(e, t) { + return b[e] = y.IN_PROGRESS, new a(function (r) { + t.instance.retrieve().then(function () { + b[e] = y.COMPLETE, r(); + }).catch(function (t) { + b[e] = y.COMPLETE, r(); + }); + }); + } + function r() { + for (var e = [], r = a.defer(), i = Object.keys(m); i.length;) { + var o = u.randomSplice(i), s = m[o]; + if (s.enabled) { + try { + e.push(t(o, s)); + } catch (e) { + } + } + } + return a.all(e).then(function () { + n.emit('rti_partner_request_complete', { requestsCompleted: e.length }), r.resolve(); + }), r; + } + function l() { + for (var e in b) { + b.hasOwnProperty(e) && b[e] !== y.COMPLETE && n.emit('hs_identity_timeout', { statsId: m[e].instance.getStatsId() }); + } + } + function f() { + var e = {}; + for (var t in (h || (h = !0, l()), m)) { + if (m.hasOwnProperty(t)) { + var r = m[t]; + if (r.enabled) { + var n = r.instance.getResults(); + b[t] === y.COMPLETE ? (e[t] = n ? { data: n } : { data: {} }, e[t].responsePending = !1) : e[t] = { + data: {}, + responsePending: !0 + }; + } + } + } + return e; + } + function p() { + v === y.NOT_STARTED && (r(), v = y.IN_PROGRESS); + } + var g, m, v, b, y = { + NOT_STARTED: 0, + IN_PROGRESS: 1, + COMPLETE: 2 + }, h = !1; + return function () { + n = s.services.EventsService, s.services.TimerService, g = o(), v = y.NOT_STARTED, b = {}, m = e.partners; + for (var t = Object.keys(m), i = t.length - 1; i >= 0; i--) { + var a = u.randomSplice(t), l = m[a]; + if (l.enabled) { + try { + var h = d[a]; + if (u.isObject(h) ? l.instance = c(h, l.configs) : l.instance = h(l.configs), !l.instance) { + l.enabled = !1; + continue; + } + b[a] = y.NOT_STARTED; + } catch (e) { + l.enabled = !1; + } + } + } + g._setDirectInterface('IdentityLayer', { + retrieve: p, + getAllPartnerResults: f, + invokeAllPartners: r + }); + }(), i.derive(g, { retrieve: p }); + }; + }, + {} + ], + 2: [ + function (e, t, r) { + var n = e(10); + e(15), t.exports = function () { + function e(e, t) { + return n.resolve(t); + } + var t, r, i; + return t = null, r = e, i = e, { + _setDirectInterface: function (e, r) { + (t = {})[e] = r; + }, + _setExecutor: function (e) { + r = e; + }, + _executeNext: function (e, t) { + return i(e, t); + }, + setNext: function (e) { + i = e; + }, + getDirectInterface: function () { + return t; + }, + execute: function (e, t) { + return n.resolve().then(function () { + return r(e, t); + }); + } + }; + }; + }, + {} + ], + 3: [ + function (e, t, r) { + e(15), t.exports = function () { + function e() { + try { + return window.top === window.self; + } catch (e) { + return !1; + } + } + function t(e, t, r, n) { + try { + for (var i, o = window, a = 0;;) { + if (!(r && a < r)) { + if (n && a > n) { + break; + } + if (e && (i = e(o))) { + return i; + } + var s; + try { + s = o.frameElement; + } catch (e) { + s = null; + } + if (null === s) { + if (t && (i = t(o))) { + return i; + } + break; + } + o = o.parent, a++; + } + } + } catch (e) { + } + return null; + } + var r; + return { + topWindow: r = t(null, function (e) { + return e; + }), + getProtocol: function (e, t) { + return e = e || 'http:', t = t || 'https:', 'https:' === document.location.protocol ? t : e; + }, + isLocalStorageSupported: function () { + const $___old_f73bcaa537c6d6cc = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_f73bcaa537c6d6cc) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + try { + return localStorage.setItem('test', 'test'), localStorage.removeItem('test'), !0; + } catch (e) { + return !1; + } + }.apply(this, arguments); + } finally { + if ($___old_f73bcaa537c6d6cc) + ({}.constructor.defineProperty(window, 'localStorage', $___old_f73bcaa537c6d6cc)); + } + }, + getViewportWidth: function () { + return ('CSS1Compat' === r.document.compatMode ? r.document.documentElement : r.document.body).clientWidth; + }, + getViewportHeight: function () { + return ('CSS1Compat' === r.document.compatMode ? r.document.documentElement : r.document.body).clientHeight; + }, + isTopFrame: e, + getScreenWidth: function () { + return r.screen.width; + }, + getScreenHeight: function () { + return r.screen.height; + }, + getReferrer: function () { + return document.referrer; + }, + getPageUrl: function () { + return e() ? location.href : document.referrer || location.href; + }, + getHostname: function () { + return r.location.hostname; + }, + getUserAgent: function () { + return navigator.userAgent; + }, + getLanguage: function () { + return navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage; + }, + getPathname: function () { + return r.location.pathname; + }, + getNearestEntity: function (e) { + return t(function (t) { + return t.hasOwnProperty(e) ? t[e] : null; + }); + }, + traverseContextTree: t, + createHiddenIFrame: function (e, t) { + var n = t || r, i = n.document.createElement('iframe'); + return e && (i.src = e), i.width = 0, i.height = 0, i.scrolling = 'no', i.marginWidth = 0, i.marginHeight = 0, i.frameBorder = 0, i.setAttribute('style', 'border: 0px; vertical-align: bottom; visibility: hidden; display: none;'), n.document.body.appendChild(i), i; + }, + readCookie: function (e) { + var t = e + '=', n = r.document.cookie.split(';'); + for (var i in n) { + if (n.hasOwnProperty(i)) { + for (var o = n[i]; ' ' === o.charAt(0);) { + o = o.substring(1, o.length); + } + if (0 === o.indexOf(t)) { + return o.substring(t.length, o.length); + } + } + } + return null; + }, + isFlashSupported: function () { + var e = !1; + try { + new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash') && (e = !0); + } catch (t) { + navigator.mimeTypes && void 0 !== navigator.mimeTypes['application/x-shockwave-flash'] && navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin && (e = !0); + } + return e; + } + }; + }(); + }, + {} + ], + 4: [ + function (e, t, r) { + var n = e(3), i = e(14), o = e(13); + t.exports = function () { + function e(e) { + if (!r) { + return !1; + } + try { + localStorage.removeItem(a + e); + } catch (e) { + return !1; + } + return !0; + } + function t(t) { + const $___old_00a8010fbeb9132d = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_00a8010fbeb9132d) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + if (!r) { + return null; + } + var n; + try { + n = JSON.parse(localStorage.getItem(a + t)); + } catch (e) { + return null; + } + return null === n ? null : !n.e || n.e < o.now() ? (e(t), null) : i.isObject(n.d) ? { + data: n.d, + created: n.t, + expires: n.e + } : null; + }.apply(this, arguments); + } finally { + if ($___old_00a8010fbeb9132d) + ({}.constructor.defineProperty(window, 'localStorage', $___old_00a8010fbeb9132d)); + } + } + var r, a = 'IXWRAPPER', s = 604800000; + return r = n.isLocalStorageSupported(), { + deleteData: e, + getEntry: t, + getData: function (e) { + var r = t(e); + return r && r.data; + }, + setData: function (e, t, n) { + if (!r) { + return !1; + } + n > s && (n = s); + var i = o.now(), u = { + t: i, + d: t, + e: i + n + }; + try { + localStorage.setItem(a + e, JSON.stringify(u)); + } catch (e) { + return !1; + } + return !0; + } + }; + }(); + }, + {} + ], + 5: [ + function (e, t, r) { + e(15), t.exports = { + derive: function (e, t) { + var r, n = {}; + for (r in e) { + e.hasOwnProperty(r) && (n[r] = e[r]); + } + for (r in t) { + t.hasOwnProperty(r) && (n[r] = t[r]); + } + return function (e) { + for (var t in e) { + e.hasOwnProperty(t) && '_' === t[0] && '__' !== t.slice(0, 2) && delete e[t]; + } + return e; + }(n); + } + }; + }, + {} + ], + 6: [ + function (e, t, r) { + var n = e(14); + t.exports = function (e) { + return function () { + if (n.isArray(e)) { + for (var t = 0; t < e.length; t++) { + try { + e[t](); + } catch (e) { + } + } + } + }(), { + push: function (e) { + if (n.isFunction(e)) { + try { + e(); + } catch (e) { + } + } + } + }; + }; + }, + {} + ], + 7: [ + function (e, t, r) { + t.exports = { + DEFAULT_UID_LENGTH: 8, + MIN_BANNER_DIMENSION: 1, + MIN_BID_FLOOR: 0, + MIN_SITE_ID: 0, + DEFAULT_UID_CHARSET: 'ALPHANUM', + SESSION_ID_LENGTH: 8, + PUBKIT_AD_ID_LENGTH: 16, + RENDER_SERVICE_EXPIRY_SWEEP_TIMER: 30000, + DEFAULT_PARTNER_PRIORITY: 1, + LineItemTypes: { + ID_AND_SIZE: 1, + ID_AND_PRICE: 2, + CUSTOM: 3 + }, + DeviceTypeMethods: { + USER_AGENT: 1, + REFERENCE: 2, + SIZE_MAPPING: 3 + }, + RequestArchitectures: { + MRA: 1, + SRA: 2 + }, + InitialLoadStates: { + DISABLED: 1, + ENABLED: 2 + }, + MediationLevels: { + NONE: 1, + HT_SLOT: 2, + PARTNER: 3 + } + }; + }, + {} + ], + 8: [ + function (e, t, r) { + function n(e) { + function t() { + return s.mobile() ? n.DeviceTypes.MOBILE : (s.tablet(), n.DeviceTypes.DESKTOP); + } + function r() { + var t; + try { + t = eval(e.configs.reference); + } catch (e) { + throw a('INTERNAL_ERROR', 'DeviceTypeChecker: could not eval() `reference`.'); + } + if (!o.isFunction(t)) { + if (o.isString(t)) { + return t; + } + throw a('INVALID_TYPE', 'DeviceTypeChecker: `reference` must refer to a function or a string'); + } + try { + return t(); + } catch (e) { + throw a('INTERNAL_ERROR', 'DeviceTypeChecker: could not execute `reference` function.'); + } + } + function u() { + switch (c) { + case i.DeviceTypeMethods.USER_AGENT: + return t(); + case i.DeviceTypeMethods.REFERENCE: + return r(); + default: + return t(); + } + } + var c; + return c = i.DeviceTypeMethods[e.method] || i.DeviceTypeMethods.USER_AGENT, { getDeviceType: u }; + } + var i = e(7), o = e(14), a = e(15), s = e(9); + n.isValidDeviceType = function (e) { + for (var t in n.DeviceTypes) { + if (n.DeviceTypes.hasOwnProperty(t) && 'TABLET' !== t && e === n.DeviceTypes[t]) { + return !0; + } + } + return !1; + }, n.DeviceTypes = { + DESKTOP: 'desktop', + MOBILE: 'mobile', + TABLET: 'tablet' + }, t.exports = n; + }, + {} + ], + 9: [ + function (e, t, r) { + var n, i, o; + n = {}, o = window.navigator.userAgent.toLowerCase(), n.ios = function () { + return n.iphone() || n.ipod() || n.ipad(); + }, n.iphone = function () { + return !n.windows() && i('iphone'); + }, n.ipod = function () { + return i('ipod'); + }, n.ipad = function () { + return i('ipad'); + }, n.android = function () { + return !n.windows() && i('android'); + }, n.androidPhone = function () { + return n.android() && i('mobile'); + }, n.androidTablet = function () { + return n.android() && !i('mobile'); + }, n.blackberry = function () { + return i('blackberry') || i('bb10') || i('rim'); + }, n.blackberryPhone = function () { + return n.blackberry() && !i('tablet'); + }, n.blackberryTablet = function () { + return n.blackberry() && i('tablet'); + }, n.windows = function () { + return i('windows'); + }, n.windowsPhone = function () { + return n.windows() && i('phone'); + }, n.windowsTablet = function () { + return n.windows() && i('touch') && !n.windowsPhone(); + }, n.fxos = function () { + return (i('(mobile;') || i('(tablet;')) && i('; rv:'); + }, n.fxosPhone = function () { + return n.fxos() && i('mobile'); + }, n.fxosTablet = function () { + return n.fxos() && i('tablet'); + }, n.meego = function () { + return i('meego'); + }, n.mobile = function () { + return n.androidPhone() || n.iphone() || n.ipod() || n.windowsPhone() || n.blackberryPhone() || n.fxosPhone() || n.meego(); + }, n.tablet = function () { + return n.ipad() || n.androidTablet() || n.blackberryTablet() || n.windowsTablet() || n.fxosTablet(); + }, n.desktop = function () { + return !n.tablet() && !n.mobile(); + }, i = function (e) { + return -1 !== o.indexOf(e); + }, t.exports = n; + }, + {} + ], + 10: [ + function (e, t, r) { + function n() { + } + function i(e) { + if ('object' != _typeof(this)) { + throw new TypeError('Promises must be constructed via new'); + } + if ('function' != typeof e) { + throw new TypeError('not a function'); + } + this._state = 0, this._handled = !1, this._value = void 0, this._deferreds = [], d(e, this); + } + function o(e, t) { + for (; 3 === e._state;) { + e = e._value; + } + if (0 !== e._state) { + e._handled = !0; + var r = 1 === e._state ? t.onFulfilled : t.onRejected; + if (null !== r) { + var n; + try { + n = r(e._value); + } catch (e) { + return void s(t.promise, e); + } + a(t.promise, n); + } else { + (1 === e._state ? a : s)(t.promise, e._value); + } + } else { + e._deferreds.push(t); + } + } + function a(e, t) { + try { + if (t === e) { + throw new TypeError('A promise cannot be resolved with itself.'); + } + if (t && ('object' == _typeof(t) || 'function' == typeof t)) { + var r = t.then; + if (t instanceof i) { + return e._state = 3, e._value = t, void u(e); + } + if ('function' == typeof r) { + return void d(bind(r, t), e); + } + } + e._state = 1, e._value = t, u(e); + } catch (t) { + s(e, t); + } + } + function s(e, t) { + e._state = 2, e._value = t, u(e); + } + function u(e) { + for (var t = 0, r = e._deferreds.length; t < r; t++) { + o(e, e._deferreds[t]); + } + e._deferreds = null; + } + function c(e, t, r) { + this.onFulfilled = 'function' == typeof e ? e : null, this.onRejected = 'function' == typeof t ? t : null, this.promise = r; + } + function d(e, t) { + var r = !1; + try { + e(function (e) { + r || (r = !0, a(t, e)); + }, function (e) { + r || (r = !0, s(t, e)); + }); + } catch (e) { + if (r) { + return; + } + r = !0, s(t, e); + } + } + i.prototype.catch = function (e) { + return this.then(null, e); + }, i.prototype.then = function (e, t) { + var r = new this.constructor(n); + return o(this, new c(e, t, r)), r; + }, i.all = function (e) { + var t = Array.prototype.slice.call(e); + return new i(function (e, r) { + function n(o, a) { + try { + if (a && ('object' == _typeof(a) || 'function' == typeof a)) { + var s = a.then; + if ('function' == typeof s) { + return void s.call(a, function (e) { + n(o, e); + }, r); + } + } + t[o] = a, 0 == --i && e(t); + } catch (e) { + r(e); + } + } + if (0 === t.length) { + return e([]); + } + for (var i = t.length, o = 0; o < t.length; o++) { + n(o, t[o]); + } + }); + }, i.resolve = function (e) { + return e && 'object' == _typeof(e) && e.constructor === i ? e : new i(function (t) { + t(e); + }); + }, i.reject = function (e) { + return new i(function (t, r) { + r(e); + }); + }, i.defer = function () { + var e = {}; + return e.promise = new i(function (t, r) { + e.resolve = t, e.reject = r; + }), e; + }, t.exports = i; + }, + {} + ], + 11: [ + function (e, t, r) { + t.exports = function (e) { + e = e.toLowerCase(); + var t = /(edge)\/([\w.]+)/.exec(e) || /(opr)[\/]([\w.]+)/.exec(e) || /(chrome)[ \/]([\w.]+)/.exec(e) || /(iemobile)[\/]([\w.]+)/.exec(e) || /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+)/.exec(e) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e) || /(msie) ([\w.]+)/.exec(e) || e.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(e) || e.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e) || [], r = {}, n = { + browser: t[5] || t[3] || t[1] || '', + version: t[2] || t[4] || '0', + versionNumber: t[4] || t[2] || '0' + }; + return n.browser && (r[n.browser] = !0, r.version = n.version, r.versionNumber = parseInt(n.versionNumber, 10)), (r.rv || r.iemobile) && (n.browser = 'msie', r.msie = !0), r.edge && (delete r.edge, n.browser = 'msedge', r.msedge = !0), r.opr && (n.browser = 'opera', r.opera = !0), r.safari && r.android && (n.browser = 'android', r.android = !0), r.safari && r.kindle && (n.browser = 'kindle', r.kindle = !0), r.safari && r.silk && (n.browser = 'silk', r.silk = !0), r.name = n.browser, r; + }(window.navigator.userAgent); + }, + {} + ], + 12: [ + function (e, t, r) { + var n = e(28), i = e(13), o = e(14), a = e(15), s = e(11); + t.exports = function () { + const $___old_c438b6d0ad49bc37 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_c438b6d0ad49bc37) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_6bf28fdad6c63137.XMLHttpRequest)); + return function () { + function e() { + return c; + } + function t(e) { + var t = ''; + for (var r in e) { + if (e.hasOwnProperty(r)) { + if (o.isObject(e[r])) { + for (var n in e[r]) { + e[r].hasOwnProperty(n) && (t += r + '%5B' + n + '%5D=' + encodeURIComponent(e[r][n]) + '&'); + } + } else if (o.isArray(e[r])) { + for (var i = 0; i < e[r].length; i++) { + t += r + '%5B%5D=' + encodeURIComponent(e[r][i]) + '&'; + } + } else { + t += r + '=' + encodeURIComponent(e[r]) + '&'; + } + } + } + return t.slice(0, -1); + } + function r(e, r, n) { + return '/' !== e[e.length - 1] && r && (e += '/'), r = r || [], o.isObject(n) && (n = t(n)), n = n ? '?' + n : '', e + r.join('/') + n; + } + function u(e) { + var a, u, c = e.scope || window; + if (e.useImgTag) { + a = c.document.createElement('img'); + } else { + (a = c.document.createElement('script')).type = 'text/javascript'; + var d = !0; + e.hasOwnProperty('async') && (d = e.async), a.async = d; + } + var l, f = e.url; + e.data && (l = o.isString(e.data) ? e.data : t(e.data), f = r(e.url, null, l)); + var p, g = !1, m = function () { + try { + if (g) { + return; + } + g = !0, e.onTimeout && e.onTimeout(), e.useImgTag || e.continueAfterTimeout || a.parentNode.removeChild(a); + } catch (e) { + } + }; + e.globalTimeout && n.services.TimerService.addTimerCallback(e.sessionId, m), e.timeout && (p = setTimeout(m, e.timeout)); + var v = function () { + try { + if (g) { + if (!e.continueAfterTimeout) { + return; + } + } else { + clearTimeout(p); + } + e.onSuccess && e.onSuccess(null, i.now(), g), g = !0, e.useImgTag || a.parentNode.removeChild(a); + } catch (e) { + } + }; + null === a.onload ? a.onload = v : a.onreadystatechange = function () { + 'loaded' !== a.readyState && 'complete' !== a.readyState || (a.onreadystatechange = null, v()); + }; + if (a.onerror = function () { + try { + if (g) { + if (!e.continueAfterTimeout) { + return; + } + } else { + clearTimeout(p), g = !0; + } + e.onFailure && e.onFailure(), e.useImgTag || a.parentNode.removeChild(a); + } catch (e) { + } + }, u = i.now(), a.src = f, !e.useImgTag) { + var b = c.document.getElementsByTagName('script')[0]; + b ? b.parentNode.insertBefore(a, b) : s.msie || s.msedge || s.mozilla ? c.onload = function () { + c.document.body.appendChild(a); + } : c.document.body.appendChild(a); + } + return u; + } + var c; + return c = window.XMLHttpRequest && 'string' == typeof new XMLHttpRequest().responseType, { + ajax: function (s) { + const $___old_3bb2e73a69cb396a = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_3bb2e73a69cb396a) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_6bf28fdad6c63137.XMLHttpRequest)); + return function () { + if (!e()) { + if (s.jsonp && 'GET' === s.method) { + return u(s); + } + throw a('INTERNAL_ERROR', 'XHR is not supported in this browser.'); + } + var c, d = new (s.scope || window).XMLHttpRequest(), l = s.url, f = null; + if (s.data) { + if ('GET' === s.method) { + var p; + p = o.isString(s.data) ? s.data : t(s.data), l = r(s.url, null, p); + } else { + 'POST' === s.method && (f = o.isString(s.data) ? s.data : JSON.stringify(s.data)); + } + } + var g = !0; + s.hasOwnProperty('async') && (g = s.async), d.open(s.method, l, g); + var m = 'application/x-www-form-urlencoded; charset=UTF-8'; + if (void 0 !== s.contentType && (m = s.contentType), m && d.setRequestHeader('Content-Type', m), s.headers) { + for (var v in (s.headers.hasOwnProperty('X-Request-With') || d.setRequestHeader('X-Request-With', 'XMLHttpRequest'), s.headers)) { + s.headers.hasOwnProperty(v) && d.setRequestHeader(v, s.headers[v]); + } + } + s.withCredentials && (d.withCredentials = !0); + var b, y = !1, h = function () { + try { + if (y) { + return; + } + y = !0, s.onTimeout && s.onTimeout(); + } catch (e) { + } + }; + return s.globalTimeout && n.services.TimerService.addTimerCallback(s.sessionId, h), s.timeout && (s.continueAfterTimeout ? b = setTimeout(h, s.timeout) : (d.timeout = s.timeout, d.ontimeout = h)), (s.onSuccess || s.onFailure) && (d.onreadystatechange = function () { + if (4 === d.readyState) { + if (y) { + if (!s.continueAfterTimeout) { + return; + } + } else { + clearTimeout(b), d.ontimeout = null; + } + if (200 === d.status) { + if (s.onSuccess) { + try { + s.onSuccess(d.responseText, i.now(), y); + } catch (e) { + } + } + } else if (s.onFailure) { + try { + s.onFailure(d.status); + } catch (e) { + } + } + y = !0; + } + }), c = i.now(), d.send(f), c; + }.apply(this, arguments); + } finally { + if ($___old_3bb2e73a69cb396a) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_3bb2e73a69cb396a)); + } + }, + jsonp: u, + img: function (e) { + return e.useImgTag = !0, u(e); + }, + buildUrl: r, + objToQueryString: t, + isXhrSupported: e + }; + }.apply(this, arguments); + } finally { + if ($___old_c438b6d0ad49bc37) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_c438b6d0ad49bc37)); + } + }(); + }, + {} + ], + 13: [ + function (e, t, r) { + var n = e(7); + e(15), t.exports = function () { + function e(e, t) { + e = e || n.DEFAULT_UID_LENGTH, t = t || n.DEFAULT_UID_CHARSET; + for (var i = '', o = 0; o < e; o++) { + i += r[t].charAt(Math.floor(Math.random() * r[t].length)); + } + return i; + } + var t, r = { + ALPHANUM: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + ALPHA: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', + ALPHA_UPPER: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', + ALPHA_LOWER: 'abcdefghijklmnopqrstuvwxyz', + HEX: '0123456789abcdef', + NUM: '0123456789' + }; + return t = new Date(), { + UidCharacterSets: r, + generateUniqueId: e, + generateUuid: function () { + return e(8, 'HEX') + '-' + e(4, 'HEX') + '-4' + e(3, 'HEX') + '-' + '89ab'.charAt(Math.floor(4 * Math.random())) + e(3, 'HEX') + '-' + e(8, 'HEX'); + }, + now: function () { + return new Date().getTime(); + }, + getTimezoneOffset: function () { + return t.getTimezoneOffset(); + }, + documentWrite: function (e, t) { + e.open('text/html', 'replace'), e.write(t), e.close(); + }, + noOp: function () { + } + }; + }(); + }, + {} + ], + 14: [ + function (e, t, r) { + var n = e(15); + t.exports = function () { + function e(e) { + return void 0 === e ? 'undefined' : {}.toString.call(e).match(s)[1].toLowerCase(); + } + function t(t) { + return 'string' === e(t); + } + function r(t) { + return 'number' === e(t) && !isNaN(t); + } + function i(t) { + return 'object' === e(t); + } + function o(r, i, o) { + if ('array' !== e(r)) { + return !1; + } + if (void 0 !== i) { + if (!t(i)) { + throw n('INVALID_TYPE', '`type` must be a string'); + } + if ('class' === i) { + if (!t(o)) { + throw n('INVALID_TYPE', '`className` must be a string'); + } + for (var a = 0; a < r.length; a++) { + if ('object' != _typeof(r[a]) || r[a].__type__ !== o) { + return !1; + } + } + } else { + for (var s = 0; s < r.length; s++) { + if (e(r[s]) !== i) { + return !1; + } + } + } + } + return !0; + } + function a(e, t) { + var r = '' + e; + if ((t = +t) != t && (t = 0), t < 0) { + throw new RangeError('repeat count must be non-negative'); + } + if (t == 1 / 0) { + throw new RangeError('repeat count must be less than infinity'); + } + if (t = Math.floor(t), 0 == r.length || 0 == t) { + return ''; + } + if (r.length * t >= 1 << 28) { + throw new RangeError('repeat count must not overflow maximum string size'); + } + for (var n = '', i = 0; i < t; i++) { + n += r; + } + return n; + } + var s = /\s([a-zA-Z]+)/, u = function (e, t) { + return e === t; + }; + return { + randomSplice: function (e) { + return e.length ? e.splice(Math.floor(Math.random() * e.length), 1)[0] : null; + }, + shuffle: function (e) { + var t, r, n; + for (n = e.length - 1; n > 0; n--) { + t = Math.floor(Math.random() * (n + 1)), r = e[n], e[n] = e[t], e[t] = r; + } + return e; + }, + deepCopy: function (e) { + return JSON.parse(JSON.stringify(e)); + }, + mergeObjects: function () { + for (var e = Array.prototype.slice.call(arguments), t = {}, r = 0; r < e.length; r++) { + for (var n in e[r]) { + e[r].hasOwnProperty(n) && (t[n] = e[r][n]); + } + } + return t; + }, + mergeArrays: function () { + for (var e = Array.prototype.slice.call(arguments), t = [], r = 0; r < e.length; r++) { + for (var n = 0; n < e[r].length; n++) { + t.push(e[r][n]); + } + } + return t; + }, + isArray: o, + isEmpty: function (e) { + if (t(e)) { + if ('' !== e) { + return !1; + } + } else if (i(e)) { + for (var r in e) { + if (e.hasOwnProperty(r)) { + return !1; + } + } + } else { + if (!o(e)) { + throw n('INVALID_TYPE', '`entity` must be either a string, object, or an array'); + } + if (e.length) { + return !1; + } + } + return !0; + }, + isInteger: function (e) { + return r(e) && e % 1 == 0; + }, + isString: t, + isNumeric: function (t) { + return 'number' === e(t) || 'string' === e(t) && !isNaN(Number(t)); + }, + isRegex: function (t) { + return 'regexp' === e(t); + }, + isNumber: r, + isBoolean: function (t) { + return 'boolean' === e(t); + }, + isFunction: function (t) { + return 'function' === e(t); + }, + isObject: i, + isArraySubset: function (e, t, r) { + void 0 === r && (r = u); + for (var n = 0; n < e.length; n++) { + for (var i = !1, o = 0; o < t.length && !(i = r(e[n], t[o])); o++) { + } + if (!i) { + return !1; + } + } + return !0; + }, + getType: e, + tryCatchWrapper: function (e, t, r, n) { + return t = t || [], n = n || null, r = r || 'Error occurred while calling function.', function () { + try { + e.apply(n, t); + } catch (e) { + } + }; + }, + arrayDelete: function (e, t) { + var r = e.indexOf(t); + r > -1 && e.splice(r, 1); + }, + repeatString: a, + padStart: function (e, t, r) { + return t >>= 0, r = String(r || ' '), e.length > t ? String(e) : ((t -= e.length) > r.length && (r += a(r, t / r.length)), r.slice(0, t) + String(e)); + }, + padEnd: function (e, t, r) { + return t >>= 0, r = String(r || ' '), e.length > t ? String(e) : ((t -= e.length) > r.length && (r += a(r, t / r.length)), String(e) + r.slice(0, t)); + }, + evalVariable: function (e, t) { + t = t || null; + try { + return eval.call(t, e); + } catch (e) { + } + return null; + }, + evalFunction: function (e, t, r) { + r = r || null; + try { + return eval.call(r, e + '(' + t.join() + ')'); + } catch (e) { + } + return null; + }, + appendToArray: function () { + for (var e = Array.prototype.slice.call(arguments), t = e[0], r = 1; r < e.length; r++) { + Array.prototype.push.apply(t, e[r]); + } + return t; + }, + appendToObject: function () { + for (var e = Array.prototype.slice.call(arguments), t = e[0], r = 1; r < e.length; r++) { + var n = e[r]; + for (var i in n) { + n.hasOwnProperty(i) && (t[i] = n[i]); + } + } + return t; + } + }; + }(); + }, + {} + ], + 15: [ + function (e, t, r) { + function n(e, t) { + return new Error(e + ': ' + t); + } + n.ErrorTokens = { + MISSING_ARGUMENT: 1, + INVALID_TYPE: 2, + INVALID_VALUE: 3, + MISSING_PROPERTY: 4, + NUMBER_OUT_OF_RANGE: 5, + EMPTY_ENTITY: 6, + INTERNAL_ERROR: 7, + DUPLICATE_ENTITY: 8, + INVALID_ARGUMENT: 9, + INVALID_CONFIG: 10 + }, t.exports = n; + }, + {} + ], + 16: [ + function (e, t, r) { + var n = e(8), i = e(28), o = e(14), a = (e(15), [ + { + name: 'EventsService', + constructor: e(22) + }, + { + name: 'GptService', + constructor: e(24) + }, + { + name: 'PublisherSonarService', + constructor: e(25) + }, + { + name: 'TimerService', + constructor: e(26) + }, + { + name: 'ComplianceService', + constructor: e(23) + } + ]), s = { IdentityLayer: e(1) }; + t.exports = function (e) { + var t; + return function () { + i.DeviceTypeChecker = n(e.DeviceTypeChecker), t = { + Services: {}, + Layers: {} + }; + for (var r = 0; r < a.length; r++) { + var u = a[r].name, c = a[r].constructor(e.Services[u]); + c && (i.services[u] = c, c.getDirectInterface && c.getDirectInterface() && (t.Services = o.mergeObjects(t.Services, c.getDirectInterface()))); + } + for (var d, l = e.Layers.length - 1; l >= 0; l--) { + var f = e.Layers[l].layerId, p = s[f](e.Layers[l].configs); + p.getDirectInterface() && (t.Layers = o.mergeObjects(t.Layers, p.getDirectInterface())), d && p.setNext(d.execute), d = p; + } + }(), { + getDirectInterface: function () { + return t; + } + }; + }; + }, + {} + ], + 17: [ + function (e, t, r) { + function n() { + var e = { + ttd_pid: a, + fmt: s, + p: i.configs.publisherId + }, t = i.Utilities.getConsent('gdpr'); + t && (1 == t.applies ? e.gdpr = 1 : 0 == t.applies && (e.gdpr = 0), t.consentString && (e.gdpr_consent = t.consentString)), i.Utilities.ajax({ + url: i.Utilities.getProtocol() + o, + method: 'GET', + data: e, + onSuccess: function (e) { + try { + var t = JSON.parse(e); + if (!t.TDID) { + return void i.registerError('response does not contain TDID'); + } + var r = []; + for (var n in t) { + t.hasOwnProperty(n) && r.push({ + id: t[n], + ext: { rtiPartner: n } + }); + } + i.registerMatch({ + source: u.source, + uids: r + }); + } catch (e) { + i.registerError('response is not valid JSON'); + } + }, + onFailure: function (e) { + i.registerError('API returned error response ' + e); + } + }); + } + var i, o = '//match.adsrvr.org/track/rid', a = 'casale', s = 'json', u = { + partnerId: 'AdserverOrgIp', + statsId: 'ADSORG', + version: '1.3.0', + source: 'adserver.org', + cacheExpiry: { + match: 604800000, + pass: 86400000, + error: 86400000 + }, + targetingKeys: { exchangeBidding: 'ixpid_1' } + }; + t.exports = { + type: 'identity', + api: '1', + main: function (e) { + (i = e).onRetrieve(n); + }, + profile: u + }; + }, + {} + ], + 18: [ + function (e, t, r) { + var n, i, o, a = e(3), s = e(4), u = e(12), c = e(10), d = e(28), l = e(13), f = e(14); + t.exports = function (e, t) { + function r(e, t) { + var r = { + match: 'hs_identity_response', + pass: 'hs_identity_pass', + error: 'hs_identity_error' + }[e]; + i.emit(r, { statsId: E }), i.emit('ip_module_result_' + _, e, t), 'match' === e && (w = t); + } + function p(e, t) { + if (!P) { + if (P = !0, O.cacheExpiry) { + var n = { + response: e, + version: O.version + }; + 'pass' !== e && (n.data = t), Object.keys(T).length && (n.consent = T); + var i = O.cacheExpiry[e]; + s.setData(C, n, i); + } + r(e, t), x && x(); + } + } + function g(e) { + if (!n.isPrivacyEnabled()) { + return null; + } + if ('gdpr' === e) { + var t = n.gdpr.getConsent(); + return t && t.consentString && (T.gdpr = !0), t; + } + return null; + } + function m(e) { + var t = s.getData(e); + return t && 'match' === t.response && t.data ? t.data : null; + } + function v(e) { + var t = { + url: e.url, + method: e.method, + async: !0, + withCredentials: !0, + jsonp: !1, + continueAfterTimeout: !1, + timeout: e.timeout || 0 + }; + return e.onSuccess && (t.onSuccess = e.onSuccess), e.onTimeout && (t.onTimeout = e.onTimeout), e.onFailure && (t.onFailure = e.onFailure), void 0 !== e.data && (t.data = e.data), void 0 !== e.contentType && (t.contentType = e.contentType), u.ajax(t); + } + function b() { + return O.sonar && O.sonar.enabled ? o.getSonarPayload(O.sonar.entrypoints) : {}; + } + function y(e) { + A = e; + } + function h(e) { + return Boolean(O.sonar && O.sonar.enabled && o.getLastUpdated(b()) > e.created); + } + function S(e) { + return e.data.version !== O.version; + } + var O, _, E, I, w, A, T, x, C, P, j = { + match: [ + h, + function (e) { + return !function (e) { + return !!(e && e.uids && f.isString(e.source) && f.isArray(e.uids)) && e.uids.every(function (e) { + return Boolean(!f.isEmpty(e) && e.id); + }); + }(e.data.data); + } + ], + pass: [ + h, + function (e) { + return !(!O.consent || !n.isPrivacyEnabled()) && (!e.data.consent || !f.isArraySubset(Object.keys(O.consent), Object.keys(e.data.consent))) && n.wait().then(function () { + return Object.keys(O.consent).some(function (t) { + if (e.data.consent && e.data.consent[t]) { + return !1; + } + var r = n[t].getConsent(); + return r && r.consentString; + }); + }); + }, + S + ], + error: [S] + }, R = [function () { + return O.consent && n.isPrivacyEnabled() ? n.wait() : null; + }]; + return n = d.services.ComplianceService, i = d.services.EventsService, o = d.services.PublisherSonarService, O = e.profile, _ = O.partnerId, E = O.statsId, w = null, A = null, x = null, C = _, T = {}, I = { + Utilities: { + buildUrl: u.buildUrl, + getPageUrl: a.getPageUrl, + getProtocol: a.getProtocol, + getReferrer: a.getReferrer, + getTime: l.now, + getType: f.getType, + isArray: f.isArray, + isEmpty: f.isEmpty, + isFunction: f.isFunction, + isInteger: f.isInteger, + isNumeric: f.isNumeric, + isString: f.isString, + isObject: f.isObject, + isTopFrame: a.isTopFrame, + isXhrSupported: u.isXhrSupported, + readCookie: a.readCookie, + ajax: v, + getConsent: g, + getIdentityResultFrom: m, + getPublisherSonarData: b + }, + onRetrieve: i.on.bind(null, 'ip_module_retrieve_' + _), + onResult: i.on.bind(null, 'ip_module_result_' + _), + registerMatch: p.bind(null, 'match'), + registerPass: p.bind(null, 'pass'), + registerError: p.bind(null, 'error'), + registerEbTargeting: y, + configs: t + }, e.main(I), { + getStatsId: function () { + return E; + }, + getResults: function () { + return w; + }, + getTargets: function () { + if (A) { + return A; + } + if (w && f.isArray(w.uids) && w.uids.length && w.uids[0].id) { + var e = {}; + return e[O.targetingKeys.exchangeBidding] = w.uids[0].id, e; + } + return null; + }, + retrieve: function () { + return function () { + var e = s.getEntry(C); + return c.resolve().then(function () { + if (!e) { + return null; + } + var t = j[e.data.response]; + return t ? c.all(t.map(function (t) { + return t.call(null, e); + })) : null; + }).then(function (t) { + return !t || t.indexOf(!0) > -1 ? null : (i.emit('hs_identity_cached', { statsId: E }), r(e.data.response, e.data.data), e.data); + }); + }().then(function (e) { + return e ? null : c.resolve().then(function () { + return c.all(R.map(function (e) { + return e.call(); + })); + }).then(function () { + return new c(function (e) { + i.emit('hs_identity_request', { statsId: E }), P = !1, x = e, i.emit('ip_module_retrieve_' + _); + }); + }); + }); + } + }; + }; + }, + {} + ], + 19: [ + function (e, t, r) { + function n() { + if (o.msie) { + i.registerError('Encrypted pid not supported in Internet Explorer'); + } else { + var e = {}, t = function () { + const $___old_5806a525e0863a95 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_5806a525e0863a95) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + try { + return localStorage.getItem(s); + } catch (e) { + return null; + } + }.apply(this, arguments); + } finally { + if ($___old_5806a525e0863a95) + ({}.constructor.defineProperty(window, 'localStorage', $___old_5806a525e0863a95)); + } + }(); + t && (e.duid = t); + var r = function () { + var e = i.Utilities.getIdentityResultFrom('AdserverOrgIp'); + if (e) { + if (e.TDID) { + return e.TDID; + } + if (e.uids) { + var t = e.uids.find(function (e) { + return e.id && e.ext && 'TDID' === e.ext.rtiPartner; + }); + if (t) { + return t.id; + } + } + } + return null; + }(); + r && (e[a] = r), i.Utilities.ajax({ + url: i.Utilities.getProtocol() + u, + method: 'GET', + data: e, + onSuccess: function (e) { + try { + var t = JSON.parse(e); + t && t.unifiedId ? t.unifiedId.id && t.unifiedId.keyID ? i.registerMatch({ + source: c.source, + uids: [{ + id: t.unifiedId.id, + ext: { + keyID: t.unifiedId.keyID, + rtiPartner: 'LDID', + enc: 1 + } + }] + }) : i.registerError('response missing id and/or keyID') : i.registerError('response missing unifiedId object'); + } catch (e) { + i.registerError('response is not valid JSON'); + } + }, + onFailure: function (e) { + 204 === e ? i.registerPass() : i.registerError('API returned error response ' + e); + } + }); + } + } + var i, o = e(11), a = '44489', s = '_li_duid', u = '//idx.liadm.com/idex/ie/any', c = { + partnerId: 'LiveIntentIp', + statsId: 'LVINT', + version: '1.1.1', + source: 'liveintent.com', + cacheExpiry: { + match: 259200000, + pass: 86400000, + error: 86400000 + }, + targetingKeys: { exchangeBidding: 'ixpid_5' } + }; + t.exports = { + type: 'identity', + api: '1', + main: function (e) { + (i = e).onRetrieve(n); + }, + profile: c + }; + }, + {} + ], + 20: [ + function (e, t, r) { + function n() { + var e = { + pid: a, + rt: 'envelope' + }, t = i.Utilities.getConsent('gdpr'); + t && t.consentString && t.version && (e[d.consent.gdpr] = t.consentString, 1 == t.version ? e[c] = 1 : 2 == t.version && (e[c] = 4)); + var r = [], n = d.sonar.entrypoints[0].key, l = i.Utilities.getPublisherSonarData(); + l && l.hasOwnProperty(n) && (e[n] = l[n].data, e[s] = u, r.push(l[n].meta)), i.Utilities.ajax({ + url: i.Utilities.getProtocol() + o, + method: 'GET', + data: e, + onSuccess: function (e) { + try { + var t, n = JSON.parse(e); + if (!i.Utilities.isObject(n)) { + return void i.registerError('invalid response'); + } + if (i.Utilities.isEmpty(n)) { + return void i.registerPass(); + } + if (!n.hasOwnProperty('envelope')) { + return void i.registerError('invalid envelope object'); + } + if (i.Utilities.isEmpty(n.envelope)) { + return void i.registerPass(); + } + t = { + source: d.source, + uids: [{ + id: n.envelope, + ext: { rtiPartner: 'idl' } + }] + }, r.length && (t.ext = { sonar: r }), i.registerMatch(t); + } catch (e) { + i.registerError('response is not valid JSON'); + } + }, + onFailure: function (e) { + 204 === e ? i.registerPass() : i.registerError('API returned error response ' + e); + } + }); + } + var i, o = '//api.rlcdn.com/api/identity', a = 2, s = 'it', u = 4, c = 'ct', d = { + partnerId: 'LiveRampIp', + statsId: 'LVRAMP', + version: '1.3.0', + source: 'liveramp.com', + cacheExpiry: { + match: 86400000, + pass: 86400000, + error: 86400000 + }, + consent: { gdpr: 'cv' }, + targetingKeys: { exchangeBidding: 'ixpid_3' }, + sonar: { + enabled: !0, + entrypoints: [{ + key: 'iv', + filter: { + attr: 1, + algo: 1 + } + }] + } + }; + t.exports = { + type: 'identity', + api: '1', + main: function (e) { + i = e, window.ats && window.ats.retrieveEnvelope(function (e) { + if (e) { + try { + var t = JSON.parse(e).envelope; + i.registerMatch({ + source: d.source, + uids: [{ + id: t, + ext: { rtiPartner: 'idl' } + }] + }); + } catch (e) { + } + } + }), i.onRetrieve(n); + }, + profile: d + }; + }, + {} + ], + 21: [ + function (e, t, r) { + function n(e, t) { + var r = [], n = o.Utilities.getPublisherSonarData(); + if (!o.configs.enable4CiteTag) { + for (var i in n) { + n.hasOwnProperty(i) && (e[i] = n[i].data, r.push(n[i].meta)); + } + } + o.Utilities.ajax({ + url: o.Utilities.getProtocol() + t, + method: 'GET', + data: e, + onSuccess: function (e) { + try { + var t, n = JSON.parse(e); + if (!o.Utilities.isObject(n)) { + return void o.registerError('invalid response'); + } + n.c && n.c.value && localStorage.setItem('_svsid', n.c.value); + var i = []; + if (n.ppid) { + if (!n.ppid.id) { + return void o.registerError('invalid ppid object'); + } + i.push({ + id: n.ppid.id, + ext: { enc: 0 } + }); + } + if (n.pam_id && !a.msie) { + if (!n.pam_id.id || !n.pam_id.keyID) { + return void o.registerError('invalid pam_id object'); + } + i.push({ + id: n.pam_id.id, + ext: { + keyID: n.pam_id.keyID, + enc: 1 + } + }); + } + i.length ? (t = { + source: d.source, + uids: i + }, r.length > 0 && (t.ext = { sonar: r }), o.registerMatch(t)) : o.registerPass(); + } catch (e) { + o.registerError('response is not valid JSON'); + } + }, + onFailure: function (e) { + o.registerError('API returned error response ' + e); + } + }); + } + function i() { + const $___old_de88926d4d87736b = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_de88926d4d87736b) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_436d6f6f94763253.localStorage)); + return function () { + var e = '', t = {}; + o.configs.enable4CiteTag ? (localStorage.getItem('__svsid') && localStorage.removeItem('__svsid'), e = localStorage.getItem('_svsid') ? localStorage.getItem('_svsid') : null, t.vendor = 'idsv2', t.sv_cid = '5274_04512', t.sv_pubid = o.configs.pubid, t.sv_domain = document.location.hostname, e && (t.sv_session = e), n(t, u)) : (t.ptk = c, t.pubid = o.configs.pubid, n(t, s)); + }.apply(this, arguments); + } finally { + if ($___old_de88926d4d87736b) + ({}.constructor.defineProperty(window, 'localStorage', $___old_de88926d4d87736b)); + } + } + var o, a = e(11), s = '//mid.rkdms.com/idsv2', u = '//id.sv.rkdms.com/identity/', c = '17c1789b-e660-493b-aa74-3c8fb990dc5f', d = { + partnerId: 'MerkleIp', + statsId: 'MRKL', + version: '1.4.2', + source: 'merkleinc.com', + cacheExpiry: { + match: 604800000, + pass: 86400000, + error: 86400000 + }, + targetingKeys: { exchangeBidding: 'ixpid_4' }, + sonar: { + enabled: !0, + entrypoints: [{ + key: 'qs1', + filter: { + attr: 1, + algo: 2 + } + }] + } + }; + t.exports = { + type: 'identity', + api: '1', + main: function (e) { + (o = e).onRetrieve(i); + }, + profile: d + }; + }, + {} + ], + 22: [ + function (e, t, r) { + var n = e(13); + e(15), t.exports = function () { + function e(e, r, i) { + t.hasOwnProperty(e) || (t[e] = []); + var o = n.generateUniqueId(); + return t[e].push({ + id: o, + fn: i, + once: r + }), o; + } + var t; + return t = {}, { + on: function (t, r) { + return e(t, !1, r); + }, + once: function (t, r) { + return e(t, !0, r); + }, + off: function (e) { + for (var r in t) { + if (t.hasOwnProperty(r)) { + for (var n = t[r].length - 1; n >= 0; n--) { + if (t[r][n].id === e) { + return void t[r].splice(n, 1); + } + } + } + } + }, + emit: function () { + var e = Array.prototype.slice.call(arguments), r = e.shift(); + if (r && t.hasOwnProperty(r)) { + for (var n = t[r].length - 1; n >= 0; n--) { + try { + t[r][n].fn.apply(null, e); + } catch (e) { + } + t[r][n].once && t[r].splice(n, 1); + } + } + } + }; + }; + }, + {} + ], + 23: [ + function (e, t, r) { + var n = e(10); + t.exports = function () { + return { + gdpr: { + getConsent: function () { + return { + applies: !0, + consentString: '' + }; + }, + setApplies: function () { + } + }, + usp: { + getConsent: function () { + return { + version: 1, + uspString: '' + }; + } + }, + isPrivacyEnabled: function () { + return !1; + }, + delay: function (e) { + return e; + }, + wait: function () { + return n.resolve(); + } + }; + }; + }, + {} + ], + 24: [ + function (e, t, r) { + e(13), t.exports = function () { + return {}; + }; + }, + {} + ], + 25: [ + function (e, t, r) { + t.exports = function () { + return { + getSonarPayload: function () { + return {}; + }, + getLastUpdated: function () { + return 0; + }, + setSonarEmail: function () { + return {}; + } + }; + }; + }, + {} + ], + 26: [ + function (e, t, r) { + var n = e(7), i = e(13); + e(15), t.exports = function () { + function e(e) { + return function () { + t[e].state = r.TERMINATED; + for (var n = 0; n < t[e].cbs.length; n++) { + try { + t[e].cbs[n](); + } catch (e) { + } + } + delete t[e].cbs, delete t[e].timer; + }; + } + var t, r = { + NEW: 0, + RUNNABLE: 1, + TERMINATED: 2 + }; + return t = {}, { + TimerStates: r, + createTimer: function (o, a, s) { + var u = i.generateUniqueId(n.SESSION_ID_LENGTH); + return a = !!a, s = s ? [s] : [], t[u] = { + state: r.NEW, + cbs: s, + timeout: o + }, a && (t[u].state = r.RUNNABLE, t[u].timer = setTimeout(e(u), o)), u; + }, + startTimer: function (n) { + t.hasOwnProperty(n) && t[n].state === r.NEW && (t[n].state = r.RUNNABLE, t[n].timer = setTimeout(e(n), t[n].timeout)); + }, + addTimerCallback: function (e, n) { + t.hasOwnProperty(e) && t[e].state !== r.TERMINATED && t[e].cbs.unshift(n); + }, + getTimerState: function (e) { + return t.hasOwnProperty(e) ? t[e].state : null; + }, + clearTimer: function (e) { + t.hasOwnProperty(e) && t[e].state !== r.TERMINATED && (t[e].state = r.TERMINATED, clearTimeout(t[e].timer), delete t[e].cbs, delete t[e].timer); + } + }; + }; + }, + {} + ], + 27: [ + function (e, t, r) { + var n, i, o = (e(3), e(6)), a = e(16), s = e(28), u = e(14); + window[s.NAMESPACE] = window[s.NAMESPACE] || {}, window[s.NAMESPACE].cmd = window[s.NAMESPACE].cmd || []; + var c = window[s.NAMESPACE].cmd; + window[s.NAMESPACE] = function () { + function e(e, t, r) { + var n = ''; + try { + if (!u.isBoolean(t)) { + return i.emit('error', '`once` must be a boolean'), n; + } + if (!u.isFunction(r)) { + return i.emit('error', '`callback` must be a function'), n; + } + if (!u.isString(e)) { + return i.emit('error', '`eventName` must be a string'), n; + } + if (!c.hasOwnProperty(e)) { + return i.emit('error', 'Unrecognized event ' + e), n; + } + if ('rti_partner_request_complete' === e && !0 === o.emitted) { + return r(e, o.args), n; + } + var a = function () { + var t = Array.prototype.slice.call(arguments); + r(e, JSON.stringify(t)); + }; + n = t ? i.once(e, a) : i.on(e, a); + } catch (e) { + i.emit('error', e); + } + return n; + } + var t, r, o = { + emitted: !1, + args: {} + }, c = { + error: 1, + warning: 2, + rti_partner_request_complete: 3 + }; + if (function () { + try { + t = a({ + DeviceTypeChecker: { + method: 'USER_AGENT', + configs: {} + }, + Services: { + EventsService: {}, + TimerService: {} + }, + Layers: [{ + layerId: 'IdentityLayer', + configs: { + partners: { + AdserverOrgIp: { + enabled: !0, + configs: { publisherId: 183728 } + }, + MerkleIp: { + enabled: !0, + configs: { + pubid: 'CBSI', + enable4CiteTag: 1 + } + }, + LiveRampIp: { + enabled: !0, + configs: {} + }, + LiveIntentIp: { + enabled: !0, + configs: {} + } + } + } + }] + }).getDirectInterface(), n = s.services.ComplianceService, i = s.services.EventsService; + var u = Math.random().toString(36).slice(-5); + i.emit('hs_session_start', { sessionId: u }), e('rti_partner_request_complete', !0, function (e, t) { + o = { + emitted: !0, + args: t + }, i.emit('hs_session_end', { sessionId: u }); + }), n.wait().then(function () { + t.Layers.IdentityLayer.retrieve(); + }).catch(function (e) { + }); + } catch (e) { + r = { + subscribeEvent: function () { + return ''; + }, + unsubscribeEvent: function () { + } + }; + } + }(), r) { + return r; + } + var d = {}; + if (window[s.NAMESPACE]) { + for (var l in window[s.NAMESPACE]) { + window[s.NAMESPACE].hasOwnProperty(l) && (d[l] = window[s.NAMESPACE][l]); + } + } + return d.subscribeEvent = e, d.unsubscribeEvent = function (e) { + try { + if (!u.isString(e)) { + return void i.emit('error', '`subscriptionId` must be a string'); + } + i.off(e); + } catch (e) { + i.emit('error', e); + } + }, d.getIdentityInfo = function () { + return t.Layers.IdentityLayer.getAllPartnerResults(); + }, d.setSonarEmail = function (e) { + var r; + return (r = s.services.PublisherSonarService.setSonarEmail(e)).status && t.Layers.IdentityLayer.invokeAllPartners(), r; + }, d; + }(), window[s.NAMESPACE].cmd = o(c); + }, + {} + ], + 28: [ + function (e, t, r) { + t.exports = { + NAMESPACE: 'headertag', + PRODUCT: 'IdentityLibrary', + services: {}, + DeviceTypeChecker: {}, + initQueue: [], + globalTimeout: null, + instanceId: null, + version: '2.37.0' + }; + }, + {} + ] + }, {}, [27]); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.dynamicTargeting = void 0, r(4), r(2), r(1), r(3), r(0), r(54); + var n = f(r(29)), i = r(25), o = r(55), a = r(21), s = r(15), u = r(52), c = r(59), d = r(8), l = r(73); + function f(e) { + return e && e.__esModule ? e : { default: e }; + } + function p(e) { + return (p = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var g = f(r(10)).default.MODULES.DYNAMIC_TARGETING, m = 'page', v = 'unit', b = function () { + var e = {}, t = {}, r = {}, f = {}; + function b() { + return { + bidderTimeout: (0, s.getConfig)('highFrequencyAdRequests') ? (0, s.getConfig)('timeouts.hfar') : (0, s.getConfig)('timeouts.bidder'), + getCookie: l.storage.raw.getCookie + }; + } + function y() { + for (var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'processAdRequest', n = {}, i = function (i) { + var a = e.rules[i]; + a.level === m && a.hook === t && (a.getValue ? (0, o.makeSafe)(function () { + if (a.matcher(b())) { + var e = r['_page' + a.key]; + a.cacheResult && void 0 !== e || (e = a.getValue(b()), r['_page' + a.key] = e), null !== e && (n[a.key] = e); + } + }) : a.modify && (0, o.makeSafe)(function () { + a.matcher(b()) && (n = a.modify(n, b())); + })); + }, a = 0; a < e.rules.length; a++) { + i(a); + } + d.bbLogger.logInfo('Setting page level dynamic targeting', n), (0, c.setTargeting)(n); + } + function h() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'processAdRequest'; + return function (t, r) { + y(e), t(r); + }; + } + function S(t) { + var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'processAdRequest'; + if (!t || !e.rules || !e.rules.length) { + return t; + } + if (Array.isArray(t)) { + for (var a = [], s = 0; s < t.length; s++) { + var u = t[s]; + a.push(S(u, n)); + } + return a; + } + var l = t; + d.bbLogger.logInfo('Applying Dynamic Targeting Rules level=unit, hook='.concat(n), e.rules); + for (var g = function (t) { + var i = e.rules[t]; + i.level === v && i.hook === n && (i.getValue ? (0, o.makeSafe)(function () { + if (i.matcher(l, b())) { + var e = r[l.code + i.key]; + i.cacheResult && void 0 !== e || (e = i.getValue(l, b()), r[l.code + i.key] = e), l.dynamicTargeting || (l.dynamicTargeting = {}), null !== e && (l.dynamicTargeting[i.key] = e); + } + }) : i.modify && (0, o.makeSafe)(function () { + i.matcher(l) && (l.dynamicTargeting = i.modify(l, b())); + })); + }, m = 0; m < e.rules.length; m++) { + g(m); + } + return e.units[l.code] && (l = _(e.units[l.code], l)), e.units[l.originalCode] && (l = _(e.units[l.originalCode], l)), void 0 === i.moduleManager.gateways.getGates().consentGiven || p(i.moduleManager.gateways.getGates().consentGiven) || (f[l.code] = l), d.bbLogger.logInfo('Setting unit level dynamic targeting', l.code, l.dynamicTargeting), (0, c.setTargeting)(l.dynamicTargeting, [l.code]), l; + } + function O() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'processAdRequest'; + return function (t, r) { + t(S(r, e)); + }; + } + function _(e, t) { + var r = t; + if (e.constructor === Array) { + for (var i = 0; i < e.length; i++) { + var a = e[i]; + r = _(a, r); + } + return r; + } + return 'function' == typeof e ? (0, o.makeSafe)(function () { + r.targeting = e(t, b()); + }) : 'object' === p(e) && (r.targeting = (0, n.default)({}, e, r.targeting)), r; + } + return a.exposureApi.expose({ + applyUnitLevelTargeting: S, + applyPageLevelTargeting: y + }), { + name: g, + protected: !0, + register: function () { + (0, s.getConfig)('dynamicTargeting', function (t) { + e = t; + }), (0, s.getConfig)('consent', function (t) { + t && e.rules && (d.bbLogger.logInfo('Setting Dynamic Targeting after consent given'), y(), S(Object.values(f))); + }), t.page = { processAdRequest: h('processAdRequest') }, t.unit = { + processAdRequest: O('processAdRequest'), + setBidTargeting: O('setBidTargeting') + }, u.processAdRequest.before(t.page.processAdRequest), u.processAdRequest.before(t.unit.processAdRequest), c.setBidTargeting.after(t.unit.setBidTargeting); + }, + deregister: function () { + u.processAdRequest.getHooks({ hook: t.page.processAdRequest }).remove(), u.processAdRequest.getHooks({ hook: t.unit.processAdRequest }).remove(), c.setBidTargeting.getHooks({ hook: t.unit.setBidTargeting }).remove(); + } + }; + }(), y = i.moduleManager.register(b); + t.dynamicTargeting = y; + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t.analyticsModule = void 0, r(17), r(3), r(5), r(6), r(13), r(9), r(11), r(0), r(1), r(4), r(2); + var n = r(20), i = r(21), o = r(72), a = r(25), s = r(8), u = r(200), c = S(r(29)), d = S(r(149)), l = r(35), f = r(15), p = r(122), g = S(r(10)), m = S(r(151)), v = S(r(120)), b = r(98), y = r(42), h = S(r(51)); + function S(e) { + return e && e.__esModule ? e : { default: e }; + } + function O(e, t) { + if (null == e) { + return {}; + } + var r, n, i = function (e, t) { + if (null == e) { + return {}; + } + var r, n, i = {}, o = Object.keys(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || (i[r] = e[r]); + } + return i; + }(e, t); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + for (n = 0; n < o.length; n++) { + r = o[n], t.indexOf(r) >= 0 || Object.prototype.propertyIsEnumerable.call(e, r) && (i[r] = e[r]); + } + } + return i; + } + function _(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function E(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? _(Object(r), !0).forEach(function (t) { + I(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : _(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function I(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function w(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return A(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return A(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function A(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var T = (0, s.logger)({ + name: 'BidBarrelAnalytics', + bgColor: '#8F8389' + }), x = g.default.EVENTS, C = x.ANALYTICS_RECORD_CREATED, P = x.ANALYTICS_REPORTED, j = x.ANALYTICS_CANCELLED, R = g.default.MODULES.BIDBARREL_ANALYTICS, D = function () { + var e = !1, t = {}, r = [], a = [], s = {}, g = {}, S = {}, _ = []; + function I(i) { + if (e) { + var o = w(function () { + for (var e, t = function (e) { + return null == e ? arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null : '' + e; + }, r = { + version: '2', + hostname: m.default.getValue('hostname') || null, + page: m.default.getValue('page') || null, + abStr: m.default.getValue('abStr') || null, + gaClientId: m.default.getValue('cookie.gaClientId') || null, + aamUuid: m.default.getValue('cookie.aamUuid') || null, + env: m.default.getValue('targeting.env') || m.default.getValue('config.pageTargeting.env') || ((0, b.isStagingEnv)() ? 'stage' : 'prod') || null, + dfpPath: m.default.getValue('config.dfpPathObj.string') || null, + firstpg: t(m.default.getValue('targeting.firstpg'), null), + pv: t(m.default.getValue('targeting.pv'), null), + ftag: m.default.getValue('targeting.ftag') || null, + ttag: m.default.getValue('targeting.ttag') || null, + session: m.default.getValue('targeting.session') || null, + subses: m.default.getValue('targeting.subses') || null, + ptype: m.default.getValue('targeting.ptype') || null, + vguid: m.default.getValue('targeting.vguid') || null, + bidbarrelVersion: m.default.getValue('bidbarrelVersion') || null, + connectionType: m.default.getValue('client.connectionType') || null, + connectionSpeed: m.default.getValue('client.connectionSpeed') || null, + regionCode: m.default.getValue('client.region') || null, + countryCode: m.default.getValue('client.country') || null, + subCountryCode: m.default.getValue('client.subregion') || null, + vpWidth: m.default.getValue('client.viewportWidth') || null, + vpHeight: m.default.getValue('client.viewportHeight') || null, + configVersion: m.default.getValue('config._remoteContext.version') || null, + authenticated: m.default.getValue('authenticated') || !1 + }, n = 0; n < _.length; n++) { + var i = _[n]; + (0, v.default)(r, i) && (e = n); + } + return void 0 === e && (_.push(r), e = _.length - 1), [ + e, + _[e] + ]; + }(), 2), s = o[0], u = o[1], c = E(E({}, i), u), d = E(E({}, i), {}, { contextIndex: s }); + for (var l in (r.push(d), g)) { + Object.prototype.hasOwnProperty.call(g, l) && (t[l] || (t[l] = []), t[l].push(d)); + } + n.eventEmitter.emit(C, c); + } else { + a.push(i); + } + } + function A(e) { + for (var t = [], r = 0; r < e.length; r++) { + var n = e[r], i = n.contextIndex, o = O(n, ['contextIndex']); + void 0 !== i && t.push(E(E({}, o), _[i])); + } + return t; + } + function x(e, t) { + if (e) { + T.logError(e); + var r = new Error(''.concat(JSON.stringify(e, h.default))); + y.errorReporting.report(r); + } + S[t.id] || (S[t.id] = 0), S[t.id]++, void 0 !== t.failThreshold && S[t.id] >= t.failThreshold && (T.logInfo('Fail threshold reached for', t.id, 'cancelling..'), clearInterval(s[t.id])); + } + return i.exposureApi.expose({ + getAllAnalyticsRecords: function () { + var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; + return (0, l.cloneDeep)(e ? A(r) : r); + }, + getAnalyticsRecords: function () { + var e = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; + if (!e) { + return (0, l.cloneDeep)(t); + } + var r = {}; + for (var n in t) { + if (Object.prototype.hasOwnProperty.call(t, n)) { + var i = t[n]; + r[n] = e(i); + } + } + return r; + }, + cancelReporting: function (e) { + s[e] && !g[e].protected && (n.eventEmitter.emit([ + ''.concat(e, '.').concat(j), + j + ], g[e]), clearInterval(s[e])); + } + }), { + initialize: function () { + !function () { + if (e) { + return; + } + var r = function (e) { + if (Object.prototype.hasOwnProperty.call(g, e)) { + var r = g[e], i = r.session; + (o.features.get([ + 'forceRun.'.concat(R), + 'forceRun.all' + ]) || void 0 === i || (0, u.percentageShouldRun)(i.shouldReport || i.reportingPercentage, !0)) && (s[e] = setInterval(function () { + (0, u.percentageRunner)(o.features.get([ + 'forceRun.'.concat(R), + 'forceRun.all' + ]) || r.shouldReport || r.reportingPercentage, function () { + n.eventEmitter.emit([ + ''.concat(e, '.').concat(P), + P + ], A(t[r.id]), r), function (e) { + var r = e.id, n = e.report, i = e.url, o = e.fetchOptions, a = e.transport; + if (t[r] && t[r].length > 0) { + if (n) { + try { + var s = A(t[r]); + T.logInfo('(Method) Reporting Events for config', r, 'events:', s[r]), n(s[r]), t[r] = []; + } catch (t) { + x(t, e); + } + } else if (i) { + var u = !1; + if ('beacon' === a) { + var d = function (e) { + for (var t = {}, r = 0; r < e.length; r++) { + var n = e[r], i = 'ctx'.concat(n.contextIndex); + t[i] || (t[i] = _[n.contextIndex]); + } + return t; + }(t[r]); + T.logInfo('(Beacon) Reporting Events for config', r, 'events:', t[r], d), p.api.sendBeacon(i, { + records: t[r], + contexts: d + }) ? t[r] = [] : u = !0; + } + if ('beacon' !== a || u) { + var l = A(t[r]); + T.logInfo('(Post) Reporting Events for config', r, 'events:', l), p.api.post(i, (g = o, m = l, (0, c.default)({}, g || {}, { + method: 'POST', + mode: 'cors', + body: JSON.stringify(m) + }))).then(function (n) { + var i = n._response; + i.status >= 200 && i.status < 300 ? t[r] = [] : x(null, e); + }).catch(function (t) { + return x(t, e); + }); + } + } else { + T.logError('Must provide a \'report\' or \'url\' property for BidBarrel Analytics'); + var f = new Error('Must provide a \'report\' or \'url\' property for BidBarrel Analytics.'); + y.errorReporting.report(f); + } + } + var g, m; + }(r); + }, !0); + }, r.frequency)); + } + }; + for (var i in g) { + r(i); + } + e = !0, function () { + for (var e = 0; e < a.length; e++) { + I(a[e]); + } + }(); + }(); + }, + register: function () { + (0, f.getConfig)('analytics.bidbarrel', function (e) { + g = (0, d.default)(e, 'id'); + }); + }, + addRecord: I, + name: R + }; + }(), k = a.moduleManager.register(D, null, { gate: 'consentGiven' }); + t.analyticsModule = k; + }, + function (e, t, r) { + 'use strict'; + r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(26), r(4), r(2), r(219), r(43); + var n = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== u(e) && 'function' != typeof e) { + return { default: e }; + } + var t = a(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), i = r(49), o = r(45); + function a() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return a = function () { + return e; + }, e; + } + function s() { + return (s = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function u(e) { + return (u = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function c() { + var e = f([ + 'dcn=', + '&pos=', + '&cmd=bid', + '' + ]); + return c = function () { + return e; + }, e; + } + function d() { + var e = f([ + '', + '/bidRequest?' + ]); + return d = function () { + return e; + }, e; + } + function l() { + var e = f([ + '', + '/pubapi/3.0/', + '/', + '/', + '/', + '/ADTECH;v=2;cmd=bid;cors=yes;alias=', + ';misc=', + ';', + '' + ]); + return l = function () { + return e; + }, e; + } + function f(e, t) { + return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); + } + var p = 'aol', g = 'verizon', m = 'onemobile', v = 'onedisplay', b = { GET: 'display-get' }, y = { + GET: 'mobile-get', + POST: 'mobile-post' + }, h = { + TAG: 'iframe', + TYPE: 'iframe' + }, S = { + TAG: 'img', + TYPE: 'image' + }, O = [ + 'adserver.org', + 'criteo.com', + 'id5-sync.com', + 'intentiq.com', + 'liveintent.com', + 'quantcast.com', + 'verizonmedia.com', + 'liveramp.com' + ], _ = T(l(), 'host', 'network', 'placement', 'pageid', 'sizeid', 'alias', 'misc', 'dynamicParams'), E = T(d(), 'host'), I = T(c(), 'dcn', 'pos', 'dynamicParams'), w = { + us: 'adserver-us.adtech.advertising.com', + eu: 'adserver-eu.adtech.advertising.com', + as: 'adserver-as.adtech.advertising.com' + }, A = 1; + function T(e) { + for (var t = arguments.length, r = new Array(t > 1 ? t - 1 : 0), i = 1; i < t; i++) { + r[i - 1] = arguments[i]; + } + return function () { + for (var t = arguments.length, i = new Array(t), o = 0; o < t; o++) { + i[o] = arguments[o]; + } + var a = i[i.length - 1] || {}, s = [e[0]]; + return r.forEach(function (t, r) { + var o = n.isInteger(t) ? i[t] : a[t]; + s.push(o, e[r + 1]); + }), s.join(''); + }; + } + function x(e) { + return e === p || e === g || e === m; + } + function C(e) { + if (x(e.bidder) && e.params.id && e.params.imp && e.params.imp[0]) { + var t = e.params.imp[0]; + return t.id && t.tagid && (t.banner && t.banner.w && t.banner.h || t.video && t.video.mimes && t.video.minduration && t.video.maxduration); + } + } + function P(e) { + return x(e.bidder) && e.params.dcn && e.params.pos; + } + function j(e) { + return ((t = e.bidder) === p || t === g || t === v) && e.params.placement && e.params.network; + var t; + } + function R(e) { + return e.userIdAsEids.filter(function (e) { + return -1 !== O.indexOf(e.source); + }); + } + var D = { + code: p, + gvlid: 25, + aliases: [ + m, + v, + g + ], + supportedMediaTypes: [o.BANNER], + isBidRequestValid: function (e) { + return j(e) || function (e) { + return P(e) || C(e); + }(e); + }, + buildRequests: function (e, t) { + var r = this, n = {}; + return t && (n.gdpr = t.gdprConsent, n.uspConsent = t.uspConsent), e.map(function (e) { + var t = function (e) { + return P(e) ? y.GET : C(e) ? y.POST : j(e) ? b.GET : void 0; + }(e); + if (t) { + return r.formatBidRequest(t, e, n); + } + }); + }, + interpretResponse: function (e, t) { + var r = e.body; + if (r) { + var i = this._parseBidResponse(r, t); + if (i) { + return i; + } + } else { + n.logError('Empty bid response', t.bidderCode, r); + } + }, + getUserSyncs: function (e, t) { + var r = !n.isEmpty(t) && t[0].body; + return r && r.ext && r.ext.pixels ? this.parsePixelItems(r.ext.pixels) : []; + }, + formatBidRequest: function (e, t, r) { + var n; + switch (e) { + case b.GET: + n = { + url: this.buildMarketplaceUrl(t, r), + method: 'GET', + ttl: 60 + }; + break; + case y.GET: + n = { + url: this.buildOneMobileGetUrl(t, r), + method: 'GET', + ttl: 3600 + }; + break; + case y.POST: + n = { + url: this.buildOneMobileBaseUrl(t), + method: 'POST', + ttl: 3600, + data: this.buildOpenRtbRequestData(t, r), + options: { + contentType: 'application/json', + customHeaders: { 'x-openrtb-version': '2.2' } + } + }; + } + return n.bidderCode = t.bidder, n.bidId = t.bidId, n.userSyncOn = t.params.userSyncOn, n; + }, + buildMarketplaceUrl: function (e, t) { + var r, i = e.params, o = i.server, a = i.region || 'us'; + return w.hasOwnProperty(a) || (n.logWarn('Unknown region \''.concat(a, '\' for AOL bidder.')), a = 'us'), r = o || w[a], i.region = a, this.applyProtocol(_({ + host: r, + network: i.network, + placement: parseInt(i.placement), + pageid: i.pageId || 0, + sizeid: i.sizeId || 0, + alias: i.alias || n.getUniqueIdentifierStr(), + misc: new Date().getTime(), + dynamicParams: this.formatMarketplaceDynamicParams(i, t) + })); + }, + buildOneMobileGetUrl: function (e, t) { + var r = e.params, n = r.dcn, i = r.pos, o = r.ext; + 'object' === u(e.userId) && (o = o || {}, R(e).forEach(function (e) { + o['eid' + e.source] = e.uids[0].id; + })); + var a = this.buildOneMobileBaseUrl(e); + if (n && i) { + var s = this.formatOneMobileDynamicParams(o, t); + a += I({ + dcn: n, + pos: i, + dynamicParams: s + }); + } + return a; + }, + buildOneMobileBaseUrl: function (e) { + return this.applyProtocol(E({ host: e.params.host || 'c2shb.ssp.yahoo.com' })); + }, + applyProtocol: function (e) { + return /^https?:\/\//i.test(e) ? e : 0 === e.indexOf('//') ? ''.concat('https', ':').concat(e) : ''.concat('https', '://').concat(e); + }, + formatMarketplaceDynamicParams: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = {}; + e.bidFloor && (r.bidfloor = e.bidFloor), s(r, this.formatKeyValues(e.keyValues)), s(r, this.formatConsentData(t)); + var i = ''; + return n._each(r, function (e, t) { + i += ''.concat(t, '=').concat(encodeURIComponent(e), ';'); + }), i; + }, + formatOneMobileDynamicParams: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; + this.isSecureProtocol() && (e.secure = A), s(e, this.formatConsentData(t)); + var r = ''; + return n._each(e, function (e, t) { + r += '&'.concat(t, '=').concat(encodeURIComponent(e)); + }), r; + }, + buildOpenRtbRequestData: function (e) { + var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, r = { + id: e.params.id, + imp: e.params.imp + }; + if (this.isEUConsentRequired(t) && (n.deepSetValue(r, 'regs.ext.gdpr', A), t.gdpr.consentString && n.deepSetValue(r, 'user.ext.consent', t.gdpr.consentString)), t.uspConsent && n.deepSetValue(r, 'regs.ext.us_privacy', t.uspConsent), 'object' === u(e.userId)) { + r.user = r.user || {}, r.user.ext = r.user.ext || {}; + var i = R(e); + i.length > 0 && (r.user.ext.eids = i); + } + return r; + }, + isEUConsentRequired: function (e) { + return !!(e && e.gdpr && e.gdpr.gdprApplies); + }, + formatKeyValues: function (e) { + var t = {}; + return n._each(e, function (e, r) { + t['kv'.concat(r)] = e; + }), t; + }, + formatConsentData: function (e) { + var t = {}; + return this.isEUConsentRequired(e) && (t.gdpr = A, e.gdpr.consentString && (t.euconsent = e.gdpr.consentString)), e.uspConsent && (t.us_privacy = e.uspConsent), t; + }, + parsePixelItems: function (e) { + var t = /\w*(?=\s)/, r = /src=("|')(.*?)\1/, n = []; + if (e) { + var i = e.match(/(img|iframe)[\s\S]*?src\s*=\s*("|')(.*?)\2/gi); + i && i.forEach(function (e) { + var i = e.match(t)[0], o = e.match(r)[2]; + i && i && n.push({ + type: i === S.TAG ? S.TYPE : h.TYPE, + url: o + }); + }); + } + return n; + }, + _parseBidResponse: function (e, t) { + var r, i; + try { + r = e.seatbid[0].bid[0]; + } catch (e) { + return; + } + if (r.ext && r.ext.encp) { + i = r.ext.encp; + } else if (null === (i = r.price) || isNaN(i)) { + return void n.logError('Invalid price in bid response', p, r); + } + return { + bidderCode: t.bidderCode, + requestId: t.bidId, + ad: r.adm, + cpm: i, + width: r.w, + height: r.h, + creativeId: r.crid || 0, + pubapiId: e.id, + currency: e.cur || 'USD', + dealId: r.dealid, + netRevenue: !0, + ttl: t.ttl + }; + }, + isOneMobileBidder: x, + isSecureProtocol: function () { + return 'https:' === document.location.protocol; + } + }; + t.spec = D, (0, i.registerBidder)(D); + }, + function (e, t, r) { + 'use strict'; + r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(26), r(4), r(2), r(153), r(123), r(33), r(16); + var n = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== d(e) && 'function' != typeof e) { + return { default: e }; + } + var t = u(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), i = r(49), o = r(45), a = r(22), s = r(76); + function u() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return u = function () { + return e; + }, e; + } + function c() { + return (c = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function d(e) { + return (d = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var l = 'https://pubmatic.bbvms.com/r/'.concat('$RENDERER', '.js'), f = { + kadpageurl: '', + gender: '', + yob: '', + lat: '', + lon: '', + wiid: '', + profId: '', + verId: '' + }, p = 'number', g = 'string', m = 'boolean', v = 'array', b = { + mimes: v, + minduration: p, + maxduration: p, + startdelay: p, + playbackmethod: v, + api: v, + protocols: v, + w: p, + h: p, + battr: v, + linearity: p, + placement: p, + minbitrate: p, + maxbitrate: p + }, y = { + TITLE: { + ID: 1, + KEY: 'title', + TYPE: 0 + }, + IMAGE: { + ID: 2, + KEY: 'image', + TYPE: 0 + }, + ICON: { + ID: 3, + KEY: 'icon', + TYPE: 0 + }, + SPONSOREDBY: { + ID: 4, + KEY: 'sponsoredBy', + TYPE: 1 + }, + BODY: { + ID: 5, + KEY: 'body', + TYPE: 2 + }, + CLICKURL: { + ID: 6, + KEY: 'clickUrl', + TYPE: 0 + }, + VIDEO: { + ID: 7, + KEY: 'video', + TYPE: 0 + }, + EXT: { + ID: 8, + KEY: 'ext', + TYPE: 0 + }, + DATA: { + ID: 9, + KEY: 'data', + TYPE: 0 + }, + LOGO: { + ID: 10, + KEY: 'logo', + TYPE: 0 + }, + SPONSORED: { + ID: 11, + KEY: 'sponsored', + TYPE: 1 + }, + DESC: { + ID: 12, + KEY: 'data', + TYPE: 2 + }, + RATING: { + ID: 13, + KEY: 'rating', + TYPE: 3 + }, + LIKES: { + ID: 14, + KEY: 'likes', + TYPE: 4 + }, + DOWNLOADS: { + ID: 15, + KEY: 'downloads', + TYPE: 5 + }, + PRICE: { + ID: 16, + KEY: 'price', + TYPE: 6 + }, + SALEPRICE: { + ID: 17, + KEY: 'saleprice', + TYPE: 7 + }, + PHONE: { + ID: 18, + KEY: 'phone', + TYPE: 8 + }, + ADDRESS: { + ID: 19, + KEY: 'address', + TYPE: 9 + }, + DESC2: { + ID: 20, + KEY: 'desc2', + TYPE: 10 + }, + DISPLAYURL: { + ID: 21, + KEY: 'displayurl', + TYPE: 11 + }, + CTA: { + ID: 22, + KEY: 'cta', + TYPE: 12 + } + }, h = 1, S = 2, O = 3, _ = [ + { + id: y.SPONSOREDBY.ID, + required: !0, + data: { type: 1 } + }, + { + id: y.TITLE.ID, + required: !0 + }, + { + id: y.IMAGE.ID, + required: !0 + } + ], E = { + 1: 'PMP', + 5: 'PREF', + 6: 'PMPG' + }, I = { + bootstrapPlayer: function (e) { + var t = { code: e.adUnitCode }; + if (e.vastXml ? t.vastXml = e.vastXml : e.vastUrl && (t.vastUrl = e.vastUrl), e.vastXml || e.vastUrl) { + for (var r, i = I.getRendererId('pubmatic', e.rendererCode), o = document.getElementById(e.adUnitCode), a = 0; a < window.bluebillywig.renderers.length; a++) { + if (window.bluebillywig.renderers[a]._id === i) { + r = window.bluebillywig.renderers[a]; + break; + } + } + r ? r.bootstrap(t, o) : n.logWarn(''.concat('PubMatic: ', ': Couldn\'t find a renderer with ').concat(i)); + } else { + n.logWarn(''.concat('PubMatic: ', ': No vastXml or vastUrl on bid, bailing...')); + } + }, + newRenderer: function (e, t) { + var r = l.replace('$RENDERER', e), i = s.Renderer.install({ + url: r, + loaded: !1, + adUnitCode: t + }); + try { + i.setRender(I.outstreamRender); + } catch (e) { + n.logWarn(''.concat('PubMatic: ', ': Error tying to setRender on renderer'), e); + } + return i; + }, + outstreamRender: function (e) { + e.renderer.push(function () { + I.bootstrapPlayer(e); + }); + }, + getRendererId: function (e, t) { + return ''.concat(e, '-').concat(t); + } + }, w = 0, A = !1, T = {}, x = {}; + function C(e, t) { + if (n.isStr(t)) { + switch (e) { + case 'pmzoneid': + return t.split(',').slice(0, 50).map(function (e) { + return e.trim(); + }).join(); + case 'kadfloor': + case 'lat': + case 'lon': + return parseFloat(t) || undefined; + case 'yob': + return parseInt(t) || undefined; + default: + return t; + } + } else { + t && n.logWarn('PubMatic: Ignoring param key: ' + e + ', expects string-value, found ' + d(t)); + } + } + function P(e) { + var t; + e.params.adUnit = '', e.params.adUnitIndex = '0', e.params.width = 0, e.params.height = 0, e.params.adSlot = (t = e.params.adSlot, n.isStr(t) ? t.replace(/^\s+/g, '').replace(/\s+$/g, '') : ''); + var r = e.params.adSlot, i = r.split(':'); + if (r = i[0], 2 == i.length && (e.params.adUnitIndex = i[1]), i = r.split('@'), e.params.adUnit = i[0], i.length > 1) { + if (2 != (i = i[1].split('x')).length) { + return void n.logWarn('PubMatic: AdSlot Error: adSlot not in required format'); + } + e.params.width = parseInt(i[0], 10), e.params.height = parseInt(i[1], 10); + } else if (e.hasOwnProperty('mediaTypes') && e.mediaTypes.hasOwnProperty(o.BANNER) && e.mediaTypes.banner.hasOwnProperty('sizes')) { + for (var a = 0, s = []; a < e.mediaTypes.banner.sizes.length; a++) { + 2 === e.mediaTypes.banner.sizes[a].length && s.push(e.mediaTypes.banner.sizes[a]); + } + e.mediaTypes.banner.sizes = s, e.mediaTypes.banner.sizes.length >= 1 && (e.params.width = e.mediaTypes.banner.sizes[0][0], e.params.height = e.mediaTypes.banner.sizes[0][1], e.mediaTypes.banner.sizes = e.mediaTypes.banner.sizes.splice(1, e.mediaTypes.banner.sizes.length - 1)); + } + } + function j(e, t, r) { + var i, o = 'Ignoring param key: ' + e + ', expects ' + r + ', found ' + d(t); + switch (r) { + case m: + i = n.isBoolean; + break; + case p: + i = n.isNumber; + break; + case g: + i = n.isStr; + break; + case v: + i = n.isArray; + } + if (i(t)) { + return t; + } + n.logWarn('PubMatic: ' + o); + } + function R(e, t) { + var r = e.KEY; + return { + id: e.ID, + required: t[r].required ? 1 : 0, + data: { + type: e.TYPE, + len: t[r].len, + ext: t[r].ext + } + }; + } + function D(e) { + var t = { assets: [] }; + for (var r in e) { + if (e.hasOwnProperty(r)) { + var i = {}; + if (!(t.assets && t.assets.length > 0 && t.assets.hasOwnProperty(r))) { + switch (r) { + case y.TITLE.KEY: + e[r].len || e[r].length ? i = { + id: y.TITLE.ID, + required: e[r].required ? 1 : 0, + title: { + len: e[r].len || e[r].length, + ext: e[r].ext + } + } : n.logWarn('PubMatic: Error: Title Length is required for native ad: ' + JSON.stringify(e)); + break; + case y.IMAGE.KEY: + e[r].sizes && e[r].sizes.length > 0 ? i = { + id: y.IMAGE.ID, + required: e[r].required ? 1 : 0, + img: { + type: O, + w: e[r].w || e[r].width || (e[r].sizes ? e[r].sizes[0] : undefined), + h: e[r].h || e[r].height || (e[r].sizes ? e[r].sizes[1] : undefined), + wmin: e[r].wmin || e[r].minimumWidth || (e[r].minsizes ? e[r].minsizes[0] : undefined), + hmin: e[r].hmin || e[r].minimumHeight || (e[r].minsizes ? e[r].minsizes[1] : undefined), + mimes: e[r].mimes, + ext: e[r].ext + } + } : n.logWarn('PubMatic: Error: Image sizes is required for native ad: ' + JSON.stringify(e)); + break; + case y.ICON.KEY: + e[r].sizes && e[r].sizes.length > 0 ? i = { + id: y.ICON.ID, + required: e[r].required ? 1 : 0, + img: { + type: h, + w: e[r].w || e[r].width || (e[r].sizes ? e[r].sizes[0] : undefined), + h: e[r].h || e[r].height || (e[r].sizes ? e[r].sizes[1] : undefined) + } + } : n.logWarn('PubMatic: Error: Icon sizes is required for native ad: ' + JSON.stringify(e)); + break; + case y.VIDEO.KEY: + i = { + id: y.VIDEO.ID, + required: e[r].required ? 1 : 0, + video: { + minduration: e[r].minduration, + maxduration: e[r].maxduration, + protocols: e[r].protocols, + mimes: e[r].mimes, + ext: e[r].ext + } + }; + break; + case y.EXT.KEY: + i = { + id: y.EXT.ID, + required: e[r].required ? 1 : 0 + }; + break; + case y.LOGO.KEY: + i = { + id: y.LOGO.ID, + required: e[r].required ? 1 : 0, + img: { + type: S, + w: e[r].w || e[r].width || (e[r].sizes ? e[r].sizes[0] : undefined), + h: e[r].h || e[r].height || (e[r].sizes ? e[r].sizes[1] : undefined) + } + }; + break; + case y.SPONSOREDBY.KEY: + case y.BODY.KEY: + case y.RATING.KEY: + case y.LIKES.KEY: + case y.DOWNLOADS.KEY: + case y.PRICE.KEY: + case y.SALEPRICE.KEY: + case y.PHONE.KEY: + case y.ADDRESS.KEY: + case y.DESC2.KEY: + case y.DISPLAYURL.KEY: + case y.CTA.KEY: + i = R(x[r], e); + } + } + } + i && i.id && (t.assets[t.assets.length] = i); + } + var o = _.length, a = 0; + return _.forEach(function (e) { + for (var r = t.assets.length, n = 0; n < r; n++) { + if (e.id == t.assets[n].id) { + a++; + break; + } + } + }), A = o != a, t; + } + function k(e) { + var t, r = e.mediaTypes.banner.sizes, i = []; + if (undefined !== r && n.isArray(r)) { + if (t = {}, e.params.width || e.params.height) { + t.w = e.params.width, t.h = e.params.height; + } else { + if (0 === r.length) { + return t = undefined, n.logWarn('PubMatic: Error: mediaTypes.banner.size missing for adunit: ' + e.params.adUnit + '. Ignoring the banner impression in the adunit.'), t; + } + t.w = parseInt(r[0][0], 10), t.h = parseInt(r[0][1], 10), r = r.splice(1, r.length - 1); + } + r.length > 0 && (i = [], r.forEach(function (e) { + e.length > 1 && i.push({ + w: e[0], + h: e[1] + }); + }), i.length > 0 && (t.format = i)), t.pos = 0, t.topframe = n.inIframe() ? 0 : 1; + } else { + n.logWarn('PubMatic: Error: mediaTypes.banner.size missing for adunit: ' + e.params.adUnit + '. Ignoring the banner impression in the adunit.'), t = undefined; + } + return t; + } + function N(e) { + var t, r = e.params.video; + if (undefined !== r) { + for (var i in (t = {}, b)) { + r.hasOwnProperty(i) && (t[i] = j(i, r[i], b[i])); + } + n.isArray(e.mediaTypes.video.playerSize[0]) ? (t.w = parseInt(e.mediaTypes.video.playerSize[0][0], 10), t.h = parseInt(e.mediaTypes.video.playerSize[0][1], 10)) : n.isNumber(e.mediaTypes.video.playerSize[0]) && (t.w = parseInt(e.mediaTypes.video.playerSize[0], 10), t.h = parseInt(e.mediaTypes.video.playerSize[1], 10)), e.params.video.hasOwnProperty('skippable') && (t.ext = { video_skippable: e.params.video.skippable ? 1 : 0 }); + } else { + t = undefined, n.logWarn('PubMatic: Error: Video config params missing for adunit: ' + e.params.adUnit + ' with mediaType set as video. Ignoring video impression in the adunit.'); + } + return t; + } + function M(e, t) { + var r, i, s = {}, u = {}, c = e.hasOwnProperty('sizes') ? e.sizes : [], l = '', f = []; + if (function (e, t) { + t.params.deals && (n.isArray(t.params.deals) ? t.params.deals.forEach(function (t) { + n.isStr(t) && t.length > 3 ? (e.pmp || (e.pmp = { + private_auction: 0, + deals: [] + }), e.pmp.deals.push({ id: t })) : n.logWarn('PubMatic: Error: deal-id present in array bid.params.deals should be a strings with more than 3 charaters length, deal-id ignored: ' + t); + }) : n.logWarn('PubMatic: Error: bid.params.deals should be an array of strings.')); + }(s = { + id: e.bidId, + tagid: e.params.adUnit || void 0, + bidfloor: C('kadfloor', e.params.kadfloor), + secure: 1, + ext: { pmZoneId: C('pmzoneid', e.params.pmzoneid) }, + bidfloorcur: e.params.currency ? C('currency', e.params.currency) : 'USD' + }, e), e.hasOwnProperty('mediaTypes')) { + for (l in e.mediaTypes) { + switch (l) { + case o.BANNER: + undefined !== (r = k(e)) && (s.banner = r); + break; + case o.NATIVE: + u.request = JSON.stringify(D(e.nativeParams)), A ? n.logWarn('PubMatic: Error: Error in Native adunit ' + e.params.adUnit + '. Ignoring the adunit. Refer to http://prebid.org/dev-docs/show-native-ads.html for more details.') : s.native = u; + break; + case o.VIDEO: + undefined !== (i = N(e)) && (s.video = i); + } + } + } else { + r = { + pos: 0, + w: e.params.width, + h: e.params.height, + topframe: n.inIframe() ? 0 : 1 + }, n.isArray(c) && c.length > 1 && ((c = c.splice(1, c.length - 1)).forEach(function (e) { + f.push({ + w: e[0], + h: e[1] + }); + }), r.format = f), s.banner = r; + } + return function (e, t) { + var r = -1; + 'function' != typeof t.getFloor || a.config.getConfig('pubmatic.disableFloors') || [ + o.BANNER, + o.VIDEO, + o.NATIVE + ].forEach(function (n) { + if (e.hasOwnProperty(n)) { + var i = t.getFloor({ + currency: e.bidfloorcur, + mediaType: n, + size: '*' + }); + if ('object' === d(i) && i.currency === e.bidfloorcur && !isNaN(parseInt(i.floor))) { + var o = parseFloat(i.floor); + r = -1 == r ? o : Math.min(o, r); + } + } + }); + e.bidfloor && (r = Math.max(r, e.bidfloor)); + e.bidfloor = !isNaN(r) && r > 0 ? r : undefined; + }(s, e), s.hasOwnProperty(o.BANNER) || s.hasOwnProperty(o.NATIVE) || s.hasOwnProperty(o.VIDEO) ? s : undefined; + } + n._each(y, function (e) { + T[e.ID] = e.KEY; + }), n._each(y, function (e) { + x[e.KEY] = e; + }); + var U = { + code: 'pubmatic', + gvlid: 76, + supportedMediaTypes: [ + o.BANNER, + o.VIDEO, + o.NATIVE + ], + isBidRequestValid: function (e) { + if (e && e.params) { + if (!n.isStr(e.params.publisherId)) { + return n.logWarn('PubMatic: Error: publisherId is mandatory and cannot be numeric (wrap it in quotes in your config). Call to OpenBid will not be sent for ad unit: ' + JSON.stringify(e)), !1; + } + if (e.params.hasOwnProperty('video')) { + if (!e.params.video.hasOwnProperty('mimes') || !n.isArray(e.params.video.mimes) || 0 === e.params.video.mimes.length) { + return n.logWarn('PubMatic: Error: For video ads, mimes is mandatory and must specify atlease 1 mime value. Call to OpenBid will not be sent for ad unit:' + JSON.stringify(e)), !1; + } + if (!e.hasOwnProperty('mediaTypes') || !e.mediaTypes.hasOwnProperty(o.VIDEO)) { + return n.logError(''.concat('PubMatic: ', ': mediaTypes or mediaTypes.video is not specified. Rejecting bid: '), e), !1; + } + if (!e.mediaTypes[o.VIDEO].hasOwnProperty('context')) { + return n.logError(''.concat('PubMatic: ', ': no context specified in bid. Rejecting bid: '), e), !1; + } + if ('outstream' === e.mediaTypes[o.VIDEO].context && !n.isStr(e.params.outstreamAU) && !e.hasOwnProperty('renderer') && !e.mediaTypes[o.VIDEO].hasOwnProperty('renderer')) { + return n.logError(''.concat('PubMatic: ', ': for "outstream" bids either outstreamAU parameter must be provided or ad unit supplied renderer is required. Rejecting bid: '), e), !1; + } + } + return !0; + } + return !1; + }, + buildRequests: function (e, t) { + var r; + t && t.refererInfo && (r = t.refererInfo); + var i, s, u, l = function (e) { + return { + pageURL: e && e.referer ? e.referer : window.location.href, + refURL: window.document.referrer + }; + }(r), p = function (e) { + return { + id: '' + new Date().getTime(), + at: 1, + cur: ['USD'], + imp: [], + site: { + page: e.pageURL, + ref: e.refURL, + publisher: {} + }, + device: { + ua: navigator.userAgent, + js: 1, + dnt: 'yes' == navigator.doNotTrack || '1' == navigator.doNotTrack || '1' == navigator.msDoNotTrack ? 1 : 0, + h: screen.height, + w: screen.width, + language: navigator.language + }, + user: {}, + ext: {} + }; + }(l), g = '', m = [], v = []; + if (e.forEach(function (e) { + if ((i = n.deepClone(e)).params.adSlot = i.params.adSlot || '', P(i), i.params.hasOwnProperty('video')) { + } else if (!(i.hasOwnProperty('mediaTypes') && i.mediaTypes.hasOwnProperty(o.NATIVE) || 0 !== i.params.width || 0 !== i.params.height)) { + return void n.logWarn('PubMatic: Skipping the non-standard adslot: ', i.params.adSlot, JSON.stringify(i)); + } + l.pubId = l.pubId || i.params.publisherId, (l = function (e, t) { + var r, i, o; + for (r in (t.kadpageurl || (t.kadpageurl = t.pageURL), f)) { + f.hasOwnProperty(r) && (i = e[r]) && ('object' === d(o = f[r]) && (i = o.f(i, t)), n.isStr(i) ? t[r] = i : n.logWarn('PubMatic: Ignoring param : ' + r + ' with value : ' + f[r] + ', expects string-value, found ' + d(i))); + } + return t; + }(i.params, l)).transactionId = i.transactionId, '' === g ? g = i.params.currency || undefined : i.params.hasOwnProperty('currency') && g !== i.params.currency && n.logWarn('PubMatic: Currency specifier ignored. Only one currency permitted.'), i.params.currency = g, i.params.hasOwnProperty('dctr') && n.isStr(i.params.dctr) && m.push(i.params.dctr), i.params.hasOwnProperty('bcat') && n.isArray(i.params.bcat) && (v = v.concat(i.params.bcat)); + var t = M(i); + t && p.imp.push(t); + }), 0 != p.imp.length) { + return p.site.publisher.id = l.pubId.trim(), w = l.pubId.trim(), p.ext.wrapper = {}, p.ext.wrapper.profile = parseInt(l.profId) || undefined, p.ext.wrapper.version = parseInt(l.verId) || undefined, p.ext.wrapper.wiid = l.wiid || t.auctionId, p.ext.wrapper.wv = 'prebid_prebid_4.26.0', p.ext.wrapper.transactionId = l.transactionId, p.ext.wrapper.wp = 'pbjs', p.user.gender = l.gender ? l.gender.trim() : undefined, p.user.geo = {}, p.user.geo.lat = C('lat', l.lat), p.user.geo.lon = C('lon', l.lon), p.user.yob = C('yob', l.yob), p.device.geo = p.user.geo, p.site.page = l.kadpageurl.trim() || p.site.page.trim(), p.site.domain = (s = p.site.page, (u = document.createElement('a')).href = s, u.hostname), 'object' === d(a.config.getConfig('content')) && (p.site.content = a.config.getConfig('content')), 'object' === d(a.config.getConfig('device')) && (p.device = c(p.device, a.config.getConfig('device'))), n.deepSetValue(p, 'source.tid', l.transactionId), -1 !== window.location.href.indexOf('pubmaticTest=true') && (p.test = 1), e[0].schain && n.deepSetValue(p, 'source.ext.schain', e[0].schain), t && t.gdprConsent && (n.deepSetValue(p, 'user.ext.consent', t.gdprConsent.consentString), n.deepSetValue(p, 'regs.ext.gdpr', t.gdprConsent.gdprApplies ? 1 : 0)), t && t.uspConsent && n.deepSetValue(p, 'regs.ext.us_privacy', t.uspConsent), !0 === a.config.getConfig('coppa') && n.deepSetValue(p, 'regs.coppa', 1), function (e, t, r) { + var i, o = ''; + if (t.length > 0) { + if (r[0].params.hasOwnProperty('dctr')) { + if (o = r[0].params.dctr, n.isStr(o) && o.length > 0) { + var a = o.split('|'); + o = '', a.forEach(function (e) { + o += e.length > 0 ? e.trim() + '|' : ''; + }), i = o.length, '|' === o.substring(i, i - 1) && (o = o.substring(0, i - 1)), e.site.ext = { key_val: o.trim() }; + } else { + n.logWarn('PubMatic: Ignoring param : dctr with value : ' + o + ', expects string-value, found empty or non-string value'); + } + t.length > 1 && n.logWarn('PubMatic: dctr value found in more than 1 adunits. Value from 1st adunit will be picked. Ignoring values from subsequent adunits'); + } else { + n.logWarn('PubMatic: dctr value not found in 1st adunit, ignoring values from subsequent adunits'); + } + } + }(p, m, e), function (e, t) { + var r = n.deepAccess(t, '0.userIdAsEids'); + n.isArray(r) && r.length > 0 && n.deepSetValue(e, 'user.eids', r); + }(p, e), function (e, t) { + (t = t.filter(function (e) { + return 'string' == typeof e || (n.logWarn('PubMatic: bcat: Each category should be a string, ignoring category: ' + e), !1); + }).map(function (e) { + return e.trim(); + }).filter(function (e, t, r) { + if (e.length > 3) { + return r.indexOf(e) === t; + } + n.logWarn('PubMatic: bcat: Each category should have a value of a length of more than 3 characters, ignoring category: ' + e); + })).length > 0 && (n.logWarn('PubMatic: bcat: Selected: ', t), e.bcat = t); + }(p, v), 'object' === d(a.config.getConfig('app')) && (p.app = a.config.getConfig('app'), p.app.publisher = p.site.publisher, p.app.ext = p.site.ext || undefined, 'object' !== d(p.app.content) && (p.app.content = p.site.content || undefined), delete p.site), { + method: 'POST', + url: 'https://hbopenbid.pubmatic.com/translator?source=prebid-client', + data: JSON.stringify(p), + bidderRequest: t + }; + } + }, + interpretResponse: function (e, t) { + var r = [], i = 'USD', a = JSON.parse(t.data), s = a.site && a.site.ref ? a.site.ref : ''; + try { + e.body && e.body.seatbid && n.isArray(e.body.seatbid) && (i = e.body.cur || i, e.body.seatbid.forEach(function (e) { + e.bid && n.isArray(e.bid) && e.bid.forEach(function (u) { + var c = { + requestId: u.impid, + cpm: (parseFloat(u.price) || 0).toFixed(2), + width: u.w, + height: u.h, + creativeId: u.crid || u.id, + dealId: u.dealid, + currency: i, + netRevenue: false, + ttl: 300, + referrer: s, + ad: u.adm, + pm_seat: e.seat || null, + pm_dspid: u.ext && u.ext.dspid ? u.ext.dspid : null, + partnerImpId: u.id || '' + }; + a.imp && a.imp.length > 0 && a.imp.forEach(function (e) { + if (u.impid === e.id) { + switch (function (e, t) { + var r = '', i = new RegExp(/VAST\s+version/); + if (e.indexOf('span class="PubAPIAd"') >= 0) { + t.mediaType = o.BANNER; + } else if (i.test(e)) { + t.mediaType = o.VIDEO; + } else { + try { + (r = JSON.parse(e.replace(/\\/g, ''))) && r.native && (t.mediaType = o.NATIVE); + } catch (t) { + n.logWarn('PubMatic: Error: Cannot parse native reponse for ad response: ' + e); + } + } + }(u.adm, c), c.mediaType) { + case o.BANNER: + break; + case o.VIDEO: + c.width = u.hasOwnProperty('w') ? u.w : e.video.w, c.height = u.hasOwnProperty('h') ? u.h : e.video.h, c.vastXml = u.adm, function (e, t) { + var r, n, i; + if (t.bidderRequest && t.bidderRequest.bids) { + for (var a = 0; a < t.bidderRequest.bids.length; a++) { + t.bidderRequest.bids[a].bidId === e.requestId && (r = t.bidderRequest.bids[a].params, n = t.bidderRequest.bids[a].mediaTypes[o.VIDEO].context, i = t.bidderRequest.bids[a].adUnitCode); + } + n && 'outstream' === n && r && r.outstreamAU && i && (e.rendererCode = r.outstreamAU, e.renderer = I.newRenderer(e.rendererCode, i)); + } + }(c, t); + break; + case o.NATIVE: + !function (e, t) { + if (t.native = {}, e.hasOwnProperty('adm')) { + var r = ''; + try { + r = JSON.parse(e.adm.replace(/\\/g, '')); + } catch (e) { + return void n.logWarn('PubMatic: Error: Cannot parse native reponse for ad response: ' + t.adm); + } + if (r && r.native && r.native.assets && r.native.assets.length > 0) { + t.mediaType = o.NATIVE; + for (var i = 0, a = r.native.assets.length; i < a; i++) { + switch (r.native.assets[i].id) { + case y.TITLE.ID: + t.native.title = r.native.assets[i].title && r.native.assets[i].title.text; + break; + case y.IMAGE.ID: + t.native.image = { + url: r.native.assets[i].img && r.native.assets[i].img.url, + height: r.native.assets[i].img && r.native.assets[i].img.h, + width: r.native.assets[i].img && r.native.assets[i].img.w + }; + break; + case y.ICON.ID: + t.native.icon = { + url: r.native.assets[i].img && r.native.assets[i].img.url, + height: r.native.assets[i].img && r.native.assets[i].img.h, + width: r.native.assets[i].img && r.native.assets[i].img.w + }; + break; + case y.SPONSOREDBY.ID: + case y.BODY.ID: + case y.LIKES.ID: + case y.DOWNLOADS.ID: + case y.PRICE: + case y.SALEPRICE.ID: + case y.PHONE.ID: + case y.ADDRESS.ID: + case y.DESC2.ID: + case y.CTA.ID: + case y.RATING.ID: + case y.DISPLAYURL.ID: + t.native[T[r.native.assets[i].id]] = r.native.assets[i].data && r.native.assets[i].data.value; + } + } + t.native.clickUrl = r.native.link && r.native.link.url, t.native.clickTrackers = r.native.link && r.native.link.clicktrackers || [], t.native.impressionTrackers = r.native.imptrackers || [], t.native.jstracker = r.native.jstracker || [], t.width || (t.width = 0), t.height || (t.height = 0); + } + } + }(u, c); + } + } + }), u.ext && u.ext.deal_channel && (c.dealChannel = E[u.ext.deal_channel] || null), c.meta = {}, u.ext && u.ext.dspid && (c.meta.networkId = u.ext.dspid), u.ext && u.ext.advid && (c.meta.buyerId = u.ext.advid), u.adomain && u.adomain.length > 0 && (c.meta.advertiserDomains = u.adomain, c.meta.clickUrl = u.adomain[0]), e.ext && e.ext.buyid && (c.adserverTargeting = { hb_buyid_pubmatic: e.ext.buyid }), r.push(c); + }); + })); + } catch (e) { + n.logError(e); + } + return r; + }, + getUserSyncs: function (e, t, r, n) { + var i = '' + w; + return r && (i += '&gdpr=' + (r.gdprApplies ? 1 : 0), i += '&gdpr_consent=' + encodeURIComponent(r.consentString || '')), n && (i += '&us_privacy=' + encodeURIComponent(n)), !0 === a.config.getConfig('coppa') && (i += '&coppa=1'), e.iframeEnabled ? [{ + type: 'iframe', + url: 'https://ads.pubmatic.com/AdServer/js/showad.js#PIX&kdntuid=1&p=' + i + }] : [{ + type: 'image', + url: 'https://image8.pubmatic.com/AdServer/ImgSync?p=' + i + }]; + }, + transformBidParams: function (e, t) { + return n.convertTypes({ + publisherId: 'string', + adSlot: 'string' + }, e); + } + }; + t.spec = U, (0, i.registerBidder)(U); + }, + function (e, t, r) { + 'use strict'; + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.hasVideoMediaType = I, t.masSizeOrdering = A, t.determineRubiconVideoSizeId = T, t.getPriceGranularity = x, t.hasValidVideoParams = C, t.hasValidSupplyChainParams = P, t.encodeParam = j, t.resetUserSync = function () { + R = !1; + }, t.resetRubiConf = t.spec = void 0, r(17), r(26), r(6), r(13), r(9), r(4), r(2), r(33), r(16), r(83), r(40), r(43), r(123), r(1), r(3), r(5), r(11), r(0); + var n, i = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== v(e) && 'function' != typeof e) { + return { default: e }; + } + var t = c(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), o = r(49), a = r(22), s = r(45), u = (n = r(37)) && n.__esModule ? n : { default: n }; + function c() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return c = function () { + return e; + }, e; + } + function d(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function l(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? d(Object(r), !0).forEach(function (t) { + m(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : d(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function f() { + return (f = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function p(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return g(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return g(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function g(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function m(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function v(e) { + return (v = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var b = {}; + a.config.getConfig('rubicon', function (e) { + i.mergeDeep(b, e.rubicon); + }); + var y = { + 1: '468x60', + 2: '728x90', + 5: '120x90', + 7: '125x125', + 8: '120x600', + 9: '160x600', + 10: '300x600', + 13: '200x200', + 14: '250x250', + 15: '300x250', + 16: '336x280', + 17: '240x400', + 19: '300x100', + 31: '980x120', + 32: '250x360', + 33: '180x500', + 35: '980x150', + 37: '468x400', + 38: '930x180', + 39: '750x100', + 40: '750x200', + 41: '750x300', + 42: '2x4', + 43: '320x50', + 44: '300x50', + 48: '300x300', + 53: '1024x768', + 54: '300x1050', + 55: '970x90', + 57: '970x250', + 58: '1000x90', + 59: '320x80', + 60: '320x150', + 61: '1000x1000', + 64: '580x500', + 65: '640x480', + 66: '930x600', + 67: '320x480', + 68: '1800x1000', + 72: '320x320', + 73: '320x160', + 78: '980x240', + 79: '980x300', + 80: '980x400', + 83: '480x300', + 85: '300x120', + 90: '548x150', + 94: '970x310', + 95: '970x100', + 96: '970x210', + 101: '480x320', + 102: '768x1024', + 103: '480x280', + 105: '250x800', + 108: '320x240', + 113: '1000x300', + 117: '320x100', + 125: '800x250', + 126: '200x600', + 144: '980x600', + 145: '980x150', + 152: '1000x250', + 156: '640x320', + 159: '320x250', + 179: '250x600', + 195: '600x300', + 198: '640x360', + 199: '640x200', + 213: '1030x590', + 214: '980x360', + 221: '1x1', + 229: '320x180', + 230: '2000x1400', + 232: '580x400', + 234: '6x6', + 251: '2x2', + 256: '480x820', + 257: '400x600', + 258: '500x200', + 259: '998x200', + 264: '970x1000', + 265: '1920x1080', + 274: '1800x200', + 278: '320x500', + 282: '320x400', + 288: '640x380', + 548: '500x1000' + }; + i._each(y, function (e, t) { + return y[e] = t; + }); + var h = { + code: 'rubicon', + gvlid: 52, + supportedMediaTypes: [ + s.BANNER, + s.VIDEO + ], + isBidRequestValid: function (e) { + if ('object' !== v(e.params)) { + return !1; + } + for (var t = 0, r = [ + 'accountId', + 'siteId', + 'zoneId' + ]; t < r.length; t++) { + if (e.params[r[t]] = parseInt(e.params[r[t]]), isNaN(e.params[r[t]])) { + return i.logError('Rubicon: wrong format of accountId or siteId or zoneId.'), !1; + } + } + var n = w(e, !0); + return !!n && ('video' !== n || C(e)); + }, + buildRequests: function (e, t) { + var r = [], n = e.filter(function (e) { + return 'video' === w(e); + }).map(function (e) { + e.startTime = new Date().getTime(); + var r, n, o = { + id: e.transactionId, + test: a.config.getConfig('debug') ? 1 : 0, + cur: ['USD'], + source: { tid: e.transactionId }, + tmax: t.timeout, + imp: [{ + exp: a.config.getConfig('s2sConfig.defaultTtl'), + id: e.adUnitCode, + secure: 1, + ext: m({}, e.bidder, e.params), + video: i.deepAccess(e, 'mediaTypes.video') || {} + }], + ext: { + prebid: { + cache: { vastxml: { returnCreative: !0 === b.returnVast } }, + targeting: { + includewinners: !0, + includebidderkeys: !1, + pricegranularity: x(a.config) + }, + bidders: { rubicon: { integration: b.int_type || 'pbjs' } } + } + } + }; + if ('rubicon' !== e.bidder && (o.ext.prebid.aliases = m({}, e.bidder, 'rubicon')), 'function' != typeof e.getFloor || b.disableFloors) { + r = parseFloat(i.deepAccess(e, 'params.floor')); + } else { + var u; + try { + u = e.getFloor({ + currency: 'USD', + mediaType: 'video', + size: O(e, 'video') + }); + } catch (e) { + i.logError('Rubicon: getFloor threw an error: ', e); + } + r = 'object' !== v(u) || 'USD' !== u.currency || isNaN(parseInt(u.floor)) ? void 0 : parseFloat(u.floor); + } + (isNaN(r) || (o.imp[0].bidfloor = r), o.imp[0].ext[e.bidder].video.size_id = T(e), function (e, t, r) { + if (!e) { + return; + } + 'object' === v(a.config.getConfig('app')) ? e.app = a.config.getConfig('app') : e.site = { page: S(t, r) }; + 'object' === v(a.config.getConfig('device')) && (e.device = a.config.getConfig('device')); + t.params.video.language && [ + 'site', + 'device' + ].forEach(function (r) { + e[r] && (e[r].content = f({ language: t.params.video.language }, e[r].content)); + }); + }(o, e, t), function (e, t) { + 'object' === v(e.imp[0].video) && void 0 === e.imp[0].video.skip && (e.imp[0].video.skip = t.params.video.skip); + 'object' === v(e.imp[0].video) && void 0 === e.imp[0].video.skipafter && (e.imp[0].video.skipafter = t.params.video.skipdelay); + 'object' === v(e.imp[0].video) && void 0 === e.imp[0].video.pos && ('atf' === t.params.position ? e.imp[0].video.pos = 1 : 'btf' === t.params.position && (e.imp[0].video.pos = 3)); + var r = O(t, 'video'); + e.imp[0].video.w = r[0], e.imp[0].video.h = r[1]; + }(o, e), t.gdprConsent) && ('boolean' == typeof t.gdprConsent.gdprApplies && (n = t.gdprConsent.gdprApplies ? 1 : 0), i.deepSetValue(o, 'regs.ext.gdpr', n), i.deepSetValue(o, 'user.ext.consent', t.gdprConsent.consentString)); + t.uspConsent && i.deepSetValue(o, 'regs.ext.us_privacy', t.uspConsent); + var c = i.deepAccess(t, 'bids.0.userIdAsEids'); + c && c.length && i.deepSetValue(o, 'user.ext.eids', c); + var d = a.config.getConfig('user.id'); + return d && i.deepSetValue(o, 'user.id', d), !0 === a.config.getConfig('coppa') && i.deepSetValue(o, 'regs.coppa', 1), e.schain && P(e.schain) && i.deepSetValue(o, 'source.ext.schain', e.schain), _(e, s.VIDEO, o), e.storedAuctionResponse && i.deepSetValue(o.imp[0], 'ext.prebid.storedauctionresponse.id', e.storedAuctionResponse.toString()), i.deepSetValue(o.imp[0], 'ext.prebid.auctiontimestamp', t.auctionStart), { + method: 'POST', + url: 'https://'.concat(b.videoHost || 'prebid-server', '.rubiconproject.com/openrtb2/auction'), + data: o, + bidRequest: e + }; + }); + if (!0 !== b.singleRequest) { + r = n.concat(e.filter(function (e) { + return 'banner' === w(e); + }).map(function (e) { + var r = h.createSlotParams(e, t); + return { + method: 'GET', + url: 'https://'.concat(b.bannerHost || 'fastlane', '.rubiconproject.com/a/api/fastlane.json'), + data: h.getOrderedParams(r).reduce(function (e, t) { + var n = r[t]; + return i.isStr(n) && '' !== n || i.isNumber(n) ? ''.concat(e).concat(j(t, n), '&') : e; + }, '') + 'slots=1&rand='.concat(Math.random()), + bidRequest: e + }; + })); + } else { + var o = e.filter(function (e) { + return 'banner' === w(e); + }).reduce(function (e, t) { + return (e[t.params.siteId] = e[t.params.siteId] || []).push(t), e; + }, {}); + r = n.concat(Object.keys(o).reduce(function (e, r) { + var n, a; + return (n = o[r], a = 10, n.map(function (e, t) { + return t % a == 0 ? n.slice(t, t + a) : null; + }).filter(function (e) { + return e; + })).forEach(function (r) { + var n = h.combineSlotUrlParams(r.map(function (e) { + return h.createSlotParams(e, t); + })); + e.push({ + method: 'GET', + url: 'https://'.concat(b.bannerHost || 'fastlane', '.rubiconproject.com/a/api/fastlane.json'), + data: h.getOrderedParams(n).reduce(function (e, t) { + var r = n[t]; + return i.isStr(r) && '' !== r || i.isNumber(r) ? ''.concat(e).concat(j(t, r), '&') : e; + }, '') + 'slots='.concat(r.length, '&rand=').concat(Math.random()), + bidRequest: r + }); + }), e; + }, [])); + } + return r; + }, + getOrderedParams: function (e) { + var t = /^tg_v/, r = /^tg_i/, n = /^eid_|^tpid_/, i = [ + 'account_id', + 'site_id', + 'zone_id', + 'size_id', + 'alt_size_ids', + 'p_pos', + 'gdpr', + 'gdpr_consent', + 'us_privacy', + 'rp_schain' + ].concat(Object.keys(e).filter(function (e) { + return n.test(e); + })).concat([ + 'x_liverampidl', + 'ppuid', + 'rf', + 'p_geo.latitude', + 'p_geo.longitude', + 'kw' + ]).concat(Object.keys(e).filter(function (e) { + return t.test(e); + })).concat(Object.keys(e).filter(function (e) { + return r.test(e); + })).concat([ + 'tk_flint', + 'x_source.tid', + 'x_source.pchain', + 'p_screen_res', + 'rp_floor', + 'rp_secure', + 'tk_user_key' + ]); + return i.concat(Object.keys(e).filter(function (e) { + return -1 === i.indexOf(e); + })); + }, + combineSlotUrlParams: function (e) { + if (1 === e.length) { + return e[0]; + } + var t = e.reduce(function (t, r, n) { + return Object.keys(r).forEach(function (i) { + t.hasOwnProperty(i) || (t[i] = new Array(e.length)), t[i].splice(n, 1, r[i]); + }), t; + }, {}), r = new RegExp('^([^;]*)(;\\1)+$'); + return Object.keys(t).forEach(function (e) { + var n = t[e].join(';'), i = n.match(r); + t[e] = i ? i[1] : n; + }), t; + }, + createSlotParams: function (e, t) { + e.startTime = new Date().getTime(); + var r = e.params, n = O(e, 'banner'), o = p(r.latLong || [], 2), c = o[0], d = o[1], l = { + account_id: r.accountId, + site_id: r.siteId, + zone_id: r.zoneId, + size_id: n[0], + alt_size_ids: n.slice(1).join(',') || void 0, + rp_floor: (r.floor = parseFloat(r.floor)) >= 0.01 ? r.floor : void 0, + rp_secure: '1', + tk_flint: ''.concat(b.int_type || 'pbjs_lite', '_v4.26.0'), + 'x_source.tid': e.transactionId, + 'x_source.pchain': r.pchain, + p_screen_res: [ + window.screen.width, + window.screen.height + ].join('x'), + tk_user_key: r.userId, + 'p_geo.latitude': isNaN(parseFloat(c)) ? void 0 : parseFloat(c).toFixed(4), + 'p_geo.longitude': isNaN(parseFloat(d)) ? void 0 : parseFloat(d).toFixed(4), + 'tg_fl.eid': e.code, + rf: S(e, t) + }; + if ('function' == typeof e.getFloor && !b.disableFloors) { + var f; + try { + f = e.getFloor({ + currency: 'USD', + mediaType: 'banner', + size: '*' + }); + } catch (e) { + i.logError('Rubicon: getFloor threw an error: ', e); + } + l.rp_hard_floor = 'object' !== v(f) || 'USD' !== f.currency || isNaN(parseInt(f.floor)) ? void 0 : f.floor; + } + l.p_pos = 'atf' === r.position || 'btf' === r.position ? r.position : ''; + var g = a.config.getConfig('user.id'); + return g && (l.ppuid = g), e.userIdAsEids && e.userIdAsEids.forEach(function (e) { + try { + if ('adserver.org' === e.source ? (l.tpid_tdid = e.uids[0].id, l['eid_adserver.org'] = e.uids[0].id) : 'liveintent.com' === e.source ? (l['tpid_liveintent.com'] = e.uids[0].id, l['eid_liveintent.com'] = e.uids[0].id, e.ext && Array.isArray(e.ext.segments) && e.ext.segments.length && (l['tg_v.LIseg'] = e.ext.segments.join(','))) : 'liveramp.com' === e.source ? l.x_liverampidl = e.uids[0].id : 'sharedid.org' === e.source ? l['eid_sharedid.org'] = ''.concat(e.uids[0].id, '^').concat(e.uids[0].atype, '^').concat(e.uids[0].ext && e.uids[0].ext.third || '') : 'id5-sync.com' === e.source ? l['eid_id5-sync.com'] = ''.concat(e.uids[0].id, '^').concat(e.uids[0].atype, '^').concat(e.uids[0].ext && e.uids[0].ext.linkType || '') : l['eid_'.concat(e.source)] = ''.concat(e.uids[0].id, '^').concat(e.uids[0].atype || ''), !l.ppuid) { + var t = (0, u.default)(e.uids, function (e) { + return e.ext && 'ppuid' === e.ext.stype; + }); + t && t.id && (l.ppuid = t.id); + } + } catch (t) { + i.logWarn('Rubicon: error reading eid:', e, t); + } + }), t.gdprConsent && ('boolean' == typeof t.gdprConsent.gdprApplies && (l.gdpr = Number(t.gdprConsent.gdprApplies)), l.gdpr_consent = t.gdprConsent.consentString), t.uspConsent && (l.us_privacy = encodeURIComponent(t.uspConsent)), _(e, s.BANNER, l), !0 === a.config.getConfig('coppa') && (l.coppa = 1), e.schain && P(e.schain) && (l.rp_schain = h.serializeSupplyChain(e.schain)), l; + }, + serializeSupplyChain: function (e) { + if (!P(e)) { + return ''; + } + var t = e.ver, r = e.complete, n = e.nodes; + return ''.concat(t, ',').concat(r, '!').concat(h.serializeSupplyChainNodes(n)); + }, + serializeSupplyChainNodes: function (e) { + var t = [ + 'asi', + 'sid', + 'hp', + 'rid', + 'name', + 'domain' + ]; + return e.map(function (e) { + return t.map(function (t) { + return encodeURIComponent(e[t] || ''); + }).join(','); + }).join('!'); + }, + interpretResponse: function (e, t) { + var r = t.bidRequest; + if (!(e = e.body) || 'object' !== v(e)) { + return []; + } + if (e.seatbid) { + var n = i.deepAccess(e, 'ext.errors.rubicon'); + Array.isArray(n) && n.length > 0 && i.logWarn('Rubicon: Error in video response'); + var o = []; + return e.seatbid.forEach(function (t) { + (t.bid || []).forEach(function (n) { + var a = { + requestId: r.bidId, + currency: e.cur || 'USD', + creativeId: n.crid, + cpm: n.price || 0, + bidderCode: t.seat, + ttl: 300, + netRevenue: !1 !== b.netRevenue, + width: n.w || i.deepAccess(r, 'mediaTypes.video.w') || i.deepAccess(r, 'params.video.playerWidth'), + height: n.h || i.deepAccess(r, 'mediaTypes.video.h') || i.deepAccess(r, 'params.video.playerHeight') + }; + n.id && (a.seatBidId = n.id), n.dealid && (a.dealId = n.dealid), n.adomain && i.deepSetValue(a, 'meta.advertiserDomains', Array.isArray(n.adomain) ? n.adomain : [n.adomain]), i.deepAccess(n, 'ext.bidder.rp.advid') && i.deepSetValue(a, 'meta.advertiserId', n.ext.bidder.rp.advid); + var u = i.deepAccess(e, 'ext.responsetimemillis.rubicon'); + if (r && u && (r.serverResponseTimeMs = u), i.deepAccess(n, 'ext.prebid.type') === s.VIDEO) { + a.mediaType = s.VIDEO, i.deepSetValue(a, 'meta.mediaType', s.VIDEO); + var c = i.deepAccess(n, 'ext.prebid.targeting'); + c && 'object' === v(c) && (a.adserverTargeting = c), n.ext.prebid.cache && 'object' === v(n.ext.prebid.cache.vastXml) && n.ext.prebid.cache.vastXml.cacheId && n.ext.prebid.cache.vastXml.url ? (a.videoCacheKey = n.ext.prebid.cache.vastXml.cacheId, a.vastUrl = n.ext.prebid.cache.vastXml.url) : c && c.hb_uuid && c.hb_cache_host && c.hb_cache_path && (a.videoCacheKey = c.hb_uuid, a.vastUrl = 'https://'.concat(c.hb_cache_host).concat(c.hb_cache_path, '?uuid=').concat(c.hb_uuid)), n.adm && (a.vastXml = n.adm), n.nurl && (a.vastUrl = n.nurl), !a.vastUrl && n.nurl && (a.vastUrl = n.nurl); + } else { + i.logWarn('Rubicon: video response received non-video media type'); + } + o.push(a); + }); + }), o; + } + var a = e.ads; + return 'object' !== v(r) || Array.isArray(r) || 'video' !== w(r) || 'object' !== v(a) || (a = a[r.adUnitCode]), !Array.isArray(a) || a.length < 1 ? [] : a.reduce(function (t, n, o) { + if ('ok' !== n.status) { + return t; + } + var a, u, c = Array.isArray(r) ? r[o] : r; + if (c && 'object' === v(c)) { + var d = { + requestId: c.bidId, + currency: 'USD', + creativeId: n.creative_id || ''.concat(n.network || '', '-').concat(n.advertiser || ''), + cpm: n.cpm || 0, + dealId: n.deal, + ttl: 300, + netRevenue: !1 !== b.netRevenue, + rubicon: { + advertiserId: n.advertiser, + networkId: n.network + }, + meta: { + advertiserId: n.advertiser, + networkId: n.network, + mediaType: s.BANNER + } + }; + if (n.creative_type && (d.mediaType = n.creative_type), n.adomain && (d.meta.advertiserDomains = Array.isArray(n.adomain) ? n.adomain : [n.adomain]), n.creative_type === s.VIDEO) { + d.width = c.params.video.playerWidth, d.height = c.params.video.playerHeight, d.vastUrl = n.creative_depot_url, d.impression_id = n.impression_id, d.videoCacheKey = n.impression_id; + } else { + d.ad = (a = n.script, u = n.impression_id, '\n\n\n\n
\n\n
\n\n')); + var l = p(y[n.size_id].split('x').map(function (e) { + return Number(e); + }), 2); + d.width = l[0], d.height = l[1]; + } + d.rubiconTargeting = (Array.isArray(n.targeting) ? n.targeting : []).reduce(function (e, t) { + return e[t.key] = t.values[0], e; + }, { rpfl_elemid: c.adUnitCode }), t.push(d); + } else { + i.logError('Rubicon: bidRequest undefined at index position:'.concat(o), r, e); + } + return t; + }, []).sort(function (e, t) { + return (t.cpm || 0) - (e.cpm || 0); + }); + }, + getUserSyncs: function (e, t, r, n) { + if (!R && e.iframeEnabled) { + var i = ''; + return r && 'string' == typeof r.consentString && ('boolean' == typeof r.gdprApplies ? i += '?gdpr='.concat(Number(r.gdprApplies), '&gdpr_consent=').concat(r.consentString) : i += '?gdpr_consent='.concat(r.consentString)), n && (i += ''.concat(i ? '&' : '?', 'us_privacy=').concat(encodeURIComponent(n))), R = !0, { + type: 'iframe', + url: 'https://'.concat(b.syncHost || 'eus', '.rubiconproject.com/usync.html') + i + }; + } + }, + transformBidParams: function (e, t) { + return i.convertTypes({ + accountId: 'number', + siteId: 'number', + zoneId: 'number' + }, e); + } + }; + function S(e, t) { + var r = a.config.getConfig('pageUrl'); + return e.params.referrer ? r = e.params.referrer : r || (r = t.refererInfo.referer), e.params.secure ? r.replace(/^http:/i, 'https:') : r; + } + function O(e, t) { + var r = e.params; + if ('video' === t) { + var n = []; + return r.video && r.video.playerWidth && r.video.playerHeight ? n = [ + r.video.playerWidth, + r.video.playerHeight + ] : Array.isArray(i.deepAccess(e, 'mediaTypes.video.playerSize')) && 1 === e.mediaTypes.video.playerSize.length ? n = e.mediaTypes.video.playerSize[0] : Array.isArray(e.sizes) && e.sizes.length > 0 && Array.isArray(e.sizes[0]) && e.sizes[0].length > 1 && (n = e.sizes[0]), n; + } + var o = []; + return Array.isArray(r.sizes) ? o = r.sizes : void 0 !== i.deepAccess(e, 'mediaTypes.banner.sizes') ? o = E(e.mediaTypes.banner.sizes) : Array.isArray(e.sizes) && e.sizes.length > 0 ? o = E(e.sizes) : i.logWarn('Rubicon: no sizes are setup or found'), A(o); + } + function _(e, t, r) { + var n = { + user: l({}, e.params.visitor), + context: l({}, e.params.inventory) + }; + e.params.keywords && (n.context.keywords = i.isArray(e.params.keywords) ? e.params.keywords.join(',') : e.params.keywords); + var o = i.mergeDeep({}, a.config.getConfig('fpd') || {}, e.fpd || {}, n), u = { + user: { + banner: 'tg_v.', + code: 'user' + }, + context: { + banner: 'tg_i.', + code: 'site' + }, + adserver: 'dfp_ad_unit_code' + }, c = {}, d = {}, f = [], p = function (e, t) { + if ('object' !== v(e) || Array.isArray(e)) { + if (void 0 !== e) { + return Array.isArray(e) ? e.filter(function (e) { + if ('object' !== v(e) && void 0 !== e) { + return e.toString(); + } + i.logWarn('Rubicon: Filtered value: ', e, 'for key', t, ': Expected value to be string, integer, or an array of strings/ints'); + }).toString() : e.toString(); + } + } else { + i.logWarn('Rubicon: Filtered FPD key: ', t, ': Expected value to be string, integer, or an array of strings/ints'); + } + }; + if (Object.keys(o).filter(function (e) { + return o[e] && u[e] && 'object' === v(o[e]); + }).forEach(function (e) { + if (c[u[e].code] = Object.keys(o[e]).filter(function (t) { + return void 0 !== o[e][t]; + }).reduce(function (r, n) { + return 'keywords' === n ? (Array.isArray(o[e][n]) || t !== s.BANNER || (o[e][n] = [o[e][n]]), r[n] = o[e][n], t === s.BANNER && (f = f.concat(o[e][n]))) : 'data' === n ? i.mergeDeep(r, { ext: { data: o[e][n] } }) : 'adServer' === n || 'pbAdSlot' === n ? 'adServer' === n ? [ + 'name', + 'adSlot' + ].forEach(function (t) { + var r = p(o[e][n][t]); + r && i.deepSetValue(d, 'adserver.'.concat(t.toLowerCase()), r.replace(/^\/+/, '')); + }) : d[n.toLowerCase()] = o[e][n].replace(/^\/+/, '') : i.mergeDeep(r, { ext: { data: m({}, n, o[e][n]) } }), r; + }, {}), t === s.BANNER) { + var n = 'object' === v(c[u[e].code].ext) && c[u[e].code].ext.data || {}; + Object.keys(n).forEach(function (t) { + var i = 'adserver' === t ? n.adserver.adslot : p(n[t], t); + i && (r[u[t] ? ''.concat(u[e][s.BANNER]).concat(u[t]) : ''.concat(u[e][s.BANNER]).concat(t)] = i); + }); + } + }), Object.keys(d).forEach(function (e) { + t === s.BANNER ? u[e] ? r['tg_i.'.concat(u[e])] = d[e].adslot : r['tg_i.'.concat(e.toLowerCase())] = d[e] : i.mergeDeep(r.imp[0], { ext: { context: { data: m({}, e, d[e]) } } }); + }), t === s.BANNER) { + var g = p(f, 'keywords'); + g && (r.kw = g); + } else { + i.mergeDeep(r, c); + } + } + function E(e) { + return i.parseSizesInput(e).reduce(function (e, t) { + var r = parseInt(y[t], 10); + return r && e.push(r), e; + }, []); + } + function I(e) { + return 'object' === v(i.deepAccess(e, 'params.video')) && void 0 !== i.deepAccess(e, 'mediaTypes.'.concat(s.VIDEO)); + } + function w(e) { + var t = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; + return I(e) ? -1 === [ + 'outstream', + 'instream' + ].indexOf(i.deepAccess(e, 'mediaTypes.'.concat(s.VIDEO, '.context'))) ? void (t && i.logError('Rubicon: mediaTypes.video.context must be outstream or instream')) : O(e, 'video').length < 2 ? void (t && i.logError('Rubicon: could not determine the playerSize of the video')) : (t && i.logMessage('Rubicon: making video request for adUnit', e.adUnitCode), 'video') : 0 === O(e, 'banner').length ? void (t && i.logError('Rubicon: could not determine the sizes for banner request')) : (t && i.logMessage('Rubicon: making banner request for adUnit', e.adUnitCode), 'banner'); + } + t.spec = h; + function A(e) { + var t = [ + 15, + 2, + 9 + ]; + return e.sort(function (e, r) { + var n = t.indexOf(e), i = t.indexOf(r); + return n > -1 || i > -1 ? -1 === n ? 1 : -1 === i ? -1 : n - i : e - r; + }); + } + function T(e) { + var t = parseInt(i.deepAccess(e, 'params.video.size_id')); + return isNaN(t) ? 'outstream' === i.deepAccess(e, 'mediaTypes.'.concat(s.VIDEO, '.context')) ? 203 : 201 : t; + } + function x(e) { + return { + ranges: { + low: [{ + max: 5, + increment: 0.5 + }], + medium: [{ + max: 20, + increment: 0.1 + }], + high: [{ + max: 20, + increment: 0.01 + }], + auto: [ + { + max: 5, + increment: 0.05 + }, + { + min: 5, + max: 10, + increment: 0.1 + }, + { + min: 10, + max: 20, + increment: 0.5 + } + ], + dense: [ + { + max: 3, + increment: 0.01 + }, + { + min: 3, + max: 8, + increment: 0.05 + }, + { + min: 8, + max: 20, + increment: 0.5 + } + ], + custom: e.getConfig('customPriceBucket') && e.getConfig('customPriceBucket').buckets + }[e.getConfig('priceGranularity')] + }; + } + function C(e) { + var t = !0, r = Object.prototype.toString.call([]), n = Object.prototype.toString.call(0), o = { + mimes: r, + protocols: r, + maxduration: n, + linearity: n, + api: r + }; + return Object.keys(o).forEach(function (r) { + Object.prototype.toString.call(i.deepAccess(e, 'mediaTypes.video.' + r)) !== o[r] && (t = !1, i.logError('Rubicon: mediaTypes.video.' + r + ' is required and must be of type: ' + o[r])); + }), t; + } + function P(e) { + var t = !1, r = [ + 'asi', + 'sid', + 'hp' + ]; + return e.nodes ? ((t = e.nodes.reduce(function (e, t) { + return e ? r.every(function (e) { + return t.hasOwnProperty(e); + }) : e; + }, !0)) || i.logError('Rubicon: required schain params missing'), t) : t; + } + function j(e, t) { + return 'rp_schain' === e ? 'rp_schain='.concat(t) : ''.concat(e, '=').concat(encodeURIComponent(t)); + } + t.resetRubiConf = function () { + return b = {}; + }; + var R = !1; + (0, o.registerBidder)(h); + }, + function (e, t, r) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), t._getPlatform = S, t._isInbounds = t.spec = void 0, r(6), r(13), r(9), r(11), r(4), r(2), r(26), r(386), r(40), r(16), r(1), r(3), r(0), r(5); + var n = r(49), i = r(7), o = r(45), a = r(22), s = r(76), u = r(126); + function c(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return d(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return d(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function d(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function l() { + return (l = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function f(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + var p = (0, i.generateUUID)(), g = 'https://mtrx.go.sonobi.com/sbi_outstream_renderer.js', m = { + code: 'sonobi', + supportedMediaTypes: [ + o.BANNER, + o.VIDEO + ], + isBidRequestValid: function (e) { + if (!e.params) { + return !1; + } + if (!e.params.ad_unit && !e.params.placement_id) { + return !1; + } + if (!(0, i.deepAccess)(e, 'mediaTypes.banner') && !(0, i.deepAccess)(e, 'mediaTypes.video')) { + return !1; + } + if ((0, i.deepAccess)(e, 'mediaTypes.banner')) { + if (!(0, i.deepAccess)(e, 'mediaTypes.banner.sizes') && !e.params.sizes) { + return !1; + } + } else if ((0, i.deepAccess)(e, 'mediaTypes.video')) { + if ('outstream' === (0, i.deepAccess)(e, 'mediaTypes.video.context') && !e.params.sizes) { + return !1; + } + if ('instream' === (0, i.deepAccess)(e, 'mediaTypes.video.context') && !(0, i.deepAccess)(e, 'mediaTypes.video.playerSize')) { + return !1; + } + } + return !0; + }, + buildRequests: function (e, t) { + var r = e.map(function (e) { + var t = function (e) { + if (e.params.ad_unit) { + return e.params.ad_unit; + } + return e.params.placement_id; + }(e); + return /^[\/]?[\d]+[[\/].+[\/]?]?$/.test(t) ? (t = '/' === t.charAt(0) ? t : '/' + t, f({}, ''.concat(t, '|').concat(e.bidId), ''.concat(v(e)).concat(b(e)))) : /^[0-9a-fA-F]{20}$/.test(t) && 20 === t.length ? f({}, e.bidId, ''.concat(t, '|').concat(v(e)).concat(b(e))) : void (0, i.logError)('The ad unit code or Sonobi Placement id for slot '.concat(e.bidId, ' is invalid')); + }), n = {}; + r.forEach(function (e) { + l(n, e); + }); + var o = { + key_maker: JSON.stringify(n), + ref: t.refererInfo.referer, + s: (0, i.generateUUID)(), + pv: p, + vp: S(), + lib_name: 'prebid', + lib_v: '4.26.0', + us: 0 + }; + a.config.getConfig('userSync') && a.config.getConfig('userSync').syncsPerBidder && (o.us = a.config.getConfig('userSync').syncsPerBidder), u.userSync.canBidderRegisterSync('iframe', 'sonobi') ? o.ius = 1 : o.ius = 0, (0, i.deepAccess)(e[0], 'params.hfa') && (o.hfa = (0, i.deepAccess)(e[0], 'params.hfa')), e[0].params.referrer && (o.ref = e[0].params.referrer), t && t.gdprConsent && (o.gdpr = t.gdprConsent.gdprApplies ? 'true' : 'false', t.gdprConsent.consentString && (o.consent_string = t.gdprConsent.consentString)), e[0].schain && (o.schain = JSON.stringify(e[0].schain)), (0, i.deepAccess)(e[0], 'userId') && Object.keys(e[0].userId).length > 0 && (o.userid = JSON.stringify(e[0].userId)); + var s = e[0].params.keywords; + if (s && (o.kw = s), t && t.uspConsent && (o.us_privacy = t.uspConsent), (0, i.isEmpty)(n)) { + return null; + } + var c = 'https://apex.go.sonobi.com/trinity.json'; + return (0, i.deepAccess)(e[0], 'params.bid_request_url') && (c = (0, i.deepAccess)(e[0], 'params.bid_request_url')), { + method: 'GET', + url: c, + withCredentials: !0, + data: o, + bidderRequests: e + }; + }, + interpretResponse: function (e, t) { + var r = e.body, n = [], o = t.data.ref; + return 0 === Object.keys(r.slots).length || Object.keys(r.slots).forEach(function (e) { + var a = r.slots[e], u = e.split('|').slice(-1)[0], d = function (e, t) { + for (var r = 0; r < e.length; r++) { + if (e[r].bidId === t) { + return e[r]; + } + } + }(t.bidderRequests, u), l = null; + 'video' === a.sbi_ct && (l = 'video', 'outstream' === (0, i.deepAccess)(d, 'mediaTypes.video.context') && (l = 'outstream')); + var f = y(l, o); + if (a.sbi_aid && a.sbi_mouse && a.sbi_size) { + var p = c(a.sbi_size.split('x'), 2), m = p[0], v = void 0 === m ? 1 : m, b = p[1], h = void 0 === b ? 1 : b, S = { + requestId: u, + cpm: Number(a.sbi_mouse), + width: Number(v), + height: Number(h), + ad: f(r.sbi_dc, a.sbi_aid), + ttl: 500, + creativeId: a.sbi_crid || a.sbi_aid, + aid: a.sbi_aid, + netRevenue: !0, + currency: 'USD' + }; + if (a.sbi_dozer && (S.dealId = a.sbi_dozer), 'video' === l) { + S.mediaType = 'video', S.vastUrl = f(r.sbi_dc, a.sbi_aid), delete S.ad, delete S.width, delete S.height; + } else if ('outstream' === l && d) { + S.mediaType = 'video', S.vastUrl = f(r.sbi_dc, a.sbi_aid), S.renderer = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, n = s.Renderer.install({ + id: t.aid, + url: g, + config: r, + loaded: !1, + adUnitCode: e + }); + try { + n.setRender(O); + } catch (e) { + (0, i.logWarn)('Prebid Error calling setRender on renderer', e); + } + return n.setEventHandlers({ + impression: function () { + return (0, i.logMessage)('Sonobi outstream video impression event'); + }, + loaded: function () { + return (0, i.logMessage)('Sonobi outstream video loaded event'); + }, + ended: function () { + (0, i.logMessage)('Sonobi outstream renderer video event'); + } + }), n; + }(d.adUnitCode, S, (0, i.deepAccess)(d, 'renderer.options')); + var _ = (0, i.deepAccess)(d, 'params.sizes'); + Array.isArray(_) && Array.isArray(_[0]) && (_ = _[0]), _ && (S.width = _[0], S.height = _[1]); + } + n.push(S); + } + }), n; + }, + getUserSyncs: function (e, t, r, n) { + var i = []; + try { + e.pixelEnabled && t[0].body.sbi_px.forEach(function (e) { + i.push({ + type: e.type, + url: e.url + }); + }); + } catch (e) { + } + return i; + } + }; + function v(e) { + return (0, i.deepAccess)(e, 'mediaTypes.video') ? '' : e.params.sizes ? (0, i.parseSizesInput)(e.params.sizes).join(',') : (0, i.deepAccess)(e, 'mediaTypes.banner.sizes') ? (0, i.parseSizesInput)((0, i.deepAccess)(e, 'mediaTypes.banner.sizes')).join(',') : e.sizes ? (0, i.parseSizesInput)(e.sizes).join(',') : void 0; + } + function b(e) { + return e.params.floor ? '|f='.concat(e.params.floor) : ''; + } + t.spec = m; + var y = function (e, t) { + return function (r, n) { + return 'video' === e || 'outstream' === e ? function (e, t, r) { + return 'https://'.concat(e, 'apex.go.sonobi.com/vast.xml?vid=').concat(t, '&ref=').concat(encodeURIComponent(r)); + }(r, n, t) : ''; + }; + }; + var h = function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : window; + return function () { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_SAFE_INTEGER; + return e.innerWidth >= t && e.innerWidth < r; + }; + }; + function S() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : window, t = h(e), r = { lt: 768 }, n = { + lt: 992, + ge: 768 + }; + return t(0, r.lt) ? 'mobile' : t(n.ge, n.lt) ? 'tablet' : 'desktop'; + } + function O(e) { + e.renderer.push(function () { + var t = c(e.getSize().split('x'), 2), r = t[0], n = t[1], i = new window.SbiOutstreamRenderer(); + i.init({ + vastUrl: e.vastUrl, + height: n, + width: r + }), i.setRootElement(e.adUnitCode); + }); + } + t._isInbounds = h, (0, n.registerBidder)(m); + }, + function (e, t, r) { + var n = r(14); + n(n.S, 'Number', { MAX_SAFE_INTEGER: 9007199254740991 }); + }, + function (e, t, r) { + 'use strict'; + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(9), r(11), r(6), r(13), r(17), r(4), r(2), r(1), r(3), r(0), r(5), r(43); + var n = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== v(e) && 'function' != typeof e) { + return { default: e }; + } + var t = d(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), i = r(45), o = r(22), a = c(r(37)), s = c(r(388)), u = r(49); + function c(e) { + return e && e.__esModule ? e : { default: e }; + } + function d() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return d = function () { + return e; + }, e; + } + function l(e) { + return function (e) { + if (Array.isArray(e)) { + return f(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return f(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return f(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function f(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + function p(e, t) { + var r = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var n = Object.getOwnPropertySymbols(e); + t && (n = n.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), r.push.apply(r, n); + } + return r; + } + function g(e) { + for (var t = 1; t < arguments.length; t++) { + var r = null != arguments[t] ? arguments[t] : {}; + t % 2 ? p(Object(r), !0).forEach(function (t) { + m(e, t, r[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(r)) : p(Object(r)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(r, t)); + }); + } + return e; + } + function m(e, t, r) { + return t in e ? Object.defineProperty(e, t, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = r, e; + } + function v(e) { + return (v = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var b = [ + i.BANNER, + i.VIDEO + ], y = { JPY: 1 }; + function h(e) { + var t = O(e); + return t.banner = {}, t.banner.w = e.params.size[0], t.banner.h = e.params.size[1], t.banner.topframe = n.inIframe() ? 0 : 1, t; + } + function S(e) { + var t = O(e), r = n.deepAccess(e, 'mediaTypes.video'), i = n.deepAccess(e, 'mediaTypes.video.context'), o = [ + 'mimes', + 'minduration', + 'maxduration', + 'protocols', + 'protocol', + 'startdelay', + 'placement', + 'linearity', + 'skip', + 'skipmin', + 'skipafter', + 'sequence', + 'battr', + 'maxextended', + 'minbitrate', + 'maxbitrate', + 'boxingallowed', + 'playbackmethod', + 'playbackend', + 'delivery', + 'pos', + 'companionad', + 'api', + 'companiontype', + 'ext' + ]; + for (var a in (t.video = n.deepClone(e.params.video), t.video.w = e.params.size[0], t.video.h = e.params.size[1], i && ('instream' === i ? t.video.placement = 1 : 'outstream' === i ? t.video.placement = 4 : n.logWarn('ix bidder params: video context \''.concat(i, '\' is not supported'))), r)) { + -1 === o.indexOf(a) || t.video.hasOwnProperty(a) || (t.video[a] = r[a]); + } + return t; + } + function O(e) { + var t = {}; + return t.id = e.bidId, t.ext = {}, t.ext.siteID = e.params.siteId, !e.params.hasOwnProperty('id') || 'string' != typeof e.params.id && 'number' != typeof e.params.id ? t.ext.sid = ''.concat(e.params.size[0], 'x').concat(e.params.size[1]) : t.ext.sid = String(e.params.id), e.params.hasOwnProperty('bidFloor') && e.params.hasOwnProperty('bidFloorCur') && (t.bidfloor = e.params.bidFloor, t.bidfloorcur = e.params.bidFloorCur), t; + } + function _(e, t, r) { + var o = {}; + return y.hasOwnProperty(t) ? o.cpm = e.price / y[t] : o.cpm = e.price / 100, o.requestId = e.impid, o.dealId = n.deepAccess(e, 'ext.dealid'), o.netRevenue = true, o.currency = t, o.creativeId = e.hasOwnProperty('crid') ? e.crid : '-', n.deepAccess(e, 'ext.vasturl') ? (o.vastUrl = e.ext.vasturl, o.width = r.video.w, o.height = r.video.h, o.mediaType = i.VIDEO, o.ttl = 3600) : (o.ad = e.adm, o.width = e.w, o.height = e.h, o.mediaType = i.BANNER, o.ttl = 300), o.meta = {}, o.meta.networkId = n.deepAccess(e, 'ext.dspid'), o.meta.brandId = n.deepAccess(e, 'ext.advbrandid'), o.meta.brandName = n.deepAccess(e, 'ext.advbrand'), e.adomain && e.adomain.length > 0 && (o.meta.advertiserDomains = e.adomain), o; + } + function E(e) { + return Array.isArray(e) && 2 === e.length && (0, s.default)(e[0]) && (0, s.default)(e[1]); + } + function I(e, t) { + if (E(e)) { + return e[0] === t[0] && e[1] === t[1]; + } + for (var r = 0; r < e.length; r++) { + if (e[r][0] === t[0] && e[r][1] === t[1]) { + return !0; + } + } + return !1; + } + function w(e, t) { + if (e) { + return (0, a.default)(t, function (t) { + return t.id === e; + }); + } + } + function A(e, t, r, i) { + var a = [], s = 'https://htlb.casalemedia.com/cygnus', u = {}, c = e[0].userId; + if (c && 'object' === v(c) && c.idl_env && function (e, t, r, i, o, a) { + r ? (t[o] = 1, e.push({ + source: i, + uids: [{ + id: r, + ext: { rtiPartner: a } + }] + })) : n.logWarn('Tried to add a user ID from Prebid, the ID received was null'); + }(a, u, c.idl_env, 'liveramp.com', 'LiveRampIp', 'idl'), window.headertag && 'function' == typeof window.headertag.getIdentityInfo) { + var d = window.headertag.getIdentityInfo(); + if (d && 'object' === v(d)) { + for (var f in d) { + if (d.hasOwnProperty(f) && !u.hasOwnProperty(f)) { + var p = d[f]; + !p.responsePending && p.data && 'object' === v(p.data) && Object.keys(p.data).length && a.push(p.data); + } + } + } + } + var m = {}; + m.id = e[0].bidderRequestId, m.site = {}, m.ext = {}, m.ext.source = 'prebid', m.ext.ixdiag = {}; + var b = function (e) { + for (var t = e.map(function (e) { + return e.transactionId; + }).filter(function (e, t, r) { + return r.indexOf(e) === t; + }), r = { + mfu: 0, + bu: 0, + iu: 0, + nu: 0, + ou: 0, + allU: 0, + ren: !1 + }, i = function (i) { + if (a = e.filter(function (e) { + return e.transactionId === t[i]; + })[0], n.deepAccess(a, 'mediaTypes')) { + if (Object.keys(a.mediaTypes).length > 1 && r.mfu++, n.deepAccess(a, 'mediaTypes.native') && r.nu++, n.deepAccess(a, 'mediaTypes.banner') && r.bu++, 'outstream' === n.deepAccess(a, 'mediaTypes.video.context')) { + r.ou++; + var o = 'object' === v(n.deepAccess(a, 'renderer') || n.deepAccess(a, 'mediaTypes.video.renderer')); + r.ren = r.ren && o ? n.deepAccess(r, 'ren') : o; + } + 'instream' === n.deepAccess(a, 'mediaTypes.video.context') && r.iu++, r.allU++; + } + }, o = 0; o < t.length; o++) { + var a; + i(o); + } + return r; + }(e); + for (var y in b) { + m.ext.ixdiag[y] = b[y]; + } + if (e[0].schain && (m.source = { ext: { schain: e[0].schain } }), a.length > 0 && (m.user = {}, m.user.eids = a), document.referrer && '' !== document.referrer && (m.site.ref = document.referrer), t) { + if (t.gdprConsent) { + var h = t.gdprConsent; + h.hasOwnProperty('gdprApplies') && (m.regs = { ext: { gdpr: h.gdprApplies ? 1 : 0 } }), h.hasOwnProperty('consentString') && (m.user = m.user || {}, m.user.ext = { consent: h.consentString || '' }, h.hasOwnProperty('addtlConsent') && h.addtlConsent && (m.user.ext.consented_providers_settings = { consented_providers: h.addtlConsent })); + } + t.uspConsent && n.deepSetValue(m, 'regs.ext.us_privacy', t.uspConsent), t.refererInfo && (m.site.page = t.refererInfo.referer); + } + var S = {}, O = t && t.bidderCode || 'ix', _ = o.config.getConfig(O); + if (_) { + if ('object' === v(_.firstPartyData)) { + var E = _.firstPartyData, I = '?'; + for (var w in E) { + E.hasOwnProperty(w) && (I += ''.concat(encodeURIComponent(w), '=').concat(encodeURIComponent(E[w]), '&')); + } + I = I.slice(0, -1), m.site.page += I; + } + 'number' == typeof _.timeout && (S.t = _.timeout), 'boolean' == typeof _.detectMissingSizes ? m.ext.ixdiag.dms = _.detectMissingSizes : m.ext.ixdiag.dms = !0; + } + S.s = e[0].params.siteId, S.v = i, S.ac = 'j', S.sd = 1, 8.1 === i && (S.nf = 1); + var A = [], x = { + method: 'GET', + url: s, + data: S + }, C = new Blob([''.concat(x.url).concat(n.parseQueryStringParameters(g(g({}, x.data), {}, { r: JSON.stringify(m) })))]).size, P = C, j = 0, R = 0, D = 0; + m.ext.ixdiag.msd = 0, m.ext.ixdiag.msi = 0, m.imp = []; + for (var k = 0, N = Object.keys(r), M = []; k < N.length && A.length < 4;) { + if (r[N[k]].hasOwnProperty('missingCount') && (D = r[N[k]].missingCount), T(r[N[k]], 8000 - C), r[N[k]].hasOwnProperty('missingImps') && (R = r[N[k]].missingImps.length), (P += new Blob([encodeURIComponent(JSON.stringify(r[N[k]]))]).size) < 8000) { + var U, B; + if ((U = m.imp).push.apply(U, l(r[N[k]].ixImps)), m.ext.ixdiag.msd += D, m.ext.ixdiag.msi += R, r[N[k]].hasOwnProperty('missingImps')) { + (B = M).push.apply(B, l(r[N[k]].missingImps)); + } + k++; + } else { + var L, z = n.deepClone(S); + (L = m.imp).push.apply(L, l(M)), m.ext.ixdiag.sn = j, z.sn = j, j++, z.r = JSON.stringify(m), A.push({ + method: 'GET', + url: s, + data: z + }), M = [], P = C, m.imp = [], D = 0, R = 0, m.ext.ixdiag.msd = 0, m.ext.ixdiag.msi = 0; + } + } + if (P > C && P < 8000 && A.length < 4) { + var V, F = n.deepClone(S); + (V = m.imp).push.apply(V, l(M)), A.length > 0 && (m.ext.ixdiag.sn = j, F.sn = j), F.r = JSON.stringify(m), A.push({ + method: 'GET', + url: s, + data: F + }); + } + return A; + } + function T(e, t) { + var r = new Blob([encodeURIComponent(JSON.stringify(e))]).size; + if (!(r < t)) { + for (; r > t;) { + e.hasOwnProperty('missingImps') && e.missingImps.length > 0 ? e.missingImps.pop() : e.hasOwnProperty('ixImps') && e.ixImps.length > 0 && e.ixImps.pop(), r = new Blob([encodeURIComponent(JSON.stringify(e))]).size; + } + } + } + function x(e, t) { + for (var r = 0; r < e.length; r++) { + if (t[0] == e[r][0] && t[1] == e[r][1]) { + return e.splice(r, 1), !0; + } + } + return !1; + } + function C(e, t, r) { + var i = e.transactionId; + if (t.hasOwnProperty(i)) { + var o = []; + t[i].hasOwnProperty('missingSizes') && (o = t[i].missingSizes), x(o, e.params.size), t[i].missingSizes = o; + } else if (n.deepAccess(e, 'mediaTypes.banner.sizes')) { + var a = n.deepClone(e.mediaTypes.banner.sizes); + x(a, e.params.size); + var s = { + missingSizes: a, + impression: r + }; + t[i] = s; + } + } + function P(e, t) { + var r = n.deepClone(e); + return r.ext.sid = ''.concat(t[0], 'x').concat(t[1]), r.banner.w = t[0], r.banner.h = t[1], r; + } + var j = { + code: 'ix', + gvlid: 10, + supportedMediaTypes: b, + isBidRequestValid: function (e) { + var t, r, i = n.deepAccess(e, 'params.video'), o = n.deepAccess(e, 'params.size'), a = n.deepAccess(e, 'mediaTypes.banner.sizes'), s = n.deepAccess(e, 'mediaTypes.video'), u = n.deepAccess(e, 'mediaTypes.video.playerSize'), c = e.params.hasOwnProperty('bidFloor'), d = e.params.hasOwnProperty('bidFloorCur'); + if (!E(e.params.size)) { + return n.logError('ix bidder params: bid size has invalid format.'), !1; + } + if (e.hasOwnProperty('mediaType') && !n.contains(b, e.mediaType)) { + return !1; + } + if (e.hasOwnProperty('mediaTypes') && !a && !u) { + return !1; + } + if (!I(e.sizes, o) && !(u && I(u, o) || a && I(a, o))) { + return n.logError('ix bidder params: bid size is not included in ad unit sizes or player size.'), !1; + } + if (s && i) { + for (var l = !0, f = 0, p = [ + 'mimes', + 'minduration', + 'maxduration', + 'protocols' + ]; f < p.length; f++) { + var g = p[f]; + if (!s.hasOwnProperty(g) && !i.hasOwnProperty(g)) { + if ('protocols' === g && (s.hasOwnProperty('protocol') || i.hasOwnProperty('protocol'))) { + continue; + } + n.logError('ix bidder params: ' + g + ' is not included in either the adunit or params level'), l = !1; + } + } + if (!l) { + return !1; + } + } + return 'string' != typeof e.params.siteId && 'number' != typeof e.params.siteId ? (n.logError('ix bidder params: siteId must be string or number value.'), !1) : !!(!c && !d || c && d && (t = e.params.bidFloor, r = e.params.bidFloorCur, Boolean('number' == typeof t && 'string' == typeof r && r.match(/^[A-Z]{3}$/)))) || (n.logError('ix bidder params: bidFloor / bidFloorCur parameter has invalid format.'), !1); + }, + buildRequests: function (e, t) { + for (var r = [], a = {}, s = {}, u = null, c = {}, d = g(g({}, { detectMissingSizes: !0 }), o.config.getConfig('ix')), f = 0; f < e.length; f++) { + if (((u = e[f]).mediaType === i.VIDEO || n.deepAccess(u, 'mediaTypes.video')) && (u.mediaType === i.VIDEO || I(u.mediaTypes.video.playerSize, u.params.size)) && (s.hasOwnProperty(u.transactionId) || (s[u.transactionId] = {}), s[u.transactionId].hasOwnProperty('ixImps') || (s[u.transactionId].ixImps = []), s[u.transactionId].ixImps.push(S(u))), u.mediaType === i.BANNER || n.deepAccess(u, 'mediaTypes.banner') && I(n.deepAccess(u, 'mediaTypes.banner.sizes'), u.params.size) || !u.mediaType && !u.mediaTypes) { + var p = h(u); + a.hasOwnProperty(u.transactionId) || (a[u.transactionId] = {}), a[u.transactionId].hasOwnProperty('ixImps') || (a[u.transactionId].ixImps = []), a[u.transactionId].ixImps.push(p), d.hasOwnProperty('detectMissingSizes') && d.detectMissingSizes && C(u, c, p); + } + } + for (var m in c) { + if (c.hasOwnProperty(m)) { + var v = c[m].missingSizes; + a.hasOwnProperty(m) || (a[m] = {}), a[m].hasOwnProperty('missingImps') || (a[m].missingImps = [], a[m].missingCount = 0); + for (var b = c[m].impression, y = 0; y < v.length; y++) { + var O = P(b, v[y]); + a[m].missingImps.push(O), a[m].missingCount++; + } + } + } + return Object.keys(a).length > 0 && r.push.apply(r, l(A(e, t, a, 7.2))), Object.keys(s).length > 0 && r.push.apply(r, l(A(e, t, s, 8.1))), r; + }, + interpretResponse: function (e, t) { + var r = [], n = null; + if (!e.hasOwnProperty('body') || !e.body.hasOwnProperty('seatbid')) { + return r; + } + for (var i = e.body, o = i.seatbid, a = 0; a < o.length; a++) { + if (o[a].hasOwnProperty('bid')) { + for (var s = o[a].bid, u = JSON.parse(t.data.r), c = 0; c < s.length; c++) { + var d = w(s[c].impid, u.imp); + n = _(s[c], i.cur, d), r.push(n); + } + } + } + return r; + }, + transformBidParams: function (e, t) { + return n.convertTypes({ siteID: 'number' }, e); + }, + getUserSyncs: function (e, t) { + return e.iframeEnabled ? [{ + type: 'iframe', + url: 'https://js-sec.indexww.com/um/ixmatch.html' + }] : []; + } + }; + t.spec = j, (0, u.registerBidder)(j); + }, + function (e, t, r) { + 'use strict'; + r.r(t); + const n = Number.isInteger || function (e) { + return 'number' == typeof e && isFinite(e) && Math.floor(e) === e; + }; + t.default = n; + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = t.USER_ID_CODE_TO_QUERY_ARG = void 0, r(6), r(13), r(9), r(11), r(4), r(2), r(102), r(1), r(3), r(0), r(5), r(33), r(40); + var i = r(22), o = r(49), a = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = u(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), s = r(45); + function u() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return u = function () { + return e; + }, e; + } + function c(e, t) { + return function (e) { + if (Array.isArray(e)) { + return e; + } + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) { + return; + } + var r = [], n = !0, i = !1, o = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(n = (a = s.next()).done) && (r.push(a.value), !t || r.length !== t); n = !0) { + } + } catch (e) { + i = !0, o = e; + } finally { + try { + n || null == s.return || s.return(); + } finally { + if (i) { + throw o; + } + } + } + return r; + }(e, t) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return d(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return d(e, t); + } + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function d(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var l = [ + s.BANNER, + s.VIDEO + ], f = { + britepoolid: 'britepoolid', + criteoId: 'criteoid', + digitrustid: 'digitrustid', + id5id: 'id5id', + idl_env: 'lre', + lipb: 'lipbid', + netId: 'netid', + parrableId: 'parrableid', + pubcid: 'pubcid', + tdid: 'ttduuid' + }; + t.USER_ID_CODE_TO_QUERY_ARG = f; + var p = { + code: 'openx', + gvlid: 69, + supportedMediaTypes: l, + isBidRequestValid: function (e) { + var t = e.params.delDomain || e.params.platform; + return a.deepAccess(e, 'mediaTypes.banner') && t ? !!e.params.unit || a.deepAccess(e, 'mediaTypes.banner.sizes.length') > 0 : !(!e.params.unit || !t); + }, + buildRequests: function (e, t) { + if (0 === e.length) { + return []; + } + var r = [], n = c(function (e) { + return e.reduce(function (e, t) { + var r; + return r = t, a.deepAccess(r, 'mediaTypes.video') && !a.deepAccess(r, 'mediaTypes.banner') || r.mediaType === s.VIDEO ? e[0].push(t) : e[1].push(t), e; + }, [ + [], + [] + ]); + }(e), 2), o = n[0], u = n[1]; + return u.length > 0 && r.push(function (e, t) { + var r = [], n = !1, o = m(e, t), u = a._map(e, function (e) { + return e.params.unit; + }); + o.aus = a._map(e, function (e) { + return a.parseSizesInput(e.mediaTypes.banner.sizes).join(','); + }).join('|'), o.divIds = a._map(e, function (e) { + return encodeURIComponent(e.adUnitCode); + }).join(','), u.some(function (e) { + return e; + }) && (o.auid = u.join(',')); + e.some(function (e) { + return e.params.doNotTrack; + }) && (o.ns = 1); + (!0 === i.config.getConfig('coppa') || e.some(function (e) { + return e.params.coppa; + })) && (o.tfcd = 1); + e.forEach(function (e) { + if (e.params.customParams) { + var t = a._map(Object.keys(e.params.customParams), function (t) { + return function (e, t) { + var r = t[e]; + a.isArray(r) && (r = r.join(',')); + return (e.toLowerCase() + '=' + r.toLowerCase()).replace('+', '.').replace('/', '_'); + }(t, e.params.customParams); + }), i = window.btoa(t.join('&')); + n = !0, r.push(i); + } else { + r.push(''); + } + }), n && (o.tps = r.join(',')); + var c = [], d = !1; + e.forEach(function (e) { + var t = function (e, t) { + var r = {}, n = i.config.getConfig('currency.adServerCurrency') || 'USD'; + 'function' == typeof e.getFloor && (r = e.getFloor({ + currency: n, + mediaType: t, + size: '*' + })); + var o = r.floor || e.params.customFloor || 0; + return Math.round(1000 * o); + }(e, s.BANNER); + t ? (c.push(t), d = !0) : c.push(0); + }), d && (o.aumfs = c.join(',')); + return { + method: 'GET', + url: o.ph ? 'https://u.openx.net/w/1.0/arj' : 'https://'.concat(e[0].params.delDomain, '/w/1.0/arj'), + data: o, + payload: { + bids: e, + startTime: new Date() + } + }; + }(u, t)), o.length > 0 && o.forEach(function (e) { + r.push(function (e, t) { + var r = function (e, t) { + var r, n, i = m([e], t), o = a.deepAccess(e, 'params.video') || {}, s = a.deepAccess(e, 'mediaTypes.video.context'), u = a.deepAccess(e, 'mediaTypes.video.playerSize'); + a.isArray(e.sizes) && 2 === e.sizes.length && !a.isArray(e.sizes[0]) ? (r = parseInt(e.sizes[0], 10), n = parseInt(e.sizes[1], 10)) : a.isArray(e.sizes) && a.isArray(e.sizes[0]) && 2 === e.sizes[0].length ? (r = parseInt(e.sizes[0][0], 10), n = parseInt(e.sizes[0][1], 10)) : a.isArray(u) && 2 === u.length && (r = parseInt(u[0], 10), n = parseInt(u[1], 10)); + Object.keys(o).forEach(function (e) { + 'openrtb' === e ? (o[e].w = r || o[e].w, o[e].v = n || o[e].v, i[e] = JSON.stringify(o[e])) : e in i || 'url' === e || (i[e] = o[e]); + }), i.auid = e.params.unit, i.vwd = r || o.vwd, i.vht = n || o.vht, 'outstream' === s && (i.vos = '101'); + o.mimes && (i.vmimes = o.mimes); + e.params.test && (i.vtest = 1); + return i; + }(e, t); + return { + method: 'GET', + url: r.ph ? 'https://u.openx.net/v/1.0/avjp' : 'https://'.concat(e.params.delDomain, '/v/1.0/avjp'), + data: r, + payload: { + bid: e, + startTime: new Date() + } + }; + }(e, t)); + }), r; + }, + interpretResponse: function (e, t) { + var r = e.body; + return function (e) { + return /avjp$/.test(e.url) ? s.VIDEO : s.BANNER; + }(t) === s.VIDEO ? function (e, t) { + var r = t.bid, n = (t.startTime, []); + if (void 0 !== e && '' !== e.vastUrl && e.pub_rev > 0) { + var i = a.parseUrl(e.vastUrl).search || {}, o = {}; + o.requestId = r.bidId, o.ttl = 300, o.netRevenue = !0, o.currency = e.currency, o.cpm = parseInt(e.pub_rev, 10) / 1000, o.width = parseInt(e.width, 10), o.height = parseInt(e.height, 10), o.creativeId = e.adid, o.vastUrl = e.vastUrl, o.mediaType = s.VIDEO, e.ph = i.ph, e.colo = i.colo, e.ts = i.ts, n.push(o); + } + return n; + }(r, t.payload) : function (e, t) { + for (var r = t.bids, n = (t.startTime, e.ads.ad), i = [], o = 0; o < n.length; o++) { + var a = n[o], s = parseInt(a.idx, 10), u = {}; + if (u.requestId = r[s].bidId, a.pub_rev) { + u.cpm = Number(a.pub_rev) / 1000; + var c = a.creative[0]; + c && (u.width = c.width, u.height = c.height), u.creativeId = c.id, u.ad = a.html, a.deal_id && (u.dealId = a.deal_id), u.ttl = 300, u.netRevenue = !0, u.currency = a.currency, a.tbd && (u.tbd = a.tbd), u.ts = a.ts, u.meta = {}, a.brand_id && (u.meta.brandId = a.brand_id), a.adv_id && (u.meta.dspid = a.adv_id), i.push(u); + } + } + return i; + }(r, t.payload); + }, + getUserSyncs: function (e, t, r, n) { + if (e.iframeEnabled || e.pixelEnabled) { + return [{ + type: e.iframeEnabled ? 'iframe' : 'image', + url: a.deepAccess(t, '0.body.ads.pixels') || a.deepAccess(t, '0.body.pixels') || function (e, t) { + var r = 'https://u.openx.net/w/1.0/pd', n = []; + e && (n.push('gdpr=' + (e.gdprApplies ? 1 : 0)), n.push('gdpr_consent=' + encodeURIComponent(e.consentString || ''))); + t && n.push('us_privacy=' + encodeURIComponent(t)); + return ''.concat(r).concat(n.length > 0 ? '?' + n.join('&') : ''); + }(r, n) + }]; + } + }, + transformBidParams: function (e, t) { + return a.convertTypes({ + unit: 'string', + customFloor: 'number' + }, e); + } + }; + function g(e) { + var t, r, n, i = window, o = document, a = o.documentElement; + if (e) { + try { + i = window.top, o = window.top.document; + } catch (e) { + return; + } + a = o.documentElement, n = o.body, t = i.innerWidth || a.clientWidth || n.clientWidth, r = i.innerHeight || a.clientHeight || n.clientHeight; + } else { + a = o.documentElement, t = i.innerWidth || a.clientWidth, r = i.innerHeight || a.clientHeight; + } + return ''.concat(t, 'x').concat(r); + } + function m(e, t) { + var r, n, o, s, u, c, d = a.inIframe(); + if (r = { + ju: i.config.getConfig('pageUrl') || t.refererInfo.referer, + ch: document.charSet || document.characterSet, + res: ''.concat(screen.width, 'x').concat(screen.height, 'x').concat(screen.colorDepth), + ifr: d, + tz: new Date().getTimezoneOffset(), + tws: g(d), + be: 1, + bc: e[0].params.bc || ''.concat('hb_pb', '_').concat('3.0.3'), + dddid: a._map(e, function (e) { + return e.transactionId; + }).join(','), + nocache: new Date().getTime() + }, e[0].params.platform && (r.ph = e[0].params.platform), t.gdprConsent) { + var l = t.gdprConsent; + void 0 !== l.consentString && (r.gdpr_consent = l.consentString), void 0 !== l.gdprApplies && (r.gdpr = l.gdprApplies ? 1 : 0), 'iab' === i.config.getConfig('consentManagement.cmpApi') && (r.x_gdpr_f = 1); + } + return t && t.uspConsent && (r.us_privacy = t.uspConsent), a.deepAccess(e[0], 'crumbs.pubcid') && a.deepSetValue(e[0], 'userId.pubcid', a.deepAccess(e[0], 'crumbs.pubcid')), n = r, o = e[0].userId, a._each(o, function (e, t) { + var r = f[t]; + if (f.hasOwnProperty(t)) { + switch (t) { + case 'digitrustid': + n[r] = a.deepAccess(e, 'data.id'); + break; + case 'lipb': + n[r] = e.lipbid; + break; + case 'parrableId': + n[r] = e.eid; + break; + case 'id5id': + n[r] = e.uid; + break; + default: + n[r] = e; + } + } + }), r = n, e[0].schain && (r.schain = (s = e[0].schain, ''.concat(s.ver, ',').concat(s.complete, '!').concat((u = s.nodes, c = [ + 'asi', + 'sid', + 'hp', + 'rid', + 'name', + 'domain' + ], u.map(function (e) { + return c.map(function (t) { + return e[t] || ''; + }).join(','); + }).join('!'))))), r; + } + t.spec = p, (0, o.registerBidder)(p); + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(1), r(3), r(0), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(33), r(40); + var i = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = u(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), o = r(49), a = r(76), s = r(45); + function u() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return u = function () { + return e; + }, e; + } + var c = 'Bid from response has no auid parameter - ', d = 'Bid from response has no adm parameter - ', l = 'Array of bid objects is empty', f = 'Can\'t find in requested bids the bid with auid - ', p = 'Seatbid array from response has empty item', g = 'Response is empty', m = 'Response has empty seatbid array', v = 'Seatbid from response has no array of bid objects - ', b = { + code: 'trustx', + supportedMediaTypes: [ + s.BANNER, + s.VIDEO + ], + isBidRequestValid: function (e) { + return !!e.params.uid; + }, + buildRequests: function (e, t) { + var r, n, o = [], a = {}, s = {}, u = {}, c = 'net'; + (e || []).forEach(function (e) { + 'gross' === e.params.priceType && (c = 'gross'), n = e.bidderRequestId; + var t = e.params.uid, d = e.adUnitCode; + o.push(t); + var l = i.parseSizesInput(e.sizes); + if (!r && !i.isEmpty(e.params.keywords)) { + var f = i.transformBidderParamKeywords(e.params.keywords); + f.length > 0 && f.forEach(y), r = f; + } + s[t] || (s[t] = {}); + var p = s[t]; + p[d] ? p[d].bids.push(e) : p[d] = { + adUnitCode: d, + bids: [e], + parents: [] + }; + var g = p[d]; + l.forEach(function (e) { + u[e] = !0, a[t] || (a[t] = {}), a[t][e] ? a[t][e].push(g) : a[t][e] = [g], g.parents.push({ + parent: a[t], + key: e, + uid: t + }); + }); + }); + var d = { + pt: c, + auids: o.join(','), + sizes: i.getKeys(u).join(','), + r: n, + wrapperType: 'Prebid_js', + wrapperVersion: '4.26.0' + }; + return r && (d.keywords = JSON.stringify(r)), t && (t.refererInfo && t.refererInfo.referer && (d.u = t.refererInfo.referer), t.timeout && (d.wtimeout = t.timeout), t.gdprConsent && (t.gdprConsent.consentString && (d.gdpr_consent = t.gdprConsent.consentString), d.gdpr_applies = 'boolean' == typeof t.gdprConsent.gdprApplies ? Number(t.gdprConsent.gdprApplies) : 1), t.uspConsent && (d.us_privacy = t.uspConsent)), { + method: 'GET', + url: 'https://sofia.trustx.org/hb', + data: i.parseQueryStringParameters(d).replace(/\&$/, ''), + bidsMap: a + }; + }, + interpretResponse: function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : a.Renderer; + e = e && e.body; + var n, o = [], s = t.bidsMap, u = t.data.pt; + return e ? e.seatbid && !e.seatbid.length && (n = m) : n = g, !n && e.seatbid && e.seatbid.forEach(function (e) { + S(h(e), s, u, o, r); + }), n && i.logError(n), o; + }, + getUserSyncs: function (e) { + if (e.pixelEnabled) { + return [{ + type: 'image', + url: 'https://sofia.trustx.org/push_sync' + }]; + } + } + }; + function y(e) { + var t; + t = e.value, i.isArray(t) && t.length > 0 && '' === e.value[0] && delete e.value; + } + function h(e) { + return e ? e.bid ? e.bid[0] || i.logError(l) : i.logError(v + JSON.stringify(e)) : i.logError(p), e && e.bid && e.bid[0]; + } + function S(e, t, r, n, o) { + if (e) { + var a; + if (e.auid || (a = c + JSON.stringify(e)), e.adm) { + var u = t[e.auid]; + if (u) { + var l = ''.concat(e.w, 'x').concat(e.h); + if (u[l]) { + var p = u[l][0], g = p.bids.shift(), m = { + requestId: g.bidId, + bidderCode: b.code, + cpm: e.price, + width: e.w, + height: e.h, + creativeId: e.auid, + currency: 'USD', + netRevenue: 'gross' !== r, + ttl: 360, + dealId: e.dealid + }; + 'video' === e.content_type ? (m.vastXml = e.adm, m.mediaType = s.VIDEO, m.adResponse = { content: m.vastXml }, g.renderer || g.mediaTypes && g.mediaTypes.video && 'outstream' !== g.mediaTypes.video.context || (m.renderer = function (e, t, r) { + var n = r.install({ + id: t.id, + url: t.url, + loaded: !1 + }); + try { + n.setRender(O); + } catch (e) { + i.logWarn('Prebid Error calling setRender on renderer', e); + } + return n; + }(0, { + id: g.bidId, + url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js' + }, o))) : (m.ad = e.adm, m.mediaType = s.BANNER), n.push(m), p.bids.length || p.parents.forEach(function (e) { + var r = e.parent, n = e.key, o = e.uid, a = r[n].indexOf(p); + a > -1 && r[n].splice(a, 1), r[n].length || (delete r[n], i.getKeys(r).length || delete t[o]); + }); + } + } else { + a = f + e.auid; + } + } else { + a = d + JSON.stringify(e); + } + a && i.logError(a); + } + } + function O(e) { + e.renderer.push(function () { + window.ANOutstreamVideo.renderAd({ + targetId: e.adUnitCode, + adResponse: e.adResponse + }); + }); + } + t.spec = b, (0, o.registerBidder)(b); + }, + function (e, t, r) { + 'use strict'; + function n(e) { + return (n = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + r(4), r(2), r(6), r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(26), r(11), r(214), r(1), r(3), r(0), r(5), r(16), r(33), r(40); + var i = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== n(e) && 'function' != typeof e) { + return { default: e }; + } + var t = s(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, i = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var o in e) { + if (Object.prototype.hasOwnProperty.call(e, o)) { + var a = i ? Object.getOwnPropertyDescriptor(e, o) : null; + a && (a.get || a.set) ? Object.defineProperty(r, o, a) : r[o] = e[o]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), o = r(22), a = r(49); + function s() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return s = function () { + return e; + }, e; + } + function u() { + return (u = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + var c, d, l, f = (0, r(75).getStorageManager)(), p = { + code: 'kargo', + isBidRequestValid: function (e) { + return !(!e || !e.params) && !!e.params.placementId; + }, + buildRequests: function (e, t) { + var r, n = o.config.getConfig('currency'), a = n && n.adServerCurrency || 'USD', s = {}, c = {}; + i._each(e, function (e) { + s[e.bidId] = e.params.placementId, c[e.bidId] = e.sizes; + }), e.length > 0 && e[0].userId && e[0].userId.tdid && (r = e[0].userId.tdid); + var d = u({}, { + sessionId: p._getSessionId(), + requestCount: p._getRequestCount(), + timeout: t.timeout, + currency: a, + cpmGranularity: 1, + timestamp: new Date().getTime(), + cpmRange: { + floor: 0, + ceil: 20 + }, + bidIDs: s, + bidSizes: c, + prebidRawBidRequests: e + }, p._getAllMetadata(r, t.uspConsent)), l = encodeURIComponent(JSON.stringify(d)); + return u({}, t, { + method: 'GET', + url: ''.concat('https://krk.kargo.com', '/api/v2/bid'), + data: 'json='.concat(l), + currency: a + }); + }, + interpretResponse: function (e, t) { + var r = e.body, n = []; + for (var i in r) { + var o = r[i], a = void 0; + o.metadata && o.metadata.landingPageDomain && (a = { + clickUrl: o.metadata.landingPageDomain, + advertiserDomains: [o.metadata.landingPageDomain] + }), n.push({ + requestId: i, + cpm: Number(o.cpm), + width: o.width, + height: o.height, + ad: o.adm, + ttl: 300, + creativeId: o.id, + dealId: o.targetingCustom, + netRevenue: !0, + currency: t.currency, + meta: a + }); + } + return n; + }, + getUserSyncs: function (e) { + var t = [], r = p._generateRandomUuid(), n = p._getClientId(); + if (e.iframeEnabled && r && n) { + for (var i = 0; i < 5; i++) { + t.push({ + type: 'iframe', + url: 'https://crb.kargo.com/api/v1/initsyncrnd/{UUID}?seed={SEED}&idx={INDEX}'.replace('{UUID}', n).replace('{SEED}', r).replace('{INDEX}', i) + }); + } + } + return t; + }, + _readCookie: function (e) { + if (!f.cookiesAreEnabled()) { + return null; + } + for (var t = ''.concat(e, '='), r = document.cookie.split(';'), n = 0; n < r.length; n++) { + for (var i = r[n]; ' ' === i.charAt(0);) { + i = i.substring(1, i.length); + } + if (0 === i.indexOf(t)) { + return i.substring(t.length, i.length); + } + } + return null; + }, + _getCrbFromCookie: function () { + try { + var e = JSON.parse(decodeURIComponent(p._readCookie('krg_crb'))); + if (e && e.v) { + var t = JSON.parse(atob(e.v)); + if (t) { + return t; + } + } + return {}; + } catch (e) { + return {}; + } + }, + _getCrbFromLocalStorage: function () { + try { + return JSON.parse(atob(p._getLocalStorageSafely('krg_crb'))); + } catch (e) { + return {}; + } + }, + _getCrb: function () { + var e = p._getCrbFromLocalStorage(); + return Object.keys(e).length ? e : p._getCrbFromCookie(); + }, + _getKruxUserId: function () { + return p._getLocalStorageSafely('kxkar_user'); + }, + _getKruxSegments: function () { + return p._getLocalStorageSafely('kxkar_segs'); + }, + _getKrux: function () { + var e = p._getKruxSegments(), t = []; + return e && (t = e.split(',')), { + userID: p._getKruxUserId(), + segments: t + }; + }, + _getLocalStorageSafely: function (e) { + try { + return f.getDataFromLocalStorage(e); + } catch (e) { + return null; + } + }, + _getUserIds: function (e, t) { + var r = p._getCrb(), n = { + kargoID: r.userId, + clientID: r.clientId, + crbIDs: r.syncIds || {}, + optOut: r.optOut, + usp: t + }; + return e && (n.tdID = e), n; + }, + _getClientId: function () { + return p._getCrb().clientId; + }, + _getAllMetadata: function (e, t) { + return { + userIDs: p._getUserIds(e, t), + krux: p._getKrux(), + pageURL: window.location.href, + rawCRB: p._readCookie('krg_crb'), + rawCRBLocalStorage: p._getLocalStorageSafely('krg_crb') + }; + }, + _getSessionId: function () { + return c || (c = p._generateRandomUuid()), c; + }, + _getRequestCount: function () { + return d === window.location.pathname ? ++l : (d = window.location.pathname, l = 0); + }, + _generateRandomUuid: function () { + try { + var e = new Uint8Array(16); + crypto.getRandomValues(e), e[6] = -177 & e[6] | 64, e[8] = -65 & e[8] | 128; + var t = Array.prototype.map.call(new Uint8Array(e), function (e) { + return ('00' + e.toString(16)).slice(-2); + }).join(''); + return t.slice(0, 8) + '-' + t.slice(8, 12) + '-' + t.slice(12, 16) + '-' + t.slice(16, 20) + '-' + t.slice(20); + } catch (e) { + return ''; + } + } + }; + t.spec = p, (0, a.registerBidder)(p); + }, + function (e, t, r) { + 'use strict'; + r(30), Object.defineProperty(t, '__esModule', { value: !0 }), t.spec = void 0, r(26), r(11), r(6), r(13), r(4), r(2), r(16), r(153), r(393), r(43), r(9), r(33), r(1), r(3), r(0), r(5); + var n = r(76), i = function (e) { + if (e && e.__esModule) { + return e; + } + if (null === e || 'object' !== m(e) && 'function' != typeof e) { + return { default: e }; + } + var t = g(); + if (t && t.has(e)) { + return t.get(e); + } + var r = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) { + if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(r, i, o) : r[i] = e[i]; + } + } + r.default = e, t && t.set(e, r); + return r; + }(r(7)), o = r(22), a = r(49), s = r(45), u = r(127), c = p(r(37)), d = p(r(31)), l = r(156), f = r(75); + function p(e) { + return e && e.__esModule ? e : { default: e }; + } + function g() { + if ('function' != typeof WeakMap) { + return null; + } + var e = new WeakMap(); + return g = function () { + return e; + }, e; + } + function m(e) { + return (m = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function v() { + return (v = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var r = arguments[t]; + for (var n in r) { + Object.prototype.hasOwnProperty.call(r, n) && (e[n] = r[n]); + } + } + return e; + }).apply(this, arguments); + } + function b(e) { + return function (e) { + if (Array.isArray(e)) { + return y(e); + } + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) { + return Array.from(e); + } + }(e) || function (e, t) { + if (!e) { + return; + } + if ('string' == typeof e) { + return y(e, t); + } + var r = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === r && e.constructor && (r = e.constructor.name); + if ('Map' === r || 'Set' === r) { + return Array.from(r); + } + if ('Arguments' === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)) { + return y(e, t); + } + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function y(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var r = 0, n = new Array(t); r < t; r++) { + n[r] = e[r]; + } + return n; + } + var h = 'https://ib.adnxs.com/ut/v3/prebid', S = [ + 'id', + 'minduration', + 'maxduration', + 'skippable', + 'playback_method', + 'frameworks', + 'context', + 'skipoffset' + ], O = [ + 'age', + 'externalUid', + 'segments', + 'gender', + 'dnt', + 'language' + ], _ = [ + 'geo', + 'device_id' + ], E = [ + 'enabled', + 'dongle', + 'member_id', + 'debug_timeout' + ], I = { + playback_method: { + unknown: 0, + auto_play_sound_on: 1, + auto_play_sound_off: 2, + click_to_play: 3, + mouse_over: 4, + auto_play_sound_unknown: 5 + }, + context: { + unknown: 0, + pre_roll: 1, + mid_roll: 2, + post_roll: 3, + outstream: 4, + 'in-banner': 5 + } + }, w = { + body: 'description', + body2: 'desc2', + cta: 'ctatext', + image: { + serverName: 'main_image', + requiredParams: { required: !0 } + }, + icon: { + serverName: 'icon', + requiredParams: { required: !0 } + }, + sponsoredBy: 'sponsored_by', + privacyLink: 'privacy_link', + salePrice: 'saleprice', + displayUrl: 'displayurl' + }, A = /\/\/cdn\.adnxs\.com\/v/, T = (0, f.getStorageManager)(32, 'appnexus'), x = { + code: 'appnexus', + gvlid: 32, + aliases: [ + { + code: 'appnexusAst', + gvlid: 32 + }, + { code: 'brealtime' }, + { + code: 'emxdigital', + gvlid: 183 + }, + { code: 'pagescience' }, + { code: 'defymedia' }, + { code: 'gourmetads' }, + { code: 'matomy' }, + { code: 'featureforward' }, + { code: 'oftmedia' }, + { + code: 'districtm', + gvlid: 144 + }, + { code: 'adasta' }, + { + code: 'beintoo', + gvlid: 618 + } + ], + supportedMediaTypes: [ + s.BANNER, + s.VIDEO, + s.NATIVE + ], + isBidRequestValid: function (e) { + return !!(e.params.placementId || e.params.member && e.params.invCode); + }, + buildRequests: function (e, t) { + var r = e.map(R), n = (0, c.default)(e, k), a = {}; + !0 === o.config.getConfig('coppa') && (a = { coppa: !0 }), n && Object.keys(n.params.user).filter(function (e) { + return (0, d.default)(O, e); + }).forEach(function (e) { + var t = i.convertCamelToUnderscore(e); + if ('segments' === e && i.isArray(n.params.user[e])) { + var r = []; + n.params.user[e].forEach(function (e) { + i.isNumber(e) ? r.push({ id: e }) : i.isPlainObject(e) && r.push(e); + }), a[t] = r; + } else { + 'segments' !== e && (a[t] = n.params.user[e]); + } + }); + var s, u = (0, c.default)(e, M); + u && u.params && u.params.app && (s = {}, Object.keys(u.params.app).filter(function (e) { + return (0, d.default)(_, e); + }).forEach(function (e) { + return s[e] = u.params.app[e]; + })); + var l, f = (0, c.default)(e, U); + f && f.params && u.params.app && u.params.app.id && (l = { appid: f.params.app.id }); + var p = {}, g = {}, m = T.getCookie('apn_prebid_debug') || null; + if (m) { + try { + p = JSON.parse(m); + } catch (e) { + i.logError('AppNexus Debug Auction Cookie Error:\n\n' + e); + } + } else { + var v = (0, c.default)(e, B); + v && v.debug && (p = v.debug); + } + p && p.enabled && Object.keys(p).filter(function (e) { + return (0, d.default)(E, e); + }).forEach(function (e) { + g[e] = p[e]; + }); + var y = (0, c.default)(e, N), S = y ? parseInt(y.params.member, 10) : 0, I = e[0].schain, w = (0, c.default)(e, z), A = { + tags: b(r), + user: a, + sdk: { + source: 'pbjs', + version: '4.26.0' + }, + schain: I + }; + if (w && (A.iab_support = { + omidpn: 'Appnexus', + omidpv: '4.26.0' + }), S > 0 && (A.member_id = S), u && (A.device = s), f && (A.app = l), o.config.getConfig('adpod.brandCategoryExclusion') && (A.brand_category_uniqueness = !0), g.enabled && (A.debug = g, i.logInfo('AppNexus Debug Auction Settings:\n\n' + JSON.stringify(g, null, 4))), t && t.gdprConsent && (A.gdpr_consent = { + consent_string: t.gdprConsent.consentString, + consent_required: t.gdprConsent.gdprApplies + }), t && t.uspConsent && (A.us_privacy = t.uspConsent), t && t.refererInfo) { + var x = { + rd_ref: encodeURIComponent(t.refererInfo.referer), + rd_top: t.refererInfo.reachedTop, + rd_ifs: t.refererInfo.numIframes, + rd_stk: t.refererInfo.stack.map(function (e) { + return encodeURIComponent(e); + }).join(',') + }; + A.referrer_detection = x; + } + if ((0, c.default)(e, L) && e.filter(L).forEach(function (e) { + var t = function (e, t) { + var r = t.mediaTypes.video, n = r.durationRangeSec, o = r.requireExactDuration, a = function (e) { + var t = e.adPodDurationSec, r = e.durationRangeSec, n = e.requireExactDuration, o = i.getMinValueFromArray(r), a = Math.floor(t / o); + return n ? Math.max(a, r.length) : a; + }(t.mediaTypes.video), s = i.getMaxValueFromArray(n), u = e.filter(function (e) { + return e.uuid === t.bidId; + }), c = i.fill.apply(i, b(u).concat([a])); + if (o) { + var d = Math.ceil(a / n.length), l = i.chunk(c, d); + n.forEach(function (e, t) { + l[t].map(function (t) { + V(t, 'minduration', e), V(t, 'maxduration', e); + }); + }); + } else { + c.map(function (e) { + return V(e, 'maxduration', s); + }); + } + return c; + }(r, e), n = A.tags.filter(function (t) { + return t.uuid !== e.bidId; + }); + A.tags = [].concat(b(n), b(t)); + }), e[0].userId) { + var C = []; + G(C, i.deepAccess(e[0], 'userId.criteoId'), 'criteo.com', null), G(C, i.deepAccess(e[0], 'userId.netId'), 'netid.de', null), G(C, i.deepAccess(e[0], 'userId.idl_env'), 'liveramp.com', null), G(C, i.deepAccess(e[0], 'userId.tdid'), 'adserver.org', 'TDID'), C.length && (A.eids = C); + } + return r[0].publisher_id && (A.publisher_id = r[0].publisher_id), function (e, t) { + var r = [], n = {}; + (function (e) { + var t = !0; + e && e.gdprConsent && e.gdprConsent.gdprApplies && 2 === e.gdprConsent.apiVersion && (t = !(!0 !== i.deepAccess(e.gdprConsent, 'vendorData.purpose.consents.1'))); + return t; + }(t) || (n = { withCredentials: !1 })); + 'TRUE' !== i.getParameterByName('apn_test').toUpperCase() && !0 !== o.config.getConfig('apn_test') || (n.customHeaders = { 'X-Is-Test': 1 }); + if (e.tags.length > 15) { + var a = i.deepClone(e); + i.chunk(e.tags, 15).forEach(function (e) { + a.tags = e; + var i = JSON.stringify(a); + r.push({ + method: 'POST', + url: h, + data: i, + bidderRequest: t, + options: n + }); + }); + } else { + var s = JSON.stringify(e); + r = { + method: 'POST', + url: h, + data: s, + bidderRequest: t, + options: n + }; + } + return r; + }(A, t); + }, + interpretResponse: function (e, t) { + var r = this, o = t.bidderRequest; + e = e.body; + var u = []; + if (!e || e.error) { + var f = 'in response for '.concat(o.bidderCode, ' adapter'); + return e && e.error && (f += ': '.concat(e.error)), i.logError(f), u; + } + if (e.tags && e.tags.forEach(function (e) { + var t, f = (t = e) && t.ads && t.ads.length && (0, c.default)(t.ads, function (e) { + return e.rtb; + }); + if (f && 0 !== f.cpm && (0, d.default)(r.supportedMediaTypes, f.ad_type)) { + var p = function (e, t, r) { + var o = i.getBidRequest(e.uuid, [r]), u = { + requestId: e.uuid, + cpm: t.cpm, + creativeId: t.creative_id, + dealId: t.deal_id, + currency: 'USD', + netRevenue: !0, + ttl: 300, + adUnitCode: o.adUnitCode, + appnexus: { + buyerMemberId: t.buyer_member_id, + dealPriority: t.deal_priority, + dealCode: t.deal_code + } + }; + t.advertiser_id && (u.meta = v({}, u.meta, { advertiserId: t.advertiser_id })); + if (t.rtb.video) { + switch (v(u, { + width: t.rtb.video.player_width, + height: t.rtb.video.player_height, + vastImpUrl: t.notify_url, + ttl: 3600 + }), i.deepAccess(o, 'mediaTypes.video.context')) { + case s.ADPOD: + var d = (0, a.getIabSubCategory)(o.bidder, t.brand_category_id); + u.meta = v({}, u.meta, { primaryCatId: d }); + var f = t.deal_priority; + u.video = { + context: s.ADPOD, + durationSeconds: Math.floor(t.rtb.video.duration_ms / 1000), + dealTier: f + }, u.vastUrl = t.rtb.video.asset_url; + break; + case l.OUTSTREAM: + if (u.adResponse = e, u.adResponse.ad = u.adResponse.ads[0], u.adResponse.ad.video = u.adResponse.ad.rtb.video, u.vastXml = t.rtb.video.content, t.renderer_url) { + var p = (0, c.default)(r.bids, function (t) { + return t.bidId === e.uuid; + }), g = i.deepAccess(p, 'renderer.options'); + u.renderer = function (e, t) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, o = n.Renderer.install({ + id: t.renderer_id, + url: t.renderer_url, + config: r, + loaded: !1, + adUnitCode: e + }); + try { + o.setRender(F); + } catch (e) { + i.logWarn('Prebid Error calling setRender on renderer', e); + } + return o.setEventHandlers({ + impression: function () { + return i.logMessage('AppNexus outstream video impression event'); + }, + loaded: function () { + return i.logMessage('AppNexus outstream video loaded event'); + }, + ended: function () { + i.logMessage('AppNexus outstream renderer video event'), document.querySelector('#'.concat(e)).style.display = 'none'; + } + }), o; + }(u.adUnitCode, t, g); + } + break; + case l.INSTREAM: + u.vastUrl = t.notify_url + '&redir=' + encodeURIComponent(t.rtb.video.asset_url); + } + } else if (t.rtb[s.NATIVE]) { + var m = t.rtb[s.NATIVE], b = t.viewability.config.replace('src=', 'data-src='), y = m.javascript_trackers; + null == y ? y = b : i.isStr(y) ? y = [ + y, + b + ] : y.push(b), u[s.NATIVE] = { + title: m.title, + body: m.desc, + body2: m.desc2, + cta: m.ctatext, + rating: m.rating, + sponsoredBy: m.sponsored, + privacyLink: m.privacy_link, + address: m.address, + downloads: m.downloads, + likes: m.likes, + phone: m.phone, + price: m.price, + salePrice: m.saleprice, + clickUrl: m.link.url, + displayUrl: m.displayurl, + clickTrackers: m.link.click_trackers, + impressionTrackers: m.impression_trackers, + javascriptTrackers: y + }, m.main_img && (u.native.image = { + url: m.main_img.url, + height: m.main_img.height, + width: m.main_img.width + }), m.icon && (u.native.icon = { + url: m.icon.url, + height: m.icon.height, + width: m.icon.width + }); + } else { + v(u, { + width: t.rtb.banner.width, + height: t.rtb.banner.height, + ad: t.rtb.banner.content + }); + try { + if (t.rtb.trackers) { + var h = t.rtb.trackers[0].impression_urls[0], S = i.createTrackPixelHtml(h); + u.ad += S; + } + } catch (e) { + i.logError('Error appending tracking pixel', e); + } + } + return u; + }(e, f, o); + p.mediaType = function (e) { + var t = e.ad_type; + return t === s.VIDEO ? s.VIDEO : t === s.NATIVE ? s.NATIVE : s.BANNER; + }(f), u.push(p); + } + }), e.debug && e.debug.debug_info) { + var p = 'AppNexus Debug Auction for Prebid\n\n' + e.debug.debug_info; + p = p.replace(/(|)/gm, '\t').replace(/(<\/td>|<\/th>)/gm, '\n').replace(/^
/gm, '').replace(/(
\n|
)/gm, '\n').replace(/

(.*)<\/h1>/gm, '\n\n===== $1 =====\n\n').replace(/(.*)<\/h[2-6]>/gm, '\n\n*** $1 ***\n\n').replace(/(<([^>]+)>)/gim, ''), i.logMessage('https://console.appnexus.com/docs/understanding-the-debug-auction'), i.logMessage(p); + } + return u; + }, + getMappingFileInfo: function () { + return { + url: 'https://acdn.adnxs.com/prebid/appnexus-mapping/mappings.json', + refreshInDays: 2 + }; + }, + getUserSyncs: function (e) { + if (e.iframeEnabled) { + return [{ + type: 'iframe', + url: 'https://acdn.adnxs.com/dmp/async_usersync.html' + }]; + } + }, + transformBidParams: function (e, t) { + return e = i.convertTypes({ + member: 'string', + invCode: 'string', + placementId: 'number', + keywords: i.transformBidderParamKeywords, + publisherId: 'number' + }, e), t && (e.use_pmt_rule = 'boolean' == typeof e.usePaymentRule && e.usePaymentRule, e.usePaymentRule && delete e.usePaymentRule, C(e.keywords) && e.keywords.forEach(P), Object.keys(e).forEach(function (t) { + var r = i.convertCamelToUnderscore(t); + r !== t && (e[r] = e[t], delete e[t]); + })), e; + }, + onBidWon: function (e) { + e.native && function (e) { + var t = function (e) { + var t; + if (i.isStr(e) && j(e)) { + t = e; + } else if (i.isArray(e)) { + for (var r = 0; r < e.length; r++) { + var n = e[r]; + j(n) && (t = n); + } + } + return t; + }(e.native.javascriptTrackers); + if (t) { + for (var r = 'pbjs_adid=' + e.adId + ';pbjs_auc=' + e.adUnitCode, n = function (e) { + var t = e.indexOf('src="') + 5, r = e.indexOf('"', t); + return e.substring(t, r); + }(t), o = n.replace('dom_id=%native_dom_id%', r), a = document.getElementsByTagName('iframe'), s = !1, u = 0; u < a.length && !s; u++) { + var c = a[u]; + try { + var d = c.contentDocument || c.contentWindow.document; + if (d) { + for (var l = d.getElementsByTagName('script'), f = 0; f < l.length && !s; f++) { + var p = l[f]; + p.getAttribute('data-src') == n && (p.setAttribute('src', o), p.setAttribute('data-src', ''), p.removeAttribute && p.removeAttribute('data-src'), s = !0); + } + } + } catch (e) { + if (!(e instanceof DOMException && 'SecurityError' === e.name)) { + throw e; + } + } + } + } + }(e); + } + }; + function C(e) { + return !!(i.isArray(e) && e.length > 0); + } + function P(e) { + C(e.value) && '' === e.value[0] && delete e.value; + } + function j(e) { + var t = e.match(A), r = null != t && t.length >= 1, n = e.match('trk.js'), i = null != n && n.length >= 1; + return e.startsWith(' 0 && o.forEach(P), n.keywords = o; + } + if ((e.mediaType === s.NATIVE || i.deepAccess(e, 'mediaTypes.'.concat(s.NATIVE))) && (n.ad_types.push(s.NATIVE), 0 === n.sizes.length && (n.sizes = D([ + 1, + 1 + ])), e.nativeParams)) { + var a = (t = e.nativeParams, r = {}, Object.keys(t).forEach(function (e) { + var n = w[e] && w[e].serverName || w[e] || e, o = w[e] && w[e].requiredParams; + if (r[n] = v({}, o, t[e]), (n === w.image.serverName || n === w.icon.serverName) && r[n].sizes) { + var a = r[n].sizes; + (i.isArrayOfNums(a) || i.isArray(a) && a.length > 0 && a.every(function (e) { + return i.isArrayOfNums(e); + })) && (r[n].sizes = D(r[n].sizes)); + } + n === w.privacyLink && (r.privacy_supported = !0); + }), r); + n[s.NATIVE] = { layouts: [a] }; + } + var l = i.deepAccess(e, 'mediaTypes.'.concat(s.VIDEO)), f = i.deepAccess(e, 'mediaTypes.video.context'); + n.hb_source = l && 'adpod' === f ? 7 : 1, (e.mediaType === s.VIDEO || l) && n.ad_types.push(s.VIDEO), (e.mediaType === s.VIDEO || l && 'outstream' !== f) && (n.require_asset_url = !0), e.params.video && (n.video = {}, Object.keys(e.params.video).filter(function (e) { + return (0, d.default)(S, e); + }).forEach(function (t) { + switch (t) { + case 'context': + case 'playback_method': + var r = e.params.video[t]; + r = i.isArray(r) ? r[0] : r, n.video[t] = I[t][r]; + break; + case 'frameworks': + break; + default: + n.video[t] = e.params.video[t]; + } + }), e.params.video.frameworks && i.isArray(e.params.video.frameworks) && (n.video_frameworks = e.params.video.frameworks)), e.renderer && (n.video = v({}, n.video, { custom_renderer_present: !0 })), e.params.frameworks && i.isArray(e.params.frameworks) && (n.banner_frameworks = e.params.frameworks); + var p = (0, c.default)(u.auctionManager.getAdUnits(), function (t) { + return e.transactionId === t.transactionId; + }); + return p && p.mediaTypes && p.mediaTypes.banner && n.ad_types.push(s.BANNER), 0 === n.ad_types.length && delete n.ad_types, n; + } + function D(e) { + var t = [], r = {}; + if (i.isArray(e) && 2 === e.length && !i.isArray(e[0])) { + r.width = parseInt(e[0], 10), r.height = parseInt(e[1], 10), t.push(r); + } else if ('object' === m(e)) { + for (var n = 0; n < e.length; n++) { + var o = e[n]; + (r = {}).width = parseInt(o[0], 10), r.height = parseInt(o[1], 10), t.push(r); + } + } + return t; + } + function k(e) { + return !!e.params.user; + } + function N(e) { + return !!parseInt(e.params.member, 10); + } + function M(e) { + if (e.params) { + return !!e.params.app; + } + } + function U(e) { + return e.params && e.params.app ? !!e.params.app.id : !!e.params.app; + } + function B(e) { + return !!e.debug; + } + function L(e) { + return e.mediaTypes && e.mediaTypes.video && e.mediaTypes.video.context === s.ADPOD; + } + function z(e) { + var t = !1, r = e.params, n = e.params.video; + return r.frameworks && i.isArray(r.frameworks) && (t = (0, d.default)(e.params.frameworks, 6)), !t && n && n.frameworks && i.isArray(n.frameworks) && (t = (0, d.default)(e.params.video.frameworks, 6)), t; + } + function V(e, t, r) { + i.isEmpty(e.video) && (e.video = {}), e.video[t] = r; + } + function F(e) { + var t, r; + t = e.adUnitCode, (r = document.getElementById(t).querySelectorAll('div[id^=\'google_ads\']'))[0] && r[0].style.setProperty('display', 'none'), function (e) { + try { + var t = document.getElementById(e).querySelectorAll('script[id^=\'sas_script\']'); + t[0].nextSibling && 'iframe' === t[0].nextSibling.localName && t[0].nextSibling.style.setProperty('display', 'none'); + } catch (e) { + } + }(e.adUnitCode), e.renderer.push(function () { + window.ANOutstreamVideo.renderAd({ + tagId: e.adResponse.tag_id, + sizes: [e.getSize().split('x')], + targetId: e.adUnitCode, + uuid: e.adResponse.uuid, + adResponse: e.adResponse, + rendererOptions: e.renderer.getConfig() + }, q.bind(null, e)); + }); + } + function q(e, t, r) { + e.renderer.handleVideoEvent({ + id: t, + eventName: r + }); + } + function G(e, t, r, n) { + return t && (n ? e.push({ + source: r, + id: t, + rti_partner: n + }) : e.push({ + source: r, + id: t + })), e; + } + t.spec = x, (0, a.registerBidder)(x); + }, + function (e, t, r) { + 'use strict'; + var n = r(14), i = r(38), o = r(170), a = ''.startsWith; + n(n.P + n.F * r(171)('startsWith'), 'String', { + startsWith: function (e) { + var t = o(this, e, 'startsWith'), r = i(Math.min(arguments.length > 1 ? arguments[1] : void 0, t.length)), n = String(e); + return a ? a.call(t, n, r) : t.slice(r, r + n.length) === n; + } + }); + }, + function (e, t, r) { + 'use strict'; + var n = r(52), i = r(395), o = r(396); + (0, n.instantiateBidBarrel)(i, o); + }, + function (e, t, r) { + 'use strict'; + e.exports = { + dfpPath: { property: 'metacritic' }, + targeting: { + seats: { + session: 4, + subsession: 4 + } + }, + contentAnnotation: { + siteCode: 'metacritic', + key: { + dev: 'AIzaSyDDxVOYxHDqmUjj1-ExbdKpeWgQGrl1md8', + prod: 'AIzaSyAxHL1MzzocPnCjESCQ4tCA6Vpuj9FQo6k' + } + }, + dynamicBidders: { + rubicon: function (e, t, r) { + return e.included ? { + siteId: r.isMobile() ? '378856' : '378854', + accountId: 23386 + } : null; + } + } + }; + }, + function (e) { + e.exports = JSON.parse('[{"code":"nav_ad_omni","sizes":[[6,6],[5,5]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"nav"},"bids":[{"bidder":"amazon","params":{"included":true}}]},{"code":"leader_plus_top","sizes":[[728,90],[970,250],[970,66]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_1"}},{"bidder":"appnexus","params":{"placementId":"21682286"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2094994","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678933","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096670"}},{"bidder":"trustx","params":{"uid":"77817"}},{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_970x250_1"}},{"bidder":"appnexus","params":{"placementId":"21682287"}},{"bidder":"ix","params":{"siteId":"678934","size":[970,250]}},{"bidder":"openx","params":{"unit":"544096673"}},{"bidder":"trustx","params":{"uid":"77815"}}]},{"code":"leader_top","sizes":[[728,90],[970,66],[728,91]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_2"}},{"bidder":"appnexus","params":{"placementId":"21682288"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095122","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678935","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096676"}},{"bidder":"trustx","params":{"uid":"77809"}}]},{"code":"native_top","sizes":[[11,11],"fluid"],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":{}},{"code":"mpu_plus_top","sizes":[[300,250],[300,600]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_300x250_1"}},{"bidder":"appnexus","params":{"placementId":"21682290"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095126","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678937","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096682"}},{"bidder":"trustx","params":{"uid":"77818"}},{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_300x600"}},{"bidder":"appnexus","params":{"placementId":"21682291"}},{"bidder":"ix","params":{"siteId":"678938","size":[300,600]}},{"bidder":"openx","params":{"unit":"544096662"}},{"bidder":"trustx","params":{"uid":"77810"}}]},{"code":"mpu_bottom","sizes":[[300,250]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"bottom"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_300x250_2"}},{"bidder":"appnexus","params":{"placementId":"21682292"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095128","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678939","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096665"}},{"bidder":"trustx","params":{"uid":"77812"}}]},{"code":"leader_bottom","sizes":[[728,90],[970,250],[970,66]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"bottom"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_4"}},{"bidder":"appnexus","params":{"placementId":"21682293"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095130","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678940","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096668"}},{"bidder":"trustx","params":{"uid":"77813"}},{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_970x250_2"}},{"bidder":"appnexus","params":{"placementId":"21682294"}},{"bidder":"ix","params":{"siteId":"678941","size":[970,250]}},{"bidder":"openx","params":{"unit":"544096671"}},{"bidder":"trustx","params":{"uid":"77814"}}]},{"code":"recirculation_ad","sizes":[[300,249]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"recirculation"},"bids":{}},{"code":"leader_middle","sizes":[[728,90],[970,66],[728,93]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_5"}},{"bidder":"appnexus","params":{"placementId":"21682296"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095134","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678943","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096677"}},{"bidder":"trustx","params":{"uid":"77816"}}]},{"code":"leader_middle2","sizes":[[728,90],[970,66],[728,93]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle2"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_6"}},{"bidder":"appnexus","params":{"placementId":"21682297"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095136","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678944","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096680"}},{"bidder":"trustx","params":{"uid":"77821"}}]},{"code":"incontent_plus_top","sizes":[[728,90],[970,250],[970,66],[5,5]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_728x90_7"}},{"bidder":"appnexus","params":{"placementId":"21682298"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095138","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678945","size":[728,90]}},{"bidder":"openx","params":{"unit":"544096683"}},{"bidder":"trustx","params":{"uid":"77819"}},{"bidder":"onemobile","params":{"dcn":"8a969d18017a7a158c4015fb6d9d0015","pos":"metacritic_dt_970x250_4"}},{"bidder":"appnexus","params":{"placementId":"21682299"}},{"bidder":"ix","params":{"siteId":"678946","size":[970,250]}},{"bidder":"openx","params":{"unit":"544096686"}},{"bidder":"trustx","params":{"uid":"77820"}}]},{"code":"mobile_nav_ad_omni","sizes":[[6,6],[5,5]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"nav"},"bids":[{"bidder":"kargo","params":{"placementId":"_wAKKYb2Lpq"}}]},{"code":"mobile_banner_top","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_1"}},{"bidder":"appnexus","params":{"placementId":"21682300"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2094996","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678947","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096689"}},{"bidder":"trustx","params":{"uid":"77823"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_1"}},{"bidder":"appnexus","params":{"placementId":"21864372"}},{"bidder":"ix","params":{"siteId":"678948","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096678"}},{"bidder":"trustx","params":{"uid":"77822"}}]},{"code":"mobile_native_top","sizes":[[11,11],"fluid"],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":{}},{"code":"mobile_incontent_plus_top","sizes":[[300,250],[320,50],[320,480],[5,5]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"top"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_2"}},{"bidder":"appnexus","params":{"placementId":"21682301"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095140","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678949","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096681"}},{"bidder":"trustx","params":{"uid":"77825"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_2"}},{"bidder":"appnexus","params":{"placementId":"21864373"}},{"bidder":"ix","params":{"siteId":"678950","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096684"}},{"bidder":"trustx","params":{"uid":"77826"}}]},{"code":"mobile_banner_plus_middle","sizes":[[300,250],[320,50]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_3"}},{"bidder":"appnexus","params":{"placementId":"21682302"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095142","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678951","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096685"}},{"bidder":"trustx","params":{"uid":"77824"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_3"}},{"bidder":"appnexus","params":{"placementId":"21864374"}},{"bidder":"ix","params":{"siteId":"678952","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096688"}},{"bidder":"trustx","params":{"uid":"77827"}}]},{"code":"mobile_incontent_plus_middle2","sizes":[[300,250],[320,50],[5,5]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"collapseEmptyDiv":[true],"targeting":{"pos":"middle2"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_4"}},{"bidder":"appnexus","params":{"placementId":"21682303"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095276","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678953","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096691"}},{"bidder":"trustx","params":{"uid":"77828"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_4"}},{"bidder":"appnexus","params":{"placementId":"21864375"}},{"bidder":"ix","params":{"siteId":"678954","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096694"}},{"bidder":"trustx","params":{"uid":"77829"}}]},{"code":"mobile_mpu_banner_bottom","sizes":[[300,250],[320,50]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"bottom"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_5"}},{"bidder":"appnexus","params":{"placementId":"21682304"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095146","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678955","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096697"}},{"bidder":"trustx","params":{"uid":"77830"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_5"}},{"bidder":"appnexus","params":{"placementId":"21864376"}},{"bidder":"ix","params":{"siteId":"678956","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096700"}},{"bidder":"trustx","params":{"uid":"77832"}}]},{"code":"mobile_gallery_banner_plus_1","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_6"}},{"bidder":"appnexus","params":{"placementId":"21682305"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678957","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096703"}},{"bidder":"trustx","params":{"uid":"77831"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_6"}},{"bidder":"appnexus","params":{"placementId":"21864377"}},{"bidder":"ix","params":{"siteId":"678958","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096687"}},{"bidder":"trustx","params":{"uid":"77833"}}]},{"code":"mobile_gallery_banner_plus_2","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_7"}},{"bidder":"appnexus","params":{"placementId":"21682306"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678959","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096690"}},{"bidder":"trustx","params":{"uid":"77834"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_7"}},{"bidder":"appnexus","params":{"placementId":"21864378"}},{"bidder":"ix","params":{"siteId":"678960","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096692"}},{"bidder":"trustx","params":{"uid":"77835"}}]},{"code":"mobile_gallery_banner_plus_3","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_8"}},{"bidder":"appnexus","params":{"placementId":"21682307"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678961","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096695"}},{"bidder":"trustx","params":{"uid":"77836"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_8"}},{"bidder":"appnexus","params":{"placementId":"21864379"}},{"bidder":"ix","params":{"siteId":"678962","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096698"}},{"bidder":"trustx","params":{"uid":"77837"}}]},{"code":"mobile_gallery_banner_plus_4","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_9"}},{"bidder":"appnexus","params":{"placementId":"21682308"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678963","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096701"}},{"bidder":"trustx","params":{"uid":"77838"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_9"}},{"bidder":"appnexus","params":{"placementId":"21864381"}},{"bidder":"ix","params":{"siteId":"678964","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096704"}},{"bidder":"trustx","params":{"uid":"77839"}}]},{"code":"mobile_gallery_banner_plus_5","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_10"}},{"bidder":"appnexus","params":{"placementId":"21682309"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678965","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096706"}},{"bidder":"trustx","params":{"uid":"77840"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_10"}},{"bidder":"appnexus","params":{"placementId":"21864384"}},{"bidder":"ix","params":{"siteId":"678966","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096708"}},{"bidder":"trustx","params":{"uid":"77841"}}]},{"code":"mobile_gallery_banner_plus_6","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_11"}},{"bidder":"appnexus","params":{"placementId":"21682310"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678967","size":[300,250]}},{"bidder":"kargo","params":{"placementId":"_lifHXd0Vth"}},{"bidder":"openx","params":{"unit":"544096711"}},{"bidder":"trustx","params":{"uid":"77842"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_11"}},{"bidder":"appnexus","params":{"placementId":"21864387"}},{"bidder":"ix","params":{"siteId":"678968","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096693"}},{"bidder":"trustx","params":{"uid":"77843"}}]},{"code":"mobile_gallery_banner_plus_7","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_12"}},{"bidder":"appnexus","params":{"placementId":"21682311"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678969","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096696"}},{"bidder":"trustx","params":{"uid":"77844"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_12"}},{"bidder":"appnexus","params":{"placementId":"21864388"}},{"bidder":"ix","params":{"siteId":"678970","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096699"}},{"bidder":"trustx","params":{"uid":"77845"}}]},{"code":"mobile_gallery_banner_plus_8","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_13"}},{"bidder":"appnexus","params":{"placementId":"21682312"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678971","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096702"}},{"bidder":"trustx","params":{"uid":"77846"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_13"}},{"bidder":"appnexus","params":{"placementId":"21864389"}},{"bidder":"ix","params":{"siteId":"678972","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096705"}},{"bidder":"trustx","params":{"uid":"77847"}}]},{"code":"mobile_gallery_banner_plus_9","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_14"}},{"bidder":"appnexus","params":{"placementId":"21682313"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678973","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096709"}},{"bidder":"trustx","params":{"uid":"77848"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_14"}},{"bidder":"appnexus","params":{"placementId":"21864390"}},{"bidder":"ix","params":{"siteId":"678974","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096712"}},{"bidder":"trustx","params":{"uid":"77849"}}]},{"code":"mobile_gallery_banner_plus_10","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_15"}},{"bidder":"appnexus","params":{"placementId":"21682314"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678975","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096714"}},{"bidder":"trustx","params":{"uid":"77850"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_15"}},{"bidder":"appnexus","params":{"placementId":"21864392"}},{"bidder":"ix","params":{"siteId":"678976","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096717"}},{"bidder":"trustx","params":{"uid":"77851"}}]},{"code":"mobile_gallery_banner_plus_11","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_16"}},{"bidder":"appnexus","params":{"placementId":"21682315"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678977","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096721"}},{"bidder":"trustx","params":{"uid":"77852"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_16"}},{"bidder":"appnexus","params":{"placementId":"21864393"}},{"bidder":"ix","params":{"siteId":"678978","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096707"}},{"bidder":"trustx","params":{"uid":"77853"}}]},{"code":"mobile_gallery_banner_plus_12","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_17"}},{"bidder":"appnexus","params":{"placementId":"21682316"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678980","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096710"}},{"bidder":"trustx","params":{"uid":"77854"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_17"}},{"bidder":"appnexus","params":{"placementId":"21864394"}},{"bidder":"ix","params":{"siteId":"678981","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096713"}},{"bidder":"trustx","params":{"uid":"77855"}}]},{"code":"mobile_gallery_banner_plus_13","sizes":[[300,250],[320,50],[320,480]],"cache":false,"allowedTypes":{"banner":true,"native":false,"video":false},"targeting":{"pos":"middle"},"bids":[{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_300x250_18"}},{"bidder":"appnexus","params":{"placementId":"21682317"}},{"bidder":"amazon","params":{"included":true}},{"bidder":"pubmatic","params":{"included":true}},{"bidder":"rubicon","params":{"zoneId":"2095148","included":true}},{"bidder":"sonobi","params":{"included":true}},{"bidder":"ix","params":{"siteId":"678982","size":[300,250]}},{"bidder":"openx","params":{"unit":"544096715"}},{"bidder":"trustx","params":{"uid":"77856"}},{"bidder":"onemobile","params":{"dcn":"8a96947b017a7a15964715fb6eb5001a","pos":"metacritic_mw_320x50_18"}},{"bidder":"appnexus","params":{"placementId":"21864395"}},{"bidder":"ix","params":{"siteId":"678983","size":[320,50]}},{"bidder":"openx","params":{"unit":"544096718"}},{"bidder":"trustx","params":{"uid":"77857"}}]}]'); + }, + function (e, t, r) { + 'use strict'; + r(16), r(83), r(40), function (e, t) { + if ('IntersectionObserver' in e && 'IntersectionObserverEntry' in e && 'intersectionRatio' in e.IntersectionObserverEntry.prototype) { + 'isIntersecting' in e.IntersectionObserverEntry.prototype || Object.defineProperty(e.IntersectionObserverEntry.prototype, 'isIntersecting', { + get: function () { + return this.intersectionRatio > 0; + } + }); + } else { + var r = []; + i.prototype.THROTTLE_TIMEOUT = 100, i.prototype.POLL_INTERVAL = null, i.prototype.USE_MUTATION_OBSERVER = !0, i.prototype.observe = function (e) { + if (!this._observationTargets.some(function (t) { + return t.element == e; + })) { + if (!e || 1 != e.nodeType) { + throw new Error('target must be an Element'); + } + this._registerInstance(), this._observationTargets.push({ + element: e, + entry: null + }), this._monitorIntersections(), this._checkForIntersections(); + } + }, i.prototype.unobserve = function (e) { + this._observationTargets = this._observationTargets.filter(function (t) { + return t.element != e; + }), this._observationTargets.length || (this._unmonitorIntersections(), this._unregisterInstance()); + }, i.prototype.disconnect = function () { + this._observationTargets = [], this._unmonitorIntersections(), this._unregisterInstance(); + }, i.prototype.takeRecords = function () { + var e = this._queuedEntries.slice(); + return this._queuedEntries = [], e; + }, i.prototype._initThresholds = function (e) { + var t = e || [0]; + return Array.isArray(t) || (t = [t]), t.sort().filter(function (e, t, r) { + if ('number' != typeof e || isNaN(e) || e < 0 || e > 1) { + throw new Error('threshold must be a number between 0 and 1 inclusively'); + } + return e !== r[t - 1]; + }); + }, i.prototype._parseRootMargin = function (e) { + var t = (e || '0px').split(/\s+/).map(function (e) { + var t = /^(-?\d*\.?\d+)(px|%)$/.exec(e); + if (!t) { + throw new Error('rootMargin must be specified in pixels or percent'); + } + return { + value: parseFloat(t[1]), + unit: t[2] + }; + }); + return t[1] = t[1] || t[0], t[2] = t[2] || t[0], t[3] = t[3] || t[1], t; + }, i.prototype._monitorIntersections = function () { + this._monitoringIntersections || (this._monitoringIntersections = !0, this.POLL_INTERVAL ? this._monitoringInterval = setInterval(this._checkForIntersections, this.POLL_INTERVAL) : (o(e, 'resize', this._checkForIntersections, !0), o(t, 'scroll', this._checkForIntersections, !0), this.USE_MUTATION_OBSERVER && 'MutationObserver' in e && (this._domObserver = new MutationObserver(this._checkForIntersections), this._domObserver.observe(t, { + attributes: !0, + childList: !0, + characterData: !0, + subtree: !0 + })))); + }, i.prototype._unmonitorIntersections = function () { + this._monitoringIntersections && (this._monitoringIntersections = !1, clearInterval(this._monitoringInterval), this._monitoringInterval = null, a(e, 'resize', this._checkForIntersections, !0), a(t, 'scroll', this._checkForIntersections, !0), this._domObserver && (this._domObserver.disconnect(), this._domObserver = null)); + }, i.prototype._checkForIntersections = function () { + var t = this._rootIsInDom(), r = t ? this._getRootRect() : { + top: 0, + bottom: 0, + left: 0, + right: 0, + width: 0, + height: 0 + }; + this._observationTargets.forEach(function (i) { + var o = i.element, a = s(o), u = this._rootContainsTarget(o), c = i.entry, d = t && u && this._computeTargetAndRootIntersection(o, r), l = i.entry = new n({ + time: e.performance && performance.now && performance.now(), + target: o, + boundingClientRect: a, + rootBounds: r, + intersectionRect: d + }); + c ? t && u ? this._hasCrossedThreshold(c, l) && this._queuedEntries.push(l) : c && c.isIntersecting && this._queuedEntries.push(l) : this._queuedEntries.push(l); + }, this), this._queuedEntries.length && this._callback(this.takeRecords(), this); + }, i.prototype._computeTargetAndRootIntersection = function (r, n) { + if ('none' != e.getComputedStyle(r).display) { + for (var i, o, a, u, d, l, f, p, g = s(r), m = c(r), v = !1; !v;) { + var b = null, y = 1 == m.nodeType ? e.getComputedStyle(m) : {}; + if ('none' == y.display) { + return; + } + if (m == this.root || m == t ? (v = !0, b = n) : m != t.body && m != t.documentElement && 'visible' != y.overflow && (b = s(m)), b && (i = b, o = g, a = void 0, u = void 0, d = void 0, l = void 0, f = void 0, p = void 0, a = Math.max(i.top, o.top), u = Math.min(i.bottom, o.bottom), d = Math.max(i.left, o.left), l = Math.min(i.right, o.right), p = u - a, !(g = (f = l - d) >= 0 && p >= 0 && { + top: a, + bottom: u, + left: d, + right: l, + width: f, + height: p + }))) { + break; + } + m = c(m); + } + return g; + } + }, i.prototype._getRootRect = function () { + var e; + if (this.root) { + e = s(this.root); + } else { + var r = t.documentElement, n = t.body; + e = { + top: 0, + left: 0, + right: r.clientWidth || n.clientWidth, + width: r.clientWidth || n.clientWidth, + bottom: r.clientHeight || n.clientHeight, + height: r.clientHeight || n.clientHeight + }; + } + return this._expandRectByRootMargin(e); + }, i.prototype._expandRectByRootMargin = function (e) { + var t = this._rootMarginValues.map(function (t, r) { + return 'px' == t.unit ? t.value : t.value * (r % 2 ? e.width : e.height) / 100; + }), r = { + top: e.top - t[0], + right: e.right + t[1], + bottom: e.bottom + t[2], + left: e.left - t[3] + }; + return r.width = r.right - r.left, r.height = r.bottom - r.top, r; + }, i.prototype._hasCrossedThreshold = function (e, t) { + var r = e && e.isIntersecting ? e.intersectionRatio || 0 : -1, n = t.isIntersecting ? t.intersectionRatio || 0 : -1; + if (r !== n) { + for (var i = 0; i < this.thresholds.length; i++) { + var o = this.thresholds[i]; + if (o == r || o == n || o < r != o < n) { + return !0; + } + } + } + }, i.prototype._rootIsInDom = function () { + return !this.root || u(t, this.root); + }, i.prototype._rootContainsTarget = function (e) { + return u(this.root || t, e); + }, i.prototype._registerInstance = function () { + r.indexOf(this) < 0 && r.push(this); + }, i.prototype._unregisterInstance = function () { + var e = r.indexOf(this); + -1 != e && r.splice(e, 1); + }, e.IntersectionObserver = i, e.IntersectionObserverEntry = n; + } + function n(e) { + this.time = e.time, this.target = e.target, this.rootBounds = e.rootBounds, this.boundingClientRect = e.boundingClientRect, this.intersectionRect = e.intersectionRect || { + top: 0, + bottom: 0, + left: 0, + right: 0, + width: 0, + height: 0 + }, this.isIntersecting = !!e.intersectionRect; + var t = this.boundingClientRect, r = t.width * t.height, n = this.intersectionRect, i = n.width * n.height; + this.intersectionRatio = r ? Number((i / r).toFixed(4)) : this.isIntersecting ? 1 : 0; + } + function i(e, t) { + var r, n, i, o = t || {}; + if ('function' != typeof e) { + throw new Error('callback must be a function'); + } + if (o.root && 1 != o.root.nodeType) { + throw new Error('root must be an Element'); + } + this._checkForIntersections = (r = this._checkForIntersections.bind(this), n = this.THROTTLE_TIMEOUT, i = null, function () { + i || (i = setTimeout(function () { + r(), i = null; + }, n)); + }), this._callback = e, this._observationTargets = [], this._queuedEntries = [], this._rootMarginValues = this._parseRootMargin(o.rootMargin), this.thresholds = this._initThresholds(o.threshold), this.root = o.root || null, this.rootMargin = this._rootMarginValues.map(function (e) { + return e.value + e.unit; + }).join(' '); + } + function o(e, t, r, n) { + 'function' == typeof e.addEventListener ? e.addEventListener(t, r, n || !1) : 'function' == typeof e.attachEvent && e.attachEvent('on' + t, r); + } + function a(e, t, r, n) { + 'function' == typeof e.removeEventListener ? e.removeEventListener(t, r, n || !1) : 'function' == typeof e.detatchEvent && e.detatchEvent('on' + t, r); + } + function s(e) { + var t; + try { + t = e.getBoundingClientRect(); + } catch (e) { + } + return t ? (t.width && t.height || (t = { + top: t.top, + right: t.right, + bottom: t.bottom, + left: t.left, + width: t.right - t.left, + height: t.bottom - t.top + }), t) : { + top: 0, + bottom: 0, + left: 0, + right: 0, + width: 0, + height: 0 + }; + } + function u(e, t) { + for (var r = t; r;) { + if (r == e) { + return !0; + } + r = c(r); + } + return !1; + } + function c(e) { + var t = e.parentNode; + return t && 11 == t.nodeType && t.host ? t.host : t && t.assignedSlot ? t.assignedSlot.parentNode : t; + } + }(window, document); + } + ]); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-bugsnag.min.js b/resources/sugarcoat-bugsnag.min.js new file mode 100644 index 00000000..c1df4b0d --- /dev/null +++ b/resources/sugarcoat-bugsnag.min.js @@ -0,0 +1,1727 @@ +{ + const $___mock_b3615e3d24fb9d30 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_b3615e3d24fb9d30); + (function () { + !function (e) { + if ('object' == typeof exports && 'undefined' != typeof module) + module.exports = e(); + else if ('function' == typeof define && define.amd) + define([], e); + else { + ('undefined' != typeof window ? window : 'undefined' != typeof global ? global : 'undefined' != typeof self ? self : this).bugsnag = e(); + } + }(function () { + function e(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function t(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function n() { + return J((Math.random() * re << 0).toString(ne), te); + } + function r() { + return ee = ee < re ? ee : 0, ++ee - 1; + } + function i() { + return 'c' + new Date().getTime().toString(ne) + J(r().toString(ne), te) + Q() + (n() + n()); + } + function o(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function a(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function s(e) { + var t = [e.tagName]; + if (e.id && t.push('#' + e.id), e.className && e.className.length && t.push('.' + e.className.split(' ').join('.')), !document.querySelectorAll || !Array.prototype.indexOf) + return t.join(''); + try { + if (1 === document.querySelectorAll(t.join('')).length) + return t.join(''); + } catch (r) { + return t.join(''); + } + if (e.parentNode.childNodes.length > 1) { + var n = Array.prototype.indexOf.call(e.parentNode.childNodes, e) + 1; + t.push(':nth-child(' + n + ')'); + } + return 1 === document.querySelectorAll(t.join('')).length ? t.join('') : e.parentNode ? s(e.parentNode) + ' > ' + t.join('') : t.join(''); + } + function u(e, t) { + return e && e.length <= t ? e : e.slice(0, t - '(...)'.length) + '(...)'; + } + function c() { + if (!tt(rt(), this[Qe])) { + var e = { + status: this.status, + request: this[et] + ' ' + this[Qe] + }; + this.status >= 400 ? nt.leaveBreadcrumb('XMLHttpRequest failed', e, Ze) : nt.leaveBreadcrumb('XMLHttpRequest succeeded', e, Ze); + } + } + function f() { + tt(rt(), this[Qe]) || nt.leaveBreadcrumb('XMLHttpRequest error', { request: this[et] + ' ' + this[Qe] }, Ze); + } + function d(e) { + return '[Throws: ' + (e ? e.message : '?') + ']'; + } + function l(e, t) { + for (var n = 0, r = e.length; n < r; n++) + if (e[n] === t) + return !0; + return !1; + } + function g(e) { + return '[object Array]' === Object.prototype.toString.call(e); + } + function p(e, t) { + try { + return e[t]; + } catch (n) { + return d(n); + } + } + function h(e) { + function t(e, i) { + function o() { + return i > xt && r > Dt; + } + if (r++, i === undefined && (i = 0), i > Bt) + return Lt; + if (o()) + return Lt; + if (null === e || 'object' != typeof e) + return e; + if (l(n, e)) + return '[Circular]'; + if (n.push(e), 'function' == typeof e.toJSON) + try { + r--; + var a = t(e.toJSON(), i); + return n.pop(), a; + } catch (m) { + return d(m); + } + if (g(e)) { + for (var s = [], u = 0, c = e.length; u < c; u++) { + if (o()) { + s.push(Lt); + break; + } + s.push(t(e[u], i + 1)); + } + return n.pop(), s; + } + var f = {}; + try { + for (var h in e) + if (Object.prototype.hasOwnProperty.call(e, h)) { + if (o()) { + f[h] = Lt; + break; + } + f[h] = t(p(e, h), i + 1); + } + } catch (v) { + } + return n.pop(), f; + } + var n = [], r = 0; + return t(e); + } + var m = function (e, t, n) { + for (var r = n, i = 0, o = e.length; i < o; i++) + r = t(r, e[i], i, e); + return r; + }, v = !{ toString: null }.propertyIsEnumerable('toString'), y = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], b = function (e) { + return e < 10 ? '0' + e : e; + }, w = { + map: function (e, t) { + return m(e, function (e, n, r, i) { + return e.concat(t(n, r, i)); + }, []); + }, + reduce: m, + filter: function (e, t) { + return m(e, function (e, n, r, i) { + return t(n, r, i) ? e.concat(n) : e; + }, []); + }, + includes: function (e, t) { + return m(e, function (e, n, r, i) { + return !0 === e || n === t; + }, !1); + }, + keys: function (e) { + var t = [], n = void 0; + for (n in e) + Object.prototype.hasOwnProperty.call(e, n) && t.push(n); + if (!v) + return t; + for (var r = 0, i = y.length; r < i; r++) + Object.prototype.hasOwnProperty.call(e, y[r]) && t.push(y[r]); + return t; + }, + isArray: function (e) { + return '[object Array]' === Object.prototype.toString.call(e); + }, + isoDate: function () { + var e = new Date(); + return e.getUTCFullYear() + '-' + b(e.getUTCMonth() + 1) + '-' + b(e.getUTCDate()) + 'T' + b(e.getUTCHours()) + ':' + b(e.getUTCMinutes()) + ':' + b(e.getUTCSeconds()) + '.' + (e.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) + 'Z'; + } + }, S = w.isoDate, O = function () { + function t() { + var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[anonymous]', r = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'manual', o = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : S(); + e(this, t), this.type = i, this.name = n, this.metaData = r, this.timestamp = o; + } + return t.prototype.toJSON = function () { + return { + type: this.type, + name: this.name, + timestamp: this.timestamp, + metaData: this.metaData + }; + }, t; + }(), j = {}, E = w.includes; + j.positiveIntIfDefined = function (e) { + return E([ + 'undefined', + 'number' + ], typeof e) && parseInt('' + e, 10) === e && e > 0; + }, j.stringWithLength = function (e) { + return 'string' == typeof e && !!e.length; + }; + var N = {}, R = w.filter, k = w.reduce, B = w.keys, D = w.isArray, x = w.includes, L = j.positiveIntIfDefined, _ = j.stringWithLength; + N.schema = { + apiKey: { + defaultValue: function () { + return null; + }, + message: 'is required', + validate: _ + }, + appVersion: { + defaultValue: function () { + return null; + }, + message: 'should be a string', + validate: function (e) { + return null === e || _(e); + } + }, + autoNotify: { + defaultValue: function () { + return !0; + }, + message: 'should be true|false', + validate: function (e) { + return !0 === e || !1 === e; + } + }, + beforeSend: { + defaultValue: function () { + return []; + }, + message: 'should be a function or array of functions', + validate: function (e) { + return 'function' == typeof e || D(e) && R(e, function (e) { + return 'function' == typeof e; + }).length === e.length; + } + }, + endpoints: { + defaultValue: function () { + return { + notify: 'https://notify.bugsnag.com', + sessions: 'https://sessions.bugsnag.com' + }; + }, + message: 'should be an object containing endpoint URLs { notify, sessions }. sessions is optional if autoCaptureSessions=false', + validate: function (e, t) { + return e && 'object' == typeof e && _(e.notify) && (!1 === t.autoCaptureSessions || _(e.sessions)) && 0 === R(B(e), function (e) { + return !x([ + 'notify', + 'sessions' + ], e); + }).length; + } + }, + autoCaptureSessions: { + defaultValue: function (e, t) { + return t.endpoints === undefined || !!t.endpoints && !!t.endpoints.sessions; + }, + message: 'should be true|false', + validate: function (e) { + return !0 === e || !1 === e; + } + }, + notifyReleaseStages: { + defaultValue: function () { + return null; + }, + message: 'should be an array of strings', + validate: function (e) { + return null === e || D(e) && R(e, function (e) { + return 'string' == typeof e; + }).length === e.length; + } + }, + releaseStage: { + defaultValue: function () { + return 'production'; + }, + message: 'should be a string', + validate: function (e) { + return 'string' == typeof e && e.length; + } + }, + maxBreadcrumbs: { + defaultValue: function () { + return 20; + }, + message: 'should be a number \u226440', + validate: function (e) { + return 0 === e || L(e) && (e === undefined || e <= 40); + } + }, + autoBreadcrumbs: { + defaultValue: function () { + return !0; + }, + message: 'should be true|false', + validate: function (e) { + return 'boolean' == typeof e; + } + }, + user: { + defaultValue: function () { + return null; + }, + message: '(object) user should be an object', + validate: function (e) { + return 'object' == typeof e; + } + }, + metaData: { + defaultValue: function () { + return null; + }, + message: 'should be an object', + validate: function (e) { + return 'object' == typeof e; + } + }, + logger: { + defaultValue: function () { + return undefined; + }, + message: 'should be null or an object with methods { debug, info, warn, error }', + validate: function (e) { + return !e || e && k([ + 'debug', + 'info', + 'warn', + 'error' + ], function (t, n) { + return t && 'function' == typeof e[n]; + }, !0); + } + } + }, N.mergeDefaults = function (e, t) { + if (!e || !t) + throw new Error('opts and schema objects are required'); + return k(B(t), function (n, r) { + return n[r] = e[r] !== undefined ? e[r] : t[r].defaultValue(e[r], e), n; + }, {}); + }, N.validate = function (e, t) { + if (!e || !t) + throw new Error('opts and schema objects are required'); + var n = k(B(t), function (n, r) { + return t[r].validate(e[r], e) ? n : n.concat({ + key: r, + message: t[r].message, + value: e[r] + }); + }, []); + return { + valid: !n.length, + errors: n + }; + }; + var C = function (e) { + return e.app && 'string' == typeof e.app.releaseStage ? e.app.releaseStage : e.config.releaseStage; + }, q = function (e) { + return !(!e || !e.stack && !e.stacktrace && !e['opera#sourceloc'] || 'string' != typeof (e.stack || e.stacktrace || e['opera#sourceloc']) || e.stack === e.name + ': ' + e.message); + }, T = {}; + !function (e, t) { + 'use strict'; + 'object' == typeof T ? T = t() : e.StackFrame = t(); + }(this, function () { + 'use strict'; + function e(e) { + return !isNaN(parseFloat(e)) && isFinite(e); + } + function t(e) { + return e.charAt(0).toUpperCase() + e.substring(1); + } + function n(e) { + return function () { + return this[e]; + }; + } + function r(e) { + if (e instanceof Object) + for (var n = 0; n < u.length; n++) + e.hasOwnProperty(u[n]) && e[u[n]] !== undefined && this['set' + t(u[n])](e[u[n]]); + } + var i = [ + 'isConstructor', + 'isEval', + 'isNative', + 'isToplevel' + ], o = [ + 'columnNumber', + 'lineNumber' + ], a = [ + 'fileName', + 'functionName', + 'source' + ], s = ['args'], u = i.concat(o, a, s); + r.prototype = { + getArgs: function () { + return this.args; + }, + setArgs: function (e) { + if ('[object Array]' !== Object.prototype.toString.call(e)) + throw new TypeError('Args must be an Array'); + this.args = e; + }, + getEvalOrigin: function () { + return this.evalOrigin; + }, + setEvalOrigin: function (e) { + if (e instanceof r) + this.evalOrigin = e; + else { + if (!(e instanceof Object)) + throw new TypeError('Eval Origin must be an Object or StackFrame'); + this.evalOrigin = new r(e); + } + }, + toString: function () { + return (this.getFunctionName() || '{anonymous}') + ('(' + (this.getArgs() || []).join(',') + ')') + (this.getFileName() ? '@' + this.getFileName() : '') + (e(this.getLineNumber()) ? ':' + this.getLineNumber() : '') + (e(this.getColumnNumber()) ? ':' + this.getColumnNumber() : ''); + } + }; + for (var c = 0; c < i.length; c++) + r.prototype['get' + t(i[c])] = n(i[c]), r.prototype['set' + t(i[c])] = function (e) { + return function (t) { + this[e] = Boolean(t); + }; + }(i[c]); + for (var f = 0; f < o.length; f++) + r.prototype['get' + t(o[f])] = n(o[f]), r.prototype['set' + t(o[f])] = function (t) { + return function (n) { + if (!e(n)) + throw new TypeError(t + ' must be a Number'); + this[t] = Number(n); + }; + }(o[f]); + for (var d = 0; d < a.length; d++) + r.prototype['get' + t(a[d])] = n(a[d]), r.prototype['set' + t(a[d])] = function (e) { + return function (t) { + this[e] = String(t); + }; + }(a[d]); + return r; + }); + var A = {}; + !function (e, t) { + 'use strict'; + 'object' == typeof A ? A = t(T) : e.ErrorStackParser = t(e.StackFrame); + }(this, function (e) { + 'use strict'; + var t = /(^|@)\S+\:\d+/, n = /^\s*at .*(\S+\:\d+|\(native\))/m, r = /^(eval@)?(\[native code\])?$/; + return { + parse: function (e) { + if ('undefined' != typeof e.stacktrace || 'undefined' != typeof e['opera#sourceloc']) + return this.parseOpera(e); + if (e.stack && e.stack.match(n)) + return this.parseV8OrIE(e); + if (e.stack) + return this.parseFFOrSafari(e); + throw new Error('Cannot parse given Error object'); + }, + extractLocation: function (e) { + if (-1 === e.indexOf(':')) + return [e]; + var t = /(.+?)(?:\:(\d+))?(?:\:(\d+))?$/.exec(e.replace(/[\(\)]/g, '')); + return [ + t[1], + t[2] || undefined, + t[3] || undefined + ]; + }, + parseV8OrIE: function (t) { + return t.stack.split('\n').filter(function (e) { + return !!e.match(n); + }, this).map(function (t) { + t.indexOf('(eval ') > -1 && (t = t.replace(/eval code/g, 'eval').replace(/(\(eval at [^\()]*)|(\)\,.*$)/g, '')); + var n = t.replace(/^\s+/, '').replace(/\(eval code/g, '(').split(/\s+/).slice(1), r = this.extractLocation(n.pop()), i = n.join(' ') || undefined, o = [ + 'eval', + '' + ].indexOf(r[0]) > -1 ? undefined : r[0]; + return new e({ + functionName: i, + fileName: o, + lineNumber: r[1], + columnNumber: r[2], + source: t + }); + }, this); + }, + parseFFOrSafari: function (t) { + return t.stack.split('\n').filter(function (e) { + return !e.match(r); + }, this).map(function (t) { + if (t.indexOf(' > eval') > -1 && (t = t.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g, ':$1')), -1 === t.indexOf('@') && -1 === t.indexOf(':')) + return new e({ functionName: t }); + var n = /((.*".+"[^@]*)?[^@]*)(?:@)/, r = t.match(n), i = r && r[1] ? r[1] : undefined, o = this.extractLocation(t.replace(n, '')); + return new e({ + functionName: i, + fileName: o[0], + lineNumber: o[1], + columnNumber: o[2], + source: t + }); + }, this); + }, + parseOpera: function (e) { + return !e.stacktrace || e.message.indexOf('\n') > -1 && e.message.split('\n').length > e.stacktrace.split('\n').length ? this.parseOpera9(e) : e.stack ? this.parseOpera11(e) : this.parseOpera10(e); + }, + parseOpera9: function (t) { + for (var n = /Line (\d+).*script (?:in )?(\S+)/i, r = t.message.split('\n'), i = [], o = 2, a = r.length; o < a; o += 2) { + var s = n.exec(r[o]); + s && i.push(new e({ + fileName: s[2], + lineNumber: s[1], + source: r[o] + })); + } + return i; + }, + parseOpera10: function (t) { + for (var n = /Line (\d+).*script (?:in )?(\S+)(?:: In function (\S+))?$/i, r = t.stacktrace.split('\n'), i = [], o = 0, a = r.length; o < a; o += 2) { + var s = n.exec(r[o]); + s && i.push(new e({ + functionName: s[3] || undefined, + fileName: s[2], + lineNumber: s[1], + source: r[o] + })); + } + return i; + }, + parseOpera11: function (n) { + return n.stack.split('\n').filter(function (e) { + return !!e.match(t) && !e.match(/^Error created at/); + }, this).map(function (t) { + var n, r = t.split('@'), i = this.extractLocation(r.pop()), o = r.shift() || '', a = o.replace(//, '$2').replace(/\([^\)]*\)/g, '') || undefined; + o.match(/\(([^\)]*)\)/) && (n = o.replace(/^[^\(]+\(([^\)]*)\)$/, '$1')); + var s = n === undefined || '[arguments not available]' === n ? undefined : n.split(','); + return new e({ + functionName: a, + args: s, + fileName: i[0], + lineNumber: i[1], + columnNumber: i[2], + source: t + }); + }, this); + } + }; + }); + var M = {}; + !function (e, t) { + 'use strict'; + 'object' == typeof M ? M = t(T) : e.StackGenerator = t(e.StackFrame); + }(this, function (e) { + return { + backtrace: function (t) { + var n = [], r = 10; + 'object' == typeof t && 'number' == typeof t.maxStackSize && (r = t.maxStackSize); + for (var i = arguments.callee; i && n.length < r && i.arguments;) { + for (var o = new Array(i.arguments.length), a = 0; a < o.length; ++a) + o[a] = i.arguments[a]; + /function(?:\s+([\w$]+))+\s*\(/.test(i.toString()) ? n.push(new e({ + functionName: RegExp.$1 || undefined, + args: o + })) : n.push(new e({ args: o })); + try { + i = i.caller; + } catch (s) { + break; + } + } + return n; + } + }; + }); + var P = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, V = w.reduce, H = w.filter, U = function () { + function e(n, r) { + var i = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [], o = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : F(); + t(this, e), this.__isBugsnagReport = !0, this._ignored = !1, this._handledState = o, this.app = undefined, this.apiKey = undefined, this.breadcrumbs = [], this.context = undefined, this.device = undefined, this.errorClass = K(n, '[no error class]'), this.errorMessage = K(r, '[no error message]'), this.groupingHash = undefined, this.metaData = {}, this.request = undefined, this.severity = this._handledState.severity, this.stacktrace = V(i, function (e, t) { + var n = I(t); + try { + return '{}' === JSON.stringify(n) ? e : e.concat(n); + } catch (r) { + return e; + } + }, []), this.user = undefined, this.session = undefined; + } + return e.prototype.ignore = function () { + this._ignored = !0; + }, e.prototype.isIgnored = function () { + return this._ignored; + }, e.prototype.updateMetaData = function (e) { + var t; + if (!e) + return this; + var n = void 0; + return null === (arguments.length <= 1 ? undefined : arguments[1]) ? this.removeMetaData(e) : null === (arguments.length <= 2 ? undefined : arguments[2]) ? this.removeMetaData(e, arguments.length <= 1 ? undefined : arguments[1], arguments.length <= 2 ? undefined : arguments[2]) : ('object' == typeof (arguments.length <= 1 ? undefined : arguments[1]) && (n = arguments.length <= 1 ? undefined : arguments[1]), 'string' == typeof (arguments.length <= 1 ? undefined : arguments[1]) && (t = {}, t[arguments.length <= 1 ? undefined : arguments[1]] = arguments.length <= 2 ? undefined : arguments[2], n = t), n ? (this.metaData[e] || (this.metaData[e] = {}), this.metaData[e] = P({}, this.metaData[e], n), this) : this); + }, e.prototype.removeMetaData = function (e, t) { + return 'string' != typeof e ? this : t ? this.metaData[e] ? (delete this.metaData[e][t], this) : this : (delete this.metaData[e], this); + }, e.prototype.toJSON = function () { + return { + payloadVersion: '4', + exceptions: [{ + errorClass: this.errorClass, + message: this.errorMessage, + stacktrace: this.stacktrace, + type: 'browserjs' + }], + severity: this.severity, + unhandled: this._handledState.unhandled, + severityReason: this._handledState.severityReason, + app: this.app, + device: this.device, + breadcrumbs: this.breadcrumbs, + context: this.context, + user: this.user, + metaData: this.metaData, + groupingHash: this.groupingHash, + request: this.request, + session: this.session + }; + }, e; + }(), I = function (e) { + var t = { + file: e.fileName, + method: $(e.functionName), + lineNumber: e.lineNumber, + columnNumber: e.columnNumber, + code: undefined, + inProject: undefined + }; + return t.lineNumber > -1 && !t.file && !t.method && (t.file = 'global code'), t; + }, $ = function (e) { + return /^global code$/i.test(e) ? 'global code' : e; + }, F = function () { + return { + unhandled: !1, + severity: 'warning', + severityReason: { type: 'handledException' } + }; + }, K = function (e, t) { + return 'string' == typeof e && e ? e : t; + }; + U.getStacktrace = function (e) { + var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + return q(e) ? A.parse(e).slice(t) : H(M.backtrace(), function (e) { + return -1 === (e.functionName || '').indexOf('StackGenerator$$'); + }).slice(1 + n); + }, U.ensureReport = function (e) { + var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0, n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + if (e.__isBugsnagReport) + return e; + try { + var r = U.getStacktrace(e, t, 1 + n); + return new U(e.name, e.message, r); + } catch (i) { + return new U(e.name, e.message, []); + } + }; + var X = U, J = function (e, t) { + var n = '000000000' + e; + return n.substr(n.length - t); + }, z = 'object' == typeof window ? window : self, G = 0; + for (var W in z) + Object.hasOwnProperty.call(z, W) && G++; + var Y = navigator.mimeTypes ? navigator.mimeTypes.length : 0, Z = J((Y + navigator.userAgent.length).toString(36) + G.toString(36), 4), Q = function () { + return Z; + }, ee = 0, te = 4, ne = 36, re = Math.pow(ne, te); + i.fingerprint = Q; + var ie = i, oe = w.isoDate, ae = function () { + function e() { + o(this, e), this.id = ie(), this.startedAt = oe(), this._handled = 0, this._unhandled = 0; + } + return e.prototype.toJSON = function () { + return { + id: this.id, + startedAt: this.startedAt, + events: { + handled: this._handled, + unhandled: this._unhandled + } + }; + }, e.prototype.trackError = function (e) { + this[e._handledState.unhandled ? '_unhandled' : '_handled'] += 1; + }, e; + }(), se = function (e) { + switch (Object.prototype.toString.call(e)) { + case '[object Error]': + case '[object Exception]': + case '[object DOMException]': + return !0; + default: + return e instanceof Error; + } + }, ue = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, ce = w.map, fe = w.reduce, de = w.includes, le = w.isArray, ge = function () { + }, pe = function () { + function e(t) { + var n = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : N.schema, r = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + if (a(this, e), !(t && t.name && t.version && t.url)) + throw new Error('`notifier` argument is required'); + this.notifier = t, this.configSchema = n, this._configured = !1, this._transport = { + sendSession: ge, + sendReport: ge + }, this._logger = { + debug: ge, + info: ge, + warn: ge, + error: ge + }, this.plugins = [], this.session = r, this.beforeSession = [], this.breadcrumbs = [], this.app = {}, this.context = undefined, this.device = undefined, this.metaData = undefined, this.request = undefined, this.user = {}, this.BugsnagReport = X, this.BugsnagBreadcrumb = O, this.BugsnagSession = ae; + } + return e.prototype.configure = function () { + var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.config = N.mergeDefaults(ue({}, this.config, e), this.configSchema); + var t = N.validate(this.config, this.configSchema); + if (!0 == !t.valid) + throw new Error(ve(t.errors)); + return 'function' == typeof this.config.beforeSend && (this.config.beforeSend = [this.config.beforeSend]), null !== this.config.appVersion && (this.app.version = this.config.appVersion), this.config.metaData && (this.metaData = this.config.metaData), this.config.user && (this.user = this.config.user), this.config.logger && this.logger(this.config.logger), this._configured = !0, this._logger.debug('Loaded!'), this; + }, e.prototype.use = function (e) { + return this.plugins.push(e), e.init(this); + }, e.prototype.transport = function (e) { + return this._transport = e, this; + }, e.prototype.logger = function (e, t) { + return this._logger = e, this; + }, e.prototype.sessionDelegate = function (e) { + return this._sessionDelegate = e, this; + }, e.prototype.startSession = function () { + return this._sessionDelegate ? this._sessionDelegate.startSession(this) : (this._logger.warn('No session implementation is installed'), this); + }, e.prototype.leaveBreadcrumb = function (e, t, n, r) { + if (!this._configured) + throw new Error('client not configured'); + if (e = e || undefined, n = 'string' == typeof n ? n : undefined, r = 'string' == typeof r ? r : undefined, t = 'object' == typeof t && null !== t ? t : undefined, 'string' == typeof e || t) { + var i = new O(e, t, n, r); + return this.breadcrumbs.push(i), this.breadcrumbs.length > this.config.maxBreadcrumbs && (this.breadcrumbs = this.breadcrumbs.slice(this.breadcrumbs.length - this.config.maxBreadcrumbs)), this; + } + }, e.prototype.notify = function (e) { + var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + if (!this._configured) + throw new Error('client not configured'); + var n = C(this), r = he(e, t, this._logger), i = r.err, o = r.errorFramesToSkip, a = r._opts; + if (a && (t = a), !i) { + var s = ye('nothing'); + this._logger.warn('Usage error. ' + s), i = new Error('Bugsnag usage error. ' + s); + } + 'object' == typeof t && null !== t || (t = {}); + var u = X.ensureReport(i, o, 1); + if (u.app = ue({ releaseStage: n }, u.app, this.app), u.context = u.context || t.context || this.context || undefined, u.device = ue({}, u.device, this.device, t.device), u.request = ue({}, u.request, this.request, t.request), u.user = ue({}, u.user, this.user, t.user), u.metaData = ue({}, u.metaData, this.metaData, t.metaData), u.breadcrumbs = this.breadcrumbs.slice(0), this.session && (this.session.trackError(u), u.session = this.session), t.severity !== undefined && (u.severity = t.severity, u._handledState.severityReason = { type: 'userSpecifiedSeverity' }), le(this.config.notifyReleaseStages) && !de(this.config.notifyReleaseStages, n)) + return this._logger.warn('Report not sent due to releaseStage/notifyReleaseStages configuration'), !1; + var c = u.severity, f = [].concat(t.beforeSend).concat(this.config.beforeSend); + return fe(f, function (e, t) { + return !0 === e || ('function' == typeof t && !1 === t(u) || !!u.isIgnored()); + }, !1) ? (this._logger.debug('Report not sent due to beforeSend callback'), !1) : (this.config.autoBreadcrumbs && this.leaveBreadcrumb(u.errorClass, { + errorClass: u.errorClass, + errorMessage: u.errorMessage, + severity: u.severity + }, 'error'), c !== u.severity && (u._handledState.severityReason = { type: 'userCallbackSetSeverity' }), this._transport.sendReport(this._logger, this.config, { + apiKey: u.apiKey || this.config.apiKey, + notifier: this.notifier, + events: [u] + }), !0); + }, e; + }(), he = function (e, t, n) { + var r = void 0, i = 0, o = void 0; + switch (typeof e) { + case 'string': + if ('string' == typeof t) { + var a = ye('string/string'); + n.warn('Usage error. ' + a), r = new Error('Bugsnag usage error. ' + a), o = { + metaData: { + notifier: { + notifyArgs: [ + e, + t + ] + } + } + }; + } else + r = new Error(String(e)), i += 2; + break; + case 'number': + case 'boolean': + r = new Error(String(e)); + break; + case 'function': + var s = ye('function'); + n.warn('Usage error. ' + s), r = new Error('Bugsnag usage error. ' + s); + break; + case 'object': + if (null !== e && (se(e) || e.__isBugsnagReport)) + r = e; + else if (null !== e && me(e)) + (r = new Error(e.message || e.errorMessage)).name = e.name || e.errorClass, i += 2; + else { + var u = ye('unsupported object'); + n.warn('Usage error. ' + u), r = new Error('Bugsnag usage error. ' + u); + } + } + return { + err: r, + errorFramesToSkip: i, + _opts: o + }; + }, me = function (e) { + return !('string' != typeof e.name && 'string' != typeof e.errorClass || 'string' != typeof e.message && 'string' != typeof e.errorMessage); + }, ve = function (e) { + return 'Bugsnag configuration error\n' + ce(e, function (e) { + return '"' + e.key + '" ' + e.message + ' \n got ' + be(e.value); + }).join('\n\n'); + }, ye = function (e) { + return 'notify() expected error/opts parameters, got ' + e; + }, be = function (e) { + return 'object' == typeof e ? JSON.stringify(e) : String(e); + }, we = pe, Se = j.positiveIntIfDefined, Oe = { + init: function (e) { + var t = 0; + e.config.beforeSend.push(function (n) { + if (t >= e.config.maxEvents) + return n.ignore(); + t++; + }), e.refresh = function () { + t = 0; + }; + }, + configSchema: { + maxEvents: { + defaultValue: function () { + return 10; + }, + message: 'should be a positive integer \u2264100', + validate: function (e) { + return Se(e) && e < 100; + } + } + } + }, je = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, Ee = N.schema, Ne = w.map, Re = { + releaseStage: { + defaultValue: function () { + return /^localhost(:\d+)?$/.test(window.location.host) ? 'development' : 'production'; + }, + message: 'should be set', + validate: j.stringWithLength + }, + collectUserIp: { + defaultValue: function () { + return !0; + }, + message: 'should be true|false', + validate: function (e) { + return !0 === e || !1 === e; + } + }, + logger: je({}, Ee.logger, { + defaultValue: function () { + return 'undefined' != typeof console && 'function' == typeof console.debug ? ke() : undefined; + } + }) + }, ke = function () { + var e = {}, t = console.log; + return Ne([ + 'debug', + 'info', + 'warn', + 'error' + ], function (n) { + var r = console[n]; + e[n] = 'function' == typeof r ? r.bind(console, '[bugsnag]') : t.bind(console, '[bugsnag]'); + }), e; + }, Be = {}, De = w.map, xe = w.reduce, Le = w.filter; + Be.init = function (e) { + De(_e, function (t) { + var n = console[t]; + console[t] = function () { + for (var r = arguments.length, i = Array(r), o = 0; o < r; o++) + i[o] = arguments[o]; + e.leaveBreadcrumb('Console output', xe(i, function (e, t, n) { + var r = String(t); + if ('[object Object]' === r) + try { + r = JSON.stringify(t); + } catch (i) { + } + return e['[' + n + ']'] = r, e; + }, { severity: 0 === t.indexOf('group') ? 'log' : t }), 'log'), n.apply(console, i); + }, console[t]._restore = function () { + console[t] = n; + }; + }); + }, Be.configSchema = { + consoleBreadcrumbsEnabled: { + defaultValue: function () { + return undefined; + }, + validate: function (e) { + return !0 === e || !1 === e || e === undefined; + }, + message: 'should be true|false' + } + }; + var _e = Le([ + 'log', + 'debug', + 'info', + 'warn', + 'error' + ], function (e) { + return 'undefined' != typeof console && 'function' == typeof console[e]; + }), Ce = { + init: function (e) { + e.config.beforeSend.unshift(function (e) { + e.context || (e.context = window.location.pathname); + }); + } + }, qe = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, Te = w.isoDate, Ae = { + init: function (e) { + e.config.beforeSend.unshift(function (e) { + e.device = qe({ + time: Te(), + locale: navigator.browserLanguage || navigator.systemLanguage || navigator.userLanguage || navigator.language, + userAgent: navigator.userAgent + }, e.device); + }), e.beforeSession.push(function (e) { + e.device = { userAgent: navigator.userAgent }; + }); + } + }, Me = {}, Pe = w.reduce, Ve = /^.*/, He = /<\/script>.*$/, Ue = (Me = { + init: function (e) { + var t = '', n = !1, r = function () { + return document.documentElement.outerHTML; + }, i = window.location.href; + t = r(), document.onreadystatechange = function () { + 'interactive' === document.readyState && (t = r(), n = !0); + }, e.config.beforeSend.unshift(function (e) { + var o = e.stacktrace[0]; + if (!o || !o.file || !o.lineNumber) + return o; + if (o.file.replace(/#.*$/, '') !== i.replace(/#.*$/, '')) + return o; + n && t || (t = r()); + var a = [''].concat(t.split('\n')), s = Ue(a, o.lineNumber - 1), u = s.script, c = s.start, f = Pe(u, function (e, t, n) { + return Math.abs(c + n + 1 - o.lineNumber) > 10 ? e : (e['' + (c + n + 1)] = t, e); + }, {}); + o.code = f, e.updateMetaData('script', { content: u.join('\n') }); + }); + } + }).extractScriptContent = function (e, t) { + for (var n = t; n < e.length && !He.test(e[n]);) + n++; + for (var r = n; n > 0 && !Ve.test(e[n]);) + n--; + var i = n, o = e.slice(i, r + 1); + return o[0] = o[0].replace(Ve, ''), o[o.length - 1] = o[o.length - 1].replace(He, ''), { + script: o, + start: i + }; + }, Ie = { + init: function (e) { + 'addEventListener' in window && window.addEventListener('click', function (t) { + var n = void 0, r = void 0; + try { + n = $e(t.target), r = s(t.target); + } catch (i) { + n = '[hidden]', r = '[hidden]', e._logger.error('Cross domain error when tracking click event. See docs: https://tinyurl.com/y94fq5zm'); + } + e.leaveBreadcrumb('UI click', { + targetText: n, + targetSelector: r + }, 'user'); + }, !0); + }, + configSchema: { + interactionBreadcrumbsEnabled: { + defaultValue: function () { + return undefined; + }, + validate: function (e) { + return !0 === e || !1 === e || e === undefined; + }, + message: 'should be true|false' + } + } + }, $e = function (e) { + var t = e.textContent || e.innerText || ''; + return t || 'submit' !== e.type && 'button' !== e.type || (t = e.value), t = t.replace(/^\s+|\s+$/g, ''), u(t, 140); + }, Fe = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, Ke = { + init: function (e) { + e.config.collectUserIp || e.config.beforeSend.push(function (e) { + e.user = Fe({ id: '[NOT COLLECTED]' }, e.user), e.request = Fe({ clientIp: '[NOT COLLECTED]' }, e.request); + }); + } + }, Xe = {}; + Xe.init = function (e) { + if ('addEventListener' in window) { + var t = function (t) { + return function () { + return e.leaveBreadcrumb(t, {}, 'navigation'); + }; + }; + window.addEventListener('pagehide', t('Page hidden'), !0), window.addEventListener('pageshow', t('Page shown'), !0), window.addEventListener('load', t('Page loaded'), !0), window.document.addEventListener('DOMContentLoaded', t('DOMContentLoaded'), !0), window.addEventListener('load', function () { + return window.addEventListener('popstate', t('Navigated back'), !0); + }), window.addEventListener('hashchange', function (t) { + var n = t.oldURL ? { + from: Je(t.oldURL), + to: Je(t.newURL), + state: We() + } : { to: Je(window.location.href) }; + e.leaveBreadcrumb('Hash changed', n, 'navigation'); + }, !0), window.history.replaceState && Ge(e, window.history, 'replaceState'), window.history.pushState && Ge(e, window.history, 'pushState'), e.leaveBreadcrumb('Bugsnag loaded', {}, 'navigation'); + } + }, Xe.configSchema = { + navigationBreadcrumbsEnabled: { + defaultValue: function () { + return undefined; + }, + validate: function (e) { + return !0 === e || !1 === e || e === undefined; + }, + message: 'should be true|false' + } + }; + var Je = function (e) { + var t = document.createElement('A'); + return t.href = e, '' + t.pathname + t.search + t.hash; + }, ze = function (e, t, n) { + var r = Je(window.location.href); + return { + title: t, + state: e, + prevState: We(), + to: n || r, + from: r + }; + }, Ge = function (e, t, n) { + var r = t[n]; + t[n] = function (i, o, a) { + e.leaveBreadcrumb('History ' + n, ze(i, o, a), 'navigation'), 'function' == typeof e.refresh && e.refresh(), e.session && e.startSession(), r.apply(t, [ + i, + o + ].concat(a !== undefined ? a : [])); + }, t[n]._restore = function () { + t[n] = r; + }; + }, We = function () { + try { + return window.history.state; + } catch (e) { + } + }, Ye = {}, Ze = 'request', Qe = 'BS~~U', et = 'BS~~M', tt = w.includes, nt = void 0, rt = function () { + return [ + nt.config.endpoints.notify, + nt.config.endpoints.sessions + ]; + }; + Ye.init = function (e) { + nt = e, it(), ot(); + }, Ye.configSchema = { + networkBreadcrumbsEnabled: { + defaultValue: function () { + return undefined; + }, + validate: function (e) { + return !0 === e || !1 === e || e === undefined; + }, + message: 'should be true|false' + } + }; + var it = function () { + const $___old_5eb1f1dda2c2d0d5 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_5eb1f1dda2c2d0d5) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + if ('addEventListener' in window.XMLHttpRequest.prototype) { + var e = window.XMLHttpRequest.prototype.open; + window.XMLHttpRequest.prototype.open = function (t, n) { + this[Qe] = n, this[et] = t, this['BS~~S'] && (this.removeEventListener('load', c), this.removeEventListener('error', f)), this.addEventListener('load', c), this.addEventListener('error', f), this['BS~~S'] = !0, e.apply(this, arguments); + }; + } + }.apply(this, arguments); + } finally { + if ($___old_5eb1f1dda2c2d0d5) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_5eb1f1dda2c2d0d5)); + } + }, ot = function () { + if ('fetch' in window) { + var e = window.fetch; + window.fetch = function () { + for (var t = arguments.length, n = Array(t), r = 0; r < t; r++) + n[r] = arguments[r]; + var i = n[0], o = n[1], a = 'GET'; + return o && o.method && (a = o.method), new Promise(function (t, r) { + e.apply(undefined, n).then(function (e) { + at(e, a, i), t(e); + })['catch'](function (e) { + st(a, i), r(e); + }); + }); + }; + } + }, at = function (e, t, n) { + var r = { + status: e.status, + request: t + ' ' + n + }; + e.status >= 400 ? nt.leaveBreadcrumb('fetch() failed', r, Ze) : nt.leaveBreadcrumb('fetch() succeeded', r, Ze); + }, st = function (e, t) { + nt.leaveBreadcrumb('fetch() error', { request: e + ' ' + t }, Ze); + }, ut = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, ct = { + init: function (e) { + e.config.beforeSend.unshift(function (e) { + e.request && e.request.url || (e.request = ut({}, e.request, { url: window.location.href })); + }); + } + }, ft = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, dt = w.map, lt = w.isArray, gt = w.includes, pt = { + init: function (e) { + return e.sessionDelegate(ht); + } + }, ht = { + startSession: function (e) { + var t = e; + t.session = new e.BugsnagSession(), dt(t.beforeSession, function (e) { + return e(t); + }); + var n = C(t); + return lt(t.config.notifyReleaseStages) && !gt(t.config.notifyReleaseStages, n) ? (t._logger.warn('Session not sent due to releaseStage/notifyReleaseStages configuration'), t) : t.config.endpoints.sessions ? (t._transport.sendSession(t._logger, t.config, { + notifier: t.notifier, + device: t.device, + app: ft({ releaseStage: n }, t.app), + sessions: [{ + id: t.session.id, + startedAt: t.session.startedAt, + user: t.user + }] + }), t) : (t._logger.warn('Session not sent due to missing endpoints.sessions configuration'), t); + } + }, mt = {}, vt = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, yt = w.map, bt = (mt = { + init: function (e) { + e.config.beforeSend.push(function (e) { + e.stacktrace = yt(e.stacktrace, function (e) { + return vt({}, e, { file: bt(e.file) }); + }); + }); + } + })._strip = function (e) { + return 'string' == typeof e ? e.replace(/\?.*$/, '').replace(/#.*$/, '') : e; + }, wt = {}, St = w.reduce, Ot = void 0; + wt.init = function (e) { + var t = function (t) { + var n = t.reason, r = !1; + t.detail && t.detail.reason && (n = t.detail.reason, r = !0); + var i = { + severity: 'error', + unhandled: !0, + severityReason: { type: 'unhandledPromiseRejection' } + }, o = void 0; + if (n && q(n)) + o = new e.BugsnagReport(n.name, n.message, A.parse(n), i), r && (o.stacktrace = St(o.stacktrace, Et(n), [])); + else { + (o = new e.BugsnagReport(n && n.name ? n.name : 'UnhandledRejection', n && n.message ? n.message : 'Rejection reason was not an Error. See "Promise" tab for more detail.', [], i)).updateMetaData('promise', 'rejection reason', jt(n)); + } + e.notify(o); + }; + 'addEventListener' in window ? window.addEventListener('unhandledrejection', t) : window.onunhandledrejection = function (e, n) { + t({ + detail: { + reason: e, + promise: n + } + }); + }, Ot = t; + }; + var jt = function (e) { + if (null === e || e === undefined) + return 'undefined (or null)'; + if (se(e)) { + var t; + return t = {}, t[Object.prototype.toString.call(e)] = { + name: e.name, + message: e.message, + code: e.code, + stack: e.stack + }, t; + } + return e; + }, Et = function (e) { + return function (t, n) { + return n.file === e.toString() ? t : (n.method && (n.method = n.method.replace(/^\s+/, '')), t.concat(n)); + }; + }, Nt = { + init: function (e) { + var t = window.onerror; + window.onerror = function (n, r, i, o, a) { + if (0 === i && /Script error\.?/.test(n)) + e._logger.warn('Ignoring cross-domain or eval script error. See docs: https://tinyurl.com/y94fq5zm'); + else { + var s = { + severity: 'error', + unhandled: !0, + severityReason: { type: 'unhandledException' } + }, u = void 0; + if (a) + a.name && a.message ? u = new e.BugsnagReport(a.name, a.message, Rt(e.BugsnagReport.getStacktrace(a), r, i, o), s) : (u = new e.BugsnagReport('window.onerror', String(a), Rt(e.BugsnagReport.getStacktrace(a, 1), r, i, o), s)).updateMetaData('window onerror', { error: a }); + else if ('object' != typeof n || null === n || r || i || o || a) + (u = new e.BugsnagReport('window.onerror', String(n), Rt(e.BugsnagReport.getStacktrace(a, 1), r, i, o), s)).updateMetaData('window onerror', { event: n }); + else { + var c = n.type ? 'Event: ' + n.type : 'window.onerror', f = n.message || n.detail || ''; + (u = new e.BugsnagReport(c, f, e.BugsnagReport.getStacktrace(new Error(), 1).slice(1), s)).updateMetaData('window onerror', { event: n }); + } + e.notify(u), 'function' == typeof t && t(n, r, i, o, a); + } + }; + } + }, Rt = function (e, t, n, r) { + var i = e[0]; + return i ? (i.fileName || i.setFileName(t), i.lineNumber || i.setLineNumber(n), i.columnNumber || (r !== undefined ? i.setColumnNumber(r) : window.event && window.event.errorCharacter && i.setColumnNumber(window.event && window.event.errorCharacter)), e) : e; + }, kt = function (e, t, n) { + return JSON.stringify(h(e), t, n); + }, Bt = 20, Dt = 25000, xt = 8, Lt = '...', _t = function (e) { + var t = kt(e); + if (t.length > 1000000 && (delete e.events[0].metaData, e.events[0].metaData = { notifier: 'WARNING!\nSerialized payload was ' + t.length / 1000000 + 'MB (limit = 1MB)\nmetaData was removed' }, (t = kt(e)).length > 1000000)) + throw new Error('payload exceeded 1MB limit'); + return t; + }, Ct = {}, qt = w.isoDate; + Ct = { + sendReport: function (e, t, n) { + var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () { + }, i = Tt(t, 'notify', '4.0'), o = new window.XDomainRequest(); + o.onload = function () { + r(null, o.responseText); + }, o.open('POST', i), setTimeout(function () { + try { + o.send(_t(n)); + } catch (t) { + e.error(t); + } + }, 0); + }, + sendSession: function (e, t, n) { + var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () { + }, i = Tt(t, 'sessions', '1.0'), o = new window.XDomainRequest(); + o.onload = function () { + r(null, o.responseText); + }, o.open('POST', i), setTimeout(function () { + try { + o.send(kt(n)); + } catch (t) { + e.error(t); + } + }, 0); + } + }; + var Tt = function (e, t, n) { + return At(e.endpoints[t], window.location.protocol) + '?apiKey=' + encodeURIComponent(e.apiKey) + '&payloadVersion=' + n + '&sentAt=' + encodeURIComponent(qt()); + }, At = Ct._matchPageProtocol = function (e, t) { + return 'http:' === t ? e.replace(/^https:/, 'http:') : e; + }, Mt = w.isoDate, Pt = { + sendReport: function (e, t, n) { + var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () { + }; + try { + var i = t.endpoints.notify, o = new window.XMLHttpRequest(); + o.onreadystatechange = function () { + o.readyState === window.XMLHttpRequest.DONE && r(null, o.responseText); + }, o.open('POST', i), o.setRequestHeader('Content-Type', 'application/json'), o.setRequestHeader('Bugsnag-Api-Key', n.apiKey || t.apiKey), o.setRequestHeader('Bugsnag-Payload-Version', '4.0'), o.setRequestHeader('Bugsnag-Sent-At', Mt()), o.send(_t(n)); + } catch (a) { + e.error(a); + } + }, + sendSession: function (e, t, n) { + const $___old_4b1d490a132db2bc = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_e2a55fc1fd6d4a23 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_4b1d490a132db2bc) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + if ($___old_e2a55fc1fd6d4a23) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var r = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () { + }; + try { + var i = t.endpoints.sessions, o = new window.XMLHttpRequest(); + o.onreadystatechange = function () { + const $___old_4bbd3f1064495bf6 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_4bbd3f1064495bf6) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + o.readyState === window.XMLHttpRequest.DONE && r(null, o.responseText); + }.apply(this, arguments); + } finally { + if ($___old_4bbd3f1064495bf6) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_4bbd3f1064495bf6)); + } + }, o.open('POST', i), o.setRequestHeader('Content-Type', 'application/json'), o.setRequestHeader('Bugsnag-Api-Key', t.apiKey), o.setRequestHeader('Bugsnag-Payload-Version', '1.0'), o.setRequestHeader('Bugsnag-Sent-At', Mt()), o.send(kt(n)); + } catch (a) { + e.error(a); + } + }.apply(this, arguments); + } finally { + if ($___old_4b1d490a132db2bc) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_4b1d490a132db2bc)); + if ($___old_e2a55fc1fd6d4a23) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_e2a55fc1fd6d4a23)); + } + } + }, Vt = {}, Ht = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, Ut = w.map, It = w.reduce, $t = Ht({}, N.schema, Re), Ft = [ + Nt, + wt, + Ae, + Ce, + ct, + Oe, + Be, + Ye, + Xe, + Ie, + Me, + pt, + Ke, + mt + ]; + Vt = function (e) { + var t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + 'string' == typeof e && (e = { apiKey: e }); + var n = []; + e.sessionTrackingEnabled && (n.push('deprecated option sessionTrackingEnabled is now called autoCaptureSessions'), e.autoCaptureSessions = e.sessionTrackingEnabled), !e.endpoint && !e.sessionEndpoint || e.endpoints || (n.push('deprecated options endpoint/sessionEndpoint are now configured in the endpoints object'), e.endpoints = { + notify: e.endpoint, + sessions: e.sessionEndpoint + }), e.endpoints && e.endpoints.notify && !e.endpoints.sessions && n.push('notify endpoint is set but sessions endpoint is not. No sessions will be sent.'); + var r = It([].concat(Ft).concat(t), function (e, t) { + return t.configSchema ? Ht({}, e, t.configSchema) : e; + }, $t), i = new we({ + name: 'Bugsnag JavaScript', + version: '4.7.3', + url: 'https://github.com/bugsnag/bugsnag-js' + }, r); + return i.transport(window.XDomainRequest ? Ct : Pt), i.configure(e), Ut(n, function (e) { + return i._logger.warn(e); + }), i.use(Ae), i.use(Ce), i.use(ct), i.use(Me), i.use(Oe), i.use(pt), i.use(Ke), i.use(mt), !1 !== i.config.autoNotify && (i.use(Nt), i.use(wt)), Kt(i.config, 'navigationBreadcrumbsEnabled') && i.use(Xe), Kt(i.config, 'interactionBreadcrumbsEnabled') && i.use(Ie), Kt(i.config, 'networkBreadcrumbsEnabled') && i.use(Ye), Kt(i.config, 'consoleBreadcrumbsEnabled', !1) && i.use(Be), Ut(t, function (e) { + return i.use(e); + }), i.config.autoCaptureSessions ? i.startSession() : i; + }; + var Kt = function (e, t) { + var n = !(arguments.length > 2 && arguments[2] !== undefined) || arguments[2]; + return 'boolean' == typeof e[t] ? e[t] : e.autoBreadcrumbs && (n || !/^dev(elopment)?$/.test(e.releaseStage)); + }; + return Vt.Bugsnag = { + Client: we, + Report: X, + Session: ae, + Breadcrumb: O + }, Vt['default'] = Vt, Vt; + }); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-cmp2.js b/resources/sugarcoat-cmp2.js new file mode 100644 index 00000000..4d56f10b --- /dev/null +++ b/resources/sugarcoat-cmp2.js @@ -0,0 +1,8326 @@ +{ + const $___mock_b3615e3d24fb9d30 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_b3615e3d24fb9d30); + const $___mock_16c53395a822db48 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_16c53395a822db48); + (function () { + !function (e) { + var t = {}; + function n(r) { + if (t[r]) + return t[r].exports; + var o = t[r] = { + i: r, + l: !1, + exports: {} + }; + return e[r].call(o.exports, o, o.exports, n), o.l = !0, o.exports; + } + n.m = e, n.c = t, n.d = function (e, t, r) { + n.o(e, t) || Object.defineProperty(e, t, { + enumerable: !0, + get: r + }); + }, n.r = function (e) { + 'undefined' !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); + }, n.t = function (e, t) { + if (1 & t && (e = n(e)), 8 & t) + return e; + if (4 & t && 'object' === typeof e && e && e.__esModule) + return e; + var r = Object.create(null); + if (n.r(r), Object.defineProperty(r, 'default', { + enumerable: !0, + value: e + }), 2 & t && 'string' != typeof e) + for (var o in e) + n.d(r, o, function (t) { + return e[t]; + }.bind(null, o)); + return r; + }, n.n = function (e) { + var t = e && e.__esModule ? function () { + return e.default; + } : function () { + return e; + }; + return n.d(t, 'a', t), t; + }, n.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }, n.p = '/', n(n.s = 196); + }([ + function (e, t, n) { + e.exports = n(99); + }, + , + , + , + , + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(111)), r(n(112)), r(n(113)), r(n(114)); + }, + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(54)), r(n(115)), r(n(55)), r(n(56)), r(n(116)), r(n(117)), r(n(38)), r(n(57)), r(n(118)), r(n(119)); + }, + function (e, t, n) { + 'use strict'; + var r = n(71), o = Object.prototype.toString; + function i(e) { + return '[object Array]' === o.call(e); + } + function s(e) { + return 'undefined' === typeof e; + } + function a(e) { + return null !== e && 'object' === typeof e; + } + function c(e) { + return '[object Function]' === o.call(e); + } + function u(e, t) { + if (null !== e && 'undefined' !== typeof e) + if ('object' !== typeof e && (e = [e]), i(e)) + for (var n = 0, r = e.length; n < r; n++) + t.call(null, e[n], n, e); + else + for (var o in e) + Object.prototype.hasOwnProperty.call(e, o) && t.call(null, e[o], o, e); + } + e.exports = { + isArray: i, + isArrayBuffer: function (e) { + return '[object ArrayBuffer]' === o.call(e); + }, + isBuffer: function (e) { + return null !== e && !s(e) && null !== e.constructor && !s(e.constructor) && 'function' === typeof e.constructor.isBuffer && e.constructor.isBuffer(e); + }, + isFormData: function (e) { + return 'undefined' !== typeof FormData && e instanceof FormData; + }, + isArrayBufferView: function (e) { + return 'undefined' !== typeof ArrayBuffer && ArrayBuffer.isView ? ArrayBuffer.isView(e) : e && e.buffer && e.buffer instanceof ArrayBuffer; + }, + isString: function (e) { + return 'string' === typeof e; + }, + isNumber: function (e) { + return 'number' === typeof e; + }, + isObject: a, + isUndefined: s, + isDate: function (e) { + return '[object Date]' === o.call(e); + }, + isFile: function (e) { + return '[object File]' === o.call(e); + }, + isBlob: function (e) { + return '[object Blob]' === o.call(e); + }, + isFunction: c, + isStream: function (e) { + return a(e) && c(e.pipe); + }, + isURLSearchParams: function (e) { + return 'undefined' !== typeof URLSearchParams && e instanceof URLSearchParams; + }, + isStandardBrowserEnv: function () { + return ('undefined' === typeof navigator || 'ReactNative' !== navigator.product && 'NativeScript' !== navigator.product && 'NS' !== navigator.product) && ('undefined' !== typeof window && 'undefined' !== typeof document); + }, + forEach: u, + merge: function e() { + var t = {}; + function n(n, r) { + 'object' === typeof t[r] && 'object' === typeof n ? t[r] = e(t[r], n) : t[r] = n; + } + for (var r = 0, o = arguments.length; r < o; r++) + u(arguments[r], n); + return t; + }, + deepMerge: function e() { + var t = {}; + function n(n, r) { + 'object' === typeof t[r] && 'object' === typeof n ? t[r] = e(t[r], n) : t[r] = 'object' === typeof n ? e({}, n) : n; + } + for (var r = 0, o = arguments.length; r < o; r++) + u(arguments[r], n); + return t; + }, + extend: function (e, t, n) { + return u(t, function (t, o) { + e[o] = n && 'function' === typeof t ? r(t, n) : t; + }), e; + }, + trim: function (e) { + return e.replace(/^\s*/, '').replace(/\s*$/, ''); + } + }; + }, + , + , + , + , + , + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(29), o = n(103), i = function () { + function e() { + } + return e.reset = function () { + delete this.cmpId, delete this.cmpVersion, delete this.eventStatus, delete this.gdprApplies, delete this.tcModel, delete this.tcString, delete this.tcfPolicyVersion, this.cmpStatus = r.CmpStatus.LOADING, this.disabled = !1, this.displayStatus = r.DisplayStatus.HIDDEN, this.eventQueue.clear(); + }, e.apiVersion = '2', e.eventQueue = new o.EventListenerQueue(), e.cmpStatus = r.CmpStatus.LOADING, e.disabled = !1, e.displayStatus = r.DisplayStatus.HIDDEN, e; + }(); + t.CmpApiModel = i; + }, + , + function (e, t, n) { + 'use strict'; + var r = this && this.__values || function (e) { + var t = 'function' == typeof Symbol && Symbol.iterator, n = t && e[t], r = 0; + if (n) + return n.call(e); + if (e && 'number' == typeof e.length) + return { + next: function () { + return e && r >= e.length && (e = void 0), { + value: e && e[r++], + done: !e + }; + } + }; + throw new TypeError(t ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function () { + function e() { + } + return e.prototype.clone = function () { + var e = this, t = new this.constructor(); + return Object.keys(this).forEach(function (n) { + var r = e.deepClone(e[n]); + void 0 !== r && (t[n] = r); + }), t; + }, e.prototype.deepClone = function (e) { + var t, n, o = typeof e; + if ('number' === o || 'string' === o || 'boolean' === o) + return e; + if (null !== e && 'object' === o) { + if ('function' == typeof e.clone) + return e.clone(); + if (e instanceof Date) + return new Date(e.getTime()); + if (void 0 !== e[Symbol.iterator]) { + var i = []; + try { + for (var s = r(e), a = s.next(); !a.done; a = s.next()) { + var c = a.value; + i.push(this.deepClone(c)); + } + } catch (e) { + t = { error: e }; + } finally { + try { + a && !a.done && (n = s.return) && n.call(s); + } finally { + if (t) + throw t.error; + } + } + return e instanceof Array ? i : new e.constructor(i); + } + var u = {}; + for (var p in e) + e.hasOwnProperty(p) && (u[p] = this.deepClone(e[p])); + return u; + } + }, e; + }(); + t.Cloneable = o; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(5), o = function () { + function e() { + } + return e.encode = function (e, t) { + var n; + if ('string' == typeof e && (e = parseInt(e, 10)), (n = e.toString(2)).length > t || e < 0) + throw new r.EncodingError(e + ' too large to encode into ' + t); + return n.length < t && (n = '0'.repeat(t - n.length) + n), n; + }, e.decode = function (e, t) { + if (t !== e.length) + throw new r.DecodingError('invalid bit length'); + return parseInt(e, 2); + }, e; + }(); + t.IntEncoder = o; + }, + , + , + , + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(), o = this && this.__awaiter || function (e, t, n, r) { + return new (n || (n = Promise))(function (o, i) { + function s(e) { + try { + c(r.next(e)); + } catch (e) { + i(e); + } + } + function a(e) { + try { + c(r.throw(e)); + } catch (e) { + i(e); + } + } + function c(e) { + var t; + e.done ? o(e.value) : (t = e.value, t instanceof n ? t : new n(function (e) { + e(t); + })).then(s, a); + } + c((r = r.apply(e, t || [])).next()); + }); + }, i = this && this.__generator || function (e, t) { + var n, r, o, i, s = { + label: 0, + sent: function () { + if (1 & o[0]) + throw o[1]; + return o[1]; + }, + trys: [], + ops: [] + }; + return i = { + next: a(0), + throw: a(1), + return: a(2) + }, 'function' == typeof Symbol && (i[Symbol.iterator] = function () { + return this; + }), i; + function a(i) { + return function (a) { + return function (i) { + if (n) + throw new TypeError('Generator is already executing.'); + for (; s;) + try { + if (n = 1, r && (o = 2 & i[0] ? r.return : i[0] ? r.throw || ((o = r.return) && o.call(r), 0) : r.next) && !(o = o.call(r, i[1])).done) + return o; + switch (r = 0, o && (i = [ + 2 & i[0], + o.value + ]), i[0]) { + case 0: + case 1: + o = i; + break; + case 4: + return s.label++, { + value: i[1], + done: !1 + }; + case 5: + s.label++, r = i[1], i = [0]; + continue; + case 7: + i = s.ops.pop(), s.trys.pop(); + continue; + default: + if (!((o = (o = s.trys).length > 0 && o[o.length - 1]) || 6 !== i[0] && 2 !== i[0])) { + s = 0; + continue; + } + if (3 === i[0] && (!o || i[1] > o[0] && i[1] < o[3])) { + s.label = i[1]; + break; + } + if (6 === i[0] && s.label < o[1]) { + s.label = o[1], o = i; + break; + } + if (o && s.label < o[2]) { + s.label = o[2], s.ops.push(i); + break; + } + o[2] && s.ops.pop(), s.trys.pop(); + continue; + } + i = t.call(e, s); + } catch (e) { + i = [ + 6, + e + ], r = 0; + } finally { + n = o = 0; + } + if (5 & i[0]) + throw i[1]; + return { + value: i[0] ? i[1] : void 0, + done: !0 + }; + }([ + i, + a + ]); + }; + } + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var s = n(15), a = n(5), c = n(65), u = n(6), p = function (e) { + function t(n) { + var r = e.call(this) || this; + r.isReady_ = !1, r.isLatest = !1; + var o = t.baseUrl; + if (r.lang_ = t.DEFAULT_LANGUAGE, r.isVendorList(n)) + r.populate(n), r.readyPromise = Promise.resolve(); + else { + if (!o) + throw new a.GVLError('must specify GVL.baseUrl before loading GVL json'); + if (n > 0) { + var i = n; + t.CACHE.has(i) ? (r.populate(t.CACHE.get(i)), r.readyPromise = Promise.resolve()) : (o += t.versionedFilename.replace('[VERSION]', i + ''), r.readyPromise = r.fetchJson(o)); + } else + t.CACHE.has(t.LATEST_CACHE_KEY) ? (r.populate(t.CACHE.get(t.LATEST_CACHE_KEY)), r.readyPromise = Promise.resolve()) : (r.isLatest = !0, r.readyPromise = r.fetchJson(o + t.latestFilename)); + } + return r; + } + return r(t, e), Object.defineProperty(t, 'baseUrl', { + get: function () { + return this.baseUrl_; + }, + set: function (e) { + if (/^https?:\/\/vendorlist\.consensu\.org\//.test(e)) + throw new a.GVLError('Invalid baseUrl! You may not pull directly from vendorlist.consensu.org and must provide your own cache'); + e.length > 0 && '/' !== e[e.length - 1] && (e += '/'), this.baseUrl_ = e; + }, + enumerable: !0, + configurable: !0 + }), t.emptyLanguageCache = function (e) { + var n = !1; + return void 0 === e && t.LANGUAGE_CACHE.size > 0 ? (t.LANGUAGE_CACHE = new Map(), n = !0) : 'string' == typeof e && this.consentLanguages.has(e.toUpperCase()) && (t.LANGUAGE_CACHE.delete(e.toUpperCase()), n = !0), n; + }, t.emptyCache = function (e) { + var n = !1; + return Number.isInteger(e) && e >= 0 ? (t.CACHE.delete(e), n = !0) : void 0 === e && (t.CACHE = new Map(), n = !0), n; + }, t.prototype.cacheLanguage = function () { + t.LANGUAGE_CACHE.has(this.lang_) || t.LANGUAGE_CACHE.set(this.lang_, { + purposes: this.purposes, + specialPurposes: this.specialPurposes, + features: this.features, + specialFeatures: this.specialFeatures, + stacks: this.stacks + }); + }, t.prototype.fetchJson = function (e) { + return o(this, void 0, void 0, function () { + var t, n; + return i(this, function (r) { + switch (r.label) { + case 0: + return r.trys.push([ + 0, + 2, + , + 3 + ]), t = this.populate, [ + 4, + c.Json.fetch(e) + ]; + case 1: + return t.apply(this, [r.sent()]), [ + 3, + 3 + ]; + case 2: + throw n = r.sent(), new a.GVLError(n.message); + case 3: + return [2]; + } + }); + }); + }, t.prototype.getJson = function () { + return JSON.parse(JSON.stringify({ + gvlSpecificationVersion: this.gvlSpecificationVersion, + vendorListVersion: this.vendorListVersion, + tcfPolicyVersion: this.tcfPolicyVersion, + lastUpdated: this.lastUpdated, + purposes: this.purposes, + specialPurposes: this.specialPurposes, + features: this.features, + specialFeatures: this.specialFeatures, + stacks: this.stacks, + vendors: this.fullVendorList + })); + }, t.prototype.changeLanguage = function (e) { + return o(this, void 0, void 0, function () { + var n, r, o, s, c; + return i(this, function (i) { + switch (i.label) { + case 0: + if (n = e.toUpperCase(), !t.consentLanguages.has(n)) + return [ + 3, + 6 + ]; + if (n === this.lang_) + return [ + 3, + 5 + ]; + if (this.lang_ = n, !t.LANGUAGE_CACHE.has(n)) + return [ + 3, + 1 + ]; + for (o in r = t.LANGUAGE_CACHE.get(n)) + r.hasOwnProperty(o) && (this[o] = r[o]); + return [ + 3, + 5 + ]; + case 1: + s = t.baseUrl + t.languageFilename.replace('[LANG]', e), i.label = 2; + case 2: + return i.trys.push([ + 2, + 4, + , + 5 + ]), [ + 4, + this.fetchJson(s) + ]; + case 3: + return i.sent(), this.cacheLanguage(), [ + 3, + 5 + ]; + case 4: + throw c = i.sent(), new a.GVLError('unable to load language: ' + c.message); + case 5: + return [ + 3, + 7 + ]; + case 6: + throw new a.GVLError('unsupported language ' + e); + case 7: + return [2]; + } + }); + }); + }, Object.defineProperty(t.prototype, 'language', { + get: function () { + return this.lang_; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.isVendorList = function (e) { + return void 0 !== e && void 0 !== e.vendors; + }, t.prototype.populate = function (e) { + this.purposes = e.purposes, this.specialPurposes = e.specialPurposes, this.features = e.features, this.specialFeatures = e.specialFeatures, this.stacks = e.stacks, this.isVendorList(e) && (this.gvlSpecificationVersion = e.gvlSpecificationVersion, this.tcfPolicyVersion = e.tcfPolicyVersion, this.vendorListVersion = e.vendorListVersion, this.lastUpdated = e.lastUpdated, 'string' == typeof this.lastUpdated && (this.lastUpdated = new Date(this.lastUpdated)), this.vendors_ = e.vendors, this.fullVendorList = e.vendors, this.mapVendors(), this.isReady_ = !0, this.isLatest && t.CACHE.set(t.LATEST_CACHE_KEY, this.getJson()), t.CACHE.has(this.vendorListVersion) || t.CACHE.set(this.vendorListVersion, this.getJson())), this.cacheLanguage(); + }, t.prototype.mapVendors = function (e) { + var t = this; + this.byPurposeVendorMap = {}, this.bySpecialPurposeVendorMap = {}, this.byFeatureVendorMap = {}, this.bySpecialFeatureVendorMap = {}, Object.keys(this.purposes).forEach(function (e) { + t.byPurposeVendorMap[e] = { + legInt: new Set(), + consent: new Set(), + flexible: new Set() + }; + }), Object.keys(this.specialPurposes).forEach(function (e) { + t.bySpecialPurposeVendorMap[e] = new Set(); + }), Object.keys(this.features).forEach(function (e) { + t.byFeatureVendorMap[e] = new Set(); + }), Object.keys(this.specialFeatures).forEach(function (e) { + t.bySpecialFeatureVendorMap[e] = new Set(); + }), Array.isArray(e) || (e = Object.keys(this.fullVendorList).map(function (e) { + return +e; + })), this.vendorIds = new Set(e), this.vendors_ = e.reduce(function (e, n) { + var r = t.vendors_['' + n]; + return r && void 0 === r.deletedDate && (r.purposes.forEach(function (e) { + t.byPurposeVendorMap[e + ''].consent.add(n); + }), r.specialPurposes.forEach(function (e) { + t.bySpecialPurposeVendorMap[e + ''].add(n); + }), r.legIntPurposes.forEach(function (e) { + t.byPurposeVendorMap[e + ''].legInt.add(n); + }), r.flexiblePurposes && r.flexiblePurposes.forEach(function (e) { + t.byPurposeVendorMap[e + ''].flexible.add(n); + }), r.features.forEach(function (e) { + t.byFeatureVendorMap[e + ''].add(n); + }), r.specialFeatures.forEach(function (e) { + t.bySpecialFeatureVendorMap[e + ''].add(n); + }), e[n] = r), e; + }, {}); + }, t.prototype.getFilteredVendors = function (e, t, n, r) { + var o = this, i = e.charAt(0).toUpperCase() + e.slice(1), s = {}; + return ('purpose' === e && n ? this['by' + i + 'VendorMap'][t + ''][n] : this['by' + (r ? 'Special' : '') + i + 'VendorMap'][t + '']).forEach(function (e) { + s[e + ''] = o.vendors[e + '']; + }), s; + }, t.prototype.getVendorsWithConsentPurpose = function (e) { + return this.getFilteredVendors('purpose', e, 'consent'); + }, t.prototype.getVendorsWithLegIntPurpose = function (e) { + return this.getFilteredVendors('purpose', e, 'legInt'); + }, t.prototype.getVendorsWithFlexiblePurpose = function (e) { + return this.getFilteredVendors('purpose', e, 'flexible'); + }, t.prototype.getVendorsWithSpecialPurpose = function (e) { + return this.getFilteredVendors('purpose', e, void 0, !0); + }, t.prototype.getVendorsWithFeature = function (e) { + return this.getFilteredVendors('feature', e); + }, t.prototype.getVendorsWithSpecialFeature = function (e) { + return this.getFilteredVendors('feature', e, void 0, !0); + }, Object.defineProperty(t.prototype, 'vendors', { + get: function () { + return this.vendors_; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.narrowVendorsTo = function (e) { + this.mapVendors(e); + }, Object.defineProperty(t.prototype, 'isReady', { + get: function () { + return this.isReady_; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.clone = function () { + return new t(this.getJson()); + }, t.isInstanceOf = function (e) { + return 'object' == typeof e && 'function' == typeof e.narrowVendorsTo; + }, t.LANGUAGE_CACHE = new Map(), t.CACHE = new Map(), t.LATEST_CACHE_KEY = 0, t.DEFAULT_LANGUAGE = 'EN', t.consentLanguages = new u.ConsentLanguages(), t.latestFilename = 'vendor-list.json', t.versionedFilename = 'archives/vendor-list-v[VERSION].json', t.languageFilename = 'purposes-[LANG].json', t; + }(s.Cloneable); + t.GVL = p; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(36), o = n(6), i = n(16), s = n(33), a = function () { + function e() { + } + return e.encode = function (e, t) { + var n, o, i = ''; + return e = r.SemanticPreEncoder.process(e, t), (o = Array.isArray(null === (n = t) || void 0 === n ? void 0 : n.segments) ? t.segments : new r.SegmentSequence(e, t)['' + e.version]).forEach(function (t, n) { + var s = ''; + n < o.length - 1 && (s = '.'), i += r.SegmentEncoder.encode(e, t) + s; + }), i; + }, e.decode = function (e, t) { + var n = e.split('.'), a = n.length; + t || (t = new s.TCModel()); + for (var c = 0; c < a; c++) { + var u = n[c], p = r.Base64Url.decode(u.charAt(0)).substr(0, r.BitLength.segmentType), l = o.SegmentIDs.ID_TO_KEY[i.IntEncoder.decode(p, r.BitLength.segmentType).toString()]; + r.SegmentEncoder.decode(u, t, l); + } + return t; + }, e; + }(); + t.TCString = a; + }, + , + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e() { + } + return e.encode = function (e) { + return +e + ''; + }, e.decode = function (e) { + return '1' === e; + }, e; + }(); + t.BooleanEncoder = r; + }, + , + , + , + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(49)), r(n(104)), r(n(105)), r(n(28)), r(n(50)); + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(13); + t.Response = function () { + this.cmpId = r.CmpApiModel.cmpId, this.cmpVersion = r.CmpApiModel.cmpVersion, this.gdprApplies = r.CmpApiModel.gdprApplies, this.tcfPolicyVersion = r.CmpApiModel.tcfPolicyVersion; + }; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(100)), r(n(101)), r(n(102)); + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(31), i = n(27), s = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + this.throwIfParamInvalid(), this.invokeCallback(new i.TCData(this.param, this.listenerId)); + }, t.prototype.throwIfParamInvalid = function () { + if (!(void 0 === this.param || Array.isArray(this.param) && this.param.every(Number.isInteger))) + throw new Error('Invalid Parameter'); + }, t; + }(o.Command); + t.GetTCDataCommand = s; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e(e, t, n, r) { + this.success = !0, Object.assign(this, { + callback: e, + listenerId: n, + param: t, + next: r + }); + try { + this.respond(); + } catch (e) { + this.invokeCallback(null); + } + } + return e.prototype.invokeCallback = function (e) { + var t = null !== e; + 'function' == typeof this.next ? this.callback(this.next, e, t) : this.callback(e, t); + }, e; + }(); + t.Command = r; + }, + , + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(15), i = n(5), s = n(20), a = n(6), c = function (e) { + function t(t) { + var n = e.call(this) || this; + return n.isServiceSpecific_ = !1, n.supportOOB_ = !0, n.useNonStandardStacks_ = !1, n.purposeOneTreatment_ = !1, n.publisherCountryCode_ = 'AA', n.version_ = 2, n.consentScreen_ = 0, n.policyVersion_ = 2, n.consentLanguage_ = 'EN', n.cmpId_ = 0, n.cmpVersion_ = 0, n.vendorListVersion_ = 0, n.numCustomPurposes_ = 0, n.specialFeatureOptins = new a.Vector(), n.purposeConsents = new a.Vector(), n.purposeLegitimateInterests = new a.Vector(), n.publisherConsents = new a.Vector(), n.publisherLegitimateInterests = new a.Vector(), n.publisherCustomConsents = new a.Vector(), n.publisherCustomLegitimateInterests = new a.Vector(), n.vendorConsents = new a.Vector(), n.vendorLegitimateInterests = new a.Vector(), n.vendorsDisclosed = new a.Vector(), n.vendorsAllowed = new a.Vector(), n.publisherRestrictions = new a.PurposeRestrictionVector(), t && (n.gvl = t), n.created = new Date(), n.updated(), n; + } + return r(t, e), Object.defineProperty(t.prototype, 'gvl', { + get: function () { + return this.gvl_; + }, + set: function (e) { + s.GVL.isInstanceOf(e) || (e = new s.GVL(e)), this.gvl_ = e, this.publisherRestrictions.gvl = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'cmpId', { + get: function () { + return this.cmpId_; + }, + set: function (e) { + if (!(Number.isInteger(+e) && e > 1)) + throw new i.TCModelError('cmpId', e); + this.cmpId_ = +e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'cmpVersion', { + get: function () { + return this.cmpVersion_; + }, + set: function (e) { + if (!(Number.isInteger(+e) && e > -1)) + throw new i.TCModelError('cmpVersion', e); + this.cmpVersion_ = +e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'consentScreen', { + get: function () { + return this.consentScreen_; + }, + set: function (e) { + if (!(Number.isInteger(+e) && e > -1)) + throw new i.TCModelError('consentScreen', e); + this.consentScreen_ = +e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'consentLanguage', { + get: function () { + return this.consentLanguage_; + }, + set: function (e) { + this.consentLanguage_ = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'publisherCountryCode', { + get: function () { + return this.publisherCountryCode_; + }, + set: function (e) { + if (!/^([A-z]){2}$/.test(e)) + throw new i.TCModelError('publisherCountryCode', e); + this.publisherCountryCode_ = e.toUpperCase(); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'vendorListVersion', { + get: function () { + return this.gvl ? this.gvl.vendorListVersion : this.vendorListVersion_; + }, + set: function (e) { + if ((e = +e >> 0) < 0) + throw new i.TCModelError('vendorListVersion', e); + this.vendorListVersion_ = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'policyVersion', { + get: function () { + return this.gvl ? this.gvl.tcfPolicyVersion : this.policyVersion_; + }, + set: function (e) { + if (this.policyVersion_ = parseInt(e, 10), this.policyVersion_ < 0) + throw new i.TCModelError('policyVersion', e); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'version', { + get: function () { + return this.version_; + }, + set: function (e) { + this.version_ = parseInt(e, 10); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'isServiceSpecific', { + get: function () { + return this.isServiceSpecific_; + }, + set: function (e) { + this.isServiceSpecific_ = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'useNonStandardStacks', { + get: function () { + return this.useNonStandardStacks_; + }, + set: function (e) { + this.useNonStandardStacks_ = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'supportOOB', { + get: function () { + return this.supportOOB_; + }, + set: function (e) { + this.supportOOB_ = e; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'purposeOneTreatment', { + get: function () { + return this.purposeOneTreatment_; + }, + set: function (e) { + this.purposeOneTreatment_ = e; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.setAllVendorConsents = function () { + this.vendorConsents.set(this.gvl.vendors); + }, t.prototype.unsetAllVendorConsents = function () { + this.vendorConsents.empty(); + }, t.prototype.setAllVendorsDisclosed = function () { + this.vendorsDisclosed.set(this.gvl.vendors); + }, t.prototype.unsetAllVendorsDisclosed = function () { + this.vendorsDisclosed.empty(); + }, t.prototype.setAllVendorsAllowed = function () { + this.vendorsAllowed.set(this.gvl.vendors); + }, t.prototype.unsetAllVendorsAllowed = function () { + this.vendorsAllowed.empty(); + }, t.prototype.setAllVendorLegitimateInterests = function () { + this.vendorLegitimateInterests.set(this.gvl.vendors); + }, t.prototype.unsetAllVendorLegitimateInterests = function () { + this.vendorLegitimateInterests.empty(); + }, t.prototype.setAllPurposeConsents = function () { + this.purposeConsents.set(this.gvl.purposes); + }, t.prototype.unsetAllPurposeConsents = function () { + this.purposeConsents.empty(); + }, t.prototype.setAllPurposeLegitimateInterests = function () { + this.purposeLegitimateInterests.set(this.gvl.purposes); + }, t.prototype.unsetAllPurposeLegitimateInterests = function () { + this.purposeLegitimateInterests.empty(); + }, t.prototype.setAllSpecialFeatureOptins = function () { + this.specialFeatureOptins.set(this.gvl.specialFeatures); + }, t.prototype.unsetAllSpecialFeatureOptins = function () { + this.specialFeatureOptins.empty(); + }, t.prototype.setAll = function () { + this.setAllVendorConsents(), this.setAllPurposeLegitimateInterests(), this.setAllSpecialFeatureOptins(), this.setAllPurposeConsents(), this.setAllVendorLegitimateInterests(); + }, t.prototype.unsetAll = function () { + this.unsetAllVendorConsents(), this.unsetAllPurposeLegitimateInterests(), this.unsetAllSpecialFeatureOptins(), this.unsetAllPurposeConsents(), this.unsetAllVendorLegitimateInterests(); + }, Object.defineProperty(t.prototype, 'numCustomPurposes', { + get: function () { + var e = this.numCustomPurposes_; + if ('object' == typeof this.customPurposes) { + var t = Object.keys(this.customPurposes).sort(function (e, t) { + return +e - +t; + }); + e = parseInt(t.pop(), 10); + } + return e; + }, + set: function (e) { + if (this.numCustomPurposes_ = parseInt(e, 10), this.numCustomPurposes_ < 0) + throw new i.TCModelError('numCustomPurposes', e); + }, + enumerable: !0, + configurable: !0 + }), t.prototype.updated = function () { + this.lastUpdated = new Date(); + }, t.consentLanguages = s.GVL.consentLanguages, t; + }(o.Cloneable); + t.TCModel = c; + }, + , + , + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(53)), r(n(37)), r(n(120)), r(n(124)), r(n(58)), r(n(64)); + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(6), o = function () { + function e() { + } + var t, n, o, i, s, a, c, u, p, l, d, f, h, y, v, g, m, b; + return t = r.Fields.cmpId, n = r.Fields.cmpVersion, o = r.Fields.consentLanguage, i = r.Fields.consentScreen, s = r.Fields.created, a = r.Fields.isServiceSpecific, c = r.Fields.lastUpdated, u = r.Fields.policyVersion, p = r.Fields.publisherCountryCode, l = r.Fields.publisherLegitimateInterests, d = r.Fields.publisherConsents, f = r.Fields.purposeConsents, h = r.Fields.purposeLegitimateInterests, y = r.Fields.purposeOneTreatment, v = r.Fields.specialFeatureOptins, g = r.Fields.useNonStandardStacks, m = r.Fields.vendorListVersion, b = r.Fields.version, e[t] = 12, e[n] = 12, e[o] = 12, e[i] = 6, e[s] = 36, e[a] = 1, e[c] = 36, e[u] = 6, e[p] = 12, e[l] = 24, e[d] = 24, e[f] = 24, e[h] = 24, e[y] = 1, e[v] = 12, e[g] = 1, e[m] = 12, e[b] = 6, e.anyBoolean = 1, e.encodingType = 1, e.maxId = 16, e.numCustomPurposes = 6, e.numEntries = 12, e.numRestrictions = 12, e.purposeId = 6, e.restrictionType = 2, e.segmentType = 3, e.singleOrRange = 1, e.vendorId = 16, e; + }(); + t.BitLength = o; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.RestrictionType || (t.RestrictionType = {}))[r.NOT_ALLOWED = 0] = 'NOT_ALLOWED', r[r.REQUIRE_CONSENT = 1] = 'REQUIRE_CONSENT', r[r.REQUIRE_LI = 2] = 'REQUIRE_LI'; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(23), o = n(5), i = n(6), s = function () { + function e() { + } + return e.encode = function (e, t) { + for (var n = '', o = 1; o <= t; o++) + n += r.BooleanEncoder.encode(e.has(o)); + return n; + }, e.decode = function (e, t) { + if (e.length !== t) + throw new o.DecodingError('bitfield encoding length mismatch'); + for (var n = new i.Vector(), s = 1; s <= t; s++) + r.BooleanEncoder.decode(e[s - 1]) && n.set(s); + return n.bitLength = e.length, n; + }, e; + }(); + t.FixedVectorEncoder = s; + }, + , + , + , + , + , + , + , + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), function (e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + }(n(48)); + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.TCFCommand || (t.TCFCommand = {})).PING = 'ping', r.GET_TC_DATA = 'getTCData', r.GET_IN_APP_TC_DATA = 'getInAppTCData', r.GET_VENDOR_LIST = 'getVendorList', r.ADD_EVENT_LISTENER = 'addEventListener', r.REMOVE_EVENT_LISTENER = 'removeEventListener'; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(28), i = n(29), s = function (e) { + function t() { + var t = null !== e && e.apply(this, arguments) || this; + return t.cmpStatus = i.CmpStatus.ERROR, t; + } + return r(t, e), t; + }(o.Response); + t.Disabled = s; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(), o = this && this.__read || function (e, t) { + var n = 'function' == typeof Symbol && e[Symbol.iterator]; + if (!n) + return e; + var r, o, i = n.call(e), s = []; + try { + for (; (void 0 === t || t-- > 0) && !(r = i.next()).done;) + s.push(r.value); + } catch (e) { + o = { error: e }; + } finally { + try { + r && !r.done && (n = i.return) && n.call(i); + } finally { + if (o) + throw o.error; + } + } + return s; + }, i = this && this.__spread || function () { + for (var e = [], t = 0; t < arguments.length; t++) + e = e.concat(o(arguments[t])); + return e; + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var s = n(13), a = function (e) { + function t(t, n) { + var r = e.call(this) || this; + if (r.eventStatus = s.CmpApiModel.eventStatus, r.cmpStatus = s.CmpApiModel.cmpStatus, r.listenerId = n, s.CmpApiModel.gdprApplies) { + var o = s.CmpApiModel.tcModel; + r.tcString = s.CmpApiModel.tcString, r.isServiceSpecific = o.isServiceSpecific, r.useNonStandardStacks = o.useNonStandardStacks, r.purposeOneTreatment = o.purposeOneTreatment, r.publisherCC = o.publisherCountryCode, r.outOfBand = { + allowedVendors: r.createVectorField(o.vendorsAllowed, t), + disclosedVendors: r.createVectorField(o.vendorsDisclosed, t) + }, r.purpose = { + consents: r.createVectorField(o.purposeConsents), + legitimateInterests: r.createVectorField(o.purposeLegitimateInterests) + }, r.vendor = { + consents: r.createVectorField(o.vendorConsents, t), + legitimateInterests: r.createVectorField(o.vendorLegitimateInterests, t) + }, r.specialFeatureOptins = r.createVectorField(o.specialFeatureOptins), r.publisher = { + consents: r.createVectorField(o.publisherConsents), + legitimateInterests: r.createVectorField(o.publisherLegitimateInterests), + customPurpose: { + consents: r.createVectorField(o.publisherCustomConsents), + legitimateInterests: r.createVectorField(o.publisherCustomLegitimateInterests) + }, + restrictions: r.createRestrictions(o.publisherRestrictions) + }; + } + return r; + } + return r(t, e), t.prototype.createRestrictions = function (e) { + var t = {}; + if (e.numRestrictions > 0) + for (var n = e.getMaxVendorId(), r = function (n) { + var r = n.toString(); + e.getRestrictions(n).forEach(function (e) { + var n = e.purposeId.toString(); + t[n] || (t[n] = {}), t[n][r] = e.restrictionType; + }); + }, o = 1; o <= n; o++) + r(o); + return t; + }, t.prototype.createVectorField = function (e, t) { + return t ? t.reduce(function (t, n) { + return t[n + ''] = e.has(+n), t; + }, {}) : i(e).reduce(function (e, t) { + return e[t[0].toString(10)] = t[1], e; + }, {}); + }, t; + }(n(28).Response); + t.TCData = a; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__read || function (e, t) { + var n = 'function' == typeof Symbol && e[Symbol.iterator]; + if (!n) + return e; + var r, o, i = n.call(e), s = []; + try { + for (; (void 0 === t || t-- > 0) && !(r = i.next()).done;) + s.push(r.value); + } catch (e) { + o = { error: e }; + } finally { + try { + r && !r.done && (n = i.return) && n.call(i); + } finally { + if (o) + throw o.error; + } + } + return s; + }, o = this && this.__spread || function () { + for (var e = [], t = 0; t < arguments.length; t++) + e = e.concat(r(arguments[t])); + return e; + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = n(47), s = n(107), a = n(13), c = n(49), u = n(127); + t.API_KEY = '__tcfapi'; + var p = function () { + function e(e) { + var n, r, o; + if (e) { + var s = i.TCFCommand.ADD_EVENT_LISTENER; + if (null === (n = e) || void 0 === n ? void 0 : n[s]) + throw new Error('Built-In Custom Commmand for ' + s + ' not allowed: Use ' + i.TCFCommand.GET_TC_DATA + ' instead'); + if (s = i.TCFCommand.REMOVE_EVENT_LISTENER, null === (r = e) || void 0 === r ? void 0 : r[s]) + throw new Error('Built-In Custom Commmand for ' + s + ' not allowed'); + (null === (o = e) || void 0 === o ? void 0 : o[i.TCFCommand.GET_TC_DATA]) && (e[i.TCFCommand.ADD_EVENT_LISTENER] = e[i.TCFCommand.GET_TC_DATA], e[i.TCFCommand.REMOVE_EVENT_LISTENER] = e[i.TCFCommand.GET_TC_DATA]), this.customCommands = e; + } + try { + this.callQueue = window[t.API_KEY]() || []; + } catch (e) { + this.callQueue = []; + } finally { + window[t.API_KEY] = this.apiCall.bind(this), this.purgeQueuedCalls(); + } + } + return e.prototype.apiCall = function (e, t, n) { + for (var r, p = [], l = 3; l < arguments.length; l++) + p[l - 3] = arguments[l]; + if ('string' != typeof e) + n(null, !1); + else if (u.SupportedVersions.has(t)) { + if ('function' != typeof n) + throw new Error('invalid callback function'); + a.CmpApiModel.disabled ? n(new c.Disabled(), !1) : this.isCustomCommand(e) || this.isBuiltInCommand(e) ? this.isCustomCommand(e) && !this.isBuiltInCommand(e) ? (r = this.customCommands)[e].apply(r, o([n], p)) : e === i.TCFCommand.PING ? this.isCustomCommand(e) ? new s.CommandMap[e](this.customCommands[e], p[0], null, n) : new s.CommandMap[e](n, p[0]) : void 0 === a.CmpApiModel.tcModel ? this.callQueue.push(o([ + e, + t, + n + ], p)) : this.isCustomCommand(e) && this.isBuiltInCommand(e) ? new s.CommandMap[e](this.customCommands[e], p[0], null, n) : new s.CommandMap[e](n, p[0]) : n(null, !1); + } else + n(null, !1); + }, e.prototype.purgeQueuedCalls = function () { + var e = this.callQueue; + this.callQueue = [], e.forEach(function (e) { + window[t.API_KEY].apply(window, o(e)); + }); + }, e.prototype.isCustomCommand = function (e) { + return this.customCommands && 'function' == typeof this.customCommands[e]; + }, e.prototype.isBuiltInCommand = function (e) { + return void 0 !== s.CommandMap[e]; + }, e; + }(); + t.CallResponder = p; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(36)), r(n(5)), r(n(6)), r(n(15)), r(n(20)), r(n(65)), r(n(33)), r(n(21)); + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(5), o = function () { + function e() { + } + return e.encode = function (e) { + if (!/^[0-1]+$/.test(e)) + throw new r.EncodingError('Invalid bitField'); + var t = e.length % this.LCM; + e += t ? '0'.repeat(this.LCM - t) : ''; + for (var n = '', o = 0; o < e.length; o += this.BASIS) + n += this.DICT[parseInt(e.substr(o, this.BASIS), 2)]; + return n; + }, e.decode = function (e) { + if (!/^[A-Za-z0-9\-_]+$/.test(e)) + throw new r.DecodingError('Invalidly encoded Base64URL string'); + for (var t = '', n = 0; n < e.length; n++) { + var o = this.REVERSE_DICT.get(e[n]).toString(2); + t += '0'.repeat(this.BASIS - o.length) + o; + } + return t; + }, e.DICT = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', e.REVERSE_DICT = new Map([ + [ + 'A', + 0 + ], + [ + 'B', + 1 + ], + [ + 'C', + 2 + ], + [ + 'D', + 3 + ], + [ + 'E', + 4 + ], + [ + 'F', + 5 + ], + [ + 'G', + 6 + ], + [ + 'H', + 7 + ], + [ + 'I', + 8 + ], + [ + 'J', + 9 + ], + [ + 'K', + 10 + ], + [ + 'L', + 11 + ], + [ + 'M', + 12 + ], + [ + 'N', + 13 + ], + [ + 'O', + 14 + ], + [ + 'P', + 15 + ], + [ + 'Q', + 16 + ], + [ + 'R', + 17 + ], + [ + 'S', + 18 + ], + [ + 'T', + 19 + ], + [ + 'U', + 20 + ], + [ + 'V', + 21 + ], + [ + 'W', + 22 + ], + [ + 'X', + 23 + ], + [ + 'Y', + 24 + ], + [ + 'Z', + 25 + ], + [ + 'a', + 26 + ], + [ + 'b', + 27 + ], + [ + 'c', + 28 + ], + [ + 'd', + 29 + ], + [ + 'e', + 30 + ], + [ + 'f', + 31 + ], + [ + 'g', + 32 + ], + [ + 'h', + 33 + ], + [ + 'i', + 34 + ], + [ + 'j', + 35 + ], + [ + 'k', + 36 + ], + [ + 'l', + 37 + ], + [ + 'm', + 38 + ], + [ + 'n', + 39 + ], + [ + 'o', + 40 + ], + [ + 'p', + 41 + ], + [ + 'q', + 42 + ], + [ + 'r', + 43 + ], + [ + 's', + 44 + ], + [ + 't', + 45 + ], + [ + 'u', + 46 + ], + [ + 'v', + 47 + ], + [ + 'w', + 48 + ], + [ + 'x', + 49 + ], + [ + 'y', + 50 + ], + [ + 'z', + 51 + ], + [ + '0', + 52 + ], + [ + '1', + 53 + ], + [ + '2', + 54 + ], + [ + '3', + 55 + ], + [ + '4', + 56 + ], + [ + '5', + 57 + ], + [ + '6', + 58 + ], + [ + '7', + 59 + ], + [ + '8', + 60 + ], + [ + '9', + 61 + ], + [ + '-', + 62 + ], + [ + '_', + 63 + ] + ]), e.BASIS = 6, e.LCM = 24, e; + }(); + t.Base64Url = o; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function (e) { + function t() { + var t = null !== e && e.apply(this, arguments) || this; + return t.root = null, t; + } + return r(t, e), t.prototype.isEmpty = function () { + return !this.root; + }, t.prototype.add = function (e) { + var t, n = { + value: e, + left: null, + right: null + }; + if (this.isEmpty()) + this.root = n; + else + for (t = this.root;;) + if (e < t.value) { + if (null === t.left) { + t.left = n; + break; + } + t = t.left; + } else { + if (!(e > t.value)) + break; + if (null === t.right) { + t.right = n; + break; + } + t = t.right; + } + }, t.prototype.get = function () { + for (var e = [], t = this.root; t;) + if (t.left) { + for (var n = t.left; n.right && n.right != t;) + n = n.right; + n.right == t ? (n.right = null, e.push(t.value), t = t.right) : (n.right = t, t = t.left); + } else + e.push(t.value), t = t.right; + return e; + }, t.prototype.contains = function (e) { + for (var t = !1, n = this.root; n;) { + if (n.value === e) { + t = !0; + break; + } + e > n.value ? n = n.right : e < n.value && (n = n.left); + } + return t; + }, t.prototype.min = function (e) { + var t; + for (void 0 === e && (e = this.root); e;) + e.left ? e = e.left : (t = e.value, e = null); + return t; + }, t.prototype.max = function (e) { + var t; + for (void 0 === e && (e = this.root); e;) + e.right ? e = e.right : (t = e.value, e = null); + return t; + }, t.prototype.remove = function (e, t) { + void 0 === t && (t = this.root); + for (var n = null, r = 'left'; t;) + if (e < t.value) + n = t, t = t.left, r = 'left'; + else if (e > t.value) + n = t, t = t.right, r = 'right'; + else { + if (t.left || t.right) + if (t.left) + if (t.right) { + var o = this.min(t.right); + this.remove(o, t.right), t.value = o; + } else + n ? n[r] = t.left : this.root = t.left; + else + n ? n[r] = t.right : this.root = t.right; + else + n ? n[r] = null : this.root = null; + t = null; + } + }, t; + }(n(15).Cloneable); + t.BinarySearchTree = o; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e() { + } + return e.cmpId = 'cmpId', e.cmpVersion = 'cmpVersion', e.consentLanguage = 'consentLanguage', e.consentScreen = 'consentScreen', e.created = 'created', e.supportOOB = 'supportOOB', e.isServiceSpecific = 'isServiceSpecific', e.lastUpdated = 'lastUpdated', e.numCustomPurposes = 'numCustomPurposes', e.policyVersion = 'policyVersion', e.publisherCountryCode = 'publisherCountryCode', e.publisherCustomConsents = 'publisherCustomConsents', e.publisherCustomLegitimateInterests = 'publisherCustomLegitimateInterests', e.publisherLegitimateInterests = 'publisherLegitimateInterests', e.publisherConsents = 'publisherConsents', e.publisherRestrictions = 'publisherRestrictions', e.purposeConsents = 'purposeConsents', e.purposeLegitimateInterests = 'purposeLegitimateInterests', e.purposeOneTreatment = 'purposeOneTreatment', e.specialFeatureOptins = 'specialFeatureOptins', e.useNonStandardStacks = 'useNonStandardStacks', e.vendorConsents = 'vendorConsents', e.vendorLegitimateInterests = 'vendorLegitimateInterests', e.vendorListVersion = 'vendorListVersion', e.vendorsAllowed = 'vendorsAllowed', e.vendorsDisclosed = 'vendorsDisclosed', e.version = 'version', e; + }(); + t.Fields = r; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(15), i = n(5), s = n(38), a = function (e) { + function t(t, n) { + var r = e.call(this) || this; + return void 0 !== t && (r.purposeId = t), void 0 !== n && (r.restrictionType = n), r; + } + return r(t, e), t.unHash = function (e) { + var n = e.split(this.hashSeparator), r = new t(); + if (2 !== n.length) + throw new i.TCModelError('hash', e); + return r.purposeId = parseInt(n[0], 10), r.restrictionType = parseInt(n[1], 10), r; + }, Object.defineProperty(t.prototype, 'hash', { + get: function () { + if (!this.isValid()) + throw new Error('cannot hash invalid PurposeRestriction'); + return '' + this.purposeId + t.hashSeparator + this.restrictionType; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(t.prototype, 'purposeId', { + get: function () { + return this.purposeId_; + }, + set: function (e) { + this.purposeId_ = e; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.isValid = function () { + return Number.isInteger(this.purposeId) && this.purposeId > 0 && (this.restrictionType === s.RestrictionType.NOT_ALLOWED || this.restrictionType === s.RestrictionType.REQUIRE_CONSENT || this.restrictionType === s.RestrictionType.REQUIRE_LI); + }, t.prototype.isSameAs = function (e) { + return this.purposeId === e.purposeId && this.restrictionType === e.restrictionType; + }, t.hashSeparator = '-', t; + }(o.Cloneable); + t.PurposeRestriction = a; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.Segment || (t.Segment = {})).CORE = 'core', r.VENDORS_DISCLOSED = 'vendorsDisclosed', r.VENDORS_ALLOWED = 'vendorsAllowed', r.PUBLISHER_TC = 'publisherTC'; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(23)), r(n(59)), r(n(121)), r(n(39)), r(n(16)), r(n(60)), r(n(61)), r(n(63)), r(n(62)); + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(16), o = n(5), i = function () { + function e() { + } + return e.encode = function (e, t) { + return r.IntEncoder.encode(Math.round(e.getTime() / 100), t); + }, e.decode = function (e, t) { + if (t !== e.length) + throw new o.DecodingError('invalid bit length'); + var n = new Date(); + return n.setTime(100 * r.IntEncoder.decode(e, t)), n; + }, e; + }(); + t.DateEncoder = i; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(16), o = n(5), i = function () { + function e() { + } + return e.encode = function (e, t) { + var n = (e = e.toUpperCase()).charCodeAt(0) - 65, i = e.charCodeAt(1) - 65; + if (n < 0 || n > 25 || i < 0 || i > 25) + throw new o.EncodingError('invalid language code: ' + e); + if (t % 2 == 1) + throw new o.EncodingError('numBits must be even, ' + t + ' is not valid'); + return t /= 2, r.IntEncoder.encode(n, t) + r.IntEncoder.encode(i, t); + }, e.decode = function (e, t) { + if (t !== e.length || e.length % 2) + throw new o.DecodingError('invalid bit length for language'); + var n = e.length / 2, i = r.IntEncoder.decode(e.slice(0, n), n) + 65, s = r.IntEncoder.decode(e.slice(n), n) + 65; + return String.fromCharCode(i) + String.fromCharCode(s); + }, e; + }(); + t.LangEncoder = i; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(37), o = n(23), i = n(5), s = n(16), a = n(6), c = function () { + function e() { + } + return e.encode = function (e) { + var t = s.IntEncoder.encode(e.numRestrictions, r.BitLength.numRestrictions); + return e.isEmpty() || e.getRestrictions().forEach(function (n) { + t += s.IntEncoder.encode(n.purposeId, r.BitLength.purposeId), t += s.IntEncoder.encode(n.restrictionType, r.BitLength.restrictionType); + for (var i = e.getVendors(n), a = i.length, c = 0, u = 0, p = '', l = function (t) { + var n = i[t]; + 0 === u && (c++, u = n); + var l = i[a - 1], d = e.gvl.vendorIds; + if (t === a - 1 || i[t + 1] > function (e) { + for (; ++e <= l && !d.has(e);); + return e; + }(n)) { + var f = !(n === u); + p += o.BooleanEncoder.encode(f), p += s.IntEncoder.encode(u, r.BitLength.vendorId), f && (p += s.IntEncoder.encode(n, r.BitLength.vendorId)), u = 0; + } + }, d = 0; d < a; d++) + l(d); + t += s.IntEncoder.encode(c, r.BitLength.numEntries), t += p; + }), t; + }, e.decode = function (e) { + var t = 0, n = new a.PurposeRestrictionVector(), c = s.IntEncoder.decode(e.substr(t, r.BitLength.numRestrictions), r.BitLength.numRestrictions); + t += r.BitLength.numRestrictions; + for (var u = 0; u < c; u++) { + var p = s.IntEncoder.decode(e.substr(t, r.BitLength.purposeId), r.BitLength.purposeId); + t += r.BitLength.purposeId; + var l = s.IntEncoder.decode(e.substr(t, r.BitLength.restrictionType), r.BitLength.restrictionType); + t += r.BitLength.restrictionType; + var d = new a.PurposeRestriction(p, l), f = s.IntEncoder.decode(e.substr(t, r.BitLength.numEntries), r.BitLength.numEntries); + t += r.BitLength.numEntries; + for (var h = 0; h < f; h++) { + var y = o.BooleanEncoder.decode(e.substr(t, r.BitLength.anyBoolean)); + t += r.BitLength.anyBoolean; + var v = s.IntEncoder.decode(e.substr(t, r.BitLength.vendorId), r.BitLength.vendorId); + if (t += r.BitLength.vendorId, y) { + var g = s.IntEncoder.decode(e.substr(t, r.BitLength.vendorId), r.BitLength.vendorId); + if (t += r.BitLength.vendorId, g < v) + throw new i.DecodingError('Invalid RangeEntry: endVendorId ' + g + ' is less than ' + v); + for (var m = v; m <= g; m++) + n.add(m, d); + } else + n.add(v, d); + } + } + return n.bitLength = t, n; + }, e; + }(); + t.PurposeRestrictionVectorEncoder = c; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(6), o = n(36), i = n(16), s = n(23), a = n(39), c = n(63), u = n(5), p = function () { + function e() { + } + return e.encode = function (e) { + var t, n = [], r = [], a = i.IntEncoder.encode(e.maxId, o.BitLength.maxId), u = '', p = o.BitLength.maxId + o.BitLength.encodingType, l = p + e.maxId, d = 2 * o.BitLength.vendorId + o.BitLength.singleOrRange + o.BitLength.numEntries, f = p + o.BitLength.numEntries; + return e.forEach(function (i, a) { + u += s.BooleanEncoder.encode(i), (t = e.maxId > d && f < l) && i && (e.has(a + 1) ? 0 === r.length && (r.push(a), f += o.BitLength.singleOrRange, f += o.BitLength.vendorId) : (r.push(a), f += o.BitLength.vendorId, n.push(r), r = [])); + }), t ? (a += c.VectorEncodingType.RANGE + '', a += this.buildRangeEncoding(n)) : (a += c.VectorEncodingType.FIELD + '', a += u), a; + }, e.decode = function (e, t) { + var n, p = 0, l = i.IntEncoder.decode(e.substr(p, o.BitLength.maxId), o.BitLength.maxId); + p += o.BitLength.maxId; + var d = i.IntEncoder.decode(e.charAt(p), o.BitLength.encodingType); + if (p += o.BitLength.encodingType, d === c.VectorEncodingType.RANGE) { + if (n = new r.Vector(), 1 === t) { + if ('1' === e.substr(p, 1)) + throw new u.DecodingError('Unable to decode default consent=1'); + p++; + } + var f = i.IntEncoder.decode(e.substr(p, o.BitLength.numEntries), o.BitLength.numEntries); + p += o.BitLength.numEntries; + for (var h = 0; h < f; h++) { + var y = s.BooleanEncoder.decode(e.charAt(p)); + p += o.BitLength.singleOrRange; + var v = i.IntEncoder.decode(e.substr(p, o.BitLength.vendorId), o.BitLength.vendorId); + if (p += o.BitLength.vendorId, y) { + var g = i.IntEncoder.decode(e.substr(p, o.BitLength.vendorId), o.BitLength.vendorId); + p += o.BitLength.vendorId; + for (var m = v; m <= g; m++) + n.set(m); + } else + n.set(v); + } + } else { + var b = e.substr(p, l); + p += l, n = a.FixedVectorEncoder.decode(b, l); + } + return n.bitLength = p, n; + }, e.buildRangeEncoding = function (e) { + var t = e.length, n = i.IntEncoder.encode(t, o.BitLength.numEntries); + return e.forEach(function (e) { + var t = 1 === e.length; + n += s.BooleanEncoder.encode(!t), n += i.IntEncoder.encode(e[0], o.BitLength.vendorId), t || (n += i.IntEncoder.encode(e[1], o.BitLength.vendorId)); + }), n; + }, e; + }(); + t.VendorVectorEncoder = p; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.VectorEncodingType || (t.VectorEncodingType = {}))[r.FIELD = 0] = 'FIELD', r[r.RANGE = 1] = 'RANGE'; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(122)), r(n(123)); + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e() { + } + return e.absCall = function (e, t, n, r) { + return new Promise(function (o, i) { + const $___old_4ccc739ef538c7a4 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_8f1976039e82f250 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_4ccc739ef538c7a4) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + if ($___old_8f1976039e82f250) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var s = new XMLHttpRequest(); + s.withCredentials = n, s.addEventListener('load', function () { + const $___old_2535e06ae7e00f06 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_2535e06ae7e00f06) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + if (s.readyState == XMLHttpRequest.DONE) + if (s.status >= 200 && s.status < 300) { + var e = s.response; + if ('string' == typeof e) + try { + e = JSON.parse(e); + } catch (e) { + } + o(e); + } else + i(new Error('HTTP Status: ' + s.status + ' response type: ' + s.responseType)); + }.apply(this, arguments); + } finally { + if ($___old_2535e06ae7e00f06) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_2535e06ae7e00f06)); + } + }), s.addEventListener('error', function () { + i(new Error('error')); + }), s.addEventListener('abort', function () { + i(new Error('aborted')); + }), null === t ? s.open('GET', e, !0) : s.open('POST', e, !0), s.responseType = 'json', s.timeout = r, s.ontimeout = function () { + i(new Error('Timeout ' + r + 'ms ' + e)); + }, s.send(t); + }.apply(this, arguments); + } finally { + if ($___old_4ccc739ef538c7a4) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_4ccc739ef538c7a4)); + if ($___old_8f1976039e82f250) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_8f1976039e82f250)); + } + }); + }, e.post = function (e, t, n, r) { + return void 0 === n && (n = !1), void 0 === r && (r = 0), this.absCall(e, JSON.stringify(t), n, r); + }, e.fetch = function (e, t, n) { + return void 0 === t && (t = !1), void 0 === n && (n = 0), this.absCall(e, null, t, n); + }, e; + }(); + t.Json = r; + }, + function (e, t) { + }, + function (e, t) { + }, + function (e, t) { + }, + function (e, t) { + }, + function (e, t) { + e.exports = [ + 'en', + 'fr', + 'de', + 'it', + 'es', + 'da', + 'nl', + 'el', + 'hu', + 'pt', + 'ro', + 'fi', + 'pl', + 'sk', + 'sv', + 'no', + 'ru', + 'bg', + 'ca', + 'cs', + 'et', + 'hr', + 'lt', + 'lv', + 'mt', + 'sl', + 'tr', + 'zh' + ]; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e, t) { + return function () { + for (var n = new Array(arguments.length), r = 0; r < n.length; r++) + n[r] = arguments[r]; + return e.apply(t, n); + }; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + function o(e) { + return encodeURIComponent(e).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']'); + } + e.exports = function (e, t, n) { + if (!t) + return e; + var i; + if (n) + i = n(t); + else if (r.isURLSearchParams(t)) + i = t.toString(); + else { + var s = []; + r.forEach(t, function (e, t) { + null !== e && 'undefined' !== typeof e && (r.isArray(e) ? t += '[]' : e = [e], r.forEach(e, function (e) { + r.isDate(e) ? e = e.toISOString() : r.isObject(e) && (e = JSON.stringify(e)), s.push(o(t) + '=' + o(e)); + })); + }), i = s.join('&'); + } + if (i) { + var a = e.indexOf('#'); + -1 !== a && (e = e.slice(0, a)), e += (-1 === e.indexOf('?') ? '?' : '&') + i; + } + return e; + }; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e) { + return !(!e || !e.__CANCEL__); + }; + }, + function (e, t, n) { + 'use strict'; + (function (t) { + var r = n(7), o = n(134), i = { 'Content-Type': 'application/x-www-form-urlencoded' }; + function s(e, t) { + !r.isUndefined(e) && r.isUndefined(e['Content-Type']) && (e['Content-Type'] = t); + } + var a = { + adapter: function () { + const $___old_a2627446ac552d3d = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_a2627446ac552d3d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var e; + return ('undefined' !== typeof XMLHttpRequest || 'undefined' !== typeof t && '[object process]' === Object.prototype.toString.call(t)) && (e = n(75)), e; + }.apply(this, arguments); + } finally { + if ($___old_a2627446ac552d3d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_a2627446ac552d3d)); + } + }(), + transformRequest: [function (e, t) { + return o(t, 'Accept'), o(t, 'Content-Type'), r.isFormData(e) || r.isArrayBuffer(e) || r.isBuffer(e) || r.isStream(e) || r.isFile(e) || r.isBlob(e) ? e : r.isArrayBufferView(e) ? e.buffer : r.isURLSearchParams(e) ? (s(t, 'application/x-www-form-urlencoded;charset=utf-8'), e.toString()) : r.isObject(e) ? (s(t, 'application/json;charset=utf-8'), JSON.stringify(e)) : e; + }], + transformResponse: [function (e) { + if ('string' === typeof e) + try { + e = JSON.parse(e); + } catch (t) { + } + return e; + }], + timeout: 0, + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + maxContentLength: -1, + validateStatus: function (e) { + return e >= 200 && e < 300; + }, + headers: { common: { Accept: 'application/json, text/plain, */*' } } + }; + r.forEach([ + 'delete', + 'get', + 'head' + ], function (e) { + a.headers[e] = {}; + }), r.forEach([ + 'post', + 'put', + 'patch' + ], function (e) { + a.headers[e] = r.merge(i); + }), e.exports = a; + }.call(this, n(133))); + }, + function (e, t, n) { + 'use strict'; + var r = n(7), o = n(135), i = n(72), s = n(137), a = n(140), c = n(141), u = n(76); + e.exports = function (e) { + return new Promise(function (t, p) { + const $___old_778b63fbc135cb9a = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_0a14f656d50e40ba = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_778b63fbc135cb9a) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + if ($___old_0a14f656d50e40ba) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var l = e.data, d = e.headers; + r.isFormData(l) && delete d['Content-Type']; + var f = new XMLHttpRequest(); + if (e.auth) { + var h = e.auth.username || '', y = e.auth.password || ''; + d.Authorization = 'Basic ' + btoa(h + ':' + y); + } + var v = s(e.baseURL, e.url); + if (f.open(e.method.toUpperCase(), i(v, e.params, e.paramsSerializer), !0), f.timeout = e.timeout, f.onreadystatechange = function () { + if (f && 4 === f.readyState && (0 !== f.status || f.responseURL && 0 === f.responseURL.indexOf('file:'))) { + var n = 'getAllResponseHeaders' in f ? a(f.getAllResponseHeaders()) : null, r = { + data: e.responseType && 'text' !== e.responseType ? f.response : f.responseText, + status: f.status, + statusText: f.statusText, + headers: n, + config: e, + request: f + }; + o(t, p, r), f = null; + } + }, f.onabort = function () { + f && (p(u('Request aborted', e, 'ECONNABORTED', f)), f = null); + }, f.onerror = function () { + p(u('Network Error', e, null, f)), f = null; + }, f.ontimeout = function () { + var t = 'timeout of ' + e.timeout + 'ms exceeded'; + e.timeoutErrorMessage && (t = e.timeoutErrorMessage), p(u(t, e, 'ECONNABORTED', f)), f = null; + }, r.isStandardBrowserEnv()) { + var g = n(142), m = (e.withCredentials || c(v)) && e.xsrfCookieName ? g.read(e.xsrfCookieName) : void 0; + m && (d[e.xsrfHeaderName] = m); + } + if ('setRequestHeader' in f && r.forEach(d, function (e, t) { + 'undefined' === typeof l && 'content-type' === t.toLowerCase() ? delete d[t] : f.setRequestHeader(t, e); + }), r.isUndefined(e.withCredentials) || (f.withCredentials = !!e.withCredentials), e.responseType) + try { + f.responseType = e.responseType; + } catch (b) { + if ('json' !== e.responseType) + throw b; + } + 'function' === typeof e.onDownloadProgress && f.addEventListener('progress', e.onDownloadProgress), 'function' === typeof e.onUploadProgress && f.upload && f.upload.addEventListener('progress', e.onUploadProgress), e.cancelToken && e.cancelToken.promise.then(function (e) { + f && (f.abort(), p(e), f = null); + }), void 0 === l && (l = null), f.send(l); + }.apply(this, arguments); + } finally { + if ($___old_778b63fbc135cb9a) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_778b63fbc135cb9a)); + if ($___old_0a14f656d50e40ba) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_0a14f656d50e40ba)); + } + }); + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(136); + e.exports = function (e, t, n, o, i) { + var s = new Error(e); + return r(s, t, n, o, i); + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + e.exports = function (e, t) { + t = t || {}; + var n = {}, o = [ + 'url', + 'method', + 'params', + 'data' + ], i = [ + 'headers', + 'auth', + 'proxy' + ], s = [ + 'baseURL', + 'url', + 'transformRequest', + 'transformResponse', + 'paramsSerializer', + 'timeout', + 'withCredentials', + 'adapter', + 'responseType', + 'xsrfCookieName', + 'xsrfHeaderName', + 'onUploadProgress', + 'onDownloadProgress', + 'maxContentLength', + 'validateStatus', + 'maxRedirects', + 'httpAgent', + 'httpsAgent', + 'cancelToken', + 'socketPath' + ]; + r.forEach(o, function (e) { + 'undefined' !== typeof t[e] && (n[e] = t[e]); + }), r.forEach(i, function (o) { + r.isObject(t[o]) ? n[o] = r.deepMerge(e[o], t[o]) : 'undefined' !== typeof t[o] ? n[o] = t[o] : r.isObject(e[o]) ? n[o] = r.deepMerge(e[o]) : 'undefined' !== typeof e[o] && (n[o] = e[o]); + }), r.forEach(s, function (r) { + 'undefined' !== typeof t[r] ? n[r] = t[r] : 'undefined' !== typeof e[r] && (n[r] = e[r]); + }); + var a = o.concat(i).concat(s), c = Object.keys(t).filter(function (e) { + return -1 === a.indexOf(e); + }); + return r.forEach(c, function (r) { + 'undefined' !== typeof t[r] ? n[r] = t[r] : 'undefined' !== typeof e[r] && (n[r] = e[r]); + }), n; + }; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + this.message = e; + } + r.prototype.toString = function () { + return 'Cancel' + (this.message ? ': ' + this.message : ''); + }, r.prototype.__CANCEL__ = !0, e.exports = r; + }, + , + , + , + , + , + , + , + function (e, t, n) { + 'use strict'; + function r(e) { + for (var n in e) + t.hasOwnProperty(n) || (t[n] = e[n]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), r(n(47)), r(n(27)), r(n(29)), r(n(106)); + var o = n(51); + t.API_KEY = o.API_KEY; + }, + function (e, t, n) { + e.exports = n(128); + }, + function (e, t) { + e.exports = 'data:image/svg+xml,%3Csvg viewBox=\'0 0 16 17\' version=\'1.1\' xmlns=\'http://www.w3.org/2000/svg\' xmlns:xlink=\'http://www.w3.org/1999/xlink\' style=\'margin-right: 5px; height: 17px;\'%3E%3Cg id=\'Page-1\' stroke=\'none\' stroke-width=\'1\' fill=\'none\' fill-rule=\'evenodd\'%3E%3Cg id=\'cog\' fill=\'%23FFFFFF\' fill-rule=\'nonzero\'%3E%3Cpath d=\'M15.596917,9.98326938 L14.5041079,9.33798816 C14.5728064,8.7815386 14.5728064,8.2184614 14.5041079,7.66201184 L15.596917,7.01673062 C15.9178229,6.82726259 16.0726124,6.43742732 15.9670848,6.0741546 C15.5912871,4.78033611 14.9223646,3.61573153 14.0390021,2.66061113 C13.7831755,2.38401797 13.3749053,2.32348965 13.0525249,2.51384881 L11.9613243,3.15813608 C11.5248519,2.81840117 11.0481221,2.53648663 10.542482,2.31910255 L10.542482,1.02991108 C10.542482,0.648438733 10.2860522,0.316869683 9.92305592,0.229024792 C8.66155,-0.07632446 7.33871809,-0.0763587342 6.07694408,0.229024792 C5.71398131,0.316869683 5.457518,0.648404458 5.457518,1.02991108 L5.457518,2.31910255 C4.95187406,2.53647872 4.47514334,2.81839382 4.03867572,3.15813608 L2.94747511,2.51384881 C2.62506122,2.32348965 2.21679094,2.38401797 1.96099786,2.66061113 C1.07763542,3.61573153 0.40871289,4.78037038 0.0329152236,6.0741546 C-0.072612407,6.43742732 0.0821770899,6.82722832 0.403082962,7.01673062 L1.49589212,7.66201184 C1.42719356,8.2184614 1.42719356,8.7815386 1.49589212,9.33798816 L0.403082962,9.98326938 C0.0821770899,10.1727374 -0.072612407,10.5625727 0.0329152236,10.9258454 C0.40871289,12.2196296 1.07763542,13.3842685 1.96099786,14.3393889 C2.21682445,14.615982 2.62509474,14.6765103 2.94747511,14.4861855 L4.03867572,13.8418982 C4.47514096,14.1816349 4.95187243,14.4635389 5.457518,14.6808975 L5.457518,15.9700889 C5.457518,16.3515613 5.7139478,16.6831303 6.07694408,16.7709752 C7.33848351,17.0763245 8.66128191,17.0763587 9.92305592,16.7709752 C10.2860187,16.6831303 10.542482,16.3515955 10.542482,15.9700889 L10.542482,14.6808975 C11.0481183,14.4635198 11.5248475,14.1816171 11.9613243,13.8418982 L13.0525249,14.4861855 C13.3749053,14.6765446 13.7831755,14.6160163 14.0390021,14.3393889 C14.9223646,13.3842685 15.5912871,12.2196296 15.9670848,10.9258454 C16.0726124,10.5625727 15.9178229,10.1727717 15.596917,9.98326938 Z M13.4026193,13.4264943 L11.8507364,12.510001 C10.9463288,13.3007421 10.6255905,13.4997041 9.47011484,13.9172673 L9.47011484,15.7502196 C8.50024808,15.9548373 7.49975192,15.9548373 6.52988516,15.7502196 L6.52988516,13.9172673 C5.4031959,13.5101235 5.07699522,13.3210668 4.14926358,12.510001 L2.59738075,13.4264943 C1.9368696,12.6693763 1.43490124,11.7817076 1.12525522,10.8230912 L2.67780828,9.90659789 C2.4588108,8.69270694 2.45871027,8.30790999 2.67780828,7.09340211 L1.12525522,6.17690879 C1.43490124,5.21829242 1.93690311,4.33058946 2.59738075,3.57312864 L4.14926358,4.49030745 C5.0667072,3.68712478 5.39129933,3.4941265 6.52988516,3.08269846 L6.52988516,1.24978037 C7.49971774,1.04482059 8.50028226,1.04482059 9.47011484,1.24978037 L9.47011484,3.08273274 C10.6087677,3.49419505 10.9333933,3.6872276 11.8507364,4.49034172 L13.4026193,3.57316291 C14.0630969,4.33058946 14.5650988,5.21829242 14.8747448,6.17694306 L13.3221917,7.09343638 C13.5412227,8.3076358 13.5412897,8.69212428 13.3221917,9.90663217 L14.8747448,10.8231255 C14.5650988,11.7817076 14.0631304,12.6694105 13.4026193,13.4264943 Z M8,5.20968958 C6.22607014,5.20968958 4.78289853,6.68570996 4.78289853,8.50001714 C4.78289853,10.3143243 6.22607014,11.7903447 8,11.7903447 C9.77392986,11.7903447 11.2171015,10.3143243 11.2171015,8.50001714 C11.2171015,6.68570996 9.77392986,5.20968958 8,5.20968958 Z M8,10.6935688 C6.81738009,10.6935688 5.85526568,9.70955526 5.85526568,8.50001714 C5.85526568,7.29047902 6.81738009,6.30646543 8,6.30646543 C9.18261991,6.30646543 10.1447343,7.29047902 10.1447343,8.50001714 C10.1447343,9.70955526 9.18261991,10.6935688 8,10.6935688 Z\' id=\'Shape\'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/svg%3E'; + }, + , + , + , + , + , + , + , + , + , + , + function (e, t, n) { + var r = function (e) { + 'use strict'; + var t = Object.prototype, n = t.hasOwnProperty, r = 'function' === typeof Symbol ? Symbol : {}, o = r.iterator || '@@iterator', i = r.asyncIterator || '@@asyncIterator', s = r.toStringTag || '@@toStringTag'; + function a(e, t, n) { + return Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }), e[t]; + } + try { + a({}, ''); + } catch (P) { + a = function (e, t, n) { + return e[t] = n; + }; + } + function c(e, t, n, r) { + var o = t && t.prototype instanceof l ? t : l, i = Object.create(o.prototype), s = new S(r || []); + return i._invoke = function (e, t, n) { + var r = 'suspendedStart'; + return function (o, i) { + if ('executing' === r) + throw new Error('Generator is already running'); + if ('completed' === r) { + if ('throw' === o) + throw i; + return L(); + } + for (n.method = o, n.arg = i;;) { + var s = n.delegate; + if (s) { + var a = C(s, n); + if (a) { + if (a === p) + continue; + return a; + } + } + if ('next' === n.method) + n.sent = n._sent = n.arg; + else if ('throw' === n.method) { + if ('suspendedStart' === r) + throw r = 'completed', n.arg; + n.dispatchException(n.arg); + } else + 'return' === n.method && n.abrupt('return', n.arg); + r = 'executing'; + var c = u(e, t, n); + if ('normal' === c.type) { + if (r = n.done ? 'completed' : 'suspendedYield', c.arg === p) + continue; + return { + value: c.arg, + done: n.done + }; + } + 'throw' === c.type && (r = 'completed', n.method = 'throw', n.arg = c.arg); + } + }; + }(e, n, s), i; + } + function u(e, t, n) { + try { + return { + type: 'normal', + arg: e.call(t, n) + }; + } catch (P) { + return { + type: 'throw', + arg: P + }; + } + } + e.wrap = c; + var p = {}; + function l() { + } + function d() { + } + function f() { + } + var h = {}; + h[o] = function () { + return this; + }; + var y = Object.getPrototypeOf, v = y && y(y(I([]))); + v && v !== t && n.call(v, o) && (h = v); + var g = f.prototype = l.prototype = Object.create(h); + function m(e) { + [ + 'next', + 'throw', + 'return' + ].forEach(function (t) { + a(e, t, function (e) { + return this._invoke(t, e); + }); + }); + } + function b(e, t) { + var r; + this._invoke = function (o, i) { + function s() { + return new t(function (r, s) { + !function r(o, i, s, a) { + var c = u(e[o], e, i); + if ('throw' !== c.type) { + var p = c.arg, l = p.value; + return l && 'object' === typeof l && n.call(l, '__await') ? t.resolve(l.__await).then(function (e) { + r('next', e, s, a); + }, function (e) { + r('throw', e, s, a); + }) : t.resolve(l).then(function (e) { + p.value = e, s(p); + }, function (e) { + return r('throw', e, s, a); + }); + } + a(c.arg); + }(o, i, r, s); + }); + } + return r = r ? r.then(s, s) : s(); + }; + } + function C(e, t) { + var n = e.iterator[t.method]; + if (void 0 === n) { + if (t.delegate = null, 'throw' === t.method) { + if (e.iterator.return && (t.method = 'return', t.arg = void 0, C(e, t), 'throw' === t.method)) + return p; + t.method = 'throw', t.arg = new TypeError('The iterator does not provide a \'throw\' method'); + } + return p; + } + var r = u(n, e.iterator, t.arg); + if ('throw' === r.type) + return t.method = 'throw', t.arg = r.arg, t.delegate = null, p; + var o = r.arg; + return o ? o.done ? (t[e.resultName] = o.value, t.next = e.nextLoc, 'return' !== t.method && (t.method = 'next', t.arg = void 0), t.delegate = null, p) : o : (t.method = 'throw', t.arg = new TypeError('iterator result is not an object'), t.delegate = null, p); + } + function _(e) { + var t = { tryLoc: e[0] }; + 1 in e && (t.catchLoc = e[1]), 2 in e && (t.finallyLoc = e[2], t.afterLoc = e[3]), this.tryEntries.push(t); + } + function E(e) { + var t = e.completion || {}; + t.type = 'normal', delete t.arg, e.completion = t; + } + function S(e) { + this.tryEntries = [{ tryLoc: 'root' }], e.forEach(_, this), this.reset(!0); + } + function I(e) { + if (e) { + var t = e[o]; + if (t) + return t.call(e); + if ('function' === typeof e.next) + return e; + if (!isNaN(e.length)) { + var r = -1, i = function t() { + for (; ++r < e.length;) + if (n.call(e, r)) + return t.value = e[r], t.done = !1, t; + return t.value = void 0, t.done = !0, t; + }; + return i.next = i; + } + } + return { next: L }; + } + function L() { + return { + value: void 0, + done: !0 + }; + } + return d.prototype = g.constructor = f, f.constructor = d, d.displayName = a(f, s, 'GeneratorFunction'), e.isGeneratorFunction = function (e) { + var t = 'function' === typeof e && e.constructor; + return !!t && (t === d || 'GeneratorFunction' === (t.displayName || t.name)); + }, e.mark = function (e) { + return Object.setPrototypeOf ? Object.setPrototypeOf(e, f) : (e.__proto__ = f, a(e, s, 'GeneratorFunction')), e.prototype = Object.create(g), e; + }, e.awrap = function (e) { + return { __await: e }; + }, m(b.prototype), b.prototype[i] = function () { + return this; + }, e.AsyncIterator = b, e.async = function (t, n, r, o, i) { + void 0 === i && (i = Promise); + var s = new b(c(t, n, r, o), i); + return e.isGeneratorFunction(n) ? s : s.next().then(function (e) { + return e.done ? e.value : s.next(); + }); + }, m(g), a(g, s, 'Generator'), g[o] = function () { + return this; + }, g.toString = function () { + return '[object Generator]'; + }, e.keys = function (e) { + var t = []; + for (var n in e) + t.push(n); + return t.reverse(), function n() { + for (; t.length;) { + var r = t.pop(); + if (r in e) + return n.value = r, n.done = !1, n; + } + return n.done = !0, n; + }; + }, e.values = I, S.prototype = { + constructor: S, + reset: function (e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = 'next', this.arg = void 0, this.tryEntries.forEach(E), !e) + for (var t in this) + 't' === t.charAt(0) && n.call(this, t) && !isNaN(+t.slice(1)) && (this[t] = void 0); + }, + stop: function () { + this.done = !0; + var e = this.tryEntries[0].completion; + if ('throw' === e.type) + throw e.arg; + return this.rval; + }, + dispatchException: function (e) { + if (this.done) + throw e; + var t = this; + function r(n, r) { + return s.type = 'throw', s.arg = e, t.next = n, r && (t.method = 'next', t.arg = void 0), !!r; + } + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var i = this.tryEntries[o], s = i.completion; + if ('root' === i.tryLoc) + return r('end'); + if (i.tryLoc <= this.prev) { + var a = n.call(i, 'catchLoc'), c = n.call(i, 'finallyLoc'); + if (a && c) { + if (this.prev < i.catchLoc) + return r(i.catchLoc, !0); + if (this.prev < i.finallyLoc) + return r(i.finallyLoc); + } else if (a) { + if (this.prev < i.catchLoc) + return r(i.catchLoc, !0); + } else { + if (!c) + throw new Error('try statement without catch or finally'); + if (this.prev < i.finallyLoc) + return r(i.finallyLoc); + } + } + } + }, + abrupt: function (e, t) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && n.call(o, 'finallyLoc') && this.prev < o.finallyLoc) { + var i = o; + break; + } + } + i && ('break' === e || 'continue' === e) && i.tryLoc <= t && t <= i.finallyLoc && (i = null); + var s = i ? i.completion : {}; + return s.type = e, s.arg = t, i ? (this.method = 'next', this.next = i.finallyLoc, p) : this.complete(s); + }, + complete: function (e, t) { + if ('throw' === e.type) + throw e.arg; + return 'break' === e.type || 'continue' === e.type ? this.next = e.arg : 'return' === e.type ? (this.rval = this.arg = e.arg, this.method = 'return', this.next = 'end') : 'normal' === e.type && t && (this.next = t), p; + }, + finish: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var n = this.tryEntries[t]; + if (n.finallyLoc === e) + return this.complete(n.completion, n.afterLoc), E(n), p; + } + }, + catch: function (e) { + for (var t = this.tryEntries.length - 1; t >= 0; --t) { + var n = this.tryEntries[t]; + if (n.tryLoc === e) { + var r = n.completion; + if ('throw' === r.type) { + var o = r.arg; + E(n); + } + return o; + } + } + throw new Error('illegal catch attempt'); + }, + delegateYield: function (e, t, n) { + return this.delegate = { + iterator: I(e), + resultName: t, + nextLoc: n + }, 'next' === this.method && (this.arg = void 0), p; + } + }, e; + }(e.exports); + try { + regeneratorRuntime = r; + } catch (o) { + Function('r', 'regeneratorRuntime = r')(r); + } + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.CmpStatus || (t.CmpStatus = {})).STUB = 'stub', r.LOADING = 'loading', r.LOADED = 'loaded', r.ERROR = 'error'; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.DisplayStatus || (t.DisplayStatus = {})).VISIBLE = 'visible', r.HIDDEN = 'hidden', r.DISABLED = 'disabled'; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.EventStatus || (t.EventStatus = {})).TC_LOADED = 'tcloaded', r.CMP_UI_SHOWN = 'cmpuishown', r.USER_ACTION_COMPLETE = 'useractioncomplete'; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(30), o = function () { + function e() { + this.eventQueue = new Map(), this.queueNumber = 0; + } + return e.prototype.add = function (e) { + return this.eventQueue.set(this.queueNumber, e), this.queueNumber++; + }, e.prototype.remove = function (e) { + return this.eventQueue.delete(e); + }, e.prototype.exec = function () { + this.eventQueue.forEach(function (e, t) { + new r.GetTCDataCommand(e.callback, e.param, t, e.next); + }); + }, e.prototype.clear = function () { + this.queueNumber = 0, this.eventQueue.clear(); + }, Object.defineProperty(e.prototype, 'size', { + get: function () { + return this.eventQueue.size; + }, + enumerable: !0, + configurable: !0 + }), e; + }(); + t.EventListenerQueue = o; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(), o = this && this.__read || function (e, t) { + var n = 'function' == typeof Symbol && e[Symbol.iterator]; + if (!n) + return e; + var r, o, i = n.call(e), s = []; + try { + for (; (void 0 === t || t-- > 0) && !(r = i.next()).done;) + s.push(r.value); + } catch (e) { + o = { error: e }; + } finally { + try { + r && !r.done && (n = i.return) && n.call(i); + } finally { + if (o) + throw o.error; + } + } + return s; + }, i = this && this.__spread || function () { + for (var e = [], t = 0; t < arguments.length; t++) + e = e.concat(o(arguments[t])); + return e; + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var s = function (e) { + function t(t) { + var n = e.call(this, t) || this; + return delete n.outOfBand, n; + } + return r(t, e), t.prototype.createVectorField = function (e) { + return i(e).reduce(function (e, t) { + return e + (t[1] ? '1' : '0'); + }, ''); + }, t.prototype.createRestrictions = function (e) { + var t = {}; + if (e.numRestrictions > 0) { + var n = e.getMaxVendorId(); + e.getRestrictions().forEach(function (e) { + t[e.purposeId.toString()] = '_'.repeat(n); + }); + for (var r = function (n) { + var r = n + 1; + e.getRestrictions(r).forEach(function (e) { + var r = e.restrictionType.toString(), o = e.purposeId.toString(), i = t[o].substr(0, n), s = t[o].substr(n + 1); + t[o] = i + r + s; + }); + }, o = 0; o < n; o++) + r(o); + } + return t; + }, t; + }(n(50).TCData); + t.InAppTCData = s; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(13), i = function (e) { + function t() { + var t = e.call(this) || this; + return t.cmpLoaded = !0, t.cmpStatus = o.CmpApiModel.cmpStatus, t.displayStatus = o.CmpApiModel.displayStatus, t.apiVersion = '' + o.CmpApiModel.apiVersion, o.CmpApiModel.tcModel && o.CmpApiModel.tcModel.vendorListVersion && (t.gvlVersion = +o.CmpApiModel.tcModel.vendorListVersion), t; + } + return r(t, e), t; + }(n(28).Response); + t.Ping = i; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(13), o = n(29), i = n(51), s = n(52), a = function () { + function e(e, t, n, o) { + void 0 === n && (n = !1), this.numUpdates = 0, this.throwIfInvalidInt(e, 'cmpId', 2), this.throwIfInvalidInt(t, 'cmpVersion', 0), r.CmpApiModel.cmpId = e, r.CmpApiModel.cmpVersion = t, this.isServiceSpecific = !!n, this.callResponder = new i.CallResponder(o); + } + return e.prototype.throwIfInvalidInt = function (e, t, n) { + if (!('number' == typeof e && Number.isInteger(e) && e >= n)) + throw new Error('Invalid ' + t + ': ' + e); + }, e.prototype.update = function (e, t) { + if (void 0 === t && (t = !1), r.CmpApiModel.disabled) + throw new Error('CmpApi Disabled'); + r.CmpApiModel.cmpStatus = o.CmpStatus.LOADED, t ? (r.CmpApiModel.displayStatus = o.DisplayStatus.VISIBLE, r.CmpApiModel.eventStatus = o.EventStatus.CMP_UI_SHOWN) : void 0 === r.CmpApiModel.tcModel ? (r.CmpApiModel.displayStatus = o.DisplayStatus.DISABLED, r.CmpApiModel.eventStatus = o.EventStatus.TC_LOADED) : (r.CmpApiModel.displayStatus = o.DisplayStatus.HIDDEN, r.CmpApiModel.eventStatus = o.EventStatus.USER_ACTION_COMPLETE), r.CmpApiModel.gdprApplies = null !== e, r.CmpApiModel.gdprApplies ? ('' === e ? (r.CmpApiModel.tcModel = new s.TCModel(), r.CmpApiModel.tcModel.cmpId = r.CmpApiModel.cmpId, r.CmpApiModel.tcModel.cmpVersion = r.CmpApiModel.cmpVersion) : r.CmpApiModel.tcModel = s.TCString.decode(e), r.CmpApiModel.tcModel.isServiceSpecific = this.isServiceSpecific, r.CmpApiModel.tcfPolicyVersion = +r.CmpApiModel.tcModel.policyVersion, r.CmpApiModel.tcString = e) : r.CmpApiModel.tcModel = null, 0 === this.numUpdates ? this.callResponder.purgeQueuedCalls() : r.CmpApiModel.eventQueue.exec(), this.numUpdates++; + }, e.prototype.disable = function () { + r.CmpApiModel.disabled = !0, r.CmpApiModel.cmpStatus = o.CmpStatus.ERROR; + }, e; + }(); + t.CmpApi = a; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(108), o = n(30), i = n(109), s = n(110), a = n(125), c = n(126), u = n(48), p = function () { + function e() { + } + var t, n, p, l, d, f; + return t = u.TCFCommand.PING, n = u.TCFCommand.GET_TC_DATA, p = u.TCFCommand.GET_IN_APP_TC_DATA, l = u.TCFCommand.GET_VENDOR_LIST, d = u.TCFCommand.ADD_EVENT_LISTENER, f = u.TCFCommand.REMOVE_EVENT_LISTENER, e[t] = r.PingCommand, e[n] = o.GetTCDataCommand, e[p] = i.GetInAppTCDataCommand, e[l] = s.GetVendorListCommand, e[d] = a.AddEventListenerCommand, e[f] = c.RemoveEventListenerCommand, e; + }(); + t.CommandMap = p; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(27), i = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + this.invokeCallback(new o.Ping()); + }, t; + }(n(31).Command); + t.PingCommand = i; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(30), i = n(27), s = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + this.throwIfParamInvalid(), this.invokeCallback(new i.InAppTCData(this.param)); + }, t; + }(o.GetTCDataCommand); + t.GetInAppTCDataCommand = s; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(13), i = n(31), s = n(52), a = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + var e, t = this, n = o.CmpApiModel.tcModel, r = n.vendorListVersion; + void 0 === this.param && (this.param = r), (e = this.param === r && n.gvl ? n.gvl : new s.GVL(this.param)).readyPromise.then(function () { + t.invokeCallback(e.getJson()); + }); + }, t; + }(i.Command); + t.GetVendorListCommand = a; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function (e) { + function t(t) { + var n = e.call(this, t) || this; + return n.name = 'DecodingError', n; + } + return r(t, e), t; + }(Error); + t.DecodingError = o; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function (e) { + function t(t) { + var n = e.call(this, t) || this; + return n.name = 'EncodingError', n; + } + return r(t, e), t; + }(Error); + t.EncodingError = o; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function (e) { + function t(t) { + var n = e.call(this, t) || this; + return n.name = 'GVLError', n; + } + return r(t, e), t; + }(Error); + t.GVLError = o; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = function (e) { + function t(t, n, r) { + void 0 === r && (r = ''); + var o = e.call(this, 'invalid value ' + n + ' passed for ' + t + ' ' + r) || this; + return o.name = 'TCModelError', o; + } + return r(t, e), t; + }(Error); + t.TCModelError = o; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e() { + } + return e.prototype.has = function (t) { + return e.langSet.has(t); + }, e.prototype.forEach = function (t) { + e.langSet.forEach(t); + }, Object.defineProperty(e.prototype, 'size', { + get: function () { + return e.langSet.size; + }, + enumerable: !0, + configurable: !0 + }), e.langSet = new Set([ + 'BG', + 'CA', + 'CS', + 'DA', + 'DE', + 'EL', + 'EN', + 'ES', + 'ET', + 'FI', + 'FR', + 'HR', + 'HU', + 'IT', + 'JA', + 'LT', + 'LV', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'RU', + 'SK', + 'SL', + 'SV', + 'TR', + 'ZH' + ]), e; + }(); + t.ConsentLanguages = r; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(), o = this && this.__values || function (e) { + var t = 'function' == typeof Symbol && Symbol.iterator, n = t && e[t], r = 0; + if (n) + return n.call(e); + if (e && 'number' == typeof e.length) + return { + next: function () { + return e && r >= e.length && (e = void 0), { + value: e && e[r++], + done: !e + }; + } + }; + throw new TypeError(t ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = n(56), s = n(54), a = n(38), c = function (e) { + function t() { + var t = null !== e && e.apply(this, arguments) || this; + return t.bitLength = 0, t.map = new Map(), t; + } + return r(t, e), t.prototype.has = function (e) { + return this.map.has(e); + }, t.prototype.isOkToHave = function (e, t, n) { + var r, o = !0; + if (null === (r = this.gvl) || void 0 === r ? void 0 : r.vendors) { + var i = this.gvl.vendors[n]; + if (i) + if (e === a.RestrictionType.NOT_ALLOWED) + o = i.legIntPurposes.includes(t) || i.purposes.includes(t); + else if (i.flexiblePurposes.length) + switch (e) { + case a.RestrictionType.REQUIRE_CONSENT: + o = i.flexiblePurposes.includes(t) && i.legIntPurposes.includes(t); + break; + case a.RestrictionType.REQUIRE_LI: + o = i.flexiblePurposes.includes(t) && i.purposes.includes(t); + } + else + o = !1; + else + o = !1; + } + return o; + }, t.prototype.add = function (e, t) { + if (this.isOkToHave(t.restrictionType, t.purposeId, e)) { + var n = t.hash; + this.has(n) || (this.map.set(n, new s.BinarySearchTree()), this.bitLength = 0), this.map.get(n).add(e); + } + }, t.prototype.restrictPurposeToLegalBasis = function (e) { + for (var t = this.gvl.vendorIds, n = e.hash, r = function () { + var e, n, r; + try { + for (var i = o(t), s = i.next(); !s.done; s = i.next()) + r = s.value; + } catch (t) { + e = { error: t }; + } finally { + try { + s && !s.done && (n = i.return) && n.call(i); + } finally { + if (e) + throw e.error; + } + } + return r; + }(), i = 1; i <= r; i++) + this.has(n) || (this.map.set(n, new s.BinarySearchTree()), this.bitLength = 0), this.map.get(n).add(i); + }, t.prototype.getVendors = function (e) { + var t = []; + if (e) { + var n = e.hash; + this.has(n) && (t = this.map.get(n).get()); + } else { + var r = new Set(); + this.map.forEach(function (e) { + e.get().forEach(function (e) { + r.add(e); + }); + }), t = Array.from(r); + } + return t; + }, t.prototype.getRestrictionType = function (e, t) { + var n; + return this.getRestrictions(e).forEach(function (e) { + e.purposeId === t && (void 0 === n || n > e.restrictionType) && (n = e.restrictionType); + }), n; + }, t.prototype.vendorHasRestriction = function (e, t) { + for (var n = !1, r = this.getRestrictions(e), o = 0; o < r.length && !n; o++) + n = t.isSameAs(r[o]); + return n; + }, t.prototype.getMaxVendorId = function () { + var e = 0; + return this.map.forEach(function (t) { + e = Math.max(t.max(), e); + }), e; + }, t.prototype.getRestrictions = function (e) { + var t = []; + return this.map.forEach(function (n, r) { + e ? n.contains(e) && t.push(i.PurposeRestriction.unHash(r)) : t.push(i.PurposeRestriction.unHash(r)); + }), t; + }, t.prototype.getPurposes = function () { + var e = new Set(); + return this.map.forEach(function (t, n) { + e.add(i.PurposeRestriction.unHash(n).purposeId); + }), Array.from(e); + }, t.prototype.remove = function (e, t) { + var n = t.hash, r = this.map.get(n); + r && (r.remove(e), r.isEmpty() && (this.map.delete(n), this.bitLength = 0)); + }, Object.defineProperty(t.prototype, 'gvl', { + get: function () { + return this.gvl_; + }, + set: function (e) { + var t = this; + this.gvl_ || (this.gvl_ = e, this.map.forEach(function (e, n) { + var r = i.PurposeRestriction.unHash(n); + e.get().forEach(function (n) { + t.isOkToHave(r.restrictionType, r.purposeId, n) || e.remove(n); + }); + })); + }, + enumerable: !0, + configurable: !0 + }), t.prototype.isEmpty = function () { + return 0 === this.map.size; + }, Object.defineProperty(t.prototype, 'numRestrictions', { + get: function () { + return this.map.size; + }, + enumerable: !0, + configurable: !0 + }), t; + }(n(15).Cloneable); + t.PurposeRestrictionVector = c; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }), (r = t.DeviceDisclosureStorageAccessType || (t.DeviceDisclosureStorageAccessType = {})).COOKIE = 'cookie', r.WEB = 'web', r.APP = 'app'; + }, + function (e, t, n) { + 'use strict'; + var r; + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(57), i = function () { + function e() { + } + return e.ID_TO_KEY = [ + o.Segment.CORE, + o.Segment.VENDORS_DISCLOSED, + o.Segment.VENDORS_ALLOWED, + o.Segment.PUBLISHER_TC + ], e.KEY_TO_ID = ((r = {})[o.Segment.CORE] = 0, r[o.Segment.VENDORS_DISCLOSED] = 1, r[o.Segment.VENDORS_ALLOWED] = 2, r[o.Segment.PUBLISHER_TC] = 3, r), e; + }(); + t.SegmentIDs = i; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(), o = this && this.__generator || function (e, t) { + var n, r, o, i, s = { + label: 0, + sent: function () { + if (1 & o[0]) + throw o[1]; + return o[1]; + }, + trys: [], + ops: [] + }; + return i = { + next: a(0), + throw: a(1), + return: a(2) + }, 'function' == typeof Symbol && (i[Symbol.iterator] = function () { + return this; + }), i; + function a(i) { + return function (a) { + return function (i) { + if (n) + throw new TypeError('Generator is already executing.'); + for (; s;) + try { + if (n = 1, r && (o = 2 & i[0] ? r.return : i[0] ? r.throw || ((o = r.return) && o.call(r), 0) : r.next) && !(o = o.call(r, i[1])).done) + return o; + switch (r = 0, o && (i = [ + 2 & i[0], + o.value + ]), i[0]) { + case 0: + case 1: + o = i; + break; + case 4: + return s.label++, { + value: i[1], + done: !1 + }; + case 5: + s.label++, r = i[1], i = [0]; + continue; + case 7: + i = s.ops.pop(), s.trys.pop(); + continue; + default: + if (!((o = (o = s.trys).length > 0 && o[o.length - 1]) || 6 !== i[0] && 2 !== i[0])) { + s = 0; + continue; + } + if (3 === i[0] && (!o || i[1] > o[0] && i[1] < o[3])) { + s.label = i[1]; + break; + } + if (6 === i[0] && s.label < o[1]) { + s.label = o[1], o = i; + break; + } + if (o && s.label < o[2]) { + s.label = o[2], s.ops.push(i); + break; + } + o[2] && s.ops.pop(), s.trys.pop(); + continue; + } + i = t.call(e, s); + } catch (e) { + i = [ + 6, + e + ], r = 0; + } finally { + n = o = 0; + } + if (5 & i[0]) + throw i[1]; + return { + value: i[0] ? i[1] : void 0, + done: !0 + }; + }([ + i, + a + ]); + }; + } + }; + Object.defineProperty(t, '__esModule', { value: !0 }); + var i = n(15), s = n(5), a = function (e) { + function t() { + var t = null !== e && e.apply(this, arguments) || this; + return t.bitLength = 0, t.maxId_ = 0, t.set_ = new Set(), t; + } + return r(t, e), t.prototype[Symbol.iterator] = function () { + var e; + return o(this, function (t) { + switch (t.label) { + case 0: + e = 1, t.label = 1; + case 1: + return e <= this.maxId ? [ + 4, + [ + e, + this.has(e) + ] + ] : [ + 3, + 4 + ]; + case 2: + t.sent(), t.label = 3; + case 3: + return e++, [ + 3, + 1 + ]; + case 4: + return [2]; + } + }); + }, t.prototype.values = function () { + return this.set_.values(); + }, Object.defineProperty(t.prototype, 'maxId', { + get: function () { + return this.maxId_; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.has = function (e) { + return this.set_.has(e); + }, t.prototype.unset = function (e) { + var t = this; + Array.isArray(e) ? e.forEach(function (e) { + return t.unset(e); + }) : 'object' == typeof e ? this.unset(Object.keys(e).map(function (e) { + return +e; + })) : (this.set_.delete(e), this.bitLength = 0, e === this.maxId && (this.maxId_ = 0, this.set_.forEach(function (e) { + t.maxId_ = Math.max(t.maxId, e); + }))); + }, t.prototype.isIntMap = function (e) { + var t = this, n = 'object' == typeof e; + return n && Object.keys(e).every(function (n) { + var r = Number.isInteger(parseInt(n, 10)); + return (r = r && t.isValidNumber(e[n].id)) && void 0 !== e[n].name; + }); + }, t.prototype.isValidNumber = function (e) { + return parseInt(e, 10) > 0; + }, t.prototype.isSet = function (e) { + var t = !1; + return e instanceof Set && (t = Array.from(e).every(this.isValidNumber)), t; + }, t.prototype.set = function (e) { + var t = this; + if (Array.isArray(e)) + e.forEach(function (e) { + return t.set(e); + }); + else if (this.isSet(e)) + this.set(Array.from(e)); + else if (this.isIntMap(e)) + this.set(Object.keys(e).map(function (e) { + return +e; + })); + else { + if (!this.isValidNumber(e)) + throw new s.TCModelError('set()', e, 'must be positive integer array, positive integer, Set, or IntMap'); + this.set_.add(e), this.maxId_ = Math.max(this.maxId, e), this.bitLength = 0; + } + }, t.prototype.empty = function () { + this.set_ = new Set(); + }, t.prototype.forEach = function (e) { + for (var t = 1; t <= this.maxId; t++) + e(this.has(t), t); + }, Object.defineProperty(t.prototype, 'size', { + get: function () { + return this.set_.size; + }, + enumerable: !0, + configurable: !0 + }), t.prototype.setAll = function (e) { + this.set(e); + }, t; + }(i.Cloneable); + t.Vector = a; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(53), o = n(37), i = n(58), s = n(64), a = n(5), c = n(55), u = n(6), p = function () { + function e() { + } + return e.encode = function (e, t) { + var n, s = this; + try { + n = this.fieldSequence['' + e.version][t]; + } catch (n) { + throw new a.EncodingError('Unable to encode version: ' + e.version + ', segment: ' + t); + } + var p = ''; + return t !== u.Segment.CORE && (p = i.IntEncoder.encode(u.SegmentIDs.KEY_TO_ID[t], o.BitLength.segmentType)), n.forEach(function (n) { + var r = e[n], u = i.FieldEncoderMap[n], l = o.BitLength[n]; + void 0 === l && s.isPublisherCustom(n) && (l = +e[c.Fields.numCustomPurposes]); + try { + p += u.encode(r, l); + } catch (e) { + throw new a.EncodingError('Error encoding ' + t + '->' + n + ': ' + e.message); + } + }), r.Base64Url.encode(p); + }, e.decode = function (e, t, n) { + var s = this, p = r.Base64Url.decode(e), l = 0; + return n === u.Segment.CORE && (t.version = i.IntEncoder.decode(p.substr(l, o.BitLength[c.Fields.version]), o.BitLength[c.Fields.version])), n !== u.Segment.CORE && (l += o.BitLength.segmentType), this.fieldSequence['' + t.version][n].forEach(function (e) { + var n = i.FieldEncoderMap[e], r = o.BitLength[e]; + if (void 0 === r && s.isPublisherCustom(e) && (r = +t[c.Fields.numCustomPurposes]), 0 !== r) { + var u = p.substr(l, r); + if (n === i.VendorVectorEncoder ? t[e] = n.decode(u, t.version) : t[e] = n.decode(u, r), Number.isInteger(r)) + l += r; + else { + if (!Number.isInteger(t[e].bitLength)) + throw new a.DecodingError(e); + l += t[e].bitLength; + } + } + }), t; + }, e.isPublisherCustom = function (e) { + return 0 === e.indexOf('publisherCustom'); + }, e.fieldSequence = new s.FieldSequence(), e; + }(); + t.SegmentEncoder = p; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(6), o = n(23), i = n(59), s = n(39), a = n(16), c = n(60), u = n(61), p = n(62), l = function () { + function e() { + } + var t, n, l, d, f, h, y, v, g, m, b, C, _, E, S, I, L, P, w, A, k, O, T, V, x, R; + return t = r.Fields.version, n = r.Fields.created, l = r.Fields.lastUpdated, d = r.Fields.cmpId, f = r.Fields.cmpVersion, h = r.Fields.consentScreen, y = r.Fields.consentLanguage, v = r.Fields.vendorListVersion, g = r.Fields.policyVersion, m = r.Fields.isServiceSpecific, b = r.Fields.useNonStandardStacks, C = r.Fields.specialFeatureOptins, _ = r.Fields.purposeConsents, E = r.Fields.purposeLegitimateInterests, S = r.Fields.purposeOneTreatment, I = r.Fields.publisherCountryCode, L = r.Fields.vendorConsents, P = r.Fields.vendorLegitimateInterests, w = r.Fields.publisherRestrictions, A = r.Fields.vendorsDisclosed, k = r.Fields.vendorsAllowed, O = r.Fields.publisherConsents, T = r.Fields.publisherLegitimateInterests, V = r.Fields.numCustomPurposes, x = r.Fields.publisherCustomConsents, R = r.Fields.publisherCustomLegitimateInterests, e[t] = a.IntEncoder, e[n] = i.DateEncoder, e[l] = i.DateEncoder, e[d] = a.IntEncoder, e[f] = a.IntEncoder, e[h] = a.IntEncoder, e[y] = c.LangEncoder, e[v] = a.IntEncoder, e[g] = a.IntEncoder, e[m] = o.BooleanEncoder, e[b] = o.BooleanEncoder, e[C] = s.FixedVectorEncoder, e[_] = s.FixedVectorEncoder, e[E] = s.FixedVectorEncoder, e[S] = o.BooleanEncoder, e[I] = c.LangEncoder, e[L] = p.VendorVectorEncoder, e[P] = p.VendorVectorEncoder, e[w] = u.PurposeRestrictionVectorEncoder, e.segmentType = a.IntEncoder, e[A] = p.VendorVectorEncoder, e[k] = p.VendorVectorEncoder, e[O] = s.FixedVectorEncoder, e[T] = s.FixedVectorEncoder, e[V] = a.IntEncoder, e[x] = s.FixedVectorEncoder, e[R] = s.FixedVectorEncoder, e; + }(); + t.FieldEncoderMap = l; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(6); + t.FieldSequence = function () { + var e, t; + this[1] = ((e = {})[r.Segment.CORE] = [ + r.Fields.version, + r.Fields.created, + r.Fields.lastUpdated, + r.Fields.cmpId, + r.Fields.cmpVersion, + r.Fields.consentScreen, + r.Fields.consentLanguage, + r.Fields.vendorListVersion, + r.Fields.purposeConsents, + r.Fields.vendorConsents + ], e), this[2] = ((t = {})[r.Segment.CORE] = [ + r.Fields.version, + r.Fields.created, + r.Fields.lastUpdated, + r.Fields.cmpId, + r.Fields.cmpVersion, + r.Fields.consentScreen, + r.Fields.consentLanguage, + r.Fields.vendorListVersion, + r.Fields.policyVersion, + r.Fields.isServiceSpecific, + r.Fields.useNonStandardStacks, + r.Fields.specialFeatureOptins, + r.Fields.purposeConsents, + r.Fields.purposeLegitimateInterests, + r.Fields.purposeOneTreatment, + r.Fields.publisherCountryCode, + r.Fields.vendorConsents, + r.Fields.vendorLegitimateInterests, + r.Fields.publisherRestrictions + ], t[r.Segment.PUBLISHER_TC] = [ + r.Fields.publisherConsents, + r.Fields.publisherLegitimateInterests, + r.Fields.numCustomPurposes, + r.Fields.publisherCustomConsents, + r.Fields.publisherCustomLegitimateInterests + ], t[r.Segment.VENDORS_ALLOWED] = [r.Fields.vendorsAllowed], t[r.Segment.VENDORS_DISCLOSED] = [r.Fields.vendorsDisclosed], t); + }; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(6); + t.SegmentSequence = function (e, t) { + if (this[1] = [r.Segment.CORE], this[2] = [r.Segment.CORE], 2 === e.version) + if (e.isServiceSpecific) + this[2].push(r.Segment.PUBLISHER_TC); + else { + var n = !(!t || !t.isForVendors); + n && !0 !== e[r.Fields.supportOOB] || this[2].push(r.Segment.VENDORS_DISCLOSED), n && (e[r.Fields.supportOOB] && e[r.Fields.vendorsAllowed].size > 0 && this[2].push(r.Segment.VENDORS_ALLOWED), this[2].push(r.Segment.PUBLISHER_TC)); + } + }; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = n(5), o = n(6), i = function () { + function e() { + } + return e.process = function (e, t) { + var n, o, i = e.gvl; + if (!i) + throw new r.EncodingError('Unable to encode TCModel without a GVL'); + if (!i.isReady) + throw new r.EncodingError('Unable to encode TCModel tcModel.gvl.readyPromise is not resolved'); + (e = e.clone()).consentLanguage = i.language.toUpperCase(), (null === (n = t) || void 0 === n ? void 0 : n.version) > 0 && (null === (o = t) || void 0 === o ? void 0 : o.version) <= this.processor.length ? e.version = t.version : e.version = this.processor.length; + var s = e.version - 1; + if (!this.processor[s]) + throw new r.EncodingError('Invalid version: ' + e.version); + return this.processor[s](e, i); + }, e.processor = [ + function (e) { + return e; + }, + function (e, t) { + e.publisherRestrictions.gvl = t, e.purposeLegitimateInterests.unset(1); + var n = new Map(); + return n.set('legIntPurposes', e.vendorLegitimateInterests), n.set('purposes', e.vendorConsents), n.forEach(function (n, r) { + n.forEach(function (i, s) { + if (i) { + var a = t.vendors[s]; + if (!a || a.deletedDate) + n.unset(s); + else if (0 === a[r].length) + if (e.isServiceSpecific) + if (0 === a.flexiblePurposes.length) + n.unset(s); + else { + for (var c = e.publisherRestrictions.getRestrictions(s), u = !1, p = 0, l = c.length; p < l && !u; p++) + u = c[p].restrictionType === o.RestrictionType.REQUIRE_CONSENT && 'purposes' === r || c[p].restrictionType === o.RestrictionType.REQUIRE_LI && 'legIntPurposes' === r; + u || n.unset(s); + } + else + n.unset(s); + } + }); + }), e.vendorsDisclosed.set(t.vendors), e; + } + ], e; + }(); + t.SemanticPreEncoder = i; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(13), i = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + this.listenerId = o.CmpApiModel.eventQueue.add({ + callback: this.callback, + param: this.param, + next: this.next + }), e.prototype.respond.call(this); + }, t; + }(n(30).GetTCDataCommand); + t.AddEventListenerCommand = i; + }, + function (e, t, n) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (t, n) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, t) { + e.__proto__ = t; + } || function (e, t) { + for (var n in t) + t.hasOwnProperty(n) && (e[n] = t[n]); + })(t, n); + }; + return function (t, n) { + function r() { + this.constructor = t; + } + e(t, n), t.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r()); + }; + }(); + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = n(13), i = function (e) { + function t() { + return null !== e && e.apply(this, arguments) || this; + } + return r(t, e), t.prototype.respond = function () { + this.invokeCallback(o.CmpApiModel.eventQueue.remove(this.param)); + }, t; + }(n(31).Command); + t.RemoveEventListenerCommand = i; + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var r = function () { + function e() { + } + return e.has = function (e) { + return 'string' == typeof e && (e = +e), this.set_.has(e); + }, e.set_ = new Set([ + 0, + 2, + void 0, + null + ]), e; + }(); + t.SupportedVersions = r; + }, + function (e, t, n) { + 'use strict'; + var r = n(7), o = n(71), i = n(129), s = n(77); + function a(e) { + var t = new i(e), n = o(i.prototype.request, t); + return r.extend(n, i.prototype, t), r.extend(n, t), n; + } + var c = a(n(74)); + c.Axios = i, c.create = function (e) { + return a(s(c.defaults, e)); + }, c.Cancel = n(78), c.CancelToken = n(143), c.isCancel = n(73), c.all = function (e) { + return Promise.all(e); + }, c.spread = n(144), e.exports = c, e.exports.default = c; + }, + function (e, t, n) { + 'use strict'; + var r = n(7), o = n(72), i = n(130), s = n(131), a = n(77); + function c(e) { + this.defaults = e, this.interceptors = { + request: new i(), + response: new i() + }; + } + c.prototype.request = function (e) { + 'string' === typeof e ? (e = arguments[1] || {}).url = arguments[0] : e = e || {}, (e = a(this.defaults, e)).method ? e.method = e.method.toLowerCase() : this.defaults.method ? e.method = this.defaults.method.toLowerCase() : e.method = 'get'; + var t = [ + s, + void 0 + ], n = Promise.resolve(e); + for (this.interceptors.request.forEach(function (e) { + t.unshift(e.fulfilled, e.rejected); + }), this.interceptors.response.forEach(function (e) { + t.push(e.fulfilled, e.rejected); + }); t.length;) + n = n.then(t.shift(), t.shift()); + return n; + }, c.prototype.getUri = function (e) { + return e = a(this.defaults, e), o(e.url, e.params, e.paramsSerializer).replace(/^\?/, ''); + }, r.forEach([ + 'delete', + 'get', + 'head', + 'options' + ], function (e) { + c.prototype[e] = function (t, n) { + return this.request(r.merge(n || {}, { + method: e, + url: t + })); + }; + }), r.forEach([ + 'post', + 'put', + 'patch' + ], function (e) { + c.prototype[e] = function (t, n, o) { + return this.request(r.merge(o || {}, { + method: e, + url: t, + data: n + })); + }; + }), e.exports = c; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + function o() { + this.handlers = []; + } + o.prototype.use = function (e, t) { + return this.handlers.push({ + fulfilled: e, + rejected: t + }), this.handlers.length - 1; + }, o.prototype.eject = function (e) { + this.handlers[e] && (this.handlers[e] = null); + }, o.prototype.forEach = function (e) { + r.forEach(this.handlers, function (t) { + null !== t && e(t); + }); + }, e.exports = o; + }, + function (e, t, n) { + 'use strict'; + var r = n(7), o = n(132), i = n(73), s = n(74); + function a(e) { + e.cancelToken && e.cancelToken.throwIfRequested(); + } + e.exports = function (e) { + return a(e), e.headers = e.headers || {}, e.data = o(e.data, e.headers, e.transformRequest), e.headers = r.merge(e.headers.common || {}, e.headers[e.method] || {}, e.headers), r.forEach([ + 'delete', + 'get', + 'head', + 'post', + 'put', + 'patch', + 'common' + ], function (t) { + delete e.headers[t]; + }), (e.adapter || s.adapter)(e).then(function (t) { + return a(e), t.data = o(t.data, t.headers, e.transformResponse), t; + }, function (t) { + return i(t) || (a(e), t && t.response && (t.response.data = o(t.response.data, t.response.headers, e.transformResponse))), Promise.reject(t); + }); + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + e.exports = function (e, t, n) { + return r.forEach(n, function (n) { + e = n(e, t); + }), e; + }; + }, + function (e, t) { + var n, r, o = e.exports = {}; + function i() { + throw new Error('setTimeout has not been defined'); + } + function s() { + throw new Error('clearTimeout has not been defined'); + } + function a(e) { + if (n === setTimeout) + return setTimeout(e, 0); + if ((n === i || !n) && setTimeout) + return n = setTimeout, setTimeout(e, 0); + try { + return n(e, 0); + } catch (t) { + try { + return n.call(null, e, 0); + } catch (t) { + return n.call(this, e, 0); + } + } + } + !function () { + try { + n = 'function' === typeof setTimeout ? setTimeout : i; + } catch (e) { + n = i; + } + try { + r = 'function' === typeof clearTimeout ? clearTimeout : s; + } catch (e) { + r = s; + } + }(); + var c, u = [], p = !1, l = -1; + function d() { + p && c && (p = !1, c.length ? u = c.concat(u) : l = -1, u.length && f()); + } + function f() { + if (!p) { + var e = a(d); + p = !0; + for (var t = u.length; t;) { + for (c = u, u = []; ++l < t;) + c && c[l].run(); + l = -1, t = u.length; + } + c = null, p = !1, function (e) { + if (r === clearTimeout) + return clearTimeout(e); + if ((r === s || !r) && clearTimeout) + return r = clearTimeout, clearTimeout(e); + try { + r(e); + } catch (t) { + try { + return r.call(null, e); + } catch (t) { + return r.call(this, e); + } + } + }(e); + } + } + function h(e, t) { + this.fun = e, this.array = t; + } + function y() { + } + o.nextTick = function (e) { + var t = new Array(arguments.length - 1); + if (arguments.length > 1) + for (var n = 1; n < arguments.length; n++) + t[n - 1] = arguments[n]; + u.push(new h(e, t)), 1 !== u.length || p || a(f); + }, h.prototype.run = function () { + this.fun.apply(null, this.array); + }, o.title = 'browser', o.browser = !0, o.env = {}, o.argv = [], o.version = '', o.versions = {}, o.on = y, o.addListener = y, o.once = y, o.off = y, o.removeListener = y, o.removeAllListeners = y, o.emit = y, o.prependListener = y, o.prependOnceListener = y, o.listeners = function (e) { + return []; + }, o.binding = function (e) { + throw new Error('process.binding is not supported'); + }, o.cwd = function () { + return '/'; + }, o.chdir = function (e) { + throw new Error('process.chdir is not supported'); + }, o.umask = function () { + return 0; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + e.exports = function (e, t) { + r.forEach(e, function (n, r) { + r !== t && r.toUpperCase() === t.toUpperCase() && (e[t] = n, delete e[r]); + }); + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(76); + e.exports = function (e, t, n) { + var o = n.config.validateStatus; + !o || o(n.status) ? e(n) : t(r('Request failed with status code ' + n.status, n.config, null, n.request, n)); + }; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e, t, n, r, o) { + return e.config = t, n && (e.code = n), e.request = r, e.response = o, e.isAxiosError = !0, e.toJSON = function () { + return { + message: this.message, + name: this.name, + description: this.description, + number: this.number, + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + config: this.config, + code: this.code + }; + }, e; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(138), o = n(139); + e.exports = function (e, t) { + return e && !r(t) ? o(e, t) : t; + }; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e) { + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e); + }; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e, t) { + return t ? e.replace(/\/+$/, '') + '/' + t.replace(/^\/+/, '') : e; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7), o = [ + 'age', + 'authorization', + 'content-length', + 'content-type', + 'etag', + 'expires', + 'from', + 'host', + 'if-modified-since', + 'if-unmodified-since', + 'last-modified', + 'location', + 'max-forwards', + 'proxy-authorization', + 'referer', + 'retry-after', + 'user-agent' + ]; + e.exports = function (e) { + var t, n, i, s = {}; + return e ? (r.forEach(e.split('\n'), function (e) { + if (i = e.indexOf(':'), t = r.trim(e.substr(0, i)).toLowerCase(), n = r.trim(e.substr(i + 1)), t) { + if (s[t] && o.indexOf(t) >= 0) + return; + s[t] = 'set-cookie' === t ? (s[t] ? s[t] : []).concat([n]) : s[t] ? s[t] + ', ' + n : n; + } + }), s) : s; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + e.exports = r.isStandardBrowserEnv() ? function () { + var e, t = /(msie|trident)/i.test(navigator.userAgent), n = document.createElement('a'); + function o(e) { + var r = e; + return t && (n.setAttribute('href', r), r = n.href), n.setAttribute('href', r), { + href: n.href, + protocol: n.protocol ? n.protocol.replace(/:$/, '') : '', + host: n.host, + search: n.search ? n.search.replace(/^\?/, '') : '', + hash: n.hash ? n.hash.replace(/^#/, '') : '', + hostname: n.hostname, + port: n.port, + pathname: '/' === n.pathname.charAt(0) ? n.pathname : '/' + n.pathname + }; + } + return e = o(window.location.href), function (t) { + var n = r.isString(t) ? o(t) : t; + return n.protocol === e.protocol && n.host === e.host; + }; + }() : function () { + return !0; + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(7); + e.exports = r.isStandardBrowserEnv() ? { + write: function (e, t, n, o, i, s) { + var a = []; + a.push(e + '=' + encodeURIComponent(t)), r.isNumber(n) && a.push('expires=' + new Date(n).toGMTString()), r.isString(o) && a.push('path=' + o), r.isString(i) && a.push('domain=' + i), !0 === s && a.push('secure'), document.cookie = a.join('; '); + }, + read: function (e) { + var t = document.cookie.match(new RegExp('(^|;\\s*)(' + e + ')=([^;]*)')); + return t ? decodeURIComponent(t[3]) : null; + }, + remove: function (e) { + this.write(e, '', Date.now() - 86400000); + } + } : { + write: function () { + }, + read: function () { + return null; + }, + remove: function () { + } + }; + }, + function (e, t, n) { + 'use strict'; + var r = n(78); + function o(e) { + if ('function' !== typeof e) + throw new TypeError('executor must be a function.'); + var t; + this.promise = new Promise(function (e) { + t = e; + }); + var n = this; + e(function (e) { + n.reason || (n.reason = new r(e), t(n.reason)); + }); + } + o.prototype.throwIfRequested = function () { + if (this.reason) + throw this.reason; + }, o.source = function () { + var e; + return { + token: new o(function (t) { + e = t; + }), + cancel: e + }; + }, e.exports = o; + }, + function (e, t, n) { + 'use strict'; + e.exports = function (e) { + return function (t) { + return e.apply(null, t); + }; + }; + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function (e, t, n) { + 'use strict'; + function r(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function o(e, t) { + var n = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(e); + t && (r = r.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), n.push.apply(n, r); + } + return n; + } + function i(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}; + t % 2 ? o(Object(n), !0).forEach(function (t) { + r(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : o(Object(n)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); + }); + } + return e; + } + n.r(t), n.d(t, 'qcCmpApi', function () { + return St; + }), n.d(t, 'uspApi', function () { + return It; + }); + var s = n(0), a = n.n(s); + function c(e, t, n, r, o, i, s) { + try { + var a = e[i](s), c = a.value; + } catch (u) { + return void n(u); + } + a.done ? t(c) : Promise.resolve(c).then(r, o); + } + function u(e) { + return function () { + var t = this, n = arguments; + return new Promise(function (r, o) { + var i = e.apply(t, n); + function s(e) { + c(i, r, o, s, a, 'next', e); + } + function a(e) { + c(i, r, o, s, a, 'throw', e); + } + s(void 0); + }); + }; + } + function p(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function l(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + function d(e, t, n) { + return t && l(e.prototype, t), n && l(e, n), e; + } + var f, h, y, v, g = n(86); + n(66), n(67), n(68); + !function (e) { + e[e.TOP_LEFT = 1] = 'TOP_LEFT', e[e.TOP_RIGHT = 2] = 'TOP_RIGHT', e[e.BOTTOM_RIGHT = 3] = 'BOTTOM_RIGHT', e[e.BOTTOM_LEFT = 4] = 'BOTTOM_LEFT'; + }(f || (f = {})), function (e) { + e.YES = 'Y', e.NOT = 'N'; + }(h || (h = {})), function (e) { + e.GLOBAL = 'global', e.SERVICE = 'service', e.GLOBAL_GROUP = 'global group', e.SERVICE_GROUP = 'service group'; + }(y || (y = {})), function (e) { + e.GDPR = 'GDPR', e.USP = 'USP'; + }(v || (v = {})); + var m = { hasCookie: !1 }, b = function e() { + p(this, e), this.vendorConsents = i({}, m), this.purposesConsents = i({}, m), this.specialFeatures = i({}, m), this.vendorLegitimateInterest = i({}, m), this.legitimatePurposesConsents = i({}, m), this.nonIabConsents = i({}, m), this.googleConsents = i({}, m), this.consentScreen = 0, this.allConsents = !1; + }, C = (n(69), { + uspVersion: 1, + uspJurisdiction: [], + uspLspact: h.NOT, + uspPrivacyPolicyLink: '', + uspDeleteDataLink: '', + uspAccessDataLink: '', + cookieDomain: window.location.hostname, + suppressCcpaLinks: !0 + }), _ = { + defaultToggleValue: 'off', + displayUi: 'always', + displayPersistentConsentLink: !0, + hashCode: '', + groupSitesUrl: '', + initScreenRejectButtonShowing: !0, + initScreenBodyTextOption: 1, + lang_: 'en', + nonconsentDisplayFrequency: 1, + persistentConsentLinkLocation: f.BOTTOM_RIGHT, + publisherLogo: '', + publisherName: '', + stacks: [], + publisherFeaturesIds: [], + publisherSpecialFeaturesIds: [], + publisherSpecialPurposesIds: [], + publisherPurposeIds: [], + publisherPurposeLegitimateInterestIds: [], + publisherVendorListUrl: '', + publisherCountryCode: 'GB', + vendorPurposeIds: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + vendorPurposeLegitimateInterestIds: [ + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ], + vendorSpecialFeaturesIds: [ + 1, + 2 + ], + vendorSpecialPurposesIds: [ + 1, + 2 + ], + vendorFeaturesIds: [ + 1, + 2, + 3 + ], + rejectConsentRedirectUrl: '', + softOptInEnabled: !1, + uiLayout: 'popup', + vendorListUpdateFreq: 30, + consentScopeGroupURL: '', + cookieDomain: window.location.hostname, + cookiePath: '/', + thirdPartyStorageType: 'iframe', + showSummaryView: !0, + googleEnabled: !1, + consentOnSafari: !1, + isAMP: !1, + publisherConsentRestrictionIds: [], + publisherLIRestrictionIds: [] + }, E = { + initScreenCustomLinks: [], + linksTitle: 'Additional Links', + nonIabVendorsLabel: 'Non-IAB Vendors' + }, S = { + uspDnsTitle: 'Do Not Sell My Personal Information', + uspDnsText: [ + '

When you visit this website, we collect personal information such as IP addresses, cookie identifiers and other pseudonymous identifiers. This information may be used to personalize content based on your interests, run and optimize advertising campaigns tailored to you, measure the performance of ads and content, and derive insights about the audiences who engage with ads and content. This information may also be disclosed by us to third parties on the IAB\u2019s List of Downstream Participants that may further disclose it to other third parties. Using personal information as described above is an integral part of how we operate our website, make revenue to support our staff, and generate relevant content for our audience. You can learn more about our data collection and use practices in our Privacy Policy.

', + '

If you wish to opt out of the disclosure of your personal information to third parties by us, please use the below opt out and confirm your selection. Please note that after your opt out request is processed, you may continue seeing interest-based ads based on personal Information utilized by us or personal information disclosed to third parties prior to your opt out. You may separately opt out of the further disclosure of your personal information by third parties on the IAB\u2019s List of Downstream Participants.

' + ], + uspDoNotSellToggleText: 'I want to make a "Do Not Sell My Personal Information" request. Note: this action will make it harder to us to tailor content for you.', + uspPrivacyPolicyLinkText: 'Privacy Policy', + uspDeleteDataLinkText: 'Data Deletion', + uspAccessDataLinkText: 'Data Access', + uspAcceptButton: 'CONFIRM' + }, I = { + initScreenTitle: 'We value your privacy', + agreeButton: 'AGREE', + initScreenRejectButton: 'DISAGREE', + initScreenSettingsButton: 'MORE OPTIONS', + summaryScreenBodyNoRejectService: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy.\n' + ], + summaryScreenBodyNoRejectGlobal: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply across the web. You can change your preferences at any time by returning to this site or visit our privacy policy.' + ], + summaryScreenBodyNoRejectGroup: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites [hyperlinked to domain where all the properties are listed for this group configuration].You can change your preferences at any time by returning to this site or visit our privacy policy.' + ], + summaryScreenBodyRejectService: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy.' + ], + summaryScreenBodyRejectGlobal: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning.You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply across the web.You can change your preferences at any time by returning to this site or visit our privacy policy.' + ], + summaryScreenBodyRejectGroup: [ + 'We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.', + ' With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites [links to domain where all the properties are listed for this group configuration]. You can change your preferences at any time by returning to this site or visit our privacy policy.' + ], + initScreenBodyGlobal: 'We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information to change your preferences before consenting. Your preferences will apply across the web. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.', + initScreenBodyService: 'We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to this website only. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.', + initScreenBodyGroup: 'We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to a group of websites [links to domain where all the properties are listed for this group configuration]. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.', + specialPurposesAndFeatures: 'Special Purposes and Features', + saveAndExitButton: 'SAVE & EXIT', + purposeScreenVendorLink: 'PARTNERS', + legitimateInterestLink: 'LEGITIMATE INTEREST ', + specialPurposesLabel: 'Special Purposes', + specialFeaturesLabel: 'Special Features', + featuresLabel: 'Features', + back: 'Back', + onLabel: 'ON', + offLabel: 'OFF', + multiLabel: 'MULTI', + legalDescription: 'Legal Description', + showPartners: 'Show Partners', + hidePartners: 'Hide Partners', + vendorScreenBody: 'Review and set your consent preferences for each partner below. Expand each partner list item for more information to help make your choice. Some personal data is processed without your consent, but you have the right to object.', + privacyPolicyLabel: 'Privacy Policy', + descriptionLabel: 'Vendor Description', + legitimateScreenBody: 'Review and object to processing of personal data without your consent on the basis of a legitimate interest for each purpose and by each partner below. Expand each purpose or partner list item for more information to help make your choice. To object to the special purposes of ensuring security, preventing fraud, and debugging, and technically delivering ads or content click on a partner\'s privacy policy link.', + legitimateInterestPurposesLabel: 'Legitimate Interest Purpose(s)', + legitimateInterestVendorLabel: 'Legitimate Interest Vendors', + legitimateScreenObject: 'OBJECT (translation hint: verb to object)', + legitimateScreenObjected: 'OBJECTED', + legitimateScreenAccept: 'REMOVE OBJECTION', + objectAllButton: 'OBJECT ALL', + persistentConsentLinkLabel: 'Privacy', + nonIabVendorsNotice: 'Vendors who do not participate in the IAB Europe Transparency and Consent Framework and do not adhere to its policies or technical specifications', + googlePartners: 'Google Partners', + cookieMaxAgeLabel: 'Max cookie age', + secondsLabel: 'seconds', + daysLabel: 'days', + storageDisclosureLabel: 'Cookie disclosure' + }, L = { + nonIabVendorListUrl: '', + vendorBlacklist: [], + vendorWhitelist: [], + googleWhitelist: [1] + }, P = { + uxBackgroundColor: '#fff', + uxPrimaryButtonColor: '#206DC5', + uxPrimaryButtonTextColor: '#fff', + uxSecondaryButtonColor: '#fff', + uxSecondaryButtonTextColor: '#206DC5', + uxToogleActiveColor: '#206DC5', + uxLinkColor: '#206DC5', + uxFontColor: '#141e23' + }, w = parseInt(''.concat('32')), A = Number.isNaN(w) ? 1 : w, k = 'CMPList', O = 'euconsent-v2', T = 'noniabvendorconsent', V = 'eupubconsent', x = '_cmpRepromptHash', R = 'usprivacy', U = 'addtl_consent', D = n(70), M = { + quantcastAccountId: { + type: 'string', + values: '' + }, + consentScope: { + type: 'string', + values: [ + y.GLOBAL, + y.SERVICE, + y.GLOBAL_GROUP, + y.SERVICE_GROUP + ] + }, + defaultToggleValue: { + type: 'string', + values: [ + 'on', + 'off' + ] + }, + displayUi: { + type: 'string', + values: [ + 'never', + 'inEU', + 'always' + ] + }, + displayPersistentConsentLink: { + type: 'boolean', + values: '' + }, + groupSitesUrl: { + type: 'string', + values: '' + }, + hashCode: { + type: 'string', + values: '' + }, + initScreenRejectButtonShowing: { + type: 'boolean', + values: '' + }, + isAMP: { + type: 'boolean', + values: '' + }, + initScreenBodyTextOption: { + type: 'number', + values: '' + }, + lang_: { + type: 'string', + values: D + }, + nonconsentDisplayFrequency: { + type: 'number', + values: '' + }, + persistentConsentLinkLocation: { + type: 'number', + values: [ + 1, + 2, + 3, + 4 + ] + }, + publisherLogo: { + type: 'string', + values: '' + }, + publisherName: { + type: 'string', + values: '' + }, + publisherFeaturesIds: { + type: 'array', + values: [ + 1, + 2, + 3 + ] + }, + publisherSpecialFeaturesIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2 + ] + }, + publisherSpecialPurposesIds: { + type: 'array', + values: [ + 1, + 2 + ] + }, + publisherPurposeIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + }, + publisherPurposeLegitimateInterestIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + }, + publisherVendorListUrl: { + type: 'string', + values: '' + }, + publisherCountryCode: { + type: 'string', + values: [ + 'AF', + 'AX', + 'AL', + 'DZ', + 'AS', + 'AD', + 'AO', + 'AI', + 'AQ', + 'AG', + 'AR', + 'AM', + 'AW', + 'AU', + 'AT', + 'AZ', + 'BS', + 'BH', + 'BD', + 'BB', + 'BY', + 'BE', + 'BZ', + 'BJ', + 'BM', + 'BT', + 'BO', + 'BA', + 'BW', + 'BV', + 'BR', + 'IO', + 'BN', + 'BG', + 'BF', + 'BI', + 'KH', + 'CM', + 'CA', + 'CV', + 'KY', + 'CF', + 'TD', + 'CL', + 'CN', + 'CX', + 'CC', + 'CO', + 'KM', + 'CG', + 'CD', + 'CK', + 'CR', + 'CI', + 'HR', + 'CU', + 'CY', + 'CZ', + 'DK', + 'DJ', + 'DM', + 'DO', + 'EC', + 'EG', + 'SV', + 'GQ', + 'ER', + 'EE', + 'ET', + 'FK', + 'FO', + 'FJ', + 'FI', + 'FR', + 'GF', + 'PF', + 'TF', + 'GA', + 'GM', + 'GE', + 'DE', + 'GH', + 'GI', + 'GR', + 'GL', + 'GD', + 'GP', + 'GU', + 'GT', + 'GG', + 'GN', + 'GW', + 'GY', + 'HT', + 'HM', + 'VA', + 'HN', + 'HK', + 'HU', + 'IS', + 'IN', + 'ID', + 'IR', + 'IQ', + 'IE', + 'IM', + 'IL', + 'IT', + 'JM', + 'JP', + 'JE', + 'JO', + 'KZ', + 'KE', + 'KI', + 'KR', + 'KW', + 'KG', + 'LA', + 'LV', + 'LB', + 'LS', + 'LR', + 'LY', + 'LI', + 'LT', + 'LU', + 'MO', + 'MK', + 'MG', + 'MW', + 'MY', + 'MV', + 'ML', + 'MT', + 'MH', + 'MQ', + 'MR', + 'MU', + 'YT', + 'MX', + 'FM', + 'MD', + 'MC', + 'MN', + 'ME', + 'MS', + 'MA', + 'MZ', + 'MM', + 'NA', + 'NR', + 'NP', + 'NL', + 'AN', + 'NC', + 'NZ', + 'NI', + 'NE', + 'NG', + 'NU', + 'NF', + 'MP', + 'NO', + 'OM', + 'PK', + 'PW', + 'PS', + 'PA', + 'PG', + 'PY', + 'PE', + 'PH', + 'PN', + 'PL', + 'PT', + 'PR', + 'QA', + 'RE', + 'RO', + 'RU', + 'RW', + 'BL', + 'SH', + 'KN', + 'LC', + 'MF', + 'PM', + 'VC', + 'WS', + 'SM', + 'ST', + 'SA', + 'SN', + 'RS', + 'SC', + 'SL', + 'SG', + 'SK', + 'SI', + 'SB', + 'SO', + 'ZA', + 'GS', + 'ES', + 'LK', + 'SD', + 'SR', + 'SJ', + 'SZ', + 'SE', + 'CH', + 'SY', + 'TW', + 'TJ', + 'TZ', + 'TH', + 'TL', + 'TG', + 'TK', + 'TO', + 'TT', + 'TN', + 'TR', + 'TM', + 'TC', + 'TV', + 'UG', + 'UA', + 'AE', + 'GB', + 'US', + 'UM', + 'UY', + 'UZ', + 'VU', + 'VE', + 'VN', + 'VG', + 'VI', + 'WF', + 'EH', + 'YE', + 'ZM', + 'ZW' + ] + }, + vendorPurposeIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + }, + vendorPurposeLegitimateInterestIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + }, + vendorSpecialFeaturesIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2 + ] + }, + vendorSpecialPurposesIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2 + ] + }, + vendorFeaturesIds: { + type: 'array', + canBeEmpty: !0, + values: [ + 1, + 2, + 3 + ] + }, + rejectConsentRedirectUrl: { + type: 'string', + values: '' + }, + stacks: { + type: 'array', + values: [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42 + ] + }, + softOptInEnabled: { + type: 'boolean', + values: '' + }, + uiLayout: { + type: 'string', + values: [ + 'popup', + 'banner' + ] + }, + vendorListUpdateFreq: { + type: 'number', + values: '' + }, + consentScopeGroupURL: { + type: 'string', + values: '' + }, + cookieDomain: { + type: 'string', + values: '' + }, + cookiePath: { + type: 'string', + values: '' + }, + thirdPartyStorageType: { + type: 'string', + values: [ + 'iframe', + 'api' + ] + }, + showSummaryView: { + type: 'boolean', + values: '' + }, + privacyMode: { + type: 'array', + values: [ + v.GDPR, + v.USP + ] + }, + uspVersion: { + type: 'number', + values: [1] + }, + uspJurisdiction: { + type: 'array', + values: [ + 'US', + 'CA' + ] + }, + uspLspact: { + type: 'string', + values: [ + h.YES, + h.NOT + ] + }, + uspPrivacyPolicyLink: { + type: 'string', + values: '' + }, + uspDeleteDataLink: { + type: 'string', + values: '' + }, + uspAccessDataLink: { + type: 'string', + values: '' + }, + suppressCcpaLinks: { + type: 'boolean', + values: '' + }, + googleEnabled: { + type: 'boolean', + values: '' + }, + publisherConsentRestrictionIds: { + type: 'array', + values: '', + arrayType: 'number' + }, + publisherLIRestrictionIds: { + type: 'array', + values: '', + arrayType: 'number' + }, + consentOnSafari: { + type: 'boolean', + values: '' + } + }, B = { + acceptAll: { type: 'string' }, + initScreenRejectButton: { type: 'string' }, + initScreenSettingsButton: { type: 'string' }, + initScreenTitle: { type: 'string' }, + persistentConsentLinkLabel: { type: 'string' }, + customInitScreenBodyText: { type: 'string' }, + customSecondScreenBodyText: { type: 'string' }, + customVendorScreenBodyText: { type: 'string' }, + customLegitimateScreenBodyText: { type: 'string' }, + summaryScreenBodyNoRejectService: { + type: 'array', + values: '' + }, + summaryScreenBodyNoRejectGlobal: { + type: 'array', + values: '' + }, + summaryScreenBodyNoRejectGroup: { + type: 'array', + values: '' + }, + summaryScreenBodyRejectService: { + type: 'array', + values: '' + }, + summaryScreenBodyRejectGlobal: { + type: 'array', + values: '' + }, + summaryScreenBodyRejectGroup: { + type: 'array', + values: '' + }, + groupOfSitesLabel: { type: 'string' }, + saveAndExitButton: { type: 'string' }, + agreeToSelectedButton: { type: 'string' }, + agreeButton: { type: 'string' }, + agreeAllButton: { type: 'string' }, + rejectAll: { type: 'string' }, + objectAllButton: { type: 'string' } + }, F = { + nonIabVendorListUrl: { + type: 'string', + values: '' + }, + vendorWhitelist: { + type: 'array', + values: '', + arrayType: 'number' + }, + vendorBlacklist: { + type: 'array', + values: '', + arrayType: 'number' + }, + googleWhitelist: { + type: 'array', + values: '', + arrayType: 'number' + } + }, N = { + initScreenCustomLinks: { + type: 'array', + values: '', + arrayType: 'object' + }, + linksTitle: { type: 'string' }, + nonIabVendorsLabel: { type: 'string' }, + uspDnsTitle: { type: 'string' }, + uspDnsText: { + type: 'array', + values: '', + arrayType: 'string' + }, + uspDoNotSellToggleText: { type: 'string' }, + uspPrivacyPolicyLinkText: { type: 'string' }, + uspDeleteDataLinkText: { type: 'string' }, + uspAccessDataLinkText: { type: 'string' }, + uspAcceptButton: { type: 'string' } + }, j = { + uxBackgroundColor: { + type: 'string', + values: '' + }, + uxPrimaryButtonColor: { + type: 'string', + values: '' + }, + uxPrimaryButtonTextColor: { + type: 'string', + values: '' + }, + uxSecondaryButtonColor: { + type: 'string', + values: '' + }, + uxSecondaryButtonTextColor: { + type: 'string', + values: '' + }, + uxToogleActiveColor: { + type: 'string', + values: '' + }, + uxLinkColor: { + type: 'string', + values: '' + }, + uxFontColor: { + type: 'string', + values: '' + } + }, G = { + nonIabVendorList: { + type: 'array', + values: '', + arrayType: 'object' + }, + updateAt: { + type: 'string', + values: '' + }, + nonIabVendorsHash: { + type: 'string', + values: '' + } + }, H = function (e, t, n) { + if (t in n) { + var r = e[t], o = n[t].type, i = n[t].values; + return '' !== r && (typeof r === o ? 'number' === o && r < 0 ? (console.warn(''.concat(t, ' must be a valid number')), !1) : '' === i || (!!i.includes(r) || (console.warn(''.concat(t, ' must be a valid value')), !1)) : (console.warn(''.concat(t, ' must be ').concat(o)), !1)); + } + return console.warn(''.concat(t, ' is not a valid config value')), !1; + }, q = function (e, t, n) { + var r = e[t]; + if (Array.isArray(r)) { + if (!r.length) + return !0 === n[t].canBeEmpty && r; + var o = []; + return r.forEach(function (e) { + 'string' === typeof n[t].values ? typeof e === n[t].arrayType ? o.push(e) : console.warn(''.concat(e, ' ').concat('is not a valid value for', ' ').concat(t)) : n[t].values.includes(e) ? o.push(e) : console.warn(''.concat(e, ' ').concat('is not a valid value for', ' ').concat(t)); + }), !!o.length && o; + } + return console.warn(''.concat(t, ' must be an array')), !1; + }, z = function () { + function e(t) { + var n = this; + p(this, e), this._coreConfig = void 0, this._premiumProperties = void 0, this._coreUiLabels = void 0, this._premiumUiLabels = void 0, this._theme = void 0, this._nonIabVendorsInfo = void 0, this._ampData = void 0, this.cleanConfig = void 0, this.checkRequiredValues = function () { + var e = n.cleanConfig.coreConfig; + 'consentScope' in e || (n.cleanConfig.coreConfig.consentScope = y.SERVICE), 'privacyMode' in e || (n.cleanConfig.coreConfig.privacyMode = [v.GDPR]); + }, this.validateConfig = function (e) { + var t = {}, r = {}, o = {}, i = {}, s = {}, a = void 0, c = void 0; + return e.coreConfig && (t = n.filterConfig(e.coreConfig, M)), e.coreUiLabels && (r = n.filterLabels(e.coreUiLabels, B)), e.premiumProperties && (o = n.filterConfig(e.premiumProperties, F)), e.premiumUiLabels && (i = n.filterLabels(e.premiumUiLabels, N)), e.theme && (s = n.filterConfig(e.theme, j)), e.nonIabVendorsInfo && (a = n.filterConfig(e.nonIabVendorsInfo, G)), e.ampData && (c = e.ampData), { + coreConfig: t, + coreUiLabels: r, + premiumProperties: o, + premiumUiLabels: i, + theme: s, + nonIabVendorsInfo: a, + ampData: c + }; + }, this.filterConfig = function (e, t) { + var n = {}; + for (var r in e) + if (r in t) + if ('array' === t[r].type) { + var o = q(e, r, t); + o && (n[r] = o); + } else + H(e, r, t) && (n[r] = e[r]); + return n; + }, this.filterLabels = function (e, t) { + var n = {}; + for (var r in e) + if (r in t) + if ('string' === t[r].type) + '' !== e[r] ? n[r] = e[r] : console.warn(''.concat(r, ' cannot be empty')); + else { + var o = q(e, r, t); + o && (n[r] = o); + } + return n; + }, this.getCustomCoreUiLabels = function () { + return n.cleanConfig.coreUiLabels; + }, this.initializeConfig = function () { + Object.keys(n.cleanConfig).forEach(function (e) { + n[e] && (n[e] = i(i({}, n[e]), n.cleanConfig[e])); + }); + }, this.cleanConfig = this.validateConfig(t), this.checkRequiredValues(); + var r = this.cleanConfig, o = r.coreConfig, s = o.privacyMode, a = o.consentScope, c = o.quantcastAccountId, u = r.nonIabVendorsInfo, l = r.ampData; + s.includes(v.GDPR) && s.includes(v.USP) ? (this._coreConfig = i(i({ + quantcastAccountId: c, + consentScope: a, + privacyMode: s + }, _), C), this._premiumUiLabels = i(i({}, S), E), this._premiumProperties = i({}, L), this._coreUiLabels = i({}, I), this._theme = i({}, P), u && (this._nonIabVendorsInfo = u)) : s.includes('GDPR') ? (this._coreConfig = i({ + quantcastAccountId: c, + consentScope: a, + privacyMode: s + }, _), this._premiumUiLabels = i({}, E), this._premiumProperties = i({}, L), this._coreUiLabels = i({}, I), this._theme = i({}, P), u && (this._nonIabVendorsInfo = u)) : (this._coreConfig = i({ + quantcastAccountId: c, + consentScope: a, + privacyMode: s + }, C), this._premiumUiLabels = i({}, S), this._premiumProperties = {}, this._coreUiLabels = {}, this._theme = i({}, P)), l && (this._ampData = l); + } + return d(e, [ + { + key: 'getCustomPremiumUiLabels', + value: function () { + return this.cleanConfig.premiumUiLabels; + } + }, + { + key: 'coreConfig', + get: function () { + return this._coreConfig; + }, + set: function (e) { + var t = this, n = [ + 'publisherLogo', + 'publisherName', + 'publisherFeaturesIds', + 'publisherSpecialFeaturesIds', + 'publisherSpecialPurposesIds', + 'publisherPurposeIds', + 'publisherPurposeLegitimateInterestIds', + 'publisherVendorListUrl', + 'publisherVendorListUrl', + 'publisherCountryCode', + 'vendorPurposeIds', + 'vendorPurposeLegitimateInterestIds', + 'vendorSpecialFeaturesIds', + 'vendorSpecialPurposesIds', + 'vendorFeaturesIds', + 'rejectConsentRedirectUrl', + 'stacks' + ], r = [ + 'nonconsentDisplayFrequency', + 'vendorListUpdateFreq' + ]; + Object.keys(e).forEach(function (o) { + if (e[o] !== t.coreConfig[o]) { + if (-1 !== n.indexOf(o) && ('' === e[o] || e[o] === [])) + throw new Error(''.concat(o, ' cannot be empty')); + if (r.indexOf(o) && e[o] < 0) + throw new Error(''.concat(o, ' cannot be a negative number')); + } + }), this._coreConfig = e; + } + }, + { + key: 'premiumProperties', + get: function () { + return this._premiumProperties; + }, + set: function (e) { + var t = this; + Object.keys(e).forEach(function (n) { + if (t.premiumProperties[n] !== e[n] && ('' === e[n] || e[n] === [])) + throw new Error(''.concat(n, ' cannot be empty')); + }), this._premiumProperties = e; + } + }, + { + key: 'coreUiLabels', + get: function () { + return this._coreUiLabels; + }, + set: function (e) { + var t = this; + Object.keys(e).forEach(function (n) { + if (t.coreUiLabels[n] !== e[n] && '' === e[n]) + throw new Error(''.concat(n, ' cannot be empty')); + }), this._coreUiLabels = e; + } + }, + { + key: 'theme', + get: function () { + return this._theme; + }, + set: function (e) { + var t = this; + Object.keys(e).forEach(function (n) { + if (t.theme[n] !== e[n] && '' === e[n]) + throw new Error(''.concat(n, ' cannot be empty')); + }), this._theme = e; + } + }, + { + key: 'nonIabVendorsInfo', + get: function () { + return this._nonIabVendorsInfo; + }, + set: function (e) { + this._nonIabVendorsInfo = e; + } + }, + { + key: 'ampData', + get: function () { + return this._ampData; + }, + set: function (e) { + this._ampData = e; + } + }, + { + key: 'premiumUiLabels', + get: function () { + return this._premiumUiLabels; + }, + set: function (e) { + var t = this; + Object.keys(e).forEach(function (n) { + if (t.premiumUiLabels[n] !== e[n] && !e[n].length) + throw new Error(''.concat(n, ' cannot be empty')); + }), this._premiumUiLabels = e; + } + } + ]), e; + }(), Y = n(20), W = n(33), J = n(70), K = function () { + function e() { + var t = this; + p(this, e), this.__tcfapiui = void 0, this.__tcfapiui = function (e) { + for (var n = t.__tcfapiui.a = t.__tcfapiui.a || [], r = window.document, o = arguments.length, i = new Array(o > 1 ? o - 1 : 0), s = 1; s < o; s++) + i[s - 1] = arguments[s]; + if (n.push([e].concat(i)), !r.getElementById('__tcfapiuiscript')) { + var a = document.createElement('script'), c = (Fe.coreConfig.lang_ || 'en').toLowerCase(); + J.includes(c) || (c = 'en'); + var u = 'https://quantcast.mgr.consensu.org/tcfv2/32/cmp2ui.js'; + u = u.replace('.js', '-'.concat(c, '.js')), a.type = 'text/javascript', a.id = '__tcfapiuiscript', a.src = u, r.head.appendChild(a); + } + }, window.__tcfapiui || (window.__tcfapiui = this.__tcfapiui); + } + return d(e, [{ + key: 'displayUi', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r, o, i, s, c, u, p = arguments; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (r = p.length > 1 && void 0 !== p[1] ? p[1] : 1, o = p.length > 2 && void 0 !== p[2] && p[2], i = null === (n = Fe.coreConfig.privacyMode) || void 0 === n ? void 0 : n.includes(t), Be.updateApiVisible(t, i), i) { + e.next = 7; + break; + } + return console.warn('attempt to show disabled CMP UI regulation='.concat(t)), e.abrupt('return'); + case 7: + if (!(s = 'GDPR' === t) || We) { + e.next = 11; + break; + } + return e.next = 11, Je(!0); + case 11: + if (!s) { + e.next = 17; + break; + } + return e.next = 14, Be.loadGVL(); + case 14: + e.t0 = e.sent, e.next = 18; + break; + case 17: + e.t0 = void 0; + case 18: + if (c = e.t0, e.t1 = t, e.t2 = r, e.t3 = o, e.t4 = Fe, e.t5 = c, !s) { + e.next = 30; + break; + } + return e.next = 27, Be.getConsents(); + case 27: + e.t6 = e.sent, e.next = 31; + break; + case 30: + e.t6 = {}; + case 31: + e.t7 = e.t6, e.t8 = s ? He.data.data.nonIabVendorList : {}, e.t9 = s ? Ke.data : {}, u = { + regulation: e.t1, + page: e.t2, + isMandatory: e.t3, + config: e.t4, + gvl: e.t5, + consentInfo: e.t7, + nonIabVendorList: e.t8, + googleData: e.t9 + }, window.__tcfapiui('displayUi', u); + case 36: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + }]), e; + }(), Q = n(87), Z = n.n(Q).a.create({ xsrfCookieName: null }), X = function (e) { + Object({ + NODE_ENV: 'production', + PUBLIC_URL: '', + AMP_FRAME_URL_BASE: 'https://quantcast.mgr.consensu.org/tcfv2/32', + AMP_CHECK_CONSENT_URL: 'https://apis.quantcast.mgr.consensu.org/amp/check-consent', + LOCAL_STATIC_DIR: '', + REACT_APP_LOG_API: 'https://audit-tcfv2.quantcast.mgr.consensu.org', + REACT_APP_GEOIP_API_URL: 'https://apis.quantcast.mgr.consensu.org/geoip', + REACT_APP_CMP_COOKIE_API: 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', + REACT_APP_GOOGLE_ATP_URL: 'https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json', + REACT_APP_VERSION: '32', + REACT_APP_CMPUI_SRC: 'https://quantcast.mgr.consensu.org/tcfv2/32/cmp2ui.js', + REACT_APP_GVL_BASE_URL: 'https://quantcast.mgr.consensu.org/GVL-v2/', + REACT_APP_TRANSLATION_BASE_URL: 'https://www.quantcast.mgr.consensu.org/tcfv2/translations/' + }).REACT_APP_DEBUG && console.log('Debug: ' + e); + }, $ = function () { + function e(t) { + switch (p(this, e), this._isUserInEU = void 0, this._isUserInUS = void 0, this._userSpecificLocation = void 0, this._userSpecificLocation = null, t) { + case 'inUS': + this._isUserInEU = false, this._isUserInUS = false; + break; + case 'inEU': + this._isUserInEU = false, this._isUserInUS = false; + break; + default: + this._isUserInEU = false, this._isUserInUS = false; + } + } + return d(e, [ + { + key: 'checkSpecificLocation', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig.privacyMode, this._userSpecificLocation) { + e.next = 23; + break; + } + if (X('initUspLocation: exact location request'), !t.includes('USP')) { + e.next = 23; + break; + } + if (n = Fe.coreConfig.uspJurisdiction, !this.isUserInUS) { + e.next = 22; + break; + } + if (n.includes('US')) { + e.next = 19; + break; + } + return e.prev = 7, e.next = 10, Z.get('https://apis.quantcast.mgr.consensu.org/geoip'); + case 10: + r = e.sent, this._userSpecificLocation = r.data, e.next = 17; + break; + case 14: + e.prev = 14, e.t0 = e.catch(7), console.log(e.t0); + case 17: + e.next = 20; + break; + case 19: + this._userSpecificLocation = 'US'; + case 20: + e.next = 23; + break; + case 22: + this._userSpecificLocation = 'non-US'; + case 23: + return e.abrupt('return', this._userSpecificLocation); + case 24: + case 'end': + return e.stop(); + } + }, e, this, [[ + 7, + 14 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'isUserInEU', + set: function (e) { + X('this should only be used for testing'), this._isUserInEU = e; + }, + get: function () { + return this._isUserInEU; + } + }, + { + key: 'isUserInUS', + set: function (e) { + X('this should only be used for testing'), this._isUserInUS = e; + }, + get: function () { + return this._isUserInUS; + } + }, + { + key: 'userSpecificLocation', + set: function (e) { + X('this should only be used for testing'), this._userSpecificLocation = e; + }, + get: function () { + return this._userSpecificLocation; + } + } + ]), e; + }(); + function ee(e) { + return function (e, t) { + return te = '', ne(t).dispatch(e), function (e) { + return btoa(function (e) { + for (var t = '', n = 0; n < e.length; n++) + for (var r = e[n], o = 0; o < 4; o++) + t += String.fromCharCode(r >> 8 * o & 255); + return t; + }(function (e) { + var t, n = e.length, r = [ + 1732584193, + -271733879, + -1732584194, + 271733878 + ]; + for (t = 64; t <= e.length; t += 64) + re(r, ue(e.substring(t - 64, t))); + e = e.substring(t - 64); + var o = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + for (t = 0; t < e.length; t++) + o[t >> 2] |= e.charCodeAt(t) << (t % 4 << 3); + if (o[t >> 2] |= 128 << (t % 4 << 3), t > 55) + for (re(r, o), t = 0; t < 16; t++) + o[t] = 0; + return o[14] = 8 * n, re(r, o), r; + }(e))); + }(te); + }(e); + } + var te = ''; + function ne(e, t, n) { + n = n || []; + var r = function (e) { + te += e; + }; + return { + dispatch: function (e) { + var t = typeof e; + return null === e && (t = 'null'), this['_' + t](e); + }, + _object: function (e) { + var t = Object.prototype.toString.call(e), o = /\[object (.*)\]/i.exec(t); + o = (o = o ? o[1] : 'unknown:[' + t + ']').toLowerCase(); + var i; + if ((i = n.indexOf(e)) >= 0) + return this.dispatch('[CIRCULAR:' + i + ']'); + if (n.push(e), 'object' === o || 'function' === o || 'asyncfunction' === o) { + var s = Object.keys(e); + r('object:' + s.length + ':'); + var a = this; + return s.forEach(function (t) { + a.dispatch(t), r(':'), a.dispatch(e[t]), r(','); + }); + } + if (!this['_' + o]) + throw new Error('Unknown object type "' + o + '"'); + this['_' + o](e); + }, + _array: function (e) { + var t = this; + return r('array:' + e.length + ':'), e.forEach(function (e) { + return t.dispatch(e); + }); + }, + _date: function (e) { + return r('date:' + e.toJSON()); + }, + _symbol: function (e) { + return r('symbol:' + e.toString()); + }, + _error: function (e) { + return r('error:' + e.toString()); + }, + _boolean: function (e) { + return r('bool:' + e.toString()); + }, + _string: function (e) { + r('string:' + e.length + ':'), r(e.toString()); + }, + _function: function (e) { + r('fn:'), this.dispatch(e.toString()); + }, + _number: function (e) { + return r('number:' + e.toString()); + }, + _xml: function (e) { + return r('xml:' + e.toString()); + }, + _null: function () { + return r('Null'); + }, + _undefined: function () { + return r('Undefined'); + }, + _regexp: function (e) { + return r('regex:' + e.toString()); + }, + _uint8array: function (e) { + return r('uint8array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _uint8clampedarray: function (e) { + return r('uint8clampedarray:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _int8array: function (e) { + return r('uint8array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _uint16array: function (e) { + return r('uint16array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _int16array: function (e) { + return r('uint16array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _uint32array: function (e) { + return r('uint32array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _int32array: function (e) { + return r('uint32array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _float32array: function (e) { + return r('float32array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _float64array: function (e) { + return r('float64array:'), this.dispatch(Array.prototype.slice.call(e)); + }, + _arraybuffer: function (e) { + return r('arraybuffer:'), this.dispatch(new Uint8Array(e)); + }, + _url: function (e) { + return r('url:' + e.toString()); + }, + _map: function (e) { + r('map:'); + var t = Array.from(e); + return this._array(t); + }, + _set: function (e) { + r('set:'); + var t = Array.from(e); + return this._array(t); + } + }; + } + function re(e, t) { + var n = e[0], r = e[1], o = e[2], i = e[3]; + n = ie(n, r, o, i, t[0], 7, -680876936), i = ie(i, n, r, o, t[1], 12, -389564586), o = ie(o, i, n, r, t[2], 17, 606105819), r = ie(r, o, i, n, t[3], 22, -1044525330), n = ie(n, r, o, i, t[4], 7, -176418897), i = ie(i, n, r, o, t[5], 12, 1200080426), o = ie(o, i, n, r, t[6], 17, -1473231341), r = ie(r, o, i, n, t[7], 22, -45705983), n = ie(n, r, o, i, t[8], 7, 1770035416), i = ie(i, n, r, o, t[9], 12, -1958414417), o = ie(o, i, n, r, t[10], 17, -42063), r = ie(r, o, i, n, t[11], 22, -1990404162), n = ie(n, r, o, i, t[12], 7, 1804603682), i = ie(i, n, r, o, t[13], 12, -40341101), o = ie(o, i, n, r, t[14], 17, -1502002290), n = se(n, r = ie(r, o, i, n, t[15], 22, 1236535329), o, i, t[1], 5, -165796510), i = se(i, n, r, o, t[6], 9, -1069501632), o = se(o, i, n, r, t[11], 14, 643717713), r = se(r, o, i, n, t[0], 20, -373897302), n = se(n, r, o, i, t[5], 5, -701558691), i = se(i, n, r, o, t[10], 9, 38016083), o = se(o, i, n, r, t[15], 14, -660478335), r = se(r, o, i, n, t[4], 20, -405537848), n = se(n, r, o, i, t[9], 5, 568446438), i = se(i, n, r, o, t[14], 9, -1019803690), o = se(o, i, n, r, t[3], 14, -187363961), r = se(r, o, i, n, t[8], 20, 1163531501), n = se(n, r, o, i, t[13], 5, -1444681467), i = se(i, n, r, o, t[2], 9, -51403784), o = se(o, i, n, r, t[7], 14, 1735328473), n = ae(n, r = se(r, o, i, n, t[12], 20, -1926607734), o, i, t[5], 4, -378558), i = ae(i, n, r, o, t[8], 11, -2022574463), o = ae(o, i, n, r, t[11], 16, 1839030562), r = ae(r, o, i, n, t[14], 23, -35309556), n = ae(n, r, o, i, t[1], 4, -1530992060), i = ae(i, n, r, o, t[4], 11, 1272893353), o = ae(o, i, n, r, t[7], 16, -155497632), r = ae(r, o, i, n, t[10], 23, -1094730640), n = ae(n, r, o, i, t[13], 4, 681279174), i = ae(i, n, r, o, t[0], 11, -358537222), o = ae(o, i, n, r, t[3], 16, -722521979), r = ae(r, o, i, n, t[6], 23, 76029189), n = ae(n, r, o, i, t[9], 4, -640364487), i = ae(i, n, r, o, t[12], 11, -421815835), o = ae(o, i, n, r, t[15], 16, 530742520), n = ce(n, r = ae(r, o, i, n, t[2], 23, -995338651), o, i, t[0], 6, -198630844), i = ce(i, n, r, o, t[7], 10, 1126891415), o = ce(o, i, n, r, t[14], 15, -1416354905), r = ce(r, o, i, n, t[5], 21, -57434055), n = ce(n, r, o, i, t[12], 6, 1700485571), i = ce(i, n, r, o, t[3], 10, -1894986606), o = ce(o, i, n, r, t[10], 15, -1051523), r = ce(r, o, i, n, t[1], 21, -2054922799), n = ce(n, r, o, i, t[8], 6, 1873313359), i = ce(i, n, r, o, t[15], 10, -30611744), o = ce(o, i, n, r, t[6], 15, -1560198380), r = ce(r, o, i, n, t[13], 21, 1309151649), n = ce(n, r, o, i, t[4], 6, -145523070), i = ce(i, n, r, o, t[11], 10, -1120210379), o = ce(o, i, n, r, t[2], 15, 718787259), r = ce(r, o, i, n, t[9], 21, -343485551), e[0] = pe(n, e[0]), e[1] = pe(r, e[1]), e[2] = pe(o, e[2]), e[3] = pe(i, e[3]); + } + function oe(e, t, n, r, o, i) { + return t = pe(pe(t, e), pe(r, i)), pe(t << o | t >>> 32 - o, n); + } + function ie(e, t, n, r, o, i, s) { + return oe(t & n | ~t & r, e, t, o, i, s); + } + function se(e, t, n, r, o, i, s) { + return oe(t & r | n & ~r, e, t, o, i, s); + } + function ae(e, t, n, r, o, i, s) { + return oe(t ^ n ^ r, e, t, o, i, s); + } + function ce(e, t, n, r, o, i, s) { + return oe(n ^ (t | ~r), e, t, o, i, s); + } + function ue(e) { + var t, n = []; + for (t = 0; t < 64; t += 4) + n[t >> 2] = e.charCodeAt(t) + (e.charCodeAt(t + 1) << 8) + (e.charCodeAt(t + 2) << 16) + (e.charCodeAt(t + 3) << 24); + return n; + } + function pe(e, t) { + return e + t & 4294967295; + } + var le = function () { + function e() { + p(this, e), this._values = void 0, this._values = { + euconsent: '', + nonIabVendorConsent: '', + nonIabVendorsHash: '', + fetched: !1, + promise: Promise.resolve() + }; + } + return d(e, [{ + key: 'values', + set: function (e) { + this._values = e; + }, + get: function () { + return this._values; + } + }]), e; + }(); + function de(e, t, n, r) { + var o = n && document.getElementById(n); + return o || (o = document.createElement(e), t && (o.className = t), n && (o.id = n), r && r.insertBefore(o, r.firstChild)), o; + } + var fe = function (e) { + var t = e.coreConfig, n = t.publisherFeaturesIds, r = t.publisherSpecialFeaturesIds, o = t.publisherSpecialPurposesIds, i = t.publisherPurposeIds, s = t.publisherPurposeLegitimateInterestIds, a = t.vendorPurposeIds, c = t.vendorPurposeLegitimateInterestIds, u = t.vendorSpecialFeaturesIds, p = t.vendorSpecialPurposesIds, l = t.vendorFeaturesIds, d = [ + n, + r, + o, + i, + s, + a, + c, + u, + p, + l + ], f = (a || []).length; + return d.forEach(function (e) { + var t; + (t = e) && t.sort(function (e, t) { + return e - t; + }); + }), { + purposeIds: (f ? a : i) || [], + purposeLegitimateInterestIds: (f ? c : s) || [], + specialFeaturesIds: (f ? u : r) || [], + specialPurposesIds: (f ? p : o) || [], + featuresIds: (f ? l : n) || [] + }; + }, he = function (e) { + var t, n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], r = ''.concat(e[0], '~'), o = e.match(/\d+/g); + if (o.shift(), n) + return ''.concat(r).concat(null === o || void 0 === o ? void 0 : o.join('.')); + var i = null === o || void 0 === o ? void 0 : o.reduce(function (e, n, r, o) { + if (0 === r) + return t = parseInt(n, 10), e.concat(n); + var i = o[r] ? parseInt(n, 10) + t : null; + return t = i, i ? e.concat('.'.concat(i)) : e; + }, r); + return i; + }; + function ye(e, t) { + return t && 'string' === typeof t ? e(t) : null; + } + var ve, ge, me, be, Ce, _e, Ee, Se, Ie, Le, Pe = function () { + function e() { + p(this, e), this.data = void 0, this._repromptOptionsHash = void 0, this._storedHash = void 0, this.data = new le(), this._repromptOptionsHash = '', this._storedHash = ''; + } + return d(e, [ + { + key: 'shouldReprompt', + value: function () { + var e = this.generateRepromptOptionsHash(), t = !1; + return this._storedHash !== e && (t = !0), t; + } + }, + { + key: 'generateRepromptOptionsHash', + value: function () { + var e = this.data.values, t = e.euconsent, n = e.nonIabVendorConsent, r = e.nonIabVendorsHash, o = Fe.coreConfig, i = o.stacks, s = o.initScreenBodyTextOption, a = Fe.premiumProperties, c = a.vendorWhitelist, u = a.vendorBlacklist, p = fe(Fe), l = p.purposeIds, d = p.purposeLegitimateInterestIds, f = p.specialFeaturesIds, h = p.specialPurposesIds, y = p.featuresIds, v = this.createNewHash([ + i, + l, + d, + f, + h, + y, + c, + u + ]), g = t; + return g = ''.concat(g, '.').concat(s, '.').concat(v), g = n ? ''.concat(g, '.').concat(n) : g, g = r ? ''.concat(g, '.').concat(r) : g, this._repromptOptionsHash = g; + } + }, + { + key: 'createNewHash', + value: function (e) { + return ee(e); + } + }, + { + key: 'setValues', + value: function (e) { + this.data.values = e; + } + }, + { + key: 'getValues', + value: function () { + return this.data.values; + } + }, + { + key: 'storedHash', + set: function (e) { + this._storedHash = e; + }, + get: function () { + return this._storedHash; + } + } + ]), e; + }(), we = n(21), Ae = function () { + function e() { + p(this, e), this.LOWERCASE_START = 97, this.PAD_ZEROS = '00000000000000000000000000000000000000000000000000', this.COOKIE_MAX_AGE = 33696000, this.bitSizes = { + cmpId: 12, + created: 36, + consentScreen: 6, + consentLanguage: 12, + cmpVersion: 12, + cmpVersionOld: 6, + consentValue: 1, + defaultConsent: 1, + endVendorId: 16, + encodingType: 1, + isRange: 1, + lastUpdated: 36, + maxVendorId: 16, + numberCustomPurposes: 6, + numEntries: 12, + publisherPurposesVersion: 12, + purposesAlowed: 24, + standardPurposesAllowed: 24, + startVendorId: 16, + version: 6, + vendorListVersion: 12 + }, this._binaryStr = void 0, this._bitPosition = void 0, this.TCString = void 0, this._binaryStr = '', this._bitPosition = 0, this.TCString = new we.TCString(); + } + return d(e, [ + { + key: 'encode', + value: function (e, t) { + var n, r; + switch (e.cookieName) { + case T: + n = dt([ + 'cookieName', + 'created', + 'lastUpdated', + 'cmpId', + 'cmpVersion', + 'maxVendorId', + 'vendorConsents' + ], e), r = 'nonIabVendorToBinary'; + break; + case V: + n = dt([ + 'cookieName', + 'publisherPurposesVersion', + 'standardPurposesAllowed', + 'numberCustomPurposes', + 'version', + 'created', + 'lastUpdated', + 'cmpId', + 'cmpVersion', + 'consentScreen', + 'consentLanguage', + 'vendorListVersion', + 'customPurposeConsents' + ], e), r = 'publisherConsentToBinary'; + break; + case O: + n = dt([ + 'cookieName', + 'vendorConsents', + 'purposeConsents', + 'specialFeatureOptins', + 'purposeLegitimateInterests', + 'vendorLegitimateInterests', + 'purposeLegitimateInterests', + 'publisherConsent', + 'publisherLegitimate', + 'publisherPurposeIds', + 'publisherPurposeLegitimateInterestIds' + ], e), r = 'encodeEuConsent'; + break; + case U: + n = dt([ + 'cookieName', + 'vendorConsents', + 'version' + ], e), r = 'encodeGoogleConsent'; + } + if (r && n) { + if (n.notFound) + return new Error(''.concat(n.notFound, ' keys not found')); + if (r.includes('ToBinary')) { + var o = this[r]({ + verifiedObject: n, + metadataOnly: t + }), i = this.binaryToBytes(o); + return this.toWebSafeBase64(i); + } + return this[r](n); + } + return new Error('Invalid cookie name'); + } + }, + { + key: 'decode', + value: function (e, t) { + var n = ''; + switch (e) { + case T: + n = 'decodeNonIabVendorBinary'; + break; + case V: + n = 'decodePublisherBinary'; + break; + case O: + n = 'decodeEuConsent'; + break; + case U: + n = 'decodeGoogleConsent'; + } + if (n) { + if (n.includes('Binary')) { + var r = this.fromWebSafeBase64(t), o = this.bytesToBinary(r); + return this[n](o); + } + return this[n](t); + } + return new Error('Invalid cookie name'); + } + }, + { + key: 'addBinaryField', + value: function (e, t, n) { + var r = (e || 0).toString(2); + if (!(r.length <= t)) + throw new Error('Encountered an overflow setting cookie field '.concat(n)); + r = this.PAD_ZEROS.substr(0, t - r.length) + r, this.binaryStr += r; + } + }, + { + key: 'encodeGoogleConsent', + value: function (e) { + var t = ''.concat(e.version, '~'); + return Fe.coreConfig.isAMP ? ''.concat(t).concat(e.vendorConsents.join('.')) : e.vendorConsents.reduce(function (e, t, n, r) { + if (0 === n) + return e.concat(t); + var o = r[n] ? t - r[n - 1] : null; + return o ? e.concat('.'.concat(o)) : e; + }, t); + } + }, + { + key: 'decodeGoogleConsent', + value: function (e) { + var t, n = null === (t = he(e, Fe.coreConfig.isAMP).match(/\d+/g)) || void 0 === t ? void 0 : t.map(function (e) { + return parseInt(e, 10); + }); + return { + version: null === n || void 0 === n ? void 0 : n.shift(), + consentIds: n + }; + } + }, + { + key: 'encodeEuConsent', + value: function (e) { + var t = i({}, e.vendorConsents), n = i({}, e.vendorLegitimateInterests); + e.vendorConsents = t, e.vendorLegitimateInterests = n; + var o = function (t) { + for (var n in e[t]) + e[t][n] ? We[t].set(parseInt(n)) : We[t].unset(parseInt(n)); + }; + return [ + { + value: e.publisherConsent, + tcModelName: 'publisherConsents', + reduceArray: e.publisherPurposeIds + }, + { + value: e.publisherLegitimate, + tcModelName: 'publisherLegitimateInterests', + reduceArray: e.publisherPurposeLegitimateInterestIds + } + ].forEach(function (t) { + void 0 !== t.value && (e[t.tcModelName] = t.reduceArray.reduce(function (e, n) { + return i(i({}, e), {}, r({}, n, t.value)); + }, {})); + }), o('vendorConsents'), o('purposeConsents'), o('specialFeatureOptins'), o('vendorLegitimateInterests'), o('purposeLegitimateInterests'), o('publisherConsents'), o('publisherLegitimateInterests'), gt(We); + } + }, + { + key: 'decodeEuConsent', + value: function (e) { + return mt(e); + } + }, + { + key: 'nonIabVendorToBinary', + value: function (e) { + var t = e.verifiedObject, n = e.metadataOnly; + if (this.binaryStr = '', this.addBinaryField(pt(t.created), this.bitSizes.created, 'created'), this.addBinaryField(pt(t.lastUpdated), this.bitSizes.lastUpdated, 'lastUpdated'), this.addBinaryField(t.cmpId, this.bitSizes.cmpId, 'cmpId'), this.addBinaryField(t.cmpVersion, this.bitSizes.cmpVersion, 'cmpVersion'), n) + return this.binaryStr; + this.addBinaryField(t.maxVendorId, this.bitSizes.maxVendorId, 'maxVendorId'); + for (var r = 1; r <= t.maxVendorId; r++) + this.binaryStr += t.vendorConsents[r] ? '1' : '0'; + return this.binaryStr; + } + }, + { + key: 'decodeNonIabVendorBinary', + value: function (e) { + this.bitPosition = 0; + for (var t = { + created: lt(this.getBits(this.bitSizes.created, e)), + lastUpdated: lt(this.getBits(this.bitSizes.lastUpdated, e)), + cmpId: this.getBits(this.bitSizes.cmpId, e), + cmpVersion: this.getBits(this.bitSizes.cmpVersion, e), + maxVendorId: this.getBits(this.bitSizes.maxVendorId, e), + vendorConsents: [void 0] + }, n = t.maxVendorId || 1, r = new Array(n), o = 0; o < t.maxVendorId; o++) + r[o + 1] = '1' === e.charAt(this._bitPosition + o); + return t.vendorConsents = r, t; + } + }, + { + key: 'publisherConsentToBinary', + value: function (e) { + var t = e.verifiedObject, n = e.metadataOnly; + if (this.binaryStr = '', 2 !== t.version) + throw new Error('version ' + t.version + ' not supported'); + if (this.addBinaryField(t.version, this.bitSizes.version, 'version'), this.addBinaryField(pt(t.created), this.bitSizes.created, 'created'), this.addBinaryField(pt(t.lastUpdated), this.bitSizes.lastUpdated, 'lastUpdated'), this.addBinaryField(t.cmpId, this.bitSizes.cmpId, 'cmpId'), this.addBinaryField(t.cmpVersion, this.bitSizes.cmpVersion, 'cmpVersion'), this.addBinaryField(t.consentScreen, this.bitSizes.consentScreen, 'consentScreen'), this.addBinaryField(this.languageToCookieValue(t.consentLanguage), this.bitSizes.consentLanguage, 'consentLanguage'), this.addBinaryField(t.vendorListVersion, this.bitSizes.vendorListVersion, 'vendorListVersion'), this.addBinaryField(t.publisherPurposesVersion, this.bitSizes.publisherPurposesVersion, 'publisherPurposesVersion'), n) + return this.binaryStr; + this.addBinaryField(t.standardPurposesAllowed, this.bitSizes.standardPurposesAllowed, 'standardPurposesAllowed'), this.addBinaryField(t.numberCustomPurposes, this.bitSizes.numberCustomPurposes, 'numberCustomPurposes'); + for (var r = 1; r <= t.numberCustomPurposes; r++) + this.binaryStr += t.customPurposeConsents[r] ? '1' : '0'; + return this.binaryStr; + } + }, + { + key: 'decodePublisherBinary', + value: function (e) { + this.bitPosition = 0; + for (var t = { + version: this.getBits(this.bitSizes.version, e), + created: lt(this.getBits(this.bitSizes.created, e)), + lastUpdated: lt(this.getBits(this.bitSizes.lastUpdated, e)), + cmpId: this.getBits(this.bitSizes.cmpId, e), + cmpVersion: this.getBits(this.bitSizes.cmpVersion, e), + consentScreen: this.getBits(this.bitSizes.consentScreen, e), + consentLanguage: this.languageFromCookieValue(this.getBits(this.bitSizes.consentLanguage, e)), + vendorListVersion: this.getBits(this.bitSizes.vendorListVersion, e), + publisherPurposesVersion: this.getBits(this.bitSizes.publisherPurposesVersion, e), + standardPurposesAllowed: this.getBits(this.bitSizes.standardPurposesAllowed, e), + numberCustomPurposes: this.getBits(this.bitSizes.numberCustomPurposes, e), + customPurposeConsents: [void 0] + }, n = new Array(t.numberCustomPurposes + 1), r = 0; r < t.numberCustomPurposes; r++) + n[r + 1] = '1' === e.charAt(this._bitPosition + r); + return t.customPurposeConsents = n, t; + } + }, + { + key: 'binaryToBytes', + value: function (e) { + var t = ''; + e += this.PAD_ZEROS.substr(0, 7 - (e.length + 7) % 8); + for (var n = 0; n < e.length; n += 8) + t += String.fromCharCode(parseInt(e.substr(n, 8), 2)); + return t; + } + }, + { + key: 'bytesToBinary', + value: function (e) { + for (var t = '', n = 0; n < e.length; n++) + t += this.binary8Bits(e.charCodeAt(n)); + return t; + } + }, + { + key: 'binary8Bits', + value: function (e) { + var t = [ + '0000', + '0001', + '0010', + '0011', + '0100', + '0101', + '0110', + '0111', + '1000', + '1001', + '1010', + '1011', + '1100', + '1101', + '1110', + '1111' + ]; + return t[e >>> 4 & 15] + t[15 & e]; + } + }, + { + key: 'getBits', + value: function (e, t) { + var n = parseInt(t.substr(this.bitPosition, e), 2); + return this.bitPosition += e, n; + } + }, + { + key: 'toWebSafeBase64', + value: function (e) { + return btoa(e).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); + } + }, + { + key: 'fromWebSafeBase64', + value: function (e) { + return atob(e.replace(/-/g, '+').replace(/_/g, '/')); + } + }, + { + key: 'languageToCookieValue', + value: function (e) { + return 64 * (e.charCodeAt(0) - this.LOWERCASE_START) + (e.charCodeAt(1) - this.LOWERCASE_START); + } + }, + { + key: 'languageFromCookieValue', + value: function (e) { + return String.fromCharCode(this.LOWERCASE_START + e / 64 >>> 0) + String.fromCharCode(this.LOWERCASE_START + e % 64); + } + }, + { + key: 'deleteCookie', + value: function (e, t) { + document.cookie = ''.concat(e, '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; max-age=-1; domain=').concat(t); + } + }, + { + key: 'fallbackToLocalStorage', + value: function (e, t) { + this.saveOnLocalStorage(e, t) && this.deleteCookie(e); + } + }, + { + key: 'saveOnLocalStorage', + value: function (e, t) { + const $___old_bb24a09be34141b8 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_bb24a09be34141b8) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_16c53395a822db48.localStorage)); + return function () { + try { + return window.localStorage.setItem(e, t), !0; + } catch (n) { + return console.warn('Could not save data on local storage: Not enough space.'), !1; + } + }.apply(this, arguments); + } finally { + if ($___old_bb24a09be34141b8) + ({}.constructor.defineProperty(window, 'localStorage', $___old_bb24a09be34141b8)); + } + } + }, + { + key: 'set', + value: function (e, t) { + var n = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2], r = !1; + n && (r = this.saveOnLocalStorage(e, t)), r || vt({ + cookieName: e, + encodedValue: t, + maxAge: this.COOKIE_MAX_AGE + }); + } + }, + { + key: 'get', + value: function (e) { + const $___old_01851074cddd70cf = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_01851074cddd70cf) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_16c53395a822db48.localStorage)); + return function () { + if (window.localStorage.getItem(e)) + return window.localStorage.getItem(e); + var t = e.trim(), n = document.cookie.split(';').filter(function (e) { + return e.trim().startsWith(t + '='); + }).map(function (e) { + return e.trim().substring(t.length + 1); + }); + if (n.length) { + var r = ''; + return r = e === O ? Ct(n) : n[0], e !== O && e !== R && e !== U && this.fallbackToLocalStorage(t, r), r; + } + return new Error(''.concat(e, ' not found.')); + }.apply(this, arguments); + } finally { + if ($___old_01851074cddd70cf) + ({}.constructor.defineProperty(window, 'localStorage', $___old_01851074cddd70cf)); + } + } + }, + { + key: 'bitPosition', + get: function () { + return this._bitPosition; + }, + set: function (e) { + this._bitPosition = e; + } + }, + { + key: 'binaryStr', + set: function (e) { + this._binaryStr = e; + }, + get: function () { + return this._binaryStr; + } + } + ]), e; + }(); + function ke(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function Oe(e, t) { + if (e) { + if ('string' === typeof e) + return ke(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === n && e.constructor && (n = e.constructor.name), 'Map' === n || 'Set' === n ? Array.from(n) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? ke(e, t) : void 0; + } + } + function Te(e) { + if ('undefined' === typeof Symbol || null == e[Symbol.iterator]) { + if (Array.isArray(e) || (e = Oe(e))) { + var t = 0, n = function () { + }; + return { + s: n, + n: function () { + return t >= e.length ? { done: !0 } : { + done: !1, + value: e[t++] + }; + }, + e: function (e) { + throw e; + }, + f: n + }; + } + throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + var r, o, i = !0, s = !1; + return { + s: function () { + r = e[Symbol.iterator](); + }, + n: function () { + var e = r.next(); + return i = e.done, e; + }, + e: function (e) { + s = !0, o = e; + }, + f: function () { + try { + i || null == r.return || r.return(); + } finally { + if (s) + throw o; + } + } + }; + } + function Ve(e) { + return function (e) { + if (Array.isArray(e)) + return ke(e); + }(e) || function (e) { + if ('undefined' !== typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(e) || Oe(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function xe(e, t) { + return function (e) { + if (Array.isArray(e)) + return e; + }(e) || function (e, t) { + if ('undefined' !== typeof Symbol && Symbol.iterator in Object(e)) { + var n = [], r = !0, o = !1, i = void 0; + try { + for (var s, a = e[Symbol.iterator](); !(r = (s = a.next()).done) && (n.push(s.value), !t || n.length !== t); r = !0); + } catch (c) { + o = !0, i = c; + } finally { + try { + r || null == a.return || a.return(); + } finally { + if (o) + throw i; + } + } + return n; + } + }(e, t) || Oe(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + !function (e) { + e.GO_TO_PAGE = 'goToPage', e.PURPOSE = 'purpose', e.LEGITIMATE_PURPOSE = 'legitimatePurpose', e.LEGITIMATE_VENDOR = 'legitimateVendor', e.SPECIAL_FEATURE = 'specialFeature', e.STACK = 'stack', e.PARTIAL_CONSENT = 'partial', e.SAVE_AND_EXIT = 'saveAndExit', e.ACCEPT_ALL = 'acceptAll', e.REJECT_ALL = 'rejectAll', e.ACCEPT_ALL_LEGITIMATE = 'acceptAllLegitimate', e.OBJECT_ALL_LEGITIMATE = 'objectAllLegitimate', e.ACCEPT_ALL_VENDORS = 'acceptAllVendors', e.REJECT_ALL_VENDORS = 'rejectAllVendors', e.ACCEPT_ALL_PURPOSES = 'acceptAllPurposes', e.REJECT_ALL_PURPOSES = 'rejectAllPurposes', e.VENDOR = 'vendor', e.NON_IAB_VENDOR = 'nonIabVendor', e.DISMISS_UI = 'dismissUi', e.START_ON_PAGE = 'startOnPage', e.OPT_OUT_TOGGLE = 'optOutToggle', e.OPT_OUT_CONFIRM = 'optOutConfirm', e.EXPAND_ELEMENT = 'expandElement', e.COLLAPSE_ELEMENT = 'collapseElement', e.GOOGLE = 'googlePartner'; + }(ve || (ve = {})), function (e) { + e.MANDATORY = 'tcfui:mandatory', e.CHANGE_OF_CONSENT = 'tcfui:changeofconsent', e.CCPA = 'uspui:donotsell'; + }(ge || (ge = {})), function (e) { + e.FEATURES = 'Features', e.NON_IAB = 'Non IAB', e.PURPOSES = 'Purposes', e.LEGITIMATE_PURPOSES = 'Legitimate Purposes', e.LEGITIMATE_VENDORS = 'Legitimate Vendors', e.SPECIAL_PURPOSES = 'Special Purposes', e.SPECIAL_FEATURES = 'Special Features', e.VENDORS = 'Vendors', e.STACKS = 'Stacks', e.GOOGLE = 'Google'; + }(me || (me = {})), function (e) { + e.INIT = 'init', e.NAVIGATION = 'navigation', e.DONE = 'done'; + }(be || (be = {})), function (e) { + e.ACCEPT_ALL = 'All', e.ACCEPT_PARTIAL = 'Partial', e.REJECT = 'Reject'; + }(Ce || (Ce = {})), function (e) { + e.NONE_OBJECTED = 'None', e.ALL_OBJECTED = 'All'; + }(_e || (_e = {})), function (e) { + e.STACKS = 'stacks', e.VENDORS = 'vendors', e.FEATURES = 'features', e.PURPOSES = 'purposes', e.SPECIAL_FEATURES = 'specialFeatures', e.SPECIAL_PURPOSES = 'specialPurposes', e.FLEXIBLE_PURPOSES = 'flexiblePurposes', e.LEGITIMATE_VENDORS = 'legitimateVendors', e.LEGITIMATE_PURPOSES = 'legitimatePurposes', e.UNFILTERED_FEATURES = 'unfilteredFeatures', e.UNFILTERED_PURPOSES = 'unfilteredPurposes', e.UNFILTERED_SPECIAL_FEATURES = 'unfilteredSpecialFeatures', e.UNFILTERED_SPECIAL_PURPOSES = 'unfilteredSpecialPurposes'; + }(Ee || (Ee = {})), function (e) { + e.CONSENT_RESPONSE = 'consent-response', e.CONSENT_UI = 'consent-ui'; + }(Se || (Se = {})), function (e) { + e[e.GDPR = 2] = 'GDPR', e[e.USP = 3] = 'USP'; + }(Ie || (Ie = {})), function (e) { + e.ACCEPT = 'accept', e.REJECT = 'reject', e.DISMISS = 'dismiss', e.ENTER_FULLSCREEN = 'enter-fullscreen'; + }(Le || (Le = {})); + var Re = n(88), Ue = n.n(Re), De = { + en: 'Privacy', + fr: 'Confidentialité', + de: 'Datenschutz', + it: 'Riservatezza', + es: 'Privacidad', + da: 'Privatlivets fred', + nl: 'Privacy', + el: 'Απόρρητο', + hu: 'Adatvédelem', + pt: 'Privacidade', + ro: 'Confidențialitate', + fi: 'Yksityisyys', + pl: 'Prywatność', + sk: 'Súkromie', + sv: 'Integritet', + no: 'Personvern', + ru: 'Конфиденциальность', + ar: 'إعدادات الخصوصية', + fa: 'تنظیمات حریم خصوصی' + }; + function Me(e, t, n) { + var o, i = function () { + var e = 'qc-cmp2-container'; + return de('div', e, e, document.body); + }(), s = 'qc-cmp2-persistent-link', a = de('a', s, s, i); + if (a.firstChild) + return a; + a.onclick = function () { + return window.__tcfapi('displayConsentUi', 2, function () { + }); + }; + var c = de('img', void 0, void 0, a), u = e || De[(t || 'en').toLowerCase()] || De.en; + c.src = Ue.a, c.alt = u; + var p = document.createTextNode(u); + a.appendChild(p); + var l = de('style', void 0, 'qc-cmp2', document.head), d = xe((o = {}, r(o, f.TOP_LEFT, [ + 'top', + 'left' + ]), r(o, f.TOP_RIGHT, [ + 'top', + 'right' + ]), r(o, f.BOTTOM_LEFT, [ + 'bottom', + 'left' + ]), r(o, f.BOTTOM_RIGHT, [ + 'bottom', + 'right' + ]), o)[n], 2), h = d[0], y = d[1], v = 'top' === h ? 'bottom' : 'top'; + return l.innerHTML = '.qc-cmp2-persistent-link {cursor:pointer; position:fixed; background-color:#368BD6;padding:5px 15px; color:#FFF; display:flex;align-items:center; max-height:30px; z-index:2147483640;' + ''.concat(h, ':0; ').concat(y, ':0;') + 'border-'.concat(v, '-left-radius:3px;') + 'border-'.concat(v, '-right-radius:3px;') + '}.qc-cmp2-persistent-link img {width:16px; height:17px; margin-right:5px;}', a; + } + var Be, Fe, Ne, je, Ge, He, qe, ze, Ye, We, Je, Ke, Qe = function () { + function e() { + var t = this; + p(this, e), this._cookieValues = void 0, this._deletedVendors = void 0, this.isSafari = void 0, this.resolveCookie = void 0, this._fetchCookiesCalled = void 0, this.resolveCookie = function () { + }, this._cookieValues = { + euconsent: '', + nonIabVendorConsent: '', + googleCookieValue: '', + fetched: !1, + promise: new Promise(function (e) { + return t.resolveCookie = e; + }) + }, this._deletedVendors = [], this.isSafari = bt('safari'), this._fetchCookiesCalled = !1; + } + return d(e, [ + { + key: 'getCoreConfig', + value: function () { + return Fe.coreConfig; + } + }, + { + key: 'getConsents', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, o, s, c, u, p, l, d, f, h, y, v, g, m, C, _; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = me.VENDORS, n = me.LEGITIMATE_VENDORS, o = me.LEGITIMATE_PURPOSES, s = me.PURPOSES, c = me.SPECIAL_FEATURES, u = me.NON_IAB, p = me.GOOGLE, this._cookieValues.fetched) { + e.next = 4; + break; + } + return e.next = 4, this._cookieValues.promise; + case 4: + return l = ye(ze.decode, this._cookieValues.euconsent), d = new b(), f = We.gvl, h = Fe.coreConfig.publisherName || Fe.coreConfig.cookieDomain || '', y = Fe.coreConfig, v = y.publisherPurposeIds, g = y.publisherPurposeLegitimateInterestIds, m = f.vendors, (v || g) && (m = i(i({}, m), {}, r({}, h, { + id: h, + name: h + }))), this.populateConsents(d, t, m, l), this.populateConsents(d, s, f.purposes, l), this.populateConsents(d, c, f.specialFeatures, l), this.populateConsents(d, n, m, l), this.populateConsents(d, o, f.purposes, l), C = ye(He.decode, this._cookieValues.nonIabVendorConsent), this.populateConsents(d, u, He.data.data.nonIabVendorList, C), _ = ye(Ke.decode, this._cookieValues.googleCookieValue), this.populateConsents(d, p, Ke.data, _), e.abrupt('return', d); + case 21: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'extractNumericKeys', + value: function (e) { + var t = {}; + for (var n in e) { + var r = parseInt(n); + isNaN(r) || (t[n] = e[n]); + } + return t; + } + }, + { + key: 'setConsents', + value: function (e) { + var t = Fe.coreConfig, n = t.publisherPurposeIds, r = t.publisherPurposeLegitimateInterestIds, o = t.publisherName, s = t.isAMP; + e.consentScreen && (We.consentScreen = e.consentScreen); + var a, c = ze.encode(this.extractNumericKeys(e.vendorConsents), this.extractNumericKeys(e.purposesConsents), this.extractNumericKeys(e.specialFeatures), this.extractNumericKeys(e.vendorLegitimateInterest), this.extractNumericKeys(e.legitimatePurposesConsents), e.vendorConsents[o], e.vendorLegitimateInterest[o], n, r), u = this.formatConsents(e.nonIabConsents), p = Fe.premiumProperties.nonIabVendorListUrl ? He.encode(u.consentArray, u.maxVendorId) : '', l = this.formatGoogleConsents(e), d = Fe.coreConfig.googleEnabled ? Ke.encode(l) : '', f = He.data.data.nonIabVendorsHash; + return l.length || s || Ge.deleteCookie(U, Fe.coreConfig.cookieDomain), Ye.setValues({ + euconsent: c, + nonIabVendorConsent: p, + nonIabVendorsHash: f + }), a = Ye.generateRepromptOptionsHash(), this.setData(c, p, a, d), this.updateApiVisible('GDPR', !1), i(i({}, this._cookieValues), {}, { allConsents: e.allConsents }); + } + }, + { + key: 'updateApiVisible', + value: function (e, t) { + if ('USP' !== e && ft(Ne.isUserInEU, Fe.coreConfig.displayUi)) { + var n = this._cookieValues.euconsent; + n && !n.message || (n = ''), St.cmpApi.update(n, t); + } else + St.cmpApi.update(null); + Fe.coreConfig.privacyMode.includes('GDPR') && Fe.coreConfig.displayPersistentConsentLink && !Fe.coreConfig.isAMP && this.hasCookie() && Me(Fe.getCustomCoreUiLabels().persistentConsentLinkLabel, Fe.coreConfig.lang_, Fe.coreConfig.persistentConsentLinkLocation); + } + }, + { + key: 'setData', + value: function (e, t, n, r) { + var o = Fe.coreConfig, i = o.consentScope, s = o.thirdPartyStorageType, a = o.consentScopeGroupURL, c = o.consentOnSafari, u = o.isAMP, p = 'api' === s, l = this.isSafari && c; + u || (l ? this.setDataUsingApi(!0, a, e, t, n, r) : i === y.SERVICE || this.isSafari ? this.setDataUsingFirstParty(e, t, n, r) : i === y.GLOBAL ? (this.setDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', e), this.setDataUsingFirstParty('', t, n)) : i === y.GLOBAL_GROUP ? p ? (this.setDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', e), this.setDataUsingApi(!0, a, '', t, n)) : (this.setDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', e), this.setDataUsingIframe('', t, n)) : i === y.SERVICE_GROUP && (p ? this.setDataUsingApi(!0, a, e, t, n, r) : this.setDataUsingIframe(e, t, n, r))), this._cookieValues = { + euconsent: e, + nonIabVendorConsent: t, + googleCookieValue: r, + fetched: !0, + promise: this._cookieValues.promise + }; + } + }, + { + key: 'setDataUsingApi', + value: function (e, t, n, r, o, i) { + var s = {}; + n && (s[O] = n), r && (s[T] = r), o && (s[x] = o), i && (s[U] = i), Z({ + method: 'post', + url: t, + data: s, + withCredentials: e + }).then(function () { + console.log('the cookies was saved successfully'); + }); + } + }, + { + key: 'setDataUsingIframe', + value: function (e, t, n, r) { + e && st.tryGroupCookieAccessCall('set', O, e), t && st.tryGroupCookieAccessCall('set', T, t), n && st.tryGroupCookieAccessCall('set', x, n), r && st.tryGroupCookieAccessCall('set', U, r); + } + }, + { + key: 'setDataUsingFirstParty', + value: function (e, t, n, r) { + e && ze.setCookie(e), t && He.setCookie(t), n && Ge.set(x, n), r && Ke.setCookie(r); + } + }, + { + key: 'fetchCookieValues', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, i, s, c, u, p, l, d, f, h; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig, n = t.consentScope, r = t.consentScopeGroupURL, o = t.thirdPartyStorageType, i = t.consentOnSafari, s = t.isAMP, c = Fe.ampData, u = '', p = '', l = '', d = {}, f = function (e) { + u = e.nonIabCookieValue, p = e.vendorCookieValue, l = e.googleCookieValue; + }, h = this.isSafari && i, this._fetchCookiesCalled = !0, !s) { + e.next = 12; + break; + } + c.consentMetadata && c.consentMetadata.consentStringType === Ie.GDPR && (p = c.consentString, c.consentMetadata.additionalConsent && (l = c.consentMetadata.additionalConsent)), e.next = 67; + break; + case 12: + if (!h) { + e.next = 19; + break; + } + return e.next = 15, this.getDataUsingApi(!0, r); + case 15: + d = e.sent, f(d), e.next = 67; + break; + case 19: + if (n !== y.SERVICE && !this.isSafari) { + e.next = 24; + break; + } + d = this.getDataUsingFirstParty(), f(d), e.next = 67; + break; + case 24: + if (n !== y.GLOBAL) { + e.next = 33; + break; + } + return e.next = 27, this.getDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', !0); + case 27: + d = e.sent, p = d.vendorCookieValue, d = this.getDataUsingFirstParty(!0), u = d.nonIabCookieValue, e.next = 67; + break; + case 33: + if (n !== y.GLOBAL_GROUP) { + e.next = 55; + break; + } + if ('api' !== o) { + e.next = 45; + break; + } + return e.next = 37, this.getDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', !0); + case 37: + return d = e.sent, p = d.vendorCookieValue, e.next = 41, this.getDataUsingApi(!0, r); + case 41: + d = e.sent, u = d.nonIabCookieValue, e.next = 53; + break; + case 45: + return e.next = 47, this.getDataUsingApi(!0, 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', !0); + case 47: + return d = e.sent, p = d.vendorCookieValue, e.next = 51, this.getDataUsingIframe(!0); + case 51: + d = e.sent, u = d.nonIabCookieValue; + case 53: + e.next = 67; + break; + case 55: + if (n !== y.SERVICE_GROUP) { + e.next = 67; + break; + } + if ('api' !== o) { + e.next = 63; + break; + } + return e.next = 59, this.getDataUsingApi(!0, r); + case 59: + d = e.sent, f(d), e.next = 67; + break; + case 63: + return e.next = 65, this.getDataUsingIframe(); + case 65: + d = e.sent, f(d); + case 67: + this._cookieValues = { + euconsent: p, + nonIabVendorConsent: u, + googleCookieValue: l, + fetched: !0, + promise: this._cookieValues.promise + }, this.resolveCookie(); + case 69: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'getDataUsingApi', + value: function () { + var e = u(a.a.mark(function e(t, n, r) { + var o, i, s; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return e.next = 2, Z({ + method: 'get', + url: n, + withCredentials: t + }); + case 2: + return o = e.sent, i = {}, r ? i.vendorCookieValue = o.data[O] : (s = o.data[x], Ye.storedHash = s, i.vendorCookieValue = o.data[O], i.nonIabCookieValue = o.data[T], i.googleCookieValue = o.data.addtl_consent), e.abrupt('return', i); + case 6: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t, n, r) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'getDataUsingIframe', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r, o, i, s, c; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return n = Fe.coreConfig.googleEnabled, r = Fe.premiumProperties.nonIabVendorListUrl, o = {}, e.next = 4, st.tryGroupCookieAccessCall('get', x, ''); + case 4: + if (i = e.sent, Ye.storedHash = i, !t || !r) { + e.next = 12; + break; + } + return e.next = 9, st.tryGroupCookieAccessCall('get', T, ''); + case 9: + o.nonIabCookieValue = e.sent, e.next = 27; + break; + case 12: + return e.next = 14, st.tryGroupCookieAccessCall('get', O, ''); + case 14: + if (o.vendorCookieValue = e.sent, !r) { + e.next = 21; + break; + } + return e.next = 18, st.tryGroupCookieAccessCall('get', T, ''); + case 18: + (s = e.sent) && Array.isArray(s) ? s = s[0] : s || (s = null), o.nonIabCookieValue = s; + case 21: + if (!n) { + e.next = 27; + break; + } + return e.next = 24, st.tryGroupCookieAccessCall('get', U, ''); + case 24: + (c = e.sent) && Array.isArray(c) ? c = c[0] : c || (c = null), o.googleCookieValue = c; + case 27: + return e.abrupt('return', o); + case 28: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'getDataUsingFirstParty', + value: function (e) { + var t = {}, n = Fe.coreConfig.googleEnabled, r = Fe.premiumProperties.nonIabVendorListUrl, o = Ge.get(O), i = Ge.get(x), s = Ge.get(T), a = Ge.get(U); + return Ye.storedHash = i, e || ('string' === typeof o && (t.vendorCookieValue = o), n && 'string' === typeof a && (t.googleCookieValue = a)), r && 'string' === typeof s && (t.nonIabCookieValue = s), t; + } + }, + { + key: 'repromptDueToInvalidCMPID', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, i, s, c, u, p; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig.isAMP, n = !1, t) { + e.next = 25; + break; + } + if (r = 'https://test.quantcast.mgr.consensu.org/GVL-v2/cmp-list.json', o = [], i = new Date(), s = Ge.get(k), !((c = s && !s.message ? JSON.parse(s) : null) && c.CMP && c.CMP.includes(String(We.cmpId)) && i.getTime() < c.expiry)) { + e.next = 12; + break; + } + n = !1, e.next = 25; + break; + case 12: + return e.prev = 12, e.next = 15, Z.get(r); + case 15: + u = e.sent, o.push.apply(o, Ve(Object.keys(u.data.cmps))), p = { + lastUpdated: u.data.lastUpdated, + CMP: o, + expiry: i.getTime() + 259200000 + }, Ge.set(k, JSON.stringify(p)), e.next = 24; + break; + case 21: + e.prev = 21, e.t0 = e.catch(12), console.log(e.t0); + case 24: + n = !o.includes(String(We.cmpId)); + case 25: + return e.abrupt('return', n); + case 26: + case 'end': + return e.stop(); + } + }, e, null, [[ + 12, + 21 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'repromptDueToOutdatedGvl', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, i, s, c, u, p, l; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig.vendorListUpdateFreq, this._cookieValues.fetched) { + e.next = 4; + break; + } + return e.next = 4, this._cookieValues.promise; + case 4: + if (n = ye(ze.decode, this._cookieValues.euconsent), r = !1, !n) { + e.next = 17; + break; + } + if (o = n.vendorListVersion, i = n.policyVersion, s = n.lastUpdated, c = Date.now() - s.getTime() > 86400000 * t) { + e.next = 11; + break; + } + return e.abrupt('return', { + outdatedGvlReprompt: r, + decodedEuConsent: n + }); + case 11: + return e.next = 13, this.loadGVL(); + case 13: + u = We.gvl, p = u.vendorListVersion, l = u.tcfPolicyVersion, c && (p > o || l > i) && (r = !0), e.next = 18; + break; + case 17: + r = !0; + case 18: + return e.abrupt('return', { + outdatedGvlReprompt: r, + decodedEuConsent: n + }); + case 19: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'repromptDueToConsentOnDeletedVendors', + value: function (e) { + var t, n = !1, r = Te(this._deletedVendors); + try { + for (r.s(); !(t = r.n()).done;) { + var o = t.value; + if (e.has(o)) { + n = !0; + break; + } + } + } catch (i) { + r.e(i); + } finally { + r.f(); + } + return n; + } + }, + { + key: 'fetchDataToReprompt', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, s, c; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return e.next = 2, this.repromptDueToOutdatedGvl(); + case 2: + return t = e.sent, n = t.outdatedGvlReprompt, r = t.decodedEuConsent, e.next = 7, this.repromptDueToInvalidCMPID(); + case 7: + return o = e.sent, s = Fe.coreConfig.consentScope, (c = n || o) || (c = this.repromptDueToConsentOnDeletedVendors(r.vendorConsents.set_)) || 'global' === s || (Ye.setValues(i(i({}, this._cookieValues), {}, { nonIabVendorsHash: He.data.data.nonIabVendorsHash })), c = Ye.shouldReprompt()), e.abrupt('return', c); + case 12: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'populateConsents', + value: function (e, t, n, r) { + var o, i = me.NON_IAB, s = me.PURPOSES, a = me.LEGITIMATE_PURPOSES, c = me.LEGITIMATE_VENDORS, u = me.VENDORS, p = me.SPECIAL_FEATURES, l = me.GOOGLE, d = '', f = ''; + switch (t) { + case i: + o = 'nonIabConsents', d = 'vendorConsents'; + break; + case u: + o = 'vendorConsents', d = 'vendorConsents', f = 'publisherConsents'; + break; + case s: + o = 'purposesConsents', d = 'purposeConsents'; + break; + case a: + o = 'legitimatePurposesConsents', d = 'purposeLegitimateInterests'; + break; + case c: + o = 'vendorLegitimateInterest', d = 'vendorLegitimateInterests', f = 'publisherLegitimateInterests'; + break; + case p: + o = 'specialFeatures', d = 'specialFeatureOptins'; + break; + case l: + o = 'googleConsents', d = 'consentIds'; + break; + default: + o = ''; + } + var h = null !== r && !r.message, y = Fe.coreConfig.publisherName; + if (e[o].hasCookie = h, h) + switch (t) { + case i: + if (n) { + var v, g = Te(n); + try { + for (g.s(); !(v = g.n()).done;) { + var m = v.value, b = r[d][m.id]; + e[o][m.id] = b; + } + } catch (w) { + g.e(w); + } finally { + g.f(); + } + } + break; + case l: + if (n) { + var C, _ = Te(n); + try { + for (_.s(); !(C = _.n()).done;) { + var E = C.value, S = parseInt(E.id, 10), I = r[d].includes(S); + e[o][S] = I; + } + } catch (w) { + _.e(w); + } finally { + _.f(); + } + } + break; + default: + for (var L in n) { + var P = L === y && f ? Ve(r[f].set_).length > 0 : r[d].has(parseInt(L)); + e[o][L] = P; + } + } + } + }, + { + key: 'formatConsents', + value: function (e) { + var t = 0, n = []; + for (var r in e) { + var o = parseInt(r); + isNaN(o) || (o > t && (t = o), n.push({ + consent: e[r], + id: o + })); + } + return { + consentArray: n, + maxVendorId: t + }; + } + }, + { + key: 'formatGoogleConsents', + value: function (e) { + var t = []; + for (var n in e.googleConsents) + !0 === e.googleConsents[n] && t.push(n); + return t.sort(function (e, t) { + return e - t; + }), t; + } + }, + { + key: 'regulationToInit', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig.privacyMode, n = '', !t.includes('USP')) { + e.next = 14; + break; + } + if (r = Fe.coreConfig.uspJurisdiction, !Ne.isUserInUS || !r.length) { + e.next = 14; + break; + } + if (X('initUspLocation: US'), r.includes('US')) { + e.next = 13; + break; + } + return e.next = 9, Ne.checkSpecificLocation(); + case 9: + X('initUspLocation: specific location' + JSON.stringify(Ne.userSpecificLocation)), Ne.userSpecificLocation && Ne.userSpecificLocation.region && r.includes(Ne.userSpecificLocation.region.toUpperCase()) && (n = 'USP'), e.next = 14; + break; + case 13: + n = 'USP'; + case 14: + return t.includes('GDPR') && 'USP' !== n && (o = Fe.coreConfig.displayUi, (Ne.isUserInEU && 'inEU' === o || 'always' === o) && (n = 'GDPR')), e.abrupt('return', n); + case 16: + case 'end': + return e.stop(); + } + }, e); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'loadGVL', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, i, s, c; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = Fe.coreConfig, n = t.privacyMode, r = t.lang_, o = Fe.premiumProperties, i = o.vendorWhitelist, s = o.vendorBlacklist, c = null === r || void 0 === r ? void 0 : r.toUpperCase(), We.gvl) { + e.next = 12; + break; + } + return We.gvl = new Y.GVL('LATEST'), e.next = 6, We.gvl.readyPromise; + case 6: + if (!n.includes('GDPR')) { + e.next = 10; + break; + } + return e.next = 9, We.gvl.changeLanguage(c); + case 9: + this.filterGvl(We.gvl, i, s); + case 10: + e.next = 14; + break; + case 12: + return e.next = 14, We.gvl.readyPromise; + case 14: + return e.abrupt('return', We.gvl); + case 15: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'filterGvl', + value: function (e, t, n) { + var r = e.vendors, o = [], i = []; + Object.keys(r).forEach(function (e) { + r[e].deletedDate ? i.push(r[e].id) : o.push(r[e].id); + }), this.deletedVendors = i, t.length && (o = t.filter(function (e) { + return o.includes(e); + })), n.length ? e.narrowVendorsTo(o.filter(function (e) { + return !n.includes(e); + })) : e.narrowVendorsTo(o); + } + }, + { + key: 'hasCookie', + value: function () { + return !!this._cookieValues.euconsent; + } + }, + { + key: 'setPublisherRestriction', + value: function (e) { + We.publisherRestrictions.add(e.id, e.purposeRestriction); + } + }, + { + key: 'deletedVendors', + set: function (e) { + this._deletedVendors = e; + } + }, + { + key: 'cookieValues', + get: function () { + return this._cookieValues; + } + }, + { + key: 'fetchCookiesCalled', + get: function () { + return this._fetchCookiesCalled; + } + } + ]), e; + }(), Ze = function () { + function e() { + p(this, e), this._data = void 0, this._fields = void 0, this._fields = { + created: new Date(), + lastUpdated: new Date(), + cmpId: 10, + cmpVersion: 26, + maxVendorId: 0, + vendorConsents: [] + }, this._data = { + nonIabVendorList: [], + updateAt: '', + nonIabVendorsHash: '' + }; + } + return d(e, [ + { + key: 'data', + set: function (e) { + this._data = e; + }, + get: function () { + return this._data; + } + }, + { + key: 'fields', + set: function (e) { + this._fields = e; + }, + get: function () { + return this._fields; + } + } + ]), e; + }(), Xe = function () { + function e() { + p(this, e), this._data = void 0, this.created = void 0, this._data = new Ze(), this.created = !1; + } + return d(e, [ + { + key: 'encode', + value: function (e, t) { + var n = []; + return e.forEach(function (e) { + n[e.id] = e.consent; + }), !1 === this.created ? (this.created = !0, this._data.fields = i(i({}, this._data.fields), {}, { + vendorConsents: n, + created: new Date(), + lastUpdated: new Date(), + maxVendorId: t + })) : this._data.fields = i(i({}, this._data.fields), {}, { + vendorConsents: n, + lastUpdated: new Date() + }), Ge.encode(i({ cookieName: T }, this._data.fields)); + } + }, + { + key: 'decode', + value: function (e) { + return Ge.decode(T, e); + } + }, + { + key: 'setCookie', + value: function (e) { + 'string' === typeof e ? Ge.set(T, e) : console.error(e.message); + } + }, + { + key: 'getCookie', + value: function () { + var e = Ge.get(T); + return e && 'string' === typeof e ? this.decode(e) : e; + } + }, + { + key: 'fetchList', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (Fe.premiumProperties.nonIabVendorListUrl || Fe.nonIabVendorsInfo) { + e.next = 2; + break; + } + return e.abrupt('return'); + case 2: + if (e.prev = 2, 'undefined' === typeof Fe.nonIabVendorsInfo) { + e.next = 9; + break; + } + if (Fe.nonIabVendorsInfo.nonIabVendorList && 0 !== Fe.nonIabVendorsInfo.nonIabVendorList.length) { + e.next = 6; + break; + } + return e.abrupt('return'); + case 6: + t = Fe.nonIabVendorsInfo, e.next = 13; + break; + case 9: + return e.next = 11, Z.get(Fe.premiumProperties.nonIabVendorListUrl); + case 11: + n = e.sent, t = n.data; + case 13: + r = [], t.nonIabVendorList.forEach(function (e) { + var t = { + name: e.name, + id: e.vendorId, + policyUrl: !!e.privacyPolicyUrl && e.privacyPolicyUrl, + description: !!e.description && e.description, + purposes: 'nonIabPurposeConsentIds' in e && e.nonIabPurposeConsentIds, + legIntPurposes: 'nonIabPurposeLegitimateInterestIds' in e && e.nonIabPurposeLegitimateInterestIds + }; + r.push(t); + }), this._data.data = i(i({}, t), {}, { nonIabVendorList: r }), e.next = 21; + break; + case 18: + e.prev = 18, e.t0 = e.catch(2), console.log('error processing nonIabVendors', e.t0); + case 21: + case 'end': + return e.stop(); + } + }, e, this, [[ + 2, + 18 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'data', + get: function () { + return this._data; + } + } + ]), e; + }(), $e = function () { + function e() { + p(this, e); + } + return d(e, [ + { + key: 'encode', + value: function (e, t, n, r, o, i, s, a, c) { + return Ge.encode({ + cookieName: O, + vendorConsents: e, + purposeConsents: t, + specialFeatureOptins: n, + vendorLegitimateInterests: r, + purposeLegitimateInterests: o, + publisherConsent: i, + publisherLegitimate: s, + publisherPurposeIds: a, + publisherPurposeLegitimateInterestIds: c + }); + } + }, + { + key: 'decode', + value: function (e) { + return Ge.decode(O, e); + } + }, + { + key: 'setCookie', + value: function (e) { + 'string' === typeof e ? Ge.set(O, e, !1) : console.error(e.message); + } + }, + { + key: 'getCookie', + value: function () { + var e = Ge.get(O); + return e && 'string' === typeof e ? this.decode(e) : e; + } + } + ]), e; + }(), et = function () { + function e() { + p(this, e), this._uspVersion = void 0, this._baseString = void 0, this._noticegiven = void 0, this._optedout = void 0, this._lspact = void 0, this._uspVersion = 1, this._noticegiven = '-', this._optedout = '-', this._lspact = '-', this._baseString = null; + } + return d(e, [ + { + key: 'baseString', + set: function (e) { + this._baseString = e; + }, + get: function () { + return this._baseString; + } + }, + { + key: 'noticegiven', + set: function (e) { + this._noticegiven = e; + }, + get: function () { + return this._noticegiven; + } + }, + { + key: 'optedout', + set: function (e) { + this._optedout = e; + }, + get: function () { + return this._optedout; + } + }, + { + key: 'lspact', + set: function (e) { + this._lspact = e; + }, + get: function () { + return this._lspact; + } + }, + { + key: 'uspVersion', + get: function () { + return this._uspVersion; + } + } + ]), e; + }(), tt = /^[1][nNyY-][nNyY-][nNyY-]$/, nt = function () { + function e() { + p(this, e), this._data = void 0, this._data = new et(); + } + return d(e, [ + { + key: 'encode', + value: function (e, t) { + return this._data.baseString = ''.concat(e, 'Y').concat(t ? 'Y' : 'N').concat(Fe.coreConfig.uspLspact), this._data.baseString; + } + }, + { + key: 'setCookie', + value: function (e) { + 'string' === typeof e ? tt.test(e) && Ge.set(R, e, !1) : e && 'message' in e && console.error(e.message); + } + }, + { + key: 'getCookie', + value: function () { + return Ge.get(R); + } + } + ]), e; + }(), rt = function () { + function e(t) { + p(this, e), this._cookieAccessIframe = void 0, this._isCookieAccessIframeReady = void 0, this.groupCookieAccessCallbacks = void 0, this._cookieAccessIframe = document.createElement('iframe'), this._isCookieAccessIframeReady = !1, this.groupCookieAccessCallbacks = {}, this.groupCookieAccessHandler = this.groupCookieAccessHandler.bind(this), window.addEventListener ? window.addEventListener('message', this.groupCookieAccessHandler, !1) : window.attachEvent('onmessage', this.groupCookieAccessHandler), this.createGroupCookieAccessIframe(t.coreConfig.consentScopeGroupURL, '_qc_cookie_access'); + } + return d(e, [ + { + key: 'tryGroupCookieAccessCall', + value: function (e, t, n) { + var r = this; + return new Promise(function (o) { + var i = setInterval(function () { + r._isCookieAccessIframeReady && r._cookieAccessIframe.contentWindow && (clearInterval(i), r.groupCookieAccessCall(e, t, n, function (e) { + o(e); + })); + }, 50); + }); + } + }, + { + key: 'groupCookieAccessCall', + value: function (e, t, n, r) { + var o = Math.random().toString(), i = { + callId: o, + __qcCmpCookieAccessCall: { + cmd: e, + cookieName: t + } + }; + if ('set' === e) { + this.groupCookieAccessCallbacks[o] = { + cookieName: t, + cookieValue: n + }; + var s = new Date(Date.now() + 33696000000).toUTCString(); + i.__qcCmpCookieAccessCall.cookieValue = n, i.__qcCmpCookieAccessCall.cookiePath = Fe.coreConfig.cookiePath, i.__qcCmpCookieAccessCall.expires = s; + } else + this.groupCookieAccessCallbacks[o] = { + cookieName: t, + resolve: r + }; + this._cookieAccessIframe.contentWindow.postMessage(i, '*'); + } + }, + { + key: 'createGroupCookieAccessIframe', + value: function (e, t) { + var n = this._cookieAccessIframe; + n.src = e, n.style.display = 'none', n.id = t; + !function e() { + document.body ? document.body.appendChild(n) : setTimeout(e, 5); + }(); + } + }, + { + key: 'groupCookieAccessHandler', + value: function (e) { + var t; + if ((t = 'string' === typeof e.data ? -1 !== e.data.indexOf('__qcCmpCookieAccessReturn') ? JSON.parse(e.data) : {} : e.data).__qcCmpCookieAccessReturn) { + if (t.__qcCmpCookieAccessReturn.isHandlerRegistered) + return void (this._isCookieAccessIframeReady = !0); + var n = t.__qcCmpCookieAccessReturn, r = this.groupCookieAccessCallbacks[t.callId]; + if (r.resolve) { + var o = null; + 'get' === n.cmd && (o = -1 !== [ + 'euconsent-v2', + 'addtl_consent' + ].indexOf(r.cookieName) ? 'euconsent-v2' === r.cookieName ? this.returnLatestVendorCookie(n.cookies) : n.isSuccess ? n.cookies[0] : null : n.cookies, r.resolve(o)), delete this.groupCookieAccessCallbacks[t.callId]; + } + } + } + }, + { + key: 'returnLatestVendorCookie', + value: function (e) { + return e && e.length ? Ct(e) : new Error('euconsent-v2 not found.'); + } + }, + { + key: 'isCookieAccessIframeReady', + get: function () { + return this.isCookieAccessIframeReady; + } + }, + { + key: 'cookieAccessIframe', + get: function () { + return this._cookieAccessIframe; + } + } + ]), e; + }(), ot = function () { + function e() { + p(this, e), this.version = void 0, this._data = void 0, this.whitelist = void 0, this.version = 1, this._data = [], this.whitelist = Fe.premiumProperties.googleWhitelist; + } + return d(e, [ + { + key: 'encode', + value: function (e) { + return Ge.encode({ + cookieName: U, + vendorConsents: e, + version: this.version + }); + } + }, + { + key: 'decode', + value: function (e) { + return Ge.decode(U, e); + } + }, + { + key: 'setCookie', + value: function (e) { + 'string' === typeof e ? Ge.set(U, e, !1) : console.error(e.message); + } + }, + { + key: 'getCookie', + value: function (e) { + var t = Ge.get(U); + return t && 'string' === typeof t ? e ? t : this.decode(t) : null; + } + }, + { + key: 'fetchPartners', + value: function () { + var e = u(a.a.mark(function e() { + var t, n, r, o, i; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (Fe.coreConfig.googleEnabled && !Fe.coreConfig.consentScope.includes('global')) { + e.next = 2; + break; + } + return e.abrupt('return'); + case 2: + return e.prev = 2, 'https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json', e.next = 6, Z.get('https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json'); + case 6: + if (t = e.sent, n = [], JSON.stringify(this.whitelist) === JSON.stringify([-1])) + this._data = []; + else + for (r in t.data) + 'undefined' !== typeof (o = t.data[r]).provider_id && '' !== o.provider_id && (JSON.stringify(this.whitelist) === JSON.stringify([1]) || this.whitelist.length > 0 && this.whitelist.includes(parseInt(o.provider_id))) && (i = { + name: o.provider_name, + id: o.provider_id, + policyUrl: o.policy_url, + description: o.domains + }, n.push(i)), this._data = n; + e.next = 14; + break; + case 11: + e.prev = 11, e.t0 = e.catch(2), console.log(e.t0); + case 14: + case 'end': + return e.stop(); + } + }, e, this, [[ + 2, + 11 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'data', + get: function () { + return this._data; + } + } + ]), e; + }(); + Y.GVL.baseUrl = 'https://quantcast.mgr.consensu.org/GVL-v2/'; + var it, st, at = new K(), ct = function () { + var e = u(a.a.mark(function e(t) { + var n, r, o, i, s; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return n = (Fe = t).coreConfig, r = n.consentScope, o = n.privacyMode, i = n.publisherCountryCode, s = n.showSummaryView, '', it = '', Be = new Qe(), Ne = new $('inUS'), je = function () { + var e = u(a.a.mark(function e() { + var t, n; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return t = '', e.prev = 1, e.next = 4, Be.regulationToInit(); + case 4: + 'USP' === (t = e.sent) || o.includes('USP') ? It.initUsp() : (n = function (e, t, n) { + 'getUSPData' === e && 1 === t && 'function' === typeof n && n({ + version: 1, + uspString: '1---' + }, !0); + }, Object.assign(window, { __uspapi: n })), e.next = 11; + break; + case 8: + e.prev = 8, e.t0 = e.catch(1), console.log(e.t0); + case 11: + return e.abrupt('return', t); + case 12: + case 'end': + return e.stop(); + } + }, e, null, [[ + 1, + 8 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }(), Ge = new Ae(), He = new Xe(), qe = new nt(), ze = new $e(), Ke = new ot(), Ye = new Pe(), We = null, Je = function () { + var e = u(a.a.mark(function e() { + var t, n, o, s, c, u, p = arguments; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (t = p.length > 0 && void 0 !== p[0] && p[0], o = r.includes('service'), ((s = 'GDPR' === it) || t) && ((We = new W.TCModel()).cmpId = 10, We.cmpVersion = A, We.publisherCountryCode = i, o && (c = fe(Fe), u = c.purposeIds, We.isServiceSpecific = !0, u.includes(1) || ('DE' === i ? We.purposeOneTreatment = !0 : u.push(1)))), e.prev = 4, !s && !t) { + e.next = 18; + break; + } + return e.next = 8, Be.fetchCookieValues(); + case 8: + return e.next = 10, He.fetchList(); + case 10: + return e.next = 12, Ke.fetchPartners(); + case 12: + return e.next = 14, Be.fetchDataToReprompt(); + case 14: + if (!(n = e.sent)) { + e.next = 18; + break; + } + return e.next = 18, Be.loadGVL(); + case 18: + e.next = 23; + break; + case 20: + e.prev = 20, e.t0 = e.catch(4), console.error(e.t0); + case 23: + return e.abrupt('return', n); + case 24: + case 'end': + return e.stop(); + } + }, e, null, [[ + 4, + 20 + ]]); + })); + return function () { + return e.apply(this, arguments); + }; + }(), e.next = 17, je(); + case 17: + return it = e.sent, e.next = 20, Je(); + case 20: + e.sent && 'GDPR' === it ? at.displayUi('GDPR', s ? 0 : 1, !0) : Be.updateApiVisible(it, !1); + case 22: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t) { + return e.apply(this, arguments); + }; + }(), ut = function (e) { + return i(i(i(i({}, e.coreConfig), e.premiumProperties), e.coreUiLabels), e.premiumUiLabels); + }, pt = function (e) { + return Math.floor(e.getTime() / 100); + }, lt = function (e) { + return new Date(100 * e); + }, dt = function (e, t) { + var n = Object.keys(t).filter(function (t) { + return -1 === e.indexOf(t); + }); + return n.length && (t.notFound = n), t; + }, ft = function (e, t) { + return !(!e && 'always' !== t); + }, ht = function (e) { + return e.coreConfig.consentScope === y.GLOBAL || e.coreConfig.consentScope === y.GLOBAL_GROUP; + }, yt = function (e, t) { + var n = {}; + return t && t.length > 0 ? (t.forEach(function (t) { + void 0 !== e[t] ? n[t] = e[t] : n[t] = !1; + }), n) : e; + }, vt = function (e) { + var t = new Date(Date.now() + 1000 * e.maxAge).toUTCString(), n = 'https:' === window.location.protocol ? ';SameSite=Lax;secure' : '', r = Fe.coreConfig.cookiePath || '/'; + document.cookie = e.cookieName + '=' + e.encodedValue + ';path=' + r + ';max-age=' + e.maxAge + ';expires=' + t + ';domain=' + Fe.coreConfig.cookieDomain + n; + }, gt = function (e) { + return we.TCString.encode(e); + }, mt = function (e) { + return we.TCString.decode(e); + }, bt = function (e) { + var t = !1; + switch (e) { + case 'firefox': + t = navigator.userAgent.toLowerCase().indexOf(e) > -1; + break; + case 'safari': + t = navigator.userAgent.toLowerCase().indexOf(e) > -1 && -1 === navigator.userAgent.toLowerCase().indexOf('chrome'); + } + return t; + }, Ct = function (e) { + var t = null, n = new Error('euconsent-v2 not valid'); + return e.forEach(function (e) { + var r = null; + try { + r = mt(e); + } catch (o) { + console.error('Failed to decode euconsent-v2 cookie: ' + e); + } + r && r.lastUpdated && r.lastUpdated > t && (t = r.lastUpdated, n = e); + }), n; + }, _t = function () { + function e() { + var t = this; + p(this, e), this.cmpApi = void 0, this.isInitialized = void 0, this.config = void 0, this.MyCustomCommands = void 0; + var n, r = window.__tcfapi(); + r.length && r.forEach(function (e) { + e && 'init' === e[0] && (n = e[3]); + }), this.isInitialized = !1; + var o = 'thirdPartyStorageType' in n.coreConfig ? n.coreConfig.thirdPartyStorageType : 'iframe', i = 'consentScope' in n.coreConfig ? n.coreConfig.consentScope : 'service', s = 'consentScopeGroupURL' in n.coreConfig ? n.coreConfig.consentScopeGroupURL : '', c = i.includes('service'); + i.includes('group') && 'iframe' === o && s && (st = new rt(n)), this.MyCustomCommands = { + getConfig: function (e, n) { + var r = t.getConfig(n), o = !1; + 'object' === typeof r && (o = !0), e(r, o); + }, + getNonIABVendorConsents: function () { + var e = u(a.a.mark(function e(n, r) { + var o, i; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return e.next = 2, t.getNonIABVendorConsents(r); + case 2: + o = e.sent, i = !1, 'object' === typeof o && (i = !0), n(o, i); + case 6: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t, n) { + return e.apply(this, arguments); + }; + }(), + displayConsentUi: function (e) { + return e(t.displayConsentUi()); + }, + setConsentInfo: function (e, t) { + return e(Be.setConsents(t)); + }, + setPublisherRestriction: function (e, t) { + return e(Be.setPublisherRestriction(t)); + }, + notifyUiState: function (e, t) { + return e(Be.updateApiVisible(t.regulation, t.visible)); + }, + init: function (e, n) { + return e(t.init(n)); + } + }, this.addGetTCDataToSupportGoogle(n, c), this.cmpApi = new g.CmpApi(10, A, c, this.MyCustomCommands); + } + return d(e, [ + { + key: 'addGetTCDataToSupportGoogle', + value: function (e, t) { + var n = 'googleEnabled' in e.coreConfig && e.coreConfig.googleEnabled; + if (t && n) { + var r = function () { + var e = u(a.a.mark(function e(t, n) { + var r, o; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('object' !== typeof n) { + e.next = 8; + break; + } + if (!Be.fetchCookiesCalled) { + e.next = 8; + break; + } + if (Be.cookieValues.fetched) { + e.next = 5; + break; + } + return e.next = 5, Be.cookieValues.promise; + case 5: + r = Be.cookieValues.googleCookieValue, o = r ? he(r) : void 0, n.addtlConsent = o; + case 8: + 'function' === typeof t && ('boolean' === typeof n ? t(n) : t(n, !0)); + case 9: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t, n) { + return e.apply(this, arguments); + }; + }(); + this.MyCustomCommands.getTCData = r, this.MyCustomCommands.getInAppTCData = r; + } + } + }, + { + key: 'displayConsentUi', + value: function () { + at.displayUi('GDPR', 1, !1); + } + }, + { + key: 'init', + value: function (e) { + if (!this.isInitialized) + return this.isInitialized = !0, this.config || (this.config = new z(e), this.config.initializeConfig()), ct(this.config); + console.warn('init has already been called and should only be run one time.'); + } + }, + { + key: 'getConfig', + value: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 'all'; + if (this.config) + switch (e) { + case 'all': + return { + coreConfig: this.config.coreConfig, + coreUiLabels: this.config.coreUiLabels, + premiumProperties: this.config.premiumProperties, + premiumUiLabels: this.config.premiumUiLabels, + theme: this.config.theme, + nonIabVendorsInfo: this.config.nonIabVendorsInfo + }; + case 'Core Config': + return this.config.coreConfig; + case 'Premium Properties': + return this.config.premiumProperties; + case 'Core UI Labels': + return this.config.coreUiLabels; + case 'Premium UI Labels': + return this.config.premiumUiLabels; + case 'Theme': + return this.config.theme; + case 'Non Iab Vendors Info': + return this.config.nonIabVendorsInfo; + default: + var t = ut(this.config); + if (t[e]) + return t[e]; + console.warn('"'.concat(e, '": was not found in configs')); + } + else + console.error('Should run init before running getConfig'); + } + }, + { + key: 'getConfigInstance', + value: function () { + return this.config; + } + }, + { + key: 'getNonIABVendorConsents', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r, o; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('undefined' === typeof this.config) { + e.next = 12; + break; + } + if (!Be.fetchCookiesCalled) { + e.next = 5; + break; + } + if (Be.cookieValues.fetched) { + e.next = 5; + break; + } + return e.next = 5, Be.cookieValues.promise; + case 5: + return n = ye(He.decode, Be.cookieValues.nonIabVendorConsent), r = null, o = 'USP' !== it && ft(Ne.isUserInEU, this.config.coreConfig.displayUi), n && t ? r = yt(n.vendorConsents, t) : n && (r = i({}, n.vendorConsents)), e.abrupt('return', { + gdprApplies: o, + hasGlobalConsent: ht(this.config), + hasGlobalScope: ht(this.config), + metadata: r ? Ge.encode(i(i({}, n), {}, { cookieName: 'noniabvendorconsent' }), !0) : null, + nonIabVendorConsents: r || null + }); + case 12: + console.log('Config was not found'); + case 13: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + } + ]), e; + }(), Et = function () { + function e() { + var t = this; + p(this, e), this.__uspapi = void 0, this._uspVersion = 1, this.isUspJurisdiction = function () { + var e = u(a.a.mark(function e(n) { + var r, o, i, s; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if (r = !0, o = Fe.coreConfig, i = o.uspJurisdiction, o.isAMP) { + e.next = 8; + break; + } + return e.next = 5, Ne.checkSpecificLocation(); + case 5: + (s = e.sent) && 'string' === typeof s.region && (s = s.region.toUpperCase()), i.includes(s) || ('function' === typeof n && n({ + version: t._uspVersion, + uspString: '1---' + }, !0), r = !1); + case 8: + return e.abrupt('return', r); + case 9: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t) { + return e.apply(this, arguments); + }; + }(), this.__uspapi = function (e) { + var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1, r = arguments.length > 2 ? arguments[2] : void 0, o = arguments.length > 3 ? arguments[3] : void 0; + if (n === t._uspVersion) + if ('function' === typeof r) + try { + void 0 !== o ? t[e](r, o) : t[e](r); + } catch (i) { + console.error('The function '.concat(e, ' is not defined')); + } + else if (void 0 === r) + try { + t[e](); + } catch (i) { + console.error('The function '.concat(e, ' is missing required parameters')); + } + else + console.warn('The third parameter should be a callback for the '.concat(e, ' function')); + else + console.warn('this command is only available for uspVersion 1'); + }; + } + return d(e, [ + { + key: 'initUsp', + value: function () { + var e = this, t = this.__uspapi; + Fe.coreConfig.isAMP && this.getUSPData(function (t) { + t || e.setUspDftData(function (e) { + var t, n; + t = !0, n = { + type: Se.CONSENT_RESPONSE, + action: Le.ACCEPT, + info: e.uspString, + consentMetadata: { consentStringType: Ie.USP } + }, t && window.parent.postMessage(n, '*'); + }); + }), Object.assign(window, { __uspapi: t }); + } + }, + { + key: 'uspPing', + value: function () { + var e = u(a.a.mark(function e(t) { + var n; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('function' !== typeof t) { + e.next = 8; + break; + } + return e.next = 3, Ne.checkSpecificLocation(); + case 3: + (n = e.sent) && 'object' === typeof n && (n = n.region), t({ + mode: Fe.coreConfig.privacyMode, + jurisdiction: Fe.coreConfig.uspJurisdiction, + location: n, + cmpLoaded: !0 + }, !0), e.next = 9; + break; + case 8: + console.error('The callback function is missing'); + case 9: + case 'end': + return e.stop(); + } + }, e); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'setUspDftData', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r, o; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('function' !== typeof t) { + e.next = 10; + break; + } + return n = Fe.coreConfig.isAMP ? null : qe.getCookie(), e.next = 4, this.isUspJurisdiction(t); + case 4: + if (e.sent) { + e.next = 7; + break; + } + return e.abrupt('return'); + case 7: + 'string' !== typeof n ? (r = qe.encode(this._uspVersion, !1), Fe.coreConfig.isAMP || qe.setCookie(r), t({ + version: this._uspVersion, + uspString: r + }, !0)) : (o = n.split('')[0], t({ + version: o, + uspString: n + }, !0)), e.next = 11; + break; + case 10: + console.error('The callback function is missing'); + case 11: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'setUspData', + value: function () { + var e = u(a.a.mark(function e(t, n) { + var r; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('function' !== typeof t) { + e.next = 10; + break; + } + return r = qe.encode(this._uspVersion, n), e.next = 4, this.isUspJurisdiction(t); + case 4: + if (e.sent) { + e.next = 7; + break; + } + return e.abrupt('return'); + case 7: + 'string' !== typeof r ? t(null, !1) : (Fe.coreConfig.isAMP || qe.setCookie(r), t({ + version: this._uspVersion, + uspString: r, + doNotSell: n + }, !0)), e.next = 11; + break; + case 10: + console.error('The callback function is missing'); + case 11: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (t, n) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'getUSPData', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + if ('function' !== typeof t) { + e.next = 10; + break; + } + return n = Fe.coreConfig.isAMP ? Fe.ampData.consentMetadata && Fe.ampData.consentMetadata.consentStringType === Ie.USP && Fe.ampData.consentString : qe.getCookie(), e.next = 4, this.isUspJurisdiction(t); + case 4: + if (e.sent) { + e.next = 7; + break; + } + return e.abrupt('return'); + case 7: + 'string' === typeof n ? (r = n.split('')[0], t({ + version: r, + uspString: n + }, !0)) : t(null, !1), e.next = 11; + break; + case 10: + console.error('The callback function is missing'); + case 11: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'displayUspUi', + value: function () { + var e = u(a.a.mark(function e(t) { + var n, r = arguments; + return a.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return n = r.length > 1 && void 0 !== r[1] ? r[1] : 1, e.next = 3, this.isUspJurisdiction(void 0); + case 3: + if (e.sent) { + e.next = 7; + break; + } + return console.warn('cannot display USP UI outside of configured jurisdiction(s)'), e.abrupt('return'); + case 7: + 1 === n && at.displayUi('USP', n); + case 8: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (t) { + return e.apply(this, arguments); + }; + }() + } + ]), e; + }(), St = new _t(), It = new Et(); + }, + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + , + function (e, t, n) { + e.exports = n(166); + } + ]); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-cmp2ui-en.js b/resources/sugarcoat-cmp2ui-en.js new file mode 100644 index 00000000..c24f1fe9 --- /dev/null +++ b/resources/sugarcoat-cmp2ui-en.js @@ -0,0 +1,6887 @@ +{ + const $___mock_b3615e3d24fb9d30 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_b3615e3d24fb9d30); + (function () { + !function (e) { + var n = {}; + function t(r) { + if (n[r]) + return n[r].exports; + var o = n[r] = { + i: r, + l: !1, + exports: {} + }; + return e[r].call(o.exports, o, o.exports, t), o.l = !0, o.exports; + } + t.m = e, t.c = n, t.d = function (e, n, r) { + t.o(e, n) || Object.defineProperty(e, n, { + enumerable: !0, + get: r + }); + }, t.r = function (e) { + 'undefined' !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); + }, t.t = function (e, n) { + if (1 & n && (e = t(e)), 8 & n) + return e; + if (4 & n && 'object' === typeof e && e && e.__esModule) + return e; + var r = Object.create(null); + if (t.r(r), Object.defineProperty(r, 'default', { + enumerable: !0, + value: e + }), 2 & n && 'string' != typeof e) + for (var o in e) + t.d(r, o, function (n) { + return e[n]; + }.bind(null, o)); + return r; + }, t.n = function (e) { + var n = e && e.__esModule ? function () { + return e.default; + } : function () { + return e; + }; + return t.d(n, 'a', n), n; + }, t.o = function (e, n) { + return Object.prototype.hasOwnProperty.call(e, n); + }, t.p = '/', t(t.s = 19); + }([ + function (e, n, t) { + 'use strict'; + var r = t(6), o = Object.prototype.toString; + function a(e) { + return '[object Array]' === o.call(e); + } + function i(e) { + return 'undefined' === typeof e; + } + function s(e) { + return null !== e && 'object' === typeof e; + } + function c(e) { + return '[object Function]' === o.call(e); + } + function l(e, n) { + if (null !== e && 'undefined' !== typeof e) + if ('object' !== typeof e && (e = [e]), a(e)) + for (var t = 0, r = e.length; t < r; t++) + n.call(null, e[t], t, e); + else + for (var o in e) + Object.prototype.hasOwnProperty.call(e, o) && n.call(null, e[o], o, e); + } + e.exports = { + isArray: a, + isArrayBuffer: function (e) { + return '[object ArrayBuffer]' === o.call(e); + }, + isBuffer: function (e) { + return null !== e && !i(e) && null !== e.constructor && !i(e.constructor) && 'function' === typeof e.constructor.isBuffer && e.constructor.isBuffer(e); + }, + isFormData: function (e) { + return 'undefined' !== typeof FormData && e instanceof FormData; + }, + isArrayBufferView: function (e) { + return 'undefined' !== typeof ArrayBuffer && ArrayBuffer.isView ? ArrayBuffer.isView(e) : e && e.buffer && e.buffer instanceof ArrayBuffer; + }, + isString: function (e) { + return 'string' === typeof e; + }, + isNumber: function (e) { + return 'number' === typeof e; + }, + isObject: s, + isUndefined: i, + isDate: function (e) { + return '[object Date]' === o.call(e); + }, + isFile: function (e) { + return '[object File]' === o.call(e); + }, + isBlob: function (e) { + return '[object Blob]' === o.call(e); + }, + isFunction: c, + isStream: function (e) { + return s(e) && c(e.pipe); + }, + isURLSearchParams: function (e) { + return 'undefined' !== typeof URLSearchParams && e instanceof URLSearchParams; + }, + isStandardBrowserEnv: function () { + return ('undefined' === typeof navigator || 'ReactNative' !== navigator.product && 'NativeScript' !== navigator.product && 'NS' !== navigator.product) && ('undefined' !== typeof window && 'undefined' !== typeof document); + }, + forEach: l, + merge: function e() { + var n = {}; + function t(t, r) { + 'object' === typeof n[r] && 'object' === typeof t ? n[r] = e(n[r], t) : n[r] = t; + } + for (var r = 0, o = arguments.length; r < o; r++) + l(arguments[r], t); + return n; + }, + deepMerge: function e() { + var n = {}; + function t(t, r) { + 'object' === typeof n[r] && 'object' === typeof t ? n[r] = e(n[r], t) : n[r] = 'object' === typeof t ? e({}, t) : t; + } + for (var r = 0, o = arguments.length; r < o; r++) + l(arguments[r], t); + return n; + }, + extend: function (e, n, t) { + return l(n, function (n, o) { + e[o] = t && 'function' === typeof n ? r(n, t) : n; + }), e; + }, + trim: function (e) { + return e.replace(/^\s*/, '').replace(/\s*$/, ''); + } + }; + }, + function (e, n, t) { + e.exports = t(20); + }, + function (e, n, t) { + e.exports = t(23); + }, + function (e, n, t) { + 'use strict'; + var r; + Object.defineProperty(n, '__esModule', { value: !0 }), (r = n.RestrictionType || (n.RestrictionType = {}))[r.NOT_ALLOWED = 0] = 'NOT_ALLOWED', r[r.REQUIRE_CONSENT = 1] = 'REQUIRE_CONSENT', r[r.REQUIRE_LI = 2] = 'REQUIRE_LI'; + }, + function (e, n, t) { + 'use strict'; + var r = t(21), o = { + childContextTypes: !0, + contextType: !0, + contextTypes: !0, + defaultProps: !0, + displayName: !0, + getDefaultProps: !0, + getDerivedStateFromError: !0, + getDerivedStateFromProps: !0, + mixins: !0, + propTypes: !0, + type: !0 + }, a = { + name: !0, + length: !0, + prototype: !0, + caller: !0, + callee: !0, + arguments: !0, + arity: !0 + }, i = { + $$typeof: !0, + compare: !0, + defaultProps: !0, + displayName: !0, + propTypes: !0, + type: !0 + }, s = {}; + function c(e) { + return r.isMemo(e) ? i : s[e.$$typeof] || o; + } + s[r.ForwardRef] = { + $$typeof: !0, + render: !0, + defaultProps: !0, + displayName: !0, + propTypes: !0 + }, s[r.Memo] = i; + var l = Object.defineProperty, u = Object.getOwnPropertyNames, p = Object.getOwnPropertySymbols, d = Object.getOwnPropertyDescriptor, f = Object.getPrototypeOf, m = Object.prototype; + e.exports = function e(n, t, r) { + if ('string' !== typeof t) { + if (m) { + var o = f(t); + o && o !== m && e(n, o, r); + } + var i = u(t); + p && (i = i.concat(p(t))); + for (var s = c(n), h = c(t), g = 0; g < i.length; ++g) { + var y = i[g]; + if (!a[y] && (!r || !r[y]) && (!h || !h[y]) && (!s || !s[y])) { + var v = d(t, y); + try { + l(n, y, v); + } catch (b) { + } + } + } + } + return n; + }; + }, + function (e, n) { + function t() { + return e.exports = t = Object.assign || function (e) { + for (var n = 1; n < arguments.length; n++) { + var t = arguments[n]; + for (var r in t) + Object.prototype.hasOwnProperty.call(t, r) && (e[r] = t[r]); + } + return e; + }, t.apply(this, arguments); + } + e.exports = t; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e, n) { + return function () { + for (var t = new Array(arguments.length), r = 0; r < t.length; r++) + t[r] = arguments[r]; + return e.apply(n, t); + }; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + function o(e) { + return encodeURIComponent(e).replace(/%40/gi, '@').replace(/%3A/gi, ':').replace(/%24/g, '$').replace(/%2C/gi, ',').replace(/%20/g, '+').replace(/%5B/gi, '[').replace(/%5D/gi, ']'); + } + e.exports = function (e, n, t) { + if (!n) + return e; + var a; + if (t) + a = t(n); + else if (r.isURLSearchParams(n)) + a = n.toString(); + else { + var i = []; + r.forEach(n, function (e, n) { + null !== e && 'undefined' !== typeof e && (r.isArray(e) ? n += '[]' : e = [e], r.forEach(e, function (e) { + r.isDate(e) ? e = e.toISOString() : r.isObject(e) && (e = JSON.stringify(e)), i.push(o(n) + '=' + o(e)); + })); + }), a = i.join('&'); + } + if (a) { + var s = e.indexOf('#'); + -1 !== s && (e = e.slice(0, s)), e += (-1 === e.indexOf('?') ? '?' : '&') + a; + } + return e; + }; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e) { + return !(!e || !e.__CANCEL__); + }; + }, + function (e, n, t) { + 'use strict'; + (function (n) { + var r = t(0), o = t(29), a = { 'Content-Type': 'application/x-www-form-urlencoded' }; + function i(e, n) { + !r.isUndefined(e) && r.isUndefined(e['Content-Type']) && (e['Content-Type'] = n); + } + var s = { + adapter: function () { + const $___old_ba903ea04472b818 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_ba903ea04472b818) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var e; + return ('undefined' !== typeof XMLHttpRequest || 'undefined' !== typeof n && '[object process]' === Object.prototype.toString.call(n)) && (e = t(10)), e; + }.apply(this, arguments); + } finally { + if ($___old_ba903ea04472b818) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_ba903ea04472b818)); + } + }(), + transformRequest: [function (e, n) { + return o(n, 'Accept'), o(n, 'Content-Type'), r.isFormData(e) || r.isArrayBuffer(e) || r.isBuffer(e) || r.isStream(e) || r.isFile(e) || r.isBlob(e) ? e : r.isArrayBufferView(e) ? e.buffer : r.isURLSearchParams(e) ? (i(n, 'application/x-www-form-urlencoded;charset=utf-8'), e.toString()) : r.isObject(e) ? (i(n, 'application/json;charset=utf-8'), JSON.stringify(e)) : e; + }], + transformResponse: [function (e) { + if ('string' === typeof e) + try { + e = JSON.parse(e); + } catch (n) { + } + return e; + }], + timeout: 0, + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + maxContentLength: -1, + validateStatus: function (e) { + return e >= 200 && e < 300; + }, + headers: { common: { Accept: 'application/json, text/plain, */*' } } + }; + r.forEach([ + 'delete', + 'get', + 'head' + ], function (e) { + s.headers[e] = {}; + }), r.forEach([ + 'post', + 'put', + 'patch' + ], function (e) { + s.headers[e] = r.merge(a); + }), e.exports = s; + }.call(this, t(28))); + }, + function (e, n, t) { + 'use strict'; + var r = t(0), o = t(30), a = t(7), i = t(32), s = t(35), c = t(36), l = t(11); + e.exports = function (e) { + return new Promise(function (n, u) { + const $___old_6ffe521240d4765d = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'), $___old_d087d99d7e79e4c7 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_6ffe521240d4765d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + if ($___old_d087d99d7e79e4c7) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_b3615e3d24fb9d30.XMLHttpRequest)); + return function () { + var p = e.data, d = e.headers; + r.isFormData(p) && delete d['Content-Type']; + var f = new XMLHttpRequest(); + if (e.auth) { + var m = e.auth.username || '', h = e.auth.password || ''; + d.Authorization = 'Basic ' + btoa(m + ':' + h); + } + var g = i(e.baseURL, e.url); + if (f.open(e.method.toUpperCase(), a(g, e.params, e.paramsSerializer), !0), f.timeout = e.timeout, f.onreadystatechange = function () { + if (f && 4 === f.readyState && (0 !== f.status || f.responseURL && 0 === f.responseURL.indexOf('file:'))) { + var t = 'getAllResponseHeaders' in f ? s(f.getAllResponseHeaders()) : null, r = { + data: e.responseType && 'text' !== e.responseType ? f.response : f.responseText, + status: f.status, + statusText: f.statusText, + headers: t, + config: e, + request: f + }; + o(n, u, r), f = null; + } + }, f.onabort = function () { + f && (u(l('Request aborted', e, 'ECONNABORTED', f)), f = null); + }, f.onerror = function () { + u(l('Network Error', e, null, f)), f = null; + }, f.ontimeout = function () { + var n = 'timeout of ' + e.timeout + 'ms exceeded'; + e.timeoutErrorMessage && (n = e.timeoutErrorMessage), u(l(n, e, 'ECONNABORTED', f)), f = null; + }, r.isStandardBrowserEnv()) { + var y = t(37), v = (e.withCredentials || c(g)) && e.xsrfCookieName ? y.read(e.xsrfCookieName) : void 0; + v && (d[e.xsrfHeaderName] = v); + } + if ('setRequestHeader' in f && r.forEach(d, function (e, n) { + 'undefined' === typeof p && 'content-type' === n.toLowerCase() ? delete d[n] : f.setRequestHeader(n, e); + }), r.isUndefined(e.withCredentials) || (f.withCredentials = !!e.withCredentials), e.responseType) + try { + f.responseType = e.responseType; + } catch (b) { + if ('json' !== e.responseType) + throw b; + } + 'function' === typeof e.onDownloadProgress && f.addEventListener('progress', e.onDownloadProgress), 'function' === typeof e.onUploadProgress && f.upload && f.upload.addEventListener('progress', e.onUploadProgress), e.cancelToken && e.cancelToken.promise.then(function (e) { + f && (f.abort(), u(e), f = null); + }), void 0 === p && (p = null), f.send(p); + }.apply(this, arguments); + } finally { + if ($___old_6ffe521240d4765d) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_6ffe521240d4765d)); + if ($___old_d087d99d7e79e4c7) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_d087d99d7e79e4c7)); + } + }); + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(31); + e.exports = function (e, n, t, o, a) { + var i = new Error(e); + return r(i, n, t, o, a); + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + e.exports = function (e, n) { + n = n || {}; + var t = {}, o = [ + 'url', + 'method', + 'params', + 'data' + ], a = [ + 'headers', + 'auth', + 'proxy' + ], i = [ + 'baseURL', + 'url', + 'transformRequest', + 'transformResponse', + 'paramsSerializer', + 'timeout', + 'withCredentials', + 'adapter', + 'responseType', + 'xsrfCookieName', + 'xsrfHeaderName', + 'onUploadProgress', + 'onDownloadProgress', + 'maxContentLength', + 'validateStatus', + 'maxRedirects', + 'httpAgent', + 'httpsAgent', + 'cancelToken', + 'socketPath' + ]; + r.forEach(o, function (e) { + 'undefined' !== typeof n[e] && (t[e] = n[e]); + }), r.forEach(a, function (o) { + r.isObject(n[o]) ? t[o] = r.deepMerge(e[o], n[o]) : 'undefined' !== typeof n[o] ? t[o] = n[o] : r.isObject(e[o]) ? t[o] = r.deepMerge(e[o]) : 'undefined' !== typeof e[o] && (t[o] = e[o]); + }), r.forEach(i, function (r) { + 'undefined' !== typeof n[r] ? t[r] = n[r] : 'undefined' !== typeof e[r] && (t[r] = e[r]); + }); + var s = o.concat(a).concat(i), c = Object.keys(n).filter(function (e) { + return -1 === s.indexOf(e); + }); + return r.forEach(c, function (r) { + 'undefined' !== typeof n[r] ? t[r] = n[r] : 'undefined' !== typeof e[r] && (t[r] = e[r]); + }), t; + }; + }, + function (e, n, t) { + 'use strict'; + function r(e) { + this.message = e; + } + r.prototype.toString = function () { + return 'Cancel' + (this.message ? ': ' + this.message : ''); + }, r.prototype.__CANCEL__ = !0, e.exports = r; + }, + function (e, n) { + }, + function (e, n) { + }, + function (e, n) { + }, + function (e, n) { + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (n, t) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, n) { + e.__proto__ = n; + } || function (e, n) { + for (var t in n) + n.hasOwnProperty(t) && (e[t] = n[t]); + })(n, t); + }; + return function (n, t) { + function r() { + this.constructor = n; + } + e(n, t), n.prototype = null === t ? Object.create(t) : (r.prototype = t.prototype, new r()); + }; + }(); + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = t(40), a = t(41), i = t(3), s = function (e) { + function n(n, t) { + var r = e.call(this) || this; + return void 0 !== n && (r.purposeId = n), void 0 !== t && (r.restrictionType = t), r; + } + return r(n, e), n.unHash = function (e) { + var t = e.split(this.hashSeparator), r = new n(); + if (2 !== t.length) + throw new a.TCModelError('hash', e); + return r.purposeId = parseInt(t[0], 10), r.restrictionType = parseInt(t[1], 10), r; + }, Object.defineProperty(n.prototype, 'hash', { + get: function () { + if (!this.isValid()) + throw new Error('cannot hash invalid PurposeRestriction'); + return '' + this.purposeId + n.hashSeparator + this.restrictionType; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(n.prototype, 'purposeId', { + get: function () { + return this.purposeId_; + }, + set: function (e) { + this.purposeId_ = e; + }, + enumerable: !0, + configurable: !0 + }), n.prototype.isValid = function () { + return Number.isInteger(this.purposeId) && this.purposeId > 0 && (this.restrictionType === i.RestrictionType.NOT_ALLOWED || this.restrictionType === i.RestrictionType.REQUIRE_CONSENT || this.restrictionType === i.RestrictionType.REQUIRE_LI); + }, n.prototype.isSameAs = function (e) { + return this.purposeId === e.purposeId && this.restrictionType === e.restrictionType; + }, n.hashSeparator = '-', n; + }(o.Cloneable); + n.PurposeRestriction = s; + }, + function (e, n, t) { + e.exports = t(47); + }, + function (e, n, t) { + var r = function (e) { + 'use strict'; + var n = Object.prototype, t = n.hasOwnProperty, r = 'function' === typeof Symbol ? Symbol : {}, o = r.iterator || '@@iterator', a = r.asyncIterator || '@@asyncIterator', i = r.toStringTag || '@@toStringTag'; + function s(e, n, t) { + return Object.defineProperty(e, n, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }), e[n]; + } + try { + s({}, ''); + } catch (S) { + s = function (e, n, t) { + return e[n] = t; + }; + } + function c(e, n, t, r) { + var o = n && n.prototype instanceof p ? n : p, a = Object.create(o.prototype), i = new C(r || []); + return a._invoke = function (e, n, t) { + var r = 'suspendedStart'; + return function (o, a) { + if ('executing' === r) + throw new Error('Generator is already running'); + if ('completed' === r) { + if ('throw' === o) + throw a; + return w(); + } + for (t.method = o, t.arg = a;;) { + var i = t.delegate; + if (i) { + var s = _(i, t); + if (s) { + if (s === u) + continue; + return s; + } + } + if ('next' === t.method) + t.sent = t._sent = t.arg; + else if ('throw' === t.method) { + if ('suspendedStart' === r) + throw r = 'completed', t.arg; + t.dispatchException(t.arg); + } else + 'return' === t.method && t.abrupt('return', t.arg); + r = 'executing'; + var c = l(e, n, t); + if ('normal' === c.type) { + if (r = t.done ? 'completed' : 'suspendedYield', c.arg === u) + continue; + return { + value: c.arg, + done: t.done + }; + } + 'throw' === c.type && (r = 'completed', t.method = 'throw', t.arg = c.arg); + } + }; + }(e, t, i), a; + } + function l(e, n, t) { + try { + return { + type: 'normal', + arg: e.call(n, t) + }; + } catch (S) { + return { + type: 'throw', + arg: S + }; + } + } + e.wrap = c; + var u = {}; + function p() { + } + function d() { + } + function f() { + } + var m = {}; + m[o] = function () { + return this; + }; + var h = Object.getPrototypeOf, g = h && h(h(k([]))); + g && g !== n && t.call(g, o) && (m = g); + var y = f.prototype = p.prototype = Object.create(m); + function v(e) { + [ + 'next', + 'throw', + 'return' + ].forEach(function (n) { + s(e, n, function (e) { + return this._invoke(n, e); + }); + }); + } + function b(e, n) { + var r; + this._invoke = function (o, a) { + function i() { + return new n(function (r, i) { + !function r(o, a, i, s) { + var c = l(e[o], e, a); + if ('throw' !== c.type) { + var u = c.arg, p = u.value; + return p && 'object' === typeof p && t.call(p, '__await') ? n.resolve(p.__await).then(function (e) { + r('next', e, i, s); + }, function (e) { + r('throw', e, i, s); + }) : n.resolve(p).then(function (e) { + u.value = e, i(u); + }, function (e) { + return r('throw', e, i, s); + }); + } + s(c.arg); + }(o, a, r, i); + }); + } + return r = r ? r.then(i, i) : i(); + }; + } + function _(e, n) { + var t = e.iterator[n.method]; + if (void 0 === t) { + if (n.delegate = null, 'throw' === n.method) { + if (e.iterator.return && (n.method = 'return', n.arg = void 0, _(e, n), 'throw' === n.method)) + return u; + n.method = 'throw', n.arg = new TypeError('The iterator does not provide a \'throw\' method'); + } + return u; + } + var r = l(t, e.iterator, n.arg); + if ('throw' === r.type) + return n.method = 'throw', n.arg = r.arg, n.delegate = null, u; + var o = r.arg; + return o ? o.done ? (n[e.resultName] = o.value, n.next = e.nextLoc, 'return' !== n.method && (n.method = 'next', n.arg = void 0), n.delegate = null, u) : o : (n.method = 'throw', n.arg = new TypeError('iterator result is not an object'), n.delegate = null, u); + } + function x(e) { + var n = { tryLoc: e[0] }; + 1 in e && (n.catchLoc = e[1]), 2 in e && (n.finallyLoc = e[2], n.afterLoc = e[3]), this.tryEntries.push(n); + } + function E(e) { + var n = e.completion || {}; + n.type = 'normal', delete n.arg, e.completion = n; + } + function C(e) { + this.tryEntries = [{ tryLoc: 'root' }], e.forEach(x, this), this.reset(!0); + } + function k(e) { + if (e) { + var n = e[o]; + if (n) + return n.call(e); + if ('function' === typeof e.next) + return e; + if (!isNaN(e.length)) { + var r = -1, a = function n() { + for (; ++r < e.length;) + if (t.call(e, r)) + return n.value = e[r], n.done = !1, n; + return n.value = void 0, n.done = !0, n; + }; + return a.next = a; + } + } + return { next: w }; + } + function w() { + return { + value: void 0, + done: !0 + }; + } + return d.prototype = y.constructor = f, f.constructor = d, d.displayName = s(f, i, 'GeneratorFunction'), e.isGeneratorFunction = function (e) { + var n = 'function' === typeof e && e.constructor; + return !!n && (n === d || 'GeneratorFunction' === (n.displayName || n.name)); + }, e.mark = function (e) { + return Object.setPrototypeOf ? Object.setPrototypeOf(e, f) : (e.__proto__ = f, s(e, i, 'GeneratorFunction')), e.prototype = Object.create(y), e; + }, e.awrap = function (e) { + return { __await: e }; + }, v(b.prototype), b.prototype[a] = function () { + return this; + }, e.AsyncIterator = b, e.async = function (n, t, r, o, a) { + void 0 === a && (a = Promise); + var i = new b(c(n, t, r, o), a); + return e.isGeneratorFunction(t) ? i : i.next().then(function (e) { + return e.done ? e.value : i.next(); + }); + }, v(y), s(y, i, 'Generator'), y[o] = function () { + return this; + }, y.toString = function () { + return '[object Generator]'; + }, e.keys = function (e) { + var n = []; + for (var t in e) + n.push(t); + return n.reverse(), function t() { + for (; n.length;) { + var r = n.pop(); + if (r in e) + return t.value = r, t.done = !1, t; + } + return t.done = !0, t; + }; + }, e.values = k, C.prototype = { + constructor: C, + reset: function (e) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = void 0, this.done = !1, this.delegate = null, this.method = 'next', this.arg = void 0, this.tryEntries.forEach(E), !e) + for (var n in this) + 't' === n.charAt(0) && t.call(this, n) && !isNaN(+n.slice(1)) && (this[n] = void 0); + }, + stop: function () { + this.done = !0; + var e = this.tryEntries[0].completion; + if ('throw' === e.type) + throw e.arg; + return this.rval; + }, + dispatchException: function (e) { + if (this.done) + throw e; + var n = this; + function r(t, r) { + return i.type = 'throw', i.arg = e, n.next = t, r && (n.method = 'next', n.arg = void 0), !!r; + } + for (var o = this.tryEntries.length - 1; o >= 0; --o) { + var a = this.tryEntries[o], i = a.completion; + if ('root' === a.tryLoc) + return r('end'); + if (a.tryLoc <= this.prev) { + var s = t.call(a, 'catchLoc'), c = t.call(a, 'finallyLoc'); + if (s && c) { + if (this.prev < a.catchLoc) + return r(a.catchLoc, !0); + if (this.prev < a.finallyLoc) + return r(a.finallyLoc); + } else if (s) { + if (this.prev < a.catchLoc) + return r(a.catchLoc, !0); + } else { + if (!c) + throw new Error('try statement without catch or finally'); + if (this.prev < a.finallyLoc) + return r(a.finallyLoc); + } + } + } + }, + abrupt: function (e, n) { + for (var r = this.tryEntries.length - 1; r >= 0; --r) { + var o = this.tryEntries[r]; + if (o.tryLoc <= this.prev && t.call(o, 'finallyLoc') && this.prev < o.finallyLoc) { + var a = o; + break; + } + } + a && ('break' === e || 'continue' === e) && a.tryLoc <= n && n <= a.finallyLoc && (a = null); + var i = a ? a.completion : {}; + return i.type = e, i.arg = n, a ? (this.method = 'next', this.next = a.finallyLoc, u) : this.complete(i); + }, + complete: function (e, n) { + if ('throw' === e.type) + throw e.arg; + return 'break' === e.type || 'continue' === e.type ? this.next = e.arg : 'return' === e.type ? (this.rval = this.arg = e.arg, this.method = 'return', this.next = 'end') : 'normal' === e.type && n && (this.next = n), u; + }, + finish: function (e) { + for (var n = this.tryEntries.length - 1; n >= 0; --n) { + var t = this.tryEntries[n]; + if (t.finallyLoc === e) + return this.complete(t.completion, t.afterLoc), E(t), u; + } + }, + catch: function (e) { + for (var n = this.tryEntries.length - 1; n >= 0; --n) { + var t = this.tryEntries[n]; + if (t.tryLoc === e) { + var r = t.completion; + if ('throw' === r.type) { + var o = r.arg; + E(t); + } + return o; + } + } + throw new Error('illegal catch attempt'); + }, + delegateYield: function (e, n, t) { + return this.delegate = { + iterator: k(e), + resultName: n, + nextLoc: t + }, 'next' === this.method && (this.arg = void 0), u; + } + }, e; + }(e.exports); + try { + regeneratorRuntime = r; + } catch (o) { + Function('r', 'regeneratorRuntime = r')(r); + } + }, + function (e, n, t) { + 'use strict'; + e.exports = t(22); + }, + function (e, n, t) { + 'use strict'; + var r = 'function' === typeof Symbol && Symbol.for, o = r ? Symbol.for('react.element') : 60103, a = r ? Symbol.for('react.portal') : 60106, i = r ? Symbol.for('react.fragment') : 60107, s = r ? Symbol.for('react.strict_mode') : 60108, c = r ? Symbol.for('react.profiler') : 60114, l = r ? Symbol.for('react.provider') : 60109, u = r ? Symbol.for('react.context') : 60110, p = r ? Symbol.for('react.async_mode') : 60111, d = r ? Symbol.for('react.concurrent_mode') : 60111, f = r ? Symbol.for('react.forward_ref') : 60112, m = r ? Symbol.for('react.suspense') : 60113, h = r ? Symbol.for('react.suspense_list') : 60120, g = r ? Symbol.for('react.memo') : 60115, y = r ? Symbol.for('react.lazy') : 60116, v = r ? Symbol.for('react.block') : 60121, b = r ? Symbol.for('react.fundamental') : 60117, _ = r ? Symbol.for('react.responder') : 60118, x = r ? Symbol.for('react.scope') : 60119; + function E(e) { + if ('object' === typeof e && null !== e) { + var n = e.$$typeof; + switch (n) { + case o: + switch (e = e.type) { + case p: + case d: + case i: + case c: + case s: + case m: + return e; + default: + switch (e = e && e.$$typeof) { + case u: + case f: + case y: + case g: + case l: + return e; + default: + return n; + } + } + case a: + return n; + } + } + } + function C(e) { + return E(e) === d; + } + n.AsyncMode = p, n.ConcurrentMode = d, n.ContextConsumer = u, n.ContextProvider = l, n.Element = o, n.ForwardRef = f, n.Fragment = i, n.Lazy = y, n.Memo = g, n.Portal = a, n.Profiler = c, n.StrictMode = s, n.Suspense = m, n.isAsyncMode = function (e) { + return C(e) || E(e) === p; + }, n.isConcurrentMode = C, n.isContextConsumer = function (e) { + return E(e) === u; + }, n.isContextProvider = function (e) { + return E(e) === l; + }, n.isElement = function (e) { + return 'object' === typeof e && null !== e && e.$$typeof === o; + }, n.isForwardRef = function (e) { + return E(e) === f; + }, n.isFragment = function (e) { + return E(e) === i; + }, n.isLazy = function (e) { + return E(e) === y; + }, n.isMemo = function (e) { + return E(e) === g; + }, n.isPortal = function (e) { + return E(e) === a; + }, n.isProfiler = function (e) { + return E(e) === c; + }, n.isStrictMode = function (e) { + return E(e) === s; + }, n.isSuspense = function (e) { + return E(e) === m; + }, n.isValidElementType = function (e) { + return 'string' === typeof e || 'function' === typeof e || e === i || e === d || e === c || e === s || e === m || e === h || 'object' === typeof e && null !== e && (e.$$typeof === y || e.$$typeof === g || e.$$typeof === l || e.$$typeof === u || e.$$typeof === f || e.$$typeof === b || e.$$typeof === _ || e.$$typeof === x || e.$$typeof === v); + }, n.typeOf = E; + }, + function (e, n, t) { + 'use strict'; + var r = t(0), o = t(6), a = t(24), i = t(12); + function s(e) { + var n = new a(e), t = o(a.prototype.request, n); + return r.extend(t, a.prototype, n), r.extend(t, n), t; + } + var c = s(t(9)); + c.Axios = a, c.create = function (e) { + return s(i(c.defaults, e)); + }, c.Cancel = t(13), c.CancelToken = t(38), c.isCancel = t(8), c.all = function (e) { + return Promise.all(e); + }, c.spread = t(39), e.exports = c, e.exports.default = c; + }, + function (e, n, t) { + 'use strict'; + var r = t(0), o = t(7), a = t(25), i = t(26), s = t(12); + function c(e) { + this.defaults = e, this.interceptors = { + request: new a(), + response: new a() + }; + } + c.prototype.request = function (e) { + 'string' === typeof e ? (e = arguments[1] || {}).url = arguments[0] : e = e || {}, (e = s(this.defaults, e)).method ? e.method = e.method.toLowerCase() : this.defaults.method ? e.method = this.defaults.method.toLowerCase() : e.method = 'get'; + var n = [ + i, + void 0 + ], t = Promise.resolve(e); + for (this.interceptors.request.forEach(function (e) { + n.unshift(e.fulfilled, e.rejected); + }), this.interceptors.response.forEach(function (e) { + n.push(e.fulfilled, e.rejected); + }); n.length;) + t = t.then(n.shift(), n.shift()); + return t; + }, c.prototype.getUri = function (e) { + return e = s(this.defaults, e), o(e.url, e.params, e.paramsSerializer).replace(/^\?/, ''); + }, r.forEach([ + 'delete', + 'get', + 'head', + 'options' + ], function (e) { + c.prototype[e] = function (n, t) { + return this.request(r.merge(t || {}, { + method: e, + url: n + })); + }; + }), r.forEach([ + 'post', + 'put', + 'patch' + ], function (e) { + c.prototype[e] = function (n, t, o) { + return this.request(r.merge(o || {}, { + method: e, + url: n, + data: t + })); + }; + }), e.exports = c; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + function o() { + this.handlers = []; + } + o.prototype.use = function (e, n) { + return this.handlers.push({ + fulfilled: e, + rejected: n + }), this.handlers.length - 1; + }, o.prototype.eject = function (e) { + this.handlers[e] && (this.handlers[e] = null); + }, o.prototype.forEach = function (e) { + r.forEach(this.handlers, function (n) { + null !== n && e(n); + }); + }, e.exports = o; + }, + function (e, n, t) { + 'use strict'; + var r = t(0), o = t(27), a = t(8), i = t(9); + function s(e) { + e.cancelToken && e.cancelToken.throwIfRequested(); + } + e.exports = function (e) { + return s(e), e.headers = e.headers || {}, e.data = o(e.data, e.headers, e.transformRequest), e.headers = r.merge(e.headers.common || {}, e.headers[e.method] || {}, e.headers), r.forEach([ + 'delete', + 'get', + 'head', + 'post', + 'put', + 'patch', + 'common' + ], function (n) { + delete e.headers[n]; + }), (e.adapter || i.adapter)(e).then(function (n) { + return s(e), n.data = o(n.data, n.headers, e.transformResponse), n; + }, function (n) { + return a(n) || (s(e), n && n.response && (n.response.data = o(n.response.data, n.response.headers, e.transformResponse))), Promise.reject(n); + }); + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + e.exports = function (e, n, t) { + return r.forEach(t, function (t) { + e = t(e, n); + }), e; + }; + }, + function (e, n) { + var t, r, o = e.exports = {}; + function a() { + throw new Error('setTimeout has not been defined'); + } + function i() { + throw new Error('clearTimeout has not been defined'); + } + function s(e) { + if (t === setTimeout) + return setTimeout(e, 0); + if ((t === a || !t) && setTimeout) + return t = setTimeout, setTimeout(e, 0); + try { + return t(e, 0); + } catch (n) { + try { + return t.call(null, e, 0); + } catch (n) { + return t.call(this, e, 0); + } + } + } + !function () { + try { + t = 'function' === typeof setTimeout ? setTimeout : a; + } catch (e) { + t = a; + } + try { + r = 'function' === typeof clearTimeout ? clearTimeout : i; + } catch (e) { + r = i; + } + }(); + var c, l = [], u = !1, p = -1; + function d() { + u && c && (u = !1, c.length ? l = c.concat(l) : p = -1, l.length && f()); + } + function f() { + if (!u) { + var e = s(d); + u = !0; + for (var n = l.length; n;) { + for (c = l, l = []; ++p < n;) + c && c[p].run(); + p = -1, n = l.length; + } + c = null, u = !1, function (e) { + if (r === clearTimeout) + return clearTimeout(e); + if ((r === i || !r) && clearTimeout) + return r = clearTimeout, clearTimeout(e); + try { + r(e); + } catch (n) { + try { + return r.call(null, e); + } catch (n) { + return r.call(this, e); + } + } + }(e); + } + } + function m(e, n) { + this.fun = e, this.array = n; + } + function h() { + } + o.nextTick = function (e) { + var n = new Array(arguments.length - 1); + if (arguments.length > 1) + for (var t = 1; t < arguments.length; t++) + n[t - 1] = arguments[t]; + l.push(new m(e, n)), 1 !== l.length || u || s(f); + }, m.prototype.run = function () { + this.fun.apply(null, this.array); + }, o.title = 'browser', o.browser = !0, o.env = {}, o.argv = [], o.version = '', o.versions = {}, o.on = h, o.addListener = h, o.once = h, o.off = h, o.removeListener = h, o.removeAllListeners = h, o.emit = h, o.prependListener = h, o.prependOnceListener = h, o.listeners = function (e) { + return []; + }, o.binding = function (e) { + throw new Error('process.binding is not supported'); + }, o.cwd = function () { + return '/'; + }, o.chdir = function (e) { + throw new Error('process.chdir is not supported'); + }, o.umask = function () { + return 0; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + e.exports = function (e, n) { + r.forEach(e, function (t, r) { + r !== n && r.toUpperCase() === n.toUpperCase() && (e[n] = t, delete e[r]); + }); + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(11); + e.exports = function (e, n, t) { + var o = t.config.validateStatus; + !o || o(t.status) ? e(t) : n(r('Request failed with status code ' + t.status, t.config, null, t.request, t)); + }; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e, n, t, r, o) { + return e.config = n, t && (e.code = t), e.request = r, e.response = o, e.isAxiosError = !0, e.toJSON = function () { + return { + message: this.message, + name: this.name, + description: this.description, + number: this.number, + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + config: this.config, + code: this.code + }; + }, e; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(33), o = t(34); + e.exports = function (e, n) { + return e && !r(n) ? o(e, n) : n; + }; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e) { + return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e); + }; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e, n) { + return n ? e.replace(/\/+$/, '') + '/' + n.replace(/^\/+/, '') : e; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0), o = [ + 'age', + 'authorization', + 'content-length', + 'content-type', + 'etag', + 'expires', + 'from', + 'host', + 'if-modified-since', + 'if-unmodified-since', + 'last-modified', + 'location', + 'max-forwards', + 'proxy-authorization', + 'referer', + 'retry-after', + 'user-agent' + ]; + e.exports = function (e) { + var n, t, a, i = {}; + return e ? (r.forEach(e.split('\n'), function (e) { + if (a = e.indexOf(':'), n = r.trim(e.substr(0, a)).toLowerCase(), t = r.trim(e.substr(a + 1)), n) { + if (i[n] && o.indexOf(n) >= 0) + return; + i[n] = 'set-cookie' === n ? (i[n] ? i[n] : []).concat([t]) : i[n] ? i[n] + ', ' + t : t; + } + }), i) : i; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + e.exports = r.isStandardBrowserEnv() ? function () { + var e, n = /(msie|trident)/i.test(navigator.userAgent), t = document.createElement('a'); + function o(e) { + var r = e; + return n && (t.setAttribute('href', r), r = t.href), t.setAttribute('href', r), { + href: t.href, + protocol: t.protocol ? t.protocol.replace(/:$/, '') : '', + host: t.host, + search: t.search ? t.search.replace(/^\?/, '') : '', + hash: t.hash ? t.hash.replace(/^#/, '') : '', + hostname: t.hostname, + port: t.port, + pathname: '/' === t.pathname.charAt(0) ? t.pathname : '/' + t.pathname + }; + } + return e = o(window.location.href), function (n) { + var t = r.isString(n) ? o(n) : n; + return t.protocol === e.protocol && t.host === e.host; + }; + }() : function () { + return !0; + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(0); + e.exports = r.isStandardBrowserEnv() ? { + write: function (e, n, t, o, a, i) { + var s = []; + s.push(e + '=' + encodeURIComponent(n)), r.isNumber(t) && s.push('expires=' + new Date(t).toGMTString()), r.isString(o) && s.push('path=' + o), r.isString(a) && s.push('domain=' + a), !0 === i && s.push('secure'), document.cookie = s.join('; '); + }, + read: function (e) { + var n = document.cookie.match(new RegExp('(^|;\\s*)(' + e + ')=([^;]*)')); + return n ? decodeURIComponent(n[3]) : null; + }, + remove: function (e) { + this.write(e, '', Date.now() - 86400000); + } + } : { + write: function () { + }, + read: function () { + return null; + }, + remove: function () { + } + }; + }, + function (e, n, t) { + 'use strict'; + var r = t(13); + function o(e) { + if ('function' !== typeof e) + throw new TypeError('executor must be a function.'); + var n; + this.promise = new Promise(function (e) { + n = e; + }); + var t = this; + e(function (e) { + t.reason || (t.reason = new r(e), n(t.reason)); + }); + } + o.prototype.throwIfRequested = function () { + if (this.reason) + throw this.reason; + }, o.source = function () { + var e; + return { + token: new o(function (n) { + e = n; + }), + cancel: e + }; + }, e.exports = o; + }, + function (e, n, t) { + 'use strict'; + e.exports = function (e) { + return function (n) { + return e.apply(null, n); + }; + }; + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__values || function (e) { + var n = 'function' == typeof Symbol && Symbol.iterator, t = n && e[n], r = 0; + if (t) + return t.call(e); + if (e && 'number' == typeof e.length) + return { + next: function () { + return e && r >= e.length && (e = void 0), { + value: e && e[r++], + done: !e + }; + } + }; + throw new TypeError(n ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }; + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = function () { + function e() { + } + return e.prototype.clone = function () { + var e = this, n = new this.constructor(); + return Object.keys(this).forEach(function (t) { + var r = e.deepClone(e[t]); + void 0 !== r && (n[t] = r); + }), n; + }, e.prototype.deepClone = function (e) { + var n, t, o = typeof e; + if ('number' === o || 'string' === o || 'boolean' === o) + return e; + if (null !== e && 'object' === o) { + if ('function' == typeof e.clone) + return e.clone(); + if (e instanceof Date) + return new Date(e.getTime()); + if (void 0 !== e[Symbol.iterator]) { + var a = []; + try { + for (var i = r(e), s = i.next(); !s.done; s = i.next()) { + var c = s.value; + a.push(this.deepClone(c)); + } + } catch (e) { + n = { error: e }; + } finally { + try { + s && !s.done && (t = i.return) && t.call(i); + } finally { + if (n) + throw n.error; + } + } + return e instanceof Array ? a : new e.constructor(a); + } + var l = {}; + for (var u in e) + e.hasOwnProperty(u) && (l[u] = this.deepClone(e[u])); + return l; + } + }, e; + }(); + n.Cloneable = o; + }, + function (e, n, t) { + 'use strict'; + function r(e) { + for (var t in e) + n.hasOwnProperty(t) || (n[t] = e[t]); + } + Object.defineProperty(n, '__esModule', { value: !0 }), r(t(42)), r(t(43)), r(t(44)), r(t(45)); + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (n, t) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, n) { + e.__proto__ = n; + } || function (e, n) { + for (var t in n) + n.hasOwnProperty(t) && (e[t] = n[t]); + })(n, t); + }; + return function (n, t) { + function r() { + this.constructor = n; + } + e(n, t), n.prototype = null === t ? Object.create(t) : (r.prototype = t.prototype, new r()); + }; + }(); + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = function (e) { + function n(n) { + var t = e.call(this, n) || this; + return t.name = 'DecodingError', t; + } + return r(n, e), n; + }(Error); + n.DecodingError = o; + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (n, t) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, n) { + e.__proto__ = n; + } || function (e, n) { + for (var t in n) + n.hasOwnProperty(t) && (e[t] = n[t]); + })(n, t); + }; + return function (n, t) { + function r() { + this.constructor = n; + } + e(n, t), n.prototype = null === t ? Object.create(t) : (r.prototype = t.prototype, new r()); + }; + }(); + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = function (e) { + function n(n) { + var t = e.call(this, n) || this; + return t.name = 'EncodingError', t; + } + return r(n, e), n; + }(Error); + n.EncodingError = o; + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (n, t) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, n) { + e.__proto__ = n; + } || function (e, n) { + for (var t in n) + n.hasOwnProperty(t) && (e[t] = n[t]); + })(n, t); + }; + return function (n, t) { + function r() { + this.constructor = n; + } + e(n, t), n.prototype = null === t ? Object.create(t) : (r.prototype = t.prototype, new r()); + }; + }(); + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = function (e) { + function n(n) { + var t = e.call(this, n) || this; + return t.name = 'GVLError', t; + } + return r(n, e), n; + }(Error); + n.GVLError = o; + }, + function (e, n, t) { + 'use strict'; + var r = this && this.__extends || function () { + var e = function (n, t) { + return (e = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (e, n) { + e.__proto__ = n; + } || function (e, n) { + for (var t in n) + n.hasOwnProperty(t) && (e[t] = n[t]); + })(n, t); + }; + return function (n, t) { + function r() { + this.constructor = n; + } + e(n, t), n.prototype = null === t ? Object.create(t) : (r.prototype = t.prototype, new r()); + }; + }(); + Object.defineProperty(n, '__esModule', { value: !0 }); + var o = function (e) { + function n(n, t, r) { + void 0 === r && (r = ''); + var o = e.call(this, 'invalid value ' + t + ' passed for ' + n + ' ' + r) || this; + return o.name = 'TCModelError', o; + } + return r(n, e), n; + }(Error); + n.TCModelError = o; + }, + function (e) { + e.exports = JSON.parse('{"Parent":{"Child":"English"},"coreUiLabels":{"initScreenTitle":"We value your privacy","agreeButton":"AGREE","agreeAllButton":"AGREE TO ALL","initScreenRejectButton":"DISAGREE","initScreenSettingsButton":"MORE OPTIONS","summaryScreenBodyNoRejectService":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy.\\n"],"summaryScreenBodyNoRejectGlobal":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply across the web. You can change your preferences at any time by returning to this site or visit our privacy policy."],"summaryScreenBodyNoRejectGroup":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may access more detailed information and change your preferences before consenting or to refuse consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites. You can change your preferences at any time by returning to this site or visit our privacy policy."],"summaryScreenBodyRejectService":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this website only. You can change your preferences at any time by returning to this site or visit our privacy policy."],"summaryScreenBodyRejectGlobal":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning.You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply across the web.You can change your preferences at any time by returning to this site or visit our privacy policy."],"summaryScreenBodyRejectGroup":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to a group of websites. You can change your preferences at any time by returning to this site or visit our privacy policy."],"initScreenBodyGlobal":"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information to change your preferences before consenting. Your preferences will apply across the web. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.","initScreenBodyService":"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to this website only. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.","initScreenBodyGroup":"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to a group of websites. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this site or visit our privacy policy.","specialPurposesAndFeatures":"Special Purposes and Features","saveAndExitButton":"SAVE & EXIT","agreeToSelectedButton":"AGREE TO SELECTED","purposeScreenVendorLink":"PARTNERS","legitimateInterestLink":"LEGITIMATE INTEREST ","specialPurposesLabel":"Special Purposes","specialFeaturesLabel":"Special Features","featuresLabel":"Features","back":"Back","onLabel":"ON","offLabel":"OFF","multiLabel":"MULTI","legalDescription":"Legal Description","showPartners":"Show Partners","hidePartners":"Hide Partners","vendorScreenBody":"Review and set your consent preferences for each partner below. Expand each partner list item for more information to help make your choice. Some personal data is processed without your consent, but you have the right to object.","privacyPolicyLabel":"Privacy Policy","descriptionLabel":"Vendor Description","legitimateScreenBody":"Review and object to processing of personal data without your consent on the basis of a legitimate interest for each purpose and by each partner below. Expand each purpose or partner list item for more information to help make your choice. To object to the special purposes of ensuring security, preventing fraud, and debugging, and technically delivering ads or content click on a partner\'s privacy policy link.","legitimateInterestPurposesLabel":"Legitimate Interest Purpose(s)","legitimateInterestVendorLabel":"Legitimate Interest Vendors","legitimateScreenObject":"OBJECT","legitimateScreenObjected":"OBJECTED","legitimateScreenAccept":"REMOVE OBJECTION","objectAllButton":"OBJECT ALL","persistentConsentLinkLabel":"Privacy","nonIabVendorsNotice":"Vendors who do not participate in the IAB Europe Transparency and Consent Framework and do not adhere to its policies or technical specifications","googlePartners":"Google Partners","purposesLabel":"Purposes","groupOfSitesLabel":"group of websites","acceptAll":"ACCEPT ALL","rejectAll":"REJECT ALL","cookieMaxAgeLabel":"Cookie max age","secondsLabel":"Seconds","storageDisclosureLabel":"Storage disclosure","cookieAccessLabel":"Uses non cookie access","yesLabel":"Yes","noLabel":"No","daysLabel":"Days"},"premiumUiLabels":{"linksTitle":"Additional Links","nonIabVendorsLabel":"Non-IAB Vendors","uspAcceptButton":"CONFIRM","uspAccessDataLinkText":"Data Access","uspDeleteDataLinkText":"Data Deletion","uspDnsTitle":"Do Not Sell My Personal Information","uspDoNotSellToggleText":"I want to request that you \u2018Do Not Sell My Personal Information\u2019","uspPrivacyPolicyLinkText":"Privacy Policy","uspDnsText":"

When you visit this website, we collect personal information such as IP addresses, cookie identifiers and other pseudonymous identifiers. This information may be used to personalize content based on your interests, run and optimize advertising campaigns tailored to you, measure the performance of ads and content, and derive insights about the audiences who engage with ads and content. This information may also be disclosed by us to third parties on the IAB\u2019s List of Downstream Participants that may further disclose it to other third parties.

Using personal information as described above is an integral part of how we operate our website, make revenue to support our staff, and generate relevant content for our audience. You can learn more about our data collection and use practices in our Privacy Policy.


If you wish to opt out of the disclosure of your personal information to third parties by us, please use the below opt out and confirm your selection. Please note that after your opt out request is processed, you may continue seeing interest–based ads based on personal Information utilized by us or personal information disclosed to third parties prior to your opt out. You may separately opt out of the further disclosure of your personal information by third parties on the IAB\u2019s List of Downstream Participants.

"},"mobileUiLabels":{"doneLabel":"Done","searchLabel":"Search","cancelLabel":"Cancel","showVendorsLabel":"Show all vendors","showIabLabel":"Show IAB vendors","consentLabel":"Consent","flexPurposesLabel":"Flexible purposes","cookieAccessBodyText":"We and our partners store or access information on devices, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for the purposes described below. You may click to consent to our and our partners\u2019 processing for such purposes. Alternatively, you may click to refuse to consent, or access more detailed information and change your preferences before consenting. Your preferences will apply to this app only. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. You can change your preferences at any time by returning to this app or visit our privacy policy.","noneLabel":"None","someLabel":"Some","allLabel":"All","closeLabel":"Close","allVendorsLabel":"All","summaryScreenBodyRejectService":["We and our partners store and/or access information on a device, such as cookies and process personal data, such as unique identifiers and standard information sent by a device for personalised ads and content, ad and content measurement, and audience insights, as well as to develop and improve products.","With your permission we and our partners may use precise geolocation data and identification through device scanning. You may click to consent to our and our partners\u2019 processing as described above. Alternatively you may click to refuse to consent or access more detailed information and change your preferences before consenting. Please note that some processing of your personal data may not require your consent, but you have a right to object to such processing. Your preferences will apply to this app only. You can change your preferences at any time by returning to this app or visit our privacy policy."]}}'); + }, + function (e, n, t) { + 'use strict'; + function r(e, n) { + (null == n || n > e.length) && (n = e.length); + for (var t = 0, r = new Array(n); t < n; t++) + r[t] = e[t]; + return r; + } + function o(e) { + if ('undefined' !== typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + } + function a(e, n) { + if (e) { + if ('string' === typeof e) + return r(e, n); + var t = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === t && e.constructor && (t = e.constructor.name), 'Map' === t || 'Set' === t ? Array.from(t) : 'Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? r(e, n) : void 0; + } + } + function i(e) { + return function (e) { + if (Array.isArray(e)) + return r(e); + }(e) || o(e) || a(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function s(e) { + if (Array.isArray(e)) + return e; + } + function c() { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + function l(e) { + if ('undefined' === typeof Symbol || null == e[Symbol.iterator]) { + if (Array.isArray(e) || (e = a(e))) { + var n = 0, t = function () { + }; + return { + s: t, + n: function () { + return n >= e.length ? { done: !0 } : { + done: !1, + value: e[n++] + }; + }, + e: function (e) { + throw e; + }, + f: t + }; + } + throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + var r, o, i = !0, s = !1; + return { + s: function () { + r = e[Symbol.iterator](); + }, + n: function () { + var e = r.next(); + return i = e.done, e; + }, + e: function (e) { + s = !0, o = e; + }, + f: function () { + try { + i || null == r.return || r.return(); + } finally { + if (s) + throw o; + } + } + }; + } + function u(e, n) { + if (!(e instanceof n)) + throw new TypeError('Cannot call a class as a function'); + } + function p(e, n) { + for (var t = 0; t < n.length; t++) { + var r = n[t]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + function d(e, n, t) { + return n && p(e.prototype, n), t && p(e, t), e; + } + t.r(n), t.d(n, 'cmpApiUi', function () { + return wa; + }); + var f = parseInt(''.concat('32')), m = [ + 0, + 1, + 2, + 3 + ], h = Number.isNaN(f) ? 1 : f; + function g(e, n) { + return s(e) || function (e, n) { + if ('undefined' !== typeof Symbol && Symbol.iterator in Object(e)) { + var t = [], r = !0, o = !1, a = void 0; + try { + for (var i, s = e[Symbol.iterator](); !(r = (i = s.next()).done) && (t.push(i.value), !n || t.length !== n); r = !0); + } catch (c) { + o = !0, a = c; + } finally { + try { + r || null == s.return || s.return(); + } finally { + if (o) + throw a; + } + } + return t; + } + }(e, n) || a(e, n) || c(); + } + function y(e, n, t) { + return n in e ? Object.defineProperty(e, n, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[n] = t, e; + } + function v(e, n) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(e); + n && (r = r.filter(function (n) { + return Object.getOwnPropertyDescriptor(e, n).enumerable; + })), t.push.apply(t, r); + } + return t; + } + function b(e) { + for (var n = 1; n < arguments.length; n++) { + var t = null != arguments[n] ? arguments[n] : {}; + n % 2 ? v(Object(t), !0).forEach(function (n) { + y(e, n, t[n]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : v(Object(t)).forEach(function (n) { + Object.defineProperty(e, n, Object.getOwnPropertyDescriptor(t, n)); + }); + } + return e; + } + var _, x, E, C, k, w = {}, S = [], L = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i; + function P(e, n) { + for (var t in n) + e[t] = n[t]; + return e; + } + function T(e) { + var n = e.parentNode; + n && n.removeChild(e); + } + function q(e, n, t) { + var r, o, a, i = arguments, s = {}; + for (a in n) + 'key' == a ? r = n[a] : 'ref' == a ? o = n[a] : s[a] = n[a]; + if (arguments.length > 3) + for (t = [t], a = 3; a < arguments.length; a++) + t.push(i[a]); + if (null != t && (s.children = t), 'function' == typeof e && null != e.defaultProps) + for (a in e.defaultProps) + void 0 === s[a] && (s[a] = e.defaultProps[a]); + return A(e, s, r, o, null); + } + function A(e, n, t, r, o) { + var a = { + type: e, + props: n, + key: t, + ref: r, + __k: null, + __: null, + __b: 0, + __e: null, + __d: void 0, + __c: null, + __h: null, + constructor: void 0, + __v: null == o ? ++_.__v : o + }; + return null != _.vnode && _.vnode(a), a; + } + function I(e) { + return e.children; + } + function O(e, n) { + this.props = e, this.context = n; + } + function N(e, n) { + if (null == n) + return e.__ ? N(e.__, e.__.__k.indexOf(e) + 1) : null; + for (var t; n < e.__k.length; n++) + if (null != (t = e.__k[n]) && null != t.__e) + return t.__e; + return 'function' == typeof e.type ? N(e) : null; + } + function R(e) { + var n, t; + if (null != (e = e.__) && null != e.__c) { + for (e.__e = e.__c.base = null, n = 0; n < e.__k.length; n++) + if (null != (t = e.__k[n]) && null != t.__e) { + e.__e = e.__c.base = t.__e; + break; + } + return R(e); + } + } + function U(e) { + (!e.__d && (e.__d = !0) && x.push(e) && !D.__r++ || C !== _.debounceRendering) && ((C = _.debounceRendering) || E)(D); + } + function D() { + for (var e; D.__r = x.length;) + e = x.sort(function (e, n) { + return e.__v.__b - n.__v.__b; + }), x = [], e.some(function (e) { + var n, t, r, o, a, i; + e.__d && (a = (o = (n = e).__v).__e, (i = n.__P) && (t = [], (r = P({}, o)).__v = o.__v + 1, $(i, o, r, n.__n, void 0 !== i.ownerSVGElement, null != o.__h ? [a] : null, t, null == a ? N(o) : a, o.__h), Y(t, o), o.__e != a && R(o))); + }); + } + function B(e, n, t, r, o, a, i, s, c, l) { + var u, p, d, f, m, h, g, y = r && r.__k || S, v = y.length; + for (t.__k = [], u = 0; u < n.length; u++) + if (null != (f = t.__k[u] = null == (f = n[u]) || 'boolean' == typeof f ? null : 'string' == typeof f || 'number' == typeof f || 'bigint' == typeof f ? A(null, f, null, null, f) : Array.isArray(f) ? A(I, { children: f }, null, null, null) : f.__b > 0 ? A(f.type, f.props, f.key, null, f.__v) : f)) { + if (f.__ = t, f.__b = t.__b + 1, null === (d = y[u]) || d && f.key == d.key && f.type === d.type) + y[u] = void 0; + else + for (p = 0; p < v; p++) { + if ((d = y[p]) && f.key == d.key && f.type === d.type) { + y[p] = void 0; + break; + } + d = null; + } + $(e, f, d = d || w, o, a, i, s, c, l), m = f.__e, (p = f.ref) && d.ref != p && (g || (g = []), d.ref && g.push(d.ref, null, f), g.push(p, f.__c || m, f)), null != m ? (null == h && (h = m), 'function' == typeof f.type && null != f.__k && f.__k === d.__k ? f.__d = c = j(f, c, e) : c = V(e, f, d, y, m, c), l || 'option' !== t.type ? 'function' == typeof t.type && (t.__d = c) : e.value = '') : c && d.__e == c && c.parentNode != e && (c = N(d)); + } + for (t.__e = h, u = v; u--;) + null != y[u] && ('function' == typeof t.type && null != y[u].__e && y[u].__e == t.__d && (t.__d = N(r, u + 1)), X(y[u], y[u])); + if (g) + for (u = 0; u < g.length; u++) + J(g[u], g[++u], g[++u]); + } + function j(e, n, t) { + var r, o; + for (r = 0; r < e.__k.length; r++) + (o = e.__k[r]) && (o.__ = e, n = 'function' == typeof o.type ? j(o, n, t) : V(t, o, o, e.__k, o.__e, n)); + return n; + } + function F(e, n) { + return n = n || [], null == e || 'boolean' == typeof e || (Array.isArray(e) ? e.some(function (e) { + F(e, n); + }) : n.push(e)), n; + } + function V(e, n, t, r, o, a) { + var i, s, c; + if (void 0 !== n.__d) + i = n.__d, n.__d = void 0; + else if (null == t || o != a || null == o.parentNode) + e: + if (null == a || a.parentNode !== e) + e.appendChild(o), i = null; + else { + for (s = a, c = 0; (s = s.nextSibling) && c < r.length; c += 2) + if (s == o) + break e; + e.insertBefore(o, a), i = a; + } + return void 0 !== i ? i : o.nextSibling; + } + function G(e, n, t) { + '-' === n[0] ? e.setProperty(n, t) : e[n] = null == t ? '' : 'number' != typeof t || L.test(n) ? t : t + 'px'; + } + function M(e, n, t, r, o) { + var a; + e: + if ('style' === n) + if ('string' == typeof t) + e.style.cssText = t; + else { + if ('string' == typeof r && (e.style.cssText = r = ''), r) + for (n in r) + t && n in t || G(e.style, n, ''); + if (t) + for (n in t) + r && t[n] === r[n] || G(e.style, n, t[n]); + } + else if ('o' === n[0] && 'n' === n[1]) + a = n !== (n = n.replace(/Capture$/, '')), n = n.toLowerCase() in e ? n.toLowerCase().slice(2) : n.slice(2), e.l || (e.l = {}), e.l[n + a] = t, t ? r || e.addEventListener(n, a ? H : z, a) : e.removeEventListener(n, a ? H : z, a); + else if ('dangerouslySetInnerHTML' !== n) { + if (o) + n = n.replace(/xlink[H:h]/, 'h').replace(/sName$/, 's'); + else if ('href' !== n && 'list' !== n && 'form' !== n && 'tabIndex' !== n && 'download' !== n && n in e) + try { + e[n] = null == t ? '' : t; + break e; + } catch (e) { + } + 'function' == typeof t || (null != t && (!1 !== t || 'a' === n[0] && 'r' === n[1]) ? e.setAttribute(n, t) : e.removeAttribute(n)); + } + } + function z(e) { + this.l[e.type + !1](_.event ? _.event(e) : e); + } + function H(e) { + this.l[e.type + !0](_.event ? _.event(e) : e); + } + function $(e, n, t, r, o, a, i, s, c) { + var l, u, p, d, f, m, h, g, y, v, b, x = n.type; + if (void 0 !== n.constructor) + return null; + null != t.__h && (c = t.__h, s = n.__e = t.__e, n.__h = null, a = [s]), (l = _.__b) && l(n); + try { + e: + if ('function' == typeof x) { + if (g = n.props, y = (l = x.contextType) && r[l.__c], v = l ? y ? y.props.value : l.__ : r, t.__c ? h = (u = n.__c = t.__c).__ = u.__E : ('prototype' in x && x.prototype.render ? n.__c = u = new x(g, v) : (n.__c = u = new O(g, v), u.constructor = x, u.render = K), y && y.sub(u), u.props = g, u.state || (u.state = {}), u.context = v, u.__n = r, p = u.__d = !0, u.__h = []), null == u.__s && (u.__s = u.state), null != x.getDerivedStateFromProps && (u.__s == u.state && (u.__s = P({}, u.__s)), P(u.__s, x.getDerivedStateFromProps(g, u.__s))), d = u.props, f = u.state, p) + null == x.getDerivedStateFromProps && null != u.componentWillMount && u.componentWillMount(), null != u.componentDidMount && u.__h.push(u.componentDidMount); + else { + if (null == x.getDerivedStateFromProps && g !== d && null != u.componentWillReceiveProps && u.componentWillReceiveProps(g, v), !u.__e && null != u.shouldComponentUpdate && !1 === u.shouldComponentUpdate(g, u.__s, v) || n.__v === t.__v) { + u.props = g, u.state = u.__s, n.__v !== t.__v && (u.__d = !1), u.__v = n, n.__e = t.__e, n.__k = t.__k, n.__k.forEach(function (e) { + e && (e.__ = n); + }), u.__h.length && i.push(u); + break e; + } + null != u.componentWillUpdate && u.componentWillUpdate(g, u.__s, v), null != u.componentDidUpdate && u.__h.push(function () { + u.componentDidUpdate(d, f, m); + }); + } + u.context = v, u.props = g, u.state = u.__s, (l = _.__r) && l(n), u.__d = !1, u.__v = n, u.__P = e, l = u.render(u.props, u.state, u.context), u.state = u.__s, null != u.getChildContext && (r = P(P({}, r), u.getChildContext())), p || null == u.getSnapshotBeforeUpdate || (m = u.getSnapshotBeforeUpdate(d, f)), b = null != l && l.type === I && null == l.key ? l.props.children : l, B(e, Array.isArray(b) ? b : [b], n, t, r, o, a, i, s, c), u.base = n.__e, n.__h = null, u.__h.length && i.push(u), h && (u.__E = u.__ = null), u.__e = !1; + } else + null == a && n.__v === t.__v ? (n.__k = t.__k, n.__e = t.__e) : n.__e = W(t.__e, n, t, r, o, a, i, c); + (l = _.diffed) && l(n); + } catch (e) { + n.__v = null, (c || null != a) && (n.__e = s, n.__h = !!c, a[a.indexOf(s)] = null), _.__e(e, n, t); + } + } + function Y(e, n) { + _.__c && _.__c(n, e), e.some(function (n) { + try { + e = n.__h, n.__h = [], e.some(function (e) { + e.call(n); + }); + } catch (e) { + _.__e(e, n.__v); + } + }); + } + function W(e, n, t, r, o, a, i, s) { + var c, l, u, p, d = t.props, f = n.props, m = n.type, h = 0; + if ('svg' === m && (o = !0), null != a) + for (; h < a.length; h++) + if ((c = a[h]) && (c === e || (m ? c.localName == m : 3 == c.nodeType))) { + e = c, a[h] = null; + break; + } + if (null == e) { + if (null === m) + return document.createTextNode(f); + e = o ? document.createElementNS('http://www.w3.org/2000/svg', m) : document.createElement(m, f.is && f), a = null, s = !1; + } + if (null === m) + d === f || s && e.data === f || (e.data = f); + else { + if (a = a && S.slice.call(e.childNodes), l = (d = t.props || w).dangerouslySetInnerHTML, u = f.dangerouslySetInnerHTML, !s) { + if (null != a) + for (d = {}, p = 0; p < e.attributes.length; p++) + d[e.attributes[p].name] = e.attributes[p].value; + (u || l) && (u && (l && u.__html == l.__html || u.__html === e.innerHTML) || (e.innerHTML = u && u.__html || '')); + } + if (function (e, n, t, r, o) { + var a; + for (a in t) + 'children' === a || 'key' === a || a in n || M(e, a, null, t[a], r); + for (a in n) + o && 'function' != typeof n[a] || 'children' === a || 'key' === a || 'value' === a || 'checked' === a || t[a] === n[a] || M(e, a, n[a], t[a], r); + }(e, f, d, o, s), u) + n.__k = []; + else if (h = n.props.children, B(e, Array.isArray(h) ? h : [h], n, t, r, o && 'foreignObject' !== m, a, i, e.firstChild, s), null != a) + for (h = a.length; h--;) + null != a[h] && T(a[h]); + s || ('value' in f && void 0 !== (h = f.value) && (h !== e.value || 'progress' === m && !h) && M(e, 'value', h, d.value, !1), 'checked' in f && void 0 !== (h = f.checked) && h !== e.checked && M(e, 'checked', h, d.checked, !1)); + } + return e; + } + function J(e, n, t) { + try { + 'function' == typeof e ? e(n) : e.current = n; + } catch (e) { + _.__e(e, t); + } + } + function X(e, n, t) { + var r, o, a; + if (_.unmount && _.unmount(e), (r = e.ref) && (r.current && r.current !== e.__e || J(r, null, n)), t || 'function' == typeof e.type || (t = null != (o = e.__e)), e.__e = e.__d = void 0, null != (r = e.__c)) { + if (r.componentWillUnmount) + try { + r.componentWillUnmount(); + } catch (e) { + _.__e(e, n); + } + r.base = r.__P = null; + } + if (r = e.__k) + for (a = 0; a < r.length; a++) + r[a] && X(r[a], n, t); + null != o && T(o); + } + function K(e, n, t) { + return this.constructor(e, t); + } + function Q(e, n, t) { + var r, o, a; + _.__ && _.__(e, n), o = (r = 'function' == typeof t) ? null : t && t.__k || n.__k, a = [], $(n, e = (!r && t || n).__k = q(I, null, [e]), o || w, w, void 0 !== n.ownerSVGElement, !r && t ? [t] : o ? null : n.firstChild ? S.slice.call(n.childNodes) : null, a, !r && t ? t : o ? o.__e : n.firstChild, r), Y(a, e); + } + function Z(e, n) { + Q(e, n, Z); + } + function ee(e, n, t) { + var r, o, a, i = arguments, s = P({}, e.props); + for (a in n) + 'key' == a ? r = n[a] : 'ref' == a ? o = n[a] : s[a] = n[a]; + if (arguments.length > 3) + for (t = [t], a = 3; a < arguments.length; a++) + t.push(i[a]); + return null != t && (s.children = t), A(e.type, s, r || e.key, o || e.ref, null); + } + function ne(e, n) { + var t = { + __c: n = '__cC' + k++, + __: e, + Consumer: function (e, n) { + return e.children(n); + }, + Provider: function (e) { + var t, r; + return this.getChildContext || (t = [], (r = {})[n] = this, this.getChildContext = function () { + return r; + }, this.shouldComponentUpdate = function (e) { + this.props.value !== e.value && t.some(U); + }, this.sub = function (e) { + t.push(e); + var n = e.componentWillUnmount; + e.componentWillUnmount = function () { + t.splice(t.indexOf(e), 1), n && n.call(e); + }; + }), e.children; + } + }; + return t.Provider.__ = t.Consumer.contextType = t; + } + _ = { + __e: function (e, n) { + for (var t, r, o; n = n.__;) + if ((t = n.__c) && !t.__) + try { + if ((r = t.constructor) && null != r.getDerivedStateFromError && (t.setState(r.getDerivedStateFromError(e)), o = t.__d), null != t.componentDidCatch && (t.componentDidCatch(e), o = t.__d), o) + return t.__E = t; + } catch (n) { + e = n; + } + throw e; + }, + __v: 0 + }, O.prototype.setState = function (e, n) { + var t; + t = null != this.__s && this.__s !== this.state ? this.__s : this.__s = P({}, this.state), 'function' == typeof e && (e = e(P({}, t), this.props)), e && P(t, e), null != e && this.__v && (n && this.__h.push(n), U(this)); + }, O.prototype.forceUpdate = function (e) { + this.__v && (this.__e = !0, e && this.__h.push(e), U(this)); + }, O.prototype.render = I, x = [], E = 'function' == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, D.__r = 0, k = 0; + var te, re, oe, ae = 0, ie = [], se = _.__b, ce = _.__r, le = _.diffed, ue = _.__c, pe = _.unmount; + function de(e, n) { + _.__h && _.__h(re, e, ae || n), ae = 0; + var t = re.__H || (re.__H = { + __: [], + __h: [] + }); + return e >= t.__.length && t.__.push({}), t.__[e]; + } + function fe(e) { + return ae = 1, me(Se, e); + } + function me(e, n, t) { + var r = de(te++, 2); + return r.t = e, r.__c || (r.__ = [ + t ? t(n) : Se(void 0, n), + function (e) { + var n = r.t(r.__[0], e); + r.__[0] !== n && (r.__ = [ + n, + r.__[1] + ], r.__c.setState({})); + } + ], r.__c = re), r.__; + } + function he(e, n) { + var t = de(te++, 3); + !_.__s && we(t.__H, n) && (t.__ = e, t.__H = n, re.__H.__h.push(t)); + } + function ge(e, n) { + var t = de(te++, 4); + !_.__s && we(t.__H, n) && (t.__ = e, t.__H = n, re.__h.push(t)); + } + function ye(e) { + return ae = 5, ve(function () { + return { current: e }; + }, []); + } + function ve(e, n) { + var t = de(te++, 7); + return we(t.__H, n) && (t.__ = e(), t.__H = n, t.__h = e), t.__; + } + function be(e, n) { + return ae = 8, ve(function () { + return e; + }, n); + } + function _e(e) { + var n = re.context[e.__c], t = de(te++, 9); + return t.__c = e, n ? (null == t.__ && (t.__ = !0, n.sub(re)), n.props.value) : e.__; + } + function xe() { + ie.forEach(function (e) { + if (e.__P) + try { + e.__H.__h.forEach(Ce), e.__H.__h.forEach(ke), e.__H.__h = []; + } catch (n) { + e.__H.__h = [], _.__e(n, e.__v); + } + }), ie = []; + } + _.__b = function (e) { + re = null, se && se(e); + }, _.__r = function (e) { + ce && ce(e), te = 0; + var n = (re = e.__c).__H; + n && (n.__h.forEach(Ce), n.__h.forEach(ke), n.__h = []); + }, _.diffed = function (e) { + le && le(e); + var n = e.__c; + n && n.__H && n.__H.__h.length && (1 !== ie.push(n) && oe === _.requestAnimationFrame || ((oe = _.requestAnimationFrame) || function (e) { + var n, t = function () { + clearTimeout(r), Ee && cancelAnimationFrame(n), setTimeout(e); + }, r = setTimeout(t, 100); + Ee && (n = requestAnimationFrame(t)); + })(xe)), re = void 0; + }, _.__c = function (e, n) { + n.some(function (e) { + try { + e.__h.forEach(Ce), e.__h = e.__h.filter(function (e) { + return !e.__ || ke(e); + }); + } catch (t) { + n.some(function (e) { + e.__h && (e.__h = []); + }), n = [], _.__e(t, e.__v); + } + }), ue && ue(e, n); + }, _.unmount = function (e) { + pe && pe(e); + var n = e.__c; + if (n && n.__H) + try { + n.__H.__.forEach(Ce); + } catch (e) { + _.__e(e, n.__v); + } + }; + var Ee = 'function' == typeof requestAnimationFrame; + function Ce(e) { + var n = re; + 'function' == typeof e.__c && e.__c(), re = n; + } + function ke(e) { + var n = re; + e.__c = e.__(), re = n; + } + function we(e, n) { + return !e || e.length !== n.length || n.some(function (n, t) { + return n !== e[t]; + }); + } + function Se(e, n) { + return 'function' == typeof n ? n(e) : n; + } + function Le(e, n) { + for (var t in n) + e[t] = n[t]; + return e; + } + function Pe(e, n) { + for (var t in e) + if ('__source' !== t && !(t in n)) + return !0; + for (var r in n) + if ('__source' !== r && e[r] !== n[r]) + return !0; + return !1; + } + function Te(e) { + this.props = e; + } + (Te.prototype = new O()).isPureReactComponent = !0, Te.prototype.shouldComponentUpdate = function (e, n) { + return Pe(this.props, e) || Pe(this.state, n); + }; + var qe = _.__b; + _.__b = function (e) { + e.type && e.type.__f && e.ref && (e.props.ref = e.ref, e.ref = null), qe && qe(e); + }; + var Ae = 'undefined' != typeof Symbol && Symbol.for && Symbol.for('react.forward_ref') || 3911; + function Ie(e) { + function n(n, t) { + var r = Le({}, n); + return delete r.ref, e(r, (t = n.ref || t) && ('object' != typeof t || 'current' in t) ? t : null); + } + return n.$$typeof = Ae, n.render = n, n.prototype.isReactComponent = n.__f = !0, n.displayName = 'ForwardRef(' + (e.displayName || e.name) + ')', n; + } + var Oe = function (e, n) { + return null == e ? null : F(F(e).map(n)); + }, Ne = { + map: Oe, + forEach: Oe, + count: function (e) { + return e ? F(e).length : 0; + }, + only: function (e) { + var n = F(e); + if (1 !== n.length) + throw 'Children.only'; + return n[0]; + }, + toArray: F + }, Re = _.__e; + _.__e = function (e, n, t) { + if (e.then) + for (var r, o = n; o = o.__;) + if ((r = o.__c) && r.__c) + return null == n.__e && (n.__e = t.__e, n.__k = t.__k), r.__c(e, n); + Re(e, n, t); + }; + var Ue = _.unmount; + function De() { + this.__u = 0, this.t = null, this.__b = null; + } + function Be(e) { + var n = e.__.__c; + return n && n.__e && n.__e(e); + } + function je() { + this.u = null, this.o = null; + } + _.unmount = function (e) { + var n = e.__c; + n && n.__R && n.__R(), n && !0 === e.__h && (e.type = null), Ue && Ue(e); + }, (De.prototype = new O()).__c = function (e, n) { + var t = n.__c, r = this; + null == r.t && (r.t = []), r.t.push(t); + var o = Be(r.__v), a = !1, i = function () { + a || (a = !0, t.__R = null, o ? o(s) : s()); + }; + t.__R = i; + var s = function () { + if (!--r.__u) { + if (r.state.__e) { + var e = r.state.__e; + r.__v.__k[0] = function e(n, t, r) { + return n && (n.__v = null, n.__k = n.__k && n.__k.map(function (n) { + return e(n, t, r); + }), n.__c && n.__c.__P === t && (n.__e && r.insertBefore(n.__e, n.__d), n.__c.__e = !0, n.__c.__P = r)), n; + }(e, e.__c.__P, e.__c.__O); + } + var n; + for (r.setState({ __e: r.__b = null }); n = r.t.pop();) + n.forceUpdate(); + } + }, c = !0 === n.__h; + r.__u++ || c || r.setState({ __e: r.__b = r.__v.__k[0] }), e.then(i, i); + }, De.prototype.componentWillUnmount = function () { + this.t = []; + }, De.prototype.render = function (e, n) { + if (this.__b) { + if (this.__v.__k) { + var t = document.createElement('div'), r = this.__v.__k[0].__c; + this.__v.__k[0] = function e(n, t, r) { + return n && (n.__c && n.__c.__H && (n.__c.__H.__.forEach(function (e) { + 'function' == typeof e.__c && e.__c(); + }), n.__c.__H = null), null != (n = Le({}, n)).__c && (n.__c.__P === r && (n.__c.__P = t), n.__c = null), n.__k = n.__k && n.__k.map(function (n) { + return e(n, t, r); + })), n; + }(this.__b, t, r.__O = r.__P); + } + this.__b = null; + } + var o = n.__e && q(I, null, e.fallback); + return o && (o.__h = null), [ + q(I, null, n.__e ? null : e.children), + o + ]; + }; + var Fe = function (e, n, t) { + if (++t[1] === t[0] && e.o.delete(n), e.props.revealOrder && ('t' !== e.props.revealOrder[0] || !e.o.size)) + for (t = e.u; t;) { + for (; t.length > 3;) + t.pop()(); + if (t[1] < t[0]) + break; + e.u = t = t[2]; + } + }; + function Ve(e) { + return this.getChildContext = function () { + return e.context; + }, e.children; + } + function Ge(e) { + var n = this, t = e.i; + n.componentWillUnmount = function () { + Q(null, n.l), n.l = null, n.i = null; + }, n.i && n.i !== t && n.componentWillUnmount(), e.__v ? (n.l || (n.i = t, n.l = { + nodeType: 1, + parentNode: t, + childNodes: [], + appendChild: function (e) { + this.childNodes.push(e), n.i.appendChild(e); + }, + insertBefore: function (e, t) { + this.childNodes.push(e), n.i.appendChild(e); + }, + removeChild: function (e) { + this.childNodes.splice(this.childNodes.indexOf(e) >>> 1, 1), n.i.removeChild(e); + } + }), Q(q(Ve, { context: n.context }, e.__v), n.l)) : n.l && n.componentWillUnmount(); + } + (je.prototype = new O()).__e = function (e) { + var n = this, t = Be(n.__v), r = n.o.get(e); + return r[0]++, function (o) { + var a = function () { + n.props.revealOrder ? (r.push(o), Fe(n, e, r)) : o(); + }; + t ? t(a) : a(); + }; + }, je.prototype.render = function (e) { + this.u = null, this.o = new Map(); + var n = F(e.children); + e.revealOrder && 'b' === e.revealOrder[0] && n.reverse(); + for (var t = n.length; t--;) + this.o.set(n[t], this.u = [ + 1, + 0, + this.u + ]); + return e.children; + }, je.prototype.componentDidUpdate = je.prototype.componentDidMount = function () { + var e = this; + this.o.forEach(function (n, t) { + Fe(e, t, n); + }); + }; + var Me = 'undefined' != typeof Symbol && Symbol.for && Symbol.for('react.element') || 60103, ze = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/, He = function (e) { + return ('undefined' != typeof Symbol && 'symbol' == typeof Symbol() ? /fil|che|rad/i : /fil|che|ra/i).test(e); + }; + O.prototype.isReactComponent = {}, [ + 'componentWillMount', + 'componentWillReceiveProps', + 'componentWillUpdate' + ].forEach(function (e) { + Object.defineProperty(O.prototype, e, { + configurable: !0, + get: function () { + return this['UNSAFE_' + e]; + }, + set: function (n) { + Object.defineProperty(this, e, { + configurable: !0, + writable: !0, + value: n + }); + } + }); + }); + var $e = _.event; + function Ye() { + } + function We() { + return this.cancelBubble; + } + function Je() { + return this.defaultPrevented; + } + _.event = function (e) { + return $e && (e = $e(e)), e.persist = Ye, e.isPropagationStopped = We, e.isDefaultPrevented = Je, e.nativeEvent = e; + }; + var Xe, Ke = { + configurable: !0, + get: function () { + return this.class; + } + }, Qe = _.vnode; + _.vnode = function (e) { + var n = e.type, t = e.props, r = t; + if ('string' == typeof n) { + for (var o in (r = {}, t)) { + var a = t[o]; + 'value' === o && 'defaultValue' in t && null == a || ('defaultValue' === o && 'value' in t && null == t.value ? o = 'value' : 'download' === o && !0 === a ? a = '' : /ondoubleclick/i.test(o) ? o = 'ondblclick' : /^onchange(textarea|input)/i.test(o + n) && !He(t.type) ? o = 'oninput' : /^on(Ani|Tra|Tou|BeforeInp)/.test(o) ? o = o.toLowerCase() : ze.test(o) ? o = o.replace(/[A-Z0-9]/, '-$&').toLowerCase() : null === a && (a = void 0), r[o] = a); + } + 'select' == n && r.multiple && Array.isArray(r.value) && (r.value = F(t.children).forEach(function (e) { + e.props.selected = -1 != r.value.indexOf(e.props.value); + })), 'select' == n && null != r.defaultValue && (r.value = F(t.children).forEach(function (e) { + e.props.selected = r.multiple ? -1 != r.defaultValue.indexOf(e.props.value) : r.defaultValue == e.props.value; + })), e.props = r; + } + n && t.class != t.className && (Ke.enumerable = 'className' in t, null != t.className && (r.class = t.className), Object.defineProperty(r, 'className', Ke)), e.$$typeof = Me, Qe && Qe(e); + }; + var Ze = _.__r; + _.__r = function (e) { + Ze && Ze(e), Xe = e.__c; + }; + var en = { + ReactCurrentDispatcher: { + current: { + readContext: function (e) { + return Xe.__n[e.__c].props.value; + } + } + } + }; + 'object' == typeof performance && 'function' == typeof performance.now && performance.now.bind(performance); + function nn(e) { + return !!e && e.$$typeof === Me; + } + var tn = { + useState: fe, + useReducer: me, + useEffect: he, + useLayoutEffect: ge, + useRef: ye, + useImperativeHandle: function (e, n, t) { + ae = 6, ge(function () { + 'function' == typeof e ? e(n()) : e && (e.current = n()); + }, null == t ? t : t.concat(e)); + }, + useMemo: ve, + useCallback: be, + useContext: _e, + useDebugValue: function (e, n) { + _.useDebugValue && _.useDebugValue(n ? n(e) : e); + }, + version: '16.8.0', + Children: Ne, + render: function (e, n, t) { + return null == n.__k && (n.textContent = ''), Q(e, n), 'function' == typeof t && t(), e ? e.__c : null; + }, + hydrate: function (e, n, t) { + return Z(e, n), 'function' == typeof t && t(), e ? e.__c : null; + }, + unmountComponentAtNode: function (e) { + return !!e.__k && (Q(null, e), !0); + }, + createPortal: function (e, n) { + return q(Ge, { + __v: e, + i: n + }); + }, + createElement: q, + createContext: ne, + createFactory: function (e) { + return q.bind(null, e); + }, + cloneElement: function (e) { + return nn(e) ? ee.apply(null, arguments) : e; + }, + createRef: function () { + return { current: null }; + }, + Fragment: I, + isValidElement: nn, + findDOMNode: function (e) { + return e && (e.base || 1 === e.nodeType && e) || null; + }, + Component: O, + PureComponent: Te, + memo: function (e, n) { + function t(e) { + var t = this.props.ref, r = t == e.ref; + return !r && t && (t.call ? t(null) : t.current = null), n ? !n(this.props, e) || !r : Pe(this.props, e); + } + function r(n) { + return this.shouldComponentUpdate = t, q(e, n); + } + return r.displayName = 'Memo(' + (e.displayName || e.name) + ')', r.prototype.isReactComponent = !0, r.__f = !0, r; + }, + forwardRef: Ie, + unstable_batchedUpdates: function (e, n) { + return e(n); + }, + StrictMode: I, + Suspense: De, + SuspenseList: je, + lazy: function (e) { + var n, t, r; + function o(o) { + if (n || (n = e()).then(function (e) { + t = e.default || e; + }, function (e) { + r = e; + }), r) + throw r; + if (!t) + throw n; + return q(t, o); + } + return o.displayName = 'Lazy', o.__f = !0, o; + }, + __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: en + }, rn = t(1), on = t.n(rn); + function an(e, n, t, r, o, a, i) { + try { + var s = e[a](i), c = s.value; + } catch (l) { + return void t(l); + } + s.done ? n(c) : Promise.resolve(c).then(r, o); + } + function sn(e) { + return function () { + var n = this, t = arguments; + return new Promise(function (r, o) { + var a = e.apply(n, t); + function i(e) { + an(a, r, o, i, s, 'next', e); + } + function s(e) { + an(a, r, o, i, s, 'throw', e); + } + i(void 0); + }); + }; + } + var cn = function () { + function e(e) { + var n = this; + this._insertTag = function (e) { + var t; + t = 0 === n.tags.length ? n.prepend ? n.container.firstChild : n.before : n.tags[n.tags.length - 1].nextSibling, n.container.insertBefore(e, t), n.tags.push(e); + }, this.isSpeedy = void 0 === e.speedy || e.speedy, this.tags = [], this.ctr = 0, this.nonce = e.nonce, this.key = e.key, this.container = e.container, this.prepend = e.prepend, this.before = null; + } + var n = e.prototype; + return n.hydrate = function (e) { + e.forEach(this._insertTag); + }, n.insert = function (e) { + this.ctr % (this.isSpeedy ? 65000 : 1) === 0 && this._insertTag(function (e) { + var n = document.createElement('style'); + return n.setAttribute('qc-data-emotion', e.key), void 0 !== e.nonce && n.setAttribute('nonce', e.nonce), n.appendChild(document.createTextNode('')), n.setAttribute('data-s', ''), n; + }(this)); + var n = this.tags[this.tags.length - 1]; + if (this.isSpeedy) { + var t = function (e) { + if (e.sheet) + return e.sheet; + for (var n = 0; n < document.styleSheets.length; n++) + if (document.styleSheets[n].ownerNode === e) + return document.styleSheets[n]; + }(n); + try { + t.insertRule(e, t.cssRules.length); + } catch (r) { + 0; + } + } else + n.appendChild(document.createTextNode(e)); + this.ctr++; + }, n.flush = function () { + this.tags.forEach(function (e) { + return e.parentNode.removeChild(e); + }), this.tags = [], this.ctr = 0; + }, e; + }(), ln = '-webkit-', un = Math.abs, pn = String.fromCharCode; + function dn(e) { + return e.trim(); + } + function fn(e, n, t) { + return e.replace(n, t); + } + function mn(e, n) { + return e.indexOf(n); + } + function hn(e, n) { + return 0 | e.charCodeAt(n); + } + function gn(e, n, t) { + return e.slice(n, t); + } + function yn(e) { + return e.length; + } + function vn(e) { + return e.length; + } + function bn(e, n) { + return n.push(e), e; + } + function _n(e, n) { + return e.map(n).join(''); + } + var xn = 1, En = 1, Cn = 0, kn = 0, wn = 0, Sn = ''; + function Ln(e, n, t, r, o, a, i) { + return { + value: e, + root: n, + parent: t, + type: r, + props: o, + children: a, + line: xn, + column: En, + length: i, + return: '' + }; + } + function Pn(e, n, t) { + return Ln(e, n.root, n.parent, t, n.props, n.children, 0); + } + function Tn() { + return wn = kn < Cn ? hn(Sn, kn++) : 0, En++, 10 === wn && (En = 1, xn++), wn; + } + function qn() { + return hn(Sn, kn); + } + function An() { + return kn; + } + function In(e, n) { + return gn(Sn, e, n); + } + function On(e) { + switch (e) { + case 0: + case 9: + case 10: + case 13: + case 32: + return 5; + case 33: + case 43: + case 44: + case 47: + case 62: + case 64: + case 126: + case 59: + case 123: + case 125: + return 4; + case 58: + return 3; + case 34: + case 39: + case 40: + case 91: + return 2; + case 41: + case 93: + return 1; + } + return 0; + } + function Nn(e) { + return xn = En = 1, Cn = yn(Sn = e), kn = 0, []; + } + function Rn(e) { + return Sn = '', e; + } + function Un(e) { + return dn(In(kn - 1, function e(n) { + for (; Tn();) + switch (wn) { + case n: + return kn; + case 34: + case 39: + return e(34 === n || 39 === n ? n : wn); + case 40: + 41 === n && e(n); + break; + case 92: + Tn(); + } + return kn; + }(91 === e ? e + 2 : 40 === e ? e + 1 : e))); + } + function Dn(e) { + for (; (wn = qn()) && wn < 33;) + Tn(); + return On(e) > 2 || On(wn) > 3 ? '' : ' '; + } + function Bn(e, n) { + for (; Tn() && e + wn !== 57 && (e + wn !== 84 || 47 !== qn());); + return '/*' + In(n, kn - 1) + '*' + pn(47 === e ? e : Tn()); + } + function jn(e) { + for (; !On(qn());) + Tn(); + return In(e, kn); + } + function Fn(e) { + return Rn(function e(n, t, r, o, a, i, s, c, l) { + var u = 0, p = 0, d = s, f = 0, m = 0, h = 0, g = 1, y = 1, v = 1, b = 0, _ = '', x = a, E = i, C = o, k = _; + for (; y;) + switch (h = b, b = Tn()) { + case 34: + case 39: + case 91: + case 40: + k += Un(b); + break; + case 9: + case 10: + case 13: + case 32: + k += Dn(h); + break; + case 47: + switch (qn()) { + case 42: + case 47: + bn(Gn(Bn(Tn(), An()), t, r), l); + break; + default: + k += '/'; + } + break; + case 123 * g: + c[u++] = yn(k) * v; + case 125 * g: + case 59: + case 0: + switch (b) { + case 0: + case 125: + y = 0; + case 59 + p: + m > 0 && yn(k) - d && bn(m > 32 ? Mn(k + ';', o, r, d - 1) : Mn(fn(k, ' ', '') + ';', o, r, d - 2), l); + break; + case 59: + k += ';'; + default: + if (bn(C = Vn(k, t, r, u, p, a, c, _, x = [], E = [], d), i), 123 === b) + if (0 === p) + e(k, t, C, C, x, i, d, c, E); + else + switch (f) { + case 100: + case 109: + case 115: + e(n, C, C, o && bn(Vn(n, C, C, 0, 0, a, c, _, a, x = [], d), E), a, E, d, c, o ? x : E); + break; + default: + e(k, C, C, C, [''], E, d, c, E); + } + } + u = p = m = 0, g = v = 1, _ = k = '', d = s; + break; + case 58: + d = 1 + yn(k), m = h; + default: + switch (k += pn(b), b * g) { + case 38: + v = p > 0 ? 1 : (k += '\f', -1); + break; + case 44: + c[u++] = (yn(k) - 1) * v, v = 1; + break; + case 64: + 45 === qn() && (k += Un(Tn())), f = qn(), p = yn(_ = k += jn(An())), b++; + break; + case 45: + 45 === h && 2 == yn(k) && (g = 0); + } + } + return i; + }('', null, null, null, [''], e = Nn(e), 0, [0], e)); + } + function Vn(e, n, t, r, o, a, i, s, c, l, u) { + for (var p = o - 1, d = 0 === o ? a : [''], f = vn(d), m = 0, h = 0, g = 0; m < r; ++m) + for (var y = 0, v = gn(e, p + 1, p = un(h = i[m])), b = e; y < f; ++y) + (b = dn(h > 0 ? d[y] + ' ' + v : fn(v, /&\f/g, d[y]))) && (c[g++] = b); + return Ln(e, n, t, 0 === o ? 'rule' : s, c, l, u); + } + function Gn(e, n, t) { + return Ln(e, n, t, 'comm', pn(wn), gn(e, 2, -2), 0); + } + function Mn(e, n, t, r) { + return Ln(e, n, t, 'decl', gn(e, 0, r), gn(e, r + 1, -1), r); + } + function zn(e, n) { + switch ((((n << 2 ^ hn(t = e, 0)) << 2 ^ hn(t, 1)) << 2 ^ hn(t, 2)) << 2 ^ hn(t, 3)) { + case 5737: + case 4201: + case 3177: + case 3433: + case 1641: + case 4457: + case 2921: + case 5572: + case 6356: + case 5844: + case 3191: + case 6645: + case 3005: + case 6391: + case 5879: + case 5623: + case 6135: + case 4599: + case 4855: + case 4215: + case 6389: + case 5109: + case 5365: + case 5621: + case 3829: + return ln + e + e; + case 5349: + case 4246: + case 4810: + case 6968: + case 2756: + return ln + e + '-moz-' + e + '-ms-' + e + e; + case 6828: + case 4268: + return ln + e + '-ms-' + e + e; + case 6165: + return ln + e + '-ms-flex-' + e + e; + case 5187: + return ln + e + fn(e, /(\w+).+(:[^]+)/, ln + 'box-$1$2-ms-flex-$1$2') + e; + case 5443: + return ln + e + '-ms-flex-item-' + fn(e, /flex-|-self/, '') + e; + case 4675: + return ln + e + '-ms-flex-line-pack' + fn(e, /align-content|flex-|-self/, '') + e; + case 5548: + return ln + e + '-ms-' + fn(e, 'shrink', 'negative') + e; + case 5292: + return ln + e + '-ms-' + fn(e, 'basis', 'preferred-size') + e; + case 6060: + return ln + 'box-' + fn(e, '-grow', '') + ln + e + '-ms-' + fn(e, 'grow', 'positive') + e; + case 4554: + return ln + fn(e, /([^-])(transform)/g, '$1' + ln + '$2') + e; + case 6187: + return fn(fn(fn(e, /(zoom-|grab)/, ln + '$1'), /(image-set)/, ln + '$1'), e, '') + e; + case 5495: + case 3959: + return fn(e, /(image-set\([^]*)/, ln + '$1$`$1'); + case 4968: + return fn(fn(e, /(.+:)(flex-)?(.*)/, ln + 'box-pack:$3-ms-flex-pack:$3'), /s.+-b[^;]+/, 'justify') + ln + e + e; + case 4095: + case 3583: + case 4068: + case 2532: + return fn(e, /(.+)-inline(.+)/, ln + '$1$2') + e; + case 8116: + case 7059: + case 5753: + case 5535: + case 5445: + case 5701: + case 4933: + case 4677: + case 5533: + case 5789: + case 5021: + case 4765: + if (yn(e) - 1 - n > 6) + switch (hn(e, n + 1)) { + case 102: + n = hn(e, n + 3); + case 109: + return fn(e, /(.+:)(.+)-([^]+)/, '$1' + ln + '$2-$3$1-moz-' + (108 == n ? '$3' : '$2-$3')) + e; + case 115: + return ~mn(e, 'stretch') ? zn(fn(e, 'stretch', 'fill-available'), n) + e : e; + } + break; + case 4949: + if (115 !== hn(e, n + 1)) + break; + case 6444: + switch (hn(e, yn(e) - 3 - (~mn(e, '!important') && 10))) { + case 107: + case 111: + return fn(e, e, ln + e) + e; + case 101: + return fn(e, /(.+:)([^;!]+)(;|!.+)?/, '$1' + ln + (45 === hn(e, 14) ? 'inline-' : '') + 'box$3$1' + ln + '$2$3$1-ms-$2box$3') + e; + } + break; + case 5936: + switch (hn(e, n + 11)) { + case 114: + return ln + e + '-ms-' + fn(e, /[svh]\w+-[tblr]{2}/, 'tb') + e; + case 108: + return ln + e + '-ms-' + fn(e, /[svh]\w+-[tblr]{2}/, 'tb-rl') + e; + case 45: + return ln + e + '-ms-' + fn(e, /[svh]\w+-[tblr]{2}/, 'lr') + e; + } + return ln + e + '-ms-' + e + e; + } + var t; + return e; + } + function Hn(e, n) { + for (var t = '', r = vn(e), o = 0; o < r; o++) + t += n(e[o], o, e, n) || ''; + return t; + } + function $n(e, n, t, r) { + switch (e.type) { + case '@import': + case 'decl': + return e.return = e.return || e.value; + case 'comm': + return ''; + case 'rule': + e.value = e.props.join(','); + } + return yn(t = Hn(e.children, r)) ? e.return = e.value + '{' + t + '}' : ''; + } + var Yn = function (e) { + var n = new WeakMap(); + return function (t) { + if (n.has(t)) + return n.get(t); + var r = e(t); + return n.set(t, r), r; + }; + }; + var Wn = function (e) { + var n = Object.create(null); + return function (t) { + return void 0 === n[t] && (n[t] = e(t)), n[t]; + }; + }, Jn = function (e, n) { + return Rn(function (e, n) { + var t = -1, r = 44; + do { + switch (On(r)) { + case 0: + 38 === r && 12 === qn() && (n[t] = 1), e[t] += jn(kn - 1); + break; + case 2: + e[t] += Un(r); + break; + case 4: + if (44 === r) { + e[++t] = 58 === qn() ? '&\f' : '', n[t] = e[t].length; + break; + } + default: + e[t] += pn(r); + } + } while (r = Tn()); + return e; + }(Nn(e), n)); + }, Xn = new WeakMap(), Kn = function (e) { + if ('rule' === e.type && e.parent && e.length) { + for (var n = e.value, t = e.parent, r = e.column === t.column && e.line === t.line; 'rule' !== t.type;) + if (!(t = t.parent)) + return; + if ((1 !== e.props.length || 58 === n.charCodeAt(0) || Xn.get(t)) && !r) { + Xn.set(e, !0); + for (var o = [], a = Jn(n, o), i = t.props, s = 0, c = 0; s < a.length; s++) + for (var l = 0; l < i.length; l++, c++) + e.props[c] = o[s] ? a[s].replace(/&\f/g, i[l]) : i[l] + ' ' + a[s]; + } + } + }, Qn = function (e) { + if ('decl' === e.type) { + var n = e.value; + 108 === n.charCodeAt(0) && 98 === n.charCodeAt(2) && (e.return = '', e.value = ''); + } + }, Zn = [function (e, n, t, r) { + if (!e.return) + switch (e.type) { + case 'decl': + e.return = zn(e.value, e.length); + break; + case '@keyframes': + return Hn([Pn(fn(e.value, '@', '@' + ln), e, '')], r); + case 'rule': + if (e.length) + return _n(e.props, function (n) { + switch ((t = /(::plac\w+|:read-\w+)/.exec(t = n)) ? t[0] : t) { + case ':read-only': + case ':read-write': + return Hn([Pn(fn(n, /:(read-\w+)/, ':-moz-$1'), e, '')], r); + case '::placeholder': + return Hn([ + Pn(fn(n, /:(plac\w+)/, ':' + ln + 'input-$1'), e, ''), + Pn(fn(n, /:(plac\w+)/, ':-moz-$1'), e, ''), + Pn(fn(n, /:(plac\w+)/, '-ms-input-$1'), e, '') + ], r); + } + var t; + return ''; + }); + } + }], et = function (e) { + var n = e.key; + if ('css' === n) { + var t = document.querySelectorAll('style[qc-data-emotion]:not([data-s])'); + Array.prototype.forEach.call(t, function (e) { + document.head.appendChild(e), e.setAttribute('data-s', ''); + }); + } + var r = e.stylisPlugins || Zn; + var o, a, i = {}, s = []; + o = e.container || document.head, Array.prototype.forEach.call(document.querySelectorAll('style[qc-data-emotion]'), function (e) { + var t = e.getAttribute('qc-data-emotion').split(' '); + if (t[0] === n) { + for (var r = 1; r < t.length; r++) + i[t[r]] = !0; + s.push(e); + } + }); + var c, l, u = [ + $n, + (l = function (e) { + c.insert(e); + }, function (e) { + e.root || (e = e.return) && l(e); + }) + ], p = function (e) { + var n = vn(e); + return function (t, r, o, a) { + for (var i = '', s = 0; s < n; s++) + i += e[s](t, r, o, a) || ''; + return i; + }; + }([ + Kn, + Qn + ].concat(r, u)); + a = function (e, n, t, r) { + c = t, Hn(Fn(e ? e + '{' + n.styles + '}' : n.styles), p), r && (d.inserted[n.name] = !0); + }; + var d = { + key: n, + sheet: new cn({ + key: n, + container: o, + nonce: e.nonce, + speedy: e.speedy, + prepend: e.prepend + }), + nonce: e.nonce, + inserted: i, + registered: {}, + insert: a + }; + return d.sheet.hydrate(s), d; + }; + function nt() { + return (nt = Object.assign || function (e) { + for (var n = 1; n < arguments.length; n++) { + var t = arguments[n]; + for (var r in t) + Object.prototype.hasOwnProperty.call(t, r) && (e[r] = t[r]); + } + return e; + }).apply(this, arguments); + } + t(4); + function tt(e, n, t) { + var r = ''; + return t.split(' ').forEach(function (t) { + void 0 !== e[t] ? n.push(e[t] + ';') : r += t + ' '; + }), r; + } + var rt = function (e, n, t) { + var r = e.key + '-' + n.name; + if (!1 === t && void 0 === e.registered[r] && (e.registered[r] = n.styles), void 0 === e.inserted[n.name]) { + var o = n; + do { + e.insert(n === o ? '.' + r : '', o, e.sheet, !0); + o = o.next; + } while (void 0 !== o); + } + }; + var ot = function (e) { + for (var n, t = 0, r = 0, o = e.length; o >= 4; ++r, o -= 4) + n = 1540483477 * (65535 & (n = 255 & e.charCodeAt(r) | (255 & e.charCodeAt(++r)) << 8 | (255 & e.charCodeAt(++r)) << 16 | (255 & e.charCodeAt(++r)) << 24)) + (59797 * (n >>> 16) << 16), t = 1540483477 * (65535 & (n ^= n >>> 24)) + (59797 * (n >>> 16) << 16) ^ 1540483477 * (65535 & t) + (59797 * (t >>> 16) << 16); + switch (o) { + case 3: + t ^= (255 & e.charCodeAt(r + 2)) << 16; + case 2: + t ^= (255 & e.charCodeAt(r + 1)) << 8; + case 1: + t = 1540483477 * (65535 & (t ^= 255 & e.charCodeAt(r))) + (59797 * (t >>> 16) << 16); + } + return (((t = 1540483477 * (65535 & (t ^= t >>> 13)) + (59797 * (t >>> 16) << 16)) ^ t >>> 15) >>> 0).toString(36); + }, at = { + animationIterationCount: 1, + borderImageOutset: 1, + borderImageSlice: 1, + borderImageWidth: 1, + boxFlex: 1, + boxFlexGroup: 1, + boxOrdinalGroup: 1, + columnCount: 1, + columns: 1, + flex: 1, + flexGrow: 1, + flexPositive: 1, + flexShrink: 1, + flexNegative: 1, + flexOrder: 1, + gridRow: 1, + gridRowEnd: 1, + gridRowSpan: 1, + gridRowStart: 1, + gridColumn: 1, + gridColumnEnd: 1, + gridColumnSpan: 1, + gridColumnStart: 1, + msGridRow: 1, + msGridRowSpan: 1, + msGridColumn: 1, + msGridColumnSpan: 1, + fontWeight: 1, + lineHeight: 1, + opacity: 1, + order: 1, + orphans: 1, + tabSize: 1, + widows: 1, + zIndex: 1, + zoom: 1, + WebkitLineClamp: 1, + fillOpacity: 1, + floodOpacity: 1, + stopOpacity: 1, + strokeDasharray: 1, + strokeDashoffset: 1, + strokeMiterlimit: 1, + strokeOpacity: 1, + strokeWidth: 1 + }, it = /[A-Z]|^ms/g, st = /_EMO_([^_]+?)_([^]*?)_EMO_/g, ct = function (e) { + return 45 === e.charCodeAt(1); + }, lt = function (e) { + return null != e && 'boolean' !== typeof e; + }, ut = Wn(function (e) { + return ct(e) ? e : e.replace(it, '-$&').toLowerCase(); + }), pt = function (e, n) { + switch (e) { + case 'animation': + case 'animationName': + if ('string' === typeof n) + return n.replace(st, function (e, n, t) { + return ft = { + name: n, + styles: t, + next: ft + }, n; + }); + } + return 1 === at[e] || ct(e) || 'number' !== typeof n || 0 === n ? n : n + 'px'; + }; + function dt(e, n, t) { + if (null == t) + return ''; + if (void 0 !== t.__emotion_styles) + return t; + switch (typeof t) { + case 'boolean': + return ''; + case 'object': + if (1 === t.anim) + return ft = { + name: t.name, + styles: t.styles, + next: ft + }, t.name; + if (void 0 !== t.styles) { + var r = t.next; + if (void 0 !== r) + for (; void 0 !== r;) + ft = { + name: r.name, + styles: r.styles, + next: ft + }, r = r.next; + return t.styles + ';'; + } + return function (e, n, t) { + var r = ''; + if (Array.isArray(t)) + for (var o = 0; o < t.length; o++) + r += dt(e, n, t[o]) + ';'; + else + for (var a in t) { + var i = t[a]; + if ('object' !== typeof i) + null != n && void 0 !== n[i] ? r += a + '{' + n[i] + '}' : lt(i) && (r += ut(a) + ':' + pt(a, i) + ';'); + else if (!Array.isArray(i) || 'string' !== typeof i[0] || null != n && void 0 !== n[i[0]]) { + var s = dt(e, n, i); + switch (a) { + case 'animation': + case 'animationName': + r += ut(a) + ':' + s + ';'; + break; + default: + r += a + '{' + s + '}'; + } + } else + for (var c = 0; c < i.length; c++) + lt(i[c]) && (r += ut(a) + ':' + pt(a, i[c]) + ';'); + } + return r; + }(e, n, t); + case 'function': + if (void 0 !== e) { + var o = ft, a = t(e); + return ft = o, dt(e, n, a); + } + break; + case 'string': + } + if (null == n) + return t; + var i = n[t]; + return void 0 !== i ? i : t; + } + var ft, mt = /label:\s*([^\s;\n{]+)\s*;/g; + var ht = function (e, n, t) { + if (1 === e.length && 'object' === typeof e[0] && null !== e[0] && void 0 !== e[0].styles) + return e[0]; + var r = !0, o = ''; + ft = void 0; + var a = e[0]; + null == a || void 0 === a.raw ? (r = !1, o += dt(t, n, a)) : o += a[0]; + for (var i = 1; i < e.length; i++) + o += dt(t, n, e[i]), r && (o += a[i]); + mt.lastIndex = 0; + for (var s, c = ''; null !== (s = mt.exec(o));) + c += '-' + s[1]; + return { + name: ot(o) + c, + styles: o, + next: ft + }; + }, gt = Object.prototype.hasOwnProperty, yt = ne('undefined' !== typeof HTMLElement ? et({ key: 'css' }) : null), vt = (yt.Provider, function (e) { + return Ie(function (n, t) { + var r = _e(yt); + return e(n, r, t); + }); + }), bt = ne({}); + Yn(function (e) { + return Yn(function (n) { + return function (e, n) { + return 'function' === typeof n ? n(e) : nt({}, e, {}, n); + }(e, n); + }); + }); + var _t = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__'; + vt(function (e, n, t) { + var r = e.css; + 'string' === typeof r && void 0 !== n.registered[r] && (r = n.registered[r]); + var o = e[_t], a = [r], i = ''; + 'string' === typeof e.className ? i = tt(n.registered, a, e.className) : null != e.className && (i = e.className + ' '); + var s = ht(a, void 0, 'function' === typeof r || Array.isArray(r) ? _e(bt) : void 0); + rt(n, s, 'string' === typeof o); + i += n.key + '-' + s.name; + var c = {}; + for (var l in e) + gt.call(e, l) && 'css' !== l && l !== _t && (c[l] = e[l]); + return c.ref = t, c.className = i, q(o, c); + }); + t(5); + var xt = vt(function (e, n) { + var t = e.styles, r = ht([t], void 0, 'function' === typeof t || Array.isArray(t) ? _e(bt) : void 0), o = ye(); + return ge(function () { + var e = n.key + '-global', t = new cn({ + key: e, + nonce: n.sheet.nonce, + container: n.sheet.container, + speedy: n.sheet.isSpeedy + }), a = document.querySelector('style[qc-data-emotion="' + e + ' ' + r.name + '"]'); + return n.sheet.tags.length && (t.before = n.sheet.tags[0]), null !== a && t.hydrate([a]), o.current = t, function () { + t.flush(); + }; + }, [n]), ge(function () { + void 0 !== r.next && rt(n, r.next, !0); + var e = o.current; + if (e.tags.length) { + var t = e.tags[e.tags.length - 1].nextElementSibling; + e.before = t, e.flush(); + } + n.insert('', r, e, !1); + }, [ + n, + r.name + ]), null; + }); + function Et() { + for (var e = arguments.length, n = new Array(e), t = 0; t < e; t++) + n[t] = arguments[t]; + return ht(n); + } + var Ct, kt, wt, St, Lt, Pt, Tt, qt, At, It, Ot; + function Nt(e, n) { + if (null == e) + return {}; + var t, r, o = function (e, n) { + if (null == e) + return {}; + var t, r, o = {}, a = Object.keys(e); + for (r = 0; r < a.length; r++) + t = a[r], n.indexOf(t) >= 0 || (o[t] = e[t]); + return o; + }(e, n); + if (Object.getOwnPropertySymbols) { + var a = Object.getOwnPropertySymbols(e); + for (r = 0; r < a.length; r++) + t = a[r], n.indexOf(t) >= 0 || Object.prototype.propertyIsEnumerable.call(e, t) && (o[t] = e[t]); + } + return o; + } + function Rt(e, n) { + return n || (n = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(n) } })); + } + !function (e) { + e.GO_TO_PAGE = 'goToPage', e.PURPOSE = 'purpose', e.LEGITIMATE_PURPOSE = 'legitimatePurpose', e.LEGITIMATE_VENDOR = 'legitimateVendor', e.SPECIAL_FEATURE = 'specialFeature', e.STACK = 'stack', e.PARTIAL_CONSENT = 'partial', e.SAVE_AND_EXIT = 'saveAndExit', e.ACCEPT_ALL = 'acceptAll', e.REJECT_ALL = 'rejectAll', e.ACCEPT_ALL_LEGITIMATE = 'acceptAllLegitimate', e.OBJECT_ALL_LEGITIMATE = 'objectAllLegitimate', e.ACCEPT_ALL_VENDORS = 'acceptAllVendors', e.REJECT_ALL_VENDORS = 'rejectAllVendors', e.ACCEPT_ALL_PURPOSES = 'acceptAllPurposes', e.REJECT_ALL_PURPOSES = 'rejectAllPurposes', e.VENDOR = 'vendor', e.NON_IAB_VENDOR = 'nonIabVendor', e.DISMISS_UI = 'dismissUi', e.START_ON_PAGE = 'startOnPage', e.OPT_OUT_TOGGLE = 'optOutToggle', e.OPT_OUT_CONFIRM = 'optOutConfirm', e.EXPAND_ELEMENT = 'expandElement', e.COLLAPSE_ELEMENT = 'collapseElement', e.GOOGLE = 'googlePartner'; + }(Ct || (Ct = {})), function (e) { + e.MANDATORY = 'tcfui:mandatory', e.CHANGE_OF_CONSENT = 'tcfui:changeofconsent', e.CCPA = 'uspui:donotsell'; + }(kt || (kt = {})), (St = wt || (wt = {})).FEATURES = 'Features', St.NON_IAB = 'Non IAB', St.PURPOSES = 'Purposes', St.LEGITIMATE_PURPOSES = 'Legitimate Purposes', St.LEGITIMATE_VENDORS = 'Legitimate Vendors', St.SPECIAL_PURPOSES = 'Special Purposes', St.SPECIAL_FEATURES = 'Special Features', St.VENDORS = 'Vendors', St.STACKS = 'Stacks', St.GOOGLE = 'Google', function (e) { + e.INIT = 'init', e.NAVIGATION = 'navigation', e.DONE = 'done'; + }(Lt || (Lt = {})), function (e) { + e.ACCEPT_ALL = 'All', e.ACCEPT_PARTIAL = 'Partial', e.REJECT = 'Reject'; + }(Pt || (Pt = {})), function (e) { + e.NONE_OBJECTED = 'None', e.ALL_OBJECTED = 'All'; + }(Tt || (Tt = {})), function (e) { + e.STACKS = 'stacks', e.VENDORS = 'vendors', e.FEATURES = 'features', e.PURPOSES = 'purposes', e.SPECIAL_FEATURES = 'specialFeatures', e.SPECIAL_PURPOSES = 'specialPurposes', e.FLEXIBLE_PURPOSES = 'flexiblePurposes', e.LEGITIMATE_VENDORS = 'legitimateVendors', e.LEGITIMATE_PURPOSES = 'legitimatePurposes', e.UNFILTERED_FEATURES = 'unfilteredFeatures', e.UNFILTERED_PURPOSES = 'unfilteredPurposes', e.UNFILTERED_SPECIAL_FEATURES = 'unfilteredSpecialFeatures', e.UNFILTERED_SPECIAL_PURPOSES = 'unfilteredSpecialPurposes'; + }(qt || (qt = {})), function (e) { + e.CONSENT_RESPONSE = 'consent-response', e.CONSENT_UI = 'consent-ui'; + }(At || (At = {})), function (e) { + e[e.GDPR = 2] = 'GDPR', e[e.USP = 3] = 'USP'; + }(It || (It = {})), function (e) { + e.ACCEPT = 'accept', e.REJECT = 'reject', e.DISMISS = 'dismiss', e.ENTER_FULLSCREEN = 'enter-fullscreen'; + }(Ot || (Ot = {})); + var Ut = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|inert|itemProp|itemScope|itemType|itemID|itemRef|on|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/, Dt = Wn(function (e) { + return Ut.test(e) || 111 === e.charCodeAt(0) && 110 === e.charCodeAt(1) && e.charCodeAt(2) < 91; + }), Bt = function (e) { + return 'theme' !== e; + }, jt = function (e) { + return 'string' === typeof e && e.charCodeAt(0) > 96 ? Dt : Bt; + }, Ft = function (e, n, t) { + var r; + if (n) { + var o = n.shouldForwardProp; + r = e.__emotion_forwardProp && o ? function (n) { + return e.__emotion_forwardProp(n) && o(n); + } : o; + } + return 'function' !== typeof r && t && (r = e.__emotion_forwardProp), r; + }, Vt = function e(n, t) { + var r, o, a = n.__emotion_real === n, i = a && n.__emotion_base || n; + void 0 !== t && (r = t.label, o = t.target); + var s = Ft(n, t, a), c = s || jt(i), l = !c('as'); + return function () { + var u = arguments, p = a && void 0 !== n.__emotion_styles ? n.__emotion_styles.slice(0) : []; + if (void 0 !== r && p.push('label:' + r + ';'), null == u[0] || void 0 === u[0].raw) + p.push.apply(p, u); + else { + 0, p.push(u[0][0]); + for (var d = u.length, f = 1; f < d; f++) + p.push(u[f], u[0][f]); + } + var m = vt(function (e, n, t) { + var r = l && e.as || i, a = '', u = [], d = e; + if (null == e.theme) { + for (var f in (d = {}, e)) + d[f] = e[f]; + d.theme = _e(bt); + } + 'string' === typeof e.className ? a = tt(n.registered, u, e.className) : null != e.className && (a = e.className + ' '); + var m = ht(p.concat(u), n.registered, d); + rt(n, m, 'string' === typeof r); + a += n.key + '-' + m.name, void 0 !== o && (a += ' ' + o); + var h = l && void 0 === s ? jt(r) : c, g = {}; + for (var y in e) + l && 'as' === y || h(y) && (g[y] = e[y]); + return g.className = a, g.ref = t, q(r, g); + }); + return m.displayName = void 0 !== r ? r : 'Styled(' + ('string' === typeof i ? i : i.displayName || i.name || 'Component') + ')', m.defaultProps = n.defaultProps, m.__emotion_real = m, m.__emotion_base = i, m.__emotion_styles = p, m.__emotion_forwardProp = s, Object.defineProperty(m, 'toString', { + value: function () { + return '.' + o; + } + }), m.withComponent = function (n, r) { + return e(n, nt({}, t, {}, r, { shouldForwardProp: Ft(m, r, !0) })).apply(void 0, p); + }, m; + }; + }.bind(); + [ + 'a', + 'abbr', + 'address', + 'area', + 'article', + 'aside', + 'audio', + 'b', + 'base', + 'bdi', + 'bdo', + 'big', + 'blockquote', + 'body', + 'br', + 'button', + 'canvas', + 'caption', + 'cite', + 'code', + 'col', + 'colgroup', + 'data', + 'datalist', + 'dd', + 'del', + 'details', + 'dfn', + 'dialog', + 'div', + 'dl', + 'dt', + 'em', + 'embed', + 'fieldset', + 'figcaption', + 'figure', + 'footer', + 'form', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'head', + 'header', + 'hgroup', + 'hr', + 'html', + 'i', + 'iframe', + 'img', + 'input', + 'ins', + 'kbd', + 'keygen', + 'label', + 'legend', + 'li', + 'link', + 'main', + 'map', + 'mark', + 'marquee', + 'menu', + 'menuitem', + 'meta', + 'meter', + 'nav', + 'noscript', + 'object', + 'ol', + 'optgroup', + 'option', + 'output', + 'p', + 'param', + 'picture', + 'pre', + 'progress', + 'q', + 'rp', + 'rt', + 'ruby', + 's', + 'samp', + 'script', + 'section', + 'select', + 'small', + 'source', + 'span', + 'strong', + 'style', + 'sub', + 'summary', + 'sup', + 'table', + 'tbody', + 'td', + 'textarea', + 'tfoot', + 'th', + 'thead', + 'time', + 'title', + 'tr', + 'track', + 'u', + 'ul', + 'var', + 'video', + 'wbr', + 'circle', + 'clipPath', + 'defs', + 'ellipse', + 'foreignObject', + 'g', + 'image', + 'line', + 'linearGradient', + 'mask', + 'path', + 'pattern', + 'polygon', + 'polyline', + 'radialGradient', + 'rect', + 'stop', + 'svg', + 'text', + 'tspan' + ].forEach(function (e) { + Vt[e] = Vt(e); + }); + var Gt = Vt, Mt = /^#([\dA-F]{6}|[\dA-F]{3})$/i, zt = function () { + function e() { + u(this, e), this._uxPrimaryButtonTextColor = void 0, this._uxPrimaryButtonColor = void 0, this._uxSecondaryButtonTextColor = void 0, this._uxSecondaryButtonColor = void 0, this._uxFontColor = void 0, this._uxBackgroundColor = void 0, this._uxToogleActiveColor = void 0, this._uxLinkColor = void 0, this._primaryButtonHoverBackground = void 0, this._secondaryButtonHoverBackground = void 0, this._secondaryTextColor = void 0, this._lightTextColor = void 0, this._lightestTextColor = void 0, this._overlayColor = void 0, this._borderColor = void 0, this._subHeaderColor = void 0, this._persistentConsentLinkColor = void 0, this._persistentConsentLinkTextColor = void 0, this._warningBackgroundColor = void 0, this._warningTextColor = void 0, this._font = void 0; + var n = sa.theme, t = n.uxPrimaryButtonColor, r = n.uxBackgroundColor, o = n.uxFontColor, a = n.uxPrimaryButtonTextColor, i = n.uxSecondaryButtonColor, s = n.uxSecondaryButtonTextColor, c = n.uxToogleActiveColor, l = n.uxLinkColor; + this._uxPrimaryButtonTextColor = a, this._uxPrimaryButtonColor = t, this._uxSecondaryButtonTextColor = s, this._uxSecondaryButtonColor = i, this._uxFontColor = o, this._uxBackgroundColor = r, this._uxToogleActiveColor = c, this._uxLinkColor = l, this._primaryButtonHoverBackground = e.LightenDarkenColor(this._uxPrimaryButtonColor, 30), this._secondaryButtonHoverBackground = t, this._subHeaderColor = '#212934', this._secondaryTextColor = '#4D545D', this._lightTextColor = '#7A7F85', this._lightestTextColor = '#B7B7B7', this._overlayColor = 'rgba(33, 41, 52, 0.75)', this._borderColor = '#D8D8D8', this._persistentConsentLinkColor = '#368BD6', this._persistentConsentLinkTextColor = '#FFF', this._warningBackgroundColor = 'rgba(255, 229, 143, 0.35)', this._warningTextColor = '#FAAD14', this._font = 'Helvetica, Arial, sans-serif'; + } + return d(e, [ + { + key: 'checkValidHex', + value: function (e, n) { + Mt.test(e) ? this[n] = e : console.warn(''.concat(e, ' is not a valid hex value')); + } + }, + { + key: 'uxLinkColor', + get: function () { + return this._uxLinkColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxLinkColor'); + } + }, + { + key: 'uxToogleActiveColor', + get: function () { + return this._uxToogleActiveColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxToogleActiveColor'); + } + }, + { + key: 'uxPrimaryButtonTextColor', + get: function () { + return this._uxPrimaryButtonTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxPrimaryButtonTextColor'); + } + }, + { + key: 'uxPrimaryButtonColor', + get: function () { + return this._uxPrimaryButtonColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxPrimaryButtonColor'); + } + }, + { + key: 'primaryButtonHoverBackground', + get: function () { + return this._primaryButtonHoverBackground; + }, + set: function (e) { + this.checkValidHex(e, '_primaryButtonHoverBackground'); + } + }, + { + key: 'uxSecondaryButtonTextColor', + get: function () { + return this._uxSecondaryButtonTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxSecondaryButtonTextColor'); + } + }, + { + key: 'uxSecondaryButtonColor', + get: function () { + return this._uxSecondaryButtonColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxSecondaryButtonColor'); + } + }, + { + key: 'secondaryButtonHoverBackground', + get: function () { + return this._secondaryButtonHoverBackground; + }, + set: function (e) { + this.checkValidHex(e, '_secondaryButtonHoverBackground'); + } + }, + { + key: 'uxFontColor', + get: function () { + return this._uxFontColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxFontColor'); + } + }, + { + key: 'secondaryTextColor', + get: function () { + return this._secondaryTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_secondaryTextColor'); + } + }, + { + key: 'lightTextColor', + get: function () { + return this._lightTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_lightTextColor'); + } + }, + { + key: 'lightestTextColor', + get: function () { + return this._lightestTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_lightestTextColor'); + } + }, + { + key: 'uxBackgroundColor', + get: function () { + return this._uxBackgroundColor; + }, + set: function (e) { + this.checkValidHex(e, '_uxBackgroundColor'); + } + }, + { + key: 'overlayColor', + get: function () { + return this._overlayColor; + }, + set: function (e) { + this._overlayColor = e; + } + }, + { + key: 'borderColor', + get: function () { + return this._borderColor; + }, + set: function (e) { + this.checkValidHex(e, '_borderColor'); + } + }, + { + key: 'subHeaderColor', + get: function () { + return this._subHeaderColor; + }, + set: function (e) { + this.checkValidHex(e, '_subHeaderColor'); + } + }, + { + key: 'warningBackgroundColor', + get: function () { + return this._warningBackgroundColor; + }, + set: function (e) { + this._warningBackgroundColor = e; + } + }, + { + key: 'warningTextColor', + get: function () { + return this._warningTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_warningTextColor'); + } + }, + { + key: 'persistentConsentLinkColor', + get: function () { + return this._persistentConsentLinkColor; + }, + set: function (e) { + this.checkValidHex(e, '_persistentConsentLinkColor'); + } + }, + { + key: 'persistentConsentLinkTextColor', + get: function () { + return this._persistentConsentLinkTextColor; + }, + set: function (e) { + this.checkValidHex(e, '_persistentConsentLinkTextColor'); + } + }, + { + key: 'font', + get: function () { + return this._font; + }, + set: function (e) { + this._font = e; + } + } + ], [{ + key: 'LightenDarkenColor', + value: function (e, n) { + var t = !1; + '#' === e[0] && (e = e.slice(1), t = !0); + var r = parseInt(e, 16), o = (r >> 16) + n; + o > 255 ? o = 255 : o < 0 && (o = 0); + var a = (r >> 8 & 255) + n; + a > 255 ? a = 255 : a < 0 && (a = 0); + var i = (255 & r) + n; + return i > 255 ? i = 255 : i < 0 && (i = 0), (t ? '#' : '') + (i | a << 8 | o << 16).toString(16); + } + }]), e; + }(); + function Ht() { + var e = Rt([ + '\n @media (min-width: 768px) {\n min-width: 190px;\n min-height: 40px;\n font-size: ', + 'px;\n padding: ', + ';\n }\n ' + ]); + return Ht = function () { + return e; + }, e; + } + function $t() { + var e = Rt([ + '\n border: none;\n font-size: 14px;\n padding: 5px 0;\n width: auto;\n height: auto;\n font-weight: 500;\n letter-spacing: 0;\n background: none;\n color: ', + ';\n box-shadow: none;\n margin-top: 0;\n\n &.qc-cmp2-link-active {\n color: ', + ';\n cursor: default;\n }\n\n &.qc-cmp2-link-inline {\n display: inline-flex;\n min-width: 0;\n min-height: 0;\n text-transform: none;\n margin: 0;\n padding: 0;\n line-height: 1;\n color: ', + ';\n }\n\n &:hover {\n background: none;\n }\n\n @media (min-width: 768px) {\n font-size: ', + 'px;\n }\n ' + ]); + return $t = function () { + return e; + }, e; + } + function Yt() { + var e = Rt([ + '\n background: ', + ';\n border: solid 1px ', + ';\n color: ', + ';\n\n @media (min-width: 768px) {\n &:hover {\n background: ', + ';\n border-color: ', + ';\n color: ', + ';\n }\n }\n ' + ]); + return Yt = function () { + return e; + }, e; + } + function Wt() { + var e = Rt([ + '\n &&,\n && &:hover {\n background: ', + ';\n border: solid 1px\n ', + ';\n color: ', + ';\n }\n ' + ]); + return Wt = function () { + return e; + }, e; + } + function Jt() { + var e = Rt([ + '\n&& {\n align-content: center;\n backface-visibility: hidden;\n border: none;\n background: ', + ';\n border-radius: 2px;\n color: ', + ';\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 13px;\n line-height: 0;\n min-height: 34px;\n justify-content: center;\n letter-spacing: 2px;\n margin: 0.5em;\n padding: 12px;\n text-align: center;\n text-transform: uppercase;\n transition: all 0.35s ease;\n white-space: nowrap;\n width: 95%;\n box-shadow: 0 1px 1px 1px rgba(0,0,0,.1);\n\n @media(min-width: 768px) {\n &:hover {\n background: ', + ';\n }\n }\n\n ', + '\n\n ', + '\n\n ', + '\n\n ', + '\n\n @media(max-width: 360px) {\n /* support for iPhone 5/SE Galaxy S5 */\n margin: 0.3em;\n }\n}\n' + ]); + return Jt = function () { + return e; + }, e; + } + var Xt = Gt.button(Jt(), function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.uxPrimaryButtonTextColor; + }, function (e) { + return e.primaryButtonHoverBackground; + }, function (e) { + var n = e.disabled, t = (e.uxSecondaryButtonColor, e.uxSecondaryButtonTextColor); + return n && Et(Wt(), zt.LightenDarkenColor(t, -30), zt.LightenDarkenColor(t, -30), zt.LightenDarkenColor(t, -30)); + }, function (e) { + var n = e.uxSecondaryButtonColor, t = e.uxSecondaryButtonTextColor, r = e.mode, o = e.secondaryButtonHoverBackground, a = e.uxPrimaryButtonTextColor; + return 'secondary' === r && Et(Yt(), n, t, t, o, o, a); + }, function (e) { + var n = e.mode, t = e.uxPrimaryButtonColor, r = e.secondaryTextColor, o = e.uxLinkColor, a = e.isLong; + return 'link' === n && Et($t(), t, r, o, a ? 11 : 14); + }, function (e) { + return 'large' === e.size && Et(Ht(), e.isLong ? 11 : 14, e.isLong ? '0 15px !important' : 0); + }), Kt = function (e) { + var n = e.children, t = Nt(e, ['children']); + return tn.createElement(Xt, Object.assign({}, t, { + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + uxPrimaryButtonTextColor: ia.uxPrimaryButtonTextColor, + primaryButtonHoverBackground: ia.primaryButtonHoverBackground, + uxSecondaryButtonColor: ia.uxSecondaryButtonColor, + uxSecondaryButtonTextColor: ia.uxSecondaryButtonTextColor, + uxLinkColor: ia.uxLinkColor, + secondaryButtonHoverBackground: ia.secondaryButtonHoverBackground, + secondaryTextColor: ia.secondaryTextColor + }), n); + }; + Kt.defaultProps = { + tabIndex: '0', + type: 'button', + mode: 'primary', + size: 'large', + className: '' + }; + var Qt, Zt = Kt; + function er(e, n, t, r) { + var o = t && document.getElementById(t); + return o || (o = document.createElement(e), n && (o.className = n), t && (o.id = t), r && r.insertBefore(o, r.firstChild)), o; + } + !function (e) { + e.GLOBAL = 'global', e.SERVICE = 'service', e.GLOBAL_GROUP = 'global group', e.SERVICE_GROUP = 'service group'; + }(Qt || (Qt = {})); + var nr = function (e) { + var n = e.coreConfig, t = n.publisherFeaturesIds, r = n.publisherSpecialFeaturesIds, o = n.publisherSpecialPurposesIds, a = n.publisherPurposeIds, i = n.publisherPurposeLegitimateInterestIds, s = n.vendorPurposeIds, c = n.vendorPurposeLegitimateInterestIds, l = n.vendorSpecialFeaturesIds, u = n.vendorSpecialPurposesIds, p = n.vendorFeaturesIds, d = [ + t, + r, + o, + a, + i, + s, + c, + l, + u, + p + ], f = (s || []).length; + return d.forEach(function (e) { + var n; + (n = e) && n.sort(function (e, n) { + return e - n; + }); + }), { + purposeIds: (f ? s : a) || [], + purposeLegitimateInterestIds: (f ? c : i) || [], + specialFeaturesIds: (f ? l : r) || [], + specialPurposesIds: (f ? u : o) || [], + featuresIds: (f ? p : t) || [] + }; + }; + var tr = function (e, n) { + e && window.parent.postMessage(n, '*'); + }, rr = function (e, n, t) { + return n ? tn.createElement(tn.Fragment, null, e.split(n).reduce(function (e, r, o) { + return o ? e.concat(tn.createElement('a', { + href: t.consentScopeGroupURL, + target: '_blank', + rel: 'noopener noreferrer', + key: n + r + }, n), r) : [r]; + }, [])) : e; + }, or = function (e, n) { + var t = function () { + tr(sa.coreConfig.isAMP, { + type: At.CONSENT_UI, + action: Ot.ENTER_FULLSCREEN + }), window.__tcfapiui('goToPage', 2); + }; + return n ? tn.createElement(tn.Fragment, null, e.split(n).reduce(function (e, r, o) { + return o ? e.concat(tn.createElement(Zt, { + onClick: t, + mode: 'link', + className: 'qc-cmp2-link-inline', + key: n + r + }, n), r) : [r]; + }, [])) : e; + }, ar = function (e, n) { + return tn.createElement('div', null, e.split('[[/]]').reduce(function (e, t, r) { + return e.concat(ir(t, n, r)); + }, [])); + }, ir = function (e, n, t) { + if (!e.length) + return e; + var r = new RegExp(/\[\[(.*?)\]\]/), o = new RegExp(/((.*?)([=@])?\|(.*?))|((.*?)\*)|(\/)/); + return tn.createElement('p', { key: 'p-' + t }, e.split(r).reduce(function (e, t, r) { + if (!r && !t.match(o)) + return [t]; + var a = t.split('|'), i = a[0], s = i.slice(-1), c = i.slice(0, i.length - 1), l = a[1], u = t; + if ('*' === s) + u = tn.createElement('strong', { key: r }, c); + else if ('=' === s) + if (l.match(new RegExp(/{(.*?)}/))) { + var p = l.slice(1, l.length - 1); + p && n[p] && (u = tn.createElement('a', { + href: n[p], + key: r + }, c)); + } else + u = tn.createElement('a', { + href: l, + key: r + }, c); + else + '@' === s && (u = tn.createElement('a', { + onClick: function () { + return window.__tcfapiui('goToPage', Number(l)); + }, + href: '#', + key: r + }, c)); + return e.concat(u); + }, [])); + }, sr = function (e, n, t) { + if (e.includes('[break]')) { + var r = e.split('[break]'), o = []; + return r.length > 1 && r[1].split('
').forEach(function (e, n) { + o.push(tn.createElement('p', { + key: n, + dangerouslySetInnerHTML: { __html: e } + })); + }), [tn.createElement('p', { key: -1 }, or(r[0], n))].concat(o); + } + return [tn.createElement('div', { key: -1 }, ar(e, t))]; + }, cr = function (e) { + Object({ + NODE_ENV: 'production', + PUBLIC_URL: '', + AMP_FRAME_URL_BASE: 'https://quantcast.mgr.consensu.org/tcfv2/32', + AMP_CHECK_CONSENT_URL: 'https://apis.quantcast.mgr.consensu.org/amp/check-consent', + LOCAL_STATIC_DIR: '', + REACT_APP_LOG_API: 'https://audit-tcfv2.quantcast.mgr.consensu.org', + REACT_APP_GEOIP_API_URL: 'https://apis.quantcast.mgr.consensu.org/geoip', + REACT_APP_CMP_COOKIE_API: 'https://apis.quantcast.mgr.consensu.org/CookieAccessV2', + REACT_APP_GOOGLE_ATP_URL: 'https://quantcast.mgr.consensu.org/tcfv2/google-atp-list.json', + REACT_APP_VERSION: '32', + REACT_APP_CMPUI_SRC: 'https://quantcast.mgr.consensu.org/tcfv2/32/cmp2ui.js', + REACT_APP_GVL_BASE_URL: 'https://quantcast.mgr.consensu.org/GVL-v2/', + REACT_APP_TRANSLATION_BASE_URL: 'https://www.quantcast.mgr.consensu.org/tcfv2/translations/' + }).REACT_APP_DEBUG && console.log('Debug: ' + e); + }, lr = function () { + return window.navigator.userAgent.indexOf('Trident/') > -1; + }, ur = function (e, n) { + if (Array.isArray(e) && e.length) { + var t = [], r = [], o = function (e) { + return e.sort(function (e, t) { + return n && isNaN(e[n]) ? -1 : e.name.toLowerCase().localeCompare(t.name.toLowerCase()); + }); + }; + return navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && n ? (e.forEach(function (e) { + isNaN(e[n]) ? t.push(e) : r.push(e); + }), [].concat(t, i(o(r)))) : o(e); + } + return e; + }, pr = function (e) { + var n, t = e.coreUiLabels, r = e.acceptAllFunction, o = e.rejectAllFunction, a = e.acceptSelected, i = e.page, s = e.showRejectButton, c = e.showOverlay, l = e.isScrolled, u = e.isAmp, p = sa.coreConfig.lang_, d = t ? t.saveAndExitButton.length > 18 || t.agreeButton.length > 18 || t.initScreenSettingsButton.length > 18 || t.initScreenRejectButton.length > 18 : null, f = t ? 'en' !== p && t.legitimateInterestLink.length > 18 || t.purposeScreenVendorLink.length > 18 : null; + return n = 0 === i ? tn.createElement('div', { className: 'qc-cmp2-summary-buttons' }, s && tn.createElement(Zt, { + isLong: d, + onClick: o, + mode: 'secondary', + 'aria-label': t.initScreenRejectButton, + 'aria-pressed': 'false' + }, t.initScreenRejectButton), tn.createElement(Zt, { + isLong: d, + onClick: function () { + window.__tcfapiui('goToPage', 1), tr(u, { + type: At.CONSENT_UI, + action: Ot.ENTER_FULLSCREEN + }); + }, + mode: 'secondary', + 'aria-label': t.initScreenSettingsButton, + 'aria-pressed': 'false' + }, t.initScreenSettingsButton), tn.createElement(Zt, { + isLong: d, + onClick: r, + 'aria-label': t.agreeButton, + 'aria-pressed': 'false' + }, t.agreeButton)) : tn.createElement(tn.Fragment, null, tn.createElement(Zt, { + isLong: d, + onClick: a, + className: 'qc-cmp2-hide-desktop', + 'aria-label': t.saveAndExitButton, + 'aria-pressed': 'false' + }, t.saveAndExitButton), tn.createElement('div', { className: 'qc-cmp2-footer-links' }, tn.createElement(Zt, { + isLong: f, + onClick: function () { + window.__tcfapiui('goToPage', 2); + }, + mode: 'link', + size: 'small', + className: 2 === i ? 'qc-cmp2-link-active' : '', + 'aria-label': t.purposeScreenVendorLink, + 'aria-pressed': 'false' + }, t.purposeScreenVendorLink), tn.createElement(Zt, { + isLong: f, + onClick: function () { + window.__tcfapiui('goToPage', 3); + }, + mode: 'link', + size: 'small', + className: 3 === i ? 'qc-cmp2-link-active' : '', + 'aria-label': t.legitimateInterestLink, + 'aria-pressed': 'false' + }, t.legitimateInterestLink)), tn.createElement('div', { className: 'qc-cmp2-buttons-desktop' }, tn.createElement(Zt, { + isLong: d, + onClick: a, + 'aria-label': t.saveAndExitButton, + 'aria-pressed': 'false' + }, t.saveAndExitButton))), tn.createElement('div', { className: 'qc-cmp2-footer '.concat(c ? 'qc-cmp2-footer-overlay' : '', ' ').concat(l ? 'qc-cmp2-footer-scrolled' : '') }, n); + }; + function dr() { + var e = Rt(['\n width: 130px;\n\n img {\n max-width: 100%;\n height: auto;\n }\n\n @media (min-width: 768px) {\n width: 170px;\n }\n ']); + return dr = function () { + return e; + }, e; + } + function fr() { + var e = Rt(['\n height: 45px;\n text-align: center;\n\n img {\n max-height: 100%;\n }\n\n @media (min-width: 768px) {\n height: 60px;\n text-align: center;\n max-width: 770px;\n }\n ']); + return fr = function () { + return e; + }, e; + } + function mr() { + var e = Rt([ + '\n && {\n ', + '\n }\n' + ]); + return mr = function () { + return e; + }, e; + } + var hr = Gt.div(mr(), function (e) { + return Et(e.isSquare ? fr() : dr()); + }), gr = function (e) { + var n = e.logoUrl, t = g(fe(!1), 2), r = t[0], o = t[1]; + return tn.createElement(hr, { + isSquare: r, + className: 'logo-container' + }, tn.createElement('img', { + alt: 'Publisher Logo', + src: n, + onLoad: function (e) { + var n = e.target; + n.offsetHeight >= n.offsetWidth && o(!0); + } + })); + }; + function yr() { + var e = Rt(['\n margin-top: 10px;\n margin-right: 3px;\n transform-origin: 15% 30%;\n\n .qc-cmp2-expandable-legal.qc-cmp2-expanded & {\n transform: rotate(90deg);\n }\n ']); + return yr = function () { + return e; + }, e; + } + function vr() { + var e = Rt(['\n height: 12px;\n transform: rotate(180deg);\n width: 12px;\n\n .expanded & {\n transform: rotate(270deg);\n }\n ']); + return vr = function () { + return e; + }, e; + } + function br() { + var e = Rt(['\n height: 19px;\n transform: rotate(180deg);\n width: 12px;\n\n .qc-cmp2-expanded & {\n transform: rotate(270deg);\n }\n ']); + return br = function () { + return e; + }, e; + } + function _r() { + var e = Rt(['\n margin-right: 5px;\n ']); + return _r = function () { + return e; + }, e; + } + function xr() { + var e = Rt([ + '\n &&& {\n transition: transform 0.3s ease;\n\n ', + '\n\n ', + '\n\n ', + '\n\n ', + '\n }\n' + ]); + return xr = function () { + return e; + }, e; + } + var Er = Gt.svg(xr(), function (e) { + return 'back' === e.type && Et(_r()); + }, function (e) { + return 'expand' === e.type && Et(br()); + }, function (e) { + return 'inner' === e.type && Et(vr()); + }, function (e) { + return 'fill' === e.type && Et(yr()); + }), Cr = function (e) { + var n, t = e.type; + switch (t) { + case 'fill': + n = tn.createElement('path', { + d: 'M5 4.5L0.5 0L0.5 9L5 4.5Z', + fill: 'currentColor' + }); + break; + case 'expand': + case 'inner': + n = tn.createElement(tn.Fragment, null, tn.createElement('defs', null, tn.createElement('path', { + d: 'M3.88716886,8.47048371 L12.1431472,0.315826419 C12.4725453,-0.0145777987 13.005189,-0.0145777987 13.3345872,0.315826419 L13.8321886,0.814947685 C14.1615867,1.1453519 14.1615867,1.67962255 13.8321886,2.01002677 L6.6625232,9.06802326 L13.8251801,16.1260197 C14.1545782,16.456424 14.1545782,16.9906946 13.8251801,17.3210988 L13.3275787,17.8202201 C12.9981806,18.1506243 12.4655368,18.1506243 12.1361387,17.8202201 L3.88016039,9.6655628 C3.55777075,9.33515858 3.55777075,8.80088793 3.88716886,8.47048371 Z', + id: 'path-1' + }), tn.createElement('rect', { + id: 'path-3', + x: '0', + y: '0', + width: '18', + height: '18' + })), tn.createElement('g', { + id: 'New---Mobile-2', + stroke: 'none', + strokeWidth: '1', + fill: 'none', + fillRule: 'evenodd' + }, tn.createElement('g', { + id: 'iPhone-11-6-Copy', + transform: 'translate(-23.000000, -138.000000)' + }, tn.createElement('g', { + id: 'v1', + transform: 'translate(20.000000, 138.000000)' + }, tn.createElement('g', { id: 'Icons/angle-left' }, tn.createElement('mask', { + id: 'mask-2', + fill: 'white' + }, tn.createElement('use', { href: '#path-1' })), tn.createElement('use', { + id: 'Mask', + fill: 'currentColor', + fillRule: 'nonzero', + href: '#path-1' + })))))); + break; + default: + n = tn.createElement(tn.Fragment, null, tn.createElement('defs', null, tn.createElement('path', { + d: 'M3.88716886,8.47048371 L12.1431472,0.315826419 C12.4725453,-0.0145777987 13.005189,-0.0145777987 13.3345872,0.315826419 L13.8321886,0.814947685 C14.1615867,1.1453519 14.1615867,1.67962255 13.8321886,2.01002677 L6.6625232,9.06802326 L13.8251801,16.1260197 C14.1545782,16.456424 14.1545782,16.9906946 13.8251801,17.3210988 L13.3275787,17.8202201 C12.9981806,18.1506243 12.4655368,18.1506243 12.1361387,17.8202201 L3.88016039,9.6655628 C3.55777075,9.33515858 3.55777075,8.80088793 3.88716886,8.47048371 Z', + id: 'path-1' + }), tn.createElement('rect', { + id: 'path-3', + x: '0', + y: '0', + width: '18', + height: '18' + })), tn.createElement('g', { + id: 'New---Mobile-2', + stroke: 'none', + strokeWidth: '1', + fill: 'none', + fillRule: 'evenodd' + }, tn.createElement('g', { + id: 'iPhone-11-6-Copy', + transform: 'translate(-23.000000, -138.000000)' + }, tn.createElement('g', { + id: 'v1', + transform: 'translate(20.000000, 138.000000)' + }, tn.createElement('g', { id: 'Icons/angle-left' }, tn.createElement('mask', { + id: 'mask-2', + fill: 'white' + }, tn.createElement('use', { href: '#path-1' })), tn.createElement('use', { + id: 'Mask', + fill: '#000000', + fillRule: 'nonzero', + href: '#path-1' + })))))); + } + return tn.createElement(Er, { + type: t, + width: '12px', + height: '19px', + viewBox: '0 0 12 19', + version: '1.1' + }, n); + }, kr = function (e) { + var n = e.coreUiLabels, t = e.page, r = e.handleScroll, o = e.bodyContent, a = e.isAmp, i = e.isDesktop, s = e.disabledAcceptAllButton, c = e.acceptAllHeader, l = e.rejectAllHeader, u = sa.coreConfig.publisherLogo, p = o.bodyText, d = o.isCustomized, f = n ? n.rejectAll.length > 18 || n.acceptAll.length > 18 || n.objectAllButton.length > 18 : null, m = function (e) { + return 0 === t ? tn.createElement('div', { + className: 'qc-cmp2-summary-info '.concat(u ? 'qc-cmp2-logo-displayed' : ''), + onScroll: function () { + return r && r(); + } + }, e.children) : tn.createElement('div', null, e.children); + }, h = function () { + return d ? tn.createElement('div', null, p) : Array.isArray(p) ? tn.createElement(tn.Fragment, null, p.map(function (e, n) { + return tn.createElement('p', { key: n }, e); + })) : tn.createElement('p', null, p); + }, g = function () { + return 0 === t ? null : tn.createElement('div', { className: 'qc-cmp2-header-links' }, tn.createElement(Zt, { + isLong: f, + onClick: l, + mode: 'link', + size: 'small', + 'aria-label': 3 === t ? n.objectAllButton : n.rejectAll, + 'aria-pressed': 'false' + }, 3 === t ? n.objectAllButton : n.rejectAll), tn.createElement(Zt, { + isLong: f, + onClick: c, + mode: 'link', + size: 'small', + disabled: s, + 'aria-label': n.acceptAll, + 'aria-pressed': 'false' + }, n.acceptAll)); + }; + return tn.createElement('div', { className: 'qc-cmp2-consent-info' }, tn.createElement('div', { className: 'qc-cmp2-publisher-logo-container' }, t > 1 && tn.createElement('button', { + className: 'qc-cmp2-home-button', + onClick: function () { + window.__tcfapiui('goToPage', t - 1); + }, + 'aria-label': n.back, + 'aria-pressed': 'false', + tabIndex: 0 + }, tn.createElement(Cr, { type: 'back' }), ' ', (!a || i) && n.back), tn.createElement('figure', null, u && tn.createElement(gr, { logoUrl: u }), tn.createElement('h2', null, n.initScreenTitle)), tn.createElement(m, null, tn.createElement(h, null)), tn.createElement(g, null))); + }; + function wr() { + var e = Rt(['\n height: 34px;\n\n svg {\n height: 22px;\n width: 14px;\n }\n ']); + return wr = function () { + return e; + }, e; + } + function Sr() { + var e = Rt([ + '\n && {\n list-style: none;\n margin: 0;\n overflow: hidden;\n padding: 0;\n width: 100%;\n\n &:first-of-type {\n .qc-cmp2-list-header {\n margin: 0;\n }\n }\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n .qc-cmp2-list-header {\n color: ', + ';\n font-size: 12px;\n font-weight: 900;\n text-transform: uppercase;\n margin-top: 20px;\n padding-left: 20px;\n }\n\n .qc-cmp2-list-item {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 14px;\n font-weight: 400;\n\n &.qc-cmp2-expanded {\n background: ', + ';\n z-index: 10;\n }\n\n &:only-of-type {\n border-bottom: 1px solid ', + ';\n }\n\n &:nth-of-type(even) {\n border-top: 1px solid ', + ';\n border-bottom: 1px solid ', + ';\n }\n\n .qc-cmp2-list-item-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: none;\n border: none;\n outline: none;\n box-shadow: none;\n text-align: left;\n padding: 0;\n min-height: 21px;\n cursor: pointer;\n color: ', + ';\n\n &:focus {\n padding: -20px;\n outline-style: solid;\n outline-color: #D8D8D8;\n }\n }\n\n &.qc-cmp2-list-item-legitimate {\n .qc-cmp2-list-item-title {\n width: 75%;\n }\n .qc-cmp2-toggle-switch {\n order: 2;\n }\n }\n\n .qc-cmp2-list-item-title {\n margin: 0;\n padding: 0;\n width: 80%;\n font-size: 14px;\n cursor: pointer;\n strong {\n color: ', + ';\n }\n }\n\n .qc-cmp2-list-item-status {\n color: ', + ';\n margin: 0 10px 0 0;\n padding: 0;\n cursor: pointer;\n word-wrap: normal;\n\n &.qc-cmp-long-label {\n font-size: 9px;\n line-height: 1em;\n }\n }\n\n img {\n transition: transform 0.2s ease;\n max-width: 12px;\n }\n\n &.qc-cmp2-toggle-switch {\n pointer-events: fill;\n padding: 0 20px;\n }\n\n .qc-cmp2-toggle {\n &:not(:last-child) {\n margin-right: 15px;\n }\n }\n\n .qc-cmp2-expandable-list {\n list-style: none;\n display: flex;\n justify-content: space-between;\n width: 100%;\n margin: 0;\n padding: 0;\n max-height: 0;\n opacity: 0;\n transition: opacity 0.2s ease, max-height 0.3s ease, padding 0.3s ease,\n margin 0.3s ease;\n pointer-events: none;\n\n &.qc-wrap {\n flex-wrap: wrap;\n\n .qc-cmp2-expandable-info {\n order: 1;\n }\n }\n\n p,\n li {\n font-size: 14px;\n line-height: 18px;\n font-weight: 400;\n color: ', + ';\n margin: 0;\n padding: 0;\n text-transform: none;\n\n a {\n color: ', + ';\n font-weight: 500;\n text-decoration: none;\n word-break: break-all;\n }\n\n &:not(:first-child) {\n strong {\n margin-top: 8px;\n display: block;\n }\n }\n }\n .qc-cmp2-expandable-info {\n width: 85%;\n\n .qc-cmp2-expandable-legal {\n .qc-cmp2-toggle-legal-button {\n text-transform: capitalize;\n margin-top: 10px;\n align-items: center;\n ', + '\n }\n\n .qc-cmp2-legal-description {\n display: none;\n padding-left: 15px;\n }\n\n &.qc-cmp2-expanded {\n .qc-cmp2-legal-description {\n margin-top: 10px;\n display: block;\n\n &.qc-cmp2-non-iab {\n opacity: 0.65;\n }\n }\n }\n }\n }\n }\n\n &.qc-cmp2-expanded {\n .qc-cmp2-expandable-list {\n max-height: 150000px;\n opacity: 1;\n pointer-events: fill;\n margin: 15px 0;\n }\n }\n }\n\n @media (min-width: 768px) {\n .qc-cmp2-list-item {\n padding: 15px;\n font-size: 14px;\n\n &.qc-cmp2-list-item-legitimate {\n .qc-cmp2-list-item-title {\n width: 82%;\n }\n }\n\n .qc-cmp2-list-item-title {\n width: 90%;\n }\n\n .qc-cmp2-expandable-list {\n &.qc-wrap {\n .qc-cmp2-expandable-info {\n order: 0;\n\n &.qc-w75 {\n width: 75%;\n }\n }\n }\n }\n\n .qc-cmp2-list-item-status {\n &.qc-cmp-long-label {\n font-size: 10px;\n }\n }\n }\n\n .qc-cmp2-list-header {\n padding-left: 0;\n }\n }\n @media (max-width: 768px) {\n .qc-cmp2-list-item {\n &.qc-cmp2-list-item-legitimate {\n .qc-cmp2-expandable-list {\n flex-wrap: no-wrap;\n .qc-cmp2-toggle-switch {\n order: 1;\n width: 100%;\n button{\n float:right;\n }\n }\n .qc-cmp2-expandable-info {\n width:100%\n order: 2;\n }\n }\n }\n }\n }\n }\n' + ]); + return Sr = function () { + return e; + }, e; + } + var Lr = Gt.ul(Sr(), function (e) { + return e.subHeaderColor; + }, function (e) { + return e.uxBackgroundColor; + }, function (e) { + return e.borderColor; + }, function (e) { + return e.borderColor; + }, function (e) { + return e.borderColor; + }, function (e) { + return e.lightTextColor; + }, function (e) { + return e.secondaryTextColor; + }, function (e) { + return e.lightTextColor; + }, function (e) { + return e.secondaryTextColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.isIE && Et(wr()); + }); + function Pr() { + var e = Rt([ + '\n background: ', + ';\n border-color: ', + ';\n min-height: 18px;\n border-radius: 18px;\n .toggle {\n right: 0;\n }\n p.text {\n &.on {\n display: ', + ';\n }\n &.off {\n display: none;\n }\n }\n\n @media (min-width: 768px) {\n min-height: 25px;\n border-radius: 25px;\n }\n ' + ]); + return Pr = function () { + return e; + }, e; + } + function Tr() { + var e = Rt([ + '\n &&&& {\n width: 30px;\n height: 18px;\n border-radius: 18px;\n padding: 0;\n align-items: center;\n margin: 0 0 0 auto;\n background: #a6a9ae;\n position: relative;\n border: 1px solid #a6a9ae;\n box-sizing: content-box;\n border-radius: 18px;\n min-height: 18px;\n\n .toggle {\n width: ', + ';\n height: ', + ';\n border-radius: 50%;\n background: white;\n position: absolute;\n top: 0;\n right: 12px;\n }\n\n p.text {\n font-size: 9px;\n font-weight: 700;\n text-transform: capitalize;\n margin-top: 20px;\n text-align: center;\n display: ', + ';\n &.on {\n color: ', + ';\n display: none;\n }\n &.off {\n color: ', + ';\n }\n }\n @media (min-width: 768px) {\n width: 50px;\n height: 25px;\n min-height: 25px;\n border-radius: 25px;\n p.text {\n margin-top: 30px;\n text-transform: uppercase;\n }\n\n .toggle {\n width: ', + ';\n height: ', + ';\n right: 25px;\n }\n }\n\n ', + ';\n }\n' + ]); + return Tr = function () { + return e; + }, e; + } + var qr = Gt.button(Tr(), '18px', '18px', function (e) { + return e.showLabel ? 'block' : 'none'; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.secondaryTextColor; + }, '25px', '25px', function (e) { + var n = e.switchState, t = e.uxToogleActiveColor, r = e.showLabel; + return n && Et(Pr(), t, t, r ? 'block' : 'none'); + }), Ar = function (e) { + var n = e.on, t = void 0 !== n && n, r = e.className, o = e.onClick, a = e.showLabel, i = void 0 !== a && a, s = e.disabled, c = void 0 !== s && s, l = Nt(e, [ + 'on', + 'className', + 'onClick', + 'showLabel', + 'disabled' + ]); + return tn.createElement(qr, Object.assign({ + tabIndex: 0, + role: 'switch', + 'aria-label': 'Consent toggle', + 'aria-checked': t, + switchState: t, + onClick: o, + className: r && r, + showLabel: i, + disabled: c, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + secondaryTextColor: ia.secondaryTextColor, + uxToogleActiveColor: ia.uxToogleActiveColor + }, l), tn.createElement('div', { className: 'toggle' }), tn.createElement('p', { + className: 'text off', + 'aria-label': 'Toggle off' + }, sa.coreUiLabels.offLabel), tn.createElement('p', { + className: 'text on', + 'aria-label': 'Toggle on' + }, sa.coreUiLabels.onLabel)); + }, Ir = function (e) { + var n = e.url, t = e.label, r = e.bolded; + return tn.createElement('li', null, r ? tn.createElement('strong', null, ''.concat(t, ': ')) : ''.concat(t, ': '), tn.createElement('a', { + href: n, + target: '_blank', + rel: 'noopener noreferrer' + }, n)); + }; + Ir.defaultProps = { bolded: !1 }; + var Or = Ir, Nr = function (e) { + var n = e.seconds, t = e.label; + return tn.createElement('li', null, ''.concat(t, ': ').concat(function (e) { + if (e < 0) + return '0 '.concat(sa.coreUiLabels.secondsLabel); + var n = e / 86400; + return n >= 1 ? ''.concat(Math.round(n), ' ').concat(sa.coreUiLabels.daysLabel) : ''.concat(e, ' ').concat(sa.coreUiLabels.secondsLabel); + }(n))); + }; + function Rr() { + var e = Rt(['\n &&& {\n ul.items {\n list-style: none;\n padding-left: 15px;\n\n li {\n padding-bottom: 15px;\n }\n }\n }\n']); + return Rr = function () { + return e; + }, e; + } + function Ur() { + var e = Rt(['\n &&& {\n display: flex;\n justify-content: space-between;\n padding: 5px 0;\n width: 50%;\n }\n']); + return Ur = function () { + return e; + }, e; + } + var Dr = Gt.div(Ur()), Br = Gt.div(Rr()), jr = t(2), Fr = t.n(jr), Vr = function (e) { + var n = e.label, t = e.url, r = g(fe(!1), 2), o = r[0], a = r[1], i = g(fe([]), 2), s = i[0], c = i[1], l = g(fe(!1), 2), u = l[0], p = l[1], d = g(fe(''), 2), f = d[0], m = d[1]; + return he(function () { + o && !u && Fr.a.get(t).then(function (e) { + return e.data; + }).then(function (e) { + e.disclosures && c(e.disclosures); + }).catch(function (e) { + c([]), m('Error: cannot load vendor file.'); + }).finally(function () { + return p(!0); + }); + }, [ + s.length, + o, + u, + t + ]), tn.createElement('li', { + className: ''.concat(o ? 'expanded' : ''), + onClick: function () { + return a(!o); + } + }, tn.createElement(Dr, null, n, ' ', tn.createElement(Cr, { type: 'inner' })), o && tn.createElement(Br, null, s.length > 0 && tn.createElement('ul', { className: 'items' }, s.map(function (e, n) { + return tn.createElement('li', { key: n }, Object.keys(e).map(function (n, t) { + return tn.createElement('p', { key: t }, n, ': ', e[n]); + })); + })), f && tn.createElement('span', null, '\xA0\xA0', f))); + }, Gr = qt.LEGITIMATE_VENDORS, Mr = qt.LEGITIMATE_PURPOSES, zr = qt.PURPOSES, Hr = qt.FEATURES, $r = qt.SPECIAL_PURPOSES, Yr = qt.SPECIAL_FEATURES, Wr = function (e, n) { + return e ? n.legitimateScreenObject : n.legitimateScreenAccept; + }, Jr = function (e) { + var n = e.cmpUI, t = e.element, r = e.coreUiLabels, o = e.togglesHidden, a = e.dataType, i = e.populateVendorInfo, s = e.setStatus, c = e.status, l = e.isNonIabConsent; + return tn.createElement('ul', { className: 'qc-cmp2-expandable-list' }, tn.createElement('div', { className: 'qc-cmp2-expandable-info' }, t.policyUrl && tn.createElement(Or, { + url: t.policyUrl, + label: r.privacyPolicyLabel, + bolded: !0 + }), t.description && tn.createElement('li', null, tn.createElement('strong', null, r.descriptionLabel), tn.createElement('p', null, t.description)), t.purposes && t.purposes.length > 0 && l && i(t.purposes, zr, r), t.legIntPurposes && t.legIntPurposes.length > 0 && !l && i(t.legIntPurposes, Mr, r)), !o && tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + on: c, + className: 'qc-cmp2-toggle', + onClick: function (e) { + e && e.preventDefault(), s(!c), n.handleConsent(t.id, a); + } + }))); + }, Xr = function (e) { + var n = e.cmpUI, t = e.element, r = e.coreUiLabels, o = e.togglesHidden, a = e.dataType, i = e.populateVendorInfo, s = e.setStatus, c = e.status; + return tn.createElement('ul', { className: 'qc-cmp2-expandable-list' }, tn.createElement('div', { className: 'qc-cmp2-expandable-info' }, t.policyUrl && tn.createElement(Or, { + url: t.policyUrl, + label: r.privacyPolicyLabel + }), void 0 !== t.cookieMaxAgeSeconds && tn.createElement(Nr, { + seconds: t.cookieMaxAgeSeconds, + label: r.cookieMaxAgeLabel + }), void 0 !== t.deviceStorageDisclosureUrl && tn.createElement(Vr, { + url: t.deviceStorageDisclosureUrl, + label: r.storageDisclosureLabel + }), t.purposes && t.purposes.length > 0 && i(t.purposes, zr, r), t.specialPurposes && t.specialPurposes.length > 0 && i(t.specialPurposes, $r, r), t.features && t.features.length > 0 && i(t.features, Hr, r), t.specialFeatures && t.specialFeatures.length > 0 && i(t.specialFeatures, Yr, r)), !o && tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + on: c, + className: 'qc-cmp2-toggle', + onClick: function (e) { + e.preventDefault(), s(!c), n.handleConsent(t.id, a); + } + }))); + }, Kr = function (e) { + var n = e.cmpUI, t = e.element, r = e.coreUiLabels, o = e.dataType, a = e.populateVendorInfo, i = e.setStatus, s = e.status; + return tn.createElement('ul', { className: 'qc-cmp2-expandable-list qc-wrap' }, tn.createElement('div', { className: 'qc-cmp2-expandable-info qc-w75' }, t.policyUrl && tn.createElement(Or, { + url: t.policyUrl, + label: r.privacyPolicyLabel + }), void 0 !== t.cookieMaxAgeSeconds && tn.createElement(Nr, { + seconds: t.cookieMaxAgeSeconds, + label: r.cookieMaxAgeLabel + }), void 0 !== t.deviceStorageDisclosureUrl && tn.createElement(Vr, { + url: t.deviceStorageDisclosureUrl, + label: r.storageDisclosureLabel + }), t.legIntPurposes && t.legIntPurposes.length > 0 && a(t.legIntPurposes, Gr, r), t.specialPurposes && t.specialPurposes.length > 0 && a(t.specialPurposes, $r, r), t.features && t.features.length > 0 && a(t.features, Hr, r), t.specialFeatures && t.specialFeatures.length > 0 && a(t.specialFeatures, Yr, r)), tn.createElement('div', { className: 'qc-cmp2-toggle-switch qc-cmp2-no-margin' }, tn.createElement(Zt, { + onClick: function (e) { + e.preventDefault(), i(!s), n.handleConsent(t.id, o); + }, + mode: 'link', + size: 'small', + isLong: r.legitimateScreenAccept.length > 19 + }, Wr(s, r)))); + }, Qr = function (e) { + var n = e.cmpUI, t = e.element, r = e.coreUiLabels, o = e.togglesHidden, a = e.dataType, i = e.setStatus, s = e.status; + return tn.createElement('ul', { className: 'qc-cmp2-expandable-list' }, tn.createElement('div', { className: 'qc-cmp2-expandable-info' }, t.policyUrl && tn.createElement(Or, { + url: t.policyUrl, + label: r.privacyPolicyLabel, + bolded: !0 + }), t.description && tn.createElement('li', null, tn.createElement('strong', null, r.descriptionLabel), tn.createElement('p', null, t.description))), !o && tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + on: s, + className: 'qc-cmp2-toggle', + onClick: function (e) { + e.preventDefault(), i(!s), n.handleConsent(t.id, a); + } + }))); + }, Zr = function (e) { + var n = e.cmpUI, t = e.element, r = e.coreUiLabels, o = e.togglesHidden, a = e.dataType, i = e.legitimate, s = e.handleClick, c = e.toggleExpandedLegal, l = e.premiumUiLabels, u = e.setStatus, p = e.status; + return tn.createElement('ul', { className: 'qc-cmp2-expandable-list '.concat(i ? 'qc-wrap' : '') }, tn.createElement('li', { className: 'qc-cmp2-expandable-info '.concat(i ? 'qc-w75' : '') }, tn.createElement('p', null, t.description), t.descriptionLegal && tn.createElement('div', { className: 'qc-cmp2-expandable-legal' }, tn.createElement(Zt, { + mode: 'link', + size: 'small', + className: 'qc-cmp2-toggle-legal-button', + onClick: function (e) { + e.preventDefault(), s(e, 'legalDescription-'.concat(a, '-').concat(t.id)), c(); + } + }, tn.createElement(Cr, { type: 'fill' }), r.legalDescription), tn.createElement('p', { className: 'qc-cmp2-legal-description' }, t.descriptionLegal)), t.vendors && tn.createElement('div', { className: 'qc-cmp2-expandable-legal' }, tn.createElement(Zt, { + mode: 'link', + size: 'small', + className: 'qc-cmp2-toggle-legal-button', + onClick: function (e) { + e.preventDefault(), s(e, 'vendors-'.concat(a, '-').concat(t.id)), c(); + } + }, tn.createElement(Cr, { type: 'fill' }), r.showPartners), t.vendors.map(function (e) { + return tn.createElement('p', { + key: e.id, + className: 'qc-cmp2-legal-description' + }, '- '.concat(e.name)); + }), !(!t.nonIabVendors || !t.nonIabVendors.length) && tn.createElement(tn.Fragment, null, t.nonIabVendors.map(function (e) { + return tn.createElement('p', { + key: e.name, + className: 'qc-cmp2-legal-description' + }, '- '.concat(e.name), '*'); + }), tn.createElement('p', { className: 'qc-cmp2-legal-description qc-cmp2-non-iab' }, '* ', l.nonIabVendorsLabel)))), i ? tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Zt, { + onClick: function (e) { + e.preventDefault(), u(!p), n.handleConsent(t.id, a); + }, + mode: 'link', + size: 'small', + isLong: r.legitimateScreenAccept.length > 19 + }, Wr(p, r))) : !o && tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + on: p, + className: 'qc-cmp2-toggle', + onClick: function (e) { + e.preventDefault(), u(!p), n.handleConsent(t.id, a); + } + }))); + }, eo = function (e) { + var n = e.coreUiLabels, t = e.premiumUiLabels, r = e.dataType, o = e.legitimate, a = e.togglesHidden, i = e.expandable, s = e.handleClick, c = e.cmpUI, l = e.item, u = e.populateVendorInfo, p = e.isNonIabConsent, d = g(fe(!1), 2), f = d[0], m = d[1], h = g(fe(!1), 2), y = h[0], v = h[1], b = g(fe(l.status), 2), _ = b[0], x = b[1], E = function () { + v(!y); + }, C = ''.concat(r, '-id:').concat(l.id); + return he(function () { + x(l.status); + }, [l.status]), tn.createElement('li', { + id: C, + className: 'qc-cmp2-list-item '.concat(f ? 'qc-cmp2-expanded' : '', ' ').concat(o ? 'qc-cmp2-list-item-legitimate' : ''), + 'aria-expanded': 'false' + }, tn.createElement('button', { + role: 'listitem', + className: 'qc-cmp2-list-item-header', + onClick: function (e) { + return function (e, n) { + m(!f), s(e, n); + }(e, C); + }, + 'aria-label': l.name, + 'aria-pressed': 'false', + 'aria-expanded': 'false' + }, tn.createElement('p', { className: 'qc-cmp2-list-item-title' }, l.name), o ? tn.createElement('p', { className: 'qc-cmp2-list-item-status '.concat(n.legitimateScreenObjected.length > 12 ? 'qc-cmp-long-label' : '') }, _ ? '' : n.legitimateScreenObjected) : !a && tn.createElement('p', { className: 'qc-cmp2-list-item-status' }, _ ? n.onLabel : n.offLabel), i && tn.createElement(Cr, { type: 'expand' })), i && f && function (e) { + var i = { + cmpUI: c, + element: e, + coreUiLabels: n, + togglesHidden: a, + dataType: r, + populateVendorInfo: u, + setStatus: x, + status: _, + isNonIabConsent: p + }; + switch (r) { + case wt.NON_IAB: + return tn.createElement(Jr, i); + case wt.VENDORS: + return tn.createElement(Xr, i); + case wt.LEGITIMATE_VENDORS: + return tn.createElement(Kr, i); + case wt.GOOGLE: + return tn.createElement(Qr, i); + default: + return tn.createElement(Zr, Object.assign({}, i, { + legitimate: o, + handleClick: s, + toggleExpandedLegal: E, + premiumUiLabels: t + })); + } + }(l)); + }, no = qt.LEGITIMATE_VENDORS, to = qt.LEGITIMATE_PURPOSES, ro = qt.PURPOSES, oo = qt.FEATURES, ao = qt.SPECIAL_PURPOSES, io = qt.SPECIAL_FEATURES, so = qt.FLEXIBLE_PURPOSES, co = qt.UNFILTERED_FEATURES, lo = qt.UNFILTERED_PURPOSES, uo = qt.UNFILTERED_SPECIAL_FEATURES, po = qt.UNFILTERED_SPECIAL_PURPOSES, fo = tn.memo(function (e) { + var n, t = e.className, r = e.coreUiLabels, o = e.data, a = e.dataType, i = e.togglesHidden, s = e.expandable, c = e.legitimate, l = e.premiumUiLabels, u = e.nonIabData, p = e.handleClick, d = e.onFullyRendered, f = e.triggerReRender, m = e.setShowLoader, h = e.isNonIabConsent, y = Object.keys(o).length, v = y ? function (e, n, t, r) { + var o = []; + switch (t) { + case n.NON_IAB: + if (r && r.vendors.length) + return r.vendors; + break; + case n.VENDORS: + return ur(Object.values(e.vendors), 'id'); + case n.LEGITIMATE_VENDORS: + return ur(Object.values(e.legitimateVendors), 'id'); + case n.GOOGLE: + return ur(e, 'id'); + default: + Object.keys(e).length && function () { + var a = r && r.vendors, i = 'nonIabPurposeConsentIds'; + t === n.LEGITIMATE_VENDORS && (i = 'nonIabPurposeLegitimateInterestIds'); + var s = function (n) { + var t = e[n], r = (t.descriptionLegal || '').replace(/(:\s\*)|(:\*)/gi, ':').replace(/(\.\s\*)|(\.\*)|(\s\*)/gi, '.'), s = { + name: t.name, + status: t.status || !1, + id: t.id, + description: t.description, + descriptionLegal: r, + vendors: ur(t.vendors, 'id'), + nonIabVendors: a && a.length && a.filter(function (e) { + return e[i] && e[i].includes(t.id); + }) + }; + o.push(s); + }; + for (var c in e) + s(c); + }(); + } + return o; + }(o, wt, a, u) : [], b = g(fe(!1), 2), _ = b[0], x = b[1], E = g(fe(v.slice(0, 100)), 2), C = E[0], k = E[1], w = function (e, n, t) { + return function (e, n, t, r) { + var o = '', a = ''; + switch (n) { + case ro: + o = t.purposesLabel, a = lo; + break; + case to: + o = t.legitimateInterestPurposesLabel, a = lo; + break; + case ao: + o = t.specialPurposesLabel, a = po; + break; + case so: + o = t.flexiblePurposesLabel, a = lo; + break; + case oo: + o = t.featuresLabel, a = co; + break; + case io: + o = t.specialFeaturesLabel, a = uo; + break; + case no: + o = t.legitimateInterestPurposesLabel, a = lo; + } + var i = e.map(function (e) { + return tn.createElement('p', { key: ''.concat(a).concat(e) }, '- ', r[a][e].name); + }); + return tn.createElement('li', null, tn.createElement('strong', null, o), i); + }(e, n, t, o); + }; + return he(function () { + if (_) + return C.length < v.length && (n = setTimeout(function () { + k(v.slice(0, C.length + 100)); + }, 1000)), function () { + clearTimeout(n); + }; + }, [f]), he(function () { + m && (m(!1), d && C.length === v.length && d(!0)); + }, [C]), he(function () { + x(!0); + }, []), y ? tn.createElement(tn.Fragment, null, tn.createElement(Lr, { + className: ''.concat(t || '', ' qc-cmp2-consent-list'), + subHeaderColor: ia.subHeaderColor, + borderColor: ia.borderColor, + lightTextColor: ia.lightTextColor, + secondaryTextColor: ia.secondaryTextColor, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + uxBackgroundColor: ia.uxBackgroundColor, + isIE: lr() + }, (a === wt.NON_IAB || a === wt.LEGITIMATE_PURPOSES || a === wt.LEGITIMATE_VENDORS || a === wt.GOOGLE) && tn.createElement('p', { className: 'qc-cmp2-list-header' }, function () { + switch (a) { + case wt.NON_IAB: + return l.nonIabVendorsLabel; + case wt.LEGITIMATE_PURPOSES: + return r.legitimateInterestPurposesLabel; + case wt.LEGITIMATE_VENDORS: + return r.legitimateInterestVendorLabel; + case wt.GOOGLE: + return r.googlePartners; + } + return ''; + }()), C.map(function (e, n) { + var t = i; + return a === wt.VENDORS && e.isSpecialPurposesOnly && (t = !0), tn.createElement(eo, { + key: n, + coreUiLabels: r, + premiumUiLabels: l, + dataType: a, + legitimate: c, + togglesHidden: t, + expandable: s, + handleClick: p, + cmpUI: oa, + item: e, + populateVendorInfo: w, + isNonIabConsent: h + }); + }))) : null; + }); + function mo() { + var e = Rt([ + '\n && {\n text-align: center;\n margin: 10px auto !important;\n z-index: 100;\n background-color: ', + ';\n }\n\n .loader {\n display: inline-block;\n @keyframes line-scale {\n 0% {\n -webkit-transform: scaley(1);\n transform: scaley(1);\n }\n 50% {\n -webkit-transform: scaley(0.4);\n transform: scaley(0.4);\n }\n 100% {\n -webkit-transform: scaley(1);\n transform: scaley(1);\n }\n }\n .line-scale {\n & > div:nth-child(1) {\n -webkit-animation: line-scale 1s -0.4s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n animation: line-scale 1s -0.4s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n }\n & > div:nth-child(2) {\n -webkit-animation: line-scale 1s -0.3s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n animation: line-scale 1s -0.3s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n }\n & > div:nth-child(3) {\n -webkit-animation: line-scale 1s -0.2s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n animation: line-scale 1s -0.2s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n }\n & > div:nth-child(4) {\n -webkit-animation: line-scale 1s -0.1s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n animation: line-scale 1s -0.1s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n }\n & > div:nth-child(5) {\n -webkit-animation: line-scale 1s 0s infinite\n cubic-bezier(0.2, 0.68, 0.18, 1.08);\n animation: line-scale 1s 0s infinite cubic-bezier(0.2, 0.68, 0.18, 1.08);\n }\n & > div {\n background: ', + ';\n width: 4px;\n height: 35px;\n border-radius: 2px;\n margin: 2px;\n -webkit-animation-fill-mode: both;\n animation-fill-mode: both;\n display: inline-block;\n }\n }\n' + ]); + return mo = function () { + return e; + }, e; + } + var ho = Gt.div(mo(), function (e) { + return e.uxBackgroundColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }), go = function () { + return tn.createElement(ho, { + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + uxBackgroundColor: ia.uxBackgroundColor + }, tn.createElement('div', { className: 'loader' }, tn.createElement('div', { className: 'line-scale' }, tn.createElement('div', null), tn.createElement('div', null), tn.createElement('div', null), tn.createElement('div', null), tn.createElement('div', null)))); + }, yo = function (e, n, t) { + e.map(function (e) { + var r = n.filter(function (n) { + return (n[t] || []).includes(e.id); + }); + return e.vendors = r, e; + }); + }, vo = function (e) { + var n, t = e.coreUiLabels, r = e.premiumUiLabels, o = e.vendorsData, a = e.handleClick, i = e.nonIabData, s = e.children, c = ye(null), l = b({}, o.legitimatePurposes), u = { + isEnabled: i.isEnabled, + vendors: i.vendors.filter(function (e) { + return e.legIntPurposes.length > 0; + }) + }, p = i.isEnabled && i.vendors.length && u.vendors.length > 0, d = g(fe(!1), 2), f = d[0], m = d[1], h = g(fe(0), 2), y = h[0], v = h[1], _ = g(fe(!1), 2), x = _[0], E = _[1]; + if (Object.keys(l).length) { + var C = Object.values(b({}, o.vendors)), k = Object.values(l); + yo(k, C, 'legIntPurposes'); + } + return he(function () { + var e = c.current; + y && e && E(!0); + }, [y]), he(function () { + var e = c.current; + x && e && (e.scrollTop = e.scrollHeight); + }, [x]), he(function () { + return function () { + clearTimeout(n); + }; + }, [n]), tn.createElement(tn.Fragment, null, s[0], tn.createElement('div', { + className: 'qc-cmp2-scrollable-section '.concat(x ? 'loading' : ''), + ref: c, + onScroll: function () { + var e = c.current; + clearTimeout(n), e && !f && e.scrollTop + e.offsetHeight > e.scrollHeight - 50 && (n = setTimeout(function () { + v(new Date().getTime()); + }, 300)); + } + }, tn.createElement(fo, { + coreUiLabels: t, + premiumUiLabels: r, + data: o.legitimatePurposes, + dataType: wt.LEGITIMATE_PURPOSES, + nonIabData: i, + handleClick: a, + expandable: !0, + legitimate: !0 + }), tn.createElement(fo, { + coreUiLabels: t, + premiumUiLabels: r, + data: o, + dataType: wt.LEGITIMATE_VENDORS, + handleClick: a, + onFullyRendered: m, + triggerReRender: y, + setShowLoader: E, + expandable: !0, + legitimate: !0 + }), !!p && tn.createElement(fo, { + coreUiLabels: t, + data: o, + nonIabData: u, + dataType: wt.NON_IAB, + handleClick: a, + premiumUiLabels: r, + expandable: !0 + }), x && tn.createElement(go, null)), s[1]); + }, bo = function (e) { + var n = e.item, t = e.id, r = e.sectionName, o = e.coreUiLabels, a = e.premiumUiLabels, i = e.handleClick, s = e.handleConsent, c = e.DATA_TYPE; + return tn.createElement(tn.Fragment, { key: ''.concat(n.name).concat(t) }, tn.createElement('li', { className: 'qc-cmp2-expandable-info' }, tn.createElement('strong', null, n.name), tn.createElement('p', null, n.description), n.descriptionLegal && tn.createElement('div', { className: 'qc-cmp2-expandable-legal' }, tn.createElement(Zt, { + mode: 'link', + size: 'small', + className: 'qc-cmp2-toggle-legal-button', + onClick: function (e) { + return i(e, 'legalDescription-stacks-'.concat(r, '-').concat(t)); + } + }, tn.createElement(Cr, { type: 'fill' }), o.legalDescription), tn.createElement('p', { className: 'qc-cmp2-legal-description' }, n.descriptionLegal.replace(/(:\s\*)|(:\*)/gi, ':').replace(/(\.\s\*)|(\.\*)|(\s\*)/gi, '.'))), n.vendors && tn.createElement('div', { className: 'qc-cmp2-expandable-legal' }, tn.createElement(Zt, { + mode: 'link', + size: 'small', + className: 'qc-cmp2-toggle-legal-button', + onClick: function (e) { + return i(e, 'vendors-stacks-'.concat(n.id)); + } + }, tn.createElement(Cr, { type: 'fill' }), o.showPartners), ur(n.vendors, 'id').map(function (e) { + return tn.createElement('p', { + key: e.id, + className: 'qc-cmp2-legal-description' + }, '- '.concat(e.name)); + }), !(!n.nonIabVendors || !n.nonIabVendors.length) && tn.createElement(tn.Fragment, null, n.nonIabVendors.map(function (e) { + return tn.createElement('p', { + key: e.name, + className: 'qc-cmp2-legal-description' + }, '- '.concat(e.name), '*'); + }), tn.createElement('p', { className: 'qc-cmp2-legal-description qc-cmp2-non-iab' }, '* ', a.nonIabVendorsLabel)))), tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + showLabel: !0, + on: n.status, + onClick: function () { + s(t, 'purposes' === r ? c.PURPOSES : c.SPECIAL_FEATURES, !n.status); + }, + className: 'qc-cmp2-toggle' + }))); + }, _o = Ct.EXPAND_ELEMENT, xo = Ct.COLLAPSE_ELEMENT, Eo = function (e, n, t, r) { + return e[n].length ? e[n].map(function (e) { + var o = t.find(function (n) { + return n.id === e; + }); + if (o) { + var a = 'purposes' === n && r && r.vendors; + o.nonIabVendors = a && a.length && a.filter(function (e) { + return e.nonIabPurposeConsentIds && e.nonIabPurposeConsentIds.includes(o.id); + }); + } + return o; + }).filter(function (e) { + return void 0 !== e; + }) : []; + }, Co = function (e) { + var n = e.id, t = e.stack, r = e.onToggle, o = e.purposes, a = e.specialFeatures, i = e.nonIabData, s = e.coreUiLabels, c = e.premiumUiLabels, l = e.handleClick, u = e.handleConsent, p = e.className, d = e.DATA_TYPE, f = ''.concat(n, '-expandable'), m = g(fe(Eo(t, 'purposes', o, i)), 2), h = m[0], y = m[1], v = g(fe(Eo(t, 'specialFeatures', a, i)), 2), _ = v[0], x = v[1], E = g(fe(h.filter(function (e) { + return !0 === e.status; + }).length + _.filter(function (e) { + return !0 === e.status; + }).length), 2), C = E[0], k = E[1], w = g(fe(!1), 2), S = w[0], L = w[1], P = g(fe(t.status), 2), T = P[0], q = P[1], A = g(fe(t.stateLabel), 2), I = A[0], O = A[1], N = function (e, n, t) { + u(e, n), n === d.PURPOSES ? y(h.map(function (n) { + return n.id === e && (n.status = t), n; + })) : x(_.map(function (n) { + return n.id === e && (n.status = t), n; + })), k(C + (t ? 1 : -1)); + }; + return he(function () { + var e = s.onLabel, n = s.offLabel, t = s.multiLabel; + 0 === C ? (O(n), q(!1)) : C === h.length + _.length ? (O(e), q(!0)) : (O(t), q(!1)); + }, [C]), tn.createElement('li', { + 'data-testid': 'stack-item', + className: ''.concat(p, ' ').concat(S ? 'qc-cmp2-expanded' : '') + }, tn.createElement('button', { + className: 'qc-cmp2-list-item-header', + 'aria-expanded': S, + 'aria-controls': f, + 'data-testid': 'stack-item-header', + onClick: function () { + S ? oa.eventTracker(xo, n) : oa.eventTracker(_o, n), L(!S); + } + }, tn.createElement('p', { className: 'qc-cmp2-list-item-title' }, t.name), tn.createElement('p', { className: 'qc-cmp2-list-item-status' }, I), tn.createElement(Cr, { type: 'expand' })), S && tn.createElement('ul', { + id: f, + className: 'qc-cmp2-expandable-list' + }, tn.createElement('li', { className: 'qc-cmp2-expandable-info' }, t.description), tn.createElement('div', { className: 'qc-cmp2-toggle-switch' }, tn.createElement(Ar, { + showLabel: !0, + className: 'qc-cmp2-toggle', + on: T, + onClick: function () { + r(), function (e) { + y(h.map(function (n) { + return b(b({}, n), {}, { status: e }); + })), x(_.map(function (n) { + return b(b({}, n), {}, { status: e }); + })), k(e ? h.length + _.length : 0); + }(!T); + }, + disabled: !S + })), h.map(function (e, n) { + return tn.createElement(bo, { + id: e.id, + key: n, + item: e, + sectionName: 'purposes', + coreUiLabels: s, + premiumUiLabels: c, + handleClick: l, + handleConsent: N, + DATA_TYPE: d + }); + }), _.map(function (e, n) { + return tn.createElement(bo, { + id: e.id, + key: n, + item: e, + sectionName: 'specialFeatures', + coreUiLabels: s, + premiumUiLabels: c, + handleClick: l, + handleConsent: N, + DATA_TYPE: d + }); + }))); + }; + function ko() { + var e = Rt(['\n .qc-cmp2-toggle-legal-button {\n height: 34px;\n }\n\n .qc-cmp2-toggle-legal-button svg {\n height: 22px;\n width: 14px;\n }\n ']); + return ko = function () { + return e; + }, e; + } + function wo() { + var e = Rt([ + '\n && {\n ', + '\n\n .qc-cmp2-list-item {\n &:only-child {\n border-bottom: solid 1px ', + ';\n }\n\n .qc-cmp2-expandable-list {\n flex-wrap: wrap;\n justify-content: space-between;\n\n .qc-cmp2-expandable-info {\n margin-bottom: 20px;\n width: 85%;\n &:first-of-type {\n margin: 20px 0px;\n }\n li {\n margin: 0;\n padding: 0;\n\n p {\n margin: 0;\n padding: 0;\n }\n }\n\n strong {\n margin-top: 0;\n margin-bottom: 5px;\n }\n\n &:last-of-type {\n margin-bottom: 0%;\n }\n }\n\n .qc-cmp2-toggle-switch {\n margin-bottom: 10px;\n &:first-of-type {\n margin-top: 20px;\n margin-bottom: 30px;\n }\n }\n }\n }\n }\n' + ]); + return wo = function () { + return e; + }, e; + } + var So = Gt(Lr)(wo(), function (e) { + return e.isIE && Et(ko()); + }, function (e) { + return e.borderColor; + }), Lo = function (e) { + var n = e.vendorsData, t = e.handleClick, r = e.coreUiLabels, o = e.purposes, a = e.specialFeatures, i = e.premiumUiLabels, s = e.nonIabData, c = function (e, n) { + oa.handleConsent(e, n); + }; + return tn.createElement(So, { + borderColor: ia.borderColor, + lightTextColor: ia.lightTextColor, + secondaryTextColor: ia.secondaryTextColor, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + isIE: lr() + }, Object.entries(n.stacks).map(function (e) { + var n = g(e, 2), l = n[0], u = n[1]; + return tn.createElement(Co, { + id: 'stack-item-id:'.concat(l), + stack: u, + onToggle: function () { + return function (e) { + oa.handleConsent(e, wt.STACKS); + }(l); + }, + purposes: o, + specialFeatures: a, + nonIabData: s, + coreUiLabels: r, + premiumUiLabels: i, + handleClick: t, + handleConsent: c, + key: 'stack-item-'.concat(l), + 'data-testid': 'stack-item', + className: 'qc-cmp2-list-item', + DATA_TYPE: wt + }); + })); + }; + function Po() { + var e = Rt(['\n &&&& {\n .qc-cmp2-toggle-legal-button {\n height: 34px;\n }\n\n .qc-cmp2-toggle-legal-button svg {\n height: 22px;\n width: 14px;\n }\n }\n ']); + return Po = function () { + return e; + }, e; + } + function To() { + var e = Rt([ + '\n ', + '\n' + ]); + return To = function () { + return e; + }, e; + } + function qo() { + var e = Rt(['\n &&&& {\n list-style: none;\n\n li {\n margin-bottom: 10px;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n strong {\n display: block;\n }\n }\n }\n']); + return qo = function () { + return e; + }, e; + } + var Ao = Gt.ul(qo()), Io = Gt.div(To(), function (e) { + return e.isIE && Et(Po()); + }), Oo = function (e) { + var n, t = e.handleClick, r = e.coreUiLabels, o = e.premiumUiLabels, a = e.data, i = e.id, s = e.title, c = e.toggleObj; + if (s === o.linksTitle) + n = a.map(function (e, n) { + return tn.createElement('li', { key: e.label + n }, tn.createElement('a', { + href: e.link, + target: '_blank', + rel: 'noopener noreferrer', + title: e.label + }, e.label)); + }); + else { + var l = []; + for (var u in a) { + var p = a[u]; + for (var d in p) { + var f = p[d], m = (f.descriptionLegal || '').replace(/(:\s\*)|(:\*)/gi, ':').replace(/(\.\s\*)|(\.\*)|(\s\*)/gi, '.'), h = { + id: ''.concat(u, ' ').concat(f.id), + title: f.name, + description: f.description, + descriptionLegal: m + }; + l.push(h); + } + } + n = l.map(function (e, n) { + return tn.createElement('li', { key: n }, tn.createElement('strong', null, e.title), e.description, e.descriptionLegal && tn.createElement('div', { className: 'qc-cmp2-expandable-legal' }, tn.createElement(Zt, { + mode: 'link', + size: 'small', + className: 'qc-cmp2-toggle-legal-button', + onClick: function (n) { + return t(n, 'legalDescription-'.concat(e.id)); + }, + 'aria-label': r.legalDescription, + 'aria-pressed': 'false', + 'aria-expanded': 'false' + }, tn.createElement(Cr, { type: 'fill' }), r.legalDescription), tn.createElement('p', { + className: 'qc-cmp2-legal-description', + 'aria-labelledby': 'qc-cmp2-toggle-legal-button' + }, e.descriptionLegal))); + }); + } + return tn.createElement(Lr, { + className: 'qc-cmp2-consent-list', + subHeaderColor: ia.subHeaderColor, + borderColor: ia.borderColor, + lightTextColor: ia.lightTextColor, + secondaryTextColor: ia.secondaryTextColor, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor + }, tn.createElement('li', { + id: i, + className: 'qc-cmp2-list-item', + role: 'region', + 'aria-expanded': 'false' + }, tn.createElement('button', { + className: 'qc-cmp2-list-item-header', + onClick: function (e) { + return t(e, i); + }, + role: 'listitem', + 'aria-label': s, + 'aria-pressed': 'false' + }, tn.createElement('p', { className: 'qc-cmp2-list-item-title' }, s === o.linksTitle ? tn.createElement('strong', null, s) : s), tn.createElement(Cr, { type: 'expand' })), c[i] && tn.createElement('ul', { + className: 'qc-cmp2-expandable-list', + role: 'list' + }, tn.createElement(Io, { + role: 'listitem', + isIE: lr(), + className: 'qc-cmp2-expandable-info' + }, tn.createElement(Ao, null, n))))); + }, No = function (e) { + var n = e.coreUiLabels, t = e.premiumUiLabels, r = e.vendorsData, o = e.handleClick, a = e.nonIabData, i = e.children, s = e.toggleObj, c = g(_e(Ca), 1), l = g(fe(c[0].disableAcceptButton), 2), u = l[0], p = l[1], d = r.stacks, f = b({}, r.specialFeatures), m = b({}, r.purposes), h = JSON.parse(JSON.stringify(m)), y = JSON.parse(JSON.stringify(f)), v = Object.values(h), _ = Object.values(y), x = ye(null), E = be(function () { + var e = x.current, n = document.getElementById('Special Purposes and Features Group'), t = null === e || void 0 === e ? void 0 : e.getBoundingClientRect(), r = null === n || void 0 === n ? void 0 : n.getBoundingClientRect(); + e && u && r && t && (t.bottom - r.top >= 0 && (p(!1), e.removeEventListener('scroll', E))); + }, [u]); + if (he(function () { + var e = x.current; + u && e && (E(), e.addEventListener('scroll', E)); + }, [ + E, + u, + x + ]), Object.keys(d).length) + for (var C in d) { + var k = d[C]; + if (k.specialFeatures.length) + for (var w in f) + k.specialFeatures.includes(parseInt(w, 10)) && delete f[w]; + if (k.purposes.length) + for (var S in m) + k.purposes.includes(parseInt(S, 10)) && delete m[S]; + } + if (Object.keys(m).length) { + var L = Object.values(b({}, r.vendors)), P = Object.values(m), T = Object.values(f); + yo(P, L, 'purposes'), yo(T, L, 'specialFeatures'), yo(v, L, 'purposes'), yo(_, L, 'specialFeatures'); + } + return tn.createElement(tn.Fragment, null, i && tn.cloneElement(i[0], { disabledAcceptAllButton: u }), tn.createElement('div', { + ref: x, + className: 'qc-cmp2-scrollable-section' + }, !!Object.keys(d).length && tn.createElement(Lo, { + vendorsData: r, + coreUiLabels: n, + handleClick: o, + purposes: v, + specialFeatures: _, + nonIabData: a, + premiumUiLabels: t + }), !!Object.keys(m).length && tn.createElement(fo, { + coreUiLabels: n, + data: m, + dataType: wt.PURPOSES, + nonIabData: a, + handleClick: o, + premiumUiLabels: t, + expandable: !0 + }), !!Object.keys(f).length && tn.createElement(fo, { + coreUiLabels: n, + data: f, + dataType: wt.SPECIAL_FEATURES, + handleClick: o, + premiumUiLabels: t, + expandable: !0 + }), (!!Object.keys(r.specialPurposes).length || !!Object.keys(r.features)) && tn.createElement(Oo, { + id: 'Special Purposes and Features Group', + title: n.specialPurposesAndFeatures, + coreUiLabels: n, + handleClick: o, + data: { + 'Special Features': r.specialPurposes, + Features: r.features + }, + premiumUiLabels: t, + toggleObj: s + }), !!(t && t.initScreenCustomLinks && t.initScreenCustomLinks.length) && tn.createElement(Oo, { + id: t.linksTitle, + title: t.linksTitle, + coreUiLabels: n, + handleClick: o, + data: t.initScreenCustomLinks, + premiumUiLabels: t, + toggleObj: s + })), i[1]); + }, Ro = function (e) { + var n, t = e.coreUiLabels, r = e.nonIabData, o = e.vendorsData, a = e.handleClick, i = e.premiumUiLabels, s = e.googleVendors, c = e.children, l = { + isEnabled: r.isEnabled, + vendors: r.vendors.filter(function (e) { + if (e.purposes.length > 0 || 0 === e.purposes.length && 0 === e.legIntPurposes.length) + return !0; + }) + }, u = r.isEnabled && r.vendors.length > 0 && l.vendors.length > 0, p = ye(null), d = g(fe(!1), 2), f = d[0], m = d[1], h = g(fe(!1), 2), y = h[0], v = h[1], b = g(fe(!1), 2), _ = b[0], x = b[1], E = g(fe(0), 2), C = E[0], k = E[1], w = g(fe(!1), 2), S = w[0], L = w[1], P = g(fe(!1), 2), T = P[0], q = P[1], A = g(fe(!1), 2), I = A[0], O = A[1]; + return he(function () { + var e = p.current; + C && e && O(!0); + }, [C]), he(function () { + var e = p.current; + I && e && (e.scrollTop = e.scrollHeight); + }, [I]), he(function () { + L(u && f), q(u && y || !u && f); + }, [ + f, + y + ]), he(function () { + return function () { + clearTimeout(n); + }; + }, []), tn.createElement(tn.Fragment, null, c[0], tn.createElement('div', { + className: 'qc-cmp2-scrollable-section '.concat(I ? 'loading' : ''), + ref: p, + tabIndex: 0, + onScroll: function () { + var e = p.current; + clearTimeout(n), e && (!f || u && !y || s.isEnabled && !_) && e.scrollTop + e.offsetHeight > e.scrollHeight - 50 && (n = setTimeout(function () { + k(new Date().getTime()); + }, 300)); + } + }, tn.createElement(fo, { + coreUiLabels: t, + data: o, + dataType: wt.VENDORS, + handleClick: a, + premiumUiLabels: i, + onFullyRendered: m, + triggerReRender: C, + setShowLoader: O, + expandable: !0 + }), u && S && tn.createElement(fo, { + coreUiLabels: t, + data: o, + nonIabData: l, + dataType: wt.NON_IAB, + handleClick: a, + premiumUiLabels: i, + onFullyRendered: v, + triggerReRender: C, + setShowLoader: O, + expandable: !0, + isNonIabConsent: !0 + }), s.isEnabled && s.data.length > 0 && T && !(sa.coreConfig.consentScope || '').includes('global') && tn.createElement(fo, { + coreUiLabels: t, + data: pa, + dataType: wt.GOOGLE, + handleClick: a, + premiumUiLabels: i, + onFullyRendered: x, + triggerReRender: C, + setShowLoader: O, + expandable: !0 + }), I && tn.createElement(go, null)), c[1]); + }; + function Uo() { + var e = Rt([ + '\n && {\n max-width: 1600px;\n width: 100%;\n margin-top: auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n height: auto;\n padding: 20px 15px 10px;\n flex-wrap: wrap;\n position: relative;\n background: none;\n\n &::before {\n content: "";\n position: absolute;\n height: 100%;\n width: 100vw;\n background: ', + ';\n top: -1px;\n left: 0;\n z-index: -1;\n }\n &::after {\n content: "";\n position: absolute;\n height: 100%;\n width: 100vw;\n background: ', + ';\n top: -1px;\n right: 0;\n z-index: -1;\n }\n\n .qc-cmp2-summary-section {\n width: 72%;\n align-items: flex-start;\n }\n\n .qc-cmp2-footer {\n width: 28%;\n padding: 0;\n max-height: 150px;\n box-shadow: none;\n border-top: none;\n\n .qc-cmp2-summary-buttons {\n flex-direction: column;\n justify-content: end;\n\n button{\n order: 1;\n margin-bottom: 10px;\n\n &:last-child {\n order 0;\n }\n\n &:first-child {\n order 2;\n margin-bottom: 0;\n }\n }\n }\n }\n\n p,\n h2 {\n justify-self: flex-start;\n text-align: left;\n }\n }\n ' + ]); + return Uo = function () { + return e; + }, e; + } + function Do() { + var e = Rt(['\n height: 19px;\n svg {\n width: 12px;\n }\n ']); + return Do = function () { + return e; + }, e; + } + function Bo() { + var e = Rt([ + '\n height: ', + ';\n ' + ]); + return Bo = function () { + return e; + }, e; + } + function jo() { + var e = Rt([ + '\n height: ', + ';\n ' + ]); + return jo = function () { + return e; + }, e; + } + function Fo() { + var e = Rt([ + '\n height: ', + ';\n ' + ]); + return Fo = function () { + return e; + }, e; + } + function Vo() { + var e = Rt([ + '\n && {\n background: ', + ';\n height: 95%;\n width: 100%;\n display: grid;\n grid-template-rows: ', + ';\n justify-items: center;\n position: relative;\n\n .qc-cmp2-scrollable-section {\n ', + '\n\n ', + '\n\n ', + '\n }\n\n h2 {\n color: ', + ';\n font-size: 18px;\n font-weight: 600;\n }\n\n p {\n color: ', + ';\n font-size: 14px;\n line-height: 21px;\n\n a {\n color: ', + ';\n text-decoration: none;\n }\n }\n\n .qc-cmp2-close-icon {\n background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'24\' height=\'24\'%3E%3Cpath d=\'M.5.5l23 23m0-23l-23 23\' fill=\'none\' stroke=\'%23000\' stroke-linecap=\'round\' stroke-linejoin=\'round\' stroke-miterlimit=\'10\'/%3E%3Cpath fill=\'none\' d=\'M0 0h24v24H0z\'/%3E%3C/svg%3E")\n no-repeat;\n background-size: 66%;\n border: none;\n box-shadow: none;\n outline: none;\n position: absolute;\n height: 38px;\n width: 38px;\n right: 20px;\n top: 20px;\n z-index: 1;\n cursor: pointer;\n }\n\n .qc-cmp2-info-icon {\n background-image: url("data:image/svg+xml,%3Csvg aria-hidden=\'true\' focusable=\'false\' xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3E%3Cpath fill=\'%23FAAD14\' d=\'M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z\'%3E%3C/path%3E%3C/svg%3E%0A");\n background-repeat: no-repeat;\n flex-shrink: 0;\n margin-right: 5px;\n height: 15px;\n width: 21px;\n }\n\n .qc-cmp2-consent-info {\n padding: 5% 20px 2%;\n text-align: center;\n\n .qc-cmp2-header-links {\n display: flex;\n justify-content: flex-end;\n width: 100%;\n float: right;\n\n button {\n margin: 0 15px;\n color: ', + ';\n }\n }\n\n .qc-cmp2-publisher-logo-container {\n position: relative;\n text-align: center;\n\n .qc-cmp2-home-button {\n background: none;\n border: none;\n box-shadow: none;\n color: ', + ';\n cursor: pointer;\n display: flex;\n align-items: center;\n font-size: 14px;\n font-weight: bold;\n text-transform: uppercase;\n position: absolute;\n top: 0%;\n left: 0%;\n z-index: 1;\n svg {\n use {\n fill: ', + ';\n }\n }\n ', + '\n\n &:focus {\n outline: none;\n }\n\n img {\n margin: 0 5px 0 0;\n }\n }\n\n figure .logo-container {\n margin: 0 auto;\n }\n\n img {\n margin-bottom: 2%;\n }\n }\n\n h2 {\n margin-bottom: 3%;\n }\n\n p {\n text-align: left;\n margin-bottom: 3%;\n max-height: 20vh;\n font-size: 13px;\n overflow: auto;\n }\n }\n\n .qc-cmp2-summary-section {\n display: grid;\n justify-items: center;\n overflow: hidden;\n\n h2 {\n margin-top: 0;\n margin-bottom: 10px;\n }\n\n .logo-container {\n margin-bottom: 13px;\n }\n .qc-cmp2-publisher-logo-container {\n height: 100%;\n }\n\n .qc-cmp2-summary-info {\n padding-bottom: 30px;\n height: 100%;\n overflow-y: auto;\n\n p {\n line-height: 1.5em;\n margin-bottom: 15px;\n max-height: none;\n }\n }\n }\n\n .qc-cmp2-scrollable-section {\n overflow-y: auto;\n flex: 1;\n width: 100%;\n max-width: 770px;\n max-height: 100%;\n\n &::-webkit-scrollbar {\n width: 0.7rem;\n visibility: hidden;\n }\n &::-webkit-scrollbar-thumb {\n background: ', + ';\n }\n &.loading {\n &::-webkit-scrollbar-thumb {\n background: ', + ';\n }\n }\n span.qc-cmp2-loading-message {\n display: none;\n position: absolute;\n margin: auto;\n left: 0;\n right: 0;\n text-align: center;\n background-color: ', + ';\n }\n }\n\n .qc-cmp2-privacy-policy {\n border-top: solid 1px ', + ';\n padding: 2.5% 60px;\n\n a {\n text-decoration: none;\n color: ', + ';\n }\n }\n\n .qc-cmp2-footer {\n background-color: transparent;\n border-top: solid 1px ', + ';\n padding: 3% 15px;\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n position: relative;\n width: 100%;\n\n &.qc-cmp2-footer-overlay {\n &::before {\n content: \'\';\n display: block;\n width: 100%;\n position: absolute;\n height: 50px;\n background: linear-gradient(0deg, #ffffff, rgba(255, 255, 255, 0));\n left: 0;\n top: -51px;\n pointer-events: none;\n transition: all 0.2s ease;\n opacity: 1;\n }\n\n &.qc-cmp2-footer-scrolled {\n &::before {\n height: 0;\n opacity: 0;\n }\n }\n }\n\n * {\n box-sizing: border-box;\n }\n\n [mode=\'link\'] {\n &:not(.qc-cmp2-link-active) {\n color: ', + ';\n }\n }\n\n & > button {\n width: 100%;\n &:first-child {\n margin-bottom: 2.8%;\n }\n }\n\n .qc-cmp2-footer-links {\n display: flex;\n justify-content: space-between;\n padding-top: 10px;\n width: 100%;\n }\n\n .qc-cmp2-buttons-desktop {\n display: none;\n }\n\n .qc-cmp2-summary-buttons {\n width: 100%;\n display: flex;\n flex-direction: column;\n\n button {\n width: 100%;\n margin-bottom: 10px;\n order: 1;\n\n &:first-child {\n order: 2;\n }\n\n &:last-child {\n order: 0;\n }\n }\n }\n }\n\n @media (max-width: 360px) {\n /* support for iPhone 5/SE and Galaxy S5 */\n display: block;\n height: 100%;\n\n p {\n font-size: 13px;\n }\n\n .qc-cmp2-summary-section {\n max-height: 70%;\n overflow-y: auto;\n }\n\n .qc-cmp2-consent-info {\n padding-top: 10px;\n\n img {\n margin-bottom: 0;\n }\n\n h2 {\n margin-bottom: 3px;\n }\n\n p {\n margin-bottom: 5px;\n max-height: 15vh;\n }\n }\n\n .qc-cmp2-scrollable-section {\n max-height: 42%;\n }\n\n .qc-cmp2-privacy-policy {\n padding: 8px 25px;\n\n p {\n text-align: center;\n }\n }\n }\n\n @media (min-width: 768px) {\n height: ', + ';\n max-height: ', + ';\n width: 770px;\n grid-template-rows: auto 1fr;\n\n h2 {\n font-size: 20px;\n margin-top: 10px;\n }\n\n p {\n font-size: 15px;\n }\n\n .qc-cmp2-hide-desktop {\n display: none;\n }\n\n .qc-cmp2-consent-info {\n padding: 15px 30px;\n width: 100%;\n\n p {\n margin-bottom: 0;\n max-height: none;\n font-size: 14px;\n }\n\n .qc-cmp2-publisher-logo-container {\n img {\n margin-bottom: 0;\n }\n h2 {\n margin-bottom: 10px;\n }\n }\n }\n\n .qc-cmp2-scrollable-section {\n padding: 0 30px;\n }\n\n .qc-cmp2-footer {\n padding: 13px 30px;\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n box-shadow: 0 -2px 4px 0 rgba(0, 0, 0, 0.1);\n\n .qc-cmp2-footer-links {\n padding-top: 0;\n width: auto;\n button {\n &:not(.qc-cmp2-link-active) {\n color: ', + ';\n }\n margin-left: 15px;\n &:first-child {\n margin-left: 0;\n }\n }\n }\n\n .qc-cmp2-buttons-desktop {\n display: inline-flex;\n margin-left: 50px;\n button {\n margin: 0;\n flex: 1;\n font-size: 11px;\n }\n\n button {\n &:first-of-type {\n margin-right: 1em;\n }\n }\n }\n\n .qc-cmp2-summary-buttons {\n flex-direction: row;\n justify-content: space-between;\n padding: 5px 0;\n\n button {\n margin-bottom: 0;\n margin-right: 15px;\n order: 0;\n\n &:first-child {\n order: 0;\n }\n\n &:last-child {\n margin-right: 0;\n }\n }\n }\n\n &.qc-cmp2-footer-overlay {\n &::before {\n display: none;\n }\n }\n }\n\n ', + '\n }\n }\n' + ]); + return Vo = function () { + return e; + }, e; + } + var Go = Gt.div(Vo(), function (e) { + return e.uxBackgroundColor; + }, function (e) { + return 0 !== e.page ? 'auto 3fr auto' : 'none'; + }, function (e) { + var n = e.isIE, t = e.page, r = e.usesLogo; + return n && 1 === t && Et(Fo(), r ? '192px' : '262px'); + }, function (e) { + var n = e.isIE, t = e.page, r = e.usesLogo; + return n && 2 === t && Et(jo(), r ? '282px' : '342px'); + }, function (e) { + var n = e.isIE, t = e.page, r = e.usesLogo; + return n && 1 !== t && 2 !== t && Et(Bo(), r ? '262px' : '332px'); + }, function (e) { + return e.uxFontColor; + }, function (e) { + return e.uxFontColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.uxLinkColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.isIE && Et(Do()); + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.uxBackgroundColor; + }, function (e) { + return e.uxBackgroundColor; + }, function (e) { + return e.borderColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.borderColor; + }, function (e) { + return e.uxLinkColor; + }, function (e) { + return 0 === e.page ? 'auto' : 'inherit'; + }, function (e) { + return 0 === e.page ? 'none' : '550px'; + }, function (e) { + return e.uxLinkColor; + }, function (e) { + var n = e.isPopup, t = e.page, r = e.uxBackgroundColor; + return !n && 0 === t && Et(Uo(), r, r); + }), Mo = function (e) { + var n = e.coreUiLabels, t = e.premiumUiLabels, r = e.isPopup, o = e.nonIabData, a = e.page, s = e.consentGroupHandler, c = e.vendorsData, l = e.showRejectButton, u = e.googleVendors, p = e.isAmp, d = e.setAllConsentsToByPage, f = g(_e(Ca), 2)[1], m = g(fe(!1), 2), h = m[0], v = m[1], _ = g(fe({}), 2), x = _[0], E = _[1], C = g(fe(Math.random()), 2), k = C[0], w = C[1], S = function () { + s(a); + }, L = function () { + s(a, !0); + }, P = function () { + s(a, !1); + }, T = function () { + d && (d(!0, a), w(Math.random())); + }, q = function () { + d && (d(!1, a), w(Math.random())); + }, A = function (e, t) { + var r = e.currentTarget.parentNode, o = Ct.EXPAND_ELEMENT, a = Ct.COLLAPSE_ELEMENT; + r.classList.contains('qc-cmp2-expanded') ? (oa.eventTracker(a, t), E(function (e) { + return b(b({}, e), {}, y({}, t, !1)); + })) : (oa.eventTracker(o, t), E(function (e) { + return b(b({}, e), {}, y({}, t, !0)); + })), r.classList.toggle('qc-cmp2-expanded'), e.currentTarget.innerHTML === n.showPartners ? e.currentTarget.innerHTML = n.hidePartners : e.currentTarget.innerHTML === n.hidePartners && (e.currentTarget.innerHTML = n.showPartners); + }, I = function (e, n, t, r) { + var o = e.initScreenBodyTextOption, a = n.customInitScreenBodyText, s = n.customSecondScreenBodyText, c = n.customVendorScreenBodyText, l = n.customLegitimateScreenBodyText, u = '', p = !1, d = e.consentScope; + switch (r) { + case 0: + var f, m = 4 === o && a, h = !1; + if (m) + f = sr(a, n.purposeScreenVendorLink.toLowerCase(), e); + else if (t) + switch (d) { + case Qt.SERVICE: + f = n.summaryScreenBodyRejectService; + break; + case Qt.GLOBAL: + f = n.summaryScreenBodyRejectGlobal; + break; + default: + h = !0, f = n.summaryScreenBodyRejectGroup; + } + else + switch (d) { + case Qt.SERVICE: + f = n.summaryScreenBodyNoRejectService; + break; + case Qt.GLOBAL: + f = n.summaryScreenBodyNoRejectGlobal; + break; + default: + h = !0, f = n.summaryScreenBodyNoRejectGroup; + } + return h && (f = [].concat(i(f), [rr(f[1], n.groupOfSitesLabel, e)])), m || (f = [ + or(f[0], n.purposeScreenVendorLink.toLowerCase()), + f[1] + ]), { + bodyText: f, + isCustomized: !!m + }; + case 1: + return 4 === o && s ? (u = sr(s, n.purposeScreenVendorLink.toLowerCase(), e), p = !0) : u = d === Qt.SERVICE ? n.initScreenBodyService || '' : d === Qt.GLOBAL ? n.initScreenBodyGlobal || '' : n.initScreenBodyGroup || '', { + bodyText: u, + isCustomized: p + }; + case 2: + return 4 === o && c ? (u = sr(c, n.purposeScreenVendorLink.toLowerCase(), e), p = !0) : u = n.vendorScreenBody || '', { + bodyText: u, + isCustomized: p + }; + case 3: + return 4 === o && l ? (u = sr(l, n.purposeScreenVendorLink.toLowerCase(), e), p = !0) : u = n.legitimateScreenBody || '', { + bodyText: u, + isCustomized: p + }; + default: + return { + bodyText: u, + isCustomized: p + }; + } + }(sa.coreConfig, n, l, a), O = function (e) { + if (e && e.target) { + var n = e.target; + n && n.scrollHeight - n.scrollTop === n.clientHeight ? v(!0) : h && v(!1); + } + }; + return he(function () { + if (0 === a) { + var e = document.querySelector('.qc-cmp2-summary-info'); + e && e.scrollHeight - e.scrollTop === e.clientHeight ? v(!0) : h && v(!1); + } + }, []), tn.createElement(Go, { + isPopup: r, + id: 'qc-cmp2-ui', + page: a, + role: 'dialog', + 'aria-label': 'qc-cmp2-ui', + 'aria-modal': 'true', + tabIndex: 0, + borderColor: ia.borderColor, + lightestTextColor: ia.lightestTextColor, + uxBackgroundColor: ia.uxBackgroundColor, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor, + uxFontColor: ia.uxFontColor, + uxLinkColor: ia.uxLinkColor, + warningTextColor: ia.warningTextColor, + warningBackgroundColor: ia.warningBackgroundColor, + isIE: lr(), + usesLogo: '' !== sa.coreConfig.publisherLogo + }, oa.getDisplayType() !== kt.MANDATORY && 0 !== a && tn.createElement('button', { + className: 'qc-cmp2-close-icon', + onClick: function () { + f({ + payload: { regulation: 'GDPR' }, + type: 'TOGGLE_DISPLAY' + }), oa.eventTracker(Ct.DISMISS_UI, 'click'), aa.sendDoneLog(void 0, '', ''), oa.notifyUiClosed('GDPR'), tr(p, { + type: At.CONSENT_RESPONSE, + action: Ot.DISMISS + }); + } + }), function () { + var e = tn.createElement(kr, { + coreUiLabels: n, + acceptAllHeader: T, + rejectAllHeader: q, + page: a, + bodyContent: I, + handleScroll: 0 === a ? O : void 0, + isDesktop: window.screen.width > 767, + isAmp: p + }), r = function (e) { + return tn.createElement(tn.Fragment, null, tn.createElement(pr, Object.assign({ + acceptAllFunction: L, + acceptSelected: S, + coreUiLabels: n, + page: a + }, e))); + }; + switch (a) { + case 1: + return tn.createElement(No, { + coreUiLabels: n, + premiumUiLabels: t, + vendorsData: c, + nonIabData: o, + handleClick: A, + page: a, + toggleObj: x, + key: k + }, e, tn.createElement(r, null)); + case 2: + return cr('Vendors rendered: '.concat(Object.keys(c.vendors).length)), tn.createElement(Ro, { + coreUiLabels: n, + premiumUiLabels: t, + vendorsData: c, + nonIabData: o, + handleClick: A, + page: a, + googleVendors: u, + key: k + }, e, tn.createElement(r, null)); + case 3: + return cr('Vendors rendered: '.concat(Object.keys(c.vendors).length)), tn.createElement(vo, { + coreUiLabels: n, + premiumUiLabels: t, + vendorsData: c, + handleClick: A, + page: a, + nonIabData: o, + key: k + }, e, tn.createElement(r, null)); + default: + return tn.createElement(tn.Fragment, null, tn.createElement('div', { className: 'qc-cmp2-summary-section' }, e), tn.createElement(r, { + rejectAllFunction: P, + showRejectButton: l, + showOverlay: !0, + isScrolled: h, + isAmp: p + })); + } + }()); + }; + function zo() { + var e = Rt(['\n align-items: flex-end;\n ']); + return zo = function () { + return e; + }, e; + } + function Ho() { + var e = Rt([ + '\n && {\n background-color: ', + ';\n display: flex;\n align-items: center;\n justify-content: center;\n height: ', + 'px;\n width: 100vw;\n overflow: hidden;\n color: ', + ';\n position: fixed;\n top: 0;\n left: 0;\n z-index: 99999999999999;\n\n * {\n font-family: ', + ';\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n line-height: 1;\n }\n\n @media (min-width: 768px) {\n ', + '\n }\n }\n' + ]); + return Ho = function () { + return e; + }, e; + } + var $o = Gt.div(Ho(), function (e) { + var n = e.overlayColor, t = e.isAMP, r = e.page; + return t && 0 === r ? 'none' : n; + }, function (e) { + return e.height; + }, function (e) { + return e.uxFontColor; + }, function (e) { + return e.font; + }, function (e) { + var n = e.isPopup, t = e.page; + return !n && 0 === t && Et(zo()); + }), Yo = function (e) { + var n = e.isPopup, t = e.className, r = e.isOpen, o = e.page, a = e.children, i = e.isAMP, s = g(fe(window.innerHeight), 2), c = s[0], l = s[1]; + he(function () { + return window.addEventListener('resize', u), function () { + window.removeEventListener('resize', u); + }; + }); + var u = function () { + l(window.innerHeight); + }; + return tn.createElement(tn.Fragment, null, r && tn.createElement($o, { + height: c, + isPopup: n, + className: t, + page: o, + overlayColor: ia.overlayColor, + uxFontColor: ia.uxFontColor, + font: ia.font, + isAMP: i + }, a)); + }, Wo = function (e) { + var n = e.coreConfig, t = e.coreUiLabels, r = e.premiumUiLabels, o = e.nonIabData, a = e.vendorsData, i = e.consentGroupHandler, s = e.eventTracker, c = e.setAllConsentsToByPage, l = e.googleVendors, u = window.innerWidth <= 768 || document.documentElement.clientWidth <= 768 || document.body.clientWidth < 768, p = g(_e(Ca), 1)[0]; + return tn.createElement(Yo, { + isPopup: 'popup' === n.uiLayout || u, + isOpen: p.displayGDPR, + className: 'qc-cmp-cleanslate', + page: p.pageGDPR, + isAMP: n.isAMP + }, p.displayGDPR && tn.createElement(Mo, { + coreUiLabels: t, + isPopup: 'popup' === n.uiLayout || u, + nonIabData: o, + vendorsData: a, + eventTracker: s, + consentGroupHandler: i, + page: p.pageGDPR, + setAllConsentsToByPage: c, + showRejectButton: n.initScreenRejectButtonShowing, + premiumUiLabels: r, + googleVendors: l, + isAmp: n.isAMP + })); + }; + function Jo() { + var e = Rt([ + '\n && {\n max-width: 770px;\n width: 100%;\n position: relative;\n background: #fff;\n\n .qc-usp-ui-content {\n display: flex;\n flex-direction: column;\n margin: auto;\n max-width: 660px;\n padding: 30px 30px 30px;\n\n .qc-usp-ui-form-content {\n max-width: 600px;\n padding: 10px 10px 15px;\n border: 1px solid ', + ';\n\n > button {\n margin-top: 15px;\n font-size: 14px;\n width: 140px;\n height: 30px;\n }\n\n .qc-usp-container {\n border: none;\n margin: 0;\n\n .qc-usp-container-row {\n border: none;\n padding: 0;\n font-size: 14px;\n width: 100%;\n font-weight: 100;\n line-height: 20px;\n\n .qc-usp-purpose-info {\n display: flex;\n align-items: center;\n\n .qc-usp-toogle {\n margin-left: 0px;\n }\n\n .qc-usp-action-description {\n margin-left: 15px;\n width: calc(100% - 50px);\n }\n }\n }\n }\n }\n\n .qc-usp-title {\n color: ', + ';\n font-weight: 600;\n }\n\n .qc-usp-main-messaging {\n color: ', + ';\n font-size: 14px;\n line-height: 20px;\n max-height: 270px;\n padding: 15px 0;\n margin: 15px 0;\n overflow: auto;\n\n a {\n color: ', + ';\n text-decoration: none;\n }\n }\n }\n\n .qc-usp-alt-buttons {\n margin: 0 auto;\n padding-bottom: 30px;\n text-align: center;\n\n .qc-usp-alt-action {\n cursor: pointer;\n color: ', + ';\n font-size: 14px;\n text-align: center;\n\n &.qc-usp-center-bottom {\n display: inline;\n padding: 0 15px;\n text-decoration: none;\n\n & + .qc-usp-center-bottom {\n border-left: 1px solid ', + ';\n }\n }\n }\n }\n\n .qc-usp-close-icon {\n background: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' width=\'24\' height=\'24\'%3E%3Cpath d=\'M.5.5l23 23m0-23l-23 23\' fill=\'none\' stroke=\'%23000\' stroke-linecap=\'round\' stroke-linejoin=\'round\' stroke-miterlimit=\'10\'/%3E%3Cpath fill=\'none\' d=\'M0 0h24v24H0z\'/%3E%3C/svg%3E")\n no-repeat;\n background-size: 65%;\n border: none;\n height: 38px;\n margin: auto 0;\n width: 38px;\n right: 20px;\n position: absolute;\n top: 20px;\n }\n\n @media (min-width: 768px) {\n .qc-usp-ui-content {\n .qc-usp-ui-form-content {\n .qc-usp-container {\n .qc-usp-container-row {\n .qc-usp-purpose-info {\n .qc-usp-toogle {\n margin-left: 3px;\n }\n\n .qc-usp-action-description {\n margin-left: 15px;\n width: calc(100% - 75px);\n }\n }\n }\n }\n }\n }\n }\n }\n' + ]); + return Jo = function () { + return e; + }, e; + } + var Xo = Gt.div(Jo(), function (e) { + return e.borderColor; + }, function (e) { + return e.subHeaderColor; + }, function (e) { + return e.uxFontColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.uxPrimaryButtonColor; + }, function (e) { + return e.borderColor; + }), Ko = function (e) { + var n = e.premiumUiLabels, t = e.coreConfig, r = e.close, o = e.eventTracker, a = g(fe(!1), 2), i = a[0], s = a[1], c = g(fe({ uspString: '' }), 2), l = c[0], u = c[1]; + ge(function () { + window.__uspapi('getUSPData', 1, function (e) { + s(e && 'Y' === e.uspString[2]), u(e); + }); + }, []); + return tn.createElement(Xo, { + role: 'dialog', + 'aria-labelledby': 'qc-usp-title', + 'aria-modal': 'true', + tabIndex: 0, + borderColor: ia.borderColor, + subHeaderColor: ia.subHeaderColor, + uxFontColor: ia.uxFontColor, + uxPrimaryButtonColor: ia.uxPrimaryButtonColor + }, tn.createElement('button', { + tabIndex: 0, + 'aria-label': 'Close', + 'aria-pressed': 'false', + className: 'qc-usp-close-icon ', + onClick: function (e) { + return tr(t.isAMP, { + type: At.CONSENT_RESPONSE, + action: Ot.DISMISS + }), r(), o(Ct.DISMISS_UI, 'click'), void aa.sendDoneLogUsp(Pt.ACCEPT_PARTIAL, l.uspString); + } + }), tn.createElement('div', { className: 'qc-usp-ui-content' }, tn.createElement('p', { + id: 'qc-usp-title', + className: 'qc-usp-title' + }, t.publisherName && ''.concat(t.publisherName, ' - '), n.uspDnsTitle), tn.createElement('div', { + className: 'qc-usp-main-messaging', + tabIndex: 0 + }, Array.isArray(n.uspDnsText) ? n.uspDnsText.map(function (e, n) { + return tn.createElement('div', { + key: n, + dangerouslySetInnerHTML: { __html: e } + }); + }) : tn.createElement('div', { dangerouslySetInnerHTML: { __html: n.uspDnsText } })), tn.createElement('div', { className: 'qc-usp-ui-form-content' }, tn.createElement('div', { className: 'qc-usp-container' }, tn.createElement('div', { className: 'qc-usp-container-row' }, tn.createElement('div', { className: 'qc-usp-purpose-info' }, tn.createElement(Ar, { + on: i, + 'aria-labelledby': 'toggleDescription', + className: 'qc-usp-toogle', + onClick: function () { + o(Ct.OPT_OUT_TOGGLE, String(!i)), s(!i); + } + }), tn.createElement('p', { + id: 'toggleDescription', + className: 'qc-usp-action-description' + }, n.uspDoNotSellToggleText)))), tn.createElement(Zt, { + 'aria-label': 'Confirm', + 'aria-pressed': 'false', + size: 'large', + onClick: function (e) { + return o(Ct.OPT_OUT_CONFIRM, String(i)), window.__uspapi('setUspData', 1, function (e) { + tr(t.isAMP, { + type: At.CONSENT_RESPONSE, + action: e.doNotSell ? Ot.REJECT : Ot.ACCEPT, + info: e.uspString, + consentMetadata: { consentStringType: It.USP } + }), aa.sendDoneLogUsp(i ? Pt.REJECT : Pt.ACCEPT_ALL, e.uspString); + }, i), void r(); + } + }, n.uspAcceptButton))), tn.createElement('div', { className: 'qc-usp-alt-buttons' }, !t.suppressCcpaLinks && tn.createElement(tn.Fragment, null, tn.createElement('a', { + tabIndex: 0, + id: 'qc-usp-delete-link', + className: 'qc-usp-alt-action qc-usp-center-bottom', + href: t.uspDeleteDataLink, + title: 'Read More about the Data Deletion Policy' + }, n.uspDeleteDataLinkText), tn.createElement('a', { + tabIndex: 0, + id: 'qc-usp-access-link', + className: 'qc-usp-alt-action qc-usp-center-bottom', + href: t.uspAccessDataLink, + title: 'Read More about the Data Access Policy' + }, n.uspAccessDataLinkText), tn.createElement('a', { + tabIndex: 0, + id: 'qc-usp-policy-link', + className: 'qc-usp-alt-action qc-usp-center-bottom', + href: t.uspPrivacyPolicyLink, + title: 'Read More about the Privacy Policy' + }, n.uspPrivacyPolicyLinkText)))); + }, Qo = function (e) { + var n = e.coreConfig, t = e.premiumUiLabels, r = e.eventTracker, o = g(_e(Ca), 2), a = o[0], i = o[1], s = a.displayUSP; + return tn.createElement(Yo, { + className: 'qc-cmp-cleanslate', + isPopup: !0, + isOpen: s, + isAMP: n.isAMP, + page: 0 + }, s && tn.createElement(Ko, { + coreConfig: n, + premiumUiLabels: t, + eventTracker: r, + close: function () { + i({ + payload: { regulation: 'USP' }, + type: 'TOGGLE_DISPLAY' + }); + } + })); + }; + function Zo() { + var e = Rt(['\n /* This is a customized version of cleaslate. For more info go here: http://cleanslatecss.com/ */\n .qc-cmp-cleanslate,\n .qc-cmp-cleanslate h1,\n .qc-cmp-cleanslate h2,\n .qc-cmp-cleanslate h3,\n .qc-cmp-cleanslate h4,\n .qc-cmp-cleanslate h5,\n .qc-cmp-cleanslate h6,\n .qc-cmp-cleanslate p,\n .qc-cmp-cleanslate td,\n .qc-cmp-cleanslate dl,\n .qc-cmp-cleanslate tr,\n .qc-cmp-cleanslate dt,\n .qc-cmp-cleanslate ol,\n .qc-cmp-cleanslate form,\n .qc-cmp-cleanslate select,\n .qc-cmp-cleanslate option,\n .qc-cmp-cleanslate pre,\n .qc-cmp-cleanslate div,\n .qc-cmp-cleanslate table,\n .qc-cmp-cleanslate th,\n .qc-cmp-cleanslate tbody,\n .qc-cmp-cleanslate tfoot,\n .qc-cmp-cleanslate caption,\n .qc-cmp-cleanslate thead,\n .qc-cmp-cleanslate ul,\n .qc-cmp-cleanslate li,\n .qc-cmp-cleanslate address,\n .qc-cmp-cleanslate blockquote,\n .qc-cmp-cleanslate dd,\n .qc-cmp-cleanslate fieldset,\n .qc-cmp-cleanslate li,\n .qc-cmp-cleanslate iframe,\n .qc-cmp-cleanslate strong,\n .qc-cmp-cleanslate legend,\n .qc-cmp-cleanslate em,\n .qc-cmp-cleanslate summary,\n .qc-cmp-cleanslate cite,\n .qc-cmp-cleanslate span,\n .qc-cmp-cleanslate input,\n .qc-cmp-cleanslate sup,\n .qc-cmp-cleanslate label,\n .qc-cmp-cleanslate dfn,\n .qc-cmp-cleanslate object,\n .qc-cmp-cleanslate big,\n .qc-cmp-cleanslate q,\n .qc-cmp-cleanslate samp,\n .qc-cmp-cleanslate acronym,\n .qc-cmp-cleanslate small,\n .qc-cmp-cleanslate img,\n .qc-cmp-cleanslate strike,\n .qc-cmp-cleanslate code,\n .qc-cmp-cleanslate sub,\n .qc-cmp-cleanslate ins,\n .qc-cmp-cleanslate textarea,\n .qc-cmp-cleanslate button,\n .qc-cmp-cleanslate var,\n .qc-cmp-cleanslate a,\n .qc-cmp-cleanslate abbr,\n .qc-cmp-cleanslate applet,\n .qc-cmp-cleanslate del,\n .qc-cmp-cleanslate kbd,\n .qc-cmp-cleanslate tt,\n .qc-cmp-cleanslate b,\n .qc-cmp-cleanslate i,\n .qc-cmp-cleanslate hr,\n .qc-cmp-cleanslate article,\n .qc-cmp-cleanslate aside,\n .qc-cmp-cleanslate figure,\n .qc-cmp-cleanslate figcaption,\n .qc-cmp-cleanslate footer,\n .qc-cmp-cleanslate header,\n .qc-cmp-cleanslate menu,\n .qc-cmp-cleanslate nav,\n .qc-cmp-cleanslate section,\n .qc-cmp-cleanslate time,\n .qc-cmp-cleanslate mark,\n .qc-cmp-cleanslate audio,\n .qc-cmp-cleanslate video,\n .qc-cmp-cleanslate abbr,\n .qc-cmp-cleanslate address,\n .qc-cmp-cleanslate area,\n .qc-cmp-cleanslate blockquote,\n .qc-cmp-cleanslate canvas,\n .qc-cmp-cleanslate caption,\n .qc-cmp-cleanslate cite,\n .qc-cmp-cleanslate code,\n .qc-cmp-cleanslate colgroup,\n .qc-cmp-cleanslate col,\n .qc-cmp-cleanslate datalist,\n .qc-cmp-cleanslate fieldset,\n .qc-cmp-cleanslate main,\n .qc-cmp-cleanslate map,\n .qc-cmp-cleanslate meta,\n .qc-cmp-cleanslate optgroup,\n .qc-cmp-cleanslate output,\n .qc-cmp-cleanslate progress,\n .qc-cmp-cleanslate svg {\n background-attachment: scroll;\n background-color: transparent;\n background-image: none;\n background-position: 0 0;\n background-repeat: repeat;\n border-color: black;\n border-color: currentColor;\n border-radius: 0;\n border-style: none;\n border-width: medium;\n bottom: auto;\n clear: none;\n clip: auto;\n color: inherit;\n counter-increment: none;\n counter-reset: none;\n cursor: auto;\n direction: inherit;\n display: inline;\n float: none;\n font-family: inherit;\n font-size: inherit;\n font-style: inherit;\n font-variant: normal;\n font-weight: inherit;\n height: auto;\n left: auto;\n letter-spacing: normal;\n line-height: inherit;\n list-style-type: inherit;\n list-style-position: outside;\n list-style-image: none;\n margin: 0;\n max-height: none;\n max-width: none;\n min-height: 0;\n min-width: 0;\n opacity: 1;\n outline: invert none medium;\n overflow: visible;\n padding: 0;\n position: static;\n quotes: \'\' \'\';\n right: auto;\n table-layout: auto;\n text-align: inherit;\n text-decoration: inherit;\n text-indent: 0;\n text-transform: none;\n top: auto;\n unicode-bidi: normal;\n vertical-align: baseline;\n visibility: inherit;\n white-space: normal;\n width: auto;\n word-spacing: normal;\n z-index: auto;\n\n -webkit-background-origin: padding-box;\n background-origin: padding-box;\n -webkit-background-clip: border-box;\n background-clip: border-box;\n -webkit-background-size: auto;\n -moz-background-size: auto;\n background-size: auto;\n -webkit-border-image: none;\n -moz-border-image: none;\n -o-border-image: none;\n border-image: none;\n -webkit-border-radius: 0;\n -moz-border-radius: 0;\n border-radius: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-column-count: auto;\n -moz-column-count: auto;\n column-count: auto;\n -webkit-column-gap: normal;\n -moz-column-gap: normal;\n column-gap: normal;\n -webkit-column-rule: medium none black;\n -moz-column-rule: medium none black;\n column-rule: medium none black;\n -webkit-column-span: 1;\n -moz-column-span: 1;\n column-span: 1;\n -webkit-column-width: auto;\n -moz-column-width: auto;\n column-width: auto;\n font-feature-settings: normal;\n overflow-x: visible;\n overflow-y: visible;\n -webkit-hyphens: manual;\n -moz-hyphens: manual;\n hyphens: manual;\n -webkit-perspective: none;\n -moz-perspective: none;\n -ms-perspective: none;\n -o-perspective: none;\n perspective: none;\n -webkit-perspective-origin: 50% 50%;\n -moz-perspective-origin: 50% 50%;\n -ms-perspective-origin: 50% 50%;\n -o-perspective-origin: 50% 50%;\n perspective-origin: 50% 50%;\n -webkit-backface-visibility: visible;\n -moz-backface-visibility: visible;\n -ms-backface-visibility: visible;\n -o-backface-visibility: visible;\n backface-visibility: visible;\n text-shadow: none;\n -webkit-transition: all 0s ease 0s;\n transition: all 0s ease 0s;\n -webkit-transform: none;\n -moz-transform: none;\n -ms-transform: none;\n -o-transform: none;\n transform: none;\n -webkit-transform-origin: 50% 50%;\n -moz-transform-origin: 50% 50%;\n -ms-transform-origin: 50% 50%;\n -o-transform-origin: 50% 50%;\n transform-origin: 50% 50%;\n -webkit-transform-style: flat;\n -moz-transform-style: flat;\n -ms-transform-style: flat;\n -o-transform-style: flat;\n transform-style: flat;\n word-break: normal;\n }\n\n .qc-cmp-cleanslate,\n .qc-cmp-cleanslate h3,\n .qc-cmp-cleanslate h5,\n .qc-cmp-cleanslate p,\n .qc-cmp-cleanslate h1,\n .qc-cmp-cleanslate dl,\n .qc-cmp-cleanslate dt,\n .qc-cmp-cleanslate h6,\n .qc-cmp-cleanslate ol,\n .qc-cmp-cleanslate form,\n .qc-cmp-cleanslate option,\n .qc-cmp-cleanslate pre,\n .qc-cmp-cleanslate div,\n .qc-cmp-cleanslate h2,\n .qc-cmp-cleanslate caption,\n .qc-cmp-cleanslate h4,\n .qc-cmp-cleanslate ul,\n .qc-cmp-cleanslate address,\n .qc-cmp-cleanslate blockquote,\n .qc-cmp-cleanslate dd,\n .qc-cmp-cleanslate fieldset,\n .qc-cmp-cleanslate hr,\n .qc-cmp-cleanslate article,\n .qc-cmp-cleanslate dialog,\n .qc-cmp-cleanslate figure,\n .qc-cmp-cleanslate footer,\n .qc-cmp-cleanslate header,\n .qc-cmp-cleanslate hgroup,\n .qc-cmp-cleanslate menu,\n .qc-cmp-cleanslate nav,\n .qc-cmp-cleanslate section,\n .qc-cmp-cleanslate audio,\n .qc-cmp-cleanslate video,\n .qc-cmp-cleanslate address,\n .qc-cmp-cleanslate blockquote,\n .qc-cmp-cleanslate colgroup,\n .qc-cmp-cleanslate main,\n .qc-cmp-cleanslate progress,\n .qc-cmp-cleanslate summary {\n display: block;\n }\n .qc-cmp-cleanslate h1,\n .qc-cmp-cleanslate h2,\n .qc-cmp-cleanslate h3,\n .qc-cmp-cleanslate h4,\n .qc-cmp-cleanslate h5,\n .qc-cmp-cleanslate h6 {\n font-weight: bold;\n }\n .qc-cmp-cleanslate h1 {\n font-size: 2em;\n padding: 0.67em 0;\n }\n .qc-cmp-cleanslate h2 {\n font-size: 1.5em;\n padding: 0.83em 0;\n }\n .qc-cmp-cleanslate h3 {\n font-size: 1.17em;\n padding: 0.83em 0;\n }\n .qc-cmp-cleanslate h4 {\n font-size: 1em;\n }\n .qc-cmp-cleanslate h5 {\n font-size: 0.83em;\n }\n .qc-cmp-cleanslate p {\n margin: 1em 0;\n }\n .qc-cmp-cleanslate table {\n display: table;\n }\n .qc-cmp-cleanslate thead {\n display: table-header-group;\n }\n .qc-cmp-cleanslate tbody {\n display: table-row-group;\n }\n .qc-cmp-cleanslate tfoot {\n display: table-footer-group;\n }\n .qc-cmp-cleanslate tr {\n display: table-row;\n }\n .qc-cmp-cleanslate th,\n .qc-cmp-cleanslate td {\n display: table-cell;\n padding: 2px;\n }\n\n .qc-cmp-cleanslate ol,\n .qc-cmp-cleanslate ul {\n margin: 1em 0;\n }\n .qc-cmp-cleanslate ul li,\n .qc-cmp-cleanslate ul ul li,\n .qc-cmp-cleanslate ul ul ul li,\n .qc-cmp-cleanslate ol li,\n .qc-cmp-cleanslate ol ol li,\n .qc-cmp-cleanslate ol ol ol li,\n .qc-cmp-cleanslate ul ol ol li,\n .qc-cmp-cleanslate ul ul ol li,\n .qc-cmp-cleanslate ol ul ul li,\n .qc-cmp-cleanslate ol ol ul li {\n list-style-position: inside;\n margin-top: 0.08em;\n }\n .qc-cmp-cleanslate ol ol,\n .qc-cmp-cleanslate ol ol ol,\n .qc-cmp-cleanslate ul ul,\n .qc-cmp-cleanslate ul ul ul,\n .qc-cmp-cleanslate ol ul,\n .qc-cmp-cleanslate ol ul ul,\n .qc-cmp-cleanslate ol ol ul,\n .qc-cmp-cleanslate ul ol,\n .qc-cmp-cleanslate ul ol ol,\n .qc-cmp-cleanslate ul ul ol {\n padding-left: 40px;\n margin: 0;\n }\n\n .qc-cmp-cleanslate nav ul,\n .qc-cmp-cleanslate nav ol {\n list-style-type: none;\n }\n .qc-cmp-cleanslate ul,\n .qc-cmp-cleanslate menu {\n list-style-type: disc;\n }\n .qc-cmp-cleanslate ol {\n list-style-type: decimal;\n }\n .qc-cmp-cleanslate ol ul,\n .qc-cmp-cleanslate ul ul,\n .qc-cmp-cleanslate menu ul,\n .qc-cmp-cleanslate ol menu,\n .qc-cmp-cleanslate ul menu,\n .qc-cmp-cleanslate menu menu {\n list-style-type: circle;\n }\n .qc-cmp-cleanslate ol ol ul,\n .qc-cmp-cleanslate ol ul ul,\n .qc-cmp-cleanslate ol menu ul,\n .qc-cmp-cleanslate ol ol menu,\n .qc-cmp-cleanslate ol ul menu,\n .qc-cmp-cleanslate ol menu menu,\n .qc-cmp-cleanslate ul ol ul,\n .qc-cmp-cleanslate ul ul ul,\n .qc-cmp-cleanslate ul menu ul,\n .qc-cmp-cleanslate ul ol menu,\n .qc-cmp-cleanslate ul ul menu,\n .qc-cmp-cleanslate ul menu menu,\n .qc-cmp-cleanslate menu ol ul,\n .qc-cmp-cleanslate menu ul ul,\n .qc-cmp-cleanslate menu menu ul,\n .qc-cmp-cleanslate menu ol menu,\n .qc-cmp-cleanslate menu ul menu,\n .qc-cmp-cleanslate menu menu menu {\n list-style-type: square;\n }\n .qc-cmp-cleanslate li {\n display: list-item;\n min-height: auto;\n min-width: auto;\n padding-left: 20px;\n }\n .qc-cmp-cleanslate strong {\n font-weight: bold;\n }\n .qc-cmp-cleanslate em {\n font-style: italic;\n }\n .qc-cmp-cleanslate kbd,\n .qc-cmp-cleanslate samp,\n .qc-cmp-cleanslate code,\n .qc-cmp-cleanslate pre {\n font-family: monospace;\n }\n .qc-cmp-cleanslate a {\n color: blue;\n text-decoration: underline;\n }\n .qc-cmp-cleanslate a:visited {\n color: #529;\n }\n .qc-cmp-cleanslate a,\n .qc-cmp-cleanslate a *,\n .qc-cmp-cleanslate input[type=\'submit\'],\n .qc-cmp-cleanslate input[type=\'button\'],\n .qc-cmp-cleanslate input[type=\'radio\'],\n .qc-cmp-cleanslate input[type=\'checkbox\'],\n .qc-cmp-cleanslate select,\n .qc-cmp-cleanslate button {\n cursor: pointer;\n }\n .qc-cmp-cleanslate button,\n .qc-cmp-cleanslate input[type=\'submit\'] {\n text-align: center;\n padding: 2px 6px 3px;\n border-radius: 0;\n text-decoration: none;\n font-family: arial, helvetica, sans-serif;\n font-size: small;\n background: white;\n color: buttontext;\n border: 1px #a6a6a6 solid;\n background: none;\n filter: none;\n box-shadow: none;\n outline: initial;\n\n &:focus {\n box-shadow: 0 0 0 2px #ffffff, 0 0 3px 5px #206dc5;\n outline: 2px dotted transparent;\n outline-offset: 2px;\n }\n }\n .qc-cmp-cleanslate button:active,\n .qc-cmp-cleanslate input[type=\'submit\']:active,\n .qc-cmp-cleanslate input[type=\'button\']:active,\n .qc-cmp-cleanslate button:active {\n background: none;\n border: none;\n }\n .qc-cmp-cleanslate button {\n padding: 1px 6px 2px 6px;\n margin-right: 5px;\n }\n .qc-cmp-cleanslate input[type=\'hidden\'] {\n display: none;\n }\n\n .qc-cmp-cleanslate textarea {\n -webkit-appearance: textarea;\n background: white;\n padding: 2px;\n margin-left: 4px;\n word-wrap: break-word;\n white-space: pre-wrap;\n font-size: 11px;\n font-family: arial, helvetica, sans-serif;\n line-height: 13px;\n resize: both;\n }\n .qc-cmp-cleanslate select,\n .qc-cmp-cleanslate textarea,\n .qc-cmp-cleanslate input {\n border: 1px solid #ccc;\n }\n .qc-cmp-cleanslate select {\n font-size: 11px;\n font-family: helvetica, arial, sans-serif;\n display: inline-block;\n }\n .qc-cmp-cleanslate textarea:focus,\n .qc-cmp-cleanslate input:focus {\n outline: auto 5px -webkit-focus-ring-color;\n outline: initial;\n }\n .qc-cmp-cleanslate input[type=\'text\'] {\n background: white;\n padding: 1px;\n font-family: initial;\n font-size: small;\n }\n .qc-cmp-cleanslate input[type=\'checkbox\'],\n .qc-cmp-cleanslate input[type=\'radio\'] {\n border: 1px #2b2b2b solid;\n border-radius: 4px;\n }\n .qc-cmp-cleanslate input[type=\'checkbox\'],\n .qc-cmp-cleanslate input[type=\'radio\'] {\n outline: initial;\n }\n .qc-cmp-cleanslate input[type=\'radio\'] {\n margin: 2px 2px 3px 2px;\n }\n .qc-cmp-cleanslate abbr[title],\n .qc-cmp-cleanslate acronym[title],\n .qc-cmp-cleanslate dfn[title] {\n cursor: help;\n border-bottom-width: 1px;\n border-bottom-style: dotted;\n }\n .qc-cmp-cleanslate ins {\n background-color: #ff9;\n color: black;\n }\n .qc-cmp-cleanslate del {\n text-decoration: line-through;\n }\n .qc-cmp-cleanslate blockquote,\n .qc-cmp-cleanslate q {\n quotes: none;\n }\n .qc-cmp-cleanslate blockquote:before,\n .qc-cmp-cleanslate blockquote:after,\n .qc-cmp-cleanslate q:before,\n .qc-cmp-cleanslate q:after,\n .qc-cmp-cleanslate li:before,\n .qc-cmp-cleanslate li:after {\n content: \'\';\n }\n .qc-cmp-cleanslate input,\n .qc-cmp-cleanslate select {\n vertical-align: middle;\n }\n\n .qc-cmp-cleanslate table {\n border-collapse: collapse;\n border-spacing: 0;\n }\n .qc-cmp-cleanslate hr {\n display: block;\n height: 1px;\n border: 0;\n border-top: 1px solid #ccc;\n margin: 1em 0;\n }\n .qc-cmp-cleanslate *[dir=\'rtl\'] {\n direction: rtl;\n }\n .qc-cmp-cleanslate mark {\n background-color: #ff9;\n color: black;\n font-style: italic;\n font-weight: bold;\n }\n .qc-cmp-cleanslate menu {\n padding-left: 40px;\n padding-top: 8px;\n }\n\n .qc-cmp-cleanslate [hidden],\n .qc-cmp-cleanslate template {\n display: none;\n }\n .qc-cmp-cleanslate abbr[title] {\n border-bottom: 1px dotted;\n }\n .qc-cmp-cleanslate sub,\n .qc-cmp-cleanslate sup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n }\n .qc-cmp-cleanslate sup {\n top: -0.5em;\n }\n .qc-cmp-cleanslate sub {\n bottom: -0.25em;\n }\n .qc-cmp-cleanslate img {\n border: 0;\n }\n .qc-cmp-cleanslate figure {\n margin: 0;\n }\n .qc-cmp-cleanslate textarea {\n overflow: auto;\n vertical-align: top;\n }\n\n .qc-cmp-cleanslate {\n font-size: medium;\n line-height: 1;\n direction: ltr;\n text-align: left;\n text-align: start;\n font-family: \'Times New Roman\', Times, serif;\n color: black;\n font-style: normal;\n font-weight: normal;\n text-decoration: none;\n list-style-type: disc;\n }\n\n .qc-cmp-cleanslate pre {\n white-space: pre;\n }\n']); + return Zo = function () { + return e; + }, e; + } + var ea, na, ta, ra = Et(Zo()); + t(14), t(15), t(16); + !function (e) { + e[e.TOP_LEFT = 1] = 'TOP_LEFT', e[e.TOP_RIGHT = 2] = 'TOP_RIGHT', e[e.BOTTOM_RIGHT = 3] = 'BOTTOM_RIGHT', e[e.BOTTOM_LEFT = 4] = 'BOTTOM_LEFT'; + }(ea || (ea = {})), function (e) { + e.YES = 'Y', e.NOT = 'N'; + }(na || (na = {})), function (e) { + e.GDPR = 'GDPR', e.USP = 'USP'; + }(ta || (ta = {})); + t(17); + var oa, aa, ia, sa, ca, la, ua, pa, da = function (e) { + var n, t = e.ui, r = e.mode, o = g(_e(Ca), 1)[0], a = t.consentGroupHandler, i = t.setAllConsentsToByPage, s = t.getCoreConfig(), c = t.getCoreUiLabels(), l = t.getPremiumUiLabels(), u = t.eventTracker, p = g(fe(void 0), 2), d = p[0], f = p[1], m = g(fe(void 0), 2), h = m[0], y = m[1], v = g(fe(void 0), 2), b = v[0], _ = v[1]; + return he(function () { + var e = function () { + var e = sn(on.a.mark(function e() { + return on.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return e.next = 2, ca.readyPromise; + case 2: + y(t.getGVLVendorsData()), _(t.getGoogleVendors()), f(t.getNonIabData()); + case 5: + case 'end': + return e.stop(); + } + }, e); + })); + return function () { + return e.apply(this, arguments); + }; + }(); + (o.displayGDPR && !h || !t.GVLVendorsDataInitialized && o.displayGDPR) && e(), o.changed && cr('Last changed '.concat(o.changed)); + }, [ + b, + r, + d, + o, + t, + h + ]), n = '', r === ta.GDPR && h && d && b ? n = tn.createElement(Wo, { + coreConfig: s, + coreUiLabels: c, + nonIabData: d, + vendorsData: h, + consentGroupHandler: a, + setAllConsentsToByPage: i, + premiumUiLabels: l, + eventTracker: u, + googleVendors: b + }) : r === ta.USP && (n = tn.createElement(Qo, { + coreConfig: s, + premiumUiLabels: l, + eventTracker: u + })), tn.createElement(tn.Fragment, null, tn.createElement(xt, { styles: ra }), n); + }, fa = t(3), ma = t(18), ha = function () { + function e(n, t) { + if (u(this, e), this._data = { + features: {}, + legitimatePurposes: {}, + legitimateVendors: {}, + purposes: {}, + specialPurposes: {}, + stacks: {}, + specialFeatures: {}, + unfilteredSpecialPurposes: {}, + unfilteredSpecialFeatures: {}, + unfilteredPurposes: {}, + unfilteredFeatures: {}, + vendors: {} + }, n) { + var r = qt.STACKS, o = qt.SPECIAL_FEATURES, a = qt.SPECIAL_PURPOSES, i = qt.FEATURES, s = n.stacks, c = n.features, l = n.purposes, p = n.vendors, d = n.specialPurposes, f = n.specialFeatures, m = nr(t), h = m.specialFeaturesIds, g = m.specialPurposesIds, v = m.featuresIds, _ = t.coreConfig, x = _.stacks, E = _.publisherPurposeIds, C = _.publisherPurposeLegitimateInterestIds, k = _.publisherFeaturesIds, w = _.publisherSpecialFeaturesIds, S = _.publisherSpecialPurposesIds, L = _.consentScope, P = t.coreConfig.publisherName || t.coreConfig.cookieDomain || '', T = { + id: P, + name: P, + specialPurposes: S, + features: k, + flexiblePurposes: [], + legIntPurposes: C, + specialFeatures: w, + purposes: E + }, q = p; + (T.purposes || T.legIntPurposes) && ([ + 'service', + 'service group' + ].includes(L || '') ? q = b(y({}, P, T), p) : console.warn('You can\'t use publisher legal basis on '.concat(L, ' consent scope.'))); + var A = this.filterVendors(q, t), I = A.vendors, O = A.legitimateVendors, N = this.filterStacksAndSpecial(x || [], r, s).stacks, R = this.filterPurposes(l, t), U = R.purposes, D = R.legitimatePurposes, B = this.filterStacksAndSpecial(v, i, c).features, j = this.filterStacksAndSpecial(h, o, f).specialFeatures, F = this.filterStacksAndSpecial(g, a, d).specialPurposes; + this._data = { + stacks: N, + vendors: I, + features: B, + purposes: U, + specialFeatures: j, + specialPurposes: F, + legitimateVendors: O, + legitimatePurposes: D, + unfilteredFeatures: c, + unfilteredPurposes: l, + unfilteredSpecialFeatures: f, + unfilteredSpecialPurposes: d + }; + } + } + return d(e, [ + { + key: 'filterVendors', + value: function (e, n) { + var t = nr(n), r = t.purposeIds, o = t.purposeLegitimateInterestIds, a = qt.VENDORS, i = qt.LEGITIMATE_VENDORS, s = {}, c = n.coreConfig.publisherConsentRestrictionIds || [], l = n.coreConfig.publisherLIRestrictionIds || []; + s[a] = {}, s[i] = {}; + var u = function (n) { + var t = e[n], u = t.legIntPurposes, p = t.purposes, d = t.flexiblePurposes, f = t.specialPurposes, m = t.id, h = !p.length && !u.length && f.length > 0; + u.length > 0 && (u.some(function (e) { + return r.includes(e); + }) || u.some(function (e) { + return o.includes(e); + })) && (s[i][n] = t), (p.length > 0 && (p.some(function (e) { + return r.includes(e); + }) || p.some(function (e) { + return o.includes(e); + })) || h) && (s[a][n] = t, s[a][n].isSpecialPurposesOnly = h), d.forEach(function (e) { + var n = new ma.PurposeRestriction(); + n.purposeId = e, c.includes(e) && u.includes(e) && (n.restrictionType = fa.RestrictionType.REQUIRE_CONSENT), l.includes(e) && p.includes(e) && (n.restrictionType = fa.RestrictionType.REQUIRE_LI), void 0 !== n.restrictionType && window.__tcfapi('setPublisherRestriction', 2, function () { + return cr('Setting publisher restriction '.concat(n.restrictionType, ' - Vendor: ').concat(m, ' Purpose: ').concat(e)); + }, { + id: m, + purposeRestriction: n + }); + }); + }; + for (var p in e) + u(p); + return cr('Regular vendors loaded: '.concat(Object.keys(s[a]).length)), cr('Legitimate vendors loaded: '.concat(Object.keys(s[i]).length)), s[a] = JSON.parse(JSON.stringify(s[a])), s[i] = JSON.parse(JSON.stringify(s[i])), s; + } + }, + { + key: 'filterPurposes', + value: function (e, n) { + var t = n.coreConfig.consentScope, r = nr(n), o = r.purposeIds, a = r.purposeLegitimateInterestIds, i = qt.PURPOSES, s = qt.LEGITIMATE_PURPOSES, c = {}; + return c[i] = {}, c[s] = {}, o.forEach(function (n) { + c[i][n] = b({}, e[n]); + }), a.forEach(function (n) { + 1 !== n && (c[s][n] = b({}, e[n])); + }), !c[i][1] && (t || '').includes('global') && (c[i][1] = b({}, e[1])), c; + } + }, + { + key: 'filterStacksAndSpecial', + value: function (e, n, t) { + var r = {}; + return r[n] = {}, e.length && e.forEach(function (e) { + r[n][e] = t[e]; + }), r; + } + }, + { + key: 'updateStatus', + value: function (e, n, t) { + this._data[n][e].status = t; + } + }, + { + key: 'data', + get: function () { + return this._data; + }, + set: function (e) { + this._data = e; + } + } + ]), e; + }(), ga = function () { + function e() { + u(this, e), this._cmpInfo = void 0, this._nonIabConsents = void 0, this._vendorConsents = void 0, this._vendorLegitimateInterest = void 0, this._purposesConsents = void 0, this._legitimatePurposesConsents = void 0, this._stacksConsents = void 0, this._specialPurposesConsents = void 0, this._specialFeaturesConsents = void 0, this._googleConsents = void 0, this._repromptData = void 0, this.sessionId = void 0, this.allConsents = void 0, this.consentPage = void 0, this.displayType = void 0, this._nonIabVendorsInitialized = !1, this._googleVendorsInitialized = !1, this._GVLVendorsDataInitialized = !1, this._nonIabConsents = {}, this._vendorConsents = {}, this._purposesConsents = {}, this._legitimatePurposesConsents = { + 1: !0, + 2: !0, + 3: !0, + 4: !0, + 5: !0, + 6: !0, + 7: !0, + 8: !0, + 9: !0, + 10: !0 + }, this._stacksConsents = {}, this._specialPurposesConsents = {}, this._vendorLegitimateInterest = {}, this._specialFeaturesConsents = {}, this._googleConsents = {}, this.consentGroupHandler = this.consentGroupHandler.bind(this), this.handleSetConsentInfoCallback = this.handleSetConsentInfoCallback.bind(this), this.setAllConsentsToByPage = this.setAllConsentsToByPage.bind(this), this.allConsents = !0, this.sessionId = '', this.displayType = kt.CHANGE_OF_CONSENT, this._cmpInfo = new ha(ca, sa); + } + return d(e, [ + { + key: 'getCoreConfig', + value: function () { + return sa.coreConfig; + } + }, + { + key: 'getPremiumUiLabels', + value: function () { + return sa.premiumUiLabels; + } + }, + { + key: 'getCoreUiLabels', + value: function () { + return sa.coreUiLabels; + } + }, + { + key: 'getDisplayType', + value: function () { + return this.displayType; + } + }, + { + key: 'getNonIabData', + value: function () { + var e = wt.NON_IAB, n = !1; + return n = 'object' === typeof sa.nonIabVendorsInfo ? Object.keys(sa.nonIabVendorsInfo).length > 0 : !!sa.premiumProperties.nonIabVendorListUrl, this.populateConsents(!this._nonIabVendorsInitialized, e, ua, la), this._nonIabVendorsInitialized || (this._nonIabVendorsInitialized = !0), { + isEnabled: n, + vendors: ua + }; + } + }, + { + key: 'getGoogleVendors', + value: function () { + var e = wt.GOOGLE; + return this.populateConsents(!this._googleVendorsInitialized, e, pa, la), this._googleVendorsInitialized || (this._googleVendorsInitialized = !0), { + isEnabled: sa.coreConfig.googleEnabled, + data: pa + }; + } + }, + { + key: 'getGVLVendorsData', + value: function () { + var e = wt.VENDORS, n = wt.LEGITIMATE_VENDORS, t = wt.LEGITIMATE_PURPOSES, r = wt.PURPOSES, o = wt.SPECIAL_FEATURES, a = wt.STACKS, i = !this._GVLVendorsDataInitialized; + return this.populateConsents(i, e, this._cmpInfo.data.vendors, la), this.populateConsents(i, r, this._cmpInfo.data.purposes, la), this.populateConsents(i, o, this._cmpInfo.data.specialFeatures, la), this.populateConsents(i, n, this._cmpInfo.data.legitimateVendors, la), this.populateConsents(i, t, this._cmpInfo.data.legitimatePurposes, la), this.populateConsents(!0, a, this._cmpInfo.data.stacks, la), this.populateStacksLabels(this._cmpInfo.data.stacks), this._GVLVendorsDataInitialized = !0, this._cmpInfo.data; + } + }, + { + key: 'populateStacksLabels', + value: function (e) { + var n = this, t = sa.coreUiLabels, r = t.onLabel, o = t.offLabel, a = t.multiLabel; + for (var i in e) { + var s = e[i], c = s.purposes.reduce(function (e, t) { + return e || n._purposesConsents[t]; + }, !1), l = !!s.specialFeatures && s.specialFeatures.reduce(function (e, t) { + return e || n._specialFeaturesConsents[t]; + }, !1), u = void 0; + u = this._stacksConsents[i] ? r : c || l ? a : o, s.stateLabel = u; + } + } + }, + { + key: 'setAllConsentsTo', + value: function (e) { + var n, t = this.getConsentsToIterate(), r = t.objectsToIterate, o = t.GVLObjectsToIterate, a = l(r); + try { + for (a.s(); !(n = a.n()).done;) { + var i = n.value; + for (var s in i) + i[s] = e; + } + } catch (c) { + a.e(c); + } finally { + a.f(); + } + o.forEach(function (n) { + for (var t in n) + n[t].status = e; + }), Object.keys(this._cmpInfo.data.stacks).length && (this.updateStacksConsent(), this.populateStacksLabels(this._cmpInfo.data.stacks)); + } + }, + { + key: 'setAllConsentsToByPage', + value: function (e, n) { + var t, r, o, a = Ct.ACCEPT_ALL_PURPOSES, i = Ct.REJECT_ALL_PURPOSES, s = Ct.ACCEPT_ALL_VENDORS, c = Ct.REJECT_ALL_VENDORS, l = Ct.ACCEPT_ALL_LEGITIMATE, u = Ct.OBJECT_ALL_LEGITIMATE, p = this.getConsentsToIterate(n), d = p.objectsToIterate, f = p.GVLObjectsToIterate; + switch (n) { + case 1: + t = a, r = i, o = 'allPurposes-'.concat(e); + break; + case 2: + t = s, r = c, o = 'allVendors-'.concat(e); + break; + case 3: + t = l, r = u, o = 'allLegitimates-'.concat(e); + } + this.eventTracker(e ? t : r, 'click'), d.forEach(function (n) { + for (var t in n) + n[t] = e; + }), f.forEach(function (n) { + for (var t in n) + n[t].status = e; + }), Ea && Ea({ + type: 'TOGGLE_CHANGE', + payload: o + }); + } + }, + { + key: 'consentGroupHandler', + value: function () { + var e = sn(on.a.mark(function e(n, t) { + var r, o, a; + return on.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + for (a in (this.allConsents = t, this.consentPage = n, void 0 !== t && this.setAllConsentsTo(t), r = { + vendorConsents: this.vendorConsents, + purposesConsents: this.purposesConsents, + specialFeatures: this.specialFeaturesConsents, + vendorLegitimateInterest: this.vendorLegitimateInterest, + legitimatePurposesConsents: this.legitimatePurposesConsents, + nonIabConsents: this.nonIabConsents, + googleConsents: this._googleConsents, + consentScreen: this.consentPage, + allConsents: this.allConsents + }, o = this._cmpInfo.data.vendors)) + o[a].isSpecialPurposesOnly && (delete r.vendorConsents[a], r.vendorLegitimateInterest[a] = !0); + window.__tcfapi('setConsentInfo', 2, this.handleSetConsentInfoCallback, r), this.toggleDisplayUi(); + case 8: + case 'end': + return e.stop(); + } + }, e, this); + })); + return function (n, t) { + return e.apply(this, arguments); + }; + }() + }, + { + key: 'toggleDisplayUi', + value: function (e) { + Ea && Ea({ + type: 'TOGGLE_DISPLAY', + payload: e || { regulation: 'GDPR' } + }); + } + }, + { + key: 'notifyUiClosed', + value: function (e) { + window.__tcfapi('notifyUiState', 2, function () { + }, { + regulation: e, + visible: !1 + }); + } + }, + { + key: 'getConsentsToIterate', + value: function () { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, n = [], t = []; + return 3 === e ? (n.push.apply(n, [ + this._legitimatePurposesConsents, + this._vendorLegitimateInterest + ]), t.push.apply(t, [ + this._cmpInfo.data.legitimateVendors, + this._cmpInfo.data.legitimatePurposes + ])) : (n.push.apply(n, [ + this._purposesConsents, + this._stacksConsents, + this._specialFeaturesConsents, + this._vendorConsents, + this._nonIabConsents, + this._googleConsents + ]), t.push.apply(t, [ + this._cmpInfo.data.purposes, + this._cmpInfo.data.specialFeatures, + this._cmpInfo.data.vendors + ]), this._nonIabVendorsInitialized && ua && ua.length && t.push(ua), this._googleVendorsInitialized && pa && pa.length && t.push(pa)), { + objectsToIterate: n, + GVLObjectsToIterate: t + }; + } + }, + { + key: 'isManuallyRejected', + value: function () { + var e = this.getConsentsToIterate(), n = e.objectsToIterate, t = e.GVLObjectsToIterate, r = n.every(function (e) { + return Object.values(e).every(function (e) { + return !1 === e; + }); + }), o = t.every(function (e) { + return Object.values(e).every(function (e) { + return !1 === e.status; + }); + }); + return r && o; + } + }, + { + key: 'handleSetConsentInfoCallback', + value: function (e) { + var n = Ct.ACCEPT_ALL, t = Ct.SAVE_AND_EXIT, r = Ct.REJECT_ALL, o = Ot.ACCEPT; + this._repromptData = e, this.eventTracker(void 0 !== this.allConsents ? this.allConsents ? n : r : t, 'click'), aa.sendDoneLog(this.allConsents, e.euconsent, e.nonIabVendorConsent), o = void 0 !== this.allConsents ? this.allConsents ? Ot.ACCEPT : Ot.REJECT : this.isManuallyRejected() ? Ot.REJECT : Ot.ACCEPT, tr(sa.coreConfig.isAMP, { + type: At.CONSENT_RESPONSE, + action: o, + info: e.euconsent, + consentMetadata: { + additionalConsent: e.googleCookieValue, + consentStringType: It.GDPR + } + }); + } + }, + { + key: 'populateConsents', + value: function (e, n, t, r) { + var o, a = wt.NON_IAB, i = wt.PURPOSES, s = wt.LEGITIMATE_PURPOSES, c = wt.LEGITIMATE_VENDORS, u = wt.VENDORS, p = wt.SPECIAL_FEATURES, d = wt.STACKS, f = wt.GOOGLE, m = ''; + switch (n) { + case a: + o = '_nonIabConsents', m = 'nonIabConsents'; + break; + case u: + o = '_vendorConsents', m = 'vendorConsents'; + break; + case i: + o = '_purposesConsents', m = 'purposesConsents'; + break; + case s: + o = '_legitimatePurposesConsents', m = 'legitimatePurposesConsents'; + break; + case c: + o = '_vendorLegitimateInterest', m = 'vendorLegitimateInterest'; + break; + case p: + o = '_specialFeaturesConsents', m = 'specialFeatures'; + break; + case d: + o = '_stacksConsents', m = 'purposesConsents'; + break; + case f: + o = '_googleConsents', m = 'googleConsents'; + break; + default: + o = ''; + } + var h = r[m].hasCookie, g = n === s || n === c || 'on' === sa.coreConfig.defaultToggleValue, y = !h || n === d; + if (n === a) { + if (t) { + var v, b = l(t); + try { + for (b.s(); !(v = b.n()).done;) { + var _ = v.value; + if (e) { + var x = y ? g : r[m][_.id]; + this[o][_.id] = Boolean(x), _.status = Boolean(x); + } else + _.status = this[o][_.id]; + } + } catch (T) { + b.e(T); + } finally { + b.f(); + } + } + } else if (n === f) { + if (t) { + var E, C = l(t); + try { + for (C.s(); !(E = C.n()).done;) { + var k = E.value, w = parseInt(k.id, 10); + if (e) { + var S = y ? g : r[m][w]; + this[o][w] = S, k.status = S; + } else + k.status = this[o][w]; + } + } catch (T) { + C.e(T); + } finally { + C.f(); + } + } + } else { + for (var L in t) + if (e) { + var P = y ? g : r[m][L]; + this[o][L] = P, t[L].status = P; + } else + t[L].status = this[o][L]; + n === d && h && this.updateStacksConsent(); + } + } + }, + { + key: 'handleConsent', + value: function (e, n) { + var t, r, o, a, i = Ct.VENDOR, s = Ct.PURPOSE, c = Ct.LEGITIMATE_PURPOSE, l = Ct.NON_IAB_VENDOR, u = Ct.SPECIAL_FEATURE, p = Ct.STACK, d = Ct.LEGITIMATE_VENDOR, f = Ct.GOOGLE, m = !1; + switch (n) { + case wt.NON_IAB: + t = '_nonIabConsents', a = ua, r = ''.concat(l, '_').concat(e); + break; + case wt.VENDORS: + t = '_vendorConsents', o = 'vendors', r = ''.concat(i, '_').concat(e); + break; + case wt.PURPOSES: + t = '_purposesConsents', o = 'purposes', r = ''.concat(s, '_').concat(e), m = !0; + break; + case wt.LEGITIMATE_PURPOSES: + t = '_legitimatePurposesConsents', o = 'legitimatePurposes', r = ''.concat(c, '_').concat(e); + break; + case wt.LEGITIMATE_VENDORS: + t = '_vendorLegitimateInterest', o = 'legitimateVendors', r = ''.concat(d, '_').concat(e); + break; + case wt.SPECIAL_FEATURES: + t = '_specialFeaturesConsents', o = 'specialFeatures', r = ''.concat(u, '_').concat(e), m = !0; + break; + case wt.SPECIAL_PURPOSES: + t = '_specialPurposesConsents', o = 'specialPurposes', r = ''.concat(u, '_').concat(e); + break; + case wt.STACKS: + t = '_stacksConsents', o = 'stacks', r = ''.concat(p, '_').concat(e), m = !0, this.handleStackConsent(e); + break; + case wt.GOOGLE: + t = '_googleConsents', a = pa, r = ''.concat(f, '_').concat(e); + break; + default: + t = ''; + } + if (this[t]) { + var h = !this[t][e]; + if (a) + g(a.filter(function (n) { + return n.id === e; + }), 1)[0].status = h; + else + this._cmpInfo.updateStatus(e, o, h); + this[t][e] = h, this.eventTracker(r, this[t][e]); + } + Object.keys(this._cmpInfo.data.stacks).length && m && this.populateStacksLabels(this._cmpInfo.data.stacks); + } + }, + { + key: 'linkVendorsToPurposes', + value: function () { + var e = this, n = ca.vendors, t = Object.keys(this._purposesConsents).filter(function (n) { + return !0 === e._purposesConsents[n]; + }), r = function (r) { + t.forEach(function (t) { + n[r].purposes.includes(parseInt(t, 10)) && (e._vendorConsents[r] = !0); + }); + }; + for (var o in n) + this._vendorConsents[o] = !1, t.length && r(o); + } + }, + { + key: 'linkPurposesToVendors', + value: function () { + var e = this, n = ca.vendors, t = Object.keys(this._vendorConsents).filter(function (n) { + return !0 === e._vendorConsents[n]; + }), r = Object.keys(this._purposesConsents).filter(function (n) { + return !0 === e._purposesConsents[n]; + }); + t.length ? r.length || t.forEach(function (t) { + n[t].purposes.forEach(function (r) { + n[t].purposes.includes(r) && (e._purposesConsents[r] = !0); + }); + }) : function () { + for (var n in e._purposesConsents) + e._purposesConsents[n] = !1; + }(); + } + }, + { + key: 'linkConsents', + value: function (e) { + switch (e) { + case '_purposesConsents': + case '_stacksConsents': + this.linkVendorsToPurposes(); + break; + case '_vendorConsents': + this.linkPurposesToVendors(); + } + } + }, + { + key: 'handleStackConsent', + value: function (e) { + var n, t = ca.stacks[e], r = !this._stacksConsents[e], o = l(t.purposes); + try { + for (o.s(); !(n = o.n()).done;) { + var a = n.value; + this._purposesConsents[a] = r, this._cmpInfo.updateStatus(a, 'purposes', r); + } + } catch (u) { + o.e(u); + } finally { + o.f(); + } + if (t.specialFeatures) { + var i, s = l(t.specialFeatures); + try { + for (s.s(); !(i = s.n()).done;) { + var c = i.value; + this._specialFeaturesConsents[c] = r, this._cmpInfo.updateStatus(c, 'specialFeatures', r); + } + } catch (u) { + s.e(u); + } finally { + s.f(); + } + } + } + }, + { + key: 'updateStacksConsent', + value: function () { + var e = this; + for (var n in this._cmpInfo.data.stacks) { + var t = this._cmpInfo.data.stacks[n], r = t.purposes.reduce(function (n, t) { + return n && e._purposesConsents[t]; + }, !0), o = !t.specialFeaturesConsents || t.specialFeatures.reduce(function (n, t) { + return n && e._specialFeaturesConsents[t]; + }, !0); + t.status = r && o, this._stacksConsents[n] = t.status; + } + } + }, + { + key: 'formatConsents', + value: function (e) { + var n = 0; + return { + consentArray: Object.keys(e).map(function (t) { + var r = parseInt(t); + return n = r, { + consent: e[r], + id: +t + }; + }), + maxVendorId: n + }; + } + }, + { + key: 'displayConsentUi', + value: function (e) { + var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1, t = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; + 'GDPR' === e ? (this.displayType = t ? kt.MANDATORY : kt.CHANGE_OF_CONSENT, Ea && Ea({ + type: 'PAGE_CHANGE', + payload: { + page: n, + onInit: !0 + } + })) : 'USP' === e && (this.displayType = kt.CCPA, n = 1), this.toggleDisplayUi({ + regulation: e, + isMandatory: t + }), this.generateSessionId(e), this.eventTracker(Ct.START_ON_PAGE, ''.concat(e, '_').concat(n)), aa.sendInitLog(); + } + }, + { + key: 'generateSessionId', + value: function (e) { + var n = window.navigator.userAgent.indexOf('Trident/'), t = new Int32Array(4), r = ''.concat(e, '-'); + try { + t = (-1 !== n ? msCrypto : crypto).getRandomValues(t); + for (var o = 0; o < 4; o++) + r += t[o].toString(36).substring(1, 6); + } catch (a) { + } + this.sessionId = r; + } + }, + { + key: 'getSessionId', + value: function () { + return this.sessionId; + } + }, + { + key: 'eventTracker', + value: function (e, n) { + aa.pushEvent(e, n); + } + }, + { + key: 'nonIabConsents', + get: function () { + return this._nonIabConsents; + }, + set: function (e) { + this._nonIabConsents = e; + } + }, + { + key: 'vendorConsents', + get: function () { + return this._vendorConsents; + }, + set: function (e) { + this._vendorConsents = e; + } + }, + { + key: 'purposesConsents', + get: function () { + return this._purposesConsents; + }, + set: function (e) { + this._purposesConsents = e; + } + }, + { + key: 'legitimatePurposesConsents', + get: function () { + return this._legitimatePurposesConsents; + }, + set: function (e) { + this._legitimatePurposesConsents = e; + } + }, + { + key: 'vendorLegitimateInterest', + get: function () { + return this._vendorLegitimateInterest; + }, + set: function (e) { + this._vendorLegitimateInterest = e; + } + }, + { + key: 'stacksConsents', + get: function () { + return this._stacksConsents; + }, + set: function (e) { + this._stacksConsents = e; + } + }, + { + key: 'specialFeaturesConsents', + get: function () { + return this._specialFeaturesConsents; + }, + set: function (e) { + this._specialFeaturesConsents = e; + } + }, + { + key: 'GVLVendorsDataInitialized', + get: function () { + return this._GVLVendorsDataInitialized; + } + }, + { + key: 'cmpInfo', + get: function () { + return this._cmpInfo; + }, + set: function (e) { + this._cmpInfo = e; + } + } + ], [{ + key: 'initLabels', + value: function () { + var e = sn(on.a.mark(function e() { + var n, r, o, a; + return on.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + n = sa.getCustomCoreUiLabels(), r = sa.getCustomPremiumUiLabels(), o = t(46), (a = sa.coreConfig.privacyMode) && a.includes('GDPR') && (sa.coreUiLabels = b(b({}, o.coreUiLabels), n)), sa.premiumUiLabels = b(b({}, o.premiumUiLabels), r); + case 6: + case 'end': + return e.stop(); + } + }, e); + })); + return function () { + return e.apply(this, arguments); + }; + }() + }]), e; + }(), ya = Fr.a.create({ xsrfCookieName: null }), va = function () { + function e() { + u(this, e), this.userEvents = void 0, this.userEvents = []; + } + return d(e, [ + { + key: 'pushEvent', + value: function (e, n) { + cr(JSON.stringify({ + identifier: e, + value: n + })), this.userEvents.push({ + clientTimestamp: new Date().getTime(), + event: ''.concat(e, ':').concat(n) + }); + } + }, + { + key: 'resolveAcceptanceState', + value: function (e) { + var n = Pt.ACCEPT_ALL, t = Pt.ACCEPT_PARTIAL, r = Pt.REJECT, o = Tt.ALL_OBJECTED, a = Tt.NONE_OBJECTED, i = 'legitimate' === e, s = i ? [ + Object.values(oa.legitimatePurposesConsents), + Object.values(oa.vendorLegitimateInterest) + ].flat() : [ + Object.values(oa.purposesConsents), + Object.values(oa.specialFeaturesConsents), + Object.values(oa.vendorConsents), + Object.values(oa.nonIabConsents) + ].flat(); + return s.every(function (e) { + return !0 === e; + }) ? i ? a : n : s.every(function (e) { + return !1 === e; + }) ? i ? o : r : t; + } + }, + { + key: 'sendInitLog', + value: function () { + var e = sa.coreConfig, n = e.quantcastAccountId, t = e.publisherName, r = e.hashCode, o = { + accountId: n, + domain: window.location !== window.parent.location && document.referrer ? function (e) { + if (!e) + return ''; + return e.replace(/(^https?:\/\/)|(\/.*$)/g, ''); + }(document.referrer) : window.location.host, + publisher: t, + cmpId: 10, + cmpVersion: '2.'.concat(h), + displayType: oa.getDisplayType(), + configurationHashCode: r + }; + this.log(Lt.INIT, o); + } + }, + { + key: 'sendNavigationLog', + value: function () { + var e = { userEvents: this.userEvents }; + this.userEvents = [], this.log(Lt.NAVIGATION, e); + } + }, + { + key: 'sendDoneLog', + value: function (e, n, t, r) { + var o = e ? Pt.ACCEPT_ALL : this.resolveAcceptanceState(), a = e ? Tt.NONE_OBJECTED : this.resolveAcceptanceState('legitimate'), i = { + userEvents: this.userEvents, + acceptanceState: o, + objectionState: a, + tcData: n, + nonIabConsentData: t, + uspData: r + }; + this.userEvents = [], this.log(Lt.DONE, i); + } + }, + { + key: 'sendDoneLogUsp', + value: function (e, n) { + var t = { + userEvents: this.userEvents, + acceptanceState: e, + uspData: n + }; + this.userEvents = [], this.log(Lt.DONE, t); + } + }, + { + key: 'log', + value: function (e, n) { + n = b(b({}, n), {}, { + clientTimestamp: new Date().getTime(), + operationType: e, + sessionId: oa.getSessionId() + }); + var t = encodeURIComponent(JSON.stringify(n)); + ya.get(''.concat('https://audit-tcfv2.quantcast.mgr.consensu.org', '/?log=').concat(t)).catch(function (e) { + return console.error(e); + }), cr(''.concat(e, ' sent')); + } + } + ]), e; + }(), ba = function (e) { + sa = e.config, ca = e.gvl, la = e.consentInfo, ua = e.nonIabVendorList, pa = e.googleData; + var n = e.regulation, t = e.page, r = function () { + var e = sn(on.a.mark(function e() { + return on.a.wrap(function (e) { + for (;;) + switch (e.prev = e.next) { + case 0: + return e.next = 2, ga.initLabels(); + case 2: + return e.next = 4, new ga(); + case 4: + oa = e.sent; + case 5: + case 'end': + return e.stop(); + } + }, e); + })); + return function () { + return e.apply(this, arguments); + }; + }(); + aa = new va(), ia = new zt(); + var o = function () { + var e = 'qc-cmp2-container'; + return er('div', e, e, document.body); + }(), a = 'qc-cmp2-main', i = er('div', a, a, o); + r().then(function () { + tn.render(tn.createElement(ka, null, tn.createElement(da, { + ui: oa, + mode: n + })), i), oa.displayConsentUi(n, t, e.isMandatory); + }); + }, _a = { + displayGDPR: !1, + displayUSP: !1, + pageChanged: !1, + pageGDPR: 1, + disableAcceptButton: !1, + changed: '' + }, xa = function (e, n) { + switch (n.type) { + case 'TOGGLE_DISPLAY': + var t = n.payload, r = t.regulation, o = t.isMandatory, a = !1, i = !1, s = !1; + switch (r) { + case 'USP': + i && (i = !1), a = !e.displayUSP; + break; + case 'GDPR': + a && (a = !1), s = !!o && !e.pageChanged, i = !e.displayGDPR; + break; + default: + return e; + } + return b(b({}, e), {}, { + displayGDPR: i, + displayUSP: a, + disableAcceptButton: s + }); + case 'TOGGLE_CHANGE': + var c = n.payload; + return b(b({}, e), {}, { changed: c }); + case 'PAGE_CHANGE': + var l = n.payload.page, u = 1 !== l || l !== e.pageGDPR; + return n.payload.onInit || (oa.eventTracker(Ct.GO_TO_PAGE, l), aa.sendNavigationLog()), b(b({}, e), {}, { + pageGDPR: l, + pageChanged: u, + disableAcceptButton: !u + }); + default: + return e; + } + }, Ea = function (e) { + }, Ca = ne([ + {}, + function () { + return null; + } + ]), ka = function (e) { + var n = e.children, t = g(me(xa, _a), 2), r = t[0], o = t[1]; + return Ea = o, tn.createElement(Ca.Provider, { + value: [ + r, + o + ] + }, n); + }, wa = new (function () { + function e() { + var n = this; + u(this, e), this.__tcfapiui = void 0, this.goToPage = function (e) { + m.includes(e) ? Ea && Ea({ + type: 'PAGE_CHANGE', + payload: { + page: e, + onInit: !1 + } + }) : console.warn(''.concat(e, ' is not a supported page')); + }, this.initApiUi = function () { + var e = n.__tcfapiui, t = [], r = window; + r.__tcfapiui && r.__tcfapiui.a && (t = r.__tcfapiui.a), Object.assign(window, { __tcfapiui: e }); + var u, p, d = l(t); + try { + for (d.s(); !(u = d.n()).done;) { + var f = u.value, m = s(p = f) || o(p) || a(p) || c(), h = m[0], g = m.slice(1); + n[h].apply(n, i(g)); + } + } catch (y) { + d.e(y); + } finally { + d.f(); + } + }, this.__tcfapiui = function (e) { + try { + for (var t = arguments.length, r = new Array(t > 1 ? t - 1 : 0), o = 1; o < t; o++) + r[o - 1] = arguments[o]; + n[e].apply(n, r); + } catch (a) { + console.error('The function '.concat(e, ' is not defined')); + } + }; + } + return d(e, [{ + key: 'displayUi', + value: function (e) { + ba(e); + } + }]), e; + }())(); + wa.initApiUi(); + } + ]); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-connatix.player.js b/resources/sugarcoat-connatix.player.js new file mode 100644 index 00000000..57c95f48 --- /dev/null +++ b/resources/sugarcoat-connatix.player.js @@ -0,0 +1,36440 @@ +{ + const $___mock_81ba332f770640cb = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_81ba332f770640cb); + (function () { + !function (t) { + var i = {}; + function e(s) { + if (i[s]) + return i[s].exports; + var n = i[s] = { + i: s, + l: !1, + exports: {} + }; + return t[s].call(n.exports, n, n.exports, e), n.l = !0, n.exports; + } + e.m = t, e.c = i, e.d = function (t, i, s) { + e.o(t, i) || Object.defineProperty(t, i, { + enumerable: !0, + get: s + }); + }, e.r = function (t) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(t, '_', { value: !0 }); + }, e.t = function (t, i) { + if (1 & i && (t = e(t)), 8 & i) + return t; + if (4 & i && 'object' == typeof t && t && t._) + return t; + var s = Object.create(null); + if (e.r(s), Object.defineProperty(s, 'default', { + enumerable: !0, + value: t + }), 2 & i && 'string' != typeof t) + for (var n in t) + e.d(s, n, function (i) { + return t[i]; + }.bind(null, n)); + return s; + }, e.n = function (t) { + var i = t && t._ ? function () { + return t.default; + } : function () { + return t; + }; + return e.d(i, 'a', i), i; + }, e.o = function (t, i) { + return Object.prototype.hasOwnProperty.call(t, i); + }, e.p = '', e(e.s = 156); + }([ + function (t, i, e) { + 'use strict'; + var s, n, r = e(60), h = r.Reader, a = r.Writer, o = r.util, c = r.roots.default || (r.roots.default = {}); + c.ProtoAdBreak = function () { + function t(t) { + if (this.types = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.types = o.emptyArray, t.prototype.maxAdPodDuration = 0, t.prototype.maxAdSlotDuration = 180, t.prototype.numberOfAdSlots = 1, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoAdBreak(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + if (s.types && s.types.length || (s.types = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.types.push(t.int32()); + else + s.types.push(t.int32()); + break; + case 2: + s.maxAdPodDuration = t.int32(); + break; + case 3: + s.maxAdSlotDuration = t.int32(); + break; + case 4: + s.numberOfAdSlots = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.types = []), i.defaults && (e.maxAdPodDuration = 0, e.maxAdSlotDuration = 180, e.numberOfAdSlots = 1), t.types && t.types.length) { + e.types = []; + for (var s = 0; s < t.types.length; ++s) + e.types[s] = i.enums === String ? c.ProtoAdBreakTypeEnum[t.types[s]] : t.types[s]; + } + return null != t.maxAdPodDuration && t.hasOwnProperty('maxAdPodDuration') && (e.maxAdPodDuration = t.maxAdPodDuration), null != t.maxAdSlotDuration && t.hasOwnProperty('maxAdSlotDuration') && (e.maxAdSlotDuration = t.maxAdSlotDuration), null != t.numberOfAdSlots && t.hasOwnProperty('numberOfAdSlots') && (e.numberOfAdSlots = t.numberOfAdSlots), e; + }, t; + }(), c.ProtoAdDomainBlockingResponse = function () { + function t(t) { + if (this.domains = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.domains = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoAdDomainBlockingResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.domains && s.domains.length || (s.domains = []), s.domains.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.domains = []), t.domains && t.domains.length) { + e.domains = []; + for (var s = 0; s < t.domains.length; ++s) + e.domains[s] = t.domains[s]; + } + return e; + }, t; + }(), c.ProtoCoreTamBidRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.lineItemId = '', t.prototype.code = '', t.prototype.metadata = null, t.prototype.exploration = !1, t.encode = function (t, i) { + return i || (i = a.create()), null != t.lineItemId && Object.hasOwnProperty.call(t, 'lineItemId') && i.uint32(10).string(t.lineItemId), null != t.code && Object.hasOwnProperty.call(t, 'code') && i.uint32(18).string(t.code), null != t.metadata && Object.hasOwnProperty.call(t, 'metadata') && c.MetadataModel.encode(t.metadata, i.uint32(26).fork()).ldelim(), null != t.exploration && Object.hasOwnProperty.call(t, 'exploration') && i.uint32(32).bool(t.exploration), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoCoreTamBidRequest) + return t; + var i = new c.ProtoCoreTamBidRequest(); + if (null != t.lineItemId && (i.lineItemId = String(t.lineItemId)), null != t.code && (i.code = String(t.code)), null != t.metadata) { + if ('object' != typeof t.metadata) + throw TypeError('.ProtoCoreTamBidRequest.metadata: object expected'); + i.metadata = c.MetadataModel.fromObject(t.metadata); + } + return null != t.exploration && (i.exploration = Boolean(t.exploration)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.MetadataModel = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.version = 0, t.prototype.sessionId = '', t.prototype.playerId = '', t.prototype.userId = '', t.prototype.browser = null, t.prototype.geo = null, t.prototype.clientAb0 = 0, t.prototype.clientAb1 = 0, t.prototype.serverAb0 = 0, t.prototype.serverAb1 = 0, t.prototype.pageUrl = '', t.prototype.bundleId = '', t.prototype.implementationType = 0, t.prototype.trackAllRequests = !1, t.prototype.customParam1 = '', t.prototype.customParam2 = '', t.prototype.customParam3 = '', t.prototype.abTestId = '', t.prototype.pageInFocus = !1, t.prototype.customParam4 = '', t.prototype.customParam5 = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.version && Object.hasOwnProperty.call(t, 'version') && i.uint32(8).int32(t.version), null != t.sessionId && Object.hasOwnProperty.call(t, 'sessionId') && i.uint32(18).string(t.sessionId), null != t.playerId && Object.hasOwnProperty.call(t, 'playerId') && i.uint32(26).string(t.playerId), null != t.userId && Object.hasOwnProperty.call(t, 'userId') && i.uint32(34).string(t.userId), null != t.browser && Object.hasOwnProperty.call(t, 'browser') && c.Browser.encode(t.browser, i.uint32(42).fork()).ldelim(), null != t.geo && Object.hasOwnProperty.call(t, 'geo') && c.GeoLocation.encode(t.geo, i.uint32(50).fork()).ldelim(), null != t.clientAb0 && Object.hasOwnProperty.call(t, 'clientAb0') && i.uint32(56).int32(t.clientAb0), null != t.clientAb1 && Object.hasOwnProperty.call(t, 'clientAb1') && i.uint32(64).int32(t.clientAb1), null != t.serverAb0 && Object.hasOwnProperty.call(t, 'serverAb0') && i.uint32(72).int32(t.serverAb0), null != t.serverAb1 && Object.hasOwnProperty.call(t, 'serverAb1') && i.uint32(80).int32(t.serverAb1), null != t.pageUrl && Object.hasOwnProperty.call(t, 'pageUrl') && i.uint32(122).string(t.pageUrl), null != t.bundleId && Object.hasOwnProperty.call(t, 'bundleId') && i.uint32(138).string(t.bundleId), null != t.implementationType && Object.hasOwnProperty.call(t, 'implementationType') && i.uint32(144).int32(t.implementationType), null != t.trackAllRequests && Object.hasOwnProperty.call(t, 'trackAllRequests') && i.uint32(152).bool(t.trackAllRequests), null != t.customParam1 && Object.hasOwnProperty.call(t, 'customParam1') && i.uint32(162).string(t.customParam1), null != t.customParam2 && Object.hasOwnProperty.call(t, 'customParam2') && i.uint32(170).string(t.customParam2), null != t.customParam3 && Object.hasOwnProperty.call(t, 'customParam3') && i.uint32(178).string(t.customParam3), null != t.abTestId && Object.hasOwnProperty.call(t, 'abTestId') && i.uint32(194).string(t.abTestId), null != t.pageInFocus && Object.hasOwnProperty.call(t, 'pageInFocus') && i.uint32(200).bool(t.pageInFocus), null != t.customParam4 && Object.hasOwnProperty.call(t, 'customParam4') && i.uint32(210).string(t.customParam4), null != t.customParam5 && Object.hasOwnProperty.call(t, 'customParam5') && i.uint32(218).string(t.customParam5), i; + }, t.fromObject = function (t) { + if (t instanceof c.MetadataModel) + return t; + var i = new c.MetadataModel(); + if (null != t.version && (i.version = 0 | t.version), null != t.sessionId && (i.sessionId = String(t.sessionId)), null != t.playerId && (i.playerId = String(t.playerId)), null != t.userId && (i.userId = String(t.userId)), null != t.browser) { + if ('object' != typeof t.browser) + throw TypeError('.MetadataModel.browser: object expected'); + i.browser = c.Browser.fromObject(t.browser); + } + if (null != t.geo) { + if ('object' != typeof t.geo) + throw TypeError('.MetadataModel.geo: object expected'); + i.geo = c.GeoLocation.fromObject(t.geo); + } + switch (null != t.clientAb0 && (i.clientAb0 = 0 | t.clientAb0), null != t.clientAb1 && (i.clientAb1 = 0 | t.clientAb1), null != t.serverAb0 && (i.serverAb0 = 0 | t.serverAb0), null != t.serverAb1 && (i.serverAb1 = 0 | t.serverAb1), null != t.pageUrl && (i.pageUrl = String(t.pageUrl)), null != t.bundleId && (i.bundleId = String(t.bundleId)), t.implementationType) { + case 'Web': + case 0: + i.implementationType = 0; + break; + case 'Amp': + case 1: + i.implementationType = 1; + } + return null != t.trackAllRequests && (i.trackAllRequests = Boolean(t.trackAllRequests)), null != t.customParam1 && (i.customParam1 = String(t.customParam1)), null != t.customParam2 && (i.customParam2 = String(t.customParam2)), null != t.customParam3 && (i.customParam3 = String(t.customParam3)), null != t.abTestId && (i.abTestId = String(t.abTestId)), null != t.pageInFocus && (i.pageInFocus = Boolean(t.pageInFocus)), null != t.customParam4 && (i.customParam4 = String(t.customParam4)), null != t.customParam5 && (i.customParam5 = String(t.customParam5)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.Browser = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.browserVersion = '', t.prototype.browserType = '', t.prototype.osCode = '', t.prototype.device = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.browserVersion && Object.hasOwnProperty.call(t, 'browserVersion') && i.uint32(10).string(t.browserVersion), null != t.browserType && Object.hasOwnProperty.call(t, 'browserType') && i.uint32(18).string(t.browserType), null != t.osCode && Object.hasOwnProperty.call(t, 'osCode') && i.uint32(26).string(t.osCode), null != t.device && Object.hasOwnProperty.call(t, 'device') && i.uint32(32).int32(t.device), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.Browser(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.browserVersion = t.string(); + break; + case 2: + s.browserType = t.string(); + break; + case 3: + s.osCode = t.string(); + break; + case 4: + s.device = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.Browser) + return t; + var i = new c.Browser(); + switch (null != t.browserVersion && (i.browserVersion = String(t.browserVersion)), null != t.browserType && (i.browserType = String(t.browserType)), null != t.osCode && (i.osCode = String(t.osCode)), t.device) { + case 'Desktop': + case 0: + i.device = 0; + break; + case 'Smartphone': + case 1: + i.device = 1; + break; + case 'Tablet': + case 2: + i.device = 2; + break; + case 'GameConsole': + case 3: + i.device = 3; + break; + case 'SmartTV': + case 4: + i.device = 4; + break; + case 'WearableComputer': + case 5: + i.device = 5; + break; + case 'PDA': + case 6: + i.device = 6; + break; + case 'Unrecognized': + case 7: + i.device = 7; + } + return i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.browserVersion = '', e.browserType = '', e.osCode = '', e.device = i.enums === String ? 'Desktop' : 0), null != t.browserVersion && t.hasOwnProperty('browserVersion') && (e.browserVersion = t.browserVersion), null != t.browserType && t.hasOwnProperty('browserType') && (e.browserType = t.browserType), null != t.osCode && t.hasOwnProperty('osCode') && (e.osCode = t.osCode), null != t.device && t.hasOwnProperty('device') && (e.device = i.enums === String ? c.ProtoDeviceType[t.device] : t.device), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.GeoLocation = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.countryGeoId = 0, t.prototype.cityId = 0, t.prototype.subdivisionId = 0, t.prototype.dmaId = 0, t.prototype.ip = '', t.prototype.lat = 0, t.prototype.lon = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.countryGeoId && Object.hasOwnProperty.call(t, 'countryGeoId') && i.uint32(8).int32(t.countryGeoId), null != t.cityId && Object.hasOwnProperty.call(t, 'cityId') && i.uint32(16).int32(t.cityId), null != t.subdivisionId && Object.hasOwnProperty.call(t, 'subdivisionId') && i.uint32(24).int32(t.subdivisionId), null != t.dmaId && Object.hasOwnProperty.call(t, 'dmaId') && i.uint32(32).int32(t.dmaId), null != t.ip && Object.hasOwnProperty.call(t, 'ip') && i.uint32(42).string(t.ip), null != t.lat && Object.hasOwnProperty.call(t, 'lat') && i.uint32(49).double(t.lat), null != t.lon && Object.hasOwnProperty.call(t, 'lon') && i.uint32(57).double(t.lon), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.GeoLocation(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.countryGeoId = t.int32(); + break; + case 2: + s.cityId = t.int32(); + break; + case 3: + s.subdivisionId = t.int32(); + break; + case 4: + s.dmaId = t.int32(); + break; + case 5: + s.ip = t.string(); + break; + case 6: + s.lat = t.double(); + break; + case 7: + s.lon = t.double(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.GeoLocation) + return t; + var i = new c.GeoLocation(); + return null != t.countryGeoId && (i.countryGeoId = 0 | t.countryGeoId), null != t.cityId && (i.cityId = 0 | t.cityId), null != t.subdivisionId && (i.subdivisionId = 0 | t.subdivisionId), null != t.dmaId && (i.dmaId = 0 | t.dmaId), null != t.ip && (i.ip = String(t.ip)), null != t.lat && (i.lat = Number(t.lat)), null != t.lon && (i.lon = Number(t.lon)), i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.countryGeoId = 0, e.cityId = 0, e.subdivisionId = 0, e.dmaId = 0, e.ip = '', e.lat = 0, e.lon = 0), null != t.countryGeoId && t.hasOwnProperty('countryGeoId') && (e.countryGeoId = t.countryGeoId), null != t.cityId && t.hasOwnProperty('cityId') && (e.cityId = t.cityId), null != t.subdivisionId && t.hasOwnProperty('subdivisionId') && (e.subdivisionId = t.subdivisionId), null != t.dmaId && t.hasOwnProperty('dmaId') && (e.dmaId = t.dmaId), null != t.ip && t.hasOwnProperty('ip') && (e.ip = t.ip), null != t.lat && t.hasOwnProperty('lat') && (e.lat = i.json && !isFinite(t.lat) ? String(t.lat) : t.lat), null != t.lon && t.hasOwnProperty('lon') && (e.lon = i.json && !isFinite(t.lon) ? String(t.lon) : t.lon), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoCoreTamBidResponse = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.errorMessage = '', t.prototype.encryptedBidPrice = '', t.prototype.ofskp = 0, t.prototype.impressionTimeSpent = 0, t.prototype.bidRate = 0, t.prototype.successRate = 0, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoCoreTamBidResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.errorMessage = t.string(); + break; + case 10: + s.encryptedBidPrice = t.string(); + break; + case 12: + s.ofskp = t.double(); + break; + case 13: + s.impressionTimeSpent = t.int32(); + break; + case 14: + s.bidRate = t.double(); + break; + case 15: + s.successRate = t.double(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.errorMessage = '', e.encryptedBidPrice = '', e.ofskp = 0, e.impressionTimeSpent = 0, e.bidRate = 0, e.successRate = 0), null != t.errorMessage && t.hasOwnProperty('errorMessage') && (e.errorMessage = t.errorMessage), null != t.encryptedBidPrice && t.hasOwnProperty('encryptedBidPrice') && (e.encryptedBidPrice = t.encryptedBidPrice), null != t.ofskp && t.hasOwnProperty('ofskp') && (e.ofskp = i.json && !isFinite(t.ofskp) ? String(t.ofskp) : t.ofskp), null != t.impressionTimeSpent && t.hasOwnProperty('impressionTimeSpent') && (e.impressionTimeSpent = t.impressionTimeSpent), null != t.bidRate && t.hasOwnProperty('bidRate') && (e.bidRate = i.json && !isFinite(t.bidRate) ? String(t.bidRate) : t.bidRate), null != t.successRate && t.hasOwnProperty('successRate') && (e.successRate = i.json && !isFinite(t.successRate) ? String(t.successRate) : t.successRate), e; + }, t; + }(), c.ProtoCookieSettings = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.name = '', t.prototype.value = '', t.prototype.timestamp = o.Long ? o.Long.fromBits(0, 0, !1) : 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.name && Object.hasOwnProperty.call(t, 'name') && i.uint32(10).string(t.name), null != t.value && Object.hasOwnProperty.call(t, 'value') && i.uint32(18).string(t.value), null != t.timestamp && Object.hasOwnProperty.call(t, 'timestamp') && i.uint32(24).int64(t.timestamp), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoCookieSettings) + return t; + var i = new c.ProtoCookieSettings(); + return null != t.name && (i.name = String(t.name)), null != t.value && (i.value = String(t.value)), null != t.timestamp && (o.Long ? (i.timestamp = o.Long.fromValue(t.timestamp)).unsigned = !1 : 'string' == typeof t.timestamp ? i.timestamp = parseInt(t.timestamp, 10) : 'number' == typeof t.timestamp ? i.timestamp = t.timestamp : 'object' == typeof t.timestamp && (i.timestamp = new o.LongBits(t.timestamp.low >>> 0, t.timestamp.high >>> 0).toNumber())), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoCookieSyncRequest = function () { + function t(t) { + if (this.cookieList = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.cookieList = o.emptyArray, t.prototype.secureMode = 0, t.prototype.browserInfo = null, t.encode = function (t, i) { + if (i || (i = a.create()), null != t.cookieList && t.cookieList.length) + for (var e = 0; e < t.cookieList.length; ++e) + c.ProtoCookieSettings.encode(t.cookieList[e], i.uint32(10).fork()).ldelim(); + return null != t.secureMode && Object.hasOwnProperty.call(t, 'secureMode') && i.uint32(16).int32(t.secureMode), null != t.browserInfo && Object.hasOwnProperty.call(t, 'browserInfo') && c.Browser.encode(t.browserInfo, i.uint32(26).fork()).ldelim(), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoCookieSyncRequest) + return t; + var i = new c.ProtoCookieSyncRequest(); + if (t.cookieList) { + if (!Array.isArray(t.cookieList)) + throw TypeError('.ProtoCookieSyncRequest.cookieList: array expected'); + i.cookieList = []; + for (var e = 0; e < t.cookieList.length; ++e) { + if ('object' != typeof t.cookieList[e]) + throw TypeError('.ProtoCookieSyncRequest.cookieList: object expected'); + i.cookieList[e] = c.ProtoCookieSettings.fromObject(t.cookieList[e]); + } + } + switch (t.secureMode) { + case 'Secure': + case 0: + i.secureMode = 0; + break; + case 'Unsecure': + case 1: + i.secureMode = 1; + break; + case 'Auto': + case 2: + i.secureMode = 2; + } + if (null != t.browserInfo) { + if ('object' != typeof t.browserInfo) + throw TypeError('.ProtoCookieSyncRequest.browserInfo: object expected'); + i.browserInfo = c.Browser.fromObject(t.browserInfo); + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoUserInformation = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.userId = '', t.prototype.lookupId = '', t.prototype.lookupResponseCode = 0, t.prototype.callFraudSensor = !1, t.prototype.publisherAdsTxt = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoUserInformation(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.userId = t.string(); + break; + case 3: + s.lookupId = t.string(); + break; + case 4: + s.lookupResponseCode = t.int32(); + break; + case 5: + s.callFraudSensor = t.bool(); + break; + case 6: + s.publisherAdsTxt = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.userId = '', e.lookupId = '', e.lookupResponseCode = 0, e.callFraudSensor = !1, e.publisherAdsTxt = ''), null != t.userId && t.hasOwnProperty('userId') && (e.userId = t.userId), null != t.lookupId && t.hasOwnProperty('lookupId') && (e.lookupId = t.lookupId), null != t.lookupResponseCode && t.hasOwnProperty('lookupResponseCode') && (e.lookupResponseCode = t.lookupResponseCode), null != t.callFraudSensor && t.hasOwnProperty('callFraudSensor') && (e.callFraudSensor = t.callFraudSensor), null != t.publisherAdsTxt && t.hasOwnProperty('publisherAdsTxt') && (e.publisherAdsTxt = t.publisherAdsTxt), e; + }, t; + }(), c.CreativeTrackerViewModel = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.type = 0, t.prototype.trigger = 0, t.prototype.url = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.CreativeTrackerViewModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.type = t.int32(); + break; + case 2: + s.trigger = t.int32(); + break; + case 3: + s.url = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.type = i.enums === String ? 'Image' : 0, e.trigger = i.enums === String ? 'Impression' : 0, e.url = ''), null != t.type && t.hasOwnProperty('type') && (e.type = i.enums === String ? c.ProtoTrackerType[t.type] : t.type), null != t.trigger && t.hasOwnProperty('trigger') && (e.trigger = i.enums === String ? c.ProtoTrackerTriggerType[t.trigger] : t.trigger), null != t.url && t.hasOwnProperty('url') && (e.url = t.url), e; + }, t; + }(), c.ProtoLineItemAdBreakTargeting = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.adRollType = 0, t.prototype.adBreakTypeEnum = 1, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdBreakTargeting(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.adRollType = t.int32(); + break; + case 2: + s.adBreakTypeEnum = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.adRollType = i.enums === String ? 'None' : 0, e.adBreakTypeEnum = i.enums === String ? 'All' : 1), null != t.adRollType && t.hasOwnProperty('adRollType') && (e.adRollType = i.enums === String ? c.ProtoAdBreakTypeEnum[t.adRollType] : t.adRollType), null != t.adBreakTypeEnum && t.hasOwnProperty('adBreakTypeEnum') && (e.adBreakTypeEnum = i.enums === String ? c.ProtoLineItemAdBreakTypeEnum[t.adBreakTypeEnum] : t.adBreakTypeEnum), e; + }, t; + }(), c.ProtoLineItemAdPodTargeting = function () { + function t(t) { + if (this.adSlotPositions = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.targetingType = 0, t.prototype.adSlotTargetingType = 1, t.prototype.adSlotPositions = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdPodTargeting(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.targetingType = t.int32(); + break; + case 2: + s.adSlotTargetingType = t.int32(); + break; + case 3: + if (s.adSlotPositions && s.adSlotPositions.length || (s.adSlotPositions = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.adSlotPositions.push(t.int32()); + else + s.adSlotPositions.push(t.int32()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.adSlotPositions = []), i.defaults && (e.targetingType = i.enums === String ? 'Only' : 0, e.adSlotTargetingType = i.enums === String ? 'SpecificSlots' : 1), null != t.targetingType && t.hasOwnProperty('targetingType') && (e.targetingType = i.enums === String ? c.ProtoLineItemTargetingTypeEnum[t.targetingType] : t.targetingType), null != t.adSlotTargetingType && t.hasOwnProperty('adSlotTargetingType') && (e.adSlotTargetingType = i.enums === String ? c.ProtoLineItemAdSlotTargetingTypeEnum[t.adSlotTargetingType] : t.adSlotTargetingType), t.adSlotPositions && t.adSlotPositions.length) { + e.adSlotPositions = []; + for (var s = 0; s < t.adSlotPositions.length; ++s) + e.adSlotPositions[s] = t.adSlotPositions[s]; + } + return e; + }, t; + }(), c.ProtoLineItemAdBreakSettings = function () { + function t(t) { + if (this.adBreakTargeting = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.adBreakTargeting = o.emptyArray, t.prototype.adPodTargeting = null, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdBreakSettings(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.adBreakTargeting && s.adBreakTargeting.length || (s.adBreakTargeting = []), s.adBreakTargeting.push(c.ProtoLineItemAdBreakTargeting.decode(t, t.uint32())); + break; + case 2: + s.adPodTargeting = c.ProtoLineItemAdPodTargeting.decode(t, t.uint32()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.adBreakTargeting = []), i.defaults && (e.adPodTargeting = null), t.adBreakTargeting && t.adBreakTargeting.length) { + e.adBreakTargeting = []; + for (var s = 0; s < t.adBreakTargeting.length; ++s) + e.adBreakTargeting[s] = c.ProtoLineItemAdBreakTargeting.toObject(t.adBreakTargeting[s], i); + } + return null != t.adPodTargeting && t.hasOwnProperty('adPodTargeting') && (e.adPodTargeting = c.ProtoLineItemAdPodTargeting.toObject(t.adPodTargeting, i)), e; + }, t; + }(), c.ProtoLineItem = function () { + function t(t) { + if (this.trackers = [], this.renditions = [], this.floorPrices = [], this.advertiserContextualTargeting = [], this.publisherContextualTargeting = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.adTag = '', t.prototype.creativeType = 0, t.prototype.sound = !1, t.prototype.viewability = !1, t.prototype.impressionTimeSpent = 0, t.prototype.vendorId = '', t.prototype.trackers = o.emptyArray, t.prototype.duration = 0, t.prototype.renditions = o.emptyArray, t.prototype.mediaCreativeId = '', t.prototype.ignoreFilledRequests = !1, t.prototype.requestCap = 3, t.prototype.impressionCap = 0, t.prototype.successRate = 0, t.prototype.lineItemPriority = 0, t.prototype.headerBidderBids = '', t.prototype.headerBidderTimeout = 0, t.prototype.mediaCreativeClickUrl = '', t.prototype.resetRequestsCapTime = 60, t.prototype.resetImpressionsCapTime = 60, t.prototype.resetCapType = 0, t.prototype.creativeHlsFileName = '', t.prototype.timeBetweenRequests = 0, t.prototype.skipMode = 0, t.prototype.mediaIdTargeting = null, t.prototype.mediaKeywordsTargeting = null, t.prototype.mediaLanguageTargeting = null, t.prototype.adType = 0, t.prototype.overlayTime = 30, t.prototype.floorPrice = 0, t.prototype.adBreakSettings = null, t.prototype.floorPrices = o.emptyArray, t.prototype.bidRate = 0, t.prototype.pauseAdOutOfView = 0, t.prototype.moatTrackingEnabled = !1, t.prototype.cnxCreativeId = '', t.prototype.blockedDomainsRevisionNumber = 0, t.prototype.advertiserContextualTargeting = o.emptyArray, t.prototype.publisherContextualTargeting = o.emptyArray, t.prototype.amazonDealId = '', t.prototype.playerSizeTargetings = null, t.prototype.playerSize = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItem(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.publisherLineItemId = t.string(); + break; + case 2: + s.advertiserLineItemId = t.string(); + break; + case 3: + s.adTag = t.string(); + break; + case 4: + s.creativeType = t.int32(); + break; + case 6: + s.sound = t.bool(); + break; + case 7: + s.viewability = t.bool(); + break; + case 9: + s.impressionTimeSpent = t.int32(); + break; + case 10: + s.vendorId = t.string(); + break; + case 12: + s.trackers && s.trackers.length || (s.trackers = []), s.trackers.push(c.CreativeTrackerViewModel.decode(t, t.uint32())); + break; + case 13: + s.duration = t.int32(); + break; + case 14: + s.renditions && s.renditions.length || (s.renditions = []), s.renditions.push(c.ProtoRendition.decode(t, t.uint32())); + break; + case 15: + s.mediaCreativeId = t.string(); + break; + case 16: + s.ignoreFilledRequests = t.bool(); + break; + case 17: + s.requestCap = t.int32(); + break; + case 18: + s.impressionCap = t.int32(); + break; + case 19: + s.successRate = t.double(); + break; + case 20: + s.lineItemPriority = t.int32(); + break; + case 21: + s.headerBidderBids = t.string(); + break; + case 22: + s.headerBidderTimeout = t.int32(); + break; + case 23: + s.mediaCreativeClickUrl = t.string(); + break; + case 24: + s.resetRequestsCapTime = t.int32(); + break; + case 25: + s.resetImpressionsCapTime = t.int32(); + break; + case 26: + s.resetCapType = t.int32(); + break; + case 27: + s.creativeHlsFileName = t.string(); + break; + case 28: + s.timeBetweenRequests = t.int32(); + break; + case 29: + s.skipMode = t.int32(); + break; + case 30: + s.mediaIdTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 31: + s.mediaKeywordsTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 32: + s.mediaLanguageTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 33: + s.adType = t.int32(); + break; + case 34: + s.overlayTime = t.int32(); + break; + case 35: + s.floorPrice = t.double(); + break; + case 36: + s.adBreakSettings = c.ProtoLineItemAdBreakSettings.decode(t, t.uint32()); + break; + case 38: + if (s.floorPrices && s.floorPrices.length || (s.floorPrices = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.floorPrices.push(t.double()); + else + s.floorPrices.push(t.double()); + break; + case 39: + s.bidRate = t.double(); + break; + case 40: + s.pauseAdOutOfView = t.int32(); + break; + case 41: + s.moatTrackingEnabled = t.bool(); + break; + case 42: + s.cnxCreativeId = t.string(); + break; + case 44: + s.blockedDomainsRevisionNumber = t.int32(); + break; + case 45: + s.advertiserContextualTargeting && s.advertiserContextualTargeting.length || (s.advertiserContextualTargeting = []), s.advertiserContextualTargeting.push(c.ProtoContextualTargetingCaseModel.decode(t, t.uint32())); + break; + case 46: + s.publisherContextualTargeting && s.publisherContextualTargeting.length || (s.publisherContextualTargeting = []), s.publisherContextualTargeting.push(c.ProtoContextualTargetingCaseModel.decode(t, t.uint32())); + break; + case 48: + s.amazonDealId = t.string(); + break; + case 47: + s.playerSizeTargetings = c.ProtoPlayerSizeTargetings.decode(t, t.uint32()); + break; + case 101: + s.playerSize = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.trackers = [], e.renditions = [], e.floorPrices = [], e.advertiserContextualTargeting = [], e.publisherContextualTargeting = []), i.defaults && (e.publisherLineItemId = '', e.advertiserLineItemId = '', e.adTag = '', e.creativeType = i.enums === String ? 'ThirdParty' : 0, e.sound = !1, e.viewability = !1, e.impressionTimeSpent = 0, e.vendorId = '', e.duration = 0, e.mediaCreativeId = '', e.ignoreFilledRequests = !1, e.requestCap = 3, e.impressionCap = 0, e.successRate = 0, e.lineItemPriority = i.enums === String ? 'House' : 0, e.headerBidderBids = '', e.headerBidderTimeout = 0, e.mediaCreativeClickUrl = '', e.resetRequestsCapTime = 60, e.resetImpressionsCapTime = 60, e.resetCapType = i.enums === String ? 'TimeCapping' : 0, e.creativeHlsFileName = '', e.timeBetweenRequests = 0, e.skipMode = i.enums === String ? 'IfLongerThan31Sec' : 0, e.mediaIdTargeting = null, e.mediaKeywordsTargeting = null, e.mediaLanguageTargeting = null, e.adType = i.enums === String ? 'Video' : 0, e.overlayTime = 30, e.floorPrice = 0, e.adBreakSettings = null, e.bidRate = 0, e.pauseAdOutOfView = i.enums === String ? 'Default' : 0, e.moatTrackingEnabled = !1, e.cnxCreativeId = '', e.blockedDomainsRevisionNumber = 0, e.playerSizeTargetings = null, e.amazonDealId = '', e.playerSize = ''), null != t.publisherLineItemId && t.hasOwnProperty('publisherLineItemId') && (e.publisherLineItemId = t.publisherLineItemId), null != t.advertiserLineItemId && t.hasOwnProperty('advertiserLineItemId') && (e.advertiserLineItemId = t.advertiserLineItemId), null != t.adTag && t.hasOwnProperty('adTag') && (e.adTag = t.adTag), null != t.creativeType && t.hasOwnProperty('creativeType') && (e.creativeType = i.enums === String ? c.ProtoCreativeTypeEnum[t.creativeType] : t.creativeType), null != t.sound && t.hasOwnProperty('sound') && (e.sound = t.sound), null != t.viewability && t.hasOwnProperty('viewability') && (e.viewability = t.viewability), null != t.impressionTimeSpent && t.hasOwnProperty('impressionTimeSpent') && (e.impressionTimeSpent = t.impressionTimeSpent), null != t.vendorId && t.hasOwnProperty('vendorId') && (e.vendorId = t.vendorId), t.trackers && t.trackers.length) { + e.trackers = []; + for (var s = 0; s < t.trackers.length; ++s) + e.trackers[s] = c.CreativeTrackerViewModel.toObject(t.trackers[s], i); + } + if (null != t.duration && t.hasOwnProperty('duration') && (e.duration = t.duration), t.renditions && t.renditions.length) { + e.renditions = []; + for (s = 0; s < t.renditions.length; ++s) + e.renditions[s] = c.ProtoRendition.toObject(t.renditions[s], i); + } + if (null != t.mediaCreativeId && t.hasOwnProperty('mediaCreativeId') && (e.mediaCreativeId = t.mediaCreativeId), null != t.ignoreFilledRequests && t.hasOwnProperty('ignoreFilledRequests') && (e.ignoreFilledRequests = t.ignoreFilledRequests), null != t.requestCap && t.hasOwnProperty('requestCap') && (e.requestCap = t.requestCap), null != t.impressionCap && t.hasOwnProperty('impressionCap') && (e.impressionCap = t.impressionCap), null != t.successRate && t.hasOwnProperty('successRate') && (e.successRate = i.json && !isFinite(t.successRate) ? String(t.successRate) : t.successRate), null != t.lineItemPriority && t.hasOwnProperty('lineItemPriority') && (e.lineItemPriority = i.enums === String ? c.ProtoLineItemPriority[t.lineItemPriority] : t.lineItemPriority), null != t.headerBidderBids && t.hasOwnProperty('headerBidderBids') && (e.headerBidderBids = t.headerBidderBids), null != t.headerBidderTimeout && t.hasOwnProperty('headerBidderTimeout') && (e.headerBidderTimeout = t.headerBidderTimeout), null != t.mediaCreativeClickUrl && t.hasOwnProperty('mediaCreativeClickUrl') && (e.mediaCreativeClickUrl = t.mediaCreativeClickUrl), null != t.resetRequestsCapTime && t.hasOwnProperty('resetRequestsCapTime') && (e.resetRequestsCapTime = t.resetRequestsCapTime), null != t.resetImpressionsCapTime && t.hasOwnProperty('resetImpressionsCapTime') && (e.resetImpressionsCapTime = t.resetImpressionsCapTime), null != t.resetCapType && t.hasOwnProperty('resetCapType') && (e.resetCapType = i.enums === String ? c.ProtoResetCapTypeEnum[t.resetCapType] : t.resetCapType), null != t.creativeHlsFileName && t.hasOwnProperty('creativeHlsFileName') && (e.creativeHlsFileName = t.creativeHlsFileName), null != t.timeBetweenRequests && t.hasOwnProperty('timeBetweenRequests') && (e.timeBetweenRequests = t.timeBetweenRequests), null != t.skipMode && t.hasOwnProperty('skipMode') && (e.skipMode = i.enums === String ? c.ProtoAdSkipMode[t.skipMode] : t.skipMode), null != t.mediaIdTargeting && t.hasOwnProperty('mediaIdTargeting') && (e.mediaIdTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaIdTargeting, i)), null != t.mediaKeywordsTargeting && t.hasOwnProperty('mediaKeywordsTargeting') && (e.mediaKeywordsTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaKeywordsTargeting, i)), null != t.mediaLanguageTargeting && t.hasOwnProperty('mediaLanguageTargeting') && (e.mediaLanguageTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaLanguageTargeting, i)), null != t.adType && t.hasOwnProperty('adType') && (e.adType = i.enums === String ? c.ProtoAdType[t.adType] : t.adType), null != t.overlayTime && t.hasOwnProperty('overlayTime') && (e.overlayTime = t.overlayTime), null != t.floorPrice && t.hasOwnProperty('floorPrice') && (e.floorPrice = i.json && !isFinite(t.floorPrice) ? String(t.floorPrice) : t.floorPrice), null != t.adBreakSettings && t.hasOwnProperty('adBreakSettings') && (e.adBreakSettings = c.ProtoLineItemAdBreakSettings.toObject(t.adBreakSettings, i)), t.floorPrices && t.floorPrices.length) { + e.floorPrices = []; + for (s = 0; s < t.floorPrices.length; ++s) + e.floorPrices[s] = i.json && !isFinite(t.floorPrices[s]) ? String(t.floorPrices[s]) : t.floorPrices[s]; + } + if (null != t.bidRate && t.hasOwnProperty('bidRate') && (e.bidRate = i.json && !isFinite(t.bidRate) ? String(t.bidRate) : t.bidRate), null != t.pauseAdOutOfView && t.hasOwnProperty('pauseAdOutOfView') && (e.pauseAdOutOfView = i.enums === String ? c.ProtoLineItemPauseAdOutOfViewEnum[t.pauseAdOutOfView] : t.pauseAdOutOfView), null != t.moatTrackingEnabled && t.hasOwnProperty('moatTrackingEnabled') && (e.moatTrackingEnabled = t.moatTrackingEnabled), null != t.cnxCreativeId && t.hasOwnProperty('cnxCreativeId') && (e.cnxCreativeId = t.cnxCreativeId), null != t.blockedDomainsRevisionNumber && t.hasOwnProperty('blockedDomainsRevisionNumber') && (e.blockedDomainsRevisionNumber = t.blockedDomainsRevisionNumber), t.advertiserContextualTargeting && t.advertiserContextualTargeting.length) { + e.advertiserContextualTargeting = []; + for (s = 0; s < t.advertiserContextualTargeting.length; ++s) + e.advertiserContextualTargeting[s] = c.ProtoContextualTargetingCaseModel.toObject(t.advertiserContextualTargeting[s], i); + } + if (t.publisherContextualTargeting && t.publisherContextualTargeting.length) { + e.publisherContextualTargeting = []; + for (s = 0; s < t.publisherContextualTargeting.length; ++s) + e.publisherContextualTargeting[s] = c.ProtoContextualTargetingCaseModel.toObject(t.publisherContextualTargeting[s], i); + } + return null != t.playerSizeTargetings && t.hasOwnProperty('playerSizeTargetings') && (e.playerSizeTargetings = c.ProtoPlayerSizeTargetings.toObject(t.playerSizeTargetings, i)), null != t.amazonDealId && t.hasOwnProperty('amazonDealId') && (e.amazonDealId = t.amazonDealId), null != t.playerSize && t.hasOwnProperty('playerSize') && (e.playerSize = t.playerSize), e; + }, t; + }(), c.ProtoTargetingChoiceModel = function () { + function t(t) { + if (this.items = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.choiceCriteria = 0, t.prototype.items = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoTargetingChoiceModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.choiceCriteria = t.int32(); + break; + case 2: + s.items && s.items.length || (s.items = []), s.items.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.items = []), i.defaults && (e.choiceCriteria = i.enums === String ? 'Only' : 0), null != t.choiceCriteria && t.hasOwnProperty('choiceCriteria') && (e.choiceCriteria = i.enums === String ? c.ProtoChoiceCriteriaEnum[t.choiceCriteria] : t.choiceCriteria), t.items && t.items.length) { + e.items = []; + for (var s = 0; s < t.items.length; ++s) + e.items[s] = t.items[s]; + } + return e; + }, t; + }(), c.ProtoContextualTargetingCaseModel = function () { + function t(t) { + if (this.filters = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.filters = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoContextualTargetingCaseModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.filters && s.filters.length || (s.filters = []), s.filters.push(c.ProtoContextualTargetingFilterModel.decode(t, t.uint32())); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.filters = []), t.filters && t.filters.length) { + e.filters = []; + for (var s = 0; s < t.filters.length; ++s) + e.filters[s] = c.ProtoContextualTargetingFilterModel.toObject(t.filters[s], i); + } + return e; + }, t; + }(), c.ProtoContextualTargetingFilterModel = function () { + function t(t) { + if (this.items = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.type = 0, t.prototype.items = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoContextualTargetingFilterModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.type = t.int32(); + break; + case 2: + s.items && s.items.length || (s.items = []), s.items.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.items = []), i.defaults && (e.type = i.enums === String ? 'IncludeAny' : 0), null != t.type && t.hasOwnProperty('type') && (e.type = i.enums === String ? c.ProtoLineItemContextualTargetingEnum[t.type] : t.type), t.items && t.items.length) { + e.items = []; + for (var s = 0; s < t.items.length; ++s) + e.items[s] = t.items[s]; + } + return e; + }, t; + }(), c.ProtoPlayerSizeTargetings = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.sizeChoiceCriteria = 0, t.prototype.minWidth = 0, t.prototype.maxWidth = 0, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoPlayerSizeTargetings(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.sizeChoiceCriteria = t.int32(); + break; + case 2: + s.minWidth = t.int32(); + break; + case 3: + s.maxWidth = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.sizeChoiceCriteria = i.enums === String ? 'GreaterThan' : 0, e.minWidth = 0, e.maxWidth = 0), null != t.sizeChoiceCriteria && t.hasOwnProperty('sizeChoiceCriteria') && (e.sizeChoiceCriteria = i.enums === String ? c.ProtoSizeChoiceCriteriaEnum[t.sizeChoiceCriteria] : t.sizeChoiceCriteria), null != t.minWidth && t.hasOwnProperty('minWidth') && (e.minWidth = t.minWidth), null != t.maxWidth && t.hasOwnProperty('maxWidth') && (e.maxWidth = t.maxWidth), e; + }, t; + }(), c.ProtoRendition = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.height = 0, t.prototype.codec = '', t.prototype.file = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRendition(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.height = t.int32(); + break; + case 2: + s.codec = t.string(); + break; + case 3: + s.file = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.height = 0, e.codec = '', e.file = ''), null != t.height && t.hasOwnProperty('height') && (e.height = t.height), null != t.codec && t.hasOwnProperty('codec') && (e.codec = t.codec), null != t.file && t.hasOwnProperty('file') && (e.file = t.file), e; + }, t; + }(), c.ProtoLiveMediaMetadataResponse = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.startDate = '', t.prototype.outputUrl = '', t.prototype.thumbnailUrl = '', t.prototype.altText = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLiveMediaMetadataResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.startDate = t.string(); + break; + case 2: + s.outputUrl = t.string(); + break; + case 3: + s.thumbnailUrl = t.string(); + break; + case 4: + s.altText = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.startDate = '', e.outputUrl = '', e.thumbnailUrl = '', e.altText = ''), null != t.startDate && t.hasOwnProperty('startDate') && (e.startDate = t.startDate), null != t.outputUrl && t.hasOwnProperty('outputUrl') && (e.outputUrl = t.outputUrl), null != t.thumbnailUrl && t.hasOwnProperty('thumbnailUrl') && (e.thumbnailUrl = t.thumbnailUrl), null != t.altText && t.hasOwnProperty('altText') && (e.altText = t.altText), e; + }, t; + }(), c.ProtoLoggingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.message = '', t.prototype.version = 0, t.prototype.level = 0, t.prototype.callStack = '', t.prototype.pageUrl = '', t.prototype.exception = '', t.prototype.sessionId = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.message && Object.hasOwnProperty.call(t, 'message') && i.uint32(10).string(t.message), null != t.version && Object.hasOwnProperty.call(t, 'version') && i.uint32(16).int32(t.version), null != t.level && Object.hasOwnProperty.call(t, 'level') && i.uint32(24).int32(t.level), null != t.callStack && Object.hasOwnProperty.call(t, 'callStack') && i.uint32(34).string(t.callStack), null != t.pageUrl && Object.hasOwnProperty.call(t, 'pageUrl') && i.uint32(42).string(t.pageUrl), null != t.exception && Object.hasOwnProperty.call(t, 'exception') && i.uint32(50).string(t.exception), null != t.sessionId && Object.hasOwnProperty.call(t, 'sessionId') && i.uint32(58).string(t.sessionId), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoLoggingRequest) + return t; + var i = new c.ProtoLoggingRequest(); + switch (null != t.message && (i.message = String(t.message)), null != t.version && (i.version = 0 | t.version), t.level) { + case 'FATAL': + case 0: + i.level = 0; + break; + case 'WARNING': + case 1: + i.level = 1; + break; + case 'INFO': + case 2: + i.level = 2; + } + return null != t.callStack && (i.callStack = String(t.callStack)), null != t.pageUrl && (i.pageUrl = String(t.pageUrl)), null != t.exception && (i.exception = String(t.exception)), null != t.sessionId && (i.sessionId = String(t.sessionId)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoSpriteSheet = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.file = '', t.prototype.height = 0, t.prototype.count = 0, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoSpriteSheet(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.file = t.string(); + break; + case 2: + s.height = t.int32(); + break; + case 3: + s.count = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.file = '', e.height = 0, e.count = 0), null != t.file && t.hasOwnProperty('file') && (e.file = t.file), null != t.height && t.hasOwnProperty('height') && (e.height = t.height), null != t.count && t.hasOwnProperty('count') && (e.count = t.count), e; + }, t; + }(), c.ProtoTrack = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.file = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoTrack(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.file = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.file = ''), null != t.file && t.hasOwnProperty('file') && (e.file = t.file), e; + }, t; + }(), c.ProtoCustomField = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.name = '', t.prototype.value = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoCustomField(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.name = t.string(); + break; + case 2: + s.value = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.name = '', e.value = ''), null != t.name && t.hasOwnProperty('name') && (e.name = t.name), null != t.value && t.hasOwnProperty('value') && (e.value = t.value), e; + }, t; + }(), c.ProtoMediaMetadataResponse = function () { + function t(t) { + if (this.keywordList = [], this.trackList = [], this.renditionList = [], this.customFields = [], this.videoIndexes = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.title = '', t.prototype.description = '', t.prototype.duration = 0, t.prototype.clickUrl = '', t.prototype.keywordList = o.emptyArray, t.prototype.trackList = o.emptyArray, t.prototype.spriteSheet = null, t.prototype.thumbnail = '', t.prototype.renditionList = o.emptyArray, t.prototype.customFields = o.emptyArray, t.prototype.hlsFilePath = '', t.prototype.languageId = '', t.prototype.sourceItemId = '', t.prototype.altText = '', t.prototype.videoIndexes = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoMediaMetadataResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.title = t.string(); + break; + case 2: + s.description = t.string(); + break; + case 3: + s.duration = t.int32(); + break; + case 4: + s.clickUrl = t.string(); + break; + case 5: + s.keywordList && s.keywordList.length || (s.keywordList = []), s.keywordList.push(t.string()); + break; + case 6: + s.trackList && s.trackList.length || (s.trackList = []), s.trackList.push(c.ProtoTrack.decode(t, t.uint32())); + break; + case 7: + s.spriteSheet = c.ProtoSpriteSheet.decode(t, t.uint32()); + break; + case 8: + s.thumbnail = t.string(); + break; + case 9: + s.renditionList && s.renditionList.length || (s.renditionList = []), s.renditionList.push(c.ProtoRendition.decode(t, t.uint32())); + break; + case 10: + s.customFields && s.customFields.length || (s.customFields = []), s.customFields.push(c.ProtoCustomField.decode(t, t.uint32())); + break; + case 11: + s.hlsFilePath = t.string(); + break; + case 12: + s.languageId = t.string(); + break; + case 13: + s.sourceItemId = t.string(); + break; + case 14: + s.altText = t.string(); + break; + case 15: + s.videoIndexes && s.videoIndexes.length || (s.videoIndexes = []), s.videoIndexes.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.keywordList = [], e.trackList = [], e.renditionList = [], e.customFields = [], e.videoIndexes = []), i.defaults && (e.title = '', e.description = '', e.duration = 0, e.clickUrl = '', e.spriteSheet = null, e.thumbnail = '', e.hlsFilePath = '', e.languageId = '', e.sourceItemId = '', e.altText = ''), null != t.title && t.hasOwnProperty('title') && (e.title = t.title), null != t.description && t.hasOwnProperty('description') && (e.description = t.description), null != t.duration && t.hasOwnProperty('duration') && (e.duration = t.duration), null != t.clickUrl && t.hasOwnProperty('clickUrl') && (e.clickUrl = t.clickUrl), t.keywordList && t.keywordList.length) { + e.keywordList = []; + for (var s = 0; s < t.keywordList.length; ++s) + e.keywordList[s] = t.keywordList[s]; + } + if (t.trackList && t.trackList.length) { + e.trackList = []; + for (s = 0; s < t.trackList.length; ++s) + e.trackList[s] = c.ProtoTrack.toObject(t.trackList[s], i); + } + if (null != t.spriteSheet && t.hasOwnProperty('spriteSheet') && (e.spriteSheet = c.ProtoSpriteSheet.toObject(t.spriteSheet, i)), null != t.thumbnail && t.hasOwnProperty('thumbnail') && (e.thumbnail = t.thumbnail), t.renditionList && t.renditionList.length) { + e.renditionList = []; + for (s = 0; s < t.renditionList.length; ++s) + e.renditionList[s] = c.ProtoRendition.toObject(t.renditionList[s], i); + } + if (t.customFields && t.customFields.length) { + e.customFields = []; + for (s = 0; s < t.customFields.length; ++s) + e.customFields[s] = c.ProtoCustomField.toObject(t.customFields[s], i); + } + if (null != t.hlsFilePath && t.hasOwnProperty('hlsFilePath') && (e.hlsFilePath = t.hlsFilePath), null != t.languageId && t.hasOwnProperty('languageId') && (e.languageId = t.languageId), null != t.sourceItemId && t.hasOwnProperty('sourceItemId') && (e.sourceItemId = t.sourceItemId), null != t.altText && t.hasOwnProperty('altText') && (e.altText = t.altText), t.videoIndexes && t.videoIndexes.length) { + e.videoIndexes = []; + for (s = 0; s < t.videoIndexes.length; ++s) + e.videoIndexes[s] = t.videoIndexes[s]; + } + return e; + }, t; + }(), c.ProtoRtbRequest = function () { + function t(t) { + if (this.lineItems = {}, this.customMacros = {}, t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.metadata = null, t.prototype.coppa = !1, t.prototype.refererUrl = '', t.prototype.testMode = !1, t.prototype.videoWidth = 0, t.prototype.videoHeight = 0, t.prototype.gdprCompliant = !1, t.prototype.soundOn = !1, t.prototype.gdprConsentData = '', t.prototype.explorationMode = !1, t.prototype.viewability = !1, t.prototype.outstream = !1, t.prototype.domainURL = '', t.prototype.isClickToPlay = !1, t.prototype.appVersion = '', t.prototype.deviceID = '', t.prototype.lineItems = o.emptyObject, t.prototype.isCcpaBlockingUserInfo = !1, t.prototype.usPrivacyString = '', t.prototype.adSkippability = 0, t.prototype.skipAdAfter = 5, t.prototype.gdprConsentMode = 0, t.prototype.maxAdDuration = 180, t.prototype.customMacros = o.emptyObject, t.prototype.maxBidPrice = 0, t.prototype.adsMustBeSkippableIfLongerThan = 31, t.encode = function (t, i) { + if (i || (i = a.create()), null != t.metadata && Object.hasOwnProperty.call(t, 'metadata') && c.MetadataModel.encode(t.metadata, i.uint32(10).fork()).ldelim(), null != t.coppa && Object.hasOwnProperty.call(t, 'coppa') && i.uint32(32).bool(t.coppa), null != t.refererUrl && Object.hasOwnProperty.call(t, 'refererUrl') && i.uint32(42).string(t.refererUrl), null != t.testMode && Object.hasOwnProperty.call(t, 'testMode') && i.uint32(48).bool(t.testMode), null != t.videoWidth && Object.hasOwnProperty.call(t, 'videoWidth') && i.uint32(56).int32(t.videoWidth), null != t.videoHeight && Object.hasOwnProperty.call(t, 'videoHeight') && i.uint32(64).int32(t.videoHeight), null != t.gdprCompliant && Object.hasOwnProperty.call(t, 'gdprCompliant') && i.uint32(72).bool(t.gdprCompliant), null != t.soundOn && Object.hasOwnProperty.call(t, 'soundOn') && i.uint32(80).bool(t.soundOn), null != t.gdprConsentData && Object.hasOwnProperty.call(t, 'gdprConsentData') && i.uint32(90).string(t.gdprConsentData), null != t.explorationMode && Object.hasOwnProperty.call(t, 'explorationMode') && i.uint32(96).bool(t.explorationMode), null != t.viewability && Object.hasOwnProperty.call(t, 'viewability') && i.uint32(104).bool(t.viewability), null != t.outstream && Object.hasOwnProperty.call(t, 'outstream') && i.uint32(112).bool(t.outstream), null != t.domainURL && Object.hasOwnProperty.call(t, 'domainURL') && i.uint32(130).string(t.domainURL), null != t.isClickToPlay && Object.hasOwnProperty.call(t, 'isClickToPlay') && i.uint32(144).bool(t.isClickToPlay), null != t.appVersion && Object.hasOwnProperty.call(t, 'appVersion') && i.uint32(170).string(t.appVersion), null != t.deviceID && Object.hasOwnProperty.call(t, 'deviceID') && i.uint32(194).string(t.deviceID), null != t.lineItems && Object.hasOwnProperty.call(t, 'lineItems')) + for (var e = Object.keys(t.lineItems), s = 0; s < e.length; ++s) + i.uint32(202).fork().uint32(10).string(e[s]), c.ProtoRtbRequestLineItemEntry.encode(t.lineItems[e[s]], i.uint32(18).fork()).ldelim().ldelim(); + if (null != t.isCcpaBlockingUserInfo && Object.hasOwnProperty.call(t, 'isCcpaBlockingUserInfo') && i.uint32(208).bool(t.isCcpaBlockingUserInfo), null != t.usPrivacyString && Object.hasOwnProperty.call(t, 'usPrivacyString') && i.uint32(218).string(t.usPrivacyString), null != t.adSkippability && Object.hasOwnProperty.call(t, 'adSkippability') && i.uint32(256).int32(t.adSkippability), null != t.skipAdAfter && Object.hasOwnProperty.call(t, 'skipAdAfter') && i.uint32(264).int32(t.skipAdAfter), null != t.gdprConsentMode && Object.hasOwnProperty.call(t, 'gdprConsentMode') && i.uint32(288).int32(t.gdprConsentMode), null != t.maxAdDuration && Object.hasOwnProperty.call(t, 'maxAdDuration') && i.uint32(296).int32(t.maxAdDuration), null != t.customMacros && Object.hasOwnProperty.call(t, 'customMacros')) + for (e = Object.keys(t.customMacros), s = 0; s < e.length; ++s) + i.uint32(306).fork().uint32(10).string(e[s]).uint32(18).string(t.customMacros[e[s]]).ldelim(); + return null != t.maxBidPrice && Object.hasOwnProperty.call(t, 'maxBidPrice') && i.uint32(313).double(t.maxBidPrice), null != t.adsMustBeSkippableIfLongerThan && Object.hasOwnProperty.call(t, 'adsMustBeSkippableIfLongerThan') && i.uint32(320).int32(t.adsMustBeSkippableIfLongerThan), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoRtbRequest) + return t; + var i = new c.ProtoRtbRequest(); + if (null != t.metadata) { + if ('object' != typeof t.metadata) + throw TypeError('.ProtoRtbRequest.metadata: object expected'); + i.metadata = c.MetadataModel.fromObject(t.metadata); + } + if (null != t.coppa && (i.coppa = Boolean(t.coppa)), null != t.refererUrl && (i.refererUrl = String(t.refererUrl)), null != t.testMode && (i.testMode = Boolean(t.testMode)), null != t.videoWidth && (i.videoWidth = 0 | t.videoWidth), null != t.videoHeight && (i.videoHeight = 0 | t.videoHeight), null != t.gdprCompliant && (i.gdprCompliant = Boolean(t.gdprCompliant)), null != t.soundOn && (i.soundOn = Boolean(t.soundOn)), null != t.gdprConsentData && (i.gdprConsentData = String(t.gdprConsentData)), null != t.explorationMode && (i.explorationMode = Boolean(t.explorationMode)), null != t.viewability && (i.viewability = Boolean(t.viewability)), null != t.outstream && (i.outstream = Boolean(t.outstream)), null != t.domainURL && (i.domainURL = String(t.domainURL)), null != t.isClickToPlay && (i.isClickToPlay = Boolean(t.isClickToPlay)), null != t.appVersion && (i.appVersion = String(t.appVersion)), null != t.deviceID && (i.deviceID = String(t.deviceID)), t.lineItems) { + if ('object' != typeof t.lineItems) + throw TypeError('.ProtoRtbRequest.lineItems: object expected'); + i.lineItems = {}; + for (var e = Object.keys(t.lineItems), s = 0; s < e.length; ++s) { + if ('object' != typeof t.lineItems[e[s]]) + throw TypeError('.ProtoRtbRequest.lineItems: object expected'); + i.lineItems[e[s]] = c.ProtoRtbRequestLineItemEntry.fromObject(t.lineItems[e[s]]); + } + } + switch (null != t.isCcpaBlockingUserInfo && (i.isCcpaBlockingUserInfo = Boolean(t.isCcpaBlockingUserInfo)), null != t.usPrivacyString && (i.usPrivacyString = String(t.usPrivacyString)), t.adSkippability) { + case 'IfLongerThan': + case 0: + i.adSkippability = 0; + break; + case 'Always': + case 1: + i.adSkippability = 1; + break; + case 'NoRestrictions': + case 2: + i.adSkippability = 2; + } + switch (null != t.skipAdAfter && (i.skipAdAfter = 0 | t.skipAdAfter), t.gdprConsentMode) { + case 'Unknown': + case 0: + i.gdprConsentMode = 0; + break; + case 'NoCmp': + case 1: + i.gdprConsentMode = 1; + break; + case 'NoConsent': + case 2: + i.gdprConsentMode = 2; + break; + case 'NoConnatixConsent': + case 3: + i.gdprConsentMode = 3; + break; + case 'NotAllDemandConsent': + case 4: + i.gdprConsentMode = 4; + break; + case 'AllGood': + case 5: + i.gdprConsentMode = 5; + } + if (null != t.maxAdDuration && (i.maxAdDuration = 0 | t.maxAdDuration), t.customMacros) { + if ('object' != typeof t.customMacros) + throw TypeError('.ProtoRtbRequest.customMacros: object expected'); + i.customMacros = {}; + for (e = Object.keys(t.customMacros), s = 0; s < e.length; ++s) + i.customMacros[e[s]] = String(t.customMacros[e[s]]); + } + return null != t.maxBidPrice && (i.maxBidPrice = Number(t.maxBidPrice)), null != t.adsMustBeSkippableIfLongerThan && (i.adsMustBeSkippableIfLongerThan = 0 | t.adsMustBeSkippableIfLongerThan), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoRtbRequestLineItemEntry = function () { + function t(t) { + if (this.ignoredFloorPriceFactorIndexes = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + var i; + return t.prototype.cachedFloorPrice = null, t.prototype.availableRequests = 0, t.prototype.ignoredFloorPriceFactorIndexes = o.emptyArray, t.prototype.gdprConsent = !1, t.prototype.publisherLineItemId = '', t.prototype.slotWidth = 0, t.prototype.slotHeight = 0, Object.defineProperty(t.prototype, 'T', { + get: o.oneOfGetter(i = ['cachedFloorPrice']), + set: o.oneOfSetter(i) + }), t.encode = function (t, i) { + if (i || (i = a.create()), null != t.availableRequests && Object.hasOwnProperty.call(t, 'availableRequests') && i.uint32(8).int32(t.availableRequests), null != t.cachedFloorPrice && Object.hasOwnProperty.call(t, 'cachedFloorPrice') && i.uint32(17).double(t.cachedFloorPrice), null != t.ignoredFloorPriceFactorIndexes && t.ignoredFloorPriceFactorIndexes.length) + for (var e = 0; e < t.ignoredFloorPriceFactorIndexes.length; ++e) + i.uint32(24).int32(t.ignoredFloorPriceFactorIndexes[e]); + return null != t.gdprConsent && Object.hasOwnProperty.call(t, 'gdprConsent') && i.uint32(32).bool(t.gdprConsent), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(42).string(t.publisherLineItemId), null != t.slotWidth && Object.hasOwnProperty.call(t, 'slotWidth') && i.uint32(48).int32(t.slotWidth), null != t.slotHeight && Object.hasOwnProperty.call(t, 'slotHeight') && i.uint32(56).int32(t.slotHeight), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoRtbRequestLineItemEntry) + return t; + var i = new c.ProtoRtbRequestLineItemEntry(); + if (null != t.cachedFloorPrice && (i.cachedFloorPrice = Number(t.cachedFloorPrice)), null != t.availableRequests && (i.availableRequests = 0 | t.availableRequests), t.ignoredFloorPriceFactorIndexes) { + if (!Array.isArray(t.ignoredFloorPriceFactorIndexes)) + throw TypeError('.ProtoRtbRequestLineItemEntry.ignoredFloorPriceFactorIndexes: array expected'); + i.ignoredFloorPriceFactorIndexes = []; + for (var e = 0; e < t.ignoredFloorPriceFactorIndexes.length; ++e) + i.ignoredFloorPriceFactorIndexes[e] = 0 | t.ignoredFloorPriceFactorIndexes[e]; + } + return null != t.gdprConsent && (i.gdprConsent = Boolean(t.gdprConsent)), null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.slotWidth && (i.slotWidth = 0 | t.slotWidth), null != t.slotHeight && (i.slotHeight = 0 | t.slotHeight), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoRtbResponse = function () { + function t(t) { + if (this.lineItemResponses = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.lineItemResponses = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRtbResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 3: + s.lineItemResponses && s.lineItemResponses.length || (s.lineItemResponses = []), s.lineItemResponses.push(c.ProtoRtbLineItem.decode(t, t.uint32())); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.lineItemResponses = []), t.lineItemResponses && t.lineItemResponses.length) { + e.lineItemResponses = []; + for (var s = 0; s < t.lineItemResponses.length; ++s) + e.lineItemResponses[s] = c.ProtoRtbLineItem.toObject(t.lineItemResponses[s], i); + } + return e; + }, t; + }(), c.ProtoRtbBid = function () { + function t(t) { + if (this.billingNoticeUrlList = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.winNoticeUrl = '', t.prototype.adQualityCheckUrl = '', t.prototype.vastTag = '', t.prototype.encryptedPrice = '', t.prototype.creativeId = '', t.prototype.seatId = '', t.prototype.adomain = '', t.prototype.syncedUser = !1, t.prototype.requestedFloorPrice = 0, t.prototype.floorPriceFactorIndex = 0, t.prototype.campaignId = '', t.prototype.width = 0, t.prototype.height = 0, t.prototype.billingNoticeUrlList = o.emptyArray, t.prototype.mime = 'text/html', t.prototype.gtkpbp = 0, t.prototype.successRate = 0, t.prototype.impressionTimeSpent = 0, t.prototype.bidRate = 0, t.prototype.dspId = '', t.prototype.cnxBidId = '', t.prototype.logAuctionInformation = !1, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRtbBid(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 2: + s.winNoticeUrl = t.string(); + break; + case 3: + s.adQualityCheckUrl = t.string(); + break; + case 4: + s.vastTag = t.string(); + break; + case 6: + s.encryptedPrice = t.string(); + break; + case 7: + s.creativeId = t.string(); + break; + case 8: + s.seatId = t.string(); + break; + case 9: + s.adomain = t.string(); + break; + case 10: + s.syncedUser = t.bool(); + break; + case 11: + s.requestedFloorPrice = t.double(); + break; + case 12: + s.floorPriceFactorIndex = t.int32(); + break; + case 13: + s.campaignId = t.string(); + break; + case 14: + s.width = t.int32(); + break; + case 15: + s.height = t.int32(); + break; + case 16: + s.billingNoticeUrlList && s.billingNoticeUrlList.length || (s.billingNoticeUrlList = []), s.billingNoticeUrlList.push(t.string()); + break; + case 17: + s.mime = t.string(); + break; + case 18: + s.gtkpbp = t.double(); + break; + case 19: + s.successRate = t.double(); + break; + case 20: + s.impressionTimeSpent = t.int32(); + break; + case 21: + s.bidRate = t.double(); + break; + case 22: + s.dspId = t.string(); + break; + case 23: + s.cnxBidId = t.string(); + break; + case 24: + s.logAuctionInformation = t.bool(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.billingNoticeUrlList = []), i.defaults && (e.winNoticeUrl = '', e.adQualityCheckUrl = '', e.vastTag = '', e.encryptedPrice = '', e.creativeId = '', e.seatId = '', e.adomain = '', e.syncedUser = !1, e.requestedFloorPrice = 0, e.floorPriceFactorIndex = 0, e.campaignId = '', e.width = 0, e.height = 0, e.mime = 'text/html', e.gtkpbp = 0, e.successRate = 0, e.impressionTimeSpent = 0, e.bidRate = 0, e.dspId = '', e.cnxBidId = '', e.logAuctionInformation = !1), null != t.winNoticeUrl && t.hasOwnProperty('winNoticeUrl') && (e.winNoticeUrl = t.winNoticeUrl), null != t.adQualityCheckUrl && t.hasOwnProperty('adQualityCheckUrl') && (e.adQualityCheckUrl = t.adQualityCheckUrl), null != t.vastTag && t.hasOwnProperty('vastTag') && (e.vastTag = t.vastTag), null != t.encryptedPrice && t.hasOwnProperty('encryptedPrice') && (e.encryptedPrice = t.encryptedPrice), null != t.creativeId && t.hasOwnProperty('creativeId') && (e.creativeId = t.creativeId), null != t.seatId && t.hasOwnProperty('seatId') && (e.seatId = t.seatId), null != t.adomain && t.hasOwnProperty('adomain') && (e.adomain = t.adomain), null != t.syncedUser && t.hasOwnProperty('syncedUser') && (e.syncedUser = t.syncedUser), null != t.requestedFloorPrice && t.hasOwnProperty('requestedFloorPrice') && (e.requestedFloorPrice = i.json && !isFinite(t.requestedFloorPrice) ? String(t.requestedFloorPrice) : t.requestedFloorPrice), null != t.floorPriceFactorIndex && t.hasOwnProperty('floorPriceFactorIndex') && (e.floorPriceFactorIndex = t.floorPriceFactorIndex), null != t.campaignId && t.hasOwnProperty('campaignId') && (e.campaignId = t.campaignId), null != t.width && t.hasOwnProperty('width') && (e.width = t.width), null != t.height && t.hasOwnProperty('height') && (e.height = t.height), t.billingNoticeUrlList && t.billingNoticeUrlList.length) { + e.billingNoticeUrlList = []; + for (var s = 0; s < t.billingNoticeUrlList.length; ++s) + e.billingNoticeUrlList[s] = t.billingNoticeUrlList[s]; + } + return null != t.mime && t.hasOwnProperty('mime') && (e.mime = t.mime), null != t.gtkpbp && t.hasOwnProperty('gtkpbp') && (e.gtkpbp = i.json && !isFinite(t.gtkpbp) ? String(t.gtkpbp) : t.gtkpbp), null != t.successRate && t.hasOwnProperty('successRate') && (e.successRate = i.json && !isFinite(t.successRate) ? String(t.successRate) : t.successRate), null != t.impressionTimeSpent && t.hasOwnProperty('impressionTimeSpent') && (e.impressionTimeSpent = t.impressionTimeSpent), null != t.bidRate && t.hasOwnProperty('bidRate') && (e.bidRate = i.json && !isFinite(t.bidRate) ? String(t.bidRate) : t.bidRate), null != t.dspId && t.hasOwnProperty('dspId') && (e.dspId = t.dspId), null != t.cnxBidId && t.hasOwnProperty('cnxBidId') && (e.cnxBidId = t.cnxBidId), null != t.logAuctionInformation && t.hasOwnProperty('logAuctionInformation') && (e.logAuctionInformation = t.logAuctionInformation), e; + }, t; + }(), c.ProtoRtbNoBid = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.connatixReason = 0, t.prototype.partnerReason = 0, t.prototype.syncedUser = !1, t.prototype.requestedFloorPrice = 0, t.prototype.floorPriceFactorIndex = 0, t.prototype.partnerCustomHeaders = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRtbNoBid(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.connatixReason = t.int32(); + break; + case 2: + s.partnerReason = t.int32(); + break; + case 3: + s.syncedUser = t.bool(); + break; + case 4: + s.requestedFloorPrice = t.double(); + break; + case 5: + s.floorPriceFactorIndex = t.int32(); + break; + case 6: + s.partnerCustomHeaders = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.connatixReason = i.enums === String ? 'RequestException' : 0, e.partnerReason = i.enums === String ? 'Unknown' : 0, e.syncedUser = !1, e.requestedFloorPrice = 0, e.floorPriceFactorIndex = 0, e.partnerCustomHeaders = ''), null != t.connatixReason && t.hasOwnProperty('connatixReason') && (e.connatixReason = i.enums === String ? c.ConnatixNoBidReasonEnum[t.connatixReason] : t.connatixReason), null != t.partnerReason && t.hasOwnProperty('partnerReason') && (e.partnerReason = i.enums === String ? c.PartnerNoBidReasonEnum[t.partnerReason] : t.partnerReason), null != t.syncedUser && t.hasOwnProperty('syncedUser') && (e.syncedUser = t.syncedUser), null != t.requestedFloorPrice && t.hasOwnProperty('requestedFloorPrice') && (e.requestedFloorPrice = i.json && !isFinite(t.requestedFloorPrice) ? String(t.requestedFloorPrice) : t.requestedFloorPrice), null != t.floorPriceFactorIndex && t.hasOwnProperty('floorPriceFactorIndex') && (e.floorPriceFactorIndex = t.floorPriceFactorIndex), null != t.partnerCustomHeaders && t.hasOwnProperty('partnerCustomHeaders') && (e.partnerCustomHeaders = t.partnerCustomHeaders), e; + }, t; + }(), c.ProtoRtbLineItem = function () { + function t(t) { + if (this.bids = [], this.noBids = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.id = '', t.prototype.cachedFloorPrice = 0, t.prototype.bids = o.emptyArray, t.prototype.noBids = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRtbLineItem(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.id = t.string(); + break; + case 2: + s.cachedFloorPrice = t.double(); + break; + case 3: + s.bids && s.bids.length || (s.bids = []), s.bids.push(c.ProtoRtbBid.decode(t, t.uint32())); + break; + case 4: + s.noBids && s.noBids.length || (s.noBids = []), s.noBids.push(c.ProtoRtbNoBid.decode(t, t.uint32())); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.bids = [], e.noBids = []), i.defaults && (e.id = '', e.cachedFloorPrice = 0), null != t.id && t.hasOwnProperty('id') && (e.id = t.id), null != t.cachedFloorPrice && t.hasOwnProperty('cachedFloorPrice') && (e.cachedFloorPrice = i.json && !isFinite(t.cachedFloorPrice) ? String(t.cachedFloorPrice) : t.cachedFloorPrice), t.bids && t.bids.length) { + e.bids = []; + for (var s = 0; s < t.bids.length; ++s) + e.bids[s] = c.ProtoRtbBid.toObject(t.bids[s], i); + } + if (t.noBids && t.noBids.length) { + e.noBids = []; + for (s = 0; s < t.noBids.length; ++s) + e.noBids[s] = c.ProtoRtbNoBid.toObject(t.noBids[s], i); + } + return e; + }, t; + }(), c.ProtoSupplyChain = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.businessDomain = '', t.prototype.supplyChainId = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoSupplyChain(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.businessDomain = t.string(); + break; + case 3: + s.supplyChainId = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.businessDomain = '', e.supplyChainId = ''), null != t.businessDomain && t.hasOwnProperty('businessDomain') && (e.businessDomain = t.businessDomain), null != t.supplyChainId && t.hasOwnProperty('supplyChainId') && (e.supplyChainId = t.supplyChainId), e; + }, t; + }(), c.ProtoAdClickTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.type = 1, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(18).string(t.mediaGuid), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(26).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(34).string(t.advertiserLineItemId), null != t.type && Object.hasOwnProperty.call(t, 'type') && i.uint32(40).int32(t.type), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoAdClickTrackingRequest) + return t; + var i = new c.ProtoAdClickTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoAdClickTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), t.type) { + case 'AdClick': + case 1: + i.type = 1; + break; + case 'AdClickThrough': + case 2: + i.type = 2; + break; + case 'AdSkipClick': + case 3: + i.type = 3; + break; + case 'VolumeClick': + case 4: + i.type = 4; + break; + case 'PauseClick': + case 5: + i.type = 5; + break; + case 'PlayClick': + case 6: + i.type = 6; + break; + case 'FullScreenClick': + case 7: + i.type = 7; + break; + case 'MuteClick': + case 8: + i.type = 8; + break; + case 'UnmuteClick': + case 9: + i.type = 9; + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoAdOpportunityRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.sessionId = '', t.prototype.trackingRequestMeta = null, t.prototype.adBreak = 0, t.prototype.playerWidth = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.sessionId && Object.hasOwnProperty.call(t, 'sessionId') && i.uint32(10).string(t.sessionId), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(18).fork()).ldelim(), null != t.adBreak && Object.hasOwnProperty.call(t, 'adBreak') && i.uint32(24).int32(t.adBreak), null != t.playerWidth && Object.hasOwnProperty.call(t, 'playerWidth') && i.uint32(32).int32(t.playerWidth), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoAdOpportunityRequest) + return t; + var i = new c.ProtoAdOpportunityRequest(); + if (null != t.sessionId && (i.sessionId = String(t.sessionId)), null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoAdOpportunityRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (t.adBreak) { + case 'None': + case 0: + i.adBreak = 0; + break; + case 'PreRoll': + case 1: + i.adBreak = 1; + break; + case 'MidRoll': + case 2: + i.adBreak = 2; + break; + case 'PostRoll': + case 3: + i.adBreak = 3; + } + return null != t.playerWidth && (i.playerWidth = 0 | t.playerWidth), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoAuctionInfoRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.cnxBidId = '', t.prototype.auctionInformation = null, t.prototype.auctionLossReason = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.cnxBidId && Object.hasOwnProperty.call(t, 'cnxBidId') && i.uint32(10).string(t.cnxBidId), null != t.auctionInformation && Object.hasOwnProperty.call(t, 'auctionInformation') && c.ProtoAuctionInformation.encode(t.auctionInformation, i.uint32(18).fork()).ldelim(), null != t.auctionLossReason && Object.hasOwnProperty.call(t, 'auctionLossReason') && i.uint32(24).int32(t.auctionLossReason), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoAuctionInfoRequest(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.cnxBidId = t.string(); + break; + case 2: + s.auctionInformation = c.ProtoAuctionInformation.decode(t, t.uint32()); + break; + case 3: + s.auctionLossReason = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoAuctionInfoRequest) + return t; + var i = new c.ProtoAuctionInfoRequest(); + if (null != t.cnxBidId && (i.cnxBidId = String(t.cnxBidId)), null != t.auctionInformation) { + if ('object' != typeof t.auctionInformation) + throw TypeError('.ProtoAuctionInfoRequest.auctionInformation: object expected'); + i.auctionInformation = c.ProtoAuctionInformation.fromObject(t.auctionInformation); + } + switch (t.auctionLossReason) { + case 'TargetingMismatch': + case 0: + i.auctionLossReason = 0; + break; + case 'CompetitorPriority': + case 1: + i.auctionLossReason = 1; + break; + case 'AdOpportunityEnd': + case 2: + i.auctionLossReason = 2; + } + return i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.cnxBidId = '', e.auctionInformation = null, e.auctionLossReason = i.enums === String ? 'TargetingMismatch' : 0), null != t.cnxBidId && t.hasOwnProperty('cnxBidId') && (e.cnxBidId = t.cnxBidId), null != t.auctionInformation && t.hasOwnProperty('auctionInformation') && (e.auctionInformation = c.ProtoAuctionInformation.toObject(t.auctionInformation, i)), null != t.auctionLossReason && t.hasOwnProperty('auctionLossReason') && (e.auctionLossReason = i.enums === String ? c.ProtoAuctionLossReasonEnum[t.auctionLossReason] : t.auctionLossReason), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoAuctionInformation = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.highestObfuscatedBidPrice = 0, t.prototype.secondHighestObfuscatedBidPrice = 0, t.prototype.bidDensity = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.highestObfuscatedBidPrice && Object.hasOwnProperty.call(t, 'highestObfuscatedBidPrice') && i.uint32(9).double(t.highestObfuscatedBidPrice), null != t.secondHighestObfuscatedBidPrice && Object.hasOwnProperty.call(t, 'secondHighestObfuscatedBidPrice') && i.uint32(17).double(t.secondHighestObfuscatedBidPrice), null != t.bidDensity && Object.hasOwnProperty.call(t, 'bidDensity') && i.uint32(24).int32(t.bidDensity), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoAuctionInformation(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.highestObfuscatedBidPrice = t.double(); + break; + case 2: + s.secondHighestObfuscatedBidPrice = t.double(); + break; + case 3: + s.bidDensity = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoAuctionInformation) + return t; + var i = new c.ProtoAuctionInformation(); + return null != t.highestObfuscatedBidPrice && (i.highestObfuscatedBidPrice = Number(t.highestObfuscatedBidPrice)), null != t.secondHighestObfuscatedBidPrice && (i.secondHighestObfuscatedBidPrice = Number(t.secondHighestObfuscatedBidPrice)), null != t.bidDensity && (i.bidDensity = 0 | t.bidDensity), i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.highestObfuscatedBidPrice = 0, e.secondHighestObfuscatedBidPrice = 0, e.bidDensity = 0), null != t.highestObfuscatedBidPrice && t.hasOwnProperty('highestObfuscatedBidPrice') && (e.highestObfuscatedBidPrice = i.json && !isFinite(t.highestObfuscatedBidPrice) ? String(t.highestObfuscatedBidPrice) : t.highestObfuscatedBidPrice), null != t.secondHighestObfuscatedBidPrice && t.hasOwnProperty('secondHighestObfuscatedBidPrice') && (e.secondHighestObfuscatedBidPrice = i.json && !isFinite(t.secondHighestObfuscatedBidPrice) ? String(t.secondHighestObfuscatedBidPrice) : t.secondHighestObfuscatedBidPrice), null != t.bidDensity && t.hasOwnProperty('bidDensity') && (e.bidDensity = t.bidDensity), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoPrebid = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.syncedUser = !1, t.prototype.timeSpent = 0, t.prototype.reason = 0, t.prototype.rtbRequestNumber = 0, t.prototype.partnerReason = 0, t.prototype.requestedFloorPrice = 0, t.prototype.partnerCustomHeaders = '', t.prototype.prebidJsBidderName = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(10).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(18).string(t.advertiserLineItemId), null != t.syncedUser && Object.hasOwnProperty.call(t, 'syncedUser') && i.uint32(24).bool(t.syncedUser), null != t.timeSpent && Object.hasOwnProperty.call(t, 'timeSpent') && i.uint32(32).int32(t.timeSpent), null != t.reason && Object.hasOwnProperty.call(t, 'reason') && i.uint32(40).int32(t.reason), null != t.rtbRequestNumber && Object.hasOwnProperty.call(t, 'rtbRequestNumber') && i.uint32(48).int32(t.rtbRequestNumber), null != t.partnerReason && Object.hasOwnProperty.call(t, 'partnerReason') && i.uint32(56).int32(t.partnerReason), null != t.requestedFloorPrice && Object.hasOwnProperty.call(t, 'requestedFloorPrice') && i.uint32(65).double(t.requestedFloorPrice), null != t.partnerCustomHeaders && Object.hasOwnProperty.call(t, 'partnerCustomHeaders') && i.uint32(74).string(t.partnerCustomHeaders), null != t.prebidJsBidderName && Object.hasOwnProperty.call(t, 'prebidJsBidderName') && i.uint32(98).string(t.prebidJsBidderName), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoPrebid) + return t; + var i = new c.ProtoPrebid(); + switch (null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), null != t.syncedUser && (i.syncedUser = Boolean(t.syncedUser)), null != t.timeSpent && (i.timeSpent = 0 | t.timeSpent), t.reason) { + case 'RequestException': + case 0: + i.reason = 0; + break; + case 'Timeout': + case 1: + i.reason = 1; + break; + case 'EmptyResponse': + case 2: + i.reason = 2; + break; + case 'InvalidResponse': + case 3: + i.reason = 3; + break; + case 'NoBid': + case 4: + i.reason = 4; + break; + case 'BidBelowFloor': + case 5: + i.reason = 5; + break; + case 'DealIdMismatch': + case 6: + i.reason = 6; + break; + case 'CsInvalidResponse': + case 7: + i.reason = 7; + break; + case 'CsRequestException': + case 8: + i.reason = 8; + break; + case 'CsEmptyResponse': + case 9: + i.reason = 9; + break; + case 'NoLibInPage': + case 11: + i.reason = 11; + } + switch (null != t.rtbRequestNumber && (i.rtbRequestNumber = 0 | t.rtbRequestNumber), t.partnerReason) { + case 'Unknown': + case 0: + i.partnerReason = 0; + break; + case 'TechnicalError': + case 1: + i.partnerReason = 1; + break; + case 'InvalidRequest': + case 2: + i.partnerReason = 2; + break; + case 'KnownWebSpider': + case 3: + i.partnerReason = 3; + break; + case 'SuspectedNonHumanTraffic': + case 4: + i.partnerReason = 4; + break; + case 'CloudIP': + case 5: + i.partnerReason = 5; + break; + case 'UnsupportedDevice': + case 6: + i.partnerReason = 6; + break; + case 'BlockedPublisher': + case 7: + i.partnerReason = 7; + break; + case 'UnmatchedUser': + case 8: + i.partnerReason = 8; + break; + case 'DailyReaderCapMet': + case 9: + i.partnerReason = 9; + break; + case 'DailyDomainCapMet': + case 10: + i.partnerReason = 10; + } + return null != t.requestedFloorPrice && (i.requestedFloorPrice = Number(t.requestedFloorPrice)), null != t.partnerCustomHeaders && (i.partnerCustomHeaders = String(t.partnerCustomHeaders)), null != t.prebidJsBidderName && (i.prebidJsBidderName = String(t.prebidJsBidderName)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoBid = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.syncedUser = !1, t.prototype.timeSpent = 0, t.prototype.rtbRequestNumber = 0, t.prototype.creativeId = '', t.prototype.rtbSeatId = '', t.prototype.rtbAdomain = '', t.prototype.encryptedPrice = '', t.prototype.requestedFloorPrice = 0, t.prototype.prebidJsBidderName = '', t.prototype.customClientPrice = 0, t.prototype.dspId = '', t.prototype.cnxBidId = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(10).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(18).string(t.advertiserLineItemId), null != t.syncedUser && Object.hasOwnProperty.call(t, 'syncedUser') && i.uint32(24).bool(t.syncedUser), null != t.timeSpent && Object.hasOwnProperty.call(t, 'timeSpent') && i.uint32(32).int32(t.timeSpent), null != t.rtbRequestNumber && Object.hasOwnProperty.call(t, 'rtbRequestNumber') && i.uint32(40).int32(t.rtbRequestNumber), null != t.creativeId && Object.hasOwnProperty.call(t, 'creativeId') && i.uint32(50).string(t.creativeId), null != t.rtbSeatId && Object.hasOwnProperty.call(t, 'rtbSeatId') && i.uint32(58).string(t.rtbSeatId), null != t.rtbAdomain && Object.hasOwnProperty.call(t, 'rtbAdomain') && i.uint32(66).string(t.rtbAdomain), null != t.encryptedPrice && Object.hasOwnProperty.call(t, 'encryptedPrice') && i.uint32(74).string(t.encryptedPrice), null != t.requestedFloorPrice && Object.hasOwnProperty.call(t, 'requestedFloorPrice') && i.uint32(81).double(t.requestedFloorPrice), null != t.prebidJsBidderName && Object.hasOwnProperty.call(t, 'prebidJsBidderName') && i.uint32(106).string(t.prebidJsBidderName), null != t.customClientPrice && Object.hasOwnProperty.call(t, 'customClientPrice') && i.uint32(113).double(t.customClientPrice), null != t.dspId && Object.hasOwnProperty.call(t, 'dspId') && i.uint32(122).string(t.dspId), null != t.cnxBidId && Object.hasOwnProperty.call(t, 'cnxBidId') && i.uint32(130).string(t.cnxBidId), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoBid) + return t; + var i = new c.ProtoBid(); + return null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), null != t.syncedUser && (i.syncedUser = Boolean(t.syncedUser)), null != t.timeSpent && (i.timeSpent = 0 | t.timeSpent), null != t.rtbRequestNumber && (i.rtbRequestNumber = 0 | t.rtbRequestNumber), null != t.creativeId && (i.creativeId = String(t.creativeId)), null != t.rtbSeatId && (i.rtbSeatId = String(t.rtbSeatId)), null != t.rtbAdomain && (i.rtbAdomain = String(t.rtbAdomain)), null != t.encryptedPrice && (i.encryptedPrice = String(t.encryptedPrice)), null != t.requestedFloorPrice && (i.requestedFloorPrice = Number(t.requestedFloorPrice)), null != t.prebidJsBidderName && (i.prebidJsBidderName = String(t.prebidJsBidderName)), null != t.customClientPrice && (i.customClientPrice = Number(t.customClientPrice)), null != t.dspId && (i.dspId = String(t.dspId)), null != t.cnxBidId && (i.cnxBidId = String(t.cnxBidId)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoPostBid = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.syncedUser = !1, t.prototype.timeSpent = 0, t.prototype.error = '', t.prototype.loaded = !1, t.prototype.creativeId = '', t.prototype.rtbSeatId = '', t.prototype.rtbAdomain = '', t.prototype.adsourceType = 0, t.prototype.vastMediaType = '', t.prototype.adPodSlotPosition = 0, t.prototype.prebidJsBidderName = '', t.prototype.dspId = '', t.prototype.cnxBidId = '', t.prototype.winToAdLoadedTime = 0, t.prototype.auctionInformation = null, t.prototype.auctionPostbidReason = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(10).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(18).string(t.advertiserLineItemId), null != t.syncedUser && Object.hasOwnProperty.call(t, 'syncedUser') && i.uint32(24).bool(t.syncedUser), null != t.timeSpent && Object.hasOwnProperty.call(t, 'timeSpent') && i.uint32(32).int32(t.timeSpent), null != t.error && Object.hasOwnProperty.call(t, 'error') && i.uint32(42).string(t.error), null != t.loaded && Object.hasOwnProperty.call(t, 'loaded') && i.uint32(48).bool(t.loaded), null != t.creativeId && Object.hasOwnProperty.call(t, 'creativeId') && i.uint32(58).string(t.creativeId), null != t.rtbSeatId && Object.hasOwnProperty.call(t, 'rtbSeatId') && i.uint32(66).string(t.rtbSeatId), null != t.rtbAdomain && Object.hasOwnProperty.call(t, 'rtbAdomain') && i.uint32(74).string(t.rtbAdomain), null != t.adsourceType && Object.hasOwnProperty.call(t, 'adsourceType') && i.uint32(80).int32(t.adsourceType), null != t.vastMediaType && Object.hasOwnProperty.call(t, 'vastMediaType') && i.uint32(90).string(t.vastMediaType), null != t.adPodSlotPosition && Object.hasOwnProperty.call(t, 'adPodSlotPosition') && i.uint32(96).int32(t.adPodSlotPosition), null != t.prebidJsBidderName && Object.hasOwnProperty.call(t, 'prebidJsBidderName') && i.uint32(106).string(t.prebidJsBidderName), null != t.dspId && Object.hasOwnProperty.call(t, 'dspId') && i.uint32(114).string(t.dspId), null != t.cnxBidId && Object.hasOwnProperty.call(t, 'cnxBidId') && i.uint32(122).string(t.cnxBidId), null != t.winToAdLoadedTime && Object.hasOwnProperty.call(t, 'winToAdLoadedTime') && i.uint32(128).int32(t.winToAdLoadedTime), null != t.auctionInformation && Object.hasOwnProperty.call(t, 'auctionInformation') && c.ProtoAuctionInformation.encode(t.auctionInformation, i.uint32(146).fork()).ldelim(), null != t.auctionPostbidReason && Object.hasOwnProperty.call(t, 'auctionPostbidReason') && i.uint32(152).int32(t.auctionPostbidReason), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoPostBid) + return t; + var i = new c.ProtoPostBid(); + switch (null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), null != t.syncedUser && (i.syncedUser = Boolean(t.syncedUser)), null != t.timeSpent && (i.timeSpent = 0 | t.timeSpent), null != t.error && (i.error = String(t.error)), null != t.loaded && (i.loaded = Boolean(t.loaded)), null != t.creativeId && (i.creativeId = String(t.creativeId)), null != t.rtbSeatId && (i.rtbSeatId = String(t.rtbSeatId)), null != t.rtbAdomain && (i.rtbAdomain = String(t.rtbAdomain)), t.adsourceType) { + case 'Unknown': + case 0: + i.adsourceType = 0; + break; + case 'Vpaid': + case 1: + i.adsourceType = 1; + break; + case 'VastMedia': + case 2: + i.adsourceType = 2; + break; + case 'CnxMedia': + case 3: + i.adsourceType = 3; + break; + case 'Jw': + case 4: + i.adsourceType = 4; + break; + case 'Ima': + case 5: + i.adsourceType = 5; + break; + case 'AOL': + case 6: + i.adsourceType = 6; + } + if (null != t.vastMediaType && (i.vastMediaType = String(t.vastMediaType)), null != t.adPodSlotPosition && (i.adPodSlotPosition = 0 | t.adPodSlotPosition), null != t.prebidJsBidderName && (i.prebidJsBidderName = String(t.prebidJsBidderName)), null != t.dspId && (i.dspId = String(t.dspId)), null != t.cnxBidId && (i.cnxBidId = String(t.cnxBidId)), null != t.winToAdLoadedTime && (i.winToAdLoadedTime = 0 | t.winToAdLoadedTime), null != t.auctionInformation) { + if ('object' != typeof t.auctionInformation) + throw TypeError('.ProtoPostBid.auctionInformation: object expected'); + i.auctionInformation = c.ProtoAuctionInformation.fromObject(t.auctionInformation); + } + switch (t.auctionPostbidReason) { + case 'CreativeError': + case 0: + i.auctionPostbidReason = 0; + break; + case 'SDKFailure': + case 1: + i.auctionPostbidReason = 1; + break; + case 'UnsupportedMedia': + case 2: + i.auctionPostbidReason = 2; + break; + case 'TargetingMismatch': + case 3: + i.auctionPostbidReason = 3; + break; + case 'PlayerError': + case 4: + i.auctionPostbidReason = 4; + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoBidTrackingsRequest = function () { + function t(t) { + if (this.prebids = [], this.bids = [], this.postBids = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.prebids = o.emptyArray, t.prototype.bids = o.emptyArray, t.prototype.postBids = o.emptyArray, t.prototype.logEveryting = !1, t.prototype.hasGdprConsentPayload = !1, t.prototype.gdprConsentMode = 0, t.prototype.useExploration = !1, t.encode = function (t, i) { + if (i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(18).string(t.mediaGuid), null != t.prebids && t.prebids.length) + for (var e = 0; e < t.prebids.length; ++e) + c.ProtoPrebid.encode(t.prebids[e], i.uint32(34).fork()).ldelim(); + if (null != t.bids && t.bids.length) + for (e = 0; e < t.bids.length; ++e) + c.ProtoBid.encode(t.bids[e], i.uint32(42).fork()).ldelim(); + if (null != t.postBids && t.postBids.length) + for (e = 0; e < t.postBids.length; ++e) + c.ProtoPostBid.encode(t.postBids[e], i.uint32(50).fork()).ldelim(); + return null != t.logEveryting && Object.hasOwnProperty.call(t, 'logEveryting') && i.uint32(56).bool(t.logEveryting), null != t.hasGdprConsentPayload && Object.hasOwnProperty.call(t, 'hasGdprConsentPayload') && i.uint32(80).bool(t.hasGdprConsentPayload), null != t.gdprConsentMode && Object.hasOwnProperty.call(t, 'gdprConsentMode') && i.uint32(88).int32(t.gdprConsentMode), null != t.useExploration && Object.hasOwnProperty.call(t, 'useExploration') && i.uint32(96).bool(t.useExploration), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoBidTrackingsRequest) + return t; + var i = new c.ProtoBidTrackingsRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoBidTrackingsRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + if (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), t.prebids) { + if (!Array.isArray(t.prebids)) + throw TypeError('.ProtoBidTrackingsRequest.prebids: array expected'); + i.prebids = []; + for (var e = 0; e < t.prebids.length; ++e) { + if ('object' != typeof t.prebids[e]) + throw TypeError('.ProtoBidTrackingsRequest.prebids: object expected'); + i.prebids[e] = c.ProtoPrebid.fromObject(t.prebids[e]); + } + } + if (t.bids) { + if (!Array.isArray(t.bids)) + throw TypeError('.ProtoBidTrackingsRequest.bids: array expected'); + i.bids = []; + for (e = 0; e < t.bids.length; ++e) { + if ('object' != typeof t.bids[e]) + throw TypeError('.ProtoBidTrackingsRequest.bids: object expected'); + i.bids[e] = c.ProtoBid.fromObject(t.bids[e]); + } + } + if (t.postBids) { + if (!Array.isArray(t.postBids)) + throw TypeError('.ProtoBidTrackingsRequest.postBids: array expected'); + i.postBids = []; + for (e = 0; e < t.postBids.length; ++e) { + if ('object' != typeof t.postBids[e]) + throw TypeError('.ProtoBidTrackingsRequest.postBids: object expected'); + i.postBids[e] = c.ProtoPostBid.fromObject(t.postBids[e]); + } + } + switch (null != t.logEveryting && (i.logEveryting = Boolean(t.logEveryting)), null != t.hasGdprConsentPayload && (i.hasGdprConsentPayload = Boolean(t.hasGdprConsentPayload)), t.gdprConsentMode) { + case 'Unknown': + case 0: + i.gdprConsentMode = 0; + break; + case 'NoCmp': + case 1: + i.gdprConsentMode = 1; + break; + case 'NoConsent': + case 2: + i.gdprConsentMode = 2; + break; + case 'NoConnatixConsent': + case 3: + i.gdprConsentMode = 3; + break; + case 'NotAllDemandConsent': + case 4: + i.gdprConsentMode = 4; + break; + case 'AllGood': + case 5: + i.gdprConsentMode = 5; + } + return null != t.useExploration && (i.useExploration = Boolean(t.useExploration)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoHeavyAdTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.advertiserLineItemId = '', t.prototype.heavyAdBlockTypeEnum = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(18).string(t.advertiserLineItemId), null != t.heavyAdBlockTypeEnum && Object.hasOwnProperty.call(t, 'heavyAdBlockTypeEnum') && i.uint32(24).int32(t.heavyAdBlockTypeEnum), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoHeavyAdTrackingRequest) + return t; + var i = new c.ProtoHeavyAdTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoHeavyAdTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), t.heavyAdBlockTypeEnum) { + case 'Global': + case 0: + i.heavyAdBlockTypeEnum = 0; + break; + case 'Script': + case 1: + i.heavyAdBlockTypeEnum = 1; + break; + case 'VpaidIframe': + case 2: + i.heavyAdBlockTypeEnum = 2; + break; + case 'OverlayIframe': + case 3: + i.heavyAdBlockTypeEnum = 3; + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoMediaClickTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.type = 0, t.prototype.clickUrl = '', t.prototype.slideTitle = '', t.prototype.slideNumber = 0, t.prototype.slideMediaType = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(18).string(t.mediaGuid), null != t.type && Object.hasOwnProperty.call(t, 'type') && i.uint32(24).int32(t.type), null != t.clickUrl && Object.hasOwnProperty.call(t, 'clickUrl') && i.uint32(34).string(t.clickUrl), null != t.slideTitle && Object.hasOwnProperty.call(t, 'slideTitle') && i.uint32(42).string(t.slideTitle), null != t.slideNumber && Object.hasOwnProperty.call(t, 'slideNumber') && i.uint32(48).int32(t.slideNumber), null != t.slideMediaType && Object.hasOwnProperty.call(t, 'slideMediaType') && i.uint32(56).int32(t.slideMediaType), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoMediaClickTrackingRequest) + return t; + var i = new c.ProtoMediaClickTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoMediaClickTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), t.type) { + case 'Click': + case 0: + i.type = 0; + break; + case 'UrlClick': + case 1: + i.type = 1; + break; + case 'VolumeClick': + case 2: + i.type = 2; + break; + case 'PlayClick': + case 3: + i.type = 3; + break; + case 'PauseClick': + case 4: + i.type = 4; + break; + case 'NextClick': + case 5: + i.type = 5; + break; + case 'PreviousClick': + case 6: + i.type = 6; + break; + case 'MuteClick': + case 7: + i.type = 7; + break; + case 'UnmuteClick': + case 8: + i.type = 8; + break; + case 'CloseClick': + case 9: + i.type = 9; + break; + case 'ScrollClick': + case 10: + i.type = 10; + break; + case 'GalleryClick': + case 11: + i.type = 11; + break; + case 'SubtitleClick': + case 12: + i.type = 12; + break; + case 'FullScreenClick': + case 13: + i.type = 13; + break; + case 'ExitFullScreenClick': + case 14: + i.type = 14; + } + switch (null != t.clickUrl && (i.clickUrl = String(t.clickUrl)), null != t.slideTitle && (i.slideTitle = String(t.slideTitle)), null != t.slideNumber && (i.slideNumber = 0 | t.slideNumber), t.slideMediaType) { + case 'Image': + case 0: + i.slideMediaType = 0; + break; + case 'Video': + case 1: + i.slideMediaType = 1; + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoMediaTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.quartile = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(18).string(t.mediaGuid), null != t.quartile && Object.hasOwnProperty.call(t, 'quartile') && i.uint32(32).int32(t.quartile), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoMediaTrackingRequest) + return t; + var i = new c.ProtoMediaTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoMediaTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), t.quartile) { + case 'Start': + case 0: + i.quartile = 0; + break; + case 'First': + case 1: + i.quartile = 1; + break; + case 'Second': + case 2: + i.quartile = 2; + break; + case 'Third': + case 3: + i.quartile = 3; + break; + case 'Fourth': + case 4: + i.quartile = 4; + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoSessionAdBlockerRequest = function () { + function t(t) { + if (this.dynamicElkFieldsValues = {}, t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.adBlockDetectionType = 0, t.prototype.dynamicElkFieldsValues = o.emptyObject, t.encode = function (t, i) { + if (i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.adBlockDetectionType && Object.hasOwnProperty.call(t, 'adBlockDetectionType') && i.uint32(16).int32(t.adBlockDetectionType), null != t.dynamicElkFieldsValues && Object.hasOwnProperty.call(t, 'dynamicElkFieldsValues')) + for (var e = Object.keys(t.dynamicElkFieldsValues), s = 0; s < e.length; ++s) + i.uint32(802).fork().uint32(10).string(e[s]).uint32(18).string(t.dynamicElkFieldsValues[e[s]]).ldelim(); + return i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoSessionAdBlockerRequest) + return t; + var i = new c.ProtoSessionAdBlockerRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoSessionAdBlockerRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (t.adBlockDetectionType) { + case 'Banner': + case 0: + i.adBlockDetectionType = 0; + break; + case 'Network': + case 1: + i.adBlockDetectionType = 1; + } + if (t.dynamicElkFieldsValues) { + if ('object' != typeof t.dynamicElkFieldsValues) + throw TypeError('.ProtoSessionAdBlockerRequest.dynamicElkFieldsValues: object expected'); + i.dynamicElkFieldsValues = {}; + for (var e = Object.keys(t.dynamicElkFieldsValues), s = 0; s < e.length; ++s) + i.dynamicElkFieldsValues[e[s]] = String(t.dynamicElkFieldsValues[e[s]]); + } + return i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoSessionTimeTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.timePlayed = 0, t.prototype.timePlayedInView = 0, t.prototype.sessionTime = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.timePlayed && Object.hasOwnProperty.call(t, 'timePlayed') && i.uint32(16).int32(t.timePlayed), null != t.timePlayedInView && Object.hasOwnProperty.call(t, 'timePlayedInView') && i.uint32(24).int32(t.timePlayedInView), null != t.sessionTime && Object.hasOwnProperty.call(t, 'sessionTime') && i.uint32(32).int32(t.sessionTime), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoSessionTimeTrackingRequest) + return t; + var i = new c.ProtoSessionTimeTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoSessionTimeTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + return null != t.timePlayed && (i.timePlayed = 0 | t.timePlayed), null != t.timePlayedInView && (i.timePlayedInView = 0 | t.timePlayedInView), null != t.sessionTime && (i.sessionTime = 0 | t.sessionTime), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoTrackingRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.hasAdBlocker = !1, t.prototype.bundleName = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.hasAdBlocker && Object.hasOwnProperty.call(t, 'hasAdBlocker') && i.uint32(32).bool(t.hasAdBlocker), null != t.bundleName && Object.hasOwnProperty.call(t, 'bundleName') && i.uint32(42).string(t.bundleName), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoTrackingRequest) + return t; + var i = new c.ProtoTrackingRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoTrackingRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + return null != t.hasAdBlocker && (i.hasAdBlocker = Boolean(t.hasAdBlocker)), null != t.bundleName && (i.bundleName = String(t.bundleName)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoTrackingResponse = function () { + function t(t) { + if (this.platformCappedLineItemIdList = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.errorMessage = '', t.prototype.platformCappedLineItemIdList = o.emptyArray, t.prototype.impressionRevenue = 0, t.prototype.adServerLineItemName = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoTrackingResponse(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.errorMessage = t.string(); + break; + case 2: + s.platformCappedLineItemIdList && s.platformCappedLineItemIdList.length || (s.platformCappedLineItemIdList = []), s.platformCappedLineItemIdList.push(t.string()); + break; + case 3: + s.impressionRevenue = t.double(); + break; + case 4: + s.adServerLineItemName = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.platformCappedLineItemIdList = []), i.defaults && (e.errorMessage = '', e.impressionRevenue = 0, e.adServerLineItemName = ''), null != t.errorMessage && t.hasOwnProperty('errorMessage') && (e.errorMessage = t.errorMessage), t.platformCappedLineItemIdList && t.platformCappedLineItemIdList.length) { + e.platformCappedLineItemIdList = []; + for (var s = 0; s < t.platformCappedLineItemIdList.length; ++s) + e.platformCappedLineItemIdList[s] = t.platformCappedLineItemIdList[s]; + } + return null != t.impressionRevenue && t.hasOwnProperty('impressionRevenue') && (e.impressionRevenue = i.json && !isFinite(t.impressionRevenue) ? String(t.impressionRevenue) : t.impressionRevenue), null != t.adServerLineItemName && t.hasOwnProperty('adServerLineItemName') && (e.adServerLineItemName = t.adServerLineItemName), e; + }, t; + }(), c.ProtoVideoAdImpressionRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.syncedUser = !1, t.prototype.timeSpent = 0, t.prototype.encryptedPrice = '', t.prototype.creativeId = '', t.prototype.rtbSeatId = '', t.prototype.rtbAdomain = '', t.prototype.customClientPrice = 0, t.prototype.adsourceType = 0, t.prototype.vastMediaType = '', t.prototype.adPodSlotPosition = 0, t.prototype.prebidJsBidderName = '', t.prototype.dspId = '', t.prototype.cnxBidId = '', t.prototype.winToAdLoadedTime = 0, t.prototype.startAdToImpressionTime = 0, t.prototype.declaredDuration = 0, t.prototype.impressionDuration = 0, t.prototype.useExploration = !1, t.prototype.auctionInformation = null, t.prototype.playerWidth = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(26).string(t.mediaGuid), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(42).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(50).string(t.advertiserLineItemId), null != t.syncedUser && Object.hasOwnProperty.call(t, 'syncedUser') && i.uint32(56).bool(t.syncedUser), null != t.timeSpent && Object.hasOwnProperty.call(t, 'timeSpent') && i.uint32(64).int32(t.timeSpent), null != t.encryptedPrice && Object.hasOwnProperty.call(t, 'encryptedPrice') && i.uint32(74).string(t.encryptedPrice), null != t.creativeId && Object.hasOwnProperty.call(t, 'creativeId') && i.uint32(82).string(t.creativeId), null != t.rtbSeatId && Object.hasOwnProperty.call(t, 'rtbSeatId') && i.uint32(90).string(t.rtbSeatId), null != t.rtbAdomain && Object.hasOwnProperty.call(t, 'rtbAdomain') && i.uint32(98).string(t.rtbAdomain), null != t.customClientPrice && Object.hasOwnProperty.call(t, 'customClientPrice') && i.uint32(105).double(t.customClientPrice), null != t.adsourceType && Object.hasOwnProperty.call(t, 'adsourceType') && i.uint32(112).int32(t.adsourceType), null != t.vastMediaType && Object.hasOwnProperty.call(t, 'vastMediaType') && i.uint32(122).string(t.vastMediaType), null != t.adPodSlotPosition && Object.hasOwnProperty.call(t, 'adPodSlotPosition') && i.uint32(144).int32(t.adPodSlotPosition), null != t.prebidJsBidderName && Object.hasOwnProperty.call(t, 'prebidJsBidderName') && i.uint32(154).string(t.prebidJsBidderName), null != t.dspId && Object.hasOwnProperty.call(t, 'dspId') && i.uint32(162).string(t.dspId), null != t.cnxBidId && Object.hasOwnProperty.call(t, 'cnxBidId') && i.uint32(170).string(t.cnxBidId), null != t.winToAdLoadedTime && Object.hasOwnProperty.call(t, 'winToAdLoadedTime') && i.uint32(176).int32(t.winToAdLoadedTime), null != t.startAdToImpressionTime && Object.hasOwnProperty.call(t, 'startAdToImpressionTime') && i.uint32(184).int32(t.startAdToImpressionTime), null != t.declaredDuration && Object.hasOwnProperty.call(t, 'declaredDuration') && i.uint32(193).double(t.declaredDuration), null != t.impressionDuration && Object.hasOwnProperty.call(t, 'impressionDuration') && i.uint32(201).double(t.impressionDuration), null != t.useExploration && Object.hasOwnProperty.call(t, 'useExploration') && i.uint32(208).bool(t.useExploration), null != t.auctionInformation && Object.hasOwnProperty.call(t, 'auctionInformation') && c.ProtoAuctionInformation.encode(t.auctionInformation, i.uint32(218).fork()).ldelim(), null != t.playerWidth && Object.hasOwnProperty.call(t, 'playerWidth') && i.uint32(224).int32(t.playerWidth), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoVideoAdImpressionRequest) + return t; + var i = new c.ProtoVideoAdImpressionRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoVideoAdImpressionRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), null != t.syncedUser && (i.syncedUser = Boolean(t.syncedUser)), null != t.timeSpent && (i.timeSpent = 0 | t.timeSpent), null != t.encryptedPrice && (i.encryptedPrice = String(t.encryptedPrice)), null != t.creativeId && (i.creativeId = String(t.creativeId)), null != t.rtbSeatId && (i.rtbSeatId = String(t.rtbSeatId)), null != t.rtbAdomain && (i.rtbAdomain = String(t.rtbAdomain)), null != t.customClientPrice && (i.customClientPrice = Number(t.customClientPrice)), t.adsourceType) { + case 'Unknown': + case 0: + i.adsourceType = 0; + break; + case 'Vpaid': + case 1: + i.adsourceType = 1; + break; + case 'VastMedia': + case 2: + i.adsourceType = 2; + break; + case 'CnxMedia': + case 3: + i.adsourceType = 3; + break; + case 'Jw': + case 4: + i.adsourceType = 4; + break; + case 'Ima': + case 5: + i.adsourceType = 5; + break; + case 'AOL': + case 6: + i.adsourceType = 6; + } + if (null != t.vastMediaType && (i.vastMediaType = String(t.vastMediaType)), null != t.adPodSlotPosition && (i.adPodSlotPosition = 0 | t.adPodSlotPosition), null != t.prebidJsBidderName && (i.prebidJsBidderName = String(t.prebidJsBidderName)), null != t.dspId && (i.dspId = String(t.dspId)), null != t.cnxBidId && (i.cnxBidId = String(t.cnxBidId)), null != t.winToAdLoadedTime && (i.winToAdLoadedTime = 0 | t.winToAdLoadedTime), null != t.startAdToImpressionTime && (i.startAdToImpressionTime = 0 | t.startAdToImpressionTime), null != t.declaredDuration && (i.declaredDuration = Number(t.declaredDuration)), null != t.impressionDuration && (i.impressionDuration = Number(t.impressionDuration)), null != t.useExploration && (i.useExploration = Boolean(t.useExploration)), null != t.auctionInformation) { + if ('object' != typeof t.auctionInformation) + throw TypeError('.ProtoVideoAdImpressionRequest.auctionInformation: object expected'); + i.auctionInformation = c.ProtoAuctionInformation.fromObject(t.auctionInformation); + } + return null != t.playerWidth && (i.playerWidth = 0 | t.playerWidth), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoVideoAdImpressionViewableRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.rtbSeatId = '', t.prototype.dspId = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(26).string(t.mediaGuid), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(42).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(50).string(t.advertiserLineItemId), null != t.rtbSeatId && Object.hasOwnProperty.call(t, 'rtbSeatId') && i.uint32(58).string(t.rtbSeatId), null != t.dspId && Object.hasOwnProperty.call(t, 'dspId') && i.uint32(66).string(t.dspId), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoVideoAdImpressionViewableRequest) + return t; + var i = new c.ProtoVideoAdImpressionViewableRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoVideoAdImpressionViewableRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + return null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), null != t.rtbSeatId && (i.rtbSeatId = String(t.rtbSeatId)), null != t.dspId && (i.dspId = String(t.dspId)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoVideoAdQuartilesRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.trackingRequestMeta = null, t.prototype.mediaGuid = '', t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.quartile = 0, t.prototype.rtbSeatId = '', t.prototype.dspId = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.trackingRequestMeta && Object.hasOwnProperty.call(t, 'trackingRequestMeta') && c.MetadataModel.encode(t.trackingRequestMeta, i.uint32(10).fork()).ldelim(), null != t.mediaGuid && Object.hasOwnProperty.call(t, 'mediaGuid') && i.uint32(26).string(t.mediaGuid), null != t.publisherLineItemId && Object.hasOwnProperty.call(t, 'publisherLineItemId') && i.uint32(42).string(t.publisherLineItemId), null != t.advertiserLineItemId && Object.hasOwnProperty.call(t, 'advertiserLineItemId') && i.uint32(50).string(t.advertiserLineItemId), null != t.quartile && Object.hasOwnProperty.call(t, 'quartile') && i.uint32(56).int32(t.quartile), null != t.rtbSeatId && Object.hasOwnProperty.call(t, 'rtbSeatId') && i.uint32(66).string(t.rtbSeatId), null != t.dspId && Object.hasOwnProperty.call(t, 'dspId') && i.uint32(74).string(t.dspId), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoVideoAdQuartilesRequest) + return t; + var i = new c.ProtoVideoAdQuartilesRequest(); + if (null != t.trackingRequestMeta) { + if ('object' != typeof t.trackingRequestMeta) + throw TypeError('.ProtoVideoAdQuartilesRequest.trackingRequestMeta: object expected'); + i.trackingRequestMeta = c.MetadataModel.fromObject(t.trackingRequestMeta); + } + switch (null != t.mediaGuid && (i.mediaGuid = String(t.mediaGuid)), null != t.publisherLineItemId && (i.publisherLineItemId = String(t.publisherLineItemId)), null != t.advertiserLineItemId && (i.advertiserLineItemId = String(t.advertiserLineItemId)), t.quartile) { + case 'Start': + case 0: + i.quartile = 0; + break; + case 'First': + case 1: + i.quartile = 1; + break; + case 'Second': + case 2: + i.quartile = 2; + break; + case 'Third': + case 3: + i.quartile = 3; + break; + case 'Fourth': + case 4: + i.quartile = 4; + } + return null != t.rtbSeatId && (i.rtbSeatId = String(t.rtbSeatId)), null != t.dspId && (i.dspId = String(t.dspId)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoUserSyncRequest = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.userId = '', t.prototype.demandPartner = 0, t.prototype.demandPartnerUserId = '', t.encode = function (t, i) { + return i || (i = a.create()), null != t.userId && Object.hasOwnProperty.call(t, 'userId') && i.uint32(10).string(t.userId), null != t.demandPartner && Object.hasOwnProperty.call(t, 'demandPartner') && i.uint32(16).int32(t.demandPartner), null != t.demandPartnerUserId && Object.hasOwnProperty.call(t, 'demandPartnerUserId') && i.uint32(26).string(t.demandPartnerUserId), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoUserSyncRequest) + return t; + var i = new c.ProtoUserSyncRequest(); + return null != t.userId && (i.userId = String(t.userId)), null != t.demandPartner && (i.demandPartner = 0 | t.demandPartner), null != t.demandPartnerUserId && (i.demandPartnerUserId = String(t.demandPartnerUserId)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoPlayerPlaybackModeEnum = (s = {}, (n = Object.create(s))[s[0] = 'Autoplay'] = 0, n[s[1] = 'ScrollToPlay'] = 1, n[s[2] = 'ClickToPlay'] = 2, n), c.ProtoPlayerCloseButtonMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Off'] = 0, i[t[1] = 'OnHover'] = 1, i[t[2] = 'OnHoverAfterFirstAd'] = 2, i[t[3] = 'AlwaysOn'] = 3, i; + }(), c.ProtoPlayerFloatingMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Off'] = 0, i[t[1] = 'OnPageLoad'] = 1, i[t[2] = 'AfterInView'] = 2, i[t[3] = 'Always'] = 3, i; + }(), c.ProtoPlayerSoundMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Mute'] = 0, i[t[1] = 'On'] = 1, i[t[2] = 'Hover'] = 2, i; + }(), c.ProtoPlayerInsertMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'WithinContainer'] = 0, i[t[1] = 'BeforeContainer'] = 1, i[t[2] = 'AfterContainer'] = 2, i[t[3] = 'ReplaceContainer'] = 3, i[t[4] = 'HideContainer'] = 4, i; + }(), c.ProtoAdViewabilityPolicy = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Default'] = 0, i[t[1] = 'Strict'] = 1, i; + }(), c.ProtoSharingDestination = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Facebook'] = 0, i[t[1] = 'Twitter'] = 1, i[t[2] = 'LinkedIn'] = 2, i; + }(), c.ProtoFloatingFixedPositionMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Page'] = 0, i[t[1] = 'Element'] = 1, i; + }(), c.ProtoPositionMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'BottomRight'] = 0, i[t[1] = 'BottomLeft'] = 1, i[t[2] = 'TopRight'] = 2, i[t[3] = 'TopLeft'] = 3, i; + }(), c.ProtoAdPlaybackMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Autoplay'] = 0, i[t[1] = 'ScrollToPlay'] = 1, i; + }(), c.ProtoFloatingAppendLocationEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Above'] = 0, i[t[1] = 'Below'] = 1, i[t[2] = 'Within'] = 2, i; + }(), c.ProtoPlayerAdSkippability = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IfLongerThan'] = 0, i[t[1] = 'Always'] = 1, i[t[2] = 'NoRestrictions'] = 2, i; + }(), c.ProtoVideoQuality = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Auto'] = 0, i[t[1] = 'High1080p'] = 1, i[t[2] = 'High720p'] = 2, i[t[3] = 'Medium360p'] = 3, i; + }(), c.ProtoImplementationType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Web'] = 0, i[t[1] = 'Amp'] = 1, i; + }(), c.ProtoAdBreakTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'None'] = 0, i[t[1] = 'PreRoll'] = 1, i[t[2] = 'MidRoll'] = 2, i[t[3] = 'PostRoll'] = 3, i; + }(), c.ProtoAdSlotAdTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'SingleAd'] = 0, i[t[1] = 'AdPod'] = 1, i; + }(), c.ProtoDeviceType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Desktop'] = 0, i[t[1] = 'Smartphone'] = 1, i[t[2] = 'Tablet'] = 2, i[t[3] = 'GameConsole'] = 3, i[t[4] = 'SmartTV'] = 4, i[t[5] = 'WearableComputer'] = 5, i[t[6] = 'PDA'] = 6, i[t[7] = 'Unrecognized'] = 7, i; + }(), c.ProtoCookieSecureModeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Secure'] = 0, i[t[1] = 'Unsecure'] = 1, i[t[2] = 'Auto'] = 2, i; + }(), c.ProtoTrackerType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Image'] = 0, i[t[1] = 'Javascript'] = 1, i; + }(), c.ProtoTrackerTriggerType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Impression'] = 0, i[t[1] = 'Complete25Pc'] = 1, i[t[2] = 'Complete50Pc'] = 2, i[t[3] = 'Complete75Pc'] = 3, i[t[4] = 'ViewCompletion'] = 4, i[t[5] = 'VideoClick'] = 5, i[t[6] = 'Pause'] = 6, i[t[7] = 'Resume'] = 7, i[t[8] = 'Mute'] = 8, i[t[9] = 'Unmute'] = 9, i; + }(), c.ProtoCreativeTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'ThirdParty'] = 0, i[t[1] = 'MediaFile'] = 1, i[t[2] = 'Rtb'] = 2, i[t[3] = 'External'] = 3, i[t[4] = 'HeaderBidder'] = 4, i[t[7] = 'Tam'] = 7, i[t[8] = 'TamDeal'] = 8, i; + }(), c.ProtoResetCapTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'TimeCapping'] = 0, i[t[1] = 'ContentCapping'] = 1, i[t[2] = 'OpportunityCapping'] = 2, i; + }(), c.ProtoAdSlotsEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'PreRoll'] = 0, i[t[1] = 'MidRoll'] = 1, i[t[2] = 'PostRoll'] = 2, i; + }(), c.ProtoLineItemPriority = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'House'] = 0, i[t[1] = 'Default'] = 1, i[t[2] = 'Preferred'] = 2, i[t[3] = 'Top'] = 3, i; + }(), c.ProtoAdSkipMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IfLongerThan31Sec'] = 0, i[t[1] = 'Always'] = 1, i[t[2] = 'Never'] = 2, i[t[3] = 'NotAplicable'] = 3, i; + }(), c.ProtoAdType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Video'] = 0, i[t[1] = 'Overlay'] = 1, i; + }(), c.ProtoChoiceCriteriaEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Only'] = 0, i[t[1] = 'Except'] = 1, i; + }(), c.ProtoLineItemAdBreakTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[1] = 'All'] = 1, i[t[2] = 'SingleAd'] = 2, i[t[3] = 'AdPod'] = 3, i; + }(), c.ProtoLineItemTargetingTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Only'] = 0, i[t[1] = 'Except'] = 1, i; + }(), c.ProtoLineItemAdSlotTargetingTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[1] = 'SpecificSlots'] = 1, i[t[2] = 'Interval'] = 2, i; + }(), c.ProtoLineItemPauseAdOutOfViewEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Default'] = 0, i[t[1] = 'Strict'] = 1, i; + }(), c.ProtoLineItemContextualTargetingEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IncludeAny'] = 0, i[t[1] = 'IncludeAll'] = 1, i[t[2] = 'ExcludeAny'] = 2, i[t[3] = 'ExcludeAll'] = 3, i; + }(), c.ProtoSizeChoiceCriteriaEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'GreaterThan'] = 0, i[t[1] = 'SmallerThan'] = 1, i[t[2] = 'Between'] = 2, i; + }(), c.ProtoLoggingLevelEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'FATAL'] = 0, i[t[1] = 'WARNING'] = 1, i[t[2] = 'INFO'] = 2, i; + }(), c.ProtoMediaTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Image'] = 0, i[t[1] = 'Video'] = 1, i; + }(), c.ConnatixNoBidReasonEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'RequestException'] = 0, i[t[1] = 'Timeout'] = 1, i[t[2] = 'EmptyResponse'] = 2, i[t[3] = 'InvalidResponse'] = 3, i[t[4] = 'NoBid'] = 4, i[t[5] = 'BidBelowFloor'] = 5, i[t[6] = 'DealIdMismatch'] = 6, i[t[7] = 'CsInvalidResponse'] = 7, i[t[8] = 'CsRequestException'] = 8, i[t[9] = 'CsEmptyResponse'] = 9, i[t[11] = 'NoLibInPage'] = 11, i; + }(), c.PartnerNoBidReasonEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Unknown'] = 0, i[t[1] = 'TechnicalError'] = 1, i[t[2] = 'InvalidRequest'] = 2, i[t[3] = 'KnownWebSpider'] = 3, i[t[4] = 'SuspectedNonHumanTraffic'] = 4, i[t[5] = 'CloudIP'] = 5, i[t[6] = 'UnsupportedDevice'] = 6, i[t[7] = 'BlockedPublisher'] = 7, i[t[8] = 'UnmatchedUser'] = 8, i[t[9] = 'DailyReaderCapMet'] = 9, i[t[10] = 'DailyDomainCapMet'] = 10, i; + }(), c.ProtoAdBlockDetectionTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Banner'] = 0, i[t[1] = 'Network'] = 1, i; + }(), c.ProtoAdClickTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[1] = 'AdClick'] = 1, i[t[2] = 'AdClickThrough'] = 2, i[t[3] = 'AdSkipClick'] = 3, i[t[4] = 'VolumeClick'] = 4, i[t[5] = 'PauseClick'] = 5, i[t[6] = 'PlayClick'] = 6, i[t[7] = 'FullScreenClick'] = 7, i[t[8] = 'MuteClick'] = 8, i[t[9] = 'UnmuteClick'] = 9, i; + }(), c.ProtoAdsourceTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Unknown'] = 0, i[t[1] = 'Vpaid'] = 1, i[t[2] = 'VastMedia'] = 2, i[t[3] = 'CnxMedia'] = 3, i[t[4] = 'Jw'] = 4, i[t[5] = 'Ima'] = 5, i[t[6] = 'AOL'] = 6, i; + }(), c.ProtoAuctionLossReasonEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'TargetingMismatch'] = 0, i[t[1] = 'CompetitorPriority'] = 1, i[t[2] = 'AdOpportunityEnd'] = 2, i; + }(), c.ProtoGdprConsentModeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Unknown'] = 0, i[t[1] = 'NoCmp'] = 1, i[t[2] = 'NoConsent'] = 2, i[t[3] = 'NoConnatixConsent'] = 3, i[t[4] = 'NotAllDemandConsent'] = 4, i[t[5] = 'AllGood'] = 5, i; + }(), c.ProtoAuctionPostbidReasonEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'CreativeError'] = 0, i[t[1] = 'SDKFailure'] = 1, i[t[2] = 'UnsupportedMedia'] = 2, i[t[3] = 'TargetingMismatch'] = 3, i[t[4] = 'PlayerError'] = 4, i; + }(), c.ProtoHeavyAdBlockTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Global'] = 0, i[t[1] = 'Script'] = 1, i[t[2] = 'VpaidIframe'] = 2, i[t[3] = 'OverlayIframe'] = 3, i; + }(), c.ProtoMediaClickTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Click'] = 0, i[t[1] = 'UrlClick'] = 1, i[t[2] = 'VolumeClick'] = 2, i[t[3] = 'PlayClick'] = 3, i[t[4] = 'PauseClick'] = 4, i[t[5] = 'NextClick'] = 5, i[t[6] = 'PreviousClick'] = 6, i[t[7] = 'MuteClick'] = 7, i[t[8] = 'UnmuteClick'] = 8, i[t[9] = 'CloseClick'] = 9, i[t[10] = 'ScrollClick'] = 10, i[t[11] = 'GalleryClick'] = 11, i[t[12] = 'SubtitleClick'] = 12, i[t[13] = 'FullScreenClick'] = 13, i[t[14] = 'ExitFullScreenClick'] = 14, i; + }(), c.ProtoQuartilesEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Start'] = 0, i[t[1] = 'First'] = 1, i[t[2] = 'Second'] = 2, i[t[3] = 'Third'] = 3, i[t[4] = 'Fourth'] = 4, i; + }(), t.exports = c; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + return 'string' == typeof t; + } + function n(t) { + return !isNaN(parseFloat(t)) && isFinite(t); + } + function r(t) { + return n(t) && t > 0; + } + function h(t) { + return s(t) && t.length > 0; + } + function a(t) { + return void 0 !== t; + } + function o(t) { + return 'function' == typeof t; + } + function c(t) { + return 'object' == typeof t && null !== t && !Array.isArray(t); + } + function u(t) { + try { + if (t.contentWindow || t.contentDocument) + return !0; + } catch (t) { + } + return !1; + } + e.d(i, 'g', function () { + return s; + }), e.d(i, 'd', function () { + return n; + }), e.d(i, 'e', function () { + return r; + }), e.d(i, 'h', function () { + return h; + }), e.d(i, 'a', function () { + return a; + }), e.d(i, 'b', function () { + return o; + }), e.d(i, 'f', function () { + return c; + }), e.d(i, 'c', function () { + return u; + }); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'u', function () { + return f; + }), e.d(i, 'O', function () { + return p; + }), e.d(i, 'N', function () { + return b; + }), e.d(i, 'K', function () { + return v; + }), e.d(i, 'J', function () { + return m; + }), e.d(i, 'y', function () { + return g; + }), e.d(i, 'x', function () { + return y; + }), e.d(i, 'w', function () { + return w; + }), e.d(i, 'a', function () { + return O; + }), e.d(i, 'I', function () { + return x; + }), e.d(i, 't', function () { + return S; + }), e.d(i, 'Q', function () { + return j; + }), e.d(i, 'L', function () { + return k; + }), e.d(i, 'l', function () { + return _; + }), e.d(i, 'k', function () { + return A; + }), e.d(i, 'm', function () { + return I; + }), e.d(i, 'b', function () { + return C; + }), e.d(i, 'c', function () { + return T; + }), e.d(i, 'f', function () { + return P; + }), e.d(i, 'R', function () { + return M; + }), e.d(i, 'n', function () { + return E; + }), e.d(i, 'i', function () { + return L; + }), e.d(i, 'M', function () { + return R; + }), e.d(i, 'e', function () { + return B; + }), e.d(i, 'p', function () { + return F; + }), e.d(i, 'j', function () { + return V; + }), e.d(i, 's', function () { + return U; + }), e.d(i, 'd', function () { + return $; + }), e.d(i, 'v', function () { + return N; + }), e.d(i, 'h', function () { + return z; + }), e.d(i, 'g', function () { + return W; + }), e.d(i, 'B', function () { + return G; + }), e.d(i, 'E', function () { + return J; + }), e.d(i, 'P', function () { + return Q; + }), e.d(i, 'A', function () { + return X; + }), e.d(i, 'r', function () { + return Y; + }), e.d(i, 'q', function () { + return K; + }), e.d(i, 'H', function () { + return Z; + }), e.d(i, 'C', function () { + return tt; + }), e.d(i, 'S', function () { + return it; + }), e.d(i, 'o', function () { + return et; + }), e.d(i, 'D', function () { + return st; + }), e.d(i, 'F', function () { + return nt; + }), e.d(i, 'z', function () { + return rt; + }), e.d(i, 'G', function () { + return ht; + }); + var s = e(24), n = e(1), r = e(6), h = e(4), a = e(8), o = e(0), c = e(5); + function u(t, i) { + t && (t.style.display = i ? '' : 'none'); + } + function l(t, i) { + if (Object(n.a)(t.classList)) + return void t.classList.add(i); + const e = `${ t.getAttribute('class') } ${ i }`; + t.setAttribute('class', e); + } + function d(t, i) { + if (Object(n.a)(t.classList)) + return void t.classList.remove(i); + const e = t.getAttribute('class').replace(i, ''); + t.setAttribute('class', e); + } + function f(t) { + u(t, !1); + } + function p(t) { + u(t, !0); + } + function b(t, i) { + for (const e in i) + i.hasOwnProperty(e) && (t.style[e] = i[e]); + } + function v(t, ...i) { + i.forEach(i => { + t.style[i] = ''; + }); + } + function m(t) { + t && t.parentNode && t.parentNode.removeChild(t); + } + function g(t, i, e, s, r) { + if (i) + try { + const h = e.document.createElement('link'); + return h.id = t.id, h.type = 'text/css', h.rel = 'stylesheet', h.href = t.src, Object(n.b)(s) && (h.onload = () => { + s(); + }), Object(n.b)(r) && (h.onerror = t => { + i.removeChild(h), Object(n.g)(t) ? r(`link_stylesheet_load_error_${ t }`) : r(`link_stylesheet_load_error_${ function (t, i) { + const e = t.document.createElement('div'); + return e.appendChild(i), e.innerHTML; + }(e, h) }`); + }), i.appendChild(h), h; + } catch (t) { + return null; + } + } + function y(t, i, e, s, r, h = (() => { + return !0; + })(), a) { + try { + const u = e.document.createElement('script'); + return u.src = t.src, u.async = !0, u.type = 'text/javascript', t.id && (u.id = t.id), Object(n.b)(s) && (u.onload = () => { + s(); + }), u.onerror = e => { + i.removeChild(u), h && Object(c.a)({ + message: a, + exception: 'script_load_error', + callStack: t.src, + level: o.ProtoLoggingLevelEnum.INFO, + throttle: 2, + sendMaxLog: !1 + }), Object(n.b)(r) && r(); + }, i.appendChild(u), u; + } catch (i) { + return h && Object(c.a)({ + message: a, + exception: `script_insert_error_${ i.message }_${ i.stack }`, + callStack: t.src, + level: o.ProtoLoggingLevelEnum.FATAL, + throttle: 2, + sendMaxLog: !1 + }), Object(n.b)(r) && r(), null; + } + } + function w(t, i, e) { + if (t) + try { + const s = i.document.createElement('script'), n = i.document.createTextNode(e); + return s.appendChild(n), t.appendChild(s), s; + } catch (t) { + return null; + } + } + function O(t, ...i) { + t && i.forEach(i => { + Object(n.h)(i) && l(t, i); + }); + } + function x(t, ...i) { + t && i.forEach(i => { + Object(n.h)(i) && d(t, i); + }); + } + function S(t, i) { + return t && t.classList.contains(i); + } + function j(t, i, e) { + return !!t && (Object(n.a)(e) ? e ? (O(t, i), !0) : (x(t, i), !1) : t.classList.toggle(i)); + } + function k(t, i, e, s = (() => { + return !1; + })()) { + t && (d(t, i), s && L(t), l(t, e)); + } + const _ = (t, i) => { + return i.document.getElementById(t); + }, A = (t, i, e) => { + return i.getComputedStyle(t, e); + }, I = (t, i) => { + return i.document.getElementsByClassName(t); + }; + function C(t, i = (() => { + return ''; + })(), e) { + const s = e.document.getElementsByTagName('head')[0], n = e.document.createElement('style'); + n.setAttribute('type', 'text/css'), n.id = i, n.styleSheet ? n.styleSheet.cssText = t : n.appendChild(e.document.createTextNode(t)), s.appendChild(n); + } + function T(t, i) { + const e = i.document.getElementsByTagName('head')[0], s = i.document.createElement('link'); + s.setAttribute('rel', 'preconnect'), s.setAttribute('link', t), e.appendChild(s); + } + function P(t, i) { + const e = i.document.createElement('div'); + return e.innerHTML = t, e.firstElementChild; + } + function M(t, i) { + i > 0 ? (t.removeAttribute('muted'), t.muted = !1) : (t.setAttribute('muted', ''), t.muted = !0); + } + function E(t) { + return s.b.find(i => { + if (i.keys.fullscreenEnabled in t) + return !0; + }); + } + function L(t) { + t.getBoundingClientRect(); + } + function R(t, i) { + return (t.requestAnimationFrame || t.webkitRequestAnimationFrame || function (t) { + return setTimeout(t, 20); + })(i); + } + function B(t, i) { + return (t.cancelAnimationFrame || t.webkitCancelAnimationFrame || function (t) { + return clearTimeout(t); + })(i); + } + function D(t, i, e) { + const s = function (t, i) { + const e = function (t, i) { + let e = i; + for (; e;) { + const i = e.parentNode; + if (i) { + const e = t.reduce((t, e) => { + return t || i.querySelector(e); + }, null); + if (e) + return e; + } + e = i; + } + return null; + }(t, i); + return e ? A(e, U(e)) : null; + }(t, i); + return s ? function (t, i) { + return t.getPropertyValue(i); + }(s, e) : null; + } + function F(t) { + const i = D([ + 'h1', + 'h2' + ], t, 'font-family'); + return i || 'inherit'; + } + function V(t) { + const i = D(['p'], t, 'font-family'); + return i || 'inherit'; + } + function U(t) { + try { + return t.ownerDocument.defaultView; + } catch (t) { + return null; + } + } + function $(t, i) { + t && i && (Array.isArray(t) ? t.forEach(t => { + return i.appendChild(t); + }) : i.appendChild(t)); + } + function N(t, i, e) { + let s = !1; + const n = Object(r.c)(i.children); + for (let i = 0; i < n.length; i++) + if (e - 1 === i || 0 === e) { + s = !0, Array.isArray(t) ? H(n[i], ...t) : H(n[i], t); + break; + } + s || $(t, i); + } + function H(t, ...i) { + if (t && t.parentElement) + for (let e = i.length; e--;) + t.parentElement.insertBefore(i[e], t); + } + function q(t) { + const i = U(t); + if (!i) + return; + const {display: e} = A(t, i); + 'none' === e && (t.style.display = 'block'); + } + function z(t, i = (() => { + return () => { + }; + })()) { + const e = function (s) { + 'opacity' === s.propertyName && (x(t, h.m.FadeOutBase, h.m.FadeOut), i(), t.removeEventListener('transitionend', e)); + }; + O(t, h.m.FadeOutBase), q(t), L(t), t.addEventListener('transitionend', e), O(t, h.m.FadeOut); + } + function W(t, i = (() => { + return () => { + }; + })()) { + const e = function (s) { + 'opacity' === s.propertyName && (x(t, h.m.FadeInBase, h.m.FadeIn), i(), t.removeEventListener('transitionend', e)); + }; + O(t, h.m.FadeInBase), q(t), L(t), t.addEventListener('transitionend', e), O(t, h.m.FadeIn); + } + function G(t) { + const i = U(t); + if (!i) + return !0; + const { + display: e, + opacity: s + } = A(t, i); + return 'none' === e || '0' === s; + } + function J(t, i, e) { + const s = e.document.createElement('script'); + s.src = 'https://cdn.connatix.com/min/connatix.renderer.infeed.min.js', s.setAttribute('data-connatix-token', t), e.document.getElementById(i).parentElement.appendChild(s); + } + function Q(t, i) { + const e = i.document.createElement('div'); + return e.innerHTML = t || '', e.innerText; + } + function X() { + const t = window.navigator && window.navigator.doNotTrack || window.doNotTrack; + return '1' === t || 'yes' === t; + } + function Y(t, i) { + const e = Object(a.f)(t).topFrame; + return e[i] ? e : null; + } + function K(t, i) { + let e = t, s = null; + try { + for (; !s;) { + try { + e.frames[i] && (s = e); + } catch (t) { + } + if (!t.top || t.top === e) + break; + e = e.parent; + } + } catch (t) { + } + return s; + } + function Z(t, i) { + let e = []; + try { + e = e.slice.call(i.document.querySelectorAll(t), 0); + } catch (t) { + } + return e; + } + function tt(t) { + return -1 !== Object(a.f)(t).topFrame.location.protocol.indexOf('https'); + } + function it(t) { + if (!tt(t)) + return; + [ + window, + t + ].forEach(t => { + if (null === t.document.querySelector('meta[content=upgrade-insecure-requests]')) { + const i = t.document.createElement('meta'); + i.setAttribute('http-equiv', 'Content-Security-Policy'), i.content = 'upgrade-insecure-requests', t.document.head.appendChild(i); + } + }); + } + function et(t) { + return Object(a.f)(t).topFrame.document.referrer; + } + function st(t, i) { + const e = Object(a.f)(i).topFrame.location.hostname, s = Object(a.g)(t); + return s && s.hostname === e; + } + function nt(t, i) { + try { + t.onclick = t => { + const { + tagName: e, + className: s + } = t.target; + Object(c.a)({ + message: `${ i } - click on tag:${ e } class:${ s }`, + level: o.ProtoLoggingLevelEnum.INFO + }); + }; + } catch (t) { + Object(c.a)({ + message: `${ i }_Error - iframe click`, + level: o.ProtoLoggingLevelEnum.WARNING, + callStack: t.stack + }); + } + } + function rt(t) { + t.currentTime = t.currentTime + 0.01; + } + function ht(t, i) { + !function (t, i, e) { + const s = t.document.createElement('link'); + s.rel = 'preload', s.href = i, s.as = e, t.document.head.appendChild(s); + }(i, t, 'script'); + } + }, + function (t, i, e) { + 'use strict'; + var s, n; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'b', function () { + return n; + }), function (t) { + t.Fullscreen = 'fullscreen', t.Normal = 'normal', t.Thumbnail = 'thumbnail'; + }(s || (s = {})), function (t) { + t.AdLoaded = 'AdLoaded', t.AdStarted = 'AdStarted', t.AdStopped = 'AdStopped', t.AdSkipped = 'AdSkipped', t.AdSkippableStateChange = 'AdSkippableStateChange', t.AdSizeChange = 'AdSizeChange', t.AdLinearChange = 'AdLinearChange', t.AdDurationChange = 'AdDurationChange', t.AdExpandedChange = 'AdExpandedChange', t.AdRemainingTimeChange = 'AdRemainingTimeChange', t.AdVolumeChange = 'AdVolumeChange', t.AdImpression = 'AdImpression', t.AdVideoStart = 'AdVideoStart', t.AdVideoFirstQuartile = 'AdVideoFirstQuartile', t.AdVideoMidpoint = 'AdVideoMidpoint', t.AdVideoThirdQuartile = 'AdVideoThirdQuartile', t.AdVideoComplete = 'AdVideoComplete', t.AdClickThru = 'AdClickThru', t.AdInteraction = 'AdInteraction', t.AdUserAcceptInvitation = 'AdUserAcceptInvitation', t.AdUserMinimize = 'AdUserMinimize', t.AdUserClose = 'AdUserClose', t.AdPaused = 'AdPaused', t.AdPlaying = 'AdPlaying', t.AdLog = 'AdLog', t.AdError = 'AdError'; + }(n || (n = {})); + }, + function (t, i, e) { + 'use strict'; + var s, n, r; + e.d(i, 'h', function () { + return s; + }), e.d(i, 'g', function () { + return n; + }), e.d(i, 'j', function () { + return r; + }), e.d(i, 'r', function () { + return h; + }), e.d(i, 'i', function () { + return a; + }), e.d(i, 'k', function () { + return o; + }), e.d(i, 'f', function () { + return c; + }), e.d(i, 'l', function () { + return l; + }), e.d(i, 'e', function () { + return d; + }), e.d(i, 'n', function () { + return f; + }), e.d(i, 'm', function () { + return p; + }), e.d(i, 'q', function () { + return v; + }), e.d(i, 'o', function () { + return m; + }), e.d(i, 'b', function () { + return g; + }), e.d(i, 'c', function () { + return y; + }), e.d(i, 'd', function () { + return w; + }), e.d(i, 'p', function () { + return O; + }), e.d(i, 'a', function () { + return x; + }), function (t) { + t.Invisible = 'cnx-mod-invisible', t.HoverStart = 'cnx-mod-hover-s', t.HoverEnd = 'cnx-mod-hover', t.HoverBoom = 'cnx-mod-boom', t.DisplayNone = 'cnx-mod-display-none', t.Active = 'cnx-mod-active', t.HideOnVolumeHover = 'cnx-hide-on-volume-hover', t.HideOnSingleVideo = 'cnx-hide-on-single-video', t.NoTransition = 'cnx-mod-no-transition', t.Collapsable = 'cnx-mod-collapsable', t.HasCustomScrollbar = 'cnx-mod-scrollbar', t.Show = 'cnx-mod-show', t.Hide = 'cnx-mod-hide', t.OnHold = 'cnx-mod-onhold', t.ForceLineBreak = 'cnx-mod-force-line-break', t.HideOnAdOverlay = 'cnx-mod-ad-overlay-none', t.HideOnPodLoadingScreen = 'cnx-mod-pod-loading-none'; + }(s || (s = {})), function (t) { + t.Fullscreen = 'cnx-in-fullscreen', t.Ad = 'cnx-in-ad', t.AdOverlayType = 'cnx-in-ad-overlay', t.AdFullSize = 'cnx-in-ad-full', t.AdShowCard = 'cnx-ad-show-card', t.ShowControls = 'cnx-in-show-controls', t.Mobile = 'cnx-in-mobile', t.Desktop = 'cnx-in-desktop', t.Muted = 'cnx-in-mute', t.Collapsed = 'cnx-in-collapse', t.GalleryPortrait = 'cnx-in-g-portrait', t.GalleryLandscape = 'cnx-in-g-landscape', t.ContextController = 'cnx-context-controller', t.HideUI = 'cnx-in-hide-ui', t.PodLoadingScreen = 'cnx-in-pod-loading', t.CloseOn = 'cnx-close-on', t.CloseOff = 'cnx-close-off', t.CloseHover = 'cnx-close-hover', t.CloseFloatOn = 'cnx-close-float-on', t.CloseFloatOff = 'cnx-close-float-off', t.CloseFloatHover = 'cnx-close-float-hover', t.UiInView = 'cnx-ui-in-view'; + }(n || (n = {})), function (t) { + t.Playing = 'cnx-is-playing', t.Paused = 'cnx-is-paused', t.Stopped = 'cnx-is-stopped', t.Preroll = 'cnx-is-preroll', t.Postroll = 'cnx-is-postroll', t.Loading = 'cnx-is-loading', t.LiveEnded = 'cnx-live-ended'; + }(r || (r = {})); + const h = { + Xxl: 'cnx-bp-xxl-v', + Xl: 'cnx-bp-xl-v', + Lg: 'cnx-bp-lg-v', + Md: 'cnx-bp-md-v', + Sm: 'cnx-bp-sm-v', + Xs: 'cnx-bp-xs-v', + Xxs: 'cnx-bp-xxs-v' + }; + var a, o, c, u, l, d, f; + !function (t) { + t.Responsive = 'cnx-size-responsive', t.Fixed = 'cnx-size-fixed'; + }(a || (a = {})), function (t) { + t.ClickOption = 'cnx-cm-item--click', t.ToggleOption = 'cnx-cm-item--toggle', t.SubmenuOption = 'cnx-cm-item--submenu', t.ItemIcon = 'cnx-cm-item__icon', t.ItemTitle = 'cnx-cm-item__title', t.ItemExtra = 'cnx-cm-item__extra', t.Items = 'cnx-cm-items', t.Container = 'cnx-cm-container'; + }(o || (o = {})), function (t) { + t.Icons = 'cnx-color-icon', t.TooltipText = 'cnx-color-tt-text', t.TooltipBackground = 'cnx-color-tt-bg', t.AccentColor = 'cnx-color-accent', t.PrimaryColor = 'cnx-color-primary', t.SecondaryColor = 'cnx-color-secondary', t.TitleComponent = 'cnx-title-component', t.TitleLink = 'cnx-color-title-link', t.SlideProgressBar = 'cnx-slides-progress-bar', t.ProgressFill = 'cnx-progress-fill'; + }(c || (c = {})), function (t) { + t.InheritTitleFontFamily = 'cnx-inherit-title-font-family', t.InheritBodyFontFamily = 'cnx-inherit-body-font-family'; + }(u || (u = {})), function (t) { + t.Connatix = '#0099FF', t.Icons = '#FFFFFF', t.PrimaryBackground = '#F1F1F1', t.PrimaryForeground = '#000000', t.SecondaryBackground = '#000000', t.SecondaryForeground = '#F1F1F1', t.AccentForeground = '#FFFFFF'; + }(l || (l = {})), function (t) { + t.CaptionContainer = 'cnx-captions-text-holder'; + }(d || (d = {})), function (t) { + t.MainClass = 'cnx-float', t.TransitionClass = 'cnx-float-transition'; + }(f || (f = {})); + const p = { + FadeOutBase: 'cnx-fade-out-base', + FadeOut: 'cnx-fade-out', + FadeInBase: 'cnx-fade-in-base', + FadeIn: 'cnx-fade-in' + }; + var b, v, m; + !function (t) { + t.CurrentSlide = 'cnx-slide-current', t.NextSlide = 'cnx-slide-next', t.SlideLeft = 'cnx-slide-left', t.SlideRight = 'cnx-slide-right'; + }(b || (b = {})), function (t) { + t.OpacityInTransition = 'cnx-tooltip-animation-in'; + }(v || (v = {})), function (t) { + t.Card = 'cnx-g-card', t.CardSlot = 'cnx-g-card-slot', t.CardImage = 'cnx-g-card-image', t.CardText = 'cnx-g-card-text', t.CardTextContainer = 'cnx-g-card-text-container', t.CardPlaceholder = 'cnx-g-card-placeholder', t.CardRail = 'cnx-g-rail', t.StyleDetailed = 'cnx-g-style-detailed', t.StyleVisual = 'cnx-g-style-visual', t.ExploreMore = 'cnx-g-explore-more', t.FadeOut = 'cnx-g-fade-out'; + }(m || (m = {})); + const g = { + MainContainer: 'cnx-main-container', + MainContainerFlex: 'cnx-main-container-flex', + PlayerWrapper: 'cnx-player-wrapper', + ImagePlaceholder: 'cnx-image-placeholder' + }, y = 'cnx-ratio', w = 'cnx-hide-video', O = { + Text: 'cnx-skip-ad-text', + Timer: 'cnx-timer-loader', + Icon: 'cnx-skip-ad-icon', + SkipAdButton: 'cnx-skip-ad-button', + InTimer: 'cnx-skip-ad-in-timer' + }, x = { + Icon: 'cnx-pod-open-new-icon', + Button: 'cnx-pod-read-more-btn', + ButtonContainer: 'cnx-pod-read-more-container', + Wrapper: 'cnx-pod-read-more-wrapper', + BackgroundImg: 'cnx-pod-loading-background', + InfoContainer: 'cnx-pod-loading-info', + FallbackContainer: 'cnx-pod-loading-fallback', + SlotCountText: 'cnx-pod-slot-count-text' + }; + }, + function (t, i, e) { + 'use strict'; + var s = e(21), n = e(23), r = e(0), h = e(14), a = e(30); + const o = !0, c = 30; + var u = e(36); + e.d(i, 'a', function () { + return b; + }); + var l = function (t, i) { + var e = {}; + for (var s in t) + Object.prototype.hasOwnProperty.call(t, s) && i.indexOf(s) < 0 && (e[s] = t[s]); + if (null != t && 'function' == typeof Object.getOwnPropertySymbols) { + var n = 0; + for (s = Object.getOwnPropertySymbols(t); n < s.length; n++) + i.indexOf(s[n]) < 0 && Object.prototype.propertyIsEnumerable.call(t, s[n]) && (e[s[n]] = t[s[n]]); + } + return e; + }; + const d = 500; + let f = window.location && window.location.href, p = !1; + try { + f = window.top.location.href; + } catch (t) { + } + function b(t) { + var { + throttle: i = c, + sendMaxLog: e = !0, + logJsonState: v = !1 + } = t, m = l(t, [ + 'throttle', + 'sendMaxLog', + 'logJsonState' + ]); + if (!p) + if (m.playerDestroyed && (p = !0), m.sessionId = a.a.sessionId, o && (a.a.incrementLogCount(m.message), a.a.isMaxLogOverflow(m.message) && b({ + message: 'Logging_max_log_overflow_1000', + exception: m.message, + callStack: m.callStack, + level: r.ProtoLoggingLevelEnum.FATAL, + sendMaxLog: !1, + throttle: 100, + sessionId: a.a.sessionId + }), a.a.isMaxLog(m.message, i))) + e && !a.a.isMaxLogSent(m.message) && (a.a.setMaxLogSent(m.message), b({ + message: 'Logging_max_log_sent', + exception: m.message, + callStack: m.callStack, + level: r.ProtoLoggingLevelEnum.FATAL, + sessionId: a.a.sessionId + })); + else { + if (v && (m.callStack = u.a.getJsonString()), void 0 === m.callStack) { + const t = new Error(m.message); + m.callStack = t.stack; + } + if (m.callStack = m.callStack.substring(0, d), s.a.logToServer) { + m.pageUrl = f, m.version = s.a.version; + const t = { + requestData: m, + endpoint: h.a.endPoints.tracking.logging, + ProtoRequest: r.ProtoLoggingRequest, + logError: !0 + }; + m.sendBeacon ? n.a.sendProtoBeaconRequest(t) : n.a.sendProtoRequest(t).catch(t => { + }); + } + s.a.logToConsole && function (t) { + let i; + switch (t.level) { + case r.ProtoLoggingLevelEnum.FATAL: + i = '#8B0000'; + break; + case r.ProtoLoggingLevelEnum.WARNING: + i = '#FF8C00'; + break; + case r.ProtoLoggingLevelEnum.INFO: + i = '#000000'; + } + console.log(`%cConnatix Logging:\n message: ${ t.message }\n exception: ${ t.exception }\n level: ${ t.level }\n version: ${ t.version }\n sessionId: ${ t.sessionId }\n callStack: ${ t.callStack }`, `color:${ i }`); + }(m); + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'g', function () { + return o; + }), e.d(i, 'm', function () { + return c; + }), e.d(i, 'e', function () { + return u; + }), e.d(i, 'c', function () { + return l; + }), e.d(i, 'f', function () { + return d; + }), e.d(i, 'h', function () { + return f; + }), e.d(i, 'i', function () { + return p; + }), e.d(i, 'l', function () { + return b; + }), e.d(i, 'j', function () { + return v; + }), e.d(i, 'a', function () { + return m; + }), e.d(i, 'b', function () { + return g; + }), e.d(i, 'n', function () { + return y; + }), e.d(i, 'k', function () { + return w; + }), e.d(i, 'd', function () { + return O; + }); + var s = e(31), n = e(8), r = e(1), h = e(5), a = e(0); + function o(t, i) { + return i.indexOf(t) > -1; + } + function c(t) { + return Array.isArray(t) ? t : [t]; + } + function u(t, i) { + const e = [], s = new Map(); + return i.forEach(i => { + s.has(i[t]) || (s.set(i[t], !0), e.push(i)); + }), e; + } + function l(t) { + return [].slice.call(t); + } + function d(t) { + const i = []; + for (const e in t) + e && parseInt(e, 10) >= 0 && i.push(t[e]); + return i; + } + function f(t) { + return t && t.length > 0; + } + function p(t) { + return t.every(t => { + return Object(r.d)(t); + }); + } + function b(t) { + let i = '['; + for (let e = 0; e < t.length; e++) + i += Object(s.c)(t[e]) + (e === t.length - 1 ? '' : ','); + return i += ']'; + } + function v(t, i) { + return !(!t || !i) && (t.length === i.length && (t === i || 0 === t.length && 0 === i.length || t.every((t, e) => { + return Object(n.i)(t, i[e]); + }))); + } + function m(t, i) { + return t.filter(t => { + return !i.includes(t); + }); + } + function g(t, i) { + return t.filter(t => { + return i.includes(t); + }); + } + function y(t) { + return t.filter((i, e) => { + return t.indexOf(i) === e; + }); + } + function w(t, i) { + const e = t.indexOf(i); + -1 !== e ? t.splice(e, 1) : Object(h.a)({ + message: 'removeItemFromArray_error_item_not_found', + exception: JSON.stringify(i), + level: a.ProtoLoggingLevelEnum.WARNING + }); + } + function O(t) { + const i = []; + return t.forEach(t => { + return i.push(t); + }), i; + } + }, + function (t, i, e) { + 'use strict'; + var s, n, r = e(60), h = r.Reader, a = r.Writer, o = r.util, c = r.roots.default || (r.roots.default = {}); + c.ProtoElementsRequest = function () { + function t(t) { + if (this.tokens = [], this.forceLineItemIds = [], this.queryJsTargeting = {}, this.reloadedPlayers = {}, t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.tokens = o.emptyArray, t.prototype.pageUrl = '', t.prototype.userId = '', t.prototype.forcePlayerId = '', t.prototype.forceMediaId = '', t.prototype.forcePlaylistId = '', t.prototype.version = 0, t.prototype.forceLineItemIds = o.emptyArray, t.prototype.clientAb0 = 0, t.prototype.clientAb1 = 0, t.prototype.customParam1 = '', t.prototype.customParam2 = '', t.prototype.customParam3 = '', t.prototype.forceExploration = !1, t.prototype.es6 = !1, t.prototype.bundleId = '', t.prototype.forceSourceItemId = '', t.prototype.parseDomain = !1, t.prototype.implementationType = 0, t.prototype.queryJsTargeting = o.emptyObject, t.prototype.isConsentConnatix = !0, t.prototype.reloadedPlayers = o.emptyObject, t.prototype.disableTracking = !1, t.prototype.referrer = '', t.prototype.localTimestamp = o.Long ? o.Long.fromBits(0, 0, !1) : 0, t.prototype.customParam4 = '', t.prototype.customParam5 = '', t.encode = function (t, i) { + if (i || (i = a.create()), null != t.tokens && t.tokens.length) + for (var e = 0; e < t.tokens.length; ++e) + i.uint32(10).string(t.tokens[e]); + if (null != t.pageUrl && Object.hasOwnProperty.call(t, 'pageUrl') && i.uint32(26).string(t.pageUrl), null != t.userId && Object.hasOwnProperty.call(t, 'userId') && i.uint32(42).string(t.userId), null != t.forcePlayerId && Object.hasOwnProperty.call(t, 'forcePlayerId') && i.uint32(58).string(t.forcePlayerId), null != t.forceMediaId && Object.hasOwnProperty.call(t, 'forceMediaId') && i.uint32(66).string(t.forceMediaId), null != t.forcePlaylistId && Object.hasOwnProperty.call(t, 'forcePlaylistId') && i.uint32(74).string(t.forcePlaylistId), null != t.version && Object.hasOwnProperty.call(t, 'version') && i.uint32(80).int32(t.version), null != t.forceLineItemIds && t.forceLineItemIds.length) + for (e = 0; e < t.forceLineItemIds.length; ++e) + i.uint32(90).string(t.forceLineItemIds[e]); + if (null != t.clientAb0 && Object.hasOwnProperty.call(t, 'clientAb0') && i.uint32(96).int32(t.clientAb0), null != t.clientAb1 && Object.hasOwnProperty.call(t, 'clientAb1') && i.uint32(104).int32(t.clientAb1), null != t.customParam1 && Object.hasOwnProperty.call(t, 'customParam1') && i.uint32(130).string(t.customParam1), null != t.customParam2 && Object.hasOwnProperty.call(t, 'customParam2') && i.uint32(138).string(t.customParam2), null != t.customParam3 && Object.hasOwnProperty.call(t, 'customParam3') && i.uint32(146).string(t.customParam3), null != t.forceExploration && Object.hasOwnProperty.call(t, 'forceExploration') && i.uint32(160).bool(t.forceExploration), null != t.es6 && Object.hasOwnProperty.call(t, 'es6') && i.uint32(168).bool(t.es6), null != t.bundleId && Object.hasOwnProperty.call(t, 'bundleId') && i.uint32(178).string(t.bundleId), null != t.forceSourceItemId && Object.hasOwnProperty.call(t, 'forceSourceItemId') && i.uint32(186).string(t.forceSourceItemId), null != t.parseDomain && Object.hasOwnProperty.call(t, 'parseDomain') && i.uint32(192).bool(t.parseDomain), null != t.implementationType && Object.hasOwnProperty.call(t, 'implementationType') && i.uint32(200).int32(t.implementationType), null != t.queryJsTargeting && Object.hasOwnProperty.call(t, 'queryJsTargeting')) { + var s = Object.keys(t.queryJsTargeting); + for (e = 0; e < s.length; ++e) + i.uint32(210).fork().uint32(10).string(s[e]).uint32(18).string(t.queryJsTargeting[s[e]]).ldelim(); + } + if (null != t.isConsentConnatix && Object.hasOwnProperty.call(t, 'isConsentConnatix') && i.uint32(216).bool(t.isConsentConnatix), null != t.reloadedPlayers && Object.hasOwnProperty.call(t, 'reloadedPlayers')) + for (s = Object.keys(t.reloadedPlayers), e = 0; e < s.length; ++e) + i.uint32(234).fork().uint32(10).string(s[e]).uint32(18).string(t.reloadedPlayers[s[e]]).ldelim(); + return null != t.disableTracking && Object.hasOwnProperty.call(t, 'disableTracking') && i.uint32(248).bool(t.disableTracking), null != t.referrer && Object.hasOwnProperty.call(t, 'referrer') && i.uint32(258).string(t.referrer), null != t.localTimestamp && Object.hasOwnProperty.call(t, 'localTimestamp') && i.uint32(264).int64(t.localTimestamp), null != t.customParam4 && Object.hasOwnProperty.call(t, 'customParam4') && i.uint32(274).string(t.customParam4), null != t.customParam5 && Object.hasOwnProperty.call(t, 'customParam5') && i.uint32(282).string(t.customParam5), i; + }, t.fromObject = function (t) { + if (t instanceof c.ProtoElementsRequest) + return t; + var i = new c.ProtoElementsRequest(); + if (t.tokens) { + if (!Array.isArray(t.tokens)) + throw TypeError('.ProtoElementsRequest.tokens: array expected'); + i.tokens = []; + for (var e = 0; e < t.tokens.length; ++e) + i.tokens[e] = String(t.tokens[e]); + } + if (null != t.pageUrl && (i.pageUrl = String(t.pageUrl)), null != t.userId && (i.userId = String(t.userId)), null != t.forcePlayerId && (i.forcePlayerId = String(t.forcePlayerId)), null != t.forceMediaId && (i.forceMediaId = String(t.forceMediaId)), null != t.forcePlaylistId && (i.forcePlaylistId = String(t.forcePlaylistId)), null != t.version && (i.version = 0 | t.version), t.forceLineItemIds) { + if (!Array.isArray(t.forceLineItemIds)) + throw TypeError('.ProtoElementsRequest.forceLineItemIds: array expected'); + i.forceLineItemIds = []; + for (e = 0; e < t.forceLineItemIds.length; ++e) + i.forceLineItemIds[e] = String(t.forceLineItemIds[e]); + } + switch (null != t.clientAb0 && (i.clientAb0 = 0 | t.clientAb0), null != t.clientAb1 && (i.clientAb1 = 0 | t.clientAb1), null != t.customParam1 && (i.customParam1 = String(t.customParam1)), null != t.customParam2 && (i.customParam2 = String(t.customParam2)), null != t.customParam3 && (i.customParam3 = String(t.customParam3)), null != t.forceExploration && (i.forceExploration = Boolean(t.forceExploration)), null != t.es6 && (i.es6 = Boolean(t.es6)), null != t.bundleId && (i.bundleId = String(t.bundleId)), null != t.forceSourceItemId && (i.forceSourceItemId = String(t.forceSourceItemId)), null != t.parseDomain && (i.parseDomain = Boolean(t.parseDomain)), t.implementationType) { + case 'Web': + case 0: + i.implementationType = 0; + break; + case 'Amp': + case 1: + i.implementationType = 1; + } + if (t.queryJsTargeting) { + if ('object' != typeof t.queryJsTargeting) + throw TypeError('.ProtoElementsRequest.queryJsTargeting: object expected'); + i.queryJsTargeting = {}; + var s = Object.keys(t.queryJsTargeting); + for (e = 0; e < s.length; ++e) + i.queryJsTargeting[s[e]] = String(t.queryJsTargeting[s[e]]); + } + if (null != t.isConsentConnatix && (i.isConsentConnatix = Boolean(t.isConsentConnatix)), t.reloadedPlayers) { + if ('object' != typeof t.reloadedPlayers) + throw TypeError('.ProtoElementsRequest.reloadedPlayers: object expected'); + i.reloadedPlayers = {}; + for (s = Object.keys(t.reloadedPlayers), e = 0; e < s.length; ++e) + i.reloadedPlayers[s[e]] = String(t.reloadedPlayers[s[e]]); + } + return null != t.disableTracking && (i.disableTracking = Boolean(t.disableTracking)), null != t.referrer && (i.referrer = String(t.referrer)), null != t.localTimestamp && (o.Long ? (i.localTimestamp = o.Long.fromValue(t.localTimestamp)).unsigned = !1 : 'string' == typeof t.localTimestamp ? i.localTimestamp = parseInt(t.localTimestamp, 10) : 'number' == typeof t.localTimestamp ? i.localTimestamp = t.localTimestamp : 'object' == typeof t.localTimestamp && (i.localTimestamp = new o.LongBits(t.localTimestamp.low >>> 0, t.localTimestamp.high >>> 0).toNumber())), null != t.customParam4 && (i.customParam4 = String(t.customParam4)), null != t.customParam5 && (i.customParam5 = String(t.customParam5)), i; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoPlaylistItem = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.mediaId = '', t.prototype.revisionNumber = 0, t.prototype.mediaContentVersionId = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoPlaylistItem(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.mediaId = t.string(); + break; + case 2: + s.revisionNumber = t.int32(); + break; + case 3: + s.mediaContentVersionId = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.mediaId = '', e.revisionNumber = 0, e.mediaContentVersionId = ''), null != t.mediaId && t.hasOwnProperty('mediaId') && (e.mediaId = t.mediaId), null != t.revisionNumber && t.hasOwnProperty('revisionNumber') && (e.revisionNumber = t.revisionNumber), null != t.mediaContentVersionId && t.hasOwnProperty('mediaContentVersionId') && (e.mediaContentVersionId = t.mediaContentVersionId), e; + }, t; + }(), c.ProtoElements = function () { + function t(t) { + if (this.sharingDestinations = [], this.floatingDeviceMode = [], this.lineItems = [], this.playlist = [], this.adBreaks = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.playerId = '', t.prototype.playbackMode = 0, t.prototype.soundMode = 0, t.prototype.upNextMode = 1, t.prototype.containerSelector = '', t.prototype.position = 0, t.prototype.insertPosition = 0, t.prototype.forceInsertPath = !1, t.prototype.renderInFrame = !1, t.prototype.scrollHijackingProtection = !1, t.prototype.preRollBreak = 0, t.prototype.postRollBreak = 0, t.prototype.midRollNumber = -1, t.prototype.timeBetweenAds = 0, t.prototype.minTimeBeforeFirstAd = 0, t.prototype.adViewabilityPolicy = 0, t.prototype.responsive = !1, t.prototype.ratioWidth = 0, t.prototype.ratioHeight = 0, t.prototype.fixedWidth = 0, t.prototype.fixedHeight = 0, t.prototype.casting = !1, t.prototype.sharingDestinations = o.emptyArray, t.prototype.closedCaption = !1, t.prototype.muteWatermark = !1, t.prototype.expandButton = !1, t.prototype.closeButtonMode = 0, t.prototype.floatingMode = 0, t.prototype.floatingDeviceMode = o.emptyArray, t.prototype.floatingCloseButtonMode = 0, t.prototype.floatingFixedPosition = 0, t.prototype.floatingPageElement = '', t.prototype.floatingUseElementWidth = !1, t.prototype.floatingScrollPosition = 0, t.prototype.floatingGutterX = 0, t.prototype.floatingGutterY = 0, t.prototype.floatingWidth = 0, t.prototype.iconsColor = '', t.prototype.accentColor = '', t.prototype.tooltipTextColor = '', t.prototype.tooltipBackgroundColor = '', t.prototype.html = '', t.prototype.galleryStyle = 0, t.prototype.logoPosition = 0, t.prototype.logoUrl = '', t.prototype.lineItems = o.emptyArray, t.prototype.adPlaybackMode = 0, t.prototype.css = '', t.prototype.sessionId = '', t.prototype.playlistId = '', t.prototype.playerType = 0, t.prototype.outstreamInitialRendering = 0, t.prototype.outstreamHouseBackgroundColor = '', t.prototype.outstreamTotalAdBreakLength = 0, t.prototype.outstreamEndAdBreakPolicy = 0, t.prototype.galleryOrientation = 0, t.prototype.playlist = o.emptyArray, t.prototype.floatingAppendLocation = 0, t.prototype.floatingYAxisPadding = 0, t.prototype.customJsCode = '', t.prototype.videoQuality = 0, t.prototype.initializationSettingsJson = '', t.prototype.adSkippability = 0, t.prototype.skipAdAfter = 5, t.prototype.adBreaks = o.emptyArray, t.prototype.amazonTamSlotId = '', t.prototype.midRollOnlyOnLongContent = !0, t.prototype.limitClientSideApiUse = !1, t.prototype.abTestId = '', t.prototype.adsMustBeSkippableIfLongerThan = 31, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoElements(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.playerId = t.string(); + break; + case 2: + s.playbackMode = t.int32(); + break; + case 3: + s.soundMode = t.int32(); + break; + case 4: + s.upNextMode = t.int32(); + break; + case 5: + s.containerSelector = t.string(); + break; + case 6: + s.position = t.int32(); + break; + case 7: + s.insertPosition = t.int32(); + break; + case 8: + s.forceInsertPath = t.bool(); + break; + case 9: + s.renderInFrame = t.bool(); + break; + case 10: + s.scrollHijackingProtection = t.bool(); + break; + case 11: + s.preRollBreak = t.int32(); + break; + case 12: + s.postRollBreak = t.int32(); + break; + case 13: + s.midRollNumber = t.int32(); + break; + case 14: + s.timeBetweenAds = t.int32(); + break; + case 15: + s.minTimeBeforeFirstAd = t.int32(); + break; + case 16: + s.adViewabilityPolicy = t.int32(); + break; + case 18: + s.responsive = t.bool(); + break; + case 19: + s.ratioWidth = t.int32(); + break; + case 20: + s.ratioHeight = t.int32(); + break; + case 21: + s.fixedWidth = t.int32(); + break; + case 22: + s.fixedHeight = t.int32(); + break; + case 23: + s.casting = t.bool(); + break; + case 24: + if (s.sharingDestinations && s.sharingDestinations.length || (s.sharingDestinations = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.sharingDestinations.push(t.int32()); + else + s.sharingDestinations.push(t.int32()); + break; + case 25: + s.closedCaption = t.bool(); + break; + case 26: + s.muteWatermark = t.bool(); + break; + case 27: + s.expandButton = t.bool(); + break; + case 28: + s.closeButtonMode = t.int32(); + break; + case 29: + s.floatingMode = t.int32(); + break; + case 30: + if (s.floatingDeviceMode && s.floatingDeviceMode.length || (s.floatingDeviceMode = []), 2 == (7 & n)) + for (r = t.uint32() + t.pos; t.pos < r;) + s.floatingDeviceMode.push(t.int32()); + else + s.floatingDeviceMode.push(t.int32()); + break; + case 31: + s.floatingCloseButtonMode = t.int32(); + break; + case 32: + s.floatingFixedPosition = t.int32(); + break; + case 33: + s.floatingPageElement = t.string(); + break; + case 34: + s.floatingUseElementWidth = t.bool(); + break; + case 35: + s.floatingScrollPosition = t.int32(); + break; + case 36: + s.floatingGutterX = t.int32(); + break; + case 37: + s.floatingGutterY = t.int32(); + break; + case 38: + s.floatingWidth = t.int32(); + break; + case 39: + s.iconsColor = t.string(); + break; + case 40: + s.accentColor = t.string(); + break; + case 41: + s.tooltipTextColor = t.string(); + break; + case 42: + s.tooltipBackgroundColor = t.string(); + break; + case 43: + s.html = t.string(); + break; + case 45: + s.galleryStyle = t.int32(); + break; + case 46: + s.logoPosition = t.int32(); + break; + case 47: + s.logoUrl = t.string(); + break; + case 49: + s.lineItems && s.lineItems.length || (s.lineItems = []), s.lineItems.push(c.ProtoLineItem.decode(t, t.uint32())); + break; + case 50: + s.adPlaybackMode = t.int32(); + break; + case 51: + s.css = t.string(); + break; + case 52: + s.sessionId = t.string(); + break; + case 53: + s.playlistId = t.string(); + break; + case 54: + s.playerType = t.int32(); + break; + case 55: + s.outstreamInitialRendering = t.int32(); + break; + case 56: + s.outstreamHouseBackgroundColor = t.string(); + break; + case 57: + s.outstreamTotalAdBreakLength = t.int32(); + break; + case 58: + s.outstreamEndAdBreakPolicy = t.int32(); + break; + case 59: + s.galleryOrientation = t.int32(); + break; + case 60: + s.playlist && s.playlist.length || (s.playlist = []), s.playlist.push(c.ProtoPlaylistItem.decode(t, t.uint32())); + break; + case 61: + s.floatingAppendLocation = t.int32(); + break; + case 62: + s.floatingYAxisPadding = t.int32(); + break; + case 63: + s.customJsCode = t.string(); + break; + case 64: + s.videoQuality = t.int32(); + break; + case 65: + s.initializationSettingsJson = t.string(); + break; + case 66: + s.adSkippability = t.int32(); + break; + case 67: + s.skipAdAfter = t.int32(); + break; + case 68: + s.adBreaks && s.adBreaks.length || (s.adBreaks = []), s.adBreaks.push(c.ProtoAdBreak.decode(t, t.uint32())); + break; + case 69: + s.amazonTamSlotId = t.string(); + break; + case 70: + s.midRollOnlyOnLongContent = t.bool(); + break; + case 71: + s.limitClientSideApiUse = t.bool(); + break; + case 72: + s.abTestId = t.string(); + break; + case 73: + s.adsMustBeSkippableIfLongerThan = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.sharingDestinations = [], e.floatingDeviceMode = [], e.lineItems = [], e.playlist = [], e.adBreaks = []), i.defaults && (e.playerId = '', e.playbackMode = i.enums === String ? 'Autoplay' : 0, e.soundMode = i.enums === String ? 'Mute' : 0, e.upNextMode = i.enums === String ? 'Next' : 1, e.containerSelector = '', e.position = 0, e.insertPosition = i.enums === String ? 'WithinContainer' : 0, e.forceInsertPath = !1, e.renderInFrame = !1, e.scrollHijackingProtection = !1, e.preRollBreak = 0, e.postRollBreak = 0, e.midRollNumber = -1, e.timeBetweenAds = 0, e.minTimeBeforeFirstAd = 0, e.adViewabilityPolicy = i.enums === String ? 'Default' : 0, e.responsive = !1, e.ratioWidth = 0, e.ratioHeight = 0, e.fixedWidth = 0, e.fixedHeight = 0, e.casting = !1, e.closedCaption = !1, e.muteWatermark = !1, e.expandButton = !1, e.closeButtonMode = i.enums === String ? 'Off' : 0, e.floatingMode = i.enums === String ? 'Off' : 0, e.floatingCloseButtonMode = i.enums === String ? 'Off' : 0, e.floatingFixedPosition = i.enums === String ? 'Page' : 0, e.floatingPageElement = '', e.floatingUseElementWidth = !1, e.floatingScrollPosition = i.enums === String ? 'BottomRight' : 0, e.floatingGutterX = 0, e.floatingGutterY = 0, e.floatingWidth = 0, e.iconsColor = '', e.accentColor = '', e.tooltipTextColor = '', e.tooltipBackgroundColor = '', e.html = '', e.galleryStyle = i.enums === String ? 'None' : 0, e.logoPosition = i.enums === String ? 'None' : 0, e.logoUrl = '', e.adPlaybackMode = i.enums === String ? 'Autoplay' : 0, e.css = '', e.sessionId = '', e.playlistId = '', e.playerType = i.enums === String ? 'InStream' : 0, e.outstreamInitialRendering = i.enums === String ? 'ExpandWithAd' : 0, e.outstreamHouseBackgroundColor = '', e.outstreamTotalAdBreakLength = 0, e.outstreamEndAdBreakPolicy = i.enums === String ? 'Hide' : 0, e.galleryOrientation = i.enums === String ? 'Landscape' : 0, e.floatingAppendLocation = i.enums === String ? 'Above' : 0, e.floatingYAxisPadding = 0, e.customJsCode = '', e.videoQuality = i.enums === String ? 'Auto' : 0, e.initializationSettingsJson = '', e.adSkippability = i.enums === String ? 'IfLongerThan' : 0, e.skipAdAfter = 5, e.amazonTamSlotId = '', e.midRollOnlyOnLongContent = !0, e.limitClientSideApiUse = !1, e.abTestId = '', e.adsMustBeSkippableIfLongerThan = 31), null != t.playerId && t.hasOwnProperty('playerId') && (e.playerId = t.playerId), null != t.playbackMode && t.hasOwnProperty('playbackMode') && (e.playbackMode = i.enums === String ? c.ProtoPlayerPlaybackModeEnum[t.playbackMode] : t.playbackMode), null != t.soundMode && t.hasOwnProperty('soundMode') && (e.soundMode = i.enums === String ? c.ProtoPlayerSoundMode[t.soundMode] : t.soundMode), null != t.upNextMode && t.hasOwnProperty('upNextMode') && (e.upNextMode = i.enums === String ? c.ProtoPlayerUpNextMode[t.upNextMode] : t.upNextMode), null != t.containerSelector && t.hasOwnProperty('containerSelector') && (e.containerSelector = t.containerSelector), null != t.position && t.hasOwnProperty('position') && (e.position = t.position), null != t.insertPosition && t.hasOwnProperty('insertPosition') && (e.insertPosition = i.enums === String ? c.ProtoPlayerInsertMode[t.insertPosition] : t.insertPosition), null != t.forceInsertPath && t.hasOwnProperty('forceInsertPath') && (e.forceInsertPath = t.forceInsertPath), null != t.renderInFrame && t.hasOwnProperty('renderInFrame') && (e.renderInFrame = t.renderInFrame), null != t.scrollHijackingProtection && t.hasOwnProperty('scrollHijackingProtection') && (e.scrollHijackingProtection = t.scrollHijackingProtection), null != t.preRollBreak && t.hasOwnProperty('preRollBreak') && (e.preRollBreak = t.preRollBreak), null != t.postRollBreak && t.hasOwnProperty('postRollBreak') && (e.postRollBreak = t.postRollBreak), null != t.midRollNumber && t.hasOwnProperty('midRollNumber') && (e.midRollNumber = t.midRollNumber), null != t.timeBetweenAds && t.hasOwnProperty('timeBetweenAds') && (e.timeBetweenAds = t.timeBetweenAds), null != t.minTimeBeforeFirstAd && t.hasOwnProperty('minTimeBeforeFirstAd') && (e.minTimeBeforeFirstAd = t.minTimeBeforeFirstAd), null != t.adViewabilityPolicy && t.hasOwnProperty('adViewabilityPolicy') && (e.adViewabilityPolicy = i.enums === String ? c.ProtoAdViewabilityPolicy[t.adViewabilityPolicy] : t.adViewabilityPolicy), null != t.responsive && t.hasOwnProperty('responsive') && (e.responsive = t.responsive), null != t.ratioWidth && t.hasOwnProperty('ratioWidth') && (e.ratioWidth = t.ratioWidth), null != t.ratioHeight && t.hasOwnProperty('ratioHeight') && (e.ratioHeight = t.ratioHeight), null != t.fixedWidth && t.hasOwnProperty('fixedWidth') && (e.fixedWidth = t.fixedWidth), null != t.fixedHeight && t.hasOwnProperty('fixedHeight') && (e.fixedHeight = t.fixedHeight), null != t.casting && t.hasOwnProperty('casting') && (e.casting = t.casting), t.sharingDestinations && t.sharingDestinations.length) { + e.sharingDestinations = []; + for (var s = 0; s < t.sharingDestinations.length; ++s) + e.sharingDestinations[s] = i.enums === String ? c.ProtoSharingDestination[t.sharingDestinations[s]] : t.sharingDestinations[s]; + } + if (null != t.closedCaption && t.hasOwnProperty('closedCaption') && (e.closedCaption = t.closedCaption), null != t.muteWatermark && t.hasOwnProperty('muteWatermark') && (e.muteWatermark = t.muteWatermark), null != t.expandButton && t.hasOwnProperty('expandButton') && (e.expandButton = t.expandButton), null != t.closeButtonMode && t.hasOwnProperty('closeButtonMode') && (e.closeButtonMode = i.enums === String ? c.ProtoPlayerCloseButtonMode[t.closeButtonMode] : t.closeButtonMode), null != t.floatingMode && t.hasOwnProperty('floatingMode') && (e.floatingMode = i.enums === String ? c.ProtoPlayerFloatingMode[t.floatingMode] : t.floatingMode), t.floatingDeviceMode && t.floatingDeviceMode.length) { + e.floatingDeviceMode = []; + for (s = 0; s < t.floatingDeviceMode.length; ++s) + e.floatingDeviceMode[s] = i.enums === String ? c.ProtoDeviceType[t.floatingDeviceMode[s]] : t.floatingDeviceMode[s]; + } + if (null != t.floatingCloseButtonMode && t.hasOwnProperty('floatingCloseButtonMode') && (e.floatingCloseButtonMode = i.enums === String ? c.ProtoPlayerCloseButtonMode[t.floatingCloseButtonMode] : t.floatingCloseButtonMode), null != t.floatingFixedPosition && t.hasOwnProperty('floatingFixedPosition') && (e.floatingFixedPosition = i.enums === String ? c.ProtoFloatingFixedPositionMode[t.floatingFixedPosition] : t.floatingFixedPosition), null != t.floatingPageElement && t.hasOwnProperty('floatingPageElement') && (e.floatingPageElement = t.floatingPageElement), null != t.floatingUseElementWidth && t.hasOwnProperty('floatingUseElementWidth') && (e.floatingUseElementWidth = t.floatingUseElementWidth), null != t.floatingScrollPosition && t.hasOwnProperty('floatingScrollPosition') && (e.floatingScrollPosition = i.enums === String ? c.ProtoPositionMode[t.floatingScrollPosition] : t.floatingScrollPosition), null != t.floatingGutterX && t.hasOwnProperty('floatingGutterX') && (e.floatingGutterX = t.floatingGutterX), null != t.floatingGutterY && t.hasOwnProperty('floatingGutterY') && (e.floatingGutterY = t.floatingGutterY), null != t.floatingWidth && t.hasOwnProperty('floatingWidth') && (e.floatingWidth = t.floatingWidth), null != t.iconsColor && t.hasOwnProperty('iconsColor') && (e.iconsColor = t.iconsColor), null != t.accentColor && t.hasOwnProperty('accentColor') && (e.accentColor = t.accentColor), null != t.tooltipTextColor && t.hasOwnProperty('tooltipTextColor') && (e.tooltipTextColor = t.tooltipTextColor), null != t.tooltipBackgroundColor && t.hasOwnProperty('tooltipBackgroundColor') && (e.tooltipBackgroundColor = t.tooltipBackgroundColor), null != t.html && t.hasOwnProperty('html') && (e.html = t.html), null != t.galleryStyle && t.hasOwnProperty('galleryStyle') && (e.galleryStyle = i.enums === String ? c.ProtoGalleryStyleMode[t.galleryStyle] : t.galleryStyle), null != t.logoPosition && t.hasOwnProperty('logoPosition') && (e.logoPosition = i.enums === String ? c.ProtoLogoPositionMode[t.logoPosition] : t.logoPosition), null != t.logoUrl && t.hasOwnProperty('logoUrl') && (e.logoUrl = t.logoUrl), t.lineItems && t.lineItems.length) { + e.lineItems = []; + for (s = 0; s < t.lineItems.length; ++s) + e.lineItems[s] = c.ProtoLineItem.toObject(t.lineItems[s], i); + } + if (null != t.adPlaybackMode && t.hasOwnProperty('adPlaybackMode') && (e.adPlaybackMode = i.enums === String ? c.ProtoAdPlaybackMode[t.adPlaybackMode] : t.adPlaybackMode), null != t.css && t.hasOwnProperty('css') && (e.css = t.css), null != t.sessionId && t.hasOwnProperty('sessionId') && (e.sessionId = t.sessionId), null != t.playlistId && t.hasOwnProperty('playlistId') && (e.playlistId = t.playlistId), null != t.playerType && t.hasOwnProperty('playerType') && (e.playerType = i.enums === String ? c.ProtoElementsTypeEnum[t.playerType] : t.playerType), null != t.outstreamInitialRendering && t.hasOwnProperty('outstreamInitialRendering') && (e.outstreamInitialRendering = i.enums === String ? c.ProtoOutstreamInitialRenderingEnum[t.outstreamInitialRendering] : t.outstreamInitialRendering), null != t.outstreamHouseBackgroundColor && t.hasOwnProperty('outstreamHouseBackgroundColor') && (e.outstreamHouseBackgroundColor = t.outstreamHouseBackgroundColor), null != t.outstreamTotalAdBreakLength && t.hasOwnProperty('outstreamTotalAdBreakLength') && (e.outstreamTotalAdBreakLength = t.outstreamTotalAdBreakLength), null != t.outstreamEndAdBreakPolicy && t.hasOwnProperty('outstreamEndAdBreakPolicy') && (e.outstreamEndAdBreakPolicy = i.enums === String ? c.ProtoOutstreamEndAdBreakPolicyEnum[t.outstreamEndAdBreakPolicy] : t.outstreamEndAdBreakPolicy), null != t.galleryOrientation && t.hasOwnProperty('galleryOrientation') && (e.galleryOrientation = i.enums === String ? c.ProtoGalleryOrientationEnum[t.galleryOrientation] : t.galleryOrientation), t.playlist && t.playlist.length) { + e.playlist = []; + for (s = 0; s < t.playlist.length; ++s) + e.playlist[s] = c.ProtoPlaylistItem.toObject(t.playlist[s], i); + } + if (null != t.floatingAppendLocation && t.hasOwnProperty('floatingAppendLocation') && (e.floatingAppendLocation = i.enums === String ? c.ProtoFloatingAppendLocationEnum[t.floatingAppendLocation] : t.floatingAppendLocation), null != t.floatingYAxisPadding && t.hasOwnProperty('floatingYAxisPadding') && (e.floatingYAxisPadding = t.floatingYAxisPadding), null != t.customJsCode && t.hasOwnProperty('customJsCode') && (e.customJsCode = t.customJsCode), null != t.videoQuality && t.hasOwnProperty('videoQuality') && (e.videoQuality = i.enums === String ? c.ProtoVideoQuality[t.videoQuality] : t.videoQuality), null != t.initializationSettingsJson && t.hasOwnProperty('initializationSettingsJson') && (e.initializationSettingsJson = t.initializationSettingsJson), null != t.adSkippability && t.hasOwnProperty('adSkippability') && (e.adSkippability = i.enums === String ? c.ProtoPlayerAdSkippability[t.adSkippability] : t.adSkippability), null != t.skipAdAfter && t.hasOwnProperty('skipAdAfter') && (e.skipAdAfter = t.skipAdAfter), t.adBreaks && t.adBreaks.length) { + e.adBreaks = []; + for (s = 0; s < t.adBreaks.length; ++s) + e.adBreaks[s] = c.ProtoAdBreak.toObject(t.adBreaks[s], i); + } + return null != t.amazonTamSlotId && t.hasOwnProperty('amazonTamSlotId') && (e.amazonTamSlotId = t.amazonTamSlotId), null != t.midRollOnlyOnLongContent && t.hasOwnProperty('midRollOnlyOnLongContent') && (e.midRollOnlyOnLongContent = t.midRollOnlyOnLongContent), null != t.limitClientSideApiUse && t.hasOwnProperty('limitClientSideApiUse') && (e.limitClientSideApiUse = t.limitClientSideApiUse), null != t.abTestId && t.hasOwnProperty('abTestId') && (e.abTestId = t.abTestId), null != t.adsMustBeSkippableIfLongerThan && t.hasOwnProperty('adsMustBeSkippableIfLongerThan') && (e.adsMustBeSkippableIfLongerThan = t.adsMustBeSkippableIfLongerThan), e; + }, t; + }(), c.ProtoElementsResponse = function () { + function t(t) { + if (this.players = [], this.lineItems = [], this.cookieSyncUrls = {}, t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.errorMessage = '', t.prototype.players = o.emptyArray, t.prototype.browser = null, t.prototype.geoLocation = null, t.prototype.lineItems = o.emptyArray, t.prototype.cookieSyncUrls = o.emptyObject, t.prototype.explorationMode = !1, t.prototype.supplyChain = null, t.prototype.secondLevelDomain = '', t.prototype.userInformation = null, t.prototype.serverAb0 = 0, t.prototype.serverAb1 = 0, t.prototype.isSeoTraffic = !1, t.prototype.bandwidthLoggingEnabled = !1, t.prototype.publisherNetworkCode = 0, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e, s, n = void 0 === i ? t.len : t.pos + i, r = new c.ProtoElementsResponse(); t.pos < n;) { + var a = t.uint32(); + switch (a >>> 3) { + case 1: + r.errorMessage = t.string(); + break; + case 10: + r.players && r.players.length || (r.players = []), r.players.push(c.ProtoElements.decode(t, t.uint32())); + break; + case 11: + r.browser = c.Browser.decode(t, t.uint32()); + break; + case 12: + r.geoLocation = c.GeoLocation.decode(t, t.uint32()); + break; + case 13: + r.lineItems && r.lineItems.length || (r.lineItems = []), r.lineItems.push(c.ProtoLineItem.decode(t, t.uint32())); + break; + case 14: + r.cookieSyncUrls === o.emptyObject && (r.cookieSyncUrls = {}); + var u = t.uint32() + t.pos; + for (e = 0, s = ''; t.pos < u;) { + var l = t.uint32(); + switch (l >>> 3) { + case 1: + e = t.int32(); + break; + case 2: + s = t.string(); + break; + default: + t.skipType(7 & l); + } + } + r.cookieSyncUrls[e] = s; + break; + case 15: + r.explorationMode = t.bool(); + break; + case 17: + r.supplyChain = c.ProtoSupplyChain.decode(t, t.uint32()); + break; + case 18: + r.secondLevelDomain = t.string(); + break; + case 20: + r.userInformation = c.ProtoUserInformation.decode(t, t.uint32()); + break; + case 21: + r.serverAb0 = t.int32(); + break; + case 22: + r.serverAb1 = t.int32(); + break; + case 23: + r.isSeoTraffic = t.bool(); + break; + case 24: + r.bandwidthLoggingEnabled = t.bool(); + break; + case 25: + r.publisherNetworkCode = t.int32(); + break; + default: + t.skipType(7 & a); + } + } + return r; + }, t.toObject = function (t, i) { + i || (i = {}); + var e, s = {}; + if ((i.arrays || i.defaults) && (s.players = [], s.lineItems = []), (i.objects || i.defaults) && (s.cookieSyncUrls = {}), i.defaults && (s.errorMessage = '', s.browser = null, s.geoLocation = null, s.explorationMode = !1, s.supplyChain = null, s.secondLevelDomain = '', s.userInformation = null, s.serverAb0 = 0, s.serverAb1 = 0, s.isSeoTraffic = !1, s.bandwidthLoggingEnabled = !1, s.publisherNetworkCode = 0), null != t.errorMessage && t.hasOwnProperty('errorMessage') && (s.errorMessage = t.errorMessage), t.players && t.players.length) { + s.players = []; + for (var n = 0; n < t.players.length; ++n) + s.players[n] = c.ProtoElements.toObject(t.players[n], i); + } + if (null != t.browser && t.hasOwnProperty('browser') && (s.browser = c.Browser.toObject(t.browser, i)), null != t.geoLocation && t.hasOwnProperty('geoLocation') && (s.geoLocation = c.GeoLocation.toObject(t.geoLocation, i)), t.lineItems && t.lineItems.length) { + s.lineItems = []; + for (n = 0; n < t.lineItems.length; ++n) + s.lineItems[n] = c.ProtoLineItem.toObject(t.lineItems[n], i); + } + if (t.cookieSyncUrls && (e = Object.keys(t.cookieSyncUrls)).length) { + s.cookieSyncUrls = {}; + for (n = 0; n < e.length; ++n) + s.cookieSyncUrls[e[n]] = t.cookieSyncUrls[e[n]]; + } + return null != t.explorationMode && t.hasOwnProperty('explorationMode') && (s.explorationMode = t.explorationMode), null != t.supplyChain && t.hasOwnProperty('supplyChain') && (s.supplyChain = c.ProtoSupplyChain.toObject(t.supplyChain, i)), null != t.secondLevelDomain && t.hasOwnProperty('secondLevelDomain') && (s.secondLevelDomain = t.secondLevelDomain), null != t.userInformation && t.hasOwnProperty('userInformation') && (s.userInformation = c.ProtoUserInformation.toObject(t.userInformation, i)), null != t.serverAb0 && t.hasOwnProperty('serverAb0') && (s.serverAb0 = t.serverAb0), null != t.serverAb1 && t.hasOwnProperty('serverAb1') && (s.serverAb1 = t.serverAb1), null != t.isSeoTraffic && t.hasOwnProperty('isSeoTraffic') && (s.isSeoTraffic = t.isSeoTraffic), null != t.bandwidthLoggingEnabled && t.hasOwnProperty('bandwidthLoggingEnabled') && (s.bandwidthLoggingEnabled = t.bandwidthLoggingEnabled), null != t.publisherNetworkCode && t.hasOwnProperty('publisherNetworkCode') && (s.publisherNetworkCode = t.publisherNetworkCode), s; + }, t; + }(), c.ProtoLineItemAdBreakTargeting = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.adRollType = 0, t.prototype.adBreakTypeEnum = 1, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdBreakTargeting(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.adRollType = t.int32(); + break; + case 2: + s.adBreakTypeEnum = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.adRollType = i.enums === String ? 'None' : 0, e.adBreakTypeEnum = i.enums === String ? 'All' : 1), null != t.adRollType && t.hasOwnProperty('adRollType') && (e.adRollType = i.enums === String ? c.ProtoAdBreakTypeEnum[t.adRollType] : t.adRollType), null != t.adBreakTypeEnum && t.hasOwnProperty('adBreakTypeEnum') && (e.adBreakTypeEnum = i.enums === String ? c.ProtoLineItemAdBreakTypeEnum[t.adBreakTypeEnum] : t.adBreakTypeEnum), e; + }, t; + }(), c.ProtoLineItemAdPodTargeting = function () { + function t(t) { + if (this.adSlotPositions = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.targetingType = 0, t.prototype.adSlotTargetingType = 1, t.prototype.adSlotPositions = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdPodTargeting(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.targetingType = t.int32(); + break; + case 2: + s.adSlotTargetingType = t.int32(); + break; + case 3: + if (s.adSlotPositions && s.adSlotPositions.length || (s.adSlotPositions = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.adSlotPositions.push(t.int32()); + else + s.adSlotPositions.push(t.int32()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.adSlotPositions = []), i.defaults && (e.targetingType = i.enums === String ? 'Only' : 0, e.adSlotTargetingType = i.enums === String ? 'SpecificSlots' : 1), null != t.targetingType && t.hasOwnProperty('targetingType') && (e.targetingType = i.enums === String ? c.ProtoLineItemTargetingTypeEnum[t.targetingType] : t.targetingType), null != t.adSlotTargetingType && t.hasOwnProperty('adSlotTargetingType') && (e.adSlotTargetingType = i.enums === String ? c.ProtoLineItemAdSlotTargetingTypeEnum[t.adSlotTargetingType] : t.adSlotTargetingType), t.adSlotPositions && t.adSlotPositions.length) { + e.adSlotPositions = []; + for (var s = 0; s < t.adSlotPositions.length; ++s) + e.adSlotPositions[s] = t.adSlotPositions[s]; + } + return e; + }, t; + }(), c.ProtoLineItemAdBreakSettings = function () { + function t(t) { + if (this.adBreakTargeting = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.adBreakTargeting = o.emptyArray, t.prototype.adPodTargeting = null, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItemAdBreakSettings(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.adBreakTargeting && s.adBreakTargeting.length || (s.adBreakTargeting = []), s.adBreakTargeting.push(c.ProtoLineItemAdBreakTargeting.decode(t, t.uint32())); + break; + case 2: + s.adPodTargeting = c.ProtoLineItemAdPodTargeting.decode(t, t.uint32()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.adBreakTargeting = []), i.defaults && (e.adPodTargeting = null), t.adBreakTargeting && t.adBreakTargeting.length) { + e.adBreakTargeting = []; + for (var s = 0; s < t.adBreakTargeting.length; ++s) + e.adBreakTargeting[s] = c.ProtoLineItemAdBreakTargeting.toObject(t.adBreakTargeting[s], i); + } + return null != t.adPodTargeting && t.hasOwnProperty('adPodTargeting') && (e.adPodTargeting = c.ProtoLineItemAdPodTargeting.toObject(t.adPodTargeting, i)), e; + }, t; + }(), c.ProtoLineItem = function () { + function t(t) { + if (this.trackers = [], this.renditions = [], this.floorPrices = [], this.advertiserContextualTargeting = [], this.publisherContextualTargeting = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.publisherLineItemId = '', t.prototype.advertiserLineItemId = '', t.prototype.adTag = '', t.prototype.creativeType = 0, t.prototype.sound = !1, t.prototype.viewability = !1, t.prototype.impressionTimeSpent = 0, t.prototype.vendorId = '', t.prototype.trackers = o.emptyArray, t.prototype.duration = 0, t.prototype.renditions = o.emptyArray, t.prototype.mediaCreativeId = '', t.prototype.ignoreFilledRequests = !1, t.prototype.requestCap = 3, t.prototype.impressionCap = 0, t.prototype.successRate = 0, t.prototype.lineItemPriority = 0, t.prototype.headerBidderBids = '', t.prototype.headerBidderTimeout = 0, t.prototype.mediaCreativeClickUrl = '', t.prototype.resetRequestsCapTime = 60, t.prototype.resetImpressionsCapTime = 60, t.prototype.resetCapType = 0, t.prototype.creativeHlsFileName = '', t.prototype.timeBetweenRequests = 0, t.prototype.skipMode = 0, t.prototype.mediaIdTargeting = null, t.prototype.mediaKeywordsTargeting = null, t.prototype.mediaLanguageTargeting = null, t.prototype.adType = 0, t.prototype.overlayTime = 30, t.prototype.floorPrice = 0, t.prototype.adBreakSettings = null, t.prototype.floorPrices = o.emptyArray, t.prototype.bidRate = 0, t.prototype.pauseAdOutOfView = 0, t.prototype.moatTrackingEnabled = !1, t.prototype.cnxCreativeId = '', t.prototype.blockedDomainsRevisionNumber = 0, t.prototype.advertiserContextualTargeting = o.emptyArray, t.prototype.publisherContextualTargeting = o.emptyArray, t.prototype.amazonDealId = '', t.prototype.playerSizeTargetings = null, t.prototype.playerSize = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoLineItem(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.publisherLineItemId = t.string(); + break; + case 2: + s.advertiserLineItemId = t.string(); + break; + case 3: + s.adTag = t.string(); + break; + case 4: + s.creativeType = t.int32(); + break; + case 6: + s.sound = t.bool(); + break; + case 7: + s.viewability = t.bool(); + break; + case 9: + s.impressionTimeSpent = t.int32(); + break; + case 10: + s.vendorId = t.string(); + break; + case 12: + s.trackers && s.trackers.length || (s.trackers = []), s.trackers.push(c.CreativeTrackerViewModel.decode(t, t.uint32())); + break; + case 13: + s.duration = t.int32(); + break; + case 14: + s.renditions && s.renditions.length || (s.renditions = []), s.renditions.push(c.ProtoRendition.decode(t, t.uint32())); + break; + case 15: + s.mediaCreativeId = t.string(); + break; + case 16: + s.ignoreFilledRequests = t.bool(); + break; + case 17: + s.requestCap = t.int32(); + break; + case 18: + s.impressionCap = t.int32(); + break; + case 19: + s.successRate = t.double(); + break; + case 20: + s.lineItemPriority = t.int32(); + break; + case 21: + s.headerBidderBids = t.string(); + break; + case 22: + s.headerBidderTimeout = t.int32(); + break; + case 23: + s.mediaCreativeClickUrl = t.string(); + break; + case 24: + s.resetRequestsCapTime = t.int32(); + break; + case 25: + s.resetImpressionsCapTime = t.int32(); + break; + case 26: + s.resetCapType = t.int32(); + break; + case 27: + s.creativeHlsFileName = t.string(); + break; + case 28: + s.timeBetweenRequests = t.int32(); + break; + case 29: + s.skipMode = t.int32(); + break; + case 30: + s.mediaIdTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 31: + s.mediaKeywordsTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 32: + s.mediaLanguageTargeting = c.ProtoTargetingChoiceModel.decode(t, t.uint32()); + break; + case 33: + s.adType = t.int32(); + break; + case 34: + s.overlayTime = t.int32(); + break; + case 35: + s.floorPrice = t.double(); + break; + case 36: + s.adBreakSettings = c.ProtoLineItemAdBreakSettings.decode(t, t.uint32()); + break; + case 38: + if (s.floorPrices && s.floorPrices.length || (s.floorPrices = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.floorPrices.push(t.double()); + else + s.floorPrices.push(t.double()); + break; + case 39: + s.bidRate = t.double(); + break; + case 40: + s.pauseAdOutOfView = t.int32(); + break; + case 41: + s.moatTrackingEnabled = t.bool(); + break; + case 42: + s.cnxCreativeId = t.string(); + break; + case 44: + s.blockedDomainsRevisionNumber = t.int32(); + break; + case 45: + s.advertiserContextualTargeting && s.advertiserContextualTargeting.length || (s.advertiserContextualTargeting = []), s.advertiserContextualTargeting.push(c.ProtoContextualTargetingCaseModel.decode(t, t.uint32())); + break; + case 46: + s.publisherContextualTargeting && s.publisherContextualTargeting.length || (s.publisherContextualTargeting = []), s.publisherContextualTargeting.push(c.ProtoContextualTargetingCaseModel.decode(t, t.uint32())); + break; + case 48: + s.amazonDealId = t.string(); + break; + case 47: + s.playerSizeTargetings = c.ProtoPlayerSizeTargetings.decode(t, t.uint32()); + break; + case 101: + s.playerSize = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.trackers = [], e.renditions = [], e.floorPrices = [], e.advertiserContextualTargeting = [], e.publisherContextualTargeting = []), i.defaults && (e.publisherLineItemId = '', e.advertiserLineItemId = '', e.adTag = '', e.creativeType = i.enums === String ? 'ThirdParty' : 0, e.sound = !1, e.viewability = !1, e.impressionTimeSpent = 0, e.vendorId = '', e.duration = 0, e.mediaCreativeId = '', e.ignoreFilledRequests = !1, e.requestCap = 3, e.impressionCap = 0, e.successRate = 0, e.lineItemPriority = i.enums === String ? 'House' : 0, e.headerBidderBids = '', e.headerBidderTimeout = 0, e.mediaCreativeClickUrl = '', e.resetRequestsCapTime = 60, e.resetImpressionsCapTime = 60, e.resetCapType = i.enums === String ? 'TimeCapping' : 0, e.creativeHlsFileName = '', e.timeBetweenRequests = 0, e.skipMode = i.enums === String ? 'IfLongerThan31Sec' : 0, e.mediaIdTargeting = null, e.mediaKeywordsTargeting = null, e.mediaLanguageTargeting = null, e.adType = i.enums === String ? 'Video' : 0, e.overlayTime = 30, e.floorPrice = 0, e.adBreakSettings = null, e.bidRate = 0, e.pauseAdOutOfView = i.enums === String ? 'Default' : 0, e.moatTrackingEnabled = !1, e.cnxCreativeId = '', e.blockedDomainsRevisionNumber = 0, e.playerSizeTargetings = null, e.amazonDealId = '', e.playerSize = ''), null != t.publisherLineItemId && t.hasOwnProperty('publisherLineItemId') && (e.publisherLineItemId = t.publisherLineItemId), null != t.advertiserLineItemId && t.hasOwnProperty('advertiserLineItemId') && (e.advertiserLineItemId = t.advertiserLineItemId), null != t.adTag && t.hasOwnProperty('adTag') && (e.adTag = t.adTag), null != t.creativeType && t.hasOwnProperty('creativeType') && (e.creativeType = i.enums === String ? c.ProtoCreativeTypeEnum[t.creativeType] : t.creativeType), null != t.sound && t.hasOwnProperty('sound') && (e.sound = t.sound), null != t.viewability && t.hasOwnProperty('viewability') && (e.viewability = t.viewability), null != t.impressionTimeSpent && t.hasOwnProperty('impressionTimeSpent') && (e.impressionTimeSpent = t.impressionTimeSpent), null != t.vendorId && t.hasOwnProperty('vendorId') && (e.vendorId = t.vendorId), t.trackers && t.trackers.length) { + e.trackers = []; + for (var s = 0; s < t.trackers.length; ++s) + e.trackers[s] = c.CreativeTrackerViewModel.toObject(t.trackers[s], i); + } + if (null != t.duration && t.hasOwnProperty('duration') && (e.duration = t.duration), t.renditions && t.renditions.length) { + e.renditions = []; + for (s = 0; s < t.renditions.length; ++s) + e.renditions[s] = c.ProtoRendition.toObject(t.renditions[s], i); + } + if (null != t.mediaCreativeId && t.hasOwnProperty('mediaCreativeId') && (e.mediaCreativeId = t.mediaCreativeId), null != t.ignoreFilledRequests && t.hasOwnProperty('ignoreFilledRequests') && (e.ignoreFilledRequests = t.ignoreFilledRequests), null != t.requestCap && t.hasOwnProperty('requestCap') && (e.requestCap = t.requestCap), null != t.impressionCap && t.hasOwnProperty('impressionCap') && (e.impressionCap = t.impressionCap), null != t.successRate && t.hasOwnProperty('successRate') && (e.successRate = i.json && !isFinite(t.successRate) ? String(t.successRate) : t.successRate), null != t.lineItemPriority && t.hasOwnProperty('lineItemPriority') && (e.lineItemPriority = i.enums === String ? c.ProtoLineItemPriority[t.lineItemPriority] : t.lineItemPriority), null != t.headerBidderBids && t.hasOwnProperty('headerBidderBids') && (e.headerBidderBids = t.headerBidderBids), null != t.headerBidderTimeout && t.hasOwnProperty('headerBidderTimeout') && (e.headerBidderTimeout = t.headerBidderTimeout), null != t.mediaCreativeClickUrl && t.hasOwnProperty('mediaCreativeClickUrl') && (e.mediaCreativeClickUrl = t.mediaCreativeClickUrl), null != t.resetRequestsCapTime && t.hasOwnProperty('resetRequestsCapTime') && (e.resetRequestsCapTime = t.resetRequestsCapTime), null != t.resetImpressionsCapTime && t.hasOwnProperty('resetImpressionsCapTime') && (e.resetImpressionsCapTime = t.resetImpressionsCapTime), null != t.resetCapType && t.hasOwnProperty('resetCapType') && (e.resetCapType = i.enums === String ? c.ProtoResetCapTypeEnum[t.resetCapType] : t.resetCapType), null != t.creativeHlsFileName && t.hasOwnProperty('creativeHlsFileName') && (e.creativeHlsFileName = t.creativeHlsFileName), null != t.timeBetweenRequests && t.hasOwnProperty('timeBetweenRequests') && (e.timeBetweenRequests = t.timeBetweenRequests), null != t.skipMode && t.hasOwnProperty('skipMode') && (e.skipMode = i.enums === String ? c.ProtoAdSkipMode[t.skipMode] : t.skipMode), null != t.mediaIdTargeting && t.hasOwnProperty('mediaIdTargeting') && (e.mediaIdTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaIdTargeting, i)), null != t.mediaKeywordsTargeting && t.hasOwnProperty('mediaKeywordsTargeting') && (e.mediaKeywordsTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaKeywordsTargeting, i)), null != t.mediaLanguageTargeting && t.hasOwnProperty('mediaLanguageTargeting') && (e.mediaLanguageTargeting = c.ProtoTargetingChoiceModel.toObject(t.mediaLanguageTargeting, i)), null != t.adType && t.hasOwnProperty('adType') && (e.adType = i.enums === String ? c.ProtoAdType[t.adType] : t.adType), null != t.overlayTime && t.hasOwnProperty('overlayTime') && (e.overlayTime = t.overlayTime), null != t.floorPrice && t.hasOwnProperty('floorPrice') && (e.floorPrice = i.json && !isFinite(t.floorPrice) ? String(t.floorPrice) : t.floorPrice), null != t.adBreakSettings && t.hasOwnProperty('adBreakSettings') && (e.adBreakSettings = c.ProtoLineItemAdBreakSettings.toObject(t.adBreakSettings, i)), t.floorPrices && t.floorPrices.length) { + e.floorPrices = []; + for (s = 0; s < t.floorPrices.length; ++s) + e.floorPrices[s] = i.json && !isFinite(t.floorPrices[s]) ? String(t.floorPrices[s]) : t.floorPrices[s]; + } + if (null != t.bidRate && t.hasOwnProperty('bidRate') && (e.bidRate = i.json && !isFinite(t.bidRate) ? String(t.bidRate) : t.bidRate), null != t.pauseAdOutOfView && t.hasOwnProperty('pauseAdOutOfView') && (e.pauseAdOutOfView = i.enums === String ? c.ProtoLineItemPauseAdOutOfViewEnum[t.pauseAdOutOfView] : t.pauseAdOutOfView), null != t.moatTrackingEnabled && t.hasOwnProperty('moatTrackingEnabled') && (e.moatTrackingEnabled = t.moatTrackingEnabled), null != t.cnxCreativeId && t.hasOwnProperty('cnxCreativeId') && (e.cnxCreativeId = t.cnxCreativeId), null != t.blockedDomainsRevisionNumber && t.hasOwnProperty('blockedDomainsRevisionNumber') && (e.blockedDomainsRevisionNumber = t.blockedDomainsRevisionNumber), t.advertiserContextualTargeting && t.advertiserContextualTargeting.length) { + e.advertiserContextualTargeting = []; + for (s = 0; s < t.advertiserContextualTargeting.length; ++s) + e.advertiserContextualTargeting[s] = c.ProtoContextualTargetingCaseModel.toObject(t.advertiserContextualTargeting[s], i); + } + if (t.publisherContextualTargeting && t.publisherContextualTargeting.length) { + e.publisherContextualTargeting = []; + for (s = 0; s < t.publisherContextualTargeting.length; ++s) + e.publisherContextualTargeting[s] = c.ProtoContextualTargetingCaseModel.toObject(t.publisherContextualTargeting[s], i); + } + return null != t.playerSizeTargetings && t.hasOwnProperty('playerSizeTargetings') && (e.playerSizeTargetings = c.ProtoPlayerSizeTargetings.toObject(t.playerSizeTargetings, i)), null != t.amazonDealId && t.hasOwnProperty('amazonDealId') && (e.amazonDealId = t.amazonDealId), null != t.playerSize && t.hasOwnProperty('playerSize') && (e.playerSize = t.playerSize), e; + }, t; + }(), c.ProtoTargetingChoiceModel = function () { + function t(t) { + if (this.items = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.choiceCriteria = 0, t.prototype.items = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoTargetingChoiceModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.choiceCriteria = t.int32(); + break; + case 2: + s.items && s.items.length || (s.items = []), s.items.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.items = []), i.defaults && (e.choiceCriteria = i.enums === String ? 'Only' : 0), null != t.choiceCriteria && t.hasOwnProperty('choiceCriteria') && (e.choiceCriteria = i.enums === String ? c.ProtoChoiceCriteriaEnum[t.choiceCriteria] : t.choiceCriteria), t.items && t.items.length) { + e.items = []; + for (var s = 0; s < t.items.length; ++s) + e.items[s] = t.items[s]; + } + return e; + }, t; + }(), c.ProtoContextualTargetingCaseModel = function () { + function t(t) { + if (this.filters = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.filters = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoContextualTargetingCaseModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.filters && s.filters.length || (s.filters = []), s.filters.push(c.ProtoContextualTargetingFilterModel.decode(t, t.uint32())); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.filters = []), t.filters && t.filters.length) { + e.filters = []; + for (var s = 0; s < t.filters.length; ++s) + e.filters[s] = c.ProtoContextualTargetingFilterModel.toObject(t.filters[s], i); + } + return e; + }, t; + }(), c.ProtoContextualTargetingFilterModel = function () { + function t(t) { + if (this.items = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.type = 0, t.prototype.items = o.emptyArray, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoContextualTargetingFilterModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.type = t.int32(); + break; + case 2: + s.items && s.items.length || (s.items = []), s.items.push(t.string()); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.items = []), i.defaults && (e.type = i.enums === String ? 'IncludeAny' : 0), null != t.type && t.hasOwnProperty('type') && (e.type = i.enums === String ? c.ProtoLineItemContextualTargetingEnum[t.type] : t.type), t.items && t.items.length) { + e.items = []; + for (var s = 0; s < t.items.length; ++s) + e.items[s] = t.items[s]; + } + return e; + }, t; + }(), c.ProtoPlayerSizeTargetings = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.sizeChoiceCriteria = 0, t.prototype.minWidth = 0, t.prototype.maxWidth = 0, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoPlayerSizeTargetings(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.sizeChoiceCriteria = t.int32(); + break; + case 2: + s.minWidth = t.int32(); + break; + case 3: + s.maxWidth = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.sizeChoiceCriteria = i.enums === String ? 'GreaterThan' : 0, e.minWidth = 0, e.maxWidth = 0), null != t.sizeChoiceCriteria && t.hasOwnProperty('sizeChoiceCriteria') && (e.sizeChoiceCriteria = i.enums === String ? c.ProtoSizeChoiceCriteriaEnum[t.sizeChoiceCriteria] : t.sizeChoiceCriteria), null != t.minWidth && t.hasOwnProperty('minWidth') && (e.minWidth = t.minWidth), null != t.maxWidth && t.hasOwnProperty('maxWidth') && (e.maxWidth = t.maxWidth), e; + }, t; + }(), c.CreativeTrackerViewModel = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.type = 0, t.prototype.trigger = 0, t.prototype.url = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.CreativeTrackerViewModel(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.type = t.int32(); + break; + case 2: + s.trigger = t.int32(); + break; + case 3: + s.url = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.type = i.enums === String ? 'Image' : 0, e.trigger = i.enums === String ? 'Impression' : 0, e.url = ''), null != t.type && t.hasOwnProperty('type') && (e.type = i.enums === String ? c.ProtoTrackerType[t.type] : t.type), null != t.trigger && t.hasOwnProperty('trigger') && (e.trigger = i.enums === String ? c.ProtoTrackerTriggerType[t.trigger] : t.trigger), null != t.url && t.hasOwnProperty('url') && (e.url = t.url), e; + }, t; + }(), c.ProtoRendition = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.height = 0, t.prototype.codec = '', t.prototype.file = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoRendition(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.height = t.int32(); + break; + case 2: + s.codec = t.string(); + break; + case 3: + s.file = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.height = 0, e.codec = '', e.file = ''), null != t.height && t.hasOwnProperty('height') && (e.height = t.height), null != t.codec && t.hasOwnProperty('codec') && (e.codec = t.codec), null != t.file && t.hasOwnProperty('file') && (e.file = t.file), e; + }, t; + }(), c.Browser = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.browserVersion = '', t.prototype.browserType = '', t.prototype.osCode = '', t.prototype.device = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.browserVersion && Object.hasOwnProperty.call(t, 'browserVersion') && i.uint32(10).string(t.browserVersion), null != t.browserType && Object.hasOwnProperty.call(t, 'browserType') && i.uint32(18).string(t.browserType), null != t.osCode && Object.hasOwnProperty.call(t, 'osCode') && i.uint32(26).string(t.osCode), null != t.device && Object.hasOwnProperty.call(t, 'device') && i.uint32(32).int32(t.device), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.Browser(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.browserVersion = t.string(); + break; + case 2: + s.browserType = t.string(); + break; + case 3: + s.osCode = t.string(); + break; + case 4: + s.device = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.Browser) + return t; + var i = new c.Browser(); + switch (null != t.browserVersion && (i.browserVersion = String(t.browserVersion)), null != t.browserType && (i.browserType = String(t.browserType)), null != t.osCode && (i.osCode = String(t.osCode)), t.device) { + case 'Desktop': + case 0: + i.device = 0; + break; + case 'Smartphone': + case 1: + i.device = 1; + break; + case 'Tablet': + case 2: + i.device = 2; + break; + case 'GameConsole': + case 3: + i.device = 3; + break; + case 'SmartTV': + case 4: + i.device = 4; + break; + case 'WearableComputer': + case 5: + i.device = 5; + break; + case 'PDA': + case 6: + i.device = 6; + break; + case 'Unrecognized': + case 7: + i.device = 7; + } + return i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.browserVersion = '', e.browserType = '', e.osCode = '', e.device = i.enums === String ? 'Desktop' : 0), null != t.browserVersion && t.hasOwnProperty('browserVersion') && (e.browserVersion = t.browserVersion), null != t.browserType && t.hasOwnProperty('browserType') && (e.browserType = t.browserType), null != t.osCode && t.hasOwnProperty('osCode') && (e.osCode = t.osCode), null != t.device && t.hasOwnProperty('device') && (e.device = i.enums === String ? c.ProtoDeviceType[t.device] : t.device), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.GeoLocation = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.countryGeoId = 0, t.prototype.cityId = 0, t.prototype.subdivisionId = 0, t.prototype.dmaId = 0, t.prototype.ip = '', t.prototype.lat = 0, t.prototype.lon = 0, t.encode = function (t, i) { + return i || (i = a.create()), null != t.countryGeoId && Object.hasOwnProperty.call(t, 'countryGeoId') && i.uint32(8).int32(t.countryGeoId), null != t.cityId && Object.hasOwnProperty.call(t, 'cityId') && i.uint32(16).int32(t.cityId), null != t.subdivisionId && Object.hasOwnProperty.call(t, 'subdivisionId') && i.uint32(24).int32(t.subdivisionId), null != t.dmaId && Object.hasOwnProperty.call(t, 'dmaId') && i.uint32(32).int32(t.dmaId), null != t.ip && Object.hasOwnProperty.call(t, 'ip') && i.uint32(42).string(t.ip), null != t.lat && Object.hasOwnProperty.call(t, 'lat') && i.uint32(49).double(t.lat), null != t.lon && Object.hasOwnProperty.call(t, 'lon') && i.uint32(57).double(t.lon), i; + }, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.GeoLocation(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.countryGeoId = t.int32(); + break; + case 2: + s.cityId = t.int32(); + break; + case 3: + s.subdivisionId = t.int32(); + break; + case 4: + s.dmaId = t.int32(); + break; + case 5: + s.ip = t.string(); + break; + case 6: + s.lat = t.double(); + break; + case 7: + s.lon = t.double(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.fromObject = function (t) { + if (t instanceof c.GeoLocation) + return t; + var i = new c.GeoLocation(); + return null != t.countryGeoId && (i.countryGeoId = 0 | t.countryGeoId), null != t.cityId && (i.cityId = 0 | t.cityId), null != t.subdivisionId && (i.subdivisionId = 0 | t.subdivisionId), null != t.dmaId && (i.dmaId = 0 | t.dmaId), null != t.ip && (i.ip = String(t.ip)), null != t.lat && (i.lat = Number(t.lat)), null != t.lon && (i.lon = Number(t.lon)), i; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.countryGeoId = 0, e.cityId = 0, e.subdivisionId = 0, e.dmaId = 0, e.ip = '', e.lat = 0, e.lon = 0), null != t.countryGeoId && t.hasOwnProperty('countryGeoId') && (e.countryGeoId = t.countryGeoId), null != t.cityId && t.hasOwnProperty('cityId') && (e.cityId = t.cityId), null != t.subdivisionId && t.hasOwnProperty('subdivisionId') && (e.subdivisionId = t.subdivisionId), null != t.dmaId && t.hasOwnProperty('dmaId') && (e.dmaId = t.dmaId), null != t.ip && t.hasOwnProperty('ip') && (e.ip = t.ip), null != t.lat && t.hasOwnProperty('lat') && (e.lat = i.json && !isFinite(t.lat) ? String(t.lat) : t.lat), null != t.lon && t.hasOwnProperty('lon') && (e.lon = i.json && !isFinite(t.lon) ? String(t.lon) : t.lon), e; + }, t.prototype.toJSON = function () { + return this.constructor.toObject(this, r.util.toJSONOptions); + }, t; + }(), c.ProtoSupplyChain = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.businessDomain = '', t.prototype.supplyChainId = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoSupplyChain(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.businessDomain = t.string(); + break; + case 3: + s.supplyChainId = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.businessDomain = '', e.supplyChainId = ''), null != t.businessDomain && t.hasOwnProperty('businessDomain') && (e.businessDomain = t.businessDomain), null != t.supplyChainId && t.hasOwnProperty('supplyChainId') && (e.supplyChainId = t.supplyChainId), e; + }, t; + }(), c.ProtoUserInformation = function () { + function t(t) { + if (t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.userId = '', t.prototype.lookupId = '', t.prototype.lookupResponseCode = 0, t.prototype.callFraudSensor = !1, t.prototype.publisherAdsTxt = '', t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoUserInformation(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + s.userId = t.string(); + break; + case 3: + s.lookupId = t.string(); + break; + case 4: + s.lookupResponseCode = t.int32(); + break; + case 5: + s.callFraudSensor = t.bool(); + break; + case 6: + s.publisherAdsTxt = t.string(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + return i.defaults && (e.userId = '', e.lookupId = '', e.lookupResponseCode = 0, e.callFraudSensor = !1, e.publisherAdsTxt = ''), null != t.userId && t.hasOwnProperty('userId') && (e.userId = t.userId), null != t.lookupId && t.hasOwnProperty('lookupId') && (e.lookupId = t.lookupId), null != t.lookupResponseCode && t.hasOwnProperty('lookupResponseCode') && (e.lookupResponseCode = t.lookupResponseCode), null != t.callFraudSensor && t.hasOwnProperty('callFraudSensor') && (e.callFraudSensor = t.callFraudSensor), null != t.publisherAdsTxt && t.hasOwnProperty('publisherAdsTxt') && (e.publisherAdsTxt = t.publisherAdsTxt), e; + }, t; + }(), c.ProtoAdBreak = function () { + function t(t) { + if (this.types = [], t) + for (var i = Object.keys(t), e = 0; e < i.length; ++e) + null != t[i[e]] && (this[i[e]] = t[i[e]]); + } + return t.prototype.types = o.emptyArray, t.prototype.maxAdPodDuration = 0, t.prototype.maxAdSlotDuration = 180, t.prototype.numberOfAdSlots = 1, t.decode = function (t, i) { + t instanceof h || (t = h.create(t)); + for (var e = void 0 === i ? t.len : t.pos + i, s = new c.ProtoAdBreak(); t.pos < e;) { + var n = t.uint32(); + switch (n >>> 3) { + case 1: + if (s.types && s.types.length || (s.types = []), 2 == (7 & n)) + for (var r = t.uint32() + t.pos; t.pos < r;) + s.types.push(t.int32()); + else + s.types.push(t.int32()); + break; + case 2: + s.maxAdPodDuration = t.int32(); + break; + case 3: + s.maxAdSlotDuration = t.int32(); + break; + case 4: + s.numberOfAdSlots = t.int32(); + break; + default: + t.skipType(7 & n); + } + } + return s; + }, t.toObject = function (t, i) { + i || (i = {}); + var e = {}; + if ((i.arrays || i.defaults) && (e.types = []), i.defaults && (e.maxAdPodDuration = 0, e.maxAdSlotDuration = 180, e.numberOfAdSlots = 1), t.types && t.types.length) { + e.types = []; + for (var s = 0; s < t.types.length; ++s) + e.types[s] = i.enums === String ? c.ProtoAdBreakTypeEnum[t.types[s]] : t.types[s]; + } + return null != t.maxAdPodDuration && t.hasOwnProperty('maxAdPodDuration') && (e.maxAdPodDuration = t.maxAdPodDuration), null != t.maxAdSlotDuration && t.hasOwnProperty('maxAdSlotDuration') && (e.maxAdSlotDuration = t.maxAdSlotDuration), null != t.numberOfAdSlots && t.hasOwnProperty('numberOfAdSlots') && (e.numberOfAdSlots = t.numberOfAdSlots), e; + }, t; + }(), c.ProtoOutstreamInitialRenderingEnum = (s = {}, (n = Object.create(s))[s[0] = 'ExpandWithAd'] = 0, n[s[1] = 'FullyRendered'] = 1, n), c.ProtoOutstreamEndAdBreakPolicyEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Hide'] = 0, i[t[1] = 'HouseScreen'] = 1, i[t[2] = 'Loop'] = 2, i; + }(), c.ProtoGalleryStyleMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'None'] = 0, i[t[1] = 'Detailed'] = 1, i[t[2] = 'Visual'] = 2, i; + }(), c.ProtoLogoPositionMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'None'] = 0, i[t[1] = 'ControlBar'] = 1, i[t[2] = 'BottomRight'] = 2, i[t[3] = 'BottomLeft'] = 3, i[t[4] = 'TopRight'] = 4, i[t[5] = 'TopLeft'] = 5, i[t[6] = 'Center'] = 6, i; + }(), c.ProtoGalleryOrientationEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Landscape'] = 0, i[t[1] = 'Portrait'] = 1, i; + }(), c.ProtoElementsTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'InStream'] = 0, i[t[1] = 'OutStream'] = 1, i[t[2] = 'InStreamInApp'] = 2, i[t[3] = 'Live'] = 3, i; + }(), c.ProtoPlayerUpNextMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Loop'] = 0, i[t[1] = 'Next'] = 1, i[t[2] = 'Stop'] = 2, i; + }(), c.ProtoCreativeTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'ThirdParty'] = 0, i[t[1] = 'MediaFile'] = 1, i[t[2] = 'Rtb'] = 2, i[t[3] = 'External'] = 3, i[t[4] = 'HeaderBidder'] = 4, i[t[7] = 'Tam'] = 7, i[t[8] = 'TamDeal'] = 8, i; + }(), c.ProtoResetCapTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'TimeCapping'] = 0, i[t[1] = 'ContentCapping'] = 1, i[t[2] = 'OpportunityCapping'] = 2, i; + }(), c.ProtoAdSlotsEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'PreRoll'] = 0, i[t[1] = 'MidRoll'] = 1, i[t[2] = 'PostRoll'] = 2, i; + }(), c.ProtoLineItemPriority = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'House'] = 0, i[t[1] = 'Default'] = 1, i[t[2] = 'Preferred'] = 2, i[t[3] = 'Top'] = 3, i; + }(), c.ProtoAdSkipMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IfLongerThan31Sec'] = 0, i[t[1] = 'Always'] = 1, i[t[2] = 'Never'] = 2, i[t[3] = 'NotAplicable'] = 3, i; + }(), c.ProtoAdType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Video'] = 0, i[t[1] = 'Overlay'] = 1, i; + }(), c.ProtoChoiceCriteriaEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Only'] = 0, i[t[1] = 'Except'] = 1, i; + }(), c.ProtoLineItemAdBreakTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[1] = 'All'] = 1, i[t[2] = 'SingleAd'] = 2, i[t[3] = 'AdPod'] = 3, i; + }(), c.ProtoLineItemTargetingTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Only'] = 0, i[t[1] = 'Except'] = 1, i; + }(), c.ProtoLineItemAdSlotTargetingTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[1] = 'SpecificSlots'] = 1, i[t[2] = 'Interval'] = 2, i; + }(), c.ProtoLineItemPauseAdOutOfViewEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Default'] = 0, i[t[1] = 'Strict'] = 1, i; + }(), c.ProtoLineItemContextualTargetingEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IncludeAny'] = 0, i[t[1] = 'IncludeAll'] = 1, i[t[2] = 'ExcludeAny'] = 2, i[t[3] = 'ExcludeAll'] = 3, i; + }(), c.ProtoSizeChoiceCriteriaEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'GreaterThan'] = 0, i[t[1] = 'SmallerThan'] = 1, i[t[2] = 'Between'] = 2, i; + }(), c.ProtoTrackerType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Image'] = 0, i[t[1] = 'Javascript'] = 1, i; + }(), c.ProtoTrackerTriggerType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Impression'] = 0, i[t[1] = 'Complete25Pc'] = 1, i[t[2] = 'Complete50Pc'] = 2, i[t[3] = 'Complete75Pc'] = 3, i[t[4] = 'ViewCompletion'] = 4, i[t[5] = 'VideoClick'] = 5, i[t[6] = 'Pause'] = 6, i[t[7] = 'Resume'] = 7, i[t[8] = 'Mute'] = 8, i[t[9] = 'Unmute'] = 9, i; + }(), c.ProtoPlayerPlaybackModeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Autoplay'] = 0, i[t[1] = 'ScrollToPlay'] = 1, i[t[2] = 'ClickToPlay'] = 2, i; + }(), c.ProtoPlayerCloseButtonMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Off'] = 0, i[t[1] = 'OnHover'] = 1, i[t[2] = 'OnHoverAfterFirstAd'] = 2, i[t[3] = 'AlwaysOn'] = 3, i; + }(), c.ProtoPlayerFloatingMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Off'] = 0, i[t[1] = 'OnPageLoad'] = 1, i[t[2] = 'AfterInView'] = 2, i[t[3] = 'Always'] = 3, i; + }(), c.ProtoPlayerSoundMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Mute'] = 0, i[t[1] = 'On'] = 1, i[t[2] = 'Hover'] = 2, i; + }(), c.ProtoPlayerInsertMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'WithinContainer'] = 0, i[t[1] = 'BeforeContainer'] = 1, i[t[2] = 'AfterContainer'] = 2, i[t[3] = 'ReplaceContainer'] = 3, i[t[4] = 'HideContainer'] = 4, i; + }(), c.ProtoAdViewabilityPolicy = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Default'] = 0, i[t[1] = 'Strict'] = 1, i; + }(), c.ProtoSharingDestination = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Facebook'] = 0, i[t[1] = 'Twitter'] = 1, i[t[2] = 'LinkedIn'] = 2, i; + }(), c.ProtoFloatingFixedPositionMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Page'] = 0, i[t[1] = 'Element'] = 1, i; + }(), c.ProtoPositionMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'BottomRight'] = 0, i[t[1] = 'BottomLeft'] = 1, i[t[2] = 'TopRight'] = 2, i[t[3] = 'TopLeft'] = 3, i; + }(), c.ProtoAdPlaybackMode = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Autoplay'] = 0, i[t[1] = 'ScrollToPlay'] = 1, i; + }(), c.ProtoFloatingAppendLocationEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Above'] = 0, i[t[1] = 'Below'] = 1, i[t[2] = 'Within'] = 2, i; + }(), c.ProtoPlayerAdSkippability = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'IfLongerThan'] = 0, i[t[1] = 'Always'] = 1, i[t[2] = 'NoRestrictions'] = 2, i; + }(), c.ProtoVideoQuality = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Auto'] = 0, i[t[1] = 'High1080p'] = 1, i[t[2] = 'High720p'] = 2, i[t[3] = 'Medium360p'] = 3, i; + }(), c.ProtoImplementationType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Web'] = 0, i[t[1] = 'Amp'] = 1, i; + }(), c.ProtoAdBreakTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'None'] = 0, i[t[1] = 'PreRoll'] = 1, i[t[2] = 'MidRoll'] = 2, i[t[3] = 'PostRoll'] = 3, i; + }(), c.ProtoAdSlotAdTypeEnum = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'SingleAd'] = 0, i[t[1] = 'AdPod'] = 1, i; + }(), c.ProtoDeviceType = function () { + var t = {}, i = Object.create(t); + return i[t[0] = 'Desktop'] = 0, i[t[1] = 'Smartphone'] = 1, i[t[2] = 'Tablet'] = 2, i[t[3] = 'GameConsole'] = 3, i[t[4] = 'SmartTV'] = 4, i[t[5] = 'WearableComputer'] = 5, i[t[6] = 'PDA'] = 6, i[t[7] = 'Unrecognized'] = 7, i; + }(), t.exports = c; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'c', function () { + return a; + }), e.d(i, 'd', function () { + return o; + }), e.d(i, 'e', function () { + return c; + }), e.d(i, 'g', function () { + return u; + }), e.d(i, 'f', function () { + return l; + }), e.d(i, 'l', function () { + return d; + }), e.d(i, 'k', function () { + return f; + }), e.d(i, 'b', function () { + return p; + }), e.d(i, 'a', function () { + return b; + }), e.d(i, 'i', function () { + return v; + }), e.d(i, 'h', function () { + return m; + }), e.d(i, 'j', function () { + return g; + }); + var s = e(19), n = e(1), r = e(31), h = e(6); + function a() { + let t = Date.now(); + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (i) { + const e = (t + 16 * Math.random()) % 16 | 0; + return t = Math.floor(t / 16), ('x' === i ? e : 3 & e | 8).toString(16); + }); + } + function o() { + return a().replace(/-/g, ''); + } + function c(t, i) { + let e = ''; + if (!t.err) + try { + e = t.topFrame.location.href; + } catch (t) { + } + if (!e || 0 === e.length) + try { + e = i.top.location.href; + } catch (t) { + } + if (!e || 0 === e.length) + try { + e = t.topFrame.document.referrer; + } catch (t) { + } + return e; + } + function u(t) { + try { + const i = t.match(/^(https?:)\/\/(([^:\/?#]*)(?::([0-9]+))?)([\/]{0,1}[^?#]*)(\?[^#]*|)(#.*|)$/); + return { + href: t, + protocol: i[1], + host: i[2], + hostname: i[3], + port: i[4], + pathname: i[5], + search: i[6], + hash: i[7] + }; + } catch (t) { + return null; + } + } + function l(t) { + let i = t, e = null, s = !1; + try { + for (; i.parent.document !== i.document;) { + if (!i.parent.document) { + s = !0; + break; + } + e = i, i = i.parent; + } + } catch (t) { + s = !0; + } + return { + topFrame: i, + topChildFrame: e, + err: s + }; + } + function d(t = (() => { + return []; + })(), i, e = (() => { + return {}; + })()) { + t.forEach(t => { + Object(n.g)(t) && (new i.Image().src = `${ t }${ Object(s.c)(t) }${ function (t, i) { + const e = []; + return Object.keys(t).forEach(s => { + const a = i ? `${ i }[${ s }]` : s, o = t[s]; + if (Object(n.f)(o)) + e.push(`${ encodeURIComponent(a) }=${ Object(r.c)(o) }`); + else if (Array.isArray(o)) + e.push(`${ encodeURIComponent(a) }=${ Object(h.l)(o) }`); + else if (null != o) { + const t = encodeURIComponent(o), i = encodeURIComponent(a); + t && i && e.push(`${ i }=${ t }`); + } + }), e.join('&'); + }(e) }`); + }); + } + function f(t) { + const i = Math.floor(100 * Math.random()); + let e = 0, s = 0; + for (let n = 0; n < t.length; n++) + if (i < (s += t[n])) { + e = n; + break; + } + return e; + } + function p() { + let t = !1; + try { + const i = document.createElement('audio'); + i.volume = 1, i.muted = !1; + const e = i.play(); + void 0 !== e && e.catch(() => { + }), t = !i.paused, i.pause(); + } catch (t) { + } + return t; + } + function b(t, i = (() => { + return 0; + })(), ...e) { + return setTimeout(() => { + t.apply(this, e); + }, i); + } + function v(t, i) { + return Object(n.f)(t) ? Object(r.b)(t, i) : Array.isArray(t) ? Object(h.j)(t, i) : t === i; + } + function m(t, i, e) { + let s = 0, n = t; + for (; s <= e;) { + if (s++, n.classList.contains(i)) + return !0; + if (!(n = n.parentElement)) + return !1; + } + return !1; + } + function g(t, i = (() => { + return 5; + })()) { + return new Promise((e, s) => { + t().then(e).catch(n => { + 1 !== i ? g(t, i - 1).then(e, s) : s(n); + }); + }); + } + }, + function (t, i, e) { + 'use strict'; + var s, n, r, h; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'd', function () { + return n; + }), e.d(i, 'c', function () { + return r; + }), e.d(i, 'b', function () { + return h; + }), function (t) { + t[t.Idle = 0] = 'Idle', t[t.Loading = 1] = 'Loading', t[t.Ready = 2] = 'Ready', t[t.Error = 3] = 'Error', t[t.Capped = 4] = 'Capped', t[t.InWin = 5] = 'InWin', t[t.Consumed = 6] = 'Consumed', t[t.InImpression = 7] = 'InImpression'; + }(s || (s = {})), function (t) { + t[t.Javascript = 0] = 'Javascript', t[t.Video = 1] = 'Video'; + }(n || (n = {})), function (t) { + t.Timeout = 'timeout', t.TimeoutLoaded = 'timeout_loaded', t.ImaError = 'imaError', t.ImaScriptFailure = 'imaScriptFailure', t.ImaObjectNotFound = 'imaObjectNotFound', t.ImaManagerInit = 'imaManagerInit', t.ImaInitSdkError = 'initImasdkError', t.VastVideoTagEventError = 'vastVideoTagEventError', t.VastUnsupportedMedia = 'vastUnsupportedMedia', t.VastPlayPromiseReject = 'playPromiseReject', t.AdStopped = 'adStopped', t.MuteEnforce = 'muteEnforce', t.VpaidOnLoad = 'vpaidOnLoad', t.VpaidInvalid = 'vpaidInvalid', t.VpaidGetVpaidAdError = 'vpaidGetVpaidAdError', t.CnxMediaNoRenditions = 'noRenditions', t.CnxMediaSrcNotSupported = 'srcNotSupported', t.InvalidVpaidEvent = 'invalidVpaidEvent', t.AdxOverlayNoFill = 'adxOverlayNoFill', t.AdxOverlayGptScriptLoad = 'adxOverlayGptScriptLoad', t.DisplayIntegratorIframeLoad = 'displayIntegratorIframeLoad', t.EnforcementMalware = 'malwareDetected', t.EnforcementVolume = 'volumeDetected', t.Cancelled = 'adManagerRemoved', t.DomainBlocked = 'domainBlocked', t.AdaptorStartAdError = 'adaptorStartAdError', t.AdaptorInitAdError = 'adaptorInitAdError', t.WrapperStartAdError = 'wrapperStartAdError', t.WrapperInitAdError = 'wrapperInitAdError'; + }(r || (r = {})), function (t) { + t.Html = 'text/html', t.Javascript = 'application/javascript'; + }(h || (h = {})); + }, + function (t, i, e) { + 'use strict'; + var s; + !function (t) { + t[t.HoldStart = 0] = 'HoldStart', t[t.HoldEnd = 1] = 'HoldEnd', t[t.TapLeft = 2] = 'TapLeft', t[t.TapRight = 3] = 'TapRight', t[t.SwipeEnd = 4] = 'SwipeEnd', t[t.SwipeMove = 5] = 'SwipeMove', t[t.Scroll = 6] = 'Scroll', t[t.Click = 7] = 'Click'; + }(s || (s = {})), i.a = s; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'b', function () { + return s; + }), e.d(i, 'd', function () { + return n; + }), e.d(i, 'e', function () { + return r; + }), e.d(i, 'f', function () { + return h; + }), e.d(i, 'g', function () { + return a; + }), e.d(i, 'a', function () { + return o; + }), e.d(i, 'c', function () { + return c; + }); + const s = /(\d\d):(\d\d):(\d\d)(\.(\d\d\d))?/, n = 3600000, r = 60000, h = 1000, a = 60, o = 86400000, c = 60; + }, + function (t, i, e) { + 'use strict'; + const s = e(3).b, n = Object.assign(Object.assign({}, s), { + AdBreakStart: 'adBreakStart', + AdComplete: 'adComplete', + AdBreakComplete: 'adBreakComplete', + Pause: 'pause', + AdPause: 'adPause', + Play: 'play', + AdPlay: 'adPlay', + ContentComplete: 'contentComplete', + SessionStart: 'sessionStart', + SessionEnd: 'sessionEnd', + PlayerResized: 'playerStateResize', + OnEnterFullscreen: 'onEnterFullscreen', + OnExitFullscreen: 'onExitFullscreen', + PlayerCollapsed: 'playerCollapsed', + PlayerExpanded: 'playerExpanded', + PlayError: 'playError', + RenderError: 'renderError', + AdStateChange: 'adStateChange', + VolumeChange: 'volumeChange', + Destroy: 'destroy' + }); + i.a = n; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'd', function () { + return s; + }), e.d(i, 'c', function () { + return n; + }), e.d(i, 'e', function () { + return r; + }), e.d(i, 'b', function () { + return h; + }), e.d(i, 'a', function () { + return a; + }); + const s = { + Play: 'play', + Pause: 'pause', + QualityChanged: 'qualityChanged', + PlayError: 'playError', + VolumeChanged: 'volumeChanged' + }, n = { + FullscreenChanged: 'fullscreenChanged', + PlayerFloatChanged: 'playerFloatChanged' + }, r = { OmidViewabilityThreshold: 'OmidViewabilityThreshold' }, h = Object.assign(Object.assign(Object.assign(Object.assign({ + Ready: 'ready', + Removed: 'removed', + SetupError: 'setupError', + IsViewable: 'isViewable', + SizeChanged: 'sizeChanged', + BrandingClicked: 'brandingClicked', + ImpressionPrice: 'impressionPrice', + ImpressionRevenue: 'impressionRevenue' + }, s), n), r), { + AdClick: 'adClick', + AdPlay: 'adPlay', + AdPause: 'adPause', + AdImpression: 'adImpression', + AdCompleted25: 'adCompleted25', + AdCompleted50: 'adCompleted50', + AdCompleted75: 'adCompleted75', + AdCompleted100: 'adCompleted100', + AdSkipped: 'adSkipped', + AdError: 'adError', + AdStopped: 'adStopped', + AdCompanion: 'adCompanion' + }); + var a; + !function (t) { + t.SetupError = 'SetupError', t.NoPlayer = 'NoPlayer', t.RenderError = 'RenderError'; + }(a || (a = {})); + }, + function (t, i, e) { + 'use strict'; + var s = e(21); + class n { + constructor(t) { + this.base = t, this.api = { + pls: t.core + 'core/pls', + story: t.core + 'core/story', + rtb: t.core + 'rtb/g', + vpaid: t.core + 'vpaid', + syncUrls: t.core + 'core/us', + fallbackstory: t.core + 'core/fallbackstory', + cookie: t.core + 'core/ck', + tam: t.core + 'core/atam' + }, this.tracking = { + session_rendered: t.tracking + 'sr', + session_view: t.tracking + 'sv', + session_time: t.tracking + 'st', + session_client_error: t.tracking + 'e', + media_quartile: t.tracking + 'mq', + media_click: t.tracking + 'mc', + ad_impression: t.tracking + 'ai', + bids: t.tracking + 'abt', + ad_impression_viewable: t.tracking + 'av', + ad_quartile: t.tracking + 'aq', + ad_click: t.tracking + 'ac', + contentLoad: t.tracking + 'clr', + noContent: t.tracking + 'nc', + eventService: t.tracking + 'et', + tracking: t.tracking + 'tr', + vastWin: t.tracking + 'vw', + rtb: t.tracking + 'g', + logging: t.tracking + 'e', + galleryCardClick: t.tracking + 'cc', + playerStart: t.tracking + 'ps', + adOpportunity: t.tracking + 'ao', + sessionAdBlocker: t.tracking + 'sab', + heavy_ad_intervention: t.tracking + 'ha', + auctionInformation: t.tracking + 'aucinfo' + }, this.assets = { + css: { + elements: `${ this.V(t.assets) }player.css`, + playspace: `${ this.V(t.assets) }connatix.playspace.css` + }, + plugins: { + adobeAnalytics: `${ t.assets }p/plugins/adobe.plugin.js`, + moatAnalytics: `${ t.assets }p/plugins/moat.plugin.js` + } + }; + } + V(t) { + return 'development' === s.a.env ? '//cd.connatix.com/' : `${ t }p/${ s.a.version }/`; + } + } + var r = e(19), h = e(8); + e.d(i, 'a', function () { + return a; + }); + class a { + static U() { + const t = Object(r.b)('cnxEnv', Object(h.f)(window).topFrame.location.href); + return t && (s.a.domainPrefix = `-${ t }`), Object.keys(this.$).forEach(t => { + this.$[t] = this.$[t].replace('{{env}}', s.a.domainPrefix); + }), new n(a.$); + } + static get endPoints() { + return null === a.W && (a.W = a.U()), a.W; + } + } + a.$ = { + a: '//a{{env}}.connatix.com/', + video: '//vid.connatix.com/', + image: '//img.connatix.com/', + core: 'https://capi{{env}}.connatix.com/', + tracking: '//capi{{env}}.connatix.com/tr/', + metadata: '//vid.connatix.com/', + assets: '//cds{{env}}.connatix.com/', + lineItems: '//lit.connatix.com/' + }, a.W = null; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'e', function () { + return n; + }), e.d(i, 'b', function () { + return r; + }), e.d(i, 'c', function () { + return h; + }), e.d(i, 'f', function () { + return a; + }), e.d(i, 'd', function () { + return o; + }), e.d(i, 'a', function () { + return c; + }); + var s = e(1); + function n(t, i, e, s, n) { + return e + (s - e) * function (t, i, e) { + return (e - t) / (i - t); + }(t, i, n); + } + function r(t, i) { + return i.reduce((i, e) => { + return Math.abs(e - t) <= Math.abs(i - t) ? e : i; + }); + } + function h(t, i) { + return i / 100 * t; + } + function a(t, i) { + const e = Math.pow(10, i); + return Math.round(t * e) / e; + } + function o(t) { + return !Object(s.e)(t.width) || !Object(s.e)(t.height); + } + function c(t, i) { + for (let e = i; e > 1; e--) + t % e == 0 && i % e == 0 && (t /= e, i /= e); + return { + widthRatio: t, + heightRatio: i + }; + } + }, + function (t, i, e) { + 'use strict'; + var s; + e.d(i, 'c', function () { + return s; + }), e.d(i, 'b', function () { + return n; + }), e.d(i, 'a', function () { + return r; + }), function (t) { + t.SessionRendered = 'rendered', t.SessionView = 'enter_view'; + }(s || (s = {})); + const n = { + UserInteraction: 'userInteraction', + GeneralUserInteraction: 'generalUserInteraction', + CanStart: 'canStart', + Destroy: 'destroy' + }, r = { StateChanged: 'stateChanged' }; + }, + function (t, i, e) { + 'undefined' != typeof window && (t.exports = function (t) { + var i = {}; + function e(s) { + if (i[s]) + return i[s].exports; + var n = i[s] = { + i: s, + l: !1, + exports: {} + }; + return t[s].call(n.exports, n, n.exports, e), n.l = !0, n.exports; + } + return e.m = t, e.c = i, e.d = function (t, i, s) { + e.o(t, i) || Object.defineProperty(t, i, { + enumerable: !0, + get: s + }); + }, e.r = function (t) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(t, '_', { value: !0 }); + }, e.t = function (t, i) { + if (1 & i && (t = e(t)), 8 & i) + return t; + if (4 & i && 'object' == typeof t && t && t._) + return t; + var s = Object.create(null); + if (e.r(s), Object.defineProperty(s, 'default', { + enumerable: !0, + value: t + }), 2 & i && 'string' != typeof t) + for (var n in t) + e.d(s, n, function (i) { + return t[i]; + }.bind(null, n)); + return s; + }, e.n = function (t) { + var i = t && t._ ? function () { + return t.default; + } : function () { + return t; + }; + return e.d(i, 'a', i), i; + }, e.o = function (t, i) { + return Object.prototype.hasOwnProperty.call(t, i); + }, e.p = '/dist/', e(e.s = 13); + }([ + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return o; + }), e.d(i, 'b', function () { + return c; + }); + var s = e(5); + function n() { + } + var r = { + trace: n, + debug: n, + log: n, + warn: n, + info: n, + error: n + }, h = r, a = Object(s.a)(), o = function (t) { + if (a.console && !0 === t || 'object' == typeof t) { + !function (t) { + for (var i = arguments.length, e = new Array(i > 1 ? i - 1 : 0), s = 1; s < i; s++) + e[s - 1] = arguments[s]; + e.forEach(function (i) { + h[i] = t[i] ? t[i].bind(t) : function (t) { + var i = a.console[t]; + return i ? function () { + for (var e = arguments.length, s = new Array(e), n = 0; n < e; n++) + s[n] = arguments[n]; + s[0] && (s[0] = function (t, i) { + return i = '[' + t + '] > ' + i; + }(t, s[0])), i.apply(a.console, s); + } : n; + }(i); + }); + }(t, 'debug', 'log', 'info', 'warn', 'error'); + try { + h.log(); + } catch (t) { + h = r; + } + } else + h = r; + }, c = h; + }, + function (t, i, e) { + 'use strict'; + i.a = { + MEDIA_ATTACHING: 'hlsMediaAttaching', + MEDIA_ATTACHED: 'hlsMediaAttached', + MEDIA_DETACHING: 'hlsMediaDetaching', + MEDIA_DETACHED: 'hlsMediaDetached', + BUFFER_RESET: 'hlsBufferReset', + BUFFER_CODECS: 'hlsBufferCodecs', + BUFFER_CREATED: 'hlsBufferCreated', + BUFFER_APPENDING: 'hlsBufferAppending', + BUFFER_APPENDED: 'hlsBufferAppended', + BUFFER_EOS: 'hlsBufferEos', + BUFFER_FLUSHING: 'hlsBufferFlushing', + BUFFER_FLUSHED: 'hlsBufferFlushed', + MANIFEST_LOADING: 'hlsManifestLoading', + MANIFEST_LOADED: 'hlsManifestLoaded', + MANIFEST_PARSED: 'hlsManifestParsed', + LEVEL_SWITCHING: 'hlsLevelSwitching', + LEVEL_SWITCHED: 'hlsLevelSwitched', + LEVEL_LOADING: 'hlsLevelLoading', + LEVEL_LOADED: 'hlsLevelLoaded', + LEVEL_UPDATED: 'hlsLevelUpdated', + LEVEL_PTS_UPDATED: 'hlsLevelPtsUpdated', + AUDIO_TRACKS_UPDATED: 'hlsAudioTracksUpdated', + AUDIO_TRACK_SWITCHING: 'hlsAudioTrackSwitching', + AUDIO_TRACK_SWITCHED: 'hlsAudioTrackSwitched', + AUDIO_TRACK_LOADING: 'hlsAudioTrackLoading', + AUDIO_TRACK_LOADED: 'hlsAudioTrackLoaded', + SUBTITLE_TRACKS_UPDATED: 'hlsSubtitleTracksUpdated', + SUBTITLE_TRACK_SWITCH: 'hlsSubtitleTrackSwitch', + SUBTITLE_TRACK_LOADING: 'hlsSubtitleTrackLoading', + SUBTITLE_TRACK_LOADED: 'hlsSubtitleTrackLoaded', + SUBTITLE_FRAG_PROCESSED: 'hlsSubtitleFragProcessed', + INIT_PTS_FOUND: 'hlsInitPtsFound', + FRAG_LOADING: 'hlsFragLoading', + FRAG_LOAD_PROGRESS: 'hlsFragLoadProgress', + FRAG_LOAD_EMERGENCY_ABORTED: 'hlsFragLoadEmergencyAborted', + FRAG_LOADED: 'hlsFragLoaded', + FRAG_DECRYPTED: 'hlsFragDecrypted', + FRAG_PARSING_INIT_SEGMENT: 'hlsFragParsingInitSegment', + FRAG_PARSING_USERDATA: 'hlsFragParsingUserdata', + FRAG_PARSING_METADATA: 'hlsFragParsingMetadata', + FRAG_PARSING_DATA: 'hlsFragParsingData', + FRAG_PARSED: 'hlsFragParsed', + FRAG_BUFFERED: 'hlsFragBuffered', + FRAG_CHANGED: 'hlsFragChanged', + FPS_DROP: 'hlsFpsDrop', + FPS_DROP_LEVEL_CAPPING: 'hlsFpsDropLevelCapping', + ERROR: 'hlsError', + DESTROYING: 'hlsDestroying', + KEY_LOADING: 'hlsKeyLoading', + KEY_LOADED: 'hlsKeyLoaded', + STREAM_STATE_TRANSITION: 'hlsStreamStateTransition', + LIVE_BACK_BUFFER_REACHED: 'hlsLiveBackBufferReached' + }; + }, + function (t, i, e) { + 'use strict'; + var s, n; + e.d(i, 'b', function () { + return s; + }), e.d(i, 'a', function () { + return n; + }), function (t) { + t.NETWORK_ERROR = 'networkError', t.MEDIA_ERROR = 'mediaError', t.KEY_SYSTEM_ERROR = 'keySystemError', t.MUX_ERROR = 'muxError', t.OTHER_ERROR = 'otherError'; + }(s || (s = {})), function (t) { + t.KEY_SYSTEM_NO_KEYS = 'keySystemNoKeys', t.KEY_SYSTEM_NO_ACCESS = 'keySystemNoAccess', t.KEY_SYSTEM_NO_SESSION = 'keySystemNoSession', t.KEY_SYSTEM_LICENSE_REQUEST_FAILED = 'keySystemLicenseRequestFailed', t.KEY_SYSTEM_NO_INIT_DATA = 'keySystemNoInitData', t.MANIFEST_LOAD_ERROR = 'manifestLoadError', t.MANIFEST_LOAD_TIMEOUT = 'manifestLoadTimeOut', t.MANIFEST_PARSING_ERROR = 'manifestParsingError', t.MANIFEST_INCOMPATIBLE_CODECS_ERROR = 'manifestIncompatibleCodecsError', t.LEVEL_LOAD_ERROR = 'levelLoadError', t.LEVEL_LOAD_TIMEOUT = 'levelLoadTimeOut', t.LEVEL_SWITCH_ERROR = 'levelSwitchError', t.AUDIO_TRACK_LOAD_ERROR = 'audioTrackLoadError', t.AUDIO_TRACK_LOAD_TIMEOUT = 'audioTrackLoadTimeOut', t.FRAG_LOAD_ERROR = 'fragLoadError', t.FRAG_LOAD_TIMEOUT = 'fragLoadTimeOut', t.FRAG_DECRYPT_ERROR = 'fragDecryptError', t.FRAG_PARSING_ERROR = 'fragParsingError', t.REMUX_ALLOC_ERROR = 'remuxAllocError', t.KEY_LOAD_ERROR = 'keyLoadError', t.KEY_LOAD_TIMEOUT = 'keyLoadTimeOut', t.BUFFER_ADD_CODEC_ERROR = 'bufferAddCodecError', t.BUFFER_APPEND_ERROR = 'bufferAppendError', t.BUFFER_APPENDING_ERROR = 'bufferAppendingError', t.BUFFER_STALLED_ERROR = 'bufferStalledError', t.BUFFER_FULL_ERROR = 'bufferFullError', t.BUFFER_SEEK_OVER_HOLE = 'bufferSeekOverHole', t.BUFFER_NUDGE_ON_STALL = 'bufferNudgeOnStall', t.INTERNAL_EXCEPTION = 'internalException'; + }(n || (n = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + var s = Number.isFinite || function (t) { + return 'number' == typeof t && isFinite(t); + }; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'b', function () { + return a; + }); + var s, n = e(5), r = function () { + function t() { + } + return t.isHeader = function (t, i) { + return i + 10 <= t.length && 73 === t[i] && 68 === t[i + 1] && 51 === t[i + 2] && t[i + 3] < 255 && t[i + 4] < 255 && t[i + 6] < 128 && t[i + 7] < 128 && t[i + 8] < 128 && t[i + 9] < 128; + }, t.isFooter = function (t, i) { + return i + 10 <= t.length && 51 === t[i] && 68 === t[i + 1] && 73 === t[i + 2] && t[i + 3] < 255 && t[i + 4] < 255 && t[i + 6] < 128 && t[i + 7] < 128 && t[i + 8] < 128 && t[i + 9] < 128; + }, t.getID3Data = function (i, e) { + for (var s = e, n = 0; t.isHeader(i, e);) + n += 10, n += t.Z(i, e + 6), t.isFooter(i, e + 10) && (n += 10), e += n; + if (n > 0) + return i.subarray(s, s + n); + }, t.Z = function (t, i) { + var e = 0; + return e = (127 & t[i]) << 21, e |= (127 & t[i + 1]) << 14, e |= (127 & t[i + 2]) << 7, e |= 127 & t[i + 3]; + }, t.getTimeStamp = function (i) { + for (var e = t.getID3Frames(i), s = 0; s < e.length; s++) { + var n = e[s]; + if (t.isTimeStampFrame(n)) + return t.tt(n); + } + }, t.isTimeStampFrame = function (t) { + return t && 'PRIV' === t.key && 'com.apple.streaming.transportStreamTimestamp' === t.info; + }, t.it = function (i) { + var e = String.fromCharCode(i[0], i[1], i[2], i[3]), s = t.Z(i, 4); + return { + type: e, + size: s, + data: i.subarray(10, 10 + s) + }; + }, t.getID3Frames = function (i) { + for (var e = 0, s = []; t.isHeader(i, e);) { + for (var n = t.Z(i, e + 6), r = (e += 10) + n; e + 8 < r;) { + var h = t.it(i.subarray(e)), a = t.et(h); + a && s.push(a), e += h.size + 10; + } + t.isFooter(i, e) && (e += 10); + } + return s; + }, t.et = function (i) { + return 'PRIV' === i.type ? t.st(i) : 'T' === i.type[0] ? t.nt(i) : 'W' === i.type[0] ? t.rt(i) : void 0; + }, t.tt = function (t) { + if (8 === t.data.byteLength) { + var i = new Uint8Array(t.data), e = 1 & i[3], s = (i[4] << 23) + (i[5] << 15) + (i[6] << 7) + i[7]; + return s /= 45, e && (s += 47721858.84), Math.round(s); + } + }, t.st = function (i) { + if (!(i.size < 2)) { + var e = t.ht(i.data, !0), s = new Uint8Array(i.data.subarray(e.length + 1)); + return { + key: i.type, + info: e, + data: s.buffer + }; + } + }, t.nt = function (i) { + if (!(i.size < 2)) { + if ('TXXX' === i.type) { + var e = 1, s = t.ht(i.data.subarray(e), !0); + e += s.length + 1; + var n = t.ht(i.data.subarray(e)); + return { + key: i.type, + info: s, + data: n + }; + } + var r = t.ht(i.data.subarray(1)); + return { + key: i.type, + data: r + }; + } + }, t.rt = function (i) { + if ('WXXX' === i.type) { + if (i.size < 2) + return; + var e = 1, s = t.ht(i.data.subarray(e)); + e += s.length + 1; + var n = t.ht(i.data.subarray(e)); + return { + key: i.type, + info: s, + data: n + }; + } + var r = t.ht(i.data); + return { + key: i.type, + data: r + }; + }, t.ht = function (t, i) { + void 0 === i && (i = !1); + var e = h(); + if (e) { + var s = e.decode(t); + if (i) { + var n = s.indexOf('\0'); + return -1 !== n ? s.substring(0, n) : s; + } + return s.replace(/\0/g, ''); + } + for (var r, a, o, c = t.length, u = '', l = 0; l < c;) { + if (0 === (r = t[l++]) && i) + return u; + if (0 !== r && 3 !== r) + switch (r >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + u += String.fromCharCode(r); + break; + case 12: + case 13: + a = t[l++], u += String.fromCharCode((31 & r) << 6 | 63 & a); + break; + case 14: + a = t[l++], o = t[l++], u += String.fromCharCode((15 & r) << 12 | (63 & a) << 6 | (63 & o) << 0); + } + } + return u; + }, t; + }(); + function h() { + var t = Object(n.a)(); + return s || void 0 === t.TextDecoder || (s = new t.TextDecoder('utf-8')), s; + } + var a = r.ht; + i.a = r; + }, + function (t, i, e) { + 'use strict'; + function s() { + return 'undefined' == typeof window ? self : window.cnxRenderWindow ? window.cnxRenderWindow : window; + } + e.d(i, 'a', function () { + return s; + }); + }, + function (t, i) { + t.exports = void 0; + }, + function (t, i, e) { + var s, n, r, h, a; + s = /^((?:[a-zA-Z0-9+\-.]+:)?)(\/\/[^\/?#]*)?((?:[^\/\?#]*\/)*.*?)??(;.*?)?(\?.*?)?(#.*?)?$/, n = /^([^\/?#]*)(.*)$/, r = /(?:\/|^)\.(?=\/)/g, h = /(?:\/|^)\.\.\/(?!\.\.\/).*?(?=\/)/g, a = { + buildAbsoluteURL: function (t, i, e) { + if (e = e || {}, t = t.trim(), !(i = i.trim())) { + if (!e.alwaysNormalize) + return t; + var s = a.parseURL(t); + if (!s) + throw new Error('Error trying to parse base URL.'); + return s.path = a.normalizePath(s.path), a.buildURLFromParts(s); + } + var r = a.parseURL(i); + if (!r) + throw new Error('Error trying to parse relative URL.'); + if (r.scheme) + return e.alwaysNormalize ? (r.path = a.normalizePath(r.path), a.buildURLFromParts(r)) : i; + var h = a.parseURL(t); + if (!h) + throw new Error('Error trying to parse base URL.'); + if (!h.netLoc && h.path && '/' !== h.path[0]) { + var o = n.exec(h.path); + h.netLoc = o[1], h.path = o[2]; + } + h.netLoc && !h.path && (h.path = '/'); + var c = { + scheme: h.scheme, + netLoc: r.netLoc, + path: null, + params: r.params, + query: r.query, + fragment: r.fragment + }; + if (!r.netLoc && (c.netLoc = h.netLoc, '/' !== r.path[0])) + if (r.path) { + var u = h.path, l = u.substring(0, u.lastIndexOf('/') + 1) + r.path; + c.path = a.normalizePath(l); + } else + c.path = h.path, r.params || (c.params = h.params, r.query || (c.query = h.query)); + return null === c.path && (c.path = e.alwaysNormalize ? a.normalizePath(r.path) : r.path), a.buildURLFromParts(c); + }, + parseURL: function (t) { + var i = s.exec(t); + return i ? { + scheme: i[1] || '', + netLoc: i[2] || '', + path: i[3] || '', + params: i[4] || '', + query: i[5] || '', + fragment: i[6] || '' + } : null; + }, + normalizePath: function (t) { + for (t = t.split('').reverse().join('').replace(r, ''); t.length !== (t = t.replace(h, '')).length;); + return t.split('').reverse().join(''); + }, + buildURLFromParts: function (t) { + return t.scheme + t.netLoc + t.path + t.params + t.query + t.fragment; + } + }, t.exports = a; + }, + function (t, i, e) { + 'use strict'; + var s = Object.prototype.hasOwnProperty, n = '~'; + function r() { + } + function h(t, i, e) { + this.fn = t, this.context = i, this.once = e || !1; + } + function a(t, i, e, s, r) { + if ('function' != typeof e) + throw new TypeError('The listener must be a function'); + var a = new h(e, s || t, r), o = n ? n + i : i; + return t.at[o] ? t.at[o].fn ? t.at[o] = [ + t.at[o], + a + ] : t.at[o].push(a) : (t.at[o] = a, t.ot++), t; + } + function o(t, i) { + 0 == --t.ot ? t.at = new r() : delete t.at[i]; + } + function c() { + this.at = new r(), this.ot = 0; + } + Object.create && (r.prototype = Object.create(null), new r().__proto__ || (n = !1)), c.prototype.eventNames = function () { + var t, i, e = []; + if (0 === this.ot) + return e; + for (i in t = this.at) + s.call(t, i) && e.push(n ? i.slice(1) : i); + return Object.getOwnPropertySymbols ? e.concat(Object.getOwnPropertySymbols(t)) : e; + }, c.prototype.listeners = function (t) { + var i = n ? n + t : t, e = this.at[i]; + if (!e) + return []; + if (e.fn) + return [e.fn]; + for (var s = 0, r = e.length, h = new Array(r); s < r; s++) + h[s] = e[s].fn; + return h; + }, c.prototype.listenerCount = function (t) { + var i = n ? n + t : t, e = this.at[i]; + return e ? e.fn ? 1 : e.length : 0; + }, c.prototype.emit = function (t, i, e, s, r, h) { + var a = n ? n + t : t; + if (!this.at[a]) + return !1; + var o, c, u = this.at[a], l = arguments.length; + if (u.fn) { + switch (u.once && this.removeListener(t, u.fn, void 0, !0), l) { + case 1: + return u.fn.call(u.context), !0; + case 2: + return u.fn.call(u.context, i), !0; + case 3: + return u.fn.call(u.context, i, e), !0; + case 4: + return u.fn.call(u.context, i, e, s), !0; + case 5: + return u.fn.call(u.context, i, e, s, r), !0; + case 6: + return u.fn.call(u.context, i, e, s, r, h), !0; + } + for (c = 1, o = new Array(l - 1); c < l; c++) + o[c - 1] = arguments[c]; + u.fn.apply(u.context, o); + } else { + var d, f = u.length; + for (c = 0; c < f; c++) + switch (u[c].once && this.removeListener(t, u[c].fn, void 0, !0), l) { + case 1: + u[c].fn.call(u[c].context); + break; + case 2: + u[c].fn.call(u[c].context, i); + break; + case 3: + u[c].fn.call(u[c].context, i, e); + break; + case 4: + u[c].fn.call(u[c].context, i, e, s); + break; + default: + if (!o) + for (d = 1, o = new Array(l - 1); d < l; d++) + o[d - 1] = arguments[d]; + u[c].fn.apply(u[c].context, o); + } + } + return !0; + }, c.prototype.on = function (t, i, e) { + return a(this, t, i, e, !1); + }, c.prototype.once = function (t, i, e) { + return a(this, t, i, e, !0); + }, c.prototype.removeListener = function (t, i, e, s) { + var r = n ? n + t : t; + if (!this.at[r]) + return this; + if (!i) + return o(this, r), this; + var h = this.at[r]; + if (h.fn) + h.fn !== i || s && !h.once || e && h.context !== e || o(this, r); + else { + for (var a = 0, c = [], u = h.length; a < u; a++) + (h[a].fn !== i || s && !h[a].once || e && h[a].context !== e) && c.push(h[a]); + c.length ? this.at[r] = 1 === c.length ? c[0] : c : o(this, r); + } + return this; + }, c.prototype.removeAllListeners = function (t) { + var i; + return t ? (i = n ? n + t : t, this.at[i] && o(this, i)) : (this.at = new r(), this.ot = 0), this; + }, c.prototype.off = c.prototype.removeListener, c.prototype.addListener = c.prototype.on, c.prefixed = n, c.EventEmitter = c, t.exports = c; + }, + function (t, i, e) { + 'use strict'; + var s = e(1), n = e(2), r = function () { + function t(t, i) { + this.subtle = t, this.aesIV = i; + } + return t.prototype.decrypt = function (t, i) { + return this.subtle.decrypt({ + name: 'AES-CBC', + iv: this.aesIV + }, i, t); + }, t; + }(), h = function () { + function t(t, i) { + this.subtle = t, this.key = i; + } + return t.prototype.expandKey = function () { + return this.subtle.importKey('raw', this.key, { name: 'AES-CBC' }, !1, [ + 'encrypt', + 'decrypt' + ]); + }, t; + }(), a = function () { + function t() { + this.rcon = [ + 0, + 1, + 2, + 4, + 8, + 16, + 32, + 64, + 128, + 27, + 54 + ], this.subMix = [ + new Uint32Array(256), + new Uint32Array(256), + new Uint32Array(256), + new Uint32Array(256) + ], this.invSubMix = [ + new Uint32Array(256), + new Uint32Array(256), + new Uint32Array(256), + new Uint32Array(256) + ], this.sBox = new Uint32Array(256), this.invSBox = new Uint32Array(256), this.key = new Uint32Array(0), this.initTable(); + } + var i = t.prototype; + return i.uint8ArrayToUint32Array_ = function (t) { + for (var i = new DataView(t), e = new Uint32Array(4), s = 0; s < 4; s++) + e[s] = i.getUint32(4 * s); + return e; + }, i.initTable = function () { + var t = this.sBox, i = this.invSBox, e = this.subMix, s = e[0], n = e[1], r = e[2], h = e[3], a = this.invSubMix, o = a[0], c = a[1], u = a[2], l = a[3], d = new Uint32Array(256), f = 0, p = 0, b = 0; + for (b = 0; b < 256; b++) + d[b] = b < 128 ? b << 1 : b << 1 ^ 283; + for (b = 0; b < 256; b++) { + var v = p ^ p << 1 ^ p << 2 ^ p << 3 ^ p << 4; + v = v >>> 8 ^ 255 & v ^ 99, t[f] = v, i[v] = f; + var m = d[f], g = d[m], y = d[g], w = 257 * d[v] ^ 16843008 * v; + s[f] = w << 24 | w >>> 8, n[f] = w << 16 | w >>> 16, r[f] = w << 8 | w >>> 24, h[f] = w, w = 16843009 * y ^ 65537 * g ^ 257 * m ^ 16843008 * f, o[v] = w << 24 | w >>> 8, c[v] = w << 16 | w >>> 16, u[v] = w << 8 | w >>> 24, l[v] = w, f ? (f = m ^ d[d[d[y ^ m]]], p ^= d[d[p]]) : f = p = 1; + } + }, i.expandKey = function (t) { + for (var i = this.uint8ArrayToUint32Array_(t), e = !0, s = 0; s < i.length && e;) + e = i[s] === this.key[s], s++; + if (!e) { + this.key = i; + var n = this.keySize = i.length; + if (4 !== n && 6 !== n && 8 !== n) + throw new Error('Invalid aes key size=' + n); + var r, h, a, o, c = this.ksRows = 4 * (n + 6 + 1), u = this.keySchedule = new Uint32Array(c), l = this.invKeySchedule = new Uint32Array(c), d = this.sBox, f = this.rcon, p = this.invSubMix, b = p[0], v = p[1], m = p[2], g = p[3]; + for (r = 0; r < c; r++) + r < n ? a = u[r] = i[r] : (o = a, r % n == 0 ? (o = d[(o = o << 8 | o >>> 24) >>> 24] << 24 | d[o >>> 16 & 255] << 16 | d[o >>> 8 & 255] << 8 | d[255 & o], o ^= f[r / n | 0] << 24) : n > 6 && r % n == 4 && (o = d[o >>> 24] << 24 | d[o >>> 16 & 255] << 16 | d[o >>> 8 & 255] << 8 | d[255 & o]), u[r] = a = (u[r - n] ^ o) >>> 0); + for (h = 0; h < c; h++) + r = c - h, o = 3 & h ? u[r] : u[r - 4], l[h] = h < 4 || r <= 4 ? o : b[d[o >>> 24]] ^ v[d[o >>> 16 & 255]] ^ m[d[o >>> 8 & 255]] ^ g[d[255 & o]], l[h] = l[h] >>> 0; + } + }, i.networkToHostOrderSwap = function (t) { + return t << 24 | (65280 & t) << 8 | (16711680 & t) >> 8 | t >>> 24; + }, i.decrypt = function (t, i, e, s) { + for (var n, r, h, a, o, c, u, l, d, f, p, b, v, m, g, y, w, O = this.keySize + 6, x = this.invKeySchedule, S = this.invSBox, j = this.invSubMix, k = j[0], _ = j[1], A = j[2], I = j[3], C = this.uint8ArrayToUint32Array_(e), T = C[0], P = C[1], M = C[2], E = C[3], L = new Int32Array(t), R = new Int32Array(L.length), B = this.networkToHostOrderSwap; i < L.length;) { + for (d = B(L[i]), f = B(L[i + 1]), p = B(L[i + 2]), b = B(L[i + 3]), o = d ^ x[0], c = b ^ x[1], u = p ^ x[2], l = f ^ x[3], v = 4, m = 1; m < O; m++) + n = k[o >>> 24] ^ _[c >> 16 & 255] ^ A[u >> 8 & 255] ^ I[255 & l] ^ x[v], r = k[c >>> 24] ^ _[u >> 16 & 255] ^ A[l >> 8 & 255] ^ I[255 & o] ^ x[v + 1], h = k[u >>> 24] ^ _[l >> 16 & 255] ^ A[o >> 8 & 255] ^ I[255 & c] ^ x[v + 2], a = k[l >>> 24] ^ _[o >> 16 & 255] ^ A[c >> 8 & 255] ^ I[255 & u] ^ x[v + 3], o = n, c = r, u = h, l = a, v += 4; + n = S[o >>> 24] << 24 ^ S[c >> 16 & 255] << 16 ^ S[u >> 8 & 255] << 8 ^ S[255 & l] ^ x[v], r = S[c >>> 24] << 24 ^ S[u >> 16 & 255] << 16 ^ S[l >> 8 & 255] << 8 ^ S[255 & o] ^ x[v + 1], h = S[u >>> 24] << 24 ^ S[l >> 16 & 255] << 16 ^ S[o >> 8 & 255] << 8 ^ S[255 & c] ^ x[v + 2], a = S[l >>> 24] << 24 ^ S[o >> 16 & 255] << 16 ^ S[c >> 8 & 255] << 8 ^ S[255 & u] ^ x[v + 3], v += 3, R[i] = B(n ^ T), R[i + 1] = B(a ^ P), R[i + 2] = B(h ^ M), R[i + 3] = B(r ^ E), T = d, P = f, M = p, E = b, i += 4; + } + return s ? (g = R.buffer, y = g.byteLength, (w = y && new DataView(g).getUint8(y - 1)) ? g.slice(0, y - w) : g) : R.buffer; + }, i.destroy = function () { + this.key = void 0, this.keySize = void 0, this.ksRows = void 0, this.sBox = void 0, this.invSBox = void 0, this.subMix = void 0, this.invSubMix = void 0, this.keySchedule = void 0, this.invKeySchedule = void 0, this.rcon = void 0; + }, t; + }(), o = e(0), c = e(5), u = function () { + function t(t, i, e) { + var s = (void 0 === e ? {} : e).removePKCS7Padding, n = void 0 === s || s; + if (this.logEnabled = !0, this.observer = t, this.config = i, this.removePKCS7Padding = n, n) + try { + var r = Object(c.a)().crypto; + r && (this.subtle = r.subtle || r.webkitSubtle); + } catch (t) { + } + this.disableWebCrypto = !this.subtle; + } + var i = t.prototype; + return i.isSync = function () { + return this.disableWebCrypto && this.config.enableSoftwareAES; + }, i.decrypt = function (t, i, e, s) { + var n = this; + if (this.disableWebCrypto && this.config.enableSoftwareAES) { + this.logEnabled && (o.b.log('JS AES decrypt'), this.logEnabled = !1); + var c = this.decryptor; + c || (this.decryptor = c = new a()), c.expandKey(i), s(c.decrypt(t, 0, e, this.removePKCS7Padding)); + } else { + this.logEnabled && (o.b.log('WebCrypto AES decrypt'), this.logEnabled = !1); + var u = this.subtle; + this.key !== i && (this.key = i, this.fastAesKey = new h(u, i)), this.fastAesKey.expandKey().then(function (h) { + new r(u, e).decrypt(t, h).catch(function (r) { + n.onWebCryptoError(r, t, i, e, s); + }).then(function (t) { + s(t); + }); + }).catch(function (r) { + n.onWebCryptoError(r, t, i, e, s); + }); + } + }, i.onWebCryptoError = function (t, i, e, r, h) { + this.config.enableSoftwareAES ? (o.b.log('WebCrypto Error, disable WebCrypto API'), this.disableWebCrypto = !0, this.logEnabled = !0, this.decrypt(i, e, r, h)) : (o.b.error('decrypting error : ' + t.message), this.observer.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_DECRYPT_ERROR, + fatal: !0, + reason: t.message + })); + }, i.destroy = function () { + var t = this.decryptor; + t && (t.destroy(), this.decryptor = void 0); + }, t; + }(), l = e(3); + function d(t, i) { + return 255 === t[i] && 240 == (246 & t[i + 1]); + } + function f(t, i) { + return 1 & t[i + 1] ? 7 : 9; + } + function p(t, i) { + return (3 & t[i + 3]) << 11 | t[i + 4] << 3 | (224 & t[i + 5]) >>> 5; + } + function b(t, i) { + return !!(i + 1 < t.length && d(t, i)); + } + function v(t, i) { + if (b(t, i)) { + var e = f(t, i); + i + 5 < t.length && (e = p(t, i)); + var s = i + e; + if (s === t.length || s + 1 < t.length && d(t, s)) + return !0; + } + return !1; + } + function m(t, i, e, r, h) { + if (!t.samplerate) { + var a = function (t, i, e, r) { + var h, a, c, u, l, d = navigator.userAgent.toLowerCase(), f = r, p = [ + 96000, + 88200, + 64000, + 48000, + 44100, + 32000, + 24000, + 22050, + 16000, + 12000, + 11025, + 8000, + 7350 + ]; + if (h = 1 + ((192 & i[e + 2]) >>> 6), !((a = (60 & i[e + 2]) >>> 2) > p.length - 1)) + return u = (1 & i[e + 2]) << 2, u |= (192 & i[e + 3]) >>> 6, o.b.log('manifest codec:' + r + ',ADTS data:type:' + h + ',sampleingIndex:' + a + '[' + p[a] + 'Hz],channelConfig:' + u), /firefox/i.test(d) ? a >= 6 ? (h = 5, l = new Array(4), c = a - 3) : (h = 2, l = new Array(2), c = a) : -1 !== d.indexOf('android') ? (h = 2, l = new Array(2), c = a) : (h = 5, l = new Array(4), r && (-1 !== r.indexOf('mp4a.40.29') || -1 !== r.indexOf('mp4a.40.5')) || !r && a >= 6 ? c = a - 3 : ((r && -1 !== r.indexOf('mp4a.40.2') && (a >= 6 && 1 === u || /vivaldi/i.test(d)) || !r && 1 === u) && (h = 2, l = new Array(2)), c = a)), l[0] = h << 3, l[0] |= (14 & a) >> 1, l[1] |= (1 & a) << 7, l[1] |= u << 3, 5 === h && (l[1] |= (14 & c) >> 1, l[2] = (1 & c) << 7, l[2] |= 8, l[3] = 0), { + config: l, + samplerate: p[a], + channelCount: u, + codec: 'mp4a.40.' + h, + manifestCodec: f + }; + t.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_PARSING_ERROR, + fatal: !0, + reason: 'invalid ADTS sampling index:' + a + }); + }(i, e, r, h); + t.config = a.config, t.samplerate = a.samplerate, t.channelCount = a.channelCount, t.codec = a.codec, t.manifestCodec = a.manifestCodec, o.b.log('parsed codec:' + t.codec + ',rate:' + a.samplerate + ',nb channel:' + a.channelCount); + } + } + function g(t) { + return 92160000 / t; + } + function y(t, i, e, s, n) { + var r = function (t, i, e, s, n) { + var r, h, a = t.length; + if (r = f(t, i), h = p(t, i), (h -= r) > 0 && i + r + h <= a) + return { + headerLength: r, + frameLength: h, + stamp: e + s * n + }; + }(i, e, s, n, g(t.samplerate)); + if (r) { + var h = r.stamp, a = r.headerLength, o = r.frameLength, c = { + unit: i.subarray(e + a, e + a + o), + pts: h, + dts: h + }; + return t.samples.push(c), { + sample: c, + length: o + a + }; + } + } + var w = e(4), O = function () { + function t(t, i, e) { + this.observer = t, this.config = e, this.remuxer = i; + } + var i = t.prototype; + return i.resetInitSegment = function (t, i, e, s) { + this.ct = { + container: 'audio/adts', + type: 'audio', + id: 0, + sequenceNumber: 0, + isAAC: !0, + samples: [], + len: 0, + manifestCodec: i, + duration: s, + inputTimeScale: 90000 + }; + }, i.resetTimeStamp = function () { + }, t.probe = function (t) { + if (!t) + return !1; + for (var i = (w.a.getID3Data(t, 0) || []).length, e = t.length; i < e; i++) + if (v(t, i)) + return o.b.log('ADTS sync word found !'), !0; + return !1; + }, i.append = function (t, i, e, s) { + for (var n = this.ct, r = w.a.getID3Data(t, 0) || [], h = w.a.getTimeStamp(r), a = Object(l.a)(h) ? 90 * h : 90000 * i, c = 0, u = a, d = t.length, f = r.length, p = [{ + pts: u, + dts: u, + data: r + }]; f < d - 1;) + if (b(t, f) && f + 5 < d) { + m(n, this.observer, t, f, n.manifestCodec); + var v = y(n, t, f, a, c); + if (!v) { + o.b.log('Unable to parse AAC frame'); + break; + } + f += v.length, u = v.sample.pts, c++; + } else + w.a.isHeader(t, f) ? (r = w.a.getID3Data(t, f), p.push({ + pts: u, + dts: u, + data: r + }), f += r.length) : f++; + this.remuxer.remux(n, { samples: [] }, { + samples: p, + inputTimeScale: 90000 + }, { samples: [] }, i, e, s); + }, i.destroy = function () { + }, t; + }(), x = e(10), S = { + BitratesMap: [ + 32, + 64, + 96, + 128, + 160, + 192, + 224, + 256, + 288, + 320, + 352, + 384, + 416, + 448, + 32, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 160, + 192, + 224, + 256, + 320, + 384, + 32, + 40, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 160, + 192, + 224, + 256, + 320, + 32, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 144, + 160, + 176, + 192, + 224, + 256, + 8, + 16, + 24, + 32, + 40, + 48, + 56, + 64, + 80, + 96, + 112, + 128, + 144, + 160 + ], + SamplingRateMap: [ + 44100, + 48000, + 32000, + 22050, + 24000, + 16000, + 11025, + 12000, + 8000 + ], + SamplesCoefficients: [ + [ + 0, + 72, + 144, + 12 + ], + [ + 0, + 0, + 0, + 0 + ], + [ + 0, + 72, + 144, + 12 + ], + [ + 0, + 144, + 144, + 12 + ] + ], + BytesInSlot: [ + 0, + 1, + 1, + 4 + ], + appendFrame: function (t, i, e, s, n) { + if (!(e + 24 > i.length)) { + var r = this.parseHeader(i, e); + if (r && e + r.frameLength <= i.length) { + var h = s + n * (90000 * r.samplesPerFrame / r.sampleRate), a = { + unit: i.subarray(e, e + r.frameLength), + pts: h, + dts: h + }; + return t.config = [], t.channelCount = r.channelCount, t.samplerate = r.sampleRate, t.samples.push(a), { + sample: a, + length: r.frameLength + }; + } + } + }, + parseHeader: function (t, i) { + var e = t[i + 1] >> 3 & 3, s = t[i + 1] >> 1 & 3, n = t[i + 2] >> 4 & 15, r = t[i + 2] >> 2 & 3, h = t[i + 2] >> 1 & 1; + if (1 !== e && 0 !== n && 15 !== n && 3 !== r) { + var a = 3 === e ? 3 - s : 3 === s ? 3 : 4, o = 1000 * S.BitratesMap[14 * a + n - 1], c = 3 === e ? 0 : 2 === e ? 1 : 2, u = S.SamplingRateMap[3 * c + r], l = t[i + 3] >> 6 == 3 ? 1 : 2, d = S.SamplesCoefficients[e][s], f = S.BytesInSlot[s], p = 8 * d * f; + return { + sampleRate: u, + channelCount: l, + frameLength: parseInt(d * o / u + h, 10) * f, + samplesPerFrame: p + }; + } + }, + isHeaderPattern: function (t, i) { + return 255 === t[i] && 224 == (224 & t[i + 1]) && 0 != (6 & t[i + 1]); + }, + isHeader: function (t, i) { + return !!(i + 1 < t.length && this.isHeaderPattern(t, i)); + }, + probe: function (t, i) { + if (i + 1 < t.length && this.isHeaderPattern(t, i)) { + var e = this.parseHeader(t, i), s = 4; + e && e.frameLength && (s = e.frameLength); + var n = i + s; + if (n === t.length || n + 1 < t.length && this.isHeaderPattern(t, n)) + return !0; + } + return !1; + } + }, j = S, k = function () { + function t(t) { + this.data = t, this.bytesAvailable = t.byteLength, this.word = 0, this.bitsAvailable = 0; + } + var i = t.prototype; + return i.loadWord = function () { + var t = this.data, i = this.bytesAvailable, e = t.byteLength - i, s = new Uint8Array(4), n = Math.min(4, i); + if (0 === n) + throw new Error('no bytes available'); + s.set(t.subarray(e, e + n)), this.word = new DataView(s.buffer).getUint32(0), this.bitsAvailable = 8 * n, this.bytesAvailable -= n; + }, i.skipBits = function (t) { + var i; + this.bitsAvailable > t ? (this.word <<= t, this.bitsAvailable -= t) : (t -= this.bitsAvailable, t -= (i = t >> 3) >> 3, this.bytesAvailable -= i, this.loadWord(), this.word <<= t, this.bitsAvailable -= t); + }, i.readBits = function (t) { + var i = Math.min(this.bitsAvailable, t), e = this.word >>> 32 - i; + return t > 32 && o.b.error('Cannot read more than 32 bits at a time'), this.bitsAvailable -= i, this.bitsAvailable > 0 ? this.word <<= i : this.bytesAvailable > 0 && this.loadWord(), (i = t - i) > 0 && this.bitsAvailable ? e << i | this.readBits(i) : e; + }, i.skipLZ = function () { + var t; + for (t = 0; t < this.bitsAvailable; ++t) + if (0 != (this.word & 2147483648 >>> t)) + return this.word <<= t, this.bitsAvailable -= t, t; + return this.loadWord(), t + this.skipLZ(); + }, i.skipUEG = function () { + this.skipBits(1 + this.skipLZ()); + }, i.skipEG = function () { + this.skipBits(1 + this.skipLZ()); + }, i.readUEG = function () { + var t = this.skipLZ(); + return this.readBits(t + 1) - 1; + }, i.readEG = function () { + var t = this.readUEG(); + return 1 & t ? 1 + t >>> 1 : -1 * (t >>> 1); + }, i.readBoolean = function () { + return 1 === this.readBits(1); + }, i.readUByte = function () { + return this.readBits(8); + }, i.readUShort = function () { + return this.readBits(16); + }, i.readUInt = function () { + return this.readBits(32); + }, i.skipScalingList = function (t) { + var i, e = 8, s = 8; + for (i = 0; i < t; i++) + 0 !== s && (s = (e + this.readEG() + 256) % 256), e = 0 === s ? e : s; + }, i.readSPS = function () { + var t, i, e, s, n, r, h, a = 0, o = 0, c = 0, u = 0, l = this.readUByte.bind(this), d = this.readBits.bind(this), f = this.readUEG.bind(this), p = this.readBoolean.bind(this), b = this.skipBits.bind(this), v = this.skipEG.bind(this), m = this.skipUEG.bind(this), g = this.skipScalingList.bind(this); + if (l(), t = l(), d(5), b(3), l(), m(), 100 === t || 110 === t || 122 === t || 244 === t || 44 === t || 83 === t || 86 === t || 118 === t || 128 === t) { + var y = f(); + if (3 === y && b(1), m(), m(), b(1), p()) + for (r = 3 !== y ? 8 : 12, h = 0; h < r; h++) + p() && g(h < 6 ? 16 : 64); + } + m(); + var w = f(); + if (0 === w) + f(); + else if (1 === w) + for (b(1), v(), v(), i = f(), h = 0; h < i; h++) + v(); + m(), b(1), e = f(), s = f(), 0 === (n = d(1)) && b(1), b(1), p() && (a = f(), o = f(), c = f(), u = f()); + var O = [ + 1, + 1 + ]; + if (p() && p()) + switch (l()) { + case 1: + O = [ + 1, + 1 + ]; + break; + case 2: + O = [ + 12, + 11 + ]; + break; + case 3: + O = [ + 10, + 11 + ]; + break; + case 4: + O = [ + 16, + 11 + ]; + break; + case 5: + O = [ + 40, + 33 + ]; + break; + case 6: + O = [ + 24, + 11 + ]; + break; + case 7: + O = [ + 20, + 11 + ]; + break; + case 8: + O = [ + 32, + 11 + ]; + break; + case 9: + O = [ + 80, + 33 + ]; + break; + case 10: + O = [ + 18, + 11 + ]; + break; + case 11: + O = [ + 15, + 11 + ]; + break; + case 12: + O = [ + 64, + 33 + ]; + break; + case 13: + O = [ + 160, + 99 + ]; + break; + case 14: + O = [ + 4, + 3 + ]; + break; + case 15: + O = [ + 3, + 2 + ]; + break; + case 16: + O = [ + 2, + 1 + ]; + break; + case 255: + O = [ + l() << 8 | l(), + l() << 8 | l() + ]; + } + return { + width: Math.ceil(16 * (e + 1) - 2 * a - 2 * o), + height: (2 - n) * (s + 1) * 16 - (n ? 2 : 4) * (c + u), + pixelRatio: O + }; + }, i.readSliceType = function () { + return this.readUByte(), this.readUEG(), this.readUEG(); + }, t; + }(), _ = function () { + function t(t, i, e, s) { + this.decryptdata = e, this.discardEPB = s, this.decrypter = new u(t, i, { removePKCS7Padding: !1 }); + } + var i = t.prototype; + return i.decryptBuffer = function (t, i) { + this.decrypter.decrypt(t, this.decryptdata.key.buffer, this.decryptdata.iv.buffer, i); + }, i.decryptAacSample = function (t, i, e, s) { + var n = t[i].unit, r = n.subarray(16, n.length - n.length % 16), h = r.buffer.slice(r.byteOffset, r.byteOffset + r.length), a = this; + this.decryptBuffer(h, function (r) { + r = new Uint8Array(r), n.set(r, 16), s || a.decryptAacSamples(t, i + 1, e); + }); + }, i.decryptAacSamples = function (t, i, e) { + for (;; i++) { + if (i >= t.length) + return void e(); + if (!(t[i].unit.length < 32)) { + var s = this.decrypter.isSync(); + if (this.decryptAacSample(t, i, e, s), !s) + return; + } + } + }, i.getAvcEncryptedData = function (t) { + for (var i = 16 * Math.floor((t.length - 48) / 160) + 16, e = new Int8Array(i), s = 0, n = 32; n <= t.length - 16; n += 160, s += 16) + e.set(t.subarray(n, n + 16), s); + return e; + }, i.getAvcDecryptedUnit = function (t, i) { + i = new Uint8Array(i); + for (var e = 0, s = 32; s <= t.length - 16; s += 160, e += 16) + t.set(i.subarray(e, e + 16), s); + return t; + }, i.decryptAvcSample = function (t, i, e, s, n, r) { + var h = this.discardEPB(n.data), a = this.getAvcEncryptedData(h), o = this; + this.decryptBuffer(a.buffer, function (a) { + n.data = o.getAvcDecryptedUnit(h, a), r || o.decryptAvcSamples(t, i, e + 1, s); + }); + }, i.decryptAvcSamples = function (t, i, e, s) { + for (;; i++, e = 0) { + if (i >= t.length) + return void s(); + for (var n = t[i].units; !(e >= n.length); e++) { + var r = n[e]; + if (!(r.length <= 48 || 1 !== r.type && 5 !== r.type)) { + var h = this.decrypter.isSync(); + if (this.decryptAvcSample(t, i, e, s, r, h), !h) + return; + } + } + } + }, t; + }(), A = { + video: 1, + audio: 2, + id3: 3, + text: 4 + }, I = function () { + function t(t, i, e, s) { + this.observer = t, this.config = e, this.typeSupported = s, this.remuxer = i, this.sampleAes = null; + } + var i = t.prototype; + return i.setDecryptData = function (t) { + null != t && null != t.key && 'SAMPLE-AES' === t.method ? this.sampleAes = new _(this.observer, this.config, t, this.discardEPB) : this.sampleAes = null; + }, t.probe = function (i) { + var e = t.ut(i); + return !(e < 0 || (e && o.b.warn('MPEG2-TS detected but first sync word found @ offset ' + e + ', junk ahead ?'), 0)); + }, t.ut = function (t) { + for (var i = Math.min(1000, t.length - 564), e = 0; e < i;) { + if (71 === t[e] && 71 === t[e + 188] && 71 === t[e + 376]) + return e; + e++; + } + return -1; + }, t.createTrack = function (t, i) { + return { + container: 'video' === t || 'audio' === t ? 'video/mp2t' : void 0, + type: t, + id: A[t], + pid: -1, + inputTimeScale: 90000, + sequenceNumber: 0, + samples: [], + dropped: 'video' === t ? 0 : void 0, + isAAC: 'audio' === t || void 0, + duration: 'audio' === t ? i : void 0 + }; + }, i.resetInitSegment = function (i, e, s, n) { + this.pmtParsed = !1, this.lt = -1, this.dt = t.createTrack('video', n), this.ct = t.createTrack('audio', n), this.ft = t.createTrack('id3', n), this.pt = t.createTrack('text', n), this.aacOverFlow = null, this.aacLastPTS = null, this.avcSample = null, this.audioCodec = e, this.videoCodec = s, this.bt = n; + }, i.resetTimeStamp = function () { + }, i.append = function (i, e, r, h) { + var a, c, u, l, d, f = i.length, p = !1; + this.contiguous = r; + var b = this.pmtParsed, v = this.dt, m = this.ct, g = this.ft, y = v.pid, w = m.pid, O = g.pid, x = this.lt, S = v.pesData, j = m.pesData, k = g.pesData, _ = this.vt, A = this.gt, I = this.yt, C = this.wt.bind(this), T = this.Ot.bind(this), P = this.xt.bind(this), M = this.St.bind(this), E = t.ut(i); + for (f -= (f + E) % 188, a = E; a < f; a += 188) + if (71 === i[a]) { + if (c = !!(64 & i[a + 1]), u = ((31 & i[a + 1]) << 8) + i[a + 2], (48 & i[a + 3]) >> 4 > 1) { + if ((l = a + 5 + i[a + 4]) === a + 188) + continue; + } else + l = a + 4; + switch (u) { + case y: + c && (S && (d = I(S)) && C(d, !1), S = { + data: [], + size: 0 + }), S && (S.data.push(i.subarray(l, a + 188)), S.size += a + 188 - l); + break; + case w: + c && (j && (d = I(j)) && (m.isAAC ? T(d) : P(d)), j = { + data: [], + size: 0 + }), j && (j.data.push(i.subarray(l, a + 188)), j.size += a + 188 - l); + break; + case O: + c && (k && (d = I(k)) && M(d), k = { + data: [], + size: 0 + }), k && (k.data.push(i.subarray(l, a + 188)), k.size += a + 188 - l); + break; + case 0: + c && (l += i[l] + 1), x = this.lt = _(i, l); + break; + case x: + c && (l += i[l] + 1); + var L = A(i, l, !0 === this.typeSupported.mpeg || !0 === this.typeSupported.mp3, null != this.sampleAes); + (y = L.avc) > 0 && (v.pid = y), (w = L.audio) > 0 && (m.pid = w, m.isAAC = L.isAAC), (O = L.id3) > 0 && (g.pid = O), p && !b && (o.b.log('reparse from beginning'), p = !1, a = E - 188), b = this.pmtParsed = !0; + break; + case 17: + case 8191: + break; + default: + p = !0; + } + } else + this.observer.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_PARSING_ERROR, + fatal: !1, + reason: 'TS packet did not start with 0x47' + }); + S && (d = I(S)) ? (C(d, !0), v.pesData = null) : v.pesData = S, j && (d = I(j)) ? (m.isAAC ? T(d) : P(d), m.pesData = null) : (j && j.size && o.b.log('last AAC PES packet truncated,might overlap between fragments'), m.pesData = j), k && (d = I(k)) ? (M(d), g.pesData = null) : g.pesData = k, null == this.sampleAes ? this.remuxer.remux(m, v, g, this.pt, e, r, h) : this.decryptAndRemux(m, v, g, this.pt, e, r, h); + }, i.decryptAndRemux = function (t, i, e, s, n, r, h) { + if (t.samples && t.isAAC) { + var a = this; + this.sampleAes.decryptAacSamples(t.samples, 0, function () { + a.decryptAndRemuxAvc(t, i, e, s, n, r, h); + }); + } else + this.decryptAndRemuxAvc(t, i, e, s, n, r, h); + }, i.decryptAndRemuxAvc = function (t, i, e, s, n, r, h) { + if (i.samples) { + var a = this; + this.sampleAes.decryptAvcSamples(i.samples, 0, 0, function () { + a.remuxer.remux(t, i, e, s, n, r, h); + }); + } else + this.remuxer.remux(t, i, e, s, n, r, h); + }, i.destroy = function () { + this.jt = this.kt = void 0, this.bt = 0; + }, i.vt = function (t, i) { + return (31 & t[i + 10]) << 8 | t[i + 11]; + }, i.gt = function (t, i, e, s) { + var n, r, h = { + audio: -1, + avc: -1, + id3: -1, + isAAC: !0 + }; + for (n = i + 3 + ((15 & t[i + 1]) << 8 | t[i + 2]) - 4, i += 12 + ((15 & t[i + 10]) << 8 | t[i + 11]); i < n;) { + switch (r = (31 & t[i + 1]) << 8 | t[i + 2], t[i]) { + case 207: + if (!s) { + o.b.log('unknown stream type:' + t[i]); + break; + } + case 15: + -1 === h.audio && (h.audio = r); + break; + case 21: + -1 === h.id3 && (h.id3 = r); + break; + case 219: + if (!s) { + o.b.log('unknown stream type:' + t[i]); + break; + } + case 27: + -1 === h.avc && (h.avc = r); + break; + case 3: + case 4: + e ? -1 === h.audio && (h.audio = r, h.isAAC = !1) : o.b.log('MPEG audio found, not supported in this browser for now'); + break; + case 36: + o.b.warn('HEVC stream type found, not supported for now'); + break; + default: + o.b.log('unknown stream type:' + t[i]); + } + i += 5 + ((15 & t[i + 3]) << 8 | t[i + 4]); + } + return h; + }, i.yt = function (t) { + var i, e, s, n, r, h, a, c, u = 0, l = t.data; + if (!t || 0 === t.size) + return null; + for (; l[0].length < 19 && l.length > 1;) { + var d = new Uint8Array(l[0].length + l[1].length); + d.set(l[0]), d.set(l[1], l[0].length), l[0] = d, l.splice(1, 1); + } + if (1 === ((i = l[0])[0] << 16) + (i[1] << 8) + i[2]) { + if ((s = (i[4] << 8) + i[5]) && s > t.size - 6) + return null; + if (192 & (e = i[7]) && ((h = 536870912 * (14 & i[9]) + 4194304 * (255 & i[10]) + 16384 * (254 & i[11]) + 128 * (255 & i[12]) + (254 & i[13]) / 2) > 4294967295 && (h -= 8589934592), 64 & e ? ((a = 536870912 * (14 & i[14]) + 4194304 * (255 & i[15]) + 16384 * (254 & i[16]) + 128 * (255 & i[17]) + (254 & i[18]) / 2) > 4294967295 && (a -= 8589934592), h - a > 5400000 && (o.b.warn(Math.round((h - a) / 90000) + 's delta between PTS and DTS, align them'), h = a)) : a = h), c = (n = i[8]) + 9, t.size <= c) + return null; + t.size -= c, r = new Uint8Array(t.size); + for (var f = 0, p = l.length; f < p; f++) { + var b = (i = l[f]).byteLength; + if (c) { + if (c > b) { + c -= b; + continue; + } + i = i.subarray(c), b -= c, c = 0; + } + r.set(i, u), u += b; + } + return s && (s -= n + 3), { + data: r, + pts: h, + dts: a, + len: s + }; + } + return null; + }, i.pushAccesUnit = function (t, i) { + if (t.units.length && t.frame) { + var e = i.samples, s = e.length; + if (isNaN(t.pts)) { + if (!s) + return void i.dropped++; + var n = e[s - 1]; + t.pts = n.pts, t.dts = n.dts; + } + !this.config.forceKeyFrameOnDiscontinuity || !0 === t.key || i.sps && (s || this.contiguous) ? (t.id = s, e.push(t)) : i.dropped++; + } + t.debug.length && o.b.log(t.pts + '/' + t.dts + ':' + t.debug); + }, i.wt = function (t, i) { + var e, s, n, r = this, h = this.dt, a = this._t(t.data), o = this.avcSample, c = !1, u = this.pushAccesUnit.bind(this), l = function (t, i, e, s) { + return { + key: t, + pts: i, + dts: e, + units: [], + debug: s + }; + }; + t.data = null, o && a.length && !h.audFound && (u(o, h), o = this.avcSample = l(!1, t.pts, t.dts, '')), a.forEach(function (i) { + switch (i.type) { + case 1: + s = !0, o || (o = r.avcSample = l(!0, t.pts, t.dts, '')), o.frame = !0; + var a = i.data; + if (c && a.length > 4) { + var d = new k(a).readSliceType(); + 2 !== d && 4 !== d && 7 !== d && 9 !== d || (o.key = !0); + } + break; + case 5: + s = !0, o || (o = r.avcSample = l(!0, t.pts, t.dts, '')), o.key = !0, o.frame = !0; + break; + case 6: + s = !0, (e = new k(r.discardEPB(i.data))).readUByte(); + for (var f = 0, p = 0, b = !1, v = 0; !b && e.bytesAvailable > 1;) { + f = 0; + do { + f += v = e.readUByte(); + } while (255 === v); + p = 0; + do { + p += v = e.readUByte(); + } while (255 === v); + if (4 === f && 0 !== e.bytesAvailable) { + if (b = !0, 181 === e.readUByte() && 49 === e.readUShort() && 1195456820 === e.readUInt() && 3 === e.readUByte()) { + var m = e.readUByte(), g = 31 & m, y = [ + m, + e.readUByte() + ]; + for (n = 0; n < g; n++) + y.push(e.readUByte()), y.push(e.readUByte()), y.push(e.readUByte()); + r.At(r.pt.samples, { + type: 3, + pts: t.pts, + bytes: y + }); + } + } else if (5 === f && 0 !== e.bytesAvailable) { + if (b = !0, p > 16) { + var O = []; + for (n = 0; n < 16; n++) + O.push(e.readUByte().toString(16)), 3 !== n && 5 !== n && 7 !== n && 9 !== n || O.push('-'); + var x = p - 16, S = new Uint8Array(x); + for (n = 0; n < x; n++) + S[n] = e.readUByte(); + r.At(r.pt.samples, { + pts: t.pts, + payloadType: f, + uuid: O.join(''), + userDataBytes: S, + userData: Object(w.b)(S.buffer) + }); + } + } else if (p < e.bytesAvailable) + for (n = 0; n < p; n++) + e.readUByte(); + } + break; + case 7: + if (s = !0, c = !0, !h.sps) { + var j = (e = new k(i.data)).readSPS(); + h.width = j.width, h.height = j.height, h.pixelRatio = j.pixelRatio, h.sps = [i.data], h.duration = r.bt; + var _ = i.data.subarray(1, 4), A = 'avc1.'; + for (n = 0; n < 3; n++) { + var I = _[n].toString(16); + I.length < 2 && (I = '0' + I), A += I; + } + h.codec = A; + } + break; + case 8: + s = !0, h.pps || (h.pps = [i.data]); + break; + case 9: + s = !1, h.audFound = !0, o && u(o, h), o = r.avcSample = l(!1, t.pts, t.dts, ''); + break; + case 12: + s = !1; + break; + default: + s = !1, o && (o.debug += 'unknown NAL ' + i.type + ' '); + } + o && s && o.units.push(i); + }), i && o && (u(o, h), this.avcSample = null); + }, i.At = function (t, i) { + var e = t.length; + if (e > 0) { + if (i.pts >= t[e - 1].pts) + t.push(i); + else + for (var s = e - 1; s >= 0; s--) + if (i.pts < t[s].pts) { + t.splice(s, 0, i); + break; + } + } else + t.push(i); + }, i.It = function () { + var t, i = this.avcSample; + if (!i || 0 === i.units.length) { + var e = this.dt.samples; + i = e[e.length - 1]; + } + if (i) { + var s = i.units; + t = s[s.length - 1]; + } + return t; + }, i._t = function (t) { + var i, e, s, n, r = 0, h = t.byteLength, a = this.dt, o = a.naluState || 0, c = o, u = [], l = -1; + for (-1 === o && (l = 0, n = 31 & t[0], o = 0, r = 1); r < h;) + if (i = t[r++], o) + if (1 !== o) + if (i) + if (1 === i) { + if (l >= 0) + s = { + data: t.subarray(l, r - o - 1), + type: n + }, u.push(s); + else { + var d = this.It(); + if (d && (c && r <= 4 - c && d.state && (d.data = d.data.subarray(0, d.data.byteLength - c)), (e = r - o - 1) > 0)) { + var f = new Uint8Array(d.data.byteLength + e); + f.set(d.data, 0), f.set(t.subarray(0, e), d.data.byteLength), d.data = f; + } + } + r < h ? (l = r, n = 31 & t[r], o = 0) : o = -1; + } else + o = 0; + else + o = 3; + else + o = i ? 0 : 2; + else + o = i ? 0 : 1; + if (l >= 0 && o >= 0 && (s = { + data: t.subarray(l, h), + type: n, + state: o + }, u.push(s)), 0 === u.length) { + var p = this.It(); + if (p) { + var b = new Uint8Array(p.data.byteLength + t.byteLength); + b.set(p.data, 0), b.set(t, p.data.byteLength), p.data = b; + } + } + return a.naluState = o, u; + }, i.discardEPB = function (t) { + for (var i, e, s = t.byteLength, n = [], r = 1; r < s - 2;) + 0 === t[r] && 0 === t[r + 1] && 3 === t[r + 2] ? (n.push(r + 2), r += 2) : r++; + if (0 === n.length) + return t; + i = s - n.length, e = new Uint8Array(i); + var h = 0; + for (r = 0; r < i; h++, r++) + h === n[0] && (h++, n.shift()), e[r] = t[h]; + return e; + }, i.Ot = function (t) { + var i, e, r, h, a, c, u, l = this.ct, d = t.data, f = t.pts, p = this.aacOverFlow, v = this.aacLastPTS; + if (p) { + var w = new Uint8Array(p.byteLength + d.byteLength); + w.set(p, 0), w.set(d, p.byteLength), d = w; + } + for (r = 0, a = d.length; r < a - 1 && !b(d, r); r++); + if (!r || (r < a - 1 ? (c = 'AAC PES did not start with ADTS header,offset:' + r, u = !1) : (c = 'no ADTS header found in AAC PES', u = !0), o.b.warn('parsing error:' + c), this.observer.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_PARSING_ERROR, + fatal: u, + reason: c + }), !u)) { + if (m(l, this.observer, d, r, this.audioCodec), e = 0, i = g(l.samplerate), p && v) { + var O = v + i; + Math.abs(O - f) > 1 && (o.b.log('AAC: align PTS for overlapping frames by ' + Math.round((O - f) / 90)), f = O); + } + for (; r < a;) { + if (b(d, r)) { + if (r + 5 < a) { + var x = y(l, d, r, f, e); + if (x) { + r += x.length, h = x.sample.pts, e++; + continue; + } + } + break; + } + r++; + } + p = r < a ? d.subarray(r, a) : null, this.aacOverFlow = p, this.aacLastPTS = h; + } + }, i.xt = function (t) { + for (var i = t.data, e = i.length, s = 0, n = 0, r = t.pts; n < e;) + if (j.isHeader(i, n)) { + var h = j.appendFrame(this.ct, i, n, r, s); + if (!h) + break; + n += h.length, s++; + } else + n++; + }, i.St = function (t) { + this.ft.samples.push(t); + }, t; + }(), C = function () { + function t(t, i, e) { + this.observer = t, this.config = e, this.remuxer = i; + } + var i = t.prototype; + return i.resetInitSegment = function (t, i, e, s) { + this.ct = { + container: 'audio/mpeg', + type: 'audio', + id: -1, + sequenceNumber: 0, + isAAC: !1, + samples: [], + len: 0, + manifestCodec: i, + duration: s, + inputTimeScale: 90000 + }; + }, i.resetTimeStamp = function () { + }, t.probe = function (t) { + var i, e, s = w.a.getID3Data(t, 0); + if (s && void 0 !== w.a.getTimeStamp(s)) + for (i = s.length, e = Math.min(t.length - 1, i + 100); i < e; i++) + if (j.probe(t, i)) + return o.b.log('MPEG Audio sync word found !'), !0; + return !1; + }, i.append = function (t, i, e, s) { + for (var n = w.a.getID3Data(t, 0), r = w.a.getTimeStamp(n), h = r ? 90 * r : 90000 * i, a = n.length, o = t.length, c = 0, u = 0, l = this.ct, d = [{ + pts: h, + dts: h, + data: n + }]; a < o;) + if (j.isHeader(t, a)) { + var f = j.appendFrame(l, t, a, h, c); + if (!f) + break; + a += f.length, u = f.sample.pts, c++; + } else + w.a.isHeader(t, a) ? (n = w.a.getID3Data(t, a), d.push({ + pts: u, + dts: u, + data: n + }), a += n.length) : a++; + this.remuxer.remux(l, { samples: [] }, { + samples: d, + inputTimeScale: 90000 + }, { samples: [] }, i, e, s); + }, i.destroy = function () { + }, t; + }(), T = function () { + function t() { + } + return t.getSilentFrame = function (t, i) { + switch (t) { + case 'mp4a.40.2': + if (1 === i) + return new Uint8Array([ + 0, + 200, + 0, + 128, + 35, + 128 + ]); + if (2 === i) + return new Uint8Array([ + 33, + 0, + 73, + 144, + 2, + 25, + 0, + 35, + 128 + ]); + if (3 === i) + return new Uint8Array([ + 0, + 200, + 0, + 128, + 32, + 132, + 1, + 38, + 64, + 8, + 100, + 0, + 142 + ]); + if (4 === i) + return new Uint8Array([ + 0, + 200, + 0, + 128, + 32, + 132, + 1, + 38, + 64, + 8, + 100, + 0, + 128, + 44, + 128, + 8, + 2, + 56 + ]); + if (5 === i) + return new Uint8Array([ + 0, + 200, + 0, + 128, + 32, + 132, + 1, + 38, + 64, + 8, + 100, + 0, + 130, + 48, + 4, + 153, + 0, + 33, + 144, + 2, + 56 + ]); + if (6 === i) + return new Uint8Array([ + 0, + 200, + 0, + 128, + 32, + 132, + 1, + 38, + 64, + 8, + 100, + 0, + 130, + 48, + 4, + 153, + 0, + 33, + 144, + 2, + 0, + 178, + 0, + 32, + 8, + 224 + ]); + break; + default: + if (1 === i) + return new Uint8Array([ + 1, + 64, + 34, + 128, + 163, + 78, + 230, + 128, + 186, + 8, + 0, + 0, + 0, + 28, + 6, + 241, + 193, + 10, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 94 + ]); + if (2 === i) + return new Uint8Array([ + 1, + 64, + 34, + 128, + 163, + 94, + 230, + 128, + 186, + 8, + 0, + 0, + 0, + 0, + 149, + 0, + 6, + 241, + 161, + 10, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 94 + ]); + if (3 === i) + return new Uint8Array([ + 1, + 64, + 34, + 128, + 163, + 94, + 230, + 128, + 186, + 8, + 0, + 0, + 0, + 0, + 149, + 0, + 6, + 241, + 161, + 10, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 90, + 94 + ]); + } + return null; + }, t; + }(), P = Math.pow(2, 32) - 1, M = function () { + function t() { + } + return t.init = function () { + var i; + for (i in (t.types = { + avc1: [], + avcC: [], + btrt: [], + dinf: [], + dref: [], + esds: [], + ftyp: [], + hdlr: [], + mdat: [], + mdhd: [], + mdia: [], + mfhd: [], + minf: [], + moof: [], + moov: [], + mp4a: [], + '.mp3': [], + mvex: [], + mvhd: [], + pasp: [], + sdtp: [], + stbl: [], + stco: [], + stsc: [], + stsd: [], + stsz: [], + stts: [], + tfdt: [], + tfhd: [], + traf: [], + trak: [], + trun: [], + trex: [], + tkhd: [], + vmhd: [], + smhd: [] + }, t.types)) + t.types.hasOwnProperty(i) && (t.types[i] = [ + i.charCodeAt(0), + i.charCodeAt(1), + i.charCodeAt(2), + i.charCodeAt(3) + ]); + var e = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 118, + 105, + 100, + 101, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 86, + 105, + 100, + 101, + 111, + 72, + 97, + 110, + 100, + 108, + 101, + 114, + 0 + ]), s = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 115, + 111, + 117, + 110, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 83, + 111, + 117, + 110, + 100, + 72, + 97, + 110, + 100, + 108, + 101, + 114, + 0 + ]); + t.HDLR_TYPES = { + video: e, + audio: s + }; + var n = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 12, + 117, + 114, + 108, + 32, + 0, + 0, + 0, + 1 + ]), r = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); + t.STTS = t.STSC = t.STCO = r, t.STSZ = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]), t.VMHD = new Uint8Array([ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]), t.SMHD = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]), t.STSD = new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1 + ]); + var h = new Uint8Array([ + 105, + 115, + 111, + 109 + ]), a = new Uint8Array([ + 97, + 118, + 99, + 49 + ]), o = new Uint8Array([ + 0, + 0, + 0, + 1 + ]); + t.FTYP = t.box(t.types.ftyp, h, o, h, a), t.DINF = t.box(t.types.dinf, t.box(t.types.dref, n)); + }, t.box = function (t) { + for (var i, e = Array.prototype.slice.call(arguments, 1), s = 8, n = e.length, r = n; n--;) + s += e[n].byteLength; + for ((i = new Uint8Array(s))[0] = s >> 24 & 255, i[1] = s >> 16 & 255, i[2] = s >> 8 & 255, i[3] = 255 & s, i.set(t, 4), n = 0, s = 8; n < r; n++) + i.set(e[n], s), s += e[n].byteLength; + return i; + }, t.hdlr = function (i) { + return t.box(t.types.hdlr, t.HDLR_TYPES[i]); + }, t.mdat = function (i) { + return t.box(t.types.mdat, i); + }, t.mdhd = function (i, e) { + e *= i; + var s = Math.floor(e / (P + 1)), n = Math.floor(e % (P + 1)); + return t.box(t.types.mdhd, new Uint8Array([ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + i >> 24 & 255, + i >> 16 & 255, + i >> 8 & 255, + 255 & i, + s >> 24, + s >> 16 & 255, + s >> 8 & 255, + 255 & s, + n >> 24, + n >> 16 & 255, + n >> 8 & 255, + 255 & n, + 85, + 196, + 0, + 0 + ])); + }, t.mdia = function (i) { + return t.box(t.types.mdia, t.mdhd(i.timescale, i.duration), t.hdlr(i.type), t.minf(i)); + }, t.mfhd = function (i) { + return t.box(t.types.mfhd, new Uint8Array([ + 0, + 0, + 0, + 0, + i >> 24, + i >> 16 & 255, + i >> 8 & 255, + 255 & i + ])); + }, t.minf = function (i) { + return 'audio' === i.type ? t.box(t.types.minf, t.box(t.types.smhd, t.SMHD), t.DINF, t.stbl(i)) : t.box(t.types.minf, t.box(t.types.vmhd, t.VMHD), t.DINF, t.stbl(i)); + }, t.moof = function (i, e, s) { + return t.box(t.types.moof, t.mfhd(i), t.traf(s, e)); + }, t.moov = function (i) { + for (var e = i.length, s = []; e--;) + s[e] = t.trak(i[e]); + return t.box.apply(null, [ + t.types.moov, + t.mvhd(i[0].timescale, i[0].duration) + ].concat(s).concat(t.mvex(i))); + }, t.mvex = function (i) { + for (var e = i.length, s = []; e--;) + s[e] = t.trex(i[e]); + return t.box.apply(null, [t.types.mvex].concat(s)); + }, t.mvhd = function (i, e) { + e *= i; + var s = Math.floor(e / (P + 1)), n = Math.floor(e % (P + 1)), r = new Uint8Array([ + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + i >> 24 & 255, + i >> 16 & 255, + i >> 8 & 255, + 255 & i, + s >> 24, + s >> 16 & 255, + s >> 8 & 255, + 255 & s, + n >> 24, + n >> 16 & 255, + n >> 8 & 255, + 255 & n, + 0, + 1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 255, + 255, + 255, + 255 + ]); + return t.box(t.types.mvhd, r); + }, t.sdtp = function (i) { + var e, s, n = i.samples || [], r = new Uint8Array(4 + n.length); + for (s = 0; s < n.length; s++) + e = n[s].flags, r[s + 4] = e.dependsOn << 4 | e.isDependedOn << 2 | e.hasRedundancy; + return t.box(t.types.sdtp, r); + }, t.stbl = function (i) { + return t.box(t.types.stbl, t.stsd(i), t.box(t.types.stts, t.STTS), t.box(t.types.stsc, t.STSC), t.box(t.types.stsz, t.STSZ), t.box(t.types.stco, t.STCO)); + }, t.avc1 = function (i) { + var e, s, n, r = [], h = []; + for (e = 0; e < i.sps.length; e++) + n = (s = i.sps[e]).byteLength, r.push(n >>> 8 & 255), r.push(255 & n), r = r.concat(Array.prototype.slice.call(s)); + for (e = 0; e < i.pps.length; e++) + n = (s = i.pps[e]).byteLength, h.push(n >>> 8 & 255), h.push(255 & n), h = h.concat(Array.prototype.slice.call(s)); + var a = t.box(t.types.avcC, new Uint8Array([ + 1, + r[3], + r[4], + r[5], + 255, + 224 | i.sps.length + ].concat(r).concat([i.pps.length]).concat(h))), o = i.width, c = i.height, u = i.pixelRatio[0], l = i.pixelRatio[1]; + return t.box(t.types.avc1, new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + o >> 8 & 255, + 255 & o, + c >> 8 & 255, + 255 & c, + 0, + 72, + 0, + 0, + 0, + 72, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 18, + 100, + 97, + 105, + 108, + 121, + 109, + 111, + 116, + 105, + 111, + 110, + 47, + 104, + 108, + 115, + 46, + 106, + 115, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 24, + 17, + 17 + ]), a, t.box(t.types.btrt, new Uint8Array([ + 0, + 28, + 156, + 128, + 0, + 45, + 198, + 192, + 0, + 45, + 198, + 192 + ])), t.box(t.types.pasp, new Uint8Array([ + u >> 24, + u >> 16 & 255, + u >> 8 & 255, + 255 & u, + l >> 24, + l >> 16 & 255, + l >> 8 & 255, + 255 & l + ]))); + }, t.esds = function (t) { + var i = t.config.length; + return new Uint8Array([ + 0, + 0, + 0, + 0, + 3, + 23 + i, + 0, + 1, + 0, + 4, + 15 + i, + 64, + 21, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 5 + ].concat([i]).concat(t.config).concat([ + 6, + 1, + 2 + ])); + }, t.mp4a = function (i) { + var e = i.samplerate; + return t.box(t.types.mp4a, new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + i.channelCount, + 0, + 16, + 0, + 0, + 0, + 0, + e >> 8 & 255, + 255 & e, + 0, + 0 + ]), t.box(t.types.esds, t.esds(i))); + }, t.mp3 = function (i) { + var e = i.samplerate; + return t.box(t.types['.mp3'], new Uint8Array([ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + i.channelCount, + 0, + 16, + 0, + 0, + 0, + 0, + e >> 8 & 255, + 255 & e, + 0, + 0 + ])); + }, t.stsd = function (i) { + return 'audio' === i.type ? i.isAAC || 'mp3' !== i.codec ? t.box(t.types.stsd, t.STSD, t.mp4a(i)) : t.box(t.types.stsd, t.STSD, t.mp3(i)) : t.box(t.types.stsd, t.STSD, t.avc1(i)); + }, t.tkhd = function (i) { + var e = i.id, s = i.duration * i.timescale, n = i.width, r = i.height, h = Math.floor(s / (P + 1)), a = Math.floor(s % (P + 1)); + return t.box(t.types.tkhd, new Uint8Array([ + 1, + 0, + 0, + 7, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 3, + e >> 24 & 255, + e >> 16 & 255, + e >> 8 & 255, + 255 & e, + 0, + 0, + 0, + 0, + h >> 24, + h >> 16 & 255, + h >> 8 & 255, + 255 & h, + a >> 24, + a >> 16 & 255, + a >> 8 & 255, + 255 & a, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 64, + 0, + 0, + 0, + n >> 8 & 255, + 255 & n, + 0, + 0, + r >> 8 & 255, + 255 & r, + 0, + 0 + ])); + }, t.traf = function (i, e) { + var s = t.sdtp(i), n = i.id, r = Math.floor(e / (P + 1)), h = Math.floor(e % (P + 1)); + return t.box(t.types.traf, t.box(t.types.tfhd, new Uint8Array([ + 0, + 0, + 0, + 0, + n >> 24, + n >> 16 & 255, + n >> 8 & 255, + 255 & n + ])), t.box(t.types.tfdt, new Uint8Array([ + 1, + 0, + 0, + 0, + r >> 24, + r >> 16 & 255, + r >> 8 & 255, + 255 & r, + h >> 24, + h >> 16 & 255, + h >> 8 & 255, + 255 & h + ])), t.trun(i, s.length + 16 + 20 + 8 + 16 + 8 + 8), s); + }, t.trak = function (i) { + return i.duration = i.duration || 4294967295, t.box(t.types.trak, t.tkhd(i), t.mdia(i)); + }, t.trex = function (i) { + var e = i.id; + return t.box(t.types.trex, new Uint8Array([ + 0, + 0, + 0, + 0, + e >> 24, + e >> 16 & 255, + e >> 8 & 255, + 255 & e, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1 + ])); + }, t.trun = function (i, e) { + var s, n, r, h, a, o, c = i.samples || [], u = c.length, l = 12 + 16 * u, d = new Uint8Array(l); + for (e += 8 + l, d.set([ + 0, + 0, + 15, + 1, + u >>> 24 & 255, + u >>> 16 & 255, + u >>> 8 & 255, + 255 & u, + e >>> 24 & 255, + e >>> 16 & 255, + e >>> 8 & 255, + 255 & e + ], 0), s = 0; s < u; s++) + r = (n = c[s]).duration, h = n.size, a = n.flags, o = n.cts, d.set([ + r >>> 24 & 255, + r >>> 16 & 255, + r >>> 8 & 255, + 255 & r, + h >>> 24 & 255, + h >>> 16 & 255, + h >>> 8 & 255, + 255 & h, + a.isLeading << 2 | a.dependsOn, + a.isDependedOn << 6 | a.hasRedundancy << 4 | a.paddingValue << 1 | a.isNonSync, + 61440 & a.degradPrio, + 15 & a.degradPrio, + o >>> 24 & 255, + o >>> 16 & 255, + o >>> 8 & 255, + 255 & o + ], 12 + 16 * s); + return t.box(t.types.trun, d); + }, t.initSegment = function (i) { + t.types || t.init(); + var e, s = t.moov(i); + return (e = new Uint8Array(t.FTYP.byteLength + s.byteLength)).set(t.FTYP), e.set(s, t.FTYP.byteLength), e; + }, t; + }(); + function E(t, i, e, s) { + void 0 === e && (e = 1), void 0 === s && (s = !1); + var n = t * i * e; + return s ? Math.round(n) : n; + } + function L(t, i) { + return void 0 === i && (i = !1), E(t, 1000, 1 / 90000, i); + } + function R(t, i) { + return void 0 === i && (i = 1), E(t, 90000, 1 / i); + } + var B, D = R(10), F = R(0.2), V = function () { + function t(t, i, e, s) { + this.observer = t, this.config = i, this.typeSupported = e; + var n = navigator.userAgent; + this.isSafari = s && s.indexOf('Apple') > -1 && n && !n.match('CriOS'), this.ISGenerated = !1; + } + var i = t.prototype; + return i.destroy = function () { + }, i.resetTimeStamp = function (t) { + this.jt = this.kt = t; + }, i.resetInitSegment = function () { + this.ISGenerated = !1; + }, i.remux = function (t, i, e, n, r, h, a) { + if (this.ISGenerated || this.generateIS(t, i, r), this.ISGenerated) { + var c = t.samples.length, u = i.samples.length, l = r, d = r; + if (c && u) { + var f = (t.samples[0].pts - i.samples[0].pts) / i.inputTimeScale; + l += Math.max(0, f), d += Math.max(0, -f); + } + if (c) { + t.timescale || (o.b.warn('regenerate InitSegment as audio detected'), this.generateIS(t, i, r)); + var p, b = this.remuxAudio(t, l, h, a); + u && (b && (p = b.endPTS - b.startPTS), i.timescale || (o.b.warn('regenerate InitSegment as video detected'), this.generateIS(t, i, r)), this.remuxVideo(i, d, h, p, a)); + } else if (u) { + var v = this.remuxVideo(i, d, h, 0, a); + v && t.codec && this.remuxEmptyAudio(t, l, h, v); + } + } + e.samples.length && this.remuxID3(e, r), n.samples.length && this.remuxText(n, r), this.observer.trigger(s.a.FRAG_PARSED); + }, i.generateIS = function (t, i, e) { + var r, h, a = this.observer, c = t.samples, u = i.samples, l = this.typeSupported, d = 'audio/mp4', f = {}, p = { tracks: f }, b = void 0 === this.jt; + if (b && (r = h = 1 / 0), t.config && c.length && (t.timescale = t.samplerate, o.b.log('audio sampling rate : ' + t.samplerate), t.isAAC || (l.mpeg ? (d = 'audio/mpeg', t.codec = '') : l.mp3 && (t.codec = 'mp3')), f.audio = { + container: d, + codec: t.codec, + initSegment: !t.isAAC && l.mpeg ? new Uint8Array() : M.initSegment([t]), + metadata: { channelCount: t.channelCount } + }, b && (r = h = c[0].pts - t.inputTimeScale * e)), i.sps && i.pps && u.length) { + var v = i.inputTimeScale; + i.timescale = v, f.video = { + container: 'video/mp4', + codec: i.codec, + initSegment: M.initSegment([i]), + metadata: { + width: i.width, + height: i.height + } + }, b && (r = Math.min(r, u[0].pts - v * e), h = Math.min(h, u[0].dts - v * e), this.observer.trigger(s.a.INIT_PTS_FOUND, { initPTS: r })); + } + Object.keys(f).length ? (a.trigger(s.a.FRAG_PARSING_INIT_SEGMENT, p), this.ISGenerated = !0, b && (this.jt = r, this.kt = h)) : a.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_PARSING_ERROR, + fatal: !1, + reason: 'no audio/video samples found' + }); + }, i.remuxVideo = function (t, i, e, r, h) { + var a, c, u, l, d, f, p, b = 8, v = t.timescale, m = t.samples, g = [], y = m.length, w = this.Ct, O = this.jt, x = this.nextAvcDts, S = this.isSafari; + if (0 !== y) { + S && (e |= m.length && x && (h && Math.abs(i - x / v) < 0.1 || Math.abs(m[0].pts - x - O) < v / 5)), e || (x = i * v), m.forEach(function (t) { + t.pts = w(t.pts - O, x), t.dts = w(t.dts - O, x); + }), m.sort(function (t, i) { + var e = t.dts - i.dts, s = t.pts - i.pts; + return e || s || t.id - i.id; + }); + var j = m.reduce(function (t, i) { + return Math.max(Math.min(t, i.pts - i.dts), -1 * F); + }, 0); + if (j < 0) { + o.b.warn('PTS < DTS detected in video samples, shifting DTS by ' + L(j, !0) + ' ms to overcome this issue'); + for (var k = 0; k < m.length; k++) + m[k].dts += j; + } + var _ = m[0]; + d = Math.max(_.dts, 0), l = Math.max(_.pts, 0); + var A = d - x; + e && A && (A > 1 ? o.b.log('AVC: ' + L(A, !0) + ' ms hole between fragments detected,filling it') : A < -1 && o.b.log('AVC: ' + L(-A, !0) + ' ms overlapping between fragments detected'), d = x, m[0].dts = d, l = Math.max(l - A, x), m[0].pts = l, o.b.log('Video: PTS/DTS adjusted: ' + L(l, !0) + '/' + L(d, !0) + ', delta: ' + L(A, !0) + ' ms')), _ = m[m.length - 1], p = Math.max(_.dts, 0), f = Math.max(_.pts, 0, p), S && (a = Math.round((p - d) / (m.length - 1))); + for (var I = 0, C = 0, T = 0; T < y; T++) { + for (var P = m[T], E = P.units, R = E.length, B = 0, D = 0; D < R; D++) + B += E[D].data.length; + C += B, I += R, P.length = B, P.dts = S ? d + T * a : Math.max(P.dts, d), P.pts = Math.max(P.pts, P.dts); + } + var V = C + 4 * I + 8; + try { + c = new Uint8Array(V); + } catch (t) { + return void this.observer.trigger(s.a.ERROR, { + type: n.b.MUX_ERROR, + details: n.a.REMUX_ALLOC_ERROR, + fatal: !1, + bytes: V, + reason: 'fail allocating video mdat ' + V + }); + } + var U = new DataView(c.buffer); + U.setUint32(0, V), c.set(M.types.mdat, 4); + for (var $ = 0; $ < y; $++) { + for (var N = m[$], H = N.units, q = 0, z = void 0, W = 0, G = H.length; W < G; W++) { + var J = H[W], Q = J.data, X = J.data.byteLength; + U.setUint32(b, X), b += 4, c.set(Q, b), b += X, q += 4 + X; + } + if (S) + z = Math.max(0, a * Math.round((N.pts - N.dts) / a)); + else { + if ($ < y - 1) + a = m[$ + 1].dts - N.dts; + else { + var Y = this.config, K = N.dts - m[$ > 0 ? $ - 1 : $].dts; + if (Y.stretchShortVideoTrack) { + var Z = Y.maxBufferHole, tt = Math.floor(Z * v), it = (r ? l + r * v : this.nextAudioPts) - N.pts; + it > tt ? ((a = it - K) < 0 && (a = K), o.b.log('It is approximately ' + L(it, !1) + ' ms to the next segment; using duration ' + L(a, !1) + ' ms for the last video frame.')) : a = K; + } else + a = K; + } + z = Math.round(N.pts - N.dts); + } + g.push({ + size: q, + duration: a, + cts: z, + flags: { + isLeading: 0, + isDependedOn: 0, + hasRedundancy: 0, + degradPrio: 0, + dependsOn: N.key ? 2 : 1, + isNonSync: N.key ? 0 : 1 + } + }); + } + this.nextAvcDts = p + a; + var et = t.dropped; + if (t.nbNalu = 0, t.dropped = 0, g.length && navigator.userAgent.toLowerCase().indexOf('chrome') > -1) { + var st = g[0].flags; + st.dependsOn = 2, st.isNonSync = 0; + } + t.samples = g, u = M.moof(t.sequenceNumber++, d, t), t.samples = []; + var nt = { + data1: u, + data2: c, + startPTS: l / v, + endPTS: (f + a) / v, + startDTS: d / v, + endDTS: this.nextAvcDts / v, + type: 'video', + hasAudio: !1, + hasVideo: !0, + nb: g.length, + dropped: et + }; + return this.observer.trigger(s.a.FRAG_PARSING_DATA, nt), nt; + } + }, i.remuxAudio = function (t, i, e, r) { + var h, a, c, u, l, d, f = t.inputTimeScale, p = t.timescale, b = f / p, v = (t.isAAC ? 1024 : 1152) * b, m = this.Ct, g = this.jt, y = !t.isAAC && this.typeSupported.mpeg, w = y ? 0 : 8, O = t.samples, x = [], S = this.nextAudioPts; + if (e |= O.length && S && (r && Math.abs(i - S / f) < 0.1 || Math.abs(O[0].pts - S - g) < 20 * v), O.forEach(function (t) { + t.pts = t.dts = m(t.pts - g, i * f); + }), 0 !== (O = O.filter(function (t) { + return t.pts >= 0; + })).length) { + if (e || (S = r ? i * f : O[0].pts), t.isAAC) + for (var j = this.config.maxAudioFramesDrift, k = 0, _ = S; k < O.length;) { + var A, I = O[k]; + if ((A = I.pts - _) <= -j * v) + o.b.warn('Dropping 1 audio frame @ ' + L(_, !0) + ' ms due to ' + L(A, !0) + ' ms overlap.'), O.splice(k, 1); + else if (A >= j * v && A < D && _) { + var C = Math.round(A / v); + o.b.warn('Injecting ' + C + ' audio frames @ ' + L(_, !0) + ' ms due to ' + L(_, !0) + ' ms gap.'); + for (var P = 0; P < C; P++) { + var E = Math.max(_, 0); + (a = T.getSilentFrame(t.manifestCodec || t.codec, t.channelCount)) || (o.b.log('Unable to get silent frame for given audio codec; duplicating last frame instead.'), a = I.unit.subarray()), O.splice(k, 0, { + unit: a, + pts: E, + dts: E + }), _ += v, k++; + } + I.pts = I.dts = _, _ += v, k++; + } else + Math.abs(A), I.pts = I.dts = _, _ += v, k++; + } + for (var R = O.length, B = 0; R--;) + B += O[R].unit.byteLength; + for (var F = 0, V = O.length; F < V; F++) { + var U = O[F], $ = U.unit, N = U.pts; + if (void 0 !== d) + h.duration = Math.round((N - d) / b); + else { + var H = N - S, q = 0; + if (e && t.isAAC && H) { + if (H > 0 && H < D) + q = Math.round((N - S) / v), o.b.log(L(H, !0) + ' ms hole between AAC samples detected,filling it'), q > 0 && ((a = T.getSilentFrame(t.manifestCodec || t.codec, t.channelCount)) || (a = $.subarray()), B += q * a.length); + else if (H < -12) { + o.b.log('drop overlapping AAC sample, expected/parsed/delta: ' + L(S, !0) + ' ms / ' + L(N, !0) + ' ms / ' + L(-H, !0) + ' ms'), B -= $.byteLength; + continue; + } + N = S; + } + if (l = N, !(B > 0)) + return; + B += w; + try { + c = new Uint8Array(B); + } catch (t) { + return void this.observer.trigger(s.a.ERROR, { + type: n.b.MUX_ERROR, + details: n.a.REMUX_ALLOC_ERROR, + fatal: !1, + bytes: B, + reason: 'fail allocating audio mdat ' + B + }); + } + y || (new DataView(c.buffer).setUint32(0, B), c.set(M.types.mdat, 4)); + for (var z = 0; z < q; z++) + (a = T.getSilentFrame(t.manifestCodec || t.codec, t.channelCount)) || (o.b.log('Unable to get silent frame for given audio codec; duplicating this frame instead.'), a = $.subarray()), c.set(a, w), w += a.byteLength, h = { + size: a.byteLength, + cts: 0, + duration: 1024, + flags: { + isLeading: 0, + isDependedOn: 0, + hasRedundancy: 0, + degradPrio: 0, + dependsOn: 1 + } + }, x.push(h); + } + c.set($, w); + var W = $.byteLength; + w += W, h = { + size: W, + cts: 0, + duration: 0, + flags: { + isLeading: 0, + isDependedOn: 0, + hasRedundancy: 0, + degradPrio: 0, + dependsOn: 1 + } + }, x.push(h), d = N; + } + var G = 0; + if ((R = x.length) >= 2 && (G = x[R - 2].duration, h.duration = G), R) { + this.nextAudioPts = S = d + b * G, t.samples = x, u = y ? new Uint8Array() : M.moof(t.sequenceNumber++, l / b, t), t.samples = []; + var J = l / f, Q = S / f, X = { + data1: u, + data2: c, + startPTS: J, + endPTS: Q, + startDTS: J, + endDTS: Q, + type: 'audio', + hasAudio: !0, + hasVideo: !1, + nb: R + }; + return this.observer.trigger(s.a.FRAG_PARSING_DATA, X), X; + } + return null; + } + }, i.remuxEmptyAudio = function (t, i, e, s) { + var n = t.inputTimeScale, r = n / (t.samplerate ? t.samplerate : n), h = this.nextAudioPts, a = (void 0 !== h ? h : s.startDTS * n) + this.kt, c = s.endDTS * n + this.kt, u = 1024 * r, l = Math.ceil((c - a) / u), d = T.getSilentFrame(t.manifestCodec || t.codec, t.channelCount); + if (o.b.warn('remux empty Audio'), d) { + for (var f = [], p = 0; p < l; p++) { + var b = a + p * u; + f.push({ + unit: d, + pts: b, + dts: b + }); + } + t.samples = f, this.remuxAudio(t, i, e); + } else + o.b.trace('Unable to remuxEmptyAudio since we were unable to get a silent frame for given audio codec!'); + }, i.remuxID3 = function (t) { + var i, e = t.samples.length, n = t.inputTimeScale, r = this.jt, h = this.kt; + if (e) { + for (var a = 0; a < e; a++) + (i = t.samples[a]).pts = (i.pts - r) / n, i.dts = (i.dts - h) / n; + this.observer.trigger(s.a.FRAG_PARSING_METADATA, { samples: t.samples }); + } + t.samples = []; + }, i.remuxText = function (t) { + t.samples.sort(function (t, i) { + return t.pts - i.pts; + }); + var i, e = t.samples.length, n = t.inputTimeScale, r = this.jt; + if (e) { + for (var h = 0; h < e; h++) + (i = t.samples[h]).pts = (i.pts - r) / n; + this.observer.trigger(s.a.FRAG_PARSING_USERDATA, { samples: t.samples }); + } + t.samples = []; + }, i.Ct = function (t, i) { + var e; + if (void 0 === i) + return t; + for (e = i < t ? -8589934592 : 8589934592; Math.abs(t - i) > 4294967296;) + t += e; + return t; + }, t; + }(), U = function () { + function t(t) { + this.observer = t; + } + var i = t.prototype; + return i.destroy = function () { + }, i.resetTimeStamp = function () { + }, i.resetInitSegment = function () { + }, i.remux = function (t, i, e, n, r, h, a, o) { + var c = this.observer, u = ''; + t && (u += 'audio'), i && (u += 'video'), c.trigger(s.a.FRAG_PARSING_DATA, { + data1: o, + startPTS: r, + startDTS: r, + type: u, + hasAudio: !!t, + hasVideo: !!i, + nb: 1, + dropped: 0 + }), c.trigger(s.a.FRAG_PARSED); + }, t; + }(), $ = Object(c.a)(); + try { + B = $.performance.now.bind($.performance); + } catch (t) { + o.b.debug('Unable to use Performance API on this environment'), B = $.Date.now; + } + var N = function () { + function t(t, i, e, s) { + this.observer = t, this.typeSupported = i, this.config = e, this.vendor = s; + } + var i = t.prototype; + return i.destroy = function () { + var t = this.demuxer; + t && t.destroy(); + }, i.push = function (t, i, e, n, r, h, a, o, c, l, d, f) { + var p = this; + if (t.byteLength > 0 && null != i && null != i.key && 'AES-128' === i.method) { + var b = this.decrypter; + null == b && (b = this.decrypter = new u(this.observer, this.config)); + var v = B(); + b.decrypt(t, i.key.buffer, i.iv.buffer, function (t) { + var u = B(); + p.observer.trigger(s.a.FRAG_DECRYPTED, { + stats: { + tstart: v, + tdecrypt: u + } + }), p.pushDecrypted(new Uint8Array(t), i, new Uint8Array(e), n, r, h, a, o, c, l, d, f); + }); + } else + this.pushDecrypted(new Uint8Array(t), i, new Uint8Array(e), n, r, h, a, o, c, l, d, f); + }, i.pushDecrypted = function (t, i, e, r, h, a, o, c, u, l, d, f) { + var p = this.demuxer; + if (!p || (o || c) && !this.probe(t)) { + for (var b = this.observer, v = this.typeSupported, m = this.config, g = [ + { + demux: I, + remux: V + }, + { + demux: x.a, + remux: U + }, + { + demux: O, + remux: V + }, + { + demux: C, + remux: V + } + ], y = 0, w = g.length; y < w; y++) { + var S = g[y], j = S.demux.probe; + if (j(t)) { + var k = this.remuxer = new S.remux(b, m, v, this.vendor); + p = new S.demux(b, k, m, v), this.probe = j; + break; + } + } + if (!p) + return void b.trigger(s.a.ERROR, { + type: n.b.MEDIA_ERROR, + details: n.a.FRAG_PARSING_ERROR, + fatal: !0, + reason: 'no demux matching with content found' + }); + this.demuxer = p; + } + var _ = this.remuxer; + (o || c) && (p.resetInitSegment(e, r, h, l), _.resetInitSegment()), o && (p.resetTimeStamp(f), _.resetTimeStamp(f)), 'function' == typeof p.setDecryptData && p.setDecryptData(i), p.append(t, a, u, d); + }, t; + }(); + i.a = N; + }, + function (t, i, e) { + 'use strict'; + var s = e(0), n = e(1), r = Math.pow(2, 32) - 1, h = function () { + function t(t, i) { + this.observer = t, this.remuxer = i; + } + var i = t.prototype; + return i.resetTimeStamp = function (t) { + this.initPTS = t; + }, i.resetInitSegment = function (i, e, s, r) { + if (i && i.byteLength) { + var h = this.initData = t.parseInitSegment(i); + null == e && (e = 'mp4a.40.5'), null == s && (s = 'avc1.42e01e'); + var a = {}; + h.audio && h.video ? a.audiovideo = { + container: 'video/mp4', + codec: e + ',' + s, + initSegment: r ? i : null + } : (h.audio && (a.audio = { + container: 'audio/mp4', + codec: e, + initSegment: r ? i : null + }), h.video && (a.video = { + container: 'video/mp4', + codec: s, + initSegment: r ? i : null + })), this.observer.trigger(n.a.FRAG_PARSING_INIT_SEGMENT, { tracks: a }); + } else + e && (this.audioCodec = e), s && (this.videoCodec = s); + }, t.probe = function (i) { + return t.findBox({ + data: i, + start: 0, + end: Math.min(i.length, 16384) + }, ['moof']).length > 0; + }, t.bin2str = function (t) { + return String.fromCharCode.apply(null, t); + }, t.readUint16 = function (t, i) { + t.data && (i += t.start, t = t.data); + var e = t[i] << 8 | t[i + 1]; + return e < 0 ? 65536 + e : e; + }, t.readUint32 = function (t, i) { + t.data && (i += t.start, t = t.data); + var e = t[i] << 24 | t[i + 1] << 16 | t[i + 2] << 8 | t[i + 3]; + return e < 0 ? 4294967296 + e : e; + }, t.writeUint32 = function (t, i, e) { + t.data && (i += t.start, t = t.data), t[i] = e >> 24, t[i + 1] = e >> 16 & 255, t[i + 2] = e >> 8 & 255, t[i + 3] = 255 & e; + }, t.findBox = function (i, e) { + var s, n, r, h, a, o, c = []; + if (i.data ? (a = i.start, r = i.end, i = i.data) : (a = 0, r = i.byteLength), !e.length) + return null; + for (s = a; s < r;) + o = (n = t.readUint32(i, s)) > 1 ? s + n : r, t.bin2str(i.subarray(s + 4, s + 8)) === e[0] && (1 === e.length ? c.push({ + data: i, + start: s + 8, + end: o + }) : (h = t.findBox({ + data: i, + start: s + 8, + end: o + }, e.slice(1))).length && (c = c.concat(h))), s = o; + return c; + }, t.parseSegmentIndex = function (i) { + var e, s = t.findBox(i, ['moov'])[0], n = s ? s.end : null, r = 0, h = t.findBox(i, ['sidx']); + if (!h || !h[0]) + return null; + e = []; + var a = (h = h[0]).data[0]; + r = 0 === a ? 8 : 16; + var o = t.readUint32(h, r); + r += 4, r += 0 === a ? 8 : 16, r += 2; + var c = h.end + 0, u = t.readUint16(h, r); + r += 2; + for (var l = 0; l < u; l++) { + var d = r, f = t.readUint32(h, d); + d += 4; + var p = 2147483647 & f; + if (1 == (2147483648 & f) >>> 31) + return void console.warn('SIDX has hierarchical references (not supported)'); + var b = t.readUint32(h, d); + d += 4, e.push({ + referenceSize: p, + subsegmentDuration: b, + info: { + duration: b / o, + start: c, + end: c + p - 1 + } + }), c += p, r = d += 4; + } + return { + earliestPresentationTime: 0, + timescale: o, + version: a, + referencesCount: u, + references: e, + moovEndOffset: n + }; + }, t.parseInitSegment = function (i) { + var e = []; + return t.findBox(i, [ + 'moov', + 'trak' + ]).forEach(function (i) { + var n = t.findBox(i, ['tkhd'])[0]; + if (n) { + var r = n.data[n.start], h = 0 === r ? 12 : 20, a = t.readUint32(n, h), o = t.findBox(i, [ + 'mdia', + 'mdhd' + ])[0]; + if (o) { + h = 0 === (r = o.data[o.start]) ? 12 : 20; + var c = t.readUint32(o, h), u = t.findBox(i, [ + 'mdia', + 'hdlr' + ])[0]; + if (u) { + var l = { + soun: 'audio', + vide: 'video' + }[t.bin2str(u.data.subarray(u.start + 8, u.start + 12))]; + if (l) { + var d = t.findBox(i, [ + 'mdia', + 'minf', + 'stbl', + 'stsd' + ]); + if (d.length) { + d = d[0]; + var f = t.bin2str(d.data.subarray(d.start + 12, d.start + 16)); + s.b.log('MP4Demuxer:' + l + ':' + f + ' found'); + } + e[a] = { + timescale: c, + type: l + }, e[l] = { + timescale: c, + id: a + }; + } + } + } + } + }), e; + }, t.getStartDTS = function (i, e) { + var s, n, r; + return s = t.findBox(e, [ + 'moof', + 'traf' + ]), n = [].concat.apply([], s.map(function (e) { + return t.findBox(e, ['tfhd']).map(function (s) { + var n, r; + return n = t.readUint32(s, 4), r = i[n].timescale || 90000, t.findBox(e, ['tfdt']).map(function (i) { + var e, s; + return e = i.data[i.start], s = t.readUint32(i, 4), 1 === e && (s *= Math.pow(2, 32), s += t.readUint32(i, 8)), s; + })[0] / r; + }); + })), r = Math.min.apply(null, n), isFinite(r) ? r : 0; + }, t.offsetStartDTS = function (i, e, s) { + t.findBox(e, [ + 'moof', + 'traf' + ]).map(function (e) { + return t.findBox(e, ['tfhd']).map(function (n) { + var h = t.readUint32(n, 4), a = i[h].timescale || 90000; + t.findBox(e, ['tfdt']).map(function (i) { + var e = i.data[i.start], n = t.readUint32(i, 4); + if (0 === e) + t.writeUint32(i, 4, n - s * a); + else { + n *= Math.pow(2, 32), n += t.readUint32(i, 8), n -= s * a, n = Math.max(n, 0); + var h = Math.floor(n / (r + 1)), o = Math.floor(n % (r + 1)); + t.writeUint32(i, 4, h), t.writeUint32(i, 8, o); + } + }); + }); + }); + }, i.append = function (i, e, s, r) { + var h = this.initData; + h || (this.resetInitSegment(i, this.audioCodec, this.videoCodec, !1), h = this.initData); + var a, o = this.initPTS; + if (void 0 === o) { + var c = t.getStartDTS(h, i); + this.initPTS = o = c - e, this.observer.trigger(n.a.INIT_PTS_FOUND, { initPTS: o }); + } + t.offsetStartDTS(h, i, o), a = t.getStartDTS(h, i), this.remuxer.remux(h.audio, h.video, null, null, a, s, r, i); + }, i.destroy = function () { + }, t; + }(); + i.a = h; + }, + function (t, i, e) { + function s(t) { + var i = {}; + function e(s) { + if (i[s]) + return i[s].exports; + var n = i[s] = { + i: s, + l: !1, + exports: {} + }; + return t[s].call(n.exports, n, n.exports, e), n.l = !0, n.exports; + } + e.m = t, e.c = i, e.i = function (t) { + return t; + }, e.d = function (t, i, s) { + e.o(t, i) || Object.defineProperty(t, i, { + configurable: !1, + enumerable: !0, + get: s + }); + }, e.r = function (t) { + Object.defineProperty(t, '_', { value: !0 }); + }, e.n = function (t) { + var i = t && t._ ? function () { + return t.default; + } : function () { + return t; + }; + return e.d(i, 'a', i), i; + }, e.o = function (t, i) { + return Object.prototype.hasOwnProperty.call(t, i); + }, e.p = '/', e.oe = function (t) { + throw console.error(t), t; + }; + var s = e(e.s = ENTRY_MODULE); + return s.default || s; + } + var n = '\\(\\s*(/\\*.*?\\*/)?\\s*.*?([\\.|\\-|\\+|\\w|/|@]+).*?\\)'; + function r(t) { + return (t + '').replace(/[.?*+^$[\]\\(){}|-]/g, '\\$&'); + } + function h(t, i, s) { + var h = {}; + h[s] = []; + var a = i.toString(), o = a.match(/^function\s?\w*\(\w+,\s*\w+,\s*(\w+)\)/); + if (!o) + return h; + for (var c, u = o[1], l = new RegExp('(\\\\n|\\W)' + r(u) + n, 'g'); c = l.exec(a);) + 'dll-reference' !== c[3] && h[s].push(c[3]); + for (l = new RegExp('\\(' + r(u) + '\\("(dll-reference\\s([\\.|\\-|\\+|\\w|/|@]+))"\\)\\)' + n, 'g'); c = l.exec(a);) + t[c[2]] || (h[s].push(c[1]), t[c[2]] = e(c[1]).m), h[c[2]] = h[c[2]] || [], h[c[2]].push(c[4]); + for (var d, f = Object.keys(h), p = 0; p < f.length; p++) + for (var b = 0; b < h[f[p]].length; b++) + d = h[f[p]][b], isNaN(1 * d) || (h[f[p]][b] = 1 * h[f[p]][b]); + return h; + } + function a(t) { + return Object.keys(t).reduce(function (i, e) { + return i || t[e].length > 0; + }, !1); + } + t.exports = function (t, i) { + i = i || {}; + var n = { main: e.m }, r = i.all ? { main: Object.keys(n.main) } : function (t, i) { + for (var e = { main: [i] }, s = { main: [] }, n = { main: {} }; a(e);) + for (var r = Object.keys(e), o = 0; o < r.length; o++) { + var c = r[o], u = e[c].pop(); + if (n[c] = n[c] || {}, !n[c][u] && t[c][u]) { + n[c][u] = !0, s[c] = s[c] || [], s[c].push(u); + for (var l = h(t, t[c][u], c), d = Object.keys(l), f = 0; f < d.length; f++) + e[d[f]] = e[d[f]] || [], e[d[f]] = e[d[f]].concat(l[d[f]]); + } + } + return s; + }(n, t), o = ''; + Object.keys(r).filter(function (t) { + return 'main' !== t; + }).forEach(function (t) { + for (var i = 0; r[t][i];) + i++; + r[t].push(i), n[t][i] = '(function(module, exports, __webpack_require__) { module.exports = __webpack_require__; })', o = o + 'var ' + t + ' = (' + s.toString().replace('ENTRY_MODULE', JSON.stringify(i)) + ')({' + r[t].map(function (i) { + return JSON.stringify(i) + ': ' + n[t][i].toString(); + }).join(',') + '});\n'; + }), o = o + 'new ((' + s.toString().replace('ENTRY_MODULE', JSON.stringify(t)) + ')({' + r.main.map(function (t) { + return JSON.stringify(t) + ': ' + n.main[t].toString(); + }).join(',') + '}))(self);'; + var c = new window.Blob([o], { type: 'text/javascript' }); + if (i.bare) + return c; + var u = (window.URL || window.webkitURL || window.mozURL || window.msURL).createObjectURL(c), l = new window.Worker(u); + return l.objectURL = u, l; + }; + }, + function (t, i, e) { + 'use strict'; + e.r(i); + var s = e(9), n = e(1), r = e(0), h = e(8); + i.default = function (t) { + var i = new h.EventEmitter(); + i.trigger = function (t) { + for (var e = arguments.length, s = new Array(e > 1 ? e - 1 : 0), n = 1; n < e; n++) + s[n - 1] = arguments[n]; + i.emit.apply(i, [ + t, + t + ].concat(s)); + }, i.off = function (t) { + for (var e = arguments.length, s = new Array(e > 1 ? e - 1 : 0), n = 1; n < e; n++) + s[n - 1] = arguments[n]; + i.removeListener.apply(i, [t].concat(s)); + }; + var e = function (i, e) { + t.postMessage({ + event: i, + data: e + }); + }; + t.addEventListener('message', function (n) { + var h = n.data; + switch (h.cmd) { + case 'init': + var a = JSON.parse(h.config); + t.demuxer = new s.a(i, h.typeSupported, a, h.vendor), Object(r.a)(a.debug), e('init', null); + break; + case 'demux': + t.demuxer.push(h.data, h.decryptdata, h.initSegment, h.audioCodec, h.videoCodec, h.timeOffset, h.discontinuity, h.trackSwitch, h.contiguous, h.duration, h.accurateTimeOffset, h.defaultInitPTS); + } + }), i.on(n.a.FRAG_DECRYPTED, e), i.on(n.a.FRAG_PARSING_INIT_SEGMENT, e), i.on(n.a.FRAG_PARSED, e), i.on(n.a.ERROR, e), i.on(n.a.FRAG_PARSING_METADATA, e), i.on(n.a.FRAG_PARSING_USERDATA, e), i.on(n.a.INIT_PTS_FOUND, e), i.on(n.a.FRAG_PARSING_DATA, function (i, e) { + var s = [], n = { + event: i, + data: e + }; + e.data1 && (n.data1 = e.data1.buffer, s.push(e.data1.buffer), delete e.data1), e.data2 && (n.data2 = e.data2.buffer, s.push(e.data2.buffer), delete e.data2), t.postMessage(n, s); + }); + }; + }, + function (t, i, e) { + const $___old_f7a60a143d7416d2 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_f7a60a143d7416d2) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_81ba332f770640cb.XMLHttpRequest)); + return function () { + 'use strict'; + e.r(i); + var s, n, r = e(7), h = e(2), a = e(3), o = e(1), c = e(0), u = { + hlsEventGeneric: !0, + hlsHandlerDestroying: !0, + hlsHandlerDestroyed: !0 + }, l = function () { + function t(t) { + this.hls = void 0, this.handledEvents = void 0, this.useGenericHandler = void 0, this.hls = t, this.onEvent = this.onEvent.bind(this); + for (var i = arguments.length, e = new Array(i > 1 ? i - 1 : 0), s = 1; s < i; s++) + e[s - 1] = arguments[s]; + this.handledEvents = e, this.useGenericHandler = !0, this.registerListeners(); + } + var i = t.prototype; + return i.destroy = function () { + this.onHandlerDestroying(), this.unregisterListeners(), this.onHandlerDestroyed(); + }, i.onHandlerDestroying = function () { + }, i.onHandlerDestroyed = function () { + }, i.isEventHandler = function () { + return 'object' == typeof this.handledEvents && this.handledEvents.length && 'function' == typeof this.onEvent; + }, i.registerListeners = function () { + this.isEventHandler() && this.handledEvents.forEach(function (t) { + if (u[t]) + throw new Error('Forbidden event-name: ' + t); + this.hls.on(t, this.onEvent); + }, this); + }, i.unregisterListeners = function () { + this.isEventHandler() && this.handledEvents.forEach(function (t) { + this.hls.off(t, this.onEvent); + }, this); + }, i.onEvent = function (t, i) { + this.onEventGeneric(t, i); + }, i.onEventGeneric = function (t, i) { + try { + (function (t, i) { + var e = 'on' + t.replace('hls', ''); + if ('function' != typeof this[e]) + throw new Error('Event ' + t + ' has no generic handler in this ' + this.constructor.name + ' class (tried ' + e + ')'); + return this[e].bind(this, i); + }.call(this, t, i).call()); + } catch (i) { + c.b.error('An internal error happened while handling event ' + t + '. Error message: "' + i.message + '". Here is a stacktrace:', i), this.hls.trigger(o.a.ERROR, { + type: h.b.OTHER_ERROR, + details: h.a.INTERNAL_EXCEPTION, + fatal: !1, + event: t, + err: i + }); + } + }, t; + }(); + !function (t) { + t.MANIFEST = 'manifest', t.LEVEL = 'level', t.AUDIO_TRACK = 'audioTrack', t.SUBTITLE_TRACK = 'subtitleTrack'; + }(s || (s = {})), function (t) { + t.MAIN = 'main', t.AUDIO = 'audio', t.SUBTITLE = 'subtitle'; + }(n || (n = {})); + var d = e(10); + function f(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + var p, b = function () { + function t(t, i) { + this.Tt = null, this.baseuri = void 0, this.reluri = void 0, this.method = null, this.key = null, this.iv = null, this.baseuri = t, this.reluri = i; + } + var i, e; + return i = t, (e = [{ + key: 'uri', + get: function () { + return !this.Tt && this.reluri && (this.Tt = Object(r.buildAbsoluteURL)(this.baseuri, this.reluri, { alwaysNormalize: !0 })), this.Tt; + } + }]) && f(i.prototype, e), t; + }(); + function v(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + !function (t) { + t.AUDIO = 'audio', t.VIDEO = 'video'; + }(p || (p = {})); + var m = function () { + function t() { + var t; + this.Pt = null, this.Mt = null, this.Et = null, this.Lt = ((t = {})[p.AUDIO] = !1, t[p.VIDEO] = !1, t), this.deltaPTS = 0, this.rawProgramDateTime = null, this.programDateTime = null, this.title = null, this.tagList = [], this.cc = void 0, this.type = void 0, this.relurl = void 0, this.baseurl = void 0, this.duration = void 0, this.start = void 0, this.sn = 0, this.urlId = 0, this.level = 0, this.levelkey = void 0, this.loader = void 0; + } + var i, e, s = t.prototype; + return s.setByteRange = function (t, i) { + var e = t.split('@', 2), s = []; + 1 === e.length ? s[0] = i ? i.byteRangeEndOffset : 0 : s[0] = parseInt(e[1]), s[1] = parseInt(e[0]) + s[0], this.Mt = s; + }, s.addElementaryStream = function (t) { + this.Lt[t] = !0; + }, s.hasElementaryStream = function (t) { + return !0 === this.Lt[t]; + }, s.createInitializationVector = function (t) { + for (var i = new Uint8Array(16), e = 12; e < 16; e++) + i[e] = t >> 8 * (15 - e) & 255; + return i; + }, s.setDecryptDataFromLevelKey = function (t, i) { + var e = t; + return t && t.method && t.uri && !t.iv && ((e = new b(t.baseuri, t.reluri)).method = t.method, e.iv = this.createInitializationVector(i)), e; + }, i = t, (e = [ + { + key: 'url', + get: function () { + return !this.Pt && this.relurl && (this.Pt = Object(r.buildAbsoluteURL)(this.baseurl, this.relurl, { alwaysNormalize: !0 })), this.Pt; + }, + set: function (t) { + this.Pt = t; + } + }, + { + key: 'byteRange', + get: function () { + return this.Mt ? this.Mt : []; + } + }, + { + key: 'byteRangeStartOffset', + get: function () { + return this.byteRange[0]; + } + }, + { + key: 'byteRangeEndOffset', + get: function () { + return this.byteRange[1]; + } + }, + { + key: 'decryptdata', + get: function () { + if (!this.levelkey && !this.Et) + return null; + if (!this.Et && this.levelkey) { + var t = this.sn; + 'number' != typeof t && (this.levelkey && 'AES-128' === this.levelkey.method && !this.levelkey.iv && c.b.warn('missing IV for initialization segment with method="' + this.levelkey.method + '" - compliance issue'), t = 0), this.Et = this.setDecryptDataFromLevelKey(this.levelkey, t); + } + return this.Et; + } + }, + { + key: 'endProgramDateTime', + get: function () { + if (null === this.programDateTime) + return null; + if (!Object(a.a)(this.programDateTime)) + return null; + var t = Object(a.a)(this.duration) ? this.duration : 0; + return this.programDateTime + 1000 * t; + } + }, + { + key: 'encrypted', + get: function () { + return !(!this.decryptdata || null === this.decryptdata.uri || null !== this.decryptdata.key); + } + } + ]) && v(i.prototype, e), t; + }(); + function g(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + var y = function () { + function t(t) { + this.endCC = 0, this.endSN = 0, this.fragments = [], this.initSegment = null, this.live = !0, this.needSidxRanges = !1, this.startCC = 0, this.startSN = 0, this.startTimeOffset = null, this.targetduration = 0, this.totalduration = 0, this.type = null, this.url = t, this.version = null; + } + var i, e; + return i = t, (e = [{ + key: 'hasProgramDateTime', + get: function () { + return !(!this.fragments[0] || !Object(a.a)(this.fragments[0].programDateTime)); + } + }]) && g(i.prototype, e), t; + }(), w = /^(\d+)x(\d+)$/, O = /\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g, x = function () { + function t(i) { + for (var e in ('string' == typeof i && (i = t.parseAttrList(i)), i)) + i.hasOwnProperty(e) && (this[e] = i[e]); + } + var i = t.prototype; + return i.decimalInteger = function (t) { + var i = parseInt(this[t], 10); + return i > Number.MAX_SAFE_INTEGER ? 1 / 0 : i; + }, i.hexadecimalInteger = function (t) { + if (this[t]) { + var i = (this[t] || '0x').slice(2); + i = (1 & i.length ? '0' : '') + i; + for (var e = new Uint8Array(i.length / 2), s = 0; s < i.length / 2; s++) + e[s] = parseInt(i.slice(2 * s, 2 * s + 2), 16); + return e; + } + return null; + }, i.hexadecimalIntegerAsNumber = function (t) { + var i = parseInt(this[t], 16); + return i > Number.MAX_SAFE_INTEGER ? 1 / 0 : i; + }, i.decimalFloatingPoint = function (t) { + return parseFloat(this[t]); + }, i.enumeratedString = function (t) { + return this[t]; + }, i.decimalResolution = function (t) { + var i = w.exec(this[t]); + if (null !== i) + return { + width: parseInt(i[1], 10), + height: parseInt(i[2], 10) + }; + }, t.parseAttrList = function (t) { + var i, e = {}; + for (O.lastIndex = 0; null !== (i = O.exec(t));) { + var s = i[2]; + 0 === s.indexOf('"') && s.lastIndexOf('"') === s.length - 1 && (s = s.slice(1, -1)), e[i[1]] = s; + } + return e; + }, t; + }(), S = { + audio: { + a3ds: !0, + 'ac-3': !0, + 'ac-4': !0, + alac: !0, + alaw: !0, + dra1: !0, + 'dts+': !0, + 'dts-': !0, + dtsc: !0, + dtse: !0, + dtsh: !0, + 'ec-3': !0, + enca: !0, + g719: !0, + g726: !0, + m4ae: !0, + mha1: !0, + mha2: !0, + mhm1: !0, + mhm2: !0, + mlpa: !0, + mp4a: !0, + 'raw ': !0, + Opus: !0, + samr: !0, + sawb: !0, + sawp: !0, + sevc: !0, + sqcp: !0, + ssmv: !0, + twos: !0, + ulaw: !0 + }, + video: { + avc1: !0, + avc2: !0, + avc3: !0, + avc4: !0, + avcp: !0, + drac: !0, + dvav: !0, + dvhe: !0, + encv: !0, + hev1: !0, + hvc1: !0, + mjp2: !0, + mp4v: !0, + mvc1: !0, + mvc2: !0, + mvc3: !0, + mvc4: !0, + resv: !0, + rv60: !0, + s263: !0, + svc1: !0, + svc2: !0, + 'vc-1': !0, + vp08: !0, + vp09: !0 + } + }; + function j(t, i) { + return MediaSource.isTypeSupported((i || 'video') + '/mp4;codecs="' + t + '"'); + } + var k = /#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g, _ = /#EXT-X-MEDIA:(.*)/g, A = new RegExp([ + /#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source, + /|(?!#)([\S+ ?]+)/.source, + /|#EXT-X-BYTERANGE:*(.+)/.source, + /|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source, + /|#.*/.source + ].join(''), 'g'), I = /(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/, C = /\.(mp4|m4s|m4v|m4a)$/i, T = function () { + function t() { + } + return t.findGroup = function (t, i) { + for (var e = 0; e < t.length; e++) { + var s = t[e]; + if (s.id === i) + return s; + } + }, t.convertAVC1ToAVCOTI = function (t) { + var i, e = t.split('.'); + return e.length > 2 ? (i = e.shift() + '.', i += parseInt(e.shift()).toString(16), i += ('000' + parseInt(e.shift()).toString(16)).substr(-4)) : i = t, i; + }, t.resolve = function (t, i) { + return r.buildAbsoluteURL(i, t, { alwaysNormalize: !0 }); + }, t.parseMasterPlaylist = function (i, e) { + var s, n = []; + function r(t, i) { + [ + 'video', + 'audio' + ].forEach(function (e) { + var s = t.filter(function (t) { + return function (t, i) { + var e = S[i]; + return !!e && !0 === e[t.slice(0, 4)]; + }(t, e); + }); + if (s.length) { + var n = s.filter(function (t) { + return 0 === t.lastIndexOf('avc1', 0) || 0 === t.lastIndexOf('mp4a', 0); + }); + i[e + 'Codec'] = n.length > 0 ? n[0] : s[0], t = t.filter(function (t) { + return -1 === s.indexOf(t); + }); + } + }), i.unknownCodecs = t; + } + for (k.lastIndex = 0; null != (s = k.exec(i));) { + var h = {}, a = h.attrs = new x(s[1]); + h.url = t.resolve(s[2], e); + var o = a.decimalResolution('RESOLUTION'); + o && (h.width = o.width, h.height = o.height), h.bitrate = a.decimalInteger('AVERAGE-BANDWIDTH') || a.decimalInteger('BANDWIDTH'), h.name = a.NAME, r([].concat((a.CODECS || '').split(/[ ,]+/)), h), h.videoCodec && -1 !== h.videoCodec.indexOf('avc1') && (h.videoCodec = t.convertAVC1ToAVCOTI(h.videoCodec)), n.push(h); + } + return n; + }, t.parseMasterPlaylistMedia = function (i, e, s, n) { + var r; + void 0 === n && (n = []); + var h = [], a = 0; + for (_.lastIndex = 0; null !== (r = _.exec(i));) { + var o = new x(r[1]); + if (o.TYPE === s) { + var c = { + id: a++, + groupId: o['GROUP-ID'], + name: o.NAME || o.LANGUAGE, + type: s, + default: 'YES' === o.DEFAULT, + autoselect: 'YES' === o.AUTOSELECT, + forced: 'YES' === o.FORCED, + lang: o.LANGUAGE + }; + if (o.URI && (c.url = t.resolve(o.URI, e)), n.length) { + var u = t.findGroup(n, c.groupId); + c.audioCodec = u ? u.codec : n[0].codec; + } + h.push(c); + } + } + return h; + }, t.parseLevelPlaylist = function (t, i, e, s, n) { + var r, h, o, u = 0, l = 0, d = new y(i), f = 0, p = null, v = new m(), g = null; + for (A.lastIndex = 0; null !== (r = A.exec(t));) { + var w = r[1]; + if (w) { + v.duration = parseFloat(w); + var O = (' ' + r[2]).slice(1); + v.title = O || null, v.tagList.push(O ? [ + 'INF', + w, + O + ] : [ + 'INF', + w + ]); + } else if (r[3]) { + if (Object(a.a)(v.duration)) { + var S = u++; + v.type = s, v.start = l, o && (v.levelkey = o), v.sn = S, v.level = e, v.cc = f, v.urlId = n, v.baseurl = i, v.relurl = (' ' + r[3]).slice(1), P(v, p), d.fragments.push(v), p = v, l += v.duration, v = new m(); + } + } else if (r[4]) { + var j = (' ' + r[4]).slice(1); + p ? v.setByteRange(j, p) : v.setByteRange(j); + } else if (r[5]) + v.rawProgramDateTime = (' ' + r[5]).slice(1), v.tagList.push([ + 'PROGRAM-DATE-TIME', + v.rawProgramDateTime + ]), null === g && (g = d.fragments.length); + else { + if (!(r = r[0].match(I))) { + c.b.warn('No matches on slow regex match for level playlist!'); + continue; + } + for (h = 1; h < r.length && void 0 === r[h]; h++); + var k = (' ' + r[h + 1]).slice(1), _ = (' ' + r[h + 2]).slice(1); + switch (r[h]) { + case '#': + v.tagList.push(_ ? [ + k, + _ + ] : [k]); + break; + case 'PLAYLIST-TYPE': + d.type = k.toUpperCase(); + break; + case 'MEDIA-SEQUENCE': + u = d.startSN = parseInt(k); + break; + case 'TARGETDURATION': + d.targetduration = parseFloat(k); + break; + case 'VERSION': + d.version = parseInt(k); + break; + case 'EXTM3U': + break; + case 'ENDLIST': + d.live = !1; + break; + case 'DIS': + f++, v.tagList.push(['DIS']); + break; + case 'DISCONTINUITY-SEQ': + f = parseInt(k); + break; + case 'KEY': + var T = new x(k), M = T.enumeratedString('METHOD'), E = T.URI, L = T.hexadecimalInteger('IV'); + M && (o = new b(i, E), E && [ + 'AES-128', + 'SAMPLE-AES', + 'SAMPLE-AES-CENC' + ].indexOf(M) >= 0 && (o.method = M, o.key = null, o.iv = L)); + break; + case 'START': + var R = new x(k).decimalFloatingPoint('TIME-OFFSET'); + Object(a.a)(R) && (d.startTimeOffset = R); + break; + case 'MAP': + var B = new x(k); + v.relurl = B.URI, B.BYTERANGE && v.setByteRange(B.BYTERANGE), v.baseurl = i, v.level = e, v.type = s, v.sn = 'initSegment', d.initSegment = v, (v = new m()).rawProgramDateTime = d.initSegment.rawProgramDateTime; + break; + default: + c.b.warn('line parsed but not handled: ' + r); + } + } + } + return (v = p) && !v.relurl && (d.fragments.pop(), l -= v.duration), d.totalduration = l, d.averagetargetduration = l / d.fragments.length, d.endSN = u - 1, d.startCC = d.fragments[0] ? d.fragments[0].cc : 0, d.endCC = f, !d.initSegment && d.fragments.length && d.fragments.every(function (t) { + return C.test(t.relurl); + }) && (c.b.warn('MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX'), (v = new m()).relurl = d.fragments[0].relurl, v.baseurl = i, v.level = e, v.type = s, v.sn = 'initSegment', d.initSegment = v, d.needSidxRanges = !0), g && function (t, i) { + for (var e = t[i], s = i - 1; s >= 0; s--) { + var n = t[s]; + n.programDateTime = e.programDateTime - 1000 * n.duration, e = n; + } + }(d.fragments, g), d; + }, t; + }(); + function P(t, i) { + t.rawProgramDateTime ? t.programDateTime = Date.parse(t.rawProgramDateTime) : i && i.programDateTime && (t.programDateTime = i.endProgramDateTime), Object(a.a)(t.programDateTime) || (t.programDateTime = null, t.rawProgramDateTime = null); + } + var M = window.performance, E = function (t) { + var i, e; + function r(i) { + var e; + return (e = t.call(this, i, o.a.MANIFEST_LOADING, o.a.LEVEL_LOADING, o.a.AUDIO_TRACK_LOADING, o.a.SUBTITLE_TRACK_LOADING) || this).loaders = {}, e; + } + e = t, (i = r).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e, r.canHaveQualityLevels = function (t) { + return t !== s.AUDIO_TRACK && t !== s.SUBTITLE_TRACK; + }, r.mapContextToLevelType = function (t) { + switch (t.type) { + case s.AUDIO_TRACK: + return n.AUDIO; + case s.SUBTITLE_TRACK: + return n.SUBTITLE; + default: + return n.MAIN; + } + }, r.getResponseUrl = function (t, i) { + var e = t.url; + return void 0 !== e && 0 !== e.indexOf('data:') || (e = i.url), e; + }; + var u = r.prototype; + return u.createInternalLoader = function (t) { + var i = this.hls.config, e = i.pLoader, s = i.loader, n = new (e || s)(i); + return t.loader = n, this.loaders[t.type] = n, n; + }, u.getInternalLoader = function (t) { + return this.loaders[t.type]; + }, u.resetInternalLoader = function (t) { + this.loaders[t] && delete this.loaders[t]; + }, u.destroyInternalLoaders = function () { + for (var t in this.loaders) { + var i = this.loaders[t]; + i && i.destroy(), this.resetInternalLoader(t); + } + }, u.destroy = function () { + this.destroyInternalLoaders(), t.prototype.destroy.call(this); + }, u.onManifestLoading = function (t) { + this.load({ + url: t.url, + type: s.MANIFEST, + level: 0, + id: null, + responseType: 'text' + }); + }, u.onLevelLoading = function (t) { + this.load({ + url: t.url, + type: s.LEVEL, + level: t.level, + id: t.id, + responseType: 'text' + }); + }, u.onAudioTrackLoading = function (t) { + this.load({ + url: t.url, + type: s.AUDIO_TRACK, + level: null, + id: t.id, + responseType: 'text' + }); + }, u.onSubtitleTrackLoading = function (t) { + this.load({ + url: t.url, + type: s.SUBTITLE_TRACK, + level: null, + id: t.id, + responseType: 'text' + }); + }, u.load = function (t) { + var i = this.hls.config; + c.b.debug('Loading playlist of type ' + t.type + ', level: ' + t.level + ', id: ' + t.id); + var e, n, r, h, a = this.getInternalLoader(t); + if (a) { + var o = a.context; + if (o && o.url === t.url) + return c.b.trace('playlist request ongoing'), !1; + c.b.warn('aborting previous loader for type: ' + t.type), a.abort(); + } + switch (t.type) { + case s.MANIFEST: + e = i.manifestLoadingMaxRetry, n = i.manifestLoadingTimeOut, r = i.manifestLoadingRetryDelay, h = i.manifestLoadingMaxRetryTimeout; + break; + case s.LEVEL: + e = 0, h = 0, r = 0, n = i.levelLoadingTimeOut; + break; + default: + e = i.levelLoadingMaxRetry, n = i.levelLoadingTimeOut, r = i.levelLoadingRetryDelay, h = i.levelLoadingMaxRetryTimeout; + } + a = this.createInternalLoader(t); + var u = { + timeout: n, + maxRetry: e, + retryDelay: r, + maxRetryDelay: h + }, l = { + onSuccess: this.loadsuccess.bind(this), + onError: this.loaderror.bind(this), + onTimeout: this.loadtimeout.bind(this) + }; + return c.b.debug('Calling internal loader delegate for URL: ' + t.url), a.load(t, u, l), !0; + }, u.loadsuccess = function (t, i, e, s) { + if (void 0 === s && (s = null), e.isSidxRequest) + return this.Rt(t, e), void this.Bt(t, i, e, s); + if (this.resetInternalLoader(e.type), 'string' != typeof t.data) + throw new Error('expected responseType of "text" for PlaylistLoader'); + var n = t.data; + i.tload = M.now(), 0 === n.indexOf('#EXTM3U') ? n.indexOf('#EXTINF:') > 0 || n.indexOf('#EXT-X-TARGETDURATION:') > 0 ? this.Dt(t, i, e, s) : this.Ft(t, i, e, s) : this.Vt(t, e, 'no EXTM3U delimiter', s); + }, u.loaderror = function (t, i, e) { + void 0 === e && (e = null), this.Ut(i, e, !1, t); + }, u.loadtimeout = function (t, i, e) { + void 0 === e && (e = null), this.Ut(i, e, !0); + }, u.Ft = function (t, i, e, s) { + var n = this.hls, h = t.data, a = r.getResponseUrl(t, e), u = T.parseMasterPlaylist(h, a); + if (u.length) { + var l = u.map(function (t) { + return { + id: t.attrs.AUDIO, + codec: t.audioCodec + }; + }), d = T.parseMasterPlaylistMedia(h, a, 'AUDIO', l), f = T.parseMasterPlaylistMedia(h, a, 'SUBTITLES'); + if (d.length) { + var p = !1; + d.forEach(function (t) { + t.url || (p = !0); + }), !1 === p && u[0].audioCodec && !u[0].attrs.AUDIO && (c.b.log('audio codec signaled in quality level, but no embedded audio track signaled, create one'), d.unshift({ + type: 'main', + name: 'main', + default: !1, + autoselect: !1, + forced: !1, + id: -1 + })); + } + n.trigger(o.a.MANIFEST_LOADED, { + levels: u, + audioTracks: d, + subtitles: f, + url: a, + stats: i, + networkDetails: s + }); + } else + this.Vt(t, e, 'no level found in manifest', s); + }, u.Dt = function (t, i, e, n) { + var h = this.hls, c = e.id, u = e.level, l = e.type, d = r.getResponseUrl(t, e), f = Object(a.a)(c) ? c : 0, p = Object(a.a)(u) ? u : f, b = r.mapContextToLevelType(e), v = T.parseLevelPlaylist(t.data, d, p, b, f); + if (v.tload = i.tload, l === s.MANIFEST) { + var m = { + url: d, + details: v + }; + h.trigger(o.a.MANIFEST_LOADED, { + levels: [m], + audioTracks: [], + url: d, + stats: i, + networkDetails: n + }); + } + if (i.tparsed = M.now(), v.needSidxRanges) { + var g = v.initSegment.url; + this.load({ + url: g, + isSidxRequest: !0, + type: l, + level: u, + levelDetails: v, + id: c, + rangeStart: 0, + rangeEnd: 2048, + responseType: 'arraybuffer' + }); + } else + e.levelDetails = v, this.Bt(t, i, e, n); + }, u.Rt = function (t, i) { + if ('string' == typeof t.data) + throw new Error('sidx request must be made with responseType of array buffer'); + var e = d.a.parseSegmentIndex(new Uint8Array(t.data)); + if (e) { + var s = e.references, n = i.levelDetails; + s.forEach(function (t, i) { + var e = t.info; + if (n) { + var s = n.fragments[i]; + 0 === s.byteRange.length && s.setByteRange(String(1 + e.end - e.start) + '@' + String(e.start)); + } + }), n && n.initSegment.setByteRange(String(e.moovEndOffset) + '@0'); + } + }, u.Vt = function (t, i, e, s) { + this.hls.trigger(o.a.ERROR, { + type: h.b.NETWORK_ERROR, + details: h.a.MANIFEST_PARSING_ERROR, + fatal: !0, + url: t.url, + reason: e, + networkDetails: s + }); + }, u.Ut = function (t, i, e, n) { + var r, a; + void 0 === e && (e = !1), void 0 === n && (n = null), c.b.info('A network error occured while loading a ' + t.type + '-type playlist'); + var u = this.getInternalLoader(t); + switch (t.type) { + case s.MANIFEST: + r = e ? h.a.MANIFEST_LOAD_TIMEOUT : h.a.MANIFEST_LOAD_ERROR, a = !0; + break; + case s.LEVEL: + r = e ? h.a.LEVEL_LOAD_TIMEOUT : h.a.LEVEL_LOAD_ERROR, a = !1; + break; + case s.AUDIO_TRACK: + r = e ? h.a.AUDIO_TRACK_LOAD_TIMEOUT : h.a.AUDIO_TRACK_LOAD_ERROR, a = !1; + break; + default: + a = !1; + } + u && (u.abort(), this.resetInternalLoader(t.type)); + var l = { + type: h.b.NETWORK_ERROR, + details: r, + fatal: a, + url: t.url, + loader: u, + context: t, + networkDetails: i + }; + n && (l.response = n), this.hls.trigger(o.a.ERROR, l); + }, u.Bt = function (t, i, e, n) { + var h = e.type, a = e.level, c = e.id, u = e.levelDetails; + if (u && u.targetduration) + if (r.canHaveQualityLevels(e.type)) + this.hls.trigger(o.a.LEVEL_LOADED, { + details: u, + level: a || 0, + id: c || 0, + stats: i, + networkDetails: n + }); + else + switch (h) { + case s.AUDIO_TRACK: + this.hls.trigger(o.a.AUDIO_TRACK_LOADED, { + details: u, + id: c, + stats: i, + networkDetails: n + }); + break; + case s.SUBTITLE_TRACK: + this.hls.trigger(o.a.SUBTITLE_TRACK_LOADED, { + details: u, + id: c, + stats: i, + networkDetails: n + }); + } + else + this.Vt(t, e, 'invalid target duration', n); + }, r; + }(l), L = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.FRAG_LOADING) || this).loaders = {}, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + var i = this.loaders; + for (var e in i) { + var s = i[e]; + s && s.destroy(); + } + this.loaders = {}, t.prototype.destroy.call(this); + }, n.onFragLoading = function (t) { + var i = t.frag, e = i.type, s = this.loaders, n = this.hls.config, r = n.fLoader, h = n.loader; + i.loaded = 0; + var o, u, l, d = s[e]; + d && (c.b.warn('abort previous fragment loader for type: ' + e), d.abort()), d = s[e] = i.loader = n.fLoader ? new r(n) : new h(n), o = { + url: i.url, + frag: i, + responseType: 'arraybuffer', + progressData: !1 + }; + var f = i.byteRangeStartOffset, p = i.byteRangeEndOffset; + Object(a.a)(f) && Object(a.a)(p) && (o.rangeStart = f, o.rangeEnd = p), u = { + timeout: n.fragLoadingTimeOut, + maxRetry: 0, + retryDelay: 0, + maxRetryDelay: n.fragLoadingMaxRetryTimeout + }, l = { + onSuccess: this.loadsuccess.bind(this), + onError: this.loaderror.bind(this), + onTimeout: this.loadtimeout.bind(this), + onProgress: this.loadprogress.bind(this) + }, d.load(o, u, l); + }, n.loadsuccess = function (t, i, e, s) { + void 0 === s && (s = null); + var n = t.data, r = e.frag; + r.loader = void 0, this.loaders[r.type] = void 0, this.hls.trigger(o.a.FRAG_LOADED, { + payload: n, + frag: r, + stats: i, + networkDetails: s + }); + }, n.loaderror = function (t, i, e) { + void 0 === e && (e = null); + var s = i.frag, n = s.loader; + n && n.abort(), this.loaders[s.type] = void 0, this.hls.trigger(o.a.ERROR, { + type: h.b.NETWORK_ERROR, + details: h.a.FRAG_LOAD_ERROR, + fatal: !1, + frag: i.frag, + response: t, + networkDetails: e + }); + }, n.loadtimeout = function (t, i, e) { + void 0 === e && (e = null); + var s = i.frag, n = s.loader; + n && n.abort(), this.loaders[s.type] = void 0, this.hls.trigger(o.a.ERROR, { + type: h.b.NETWORK_ERROR, + details: h.a.FRAG_LOAD_TIMEOUT, + fatal: !1, + frag: i.frag, + networkDetails: e + }); + }, n.loadprogress = function (t, i, e, s) { + void 0 === s && (s = null); + var n = i.frag; + n.loaded = t.loaded, this.hls.trigger(o.a.FRAG_LOAD_PROGRESS, { + frag: n, + stats: t, + networkDetails: s + }); + }, s; + }(l), R = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.KEY_LOADING) || this).loaders = {}, e.decryptkey = null, e.decrypturl = null, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + for (var i in this.loaders) { + var e = this.loaders[i]; + e && e.destroy(); + } + this.loaders = {}, t.prototype.destroy.call(this); + }, n.onKeyLoading = function (t) { + var i = t.frag, e = i.type, s = this.loaders[e]; + if (i.decryptdata) { + var n = i.decryptdata.uri; + if (n !== this.decrypturl || null === this.decryptkey) { + var r = this.hls.config; + if (s && (c.b.warn('abort previous key loader for type:' + e), s.abort()), !n) + return void c.b.warn('key uri is falsy'); + i.loader = this.loaders[e] = new r.loader(r), this.decrypturl = n, this.decryptkey = null; + var h = { + url: n, + frag: i, + responseType: 'arraybuffer' + }, a = { + timeout: r.fragLoadingTimeOut, + maxRetry: 0, + retryDelay: r.fragLoadingRetryDelay, + maxRetryDelay: r.fragLoadingMaxRetryTimeout + }, u = { + onSuccess: this.loadsuccess.bind(this), + onError: this.loaderror.bind(this), + onTimeout: this.loadtimeout.bind(this) + }; + i.loader.load(h, a, u); + } else + this.decryptkey && (i.decryptdata.key = this.decryptkey, this.hls.trigger(o.a.KEY_LOADED, { frag: i })); + } else + c.b.warn('Missing decryption data on fragment in onKeyLoading'); + }, n.loadsuccess = function (t, i, e) { + var s = e.frag; + s.decryptdata ? (this.decryptkey = s.decryptdata.key = new Uint8Array(t.data), s.loader = void 0, delete this.loaders[s.type], this.hls.trigger(o.a.KEY_LOADED, { frag: s })) : c.b.error('after key load, decryptdata unset'); + }, n.loaderror = function (t, i) { + var e = i.frag, s = e.loader; + s && s.abort(), delete this.loaders[e.type], this.hls.trigger(o.a.ERROR, { + type: h.b.NETWORK_ERROR, + details: h.a.KEY_LOAD_ERROR, + fatal: !1, + frag: e, + response: t + }); + }, n.loadtimeout = function (t, i) { + var e = i.frag, s = e.loader; + s && s.abort(), delete this.loaders[e.type], this.hls.trigger(o.a.ERROR, { + type: h.b.NETWORK_ERROR, + details: h.a.KEY_LOAD_TIMEOUT, + fatal: !1, + frag: e + }); + }, s; + }(l), B = 'NOT_LOADED', D = 'APPENDING', F = 'PARTIAL', V = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.BUFFER_APPENDED, o.a.FRAG_BUFFERED, o.a.FRAG_LOADED) || this).bufferPadding = 0.2, e.fragments = Object.create(null), e.timeRanges = Object.create(null), e.config = i.config, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + this.fragments = Object.create(null), this.timeRanges = Object.create(null), this.config = null, l.prototype.destroy.call(this), t.prototype.destroy.call(this); + }, n.getBufferedFrag = function (t, i) { + var e = this.fragments, s = Object.keys(e).filter(function (s) { + var n = e[s]; + if (n.body.type !== i) + return !1; + if (!n.buffered) + return !1; + var r = n.body; + return r.startPTS <= t && t <= r.endPTS; + }); + if (0 === s.length) + return null; + var n = s.pop(); + return e[n].body; + }, n.detectEvictedFragments = function (t, i) { + var e, s, n = this; + Object.keys(this.fragments).forEach(function (r) { + var h = n.fragments[r]; + if (!0 === h.buffered) { + var a = h.range[t]; + if (a) { + e = a.time; + for (var o = 0; o < e.length; o++) + if (s = e[o], !1 === n.isTimeBuffered(s.startPTS, s.endPTS, i)) { + n.removeFragment(h.body); + break; + } + } + } + }); + }, n.detectPartialFragments = function (t) { + var i = this, e = this.getFragmentKey(t), s = this.fragments[e]; + s && (s.buffered = !0, Object.keys(this.timeRanges).forEach(function (e) { + if (t.hasElementaryStream(e)) { + var n = i.timeRanges[e]; + s.range[e] = i.getBufferedTimes(t.startPTS, t.endPTS, n); + } + })); + }, n.getBufferedTimes = function (t, i, e) { + for (var s, n, r = [], h = !1, a = 0; a < e.length; a++) { + if (s = e.start(a) - this.bufferPadding, n = e.end(a) + this.bufferPadding, t >= s && i <= n) { + r.push({ + startPTS: Math.max(t, e.start(a)), + endPTS: Math.min(i, e.end(a)) + }); + break; + } + if (t < n && i > s) + r.push({ + startPTS: Math.max(t, e.start(a)), + endPTS: Math.min(i, e.end(a)) + }), h = !0; + else if (i <= s) + break; + } + return { + time: r, + partial: h + }; + }, n.getFragmentKey = function (t) { + return t.type + '_' + t.level + '_' + t.urlId + '_' + t.sn; + }, n.getPartialFragment = function (t) { + var i, e, s, n = this, r = null, h = 0; + return Object.keys(this.fragments).forEach(function (a) { + var o = n.fragments[a]; + n.isPartial(o) && (e = o.body.startPTS - n.bufferPadding, s = o.body.endPTS + n.bufferPadding, t >= e && t <= s && (i = Math.min(t - e, s - t), h <= i && (r = o.body, h = i))); + }), r; + }, n.getState = function (t) { + var i = this.getFragmentKey(t), e = this.fragments[i], s = B; + return void 0 !== e && (s = e.buffered ? !0 === this.isPartial(e) ? F : 'OK' : D), s; + }, n.isPartial = function (t) { + return !0 === t.buffered && (void 0 !== t.range.video && !0 === t.range.video.partial || void 0 !== t.range.audio && !0 === t.range.audio.partial); + }, n.isTimeBuffered = function (t, i, e) { + for (var s, n, r = 0; r < e.length; r++) { + if (s = e.start(r) - this.bufferPadding, n = e.end(r) + this.bufferPadding, t >= s && i <= n) + return !0; + if (i <= s) + return !1; + } + return !1; + }, n.onFragLoaded = function (t) { + var i = t.frag; + Object(a.a)(i.sn) && !i.bitrateTest && (this.fragments[this.getFragmentKey(i)] = { + body: i, + range: Object.create(null), + buffered: !1 + }); + }, n.onBufferAppended = function (t) { + var i = this; + this.timeRanges = t.timeRanges, Object.keys(this.timeRanges).forEach(function (t) { + var e = i.timeRanges[t]; + i.detectEvictedFragments(t, e); + }); + }, n.onFragBuffered = function (t) { + this.detectPartialFragments(t.frag); + }, n.hasFragment = function (t) { + var i = this.getFragmentKey(t); + return void 0 !== this.fragments[i]; + }, n.removeFragment = function (t) { + var i = this.getFragmentKey(t); + delete this.fragments[i]; + }, n.removeAllFragments = function () { + this.fragments = Object.create(null); + }, s; + }(l), U = { + search: function (t, i) { + for (var e = 0, s = t.length - 1, n = null, r = null; e <= s;) { + var h = i(r = t[n = (e + s) / 2 | 0]); + if (h > 0) + e = n + 1; + else { + if (!(h < 0)) + return r; + s = n - 1; + } + } + return null; + } + }, $ = function () { + function t() { + } + return t.isBuffered = function (t, i) { + try { + if (t) + for (var e = t.buffered, s = 0; s < e.length; s++) + if (i >= e.start(s) && i <= e.end(s)) + return !0; + } catch (t) { + } + return !1; + }, t.bufferInfo = function (t, i, e) { + try { + if (t) { + var s, n = t.buffered, r = []; + for (s = 0; s < n.length; s++) + r.push({ + start: n.start(s), + end: n.end(s) + }); + return this.bufferedInfo(r, i, e); + } + } catch (t) { + } + return { + len: 0, + start: i, + end: i, + nextStart: void 0 + }; + }, t.bufferedInfo = function (t, i, e) { + t.sort(function (t, i) { + var e = t.start - i.start; + return e || i.end - t.end; + }); + var s = []; + if (e) + for (var n = 0; n < t.length; n++) { + var r = s.length; + if (r) { + var h = s[r - 1].end; + t[n].start - h < e ? t[n].end > h && (s[r - 1].end = t[n].end) : s.push(t[n]); + } else + s.push(t[n]); + } + else + s = t; + for (var a, o = 0, c = i, u = i, l = 0; l < s.length; l++) { + var d = s[l].start, f = s[l].end; + if (i + e >= d && i < f) + c = d, o = (u = f) - i; + else if (i + e < d) { + a = d; + break; + } + } + return { + len: o, + start: c, + end: u, + nextStart: a + }; + }, t; + }(), N = e(8), H = e(11), q = e(9); + function z() { + return window.MediaSource || window.WebKitMediaSource; + } + var W = e(5), G = function (t) { + var i, e; + function s() { + return t.apply(this, arguments) || this; + } + return e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e, s.prototype.trigger = function (t) { + for (var i = arguments.length, e = new Array(i > 1 ? i - 1 : 0), s = 1; s < i; s++) + e[s - 1] = arguments[s]; + this.emit.apply(this, [ + t, + t + ].concat(e)); + }, s; + }(N.EventEmitter), J = z() || { + isTypeSupported: function () { + return !1; + } + }, Q = function () { + function t(t, i) { + var e = this; + this.hls = t, this.id = i; + var s = this.observer = new G(), n = t.config, r = function (i, s) { + (s = s || {}).frag = e.frag, s.id = e.id, t.trigger(i, s); + }; + s.on(o.a.FRAG_DECRYPTED, r), s.on(o.a.FRAG_PARSING_INIT_SEGMENT, r), s.on(o.a.FRAG_PARSING_DATA, r), s.on(o.a.FRAG_PARSED, r), s.on(o.a.ERROR, r), s.on(o.a.FRAG_PARSING_METADATA, r), s.on(o.a.FRAG_PARSING_USERDATA, r), s.on(o.a.INIT_PTS_FOUND, r); + var a = { + mp4: J.isTypeSupported('video/mp4'), + mpeg: J.isTypeSupported('audio/mpeg'), + mp3: J.isTypeSupported('audio/mp4; codecs="mp3"') + }, u = navigator.vendor; + if (n.enableWorker && 'undefined' != typeof Worker) { + var l; + c.b.log('demuxing in webworker'); + try { + l = this.w = H(12), this.onwmsg = this.onWorkerMessage.bind(this), l.addEventListener('message', this.onwmsg), l.onerror = function (i) { + t.trigger(o.a.ERROR, { + type: h.b.OTHER_ERROR, + details: h.a.INTERNAL_EXCEPTION, + fatal: !0, + event: 'demuxerWorker', + err: { message: i.message + ' (' + i.filename + ':' + i.lineno + ')' } + }); + }, l.postMessage({ + cmd: 'init', + typeSupported: a, + vendor: u, + id: i, + config: JSON.stringify(n) + }); + } catch (t) { + c.b.warn('Error in worker:', t), c.b.error('Error while initializing DemuxerWorker, fallback on DemuxerInline'), l && Object(W.a)().URL.revokeObjectURL(l.objectURL), this.demuxer = new q.a(s, a, n, u), this.w = void 0; + } + } else + this.demuxer = new q.a(s, a, n, u); + } + var i = t.prototype; + return i.destroy = function () { + var t = this.w; + if (t) + t.removeEventListener('message', this.onwmsg), t.terminate(), this.w = null; + else { + var i = this.demuxer; + i && (i.destroy(), this.demuxer = null); + } + var e = this.observer; + e && (e.removeAllListeners(), this.observer = null); + }, i.push = function (t, i, e, s, n, r, h, o) { + var u = this.w, l = Object(a.a)(n.startPTS) ? n.startPTS : n.start, d = n.decryptdata, f = this.frag, p = !(f && n.cc === f.cc), b = !(f && n.level === f.level), v = f && n.sn === f.sn + 1, m = !b && v; + if (p && c.b.log(this.id + ':discontinuity detected'), b && c.b.log(this.id + ':switch detected'), this.frag = n, u) + u.postMessage({ + cmd: 'demux', + data: t, + decryptdata: d, + initSegment: i, + audioCodec: e, + videoCodec: s, + timeOffset: l, + discontinuity: p, + trackSwitch: b, + contiguous: m, + duration: r, + accurateTimeOffset: h, + defaultInitPTS: o + }, t instanceof ArrayBuffer ? [t] : []); + else { + var g = this.demuxer; + g && g.push(t, d, i, e, s, l, p, b, m, r, h, o); + } + }, i.onWorkerMessage = function (t) { + var i = t.data, e = this.hls; + switch (i.event) { + case 'init': + Object(W.a)().URL.revokeObjectURL(this.w.objectURL); + break; + case o.a.FRAG_PARSING_DATA: + i.data.data1 = new Uint8Array(i.data1), i.data2 && (i.data.data2 = new Uint8Array(i.data2)); + default: + i.data = i.data || {}, i.data.frag = this.frag, i.data.id = this.id, e.trigger(i.event, i.data); + } + }, t; + }(); + function X(t, i, e) { + switch (i) { + case 'audio': + t.audioGroupIds || (t.audioGroupIds = []), t.audioGroupIds.push(e); + break; + case 'text': + t.textGroupIds || (t.textGroupIds = []), t.textGroupIds.push(e); + } + } + function Y(t, i, e) { + var s = t[i], n = t[e], r = n.startPTS; + Object(a.a)(r) ? e > i ? (s.duration = r - s.start, s.duration < 0 && c.b.warn('negative duration computed for frag ' + s.sn + ',level ' + s.level + ', there should be some duration drift between playlist and fragment!')) : (n.duration = s.start - r, n.duration < 0 && c.b.warn('negative duration computed for frag ' + n.sn + ',level ' + n.level + ', there should be some duration drift between playlist and fragment!')) : n.start = e > i ? s.start + s.duration : Math.max(s.start - n.duration, 0); + } + function K(t, i, e, s, n, r) { + var h = e; + if (Object(a.a)(i.startPTS)) { + var o = Math.abs(i.startPTS - e); + Object(a.a)(i.deltaPTS) ? i.deltaPTS = Math.max(o, i.deltaPTS) : i.deltaPTS = o, h = Math.max(e, i.startPTS), e = Math.min(e, i.startPTS), s = Math.max(s, i.endPTS), n = Math.min(n, i.startDTS), r = Math.max(r, i.endDTS); + } + var c = e - i.start; + i.start = i.startPTS = e, i.maxStartPTS = h, i.endPTS = s, i.startDTS = n, i.endDTS = r, i.duration = s - e; + var u, l, d, f = i.sn; + if (!t || f < t.startSN || f > t.endSN) + return 0; + for (u = f - t.startSN, (l = t.fragments)[u] = i, d = u; d > 0; d--) + Y(l, d, d - 1); + for (d = u; d < l.length - 1; d++) + Y(l, d, d + 1); + return t.PTSKnown = !0, c; + } + var Z = { + toString: function (t) { + for (var i = '', e = t.length, s = 0; s < e; s++) + i += '[' + t.start(s).toFixed(3) + ',' + t.end(s).toFixed(3) + ']'; + return i; + } + }; + function tt(t, i) { + i.fragments.forEach(function (i) { + if (i) { + var e = i.start + t; + i.start = i.startPTS = e, i.endPTS = e + i.duration; + } + }), i.PTSKnown = !0; + } + function it(t, i, e) { + !function (t, i, e) { + if (function (t, i, e) { + var s = !1; + return i && i.details && e && (e.endCC > e.startCC || t && t.cc < e.startCC) && (s = !0), s; + }(t, e, i)) { + var s = function (t, i) { + var e = t.fragments, s = i.fragments; + if (s.length && e.length) { + var n = function (t, i) { + for (var e = null, s = 0; s < t.length; s += 1) { + var n = t[s]; + if (n && n.cc === i) { + e = n; + break; + } + } + return e; + }(e, s[0].cc); + if (n && (!n || n.startPTS)) + return n; + c.b.log('No frag in previous level to align on'); + } else + c.b.log('No fragments to align'); + }(e.details, i); + s && (c.b.log('Adjusting PTS using last level due to CC increase within current level'), tt(s.start, i)); + } + }(t, e, i), !e.PTSKnown && i && function (t, i) { + if (i && i.fragments.length) { + if (!t.hasProgramDateTime || !i.hasProgramDateTime) + return; + var e = i.fragments[0].programDateTime, s = (t.fragments[0].programDateTime - e) / 1000 + i.fragments[0].start; + Object(a.a)(s) && (c.b.log('adjusting PTS using programDateTime delta, sliding:' + s.toFixed(3)), tt(s, t)); + } + }(e, i.details); + } + function et(t, i, e) { + void 0 === t && (t = 0), void 0 === i && (i = 0); + var s = Math.min(i, e.duration + (e.deltaPTS ? e.deltaPTS : 0)); + return e.start + e.duration - s <= t ? 1 : e.start - s > t && e.start ? -1 : 0; + } + function st(t, i, e) { + var s = 1000 * Math.min(i, e.duration + (e.deltaPTS ? e.deltaPTS : 0)); + return (e.endProgramDateTime || 0) - s > t; + } + var nt = function () { + function t(t, i, e, s) { + this.config = t, this.media = i, this.fragmentTracker = e, this.hls = s, this.nudgeRetry = 0, this.stallReported = !1, this.stalled = null, this.moved = !1, this.seeking = !1; + } + var i = t.prototype; + return i.poll = function (t) { + var i = this.config, e = this.media, s = this.stalled, n = e.currentTime, r = e.seeking, h = this.seeking && !r, a = !this.seeking && r; + if (this.seeking = r, n === t) { + if ((a || h) && (this.stalled = null), !e.paused && !e.ended && 0 !== e.playbackRate && e.buffered.length) { + var o = $.bufferInfo(e, n, 0), u = o.len > 0, l = o.nextStart || 0; + if (u || l) { + if (r) { + if (o.len > 2 || !l || l - n > 2) + return; + this.moved = !1; + } + if (!this.moved && this.stalled) { + var d = Math.max(l, o.start || 0) - n; + if (d > 0 && d <= 2) + return void this.$t(null); + } + var f = self.performance.now(); + if (null !== s) { + var p = f - s; + !r && p >= 250 && this.Nt(o.len); + var b = $.bufferInfo(e, n, i.maxBufferHole); + this.Ht(b, p); + } else + this.stalled = f; + } + } + } else if (this.moved = !0, null !== s) { + if (this.stallReported) { + var v = self.performance.now() - s; + c.b.warn('playback not stuck anymore @' + n + ', after ' + Math.round(v) + 'ms'), this.stallReported = !1; + } + this.stalled = null, this.nudgeRetry = 0; + } + }, i.Ht = function (t, i) { + var e = this.config, s = this.fragmentTracker, n = this.media.currentTime, r = s.getPartialFragment(n); + r && this.$t(r) || t.len > e.maxBufferHole && i > 1000 * e.highBufferWatchdogPeriod && (c.b.warn('Trying to nudge playhead over buffer-hole'), this.stalled = null, this.qt()); + }, i.Nt = function (t) { + var i = this.hls, e = this.media; + this.stallReported || (this.stallReported = !0, c.b.warn('Playback stalling at @' + e.currentTime + ' due to low buffer'), i.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_STALLED_ERROR, + fatal: !1, + buffer: t + })); + }, i.$t = function (t) { + for (var i = this.config, e = this.hls, s = this.media, n = s.currentTime, r = 0, a = 0; a < s.buffered.length; a++) { + var u = s.buffered.start(a); + if (n + i.maxBufferHole >= r && n < u) { + var l = Math.max(u + 0.05, s.currentTime + 0.1); + return c.b.warn('skipping hole, adjusting currentTime from ' + n + ' to ' + l), this.moved = !0, this.stalled = null, s.currentTime = l, t && e.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_SEEK_OVER_HOLE, + fatal: !1, + reason: 'fragment loaded with buffer holes, seeking from ' + n + ' to ' + l, + frag: t + }), l; + } + r = s.buffered.end(a); + } + return 0; + }, i.qt = function () { + var t = this.config, i = this.hls, e = this.media, s = e.currentTime, n = (this.nudgeRetry || 0) + 1; + if (this.nudgeRetry = n, n < t.nudgeMaxRetry) { + var r = s + n * t.nudgeOffset; + c.b.warn('Nudging \'currentTime\' from ' + s + ' to ' + r), e.currentTime = r, i.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_NUDGE_ON_STALL, + fatal: !1 + }); + } else + c.b.error('Playhead still not moving while enough data buffered @' + s + ' after ' + t.nudgeMaxRetry + ' nudges'), i.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_STALLED_ERROR, + fatal: !0 + }); + }, t; + }(), rt = 'STOPPED', ht = 'IDLE', at = 'KEY_LOADING', ot = 'FRAG_LOADING', ct = 'FRAG_LOADING_WAITING_RETRY', ut = 'PARSING', lt = 'PARSED', dt = 'BUFFER_FLUSHING', ft = 'ERROR', pt = 'WAITING_LEVEL'; + function bt(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + var vt = function (t) { + var i, e; + function s(i, e) { + var s; + return (s = t.call(this, i, o.a.MEDIA_ATTACHED, o.a.MEDIA_DETACHING, o.a.MANIFEST_LOADING, o.a.MANIFEST_PARSED, o.a.LEVEL_LOADED, o.a.KEY_LOADED, o.a.FRAG_LOADED, o.a.FRAG_LOAD_EMERGENCY_ABORTED, o.a.FRAG_PARSING_INIT_SEGMENT, o.a.FRAG_PARSING_DATA, o.a.FRAG_PARSED, o.a.ERROR, o.a.AUDIO_TRACK_SWITCHING, o.a.AUDIO_TRACK_SWITCHED, o.a.BUFFER_CREATED, o.a.BUFFER_APPENDED, o.a.BUFFER_FLUSHED) || this).fragmentTracker = e, s.config = i.config, s.audioCodecSwap = !1, s.zt = rt, s.stallReported = !1, s.gapController = null, s.altAudio = !1, s; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var r, u, l = s.prototype; + return l.startLoad = function (t) { + if (this.levels) { + var i = this.lastCurrentTime, e = this.hls; + if (this.stopLoad(), this.setInterval(100), this.level = -1, this.fragLoadError = 0, !this.startFragRequested) { + var s = e.startLevel; + -1 === s && (s = 0, this.bitrateTest = !0), this.level = e.nextLoadLevel = s, this.loadedmetadata = !1; + } + i > 0 && -1 === t && (c.b.log('override startPosition with lastCurrentTime @' + i.toFixed(3)), t = i), this.state = ht, this.nextLoadPosition = this.startPosition = this.lastCurrentTime = t, this.tick(); + } else + this.forceStartLoad = !0, this.state = rt; + }, l.stopLoad = function () { + this.forceStartLoad = !1, t.prototype.stopLoad.call(this); + }, l.doTick = function () { + switch (this.state) { + case dt: + this.fragLoadError = 0; + break; + case ht: + this.Wt(); + break; + case pt: + var t = this.levels[this.level]; + t && t.details && (this.state = ht); + break; + case ct: + var i = window.performance.now(), e = this.retryDate; + (!e || i >= e || this.media && this.media.seeking) && (c.b.log('mediaController: retryDate reached, switch back to IDLE state'), this.state = ht); + } + this.Gt(), this.Jt(); + }, l.Wt = function () { + var t = this.hls, i = t.config, e = this.media; + if (void 0 !== this.levelLastLoaded && (e || !this.startFragRequested && i.startFragPrefetch)) { + var s; + s = this.loadedmetadata ? e.currentTime : this.nextLoadPosition; + var n = t.nextLoadLevel, r = this.levels[n]; + if (r) { + var h, a = r.bitrate; + h = a ? Math.max(8 * i.maxBufferSize / a, i.maxBufferLength) : i.maxBufferLength, h = Math.min(h, i.maxMaxBufferLength); + var u = $.bufferInfo(this.mediaBuffer ? this.mediaBuffer : e, s, i.maxBufferHole), l = u.len; + if (!(l >= h)) { + c.b.trace('buffer length of ' + l.toFixed(3) + ' is below max of ' + h.toFixed(3) + '. checking for more payload ...'), this.level = t.nextLoadLevel = n; + var d = r.details; + if (!d || d.live && this.levelLastLoaded !== n) + this.state = pt; + else { + if (this.Qt(u, d)) { + var f = {}; + return this.altAudio && (f.type = 'video'), this.hls.trigger(o.a.BUFFER_EOS, f), void (this.state = 'ENDED'); + } + this.Xt(s, u, d); + } + } + } + } + }, l.Xt = function (t, i, e) { + var s = this.fragPrevious, n = this.level, r = e.fragments, h = r.length; + if (0 !== h) { + var a, o = r[0].start, u = r[h - 1].start + r[h - 1].duration, l = i.end; + if (e.initSegment && !e.initSegment.data) + a = e.initSegment; + else if (e.live) { + var d = this.config.initialLiveManifestSize; + if (h < d) + return void c.b.warn('Can not start playback of a level, reason: not enough fragments ' + h + ' < ' + d); + if (null === (a = this.Yt(e, l, o, u, s, r, h))) + return; + } else + l < o && (a = r[0]); + a || (a = this.Kt(o, s, h, r, l, u, e)), a && (a.encrypted ? (c.b.log('Loading key for ' + a.sn + ' of [' + e.startSN + ' ,' + e.endSN + '],level ' + n), this.Zt(a)) : (c.b.log('Loading ' + a.sn + ' of [' + e.startSN + ' ,' + e.endSN + '],level ' + n + ', currentTime:' + t.toFixed(3) + ',bufferEnd:' + l.toFixed(3)), this.ti(a))); + } + }, l.Yt = function (t, i, e, s, n, r, h) { + var o, u = this.hls.config, l = this.media, d = void 0 !== u.liveMaxLatencyDuration ? u.liveMaxLatencyDuration : u.liveMaxLatencyDurationCount * t.targetduration; + if (i < Math.max(e - u.maxFragLookUpTolerance, s - d)) { + var f = this.liveSyncPosition = this.computeLivePosition(e, t); + i = f, l && !l.paused && l.readyState && l.duration > f && f > l.currentTime && (c.b.log('buffer end: ' + i.toFixed(3) + ' is located too far from the end of live sliding playlist, reset currentTime to : ' + f.toFixed(3)), l.currentTime = f), this.nextLoadPosition = f; + } + if (t.PTSKnown && i > s && l && l.readyState) + return null; + if (this.startFragRequested && !t.PTSKnown) { + if (n) + if (t.hasProgramDateTime) + c.b.log('live playlist, switching playlist, load frag with same PDT: ' + n.programDateTime), o = function (t, i, e) { + if (null === i || !Array.isArray(t) || !t.length || !Object(a.a)(i)) + return null; + if (i < (t[0].programDateTime || 0)) + return null; + if (i >= (t[t.length - 1].endProgramDateTime || 0)) + return null; + e = e || 0; + for (var s = 0; s < t.length; ++s) { + var n = t[s]; + if (st(i, e, n)) + return n; + } + return null; + }(r, n.endProgramDateTime, u.maxFragLookUpTolerance); + else { + var p = n.sn + 1; + if (p >= t.startSN && p <= t.endSN) { + var b = r[p - t.startSN]; + n.cc === b.cc && (o = b, c.b.log('live playlist, switching playlist, load frag with next SN: ' + o.sn)); + } + o || (o = U.search(r, function (t) { + return n.cc - t.cc; + })) && c.b.log('live playlist, switching playlist, load frag with same CC: ' + o.sn); + } + o || (o = r[Math.min(h - 1, Math.round(h / 2))], c.b.log('live playlist, switching playlist, unknown, load middle frag : ' + o.sn)); + } + return o; + }, l.Kt = function (t, i, e, s, n, r, h) { + var a, o = this.hls.config; + if (a = n < r ? function (t, i, e, s) { + void 0 === e && (e = 0), void 0 === s && (s = 0); + var n = t ? i[t.sn - i[0].sn + 1] : null; + return n && !et(e, s, n) ? n : U.search(i, et.bind(null, e, s)); + }(i, s, n, n > r - o.maxFragLookUpTolerance ? 0 : o.maxFragLookUpTolerance) : s[e - 1]) { + var u = a.sn - h.startSN, l = i && a.level === i.level, d = s[u - 1], f = s[u + 1]; + if (i && a.sn === i.sn) + if (l && !a.backtracked) + if (a.sn < h.endSN) { + var p = i.deltaPTS; + p && p > o.maxBufferHole && i.dropped && u ? (a = d, c.b.warn('Previous fragment was dropped with large PTS gap between audio and video. Maybe fragment is not starting with a keyframe? Loading previous one to try to overcome this')) : (a = f, c.b.log('Re-loading fragment with SN: ' + a.sn)); + } else + a = null; + else + a.backtracked && (f && f.backtracked ? (c.b.warn('Already backtracked from fragment ' + f.sn + ', will not backtrack to fragment ' + a.sn + '. Loading fragment ' + f.sn), a = f) : (c.b.warn('Loaded fragment with dropped frames, backtracking 1 segment to find a keyframe'), a.dropped = 0, d ? (a = d).backtracked = !0 : u && (a = null))); + } + return a; + }, l.Zt = function (t) { + this.state = at, this.hls.trigger(o.a.KEY_LOADING, { frag: t }); + }, l.ti = function (t) { + var i = this.fragmentTracker.getState(t); + this.fragCurrent = t, 'initSegment' !== t.sn && (this.startFragRequested = !0), Object(a.a)(t.sn) && !t.bitrateTest && (this.nextLoadPosition = t.start + t.duration), t.backtracked || i === B || i === F ? (t.autoLevel = this.hls.autoLevelEnabled, t.bitrateTest = this.bitrateTest, this.hls.trigger(o.a.FRAG_LOADING, { frag: t }), this.demuxer || (this.demuxer = new Q(this.hls, 'main')), this.state = ot) : i === D && this.ii(t.duration) && this.fragmentTracker.removeFragment(t); + }, l.getBufferedFrag = function (t) { + return this.fragmentTracker.getBufferedFrag(t, n.MAIN); + }, l.followingBufferedFrag = function (t) { + return t ? this.getBufferedFrag(t.endPTS + 0.5) : null; + }, l.Jt = function () { + var t, i, e = this.media; + if (e && e.readyState && !1 === e.seeking && ((i = e.currentTime) > this.lastCurrentTime && (this.lastCurrentTime = i), $.isBuffered(e, i) ? t = this.getBufferedFrag(i) : $.isBuffered(e, i + 0.1) && (t = this.getBufferedFrag(i + 0.1)), t)) { + var s = t; + if (s !== this.fragPlaying) { + this.hls.trigger(o.a.FRAG_CHANGED, { frag: s }); + var n = s.level; + this.fragPlaying && this.fragPlaying.level === n || this.hls.trigger(o.a.LEVEL_SWITCHED, { level: n }), this.fragPlaying = s; + } + } + }, l.immediateLevelSwitch = function () { + if (c.b.log('immediateLevelSwitch'), !this.immediateSwitch) { + this.immediateSwitch = !0; + var t, i = this.media; + i ? (t = i.paused, i.pause()) : t = !0, this.previouslyPaused = t; + } + var e = this.fragCurrent; + e && e.loader && e.loader.abort(), this.fragCurrent = null, this.flushMainBuffer(0, Number.POSITIVE_INFINITY); + }, l.immediateLevelSwitchEnd = function () { + var t = this.media; + t && t.buffered.length && (this.immediateSwitch = !1, $.isBuffered(t, t.currentTime) && (t.currentTime -= 0.0001), this.previouslyPaused || t.play()); + }, l.nextLevelSwitch = function () { + var t = this.media; + if (t && t.readyState) { + var i, e, s; + if ((e = this.getBufferedFrag(t.currentTime)) && e.startPTS > 1 && this.flushMainBuffer(0, e.startPTS - 1), t.paused) + i = 0; + else { + var n = this.hls.nextLoadLevel, r = this.levels[n], h = this.fragLastKbps; + i = h && this.fragCurrent ? this.fragCurrent.duration * r.bitrate / (1000 * h) + 1 : 0; + } + if ((s = this.getBufferedFrag(t.currentTime + i)) && (s = this.followingBufferedFrag(s))) { + var a = this.fragCurrent; + a && a.loader && a.loader.abort(), this.fragCurrent = null, this.flushMainBuffer(s.maxStartPTS, Number.POSITIVE_INFINITY); + } + } + }, l.flushMainBuffer = function (t, i) { + this.state = dt; + var e = { + startOffset: t, + endOffset: i + }; + this.altAudio && (e.type = 'video'), this.hls.trigger(o.a.BUFFER_FLUSHING, e); + }, l.onMediaAttached = function (t) { + var i = this.media = this.mediaBuffer = t.media; + this.onvseeking = this.onMediaSeeking.bind(this), this.onvseeked = this.onMediaSeeked.bind(this), this.onvended = this.onMediaEnded.bind(this), i.addEventListener('seeking', this.onvseeking), i.addEventListener('seeked', this.onvseeked), i.addEventListener('ended', this.onvended); + var e = this.config; + this.levels && e.autoStartLoad && this.hls.startLoad(e.startPosition), this.gapController = new nt(e, i, this.fragmentTracker, this.hls); + }, l.onMediaDetaching = function () { + var t = this.media; + t && t.ended && (c.b.log('MSE detaching and video ended, reset startPosition'), this.startPosition = this.lastCurrentTime = 0); + var i = this.levels; + i && i.forEach(function (t) { + t.details && t.details.fragments.forEach(function (t) { + t.backtracked = void 0; + }); + }), t && (t.removeEventListener('seeking', this.onvseeking), t.removeEventListener('seeked', this.onvseeked), t.removeEventListener('ended', this.onvended), this.onvseeking = this.onvseeked = this.onvended = null), this.fragmentTracker.removeAllFragments(), this.media = this.mediaBuffer = null, this.loadedmetadata = !1, this.stopLoad(); + }, l.onMediaSeeked = function () { + var t = this.media, i = t ? t.currentTime : void 0; + Object(a.a)(i) && c.b.log('media seeked to ' + i.toFixed(3)), this.tick(); + }, l.onManifestLoading = function () { + c.b.log('trigger BUFFER_RESET'), this.hls.trigger(o.a.BUFFER_RESET), this.fragmentTracker.removeAllFragments(), this.stalled = !1, this.startPosition = this.lastCurrentTime = 0; + }, l.onManifestParsed = function (t) { + var i, e = !1, s = !1; + t.levels.forEach(function (t) { + (i = t.audioCodec) && (-1 !== i.indexOf('mp4a.40.2') && (e = !0), -1 !== i.indexOf('mp4a.40.5') && (s = !0)); + }), this.audioCodecSwitch = e && s, this.audioCodecSwitch && c.b.log('both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC'), this.altAudio = t.altAudio, this.levels = t.levels, this.startFragRequested = !1; + var n = this.config; + (n.autoStartLoad || this.forceStartLoad) && this.hls.startLoad(n.startPosition); + }, l.onLevelLoaded = function (t) { + var i = t.details, e = t.level, s = this.levels[this.levelLastLoaded], n = this.levels[e], r = i.totalduration, h = 0; + if (c.b.log('level ' + e + ' loaded [' + i.startSN + ',' + i.endSN + '],duration:' + r), i.live) { + var u = n.details; + u && i.fragments.length > 0 ? (function (t, i) { + i.initSegment && t.initSegment && (i.initSegment = t.initSegment); + var e, s = 0; + if (function (t, i, e) { + if (t && i) + for (var s = Math.max(t.startSN, i.startSN) - i.startSN, n = Math.min(t.endSN, i.endSN) - i.startSN, r = i.startSN - t.startSN, h = s; h <= n; h++) { + var a = t.fragments[r + h], o = i.fragments[h]; + if (!a || !o) + break; + e(a, o, h); + } + }(t, i, function (t, n) { + s = t.cc - n.cc, Object(a.a)(t.startPTS) && (n.start = n.startPTS = t.startPTS, n.endPTS = t.endPTS, n.duration = t.duration, n.backtracked = t.backtracked, n.dropped = t.dropped, e = n), i.PTSKnown = !0; + }), i.PTSKnown) { + if (s) { + c.b.log('discontinuity sliding from playlist, take drift into account'); + for (var n = i.fragments, r = 0; r < n.length; r++) + n[r].cc += s; + } + e ? K(i, e, e.startPTS, e.endPTS, e.startDTS, e.endDTS) : function (t, i) { + var e = i.startSN - t.startSN, s = t.fragments, n = i.fragments; + if (!(e < 0 || e > s.length)) + for (var r = 0; r < n.length; r++) + n[r].start += s[e].start; + }(t, i), i.PTSKnown = t.PTSKnown; + } + }(u, i), h = i.fragments[0].start, this.liveSyncPosition = this.computeLivePosition(h, u), i.PTSKnown && Object(a.a)(h) ? c.b.log('live playlist sliding:' + h.toFixed(3)) : (c.b.log('live playlist - outdated PTS, unknown sliding'), it(this.fragPrevious, s, i))) : (c.b.log('live playlist - first load, unknown sliding'), i.PTSKnown = !1, it(this.fragPrevious, s, i)); + } else + i.PTSKnown = !1; + if (n.details = i, this.levelLastLoaded = e, this.hls.trigger(o.a.LEVEL_UPDATED, { + details: i, + level: e + }), !1 === this.startFragRequested) { + if (-1 === this.startPosition || -1 === this.lastCurrentTime) { + var l = i.startTimeOffset; + Object(a.a)(l) ? (l < 0 && (c.b.log('negative start time offset ' + l + ', count from end of last fragment'), l = h + r + l), c.b.log('start time offset found in playlist, adjust startPosition to ' + l), this.startPosition = l) : i.live ? (this.startPosition = this.computeLivePosition(h, i), c.b.log('configure startPosition to ' + this.startPosition)) : this.startPosition = 0, this.lastCurrentTime = this.startPosition; + } + this.nextLoadPosition = this.startPosition; + } + this.state === pt && (this.state = ht), this.tick(); + }, l.onKeyLoaded = function () { + this.state === at && (this.state = ht, this.tick()); + }, l.onFragLoaded = function (t) { + var i = this.fragCurrent, e = this.hls, s = this.levels, n = this.media, r = t.frag; + if (this.state === ot && i && 'main' === r.type && r.level === i.level && r.sn === i.sn) { + var h = t.stats, a = s[i.level], u = a.details; + if (this.bitrateTest = !1, this.stats = h, c.b.log('Loaded ' + i.sn + ' of [' + u.startSN + ' ,' + u.endSN + '],level ' + i.level), r.bitrateTest && e.nextLoadLevel) + this.state = ht, this.startFragRequested = !1, h.tparsed = h.tbuffered = window.performance.now(), e.trigger(o.a.FRAG_BUFFERED, { + stats: h, + frag: i, + id: 'main' + }), this.tick(); + else if ('initSegment' === r.sn) + this.state = ht, h.tparsed = h.tbuffered = window.performance.now(), u.initSegment.data = t.payload, e.trigger(o.a.FRAG_BUFFERED, { + stats: h, + frag: i, + id: 'main' + }), this.tick(); + else { + c.b.log('Parsing ' + i.sn + ' of [' + u.startSN + ' ,' + u.endSN + '],level ' + i.level + ', cc ' + i.cc), this.state = ut, this.pendingBuffering = !0, this.appended = !1, r.bitrateTest && (r.bitrateTest = !1, this.fragmentTracker.onFragLoaded({ frag: r })); + var l = !(n && n.seeking) && (u.PTSKnown || !u.live), d = u.initSegment ? u.initSegment.data : [], f = this.ei(a); + (this.demuxer = this.demuxer || new Q(this.hls, 'main')).push(t.payload, d, f, a.videoCodec, i, u.totalduration, l); + } + } + this.fragLoadError = 0; + }, l.onFragParsingInitSegment = function (t) { + var i = this.fragCurrent, e = t.frag; + if (i && 'main' === t.id && e.sn === i.sn && e.level === i.level && this.state === ut) { + var s, n, r = t.tracks; + if (r.audio && this.altAudio && delete r.audio, n = r.audio) { + var h = this.levels[this.level].audioCodec, a = navigator.userAgent.toLowerCase(); + h && this.audioCodecSwap && (c.b.log('swapping playlist audio codec'), h = -1 !== h.indexOf('mp4a.40.5') ? 'mp4a.40.2' : 'mp4a.40.5'), this.audioCodecSwitch && 1 !== n.metadata.channelCount && -1 === a.indexOf('firefox') && (h = 'mp4a.40.5'), -1 !== a.indexOf('android') && 'audio/mpeg' !== n.container && (h = 'mp4a.40.2', c.b.log('Android: force audio codec to ' + h)), n.levelCodec = h, n.id = t.id; + } + for (s in ((n = r.video) && (n.levelCodec = this.levels[this.level].videoCodec, n.id = t.id), this.hls.trigger(o.a.BUFFER_CODECS, r), r)) { + n = r[s], c.b.log('main track:' + s + ',container:' + n.container + ',codecs[level/parsed]=[' + n.levelCodec + '/' + n.codec + ']'); + var u = n.initSegment; + u && (this.appended = !0, this.pendingBuffering = !0, this.hls.trigger(o.a.BUFFER_APPENDING, { + type: s, + data: u, + parent: 'main', + content: 'initSegment' + })); + } + this.tick(); + } + }, l.onFragParsingData = function (t) { + var i = this, e = this.fragCurrent, s = t.frag; + if (e && 'main' === t.id && s.sn === e.sn && s.level === e.level && ('audio' !== t.type || !this.altAudio) && this.state === ut) { + var n = this.levels[this.level], r = e; + if (Object(a.a)(t.endPTS) || (t.endPTS = t.startPTS + e.duration, t.endDTS = t.startDTS + e.duration), !0 === t.hasAudio && r.addElementaryStream(p.AUDIO), !0 === t.hasVideo && r.addElementaryStream(p.VIDEO), c.b.log('Parsed ' + t.type + ',PTS:[' + t.startPTS.toFixed(3) + ',' + t.endPTS.toFixed(3) + '],DTS:[' + t.startDTS.toFixed(3) + '/' + t.endDTS.toFixed(3) + '],nb:' + t.nb + ',dropped:' + (t.dropped || 0)), 'video' === t.type) + if (r.dropped = t.dropped, r.dropped) + if (r.backtracked) + c.b.warn('Already backtracked on this fragment, appending with the gap', r.sn); + else { + var h = n.details; + if (!h || r.sn !== h.startSN) + return c.b.warn('missing video frame(s), backtracking fragment', r.sn), this.fragmentTracker.removeFragment(r), r.backtracked = !0, this.nextLoadPosition = t.startPTS, this.state = ht, this.fragPrevious = r, void this.tick(); + c.b.warn('missing video frame(s) on first frag, appending with gap', r.sn); + } + else + r.backtracked = !1; + var u = K(n.details, r, t.startPTS, t.endPTS, t.startDTS, t.endDTS), l = this.hls; + l.trigger(o.a.LEVEL_PTS_UPDATED, { + details: n.details, + level: this.level, + drift: u, + type: t.type, + start: t.startPTS, + end: t.endPTS + }), [ + t.data1, + t.data2 + ].forEach(function (e) { + e && e.length && i.state === ut && (i.appended = !0, i.pendingBuffering = !0, l.trigger(o.a.BUFFER_APPENDING, { + type: t.type, + data: e, + parent: 'main', + content: 'data' + })); + }), this.tick(); + } + }, l.onFragParsed = function (t) { + var i = this.fragCurrent, e = t.frag; + i && 'main' === t.id && e.sn === i.sn && e.level === i.level && this.state === ut && (this.stats.tparsed = window.performance.now(), this.state = lt, this.si()); + }, l.onAudioTrackSwitching = function (t) { + var i = !!t.url, e = t.id; + if (!i) { + if (this.mediaBuffer !== this.media) { + c.b.log('switching on main audio, use media.buffered to schedule main fragment loading'), this.mediaBuffer = this.media; + var s = this.fragCurrent; + s.loader && (c.b.log('switching to main audio track, cancel main fragment load'), s.loader.abort()), this.fragCurrent = null, this.fragPrevious = null, this.demuxer && (this.demuxer.destroy(), this.demuxer = null), this.state = ht; + } + var n = this.hls; + n.trigger(o.a.BUFFER_FLUSHING, { + startOffset: 0, + endOffset: Number.POSITIVE_INFINITY, + type: 'audio' + }), n.trigger(o.a.AUDIO_TRACK_SWITCHED, { id: e }), this.altAudio = !1; + } + }, l.onAudioTrackSwitched = function (t) { + var i = t.id, e = !!this.hls.audioTracks[i].url; + if (e) { + var s = this.videoBuffer; + s && this.mediaBuffer !== s && (c.b.log('switching on alternate audio, use video.buffered to schedule main fragment loading'), this.mediaBuffer = s); + } + this.altAudio = e, this.tick(); + }, l.onBufferCreated = function (t) { + var i, e, s = t.tracks, n = !1; + for (var r in s) { + var h = s[r]; + 'main' === h.id ? (e = r, i = h, 'video' === r && (this.videoBuffer = s[r].buffer)) : n = !0; + } + n && i ? (c.b.log('alternate track found, use ' + e + '.buffered to schedule main fragment loading'), this.mediaBuffer = i.buffer) : this.mediaBuffer = this.media; + }, l.onBufferAppended = function (t) { + if ('main' === t.parent) { + var i = this.state; + i !== ut && i !== lt || (this.pendingBuffering = t.pending > 0, this.si()); + } + }, l.si = function () { + if (!(this.state !== lt || this.appended && this.pendingBuffering)) { + var t = this.fragCurrent; + if (t) { + var i = this.mediaBuffer ? this.mediaBuffer : this.media; + c.b.log('main buffered : ' + Z.toString(i.buffered)), this.fragPrevious = t; + var e = this.stats; + e.tbuffered = window.performance.now(), this.fragLastKbps = Math.round(8 * e.total / (e.tbuffered - e.tfirst)), this.hls.trigger(o.a.FRAG_BUFFERED, { + stats: e, + frag: t, + id: 'main' + }), this.state = ht; + } + this.tick(); + } + }, l.onError = function (t) { + var i = t.frag || this.fragCurrent; + if (!i || 'main' === i.type) { + var e = !!this.media && $.isBuffered(this.media, this.media.currentTime) && $.isBuffered(this.media, this.media.currentTime + 0.5); + switch (t.details) { + case h.a.FRAG_LOAD_ERROR: + case h.a.FRAG_LOAD_TIMEOUT: + case h.a.KEY_LOAD_ERROR: + case h.a.KEY_LOAD_TIMEOUT: + if (!t.fatal) + if (this.fragLoadError + 1 <= this.config.fragLoadingMaxRetry) { + var s = Math.min(Math.pow(2, this.fragLoadError) * this.config.fragLoadingRetryDelay, this.config.fragLoadingMaxRetryTimeout); + c.b.warn('mediaController: frag loading failed, retry in ' + s + ' ms'), this.retryDate = window.performance.now() + s, this.loadedmetadata || (this.startFragRequested = !1, this.nextLoadPosition = this.startPosition), this.fragLoadError++, this.state = ct; + } else + c.b.error('mediaController: ' + t.details + ' reaches max retry, redispatch as fatal ...'), t.fatal = !0, this.state = ft; + break; + case h.a.LEVEL_LOAD_ERROR: + case h.a.LEVEL_LOAD_TIMEOUT: + this.state !== ft && (t.fatal ? (this.state = ft, c.b.warn('streamController: ' + t.details + ',switch to ' + this.state + ' state ...')) : t.levelRetry || this.state !== pt || (this.state = ht)); + break; + case h.a.BUFFER_FULL_ERROR: + 'main' !== t.parent || this.state !== ut && this.state !== lt || (e ? (this.ii(this.config.maxBufferLength), this.state = ht) : (c.b.warn('buffer full error also media.currentTime is not buffered, flush everything'), this.fragCurrent = null, this.flushMainBuffer(0, Number.POSITIVE_INFINITY))); + } + } + }, l.ii = function (t) { + var i = this.config; + return i.maxMaxBufferLength >= t && (i.maxMaxBufferLength /= 2, c.b.warn('main:reduce max buffer length to ' + i.maxMaxBufferLength + 's'), !0); + }, l.Gt = function () { + var t = this.media; + if (t && 0 !== t.readyState) { + var i = (this.mediaBuffer ? this.mediaBuffer : t).buffered; + !this.loadedmetadata && i.length ? (this.loadedmetadata = !0, this.ni()) : this.immediateSwitch ? this.immediateLevelSwitchEnd() : this.gapController.poll(this.lastCurrentTime, i); + } + }, l.onFragLoadEmergencyAborted = function () { + this.state = ht, this.loadedmetadata || (this.startFragRequested = !1, this.nextLoadPosition = this.startPosition), this.tick(); + }, l.onBufferFlushed = function () { + var t = this.mediaBuffer ? this.mediaBuffer : this.media; + t && this.fragmentTracker.detectEvictedFragments(p.VIDEO, t.buffered), this.state = ht, this.fragPrevious = null; + }, l.swapAudioCodec = function () { + this.audioCodecSwap = !this.audioCodecSwap; + }, l.ni = function () { + var t = this.media, i = t.currentTime, e = t.seeking ? i : this.startPosition; + i !== e && e >= 0 && (c.b.log('target start position not buffered, seek to buffered.start(0) ' + e + ' from current time ' + i + ' '), t.currentTime = e); + }, l.ei = function (t) { + var i = this.config.defaultAudioCodec || t.audioCodec; + return this.audioCodecSwap && (c.b.log('swapping playlist audio codec'), i && (i = -1 !== i.indexOf('mp4a.40.5') ? 'mp4a.40.2' : 'mp4a.40.5')), i; + }, r = s, (u = [ + { + key: 'state', + set: function (t) { + if (this.state !== t) { + var i = this.state; + this.zt = t, c.b.log('main stream-controller: ' + i + '->' + t), this.hls.trigger(o.a.STREAM_STATE_TRANSITION, { + previousState: i, + nextState: t + }); + } + }, + get: function () { + return this.zt; + } + }, + { + key: 'currentLevel', + get: function () { + var t = this.media; + if (t) { + var i = this.getBufferedFrag(t.currentTime); + if (i) + return i.level; + } + return -1; + } + }, + { + key: 'nextBufferedFrag', + get: function () { + var t = this.media; + return t ? this.followingBufferedFrag(this.getBufferedFrag(t.currentTime)) : null; + } + }, + { + key: 'nextLevel', + get: function () { + var t = this.nextBufferedFrag; + return t ? t.level : -1; + } + }, + { + key: 'liveSyncPosition', + get: function () { + return this.ri; + }, + set: function (t) { + this.ri = t; + } + } + ]) && bt(r.prototype, u), s; + }(function (t) { + var i, e; + function s() { + return t.apply(this, arguments) || this; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.doTick = function () { + }, n.startLoad = function () { + }, n.stopLoad = function () { + var t = this.fragCurrent; + t && (t.loader && t.loader.abort(), this.fragmentTracker.removeFragment(t)), this.demuxer && (this.demuxer.destroy(), this.demuxer = null), this.fragCurrent = null, this.fragPrevious = null, this.clearInterval(), this.clearNextTick(), this.state = rt; + }, n.Qt = function (t, i) { + var e = this.fragCurrent, s = this.fragmentTracker; + if (!i.live && e && !e.backtracked && e.sn === i.endSN && !t.nextStart) { + var n = s.getState(e); + return n === F || 'OK' === n; + } + return !1; + }, n.onMediaSeeking = function () { + var t = this.config, i = this.media, e = this.mediaBuffer, s = this.state, n = i ? i.currentTime : null, r = $.bufferInfo(e || i, n, this.config.maxBufferHole); + if (Object(a.a)(n) && c.b.log('media seeking to ' + n.toFixed(3)), s === ot) { + var h = this.fragCurrent; + if (0 === r.len && h) { + var o = t.maxFragLookUpTolerance, u = h.start - o, l = h.start + h.duration + o; + n < u || n > l ? (h.loader && (c.b.log('seeking outside of buffer while fragment load in progress, cancel fragment load'), h.loader.abort()), this.fragCurrent = null, this.fragPrevious = null, this.state = ht) : c.b.log('seeking outside of buffer but within currently loaded fragment range'); + } + } else + 'ENDED' === s && (0 === r.len && (this.fragPrevious = null, this.fragCurrent = null), this.state = ht); + i && (this.lastCurrentTime = n), this.loadedmetadata || (this.nextLoadPosition = this.startPosition = n), this.tick(); + }, n.onMediaEnded = function () { + this.startPosition = this.lastCurrentTime = 0; + }, n.onHandlerDestroying = function () { + this.stopLoad(), t.prototype.onHandlerDestroying.call(this); + }, n.onHandlerDestroyed = function () { + this.state = rt, this.fragmentTracker = null; + }, n.computeLivePosition = function (t, i) { + var e = void 0 !== this.config.liveSyncDuration ? this.config.liveSyncDuration : this.config.liveSyncDurationCount * i.targetduration; + return t + Math.max(0, i.totalduration - e); + }, s; + }(function (t) { + var i, e; + function s(i) { + for (var e, s = arguments.length, n = new Array(s > 1 ? s - 1 : 0), r = 1; r < s; r++) + n[r - 1] = arguments[r]; + return (e = t.call.apply(t, [ + this, + i + ].concat(n)) || this).ai = void 0, e.oi = null, e.ci = null, e.ui = 0, e.ai = e.tick.bind(function (t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + }(e)), e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.onHandlerDestroying = function () { + this.clearNextTick(), this.clearInterval(); + }, n.hasInterval = function () { + return !!this.ci; + }, n.hasNextTick = function () { + return !!this.oi; + }, n.setInterval = function (t) { + return !this.ci && (this.ci = self.setInterval(this.ai, t), !0); + }, n.clearInterval = function () { + return !!this.ci && (self.clearInterval(this.ci), this.ci = null, !0); + }, n.clearNextTick = function () { + return !!this.oi && (self.clearTimeout(this.oi), this.oi = null, !0); + }, n.tick = function () { + this.ui++, 1 === this.ui && (this.doTick(), this.ui > 1 && (this.clearNextTick(), this.oi = self.setTimeout(this.ai, 0)), this.ui = 0); + }, n.doTick = function () { + }, s; + }(l))); + function mt(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + window.performance; + var gt, yt = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.MANIFEST_LOADED, o.a.LEVEL_LOADED, o.a.AUDIO_TRACK_SWITCHED, o.a.FRAG_LOADED, o.a.ERROR) || this).canload = !1, e.currentLevelIndex = null, e.manualLevelIndex = -1, e.timer = null, gt = /chrome|firefox/.test(navigator.userAgent.toLowerCase()), e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n, r, a = s.prototype; + return a.onHandlerDestroying = function () { + this.clearTimer(), this.manualLevelIndex = -1; + }, a.clearTimer = function () { + null !== this.timer && (clearTimeout(this.timer), this.timer = null); + }, a.startLoad = function () { + var t = this.li; + this.canload = !0, this.levelRetryCount = 0, t && t.forEach(function (t) { + t.loadError = 0; + var i = t.details; + i && i.live && (t.details = void 0); + }), null !== this.timer && this.loadLevel(); + }, a.stopLoad = function () { + this.canload = !1; + }, a.onManifestLoaded = function (t) { + var i, e = [], s = [], n = {}, r = null, a = !1, u = !1; + if (t.levels.forEach(function (t) { + var i = t.attrs; + t.loadError = 0, t.fragmentError = !1, a = a || !!t.videoCodec, u = u || !!t.audioCodec, gt && t.audioCodec && -1 !== t.audioCodec.indexOf('mp4a.40.34') && (t.audioCodec = void 0), (r = n[t.bitrate]) ? r.url.push(t.url) : (t.url = [t.url], t.urlId = 0, n[t.bitrate] = t, e.push(t)), i && (i.AUDIO && (u = !0, X(r || t, 'audio', i.AUDIO)), i.SUBTITLES && X(r || t, 'text', i.SUBTITLES)); + }), a && u && (e = e.filter(function (t) { + return !!t.videoCodec; + })), e = e.filter(function (t) { + var i = t.audioCodec, e = t.videoCodec; + return (!i || j(i, 'audio')) && (!e || j(e, 'video')); + }), t.audioTracks && (s = t.audioTracks.filter(function (t) { + return !t.audioCodec || j(t.audioCodec, 'audio'); + })).forEach(function (t, i) { + t.id = i; + }), e.length > 0) { + i = e[0].bitrate, e.sort(function (t, i) { + return t.bitrate - i.bitrate; + }), this.li = e; + for (var l = 0; l < e.length; l++) + if (e[l].bitrate === i) { + this.di = l, c.b.log('manifest loaded,' + e.length + ' level(s) found, first bitrate:' + i); + break; + } + this.hls.trigger(o.a.MANIFEST_PARSED, { + levels: e, + audioTracks: s, + firstLevel: this.di, + stats: t.stats, + audio: u, + video: a, + altAudio: s.some(function (t) { + return !!t.url; + }) + }); + } else + this.hls.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.MANIFEST_INCOMPATIBLE_CODECS_ERROR, + fatal: !0, + url: this.hls.url, + reason: 'no level with compatible codecs found in manifest' + }); + }, a.setLevelInternal = function (t) { + var i = this.li, e = this.hls; + if (t >= 0 && t < i.length) { + if (this.clearTimer(), this.currentLevelIndex !== t) { + c.b.log('switching to level ' + t), this.currentLevelIndex = t; + var s = i[t]; + s.level = t, e.trigger(o.a.LEVEL_SWITCHING, s); + } + var n = i[t], r = n.details; + if (!r || r.live) { + var a = n.urlId; + e.trigger(o.a.LEVEL_LOADING, { + url: n.url[a], + level: t, + id: a + }); + } + } else + e.trigger(o.a.ERROR, { + type: h.b.OTHER_ERROR, + details: h.a.LEVEL_SWITCH_ERROR, + level: t, + fatal: !1, + reason: 'invalid level idx' + }); + }, a.onError = function (t) { + if (t.fatal) + t.type === h.b.NETWORK_ERROR && this.clearTimer(); + else { + var i, e = !1, s = !1; + switch (t.details) { + case h.a.FRAG_LOAD_ERROR: + case h.a.FRAG_LOAD_TIMEOUT: + case h.a.KEY_LOAD_ERROR: + case h.a.KEY_LOAD_TIMEOUT: + i = t.frag.level, s = !0; + break; + case h.a.LEVEL_LOAD_ERROR: + case h.a.LEVEL_LOAD_TIMEOUT: + i = t.context.level, e = !0; + break; + case h.a.REMUX_ALLOC_ERROR: + i = t.level, e = !0; + } + void 0 !== i && this.recoverLevel(t, i, e, s); + } + }, a.recoverLevel = function (t, i, e, s) { + var n, r, h, a = this, o = this.hls.config, u = t.details, l = this.li[i]; + if (l.loadError++, l.fragmentError = s, e) { + if (!(this.levelRetryCount + 1 <= o.levelLoadingMaxRetry)) + return c.b.error('level controller, cannot recover from ' + u + ' error'), this.currentLevelIndex = null, this.clearTimer(), void (t.fatal = !0); + r = Math.min(Math.pow(2, this.levelRetryCount) * o.levelLoadingRetryDelay, o.levelLoadingMaxRetryTimeout), this.timer = setTimeout(function () { + return a.loadLevel(); + }, r), t.levelRetry = !0, this.levelRetryCount++, c.b.warn('level controller, ' + u + ', retry in ' + r + ' ms, current retry count is ' + this.levelRetryCount); + } + (e || s) && ((n = l.url.length) > 1 && l.loadError < n ? (l.urlId = (l.urlId + 1) % n, l.details = void 0, c.b.warn('level controller, ' + u + ' for level ' + i + ': switching to redundant URL-id ' + l.urlId)) : -1 === this.manualLevelIndex ? (h = 0 === i ? this.li.length - 1 : i - 1, c.b.warn('level controller, ' + u + ': switch to ' + h), this.hls.nextAutoLevel = this.currentLevelIndex = h) : s && (c.b.warn('level controller, ' + u + ': reload a fragment'), this.currentLevelIndex = null)); + }, a.onFragLoaded = function (t) { + var i = t.frag; + if (void 0 !== i && 'main' === i.type) { + var e = this.li[i.level]; + void 0 !== e && (e.fragmentError = !1, e.loadError = 0, this.levelRetryCount = 0); + } + }, a.onLevelLoaded = function (t) { + var i = this, e = t.level, s = t.details; + if (e === this.currentLevelIndex) { + var n = this.li[e]; + if (n.fragmentError || (n.loadError = 0, this.levelRetryCount = 0), s.live) { + var r = function (t, i, e) { + var s = 1000 * (i.averagetargetduration ? i.averagetargetduration : i.targetduration), n = s / 2; + return t && i.endSN === t.endSN && (s = n), e && (s = Math.max(n, s - (window.performance.now() - e))), Math.round(s); + }(n.details, s, t.stats.trequest); + c.b.log('live playlist, reload in ' + Math.round(r) + ' ms'), this.timer = setTimeout(function () { + return i.loadLevel(); + }, r); + } else + this.clearTimer(); + } + }, a.onAudioTrackSwitched = function (t) { + var i = this.hls.audioTracks[t.id].groupId, e = this.hls.levels[this.currentLevelIndex]; + if (e && e.audioGroupIds) { + for (var s = -1, n = 0; n < e.audioGroupIds.length; n++) + if (e.audioGroupIds[n] === i) { + s = n; + break; + } + s !== e.urlId && (e.urlId = s, this.startLoad()); + } + }, a.loadLevel = function () { + if (c.b.debug('call to loadLevel'), null !== this.currentLevelIndex && this.canload) { + var t = this.li[this.currentLevelIndex]; + if ('object' == typeof t && t.url.length > 0) { + var i = this.currentLevelIndex, e = t.urlId, s = t.url[e]; + c.b.log('Attempt loading level index ' + i + ' with URL-id ' + e), this.hls.trigger(o.a.LEVEL_LOADING, { + url: s, + level: i, + id: e + }); + } + } + }, n = s, (r = [ + { + key: 'levels', + get: function () { + return this.li; + } + }, + { + key: 'level', + get: function () { + return this.currentLevelIndex; + }, + set: function (t) { + var i = this.li; + i && (t = Math.min(t, i.length - 1), this.currentLevelIndex === t && i[t].details || this.setLevelInternal(t)); + } + }, + { + key: 'manualLevel', + get: function () { + return this.manualLevelIndex; + }, + set: function (t) { + this.manualLevelIndex = t, void 0 === this.fi && (this.fi = t), -1 !== t && (this.level = t); + } + }, + { + key: 'firstLevel', + get: function () { + return this.di; + }, + set: function (t) { + this.di = t; + } + }, + { + key: 'startLevel', + get: function () { + if (void 0 === this.fi) { + var t = this.hls.config.startLevel; + return void 0 !== t ? t : this.di; + } + return this.fi; + }, + set: function (t) { + this.fi = t; + } + }, + { + key: 'nextLoadLevel', + get: function () { + return -1 !== this.manualLevelIndex ? this.manualLevelIndex : this.hls.nextAutoLevel; + }, + set: function (t) { + this.level = t, -1 === this.manualLevelIndex && (this.hls.nextAutoLevel = t); + } + } + ]) && mt(n.prototype, r), s; + }(l), wt = e(4); + function Ot(t, i) { + var e; + try { + e = new Event('addtrack'); + } catch (t) { + (e = document.createEvent('Event')).initEvent('addtrack', !1, !1); + } + e.track = t, i.dispatchEvent(e); + } + var xt = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.MEDIA_ATTACHED, o.a.MEDIA_DETACHING, o.a.FRAG_PARSING_METADATA, o.a.LIVE_BACK_BUFFER_REACHED) || this).id3Track = void 0, e.media = void 0, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + l.prototype.destroy.call(this); + }, n.onMediaAttached = function (t) { + this.media = t.media, this.media; + }, n.onMediaDetaching = function () { + !function (t) { + if (t && t.cues) + for (; t.cues.length > 0;) + t.removeCue(t.cues[0]); + }(this.id3Track), this.id3Track = void 0, this.media = void 0; + }, n.getID3Track = function (t) { + for (var i = 0; i < t.length; i++) { + var e = t[i]; + if ('metadata' === e.kind && 'id3' === e.label) + return Ot(e, this.media), e; + } + return this.media.addTextTrack('metadata', 'id3'); + }, n.onFragParsingMetadata = function (t) { + var i = t.frag, e = t.samples; + this.id3Track || (this.id3Track = this.getID3Track(this.media.textTracks), this.id3Track.mode = 'hidden'); + for (var s = this.hls.config.cnxRenderWindow.WebKitDataCue || his.hls.config.cnxRenderWindow.VTTCue || his.hls.config.cnxRenderWindow.TextTrackCue, n = 0; n < e.length; n++) { + var r = wt.a.getID3Frames(e[n].data); + if (r) { + var h = e[n].pts, a = n < e.length - 1 ? e[n + 1].pts : i.endPTS; + h === a ? a += 0.0001 : h > a && (c.b.warn('detected an id3 sample with endTime < startTime, adjusting endTime to (startTime + 0.25)'), a = h + 0.25); + for (var o = 0; o < r.length; o++) { + var u = r[o]; + if (!wt.a.isTimeStampFrame(u)) { + var l = new s(h, a, ''); + l.value = u, this.id3Track.addCue(l); + } + } + } + } + }, n.onLiveBackBufferReached = function (t) { + var i = t.bufferEnd, e = this.id3Track; + if (e && e.cues && e.cues.length) { + var s = function (t, i) { + if (i < t[0].endTime) + return t[0]; + if (i > t[t.length - 1].endTime) + return t[t.length - 1]; + for (var e = 0, s = t.length - 1; e <= s;) { + var n = Math.floor((s + e) / 2); + if (i < t[n].endTime) + s = n - 1; + else { + if (!(i > t[n].endTime)) + return t[n]; + e = n + 1; + } + } + return t[e].endTime - i < i - t[s].endTime ? t[e] : t[s]; + }(e.cues, i); + if (s) + for (; e.cues[0] !== s;) + e.removeCue(e.cues[0]); + } + }, s; + }(l), St = function () { + function t(t) { + this.alpha_ = void 0, this.estimate_ = void 0, this.totalWeight_ = void 0, this.alpha_ = t ? Math.exp(Math.log(0.5) / t) : 0, this.estimate_ = 0, this.totalWeight_ = 0; + } + var i = t.prototype; + return i.sample = function (t, i) { + var e = Math.pow(this.alpha_, t); + this.estimate_ = i * (1 - e) + e * this.estimate_, this.totalWeight_ += t; + }, i.getTotalWeight = function () { + return this.totalWeight_; + }, i.getEstimate = function () { + if (this.alpha_) { + var t = 1 - Math.pow(this.alpha_, this.totalWeight_); + return this.estimate_ / t; + } + return this.estimate_; + }, t; + }(), jt = function () { + function t(t, i, e, s) { + this.hls = void 0, this.defaultEstimate_ = void 0, this.minWeight_ = void 0, this.minDelayMs_ = void 0, this.slow_ = void 0, this.fast_ = void 0, this.hls = t, this.defaultEstimate_ = s, this.minWeight_ = 0.001, this.minDelayMs_ = 50, this.slow_ = new St(i), this.fast_ = new St(e); + } + var i = t.prototype; + return i.sample = function (t, i) { + var e = (t = Math.max(t, this.minDelayMs_)) / 1000, s = 8 * i / e; + this.fast_.sample(e, s), this.slow_.sample(e, s); + }, i.canEstimate = function () { + var t = this.fast_; + return t && t.getTotalWeight() >= this.minWeight_; + }, i.getEstimate = function () { + return this.canEstimate() ? Math.min(this.fast_.getEstimate(), this.slow_.getEstimate()) : this.defaultEstimate_; + }, i.destroy = function () { + }, t; + }(); + function kt(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + var _t = window.performance, At = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.FRAG_LOADING, o.a.FRAG_LOADED, o.a.FRAG_BUFFERED, o.a.ERROR) || this).lastLoadedFragLevel = 0, e.pi = -1, e.hls = i, e.timer = null, e.bwEstimator = null, e.onCheck = e.bi.bind(function (t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + }(e)), e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n, r, u = s.prototype; + return u.destroy = function () { + this.clearTimer(), l.prototype.destroy.call(this); + }, u.onFragLoading = function (t) { + var i = t.frag; + if ('main' === i.type && (this.timer || (this.fragCurrent = i, this.timer = setInterval(this.onCheck, 100)), !this.bwEstimator)) { + var e, s, n = this.hls, r = n.config, h = i.level; + n.levels[h].details.live ? (e = r.abrEwmaFastLive, s = r.abrEwmaSlowLive) : (e = r.abrEwmaFastVoD, s = r.abrEwmaSlowVoD), this.bwEstimator = new jt(n, s, e, r.abrEwmaDefaultEstimate); + } + }, u.bi = function () { + var t = this.hls, i = t.media, e = this.fragCurrent; + if (e) { + var s = e.loader, n = t.minAutoLevel; + if (!s || s.stats && s.stats.aborted) + return c.b.warn('frag loader destroy or aborted, disarm abandonRules'), this.clearTimer(), void (this.pi = -1); + var r = s.stats; + if (i && r && (!i.paused && 0 !== i.playbackRate || !i.readyState) && e.autoLevel && e.level) { + var h = _t.now() - r.trequest, a = Math.abs(i.playbackRate); + if (h > 500 * e.duration / a) { + var u = t.levels, l = Math.max(1, r.bw ? r.bw / 8 : 1000 * r.loaded / h), d = u[e.level], f = d.realBitrate ? Math.max(d.realBitrate, d.bitrate) : d.bitrate, p = r.total ? r.total : Math.max(r.loaded, Math.round(e.duration * f / 8)), b = i.currentTime, v = (p - r.loaded) / l, m = ($.bufferInfo(i, b, t.config.maxBufferHole).end - b) / a; + if (m < 2 * e.duration / a && v > m) { + var g; + for (g = e.level - 1; g > n; g--) { + var y = u[g].realBitrate ? Math.max(u[g].realBitrate, u[g].bitrate) : u[g].bitrate; + if (e.duration * y / (6.4 * l) < m) + break; + } + void 0 < v && (c.b.warn('loading too slow, abort fragment loading and switch to level ' + g + ':fragLoadedDelay[' + g + ']= s; u--) { + var l = o[u]; + if (l) { + var d = l.details, f = d ? d.totalduration / d.fragments.length : i, p = !!d && d.live, b = void 0; + b = u <= t ? h * e : a * e; + var v = o[u].realBitrate ? Math.max(o[u].realBitrate, o[u].bitrate) : o[u].bitrate, m = v * f / b; + if (c.b.trace('level/adjustedbw/bitrate/avgDuration/maxFetchDuration/fetchDuration: ' + u + '/' + Math.round(b) + '/' + v + '/' + f + '/' + r + '/' + m), b > v && (!m || p && !this.bitrateTestDelay || m < r)) + return u; + } + } + return -1; + }, n = s, (r = [ + { + key: 'nextAutoLevel', + get: function () { + var t = this.pi, i = this.bwEstimator; + if (!(-1 === t || i && i.canEstimate())) + return t; + var e = this.nextABRAutoLevel; + return -1 !== t && (e = Math.min(t, e)), e; + }, + set: function (t) { + this.pi = t; + } + }, + { + key: 'nextABRAutoLevel', + get: function () { + var t = this.hls, i = t.maxAutoLevel, e = t.levels, s = t.config, n = t.minAutoLevel, r = t.media, h = this.lastLoadedFragLevel, a = this.fragCurrent ? this.fragCurrent.duration : 0, o = r ? r.currentTime : 0, u = r && 0 !== r.playbackRate ? Math.abs(r.playbackRate) : 1, l = this.bwEstimator ? this.bwEstimator.getEstimate() : s.abrEwmaDefaultEstimate, d = ($.bufferInfo(r, o, s.maxBufferHole).end - o) / u, f = this.vi(h, a, l, n, i, d, s.abrBandWidthFactor, s.abrBandWidthUpFactor, e); + if (f >= 0) + return f; + c.b.trace('rebuffering expected to happen, lets try to find a quality level minimizing the rebuffering'); + var p = a ? Math.min(a, s.maxStarvationDelay) : s.maxStarvationDelay, b = s.abrBandWidthFactor, v = s.abrBandWidthUpFactor; + if (0 === d) { + var m = this.bitrateTestDelay; + m && (p = (a ? Math.min(a, s.maxLoadingDelay) : s.maxLoadingDelay) - m, c.b.trace('bitrate test took ' + Math.round(1000 * m) + 'ms, set first fragment max fetchDuration to ' + Math.round(1000 * p) + ' ms'), b = v = 1); + } + return f = this.vi(h, a, l, n, i, d + p, b, v, e), Math.max(f, 0); + } + } + ]) && kt(n.prototype, r), s; + }(l), It = z(), Ct = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.MEDIA_ATTACHING, o.a.MEDIA_DETACHING, o.a.MANIFEST_PARSED, o.a.BUFFER_RESET, o.a.BUFFER_APPENDING, o.a.BUFFER_CODECS, o.a.BUFFER_EOS, o.a.BUFFER_FLUSHING, o.a.LEVEL_PTS_UPDATED, o.a.LEVEL_UPDATED) || this).mi = null, e.gi = null, e.yi = 10, e.wi = null, e.Oi = null, e.xi = !1, e.Si = !1, e.config = void 0, e.audioTimestampOffset = void 0, e.bufferCodecEventsExpected = 0, e.ji = 0, e.media = null, e.mediaSource = null, e.segments = [], e.parent = void 0, e.appending = !1, e.appended = 0, e.appendError = 0, e.flushBufferCounter = 0, e.tracks = {}, e.pendingTracks = {}, e.sourceBuffer = {}, e.flushRange = [], e.ki = function () { + c.b.log('media source opened'), e.hls.trigger(o.a.MEDIA_ATTACHED, { media: e.media }); + var t = e.mediaSource; + t && t.removeEventListener('sourceopen', e.ki), e.checkPendingTracks(); + }, e._i = function () { + c.b.log('media source closed'); + }, e.Ai = function () { + c.b.log('media source ended'); + }, e.Ii = function () { + if (e.audioTimestampOffset && e.sourceBuffer.audio) { + var t = e.sourceBuffer.audio; + c.b.warn('change mpeg audio timestamp offset from ' + t.timestampOffset + ' to ' + e.audioTimestampOffset), t.timestampOffset = e.audioTimestampOffset, delete e.audioTimestampOffset; + } + e.xi && e.doFlush(), e.Si && e.checkEos(), e.appending = !1; + var i = e.parent, s = e.segments.reduce(function (t, e) { + return e.parent === i ? t + 1 : t; + }, 0), n = {}, r = e.sourceBuffer; + for (var h in r) { + var a = r[h]; + if (!a) + throw Error('handling source buffer update end error: source buffer for ' + h + ' uninitilized and unable to update buffered TimeRanges.'); + n[h] = a.buffered; + } + e.hls.trigger(o.a.BUFFER_APPENDED, { + parent: i, + pending: s, + timeRanges: n + }), e.xi || e.doAppending(), e.updateMediaElementDuration(), 0 === s && e.flushLiveBackBuffer(); + }, e.Ci = function (t) { + c.b.error('sourceBuffer error:', t), e.hls.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_APPENDING_ERROR, + fatal: !1 + }); + }, e.config = i.config, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + l.prototype.destroy.call(this); + }, n.onLevelPtsUpdated = function (t) { + var i = t.type, e = this.tracks.audio; + if ('audio' === i && e && 'audio/mpeg' === e.container) { + var s = this.sourceBuffer.audio; + if (!s) + throw Error('Level PTS Updated and source buffer for audio uninitalized'); + if (Math.abs(s.timestampOffset - t.start) > 0.1) { + var n = s.updating; + try { + s.abort(); + } catch (t) { + c.b.warn('can not abort audio buffer: ' + t); + } + n ? this.audioTimestampOffset = t.start : (c.b.warn('change mpeg audio timestamp offset from ' + s.timestampOffset + ' to ' + t.start), s.timestampOffset = t.start); + } + } + }, n.onManifestParsed = function (t) { + this.bufferCodecEventsExpected = this.ji = t.altAudio ? 2 : 1, c.b.log(this.bufferCodecEventsExpected + ' bufferCodec event(s) expected'); + }, n.onMediaAttaching = function (t) { + var i = this.media = t.media; + if (i && It) { + var e = this.mediaSource = new It(); + e.addEventListener('sourceopen', this.ki), e.addEventListener('sourceended', this.Ai), e.addEventListener('sourceclose', this._i), i.src = window.URL.createObjectURL(e), this.Oi = i.src; + } + }, n.onMediaDetaching = function () { + c.b.log('media source detaching'); + var t = this.mediaSource; + if (t) { + if ('open' === t.readyState) + try { + t.endOfStream(); + } catch (t) { + c.b.warn('onMediaDetaching:' + t.message + ' while calling endOfStream'); + } + t.removeEventListener('sourceopen', this.ki), t.removeEventListener('sourceended', this.Ai), t.removeEventListener('sourceclose', this._i), this.media && (this.Oi && this.hls.config.cnxRenderWindow.URL.revokeObjectURL(this.Oi), this.media.src === this.Oi ? (this.media.removeAttribute('src'), this.media.load()) : c.b.warn('media.src was changed by a third party - skip cleanup')), this.mediaSource = null, this.media = null, this.Oi = null, this.bufferCodecEventsExpected = this.ji, this.pendingTracks = {}, this.tracks = {}, this.sourceBuffer = {}, this.flushRange = [], this.segments = [], this.appended = 0; + } + this.hls.trigger(o.a.MEDIA_DETACHED); + }, n.checkPendingTracks = function () { + var t = this.bufferCodecEventsExpected, i = this.pendingTracks, e = Object.keys(i).length; + (e && !t || 2 === e) && (this.createSourceBuffers(i), this.pendingTracks = {}, this.doAppending()); + }, n.onBufferReset = function () { + var t = this.sourceBuffer; + for (var i in t) { + var e = t[i]; + try { + e && (this.mediaSource && this.mediaSource.removeSourceBuffer(e), e.removeEventListener('updateend', this.Ii), e.removeEventListener('error', this.Ci)); + } catch (t) { + } + } + this.sourceBuffer = {}, this.flushRange = [], this.segments = [], this.appended = 0; + }, n.onBufferCodecs = function (t) { + var i = this; + Object.keys(this.sourceBuffer).length || (Object.keys(t).forEach(function (e) { + i.pendingTracks[e] = t[e]; + }), this.bufferCodecEventsExpected = Math.max(this.bufferCodecEventsExpected - 1, 0), this.mediaSource && 'open' === this.mediaSource.readyState && this.checkPendingTracks()); + }, n.createSourceBuffers = function (t) { + var i = this.sourceBuffer, e = this.mediaSource; + if (!e) + throw Error('createSourceBuffers called when mediaSource was null'); + for (var s in t) + if (!i[s]) { + var n = t[s]; + if (!n) + throw Error('source buffer exists for track ' + s + ', however track does not'); + var r = n.levelCodec || n.codec, a = n.container + ';codecs=' + r; + c.b.log('creating sourceBuffer(' + a + ')'); + try { + var u = i[s] = e.addSourceBuffer(a); + u.addEventListener('updateend', this.Ii), u.addEventListener('error', this.Ci), this.tracks[s] = { + buffer: u, + codec: r, + id: n.id, + container: n.container, + levelCodec: n.levelCodec + }; + } catch (t) { + c.b.error('error while trying to add sourceBuffer:' + t.message), this.hls.trigger(o.a.ERROR, { + type: h.b.MEDIA_ERROR, + details: h.a.BUFFER_ADD_CODEC_ERROR, + fatal: !1, + err: t, + mimeType: a + }); + } + } + this.hls.trigger(o.a.BUFFER_CREATED, { tracks: this.tracks }); + }, n.onBufferAppending = function (t) { + this.xi || (this.segments ? this.segments.push(t) : this.segments = [t], this.doAppending()); + }, n.onBufferEos = function (t) { + for (var i in this.sourceBuffer) + if (!t.type || t.type === i) { + var e = this.sourceBuffer[i]; + e && !e.ended && (e.ended = !0, c.b.log(i + ' sourceBuffer now EOS')); + } + this.checkEos(); + }, n.checkEos = function () { + var t = this.sourceBuffer, i = this.mediaSource; + if (i && 'open' === i.readyState) { + for (var e in t) { + var s = t[e]; + if (s) { + if (!s.ended) + return; + if (s.updating) + return void (this.Si = !0); + } + } + c.b.log('all media data are available, signal endOfStream() to MediaSource and stop loading fragment'); + try { + i.endOfStream(); + } catch (t) { + c.b.warn('exception while calling mediaSource.endOfStream()'); + } + this.Si = !1; + } else + this.Si = !1; + }, n.onBufferFlushing = function (t) { + t.type ? this.flushRange.push({ + start: t.startOffset, + end: t.endOffset, + type: t.type + }) : (this.flushRange.push({ + start: t.startOffset, + end: t.endOffset, + type: 'video' + }), this.flushRange.push({ + start: t.startOffset, + end: t.endOffset, + type: 'audio' + })), this.flushBufferCounter = 0, this.doFlush(); + }, n.flushLiveBackBuffer = function () { + if (this.wi) { + var t = this.config.liveBackBufferLength; + if (isFinite(t) && !(t < 0)) + if (this.media) + for (var i = this.media.currentTime, e = this.sourceBuffer, s = Object.keys(e), n = i - Math.max(t, this.yi), r = s.length - 1; r >= 0; r--) { + var h = s[r], a = e[h]; + if (a) { + var u = a.buffered; + u.length > 0 && n > u.start(0) && this.removeBufferRange(h, a, 0, n) && this.hls.trigger(o.a.LIVE_BACK_BUFFER_REACHED, { bufferEnd: n }); + } + } + else + c.b.error('flushLiveBackBuffer called without attaching media'); + } + }, n.onLevelUpdated = function (t) { + var i = t.details; + i.fragments.length > 0 && (this.gi = i.totalduration + i.fragments[0].start, this.yi = i.averagetargetduration || i.targetduration || 10, this.wi = i.live, this.updateMediaElementDuration()); + }, n.updateMediaElementDuration = function () { + var t, i = this.config; + if (null !== this.gi && this.media && this.mediaSource && this.sourceBuffer && 0 !== this.media.readyState && 'open' === this.mediaSource.readyState) { + for (var e in this.sourceBuffer) { + var s = this.sourceBuffer[e]; + if (s && !0 === s.updating) + return; + } + t = this.media.duration, null === this.mi && (this.mi = this.mediaSource.duration), !0 === this.wi && !0 === i.liveDurationInfinity ? (c.b.log('Media Source duration is set to Infinity'), this.mi = this.mediaSource.duration = 1 / 0) : (this.gi > this.mi && this.gi > t || !Object(a.a)(t)) && (c.b.log('Updating Media Source duration to ' + this.gi.toFixed(3)), this.mi = this.mediaSource.duration = this.gi); + } + }, n.doFlush = function () { + for (; this.flushRange.length;) { + var t = this.flushRange[0]; + if (!this.flushBuffer(t.start, t.end, t.type)) + return void (this.xi = !0); + this.flushRange.shift(), this.flushBufferCounter = 0; + } + if (0 === this.flushRange.length) { + this.xi = !1; + var i = 0, e = this.sourceBuffer; + try { + for (var s in e) { + var n = e[s]; + n && (i += n.buffered.length); + } + } catch (t) { + c.b.error('error while accessing sourceBuffer.buffered'); + } + this.appended = i, this.hls.trigger(o.a.BUFFER_FLUSHED); + } + }, n.doAppending = function () { + var t = this.config, i = this.hls, e = this.segments, s = this.sourceBuffer; + if (Object.keys(s).length) { + if (!this.media || this.media.error) + return this.segments = [], void c.b.error('trying to append although a media error occured, flush segment and abort'); + if (!this.appending) { + var n = e.shift(); + if (n) + try { + var r = s[n.type]; + if (!r) + return void this.Ii(); + if (r.updating) + return void e.unshift(n); + r.ended = !1, this.parent = n.parent, r.appendBuffer(n.data), this.appendError = 0, this.appended++, this.appending = !0; + } catch (s) { + c.b.error('error while trying to append buffer:' + s.message), e.unshift(n); + var a = { + type: h.b.MEDIA_ERROR, + parent: n.parent, + details: '', + fatal: !1 + }; + 22 === s.code ? (this.segments = [], a.details = h.a.BUFFER_FULL_ERROR) : (this.appendError++, a.details = h.a.BUFFER_APPEND_ERROR, this.appendError > t.appendErrorMaxRetry && (c.b.log('fail ' + t.appendErrorMaxRetry + ' times to append segment in sourceBuffer'), this.segments = [], a.fatal = !0)), i.trigger(o.a.ERROR, a); + } + } + } + }, n.flushBuffer = function (t, i, e) { + var s = this.sourceBuffer; + if (!Object.keys(s).length) + return !0; + var n = 'null'; + if (this.media && (n = this.media.currentTime.toFixed(3)), c.b.log('flushBuffer,pos/start/end: ' + n + '/' + t + '/' + i), this.flushBufferCounter >= this.appended) + return c.b.warn('abort flushing too many retries'), !0; + var r = s[e]; + if (r) { + if (r.ended = !1, r.updating) + return c.b.warn('cannot flush, sb updating in progress'), !1; + if (this.removeBufferRange(e, r, t, i)) + return this.flushBufferCounter++, !1; + } + return c.b.log('buffer flushed'), !0; + }, n.removeBufferRange = function (t, i, e, s) { + try { + for (var n = 0; n < i.buffered.length; n++) { + var r = i.buffered.start(n), h = i.buffered.end(n), a = Math.max(r, e), o = Math.min(h, s); + if (Math.min(o, h) - a > 0.5) { + var u = 'null'; + return this.media && (u = this.media.currentTime.toString()), c.b.log('sb remove ' + t + ' [' + a + ',' + o + '], of [' + r + ',' + h + '], pos:' + u), i.remove(a, o), !0; + } + } + } catch (t) { + c.b.warn('removeBufferRange failed', t); + } + return !1; + }, s; + }(l); + function Tt(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + var Pt, Mt = function (t) { + var i, e; + function s(i) { + var e; + return (e = t.call(this, i, o.a.FPS_DROP_LEVEL_CAPPING, o.a.MEDIA_ATTACHING, o.a.MANIFEST_PARSED, o.a.BUFFER_CODECS, o.a.MEDIA_DETACHING) || this).autoLevelCapping = Number.POSITIVE_INFINITY, e.firstLevel = null, e.levels = [], e.media = null, e.restrictedLevels = [], e.timer = null, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n, r, h, a = s.prototype; + return a.destroy = function () { + this.hls.config.capLevelToPlayerSize && (this.media = null, this.stopCapping()); + }, a.onFpsDropLevelCapping = function (t) { + s.isLevelAllowed(t.droppedLevel, this.restrictedLevels) && this.restrictedLevels.push(t.droppedLevel); + }, a.onMediaAttaching = function (t) { + this.media = t.media instanceof this.hls.config.cnxRenderWindow.HTMLVideoElement ? t.media : null; + }, a.onManifestParsed = function (t) { + var i = this.hls; + this.restrictedLevels = [], this.levels = t.levels, this.firstLevel = t.firstLevel, i.config.capLevelToPlayerSize && t.video && this.startCapping(); + }, a.onBufferCodecs = function (t) { + this.hls.config.capLevelToPlayerSize && t.video && this.startCapping(); + }, a.onLevelsUpdated = function (t) { + this.levels = t.levels; + }, a.onMediaDetaching = function () { + this.stopCapping(); + }, a.detectPlayerSize = function () { + if (this.media) { + var t = this.levels ? this.levels.length : 0; + if (t) { + var i = this.hls; + i.autoLevelCapping = this.getMaxLevel(t - 1), i.autoLevelCapping > this.autoLevelCapping && i.streamController.nextLevelSwitch(), this.autoLevelCapping = i.autoLevelCapping; + } + } + }, a.getMaxLevel = function (t) { + var i = this; + if (!this.levels) + return -1; + var e = this.levels.filter(function (e, n) { + return s.isLevelAllowed(n, i.restrictedLevels) && n <= t; + }); + return s.getMaxLevelByMediaSize(e, this.mediaWidth, this.mediaHeight); + }, a.startCapping = function () { + this.timer || (this.autoLevelCapping = Number.POSITIVE_INFINITY, this.hls.firstLevel = this.getMaxLevel(this.firstLevel), clearInterval(this.timer), this.timer = setInterval(this.detectPlayerSize.bind(this), 1000), this.detectPlayerSize()); + }, a.stopCapping = function () { + this.restrictedLevels = [], this.firstLevel = null, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.timer && (this.timer = clearInterval(this.timer), this.timer = null); + }, s.isLevelAllowed = function (t, i) { + return void 0 === i && (i = []), -1 === i.indexOf(t); + }, s.getMaxLevelByMediaSize = function (t, i, e) { + if (!t || t && !t.length) + return -1; + for (var s, n, r = t.length - 1, h = 0; h < t.length; h += 1) { + var a = t[h]; + if ((a.width >= i || a.height >= e) && (s = a, !(n = t[h + 1]) || s.width !== n.width || s.height !== n.height)) { + r = h; + break; + } + } + return r; + }, n = s, h = [{ + key: 'contentScaleFactor', + get: function () { + return 1; + } + }], (r = [ + { + key: 'mediaWidth', + get: function () { + var t, i = this.media; + return i && (t = i.width || i.clientWidth || i.offsetWidth, t *= s.contentScaleFactor), t; + } + }, + { + key: 'mediaHeight', + get: function () { + var t, i = this.media; + return i && (t = i.height || i.clientHeight || i.offsetHeight, t *= s.contentScaleFactor), t; + } + } + ]) && Tt(n.prototype, r), h && Tt(n, h), s; + }(l), Et = window.performance, Lt = function (t) { + var i, e; + function s(i) { + return t.call(this, i, o.a.MEDIA_ATTACHING) || this; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e; + var n = s.prototype; + return n.destroy = function () { + this.timer && clearInterval(this.timer), this.isVideoPlaybackQualityAvailable = !1; + }, n.onMediaAttaching = function (t) { + var i = this.hls.config; + i.capLevelOnFPSDrop && ('function' == typeof (this.video = t.media instanceof this.hls.config.cnxRenderWindow.HTMLVideoElement ? t.media : null).getVideoPlaybackQuality && (this.isVideoPlaybackQualityAvailable = !0), clearInterval(this.timer), this.timer = setInterval(this.checkFPSInterval.bind(this), i.fpsDroppedMonitoringPeriod)); + }, n.checkFPS = function (t, i, e) { + var s = Et.now(); + if (i) { + if (this.lastTime) { + var n = s - this.lastTime, r = e - this.lastDroppedFrames, h = i - this.lastDecodedFrames, a = 1000 * r / n, u = this.hls; + if (u.trigger(o.a.FPS_DROP, { + currentDropped: r, + currentDecoded: h, + totalDroppedFrames: e + }), a > 0 && r > u.config.fpsDroppedMonitoringThreshold * h) { + var l = u.currentLevel; + c.b.warn('drop FPS ratio greater than max allowed value for currentLevel: ' + l), l > 0 && (-1 === u.autoLevelCapping || u.autoLevelCapping >= l) && (l -= 1, u.trigger(o.a.FPS_DROP_LEVEL_CAPPING, { + level: l, + droppedLevel: u.currentLevel + }), u.autoLevelCapping = l, u.streamController.nextLevelSwitch()); + } + } + this.lastTime = s, this.lastDroppedFrames = e, this.lastDecodedFrames = i; + } + }, n.checkFPSInterval = function () { + var t = this.video; + if (t) + if (this.isVideoPlaybackQualityAvailable) { + var i = t.getVideoPlaybackQuality(); + this.checkFPS(t, i.totalVideoFrames, i.droppedVideoFrames); + } else + this.checkFPS(t, t.webkitDecodedFrameCount, t.webkitDroppedFrameCount); + }, s; + }(l), Rt = window, Bt = Rt.performance, Dt = Rt.XMLHttpRequest, Ft = function () { + function t(t) { + t && t.xhrSetup && (this.xhrSetup = t.xhrSetup); + } + var i = t.prototype; + return i.destroy = function () { + this.abort(), this.loader = null; + }, i.abort = function () { + var t = this.loader; + t && 4 !== t.readyState && (this.stats.aborted = !0, t.abort()), window.clearTimeout(this.requestTimeout), this.requestTimeout = null, window.clearTimeout(this.retryTimeout), this.retryTimeout = null; + }, i.load = function (t, i, e) { + this.context = t, this.config = i, this.callbacks = e, this.stats = { + trequest: Bt.now(), + retry: 0 + }, this.retryDelay = i.retryDelay, this.loadInternal(); + }, i.loadInternal = function () { + var t, i = this.context; + t = this.loader = new Dt(); + var e = this.stats; + e.tfirst = 0, e.loaded = 0; + var s = this.xhrSetup; + try { + if (s) + try { + s(t, i.url); + } catch (e) { + t.open('GET', i.url, !0), s(t, i.url); + } + t.readyState || t.open('GET', i.url, !0); + } catch (e) { + return void this.callbacks.onError({ + code: t.status, + text: e.message + }, i, t); + } + i.rangeEnd && t.setRequestHeader('Range', 'bytes=' + i.rangeStart + '-' + (i.rangeEnd - 1)), t.onreadystatechange = this.readystatechange.bind(this), t.onprogress = this.loadprogress.bind(this), t.responseType = i.responseType, this.requestTimeout = window.setTimeout(this.loadtimeout.bind(this), this.config.timeout), t.send(); + }, i.readystatechange = function (t) { + var i = t.currentTarget, e = i.readyState, s = this.stats, n = this.context, r = this.config; + if (!s.aborted && e >= 2) + if (window.clearTimeout(this.requestTimeout), 0 === s.tfirst && (s.tfirst = Math.max(Bt.now(), s.trequest)), 4 === e) { + var h = i.status; + if (h >= 200 && h < 300) { + var a, o; + s.tload = Math.max(s.tfirst, Bt.now()), o = 'arraybuffer' === n.responseType ? (a = i.response).byteLength : (a = i.responseText).length, s.loaded = s.total = o; + var u = { + url: i.responseURL, + data: a + }; + this.callbacks.onSuccess(u, s, n, i); + } else + s.retry >= r.maxRetry || h >= 400 && h < 499 ? (c.b.error(h + ' while loading ' + n.url), this.callbacks.onError({ + code: h, + text: i.statusText + }, n, i)) : (c.b.warn(h + ' while loading ' + n.url + ', retrying in ' + this.retryDelay + '...'), this.destroy(), this.retryTimeout = window.setTimeout(this.loadInternal.bind(this), this.retryDelay), this.retryDelay = Math.min(2 * this.retryDelay, r.maxRetryDelay), s.retry++); + } else + this.requestTimeout = window.setTimeout(this.loadtimeout.bind(this), r.timeout); + }, i.loadtimeout = function () { + c.b.warn('timeout while loading ' + this.context.url), this.callbacks.onTimeout(this.stats, this.context, null); + }, i.loadprogress = function (t) { + var i = t.currentTarget, e = this.stats; + e.loaded = t.loaded, t.lengthComputable && (e.total = t.total); + var s = this.callbacks.onProgress; + s && s(e, this.context, null, i); + }, t; + }(); + e(6), function (t) { + t.WIDEVINE = 'com.widevine.alpha', t.PLAYREADY = 'com.microsoft.playready'; + }(Pt || (Pt = {})); + var Vt = function () { + var t = window.cnxRenderWindow; + return void 0 !== t && t.navigator && t.navigator.requestMediaKeySystemAccess ? t.navigator.requestMediaKeySystemAccess.bind(t.navigator) : null; + }(); + function Ut(t, i, e) { + return i in t ? Object.defineProperty(t, i, { + value: e, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[i] = e, t; + } + var $t = function (t) { + for (var i = 1; i < arguments.length; i++) { + var e = null != arguments[i] ? arguments[i] : {}, s = Object.keys(e); + 'function' == typeof Object.getOwnPropertySymbols && (s = s.concat(Object.getOwnPropertySymbols(e).filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + }))), s.forEach(function (i) { + Ut(t, i, e[i]); + }); + } + return t; + }({ + cnxRenderWindow: window, + autoStartLoad: !0, + startPosition: -1, + defaultAudioCodec: void 0, + debug: !1, + capLevelOnFPSDrop: !1, + capLevelToPlayerSize: !1, + initialLiveManifestSize: 1, + maxBufferLength: 30, + maxBufferSize: 60000000, + maxBufferHole: 0.5, + lowBufferWatchdogPeriod: 0.5, + highBufferWatchdogPeriod: 3, + nudgeOffset: 0.1, + nudgeMaxRetry: 3, + maxFragLookUpTolerance: 0.25, + liveSyncDurationCount: 3, + liveMaxLatencyDurationCount: 1 / 0, + liveSyncDuration: void 0, + liveMaxLatencyDuration: void 0, + liveDurationInfinity: !1, + liveBackBufferLength: 1 / 0, + maxMaxBufferLength: 600, + enableWorker: !0, + enableSoftwareAES: !0, + manifestLoadingTimeOut: 10000, + manifestLoadingMaxRetry: 1, + manifestLoadingRetryDelay: 1000, + manifestLoadingMaxRetryTimeout: 64000, + startLevel: void 0, + levelLoadingTimeOut: 10000, + levelLoadingMaxRetry: 4, + levelLoadingRetryDelay: 1000, + levelLoadingMaxRetryTimeout: 64000, + fragLoadingTimeOut: 20000, + fragLoadingMaxRetry: 6, + fragLoadingRetryDelay: 1000, + fragLoadingMaxRetryTimeout: 64000, + startFragPrefetch: !1, + fpsDroppedMonitoringPeriod: 5000, + fpsDroppedMonitoringThreshold: 0.2, + appendErrorMaxRetry: 3, + loader: Ft, + fLoader: void 0, + pLoader: void 0, + xhrSetup: void 0, + licenseXhrSetup: void 0, + abrController: At, + bufferController: Ct, + capLevelController: Mt, + fpsController: Lt, + stretchShortVideoTrack: !1, + maxAudioFramesDrift: 1, + forceKeyFrameOnDiscontinuity: !0, + abrEwmaFastLive: 3, + abrEwmaSlowLive: 9, + abrEwmaFastVoD: 3, + abrEwmaSlowVoD: 9, + abrEwmaDefaultEstimate: 500000, + abrBandWidthFactor: 0.95, + abrBandWidthUpFactor: 0.7, + abrMaxWithRealBitrate: !1, + maxStarvationDelay: 4, + maxLoadingDelay: 4, + minAutoBitrate: 0, + emeEnabled: !1, + widevineLicenseUrl: void 0, + requestMediaKeySystemAccessFunc: Vt + }, {}, { + subtitleStreamController: void 0, + subtitleTrackController: void 0, + timelineController: void 0, + audioStreamController: void 0, + audioTrackController: void 0, + emeController: void 0 + }); + function Nt(t, i, e) { + return i in t ? Object.defineProperty(t, i, { + value: e, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[i] = e, t; + } + function Ht(t) { + if (void 0 === t) + throw new ReferenceError('this hasn\'t been initialised - super() hasn\'t been called'); + return t; + } + function qt(t, i) { + for (var e = 0; e < i.length; e++) { + var s = i[e]; + s.enumerable = s.enumerable || !1, s.configurable = !0, 'value' in s && (s.writable = !0), Object.defineProperty(t, s.key, s); + } + } + function zt(t, i, e) { + return i && qt(t.prototype, i), e && qt(t, e), t; + } + e.d(i, 'default', function () { + return Wt; + }); + var Wt = function (t) { + var i, e; + function s(i) { + var e; + void 0 === i && (i = {}), (e = t.call(this) || this).config = void 0, e.Ti = void 0, e.abrController = void 0, e.capLevelController = void 0, e.levelController = void 0, e.streamController = void 0, e.networkControllers = void 0, e.audioTrackController = void 0, e.subtitleTrackController = void 0, e.emeController = void 0, e.coreComponents = void 0, e.media = null, e.url = null; + var n = s.DefaultConfig; + if ((i.liveSyncDurationCount || i.liveMaxLatencyDurationCount) && (i.liveSyncDuration || i.liveMaxLatencyDuration)) + throw new Error('Illegal hls.js config: don\'t mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration'); + e.config = function (t) { + for (var i = 1; i < arguments.length; i++) { + var e = null != arguments[i] ? arguments[i] : {}, s = Object.keys(e); + 'function' == typeof Object.getOwnPropertySymbols && (s = s.concat(Object.getOwnPropertySymbols(e).filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + }))), s.forEach(function (i) { + Nt(t, i, e[i]); + }); + } + return t; + }({}, n, i), window.cnxRenderWindow = e.config.cnxRenderWindow; + var r = Ht(e).config; + if (void 0 !== r.liveMaxLatencyDurationCount && r.liveMaxLatencyDurationCount <= r.liveSyncDurationCount) + throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be gt "liveSyncDurationCount"'); + if (void 0 !== r.liveMaxLatencyDuration && (void 0 === r.liveSyncDuration || r.liveMaxLatencyDuration <= r.liveSyncDuration)) + throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be gt "liveSyncDuration"'); + Object(c.a)(r.debug), e.Ti = -1; + var h = e.abrController = new r.abrController(Ht(e)), a = new r.bufferController(Ht(e)), o = e.capLevelController = new r.capLevelController(Ht(e)), u = new r.fpsController(Ht(e)), l = new E(Ht(e)), d = new L(Ht(e)), f = new R(Ht(e)), p = new xt(Ht(e)), b = e.levelController = new yt(Ht(e)), v = new V(Ht(e)), m = [ + b, + e.streamController = new vt(Ht(e), v) + ], g = r.audioStreamController; + g && m.push(new g(Ht(e), v)), e.networkControllers = m; + var y = [ + l, + d, + f, + h, + a, + o, + u, + p, + v + ]; + if (g = r.audioTrackController) { + var w = new g(Ht(e)); + e.audioTrackController = w, y.push(w); + } + if (g = r.subtitleTrackController) { + var O = new g(Ht(e)); + e.subtitleTrackController = O, m.push(O); + } + if (g = r.emeController) { + var x = new g(Ht(e)); + e.emeController = x, y.push(x); + } + return (g = r.subtitleStreamController) && m.push(new g(Ht(e), v)), (g = r.timelineController) && y.push(new g(Ht(e))), e.coreComponents = y, e; + } + e = t, (i = s).prototype = Object.create(e.prototype), i.prototype.constructor = i, i.__proto__ = e, s.isSupported = function () { + return function () { + var t = z(); + if (!t) + return !1; + var i = self.SourceBuffer || self.WebKitSourceBuffer, e = t && 'function' == typeof t.isTypeSupported && t.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'), s = !i || i.prototype && 'function' == typeof i.prototype.appendBuffer && 'function' == typeof i.prototype.remove; + return !!e && !!s; + }(); + }, zt(s, null, [ + { + key: 'version', + get: function () { + } + }, + { + key: 'Events', + get: function () { + return o.a; + } + }, + { + key: 'ErrorTypes', + get: function () { + return h.b; + } + }, + { + key: 'ErrorDetails', + get: function () { + return h.a; + } + }, + { + key: 'DefaultConfig', + get: function () { + return s.defaultConfig ? s.defaultConfig : $t; + }, + set: function (t) { + s.defaultConfig = t; + } + } + ]); + var n = s.prototype; + return n.destroy = function () { + c.b.log('destroy'), this.trigger(o.a.DESTROYING), this.detachMedia(), this.coreComponents.concat(this.networkControllers).forEach(function (t) { + t.destroy(); + }), this.url = null, this.removeAllListeners(), this.Ti = -1; + }, n.attachMedia = function (t) { + c.b.log('attachMedia'), this.media = t, this.trigger(o.a.MEDIA_ATTACHING, { media: t }); + }, n.detachMedia = function () { + c.b.log('detachMedia'), this.trigger(o.a.MEDIA_DETACHING), this.media = null; + }, n.loadSource = function (t) { + t = r.buildAbsoluteURL(this.config.cnxRenderWindow.location.href, t, { alwaysNormalize: !0 }), c.b.log('loadSource:' + t), this.url = t, this.trigger(o.a.MANIFEST_LOADING, { url: t }); + }, n.startLoad = function (t) { + void 0 === t && (t = -1), c.b.log('startLoad(' + t + ')'), this.networkControllers.forEach(function (i) { + i.startLoad(t); + }); + }, n.stopLoad = function () { + c.b.log('stopLoad'), this.networkControllers.forEach(function (t) { + t.stopLoad(); + }); + }, n.swapAudioCodec = function () { + c.b.log('swapAudioCodec'), this.streamController.swapAudioCodec(); + }, n.recoverMediaError = function () { + c.b.log('recoverMediaError'); + var t = this.media; + this.detachMedia(), t && this.attachMedia(t); + }, zt(s, [ + { + key: 'levels', + get: function () { + return this.levelController.levels; + } + }, + { + key: 'currentLevel', + get: function () { + return this.streamController.currentLevel; + }, + set: function (t) { + c.b.log('set currentLevel:' + t), this.loadLevel = t, this.streamController.immediateLevelSwitch(); + } + }, + { + key: 'nextLevel', + get: function () { + return this.streamController.nextLevel; + }, + set: function (t) { + c.b.log('set nextLevel:' + t), this.levelController.manualLevel = t, this.streamController.nextLevelSwitch(); + } + }, + { + key: 'loadLevel', + get: function () { + return this.levelController.level; + }, + set: function (t) { + c.b.log('set loadLevel:' + t), this.levelController.manualLevel = t; + } + }, + { + key: 'nextLoadLevel', + get: function () { + return this.levelController.nextLoadLevel; + }, + set: function (t) { + this.levelController.nextLoadLevel = t; + } + }, + { + key: 'firstLevel', + get: function () { + return Math.max(this.levelController.firstLevel, this.minAutoLevel); + }, + set: function (t) { + c.b.log('set firstLevel:' + t), this.levelController.firstLevel = t; + } + }, + { + key: 'startLevel', + get: function () { + return this.levelController.startLevel; + }, + set: function (t) { + c.b.log('set startLevel:' + t), -1 !== t && (t = Math.max(t, this.minAutoLevel)), this.levelController.startLevel = t; + } + }, + { + key: 'capLevelToPlayerSize', + set: function (t) { + var i = !!t; + i !== this.config.capLevelToPlayerSize && (i ? this.capLevelController.startCapping() : (this.capLevelController.stopCapping(), this.autoLevelCapping = -1, this.streamController.nextLevelSwitch()), this.config.capLevelToPlayerSize = i); + } + }, + { + key: 'autoLevelCapping', + get: function () { + return this.Ti; + }, + set: function (t) { + c.b.log('set autoLevelCapping:' + t), this.Ti = t; + } + }, + { + key: 'bandwidthEstimate', + get: function () { + var t = this.abrController.bwEstimator; + return t ? t.getEstimate() : NaN; + } + }, + { + key: 'autoLevelEnabled', + get: function () { + return -1 === this.levelController.manualLevel; + } + }, + { + key: 'manualLevel', + get: function () { + return this.levelController.manualLevel; + } + }, + { + key: 'minAutoLevel', + get: function () { + for (var t = this.levels, i = this.config.minAutoBitrate, e = t ? t.length : 0, s = 0; s < e; s++) + if ((t[s].realBitrate ? Math.max(t[s].realBitrate, t[s].bitrate) : t[s].bitrate) > i) + return s; + return 0; + } + }, + { + key: 'maxAutoLevel', + get: function () { + var t = this.levels, i = this.autoLevelCapping; + return -1 === i && t && t.length ? t.length - 1 : i; + } + }, + { + key: 'nextAutoLevel', + get: function () { + return Math.min(Math.max(this.abrController.nextAutoLevel, this.minAutoLevel), this.maxAutoLevel); + }, + set: function (t) { + this.abrController.nextAutoLevel = Math.max(this.minAutoLevel, t); + } + }, + { + key: 'audioTracks', + get: function () { + var t = this.audioTrackController; + return t ? t.audioTracks : []; + } + }, + { + key: 'audioTrack', + get: function () { + var t = this.audioTrackController; + return t ? t.audioTrack : -1; + }, + set: function (t) { + var i = this.audioTrackController; + i && (i.audioTrack = t); + } + }, + { + key: 'liveSyncPosition', + get: function () { + return this.streamController.liveSyncPosition; + } + }, + { + key: 'subtitleTracks', + get: function () { + var t = this.subtitleTrackController; + return t ? t.subtitleTracks : []; + } + }, + { + key: 'subtitleTrack', + get: function () { + var t = this.subtitleTrackController; + return t ? t.subtitleTrack : -1; + }, + set: function (t) { + var i = this.subtitleTrackController; + i && (i.subtitleTrack = t); + } + }, + { + key: 'subtitleDisplay', + get: function () { + var t = this.subtitleTrackController; + return !!t && t.subtitleDisplay; + }, + set: function (t) { + var i = this.subtitleTrackController; + i && (i.subtitleDisplay = t); + } + } + ]), s; + }(G); + Wt.defaultConfig = void 0; + }.apply(this, arguments); + } finally { + if ($___old_f7a60a143d7416d2) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_f7a60a143d7416d2)); + } + } + ]).default); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return n; + }), e.d(i, 'b', function () { + return r; + }); + var s = e(0); + const n = [ + s.ProtoDeviceType.Smartphone, + s.ProtoDeviceType.Tablet + ]; + var r; + !function (t) { + t.Ios = 'ios', t.Android = 'android', t.Mac = 'macos', t.Windows = 'windows', t.Linux = 'linux'; + }(r || (r = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'b', function () { + return r; + }), e.d(i, 'e', function () { + return h; + }), e.d(i, 'c', function () { + return a; + }), e.d(i, 'a', function () { + return o; + }), e.d(i, 'd', function () { + return u; + }); + var s = e(1); + const n = '.cdn.ampproject.org'; + function r(t, i) { + i || (i = location.search), t = t.replace(/\[/, '\\[').replace(/]/, '\\]'); + const e = new RegExp(`[\\?&]${ t }=([^&#]*)`, 'i').exec(i); + return null === e ? null : decodeURIComponent(e[1]); + } + function h(t, i, e) { + const s = new RegExp(`([?&])${ i }=.*?(&|$)`, 'i'), n = -1 !== t.indexOf('?') ? '&' : '?'; + return t.match(s) ? e ? t.replace(s, `$1${ i }=${ e }$2`) : t.replace(s, '$1') : `${ t }${ n }${ i }=${ e }`; + } + function a(t) { + return t.indexOf('?') > -1 ? '&' : '?'; + } + function o(t) { + if (Object(s.h)(t)) + return t.indexOf('://') > -1 ? t.split('/')[2] : t.split('/')[0]; + } + function c(t, i) { + return `${ 'http' + (/(\/s\/)+/.test(t.replace(i, '')) ? 's' : '') }://${ i }`; + } + function u(t, i = (() => { + return !0; + })()) { + return t = function (t) { + return -1 === t.indexOf(n) ? t : (t = (t = (t = (t = (t = (t = (t = t.replace(n, '')).replace('www-', 'www.')).replace('amp-', 'amp.')).cnx_replaceAll('--', '=')).cnx_replaceAll('-', '.')).cnx_replaceAll('=', '-')).replace('www.', 'amp.')).indexOf('amp.') > -1 ? t : t = (t = t.replace('http://', 'http://amp.')).replace('https://', 'https://amp.'); + }(t = function (t) { + const i = /^https:\/\/www.google\..*?\/amp\/s*\/*/.exec(t); + if (null !== i) { + const e = t.replace(i[0], ''); + return c(t, e); + } + return t; + }(t = function (t) { + if (t.indexOf(n) > -1) { + t = t.replace('https://', ''); + const i = /^[^\/]+(\/[a-z]+\/)+s*\/*/, e = i.test(t) ? t.replace(i.exec(t)[0], '') : t; + return c(t, e); + } + return t; + }(t))), i && (t = function (t) { + if (-1 === t.indexOf('#origin-') && -1 === t.indexOf('viewerUrl-')) + return t; + const i = t.split('#origin-')[1].split('viewerUrl-'); + return u(t = decodeURIComponent(i[1]), !1); + }(t)), t; + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return n; + }); + var s = e(6); + class n { + constructor() { + this.Pi = {}; + } + subscribe(t, i, e) { + this.Pi[t] || (this.Pi[t] = []), this.Pi[t].push({ + context: i, + func: e + }); + } + unsubscribe(t, i, e) { + this.Pi[t] && (this.Pi[t] = this.Pi[t].filter(t => { + return !(t.context === i && (t.func === e || !e)); + })); + } + unsubscribeAll(t) { + Object.keys(this.Pi).forEach(i => { + this.Pi[i] = this.Pi[i].filter(i => { + return i.context !== t; + }); + }); + } + publish(t, i, e = (() => { + return { payload: void 0 }; + })()) { + Object.prototype.hasOwnProperty.call(this.Pi, i) && this.Pi[i].forEach(i => { + i.context === t && i.func(e); + }); + } + relay(t, i, e, n) { + Object(s.m)(t).forEach(t => { + this.subscribe(t, i, i => { + n.publish(e, t, i); + }); + }); + } + relayBulk(t, i, e) { + t.forEach(t => { + this.relay(t.channel, t.source, i, e); + }); + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'b', function () { + return n; + }); + const s = JSON.parse('{"version":124898,"domainPrefix":"","logToConsole":false,"logToServer":true,"env":"production"}'), n = !0; + }, + function (t, i, e) { + 'use strict'; + var s; + e.d(i, 'a', function () { + return s; + }), function (t) { + t[t.CmpApi = 0] = 'CmpApi', t[t.TcfApi = 1] = 'TcfApi'; + }(s || (s = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + var s, n = e(5), r = e(0), h = e(8), a = e(1), o = e(19); + !function (t) { + const i = 30000; + function e(t, e) { + const s = function ({ + requestUrl: t, + requestType: e = 'POST', + contentType: s = '', + responseType: n = '', + withCredentials: r = !1 + }) { + const h = new XMLHttpRequest(); + return h.open(e, t, !0), s.length > 0 && h.setRequestHeader('Content-Type', s), n.length > 0 && (h.responseType = n), h.timeout = i, h.withCredentials = r, h; + }(t), n = new Date(); + return new Promise((t, i) => { + s.onreadystatechange = () => { + if (s.readyState === XMLHttpRequest.DONE) + if (200 === s.status) + t(s.response); + else { + let t = ''; + try { + t = s.responseText; + } catch (t) { + } + const e = new Date().getTime() - n.getTime(); + i(new Error(`Request fail. status:${ s.status }, readyState:${ s.readyState }, response:${ t }, time:${ e }`)); + } + }, s.ontimeout = () => { + const t = new Date().getTime() - n.getTime(); + i(new Error(`Request timeout status:${ s.status }. time:${ t }`)); + }, s.send(e); + }); + } + function s(t, i, e) { + try { + const s = Object(h.k)([ + 95, + 5 + ]); + !s || i && 0 !== Object.keys(i).length || Object(n.a)({ + message: 'empty_proto_request', + callStack: 'empty_function_argument', + exception: e, + level: r.ProtoLoggingLevelEnum.INFO, + sendMaxLog: !1 + }); + const a = t.fromObject(i); + !s || a && 0 !== Object.keys(a).length || Object(n.a)({ + message: 'empty_proto_request', + callStack: 'empty_fromObject_result', + exception: e, + level: r.ProtoLoggingLevelEnum.INFO, + sendMaxLog: !1 + }); + const o = t.encode(a).finish(); + return !s || o && 0 !== Object.keys(o).length || Object(n.a)({ + message: 'empty_proto_request', + callStack: 'empty_encode_result', + exception: e, + level: r.ProtoLoggingLevelEnum.INFO, + sendMaxLog: !1 + }), o; + } catch (t) { + throw Object(n.a)({ + throttle: 10, + sendMaxLog: !0, + exception: e, + level: r.ProtoLoggingLevelEnum.FATAL, + callStack: JSON.stringify(i), + message: 'Protobuf_encode' + }), Error(); + } + } + function c(t, i, s = (() => { + return 'POST'; + })(), h, a) { + return function (t, i, e) { + return new Promise((s, h) => { + i.then(i => { + if (t) { + let a = null; + try { + const s = i ? new Uint8Array(i) : new Uint8Array(); + a = t.toObject(t.decode(s), { + defaults: !0, + arrays: !0, + objects: !0 + }); + } catch (t) { + Object(n.a)({ + exception: `${ e }__${ t.message }`, + message: 'Protobuf_decode', + callStack: t.stack, + level: r.ProtoLoggingLevelEnum.WARNING, + sendMaxLog: !0, + throttle: 100 + }); + } + a && a.errorMessage && '500' === a.errorMessage && h(a.errorMessage), s(a); + } + }).catch(t => { + h(t); + }); + }); + }(t, e({ + requestUrl: i, + requestType: s, + withCredentials: a, + contentType: 'POST' === s ? 'multipart/form-data' : '', + responseType: 'arraybuffer' + }, h), i); + } + t.fetchXMLRequest = function (t, i = (() => { + return !0; + })()) { + const s = e({ + requestUrl: t, + requestType: 'GET', + withCredentials: i + }); + return new Promise((t, i) => { + s.then(i => { + t(i); + }).catch(t => { + i(t); + }); + }); + }, t.sendProtoRequest = function ({ + ProtoResponse: t, + ProtoRequest: i, + requestData: e, + endpoint: u, + requestType: l, + withCredentials: d, + queryParams: f, + logError: p + }) { + const b = e ? s(i, e, u) : null; + return c(t, u = function (t, i) { + return Object(a.f)(i) ? (Object.keys(i).forEach(e => { + return t = Object(o.e)(t, e, i[e]); + }), t) : t; + }(u, f), l, b, d).catch(t => { + throw p && Object(h.k)([ + 95, + 5 + ]) && Object(n.a)({ + message: 'Xhr_error', + exception: u, + callStack: `${ t }`, + level: r.ProtoLoggingLevelEnum.INFO + }), new Error(t); + }); + }, t.sendProtoBeaconRequest = function ({ + ProtoRequest: t, + requestData: i, + endpoint: e + }) { + const n = i ? s(t, i, e) : null; + return navigator.sendBeacon(e, n); + }, t.trackPixel = function (t) { + try { + new Image().src = t; + } catch (t) { + Object(n.a)({ + message: 'Xhr_trackPixel', + exception: t.message, + callStack: t.stack, + level: r.ProtoLoggingLevelEnum.FATAL + }); + } + }; + }(s || (s = {})); + }, + function (t, i, e) { + 'use strict'; + var s, n; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'd', function () { + return n; + }), e.d(i, 'b', function () { + return r; + }), e.d(i, 'c', function () { + return h; + }), function (t) { + t.Chrome = 'chrome', t.Firefox = 'firefox', t.Edge = 'edge', t.Safari = 'safari', t.Opera = 'opera', t.Samsung = 'samsung', t.Facebook = 'facebook', t.InternetExplorer = 'ie'; + }(s || (s = {})), function (t) { + t.Standard = 'standard', t.Webkit = 'webkit', t.Moz = 'moz', t.Ms = 'ms', t.O = 'o'; + }(n || (n = {})); + const r = [ + { + name: n.Standard, + keys: { + fullscreenEnabled: 'fullscreenEnabled', + fullscreenElement: 'fullscreenElement', + requestFullscreen: 'requestFullscreen', + exitFullscreen: 'exitFullscreen', + fullscreenchange: 'fullscreenchange', + fullscreenerror: 'fullscreenerror' + } + }, + { + name: n.Webkit, + keys: { + fullscreenEnabled: 'webkitFullscreenEnabled', + fullscreenElement: 'webkitFullscreenElement', + requestFullscreen: 'webkitRequestFullscreen', + exitFullscreen: 'webkitExitFullscreen', + fullscreenchange: 'webkitfullscreenchange', + fullscreenerror: 'webkitfullscreenerror' + } + }, + { + name: n.Webkit, + keys: { + fullscreenEnabled: 'webkitSupportsFullscreen', + fullscreenElement: 'webkitFullscreenElement', + requestFullscreen: 'webkitEnterFullscreen', + exitFullscreen: 'webkitExitFullscreen', + fullscreenchange: 'webkitfullscreenchange', + fullscreenerror: 'webkitfullscreenerror' + } + }, + { + name: n.Moz, + keys: { + fullscreenEnabled: 'mozFullScreenEnabled', + fullscreenElement: 'mozFullScreenElement', + requestFullscreen: 'mozRequestFullScreen', + exitFullscreen: 'mozCancelFullScreen', + fullscreenchange: 'mozfullscreenchange', + fullscreenerror: 'mozfullscreenerror' + } + }, + { + name: n.Ms, + keys: { + fullscreenEnabled: 'msFullscreenEnabled', + fullscreenElement: 'msFullscreenElement', + requestFullscreen: 'msRequestFullscreen', + exitFullscreen: 'msExitFullscreen', + fullscreenchange: 'MSFullscreenChange', + fullscreenerror: 'MSFullscreenError' + } + } + ]; + var h; + !function (t) { + t.Self = '_self', t.Blank = '_blank', t.Parent = '_parent', t.Top = '_top'; + }(h || (h = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'j', function () { + return s; + }), e.d(i, 'k', function () { + return n; + }), e.d(i, 'i', function () { + return r; + }), e.d(i, 'd', function () { + return h; + }), e.d(i, 'g', function () { + return a; + }), e.d(i, 'h', function () { + return o; + }), e.d(i, 'b', function () { + return c; + }), e.d(i, 'f', function () { + return u; + }), e.d(i, 'c', function () { + return l; + }), e.d(i, 'e', function () { + return d; + }), e.d(i, 'a', function () { + return f; + }); + const s = '1.3.13-iab2343', n = '1.3.13-iab2343', r = 'Connatix'; + var h, a, o, c, u, l, d, f; + !function (t) { + t.Generic = 'generic', t.Video = 'video'; + }(h || (h = {})), function (t) { + t.Click = 'click', t.InvitationAccept = 'invitationAccept'; + }(a || (a = {})), function (t) { + t.PreRoll = 'preroll', t.MidRoll = 'midroll', t.PostRoll = 'postroll', t.Standalone = 'standalone'; + }(o || (o = {})), function (t) { + t.SessionStart = 'sessionStart', t.SessionError = 'sessionError', t.SessionFinish = 'sessionFinish'; + }(c || (c = {})), function (t) { + t.DefinedByJavascript = 'definedByJavaScript', t.BeginToRender = 'beginToRender'; + }(u || (u = {})), function (t) { + t.DefinedByJavascript = 'definedByJavaScript', t.Video = 'video'; + }(l || (l = {})), function (t) { + t.sessionError = 'sessionError', t.geometryChange = 'geometryChange'; + }(d || (d = {})), function (t) { + t.backgrounded = 'backgrounded', t.notFound = 'notFound'; + }(f || (f = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'f', function () { + return s; + }), e.d(i, 'g', function () { + return n; + }), e.d(i, 'h', function () { + return r; + }), e.d(i, 'd', function () { + return h; + }), e.d(i, 'b', function () { + return a; + }), e.d(i, 'a', function () { + return o; + }), e.d(i, 'e', function () { + return c; + }), e.d(i, 'c', function () { + return u; + }); + const s = 200, n = 0.9, r = 1.1, h = 31, a = 2000, o = 1000, c = 0.5, u = 'connatix.com'; + }, + , + function (t, i, e) { + 'use strict'; + var s; + e.d(i, 'c', function () { + return s; + }), e.d(i, 'a', function () { + return n; + }), e.d(i, 'b', function () { + return r; + }), function (t) { + t.Connatix = '143', t.AppNexus = '32', t.DistrictM = '144', t.IndexExchange = '10', t.Lkqd = '237', t.OneVideo = '25', t.Openx = '69', t.Pubmatic = '76', t.RhythmOne = '36', t.Rubicon = '52', t.Spotx = '165', t.Telaria = '202', t.MediaNet = '142', t.AdMan = '149', t.IronSource = '', t.Undertone = '677', t.SynacorMedia = '', t.AmxRTB = '737', t.Smaato = '82'; + }(s || (s = {})); + const n = 'cnx_usr_storage', r = ['1YNY']; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return r; + }), e.d(i, 'e', function () { + return h; + }), e.d(i, 'b', function () { + return a; + }), e.d(i, 'f', function () { + return o; + }), e.d(i, 'd', function () { + return c; + }), e.d(i, 'c', function () { + return u; + }); + var s = e(1), n = e(11); + function r(t) { + let i, e; + return Object(s.g)(t) && (i = t.match(n.b)) && (e = parseInt(i[1], 10) * n.d + parseInt(i[2], 10) * n.e + parseInt(i[3], 10) * n.f + parseInt(i[5] || 0, 10)), isNaN(e) ? null : e; + } + function h(t, i) { + return /^\d+(\.\d+)?%$/g.test(t) ? i ? i * parseFloat(t.replace('%', '')) / 100 : null : r(t); + } + function a(t) { + return Date.now() + t * n.a; + } + function o(t, i = (() => { + return ':'; + })()) { + const e = t => { + return t >= 10 ? t : `0${ t }`; + }; + return `${ e(Math.floor(t / 60)) }${ i }${ e(Math.floor(t % 60)) }`; + } + function c(t, i) { + const e = Date.now(); + return !(e < t || e > i); + } + function u() { + const t = new Date(); + return t.getTime() - 1000 * t.getTimezoneOffset() * 60; + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + class s { + } + s.MaxLogOverflow = 1000, s.maxLogOverflowCount = {}, s.logCount = {}, s.maxLogSent = {}, s.sessionId = '', s.pageFocus = !1, s.incrementLogCount = t => { + s.logCount[t] ? (++s.maxLogOverflowCount[t], ++s.logCount[t]) : (s.logCount[t] = 1, s.maxLogOverflowCount[t] = 1); + }, s.isMaxLog = (t, i) => { + return !!(s.logCount[t] && s.logCount[t] > i); + }, s.isMaxLogOverflow = t => { + return s.maxLogOverflowCount[t] > s.MaxLogOverflow && (s.maxLogOverflowCount[t] = 1, !0); + }, s.setMaxLogSent = t => { + s.maxLogSent[t] = !0; + }, s.isMaxLogSent = t => { + return !!s.maxLogSent[t]; + }; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return r; + }), e.d(i, 'c', function () { + return h; + }), e.d(i, 'b', function () { + return a; + }); + var s = e(8), n = e(1); + const r = t => { + return Object.keys(t).map(i => { + return t[i]; + }); + }; + function h(t) { + for (const i in t) + t.hasOwnProperty(i) && 'string' == typeof t[i] && (t[i] = `%22${ encodeURIComponent(t[i]) }%22`); + return JSON.stringify(t).cnx_replaceAll('"', ''); + } + function a(t, i) { + if (!Object(n.f)(t) || !Object(n.f)(i)) + return !1; + const e = Object.getOwnPropertyNames(t), r = Object.getOwnPropertyNames(i); + return e.length === r.length && e.every(e => { + return Object(s.i)(t[e], i[e]); + }); + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'b', function () { + return n; + }); + const s = 'https://connatix.com/privacy-policy/', n = 'v'; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + for (var e in t) + i.hasOwnProperty(e) || (i[e] = t[e]); + } + Object.defineProperty(i, '_', { value: !0 }), s(e(134)), s(e(135)), s(e(136)), s(e(137)); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'b', function () { + return r; + }), e.d(i, 'a', function () { + return h; + }); + class s { + } + s.clientAb0 = 0, s.clientAb1 = 0; + class n { + } + var r; + n.clientAb0 = 0, n.clientAb1 = 0, function (t) { + t[t.ElementsABService = 0] = 'ElementsABService', t[t.PlayspaceABService = 1] = 'PlayspaceABService'; + }(r || (r = {})); + class h { + static get clientAb0() { + return this.getABValueForKey('clientAb0'); + } + static get clientAb1() { + return this.getABValueForKey('clientAb1'); + } + static getABValueForKey(t) { + switch (this.abServiceType) { + case r.PlayspaceABService: + return n[t]; + default: + return s[t]; + } + } + } + }, + function (t, i, e) { + 'use strict'; + function s(t) { + for (var e in t) + i.hasOwnProperty(e) || (i[e] = t[e]); + } + Object.defineProperty(i, '_', { value: !0 }), s(e(66)), s(e(138)), s(e(67)), s(e(68)), s(e(139)), s(e(56)), s(e(69)), s(e(140)), s(e(141)); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return h; + }); + var s = e(9), n = e(3), r = e(7); + class h { + static Mi() { + const t = h.Ei; + return h.Ei++, t; + } + static Li(t) { + return h.Ri[t]; + } + static Bi(t) { + t.forEach(t => { + h.Ri[t.advertiserLineItemId] && h.addCustomHistoryLine('duplicate', { id: t.advertiserLineItemId }), h.Ri[t.advertiserLineItemId] = h.Mi(); + }); + } + static Di(t) { + return t.map(t => { + return { + advertiserLineItemId: t.advertiserLineItemId, + creativeType: t.creativeType, + impressionTimeout: t.impressionTimeSpent, + lineItemPriority: t.lineItemPriority, + playerSize: t.playerSize, + requestCap: t.requestCap, + sound: t.sound, + viewability: t.viewability + }; + }); + } + static setClientSideAdList(t) { + h.Fi && (h.Vi = h.Di(JSON.parse(JSON.stringify(t))), h.Bi(h.Vi)); + } + static setRtbAdList(t) { + h.Fi && (h.Ui = h.Di(JSON.parse(JSON.stringify(t))), h.Bi(h.Ui)); + } + static setHeaderBidderAdList(t) { + h.Fi && (h.$i = h.Di(JSON.parse(JSON.stringify(t))), h.Bi(h.$i)); + } + static setTamAdList(t) { + h.Fi && (h.Ni = h.Di(JSON.parse(JSON.stringify(t))), h.Bi(h.Ni)); + } + static setLineItemStatus(t, i) { + if (!h.Fi) + return; + const e = h.Li(t); + h.Hi.push({ + type: 'status', + id: e, + status: s.a[i] + }); + } + static setVpaidEvent(t, i) { + if (h.Fi) + try { + const e = h.Li(t); + switch (i) { + case n.b.AdLoaded: + case n.b.AdStarted: + case n.b.AdError: + case n.b.AdSkipped: + case n.b.AdStopped: + case n.b.AdPaused: + case n.b.AdPlaying: + case n.b.AdImpression: + h.Hi.push({ + type: 'vpaid', + id: e, + event: i + }); + } + } catch (t) { + } + } + static setViewabilityState(t) { + h.Fi && h.Hi.push({ + type: 'view', + inView: t + }); + } + static setFocusState(t) { + h.Fi && h.Hi.push({ + type: 'focus', + inView: t + }); + } + static setAdState(t) { + h.Fi && h.Hi.push({ + type: 'adState', + state: r.ProtoAdSlotsEnum[t] + }); + } + static enforcerAction(t) { + h.Fi && h.Hi.push({ + type: 'enforcer', + action: t + }); + } + static addCustomHistoryLine(t, i) { + h.Fi && h.Hi.push(Object.assign({ type: t }, i)); + } + static getJsonString() { + return h.Fi ? JSON.stringify({ + clientAdList: h.Vi, + rtbAdList: h.Ui, + headerBidderAdList: h.$i, + mappedAdList: h.Ri, + history: h.Hi + }).substring(0, h.qi) : ''; + } + static playerDestroyed() { + this.zi = !0; + } + static isPlayerDestroyed() { + return this.zi; + } + } + h.Fi = Date.now() - 1581093917537 < 0, h.qi = 50000, h.Ei = 0, h.Ri = {}, h.Vi = [], h.Ui = [], h.$i = [], h.Ni = [], h.Hi = [], h.zi = !1; + }, + function (t, i, e) { + 'use strict'; + var s; + e.d(i, 'a', function () { + return s; + }), function (t) { + t[t.P1 = 1] = 'P1', t[t.P2 = 2] = 'P2', t[t.P3 = 3] = 'P3', t[t.P4 = 4] = 'P4', t[t.P5 = 5] = 'P5', t[t.P6 = 6] = 'P6', t[t.P7 = 7] = 'P7', t[t.P8 = 8] = 'P8', t[t.P9 = 9] = 'P9', t[t.P10 = 10] = 'P10'; + }(s || (s = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + class s { + constructor() { + this.Wi = !1, this.promise = new Promise((t, i) => { + this.Gi = t, this.Ji = i; + }); + } + Qi() { + this.Wi || (this.Wi = !0); + } + resolve(t) { + this.Qi(), this.Gi(t); + } + reject(t) { + this.Qi(), this.Ji(t); + } + get isPending() { + return !this.Wi; + } + } + }, + function (t, i, e) { + 'use strict'; + (function (t) { + var s = i; + function n(t, i, e) { + for (var s = Object.keys(i), n = 0; n < s.length; ++n) + void 0 !== t[s[n]] && e || (t[s[n]] = i[s[n]]); + return t; + } + function r(t) { + function i(t, e) { + if (!(this instanceof i)) + return new i(t, e); + Object.defineProperty(this, 'message', { + get: function () { + return t; + } + }), Error.captureStackTrace ? Error.captureStackTrace(this, i) : Object.defineProperty(this, 'stack', { value: new Error().stack || '' }), e && n(this, e); + } + return (i.prototype = Object.create(Error.prototype)).constructor = i, Object.defineProperty(i.prototype, 'name', { + get: function () { + return t; + } + }), i.prototype.toString = function () { + return this.name + ': ' + this.message; + }, i; + } + s.asPromise = e(121), s.base64 = e(122), s.EventEmitter = e(123), s.float = e(124), s.inquire = e(125), s.utf8 = e(126), s.pool = e(127), s.LongBits = e(128), s.isNode = Boolean(void 0 !== t && t && t.process && t.process.versions && t.process.versions.node), s.global = s.isNode && t || 'undefined' != typeof window && window || 'undefined' != typeof self && self || this, s.emptyArray = Object.freeze ? Object.freeze([]) : [], s.emptyObject = Object.freeze ? Object.freeze({}) : {}, s.isInteger = Number.isInteger || function (t) { + return 'number' == typeof t && isFinite(t) && Math.floor(t) === t; + }, s.isString = function (t) { + return 'string' == typeof t || t instanceof String; + }, s.isObject = function (t) { + return t && 'object' == typeof t; + }, s.isset = s.isSet = function (t, i) { + var e = t[i]; + return !(null == e || !t.hasOwnProperty(i)) && ('object' != typeof e || (Array.isArray(e) ? e.length : Object.keys(e).length) > 0); + }, s.Buffer = function () { + try { + var t = s.inquire('buffer').Buffer; + return t.prototype.utf8Write ? t : null; + } catch (t) { + return null; + } + }(), s.Xi = null, s.Yi = null, s.newBuffer = function (t) { + return 'number' == typeof t ? s.Buffer ? s.Yi(t) : new s.Array(t) : s.Buffer ? s.Xi(t) : 'undefined' == typeof Uint8Array ? t : new Uint8Array(t); + }, s.Array = 'undefined' != typeof Uint8Array ? Uint8Array : Array, s.Long = s.global.dcodeIO && s.global.dcodeIO.Long || s.global.Long || s.inquire('long'), s.key2Re = /^true|false|0|1$/, s.key32Re = /^-?(?:0|[1-9][0-9]*)$/, s.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/, s.longToHash = function (t) { + return t ? s.LongBits.from(t).toHash() : s.LongBits.zeroHash; + }, s.longFromHash = function (t, i) { + var e = s.LongBits.fromHash(t); + return s.Long ? s.Long.fromBits(e.lo, e.hi, i) : e.toNumber(Boolean(i)); + }, s.merge = n, s.lcFirst = function (t) { + return t.charAt(0).toLowerCase() + t.substring(1); + }, s.newError = r, s.ProtocolError = r('ProtocolError'), s.oneOfGetter = function (t) { + for (var i = {}, e = 0; e < t.length; ++e) + i[t[e]] = 1; + return function () { + for (var t = Object.keys(this), e = t.length - 1; e > -1; --e) + if (1 === i[t[e]] && void 0 !== this[t[e]] && null !== this[t[e]]) + return t[e]; + }; + }, s.oneOfSetter = function (t) { + return function (i) { + for (var e = 0; e < t.length; ++e) + t[e] !== i && delete this[t[e]]; + }; + }, s.toJSONOptions = { + longs: String, + enums: String, + bytes: String, + json: !0 + }, s.Ki = function () { + var t = s.Buffer; + t ? (s.Xi = t.from !== Uint8Array.from && t.from || function (i, e) { + return new t(i, e); + }, s.Yi = t.allocUnsafe || function (i) { + return new t(i); + }) : s.Xi = s.Yi = null; + }; + }.call(this, e(62))); + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(33), n = function () { + function t() { + } + return t.encode = function (t, i) { + var e; + if ('string' == typeof t && (t = parseInt(t, 10)), (e = t.toString(2)).length > i || t < 0) + throw new s.EncodingError(t + ' too large to encode into ' + i); + return e.length < i && (e = '0'.repeat(i - e.length) + e), e; + }, t.decode = function (t, i) { + if (i !== t.length) + throw new s.DecodingError('invalid bit length'); + return parseInt(t, 2); + }, t; + }(); + i.IntEncoder = n; + }, + function (t, i, e) { + 'use strict'; + var s = this && this.Zi || function (t) { + var i = 'function' == typeof Symbol && Symbol.iterator, e = i && t[i], s = 0; + if (e) + return e.call(t); + if (t && 'number' == typeof t.length) + return { + next: function () { + return t && s >= t.length && (t = void 0), { + value: t && t[s++], + done: !t + }; + } + }; + throw new TypeError(i ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }; + Object.defineProperty(i, '_', { value: !0 }); + var n = function () { + function t() { + } + return t.prototype.clone = function () { + var t = this, i = new this.constructor(); + return Object.keys(this).forEach(function (e) { + var s = t.deepClone(t[e]); + void 0 !== s && (i[e] = s); + }), i; + }, t.prototype.deepClone = function (t) { + var i, e, n = typeof t; + if ('number' === n || 'string' === n || 'boolean' === n) + return t; + if (null !== t && 'object' === n) { + if ('function' == typeof t.clone) + return t.clone(); + if (t instanceof Date) + return new Date(t.getTime()); + if (void 0 !== t[Symbol.iterator]) { + var r = []; + try { + for (var h = s(t), a = h.next(); !a.done; a = h.next()) { + var o = a.value; + r.push(this.deepClone(o)); + } + } catch (t) { + i = { error: t }; + } finally { + try { + a && !a.done && (e = h.return) && e.call(h); + } finally { + if (i) + throw i.error; + } + } + return t instanceof Array ? r : new t.constructor(r); + } + var c = {}; + for (var u in t) + t.hasOwnProperty(u) && (c[u] = this.deepClone(t[u])); + return c; + } + }, t; + }(); + i.Cloneable = n; + }, + function (t, i, e) { + 'use strict'; + var s; + !function (t) { + t.prebid = 'prebid', t.bid = 'bid', t.win = 'win', t.impression = 'impression', t.viewableImpression = 'viewableImpression', t.postbid = 'postbid', t.initAd = 'initAd', t.request = 'request'; + }(s || (s = {})); + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }), e.d(i, 'b', function () { + return r; + }); + var s, n = e(0); + !function (t) { + t[t.PreRoll = 0] = 'PreRoll', t[t.MidRoll = 1] = 'MidRoll', t[t.PostRoll = 2] = 'PostRoll', t[t.Standalone = 3] = 'Standalone'; + }(s || (s = {})); + const r = { + [n.ProtoAdSlotsEnum.PreRoll]: s.PreRoll, + [n.ProtoAdSlotsEnum.MidRoll]: s.MidRoll, + [n.ProtoAdSlotsEnum.PostRoll]: s.PostRoll + }; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return d; + }), e.d(i, 'b', function () { + return f; + }); + var s = e(45), n = e(0), r = e(14), h = e(1), a = e(5); + const o = new s.a(n.ProtoAdDomainBlockingResponse, 'AdDomainBlockingService'), c = 2; + let u; + const l = new Map(); + function d(t) { + u || (u = new Promise(i => { + const e = t.find(t => { + return t.blockedDomainsRevisionNumber; + }); + if (!e) + return void i(); + const { + publisherLineItemId: s, + blockedDomainsRevisionNumber: h + } = e, u = `${ r.a.endPoints.base.lineItems }${ s }/blockedDomains_${ h }.bin`; + o.fetchMetadata(u, c).then(t => { + l.set(s, t.domains), i(); + }).catch(() => { + Object(a.a)({ + message: 'AdDomainBlockingService_fetchBlockedDomains_endpoint_unavailable', + level: n.ProtoLoggingLevelEnum.FATAL, + throttle: 2, + sendMaxLog: !1 + }), i(); + }); + })); + } + function f(t, i) { + return new Promise(e => { + Object(h.h)(i) ? u.then(() => { + l.has(t) && l.get(t).some(t => { + return i.includes(t); + }) ? e(!0) : e(!1); + }) : e(!1); + }); + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return o; + }); + var s = e(0), n = e(8), r = e(5), h = e(1), a = e(23); + class o { + constructor(t, i) { + this.te = t, this.ie = i, this.ee = t => { + return new Promise((i, e) => { + a.a.sendProtoRequest({ + ProtoResponse: this.te, + endpoint: t, + requestType: 'GET', + logError: !0 + }).then(t => { + i(t); + }).catch(t => { + e(t); + }); + }); + }; + } + fetchMetadata(t, i = (() => { + return 5; + })()) { + return new Promise((e, s) => { + Object(n.j)(() => { + return this.ee(t); + }, i).then(i => { + if (Object(h.f)(i)) + return e(i); + const n = new Error('invalid metadata'); + return this.se({ + url: t, + metadata: i, + e: n + }), s(n); + }).catch(i => { + this.se({ + url: t, + e: i + }), s(i); + }); + }); + } + se(t) { + var i; + const e = Object(h.h)(null === (i = t.e) || void 0 === i ? void 0 : i.message) ? t.e.message : ''; + -1 === e.indexOf('XhrUtils_XMLHttpRequest_error') && Object(r.a)({ + message: 'MediaMetadataHandler_fetchMetadata', + exception: `${ this.ie }_${ e }:${ JSON.stringify(t) }`, + callStack: t.e && t.e.stack, + level: s.ProtoLoggingLevelEnum.FATAL + }); + } + } + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = function () { + function t() { + } + return t.encode = function (t) { + return +t + ''; + }, t.decode = function (t) { + return '1' === t; + }, t; + }(); + i.BooleanEncoder = s; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + var s, n = e(50), r = e(2), h = e(8); + !function (t) { + const i = [ + 'adBanner', + 'banner-search', + 'abc_banner', + 'Banner_Top', + 'ad_container', + 'pub_300x250', + 'pub_300x250m', + 'pub_728x90', + 'text-ad', + 'text_ad', + 'textAd', + 'text-ad-links', + 'text_ads', + 'text-ads', + 'text-ad-links' + ], e = 'cnxtestadblock', s = function () { + const t = i.join(' '); + return `
`; + }, a = { src: n.a }; + t.detectUsingCSS = function (t) { + try { + let i = !1; + t.document.body.insertAdjacentHTML('beforeend', s()); + const n = t.document.getElementById(e); + return 0 !== n.getBoundingClientRect().height && 0 !== n.getBoundingClientRect().width || (i = !0), t.document.body.removeChild(n), i; + } catch (t) { + return !1; + } + }, t.detectUsingScript = function () { + return new Promise(t => { + const i = Object(h.f)(window).topFrame; + i.googletag && t(!1), Object(r.x)(a, i.document.head, i, () => { + return i.googletag ? t(!1) : t(!0); + }, () => { + return t(!0); + }); + }); + }; + }(s || (s = {})); + }, + function (t, i, e) { + 'use strict'; + var s = e(8), n = e(28), r = e(23), h = e(0), a = e(14), o = e(1), c = e(32), u = e(21); + class l { + constructor(t) { + this.ne = t, this.re = !0, this.he = '', this.ae = !1, this.ce = []; + } + static getInstance(t) { + const i = n.a, e = Object(s.f)(t).topFrame; + return e[i] || (e[i] = new l(e)), e[i]; + } + get userId() { + if (Object(o.h)(this.ue)) + return this.ue.split('_')[0]; + } + set userId(t) { + this.ue = t; + } + get isCcpaApplicable() { + return this.re; + } + set isCcpaApplicable(t) { + this.re = t; + } + get usPrivacyString() { + return this.he; + } + set usPrivacyString(t) { + this.he = t; + } + get consentPayload() { + return this.le; + } + set consentPayload(t) { + this.le || (this.le = t); + } + getScope() { + return this.ne; + } + syncDemandPartner(t) { + if (this.userId) { + const i = { + userId: this.userId, + demandPartner: parseInt(t.demandPartner, 10), + demandPartnerUserId: t.demandPartnerUserId + }; + r.a.sendProtoRequest({ + ProtoRequest: h.ProtoUserSyncRequest, + endpoint: a.a.endPoints.api.syncUrls, + requestData: i, + queryParams: { [c.b]: u.a.version }, + logError: !0 + }).then(t => { + }).catch(t => { + }); + } + } + registerPlsCall(t) { + return this.ae ? (this.ce.push(t), () => { + }) : this.userId ? (t(), () => { + }) : (this.ae = !0, t(), () => { + this.ae = !1, this.ce.forEach(t => { + return t(); + }), this.ce = []; + }); + } + } + var d, f = e(29), p = e(5), b = e(6); + !function (t) { + t.USER_ID = 'cnx_userId'; + }(d || (d = {})); + class v { + constructor(t, i) { + this.de = t, this.fe = i, this.pe = { [d.USER_ID]: 30 }, this.be = [ + 'Facebook App', + 'Google App', + 'Flipboard App', + 'Instagram App', + 'Pinterest App' + ], this.ve = !1; + } + me({ + name: t, + value: i + }) { + t === d.USER_ID && (this.de.userId = this.ge(i)); + } + ye(t) { + let i = ''; + const e = this.pe[t.name]; + if (e) { + i = `; expires=${ new Date(Object(f.b)(e)).toUTCString() }`; + } + this.fe.document.cookie = `${ t.name }=${ t.value }${ i }; path=/`; + } + we(t, i) { + if (!Object(b.h)(t)) + return; + const e = { + cookieList: t, + secureMode: i ? h.ProtoCookieSecureModeEnum.Unsecure : h.ProtoCookieSecureModeEnum.Auto, + browserInfo: this.Oe + }; + return r.a.sendProtoRequest({ + requestData: e, + ProtoRequest: h.ProtoCookieSyncRequest, + endpoint: a.a.endPoints.api.cookie, + withCredentials: !0, + queryParams: { [c.b]: u.a.version }, + logError: !1 + }).catch(t => { + return Object(p.a)({ + message: 'UserCookieManager_setThirdPartyCookie', + exception: t.message, + callStack: t.callStack, + level: h.ProtoLoggingLevelEnum.FATAL + }); + }); + } + ge(t) { + return t.split('_')[0]; + } + xe(t) { + try { + const i = t + '=', e = decodeURIComponent(this.fe.document.cookie).split(';'); + for (let t of e) { + for (; ' ' === t.charAt(0);) + t = t.substring(1); + if (0 === t.indexOf(i)) + return this.ge(t.substring(i.length, t.length)); + } + } catch (t) { + } + return ''; + } + getUserId() { + return this.de.userId; + } + syncFirstPartyCookie(t) { + const i = { + name: t, + value: '', + timestamp: Object(f.b)(this.pe[t]) + }; + t === d.USER_ID && (i.value = this.de.userId), Object(o.h)(i.value) && this.ye(i); + } + syncThirdPartyCookieList(t) { + const i = [d.USER_ID], e = []; + i.forEach(t => { + t === d.USER_ID && Object(o.h)(this.de.userId) && e.push({ + name: d.USER_ID, + value: this.de.userId, + timestamp: Object(f.b)(this.pe[d.USER_ID]) + }); + }), this.we(e, t); + } + setBrowserInfo(t, i) { + this.Oe = t, this.ve = this.be.includes(t.browserType), this.ve && i && this.syncThirdPartyCookieList(this.ve); + } + setUserInformation(t) { + t && this.me({ + name: d.USER_ID, + value: t.userId + }); + } + fetchCookies() { + [d.USER_ID].map(t => { + return { + name: t, + value: this.xe(t) + }; + }).filter(({value: t}) => { + return Object(o.h)(t); + }).forEach(t => { + return this.me(t); + }); + } + get unsecuredCookieSync() { + return this.ve; + } + } + var m = e(22); + const g = { + [m.a.CmpApi]: { + windowPropertyName: '__cmp', + framePropertyName: '__cmpLocator', + getVendorConsentDataMethodName: 'getVendorConsents', + getConsentDataMethodName: 'getConsentData' + }, + [m.a.TcfApi]: { + windowPropertyName: '__tcfapi', + framePropertyName: '__tcfapiLocator', + getVendorConsentDataMethodName: 'getTCData', + consentUpdateMethodName: 'addEventListener', + removeUpdateListenerMethodName: 'removeEventListener' + } + }; + class y { + constructor(t, i) { + this.Se = t, this.je = i, this.apiType = m.a.CmpApi, this.ke = {}, this.le = null, this._e = t => { + return new Promise((i, e) => { + try { + const s = 'string' == typeof t.data ? JSON.parse(t.data) : t.data; + if ('object' == typeof s && s.Ae) + if (s.Ae.callId === this.Ie) { + const t = s.Ae.returnValue && s.Ae.returnValue.vendorConsents; + this.Ce(t).then(() => { + return i(this.Ie); + }); + } else if (s.Ae.callId === this.Te) { + const t = s.Ae.returnValue && s.Ae.returnValue.consentData; + this.Pe(t).then(() => { + return i(this.Te); + }); + } + } catch (t) { + e(); + } + }); + }; + } + isApiOnPage() { + return null !== this.Se || null !== this.je; + } + bindToApi() { + return null !== this.Se ? new Promise((t, i) => { + this.Me(this.Se).then(() => { + return t(); + }).catch(t => { + return i(t); + }); + }) : null !== this.je ? this.Ee(this.je) : Promise.reject(); + } + isConsentForVendor(t) { + return !!this.ke[t]; + } + getConsentPayload() { + return this.le; + } + setInAppConsentData(t) { + this.Ce(t), this.Pe(t.consentString); + } + hasIvtConsent() { + return this.isConsentForVendor(n.c.Connatix); + } + isConsentForPurposes(t) { + return !0; + } + Ee(t) { + this.Te = Object(s.c)(), this.Ie = Object(s.c)(); + const i = {}; + return new Promise(e => { + const s = t => { + this._e(t).then(t => { + i[t] = !0, i[this.Te] && i[this.Ie] && (window.removeEventListener('message', s, !1), e()); + }).catch(t => { + }); + }; + window.addEventListener('message', s, !1); + const n = g[m.a.CmpApi].getVendorConsentDataMethodName, r = g[m.a.CmpApi].getConsentDataMethodName; + t.postMessage({ + Le: { + command: n, + parameter: null, + callId: this.Ie + } + }, '*'), t.postMessage({ + Le: { + command: r, + parameter: null, + callId: this.Te + } + }, '*'); + }); + } + Me(t) { + const i = g[m.a.CmpApi].windowPropertyName, e = g[m.a.CmpApi].getVendorConsentDataMethodName, s = g[m.a.CmpApi].getConsentDataMethodName; + if (t && t[i]) { + const n = new Promise(s => { + t[i](e, null, (t, i) => { + if (i) { + const {vendorConsents: i} = t; + this.Ce(i).then(() => { + return s(); + }); + } + }); + }), r = new Promise(e => { + t[i](s, null, (t, i) => { + if (i) { + const {consentData: i} = t; + this.Pe(i).then(() => { + return e(); + }); + } + }); + }); + return Promise.all([ + n, + r + ]); + } + return Promise.reject(); + } + Ce(t) { + return Object(o.f)(t) ? (this.ke = t, Promise.resolve()) : Promise.reject(); + } + Pe(t) { + return Object(o.g)(t) ? (this.le = t, Promise.resolve()) : Promise.reject(); + } + } + var w = e(2), O = e(77), x = e(78); + const S = (t, i) => { + const e = g[i].windowPropertyName; + return Object(w.r)(t, e); + }, j = (t, i) => { + const e = g[i].framePropertyName; + return Object(w.q)(t, e); + }, k = (t, i) => { + return null !== S(t, i) || null !== j(t, i); + }, _ = t => { + const i = O.TCString.decode(t), e = {}, s = {}; + return i.vendorConsents.forEach((t, i) => { + return e[i] = t; + }), i.purposeConsents.forEach((t, i) => { + return s[i] = t; + }), { + vendorConsents: e, + purposeConsents: s, + tcString: t + }; + }, A = t => { + const i = x.decodeConsentString(t); + let e = ''; + const s = i.maxVendorId; + for (let t = 1; t <= s; t++) + e += '0'; + const n = e.split(''); + return i.allowedVendorIds.forEach(t => { + n[t - 1] = '1'; + }), (t => { + const i = { consentString: t }; + for (let e = 0; e < t.length; e++) + i[e + 1] = '1' === t[e]; + return i; + })(n.join('')); + }, I = (t, i, e) => { + let s; + try { + s = i(t); + } catch (t) { + } + if (Object(o.f)(s)) + return s; + try { + s = e(t); + } catch (t) { + } + return s; + }, C = t => { + var i; + return Object(o.h)(null === (i = t) || void 0 === i ? void 0 : i.tcString); + }, T = t => { + var i; + return Object(o.h)(null === (i = t) || void 0 === i ? void 0 : i.consentString); + }, P = ({ + cmpEncodedString: t, + tcfEncodedString: i + }) => { + if (!Object(o.h)(t) && !Object(o.h)(i)) + return null; + let e = null; + return Object(o.h)(i) && (e = I(i, _, A)), Object(o.f)(e) ? e : Object(o.h)(t) ? (e = I(t, A, _), Object(o.f)(e) ? e : (Object(p.a)({ + message: 'UserManagerService_getDecodedConsentData', + exception: 'cmpEncodedString failed to decode', + callStack: JSON.stringify({ + cmpEncodedString: t, + tcfEncodedString: i + }), + level: h.ProtoLoggingLevelEnum.FATAL + }), null)) : (Object(p.a)({ + message: 'UserManagerService_getDecodedConsentData', + exception: 'tcfEncodedString failed to decode', + callStack: JSON.stringify({ tcfEncodedString: i }), + level: h.ProtoLoggingLevelEnum.FATAL + }), null); + }, M = 'useractioncomplete', E = 'tcloaded'; + class L { + constructor(t, i) { + this.Re = t, this.Be = i, this.apiType = m.a.TcfApi, this.De = t => { + return new Promise((i, e) => { + try { + let s = t.data; + if ('string' == typeof t.data) + try { + s = JSON.parse(t.data); + } catch (t) { + s = void 0; + } + if ('object' == typeof s && s.Fe && s.Fe.callId === this.Ve) { + const t = s.Fe.returnValue.tcString; + this.Ce(t).then(() => { + return i(this.Ve); + }).catch(t => { + return e(); + }); + } + } catch (t) { + e(); + } + }); + }; + } + isApiOnPage() { + return null !== this.Re || null !== this.Be; + } + bindToApi() { + return null !== this.Re ? new Promise((t, i) => { + this.Me(this.Re).then(() => { + return t(); + }).catch(t => { + return i(t); + }); + }) : null !== this.Be ? this.Ee(this.Be) : Promise.reject(); + } + isConsentForVendor(t) { + var i, e; + return !(null === (i = this.Ue) || void 0 === i || !i.vendorConsents) && !!(null === (e = this.Ue) || void 0 === e ? void 0 : e.vendorConsents[t]); + } + getConsentPayload() { + var t; + return null === (t = this.Ue) || void 0 === t ? void 0 : t.tcString; + } + setInAppConsentData(t) { + this.Ue = Object.assign(Object.assign({}, this.Ue), t); + } + hasIvtConsent() { + return !0; + } + isConsentForPurposes(t) { + var i; + return !(null === (i = this.Ue) || void 0 === i || !i.purposeConsents) && t.every(t => { + return !!this.Ue.purposeConsents[t]; + }); + } + Ee(t) { + this.Ve = Object(s.c)(); + const i = {}; + return new Promise(e => { + const s = t => { + this.De(t).then(t => { + i[t] = !0, i[this.Ve] && (window.removeEventListener('message', s, !1), e()); + }).catch(t => { + }); + }; + window.addEventListener('message', s, !1); + const n = g[m.a.TcfApi].getVendorConsentDataMethodName; + t.postMessage({ + $e: { + command: n, + parameter: null, + callId: this.Ve + } + }, '*'); + }); + } + Me(t) { + const i = g[m.a.TcfApi].windowPropertyName, e = g[m.a.TcfApi].consentUpdateMethodName, s = g[m.a.TcfApi].removeUpdateListenerMethodName; + return t && t[i] ? new Promise(t => { + this.Re[i](e, 2, (e, n) => { + if (n && (e.eventStatus === M || e.eventStatus === E)) { + const n = e.tcString; + this.Ce(n).then(() => { + return t(); + }), this.Re[i](s, 2, () => { + return void 0; + }, e.listenerId); + } + }); + }) : Promise.reject(); + } + Ce(t) { + const i = P({ tcfEncodedString: t }); + return C(i) ? (this.Ue = i, Promise.resolve()) : Promise.reject(); + } + } + var R = e(37); + const B = [ + R.a.P1, + R.a.P2, + R.a.P4, + R.a.P7, + R.a.P8 + ]; + class D { + constructor(t, i, e = (() => { + return {}; + })()) { + var s, n; + this.Ne = t, this.fe = i; + const r = P({ + cmpEncodedString: null === (s = e.cmp) || void 0 === s ? void 0 : s.consentString, + tcfEncodedString: null === (n = e.tcf) || void 0 === n ? void 0 : n.tcString + }), a = this.He(r); + null !== a ? (this.qe(a), (C(r) || T(r)) && this.ze.setInAppConsentData(r)) : Object(p.a)({ + message: 'UserManagerService_UserConsentApiManager', + exception: 'failed to find the right api, no consent string and no framework on page was found', + callStack: JSON.stringify({ _appSettings: e }), + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + setPageUrl(t) { + this.We = t; + } + setAmpUserConsent(t) { + var i, e; + if (!this.isConsentRequired()) + return; + const s = t.consentStringTypeEnum.US_PRIVACY_STRING, n = null === (i = t.consentMetadata) || void 0 === i ? void 0 : i.consentStringType, r = t.encodeConsentString || (null === (e = t.consentMetadata) || void 0 === e ? void 0 : e.additionalConsent); + let a; + if (!Object(o.h)(r)) + return void Object(p.a)({ + level: h.ProtoLoggingLevelEnum.INFO, + message: 'AMP_no_consent_string_provided', + callStack: JSON.stringify(t), + exception: this.We + }); + if (n === s) + return void Object(p.a)({ + message: 'UserConsentApiManager_CCPA_encoded_string_from_amp_not_used', + level: h.ProtoLoggingLevelEnum.WARNING, + callStack: r, + exception: `${ JSON.stringify(t) }__pageURL_${ this.We }`, + throttle: 2, + sendMaxLog: !1 + }); + const c = P({ + tcfEncodedString: r, + cmpEncodedString: r + }); + C(c) ? a = new L(null, null) : T(c) && (a = new y(null, null)), a ? a ? (this.ze = a, this.ze.setInAppConsentData(c)) : Object(p.a)({ + message: 'UserConsentApiManager_amp_userConsentApi_not_found', + level: h.ProtoLoggingLevelEnum.WARNING, + callStack: r, + exception: `${ JSON.stringify(t) }__pageURL__${ this.We }`, + throttle: 2, + sendMaxLog: !1 + }) : Object(p.a)({ + message: 'UserConsentApiManager_encoded_string_not_tcf_and_not_cmp', + level: h.ProtoLoggingLevelEnum.WARNING, + callStack: r, + exception: `${ JSON.stringify(t) }__pageURL__${ this.We }`, + throttle: 2, + sendMaxLog: !1 + }); + } + isConsentRequired() { + return this.Ne; + } + isConsent(t, i = (() => { + return []; + })()) { + if (this.isConsentRequired()) { + return this.ze.isConsentForVendor(t) && this.ze.isConsentForPurposes(i); + } + return !0; + } + isConsentConnatix() { + return this.isConsent(n.c.Connatix, B); + } + getConsentDataPayload() { + return this.ze.getConsentPayload(); + } + bindToConsentApi() { + return this.ze.bindToApi(); + } + isConsentApiOnPage() { + return this.ze.isApiOnPage(); + } + hasIVTConsent() { + return this.ze.hasIvtConsent(); + } + getConsentApiType() { + return this.ze.apiType; + } + qe(t) { + const i = S(this.fe, t), e = j(this.fe, t); + t === m.a.TcfApi ? this.ze = new L(i, e) : this.ze = new y(i, e); + } + He(t) { + if (C(t)) + return m.a.TcfApi; + if (T(t)) + return m.a.CmpApi; + return k(this.fe, m.a.TcfApi) ? m.a.TcfApi : k(this.fe, m.a.CmpApi) ? m.a.CmpApi : m.a.TcfApi; + } + } + var F = e(19); + const V = 'UserThirdPartySyncManager_Pubmatic', U = 'CookieSync_syncScript_not_properly_loaded', $ = 'CookieSync_param_not_parsed_properly', N = (t, i, e) => { + return new Promise((s, n) => { + const r = Object(F.b)('p', t), h = Object(F.b)('predirect', t); + if (window.PubMaticSync) { + if (!H(r, h)) + return void n(); + q(r, h, i, e), s(!0); + } else + Object(w.x)({ src: '//ads.pubmatic.com/AdServer/js/userSync.js' }, window.document.head, window, () => { + H(r, h) ? (q(r, h, i, e), s(!0)) : n(); + }, () => { + n(); + }, !0, V); + }); + }, H = (t, i) => { + if (!window.PubMaticSync) + return z(U, 'PUBMATIC'), !1; + const e = Number.parseInt(t, 10); + return Object(o.d)(e) ? !!Object(o.h)(i) || (z($, 'PUBMATIC', 'predirect'), !1) : (z($, 'PUBMATIC', 'p'), !1); + }, q = (t, i, e, s) => { + const n = { + pubId: Number.parseInt(t, 10), + url: i + }; + e && (n.delay = 1000, n.gdpr = 1, n.gdprConsent = s), window.PubMaticSync.sync(n); + }, z = (t, i, e = (() => { + return ''; + })()) => { + Object(p.a)({ + message: t, + callStack: i, + exception: e, + level: h.ProtoLoggingLevelEnum.FATAL, + throttle: 1, + sendMaxLog: !1 + }); + }, W = 'yellowblue.io'; + class G { + constructor(t, i) { + this.Ge = t, this.Ne = i, this.Je = []; + } + replaceuserIdMacros(t, i) { + let e = t; + return e = (e = (e = e.replace('%5BuserId%5D', i)).replace('[userId]', i)).replace('%7bUSER_ID%7d', i); + } + Qe(t, i) { + try { + if (this.Xe(t)) { + const e = i.document.createElement('iframe'); + e.setAttribute('style', 'width:1px;height:1px;border:0px;margin:0px;padding:0px'), e.src = t.url, i.document.body.appendChild(e); + } else + Object(w.x)({ src: t.url }, i.document.head, i, null, null, 1 === Object(s.k)([ + 95, + 5 + ]), 'UserManager_unable_to_insert_sync_url_script'); + return !0; + } catch (t) { + return !1; + } + } + Xe(t) { + switch (t.vendorId) { + case n.c.Rubicon: + case n.c.Pubmatic: + return !0; + default: + return t.url.indexOf(W) > -1; + } + } + syncUrls(t, i) { + this.Je.forEach(e => { + if (this.Ge.isConsent(e.vendorId) && !e.synced) { + if (e.vendorId === n.c.Pubmatic) + return void N(e.url, this.Ge.isConsentRequired(), this.Ge.getConsentDataPayload()).then(() => { + e.synced = !0; + }); + if (-1 !== e.url.indexOf('openx.net')) + return e.url = `${ e.url.split('r=')[0] }&r=\n ${ encodeURIComponent(`https://capi.connatix.com/core/us?DemandPartner=8&UserId=${ t }&DemandPartnerUserId=`) }`, e.url = this.replaceuserIdMacros(e.url, t), r.a.trackPixel(e.url), void (e.synced = !0); + if (e.url.indexOf('pixel.advertising.com') > -1 && (e.url = e.url.replace('gdpr=', `gdpr=${ this.Ge.isConsentRequired() ? 1 : 0 }`), e.url = e.url.replace('gdpr_consent=', 'gdpr_consent=0')), e.url = this.replaceuserIdMacros(e.url, t), this.Ne) { + e.url = Object(F.e)(e.url, 'gdpr', '1'); + const t = this.Ge.getConsentDataPayload(); + e.url = Object(F.e)(e.url, 'gdpr_consent', t); + } + this.Qe(e, i) && (e.synced = !0); + } + }); + } + setSyncUrls(t = (() => { + return {}; + })()) { + return !(this.Je.length > 0) && (this.Je = [], Object.keys(t).forEach(i => { + this.Je.push({ + vendorId: i, + url: t[i], + synced: !1 + }); + }), !0); + } + } + var J = e(38); + const Q = { + subdivision: { California: 5332921 }, + country: { US: 6252001 } + }; + class X { + constructor(t, i) { + this.de = t, this.Ye = 1, this.Ke = '__uspapi', this.Ze = 'getUSPData', this.ts(i); + } + getUsPrivacyString() { + if (this.de.usPrivacyString || this.de.isCcpaApplicable) + return this.de.usPrivacyString; + } + isCcpaApplicable() { + return this.de.isCcpaApplicable; + } + isSellUserAllowed() { + return !this.de.isCcpaApplicable || this.es(); + } + setGeoLocation(t) { + this.ss = t, t.subdivisionId !== Q.subdivision.California && (this.de.isCcpaApplicable = !1); + } + fetchUsPrivacyString() { + return this.ns() && this.rs(), this.isCcpaApplicable() ? new Promise(t => { + this.getUsPrivacyString() ? t() : t(this.hs()); + }) : Promise.resolve(); + } + hs() { + return new Promise((t, i) => { + const e = this.de.getScope()[this.Ke]; + e ? e(this.Ze, this.Ye, (e, s) => { + s ? (this.ts(e.uspString), t()) : i(); + }) : i(); + }); + } + es() { + return !this.de.usPrivacyString || Object(b.g)(this.de.usPrivacyString, n.b); + } + ts(t) { + this.de.usPrivacyString = t; + } + ns() { + if (!Object(s.k)([ + 95, + 5 + ])) + return !1; + const t = new Date(2020, 10, 16, 12, 0, 0).getTime(), i = new Date(2020, 10, 17, 12, 0, 0).getTime(); + return Object(f.d)(t, i); + } + rs() { + const { + countryGeoId: t, + subdivisionId: i + } = this.ss; + t === Q.country.US && Object(p.a)({ + message: 'UserCcpaManager_logCCPA', + level: h.ProtoLoggingLevelEnum.INFO, + callStack: JSON.stringify(i), + exception: this.de.usPrivacyString + }); + } + } + var Y, K; + e.d(i, 'a', function () { + return Y; + }), e.d(i, 'b', function () { + return Z; + }), function (t) { + t.CCPA_INFO_RECEIVED = 'ccpaInfoReceived', t.CONSENT_DATA_UPDATE = 'consentDataUpdate'; + }(Y || (Y = {})), function (t) { + t.SYNC_URLS_RECEIVED = 'thirdPartySyncUrlsReceived', t.USER_INFO_RECEIVED = 'userInfoReceived'; + }(K || (K = {})); + class Z { + constructor(t, i, e, s = (() => { + return {}; + })()) { + this.cs = i, this.us = e, this._appSettings = s, this.gdprConsentMode = h.ProtoGdprConsentModeEnum.Unknown, this.ls = {}, this.ds = '', this.fs = !1, this.ps = () => { + !this.Ge.isConsentRequired() || this.cs ? this.resolveEvent(Y.CONSENT_DATA_UPDATE) : (this.gdprConsentMode = this.Ge.isConsentApiOnPage() || this.us ? h.ProtoGdprConsentModeEnum.NoConsent : h.ProtoGdprConsentModeEnum.NoCmp, this.Ge.bindToConsentApi().then(() => { + this.isConsentConnatix() || (this.gdprConsentMode = h.ProtoGdprConsentModeEnum.NoConnatixConsent), this.resolveEvent(Y.CONSENT_DATA_UPDATE); + }).catch(t => { + })); + }, this.bs = () => { + this.isConsentConnatix() && (this.onEvent([K.USER_INFO_RECEIVED]).then(() => { + this.fs && (this.vs.syncThirdPartyCookieList(), this.vs.unsecuredCookieSync && this.vs.syncThirdPartyCookieList(this.vs.unsecuredCookieSync), this.vs.syncFirstPartyCookie(d.USER_ID)); + }), this.onEvent([ + K.SYNC_URLS_RECEIVED, + Y.CONSENT_DATA_UPDATE, + Y.CCPA_INFO_RECEIVED + ]).then(() => { + if (this.isConsentConnatix() && this.ms.isSellUserAllowed()) + try { + this.gs.syncUrls(this.de.userId, this.de.getScope()); + } catch (t) { + Object(p.a)({ + level: h.ProtoLoggingLevelEnum.WARNING, + message: 'UserManager_syncUrls', + exception: t.message, + callStack: t.stack + }); + } + })); + }; + try { + this.de = l.getInstance(t), this.cs || (this.vs = new v(this.de, t)); + const { + cmp: i, + tcf: e + } = this._appSettings; + this.Ge = new D(!!this.ds, t, { + cmp: i, + tcf: e + }), this.gs = new G(this.Ge, this.isGDPR()), this.ms = new X(this.de, this._appSettings.usPrivacyString), this.ys(); + } catch (t) { + Object(p.a)({ + callStack: t.stack, + exception: t.message, + message: 'UserManager_constructor', + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + } + ys() { + this.vs && this.vs.fetchCookies(), this.ps(), this.onEvent([Y.CONSENT_DATA_UPDATE]).then(() => { + setTimeout(() => { + try { + if (this.cs) + return; + this.bs(); + } catch (t) { + Object(p.a)({ + callStack: t.stack, + exception: t.message, + message: 'UserManager_consent_data_received', + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + }, 0); + }); + } + ws(t) { + return void 0 === this.ls[t] && (this.ls[t] = new J.a(), this.ls[t].promise.catch(() => { + return this.ls[t].reject(); + })), this.ls[t]; + } + resolveEvent(t, i) { + this.ws(t).resolve(i); + } + setAmpUserConsent(t) { + this.Ge.setAmpUserConsent(t), this.resolveEvent(Y.CONSENT_DATA_UPDATE); + } + setPageUrl(t) { + this.Ge && this.Ge.setPageUrl(t); + } + onEvent(t) { + const i = t.map(t => { + return this.ws(t).promise; + }); + return Promise.all(i); + } + isConsent(t, i) { + return this.Ge.isConsent(t, i); + } + isConsentConnatix() { + return this.Ge.isConsentConnatix(); + } + getConsentPayload() { + return this.Ge.getConsentDataPayload(); + } + isConsentRequired() { + return this.Ge.isConsentRequired(); + } + setThirdPartySyncUrls(t) { + this.cs || this.gs.setSyncUrls(t) && this.resolveEvent(K.SYNC_URLS_RECEIVED); + } + setGeoLocation(t) { + this.ms.setGeoLocation(t), this.ms.fetchUsPrivacyString().then(() => { + this.resolveEvent(Y.CCPA_INFO_RECEIVED); + }).catch(() => { + this.resolveEvent(Y.CCPA_INFO_RECEIVED); + }); + } + getUserId() { + if (this.isConsentConnatix() && this.vs) + return this.vs.getUserId(); + } + Os() { + return this.vs && this.vs.getUserId(); + } + setUserInformation(t) { + this.vs && (this.vs.setUserInformation(t), this.resolveEvent(K.USER_INFO_RECEIVED), !this.cs && this.isConsentConnatix() && this.vs.syncFirstPartyCookie(d.USER_ID)); + } + isGDPR() { + return !!this.ds; + } + getUsPrivacyString() { + return this.ms.getUsPrivacyString(); + } + isCcpaApplicable() { + return this.ms.isCcpaApplicable(); + } + isSellUserAllowed() { + return this.cs || this.ms.isSellUserAllowed(); + } + getDeviceId() { + if (this.isConsentConnatix()) + return this._appSettings.deviceID; + } + Ss() { + return this._appSettings.deviceID; + } + getTrackableUser() { + return this.cs ? this.getDeviceId() : this.getUserId(); + } + getForcedTrackableUser() { + return this.cs ? this.Ss() : this.Os(); + } + registerPlsCall(t) { + return this.isConsentConnatix() || (this.fs = !0), this.de.registerPlsCall(t); + } + setBrowserInfo(t) { + this.vs && this.vs.setBrowserInfo(t, this.isConsentConnatix()); + } + getGdprConsentApiType() { + return this.Ge.getConsentApiType(); + } + } + }, + function (t, i, e) { + 'use strict'; + var s, n; + e.d(i, 'a', function () { + return r; + }), function (t) { + t.hidden = 'hidden', t.msHidden = 'msHidden', t.webkitHidden = 'webkitHidden'; + }(s || (s = {})), function (t) { + t.visibilitychange = 'visibilitychange', t.msvisibilitychange = 'msvisibilitychange', t.webkitvisibilitychange = 'webkitvisibilitychange'; + }(n || (n = {})); + class r { + constructor(t) { + this.js = t, this.ks = [], this._s(), this.As(); + } + on(t) { + this.ks.push(t), t(this.isDocumentVisible()); + } + off(t) { + this.ks = this.ks.filter(i => { + return i !== t; + }); + } + _s() { + void 0 !== this.js.getDocumentProperty(s.hidden) ? (this.Is = s.hidden, this.Cs = n.visibilitychange) : void 0 !== this.js.getDocumentProperty(s.msHidden) ? (this.Is = s.msHidden, this.Cs = n.msvisibilitychange) : void 0 !== this.js.getDocumentProperty(s.webkitHidden) && (this.Is = s.webkitHidden, this.Cs = n.webkitvisibilitychange); + } + As() { + this.js.addEventListenerOnGlobal(this.Cs, () => { + this.ks.forEach(t => { + t(this.isDocumentVisible()); + }); + }, !0, !1); + } + isDocumentVisible() { + return !this.js.getDocumentProperty(this.Is); + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + const s = '//securepubads.g.doubleclick.net/tag/js/gpt.js'; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(35), n = function () { + function t() { + } + var i, e, n, r, h, a, o, c, u, l, d, f, p, b, v, m, g, y; + return i = s.Fields.cmpId, e = s.Fields.cmpVersion, n = s.Fields.consentLanguage, r = s.Fields.consentScreen, h = s.Fields.created, a = s.Fields.isServiceSpecific, o = s.Fields.lastUpdated, c = s.Fields.policyVersion, u = s.Fields.publisherCountryCode, l = s.Fields.publisherLegitimateInterests, d = s.Fields.publisherConsents, f = s.Fields.purposeConsents, p = s.Fields.purposeLegitimateInterests, b = s.Fields.purposeOneTreatment, v = s.Fields.specialFeatureOptins, m = s.Fields.useNonStandardStacks, g = s.Fields.vendorListVersion, y = s.Fields.version, t[i] = 12, t[e] = 12, t[n] = 12, t[r] = 6, t[h] = 36, t[a] = 1, t[o] = 36, t[c] = 6, t[u] = 12, t[l] = 24, t[d] = 24, t[f] = 24, t[p] = 24, t[b] = 1, t[v] = 12, t[m] = 1, t[g] = 12, t[y] = 6, t.anyBoolean = 1, t.encodingType = 1, t.maxId = 16, t.numCustomPurposes = 6, t.numEntries = 12, t.numRestrictions = 12, t.purposeId = 6, t.restrictionType = 2, t.segmentType = 3, t.singleOrRange = 1, t.vendorId = 16, t; + }(); + i.BitLength = n; + }, + function (t, i, e) { + 'use strict'; + var s; + Object.defineProperty(i, '_', { value: !0 }), (s = i.RestrictionType || (i.RestrictionType = {}))[s.NOT_ALLOWED = 0] = 'NOT_ALLOWED', s[s.REQUIRE_CONSENT = 1] = 'REQUIRE_CONSENT', s[s.REQUIRE_LI = 2] = 'REQUIRE_LI'; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(46), n = e(33), r = e(35), h = function () { + function t() { + } + return t.encode = function (t, i) { + for (var e = '', n = 1; n <= i; n++) + e += s.BooleanEncoder.encode(t.has(n)); + return e; + }, t.decode = function (t, i) { + if (t.length !== i) + throw new n.DecodingError('bitfield encoding length mismatch'); + for (var e = new r.Vector(), h = 1; h <= i; h++) + s.BooleanEncoder.decode(t[h - 1]) && e.set(h); + return e.bitLength = t.length, e; + }, t; + }(); + i.FixedVectorEncoder = h; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i, e) { + 'use strict'; + t.exports = e(120); + }, + function (t, i, e) { + 'use strict'; + t.exports = l; + var s, n = e(39), r = n.LongBits, h = n.base64, a = n.utf8; + function o(t, i, e) { + this.fn = t, this.len = i, this.next = void 0, this.val = e; + } + function c() { + } + function u(t) { + this.head = t.head, this.tail = t.tail, this.len = t.len, this.next = t.states; + } + function l() { + this.len = 0, this.head = new o(c, 0, 0), this.tail = this.head, this.states = null; + } + var d = function () { + return n.Buffer ? function () { + return (l.create = function () { + return new s(); + })(); + } : function () { + return new l(); + }; + }; + function f(t, i, e) { + i[e] = 255 & t; + } + function p(t, i) { + this.len = t, this.next = void 0, this.val = i; + } + function b(t, i, e) { + for (; t.hi;) + i[e++] = 127 & t.lo | 128, t.lo = (t.lo >>> 7 | t.hi << 25) >>> 0, t.hi >>>= 7; + for (; t.lo > 127;) + i[e++] = 127 & t.lo | 128, t.lo = t.lo >>> 7; + i[e++] = t.lo; + } + function v(t, i, e) { + i[e] = 255 & t, i[e + 1] = t >>> 8 & 255, i[e + 2] = t >>> 16 & 255, i[e + 3] = t >>> 24; + } + l.create = d(), l.alloc = function (t) { + return new n.Array(t); + }, n.Array !== Array && (l.alloc = n.pool(l.alloc, n.Array.prototype.subarray)), l.prototype.Ts = function (t, i, e) { + return this.tail = this.tail.next = new o(t, i, e), this.len += i, this; + }, p.prototype = Object.create(o.prototype), p.prototype.fn = function (t, i, e) { + for (; t > 127;) + i[e++] = 127 & t | 128, t >>>= 7; + i[e] = t; + }, l.prototype.uint32 = function (t) { + return this.len += (this.tail = this.tail.next = new p((t >>>= 0) < 128 ? 1 : t < 16384 ? 2 : t < 2097152 ? 3 : t < 268435456 ? 4 : 5, t)).len, this; + }, l.prototype.int32 = function (t) { + return t < 0 ? this.Ts(b, 10, r.fromNumber(t)) : this.uint32(t); + }, l.prototype.sint32 = function (t) { + return this.uint32((t << 1 ^ t >> 31) >>> 0); + }, l.prototype.uint64 = function (t) { + var i = r.from(t); + return this.Ts(b, i.length(), i); + }, l.prototype.int64 = l.prototype.uint64, l.prototype.sint64 = function (t) { + var i = r.from(t).zzEncode(); + return this.Ts(b, i.length(), i); + }, l.prototype.bool = function (t) { + return this.Ts(f, 1, t ? 1 : 0); + }, l.prototype.fixed32 = function (t) { + return this.Ts(v, 4, t >>> 0); + }, l.prototype.sfixed32 = l.prototype.fixed32, l.prototype.fixed64 = function (t) { + var i = r.from(t); + return this.Ts(v, 4, i.lo).Ts(v, 4, i.hi); + }, l.prototype.sfixed64 = l.prototype.fixed64, l.prototype.float = function (t) { + return this.Ts(n.float.writeFloatLE, 4, t); + }, l.prototype.double = function (t) { + return this.Ts(n.float.writeDoubleLE, 8, t); + }; + var m = n.Array.prototype.set ? function (t, i, e) { + i.set(t, e); + } : function (t, i, e) { + for (var s = 0; s < t.length; ++s) + i[e + s] = t[s]; + }; + l.prototype.bytes = function (t) { + var i = t.length >>> 0; + if (!i) + return this.Ts(f, 1, 0); + if (n.isString(t)) { + var e = l.alloc(i = h.length(t)); + h.decode(t, e, 0), t = e; + } + return this.uint32(i).Ts(m, i, t); + }, l.prototype.string = function (t) { + var i = a.length(t); + return i ? this.uint32(i).Ts(a.write, i, t) : this.Ts(f, 1, 0); + }, l.prototype.fork = function () { + return this.states = new u(this), this.head = this.tail = new o(c, 0, 0), this.len = 0, this; + }, l.prototype.reset = function () { + return this.states ? (this.head = this.states.head, this.tail = this.states.tail, this.len = this.states.len, this.states = this.states.next) : (this.head = this.tail = new o(c, 0, 0), this.len = 0), this; + }, l.prototype.ldelim = function () { + var t = this.head, i = this.tail, e = this.len; + return this.reset().uint32(e), e && (this.tail.next = t.next, this.tail = i, this.len += e), this; + }, l.prototype.finish = function () { + for (var t = this.head.next, i = this.constructor.alloc(this.len), e = 0; t;) + t.fn(t.val, i, e), e += t.len, t = t.next; + return i; + }, l.Ki = function (t) { + s = t, l.create = d(), s.Ki(); + }; + }, + function (t, i) { + var e; + e = function () { + return this; + }(); + try { + e = e || new Function('return this')(); + } catch (t) { + 'object' == typeof window && (e = window); + } + t.exports = e; + }, + function (t, i, e) { + 'use strict'; + t.exports = o; + var s, n = e(39), r = n.LongBits, h = n.utf8; + function a(t, i) { + return RangeError('index out of range: ' + t.pos + ' + ' + (i || 1) + ' > ' + t.len); + } + function o(t) { + this.buf = t, this.pos = 0, this.len = t.length; + } + var c, u = 'undefined' != typeof Uint8Array ? function (t) { + if (t instanceof Uint8Array || Array.isArray(t)) + return new o(t); + throw Error('illegal buffer'); + } : function (t) { + if (Array.isArray(t)) + return new o(t); + throw Error('illegal buffer'); + }, l = function () { + return n.Buffer ? function (t) { + return (o.create = function (t) { + return n.Buffer.isBuffer(t) ? new s(t) : u(t); + })(t); + } : u; + }; + function d() { + var t = new r(0, 0), i = 0; + if (!(this.len - this.pos > 4)) { + for (; i < 3; ++i) { + if (this.pos >= this.len) + throw a(this); + if (t.lo = (t.lo | (127 & this.buf[this.pos]) << 7 * i) >>> 0, this.buf[this.pos++] < 128) + return t; + } + return t.lo = (t.lo | (127 & this.buf[this.pos++]) << 7 * i) >>> 0, t; + } + for (; i < 4; ++i) + if (t.lo = (t.lo | (127 & this.buf[this.pos]) << 7 * i) >>> 0, this.buf[this.pos++] < 128) + return t; + if (t.lo = (t.lo | (127 & this.buf[this.pos]) << 28) >>> 0, t.hi = (t.hi | (127 & this.buf[this.pos]) >> 4) >>> 0, this.buf[this.pos++] < 128) + return t; + if (i = 0, this.len - this.pos > 4) { + for (; i < 5; ++i) + if (t.hi = (t.hi | (127 & this.buf[this.pos]) << 7 * i + 3) >>> 0, this.buf[this.pos++] < 128) + return t; + } else + for (; i < 5; ++i) { + if (this.pos >= this.len) + throw a(this); + if (t.hi = (t.hi | (127 & this.buf[this.pos]) << 7 * i + 3) >>> 0, this.buf[this.pos++] < 128) + return t; + } + throw Error('invalid varint encoding'); + } + function f(t, i) { + return (t[i - 4] | t[i - 3] << 8 | t[i - 2] << 16 | t[i - 1] << 24) >>> 0; + } + function p() { + if (this.pos + 8 > this.len) + throw a(this, 8); + return new r(f(this.buf, this.pos += 4), f(this.buf, this.pos += 4)); + } + o.create = l(), o.prototype.Ps = n.Array.prototype.subarray || n.Array.prototype.slice, o.prototype.uint32 = (c = 4294967295, function () { + if (c = (127 & this.buf[this.pos]) >>> 0, this.buf[this.pos++] < 128) + return c; + if (c = (c | (127 & this.buf[this.pos]) << 7) >>> 0, this.buf[this.pos++] < 128) + return c; + if (c = (c | (127 & this.buf[this.pos]) << 14) >>> 0, this.buf[this.pos++] < 128) + return c; + if (c = (c | (127 & this.buf[this.pos]) << 21) >>> 0, this.buf[this.pos++] < 128) + return c; + if (c = (c | (15 & this.buf[this.pos]) << 28) >>> 0, this.buf[this.pos++] < 128) + return c; + if ((this.pos += 5) > this.len) + throw this.pos = this.len, a(this, 10); + return c; + }), o.prototype.int32 = function () { + return 0 | this.uint32(); + }, o.prototype.sint32 = function () { + var t = this.uint32(); + return t >>> 1 ^ -(1 & t) | 0; + }, o.prototype.bool = function () { + return 0 !== this.uint32(); + }, o.prototype.fixed32 = function () { + if (this.pos + 4 > this.len) + throw a(this, 4); + return f(this.buf, this.pos += 4); + }, o.prototype.sfixed32 = function () { + if (this.pos + 4 > this.len) + throw a(this, 4); + return 0 | f(this.buf, this.pos += 4); + }, o.prototype.float = function () { + if (this.pos + 4 > this.len) + throw a(this, 4); + var t = n.float.readFloatLE(this.buf, this.pos); + return this.pos += 4, t; + }, o.prototype.double = function () { + if (this.pos + 8 > this.len) + throw a(this, 4); + var t = n.float.readDoubleLE(this.buf, this.pos); + return this.pos += 8, t; + }, o.prototype.bytes = function () { + var t = this.uint32(), i = this.pos, e = this.pos + t; + if (e > this.len) + throw a(this, t); + return this.pos += t, Array.isArray(this.buf) ? this.buf.slice(i, e) : i === e ? new this.buf.constructor(0) : this.Ps.call(this.buf, i, e); + }, o.prototype.string = function () { + var t = this.bytes(); + return h.read(t, 0, t.length); + }, o.prototype.skip = function (t) { + if ('number' == typeof t) { + if (this.pos + t > this.len) + throw a(this, t); + this.pos += t; + } else + do { + if (this.pos >= this.len) + throw a(this); + } while (128 & this.buf[this.pos++]); + return this; + }, o.prototype.skipType = function (t) { + switch (t) { + case 0: + this.skip(); + break; + case 1: + this.skip(8); + break; + case 2: + this.skip(this.uint32()); + break; + case 3: + for (; 4 != (t = 7 & this.uint32());) + this.skipType(t); + break; + case 5: + this.skip(4); + break; + default: + throw Error('invalid wire type ' + t + ' at offset ' + this.pos); + } + return this; + }, o.Ki = function (t) { + s = t, o.create = l(), s.Ki(); + var i = n.Long ? 'toLong' : 'toNumber'; + n.merge(o.prototype, { + int64: function () { + return d.call(this)[i](!1); + }, + uint64: function () { + return d.call(this)[i](!0); + }, + sint64: function () { + return d.call(this).zzDecode()[i](!1); + }, + fixed64: function () { + return p.call(this)[i](!0); + }, + sfixed64: function () { + return p.call(this)[i](!1); + } + }); + }; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + for (var e in t) + i.hasOwnProperty(e) || (i[e] = t[e]); + } + Object.defineProperty(i, '_', { value: !0 }), s(e(65)), s(e(55)), s(e(142)), s(e(146)), s(e(70)), s(e(76)); + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(33), n = function () { + function t() { + } + return t.encode = function (t) { + if (!/^[0-1]+$/.test(t)) + throw new s.EncodingError('Invalid bitField'); + var i = t.length % this.LCM; + t += i ? '0'.repeat(this.LCM - i) : ''; + for (var e = '', n = 0; n < t.length; n += this.BASIS) + e += this.DICT[parseInt(t.substr(n, this.BASIS), 2)]; + return e; + }, t.decode = function (t) { + if (!/^[A-Za-z0-9\-_]+$/.test(t)) + throw new s.DecodingError('Invalidly encoded Base64URL string'); + for (var i = '', e = 0; e < t.length; e++) { + var n = this.REVERSE_DICT.get(t[e]).toString(2); + i += '0'.repeat(this.BASIS - n.length) + n; + } + return i; + }, t.DICT = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_', t.REVERSE_DICT = new Map([ + [ + 'A', + 0 + ], + [ + 'B', + 1 + ], + [ + 'C', + 2 + ], + [ + 'D', + 3 + ], + [ + 'E', + 4 + ], + [ + 'F', + 5 + ], + [ + 'G', + 6 + ], + [ + 'H', + 7 + ], + [ + 'I', + 8 + ], + [ + 'J', + 9 + ], + [ + 'K', + 10 + ], + [ + 'L', + 11 + ], + [ + 'M', + 12 + ], + [ + 'N', + 13 + ], + [ + 'O', + 14 + ], + [ + 'P', + 15 + ], + [ + 'Q', + 16 + ], + [ + 'R', + 17 + ], + [ + 'S', + 18 + ], + [ + 'T', + 19 + ], + [ + 'U', + 20 + ], + [ + 'V', + 21 + ], + [ + 'W', + 22 + ], + [ + 'X', + 23 + ], + [ + 'Y', + 24 + ], + [ + 'Z', + 25 + ], + [ + 'a', + 26 + ], + [ + 'b', + 27 + ], + [ + 'c', + 28 + ], + [ + 'd', + 29 + ], + [ + 'e', + 30 + ], + [ + 'f', + 31 + ], + [ + 'g', + 32 + ], + [ + 'h', + 33 + ], + [ + 'i', + 34 + ], + [ + 'j', + 35 + ], + [ + 'k', + 36 + ], + [ + 'l', + 37 + ], + [ + 'm', + 38 + ], + [ + 'n', + 39 + ], + [ + 'o', + 40 + ], + [ + 'p', + 41 + ], + [ + 'q', + 42 + ], + [ + 'r', + 43 + ], + [ + 's', + 44 + ], + [ + 't', + 45 + ], + [ + 'u', + 46 + ], + [ + 'v', + 47 + ], + [ + 'w', + 48 + ], + [ + 'x', + 49 + ], + [ + 'y', + 50 + ], + [ + 'z', + 51 + ], + [ + '0', + 52 + ], + [ + '1', + 53 + ], + [ + '2', + 54 + ], + [ + '3', + 55 + ], + [ + '4', + 56 + ], + [ + '5', + 57 + ], + [ + '6', + 58 + ], + [ + '7', + 59 + ], + [ + '8', + 60 + ], + [ + '9', + 61 + ], + [ + '-', + 62 + ], + [ + '_', + 63 + ] + ]), t.BASIS = 6, t.LCM = 24, t; + }(); + i.Base64Url = n; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = function (t) { + function i() { + var i = null !== t && t.apply(this, arguments) || this; + return i.root = null, i; + } + return n(i, t), i.prototype.isEmpty = function () { + return !this.root; + }, i.prototype.add = function (t) { + var i, e = { + value: t, + left: null, + right: null + }; + if (this.isEmpty()) + this.root = e; + else + for (i = this.root;;) + if (t < i.value) { + if (null === i.left) { + i.left = e; + break; + } + i = i.left; + } else { + if (!(t > i.value)) + break; + if (null === i.right) { + i.right = e; + break; + } + i = i.right; + } + }, i.prototype.get = function () { + for (var t = [], i = this.root; i;) + if (i.left) { + for (var e = i.left; e.right && e.right != i;) + e = e.right; + e.right == i ? (e.right = null, t.push(i.value), i = i.right) : (e.right = i, i = i.left); + } else + t.push(i.value), i = i.right; + return t; + }, i.prototype.contains = function (t) { + for (var i = !1, e = this.root; e;) { + if (e.value === t) { + i = !0; + break; + } + t > e.value ? e = e.right : t < e.value && (e = e.left); + } + return i; + }, i.prototype.min = function (t) { + var i; + for (void 0 === t && (t = this.root); t;) + t.left ? t = t.left : (i = t.value, t = null); + return i; + }, i.prototype.max = function (t) { + var i; + for (void 0 === t && (t = this.root); t;) + t.right ? t = t.right : (i = t.value, t = null); + return i; + }, i.prototype.remove = function (t, i) { + void 0 === i && (i = this.root); + for (var e = null, s = 'left'; i;) + if (t < i.value) + e = i, i = i.left, s = 'left'; + else if (t > i.value) + e = i, i = i.right, s = 'right'; + else { + if (i.left || i.right) + if (i.left) + if (i.right) { + var n = this.min(i.right); + this.remove(n, i.right), i.value = n; + } else + e ? e[s] = i.left : this.root = i.left; + else + e ? e[s] = i.right : this.root = i.right; + else + e ? e[s] = null : this.root = null; + i = null; + } + }, i; + }(e(41).Cloneable); + i.BinarySearchTree = r; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = function () { + function t() { + } + return t.cmpId = 'cmpId', t.cmpVersion = 'cmpVersion', t.consentLanguage = 'consentLanguage', t.consentScreen = 'consentScreen', t.created = 'created', t.supportOOB = 'supportOOB', t.isServiceSpecific = 'isServiceSpecific', t.lastUpdated = 'lastUpdated', t.numCustomPurposes = 'numCustomPurposes', t.policyVersion = 'policyVersion', t.publisherCountryCode = 'publisherCountryCode', t.publisherCustomConsents = 'publisherCustomConsents', t.publisherCustomLegitimateInterests = 'publisherCustomLegitimateInterests', t.publisherLegitimateInterests = 'publisherLegitimateInterests', t.publisherConsents = 'publisherConsents', t.publisherRestrictions = 'publisherRestrictions', t.purposeConsents = 'purposeConsents', t.purposeLegitimateInterests = 'purposeLegitimateInterests', t.purposeOneTreatment = 'purposeOneTreatment', t.specialFeatureOptins = 'specialFeatureOptins', t.useNonStandardStacks = 'useNonStandardStacks', t.vendorConsents = 'vendorConsents', t.vendorLegitimateInterests = 'vendorLegitimateInterests', t.vendorListVersion = 'vendorListVersion', t.vendorsAllowed = 'vendorsAllowed', t.vendorsDisclosed = 'vendorsDisclosed', t.version = 'version', t; + }(); + i.Fields = s; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = e(41), h = e(33), a = e(56), o = function (t) { + function i(i, e) { + var s = t.call(this) || this; + return void 0 !== i && (s.purposeId = i), void 0 !== e && (s.restrictionType = e), s; + } + return n(i, t), i.unHash = function (t) { + var e = t.split(this.hashSeparator), s = new i(); + if (2 !== e.length) + throw new h.TCModelError('hash', t); + return s.purposeId = parseInt(e[0], 10), s.restrictionType = parseInt(e[1], 10), s; + }, Object.defineProperty(i.prototype, 'hash', { + get: function () { + if (!this.isValid()) + throw new Error('cannot hash invalid PurposeRestriction'); + return '' + this.purposeId + i.hashSeparator + this.restrictionType; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'purposeId', { + get: function () { + return this.purposeId_; + }, + set: function (t) { + this.purposeId_ = t; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.isValid = function () { + return Number.isInteger(this.purposeId) && this.purposeId > 0 && (this.restrictionType === a.RestrictionType.NOT_ALLOWED || this.restrictionType === a.RestrictionType.REQUIRE_CONSENT || this.restrictionType === a.RestrictionType.REQUIRE_LI); + }, i.prototype.isSameAs = function (t) { + return this.purposeId === t.purposeId && this.restrictionType === t.restrictionType; + }, i.hashSeparator = '-', i; + }(r.Cloneable); + i.PurposeRestriction = o; + }, + function (t, i, e) { + 'use strict'; + var s; + Object.defineProperty(i, '_', { value: !0 }), (s = i.Segment || (i.Segment = {})).CORE = 'core', s.VENDORS_DISCLOSED = 'vendorsDisclosed', s.VENDORS_ALLOWED = 'vendorsAllowed', s.PUBLISHER_TC = 'publisherTC'; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + for (var e in t) + i.hasOwnProperty(e) || (i[e] = t[e]); + } + Object.defineProperty(i, '_', { value: !0 }), s(e(46)), s(e(71)), s(e(143)), s(e(57)), s(e(40)), s(e(72)), s(e(73)), s(e(75)), s(e(74)); + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(40), n = e(33), r = function () { + function t() { + } + return t.encode = function (t, i) { + return s.IntEncoder.encode(Math.round(t.getTime() / 100), i); + }, t.decode = function (t, i) { + if (i !== t.length) + throw new n.DecodingError('invalid bit length'); + var e = new Date(); + return e.setTime(100 * s.IntEncoder.decode(t, i)), e; + }, t; + }(); + i.DateEncoder = r; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(40), n = e(33), r = function () { + function t() { + } + return t.encode = function (t, i) { + var e = (t = t.toUpperCase()).charCodeAt(0) - 65, r = t.charCodeAt(1) - 65; + if (e < 0 || e > 25 || r < 0 || r > 25) + throw new n.EncodingError('invalid language code: ' + t); + if (i % 2 == 1) + throw new n.EncodingError('numBits must be even, ' + i + ' is not valid'); + return i /= 2, s.IntEncoder.encode(e, i) + s.IntEncoder.encode(r, i); + }, t.decode = function (t, i) { + if (i !== t.length || t.length % 2) + throw new n.DecodingError('invalid bit length for language'); + var e = t.length / 2, r = s.IntEncoder.decode(t.slice(0, e), e) + 65, h = s.IntEncoder.decode(t.slice(e), e) + 65; + return String.fromCharCode(r) + String.fromCharCode(h); + }, t; + }(); + i.LangEncoder = r; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(55), n = e(46), r = e(33), h = e(40), a = e(35), o = function () { + function t() { + } + return t.encode = function (t) { + var i = h.IntEncoder.encode(t.numRestrictions, s.BitLength.numRestrictions); + return t.isEmpty() || t.getRestrictions().forEach(function (e) { + i += h.IntEncoder.encode(e.purposeId, s.BitLength.purposeId), i += h.IntEncoder.encode(e.restrictionType, s.BitLength.restrictionType); + for (var r = t.getVendors(e), a = r.length, o = 0, c = 0, u = '', l = 0; l < a; l++) { + var d = r[l]; + if (0 === c && (o++, c = d), l === a - 1 || r[l + 1] > d + 1) { + var f = !(d === c); + u += n.BooleanEncoder.encode(f), u += h.IntEncoder.encode(c, s.BitLength.vendorId), f && (u += h.IntEncoder.encode(d, s.BitLength.vendorId)), c = 0; + } + } + i += h.IntEncoder.encode(o, s.BitLength.numEntries), i += u; + }), i; + }, t.decode = function (t) { + var i = 0, e = new a.PurposeRestrictionVector(), o = h.IntEncoder.decode(t.substr(i, s.BitLength.numRestrictions), s.BitLength.numRestrictions); + i += s.BitLength.numRestrictions; + for (var c = 0; c < o; c++) { + var u = h.IntEncoder.decode(t.substr(i, s.BitLength.purposeId), s.BitLength.purposeId); + i += s.BitLength.purposeId; + var l = h.IntEncoder.decode(t.substr(i, s.BitLength.restrictionType), s.BitLength.restrictionType); + i += s.BitLength.restrictionType; + var d = new a.PurposeRestriction(u, l), f = h.IntEncoder.decode(t.substr(i, s.BitLength.numEntries), s.BitLength.numEntries); + i += s.BitLength.numEntries; + for (var p = 0; p < f; p++) { + var b = n.BooleanEncoder.decode(t.substr(i, s.BitLength.anyBoolean)); + i += s.BitLength.anyBoolean; + var v = h.IntEncoder.decode(t.substr(i, s.BitLength.vendorId), s.BitLength.vendorId); + if (i += s.BitLength.vendorId, b) { + var m = h.IntEncoder.decode(t.substr(i, s.BitLength.vendorId), s.BitLength.vendorId); + if (i += s.BitLength.vendorId, m < v) + throw new r.DecodingError('Invalid RangeEntry: endVendorId ' + m + ' is less than ' + v); + for (var g = v; g <= m; g++) + e.add(g, d); + } else + e.add(v, d); + } + } + return e.bitLength = i, e; + }, t; + }(); + i.PurposeRestrictionVectorEncoder = o; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(35), n = e(64), r = e(40), h = e(46), a = e(57), o = e(75), c = e(33), u = function () { + function t() { + } + return t.encode = function (t) { + var i, e = [], s = [], a = r.IntEncoder.encode(t.maxId, n.BitLength.maxId), c = '', u = n.BitLength.maxId + n.BitLength.encodingType, l = u + t.maxId, d = 2 * n.BitLength.vendorId + n.BitLength.singleOrRange + n.BitLength.numEntries, f = u + n.BitLength.numEntries; + return t.forEach(function (r, a) { + c += h.BooleanEncoder.encode(r), (i = t.maxId > d && f < l) && r && (t.has(a + 1) ? 0 === s.length && (s.push(a), f += n.BitLength.singleOrRange, f += n.BitLength.vendorId) : (s.push(a), f += n.BitLength.vendorId, e.push(s), s = [])); + }), i ? (a += o.VectorEncodingType.RANGE + '', a += this.buildRangeEncoding(e)) : (a += o.VectorEncodingType.FIELD + '', a += c), a; + }, t.decode = function (t, i) { + var e, u = 0, l = r.IntEncoder.decode(t.substr(u, n.BitLength.maxId), n.BitLength.maxId); + u += n.BitLength.maxId; + var d = r.IntEncoder.decode(t.charAt(u), n.BitLength.encodingType); + if (u += n.BitLength.encodingType, d === o.VectorEncodingType.RANGE) { + if (e = new s.Vector(), 1 === i) { + if ('1' === t.substr(u, 1)) + throw new c.DecodingError('Unable to decode default consent=1'); + u++; + } + var f = r.IntEncoder.decode(t.substr(u, n.BitLength.numEntries), n.BitLength.numEntries); + u += n.BitLength.numEntries; + for (var p = 0; p < f; p++) { + var b = h.BooleanEncoder.decode(t.charAt(u)); + u += n.BitLength.singleOrRange; + var v = r.IntEncoder.decode(t.substr(u, n.BitLength.vendorId), n.BitLength.vendorId); + if (u += n.BitLength.vendorId, b) { + var m = r.IntEncoder.decode(t.substr(u, n.BitLength.vendorId), n.BitLength.vendorId); + u += n.BitLength.vendorId; + for (var g = v; g <= m; g++) + e.set(g); + } else + e.set(v); + } + } else { + var y = t.substr(u, l); + u += l, e = a.FixedVectorEncoder.decode(y, l); + } + return e.bitLength = u, e; + }, t.buildRangeEncoding = function (t) { + var i = t.length, e = r.IntEncoder.encode(i, n.BitLength.numEntries); + return t.forEach(function (t) { + var i = 1 === t.length; + e += h.BooleanEncoder.encode(!i), e += r.IntEncoder.encode(t[0], n.BitLength.vendorId), i || (e += r.IntEncoder.encode(t[1], n.BitLength.vendorId)); + }), e; + }, t; + }(); + i.VendorVectorEncoder = u; + }, + function (t, i, e) { + 'use strict'; + var s; + Object.defineProperty(i, '_', { value: !0 }), (s = i.VectorEncodingType || (i.VectorEncodingType = {}))[s.FIELD = 0] = 'FIELD', s[s.RANGE = 1] = 'RANGE'; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + for (var e in t) + i.hasOwnProperty(e) || (i[e] = t[e]); + } + Object.defineProperty(i, '_', { value: !0 }), s(e(144)), s(e(145)); + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(64), n = e(35), r = e(40), h = e(147), a = function () { + function t() { + } + return t.encode = function (t, i) { + var e, n, r = ''; + return t = s.SemanticPreEncoder.process(t, i), (n = Array.isArray(null === (e = i) || void 0 === e ? void 0 : e.segments) ? i.segments : new s.SegmentSequence(t, i)['' + t.version]).forEach(function (i, e) { + var h = ''; + e < n.length - 1 && (h = '.'), r += s.SegmentEncoder.encode(t, i) + h; + }), r; + }, t.decode = function (t, i) { + var e = t.split('.'), a = e.length; + i || (i = new h.TCModel()); + for (var o = 0; o < a; o++) { + var c = e[o], u = s.Base64Url.decode(c.charAt(0)).substr(0, s.BitLength.segmentType), l = n.SegmentIDs.ID_TO_KEY[r.IntEncoder.decode(u, s.BitLength.segmentType).toString()]; + s.SegmentEncoder.decode(c, i, l); + } + return i; + }, t; + }(); + i.TCString = a; + }, + function (t, i, e) { + 'use strict'; + var s = e(150).decodeConsentString; + t.exports = { decodeConsentString: s }; + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return F; + }); + var s = e(0), n = e.n(s), r = e(5), h = e(8), a = e(2), o = e(117), c = e(113), u = e(80), l = e(81), d = e(19), f = e(21), p = e(30), b = e(1), v = e(6), m = e(13), g = e(49), y = e(34), w = e(48), O = e(82), x = e(114), S = e(115), j = e(25), k = e(24), _ = e(83), A = e(20), I = e(16), C = e(4), T = e(84), P = e(118), M = e(116), E = e(44), L = e(47), R = e(85); + const B = 'player_instance', D = ','; + class F extends A.a { + constructor(t, i, e, s, n, r) { + super(), this.services = t, this.GLOBAL = i, this.cs = e, this.us = s, this.Ls = n, this.readyCallback = r, this.Rs = {}, this.Bs = '', this.Ds = 100, this.Fs = 1000, this.isServerlessMode = !1, this.Vs = !1, this.Us = [], this.$s = '{{omidVerificationClient}}', this.cs && this.Ns(), this.Hs = L.a.detectUsingCSS(this.GLOBAL), this.qs = Object(a.o)(this.GLOBAL); + } + zs() { + const t = { + playerId: this.externalAttributes.playerId, + _appSettings: this.externalAttributes._appSettings, + settings: { + _connatixInternals: this.externalAttributes.settings._connatixInternals, + advertising: {}, + customization: {}, + rendering: {}, + plugins: {} + } + }; + this.externalAttributes.customParam1 && (t.customParam1 = this.externalAttributes.customParam1), this.externalAttributes.customParam2 && (t.customParam2 = this.externalAttributes.customParam2), this.externalAttributes.customParam3 && (t.customParam3 = this.externalAttributes.customParam3), this.externalAttributes.customParam4 && (t.customParam4 = this.externalAttributes.customParam4), this.externalAttributes.customParam5 && (t.customParam5 = this.externalAttributes.customParam5), this.externalAttributes.settings.useExternalViewabilityService && (t.settings.useExternalViewabilityService = this.externalAttributes.settings.useExternalViewabilityService), this.externalAttributes = t; + } + Ws(t) { + const i = this.GLOBAL.frameElement; + if (!Object(a.B)(i)) + return; + let e = !0; + i && t && (e = !1), e ? Object(a.u)(i) : Object(a.O)(i); + } + Gs(t, i) { + try { + return this.Js(t, i); + } catch (t) { + return null; + } + } + Qs(t) { + let i; + try { + i = eval(t); + } catch (e) { + i = t.replace(/\[(\d+)]/g, ':nth-child($1)'); + } + return i; + } + Ys(t, i) { + const e = this.Gs(t, i); + return null === e ? new Promise(e => { + setTimeout(() => { + e(this.Ys(t, i)); + }, this.Ds); + }) : Promise.resolve(e); + } + Ks(t, i) { + const e = this.Qs(t); + return Promise.resolve(this.Ys(e, i)); + } + Js(t, i) { + let e; + return t.split(/(\.cnxEq\(\d+\))/).filter(t => { + return t; + }).forEach(t => { + e = -1 === t.indexOf('cnxEq') ? e ? e.querySelectorAll(t) : Object(a.H)(t, i) : this.Zs(e, t); + }), e ? (e.hasOwnProperty('length') && (e = e.length > 0 ? e[0] : null), e) : null; + } + Zs(t, i) { + const e = /\d+/g.exec(i), s = parseInt(e[0], 10); + return s > t.length ? Object(v.c)(t)[t.length - 1] : Object(v.c)(t)[s]; + } + tn() { + return this.us ? s.ProtoImplementationType.Amp : s.ProtoImplementationType.Web; + } + in(t, i) { + const e = Object(h.f)(this.GLOBAL); + let s; + return s = Object(b.a)(this.externalAttributes.settings.rendering.forceInsertPath) ? this.externalAttributes.settings.rendering.forceInsertPath : i.forceInsertPath, new Promise((n, r) => { + let h = Object(a.f)(this.Bs, this.GLOBAL); + if (s || t.tag.parentNode === this.GLOBAL.document.head && (!e.topChildFrame || i.renderInFrame)) { + let t, s, r; + e.topChildFrame && Object(a.I)(e.topChildFrame.frameElement, C.h.DisplayNone), t = Object(b.h)(this.externalAttributes.settings.rendering.containerSelector) ? this.externalAttributes.settings.rendering.containerSelector : i.containerSelector, s = Object(b.a)(this.externalAttributes.settings.rendering.insertPosition) ? this.externalAttributes.settings.rendering.insertPosition : i.insertPosition, r = Object(b.a)(this.externalAttributes.settings.rendering.position) ? this.externalAttributes.settings.rendering.position : i.position, this.Ks(t, e.topFrame).then(t => { + this.en(t, h, s, r), n({ + insertContainer: h, + insertWindow: e.topFrame + }); + }); + } else + e.topChildFrame && !i.renderInFrame ? (h = Object(a.f)(this.Bs, e.topFrame), e.topChildFrame.frameElement.parentNode.insertBefore(h, e.topChildFrame.frameElement), Object(a.a)(e.topChildFrame.frameElement, C.h.DisplayNone), n({ + insertContainer: h, + insertWindow: e.topFrame + })) : (t.tag.parentNode.insertBefore(h, t.tag), n({ insertContainer: h })); + }); + } + nn(t, i, e) { + Object(a.v)(i, t, e); + } + rn(t, i, e) { + switch (e) { + case s.ProtoPlayerInsertMode.BeforeContainer: + t.parentElement.insertBefore(i, t); + break; + case s.ProtoPlayerInsertMode.ReplaceContainer: + t.parentElement.insertBefore(i, t), Object(a.J)(t); + break; + case s.ProtoPlayerInsertMode.HideContainer: + t.parentElement.insertBefore(i, t), Object(a.u)(t); + break; + case s.ProtoPlayerInsertMode.AfterContainer: + t.nextElementSibling ? t.parentElement.insertBefore(i, t.nextElementSibling) : t.parentElement.appendChild(i); + } + } + en(t, i, e, n) { + e === s.ProtoPlayerInsertMode.WithinContainer ? this.nn(t, i, n) : this.rn(t, i, e); + } + hn(t, i = (() => { + return []; + })()) { + t.lineItems = [ + ...t.lineItems, + ...i + ]; + const e = t.lineItems.length; + t.lineItems = Object(v.e)('advertiserLineItemId', t.lineItems), e !== t.lineItems.length && Object(r.a)({ + level: s.ProtoLoggingLevelEnum.WARNING, + message: 'Loader_duplicated_adsources', + callStack: '_' + }); + } + an(t, i) { + const e = t.players[i], { + playerModel: n, + globalDomUtilsService: h, + urlSuffixerService: a + } = this.Rs[i]; + if (this.Hs || this.services.UserManagerService.setThirdPartySyncUrls(t.cookieSyncUrls), this.services.UserManagerService.setGeoLocation(t.geoLocation), p.a.sessionId = e.sessionId, this.cn.addPlayerSession(e.playerId, e.sessionId), !n) + return void this.registerApiError(m.a.SetupError, 'No playlist was provided!'); + const o = new l.a({ + browser: t.browser, + geoLocation: t.geoLocation, + pageUrl: this.pageUrl, + playerId: n.playerId, + explorationMode: t.explorationMode, + bundleID: this.externalAttributes._appSettings.bundleID, + appID: this.externalAttributes._appSettings.appID, + domainURL: this.externalAttributes._appSettings.domainURL, + storeURL: this.externalAttributes._appSettings.storeURL, + appCategories: this.externalAttributes._appSettings.appCategories, + appIsPaid: this.externalAttributes._appSettings.appIsPaid, + appName: this.externalAttributes._appSettings.appName, + appPrivacyPolicy: this.externalAttributes._appSettings.appPrivacyPolicy, + appVersion: this.externalAttributes._appSettings.appVersion, + deviceId: this.externalAttributes._appSettings.deviceID, + isRecyclerViewIntegration: this.externalAttributes._appSettings.isRecyclerViewIntegration, + appPageURL: this.externalAttributes._appSettings.appPageURL + }), d = o.browser.browserType === k.a.InternetExplorer, f = new g.a(h), v = this.getViewabilityService(n, f, d), y = this.Hs; + this.Hs = L.a.detectUsingCSS(n.global), y !== this.Hs && Object(r.a)({ + message: 'Loader_adBlockerDetection_changed_after_new_global', + throttle: 2, + sendMaxLog: !1, + level: s.ProtoLoggingLevelEnum.INFO, + exception: `${ y }` + }); + const O = new u.a(n, t.geoLocation, o.pageUrl, o.pageDomain, this.externalAttributes._appSettings, this.qs, t.publisherNetworkCode), x = { + services: { + GlobalDomUtilsService: h, + ViewabilityService: v, + TrackingService: this.un(n, t, i), + ResizeObserver: new c.a(n.global), + UserManagerService: this.services.UserManagerService, + MacrosService: O, + EventsStorageService: this.services.EventsStorageService, + PageFocusService: f, + InteractionService: new M.a(n.global, o.isMobile), + UrlSuffixerService: a + }, + config: o + }; + this.Hs && x.services.TrackingService.trackSessionAdBlocker(s.ProtoAdBlockDetectionTypeEnum.Banner), x.services.UserManagerService.setPageUrl(x.config.pageUrl); + const S = this.tn(); + x.services.TrackingService.setImplementationTypeOnMeta(S), n.externalMacros && x.services.MacrosService.addExtraMacros(n.externalMacros), x.services.UserManagerService.onEvent([w.a.CCPA_INFO_RECEIVED]).then(() => { + x.services.MacrosService.setUsPrivacyString(x.services.UserManagerService.getUsPrivacyString()); + }), x.services.UserManagerService.onEvent([w.a.CONSENT_DATA_UPDATE]).then(() => { + x.services.TrackingService.updateMetadataModel({ userId: x.services.UserManagerService.getTrackableUser() }); + const t = x.services.UserManagerService.getConsentPayload(); + if (x.services.TrackingService.hasGdprConsentPayload = Object(b.h)(t), this.services.UserManagerService.gdprConsentMode === s.ProtoGdprConsentModeEnum.NoConsent || this.cs) { + const t = n.lineItemSettings.lineItems.filter(t => { + return Object(b.h)(t.vendorId); + }).every(t => { + return this.services.UserManagerService.isConsent(t.vendorId); + }); + this.services.UserManagerService.gdprConsentMode = t ? s.ProtoGdprConsentModeEnum.AllGood : s.ProtoGdprConsentModeEnum.NotAllDemandConsent; + } + }); + const j = { + wasPlayerReloaded: this.cn.wasPlayerReloaded(e.playerId), + wasPlayerInView: this.cn.getSessionInView(e.playerId) + }; + this.renderer = this.getRendererInstance(n, x, this.Hs, j, this.externalAttributes._appSettings), this.subscribe(I.c.SessionView, this.renderer, () => { + this.cn.addSessionInView(e.playerId); + }), this.subscribe(I.c.SessionRendered, this.renderer, () => { + if (this.ln) { + const t = this.services.UserManagerService.getUserId(); + new P.a(O, h, this.ln, t).addFraudSensorScript(); + } + }); + const _ = Object.assign({ + configEnums: this.getApiConfigEnums(), + configEvents: this.getApiConfigEvents() + }, this.renderer.getApiMethods()); + let A = e.customJsCode; + if (A) { + const t = `${ B }_${ x.config.appId }`; + this.GLOBAL[t] = _, A = A.cnx_replaceAll(`"{{${ B }}}"`, `window.${ t }`); + } + this.renderer.init(() => { + this.dn(A); + }) ? this.registerApiSuccess(_) : this.registerApiError(m.a.RenderError, 'Player size under supported value'); + } + un(t, i, e) { + return t.disableTracking ? new O.a() : new o.a({ + userManagerService: this.services.UserManagerService, + browser: i.browser, + geoLocation: i.geoLocation, + playerId: t.playerId, + userId: this.services.UserManagerService.getTrackableUser(), + sessionId: i.players[e].sessionId, + pageUrl: this.pageUrl, + bundleId: this.externalAttributes._appSettings.bundleID, + customParam1: this.externalAttributes.customParam1, + customParam2: this.externalAttributes.customParam2, + customParam3: this.externalAttributes.customParam3, + customParam4: this.externalAttributes.customParam4, + customParam5: this.externalAttributes.customParam5, + abTestId: i.players[e].abTestId, + explorationMode: i.explorationMode + }); + } + dn(t, i = (() => { + return { useSafeMode: !0 }; + })()) { + if (!t) + return; + const { + global: e, + useSafeMode: s + } = i, n = e || this.GLOBAL; + let r; + r = s ? `\n (function() {\n "use strict";\n try {\n ${ t }\n }catch(e){\n console.warn('---CnxCustomApiError---');\n console.warn(e.message);\n }\n })()\n ` : t, Object(a.w)(n.document.head, n, r.trim()); + } + Ns() { + if (this.$s.includes('{{omidVerificationClient')) + return; + const t = { + useSafeMode: !1, + global: window + }; + this.dn(decodeURI(this.$s), t); + } + pn() { + const { + playerId: t, + parseDomain: i + } = this.bn; + return this.vn(t, i).catch(t => { + const i = new Error(t); + throw Object(r.a)({ + callStack: i.stack, + level: s.ProtoLoggingLevelEnum.FATAL, + exception: i.message, + message: 'Prerender_Loader_player_id_call_get_pls', + throttle: 1000 + }), this.registerApiError(m.a.SetupError, 'player data call error'), this.mn(), i; + }); + } + gn(t) { + const { + browser: i, + userInformation: e + } = t; + if (this.services.UserManagerService.setUserInformation(e), this.services.UserManagerService.setBrowserInfo(i), e && e.callFraudSensor) { + const { + lookupId: t, + lookupResponseCode: s, + publisherAdsTxt: n + } = e; + this.ln = { + lookupId: t, + lookupResponseCode: s, + publisherAdsTxt: n, + deviceType: i.device + }; + } + y.a.serverAb0 = t.serverAb0, y.a.serverAb1 = t.serverAb1, Object(v.h)(t.players) ? (t.players.length > 1 && (this.zs(), this.Vs = !0), Object.keys(t.players).forEach(i => { + this.yn(t, this.bn, i); + })) : this.registerApiError(m.a.NoPlayer, `No player available for given player id:${ this.bn.playerId }`), this.mn(); + } + mn() { + this.wn(), this.xn(); + } + xn() { + setTimeout(() => { + if (!this.Vs) { + const t = this.Us[0]; + this.readyCallback && this.readyCallback(t.apiErrorObj, t.apiConfigObj); + } + this.Sn(); + }); + } + Sn() { + this.Us.filter(t => { + return t.apiErrorObj; + }).forEach(() => { + this.services.EventsStorageService.emitRenderError(); + }); + } + yn(t, i, e) { + const s = t.players[e], {playerModel: n} = this.Rs[e]; + this.Ws(s.renderInFrame), this.an(t, e), this.jn(n, this.renderer.playerContainer); + } + vn(t, i = (() => { + return !1; + })()) { + let e = { + parseDomain: i, + referrer: this.qs, + pageUrl: this.pageUrl, + tokens: [t] + }; + e.bundleId = this.externalAttributes._appSettings.bundleID, this.queryParams.cnxLineItemId && (e.forceLineItemIds = this.queryParams.cnxLineItemId.split(D).filter(t => { + return Object(b.h)(t); + })), this.queryParams.cnxPlayerId ? e.forcePlayerId = this.queryParams.cnxPlayerId : this.externalAttributes.settings._connatixInternals.skipServingRules && (e.forcePlayerId = t), this.queryParams.cnxExplorationMode && (e.forceExploration = !0); + const {queryJsTargeting: s} = this.externalAttributes.settings; + return Object(b.f)(s) && Object.keys(s).length > 0 && (e.queryJsTargeting = Object.keys(s).reduce((t, i) => { + return Object.assign(Object.assign({}, t), { [i]: `${ s[i] }` }); + }, {})), e.customParam1 = this.externalAttributes.customParam1, e.customParam2 = this.externalAttributes.customParam2, e.customParam3 = this.externalAttributes.customParam3, e.customParam4 = this.externalAttributes.customParam4, e.customParam5 = this.externalAttributes.customParam5, e.disableTracking = this.externalAttributes.settings._connatixInternals.disableTracking, e.version = f.a.version, e.es6 = f.b, e.userId = this.services.UserManagerService.getForcedTrackableUser(), e.isConsentConnatix = this.services.UserManagerService.isConsentConnatix(), e.clientAb0 = y.a.clientAb0, e.clientAb1 = y.a.clientAb1, e.implementationType = this.tn(), e.reloadedPlayers = this.cn.getCookiePlayersSession(), e = Object.assign(Object.assign({}, e), this.getSpecificRequestData()), this.bn.playerId ? this.getPlayerResponse(e, this.bn.playerId || 'serverless') : new Promise((t, i) => { + this.isServerlessMode = !0, t(this.defaultInitFromProto()); + }); + } + kn() { + const t = Object(d.b)('cnxVideoPosition', this.pageUrl), i = parseInt(Object(d.b)('cnxStoryPosition', this.pageUrl), 10); + return { + cnxStoryId: Object(d.b)('cnxStoryId', this.pageUrl), + cnxLineItemId: Object(d.b)('cnxLineItemId', this.pageUrl), + cnxPlayerId: Object(d.b)('cnxPlayerId', this.pageUrl), + cnxMediaId: Object(d.b)('cnxMediaId', this.pageUrl), + cnxPlaylistId: Object(d.b)('cnxPlaylistId', this.pageUrl), + cnxVideoPosition: t ? parseInt(t, 10) : null, + cnxExplorationMode: 'true' === Object(d.b)('cnxExplorationMode', this.pageUrl), + cnxStoryPosition: Object(b.e)(i) ? i : null, + cnxSkipAdsFlag: 'true' === Object(d.b)('cnxSkipAdsFlag', this.pageUrl), + cnxReloadTime: parseInt(Object(d.b)('cnxReloadTime', this.pageUrl), 10), + cnxOverrideLineitems: 'true' === Object(d.b)('cnxOverrideLineitems', this.pageUrl), + cnxIsSeoTraffic: 'true' === Object(d.b)('cnxIsSeoTraffic', this.pageUrl) + }; + } + jn(t, i) { + const e = this.getDelegateHandler(); + new x.a(this.GLOBAL, this.services.EventsStorageService, e, t, i).start(); + } + _n() { + const t = this.GLOBAL.OmidSessionClient && this.GLOBAL.OmidSessionClient[j.j]; + t ? this.An = new S.a(t, this.services.EventsStorageService, this.externalAttributes._appSettings.sdkVersion) : Object(r.a)({ + message: 'OmidSessionClient not found.', + level: s.ProtoLoggingLevelEnum.FATAL + }); + } + In(t) { + const i = () => { + return new Promise((i, e) => { + const s = this.Cn(); + t.addCssStylesheetToHead(s, () => { + return i(); + }, t => { + return e(t); + }); + }); + }; + return Object(h.j)(() => { + return i(); + }).catch(t => { + throw Object(r.a)({ + message: 'Loader_add_css_link', + exception: t, + level: s.ProtoLoggingLevelEnum.INFO + }), new Error(t); + }); + } + updateQueryParams() { + this.queryParams = this.kn(); + } + loadScriptTag(t, i) { + let e; + if (this.externalAttributes = t, i && (e = this.GLOBAL.document.getElementById(i)), !e) + return Object(r.a)({ + message: 'Loader_no_script_id', + exception: `${ t.playerId }`, + level: s.ProtoLoggingLevelEnum.WARNING + }), this.registerApiError(m.a.SetupError, 'Could not locate any script tag ids in the page'), !1; + const n = Object(b.f)(t.settings.plugins.adobeAnalyticsSettings); + return this.Ls && this._n(), this.bn = { + parseDomain: n, + playerId: t.playerId, + tag: e + }, !0; + } + insertRenderer() { + try { + this.cn = new _.a(this.queryParams.cnxReloadTime), this.Ws(); + const t = () => { + try { + this.pn().then(t => { + const i = []; + t.players.forEach((e, n) => { + t.players[n].limitClientSideApiUse && this.zs(); + const h = this.in(this.bn, e).then(i => { + this.hn(e, t.lineItems); + const s = new R.a(); + t.bandwidthLoggingEnabled && s.setQueryParams({ playerId: t.players[n].playerId }); + const r = this.getPlayerModel(i, t, s, n.toString()), h = new T.a(r.global); + return Object(E.a)(r.lineItemSettings.lineItems), this.Rs[n] = { + playerModel: r, + globalDomUtilsService: h, + urlSuffixerService: s + }, this.In(h); + }).catch(t => { + this.registerApiError(m.a.SetupError, 'rendering error'), Object(r.a)({ + message: 'Loader_send_data_to_renderer', + exception: t.message, + callStack: t.stack, + level: s.ProtoLoggingLevelEnum.FATAL + }); + }); + i.push(h); + }), Promise.all(i).then(() => { + return this.gn(t); + }); + }); + } catch (t) { + Object(r.a)({ + message: 'Prerender_Loader_do_player_call', + callStack: t.stack, + exception: t.message, + throttle: 1000 + }); + } + }; + this.wn = this.services.UserManagerService.registerPlsCall(t); + } catch (t) { + Object(r.a)({ + message: 'Prerender_Loader_insert_renderer', + exception: t.message, + callStack: t.stack, + level: s.ProtoLoggingLevelEnum.FATAL + }); + } + } + findPageUrl(t, i, e = (() => { + return !1; + })()) { + if (t.cnx_page_url) + this.pageUrl = t.cnx_page_url; + else + try { + t['cnxAmpAd)'] ? this.pageUrl = t.context.sourceUrl || t.context.location.href : this.pageUrl = i || Object(h.e)(Object(h.f)(this.GLOBAL), this.GLOBAL); + } catch (t) { + } + if (!this.pageUrl || 0 === this.pageUrl.length) + return e || Object(r.a)({ + message: 'Prerender_Loader_find_page_url', + level: s.ProtoLoggingLevelEnum.INFO, + throttle: 1000 + }), new Promise(e => { + setTimeout(() => { + this.findPageUrl(t, i, !0).then(() => { + return e(); + }); + }, this.Fs); + }); + try { + return this.pageUrl = Object(d.d)(this.pageUrl), Promise.resolve(); + } catch (t) { + return Object(r.a)({ + message: 'Loader_find_page_url', + exception: t.message, + callStack: t.stack, + level: s.ProtoLoggingLevelEnum.FATAL + }), Promise.reject(); + } + } + registerApiError(t = (() => { + return m.a.SetupError; + })(), i = (() => { + return ''; + })()) { + this.Us.push({ + apiErrorObj: { + type: t, + message: i + } + }); + } + registerApiSuccess(t) { + this.Us.push({ apiConfigObj: t }); + } + destroy() { + this.renderer && this.renderer.destroy(); + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return u; + }); + var s, n = e(0), r = e(8), h = e(2), a = e(31), o = e(26), c = e(1); + !function (t) { + t.AppUrl = 'APP_URL', t.AppBundle = 'APP_BUNDLE', t.AppName = 'APP_NAME', t.Uuid = 'UUID', t.PageUrl = 'PAGE_URL', t.AdPosition = 'AD_POSITION', t.VideoTitle = 'VIDEO_TITLE', t.MediaTitle = 'MEDIA_TITLE', t.VideoDuration = 'VIDEO_DURATION', t.ContentLength = 'CONTENT_LENGTH', t.VideoDescription = 'VIDEO_DESCRIPTION', t.VideoUrl = 'VIDEO_URL', t.VideoId = 'VIDEO_ID', t.VideoTime = 'VIDEO_TIME', t.DescriptionUrl = 'DESCRIPTION_URL', t.VideoKeywords = 'VIDEO_KEYWORDS', t.Autoplay = 'AUTOPLAY', t.UserAgent = 'UA', t.Ip = 'IP', t.CashBuster = 'CB', t.Width = 'WIDTH', t.Height = 'HEIGHT', t.Domain = 'DOMAIN', t.SourceReferrer = 'SOURCE_REFERRER', t.Gdpr = 'GDPR', t.GdprConsent = 'GDPR_CONSENT', t.Consent = 'CONSENT', t.Ctd = 'CTD', t.Publisher = 'PUBLISHER', t.Random = 'RAND', t.Site = 'SITE', t.SubId = 'SUB_ID', t.Url = 'URL', t.UserLat = 'USER_LAT', t.UserLong = 'USER_LONG', t.UsPrivacyString = 'US_PRIVACY', t.DoNotTrack = 'DNT', t.FraudSensorUserId = 'FS_USER_ID', t.PublisherId = 'PUBLISHER_ID', t.SessionId = 'SESSION_ID', t.FraudSensorDeviceType = 'FS_DEVICE_TYPE', t.FraudSensorLookupId = 'MGID', t.FraudSensorLookupResponseCode = 'MGTO', t.FraudSensorMediaType = 'FS_MEDIA_TYPE', t.CnxSupplierId = 'CNX_SUPPLIER_ID', t.AdxPublisherNetworkCode = 'ADX_CPNC'; + }(s || (s = {})); + class u { + constructor(t, i, e, r, h, a, c) { + this.Tn = new Map(), this.Pn = '[', this.Mn = ']', this.Tn.set(s.Autoplay, t.playbackMode === n.ProtoPlayerPlaybackModeEnum.Autoplay), this.Tn.set(s.UserAgent, navigator.userAgent), this.Tn.set(s.UserLong, i.lon), this.Tn.set(s.UserLat, i.lat), this.Tn.set(s.Ip, i.ip), this.En(h), this.Ln(a), this.Rn(e), this.Bn(), this.Tn.set(s.Domain, r), this.Tn.set(s.CnxSupplierId, o.c), this.Tn.set(s.SessionId, t.sessionId), c && this.Tn.set(s.AdxPublisherNetworkCode, `,${ c }`); + } + En(t) { + this.Tn.set(s.AppBundle, t.bundleID), this.Tn.set(s.AppName, t.appName), this.Tn.set(s.AppUrl, t.storeURL); + } + Ln(t) { + this.Tn.set(s.SourceReferrer, t); + } + Bn() { + const t = Object(h.A)() ? 1 : 0; + this.Tn.set(s.DoNotTrack, t); + } + Rn(t) { + this.Tn.set(s.PageUrl, t), this.Tn.set(s.Url, t), this.Tn.set(s.Publisher, t), this.Tn.set(s.Site, t), this.Tn.set(s.DescriptionUrl, t); + } + Dn() { + const t = Object(r.c)(); + this.Tn.set(s.CashBuster, t), this.Tn.set(s.Random, t), this.Tn.set(s.Ctd, t); + } + Fn(t) { + return t.split('?')[0]; + } + Vn(t) { + return t.split('?').slice(1).join('?'); + } + Un(t, i, e) { + return 0 === t.indexOf(i) && t.indexOf(e, e.length) === t.length - i.length; + } + $n(t, i) { + const e = this.Fn(t), s = this.Nn(this.Vn(t), i); + return `${ e }${ s ? `?${ s }` : '' }`; + } + Nn(t, i, e = (() => { + return !1; + })()) { + let s = t; + return s.split('&').forEach(t => { + const n = t.split('='); + if (n[1]) + if (this.Un(n[1], this.Pn, this.Mn)) + s = s.replace(n[1], this.Hn(n[1].toLowerCase(), i, e)); + else if (decodeURIComponent(n[1]).split('=').length > 1) { + const t = this.Nn(decodeURIComponent(n[1]), i, !0); + s = s.replace(n[1], encodeURIComponent(t)); + } + }), s = this.qn(s, i), this.zn(s); + } + zn(t) { + return t.indexOf(this.Pn) > -1 && (t = t.cnx_replaceAll(this.Pn, encodeURIComponent(this.Pn))), t.indexOf(this.Mn) > -1 && (t = t.cnx_replaceAll(this.Mn, encodeURIComponent(this.Mn))), t; + } + Hn(t, i, e) { + let s, n = t; + return i.forEach((t, i) => { + for (; n.indexOf(this.Pn + i.toLowerCase() + this.Mn) > -1;) + s = e ? t : encodeURIComponent(t), n = n.replace(this.Pn + i.toLowerCase() + this.Mn, s); + }), n; + } + qn(t, i) { + const e = `${ this.Pn }${ s.AdxPublisherNetworkCode }${ this.Mn }`; + return -1 === t.indexOf(e) ? t : i.has(s.AdxPublisherNetworkCode) ? t.cnx_replaceAll(e, i.get(s.AdxPublisherNetworkCode)) : t.cnx_replaceAll(e, ''); + } + setAdWidth(t) { + this.Tn.set(s.Width, Math.floor(t)); + } + setAdHeight(t) { + this.Tn.set(s.Height, Math.floor(t)); + } + setSubId(t) { + this.Tn.set(s.SubId, t); + } + setGDPR(t) { + this.Tn.set(s.Gdpr, t); + } + setUUID(t) { + this.Tn.set(s.Uuid, t); + } + setGDPRConsent(t) { + this.Tn.set(s.GdprConsent, t); + } + setConsent(t) { + this.Tn.set(s.Consent, t); + } + setVideoId(t) { + this.Tn.set(s.VideoId, t); + } + setVideoTime(t) { + this.Tn.set(s.VideoTime, Math.floor(t)); + } + setVideoUrl(t) { + this.Tn.set(s.VideoUrl, t); + } + setVideoDescription(t) { + this.Tn.set(s.VideoDescription, t); + } + setVideoDuration(t) { + this.Tn.set(s.VideoDuration, t), this.Tn.set(s.ContentLength, t); + } + setVideoTitle(t) { + let i; + this.Tn.set(s.VideoTitle, t), this.Tn.set(s.MediaTitle, t), t && (i = t.split(' ').join(',')), this.Tn.set(s.VideoKeywords, i); + } + setAdPosition(t = (() => { + return 'midRoll'; + })()) { + this.Tn.set(s.AdPosition, t); + } + setupMacros(t) { + return this.Dn(), this.$n(t, this.Tn); + } + addExtraMacros(t) { + const i = Object(a.a)(s); + Object.keys(t).filter(t => { + return !i.includes(t.toUpperCase()); + }).forEach(i => { + this.Tn.set(i, t[i]); + }); + } + getExtraMacros() { + const t = Object(a.a)(s), i = {}; + return this.Tn.forEach((e, s) => { + t.includes(s) || null == e || (i[s] = Object(c.h)(e) ? e : JSON.stringify(e)); + }), i; + } + setUsPrivacyString(t) { + const i = t || ''; + this.Tn.set(s.UsPrivacyString, i); + } + setUserId(t) { + this.Tn.set(s.FraudSensorUserId, t); + } + setPublisherId(t) { + this.Tn.set(s.PublisherId, t); + } + setFraudSensorMacros(t) { + this.Tn.set(s.FraudSensorDeviceType, t.deviceType), this.Tn.set(s.FraudSensorLookupId, t.lookupId), this.Tn.set(s.FraudSensorLookupResponseCode, t.lookupResponseCode), this.Tn.set(s.FraudSensorMediaType, t.mediaType); + } + destroy() { + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return o; + }); + var s = e(18), n = e(8), r = e(24), h = e(19), a = e(1); + class o { + constructor(t) { + this.Wn = t, this.Gn = 100, this.Jn = Object(n.f)(window).topFrame, this.Qn = s.a.indexOf(this.Wn.browser.device) > -1, this.Xn = Object(n.d)(), this.Yn = { + browserType: this.Kn(), + browserVersion: this.Wn.browser.browserVersion + }, this.Zn = this.tr(), this.ir = this.pageUrl.substr(0, this.Gn), this.er = Object(h.a)(this.ir); + } + Kn() { + let t; + return Object.keys(r.a).forEach(i => { + this.Wn.browser.browserType.toLowerCase().indexOf(r.a[i]) > -1 && (t = r.a[i]); + }), t; + } + tr() { + let t, i = 0; + const e = this.Wn.browser.osCode.split('_'), n = e[0].toLowerCase(); + return Object.keys(s.b).forEach(i => { + n.indexOf(s.b[i]) > -1 && (t = s.b[i]); + }), e.length > 1 && (i = parseFloat(`${ e[1] || 0 }.${ e[2] || 0 }`)), { + os: t, + osVersion: i + }; + } + get device() { + return this.Wn.browser.device; + } + get browser() { + return this.Yn; + } + get os() { + return this.Zn; + } + get geoLocation() { + return this.Wn.geoLocation; + } + get pageUrl() { + return this.Wn.pageUrl || ''; + } + get pageUrlTrunc() { + return this.ir; + } + get pageDomain() { + return this.er; + } + get isMobile() { + return this.Qn; + } + get isInApp() { + return Object(a.h)(this.Wn.bundleID); + } + get isInAppAndroid() { + return this.isInApp && this.os.os === s.b.Android; + } + get playerId() { + return this.Wn.playerId; + } + get appId() { + return this.Xn; + } + get bundleID() { + return this.Wn.bundleID; + } + get iOSAppID() { + return this.Wn.appID; + } + get domainURL() { + return this.Wn.domainURL; + } + get storeURL() { + return this.Wn.storeURL; + } + get explorationMode() { + return this.Wn.explorationMode; + } + get appName() { + return this.Wn.appName; + } + get appCategories() { + return this.Wn.appCategories; + } + get appVersion() { + return this.Wn.appVersion; + } + get appPrivacyPolicy() { + return this.Wn.appPrivacyPolicy; + } + get appIsPaid() { + return this.Wn.appIsPaid; + } + get deviceId() { + return this.Wn.deviceId; + } + get topWindow() { + return this.Jn; + } + get isRecyclerViewIntegration() { + return this.Wn.isRecyclerViewIntegration; + } + get appPageURL() { + return this.Wn.appPageURL; + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return s; + }); + class s { + setNewMedia() { + } + updateMediaMetadata() { + } + setMediaStart() { + } + setContentStart() { + } + setSessionPlayback() { + } + setSessionViewability() { + } + trackSessionRendered() { + } + trackSessionViewability() { + } + trackMediaQuartile() { + } + trackMediaClick() { + } + setAdStart() { + } + startBidRequests() { + } + addPrebid() { + } + addPostBid() { + } + addBid() { + } + trackAuctionInfoForBid() { + } + trackVideoAdImpression() { + } + trackVideoAdImpressionViewable() { + } + trackVideoAdQuartile() { + } + trackAdClick() { + } + trackAdOpportunity() { + } + trackSessionAdBlocker() { + } + getMetadataModel() { + } + updateMetadataModel() { + } + setIsConsentPayload() { + } + destroy() { + } + publish() { + } + setImplementationTypeOnMeta() { + } + addPlatformCappedLineItemSubscriber() { + } + removePlatformCappedLineItemSubscriber() { + } + setImpressionRevenueSubscriber() { + } + unsubscribeToImpressionRevenue() { + } + trackHeavyAdIntervention() { + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return a; + }); + var s = e(8), n = e(5), r = e(0), h = e(11); + class a { + constructor(t) { + this.RELOAD_TIME = h.a, this.RELOAD_COOKIES = 'cnx_player_reload', this.SESSION_IN_VIEW_FLAG = '_sessionWasViewed', this.sr = {}, this.nr = {}, this.rr = {}, this.Jn = Object(s.f)(window).topFrame, this.hr(t); + try { + this.ar(); + } catch (t) { + Object(n.a)({ + message: 'PlayerReloader_cookie_fetch_failed', + level: r.ProtoLoggingLevelEnum.WARNING, + exception: t + }); + } + } + wasPlayerReloaded(t) { + return !!this.sr[t]; + } + addPlayerSession(t, i) { + this.nr[t] = i; + } + getCookiePlayersSession() { + return this.sr; + } + addSessionInView(t) { + this.nr[t] += this.SESSION_IN_VIEW_FLAG; + } + getSessionInView(t) { + return this.rr[t]; + } + hr(t) { + setTimeout(() => { + this.or(), this.Jn.location.reload(); + }, t || this.RELOAD_TIME); + } + ar() { + decodeURIComponent(this.Jn.document.cookie).split(';').forEach(t => { + const i = t.split('='); + i[0].indexOf(this.RELOAD_COOKIES) > -1 && (this.sr = JSON.parse(i[1])); + }), this.cr(), this.ur(); + } + cr() { + Object.keys(this.sr).forEach(t => { + const i = this.sr[t].indexOf(this.SESSION_IN_VIEW_FLAG); + i > -1 && (this.sr[t] = this.sr[t].substr(0, i), this.rr[t] = !0); + }); + } + ur() { + this.Jn.document.cookie = `${ this.RELOAD_COOKIES }=; expires = Thu, 01 Jan 1970 00:00:00 GMT; path=/`; + } + or() { + Object.keys(this.rr).forEach(t => { + -1 === this.nr[t].indexOf(this.SESSION_IN_VIEW_FLAG) && this.addSessionInView(t); + }); + const t = new Date(); + let i = t.getTime(); + i += h.g * h.f, t.setTime(i), this.Jn.document.cookie = `${ this.RELOAD_COOKIES }=${ JSON.stringify(this.nr) }; expires=${ t.toUTCString() }; path=/`; + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return l; + }); + var s = e(8), n = e(2), r = e(14), h = e(6), a = e(5), o = e(0), c = e(17), u = e(1); + class l { + constructor(t) { + this.createElement = (t, i = (() => { + return this.fe; + })()) => { + return i.document.createElement(t); + }, this.fe = t, this.addPreconnect(); + } + initHls(t) { + return t.cnxRenderWindow = this.fe, new c(t); + } + addCssString(t, i = (() => { + return ''; + })()) { + return Object(n.b)(t, i, this.fe); + } + addPreconnect() { + Object(n.c)(r.a.endPoints.base.video, this.fe), Object(n.c)(r.a.endPoints.base.core, this.fe), Object(n.c)(r.a.endPoints.base.image, this.fe); + } + getLineHeightPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('line-height'); + } + getFontSizePropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('font-size'); + } + getFontWeightPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('font-weight'); + } + getTransformPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('transform'); + } + getPaddingTopPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('padding-top'); + } + getPaddingBottomPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('padding-bottom'); + } + getMarginTopPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('margin-top'); + } + getMarginBottomPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('margin-bottom'); + } + getMarginLeftPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('margin-left'); + } + getMarginRightPropertyValue(t) { + return Object(n.k)(t, this.fe).getPropertyValue('margin-right'); + } + createElementByString(t, i = (() => { + return this.fe; + })()) { + return Object(n.f)(t, i); + } + createDocumentFragment(t = (() => { + return this.fe; + })()) { + return t.document.createDocumentFragment(); + } + isHttpsProtocolUsed() { + return Object(n.C)(this.fe); + } + isURLSameDomainToTop(t) { + return Object(n.D)(t, this.fe); + } + isDetachedFromDOM(t) { + let i = t; + for (; i.parentNode;) + if ((i = i.parentNode) === this.fe.document.body) + return !1; + return !0; + } + querySelector(t, i = (() => { + return this.fe; + })()) { + let e; + try { + e = i.document.querySelector(t); + } catch (t) { + } + return e; + } + addCssStylesheetToHead(t, i, e) { + const s = this.fe.document; + s.getElementById(t.id) ? Object(u.b)(i) && i() : Object(n.y)(t, s.head, this.fe, i, e); + } + getFullscreenKeys(t) { + return Object(n.n)(t || this.fe.document); + } + exitFullscreen(t, i) { + (i || this.fe.document)[t](); + } + getDocumentProperty(t) { + return this.fe.document[t]; + } + addEventListenerOnGlobal(t, i, e, s = (() => { + return !1; + })()) { + (e ? this.fe.document : this.fe).addEventListener(t, i, s); + } + removeEventListenerOnGlobal(t, i, e, s = (() => { + return !1; + })()) { + (e ? this.fe.document : this.fe).removeEventListener(t, i, s); + } + trackWithImages(t, i) { + Object(s.l)(t, this.fe, i); + } + getElementCoordinates(t) { + let { + top: i, + left: e + } = t.getBoundingClientRect(); + const { + width: s, + height: n + } = t.getBoundingClientRect(), r = this.fe.pageYOffset; + return { + clientX: e += this.fe.pageXOffset, + clientY: i += r, + width: s, + height: n + }; + } + requestAnimationFrameHelper(t) { + return Object(n.M)(this.fe, t); + } + cancelRequestAnimationFrame(t) { + return Object(n.e)(this.fe, t); + } + getGlobalLocationProperties() { + const t = this.fe.location; + return { + hostname: t.hostname, + pathname: t.pathname, + href: t.href, + protocol: t.protocol, + host: t.host, + port: t.port, + search: t.search, + hash: t.hash + }; + } + open(t, i) { + this.fe.open(t, i); + } + getComputedTranslateX(t) { + let i = 0; + const e = Object(n.k)(t, this.fe).getPropertyValue('transform').match(/^matrix\((.+)\)$/); + return Object(h.h)(e) && (i = parseFloat(e[1].split(', ')[4])), i; + } + getBodyDimensions() { + try { + const t = Object(s.f)(this.fe).topFrame.document.body; + let { + offsetWidth: i, + offsetHeight: e + } = t; + const r = Object(n.k)(t, this.fe); + return { + width: i += parseInt(r.marginLeft, 10) + parseInt(r.marginRight, 10), + height: e += parseInt(r.marginTop, 10) + parseInt(r.marginBottom, 10) + }; + } catch (t) { + return Object(a.a)({ + message: 'DomUtils_error_getting_body_dimensions', + exception: t.message, + callStack: t.stack, + level: o.ProtoLoggingLevelEnum.FATAL + }), { + width: 0, + height: 0 + }; + } + } + getViewportWidth() { + return Object(s.f)(this.fe).topFrame.innerWidth; + } + getViewportHeight() { + return Object(s.f)(this.fe).topFrame.innerHeight; + } + getGlobalClosestTop() { + return Object(s.f)(this.fe); + } + stripHtmlTags(t) { + return Object(n.P)(t, this.fe); + } + getComputedStyle(t, i) { + return Object(n.k)(t, this.fe, i); + } + getElementById(t) { + return Object(n.l)(t, this.fe); + } + getElementsByClassName(t) { + return Object(n.m)(t, this.fe); + } + insertScript(t, i, e) { + this.fe.document.getElementById(t.id) ? Object(u.b)(i) && i() : Object(n.x)(t, this.fe.document.head, this.fe, i, null, !0, e); + } + destroy() { + } + } + }, + function (t, i, e) { + 'use strict'; + e.d(i, 'a', function () { + return r; + }); + var s = e(6), n = e(1); + class r { + constructor() { + this.lr = {}; + } + setQueryParams(t) { + this.lr = t; + } + appendParamsToUrl(t) { + return this.dr(t, Object.keys(this.lr).map(t => { + return { + paramName: t, + paramValue: this.lr[t] + }; + })); + } + dr(t, i) { + if (!Object(s.h)(i)) + return t; + t += t.includes('?') ? '&' : '?'; + let e = ''; + return i.forEach(t => { + Object(n.h)(t.paramName) && Object(n.h)(t.paramValue) && (e += `${ e.length > 0 ? '&' : '' }${ t.paramName }=${ t.paramValue }`); + }), t + e; + } + } + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' TEST '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' NEXT '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' Skip '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' Loading Pods Visit Advertiser website GO TO PAGE '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i) { + t.exports = ''; + }, + function (t, i) { + t.exports = ' '; + }, + function (t, i, e) { + 'use strict'; + var s, n = e(5), r = e(0), h = e(2), a = [], o = 'ResizeObserver loop completed with undelivered notifications.'; + !function (t) { + t.BORDER_BOX = 'border-box', t.CONTENT_BOX = 'content-box', t.DEVICE_PIXEL_CONTENT_BOX = 'device-pixel-content-box'; + }(s || (s = {})); + var c, u = function () { + function t(t, i, e, s) { + return this.x = t, this.y = i, this.width = e, this.height = s, this.top = this.y, this.left = this.x, this.bottom = this.top + this.height, this.right = this.left + this.width, Object.freeze(this); + } + return t.prototype.toJSON = function () { + var t = this; + return { + x: t.x, + y: t.y, + top: t.top, + right: t.right, + bottom: t.bottom, + left: t.left, + width: t.width, + height: t.height + }; + }, t.fromRect = function (i) { + return new t(i.x, i.y, i.width, i.height); + }, t; + }(), l = function (t) { + return t instanceof SVGElement && 'getBBox' in t; + }, d = function (t) { + if (l(t)) { + var i = t.getBBox(), e = i.width, s = i.height; + return !e && !s; + } + var n = t, r = n.offsetWidth, h = n.offsetHeight; + return !(r || h || t.getClientRects().length); + }, f = function (t) { + var i, e, s = null === (e = null === (i = t) || void 0 === i ? void 0 : i.ownerDocument) || void 0 === e ? void 0 : e.defaultView; + return !!(s && t instanceof s.Element); + }, p = 'undefined' != typeof window ? window : {}, b = new WeakMap(), v = /auto|scroll/, m = /^tb|vertical/, g = /msie|trident/i.test(p.navigator && p.navigator.userAgent), y = function (t) { + return parseFloat(t || '0'); + }, w = function (t, i, e) { + return void 0 === t && (t = 0), void 0 === i && (i = 0), void 0 === e && (e = !1), Object.freeze({ + inlineSize: (e ? i : t) || 0, + blockSize: (e ? t : i) || 0 + }); + }, O = Object.freeze({ + devicePixelContentBoxSize: w(), + borderBoxSize: w(), + contentBoxSize: w(), + contentRect: new u(0, 0, 0, 0) + }), x = function (t, i) { + if (void 0 === i && (i = !1), b.has(t) && !i) + return b.get(t); + if (d(t)) + return b.set(t, O), O; + var e = getComputedStyle(t), s = l(t) && t.ownerSVGElement && t.getBBox(), n = !g && 'border-box' === e.boxSizing, r = m.test(e.writingMode || ''), h = !s && v.test(e.overflowY || ''), a = !s && v.test(e.overflowX || ''), o = s ? 0 : y(e.paddingTop), c = s ? 0 : y(e.paddingRight), f = s ? 0 : y(e.paddingBottom), p = s ? 0 : y(e.paddingLeft), x = s ? 0 : y(e.borderTopWidth), S = s ? 0 : y(e.borderRightWidth), j = s ? 0 : y(e.borderBottomWidth), k = p + c, _ = o + f, A = (s ? 0 : y(e.borderLeftWidth)) + S, I = x + j, C = a ? t.offsetHeight - I - t.clientHeight : 0, T = h ? t.offsetWidth - A - t.clientWidth : 0, P = n ? k + A : 0, M = n ? _ + I : 0, E = s ? s.width : y(e.width) - P - T, L = s ? s.height : y(e.height) - M - C, R = E + k + T + A, B = L + _ + C + I, D = Object.freeze({ + devicePixelContentBoxSize: w(Math.round(E * devicePixelRatio), Math.round(L * devicePixelRatio), r), + borderBoxSize: w(R, B, r), + contentBoxSize: w(E, L, r), + contentRect: new u(p, o, E, L) + }); + return b.set(t, D), D; + }, S = function (t, i, e) { + var n = x(t, e), r = n.borderBoxSize, h = n.contentBoxSize, a = n.devicePixelContentBoxSize; + switch (i) { + case s.DEVICE_PIXEL_CONTENT_BOX: + return a; + case s.BORDER_BOX: + return r; + default: + return h; + } + }, j = function () { + return function (t) { + var i = x(t); + this.target = t, this.contentRect = i.contentRect, this.borderBoxSize = [i.borderBoxSize], this.contentBoxSize = [i.contentBoxSize], this.devicePixelContentBoxSize = [i.devicePixelContentBoxSize]; + }; + }(), k = function (t) { + if (d(t)) + return 1 / 0; + for (var i = 0, e = t.parentNode; e;) + i += 1, e = e.parentNode; + return i; + }, _ = function () { + var t = 1 / 0, i = []; + a.forEach(function (e) { + if (0 !== e.activeTargets.length) { + var s = []; + e.activeTargets.forEach(function (i) { + var e = new j(i.target), n = k(i.target); + s.push(e), i.lastReportedSize = S(i.target, i.observedBox), n < t && (t = n); + }), i.push(function () { + e.callback.call(e.observer, s, e.observer); + }), e.activeTargets.splice(0, e.activeTargets.length); + } + }); + for (var e = 0, s = i; e < s.length; e++) { + (0, s[e])(); + } + return t; + }, A = function (t) { + a.forEach(function (i) { + i.activeTargets.splice(0, i.activeTargets.length), i.skippedTargets.splice(0, i.skippedTargets.length), i.observationTargets.forEach(function (e) { + e.isActive() && (k(e.target) > t ? i.activeTargets.push(e) : i.skippedTargets.push(e)); + }); + }); + }, I = function () { + var t, i = 0; + for (A(i); a.some(function (t) { + return t.activeTargets.length > 0; + });) + i = _(), A(i); + return a.some(function (t) { + return t.skippedTargets.length > 0; + }) && ('function' == typeof ErrorEvent ? t = new ErrorEvent('error', { message: o }) : ((t = document.createEvent('Event')).initEvent('error', !1, !1), t.message = o), window.dispatchEvent(t)), i > 0; + }, C = [], T = function (t) { + if (!c) { + var i = 0, e = document.createTextNode(''); + new MutationObserver(function () { + return C.splice(0).forEach(function (t) { + return t(); + }); + }).observe(e, { characterData: !0 }), c = function () { + e.textContent = '' + (i ? i-- : i++); + }; + } + C.push(t), c(); + }, P = 0, M = { + attributes: !0, + characterData: !0, + childList: !0, + subtree: !0 + }, E = [ + 'resize', + 'load', + 'transitionend', + 'animationend', + 'animationstart', + 'animationiteration', + 'keyup', + 'keydown', + 'mouseup', + 'mousedown', + 'mouseover', + 'mouseout', + 'blur', + 'focus' + ], L = function (t) { + return void 0 === t && (t = 0), Date.now() + t; + }, R = !1, B = new (function () { + function t() { + var t = this; + this.stopped = !0, this.listener = function () { + return t.schedule(); + }; + } + return t.prototype.run = function (t) { + var i = this; + if (void 0 === t && (t = 250), !R) { + R = !0; + var e, s = L(t); + e = function () { + var e = !1; + try { + e = I(); + } finally { + if (R = !1, t = s - L(), !P) + return; + e ? i.run(1000) : t > 0 ? i.run(t) : i.start(); + } + }, T(function () { + requestAnimationFrame(e); + }); + } + }, t.prototype.schedule = function () { + this.stop(), this.run(); + }, t.prototype.observe = function () { + var t = this, i = function () { + return t.observer && t.observer.observe(document.body, M); + }; + document.body ? i() : p.addEventListener('DOMContentLoaded', i); + }, t.prototype.start = function () { + var t = this; + this.stopped && (this.stopped = !1, this.observer = new MutationObserver(this.listener), this.observe(), E.forEach(function (i) { + return p.addEventListener(i, t.listener, !0); + })); + }, t.prototype.stop = function () { + var t = this; + this.stopped || (this.observer && this.observer.disconnect(), E.forEach(function (i) { + return p.removeEventListener(i, t.listener, !0); + }), this.stopped = !0); + }, t; + }())(), D = function (t) { + !P && t > 0 && B.start(), !(P += t) && B.stop(); + }, F = function () { + function t(t, i) { + this.target = t, this.observedBox = i || s.CONTENT_BOX, this.lastReportedSize = { + inlineSize: 0, + blockSize: 0 + }; + } + return t.prototype.isActive = function () { + var t, i = S(this.target, this.observedBox, !0); + return t = this.target, l(t) || function (t) { + switch (t.tagName) { + case 'INPUT': + if ('image' !== t.type) + break; + case 'VIDEO': + case 'AUDIO': + case 'EMBED': + case 'OBJECT': + case 'CANVAS': + case 'IFRAME': + case 'IMG': + return !0; + } + return !1; + }(t) || 'inline' !== getComputedStyle(t).display || (this.lastReportedSize = i), this.lastReportedSize.inlineSize !== i.inlineSize || this.lastReportedSize.blockSize !== i.blockSize; + }, t; + }(), V = function () { + return function (t, i) { + this.activeTargets = [], this.skippedTargets = [], this.observationTargets = [], this.observer = t, this.callback = i; + }; + }(), U = new WeakMap(), $ = function (t, i) { + for (var e = 0; e < t.length; e += 1) + if (t[e].target === i) + return e; + return -1; + }, N = function () { + function t() { + } + return t.connect = function (t, i) { + var e = new V(t, i); + U.set(t, e); + }, t.observe = function (t, i, e) { + var s = U.get(t), n = 0 === s.observationTargets.length; + $(s.observationTargets, i) < 0 && (n && a.push(s), s.observationTargets.push(new F(i, e && e.box)), D(1), B.schedule()); + }, t.unobserve = function (t, i) { + var e = U.get(t), s = $(e.observationTargets, i), n = 1 === e.observationTargets.length; + s >= 0 && (n && a.splice(a.indexOf(e), 1), e.observationTargets.splice(s, 1), D(-1)); + }, t.disconnect = function (t) { + var i = this, e = U.get(t); + e.observationTargets.slice().forEach(function (e) { + return i.unobserve(t, e.target); + }), e.activeTargets.splice(0, e.activeTargets.length); + }, t; + }(), H = function () { + function t(t) { + if (0 === arguments.length) + throw new TypeError('Failed to construct \'ResizeObserver\': 1 argument required, but only 0 present.'); + if ('function' != typeof t) + throw new TypeError('Failed to construct \'ResizeObserver\': The callback provided as parameter 1 is not a function.'); + N.connect(this, t); + } + return t.prototype.observe = function (t, i) { + if (0 === arguments.length) + throw new TypeError('Failed to execute \'observe\' on \'ResizeObserver\': 1 argument required, but only 0 present.'); + if (!f(t)) + throw new TypeError('Failed to execute \'observe\' on \'ResizeObserver\': parameter 1 is not of type \'Element'); + N.observe(this, t, i); + }, t.prototype.unobserve = function (t) { + if (0 === arguments.length) + throw new TypeError('Failed to execute \'unobserve\' on \'ResizeObserver\': 1 argument required, but only 0 present.'); + if (!f(t)) + throw new TypeError('Failed to execute \'unobserve\' on \'ResizeObserver\': parameter 1 is not of type \'Element'); + N.unobserve(this, t); + }, t.prototype.disconnect = function () { + N.disconnect(this); + }, t.toString = function () { + return 'function ResizeObserver () { [polyfill code] }'; + }, t; + }(); + e.d(i, 'a', function () { + return q; + }); + class q { + constructor(t) { + this.pr = [], this.br = (t, i) => { + t.forEach(t => { + this.vr(t.target).forEach(t => { + t && (Object(h.i)(t.element), t.callback(t.element)); + }); + }); + }; + try { + const i = t.ResizeObserver || H; + this.mr = new i(this.br); + } catch (t) { + Object(n.a)({ + message: 'ResizeObserver_constructor', + callStack: t.stack, + exception: t.message, + level: r.ProtoLoggingLevelEnum.FATAL + }); + } + } + on(t, i) { + this.gr(t, i) || (this.pr.push({ + element: t, + callback: i + }), this.mr.observe(t)); + } + off(t, i) { + const e = this.gr(t, i); + if (!e) + return; + this.mr.unobserve(e.element); + const s = this.pr.indexOf(e); + s >= 0 && this.pr.splice(s, 1); + } + destroy() { + if (this.pr) + for (; this.pr.length > 0;) + this.pr.pop(); + this.mr.disconnect(); + } + vr(t) { + return this.pr.filter(i => { + return i.element === t; + }); + } + gr(t, i) { + return this.pr.find(e => { + return e.element === t && e.callback === i; + }); + } + } + }, + function (t, i, e) { + 'use strict'; + var s, n = e(2); + class r { + constructor(t) { + this.yr = [], this.wr = t => { + this.yr.push(t); + }, this.Or = t.subscribe(this.wr); + } + get cachedEvents() { + return this.yr; + } + destroy() { + this.yr = null, this.Or(); + } + } + !function (t) { + t.AdobeAnalytics = 'AdobeAnalytics', t.MoatAnalytics = 'MoatAnalytics'; + }(s || (s = {})); + var h = e(1), a = e(5), o = e(0), c = e(6), u = e(31), l = e(8), d = e(19), f = e(21), p = e(14); + e.d(i, 'a', function () { + return b; + }); + class b { + constructor(t, i, e, s, n) { + this.xr = i, this.Sr = e, this.jr = s, this.kr = n, this._r = [], this.Ar = t => { + try { + this.Ir(t); + const i = this._r.find(i => { + return i.name === t.type; + }); + let e; + if (i && !i.started) { + i.started = !0; + const t = i.eventsCacheHandler; + e = t.cachedEvents, t.destroy(); + } + const { + adobeAnalyticsSettings: s, + moatAnalyticsSettings: n, + _debugLogging: r + } = this.jr.apiConfig.settings.plugins, { + secondLevelDomain: h, + playerId: c + } = this.jr, u = { + cachedEvents: e, + adobeAnalyticsSettings: s, + moatAnalyticsSettings: n, + _debugLogging: r, + secondLevelDomain: h, + playerId: c, + pageName: this.Cr, + pageUrl: this.We, + version: f.a.version, + delegateHandlers: this.Sr, + playerContainer: this.kr, + playerWindow: window + }; + t.getInstance().start(this.xr, u); + } catch (t) { + Object(a.a)({ + callStack: t.stack, + exception: t.message, + level: o.ProtoLoggingLevelEnum.FATAL, + message: 'PluginsHandler_initPlugin' + }); + } + }; + const r = Object(l.f)(t); + this.fe = r.topFrame, this.We = Object(l.e)(r, this.fe), this.We = Object(d.d)(this.We), this.Cr = Object(d.a)(this.We); + } + start() { + this.Tr(), this.Pr(), this.fe.cnxPlugins.pluginsHandlers.push(this.Ar); + } + Tr() { + let t = []; + Array.isArray(this.fe.cnxPlugins) && this.fe.cnxPlugins.length > 0 && (t = this.fe.cnxPlugins).forEach(t => { + return this.Ar(t); + }), Object(h.f)(this.fe.cnxPlugins) || this.Mr(t); + } + Pr() { + const t = this.Er(); + Object(c.h)(t) && this.Lr(t); + } + Rr(t) { + const i = this.fe.cnxPlugins.cachedPlugins; + if (Object(c.h)(i)) + return i.find(i => { + return i.type === t; + }); + } + Ir(t) { + this.Rr(t.type) || this.fe.cnxPlugins.cachedPlugins.push(t); + } + Mr(t) { + this.fe.cnxPlugins = { + cachedPlugins: t, + pluginsHandlers: [], + push: function (t) { + this.pluginsHandlers.forEach(i => { + i(t); + }); + } + }; + } + Lr(t) { + t.forEach(t => { + this.Rr(t) || this._r.push({ + name: t, + started: !1, + eventsCacheHandler: new r(this.xr) + }); + }), this._r.forEach(({name: t}) => { + return this.Br(t); + }); + } + Dr(t) { + return Object(u.a)(t).every(t => { + return Object(h.h)(t); + }); + } + Er() { + const t = []; + return this.jr.apiConfig.settings.plugins.adobeAnalyticsSettings && this.Dr(this.jr.apiConfig.settings.plugins.adobeAnalyticsSettings) && t.push(s.AdobeAnalytics), this.jr.moatTrackingEnabled && t.push(s.MoatAnalytics), t; + } + Br(t) { + const i = { + id: `cnx-${ t }`, + src: '' + }; + switch (t) { + case s.AdobeAnalytics: + i.src = p.a.endPoints.assets.plugins.adobeAnalytics; + break; + case s.MoatAnalytics: + i.src = p.a.endPoints.assets.plugins.moatAnalytics; + } + this.fe.document.getElementById(i.id) || Object(n.x)(i, this.fe.document.head, this.fe, null, null, !0, 'PluginsHandler_unable_to_insert_plugin_script'); + } + } + }, + function (t, i, e) { + 'use strict'; + var s, n, r = e(25), h = e(12), a = e(43); + !function (t) { + t.Minimized = 'minimized', t.Collapsed = 'collapsed', t.Normal = 'normal', t.Expanded = 'expanded', t.Fullscreen = 'fullscreen'; + }(s || (s = {})), function (t) { + t.StateChanged = 'stateChanged'; + }(n || (n = {})); + class o { + constructor(t) { + this.mediator = t; + } + computeState(t) { + const i = this.Fr(t); + this.Vr && this.Vr.name === i || this.mediator.publish(this, n.StateChanged, { payload: { state: i } }), this.Vr = { + dimensions: t, + name: i + }, this.Ur || i !== s.Normal || (this.Ur = Object.assign({}, this.Vr)); + } + setPlayerState(t) { + this.Vr && this.Vr.name === t || this.mediator.publish(this, n.StateChanged, { payload: { state: t } }), this.Vr = { name: t }, this.Ur || t !== s.Normal || (this.Ur = Object.assign({}, this.Vr)); + } + get currentState() { + return this.Vr && this.Vr.name; + } + Fr(t) { + if (!this.Ur) + return s.Normal; + const { + width: i, + height: e + } = this.Ur.dimensions, n = i * e, r = t.width * t.height; + switch (!0) { + case n < r: + return s.Expanded; + case n > r: + return s.Collapsed; + default: + return s.Normal; + } + } + } + var c = e(20), u = e(5), l = e(0); + e.d(i, 'a', function () { + return d; + }); + class d extends c.a { + constructor(t, i, e) { + super(), this.$r = t, this.xr = i, this.Nr = new o(this), this.Hr = !1, this.qr = { + [h.a.AdError]: () => { + return this.zr(); + }, + [h.a.PlayError]: () => { + return this.Wr(); + }, + [h.a.RenderError]: () => { + return this.Gr(); + }, + [h.a.AdImpression]: () => { + return this.Jr(); + }, + [h.a.AdComplete]: () => { + return this.Qr(); + }, + [h.a.AdVideoStart]: ({adVideoStartMetadata: t}) => { + return this.Xr(t); + }, + [h.a.AdVideoFirstQuartile]: () => { + return this.Yr(); + }, + [h.a.AdVideoMidpoint]: () => { + return this.Kr(); + }, + [h.a.AdVideoThirdQuartile]: () => { + return this.Zr(); + }, + [h.a.AdVideoComplete]: () => { + return this.th(); + }, + [h.a.VolumeChange]: ({volume: t}) => { + return this.ih(t); + }, + [h.a.AdPause]: () => { + return this.eh(); + }, + [h.a.AdPlay]: () => { + return this.sh(); + }, + [h.a.AdSkipped]: () => { + return this.nh(); + }, + [h.a.AdClickThru]: () => { + return this.rh(); + }, + [h.a.AdInteraction]: () => { + return this.hh(); + }, + [h.a.AdLoaded]: ({adLoadedMetadata: t}) => { + return this.ah(t); + }, + [h.a.AdStateChange]: ({adStateChangedMetadata: t}) => { + return this.oh(t); + }, + [h.a.PlayerResized]: ({playerDimensionsMetadata: t}) => { + return this.uh(t); + }, + [h.a.OnEnterFullscreen]: () => { + return this.lh(); + }, + [h.a.PlayerCollapsed]: () => { + return this.dh(); + }, + [h.a.PlayerExpanded]: () => { + return this.fh(); + }, + [h.a.Destroy]: () => { + return this.unsubscribeAll(this.Nr); + } + }, this.ph = t => { + try { + const i = this.qr[t.name]; + if (!i) + return; + i(t.metadata); + } catch (t) { + Object(u.a)({ + message: 'SessionClientWrapper_omsdk__onEventStorageEvent', + exception: t.message, + callStack: t.callStack, + level: l.ProtoLoggingLevelEnum.WARNING + }); + } + }; + try { + const { + AdSession: t, + AdEvents: i, + MediaEvents: s + } = this.$r, r = this.bh(e); + this.vh = new t(r), this.mh = new i(this.vh), this.gh = new s(this.vh), this.xr.subscribe(this.ph), this.subscribe(n.StateChanged, this.Nr, ({ + payload: {state: t} + }) => { + this.yh(t); + }), this.wh(); + } catch (t) { + Object(u.a)({ + message: 'SessionClientWrapper_omsdk_classes_init_err', + exception: t.message, + callStack: t.callStack, + level: l.ProtoLoggingLevelEnum.WARNING + }); + } + } + zr() { + this.vh.error(r.d.Video, h.a.AdError); + } + Wr() { + this.vh.error(r.d.Video, h.a.PlayError); + } + Gr() { + this.vh.error(r.d.Generic, h.a.RenderError); + } + bh(t) { + const { + Partner: i, + Context: e + } = this.$r; + return new e(new i(r.i, t)); + } + Jr() { + this.Hr = !0, this.mh.impressionOccurred(); + const t = this.Nr.currentState; + t !== s.Normal && this.yh(t); + } + Qr() { + this.Hr = !1; + } + Xr(t) { + const { + duration: i, + mediaPlayerVolume: e + } = t; + this.gh.start(i, e); + } + Yr() { + this.gh.firstQuartile(); + } + Kr() { + this.gh.midpoint(); + } + Zr() { + this.gh.thirdQuartile(); + } + th() { + this.gh.complete(); + } + ih(t) { + this.Hr && this.gh.volumeChange(t); + } + eh() { + this.gh.pause(); + } + sh() { + this.gh.resume(); + } + nh() { + this.gh.skipped(); + } + rh() { + this.gh.adUserInteraction(r.g.Click); + } + hh() { + this.gh.adUserInteraction(r.g.InvitationAccept); + } + ah(t) { + const { + isSkippable: i, + skipOffset: e, + isAutoPlay: s + } = t, {VastProperties: n} = this.$r, r = new n(i, e, s, this.Oh); + this.mh.loaded(r); + } + oh({state: t}) { + this.Oh = r.h[a.a[t]]; + } + yh(t) { + t && this.gh.playerStateChange(t); + } + xh(t) { + this.Nr.computeState(t); + } + Sh(t) { + this.Nr.setPlayerState(t); + } + uh(t) { + this.xh(t); + } + lh() { + this.Sh(s.Fullscreen); + } + dh() { + this.Sh(s.Minimized); + } + fh() { + this.Sh(s.Normal); + } + wh() { + this.vh.registerSessionObserver(t => { + t.type === r.b.SessionStart ? this.jh(t) : t.type === r.b.SessionError && Object(u.a)({ + message: 'SessionClientWrapper_omsdk_session_error', + exception: t.type, + callStack: JSON.stringify(t), + level: l.ProtoLoggingLevelEnum.WARNING, + throttle: 1, + sendMaxLog: !1 + }); + }); + } + jh(t) { + t.data.creativeType === r.c.DefinedByJavascript && this.vh.setCreativeType(r.c.Video), t.data.impressionType === r.f.DefinedByJavascript && this.vh.setImpressionType(r.f.BeginToRender); + } + } + }, + function (t, i, e) { + 'use strict'; + var s, n, r, h, a = e(4), o = e(10); + !function (t) { + t[t.X = 0] = 'X', t[t.Y = 1] = 'Y'; + }(s || (s = {})), function (t) { + t.Click = 'click', t.InteractionStart = 'interactionstart', t.Interaction = 'interaction', t.InteractionEnd = 'interactionend'; + }(n || (n = {})), function (t) { + t[t.Swipe = 0] = 'Swipe', t[t.Hold = 1] = 'Hold'; + }(r || (r = {})), function (t) { + t[t.Left = 0] = 'Left', t[t.Right = 1] = 'Right'; + }(h || (h = {})); + var c = e(6), u = e(2); + const l = { + MAIN: 0, + AUXILIARY: 1, + SECONDARY: 2, + FOURTH: 3, + FIFTH: 4 + }; + function d(t) { + return t.button === l.MAIN; + } + var f = e(15), p = e(1); + e.d(i, 'a', function () { + return g; + }); + const b = 25, v = 250, m = 30; + class g { + constructor(t, i, e) { + this.kh = t, this.Qn = i, this.mediator = null, this._h = m, this.Ah = v, this.Ih = b, this.Ch = [], this.Th = {}, this.Ph = 0, this.Mh = 0, this.Eh = !0, this.Lh = null, this.Rh = !1, this.Bh = !1, this.Dh = !1, this.Fh = !1, this.Vh = 0, this.Uh = 0, this.$h = null, this.Nh = null, this.Hh = null, this.qh = !0, this.zh = !1, this.Wh = t => { + this.Qn ? (t.element.addEventListener('touchstart', this.Gh, { passive: !0 }), t.element.addEventListener('touchmove', this.Jh, { passive: !0 }), t.element.addEventListener('touchend', this.Qh), t.element.addEventListener('touchcancel', this.Xh), t.element.addEventListener('mouseup', this.Yh)) : (t.element.addEventListener('mousedown', this.Kh), t.element.addEventListener('mouseup', this.Yh)); + }, this.Zh = t => { + this.Qn ? (t.element.removeEventListener('touchstart', this.Gh), t.element.removeEventListener('touchmove', this.Jh), t.element.removeEventListener('touchend', this.Qh), t.element.removeEventListener('touchcancel', this.Xh), t.element.removeEventListener('mouseup', this.Yh)) : (t.element.removeEventListener('mousedown', this.Kh), t.element.removeEventListener('mouseup', this.Yh)); + }, this.Gh = t => { + t.stopPropagation(); + const i = this.ta(t); + this.Hh = i, this.Bh = !1, this.ia(i, r.Hold) && this.ea(t); + const e = this.sa(t); + this.Mh = e.eventX, this.Ph = e.eventY, this.na(t, i, n.InteractionStart), this.Eh = !0; + }, this.Jh = t => { + t.stopPropagation(); + const i = this.ta(t), e = this.sa(t); + if (this.Eh && (Math.abs(e.deltaXFromStart) > this.Ih || Math.abs(e.deltaYFromStart) > this.Ih) && (this.Eh = !1), this.Rh || this.ia(i, r.Swipe)) { + if (null === this.$h && this.ra(i, e), this.$h === s.Y) + return; + null === this.Nh && (this.Nh = Object(u.M)(this.kh, () => { + this.Nh = null, this.ha(e.deltaXFromStart), i.mediator.publish(i.context, o.a[o.a.SwipeMove], { payload: e.deltaXFromStart }); + })); + } + }, this.Qh = t => { + const i = this.ta(t); + if (this.zh = !1, this.Hh === i) { + const e = this.sa(t); + t.cancelable && this.ia(i, r.Hold) && Math.abs(e.deltaXFromStart) < this.Ih && Math.abs(e.deltaYFromStart) < this.Ih && t.preventDefault(), this.aa(t, i, e), this.oa(e) === s.Y && Math.abs(e.deltaYFromStart) >= this.Ih ? this.qh && i.mediator.publish(i.context, o.a[o.a.Scroll]) : !this.Eh || this.Dh || this.Bh || (this.zh = !0); + } + this.Hh = null; + }, this.Xh = t => { + const i = this.ta(t); + this.aa(t, i), this.Hh = null; + }, this.Kh = t => { + if (!d(t)) + return void this.ca(n.InteractionStart, t); + const i = this.ta(t); + this.Hh = i, t.stopPropagation(), t.preventDefault(), this.ia(i, r.Hold) && this.ea(t), this.na(t, i, n.InteractionStart); + }, this.Yh = t => { + const i = this.ta(t); + return this.zh ? (i.mediator.publish(i.context, o.a[o.a.Click]), void (this.zh = !1)) : d(t) && this.Hh ? (t.stopPropagation(), t.preventDefault(), this.na(t, this.Hh, n.Interaction), this.na(t, this.Hh, n.InteractionEnd), (this.Rh || this.ia(i, r.Hold)) && this.ua(t), this.Hh === i && (this.na(t, i, n.Click), i.mediator.publish(i.context, o.a[o.a.Click])), void (this.Hh = null)) : (this.ca(n.Interaction, t), void this.ca(n.InteractionEnd, t)); + }, this.la = t => { + if (!d(t)) + return this.ca(n.Interaction, t), void this.ca(n.InteractionEnd, t); + this.Hh = null; + }, this.da = t => { + if (!d(t) || !this.Hh) + return this.ca(n.Interaction, t), void this.ca(n.InteractionEnd, t); + this.na(t, this.Hh, n.Interaction), this.na(t, this.Hh, n.InteractionEnd), (this.Rh || this.ia(this.Hh, r.Hold)) && this.ua(t), this.Hh = null; + }; + const { + leftTapSizeThreshold: h, + holdTriggerDuration: a, + scrollThreshold: c + } = Object.assign({}, e); + this._h = h || this._h, this.Ah = a || this.Ah, this.Ih = c || this.Ih, this.kh.document.addEventListener('mousedown', this.la), this.kh.document.addEventListener('mouseup', this.da); + } + register(t, i, e, s = (() => { + return {}; + })(), n = (() => { + return []; + })()) { + const r = { + element: t, + mediator: i, + context: e, + callbacks: s || {}, + allowedSpecialInteractions: n, + disabledSpecialInteractions: [] + }; + this.Ch.push(r), this.Wh(r); + } + unregister(t) { + const i = this.Ch.find(i => { + return i.element === t; + }); + i && (this.Ch = this.Ch.filter(i => { + return i.element !== t; + }), this.Zh(i)); + } + unregisterAll(t) { + const i = this.Ch.filter(i => { + return i.mediator === t; + }); + i.forEach(this.Zh), this.Ch = Object(c.a)(this.Ch, i); + } + addGlobalActions(t, i) { + Object.keys(Object.assign({}, i)).forEach(e => { + this.Th[e] = this.Th[e] || [], this.Th[e].push({ + initiator: t, + action: i[e] + }); + }); + } + removeGlobalActions(t) { + Object.keys(this.Th).forEach(i => { + this.Th[i].some(i => { + return i.initiator === t; + }) && (this.Th[i] = this.Th[i].filter(i => { + return i.initiator !== t; + })); + }); + } + disableSpecialInteractions(t) { + const i = this.fa(t); + i.disabledSpecialInteractions = Object(c.n)(i.allowedSpecialInteractions); + } + enableSpecialInteractions(t) { + this.fa(t).disabledSpecialInteractions = []; + } + getNonInterruptibleInteractions() { + return [ + o.a.HoldStart, + o.a.HoldEnd, + o.a.SwipeMove, + o.a.SwipeEnd, + o.a.Scroll + ]; + } + disableScrollEvent() { + this.qh = !1; + } + enableScrollEvent() { + this.qh = !0; + } + destroy() { + clearTimeout(this.Lh), this.Ch.forEach(this.Zh), this.kh.document.removeEventListener('mousedown', this.la), this.kh.document.removeEventListener('mouseup', this.da); + } + pa(t) { + const i = this.ta(t), e = i.element.getBoundingClientRect(), s = this.ba(t), n = e.width, r = Object(f.e)(0, n, 0, 100, s); + this.va(i, this._h, r); + } + va(t, i, e) { + e < i ? t.mediator.publish(t.context, o.a[o.a.TapLeft]) : t.mediator.publish(t.context, o.a[o.a.TapRight]); + } + ea(t) { + clearTimeout(this.Lh), this.Rh = !1, this.Dh = !1; + const i = this.ta(t); + Object(u.a)(i.element, a.h.OnHold), this.Lh = setTimeout(() => { + this.Rh = !0, this.Eh && (this.Dh = !0, i.mediator.publish(i.context, o.a[o.a.HoldStart])); + }, this.Ah); + } + ua(t) { + clearTimeout(this.Lh); + const i = this.ta(t); + Object(u.I)(i.element, a.h.OnHold), this.Rh ? (this.Rh = !1, this.Dh && (this.Dh = !1, i.mediator.publish(i.context, o.a[o.a.HoldEnd]))) : (this.Bh = !0, this.pa(t)); + } + aa(t, i, e) { + e = e || this.sa(t), t.stopPropagation(), this.na(t, i, n.Interaction), this.na(t, i, n.InteractionEnd), (this.Rh || this.Fh || this.Eh && this.ia(i, r.Hold)) && this.ua(t), (this.Fh || this.ia(i, r.Swipe)) && this.ma(i, e); + } + ra(t, i) { + this.$h = this.oa(i), this.$h === s.X && (this.Fh = !0, this.Rh || (clearTimeout(this.Lh), this.Lh = null, this.Rh = !0, t.mediator.publish(t.context, o.a[o.a.HoldStart]))); + } + ma(t, i) { + if (this.Fh) { + const e = this.ga(i); + t.mediator.publish(t.context, o.a[o.a.SwipeEnd], { payload: e }); + } + Object(u.e)(this.kh, this.Nh), this.Nh = null, this.Fh = !1, this.Mh = null, this.Ph = null, this.$h = null, this.Vh = 0, this.Uh = 0; + } + ha(t) { + this.Uh < this.Ih ? this.Uh++ : (this.Vh = t, this.Uh = 0); + } + oa(t) { + return Math.abs(t.deltaXFromStart) >= Math.abs(t.deltaYFromStart) ? s.X : s.Y; + } + ga(t) { + return t.deltaXFromStart - this.Vh < 0 ? h.Left : h.Right; + } + sa(t) { + const i = t.changedTouches[0]; + return { + deltaXFromStart: i.clientX - this.Mh, + deltaYFromStart: i.clientY - this.Ph, + eventX: i.clientX, + eventY: i.clientY + }; + } + ta(t) { + return this.Hh || this.fa(t.currentTarget); + } + fa(t) { + return this.Ch.find(i => { + return i.element === t; + }); + } + ba(t) { + const i = this.ta(t); + if (this.Qn) { + return t.changedTouches[0].clientX - i.element.getBoundingClientRect().left; + } + return t.offsetX; + } + ia(t, i) { + return t.allowedSpecialInteractions.includes(i) && !t.disabledSpecialInteractions.includes(i); + } + na(t, i, e) { + const s = i.callbacks[e]; + Object(p.b)(s) && s(t), this.ca(e, t); + } + ca(t, i) { + var e; + null === (e = this.Th[t]) || void 0 === e || e.forEach(t => { + t.action(i); + }); + } + } + }, + function (t, i, e) { + 'use strict'; + var s = e(23), n = e(0), r = e(21), h = e(14), a = e(11); + class o { + constructor() { + this.ya = null, this.wa = 0; + } + Oa() { + if (null === this.ya) + return; + const t = new Date().getTime(); + this.wa = t - this.ya; + } + startCountingTime() { + this.ya = new Date().getTime(); + } + stopCountingTime() { + this.Oa(), this.ya = null; + } + fetchTime(t) { + this.Oa(); + const i = Math.round(this.wa / a.f); + return this.wa = 0, null !== this.ya && this.startCountingTime(), i > t ? t : i; + } + } + var c = e(20), u = e(1), l = e(34), d = e(32), f = e(8), p = e(6), b = e(30); + e(42); + e.d(i, 'a', function () { + return m; + }); + const v = 500; + class m extends c.a { + constructor({ + userId: t, + playerId: i, + geoLocation: e, + browser: s, + sessionId: n, + pageUrl: h, + bundleId: a, + xa: c, + userManagerService: u, + customParam1: d, + customParam2: b, + customParam3: v, + customParam4: m, + customParam5: g, + abTestId: y, + explorationMode: w + }) { + super(), this.hasGdprConsentPayload = !1, this.Sa = {}, this.ja = {}, this.ka = !1, this._a = !1, this.Aa = !1, this.Ia = !1, this.Ca = [], this.Ta = [], this.Pa = [], this.Ma = 5000, this.Ea = !1, this.xa = !1, this.La = [ + { + delay: 7, + timesRepeatDelay: 1 + }, + { + delay: 8, + timesRepeatDelay: 1 + }, + { + delay: 15, + timesRepeatDelay: 3 + }, + { + delay: 30, + timesRepeatDelay: 2 + }, + { + delay: 60, + timesRepeatDelay: 1 + }, + { + delay: 120, + timesRepeatDelay: 1 + }, + { + delay: 300, + timesRepeatDelay: 8 + }, + { + delay: 600, + timesRepeatDelay: 13 + }, + { delay: 1800 } + ], this.Ra = 0, this.Ba = []; + Object(p.g)(i, [ + '47286b3d-90c5-4634-ac87-0061769d15a8', + '2a9c6007-6213-4187-9b0d-1a6e9d7826f0', + 'dac6e2fc-472a-46e6-8a6b-b5bea57a50bc', + '112cdb88-91ea-452d-990c-03a7d3118d2c', + '075127fa-fec9-4ee7-9a4c-bfb4478a4412', + '2febda63-6ec9-4951-9c07-5939376b8226', + '55ca7ad7-f311-4854-b29a-a2d590760493', + '62bbbcda-024e-4769-968a-db84830f65cc', + '648d8d4d-fa41-496c-8415-26f3ad2d1989', + '6fdffbf5-b899-44ac-96a6-4eab50497b5b', + 'b6094ff6-54a0-4ddd-b799-66193f8346c7', + 'c81bb1f8-de80-428b-ae42-1ce0e75d3998', + 'ddbadb2c-9e78-442a-b757-a49113a791ed', + '20d71b12-41ce-45db-8135-1a3cd111b25d', + '13e4ee65-6bed-40e6-8e41-4ef9087c294b', + '62d76d13-cd32-4021-a243-98b2444cd14d', + 'b1c78103-4bb7-47ac-9cfe-dcd9b603e8a2', + '77a7ef56-c608-456d-8ff9-a382d139ff95', + '5d8eeea7-4ee0-4ad7-9023-97fbc8d97fa7', + 'ed379095-5f46-4c1c-917d-ad063d84eaf1', + '0527ea2b-cb60-408e-85c1-e500bee128c3', + '148a0193-55d6-47a1-8a33-2c4ba9c97b5e', + '27937f13-f008-457b-938c-87c9fe447de8', + '4c2b6243-5715-4651-a27e-f6052b61af80', + '10efae62-af17-4d47-a65e-baabc2b60496', + '65d7cfb4-70a5-480a-95a7-25a713d61695', + '6e3ef6a1-2ccf-48b3-973c-55244487dc38', + '13426e00-211b-4c70-981e-d71a622543cf', + '728b020d-aa32-4009-ad0d-9c1b6b57b3c9', + '77e6bf0d-befe-4364-9f95-df37d478f297', + '19e14bfd-d5ef-4f82-8c9d-ea19512d0793', + '8c175c10-202a-4275-9e10-5ab9b216a61d', + '9429315c-a644-4fbf-938f-30cd23f2b098', + 'a1bf91f8-98cb-4642-a2ec-2124782bf273', + '3025741e-c645-46ee-93db-c6b1c5cdb842', + 'c32f1fb1-68d7-41cc-9a33-5f541d5b0cfd', + 'c92ebcd4-b4c1-449e-809a-6744a0cd21d1', + 'd0ad8360-284d-47d3-861d-6be5b09619e1', + '9b3b0ce6-cae5-43e0-b669-023c76e9127f', + 'bbb6ab44-3b47-44d8-990c-642de4bb12ba', + 'eeb97179-3486-4ca8-968c-c18f49e3be4a', + 'ffc13c6a-6d6b-48dc-9965-d5a5adfea0f1', + 'a8ec4044-50c7-46b1-8e8a-4da98ff95aed', + 'ce2e36d0-8e66-4433-bb3c-47e78ad6f250', + '079b7e9c-6d8f-4772-b5d7-579c6f5f873b', + '04f884af-47ec-4754-a913-b38823f701a5', + '2e7b1501-840a-46f0-a3ae-015008b666d8', + '2ea0b3ba-66c9-46f4-a4a3-300f1bb36a93', + '3e1fcf24-0e7a-4aeb-9dce-a98d552dd7c7', + '5156a44c-a3d9-40ad-a592-b6ffb8019b2a', + '6b55d261-63c7-4349-804f-3d9bbd7aac85', + '8d95a3a5-ffa0-4932-8208-e06a8f659b55', + 'a49d8dbb-b91f-41a3-b5a8-8a5b053af776', + 'a585524a-2784-4b2d-924b-d872994cb7a8', + '225f96d6-6d58-483b-8856-ddffd61bac40', + 'ad5efc62-db13-40f2-a76e-df9b90a2687b', + '08b46451-1849-433c-9019-85b2aeca87d1', + 'bb5ad3b4-8fcd-4cb8-af70-383839db3712', + 'e68c7376-e6c7-44ff-ad65-775691372f19', + 'f5a3920b-15fc-4b52-8586-16091b9bedde', + '0c83603a-5d0c-4b62-a613-5f2db36510d3', + '0f3c7056-05d4-46fe-824c-32df48115369', + '81329826-a1f3-4f0b-86e1-2c1fb58cac85', + 'a7b4eaad-8dea-41d5-8bd0-c8f13cd84296', + 'c1282781-f75a-46b7-b774-5695e0a74c3d', + 'd47819ae-be18-4054-8ffd-dc86eb6fdb5a' + ]) ? this.Sa.trackAllRequests = !0 : this.Sa.trackAllRequests = 1 === Object(f.k)([ + 99, + 1 + ]), this.Da = u, this.Sa.userId = t, this.Sa.playerId = i, this.Sa.geo = e, this.Sa.browser = s, this.Sa.version = r.a.version, this.Sa.sessionId = n, this.Sa.clientAb0 = l.a.clientAb0, this.Sa.clientAb1 = l.a.clientAb1, this.Sa.serverAb0 = l.a.serverAb0, this.Sa.serverAb1 = l.a.serverAb1, this.Sa.pageUrl = h, this.Sa.bundleId = a, this.Sa.customParam1 = d, this.Sa.customParam2 = b, this.Sa.customParam3 = v, this.Sa.customParam4 = m, this.Sa.customParam5 = g, this.Sa.abTestId = y, this.Fa = new o(), this.Va = new o(), this.Ua = w; + } + $a(t, i = (() => { + return n.ProtoTrackingRequest; + })(), e, r = (() => { + return !0; + })()) { + return this.Sa.pageInFocus = b.a.pageFocus, s.a.sendProtoBeaconRequest({ + endpoint: t, + ProtoRequest: i, + requestData: Object.assign({ trackingRequestMeta: r ? this.Sa : void 0 }, e), + logError: !1 + }); + } + Na(t, i = (() => { + return n.ProtoTrackingRequest; + })(), e, h = (() => { + return !0; + })()) { + this.Sa.pageInFocus = b.a.pageFocus; + const a = s.a.sendProtoRequest({ + endpoint: t, + ProtoRequest: i, + ProtoResponse: n.ProtoTrackingResponse, + requestData: Object.assign({ trackingRequestMeta: h ? this.Sa : void 0 }, e), + queryParams: { [d.b]: r.a.version }, + withCredentials: !0, + logError: !0 + }); + return a.then(t => { + const i = t.platformCappedLineItemIdList; + Object(p.h)(i) && this.Ba.forEach(t => { + t.setPlatformCappedLineItemIdList(i); + }); + const { + impressionRevenue: e, + adServerLineItemName: s + } = t; + Object(u.e)(e) && Object(u.h)(s) && this.Ha && this.Ha.notifyImpressionRevenue({ + impressionRevenue: e, + adServerLineItemName: s + }); + }).catch(t => { + }), a; + } + addPlatformCappedLineItemSubscriber(t) { + this.Ba.push(t); + } + removePlatformCappedLineItemSubscriber(t) { + const i = this.Ba.indexOf(t); + i >= 0 && this.Ba.splice(i, 1); + } + setImpressionRevenueSubscriber(t) { + this.Ha = t; + } + unsubscribeToImpressionRevenue(t) { + this.Ha !== t && (this.Ha = void 0); + } + qa(t, i, e = (() => { + return n.ProtoMediaTrackingRequest; + })()) { + const s = Object.assign({}, i); + Object(u.h)(this.ja.mediaId) && (s.mediaGuid = this.ja.mediaId), this.Na(t, e, s); + } + za() { + this.Ea || (this.Ea = !0, this.Na(h.a.endPoints.tracking.playerStart, n.ProtoTrackingRequest)); + } + Wa(t, i, e = (() => { + return n.ProtoMediaTrackingRequest; + })()) { + return this.Na(t, e, Object.assign({ mediaGuid: this.ja.mediaId }, i)); + } + Ga(t) { + this.qa(h.a.endPoints.tracking.media_quartile, { + baseMeta: this.ja, + mediaId: this.ja.mediaId, + quartile: t + }); + } + Ja() { + this.Qa(this.Ta, this.Ca, this.Pa), this.Ta = [], this.Ca = [], this.Pa = []; + } + Qa(t, i, e) { + if (0 === t.length && 0 === i.length && 0 === e.length) + return; + e.forEach(t => { + t.error && t.error.length > 0 && (t.error = t.error.substring(0, v)); + }); + const s = { + mediaGuid: this.ja.mediaId, + prebids: t, + bids: i, + postBids: e, + logEveryting: this.xa, + hasGdprConsentPayload: this.hasGdprConsentPayload, + gdprConsentMode: this.Da.gdprConsentMode, + useExploration: this.Ua + }; + this.Na(h.a.endPoints.tracking.bids, n.ProtoBidTrackingsRequest, s); + } + Xa(t) { + this.Na(h.a.endPoints.tracking.ad_click, n.ProtoAdClickTrackingRequest, Object.assign({ mediaGuid: this.ja.mediaId }, t)); + } + Ya(t) { + this.$a(h.a.endPoints.tracking.heavy_ad_intervention, n.ProtoHeavyAdTrackingRequest, t); + } + Ka() { + const t = this.La[this.Ra]; + clearTimeout(this.Za), this.Za = setTimeout(() => { + this.to(t.delay), Object(u.e)(t.timesRepeatDelay) && t.timesRepeatDelay--, 0 === t.timesRepeatDelay && this.Ra++, this.Ka(); + }, 1000 * t.delay); + } + to(t) { + this.Na(h.a.endPoints.tracking.session_time, n.ProtoSessionTimeTrackingRequest, { + trackingRequestMeta: this.Sa, + sessionTime: t, + timePlayed: this.Fa.fetchTime(t), + timePlayedInView: this.Va.fetchTime(t) + }); + } + setNewMedia(t) { + this.ja = t; + } + updateMediaMetadata(t) { + this.ja = t; + } + setImplementationTypeOnMeta(t) { + this.Sa.implementationType = t; + } + setMediaStart() { + this.Ga(n.ProtoQuartilesEnum.Start); + } + setContentStart() { + this.za(); + } + setSessionPlayback(t) { + this.Aa !== t && (this.Aa = t, this.Ia && this.Aa && this.Va.startCountingTime(), this.Aa ? this.Fa.startCountingTime() : (this.Fa.stopCountingTime(), this.Va.stopCountingTime())); + } + setSessionViewability(t) { + this.Ia !== t && (this.Ia = t, this.Ia && this.Aa ? this.Va.startCountingTime() : this.Ia || this.Va.stopCountingTime()); + } + trackSessionRendered(t) { + if (this.ka) + return; + this.Na(h.a.endPoints.tracking.session_rendered, n.ProtoTrackingRequest, { + hasAdBlocker: t, + bundleName: 'player.dc.js' + }), this.ka = !0, this.Ka(); + } + trackSessionViewability() { + !this._a && this.Ea && (this.Na(h.a.endPoints.tracking.session_view), this._a = !0); + } + trackMediaQuartile(t) { + this.Ga(t); + } + trackMediaClick(t = (() => { + return n.ProtoMediaClickTypeEnum.Click; + })()) { + const i = { + type: t, + clickUrl: t === n.ProtoMediaClickTypeEnum.UrlClick ? this.ja.clickUrl : void 0, + slideTitle: this.ja.slideTitle, + slideNumber: this.ja.slideNumber, + slideMediaType: this.ja.slideMediaType + }; + this.qa(h.a.endPoints.tracking.media_click, i, n.ProtoMediaClickTrackingRequest); + } + setAdStart() { + this.za(); + } + startBidRequests() { + this.io = setInterval(() => { + this.Ja(); + }, this.Ma); + } + addPrebid(t) { + this.Ta.push(t); + } + addPostBid(t) { + Object(u.g)(t.error) || (t.error = JSON.stringify(t.error)), this.Pa.push(t); + } + addBid(t) { + this.Ca.push(t); + } + trackAuctionInfoForBid(t) { + this.Na(h.a.endPoints.tracking.auctionInformation, n.ProtoAuctionInfoRequest, t); + } + trackVideoAdImpression(t) { + return this.Wa(h.a.endPoints.tracking.ad_impression, t, n.ProtoVideoAdImpressionRequest); + } + trackVideoAdImpressionViewable(t) { + return this.Wa(h.a.endPoints.tracking.ad_impression_viewable, t, n.ProtoVideoAdImpressionViewableRequest); + } + trackVideoAdQuartile(t) { + this.qa(h.a.endPoints.tracking.ad_quartile, t, n.ProtoVideoAdQuartilesRequest); + } + trackAdClick(t) { + this.Xa(t); + } + trackAdOpportunity(t) { + const {sessionId: i} = this.Sa; + t.sessionId = i, this.Na(h.a.endPoints.tracking.adOpportunity, n.ProtoAdOpportunityRequest, t); + } + trackSessionAdBlocker(t) { + this.Na(h.a.endPoints.tracking.sessionAdBlocker, n.ProtoSessionAdBlockerRequest, { + trackingRequestMeta: this.Sa, + adBlockDetectionType: t + }); + } + getMetadataModel() { + return this.Sa; + } + updateMetadataModel(t) { + this.Sa = Object.assign(Object.assign({}, this.Sa), t); + } + trackHeavyAdIntervention(t) { + this.Ya(t); + } + destroy() { + clearInterval(this.Za), clearInterval(this.io); + } + } + }, + function (t, i, e) { + 'use strict'; + var s, n = e(1), r = e(0); + !function (t) { + t[t.Desktop = 2] = 'Desktop', t[t.SmartTV = 3] = 'SmartTV', t[t.Smartphone = 4] = 'Smartphone', t[t.Tablet = 5] = 'Tablet', t[t.GameConsole = 6] = 'GameConsole', t[t.Unrecognized = 7] = 'Unrecognized'; + }(s || (s = {})); + const h = { + [r.ProtoDeviceType.Desktop]: s.Desktop, + [r.ProtoDeviceType.Smartphone]: s.Smartphone, + [r.ProtoDeviceType.Tablet]: s.Tablet, + [r.ProtoDeviceType.GameConsole]: s.GameConsole, + [r.ProtoDeviceType.SmartTV]: s.SmartTV, + [r.ProtoDeviceType.WearableComputer]: s.Unrecognized, + [r.ProtoDeviceType.PDA]: s.Unrecognized, + [r.ProtoDeviceType.Unrecognized]: s.Unrecognized + }, a = 'https://s.srvsynd.com/2/234175/analytics.js?dt=2341751597675869250012&di=[DOMAIN]&ui=[FS_USER_ID]&md=[FS_MEDIA_TYPE]&ap=[APP_BUNDLE]&sr=[CNX_SUPPLIER_ID]&pp=[PUBLISHER_ID]&ti=[SESSION_ID]&de=[FS_DEVICE_TYPE]&to=[MGTO]&pv=[MGID]', o = 'cnx_fraud_sensor', c = '00000000-0000-0000-0000-000000000000', u = 2; + e.d(i, 'a', function () { + return l; + }); + class l { + constructor(t, i, e, s) { + this.eo = t, this.so = i, this.ln = e, this.no(s); + } + addFraudSensorScript() { + if (this.so.getElementById(o)) + return; + const t = { + id: o, + src: this.eo.setupMacros(a) + }; + this.so.insertScript(t, null, 'FraudSensor_script_error'); + } + no(t) { + t = Object(n.h)(t) ? t : c; + const { + lookupId: i, + lookupResponseCode: e, + publisherAdsTxt: s + } = this.ln, r = h[this.ln.deviceType]; + this.eo.setPublisherId(s), this.eo.setUserId(t), this.eo.setFraudSensorMacros({ + lookupId: i, + lookupResponseCode: e, + deviceType: r, + mediaType: u + }); + } + } + }, + , + function (t, i, e) { + 'use strict'; + var s = i; + function n() { + s.util.Ki(), s.Writer.Ki(s.BufferWriter), s.Reader.Ki(s.BufferReader); + } + s.build = 'minimal', s.Writer = e(61), s.BufferWriter = e(129), s.Reader = e(63), s.BufferReader = e(130), s.util = e(39), s.rpc = e(131), s.roots = e(133), s.configure = n, n(); + }, + function (t, i, e) { + 'use strict'; + t.exports = function (t, i) { + var e = new Array(arguments.length - 1), s = 0, n = 2, r = !0; + for (; n < arguments.length;) + e[s++] = arguments[n++]; + return new Promise(function (n, h) { + e[s] = function (t) { + if (r) + if (r = !1, t) + h(t); + else { + for (var i = new Array(arguments.length - 1), e = 0; e < i.length;) + i[e++] = arguments[e]; + n.apply(null, i); + } + }; + try { + t.apply(i || null, e); + } catch (t) { + r && (r = !1, h(t)); + } + }); + }; + }, + function (t, i, e) { + 'use strict'; + var s = i; + s.length = function (t) { + var i = t.length; + if (!i) + return 0; + for (var e = 0; --i % 4 > 1 && '=' === t.charAt(i);) + ++e; + return Math.ceil(3 * t.length) / 4 - e; + }; + for (var n = new Array(64), r = new Array(123), h = 0; h < 64;) + r[n[h] = h < 26 ? h + 65 : h < 52 ? h + 71 : h < 62 ? h - 4 : h - 59 | 43] = h++; + s.encode = function (t, i, e) { + for (var s, r = null, h = [], a = 0, o = 0; i < e;) { + var c = t[i++]; + switch (o) { + case 0: + h[a++] = n[c >> 2], s = (3 & c) << 4, o = 1; + break; + case 1: + h[a++] = n[s | c >> 4], s = (15 & c) << 2, o = 2; + break; + case 2: + h[a++] = n[s | c >> 6], h[a++] = n[63 & c], o = 0; + } + a > 8191 && ((r || (r = [])).push(String.fromCharCode.apply(String, h)), a = 0); + } + return o && (h[a++] = n[s], h[a++] = 61, 1 === o && (h[a++] = 61)), r ? (a && r.push(String.fromCharCode.apply(String, h.slice(0, a))), r.join('')) : String.fromCharCode.apply(String, h.slice(0, a)); + }; + s.decode = function (t, i, e) { + for (var s, n = e, h = 0, a = 0; a < t.length;) { + var o = t.charCodeAt(a++); + if (61 === o && h > 1) + break; + if (void 0 === (o = r[o])) + throw Error('invalid encoding'); + switch (h) { + case 0: + s = o, h = 1; + break; + case 1: + i[e++] = s << 2 | (48 & o) >> 4, s = o, h = 2; + break; + case 2: + i[e++] = (15 & s) << 4 | (60 & o) >> 2, s = o, h = 3; + break; + case 3: + i[e++] = (3 & s) << 6 | o, h = 0; + } + } + if (1 === h) + throw Error('invalid encoding'); + return e - n; + }, s.test = function (t) { + return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(t); + }; + }, + function (t, i, e) { + 'use strict'; + function s() { + this.ro = {}; + } + t.exports = s, s.prototype.on = function (t, i, e) { + return (this.ro[t] || (this.ro[t] = [])).push({ + fn: i, + ctx: e || this + }), this; + }, s.prototype.off = function (t, i) { + if (void 0 === t) + this.ro = {}; + else if (void 0 === i) + this.ro[t] = []; + else + for (var e = this.ro[t], s = 0; s < e.length;) + e[s].fn === i ? e.splice(s, 1) : ++s; + return this; + }, s.prototype.emit = function (t) { + var i = this.ro[t]; + if (i) { + for (var e = [], s = 1; s < arguments.length;) + e.push(arguments[s++]); + for (s = 0; s < i.length;) + i[s].fn.apply(i[s++].ctx, e); + } + return this; + }; + }, + function (t, i, e) { + 'use strict'; + function s(t) { + return 'undefined' != typeof Float32Array ? function () { + var i = new Float32Array([-0]), e = new Uint8Array(i.buffer), s = 128 === e[3]; + function n(t, s, n) { + i[0] = t, s[n] = e[0], s[n + 1] = e[1], s[n + 2] = e[2], s[n + 3] = e[3]; + } + function r(t, s, n) { + i[0] = t, s[n] = e[3], s[n + 1] = e[2], s[n + 2] = e[1], s[n + 3] = e[0]; + } + function h(t, s) { + return e[0] = t[s], e[1] = t[s + 1], e[2] = t[s + 2], e[3] = t[s + 3], i[0]; + } + function a(t, s) { + return e[3] = t[s], e[2] = t[s + 1], e[1] = t[s + 2], e[0] = t[s + 3], i[0]; + } + t.writeFloatLE = s ? n : r, t.writeFloatBE = s ? r : n, t.readFloatLE = s ? h : a, t.readFloatBE = s ? a : h; + }() : function () { + function i(t, i, e, s) { + var n = i < 0 ? 1 : 0; + if (n && (i = -i), 0 === i) + t(1 / i > 0 ? 0 : 2147483648, e, s); + else if (isNaN(i)) + t(2143289344, e, s); + else if (i > 3.4028234663852886e+38) + t((n << 31 | 2139095040) >>> 0, e, s); + else if (i < 1.1754943508222875e-38) + t((n << 31 | Math.round(i / 1.401298464324817e-45)) >>> 0, e, s); + else { + var r = Math.floor(Math.log(i) / Math.LN2); + t((n << 31 | r + 127 << 23 | 8388607 & Math.round(i * Math.pow(2, -r) * 8388608)) >>> 0, e, s); + } + } + function e(t, i, e) { + var s = t(i, e), n = 2 * (s >> 31) + 1, r = s >>> 23 & 255, h = 8388607 & s; + return 255 === r ? h ? NaN : n * (1 / 0) : 0 === r ? 1.401298464324817e-45 * n * h : n * Math.pow(2, r - 150) * (h + 8388608); + } + t.writeFloatLE = i.bind(null, n), t.writeFloatBE = i.bind(null, r), t.readFloatLE = e.bind(null, h), t.readFloatBE = e.bind(null, a); + }(), 'undefined' != typeof Float64Array ? function () { + var i = new Float64Array([-0]), e = new Uint8Array(i.buffer), s = 128 === e[7]; + function n(t, s, n) { + i[0] = t, s[n] = e[0], s[n + 1] = e[1], s[n + 2] = e[2], s[n + 3] = e[3], s[n + 4] = e[4], s[n + 5] = e[5], s[n + 6] = e[6], s[n + 7] = e[7]; + } + function r(t, s, n) { + i[0] = t, s[n] = e[7], s[n + 1] = e[6], s[n + 2] = e[5], s[n + 3] = e[4], s[n + 4] = e[3], s[n + 5] = e[2], s[n + 6] = e[1], s[n + 7] = e[0]; + } + function h(t, s) { + return e[0] = t[s], e[1] = t[s + 1], e[2] = t[s + 2], e[3] = t[s + 3], e[4] = t[s + 4], e[5] = t[s + 5], e[6] = t[s + 6], e[7] = t[s + 7], i[0]; + } + function a(t, s) { + return e[7] = t[s], e[6] = t[s + 1], e[5] = t[s + 2], e[4] = t[s + 3], e[3] = t[s + 4], e[2] = t[s + 5], e[1] = t[s + 6], e[0] = t[s + 7], i[0]; + } + t.writeDoubleLE = s ? n : r, t.writeDoubleBE = s ? r : n, t.readDoubleLE = s ? h : a, t.readDoubleBE = s ? a : h; + }() : function () { + function i(t, i, e, s, n, r) { + var h = s < 0 ? 1 : 0; + if (h && (s = -s), 0 === s) + t(0, n, r + i), t(1 / s > 0 ? 0 : 2147483648, n, r + e); + else if (isNaN(s)) + t(0, n, r + i), t(2146959360, n, r + e); + else if (s > 1.7976931348623157e+308) + t(0, n, r + i), t((h << 31 | 2146435072) >>> 0, n, r + e); + else { + var a; + if (s < 2.2250738585072014e-308) + t((a = s / 5e-324) >>> 0, n, r + i), t((h << 31 | a / 4294967296) >>> 0, n, r + e); + else { + var o = Math.floor(Math.log(s) / Math.LN2); + 1024 === o && (o = 1023), t(4503599627370496 * (a = s * Math.pow(2, -o)) >>> 0, n, r + i), t((h << 31 | o + 1023 << 20 | 1048576 * a & 1048575) >>> 0, n, r + e); + } + } + } + function e(t, i, e, s, n) { + var r = t(s, n + i), h = t(s, n + e), a = 2 * (h >> 31) + 1, o = h >>> 20 & 2047, c = 4294967296 * (1048575 & h) + r; + return 2047 === o ? c ? NaN : a * (1 / 0) : 0 === o ? 5e-324 * a * c : a * Math.pow(2, o - 1075) * (c + 4503599627370496); + } + t.writeDoubleLE = i.bind(null, n, 0, 4), t.writeDoubleBE = i.bind(null, r, 4, 0), t.readDoubleLE = e.bind(null, h, 0, 4), t.readDoubleBE = e.bind(null, a, 4, 0); + }(), t; + } + function n(t, i, e) { + i[e] = 255 & t, i[e + 1] = t >>> 8 & 255, i[e + 2] = t >>> 16 & 255, i[e + 3] = t >>> 24; + } + function r(t, i, e) { + i[e] = t >>> 24, i[e + 1] = t >>> 16 & 255, i[e + 2] = t >>> 8 & 255, i[e + 3] = 255 & t; + } + function h(t, i) { + return (t[i] | t[i + 1] << 8 | t[i + 2] << 16 | t[i + 3] << 24) >>> 0; + } + function a(t, i) { + return (t[i] << 24 | t[i + 1] << 16 | t[i + 2] << 8 | t[i + 3]) >>> 0; + } + t.exports = s(s); + }, + function (t, i, e) { + 'use strict'; + function s(t) { + try { + var i = eval('quire'.replace(/^/, 're'))(t); + if (i && (i.length || Object.keys(i).length)) + return i; + } catch (t) { + } + return null; + } + t.exports = s; + }, + function (t, i, e) { + 'use strict'; + var s = i; + s.length = function (t) { + for (var i = 0, e = 0, s = 0; s < t.length; ++s) + (e = t.charCodeAt(s)) < 128 ? i += 1 : e < 2048 ? i += 2 : 55296 == (64512 & e) && 56320 == (64512 & t.charCodeAt(s + 1)) ? (++s, i += 4) : i += 3; + return i; + }, s.read = function (t, i, e) { + if (e - i < 1) + return ''; + for (var s, n = null, r = [], h = 0; i < e;) + (s = t[i++]) < 128 ? r[h++] = s : s > 191 && s < 224 ? r[h++] = (31 & s) << 6 | 63 & t[i++] : s > 239 && s < 365 ? (s = ((7 & s) << 18 | (63 & t[i++]) << 12 | (63 & t[i++]) << 6 | 63 & t[i++]) - 65536, r[h++] = 55296 + (s >> 10), r[h++] = 56320 + (1023 & s)) : r[h++] = (15 & s) << 12 | (63 & t[i++]) << 6 | 63 & t[i++], h > 8191 && ((n || (n = [])).push(String.fromCharCode.apply(String, r)), h = 0); + return n ? (h && n.push(String.fromCharCode.apply(String, r.slice(0, h))), n.join('')) : String.fromCharCode.apply(String, r.slice(0, h)); + }, s.write = function (t, i, e) { + for (var s, n, r = e, h = 0; h < t.length; ++h) + (s = t.charCodeAt(h)) < 128 ? i[e++] = s : s < 2048 ? (i[e++] = s >> 6 | 192, i[e++] = 63 & s | 128) : 55296 == (64512 & s) && 56320 == (64512 & (n = t.charCodeAt(h + 1))) ? (s = 65536 + ((1023 & s) << 10) + (1023 & n), ++h, i[e++] = s >> 18 | 240, i[e++] = s >> 12 & 63 | 128, i[e++] = s >> 6 & 63 | 128, i[e++] = 63 & s | 128) : (i[e++] = s >> 12 | 224, i[e++] = s >> 6 & 63 | 128, i[e++] = 63 & s | 128); + return e - r; + }; + }, + function (t, i, e) { + 'use strict'; + t.exports = function (t, i, e) { + var s = e || 8192, n = s >>> 1, r = null, h = s; + return function (e) { + if (e < 1 || e > n) + return t(e); + h + e > s && (r = t(s), h = 0); + var a = i.call(r, h, h += e); + return 7 & h && (h = 1 + (7 | h)), a; + }; + }; + }, + function (t, i, e) { + 'use strict'; + t.exports = n; + var s = e(39); + function n(t, i) { + this.lo = t >>> 0, this.hi = i >>> 0; + } + var r = n.zero = new n(0, 0); + r.toNumber = function () { + return 0; + }, r.zzEncode = r.zzDecode = function () { + return this; + }, r.length = function () { + return 1; + }; + var h = n.zeroHash = '\0\0\0\0\0\0\0\0'; + n.fromNumber = function (t) { + if (0 === t) + return r; + var i = t < 0; + i && (t = -t); + var e = t >>> 0, s = (t - e) / 4294967296 >>> 0; + return i && (s = ~s >>> 0, e = ~e >>> 0, ++e > 4294967295 && (e = 0, ++s > 4294967295 && (s = 0))), new n(e, s); + }, n.from = function (t) { + if ('number' == typeof t) + return n.fromNumber(t); + if (s.isString(t)) { + if (!s.Long) + return n.fromNumber(parseInt(t, 10)); + t = s.Long.fromString(t); + } + return t.low || t.high ? new n(t.low >>> 0, t.high >>> 0) : r; + }, n.prototype.toNumber = function (t) { + if (!t && this.hi >>> 31) { + var i = 1 + ~this.lo >>> 0, e = ~this.hi >>> 0; + return i || (e = e + 1 >>> 0), -(i + 4294967296 * e); + } + return this.lo + 4294967296 * this.hi; + }, n.prototype.toLong = function (t) { + return s.Long ? new s.Long(0 | this.lo, 0 | this.hi, Boolean(t)) : { + low: 0 | this.lo, + high: 0 | this.hi, + unsigned: Boolean(t) + }; + }; + var a = String.prototype.charCodeAt; + n.fromHash = function (t) { + return t === h ? r : new n((a.call(t, 0) | a.call(t, 1) << 8 | a.call(t, 2) << 16 | a.call(t, 3) << 24) >>> 0, (a.call(t, 4) | a.call(t, 5) << 8 | a.call(t, 6) << 16 | a.call(t, 7) << 24) >>> 0); + }, n.prototype.toHash = function () { + return String.fromCharCode(255 & this.lo, this.lo >>> 8 & 255, this.lo >>> 16 & 255, this.lo >>> 24, 255 & this.hi, this.hi >>> 8 & 255, this.hi >>> 16 & 255, this.hi >>> 24); + }, n.prototype.zzEncode = function () { + var t = this.hi >> 31; + return this.hi = ((this.hi << 1 | this.lo >>> 31) ^ t) >>> 0, this.lo = (this.lo << 1 ^ t) >>> 0, this; + }, n.prototype.zzDecode = function () { + var t = -(1 & this.lo); + return this.lo = ((this.lo >>> 1 | this.hi << 31) ^ t) >>> 0, this.hi = (this.hi >>> 1 ^ t) >>> 0, this; + }, n.prototype.length = function () { + var t = this.lo, i = (this.lo >>> 28 | this.hi << 4) >>> 0, e = this.hi >>> 24; + return 0 === e ? 0 === i ? t < 16384 ? t < 128 ? 1 : 2 : t < 2097152 ? 3 : 4 : i < 16384 ? i < 128 ? 5 : 6 : i < 2097152 ? 7 : 8 : e < 128 ? 9 : 10; + }; + }, + function (t, i, e) { + 'use strict'; + t.exports = r; + var s = e(61); + (r.prototype = Object.create(s.prototype)).constructor = r; + var n = e(39); + function r() { + s.call(this); + } + function h(t, i, e) { + t.length < 40 ? n.utf8.write(t, i, e) : i.utf8Write ? i.utf8Write(t, e) : i.write(t, e); + } + r.Ki = function () { + r.alloc = n.Yi, r.writeBytesBuffer = n.Buffer && n.Buffer.prototype instanceof Uint8Array && 'set' === n.Buffer.prototype.set.name ? function (t, i, e) { + i.set(t, e); + } : function (t, i, e) { + if (t.copy) + t.copy(i, e, 0, t.length); + else + for (var s = 0; s < t.length;) + i[e++] = t[s++]; + }; + }, r.prototype.bytes = function (t) { + n.isString(t) && (t = n.Xi(t, 'base64')); + var i = t.length >>> 0; + return this.uint32(i), i && this.Ts(r.writeBytesBuffer, i, t), this; + }, r.prototype.string = function (t) { + var i = n.Buffer.byteLength(t); + return this.uint32(i), i && this.Ts(h, i, t), this; + }, r.Ki(); + }, + function (t, i, e) { + 'use strict'; + t.exports = r; + var s = e(63); + (r.prototype = Object.create(s.prototype)).constructor = r; + var n = e(39); + function r(t) { + s.call(this, t); + } + r.Ki = function () { + n.Buffer && (r.prototype.Ps = n.Buffer.prototype.slice); + }, r.prototype.string = function () { + var t = this.uint32(); + return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + t, this.len)) : this.buf.toString('utf-8', this.pos, this.pos = Math.min(this.pos + t, this.len)); + }, r.Ki(); + }, + function (t, i, e) { + 'use strict'; + i.Service = e(132); + }, + function (t, i, e) { + 'use strict'; + t.exports = n; + var s = e(39); + function n(t, i, e) { + if ('function' != typeof t) + throw TypeError('rpcImpl must be a function'); + s.EventEmitter.call(this), this.rpcImpl = t, this.requestDelimited = Boolean(i), this.responseDelimited = Boolean(e); + } + (n.prototype = Object.create(s.EventEmitter.prototype)).constructor = n, n.prototype.rpcCall = function t(i, e, n, r, h) { + if (!r) + throw TypeError('request must be specified'); + var a = this; + if (!h) + return s.asPromise(t, a, i, e, n, r); + if (a.rpcImpl) + try { + return a.rpcImpl(i, e[a.requestDelimited ? 'encodeDelimited' : 'encode'](r).finish(), function (t, e) { + if (t) + return a.emit('error', t, i), h(t); + if (null !== e) { + if (!(e instanceof n)) + try { + e = n[a.responseDelimited ? 'decodeDelimited' : 'decode'](e); + } catch (t) { + return a.emit('error', t, i), h(t); + } + return a.emit('data', e, i), h(null, e); + } + a.end(!0); + }); + } catch (t) { + return a.emit('error', t, i), void setTimeout(function () { + h(t); + }, 0); + } + else + setTimeout(function () { + h(Error('already ended')); + }, 0); + }, n.prototype.end = function (t) { + return this.rpcImpl && (t || this.rpcImpl(null, null, null), this.rpcImpl = null, this.emit('end').off()), this; + }; + }, + function (t, i, e) { + 'use strict'; + t.exports = {}; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = function (t) { + function i(i) { + var e = t.call(this, i) || this; + return e.name = 'DecodingError', e; + } + return n(i, t), i; + }(Error); + i.DecodingError = r; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = function (t) { + function i(i) { + var e = t.call(this, i) || this; + return e.name = 'EncodingError', e; + } + return n(i, t), i; + }(Error); + i.EncodingError = r; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = function (t) { + function i(i) { + var e = t.call(this, i) || this; + return e.name = 'GVLError', e; + } + return n(i, t), i; + }(Error); + i.GVLError = r; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = function (t) { + function i(i, e, s) { + void 0 === s && (s = ''); + var n = t.call(this, 'invalid value ' + e + ' passed for ' + i + ' ' + s) || this; + return n.name = 'TCModelError', n; + } + return n(i, t), i; + }(Error); + i.TCModelError = r; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = function () { + function t() { + } + return t.prototype.has = function (i) { + return t.langSet.has(i); + }, t.prototype.forEach = function (i) { + t.langSet.forEach(i); + }, Object.defineProperty(t.prototype, 'size', { + get: function () { + return t.langSet.size; + }, + enumerable: !0, + configurable: !0 + }), t.langSet = new Set([ + 'BG', + 'CA', + 'CS', + 'DA', + 'DE', + 'EL', + 'EN', + 'ES', + 'ET', + 'FI', + 'FR', + 'HR', + 'HU', + 'IT', + 'LT', + 'LV', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'RU', + 'SK', + 'SL', + 'SV', + 'ZH' + ]), t; + }(); + i.ConsentLanguages = s; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = e(68), h = e(66), a = e(56), o = function (t) { + function i() { + var i = null !== t && t.apply(this, arguments) || this; + return i.bitLength = 0, i.map = new Map(), i; + } + return n(i, t), i.prototype.has = function (t) { + return this.map.has(t); + }, i.prototype.isOkToHave = function (t, i, e) { + var s, n = !0; + if (null === (s = this.gvl) || void 0 === s ? void 0 : s.vendors) { + var r = this.gvl.vendors[e]; + if (r) + if (t === a.RestrictionType.NOT_ALLOWED) + n = r.legIntPurposes.includes(i) || r.purposes.includes(i); + else if (r.flexiblePurposes.length) + switch (t) { + case a.RestrictionType.REQUIRE_CONSENT: + n = r.flexiblePurposes.includes(i) && r.legIntPurposes.includes(i); + break; + case a.RestrictionType.REQUIRE_LI: + n = r.flexiblePurposes.includes(i) && r.purposes.includes(i); + } + else + n = !1; + else + n = !1; + } + return n; + }, i.prototype.add = function (t, i) { + if (this.isOkToHave(i.restrictionType, i.purposeId, t)) { + var e = i.hash; + this.has(e) || (this.map.set(e, new h.BinarySearchTree()), this.bitLength = 0), this.map.get(e).add(t); + } + }, i.prototype.getVendors = function (t) { + var i = []; + if (t) { + var e = t.hash; + this.has(e) && (i = this.map.get(e).get()); + } else { + var s = new Set(); + this.map.forEach(function (t) { + t.get().forEach(function (t) { + s.add(t); + }); + }), i = Array.from(s); + } + return i; + }, i.prototype.getRestrictionType = function (t, i) { + var e; + return this.getRestrictions(t).forEach(function (t) { + t.purposeId === i && (void 0 === e || e > t.restrictionType) && (e = t.restrictionType); + }), e; + }, i.prototype.vendorHasRestriction = function (t, i) { + for (var e = !1, s = this.getRestrictions(t), n = 0; n < s.length && !e; n++) + e = i.isSameAs(s[n]); + return e; + }, i.prototype.getMaxVendorId = function () { + var t = 0; + return this.map.forEach(function (i) { + t = Math.max(i.max(), t); + }), t; + }, i.prototype.getRestrictions = function (t) { + var i = []; + return this.map.forEach(function (e, s) { + t ? e.contains(t) && i.push(r.PurposeRestriction.unHash(s)) : i.push(r.PurposeRestriction.unHash(s)); + }), i; + }, i.prototype.getPurposes = function () { + var t = new Set(); + return this.map.forEach(function (i, e) { + t.add(r.PurposeRestriction.unHash(e).purposeId); + }), Array.from(t); + }, i.prototype.remove = function (t, i) { + var e = i.hash, s = this.map.get(e); + s && (s.remove(t), s.isEmpty() && (this.map.delete(e), this.bitLength = 0)); + }, Object.defineProperty(i.prototype, 'gvl', { + get: function () { + return this.gvl_; + }, + set: function (t) { + var i = this; + this.gvl_ || (this.gvl_ = t, this.map.forEach(function (t, e) { + var s = r.PurposeRestriction.unHash(e); + t.get().forEach(function (e) { + i.isOkToHave(s.restrictionType, s.purposeId, e) || t.remove(e); + }); + })); + }, + enumerable: !0, + configurable: !0 + }), i.prototype.isEmpty = function () { + return 0 === this.map.size; + }, Object.defineProperty(i.prototype, 'numRestrictions', { + get: function () { + return this.map.size; + }, + enumerable: !0, + configurable: !0 + }), i; + }(e(41).Cloneable); + i.PurposeRestrictionVector = o; + }, + function (t, i, e) { + 'use strict'; + var s; + Object.defineProperty(i, '_', { value: !0 }); + var n = e(69), r = function () { + function t() { + } + return t.ID_TO_KEY = [ + n.Segment.CORE, + n.Segment.VENDORS_DISCLOSED, + n.Segment.VENDORS_ALLOWED, + n.Segment.PUBLISHER_TC + ], t.KEY_TO_ID = ((s = {})[n.Segment.CORE] = 0, s[n.Segment.VENDORS_DISCLOSED] = 1, s[n.Segment.VENDORS_ALLOWED] = 2, s[n.Segment.PUBLISHER_TC] = 3, s), t; + }(); + i.SegmentIDs = r; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }), r = this && this.ho || function (t, i) { + var e, s, n, r, h = { + label: 0, + sent: function () { + if (1 & n[0]) + throw n[1]; + return n[1]; + }, + trys: [], + ops: [] + }; + return r = { + next: a(0), + throw: a(1), + return: a(2) + }, 'function' == typeof Symbol && (r[Symbol.iterator] = function () { + return this; + }), r; + function a(r) { + return function (a) { + return function (r) { + if (e) + throw new TypeError('Generator is already executing.'); + for (; h;) + try { + if (e = 1, s && (n = 2 & r[0] ? s.return : r[0] ? s.throw || ((n = s.return) && n.call(s), 0) : s.next) && !(n = n.call(s, r[1])).done) + return n; + switch (s = 0, n && (r = [ + 2 & r[0], + n.value + ]), r[0]) { + case 0: + case 1: + n = r; + break; + case 4: + return h.label++, { + value: r[1], + done: !1 + }; + case 5: + h.label++, s = r[1], r = [0]; + continue; + case 7: + r = h.ops.pop(), h.trys.pop(); + continue; + default: + if (!(n = (n = h.trys).length > 0 && n[n.length - 1]) && (6 === r[0] || 2 === r[0])) { + h = 0; + continue; + } + if (3 === r[0] && (!n || r[1] > n[0] && r[1] < n[3])) { + h.label = r[1]; + break; + } + if (6 === r[0] && h.label < n[1]) { + h.label = n[1], n = r; + break; + } + if (n && h.label < n[2]) { + h.label = n[2], h.ops.push(r); + break; + } + n[2] && h.ops.pop(), h.trys.pop(); + continue; + } + r = i.call(t, h); + } catch (t) { + r = [ + 6, + t + ], s = 0; + } finally { + e = n = 0; + } + if (5 & r[0]) + throw r[1]; + return { + value: r[0] ? r[1] : void 0, + done: !0 + }; + }([ + r, + a + ]); + }; + } + }, h = this && this.Zi || function (t) { + var i = 'function' == typeof Symbol && Symbol.iterator, e = i && t[i], s = 0; + if (e) + return e.call(t); + if (t && 'number' == typeof t.length) + return { + next: function () { + return t && s >= t.length && (t = void 0), { + value: t && t[s++], + done: !t + }; + } + }; + throw new TypeError(i ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }; + Object.defineProperty(i, '_', { value: !0 }); + var a = e(41), o = e(33), c = function (t) { + function i() { + var i = null !== t && t.apply(this, arguments) || this; + return i.bitLength = 0, i.maxId_ = 0, i.set_ = new Set(), i; + } + return n(i, t), i.prototype[Symbol.iterator] = function () { + var t; + return r(this, function (i) { + switch (i.label) { + case 0: + t = 1, i.label = 1; + case 1: + return t <= this.maxId ? [ + 4, + [ + t, + this.has(t) + ] + ] : [ + 3, + 4 + ]; + case 2: + i.sent(), i.label = 3; + case 3: + return t++, [ + 3, + 1 + ]; + case 4: + return [2]; + } + }); + }, i.prototype.values = function () { + return this.set_.values(); + }, Object.defineProperty(i.prototype, 'maxId', { + get: function () { + return this.maxId_; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.has = function (t) { + return this.set_.has(t); + }, i.prototype.unset = function (t) { + var i = this; + Array.isArray(t) ? t.forEach(function (t) { + return i.unset(t); + }) : 'object' == typeof t ? this.unset(Object.keys(t).map(function (t) { + return +t; + })) : (this.set_.delete(t), this.bitLength = 0, t === this.maxId && (this.maxId_ = 0, this.set_.forEach(function (t) { + i.maxId_ = Math.max(i.maxId, t); + }))); + }, i.prototype.isIntMap = function (t) { + var i = this, e = 'object' == typeof t; + return e && Object.keys(t).every(function (e) { + var s = Number.isInteger(parseInt(e, 10)); + return (s = s && i.isValidNumber(t[e].id)) && void 0 !== t[e].name; + }); + }, i.prototype.isValidNumber = function (t) { + return parseInt(t, 10) > 0; + }, i.prototype.isSet = function (t) { + var i = !1; + return t instanceof Set && (i = Array.from(t).every(this.isValidNumber)), i; + }, i.prototype.set = function (t) { + var i = this; + if (Array.isArray(t)) + t.forEach(function (t) { + return i.set(t); + }); + else if (this.isSet(t)) + this.set(Array.from(t)); + else if (this.isIntMap(t)) + this.set(Object.keys(t).map(function (t) { + return +t; + })); + else { + if (!this.isValidNumber(t)) + throw new o.TCModelError('set()', t, 'must be positive integer array, positive integer, Set, or IntMap'); + this.set_.add(t), this.maxId_ = Math.max(this.maxId, t), this.bitLength = 0; + } + }, i.prototype.empty = function () { + this.set_ = new Set(); + }, i.prototype.forEach = function (t) { + var i, e; + try { + for (var s = h(this), n = s.next(); !n.done; n = s.next()) { + var r = n.value; + t(r[1], r[0]); + } + } catch (t) { + i = { error: t }; + } finally { + try { + n && !n.done && (e = s.return) && e.call(s); + } finally { + if (i) + throw i.error; + } + } + }, Object.defineProperty(i.prototype, 'size', { + get: function () { + return this.set_.size; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.setAll = function (t) { + this.set(t); + }, i; + }(a.Cloneable); + i.Vector = c; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(65), n = e(55), r = e(70), h = e(76), a = e(33), o = e(67), c = e(35), u = function () { + function t() { + } + return t.encode = function (t, i) { + var e, h = this; + try { + e = this.fieldSequence['' + t.version][i]; + } catch (e) { + throw new a.EncodingError('Unable to encode version: ' + t.version + ', segment: ' + i); + } + var u = ''; + return i !== c.Segment.CORE && (u = r.IntEncoder.encode(c.SegmentIDs.KEY_TO_ID[i], n.BitLength.segmentType)), e.forEach(function (e) { + var s = t[e], c = r.FieldEncoderMap[e], l = n.BitLength[e]; + void 0 === l && h.isPublisherCustom(e) && (l = +t[o.Fields.numCustomPurposes]); + try { + u += c.encode(s, l); + } catch (t) { + throw new a.EncodingError('Error encoding ' + i + '->' + e + ': ' + t.message); + } + }), s.Base64Url.encode(u); + }, t.decode = function (t, i, e) { + var h = this, u = s.Base64Url.decode(t), l = 0; + return e === c.Segment.CORE && (i.version = r.IntEncoder.decode(u.substr(l, n.BitLength[o.Fields.version]), n.BitLength[o.Fields.version])), e !== c.Segment.CORE && (l += n.BitLength.segmentType), this.fieldSequence['' + i.version][e].forEach(function (t) { + var e = r.FieldEncoderMap[t], s = n.BitLength[t]; + if (void 0 === s && h.isPublisherCustom(t) && (s = +i[o.Fields.numCustomPurposes]), 0 !== s) { + var c = u.substr(l, s); + if (e === r.VendorVectorEncoder ? i[t] = e.decode(c, i.version) : i[t] = e.decode(c, s), Number.isInteger(s)) + l += s; + else { + if (!Number.isInteger(i[t].bitLength)) + throw new a.DecodingError(t); + l += i[t].bitLength; + } + } + }), i; + }, t.isPublisherCustom = function (t) { + return 0 === t.indexOf('publisherCustom'); + }, t.fieldSequence = new h.FieldSequence(), t; + }(); + i.SegmentEncoder = u; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(35), n = e(46), r = e(71), h = e(57), a = e(40), o = e(72), c = e(73), u = e(74), l = function () { + function t() { + } + var i, e, l, d, f, p, b, v, m, g, y, w, O, x, S, j, k, _, A, I, C, T, P, M, E, L; + return i = s.Fields.version, e = s.Fields.created, l = s.Fields.lastUpdated, d = s.Fields.cmpId, f = s.Fields.cmpVersion, p = s.Fields.consentScreen, b = s.Fields.consentLanguage, v = s.Fields.vendorListVersion, m = s.Fields.policyVersion, g = s.Fields.isServiceSpecific, y = s.Fields.useNonStandardStacks, w = s.Fields.specialFeatureOptins, O = s.Fields.purposeConsents, x = s.Fields.purposeLegitimateInterests, S = s.Fields.purposeOneTreatment, j = s.Fields.publisherCountryCode, k = s.Fields.vendorConsents, _ = s.Fields.vendorLegitimateInterests, A = s.Fields.publisherRestrictions, I = s.Fields.vendorsDisclosed, C = s.Fields.vendorsAllowed, T = s.Fields.publisherConsents, P = s.Fields.publisherLegitimateInterests, M = s.Fields.numCustomPurposes, E = s.Fields.publisherCustomConsents, L = s.Fields.publisherCustomLegitimateInterests, t[i] = a.IntEncoder, t[e] = r.DateEncoder, t[l] = r.DateEncoder, t[d] = a.IntEncoder, t[f] = a.IntEncoder, t[p] = a.IntEncoder, t[b] = o.LangEncoder, t[v] = a.IntEncoder, t[m] = a.IntEncoder, t[g] = n.BooleanEncoder, t[y] = n.BooleanEncoder, t[w] = h.FixedVectorEncoder, t[O] = h.FixedVectorEncoder, t[x] = h.FixedVectorEncoder, t[S] = n.BooleanEncoder, t[j] = o.LangEncoder, t[k] = u.VendorVectorEncoder, t[_] = u.VendorVectorEncoder, t[A] = c.PurposeRestrictionVectorEncoder, t.segmentType = a.IntEncoder, t[I] = u.VendorVectorEncoder, t[C] = u.VendorVectorEncoder, t[T] = h.FixedVectorEncoder, t[P] = h.FixedVectorEncoder, t[M] = a.IntEncoder, t[E] = h.FixedVectorEncoder, t[L] = h.FixedVectorEncoder, t; + }(); + i.FieldEncoderMap = l; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(35); + i.FieldSequence = function () { + var t, i; + this[1] = ((t = {})[s.Segment.CORE] = [ + s.Fields.version, + s.Fields.created, + s.Fields.lastUpdated, + s.Fields.cmpId, + s.Fields.cmpVersion, + s.Fields.consentScreen, + s.Fields.consentLanguage, + s.Fields.vendorListVersion, + s.Fields.purposeConsents, + s.Fields.vendorConsents + ], t), this[2] = ((i = {})[s.Segment.CORE] = [ + s.Fields.version, + s.Fields.created, + s.Fields.lastUpdated, + s.Fields.cmpId, + s.Fields.cmpVersion, + s.Fields.consentScreen, + s.Fields.consentLanguage, + s.Fields.vendorListVersion, + s.Fields.policyVersion, + s.Fields.isServiceSpecific, + s.Fields.useNonStandardStacks, + s.Fields.specialFeatureOptins, + s.Fields.purposeConsents, + s.Fields.purposeLegitimateInterests, + s.Fields.purposeOneTreatment, + s.Fields.publisherCountryCode, + s.Fields.vendorConsents, + s.Fields.vendorLegitimateInterests, + s.Fields.publisherRestrictions + ], i[s.Segment.PUBLISHER_TC] = [ + s.Fields.publisherConsents, + s.Fields.publisherLegitimateInterests, + s.Fields.numCustomPurposes, + s.Fields.publisherCustomConsents, + s.Fields.publisherCustomLegitimateInterests + ], i[s.Segment.VENDORS_ALLOWED] = [s.Fields.vendorsAllowed], i[s.Segment.VENDORS_DISCLOSED] = [s.Fields.vendorsDisclosed], i); + }; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = e(35); + i.SegmentSequence = function (t, i) { + if (this[1] = [s.Segment.CORE], this[2] = [s.Segment.CORE], 2 === t.version) + if (t.isServiceSpecific) + this[2].push(s.Segment.PUBLISHER_TC); + else { + var e = !(!i || !i.isForVendors); + e && !0 !== t[s.Fields.supportOOB] || this[2].push(s.Segment.VENDORS_DISCLOSED), e && (t[s.Fields.supportOOB] && t[s.Fields.vendorsAllowed].size > 0 && this[2].push(s.Segment.VENDORS_ALLOWED), this[2].push(s.Segment.PUBLISHER_TC)); + } + }; + }, + function (t, i, e) { + 'use strict'; + var s = this && this.Zi || function (t) { + var i = 'function' == typeof Symbol && Symbol.iterator, e = i && t[i], s = 0; + if (e) + return e.call(t); + if (t && 'number' == typeof t.length) + return { + next: function () { + return t && s >= t.length && (t = void 0), { + value: t && t[s++], + done: !t + }; + } + }; + throw new TypeError(i ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + }, n = this && this.ao || function (t, i) { + var e = 'function' == typeof Symbol && t[Symbol.iterator]; + if (!e) + return t; + var s, n, r = e.call(t), h = []; + try { + for (; (void 0 === i || i-- > 0) && !(s = r.next()).done;) + h.push(s.value); + } catch (t) { + n = { error: t }; + } finally { + try { + s && !s.done && (e = r.return) && e.call(r); + } finally { + if (n) + throw n.error; + } + } + return h; + }; + Object.defineProperty(i, '_', { value: !0 }); + var r = e(33), h = e(35), a = function () { + function t() { + } + return t.process = function (t, i) { + var e, s, n = t.gvl; + if (!n) + throw new r.EncodingError('Unable to encode TCModel without a GVL'); + if (!n.isReady) + throw new r.EncodingError('Unable to encode TCModel tcModel.gvl.readyPromise is not resolved'); + (t = t.clone()).consentLanguage = n.language.toUpperCase(), (null === (e = i) || void 0 === e ? void 0 : e.version) > 0 && (null === (s = i) || void 0 === s ? void 0 : s.version) <= this.processor.length ? t.version = i.version : t.version = this.processor.length; + var h = t.version - 1; + if (!this.processor[h]) + throw new r.EncodingError('Invalid version: ' + t.version); + return this.processor[h](t, n); + }, t.processor = [ + function (t) { + return t; + }, + function (t, i) { + var e, r, a, o; + t.publisherRestrictions.gvl = i, t.purposeLegitimateInterests.unset(1); + var c = new Map(); + c.set('legIntPurposes', t.vendorLegitimateInterests), c.set('purposes', t.vendorConsents); + try { + for (var u = s(c), l = u.next(); !l.done; l = u.next()) { + var d = n(l.value, 2), f = d[0], p = d[1]; + try { + for (var b = (a = void 0, s(p.values())), v = b.next(); !v.done; v = b.next()) { + var m = v.value, g = i.vendors[m]; + if (!g || g.deletedDate) + p.unset(m); + else if (0 === g[f].length) + if (t.isServiceSpecific) + if (0 === g.flexiblePurposes.length) + p.unset(m); + else { + for (var y = t.publisherRestrictions.getRestrictions(m), w = !1, O = 0, x = y.length; O < x && !w; O++) + w = y[O].restrictionType === h.RestrictionType.REQUIRE_CONSENT && 'purposes' === f || y[O].restrictionType === h.RestrictionType.REQUIRE_LI && 'legIntPurposes' === f; + w || p.unset(m); + } + else + p.unset(m); + } + } catch (t) { + a = { error: t }; + } finally { + try { + v && !v.done && (o = b.return) && o.call(b); + } finally { + if (a) + throw a.error; + } + } + } + } catch (t) { + e = { error: t }; + } finally { + try { + l && !l.done && (r = u.return) && r.call(u); + } finally { + if (e) + throw e.error; + } + } + return t.vendorsDisclosed.set(i.vendors), t; + } + ], t; + }(); + i.SemanticPreEncoder = a; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }); + Object.defineProperty(i, '_', { value: !0 }); + var r = e(41), h = e(33), a = e(148), o = e(35), c = function (t) { + function i(i) { + var e = t.call(this) || this; + return e.isServiceSpecific_ = !1, e.supportOOB_ = !0, e.useNonStandardStacks_ = !1, e.purposeOneTreatment_ = !1, e.publisherCountryCode_ = 'AA', e.version_ = 2, e.consentScreen_ = 0, e.policyVersion_ = 2, e.consentLanguage_ = 'EN', e.cmpId_ = 0, e.cmpVersion_ = 0, e.vendorListVersion_ = 0, e.numCustomPurposes_ = 0, e.specialFeatureOptins = new o.Vector(), e.purposeConsents = new o.Vector(), e.purposeLegitimateInterests = new o.Vector(), e.publisherConsents = new o.Vector(), e.publisherLegitimateInterests = new o.Vector(), e.publisherCustomConsents = new o.Vector(), e.publisherCustomLegitimateInterests = new o.Vector(), e.vendorConsents = new o.Vector(), e.vendorLegitimateInterests = new o.Vector(), e.vendorsDisclosed = new o.Vector(), e.vendorsAllowed = new o.Vector(), e.publisherRestrictions = new o.PurposeRestrictionVector(), i && (e.gvl = i), e.created = new Date(), e.updated(), e; + } + return n(i, t), Object.defineProperty(i.prototype, 'gvl', { + get: function () { + return this.gvl_; + }, + set: function (t) { + a.GVL.isInstanceOf(t) || (t = new a.GVL(t)), this.gvl_ = t, this.publisherRestrictions.gvl = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'cmpId', { + get: function () { + return this.cmpId_; + }, + set: function (t) { + if (!(Number.isInteger(+t) && t > 1)) + throw new h.TCModelError('cmpId', t); + this.cmpId_ = +t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'cmpVersion', { + get: function () { + return this.cmpVersion_; + }, + set: function (t) { + if (!(Number.isInteger(+t) && t > -1)) + throw new h.TCModelError('cmpVersion', t); + this.cmpVersion_ = +t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'consentScreen', { + get: function () { + return this.consentScreen_; + }, + set: function (t) { + if (!(Number.isInteger(+t) && t > -1)) + throw new h.TCModelError('consentScreen', t); + this.consentScreen_ = +t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'consentLanguage', { + get: function () { + return this.consentLanguage_; + }, + set: function (t) { + this.consentLanguage_ = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'publisherCountryCode', { + get: function () { + return this.publisherCountryCode_; + }, + set: function (t) { + if (!/^([A-z]){2}$/.test(t)) + throw new h.TCModelError('publisherCountryCode', t); + this.publisherCountryCode_ = t.toUpperCase(); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'vendorListVersion', { + get: function () { + return this.gvl ? this.gvl.vendorListVersion : this.vendorListVersion_; + }, + set: function (t) { + if ((t = +t >> 0) < 0) + throw new h.TCModelError('vendorListVersion', t); + this.vendorListVersion_ = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'policyVersion', { + get: function () { + return this.gvl ? this.gvl.tcfPolicyVersion : this.policyVersion_; + }, + set: function (t) { + if (this.policyVersion_ = parseInt(t, 10), this.policyVersion_ < 0) + throw new h.TCModelError('policyVersion', t); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'version', { + get: function () { + return this.version_; + }, + set: function (t) { + this.version_ = parseInt(t, 10); + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'isServiceSpecific', { + get: function () { + return this.isServiceSpecific_; + }, + set: function (t) { + this.isServiceSpecific_ = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'useNonStandardStacks', { + get: function () { + return this.useNonStandardStacks_; + }, + set: function (t) { + this.useNonStandardStacks_ = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'supportOOB', { + get: function () { + return this.supportOOB_; + }, + set: function (t) { + this.supportOOB_ = t; + }, + enumerable: !0, + configurable: !0 + }), Object.defineProperty(i.prototype, 'purposeOneTreatment', { + get: function () { + return this.purposeOneTreatment_; + }, + set: function (t) { + this.purposeOneTreatment_ = t; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.setAllVendorConsents = function () { + this.vendorConsents.set(this.gvl.vendors); + }, i.prototype.unsetAllVendorConsents = function () { + this.vendorConsents.empty(); + }, i.prototype.setAllVendorsDisclosed = function () { + this.vendorsDisclosed.set(this.gvl.vendors); + }, i.prototype.unsetAllVendorsDisclosed = function () { + this.vendorsDisclosed.empty(); + }, i.prototype.setAllVendorsAllowed = function () { + this.vendorsAllowed.set(this.gvl.vendors); + }, i.prototype.unsetAllVendorsAllowed = function () { + this.vendorsAllowed.empty(); + }, i.prototype.setAllVendorLegitimateInterests = function () { + this.vendorLegitimateInterests.set(this.gvl.vendors); + }, i.prototype.unsetAllVendorLegitimateInterests = function () { + this.vendorLegitimateInterests.empty(); + }, i.prototype.setAllPurposeConsents = function () { + this.purposeConsents.set(this.gvl.purposes); + }, i.prototype.unsetAllPurposeConsents = function () { + this.purposeConsents.empty(); + }, i.prototype.setAllPurposeLegitimateInterests = function () { + this.purposeLegitimateInterests.set(this.gvl.purposes); + }, i.prototype.unsetAllPurposeLegitimateInterests = function () { + this.purposeLegitimateInterests.empty(); + }, i.prototype.setAllSpecialFeatureOptins = function () { + this.specialFeatureOptins.set(this.gvl.specialFeatures); + }, i.prototype.unsetAllSpecialFeatureOptins = function () { + this.specialFeatureOptins.empty(); + }, i.prototype.setAll = function () { + this.setAllVendorConsents(), this.setAllPurposeLegitimateInterests(), this.setAllSpecialFeatureOptins(), this.setAllPurposeConsents(), this.setAllVendorLegitimateInterests(); + }, i.prototype.unsetAll = function () { + this.unsetAllVendorConsents(), this.unsetAllPurposeLegitimateInterests(), this.unsetAllSpecialFeatureOptins(), this.unsetAllPurposeConsents(), this.unsetAllVendorLegitimateInterests(); + }, Object.defineProperty(i.prototype, 'numCustomPurposes', { + get: function () { + var t = this.numCustomPurposes_; + if ('object' == typeof this.customPurposes) { + var i = Object.keys(this.customPurposes).sort(function (t, i) { + return +t - +i; + }); + t = parseInt(i.pop(), 10); + } + return t; + }, + set: function (t) { + if (this.numCustomPurposes_ = parseInt(t, 10), this.numCustomPurposes_ < 0) + throw new h.TCModelError('numCustomPurposes', t); + }, + enumerable: !0, + configurable: !0 + }), i.prototype.updated = function () { + this.lastUpdated = new Date(); + }, i.consentLanguages = a.GVL.consentLanguages, i; + }(r.Cloneable); + i.TCModel = c; + }, + function (t, i, e) { + 'use strict'; + var s, n = this && this.Es || (s = function (t, i) { + return (s = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }, function (t, i) { + function e() { + this.constructor = t; + } + s(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + }), r = this && this.oo || function (t, i, e, s) { + return new (e || (e = Promise))(function (n, r) { + function h(t) { + try { + o(s.next(t)); + } catch (t) { + r(t); + } + } + function a(t) { + try { + o(s.throw(t)); + } catch (t) { + r(t); + } + } + function o(t) { + var i; + t.done ? n(t.value) : (i = t.value, i instanceof e ? i : new e(function (t) { + t(i); + })).then(h, a); + } + o((s = s.apply(t, i || [])).next()); + }); + }, h = this && this.ho || function (t, i) { + var e, s, n, r, h = { + label: 0, + sent: function () { + if (1 & n[0]) + throw n[1]; + return n[1]; + }, + trys: [], + ops: [] + }; + return r = { + next: a(0), + throw: a(1), + return: a(2) + }, 'function' == typeof Symbol && (r[Symbol.iterator] = function () { + return this; + }), r; + function a(r) { + return function (a) { + return function (r) { + if (e) + throw new TypeError('Generator is already executing.'); + for (; h;) + try { + if (e = 1, s && (n = 2 & r[0] ? s.return : r[0] ? s.throw || ((n = s.return) && n.call(s), 0) : s.next) && !(n = n.call(s, r[1])).done) + return n; + switch (s = 0, n && (r = [ + 2 & r[0], + n.value + ]), r[0]) { + case 0: + case 1: + n = r; + break; + case 4: + return h.label++, { + value: r[1], + done: !1 + }; + case 5: + h.label++, s = r[1], r = [0]; + continue; + case 7: + r = h.ops.pop(), h.trys.pop(); + continue; + default: + if (!(n = (n = h.trys).length > 0 && n[n.length - 1]) && (6 === r[0] || 2 === r[0])) { + h = 0; + continue; + } + if (3 === r[0] && (!n || r[1] > n[0] && r[1] < n[3])) { + h.label = r[1]; + break; + } + if (6 === r[0] && h.label < n[1]) { + h.label = n[1], n = r; + break; + } + if (n && h.label < n[2]) { + h.label = n[2], h.ops.push(r); + break; + } + n[2] && h.ops.pop(), h.trys.pop(); + continue; + } + r = i.call(t, h); + } catch (t) { + r = [ + 6, + t + ], s = 0; + } finally { + e = n = 0; + } + if (5 & r[0]) + throw r[1]; + return { + value: r[0] ? r[1] : void 0, + done: !0 + }; + }([ + r, + a + ]); + }; + } + }; + Object.defineProperty(i, '_', { value: !0 }); + var a = e(41), o = e(33), c = e(149), u = e(35), l = function (t) { + function i(e) { + var s = t.call(this) || this; + s.isReady_ = !1, s.isLatest = !1; + var n = i.baseUrl; + if (s.lang_ = i.DEFAULT_LANGUAGE, s.isVendorList(e)) + s.populate(e), s.readyPromise = Promise.resolve(); + else { + if (!n) + throw new o.GVLError('must specify GVL.baseUrl before loading GVL json'); + if (e > 0) { + var r = e; + i.CACHE.has(r) ? (s.populate(i.CACHE.get(r)), s.readyPromise = Promise.resolve()) : (n += i.versionedFilename.replace('[VERSION]', r + ''), s.readyPromise = s.fetchJson(n)); + } else + i.CACHE.has(i.LATEST_CACHE_KEY) ? (s.populate(i.CACHE.get(i.LATEST_CACHE_KEY)), s.readyPromise = Promise.resolve()) : (s.isLatest = !0, s.readyPromise = s.fetchJson(n + i.latestFilename)); + } + return s; + } + return n(i, t), Object.defineProperty(i, 'baseUrl', { + get: function () { + return this.baseUrl_; + }, + set: function (t) { + if (/^https?:\/\/vendorlist\.consensu\.org\//.test(t)) + throw new o.GVLError('Invalid baseUrl! You may not pull directly from vendorlist.consensu.org and must provide your own cache'); + t.length > 0 && '/' !== t[t.length - 1] && (t += '/'), this.baseUrl_ = t; + }, + enumerable: !0, + configurable: !0 + }), i.emptyLanguageCache = function (t) { + var e = !1; + return void 0 === t && i.LANGUAGE_CACHE.size > 0 ? (i.LANGUAGE_CACHE = new Map(), e = !0) : 'string' == typeof t && this.consentLanguages.has(t.toUpperCase()) && (i.LANGUAGE_CACHE.delete(t.toUpperCase()), e = !0), e; + }, i.emptyCache = function (t) { + var e = !1; + return Number.isInteger(t) && t >= 0 ? (i.CACHE.delete(t), e = !0) : void 0 === t && (i.CACHE = new Map(), e = !0), e; + }, i.prototype.cacheLanguage = function () { + i.LANGUAGE_CACHE.has(this.lang_) || i.LANGUAGE_CACHE.set(this.lang_, { + purposes: this.purposes, + specialPurposes: this.specialPurposes, + features: this.features, + specialFeatures: this.specialFeatures, + stacks: this.stacks + }); + }, i.prototype.fetchJson = function (t) { + return r(this, void 0, void 0, function () { + var i, e; + return h(this, function (s) { + switch (s.label) { + case 0: + return s.trys.push([ + 0, + 2, + , + 3 + ]), i = this.populate, [ + 4, + c.Json.fetch(t) + ]; + case 1: + return i.apply(this, [s.sent()]), [ + 3, + 3 + ]; + case 2: + throw e = s.sent(), new o.GVLError(e.message); + case 3: + return [2]; + } + }); + }); + }, i.prototype.getJson = function () { + return JSON.parse(JSON.stringify({ + gvlSpecificationVersion: this.gvlSpecificationVersion, + vendorListVersion: this.vendorListVersion, + tcfPolicyVersion: this.tcfPolicyVersion, + lastUpdated: this.lastUpdated, + purposes: this.purposes, + specialPurposes: this.specialPurposes, + features: this.features, + specialFeatures: this.specialFeatures, + stacks: this.stacks, + vendors: this.fullVendorList + })); + }, i.prototype.changeLanguage = function (t) { + return r(this, void 0, void 0, function () { + var e, s, n, r, a; + return h(this, function (h) { + switch (h.label) { + case 0: + if (e = t.toUpperCase(), !i.consentLanguages.has(e)) + return [ + 3, + 6 + ]; + if (e === this.lang_) + return [ + 3, + 5 + ]; + if (this.lang_ = e, !i.LANGUAGE_CACHE.has(e)) + return [ + 3, + 1 + ]; + for (n in s = i.LANGUAGE_CACHE.get(e)) + s.hasOwnProperty(n) && (this[n] = s[n]); + return [ + 3, + 5 + ]; + case 1: + r = i.baseUrl + i.languageFilename.replace('[LANG]', t), h.label = 2; + case 2: + return h.trys.push([ + 2, + 4, + , + 5 + ]), [ + 4, + this.fetchJson(r) + ]; + case 3: + return h.sent(), this.cacheLanguage(), [ + 3, + 5 + ]; + case 4: + throw a = h.sent(), new o.GVLError('unable to load language: ' + a.message); + case 5: + return [ + 3, + 7 + ]; + case 6: + throw new o.GVLError('unsupported language ' + t); + case 7: + return [2]; + } + }); + }); + }, Object.defineProperty(i.prototype, 'language', { + get: function () { + return this.lang_; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.isVendorList = function (t) { + return void 0 !== t && void 0 !== t.vendors; + }, i.prototype.populate = function (t) { + this.purposes = t.purposes, this.specialPurposes = t.specialPurposes, this.features = t.features, this.specialFeatures = t.specialFeatures, this.stacks = t.stacks, this.isVendorList(t) && (this.gvlSpecificationVersion = t.gvlSpecificationVersion, this.tcfPolicyVersion = t.tcfPolicyVersion, this.vendorListVersion = t.vendorListVersion, this.lastUpdated = t.lastUpdated, 'string' == typeof this.lastUpdated && (this.lastUpdated = new Date(this.lastUpdated)), this.vendors_ = t.vendors, this.fullVendorList = t.vendors, this.mapVendors(), this.isReady_ = !0, this.isLatest && i.CACHE.set(i.LATEST_CACHE_KEY, this.getJson()), i.CACHE.has(this.vendorListVersion) || i.CACHE.set(this.vendorListVersion, this.getJson())), this.cacheLanguage(); + }, i.prototype.mapVendors = function (t) { + var i = this; + this.byPurposeVendorMap = {}, this.bySpecialPurposeVendorMap = {}, this.byFeatureVendorMap = {}, this.bySpecialFeatureVendorMap = {}, Object.keys(this.purposes).forEach(function (t) { + i.byPurposeVendorMap[t] = { + legInt: new Set(), + consent: new Set(), + flexible: new Set() + }; + }), Object.keys(this.specialPurposes).forEach(function (t) { + i.bySpecialPurposeVendorMap[t] = new Set(); + }), Object.keys(this.features).forEach(function (t) { + i.byFeatureVendorMap[t] = new Set(); + }), Object.keys(this.specialFeatures).forEach(function (t) { + i.bySpecialFeatureVendorMap[t] = new Set(); + }), Array.isArray(t) || (t = Object.keys(this.fullVendorList).map(function (t) { + return +t; + })), this.vendorIds = new Set(t), this.vendors_ = t.reduce(function (t, e) { + var s = i.vendors_['' + e]; + return s && void 0 === s.deletedDate && (s.purposes.forEach(function (t) { + i.byPurposeVendorMap[t + ''].consent.add(e); + }), s.specialPurposes.forEach(function (t) { + i.bySpecialPurposeVendorMap[t + ''].add(e); + }), s.legIntPurposes.forEach(function (t) { + i.byPurposeVendorMap[t + ''].legInt.add(e); + }), s.flexiblePurposes && s.flexiblePurposes.forEach(function (t) { + i.byPurposeVendorMap[t + ''].flexible.add(e); + }), s.features.forEach(function (t) { + i.byFeatureVendorMap[t + ''].add(e); + }), s.specialFeatures.forEach(function (t) { + i.bySpecialFeatureVendorMap[t + ''].add(e); + }), t[e] = s), t; + }, {}); + }, i.prototype.getFilteredVendors = function (t, i, e, s) { + var n = this, r = t.charAt(0).toUpperCase() + t.slice(1), h = {}; + return ('purpose' === t && e ? this['by' + r + 'VendorMap'][i + ''][e] : this['by' + (s ? 'Special' : '') + r + 'VendorMap'][i + '']).forEach(function (t) { + h[t + ''] = n.vendors[t + '']; + }), h; + }, i.prototype.getVendorsWithConsentPurpose = function (t) { + return this.getFilteredVendors('purpose', t, 'consent'); + }, i.prototype.getVendorsWithLegIntPurpose = function (t) { + return this.getFilteredVendors('purpose', t, 'legInt'); + }, i.prototype.getVendorsWithFlexiblePurpose = function (t) { + return this.getFilteredVendors('purpose', t, 'flexible'); + }, i.prototype.getVendorsWithSpecialPurpose = function (t) { + return this.getFilteredVendors('purpose', t, void 0, !0); + }, i.prototype.getVendorsWithFeature = function (t) { + return this.getFilteredVendors('feature', t); + }, i.prototype.getVendorsWithSpecialFeature = function (t) { + return this.getFilteredVendors('feature', t, void 0, !0); + }, Object.defineProperty(i.prototype, 'vendors', { + get: function () { + return this.vendors_; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.narrowVendorsTo = function (t) { + this.mapVendors(t); + }, Object.defineProperty(i.prototype, 'isReady', { + get: function () { + return this.isReady_; + }, + enumerable: !0, + configurable: !0 + }), i.prototype.clone = function () { + return new i(this.getJson()); + }, i.isInstanceOf = function (t) { + return 'object' == typeof t && 'function' == typeof t.narrowVendorsTo; + }, i.LANGUAGE_CACHE = new Map(), i.CACHE = new Map(), i.LATEST_CACHE_KEY = 0, i.DEFAULT_LANGUAGE = 'EN', i.consentLanguages = new u.ConsentLanguages(), i.latestFilename = 'vendor-list.json', i.versionedFilename = 'archives/vendor-list-v[VERSION].json', i.languageFilename = 'purposes-[LANG].json', i; + }(a.Cloneable); + i.GVL = l; + }, + function (t, i, e) { + 'use strict'; + Object.defineProperty(i, '_', { value: !0 }); + var s = function () { + function t() { + } + return t.absCall = function (t, i, e, s) { + return new Promise(function (n, r) { + var h = new XMLHttpRequest(); + h.withCredentials = e, h.addEventListener('load', function () { + if (h.readyState == XMLHttpRequest.DONE) + if (h.status >= 200 && h.status < 300) { + var t = h.response; + if ('string' == typeof t) + try { + t = JSON.parse(t); + } catch (t) { + } + n(t); + } else + r(new Error('HTTP Status: ' + h.status + ' response type: ' + h.responseType)); + }), h.addEventListener('error', function () { + r(new Error('error')); + }), h.addEventListener('abort', function () { + r(new Error('aborted')); + }), null === i ? h.open('GET', t, !0) : h.open('POST', t, !0), h.responseType = 'json', h.timeout = s, h.ontimeout = function () { + r(new Error('Timeout ' + s + 'ms ' + t)); + }, h.send(i); + }); + }, t.post = function (t, i, e, s) { + return void 0 === e && (e = !1), void 0 === s && (s = 0), this.absCall(t, JSON.stringify(i), e, s); + }, t.fetch = function (t, i, e) { + return void 0 === i && (i = !1), void 0 === e && (e = 0), this.absCall(t, null, i, e); + }, t; + }(); + i.Json = s; + }, + function (t, i, e) { + 'use strict'; + var s = e(151), n = s.decodeBitsToIds, r = s.decodeFromBase64; + t.exports = { + decodeConsentString: function (t) { + var i = r(t), e = i.version, s = i.cmpId, h = i.vendorListVersion, a = i.purposeIdBitString, o = i.maxVendorId, c = i.created, u = i.lastUpdated, l = i.isRange, d = i.defaultConsent, f = i.vendorIdBitString, p = i.vendorRangeList, b = i.cmpVersion, v = i.consentScreen, m = i.consentLanguage, g = { + version: e, + cmpId: s, + vendorListVersion: h, + allowedPurposeIds: n(a), + maxVendorId: o, + created: c, + lastUpdated: u, + cmpVersion: b, + consentScreen: v, + consentLanguage: m + }; + if (l) { + var y = p.reduce(function (t, i) { + for (var e = i.isRange, s = i.startVendorId, n = i.endVendorId, r = e ? n : s, h = s; h <= r; h += 1) + t[h] = !0; + return t; + }, {}); + g.allowedVendorIds = []; + for (var w = 1; w <= o; w += 1) + (d && !y[w] || !d && y[w]) && -1 === g.allowedVendorIds.indexOf(w) && g.allowedVendorIds.push(w); + } else + g.allowedVendorIds = n(f); + return g; + } + }; + }, + function (t, i, e) { + 'use strict'; + var s = e(152), n = e(154), r = n.versionNumBits, h = n.vendorVersionMap; + function a(t, i, e) { + return parseInt(t.substr(i, e), 2); + } + function o(t, i, e) { + return new Date(100 * a(t, i, e)); + } + function c(t) { + var i = a(t); + return String.fromCharCode(i + 65).toLowerCase(); + } + function u(t, i, e) { + var s = t.substr(i, e); + return c(s.slice(0, e / 2)) + c(s.slice(e / 2)); + } + function l(t) { + var i = t.input, e = t.output, s = t.startPosition, n = t.field, r = n.type, h = n.numBits, c = n.decoder, l = n.validator, f = n.listCount; + if ('function' == typeof l && !l(e)) + return { newPosition: s }; + if ('function' == typeof c) + return c(i, e, s); + var p, b, v = 'function' == typeof h ? h(e) : h; + switch (r) { + case 'int': + return { fieldValue: a(i, s, v) }; + case 'bool': + return { fieldValue: (p = i, b = s, 1 === parseInt(p.substr(b, 1), 2)) }; + case 'date': + return { fieldValue: o(i, s, v) }; + case 'bits': + return { fieldValue: i.substr(s, v) }; + case 'list': + return function (t, i, e, s, n) { + var r = 0; + 'function' == typeof n ? r = n(i) : 'number' == typeof n && (r = n); + for (var h = e, a = [], o = 0; o < r; o += 1) { + var c = d({ + input: t, + fields: s.fields, + startPosition: h + }); + h = c.newPosition, a.push(c.decodedObject); + } + return { + fieldValue: a, + newPosition: h + }; + }(i, e, s, n, f); + case 'language': + return { fieldValue: u(i, s, v) }; + default: + throw new Error('ConsentString - Unknown field type ' + r + ' for decoding'); + } + } + function d(t) { + var i = t.input, e = t.fields, s = t.startPosition, n = void 0 === s ? 0 : s; + return { + decodedObject: e.reduce(function (t, e) { + var s = e.name, r = e.numBits, h = l({ + input: i, + output: t, + startPosition: n, + field: e + }), a = h.fieldValue, o = h.newPosition; + return void 0 !== a && (t[s] = a), void 0 !== o ? n = o : 'number' == typeof r && (n += r), t; + }, {}), + newPosition: n + }; + } + t.exports = { + decodeBitsToIds: function (t) { + return t.split('').reduce(function (t, i, e) { + return '1' === i && -1 === t.indexOf(e + 1) && t.push(e + 1), t; + }, []); + }, + decodeFromBase64: function (t, i) { + for (var e = t; e.length % 4 != 0;) + e += '='; + e = e.replace(/-/g, '+').replace(/_/g, '/'); + for (var n, o, c = s.decode(e), u = '', l = 0; l < c.length; l += 1) { + var f = c.charCodeAt(l).toString(2); + u += (n = f, o = 8 - f.length, function (t) { + for (var i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : '0', e = '', s = 0; s < t; s += 1) + e += i; + return e; + }(Math.max(0, o)) + n); + } + return function (t) { + var i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : h, e = a(t, 0, r); + if ('number' != typeof e) + throw new Error('ConsentString - Unknown version number in the string to decode'); + if (!h[e]) + throw new Error('ConsentString - Unsupported version ' + e + ' in the string to decode'); + return d({ + input: t, + fields: i[e].fields + }).decodedObject; + }(u, i); + } + }; + }, + function (t, i, e) { + (function (t, s) { + var n; + !function (r) { + var h = i, a = (t && t.exports, 'object' == typeof s && s); + a.global !== a && a.window; + var o = function (t) { + this.message = t; + }; + (o.prototype = new Error()).name = 'InvalidCharacterError'; + var c = function (t) { + throw new o(t); + }, u = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', l = /[\t\n\f\r ]/g, d = { + encode: function (t) { + t = String(t), /[^\0-\xFF]/.test(t) && c('The string to be encoded contains characters outside of the Latin1 range.'); + for (var i, e, s, n, r = t.length % 3, h = '', a = -1, o = t.length - r; ++a < o;) + i = t.charCodeAt(a) << 16, e = t.charCodeAt(++a) << 8, s = t.charCodeAt(++a), h += u.charAt((n = i + e + s) >> 18 & 63) + u.charAt(n >> 12 & 63) + u.charAt(n >> 6 & 63) + u.charAt(63 & n); + return 2 == r ? (i = t.charCodeAt(a) << 8, e = t.charCodeAt(++a), h += u.charAt((n = i + e) >> 10) + u.charAt(n >> 4 & 63) + u.charAt(n << 2 & 63) + '=') : 1 == r && (n = t.charCodeAt(a), h += u.charAt(n >> 2) + u.charAt(n << 4 & 63) + '=='), h; + }, + decode: function (t) { + var i = (t = String(t).replace(l, '')).length; + i % 4 == 0 && (i = (t = t.replace(/==?$/, '')).length), (i % 4 == 1 || /[^+a-zA-Z0-9/]/.test(t)) && c('Invalid character: the string to be decoded is not correctly encoded.'); + for (var e, s, n = 0, r = '', h = -1; ++h < i;) + s = u.indexOf(t.charAt(h)), e = n % 4 ? 64 * e + s : s, n++ % 4 && (r += String.fromCharCode(255 & e >> (-2 * n & 6))); + return r; + }, + version: '0.1.0' + }; + void 0 === (n = function () { + return d; + }.call(i, e, i, t)) || (t.exports = n); + }(); + }.call(this, e(153)(t), e(62))); + }, + function (t, i) { + t.exports = function (t) { + return t.webpackPolyfill || (t.deprecate = function () { + }, t.paths = [], t.children || (t.children = []), Object.defineProperty(t, 'loaded', { + enumerable: !0, + get: function () { + return t.l; + } + }), Object.defineProperty(t, 'id', { + enumerable: !0, + get: function () { + return t.i; + } + }), t.webpackPolyfill = 1), t; + }; + }, + function (t, i, e) { + 'use strict'; + t.exports = { + versionNumBits: 6, + vendorVersionMap: { + 1: { + version: 1, + metadataFields: [ + 'version', + 'created', + 'lastUpdated', + 'cmpId', + 'cmpVersion', + 'consentScreen', + 'vendorListVersion' + ], + fields: [ + { + name: 'version', + type: 'int', + numBits: 6 + }, + { + name: 'created', + type: 'date', + numBits: 36 + }, + { + name: 'lastUpdated', + type: 'date', + numBits: 36 + }, + { + name: 'cmpId', + type: 'int', + numBits: 12 + }, + { + name: 'cmpVersion', + type: 'int', + numBits: 12 + }, + { + name: 'consentScreen', + type: 'int', + numBits: 6 + }, + { + name: 'consentLanguage', + type: 'language', + numBits: 12 + }, + { + name: 'vendorListVersion', + type: 'int', + numBits: 12 + }, + { + name: 'purposeIdBitString', + type: 'bits', + numBits: 24 + }, + { + name: 'maxVendorId', + type: 'int', + numBits: 16 + }, + { + name: 'isRange', + type: 'bool', + numBits: 1 + }, + { + name: 'vendorIdBitString', + type: 'bits', + numBits: function (t) { + return t.maxVendorId; + }, + validator: function (t) { + return !t.isRange; + } + }, + { + name: 'defaultConsent', + type: 'bool', + numBits: 1, + validator: function (t) { + return t.isRange; + } + }, + { + name: 'numEntries', + numBits: 12, + type: 'int', + validator: function (t) { + return t.isRange; + } + }, + { + name: 'vendorRangeList', + type: 'list', + listCount: function (t) { + return t.numEntries; + }, + validator: function (t) { + return t.isRange; + }, + fields: [ + { + name: 'isRange', + type: 'bool', + numBits: 1 + }, + { + name: 'startVendorId', + type: 'int', + numBits: 16 + }, + { + name: 'endVendorId', + type: 'int', + numBits: 16, + validator: function (t) { + return t.isRange; + } + } + ] + } + ] + } + } + }; + }, + function (t, i) { + String.prototype.cnx_replaceAll = function (t, i) { + return this.split(t).join(i); + }; + }, + function (t, i, e) { + 'use strict'; + e.r(i); + var s, n = e(5), r = e(48), h = (e(155), e(0)), a = e(79), o = e(20), c = e(16), u = e(31), l = e(6), d = e(4), f = e(36); + !function (t) { + t.Deprecation = 'deprecation', t.Intervention = 'intervention', t.Crash = 'crash'; + }(s || (s = {})); + const p = 'HeavyAdIntervention'; + class b { + constructor(t, i, e) { + this.fe = t, this.co = i, this.uo = e, this.do = !1, this.fo = () => { + 'hidden' === this.fe.document.visibilityState && this.po(); + }, this.po = () => { + if (this.do || !this.bo) + return; + const t = this.bo.takeRecords(); + this.vo(t), this.do = !0; + }, this.vo = t => { + t.filter(({body: t}) => { + var i; + return (null === (i = t) || void 0 === i ? void 0 : i.id) === p; + }).forEach(() => { + this.co.trackHeavyAdIntervention(this.uo); + }); + }, this.mo() && this.ys(); + } + destroy() { + this.fe.removeEventListener('pagehide', this.po), this.fe.removeEventListener('visibilitychange', this.fo); + } + mo() { + return !!this.fe.ReportingObserver; + } + ys() { + this.bo = new this.fe.ReportingObserver(t => { + this.vo(t); + }, { + buffered: !0, + types: [s.Intervention] + }), this.bo.observe(), this.fe.addEventListener('pagehide', this.po), this.fe.addEventListener('visibilitychange', this.fo); + } + } + class v extends o.a { + constructor(t, i, e, s, n, r) { + super(), this.mediator = t, this.playerModel = i, this.app = e, this.Hs = s, this.yo = n, this._appSettings = r, this.macroElements = { player: [] }, this.wo = !1, this.Oo = { + description: '{{description}}', + title: '{{title}}', + player: '{{player}}' + }, this.xo = null, this.So = 500, this.createExperience(i, r), this.jo = new b(i.global, this.app.services.TrackingService, { heavyAdBlockTypeEnum: h.ProtoHeavyAdBlockTypeEnum.Global }), this.ko = new b(window, this.app.services.TrackingService, { heavyAdBlockTypeEnum: h.ProtoHeavyAdBlockTypeEnum.Script }); + } + subscribeToEvents() { + this.subscribe(c.b.Destroy, this.experience, () => { + this.destroy(); + }), this.subscribe(c.b.CanStart, this.experience, () => { + this.experience.start(); + }), this.subscribe(c.c.SessionRendered, this.experience, () => { + this.yo.wasPlayerReloaded || this.app.services.TrackingService.trackSessionRendered(this.Hs), this.mediator.publish(this, c.c.SessionRendered); + }), this.subscribe(c.c.SessionView, this.experience, () => { + this.yo.wasPlayerInView || (this.app.services.TrackingService.trackSessionViewability(), this.mediator.publish(this, c.c.SessionView)); + }), Object(u.a)(this.experience.events).forEach(t => { + this.subscribe(t, this.experience, i => { + this.experienceApi.trigger(t, i.payload); + }); + }); + } + updateMacroContent(t, i) { + t && t.forEach(t => { + t.textContent = i; + }); + } + In() { + this.playerModel.css && this.app.services.GlobalDomUtilsService.addCssString(this.playerModel.css, `cnx-custom-css-${ this.app.config.appId }`); + } + _o(t) { + return `${ t }`.replace(/{\{([^}]+)}}/g, '$&'); + } + Ao() { + if (this.experienceContainer = this.Io(), this.playerModel.html) { + const t = this.app.services.GlobalDomUtilsService.createElementByString(this._o(this.playerModel.html)); + this.Co(t); + const i = this.macroElements.player[0]; + if (!i) + throw Error('player macro was not found'); + i.innerHTML = '', i.parentNode.insertBefore(this.experienceContainer, i), i.parentNode.removeChild(i), Object(l.c)(t.children).forEach(t => { + this.playerModel.targetContainer.parentNode.insertBefore(t, this.playerModel.targetContainer); + }); + } else + this.playerModel.targetContainer.parentNode.insertBefore(this.experienceContainer, this.playerModel.targetContainer); + this.playerModel.targetContainer.parentElement.removeChild(this.playerModel.targetContainer); + } + Io() { + const t = this.app.config.isMobile ? d.g.Mobile : d.g.Desktop; + return this.app.services.GlobalDomUtilsService.createElementByString(``); + } + Co(t) { + Object(l.c)(t.children).forEach(t => { + t.children.length > 0 && this.Co(t), Object.keys(this.Oo).forEach(i => { + const e = this.Oo[i]; + t.textContent.indexOf(e) > -1 && this.Po(i, t); + }); + }); + } + Po(t, i) { + this.macroElements[t] || (this.macroElements[t] = []), this.macroElements[t].push(i), i.textContent = ''; + } + Mo() { + null !== this.xo && (clearInterval(this.xo), this.xo = null); + } + init(t) { + this.In(), this.Ao(); + const i = this.app.config.device; + return this.isSupportedBreakpoint(i) ? (this.subscribeToEvents(), this.experience.Eo(this.playerModel, this.app, this.experienceContainer, t), this.xo = setInterval(() => { + this.wo ? this.Mo() : this.app.services.GlobalDomUtilsService.isDetachedFromDOM(this.experienceContainer) && (this.destroy(), Object(n.a)({ + message: 'player_removed_from_DOM', + level: h.ProtoLoggingLevelEnum.INFO + })); + }, this.So), !0) : (this.destroy(), !1); + } + getApiMethods() { + return this.experienceApi.getApiMethods(); + } + get playerContainer() { + return this.experienceContainer; + } + destroy() { + try { + f.a.playerDestroyed(), this.wo = !0, this.Mo(), this.app.services.TrackingService.destroy(), this.app.services.ResizeObserver.destroy(), this.app.services.ViewabilityService.destroy(), this.app.services.InteractionService.destroy(), this.experienceApi.setDestroyed(), this.unsubscribeAll(this.experience), this.experience && (this.experience.destroy(), this.experience = null), this.experienceContainer.parentNode && this.experienceContainer.parentNode.removeChild(this.experienceContainer), this.jo.destroy(), this.ko.destroy(); + } catch (t) { + Object(n.a)({ + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.WARNING, + message: 'Renderer_destroy', + exception: t.message + }); + } + } + } + const m = { + Play: 'play', + Pause: 'pause', + Mute: 'mute', + Unmute: 'unmute', + Canplay: 'canplay', + Ended: 'ended', + Timeupdate: 'timeupdate', + Seeking: 'seeking', + Seeked: 'seeked', + Volumechange: 'volumechange', + Durationchange: 'durationchange', + Fullscreen: 'fullscreen', + LoadedData: 'loadeddata', + LoadedMetadata: 'loadedmetadata', + Error: 'error' + }; + var g, y, w; + !function (t) { + t[t.Auto = 0] = 'Auto', t[t.Strict = 1] = 'Strict'; + }(g || (g = {})), function (t) { + t[t.PlayingState = 0] = 'PlayingState', t[t.PausedState = 1] = 'PausedState', t[t.PrerollState = 2] = 'PrerollState', t[t.PostrollState = 3] = 'PostrollState', t[t.StoppedState = 4] = 'StoppedState', t[t.ReplayState = 5] = 'ReplayState', t[t.HiddenState = 6] = 'HiddenState', t[t.BufferingState = 7] = 'BufferingState', t[t.LiveStreamStarting = 8] = 'LiveStreamStarting', t[t.LiveStreamEnded = 9] = 'LiveStreamEnded', t[t.LiveStreamStopped = 10] = 'LiveStreamStopped', t[t.LiveStreamNotSupported = 11] = 'LiveStreamNotSupported'; + }(y || (y = {})), function (t) { + t.H264 = 'h264', t.Hevc = 'hevc'; + }(w || (w = {})); + const O = { + PlayError: 'playError', + NewVideo: 'newVideo', + Buffering: 'buffering', + Buffered: 'buffered', + LevelSwitching: 'levelSwitching', + EndOfStream: 'endOfStream', + LiveStreamNotPlayable: 'liveNotPlayable' + }, x = { + Change: 'VideoQualityChanged', + CurrentQuality: 'CurrentQuality', + Loaded: 'QualityListLoaded' + }; + var S; + !function (t) { + t[t.Low144p = 144] = 'Low144p', t[t.Low240p = 240] = 'Low240p', t[t.Medium360p = 360] = 'Medium360p', t[t.Medium480p = 480] = 'Medium480p', t[t.High720p = 720] = 'High720p', t[t.High1080p = 1080] = 'High1080p'; + }(S || (S = {})); + const j = 720, k = 5000, _ = { NewThumbnail: 'NewThumbnail' }; + var A = Object.assign(Object.assign({}, c.a), { + FirstFramePlayed: 'firstFramePlayed', + ContentQuartiles: 'contentQuartiles', + MediaMetaUpdate: 'mediaMetaUpdate', + ChangeVideo: 'changeVideo', + VideoQueued: 'videoQueued' + }); + const I = Object.assign(Object.assign(Object.assign(Object.assign({}, { + VideoStarted: 'videoStarted', + VideoCompleted25: 'videoCompleted25', + VideoCompleted50: 'videoCompleted50', + VideoCompleted75: 'videoCompleted75', + VideoCompleted100: 'videoCompleted100', + NewVideo: 'newVideo' + }), { SubtitlesVisibilityChanged: 'subtitlesVisibilityChanged' }), { PlayerClicked: 'playerClicked' }), { GalleryCardClicked: 'galleryCardClicked' }), C = { + Collapsed: 'collapsed', + AdCycleComplete: 'adCycleComplete' + }; + var T = e(2); + class P { + constructor(t, i, e, s) { + this.Lo = t, this.Ro = s, this.Bo = this.Do(e, i); + } + Do(t, i) { + return Object.assign({}, t[i] || t[h.ProtoDeviceType.Smartphone]); + } + updateWidth(t) { + const i = this.Fo(t); + i !== this.currentBreakpointClass && (Object(T.I)(this.Lo, this.currentBreakpointClass), Object(T.a)(this.Lo, i), this.currentBreakpointClass = i); + } + Fo(t) { + switch (!0) { + case t >= this.Bo.xxl: + return this.Ro.Xxl; + case t >= this.Bo.xl: + return this.Ro.Xl; + case t >= this.Bo.lg: + return this.Ro.Lg; + case t >= this.Bo.md: + return this.Ro.Md; + case t >= this.Bo.sm: + return this.Ro.Sm; + case t >= this.Bo.xs: + return this.Ro.Xs; + default: + return this.Ro.Xxs; + } + } + } + var M = e(7); + const E = { + xl: 720, + lg: 320, + md: 204, + sm: 142, + xs: 0 + }, L = { + [h.ProtoDeviceType.Desktop]: { + xl: 468, + lg: 388, + md: 248, + sm: 142, + xs: 0 + }, + [h.ProtoDeviceType.Tablet]: Object.assign({}, E), + [h.ProtoDeviceType.Smartphone]: Object.assign({}, E) + }, R = { + xl: 720, + lg: 320, + md: 204, + sm: 142, + xs: 0 + }, B = { + [h.ProtoDeviceType.Desktop]: { + xl: 468, + lg: 388, + md: 248, + sm: 142, + xs: 0 + }, + [h.ProtoDeviceType.Tablet]: Object.assign({}, R), + [h.ProtoDeviceType.Smartphone]: Object.assign({}, R) + }, D = 176, F = 160, V = 144, U = 112, $ = { + xl: R.xl + D, + lg: R.lg + F, + md: R.md + V, + sm: R.sm + U + }, N = { + [h.ProtoDeviceType.Desktop]: { + xl: 468 + D, + lg: 388 + F, + md: 248 + V, + sm: 142 + U, + xs: 0 + }, + [h.ProtoDeviceType.Tablet]: Object.assign({}, $), + [h.ProtoDeviceType.Smartphone]: Object.assign({}, $) + }, H = { + lg: 320, + md: 204, + sm: 0 + }, q = { + [h.ProtoDeviceType.Desktop]: { + xl: 468, + lg: 388, + md: 248, + sm: 0 + }, + [h.ProtoDeviceType.Tablet]: Object.assign({}, H), + [h.ProtoDeviceType.Smartphone]: Object.assign({}, H) + }, z = { + xxl: 1080, + xl: 0 + }, W = { + [h.ProtoDeviceType.Desktop]: { + xxl: 720, + xl: 0 + }, + [h.ProtoDeviceType.Tablet]: Object.assign({}, z), + [h.ProtoDeviceType.Smartphone]: Object.assign({}, z) + }, G = { + [M.ProtoGalleryOrientationEnum.Landscape]: { + [M.ProtoGalleryStyleMode.Detailed]: W, + [M.ProtoGalleryStyleMode.Visual]: N + }, + [M.ProtoGalleryOrientationEnum.Portrait]: { + [M.ProtoGalleryStyleMode.Detailed]: q, + [M.ProtoGalleryStyleMode.Visual]: B + } + }; + var J; + !function (t) { + t[t.CardClicked = 0] = 'CardClicked'; + }(J || (J = {})); + const Q = { + width: 160, + height: 90 + }, X = { + width: 80, + height: 80 + }, Y = 3, K = 'EXPLORE MORE'; + class Z { + constructor(t, i, e = (() => { + return {}; + })()) { + this.Vo = t, this.js = i, this.Uo = 1.2, this.$o = 16, this.No = 'normal', this.Ho = { + lines: 0, + useNativeClamping: !0 + }, this.qo = !1, this.Ho = Object.assign(Object.assign({}, this.Ho), e), this.qo = this.zo(); + } + setLines(t) { + this.Ho.lines = t; + } + getClampedText(t) { + this.Wo = t.trim(), this.Go = this.js.createElementByString(`${ this.Wo }`), this.Vo.appendChild(this.Go); + let i = 0; + try { + i = this.Jo(); + } catch (t) { + Object(n.a)({ + message: 'LineClamp_getMaxLines', + exception: t.message, + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + const e = this.Qo(this.Ho.lines, i), s = this.Xo(e); + return Math.ceil(this.Go.getBoundingClientRect().height) - 1 <= s ? (this.Yo(), this.Wo) : this.qo ? void Object(T.N)(this.Vo, { + overflow: 'hidden', + textOverflow: 'ellipsis', + webkitBoxOrient: 'vertical', + display: '-webkit-box', + webkitLineClamp: e + }) : this.Ko(this.Go.firstChild, s); + } + zo() { + return !!this.Ho.useNativeClamping && void 0 !== this.Vo.style.webkitLineClamp; + } + Xo(t) { + return this.Zo(this.Vo) * t + (this.tc(this.Go) + this.tc(this.Vo)) + (this.ic(this.Go) + this.ic(this.Vo)); + } + ec(t) { + if (t.getBoundingClientRect) { + const {height: i} = t.getBoundingClientRect(); + if (i > 0) + return Math.ceil(i); + } + const i = t.clientHeight; + return i && i > 0 ? Math.ceil(i) : t.parentNode ? this.ec(t.parentNode) : 0; + } + Jo() { + const t = this.ec(this.Vo), i = this.Zo(this.Vo), e = this.tc(this.Go) + this.tc(this.Vo), s = this.ic(this.Go) + this.ic(this.Vo), n = Math.floor((t - e - s) / i + 0.05); + return Math.max(n, 0); + } + sc(t) { + const i = this.js.getFontSizePropertyValue(t); + return i ? parseInt(i, 10) : this.$o; + } + Zo(t) { + let i = this.js.getLineHeightPropertyValue(t); + return i && i !== this.No || (i = `${ this.Uo * this.sc(t) }`), parseInt(i, 10); + } + tc(t) { + if (!t) + return 0; + const i = this.js.getPaddingTopPropertyValue(t); + return parseInt(i, 10) || 0; + } + ic(t) { + if (!t) + return 0; + const i = this.js.getPaddingBottomPropertyValue(t); + return parseInt(i, 10) || 0; + } + Qo(t, i) { + return t > 0 ? 0 === i ? t : Math.min(this.Ho.lines, i) : i; + } + Ko(t, i, e) { + if (!i) + return; + void 0 === e && (e = t.nodeValue.split(' ')); + const s = [...e]; + if (s.length > 1) { + return s.pop(), this.nc(t, `${ s.join(' ') }...`), t.parentNode.offsetHeight > i ? this.Ko(t, i, s) : (this.Yo(), `${ s.join(' ') }...`); + } + } + nc(t, i) { + t.nodeValue = i; + } + Yo() { + this.Vo.innerHTML = '', this.Go = null; + } + } + var tt = e(86), it = e.n(tt), et = e(51), st = e.n(et), nt = e(29), rt = e(1), ht = e(10); + var at = class extends o.a { + constructor(t, i, e, s, n) { + super(), this.mediator = t, this.mr = i, this.rc = e, this.hc = s, this.Wn = n, this.br = () => { + this.Wn.metadata.title && this.ac(); + }, this.oc = () => { + this.mediator.publish(this, J[J.CardClicked], { payload: this.Wn.id }); + }, this.uc = this.rc.createElementByString(this.lc()), this.dc = this.uc.getElementsByClassName(d.o.CardImage)[0], this.fc = this.uc.getElementsByClassName(d.o.CardText)[0], this.pc = this.uc.getElementsByClassName(d.o.CardTextContainer)[0], this.Wn.titleFont && Object(T.N)(this.pc, { 'font-family': this.Wn.titleFont }); + const r = this.rc.createElement('img'); + r.onload = () => { + this.dc.appendChild(r); + }; + const h = this.Wn.metadata.getThumbnailUrl(this.bc().width, this.bc().height); + if (Object(rt.h)(h) && (r.src = h), r.alt = Object(rt.a)(this.Wn.metadata.altText) ? this.Wn.metadata.altText : '', this.Wn.style === M.ProtoGalleryStyleMode.Detailed && this.Wn.metadata.duration) { + const t = this.rc.createElementByString(`${ Object(nt.f)(this.Wn.metadata.duration) }`); + this.Wn.bodyFont && Object(T.N)(t, { 'font-family': this.Wn.bodyFont }), this.pc.appendChild(t); + } + this.hc.register(this.uc, this, this.hc), this.subscribe(ht.a[ht.a.Click], this.hc, () => { + this.oc(); + }), this.relay(ht.a[ht.a.Scroll], this.hc, this, this.mediator), this.vc = new Z(this.fc, this.rc, { + lines: Y, + useNativeClamping: !1 + }), this.mr.on(this.uc, this.br); + } + lc() { + return this.Wn.style === M.ProtoGalleryStyleMode.Visual ? it.a : st.a; + } + bc() { + return this.Wn.style === M.ProtoGalleryStyleMode.Visual ? Q : X; + } + ac() { + const t = this.vc.getClampedText(this.Wn.metadata.title), i = this.rc.createElementByString(`${ t }`); + Object(T.d)(i, this.fc); + } + get $element() { + return this.uc; + } + setActiveState(t) { + t ? Object(T.a)(this.uc, d.h.Active) : Object(T.I)(this.uc, d.h.Active); + } + destroy() { + this.uc.removeEventListener('click', this.oc), this.mr.off(this.uc, this.br); + } + clampLines() { + this.ac(); + } + }; + var ot = class extends o.a { + constructor(t, i, e, s, n) { + if (super(), this.mediator = t, this.mr = i, this.rc = e, this.hc = s, this.Wn = n, this.mc = !1, this.Wn.$slot.innerHTML = ``, this.Wn.style === M.ProtoGalleryStyleMode.Detailed) { + const t = e.createElementByString(this.gc(st.a)); + this.Wn.$slot.firstChild.appendChild(t); + } + this.hc.register(this.Wn.$slot, this.mediator, this), this.relay(ht.a[ht.a.Scroll], this.hc, this, this.mediator); + } + gc(t) { + const i = [...Array(12)].map(() => { + return ` `; + }).reduce((t, i) => { + return t + i; + }, ''); + return t.replace('', i); + } + setCardData(t) { + this.yc = new at(this, this.mr, this.rc, this.hc, { + id: this.Wn.id, + style: this.Wn.style, + metadata: t, + titleFont: this.Wn.titleFont, + bodyFont: this.Wn.bodyFont + }), this.subscribe(J[J.CardClicked], this.yc, ({payload: t}) => { + this.mediator.publish(this, J[J.CardClicked], { payload: t }); + }), this.unsubscribeAll(this.hc), this.relay(ht.a[ht.a.Scroll], this.yc, this, this.mediator), this.yc.setActiveState(this.mc), this.Wn.$slot.innerHTML = '', this.Wn.$slot.appendChild(this.yc.$element); + } + setActiveState(t) { + this.mc = t, this.yc && this.yc.setActiveState(this.mc); + } + getContainer() { + return this.Wn.$slot; + } + clampLines() { + this.yc.clampLines(); + } + }; + const ct = 4, ut = 4, lt = 20, dt = 100, ft = 50; + var pt; + !function (t) { + t.MainContainer = 'cnx-scrollbar', t.Wrapper = 'cnx-scrollbar-wrapper', t.Content = 'cnx-scrollbar-content', t.Horizontal = 'cnx-scrollbar-horizontal', t.Handle = 'cnx-scrollbar-handle', t.PreventSelect = 'cnx-scrollbar-prevent-select', t.ShowOnHover = 'cnx-scrollbar-show-on-hover'; + }(pt || (pt = {})); + class bt { + constructor(t, i = (() => { + return {}; + })()) { + if (this.wc = t, this.Wn = i, this.Oc = 0, this.xc = t => { + t.preventDefault(), this.Sc = t.pageY, this.jc = t.pageX, Object(T.a)(this.kc, pt.PreventSelect), Object(T.a)(this.fe.document.body, pt.PreventSelect), this.fe.document.addEventListener('mousemove', this._c), this.fe.document.addEventListener('mouseup', this.Ac); + }, this._c = t => { + const i = this.Wn.horizontal ? t.pageX - this.jc : t.pageY - this.Sc; + this.Sc = t.pageY, this.jc = t.pageX, Object(T.M)(this.fe, () => { + this.Wn.horizontal ? this.Ic.scrollLeft += i / this.Cc : this.Ic.scrollTop += i / this.Cc; + }); + }, this.Ac = t => { + Object(T.I)(this.kc, pt.PreventSelect), Object(T.I)(this.fe.document.body, pt.PreventSelect), this.fe.document.removeEventListener('mousemove', this._c), this.fe.document.removeEventListener('mouseup', this.Ac); + }, this.Tc = t => { + if (!this.Wn.horizontal) + return; + const i = t.deltaMode ? dt * (t.deltaY < 0 ? -1 : 1) : t.deltaY, e = lt * (Math.floor(i) / 33), s = this.Oc + e; + s >= -1 * this.kc.clientWidth && s <= this.Ic.scrollWidth - this.kc.clientWidth && (this.Oc = s), Object(T.M)(this.fe, () => { + return this.Ic.scrollLeft = this.Oc; + }); + }, this.Pc = () => { + clearTimeout(this.Mc), this.Mc = setTimeout(() => { + this.Ec(); + }, ft); + }, this.Ec = () => { + const t = this.Wn.horizontal ? this.Ic.scrollWidth : this.Ic.scrollHeight, i = this.Wn.horizontal ? this.wc.clientWidth : this.wc.clientHeight; + this.Cc = i / t; + const e = -1 * (this.wc.clientWidth - (this.kc.clientWidth || ct) - ut), s = this.wc.clientHeight - this.kc.clientHeight - ut; + Object(T.M)(this.fe, () => { + if (this.Cc >= 1) + Object(T.u)(this.kc); + else { + if (Object(T.O)(this.kc), this.Wn.horizontal) + return void Object(T.N)(this.kc, { + width: `${ Math.max(100 * this.Cc, 10) }%`, + height: '', + top: `${ s }px`, + right: '', + left: `${ this.Ic.scrollLeft / t * 100 }%` + }); + Object(T.N)(this.kc, { + width: '', + height: `${ Math.max(100 * this.Cc, 10) }%`, + top: `${ this.Ic.scrollTop / t * 100 }%`, + right: `${ e }px`, + left: '' + }); + } + }); + }, this.fe = Object(T.s)(t), !this.fe) + throw new Error('window was not found'); + this.Lc(), this.kc.addEventListener('mousedown', this.xc), this.Wn.overrideNativeHorizontalScroll && this.Ic.addEventListener('wheel', this.Tc, { passive: !0 }), this.fe.addEventListener('resize', this.Pc), this.Ic.addEventListener('scroll', this.Ec), this.Ic.addEventListener('mouseenter', this.Ec), Object(T.a)(this.wc, pt.MainContainer, this.Wn.horizontal ? pt.Horizontal : void 0, this.Wn.showOnHover ? pt.ShowOnHover : void 0), this.Ec(); + const e = Object(T.k)(this.wc, this.fe); + '0px' === e.height && '0px' !== e.maxHeight && Object(T.N)(this.wc, { height: e.maxHeight }); + } + Lc() { + for (this.kc = Object(T.f)(``, this.fe), this.Rc = Object(T.f)(``, this.fe), this.Ic = Object(T.f)(``, this.fe), this.Rc.appendChild(this.Ic); this.wc.firstChild;) + this.Ic.appendChild(this.wc.firstChild); + this.wc.appendChild(this.Rc), this.wc.insertAdjacentElement('beforeend', this.kc); + } + destroy() { + for (this.fe.document.removeEventListener('mousemove', this._c), this.fe.document.removeEventListener('mouseup', this.Ac), this.kc.removeEventListener('mousedown', this.xc), this.Ic.removeEventListener('wheel', this.Tc), this.fe.removeEventListener('resize', this.Pc), this.Ic.removeEventListener('scroll', this.Ec), this.Ic.removeEventListener('mouseenter', this.Ec), Object(T.J)(this.kc); this.Ic.firstChild;) + this.wc.appendChild(this.Ic.firstChild); + Object(T.J)(this.Rc), Object(T.I)(this.wc, pt.MainContainer, pt.Horizontal, pt.ShowOnHover); + } + } + const vt = t => { + return t.clientHeight || t.getBoundingClientRect().height || 0; + }, mt = t => { + return t.clientWidth || t.getBoundingClientRect().width || 0; + }, gt = (t, i, e = (() => { + return !1; + })()) => { + const s = t.offsetTop, n = ((t, i) => { + return (parseInt(i.getMarginTopPropertyValue(t), 10) || 0) + (parseInt(i.getMarginBottomPropertyValue(t), 10) || 0); + })(t, i), r = vt(t), h = vt(t.parentElement); + let a = s; + if (e) { + const t = Math.floor(h / (r + n)), i = Math.floor(t / 2); + a = Math.max(s - i * (r + n), 0); + } + t.parentElement.scrollTop = a; + }, yt = (t, i, e = (() => { + return !1; + })()) => { + const s = t.offsetLeft, n = ((t, i) => { + return (parseInt(i.getMarginLeftPropertyValue(t), 10) || 0) + (parseInt(i.getMarginRightPropertyValue(t), 10) || 0); + })(t, i), r = mt(t), h = mt(t.parentElement); + let a = s; + if (e) { + const t = Math.floor(h / (r + n)), i = Math.floor(t / 2); + a = Math.max(s - i * (r + n), 0); + } + t.parentElement.scrollLeft = a; + }; + class wt extends o.a { + constructor(t, i, e, s, n, r, h, a, o) { + super(), this.mediator = t, this.mr = i, this.rc = e, this.hc = s, this.Bc = n, this.Dc = r, this.Fc = h, this.Vc = a, this.Uc = [], this.$c = [], this.Nc = null, this.Hc = 0, this.qc = Object(T.p)(this.Bc), this.zc = Object(T.j)(this.Bc); + const c = this.Fc === M.ProtoGalleryStyleMode.Detailed ? d.o.StyleDetailed : d.o.StyleVisual; + if (Object(T.a)(this.Bc, c), this.Fc === M.ProtoGalleryStyleMode.Detailed && (this.Bc.innerHTML = `${ K }`), this.Wc = e.createElementByString(``), this.Bc.appendChild(this.Wc), this.Fc === M.ProtoGalleryStyleMode.Detailed) { + const t = e.createElementByString(``); + this.Bc.appendChild(t); + } + this.Gc(o); + } + start() { + this.Jc(), this.Qc(); + } + onResize(t) { + this.Xc && (this.Xc.updateWidth(t), this.Yc(), this.Kc()); + } + setCurrentIndex(t) { + this.Hc = t, this.Uc.forEach((i, e) => { + return i.card.setActiveState(t === e); + }), this.Kc(); + } + Gc(t) { + t.forEach((t, i) => { + const e = this.Zc(i); + this.Wc.appendChild(e.getContainer()), this.Uc.push({ + card: e, + videoSource: t + }), this.subscribe(J[J.CardClicked], e, ({payload: t}) => { + return this.tu(t); + }), this.relay(ht.a[ht.a.Scroll], e, this, this.mediator); + }); + } + Kc() { + if (Object(l.h)(this.$c)) + return; + const t = this.Uc[this.Hc].card.getContainer(); + this.Vc === M.ProtoGalleryOrientationEnum.Landscape ? gt(t, this.rc, !0) : yt(t, this.rc, !0); + } + Zc(t) { + const i = this.rc.createElementByString(``); + return new ot(this, this.mr, this.rc, this.hc, { + id: t, + style: this.Fc, + $slot: i, + titleFont: this.qc, + bodyFont: this.zc + }); + } + tu(t) { + this.mediator.publish(this, A.ChangeVideo, { payload: { videoIndex: t } }); + } + Jc() { + this.Uc.forEach(t => { + t.videoSource.getMetadata(i => { + t.card.setCardData(i), t.card.clampLines(); + }); + }); + } + iu() { + this.$c.forEach(t => { + this.unsubscribeAll(t), this.Wc.removeChild(t.getContainer()); + }), this.$c = []; + } + eu() { + const t = this.Vc === M.ProtoGalleryOrientationEnum.Portrait ? this.Wc.clientWidth : this.Wc.clientHeight, i = this.Uc[0].card.getContainer(), e = this.Vc === M.ProtoGalleryOrientationEnum.Portrait ? i.clientWidth : i.clientHeight, s = Math.ceil(t / e) + 1 - (this.Uc.length - 1); + if (s > this.$c.length - 1) + for (let t = 0; t <= s; t++) { + const i = this.Zc(t); + this.$c.push(i), this.relay(ht.a[ht.a.Scroll], i, this, this.mediator), this.Wc.appendChild(i.getContainer()); + } + } + Yc() { + this.su() ? (this.iu(), this.nu()) : (this.ru(), this.eu()); + } + nu() { + null === this.Nc && (this.Nc = new bt(this.Wc, { horizontal: this.Vc === M.ProtoGalleryOrientationEnum.Portrait }), Object(T.a)(this.Wc, d.h.HasCustomScrollbar)); + } + ru() { + null !== this.Nc && (this.Nc.destroy(), this.Nc = null, Object(T.I)(this.Wc, d.h.HasCustomScrollbar)); + } + su() { + const t = this.Uc[this.Uc.length - 1].card.getContainer(); + return this.Vc === M.ProtoGalleryOrientationEnum.Landscape ? t.offsetTop + t.clientHeight > this.Wc.clientHeight : t.offsetLeft + t.clientWidth > this.Wc.clientWidth; + } + Qc() { + const t = this.hu(); + this.Xc = new P(this.Bc, this.Dc, t, d.r); + } + hu() { + return G[this.Vc][this.Fc]; + } + } + var Ot, xt, St = e(18), jt = e(38), kt = e(24); + !function (t) { + t.enter = 'enterFullscreen', t.exit = 'exitFullscreen'; + }(Ot || (Ot = {})); + class _t { + constructor(t, i, e, s) { + if (this.mediator = t, this.rc = i, this.Zn = s, this.au = !1, this.ou = 1000, this.cu = !0, this.uu = !1, this.lu = () => { + this.au && this.du(); + }, this.fu = t => { + this.au ? null !== this.fullscreenElement ? this.du() : this.pu() : this.mediator.publish(this, Ot.exit); + }, this.pu = () => { + this.uu = !1, this.bu.reject(), this.au = !1, clearTimeout(this.vu); + }, this.mu = s && s === St.b.Ios ? e.getElementsByTagName('video')[0] : e, !this.mu) + throw new Error('element is missing'); + try { + const t = this.gu(); + if (null == t) + return void (this.cu = !1); + this.yu = t.keys, this.wu = t.name, this.Ou(); + } catch (t) { + this.cu = !1, Object(n.a)({ + message: 'Fullscreen init failed', + exception: t.message, + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + } + gu() { + let t; + return t = this.Zn === St.b.Ios ? this.rc.getFullscreenKeys(this.mu) : this.rc.getFullscreenKeys(); + } + get fullscreenElement() { + return this.rc.getDocumentProperty(this.yu.fullscreenElement); + } + get fullscreenEnabled() { + return this.rc.getDocumentProperty(this.yu.fullscreenEnabled); + } + enterFullScreen() { + if (this.cu) { + this.bu = new jt.a(), this.au = !0, clearTimeout(this.vu), this.vu = setTimeout(this.pu, this.ou); + try { + this.mu[this.yu.requestFullscreen](); + } catch (t) { + this.pu(); + } + return this.bu.promise; + } + } + exitFullScreen() { + try { + this.rc.exitFullscreen(this.yu.exitFullscreen, this.Zn === St.b.Ios ? this.mu : void 0); + } catch (t) { + Object(n.a)({ + message: 'fullscreen_exit', + exception: t.message, + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.WARNING + }); + } + this.uu = !1; + } + Ou() { + this.wu === kt.d.Moz || this.wu === kt.d.Ms ? (this.rc.addEventListenerOnGlobal(this.yu.fullscreenchange, this.fu), this.rc.addEventListenerOnGlobal(this.yu.fullscreenerror, this.pu)) : (this.mu.addEventListener(this.yu.fullscreenchange, this.fu), this.mu.addEventListener(this.yu.fullscreenerror, this.pu)), this.Zn === St.b.Ios && (this.mu.addEventListener('webkitbeginfullscreen', this.lu), this.mu.addEventListener('webkitendfullscreen', this.fu)); + } + xu() { + this.wu === kt.d.Moz || this.wu === kt.d.Ms ? (this.rc.removeEventListenerOnGlobal(this.yu.fullscreenchange, this.fu), this.rc.removeEventListenerOnGlobal(this.yu.fullscreenerror, this.pu)) : (this.mu.removeEventListener(this.yu.fullscreenchange, this.fu), this.mu.removeEventListener(this.yu.fullscreenerror, this.pu)), this.Zn === St.b.Ios && (this.mu.removeEventListener('webkitbeginfullscreen', this.lu), this.mu.removeEventListener('webkitendfullscreen', this.fu)); + } + du() { + this.uu = !0, this.mediator.publish(this, Ot.enter), this.bu.resolve(), this.au = !1, clearTimeout(this.vu); + } + get isFullscreen() { + return this.uu; + } + destroy() { + this.isFullscreen && this.exitFullScreen(), this.xu(), this.bu && this.bu.isPending && this.bu.reject(); + } + } + !function (t) { + t[t.Play = 0] = 'Play', t[t.Pause = 1] = 'Pause', t[t.Replay = 2] = 'Replay', t[t.Volume = 3] = 'Volume', t[t.Mute = 4] = 'Mute', t[t.Unmute = 5] = 'Unmute', t[t.Seek = 6] = 'Seek', t[t.DraggingStart = 7] = 'DraggingStart', t[t.DraggingStopped = 8] = 'DraggingStopped', t[t.SeekingStart = 9] = 'SeekingStart', t[t.SeekingStopped = 10] = 'SeekingStopped', t[t.Expand = 11] = 'Expand', t[t.Collapse = 12] = 'Collapse', t[t.Quality = 13] = 'Quality', t[t.Close = 14] = 'Close', t[t.Next = 15] = 'Next', t[t.Prev = 16] = 'Prev', t[t.Settings = 17] = 'Settings', t[t.CaptionOn = 18] = 'CaptionOn', t[t.CaptionOff = 19] = 'CaptionOff', t[t.CaptionUpdate = 20] = 'CaptionUpdate', t[t.VolumeHoverStart = 21] = 'VolumeHoverStart', t[t.VolumeHoverStopped = 22] = 'VolumeHoverStopped', t[t.OverlayClick = 23] = 'OverlayClick', t[t.UIHideStart = 24] = 'UIHideStart', t[t.UIShowStart = 25] = 'UIShowStart', t[t.UIEndShowHide = 26] = 'UIEndShowHide', t[t.AboutClick = 27] = 'AboutClick', t[t.ContextClick = 28] = 'ContextClick', t[t.SettingsMenu = 29] = 'SettingsMenu', t[t.HoverStart = 30] = 'HoverStart', t[t.HoverEnd = 31] = 'HoverEnd', t[t.StateChanged = 32] = 'StateChanged', t[t.RebindComponent = 33] = 'RebindComponent', t[t.SkipAd = 34] = 'SkipAd', t[t.LogoClicked = 35] = 'LogoClicked', t[t.ContextMenuOpen = 36] = 'ContextMenuOpen', t[t.ContextMenuClose = 37] = 'ContextMenuClose'; + }(xt || (xt = {})); + var At, It, Ct, Tt = e(13), Pt = e(3); + !function (t) { + t.EnterStart = 'enterStart', t.EnterStop = 'enterStop', t.ExitStart = 'exitStart', t.ExitStop = 'exitStop'; + }(At || (At = {})), function (t) { + t[t.DirectionIn = 0] = 'DirectionIn', t[t.DirectionOut = 1] = 'DirectionOut', t[t.FadeIn = 2] = 'FadeIn'; + }(It || (It = {})), function (t) { + t.Float = 'float', t.Embed = 'embed'; + }(Ct || (Ct = {})); + const Mt = 400, Et = 1000, Lt = 20, Rt = 0.5; + class Bt { + constructor(t, i, e, s, n, r = (() => { + return 0; + })()) { + this.Su = t, this.Wn = i, this.Lo = e, this.Dc = s, this.js = n, this.ju = r, this.ku = 0, this._u = void 0, this.Au = null, this.Iu = !1, this.Cu = 500, this.Tu = () => { + this._u && this.Pu(); + }, this.Mu = () => { + if (this.Wn.width = this.Eu.clientWidth, this.Lu(), this._u) { + const t = !1; + this.Ru(t); + } + }, this.Lu = () => { + this.Bu() ? !this.Du || this._u || this.Iu ? this.Fu() : this.Vu() : this._u && this.Uu(); + }, this.$u = t => { + if (this.Nu(t.propertyName)) + switch (this.transitionState) { + case It.DirectionIn: + this.transitionState = void 0, this.Hu(); + break; + case It.DirectionOut: + this.transitionState = void 0, this.qu(); + break; + case It.FadeIn: + this.transitionState = void 0, this.zu(); + } + }, this.Wu(); + } + get transitionState() { + return this.Gu; + } + set transitionState(t) { + this.Gu === It.FadeIn && this.Ju(d.m.FadeInBase, d.m.FadeIn), this.Gu = t; + } + Qu(...t) { + Object(T.a)(this.Lo, ...t); + } + Ju(...t) { + Object(T.I)(this.Lo, ...t); + } + Fu() { + this.Dc !== h.ProtoDeviceType.Smartphone && (this.Lo.style.width = `${ this.Wn.width }px`); + const t = this.Lo.getBoundingClientRect().width; + this.Lo.style.height = this.Wn.getHeight(t); + } + Xu() { + return Object(l.g)(this.Dc, this.Wn.floatingDeviceMode); + } + Yu() { + this.js.addEventListenerOnGlobal('scroll', this.Tu); + } + Pu() { + this.Eu && (this.Ku(), this.Zu < this.Wn.floatingGutterY ? this.tl(this.Wn.floatingGutterY) : this.tl(this.Zu)); + } + il() { + this.Eu = this.js.querySelector(this.Wn.pageElement), this.Eu && (clearInterval(this.Au), this.Wn.width = this.Eu.clientWidth, this.Lu(), this.Su.on(this.Eu, this.Mu), this.Su.on(this.js.getGlobalClosestTop().topFrame.document.body, this.Mu)); + } + Ku() { + switch (this.Wn.appendLocation) { + case h.ProtoFloatingAppendLocationEnum.Above: + this.Zu = this.Eu.getBoundingClientRect().top - this.Lo.offsetHeight - this.Wn.floatingYAxisPadding; + break; + case h.ProtoFloatingAppendLocationEnum.Below: + this.Zu = this.Eu.getBoundingClientRect().top + this.Eu.offsetHeight + this.Wn.floatingYAxisPadding; + break; + case h.ProtoFloatingAppendLocationEnum.Within: + this.Zu = this.Eu.getBoundingClientRect().top; + } + } + el() { + this.Au = setInterval(() => { + this.il(); + }, this.Cu), this.il(); + } + sl() { + return this.Wn.floatingPosition === h.ProtoFloatingFixedPositionMode.Element; + } + Nu(t) { + switch (this.transitionState) { + case It.DirectionIn: + case It.DirectionOut: + if ('right' === t || 'left' === t) + return !0; + break; + case It.FadeIn: + if ('opacity' === t) + return !0; + } + return !1; + } + nl() { + this.Lo.style.top = '', this.Lo.style.bottom = '', this.Lo.style.left = '', this.Lo.style.right = '', this.Lo.style.width = '', this.Lo.style.height = '', this.Lo.style.transform = ''; + } + qu() { + this._u = !1, this.Ju(d.n.MainClass, d.n.TransitionClass, this.Wn.positionClass), this.nl(), this.rl(); + } + hl() { + this.Wn.isPositionedTop ? (this.Lo.style.top = `${ this.Wn.floatingGutterY }px`, this.Lo.style.bottom = 'auto') : this.Wn.isPositionedBottom && (this.Lo.style.top = 'auto', this.Lo.style.bottom = `${ this.Wn.floatingGutterY }px`); + } + tl(t) { + this.Lo.style.transform = `translateY(${ t }px)`; + } + al(t) { + t ? this.Qu(d.n.TransitionClass) : this.Ju(d.n.TransitionClass); + } + ol(t, i = (() => { + return !1; + })(), e = (() => { + return !1; + })()) { + this.al(i), e || this.Wn.isPositionedLeft ? (this.Lo.style.left = `${ t }px`, this.Lo.style.right = 'auto') : (this.Lo.style.left = 'auto', this.Lo.style.right = `${ t }px`); + } + Bu() { + return Object(T.s)(this.Lo).document.body.getBoundingClientRect().width >= this.ju; + } + Vu() { + if (this.Bu() && (!this.sl() || this.Eu && (!this.Eu || 0 !== this.Eu.clientWidth))) + if (this._u = !0, this.transitionState = It.DirectionIn, this.Qu(d.n.MainClass, this.Wn.positionClass), this.Lu(), this.sl() ? (this.Lo.style.top = '0px', this.cl(), this.ol(this.ku, !1, !0), this.Pu()) : (this.hl(), this.ol(this.ku)), this.ul(), Object(T.i)(this.Lo), this.Eu) { + const t = !0; + this.Ru(t); + } else + this.ol(this.Wn.floatingGutterX, !0); + } + cl() { + this.Eu && (this.js.getElementCoordinates(this.Eu).clientX < this.js.getBodyDimensions().width / 2 ? (this.Wn.isPositionedLeft = !0, this.Wn.isPositionedRight = !1) : (this.Wn.isPositionedLeft = !1, this.Wn.isPositionedRight = !0), this.Wu()); + } + Wu() { + this.sl() && this.Wn.isPositionedRight ? this.ku = this.js.getBodyDimensions().width + (this.Wn.floatingWidth || Et) + Lt : this.ku = -((this.Wn.floatingWidth || Et) + Lt); + } + Ru(t) { + let i; + this.cl(), i = this.js.getElementCoordinates(this.Eu).clientX, this.Wn.isPositionedLeft ? i += this.Wn.floatingGutterX : i -= this.Wn.floatingGutterX, this.ol(i, t, !0); + } + Uu(t = (() => { + return !0; + })()) { + let i; + t && (this.transitionState = It.DirectionOut), this.ll(), i = this.sl(), this.ol(this.ku, t, i), t || this.qu(); + } + dl() { + this.Lo.addEventListener('transitionend', this.$u), this.Su.on(this.Lo, this.Lu), this.sl() && (this.el(), this.Yu()); + } + fl() { + this.Su.off(this.Lo, this.Lu), this.Lo.removeEventListener('transitionend', this.$u), this.Eu && (this.Su.off(this.Eu, this.Mu), this.Su.off(this.js.getGlobalClosestTop().topFrame.document.body, this.Mu), this.js.removeEventListenerOnGlobal('scroll', this.Tu), clearInterval(this.Au)); + } + get isInFloating() { + return this._u; + } + } + class Dt extends Bt { + constructor(t, i, e, s, n, r, a, o = (() => { + return 0; + })()) { + super(e, n, s, r, a, o), this.mediator = t, this.pl = i, this.bl = !0, this.vl = !0, this.ml = !1, this.Du = !1, this.gl = t => { + const i = this.pl.getIsTabInFocus(); + t && this.isInFloating && (this.Du = !1, this.Uu()), this.bl && this.Wn.floatingMode === h.ProtoPlayerFloatingMode.AfterInView && t && (this.bl = !1), !t && !this.bl && this.vl && i && (this.Du = !0, super.Vu()); + }, this.Fu = () => { + this.isInFloating && super.Fu(); + }; + } + Uu() { + const t = !this.ml; + super.Uu(t); + } + ll() { + this.mediator.publish(this, At.ExitStart); + } + rl() { + this.yl(); + } + ul() { + this.mediator.publish(this, At.EnterStart); + } + yl() { + this.transitionState = It.FadeIn, this.Ju(d.m.FadeIn), this.Qu(d.m.FadeInBase), Object(T.i)(this.Lo), this.Qu(d.m.FadeIn); + } + Hu() { + this.mediator.publish(this, At.EnterStop); + } + zu() { + this.Ju(d.m.FadeInBase, d.m.FadeIn), this.mediator.publish(this, At.ExitStop), this.Iu && super.fl(); + } + wl() { + this.pl.on(this.Lo.parentElement, this.gl, { threshold: Rt }); + } + Ol() { + this.pl.off(this.Lo.parentElement, this.gl); + } + start() { + this.Xu() && (super.dl(), this.Wn.floatingMode === h.ProtoPlayerFloatingMode.OnPageLoad && (this.bl = !1), this.wl(), this.gl(this.pl.check({ + element: this.Lo.parentElement, + threshold: Rt + }))); + } + canFloat() { + return this.Xu() && this.Wn.floatingMode !== h.ProtoPlayerFloatingMode.Off; + } + destroy() { + this.isInFloating ? (this.qu(), this.Iu = !0) : super.fl(), this.Ol(); + } + get enabled() { + return this.vl; + } + set enabled(t) { + this.vl = t; + } + fullscreenStateChange(t) { + this.ml = t, t ? this.Ol() : this.wl(), this.gl(t); + } + } + class Ft extends Bt { + constructor(t, i, e, s, n, r, h = (() => { + return 0; + })()) { + super(i, s, e, n, r, h), this.mediator = t, this.Du = !0; + } + ul() { + } + Hu() { + this.mediator.publish(this, At.EnterStop); + } + ll() { + } + rl() { + } + zu() { + } + start() { + this.Xu() && (super.dl(), super.Vu()); + } + } + const Vt = { + DetachedFromDom: 'detachedFromDom', + AdSlotResized: 'adSlotResized' + }, Ut = { + DetachedFromDom: 'detachedFromDom', + AdsEnabled: 'adsEnabled' + }, $t = { + MidRollCapped: 'midRollCapped', + TotalAdBreakLengthExpired: 'totalAdBreakLengthExpired', + EnableAds: 'enableAds', + DisableAds: 'disableAds', + ForceStopAdSlot: 'ForceStopAdSlot', + ForceStopAdPod: 'ForceStopAdPod', + AdOpportunity: 'adOpportunity', + AdPodRemainingTime: 'AdPodRemainingTime' + }; + var Nt, Ht = e(26), qt = e(11); + !function (t) { + t[t.FirstQuartile = 0] = 'FirstQuartile', t[t.SecondQuartile = 1] = 'SecondQuartile', t[t.ThirdQuartile = 2] = 'ThirdQuartile', t[t.FourthQuartile = 3] = 'FourthQuartile'; + }(Nt || (Nt = {})); + var zt = function (t, i) { + return (zt = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, i) { + t.__proto__ = i; + } || function (t, i) { + for (var e in i) + i.hasOwnProperty(e) && (t[e] = i[e]); + })(t, i); + }; + function Wt(t, i) { + function e() { + this.constructor = t; + } + zt(t, i), t.prototype = null === i ? Object.create(i) : (e.prototype = i.prototype, new e()); + } + function Gt(t) { + return 'function' == typeof t; + } + var Jt = !1, Qt = { + Promise: void 0, + set useDeprecatedSynchronousErrorHandling(t) { + t && new Error().stack; + Jt = t; + }, + get useDeprecatedSynchronousErrorHandling() { + return Jt; + } + }; + function Xt(t) { + setTimeout(function () { + throw t; + }, 0); + } + var Yt = { + closed: !0, + next: function (t) { + }, + error: function (t) { + if (Qt.useDeprecatedSynchronousErrorHandling) + throw t; + Xt(t); + }, + complete: function () { + } + }, Kt = function () { + return Array.isArray || function (t) { + return t && 'number' == typeof t.length; + }; + }(); + function Zt(t) { + return null !== t && 'object' == typeof t; + } + var ti = function () { + function t(t) { + return Error.call(this), this.message = t ? t.length + ' errors occurred during unsubscription:\n' + t.map(function (t, i) { + return i + 1 + ') ' + t.toString(); + }).join('\n ') : '', this.name = 'UnsubscriptionError', this.errors = t, this; + } + return t.prototype = Object.create(Error.prototype), t; + }(), ii = function () { + function t(t) { + this.closed = !1, this.Sl = null, this.jl = null, t && (this.kl = !0, this.Or = t); + } + return t.prototype.unsubscribe = function () { + var i; + if (!this.closed) { + var e = this.Sl, s = this.kl, n = this.Or, r = this.jl; + if (this.closed = !0, this.Sl = null, this.jl = null, e instanceof t) + e.remove(this); + else if (null !== e) + for (var h = 0; h < e.length; ++h) { + e[h].remove(this); + } + if (Gt(n)) { + s && (this.Or = void 0); + try { + n.call(this); + } catch (t) { + i = t instanceof ti ? ei(t.errors) : [t]; + } + } + if (Kt(r)) { + h = -1; + for (var a = r.length; ++h < a;) { + var o = r[h]; + if (Zt(o)) + try { + o.unsubscribe(); + } catch (t) { + i = i || [], t instanceof ti ? i = i.concat(ei(t.errors)) : i.push(t); + } + } + } + if (i) + throw new ti(i); + } + }, t.prototype.add = function (i) { + var e = i; + if (!i) + return t.EMPTY; + switch (typeof i) { + case 'function': + e = new t(i); + case 'object': + if (e === this || e.closed || 'function' != typeof e.unsubscribe) + return e; + if (this.closed) + return e.unsubscribe(), e; + if (!(e instanceof t)) { + var s = e; + (e = new t()).jl = [s]; + } + break; + default: + throw new Error('unrecognized teardown ' + i + ' added to Subscription.'); + } + var n = e.Sl; + if (null === n) + e.Sl = this; + else if (n instanceof t) { + if (n === this) + return e; + e.Sl = [ + n, + this + ]; + } else { + if (-1 !== n.indexOf(this)) + return e; + n.push(this); + } + var r = this.jl; + return null === r ? this.jl = [e] : r.push(e), e; + }, t.prototype.remove = function (t) { + var i = this.jl; + if (i) { + var e = i.indexOf(t); + -1 !== e && i.splice(e, 1); + } + }, t.EMPTY = function (t) { + return t.closed = !0, t; + }(new t()), t; + }(); + function ei(t) { + return t.reduce(function (t, i) { + return t.concat(i instanceof ti ? i.errors : i); + }, []); + } + var si = function () { + return 'function' == typeof Symbol ? Symbol('rxSubscriber') : '@@rxSubscriber_' + Math.random(); + }(), ni = function (t) { + function i(e, s, n) { + var r = t.call(this) || this; + switch (r.syncErrorValue = null, r.syncErrorThrown = !1, r.syncErrorThrowable = !1, r.isStopped = !1, arguments.length) { + case 0: + r.destination = Yt; + break; + case 1: + if (!e) { + r.destination = Yt; + break; + } + if ('object' == typeof e) { + e instanceof i ? (r.syncErrorThrowable = e.syncErrorThrowable, r.destination = e, e.add(r)) : (r.syncErrorThrowable = !0, r.destination = new ri(r, e)); + break; + } + default: + r.syncErrorThrowable = !0, r.destination = new ri(r, e, s, n); + } + return r; + } + return Wt(i, t), i.prototype[si] = function () { + return this; + }, i.create = function (t, e, s) { + var n = new i(t, e, s); + return n.syncErrorThrowable = !1, n; + }, i.prototype.next = function (t) { + this.isStopped || this._l(t); + }, i.prototype.error = function (t) { + this.isStopped || (this.isStopped = !0, this.Al(t)); + }, i.prototype.complete = function () { + this.isStopped || (this.isStopped = !0, this.Il()); + }, i.prototype.unsubscribe = function () { + this.closed || (this.isStopped = !0, t.prototype.unsubscribe.call(this)); + }, i.prototype._l = function (t) { + this.destination.next(t); + }, i.prototype.Al = function (t) { + this.destination.error(t), this.unsubscribe(); + }, i.prototype.Il = function () { + this.destination.complete(), this.unsubscribe(); + }, i.prototype.Cl = function () { + var t = this.Sl; + return this.Sl = null, this.unsubscribe(), this.closed = !1, this.isStopped = !1, this.Sl = t, this; + }, i; + }(ii), ri = function (t) { + function i(i, e, s, n) { + var r, h = t.call(this) || this; + h.Tl = i; + var a = h; + return Gt(e) ? r = e : e && (r = e.next, s = e.error, n = e.complete, e !== Yt && (Gt((a = Object.create(e)).unsubscribe) && h.add(a.unsubscribe.bind(a)), a.unsubscribe = h.unsubscribe.bind(h))), h.Pl = a, h._l = r, h.Al = s, h.Il = n, h; + } + return Wt(i, t), i.prototype.next = function (t) { + if (!this.isStopped && this._l) { + var i = this.Tl; + Qt.useDeprecatedSynchronousErrorHandling && i.syncErrorThrowable ? this.Ml(i, this._l, t) && this.unsubscribe() : this.El(this._l, t); + } + }, i.prototype.error = function (t) { + if (!this.isStopped) { + var i = this.Tl, e = Qt.useDeprecatedSynchronousErrorHandling; + if (this.Al) + e && i.syncErrorThrowable ? (this.Ml(i, this.Al, t), this.unsubscribe()) : (this.El(this.Al, t), this.unsubscribe()); + else if (i.syncErrorThrowable) + e ? (i.syncErrorValue = t, i.syncErrorThrown = !0) : Xt(t), this.unsubscribe(); + else { + if (this.unsubscribe(), e) + throw t; + Xt(t); + } + } + }, i.prototype.complete = function () { + var t = this; + if (!this.isStopped) { + var i = this.Tl; + if (this.Il) { + var e = function () { + return t.Il.call(t.Pl); + }; + Qt.useDeprecatedSynchronousErrorHandling && i.syncErrorThrowable ? (this.Ml(i, e), this.unsubscribe()) : (this.El(e), this.unsubscribe()); + } else + this.unsubscribe(); + } + }, i.prototype.El = function (t, i) { + try { + t.call(this.Pl, i); + } catch (t) { + if (this.unsubscribe(), Qt.useDeprecatedSynchronousErrorHandling) + throw t; + Xt(t); + } + }, i.prototype.Ml = function (t, i, e) { + if (!Qt.useDeprecatedSynchronousErrorHandling) + throw new Error('bad call'); + try { + i.call(this.Pl, e); + } catch (i) { + return Qt.useDeprecatedSynchronousErrorHandling ? (t.syncErrorValue = i, t.syncErrorThrown = !0, !0) : (Xt(i), !0); + } + return !1; + }, i.prototype.Or = function () { + var t = this.Tl; + this.Pl = null, this.Tl = null, t.unsubscribe(); + }, i; + }(ni); + var hi = function () { + return 'function' == typeof Symbol && Symbol.observable || '@@observable'; + }(); + function ai(t) { + return t; + } + function oi(t) { + return 0 === t.length ? ai : 1 === t.length ? t[0] : function (i) { + return t.reduce(function (t, i) { + return i(t); + }, i); + }; + } + var ci = function () { + function t(t) { + this.Ll = !1, t && (this.Rl = t); + } + return t.prototype.lift = function (i) { + var e = new t(); + return e.source = this, e.operator = i, e; + }, t.prototype.subscribe = function (t, i, e) { + var s = this.operator, n = function (t, i, e) { + if (t) { + if (t instanceof ni) + return t; + if (t[si]) + return t[si](); + } + return t || i || e ? new ni(t, i, e) : new ni(Yt); + }(t, i, e); + if (s ? n.add(s.call(n, this.source)) : n.add(this.source || Qt.useDeprecatedSynchronousErrorHandling && !n.syncErrorThrowable ? this.Rl(n) : this.Bl(n)), Qt.useDeprecatedSynchronousErrorHandling && n.syncErrorThrowable && (n.syncErrorThrowable = !1, n.syncErrorThrown)) + throw n.syncErrorValue; + return n; + }, t.prototype.Bl = function (t) { + try { + return this.Rl(t); + } catch (i) { + Qt.useDeprecatedSynchronousErrorHandling && (t.syncErrorThrown = !0, t.syncErrorValue = i), !function (t) { + for (; t;) { + var i = t, e = i.closed, s = i.destination, n = i.isStopped; + if (e || n) + return !1; + t = s && s instanceof ni ? s : null; + } + return !0; + }(t) ? console.warn(i) : t.error(i); + } + }, t.prototype.forEach = function (t, i) { + var e = this; + return new (i = (ui(i)))(function (i, s) { + var n; + n = e.subscribe(function (i) { + try { + t(i); + } catch (t) { + s(t), n && n.unsubscribe(); + } + }, s, i); + }); + }, t.prototype.Rl = function (t) { + var i = this.source; + return i && i.subscribe(t); + }, t.prototype[hi] = function () { + return this; + }, t.prototype.pipe = function () { + for (var t = [], i = 0; i < arguments.length; i++) + t[i] = arguments[i]; + return 0 === t.length ? this : oi(t)(this); + }, t.prototype.toPromise = function (t) { + var i = this; + return new (t = (ui(t)))(function (t, e) { + var s; + i.subscribe(function (t) { + return s = t; + }, function (t) { + return e(t); + }, function () { + return t(s); + }); + }); + }, t.create = function (i) { + return new t(i); + }, t; + }(); + function ui(t) { + if (t || (t = Qt.Promise || Promise), !t) + throw new Error('no Promise impl found'); + return t; + } + var li = function (t) { + function i(i, e) { + var s = t.call(this, i, e) || this; + return s.scheduler = i, s.work = e, s.pending = !1, s; + } + return Wt(i, t), i.prototype.schedule = function (t, i) { + if (void 0 === i && (i = 0), this.closed) + return this; + this.state = t; + var e = this.id, s = this.scheduler; + return null != e && (this.id = this.recycleAsyncId(s, e, i)), this.pending = !0, this.delay = i, this.id = this.id || this.requestAsyncId(s, this.id, i), this; + }, i.prototype.requestAsyncId = function (t, i, e) { + return void 0 === e && (e = 0), setInterval(t.flush.bind(t, this), e); + }, i.prototype.recycleAsyncId = function (t, i, e) { + if (void 0 === e && (e = 0), null !== e && this.delay === e && !1 === this.pending) + return i; + clearInterval(i); + }, i.prototype.execute = function (t, i) { + if (this.closed) + return new Error('executing a cancelled action'); + this.pending = !1; + var e = this.Dl(t, i); + if (e) + return e; + !1 === this.pending && null != this.id && (this.id = this.recycleAsyncId(this.scheduler, this.id, null)); + }, i.prototype.Dl = function (t, i) { + var e = !1, s = void 0; + try { + this.work(t); + } catch (t) { + e = !0, s = !!t && t || new Error(t); + } + if (e) + return this.unsubscribe(), s; + }, i.prototype.Or = function () { + var t = this.id, i = this.scheduler, e = i.actions, s = e.indexOf(this); + this.work = null, this.state = null, this.pending = !1, this.scheduler = null, -1 !== s && e.splice(s, 1), null != t && (this.id = this.recycleAsyncId(i, t, null)), this.delay = null; + }, i; + }(function (t) { + function i(i, e) { + return t.call(this) || this; + } + return Wt(i, t), i.prototype.schedule = function (t, i) { + return void 0 === i && (i = 0), this; + }, i; + }(ii)), di = function () { + function t(i, e) { + void 0 === e && (e = t.now), this.SchedulerAction = i, this.now = e; + } + return t.prototype.schedule = function (t, i, e) { + return void 0 === i && (i = 0), new this.SchedulerAction(this, t).schedule(e, i); + }, t.now = function () { + return Date.now(); + }, t; + }(), fi = new (function (t) { + function i(e, s) { + void 0 === s && (s = di.now); + var n = t.call(this, e, function () { + return i.delegate && i.delegate !== n ? i.delegate.now() : s(); + }) || this; + return n.actions = [], n.active = !1, n.scheduled = void 0, n; + } + return Wt(i, t), i.prototype.schedule = function (e, s, n) { + return void 0 === s && (s = 0), i.delegate && i.delegate !== this ? i.delegate.schedule(e, s, n) : t.prototype.schedule.call(this, e, s, n); + }, i.prototype.flush = function (t) { + var i = this.actions; + if (this.active) + i.push(t); + else { + var e; + this.active = !0; + do { + if (e = t.execute(t.state, t.delay)) + break; + } while (t = i.shift()); + if (this.active = !1, e) { + for (; t = i.shift();) + t.unsubscribe(); + throw e; + } + } + }, i; + }(di))(li); + function pi(t, i) { + var e; + return void 0 === t && (t = 0), void 0 === i && (i = fi), (Kt(e = t) || !(e - parseFloat(e) + 1 >= 0) || t < 0) && (t = 0), i && 'function' == typeof i.schedule || (i = fi), new ci(function (e) { + return e.add(i.schedule(bi, t, { + subscriber: e, + counter: 0, + period: t + })), e; + }); + } + function bi(t) { + var i = t.subscriber, e = t.counter, s = t.period; + i.next(e), this.schedule({ + subscriber: i, + counter: e + 1, + period: s + }, s); + } + const vi = 100; + class mi { + static setTimeout(t, i = (() => { + return 0; + })()) { + return this.Fl || this.Vl(), this.Ul(t, i, !0); + } + static setInterval(t, i = (() => { + return 0; + })()) { + return this.Fl || this.Vl(), this.Ul(t, i, !1); + } + static clearTimeout(t) { + this.$l.delete(t); + } + static clearInterval(t) { + this.$l.delete(t); + } + static Vl() { + this.Fl = pi(vi), this.Fl.subscribe(() => { + return this.Nl(); + }); + } + static Hl(t) { + try { + t.callback(); + } catch (t) { + Object(n.a)({ + message: 'TimerService_error', + callStack: t.stack, + exception: t.message, + throttle: 1, + level: h.ProtoLoggingLevelEnum.INFO + }); + } + } + static Nl() { + const t = new Date().getTime(), i = []; + for (const [e, s] of this.$l) + t - s.startTime < s.duration * (s.intervalTimesCalled + 1) || (this.Hl(s), s.isTimeout ? i.push(e) : s.intervalTimesCalled++); + for (const t of i) + this.$l.delete(t); + } + static Ul(t, i, e) { + const s = ++this.ql; + return this.$l.set(s, { + startTime: new Date().getTime(), + isTimeout: e, + callback: t, + duration: i, + intervalTimesCalled: 0 + }), s; + } + } + mi.$l = new Map(), mi.ql = 0; + var gi, yi, wi = e(15), Oi = function () { + function t() { + return Error.call(this), this.message = 'object unsubscribed', this.name = 'ObjectUnsubscribedError', this; + } + return t.prototype = Object.create(Error.prototype), t; + }(), xi = function (t) { + function i(i, e) { + var s = t.call(this) || this; + return s.subject = i, s.subscriber = e, s.closed = !1, s; + } + return Wt(i, t), i.prototype.unsubscribe = function () { + if (!this.closed) { + this.closed = !0; + var t = this.subject, i = t.observers; + if (this.subject = null, i && 0 !== i.length && !t.isStopped && !t.closed) { + var e = i.indexOf(this.subscriber); + -1 !== e && i.splice(e, 1); + } + } + }, i; + }(ii), Si = function (t) { + function i(i) { + var e = t.call(this, i) || this; + return e.destination = i, e; + } + return Wt(i, t), i; + }(ni), ji = function (t) { + function i() { + var i = t.call(this) || this; + return i.observers = [], i.closed = !1, i.isStopped = !1, i.hasError = !1, i.thrownError = null, i; + } + return Wt(i, t), i.prototype[si] = function () { + return new Si(this); + }, i.prototype.lift = function (t) { + var i = new ki(this, this); + return i.operator = t, i; + }, i.prototype.next = function (t) { + if (this.closed) + throw new Oi(); + if (!this.isStopped) + for (var i = this.observers, e = i.length, s = i.slice(), n = 0; n < e; n++) + s[n].next(t); + }, i.prototype.error = function (t) { + if (this.closed) + throw new Oi(); + this.hasError = !0, this.thrownError = t, this.isStopped = !0; + for (var i = this.observers, e = i.length, s = i.slice(), n = 0; n < e; n++) + s[n].error(t); + this.observers.length = 0; + }, i.prototype.complete = function () { + if (this.closed) + throw new Oi(); + this.isStopped = !0; + for (var t = this.observers, i = t.length, e = t.slice(), s = 0; s < i; s++) + e[s].complete(); + this.observers.length = 0; + }, i.prototype.unsubscribe = function () { + this.isStopped = !0, this.closed = !0, this.observers = null; + }, i.prototype.Bl = function (i) { + if (this.closed) + throw new Oi(); + return t.prototype.Bl.call(this, i); + }, i.prototype.Rl = function (t) { + if (this.closed) + throw new Oi(); + return this.hasError ? (t.error(this.thrownError), ii.EMPTY) : this.isStopped ? (t.complete(), ii.EMPTY) : (this.observers.push(t), new xi(this, t)); + }, i.prototype.asObservable = function () { + var t = new ci(); + return t.source = this, t; + }, i.create = function (t, i) { + return new ki(t, i); + }, i; + }(ci), ki = function (t) { + function i(i, e) { + var s = t.call(this) || this; + return s.destination = i, s.source = e, s; + } + return Wt(i, t), i.prototype.next = function (t) { + var i = this.destination; + i && i.next && i.next(t); + }, i.prototype.error = function (t) { + var i = this.destination; + i && i.error && this.destination.error(t); + }, i.prototype.complete = function () { + var t = this.destination; + t && t.complete && this.destination.complete(); + }, i.prototype.Rl = function (t) { + return this.source ? this.source.subscribe(t) : ii.EMPTY; + }, i; + }(ji); + class _i { + constructor(t = (() => { + return 0; + })(), i = (() => { + return 1000; + })(), e = (() => { + return 1; + })()) { + this.timerDuration = t, this.zl = i, this.Wl = e, this.Gl = 0, this.Jl = null, this.Ql = !1, this.Yl = !1, this.Kl = new ji(), this.Zl = new ji(), this.td = new ji(), this.ed = [ + { + event: Nt.FirstQuartile, + quartile: 1 + }, + { + event: Nt.SecondQuartile, + quartile: 2 + }, + { + event: Nt.ThirdQuartile, + quartile: 3 + }, + { + event: Nt.FourthQuartile, + quartile: 4 + } + ], this.sd = null, this.nd = () => { + this.rd(), this.Kl.next(), this.hd(), this.od = new Date().getTime(); + }, t || this.disable(); + } + start() { + this.Yl = !0, null === this.Jl && this.ud(); + } + stop() { + this.Yl = !1, null !== this.Jl && (this.rd(), this.ld()); + } + reset(t) { + t && (this.timerDuration = t), this.Gl = 0, this.Ql = !1, this.sd = null, (null !== this.Jl || this.Yl) && (this.ld(), this.ud()); + } + get timeElapsed() { + return this.Gl; + } + get timeRemaining() { + return this.timerDuration - this.Gl; + } + disable() { + this.Ql = !0, this.ld(); + } + get onTimeUpdate() { + return this.Kl.asObservable(); + } + get onTimeElapsed() { + return this.Zl.asObservable(); + } + get onQuartile() { + return this.td.asObservable(); + } + rd() { + this.Gl += new Date().getTime() - this.od; + } + ud() { + this.Ql || (this.hd(), this.od = new Date().getTime(), this.Jl = mi.setInterval(this.nd, this.zl)); + } + ld() { + mi.clearInterval(this.Jl), this.Jl = null; + } + dd() { + this.disable(), this.Zl.next(), this.fd(this.Gl, this.timerDuration, this.Wl), this.Gl = 0; + } + hd() { + this.Gl / qt.f >= this.timerDuration / qt.f && this.dd(); + } + fd(t, i, e) { + const s = Object(wi.f)(t / qt.f, e); + this.pd(s, i); + } + pd(t, i) { + const e = Math.floor(Object(wi.e)(0, i, 0, 4, t)); + this.sd <= e && (this.ed.forEach(({ + event: t, + quartile: i + }) => { + i === e && this.td.next(t); + }), this.sd++); + } + } + function Ai(t = (() => { + return []; + })()) { + t.forEach(t => { + return t.unsubscribe(); + }); + } + !function (t) { + t[t.Unknown = 0] = 'Unknown', t[t.TimeoutBetweenAds = 1] = 'TimeoutBetweenAds'; + }(gi || (gi = {})); + class Ii extends o.a { + constructor(t, i, e, s) { + super(), this.mediator = t, this.controlData = e, this.app = s, this.bd = 0, this.vd = 0, this.gd = null, this.yd = new Map(), this.currentPlayerAdSlot = M.ProtoAdSlotsEnum.PreRoll, this.wd = { + stopped: !1, + viewability: !1, + inImpression: !1, + forceDisable: !1, + zeroDimension: !1, + isAppBackgrounded: !1, + inAppRecyclerViewViewability: !1 + }, this.firstAdBreakStarted = !1, this.Od = !1, this.viewabilityStateChanged(i), this.onResize(this.controlData.playerDimensions.width, this.controlData.playerDimensions.height), this.controlData.totalAdBreakLength && (this.xd = new _i(this.controlData.totalAdBreakLength), this.yd.set(this.xd, [this.xd.onTimeElapsed.subscribe(() => { + this.mediator.publish(this, $t.TotalAdBreakLengthExpired); + })])); + } + Sd() { + return this.vd >= this.controlData.numberOfMidRolls && -1 !== this.controlData.numberOfMidRolls; + } + jd(t) { + if (t) + return t.stop(), Ai(this.yd.get(t)), this.yd.delete(t), null; + } + kd() { + if (this.Od) { + this.Od = !1; + const t = { + [h.ProtoAdSlotsEnum.PreRoll]: h.ProtoAdBreakTypeEnum.PreRoll, + [h.ProtoAdSlotsEnum.MidRoll]: h.ProtoAdBreakTypeEnum.MidRoll, + [h.ProtoAdSlotsEnum.PostRoll]: h.ProtoAdBreakTypeEnum.PostRoll + }; + this.mediator.publish(this, $t.AdOpportunity, { payload: { adBreakType: t[this.currentPlayerAdSlot] } }); + } + this.mediator.publish(this, $t.EnableAds), this.xd && this.xd.start(); + } + canEnableAds() { + return this.wd.stopped || this.wd.viewability || this.wd.inImpression || this.wd.forceDisable || this.wd.zeroDimension || this.wd.isAppBackgrounded || this.wd.inAppRecyclerViewViewability ? { + enableAds: !1, + disableReason: gi.Unknown + } : this.currentPlayerAdSlot === M.ProtoAdSlotsEnum.MidRoll && this.Sd() ? { + enableAds: !1, + disableReason: gi.Unknown + } : this.currentPlayerAdSlot !== M.ProtoAdSlotsEnum.MidRoll && this.bd > 0 ? { + enableAds: !1, + disableReason: gi.Unknown + } : { + enableAds: !0, + disableReason: gi.Unknown + }; + } + toggleEnableAds() { + const t = this.canEnableAds(); + t.enableAds ? this.kd() : (this.mediator.publish(this, $t.DisableAds, { payload: t.disableReason }), this.xd && !this.wd.inImpression && this.xd.stop()); + } + startAds() { + this.wd.stopped = !1, this.toggleEnableAds(); + } + forceRecheck() { + this.toggleEnableAds(); + } + onAdImpression(t) { + this.currentPlayerAdSlot === M.ProtoAdSlotsEnum.MidRoll && (this.firstAdBreakStarted || (this.firstAdBreakStarted = !0)), this.wd.inImpression = !0, this.toggleEnableAds(), this._d(), this.Id(); + const i = this.Cd(t.payload.adSkipMode, t.payload.adDuration); + i > 0 && (this.gd = setTimeout(() => { + this.mediator.publish(this, $t.ForceStopAdSlot); + }, i * qt.f)); + } + Id() { + this.controlData.maxAdPodDuration && !this.Td && (this.Td = new _i(this.controlData.maxAdPodDuration), this.Td.start(), this.yd.set(this.Td, [ + this.Td.onTimeElapsed.subscribe(() => { + this.mediator.publish(this, $t.ForceStopAdPod); + }), + this.Td.onTimeUpdate.subscribe(() => { + const t = this.Td.timeRemaining; + this.mediator.publish(this, $t.AdPodRemainingTime, { payload: { remainingTime: t } }); + }) + ])); + } + _d() { + this.controlData.maxAdSlotDuration && !this.Pd && (this.Pd = new _i(this.controlData.maxAdSlotDuration), this.Pd.start(), this.yd.set(this.Pd, [this.Pd.onTimeElapsed.subscribe(() => { + this.mediator.publish(this, $t.ForceStopAdSlot); + })])); + } + Cd(t, i) { + switch (this.controlData.playerAdsSkippability) { + case h.ProtoPlayerAdSkippability.IfLongerThan: + if ((t === h.ProtoAdSkipMode.Never || t === h.ProtoAdSkipMode.IfLongerThan31Sec) && !i) + return this.controlData.adsMustBeSkippableIfLongerThan; + if (t === h.ProtoAdSkipMode.Never && i > this.controlData.adsMustBeSkippableIfLongerThan) + return this.controlData.adsMustBeSkippableIfLongerThan; + break; + case h.ProtoPlayerAdSkippability.NoRestrictions: + if (t === h.ProtoAdSkipMode.IfLongerThan31Sec && !i) + return Ht.d; + } + return 0; + } + onAdFinished(t, i = (() => { + return !1; + })()) { + this.Pd = this.jd(this.Pd), i || (this.Td = this.jd(this.Td), this.currentPlayerAdSlot === M.ProtoAdSlotsEnum.MidRoll ? this.vd++ : this.bd++), this.Sd() && !i && this.mediator.publish(this, $t.MidRollCapped), t && (this.Od = !0), this.wd.inImpression = !1, i ? this.kd() : this.toggleEnableAds(), clearTimeout(this.gd); + } + onAdPause() { + this.Td && this.Td.stop(), this.Pd && this.Pd.stop(), this.xd && this.xd.stop(); + } + onAdPlay() { + this.Td && this.Td.start(), this.Pd && this.Pd.start(), this.xd && this.xd.start(); + } + onStop() { + this.currentPlayerAdSlot = null, this.wd.stopped = !0, this.toggleEnableAds(); + } + onAdStateChange(t, i, e) { + this.controlData.maxAdSlotDuration = i.maxAdSlotDuration, this.controlData.maxAdPodDuration = i.maxAdPodDuration, t === this.currentPlayerAdSlot && t === M.ProtoAdSlotsEnum.MidRoll || (null === t && this.Ed === M.ProtoAdSlotsEnum.MidRoll || (this.Od = !0), t !== M.ProtoAdSlotsEnum.MidRoll && (this.bd = 0, this.firstAdBreakStarted = !1), this.currentPlayerAdSlot = t, this.Ed = t, this.startAds()); + } + contentChanged() { + this.vd = 0, this.firstAdBreakStarted = !1, this.toggleEnableAds(); + } + viewabilityStateChanged(t, i = (() => { + return !1; + })(), e = (() => { + return !1; + })()) { + this.Ld = t, this.controlData.viewabilityPolicy === M.ProtoAdViewabilityPolicy.Strict && (this.wd.viewability = !t), e || this.toggleEnableAds(); + } + setToggleAdsReason(t) { + this.wd.isAppBackgrounded = t.isAppBackgrounded, this.wd.inAppRecyclerViewViewability = t.inAppRecyclerViewViewability, this.toggleEnableAds(); + } + disableAdvertising() { + this.wd.forceDisable = !0, this.toggleEnableAds(); + } + enableAdvertising() { + this.wd.forceDisable = !1, this.toggleEnableAds(); + } + destroy() { + this.xd && this.xd.disable(), clearTimeout(this.gd), this.Pd = this.jd(this.Pd), this.Td = this.jd(this.Td); + } + get inView() { + return this.Ld; + } + onResize(t, i) { + this.wd.zeroDimension = 0 === t || 0 === i, this.toggleEnableAds(); + } + } + !function (t) { + t[t.Portrait = 0] = 'Portrait', t[t.Landscape = 1] = 'Landscape'; + }(yi || (yi = {})); + var Ci = yi; + const Ti = 1.3; + class Pi { + constructor(t) { + this.urlSuffixerService = t, this.Rd = {}, this.Bd = []; + } + getImage(t, i, e, s, n = (() => { + return ''; + })(), r = (() => { + return !1; + })()) { + return this.Dd = t, this.Fd = Object(rt.h)(i) ? i : '', this.Vd = e, this.Ud = s, this.lr = n, this.$d = r, this.Nd(); + } + Nd() { + const t = this.Hd(); + if (t) + return t; + const i = this.Dd + this.lr, e = new Image(); + return e.src = this.urlSuffixerService.appendParamsToUrl(i), e.alt = this.Fd, this.Rd[this.Dd] = this.Rd[this.Dd] || {}, this.Rd[this.Dd][this.Vd] = this.Rd[this.Dd][this.Vd] || {}, this.Rd[this.Dd][this.Vd][this.Ud] = this.Rd[this.Dd][this.Vd][this.Ud] || {}, this.Rd[this.Dd][this.Vd][this.Ud][this.lr] = e, e; + } + Hd() { + const t = this.qd(); + if (t) + return t; + if (!this.$d) + return; + this.zd(); + const i = this.Wd(); + if (i) + return i; + const e = this.Gd(); + return e || void 0; + } + zd() { + const t = []; + if (!this.Rd[this.Dd]) + return void (this.Bd = []); + const i = this.Rd[this.Dd], e = this.Vd > this.Ud ? Ci.Landscape : Ci.Portrait; + Object.keys(i).forEach(s => { + const n = parseInt(s, 10); + Object.keys(i[s]).filter(t => { + return !!i[s][t]; + }).forEach(i => { + const s = parseInt(i, 10); + if ((n > s ? Ci.Landscape : Ci.Portrait) !== e) + return; + const r = { + area: n * s, + img: this.Jd(this.Dd, n, s) + }; + t.push(r); + }); + }), this.Bd = [...t]; + } + Jd(t, i, e) { + if (this.Rd[t] && this.Rd[t][i] && this.Rd[t][i][e]) + return this.Rd[t][i][e][Object.keys(this.Rd[t][i][e])[0]]; + } + qd() { + return this.Rd[this.Dd] && this.Rd[this.Dd][this.Vd] && this.Rd[this.Dd][this.Vd][this.Ud] && this.Rd[this.Dd][this.Vd][this.Ud][this.lr]; + } + Wd() { + if (0 === this.Bd.length) + return; + const t = this.Vd * this.Ud, i = this.Bd.filter(({area: i}) => { + return i > t; + }).sort((t, i) => { + return t.area - i.area; + }); + return 0 !== i.length ? i[0].img : void 0; + } + Gd() { + if (0 === this.Bd.length) + return; + const t = this.Vd * this.Ud, i = this.Bd.filter(({area: i}) => { + return i < t && t / i <= Ti; + }).sort((t, i) => { + return i.area - t.area; + }); + return 0 !== i.length ? i[0].img : void 0; + } + } + var Mi = e(43); + class Ei { + constructor(t) { + this.Qd = t, this.Xd = { + breakType: h.ProtoAdBreakTypeEnum.None, + currentPodNumber: 0, + maxAdSlotDuration: 0, + maxAdPodDuration: 0, + totalNumberOfAdSlots: 0 + }, this.Yd = null; + } + setNewBreak(t) { + this.Qd.forEach(i => { + i.types.forEach(e => { + (function (t, i) { + let e = !1; + switch (t) { + case h.ProtoAdBreakTypeEnum.PreRoll: + e = i === h.ProtoAdSlotsEnum.PreRoll; + break; + case h.ProtoAdBreakTypeEnum.MidRoll: + e = i === h.ProtoAdSlotsEnum.MidRoll; + break; + case h.ProtoAdBreakTypeEnum.PostRoll: + e = i === h.ProtoAdSlotsEnum.PostRoll; + } + return e; + }(e, t) && (this.Xd.currentPodNumber = i.numberOfAdSlots, this.Xd.maxAdSlotDuration = i.maxAdSlotDuration, this.Xd.maxAdPodDuration = i.maxAdPodDuration, this.Xd.totalNumberOfAdSlots = i.numberOfAdSlots)); + }); + }); + } + adStarted() { + this.Kd(), 0 === this.Xd.currentPodNumber && (this.Xd.currentPodNumber = this.Xd.totalNumberOfAdSlots), this.Xd.currentPodNumber--; + } + endPod() { + this.Kd(), this.Xd.currentPodNumber = 0; + } + enterPodTimeout(t) { + this.Kd(), this.Yd = setTimeout(() => { + this.Kd(), t(); + }, k); + } + isInAdPod() { + return this.Xd.currentPodNumber > 0; + } + isCurrentBreakInPod() { + return this.Xd.totalNumberOfAdSlots > 1; + } + getMaxAdSlotDuration() { + return this.Xd.maxAdSlotDuration; + } + getMaxAdPodDuration() { + return this.Xd.maxAdPodDuration; + } + getMaxAdSlotPossibleDuration() { + let t = 0; + for (let i = 0; i < this.Qd.length; i++) { + if (0 === this.Qd[i].maxAdSlotDuration) + return 0; + t = Math.max(t, this.Qd[i].maxAdSlotDuration); + } + return t; + } + getCurrentSlotIndex() { + return this.Xd.totalNumberOfAdSlots - this.Xd.currentPodNumber; + } + getNextSlotIndex() { + const t = this.getCurrentSlotIndex(); + return this.Xd.totalNumberOfAdSlots > t ? t + 1 : 1; + } + getTotalNumberOfSlots() { + return this.Xd.totalNumberOfAdSlots; + } + isInPodTimeout() { + return !!this.Yd; + } + Kd() { + clearTimeout(this.Yd), this.Yd = null; + } + } + var Li = e(8), Ri = e(47); + const Bi = ['com.accuweather.android'], Di = 0.05 * qt.f; + class Fi extends o.a { + constructor(t, i, e, s) { + super(), this.mediator = t, this.Hs = i, this._appSettings = e, this.Zd = s, this.tf = 0.01, this.if = 0.5, this.ef = 2000, this.sf = 0, this.nf = !1, this.rf = !1, this.hf = !1, this.af = !1, this.cf = !1, this.uf = !1, this.Ld = !1, this.Oh = h.ProtoAdSlotsEnum.PreRoll, this.uu = !1, this.lf = !1, this.df = !1, this.ff = !1, this.pf = !1, this.bf = !1, this.vf = !1, this.mf = { + [Pt.b.AdRemainingTimeChange]: t => { + var i; + this.pf && this.app.config.isInAppAndroid && (null === (i = this.adHandler) || void 0 === i || i.pause()); + }, + [Pt.b.AdImpression]: t => { + this.gf.onAdImpression(t), this.yf(), this.mediator.publish(this, Tt.b.AdImpression, t); + const { + adSourceData: i, + customAdData: e + } = t.payload; + this.wf(i, e); + }, + [Pt.b.AdStopped]: t => { + this.mediator.publish(this, Tt.b.AdStopped, t), this.Of(), this.xf(), this.app.services.EventsStorageService.emitAdStopped(), this.Ld && this.Sf(); + }, + [Pt.b.AdError]: t => { + this.adHandler.inImpression && this.Of(), this.mediator.publish(this, Tt.b.AdError, t), this.app.services.EventsStorageService.emitAdError(); + }, + [Pt.b.AdSkipped]: t => { + this.mediator.publish(this, Tt.b.AdSkipped, t), this.app.services.EventsStorageService.emitAdSkipped(); + this.floatingModule && (this.floatingModule.enabled = !0), this.Of(!0), this.xf(), this.Ld && this.Sf(); + }, + [Pt.b.AdPaused]: t => { + this.gf.onAdPause(), this.app.services.TrackingService.setSessionPlayback(!1), this.app.services.EventsStorageService.emitAdPaused(), this.mediator.publish(this, Tt.b.AdPause, t); + }, + [Pt.b.AdPlaying]: t => { + this.gf.onAdPlay(), this.app.services.TrackingService.setSessionPlayback(!0), this.app.services.EventsStorageService.emitAdPlaying(), this.mediator.publish(this, Tt.b.AdPlay, t); + }, + [Pt.b.AdVideoFirstQuartile]: t => { + this.mediator.publish(this, Tt.b.AdCompleted25, t), this.app.services.EventsStorageService.emitAdVideoFirstQuartile(); + }, + [Pt.b.AdVideoMidpoint]: t => { + this.mediator.publish(this, Tt.b.AdCompleted50, t), this.app.services.EventsStorageService.emitAdVideoMidpoint(); + }, + [Pt.b.AdVideoThirdQuartile]: t => { + this.mediator.publish(this, Tt.b.AdCompleted75, t), this.app.services.EventsStorageService.emitAdVideoThirdQuartile(); + }, + [Pt.b.AdVideoComplete]: t => { + this.mediator.publish(this, Tt.b.AdCompleted100, t), this.app.services.EventsStorageService.emitAdVideoComplete(); + }, + [Pt.b.AdClickThru]: t => { + this.mediator.publish(this, Tt.b.AdClick, t), this.app.services.EventsStorageService.emitAdClickThru(); + }, + [Pt.b.AdInteraction]: () => { + this.app.services.EventsStorageService.emitAdInteraction(); + }, + [Pt.b.AdUserAcceptInvitation]: () => { + this.app.services.EventsStorageService.emitAdInteraction(); + }, + [Pt.b.AdUserClose]: () => { + this.app.services.EventsStorageService.emitAdInteraction(); + }, + [Pt.b.AdUserMinimize]: () => { + this.app.services.EventsStorageService.emitAdInteraction(); + }, + [Pt.b.AdVideoStart]: t => { + const {adSourceData: i} = t.payload, e = { + duration: i && i.length, + mediaPlayerVolume: this.getVolume() + }; + this.app.services.EventsStorageService.emitAdVideoStart(e); + }, + [Pt.b.AdLoaded]: t => { + var i; + const {adLoadedData: e} = t.payload; + (null === (i = e) || void 0 === i ? void 0 : i.skipOffset) < 0 && (e.skipOffset = void 0); + const s = this.jf(e); + this.app.services.EventsStorageService.emitAdLoaded(s); + }, + [Pt.b.AdVolumeChange]: () => { + this.app.services.EventsStorageService.emitAdVolumeChange(); + } + }, this.kf = t => { + return i => { + const e = this.mf[t]; + e && e(i); + }; + }, this._f = t => { + this.lf = t, t && (this.app.services.ViewabilityService.off(this.$playerContainer, this._f), this.Af()); + }, this.If = t => { + t && this.adHandler && !this.ff && setTimeout(() => { + this.adHandler.resumeWithoutUserInteraction(); + }, Di); + }, this.Cf = () => { + !this.rf && this.Tf() && (this.mediator.publish(this, c.b.CanStart), this.app.services.ResizeObserver.off(this.$experienceContainer, this.Cf)); + }, this.Pf = ({ + payload: { + playback: t, + isFullscreenClose: i + } + }) => { + this.floatingModule && Object(rt.a)(t) && !i && (this.floatingModule.enabled = t); + }, this.Mf = () => { + this.Ef(1); + }, this.Lf = () => { + this.Ef(0); + }, this.Rf = t => { + this.Pf(t); + const {playback: i} = t.payload; + Object(rt.a)(i) && (i ? (this.app.services.EventsStorageService.emitAdPlay(), this.ff = !1) : (this.app.services.EventsStorageService.emitAdPause(), this.ff = !0)); + }, this.Bf = new Pi(s); + } + Df() { + } + wf(t, i) { + this.app.services.EventsStorageService.emitAdImpression(t, i); + } + xf() { + this.app.services.EventsStorageService.emitAdComplete(); + } + Ff() { + } + Sf() { + } + Vf() { + } + Uf() { + } + $f() { + } + Nf() { + } + Hf() { + } + qf(t) { + const i = { state: t }; + this.app.services.EventsStorageService.emitAdStateChange(i); + } + zf() { + const { + clientWidth: t, + clientHeight: i + } = this.$playerContainer, e = { + width: t, + height: i + }; + this.app.services.EventsStorageService.emitPlayerResized(e); + } + Wf() { + this.app.services.EventsStorageService.emitOnEnterFullscreen(); + } + Gf() { + this.app.services.EventsStorageService.emitOnExitFullscreen(); + } + Jf() { + this.app.services.EventsStorageService.emitOnPlayerCollapsed(); + } + Qf() { + this.app.services.EventsStorageService.emitOnPlayerExpanded(); + } + Xf(t) { + this.Yf(t), this.Kf(t), this.Zf(t), this.Oh = t, this.tp(t); + } + Kf(t) { + this.adHandler && this.adHandler.adStateChange(t, this.ep.getMaxAdSlotDuration()); + } + Zf(t) { + this.gf.onAdStateChange(t, { + maxAdPodDuration: this.ep.getMaxAdPodDuration(), + maxAdSlotDuration: this.ep.getMaxAdSlotDuration() + }); + } + Yf(t) { + this.ep.setNewBreak(t); + } + tp(t) { + this.qf(Mi.b[t]); + } + sp() { + this.adHandler && this.adHandler.contentChanged(), this.gf.contentChanged(); + } + np() { + this.adHandler = this.rp(), this.ap(), this.relay(Tt.b.ImpressionPrice, this.adHandler, this, this.mediator), this.relay(Tt.b.ImpressionRevenue, this.adHandler, this, this.mediator), this.subscribe(c.b.UserInteraction, this.adHandler, this.Rf), this.subscribe(Vt.DetachedFromDom, this.adHandler, () => { + this.app.services.GlobalDomUtilsService.isDetachedFromDOM(this.$experienceContainer) ? this.triggerDestroy() : (this.unsubscribeAll(this.adHandler), this.adHandler.destroy(), this.adHandler = null, Object(n.a)({ + level: h.ProtoLoggingLevelEnum.FATAL, + message: 'only_adHandler_destroyed', + sendMaxLog: !1, + throttle: 1 + })); + }); + const t = () => { + this.app.services.TrackingService.setAdStart(), this.df = !0, this.ff = !1, this.Af(), this.unsubscribe(Ut.AdsEnabled, this.adHandler, t); + }; + this.subscribe(Ut.AdsEnabled, this.adHandler, t), this.subscribe(Vt.AdSlotResized, this.adHandler, ({ + payload: { + width: t, + height: i + } + }) => { + this.gf.onResize(t, i); + }); + } + ap() { + Object.keys(Pt.b).forEach(t => { + this.subscribe(Pt.b[t], this.adHandler, i => { + const e = Pt.b[t]; + this.kf(e)(i), this.mediator.publish(this, e, i); + }); + }); + } + Of(t = (() => { + return !1; + })()) { + let i = this.ep.isInAdPod(); + t && (i = !1, this.ep.endPod()), this.gf.onAdFinished(this.adHandler.inImpression, i), this.op(), this.cp.isCloseButton && this.adHandler && this.adHandler.firstAdShown && (this.cp.closeButtonMode !== h.ProtoPlayerCloseButtonMode.OnHoverAfterFirstAd || Object(T.t)(this.$playerContainer, d.g.CloseHover) || Object(T.a)(this.$playerContainer, d.g.CloseHover), this.cp.floatingSettings.floatingCloseButtonMode !== h.ProtoPlayerCloseButtonMode.OnHoverAfterFirstAd || Object(T.t)(this.$playerContainer, d.g.CloseFloatHover) || Object(T.a)(this.$playerContainer, d.g.CloseFloatHover)); + } + yf() { + this.ep.adStarted(), this.adHandler.show(); + } + op() { + this.adHandler.hide(); + } + up(t) { + this.adHandler.enterAdPodLoadingState(), this.ep.enterPodTimeout(() => { + this.ep.endPod(), t(); + }); + } + lp() { + Object(T.i)(this.$playerContainer), this.gf = this.dp(), this.subscribe($t.EnableAds, this.gf, () => { + this.adHandler && this.adHandler.enableAds(); + }), this.subscribe($t.DisableAds, this.gf, t => { + this.adHandler && this.adHandler.disableAds(t.payload); + }), this.subscribe($t.ForceStopAdSlot, this.gf, () => { + this.adHandler && this.adHandler.stopAd('forceStopAdSlot'); + }), this.subscribe($t.ForceStopAdPod, this.gf, () => { + if (this.adHandler) + if (this.adHandler.inImpression) + this.ep.endPod(), this.adHandler.stopAd('forceStopAdPod'); + else { + const t = !0; + this.Of(t); + } + }), this.subscribe($t.AdPodRemainingTime, this.gf, t => { + this.adHandler && this.adHandler.updatePodRemainingTime(t.payload.remainingTime); + }), this.subscribe($t.AdOpportunity, this.gf, t => { + var i; + const e = t.payload.adBreakType, s = null === (i = this.adHandler) || void 0 === i ? void 0 : i.getAdContainerWidth(), n = { + adBreak: e, + playerWidth: Object(rt.a)(s) ? s : this.$playerContainer.clientWidth + }; + this.app.services.TrackingService.trackAdOpportunity(n), this.adHandler && this.adHandler.newAdOpportunity(); + }); + } + fp() { + this.app.services.ViewabilityService.on(this.$playerContainer, this._f, { + threshold: this.if, + callbackDelay: this.ef + }), this.app.services.ViewabilityService.on(this.$playerContainer, (t, i) => { + return this.gl(t, i); + }, { threshold: this.tf }), this.app.services.ViewabilityService.subscribe(Tt.e.OmidViewabilityThreshold, t => { + this.mediator.publish(this, Tt.e.OmidViewabilityThreshold, { payload: { threshold: t } }); + }), this.app.config.os.os === St.b.Ios && this.app.services.PageFocusService.on(this.If); + } + Af() { + this.lf && this.df && this.mediator.publish(this, c.c.SessionView); + } + gl(t, i = (() => { + return !1; + })()) { + var e; + const {isRecyclerViewIntegration: s} = this.app.config; + this.gf.setToggleAdsReason({ + isAppBackgrounded: i, + inAppRecyclerViewViewability: s && !t + }), this.app.config.isInApp && (i ? (this.pf = !0, this.vf ? this.bf = !0 : this.bf = !1, this.pp = this.getVolume(), this.setVolume(0), null === (e = this.adHandler) || void 0 === e || e.disableAds(gi.Unknown), this.pause()) : (this.pp && (this.setVolume(this.pp), this.pp = null), this.pf && (this.pf = !1, this.bf || this.play()))), this.Ld = t, this.mediator.publish(this, Tt.b.IsViewable, { payload: t }), this.gf.viewabilityStateChanged(this.checkFloatingViewability(t), this.ep.isInAdPod(), this.ep.isInPodTimeout()), this.app.services.TrackingService.setSessionViewability(t); + } + checkFloatingViewability(t) { + const i = this.app.services.ViewabilityService.getIsTabInFocus(); + return !(t || !this.floatingModule || !this.floatingModule.isInFloating || !i) || t; + } + uh() { + const t = this.$playerContainer.clientWidth, i = this.$playerContainer.clientHeight; + if (this.adHandler) { + const e = this.uu ? Pt.a.Fullscreen : Pt.a.Normal; + this.adHandler.resizeAd(t, i, e); + } else + this.gf.onResize(t, i); + this.breakPointsHandler.updateWidth(t), setTimeout(() => { + this.mediator.publish(this, Tt.b.SizeChanged, { + payload: { + width: t, + height: i + } + }), this.bp(); + }); + } + bp() { + this.uu || this.zf(); + } + vp() { + this.app.services.ResizeObserver.on(this.$playerContainer, () => { + this.uh(); + }); + } + mp() { + this.uu = !0, this.app.services.InteractionService.disableScrollEvent(), this.Wf(), this.adHandler && this.adHandler.setVastViewMode(Pt.a.Fullscreen); + } + gp() { + this.uu = !1, this.app.services.InteractionService.enableScrollEvent(), this.Gf(), this.adHandler && this.adHandler.setVastViewMode(Pt.a.Normal); + } + yp() { + const t = ``, i = this.app.services.GlobalDomUtilsService.createElementByString(t); + return this.wp(i), i; + } + wp(t) { + Object(T.N)(t, { 'padding-bottom': `${ this.Op() }%` }); + } + Op() { + return this.cp.playerSize.ratioHeight / this.cp.playerSize.ratioWidth * 100; + } + xp() { + this.subscribe(At.EnterStart, this.floatingModule, () => { + this.mediator.publish(this, Tt.c.PlayerFloatChanged, { payload: Ct.Float }); + }), this.subscribe(At.ExitStop, this.floatingModule, () => { + this.mediator.publish(this, Tt.c.PlayerFloatChanged, { payload: Ct.Embed }); + }), this.subscribe(At.EnterStop, this.floatingModule, () => { + this.gl(!0); + }); + } + Sp() { + this.floatingModule = new Dt(this, this.app.services.ViewabilityService, this.app.services.ResizeObserver, this.$playerContainer, this.cp.floatingSettings, this.app.config.device, this.app.services.GlobalDomUtilsService, this.jp), this.xp(), this.floatingModule.start(); + } + kp() { + const t = new Ft(this, this.app.services.ResizeObserver, this.$experienceContainer, this.cp.floatingSettings, this.app.config.device, this.app.services.GlobalDomUtilsService); + this.subscribe(At.EnterStop, t, () => { + this.app.services.ViewabilityService.triggerRecheck(this.$playerContainer); + }), t.start(); + } + setNewVolume(t) { + this.adHandler && this.adHandler.setVolume(t); + } + _p() { + this.Ap(), this.adHandler && this.Cp(this.adHandler); + } + Cp(t) { + this.subscribe(c.b.UserInteraction, t, ({ + payload: {volume: t} + }) => { + t && this.Tp(); + }); + } + ih(t) { + this.mediator.publish(this, Tt.b.VolumeChanged, { payload: t }), this.app.services.EventsStorageService.emitVolumeChange(t); + } + Ef(t) { + this.getVolume() !== t && this.setNewVolume(t); + } + Ap() { + this.nf = !0, this.$playerContainer.addEventListener('mouseover', this.Mf), this.$playerContainer.addEventListener('mouseout', this.Lf); + } + Tp() { + this.nf && (this.nf = !1, this.$playerContainer.removeEventListener('mouseover', this.Mf), this.$playerContainer.removeEventListener('mouseout', this.Lf)); + } + Pp() { + this.breakPointsHandler = new P(this.$playerContainer, this.app.config.device, this.Mp, this.Ep), this.breakPointsHandler.updateWidth(this.$playerContainer.clientWidth); + } + Lp() { + if (this.cp.isCloseButton) { + switch (this.subscribe(xt[xt.Close], this.adHandler, () => { + this.handleClose(); + }), this.cp.closeButtonMode) { + case h.ProtoPlayerCloseButtonMode.AlwaysOn: + Object(T.a)(this.$playerContainer, d.g.CloseOn); + break; + case h.ProtoPlayerCloseButtonMode.Off: + Object(T.a)(this.$playerContainer, d.g.CloseOff); + break; + case h.ProtoPlayerCloseButtonMode.OnHover: + Object(T.a)(this.$playerContainer, d.g.CloseHover); + } + switch (this.cp.floatingSettings.floatingCloseButtonMode) { + case h.ProtoPlayerCloseButtonMode.AlwaysOn: + Object(T.a)(this.$playerContainer, d.g.CloseFloatOn); + break; + case h.ProtoPlayerCloseButtonMode.Off: + Object(T.a)(this.$playerContainer, d.g.CloseFloatOff); + break; + case h.ProtoPlayerCloseButtonMode.OnHover: + Object(T.a)(this.$playerContainer, d.g.CloseFloatHover); + } + } + } + jf(t) { + const {skipOffset: i} = t; + return { + isAutoPlay: this.cp.playbackMode === h.ProtoPlayerPlaybackModeEnum.Autoplay, + skipOffset: i, + isSkippable: Object(rt.d)(i) + }; + } + Rp() { + this.df = !0, this.app.services.TrackingService.setContentStart(), this.Af(); + } + Tf() { + const { + clientWidth: t, + clientHeight: i + } = this.$experienceContainer; + return !Object(wi.d)({ + width: t, + height: i + }) || this.Bp(); + } + Bp() { + return Bi.includes(this.app.config.bundleID); + } + Dp(t) { + try { + const { + display: i, + width: e, + height: s, + flex: n, + maxWidth: r, + minWidth: h + } = this.app.services.GlobalDomUtilsService.getComputedStyle(t), { + width: a, + height: o + } = t.getBoundingClientRect(), c = { + display: i, + compWidth: e, + boundWidth: a, + compHeight: s, + boundHeight: o, + flex: n, + maxWidth: r, + minWidth: h + }; + return { + type: t.nodeName, + styles: JSON.stringify(c) + }; + } catch (t) { + return { err: 'BaseExperience_getElementInfo_error' }; + } + } + Fp() { + if (!Object(Li.k)([ + 95, + 5 + ])) + return; + const t = { + parent: this.Dp(this.$experienceContainer.parentElement), + main: this.Dp(this.$experienceContainer) + }; + Object(n.a)({ + message: 'BaseExperience_invalid_dimensions', + level: h.ProtoLoggingLevelEnum.INFO, + exception: JSON.stringify(t) + }); + } + Vp() { + this.ep = new Ei(this.cp.adBreaks); + } + Eo(t, i, e, s) { + this.cp = t, this.app = i, this.$experienceContainer = e, s && s(), this.Df(), this.app.services.ViewabilityService.setViewableThreshold(this.sf), this.generateHTML(), this.Vp(), this.app.services.ResizeObserver.on(this.$experienceContainer, this.Cf), this.Tf() ? this.mediator.publish(this, c.b.CanStart) : this.Fp(); + } + start() { + this.rf = !0, Object(T.a)(this.$experienceContainer, d.b.MainContainerFlex), this.mediator.publish(this, c.c.SessionRendered), this.Pp(), this.vp(), this.cp.floatingSettings.floatingMode === h.ProtoPlayerFloatingMode.Always ? this.kp() : (this.zf(), this.Sp()), this.fp(), this.cp.lineItemSettings.lineItems.length > 0 && !this.cp.disableAdvertising && !this.Hs && this.np(), this.app.config.isMobile || this.cp.soundMode !== h.ProtoPlayerSoundMode.Hover || this._p(), this.cp.isCloseButton && this.Lp(), this.lp(), this.Hs || Ri.a.detectUsingScript().then(t => { + t && (this.app.services.TrackingService.trackSessionAdBlocker(h.ProtoAdBlockDetectionTypeEnum.Network), this.gf.disableAdvertising()); + }); + } + play() { + this.adHandler && this.adHandler.inImpression && this.adHandler.play(); + } + pause() { + this.adHandler && this.adHandler.inImpression && this.adHandler.pause(); + } + setVolume(t) { + this.setNewVolume(t), this.Tp(); + } + getSize() { + return { + width: this.$experienceContainer.clientWidth, + height: this.$experienceContainer.clientHeight + }; + } + setSize(t, i) { + Object(wi.d)({ + width: t, + height: i + }) || Object(T.N)(this.$experienceContainer, { + width: `${ t }px`, + height: `${ i }px` + }); + } + setCustomMacros(t) { + this.app.services.MacrosService.addExtraMacros(t); + } + isViewable() { + return this.app.services.ViewabilityService.check({ + element: this.$playerContainer, + threshold: this.tf + }); + } + setViewableThreshold(t) { + this.app ? this.app.services.ViewabilityService.setViewableThreshold(t) : this.sf = t; + } + setAmpUserConsent(t) { + this.app.services.UserManagerService.setAmpUserConsent(t); + } + triggerDestroy() { + this.app.services.EventsStorageService.destroy(), this.mediator.publish(this, c.b.Destroy); + } + disableAdvertising() { + this.gf.disableAdvertising(); + } + enableAdvertising() { + this.gf.enableAdvertising(); + } + destroy() { + this.adHandler && this.adHandler.destroy(), this.gf && this.gf.destroy(), this.floatingModule && (this.floatingModule.destroy(), this.floatingModule = null); + } + } + var Vi = e(14); + const Ui = 140, $i = 80; + class Ni { + static getScaledImageUrl(t, i, e, s, n) { + if (t && !Object(wi.d)({ + width: i, + height: e + })) + return Object(rt.e)(n) && (i = Object(wi.c)(i, n), e = Object(wi.c)(e, n)), s.appendParamsToUrl(`${ t }${ Ni.getScaledImageQueryParams(i, e) }`.trim()); + } + static getScaledImageQueryParams(t, i) { + return Object(wi.d)({ + width: t, + height: i + }) ? '' : `?width=${ t }&height=${ i }&fit=bounds`; + } + static getSmartCroppedImageUrl(t, i, e, s) { + return Object(rt.h)(t) || (t = Vi.a.endPoints.base.image), Object(wi.d)({ + width: i, + height: e + }) && (i = Ui, e = $i), s.appendParamsToUrl(`${ t }${ Ni.getSmartCroppedImageQueryParams(i, e) }`); + } + static getSmartCroppedImageQueryParams(t, i) { + return Object(wi.d)({ + width: t, + height: i + }) ? '' : `?crop=${ t }:${ i },smart&width=${ t }&height=${ i }&format=jpeg&quality=60&fit=crop`; + } + } + class Hi { + constructor(t) { + this.context = t; + } + onClick() { + } + canTransitionToState(t) { + return !0; + } + enterState() { + this.initState(), this.context.currentState = this; + } + } + var qi, zi, Wi; + function Gi(t, i, e, s) { + t.style.top = `${ function (t, i, e, s, n) { + let r = i - s.clientY; + const h = s.clientY + s.height - i; + n.alignTop && r > t.offsetHeight ? r -= t.offsetHeight : !n.alignTop && h < t.offsetHeight ? r -= t.offsetHeight - h : (r += e) + t.offsetHeight > s.height && (r = s.height - t.offsetHeight); + return r; + }(t, i.clientY, i.height, e, s) }px`, t.style.left = `${ function (t, i, e, s) { + const n = s.distanceFromMargin ? s.distanceFromMargin : 0; + let r = Math.ceil(i) - Math.ceil(e.clientX), h = i, a = h + t.offsetWidth; + const o = e.clientX + e.width; + if (s.alignMiddle) { + const i = t.offsetWidth / 2; + r -= Math.ceil(i), h -= i, a -= i; + } + if (s.alignMiddle || s.forceRight) + return e.clientX > h ? r = 0 + n : o < a && (r -= Math.ceil(a) - Math.ceil(o) + n), r; + a > o && (r -= t.offsetWidth); + return r; + }(t, i.clientX, e, s) }px`; + } + !function (t) { + t[t.PlayButton = 0] = 'PlayButton', t[t.BigPlayButton = 1] = 'BigPlayButton', t[t.VolumeButton = 2] = 'VolumeButton', t[t.VolumeProgress = 3] = 'VolumeProgress', t[t.VolumeControls = 4] = 'VolumeControls', t[t.ExpandButton = 5] = 'ExpandButton', t[t.SettingsButton = 6] = 'SettingsButton', t[t.CaptionButton = 7] = 'CaptionButton', t[t.CaptionComponent = 8] = 'CaptionComponent', t[t.CastButton = 9] = 'CastButton', t[t.ShareButton = 10] = 'ShareButton', t[t.UpNextButton = 11] = 'UpNextButton', t[t.UpNextBox = 12] = 'UpNextBox', t[t.PreviousButton = 13] = 'PreviousButton', t[t.LogoComponent = 14] = 'LogoComponent', t[t.LogoOutstream = 15] = 'LogoOutstream', t[t.MoreButton = 16] = 'MoreButton', t[t.ElapsedTimeLabel = 17] = 'ElapsedTimeLabel', t[t.TotalDurationLabel = 18] = 'TotalDurationLabel', t[t.ProgressBar = 19] = 'ProgressBar', t[t.QualityMenu = 20] = 'QualityMenu', t[t.QueStateOverlay = 21] = 'QueStateOverlay', t[t.Loader = 22] = 'Loader', t[t.ContextMenu = 23] = 'ContextMenu', t[t.ElementsSettingsMenu = 24] = 'ElementsSettingsMenu', t[t.CloseButton = 25] = 'CloseButton', t[t.SkipAdButton = 26] = 'SkipAdButton', t[t.AdLoadingScreen = 27] = 'AdLoadingScreen', t[t.CtaButton = 28] = 'CtaButton', t[t.PlayspaceProgressBar = 29] = 'PlayspaceProgressBar', t[t.PlayspaceSettingsMenu = 30] = 'PlayspaceSettingsMenu', t[t.ClickToPlayButton = 31] = 'ClickToPlayButton', t[t.SlideTitle = 32] = 'SlideTitle', t[t.SkipAd = 33] = 'SkipAd', t[t.TopTitle = 34] = 'TopTitle', t[t.TopLogo = 35] = 'TopLogo', t[t.TopSlideTitle = 36] = 'TopSlideTitle', t[t.TopStoryTitle = 37] = 'TopStoryTitle', t[t.TextLabel = 38] = 'TextLabel', t[t.LivePoster = 39] = 'LivePoster', t[t.LiveIcon = 40] = 'LiveIcon'; + }(qi || (qi = {})), function (t) { + t[t.Top = 1] = 'Top', t[t.Bottom = 2] = 'Bottom', t[t.Right = 4] = 'Right', t[t.Left = 8] = 'Left', t[t.Middle = 16] = 'Middle'; + }(zi || (zi = {})); + class Ji extends o.a { + constructor(t, i, e, s, n) { + super(), this.mediator = t, this.js = i, this.hc = e, this.Qn = n, this.Bc = i.createElementByString(s); + } + getContainer() { + return this.Bc; + } + getCoordinates(t) { + const i = this.js.getElementCoordinates(this.Bc); + return this.Qn && t ? ((t & zi.Top) === zi.Top && (i.clientY -= this.Bc.clientHeight), (t & zi.Right) === zi.Right && (i.clientX += this.Bc.clientWidth)) : i.clientX += i.width / 2, i; + } + showComponent(t = (() => { + return !1; + })()) { + if (!this.Bc || !this.Bc.parentElement) + return; + const i = Object(T.t)(this.Bc.parentElement, 'cnx-ui-btn') ? this.Bc.parentElement : this.Bc; + t && Object(T.B)(i) ? Object(T.g)(i) : Object(T.O)(i); + } + hideComponent(t = (() => { + return !1; + })()) { + if (!this.Bc || !this.Bc.parentElement) + return; + const i = Object(T.t)(this.Bc.parentElement, 'cnx-ui-btn') ? this.Bc.parentElement : this.Bc; + t && !Object(T.B)(i) ? Object(T.h)(i, () => { + return Object(T.u)(i); + }) : Object(T.u)(i); + } + destroy() { + this.Bc.innerHTML = '', this.Bc.style.display = 'none', this.hc.unregisterAll(this); + } + } + class Qi extends Ji { + constructor(t, i, e, s, n) { + super(t, i, e, s, n), this.eventList = [ + ht.a[ht.a.Scroll], + ht.a[ht.a.Click] + ], this.Up = t => { + this.onInteractionHandler(t); + }, this.onBeforeClick = t => { + t.stopPropagation(); + }, this.onClick = t => { + this.onInteractionHandler(t), this.onClickHandler(t); + }; + } + onInteractionHandler(t) { + t.stopPropagation(); + } + onClickHandler(t) { + } + initComponent() { + const t = { + interactionstart: this.onBeforeClick, + interaction: this.Up, + click: this.onClick + }; + this.hc.register(this.Bc, this, this.hc, t), this.Qn && (this.subscribe(ht.a[ht.a.Click], this.hc, () => { + this.onClickHandler(); + }), this.relay(ht.a[ht.a.Scroll], this.hc, this, this.mediator)); + } + destroy() { + this.unsubscribeAll(this.hc), super.destroy(); + } + } + class Xi extends Qi { + constructor() { + super(...arguments), this.onClick = t => { + this.onInteractionHandler(t), this.onClickHandler(), this.addBoomEffect(); + }; + } + addBoomEffect() { + Object(T.a)(this.Bc, 'cnx-boom'), this.Bc.getClientRects(), Object(T.a)(this.Bc, 'cnx-boom-anim'); + const t = i => { + 'transform' === i.propertyName && (Object(T.I)(this.Bc, 'cnx-boom'), Object(T.I)(this.Bc, 'cnx-boom-anim'), this.Bc.removeEventListener('transitionend', t)); + }; + this.Bc.addEventListener('transitionend', t); + } + initComponent() { + super.initComponent(), this.Bc.appendChild(this.js.createElementByString('')); + } + } + class Yi extends Xi { + constructor() { + super(...arguments), this.eventList = [ + xt[xt.HoverStart], + xt[xt.HoverEnd], + ...this.eventList + ], this.onStartHover = () => { + Object(T.a)(this.Bc, d.h.HoverStart), Object(T.a)(this.Bc, d.h.HoverEnd), this.mediator.publish(this, xt[xt.HoverStart]); + }, this.onEndHover = () => { + Object(T.I)(this.Bc, d.h.HoverEnd), this.mediator.publish(this, xt[xt.HoverEnd]); + }; + } + initComponent() { + super.initComponent(), this.Qn ? (this.Bc.addEventListener('touchstart', this.onStartHover, { passive: !0 }), this.Bc.addEventListener('touchend', this.onEndHover), this.Bc.addEventListener('touchcancel', this.onEndHover)) : (this.Bc.addEventListener('mouseenter', this.onStartHover), this.Bc.addEventListener('mouseleave', this.onEndHover)); + } + destroy() { + this.Qn ? (this.Bc.removeEventListener('touchstart', this.onStartHover), this.Bc.removeEventListener('touchend', this.onEndHover), this.Bc.removeEventListener('touchcancel', this.onEndHover)) : (this.Bc.removeEventListener('mouseenter', this.onStartHover), this.Bc.removeEventListener('mouseleave', this.onEndHover)), super.destroy(); + } + onInteractionHandler(t) { + this.onEndHoverClick(); + } + onEndHoverClick() { + Object(T.I)(this.Bc, d.h.HoverEnd), Object(T.I)(this.Bc, d.h.HoverStart); + } + } + !function (t) { + t[t.Play = 0] = 'Play', t[t.Pause = 1] = 'Pause'; + }(Wi || (Wi = {})); + class Ki extends Yi { + constructor(t, i, e, s, n) { + super(t, i, e, s, n), this.$p = !1, this.eventList = [ + xt[xt.Play], + xt[xt.Pause], + xt[xt.Replay], + xt[xt.StateChanged], + ...this.eventList + ], this.Np = 'Play', this.Hp = 'Pause', this.setState(Wi.Pause); + } + onClickHandler() { + this.zt === Wi.Pause ? this.mediator.publish(this, xt[xt.Pause]) : this.$p ? this.mediator.publish(this, xt[xt.Replay]) : this.mediator.publish(this, xt[xt.Play]); + } + qp() { + } + toggleReplay(t) { + this.$p = t; + } + setState(t) { + this.zt !== t && (this.zt = t, this.qp(), this.mediator.publish(this, xt[xt.StateChanged])); + } + get tooltip() { + return this.zt === Wi.Play ? this.Np : this.Hp; + } + } + class Zi extends Hi { + initState() { + this.context.$uiContainer.classList.add(d.j.Playing); + const t = this.context.getComponent(qi.PlayButton); + t && t.setState(Wi.Pause); + const i = this.context.getComponent(qi.BigPlayButton); + i && i.setState(Wi.Pause); + } + exitState() { + this.context.$uiContainer.classList.remove(d.j.Playing); + } + } + class te extends Zi { + constructor() { + super(...arguments), this.zp = 100; + } + Wp() { + if (this.elapsedTimeoutId || !this.context.duration) + return; + const t = Date.now(); + this.elapsedTimeoutId = setTimeout(() => { + this.context.elapsedTime += (Date.now() - t) / 1000; + const i = this.context.getComponent(qi.ProgressBar); + i && i.setProgress(Object(wi.e)(0, this.context.duration, 0, 100, this.context.elapsedTime)), this.elapsedTimeoutId = null, this.Wp(); + }, this.zp); + } + initState() { + super.initState(), this.context.duration && this.Wp(); + } + exitState() { + super.exitState(), this.context.duration && (clearTimeout(this.elapsedTimeoutId), this.elapsedTimeoutId = null); + } + } + class ie extends Hi { + initState() { + this.context.$uiContainer.classList.add(d.j.Paused); + const t = this.context.getComponent(qi.PlayButton); + t && t.setState(Wi.Play); + const i = this.context.getComponent(qi.BigPlayButton); + i && i.setState(Wi.Play); + } + exitState() { + this.context.$uiContainer.classList.remove(d.j.Paused); + } + } + class ee extends ie { + initState() { + super.initState(); + } + exitState() { + super.exitState(); + } + } + class se { + constructor(t, i) { + this.Gp = t, this.js = i, this.Jp = /\[\[([0-9]+)]]/g, this.Qp = [], this.Xp = [], this.Yp = this.js.createElementByString(this.Kp(this.Gp)); + } + Zp(t) { + return ``; + } + Kp(t) { + return t.replace(this.Jp, (t, i) => { + return this.Qp.push(parseInt(i, 10)), this.Zp(i); + }); + } + tb(t, i) { + return this.Xp.some(i => { + return i.slotName === t; + }) ? null : this.Xp.some(t => { + return t.component === i; + }) ? null : this.Yp.getElementsByClassName(`pl_${ t }`)[0]; + } + getComponentList() { + return this.Qp; + } + getRenderedDom() { + return this.Yp; + } + registerSlot(t, i) { + const e = this.tb(t, i); + if (null !== e) { + const s = i.getContainer(); + return e.parentNode.replaceChild(s, e), this.Xp.push({ + component: i, + slotName: t + }), !0; + } + return !1; + } + initComponents() { + this.Xp.forEach(t => { + return t.component.initComponent(); + }); + } + } + class ne extends o.a { + constructor(t, i, e) { + super(), this.globalDomUtilsService = t, this.templateString = i, this.componentFactory = e, this.ib = {}, this.eb = new se(i, t), this.addComponents(); + } + addComponents() { + this.eb.getComponentList().forEach(t => { + const i = this.componentFactory.createComponent(t, this); + this.registerComponent(t, i); + }); + } + registerComponent(t, i) { + this.eb.registerSlot(t, i), this.ib[t] = i, this.sb(i); + } + sb(t) { + t.eventList.forEach(i => { + this.subscribe(i, t, e => { + i === xt[xt.RebindComponent] && this.rebindComponentEvents(t), this.handleComponentEvent(i, e, t); + }); + }); + } + rebindComponentEvents(t) { + t && (this.unsubscribeAll(t), this.sb(t)); + } + getComponent(t) { + return this.ib[t]; + } + destroy() { + Object.keys(this.ib).forEach(t => { + this.ib[t].destroy(); + }); + } + } + class re extends ne { + constructor(t, i, e, s, n) { + super(e, s, n), this.mediator = t, this.$container = i, this.componentFactory = n, this.$uiContainer = this.eb.getRenderedDom(), i.appendChild(this.$uiContainer), this.eb.initComponents(); + } + changeState(t) { + const i = this.rb[t]; + i !== this.currentState && this.currentState.canTransitionToState(i) && (this.currentState.exitState(i), i.enterState()); + } + hide() { + Object(T.a)(this.$uiContainer, d.h.DisplayNone); + } + show() { + Object(T.I)(this.$uiContainer, d.h.DisplayNone); + } + destroy() { + super.destroy(), this.$uiContainer.parentNode.removeChild(this.$uiContainer); + } + } + var he, ae = e(87), oe = e.n(ae); + class ce { + constructor(t, i) { + this.hb = t, this.js = i, this.ab = [], this.ob = { + top: 12, + bottom: 24, + margin: 4 + }, this.cb = !1; + } + ub() { + this.lb = this.js.getElementCoordinates(this.hb.parentElement); + } + fb(t, i) { + t.getElementsByClassName('cnx-tooltip-text')[0].innerHTML = i; + } + pb(t) { + if (!t || !t.tooltip || this.cb) + return; + if (this.ab.find(i => { + return i.component === t; + })) + return; + const i = this.js.createElementByString(oe.a); + this.fb(i, t.tooltip), this.ub(); + const e = t.getCoordinates(); + let s = !1; + const { + clientY: n, + height: r + } = e, { + clientY: h, + height: a + } = this.js.getElementCoordinates(this.hb); + n <= h + a / 2 - r ? e.clientY += this.ob.top : (e.clientY -= this.ob.bottom, s = !0), this.hb.appendChild(i), Gi(i, e, this.lb, { + alignMiddle: !0, + alignTop: s, + forceRight: !0, + distanceFromMargin: this.ob.margin + }), Object(T.i)(i), Object(T.a)(i, d.q.OpacityInTransition), this.ab.push({ + component: t, + domElement: i + }); + } + bb(t) { + if (!t.tooltip) + return; + const i = this.ab.find(i => { + return i.component === t; + }); + if (!i) + return; + const e = i.domElement; + this.hb.removeChild(e), this.ab = this.ab.filter(i => { + return i.component !== t; + }); + } + vb(t) { + if (!t.tooltip) + return; + const i = this.ab.find(t => { + return t.component === this.mb; + }); + i && this.fb(i.domElement, t.tooltip); + } + gb() { + this.mb = null, this.ab.forEach(t => { + return this.bb(t.component); + }); + } + setDistanceValues(t) { + this.ob = Object.assign(Object.assign({}, this.ob), t); + } + hoverStart(t) { + this.mb = t, this.pb(t); + } + hoverEnd(t) { + this.mb = null, this.bb(t); + } + stateChanged(t) { + this.mb === t && this.vb(t); + } + disableTooltips() { + this.cb = !0, this.gb(); + } + enableTooltips() { + this.cb = !1, this.pb(this.mb); + } + } + !function (t) { + t[t.expand = 0] = 'expand', t[t.collapse = 1] = 'collapse'; + }(he || (he = {})); + class ue extends Yi { + constructor() { + super(...arguments), this.eventList = [ + xt[xt.Expand], + xt[xt.Collapse], + ...this.eventList + ], this.yb = 'Full Screen', this.wb = 'Exit Full Screen'; + } + onClickHandler() { + switch (this.zt) { + case he.collapse: + this.mediator.publish(this, xt[xt.Expand]); + break; + case he.expand: + this.mediator.publish(this, xt[xt.Collapse]); + break; + default: + this.mediator.publish(this, xt[xt.Expand]); + } + } + qp() { + this.Bc && (this.zt === he.expand ? this.Bc.classList.add(d.h.Active) : this.Bc.classList.remove(d.h.Active)); + } + setState(t) { + this.zt !== t && (this.zt = t, this.qp()); + } + get tooltip() { + return this.zt === he.expand ? this.wb : this.yb; + } + } + class le extends re { + constructor(t, i, e, s, n) { + super(t, i, e, s, n), this.Ob = new ce(this.$uiContainer, e); + } + handleComponentEvent(t, i, e) { + let s = e; + switch (i.payload && i.payload.targetComponent && (s = i.payload.targetComponent), t) { + case xt[xt.HoverStart]: + this.Ob.hoverStart(s); + break; + case xt[xt.HoverEnd]: + this.Ob.hoverEnd(s); + break; + case xt[xt.StateChanged]: + this.Ob.stateChanged(s); + } + } + updateDuration(t, i) { + if (!Object(T.t)(this.$uiContainer, d.g.ShowControls)) + return; + const e = this.getComponent(qi.ElapsedTimeLabel), s = this.getComponent(qi.TotalDurationLabel), n = this.getComponent(qi.ProgressBar); + if (e && e.setTime(t), s && s.setTime(i), n) { + const e = 0, s = i, r = 0, h = 100; + n.setProgress(Object(wi.e)(e, s, r, h, t)); + } + } + updateVolume(t) { + } + expand() { + this.getComponent(qi.ExpandButton).setState(he.expand); + } + collapse() { + this.getComponent(qi.ExpandButton).setState(he.collapse); + } + } + class de extends Yi { + constructor() { + super(...arguments), this.eventList = [ + xt[xt.Settings], + ...this.eventList + ], this.xb = 'Settings'; + } + onClickHandler() { + this.mediator.publish(this, xt[xt.Settings]); + } + toggleHDFlag(t) { + t ? Object(T.a)(this.Bc, d.h.Active) : Object(T.I)(this.Bc, d.h.Active); + } + get tooltip() { + return this.xb; + } + } + var fe = e(88), pe = e.n(fe); + class be extends Yi { + constructor(t, i, e, s, n, r = (() => { + return !1; + })(), h) { + super(t, i, e, s, h), this.Sb = n, this.isActive = r; + } + onClickHandler() { + this.isActive = !this.isActive, this.onStateChange(); + } + get isActive() { + return this.zt; + } + set isActive(t) { + this.zt = t, this.zt ? Object(T.a)(this.Bc, this.Sb) : Object(T.I)(this.Bc, this.Sb); + } + } + class ve extends be { + constructor() { + super(...arguments), this.eventList = [ + xt[xt.CaptionOn], + xt[xt.CaptionOff], + xt[xt.StateChanged], + ...this.eventList + ], this.jb = 'Subtitles On', this.kb = 'Subtitles Off'; + } + onStateChange() { + this.mediator.publish(this, this.isActive ? xt[xt.CaptionOn] : xt[xt.CaptionOff]), this.mediator.publish(this, xt[xt.StateChanged]); + } + get tooltip() { + return this.isActive ? this.kb : this.jb; + } + } + var me = e(52), ge = e.n(me), ye = e(89), we = e.n(ye); + class Oe extends Qi { + constructor() { + super(...arguments), this.Ld = !1, this.eventList = [xt[xt.Next]]; + } + onClickHandler() { + this.mediator.publish(this, xt[xt.Next]); + } + show() { + this.Ld = !0, this.Bc.classList.add('cnx-fade-in-up-next'); + } + hide() { + this.Ld = !1, this.Bc.classList.remove('cnx-fade-in-up-next'); + } + isInView() { + return this.Ld; + } + updateCard(t, i) { + const e = this.Bc.getElementsByTagName('img')[0]; + e.setAttribute('src', t), e.style.display = 'none', e.onload = () => { + e.style.display = 'block'; + }, this.Bc.getElementsByClassName('cnx-up-next-box-text')[0].innerHTML = Object(rt.h)(i) ? i : ''; + } + } + class xe extends Ji { + constructor(t, i, e, s, n) { + super(t, i, e, s), this.settings = n, this.eventList = [], this._b = 144, this.Ab = 36; + } + createLogo() { + let t = this.js.createElement('img'); + t.onload = () => { + t = this.resizeLogo(t), this.Bc.appendChild(t); + }, t.src = this.settings.logoUrl, t.alt = ''; + } + resizeLogo(t) { + const i = t.naturalWidth, e = t.naturalHeight; + if (!i || !e) + return t; + if (this.settings.logoPosition === M.ProtoLogoPositionMode.ControlBar) + t.style.setProperty('height', `${ this.Ab }px`, 'important'), t.style.setProperty('width', `${ this.Ab }px`, 'important'); + else { + const s = i / e; + this.Ab * s > this._b ? (t.style.setProperty('width', `${ this._b }px`, 'important'), t.style.setProperty('height', 'auto', 'important')) : (t.style.setProperty('width', 'auto', 'important'), t.style.setProperty('height', `${ this.Ab }px`, 'important')); + } + return t; + } + initComponent() { + try { + this.createLogo(); + } catch (t) { + Object(n.a)({ + message: 'LogoComponent_createLogo', + exception: t.message, + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.FATAL + }); + } + } + } + class Se extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.Ib = this.Bc.getElementsByTagName('cnx-span')[0]; + } + setTime(t) { + isNaN(t) || 'number' != typeof t ? Object(T.a)(this.Bc, d.h.Invisible) : (this.Ib.innerHTML = Object(nt.f)(t), Object(T.I)(this.Bc, d.h.Invisible)); + } + } + var je = e(58), ke = e.n(je); + class _e extends Ji { + constructor(t, i, e, s, n = (() => { + return !1; + })()) { + super(t, i, e, s, n), this.Cb = 0, this.Tb = null, this.Pb = 0, this.Mb = 0, this.Eb = 100, this.cacheDomElements(); + } + cacheDomElements() { + this.Lb = this.Bc.getElementsByClassName('cnx-progress-fill')[0], this.Wc = this.Bc.getElementsByClassName('cnx-progress-rail')[0]; + } + cacheWidths() { + this.Cb = this.fixedRailWidth ? this.fixedRailWidth : this.Wc.getBoundingClientRect().width, this.Tb = this.Wc.getBoundingClientRect().left; + } + updateUi(t) { + const i = this.getComputedTranslation(t); + this.Pb = i, this.Lb.style.transform = `translateX(${ i }px)`; + } + isValidTranslation() { + return this.Pb >= 0 && this.Pb <= this.Cb; + } + getComputedTranslation(t) { + return t < 0 ? 0 : t > this.Cb ? this.Cb : t; + } + setProgress(t) { + this.cacheWidths(); + const i = this.getComputedTranslation(Object(wi.e)(0, 100, 0, this.Cb, t)); + this.updateUi(i); + } + disableTransition() { + Object(T.a)(this.Bc, d.h.NoTransition); + } + enableTransition() { + Object(T.I)(this.Bc, d.h.NoTransition); + } + Rb(t) { + this.disableTransition(), this.setProgress(t), Object(T.i)(this.Lb), this.enableTransition(); + } + forceStartState() { + this.Rb(this.Mb); + } + forceEndState() { + this.Rb(this.Eb); + } + initComponent() { + this.cacheWidths(); + } + destroy() { + super.destroy(); + } + } + class Ae extends _e { + constructor(t, i, e, s, n = (() => { + return !1; + })()) { + super(t, i, e, s, n), this.Bb = 0, this.Nh = null, this.Db = !1, this.eventList = [ + xt[xt.DraggingStart], + xt[xt.DraggingStopped] + ], this.Fb = t => { + this.cacheWidths(), this.Vb(this.Ub(t)), this.Qn ? this.Bc.addEventListener(this.$b, this.Nb) : this.js.addEventListenerOnGlobal(this.$b, this.Nb), this.onDragStart(); + }, this.Nb = t => { + null === this.Nh && (this.Db || (this.Db = !0, this.disableTransition()), this.Nh = this.js.requestAnimationFrameHelper(() => { + const i = this.Hb + (this.Ub(t) - this.qb); + this.isValidTranslation() && this.zb(i), this.Nh = null; + })); + }, this.Wb = t => { + t.stopPropagation(), this.Qn ? this.Bc.removeEventListener(this.$b, this.Nb) : this.js.removeEventListenerOnGlobal(this.$b, this.Nb), this.Db = !1, this.enableTransition(), this.onDragEnd(); + }, this.$b = n ? 'touchmove' : 'mousemove'; + } + cacheDomElements() { + super.cacheDomElements(), this.Gb = this.Bc.getElementsByClassName('cnx-progress-handle')[0]; + } + cacheWidths() { + super.cacheWidths(), this.Bb = this.Gb.getBoundingClientRect().width / 2; + } + updateUi(t) { + super.updateUi(t); + const i = this.getComputedTranslation(t); + this.Gb.style.transform = `translateX(${ i - this.Bb }px)`; + } + onDragEnd() { + this.mediator.publish(this, xt[xt.DraggingStopped]); + } + onDragStart() { + this.mediator.publish(this, xt[xt.DraggingStart]); + } + Ub(t) { + return this.Qn ? t.touches.item(0).clientX : t.clientX; + } + Vb(t) { + this.Hb = t - this.Tb, this.qb = t, this.zb(this.Hb); + } + zb(t) { + if (this.isValidTranslation()) { + const i = this.getComputedTranslation(t), e = 0, s = this.Cb, n = 0, r = 100; + this.updateUi(i), this.onProgressChange(Object(wi.e)(e, s, n, r, i)); + } + } + setProgress(t) { + super.setProgress(t); + } + initComponent() { + super.initComponent(); + const t = { + interactionstart: this.Fb, + interactionend: this.Wb + }; + this.hc.register(this.Bc, this, this.hc, t); + } + destroy() { + super.destroy(); + } + } + class Ie extends Ae { + constructor(t, i, e, s, n = (() => { + return !1; + })()) { + super(t, i, e, s, n), this.Jb = !1, this.Qb = t => { + Object(T.a)(this.Bc, d.h.HoverEnd), this.Jb = !0; + }, this.Xb = t => { + const i = this.getComputedTranslation(t.clientX - this.Tb); + this.Yb.style.transform = `translateX(${ i }px)`; + }, this.Kb = t => { + this.Yb.style.transform = 'translateX(0)', this.Jb = !1, this.Zb(); + }, this.eventList = this.eventList.concat([ + xt[xt.Seek], + xt[xt.SeekingStart], + xt[xt.SeekingStopped] + ]); + } + onProgressChange(t) { + this.mediator.publish(this, xt[xt.Seek], { payload: t - 0.1 }); + } + onDragEnd() { + super.onDragEnd(), this.mediator.publish(this, xt[xt.SeekingStopped]), this.Zb(); + } + onDragStart() { + super.onDragStart(), this.mediator.publish(this, xt[xt.SeekingStart]); + } + Zb() { + this.Jb || this.Db || Object(T.I)(this.Bc, d.h.HoverEnd); + } + initComponent() { + super.initComponent(), this.Bc.addEventListener('mousemove', this.Xb), this.Bc.addEventListener('mouseenter', this.Qb), this.Bc.addEventListener('mouseleave', this.Kb), this.Yb = this.Bc.getElementsByClassName('cnx-progress-follow')[0]; + } + hide() { + Object(T.u)(this.Bc); + } + show() { + Object(T.O)(this.Bc); + } + destroy() { + super.destroy(), this.Bc.removeEventListener('mousemove', this.Xb), this.Bc.removeEventListener('mouseenter', this.Qb), this.Bc.removeEventListener('mouseleave', this.Kb); + } + } + var Ce = e(90), Te = e.n(Ce); + class Pe extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.hide(); + } + show() { + Object(T.O)(this.Bc); + } + hide() { + Object(T.u)(this.Bc); + } + } + var Me, Ee = e(91), Le = e.n(Ee), Re = e(53), Be = e.n(Re), De = e(92), Fe = e.n(De); + !function (t) { + t[t.SimpleMenuItem = 0] = 'SimpleMenuItem', t[t.ToggleMenuItem = 1] = 'ToggleMenuItem', t[t.SubmenuMenuItem = 2] = 'SubmenuMenuItem'; + }(Me || (Me = {})); + class Ve extends Ji { + constructor(t, i, e, s, n, r, h, a) { + super(t, i, e, s, a), this.eventName = n, this.tv = r, this.ev = h, this.sv = [], this.eventList = [ + xt[xt.RebindComponent], + ht.a[ht.a.HoldStart], + ht.a[ht.a.HoldEnd], + xt[xt.ContextMenuOpen], + xt[xt.ContextMenuClose] + ], this.nv = !1, this.rv = 10, this.hv = t => { + this.av.removeChild(t.target), this.av.style.width = `${ this.Bc.clientWidth }px`; + }, this.close = t => { + t && Object(Li.h)(t.target, d.g.ContextController, this.rv) || !1 !== this.isOpen && (this.nv && (this.mediator.publish(this, ht.a[ht.a.HoldEnd]), Object(T.I)(this.ev, d.h.OnHold), this.nv = !1), this.isOpen = !1, this.mediator.publish(this, xt[xt.ContextMenuClose]), Object(T.a)(this.Bc, d.h.Invisible), this.hc.removeGlobalActions(this.Bc), this.closeAllSubmenuItems()); + }, this.close(), this.cacheCoordinates(), this.eventList.push(this.eventName), this.av = this.Bc.getElementsByClassName(d.k.Container)[0], this.ov = this.js.createElementByString(``), this.av.appendChild(this.ov), Object(T.a)(this.av, d.g.ContextController); + } + addNewItemsEvent(t) { + const i = t.filter(t => { + return !Object(l.g)(t, this.eventList); + }); + i.length > 0 && (this.eventList = [ + ...this.eventList, + ...i + ], this.mediator.publish(this, xt[xt.RebindComponent], { payload: this.tv })); + } + cacheCoordinates() { + this.lb = this.js.getElementCoordinates(this.ev); + } + positionContextMenu(t) { + this.cacheCoordinates(), Gi(this.Bc, t, this.lb, { + alignMiddle: this.alignMiddle, + alignTop: this.alignTop, + forceRight: this.forceRight + }); + } + cv(t) { + switch (t.type) { + case Me.SimpleMenuItem: + this.close(); + break; + case Me.SubmenuMenuItem: + this.uv(t); + } + } + sendEvent(t, i) { + this.mediator.publish(this, t, i); + } + uv(t) { + const i = this.Bc.clientWidth; + t.isOpen ? (t.$menuContainer.addEventListener('transitionend', this.hv), this.ov.style.left = '0px', t.$menuContainer.style.left = '0px') : (t.$menuContainer.removeEventListener('transitionend', this.hv), this.av.style.width = `${ 2 * i }px`, this.av.appendChild(t.$menuContainer), Object(T.i)(this.av), this.ov.style.left = `${ -i }px`, t.$menuContainer.style.left = `${ -i }px`), t.isOpen = !t.isOpen; + } + closeAllSubmenuItems() { + this.sv.forEach(t => { + t.type === Me.SubmenuMenuItem && t.isOpen && this.uv(t); + }); + } + buildContextMenu(t) { + let i = []; + this.ov.innerHTML = '', this.av.style.width = `${ this.Bc.clientWidth }px`, this.sv.forEach(t => { + return this.unsubscribeAll(t); + }), this.sv = t, this.sv.forEach(t => { + i = [ + ...i, + ...t.eventList + ], t.eventList.forEach(i => { + return this.subscribe(i, t, e => { + this.cv(t), this.sendEvent(i, e); + }); + }), t.initComponent(), this.ov.appendChild(t.getContainer()); + }), this.addNewItemsEvent(i); + } + getAnchorCoordinatesTo(t) { + var i; + return null === (i = t) || void 0 === i ? void 0 : i.getCoordinates(); + } + open(t, i = (() => { + return !1; + })()) { + i && (this.nv = i, this.mediator.publish(this, ht.a[ht.a.HoldStart]), Object(T.a)(this.ev, d.h.OnHold)), this.isOpen = !0, this.mediator.publish(this, xt[xt.ContextMenuOpen]), this.positionContextMenu(t); + const e = { interactionend: this.close }; + this.hc.addGlobalActions(this.Bc, e), Object(T.I)(this.Bc, d.h.Invisible); + } + } + class Ue extends Qi { + constructor(t, i, e, s, n) { + super(t, i, e, Ue.getTemplate(n), s), this.mediator = t, this.mc = !1, this.type = Me.SimpleMenuItem, this.eventList = [], this.event = n.activeEvent, this.name = n.name, n.eventList ? this.eventList = n.eventList : this.eventList.push(this.event), this.lv = this.Bc.getElementsByClassName(d.k.ItemTitle)[0], this.dv = this.Bc.getElementsByClassName(d.k.ItemIcon)[0]; + } + static getTemplate(t) { + const i = `${ t.icon }`, e = `${ t.label }`; + return `\n ${ t.icon ? i : '' }\n ${ t.name }\n ${ t.label ? e : '' }\n `; + } + onClickHandler(t) { + this.mediator.publish(this, this.event); + } + changeItemName(t) { + this.lv.innerHTML = t; + } + changeItemIcon(t) { + this.dv.innerHTML = t; + } + get isActive() { + return this.mc; + } + set isActive(t) { + this.mc = t, this.mc ? Object(T.a)(this.Bc, d.h.Active, d.f.AccentColor) : Object(T.I)(this.Bc, d.h.Active, d.f.AccentColor); + } + } + var $e = e(54), Ne = e.n($e), He = e(21); + class qe extends Ve { + constructor() { + super(...arguments), this.alignMiddle = !1, this.alignTop = !1, this.forceRight = !0; + } + fv() { + const t = He.a.version ? `V${ He.a.version }` : 'dev', i = [new Ue(this, this.js, this.hc, this.Qn, { + activeEvent: xt[xt.AboutClick], + name: 'About Connatix', + icon: Ne.a, + label: t + })]; + this.buildContextMenu(i); + } + initComponent() { + this.fv(); + } + onResize() { + this.cacheCoordinates(), this.close(); + } + } + class ze extends be { + constructor(t, i, e, s, n) { + super(t, i, e, ze.getTemplate(n), d.h.Active, n.defaultState, s), this.mediator = t, this.eventList = [], this.type = Me.ToggleMenuItem, { + eventOn: this.pv, + eventOff: this.bv + } = n, this.eventList.push(this.pv, this.bv); + } + static getTemplate(t) { + const i = `${ t.icon }`; + return `\n ${ t.icon ? i : '' }\n ${ t.name }\n \n \n \n \n \n `; + } + onStateChange() { + this.mediator.publish(this, this.isActive ? this.pv : this.bv); + } + get tooltip() { + return ''; + } + } + const We = { + ContextAbout: 'About Connatix', + ContextQuality: 'Video Settings', + ContextCaption: 'Closed Caption' + }; + class Ge extends Ve { + constructor(t, i, e, s, n, r, h, a, o, c = (() => { + return !0; + })()) { + super(t, i, e, s, n, r, h, o), this.alignMiddle = !1, this.alignTop = !1, this.forceRight = !1, this.vv = [new Ue(this, this.js, this.hc, this.Qn, { + activeEvent: xt[xt.AboutClick], + name: We.ContextAbout, + icon: Ne.a, + label: He.a.version ? `V${ He.a.version }` : 'dev' + })], this.mv = new ze(this, this.js, this.hc, this.Qn, { + eventOff: xt[xt.CaptionOff], + eventOn: xt[xt.CaptionOn], + defaultState: c, + name: We.ContextCaption, + icon: ge.a + }), this.gv = [this.mv], this.yv = a; + } + wv() { + let t = this.vv; + this.yv === d.r.Lg && (t = [ + ...this.gv, + ...this.vv + ]), this.buildContextMenu(t); + } + initComponent() { + this.wv(); + } + onResize(t, i) { + this.isOpen && this.positionContextMenu(t), this.yv !== i ? (this.yv = i, this.closeAllSubmenuItems(), this.wv()) : this.yv = i; + } + toggleCaptionState(t) { + this.mv.isActive !== t && (this.mv.isActive = t); + } + hideCaptionOption() { + this.mv.hideComponent(); + } + showCaptionOption() { + this.mv.showComponent(); + } + getAnchorCoordinatesTo(t) { + let i = zi.Right; + return this.yv !== d.r.Xl && this.yv !== d.r.Xxl && (i |= zi.Top), t.getCoordinates(i); + } + } + function Je(t) { + try { + return Object.keys(t).reduce((i, e) => { + return Object.assign(Object.assign({}, i), { [e]: Object(rt.h)(t[e]) && t[e].includes('%%') ? void 0 : t[e] }); + }, {}); + } catch (i) { + return Object(n.a)({ + message: 'sanitizeDfpMacros_error', + exception: i.message, + callStack: i.stack, + level: h.ProtoLoggingLevelEnum.WARNING + }), Object.keys(t).reduce((i, e) => { + return Object.assign(Object.assign({}, i), { [e]: Object(rt.h)(t[e]) && t[e].indexOf('%%') > -1 ? void 0 : t[e] }); + }, {}); + } + } + class Qe extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.Ov = this.Bc.getElementsByClassName(d.e.CaptionContainer)[0]; + } + updateCaptions(t) { + var i, e; + this.Ov.innerHTML = t && t.text ? (i = t.text, e = '
', i.replace(/(?:\r\n|\r|\n)/g, e)) : ''; + } + } + var Xe = e(93), Ye = e.n(Xe); + class Ke extends xe { + constructor() { + super(...arguments), this.xv = 'cnx-logo-height', this.Sv = 'cnx-logo-width'; + } + createLogo() { + this.Bc.onload = () => { + this.Bc.style.visibility = 'visible', this.resizeLogo(this.Bc); + }, this.Bc.style.visibility = 'hidden', this.Bc.src = this.settings.logoUrl; + } + resizeLogo(t) { + const i = t.naturalWidth, e = t.naturalHeight; + return i && e ? (i > e ? Object(T.a)(t, this.Sv) : Object(T.a)(t, this.xv), t) : t; + } + } + var Ze = e(94), ts = e.n(Ze), is = e(95), es = e.n(is); + class ss extends Ae { + constructor(t, i, e, s, n = (() => { + return !1; + })()) { + super(t, i, e, s, n), this.jv = 80, this.fixedRailWidth = this.jv, this.eventList.push(xt[xt.Volume]); + } + onProgressChange(t) { + this.mediator.publish(this, xt[xt.Volume], { payload: t }); + } + } + var ns = e(96), rs = e.n(ns), hs = e(97), as = e.n(hs); + function os(t, i, e) { + const s = e ? g[g.Auto] : i.height.toString(); + t.forEach(t => { + return t.name.indexOf(s) > -1 ? t.isActive = !0 : t.isActive = !1; + }); + const n = t.find(t => { + return g[t.event] === g.Auto; + }); + if (e) { + const e = t.find(t => { + return t.event === i.height.toString(); + }); + if (e) { + const t = `${ n.name } (${ e.name })`; + n.changeItemName(t); + } + } else + n.changeItemName(n.name); + } + class cs extends Ve { + constructor() { + super(...arguments), this.alignMiddle = !0, this.alignTop = !0, this.forceRight = !1, this.kv = [], this._v = { + height: 360, + quality: g.Auto + }, this.Av = !0; + } + sendEvent(t) { + this.Av = g[t] === g.Auto, this.mediator.publish(this, this.eventName, { + payload: { + height: this.Av ? this._v.height : parseInt(t, 10), + quality: this.Av ? g.Auto : g.Strict + } + }); + } + initComponent() { + } + createQualityMenu(t) { + this.kv = [], this.Iv = t, this.Iv.forEach(t => { + this.kv.push(new Ue(this, this.js, this.hc, this.Qn, { + name: `${ t.videoHeight }p`, + activeEvent: t.videoHeight.toString(), + label: t.isHD ? 'HD' : void 0 + })); + }), this.kv.push(new Ue(this, this.js, this.hc, this.Qn, { + name: g[g.Auto], + activeEvent: g[g.Auto] + })), os(this.kv, this._v, this.Av), this.buildContextMenu(this.kv); + } + onResize(t) { + this.cacheCoordinates(), this.isOpen && this.positionContextMenu(t); + } + updateQuality(t) { + Object(l.h)(this.Iv) && (this.Av = t.quality === g.Auto, this._v.quality = t.quality, this._v.height = Object(wi.b)(t.height, this.Iv.map(t => { + return t.videoHeight; + })), os(this.kv, this._v, this.Av)); + } + } + var us = e(98), ls = e.n(us); + class ds extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.hide(); + } + show() { + Object(T.O)(this.Bc), Object(T.i)(this.Bc), Object(T.a)(this.Bc, d.h.Active); + } + hide() { + Object(T.I)(this.Bc, d.h.Active), Object(T.u)(this.Bc); + } + } + class fs extends Yi { + constructor(t, i, e, s, n, r, h) { + super(t, i, e, s, n), this.tooltip = h, this.Cv = qi[r], this.eventList.push(this.Cv); + } + onClickHandler() { + this.mediator.publish(this, this.Cv); + } + } + class ps extends Qi { + constructor(t, i, e, s, n, r, h) { + super(t, i, e, s, n), this.tooltip = h, this.eventList = [], this.Cv = qi[r], this.eventList.push(this.Cv); + } + onClickHandler() { + this.mediator.publish(this, this.Cv); + } + } + class bs { + constructor(t, i, e, s) { + this.js = t, this.hc = i, this.Qn = e, this.Tv = new Map(), Object.keys(s).forEach(t => { + return this.Pv(qi[t], s[t]); + }); + } + getButton(t, i) { + const { + isHoverable: e, + template: s, + tooltip: n + } = this.Mv(t); + return e ? new fs(i, this.js, this.hc, s, this.Qn, t, n) : new ps(i, this.js, this.hc, s, this.Qn, t, n); + } + isGeneralComponent(t) { + return this.Tv.has(t); + } + Mv(t) { + return this.Tv.get(t); + } + Pv(t, i) { + this.Tv.set(t, i); + } + } + var vs = e(99), ms = e.n(vs); + function gs(t, i, e = (() => { + return !0; + })()) { + return e ? `\n \n \n ${ i }\n \n \n `.trim() : `${ i }`; + } + var ys = e(59), ws = e.n(ys), Os = e(100), xs = e.n(Os); + var Ss = { + [qi[qi.MoreButton]]: { + template: gs(qi.MoreButton, xs.a), + tooltip: 'More', + isHoverable: !0 + }, + [qi[qi.CloseButton]]: { + template: gs(qi.CloseButton, ms.a), + tooltip: 'Close Player', + isHoverable: !0 + }, + [qi[qi.UpNextButton]]: { + template: gs(qi.UpNextButton, ws.a), + tooltip: 'Next', + isHoverable: !0 + }, + [qi[qi.PreviousButton]]: { + template: gs(qi.PreviousButton, ws.a), + tooltip: 'Previous', + isHoverable: !0 + } + }; + const js = 'Ad'; + class ks extends Yi { + constructor() { + super(...arguments), this.eventList = [ + xt[xt.SkipAd], + ...this.eventList + ], this.Ev = -1, this.Lv = -1; + } + initComponent() { + super.initComponent(), this.hideComponent(), this.Rv = this.Bc.getElementsByTagName('cnx-span')[0], this.Rv.innerHTML = js, this.Bv = this.Bc.querySelectorAll(`.${ d.p.Timer } svg`)[0]; + } + setSecondsUntilSkip(t) { + this.Ev = Math.ceil(t), this.Lv = -1, this.Ev > 0 && Object(T.N)(this.Bv, { 'animation-duration': this.Ev + 's' }); + } + tickDown(t) { + const i = this.Ev - Math.floor(t); + if (i < 0 || 0 === this.Lv) + return; + const e = Object(T.t)(this.Bc, d.p.InTimer); + this.Lv = i, 0 === this.Lv ? (e && Object(T.I)(this.Bc, d.p.InTimer), this.Rv.innerHTML = js) : (e || Object(T.a)(this.Bc, d.p.InTimer), this.Rv.innerHTML = `in ${ this.Lv }s`); + } + get tooltip() { + } + onClickHandler() { + 0 === this.Lv && this.mediator.publish(this, xt[xt.SkipAd]); + } + } + var _s = e(101), As = e.n(_s), Is = e(102), Cs = e.n(Is); + const Ts = 'Loading ad'; + class Ps extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.Dv = this.Bc.getElementsByClassName(d.a.BackgroundImg)[0], this.Fv = this.Bc.getElementsByClassName(d.a.Icon)[0], this.Fv.innerHTML = Cs.a, this.Vv = this.Bc.getElementsByClassName(d.a.ButtonContainer)[0]; + const t = this.Bc.getElementsByClassName(d.a.Button)[0]; + this.Uv = this.js.createElementByString(``), this.Uv.target = kt.c.Blank, this.Uv.appendChild(t), this.Vv.innerHTML = '', this.Vv.appendChild(this.Uv), this.$v = this.Bc.getElementsByClassName(d.a.InfoContainer)[0], this.Nv = this.Bc.getElementsByClassName(d.a.FallbackContainer)[0], this.Hv = this.Bc.getElementsByClassName(d.a.SlotCountText)[0]; + } + setBackgroundImg(t) { + Object(rt.h)(t) ? (Object(T.I)(this.Dv, d.h.DisplayNone), this.Dv.src = t) : Object(T.a)(this.Dv, d.h.DisplayNone); + } + setClickUrl(t) { + if (!Object(rt.h)(t)) + return Object(T.O)(this.Nv), void Object(T.u)(this.$v); + Object(T.O)(this.$v), Object(T.u)(this.Nv), this.Uv.href = t; + } + setFallbackText(t, i) { + const e = t || 1, s = i || 1; + this.Hv.innerHTML = `${ Ts } ${ e }/${ s }`; + } + } + var Ms, Es = e(103), Ls = e.n(Es); + class Rs { + constructor(t, i, e, s = (() => { + return {}; + })(), n = (() => { + return {}; + })()) { + this.js = t, this.hc = i, this.Bc = e, this.Wn = s, this.qv = { + [qi.PlayButton]: t => { + return this.zv(!1, t); + }, + [qi.BigPlayButton]: t => { + return this.zv(!0, t); + }, + [qi.VolumeProgress]: t => { + return new ss(t, this.js, this.hc, rs.a); + }, + [qi.ExpandButton]: t => { + return new ue(t, this.js, this.hc, as.a, this.Wn.isMobile); + }, + [qi.QualityMenu]: t => { + return new cs(t, this.js, this.hc, ls.a, xt[xt.Quality], qi.QualityMenu, this.Bc, this.Wn.isMobile); + }, + [qi.Loader]: t => { + return new ds(t, this.js, this.hc, Be.a); + }, + [qi.SkipAdButton]: t => { + return new ks(t, this.js, this.hc, As.a, this.Wn.isMobile); + }, + [qi.AdLoadingScreen]: t => { + return new Ps(t, this.js, this.hc, Ls.a); + } + }, this.zv = (t, i) => { + return new Ki(i, this.js, this.hc, function (t = (() => { + return !1; + })()) { + return `\n \n \n ${ ts.a }\n ${ es.a }\n \n \n`.trim(); + }(t), this.Wn.isMobile); + }, this.Wv = t => { + return i => { + const e = this.qv[t]; + if (e) + return e(i); + }; + }, this.Gv = new bs(this.js, this.hc, this.Wn.isMobile, Object.assign(Object.assign({}, Ss), n)); + } + createComponent(t, i) { + const e = this.Wv(t)(i); + return e || (this.Gv.isGeneralComponent(t) ? this.Gv.getButton(t, i) : void 0); + } + } + !function (t) { + t[t.Mute = 0] = 'Mute', t[t.Unmute = 1] = 'Unmute'; + }(Ms || (Ms = {})); + class Bs extends Yi { + constructor(t, i, e, s, n, r) { + super(t, i, e, s, r), this.eventList = [ + xt[xt.Mute], + xt[xt.Unmute], + xt[xt.StateChanged], + ...this.eventList + ], this.Jv = 'Mute', this.Qv = 'Unmute', this.zt = n; + } + onClickHandler() { + this.zt === Ms.Mute ? (this.mediator.publish(this, xt[xt.Unmute]), this.setState(Ms.Unmute)) : (this.mediator.publish(this, xt[xt.Mute]), this.setState(Ms.Mute)); + } + qp() { + this.zt === Ms.Mute ? Object(T.L)(this.Bc, 'cnx-sound-on', 'cnx-sound-off') : Object(T.L)(this.Bc, 'cnx-sound-off', 'cnx-sound-on'); + } + get tooltip() { + return this.zt === Ms.Mute ? this.Qv : this.Jv; + } + initComponent() { + super.initComponent(), this.qp(); + } + setState(t) { + this.zt !== t && (this.zt = t, this.qp(), this.mediator.publish(this, xt[xt.StateChanged])); + } + setVolume(t) { + t > 0 ? this.setState(Ms.Unmute) : this.setState(Ms.Mute); + } + } + class Ds extends ne { + constructor(t, i, e, s) { + super(i, e, s), this.mediator = t, this.Bc = this.eb.getRenderedDom(); + } + getContainer() { + return this.Bc; + } + initComponent() { + this.eb.initComponents(); + } + showComponent() { + Object(T.O)(this.Bc); + } + hideComponent() { + Object(T.u)(this.Bc); + } + } + class Fs extends Ds { + constructor(t, i, e, s) { + super(t, i, e, s), this.Xv = null, this.eventList = [ + xt[xt.Volume], + xt[xt.VolumeHoverStart], + xt[xt.VolumeHoverStopped], + xt[xt.DraggingStopped], + xt[xt.DraggingStart], + xt[xt.HoverStart], + xt[xt.HoverEnd], + xt[xt.StateChanged] + ], this.Yv = 0.2, this.Kv = 600, this.Zv = !1, this.tm = t => { + clearTimeout(this.Xv), Object(T.a)(this.Bc, 'cnx-mod-hover'), this.mediator.publish(this, xt[xt.VolumeHoverStart]); + }, this.im = () => { + this.Zv || (null !== this.Xv && clearTimeout(this.Xv), this.Xv = setTimeout(() => { + Object(T.I)(this.Bc, 'cnx-mod-hover'), this.mediator.publish(this, xt[xt.VolumeHoverStopped]); + }, this.Kv)); + }, this.em = this.Yv, this.nm = this.getComponent(qi.VolumeButton), this.rm = this.getComponent(qi.VolumeProgress); + } + handleComponentEvent(t, i, e) { + let s; + switch (t) { + case xt[xt.Volume]: + s = i.payload / 100, this.hm(s), this.am(i.payload); + break; + case xt[xt.Mute]: + s = 0, this.setVolumeProgress(0); + break; + case xt[xt.Unmute]: + s = this.em, this.setVolumeProgress(100 * this.em); + break; + case xt[xt.DraggingStopped]: + this.Zv = !1, this.mediator.publish(this, xt[xt.DraggingStopped]), this.im(); + break; + case xt[xt.DraggingStart]: + this.Zv = !0, this.mediator.publish(this, xt[xt.DraggingStart]); + break; + case xt[xt.HoverStart]: + this.mediator.publish(this, xt[xt.HoverStart], { payload: { targetComponent: e } }); + break; + case xt[xt.HoverEnd]: + this.mediator.publish(this, xt[xt.HoverEnd], { payload: { targetComponent: e } }); + break; + case xt[xt.StateChanged]: + this.mediator.publish(this, xt[xt.StateChanged], { payload: { targetComponent: e } }); + } + void 0 !== s && this.om(s); + } + hm(t) { + t < this.Yv ? this.em = this.Yv : this.em = t; + } + om(t) { + this.mediator.publish(this, xt[xt.Volume], { payload: t }); + } + am(t) { + 0 === t ? this.nm.setState(Ms.Mute) : this.nm.setState(Ms.Unmute); + } + setVolumeProgress(t) { + this.rm.setProgress(t); + } + initComponent() { + super.initComponent(), this.Bc.addEventListener('mouseenter', this.tm), this.Bc.addEventListener('mouseleave', this.im); + } + setVolume(t) { + const i = 100 * t; + this.am(i), this.setVolumeProgress(i); + } + destroy() { + super.destroy(), this.Bc.removeEventListener('mouseenter', this.tm), this.Bc.removeEventListener('mouseleave', this.im); + } + } + var Vs = `\n \n \n [[${ qi.VolumeButton }]]\n \n \n [[${ qi.VolumeProgress }]]\n \n \n`.trim(), Us = e(104), $s = e.n(Us), Ns = e(105), Hs = e.n(Ns); + var qs = { + [qi[qi.ShareButton]]: { + template: gs(qi.ShareButton, Hs.a), + tooltip: 'Share', + isHoverable: !0 + }, + [qi[qi.CastButton]]: { + template: gs(qi.CastButton, $s.a), + tooltip: 'Cast', + isHoverable: !0 + } + }, zs = e(106), Ws = e.n(zs), Gs = e(107), Js = e.n(Gs), Qs = e(108), Xs = e.n(Qs); + const Ys = 90 * qt.g, Ks = 'This live stream will start shortly', Zs = 'This live stream is not currently available. Please check again shortly', tn = 'Live stream not supported by browser'; + class en extends Ji { + constructor() { + super(...arguments), this.eventList = [], this.cm = null; + } + initComponent() { + this.um = this.js.createElementByString(''), this.Bc.appendChild(this.um), this.lm = this.Bc.getElementsByTagName('cnx-span')[0], this.dm = this.Bc.getElementsByClassName('cnx-live-message')[0], this.fm = this.Bc.getElementsByClassName('cnx-live-icon')[0]; + } + setPosterSrc(t) { + Object(rt.h)(t) && (this.um.src = t); + } + setPosterAltText(t) { + this.um.alt = t; + } + setIconToStarting() { + this.fm.innerHTML = `${ Js.a }`; + } + setIconToEnded() { + this.fm.innerHTML = `${ Xs.a }`; + } + setMessageToStarting() { + this.pm(Ks); + } + setMessageToEnded() { + this.pm(Zs); + } + setMessageToNotSupported() { + this.pm(tn); + } + handleDelayedStart(t) { + Object(rt.e)(Date.parse(t)) && (this.bm = new Date(t), this.vm() > 0 && (this.mm(), clearInterval(this.cm), this.cm = setInterval(() => { + this.mm(); + }, qt.f * qt.g))); + } + showMessage() { + Object(T.O)(this.fm), Object(T.O)(this.dm); + } + hideMessage() { + Object(T.u)(this.fm), Object(T.u)(this.dm); + } + show() { + Object(T.O)(this.Bc), Object(T.a)(this.Bc, d.h.Active); + } + hide() { + Object(T.I)(this.Bc, d.h.Active), Object(T.u)(this.Bc); + } + destroy() { + super.destroy(), clearInterval(this.cm); + } + mm() { + const t = this.vm(); + if (t > 0) { + const i = this.gm(t); + this.pm(`Live in ${ i }`); + } else + this.pm(Ks), clearInterval(this.cm), this.cm = null; + } + vm() { + return (Math.max(this.bm.getTime(), Date.now()) - Date.now()) / qt.f; + } + gm(t) { + const i = t >= Ys ? Math.round(t / (qt.g * qt.c)) : Math.ceil(t / qt.g); + return `${ i } ${ t >= Ys ? 'hours' : `minute${ 1 === i ? '' : 's' }` }`; + } + pm(t) { + this.lm.innerHTML = t; + } + } + var sn = e(109), nn = e.n(sn); + class rn extends Ji { + constructor() { + super(...arguments), this.eventList = []; + } + initComponent() { + this.hideComponent(); + } + } + var hn, an = e(110), on = e.n(an); + class cn extends Rs { + constructor(t, i, e, s, n) { + super(t, i, e, s, qs), this.js = t, this.Bc = e, this.Wn = s, this.ym = n, this.wm = { + [qi.VolumeControls]: t => { + return new Fs(t, this.js, Vs, this); + }, + [qi.VolumeButton]: t => { + return new Bs(t, this.js, this.hc, Ws.a, Ms.Mute, this.Wn.isMobile); + }, + [qi.SettingsButton]: t => { + return new de(t, this.js, this.hc, pe.a, this.Wn.isMobile); + }, + [qi.CaptionButton]: t => { + return new ve(t, this.js, this.hc, ge.a, d.h.Active, this.Wn.closedCaptionDefault, this.Wn.isMobile); + }, + [qi.UpNextBox]: t => { + return new Oe(t, this.js, this.hc, we.a, this.Wn.isMobile); + }, + [qi.LogoComponent]: t => { + if (!Object(rt.a)(this.Wn.logoUrl) && !Object(rt.a)(this.Wn.logoPosition)) + throw new Error('custom logo is undefined'); + return new xe(t, this.js, this.hc, '', { + logoUrl: this.Wn.logoUrl, + logoPosition: this.Wn.logoPosition + }); + }, + [qi.LogoOutstream]: t => { + if (!Object(rt.a)(this.Wn.logoUrl) && !Object(rt.a)(this.Wn.logoPosition)) + throw new Error('outstream logo undefined'); + return new Ke(t, this.js, this.hc, '', { logoUrl: this.Wn.logoUrl }); + }, + [qi.LivePoster]: t => { + return new en(t, this.js, this.hc, nn.a); + }, + [qi.LiveIcon]: t => { + return new rn(t, this.js, this.hc, on.a); + }, + [qi.ElapsedTimeLabel]: t => { + return new Se(t, this.js, this.hc, ke.a); + }, + [qi.TotalDurationLabel]: t => { + return new Se(t, this.js, this.hc, ke.a); + }, + [qi.ProgressBar]: t => { + return new Ie(t, this.js, this.hc, Te.a, this.Wn.isMobile); + }, + [qi.QueStateOverlay]: t => { + return new Pe(t, this.js, this.hc, Be.a); + }, + [qi.ContextMenu]: t => { + return new qe(t, this.js, this.hc, Le.a, xt[xt.ContextClick], qi.ContextMenu, this.Bc, this.Wn.isMobile); + }, + [qi.ElementsSettingsMenu]: t => { + return new Ge(t, this.js, this.hc, Fe.a, xt[xt.SettingsMenu], qi.ElementsSettingsMenu, this.Bc, this.ym, this.Wn.isMobile, this.Wn.closedCaptionDefault); + }, + [qi.CaptionComponent]: t => { + return new Qe(t, this.js, this.hc, Ye.a); + } + }, this.Om = t => { + return i => { + const e = this.wm[t]; + if (e) + return e(i); + }; + }; + } + createComponent(t, i) { + return this.Om(t)(i) || super.createComponent(t, i); + } + } + !function (t) { + t.InPod = 'cnx-ad-in-pod', t.AdMarkerInPodTextContainer = 'cnx-ad-marker-text', t.CardImage = 'cnx-ad-card-image', t.CardTitle = 'cnx-ad-card-title', t.AdUiContent = 'cnx-ui-ad-content'; + }(hn || (hn = {})); + class un extends le { + constructor(t, i, e, s, n, r, h = (() => { + return {}; + })(), a) { + super(t, n, i, r, a || new cn(i, s, n, h)), this.mediator = t, this.globalDomUtilsService = i, this.pl = e, this.$container = n, this.settings = h, this.rb = { + [y.PlayingState]: new te(this), + [y.PausedState]: new ee(this) + }, this.xm = 0, this.Nh = null, this.jm = t => { + Object(T.Q)(this.$uiContainer, d.g.UiInView, t); + }, this.Ob.setDistanceValues({ + top: 4, + bottom: 4 + }), this.rb[y.PausedState].enterState(), this.km = this.$container.querySelector(`.${ hn.CardImage }`), this._m = this.$container.querySelector(`.${ hn.CardTitle }`), this.Am = this.$container.querySelector(`.${ hn.AdUiContent }`); + } + handleComponentEvent(t, i, e) { + switch (super.handleComponentEvent(t, i, e), t) { + case xt[xt.Volume]: + this.mediator.publish(this, xt[xt.Volume], i); + break; + case xt[xt.Mute]: + this.mediator.publish(this, xt[xt.Mute]); + break; + case xt[xt.Unmute]: + this.mediator.publish(this, xt[xt.Unmute]); + break; + case qi[qi.CloseButton]: + this.mediator.publish(this, xt[xt.Close]); + break; + case xt[xt.Expand]: + this.mediator.publish(this, xt[xt.Expand]); + break; + case xt[xt.Collapse]: + this.mediator.publish(this, xt[xt.Collapse]); + break; + default: + this.mediator.publish(this, t, i); + } + } + updateDuration(t) { + const i = this.getComponent(qi.ProgressBar), e = this.getComponent(qi.TotalDurationLabel), s = this.getComponent(qi.SkipAdButton); + !t && s && (s.setSecondsUntilSkip(0), s.tickDown(0)), t || !i ? (this.elapsedTime = 0, this.duration = t, i && i.setProgress(Object(wi.e)(0, t, 0, 100, 0)), e && e.setTime(t), this.Im(this.xm)) : i.setProgress(100); + } + updateVolume(t) { + const i = this.getComponent(qi.VolumeControls), e = this.getComponent(qi.VolumeButton); + i && i.setVolume(t), e && e.setVolume(t); + } + get elapsedTime() { + return this.xm; + } + set elapsedTime(t) { + this.xm = t, this.Im(this.xm); + } + showSkipAdButton(t) { + const i = this.getComponent(qi.SkipAdButton); + i && (i.showComponent(), i.setSecondsUntilSkip(t)); + } + hideSkipAdButton() { + const t = this.getComponent(qi.SkipAdButton); + t && t.hideComponent(); + } + addPodAdMarker(t, i) { + Object(T.a)(this.$uiContainer, hn.InPod), Object(l.c)(this.$uiContainer.getElementsByClassName(hn.AdMarkerInPodTextContainer)).forEach(e => { + e.innerHTML = `${ t + 1 }/${ i }`; + }); + } + removeAddPodAdMarker() { + Object(T.I)(this.$uiContainer, hn.InPod); + } + Im(t) { + const i = this.getComponent(qi.ElapsedTimeLabel); + i && i.setTime(t); + const e = this.getComponent(qi.SkipAdButton); + e && e.tickDown(t); + } + hideAdLoadingScreen() { + const t = this.getComponent(qi.AdLoadingScreen); + t && t.hideComponent(), Object(T.I)(this.$container, d.g.PodLoadingScreen); + } + showAdLoadingScreen(t, i, e, s) { + const n = this.getComponent(qi.AdLoadingScreen); + n && (n.showComponent(), n.setBackgroundImg(t), n.setClickUrl(i), n.setFallbackText(e, s), Object(T.a)(this.$container, d.g.PodLoadingScreen)); + } + hideAdMarker() { + const t = this.$container.querySelector('.cnx-ad-marker'); + Object(T.u)(t); + } + hideProgressBar() { + this.getComponent(qi.ProgressBar).hideComponent(); + } + setContinueReadingCard(t) { + this.km.style.backgroundImage = `url("${ t.imageSrc }")`, this._m.innerHTML = t.title; + } + cardHasData() { + return Object(rt.h)(this.km.style.backgroundImage) && Object(rt.h)(this._m.innerHTML); + } + showContinueReadingCard(t) { + Object(T.a)(this.$container, d.g.AdShowCard), null === this.Nh && (this.Nh = this.globalDomUtilsService.requestAnimationFrameHelper(() => { + this.Nh = null, Object(T.N)(t, { height: `${ this.Am.clientHeight }px` }); + })); + } + hideContinueReadingCard(t) { + Object(T.I)(this.$container, d.g.AdShowCard), Object(T.K)(t, 'height'); + } + show() { + super.show(), this.pl.on(this.$uiContainer, this.jm, { threshold: 0.5 }); + } + hide() { + super.hide(); + Object(T.Q)(this.$uiContainer, d.g.UiInView, !1), this.pl.off(this.$uiContainer, this.jm); + } + expand() { + this.getComponent(qi.ExpandButton).setState(he.expand); + } + collapse() { + this.getComponent(qi.ExpandButton).setState(he.collapse); + } + } + var ln = e(111), dn = e.n(ln); + class fn { + constructor(t) { + this.showExpandButton = t; + } + get template() { + return `\n \n \n \n ${ dn.a }\n 1/1\n \n [[${ qi.CloseButton }]]\n \n [[${ qi.PlayButton }]]\n [[${ qi.VolumeControls }]]\n [[${ qi.VolumeButton }]]\n \n [[${ qi.SkipAdButton }]]\n ${ this.getExpandTemplate() }\n [[${ qi.ProgressBar }]]\n \n \n \n \n Continue watching\n \n after the ad\n \n \n [[${ qi.AdLoadingScreen }]]\n \n `.trim(); + } + getExpandTemplate() { + return this.showExpandButton ? `[[${ qi.ExpandButton }]]` : ''; + } + } + var pn = e(19); + const bn = 72, vn = 4, mn = 150, gn = 270; + class yn extends o.a { + constructor(t, i, e, s, n, r, h) { + super(), this.mediator = t, this.jr = i, this.Cm = e, this.Tm = s, this.Pm = n, this.Mm = r, this.Zd = h, this.Em = [], this.firstAdShown = !1, this.Hr = !1, this.Lm = 0, this.Rm = !0, this.Bm = !1, this.Dm = !1, this.Fm = Pt.a.Normal, this.Vm = this.getNewAdManager(), this.subscribe(Ut.AdsEnabled, this.Vm, () => { + this.mediator.publish(this, Ut.AdsEnabled); + }); + } + Um(t, i, e) { + this.Vm.initAd(t, i, this.Fm, 1, e, [{ + container: this.$m, + width: t, + height: i, + type: h.ProtoAdType.Video + }]); + } + Nm() { + this.Hm.showSkipAdButton(this.jr.skipAdAfter); + } + qm(t) { + const i = this.Vm.getCurrentAdClickTrackingProperties(); + i && this.Mm.services.TrackingService.trackAdClick(Object.assign(Object.assign({}, i), { type: t })); + } + zm(t) { + if (t.payload.adLoadedData.skipOffset && t.payload.adLoadedData.skipOffset >= 0) + return !1; + const i = this.Vm.getAdDuration(); + switch (this.jr.adSkippability) { + case h.ProtoPlayerAdSkippability.IfLongerThan: + if (t.payload.adSkipMode === h.ProtoAdSkipMode.IfLongerThan31Sec && (i < this.jr.adsMustBeSkippableIfLongerThan || !i) || t.payload.adSkipMode === h.ProtoAdSkipMode.Never) + return !1; + break; + case h.ProtoPlayerAdSkippability.NoRestrictions: + if (t.payload.adSkipMode === h.ProtoAdSkipMode.Never || t.payload.adSkipMode === h.ProtoAdSkipMode.IfLongerThan31Sec && (i < Ht.d || !i)) + return !1; + } + return !0; + } + Wm(t) { + this.Em.filter(i => { + return i !== t; + }).forEach(t => { + Object(T.a)(t, d.h.Hide); + }); + } + Gm() { + this.Em.forEach(t => { + Object(T.I)(t, d.h.Hide); + }); + } + updateFilterConfig(t) { + this.Vm.updateFilterConfig(t); + } + Jm() { + this.Dm = !1, this.Hm.hideAdLoadingScreen(); + } + Qm() { + this.Hm.hideSkipAdButton(); + } + Xm() { + let t; + Object.keys(Pt.b).forEach(i => { + this.subscribe(Pt.b[i], this.Vm, e => { + switch (t = !1, Pt.b[i]) { + case Pt.b.AdLoaded: + const s = e; + this.Bm = this.zm(e), this.Bm && (s.payload.adLoadedData.skipOffset = this.jr.skipAdAfter); + break; + case Pt.b.AdPaused: + this.Hm.changeState(y.PausedState); + break; + case Pt.b.AdPlaying: + this.Hm.changeState(y.PlayingState); + break; + case Pt.b.AdImpression: + this.Ym(e); + break; + case Pt.b.AdSkipped: + this.qm(h.ProtoAdClickTypeEnum.AdSkipClick), this.Gm(), t = !0; + break; + case Pt.b.AdStopped: + case Pt.b.AdError: + this.Gm(), t = !0; + break; + case Pt.b.AdClickThru: + this.qm(h.ProtoAdClickTypeEnum.AdClickThrough); + } + this.Rm && this.mediator.publish(this, Pt.b[i], e), this.Rm = !0, t && (this.Hr = !1, this.Hm.changeState(y.PausedState)); + }); + }), this.subscribe(xt[xt.Volume], this.Hm, ({payload: t}) => { + this.setVolume(t), this.qm(h.ProtoAdClickTypeEnum.VolumeClick); + }), this.subscribe(xt[xt.Play], this.Hm, () => { + this.qm(h.ProtoAdClickTypeEnum.PlayClick), this.play(); + }), this.subscribe(xt[xt.Pause], this.Hm, () => { + this.qm(h.ProtoAdClickTypeEnum.PauseClick), this.pause(); + }), this.subscribe(xt[xt.Close], this.Hm, () => { + this.mediator.publish(this, c.b.UserInteraction, { payload: { playback: !1 } }), this.mediator.publish(this, xt[xt.Close]); + }), this.subscribe(xt[xt.Mute], this.Hm, () => { + this.setVolume(0), this.qm(h.ProtoAdClickTypeEnum.MuteClick); + }), this.subscribe(xt[xt.Unmute], this.Hm, () => { + this.setVolume(1), this.qm(h.ProtoAdClickTypeEnum.UnmuteClick); + }), this.subscribe(Ut.DetachedFromDom, this.Vm, () => { + this.mediator.publish(this, Vt.DetachedFromDom); + }), this.relay(Tt.b.ImpressionPrice, this.Vm, this, this.mediator), this.relay(Tt.b.ImpressionRevenue, this.Vm, this, this.mediator); + } + Ym(t) { + this.Qm(), this.updateContinueReadingCard(), t.payload.adDuration = this.Vm.getAdDuration(), t.payload.adDuration || this.firstAdShown || this.show(), this.firstAdShown = !0, this.Hr = !0, this.Bm && this.Nm(), this.Hm.updateDuration(t.payload.adDuration), this.Hm.changeState(y.PlayingState), this.Km = t.payload.clickThroughUrl, this.Wm(t.payload.selectedAdSlot), this.Pm.getTotalNumberOfSlots() > 1 ? this.Hm.addPodAdMarker(this.Pm.getCurrentSlotIndex(), this.Pm.getTotalNumberOfSlots()) : this.Hm.removeAddPodAdMarker(); + } + Zm(t) { + this.Cm.appendChild(t); + } + tg(t = (() => { + return ''; + })()) { + return this.Mm.services.GlobalDomUtilsService.createElementByString(`
`); + } + ig() { + this.$m = this.tg(), this.Zm(this.$m), this.Em.push(this.$m); + } + eg(t = (() => { + return !1; + })()) { + const i = (e = this.jr, s = this.Mm.config, { + logoUrl: e.logoUrl, + isMobile: s.isMobile, + closeButtonMode: e.closeButtonMode, + floatingCloseButtonMode: e.floatingSettings.floatingCloseButtonMode, + isCloseButton: e.isCloseButton, + uiComponentsVisibility: e.uiComponentsVisibility, + sharingDestinations: e.sharingDestinations + }); + var e, s; + this.Hm = new un(this, this.Mm.services.GlobalDomUtilsService, this.Mm.services.ViewabilityService, this.Mm.services.InteractionService, this.Cm, new fn(t).template, i), this.Hm.hide(); + } + start(t, i, e, s = (() => { + return !1; + })()) { + try { + this.eg(s), this.ig(), this.Um(t, i, e), this.setVolume(e), this.Xm(); + } catch (t) { + Object(n.a)({ + callStack: t.stack, + level: h.ProtoLoggingLevelEnum.FATAL, + exception: t.message, + message: 'adhandler_start' + }); + } + } + getVolume() { + return this.Lm; + } + hide() { + Object(T.I)(this.Cm, d.g.Ad, d.g.AdOverlayType), this.Hm.hide(); + } + show() { + const t = [d.g.Ad], i = this.Vm.getCurrentAdType(); + i === h.ProtoAdType.Overlay && t.push(d.g.AdOverlayType), this.sg = i, Object(T.a)(this.Cm, ...t), this.Hm.show(), this.Hm.updateVolume(this.Lm), this.Jm(); + } + getAdContainerWidth() { + return this.Vm.getAdContainerWidth(); + } + setVolume(t) { + this.Lm = t, this.Vm.setAdVolume(t), this.Hm && this.Hm.updateVolume(t), this.mediator.publish(this, c.b.UserInteraction, { payload: { volume: !0 } }), this.mediator.publish(this, xt[xt.Volume], { payload: { volume: t } }); + } + resizeAd(t, i, e) { + this.setVastViewMode(e), this.updateContinueReadingCard(), this.mediator.publish(this, Vt.AdSlotResized, { + payload: { + width: t, + height: i + } + }); + } + adStateChange(t, i) { + this.Vm.onAdStateChange(t, i); + } + contentChanged() { + this.Vm.onContentChange(); + } + get inImpression() { + return this.Hr; + } + get adInWin() { + return this.Vm.adInWin; + } + get inAdPodLoadingState() { + return this.Dm; + } + resumeWithoutUserInteraction() { + this.Vm.resumeAd(!1); + } + play() { + this.Vm.resumeAd(!0), this.mediator.publish(this, c.b.UserInteraction, { payload: { playback: !0 } }); + } + ng(t) { + if (Object(pn.b)('cnxShowAdCard', this.Mm.config.pageUrl)) + return !0; + let i = !1; + if (t.adType === h.ProtoAdType.Video) { + const e = this.Cm.clientWidth * (t.heightRatio / t.widthRatio); + i = this.Cm.clientHeight - e >= bn + vn; + } + return t.adType === h.ProtoAdType.Overlay && (i = this.Cm.clientHeight - t.height >= bn + vn), i; + } + updateContinueReadingCard() { + const t = this.Vm.getAdMediaSize(); + Object(rt.a)(t) && (this.ng(this.Vm.getAdMediaSize()) ? this.Hm.showContinueReadingCard(this.$m) : this.Hm.hideContinueReadingCard(this.$m)); + } + setContinueReadingCard(t) { + this.Hm.setContinueReadingCard({ + imageSrc: Ni.getSmartCroppedImageUrl(t.imageSrc, gn, mn, this.Zd), + title: t.title + }); + } + pause() { + this.Vm.pauseAd(!0), this.mediator.publish(this, c.b.UserInteraction, { payload: { playback: !1 } }); + } + stopAd(t) { + const i = () => { + this.mediator.publish(this, Pt.b.AdStopped), this.Rm = !1; + }; + this.Vm && this.inImpression ? (i(), this.Vm.stopAd(t)) : this.inAdPodLoadingState && i(); + } + skipAd() { + this.Vm && this.inImpression ? this.Vm.skipAd() : this.Dm && (this.mediator.publish(this, Pt.b.AdSkipped), this.Jm()); + } + userInteraction(t) { + this.Vm.userInteraction(t); + } + enableAds() { + this.Vm.enableAds(); + } + enterAdPodLoadingState() { + this.Dm = !0; + const { + width: t, + height: i + } = this.Vm.getLastAdSlot(this.sg); + this.Hm.showAdLoadingScreen(Ni.getSmartCroppedImageUrl(this.rg, t, i, this.Zd), this.Km, this.Pm.getNextSlotIndex(), this.Pm.getTotalNumberOfSlots()); + } + setAdLoadingBackgroundUrl(t) { + this.rg = t; + } + updatePodRemainingTime(t) { + this.Vm.updatePodRemainingTime(t); + } + newAdOpportunity() { + this.Vm.newAdOpportunity(); + } + disableAds(t) { + this.Vm.disableAds(t); + } + setVastViewMode(t) { + this.Fm = t, this.Vm.setVastViewMode(t); + } + destroy() { + var t, i, e; + null === (t = this.Vm) || void 0 === t || t.disableAds(gi.Unknown), null === (i = this.Hm) || void 0 === i || i.destroy(), null === (e = this.Vm) || void 0 === e || e.destroy(); + } + } + var wn, On = e(28); + !function (t) { + t.AppNexus = 'appnexus', t.DistrictM = 'districtm', t.IndexExchange = 'ix', t.Lkqd = 'lkqd', t.OneVideo = 'oneVideo', t.OpenX = 'openx', t.Pubmatic = 'pubmatic', t.RhythmOne = 'rhythmone', t.Rubicon = 'rubicon', t.SpotX = 'spotx', t.Telaria = 'telaria', t.MediaNet = 'medianet', t.Adman = 'adman', t.IronSource = 'ironsource', t.Undertone = 'undertone', t.SynacorMedia = 'synacormedia', t.AmxRTB = 'amx', t.Smaato = 'smaato', t.SmartAdServer = 'smartadserver'; + }(wn || (wn = {})); + const xn = { + [wn.Lkqd]: On.c.Lkqd, + [wn.RhythmOne]: On.c.RhythmOne, + [wn.Telaria]: On.c.Telaria, + [wn.IronSource]: On.c.IronSource, + [wn.Undertone]: On.c.Undertone, + [wn.SynacorMedia]: On.c.SynacorMedia + }, Sn = [ + wn.AppNexus, + wn.DistrictM, + wn.IndexExchange, + wn.OneVideo, + wn.OpenX, + wn.Pubmatic, + wn.RhythmOne, + wn.Rubicon, + wn.SpotX, + wn.Telaria, + wn.MediaNet, + wn.Adman, + wn.IronSource, + wn.Undertone, + wn.AmxRTB, + wn.Smaato, + wn.SmartAdServer + ], jn = [ + wn.AppNexus, + wn.DistrictM, + wn.IndexExchange, + wn.OneVideo, + wn.OpenX, + wn.Pubmatic, + wn.RhythmOne, + wn.Rubicon, + wn.SpotX, + wn.Telaria, + wn.MediaNet, + wn.Adman, + wn.AmxRTB, + wn.Smaato, + wn.SmartAdServer + ], kn = [ + wn.OneVideo, + wn.IndexExchange, + wn.Rubicon, + wn.Pubmatic, + wn.SpotX, + wn.AppNexus, + wn.DistrictM, + wn.OpenX, + wn.MediaNet, + wn.Adman, + wn.IronSource, + wn.Undertone, + wn.SynacorMedia, + wn.AmxRTB, + wn.Smaato, + wn.SmartAdServer + ], _n = 'https://prebid.adnxs.com/pbc/v1/cache', An = 180, In = '//cds.connatix.com/p/plugins/prebid4.43.0-1.js', Cn = [ + 'video/mp4', + 'video/webm', + 'application/javascript', + 'video/ogg', + 'video/mpeg' + ], Tn = { + VAST_1: 1, + VAST_2: 2, + VAST_3: 3, + VAST_1_WRAPPER: 4, + VAST_2_WRAPPER: 5, + VAST_3_WRAPPER: 6, + VAST_4: 7, + VAST_4_WRAPPER: 8 + }, Pn = 1, Mn = { + VPAID_1: 1, + VPAID_2: 2 + }, En = 2, Ln = 41; + function Rn(t) { + return (t + Ln) * En; + } + function Bn(t) { + return t / En - Ln; + } + class Dn { + constructor() { + this.hg = Date.now(), this.ag = { advertiser: {} }; + } + addPrebid(t) { + Object(rt.a)(this.ag.advertiser[t]) || this.og(t), this.ag.advertiser[t].prebidData.push({ timestamp: Date.now() }); + } + addBid(t, i) { + Object(rt.a)(this.ag.advertiser[t]) || this.og(t), this.ag.advertiser[t].bidsFloorPriceList.push({ + timestamp: Date.now(), + floorPrice: i + }); + } + addImpression(t, i) { + Object(rt.a)(this.ag.advertiser[t]) || this.og(t), this.ag.advertiser[t].impressionRevenueList.push({ + timestamp: Date.now(), + obfuscatedPrice: i + }); + } + shouldRequestLineItem(t) { + const i = Date.now(); + return !(this.cg(i, 3) && this.ug(t, i, 5) < -0.5 && this.dg(t, i, 3) >= 11.5 && this.fg(t, i, 10, 0.1) < 0.35); + } + cg(t, i) { + return t - this.hg >= i * qt.e; + } + ug(t, i, e) { + const s = this.ag.advertiser[t]; + if (!Object(rt.a)(s)) + return -1; + const n = this.pg(s.impressionRevenueList, i, e).map(t => { + return t.obfuscatedPrice; + }); + let r = 0; + return Object(l.h)(n) && (r = n.reduce((t, i) => { + return t + Rn(i); + })), this.bg(r); + } + dg(t, i, e) { + const s = this.ag.advertiser[t]; + if (!Object(rt.a)(s)) + return -1; + const n = this.pg(s.prebidData, i, e).length; + return this.bg(n); + } + fg(t, i, e, s) { + const n = this.ag.advertiser[t]; + if (!Object(rt.a)(n)) + return -1; + const r = this.pg(n.impressionRevenueList, i, e).map(t => { + return t.floorPrice; + }), h = this.vg(r, s); + return this.bg(h); + } + pg(t, i, e) { + const s = i - qt.f, n = i - e * qt.e, r = []; + for (let i = t.length - 1; i >= 0 && t[i].timestamp >= n; i--) + t[i].timestamp <= s && r.push(t[i]); + return r; + } + bg(t) { + return 0 === t ? -1 : t; + } + og(t) { + this.ag.advertiser[t] = { + prebidData: [], + bidsFloorPriceList: [], + impressionRevenueList: [] + }; + } + vg(t, i) { + if (0 === t.length) + return 0; + if (i <= 0) + return t[0]; + if (i >= 1) + return t[t.length - 1]; + const e = ((t = t.sort((t, i) => { + return t - i; + })).length - 1) * i, s = Math.floor(e), n = s + 1, r = e % 1; + return n >= t.length ? t[s] : t[s] * (1 - r) + t[n] * r; + } + } + class Fn { + constructor() { + this.mg = new Set(); + } + addPlatformCappedLineItemIdList(t) { + t.forEach(t => { + Object(rt.h)(t) && this.mg.add(t); + }); + } + isLineItemPlatformCapped({ + advertiserLineItemId: t, + publisherLineItemId: i + }) { + return this.mg.has(t) || this.mg.has(i); + } + } + class Vn { + constructor() { + this.gg = new ji(), this.yg = new ji(), this.wg = new ji(), this.Og = new ji(), this.xg = new ji(), this.Sg = new ji(), this.callingLineItems = [], this.bids = [], this.bidsLoading = [], this.bidsReady = [], this.bidStarted = null; + } + get onBid() { + return this.gg.asObservable(); + } + get onBidConsumed() { + return this.yg.asObservable(); + } + get onBidLoadingConsumed() { + return this.wg.asObservable(); + } + get onBidReady() { + return this.Og.asObservable(); + } + get onBidStarted() { + return this.xg.asObservable(); + } + get onBidReadyConsumed() { + return this.Sg.asObservable(); + } + getAllBids() { + const t = this.bidStarted ? [this.bidStarted] : []; + return [ + ...this.getAllBidsExceptStartedBid(), + ...t + ]; + } + getAllBidsExceptStartedBid() { + return [ + ...this.bids, + ...this.bidsLoading, + ...this.bidsReady + ]; + } + addBid(t) { + this.bids.push(t), this.gg.next(t); + } + moveBidToLoading(t) { + this.bidsLoading.push(t), this.consumeBid(t); + } + moveBidToReady(t) { + this.bidsReady.push(t), this.consumeBidLoading(t), this.Og.next(t); + } + moveBidToStarted(t) { + this.bidStarted = t, this.consumeBidReady(t), this.xg.next(t); + } + consumeBid(t) { + Object(l.k)(this.bids, t), this.yg.next(t); + } + consumeBidLoading(t) { + Object(l.k)(this.bidsLoading, t), this.wg.next(t); + } + consumeBidReady(t) { + Object(l.k)(this.bidsReady, t); + } + consumeBidStarted(t) { + this.bidStarted = null, this.Sg.next(t); + } + } + class Un { + constructor() { + this.creativeView = [], this.start = [], this.firstQuartile = [], this.midpoint = [], this.thirdQuartile = [], this.impression = [], this.complete = [], this.mute = [], this.unmute = [], this.pause = [], this.rewind = [], this.resume = [], this.fullscreen = [], this.exitFullscreen = [], this.expand = [], this.collapse = [], this.close = [], this.closeLinear = [], this.acceptInvitationLinear = [], this.acceptInvitation = [], this.skip = [], this.progress = [], this.playerExpand = [], this.playerCollapse = [], this.adExpand = [], this.adCollapse = [], this.fullScreen = [], this.canPlayThrough = [], this.stalled = [], this.waiting = [], this.otherAdInteraction = []; + } + } + class $n { + constructor(t) { + this.clickTrackings = [], this.customClicks = [], this.errorUrls = [], this.impressions = [], this.trackingEvents = new Un(), t.inLine ? this.jg(t.inLine) : this.kg(t.wrapper); + } + jg(t) { + this._g(t.errors), this.Ag(t.impressions), this.Ig(t.creatives); + } + kg(t) { + this._g(t.errors), this.Ag(t.impressions), this.Ig(t.creatives); + } + Cg(t) { + this.Tg(t.trackingEvents), this.Pg(t.videoClicks); + } + Pg(t) { + t && (this.Mg(t.clickTrackings), this.Eg(t.customClicks)); + } + Mg(t) { + this.clickTrackings.push(...t); + } + Eg(t) { + this.customClicks.push(...t); + } + Tg(t) { + t.forEach(t => { + try { + this.trackingEvents[t.name].push(t.uri); + } catch (i) { + Object(n.a)({ + message: 'AdManager_VastResponse_tracker', + exception: `${ t.name }`, + callStack: i.stack, + level: h.ProtoLoggingLevelEnum.INFO + }); + } + }); + } + Ig(t) { + t.forEach(t => { + t.linear && this.Cg(t.linear); + }); + } + _g(t) { + this.errorUrls.push(...t); + } + Ag(t) { + this.impressions.push(...t); + } + } + const Nn = { + [h.ProtoTrackerTriggerType.Impression]: 'adImpression', + [h.ProtoTrackerTriggerType.Complete25Pc]: 'adQuartileFirst', + [h.ProtoTrackerTriggerType.Complete50Pc]: 'adQuartileSecond', + [h.ProtoTrackerTriggerType.Complete75Pc]: 'adQuartileThird', + [h.ProtoTrackerTriggerType.ViewCompletion]: 'adQuartileFourth', + [h.ProtoTrackerTriggerType.VideoClick]: 'adClick', + [h.ProtoTrackerTriggerType.Pause]: 'adPause', + [h.ProtoTrackerTriggerType.Resume]: 'adResume', + [h.ProtoTrackerTriggerType.Mute]: 'adMute', + [h.ProtoTrackerTriggerType.Unmute]: 'adUnmute' + }; + class Hn { + constructor() { + this.adError = [], this.adWin = [], this.adImpression = [], this.adStarted = [], this.adVideoStart = [], this.adQuartileFirst = [], this.adQuartileSecond = [], this.adQuartileThird = [], this.adQuartileFourth = [], this.adClick = [], this.adPause = [], this.adResume = [], this.adSkip = [], this.adMute = [], this.adUnmute = [], this.adUserClose = [], this.adUserAcceptInvitation = [], this.adUserMinimize = []; + } + static track(t, i, e, s) { + if (!Array.isArray(t)) + return; + const { + width: n, + height: r + } = s.adContainerState.get(e.adType), {adBreakType: a} = s.adBreakState, { + mediaDescription: o, + mediaDuration: c, + mediaId: u, + mediaUrl: l, + mediaTitle: d + } = s.media; + t.forEach(t => { + if (t.url) + try { + const s = i.replace(t.url, e.vendorId, { + adMacros: { + adWidth: n, + adHeight: r, + adPostion: a + }, + mediaMacros: { + mediaDescription: o, + mediaDuration: c, + mediaId: u, + mediaUrl: l, + mediaTitle: d + } + }); + switch (t.type) { + case h.ProtoTrackerType.Image: + Object(Li.l)([s], window); + break; + case h.ProtoTrackerType.Javascript: + Object(T.x)({ src: s }, window.document.head, window); + } + } catch (t) { + } + }); + } + } + function qn(t, i) { + t.forEach(t => { + return function (t, i) { + (function (t, i) { + return i[Nn[t]]; + }(t.trigger, i).push({ + type: t.type, + url: t.url + })); + }(t, i); + }); + } + function zn(t) { + return { + type: h.ProtoTrackerType.Image, + url: t + }; + } + function Wn(t) { + return t.map(t => { + return zn(t); + }); + } + var Gn; + !function (t) { + t[t.HandlingSdkUrl = 0] = 'HandlingSdkUrl', t[t.NetworkRequestUrl = 1] = 'NetworkRequestUrl', t[t.XmlInvalidString = 2] = 'XmlInvalidString', t[t.XmlParseGeneral = 3] = 'XmlParseGeneral', t[t.XmlInvalidTree = 4] = 'XmlInvalidTree', t[t.XmlInvalidAd = 5] = 'XmlInvalidAd', t[t.XmlAdaptorWrapperLimit = 6] = 'XmlAdaptorWrapperLimit', t[t.HTMLUnknownMimeType = 7] = 'HTMLUnknownMimeType', t[t.ImaAdsManagerInit = 8] = 'ImaAdsManagerInit', t[t.ImaVastEmptyResponse = 9] = 'ImaVastEmptyResponse', t[t.ImaRequestException = 10] = 'ImaRequestException', t[t.ImaTimeout = 11] = 'ImaTimeout', t[t.ImaInvalidResponse = 12] = 'ImaInvalidResponse'; + }(Gn || (Gn = {})); + const Jn = { + [Gn.HandlingSdkUrl]: h.ConnatixNoBidReasonEnum.CsRequestException, + [Gn.NetworkRequestUrl]: h.ConnatixNoBidReasonEnum.CsRequestException, + [Gn.XmlInvalidString]: h.ConnatixNoBidReasonEnum.CsEmptyResponse, + [Gn.XmlParseGeneral]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.XmlInvalidTree]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.XmlInvalidAd]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.XmlAdaptorWrapperLimit]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.HTMLUnknownMimeType]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.ImaAdsManagerInit]: h.ConnatixNoBidReasonEnum.CsRequestException, + [Gn.ImaVastEmptyResponse]: h.ConnatixNoBidReasonEnum.CsInvalidResponse, + [Gn.ImaRequestException]: h.ConnatixNoBidReasonEnum.CsRequestException, + [Gn.ImaTimeout]: h.ConnatixNoBidReasonEnum.Timeout, + [Gn.ImaInvalidResponse]: h.ConnatixNoBidReasonEnum.CsInvalidResponse + }; + var Qn, Xn, Yn = e(9); + !function (t) { + t.VOLUME_DETECTED = 'volume_detected', t.MALWARE_DETECTED = 'malware_detected', t.BADURI_DETECTED = 'baduri_detected'; + }(Qn || (Qn = {})), function (t) { + t[t.None = 0] = 'None', t[t.Mute = 1] = 'Mute', t[t.ScrollHijack = 2] = 'ScrollHijack', t[t.MemoryLeak = 4] = 'MemoryLeak', t[t.Malware = 8] = 'Malware', t[t.All = 15] = 'All'; + }(Xn || (Xn = {})); + const Kn = '2.0'; + class Zn { + constructor() { + this.Rg = new ji(); + } + get onVpaidEvent() { + return this.Rg.asObservable(); + } + handshakeVersion(t = (() => { + return Kn; + })()) { + return '2.0'; + } + } + var tr, ir; + !function (t) { + t[t.Win = 0] = 'Win', t[t.AdLoaded = 1] = 'AdLoaded', t[t.AdStarted = 2] = 'AdStarted', t[t.AdImpression = 3] = 'AdImpression'; + }(tr || (tr = {})); + class er { + constructor(t) { + this.Bg = t, this.Dg = new Map(), Object(rt.a)(this.Bg.settings.bidLifecycle) || (this.Bg.settings.bidLifecycle = {}); + } + onTrackingLifecycleEvent(t) { + switch (this.Dg.set(t, Date.now()), t) { + case tr.AdLoaded: + this.Fg(); + break; + case tr.AdImpression: + this.Vg(); + } + } + Fg() { + this.Bg.settings.bidLifecycle.winToAdLoadedTime = this.Ug; + } + Vg() { + this.Bg.settings.bidLifecycle.startAdToImpressionTime = this.$g; + } + get $g() { + return this.Dg.get(tr.AdImpression) && this.Dg.get(tr.AdStarted) ? this.Dg.get(tr.AdImpression) - this.Dg.get(tr.AdStarted) : 0; + } + get Ug() { + return this.Dg.get(tr.AdLoaded) && this.Dg.get(tr.Win) ? this.Dg.get(tr.AdLoaded) - this.Dg.get(tr.Win) : 0; + } + } + function sr(t) { + return [ + t - (t - t % 100), + t - t % 100 + ]; + } + function nr(t, i = (() => { + return !1; + })()) { + if (i) + return Math.random(); + const { + successRate: e, + cpm: s, + priority: n + } = t; + let r = 0 === e ? Math.random() : e; + return r = 1, 1 * s + Ht.f * n; + } + function rr(t) { + switch (t.creativeType) { + case h.ProtoCreativeTypeEnum.Tam: + case h.ProtoCreativeTypeEnum.TamDeal: + case h.ProtoCreativeTypeEnum.Rtb: + return Rn(t.obfuscatedPrice); + case h.ProtoCreativeTypeEnum.HeaderBidder: + return t.cpm; + default: + return t.floorPrice; + } + } + !function (t) { + t.IMPRESSION_TIMEOUT = 'IMPRESSION_TIMEOUT', t.VIEWABLE_IMPRESSION_TIMEOUT = 'VIEWABLE_IMPRESSION_TIMEOUT', t.SKIP_AD_TIMEOUT = 'SKIP_AD_TIMEOUT', t.STOP_AD_TIMEOUT = 'STOP_AD_TIMEOUT', t.AD_LOADED_TIMEOUT = 'AD_LOADED_TIMEOUT'; + }(ir || (ir = {})); + const hr = 500, ar = 'cnx-ad-bid-slot-selected', or = 'Connatix Ad'; + class cr extends Zn { + constructor(t) { + super(), this.settings = t, this.Ng = null, this.Hg = null, this.qg = null, this.zg = null, this.Wg = void 0, this.Gg = !1, this.Iu = !1, this.Jg = !1, this.Qg = !1, this.Xg = null, this.jl = [], this.Yg = new ji(), this.Kg = () => { + this.Zg({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.Timeout } + }), this.ty(); + }, this.iy = () => { + this.ey(), this.sy(ir.VIEWABLE_IMPRESSION_TIMEOUT).clearTimeout(), this.settings.viewabilityService.off(this.Ng, this.ny); + }, this.ny = t => { + const i = this.sy(ir.VIEWABLE_IMPRESSION_TIMEOUT); + t ? i.timeoutHandle.timeoutId || i.setTimeout() : i.clearTimeout(); + }, this.hy = () => { + this.Zg({ type: Pt.b.AdSkipped }), this.ty(); + }, this.ay = () => { + this.Zg({ + type: Pt.b.AdStopped, + payload: { shouldTrackPostBid: !0 } + }), this.ty(); + }, this.oy = () => { + this.Zg({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.TimeoutLoaded } + }), this.ty(); + }, this.sy = t => { + const i = this.uy[t]; + return { + timeoutHandle: i, + setTimeout: () => { + i.timeoutId = mi.setTimeout(() => { + i.callback(); + }, i.timeout); + }, + clearTimeout: () => { + null !== i.timeoutId && (mi.clearTimeout(i.timeoutId), i.timeoutId = null); + } + }; + }, this.creativeId = this.settings.externalCreativeId, this.ly = `cnx-ad-bid-slot-id-${ this.settings.requestMetadata.data.cnxBidId }`, this.py = `cnx-ad-slot-${ this.settings.id }`; + const {adType: i} = this.settings.adManagerLineItem.protoLineItem; + this.uy = { + [ir.IMPRESSION_TIMEOUT]: { + callback: this.Kg, + timeout: 25000, + timeoutId: null + }, + [ir.VIEWABLE_IMPRESSION_TIMEOUT]: { + callback: this.iy, + timeout: i === M.ProtoAdType.Video ? Ht.b : Ht.a, + timeoutId: null + }, + [ir.SKIP_AD_TIMEOUT]: { + callback: this.hy, + timeout: 500, + timeoutId: null + }, + [ir.STOP_AD_TIMEOUT]: { + callback: this.ay, + timeout: 500, + timeoutId: null + }, + [ir.AD_LOADED_TIMEOUT]: { + callback: this.oy, + timeout: 25000, + timeoutId: null + } + }, this.Zd = t.urlSuffixerService; + } + getPrice() { + const { + advertiserLineItemId: t, + creativeType: i, + floorPrice: e, + lineItemPriority: s + } = this.settings.adManagerLineItem.protoLineItem; + return rr({ + lineItemId: t, + bidId: this.settings.id, + creativeType: i, + floorPrice: e, + obfuscatedPrice: this.settings.obfuscatedPrice, + successRate: this.settings.successRate, + priority: s, + cpm: this.settings.cpm + }); + } + skipAd() { + this.sy(ir.SKIP_AD_TIMEOUT).setTimeout(); + } + stopAd(t) { + this.sy(ir.STOP_AD_TIMEOUT).setTimeout(); + } + startAd() { + this.Qg && Object(n.a)({ + message: 'AdManager_ABaseBidAdaptor_samebid', + exception: 'startAd', + callStack: `adv:${ this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId } bidid: ${ this.py }`, + level: h.ProtoLoggingLevelEnum.FATAL + }), this.Qg = !0, this.sy(ir.IMPRESSION_TIMEOUT).setTimeout(); + } + initAd(t, i, e, s, r, a, o) { + this.Jg && Object(n.a)({ + message: 'AdManager_ABaseBidAdaptor_samebid', + exception: 'initAd', + callStack: `adv:${ this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId } bidid: ${ this.py }`, + level: h.ProtoLoggingLevelEnum.FATAL + }), this.Jg = !0, this.sy(ir.AD_LOADED_TIMEOUT).setTimeout(), this.by(o), this.vy = new er(this), this.vy.onTrackingLifecycleEvent(tr.Win); + } + setAdVolume(t) { + this.Hg.volume = t, Object(T.R)(this.Hg, t), t <= 0 ? this.settings.adEnforcer.start(Xn.Mute) : this.settings.adEnforcer.stop(Xn.Mute); + } + get impressionStarted() { + return this.Gg; + } + get creativeId() { + return this.Wg; + } + set creativeId(t) { + Object(rt.h)(this.creativeId) || (this.Wg = t); + } + get onAdViewableImpression() { + return this.Yg.asObservable(); + } + my(t) { + let i; + Object(rt.d)(t.payload.skipOffset) && (i = t.payload.skipOffset); + const e = { + type: Pt.b.AdLoaded, + payload: { + adLoadedData: { skipOffset: i }, + adSkipMode: this.settings.adManagerLineItem.protoLineItem.skipMode + } + }; + return this.settings.adLoadedPayload = e, e; + } + gy(t) { + return { + type: Pt.b.AdImpression, + payload: { + adSkipMode: this.settings.adManagerLineItem.protoLineItem.skipMode, + adSourceData: { + moatTrackingEnabled: this.settings.adManagerLineItem.protoLineItem.moatTrackingEnabled, + creativeId: this.settings.adManagerLineItem.protoLineItem.cnxCreativeId, + adId: this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId, + length: this.getAdDuration(), + adVideoUrl: this.adVideoUrl, + name: or + }, + customAdData: { + ADVERTISER: this.settings.requestMetadata.data.rtbAdomain, + CREATIVE_ID: this.creativeId, + CAMPAIGN_ID: this.settings.requestMetadata.data.rtbCampainId + } + } + }; + } + yy(t) { + return { + type: Pt.b.AdVideoStart, + payload: { + adSkipMode: this.settings.adManagerLineItem.protoLineItem.skipMode, + adSourceData: { + moatTrackingEnabled: this.settings.adManagerLineItem.protoLineItem.moatTrackingEnabled, + creativeId: this.settings.adManagerLineItem.protoLineItem.cnxCreativeId, + adId: this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId, + length: this.getAdDuration(), + name: or + }, + customAdData: { + ADVERTISER: this.settings.requestMetadata.data.rtbAdomain, + CREATIVE_ID: this.creativeId, + CAMPAIGN_ID: this.settings.requestMetadata.data.rtbCampainId + } + } + }; + } + Zg(t) { + if (this.wy(t)) + switch (t.type) { + case Pt.b.AdLoaded: + this.vy.onTrackingLifecycleEvent(tr.AdLoaded), this.sy(ir.AD_LOADED_TIMEOUT).clearTimeout(), this.Rg.next(this.my(t)); + break; + case Pt.b.AdImpression: + this.vy.onTrackingLifecycleEvent(tr.AdImpression), this.sy(ir.IMPRESSION_TIMEOUT).clearTimeout(), this.Oy(), Object(T.a)(this.qg, ar), this.Rg.next(this.gy(t)), this.Gg = !0; + break; + case Pt.b.AdVideoStart: + this.vy.onTrackingLifecycleEvent(tr.AdStarted), this.Rg.next(this.yy(t)); + break; + case Pt.b.AdStopped: + case Pt.b.AdSkipped: + case Pt.b.AdError: + this.Iu && Object(n.a)({ + message: 'AdManager_ABaseBidAdaptor_double_destroy', + exception: this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId, + level: h.ProtoLoggingLevelEnum.WARNING + }), this.fl(), this.Rg.next(t); + break; + default: + this.Rg.next(t); + } + else + this.Zg({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.InvalidVpaidEvent } + }); + } + by(t) { + this.zg = this.xy(), this.qg = this.zg.slotsContainer, Object(T.a)(this.qg, this.ly), this.Ng = this.zg.adSlot, this.Ng.id = this.py, this.qg.id = this.settings.bidSlotId, this.Hg = this.zg.videoSlot, this.Hg.volume = t, Object(T.R)(this.Hg, t), this.settings.adEnforcer.registerContainer(this.qg, this.py), this.jl.push(this.settings.adEnforcer.onEnforcerEvent.subscribe(t => { + this.Sy(t); + })), this.settings.adEnforcer.start(Xn.All); + } + xy() { + return this.settings.adSlotContainerRecycler.requestAdSlot(this.settings.adContainer); + } + fl() { + this.Iu = !0, Object(T.I)(this.qg, ar), Object(T.I)(this.qg, this.ly), this.Ng.removeAttribute('id'), this.qg.removeAttribute('id'), Ai(this.jl), this.ty(), this.settings.adEnforcer.deregisterContainer(this.qg), this.settings.viewabilityService.off(this.Ng, this.ny), null !== this.Xg && mi.clearTimeout(this.Xg), this.jy(); + } + jy() { + this.Xg = mi.setTimeout(() => { + this.settings.adSlotContainerRecycler.destroyAdSlot(this.zg); + }, hr); + } + ey() { + const { + advertiserLineItemId: t, + publisherLineItemId: i + } = this.settings.adManagerLineItem.protoLineItem; + this.Yg.next({ + advertiserLineItemId: t, + publisherLineItemId: i, + rtbSeatId: this.settings.requestMetadata.data.rtbSeatId, + dspId: this.settings.requestMetadata.data.dspId + }); + } + Oy() { + const t = Ht.e, i = this.Ng; + this.settings.viewabilityService.on(i, this.ny, { threshold: t }), this.ny(this.settings.viewabilityService.check({ + threshold: t, + element: i + })); + } + ty() { + Object.keys(this.uy).forEach(t => { + this.sy(t).clearTimeout(); + }); + } + wy(t) { + return !(!this.Gg && (t.type === Pt.b.AdStopped || t.type === Pt.b.AdSkipped)); + } + Sy(t) { + if (t.detectedContainer !== this.qg) + return; + let i; + switch (t.type) { + case Qn.BADURI_DETECTED: + i = 'AdManager_enforcer_BadUri'; + break; + case Qn.MALWARE_DETECTED: + i = 'AdManager_enforcer_malware', this.Zg({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.EnforcementMalware } + }); + break; + case Qn.VOLUME_DETECTED: + i = 'AdManager_enforcer_soundBlock', this.Zg({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.EnforcementVolume } + }); + } + Object(n.a)({ + message: i, + exception: t.message, + level: h.ProtoLoggingLevelEnum.WARNING + }); + } + ky(t, i, e) { + var s, r; + const a = this.settings.adManagerLineItem.protoLineItem.advertiserLineItemId, o = this.creativeId; + Object(n.a)({ + message: `AdManager_${ t }_${ i }`, + exception: `advertiserLineItemId:${ a }_creativeId:${ o }_errorMessage:${ null === (s = e) || void 0 === s ? void 0 : s.message }`, + callStack: null === (r = e) || void 0 === r ? void 0 : r.stack, + throttle: 5, + level: h.ProtoLoggingLevelEnum.WARNING, + sendMaxLog: !0 + }); + } + } + var ur = e(44); + class lr extends Zn { + constructor(t, i, e, s, n, r, h) { + super(), this._y = t, this.Zn = i, this.Ay = e, this.Iy = s, this.Cy = n, this.Ty = r, this.Py = h, this.My = new ji(), this.Ey = t => { + if (!this.Ly(t)) + return; + let i = ''; + try { + i = t.getError().getMessage() + '_' + t.getError().getErrorCode() + '_' + t.getError().getVastErrorCode(); + } catch (t) { + } + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.ImaError + '_' + i } + }); + }, this.Ry = t => { + const i = this._y.AdEvent.Type; + switch (t.type) { + case i.CLICK: + this.Rg.next({ + type: Pt.b.AdClickThru, + payload: {} + }); + break; + case i.LOADED: + this.ah(t); + break; + case i.IMPRESSION: + const e = { + adsManager: this.Cy, + adContainer: this.By, + viewMode: this.Dy(this.Fy), + adTag: this.Iy + }; + this.Rg.next({ type: Pt.b.AdVideoStart }), this.Rg.next({ + type: Pt.b.AdImpression, + payload: { imaMetadata: e } + }); + break; + case i.STARTED: + this.Rg.next({ type: Pt.b.AdStarted }); + break; + case i.FIRST_QUARTILE: + this.Rg.next({ type: Pt.b.AdVideoFirstQuartile }); + break; + case i.MIDPOINT: + this.Rg.next({ type: Pt.b.AdVideoMidpoint }); + break; + case i.THIRD_QUARTILE: + this.Rg.next({ type: Pt.b.AdVideoThirdQuartile }); + break; + case i.COMPLETE: + this.Rg.next({ type: Pt.b.AdVideoComplete }), this.Rg.next({ + type: Pt.b.AdStopped, + payload: { shouldTrackPostBid: !0 } + }); + break; + case i.ALL_ADS_COMPLETED: + break; + case i.DURATION_CHANGE: + this.Rg.next({ type: Pt.b.AdDurationChange }); + break; + case i.PAUSED: + this.Rg.next({ type: Pt.b.AdPaused }); + break; + case i.RESUMED: + this.Rg.next({ type: Pt.b.AdPlaying }); + break; + case i.LINEAR_CHANGED: + this.Rg.next({ type: Pt.b.AdLinearChange }); + break; + case i.SKIPPABLE_STATE_CHANGED: + this.Rg.next({ type: Pt.b.AdSkippableStateChange }); + break; + case i.SKIPPED: + this.Rg.next({ type: Pt.b.AdSkipped }); + break; + case i.VOLUME_CHANGED: + this.Rg.next({ type: Pt.b.AdVolumeChange }); + break; + case i.USER_CLOSE: + this.Rg.next({ type: Pt.b.AdUserClose }); + break; + case i.LOG: + this.Rg.next({ type: Pt.b.AdLog }); + } + }, this.Vy(); + } + get onCreativeReceived() { + return this.My.asObservable(); + } + initAd(t, i, e, s, n, r) { + this.By = r.slot, this.Uy = r.videoSlot, this.Fy = e || Pt.a.Normal; + try { + this.Cy.setVolume(0), this.Cy.init(t, i, this.Dy(this.Fy)); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.ImaManagerInit } + }); + } + } + startAd() { + try { + this.Cy.start(); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.WrapperStartAdError + `_${ t.message }` } + }); + } + } + stopAd(t) { + this.Cy.stop(), this.Rg.next({ + type: Pt.b.AdStopped, + payload: { shouldTrackPostBid: !0 } + }); + } + resizeAd(t, i, e) { + this.Cy.resize(t, i, this.Dy(e)); + } + pauseAd() { + this.Cy.pause(); + } + resumeAd() { + this.Cy.resume(), this.Zn === St.b.Ios && Object(T.z)(this.Uy); + } + expandAd() { + this.Cy.expand(); + } + collapseAd() { + this.Cy.collapse(); + } + skipAd() { + this.Cy.skip(); + } + getAdRemainingTime() { + return this.Cy.getRemainingTime() || 0; + } + getAdDuration() { + return this.$y ? this.$y.getDuration() : 0; + } + getAdVolume() { + return this.Cy.getVolume(); + } + getAdMediaWidth() { + return this.$y ? this.$y.getVastMediaWidth() : 0; + } + getAdMediaHeight() { + return this.$y ? this.$y.getVastMediaHeight() : 0; + } + setAdVolume(t) { + this.Cy.setVolume(t); + } + getMediaFile() { + return this.$y ? this.$y.getMediaUrl() : void 0; + } + Vy() { + this.Ay.addEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey), this.Cy.addEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey), Object.keys(this._y.AdEvent.Type).forEach(t => { + this.Cy.addEventListener(this._y.AdEvent.Type[t], this.Ry, !1); + }); + } + Ny() { + this.Ay.removeEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey), this.Cy.removeEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey), Object.keys(this._y.AdEvent.Type).forEach(t => { + this.Cy.removeEventListener(this._y.AdEvent.Type[t], this.Ry, !1); + }); + } + Dy(t) { + return t === Pt.a.Fullscreen ? this._y.ViewMode.FULLSCREEN : this._y.ViewMode.NORMAL; + } + Ly(t) { + const i = t.getUserRequestContext(); + return !i || i.id === this.Ty.id; + } + ah(t) { + this.$y = t.getAd(), this.My.next(this.$y.getCreativeId()); + let i = -1, e = ''; + try { + i = this.$y.getSkipTimeOffset(); + const s = t.getAdData().clickThroughUrl; + e = Object(rt.h)(s) ? s : void 0; + } catch (t) { + } + Object(ur.b)(this.Py, e).then(t => { + t ? this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.DomainBlocked } + }) : this.Rg.next({ + type: Pt.b.AdLoaded, + payload: { skipOffset: i } + }); + }); + } + destroy() { + try { + this.Ny(), setTimeout(() => { + this.Cy.destroy(); + }); + } catch (t) { + } + } + } + const dr = { + ImaObjectNotFound: Yn.c.ImaObjectNotFound, + ImaScriptFailure: Yn.c.ImaScriptFailure + }, fr = '//imasdk.googleapis.com/js/sdkloader/ima3.js'; + class pr { + static preloadImaSdk(t) { + Object(T.G)(fr, t); + } + static fetchImaSdk(t, i) { + return new Promise((e, s) => { + const r = pr.Hy(t); + if (r) + return void e(r); + const a = i && 1 === Object(Li.k)([ + 95, + 5 + ]); + Object(T.x)({ src: fr }, t.document.head, t, () => { + const i = pr.Hy(t); + i ? e(i) : (a && Object(n.a)({ + message: 'AdManager_ImaIntegrator_no_image_object_found_after_loading_script', + level: h.ProtoLoggingLevelEnum.FATAL, + throttle: 2, + sendMaxLog: !1 + }), s(dr.ImaObjectNotFound)); + }, () => { + s(dr.ImaScriptFailure); + }, a, 'AdManager_ImaIntegrator_unable_to_insert_ima_sdk_script'); + }); + } + static Hy(t) { + return t.google && t.google.ima; + } + } + class br extends cr { + constructor(t) { + super(t), this.settings = t, this.zg = null, this.adMediaType = 'ima', this.adSourceType = h.ProtoAdsourceTypeEnum.Ima, this.qy = [], this.zg = this.settings.imaAdSlotContainer, this.zy = new lr(this.settings.imaSdk, this.settings.os, this.settings.imaAdsLoader, this.settings.url, this.settings.imaAdsManager, this.settings.requestAdsContext, this.settings.adManagerLineItem.protoLineItem.publisherLineItemId); + } + initAd(t, i, e, s, n, r, h) { + try { + super.initAd(t, i, e, s, n, r, h), this.settings.adManagerLineItem.protoLineItem.moatTrackingEnabled && this.Wy(), this.qy.push(this.zy.onVpaidEvent.subscribe(t => { + this.Zg(t); + }), this.zy.onCreativeReceived.subscribe(t => { + this.creativeId = t; + })), this.zy.initAd(t, i, e, s, n, { + slot: this.Ng, + videoSlot: this.Hg + }); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.AdaptorInitAdError + `_${ t.message }` } + }); + } + } + startAd() { + try { + super.startAd(), this.zy.startAd(); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.AdaptorStartAdError + `_${ t.message }` } + }); + } + } + stopAd(t) { + try { + super.stopAd(t), this.zy.stopAd(t); + } catch (t) { + this.ky('ImaBidAdaptor', 'stopAd', t); + } + } + resizeAd(t, i, e) { + try { + this.zy.resizeAd(t, i, e); + } catch (t) { + this.ky('ImaBidAdaptor', 'resizeAd', t); + } + } + pauseAd() { + try { + this.zy.pauseAd(); + } catch (t) { + this.ky('ImaBidAdaptor', 'pauseAd', t); + } + } + resumeAd() { + try { + this.zy.resumeAd(); + } catch (t) { + this.ky('ImaBidAdaptor', 'resumeAd', t); + } + } + expandAd() { + try { + this.zy.expandAd(); + } catch (t) { + this.ky('ImaBidAdaptor', 'expandAd', t); + } + } + collapseAd() { + try { + this.zy.collapseAd(); + } catch (t) { + this.ky('ImaBidAdaptor', 'collapseAd', t); + } + } + skipAd() { + try { + super.skipAd(), this.zy.skipAd(); + } catch (t) { + this.ky('ImaBidAdaptor', 'skipAd', t); + } + } + getAdRemainingTime() { + try { + return this.zy.getAdRemainingTime(); + } catch (t) { + return this.ky('ImaBidAdaptor', 'getAdRemainingTime', t), 0; + } + } + getAdDuration() { + try { + return this.zy && this.zy.getAdDuration() || this.settings.adManagerLineItem.protoLineItem.duration; + } catch (t) { + return this.ky('ImaBidAdaptor', 'getAdDuration', t), 0; + } + } + getAdVolume() { + try { + return this.zy.getAdVolume(); + } catch (t) { + return this.ky('ImaBidAdaptor', 'getAdVolume', t), 0; + } + } + getAdMediaSize() { + return { + width: this.zy.getAdMediaWidth(), + height: this.zy.getAdMediaHeight() + }; + } + setAdVolume(t) { + try { + super.setAdVolume(t), this.zy.setAdVolume(t); + } catch (t) { + this.ky('ImaBidAdaptor', 'setAdVolume', t); + } + } + get adVideoUrl() { + return this.zy.getMediaFile(); + } + get declaredDurationInSeconds() { + return this.zy.getAdDuration(); + } + gy(t) { + const i = super.gy(t); + return i.payload.adSourceData.imaMetadata = t.payload.imaMetadata, i; + } + xy() { + return this.zg; + } + jy() { + this.settings.adSlotContainerRecycler.recycleAdSlot(this.zg); + } + Wy() { + pr.fetchImaSdk(this.settings.globalDomUtilsService.getGlobalClosestTop().topFrame, !1); + } + fl() { + try { + super.fl(), Ai(this.qy), this.zy.destroy(); + } catch (t) { + this.ky('ImaBidAdaptor', '_destroy', t); + } + } + } + const vr = 25; + class mr { + constructor(t, i, e, s, n, r, h) { + this._y = t, this.Ay = i, this.Vd = e, this.Ud = s, this.Iy = n, this.Uy = r, this.We = h, this.Gy = new ji(), this.Jy = new ji(), this.Qy = { id: Object(Li.c)() }, this.Cy = null, this.Ey = t => { + if (!this.Ly(t)) + return; + switch (t.getError().getErrorCode()) { + case this._y.AdError.ErrorCode.VAST_EMPTY_RESPONSE: + this.Xy(Gn.ImaVastEmptyResponse); + break; + case this._y.AdError.ErrorCode.VAST_WRAPPER_ERROR: + case this._y.AdError.ErrorCode.VAST_MALFORMED_RESPONSE: + this.Xy(Gn.ImaInvalidResponse); + break; + default: + this.Xy(Gn.ImaRequestException); + } + }, this.Yy = t => { + this.Ly(t) && (this.Cy = t.getAdsManager(this.Uy, { loadVideoTimeout: vr * qt.f }), this.Ky(), this.Gy.next({ + imaAdsManager: this.Cy, + requestAdsContext: this.Qy + })); + }, this.Ay.addEventListener(this._y.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, this.Yy), this.Ay.addEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey); + } + get onSuccess() { + return this.Gy.asObservable(); + } + get onError() { + return this.Jy.asObservable(); + } + loadAd() { + const t = new this._y.AdsRequest(); + t.adTagUrl = this.Iy, t.linearAdSlotWidth = t.nonLinearAdSlotWidth = this.Vd, t.linearAdSlotHeight = t.nonLinearAdSlotHeight = this.Ud, t.pageUrl = this.We, this.Ay.requestAds(t, this.Qy); + } + Xy(t) { + this.Jy.next(t); + } + Ky() { + this.Ay.removeEventListener(this._y.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, this.Yy), this.Ay.removeEventListener(this._y.AdErrorEvent.Type.AD_ERROR, this.Ey); + } + Ly(t) { + const i = t.getUserRequestContext(); + return !i || i.id === this.Qy.id; + } + destroy() { + var t; + try { + this.Ky(), null === (t = this.Cy) || void 0 === t || t.destroy(); + } catch (t) { + } + } + } + const gr = 25000; + class yr { + constructor(t) { + this.settings = t, this.Zy = !1, this.tw = [], this.metrics = { created: new Date().getTime() }; + } + fetchBid() { + this.metrics.fetchStart = new Date().getTime(), this.iw = this.settings.adSlotContainerRecycler.requestAdSlotIma(this.settings.adContainer); + const t = new Promise((t, i) => { + setTimeout(() => { + i(Gn.ImaTimeout); + }, gr); + }), i = this.ew(this.iw); + return Promise.race([ + i, + t + ]).then(t => { + return this.metrics.fetchEnd = new Date().getTime(), this.Zy = !0, this.sw && Ai(this.tw), t; + }).catch(t => { + throw this.metrics.fetchEnd = new Date().getTime(), this.Zy = !0, this.sw && (Ai(this.tw), this.sw.destroy(), this.settings.adSlotContainerRecycler.recycleAdSlot(this.iw)), t; + }); + } + ew(t) { + return t.fetchImaDependencies().then(t => { + return this.nw = t, this.rw(t); + }).then(t => { + return this.hw(t); + }).catch(t => { + throw Object(rt.a)(t) ? t : Gn.ImaRequestException; + }); + } + rw(t) { + return this.Zy ? Promise.reject() : new Promise((i, e) => { + const s = this.aw(); + this.sw = new mr(t.imaSdk, t.imaAdsLoader, s.width, s.height, this.settings.url, this.iw.videoSlot, this.settings.pageUrl), this.tw.push(this.sw.onSuccess.subscribe(t => { + i(t); + }), this.sw.onError.subscribe(t => { + e(t); + })), this.sw.loadAd(); + }); + } + aw() { + return this.settings.callingState.adContainerState.get(this.settings.adManagerLineItem.protoLineItem.adType); + } + hw(t) { + return new br({ + id: this.settings.id, + adManagerLineItem: this.settings.adManagerLineItem, + trackers: this.settings.trackersInformation, + url: this.settings.url, + requestMetadata: this.settings.requestMetadata, + callingState: this.settings.callingState, + adContainer: this.settings.adContainer, + globalDomUtilsService: this.settings.globalDomUtilsService, + viewabilityService: this.settings.viewabilityService, + cpm: this.settings.cpm, + obfuscatedPrice: this.settings.obfuscatedPrice, + adEnforcer: this.settings.adEnforcer, + successRate: this.settings.successRate, + os: this.settings.os, + adSlotContainerRecycler: this.settings.adSlotContainerRecycler, + externalCreativeId: this.settings.creativeId, + imaSdk: this.nw.imaSdk, + imaAdsLoader: this.nw.imaAdsLoader, + imaAdsManager: t.imaAdsManager, + requestAdsContext: t.requestAdsContext, + imaAdSlotContainer: this.iw, + bidSlotId: this.settings.bidSlotId, + pageUrl: this.settings.pageUrl, + urlSuffixerService: this.settings.urlSuffixerService + }); + } + } + function wr(t, i) { + t.sort((t, i) => { + return t.width === i.width ? t.bitrate - i.bitrate : t.width - i.width; + }); + for (let e = 0; e < t.length; e++) + if (t[e].width >= i) + return t[e - 1] || t[e]; + return t[t.length - 1]; + } + const Or = () => { + return `cnx_bid_slot_${ Object(Li.c)() }`; + }; + var xr = e(17); + const Sr = xr && xr.isSupported(), jr = t => { + return t.canPlayType('application/vnd.apple.mpegurl'); + }, kr = { + enableWorker: !1, + capLevelToPlayerSize: !0, + cnxRenderWindow: window, + maxBufferSize: 5000000, + maxBufferLength: 5, + maxMaxBufferLength: 10, + liveBackBufferLength: 0 + }; + class _r { + constructor(t, i, e, s) { + this.ow = t, this.cw = i, this.rc = e, this.uw = s, this.lw = [], this.dw = (t, i) => { + if (i.fatal) + switch (i.type) { + case xr.ErrorTypes.NETWORK_ERROR: + if (i.details === xr.ErrorDetails.MANIFEST_PARSING_ERROR || i.details === xr.ErrorDetails.MANIFEST_LOAD_ERROR) + return void this.fw(); + this.pw.startLoad(); + break; + case xr.ErrorTypes.MEDIA_ERROR: + this.pw.recoverMediaError(); + break; + default: + this.fw(); + } + }, this.vw = () => { + this.pw.off(xr.Events.MEDIA_ATTACHED, this.vw), this.pw.loadSource(this.ow), this.pw.once(xr.Events.MANIFEST_PARSED, this.mw); + }, this.mw = () => { + this.pw.off(xr.Events.MANIFEST_PARSED, this.mw), this.gw(), this.uw.forceMaxLevel && this.yw(), this.uw.forceResolutionHeight && this.ww(this.uw.forceResolutionHeight), this.Ow(); + }, (this.uw.forceMaxLevel || this.uw.forceResolutionHeight) && (kr.capLevelToPlayerSize = !1); + } + start(t, i) { + this.Ow = t, this.fw = i, Sr ? (this.pw = this.rc.initHls(kr), this.xw()) : this.fw(); + } + destroy() { + this.pw && (this.pw.destroy(), this.pw = null); + } + xw() { + this.pw.on(xr.Events.ERROR, this.dw), this.pw.attachMedia(this.cw), this.pw.once(xr.Events.MEDIA_ATTACHED, this.vw); + } + yw() { + const t = this.pw.levels.length - 1; + this.Sw(t); + } + ww(t) { + const i = this.lw.find(i => { + return i.height === t; + }); + i && this.Sw(i.level); + } + Sw(t) { + this.pw.currentLevel = t, this.pw.startLevel = t, this.pw.nextLevel = t; + } + gw() { + this.pw.levels.forEach((t, i) => { + this.lw.push({ + level: i, + height: t.height + }); + }); + } + } + var Ar = e(49); + const Ir = { + domain: 'huffpost', + resolutionHeight: 540 + }; + class Cr extends Zn { + constructor(t, i, e, s, r, a, o, c, l = (() => { + return !1; + })(), d) { + super(), this.js = t, this.jw = i, this.Uy = e, this.Zn = s, this.kw = r, this._w = a, this.Aw = o, this.Iw = c, this.Cw = l, this.er = d, this.Tw = !1, this.pageFocus = new Ar.a(this.js), this.Pw = Object(u.a)(m), this.Mw = !1, this.Ew = !0, this.Lw = !1, this.Rw = [ + { + event: Pt.b.AdVideoStart, + position: 0 + }, + { + event: Pt.b.AdVideoFirstQuartile, + position: 25 + }, + { + event: Pt.b.AdVideoMidpoint, + position: 50 + }, + { + event: Pt.b.AdVideoThirdQuartile, + position: 75 + }, + { + event: Pt.b.AdVideoComplete, + position: 100 + } + ], this.Bw = this.Rw[0], this.Dw = t => { + try { + switch (t.type) { + case m.Pause: + if (this._w && !this.Ew) + return void (this.Ew = !0); + this.Mw = !1; + break; + case m.Play: + if (!this.Mw && this.Cw) + return void this.Uy.pause(); + break; + case m.Canplay: + case m.Durationchange: + this.Fw(); + break; + case m.Timeupdate: + this.Vw(); + break; + case m.Error: + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.VastVideoTagEventError } + }); + break; + case 'click': + this.Rg.next({ + type: Pt.b.AdClickThru, + payload: {} + }); + } + } catch (t) { + Object(n.a)({ + level: h.ProtoLoggingLevelEnum.FATAL, + callStack: t.stack, + message: 'AdManager_VastIntegrator_onVideoEvent', + exception: t.message, + throttle: 10, + sendMaxLog: !1 + }); + } + }; + } + initAd(t, i, e, s, n, r) { + try { + this.Uy = r.videoSlot, this.width = t, this.height = i, this.Uw(this.kw, this.Uy.parentElement), this.resizeAd(t, i, e), this.addVideoEvents(this.Uy), this.Iw && Sr ? this.$w() : (this.Uy.setAttribute('src', this.jw), this.Uy.setAttribute('preload', 'metadata'), this.Uy.load()), this.pageFocus.isDocumentVisible() || this.Fw(); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.WrapperInitAdError + `_${ t.message }` } + }); + } + } + startAd() { + try { + Object(T.a)(this.Uy, 'cnx-ad-video-slot'), this.Mw = !0, this.pageFocus.isDocumentVisible() ? this.Uy.play().then(() => { + this.Rg.next({ type: Pt.b.AdStarted }), this.Rg.next({ + type: Pt.b.AdImpression, + payload: {} + }); + }).catch(t => { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.VastPlayPromiseReject } + }); + }) : (this.Rg.next({ type: Pt.b.AdStarted }), this.Rg.next({ + type: Pt.b.AdImpression, + payload: {} + }), this.Uy.play()); + } catch (t) { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.WrapperStartAdError + `_${ t.message }` } + }); + } + } + stopAd(t) { + this.Cw && this.Uy.pause(), 'videoComplete' === t && this._w ? this.Rg.next({ + type: Pt.b.AdStopped, + payload: { shouldTrackPostBid: !1 } + }) : this.Rg.next({ + type: Pt.b.AdStopped, + payload: { shouldTrackPostBid: !0 } + }); + } + resizeAd(t, i, e) { + Object(T.N)(this.Uy, { + width: `${ t }px`, + height: `${ i }px` + }), this.Rg.next({ type: Pt.b.AdSizeChange }); + } + pauseAd() { + this.Mw = !1, this.Aw && void 0 === this.Bw && (this.Bw = this.Rw[0]), this.Uy.pause(), this.Rg.next({ type: Pt.b.AdPaused }); + } + resumeAd() { + this._w && void 0 === this.Bw && (this.Bw = this.Rw[0]), this.Mw = !0, this.Uy.play(), this.Zn === St.b.Ios && Object(T.z)(this.Uy), this.Rg.next({ type: Pt.b.AdPlaying }); + } + expandAd() { + } + collapseAd() { + } + skipAd() { + this.Rg.next({ type: Pt.b.AdSkipped }); + } + getAdRemainingTime() { + return this.Uy.duration - this.Uy.currentTime; + } + getAdDuration() { + return this.Uy.duration ? this.Uy.duration : 0; + } + getAdVolume() { + return this.Uy.volume; + } + setAdVolume(t) { + this.Uy.volume = t; + } + getAdMediaWidth() { + return this.Uy.videoWidth; + } + getAdMediaHeight() { + return this.Uy.videoHeight; + } + destroy() { + if (!this.Aw && !this._w) + try { + Object(T.I)(this.Uy, 'cnx-ad-video-slot'), this.Nw(this.Uy), this.Uy.removeAttribute('src'), this.Hw && (this.Hw.destroy(), this.Hw = null); + } catch (t) { + Object(n.a)({ + level: h.ProtoLoggingLevelEnum.WARNING, + message: 'AdManager_VastIntegrator_destroyAd', + exception: t.message, + callStack: t.stack + }); + } + } + $w() { + let t = { forceMaxLevel: !0 }; + this.er && this.er.indexOf(Ir.domain) > -1 && (t = { + forceMaxLevel: !1, + forceResolutionHeight: Ir.resolutionHeight + }), this.Hw = new _r(this.jw, this.Uy, this.js, t), this.Hw.start(() => { + this.Fw(); + }, () => { + this.Rg.next({ + type: Pt.b.AdError, + payload: { errorMessage: Yn.c.CnxMediaSrcNotSupported } + }); + }); + } + Uw(t, i) { + this.qw = this.js.createElement('a'), t && (this.qw.href = t, this.qw.target = '_blank'), Object(T.a)(this.qw, 'cnx-ad-slot'), i.appendChild(this.qw), this.qw.addEventListener('click', this.Dw); + } + addVideoEvents(t) { + this.Pw.forEach(i => { + t.addEventListener(i, this.Dw); + }), this.qw && this.qw.addEventListener('click', this.Dw); + } + Nw(t) { + this.Pw.forEach(i => { + t.removeEventListener(i, this.Dw); + }), this.qw && this.qw.removeEventListener('click', this.Dw); + } + Fw() { + this.Tw || (this.Tw = !0, this.Rg.next({ + type: Pt.b.AdLoaded, + payload: {} + })); + } + Vw() { + this.Rg.next({ type: Pt.b.AdRemainingTimeChange }); + const t = Object(wi.e)(0, this.Uy.duration, 0, 100, this.Uy.currentTime); + if (this.Bw && t >= this.Bw.position) { + this.Lw || this.Rg.next({ type: this.Bw.event }); + const t = this.Bw; + this.Bw = this.Rw[this.Rw.indexOf(this.Bw) + 1], t.event === Pt.b.AdVideoComplete && (this.Ew = !1, this.stopAd('videoComplete'), this.Lw = !0); + } + } + } + var Tr; + !function (t) { + t.errorIframe = 'Error creating iframe'; + }(Tr || (Tr = {})); + const Pr = 'cnxProxyTask', Mr = `\n window.${ Pr } = function(task) {\n setTimeout(function(){\n task();\n }, 0);\n }\n`; + class Er { + static executeAsync(t, i) { + this.zw(t)(i); + } + static Ww(t) { + return !!t[Pr]; + } + static zw(t) { + return this.Ww(t) || this.Gw(t), t[Pr]; + } + static Gw(t) { + const i = t.document.head; + Object(T.w)(i, t, Mr); + } + } + class Lr { + constructor(t, i, e) { + this.js = t, this.co = i, this.kh = e; + } + Jw(t, i, e) { + let s = !1; + return n => { + n.contentWindow && !s && (s = !0, this.Qw(n, this.Xw(t, i), e)); + }; + } + Yw(t, i, e, s, n) { + return this.Kw(t, this.Jw(i, e, s), n); + } + Kw(t, i, e) { + const s = this.js.createElement('iframe', e); + return s.allow = 'autoplay', s.src = 'javascript:false', s.srcdoc = '', s.width = '100%', s.height = '100%', s.style.position = 'absolute', s.style.left = '0', s.style.top = '0', s.style.margin = '0px', s.style.padding = '0px', s.style.border = '0px', s.style.width = '100%', s.style.height = '100%', s.setAttribute('SCROLLING', 'NO'), s.onload = () => { + i(s); + }, t.appendChild(s), i(s), s; + } + Qw(t, i, e) { + const s = Object(T.s)(t); + Er.executeAsync(s, () => { + try { + const e = t.contentWindow && t.contentWindow.document; + e.open(), e.write(i); + } catch (i) { + this.Zw(t, i), t = null; + } + e(t); + }); + } + Xw(t, i) { + return Object.keys(i).forEach(function (e) { + let s; + s = 'object' == typeof s ? JSON.stringify(i[e]) : i[e], t = t.replace(new RegExp(`{{${ e }}}`, 'g'), s); + }), t; + } + loadIframe(t) { + const i = '' + (t.customHead ? t.customHead : '') + '' + (t.customHtml ? t.customHtml : '') + '', e = 'cnx-iframe_' + Object(Li.c)(); + return new Promise((s, n) => { + this.tO = this.Yw(t.container, i, { iframeID: e }, i => { + if (null === i) + return void n(Tr.errorIframe); + const r = t => { + let h; + try { + h = JSON.parse(t.data); + } catch (t) { + return; + } + h.id === e && (i.contentWindow ? (i.contentWindow.document.close(), i.contentWindow.removeEventListener('message', r), s({ iframe: i })) : n('The Iframe is no longer in the DOM')); + }; + try { + i.contentWindow.addEventListener('message', r); + const { + advertiserLineItemId: e, + heavyAdBlockTypeEnum: s + } = t.customReportingLog; + this.iO = new b(this.tO.contentWindow, this.co, { + advertiserLineItemId: e, + heavyAdBlockTypeEnum: s + }); + } catch (t) { + this.Zw(i, t), n('Iframe callback error'); + } + }, this.kh); + }); + } + get iframe() { + return this.tO; + } + destroy() { + this.iO.destroy(), this.tO = null; + } + Zw(t, i) { + this.js.isDetachedFromDOM(t) ? Object(n.a)({ + message: 'iframeLoader_(inDom_false)', + exception: i.message, + callStack: i.stack, + level: h.ProtoLoggingLevelEnum.WARNING, + sendMaxLog: !1, + throttle: 1 + }) : Object(n.a)({ + message: 'iframeLoader_(inDom_true)', + exception: i.message, + callStack: i.stack, + level: h.ProtoLoggingLevelEnum.WARNING, + logJsonState: !0, + sendMaxLog: !1, + throttle: 1 + }), Object(T.J)(t); + } + } + class Rr { + constructor(t, i, e, s, n) { + this.eO = t, this.js = i, this.co = e, this.Xn = s, this.sO = n, this.nO = { + bodyTamplate: `
'; + }, s = function (t, e) { + var n = '__runScript' + ++i; + return _satellite[n] = function (e) { + e.call(t.event.element, t.event, t.event.target), delete _satellite[n]; + }, ''; + }, c = { + javascript: function (e, t) { + return e.settings.global ? o(e, t) : s(e, t); + }, + html: function (e, t) { + return a(e) ? r.replaceTokens(t, e.event) : t; + } + }; + e.exports = function (e, t) { + return c[e.settings.language](e, t); + }; + } + }, + 'core/src/lib/actions/helpers/loadCodeSequentially.js': { + script: function (e, t, n) { + 'use strict'; + var r = n('@adobe/reactor-promise'), i = n('./getSourceByUrl'), a = r.resolve(); + e.exports = function (t) { + var e = new r(function (n) { + var e = i(t); + r.all([ + e, + a + ]).then(function (e) { + var t = e[0]; + n(t); + }); + }); + return a = e; + }; + } + }, + 'core/node_modules/postscribe/dist/postscribe.js': { + script: function (n, r) { + !function i(e, t) { + 'object' == typeof r && 'object' == typeof n ? n.exports = t() : 'function' == typeof define && define.amd ? define([], t) : 'object' == typeof r ? r.postscribe = t() : e.postscribe = t(); + }(this, function () { + return function (n) { + function r(e) { + if (i[e]) + return i[e].exports; + var t = i[e] = { + exports: {}, + id: e, + loaded: !1 + }; + return n[e].call(t.exports, t, t.exports, r), t.loaded = !0, t.exports; + } + var i = {}; + return r.m = n, r.c = i, r.p = '', r(0); + }([ + function (e, t, n) { + 'use strict'; + function r(e) { + return e && e.__esModule ? e : { 'default': e }; + } + var i = r(n(1)); + e.exports = i['default']; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function i(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function u() { + } + function l() { + var e = c.shift(); + if (e) { + var t = o.last(e); + t.afterDequeue(), e.stream = a.apply(undefined, e), t.afterStreamStart(); + } + } + function a(e, t, r) { + function i(e) { + e = r.beforeWrite(e), m.write(e), r.afterWrite(e); + } + (m = new p['default'](e, r)).id = g++, m.name = r.name || m.id, d.streams[m.name] = m; + var n = e.ownerDocument, a = { + close: n.close, + open: n.open, + write: n.write, + writeln: n.writeln + }; + f(n, { + close: u, + open: u, + write: function s() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + return i(t.join('')); + }, + writeln: function c() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + return i(t.join('') + '\n'); + } + }); + var o = m.win.onerror || u; + return m.win.onerror = function (e, t, n) { + r.error({ msg: e + ' - ' + t + ': ' + n }), o.apply(m.win, [ + e, + t, + n + ]); + }, m.write(t, function () { + f(n, a), m.win.onerror = o, r.done(), m = null, l(); + }), m; + } + function d(e, t, n) { + if (o.isFunction(n)) + n = { done: n }; + else if ('clear' === n) + return c = [], m = null, void (g = 0); + n = o.defaults(n, s); + var r = [ + e = /^#/.test(e) ? window.document.getElementById(e.substr(1)) : e.jquery ? e[0] : e, + t, + n + ]; + return e.postscribe = { + cancel: function i() { + r.stream ? r.stream.abort() : r[1] = u; + } + }, n.beforeEnqueue(r), c.push(r), m || l(), e.postscribe; + } + t.__esModule = !0; + var f = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }; + t['default'] = d; + var p = i(n(2)), o = r(n(4)), s = { + afterAsync: u, + afterDequeue: u, + afterStreamStart: u, + afterWrite: u, + autoFix: !0, + beforeEnqueue: u, + beforeWriteToken: function h(e) { + return e; + }, + beforeWrite: function v(e) { + return e; + }, + done: u, + error: function b(e) { + throw new Error(e.msg); + }, + releaseAsync: !1 + }, g = 0, c = [], m = null; + f(d, { + streams: {}, + queue: c, + WriteStream: p['default'] + }); + }, + function (e, t, n) { + 'use strict'; + function r(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function i(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function y(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function _(e, t) { + var n = w + t, r = e.getAttribute(n); + return E.existy(r) ? String(r) : r; + } + function C(e, t, n) { + var r = 2 < arguments.length && n !== undefined ? arguments[2] : null, i = w + t; + E.existy(r) && '' !== r ? e.setAttribute(i, r) : e.removeAttribute(i); + } + t.__esModule = !0; + var x = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }, k = i(n(3)), E = r(n(4)), I = !1, w = 'data-ps-', D = 'ps-style', A = 'ps-script', a = function () { + function r(e, t) { + var n = 1 < arguments.length && t !== undefined ? arguments[1] : {}; + y(this, r), this.root = e, this.options = n, this.doc = e.ownerDocument, this.win = this.doc.defaultView || this.doc.parentWindow, this.parser = new k['default']('', { autoFix: n.autoFix }), this.actuals = [e], this.proxyHistory = '', this.proxyRoot = this.doc.createElement(e.nodeName), this.scriptStack = [], this.writeQueue = [], C(this.proxyRoot, 'proxyof', 0); + } + return r.prototype.write = function n() { + var e; + for ((e = this.writeQueue).push.apply(e, arguments); !this.deferredRemote && this.writeQueue.length;) { + var t = this.writeQueue.shift(); + E.isFunction(t) ? this._callFunction(t) : this._writeImpl(t); + } + }, r.prototype._callFunction = function i(e) { + var t = { + type: 'function', + value: e.name || e.toString() + }; + this._onScriptStart(t), e.call(this.win, this.doc), this._onScriptDone(t); + }, r.prototype._writeImpl = function a(e) { + this.parser.append(e); + for (var t = void 0, n = void 0, r = void 0, i = []; (t = this.parser.readToken()) && !(n = E.isScript(t)) && !(r = E.isStyle(t));) + (t = this.options.beforeWriteToken(t)) && i.push(t); + 0 < i.length && this._writeStaticTokens(i), n && this._handleScriptToken(t), r && this._handleStyleToken(t); + }, r.prototype._writeStaticTokens = function o(e) { + var t = this._buildChunk(e); + return t.actual ? (t.html = this.proxyHistory + t.actual, this.proxyHistory += t.proxy, this.proxyRoot.innerHTML = t.html, I && (t.proxyInnerHTML = this.proxyRoot.innerHTML), this._walkChunk(), I && (t.actualInnerHTML = this.root.innerHTML), t) : null; + }, r.prototype._buildChunk = function l(e) { + for (var t = this.actuals.length, n = [], r = [], i = [], a = e.length, o = 0; o < a; o++) { + var s = e[o], c = s.toString(); + if (n.push(c), s.attrs) { + if (!/^noscript$/i.test(s.tagName)) { + var u = t++; + r.push(c.replace(/(\/?>)/, ' ' + w + 'id=' + u + ' $1')), s.attrs.id !== A && s.attrs.id !== D && i.push('atomicTag' === s.type ? '' : '<' + s.tagName + ' ' + w + 'proxyof=' + u + (s.unary ? ' />' : '>')); + } + } else + r.push(c), i.push('endTag' === s.type ? c : ''); + } + return { + tokens: e, + raw: n.join(''), + actual: r.join(''), + proxy: i.join('') + }; + }, r.prototype._walkChunk = function s() { + for (var e = void 0, t = [this.proxyRoot]; E.existy(e = t.shift());) { + var n = 1 === e.nodeType; + if (!n || !_(e, 'proxyof')) { + n && C(this.actuals[_(e, 'id')] = e, 'id'); + var r = e.parentNode && _(e.parentNode, 'proxyof'); + r && this.actuals[r].appendChild(e); + } + t.unshift.apply(t, E.toArray(e.childNodes)); + } + }, r.prototype._handleScriptToken = function c(e) { + var t = this, n = this.parser.clear(); + n && this.writeQueue.unshift(n), e.src = e.attrs.src || e.attrs.SRC, (e = this.options.beforeWriteToken(e)) && (e.src && this.scriptStack.length ? this.deferredRemote = e : this._onScriptStart(e), this._writeScriptToken(e, function () { + t._onScriptDone(e); + })); + }, r.prototype._handleStyleToken = function u(e) { + var t = this.parser.clear(); + t && this.writeQueue.unshift(t), e.type = e.attrs.type || e.attrs.TYPE || 'text/css', (e = this.options.beforeWriteToken(e)) && this._writeStyleToken(e), t && this.write(); + }, r.prototype._writeStyleToken = function d(e) { + var t = this._buildStyle(e); + this._insertCursor(t, D), e.content && (t.styleSheet && !t.sheet ? t.styleSheet.cssText = e.content : t.appendChild(this.doc.createTextNode(e.content))); + }, r.prototype._buildStyle = function t(e) { + var n = this.doc.createElement(e.tagName); + return n.setAttribute('type', e.type), E.eachKey(e.attrs, function (e, t) { + n.setAttribute(e, t); + }), n; + }, r.prototype._insertCursor = function f(e, t) { + this._writeImpl(''); + var n = this.doc.getElementById(t); + n && n.parentNode.replaceChild(e, n); + }, r.prototype._onScriptStart = function p(e) { + e.outerWrites = this.writeQueue, this.writeQueue = [], this.scriptStack.unshift(e); + }, r.prototype._onScriptDone = function g(e) { + e === this.scriptStack[0] ? (this.scriptStack.shift(), this.write.apply(this, e.outerWrites), !this.scriptStack.length && this.deferredRemote && (this._onScriptStart(this.deferredRemote), this.deferredRemote = null)) : this.options.error({ msg: 'Bad script nesting or script finished twice' }); + }, r.prototype._writeScriptToken = function m(e, t) { + var n = this._buildScript(e), r = this._shouldRelease(n), i = this.options.afterAsync; + e.src && (n.src = e.src, this._scriptLoadHandler(n, r ? i : function () { + t(), i(); + })); + try { + this._insertCursor(n, A), n.src && !r || t(); + } catch (a) { + this.options.error(a), t(); + } + }, r.prototype._buildScript = function h(e) { + var n = this.doc.createElement(e.tagName); + return E.eachKey(e.attrs, function (e, t) { + n.setAttribute(e, t); + }), e.content && (n.text = e.content), n; + }, r.prototype._scriptLoadHandler = function v(t, n) { + function r() { + t = t.onload = t.onreadystatechange = t.onerror = null; + } + function i() { + r(), null != n && n(), n = null; + } + function a(e) { + r(), o(e), null != n && n(), n = null; + } + function e(e, t) { + var n = e['on' + t]; + null != n && (e['_on' + t] = n); + } + var o = this.options.error; + e(t, 'load'), e(t, 'error'), x(t, { + onload: function s() { + if (t._onload) + try { + t._onload.apply(this, Array.prototype.slice.call(arguments, 0)); + } catch (e) { + a({ msg: 'onload handler failed ' + e + ' @ ' + t.src }); + } + i(); + }, + onerror: function c() { + if (t._onerror) + try { + t._onerror.apply(this, Array.prototype.slice.call(arguments, 0)); + } catch (e) { + return void a({ msg: 'onerror handler failed ' + e + ' @ ' + t.src }); + } + a({ msg: 'remote script failed ' + t.src }); + }, + onreadystatechange: function u() { + /^(loaded|complete)$/.test(t.readyState) && i(); + } + }); + }, r.prototype._shouldRelease = function b(e) { + return !/^script$/i.test(e.nodeName) || !!(this.options.releaseAsync && e.src && e.hasAttribute('async')); + }, r; + }(); + t['default'] = a; + }, + function (n) { + !function r(e, t) { + n.exports = t(); + }(0, function () { + return function (n) { + function r(e) { + if (i[e]) + return i[e].exports; + var t = i[e] = { + exports: {}, + id: e, + loaded: !1 + }; + return n[e].call(t.exports, t, t.exports, r), t.loaded = !0, t.exports; + } + var i = {}; + return r.m = n, r.c = i, r.p = '', r(0); + }([ + function (e, t, n) { + 'use strict'; + function r(e) { + return e && e.__esModule ? e : { 'default': e }; + } + var i = r(n(1)); + e.exports = i['default']; + }, + function (e, t, n) { + 'use strict'; + function r(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function i(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function l(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + t.__esModule = !0; + var d = i(n(2)), f = i(n(3)), p = r(n(6)), a = n(5), g = { + comment: /^'); + if (0 <= t) + return new l.CommentToken(e.substr(4, t - 1), t + 3); + } + function i(e) { + var t = e.indexOf('<'); + return new l.CharsToken(0 <= t ? t : e.length); + } + function a(e) { + var o, s, c; + if (-1 !== e.indexOf('>')) { + var t = e.match(d.startTag); + if (t) { + var n = (o = {}, s = {}, c = t[2], t[2].replace(d.attr, function (e, t, n, r, i, a) { + n || r || i || a ? arguments[5] ? (o[arguments[5]] = '', s[arguments[5]] = !0) : o[t] = arguments[2] || arguments[3] || arguments[4] || d.fillAttr.test(t) && t || '' : o[t] = '', c = c.replace(e, ''); + }), { v: new l.StartTagToken(t[1], t[0].length, o, s, !!t[3], c.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')) }); + if ('object' === (void 0 === n ? 'undefined' : u(n))) + return n.v; + } + } + } + function o(e) { + var t = a(e); + if (t) { + var n = e.slice(t.length); + if (n.match(new RegExp('', 'i'))) { + var r = n.match(new RegExp('([\\s\\S]*?)', 'i')); + if (r) + return new l.AtomicTagToken(t.tagName, r[0].length + t.length, t.attrs, t.booleanAttrs, r[1]); + } + } + } + function s(e) { + var t = e.match(d.endTag); + if (t) + return new l.EndTagToken(t[1], t[0].length); + } + t.__esModule = !0; + var u = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + }; + t.comment = r, t.chars = i, t.startTag = a, t.atomicTag = o, t.endTag = s; + var l = n(4), d = { + startTag: /^<([\-A-Za-z0-9_]+)((?:\s+[\w\-]+(?:\s*=?\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, + endTag: /^<\/([\-A-Za-z0-9_]+)[^>]*>/, + attr: /(?:([\-A-Za-z0-9_]+)\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))|(?:([\-A-Za-z0-9_]+)(\s|$)+)/g, + fillAttr: /^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noresize|noshade|nowrap|readonly|selected)$/i + }; + }, + function (e, t, n) { + 'use strict'; + function s(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + t.__esModule = !0, t.EndTagToken = t.AtomicTagToken = t.StartTagToken = t.TagToken = t.CharsToken = t.CommentToken = t.Token = undefined; + var c = n(5), r = t.Token = function r(e, t) { + s(this, r), this.type = e, this.length = t, this.text = ''; + }, i = (t.CommentToken = function () { + function n(e, t) { + s(this, n), this.type = 'comment', this.length = t || (e ? e.length : 0), this.text = '', this.content = e; + } + return n.prototype.toString = function e() { + return '\n\n\n\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL5680a5ab6cc84d41877c8deebeecc8ce', + name: 'adTag:tradedesk', + events: [{ + modulePath: 'core/src/lib/events/libraryLoaded.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('tradedesk:pageListMapping'), t = window.location.pathname; + return 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'), _satellite.setVar('tradedeskURL', _fdx.pageFlag(e, t)), !1 !== _satellite.getVar('tradedeskURL'); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '', + language: 'html' + } + }] + }, + { + id: 'RL3032275111b44566ad9856681e27aef3', + name: 'MAGIC POC', + events: [{ + modulePath: 'core/src/lib/events/customEvent.js', + settings: { + type: 'event-view-start', + elementSelector: 'body', + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC8c69d18aedde45889a6e05ae4bdda4cf-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLc4dde5549eeb4f908c000c1a6eb5aca3', + name: 'sp:directHits', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [{ + value: 'search=true', + valueIsRegex: !0 + }] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return !(void 0 !== _satellite.getVar('content:Delayed Page Type') && 'delayed' == _satellite.getVar('content:Delayed Page Type') || -1 < window.location.href.indexOf('search.html?q=') || -1 < window.location.href.indexOf('register.html') || -1 < window.location.href.indexOf('/online/rating.html')); + } + } + } + ], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + var n = new URLSearchParams().get('spterm'); + void 0 !== n && '' != n && null !== n ? (n = n.replace(/\;.*/, ''), t.prop1 = t.eVar1 = n, t.linkTrackEvents = t.events = t.apl(t.events, 'event118', ',', 2)) : t.linkTrackEvents = t.events = t.apl(t.events, 'event119', ',', 2); + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { type: 'page' } + } + ] + }, + { + id: 'RLb8d70f6cba5243e8b553a2df73e1bffd', + name: 'gTag:TargetVideoExperience', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: '.vjs-big-play-button', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/path.js', + settings: { + paths: [{ + value: '/en-us/ecommerce/(shipping-options.html|tools-and-services.html)', + valueIsRegex: !0 + }] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:TargetVideoMapping'), t = this.parentElement.getAttribute('data-video-id'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('targetVideoGtagLabel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC920bc1a3aec8479790f21f7565fe8a98-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLb7b3001c66e94e1286f0c8157ba06305', + name: 'video:Play', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 1, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + if ('undefined' != typeof this.parentElement) { + for (var n = this.parentElement.getAttribute('id'), r = this.parentElement.getAttribute('data-video-id'), i = document.getElementsByClassName('brightcove-container'), a = 0; a < i.length; a++) + if (n == i[a].getAttribute('data-playerid')) { + var o = document.getElementsByClassName('vjs-dock-title'); + t.eVar42 = o[a].innerText, t.eVar31 = r, t.linkTrackVars = t.apl(t.linkTrackVars, 'eVar42,eVar31', ',', 2); + } + t.linkTrackEvents = t.events = 'event203'; + } + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Video:Play', + linkType: 'o' + } + } + ] + }, + { + id: 'RL62dd0b6bdff14f7d94292cf324c5e22e', + name: 'gTagIndia:Adwords', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '\\/en-in\\/(tracking|home|coronavirus|shipping|billing).html', + valueIsRegex: !0 + }, + { + value: '\\/en-in\\/(customer-support|open-account|customs-tools|conditions-of-carriage).html', + valueIsRegex: !0 + }, + { + value: '\\/en-in\\/(about|campaign|open-account|shipping|trust-center|online)\\/(possibilities|delivering-what-matters|start-shipping|surcharges|getstarted|resources|rates|small-business|report-fraud|rating).html', + valueIsRegex: !0 + }, + { + value: '\\/en-in\\/about\\/possibilities\\/articles\\/flowers.html', + valueIsRegex: !0 + }, + { + value: '\\/en-in\\/about\\/possibilities\\/making-it-work.html', + valueIsRegex: !0 + }, + { + value: '\\/en-in\\/shipping\\/industry-solutions\\/(healthcare.html|(healthcare\\/temperature-control.html)|(healthcare\\/contact-us.html))', + valueIsRegex: !0 + } + ] + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'gtag(\'event\', \'page_view\', {\n \'send_to\': \'AW-673681829\',\n});', + language: 'javascript' + } + }] + }, + { + id: 'RL34cefc959fda4a56a9b5b0f3c24a128a', + name: 'gTag:ButtonEvent', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: '#subscribebutton', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return _satellite.getVar('gTag:EnabledLocaleEpic') !== undefined && null !== _satellite.getVar('gTag:EnabledLocaleEpic') && '' !== _satellite.getVar('gTag:EnabledLocaleEpic'); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCb67d34694a5f4a37be16c00a6c79675b-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLb70a853b0b7d44419e6f7f587c022bd2', + name: 'event:social share', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'img', + elementProperties: [{ + name: 'data-analytics', + value: 'social', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = this.getAttribute('data-analytics'); + return !(0 <= e.indexOf('Newsletter') && (fdx_setLinkView(e), 1)); + } + } + }], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + t.linkTrackVars = t.apl(t.linkTrackVars, 'prop18,prop19,prop20,eVar65', ',', 2), t.events = t.apl(t.events, 'event56', ',', 2), 'None' !== t.linkTrackEvents ? t.linkTrackEvents = t.linkTrackEvents + ',event56' : t.linkTrackEvents = 'event56', window.nltrk = 'y'; + var n = this.getAttribute('data-analytics'); + 'undefined' !== n && null !== n && (t.eVar65 = n.substring(n.lastIndexOf('|') + 1), t.prop18 = t.pageName, t.prop19 = n, t.prop20 = t.pageName + ' | ' + n); + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkType: 'o' + } + } + ] + }, + { + id: 'RL2fde5e408e5b4796b1166d741090253c', + name: 'event:hp link click', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a', + elementProperties: [{ + name: 'data-analytics', + value: '.*', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = void 0 !== this.getAttribute('data-analytics') ? this.getAttribute('data-analytics') : ''; + s.linkName = e; + var t = void 0 !== this.getAttribute('target') && null !== this.getAttribute('target') && '' !== this.getAttribute('target') ? 'newPage' : 'samePage'; + if ('' != e && -1 < e.indexOf('mfxr') && (t = 'samePage'), 'samePage' == t && -1 < e.indexOf('/content/dam/fedex')) + return t = '', !1; + var n = _satellite.getVar('click:blockFlag')(e, 'click:blockList'), r = { hero: 'event200' }; + if (!e || n) + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', !1; + if ('newPage' == t) + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', fdx_setLinkView(e), !1; + if ('samePage' == t) { + var i = r[e.split('|')[0].toLowerCase()]; + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', -1 < this.href.indexOf('tel:') || fdx_logLinkView(e, i), !1; + } + } + } + }], + actions: [] + }, + { + id: 'RL214888b209ef45069b28b70f6c43a5d3', + name: 'fbTag:Global', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '\\/en-us\\/shipping\\/((freight-services)|(schedule-manage-pickups)|(store\\/ground)|(packing-supplies)|(packing-supplies\\/custom-branded-boxes)|(office-depot-officemax)|(hold-at-location)).html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/shipping\\/returns(((\\/business)|(\\/technology))\\.html|\\.html)', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/shipping\\/onsite(((\\/walgreens-package-pickup)|(\\/dollar-general-pick-up-drop-off-package)|(\\/target-pick-up-drop-off-package))\\.html|\\.html)', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/printing\\/((small-medium-business-offers)|(consumer-offers)|(flash-sale-offers)|(passport-photo)|(national-bid-center)|(business-solutions\\/knowledge-center)|(design-services))\\.html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/discount-programs\\/(em15692113|em15692213|em15692013|ag13398602)\\.html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/delivery-manager((\\/how-to-prevent-stolen-missing-packages|\\/manage-your-deliveries).html|.html)', + valueIsRegex: !0 + }, + { value: '/en-us/home.html?location=home' }, + { + value: '\\/en-us\\/(possibilities|office\\/walmart|create-account|big-commerce|coupon-offers\\/ground|healthcare\\/vaccine-shipping|ecommerce\\/offer-store-pickup-at-checkout).html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/(small-business|sustainability).html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/holiday(\\/consumer-shipping-delivery-guide.html|.html)', + valueIsRegex: !0 + } + ] + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RLc858f1d6150f4bf4af035a411cc23223', + name: 'event:phone click', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a', + elementProperties: [{ + name: 'href', + value: 'tel:', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return _satellite.setVar('tele', this.text), !0; + } + } + }], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + t.linkTrackEvents = t.events = t.apl(t.events, 'event1', ',', 2); + } + }, + trackerProperties: { + eVars: [{ + name: 'eVar147', + type: 'value', + value: '%tele%' + }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Phone Number', + linkType: 'o' + } + } + ] + }, + { + id: 'RL0601596e41d147989e65da56fdb20c36', + name: 'oneTag:Flashtalking Tag', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('FlashTalking:pageListMapping'), t = window.location.href; + t = /.com(.*)/.exec(t)[1]; + var n = 10000000000000 * (Math.random() + ''); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var r = _fdx.pageFlag(e, t); + return 0 != r && (_satellite.setVar('flashtalkingURL', r + n), !0); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '', + language: 'html' + } + }] + }, + { + id: 'RL87ee5aceb1454e8da2ca0735964570bd', + name: 'gTag:btnAW', + events: [ + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.default.fxg-link--align-left.fxg-link--mobile-align-center', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--md.fxg-link--rounded_button.fxg-link--align-left.sup.sub', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--blue.fxg-link--mobile-align-center', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--rounded_button.fxg-link--align-center.fxg-link--mobile-align-center', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--rounded_button.fxg-button--round.fxg-link--align-center.fxg-link--mobile-align-center', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button.fxg-button--submit.fxg-button--orange.js-cms-form-submit', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + } + ], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:btnAWPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('awLabel', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('awLabel', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCa43b2296d9b3436bb4e74b0306475990-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL2c9a6e6f66764298b7b12f7336b6f82c', + name: 'adTag:dfa', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('dfa:pageListMapping'), t = _satellite.getVar('content:countryCode'), n = window.location.href; + n = /.com(.*)/.exec(n)[1]; + var r = 10000000000000 * (Math.random() + ''); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var i = _fdx.pageFlag(e, t, 'country'), a = _fdx.pageFlag(i, n); + return _satellite.setVar('dfaLabel', a + r), !1 !== a; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '', + language: 'html' + } + }] + }, + { + id: 'RL063d5aa0856a4efebb793190c41be714', + name: 'event:cube click', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'div .fxg-cube', + elementProperties: [{ + name: 'data-analytics', + value: 'hero.*', + valueIsRegex: !0 + }], + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function (e, t) { + var n = void 0 !== this.getAttribute('data-analytics') ? this.getAttribute('data-analytics') : '', r = (t = void 0 !== this.getAttribute('data-link-target') ? 'newPage' : 'samePage', { hero: 'event200' }); + if (!n || -1 < n.indexOf('TRACK')) + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', !(window.nltrk = 'y'); + if ('newPage' == t) + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', fdx_setLinkView(n), !1; + if ('samePage' == t) { + var i = r[n.split('|')[0].toLowerCase()]; + return FDX.DATALAYER.page.link.data = '', FDX.DATALAYER.page.link.type = '', fdx_logLinkView(n, i), !1; + } + } + } + }], + actions: [] + }, + { + id: 'RL46559f169cad499e8fa0c4b1fa8a52d0', + name: 'video:75% Viewed', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 75, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + if ('undefined' != typeof this.parentElement) { + for (var n = this.parentElement.getAttribute('id'), r = this.parentElement.getAttribute('data-video-id'), i = document.getElementsByClassName('brightcove-container'), a = 0; a < i.length; a++) + if (n == i[a].getAttribute('data-playerid')) { + var o = document.getElementsByClassName('vjs-dock-title'); + t.eVar42 = o[a].innerText, t.eVar31 = r, t.linkTrackVars = t.apl(t.linkTrackVars, 'eVar42,eVar31', ',', 2); + } + t.linkTrackEvents = t.events = 'event206'; + } + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Video:75% Viewed', + linkType: 'o' + } + } + ] + }, + { + id: 'RLcc52c9029474460c80f7563c76fc82aa', + name: 'tradedesk:eventBtnClickTTD', + events: [ + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(link\\|Find a Dollar General)|(link\\|Sign up for free)|(hero\\|Find a Walgreens Near You)|(hero\\|See Current Offers)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--rounded_button.fxg-button--round', + elementProperties: [{ + name: 'data-analytics', + value: '(link\\|sign up now)|(link\\|Next time use FedEx Delivery Manager\\|SIGN UP FOR FREE)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + } + ], + conditions: [ + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '\\/en-us\\/shipping\\/onsite\\/(walgreens-package-pickup|dollar-general-pick-up-drop-off-package).html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/printing\\/consumer-offers.html', + valueIsRegex: !0 + }, + { + value: '\\/en-us\\/delivery-manager.html', + valueIsRegex: !0 + } + ] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('tradedesk:btnClickPageListMapping'), t = this.getAttribute('data-analytics').toLowerCase(); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('tdPixel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC95fc8c7d808448b7af9314f1d7b35f02-source.min.js', + language: 'html', + isExternal: !0 + } + }] + }, + { + id: 'RLbcc1a50cbbf042b59a2f83b63c4b698d', + name: 'user:Logged In', + events: [{ + modulePath: 'core/src/lib/events/dataElementChange.js', + settings: { name: 'login:status' }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/cookie.js', + settings: { + name: 'fdx_login', + value: '.*', + valueIsRegex: !0 + } + }], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + t.linkTrackVars = t.linkTrackVars + ',events', t.linkTrackEvents = t.linkTrackEvents + ',event3,event4', '' !== _satellite.getVar('login:user-id') && _satellite.getVar('login:user-id') && (t.events = t.apl(t.events, 'event3', ',', 2), t.events = t.apl(t.events, 'event4', ',', 2)); + } + }, + trackerProperties: { + eVars: [ + { + name: 'eVar4', + type: 'value', + value: '%login:status%' + }, + { + name: 'eVar13', + type: 'value', + value: '%login:fdx_cbid%' + }, + { + name: 'eVar60', + type: 'value', + value: '%user:emailID%' + }, + { + name: 'eVar6', + type: 'value', + value: '%login:user-id%' + } + ], + props: [ + { + name: 'prop4', + type: 'alias', + value: 'eVar4' + }, + { + name: 'prop6', + type: 'alias', + value: 'eVar6' + }, + { + name: 'prop75', + type: 'value', + value: '%user:user-agent%' + }, + { + name: 'prop2', + type: 'value', + value: '%content:countryCode%' + }, + { + name: 'prop3', + type: 'value', + value: '%content:language%' + } + ] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'hdr|Logged In', + linkType: 'o' + } + } + ] + }, + { + id: 'RL03b3e38ca4d8477ea5c41ce39ea1202e', + name: 'gTag:btnDC', + events: [ + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button.fxg-button--submit.fxg-button--orange.js-cms-form-submit', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 40 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 600, + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--sm.fxg-link--rounded_button.fxg-link--align-center', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 40 + } + ], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:btnDCPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('dcLabel', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('dcLabel', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCabdb061897514f5f984e338c50342beb-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLaacfa5daba714090bc6c192215aceab2', + name: 'gTag:TargetExperience', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 1200, + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(TP\\|)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/path.js', + settings: { + paths: [ + { + value: '\\/en-us\\/shipping\\/(international.html|7-day-delivery.html|home-delivery.html)', + valueIsRegex: !0 + }, + { value: '/en-us/ecommerce/tools-and-services.html' } + ] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:TargetEnabledMapping'), t = this.getAttribute('data-analytics'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('targetGtagLabel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC3b50acc509424526a92008865a3a8821-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLe1e9c25dd91943bfbbbbb93e38662cb4', + name: 'target:login status trigger', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return adobe.target !== undefined; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'if (typeof (adobe.target) != "undefined"){\n$("body").on("loggedIn", function (e) {\n adobe.target.getOffers({\n request: {\n execute: {\n pageLoad: {\n parameters: {\n loggedIn: true\n }\n }\n }\n }\n }).then(function (response) {\n return adobe.target.applyOffers({\n response: response\n });\n }).then(function () {\n return ;\n }).catch(function (error) {\n return ;\n });\n});\n$("body").on("loggedOut", function () {\n adobe.target.getOffers({\n request: {\n execute: {\n pageLoad: {\n parameters: {\n loggedIn: false\n }\n }\n }\n }\n }).then(function (response) {\n return adobe.target.applyOffers({\n response: response\n });\n }).then(function () {\n return ;\n }).catch(function (error) {\n return ;\n });\n});\n}', + language: 'javascript' + } + }] + }, + { + id: 'RLb5d023e024b64d93b47b6d8f214bb916', + name: 'gTag:ctaOrangeDC', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 600, + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(link \\| SIGN UP NOW)|(link\\|Sign up for free)|(hero\\|See Current Offers)|(hero\\|Find a Walgreens Near You)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 40 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:ctaOrangeDCPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('dcOrangeLabel', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('dcOrangeLabel', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC2fb1829526934171a652608724703745-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLd7bdd2ff1d334c60a065dff171f30395', + name: 'gTag:ctaOrangeAW', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 600, + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(hero\\|free download)|(link\\|Create a label)|(hero\\|ship now)|(hero\\|Chat with a sales specialist)|(hero\\|Apply Now)|(link\\|Start a free BigCommerce trial)|(hero\\|Get Started)|(link\\|Start Order)|(link\\|Sign up for free)|(link\\|Find a Dollar General)|(hero\\|See Current Offers)|(hero\\|Find a Walgreens Near You)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:ctaOrangeAWPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('awOrangeLabel', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('awOrangeLabel', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCeffc6f2a9f8f4e0f9e079bc6bffc03a4-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL1cb2acb3a2c146668497ff28c1acb45b', + name: 'gTag:ButtonEvent_Possibilities', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 100, + elementSelector: '#subscribebutton', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return _satellite.getVar('gTag:EnabledLocaleEpic') !== undefined && null !== _satellite.getVar('gTag:EnabledLocaleEpic') && '' !== _satellite.getVar('gTag:EnabledLocaleEpic'); + } + } + }, + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { paths: [{ value: '/about/possibilities' }] } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC5472b87db01942b7ac986a40e90bfe5e-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL59990f6f036d4d64825970baba108d9a', + name: 'content:all pages', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return !(void 0 !== _satellite.getVar('content:Delayed Page Type') && 'delayed' == _satellite.getVar('content:Delayed Page Type') || -1 < window.location.href.indexOf('search.html?q=') || -1 < window.location.href.indexOf('register.html') || -1 < window.location.href.indexOf('/online/rating.html') || -1 < window.location.href.indexOf('/online/shipping.html') || -1 < window.location.href.indexOf('/user-profile-completion/email?locale') || -1 < window.location.href.indexOf('/fedextracking/') || -1 < window.location.href.indexOf('fedex.com/fdmenrollment/') || -1 < window.location.href.indexOf('/shipment-history')); + } + } + }], + actions: [ + { + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'window.fdx_locale = _satellite.getVar("content:locale");', + language: 'javascript' + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar30', + type: 'value', + value: '%site-diagnostics:viewport%' + }, + { + name: 'eVar38', + type: 'value', + value: '%content:page name%' + }, + { + name: 'eVar58', + type: 'value', + value: '%external-campaign:link%' + } + ], + props: [ + { + name: 'prop2', + type: 'value', + value: '%content:countryCode%' + }, + { + name: 'prop3', + type: 'value', + value: '%content:language%' + }, + { + name: 'prop5', + type: 'value', + value: '%content:region%' + }, + { + name: 'prop23', + type: 'value', + value: '%content:historicalPageName%' + }, + { + name: 'prop33', + type: 'value', + value: '%content:page type%' + }, + { + name: 'prop38', + type: 'alias', + value: 'eVar38' + }, + { + name: 'prop58', + type: 'alias', + value: 'eVar58' + }, + { + name: 'prop67', + type: 'alias', + value: 'eVar30' + } + ], + channel: '%content:site section%', + campaign: { + type: 'queryParam', + value: 'CMP' + }, + pageName: '%content:page name%' + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { type: 'page' } + } + ] + }, + { + id: 'RL2abb26d7e6284bb29018908b26a2724e', + name: 'gTag:DCPageEvent_Possibilities', + events: [{ + modulePath: 'core/src/lib/events/domReady.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return _satellite.getVar('gTag:EnabledLocaleEpic') !== undefined && null !== _satellite.getVar('gTag:EnabledLocaleEpic') && '' !== _satellite.getVar('gTag:EnabledLocaleEpic'); + } + } + }, + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { paths: [{ value: '/about/possibilities.html' }] } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC916de6bbcf6d475882180465814be944-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLc1dcbc6f45714cf68d2715ce1e701f36', + name: 'video:100% Viewed', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 100, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + if ('undefined' != typeof this.parentElement) { + for (var n = this.parentElement.getAttribute('id'), r = this.parentElement.getAttribute('data-video-id'), i = document.getElementsByClassName('brightcove-container'), a = 0; a < i.length; a++) + if (n == i[a].getAttribute('data-playerid')) { + var o = document.getElementsByClassName('vjs-dock-title'); + t.eVar42 = o[a].innerText, t.eVar31 = r, t.linkTrackVars = t.apl(t.linkTrackVars, 'eVar42,eVar31', ',', 2); + } + t.linkTrackEvents = t.events = 'event207'; + } + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Video:Complete', + linkType: 'o' + } + } + ] + }, + { + id: 'RL23afbde63b8b40dbbe71346932e70e78', + name: 'gTag:AdWordsEvent', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var e = _fdx.pcfUtil().match(/www(sbox.idev|base.idev|dev.idev|drt.idev|stress.dmz.idev|bit.idev|test|).fedex.com/gi), t = '' == _satellite.getVar('gTagDisableLocale'), n = window.location.pathname, r = _satellite.getVar('content:countryCode'), i = _satellite.getVar('gTag:AdWordsEventMapping'), a = _fdx.pageFlag(i, r, 'country'), o = _fdx.pageFlag(a, n); + return _satellite.setVar('awLabel', o), !(!1 === o || null === e || !t); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n', + language: 'html' + } + }] + }, + { + id: 'RLdb1e395c95674ff7aca26616219e0af7', + name: 'AdobeTarget:Category Affinity', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '/en-us/shipping', + valueIsRegex: !0 + }, + { + value: '/en-us/tracking', + valueIsRegex: !0 + }, + { + value: '/en-us/printing', + valueIsRegex: !0 + }, + { + value: '/en-us/customer-support', + valueIsRegex: !0 + }, + { + value: '/en-us/ecommerce', + valueIsRegex: !0 + }, + { + value: '/en-us/small-business', + valueIsRegex: !0 + } + ] + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'adobe.target.trackEvent({\n "mbox": "category-affinity",\n "params": {\n "user.categoryId": _satellite.getVar("content:pagePath")\n }\n});\n', + language: 'javascript' + } + }] + }, + { + id: 'RLcb3074c4f6cd466fb7acafbd53ebd3e6', + name: 'gTag:btnFB', + events: [ + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--md.fxg-link--rounded_button.fxg-link--align-left.sup.sub', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 60 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-link.js-fxgc-init.fxg-link--blue.fxg-link--mobile-align-center.fxg-mobile--hide', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 60 + } + ], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:btnFBPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('fbEvent', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('fbEvent', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC0d3f4179488b4834853fc641b01fb664-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL0af5ffa803c0439c9c7ec1444d626b0c', + name: 'search - S&P', + events: [{ + modulePath: 'core/src/lib/events/dataElementChange.js', + settings: { name: 'search:spData - JSObjectChange' }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return -1 < window.location.href.indexOf('search.html?q='); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC16397bad83154e3a9ee5418e4208405e-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL4e0120b8ae6c464699bd4b24a4043ee6', + name: 'user:user info', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [], + actions: [{ + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + 'Logged In' == _satellite.getVar('login:status') && (t.events = t.apl(t.events, 'event3', ',', 2)); + } + }, + trackerProperties: { + eVars: [ + { + name: 'eVar4', + type: 'value', + value: '%login:status%' + }, + { + name: 'eVar13', + type: 'value', + value: '%login:fdx_cbid%' + }, + { + name: 'eVar60', + type: 'value', + value: '%user:emailID%' + } + ], + props: [ + { + name: 'prop4', + type: 'alias', + value: 'eVar4' + }, + { + name: 'prop75', + type: 'value', + value: '%user:user-agent%' + } + ] + } + } + }] + }, + { + id: 'RLd0a63ac05e2c4acea3ca2d8126a9f565', + name: 'va:popin', + events: [{ + modulePath: 'core/src/lib/events/domReady.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('content:deviceType'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var t = _satellite.getVar('va:enabledCountryList'), n = _satellite.getVar('content:countryCode'), r = _satellite.getVar('va:mobEnabledUrl'), i = _fdx.pageFlag(t, n), a = _satellite.getVar('va:caasEnabledCountryList'), o = _satellite.getVar('va:caasMobEnabledUrl'), s = _satellite.getVar('content:locale'), c = _satellite.getVar('va:caasDisabledCountryList'); + -1 < a.indexOf(s) ? isCaasMobEnabled = !0 : isCaasMobEnabled = !1; + var u = window.location.pathname, l = '/' + _satellite.getVar('content:locale').replace('_', '-') + '/', d = _satellite.getVar('va:disabledPageList'), f = !_fdx.pageFlag(d, u), p = !_fdx.pageFlag(d, l), g = _fdx.pageFlag(r, u), m = _fdx.pageFlag(o, u), h = i && f, v = i && p && c, b = i && g, y = i && p && m && isCaasMobEnabled; + return FDX.CAAS === undefined ? !('desktop' != e || !h) || !('mobile' != e || !b) : !('desktop' != e || !v) || !('mobile' != e || !y); + } + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + return _satellite.cookie.get('wcmmode') == undefined; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCe07e504fe3ee44a08cabb62a78097b21-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL7fb9e83e0f2f4987b3ab3a8cf9c83975', + name: 'event:vaPopin click', + events: [{ + modulePath: 'core/src/lib/events/dataElementChange.js', + settings: { name: 'event:vaClick' }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = 'undefined' != typeof FDX.DATALAYER.VA && FDX.DATALAYER.VA ? FDX.DATALAYER.VA : ''; + 'function' == typeof fdx_logChat && e && fdx_logChat(e, 'va_NINA'); + } + } + }], + actions: [] + }, + { + id: 'RLb75c4c61b6af499b8bfdefe358d7015e', + name: 'medallia', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '/(((en|fr|de|it)-ch)|(he-il)|(ru-ru)|(tr-tr)|(uk-ua))/tracking.html', + valueIsRegex: !0 + }, + { + value: '/((en-(il|ru|tr))|(fr-fr)|((en|de|it)-ch)|(he-il)|(ru-ru)|(tr-tr)|((en|ru|uk)-ua))/online/shipping.html', + valueIsRegex: !0 + } + ] + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'var version = "2006.07242020.01";\nif (window.location.hostname == "www.fedex.com" || window.location.hostname == "www.spain.fedex.com") {\n window.MDIGITAL_ON_PREM_PREFIX = "https://on-prem.kampyle.com/FedexProd/COLO";\n} else {\n window.MDIGITAL_ON_PREM_PREFIX = "https://on-prem.kampyle.com/FedexTest/COLO";\n}\n(function() {\n if (!window.KAMPYLE_EMBED) {\n var onPremEmbedRegex = /\\/[a-zA-Z\\d-]+\\/\\d+\\/onsite\\/medallia-digital-embed\\.js$/;\n var genericPathRegex = /\\/[a-zA-Z\\d-]+\\/\\d+\\/onsite\\/generic\\d{13}\\.js$/;\n window.KAMPYLE_EMBED = {\n kampyleInit: function() {\n var t = document.createElement(\'script\');\n t.type = \'text/javascript\';\n t.async = true;\n t.src = KAMPYLE_EMBED.getGenericLocation();\n t.charset = \'UTF-8\';\n document.body.appendChild(t);\n },\n kampyleLoadLogger: function() {},\n kampyleEventHandler: function(elem, eventType, handler) {\n if (elem.addEventListener) {\n elem.addEventListener(eventType, handler, false);\n } else if (elem.attachEvent) {\n elem.attachEvent(\'on\' + eventType, handler);\n }\n },\n isSupported: function() {\n var result = {\n isIE: false,\n trueVersion: 0,\n actingVersion: 0,\n compatibilityMode: false\n };\n var trident = window.KAMPYLE_EMBED.getUserAgent().match(/Trident\\/(\\d+)/);\n if (trident) {\n result.isIE = true;\n result.trueVersion = parseInt(trident[1], 10) + 4;\n }\n var msie = navigator.userAgent.match(/MSIE (\\d+)/);\n if (msie) {\n result.isIE = true;\n result.actingVersion = parseInt(msie[1]);\n } else {\n result.actingVersion = result.trueVersion;\n }\n if (result.isIE && result.trueVersion > 0 && result.actingVersion > 0) {\n result.compatibilityMode = result.trueVersion != result.actingVersion;\n }\n return !result.isIE || result.trueVersion > 9 || (result.actingVersion >= 9 && result.compatibilityMode);\n },\n getUserAgent: function() {\n return navigator.userAgent;\n },\n getGenericLocation: function() {\n var genericLocation = location.protocol + \'//\' + \'resources.digital-cloud-prem.medallia.eu/wdceuprem/10189/onsite/generic1582912036013.js\';\n var genericPath = (genericLocation.match(genericPathRegex) || [])[0];\n genericLocation = window.KAMPYLE_EMBED.getResourcesPrefix() + genericPath;\n return genericLocation;\n },\n isOnPremScript: function(scriptPath) {\n return onPremEmbedRegex.test(scriptPath);\n },\n isOnPrem: function() {\n if (window.MDIGITAL_ON_PREM_PREFIX) {\n return true;\n }\n var scripts = (document.getElementsByTagName(\'script\') || []);\n if (!(scripts && scripts.length)) {\n return false;\n }\n for (var i = scripts.length - 1; i >= 0; i--) {\n if (window.KAMPYLE_EMBED.isOnPremScript(scripts[i].src)) {\n return true;\n }\n }\n return false;\n },\n getResourcesPrefix: function() {\n if (window.MDIGITAL_ON_PREM_PREFIX) {\n return window.MDIGITAL_ON_PREM_PREFIX;\n }\n var scripts = document.getElementsByTagName(\'script\');\n var neededSrcPath = null;\n var i = 0;\n while (scripts && !neededSrcPath && i < scripts.length) {\n if (scripts[i].src && onPremEmbedRegex.test(scripts[i].src)) {\n neededSrcPath = scripts[i].src;\n }\n i++;\n }\n if (neededSrcPath) {\n window.MDIGITAL_ON_PREM_PREFIX = neededSrcPath.replace(onPremEmbedRegex, \'\');\n return window.MDIGITAL_ON_PREM_PREFIX;\n }\n if (window.location && window.location.origin) {\n return window.location.origin;\n }\n return \'\';\n }\n };\n if (window.KAMPYLE_EMBED.isSupported()) {\n if (document.readyState === \'complete\') {\n window.KAMPYLE_EMBED.kampyleInit();\n } else {\n window.KAMPYLE_EMBED.kampyleEventHandler(window, \'load\', window.KAMPYLE_EMBED.kampyleInit);\n }\n }\n }\n})();', + language: 'javascript' + } + }] + }, + { + id: 'RL7fe802e8ec164b49a1ef76afa213f75f', + name: 'event:button click', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 100, + elementSelector: 'button', + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('Check Interval'), t = _satellite.getVar('Delay Time'), r = [ + 'hero|track', + 'hero|cube|rate & ship', + 'hero|cube|rate', + 'hero|cube|track', + 'hero|cube|locate', + 'hero|cube|ship' + ], i = setInterval(function () { + var n = FDX.DATALAYER.page.button.data; + void 0 !== n && n && (clearInterval(i), a && clearTimeout(a), setTimeout(function () { + var e = 'undefined' !== FDX.DATALAYER.page.button && '' !== FDX.DATALAYER.page.button.data ? FDX.DATALAYER.page.button.data : '', t = 'undefined' !== FDX.DATALAYER.page.button && '' !== FDX.DATALAYER.page.button.type ? FDX.DATALAYER.page.button.type : ''; + return null != e && '' != e && ('' !== t && 'newPage' == t ? (fdx_setLinkView(e), !1) : void 0 !== t && 'samePage' == t ? (-1 < r.indexOf(n.toLowerCase()) ? fdx_setLinkView(e) : fdx_logLinkView(e), !1) : void 0); + }, t)); + }, e), a = setTimeout(function () { + clearInterval(i); + }, 3000); + } + } + }], + actions: [] + }, + { + id: 'RLd9ee42858400466dba005d3c71fc8e44', + name: 'gtag:VideoPlay', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 1, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [{ + value: '/(ko-kr|zh-tw|en-sg)/about/possibilities.html', + valueIsRegex: !0 + }] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:VideoPlayIdList'), t = this.parentElement.getAttribute('data-video-id'), n = _satellite.getVar('content:countryCode'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var r = _fdx.pageFlag(e, n, 'country'), i = _fdx.pageFlag(r, t); + return _satellite.setVar('videoGtagLabel', i), !1 !== i; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC570a690757b1444e94b0cc30f9c21bd2-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL9d5db3a6be0f4e7bb633d37ef7b7f363', + name: 'AdobeTarget:beaconV2', + events: [{ + modulePath: 'core/src/lib/events/libraryLoaded.js', + settings: {}, + ruleOrder: 1 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = FDX.DATALAYER.page.category, t = _satellite.getVar('targetenabledUrlList'), n = /.[a-z]{2}-[a-z]{2}(.*)/.exec(window.location.pathname); + return null !== n && (n = n[1]), 'false' == e.isApplication && 'sharednav' !== FDX.DATALAYER.page.category.pageType || 'true' == e.isApplication && null !== n && void 0 !== t && '' !== t && 0 < t.length && -1 < t.toString().toLowerCase().indexOf(n.toLowerCase()); + } + } + }], + actions: [ + { + modulePath: 'adobe-target-v2/lib/loadTarget.js', + settings: {} + }, + { + modulePath: 'adobe-target-v2/lib/addPageLoadParams.js', + settings: { + params: { + at_property: { + value: '%Target:at_property%', + checked: !1 + }, + loggedinStatus: { + value: '%login:status%', + checked: !1 + } + } + } + }, + { + modulePath: 'adobe-target-v2/lib/firePageLoad.js', + settings: { + bodyHiddenStyle: 'body {opacity: 0}', + bodyHidingEnabled: !0 + } + } + ] + }, + { + id: 'RLb9692b2f1eb14382bb82267f9550f72e', + name: 'adTag:verizon', + events: [{ + modulePath: 'core/src/lib/events/libraryLoaded.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('verizon:pageList'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'), _satellite.setVar('verizonURL', _fdx.pageFlag(e, t)); + var n = !1 !== _satellite.getVar('verizonURL'), r = '' !== _satellite.getVar('verizon:timeFrame') && !1 !== _satellite.getVar('verizon:timeFrame'); + return n && r; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '', + language: 'html' + } + }] + }, + { + id: 'RLf75b1a3cd39746d48665e4c29e2d5c34', + name: 'redirect:appSegIdTarget', + events: [{ + modulePath: 'core/src/lib/events/domReady.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + global: !0, + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RCd5794ebadea64668a54c82a944998eb2-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL91013c284d26417dbd7b4353b8ca0ca3', + name: 'adTag:dotTag ', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('dotTag:enabledPageList'), t = window.location.pathname; + return 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'), !1 !== _fdx.pageFlag(e, t); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'var dotTagPixelId = _satellite.getVar("dotTagPixelId");\n(function(w,d,t,r,u){w[u]=w[u]||[];w[u].push({\'projectId\':\'10000\',\'properties\':{\'pixelId\':dotTagPixelId}});var s=d.createElement(t);s.src=r;s.async=true;s.onload=s.onreadystatechange=function(){var y,rs=this.readyState,c=w[u];if(rs&&rs!="complete"&&rs!="loaded"){return}try{y=YAHOO.ywa.I13N.fireBeacon;w[u]=[];w[u].push=function(p){y([p])};y(c)}catch(e){}};var scr=d.getElementsByTagName(t)[0],par=scr.parentNode;par.insertBefore(s,scr)})(window,document,"script","https://s.yimg.com/wi/ytc.js","dotq");\n\n\n\n', + language: 'javascript' + } + }] + }, + { + id: 'RLacc2a850b7db4cea8ff8070599b18023', + name: 'video:50% Viewed', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 50, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + if ('undefined' != typeof this.parentElement) { + for (var n = this.parentElement.getAttribute('id'), r = this.parentElement.getAttribute('data-video-id'), i = document.getElementsByClassName('brightcove-container'), a = 0; a < i.length; a++) + if (n == i[a].getAttribute('data-playerid')) { + var o = document.getElementsByClassName('vjs-dock-title'); + t.eVar42 = o[a].innerText, t.eVar31 = r, t.linkTrackVars = t.apl(t.linkTrackVars, 'eVar42,eVar31', ',', 2); + } + t.linkTrackEvents = t.events = 'event205'; + } + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Video:50% Viewed', + linkType: 'o' + } + } + ] + }, + { + id: 'RLbfa2f40d0f1f47cdbed784036cd9cfca', + name: 'HPTrackBtn:ValidData', + events: [{ + modulePath: 'core/src/lib/events/elementExists.js', + settings: { elementSelector: 'div .redesignSnapshotTVC' }, + ruleOrder: 50 + }], + conditions: [], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC78909d54823849febd5ad6cde94a7f60-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL252373723837406391ec6b9a05246f55', + name: 'gTag:VideoEventClick', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: '.vjs-big-play-button', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/path.js', + settings: { + paths: [{ + value: '/(ko-kr|zh-tw|en-sg)/about/possibilities.html', + valueIsRegex: !0 + }] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:VideoPlayBtnIdList'), t = this.parentElement.getAttribute('data-video-id'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('videoGtagLabel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC0b336201e5ce4363be99623f215c17e5-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL3efaaf1f2ac84216b624af7d57d7372f', + name: 'formsOnChange', + events: [{ + modulePath: 'core/src/lib/events/change.js', + settings: { + elementSelector: '.js-form-category', + elementProperties: [{ + name: 'data-index', + value: '1' + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = window.location.pathname, t = this.children; + for (var n in t) + if (t[n].selected) + if (-1 < e.indexOf('contact')) { + var r = 'Contact form:' + t[n].value; + _satellite.setVar('form:linkName', r); + } else + r = 'CS Agent Form:' + t[n].value, _satellite.setVar('form:linkName', r); + return '/en-gb/customer-support/contact.html' == e || '/en-gb/customer-support.html' == e; + } + } + }], + actions: [{ + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: '%form:linkName%', + linkType: 'o' + } + }] + }, + { + id: 'RLe80dec80bb1b4566bd48178c86b62a38', + name: 'gTag:btnOrangeDC', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button', + elementProperties: [{ + name: 'id', + value: '(signUpContinueButton)|(submitPinButton)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [{ + value: '\\/fdmenrollment\\/\\?signup\\=true', + valueIsRegex: !0 + }] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:btnOrangeDCPageListMapping'), t = this.id; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('dcOrangeBtnLabel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC45e1988f8baf49d4a7f179a802e04a12-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL908e74ea496248b884eac05444b83674', + name: 'gTag:btnOrangeAW', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button', + elementProperties: [{ + name: 'id', + value: '(signUpContinueButton)|(submitPinButton)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [ + { + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '\\/fdmenrollment\\/\\?signup\\=true', + valueIsRegex: !0 + }, + { + value: '\\/shipping/industry-solutions/healthcare/contact-us', + valueIsRegex: !0 + } + ] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:btnOrangeAWPageListMapping'), t = this.id; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('awOrangeBtnLabel', n), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC4b573b4d28814faaa3bb4aee4d6b8bab-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL84c4e13d916141b9a6b48f8ce6d94d03', + name: 'gTag:ctaOrangeFB', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(hero\\|Apply Now)|(hero\\|Get Started)|(link\\|Start Order)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 60 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('gTag:ctaOrangeFBPageListMapping'), t = window.location.pathname; + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + if ('object' != typeof n) + return _satellite.setVar('fbOrangeEvent', n), !1 !== n; + var r = document.getElementsByClassName(this.className), i = this; + return _satellite.setVar('fbOrangeEvent', _fdx.getGtagLabel(n, r, i)), !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC18a16cd13b204e77993a0b991042c37c-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RL5d71a750a09e4c51abfbc2839bd8d478', + name: 'qualtrics', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('qualtrics:pageListMapping'), t = window.location.pathname, n = _satellite.getVar('qualtrics:pageName'), r = _satellite.getVar('content:pagePath'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var i = _fdx.pageFlag(e, t); + return i || _fdx.pageFlag(n, r); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '', + language: 'html' + } + }] + }, + { + id: 'RLde9950152089496fa33e71879b989a8f', + name: 'gTag:DFAEvent', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var e = _fdx.pcfUtil().match(/www(sbox.idev|base.idev|dev.idev|drt.idev|stress.dmz.idev|bit.idev|test|).fedex.com/gi), t = '' == _satellite.getVar('gTagDisableLocale'), n = window.location.pathname, r = _satellite.getVar('content:countryCode'), i = _satellite.getVar('gTag:DFAEventMapping'), a = _fdx.pageFlag(i, r, 'country'), o = _fdx.pageFlag(a, n); + return _satellite.setVar('dcLabel', o), !(!1 === o || null === e || !t); + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n', + language: 'html' + } + }] + }, + { + id: 'RLe7cb9b41a581433db53a9aea8abb2813', + name: 'video:25% Viewed', + events: [{ + modulePath: 'core/src/lib/events/mediaTimePlayed.js', + settings: { + unit: 'percent', + amount: 25, + elementSelector: '.brightcove-container video', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + if ('undefined' != typeof this.parentElement) { + for (var n = this.parentElement.getAttribute('id'), r = this.parentElement.getAttribute('data-video-id'), i = document.getElementsByClassName('brightcove-container'), a = 0; a < i.length; a++) + if (n == i[a].getAttribute('data-playerid')) { + var o = document.getElementsByClassName('vjs-dock-title'); + t.eVar42 = o[a].innerText, t.eVar31 = r, t.linkTrackVars = t.apl(t.linkTrackVars, 'eVar42,eVar31', ',', 2); + } + t.linkTrackEvents = t.events = 'event204'; + } + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Video:25% View', + linkType: 'o' + } + } + ] + }, + { + id: 'RLb328ce8816ba48d9b6d84cab634f4ace', + name: 'searchResultTrack', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: '.cq-snp-resultset-header', + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !1 + }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + t.linkTrackVars = 'prop31,eVar43,prop51,eVar51,eVar53,prop29,prop18,prop19,prop20,events', t.linkTrackEvents = 'None', t.linkTrackEvents = t.events = 'event122'; + var n = this.firstElementChild.href, r = _satellite.getVar('search:term'); + n = r + '|' + n, t.eVar43 = 'L:IntSrch:' + r, t.eVar51 = t.prop51 = n, t.eVar53 = '+1', t.prop18 = t.pageName, t.prop19 = n, t.prop20 = t.pageName + ':' + n, t.prop31 = '' !== t.visitor.getAnalyticsVisitorID() ? '[CS]v1|' + t.visitor.getAnalyticsVisitorID() + '[CE]' : t.visitor.getMarketingCloudVisitorID(), nltrk = 'y'; + } + }, + trackerProperties: {} + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Search Result', + linkType: 'o' + } + } + ] + }, + { + id: 'RL60260aff0e6c4aa1b528a8ef734843f6', + name: 'verizon:ctaOrangeButton', + events: [ + { + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button.fxg-button--submit', + elementProperties: [{ + name: 'data-analytics', + value: '(Form\\|Freight Quote with Account)|(Form\\|EN-Freight Quote-No-Account)|(Form\\|FR-Freight Quote-No-Account)|(Form\\|FR-Freight Quote)|(Form\\|Beyond the Buy Button)|(Form\\|Beyond the Buy Button-FR)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }, + { + modulePath: 'core/src/lib/events/click.js', + settings: { + anchorDelay: 6000, + elementSelector: 'a.fxg-button.fxg-button--orange', + elementProperties: [{ + name: 'data-analytics', + value: '(link\\|Start your quote)|(link\\|Commencez votre estimation)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + } + ], + conditions: [ + { + modulePath: 'core/src/lib/conditions/path.js', + settings: { + paths: [ + { + value: '\\/((en|fr)-ca)\\/shipping-tools\\/(freight-quote.html|freight-quote-no-account.html)', + valueIsRegex: !0 + }, + { + value: '\\/((en|fr)-ca)\\/small-business\\/ecommerce-solutions.html', + valueIsRegex: !0 + }, + { + value: '(link\\|Start your quote)|(link\\|Commencez votre estimation)', + valueIsRegex: !0 + } + ] + } + }, + { + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('verizonBtnClickMapping'), t = this.getAttribute('data-analytics'); + 'undefined' == typeof _fdx && _satellite.getVar('_fdxUtil'); + var n = _fdx.pageFlag(e, t); + return _satellite.setVar('pixelId', n[0]), _satellite.setVar('EC', n[1]), !1 !== n; + } + } + } + ], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: 'https://assets.adobedtm.com/686b8f0c4520/4ce401c51b51/19084735b179/RC9ab1fe64100c46df887ccc607644d421-source.min.js', + language: 'javascript', + isExternal: !0 + } + }] + }, + { + id: 'RLe124aef4754e4d72a45a9779381e665c', + name: 'event:formSubmitButton', + events: [{ + modulePath: 'core/src/lib/events/click.js', + settings: { + elementSelector: 'button.fxg-button.fxg-button--orange ', + elementProperties: [{ + name: 'data-analytics', + value: '(Form\\|EN-Freight Quote-No-Account)|(Form\\|Submit Button-Logistics Contact Us)|(Form\\|Soumettre-Logistics Contact Us-FR)', + valueIsRegex: !0 + }], + bubbleFireIfParent: !0, + bubbleFireIfChildFired: !0 + }, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + var e = this.getAttribute('data-analytics'), t = { + 'Form|EN-Freight Quote-No-Account': 'event193', + 'Form|Submit Button-Logistics Contact Us': 'event194', + 'Form|Soumettre-Logistics Contact Us-FR': 'event194' + }, n = ''; + return n = _fdx.pageFlag(t, e), _satellite.setVar('formEvent', n), 'undefined' !== n && '' !== n; + } + } + }], + actions: [{ + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + var n = _satellite.getVar('formEvent'); + t.linkTrackEvents = t.events = n; + } + }, + trackerProperties: {} + } + }] + }, + { + id: 'RL9bfeb3df10c74a4f9e67ec00a6141898', + name: 'rectag:ContentSquare', + events: [{ + modulePath: 'core/src/lib/events/domReady.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/pathAndQuerystring.js', + settings: { + paths: [ + { + value: '\\/(en-us)\\/(printing|office)\\/(personal-projects|online-printing|banners|business-cards|consumer-offers|design-services|flash-sale-offers|greeting-cards|marketing-materials|menus|national-bid-center|online-custom-frames|passport-photo|photobooks|posters|poster-sign-banner-printing|print-preferred|signs|small-medium-business-offers|services|printandgo|customersupport).html', + valueIsRegex: !0 + }, + { + value: '\\/(en-us)\\/(shipping|printing)\\/(marketing-materials|packing-supplies|posters)\\/(brochures|flyers|postcards|custom-branded-boxes|prints).html', + valueIsRegex: !0 + }, + { + value: '\\/(en-us)\\/(office|printing|coupon-offers|).html', + valueIsRegex: !0 + } + ] + } + }], + actions: [{ + modulePath: 'contentsquare/src/lib/actions/uxaInstallation.js', + settings: { + setPathInput: '', + setQueryInput: '', + setPathCheckbox: !1, + setQueryCheckbox: !1 + } + }] + } + ] + }; + var $___var_11c4b70ad7ce8cfb = function () { + 'use strict'; + function e(n) { + if (n.__esModule) + return n; + var r = Object.defineProperty({}, '__esModule', { value: !0 }); + return Object.keys(n).forEach(function (e) { + var t = Object.getOwnPropertyDescriptor(n, e); + Object.defineProperty(r, e, t.get ? t : { + enumerable: !0, + get: function () { + return n[e]; + } + }); + }), r; + } + function t(e) { + var t = { exports: {} }; + return e(t, t.exports), t.exports; + } + function n(t) { + var n = this.constructor; + return this.then(function (e) { + return n.resolve(t()).then(function () { + return e; + }); + }, function (e) { + return n.resolve(t()).then(function () { + return n.reject(e); + }); + }); + } + function u(e) { + return Boolean(e && 'undefined' != typeof e.length); + } + function r() { + } + function i(e, t) { + return function () { + e.apply(t, arguments); + }; + } + function a(e) { + if (!(this instanceof a)) + throw new TypeError('Promises must be constructed via new'); + if ('function' != typeof e) + throw new TypeError('not a function'); + this._state = 0, this._handled = !1, this._value = undefined, this._deferreds = [], f(e, this); + } + function o(r, i) { + for (; 3 === r._state;) + r = r._value; + 0 !== r._state ? (r._handled = !0, a._immediateFn(function () { + var e = 1 === r._state ? i.onFulfilled : i.onRejected; + if (null !== e) { + var t; + try { + t = e(r._value); + } catch (n) { + return void c(i.promise, n); + } + s(i.promise, t); + } else + (1 === r._state ? s : c)(i.promise, r._value); + })) : r._deferreds.push(i); + } + function s(e, t) { + try { + if (t === e) + throw new TypeError('A promise cannot be resolved with itself.'); + if (t && ('object' == typeof t || 'function' == typeof t)) { + var n = t.then; + if (t instanceof a) + return e._state = 3, e._value = t, void l(e); + if ('function' == typeof n) + return void f(i(n, t), e); + } + e._state = 1, e._value = t, l(e); + } catch (r) { + c(e, r); + } + } + function c(e, t) { + e._state = 2, e._value = t, l(e); + } + function l(e) { + 2 === e._state && 0 === e._deferreds.length && a._immediateFn(function () { + e._handled || a._unhandledRejectionFn(e._value); + }); + for (var t = 0, n = e._deferreds.length; t < n; t++) + o(e, e._deferreds[t]); + e._deferreds = null; + } + function d(e, t, n) { + this.onFulfilled = 'function' == typeof e ? e : null, this.onRejected = 'function' == typeof t ? t : null, this.promise = n; + } + function f(e, t) { + var n = !1; + try { + e(function (e) { + n || (n = !0, s(t, e)); + }, function (e) { + n || (n = !0, c(t, e)); + }); + } catch (r) { + if (n) + return; + n = !0, c(t, r); + } + } + function p(e) { + if (null === e || e === undefined) + throw new TypeError('Object.assign cannot be called with null or undefined'); + return Object(e); + } + function g() { + try { + if (!Object.assign) + return !1; + var e = new String('abc'); + if (e[5] = 'de', '5' === Object.getOwnPropertyNames(e)[0]) + return !1; + for (var t = {}, n = 0; n < 10; n++) + t['_' + String.fromCharCode(n)] = n; + if ('0123456789' !== Object.getOwnPropertyNames(t).map(function (e) { + return t[e]; + }).join('')) + return !1; + var r = {}; + return 'abcdefghijklmnopqrst'.split('').forEach(function (e) { + r[e] = e; + }), 'abcdefghijklmnopqrst' === Object.keys(Object.assign({}, r)).join(''); + } catch (i) { + return !1; + } + } + function m(e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + } + if (window.atob) { + var h = function (e) { + var n = []; + return e.forEach(function (t) { + t.events && t.events.forEach(function (e) { + n.push({ + rule: t, + event: e + }); + }); + }), n.sort(function (e, t) { + return e.event.ruleOrder - t.event.ruleOrder; + }); + }, v = 'debug', b = function (t, e) { + var n = function () { + return 'true' === t.getItem(v); + }, r = function (e) { + t.setItem(v, e); + }, i = [], a = function (e) { + i.push(e); + }; + return e.outputEnabled = n(), { + onDebugChanged: a, + getDebugEnabled: n, + setDebugEnabled: function (t) { + n() !== t && (r(t), e.outputEnabled = t, i.forEach(function (e) { + e(t); + })); + } + }; + }, y = 'Module did not export a function.', _ = function (a, o) { + return function (e, t, n) { + n = n || []; + var r = a.getModuleExports(e.modulePath); + if ('function' != typeof r) + throw new Error(y); + var i = o(e.settings || {}, t); + return r.bind(null, i).apply(null, n); + }; + }, C = function (e) { + return 'string' == typeof e ? e.replace(/\s+/g, ' ').trim() : e; + }, x = { + LOG: 'log', + INFO: 'info', + DEBUG: 'debug', + WARN: 'warn', + ERROR: 'error' + }, k = '\uD83D\uDE80', E = 10 === parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]) ? '[Launch]' : k, I = !1, w = function (e) { + if (I && window.console) { + var t = Array.prototype.slice.call(arguments, 1); + t.unshift(E), e !== x.DEBUG || window.console[e] || (e = x.INFO), window.console[e].apply(window.console, t); + } + }, D = w.bind(null, x.LOG), A = w.bind(null, x.INFO), S = w.bind(null, x.DEBUG), T = w.bind(null, x.WARN), P = w.bind(null, x.ERROR), O = { + log: D, + info: A, + debug: S, + warn: T, + error: P, + deprecation: function () { + var e = I; + I = !0, w.apply(null, Array.prototype.concat(x.WARN, Array.prototype.slice.call(arguments))), e || (I = !1); + }, + get outputEnabled() { + return I; + }, + set outputEnabled(e) { + I = e; + }, + createPrefixedLogger: function (e) { + var t = '[' + e + ']'; + return { + log: D.bind(null, t), + info: A.bind(null, t), + debug: S.bind(null, t), + warn: T.bind(null, t), + error: P.bind(null, t) + }; + } + }, j = 'undefined' != typeof globalThis ? globalThis : 'undefined' != typeof window ? window : 'undefined' != typeof global ? global : 'undefined' != typeof self ? self : {}, L = t(function (r) { + !function (e) { + if (r.exports = e(), !!0) { + var t = window.Cookies, n = window.Cookies = e(); + n.noConflict = function () { + return window.Cookies = t, n; + }; + } + }(function () { + function c() { + for (var e = 0, t = {}; e < arguments.length; e++) { + var n = arguments[e]; + for (var r in n) + t[r] = n[r]; + } + return t; + } + function l(e) { + return e.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); + } + function e(u) { + function s() { + } + function n(e, t, n) { + if ('undefined' != typeof document) { + 'number' == typeof (n = c({ path: '/' }, s.defaults, n)).expires && (n.expires = new Date(1 * new Date() + 86400000 * n.expires)), n.expires = n.expires ? n.expires.toUTCString() : ''; + try { + var r = JSON.stringify(t); + /^[\{\[]/.test(r) && (t = r); + } catch (o) { + } + t = u.write ? u.write(t, e) : encodeURIComponent(String(t)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent), e = encodeURIComponent(String(e)).replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent).replace(/[\(\)]/g, escape); + var i = ''; + for (var a in n) + n[a] && (i += '; ' + a, !0 !== n[a] && (i += '=' + n[a].split(';')[0])); + return document.cookie = e + '=' + t + i; + } + } + function t(e, t) { + if ('undefined' != typeof document) { + for (var n = {}, r = document.cookie ? document.cookie.split('; ') : [], i = 0; i < r.length; i++) { + var a = r[i].split('='), o = a.slice(1).join('='); + t || '"' !== o.charAt(0) || (o = o.slice(1, -1)); + try { + var s = l(a[0]); + if (o = (u.read || u)(o, s) || l(o), t) + try { + o = JSON.parse(o); + } catch (c) { + } + if (n[s] = o, e === s) + break; + } catch (c) { + } + } + return e ? n[e] : n; + } + } + return s.set = n, s.get = function (e) { + return t(e, !1); + }, s.getJSON = function (e) { + return t(e, !0); + }, s.remove = function (e, t) { + n(e, '', c(t, { expires: -1 })); + }, s.defaults = {}, s.withConverter = e, s; + } + return e(function () { + }); + }); + }), M = { + get: L.get, + set: L.set, + remove: L.remove + }, V = window, R = 'com.adobe.reactor.', F = function (r, e) { + var i = R + (e || ''); + return { + getItem: function (e) { + const $___old_1bcf7164aee1e4ab = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_1bcf7164aee1e4ab) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_c7caec501dca2387.localStorage)); + return function () { + try { + return V[r].getItem(i + e); + } catch (t) { + return null; + } + }.apply(this, arguments); + } finally { + if ($___old_1bcf7164aee1e4ab) + ({}.constructor.defineProperty(window, 'localStorage', $___old_1bcf7164aee1e4ab)); + } + }, + setItem: function (e, t) { + const $___old_a2d0f3579eb0571c = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_a2d0f3579eb0571c) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_c7caec501dca2387.localStorage)); + return function () { + try { + return V[r].setItem(i + e, t), !0; + } catch (n) { + return !1; + } + }.apply(this, arguments); + } finally { + if ($___old_a2d0f3579eb0571c) + ({}.constructor.defineProperty(window, 'localStorage', $___old_a2d0f3579eb0571c)); + } + } + }; + }, N = '_sdsat_', B = 'dataElements.', U = 'dataElementCookiesMigrated', q = F('localStorage'), z = F('sessionStorage', B), H = F('localStorage', B), W = { + PAGEVIEW: 'pageview', + SESSION: 'session', + VISITOR: 'visitor' + }, G = {}, Y = function (e) { + var t; + try { + t = JSON.stringify(e); + } catch (n) { + } + return t; + }, X = function (e, t, n) { + var r; + switch (t) { + case W.PAGEVIEW: + return void (G[e] = n); + case W.SESSION: + return void ((r = Y(n)) && z.setItem(e, r)); + case W.VISITOR: + return void ((r = Y(n)) && H.setItem(e, r)); + } + }, K = function (e, t) { + var n = M.get(N + e); + n !== undefined && X(e, t, n); + }, Q = { + setValue: X, + getValue: function (e, t) { + var n; + switch (t) { + case W.PAGEVIEW: + return G.hasOwnProperty(e) ? G[e] : null; + case W.SESSION: + return null === (n = z.getItem(e)) ? n : JSON.parse(n); + case W.VISITOR: + return null === (n = H.getItem(e)) ? n : JSON.parse(n); + } + }, + migrateCookieData: function (t) { + q.getItem(U) || (Object.keys(t).forEach(function (e) { + K(e, t[e].storageDuration); + }), q.setItem(U, !0)); + } + }, $ = function (e, t, n, r) { + return 'Failed to execute data element module ' + e.modulePath + ' for data element ' + t + '. ' + n + (r ? '\n' + r : ''); + }, J = function (s, c, u, l) { + return function (e, t) { + var n = c(e); + if (!n) + return l ? '' : undefined; + var r, i = n.storageDuration; + try { + r = s.getModuleExports(n.modulePath); + } catch (o) { + return void O.error($(n, e, o.message, o.stack)); + } + if ('function' == typeof r) { + var a; + try { + a = r(u(n.settings, t), t); + } catch (o) { + return void O.error($(n, e, o.message, o.stack)); + } + return i && (null != a ? Q.setValue(e, i, a) : a = Q.getValue(e, i)), null == a && null != n.defaultValue && (a = n.defaultValue), 'string' == typeof a && (n.cleanText && (a = C(a)), n.forceLowerCase && (a = a.toLowerCase())), a; + } + O.error($(n, e, 'Module did not export a function.')); + }; + }, Z = { + text: function (e) { + return e.textContent; + }, + cleanText: function (e) { + return C(e.textContent); + } + }, ee = function (e, t, n) { + for (var r, i = e, a = 0, o = t.length; a < o; a++) { + if (null == i) + return undefined; + var s = t[a]; + if (n && '@' === s.charAt(0)) { + var c = s.slice(1); + i = Z[c](i); + } else if (i.getAttribute && (r = s.match(/^getAttribute\((.+)\)$/))) { + var u = r[1]; + i = i.getAttribute(u); + } else + i = i[s]; + } + return i; + }, te = function (a, o, s) { + return function (e, t) { + var n; + if (o(e)) + n = s(e, t); + else { + var r = e.split('.'), i = r.shift(); + 'this' === i ? t && (n = ee(t.element, r, !0)) : 'event' === i ? t && (n = ee(t, r)) : 'target' === i ? t && (n = ee(t.target, r)) : n = ee(a[i], r); + } + return n; + }; + }, ne = function (n, r) { + return function (e) { + var t = e.split('.')[0]; + return Boolean(r(e) || 'this' === t || 'event' === t || 'target' === t || n.hasOwnProperty(t)); + }; + }, re = function (e, t, n) { + var r = { exports: {} }; + return e.call(r.exports, r, r.exports, t, n), r.exports; + }, ie = function () { + var o = {}, n = function (e) { + var t = o[e]; + if (!t) + throw new Error('Module ' + e + ' not found.'); + return t; + }, e = function () { + Object.keys(o).forEach(function (e) { + try { + r(e); + } catch (n) { + var t = 'Error initializing module ' + e + '. ' + n.message + (n.stack ? '\n' + n.stack : ''); + O.error(t); + } + }); + }, r = function (e) { + var t = n(e); + return t.hasOwnProperty('exports') || (t.exports = re(t.definition.script, t.require, t.turbine)), t.exports; + }; + return { + registerModule: function (e, t, n, r, i) { + var a = { + definition: t, + extensionName: n, + require: r, + turbine: i + }; + a.require = r, o[e] = a; + }, + hydrateCache: e, + getModuleExports: r, + getModuleDefinition: function (e) { + return n(e).definition; + }, + getModuleExtensionName: function (e) { + return n(e).extensionName; + } + }; + }, ae = !1, oe = function (r) { + return function (t, n) { + var e = r._monitors; + e && (ae || (O.warn('The _satellite._monitors API may change at any time and should only be used for debugging.'), ae = !0), e.forEach(function (e) { + e[t] && e[t](n); + })); + }; + }, se = function (i, a, o) { + var n, r, s, c, u = [], l = function (e, t, n) { + if (!i(t)) + return e; + u.push(t); + var r = a(t, n); + return u.pop(), null == r && o ? '' : r; + }; + return n = function (e, n) { + var t = /^%([^%]+)%$/.exec(e); + return t ? l(e, t[1], n) : e.replace(/%(.+?)%/g, function (e, t) { + return l(e, t, n); + }); + }, r = function (e, t) { + for (var n = {}, r = Object.keys(e), i = 0; i < r.length; i++) { + var a = r[i], o = e[a]; + n[a] = c(o, t); + } + return n; + }, s = function (e, t) { + for (var n = [], r = 0, i = e.length; r < i; r++) + n.push(c(e[r], t)); + return n; + }, c = function (e, t) { + return 'string' == typeof e ? n(e, t) : Array.isArray(e) ? s(e, t) : 'object' == typeof e && null !== e ? r(e, t) : e; + }, function (e, t) { + return 10 < u.length ? (O.error('Data element circular reference detected: ' + u.join(' -> ')), e) : c(e, t); + }; + }, ce = function (i) { + return function (e, t) { + if ('string' == typeof e) + i[arguments[0]] = t; + else if (arguments[0]) { + var n = arguments[0]; + for (var r in n) + i[r] = n[r]; + } + }; + }, ue = setTimeout; + a.prototype['catch'] = function (e) { + return this.then(null, e); + }, a.prototype.then = function (e, t) { + var n = new this.constructor(r); + return o(this, new d(e, t, n)), n; + }, a.prototype['finally'] = n, a.all = function (t) { + return new a(function (i, a) { + function o(t, e) { + try { + if (e && ('object' == typeof e || 'function' == typeof e)) { + var n = e.then; + if ('function' == typeof n) + return void n.call(e, function (e) { + o(t, e); + }, a); + } + s[t] = e, 0 == --c && i(s); + } catch (r) { + a(r); + } + } + if (!u(t)) + return a(new TypeError('Promise.all accepts an array')); + var s = Array.prototype.slice.call(t); + if (0 === s.length) + return i([]); + for (var c = s.length, e = 0; e < s.length; e++) + o(e, s[e]); + }); + }, a.resolve = function (t) { + return t && 'object' == typeof t && t.constructor === a ? t : new a(function (e) { + e(t); + }); + }, a.reject = function (n) { + return new a(function (e, t) { + t(n); + }); + }, a.race = function (i) { + return new a(function (e, t) { + if (!u(i)) + return t(new TypeError('Promise.race accepts an array')); + for (var n = 0, r = i.length; n < r; n++) + a.resolve(i[n]).then(e, t); + }); + }, a._immediateFn = 'function' == typeof setImmediate && function (e) { + setImmediate(e); + } || function (e) { + ue(e, 0); + }, a._unhandledRejectionFn = function Dt(e) { + 'undefined' != typeof console && console && console.warn('Possible Unhandled Promise Rejection:', e); + }; + var le = e(Object.freeze({ + __proto__: null, + 'default': a + })), de = 'undefined' != typeof window && window.Promise || void 0 !== j && j.Promise || le['default'] || le, fe = function (u, n, r) { + return function (s, t, c, e) { + return e.then(function () { + var a, o = s.delayNext; + return new de(function (e, t) { + var n = u(s, c, [c]); + if (!o) + return e(); + var r = s.timeout, i = new de(function (e, t) { + a = setTimeout(function () { + t(new Error('A timeout occurred because the action took longer than ' + r / 1000 + ' seconds to complete. ')); + }, r); + }); + de.race([ + n, + i + ]).then(e, t); + })['catch'](function (e) { + return clearTimeout(a), e = n(e), r(s, t, e), de.reject(e); + }).then(function () { + clearTimeout(a); + }); + }); + }; + }, pe = function (c, n, r, i, u) { + return function (o, t, s, e) { + return e.then(function () { + var a; + return new de(function (e, t) { + var n = c(o, s, [s]), r = o.timeout, i = new de(function (e, t) { + a = setTimeout(function () { + t(new Error('A timeout occurred because the condition took longer than ' + r / 1000 + ' seconds to complete. ')); + }, r); + }); + de.race([ + n, + i + ]).then(e, t); + })['catch'](function (e) { + return clearTimeout(a), e = n(e), i(o, t, e), de.reject(e); + }).then(function (e) { + if (clearTimeout(a), !r(o, e)) + return u(o, t), de.reject(); + }); + }); + }; + }, ge = de.resolve(), me = function (r, i, e) { + return function (t, n) { + return t.conditions && t.conditions.forEach(function (e) { + ge = r(e, t, n, ge); + }), t.actions && t.actions.forEach(function (e) { + ge = i(e, t, n, ge); + }), ge = (ge = ge.then(function () { + e(t); + }))['catch'](function () { + }); + }; + }, he = function (e) { + return Boolean(e && 'object' == typeof e && 'function' == typeof e.then); + }, ve = function (o, s, c, u) { + return function (e, t) { + var n; + if (e.conditions) + for (var r = 0; r < e.conditions.length; r++) { + n = e.conditions[r]; + try { + var i = o(n, t, [t]); + if (he(i)) + throw new Error('Rule component sequencing must be enabled on the property for this condition to function properly.'); + if (!s(n, i)) + return c(n, e), !1; + } catch (a) { + return u(n, e, a), !1; + } + } + return !0; + }; + }, be = function (n, r) { + return function (e, t) { + n(e, t) && r(e, t); + }; + }, ye = function (n) { + return function (e) { + var t = n.getModuleDefinition(e.modulePath); + return t && t.displayName || e.modulePath; + }; + }, _e = function (i) { + return function (e) { + var t = e.rule, n = e.event, r = i.getModuleDefinition(n.modulePath).name; + return { + $type: i.getModuleExtensionName(n.modulePath) + '.' + r, + $rule: { + id: t.id, + name: t.name + } + }; + }; + }, Ce = function (s, c, u, l, d, f) { + return function (n, e) { + var r = e.rule, t = e.event; + t.settings = t.settings || {}; + try { + var i = d(e); + c(t, null, [function a(e) { + var t = u(i, e); + n(function () { + s(t, r); + }); + }]); + } catch (o) { + f.error(l(t, r, o)); + } + }; + }, xe = function (i, a, o, s) { + return function (e, t, n) { + var r = a(e); + o.error(i(r, t.name, n)), s('ruleActionFailed', { + rule: t, + action: e + }); + }; + }, ke = function (i, a, o, s) { + return function (e, t, n) { + var r = a(e); + o.error(i(r, t.name, n)), s('ruleConditionFailed', { + rule: t, + condition: e + }); + }; + }, Ee = function (r, i, a) { + return function (e, t) { + var n = r(e); + i.log('Condition "' + n + '" for rule "' + t.name + '" was not met.'), a('ruleConditionFailed', { + rule: t, + condition: e + }); + }; + }, Ie = function (t, n) { + return function (e) { + t.log('Rule "' + e.name + '" fired.'), n('ruleCompleted', { rule: e }); + }; + }, we = function (a, o, s) { + return function (e, t) { + var n; + if (e.actions) + for (var r = 0; r < e.actions.length; r++) { + n = e.actions[r]; + try { + a(n, t, [t]); + } catch (i) { + return void o(n, e, i); + } + } + s(e); + }; + }, De = function (n, r, i, a) { + return function (e, t) { + a('ruleTriggered', { rule: t }), n ? i(t, e) : r(t, e); + }; + }, Ae = function (e, t, n) { + return 'Failed to execute "' + e + '" for "' + t + '" rule. ' + n.message + (n.stack ? '\n' + n.stack : ''); + }, Se = function (e, t) { + return t && !e.negate || !t && e.negate; + }, Te = [], Pe = !1, Oe = function (e) { + Pe ? e() : Te.push(e); + }, je = function (e, t, n) { + e(t).forEach(function (e) { + n(Oe, e); + }), Pe = !0, Te.forEach(function (e) { + e(); + }), Te = []; + }, Le = function (e) { + if (e || (e = new Error('The extension triggered an error, but no error information was provided.')), !(e instanceof Error)) { + var t = 'object' == typeof e ? JSON.stringify(e) : String(e); + e = new Error(t); + } + return e; + }, Me = Object.getOwnPropertySymbols, Ve = Object.prototype.hasOwnProperty, Re = Object.prototype.propertyIsEnumerable, Fe = g() ? Object.assign : function (e) { + for (var t, n, r = p(e), i = 1; i < arguments.length; i++) { + for (var a in t = Object(arguments[i])) + Ve.call(t, a) && (r[a] = t[a]); + if (Me) { + n = Me(t); + for (var o = 0; o < n.length; o++) + Re.call(t, n[o]) && (r[n[o]] = t[n[o]]); + } + } + return r; + }, Ne = function (e, t) { + return Fe(t = t || {}, e), t.hasOwnProperty('type') || Object.defineProperty(t, 'type', { + get: function () { + return O.deprecation('Accessing event.type in Adobe Launch has been deprecated and will be removed soon. Please use event.$type instead.'), t.$type; + } + }), t; + }, Be = function (c, u) { + return function (e, t) { + var n = c[e]; + if (n) { + var r = n.modules; + if (r) + for (var i = Object.keys(r), a = 0; a < i.length; a++) { + var o = i[a], s = r[o]; + if (s.shared && s.name === t) + return u.getModuleExports(o); + } + } + }; + }, Ue = function (e, t) { + return function () { + return t ? e(t) : {}; + }; + }, qe = function (n, r) { + return function (e) { + if (r) { + var t = e.split('.'); + t.splice(t.length - 1 || 1, 0, 'min'), e = t.join('.'); + } + return n + e; + }; + }, ze = '.js', He = function (e) { + return e.substr(0, e.lastIndexOf('/')); + }, We = function (e, t) { + return -1 !== e.indexOf(t, e.length - t.length); + }, Ge = function (e, t) { + We(t, ze) || (t += ze); + var n = t.split('/'), r = He(e).split('/'); + return n.forEach(function (e) { + e && '.' !== e && ('..' === e ? r.length && r.pop() : r.push(e)); + }), r.join('/'); + }, Ye = document, Xe = function (n, r) { + return new de(function (e, t) { + r.onload = function () { + e(r); + }, r.onerror = function () { + t(new Error('Failed to load script ' + n)); + }; + }); + }, Ke = function (e) { + var t = document.createElement('script'); + t.src = e, t.async = !0; + var n = Xe(e, t); + return document.getElementsByTagName('head')[0].appendChild(t), n; + }, Qe = function (e, t, n, r) { + t = t || '&', n = n || '='; + var i = {}; + if ('string' != typeof e || 0 === e.length) + return i; + var a = /\+/g; + e = e.split(t); + var o = 1000; + r && 'number' == typeof r.maxKeys && (o = r.maxKeys); + var s = e.length; + 0 < o && o < s && (s = o); + for (var c = 0; c < s; ++c) { + var u, l, d, f, p = e[c].replace(a, '%20'), g = p.indexOf(n); + 0 <= g ? (u = p.substr(0, g), l = p.substr(g + 1)) : (u = p, l = ''), d = decodeURIComponent(u), f = decodeURIComponent(l), m(i, d) ? Array.isArray(i[d]) ? i[d].push(f) : i[d] = [ + i[d], + f + ] : i[d] = f; + } + return i; + }, $e = function (e) { + switch (typeof e) { + case 'string': + return e; + case 'boolean': + return e ? 'true' : 'false'; + case 'number': + return isFinite(e) ? e : ''; + default: + return ''; + } + }, Je = function (n, r, i, e) { + return r = r || '&', i = i || '=', null === n && (n = undefined), 'object' == typeof n ? Object.keys(n).map(function (e) { + var t = encodeURIComponent($e(e)) + i; + return Array.isArray(n[e]) ? n[e].map(function (e) { + return t + encodeURIComponent($e(e)); + }).join(r) : t + encodeURIComponent($e(n[e])); + }).join(r) : e ? encodeURIComponent($e(e)) + i + encodeURIComponent($e(n)) : ''; + }, Ze = t(function (e, t) { + t.decode = t.parse = Qe, t.encode = t.stringify = Je; + }), et = '@adobe/reactor-', tt = { + cookie: M, + document: Ye, + 'load-script': Ke, + 'object-assign': Fe, + promise: de, + 'query-string': { + parse: function (e) { + return 'string' == typeof e && (e = e.trim().replace(/^[?#&]/, '')), Ze.parse(e); + }, + stringify: function (e) { + return Ze.stringify(e); + } + }, + window: V + }, nt = function (r) { + return function (e) { + if (0 === e.indexOf(et)) { + var t = e.substr(et.length), n = tt[t]; + if (n) + return n; + } + if (0 === e.indexOf('./') || 0 === e.indexOf('../')) + return r(e); + throw new Error('Cannot resolve module "' + e + '".'); + }; + }, rt = function (e, o, s, c, u) { + var l = e.extensions, d = e.buildInfo, f = e.property.settings; + if (l) { + var p = Be(l, o); + Object.keys(l).forEach(function (r) { + var i = l[r], e = Ue(c, i.settings); + if (i.modules) { + var t = O.createPrefixedLogger(i.displayName), n = qe(i.hostedLibFilesBaseUrl, d.minified), a = { + buildInfo: d, + getDataElementValue: u, + getExtensionSettings: e, + getHostedLibFileUrl: n, + getSharedModule: p, + logger: t, + propertySettings: f, + replaceTokens: c, + onDebugChanged: s.onDebugChanged, + get debugEnabled() { + return s.getDebugEnabled(); + } + }; + Object.keys(i.modules).forEach(function (n) { + var e = i.modules[n], t = nt(function (e) { + var t = Ge(n, e); + return o.getModuleExports(t); + }); + o.registerModule(n, e, r, t, a); + }); + } + }), o.hydrateCache(); + } + return o; + }, it = function (e, t, n, r, i) { + var a = O.createPrefixedLogger('Custom Script'); + e.track = function (e) { + O.log('"' + e + '" does not match any direct call identifiers.'); + }, e.getVisitorId = function () { + return null; + }, e.property = { name: t.property.name }, e.company = t.company, e.buildInfo = t.buildInfo, e.logger = a, e.notify = function (e, t) { + switch (O.deprecation('_satellite.notify is deprecated. Please use the `_satellite.logger` API.'), t) { + case 3: + a.info(e); + break; + case 4: + a.warn(e); + break; + case 5: + a.error(e); + break; + default: + a.log(e); + } + }, e.getVar = r, e.setVar = i, e.setCookie = function (e, t, n) { + var r = '', i = {}; + n && (r = ', { expires: ' + n + ' }', i.expires = n); + var a = '_satellite.setCookie is deprecated. Please use _satellite.cookie.set("' + e + '", "' + t + '"' + r + ').'; + O.deprecation(a), M.set(e, t, i); + }, e.readCookie = function (e) { + return O.deprecation('_satellite.readCookie is deprecated. Please use _satellite.cookie.get("' + e + '").'), M.get(e); + }, e.removeCookie = function (e) { + O.deprecation('_satellite.removeCookie is deprecated. Please use _satellite.cookie.remove("' + e + '").'), M.remove(e); + }, e.cookie = M, e.pageBottom = function () { + }, e.setDebug = n; + var o = !1; + Object.defineProperty(e, '_container', { + get: function () { + return o || (O.warn('_satellite._container may change at any time and should only be used for debugging.'), o = !0), t; + } + }); + }, at = window._satellite; + if (at && !window.__satelliteLoaded) { + window.__satelliteLoaded = !0; + var ot = at.container; + delete at.container; + var st = ot.property.settings.undefinedVarsReturnEmpty, ct = ot.property.settings.ruleComponentSequencingEnabled, ut = ot.dataElements || {}; + Q.migrateCookieData(ut); + var lt, dt = function (e) { + return ut[e]; + }, ft = ie(), pt = J(ft, dt, function () { + return lt.apply(null, arguments); + }, st), gt = {}, mt = ce(gt), ht = ne(gt, dt), vt = te(gt, dt, pt); + lt = se(ht, vt, st); + var bt = b(F('localStorage'), O); + it(at, ot, bt.setDebugEnabled, vt, mt), rt(ot, ft, bt, lt, pt); + var yt = oe(at), _t = _(ft, lt), Ct = ye(ft), xt = Ee(Ct, O, yt), kt = ke(Ae, Ct, O, yt), Et = xe(Ae, Ct, O, yt), It = Ie(O, yt), wt = Ce(De(ct, be(ve(_t, Se, xt, kt), we(_t, Et, It)), me(pe(_t, Le, Se, kt, xt), fe(_t, Le, Et), It), yt), _t, Ne, Ae, _e(ft), O); + je(h, ot.rules || [], wt); + } + return at; + } + console.warn('Adobe Launch is unsupported in IE 9 and below.'); + }(); + _satellite = $___var_11c4b70ad7ce8cfb; + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min.js b/resources/sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min.js new file mode 100644 index 00000000..dc4e0d72 --- /dev/null +++ b/resources/sugarcoat-launch-ENb97d7f9d2d4b4720ac9782a711994995.min.js @@ -0,0 +1,9970 @@ +var _satellite; +{ + const $___mock_de6065e54d8b0186 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_de6065e54d8b0186); + const $___mock_5bc84ba3ebf42be8 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_5bc84ba3ebf42be8); + (function () { + window._satellite = window._satellite || {}, window._satellite.container = { + buildInfo: { + minified: !0, + buildDate: '2021-06-28T13:36:06Z', + environment: 'production', + turbineBuildDate: '2021-04-26T16:54:28Z', + turbineVersion: '27.1.3' + }, + dataElements: { + 'event:jobCategory': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.jobCategory' } + }, + 'content:LinkName': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return digitalData.eventData.linkType + '|' + digitalData.eventData.linkName; + } + } + }, + CMPID: { + defaultValue: '', + forceLowerCase: !0, + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'CMPID', + caseInsensitive: !0 + } + }, + 'JobSearch:SortBy': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.sortBy' } + }, + 'Opt Out: Source': { + defaultValue: '', + storageDuration: 'session', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'so', + caseInsensitive: !0 + } + }, + 'Opt Out: Beamery Campaign ID': { + defaultValue: '', + storageDuration: 'session', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'ca', + caseInsensitive: !0 + } + }, + 'content:SiteError': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.siteError' } + }, + 'Form: FormErrors': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.formErrors' } + }, + 'Form:FormErrors': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.formErrors' } + }, + 'content:PageType': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.pageType' } + }, + 'Page URL': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'window.location.href' } + }, + 'content:CountryLanguage': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return digitalData.page.pageInfo.countryLanguage; + } + } + }, + 'JobSearch:SearchPosition': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.searchPosition' } + }, + 'event:jobDivision': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.jobDivision' } + }, + 'content:PageName': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.pageName' } + }, + 'Marketing: SocialPlatform': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.socialPlatform' } + }, + 'Opt Out: Beamery Conversation ID': { + defaultValue: '', + storageDuration: 'session', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'cn', + caseInsensitive: !0 + } + }, + 'jobDescription:jobName': { + defaultValue: 'No Job Name Found', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if (digitalData && digitalData.job && digitalData.job.title) + return digitalData.job.title; + } + } + }, + 'content: SubSectionLevel1': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.pageLevel1' } + }, + 'content:SiteSection': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.siteSection' } + }, + successConfirmation: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if (0 < document.location.href.indexOf('summary?result=success')) + return !0; + } + } + }, + 'JobSearch: SearchSelection': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.searchSelection' } + }, + 'Opt Out: System': { + defaultValue: '', + storageDuration: 'session', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'sy', + caseInsensitive: !0 + } + }, + 'content: SubSectionLevel2': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.pageLevel2' } + }, + 'content:personID': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.personId' } + }, + 'event:jobID': { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.jobID' } + }, + 'jobDescription:jobCategory': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.category' } + }, + 'Job Role': { + defaultValue: 'No Job Role Found', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.job_role' } + }, + 'Form: FormName': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.formName' } + }, + 'jobDescription:hiringYear': { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.hiring_year' } + }, + 'JobSearch:SearchTerm': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.search.keywordQuery' } + }, + 'jobDescription:jobFindingMethod': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.jobFindingMethod' } + }, + 'content:userType': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.userType' } + }, + 'event:jobName': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.jobName' } + }, + 'jobApplication:applicationId': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.application_id' } + }, + 'content:userID': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.userID' } + }, + 'jobDescription:jobCountry': { + defaultValue: 'No Job Country Found', + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.country' } + }, + CCUID: { + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'ccuid', + caseInsensitive: !0 + } + }, + 'content: SubSectionLevel3': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.pageLevel3' } + }, + 'jobDescription:jobDivision': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.division' } + }, + 'jobDescription: relatedJobImpressions': { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.relatedJobImpressions' } + }, + 'JobSearch:FilterBy': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return digitalData.eventData.filterType + '|' + digitalData.eventData.filterName; + } + } + }, + 'jobDescription:subCategory': { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.subCategory' } + }, + 'jobApplication:resumeType': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.resumeSource' } + }, + relatedJobId: { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.relatedJobId' } + }, + 'Form : formIndex': { + defaultValue: '', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.form_index' } + }, + 'jobDescription:jobType': { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.type' } + }, + 'Form : formTitle': { + defaultValue: '', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.form_title' } + }, + 'jobDescription:jobLocation': { + cleanText: !0, + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.location' } + }, + 'Sms Visible': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.smsVisible' } + }, + 'jobDescription:jobID': { + defaultValue: 'No Job ID Found', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if (digitalData && digitalData.job && digitalData.job.id) + return digitalData.job.id; + } + } + }, + 'SMS:SiteError ': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.errorMessage' } + }, + 'SMS - Option Selected': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.option' } + }, + 'event:jobCountry': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.jobCountry' } + }, + 'JobSearch:NoOfResults': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.search.noOfResults' } + }, + 'User Status': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.userStatus' } + }, + campaign: { + defaultValue: '', + forceLowerCase: !0, + cleanText: !0, + storageDuration: 'session', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'utm_campaign', + caseInsensitive: !0 + } + }, + 'PhoneNumber Match': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.phoneNumberMatch' } + }, + 'SMS - Event - smsOptedIn': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.smsOptedIn' } + }, + 'Phone Number Added': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.phoneNumberAdded' } + }, + 'jobDescription:jobBusinessPurpose': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.job.businessPurpose' } + }, + passportEventParams: { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventParams' } + }, + 'Phone Number Verified': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.phoneNumberVerified' } + }, + 'PhoneNumber CountryCode': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.phoneNumberCountryCode' } + }, + 'jobDescription:jobShareSocialMedia': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.socialMedia' } + }, + 'SMS:Stepname': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.eventData.stepName' } + }, + 'SMS OptedIn': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.smsOptedIn' } + }, + 'SMS assessmentRequired': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.assessmentRequired' } + }, + intcmpid: { + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'intcmpid', + caseInsensitive: !0 + } + }, + 'content:peopleSoftId': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.peopleSoftId' } + }, + 'content:userActionStore': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.userActionStoreId' } + }, + DCLID: { + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'dclid', + caseInsensitive: !0 + } + }, + 'User Auth Mode': { + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'digitalData.page.pageInfo.userAuthMode' } + } + }, + extensions: { + core: { + displayName: 'Core', + modules: { + 'core/src/lib/dataElements/javascriptVariable.js': { + name: 'javascript-variable', + displayName: 'JavaScript Variable', + script: function (e, t, n) { + 'use strict'; + var a = n('../helpers/getObjectProperty.js'); + e.exports = function (e) { + return a(window, e.path); + }; + } + }, + 'core/src/lib/dataElements/customCode.js': { + name: 'custom-code', + displayName: 'Custom Code', + script: function (e) { + 'use strict'; + e.exports = function (e, t) { + return e.source(t); + }; + } + }, + 'core/src/lib/dataElements/queryStringParameter.js': { + name: 'query-string-parameter', + displayName: 'Query String Parameter', + script: function (e, t, n) { + 'use strict'; + var s = n('@adobe/reactor-window'), o = n('@adobe/reactor-query-string'); + e.exports = function (e) { + var t = o.parse(s.location.search); + if (!e.caseInsensitive) + return t[e.name]; + for (var n = e.name.toLowerCase(), a = Object.keys(t), i = 0; i < a.length; i++) { + var r = a[i]; + if (r.toLowerCase() === n) + return t[r]; + } + }; + } + }, + 'core/src/lib/events/directCall.js': { + name: 'direct-call', + displayName: 'Direct Call', + script: function (e, t, n, r) { + 'use strict'; + var s = {}; + window._satellite = window._satellite || {}, window._satellite.track = function (e, t) { + e = e.trim(); + var n = s[e]; + if (n) { + var a = { + identifier: e, + detail: t + }; + n.forEach(function (e) { + e(a); + }); + var i = ['Rules using the direct call event type with identifier "' + e + '" have been triggered' + (t ? ' with additional detail:' : '.')]; + t && i.push(t), r.logger.log.apply(r.logger, i); + } else + r.logger.log('"' + e + '" does not match any direct call identifiers.'); + }, e.exports = function (e, t) { + var n = s[e.identifier]; + n || (n = s[e.identifier] = []), n.push(t); + }; + } + }, + 'core/src/lib/conditions/valueComparison.js': { + name: 'value-comparison', + displayName: 'Value Comparison', + script: function (e) { + 'use strict'; + var a = function (e) { + return 'number' == typeof e && isFinite(e); + }, i = function (e) { + return 'string' == typeof e || e instanceof String; + }, r = function (e, t) { + return t && i(e) ? e.toLowerCase() : e; + }, s = function (e) { + return a(e) ? String(e) : e; + }, o = function (e) { + return i(e) ? Number(e) : e; + }, t = function (a) { + return function (e, t, n) { + return e = s(e), t = s(t), i(e) && i(t) && a(e, t, n); + }; + }, n = function (n) { + return function (e, t) { + return e = o(e), t = o(t), a(e) && a(t) && n(e, t); + }; + }, c = function (a) { + return function (e, t, n) { + return a(r(e, n), r(t, n)); + }; + }, l = { + equals: c(function (e, t) { + return e == t; + }), + doesNotEqual: function () { + return !l.equals.apply(null, arguments); + }, + contains: t(c(function (e, t) { + return -1 !== e.indexOf(t); + })), + doesNotContain: function () { + return !l.contains.apply(null, arguments); + }, + startsWith: t(c(function (e, t) { + return 0 === e.indexOf(t); + })), + doesNotStartWith: function () { + return !l.startsWith.apply(null, arguments); + }, + endsWith: t(c(function (e, t) { + return e.substring(e.length - t.length, e.length) === t; + })), + doesNotEndWith: function () { + return !l.endsWith.apply(null, arguments); + }, + matchesRegex: t(function (e, t, n) { + return new RegExp(t, n ? 'i' : '').test(e); + }), + doesNotMatchRegex: function () { + return !l.matchesRegex.apply(null, arguments); + }, + lessThan: n(function (e, t) { + return e < t; + }), + lessThanOrEqual: n(function (e, t) { + return e <= t; + }), + greaterThan: n(function (e, t) { + return t < e; + }), + greaterThanOrEqual: n(function (e, t) { + return t <= e; + }), + isTrue: function (e) { + return !0 === e; + }, + isTruthy: function (e) { + return Boolean(e); + }, + isFalse: function (e) { + return !1 === e; + }, + isFalsy: function (e) { + return !e; + } + }; + e.exports = function (e) { + return l[e.comparison.operator](e.leftOperand, e.rightOperand, Boolean(e.comparison.caseInsensitive)); + }; + } + }, + 'core/src/lib/events/pageBottom.js': { + name: 'page-bottom', + displayName: 'Page Bottom', + script: function (e, t, n) { + 'use strict'; + var a = n('./helpers/pageLifecycleEvents'); + e.exports = function (e, t) { + a.registerPageBottomTrigger(t); + }; + } + }, + 'core/src/lib/conditions/path.js': { + name: 'path', + displayName: 'Path Without Query String', + script: function (e, t, n) { + 'use strict'; + var a = n('@adobe/reactor-document'), i = n('../helpers/textMatch'); + e.exports = function (e) { + var n = a.location.pathname; + return e.paths.some(function (e) { + var t = e.valueIsRegex ? new RegExp(e.value, 'i') : e.value; + return i(n, t); + }); + }; + } + }, + 'core/src/lib/conditions/customCode.js': { + name: 'custom-code', + displayName: 'Custom Code', + script: function (e) { + 'use strict'; + e.exports = function (e, t) { + return e.source.call(t.element, t, t.target); + }; + } + }, + 'core/src/lib/actions/customCode.js': { + name: 'custom-code', + displayName: 'Custom Code', + script: function (e, t, n, r) { + 'use strict'; + var s, a, i, o, c = n('@adobe/reactor-document'), l = n('@adobe/reactor-promise'), u = n('./helpers/decorateCode'), d = n('./helpers/loadCodeSequentially'), p = n('../../../node_modules/postscribe/dist/postscribe'), f = n('./helpers/unescapeHtmlCode'), m = (a = function (e) { + p(c.body, e, { + beforeWriteToken: function (t) { + var e = t.tagName && t.tagName.toLowerCase(); + return s && 'script' === e && (t.attrs.nonce = s), 'script' !== e && 'style' !== e || (Object.keys(t.attrs || {}).forEach(function (e) { + t.attrs[e] = f(t.attrs[e]); + }), t.src && (t.src = f(t.src))), t; + }, + error: function (e) { + r.logger.error(e.msg); + } + }); + }, i = [], o = function () { + if (c.body) + for (; i.length;) + a(i.shift()); + else + setTimeout(o, 20); + }, function (e) { + i.push(e), o(); + }), g = function () { + if (c.currentScript) + return c.currentScript.async; + for (var e = c.querySelectorAll('script'), t = 0; t < e.length; t++) { + var n = e[t]; + if (/(launch|satelliteLib)-[^\/]+.js(\?.*)?$/.test(n.src)) + return n.async; + } + return !0; + }(); + e.exports = function (e, t) { + var n; + s = r.getExtensionSettings().cspNonce; + var a = { + settings: e, + event: t + }, i = a.settings.source; + if (i) + return a.settings.isExternal ? d(i).then(function (e) { + return e ? (n = u(a, e), m(n.code), n.promise) : l.resolve(); + }) : (n = u(a, i), g || 'loading' !== c.readyState ? m(n.code) : c.write && !1 === r.propertySettings.ruleComponentSequencingEnabled ? c.write(n.code) : m(n.code), n.promise); + }; + } + }, + 'core/src/lib/conditions/subdomain.js': { + name: 'subdomain', + displayName: 'Subdomain', + script: function (e, t, n) { + 'use strict'; + var a = n('@adobe/reactor-document'), i = n('../helpers/textMatch'); + e.exports = function (e) { + var n = a.location.hostname; + return e.subdomains.some(function (e) { + var t = e.valueIsRegex ? new RegExp(e.value, 'i') : e.value; + return i(n, t); + }); + }; + } + }, + 'core/src/lib/events/libraryLoaded.js': { + name: 'library-loaded', + displayName: 'Library Loaded (Page Top)', + script: function (e, t, n) { + 'use strict'; + var a = n('./helpers/pageLifecycleEvents'); + e.exports = function (e, t) { + a.registerLibraryLoadedTrigger(t); + }; + } + }, + 'core/src/lib/events/click.js': { + name: 'click', + displayName: 'Click', + script: function (e, t, n) { + 'use strict'; + var r = n('@adobe/reactor-window'), s = n('./helpers/createBubbly')(), o = new (n('./helpers/weakMap'))(), c = function (e) { + for (; e;) { + var t = e.tagName; + if (t && 'a' === t.toLowerCase()) { + var n = e.getAttribute('href'), a = e.getAttribute('target'); + return n && (!a || '_self' === a || '_top' === a && r.top === r || a === r.name) ? e : void 0; + } + e = e.parentNode; + } + }; + document.addEventListener('click', s.evaluateEvent, !0), e.exports = function (a, i) { + s.addListener(a, function (e) { + var t = e.nativeEvent; + if (!t.s_fe) { + if (a.anchorDelay && !o.has(t)) { + var n = c(t.target); + n && (t.preventDefault(), setTimeout(function () { + r.location = n.href; + }, a.anchorDelay)), o.set(t, !0); + } + i(e); + } + }); + }, e.exports.__reset = s.__reset; + } + }, + 'core/src/lib/helpers/getObjectProperty.js': { + script: function (e) { + 'use strict'; + e.exports = function (e, t) { + for (var n = t.split('.'), a = e, i = 0, r = n.length; i < r; i++) { + if (null == a) + return undefined; + a = a[n[i]]; + } + return a; + }; + } + }, + 'core/src/lib/events/helpers/pageLifecycleEvents.js': { + script: function (e, t, n) { + 'use strict'; + var a = n('@adobe/reactor-window'), i = n('@adobe/reactor-document'), r = -1 !== a.navigator.appVersion.indexOf('MSIE 10'), s = 'WINDOW_LOADED', o = 'DOM_READY', c = 'PAGE_BOTTOM', l = [ + c, + o, + s + ], u = function (e, t) { + return { + element: e, + target: e, + nativeEvent: t + }; + }, d = {}; + l.forEach(function (e) { + d[e] = []; + }); + var p = function (e, t) { + l.slice(0, m(e) + 1).forEach(function (e) { + g(t, e); + }); + }, f = function () { + return 'complete' === i.readyState ? s : 'interactive' === i.readyState ? r ? null : o : void 0; + }, m = function (e) { + return l.indexOf(e); + }, g = function (t, e) { + d[e].forEach(function (e) { + b(t, e); + }), d[e] = []; + }, b = function (e, t) { + var n = t.trigger, a = t.syntheticEventFn; + n(a ? a(e) : null); + }; + a._satellite = a._satellite || {}, a._satellite.pageBottom = p.bind(null, c), i.addEventListener('DOMContentLoaded', p.bind(null, o), !0), a.addEventListener('load', p.bind(null, s), !0), a.setTimeout(function () { + var e = f(); + e && p(e); + }, 0), e.exports = { + registerLibraryLoadedTrigger: function (e) { + e(); + }, + registerPageBottomTrigger: function (e) { + d[c].push({ trigger: e }); + }, + registerDomReadyTrigger: function (e) { + d[o].push({ + trigger: e, + syntheticEventFn: u.bind(null, i) + }); + }, + registerWindowLoadedTrigger: function (e) { + d[s].push({ + trigger: e, + syntheticEventFn: u.bind(null, a) + }); + } + }; + } + }, + 'core/src/lib/helpers/textMatch.js': { + script: function (e) { + 'use strict'; + e.exports = function (e, t) { + if (null == t) + throw new Error('Illegal Argument: Pattern is not present'); + return null != e && ('string' == typeof t ? e === t : t instanceof RegExp && t.test(e)); + }; + } + }, + 'core/src/lib/actions/helpers/decorateCode.js': { + script: function (e, t, n) { + 'use strict'; + var a = n('./decorators/decorateGlobalJavaScriptCode'), i = n('./decorators/decorateNonGlobalJavaScriptCode'), r = { + javascript: function (e, t) { + return e.settings.global ? a(e, t) : i(e, t); + }, + html: n('./decorators/decorateHtmlCode') + }; + e.exports = function (e, t) { + return r[e.settings.language](e, t); + }; + } + }, + 'core/src/lib/actions/helpers/loadCodeSequentially.js': { + script: function (e, t, n) { + 'use strict'; + var a = n('@adobe/reactor-promise'), i = n('./getSourceByUrl'), r = a.resolve(); + e.exports = function (t) { + var e = new a(function (n) { + var e = i(t); + a.all([ + e, + r + ]).then(function (e) { + var t = e[0]; + n(t); + }); + }); + return r = e; + }; + } + }, + 'core/node_modules/postscribe/dist/postscribe.js': { + script: function (n, a) { + !function i(e, t) { + 'object' == typeof a && 'object' == typeof n ? n.exports = t() : 'function' == typeof define && define.amd ? define([], t) : 'object' == typeof a ? a.postscribe = t() : e.postscribe = t(); + }(this, function () { + return function (n) { + function a(e) { + if (i[e]) + return i[e].exports; + var t = i[e] = { + exports: {}, + id: e, + loaded: !1 + }; + return n[e].call(t.exports, t, t.exports, a), t.loaded = !0, t.exports; + } + var i = {}; + return a.m = n, a.c = i, a.p = '', a(0); + }([ + function (e, t, n) { + 'use strict'; + function a(e) { + return e && e.__esModule ? e : { 'default': e }; + } + var i = a(n(1)); + e.exports = i['default']; + }, + function (e, t, n) { + 'use strict'; + function a(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function i(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function l() { + } + function u() { + var e = c.shift(); + if (e) { + var t = s.last(e); + t.afterDequeue(), e.stream = r.apply(undefined, e), t.afterStreamStart(); + } + } + function r(e, t, a) { + function i(e) { + e = a.beforeWrite(e), g.write(e), a.afterWrite(e); + } + (g = new f['default'](e, a)).id = m++, g.name = a.name || g.id, d.streams[g.name] = g; + var n = e.ownerDocument, r = { + close: n.close, + open: n.open, + write: n.write, + writeln: n.writeln + }; + p(n, { + close: l, + open: l, + write: function o() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + return i(t.join('')); + }, + writeln: function c() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + return i(t.join('') + '\n'); + } + }); + var s = g.win.onerror || l; + return g.win.onerror = function (e, t, n) { + a.error({ msg: e + ' - ' + t + ': ' + n }), s.apply(g.win, [ + e, + t, + n + ]); + }, g.write(t, function () { + p(n, r), g.win.onerror = s, a.done(), g = null, u(); + }), g; + } + function d(e, t, n) { + if (s.isFunction(n)) + n = { done: n }; + else if ('clear' === n) + return c = [], g = null, void (m = 0); + n = s.defaults(n, o); + var a = [ + e = /^#/.test(e) ? window.document.getElementById(e.substr(1)) : e.jquery ? e[0] : e, + t, + n + ]; + return e.postscribe = { + cancel: function i() { + a.stream ? a.stream.abort() : a[1] = l; + } + }, n.beforeEnqueue(a), c.push(a), g || u(), e.postscribe; + } + t.__esModule = !0; + var p = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var a in n) + Object.prototype.hasOwnProperty.call(n, a) && (e[a] = n[a]); + } + return e; + }; + t['default'] = d; + var f = i(n(2)), s = a(n(4)), o = { + afterAsync: l, + afterDequeue: l, + afterStreamStart: l, + afterWrite: l, + autoFix: !0, + beforeEnqueue: l, + beforeWriteToken: function b(e) { + return e; + }, + beforeWrite: function v(e) { + return e; + }, + done: l, + error: function h(e) { + throw new Error(e.msg); + }, + releaseAsync: !1 + }, m = 0, c = [], g = null; + p(d, { + streams: {}, + queue: c, + WriteStream: f['default'] + }); + }, + function (e, t, n) { + 'use strict'; + function a(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function i(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function y(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + function _(e, t) { + var n = D + t, a = e.getAttribute(n); + return k.existy(a) ? String(a) : a; + } + function P(e, t, n) { + var a = 2 < arguments.length && n !== undefined ? arguments[2] : null, i = D + t; + k.existy(a) && '' !== a ? e.setAttribute(i, a) : e.removeAttribute(i); + } + t.__esModule = !0; + var S = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var a in n) + Object.prototype.hasOwnProperty.call(n, a) && (e[a] = n[a]); + } + return e; + }, C = i(n(3)), k = a(n(4)), j = !1, D = 'data-ps-', w = 'ps-style', V = 'ps-script', r = function () { + function a(e, t) { + var n = 1 < arguments.length && t !== undefined ? arguments[1] : {}; + y(this, a), this.root = e, this.options = n, this.doc = e.ownerDocument, this.win = this.doc.defaultView || this.doc.parentWindow, this.parser = new C['default']('', { autoFix: n.autoFix }), this.actuals = [e], this.proxyHistory = '', this.proxyRoot = this.doc.createElement(e.nodeName), this.scriptStack = [], this.writeQueue = [], P(this.proxyRoot, 'proxyof', 0); + } + return a.prototype.write = function n() { + var e; + for ((e = this.writeQueue).push.apply(e, arguments); !this.deferredRemote && this.writeQueue.length;) { + var t = this.writeQueue.shift(); + k.isFunction(t) ? this._callFunction(t) : this._writeImpl(t); + } + }, a.prototype._callFunction = function i(e) { + var t = { + type: 'function', + value: e.name || e.toString() + }; + this._onScriptStart(t), e.call(this.win, this.doc), this._onScriptDone(t); + }, a.prototype._writeImpl = function r(e) { + this.parser.append(e); + for (var t = void 0, n = void 0, a = void 0, i = []; (t = this.parser.readToken()) && !(n = k.isScript(t)) && !(a = k.isStyle(t));) + (t = this.options.beforeWriteToken(t)) && i.push(t); + 0 < i.length && this._writeStaticTokens(i), n && this._handleScriptToken(t), a && this._handleStyleToken(t); + }, a.prototype._writeStaticTokens = function s(e) { + var t = this._buildChunk(e); + return t.actual ? (t.html = this.proxyHistory + t.actual, this.proxyHistory += t.proxy, this.proxyRoot.innerHTML = t.html, j && (t.proxyInnerHTML = this.proxyRoot.innerHTML), this._walkChunk(), j && (t.actualInnerHTML = this.root.innerHTML), t) : null; + }, a.prototype._buildChunk = function u(e) { + for (var t = this.actuals.length, n = [], a = [], i = [], r = e.length, s = 0; s < r; s++) { + var o = e[s], c = o.toString(); + if (n.push(c), o.attrs) { + if (!/^noscript$/i.test(o.tagName)) { + var l = t++; + a.push(c.replace(/(\/?>)/, ' ' + D + 'id=' + l + ' $1')), o.attrs.id !== V && o.attrs.id !== w && i.push('atomicTag' === o.type ? '' : '<' + o.tagName + ' ' + D + 'proxyof=' + l + (o.unary ? ' />' : '>')); + } + } else + a.push(c), i.push('endTag' === o.type ? c : ''); + } + return { + tokens: e, + raw: n.join(''), + actual: a.join(''), + proxy: i.join('') + }; + }, a.prototype._walkChunk = function o() { + for (var e = void 0, t = [this.proxyRoot]; k.existy(e = t.shift());) { + var n = 1 === e.nodeType; + if (!n || !_(e, 'proxyof')) { + n && P(this.actuals[_(e, 'id')] = e, 'id'); + var a = e.parentNode && _(e.parentNode, 'proxyof'); + a && this.actuals[a].appendChild(e); + } + t.unshift.apply(t, k.toArray(e.childNodes)); + } + }, a.prototype._handleScriptToken = function c(e) { + var t = this, n = this.parser.clear(); + n && this.writeQueue.unshift(n), e.src = e.attrs.src || e.attrs.SRC, (e = this.options.beforeWriteToken(e)) && (e.src && this.scriptStack.length ? this.deferredRemote = e : this._onScriptStart(e), this._writeScriptToken(e, function () { + t._onScriptDone(e); + })); + }, a.prototype._handleStyleToken = function l(e) { + var t = this.parser.clear(); + t && this.writeQueue.unshift(t), e.type = e.attrs.type || e.attrs.TYPE || 'text/css', (e = this.options.beforeWriteToken(e)) && this._writeStyleToken(e), t && this.write(); + }, a.prototype._writeStyleToken = function d(e) { + var t = this._buildStyle(e); + this._insertCursor(t, w), e.content && (t.styleSheet && !t.sheet ? t.styleSheet.cssText = e.content : t.appendChild(this.doc.createTextNode(e.content))); + }, a.prototype._buildStyle = function t(e) { + var n = this.doc.createElement(e.tagName); + return n.setAttribute('type', e.type), k.eachKey(e.attrs, function (e, t) { + n.setAttribute(e, t); + }), n; + }, a.prototype._insertCursor = function p(e, t) { + this._writeImpl(''); + var n = this.doc.getElementById(t); + n && n.parentNode.replaceChild(e, n); + }, a.prototype._onScriptStart = function f(e) { + e.outerWrites = this.writeQueue, this.writeQueue = [], this.scriptStack.unshift(e); + }, a.prototype._onScriptDone = function m(e) { + e === this.scriptStack[0] ? (this.scriptStack.shift(), this.write.apply(this, e.outerWrites), !this.scriptStack.length && this.deferredRemote && (this._onScriptStart(this.deferredRemote), this.deferredRemote = null)) : this.options.error({ msg: 'Bad script nesting or script finished twice' }); + }, a.prototype._writeScriptToken = function g(e, t) { + var n = this._buildScript(e), a = this._shouldRelease(n), i = this.options.afterAsync; + e.src && (n.src = e.src, this._scriptLoadHandler(n, a ? i : function () { + t(), i(); + })); + try { + this._insertCursor(n, V), n.src && !a || t(); + } catch (r) { + this.options.error(r), t(); + } + }, a.prototype._buildScript = function b(e) { + var n = this.doc.createElement(e.tagName); + return k.eachKey(e.attrs, function (e, t) { + n.setAttribute(e, t); + }), e.content && (n.text = e.content), n; + }, a.prototype._scriptLoadHandler = function v(t, n) { + function a() { + t = t.onload = t.onreadystatechange = t.onerror = null; + } + function i() { + a(), null != n && n(), n = null; + } + function r(e) { + a(), s(e), null != n && n(), n = null; + } + function e(e, t) { + var n = e['on' + t]; + null != n && (e['_on' + t] = n); + } + var s = this.options.error; + e(t, 'load'), e(t, 'error'), S(t, { + onload: function o() { + if (t._onload) + try { + t._onload.apply(this, Array.prototype.slice.call(arguments, 0)); + } catch (e) { + r({ msg: 'onload handler failed ' + e + ' @ ' + t.src }); + } + i(); + }, + onerror: function c() { + if (t._onerror) + try { + t._onerror.apply(this, Array.prototype.slice.call(arguments, 0)); + } catch (e) { + return void r({ msg: 'onerror handler failed ' + e + ' @ ' + t.src }); + } + r({ msg: 'remote script failed ' + t.src }); + }, + onreadystatechange: function l() { + /^(loaded|complete)$/.test(t.readyState) && i(); + } + }); + }, a.prototype._shouldRelease = function h(e) { + return !/^script$/i.test(e.nodeName) || !!(this.options.releaseAsync && e.src && e.hasAttribute('async')); + }, a; + }(); + t['default'] = r; + }, + function (n) { + !function a(e, t) { + n.exports = t(); + }(0, function () { + return function (n) { + function a(e) { + if (i[e]) + return i[e].exports; + var t = i[e] = { + exports: {}, + id: e, + loaded: !1 + }; + return n[e].call(t.exports, t, t.exports, a), t.loaded = !0, t.exports; + } + var i = {}; + return a.m = n, a.c = i, a.p = '', a(0); + }([ + function (e, t, n) { + 'use strict'; + function a(e) { + return e && e.__esModule ? e : { 'default': e }; + } + var i = a(n(1)); + e.exports = i['default']; + }, + function (e, t, n) { + 'use strict'; + function a(e) { + return e && e.__esModule ? e : { 'default': e }; + } + function i(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t['default'] = e, t; + } + function u(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + t.__esModule = !0; + var d = i(n(2)), p = i(n(3)), f = a(n(6)), r = n(5), m = { + comment: /^'); + if (0 <= t) + return new u.CommentToken(e.substr(4, t - 1), t + 3); + } + function i(e) { + var t = e.indexOf('<'); + return new u.CharsToken(0 <= t ? t : e.length); + } + function r(e) { + var s, o, c; + if (-1 !== e.indexOf('>')) { + var t = e.match(d.startTag); + if (t) { + var n = (s = {}, o = {}, c = t[2], t[2].replace(d.attr, function (e, t, n, a, i, r) { + n || a || i || r ? arguments[5] ? (s[arguments[5]] = '', o[arguments[5]] = !0) : s[t] = arguments[2] || arguments[3] || arguments[4] || d.fillAttr.test(t) && t || '' : s[t] = '', c = c.replace(e, ''); + }), { v: new u.StartTagToken(t[1], t[0].length, s, o, !!t[3], c.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')) }); + if ('object' === (void 0 === n ? 'undefined' : l(n))) + return n.v; + } + } + } + function s(e) { + var t = r(e); + if (t) { + var n = e.slice(t.length); + if (n.match(new RegExp('', 'i'))) { + var a = n.match(new RegExp('([\\s\\S]*?)', 'i')); + if (a) + return new u.AtomicTagToken(t.tagName, a[0].length + t.length, t.attrs, t.booleanAttrs, a[1]); + } + } + } + function o(e) { + var t = e.match(d.endTag); + if (t) + return new u.EndTagToken(t[1], t[0].length); + } + t.__esModule = !0; + var l = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + }; + t.comment = a, t.chars = i, t.startTag = r, t.atomicTag = s, t.endTag = o; + var u = n(4), d = { + startTag: /^<([\-A-Za-z0-9_]+)((?:\s+[\w\-]+(?:\s*=?\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, + endTag: /^<\/([\-A-Za-z0-9_]+)[^>]*>/, + attr: /(?:([\-A-Za-z0-9_]+)\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))|(?:([\-A-Za-z0-9_]+)(\s|$)+)/g, + fillAttr: /^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noresize|noshade|nowrap|readonly|selected)$/i + }; + }, + function (e, t, n) { + 'use strict'; + function o(e, t) { + if (!(e instanceof t)) + throw new TypeError('Cannot call a class as a function'); + } + t.__esModule = !0, t.EndTagToken = t.AtomicTagToken = t.StartTagToken = t.TagToken = t.CharsToken = t.CommentToken = t.Token = undefined; + var c = n(5), a = t.Token = function a(e, t) { + o(this, a), this.type = e, this.length = t, this.text = ''; + }, i = (t.CommentToken = function () { + function n(e, t) { + o(this, n), this.type = 'comment', this.length = t || (e ? e.length : 0), this.text = '', this.content = e; + } + return n.prototype.toString = function e() { + return '\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL1971538d3b9a4153a93ca18b043906ca', + name: 'content:LinkClick', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'linkClick' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar21', + type: 'value', + value: '%content:LinkName%' + }], + props: [{ + name: 'prop23', + type: 'value', + value: '%content:LinkName%' + }], + events: [{ name: 'event37' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Link Click', + linkType: 'o' + } + } + ] + }, + { + id: 'RL634df6be748249e3a5bf6a608f26d876', + name: 'jobApplication:Dashboard Views', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'jobApplicationViews' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar28', + type: 'value', + value: '%content:personID%' + }], + events: [{ name: 'event20' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Job Application Dashboard Views', + linkType: 'o' + } + } + ] + }, + { + id: 'RL55cbb8ed88664bcfb663ec312ed9a018', + name: 'User:Login Start', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'loginStart' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { trackerProperties: { events: [{ name: 'event1' }] } } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Login Start', + linkType: 'o' + } + } + ] + }, + { + id: 'RLffe106ce62a74c80be793979c49eead0', + name: 'Marketing:SocialClicks', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'socialShare' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar3', + type: 'value', + value: '%Marketing: SocialPlatform%' + }], + events: [{ name: 'event4' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Social Clicks', + linkType: 'o' + } + } + ] + }, + { + id: 'RL04e85c77d4c144ee9cc47376a20098f6', + name: 'JobApplication:JobRefer', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'jobRefer' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar1', + type: 'value', + value: '%jobDescription:jobID%' + }, + { + name: 'eVar2', + type: 'value', + value: '%jobDescription:jobName%' + }, + { + name: 'eVar20', + type: 'value', + value: '%jobDescription:jobCategory%' + }, + { + name: 'eVar22', + type: 'value', + value: '%jobDescription:jobDivision%' + } + ], + events: [{ name: 'event94' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Job Refer', + linkType: 'o' + } + } + ] + }, + { + id: 'RL521947b4a8b14ae7b54cecdf2ea6beef', + name: 'CTA Click', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'ctaClick' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar21', + type: 'value', + value: '%CTA Name%' + }], + events: [{ name: 'event37' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: '%CTA Name%', + linkType: 'o' + } + } + ] + }, + { + id: 'RL6086aadada1144a6b05874050f35d8f3', + name: 'ResumeParsingService:ProfileDifferentFromPopulated', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'external_parsed_resume_different_from_profile' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { trackerProperties: {} } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { type: 'page' } + } + ] + }, + { + id: 'RLa27e4b9179664dc8a6b9b37e28112322', + name: 'ResumeParsingService:Call', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'external_parsed_resume_call_from_A2D1' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { trackerProperties: {} } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { type: 'page' } + } + ] + }, + { + id: 'RLf42fcaba154c4d149a84697738e81249', + name: 'SK Landing Page - SKLIK', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/en/landing_pages/praca-v-logistike' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n', + language: 'html' + } + }] + }, + { + id: 'RLdf3758b403dc45118292fb72654ac611', + name: 'ResumeParsingService:PopulatedValueChange', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'external_parsed_resume_value_update' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { trackerProperties: {} } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { type: 'page' } + } + ] + }, + { + id: 'RL26dbff0ef71f4e6f9b7827328dcf8417', + name: 'CZ Landing Page - GTag', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/cs/landing_pages/prace' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n', + language: 'html' + } + }] + }, + { + id: 'RL2f5cb6f9c4d04195a7007d0d005e8a9b', + name: 'CZ Landing Page - FB Pixel', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/cs/landing_pages/prace' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL9e8eb714a49744f09c62ba943c7e4da1', + name: 'content:SiteError', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'siteError' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar13', + type: 'value', + value: '%content:SiteError%' + }], + events: [{ name: 'event38' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Error Occured', + linkType: 'o' + } + } + ] + }, + { + id: 'RL33d4a890254c43d19860564be43dfcd1', + name: 'SK Landing Page - FB Pixel', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/valueComparison.js', + settings: { + comparison: { operator: 'equals' }, + leftOperand: '%Page URL%', + rightOperand: 'https://www.amazon.jobs/en/landing_pages/praca-v-logistike' + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL68524c72fe354b00a7ef4164c2b6c909', + name: 'SK Landing Page - Global RMK', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/en/landing_pages/praca-v-logistike' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL772d010eb269423fae7b6cbc0a76450e', + name: 'CZ Landing Page - RMK tag', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/cs/landing_pages/prace' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RLc83b33e80b6d443f8447a3fc6a677bc5', + name: 'PL Landing Page - Pixel', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/pl/landing_pages/praca' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-katowice' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-wroclaw' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-lodz' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-Szczecin' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-poznan' == document.location.href || 'https://www.amazon.jobs/pl/landing_pages/praca-swiebodzin' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RL9c448bb418ef4eb58aedc38313e2476f', + name: 'SK Landing Page - AdForm ', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/en/landing_pages/praca-v-logistike' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '----------------------------------------------------------------------------------------------\nTracking Code: Standard (Asynchronous) "amazon_remarketing_microsite_visits_sk"\n----------------------------------------------------------------------------------------------\n\n\n\n\n', + language: 'html' + } + }] + }, + { + id: 'RLd137ceb7a1e24d519dfa43d2c6ae8ebe', + name: 'SK Landing Page - RMK', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/customCode.js', + settings: { + source: function () { + if ('https://www.amazon.jobs/en/landing_pages/praca-v-logistike' == document.location.href) + return !0; + } + } + }], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + source: '\n', + language: 'html' + } + }] + }, + { + id: 'RL61ef88a9eb434f0cbfe6178f1bede828', + name: 'jobApplication:formError', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'formErrorsJobApplication' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar28', + type: 'value', + value: '%content:personID%' + }], + events: [{ name: 'event40' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Job Application - Form Error', + linkType: 'o' + } + } + ] + }, + { + id: 'RL11bdf63af6f649d9b9ae78937f7a8c52', + name: 'JobApplication:centralizedHiringApply', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'centralizedHiringApply' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar1', + type: 'value', + value: '%jobDescription:jobID%' + }, + { + name: 'eVar2', + type: 'value', + value: '%jobDescription:jobName%' + }, + { + name: 'eVar20', + type: 'value', + value: '%jobDescription:jobCategory%' + }, + { + name: 'eVar22', + type: 'value', + value: '%jobDescription:jobDivision%' + }, + { + name: 'eVar37', + type: 'value', + value: '%jobDescription:jobCountry%' + }, + { + name: 'eVar58', + type: 'value', + value: 'Centralized Hiring Process' + }, + { + name: 'eVar60', + type: 'value', + value: '%Job Role%' + }, + { + name: 'eVar80', + type: 'value', + value: '%jobDescription:hiringYear%' + } + ], + events: [{ name: 'event129' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Centralized Hiring Apply Now Click', + linkType: 'o' + } + } + ] + }, + { + id: 'RL12b28468e69a4dfca714d87b6fc2b7ab', + name: 'Type Ahead Search Send', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'searchTermSelect' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [{ + name: 'eVar31', + type: 'value', + value: '%event.detail.searchTerm%' + }], + events: [{ name: 'event15' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Search | Type Ahead', + linkType: 'o' + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + } + ] + }, + { + id: 'RLdd638513616a461ba96206d83d159091', + name: 'Type Ahead Search', + events: [{ + modulePath: 'core/src/lib/events/pageBottom.js', + settings: {}, + ruleOrder: 50 + }], + conditions: [], + actions: [{ + modulePath: 'core/src/lib/actions/customCode.js', + settings: { + global: !1, + source: '$(\'body\').on(\'click\',\'div.suggestion-link\', function() {\n\tsuggestionLinkText = this.innerText.trim();\n _satellite.track(\'searchTermSelect\',{"searchTerm": suggestionLinkText});\n})', + language: 'javascript' + } + }] + }, + { + id: 'RL1c1f59b3d1a249a298e73dc066a79328', + name: 'SMS Successful Verifications', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'Verification-Success' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar89', + type: 'value', + value: '%User Status%' + }, + { + name: 'eVar99', + type: 'value', + value: '%SMS:Stepname%' + } + ], + events: [{ name: 'event120' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'SMS - Verification-Success', + linkType: 'o' + } + } + ] + }, + { + id: 'RL1544da947d2f482b84c4a1f8772dce60', + name: 'passport:UpdatePasswordSucceeded', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'passportUpdatePasswordSucceeded' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { trackerProperties: { events: [{ name: 'event47' }] } } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'Passport Events', + linkType: 'o' + } + } + ] + }, + { + id: 'RL1fc2be13bbc74bb8839c3510aa996940', + name: 'SMS Send New Code', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'SMS Send New Code' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar89', + type: 'value', + value: '%User Status%' + }, + { + name: 'eVar99', + type: 'value', + value: '%SMS:Stepname%' + } + ], + events: [{ name: 'event135' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'SMS - Send new Code', + linkType: 'o' + } + } + ] + }, + { + id: 'RL208baa3460f4446da728ca9f9b3a0c57', + name: 'SMS Get verification code', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'SMS Get verification code' }, + ruleOrder: 50 + }], + conditions: [], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/clearVariables.js', + settings: {} + }, + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + trackerProperties: { + eVars: [ + { + name: 'eVar89', + type: 'value', + value: '%User Status%' + }, + { + name: 'eVar99', + type: 'value', + value: '%SMS:Stepname%' + } + ], + events: [{ name: 'event109' }] + } + } + }, + { + modulePath: 'adobe-analytics/src/lib/actions/sendBeacon.js', + settings: { + type: 'link', + linkName: 'SMS Get verification code', + linkType: 'o' + } + } + ] + }, + { + id: 'RL4c6ed47a923045e28fa5fde995d6bdae', + name: 'passport:asyncPageLoad', + events: [{ + modulePath: 'core/src/lib/events/directCall.js', + settings: { identifier: 'asyncPageLoad' }, + ruleOrder: 40 + }], + conditions: [{ + modulePath: 'core/src/lib/conditions/subdomain.js', + settings: { + subdomains: [ + { + value: 'passport', + valueIsRegex: !0 + }, + { + value: 'aka\\.corp\\.amazon\\.com', + valueIsRegex: !0 + } + ] + } + }], + actions: [ + { + modulePath: 'adobe-analytics/src/lib/actions/setVariables.js', + settings: { + customSetup: { + source: function (e, t) { + function n() { + if (!window.s_loadT) { + var e = new Date().getTime(), t = window.performance ? performance.timing : 0, n = t ? t.requestStart : window.inHeadTS || 0; + s_loadT = n ? Math.round((e - n) / 100) : ''; + } + return s_loadT; + } + var a = Visitor.getInstance('4EE1BB6555F9369A7F000101@AdobeOrg').getMarketingCloudVisitorID(); + a && (t.eVar6 = a), t.prop5 = 'undefined' != typeof Visitor ? 'VisitorAPI Present' : 'VisitorAPI Missing', t.prop2 = 'D=t', 0 < window.location.href.indexOf('404') && (t.pageType = 'errorPage'), t.eVar15 = window.location.hostname, t.eVar16 = window.location.pathname, t.prop13 = window.location.href, t.prop14 = n(), t.prop17 = 'D=j', t.prop18 = document.title; + var i = location.search.split('='), r = i[0].substr(1, i[0].length); + t.prop19 = r, t.usePlugins = !0, t.doPlugins = function (e) { + e.Util.getQueryParam('utm_medium') && (e.eVar17 = e.Util.getQueryParam('utm_medium') + ':' + e.Util.getQueryParam('utm_source') + ':' + e.Util.getQueryParam('utm_term') + ':' + e.Util.getQueryParam('utm_content')), e.eVar17 = e.getValOnce(e.eVar17, 's_eVar17'), digitalData.page.search && 'Zero' == digitalData.page.search.noOfResults && (e.events = e.apl(e.events, 'event34', ',', 2)), e.prop25 = e.getDaysSinceLastVisit('s_lv'), e.prop22 = e.getNewRepeat(30, 's_getNewRepeat'), e.prop10 = e.getPreviousValue(e.pageName, 'gpv', ''), e.prop10 && (e.eVar25 = 'D=c10', e.prop11 = e.getPercentPageViewed(), e.prop10 && 'no value' != e.prop10 || (e.prop11 = '')), e.eVar32 = e.prop3 = e.getTimeParting('n', '-8'); + }, t._tpDST = { + 2012: '4/1,10/7', + 2013: '4/7,10/6', + 2014: '4/6,10/5', + 2015: '4/5,10/4', + 2016: '4/3,10/2', + 2017: '4/2,10/1', + 2018: '4/1,10/7', + 2019: '4/7,10/6', + 2020: '4/5,10/4', + 2021: '4/4,10/3' + }, t._tpDST = { + 2012: '3/11,11/4', + 2013: '3/10,11/3', + 2014: '3/9,11/2', + 2015: '3/8,11/1', + 2016: '3/13,11/6', + 2017: '3/12,11/5', + 2018: '3/11,11/4', + 2019: '3/10,11/3', + 2020: '3/8,11/1', + 2021: '3/14,11/7' + }, t._tpDST = { + 2012: '3/25,10/28', + 2013: '3/31,10/27', + 2014: '3/30,10/26', + 2015: '3/29,10/25', + 2016: '3/27,10/30', + 2017: '3/26,10/29', + 2018: '3/25,10/28', + 2019: '3/31,10/27', + 2020: '3/29,10/25', + 2021: '3/28,10/31' + }, t.getPreviousValue = new Function('v', 'c', 'el', 'var s=this,t=new Date,i,j,r=\'\';t.setTime(t.getTime()+1800000);if(el){if(s.events){i=s.split(el,\',\');j=s.split(s.events,\',\');for(x in i){for(y in j){if(i[x]==j[y]){if(s.c_r(c)) r=s.c_r(c);v?s.c_w(c,v,t):s.c_w(c,\'no value\',t);return r}}}}}else{if(s.c_r(c)) r=s.c_r(c);v?s.c_w(c,v,t):s.c_w(c,\'no value\',t);return r}'), t.split = new Function('l', 'd', 'var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x++]=l.substring(0,i);l=l.substring(i+d.length);}return a'), t.getPercentPageViewed = new Function('n', 'var s=this,W=window,EL=W.addEventListener,AE=W.attachEvent,E=[\'load\',\'unload\',\'scroll\',\'resize\',\'zoom\',\'keyup\',\'mouseup\',\'touchend\',\'orientationchange\',\'pan\'];W.s_Obj=s;s_PPVid=(n==\'-\'?s.pageName:n)||s.pageName||location.href;if(!W.s_PPVevent){s.s_PPVg=function(n,r){var k=\'s_ppv\',p=k+\'l\',c=s.c_r(n||r?k:p),a=c.indexOf(\',\')>-1?c.split(\',\',10):[\'\'],l=a.length,i;a[0]=unescape(a[0]);r=r||(n&&n!=a[0])||0;a.length=10;if(typeof a[0]!=\'string\')a[0]=\'\';for(i=1;i<10;i++)a[i]=!r&&i0&&b>0?M.round(C*b/h):0,O=W.orientation,o=!isNaN(O)?M.abs(o)%180:Y>X?0:90,L=e==\'load\'||s_PPVi<1,a=s.s_PPVg(s_PPVid,L),V=function(i,v,f,n){i=parseInt(typeof a==J&&a.length>i?a[i]:\'0\')||0;v=typeof v!=N?i:v;v=f||v>i?v:i;return n?v:v>C?C:v<0?0:v};if(new RegExp(\'(iPod|iPad|iPhone)\').exec(navigator.userAgent||\'\')&&o){o=x;x=y;y=o}o=o?\'P\':\'L\';a[9]=L?\'\':a[9].substring(0,1);s.c_w(\'s_ppv\',escape(W.s_PPVid)+\',\'+V(1,p,L)+\',\'+(L||!V(2)?p:V(2))+\',\'+V(3,b,L,1)+\',\'+X+\',\'+Y+\',\'+x+\',\'+y+\',\'+r+\',\'+a[9]+(a[9]==o?\'\':o))}if(!W.s_PPVt&&e!=\'unload\')W.s_PPVt=setTimeout(W.s_PPVevent,333)};for(var f=W.s_PPVevent,i=0;ids&&dde||d=12){U=\' PM\';H=H-12;}if(H==0){H=12;}D=da[D];tm=H+\':\'+M+U;return(tm+\'|\'+D);}'), t.getNewRepeat = new Function('d', 'cn', 'var s=this,e=new Date(),cval,sval,ct=e.getTime();d=d?d:30;cn=cn?cn:\'s_nr\';e.setTime(ct+d*24*60*60*1000);cval=s.c_r(cn);if(cval.length==0){s.c_w(cn,ct+\'-New\',e);return\'New\';}sval=s.split(cval,\'-\');if(ct-sval[0]<30*60*1000&&sval[1]==\'New\'){s.c_w(cn,ct+\'-New\',e);return\'New\';}else{s.c_w(cn,ct+\'-Repeat\',e);return\'Repeat\';}'), t.split = new Function('l', 'd', 'var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x++]=l.substring(0,i);l=l.substring(i+d.length);}return a'), t.getValOnce = new Function('v', 'c', 'e', 't', 'var s=this,a=new Date,v=v?v:\'\',c=c?c:\'s_gvo\',e=e?e:0,i=t==\'m\'?60000:86400000,k=s.c_r(c);if(v){a.setTime(a.getTime()+e*i);s.c_w(c,v,e==0?0:a);}return v==k?\'\':v'), t.apl = new Function('l', 'v', 'd', 'u', 'var s=this,m=0;if(!l)l=\'\';if(u){var i,n,a=s.split(l,d);for(i=0;i-1?t.substring(0,t.indexOf(\'#\')):t;}if(t)v+=v?d+t:t;p=p.substring(i==p.length?i:i+1)}return v'), t.p_gpv = new Function('k', 'u', 'var s=this,v=\'\',i=u.indexOf(\'?\'),q;if(k&&i>-1){q=u.substring(i+1);v=s.pt(q,\'&\',\'p_gvf\',k)}return v'), t.p_gvf = new Function('t', 'k', 'if(t){var s=this,i=t.indexOf(\'=\'),p=i<0?t:t.substring(0,i),v=i<0?\'True\':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s.epa(v)}return \'\''), t.getDaysSinceLastVisit = new Function('c', 'var s=this,e=new Date(),es=new Date(),cval,cval_s,cval_ss,ct=e.getTime(),day=24*60*60*1000,f1,f2,f3,f4,f5;e.setTime(ct+3*365*day);es.setTime(ct+30*60*1000);f0=\'Cookies Not Supported\';f1=\'First Visit\';f2=\'More than 30 days\';f3=\'More than 7 days\';f4=\'Less than 7 days\';f5=\'Less than 1 day\';cval=s.c_r(c);if(cval.length==0){s.c_w(c,ct,e);s.c_w(c+\'_s\',f1,es);}else{var d=ct-cval;if(d>30*60*1000){if(d>30*day){s.c_w(c,ct,e);s.c_w(c+\'_s\',f2,es);}else if(d<30*day+1 && d>7*day){s.c_w(c,ct,e);s.c_w(c+\'_s\',f3,es);}else if(d<7*day+1 && d>day){s.c_w(c,ct,e);s.c_w(c+\'_s\',f4,es);}else if(d ')), e) : c(e, t); + }; + }, ce = function (i) { + return function (e, t) { + if ('string' == typeof e) + i[arguments[0]] = t; + else if (arguments[0]) { + var n = arguments[0]; + for (var a in n) + i[a] = n[a]; + } + }; + }, le = setTimeout; + r.prototype['catch'] = function (e) { + return this.then(null, e); + }, r.prototype.then = function (e, t) { + var n = new this.constructor(a); + return s(this, new d(e, t, n)), n; + }, r.prototype['finally'] = n, r.all = function (t) { + return new r(function (i, r) { + function s(t, e) { + try { + if (e && ('object' == typeof e || 'function' == typeof e)) { + var n = e.then; + if ('function' == typeof n) + return void n.call(e, function (e) { + s(t, e); + }, r); + } + o[t] = e, 0 == --c && i(o); + } catch (a) { + r(a); + } + } + if (!l(t)) + return r(new TypeError('Promise.all accepts an array')); + var o = Array.prototype.slice.call(t); + if (0 === o.length) + return i([]); + for (var c = o.length, e = 0; e < o.length; e++) + s(e, o[e]); + }); + }, r.resolve = function (t) { + return t && 'object' == typeof t && t.constructor === r ? t : new r(function (e) { + e(t); + }); + }, r.reject = function (n) { + return new r(function (e, t) { + t(n); + }); + }, r.race = function (i) { + return new r(function (e, t) { + if (!l(i)) + return t(new TypeError('Promise.race accepts an array')); + for (var n = 0, a = i.length; n < a; n++) + r.resolve(i[n]).then(e, t); + }); + }, r._immediateFn = 'function' == typeof setImmediate && function (e) { + setImmediate(e); + } || function (e) { + le(e, 0); + }, r._unhandledRejectionFn = function wt(e) { + 'undefined' != typeof console && console && console.warn('Possible Unhandled Promise Rejection:', e); + }; + var ue = e(Object.freeze({ + __proto__: null, + 'default': r + })), de = 'undefined' != typeof window && window.Promise || void 0 !== A && A.Promise || ue['default'] || ue, pe = function (l, n, a) { + return function (o, t, c, e) { + return e.then(function () { + var r, s = o.delayNext; + return new de(function (e, t) { + var n = l(o, c, [c]); + if (!s) + return e(); + var a = o.timeout, i = new de(function (e, t) { + r = setTimeout(function () { + t(new Error('A timeout occurred because the action took longer than ' + a / 1000 + ' seconds to complete. ')); + }, a); + }); + de.race([ + n, + i + ]).then(e, t); + })['catch'](function (e) { + return clearTimeout(r), e = n(e), a(o, t, e), de.reject(e); + }).then(function () { + clearTimeout(r); + }); + }); + }; + }, fe = function (c, n, a, i, l) { + return function (s, t, o, e) { + return e.then(function () { + var r; + return new de(function (e, t) { + var n = c(s, o, [o]), a = s.timeout, i = new de(function (e, t) { + r = setTimeout(function () { + t(new Error('A timeout occurred because the condition took longer than ' + a / 1000 + ' seconds to complete. ')); + }, a); + }); + de.race([ + n, + i + ]).then(e, t); + })['catch'](function (e) { + return clearTimeout(r), e = n(e), i(s, t, e), de.reject(e); + }).then(function (e) { + if (clearTimeout(r), !a(s, e)) + return l(s, t), de.reject(); + }); + }); + }; + }, me = de.resolve(), ge = function (a, i, e) { + return function (t, n) { + return t.conditions && t.conditions.forEach(function (e) { + me = a(e, t, n, me); + }), t.actions && t.actions.forEach(function (e) { + me = i(e, t, n, me); + }), me = (me = me.then(function () { + e(t); + }))['catch'](function () { + }); + }; + }, be = function (e) { + return Boolean(e && 'object' == typeof e && 'function' == typeof e.then); + }, ve = function (s, o, c, l) { + return function (e, t) { + var n; + if (e.conditions) + for (var a = 0; a < e.conditions.length; a++) { + n = e.conditions[a]; + try { + var i = s(n, t, [t]); + if (be(i)) + throw new Error('Rule component sequencing must be enabled on the property for this condition to function properly.'); + if (!o(n, i)) + return c(n, e), !1; + } catch (r) { + return l(n, e, r), !1; + } + } + return !0; + }; + }, he = function (n, a) { + return function (e, t) { + n(e, t) && a(e, t); + }; + }, ye = function (n) { + return function (e) { + var t = n.getModuleDefinition(e.modulePath); + return t && t.displayName || e.modulePath; + }; + }, _e = function (i) { + return function (e) { + var t = e.rule, n = e.event, a = i.getModuleDefinition(n.modulePath).name; + return { + $type: i.getModuleExtensionName(n.modulePath) + '.' + a, + $rule: { + id: t.id, + name: t.name + } + }; + }; + }, Pe = function (o, c, l, u, d, p) { + return function (n, e) { + var a = e.rule, t = e.event; + t.settings = t.settings || {}; + try { + var i = d(e); + c(t, null, [function r(e) { + var t = l(i, e); + n(function () { + o(t, a); + }); + }]); + } catch (s) { + p.error(u(t, a, s)); + } + }; + }, Se = function (i, r, s, o) { + return function (e, t, n) { + var a = r(e); + s.error(i(a, t.name, n)), o('ruleActionFailed', { + rule: t, + action: e + }); + }; + }, Ce = function (i, r, s, o) { + return function (e, t, n) { + var a = r(e); + s.error(i(a, t.name, n)), o('ruleConditionFailed', { + rule: t, + condition: e + }); + }; + }, ke = function (a, i, r) { + return function (e, t) { + var n = a(e); + i.log('Condition "' + n + '" for rule "' + t.name + '" was not met.'), r('ruleConditionFailed', { + rule: t, + condition: e + }); + }; + }, je = function (t, n) { + return function (e) { + t.log('Rule "' + e.name + '" fired.'), n('ruleCompleted', { rule: e }); + }; + }, De = function (r, s, o) { + return function (e, t) { + var n; + if (e.actions) + for (var a = 0; a < e.actions.length; a++) { + n = e.actions[a]; + try { + r(n, t, [t]); + } catch (i) { + return void s(n, e, i); + } + } + o(e); + }; + }, we = function (n, a, i, r) { + return function (e, t) { + r('ruleTriggered', { rule: t }), n ? i(t, e) : a(t, e); + }; + }, Ve = function (e, t, n) { + return 'Failed to execute "' + e + '" for "' + t + '" rule. ' + n.message + (n.stack ? '\n' + n.stack : ''); + }, Ie = function (e, t) { + return t && !e.negate || !t && e.negate; + }, Te = [], Ee = !1, Oe = function (e) { + Ee ? e() : Te.push(e); + }, Ae = function (e, t, n) { + e(t).forEach(function (e) { + n(Oe, e); + }), Ee = !0, Te.forEach(function (e) { + e(); + }), Te = []; + }, Me = function (e) { + if (e || (e = new Error('The extension triggered an error, but no error information was provided.')), !(e instanceof Error)) { + var t = 'object' == typeof e ? JSON.stringify(e) : String(e); + e = new Error(t); + } + return e; + }, Le = Object.getOwnPropertySymbols, Ne = Object.prototype.hasOwnProperty, xe = Object.prototype.propertyIsEnumerable, Re = m() ? Object.assign : function (e) { + for (var t, n, a = f(e), i = 1; i < arguments.length; i++) { + for (var r in t = Object(arguments[i])) + Ne.call(t, r) && (a[r] = t[r]); + if (Le) { + n = Le(t); + for (var s = 0; s < n.length; s++) + xe.call(t, n[s]) && (a[n[s]] = t[n[s]]); + } + } + return a; + }, Fe = function (e, t) { + return Re(t = t || {}, e), t.hasOwnProperty('type') || Object.defineProperty(t, 'type', { + get: function () { + return O.deprecation('Accessing event.type in Adobe Launch has been deprecated and will be removed soon. Please use event.$type instead.'), t.$type; + } + }), t; + }, Be = function (c, l) { + return function (e, t) { + var n = c[e]; + if (n) { + var a = n.modules; + if (a) + for (var i = Object.keys(a), r = 0; r < i.length; r++) { + var s = i[r], o = a[s]; + if (o.shared && o.name === t) + return l.getModuleExports(s); + } + } + }; + }, Ue = function (e, t) { + return function () { + return t ? e(t) : {}; + }; + }, He = function (n, a) { + return function (e) { + if (a) { + var t = e.split('.'); + t.splice(t.length - 1 || 1, 0, 'min'), e = t.join('.'); + } + return n + e; + }; + }, ze = '.js', We = function (e) { + return e.substr(0, e.lastIndexOf('/')); + }, Je = function (e, t) { + return -1 !== e.indexOf(t, e.length - t.length); + }, qe = function (e, t) { + Je(t, ze) || (t += ze); + var n = t.split('/'), a = We(e).split('/'); + return n.forEach(function (e) { + e && '.' !== e && ('..' === e ? a.length && a.pop() : a.push(e)); + }), a.join('/'); + }, Ge = document, Ye = function (n, a) { + return new de(function (e, t) { + a.onload = function () { + e(a); + }, a.onerror = function () { + t(new Error('Failed to load script ' + n)); + }; + }); + }, Ke = function (e) { + var t = document.createElement('script'); + t.src = e, t.async = !0; + var n = Ye(e, t); + return document.getElementsByTagName('head')[0].appendChild(t), n; + }, Qe = function (e, t, n, a) { + t = t || '&', n = n || '='; + var i = {}; + if ('string' != typeof e || 0 === e.length) + return i; + var r = /\+/g; + e = e.split(t); + var s = 1000; + a && 'number' == typeof a.maxKeys && (s = a.maxKeys); + var o = e.length; + 0 < s && s < o && (o = s); + for (var c = 0; c < o; ++c) { + var l, u, d, p, f = e[c].replace(r, '%20'), m = f.indexOf(n); + 0 <= m ? (l = f.substr(0, m), u = f.substr(m + 1)) : (l = f, u = ''), d = decodeURIComponent(l), p = decodeURIComponent(u), g(i, d) ? Array.isArray(i[d]) ? i[d].push(p) : i[d] = [ + i[d], + p + ] : i[d] = p; + } + return i; + }, $e = function (e) { + switch (typeof e) { + case 'string': + return e; + case 'boolean': + return e ? 'true' : 'false'; + case 'number': + return isFinite(e) ? e : ''; + default: + return ''; + } + }, Xe = function (n, a, i, e) { + return a = a || '&', i = i || '=', null === n && (n = undefined), 'object' == typeof n ? Object.keys(n).map(function (e) { + var t = encodeURIComponent($e(e)) + i; + return Array.isArray(n[e]) ? n[e].map(function (e) { + return t + encodeURIComponent($e(e)); + }).join(a) : t + encodeURIComponent($e(n[e])); + }).join(a) : e ? encodeURIComponent($e(e)) + i + encodeURIComponent($e(n)) : ''; + }, Ze = t(function (e, t) { + t.decode = t.parse = Qe, t.encode = t.stringify = Xe; + }), et = '@adobe/reactor-', tt = { + cookie: L, + document: Ge, + 'load-script': Ke, + 'object-assign': Re, + promise: de, + 'query-string': { + parse: function (e) { + return 'string' == typeof e && (e = e.trim().replace(/^[?#&]/, '')), Ze.parse(e); + }, + stringify: function (e) { + return Ze.stringify(e); + } + }, + window: N + }, nt = function (a) { + return function (e) { + if (0 === e.indexOf(et)) { + var t = e.substr(et.length), n = tt[t]; + if (n) + return n; + } + if (0 === e.indexOf('./') || 0 === e.indexOf('../')) + return a(e); + throw new Error('Cannot resolve module "' + e + '".'); + }; + }, at = function (e, s, o, c, l) { + var u = e.extensions, d = e.buildInfo, p = e.property.settings; + if (u) { + var f = Be(u, s); + Object.keys(u).forEach(function (a) { + var i = u[a], e = Ue(c, i.settings); + if (i.modules) { + var t = O.createPrefixedLogger(i.displayName), n = He(i.hostedLibFilesBaseUrl, d.minified), r = { + buildInfo: d, + getDataElementValue: l, + getExtensionSettings: e, + getHostedLibFileUrl: n, + getSharedModule: f, + logger: t, + propertySettings: p, + replaceTokens: c, + onDebugChanged: o.onDebugChanged, + get debugEnabled() { + return o.getDebugEnabled(); + } + }; + Object.keys(i.modules).forEach(function (n) { + var e = i.modules[n], t = nt(function (e) { + var t = qe(n, e); + return s.getModuleExports(t); + }); + s.registerModule(n, e, a, t, r); + }); + } + }), s.hydrateCache(); + } + return s; + }, it = function (e, t, n, a, i) { + var r = O.createPrefixedLogger('Custom Script'); + e.track = function (e) { + O.log('"' + e + '" does not match any direct call identifiers.'); + }, e.getVisitorId = function () { + return null; + }, e.property = { name: t.property.name }, e.company = t.company, e.buildInfo = t.buildInfo, e.logger = r, e.notify = function (e, t) { + switch (O.deprecation('_satellite.notify is deprecated. Please use the `_satellite.logger` API.'), t) { + case 3: + r.info(e); + break; + case 4: + r.warn(e); + break; + case 5: + r.error(e); + break; + default: + r.log(e); + } + }, e.getVar = a, e.setVar = i, e.setCookie = function (e, t, n) { + var a = '', i = {}; + n && (a = ', { expires: ' + n + ' }', i.expires = n); + var r = '_satellite.setCookie is deprecated. Please use _satellite.cookie.set("' + e + '", "' + t + '"' + a + ').'; + O.deprecation(r), L.set(e, t, i); + }, e.readCookie = function (e) { + return O.deprecation('_satellite.readCookie is deprecated. Please use _satellite.cookie.get("' + e + '").'), L.get(e); + }, e.removeCookie = function (e) { + O.deprecation('_satellite.removeCookie is deprecated. Please use _satellite.cookie.remove("' + e + '").'), L.remove(e); + }, e.cookie = L, e.pageBottom = function () { + }, e.setDebug = n; + var s = !1; + Object.defineProperty(e, '_container', { + get: function () { + return s || (O.warn('_satellite._container may change at any time and should only be used for debugging.'), s = !0), t; + } + }); + }, rt = window._satellite; + if (rt && !window.__satelliteLoaded) { + window.__satelliteLoaded = !0; + var st = rt.container; + delete rt.container; + var ot = st.property.settings.undefinedVarsReturnEmpty, ct = st.property.settings.ruleComponentSequencingEnabled, lt = st.dataElements || {}; + Q.migrateCookieData(lt); + var ut, dt = function (e) { + return lt[e]; + }, pt = ie(), ft = X(pt, dt, function () { + return ut.apply(null, arguments); + }, ot), mt = {}, gt = ce(mt), bt = ne(mt, dt), vt = te(mt, dt, ft); + ut = oe(bt, vt, ot); + var ht = h(R('localStorage'), O); + it(rt, st, ht.setDebugEnabled, vt, gt), at(st, pt, ht, ut, ft); + var yt = se(rt), _t = _(pt, ut), Pt = ye(pt), St = ke(Pt, O, yt), Ct = Ce(Ve, Pt, O, yt), kt = Se(Ve, Pt, O, yt), jt = je(O, yt), Dt = Pe(we(ct, he(ve(_t, Ie, St, Ct), De(_t, kt, jt)), ge(fe(_t, Me, Ie, Ct, St), pe(_t, Me, kt), jt), yt), _t, Fe, Ve, _e(pt), O); + Ae(b, st.rules || [], Dt); + } + return rt; + } + console.warn('Adobe Launch is unsupported in IE 9 and below.'); + }(); + _satellite = $___var_21b30f8f70813a78; + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min.js b/resources/sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min.js new file mode 100644 index 00000000..624880f7 --- /dev/null +++ b/resources/sugarcoat-launch-ENfc3256407e714aa29bd08452ca5dead1.min.js @@ -0,0 +1,17174 @@ +var _satellite; +{ + const $___mock_06561c44cbd83c01 = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_06561c44cbd83c01); + const $___mock_94f8f25b959af6e1 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_94f8f25b959af6e1); + (function () { + !function () { + window._satellite = window._satellite || {}, window._satellite.container = { + buildInfo: { + minified: !0, + buildDate: '2021-07-15T18:20:42Z', + environment: 'production', + turbineBuildDate: '2021-04-26T16:54:28Z', + turbineVersion: '27.1.3' + }, + dataElements: { + t_sc_event0008: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '1' == _satellite.getVar('d_action_outcome'); + } + } + }, + d_marketing_channel: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return e && _satellite.getVar('f_getValOnce')(e._channel, 's_ch', 0); + } + } + }, + d_site_section3: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_page_name').split(':'); + if (2 < e.length) + return e[2]; + } + } + }, + t_sc_event0127: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '002-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + d_button_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_button_name'); + } + } + }, + d_marketing_channel_campaign: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return e && e._campaign; + } + } + }, + d_device_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_device_type'); + } + } + }, + d_external_tracking_code: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_queryORhash')([ + 'etcid', + 'ext', + 'utm_campaign' + ]); + } + } + }, + s_mobility_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oMOID']); + } + } + }, + s_language: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oLNG', + 's_language' + ]); + } + } + }, + s_action_state: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oAPT', + 's_oPGS', + 'oPGS', + 's_pageState' + ]); + } + } + }, + d_action_state: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_action_state'); + } + } + }, + d_internal_tracking_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_queryORhash')([ + 'itcid', + 'int' + ]); + } + } + }, + s_device_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_deviceType']); + } + } + }, + d_account_number: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_account_number'); + } + } + }, + f_upper_first: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + var t = function (e) { + return e.replace(/(&|&)/gi, '-').replace(/ /gi, ' ').replace(/_/gi, ' '); + }; + if (0 == e.length) + return ''; + if (e.length) { + for (temparr = e.toString().toLowerCase().split(':'), tempstr = '', i = 0; i < temparr.length; i++) + tempstr += temparr[i].substring(0, 1).toUpperCase() + t(temparr[i].substr(1)) + ':'; + return tempstr.substr(0, tempstr.length - 1); + } + return e; + }; + } + } + }, + s_benefit_category: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oMBC']); + } + } + }, + t_sc_event0045: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '951-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + d_previous_page_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = '__bda_prev_previouspagename', t = _satellite.getVar('d_page_name') || '', n = _satellite.cookie.get(e) || '', r = _satellite.getVar('f_getDomain'); + return n = decodeURIComponent(n), _satellite.getVar('d_is_page_view') ? (_satellite.cookie.set(e, t, { + SameSite: 'None', + domain: r, + secure: !0 + }), n) : ''; + } + } + }, + t_sc_event0002: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'server error' == _satellite.getVar('d_action_state') && '404' == _satellite.getVar('s_server_error_id'); + } + } + }, + s_bill_format: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oPLB']); + } + } + }, + s_newsletter_optin: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_newsOptin']); + } + } + }, + d_account_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_account_type'); + } + } + }, + t_sc_event0001: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_is_page_view'); + } + } + }, + s_social_link: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oSLK']); + } + } + }, + s_account_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oACT']); + } + } + }, + s_products: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_products', + 's_prod', + 's_oPRD', + 's_prodList' + ]); + } + } + }, + f_mid_truncate: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t, n) { + if (n = n || '...', (e = e || '').length <= t) + return e; + var r = t - n.length, a = Math.ceil(r / 2), o = Math.floor(r / 2); + return e.substr(0, a) + n + e.substr(e.length - o); + }; + } + } + }, + d_event_name_ga: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = '', t = ' ', n = _satellite.getVar('d_page_name'), r = _satellite.getVar('d_action_state'), a = _satellite.getVar('s_server_error_id'), o = _satellite.getVar('d_newsletter_optin'), i = _satellite.getVar('d_button_name'), s = _satellite.getVar('d_expand_name'), u = _satellite.getVar('d_search_results_count'), c = _satellite.getVar('d_failure_reason'), l = _satellite.getVar('d_login_cookie'), d = _satellite.getVar('queryStringParam'), f = _satellite.getVar('s_hug_eligibility_status'); + switch (/^(404|600)$/i.test(a) && 'server error' == r && (e += 'server_errors' + t), o && (e += 'news_optin' + t), (i || '647-0-0' == r) && (e += 'button_click' + t), s && (e += 'expand_section' + t), '0' == u ? e += 'internal_site_search_failure' + t : u && (e += 'internal_site_search_completed' + t), c && (e += 'form_errors' + t), 'true' == l && (e += 'login_success' + t), /find a store/i.test(n) && !r && (e += 'store_locator' + t), f && '458-1-0' == r && (e += 'hug_start' + t), 'Shop:Prepaid activation:Phone activation:Get started' == n && 'C01-1-0' == r && (e += 'phone_activation_started' + t), 'Internet:Order:Online user:Address qualified' == n && (e += 'checkout_internet_step1' + t), /^Internet:Order:Online user:(Productselection|Customer info:Not member)/i.test(n) && 'tv' !== d && (e += 'checkout_internet_step2' + t), /^Internet:Order:Online user:Personalinfo/i.test(n) && (e += 'checkout_internet_step3' + t), /^Internet:Order:Online user:Allset/i.test(n) && (e += 'checkout_internet_step4' + t), 'Internet:Order:Online user:Confirmation' == n && (e += 'purchase_internet' + t), /^Shop:Checkout:.*Personal details/i.test(n) && (e += 'checkout_mob_step1' + t), /^Shop:Checkout:.*Billing shipping details/i.test(n) && (e += 'checkout_mob_step2' + t), /^Shop:Checkout:.*Review/i.test(n) && (e += 'checkout_mob_step3' + t), /^Shop:Checkout:.*Confirmation/i.test(n) && (e += 'purchase_mob' + t), 'Tv:Order:Online user:Address qualified' == n && (e += 'checkout_tv_step1' + t), ('Tv:Order:Online user:Customer info:Not member' == n || 'Internet:Order:Online user:Productselection' == n && 'tv' == d) && (e += 'checkout_tv_step2' + t), /^Tv:Order:Online user:Basepackageselection/i.test(n) && (e += 'checkout_tv_step3' + t), /^Tv:Order:Online user:Addonsselection/i.test(n) && (e += 'checkout_tv_step4' + t), /^Tv:Order:Online user:Personalinfo/i.test(n) && (e += 'checkout_tv_step5' + t), /^Tv:Order:Online user:Allset/i.test(n) && (e += 'checkout_tv_step6' + t), 'Tv:Order:Online user:Confirmation' == n && (e += 'purchase_tv' + t), r) { + case '951-0-0': + e += 'chat_started' + t; + break; + case '953-1-0': + e += 'pre_chat_survey_started' + t; + break; + case '953-2-1': + e += 'pre_chat_survey_completed' + t; + break; + case '002-0-0': + e += 'captcha_display' + t; + break; + case '001-2-2': + e += 'login_failure' + t; + break; + case '001-1-0': + e += 'login_started' + t; + break; + case '458-2-1': + e += 'hug_completed' + t; + break; + case '104-0-0': + case '104-2-2': + e += 'lightbox_open' + t; + break; + case '458-2-1': + e += 'hug_completed' + t; + break; + case '548-1-0': + e += 'member_benefit_form_start' + t; + break; + case '548-2-1': + e += 'member_benefit_form_completed' + t; + break; + case '171-2-1': + e += 'registration_completed' + t; + break; + case '171-2-2': + e += 'registration_failure' + t; + break; + case 'addtocart': + e += 'ecom_add_to_cart' + t; + break; + case 'removefromcart': + e += 'ecom_remove_from_cart' + t; + break; + case 'productview': + e += 'ecom_pdp' + t; + break; + case '552-1-0': + e += 'top_up_card_started' + t; + break; + case '552-2-1': + e += 'top_up_card_completed' + t; + break; + case '552-2-2': + e += 'top_up_card_failure' + t; + break; + case 'C01-2-1': + e += 'phone_activation_completed' + t; + break; + case 'C01-2-2': + e += 'phone_activation_failure' + t; + } + return e.trim().split(t); + } + } + }, + d_device_availability: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_device_availability'); + } + } + }, + ga_dim17: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_mobility_type'); + } + } + }, + f_split: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t) { + for (var n, r = 0, a = new Array(); e;) + n = -1 < (n = e.indexOf(t)) ? n : e.length, a[r++] = e.substring(0, n), e = e.substring(n + t.length); + return a; + }; + } + } + }, + d_null_search_results: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_page_name'); + if (e && 'search' == e.toLowerCase() && '0' == _satellite.getVar('d_search_results_count')) + return 'D="null:"+c12'; + } + } + }, + t_sc_event0048: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_marketing_channel_campaign'); + } + } + }, + s_page_level_errors: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oPLE']); + } + } + }, + d_marketing_channel_stack: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return _satellite.getVar('f_crossVisitParticipation')(e._channel, 's_chs', 30, '7', '>'); + } + } + }, + s_failure_reason: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oARS', + 's_formErrors' + ]); + } + } + }, + ga_dim29: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_button_name'); + } + } + }, + s_event_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oEVN']); + } + } + }, + ga_dim38: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_error_class'); + } + } + }, + s_val1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['val1']); + } + } + }, + s_page_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = !_satellite.getVar('d_is_page_view'); + return _satellite.getVar('f_getValue')([ + 's_oPGN', + 's_pName' + ], e); + } + } + }, + d_page_name_optimized: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_page_name') + '(' + _satellite.getVar('d_language_province') + ')'; + } + } + }, + s_zip: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oCZI']), t = _satellite.getVar('f_getValue')(['s_addTrans']); + return e || t && t[6]; + } + } + }, + s_site_section1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = !_satellite.getVar('d_is_page_view'); + return _satellite.getVar('f_getValue')(['s_oSS1'], e); + } + } + }, + d_ga_property: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + window.location.host; + for (var e = 'UA-52328914-5', t = 'UA-52328914-6', n = 'virginmobile.ca,www.virginmobile.ca,myaccount.virginmobile.ca,www.myaccount.virginmobile.ca,moncompte.virginmobile.ca,www.moncompte.virginmobile.ca,web.virginmobile.ca,benefits.virginmobile.ca,virginplus.ca,www.virginplus.ca,myaccount.virginplus.ca,www.myaccount.virginplus.ca,moncompte.virginplus.ca,www.moncompte.virginplus.ca,web.virginplus.ca,benefits.virginplus.ca', r = '^(?!pfo|prd)\\w*-,127,fesb,wacuat,int'.split(','), a = 0; a < r.length; a++) + r[a] = '.*' + r[a] + '.*'; + var o = new RegExp(r.join('|'), 'i'), i = n.split(','); + for (a = 0; a < i.length; a++) + i[a] = '.*' + i[a] + '.*'; + var s = new RegExp(i.join('|'), 'i'); + return o.test(window.location.host) ? e : s.test(window.location.host) ? t : e; + } + } + }, + ga_dim4: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_site_section3'); + } + } + }, + s_error_class: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oERR_CLASS']); + } + } + }, + ga_dim64: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return navigator.userAgent; + } + } + }, + s_parameter: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oPRM'], !1); + } + } + }, + ga_dim61: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_external_tracking_code'); + } + } + }, + s_tealeaf_session_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oTELF']); + return e || ''; + } + } + }, + s_button_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oBTN']); + } + } + }, + d_accounts_settings: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return [{ + name: 'virgin', + prod_urls: [ + 'virginmobile.ca', + 'www.virginmobile.ca', + 'myaccount.virginmobile.ca', + 'www.myaccount.virginmobile.ca', + 'moncompte.virginmobile.ca', + 'www.moncompte.virginmobile.ca', + 'web.virginmobile.ca', + 'benefits.virginmobile.ca', + 'virginplus.ca', + 'www.virginplus.ca', + 'myaccount.virginplus.ca', + 'www.myaccount.virginplus.ca', + 'moncompte.virginplus.ca', + 'www.moncompte.virginplus.ca', + 'web.virginplus.ca', + 'benefits.virginplus.ca' + ], + dev_urls: [], + prod_rsid: 'virginmcaprod', + dev_rsid: 'virginmcaexistingdev' + }]; + } + } + }, + d_device_memory: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_device_memory'); + } + } + }, + s_flow_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_FlowType']); + } + } + }, + ga_dim30: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_tealeaf_session_id'); + } + } + }, + f_getValOnce: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t, n, r) { + var a = new Date(), o = (e = e || '', t = t || 's_gvo', n = n || 0, 'm' == r ? 60000 : 86400000), i = _satellite.cookie.get(t); + return i && (i = decodeURIComponent(i)), e && (a.setTime(a.getTime() + n * o), _satellite.cookie.set(t, encodeURIComponent(e), { expires: 0 == n ? 0 : a })), e == i ? '' : e; + }; + } + } + }, + t_sc_event0040: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'); + return _satellite.getVar('s_echat_available') || '950-0-0' == e || '952-0-0' == e; + } + } + }, + t_sc_event0052: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0004: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '1' == _satellite.getVar('d_action_type'); + } + } + }, + d_internal_domains: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_selected_account').domains || ''; + } + } + }, + s_val2: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['val2']); + } + } + }, + f_channelManager: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var T = _satellite.getVar('f_split'), x = _satellite.getVar('f_repl'), F = _satellite.getVar('f_getValOnce'), L = _satellite.getVar('f_gQP'), M = [ + 'google.,googlesyndication.com|q,as_q|Google', + 'yahoo.com,yahoo.co.jp|p,va|Yahoo!', + 'bing.com|q|Bing', + 'altavista.co,altavista.de|q,r|AltaVista', + '.aol.,suche.aolsvc.de|q,query|AOL', + 'ask.jp,ask.co|q,ask|Ask', + 'www.baidu.com|wd|Baidu', + 'daum.net,search.daum.net|q|Daum', + 'icqit.com|q|icq', + 'myway.com|searchfor|MyWay.com', + 'naver.com,search.naver.com|query|Naver', + 'netscape.com|query,search|Netscape Search', + 'reference.com|q|Reference.com', + 'seznam|w|Seznam.cz', + 'abcsok.no|q|Startsiden', + 'tiscali.it,www.tiscali.co.uk|key,query|Tiscali', + 'virgilio.it|qs|Virgilio', + 'yandex|text|Yandex.ru', + 'search.cnn.com|query|CNN Web Search', + 'search.earthlink.net|q|Earthlink Search', + 'search.comcast.net|q|Comcast Search', + 'search.rr.com|qs|RoadRunner Search', + 'optimum.net|q|Optimum Search' + ].join('>'), R = [].join('>'), N = [ + 'javascript:', + 'local', + 'vmcanada.com', + 'ges.bell.ca', + 'intranet.virginmobile.ca', + 'vld-src-cdn.virginmobile.ca', + 'int.bell.ca', + '172.18.54.109', + 'localhost', + 'virginmobile.ca', + 'virginmobilecanada.com', + 'indie.wearegrand.com', + 'sales.liveperson.net', + 'intranet.virginplus.ca', + 'vld-src-cdn.virginplus.ca', + 'virginplus.ca', + 'virginpluscanada.com' + ].join(','); + return function (e, t, n, r, a, o, i) { + var s, u, c, l, d, f, g, m, p, _, h, v, b, E, y, C, D, w, V, A, P, j, I, k, S = new Date(); + if (S.setTime(S.getTime() + 1800000), a && (1, _satellite.cookie.get(a) && 0, _satellite.cookie.set(a, 1, { expires: S }) || _satellite.cookie.set(a, 1, { expires: 0 }), _satellite.cookie.get(a) || 0, o && _satellite.cookie.get('s_tbm' + o) && 0), s = (s = document.referrer).toLowerCase()) + for (c = -1 < s.indexOf('?') ? s.indexOf('?') : s.length, l = s.substring(0, c), d = T(s, '/')[2].toLowerCase(), f = T(f = N, ','), g = 0; g < f.length && !(m = -1 == d.indexOf(f[g]) ? '' : s); g++); + else + u = 1; + if (!m && !u) + for (p = s, _ = h = d, v = 'Other Natural Referrers', b = M + '>' + R, 1 == r && (l = x(l, 'oogle', '%'), l = x(l, 'ahoo', '^'), s = x(s, 'as_q', '*')), E = T(b, '>'), y = 0; y < E.length; y++) { + for (C = E[y], C = T(C, '|'), D = T(C[0], ','), w = 0; w < D.length; w++) { + if (-1 < l.indexOf(D[w])) + for (V = C[2] ? h = C[2] : d, 1 == r && (V = x(V, '#', ' - '), s = x(s, '*', 'as_q'), V = x(V, '^', 'ahoo'), V = x(V, '%', 'oogle')), A = T(C[1], ','), P = 0; P < A.length && ((-1 < s.indexOf(A[P] + '=') || 0 == s.indexOf('https://www.google.')) && (j = 1), I = L(A[P], s).toLowerCase(), !j && !I); P++); + if (j || I) + break; + } + if (j || I) + break; + } + m && '1' == i || ((m = L(e, t)) && (h = m, v = V ? 'Paid Search' : 'Paid Non-Search'), !m && V && (h = V, v = 'Natural Search')), 1 != u || m || (p = _ = h = v = 'Typed/Bookmarked'), k = v ? m + _ + v + I : '', '0' != (n = n || 'c_m') && (k = F(k, n, 0)); + var O = ''; + return k && ((O = {})._campaignID = m || 'n/a', O._referrer = p || 'n/a', O._referringDomain = _ || 'n/a', O._campaign = h || 'n/a', O._channel = v || 'n/a', O._partner = V || 'n/a', O._keywords = j ? I || 'Keyword Unavailable' : 'n/a', o && 'Typed/Bookmarked' != v && S.setTime(S.getTime() + 86400000 * o)), O; + }; + } + } + }, + t_sc_event0035: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0017'); + } + } + }, + d_error_description: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_error_description'); + return e ? _satellite.getVar('f_remove_diacritics')(e) : ''; + } + } + }, + s_internet_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oINTT']); + } + } + }, + d_hug_stock_availability: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_hug_stock_availability'), t = _satellite.getVar('s_hug_order_status'); + if (e || t) + return 'hsa:' + e + '|hos:' + t; + } + } + }, + ga_dim3: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_site_section2'); + } + } + }, + f_crossVisitParticipation: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function (event) { + var join = _satellite.getVar('f_join'); + return function (v, cn, ex, ct, dl, ev) { + if (!v || '' == v) + return ''; + var arry = new Array(), a = new Array(), c = _satellite.cookie.get(cn); + c && (c = decodeURIComponent(c)); + var g = 0, h = new Array(); + c && '' != c && (arry = eval(c)), 0 < arry.length && arry[arry.length - 1][0] == v ? arry[arry.length - 1] = [ + v, + new Date().getTime() + ] : arry[arry.length] = [ + v, + new Date().getTime() + ], arry.splice(0, arry.length - ct); + var data = join(arry, { + delim: ',', + front: '[', + back: ']', + wrap: '\'' + }), start = arry.length - ct < 0 ? 0 : arry.length - ct; + _satellite.cookie.set(cn, encodeURIComponent(data), { expires: 1826 }); + for (var x = start; x < arry.length; x++) { + var diff = Math.round(new Date() - new Date(parseInt(arry[x][1]))) / 86400000; + diff < ex && (h[g] = arry[x][0], a[g++] = arry[x]); + } + var r = join(h, { delim: dl }); + return r; + }; + } + } + }, + s_server_error_id: { + defaultValue: '', + cleanText: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oEID', + 's_oERI', + 's_oERR', + 's_errorId' + ]); + } + } + }, + s_echat_survey_feedback: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCSF']); + } + } + }, + ga_dim23: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_page_name'); + } + } + }, + t_sc_linktext: { + defaultValue: 'custom link', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_upper_first'), t = _satellite.getVar('d_button_name'); + if (t) + return e(t); + var n = _satellite.getVar('d_expand_name'); + if (n) + return e(n); + var r = _satellite.getVar('d_tab_name'); + if (r) + return e(r); + var a = _satellite.getVar('d_social_link'); + if (a) + return a; + if (_satellite.getVar('s_carousel_banner_impression')) + return 'Iconp tiles impressions'; + if (_satellite.getVar('d_carousel_banner_click')) + return 'Iconp tile click'; + if (_satellite.getVar('d_page_level_errors')) + return 'page errors'; + switch (_satellite.getVar('d_action_id')) { + case '104': + return 'Lightbox open'; + case '878': + return 'phone detail color:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '879': + return 'phone detail memory:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '880': + return 'phone detail expands:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '913': + return 'phone term selected:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '914': + return 'phone financing option:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '915': + return 'phone plan selected:' + _satellite.getVar('s_products') + ':' + _satellite.getVar('s_parameter').toLowerCase(); + case '290': + return 'call in to get offer'; + } + switch (_satellite.getVar('d_action_state')) { + case '950-0-0': + return 'eChat:950:Button status:Ready'; + case '951-0-0': + return 'eChat:951:Button click'; + case '953-1-0': + return 'eChat:953:Survey start'; + case '953-2-1': + return 'eChat:953:Survey end'; + case '955-0-0': + return 'eChat:955:Chat started'; + case 'blogfilter': + return 'ML blog filter'; + case '002-0-0': + return 'CAPTCHA display'; + case '012-2-1': + return 'Virginmobile:Generic:Removevirginaccount'; + case '252-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit name confirmation'; + case '020-2-1': + return 'Virginmobile:Generic:Myprofile:Myservices:Edit service nickname'; + case '022-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit email confirmation'; + case '029-2-1': + return 'Virginmobile:Mobile:Makepayment:Confirmation'; + case '017-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit username confirmation'; + case '016-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit password confirmation'; + case '024-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit secret questions confirmation'; + case '047-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit recovery mobile number confirmation'; + case '026-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit recovery email address confirmation'; + case '515-2-1': + return 'Virginmobile:Generic:Myprofile:Details:Edit marketing preferences'; + case '018-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit nickname confirmation'; + case '136-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit address confirmation'; + case '149-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit authorized contact confirmation'; + case '160-2-1': + return 'Virginmobile:Generic:Preauthorizedsignup:Confirmation'; + case '253-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit bill language confirmation'; + case '263-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit mobile agreement language'; + case '333-2-1': + return 'Virginmobile:Generic:Myprofile:Billing:Edit bill format'; + default: + return 'Custom link'; + } + } + } + }, + d_bill_format: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_bill_format'); + } + } + }, + s_sms_preferences: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_SMSpref']); + } + } + }, + s_lightbox_content: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oLBC']); + } + } + }, + s_device_availability: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_availability']); + } + } + }, + d_expand_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_expand_name'); + } + } + }, + s_captcha_risk_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCRSK']); + } + } + }, + d_action_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'), t = []; + return e && (t = e.split('-')), 0 < t.length ? e.split('-')[0] : ''; + } + } + }, + t_sc_event0012: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0005'); + } + } + }, + d_event_map_ga: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = [], t = { + lightbox_open: { + event_category: 'lightbox', + event_action: _satellite.getVar('ga_dim20'), + event_label: _satellite.getVar('ga_dim19') + }, + chat_started: { + event_category: 'chat', + event_action: 'click to chat', + event_label: _satellite.getVar('ga_dim23') + }, + pre_chat_survey_started: { + event_category: 'chat', + event_action: 'start pre-chat survey', + event_label: _satellite.getVar('ga_dim23') + }, + pre_chat_survey_completed: { + event_category: 'chat', + event_action: 'complete pre-chat survey', + event_label: _satellite.getVar('ga_dim23') + }, + button_click: { + event_category: 'button clicks', + event_action: _satellite.getVar('d_button_name'), + event_label: _satellite.getVar('d_page_name') + }, + login_started: { + event_category: 'login', + event_action: 'start login flow', + event_label: _satellite.getVar('ga_dim23') + }, + login_success: { + event_category: 'login', + event_action: 'complete login flow', + event_label: _satellite.getVar('ga_dim23') + }, + login_failure: { + event_category: 'login', + event_action: 'fail: ' + _satellite.getVar('ga_dim35'), + event_label: _satellite.getVar('ga_dim23') + }, + registration_start: { + event_category: 'registration', + event_action: 'start registration flow', + event_label: _satellite.getVar('ga_dim23') + }, + registration_completed: { + event_category: 'registration', + event_action: 'complete registration flow', + event_label: _satellite.getVar('ga_dim23') + }, + registration_failure: { + event_category: 'registration', + event_action: 'fail: ' + _satellite.getVar('ga_dim35'), + event_label: _satellite.getVar('ga_dim23') + }, + internal_site_search_completed: { + event_category: 'internal site search', + event_action: 'search completed', + event_label: _satellite.getVar('ga_dim11') + }, + internal_site_search_failure: { + event_category: 'internal site search', + event_action: 'search failed', + event_label: _satellite.getVar('ga_dim11') + }, + captcha_display: { + event_category: 'captcha', + event_action: 'encountered captcha', + event_label: _satellite.getVar('ga_dim23') + }, + hug_start: { + event_category: 'hug', + event_action: 'HUG flow started', + event_label: _satellite.getVar('ga_dim23') + }, + hug_completed: { + event_category: 'hug', + event_action: 'HUG flow completed', + event_label: _satellite.getVar('ga_dim23') + }, + server_errors: { + event_category: 'server error pages', + event_action: 'error ' + _satellite.getVar('ga_dim23') + ':' + _satellite.getVar('d_page_url_no_params'), + event_label: _satellite.getVar('ga_dim46') + }, + store_locator: { + event_category: 'store locator', + event_action: 'visited store locator', + event_label: _satellite.getVar('ga_dim45') + }, + expand_section: { + event_category: 'expand', + event_action: _satellite.getVar('ga_dim52'), + event_label: _satellite.getVar('ga_dim23') + }, + form_errors: { + event_category: 'form errors', + event_action: 'error: ' + _satellite.getVar('d_failure_reason'), + event_label: _satellite.getVar('ga_dim23') + }, + news_optin: { + event_category: 'newsletter', + event_action: 'newsletter optin', + event_label: _satellite.getVar('ga_dim23') + }, + member_benefit_form_start: { + event_category: 'member benefits', + event_action: 'get offer form started', + event_label: _satellite.getVar('ga_dim23') + }, + member_benefit_form_completed: { + event_category: 'member benefits', + event_action: 'get offer form completed', + event_label: _satellite.getVar('ga_dim23') + }, + top_up_card_started: { + event_category: 'top up', + event_action: 'top up card started', + event_label: _satellite.getVar('ga_dim23') + }, + top_up_card_completed: { + event_category: 'top up', + event_action: 'top up card completed', + event_label: _satellite.getVar('ga_dim23') + }, + top_up_card_failure: { + event_category: 'top up', + event_action: 'fail: ' + _satellite.getVar('ga_dim35'), + event_label: _satellite.getVar('ga_dim23') + }, + phone_activation_started: { + event_category: 'activation prepaid', + event_action: 'activation started', + event_label: _satellite.getVar('ga_dim23') + }, + phone_activation_completed: { + event_category: 'activation prepaid', + event_action: 'activation completed', + event_label: _satellite.getVar('ga_dim23') + }, + phone_activation_failure: { + event_category: 'activation prepaid', + event_action: 'fail: ' + _satellite.getVar('ga_dim35'), + event_label: _satellite.getVar('ga_dim23') + }, + ecom_pdp: { + event_category: 'ecommerce', + event_action: 'product detail view', + event_label: '{{id}}: {{name}}' + }, + ecom_add_to_cart: { + event_category: 'ecommerce', + event_action: 'add to cart', + event_label: '{{id}}: {{name}}' + }, + ecom_remove_from_cart: { + event_category: 'ecommerce', + event_action: 'remove from cart', + event_label: '{{id}}: {{name}}' + }, + checkout_internet_step1: { + event_category: 'ecommerce', + event_action: 'checkout internet', + event_label: 'step1| {{id}}: {{name}}', + checkout_step: 1, + checkout_option: 'internet' + }, + checkout_internet_step2: { + event_category: 'ecommerce', + event_action: 'checkout internet', + event_label: 'step2| {{id}}: {{name}}', + checkout_step: 2, + checkout_option: 'internet' + }, + checkout_internet_step3: { + event_category: 'ecommerce', + event_action: 'checkout internet', + event_label: 'step3| {{id}}: {{name}}', + checkout_step: 3, + checkout_option: 'internet' + }, + checkout_internet_step4: { + event_category: 'ecommerce', + event_action: 'checkout internet', + event_label: 'step4| {{id}}: {{name}}', + checkout_step: 4, + checkout_option: 'internet' + }, + purchase_internet: { + event_category: 'ecommerce', + event_action: 'purchase internet', + event_label: _satellite.getVar('d_transaction_ID') + }, + checkout_mob_step1: { + event_category: 'ecommerce', + event_action: 'checkout mobility', + event_label: 'step1| {{id}}: {{name}}', + checkout_step: 1, + checkout_option: 'mobility' + }, + checkout_mob_step2: { + event_category: 'ecommerce', + event_action: 'checkout mobility', + event_label: 'step2| {{id}}: {{name}}', + checkout_step: 2, + checkout_option: 'mobility' + }, + checkout_mob_step3: { + event_category: 'ecommerce', + event_action: 'checkout mobility', + event_label: 'step3| {{id}}: {{name}}', + checkout_step: 3, + checkout_option: 'mobility' + }, + purchase_mob: { + event_category: 'ecommerce', + event_action: 'purchase mobility', + event_label: _satellite.getVar('d_transaction_ID') + }, + checkout_tv_step1: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step1| {{id}}: {{name}}', + checkout_step: 1, + checkout_option: 'tv' + }, + checkout_tv_step2: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step2| {{id}}: {{name}}', + checkout_step: 2, + checkout_option: 'tv' + }, + checkout_tv_step3: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step3| {{id}}: {{name}}', + checkout_step: 3, + checkout_option: 'tv' + }, + checkout_tv_step4: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step4| {{id}}: {{name}}', + checkout_step: 4, + checkout_option: 'tv' + }, + checkout_tv_step5: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step5| {{id}}: {{name}}', + checkout_step: 5, + checkout_option: 'tv' + }, + checkout_tv_step6: { + event_category: 'ecommerce', + event_action: 'checkout tv', + event_label: 'step6| {{id}}: {{name}}', + checkout_step: 6, + checkout_option: 'tv' + }, + purchase_tv: { + event_category: 'ecommerce', + event_action: 'purchase tv', + event_label: _satellite.getVar('d_transaction_ID') + } + }, n = _satellite.getVar('d_event_name_ga'); + if (n.length) { + for (var r = 0; r < n.length; r++) { + var a = [n[r]]; + 'object' == typeof t[a] && t[a].event_category && e.push(t[a]); + } + return e; + } + return ''; + } + } + }, + s_site_section2: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = !_satellite.getVar('d_is_page_view'); + return _satellite.getVar('f_getValue')(['s_oSS2'], e); + } + } + }, + s_internet_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oIID']); + } + } + }, + d_site_section1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_page_name').split(':'); + if (0 < e.length) + return e[0]; + } + } + }, + d_marketing_channel_keywords: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return e && _satellite.getVar('f_getValOnce')(e._keywords, 's_k', 0); + } + } + }, + s_registration_invalid_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['sREID']); + } + } + }, + s_bell_user_profile: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oBUP']); + } + } + }, + d_products_ga: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products') || [], t = [], n = _satellite.getVar('d_action_state'), r = _satellite.getVar('s_val1'); + if ('addtocart' != n && 'removefromcart' != n || !r || (e = r), 'string' == typeof e && e.match(/^(\w|\d)+\-(\w|\d)+$/gi) && (e = [{ sku: e }]), 'string' != typeof e || e.match(/^(\w|\d)+\-(\w|\d)+$/gi)) + for (l = 0; l < e.length; l++) { + if ('undefined' == typeof (f = e[l]).category && (f.category = ''), 'undefined' == typeof f.name ? f.name = '' : -1 != f.name.toLowerCase().indexOf('current service') && (f.name = ''), 'undefined' != typeof f.sku && 'null' != f.sku && null != f.sku || (f.sku = ''), f.sku = f.sku ? f.sku : (f.category ? f.category + '-' : '') + f.name, f.id = f.sku, 'undefined' == typeof f.quantity) + f.quantity = ''; + else { + var a = parseInt(f.quantity); + f.quantity = 'number' == typeof a && !isNaN(a) && 0 < a ? a : ''; + } + if ('undefined' == typeof f.charge_monthly) + f.charge_monthly = 0; + else { + var o = parseFloat(f.charge_monthly); + f.charge_monthly = 'number' != typeof o || isNaN(o) ? 0 : o; + } + if ('undefined' == typeof f.charge_onetime) + f.charge_onetime = 0; + else { + o = parseFloat(f.charge_onetime); + f.charge_onetime = 'number' != typeof o || isNaN(o) ? 0 : o; + } + var i = 1; + f.revenue = parseFloat(f.charge_onetime) + parseFloat(f.charge_monthly) * i, f.revenue = 0 < f.revenue ? f.revenue : '', f.price = 'number' != typeof f.revenue || isNaN(f.revenue) ? 0 : f.revenue, t.push(f); + } + else { + for (var s = e.split(','), u = [], c = [ + 'name', + 'id', + 'quantity', + 'price' + ], l = 0; l < s.length; l++) { + var d = s[l].split(';'); + u.push(d); + } + for (var l = 0; l < u.length; l++) { + for (var f = {}, g = 0; g < u[l].length; g++) + f[c[g]] = u[l][g]; + t.push(f); + } + t.forEach(function (e) { + e.revenue = e.quantity * e.price; + }); + } + return t; + } + } + }, + t_sc_prodView: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'productview' == _satellite.getVar('d_action_state'); + } + } + }, + ga_dim46: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = document.referrer; + return e || 'No Referrer'; + } + } + }, + s_RTUD_reason_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oRTU']); + } + } + }, + f_ecomLabel: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + var o = '{{', i = '}}', s = e.event_label, t = _satellite.getVar('d_transaction_ID'); + if (s !== t) { + var u = e.items.length - 1, c = ' | ', l = ''; + e.items.forEach(function (e, t) { + var n = s; + for (var r in e) { + var a = o + r + i; + s.match(a) && (n = n.replace(a, e[r])); + } + l += n, t < u && (console.log('pipe'), l += c); + }), e.event_label = l; + } else + e.event_label = t; + return e; + }; + } + } + }, + s_subscriber_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oSUB']); + } + } + }, + s_plan_features: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_planFeature']); + } + } + }, + s_server_time: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oESTT']); + } + } + }, + s_echat_available: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_chatAvailable']); + } + } + }, + d_visitor_time_parting: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = function (e, t, n) { + var r = new Date('1/1/2000'), a = 15, o = 8; + if (6 != r.getDay() || 0 != r.getMonth()) + return 'Data Not Available'; + t = parseInt(t), '2009' == n && (a = 8, o = 1); + var i = a - new Date('3/1/' + n).getDay(), s = o - new Date('11/1/' + n).getDay(), u = new Date('3/' + i + '/' + n), c = new Date('11/' + s + '/' + n), l = new Date(); + u < l && l < c ? t += 1 : t = t; + var d = l.getTime() + 60000 * l.getTimezoneOffset(), f = new Date(d + 3600000 * t), g = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday' + ]; + if (f.getFullYear() != n) + return 'Data Not Available'; + var m = f.getHours(), p = f.getMinutes(), _ = f.getDay(), h = g[_], v = 'AM', b = 'Weekday', E = '00'; + return 15 < p && p < 30 && (E = '15'), 30 < p && p < 45 && (E = '30'), 45 < p && p < 60 && (E = '45'), 12 <= m && (v = 'PM', m -= 12), 0 == m && (m = 12), 6 != _ && 0 != _ || (b = 'Weekend'), 'h' == e ? m + ':' + E + v : 'd' == e ? h : 'w' == e ? b : void 0; + }, t = '-5', n = new Date().getFullYear(); + return e('d', t, n) + '-' + e('h', t, n); + } + } + }, + t_sc_event0007: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_scRemove'); + } + } + }, + ga_dim26: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_internal_tracking_code'); + } + } + }, + d_transaction_ID: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_transaction_ID'); + } + } + }, + s_profile_identification_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oPIT']); + } + } + }, + d_val2: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_val2'); + } + } + }, + d_tab_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_tab_name'); + } + } + }, + d_mobility_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_mobility_type'); + } + } + }, + t_sc_scAdd: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'addtocart' == _satellite.getVar('d_action_state'); + } + } + }, + ga_dim65: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_hug_stock_availability'); + } + } + }, + s_article_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oARN']); + } + } + }, + d_article_info: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_article_name'), t = _satellite.getVar('s_article_date'); + if (e || t) + return e + ':' + t; + } + } + }, + s_plan_level: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_planLevel']); + } + } + }, + d_failure_reason: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_failure_reason'); + } + } + }, + s_site_section3: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = !_satellite.getVar('d_is_page_view'); + return _satellite.getVar('f_getValue')(['s_oSS3'], e); + } + } + }, + f_remove_diacritics: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + var t; + e = (e = '' + e).replace(/<[^>]*>/g, ''), t || (t = [ + { + b: 'A', + l: /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g + }, + { + b: 'AA', + l: /[\uA732]/g + }, + { + b: 'AE', + l: /[\u00C6\u01FC\u01E2]/g + }, + { + b: 'AO', + l: /[\uA734]/g + }, + { + b: 'AU', + l: /[\uA736]/g + }, + { + b: 'AV', + l: /[\uA738\uA73A]/g + }, + { + b: 'AY', + l: /[\uA73C]/g + }, + { + b: 'B', + l: /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g + }, + { + b: 'C', + l: /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g + }, + { + b: 'D', + l: /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g + }, + { + b: 'DZ', + l: /[\u01F1\u01C4]/g + }, + { + b: 'Dz', + l: /[\u01F2\u01C5]/g + }, + { + b: 'E', + l: /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g + }, + { + b: 'F', + l: /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g + }, + { + b: 'G', + l: /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g + }, + { + b: 'H', + l: /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g + }, + { + b: 'I', + l: /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g + }, + { + b: 'J', + l: /[\u004A\u24BF\uFF2A\u0134\u0248]/g + }, + { + b: 'K', + l: /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g + }, + { + b: 'L', + l: /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g + }, + { + b: 'LJ', + l: /[\u01C7]/g + }, + { + b: 'Lj', + l: /[\u01C8]/g + }, + { + b: 'M', + l: /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g + }, + { + b: 'N', + l: /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g + }, + { + b: 'NJ', + l: /[\u01CA]/g + }, + { + b: 'Nj', + l: /[\u01CB]/g + }, + { + b: 'O', + l: /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g + }, + { + b: 'OI', + l: /[\u01A2]/g + }, + { + b: 'OO', + l: /[\uA74E]/g + }, + { + b: 'OU', + l: /[\u0222]/g + }, + { + b: 'P', + l: /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g + }, + { + b: 'Q', + l: /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g + }, + { + b: 'R', + l: /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g + }, + { + b: 'S', + l: /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g + }, + { + b: 'T', + l: /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g + }, + { + b: 'TZ', + l: /[\uA728]/g + }, + { + b: 'U', + l: /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g + }, + { + b: 'V', + l: /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g + }, + { + b: 'VY', + l: /[\uA760]/g + }, + { + b: 'W', + l: /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g + }, + { + b: 'X', + l: /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g + }, + { + b: 'Y', + l: /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g + }, + { + b: 'Z', + l: /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g + }, + { + b: 'a', + l: /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g + }, + { + b: 'aa', + l: /[\uA733]/g + }, + { + b: 'ae', + l: /[\u00E6\u01FD\u01E3]/g + }, + { + b: 'ao', + l: /[\uA735]/g + }, + { + b: 'au', + l: /[\uA737]/g + }, + { + b: 'av', + l: /[\uA739\uA73B]/g + }, + { + b: 'ay', + l: /[\uA73D]/g + }, + { + b: 'b', + l: /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g + }, + { + b: 'c', + l: /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g + }, + { + b: 'd', + l: /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g + }, + { + b: 'dz', + l: /[\u01F3\u01C6]/g + }, + { + b: 'e', + l: /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g + }, + { + b: 'f', + l: /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g + }, + { + b: 'g', + l: /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g + }, + { + b: 'h', + l: /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g + }, + { + b: 'hv', + l: /[\u0195]/g + }, + { + b: 'i', + l: /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g + }, + { + b: 'j', + l: /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g + }, + { + b: 'k', + l: /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g + }, + { + b: 'l', + l: /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g + }, + { + b: 'lj', + l: /[\u01C9]/g + }, + { + b: 'm', + l: /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g + }, + { + b: 'n', + l: /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g + }, + { + b: 'nj', + l: /[\u01CC]/g + }, + { + b: 'o', + l: /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g + }, + { + b: 'oi', + l: /[\u01A3]/g + }, + { + b: 'ou', + l: /[\u0223]/g + }, + { + b: 'oo', + l: /[\uA74F]/g + }, + { + b: 'p', + l: /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g + }, + { + b: 'q', + l: /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g + }, + { + b: 'r', + l: /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g + }, + { + b: 's', + l: /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g + }, + { + b: 't', + l: /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g + }, + { + b: 'tz', + l: /[\uA729]/g + }, + { + b: 'u', + l: /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g + }, + { + b: 'v', + l: /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g + }, + { + b: 'vy', + l: /[\uA761]/g + }, + { + b: 'w', + l: /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g + }, + { + b: 'x', + l: /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g + }, + { + b: 'y', + l: /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g + }, + { + b: 'z', + l: /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g + }, + { + b: '', + l: /[\u2122\u00AE]/g + } + ]); + for (var n = 0; n < t.length; n++) + e = e.replace(t[n].l, t[n].b); + return e = e.replace(/[^\w\s-\[\]:\,]|_/g, '').replace(/\s+/g, ' '); + }; + } + } + }, + ga_dim35: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_failure_reason'); + } + } + }, + s_device_memory: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_memory']); + } + } + }, + s_device_color: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_colour']); + } + } + }, + t_sc_list1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_sms_preferences'); + } + } + }, + s_content_selection: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_cosl']); + } + } + }, + f_getValue: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t) { + var n = _satellite.getVar('_params') || {}; + if ('object' == typeof e) { + for (var r = 0, a = e.length; r < a; r++) + if (n[e[r]] || '' == n[e[r]]) + return n[e[r]]; + for (r = 0, a = e.length; r < a; r++) + if (window[e[r]]) + return window[e[r]]; + if (!t) + return ''; + } + }; + } + } + }, + t_sc_event0153: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_max_exceeded_num'); + } + } + }, + ga_dim55: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_province'); + } + } + }, + d_adobe_rsid: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_selected_account').rsid; + } + } + }, + t_sc_event0013: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0006'); + } + } + }, + s_transaction_ID: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oPID']), t = _satellite.getVar('f_getValue')(['s_addTrans']); + return e || t && t[0]; + } + } + }, + s_error_description: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oERR_DESC']); + } + } + }, + t_sc_scRemove: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'removefromcart' == _satellite.getVar('d_action_state'); + } + } + }, + d_custom_link: { + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oAJC']); + return !0 === e && (e = 'true'), !1 === e && (e = 'false'), e || 'not defined'; + } + } + }, + d_site_section2: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_page_name').split(':'); + if (1 < e.length) + return e[1]; + } + } + }, + s_benefit_city: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oMBT']); + } + } + }, + t_sc_event0156: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_postoffer_mthly) + return e[t].dvc_postoffer_mthly; + } + } + }, + d_tealeaf_session_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_tealeaf_session_id'); + } + } + }, + d_echat_buttons: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_echat_buttons'); + } + } + }, + d_article_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_article_type'); + } + } + }, + s_echat_buttons: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_chat_buttons']); + } + } + }, + t_sc_event0005: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '2' == _satellite.getVar('d_action_type'); + } + } + }, + d_marketing_channel_campaign_stack: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return _satellite.getVar('f_crossVisitParticipation')(e._campaign, 's_cs', 30, '5', '>', ''); + } + } + }, + d_lightbox_pathing: { + defaultValue: 'D=pageName', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_id'), t = _satellite.getVar('s_lightbox_content'); + if ('104' == e && t) + return _satellite.getVar('f_remove_diacritics')(t); + } + } + }, + d_marketing_channel_keywords_stack: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_marketing_channel_manager'); + return _satellite.getVar('f_crossVisitParticipation')(e._keywords, 's_ks', 30, '7', '>'); + } + } + }, + d_internal_tracking_code_stack: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_internal_tracking_code'); + return _satellite.getVar('f_crossVisitParticipation')(e, 's_intcs', '0', '5', '>', ''); + } + } + }, + d_benefit_filters: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_benefit_category'), t = _satellite.getVar('s_benefit_city'), n = _satellite.getVar('f_upper_first'); + if (e || t) + return 'Benefit type: ' + n(e) + '|Benefit city: ' + n(t); + } + } + }, + d_client_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + var e = _satellite.getVar('d_page_name').toLowerCase(); + if (/(^Myaccount\:|^.+\:Myaccount\:|^Virginmobile\:)/i.test(e)) { + var t = _satellite.getVar('s_mobility_id'), n = _satellite.getVar('s_internet_id'), r = _satellite.getVar('s_registration_id'), a = _satellite.getVar('s_registration_invalid_id'), o = _satellite.getVar('s_tv_id'), i = _satellite.getVar('s_bid'), s = _satellite.getVar('d_action_id'), u = _satellite.getVar('f_getValue')(['s_oClientID']); + if (u && '685' === s) + return u; + if (t) + return 'M:' + t; + if (n) + return 'I:' + n; + if (o) + return 'T:' + o; + if (i) + return 'B:' + i; + if (r) + return 'R:' + r; + if (a) + return 'E:' + a; + } + } catch (c) { + console.log('Adobe Launch: Data element: d_client_id:error: ' + c); + } + } + } + }, + t_sc_event0006: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '0' == _satellite.getVar('d_action_type'); + } + } + }, + d_obj_dim_ga: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + for (var e = {}, t = 1; t < 70; t++) { + var n = _satellite.getVar('ga_dim' + t); + n && (e['dimension' + t] = n); + } + return e.custom_map = { dimension9: 'clientId' }, e; + } + } + }, + s_login_user_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oUVA']); + } + } + }, + ga_dim45: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return document.URL; + } + } + }, + d_visitor_visit_number: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + function e() { + var e, t, n, r = Date.now(), a = 86400000, o = 's_vnum', i = 's_invisit', s = _satellite.getVar('f_getDomain'); + if ((e = _satellite.cookie.get(o) && decodeURIComponent(_satellite.cookie.get(o))) && (n = e.indexOf('&vn='), t = e.substring(n + 4, e.length)), _satellite.cookie.get(i) && decodeURIComponent(_satellite.cookie.get(i))) + return t ? (_satellite.cookie.set(i, encodeURIComponent('true'), { + domain: s, + secure: !0 + }), t) : 'unknown visit number'; + if (t) { + t++; + var u = e.substring(0, n), c = Math.round(Math.abs(u - r) / a); + return _satellite.cookie.set(o, encodeURIComponent(u + '&vn=' + t), { + expires: c, + domain: s, + secure: !0 + }), _satellite.cookie.set(i, encodeURIComponent('true'), { + domain: s, + secure: !0 + }), t; + } + return _satellite.cookie.set(o, encodeURIComponent(r + 30 * a + '&vn=1'), { + expires: 30, + domain: s, + secure: !0 + }), _satellite.cookie.set(i, encodeURIComponent('true'), { + domain: s, + secure: !0 + }), 1; + } + var t = e(); + return 25 < t ? '>25' : t; + } + } + }, + d_is_page_view: { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + var e = _satellite.getVar('s_is_pageview'); + if (void 0 !== e) { + if (!1 === e || 'false' === e) + return 'false'; + if (!0 === e || 'true' === e) { + if (_satellite.getVar('d_button_name') || _satellite.getVar('d_expand_name') || _satellite.getVar('d_tab_name') || _satellite.getVar('d_social_link') || 'not defined' !== _satellite.getVar('d_custom_link') || _satellite.getVar('s_carousel_banner_impression') || _satellite.getVar('d_carousel_banner_click')) + return 'false'; + var t = _satellite.getVar('d_action_id'), n = [ + '048', + '104', + '131', + '132', + '140', + '148', + '169', + '177', + '257', + '260', + '290', + '344', + '409', + '459', + '421', + '467', + '468', + '469', + '470', + '471', + '472', + '474', + '475', + '489', + '606', + '607', + '608', + '609', + '616', + '618', + '655', + '658', + '685', + '719', + '781', + '878', + '879', + '880', + '913', + '914', + '915', + '950', + '951', + '953', + '955' + ]; + if (t) + for (var r = 0; r < n.length; r++) + if (n[r] == t) + return 'false'; + var a = _satellite.getVar('d_action_state').toLowerCase(), o = [ + 'chat', + 'pbe', + 'blogfilter', + 'customlink', + 'warnings', + 'addtocart', + 'removefromcart', + 'tooltip', + '012-2-1', + '016-2-1', + '017-2-1', + '018-2-1', + '020-2-1', + '022-2-1', + '024-2-1', + '026-2-1', + '029-2-1', + '047-2-1', + '136-2-1', + '149-2-1', + '252-2-1', + '253-2-1', + '263-2-1', + '324-2-1', + '333-2-1', + '515-2-1', + '012-2-2', + '016-2-2', + '017-2-2', + '018-2-2', + '020-2-2', + '022-2-2', + '024-2-2', + '026-2-2', + '029-2-2', + '047-2-2', + '136-2-2', + '149-2-2', + '252-2-2', + '253-2-2', + '263-2-2', + '324-2-2', + '333-2-2', + '515-2-2' + ]; + if (a) + for (r = 0; r < o.length; r++) + if (0 <= o[r].indexOf(a)) + return 'false'; + } + } + return 'true'; + } catch (i) { + console.log('Adobe Analytics: Data Element: d_is_page_view: error: ' + i); + } + } + } + }, + d_hes_client_profile: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_hug_eligibility_status'); + if (e) + return 'hes:' + e; + } + } + }, + s_echat_survey_answers: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCSA']); + } + } + }, + s_registration_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oRID']); + } + } + }, + d_action_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'); + if (0 < e.indexOf('-1-0') || 0 < e.indexOf('-2-1')) + switch (_satellite.getVar('d_action_id')) { + case 'C01': + return 'prepaid activation'; + case 'C07': + return 'postpaid purchase'; + case 'C09': + case '633': + case '133': + case '134': + case '940': + case '941': + return 'prepaid purchase'; + } + } + } + }, + t_sc_event0015: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0008'); + } + } + }, + s_article_date: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oARD']); + } + } + }, + d_marketing_channel_manager: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = ''; + return _satellite.getVar('_marketing_channel_manager') ? e = _satellite.getVar('_marketing_channel_manager') : (e = _satellite.getVar('f_channelManager')(_satellite.getVar('d_external_tracking_code')), _satellite.setVar('_marketing_channel_manager', e)), e; + } + } + }, + d_captcha_risk_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_captcha_risk_code'); + } + } + }, + s_tab_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oTTL']); + } + } + }, + s_session_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oSID']); + return e || ''; + } + } + }, + d_subscriber_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_page_name').toLowerCase().indexOf('myaccount') < 0 ? null : _satellite.getVar('s_subscriber_id'); + } + } + }, + ga_dim54: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_language'); + } + } + }, + d_survey_start_pathing: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'), t = _satellite.getVar('s_site_section1'), n = _satellite.getVar('s_site_section2'); + switch (e) { + case '953-1-0': + return t + ':' + n + ':echat:prechat:survey:started'; + case '953-2-1': + return t + ':' + n + ':echat:prechat:survey:submited'; + case '953-2-2': + return t + ':' + n + ':echat:not available'; + case '955-0-0': + return t + ':' + n + ':echat:echat launched'; + } + } + } + }, + s_max_exceeded_num: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oEXFL']); + } + } + }, + f_join: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var u = function (e, t) { + var n, r, a, o; + t && (n = t.front ? t.front : '', r = t.back ? t.back : '', a = t.delim ? t.delim : '', o = t.wrap ? t.wrap : ''); + for (var i = '', s = 0; s < e.length; s++) + 'object' == typeof e[s] ? i += u(e[s], t) : i += o + e[s] + o, s < e.length - 1 && (i += a); + return n + i + r; + }; + return u; + } + } + }, + d_page_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_upper_first'), t = _satellite.getVar('s_site_section1'), n = _satellite.getVar('s_site_section2'), r = _satellite.getVar('s_site_section3'), a = _satellite.getVar('s_page_name'), o = ':', i = []; + if (t && i.push(t), n && i.push(n), r && i.push(r), a && i.push(a), 0 == i.length && _satellite.getVar('d_is_page_view')) { + var s = window.location.pathname.substring(1); + i = (s = (s = (s = (s = s.replace('fr/', '')).replace('en/', '')).replace('.html', '')).replace('.do', '')).split('/'); + } + return e(i.join(o)); + } + } + }, + d_myaccount_search_term: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state') || ''; + return /(395)(\-2\-)(1|2)/.test(e) ? _satellite.getVar('s_search_terms') : ''; + } + } + }, + d_campaign_pathing: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = ''; + return e = _satellite.getVar('d_external_tracking_code') ? 'D=v0+"|E|"+pageName' : _satellite.getVar('d_search_term') ? 'D=c12+"|KW|"+pageName' : 'D=pageName', _satellite.getVar('d_internal_tracking_code') && (e = 'D=v6+"|I|"+' + e.replace('D=', '')), e; + } + } + }, + d_obj_ecom: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_event_dim_ga'); + if (void 0 !== e) { + var r = _satellite.getVar('d_products_ga'); + void 0 !== r && r.length && e.forEach(function (e) { + if (e.items = r, 0 === e.event_action.replace(/\s/g, '').indexOf('purchase')) { + var t = 0, n = _satellite.getVar('s_transaction_ID'); + r.forEach(function (e) { + t += e.revenue * e.quantity; + }), e.transaction_id = n, e.value = parseFloat(t), e.currency = 'CAD'; + } + _satellite.getVar('f_ecomLabel')(e); + }); + } + return e; + } + } + }, + ga_dim27: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_hug_eligibility_status'); + } + } + }, + s_captcha_challenge_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCACT']); + } + } + }, + s_server_date: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oESTD']); + } + } + }, + s_user_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_UserType']); + } + } + }, + d_profile_identification_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_profile_identification_type'); + } + } + }, + s_correlation_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCOID']); + } + } + }, + d_plan_level: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_plan_level'); + } + } + }, + t_sc_scCheckout: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'); + return 'C01-1-0' == e || 'C07-1-0' == e || 'C08-1-0' == e || 'C09-1-0' == e; + } + } + }, + s_home_page_campaign: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oHPC']); + } + } + }, + ga_dim57: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_home_page_campaign'); + } + } + }, + s_hug_eligibility_status: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oHES']); + } + } + }, + s_multi_line_offer_format: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oOFFT']); + } + } + }, + d_selected_account: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + for (var e = _satellite.getVar('d_accounts_settings'), t = window.location.host, n = 0; n < e.length; n++) { + var r = e[n].prod_urls, a = new RegExp('^(' + r.join('|') + ')$', 'i'), o = e[n].dev_urls, i = new RegExp('^(' + o.join('|') + ')$', 'i'), s = e[n].dev_rsid || 'XYZ_DEV_XYZ', u = 'dev'; + if (a.test(t) && e[n].prod_rsid && (s = e[n].prod_rsid, u = 'prod'), i.test(t) || a.test(t)) + return { + company: e[n].name, + env: u, + rsid: s, + initials: e[n].initials, + domains: [ + r.join(','), + o.join(',') + ].join(',') + }; + } + } catch (c) { + return console.log('SATELLITE Launch:dataElement:d_selected_account:' + c), 'd_selected_account'; + } + } + } + }, + d_device_filters: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_device_filters').replace(/[^\|]+:/g, ''); + } + } + }, + t_sc_event0010: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_scAdd'); + } + } + }, + d_social_link: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_social_link'); + } + } + }, + f_formatTimeStamp: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + if ('object' == typeof e) + return e.getFullYear() + '-' + _satellite.getVar('f_pad')(e.getMonth() + 1, 2) + '-' + _satellite.getVar('f_pad')(e.getDate(), 2) + ',' + _satellite.getVar('f_pad')(e.getHours(), 2) + ':' + _satellite.getVar('f_pad')(e.getMinutes(), 2) + ':' + _satellite.getVar('f_pad')(e.getSeconds(), 2) + '.' + _satellite.getVar('f_pad')(e.getMilliseconds(), 3); + }; + } + } + }, + s_tv_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oTVID']); + } + } + }, + d_home_page_campaign: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_home_page_campaign'), t = _satellite.getVar('d_language_province'), n = _satellite.getVar('d_user_type'), r = _satellite.getVar('d_visitor_visit_number'); + if (e && 'string' == typeof e) + return e.toLowerCase() + '|' + t + '|' + n + '|' + r; + } + } + }, + s_registration_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oSRG']); + } + } + }, + d_search_results_count: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_search_results_count'); + } + } + }, + ga_dim62: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('ga_dim63'); + } + } + }, + d_action_outcome: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'), t = []; + return e && (t = e.split('-')), 2 < t.length ? e.split('-')[2] : ''; + } + } + }, + ga_dim2: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('ga_dim1'); + } + } + }, + d_device_color: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_deviceColor'); + } + } + }, + s_hug_order_status: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oHOS']); + } + } + }, + ga_dim66: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('ga_dim61'); + } + } + }, + d_tracking_enabled: { + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_tracking_enabled') || 'not defined'; + return !0 === e && (e = 'true'), !1 === e && (e = 'false'), e; + } + } + }, + ga_dim52: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_expand_name'); + } + } + }, + d_bell_user_profile: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_bell_user_profile'); + } + } + }, + d_failure_reason_truncated: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_failure_reason'); + return _satellite.getVar('f_mid_truncate')(e, 255); + } + } + }, + t_sc_event0158: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_presoln_mthly) + return e[t].dvc_presoln_mthly; + } + } + }, + ga_dim20: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_id'), t = _satellite.getVar('s_parameter'); + return '104' == e && 0 == t.indexOf('open, ') ? (t = t.replace(/open, /g, ''), _satellite.getVar('f_remove_diacritics')(t)) : _satellite.getVar('ga_dim23'); + } + } + }, + d_newsletter_optin: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if (_satellite.getVar('s_newsletter_optin')) + return 'yes'; + } + } + }, + s_hug_stock_availability: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oHSA']); + } + } + }, + t_sc_event0161: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_ml_disc) + return e[t].dvc_ml_disc; + } + } + }, + s_search_results_count: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_SERcount']); + } + } + }, + s_echat_agent_details: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_chat_details']); + } + } + }, + d_login_status: { + defaultValue: 'false', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_login_status'); + if (1 == e || 'true' == e) + return 'true'; + } + } + }, + ga_dim51: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_visitor_time_parting'); + } + } + }, + t_sc_event0021: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_expand_name'); + } + } + }, + d_language_province: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_language'), t = _satellite.getVar('s_province'); + return e + (t ? '-' + t : ''); + } + } + }, + s_province: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oPRV', + 's_prov' + ]); + } + } + }, + s_carousel_banner_impression: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oLSTB']); + } + } + }, + d_order_details: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if (_satellite.getVar('t_sc_purchase')) { + var e = _satellite.getVar('d_zip') || 'n/a', t = _satellite.getVar('s_province') || 'n/a', n = _satellite.getVar('d_transaction_ID') || 'n/a'; + return [ + function (e) { + if ('n/a' == e) + return e; + var t = e.split(','), n = 0; + if (0 < t.length) + for (var r in t) { + var a = parseInt(t[r][2]), o = parseFloat(t[r][2]); + isNaN(a) || isNaN(o) || (n += a * o); + } + return n; + }(_satellite.getVar('d_products') || 'n/a'), + e, + t, + n + ].join(':'); + } + } + } + }, + t_sc_purchase: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_transaction_ID'); + } + } + }, + t_sc_event0152: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_hard_soft_stop_err'); + } + } + }, + d_captcha_reason_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_captcha_reason_code'); + } + } + }, + t_sc_event0150: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_carousel_banner_click'); + } + } + }, + t_sc_event0016: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0009'); + } + } + }, + d_flow_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_flow_type'); + } + } + }, + s_mobility_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oMOT']); + } + } + }, + d_page_level_errors: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + var e = _satellite.getVar('s_page_level_errors') || '', t = _satellite.getVar('f_remove_diacritics'); + return '685-2-2' == _satellite.getVar('d_action_state') && (e = 'RTUD:' + _satellite.getVar('s_RTUD_reason_code')), t(e); + } catch (n) { + console.log('Adobe Launch: Data Element: d_page_level_error: Error: ' + n); + } + } + } + }, + f_pad: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t) { + for (var n = e + ''; n.length < t;) + n = '0' + n; + return n; + }; + } + } + }, + d_event_dim_ga: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + for (var e = _satellite.getVar('d_event_map_ga'), t = _satellite.getVar('d_obj_dim_ga'), n = 0; n < e.length; n++) + for (var r in t) + e[n][r] = t[r]; + return e; + } + } + }, + d_product_revenue: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = 0; + if (t_prd = JSON.parse(JSON.stringify(_satellite.getVar('s_products'))), 'object' == typeof t_prd) { + for (var t = 0; t < t_prd.length; t++) + t_prd[t].charge_monthly || (t_prd[t].charge_monthly = 0), t_prd[t].charge_onetime || (t_prd[t].charge_onetime = 0), 0 < t_prd[t].promo_price ? t_prd[t].revenue = Math.round(t_prd[t].charge_onetime + t_prd[t].promo_price) : t_prd[t].revenue = Math.round(t_prd[t].charge_onetime + t_prd[t].charge_monthly), t_prd[t].total_revenue = t_prd[t].revenue * t_prd[t].quantity, e += t_prd[t].total_revenue; + return e; + } + } + } + }, + queryStringParam: { + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/queryStringParameter.js', + settings: { + name: 'subchannel', + caseInsensitive: !0 + } + }, + d_visitor_new_return: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + function e() { + var e, t = 86400000, n = Date.now(), r = _satellite.getVar('f_getDomain'); + if (!(e = _satellite.cookie.get('s_nr') && decodeURIComponent(_satellite.cookie.get('s_nr')))) + return _satellite.cookie.set('s_nr', encodeURIComponent(n), { + expires: 30, + domain: r, + secure: !0 + }), 'New'; + if (e && n - e < 1800000) + return _satellite.cookie.set('s_nr', encodeURIComponent(n), { + expires: 30, + domain: r, + secure: !0 + }), 'New'; + if (e < 1123916400001) { + var a = Math.round(Math.abs(e + 30 * t - n) / t); + return _satellite.cookie.set('s_nr', encodeURIComponent(n), { + expires: a, + domain: r, + secure: !0 + }), 'Repeat'; + } + return 'Repeat'; + } + return e(); + } + } + }, + d_tag_info: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + return 'LAUNCH[' + _satellite.buildInfo.environment + ' Published on: ' + _satellite.buildInfo.buildDate + ']'; + } catch (e) { + return console.log('SATELLITE LAUNCH:dataElement:d_tag_info:' + e), 'd_tag_info'; + } + } + } + }, + t_sc_event0029: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'Search' == _satellite.getVar('d_page_name'); + } + } + }, + ga_dim12: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_search_results_count'); + } + } + }, + d_captcha_challenge_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_captcha_challenge_type'); + } + } + }, + ga_dim8: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_article_name'); + } + } + }, + t_sc_event0159: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_postsoln_mthly) + return e[t].dvc_postsoln_mthly; + } + } + }, + ga_dim10: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_language_province'); + } + } + }, + t_sc_event0154: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_multi_line_offer_format'); + } + } + }, + t_sc_event0025: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_failure_reason'); + } + } + }, + s_search_term: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oSRT']) || '', t = _satellite.getVar('s_page_name'); + return t && 'search' == t.toLowerCase() && _satellite.getVar('f_gQP')('q') || e; + } + } + }, + 'd_failure_reason clean': { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return reason = _satellite.getVar('s_failure_reason') || '', _satellite.getVar('f_remove_diacritics')(reason) || ''; + } + } + }, + d_login_cookie: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = 'false', t = _satellite.getVar('ga_dim1'), n = (_satellite.getVar('d_action_state'), '__loggedinstatus'), r = _satellite.cookie.get(n), a = _satellite.getVar('f_getDomain'); + return void 0 !== r && '' != r || _satellite.cookie.set(n, t, { + domain: a, + secure: !0 + }), 'true' == t && 'false' == r ? (_satellite.cookie.set(n, t, { + domain: a, + secure: !0 + }), e = 'true') : (_satellite.cookie.set(n, t, { + domain: a, + secure: !0 + }), e = 'false'), e; + } + } + }, + s_captcha_reason_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCRSN']); + } + } + }, + d_user_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = 'sUType', t = _satellite.cookie.get(e), n = _satellite.getVar('s_user_type').toLowerCase(), r = _satellite.getVar('f_getDomain'); + if ('true' == _satellite.getVar('d_login_status') && (n = 'member'), 'm' == t || 'p' == t || 'r' == t) { + if ('m' == t) + return 'member'; + if ('p' == t) { + if ('prospects' == n || 'researcher' == n || 'potential purchaser' == n) + return 'potential purchaser'; + if ('member' == n) + return _satellite.cookie.set(e, 'm', { + expires: 90, + domain: r, + secure: !0 + }), 'member'; + } else if ('r' == t) { + if ('prospects' == n || 'researcher' == n || '' == n) + return 'researcher'; + if ('potential purchaser' == n) + return _satellite.cookie.set(e, 'p', { + expires: 90, + domain: r, + secure: !0 + }), 'potential purchaser'; + if ('member' == n) + return _satellite.cookie.set(e, 'm', { + expires: 90, + domain: r, + secure: !0 + }), 'member'; + } + } else { + if ('prospects' == n || 'researcher' == n || '' == n) + return _satellite.cookie.set(e, 'r', { + expires: 90, + domain: r, + secure: !0 + }), 'researcher'; + if ('potential purchaser' == n) + return _satellite.cookie.set(e, 'p', { + expires: 90, + domain: r, + secure: !0 + }), 'potential purchaser'; + if ('member' == n) + return _satellite.cookie.set(e, 'm', { + expires: 90, + domain: r, + secure: !0 + }), 'member'; + } + } + } + }, + d_echat_agent_details: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_echat_agent_details'); + } + } + }, + t_sc_event0003: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return 'server error' == _satellite.getVar('d_action_state') && '404' != _satellite.getVar('s_server_error_id') && '600' != _satellite.getVar('s_server_error_id'); + } + } + }, + f_repl: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t, n) { + for (var r = e.indexOf(t), a = n.length; e && 0 <= r;) + r = (e = e.substring(0, r) + n + e.substring(r + t.length)).indexOf(t, r + a); + return e; + }; + } + } + }, + t_sc_event0149: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_carousel_banner_impression'); + } + } + }, + s_tracking_enabled: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = 'boolean' == typeof s_oPTE && 0 == s_oPTE, t = 'string' == typeof s_oPTE && 'false' == s_oPTE; + return !e && !t; + } + } + }, + s_account_number: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oBAN']); + } + } + }, + s_article_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oART']); + } + } + }, + s_line_of_business: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oLOB']); + } + } + }, + t_sc_event0018: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_external_tracking_code'); + } + } + }, + d_sso_cookies: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + for (var e = [ + 'sso_loggedin', + 'sso_accountType', + 'sso_marketingID' + ], t = [], n = 0; n < e.length; n++) + t.push(_satellite.cookie.get(e[n])); + return t.join('|'); + } catch (r) { + console.log('Launch: data element: d_sso_cookies: error: ', r); + } + } + } + }, + t_sc_event0020: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_button_name'); + } + } + }, + s_bid: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oOBID']); + } + } + }, + d_carousel_banner_click: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_carousel_banner_click') || ''; + } + } + }, + ga_dim37: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_error_class'); + } + } + }, + d_event_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function (e) { + e = _satellite.getVar('s_event_name'); + return _satellite.getVar('f_upper_first')(e); + } + } + }, + ga_dim19: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_id'), t = _satellite.getVar('s_lightbox_content'); + return '104' == e && t ? _satellite.getVar('f_remove_diacritics')(t) : _satellite.getVar('ga_dim23'); + } + } + }, + d_plan_features: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_plan_features'); + } + } + }, + f_queryORhash: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + function t(e) { + var t = decodeURIComponent(window.location.hash).toLowerCase().match(new RegExp(e + '=([^&]*)', 'i')); + return t ? t[1] : null; + } + function n(e) { + var t = decodeURIComponent(window.location.search).toLowerCase().match(new RegExp(e + '=([^&]*)', 'i')); + return t ? t[1] : null; + } + for (var r = 0; r < e.length; r++) { + var a = e[r].toLowerCase(); + if (t(a)) + return t(a); + if (n(a)) + return n(a); + } + }; + } + } + }, + ga_dim15: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_action_state'); + } + } + }, + d_val1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_val1'); + } + } + }, + d_outputClientTime: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + return e = -5, t = _satellite.getVar('s_server_date'), n = _satellite.getVar('s_server_time'), r = new Date(), a = _satellite.getVar('f_formatTimeStamp')(r), 'number' == typeof e && (r = new Date(r.getTime() + 60000 * r.getTimezoneOffset() + 3600000 * e), a += t && n ? ',' + t + ',' + n : ',' + _satellite.getVar('f_formatTimeStamp')(r)), a; + } catch (o) { + console.log('DTM: Data element: d_outputClientTime: ' + o); + } + var e, t, n, r, a; + } + } + }, + t_sc_event0160: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_pymt_mthly) + return e[t].dvc_pymt_mthly; + } + } + }, + d_session_id: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_session_id'), t = _satellite.getVar('s_tealeaf_session_id'), n = e; + return /TLTIID_/i.test(t) || e && t && ((n = []).push(e), n.push(t), n = n.join(':')), n; + } + } + }, + d_payment_method: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_payment_method'); + } + } + }, + d_blog_filters: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + if ('blogfilter' == _satellite.getVar('d_action_state')) { + var e = _satellite.getVar('d_val1'), t = _satellite.getVar('d_val2'); + if (e || t) + return 'Category: ' + e + '|Date: ' + t; + } + } + } + }, + s_device_filters: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oFLT']); + } + } + }, + s_true: { + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return !0; + } + } + }, + d_products: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products') || [], t = _satellite.getVar('d_action_state'), n = _satellite.getVar('s_val1'); + 'addtocart' != t && 'removefromcart' != t || !n || (e = n), 'string' == typeof e && e.match(/^(\w|\d)+\-(\w|\d)+$/gi) && (e = [{ sku: e }]); + var r = []; + if ('string' != typeof e || e.match(/^(\w|\d)+\-(\w|\d)+$/gi)) + for (var a = 0; a < e.length; a++) { + var o = e[a]; + if ('undefined' == typeof o.category && (o.category = ''), 'undefined' == typeof o.name ? o.name = '' : -1 != o.name.toLowerCase().indexOf('current service') && (o.name = ''), 'undefined' != typeof o.sku && 'null' != o.sku && null != o.sku || (o.sku = ''), 'undefined' == typeof o.quantity) + o.quantity = ''; + else { + var i = parseInt(o.quantity); + o.quantity = 'number' == typeof i && !isNaN(i) && 0 < i ? i : ''; + } + if ('undefined' == typeof o.charge_monthly) + o.charge_monthly = 0; + else { + var s = parseFloat(o.charge_monthly); + o.charge_monthly = 'number' != typeof s || isNaN(s) ? 0 : s; + } + if ('undefined' == typeof o.charge_onetime) + o.charge_onetime = 0; + else { + s = parseFloat(o.charge_onetime); + o.charge_onetime = 'number' != typeof s || isNaN(s) ? 0 : s; + } + o.sku = o.sku ? o.sku : (o.category ? o.category + '-' : '') + o.name; + var u = 1; + o.revenue = o.charge_onetime + o.charge_monthly * u, o.revenue = 0 < o.revenue ? o.revenue : ''; + var c = o.dvc_preoffer_mthly ? parseFloat(o.dvc_preoffer_mthly) : 0; + o.dvc_preoffer_mthly = 'number' != typeof c || isNaN(c) ? 0 : c; + var l = o.dvc_postoffer_mthly ? parseFloat(o.dvc_postoffer_mthly) : 0; + o.dvc_postoffer_mthly = 'number' != typeof l || isNaN(l) ? 0 : l; + var d = o.dvc_total_disc ? parseFloat(o.dvc_total_disc) : 0; + o.dvc_total_disc = 'number' != typeof d || isNaN(d) ? 0 : d; + var f = o.dvc_presoln_mthly ? parseFloat(o.dvc_presoln_mthly) : 0; + o.dvc_presoln_mthly = 'number' != typeof f || isNaN(f) ? 0 : f; + var g = o.dvc_postsoln_mthly ? parseFloat(o.dvc_postsoln_mthly) : 0; + o.dvc_postsoln_mthly = 'number' != typeof g || isNaN(g) ? 0 : g; + var m = o.dvc_pymt_mthly ? parseFloat(o.dvc_pymt_mthly) : 0; + o.dvc_pymt_mthly = 'number' != typeof m || isNaN(m) ? 0 : m; + var p = o.dvc_ml_disc ? parseFloat(o.dvc_ml_disc) : 0; + o.dvc_ml_disc = 'number' != typeof p || isNaN(p) ? 0 : p, o.incre = [], '458-2-1' == t && (o.dvc_preoffer_mthly && o.incre.push('event155=' + o.dvc_preoffer_mthly), o.dvc_postoffer_mthly && o.incre.push('event156=' + o.dvc_postoffer_mthly), o.dvc_total_disc && o.incre.push('event157=' + o.dvc_total_disc), o.dvc_presoln_mthly && o.incre.push('event158=' + o.dvc_presoln_mthly), o.dvc_postsoln_mthly && o.incre.push('event159=' + o.dvc_postsoln_mthly), o.dvc_pymt_mthly && o.incre.push('event160=' + o.dvc_pymt_mthly), o.dvc_ml_disc && o.incre.push('event161=' + o.dvc_ml_disc), o.incre = o.incre.join('|')), o.merch = '', r.push([ + o.category, + o.sku, + o.quantity, + o.revenue, + o.incre, + o.merch + ].join(';')); + } + else + r = (e = _satellite.getVar('f_remove_diacritics_only')(e)).split(','); + if (r.length) + return r.join(','); + } + } + }, + f_gQP: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e, t) { + t = void 0 !== t ? t : window.location.href; + e = e.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var n = new RegExp('[\\?&]' + e + '=([^&#]*)', 'i').exec(t); + return null == n ? '' : decodeURIComponent(n[1].replace(/\+/g, ' ')); + }; + } + } + }, + t_sc_event0151: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_login_user_type'); + } + } + }, + ga_dim39: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_survey_start_pathing'); + } + } + }, + t_sc_event0157: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_total_disc) + return e[t].dvc_total_disc; + } + } + }, + s_launch_vs_dtm: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + location.href; + for (var e = document.querySelectorAll('script[src*=\'/satelliteLib-\']')[0], t = document.querySelectorAll('script[src*=\'/launch-\']')[0], n = document.querySelectorAll('script:not([src])'), r = e ? 'DTM' : t && 'Launch', a = e && e.async || t && t.async || !1, o = e && e.src || t && t.src || '', i = r + ' ' + (o.match(/staging|development/i) && o.match(/staging|development/i)[0] || '') + '|' + (a ? 'async' : 'sync'), s = 0; s < n.length; s++) + if (/^\s*_satellite\.pageBottom\(\)/m.test(n[s].text)) { + i += '|_satellite.pageBottom()'; + break; + } + return i; + } + } + }, + d_RTUD_reason_code: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_real_time_usage'); + } + } + }, + s_carousel_banner_click: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oCBTN']); + } + } + }, + d_action_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_state'), t = []; + return e && (t = e.split('-')), 1 < t.length ? e.split('-')[1] : ''; + } + } + }, + t_sc_event0009: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '2' == _satellite.getVar('d_action_outcome'); + } + } + }, + ga_dim25: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('ga_dim24'); + } + } + }, + s_hard_soft_stop_err: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oHSER']); + } + } + }, + f_remove_diacritics_only: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return function (e) { + var t; + e = '' + e, t || (t = [ + { + b: 'A', + l: /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g + }, + { + b: 'AA', + l: /[\uA732]/g + }, + { + b: 'AE', + l: /[\u00C6\u01FC\u01E2]/g + }, + { + b: 'AO', + l: /[\uA734]/g + }, + { + b: 'AU', + l: /[\uA736]/g + }, + { + b: 'AV', + l: /[\uA738\uA73A]/g + }, + { + b: 'AY', + l: /[\uA73C]/g + }, + { + b: 'B', + l: /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g + }, + { + b: 'C', + l: /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g + }, + { + b: 'D', + l: /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g + }, + { + b: 'DZ', + l: /[\u01F1\u01C4]/g + }, + { + b: 'Dz', + l: /[\u01F2\u01C5]/g + }, + { + b: 'E', + l: /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g + }, + { + b: 'F', + l: /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g + }, + { + b: 'G', + l: /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g + }, + { + b: 'H', + l: /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g + }, + { + b: 'I', + l: /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g + }, + { + b: 'J', + l: /[\u004A\u24BF\uFF2A\u0134\u0248]/g + }, + { + b: 'K', + l: /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g + }, + { + b: 'L', + l: /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g + }, + { + b: 'LJ', + l: /[\u01C7]/g + }, + { + b: 'Lj', + l: /[\u01C8]/g + }, + { + b: 'M', + l: /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g + }, + { + b: 'N', + l: /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g + }, + { + b: 'NJ', + l: /[\u01CA]/g + }, + { + b: 'Nj', + l: /[\u01CB]/g + }, + { + b: 'O', + l: /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g + }, + { + b: 'OI', + l: /[\u01A2]/g + }, + { + b: 'OO', + l: /[\uA74E]/g + }, + { + b: 'OU', + l: /[\u0222]/g + }, + { + b: 'P', + l: /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g + }, + { + b: 'Q', + l: /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g + }, + { + b: 'R', + l: /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g + }, + { + b: 'S', + l: /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g + }, + { + b: 'T', + l: /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g + }, + { + b: 'TZ', + l: /[\uA728]/g + }, + { + b: 'U', + l: /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g + }, + { + b: 'V', + l: /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g + }, + { + b: 'VY', + l: /[\uA760]/g + }, + { + b: 'W', + l: /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g + }, + { + b: 'X', + l: /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g + }, + { + b: 'Y', + l: /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g + }, + { + b: 'Z', + l: /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g + }, + { + b: 'a', + l: /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g + }, + { + b: 'aa', + l: /[\uA733]/g + }, + { + b: 'ae', + l: /[\u00E6\u01FD\u01E3]/g + }, + { + b: 'ao', + l: /[\uA735]/g + }, + { + b: 'au', + l: /[\uA737]/g + }, + { + b: 'av', + l: /[\uA739\uA73B]/g + }, + { + b: 'ay', + l: /[\uA73D]/g + }, + { + b: 'b', + l: /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g + }, + { + b: 'c', + l: /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g + }, + { + b: 'd', + l: /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g + }, + { + b: 'dz', + l: /[\u01F3\u01C6]/g + }, + { + b: 'e', + l: /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g + }, + { + b: 'f', + l: /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g + }, + { + b: 'g', + l: /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g + }, + { + b: 'h', + l: /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g + }, + { + b: 'hv', + l: /[\u0195]/g + }, + { + b: 'i', + l: /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g + }, + { + b: 'j', + l: /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g + }, + { + b: 'k', + l: /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g + }, + { + b: 'l', + l: /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g + }, + { + b: 'lj', + l: /[\u01C9]/g + }, + { + b: 'm', + l: /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g + }, + { + b: 'n', + l: /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g + }, + { + b: 'nj', + l: /[\u01CC]/g + }, + { + b: 'o', + l: /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g + }, + { + b: 'oi', + l: /[\u01A3]/g + }, + { + b: 'ou', + l: /[\u0223]/g + }, + { + b: 'oo', + l: /[\uA74F]/g + }, + { + b: 'p', + l: /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g + }, + { + b: 'q', + l: /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g + }, + { + b: 'r', + l: /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g + }, + { + b: 's', + l: /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g + }, + { + b: 't', + l: /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g + }, + { + b: 'tz', + l: /[\uA729]/g + }, + { + b: 'u', + l: /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g + }, + { + b: 'v', + l: /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g + }, + { + b: 'vy', + l: /[\uA761]/g + }, + { + b: 'w', + l: /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g + }, + { + b: 'x', + l: /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g + }, + { + b: 'y', + l: /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g + }, + { + b: 'z', + l: /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g + }, + { + b: '', + l: /[\u2122\u00AE]/g + } + ]); + for (var n = 0; n < t.length; n++) + e = e.replace(t[n].l, t[n].b); + return e; + }; + } + } + }, + d_lightbox_name: { + defaultValue: 'D=pageName', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('d_action_id'), t = _satellite.getVar('s_parameter'); + if ('104' == e && 0 == t.indexOf('open, ')) + return t = t.replace(/open, /g, ''), _satellite.getVar('f_remove_diacritics')(t); + } + } + }, + ga_dim11: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_search_term'); + } + } + }, + s_telco_provider: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_getValue')(['s_oTELP']); + return e || ''; + } + } + }, + ga_dim5: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_payment_method'); + } + } + }, + t_sc_event0024: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '0' == _satellite.getVar('d_search_results_count'); + } + } + }, + ga_dim1: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_login_status'); + } + } + }, + t_sc_event0155: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_products'); + if ('458-2-1' != _satellite.getVar('d_action_state') || !e) + return ''; + for (var t = 0; t < e.length; t++) + if (e[t].dvc_preoffer_mthly) + return e[t].dvc_preoffer_mthly; + } + } + }, + 'd_failure_reason_truncated clean': { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('f_remove_diacritics')(_satellite.getVar('d_failure_reason')) || ''; + return _satellite.getVar('f_mid_truncate')(e, 255); + } + } + }, + s_payment_method: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oPYM', + 's_payMethod' + ]); + } + } + }, + s_static_banner: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oDBAN']); + } + } + }, + s_custom_link: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oAJC']); + } + } + }, + d_registration_type: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_registration_type'); + } + } + }, + t_sc_event0046: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '955-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + s_expand_name: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oEPN']); + } + } + }, + s_login_status: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')([ + 's_oLGS', + 's_lS' + ]); + } + } + }, + d_error_class: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_error_class'); + return e ? _satellite.getVar('f_remove_diacritics')(e) : ''; + } + } + }, + d_server: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/javascriptVariable.js', + settings: { path: 'window.location.host' } + }, + d_plan_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_plan_type'); + } + } + }, + t_sc_list3: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oLSTB']); + } + } + }, + 'Adobe Target : Flicker Rules': { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return [ + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/home\/index.html([\?#].*)?$/i, + selector: '#big-daddy' + }, + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/plans\/postpaid.html([\?#].*)?$/i, + selector: '#masthead-subhead' + }, + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/support\/trade-in-phone.html([\?#].*)?$/i, + selector: 'body' + }, + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/hot-offers\/index.html([\?#].*)?$/i, + selector: '#shop-online2' + }, + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/phones\/phones-summary.html([\?#].*)?$/i, + selector: 'body' + }, + { + page: /^https:\/\/www.virginmobile.ca\/(en|fr)\/internet\/index.html([\?#].*)?$/i, + selector: '#masthead-subhead' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/home\/index.html([\?#].*)?$/i, + selector: '#big-daddy' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/plans\/postpaid.html([\?#].*)?$/i, + selector: '#masthead-subhead' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/support\/trade-in-phone.html([\?#].*)?$/i, + selector: 'body' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/hot-offers\/index.html([\?#].*)?$/i, + selector: '#shop-online2' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/phones\/phones-summary.html([\?#].*)?$/i, + selector: 'body' + }, + { + page: /^https:\/\/www.virginplus.ca\/(en|fr)\/internet\/index.html([\?#].*)?$/i, + selector: '#masthead-subhead' + } + ]; + } + } + }, + f_getDomain: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + try { + return document.location.hostname.match(/(\.\w+\.\w+)$/g).join(); + } catch (e) { + console.log('Launch: data element: f_getDomain: error: ' + e); + } + } + } + }, + ga_dim32: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_account_type'); + } + } + }, + ga_dim24: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_echat_agent_details'); + } + } + }, + ga_dim36: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_page_level_errors'); + } + } + }, + ga_dim63: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_tag_info'); + } + } + }, + d_echat_survey_answers: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + var e = _satellite.getVar('s_echat_survey_answers'), t = _satellite.getVar('s_echat_survey_feedback'); + if (e || t) + return e + ',' + t; + } + } + }, + t_sc_list2: { + defaultValue: '', + forceLowerCase: !0, + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oBCI']); + } + } + }, + s_plan_type: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_planType']); + } + } + }, + t_sc_event0011: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('t_sc_event0004'); + } + } + }, + d_search_term: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_myaccount_search_term') ? '' : _satellite.getVar('s_search_terms'); + } + } + }, + d_zip: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_zip'); + } + } + }, + d_content_selection: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('s_content_selection'); + } + } + }, + s_dtCookie: { + defaultValue: '', + modulePath: 'core/src/lib/dataElements/cookie.js', + settings: { name: 'dtCookie' } + }, + t_sc_event0017: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('d_newsletter_optin'); + } + } + }, + d_days_since_last_visit: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + function e(e) { + var t, n, r, a, o, i, s, u, c = Date.now(), l = 365, d = 86400000, f = _satellite.getVar('f_getDomain'); + if (f0 = 'Cookies Not Supported', a = 'First Visit', o = 'More than 30 days', i = 'More than 7 days', s = 'Less than 7 days', u = 'Less than 1 day', t = _satellite.cookie.get(e) && decodeURIComponent(_satellite.cookie.get(e))) { + var g = c - t; + 1800000 < g ? 30 * d < g ? (_satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), _satellite.cookie.set(e + '_s', encodeURIComponent(o), { + domain: f, + secure: !0 + })) : g < 30 * d + 1 && 7 * d < g ? (_satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), _satellite.cookie.set(e + '_s', encodeURIComponent(i), { + domain: f, + secure: !0 + })) : g < 7 * d + 1 && d < g ? (_satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), _satellite.cookie.set(e + '_s', encodeURIComponent(s), { + domain: f, + secure: !0 + })) : g < d + 1 && (_satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), _satellite.cookie.set(e, encodeURIComponent(u), { + domain: f, + secure: !0 + })) : (_satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), r = _satellite.cookie.get(e + '_s') && decodeURIComponent(_satellite.cookie.get(e + '_s')), _satellite.cookie.set(e + '_s', encodeURIComponent(r), { + domain: f, + secure: !0 + })); + } else + _satellite.cookie.set(e, encodeURIComponent(c), { + expires: l, + domain: f, + secure: !0 + }), _satellite.cookie.set(e + '_s', encodeURIComponent(a), { + domain: f, + secure: !0 + }); + return (n = _satellite.cookie.get(e + '_s') && decodeURIComponent(_satellite.cookie.get(e + '_s'))) ? n != a && n != o && n != i && n != s && n != u ? '' : n : f0; + } + return e('s_lv'); + } + } + }, + d_trackingServer: { + defaultValue: 'data0.virginmobile.ca', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return /virginplus\.ca$/i.test(location.hostname) ? 'data0.virginplus.ca' : 'data0.virginmobile.ca'; + } + } + }, + d_trackingServerSSL: { + defaultValue: 'data1.virginmobile.ca', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return /virginplus\.ca$/i.test(location.hostname) ? 'data1.virginplus.ca' : 'data1.virginmobile.ca'; + } + } + }, + t_sc_event0169: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '969-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0166: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '966-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0167: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '967-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0173: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '965-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + d_echat_evo: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return _satellite.getVar('f_getValue')(['s_oChat']); + } + } + }, + t_sc_event0168: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '968-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0171: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '971-0-0' == _satellite.getVar('d_action_state'); + } + } + }, + t_sc_event0170: { + defaultValue: '', + storageDuration: 'pageview', + modulePath: 'core/src/lib/dataElements/customCode.js', + settings: { + source: function () { + return '970-0-0' == _satellite.getVar('d_action_state'); + } + } + } + }, + extensions: { + 'adobe-target': { + displayName: 'Adobe Target', + modules: { + 'adobe-target/lib/addGlobalMboxParams.js': { + name: 'add-global-mbox-params', + displayName: 'Add Params to Global Mbox', + script: function (e, t, n) { + 'use strict'; + var r = n('./modules/mbox-params-store').mergeGlobalParams; + e.exports = function (e) { + r(e.mboxParams); + }; + } + }, + 'adobe-target/lib/loadTarget.js': { + name: 'load-target', + displayName: 'Load Target', + script: function (e, t, n, r) { + 'use strict'; + function a(n, e) { + return new u(function (t) { + n ? e.then(function (e) { + e && (n.abort = !0), t(); + }) : t(); + }); + } + function o(e) { + if (e) { + var t = new u(function (t) { + var n = setTimeout(function () { + t(!1); + }, v.targetSettings.timeout), r = function r(e) { + e.detail && !0 === e.detail.redirect ? t(!0) : t(!1), clearTimeout(n), m(s, e, r); + }, a = function a(e) { + t(!1), clearTimeout(n), m(s, e, a); + }; + g(s, E, r), g(s, y, a); + }); + e(function (e) { + return a(e, t); + }); + } + } + var i = n('@adobe/reactor-window'), s = n('@adobe/reactor-document'), u = n('@adobe/reactor-promise'), c = n('./modules/load-target-common'), l = c.initLibrarySettings, d = c.overridePublicApi, f = n('./modules/event-util'), g = f.addEventListener, m = f.removeEventListener, p = n('./modules/optin'), _ = p.shouldUseOptIn, h = p.isTargetApproved, v = n('./settings').extensionSettings, b = r.getSharedModule('adobe-analytics', 'augment-tracker'), E = 'at-request-succeeded', y = 'at-request-failed'; + e.exports = function () { + var e = l(); + e ? e.enabled ? ((0, n('./modules/libs/at-launch').init)(i, s, e), _() && !h() || o(b)) : d(i) : d(i); + }; + } + }, + 'adobe-target/lib/fireGlobalMbox.js': { + name: 'fire-global-mbox', + displayName: 'Fire Global Mbox', + script: function (e, t, n, r) { + 'use strict'; + function a() { + return o.adobe && o.adobe.target && o.adobe.target.VERSION; + } + var o = n('@adobe/reactor-window'), i = n('./modules/libs/at-launch'), s = i.initConfig, u = i.initGlobalMbox, c = n('./modules/global-mbox-common'), l = n('./messages'); + e.exports = function (e) { + var t = c(e); + a() ? (s(t), u()) : window.console && r.logger.warn(l.NO_GLOBAL_MBOX_REQUEST); + }; + } + }, + 'adobe-target/lib/modules/mbox-params-store.js': { + script: function (e, t, n) { + 'use strict'; + function i(e) { + return null != e.value && null != e.checked; + } + function r(a) { + var o = {}; + return Object.keys(a).forEach(function (e) { + var t = a[e]; + if (i(t)) { + var n = t.checked, r = t.value; + n && '' === r || (o[e] = r); + } else + o[e] = t; + }), o; + } + function a(e) { + var t = r(e); + c(l, t); + } + function o(e) { + var t = r(e); + c(d, t); + } + function s() { + return l; + } + function u() { + return d; + } + var c = n('./object-override-util'), l = {}, d = {}; + e.exports = { + mergeParams: a, + mergeGlobalParams: o, + getParams: s, + getGlobalParams: u + }; + } + }, + 'adobe-target/lib/modules/object-override-util.js': { + script: function (e) { + 'use strict'; + function r(e, t, n, r) { + t[n] !== r && (e[n] = t[n]); + } + function a(e) { + return !Array.isArray(this.subset) || -1 !== this.subset.indexOf(e); + } + e.exports = function (t, n, e) { + Object.keys(n).filter(a, { subset: e }).forEach(function (e) { + r(t, n, e); + }); + }; + } + }, + 'adobe-target/lib/modules/load-target-common.js': { + script: function (e, t, n, r) { + 'use strict'; + function a(e) { + var t = e.compatMode, n = e.documentMode; + return t && 'CSS1Compat' === t && (!n || 9 <= n); + } + function o() { + } + function i(e) { + e.adobe = e.adobe || {}, e.adobe.target = { + VERSION: '', + event: {}, + init: o, + getOffer: o, + applyOffer: o, + trackEvent: o, + registerExtension: o + }, e.mboxCreate = o, e.mboxDefine = o, e.mboxUpdate = o; + } + function s() { + return c.adobe && c.adobe.target && 'undefined' != typeof c.adobe.target.getOffer; + } + function u() { + return s() ? (r.logger.warn(d.ALREADY_INITIALIZED), null) : (h.mboxParams = g(), h.globalMboxParams = m(), p(h, c.targetGlobalSettings || {}, [ + 'clientCode', + 'serverDomain', + 'cookieDomain', + 'crossDomain', + 'timeout', + 'visitorApiTimeout', + 'enabled', + 'defaultContentHiddenStyle', + 'defaultContentVisibleStyle', + 'bodyHidingEnabled', + 'bodyHiddenStyle', + 'imsOrgId', + 'overrideMboxEdgeServer', + 'overrideMboxEdgeServerTimeout', + 'optoutEnabled', + 'secureOnly', + 'supplementalDataIdParamTimeout', + 'authoringScriptUrl', + 'urlSizeLimit' + ]), p(h, _ || {}, ['version']), a(l) || (h.enabled = !1, r.logger.warn(d.DELIVERY_DISABLED)), h); + } + var c = n('@adobe/reactor-window'), l = n('@adobe/reactor-document'), d = n('../messages'), f = n('./mbox-params-store'), g = f.getParams, m = f.getGlobalParams, p = n('./object-override-util'), _ = n('../librarySettings').TARGET_DEFAULT_SETTINGS, h = n('../settings').targetSettings; + e.exports = { + initLibrarySettings: u, + overridePublicApi: i + }; + } + }, + 'adobe-target/lib/modules/event-util.js': { + script: function (e) { + 'use strict'; + function t(e, t, n) { + e.addEventListener(t, n); + } + function n(e, t, n) { + e.removeEventListener(t, n); + } + e.exports = { + addEventListener: t, + removeEventListener: n + }; + } + }, + 'adobe-target/lib/modules/optin.js': { + script: function (e, t, n) { + 'use strict'; + function r(e) { + return 'undefined' === (void 0 === e ? 'undefined' : l(e)) || null === e; + } + function a(e) { + var t = void 0 === e ? 'undefined' : l(e); + return null !== e && ('object' === t || 'function' === t); + } + function o(e) { + return a(e[h]) && a(e[m]); + } + function i(e, t) { + return !!t && (!r(e) && (!r(e[_]) && o(e[_]))); + } + function s(e, t) { + return e[m](t); + } + function u() { + var e = g[_]; + return s(e, e[v][b]); + } + function c() { + var e = f.targetSettings[p]; + return i(g, e); + } + var l = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + }, d = n('@adobe/reactor-window'), f = n('../settings').extensionSettings, g = d.adobe, m = 'isApproved', p = 'optinEnabled', _ = 'optIn', h = 'fetchPermissions', v = 'Categories', b = 'TARGET'; + e.exports = { + shouldUseOptIn: c, + isTargetApproved: u + }; + } + }, + 'adobe-target/lib/settings.js': { + script: function (e, t, n, r) { + 'use strict'; + var a = r.getExtensionSettings(), o = a.targetSettings || {}; + e.exports = { + extensionSettings: a, + targetSettings: o + }; + } + }, + 'adobe-target/lib/modules/libs/at-launch.js': { + script: function (e, t, n) { + 'use strict'; + function r(e) { + return e && 'object' == typeof e && 'default' in e ? e['default'] : e; + } + function a(e) { + return Zs.call(e); + } + function o(e) { + return a(e); + } + function s(e) { + var t = void 0 === e ? 'undefined' : eu(e); + return null != e && ('object' === t || 'function' === t); + } + function u(e) { + return !!s(e) && o(e) === tu; + } + function g(e, t) { + var n = 1 < arguments.length && t !== undefined ? arguments[1] : 0; + return u(e) ? setTimeout(e, Number(n) || 0) : -1; + } + function i(e) { + var t = 0 < arguments.length && e !== undefined ? arguments[0] : -1; + -1 !== t && clearTimeout(t); + } + function d(e) { + return null == e; + } + function c(e) { + return e; + } + function l(e) { + return u(e) ? e : c; + } + function f(e) { + return d(e) ? [] : Object.keys(e); + } + function m(e, t) { + return d(t) ? [] : (nu(t) ? ou : iu)(l(e), t); + } + function p(e) { + return e && e.length ? e[0] : undefined; + } + function _(e) { + return d(e) ? [] : [].concat.apply([], e); + } + function h(o) { + for (var i = this, s = o ? o.length : 0, e = s; e -= 1;) + if (!u(o[e])) + throw new TypeError('Expected a function'); + return function () { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + for (var r = 0, a = s ? o[r].apply(i, t) : t[0]; (r += 1) < s;) + a = o[r].call(i, a); + return a; + }; + } + function v(e, t) { + d(t) || (nu(t) ? ru : au)(l(e), t); + } + function b(e) { + return null != e && 'object' === (void 0 === e ? 'undefined' : eu(e)); + } + function E(e) { + return 'string' == typeof e || !nu(e) && b(e) && o(e) === su; + } + function y(e) { + if (!E(e)) + return -1; + for (var t = 0, n = e.length, r = 0; r < n; r += 1) + t = (t << 5) - t + e.charCodeAt(r) & 4294967295; + return t; + } + function C(e) { + return 'number' == typeof e && -1 < e && e % 1 == 0 && e <= uu; + } + function D(e) { + return null != e && C(e.length) && !u(e); + } + function w(e, t) { + return cu(function (e) { + return t[e]; + }, e); + } + function V(e) { + for (var t = 0, n = e.length, r = Array(n); t < n;) + r[t] = e[t], t += 1; + return r; + } + function A(e) { + return e.split(''); + } + function P(e) { + return d(e) ? [] : D(e) ? E(e) ? A(e) : V(e) : w(f(e), e); + } + function j(e) { + if (null == e) + return !0; + if (D(e) && (nu(e) || E(e) || u(e.splice))) + return !e.length; + for (var t in e) + if (lu.call(e, t)) + return !1; + return !0; + } + function I(e) { + return d(e) ? '' : du.call(e); + } + function k(e) { + return E(e) ? !I(e) : j(e); + } + function S(e) { + return Object.getPrototypeOf(Object(e)); + } + function O(e) { + if (!b(e) || o(e) !== fu) + return !1; + var t = S(e); + if (null === t) + return !0; + var n = _u.call(t, 'constructor') && t.constructor; + return 'function' == typeof n && n instanceof n && pu.call(n) === hu; + } + function T(e) { + return b(e) && 1 === e.nodeType && !O(e); + } + function x(e) { + return 'number' == typeof e || b(e) && o(e) === bu; + } + function F(e, t) { + return d(t) ? [] : (nu(t) ? cu : Eu)(l(e), t); + } + function L() { + } + function M() { + return new Date().getTime(); + } + function R(e, t, n) { + return d(n) ? t : (nu(n) ? yu : Cu)(l(e), t, n); + } + function N(e) { + return null == e ? e : Du.call(e); + } + function B(e, t) { + return k(t) ? [] : t.split(e); + } + function U(e, t) { + return e + Math.floor(Math.random() * (t - e + 1)); + } + function q() { + var n = M(); + return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (e) { + var t = (n + U(0, 16)) % 16 | 0; + return n = Math.floor(n / 16), ('x' === e ? t : 3 & t | 8).toString(16); + }); + } + function H(e) { + return If.test(e); + } + function G(e) { + if (H(e)) + return e; + var t = N(B('.', e)), n = t.length; + return 3 <= n && kf.test(t[1]) ? t[2] + '.' + t[1] + '.' + t[0] : 1 === n ? t[0] : t[1] + '.' + t[0]; + } + function W(t, n) { + t.enabled && v(function (e) { + d(n[e]) || (t[e] = n[e]); + }, Tf); + } + function z(e) { + var t = e.documentMode; + return !t || 10 <= t; + } + function $(e) { + var t = e.compatMode; + return t && 'CSS1Compat' === t; + } + function Y(e, t, n) { + var r = ''; + e.location.protocol === Sf || (r = G(e.location.hostname)), n[jd] = r, n[nd] = $(t) && z(t), W(n, e[mf] || {}); + } + function J(e) { + Y($s, Ys, e); + var t = $s.location.protocol === Sf; + (Of = zs({}, e))[pd] = e[pd] / 1000, Of[_d] = e[_d] / 1000, Of[Vd] = 'x-only' === Of[id], Of[Ad] = 'disabled' !== Of[id], Of[Pd] = Of[Cd] || t ? 'https:' : ''; + } + function Q() { + return Of; + } + function K(e) { + try { + return decodeURIComponent(e); + } catch (t) { + return e; + } + } + function X(e) { + try { + return encodeURIComponent(e); + } catch (t) { + return e; + } + } + function Z(e) { + if (Bf[e]) + return Bf[e]; + Nf.href = e; + var t = Mf(Nf.href); + return t.queryKey = Rf(t.query), Bf[e] = t, Bf[e]; + } + function ee(e, t, n) { + return { + name: e, + value: t, + expires: n + }; + } + function te(e) { + var t = B('#', e); + return j(t) || t.length < 3 ? null : isNaN(parseInt(t[2], 10)) ? null : ee(K(t[0]), K(t[1]), Number(t[2])); + } + function ne(e) { + return k(e) ? [] : B('|', e); + } + function re() { + var e = F(te, ne(xf(td))), t = Math.ceil(M() / 1000), n = function n(e) { + return s(e) && t <= e.expires; + }; + return R(function (e, t) { + return e[t.name] = t, e; + }, {}, m(n, e)); + } + function ae(e) { + var t = re()[e]; + return s(t) ? t.value : ''; + } + function oe(e) { + return [ + X(e.name), + X(e.value), + e.expires + ].join('#'); + } + function ie(e) { + return e.expires; + } + function se(e) { + var t = F(ie, e); + return Math.max.apply(null, t); + } + function ue(e, t) { + var n = P(e), r = Math.abs(1000 * se(n) - M()), a = F(oe, n).join('|'), o = new Date(M() + r); + Ff(td, a, { + domain: t, + expires: o + }); + } + function ce(e) { + var t = e.name, n = e.value, r = e.expires, a = e.domain, o = re(); + o[t] = ee(t, n, Math.ceil(r + M() / 1000)), ue(o, a); + } + function le(e) { + return vu(xf(e)); + } + function de(e, t) { + var n = e.location.search, r = Rf(n); + return vu(r[t]); + } + function fe(e, t) { + var n = Z(e.referrer).queryKey; + return !d(n) && vu(n[t]); + } + function ge(e, t, n) { + return le(n) || de(e, n) || fe(t, n); + } + function me() { + var e = Q()[jd]; + Ff(_c, hc, { domain: e }); + var t = xf(_c) === hc; + return Lf(_c), t; + } + function pe() { + return ge($s, Ys, mc); + } + function _e() { + var e = Q(), t = e[nd]; + return e[Vd] ? t && !pe() : t && me() && !pe(); + } + function he() { + return ge($s, Ys, gc); + } + function ve() { + return ge($s, Ys, pc); + } + function be(e, t) { + var n = e.console; + return !d(n) && u(n[t]); + } + function Ee(e, t) { + var n = e.console; + be(e, 'warn') && n.warn.apply(n, [qf].concat(t)); + } + function ye(e, t) { + var n = e.console; + be(e, 'debug') && he() && n.debug.apply(n, [qf].concat(t)); + } + function Ce() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + Ee($s, t); + } + function De() { + for (var e = arguments.length, t = Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + ye($s, t); + } + function we(n) { + return R(function (e, t) { + return e[t] = n[t], e; + }, {}, Gf); + } + function Ve(e, t, n) { + var r = e[gf] || []; + if (n) { + var a = r.push; + r[ld] = Hf, r[lf] = we(t), r[df] = [], r[ff] = [], r.push = function o(e) { + r[ff].push(e), a.call(this, e); + }; + } + e[gf] = r; + } + function Ae(e, t, n, r) { + if (t) { + var a = {}; + a[hf] = M(), e[gf][n].push(zs(a, r)); + } + } + function Pe() { + Ve($s, Q(), he()); + } + function je(e, t) { + Ae($s, he(), e, t); + } + function Ie() { + var e = {}; + return e[Ol] = !0, e; + } + function ke(e) { + var t = {}; + return t[Ol] = !1, t[Il] = e, t; + } + function Se(e) { + return k(e) ? ke(Hc) : e.length > vc ? ke(Gc) : Ie(); + } + function Oe(e) { + if (!s(e)) + return ke(qc); + var t = Se(e[xl]); + return t[Ol] ? u(e[Tl]) ? u(e[Il]) ? Ie() : ke(zc) : ke(Wc) : t; + } + function Te(e) { + if (!s(e)) + return ke(qc); + var t = Se(e[xl]); + if (!t[Ol]) + return t; + var n = e[Fl]; + return nu(n) ? Ie() : ke($c); + } + function xe(e) { + if (!s(e)) + return ke(qc); + var t = Se(e[xl]); + return t[Ol] ? Ie() : t; + } + function Fe(e, t) { + if (!s(e)) + return ke(qc); + var n = e[Ll]; + if (k(n)) + return ke(Yc); + var r = B('.', n), a = function a(e) { + return !bc.test(e); + }; + if (!j(m(a, r))) + return ke(Jc); + var o = e[Ml]; + if (!nu(o) || j(o)) + return ke(Qc); + var i = function i(e) { + return d(t[e]); + }; + return j(m(i, o)) ? u(e[Rl]) ? Ie() : ke(Kc) : ke(Xc); + } + function Le() { + return u(zf); + } + function Me(e) { + return new zf(e); + } + function Re() { + var e = Ys.createTextNode(''), t = function t() { + e.textContent = 0 < e.textContent.length ? '' : 'a'; + }, n = []; + return Me(function () { + for (var e = n.length, t = 0; t < e; t += 1) + n[t](); + n.splice(0, e); + }).observe(e, { characterData: !0 }), function (e) { + n.push(e), t(); + }; + } + function Ne() { + return function (e) { + var t = Wf('', p || (f += ''), e.write(f + '')); + b.contentWindow.__b = c.Moat; + b.contentWindow.__w = c.wrapper; + b.contentWindow[d.toString().match(/function (\w+)\(\)/)[1]](); + g && a.c.ax[g] && (a.c.ax[g] = null); + if (!k(c.frameData)) + a: + if (e = c.setIframeDomain, c = c.preserveDom, b) { + var t; + if (!e) + try { + t = b.contentWindow.document; + } catch (q) { + break a; + } + g = !1 === a.c.ed(); + c ? e ? b.src = 'javascript:document.close();' : t.close() : e ? b.src = g ? 'javascript:document.open(); document.close();' : 'javascript:document.head && (document.head.innerHTML=""); document.body && (document.body.innerHTML="");' : g ? (t.open(), t.close()) : (t.head && (t.head.innerHTML = ''), t.body && (t.body.innerHTML = '')); + } + } + function g(a) { + if ('string' !== typeof a) + return ''; + var b = a.charAt(0); + '\'' !== b && '"' !== b && (a = '\'' + a + '\''); + return a; + } + a.ax = {}; + a.ax.a = function (c, b, d, f) { + if (!c) + return !1; + try { + var g = document.createElement('iframe'), p = b || a.a.di(); + if (!g) + return !1; + a.a.dn(g, f); + var t; + d ? (d = a.a.cm(d), t = function () { + a.a.cl(g, d); + }) : (d = a.c.e.document.body, t = function () { + d.insertBefore(g, d.insertBefore[0] || null); + }); + var q = { + id: p, + iframe: g, + functionInProgress: !1, + pendingFunctions: [], + parent: d, + loaded: !1 + }; + g.onload = function () { + g.contentWindow && g.contentDocument && !q.loaded && (q.loaded = !0, k(q)); + }; + t(); + q.loaded = q.loaded || g.contentDocument && 'complete' === g.contentDocument.readyState; + c.customIframes || (c.customIframes = {}); + c.customIframes[p] = q; + q.loaded && k(q); + a.k.a.azsx('adKilled', function (b) { + var c = b.customIframes, d; + for (d in c) + c.hasOwnProperty(d) && a.ax.b(b, c[d].id); + }, { + condition: function (a) { + return c.zr == a.zr; + }, + once: !0 + }); + return p; + } catch (r) { + } + return !1; + }; + a.ax.b = function (a, b, d) { + var f = a.customIframes[b]; + d = f && f.iframe; + if (!f || !d) + return !1; + f = f.parent; + if (!f) + return !1; + try { + f.removeChild(d); + } catch (g) { + } + a.customIframes[b] = null; + delete a.customIframes[b]; + return !0; + }; + a.ax.call = function (c, b, d, h, k, p) { + if (!c || 'undefined' === typeof b) + return !1; + var t = c && c.customIframes && c.customIframes[b]; + if (!t || !d) + return !1; + h = h && 'string' !== typeof h ? h.toString() : g(h); + d && 'string' !== typeof d && (d = a.a.dl(d, h)); + k && 'function' === typeof k || (k = function () { + }); + if (t.functionInProgress || !t.loaded) + return t.pendingFunctions.push([ + c, + b, + d, + h, + k, + p + ]), !1; + c = t.iframe; + t.functionInProgress = !0; + b = !1; + try { + if (!t.iframe.contentDocument) + throw Error(); + } catch (r) { + b = !0; + } + d = a.l.l(a.a.df([{ + iframe: c, + frameData: t, + Moat: a, + wrapper: function (a) { + k(a); + }, + innerFunction: d, + innerFunctionCbName: q, + setIframeDomain: b, + preserveDom: p + }], f)); + if (b) { + var q; + do + q = 'Moat#iqcb' + w.floor(10000 * w.random()); + while (a.c.ax[q]); + a.c.e[a.c.ay][q] = d; + c.src = 'javascript:document.open(); document.domain="' + document.domain + '"; window.parent["' + a.c.ay + '"]["' + q + '"]();'; + } else + d(); + }; + }(u)); + (function () { + function a(a) { + window._qs = a; + (a = window.__b) && a.a.cn('https://z.moatads.com/px2/client.js', document.body); + } + u.ay = {}; + u.ay.a = function (k) { + if (k) { + var d = 0 === w.floor(1000 * w.random()); + k.px2 = { + inSample: !1, + success: !1, + firedPixel: !1 + }; + if (d && (k.px2.inSample = !0, d = u.ax.a(k, 'ivt'))) { + try { + var f = k.customIframes && k.customIframes[d] && k.customIframes[d].iframe; + f && (f.contentWindow.__PX2__ = k.px2); + } catch (g) { + } + f = u.f.r(); + f = u.y.b(36, k.ao, f, !1, !0); + f.qs.i = u.a.dy('REUTERS_HEADER1', 'PX2'); + f = u.y.j(f.qs); + u.ax.call(k, d, a, f, null, !0); + k.px2.success = !0; + } + } + }; + }(u)); + (function (a) { + function k(c) { + var d = { oz: !0 }; + if (!a.c.am().isInApp || a.c.cq()) + d.su = !0, d.of = !0; + if (!b[c]) + return !1; + for (var e in b[c]) + if (d[e] && b[c].hasOwnProperty(e) && !b[c][e]) + return !1; + return !0; + } + function d(b) { + a.ai.e(b); + a.ai.f(b); + a.ai.g(b); + a.ai.h(b); + var c = k(b.zr); + !b.hasAdLoadedfired && c ? e = !0 : !e && c && (c = { e: 9 }, c.q = b.aq[9]++, a.y.a(b, c), e = !0); + } + function f(a) { + return { + st: !1, + su: !1, + of: !1, + oz: !1 + }; + } + var g = 0, c, b = {}; + a.ai = {}; + a.ai.c = function (a) { + return !1; + }; + a.ai.d = function () { + var b = new A().getTime(), c = b - g; + if (g && !(1000 > c)) { + g = b; + for (var e in B) + B.hasOwnProperty(e) && d(B[e]); + a.k.a.zaxs('hiddenAds:updated'); + } + }; + var e = !1; + a.ai.e = function (c) { + b[c.zr] || (b[c.zr] = f(c)); + if (!0 !== b[c.zr].st) { + var d = a.w.k(c.zr); + d ? (c.isCurrentlyStacked = a.z.r(c), !1 === b[c.zr].st && (b[c.zr].st = !1 === d.adStartedOnScreen() || !1 === c.isCurrentlyStacked)) : b[c.zr].st = !0; + } + }; + a.ai.f = function (c) { + var d = b, e = c.zr; + d[e] = b[e] || f(c); + var g = d[e].su; + if (!g) { + var k = c.WINDOW || window, g = c.AD_RECT || a.z.k(c.aa, k, c._calcVideoBasedOnContainer), k = a.c.r(k), g = c.isInIframe ? g && k && !(g.left >= k.width || 0 >= g.right || g.top >= k.height || 0 >= g.bottom) : !0; + d[e].su = g; + } + }; + a.ai.g = function (c) { + var d = b, e = c.zr; + d[e] = b[e] || f(c); + var g = d[e].of; + g || (g = a.c.r(c.WINDOW), g = c.isInIframe ? g && !(5 >= g.width || 5 >= g.height) : !0, d[e].of = g); + }; + a.ai.h = function (c) { + var d = b[c.zr]; + b[c.zr] = b[c.zr] || f(c); + if (c.aa) { + var e = 0 < a.a.de(c); + c.isCurrentlyTransparent = !e; + d.oz = d.oz || e; + return e; + } + return d.oz; + }; + a.ai.b = function (a) { + var c = {}, d, e; + for (e in b[a]) + b[a].hasOwnProperty(e) && (d = b[a][e], c[e] = d ? 1 : 0); + return c; + }; + a.ai.a = function (b) { + return a.c.ea() ? !1 : !k(b); + }; + a.k.a.azsx('adLoaded', function (a) { + a.hasAdLoadedfired = !0; + }); + a.k.a.azsx('startAdTracking', function (b) { + d(b); + g = new A().getTime(); + c || (c = new A().getTime() + 'ha', a.k.a.azsx('view:tick', function () { + a.ai.d(); + }, { id: c })); + }); + a.k.a.azsx('adEntersView', function (b) { + a.ai.e(b); + }, { once: !0 }); + a.k.a.azsx('adKilled', function (a) { + a && !a.ep && (delete a.elementsFromPointCache, delete b[a.zr]); + }); + }(u)); + (function (a) { + a.an = {}; + var k, d; + a.an.g = function (f) { + if (d) + f(); + else if (k.googletag && k.googletag.apiReady && k.googletag.pubads()) + d = k.googletag.pubads(), f(); + else { + k.googletag = k.googletag || {}; + k.googletag.cmd = k.googletag.cmd || []; + var g = a.l.l(f), c = function () { + var a = k.googletag; + (d = a && a.apiReady && a.pubads()) && g(); + }; + a.k.a.azsx('adKilled', function () { + var b = k.googletag; + if (b && a.a['do'](b.apiReady) && b.cmd && a.a.f(b.cmd)) { + var d = b.cmd.indexOf(c); + -1 !== d && b.cmd.splice(d, 1); + } + }); + k.googletag.cmd.push(c); + } + }; + a.an.l = function () { + if (d && 'function' !== typeof d.getSlots) + return !1; + try { + return d.getSlots(); + } catch (a) { + return []; + } + }; + a.an.a = function () { + if (d && 'function' === typeof d.getSlotIdMap) + return d.getSlotIdMap(); + }; + a.an.m = function (a) { + return d.getTargeting(a); + }; + a.an.n = function () { + if ('function' !== typeof d.getTargetingKeys || 'function' !== typeof d.getTargeting) + return !1; + var f = d.getTargetingKeys(), g = {}; + a.a.forEach(f, function (a) { + g[a] = d.getTargeting(a); + }); + return g; + }; + a.an.o = function (a, g) { + if ('function' !== typeof d.setTargeting) + return !1; + d.setTargeting(a, g); + return !0; + }; + a.an.p = function (a) { + if ('function' !== typeof d.clearTargeting) + return !1; + d.clearTargeting(a); + }; + a.an.q = function (a) { + if (a && 'function' === typeof a.getTargetingKeys) + return a.getTargetingKeys(); + }; + a.an.r = function (a, d) { + return a && 'function' === typeof a.getTargeting && d ? a.getTargeting(d) : !1; + }; + a.an.s = function (d) { + var g = {}, c = a.an.q(d); + a.a.f(c) && a.a.forEach(c, function (b) { + g[b] = a.an.r(d, b); + }); + return g; + }; + a.an.t = function (d) { + if (d) { + d = a.an.s(d); + var g = a.an.n(); + a.a.forEach(d, function (a, b) { + g[b] = a; + }); + return g; + } + }; + a.an.j = function (a, d, c) { + if (!(a && d && c && 'function' === typeof a.setTargeting)) + return !1; + a.setTargeting(d, c); + }; + a.an.u = function (a, d) { + if (!a || 'function' !== typeof a.clearTargeting) + return !1; + a.clearTargeting(d); + }; + a.an.v = function (f, g) { + if (f && g && d && 'function' === typeof d.addEventListener) { + var c = a.l.l(g); + d.addEventListener(f, c); + } + }; + a.an.d = function (a) { + if (a && 'function' === typeof a.getSlotElementId) + return a.getSlotElementId(); + }; + a.an.f = function (a) { + if (a && 'function' === typeof a.getSlotId && (a = a.getSlotId()) && 'function' === typeof a.getId) + return a = a.getId(), k.document.getElementById('google_ads_iframe_' + a); + }; + a.an.c = function (a) { + if (a && 'function' === typeof a.getAdUnitPath) + return a.getAdUnitPath(); + }; + a.an.e = function (d) { + if (d = a.an.c(d)) { + d = d && d.split('/'); + var g = []; + a.a.forEach(d, function (a) { + 0 < a.length && g.push(a); + }); + return g; + } + }; + a.an.h = function (d) { + var g = []; + d && 'function' === typeof d.getSizes && a.a.forEach(d.getSizes(), function (a) { + 'function' === typeof a.getWidth && 'function' === typeof a.getHeight && g.push([ + a.getWidth(), + a.getHeight() + ]); + }); + return g; + }; + a.an.w = function () { + var a = k && k.googletag && k.googletag.sizeMapping; + if (a) + return a(); + }; + a.an.b = function () { + if (d) { + var f, g = document.body; + a.a.forEach(3, function () { + f = g; + g = a.g.b(g); + if (!g) + return !1; + }); + var c = a.an.x(f); + if ('string' === typeof c) { + var b = d.getSlotIdMap(), e; + for (e in b) + if (e && 'string' === typeof e && e === c) + return b[e]; + } + } + }; + a.an.x = function (a) { + return a && a.id && -1 < a.id.indexOf('google_ads_iframe') ? a.id.replace(/google_ads_iframe_?/, '') : null; + }; + a.an.i = function () { + return k; + }; + a.an.k = function (a, g) { + if (d && 'function' !== typeof d.refresh) + return !1; + d.refresh(a, g); + }; + (function () { + k = window; + a.an.g(function () { + return !0; + }); + }()); + }(u)); + (function (a) { + function k() { + if (!q && t !== h.LOADING) { + q = !0; + a.az.a.allData = new A().getTime(); + var b = window.moatYieldReady; + 'function' === typeof b && a.l.l(b)(); + } + } + function d(b) { + var c; + c = f(b) ? p.c : p.b; + a.an.g(function () { + a.an.o(l.d, c); + a.an.o(l.e, c); + }); + } + function f(a) { + return 'object' === typeof a && !1 !== a._pbd; + } + function g() { + function b(a) { + g && console.log('>>>MOAT YIELD INTELLIGENCE/' + a); + } + function c(b, d) { + return a.a.cj(function (c) { + return (c = a.an.r(b, c)) && c.length && 1 <= c.length ? c[0] : ''; + }, d).join('|'); + } + function d(g) { + var h, k, m; + if (!t) + return b('setMoatTargetingForSlot: No Moat API response for slot level data, not setting targeting.'), a.an.j(g, l.d, p.d), a.an.j(g, l.e, p.d), !1; + if (!f(t)) + return b('setMoatTargetingForSlot: No historical slot data available, not setting targeting.'), a.an.j(g, l.d, p.e), a.an.j(g, l.e, p.e), !1; + if (!g || 'function' !== typeof g.getSlotElementId) + return b('setMoatTargetingForSlot: Slot is missing, not setting targeting.'), !1; + h = g.getSlotElementId(); + if (a.a.f('div_id')) + m = c(g, 'div_id'); + else { + k = a.an.r(g, 'div_id'); + if (!k) + return b('setMoatTargetingForSlot: slotId ' + h + '; Failed to get div_id targeting array, not setting targeting.'), !1; + m = k[0]; + if ('undefined' === typeof m) + return b('setMoatTargetingForSlot: slotId ' + h + '; No targeting data set for div_id, not setting targeting.'), !1; + } + k = t[m] && t[m][e]; + if (!k) + return b('setMoatTargetingForSlot: slotId ' + h + '; No historical data found for div_id of ' + m + ', not setting targeting.'), a.an.j(g, l.d, p.f), a.an.j(g, l.e, p.f), !1; + for (var q in k) + if (a.a.cy(k, q)) { + var r = k[q]; + if (a.a.db(r)) { + b('setMoatTargetingForSlot: slotId ' + h + '; Setting ' + q + ' value of ' + r + '.'); + m = parseInt(r); + r = r.toString(); + if ('number' === typeof m && 0 === m % 10 && 10 < m && 100 >= m) + for (r = [r], m = m / 10 - 1; 0 < m; m--) + r.push((10 * m).toString()); + a.an.j(g, q, r); + } + } + } + var e, g = !1, h, k, q, t; + e = a.c.db ? 'Mobile' : 'Desktop'; + this.slotDataAvailable = function () { + return f(t) ? !!t : !1; + }; + this.pageDataAvailable = function () { + return !1; + }; + this.safetyDataAvailable = function () { + return !1; + }; + this.enableLogging = function () { + return g = !0; + }; + this.disableLogging = function () { + g = !1; + return !0; + }; + this.setMoatTargetingForSlot = function (b) { + b = a.a.df([b], d); + a.an.g(b); + }; + this.setMoatTargetingForAllSlots = function () { + a.an.g(function () { + var c = a.an.l(); + if (!c) + return b('setMoatTargetingForAllSlots: Failed to get slots from GPT, not setting targeting.'), !1; + a.a.forEach(c, function (a) { + d(a); + }, this); + }); + }; + this.getMoatTargetingForSlot = function (d) { + var f, g; + switch (typeof d) { + case 'string': + var m = a.an.l(); + if (!a.a.f(m)) { + b('getMoatTargetingForSlot: No valid slot identifier provided, exiting.'); + return; + } + a.a.forEach(m, function (a) { + if ('function' === typeof a.getSlotElementId && a.getSlotElementId() === d) + return g = a, !1; + }); + break; + case 'object': + if ('function' !== typeof d.getSlotElementId) { + b('getMoatTargetingForSlot: No valid slot identifier provided, exiting.'); + return; + } + g = d; + g.getSlotElementId(); + break; + default: + b('getMoatTargetingForSlot: No valid slot identifier provided, exiting.'); + return; + } + 'object' === typeof g && 'function' === typeof g.getTargeting ? a.a.f('div_id') ? f = c(g, 'div_id') : (m = a.an.r(g, 'div_id')) && m.length && 1 <= m.length && (f = m[0]) : b('getMoatTargetingForSlot: Failed to get slot targeting, GPT slot object is invalid.'); + 'string' !== typeof f && (f = ''); + f = t && t[f] && t[f][e] || {}; + f[l.b] = h; + f[l.c] = k; + f[l.a] = q; + return f; + }; + this.getMoatTargetingForPage = function () { + var a = {}; + a[l.b] = h; + a[l.c] = k; + a[l.a] = q; + return a; + }; + this.__A = function (a, b) { + h = a; + k = b; + }; + this.__B = function (a) { + q = a; + }; + this.__C = function (a) { + t = a; + }; + } + a.az = {}; + var c = w.floor(w.random() * w.pow(10, 12)), b = a.a.ao(), e = a.a.am(); + a.az.a = { + wrapper: window.moatHeaderInitTime || a.c.bj, + apiReady: null, + nadoData: null, + allData: null + }; + a.az.b = { + rendered: 0, + slotTargetingLoaded: 0, + slotTargetingSet: 0, + pageDataTargetingSet: 0, + safetyTargetingSet: 0, + emptySlot: 0 + }; + var h = { + LOADING: '0', + LOADED: '1' + }, l = { + a: 'm_data', + b: 'm_safety', + c: 'm_categories', + d: 'm_mv', + e: 'm_gv' + }, p = a.c.em, t = h.LOADING, q = !1; + a.az.c = function () { + function b(a, c) { + var d = 'safe' === c ? 'moat_safe' : 'moat_unsafe'; + a && -1 !== a.indexOf('moat_unsure') ? (a.splice(a.indexOf('moat_unsure'), 1), a.push(d)) : 0 === a.length && a.push(d); + return a; + } + function c(b) { + if (!b || !a.a.f(b)) + return b; + var d = 'gv_adult gv_arms gv_crime gv_death_injury gv_download gv_drugs gv_hatespeech gv_military gv_obscenity gv_terrorism gv_tobacco moat_safe moat_unsafe moat_sensitive'.split(' '); + return a.a.filter(b, function (a) { + return a && -1 !== d.indexOf(a); + }); + } + var e = new g(); + window.moatPrebidApi = e; + k(); + a.az.a.apiReady = new A().getTime(); + a.ak.c('nado-all', function (f) { + var g, p, q; + if ('object' !== typeof f) + return !1; + q = '0'; + f && 'n' in f && (q = '1'); + a.an.g(function () { + a.an.o(l.a, q); + }); + e.pageDataAvailable = function () { + return !0; + }; + e.__B(q); + var r = a.a.dq(new RegExp('.*callback=' + f.callback + '.*')); + (r = a.a.dp(r)) && r.responseEnd && f.h && (a.az.a.nadoResponseEnd = r.responseEnd, a.az.a.nadoResponseExecution = w.round(f.h)); + g = a.a.aw(f); + f.c && a.a.f(f.c) && (p = f.c); + g && a.an.g(function () { + a.an.o(l.b, g); + }); + p && (p = c(p), p = b(p, g), a.an.g(function () { + a.an.o(l.c, p); + })); + e.safetyDataAvailable = function () { + return !0; + }; + e.__A(g, p); + f = f.yi; + d(f); + e.__C(f); + a.az.a.nadoData = new A().getTime(); + t = h.LOADED; + k(); + }); + }; + a.az.d = function () { + var b = a.a.df([ + 'slotRenderEnded', + function (b) { + if ('undefined' !== typeof b && 'undefined' !== typeof b.slot) { + var c = window.moatPrebidApi, d = b.slot; + if (!c) + return !1; + var e = { + slotTargetingLoaded: !1, + slotTargetingSet: !1, + pageDataTargetingSet: !1, + safetyTargetingSet: !1, + emptySlot: !1 + }; + e.slotTargetingLoaded = c.slotDataAvailable(); + 'undefined' !== typeof a.an.r(d, l.d)[0] && (e.slotTargetingSet = !0); + b.isEmpty && (e.emptySlot = !0); + 'undefined' !== typeof a.an.m(l.a)[0] && (e.pageDataTargetingSet = !0); + 'undefined' !== typeof a.an.m(l.b)[0] && (e.safetyTargetingSet = !0); + a.az.b.rendered++; + a.a.forEach(e, function (b, c) { + !0 === b && a.az.b[c]++; + }); + } + } + ], a.an.v); + a.an.g(b); + }; + a.az.e = function (d, f, g) { + g = {}; + g.e = d; + g.t = a.c.bj; + g.de = c; + g.d = 'REUTERS_HEADER1:' + (a.c.db ? 'Mobile' : 'Desktop') + ':-:-'; + g.i = 'YIELD_INTELLIGENCE_INTERNAL1'; + g.sgs = 5; + g.ar = '29ad59d-clean'; + g.iw = '31d6965'; + 43 === d && 'undefined' !== typeof f && (d = f.getSlotElementId(), g.zMoatDfpSlotId = d || '-'); + g.zMoatRendered = a.az.b.rendered; + g.zMoatSlotTargetingLoaded = a.az.b.slotTargetingLoaded; + g.zMoatSlotTargetingSet = a.az.b.slotTargetingSet; + g.zMoatPageDataTargetingSet = a.az.b.pageDataTargetingSet; + g.zMoatSafetyTargetingSet = a.az.b.safetyTargetingSet; + g.zMoatEmptySlot = a.az.b.emptySlot; + f = a.az.a.wrapper; + var h = a.az.a.nadoData; + d = a.az.a.allData; + g.zMoatNadoDataLoadTime = h && h - f || 'Not Loaded'; + g.zMoatAllDataLoadTime = d && d - f || 'Not Loaded'; + a.az.a.nadoResponseEnd && a.az.a.nadoResponseExecution && (g.zMoatNL = a.az.a.nadoResponseExecution - a.az.a.nadoResponseEnd); + g.bo = b; + g.bd = e; + g.ac = 1; + g.bq = a.c.n; + g.f = Number(!ka); + (f = window.moatPrebidApi) && 'function' === typeof f.slotDataAvailable && (g.zn = f.slotDataAvailable() ? 1 : 0); + d = d && d - a.c.bj; + a.a.db(d) && (g['if'] = d); + d = a.a.cu(g, !0); + d += '&na=' + a.a.cw(d, g.i); + r.yh.yi(d + '&cs=0', W, null, !0); + }; + (function () { + a.an.g(function () { + a.a.forEach(l, function (b, c) { + a.an.o(b, p.a); + }); + }); + }()); + var u = a.f.r(!0); + u.url = a.c.ba; + u.pcode = 'reutersheader194883552024'; + u = a.a.cu(u, !0); + a.ak.a('nado-all', 'MoatNadoAllJsonpRequest', 'https://mb.moatads.com/yi/v2?' + u); + }(u)); + (function (a) { + function k(c, b) { + var d = c.slot, f = 'function' === typeof d.getAdUnitPath && d.getAdUnitPath(), g = a.ap.c(a.a.cc(), b); + g || (g = {}, g._AD_FORMAT = b, a.ap.f(g)); + g.trackedFromDfpHeaderTag = !0; + g.dfpAdId = d.getSlotElementId(); + g.slotMappingId = 'function' === typeof d.getSlotId && d.getSlotId().getId(); + g.moatClientLevel1 = c.advertiserId || ''; + g.moatClientLevel2 = c.campaignId || ''; + g.moatClientLevel3 = c.lineItemId || c.sourceAgnosticLineItemId || ''; + g.moatClientLevel4 = c.creativeId || c.sourceAgnosticCreativeId || ''; + a.a.forEach([ + 'moatClientLevel1', + 'moatClientLevel2', + 'moatClientLevel3', + 'moatClientLevel4' + ], function (b) { + a.a.db(g[b]) && (g[b] = g[b].toString()); + }); + g.dfpHeaderSlots || (g.dfpHeaderSlots = {}); + var k = [ + 'type', + 'div_id' + ]; + k && 0 < k.length && a.a.forEach(k, function (b) { + var c = a.an.r(d, b); + c && a.a.f(c) && 0 < c.length ? g.dfpHeaderSlots['zMoat' + b] = c : g.dfpHeaderSlots['zMoat' + b] = '-'; + }); + 'string' === typeof f && (k = '/' == f[0] ? 2 : 1, f = f.split('/').slice(k), k = f[f.length - 1], g.moatClientSlicer1 = f[0] || '', g.moatClientSlicer2 = k || '', a.a.forEach(f, function (a, b) { + g['zMoatAdUnit' + (b + 1)] = a; + })); + return g; + } + function d(a, b) { + var d = a && a[b]; + return d && d.toString ? d.toString() : ''; + } + function f(c, b, e) { + c = c || {}; + c = [ + { + whitelistValues: [ + '8200574565762874', + '20065632' + ], + id: d(c, 'advertiserId'), + zmoat: 'zMoatDFPAdIds' + }, + { + id: d(c, 'sourceAgnosticLineItemId'), + zmoat: 'zMoatDFPLineItemIds' + }, + { + id: d(c, 'campaignId'), + zmoat: 'zMoatDFPOrderIds' + } + ]; + if (a.a.some(c, function (c) { + if (!c.id) + return !1; + var d = b[c.zmoat] && b[c.zmoat].split(':') || []; + c.whitelistValues && c.whitelistValues.length && (d = d.concat(c.whitelistValues)); + return a.a.ax(d, c.id); + }) || 'html5' === b._AD_FORMAT) + return !0; + } + function g(c) { + var b = c.slot; + if (b && !c.isEmpty) { + var d = 'function' === typeof b.getHtml && b.getHtml(); + d = d && 'string' === typeof d ? 0 <= d.search(/banner_html_inpage_rendering_lib.*\.js/) : !1; + d = k(c, d ? 'html5' : 'adx'); + if (f(c, d, b) && (a.y.b(17, d), c = (c = a.an.d(b)) && document.getElementById(c))) { + var b = (b = c.querySelector('iframe')) && b.contentWindow, g; + try { + g = !a.g.d(b) && b.document && b.document.body && b.document.body.children && 0 < b.document.body.children.length && b.document.body; + } catch (l) { + } + g || (g = c); + a.v.c(g, d, void 0, void 0, void 0, b); + } + } + } + a.am = {}; + a.am.b = function () { + a.an.g(function () { + a.an.v('slotRenderEnded', g); + }); + }; + a.am.a = function (c) { + var b = a.a.df([c], function (b) { + a.ac.g(b); + }); + a.l.c(c.WINDOW, 'unload', b, 'dfphead-unload'); + }; + a.k.a.azsx('adKilled', function (c) { + c && !c.ep && a.l.d(c.WINDOW, 'unload', null, 'dfphead-unload'); + }); + }(u)); + (function (a) { + function k(c) { + c && (a.c.ax.b || (a.c.ax.b = !0, r.dcsx && r.dcsx.ynds(window, 'deviceorientation', 'deviceorientation-' + a.c.ax.a, 'deviceorientationFn' + a.c.ax.a)), h || (h = !0, r.swde.azsx('deviceorientation-' + a.c.ax.a, f)), b.hasOwnProperty(c.zr) || (b[c.zr] = new g())); + } + function d(a) { + a && delete b[a.zr]; + } + function f(a) { + var c = A.now(), d = !1; + 200 < c - e && (e = c, d = !0); + for (var f in B) + B.hasOwnProperty(f) && b.hasOwnProperty(f) && (c = b[f], 1500 > c.eventsCount && (c.eventsCount += 1, d && c.handleOrientationEvent(a))); + } + function g() { + this.validEventsHandledCount = this.eventsHandledCount = this.eventsCount = 0; + this.alpha = new c(0, 360); + this.beta = new c(-180, 180); + this.gamma = new c(-90, 90); + } + function c(a, b) { + this.minExpectedVal = a; + this.maxExpectedVal = b; + this.normalizedMax = w.abs(this.minExpectedVal) + this.maxExpectedVal; + this.rangeRight = this.rangeLeft = this.origin = null; + } + a.ar = {}; + var b = {}, e = 0, h = !1; + g.prototype.isValidEvent = function (a) { + return !a.alpha && 0 !== a.alpha || !a.beta && 0 !== a.beta || !a.beta && 0 !== a.beta || 0 === a.alpha && 0 === a.beta && 0 == a.gamma ? !1 : !0; + }; + g.prototype.handleOrientationEvent = function (a) { + this.eventsHandledCount += 1; + this.isValidEvent(a) && (this.validEventsHandledCount += 1, this.alpha.addValue(a.alpha), this.beta.addValue(a.beta), this.gamma.addValue(a.gamma)); + }; + c.prototype.isOutsideRange = function (a) { + return this.rangeLeft > this.rangeRight ? this.rangeLeft > a && a > this.rangeRight : a < this.rangeLeft || a > this.rangeRight; + }; + c.prototype.extendRange = function (a) { + this.isOutsideRange(a) && ((a < this.rangeLeft ? this.rangeLeft - a : this.rangeLeft + this.normalizedMax - a) <= (a > this.rangeRight ? a - this.rangeRight : this.normalizedMax - this.rangeRight + a) ? this.rangeLeft = a : this.rangeRight = a); + }; + c.prototype.addValue = function (a) { + var b = a + w.abs(this.minExpectedVal); + null === this.origin ? (this.origin = a.toFixed(3), this.rangeRight = this.rangeLeft = b) : this.extendRange(b); + }; + c.prototype.getRangeLength = function () { + return null === this.origin ? -1 : this.rangeRight >= this.rangeLeft ? (this.rangeRight - this.rangeLeft).toFixed(3) : (this.normalizedMax - this.rangeLeft + this.rangeRight).toFixed(3); + }; + a.ar.a = function (a) { + var c = {}; + b[a] && (a = b[a], c = { + oe: [ + a.eventsCount, + a.eventsHandledCount, + a.validEventsHandledCount, + a.alpha.origin ? a.alpha.origin : 'null', + a.alpha.getRangeLength(), + a.beta.origin ? a.beta.origin : 'null', + a.beta.getRangeLength(), + a.gamma.origin ? a.gamma.origin : 'null', + a.gamma.getRangeLength() + ].join(':') + }); + return c; + }; + a.c.e.DeviceOrientationEvent && (a.k.a.azsx('adInitialized', k), a.k.a.azsx('adKilled', d), a.k.a.azsx('allLocalAdsKilled', function () { + r && r.dcsx && r.dcsx.engn && r.dcsx.engn({ listenerName: 'deviceorientationFn' + a.c.ax.a }); + r.swde.sxaz('deviceorientation-' + a.c.ax.a, { callback: f }); + b = {}; + h = a.c.ax.b = !1; + })); + }(u)); + (function (a) { + a.ba = {}; + a.ba.a = !1; + a.ba.b = function (k) { + k && k.zMoatENV && 'x' === k.zMoatENV && (a.ba.a = !0); + }; + }(u)); + (function (a) { + function k() { + a.l.l(function () { + var b = document.createElement('iframe'); + b.src = 'https://z.moatads.com/hd09824092/iframe.html#header=1'; + b.style.display = 'none'; + b.style.width = '0px'; + b.style.height = '0px'; + b.width = '0'; + b.height = '0'; + b.setAttribute('name', 'reutersheader194883552024_MOAT_IFRAME'); + a.a.cl(b, window.document.documentElement); + })(); + } + function d(b) { + if (b && 'string' === typeof b) { + var c = a.f.a([ + 19, + 4, + 18, + 19, + 53 + ]); + -1 !== 'REUTERS_HEADER1'.indexOf(c) && (b = a.a.dy(b, c)); + return b; + } + } + function f(f) { + if (f && f.msgData && 'string' === typeof f.msgData.data) { + var g = f.msgData.data.split('@@@'); + if (2 === g.length) { + var g = { + className: decodeURIComponent(g[0]), + src: decodeURIComponent(g[1]), + parentNode: { innerHTML: '' }, + getAttribute: function (a) { + return 'class' === a ? this.className : this[a] || ''; + }, + trackedFromSlotTag: !0 + }, k = a.ap.c(g, 'feather') || {}; + k.sli = d(k.sli); + k._AD_FORMAT = 'feather'; + a.ba.b(k); + if (a.ba.a) + a.ba.a = !1; + else { + a.y.b(17, k); + var t = b(f.source); + a.l.k(function () { + var b; + b: + if (t) + for (var d = t.length - 1; 0 <= d; d--) { + var f = t[d]; + if (f !== f.top) { + var g = a.g.b(null, f); + if (g) { + if (a.a.bt(g)) { + b = g; + continue; + } + break; + } + g = c(f); + if (a.a.bt(g)) { + b = g; + break b; + } + break; + } + } + else + b = void 0; + b ? (k.adFindingMethod = 'moat slot tag', k.trackedFromSlotTag = !0, e(t, k), a.d.f(b, b.nodeName, !1, void 0, k, null), b = !0) : b = !1; + return b; + }, a.v.h, a.v.v, function () { + a.y.b(11, k); + }); + } + } + } + } + function g(c, f) { + f = f || {}; + if (c && c.src && 'string' === typeof c.nodeName) { + c.trackedFromSlotTag = !0; + var g = a.ap.c(c, 'feather') || {}; + g.trackedFromSlotTag = !0; + g._AD_FORMAT = 'feather'; + f.altKey && (g.altKey = f.altKey); + g.sli = d(f.sli); + g.useSlotIkey = f.useSlotIkey; + var k = a.a.be(c), k = b(k); + e(k, g); + a.ba.b(g); + if (a.ba.a) + a.ba.a = !1; + else { + a.y.b(17, g); + var k = a.a.bh(c), q = a.a.be(c); + a.v.c(k, g, null, null, null, q); + } + } + } + function c(b) { + var c; + try { + c = b.parent.document; + } catch (d) { + return null; + } + return a.g.f(c, b); + } + function b(b) { + if (!b) + return !1; + var c = a.g.k(b, 25); + c.unshift(b); + return c; + } + function e(b, d) { + if (!b || !a.a.f(b)) + return !1; + for (var e = b.length - 1; 0 <= e; e--) { + var f = b[e]; + if (f.top !== f && (f = a.g.b(null, f) || c(f), f = a.an.x(f), 'string' === typeof f)) + return d && (d.slotMappingId = f), f; + } + return !1; + } + a.bb = {}; + a.bb.a = function () { + k(); + a.aw.l('scriptfoundreutersheader194883552024', a.l.l(f)); + window.__moatSlotTagLoadedreutersheader194883552024 = a.l.l(g); + }; + }(u)); + (function (a) { + a.aq = {}; + a.aq.a = function () { + var k = a.g.a(), d = [ + '-', + '-', + '-', + '-', + '-' + ]; + if (!k || !k.performance) + return !1; + var f = k.performance; + if (!f || 'function' !== typeof f.getEntriesByType) + return !1; + d[0] = k === window.top ? 1 : 0; + for (var g = f.getEntriesByType('paint'), c = 0; c < g.length; c++) + k = g[c], 'first-paint' === k.name && (d[1] = w.round(k.startTime)), 'first-contentful-paint' === k.name && (d[2] = w.round(k.startTime)); + f = f.getEntriesByType('navigation'); + 0 < f.length && (k = f[0], 'duration' in k && (d[3] = w.round(k.duration)), 'domInteractive' in k && (d[4] = w.round(k.domInteractive))); + return d.join(':'); + }; + }(u)); + u.k.a.zaxs('modulesReady', r); + var Ea = u.focus.pageIsVisible(); + u.c.ev = 1 == window.history.length && !Ea && (u.c.c && '' != document.referrer || !u.c.c); + u.c.j || u.c.al || u.c.dw(); + (u.c.j && u.c.eg() || 'dummy.url' === u.a.ao()) && u.c.dw(); + var D = 'moatFoundREUTERS_HEADER1', M = '__moat__REUTERS_HEADER1'; + u.c.am().isInApp || u.al.f(); + var L = u.a.cc(); + W = 'https://px.moatads.com'; + u.au.a(wa); + var Fa = function () { + r.zs && r.dcsx && (r.dcsx.engn({ listenerName: 'unloadFn' + u.c.ax.a }), r.dcsx.engn({ listenerName: 'beforeunloadFn' + u.c.ax.a })); + ja || (ja = !0, u.d.b()); + }; + u.a.ao(); + u.az.e(17); + u.p.i(u.c.ax.a, u.c.az); + u.k.a.azsx('trackingReady', va, { once: !0 }); + u.k.a.zaxs('trackingReady'); + }(Date, Math)); + } catch (A) { + var ct = new Date().getTime(); + window['Moat#ETS'] || (window['Moat#ETS'] = ct); + window['Moat#EMC'] || (window['Moat#EMC'] = 0); + var et = ct - window['Moat#ETS'], hourElapsed = 3600000 <= et, msg = A.name + ' in closure (global): ' + A.message + ', stack=' + A.stack; + if (!hourElapsed && 10 > window['Moat#EMC']) { + window['Moat#EMC']++; + try { + var pixelDomain = 'px.moatads.com', isDomless = 'undefined' !== typeof omidNative && ('undefined' === typeof Image || Image && Image._MoatProxyOf), documentReferrer = isDomless ? '' : document.referrer, isBeta = !1, viewHash = 'undefined' === typeof AD_VIEW_HASH ? isBeta ? 'REUTERS_HEADER1_BETA' : 'REUTERS_HEADER1' : AD_VIEW_HASH, tagType = 'undefined' !== typeof Moat && Moat.c && Moat.c.n ? Moat.c.n : '', pxSrc = 'https://' + pixelDomain + '/pixel.gif?e=24&d=data%3Adata%3Adata%3Adata&i=' + escape(viewHash) + '&ac=1&k=' + escape(msg) + '&ar=' + escape('29ad59d-clean') + '&iw=' + escape('31d6965') + '&bq=' + escape(tagType) + '&j=' + escape(documentReferrer) + '&cs=' + new Date().getTime(); + if (isDomless) + omidNative.sendUrl(pxSrc); + else { + var moat_px = new Image(1, 1); + moat_px.src = pxSrc; + } + } catch (w) { + } + } else if (hourElapsed) { + window['Moat#EMC'] = 1; + window['Moat#ETS'] = ct; + try { + pixelDomain = 'px.moatads.com', documentReferrer = (isDomless = 'undefined' !== typeof omidNative && ('undefined' === typeof Image || Image && Image._MoatProxyOf)) ? '' : document.referrer, isBeta = !1, viewHash = 'undefined' === typeof AD_VIEW_HASH ? isBeta ? 'REUTERS_HEADER1_BETA' : 'REUTERS_HEADER1' : AD_VIEW_HASH, tagType = 'undefined' !== typeof Moat && Moat.c && Moat.c.n ? Moat.c.n : '', pxSrc = 'https://' + pixelDomain + '/pixel.gif?e=24&d=data%3Adata%3Adata%3Adata&i=' + escape(viewHash) + '&ac=1&k=' + escape(msg) + '&ar=' + escape('29ad59d-clean') + '&iw=' + escape('31d6965') + '&bq=' + escape(tagType) + '&j=' + escape(documentReferrer) + '&cs=' + new Date().getTime(), isDomless ? omidNative.sendUrl(pxSrc) : (moat_px = new Image(1, 1), moat_px.src = pxSrc); + } catch (w) { + } + } + } + ; + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-optanon-v1.1.0.js b/resources/sugarcoat-optanon-v1.1.0.js new file mode 100644 index 00000000..6b880ffa --- /dev/null +++ b/resources/sugarcoat-optanon-v1.1.0.js @@ -0,0 +1,1652 @@ +{ + const $___mock_0c35b1e1c6280584 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_0c35b1e1c6280584); + const $___mock_e088ddd1669622be = {}; + (exports => { + 'use strict'; + const xhrUnsent = 0; + const xhrOpened = 1; + const xhrHeadersReceived = 2; + const xhrLoading = 3; + const xhrDone = 4; + const xhrDeferredHandleSymbol = Symbol('deferredHandle'); + const xhrOnLoadStartSymbol = Symbol('onloadstart'); + const xhrOnProgressSymbol = Symbol('onprogress'); + const xhrOnAbortSymbol = Symbol('onabort'); + const xhrOnErrorSymbol = Symbol('onerror'); + const xhrOnLoadSymbol = Symbol('onload'); + const xhrOnTimeoutSymbol = Symbol('ontimeout'); + const xhrOnLoadEndSymbol = Symbol('onloadend'); + const xhrOnReadyStateChangeSymbol = Symbol('onreadystatechange'); + const xhrReadyStateSymbol = Symbol('readyState'); + const xhrTimeoutSymbol = Symbol('timeout'); + const xhrWithCredentialsSymbol = Symbol('withCredentials'); + const xhrUploadSymbol = Symbol('upload'); + const xhrResponseTypeSymbol = Symbol('responseType'); + const defineEvent = (obj, symbol) => { + const type = symbol.description.substring(2); + Object.defineProperty(obj, symbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + obj.addEventListener(type, function (event) { + const handler = this[symbol]; + if (handler) { + handler.call(this, event); + } + }); + }; + const changeReadyState = (xhr, readyState) => { + xhr[xhrReadyStateSymbol] = readyState; + xhr.dispatchEvent(new Event('readystatechange')); + }; + let isSealed = true; + class XMLHttpRequestEventTarget extends EventTarget { + constructor() { + super(); + if (!(this instanceof XMLHttpRequest) && !(this instanceof XMLHttpRequestUpload)) { + throw new TypeError('Illegal constructor'); + } + defineEvent(this, xhrOnLoadStartSymbol); + defineEvent(this, xhrOnProgressSymbol); + defineEvent(this, xhrOnAbortSymbol); + defineEvent(this, xhrOnErrorSymbol); + defineEvent(this, xhrOnLoadSymbol); + defineEvent(this, xhrOnTimeoutSymbol); + defineEvent(this, xhrOnLoadEndSymbol); + } + get onloadstart() { + return this[xhrOnLoadStartSymbol]; + } + set onloadstart(value) { + this[xhrOnLoadStartSymbol] = value; + } + get onprogress() { + return this[xhrOnProgressSymbol]; + } + set onprogress(value) { + this[xhrOnProgressSymbol] = value; + } + get onabort() { + return this[xhrOnAbortSymbol]; + } + set onabort(value) { + this[xhrOnAbortSymbol] = value; + } + get onerror() { + return this[xhrOnErrorSymbol]; + } + set onerror(value) { + this[xhrOnErrorSymbol] = value; + } + get ontimeout() { + return this[xhrOnTimeoutSymbol]; + } + set ontimeout(value) { + this[xhrOnTimeoutSymbol] = value; + } + get onloadend() { + return this[xhrOnLoadEndSymbol]; + } + set onloadend(value) { + this[xhrOnLoadEndSymbol] = value; + } + } + exports.XMLHttpRequestEventTarget = { + configurable: true, + enumerable: true, + value: XMLHttpRequestEventTarget, + writable: true + }; + class XMLHttpRequestUpload extends XMLHttpRequestEventTarget { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + super(); + } + } + exports.XMLHttpRequestUpload = { + configurable: true, + enumerable: true, + value: XMLHttpRequestUpload, + writable: true + }; + class XMLHttpRequest extends XMLHttpRequestEventTarget { + constructor() { + super(); + isSealed = false; + const xhrUpload = new XMLHttpRequestUpload(); + isSealed = true; + Object.defineProperty(this, xhrDeferredHandleSymbol, { + configurable: false, + enumerable: false, + value: null, + writable: true + }); + defineEvent(this, xhrOnReadyStateChangeSymbol); + Object.defineProperty(this, xhrReadyStateSymbol, { + configurable: false, + enumerable: false, + value: xhrUnsent, + writable: true + }); + Object.defineProperty(this, xhrTimeoutSymbol, { + configurable: false, + enumerable: false, + value: 0, + writable: true + }); + Object.defineProperty(this, xhrWithCredentialsSymbol, { + configurable: false, + enumerable: false, + value: false, + writable: true + }); + Object.defineProperty(this, xhrUploadSymbol, { + configurable: false, + enumerable: false, + value: xhrUpload, + writable: false + }); + Object.defineProperty(this, xhrResponseTypeSymbol, { + configurable: false, + enumerable: false, + value: '', + writable: true + }); + } + get onreadystatechange() { + return this[xhrOnReadyStateChangeSymbol]; + } + set onreadystatechange(value) { + this[xhrOnReadyStateChangeSymbol] = value; + } + get readyState() { + return this[xhrReadyStateSymbol]; + } + open(method, url) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrDone: { + changeReadyState(this, xhrOpened); + break; + } + } + } + setRequestHeader(name, value) { + } + setTrustToken(trustToken) { + } + get timeout() { + return this[xhrTimeoutSymbol]; + } + set timeout(value) { + this[xhrTimeoutSymbol] = value; + } + get withCredentials() { + return this[xhrWithCredentialsSymbol]; + } + set withCredentials(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrUnsent: + case xhrOpened: { + break; + } + default: { + throw new DOMException('Failed to set the \'withCredentials\' property on \'XMLHttpRequest\': The value may only be set if the object\'s state is UNSENT or OPENED.'); + } + } + this[xhrWithCredentialsSymbol] = !!value; + } + get upload() { + return this[xhrUploadSymbol]; + } + send() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] === null) { + this[xhrDeferredHandleSymbol] = setTimeout(() => { + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrDone); + this.dispatchEvent(new ProgressEvent('error')); + this.dispatchEvent(new ProgressEvent('loadend')); + }, 0); + } else { + throw new DOMException('Failed to execute \'send\' on \'XMLHttpRequest\': The object\'s state must be OPENED.'); + } + } + abort() { + if (this[xhrReadyStateSymbol] === xhrOpened && this[xhrDeferredHandleSymbol] !== null) { + clearTimeout(this[xhrDeferredHandleSymbol]); + this[xhrDeferredHandleSymbol] = null; + changeReadyState(this, xhrUnsent); + this.dispatchEvent(new ProgressEvent('abort')); + this.dispatchEvent(new ProgressEvent('loadend')); + } + } + get responseURL() { + return ''; + } + get status() { + return 0; + } + get statusText() { + return ''; + } + getResponseHeader(name) { + return null; + } + overrideMimeType(mime) { + } + get responseType() { + return this[xhrResponseTypeSymbol]; + } + set responseType(value) { + switch (this[xhrReadyStateSymbol]) { + case xhrDone: { + throw new DOMException('Failed to set the \'responseType\' property on \'XMLHttpRequest\': The response type cannot be set if the object\'s state is LOADING or DONE.'); + } + } + switch (value) { + case '': + case 'arraybuffer': + case 'blob': + case 'document': + case 'json': + case 'text': { + this[xhrResponseTypeSymbol] = value; + break; + } + } + } + get response() { + const responseType = this[xhrResponseTypeSymbol]; + return responseType === '' || responseType === 'text' ? '' : null; + } + get responseText() { + const responseType = this[xhrResponseTypeSymbol]; + if (responseType === '' || responseType === 'text') { + return ''; + } else { + throw new DOMException('Failed to read the \'responseText\' property from \'XMLHttpRequest\': The value is only accessible if the object\'s \'responseType\' is \'\' or \'text\' (was \'arraybuffer\').'); + } + } + get responseXML() { + return null; + } + } + Object.defineProperty(XMLHttpRequest, 'UNSENT', { + configurable: false, + enumerable: true, + value: xhrUnsent + }); + Object.defineProperty(XMLHttpRequest, 'OPENED', { + configurable: false, + enumerable: true, + value: xhrOpened + }); + Object.defineProperty(XMLHttpRequest, 'HEADERS_RECEIVED', { + configurable: false, + enumerable: true, + value: xhrHeadersReceived + }); + Object.defineProperty(XMLHttpRequest, 'LOADING', { + configurable: false, + enumerable: true, + value: xhrLoading + }); + Object.defineProperty(XMLHttpRequest, 'DONE', { + configurable: false, + enumerable: true, + value: xhrDone + }); + exports.XMLHttpRequest = { + configurable: true, + enumerable: true, + value: XMLHttpRequest, + writable: true + }; + })($___mock_e088ddd1669622be); + (function () { + !function (e) { + function t(o) { + if (n[o]) + return n[o].exports; + var r = n[o] = { + exports: {}, + id: o, + loaded: !1 + }; + return e[o].call(r.exports, r, r.exports, t), r.loaded = !0, r.exports; + } + var n = {}; + return t.m = e, t.c = n, t.p = '', t(0); + }([ + function (e, t, n) { + e.exports = n(1); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + if (Array.isArray(e)) { + for (var t = 0, n = Array(e.length); t < e.length; t++) + n[t] = e[t]; + return n; + } + return Array.from(e); + } + n(2), n(3), n(4); + var i = n(5), a = o(i), s = n(12), l = n(10), u = o(l), c = n(11), d = o(c), f = n(13), g = o(f), p = n(18), _ = o(p), h = n(14), v = o(h), O = n(19), b = o(O), A = n(15), E = o(A), T = n(20), y = o(T), C = n(17), w = o(C), m = n(16), S = o(m), L = n(21), N = o(L), I = n(22), D = { + dom: a, + constants: u, + cookie: d, + ot: g, + ads: { + getNpaFlag: s.getNpaFlag, + initAdsensePersonalization: s.initAdsensePersonalization + }, + cmd: _, + onIframesReady: I.onIframesReady, + onFormsReady: I.onFormsReady, + onScriptsReady: I.onScriptsReady, + onAdsReady: I.onAdsReady, + onSocialReady: I.onSocialReady, + config: v, + changeHandlers: b, + leavebehind: E, + tealium: y, + tags: w, + panic: S, + tcf: N + }, P = a.globals.window.cbsoptanon, R = P ? [].concat(r(P.config)) : [], M = []; + M.push(function (e) { + e.tealium.setStatus(e.tealium.PENDING), e.tealium.init(), e.ads.initAdsensePersonalization(); + var t = document.getElementsByTagName('head')[0], n = a.globals.document.createElement('script'); + n.src = u.CPS_NOTICE_ENDPOINT, n.async = !0, t.appendChild(n); + }), P && (M = M.concat([].concat(r(P.cmd)))), M.push(function (e) { + e.ot.awaitOneTrustSettings().then(function () { + a.writelog('OneTrust globals present'); + }).catch(function (e) { + a.writelog('OneTrust failed to load, Optanon panicked'), a.writelog(e.toString()), S._init(); + }), e.ot.awaitCookieSettings().then(function () { + a.writelog('Cookie settings loaded'); + }).catch(function () { + a.writelog('Failed to detect cookie settings, Optanon panicked'), S._init(); + }), e.ot.awaitOneTrustSettings().then(function () { + if (a.writelog('Loaded consent model: ' + e.ot.getConsentModel()), a.writelog('onConsentChanged callback queue registered'), a.globals.Optanon.OnConsentChanged(function () { + e.ot._onConsentChanged(); + }), a.writelog('Loading OneTrust Patches'), a.getConsent()) { + a.writelog('Checking for OneTrust Banner'); + var t = setInterval(function () { + return a.globals.OneTrust && a.globals.OneTrust.IsAlertBoxClosed && a.globals.OneTrust.IsAlertBoxClosed() ? (a.writelog('OneTrust Banner Already Closed'), void clearInterval(t)) : void (a.globals.OneTrust && a.globals.OneTrust.Close && !a.globals.OneTrust.IsAlertBoxClosed() && (a.writelog('Closing OneTrust Banner'), a.globals.OneTrust.Close(), clearInterval(t))); + }, 50); + } + }).catch(function (e) { + a.writelog('Error caught while loading OneTrust Integrations'), a.writelog(e.toString()); + }); + }), a.globals.window.cbsoptanon = D, D.config._init(R), D.cmd._init(M), D.changeHandlers._init(), D.leavebehind._init(); + }, + function (e, t) { + 'use strict'; + 'function' != typeof Object.assign && Object.defineProperty(Object, 'assign', { + value: function (e, t) { + if (null === e || void 0 === e) + throw new TypeError('Cannot convert undefined or null to object'); + for (var n = Object(e), o = 1; o < arguments.length; o++) { + var r = arguments[o]; + if (null !== r && void 0 !== r) + for (var i in r) + Object.prototype.hasOwnProperty.call(r, i) && (n[i] = r[i]); + } + return n; + }, + writable: !0, + configurable: !0 + }); + }, + function (e, t) { + 'use strict'; + Array.prototype.includes || Object.defineProperty(Array.prototype, 'includes', { + value: function (e, t) { + function n(e, t) { + return e === t || 'number' == typeof e && 'number' == typeof t && isNaN(e) && isNaN(t); + } + if (null == this) + throw new TypeError('"this" is null or not defined'); + var o = Object(this), r = o.length >>> 0; + if (0 === r) + return !1; + for (var i = 0 | t, a = Math.max(i >= 0 ? i : r - Math.abs(i), 0); a < r;) { + if (n(o[a], e)) + return !0; + a++; + } + return !1; + } + }), Array.from || (Array.from = function () { + var e = Object.prototype.toString, t = function (t) { + return 'function' == typeof t || '[object Function]' === e.call(t); + }, n = function (e) { + var t = Number(e); + return isNaN(t) ? 0 : 0 !== t && isFinite(t) ? (t > 0 ? 1 : -1) * Math.floor(Math.abs(t)) : t; + }, o = Math.pow(2, 53) - 1, r = function (e) { + var t = n(e); + return Math.min(Math.max(t, 0), o); + }; + return function (e) { + var n = this, o = Object(e); + if (null == e) + throw new TypeError('Array.from requires an array-like object - not null or undefined'); + var i, a = arguments.length > 1 ? arguments[1] : void 0; + if ('undefined' != typeof a) { + if (!t(a)) + throw new TypeError('Array.from: when provided, the second argument must be a function'); + arguments.length > 2 && (i = arguments[2]); + } + for (var s, l = r(o.length), u = t(n) ? Object(new n(l)) : new Array(l), c = 0; c < l;) + s = o[c], a ? u[c] = 'undefined' == typeof i ? a(s, c) : a.call(i, s, c) : u[c] = s, c += 1; + return u.length = l, u; + }; + }()); + }, + function (e, t) { + 'use strict'; + String.prototype.includes || (String.prototype.includes = function (e, t) { + return 'number' != typeof t && (t = 0), !(t + e.length > this.length) && this.indexOf(e, t) !== -1; + }); + }, + function (e, t, n) { + (function (e, o) { + 'use strict'; + function r(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function i() { + return 'production'; + } + function a(e) { + return !('development' != t.getEnvironment() && 'production' != t.getEnvironment() || !t.globals.document.location.search.includes(e + '=true')); + } + function s(e) { + t.hasTestFlag(g.FLAG_SHOW_LOGS) && t.globals.console.log('%ccbsoptanon:', 'background-color: #00aeef; color: #fff; padding: 2px; font-size: 105%;', e); + } + function l(e) { + t.hasTestFlag(g.FLAG_SHOW_LOGS) && t.globals.console.log('%c[DEPRECATED] cbsoptanon:', 'background-color: #ef0000; color: #fff; padding: 2px; font-size: 105%;', e); + } + function u() { + var e = t.globals.document.location.search.match(h); + if (null == e) + return null; + var n = parseInt(e[1]); + if (Number.isInteger(n)) { + for (var o = {}, r = 0; r < v; r++) { + var i = O[r]; + o[i] = 0 != (n & 1 << r); + } + return o; + } + return null; + } + function c() { + var e = _.getConsentCookie(); + if (null != e) { + e = t.globals.decodeURIComponent(e.value); + var n = {}; + return e.replace(b, function (e, t, o, r) { + n[t] = r; + }), n; + } + return null; + } + function d() { + var e = t.getConsentCookieData(); + if (null == e) + return null; + var n = e[A]; + if (null == n) + return null; + var o = []; + return n.split(',').forEach(function (e) { + var t = e.split(':'); + t[1] && '1' == t[1] && o.push(t[0]); + }), o.join(','); + } + function f() { + return new o(function (e) { + var n = setInterval(function () { + if ('complete' === t.globals.document.readyState || 'interactive' === t.globals.document.readyState) + return clearInterval(n), e(!0); + }, E); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.CONSENT_GROUP_KEY = t.CONSENTED_CATEGORIES_REGEX = t.CONSENT_KEYS = t.globals = void 0, t.getEnvironment = i, t.hasTestFlag = a, t.writelog = s, t.writeDeprecationNotice = l, t.getConsent = u, t.getConsentCookieData = c, t.getConsentedCategories = d, t.ready = f; + var g = n(10), p = n(11), _ = r(p), h = (t.globals = e, /\optanonConsent=([0-9]+)\&?/i), v = 5, O = t.CONSENT_KEYS = [ + 'performance', + 'functional', + 'marketing', + 'social', + 'leavebehind' + ], b = t.CONSENTED_CATEGORIES_REGEX = new RegExp('([^?=&]+)(=([^&]*))?', 'g'), A = t.CONSENT_GROUP_KEY = 'groups', E = 100; + }.call(t, function () { + return this; + }(), n(6))); + }, + function (e, t, n) { + e.exports = n(7).Promise; + }, + function (e, t, n) { + (function (t, o, r) { + !function (t, n) { + e.exports = n(); + }(this, function () { + 'use strict'; + function e(e) { + return 'function' == typeof e || 'object' == typeof e && null !== e; + } + function o(e) { + return 'function' == typeof e; + } + function i(e) { + Z = e; + } + function a(e) { + W = e; + } + function s() { + return function () { + return t.nextTick(f); + }; + } + function l() { + return function () { + q(f); + }; + } + function u() { + var e = 0, t = new $(f), n = document.createTextNode(''); + return t.observe(n, { characterData: !0 }), function () { + n.data = e = ++e % 2; + }; + } + function c() { + var e = new MessageChannel(); + return e.port1.onmessage = f, function () { + return e.port2.postMessage(0); + }; + } + function d() { + var e = setTimeout; + return function () { + return e(f, 1); + }; + } + function f() { + for (var e = 0; e < K; e += 2) { + var t = ne[e], n = ne[e + 1]; + t(n), ne[e] = void 0, ne[e + 1] = void 0; + } + K = 0; + } + function g() { + try { + var e = n(9); + return q = e.runOnLoop || e.runOnContext, l(); + } catch (e) { + return d(); + } + } + function p(e, t) { + var n = arguments, o = this, r = new this.constructor(h); + void 0 === r[re] && G(r); + var i = o._state; + return i ? !function () { + var e = n[i - 1]; + W(function () { + return P(i, r, e, o._result); + }); + }() : L(o, r, e, t), r; + } + function _(e) { + var t = this; + if (e && 'object' == typeof e && e.constructor === t) + return e; + var n = new t(h); + return C(n, e), n; + } + function h() { + } + function v() { + return new TypeError('You cannot resolve a promise with itself'); + } + function O() { + return new TypeError('A promises callback cannot return that same promise.'); + } + function b(e) { + try { + return e.then; + } catch (e) { + return le.error = e, le; + } + } + function A(e, t, n, o) { + try { + e.call(t, n, o); + } catch (e) { + return e; + } + } + function E(e, t, n) { + W(function (e) { + var o = !1, r = A(n, t, function (n) { + o || (o = !0, t !== n ? C(e, n) : m(e, n)); + }, function (t) { + o || (o = !0, S(e, t)); + }, 'Settle: ' + (e._label || ' unknown promise')); + !o && r && (o = !0, S(e, r)); + }, e); + } + function T(e, t) { + t._state === ae ? m(e, t._result) : t._state === se ? S(e, t._result) : L(t, void 0, function (t) { + return C(e, t); + }, function (t) { + return S(e, t); + }); + } + function y(e, t, n) { + t.constructor === e.constructor && n === p && t.constructor.resolve === _ ? T(e, t) : n === le ? S(e, le.error) : void 0 === n ? m(e, t) : o(n) ? E(e, t, n) : m(e, t); + } + function C(t, n) { + t === n ? S(t, v()) : e(n) ? y(t, n, b(n)) : m(t, n); + } + function w(e) { + e._onerror && e._onerror(e._result), N(e); + } + function m(e, t) { + e._state === ie && (e._result = t, e._state = ae, 0 !== e._subscribers.length && W(N, e)); + } + function S(e, t) { + e._state === ie && (e._state = se, e._result = t, W(w, e)); + } + function L(e, t, n, o) { + var r = e._subscribers, i = r.length; + e._onerror = null, r[i] = t, r[i + ae] = n, r[i + se] = o, 0 === i && e._state && W(N, e); + } + function N(e) { + var t = e._subscribers, n = e._state; + if (0 !== t.length) { + for (var o = void 0, r = void 0, i = e._result, a = 0; a < t.length; a += 3) + o = t[a], r = t[a + n], o ? P(n, o, r, i) : r(i); + e._subscribers.length = 0; + } + } + function I() { + this.error = null; + } + function D(e, t) { + try { + return e(t); + } catch (e) { + return ue.error = e, ue; + } + } + function P(e, t, n, r) { + var i = o(n), a = void 0, s = void 0, l = void 0, u = void 0; + if (i) { + if (a = D(n, r), a === ue ? (u = !0, s = a.error, a = null) : l = !0, t === a) + return void S(t, O()); + } else + a = r, l = !0; + t._state !== ie || (i && l ? C(t, a) : u ? S(t, s) : e === ae ? m(t, a) : e === se && S(t, a)); + } + function R(e, t) { + try { + t(function (t) { + C(e, t); + }, function (t) { + S(e, t); + }); + } catch (t) { + S(e, t); + } + } + function M() { + return ce++; + } + function G(e) { + e[re] = ce++, e._state = void 0, e._result = void 0, e._subscribers = []; + } + function k(e, t) { + this._instanceConstructor = e, this.promise = new e(h), this.promise[re] || G(this.promise), V(t) ? (this._input = t, this.length = t.length, this._remaining = t.length, this._result = new Array(this.length), 0 === this.length ? m(this.promise, this._result) : (this.length = this.length || 0, this._enumerate(), 0 === this._remaining && m(this.promise, this._result))) : S(this.promise, F()); + } + function F() { + return new Error('Array Methods must be provided an Array'); + } + function B(e) { + return new k(this, e).promise; + } + function j(e) { + var t = this; + return new t(V(e) ? function (n, o) { + for (var r = e.length, i = 0; i < r; i++) + t.resolve(e[i]).then(n, o); + } : function (e, t) { + return t(new TypeError('You must pass an array to race.')); + }); + } + function U(e) { + var t = this, n = new t(h); + return S(n, e), n; + } + function x() { + throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); + } + function Y() { + throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.'); + } + function z(e) { + this[re] = M(), this._result = this._state = void 0, this._subscribers = [], h !== e && ('function' != typeof e && x(), this instanceof z ? R(this, e) : Y()); + } + function X() { + var e = void 0; + if ('undefined' != typeof r) + e = r; + else if ('undefined' != typeof self) + e = self; + else + try { + e = Function('return this')(); + } catch (e) { + throw new Error('polyfill failed because global object is unavailable in this environment'); + } + var t = e.Promise; + if (t) { + var n = null; + try { + n = Object.prototype.toString.call(t.resolve()); + } catch (e) { + } + if ('[object Promise]' === n && !t.cast) + return; + } + e.Promise = z; + } + var H = void 0; + H = Array.isArray ? Array.isArray : function (e) { + return '[object Array]' === Object.prototype.toString.call(e); + }; + var V = H, K = 0, q = void 0, Z = void 0, W = function (e, t) { + ne[K] = e, ne[K + 1] = t, K += 2, 2 === K && (Z ? Z(f) : oe()); + }, J = 'undefined' != typeof window ? window : void 0, Q = J || {}, $ = Q.MutationObserver || Q.WebKitMutationObserver, ee = 'undefined' == typeof self && 'undefined' != typeof t && '[object process]' === {}.toString.call(t), te = 'undefined' != typeof Uint8ClampedArray && 'undefined' != typeof importScripts && 'undefined' != typeof MessageChannel, ne = new Array(1000), oe = void 0; + oe = ee ? s() : $ ? u() : te ? c() : void 0 === J ? g() : d(); + var re = Math.random().toString(36).substring(16), ie = void 0, ae = 1, se = 2, le = new I(), ue = new I(), ce = 0; + return k.prototype._enumerate = function () { + for (var e = this.length, t = this._input, n = 0; this._state === ie && n < e; n++) + this._eachEntry(t[n], n); + }, k.prototype._eachEntry = function (e, t) { + var n = this._instanceConstructor, o = n.resolve; + if (o === _) { + var r = b(e); + if (r === p && e._state !== ie) + this._settledAt(e._state, t, e._result); + else if ('function' != typeof r) + this._remaining--, this._result[t] = e; + else if (n === z) { + var i = new n(h); + y(i, e, r), this._willSettleAt(i, t); + } else + this._willSettleAt(new n(function (t) { + return t(e); + }), t); + } else + this._willSettleAt(o(e), t); + }, k.prototype._settledAt = function (e, t, n) { + var o = this.promise; + o._state === ie && (this._remaining--, e === se ? S(o, n) : this._result[t] = n), 0 === this._remaining && m(o, this._result); + }, k.prototype._willSettleAt = function (e, t) { + var n = this; + L(e, void 0, function (e) { + return n._settledAt(ae, t, e); + }, function (e) { + return n._settledAt(se, t, e); + }); + }, z.all = B, z.race = j, z.resolve = _, z.reject = U, z._setScheduler = i, z._setAsap = a, z._asap = W, z.prototype = { + constructor: z, + then: p, + catch: function (e) { + return this.then(null, e); + } + }, X(), z.polyfill = X, z.Promise = z, z; + }); + }.call(t, n(8), n(6), function () { + return this; + }())); + }, + function (e, t) { + function n() { + throw new Error('setTimeout has not been defined'); + } + function o() { + throw new Error('clearTimeout has not been defined'); + } + function r(e) { + if (c === setTimeout) + return setTimeout(e, 0); + if ((c === n || !c) && setTimeout) + return c = setTimeout, setTimeout(e, 0); + try { + return c(e, 0); + } catch (t) { + try { + return c.call(null, e, 0); + } catch (t) { + return c.call(this, e, 0); + } + } + } + function i(e) { + if (d === clearTimeout) + return clearTimeout(e); + if ((d === o || !d) && clearTimeout) + return d = clearTimeout, clearTimeout(e); + try { + return d(e); + } catch (t) { + try { + return d.call(null, e); + } catch (t) { + return d.call(this, e); + } + } + } + function a() { + _ && g && (_ = !1, g.length ? p = g.concat(p) : h = -1, p.length && s()); + } + function s() { + if (!_) { + var e = r(a); + _ = !0; + for (var t = p.length; t;) { + for (g = p, p = []; ++h < t;) + g && g[h].run(); + h = -1, t = p.length; + } + g = null, _ = !1, i(e); + } + } + function l(e, t) { + this.fun = e, this.array = t; + } + function u() { + } + var c, d, f = e.exports = {}; + !function () { + try { + c = 'function' == typeof setTimeout ? setTimeout : n; + } catch (e) { + c = n; + } + try { + d = 'function' == typeof clearTimeout ? clearTimeout : o; + } catch (e) { + d = o; + } + }(); + var g, p = [], _ = !1, h = -1; + f.nextTick = function (e) { + var t = new Array(arguments.length - 1); + if (arguments.length > 1) + for (var n = 1; n < arguments.length; n++) + t[n - 1] = arguments[n]; + p.push(new l(e, t)), 1 !== p.length || _ || r(s); + }, l.prototype.run = function () { + this.fun.apply(null, this.array); + }, f.title = 'browser', f.browser = !0, f.env = {}, f.argv = [], f.version = '', f.versions = {}, f.on = u, f.addListener = u, f.once = u, f.off = u, f.removeListener = u, f.removeAllListeners = u, f.emit = u, f.prependListener = u, f.prependOnceListener = u, f.listeners = function (e) { + return []; + }, f.binding = function (e) { + throw new Error('process.binding is not supported'); + }, f.cwd = function () { + return '/'; + }, f.chdir = function (e) { + throw new Error('process.chdir is not supported'); + }, f.umask = function () { + return 0; + }; + }, + function (e, t) { + }, + function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }); + var o = (t.OT_BANNER_ID = 'onetrust-banner-sdk', t.OT_LEAVEBEHIND_ID = 'ot-sdk-btn', t.OT_ALERT_BOX_CLOSED_COOKIE = 'OptanonAlertBoxClosed', t.OT_CONSENT_COOKIE = 'OptanonConsent', t.OT_PERFORMANCE_CLASS_REGEX = /2/, t.OT_FUNCTIONAL_CLASS_REGEX = /3/, t.OT_TARGETING_CLASS_REGEX = /4/, t.OT_SOCIAL_CLASS_REGEX = /5/, t.FLAG_PERSONALIZE_ADS = 'optanonPersonalizeAds', t.FLAG_DISABLE_PERSONALIZED_ADS = 'optanonDisablePersonalizedAds', t.FLAG_SHOW_LOGS = 'optanonDisplayLogs', t.FLAG_EU_USER = 'optanonEU', t.FLAG_DISABLE_TARGETING = 'marketing', t.FLAG_DISABLE_PERFORMANCE = 'performance', t.FLAG_DISABLE_SOCIAL = 'social', t.FLAG_DISABLE_FUNCTIONAL = 'functional', t.FLAG_DISPLAY_LEAVEBEHIND = 'leavebehind', t.CONFIG_DISABLE_ENABLE_SERVICES_KEY = 'enableServices', t.CONFIG_SET_NPA_ON_CONSENTCHANGE = 'setNpaOnConsentChange', t.CONFIG_EU_MAX_ATTEMPTS = 'euMaxAttempts', t.CONFIG_COUNTRY_CODE_MAX_ATTEMPTS = 'countryCodeMaxAttempts', t.CONFIG_OT_TIMEOUT = 'oneTrustTimeout', t.CONSENT_MODEL_NOTICE_ONLY_NAME = 'notice only'); + t.CONSENT_MODEL_DEFAULT = o, t.DEFAULT_EU_MAX_ATTEMPTS = 250, t.DEFAULT_COUNTRY_CODE_MAX_ATTEMPTS = 250, t.DEFAULT_OT_TIMEOUT = 2500, t.OT_READY_EVENT = 'cbs.otready', t.OT_STATE_GLOBAL = '_cbsotstate', t.CBSOPT_PANIC_CLASS = 'cbsoptanon-panic', t.VERSION = { + major: 1, + minor: 1, + maintenance: 4 + }, t.CPS_NOTICE_ENDPOINT = '//production-cmp.isgprivacy.cbsi.com/cps/shamanNotifier.js', t.TCF_COOKIE_NAME = 'eupubconsent-v2'; + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + var e = c.globals; + return e.document ? e.document.cookie.split(';') : []; + } + function i(e) { + var n = null; + return t.getAllCookies().forEach(function (t) { + var o = t.trim().split(/\=(.+)/); + o[0] === e && (n = { + name: e, + value: o[1] + }, n.value = n.value.split(' ')[0]); + }), n; + } + function a() { + return t.getCookie(d.OT_ALERT_BOX_CLOSED_COOKIE); + } + function s() { + return t.getCookie(d.OT_CONSENT_COOKIE); + } + function l(e, t) { + c.globals.document.cookie = e + '=' + t; + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.getAllCookies = r, t.getCookie = i, t.getOptAnonDisplayCookie = a, t.getConsentCookie = s, t.setCookie = l; + var u = n(5), c = o(u), d = n(10); + }, + function (e, t, n) { + (function (e) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, o = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], r = null != n; + return o || null == t.nonPersonalizedAds ? u.targetingAllowed().then(function (e) { + return e ? (t.nonPersonalizedAds = c, r && n(c)) : t.nonPersonalizedAds = d, r && n(t.nonPersonalizedAds), t.nonPersonalizedAds; + }).catch(function () { + return t.nonPersonalizedAds = d, r && n(d), d; + }) : (r && n(t.nonPersonalizedAds), new e(function (e) { + return e(t.nonPersonalizedAds); + })); + } + function i() { + return t.getNpaFlag().then(function (e) { + return (s.globals.adsbygoogle = s.globals.adsbygoogle || []).requestNonPersonalizedAds = e, e; + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.NON_PERSONALIZED_ADS = t.PERSONALIZED_ADS = t.nonPersonalizedAds = t.servicesEnabled = void 0, t.getNpaFlag = r, t.initAdsensePersonalization = i; + var a = n(5), s = o(a), l = n(13), u = o(l), c = (n(10), t.servicesEnabled = !1, t.nonPersonalizedAds = null, t.PERSONALIZED_ADS = 0), d = t.NON_PERSONALIZED_ADS = 1; + }.call(t, n(6))); + }, + function (e, t, n) { + (function (e) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + if (Array.isArray(e)) { + for (var t = 0, n = Array(e.length); t < e.length; t++) + n[t] = e[t]; + return n; + } + return Array.from(e); + } + function i() { + if (t.domainDataValid() || (0, w.panicked)()) + return new e(function (e) { + return e(!0); + }); + var n = C.getOneTrustTimeout(); + return new e(function (e, o) { + var r = 0, i = setInterval(function () { + A.globals.OptanonActiveGroups || (r += S), null != A.globals.OptanonActiveGroups && void 0 != A.globals.OptanonActiveGroups && null != A.globals.Optanon && void 0 != A.globals.Optanon && (t.domainData = A.globals.Optanon.GetDomainData(), e(!0), clearInterval(i)), r >= n && (o('Failed to load OneTrust domain data'), A.writelog('Failed to OneTrust domain data'), clearInterval(i)); + }, S); + }); + } + function a() { + var n = C.getOneTrustTimeout(); + return new e(t.consentCookieLoaded ? function (e) { + return e(A.getConsentedCategories()); + } : (0, w.panicked)() ? function (e, t) { + return t(L); + } : function (e, o) { + var r = 0, i = setInterval(function () { + (!T.getConsentCookie() || T.getConsentCookie() && !A.getConsentCookieData()[A.CONSENT_GROUP_KEY]) && (r += S), T.getConsentCookie() && A.getConsentCookieData()[A.CONSENT_GROUP_KEY] && (t.consentCookieLoaded = !0, e(A.getConsentedCategories()), clearInterval(i)), r >= n && (o('Failed to load cookie data'), A.writelog('Failed to load cookie data'), clearInterval(i)); + }, S); + }); + } + function s(e) { + N.push(e); + } + function l() { + A.writelog('Consent Changed'), N.forEach(function (e) { + e(); + }); + } + function u() { + return !(!t.domainData || !t.domainData.ConsentModel); + } + function c() { + return t.domainDataValid() ? t.domainData.ConsentModel.Name || m.CONSENT_MODEL_DEFAULT : m.CONSENT_MODEL_DEFAULT; + } + function d() { + return t.getConsentModel() == m.CONSENT_MODEL_NOTICE_ONLY_NAME; + } + function f(n, o) { + var r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : null, i = null != r, a = A.getConsent(); + if (a) { + if (i) + try { + r(a[o]); + } catch (e) { + A.writelog(e); + } + return new e(function (e) { + return e(a[o]); + }); + } + return t.awaitCookieSettings().then(function (e) { + const $___old_a2904c66a2126402 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'), $___old_24a70b92ab3a5bd0 = {}.constructor.getOwnPropertyDescriptor(window, 'XMLHttpRequest'); + try { + if ($___old_a2904c66a2126402) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_0c35b1e1c6280584.localStorage)); + if ($___old_24a70b92ab3a5bd0) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___mock_e088ddd1669622be.XMLHttpRequest)); + return function () { + if (null != e.match(n)) { + if (i) + try { + r(!0); + } catch (e) { + A.writelog(e); + } + return !0; + } + if (i) + try { + r(!1); + } catch (e) { + A.writelog(e); + } + return !1; + }.apply(this, arguments); + } finally { + if ($___old_a2904c66a2126402) + ({}.constructor.defineProperty(window, 'localStorage', $___old_a2904c66a2126402)); + if ($___old_24a70b92ab3a5bd0) + ({}.constructor.defineProperty(window, 'XMLHttpRequest', $___old_24a70b92ab3a5bd0)); + } + }).catch(function () { + return A.writelog('Error (' + n + '): failed to get OneTrust state, defaulting to opt-in'), i && r(!0), !0; + }); + } + function g() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + return t.getConsentPreferences(m.OT_TARGETING_CLASS_REGEX, m.FLAG_DISABLE_TARGETING, e); + } + function p() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + return t.getConsentPreferences(m.OT_PERFORMANCE_CLASS_REGEX, m.FLAG_DISABLE_PERFORMANCE, e); + } + function _() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + return t.getConsentPreferences(m.OT_FUNCTIONAL_CLASS_REGEX, m.FLAG_DISABLE_FUNCTIONAL, e); + } + function h() { + var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null; + return t.getConsentPreferences(m.OT_SOCIAL_CLASS_REGEX, m.FLAG_DISABLE_SOCIAL, e); + } + function v() { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, o = null != n; + return e.all([ + t.targetingAllowed(), + t.performanceAllowed(), + t.functionalAllowed(), + t.socialAllowed() + ]).then(function (e) { + if (o) + try { + n.apply(void 0, r(e)); + } catch (e) { + A.writelog(e); + } + return e; + }).catch(function () { + return A.writelog('Error (getState): failed to get OneTrust state, defaulting to opt-in'), o && n(!0, !0, !0, !0), [ + !0, + !0, + !0, + !0 + ]; + }); + } + function O() { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, o = null != n; + return t.awaitOneTrustSettings().then(function () { + if (t.noticeOnly() || A.getConsent()) { + A.writelog('awaitInitialConsent - notice only'); + var r = A.getConsent() ? 'consent override' : 'notice only'; + if (o) + try { + n(r); + } catch (e) { + A.writelog(e); + } + return new e(function (e) { + return e(r); + }); + } + return new e(function (e) { + A.writelog('awaitInitialConsent - waiting for banner interaction'); + var t = setInterval(function () { + if (T.getOptAnonDisplayCookie()) { + if (A.writelog('awaitInitialConsent - banner closed'), clearInterval(t), o) + try { + n('banner interaction'); + } catch (e) { + A.writelog(e); + } + return e('banner interaction'); + } + }, I); + }); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.consentCookieLoaded = t.domainData = t.consentHandlers = void 0, t.awaitOneTrustSettings = i, t.awaitCookieSettings = a, t.addOnConsentChangedHandler = s, t._onConsentChanged = l, t.domainDataValid = u, t.getConsentModel = c, t.noticeOnly = d, t.getConsentPreferences = f, t.targetingAllowed = g, t.performanceAllowed = p, t.functionalAllowed = _, t.socialAllowed = h, t.getState = v, t.awaitInitialConsent = O; + var b = n(5), A = o(b), E = n(11), T = o(E), y = n(14), C = o(y), w = (n(15), n(16)), m = n(10), S = 10, L = '1,2,3,4,5', N = t.consentHandlers = [], I = (t.domainData = null, t.consentCookieLoaded = !1, 150); + }.call(t, n(6))); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + e.forEach(function (e) { + t.settings = Object.assign({}, t.settings, e); + }); + } + function r(e) { + t.settings = Object.assign({}, t.settings, e); + } + function i() { + return !Object.keys(t.settings).includes(c.CONFIG_DISABLE_ENABLE_SERVICES_KEY) || t.settings[c.CONFIG_DISABLE_ENABLE_SERVICES_KEY]; + } + function a() { + return !!Object.keys(t.settings).includes(c.CONFIG_SET_NPA_ON_CONSENTCHANGE) && t.settings[c.CONFIG_SET_NPA_ON_CONSENTCHANGE]; + } + function s() { + return Object.keys(t.settings).includes(c.CONFIG_EU_MAX_ATTEMPTS) ? t.settings[c.CONFIG_EU_MAX_ATTEMPTS] : c.DEFAULT_EU_MAX_ATTEMPTS; + } + function l() { + return Object.keys(t.settings).includes(c.CONFIG_COUNTRY_CODE_MAX_ATTEMPTS) ? t.settings[c.CONFIG_COUNTRY_CODE_MAX_ATTEMPTS] : c.DEFAULT_COUNTRY_CODE_MAX_ATTEMPTS; + } + function u() { + return Object.keys(t.settings).includes(c.CONFIG_OT_TIMEOUT) ? t.settings[c.CONFIG_OT_TIMEOUT] : c.DEFAULT_OT_TIMEOUT; + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.settings = void 0, t._init = o, t.push = r, t.enableServices = i, t.setNpaOnConsentChange = a, t.getEUMaxAttempts = s, t.getCountryCodeMaxAttempts = l, t.getOneTrustTimeout = u; + var c = n(10); + t.settings = {}; + }, + function (e, t, n) { + (function (e) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + return g.ready().then(function () { + return g.globals.document.getElementById(d.OT_BANNER_ID); + }); + } + function i() { + return g.writelog('LeaveBehind - getting leavebehind from dom when ready'), g.ready().then(function () { + return g.globals.document.getElementById(d.OT_LEAVEBEHIND_ID); + }).catch(function (e) { + return g.writelog('LeaveBehind - getLeavebehind dom.ready timeout: ' + e), g.globals.document.getElementById(d.OT_LEAVEBEHIND_ID); + }); + } + function a(e) { + return t.getLeavebehind().then(function (t) { + if (t) { + var n = g.getConsent(); + n ? (g.writelog('LeaveBehind - consent flag override: ' + e), t.style.display = n[d.FLAG_DISPLAY_LEAVEBEHIND] ? 'block' : 'none') : (g.writelog('LeaveBehind - setting display: ' + e), t.style.display = e), t.style.position = 'fixed', t.style.bottom = '10px', t.style.left = '10px', t.style['z-index'] = '3000001'; + } + return t; + }); + } + function s() { + return new e(function (e) { + var n = 0, o = setInterval(function () { + return n >= O ? (clearInterval(o), g.writelog('LeaveBehind - banner timed out'), e(t.setLeavebehindDisplay('block'))) : (n += b, t.getBanner().then(function (n) { + if (n && 'block' == g.globals.getComputedStyle(n).display) + return g.writelog('LeaveBehind - banner present, hiding leavebehind'), t.bannerCloseListener(), clearInterval(o), e(t.setLeavebehindDisplay('none')); + })); + }, b); + }); + } + function l() { + var n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : null, o = null != n; + if (_.noticeOnly()) { + if (g.writelog('LeaveBehind - notice only banner closed'), o) + try { + n(t.setLeavebehindDisplay('none')); + } catch (e) { + g.writelog(e); + } + return new e(function (e) { + return e(t.setLeavebehindDisplay('none')); + }); + } + return new e(function (e) { + var r = setInterval(function () { + if (v.getOptAnonDisplayCookie()) { + if (g.writelog('LeaveBehind - banner closed, displaying leavebehind'), clearInterval(r), o) + try { + n(t.setLeavebehindDisplay('block')); + } catch (e) { + g.writelog(e); + } + return e(t.setLeavebehindDisplay('block')); + } + }, O / b); + }); + } + function u() { + return g.ready().then(function () { + var e = g.globals.document.getElementById(d.OT_LEAVEBEHIND_ID), t = e || g.globals.document.createElement('button'); + t.setAttribute('id', 'ot-sdk-btn'), t.setAttribute('class', 'ot-sdk-show-settings'), t.style.display = 'none', t.innerHTML = 'Manage Cookies', t.onclick = function () { + g.writelog('LeaveBehind - clicked'), g.globals.Optanon && (g.writelog('LeaveBehind - toggeling preference center'), g.globals.Optanon.ToggleInfoDisplay()); + }, e || g.globals.document.body.appendChild(t); + }); + } + function c() { + return t.injectLeavebehind().then(function () { + var e = g.getConsent(); + return e ? (g.writelog('LeaveBehind - flag present, displaying leavebehind'), t.setLeavebehindDisplay(e[d.FLAG_DISPLAY_LEAVEBEHIND] ? 'block' : 'none')) : _.awaitOneTrustSettings().then(function () { + return _.noticeOnly() ? (g.writelog('LeaveBehind - notice only model, hide leavebehind'), t.setLeavebehindDisplay('none')) : void (v.getOptAnonDisplayCookie() ? (g.writelog('LeaveBehind - displaying leavebehind'), t.setLeavebehindDisplay('block')) : (g.writelog('LeaveBehind - waiting for banner'), t.handleLeavebehind())); + }).catch(function () { + return t.setLeavebehindDisplay('none'); + }); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.getBanner = r, t.getLeavebehind = i, t.setLeavebehindDisplay = a, t.handleLeavebehind = s, t.bannerCloseListener = l, t.injectLeavebehind = u, t._init = c; + var d = n(10), f = n(5), g = o(f), p = n(13), _ = o(p), h = n(11), v = o(h), O = 1500, b = 10; + }.call(t, n(6))); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + return t.state; + } + function i() { + t.state = !0, t.loadAllScriptTags(), t.setAlertBoxCookie(); + } + function a() { + (0, u.loadDeferredScripts)('optanon-category-2'), (0, u.loadDeferredScripts)('optanon-category-3'), (0, u.loadDeferredScripts)('optanon-category-4'), (0, u.loadDeferredScripts)('optanon-category-5'); + } + function s() { + d.setCookie(l.OT_ALERT_BOX_CLOSED_COOKIE, '0000-00-00T00:00:00.000Z'); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.state = void 0, t.panicked = r, t._init = i, t.loadAllScriptTags = a, t.setAlertBoxCookie = s; + var l = n(10), u = n(17), c = n(11), d = o(c); + t.state = !1; + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : _; + return p.getState().then(function (o) { + var r = u(o, 4), i = r[0], a = r[1], s = r[2], l = r[3]; + a && (f.writelog('Loading performance iframes'), t.loadDeferredTarget('optanon-category-2', e, n)), s && (f.writelog('Loading functional iframes'), t.loadDeferredTarget('optanon-category-3', e, n)), i && (f.writelog('Loading targeting iframes'), t.loadDeferredTarget('optanon-category-4', e, n)), l && (f.writelog('Loading social iframes'), t.loadDeferredTarget('optanon-category-5', e, n)); + }); + } + function i(e, n, o) { + var r = f.globals.document.getElementsByClassName(e); + f.writelog('Found tag count with class (' + e + '): ' + r.length), r.length > 0 && t.loadTags(Array.from(r), n, o); + } + function a(e, t, n) { + e.forEach(function (e) { + e.tagName == t && (f.writelog('Loading ' + t + ': ' + e.dataset[n]), null != e.dataset[n] && void 0 != e.dataset[n] && e.setAttribute(n, e.dataset[n])); + }); + } + function s(e) { + var n = f.globals.document.getElementsByClassName(e); + f.writelog('Found tag count with class (' + e + '): ' + n.length), n.length > 0 && t.loadScriptChain(Array.from(n)); + } + function l(e) { + for (var t = [], n = function (n) { + var o = e[n]; + if (o[O]) + return 'continue'; + if (!o.dataset[_]) { + f.writelog('Executing script: ' + o.text); + var r = f.globals.document.createElement('script'); + return r.setAttribute(h, o.dataset[h] || 'text/javascript'), r.setAttribute(O, !0), r.text = o.text, Object.keys(o.dataset).forEach(function (e) { + r.setAttribute('data-' + e, o.dataset[e]); + }), o.parentNode.removeChild(o), f.globals.document.head.appendChild(r), 'continue'; + } + if (o.getAttribute(v)) { + f.writelog('Loading script async: ' + o.dataset[_]); + var i = f.globals.document.createElement('script'); + return i.setAttribute(h, o.dataset[h] || 'text/javascript'), i.setAttribute(O, !0), i.setAttribute(v, !0), i.setAttribute(_, o.dataset[_]), Object.keys(o.dataset).forEach(function (e) { + i.setAttribute('data-' + e, o.dataset[e]); + }), o.parentNode.removeChild(o), f.globals.document.head.appendChild(i), 'continue'; + } + var a = f.globals.document.createElement('script'); + a.setAttribute(h, o.dataset[h] || 'text/javascript'), a.setAttribute(O, !0), a.setAttribute(_, o.dataset[_]), Object.keys(o.dataset).forEach(function (e) { + a.setAttribute('data-' + e, o.dataset[e]); + }), o.parentNode.removeChild(o), t.push(a); + }, o = 0; o <= e.length - 1; o++) { + n(o); + } + for (var r = void 0, o = t.length - 1; o >= 0; o--) { + var i = t[o]; + 0 == o && (f.writelog('Top of script dependency chain: ' + i[_]), f.globals.document.head.appendChild(i)), o != t.length - 1 && (i.onload = r), r = function (e) { + var n = e, o = t[n]; + return function () { + f.writelog('Callback loading: ' + o[_]), f.globals.document.head.appendChild(o); + }; + }(o); + } + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.SCRIPT_LOADED_ATTRIBUTE = t.SCRIPT_ASYNC_ATTRIBUTE = t.SCRIPT_TYPE_ATTRIBUTE = t.TAG_DATA_SRC_ATTR = void 0; + var u = function () { + function e(e, t) { + var n = [], o = !0, r = !1, i = void 0; + try { + for (var a, s = e[Symbol.iterator](); !(o = (a = s.next()).done) && (n.push(a.value), !t || n.length !== t); o = !0); + } catch (e) { + r = !0, i = e; + } finally { + try { + !o && s.return && s.return(); + } finally { + if (r) + throw i; + } + } + return n; + } + return function (t, n) { + if (Array.isArray(t)) + return t; + if (Symbol.iterator in Object(t)) + return e(t, n); + throw new TypeError('Invalid attempt to destructure non-iterable instance'); + }; + }(); + t.load = r, t.loadDeferredTarget = i, t.loadTags = a, t.loadDeferredScripts = s, t.loadScriptChain = l; + var c = n(10), d = (o(c), n(5)), f = o(d), g = n(13), p = o(g), _ = t.TAG_DATA_SRC_ATTR = 'src', h = t.SCRIPT_TYPE_ATTRIBUTE = 'type', v = t.SCRIPT_ASYNC_ATTRIBUTE = 'async', O = t.SCRIPT_LOADED_ATTRIBUTE = 'data-cbsoptanon-loaded'; + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + s.writelog('Executing deferred commands'), e.forEach(function (e) { + s.writelog('executing cmd ' + e), e(s.globals.window.cbsoptanon); + }); + } + function i(e) { + s.writelog('cmd.push'), e(s.globals.window.cbsoptanon); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t._init = r, t.push = i; + var a = n(5), s = o(a); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + c.globals.googletag && c.globals.googletag.cmd && p.getNpaFlag(null, !0).then(function (e) { + c.globals.googletag.cmd.push(function () { + c.writelog('Ads - Consent Changed :: Setting NPA: ' + e), c.globals.googletag.pubads().setRequestNonPersonalizedAds(e); + }); + }); + } + function i() { + l.setNpaOnConsentChange() && (c.writelog('Registered OnConsentChange setNpaCallback'), f.addOnConsentChangedHandler(t._npaOnConsentChangeHandler)); + } + function a() { + t.registerNpaCallback(); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t._npaOnConsentChangeHandler = r, t.registerNpaCallback = i, t._init = a; + var s = n(14), l = o(s), u = n(5), c = o(u), d = n(13), f = o(d), g = n(12), p = o(g); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r() { + return u.awaitOneTrustSettings().then(function () { + u.noticeOnly() ? g.globals[_.OT_STATE_GLOBAL] = t.NOOP : t.dispatchOnBannerClose(); + }).catch(function () { + g.writelog('OneTrust Errored: ' + _.OT_STATE_GLOBAL + ' = ' + g.globals[_.OT_STATE_GLOBAL]), g.globals[_.OT_STATE_GLOBAL] = t.READY, t.dispatchTealiumEvent(); + }); + } + function i() { + g.writelog('Dispatching event: ' + _.OT_READY_EVENT), g.globals.dispatchEvent(new g.globals.Event(_.OT_READY_EVENT)); + } + function a() { + return d.bannerCloseListener().then(function () { + t.dispatchTealiumEvent(), t.setStatus(t.READY); + }); + } + function s(e) { + g.globals[_.OT_STATE_GLOBAL] = e, g.writelog(_.OT_STATE_GLOBAL + ' = ' + g.globals[_.OT_STATE_GLOBAL]); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.READY = t.NOOP = t.PENDING = void 0, t.init = r, t.dispatchTealiumEvent = i, t.dispatchOnBannerClose = a, t.setStatus = s; + var l = n(13), u = o(l), c = n(15), d = o(c), f = n(5), g = o(f), p = n(10), _ = o(p); + t.PENDING = 'Pending', t.NOOP = 'NOOP', t.READY = 'Ready'; + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + return a.awaitOneTrustSettings().then(function () { + l.globals.OneTrust.getVendorConsentsRequestV2(e); + }).catch(function () { + e(null, !1); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.getConsentData = r; + var i = n(13), a = o(i), s = n(5), l = o(s); + }, + function (e, t, n) { + 'use strict'; + function o(e) { + if (e && e.__esModule) + return e; + var t = {}; + if (null != e) + for (var n in e) + Object.prototype.hasOwnProperty.call(e, n) && (t[n] = e[n]); + return t.default = e, t; + } + function r(e) { + return u.writelog('Iframes - ready'), t.iframesLoaded ? void e(u.globals.window.cbsoptanon) : p.awaitOneTrustSettings().then(function () { + t.iframesLoaded = !0, e(u.globals.window.cbsoptanon); + }).catch(function () { + t.iframesLoaded = !0, e(u.globals.window.cbsoptanon); + }); + } + function i(e) { + return u.writelog('Forms - ready'), t.formsLoaded ? void e(u.globals.window.cbsoptanon) : p.awaitOneTrustSettings().then(function () { + t.formsLoaded = !0, e(u.globals.window.cbsoptanon); + }).catch(function () { + t.formsLoaded = !0, e(u.globals.window.cbsoptanon); + }); + } + function a(e) { + return u.writelog('Scripts - ready'), t.scriptsLoaded ? void e(u.globals.window.cbsoptanon) : p.awaitOneTrustSettings().then(function () { + t.scriptsLoaded = !0, e(u.globals.window.cbsoptanon); + }).catch(function () { + t.scriptsLoaded = !0, e(u.globals.window.cbsoptanon); + }); + } + function s(e) { + return u.writelog('Ads - ready'), t.adsLoaded ? (u.writelog('Ads - NPA Already Set ' + f.nonPersonalizedAds), void e(u.globals.window.cbsoptanon, { npaFlag: f.nonPersonalizedAds })) : f.getNpaFlag().then(function (n) { + u.globals.googletag && u.globals.googletag.cmd ? (u.writelog('Ads - Google tag is present'), t.adsLoaded = !0, u.globals.googletag.cmd.push(function () { + u.writelog('Ads - Setting NPA: ' + n), u.globals.googletag.pubads().setRequestNonPersonalizedAds(n); + }), h.enableServices() && u.globals.googletag.cmd.push(function () { + u.writelog('Ads - Enabling Services: ' + n), u.globals.googletag.enableServices(); + }), u.globals.googletag.cmd.push(function () { + u.writelog('Ads - Running callback: ' + n), e(u.globals.window.cbsoptanon, { npaFlag: n }); + })) : (u.writelog('WARNING: googletag is not present, firing off request.'), e(u.globals.window.cbsoptanon, { npaFlag: n })); + }).catch(function (e) { + u.writelog(e); + }); + } + Object.defineProperty(t, '__esModule', { value: !0 }), t.adsLoaded = t.scriptsLoaded = t.formsLoaded = t.iframesLoaded = void 0, t.onIframesReady = r, t.onFormsReady = i, t.onScriptsReady = a, t.onAdsReady = s; + var l = n(5), u = o(l), c = n(17), d = (o(c), n(12)), f = o(d), g = n(13), p = o(g), _ = n(14), h = o(_); + t.iframesLoaded = !1, t.formsLoaded = !1, t.scriptsLoaded = !1, t.adsLoaded = !1; + } + ]); + }()) +} \ No newline at end of file diff --git a/resources/sugarcoat-prebid.js b/resources/sugarcoat-prebid.js new file mode 100644 index 00000000..a61f47e3 --- /dev/null +++ b/resources/sugarcoat-prebid.js @@ -0,0 +1,12294 @@ +{ + const $___mock_16c53395a822db48 = {}; + (exports => { + 'use strict'; + let isSealed = false; + class Storage { + constructor() { + if (isSealed) { + throw new TypeError('Illegal constructor'); + } + } + get length() { + return Object.keys(this).length; + } + key(index) { + const keys = Object.keys(this); + if (index < 0 || index >= keys.length) { + return null; + } + return keys[index]; + } + getItem(key) { + return Object.prototype.hasOwnProperty.call(this, key) ? this[key] : null; + } + setItem(key, value) { + this[key] = String(value); + } + removeItem(key) { + delete this[key]; + } + clear() { + const keys = Object.keys(this); + for (const key of keys) { + delete this[key]; + } + } + } + exports.Storage = { + configurable: true, + enumerable: true, + value: Storage, + writable: true + }; + const localStorage = new Storage(); + exports.localStorage = { + configurable: true, + enumerable: true, + get() { + return localStorage; + } + }; + const sessionStorage = new Storage(); + exports.sessionStorage = { + configurable: true, + enumerable: true, + get() { + return sessionStorage; + } + }; + isSealed = true; + })($___mock_16c53395a822db48); + (function () { + !function (u) { + var s = window.pbjsChunk; + window.pbjsChunk = function (e, t, n) { + for (var r, i, o, a = 0, c = []; a < e.length; a++) + i = e[a], d[i] && c.push(d[i][0]), d[i] = 0; + for (r in t) + Object.prototype.hasOwnProperty.call(t, r) && (u[r] = t[r]); + for (s && s(e, t, n); c.length;) + c.shift()(); + if (n) + for (a = 0; a < n.length; a++) + o = f(f.s = n[a]); + return o; + }; + var n = {}, d = { 407: 0 }; + function f(e) { + if (n[e]) + return n[e].exports; + var t = n[e] = { + i: e, + l: !1, + exports: {} + }; + return u[e].call(t.exports, t, t.exports, f), t.l = !0, t.exports; + } + f.m = u, f.c = n, f.d = function (e, t, n) { + f.o(e, t) || Object.defineProperty(e, t, { + configurable: !1, + enumerable: !0, + get: n + }); + }, f.n = function (e) { + var t = e && e.__esModule ? function () { + return e.default; + } : function () { + return e; + }; + return f.d(t, 'a', t), t; + }, f.o = function (e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + }, f.p = '', f.oe = function (e) { + throw console.error(e), e; + }, f(f.s = 998); + }({ + 0: function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), n.d(t, 'internal', function () { + return R; + }), t.getPrebidInternal = function () { + return k; + }, n.d(t, 'bind', function () { + return P; + }), t.getUniqueIdentifierStr = q, t.generateUUID = function e(t) { + return t ? (t ^ G() >> t / 4).toString(16) : ([10000000] + -1000 + -4000 + -8000 + -100000000000).replace(/[018]/g, e); + }, t.getBidIdParameter = function (e, t) { + if (t && t[e]) + return t[e]; + return ''; + }, t.tryAppendQueryString = function (e, t, n) { + if (n) + return e + t + '=' + encodeURIComponent(n) + '&'; + return e; + }, t.parseQueryStringParameters = function (e) { + var t = ''; + for (var n in e) + e.hasOwnProperty(n) && (t += n + '=' + encodeURIComponent(e[n]) + '&'); + return t = t.replace(/&$/, ''); + }, t.transformAdServerTargetingObj = function (t) { + return t && 0 < Object.getOwnPropertyNames(t).length ? ge(t).map(function (e) { + return ''.concat(e, '=').concat(encodeURIComponent(t[e])); + }).join('&') : ''; + }, t.getAdUnitSizes = function (e) { + if (!e) + return; + var t = []; + { + var n; + e.mediaTypes && e.mediaTypes.banner && Array.isArray(e.mediaTypes.banner.sizes) ? (n = e.mediaTypes.banner.sizes, Array.isArray(n[0]) ? t = n : t.push(n)) : Array.isArray(e.sizes) && (Array.isArray(e.sizes[0]) ? t = e.sizes : t.push(e.sizes)); + } + return t; + }, t.parseSizesInput = function (e) { + var t = []; + if ('string' == typeof e) { + var n = e.split(','), r = /^(\d)+x(\d)+$/i; + if (n) + for (var i in n) + ae(n, i) && n[i].match(r) && t.push(n[i]); + } else if ('object' === h(e)) { + var o = e.length; + if (0 < o) + if (2 === o && 'number' == typeof e[0] && 'number' == typeof e[1]) + t.push(W(e)); + else + for (var a = 0; a < o; a++) + t.push(W(e[a])); + } + return t; + }, t.parseGPTSingleSizeArray = W, t.parseGPTSingleSizeArrayToRtbSize = function (e) { + if (L(e)) + return { + w: e[0], + h: e[1] + }; + }, t.getWindowTop = F, t.getWindowSelf = z, t.getWindowLocation = V, t.logMessage = H, t.logInfo = K, t.logWarn = J, t.logError = Y, t.hasConsoleLogger = function () { + return w; + }, t.debugTurnedOn = $, t.createInvisibleIframe = function () { + var e = document.createElement('iframe'); + return e.id = q(), e.height = 0, e.width = 0, e.border = '0px', e.hspace = '0', e.vspace = '0', e.marginWidth = '0', e.marginHeight = '0', e.style.border = '0', e.scrolling = 'no', e.frameBorder = '0', e.src = 'about:blank', e.style.display = 'none', e; + }, t.getParameterByName = function (e) { + return je(V().search)[e] || ''; + }, t.isA = X, t.isFn = Z, t.isStr = ee, t.isArray = te, t.isNumber = ne, t.isPlainObject = re, t.isBoolean = function (e) { + return X(e, I); + }, t.isEmpty = ie, t.isEmptyStr = function (e) { + return ee(e) && (!e || 0 === e.length); + }, t._each = oe, t.contains = function (e, t) { + if (ie(e)) + return !1; + if (Z(e.indexOf)) + return -1 !== e.indexOf(t); + var n = e.length; + for (; n--;) + if (e[n] === t) + return !0; + return !1; + }, t._map = function (n, r) { + if (ie(n)) + return []; + if (Z(n.map)) + return n.map(r); + var i = []; + return oe(n, function (e, t) { + i.push(r(e, t, n)); + }), i; + }, t.hasOwn = ae, t.insertElement = ce, t.triggerPixel = ue, t.callBurl = function (e) { + var t = e.source, n = e.burl; + t === m.S2S.SRC && n && R.triggerPixel(n); + }, t.insertHtmlIntoIframe = function (e) { + if (!e) + return; + var t = document.createElement('iframe'); + t.id = q(), t.width = 0, t.height = 0, t.hspace = '0', t.vspace = '0', t.marginWidth = '0', t.marginHeight = '0', t.style.display = 'none', t.style.height = '0px', t.style.width = '0px', t.scrolling = 'no', t.frameBorder = '0', t.allowtransparency = 'true', R.insertElement(t, document, 'body'), t.contentWindow.document.open(), t.contentWindow.document.write(e), t.contentWindow.document.close(); + }, t.insertUserSyncIframe = se, t.createTrackPixelHtml = function (e) { + if (!e) + return ''; + var t = encodeURI(e), n = '
'; + return n += '
'; + }, t.createTrackPixelIframeHtml = de, t.getValueString = fe, t.uniques = le, t.flatten = pe, t.getBidRequest = function (n, e) { + return n ? (e.some(function (e) { + var t = c()(e.bids, function (t) { + return [ + 'bidId', + 'adId', + 'bid_id' + ].some(function (e) { + return t[e] === n; + }); + }); + return t && (r = t), t; + }), r) : void 0; + var r; + }, t.getKeys = ge, t.getValue = be, t.getKeyByValue = function (e, t) { + for (var n in e) + if (e.hasOwnProperty(n) && e[n] === t) + return n; + }, t.getBidderCodes = function () { + return (0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : pbjs.adUnits).map(function (e) { + return e.bids.map(function (e) { + return e.bidder; + }).reduce(pe, []); + }).reduce(pe).filter(le); + }, t.isGptPubadsDefined = ve, n.d(t, 'getHighestCpm', function () { + return ye; + }), n.d(t, 'getOldestHighestCpmBid', function () { + return he; + }), n.d(t, 'getLatestHighestCpmBid', function () { + return me; + }), t.shuffle = function (e) { + var t = e.length; + for (; 0 < t;) { + var n = Math.floor(Math.random() * t), r = e[--t]; + e[t] = e[n], e[n] = r; + } + return e; + }, t.adUnitsFilter = function (e, t) { + return s()(e, t && t.adUnitCode); + }, t.deepClone = Ae, t.inIframe = function () { + try { + return R.getWindowSelf() !== R.getWindowTop(); + } catch (e) { + return !0; + } + }, t.isSafariBrowser = function () { + return /^((?!chrome|android|crios|fxios).)*safari/i.test(navigator.userAgent); + }, t.replaceAuctionPrice = function (e, t) { + if (!e) + return; + return e.replace(/\$\{AUCTION_PRICE\}/g, t); + }, t.replaceClickThrough = function (e, t) { + if (!e || !t || 'string' != typeof t) + return; + return e.replace(/\${CLICKTHROUGH}/g, t); + }, t.timestamp = function () { + return new Date().getTime(); + }, t.getPerformanceNow = function () { + return window.performance && window.performance.now && window.performance.now() || 0; + }, t.hasDeviceAccess = function () { + return !1 !== r.b.getConfig('deviceAccess'); + }, t.checkCookieSupport = Ee, t.delayExecution = function (e, t) { + if (t < 1) + throw new Error('numRequiredCalls must be a positive number. Got '.concat(t)); + var n = 0; + return function () { + ++n === t && e.apply(this, arguments); + }; + }, t.groupBy = function (e, n) { + return e.reduce(function (e, t) { + return (e[t[n]] = e[t[n]] || []).push(t), e; + }, {}); + }, t.getDefinedParams = function (n, e) { + return e.filter(function (e) { + return n[e]; + }).reduce(function (e, t) { + return y(e, v({}, t, n[t])); + }, {}); + }, t.isValidMediaTypes = function (e) { + var t = [ + 'banner', + 'native', + 'video' + ]; + if (!Object.keys(e).every(function (e) { + return s()(t, e); + })) + return !1; + if (e.video && e.video.context) + return s()([ + 'instream', + 'outstream', + 'adpod' + ], e.video.context); + return !0; + }, t.getBidderRequest = function (e, t, n) { + return c()(e, function (e) { + return 0 < e.bids.filter(function (e) { + return e.bidder === t && e.adUnitCode === n; + }).length; + }) || { + start: null, + auctionId: null + }; + }, t.getUserConfiguredParams = function (e, t, n) { + return e.filter(function (e) { + return e.code === t; + }).map(function (e) { + return e.bids; + }).reduce(pe, []).filter(function (e) { + return e.bidder === n; + }).map(function (e) { + return e.params || {}; + }); + }, t.getOrigin = function () { + return window.location.origin ? window.location.origin : window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); + }, t.getDNT = function () { + return '1' === navigator.doNotTrack || '1' === window.doNotTrack || '1' === navigator.msDoNotTrack || 'yes' === navigator.doNotTrack; + }, t.isAdUnitCodeMatchingSlot = function (t) { + return function (e) { + return Oe(t, e); + }; + }, t.isSlotMatchingAdUnitCode = Te, t.getGptSlotInfoForAdUnitCode = function (e) { + var t; + ve() && (t = c()(window.googletag.pubads().getSlots(), Te(e))); + if (t) + return { + gptSlot: t.getAdUnitPath(), + divId: t.getSlotElementId() + }; + return {}; + }, t.unsupportedBidderMessage = function (e, t) { + var n = Object.keys(e.mediaTypes || { banner: 'banner' }).join(', '); + return '\n '.concat(e.code, ' is a ').concat(n, ' ad unit\n containing bidders that don\'t support ').concat(n, ': ').concat(t, '.\n This bidder won\'t fetch demand.\n '); + }, t.isInteger = Ie, t.convertCamelToUnderscore = function (e) { + return e.replace(/(?:^|\.?)([A-Z])/g, function (e, t) { + return '_' + t.toLowerCase(); + }).replace(/^_/, ''); + }, t.cleanObj = function (n) { + return Object.keys(n).reduce(function (e, t) { + return void 0 !== n[t] && (e[t] = n[t]), e; + }, {}); + }, t.pick = function (a, c) { + return 'object' === h(a) ? c.reduce(function (e, t, n) { + if ('function' == typeof t) + return e; + var r = t, i = t.match(/^(.+?)\sas\s(.+?)$/i); + i && (t = i[1], r = i[2]); + var o = a[t]; + return 'function' == typeof c[n + 1] && (o = c[n + 1](o, e)), void 0 !== o && (e[r] = o), e; + }, {}) : {}; + }, t.transformBidderParamKeywords = function (e) { + var r = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 'keywords', i = []; + return oe(e, function (e, t) { + if (te(e)) { + var n = []; + oe(e, function (e) { + !(e = fe(r + '.' + t, e)) && '' !== e || n.push(e); + }), e = n; + } else { + if (!ee(e = fe(r + '.' + t, e))) + return; + e = [e]; + } + i.push({ + key: t, + value: e + }); + }), i; + }, t.convertTypes = function (r, i) { + return Object.keys(r).forEach(function (e) { + var t, n; + i[e] && (Z(r[e]) ? i[e] = r[e](i[e]) : i[e] = (t = r[e], n = i[e], 'string' === t ? n && n.toString() : 'number' === t ? Number(n) : n), isNaN(i[e]) && delete i.key); + }), i; + }, t.isArrayOfNums = function (e, t) { + return te(e) && (!t || e.length === t) && e.every(Ie); + }, t.fill = function (e, t) { + for (var n = [], r = 0; r < t; r++) { + var i = re(e) ? Ae(e) : e; + n.push(i); + } + return n; + }, t.chunk = function (e, t) { + for (var n = [], r = 0; r < Math.ceil(e.length / t); r++) { + var i = r * t, o = i + t; + n.push(e.slice(i, o)); + } + return n; + }, t.getMinValueFromArray = function (e) { + return Math.min.apply(Math, p(e)); + }, t.getMaxValueFromArray = function (e) { + return Math.max.apply(Math, p(e)); + }, t.compareOn = function (n) { + return function (e, t) { + return e[n] < t[n] ? 1 : e[n] > t[n] ? -1 : 0; + }; + }, t.parseQS = je, t.formatQS = Ce, t.parseUrl = function (e, t) { + var n = document.createElement('a'); + t && 'noDecodeWholeURL' in t && t.noDecodeWholeURL ? n.href = e : n.href = decodeURIComponent(e); + var r = t && 'decodeSearchAsString' in t && t.decodeSearchAsString; + return { + href: n.href, + protocol: (n.protocol || '').replace(/:$/, ''), + hostname: n.hostname, + port: +n.port, + pathname: n.pathname.replace(/^(?!\/)/, '/'), + search: r ? n.search : R.parseQS(n.search || ''), + hash: (n.hash || '').replace(/^#/, ''), + host: n.host || window.location.host + }; + }, t.buildUrl = function (e) { + return (e.protocol || 'http') + '://' + (e.host || e.hostname + (e.port ? ':'.concat(e.port) : '')) + (e.pathname || '') + (e.search ? '?'.concat(R.formatQS(e.search || '')) : '') + (e.hash ? '#'.concat(e.hash) : ''); + }, t.deepEqual = we, t.mergeDeep = _e, t.cyrb53Hash = function (e) { + for (var t, n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : 0, r = function (e, t) { + if (Z(Math.imul)) + return Math.imul(e, t); + var n = (4194303 & e) * (t |= 0); + return 4290772992 & e && (n += (4290772992 & e) * t | 0), 0 | n; + }, i = 3735928559 ^ n, o = 1103547991 ^ n, a = 0; a < e.length; a++) + t = e.charCodeAt(a), i = r(i ^ t, 2654435761), o = r(o ^ t, 1597334677); + return i = r(i ^ i >>> 16, 2246822507) ^ r(o ^ o >>> 13, 3266489909), (4294967296 * (2097151 & (o = r(o ^ o >>> 16, 2246822507) ^ r(i ^ i >>> 13, 3266489909))) + (i >>> 0)).toString(); + }; + var r = n(3), i = n(160), o = n.n(i), a = n(10), c = n.n(a), u = n(13), s = n.n(u), d = n(161); + n.d(t, 'deepAccess', function () { + return d.a; + }); + var f = n(162); + function l(e, t) { + return function (e) { + if (Array.isArray(e)) + return e; + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) + return; + var n = [], r = !0, i = !1, o = void 0; + try { + for (var a, c = e[Symbol.iterator](); !(r = (a = c.next()).done) && (n.push(a.value), !t || n.length !== t); r = !0); + } catch (e) { + i = !0, o = e; + } finally { + try { + r || null == c.return || c.return(); + } finally { + if (i) + throw o; + } + } + return n; + }(e, t) || g(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function p(e) { + return function (e) { + if (Array.isArray(e)) + return b(e); + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(e) || g(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function g(e, t) { + if (e) { + if ('string' == typeof e) + return b(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === n && e.constructor && (n = e.constructor.name), 'Map' === n || 'Set' === n ? Array.from(e) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? b(e, t) : void 0; + } + } + function b(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function v(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function y() { + return (y = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + function h(e) { + return (h = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + n.d(t, 'deepSetValue', function () { + return f.a; + }); + var m = n(5), S = 'Array', A = 'String', E = 'Function', O = 'Number', T = 'Object', I = 'Boolean', j = Object.prototype.toString, C = Boolean(window.console), w = Boolean(C && window.console.log), _ = Boolean(C && window.console.info), x = Boolean(C && window.console.warn), B = Boolean(C && window.console.error), U = n(9), R = { + checkCookieSupport: Ee, + createTrackPixelIframeHtml: de, + getWindowSelf: z, + getWindowTop: F, + getWindowLocation: V, + insertUserSyncIframe: se, + insertElement: ce, + isFn: Z, + triggerPixel: ue, + logError: Y, + logWarn: J, + logMessage: H, + logInfo: K, + parseQS: je, + formatQS: Ce, + deepEqual: we + }, k = {}; + var D, N = {}, P = function (e, t) { + return t; + }.bind(null, 1, N)() === N ? Function.prototype.bind : function (e) { + var t = this, n = Array.prototype.slice.call(arguments, 1); + return function () { + return t.apply(e, n.concat(Array.prototype.slice.call(arguments))); + }; + }, M = (D = 0, function () { + return ++D; + }); + function q() { + return M() + Math.random().toString(16).substr(2); + } + function G() { + return window && window.crypto && window.crypto.getRandomValues ? crypto.getRandomValues(new Uint8Array(1))[0] % 16 : 16 * Math.random(); + } + function W(e) { + if (L(e)) + return e[0] + 'x' + e[1]; + } + function L(e) { + return te(e) && 2 === e.length && !isNaN(e[0]) && !isNaN(e[1]); + } + function F() { + return window.top; + } + function z() { + return window.self; + } + function V() { + return window.location; + } + function H() { + $() && w && console.log.apply(console, Q(arguments, 'MESSAGE:')); + } + function K() { + $() && _ && console.info.apply(console, Q(arguments, 'INFO:')); + } + function J() { + $() && x && console.warn.apply(console, Q(arguments, 'WARNING:')); + } + function Y() { + $() && B && console.error.apply(console, Q(arguments, 'ERROR:')), U.emit(m.EVENTS.AUCTION_DEBUG, { + type: 'ERROR', + arguments: arguments + }); + } + function Q(e, t) { + return e = [].slice.call(e), t && e.unshift(t), e.unshift('display: inline-block; color: #fff; background: #3b88c3; padding: 1px 4px; border-radius: 3px;'), e.unshift('%cPrebid'), e; + } + function $() { + return !!r.b.getConfig('debug'); + } + function X(e, t) { + return j.call(e) === '[object ' + t + ']'; + } + function Z(e) { + return X(e, E); + } + function ee(e) { + return X(e, A); + } + function te(e) { + return X(e, S); + } + function ne(e) { + return X(e, O); + } + function re(e) { + return X(e, T); + } + function ie(e) { + if (!e) + return !0; + if (te(e) || ee(e)) + return !(0 < e.length); + for (var t in e) + if (hasOwnProperty.call(e, t)) + return !1; + return !0; + } + function oe(e, t) { + if (!ie(e)) { + if (Z(e.forEach)) + return e.forEach(t, this); + var n = 0, r = e.length; + if (0 < r) + for (; n < r; n++) + t(e[n], n, e); + else + for (n in e) + hasOwnProperty.call(e, n) && t.call(this, e[n], n); + } + } + function ae(e, t) { + return e.hasOwnProperty ? e.hasOwnProperty(t) : void 0 !== e[t] && e.constructor.prototype[t] !== e[t]; + } + function ce(e, t, n, r) { + var i; + t = t || document, i = n ? t.getElementsByTagName(n) : t.getElementsByTagName('head'); + try { + if ((i = i.length ? i : t.getElementsByTagName('body')).length) { + i = i[0]; + var o = r ? null : i.firstChild; + return i.insertBefore(e, o); + } + } catch (e) { + } + } + function ue(e, t) { + var n = new Image(); + t && R.isFn(t) && (n.addEventListener('load', t), n.addEventListener('error', t)), n.src = e; + } + function se(e, t) { + var n = R.createTrackPixelIframeHtml(e, !1, 'allow-scripts allow-same-origin'), r = document.createElement('div'); + r.innerHTML = n; + var i = r.firstChild; + t && R.isFn(t) && (i.addEventListener('load', t), i.addEventListener('error', t)), R.insertElement(i, document, 'html', !0); + } + function de(e) { + var t = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : ''; + return e ? ((!(1 < arguments.length && void 0 !== arguments[1]) || arguments[1]) && (e = encodeURI(e)), t = t && 'sandbox="'.concat(t, '"'), '')) : ''; + } + function fe(e, t, n) { + return null == t ? n : ee(t) ? t : ne(t) ? t.toString() : void R.logWarn('Unsuported type for param: ' + e + ' required type: String'); + } + function le(e, t, n) { + return n.indexOf(e) === t; + } + function pe(e, t) { + return e.concat(t); + } + function ge(e) { + return Object.keys(e); + } + function be(e, t) { + return e[t]; + } + function ve() { + if (window.googletag && Z(window.googletag.pubads) && Z(window.googletag.pubads().getSlots)) + return !0; + } + var ye = Se('timeToRespond', function (e, t) { + return t < e; + }), he = Se('responseTimestamp', function (e, t) { + return t < e; + }), me = Se('responseTimestamp', function (e, t) { + return e < t; + }); + function Se(n, r) { + return function (e, t) { + return e.cpm === t.cpm ? r(e[n], t[n]) ? t : e : e.cpm < t.cpm ? t : e; + }; + } + function Ae(e) { + return o()(e); + } + function Ee() { + if (window.navigator.cookieEnabled || document.cookie.length) + return !0; + } + var Oe = function (e, t) { + return e.getAdUnitPath() === t || e.getSlotElementId() === t; + }; + function Te(t) { + return function (e) { + return Oe(e, t); + }; + } + function Ie(e) { + return Number.isInteger ? Number.isInteger(e) : 'number' == typeof e && isFinite(e) && Math.floor(e) === e; + } + function je(e) { + return e ? e.replace(/^\?/, '').split('&').reduce(function (e, t) { + var n = l(t.split('='), 2), r = n[0], i = n[1]; + return /\[\]$/.test(r) ? (e[r = r.replace('[]', '')] = e[r] || [], e[r].push(i)) : e[r] = i || '', e; + }, {}) : {}; + } + function Ce(e) { + return Object.keys(e).map(function (t) { + return Array.isArray(e[t]) ? e[t].map(function (e) { + return ''.concat(t, '[]=').concat(e); + }).join('&') : ''.concat(t, '=').concat(e[t]); + }).join('&'); + } + function we(e, t) { + if (e === t) + return !0; + if ('object' !== h(e) || null === e || 'object' !== h(t) || null === t) + return !1; + if (Object.keys(e).length !== Object.keys(t).length) + return !1; + for (var n in e) { + if (!t.hasOwnProperty(n)) + return !1; + if (!we(e[n], t[n])) + return !1; + } + return !0; + } + function _e(e) { + for (var t = arguments.length, n = new Array(1 < t ? t - 1 : 0), r = 1; r < t; r++) + n[r - 1] = arguments[r]; + if (!n.length) + return e; + var i = n.shift(); + if (re(e) && re(i)) + for (var o in i) + re(i[o]) ? (e[o] || y(e, v({}, o, {})), _e(e[o], i[o])) : te(i[o]) && e[o] ? te(e[o]) && (e[o] = e[o].concat(i[o])) : y(e, v({}, o, i[o])); + return _e.apply(void 0, [e].concat(n)); + } + }, + 1: function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), n.d(t, 'storage', function () { + return I; + }), t.registerBidder = function (i) { + var n = Array.isArray(i.supportedMediaTypes) ? { supportedMediaTypes: i.supportedMediaTypes } : void 0; + function o(e) { + var t = w(e); + c.default.registerBidAdapter(t, e.code, n); + } + o(i), Array.isArray(i.aliases) && i.aliases.forEach(function (e) { + var t, n, r = e; + Object(m.isPlainObject)(e) && (r = e.code, t = e.gvlid, n = e.skipPbsAliasing), c.default.aliasRegistry[r] = i.code, o(T({}, i, { + code: r, + gvlid: t, + skipPbsAliasing: n + })); + }); + }, t.newBidder = w, n.d(t, 'registerSyncInner', function () { + return _; + }), t.preloadBidderMappingFile = x, t.getIabSubCategory = function (t, e) { + var n = c.default.getBidAdapter(t); + if (n.getSpec().getMappingFileInfo) { + var r = n.getSpec().getMappingFileInfo(), i = r.localStorageKey ? r.localStorageKey : n.getBidderCode(), o = I.getDataFromLocalStorage(i); + if (o) { + try { + o = JSON.parse(o); + } catch (e) { + Object(m.logError)('Failed to parse '.concat(t, ' mapping data stored in local storage')); + } + return o.mapping[e] ? o.mapping[e] : null; + } + } + }, t.isValid = B; + var r = n(92), c = n(8), u = n(3), v = n(34), s = n(44), o = n(38), a = n(25), i = n(5), y = n.n(i), d = n(9), h = n.n(d), f = n(13), l = n.n(f), p = n(4), m = n(0), g = n(2), b = n(11), S = n(7); + function A(e, t) { + return function (e) { + if (Array.isArray(e)) + return e; + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) + return; + var n = [], r = !0, i = !1, o = void 0; + try { + for (var a, c = e[Symbol.iterator](); !(r = (a = c.next()).done) && (n.push(a.value), !t || n.length !== t); r = !0); + } catch (e) { + i = !0, o = e; + } finally { + try { + r || null == c.return || c.return(); + } finally { + if (i) + throw o; + } + } + return n; + }(e, t) || function (e, t) { + if (!e) + return; + if ('string' == typeof e) + return E(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === n && e.constructor && (n = e.constructor.name); + if ('Map' === n || 'Set' === n) + return Array.from(e); + if ('Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return E(e, t); + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function E(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function O(e) { + return (O = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function T() { + return (T = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + var I = Object(S.a)('bidderFactory'), j = [ + 'requestId', + 'cpm', + 'ttl', + 'creativeId', + 'netRevenue', + 'currency' + ], C = 1; + function w(p) { + return T(new r.a(p.code), { + getSpec: function () { + return Object.freeze(p); + }, + registerSyncs: g, + callBids: function (o, a, e, n, c, r) { + var u, s, t, d, i, f; + function l() { + e(), h.a.emit(y.a.EVENTS.BIDDER_DONE, o), g(s, o.gdprConsent, o.uspConsent); + } + Array.isArray(o.bids) && (u = {}, s = [], 0 !== (t = o.bids.filter(b)).length ? (d = {}, t.forEach(function (e) { + (d[e.bidId] = e).adUnitCode || (e.adUnitCode = e.placementCode); + }), (i = p.buildRequests(t, o)) && 0 !== i.length ? (Array.isArray(i) || (i = [i]), f = Object(m.delayExecution)(r(l), i.length), i.forEach(function (i) { + switch (i.method) { + case 'GET': + n(''.concat(i.url).concat(function (e) { + if (e) + return '?'.concat('object' === O(e) ? Object(m.parseQueryStringParameters)(e) : e); + return ''; + }(i.data)), { + success: r(e), + error: t + }, void 0, T({ + method: 'GET', + withCredentials: !0 + }, i.options)); + break; + case 'POST': + n(i.url, { + success: r(e), + error: t + }, 'string' == typeof i.data ? i.data : JSON.stringify(i.data), T({ + method: 'POST', + contentType: 'text/plain', + withCredentials: !0 + }, i.options)); + break; + default: + Object(m.logWarn)('Skipping invalid request from '.concat(p.code, '. Request type ').concat(i.type, ' must be GET or POST')), f(); + } + function e(e, t) { + c(p.code); + try { + e = JSON.parse(e); + } catch (e) { + } + var n; + e = { + body: e, + headers: { get: t.getResponseHeader.bind(t) } + }, s.push(e); + try { + n = p.interpretResponse(e, i); + } catch (e) { + return Object(m.logError)('Bidder '.concat(p.code, ' failed to interpret the server\'s response. Continuing without bids'), null, e), void f(); + } + function r(e) { + var t, n, r, i = d[e.requestId]; + i ? (e.originalCpm = e.cpm, e.originalCurrency = e.currency, e.meta = e.meta || T({}, e[i.bidder]), t = T(Object(v.a)(y.a.STATUS.GOOD, i), e), n = i.adUnitCode, r = t, u[n] = !0, B(n, r, [o]) && a(n, r)) : Object(m.logWarn)('Bidder '.concat(p.code, ' made bid for unknown request ID: ').concat(e.requestId, '. Ignoring.')); + } + n && (Object(m.isArray)(n) ? n.forEach(r) : r(n)), f(n); + } + function t(e) { + c(p.code), Object(m.logError)('Server call for '.concat(p.code, ' failed: ').concat(e, '. Continuing without bids.')), f(); + } + })) : l()) : l()); + } + }); + function g(e, t, n) { + _(p, e, t, n); + } + function b(e) { + return !!p.isBidRequestValid(e) || (Object(m.logWarn)('Invalid bid sent to bidder '.concat(p.code, ': ').concat(JSON.stringify(e))), !1); + } + } + var _ = Object(b.b)('async', function (t, e, n, r) { + var i, o, a = u.b.getConfig('userSync.aliasSyncEnabled'); + !t.getUserSyncs || !a && c.default.aliasRegistry[t.code] || (i = u.b.getConfig('userSync.filterSettings'), (o = t.getUserSyncs({ + iframeEnabled: !(!i || !i.iframe && !i.all), + pixelEnabled: !(!i || !i.image && !i.all) + }, e, n, r)) && (Array.isArray(o) || (o = [o]), o.forEach(function (e) { + s.a.registerSync(e.type, t.code, e.url); + }))); + }, 'registerSyncs'); + function x(e, t) { + if (!u.b.getConfig('adpod.brandCategoryExclusion')) + return e.call(this, t); + t.filter(function (e) { + return Object(m.deepAccess)(e, 'mediaTypes.video.context') === g.a; + }).map(function (e) { + return e.bids.map(function (e) { + return e.bidder; + }); + }).reduce(m.flatten, []).filter(m.uniques).forEach(function (n) { + var e = c.default.getBidAdapter(n); + if (e.getSpec().getMappingFileInfo) { + var t = e.getSpec().getMappingFileInfo(), r = t.refreshInDays ? t.refreshInDays : C, i = t.localStorageKey ? t.localStorageKey : e.getSpec().code, o = I.getDataFromLocalStorage(i); + try { + (!(o = o ? JSON.parse(o) : void 0) || Object(m.timestamp)() > o.lastUpdated + 24 * r * 60 * 60 * 1000) && Object(p.a)(t.url, { + success: function (e) { + try { + e = JSON.parse(e); + var t = { + lastUpdated: Object(m.timestamp)(), + mapping: e.mapping + }; + I.setDataInLocalStorage(i, JSON.stringify(t)); + } catch (e) { + Object(m.logError)('Failed to parse '.concat(n, ' bidder translation mapping file')); + } + }, + error: function () { + Object(m.logError)('Failed to load '.concat(n, ' bidder translation file')); + } + }); + } catch (e) { + Object(m.logError)('Failed to parse '.concat(n, ' bidder translation mapping file')); + } + } + }), e.call(this, t); + } + function B(e, t, n) { + function r(e) { + return 'Invalid bid from '.concat(t.bidderCode, '. Ignoring bid: ').concat(e); + } + return e ? t ? (i = Object.keys(t), j.every(function (e) { + return l()(i, e) && !l()([ + void 0, + null + ], t[e]); + }) ? 'native' !== t.mediaType || Object(o.g)(t, n) ? 'video' !== t.mediaType || Object(a.d)(t, n) ? !('banner' === t.mediaType && !function (e, t, n) { + if ((t.width || 0 === parseInt(t.width, 10)) && (t.height || 0 === parseInt(t.height, 10))) + return t.width = parseInt(t.width, 10), t.height = parseInt(t.height, 10), 1; + var r = Object(m.getBidderRequest)(n, t.bidderCode, e), i = r && r.bids && r.bids[0] && r.bids[0].sizes, o = Object(m.parseSizesInput)(i); + if (1 === o.length) { + var a = A(o[0].split('x'), 2), c = a[0], u = a[1]; + return t.width = parseInt(c, 10), t.height = parseInt(u, 10), 1; + } + }(e, t, n)) || (Object(m.logError)(r('Banner bids require a width and height')), !1) : (Object(m.logError)(r('Video bid does not have required vastUrl or renderer property')), !1) : (Object(m.logError)(r('Native bid missing some required properties.')), !1) : (Object(m.logError)(r('Bidder '.concat(t.bidderCode, ' is missing required params. Check http://prebid.org/dev-docs/bidder-adapter-1.html for list of params.'))), !1)) : (Object(m.logWarn)('Some adapter tried to add an undefined bid for '.concat(e, '.')), !1) : (Object(m.logWarn)('No adUnitCode was supplied to addBidResponse.'), !1); + var i; + } + Object(b.a)('checkAdUnitSetup').before(x); + }, + 10: function (e, t, n) { + var r = n(98); + e.exports = r; + }, + 100: function (e, t, n) { + var r = n(30), i = n(101), o = n(46), a = n(47), c = n(55), u = n(28), s = n(73), d = Object.getOwnPropertyDescriptor; + t.f = r ? d : function (e, t) { + if (e = a(e), t = c(t, !0), s) + try { + return d(e, t); + } catch (e) { + } + if (u(e, t)) + return o(!i.f.call(e, t), e[t]); + }; + }, + 101: function (e, t, n) { + 'use strict'; + var r = {}.propertyIsEnumerable, i = Object.getOwnPropertyDescriptor, o = i && !r.call({ 1: 2 }, 1); + t.f = o ? function (e) { + var t = i(this, e); + return !!t && t.enumerable; + } : r; + }, + 102: function (e, t, n) { + function r(e, t) { + var n = c[a(e)]; + return n == s || n != u && ('function' == typeof t ? i(t) : !!t); + } + var i = n(31), o = /#|\.prototype\./, a = r.normalize = function (e) { + return String(e).replace(o, '.').toLowerCase(); + }, c = r.data = {}, u = r.NATIVE = 'N', s = r.POLYFILL = 'P'; + e.exports = r; + }, + 103: function (e, t, n) { + var r = n(27), i = n(104), o = n(22)('species'); + e.exports = function (e, t) { + var n; + return i(e) && ('function' == typeof (n = e.constructor) && (n === Array || i(n.prototype)) || r(n) && null === (n = n[o])) && (n = void 0), new (void 0 === n ? Array : n)(0 === t ? 0 : t); + }; + }, + 104: function (e, t, n) { + var r = n(48); + e.exports = Array.isArray || function (e) { + return 'Array' == r(e); + }; + }, + 105: function (e, t, n) { + var r = n(26), i = n(32); + e.exports = function (t, n) { + try { + i(r, t, n); + } catch (e) { + r[t] = n; + } + return n; + }; + }, + 106: function (e, t, n) { + var r = n(77); + e.exports = r && !Symbol.sham && 'symbol' == typeof Symbol.iterator; + }, + 107: function (e, t, n) { + n(108); + var r = n(52); + e.exports = r('Array', 'includes'); + }, + 108: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(78).includes, o = n(51); + r({ + target: 'Array', + proto: !0, + forced: !n(60)('indexOf', { + ACCESSORS: !0, + 1: 0 + }) + }, { + includes: function (e, t) { + return i(this, e, 1 < arguments.length ? t : void 0); + } + }), o('includes'); + }, + 109: function (e, t, n) { + var r = n(58), i = Math.max, o = Math.min; + e.exports = function (e, t) { + var n = r(e); + return n < 0 ? i(n + t, 0) : o(n, t); + }; + }, + 11: function (e, t, n) { + 'use strict'; + n.d(t, 'b', function () { + return a; + }), n.d(t, 'a', function () { + return c; + }), t.d = function (e, t) { + var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : 15; + 0 === e.getHooks({ hook: t }).length && e.before(t, n); + }, t.c = function (e, n) { + a('async', function (e) { + e.forEach(function (e) { + return n.apply(void 0, function (e) { + if (Array.isArray(e)) + return o(e); + }(t = e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(t) || function (e, t) { + if (e) { + if ('string' == typeof e) + return o(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === n && e.constructor && (n = e.constructor.name), 'Map' === n || 'Set' === n ? Array.from(e) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? o(e, t) : void 0; + } + }(t) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }()); + var t; + }); + }, e)([]); + }, t.e = function (e) { + for (var t = arguments.length, n = new Array(1 < t ? t - 1 : 0), r = 1; r < t; r++) + n[r - 1] = arguments[r]; + c(e).before(function (e, t) { + t.push(n), e(t); + }); + }; + var r = n(163), i = n.n(r); + function o(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + var a = i()({ ready: i.a.SYNC | i.a.ASYNC | i.a.QUEUE }), c = a.get; + }, + 110: function (e, t, n) { + n(111), n(128), n(89), n(130); + var r = n(43); + e.exports = r.Set; + }, + 111: function (e, t, n) { + 'use strict'; + var r = n(112), i = n(117); + e.exports = r('Set', function (t) { + return function (e) { + return t(this, arguments.length ? e : void 0); + }; + }, i); + }, + 112: function (e, t, n) { + 'use strict'; + var f = n(14), l = n(26), p = n(80), g = n(31), b = n(32), v = n(18), y = n(83), h = n(27), m = n(64), S = n(33).f, A = n(56).forEach, E = n(30), r = n(54), O = r.set, T = r.getterFor; + e.exports = function (n, e, t) { + var r, a, i = -1 !== n.indexOf('Map'), c = -1 !== n.indexOf('Weak'), o = i ? 'set' : 'add', u = l[n], s = u && u.prototype, d = {}; + return E && 'function' == typeof u && (c || s.forEach && !g(function () { + new u().entries().next(); + })) ? (r = e(function (e, t) { + O(y(e, r, n), { + type: n, + collection: new u() + }), null != t && v(t, e[o], e, i); + }), a = T(n), A([ + 'add', + 'clear', + 'delete', + 'forEach', + 'get', + 'has', + 'set', + 'keys', + 'values', + 'entries' + ], function (i) { + var o = 'add' == i || 'set' == i; + i in s && (!c || 'clear' != i) && b(r.prototype, i, function (e, t) { + var n = a(this).collection; + if (!o && c && !h(e)) + return 'get' == i && void 0; + var r = n[i](0 === e ? 0 : e, t); + return o ? this : r; + }); + }), c || S(r.prototype, 'size', { + configurable: !0, + get: function () { + return a(this).collection.size; + } + })) : (r = t.getConstructor(e, n, i, o), p.REQUIRED = !0), m(r, n, !1, !0), d[n] = r, f({ + global: !0, + forced: !0 + }, d), c || t.setStrong(r, n, i), r; + }; + }, + 113: function (e, t, n) { + var r = n(31); + e.exports = !r(function () { + return Object.isExtensible(Object.preventExtensions({})); + }); + }, + 114: function (e, t, n) { + 'use strict'; + var r = n(63), i = n(62); + e.exports = r ? {}.toString : function () { + return '[object ' + i(this) + ']'; + }; + }, + 115: function (e, t, n) { + var r = n(26), i = n(116), o = r.WeakMap; + e.exports = 'function' == typeof o && /native code/.test(i(o)); + }, + 116: function (e, t, n) { + var r = n(76), i = Function.toString; + 'function' != typeof r.inspectSource && (r.inspectSource = function (e) { + return i.call(e); + }), e.exports = r.inspectSource; + }, + 117: function (e, t, n) { + 'use strict'; + var s = n(33).f, d = n(84), f = n(122), l = n(24), p = n(83), g = n(18), a = n(66), c = n(127), b = n(30), v = n(80).fastKey, r = n(54), y = r.set, h = r.getterFor; + e.exports = { + getConstructor: function (e, n, r, i) { + function o(e, t, n) { + var r, i, o = c(e), a = u(e, t); + return a ? a.value = n : (o.last = a = { + index: i = v(t, !0), + key: t, + value: n, + previous: r = o.last, + next: void 0, + removed: !1 + }, o.first || (o.first = a), r && (r.next = a), b ? o.size++ : e.size++, 'F' !== i && (o.index[i] = a)), e; + } + var a = e(function (e, t) { + p(e, a, n), y(e, { + type: n, + index: d(null), + first: void 0, + last: void 0, + size: 0 + }), b || (e.size = 0), null != t && g(t, e[i], e, r); + }), c = h(n), u = function (e, t) { + var n, r = c(e), i = v(t); + if ('F' !== i) + return r.index[i]; + for (n = r.first; n; n = n.next) + if (n.key == t) + return n; + }; + return f(a.prototype, { + clear: function () { + for (var e = c(this), t = e.index, n = e.first; n;) + n.removed = !0, n.previous && (n.previous = n.previous.next = void 0), delete t[n.index], n = n.next; + e.first = e.last = void 0, b ? e.size = 0 : this.size = 0; + }, + delete: function (e) { + var t, n, r = c(this), i = u(this, e); + return i && (t = i.next, n = i.previous, delete r.index[i.index], i.removed = !0, n && (n.next = t), t && (t.previous = n), r.first == i && (r.first = t), r.last == i && (r.last = n), b ? r.size-- : this.size--), !!i; + }, + forEach: function (e, t) { + for (var n, r = c(this), i = l(e, 1 < arguments.length ? t : void 0, 3); n = n ? n.next : r.first;) + for (i(n.value, n.key, this); n && n.removed;) + n = n.previous; + }, + has: function (e) { + return !!u(this, e); + } + }), f(a.prototype, r ? { + get: function (e) { + var t = u(this, e); + return t && t.value; + }, + set: function (e, t) { + return o(this, 0 === e ? 0 : e, t); + } + } : { + add: function (e) { + return o(this, e = 0 === e ? 0 : e, e); + } + }), b && s(a.prototype, 'size', { + get: function () { + return c(this).size; + } + }), a; + }, + setStrong: function (e, t, n) { + var r = t + ' Iterator', i = h(t), o = h(r); + a(e, t, function (e, t) { + y(this, { + type: r, + target: e, + state: i(e), + kind: t, + last: void 0 + }); + }, function () { + for (var e = o(this), t = e.kind, n = e.last; n && n.removed;) + n = n.previous; + return e.target && (e.last = n = n ? n.next : e.state.first) ? 'keys' == t ? { + value: n.key, + done: !1 + } : 'values' == t ? { + value: n.value, + done: !1 + } : { + value: [ + n.key, + n.value + ], + done: !1 + } : { + value: e.target = void 0, + done: !0 + }; + }, n ? 'entries' : 'values', !n, !0), c(t); + } + }; + }, + 118: function (e, t, n) { + var r = n(30), a = n(33), c = n(15), u = n(119); + e.exports = r ? Object.defineProperties : function (e, t) { + c(e); + for (var n, r = u(t), i = r.length, o = 0; o < i;) + a.f(e, n = r[o++], t[n]); + return e; + }; + }, + 119: function (e, t, n) { + var r = n(120), i = n(85); + e.exports = Object.keys || function (e) { + return r(e, i); + }; + }, + 12: function (e, t, n) { + 'use strict'; + t.a = i, t.c = function (e) { + return !(!e || !e.url); + }, t.b = function (e, t) { + e.render(t); + }; + var u = n(39), s = n(0), r = n(10), d = n.n(r), f = 'outstream'; + function i(e) { + var t = this, r = e.url, n = e.config, i = e.id, o = e.callback, a = e.loaded, c = e.adUnitCode; + this.url = r, this.config = n, this.handlers = {}, this.id = i, this.loaded = a, this.cmd = [], this.push = function (e) { + 'function' == typeof e ? t.loaded ? e.call() : t.cmd.push(e) : s.logError('Commands given to Renderer.push must be wrapped in a function'); + }, this.callback = o || function () { + t.loaded = !0, t.process(); + }, this.render = function () { + function e() { + t._render ? t._render.apply(t, n) : s.logWarn('No render function was provided, please use .setRender on the renderer'); + } + var t = this, n = arguments; + !function (t) { + var e = pbjs.adUnits, n = d()(e, function (e) { + return e.code === t; + }); + if (!n) + return !1; + var r = s.deepAccess(n, 'renderer'), i = !!(r && r.url && r.render), o = s.deepAccess(n, 'mediaTypes.video.renderer'), a = !!(o && o.url && o.render); + return !!(i && !0 !== r.backupOnly || a && !0 !== o.backupOnly); + }(c) ? (this.cmd.unshift(e), Object(u.a)(r, f, this.callback)) : (s.logWarn('External Js not loaded by Renderer since renderer url and callback is already defined on adUnit '.concat(c)), e()); + }.bind(this); + } + i.install = function (e) { + return new i({ + url: e.url, + config: e.config, + id: e.id, + callback: e.callback, + loaded: e.loaded, + adUnitCode: e.adUnitCode + }); + }, i.prototype.getConfig = function () { + return this.config; + }, i.prototype.setRender = function (e) { + this._render = e; + }, i.prototype.setEventHandlers = function (e) { + this.handlers = e; + }, i.prototype.handleVideoEvent = function (e) { + var t = e.id, n = e.eventName; + 'function' == typeof this.handlers[n] && this.handlers[n](), s.logMessage('Prebid Renderer event for id '.concat(t, ' type ').concat(n)); + }, i.prototype.process = function () { + for (; 0 < this.cmd.length;) + try { + this.cmd.shift().call(); + } catch (e) { + s.logError('Error processing Renderer command: ', e); + } + }; + }, + 120: function (e, t, n) { + var a = n(28), c = n(47), u = n(78).indexOf, s = n(53); + e.exports = function (e, t) { + var n, r = c(e), i = 0, o = []; + for (n in r) + !a(s, n) && a(r, n) && o.push(n); + for (; t.length > i;) + a(r, n = t[i++]) && (~u(o, n) || o.push(n)); + return o; + }; + }, + 121: function (e, t, n) { + var r = n(29); + e.exports = r('document', 'documentElement'); + }, + 122: function (e, t, n) { + var i = n(86); + e.exports = function (e, t, n) { + for (var r in t) + n && n.unsafe && e[r] ? e[r] = t[r] : i(e, r, t[r], n); + return e; + }; + }, + 123: function (e, t, n) { + 'use strict'; + function i() { + return this; + } + var o = n(87).IteratorPrototype, a = n(84), c = n(46), u = n(64), s = n(40); + e.exports = function (e, t, n) { + var r = t + ' Iterator'; + return e.prototype = a(o, { next: c(1, n) }), u(e, r, !1, !0), s[r] = i, e; + }; + }, + 124: function (e, t, n) { + var r = n(31); + e.exports = !r(function () { + function e() { + } + return e.prototype.constructor = null, Object.getPrototypeOf(new e()) !== e.prototype; + }); + }, + 125: function (e, t, n) { + var i = n(15), o = n(126); + e.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () { + var n, r = !1, e = {}; + try { + (n = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set).call(e, []), r = e instanceof Array; + } catch (e) { + } + return function (e, t) { + return i(e), o(t), r ? n.call(e, t) : e.__proto__ = t, e; + }; + }() : void 0); + }, + 126: function (e, t, n) { + var r = n(27); + e.exports = function (e) { + if (!r(e) && null !== e) + throw TypeError('Can\'t set ' + String(e) + ' as a prototype'); + return e; + }; + }, + 127: function (e, t, n) { + 'use strict'; + var r = n(29), i = n(33), o = n(22), a = n(30), c = o('species'); + e.exports = function (e) { + var t = r(e), n = i.f; + a && t && !t[c] && n(t, c, { + configurable: !0, + get: function () { + return this; + } + }); + }; + }, + 128: function (e, t) { + }, + 129: function (e, t, n) { + function r(c) { + return function (e, t) { + var n, r, i = String(s(e)), o = u(t), a = i.length; + return o < 0 || a <= o ? c ? '' : void 0 : (n = i.charCodeAt(o)) < 55296 || 56319 < n || o + 1 === a || (r = i.charCodeAt(o + 1)) < 56320 || 57343 < r ? c ? i.charAt(o) : n : c ? i.slice(o, o + 2) : r - 56320 + (n - 55296 << 10) + 65536; + }; + } + var u = n(58), s = n(49); + e.exports = { + codeAt: r(!1), + charAt: r(!0) + }; + }, + 13: function (e, t, n) { + var r = n(107); + e.exports = r; + }, + 130: function (e, t, n) { + n(131); + var r = n(132), i = n(26), o = n(62), a = n(32), c = n(40), u = n(22)('toStringTag'); + for (var s in r) { + var d = i[s], f = d && d.prototype; + f && o(f) !== u && a(f, u, s), c[s] = c.Array; + } + }, + 131: function (e, t, n) { + 'use strict'; + var r = n(47), i = n(51), o = n(40), a = n(54), c = n(66), u = 'Array Iterator', s = a.set, d = a.getterFor(u); + e.exports = c(Array, 'Array', function (e, t) { + s(this, { + type: u, + target: r(e), + index: 0, + kind: t + }); + }, function () { + var e = d(this), t = e.target, n = e.kind, r = e.index++; + return !t || r >= t.length ? { + value: e.target = void 0, + done: !0 + } : 'keys' == n ? { + value: r, + done: !1 + } : 'values' == n ? { + value: t[r], + done: !1 + } : { + value: [ + r, + t[r] + ], + done: !1 + }; + }, 'values'), o.Arguments = o.Array, i('keys'), i('values'), i('entries'); + }, + 132: function (e, t) { + e.exports = { + CSSRuleList: 0, + CSSStyleDeclaration: 0, + CSSValueList: 0, + ClientRectList: 0, + DOMRectList: 0, + DOMStringList: 0, + DOMTokenList: 1, + DataTransferItemList: 0, + FileList: 0, + HTMLAllCollection: 0, + HTMLCollection: 0, + HTMLFormElement: 0, + HTMLSelectElement: 0, + MediaList: 0, + MimeTypeArray: 0, + NamedNodeMap: 0, + NodeList: 1, + PaintRequestList: 0, + Plugin: 0, + PluginArray: 0, + SVGLengthList: 0, + SVGNumberList: 0, + SVGPathSegList: 0, + SVGPointList: 0, + SVGStringList: 0, + SVGTransformList: 0, + SourceBufferList: 0, + StyleSheetList: 0, + TextTrackCueList: 0, + TextTrackList: 0, + TouchList: 0 + }; + }, + 133: function (e, t, n) { + n(14)({ + target: 'Set', + stat: !0 + }, { from: n(134) }); + }, + 134: function (e, t, n) { + 'use strict'; + var s = n(21), d = n(24), f = n(18); + e.exports = function (e, t, n) { + var r, i, o, a, c = arguments.length, u = 1 < c ? t : void 0; + return s(this), (r = void 0 !== u) && s(u), null == e ? new this() : (i = [], r ? (o = 0, a = d(u, 2 < c ? n : void 0, 2), f(e, function (e) { + i.push(a(e, o++)); + })) : f(e, i.push, i), new this(i)); + }; + }, + 135: function (e, t, n) { + n(14)({ + target: 'Set', + stat: !0 + }, { of: n(136) }); + }, + 136: function (e, t, n) { + 'use strict'; + e.exports = function () { + for (var e = arguments.length, t = new Array(e); e--;) + t[e] = arguments[e]; + return new this(t); + }; + }, + 137: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(138); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + addAll: function () { + return o.apply(this, arguments); + } + }); + }, + 138: function (e, t, n) { + 'use strict'; + var i = n(15), o = n(21); + e.exports = function () { + for (var e = i(this), t = o(e.add), n = 0, r = arguments.length; n < r; n++) + t.call(e, arguments[n]); + return e; + }; + }, + 139: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(140); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + deleteAll: function () { + return o.apply(this, arguments); + } + }); + }, + 14: function (e, t, n) { + 'use strict'; + function y(r) { + function e(e, t, n) { + if (this instanceof r) { + switch (arguments.length) { + case 0: + return new r(); + case 1: + return new r(e); + case 2: + return new r(e, t); + } + return new r(e, t, n); + } + return r.apply(this, arguments); + } + return e.prototype = r.prototype, e; + } + var h = n(26), m = n(100).f, S = n(102), A = n(43), E = n(24), O = n(32), T = n(28); + e.exports = function (e, t) { + var n, r, i, o, a, c, u, s, d = e.target, f = e.global, l = e.stat, p = e.proto, g = f ? h : l ? h[d] : (h[d] || {}).prototype, b = f ? A : A[d] || (A[d] = {}), v = b.prototype; + for (i in t) + n = !S(f ? i : d + (l ? '.' : '#') + i, e.forced) && g && T(g, i), a = b[i], n && (c = e.noTargetGet ? (s = m(g, i)) && s.value : g[i]), o = n && c ? c : t[i], n && typeof a == typeof o || (u = e.bind && n ? E(o, h) : e.wrap && n ? y(o) : p && 'function' == typeof o ? E(Function.call, o) : o, (e.sham || o && o.sham || a && a.sham) && O(u, 'sham', !0), b[i] = u, p && (T(A, r = d + 'Prototype') || O(A, r, {}), A[r][i] = o, e.real && v && !v[i] && O(v, i, o))); + }; + }, + 140: function (e, t, n) { + 'use strict'; + var a = n(15), c = n(21); + e.exports = function () { + for (var e, t = a(this), n = c(t.delete), r = !0, i = 0, o = arguments.length; i < o; i++) + e = n.call(t, arguments[i]), r = r && e; + return !!r; + }; + }, + 141: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(24), c = n(37), u = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + every: function (e, t) { + var n = o(this), r = c(n), i = a(e, 1 < arguments.length ? t : void 0, 3); + return !u(r, function (e) { + if (!i(e, e, n)) + return u.stop(); + }, void 0, !1, !0).stopped; + } + }); + }, + 142: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(29), a = n(15), c = n(21), u = n(41), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + difference: function (e) { + var t = a(this), n = new (u(t, o('Set')))(t), r = c(n.delete); + return s(e, function (e) { + r.call(n, e); + }), n; + } + }); + }, + 143: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), c = n(29), u = n(15), s = n(21), d = n(24), f = n(41), l = n(37), p = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + filter: function (e, t) { + var n = u(this), r = l(n), i = d(e, 1 < arguments.length ? t : void 0, 3), o = new (f(n, c('Set')))(), a = s(o.add); + return p(r, function (e) { + i(e, e, n) && a.call(o, e); + }, void 0, !1, !0), o; + } + }); + }, + 144: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(24), c = n(37), u = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + find: function (e, t) { + var n = o(this), r = c(n), i = a(e, 1 < arguments.length ? t : void 0, 3); + return u(r, function (e) { + if (i(e, e, n)) + return u.stop(e); + }, void 0, !1, !0).result; + } + }); + }, + 145: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(29), a = n(15), c = n(21), u = n(41), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + intersection: function (e) { + var t = a(this), n = new (u(t, o('Set')))(), r = c(t.has), i = c(n.add); + return s(e, function (e) { + r.call(t, e) && i.call(n, e); + }), n; + } + }); + }, + 146: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(21), c = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + isDisjointFrom: function (e) { + var t = o(this), n = a(t.has); + return !c(e, function (e) { + if (!0 === n.call(t, e)) + return c.stop(); + }).stopped; + } + }); + }, + 147: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(29), a = n(15), c = n(21), u = n(90), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + isSubsetOf: function (e) { + var t = u(this), n = a(e), r = n.has; + return 'function' != typeof r && (n = new (o('Set'))(e), r = c(n.has)), !s(t, function (e) { + if (!1 === r.call(n, e)) + return s.stop(); + }, void 0, !1, !0).stopped; + } + }); + }, + 148: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(21), c = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + isSupersetOf: function (e) { + var t = o(this), n = a(t.has); + return !c(e, function (e) { + if (!1 === n.call(t, e)) + return c.stop(); + }).stopped; + } + }); + }, + 149: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(37), c = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + join: function (e) { + var t = o(this), n = a(t), r = void 0 === e ? ',' : String(e), i = []; + return c(n, i.push, i, !1, !0), i.join(r); + } + }); + }, + 15: function (e, t, n) { + var r = n(27); + e.exports = function (e) { + if (!r(e)) + throw TypeError(String(e) + ' is not an object'); + return e; + }; + }, + 150: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), c = n(29), u = n(15), s = n(21), d = n(24), f = n(41), l = n(37), p = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + map: function (e, t) { + var n = u(this), r = l(n), i = d(e, 1 < arguments.length ? t : void 0, 3), o = new (f(n, c('Set')))(), a = s(o.add); + return p(r, function (e) { + a.call(o, i(e, e, n)); + }, void 0, !1, !0), o; + } + }); + }, + 151: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), a = n(15), c = n(21), u = n(37), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + reduce: function (t, e) { + var n = a(this), r = u(n), i = arguments.length < 2, o = i ? void 0 : e; + if (c(t), s(r, function (e) { + o = i ? (i = !1, e) : t(o, e, e, n); + }, void 0, !1, !0), i) + throw TypeError('Reduce of empty set with no initial value'); + return o; + } + }); + }, + 152: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(15), a = n(24), c = n(37), u = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + some: function (e, t) { + var n = o(this), r = c(n), i = a(e, 1 < arguments.length ? t : void 0, 3); + return u(r, function (e) { + if (i(e, e, n)) + return u.stop(); + }, void 0, !1, !0).stopped; + } + }); + }, + 153: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(29), a = n(15), c = n(21), u = n(41), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + symmetricDifference: function (e) { + var t = a(this), n = new (u(t, o('Set')))(t), r = c(n.delete), i = c(n.add); + return s(e, function (e) { + r.call(n, e) || i.call(n, e); + }), n; + } + }); + }, + 154: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(16), o = n(29), a = n(15), c = n(21), u = n(41), s = n(18); + r({ + target: 'Set', + proto: !0, + real: !0, + forced: i + }, { + union: function (e) { + var t = a(this), n = new (u(t, o('Set')))(t); + return s(e, c(n.add), n), n; + } + }); + }, + 155: function (e, t, n) { + n(89), n(156); + var r = n(43); + e.exports = r.Array.from; + }, + 156: function (e, t, n) { + var r = n(14), i = n(157); + r({ + target: 'Array', + stat: !0, + forced: !n(159)(function (e) { + Array.from(e); + }) + }, { from: i }); + }, + 157: function (e, t, n) { + 'use strict'; + var v = n(24), y = n(57), h = n(82), m = n(81), S = n(50), A = n(158), E = n(61); + e.exports = function (e, t, n) { + var r, i, o, a, c, u, s = y(e), d = 'function' == typeof this ? this : Array, f = arguments.length, l = 1 < f ? t : void 0, p = void 0 !== l, g = E(s), b = 0; + if (p && (l = v(l, 2 < f ? n : void 0, 2)), null == g || d == Array && m(g)) + for (i = new d(r = S(s.length)); b < r; b++) + u = p ? l(s[b], b) : s[b], A(i, b, u); + else + for (c = (a = g.call(s)).next, i = new d(); !(o = c.call(a)).done; b++) + u = p ? h(a, l, [ + o.value, + b + ], !0) : o.value, A(i, b, u); + return i.length = b, i; + }; + }, + 158: function (e, t, n) { + 'use strict'; + var i = n(55), o = n(33), a = n(46); + e.exports = function (e, t, n) { + var r = i(t); + r in e ? o.f(e, r, a(0, n)) : e[r] = n; + }; + }, + 159: function (e, t, n) { + var i = n(22)('iterator'), o = !1; + try { + var r = 0, a = { + next: function () { + return { done: !!r++ }; + }, + return: function () { + o = !0; + } + }; + a[i] = function () { + return this; + }, Array.from(a, function () { + throw 2; + }); + } catch (e) { + } + e.exports = function (e, t) { + if (!t && !o) + return !1; + var n = !1; + try { + var r = {}; + r[i] = function () { + return { + next: function () { + return { done: n = !0 }; + } + }; + }, e(r); + } catch (e) { + } + return n; + }; + }, + 16: function (e, t) { + e.exports = !0; + }, + 160: function (e, t) { + e.exports = function e(t) { + var n = Array.isArray(t) ? [] : {}; + for (var r in t) { + var i = t[r]; + n[r] = i && 'object' == typeof i ? e(i) : i; + } + return n; + }; + }, + 161: function (e, t, n) { + 'use strict'; + t.a = function (e, t, n, r, i) { + for (t = t.split ? t.split('.') : t, r = 0; r < t.length; r++) + e = e ? e[t[r]] : i; + return e === i ? n : e; + }; + }, + 162: function (e, t, n) { + 'use strict'; + t.a = function (e, t, n) { + t.split && (t = t.split('.')); + for (var r, i = 0, o = t.length, a = e; i < o; ++i) + r = a[t[i]], a = a[t[i]] = i === o - 1 ? n : null != r ? r : !~t[i + 1].indexOf('.') && -1 < +t[i + 1] ? [] : {}; + }; + }, + 163: function (e, t) { + h.SYNC = 1, h.ASYNC = 2, h.QUEUE = 4; + var g = 'fun-hooks'; + var n = Object.freeze({ + useProxy: !0, + ready: 0 + }), b = new WeakMap(), r = '2,1,0' === [1].reduce(function (e, t, n) { + return [ + e, + t, + n + ]; + }, 2).toString() ? Array.prototype.reduce : function (e, t) { + var n, r = Object(this), i = r.length >>> 0, o = 0; + if (t) + n = t; + else { + for (; o < i && !(o in r);) + o++; + n = r[o++]; + } + for (; o < i;) + o in r && (n = e(n, r[o], o, r)), o++; + return n; + }; + function v(e, t) { + return Array.prototype.slice.call(e, t); + } + var y = Object.assign || function (e) { + return r.call(v(arguments, 1), function (t, n) { + return n && Object.keys(n).forEach(function (e) { + t[e] = n[e]; + }), t; + }, e); + }; + function h(u) { + var s, e = {}, d = []; + function t(e, t) { + return 'function' == typeof e ? f.call(null, 'sync', e, t) : 'string' == typeof e && 'function' == typeof t ? f.apply(null, arguments) : 'object' == typeof e ? function (o, e, a) { + var t = !0; + void 0 === e && (e = Object.getOwnPropertyNames(o), t = !1); + var c = {}, n = ['constructor']; + for (; (e = e.filter(function (e) { + return !('function' != typeof o[e] || -1 !== n.indexOf(e) || e.match(/^_/)); + })).forEach(function (e) { + var t, n = e.split(':'), r = n[0], i = n[1] || 'sync'; + c[r] || (t = o[r], c[r] = o[r] = f(i, t, a ? [ + a, + r + ] : void 0)); + }), o = Object.getPrototypeOf(o), t && o;); + return c; + }.apply(null, arguments) : void 0; + } + function l(o) { + var a = Array.isArray(o) ? o : o.split('.'); + return r.call(a, function (t, n, e) { + var r = t[n], i = !1; + return r || (e === a.length - 1 ? (s || d.push(function () { + i || console.warn(g + ': referenced \'' + o + '\' but it was never created'); + }), t[n] = p(function (e) { + t[n] = e, i = !0; + })) : t[n] = {}); + }, e); + } + function p(r) { + var o = [], a = [], c = function () { + }, e = { + before: function (e, t) { + return n.call(this, o, 'before', e, t); + }, + after: function (e, t) { + return n.call(this, a, 'after', e, t); + }, + getHooks: function (n) { + var e = o.concat(a); + 'object' == typeof n && (e = e.filter(function (t) { + return Object.keys(n).every(function (e) { + return t[e] === n[e]; + }); + })); + try { + y(e, { + remove: function () { + return e.forEach(function (e) { + e.remove(); + }), this; + } + }); + } catch (e) { + console.error('error adding `remove` to array, did you modify Array.prototype?'); + } + return e; + }, + removeAll: function () { + return this.getHooks().remove(); + } + }, t = { + install: function (e, t, n) { + this.type = e, (c = n)(o, a), r && r(t); + } + }; + return b.set(e.after, t), e; + function n(t, e, n, r) { + var i = { + hook: n, + type: e, + priority: r || 10, + remove: function () { + var e = t.indexOf(i); + -1 !== e && (t.splice(e, 1), c(o, a)); + } + }; + return t.push(i), t.sort(function (e, t) { + return t.priority - e.priority; + }), c(o, a), this; + } + } + function f(f, e, t) { + var n = e.after && b.get(e.after); + if (n) { + if (n.type !== f) + throw g + ': recreated hookable with different type'; + return e; + } + var r, i, o = t ? l(t) : p(), a = { + get: function (e, t) { + return o[t] || Reflect.get.apply(Reflect, arguments); + } + }; + return s || d.push(c), u.useProxy && 'function' == typeof Proxy && Proxy.revocable ? i = new Proxy(e, a) : y(i = function () { + return a.apply ? a.apply(e, this, v(arguments)) : e.apply(this, arguments); + }, o), b.get(i.after).install(f, i, function (e, t) { + var s, d = []; + r = e.length || t.length ? (e.forEach(n), s = d.push(void 0) - 1, t.forEach(n), function (n, r, e) { + var i, o = 0, a = 'async' === f && 'function' == typeof e[e.length - 1] && e.pop(); + function c(e) { + 'sync' === f ? i = e : a && a.apply(null, arguments); + } + function u(e) { + if (d[o]) { + var t = v(arguments); + return u.bail = c, t.unshift(u), d[o++].apply(r, t); + } + 'sync' === f ? i = e : a && a.apply(null, arguments); + } + return d[s] = function () { + var e = v(arguments, 1); + 'async' === f && a && (delete u.bail, e.push(u)); + var t = n.apply(r, e); + 'sync' === f && u(t); + }, u.apply(null, e), i; + }) : void 0; + function n(e) { + d.push(e.hook); + } + c(); + }), i; + function c() { + !s && ('sync' !== f || u.ready & h.SYNC) && ('async' !== f || u.ready & h.ASYNC) ? 'sync' !== f && u.ready & h.QUEUE ? a.apply = function () { + var e = arguments; + d.push(function () { + i.apply(e[1], e[2]); + }); + } : a.apply = function () { + throw g + ': hooked function not ready'; + } : a.apply = r; + } + } + return (u = y({}, n, u)).ready ? t.ready = function () { + s = !0, function (e) { + for (var t; t = e.shift();) + t(); + }(d); + } : s = !0, t.get = l, t; + } + e.exports = h; + }, + 17: function (e, t, n) { + 'use strict'; + t.a = function () { + return window.pbjs; + }, window.pbjs = window.pbjs || {}, window.pbjs.cmd = window.pbjs.cmd || [], window.pbjs.que = window.pbjs.que || [], window._pbjsGlobals = window._pbjsGlobals || [], window._pbjsGlobals.push('pbjs'); + }, + 18: function (e, t, n) { + function p(e, t) { + this.stopped = e, this.result = t; + } + var g = n(15), b = n(81), v = n(50), y = n(24), h = n(61), m = n(82); + (e.exports = function (e, t, n, r, i) { + var o, a, c, u, s, d, f, l = y(t, n, r ? 2 : 1); + if (i) + o = e; + else { + if ('function' != typeof (a = h(e))) + throw TypeError('Target is not iterable'); + if (b(a)) { + for (c = 0, u = v(e.length); c < u; c++) + if ((s = r ? l(g(f = e[c])[0], f[1]) : l(e[c])) && s instanceof p) + return s; + return new p(!1); + } + o = a.call(e); + } + for (d = o.next; !(f = d.call(o)).done;) + if ('object' == typeof (s = m(o, l, f.value, r)) && s && s instanceof p) + return s; + return new p(!1); + }).stop = function (e) { + return new p(!0, e); + }; + }, + 2: function (e, t, n) { + 'use strict'; + n.d(t, 'c', function () { + return r; + }), n.d(t, 'd', function () { + return i; + }), n.d(t, 'b', function () { + return o; + }), n.d(t, 'a', function () { + return a; + }); + var r = 'native', i = 'video', o = 'banner', a = 'adpod'; + }, + 20: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return r; + }); + var h = n(3), m = n(0); + var S, r = (S = window, function () { + var e, t = [], n = function (e) { + try { + if (!e.location.ancestorOrigins) + return; + return e.location.ancestorOrigins; + } catch (e) { + } + }(S), r = h.b.getConfig('maxNestedIframes'), i = !1, o = 0, a = !1, c = !1; + do { + var u, s, d = b, f = c, l = void 0, p = !1, g = null, c = !1, b = b ? b.parent : S; + try { + l = b.location.href || null; + } catch (e) { + p = !0; + } + if (p) + if (f) { + var v = d.context; + try { + s = g = v.sourceUrl, a = !0, b === S.top && (i = !0), v.canonicalUrl && (e = v.canonicalUrl); + } catch (e) { + } + } else { + Object(m.logWarn)('Trying to access cross domain iframe. Continuing without referrer and location'); + try { + var y = d.document.referrer; + y && (g = y, b === S.top && (i = !0)); + } catch (e) { + } + !g && n && n[o - 1] && (g = n[o - 1]), g && !a && (s = g); + } + else + l && (s = g = l, a = !1, b === S.top && (i = !0, (u = function (e) { + try { + var t = e.querySelector('link[rel=\'canonical\']'); + if (null !== t) + return t.href; + } catch (e) { + } + return null; + }(b.document)) && (e = u))), b.context && b.context.sourceUrl && (c = !0); + t.push(g), o++; + } while (b !== S.top && o < r); + return t.reverse(), { + referer: s || null, + reachedTop: i, + isAmp: a, + numIframes: o - 1, + stack: t, + canonicalUrl: e || null + }; + }); + }, + 21: function (e, t) { + e.exports = function (e) { + if ('function' != typeof e) + throw TypeError(String(e) + ' is not a function'); + return e; + }; + }, + 22: function (e, t, n) { + var r = n(26), i = n(75), o = n(28), a = n(59), c = n(77), u = n(106), s = i('wks'), d = r.Symbol, f = u ? d : d && d.withoutSetter || a; + e.exports = function (e) { + return o(s, e) || (c && o(d, e) ? s[e] = d[e] : s[e] = f('Symbol.' + e)), s[e]; + }; + }, + 23: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return u; + }); + var r = n(0), s = n(35), i = n(10), o = n.n(i), a = n(5); + var d, c, u = (d = [], (c = {}).addWinningBid = function (t) { + var e = o()(d, function (e) { + return e.getAuctionId() === t.auctionId; + }); + e ? (t.status = a.BID_STATUS.RENDERED, e.addWinningBid(t)) : Object(r.logWarn)('Auction not found when adding winning bid'); + }, c.getAllWinningBids = function () { + return d.map(function (e) { + return e.getWinningBids(); + }).reduce(r.flatten, []); + }, c.getBidsRequested = function () { + return d.map(function (e) { + return e.getBidRequests(); + }).reduce(r.flatten, []); + }, c.getNoBids = function () { + return d.map(function (e) { + return e.getNoBids(); + }).reduce(r.flatten, []); + }, c.getBidsReceived = function () { + return d.map(function (e) { + if (e.getAuctionStatus() === s.a) + return e.getBidsReceived(); + }).reduce(r.flatten, []).filter(function (e) { + return e; + }); + }, c.getAllBidsForAdUnitCode = function (t) { + return d.map(function (e) { + return e.getBidsReceived(); + }).reduce(r.flatten, []).filter(function (e) { + return e && e.adUnitCode === t; + }); + }, c.getAdUnits = function () { + return d.map(function (e) { + return e.getAdUnits(); + }).reduce(r.flatten, []); + }, c.getAdUnitCodes = function () { + return d.map(function (e) { + return e.getAdUnitCodes(); + }).reduce(r.flatten, []).filter(r.uniques); + }, c.createAuction = function (e) { + var t, n = e.adUnits, r = e.adUnitCodes, i = e.callback, o = e.cbTimeout, a = e.labels, c = e.auctionId, u = Object(s.k)({ + adUnits: n, + adUnitCodes: r, + callback: i, + cbTimeout: o, + labels: a, + auctionId: c + }); + return t = u, d.push(t), u; + }, c.findBidByAdId = function (t) { + return o()(d.map(function (e) { + return e.getBidsReceived(); + }).reduce(r.flatten, []), function (e) { + return e.adId === t; + }); + }, c.getStandardBidderAdServerTargeting = function () { + return Object(s.j)()[a.JSON_MAPPING.ADSERVER_TARGETING]; + }, c.setStatusForBids = function (e, t) { + var n, r = c.findBidByAdId(e); + r && (r.status = t), !r || t !== a.BID_STATUS.BID_TARGETING_SET || (n = o()(d, function (e) { + return e.getAuctionId() === r.auctionId; + })) && n.setBidTargeting(r); + }, c.getLastAuctionId = function () { + return d.length && d[d.length - 1].getAuctionId(); + }, c); + }, + 230: function (e, t, n) { + n(231); + var r = n(52); + e.exports = r('Array', 'findIndex'); + }, + 231: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(56).findIndex, o = n(51), a = n(60), c = 'findIndex', u = !0, s = a(c); + c in [] && Array(1)[c](function () { + u = !1; + }), r({ + target: 'Array', + proto: !0, + forced: u || !s + }, { + findIndex: function (e, t) { + return i(this, e, 1 < arguments.length ? t : void 0); + } + }), o(c); + }, + 238: function (e, t, n) { + 'use strict'; + t.a = function () { + window.addEventListener('message', u, !1); + }; + var r = n(9), b = n.n(r), v = n(38), i = n(5), o = n.n(i), y = n(0), h = n(23), a = n(10), m = n.n(a), S = n(12), c = n(13), d = n.n(c), A = o.a.EVENTS.BID_WON; + function u(e) { + var t, n, r, i, o, a, c, u, s, d = e.message ? 'message' : 'data', f = {}; + try { + f = JSON.parse(e[d]); + } catch (e) { + return; + } + if (f && f.adId) { + var l, p = m()(h.a.getBidsReceived(), function (e) { + return e.adId === f.adId; + }); + if (p && 'Prebid Request' === f.message && (n = e, r = (t = p).adId, i = t.ad, o = t.adUrl, a = t.width, c = t.height, u = t.renderer, s = t.cpm, Object(S.c)(u) ? Object(S.b)(u, t) : r && (E(t), n.source.postMessage(JSON.stringify({ + message: 'Prebid Response', + ad: Object(y.replaceAuctionPrice)(i, s), + adUrl: Object(y.replaceAuctionPrice)(o, s), + adId: r, + width: a, + height: c + }), n.origin)), h.a.addWinningBid(p), b.a.emit(A, p)), p && 'Prebid Native' === f.message) { + if ('assetRequest' === f.action) { + var g = Object(v.d)(f, p); + return void e.source.postMessage(JSON.stringify(g), e.origin); + } + if ('allAssetRequest' === f.action ? (l = Object(v.c)(f, p), e.source.postMessage(JSON.stringify(l), e.origin)) : 'resizeNativeHeight' === f.action && (p.height = f.height, p.width = f.width, E(p)), 'click' === Object(v.b)(f, p)) + return; + h.a.addWinningBid(p), b.a.emit(A, p); + } + } + } + function E(e) { + var a = e.adId, c = e.adUnitCode, u = e.width, s = e.height; + [ + 'div', + 'iframe' + ].forEach(function (e) { + var t, n, r, i, o = (t = e + ':not([style*="display: none"])', n = function (e, t) { + return window.googletag ? function (n) { + return m()(window.googletag.pubads().getSlots(), function (t) { + return m()(t.getTargetingKeys(), function (e) { + return d()(t.getTargeting(e), n); + }); + }).getSlotElementId(); + }(e) : window.apntag ? function (e) { + var t = window.apntag.getTag(e); + return t && t.targetId; + }(t) : t; + }(a, c), (r = document.getElementById(n)) && r.querySelector(t)); + o ? ((i = o.style).width = u + 'px', i.height = s + 'px') : Object(y.logWarn)('Unable to locate matching page element for adUnitCode '.concat(c, '. Can\'t resize it to ad\'s dimensions. Please review setup.')); + }); + } + }, + 239: function (e, t, n) { + 'use strict'; + t.a = function (e) { + const $___old_22f3bba103115352 = {}.constructor.getOwnPropertyDescriptor(window, 'sessionStorage'); + try { + if ($___old_22f3bba103115352) + ({}.constructor.defineProperty(window, 'sessionStorage', $___mock_16c53395a822db48.sessionStorage)); + return function () { + var t; + try { + e = e || window.sessionStorage, t = JSON.parse(e.getItem(u)); + } catch (e) { + } + t && p(t, !0); + }.apply(this, arguments); + } finally { + if ($___old_22f3bba103115352) + ({}.constructor.defineProperty(window, 'sessionStorage', $___old_22f3bba103115352)); + } + }; + var r, i, o = n(3), a = n(0), c = n(35), u = 'pbjs:debugging'; + function s(e) { + Object(a.logMessage)('DEBUG: ' + e); + } + function d(e) { + Object(a.logWarn)('DEBUG: ' + e); + } + function f(e) { + r = function (e, t, n) { + if (b(this.bidders, n.bidderCode)) + return void d('bidder \''.concat(n.bidderCode, '\' excluded from auction by bidder overrides')); + Array.isArray(this.bids) && this.bids.forEach(function (e) { + g(e, n.bidderCode, t) || v(e, n, 'bidder'); + }); + e(t, n); + }.bind(e), c.c.before(r, 5), i = function (e, t) { + var r = this, n = t.filter(function (e) { + return !b(r.bidders, e.bidderCode) || (d('bidRequest \''.concat(e.bidderCode, '\' excluded from auction by bidder overrides')), !1); + }); + Array.isArray(r.bidRequests) && n.forEach(function (n) { + r.bidRequests.forEach(function (t) { + n.bids.forEach(function (e) { + g(t, n.bidderCode, e.adUnitCode) || v(t, e, 'bidRequest'); + }); + }); + }); + e(n); + }.bind(e), c.e.before(i, 5); + } + function l() { + c.c.getHooks({ hook: r }).remove(), c.e.getHooks({ hook: i }).remove(); + } + function p(e, t) { + var n = 1 < arguments.length && void 0 !== t && t; + o.b.setConfig({ debug: !0 }), l(), f(e), s('bidder overrides enabled'.concat(n ? ' from session' : '')); + } + function g(e, t, n) { + return e.bidder && e.bidder !== t || !(!e.adUnitCode || e.adUnitCode === n); + } + function b(e, t) { + return Array.isArray(e) && -1 === e.indexOf(t); + } + function v(n, e, r) { + return Object.keys(n).filter(function (e) { + return -1 === [ + 'adUnitCode', + 'bidder' + ].indexOf(e); + }).reduce(function (e, t) { + return s('bidder overrides changed \''.concat(e.adUnitCode, '/').concat(e.bidderCode, '\' ').concat(r, '.').concat(t, ' from \'').concat(e[t], '.js\' to \'').concat(n[t], '\'')), e[t] = n[t], e; + }, e); + } + function y(e) { + if (e.enabled) { + try { + window.sessionStorage.setItem(u, JSON.stringify(e)); + } catch (e) { + } + p(e); + } else { + l(), s('bidder overrides disabled'); + try { + window.sessionStorage.removeItem(u); + } catch (e) { + } + } + } + o.b.getConfig('debugging', function (e) { + return y(e.debugging); + }); + }, + 24: function (e, t, n) { + var o = n(21); + e.exports = function (r, i, e) { + if (o(r), void 0 === i) + return r; + switch (e) { + case 0: + return function () { + return r.call(i); + }; + case 1: + return function (e) { + return r.call(i, e); + }; + case 2: + return function (e, t) { + return r.call(i, e, t); + }; + case 3: + return function (e, t, n) { + return r.call(i, e, t, n); + }; + } + return function () { + return r.apply(i, arguments); + }; + }; + }, + 25: function (e, t, n) { + 'use strict'; + n.d(t, 'b', function () { + return c; + }), n.d(t, 'a', function () { + return u; + }), t.d = function (e, t) { + var n = Object(o.getBidRequest)(e.requestId, t), r = n && Object(o.deepAccess)(n, 'mediaTypes.video'), i = r && Object(o.deepAccess)(r, 'context'); + return s(e, n, r, i); + }, n.d(t, 'c', function () { + return s; + }); + n(8); + var o = n(0), i = n(3), r = n(13), a = (n.n(r), n(11)), c = 'outstream', u = 'instream'; + var s = Object(a.b)('sync', function (e, t, n, r) { + return !t || n && r !== c ? i.b.getConfig('cache.url') || !e.vastXml || e.vastUrl ? !(!e.vastUrl && !e.vastXml) : (Object(o.logError)('\n This bid contains only vastXml and will not work when a prebid cache url is not specified.\n Try enabling prebid cache with pbjs.setConfig({ cache: {url: "..."} });\n '), !1) : r !== c || !!(e.renderer || t.renderer || n.renderer); + }, 'checkVideoBidSetup'); + }, + 26: function (n, e, t) { + (function (e) { + function t(e) { + return e && e.Math == Math && e; + } + n.exports = t('object' == typeof globalThis && globalThis) || t('object' == typeof window && window) || t('object' == typeof self && self) || t('object' == typeof e && e) || Function('return this')(); + }.call(e, t(36))); + }, + 27: function (e, t) { + e.exports = function (e) { + return 'object' == typeof e ? null !== e : 'function' == typeof e; + }; + }, + 28: function (e, t) { + var n = {}.hasOwnProperty; + e.exports = function (e, t) { + return n.call(e, t); + }; + }, + 29: function (e, t, n) { + function r(e) { + return 'function' == typeof e ? e : void 0; + } + var i = n(43), o = n(26); + e.exports = function (e, t) { + return arguments.length < 2 ? r(i[e]) || r(o[e]) : i[e] && i[e][t] || o[e] && o[e][t]; + }; + }, + 3: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return S; + }), n.d(t, 'b', function () { + return _; + }); + var r = n(45), i = n(10), a = n.n(i), o = n(13), c = n.n(o), u = n(79), s = n.n(u), d = n(0); + function f(e, t) { + if (null == e) + return {}; + var n, r = function (e, t) { + if (null == e) + return {}; + var n, r, i = {}, o = Object.keys(e); + for (r = 0; r < o.length; r++) + n = o[r], 0 <= t.indexOf(n) || (i[n] = e[n]); + return i; + }(e, t); + if (Object.getOwnPropertySymbols) + for (var i = Object.getOwnPropertySymbols(e), o = 0; o < i.length; o++) + n = i[o], 0 <= t.indexOf(n) || Object.prototype.propertyIsEnumerable.call(e, n) && (r[n] = e[n]); + return r; + } + function l(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function p(e) { + return (p = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function g() { + return (g = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + var b = n(91), v = n(0), y = n(5), h = 'TRUE' === v.getParameterByName(y.DEBUG_MODE).toUpperCase(), m = window.location.origin, S = 'random', A = {}; + A[S] = !0, A.fixed = !0; + var E = S, O = { + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high', + AUTO: 'auto', + DENSE: 'dense', + CUSTOM: 'custom' + }; + var T, I, j, C, w, _ = (C = [], w = null, x(), { + getCurrentBidder: function () { + return w; + }, + getConfig: function () { + if (arguments.length <= 1 && 'function' != typeof (arguments.length <= 0 ? void 0 : arguments[0])) { + var e = arguments.length <= 0 ? void 0 : arguments[0]; + return e ? v.deepAccess(B(), e) : B(); + } + return function (e, t) { + var n = t; + if ('string' != typeof e && (n = e, e = '*'), 'function' == typeof n) { + var r = { + topic: e, + callback: n + }; + return C.push(r), function () { + C.splice(C.indexOf(r), 1); + }; + } + v.logError('listener must be a function'); + }.apply(void 0, arguments); + }, + setConfig: function (r) { + var e, i; + v.isPlainObject(r) ? (e = Object.keys(r), i = {}, e.forEach(function (e) { + var t = 'fpd' === e ? 'ortb2' : e, n = 'fpd' === e ? U(r[e]) : r[e]; + v.isPlainObject(T[t]) && v.isPlainObject(n) && (n = g({}, T[t], n)), i[t] = I[t] = n; + }), k(i)) : v.logError('setConfig options must be an object'); + }, + setDefaults: function (e) { + v.isPlainObject(T) ? (g(T, e), g(I, e)) : v.logError('defaults must be an object'); + }, + resetConfig: x, + runWithBidder: D, + callbackWithBidder: function (o) { + return function (i) { + return function () { + if ('function' == typeof i) { + for (var e, t = arguments.length, n = new Array(t), r = 0; r < t; r++) + n[r] = arguments[r]; + return D(o, (e = v.bind).call.apply(e, [ + i, + this + ].concat(n))); + } + v.logWarn('config.callbackWithBidder callback is not a function'); + }; + }; + }, + setBidderConfig: function (i) { + try { + !function (e) { + if (!v.isPlainObject(e)) + throw 'setBidderConfig bidder options must be an object'; + if (!Array.isArray(e.bidders) || !e.bidders.length) + throw 'setBidderConfig bidder options must contain a bidders list with at least 1 bidder'; + if (!v.isPlainObject(e.config)) + throw 'setBidderConfig bidder options must contain a config object'; + }(i), i.bidders.forEach(function (r) { + j[r] || (j[r] = {}), Object.keys(i.config).forEach(function (e) { + var t = 'fpd' === e ? 'ortb2' : e, n = 'fpd' === e ? U(i.config[e]) : i.config[e]; + v.isPlainObject(n) ? j[r][t] = g({}, j[r][t] || {}, n) : j[r][t] = n; + }); + }); + } catch (e) { + v.logError(e); + } + }, + getBidderConfig: function () { + return j; + }, + convertAdUnitFpd: function (e) { + var t = []; + return e.forEach(function (e) { + e.fpd ? (e.ortb2Imp ? v.mergeDeep(e.ortb2Imp, R(e.fpd)) : e.ortb2Imp = R(e.fpd), t.push((e.fpd, f(e, ['fpd'])))) : t.push(e); + }), t; + }, + getLegacyFpd: function (r) { + if ('object' === p(r)) { + var t = {}; + return Object.keys(r).forEach(function (n) { + var e = 'site' === n ? 'context' : n; + t[e] = 'context' === e || 'user' === e ? Object.keys(r[n]).filter(function (e) { + return 'data' !== e; + }).reduce(function (e, t) { + return 'ext' === t ? v.mergeDeep(e, r[n][t]) : v.mergeDeep(e, l({}, t, r[n][t])), e; + }, {}) : r[n]; + }), t; + } + }, + getLegacyImpFpd: function (t) { + if ('object' === p(t)) { + var n = {}; + return v.deepAccess(t, 'ext.data') && Object.keys(t.ext.data).forEach(function (e) { + 'pbadslot' === e ? v.mergeDeep(n, { context: { pbAdSlot: t.ext.data[e] } }) : 'adserver' === e ? v.mergeDeep(n, { context: { adServer: t.ext.data[e] } }) : v.mergeDeep(n, { context: { data: l({}, e, t.ext.data[e]) } }); + }), n; + } + } + }); + function x() { + T = {}; + var n = { + _debug: h, + get debug() { + return this._debug; + }, + set debug(e) { + this._debug = e; + }, + _bidderTimeout: 3000, + get bidderTimeout() { + return this._bidderTimeout; + }, + set bidderTimeout(e) { + this._bidderTimeout = e; + }, + _publisherDomain: m, + get publisherDomain() { + return this._publisherDomain; + }, + set publisherDomain(e) { + this._publisherDomain = e; + }, + _priceGranularity: O.MEDIUM, + set priceGranularity(e) { + o(e) && ('string' == typeof e ? this._priceGranularity = i(e) ? e : O.MEDIUM : v.isPlainObject(e) && (this._customPriceBucket = e, this._priceGranularity = O.CUSTOM, v.logMessage('Using custom price granularity'))); + }, + get priceGranularity() { + return this._priceGranularity; + }, + _customPriceBucket: {}, + get customPriceBucket() { + return this._customPriceBucket; + }, + _mediaTypePriceGranularity: {}, + get mediaTypePriceGranularity() { + return this._mediaTypePriceGranularity; + }, + set mediaTypePriceGranularity(n) { + var r = this; + this._mediaTypePriceGranularity = Object.keys(n).reduce(function (e, t) { + return o(n[t]) ? 'string' == typeof n ? e[t] = i(n[t]) ? n[t] : r._priceGranularity : v.isPlainObject(n) && (e[t] = n[t], v.logMessage('Using custom price granularity for '.concat(t))) : v.logWarn('Invalid price granularity for media type: '.concat(t)), e; + }, {}); + }, + _sendAllBids: !0, + get enableSendAllBids() { + return this._sendAllBids; + }, + set enableSendAllBids(e) { + this._sendAllBids = e; + }, + _useBidCache: !1, + get useBidCache() { + return this._useBidCache; + }, + set useBidCache(e) { + this._useBidCache = e; + }, + _deviceAccess: !0, + get deviceAccess() { + return this._deviceAccess; + }, + set deviceAccess(e) { + this._deviceAccess = e; + }, + _bidderSequence: E, + get bidderSequence() { + return this._bidderSequence; + }, + set bidderSequence(e) { + A[e] ? this._bidderSequence = e : v.logWarn('Invalid order: '.concat(e, '. Bidder Sequence was not set.')); + }, + _timeoutBuffer: 400, + get timeoutBuffer() { + return this._timeoutBuffer; + }, + set timeoutBuffer(e) { + this._timeoutBuffer = e; + }, + _disableAjaxTimeout: !1, + get disableAjaxTimeout() { + return this._disableAjaxTimeout; + }, + set disableAjaxTimeout(e) { + this._disableAjaxTimeout = e; + }, + _maxNestedIframes: 10, + get maxNestedIframes() { + return this._maxNestedIframes; + }, + set maxNestedIframes(e) { + this._maxNestedIframes = e; + }, + _auctionOptions: {}, + get auctionOptions() { + return this._auctionOptions; + }, + set auctionOptions(e) { + !function (e) { + if (!v.isPlainObject(e)) + return v.logWarn('Auction Options must be an object'), !1; + for (var t = 0, n = Object.keys(e); t < n.length; t++) { + var r = n[t]; + if ('secondaryBidders' !== r) + return v.logWarn('Auction Options given an incorrect param: '.concat(r)), !1; + if ('secondaryBidders' === r) { + if (!v.isArray(e[r])) + return v.logWarn('Auction Options '.concat(r, ' must be of type Array')), !1; + if (!e[r].every(v.isStr)) + return v.logWarn('Auction Options '.concat(r, ' must be only string')), !1; + } + } + return !0; + }(e) || (this._auctionOptions = e); + } + }; + function i(t) { + return a()(Object.keys(O), function (e) { + return t === O[e]; + }); + } + function o(e) { + if (e) { + if ('string' == typeof e) + i(e) || v.logWarn('Prebid Warning: setPriceGranularity was called with invalid setting, using `medium` as default.'); + else if (v.isPlainObject(e) && !Object(r.b)(e)) + return void v.logError('Invalid custom price value passed to `setPriceGranularity()`'); + return 1; + } + v.logError('Prebid Error: no value passed to `setPriceGranularity()`'); + } + I && k(Object.keys(I).reduce(function (e, t) { + return I[t] !== n[t] && (e[t] = n[t] || {}), e; + }, {})), I = n, j = {}; + } + function B() { + if (w && j && v.isPlainObject(j[w])) { + var n = j[w], e = new s.a(Object.keys(I).concat(Object.keys(n))); + return b(e).reduce(function (e, t) { + return void 0 === n[t] ? e[t] = I[t] : void 0 !== I[t] && v.isPlainObject(n[t]) ? e[t] = Object(d.mergeDeep)({}, I[t], n[t]) : e[t] = n[t], e; + }, {}); + } + return g({}, I); + } + function U(r) { + var t = {}; + return Object.keys(r).forEach(function (n) { + var e = 'context' === n ? 'site' : n; + t[e] = 'site' === e || 'user' === e ? Object.keys(r[n]).reduce(function (e, t) { + return 'data' === t ? v.mergeDeep(e, { ext: { data: r[n][t] } }) : v.mergeDeep(e, l({}, t, r[n][t])), e; + }, {}) : r[n]; + }), t; + } + function R(r) { + var i = {}; + return Object.keys(r).filter(function (e) { + return 'context' === e; + }).forEach(function (n) { + Object.keys(r[n]).forEach(function (t) { + 'data' === t ? v.mergeDeep(i, { ext: { data: r[n][t] } }) : 'object' !== p(r[n][t]) || Array.isArray(r[n][t]) ? v.mergeDeep(i, { ext: { data: l({}, t.toLowerCase(), r[n][t]) } }) : Object.keys(r[n][t]).forEach(function (e) { + v.mergeDeep(i, { ext: { data: l({}, t.toLowerCase(), l({}, e.toLowerCase(), r[n][t][e])) } }); + }); + }); + }), i; + } + function k(t) { + var n = Object.keys(t); + C.filter(function (e) { + return c()(n, e.topic); + }).forEach(function (e) { + e.callback(l({}, e.topic, t[e.topic])); + }), C.filter(function (e) { + return '*' === e.topic; + }).forEach(function (e) { + return e.callback(t); + }); + } + function D(e, t) { + w = e; + try { + return t(); + } finally { + w = null; + } + } + }, + 30: function (e, t, n) { + var r = n(31); + e.exports = !r(function () { + return 7 != Object.defineProperty({}, 1, { + get: function () { + return 7; + } + })[1]; + }); + }, + 31: function (e, t) { + e.exports = function (e) { + try { + return !!e(); + } catch (e) { + return !0; + } + }; + }, + 32: function (e, t, n) { + var r = n(30), i = n(33), o = n(46); + e.exports = r ? function (e, t, n) { + return i.f(e, t, o(1, n)); + } : function (e, t, n) { + return e[t] = n, e; + }; + }, + 33: function (e, t, n) { + var r = n(30), i = n(73), o = n(15), a = n(55), c = Object.defineProperty; + t.f = r ? c : function (e, t, n) { + if (o(e), t = a(t, !0), o(n), i) + try { + return c(e, t, n); + } catch (e) { + } + if ('get' in n || 'set' in n) + throw TypeError('Accessors not supported'); + return 'value' in n && (e[t] = n.value), e; + }; + }, + 34: function (e, t, n) { + 'use strict'; + t.a = function (e, t) { + return new r(e, t); + }; + var i = n(0); + function r(e, t) { + var n = t && t.src || 'client', r = e || 0; + this.bidderCode = t && t.bidder || '', this.width = 0, this.height = 0, this.statusMessage = function () { + switch (r) { + case 0: + return 'Pending'; + case 1: + return 'Bid available'; + case 2: + return 'Bid returned empty or error response'; + case 3: + return 'Bid timed out'; + } + }(), this.adId = i.getUniqueIdentifierStr(), this.requestId = t && t.bidId, this.mediaType = 'banner', this.source = n, this.getStatusCode = function () { + return r; + }, this.getSize = function () { + return this.width + 'x' + this.height; + }; + } + }, + 35: function (e, t, n) { + 'use strict'; + n.d(t, 'b', function () { + return L; + }), n.d(t, 'a', function () { + return F; + }), t.k = function (e) { + var t, i, b, v, o = e.adUnits, n = e.adUnitCodes, r = e.callback, a = e.cbTimeout, c = e.labels, u = e.auctionId, y = o, s = c, d = n, h = [], f = [], l = [], p = u || P.generateUUID(), g = r, m = a, S = [], A = new Set(); + function E() { + return { + auctionId: p, + timestamp: t, + auctionEnd: i, + auctionStatus: b, + adUnits: y, + adUnitCodes: d, + labels: s, + bidderRequests: h, + noBids: l, + bidsReceived: f, + winningBids: S, + timeout: m + }; + } + function O(n, e) { + var r, t; + e && clearTimeout(v), void 0 === i && (r = [], n && (P.logMessage('Auction '.concat(p, ' timedOut')), t = A, (r = h.map(function (e) { + return (e.bids || []).filter(function (e) { + return !t.has(e.bidder); + }); + }).reduce(C.flatten, []).map(function (e) { + return { + bidId: e.bidId, + bidder: e.bidder, + adUnitCode: e.adUnitCode, + auctionId: e.auctionId + }; + })).length && q.emit(G.EVENTS.BID_TIMEOUT, r)), b = F, i = Date.now(), q.emit(G.EVENTS.AUCTION_END, E()), Q(y, function () { + try { + var e; + null != g && (e = f.filter(P.bind.call(C.adUnitsFilter, this, d)).reduce(ee, {}), g.apply(pbjs, [ + e, + n, + p + ]), g = null); + } catch (e) { + P.logError('Error executing bidsBackHandler', null, e); + } finally { + r.length && M.callTimedOutBidders(o, r, m); + var t = x.b.getConfig('userSync') || {}; + t.enableOverride || N(t.syncDelay); + } + })); + } + function T() { + P.logInfo('Bids Received for Auction with id: '.concat(p), f), b = F, O(!1, !0); + } + function I(e) { + A.add(e); + } + function j(n) { + var f = this; + n.forEach(function (e) { + var t; + t = e, h = h.concat(t); + }); + var l = {}, e = { + bidRequests: n, + run: function () { + var e, t; + e = O.bind(null, !0), t = setTimeout(e, m), v = t, b = L, q.emit(G.EVENTS.AUCTION_INIT, E()); + var r, i, o, a, c, u, s = (r = T, i = f, o = 0, a = !1, c = new Set(), u = {}, { + addBidResponse: function (e, t) { + u[t.requestId] = !0, o++; + var n = function (e) { + var t = e.adUnitCode, n = e.bid, r = e.bidderRequest, i = e.auctionId, o = r.start, a = D({}, n, { + auctionId: i, + responseTimestamp: Object(C.timestamp)(), + requestTimestamp: o, + cpm: parseFloat(n.cpm) || 0, + bidder: n.bidderCode, + adUnitCode: t + }); + a.timeToRespond = a.responseTimestamp - a.requestTimestamp, q.emit(G.EVENTS.BID_ADJUSTMENT, a); + var c = r.bids && B()(r.bids, function (e) { + return e.adUnitCode == t && e.bidId == a.requestId; + }), u = c && c.renderer, s = a.mediaType, d = c && c.mediaTypes && c.mediaTypes[s], f = d && d.renderer, l = null; + f && f.url && f.render && (!0 !== f.backupOnly || !n.renderer) ? l = f : u && u.url && u.render && (!0 !== u.backupOnly || !n.renderer) && (l = u), l && (a.renderer = _.a.install({ url: l.url }), a.renderer.setRender(l.render)); + var p = Z(n.mediaType, c, x.b.getConfig('mediaTypePriceGranularity')), g = Object(w.a)(a.cpm, 'object' === k(p) ? p : x.b.getConfig('customPriceBucket'), x.b.getConfig('currency.granularityMultiplier')); + return a.pbLg = g.low, a.pbMg = g.med, a.pbHg = g.high, a.pbAg = g.auto, a.pbDg = g.dense, a.pbCg = g.custom, a; + }({ + adUnitCode: e, + bid: t, + bidderRequest: this, + auctionId: i.getAuctionId() + }); + 'video' === n.mediaType ? function (e, t, n, r) { + var i = !0, o = Object(C.getBidRequest)(t.originalRequestId || t.requestId, [n]), a = o && Object(C.deepAccess)(o, 'mediaTypes.video'), c = a && Object(C.deepAccess)(a, 'context'); + x.b.getConfig('cache.url') && c !== R.b && (!t.videoCacheKey || x.b.getConfig('cache.ignoreBidderCacheKey') ? (i = !1, X(e, t, r, o)) : t.vastUrl || (P.logError('videoCacheKey specified but not required vastUrl for video bid'), i = !1)), i && ($(e, t), r()); + }(i, n, this, d) : ($(i, n), d()); + }, + adapterDone: function () { + var t, e = i.getBidRequests(), n = x.b.getConfig('auctionOptions'); + c.add(this), !n || P.isEmpty(n) || (t = n.secondaryBidders) && !e.every(function (e) { + return U()(t, e.bidderCode); + }) && (e = e.filter(function (e) { + return !U()(t, e.bidderCode); + })), a = e.every(function (e) { + return c.has(e); + }), this.bids.forEach(function (e) { + u[e.bidId] || (i.addNoBid(e), q.emit(G.EVENTS.NO_BID, e)); + }), a && 0 === o && r(); + } + }); + function d() { + o--, a && 0 === o && r(); + } + M.callBids(y, n, function () { + for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) + t[n] = arguments[n]; + J.apply({ + dispatch: s.addBidResponse, + bidderRequest: this + }, t); + }, s.adapterDone, { + request: function (e, t) { + g(V, t), g(l, e), H[e] || (H[e] = { + SRA: !0, + origin: t + }), 1 < l[e] && (H[e].SRA = !1); + }, + done: function (e) { + V[e]--, K[0] && p(K[0]) && K.shift(); + } + }, m, I); + } + }; + function p(e) { + var r = !0, i = x.b.getConfig('maxRequestsPerOrigin') || z; + return e.bidRequests.some(function (e) { + var t = 1, n = void 0 !== e.src && e.src === G.S2S.SRC ? 's2s' : e.bidderCode; + return H[n] && (!1 === H[n].SRA && (t = Math.min(e.bids.length, i)), V[H[n].origin] + t > i && (r = !1)), !r; + }), r && e.run(), r; + } + function g(e, t) { + void 0 === e[t] ? e[t] = 1 : e[t]++; + } + p(e) || (P.logWarn('queueing auction due to limited endpoint capacity'), K.push(e)); + } + return { + addBidReceived: function (e) { + f = f.concat(e); + }, + addNoBid: function (e) { + l = l.concat(e); + }, + executeCallback: O, + callBids: function () { + b = W, t = Date.now(); + var e = M.makeBidRequests(y, t, p, m, s); + P.logInfo('Bids Requested for Auction with id: '.concat(p), e), e.length < 1 ? (P.logWarn('No valid bid requests returned for auction'), T()) : Y.call({ + dispatch: j, + context: this + }, e); + }, + addWinningBid: function (e) { + S = S.concat(e), M.callBidWonBidder(e.bidder, e, o); + }, + setBidTargeting: function (e) { + M.callSetTargetingBidder(e.bidder, e); + }, + getWinningBids: function () { + return S; + }, + getTimeout: function () { + return m; + }, + getAuctionId: function () { + return p; + }, + getAuctionStatus: function () { + return b; + }, + getAdUnits: function () { + return y; + }, + getAdUnitCodes: function () { + return d; + }, + getBidRequests: function () { + return h; + }, + getBidsReceived: function () { + return f; + }, + getNoBids: function () { + return l; + } + }; + }, n.d(t, 'c', function () { + return J; + }), n.d(t, 'e', function () { + return Y; + }), t.g = d, t.d = $, n.d(t, 'f', function () { + return X; + }), n.d(t, 'i', function () { + return f; + }), n.d(t, 'h', function () { + return l; + }), t.j = g; + var C = n(0), w = n(45), a = n(38), o = n(94), _ = n(12), x = n(3), r = n(44), i = n(11), c = n(10), B = n.n(c), u = n(13), U = n.n(u), R = n(25), s = n(2); + function k(e) { + return (k = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function D() { + return (D = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + var N = r.a.syncUsers, P = n(0), M = n(8).default, q = n(9), G = n(5), W = 'started', L = 'inProgress', F = 'completed'; + q.on(G.EVENTS.BID_ADJUSTMENT, function (e) { + !function (e) { + var t, n = e.bidderCode, r = e.cpm; + if (pbjs.bidderSettings && (n && pbjs.bidderSettings[n] && 'function' == typeof pbjs.bidderSettings[n].bidCpmAdjustment ? t = pbjs.bidderSettings[n].bidCpmAdjustment : pbjs.bidderSettings[G.JSON_MAPPING.BD_SETTING_STANDARD] && 'function' == typeof pbjs.bidderSettings[G.JSON_MAPPING.BD_SETTING_STANDARD].bidCpmAdjustment && (t = pbjs.bidderSettings[G.JSON_MAPPING.BD_SETTING_STANDARD].bidCpmAdjustment), t)) + try { + r = t(e.cpm, D({}, e)); + } catch (e) { + P.logError('Error during bid adjustment', 'bidmanager.js', e); + } + 0 <= r && (e.cpm = r); + }(e); + }); + var z = 4, V = {}, H = {}, K = []; + var J = Object(i.b)('async', function (e, t) { + this.dispatch.call(this.bidderRequest, e, t); + }, 'addBidResponse'), Y = Object(i.b)('sync', function (e) { + this.dispatch.call(this.context, e); + }, 'addBidderRequests'), Q = Object(i.b)('async', function (e, t) { + t && t(); + }, 'bidsBackCallback'); + function d(e, t) { + t.timeToRespond > e.getTimeout() + x.b.getConfig('timeoutBuffer') && e.executeCallback(!0); + } + function $(e, t) { + var n = e.getBidRequests(), r = B()(n, function (e) { + return e.bidderCode === t.bidderCode; + }); + !function (t, e) { + var n; + { + var r; + t.bidderCode && (0 < t.cpm || t.dealId) && (r = B()(e.bids, function (e) { + return e.adUnitCode === t.adUnitCode; + }), n = function (e, t, n) { + if (!t) + return {}; + var r = {}, i = pbjs.bidderSettings; + { + var o; + i && (o = g(t.mediaType, e, n), b(r, o, t), e && i[e] && i[e][G.JSON_MAPPING.ADSERVER_TARGETING] && (b(r, i[e], t), t.sendStandardTargeting = i[e].sendStandardTargeting)); + } + t.native && (r = D({}, r, Object(a.e)(t, n))); + return r; + }(t.bidderCode, t, r)); + } + t.adserverTargeting = D(t.adserverTargeting || {}, n); + }(t, r), q.emit(G.EVENTS.BID_RESPONSE, t), e.addBidReceived(t), d(e, t); + } + var X = Object(i.b)('async', function (n, r, i, e) { + Object(o.b)([r], function (e, t) { + e ? (P.logWarn('Failed to save to the video cache: '.concat(e, '. Video bid must be discarded.')), d(n, r)) : '' === t[0].uuid ? (P.logWarn('Supplied video cache key was already in use by Prebid Cache; caching attempt was rejected. Video bid must be discarded.'), d(n, r)) : (r.videoCacheKey = t[0].uuid, r.vastUrl || (r.vastUrl = Object(o.a)(r.videoCacheKey)), $(n, r), i()); + }, e); + }, 'callPrebidCache'); + function Z(e, t, n) { + if (e && n) { + if (e === s.d) { + var r = Object(C.deepAccess)(t, 'mediaTypes.'.concat(s.d, '.context'), 'instream'); + if (n[''.concat(s.d, '-').concat(r)]) + return n[''.concat(s.d, '-').concat(r)]; + } + return n[e]; + } + } + var f = function (e, t) { + var n = Z(e, t, x.b.getConfig('mediaTypePriceGranularity')); + return 'string' == typeof e && n ? 'string' == typeof n ? n : 'custom' : x.b.getConfig('priceGranularity'); + }, l = function (t) { + return function (e) { + return t === G.GRANULARITY_OPTIONS.AUTO ? e.pbAg : t === G.GRANULARITY_OPTIONS.DENSE ? e.pbDg : t === G.GRANULARITY_OPTIONS.LOW ? e.pbLg : t === G.GRANULARITY_OPTIONS.MEDIUM ? e.pbMg : t === G.GRANULARITY_OPTIONS.HIGH ? e.pbHg : t === G.GRANULARITY_OPTIONS.CUSTOM ? e.pbCg : void 0; + }; + }, p = function () { + return function (e) { + return e.meta && e.meta.advertiserDomains && 0 < e.meta.advertiserDomains.length ? e.meta.advertiserDomains[0] : ''; + }; + }; + function g(e, t, n) { + function r(e, t) { + return { + key: e, + val: 'function' == typeof t ? function (e) { + return t(e); + } : function (e) { + return Object(C.getValue)(e, t); + } + }; + } + var i, o, a = G.TARGETING_KEYS, c = f(e, n), u = pbjs.bidderSettings; + return u[G.JSON_MAPPING.BD_SETTING_STANDARD] || (u[G.JSON_MAPPING.BD_SETTING_STANDARD] = {}), u[G.JSON_MAPPING.BD_SETTING_STANDARD][G.JSON_MAPPING.ADSERVER_TARGETING] || (u[G.JSON_MAPPING.BD_SETTING_STANDARD][G.JSON_MAPPING.ADSERVER_TARGETING] = [ + r(a.BIDDER, 'bidderCode'), + r(a.AD_ID, 'adId'), + r(a.PRICE_BUCKET, l(c)), + r(a.SIZE, 'size'), + r(a.DEAL, 'dealId'), + r(a.SOURCE, 'source'), + r(a.FORMAT, 'mediaType'), + r(a.ADOMAIN, p()) + ]), 'video' === e && (i = u[G.JSON_MAPPING.BD_SETTING_STANDARD][G.JSON_MAPPING.ADSERVER_TARGETING], [ + a.UUID, + a.CACHE_ID + ].forEach(function (t) { + void 0 === B()(i, function (e) { + return e.key === t; + }) && i.push(r(t, 'videoCacheKey')); + }), !x.b.getConfig('cache.url') || t && !1 === P.deepAccess(u, ''.concat(t, '.sendStandardTargeting')) || (o = Object(C.parseUrl)(x.b.getConfig('cache.url')), void 0 === B()(i, function (e) { + return e.key === a.CACHE_HOST; + }) && i.push(r(a.CACHE_HOST, function (e) { + return P.deepAccess(e, 'adserverTargeting.'.concat(a.CACHE_HOST)) ? e.adserverTargeting[a.CACHE_HOST] : o.hostname; + })))), u[G.JSON_MAPPING.BD_SETTING_STANDARD]; + } + function b(r, i, o) { + var e = i[G.JSON_MAPPING.ADSERVER_TARGETING]; + return o.size = o.getSize(), P._each(e, function (e) { + var t = e.key, n = e.val; + if (r[t] && P.logWarn('The key: ' + t + ' is getting ovewritten'), P.isFn(n)) + try { + n = n(o); + } catch (e) { + P.logError('bidmanager', 'ERROR', e); + } + (void 0 === i.suppressEmptyKeys || !0 !== i.suppressEmptyKeys) && t !== G.TARGETING_KEYS.DEAL || !P.isEmptyStr(n) && null != n ? r[t] = n : P.logInfo('suppressing empty key \'' + t + '\' from adserver targeting'); + }), r; + } + function ee(e, t) { + return e[t.adUnitCode] || (e[t.adUnitCode] = { bids: [] }), e[t.adUnitCode].bids.push(t), e; + } + }, + 36: function (e, t) { + var n = function () { + return this; + }(); + try { + n = n || Function('return this')() || (0, eval)('this'); + } catch (e) { + 'object' == typeof window && (n = window); + } + e.exports = n; + }, + 37: function (e, t, n) { + var r = n(16), i = n(90); + e.exports = r ? i : function (e) { + return Set.prototype.values.call(e); + }; + }, + 374: function (e, t, n) { + n(375); + var r = n(52); + e.exports = r('String', 'includes'); + }, + 375: function (e, t, n) { + 'use strict'; + var r = n(14), i = n(376), o = n(49); + r({ + target: 'String', + proto: !0, + forced: !n(378)('includes') + }, { + includes: function (e, t) { + return !!~String(o(this)).indexOf(i(e), 1 < arguments.length ? t : void 0); + } + }); + }, + 376: function (e, t, n) { + var r = n(377); + e.exports = function (e) { + if (r(e)) + throw TypeError('The method doesn\'t accept regular expressions'); + return e; + }; + }, + 377: function (e, t, n) { + var r = n(27), i = n(48), o = n(22)('match'); + e.exports = function (e) { + var t; + return r(e) && (void 0 !== (t = e[o]) ? !!t : 'RegExp' == i(e)); + }; + }, + 378: function (e, t, n) { + var r = n(22)('match'); + e.exports = function (t) { + var n = /./; + try { + '/./'[t](n); + } catch (e) { + try { + return n[r] = !1, '/./'[t](n); + } catch (e) { + } + } + return !1; + }; + }, + 38: function (e, t, n) { + 'use strict'; + n.d(t, 'f', function () { + return o; + }), n.d(t, 'a', function () { + return u; + }), t.h = function (e) { + if (e && e.type && function (e) { + return !(!e || !a()(Object.keys(s), e)) || (Object(d.logError)(''.concat(e, ' nativeParam is not supported')), !1); + }(e.type)) + return s[e.type]; + return e; + }, t.g = function (t, e) { + var n = Object(d.getBidRequest)(t.requestId, e); + if (!n) + return !1; + if (!Object(d.deepAccess)(t, 'native.clickUrl')) + return !1; + if (Object(d.deepAccess)(t, 'native.image') && (!Object(d.deepAccess)(t, 'native.image.height') || !Object(d.deepAccess)(t, 'native.image.width'))) + return !1; + if (Object(d.deepAccess)(t, 'native.icon') && (!Object(d.deepAccess)(t, 'native.icon.height') || !Object(d.deepAccess)(t, 'native.icon.width'))) + return !1; + var r = n.nativeParams; + if (!r) + return !0; + var i = Object.keys(r).filter(function (e) { + return r[e].required; + }), o = Object.keys(t.native).filter(function (e) { + return t.native[e]; + }); + return i.every(function (e) { + return a()(o, e); + }); + }, t.b = function (e, t) { + var n; + 'click' === e.action ? n = t.native && t.native.clickTrackers : (n = t.native && t.native.impressionTrackers, t.native && t.native.javascriptTrackers && Object(d.insertHtmlIntoIframe)(t.native.javascriptTrackers)); + return (n || []).forEach(d.triggerPixel), e.action; + }, t.e = function (o, a) { + var c = {}; + Object(d.deepAccess)(a, 'nativeParams.rendererUrl') ? o.native.rendererUrl = p(a.nativeParams.rendererUrl) : Object(d.deepAccess)(a, 'nativeParams.adTemplate') && (o.native.adTemplate = p(a.nativeParams.adTemplate)); + var u = !1 !== Object(d.deepAccess)(a, 'nativeParams.sendTargetingKeys'), s = function (e) { + var t = {}; + Object(d.deepAccess)(e, 'nativeParams.ext') && Object.keys(e.nativeParams.ext).forEach(function (e) { + t[e] = 'hb_native_'.concat(e); + }); + return f(f({}, l.NATIVE_KEYS), t); + }(a), e = f(f({}, o.native), o.native.ext); + return delete e.ext, Object.keys(e).forEach(function (e) { + var t, n, r = s[e], i = p(o.native[e]) || p(Object(d.deepAccess)(o, 'native.ext.'.concat(e))); + 'adTemplate' !== e && r && i && ('boolean' != typeof (t = Object(d.deepAccess)(a, 'nativeParams.'.concat(e, '.sendId'))) && (t = Object(d.deepAccess)(a, 'nativeParams.ext.'.concat(e, '.sendId'))), t && (i = ''.concat(r, ':').concat(o.adId)), 'boolean' != typeof (n = Object(d.deepAccess)(a, 'nativeParams.'.concat(e, '.sendTargetingKeys'))) && (n = Object(d.deepAccess)(a, 'nativeParams.ext.'.concat(e, '.sendTargetingKeys'))), ('boolean' == typeof n ? n : u) && (c[r] = i)); + }), c; + }, t.d = function (e, r) { + var i = { + message: 'assetResponse', + adId: e.adId, + assets: [] + }; + r.native.hasOwnProperty('adTemplate') && (i.adTemplate = p(r.native.adTemplate)); + r.native.hasOwnProperty('rendererUrl') && (i.rendererUrl = p(r.native.rendererUrl)); + return e.assets.forEach(function (e) { + var t = Object(d.getKeyByValue)(l.NATIVE_KEYS, e), n = p(r.native[t]); + i.assets.push({ + key: t, + value: n + }); + }), i; + }, t.c = function (e, r) { + var i = { + message: 'assetResponse', + adId: e.adId, + assets: [] + }; + return Object.keys(r.native).forEach(function (n, e) { + var t; + 'adTemplate' === n && r.native[n] ? i.adTemplate = p(r.native[n]) : 'rendererUrl' === n && r.native[n] ? i.rendererUrl = p(r.native[n]) : 'ext' === n ? Object.keys(r.native[n]).forEach(function (e) { + var t; + r.native[n][e] && (t = p(r.native[n][e]), i.assets.push({ + key: e, + value: t + })); + }) : r.native[n] && l.NATIVE_KEYS.hasOwnProperty(n) && (t = p(r.native[n]), i.assets.push({ + key: n, + value: t + })); + }), i; + }; + var d = n(0), r = n(13), a = n.n(r); + function i(e) { + return (i = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + function c(t, e) { + var n, r = Object.keys(t); + return Object.getOwnPropertySymbols && (n = Object.getOwnPropertySymbols(t), e && (n = n.filter(function (e) { + return Object.getOwnPropertyDescriptor(t, e).enumerable; + })), r.push.apply(r, n)), r; + } + function f(i) { + for (var e = 1; e < arguments.length; e++) { + var o = null != arguments[e] ? arguments[e] : {}; + e % 2 ? c(Object(o), !0).forEach(function (e) { + var t, n, r; + t = i, r = o[n = e], n in t ? Object.defineProperty(t, n, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[n] = r; + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(i, Object.getOwnPropertyDescriptors(o)) : c(Object(o)).forEach(function (e) { + Object.defineProperty(i, e, Object.getOwnPropertyDescriptor(o, e)); + }); + } + return i; + } + var l = n(5), o = [], u = Object.keys(l.NATIVE_KEYS).map(function (e) { + return l.NATIVE_KEYS[e]; + }), s = { + image: { + image: { required: !0 }, + title: { required: !0 }, + sponsoredBy: { required: !0 }, + clickUrl: { required: !0 }, + body: { required: !1 }, + icon: { required: !1 } + } + }; + function p(e) { + return 'object' === i(e) && e.url ? e.url : e; + } + }, + 39: function (e, t, n) { + 'use strict'; + t.a = function (r, e, t) { + if (!e || !r) + return void o.logError('cannot load external script without url and moduleCode'); + if (!i()(c, e)) + return void o.logError(''.concat(e, ' not whitelisted for loading external JavaScript')); + if (a[r]) + return t && 'function' == typeof t && (a[r].loaded ? t() : a[r].callbacks.push(t)), a[r].tag; + a[r] = { + loaded: !1, + tag: null, + callbacks: [] + }, t && 'function' == typeof t && a[r].callbacks.push(t); + return o.logWarn('module '.concat(e, ' is loading external JavaScript')), function (e, t) { + var n = document.createElement('script'); + n.type = 'text/javascript', n.async = !0, (a[r].tag = n).readyState ? n.onreadystatechange = function () { + 'loaded' !== n.readyState && 'complete' !== n.readyState || (n.onreadystatechange = null, t()); + } : n.onload = function () { + t(); + }; + return n.src = e, o.insertElement(n), n; + }(r, function () { + a[r].loaded = !0; + try { + for (var e = 0; e < a[r].callbacks.length; e++) + a[r].callbacks[e](); + } catch (e) { + o.logError('Error executing callback', 'adloader.js:loadExternalScript', e); + } + }); + }; + var r = n(13), i = n.n(r), o = n(0), a = {}, c = [ + 'adloox', + 'criteo', + 'outstream', + 'adagio', + 'browsi' + ]; + }, + 4: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return r; + }), t.b = i; + var l = n(3); + function p() { + return (p = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + function g(e) { + return (g = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function (e) { + return typeof e; + } : function (e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + var b = n(0), v = 4, r = i(); + function i() { + var s = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 3000, e = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, d = e.request, f = e.done; + return function (e, t, n) { + var r = 3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : {}; + try { + var i, o = r.method || (n ? 'POST' : 'GET'), a = document.createElement('a'); + a.href = e; + var c, u = 'object' === g(t) && null !== t ? t : { + success: function () { + b.logMessage('xhr success'); + }, + error: function (e) { + b.logError('xhr error', null, e); + } + }; + 'function' == typeof t && (u.success = t), (i = new window.XMLHttpRequest()).onreadystatechange = function () { + var e; + i.readyState === v && ('function' == typeof f && f(a.origin), 200 <= (e = i.status) && e < 300 || 304 === e ? u.success(i.responseText, i) : u.error(i.statusText, i)); + }, l.b.getConfig('disableAjaxTimeout') || (i.ontimeout = function () { + b.logError(' xhr timeout after ', i.timeout, 'ms'); + }), 'GET' === o && n && (p((c = b.parseUrl(e, r)).search, n), e = b.buildUrl(c)), i.open(o, e, !0), l.b.getConfig('disableAjaxTimeout') || (i.timeout = s), r.withCredentials && (i.withCredentials = !0), b._each(r.customHeaders, function (e, t) { + i.setRequestHeader(t, e); + }), r.preflight && i.setRequestHeader('X-Requested-With', 'XMLHttpRequest'), i.setRequestHeader('Content-Type', r.contentType || 'text/plain'), 'function' == typeof d && d(a.origin), 'POST' === o && n ? i.send(n) : i.send(); + } catch (e) { + b.logError('xhr construction', e); + } + }; + } + }, + 40: function (e, t) { + e.exports = {}; + }, + 41: function (e, t, n) { + var i = n(15), o = n(21), a = n(22)('species'); + e.exports = function (e, t) { + var n, r = i(e).constructor; + return void 0 === r || null == (n = i(r)[a]) ? t : o(n); + }; + }, + 42: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return d; + }), n.d(t, 'b', function () { + return R; + }), t.c = k, n.d(t, 'd', function () { + return l; + }); + var A = n(0), E = n(3), O = n(38), r = n(23), i = n(93), o = n(2), a = n(11), c = n(13), T = n.n(c), u = n(10), I = n.n(u); + function j() { + return (j = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + function C(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + function w(e) { + return function (e) { + if (Array.isArray(e)) + return s(e); + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(e) || function (e, t) { + if (!e) + return; + if ('string' == typeof e) + return s(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === n && e.constructor && (n = e.constructor.name); + if ('Map' === n || 'Set' === n) + return Array.from(e); + if ('Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return s(e, t); + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function s(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + var _ = n(0), x = n(5), B = [], U = Object.keys(x.TARGETING_KEYS).map(function (e) { + return x.TARGETING_KEYS[e]; + }), d = { + isBidNotExpired: function (e) { + return e.responseTimestamp + 1000 * e.ttl - 1000 > Object(A.timestamp)(); + }, + isUnusedBid: function (e) { + return e && (e.status && !T()([x.BID_STATUS.RENDERED], e.status) || !e.status); + } + }, R = Object(a.b)('sync', function (e, r) { + var i = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : 0; + if (3 < arguments.length && void 0 !== arguments[3] && arguments[3]) + return e; + var o = [], a = E.b.getConfig('sendBidsControl.dealPrioritization'), c = Object(A.groupBy)(e, 'adUnitCode'); + return Object.keys(c).forEach(function (e) { + var t = [], n = Object(A.groupBy)(c[e], 'bidderCode'); + Object.keys(n).forEach(function (e) { + return t.push(n[e].reduce(r)); + }), 0 < i ? (t = a ? t.sort(k(!0)) : t.sort(function (e, t) { + return t.cpm - e.cpm; + }), o.push.apply(o, w(t.slice(0, i)))) : o.push.apply(o, w(t)); + }), o; + }); + function k() { + var n = 0 < arguments.length && void 0 !== arguments[0] && arguments[0]; + return function (e, t) { + return void 0 !== e.adserverTargeting.hb_deal && void 0 === t.adserverTargeting.hb_deal ? -1 : void 0 === e.adserverTargeting.hb_deal && void 0 !== t.adserverTargeting.hb_deal ? 1 : n ? t.cpm - e.cpm : t.adserverTargeting.hb_pb - e.adserverTargeting.hb_pb; + }; + } + var D, N, f, l = (D = r.a, f = {}, (N = {}).setLatestAuctionForAdUnit = function (e, t) { + f[e] = t; + }, N.resetPresetTargeting = function (e, t) { + var n, i; + Object(A.isGptPubadsDefined)() && (n = M(e), i = D.getAdUnits().filter(function (e) { + return T()(n, e.code); + }), window.googletag.pubads().getSlots().forEach(function (n) { + var r = _.isFn(t) && t(n); + B.forEach(function (t) { + i.forEach(function (e) { + (e.code === n.getAdUnitPath() || e.code === n.getSlotElementId() || _.isFn(r) && r(e.code)) && n.setTargeting(t, null); + }); + }); + })); + }, N.resetPresetTargetingAST = function (e) { + M(e).forEach(function (e) { + var t, n, r = window.apntag.getTag(e); + r && r.keywords && (t = Object.keys(r.keywords), n = {}, t.forEach(function (e) { + T()(B, e.toLowerCase()) || (n[e] = r.keywords[e]); + }), window.apntag.modifyTag(e, { keywords: n })); + }); + }, N.getAllTargeting = function (e) { + var t, n, r, i, o, a, c, u, s, d, f = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : q(), l = M(e), p = (c = l, u = f, s = N.getWinningBids(c, u), d = G(), (s = s.map(function (o) { + return C({}, o.adUnitCode, Object.keys(o.adserverTargeting).filter(function (e) { + return void 0 === o.sendStandardTargeting || o.sendStandardTargeting || -1 === d.indexOf(e); + }).reduce(function (e, t) { + var n = [o.adserverTargeting[t]], r = C({}, t.substring(0, 20), n); + if (t !== x.TARGETING_KEYS.DEAL) + return [].concat(w(e), [r]); + var i = C({}, ''.concat(t, '_').concat(o.bidderCode).substring(0, 20), n); + return [].concat(w(e), [ + r, + i + ]); + }, [])); + })).concat((a = l, f.filter(function (e) { + return T()(a, e.adUnitCode); + }).map(function (e) { + return j({}, e); + }).reduce(W, []).map(L).filter(function (e) { + return e; + }))).concat(E.b.getConfig('enableSendAllBids') ? (n = l, r = f, i = U.concat(O.a), o = E.b.getConfig('sendBidsControl.bidLimit'), R(r, A.getHighestCpm, o).map(function (t) { + if (P(t, n)) + return C({}, t.adUnitCode, F(t, i.filter(function (e) { + return void 0 !== t.adserverTargeting[e]; + }))); + }).filter(function (e) { + return e; + })) : function (e, t) { + if (!0 !== E.b.getConfig('targetingControls.alwaysIncludeDeals')) + return []; + var n = U.concat(O.a); + return R(t, A.getHighestCpm).map(function (t) { + if (t.dealId && P(t, e)) + return C({}, t.adUnitCode, F(t, n.filter(function (e) { + return void 0 !== t.adserverTargeting[e]; + }))); + }).filter(function (e) { + return e; + }); + }(l, f)).concat((t = l, D.getAdUnits().filter(function (e) { + return T()(t, e.code) && g(e); + }).map(function (e) { + return C({}, e.code, (t = g(e), Object.keys(t).map(function (e) { + return C({}, e, _.isArray(t[e]) ? t[e] : t[e].split(',')); + }))); + var t; + })))); + function g(e) { + return Object(A.deepAccess)(e, x.JSON_MAPPING.ADSERVER_TARGETING); + } + p.map(function (t) { + Object.keys(t).map(function (e) { + t[e].map(function (e) { + -1 === B.indexOf(Object.keys(e)[0]) && (B = Object.keys(e).concat(B)); + }); + }); + }); + var b = Object.keys(j({}, x.DEFAULT_TARGETING_KEYS, x.NATIVE_KEYS)), v = E.b.getConfig('targetingControls.allowTargetingKeys') || b; + Array.isArray(v) && 0 < v.length && (p = function (e, r) { + var i = j({}, x.TARGETING_KEYS, x.NATIVE_KEYS), o = Object.keys(i), a = {}; + Object(A.logInfo)('allowTargetingKeys - allowed keys [ '.concat(r.map(function (e) { + return i[e]; + }).join(', '), ' ]')), e.map(function (e) { + var t = Object.keys(e)[0], n = e[t].filter(function (e) { + var n = Object.keys(e)[0], t = 0 === o.filter(function (e) { + return 0 === n.indexOf(i[e]); + }).length || I()(r, function (e) { + var t = i[e]; + return 0 === n.indexOf(t); + }); + return a[n] = !t, t; + }); + e[t] = n; + }); + var t = Object.keys(a).filter(function (e) { + return a[e]; + }); + return Object(A.logInfo)('allowTargetingKeys - removed keys [ '.concat(t.join(', '), ' ]')), e.filter(function (e) { + return 0 < e[Object.keys(e)[0]].length; + }); + }(p, v)), p = p.map(function (e) { + return C({}, Object.keys(e)[0], e[Object.keys(e)[0]].map(function (e) { + return C({}, Object.keys(e)[0], e[Object.keys(e)[0]].join(', ')); + }).reduce(function (e, t) { + return j(t, e); + }, {})); + }).reduce(function (e, t) { + var n = Object.keys(t)[0]; + return e[n] = j({}, e[n], t[n]), e; + }, {}); + var y, h, m, S = E.b.getConfig('targetingControls.auctionKeyMaxChars'); + return S && (Object(A.logInfo)('Detected \'targetingControls.auctionKeyMaxChars\' was active for this auction; set with a limit of '.concat(S, ' characters. Running checks on auction keys...')), y = p, h = S, m = Object(A.deepClone)(y), p = Object.keys(m).map(function (e) { + return { + adUnitCode: e, + adserverTargeting: m[e] + }; + }).sort(k()).reduce(function (e, t, n, r) { + var i, o = (i = t.adserverTargeting, Object.keys(i).reduce(function (e, t) { + return e + ''.concat(t, '%3d').concat(encodeURIComponent(i[t]), '%26'); + }, '')); + n + 1 === r.length && (o = o.slice(0, -3)); + var a = t.adUnitCode, c = o.length; + return c <= h ? (h -= c, Object(A.logInfo)('AdUnit \''.concat(a, '\' auction keys comprised of ').concat(c, ' characters. Deducted from running threshold; new limit is ').concat(h), m[a]), e[a] = m[a]) : Object(A.logWarn)('The following keys for adUnitCode \''.concat(a, '\' exceeded the current limit of the \'auctionKeyMaxChars\' setting.\nThe key-set size was ').concat(c, ', the current allotted amount was ').concat(h, '.\n'), m[a]), n + 1 === r.length && 0 === Object.keys(e).length && Object(A.logError)('No auction targeting keys were permitted due to the setting in setConfig(targetingControls.auctionKeyMaxChars). Please review setup and consider adjusting.'), e; + }, {})), l.forEach(function (e) { + p[e] || (p[e] = {}); + }), p; + }, N.setTargetingForGPT = function (i, e) { + window.googletag.pubads().getSlots().forEach(function (r) { + Object.keys(i).filter((e || Object(A.isAdUnitCodeMatchingSlot))(r)).forEach(function (n) { + return Object.keys(i[n]).forEach(function (t) { + var e = i[n][t]; + 'string' == typeof e && (e = e.split(',')), (e = 1 < e.length ? [e] : e).map(function (e) { + return _.logMessage('Attempting to set key value for slot: '.concat(r.getSlotElementId(), ' key: ').concat(t, ' value: ').concat(e)), e; + }).forEach(function (e) { + r.setTargeting(t, e); + }); + }); + }); + }); + }, N.getWinningBids = function (e) { + var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : q(), t = M(e); + return n.filter(function (e) { + return T()(t, e.adUnitCode); + }).filter(function (e) { + return 0 < e.cpm; + }).map(function (e) { + return e.adUnitCode; + }).filter(A.uniques).map(function (t) { + return n.filter(function (e) { + return e.adUnitCode === t ? e : null; + }).reduce(A.getHighestCpm); + }); + }, N.setTargetingForAst = function (e) { + var r = N.getAllTargeting(e); + try { + N.resetPresetTargetingAST(e); + } catch (e) { + _.logError('unable to reset targeting for AST' + e); + } + Object.keys(r).forEach(function (n) { + return Object.keys(r[n]).forEach(function (e) { + var t; + _.logMessage('Attempting to set targeting for targetId: '.concat(n, ' key: ').concat(e, ' value: ').concat(r[n][e])), (_.isStr(r[n][e]) || _.isArray(r[n][e])) && (t = {}, e.search(/pt[0-9]/) < 0 ? t[e.toUpperCase()] = r[n][e] : t[e] = r[n][e], window.apntag.setKeywords(n, t, { overrideKeyValue: !0 })); + }); + }); + }, N.isApntagDefined = function () { + if (window.apntag && _.isFn(window.apntag.setKeywords)) + return !0; + }, N); + function P(e, t) { + return e.adserverTargeting && t && (_.isArray(t) && T()(t, e.adUnitCode) || 'string' == typeof t && e.adUnitCode === t); + } + function M(e) { + return 'string' == typeof e ? [e] : _.isArray(e) ? e : D.getAdUnitCodes() || []; + } + function q() { + var e = D.getBidsReceived(); + return E.b.getConfig('useBidCache') || (e = e.filter(function (e) { + return f[e.adUnitCode] === e.auctionId; + })), e = e.filter(function (e) { + return Object(A.deepAccess)(e, 'video.context') !== o.a; + }).filter(function (e) { + return 'banner' !== e.mediaType || Object(i.c)([ + e.width, + e.height + ]); + }).filter(d.isUnusedBid).filter(d.isBidNotExpired), R(e, A.getOldestHighestCpmBid); + } + function G() { + return D.getStandardBidderAdServerTargeting().map(function (e) { + return e.key; + }).concat(U).filter(A.uniques); + } + function W(r, i, e, t) { + return Object.keys(i.adserverTargeting).filter(p()).forEach(function (e) { + var t, n; + r.length && r.filter((n = e, function (e) { + return e.adUnitCode === i.adUnitCode && e.adserverTargeting[n]; + })).forEach((t = e, function (e) { + _.isArray(e.adserverTargeting[t]) || (e.adserverTargeting[t] = [e.adserverTargeting[t]]), e.adserverTargeting[t] = e.adserverTargeting[t].concat(i.adserverTargeting[t]).filter(A.uniques), delete i.adserverTargeting[t]; + })); + }), r.push(i), r; + } + function p() { + var t = G().concat(O.a); + return function (e) { + return -1 === t.indexOf(e); + }; + } + function L(t) { + return C({}, t.adUnitCode, Object.keys(t.adserverTargeting).filter(p()).map(function (e) { + return C({}, e.substring(0, 20), [t.adserverTargeting[e]]); + })); + } + function F(t, e) { + return e.map(function (e) { + return C({}, ''.concat(e, '_').concat(t.bidderCode).substring(0, 20), [t.adserverTargeting[e]]); + }); + } + }, + 43: function (e, t) { + e.exports = {}; + }, + 44: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return S; + }); + var a = n(0), r = n(3), i = n(13), o = n.n(i), c = n(7); + function u(e, t) { + return function (e) { + if (Array.isArray(e)) + return e; + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) + return; + var n = [], r = !0, i = !1, o = void 0; + try { + for (var a, c = e[Symbol.iterator](); !(r = (a = c.next()).done) && (n.push(a.value), !t || n.length !== t); r = !0); + } catch (e) { + i = !0, o = e; + } finally { + try { + r || null == c.return || c.return(); + } finally { + if (i) + throw o; + } + } + return n; + }(e, t) || function (e, t) { + if (!e) + return; + if ('string' == typeof e) + return s(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === n && e.constructor && (n = e.constructor.name); + if ('Map' === n || 'Set' === n) + return Array.from(e); + if ('Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return s(e, t); + }(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function s(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function d() { + return (d = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + r.b.setDefaults({ + userSync: a.deepClone({ + syncEnabled: !0, + filterSettings: { + image: { + bidders: '*', + filter: 'include' + } + }, + syncsPerBidder: 5, + syncDelay: 3000, + auctionDelay: 0 + }) + }); + var f = Object(c.a)('usersync'); + var l, p, g, b, v, y, h, m = !a.isSafariBrowser() && f.cookiesAreEnabled(), S = (l = { + config: r.b.getConfig('userSync'), + browserSupportsCookies: m + }, p = {}, g = A(), b = new Set(), y = { + image: !0, + iframe: !(v = {}) + }, h = l.config, r.b.getConfig('userSync', function (e) { + var t; + e.userSync && (t = e.userSync.filterSettings, a.isPlainObject(t) && (t.image || t.all || (e.userSync.filterSettings.image = { + bidders: '*', + filter: 'include' + }))), h = d(h, e.userSync); + }), p.registerSync = function (e, t, n) { + return b.has(t) ? a.logMessage('already fired syncs for "'.concat(t, '", ignoring registerSync call')) : h.syncEnabled && a.isArray(g[e]) ? t ? 0 !== h.syncsPerBidder && Number(v[t]) >= h.syncsPerBidder ? a.logWarn('Number of user syncs exceeded for "'.concat(t, '"')) : p.canBidderRegisterSync(e, t) ? (g[e].push([ + t, + n + ]), (r = v)[i = t] ? r[i] += 1 : r[i] = 1, void (v = r)) : a.logWarn('Bidder "'.concat(t, '" not permitted to register their "').concat(e, '" userSync pixels.')) : a.logWarn('Bidder is required for registering sync') : a.logWarn('User sync type "'.concat(e, '" not supported')); + var r, i; + }, p.syncUsers = function () { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : 0; + if (e) + return setTimeout(E, Number(e)); + E(); + }, p.triggerUserSyncs = function () { + h.enableOverride && p.syncUsers(); + }, p.canBidderRegisterSync = function (e, t) { + return !h.filterSettings || !T(e, t); + }, p); + function A() { + return { + image: [], + iframe: [] + }; + } + function E() { + if (h.syncEnabled && l.browserSupportsCookies) { + try { + !function () { + if (!y.image) + return; + O(g.image, function (e) { + var t = u(e, 2), n = t[0], r = t[1]; + a.logMessage('Invoking image pixel user sync for bidder: '.concat(n)), a.triggerPixel(r); + }); + }(), function () { + if (!y.iframe) + return; + O(g.iframe, function (e) { + var t = u(e, 2), n = t[0], r = t[1]; + a.logMessage('Invoking iframe user sync for bidder: '.concat(n)), a.insertUserSyncIframe(r); + }); + }(); + } catch (e) { + return a.logError('Error firing user syncs', e); + } + g = A(); + } + } + function O(e, t) { + a.shuffle(e).forEach(function (e) { + t(e), b.add(e[0]); + }); + } + function T(e, t) { + var n = h.filterSettings; + if (function (e, t) { + if (e.all && e[t]) + return a.logWarn('Detected presence of the "filterSettings.all" and "filterSettings.'.concat(t, '" in userSync config. You cannot mix "all" with "iframe/image" configs; they are mutually exclusive.')), !1; + var n = e.all ? e.all : e[t], r = e.all ? 'all' : t; + if (!n) + return !1; + var i = n.filter, o = n.bidders; + if (i && 'include' !== i && 'exclude' !== i) + return a.logWarn('UserSync "filterSettings.'.concat(r, '.filter" setting \'').concat(i, '\' is not a valid option; use either \'include\' or \'exclude\'.')), !1; + return !!('*' === o || Array.isArray(o) && 0 < o.length && o.every(function (e) { + return a.isStr(e) && '*' !== e; + })) || (a.logWarn('Detected an invalid setup in userSync "filterSettings.'.concat(r, '.bidders"; use either \'*\' (to represent all bidders) or an array of bidders.')), !1); + }(n, e)) { + y[e] = !0; + var r = n.all ? n.all : n[e], i = '*' === r.bidders ? [t] : r.bidders; + return { + include: function (e, t) { + return !o()(e, t); + }, + exclude: function (e, t) { + return o()(e, t); + } + }[r.filter || 'include'](i, t); + } + return !y[e]; + } + }, + 45: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return d; + }), n.d(t, 'b', function () { + return h; + }); + var r = n(10), v = n.n(r), i = n(0), y = 2, o = { + buckets: [{ + max: 5, + increment: 0.5 + }] + }, a = { + buckets: [{ + max: 20, + increment: 0.1 + }] + }, c = { + buckets: [{ + max: 20, + increment: 0.01 + }] + }, u = { + buckets: [ + { + max: 3, + increment: 0.01 + }, + { + max: 8, + increment: 0.05 + }, + { + max: 20, + increment: 0.5 + } + ] + }, s = { + buckets: [ + { + max: 5, + increment: 0.05 + }, + { + max: 10, + increment: 0.1 + }, + { + max: 20, + increment: 0.5 + } + ] + }; + function d(e, t) { + var n = 2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : 1, r = parseFloat(e); + return isNaN(r) && (r = ''), { + low: '' === r ? '' : f(e, o, n), + med: '' === r ? '' : f(e, a, n), + high: '' === r ? '' : f(e, c, n), + auto: '' === r ? '' : f(e, s, n), + dense: '' === r ? '' : f(e, u, n), + custom: '' === r ? '' : f(e, t, n) + }; + } + function f(n, e, r) { + var i = ''; + if (!h(e)) + return i; + var t, o, a, c, u, s, d, f, l, p = e.buckets.reduce(function (e, t) { + return e.max > t.max ? e : t; + }, { max: 0 }), g = 0, b = v()(e.buckets, function (e) { + if (n > p.max * r) { + var t = e.precision; + void 0 === t && (t = y), i = (e.max * r).toFixed(t); + } else { + if (n <= e.max * r && g * r <= n) + return e.min = g, e; + g = e.max; + } + }); + return b && (t = n, a = r, c = void 0 !== (o = b).precision ? o.precision : y, u = o.increment * a, s = o.min * a, d = Math.pow(10, c + 2), f = (t * d - s * d) / (u * d), l = Math.floor(f) * u + s, i = (l = Number(l.toFixed(10))).toFixed(c)), i; + } + function h(e) { + if (i.isEmpty(e) || !e.buckets || !Array.isArray(e.buckets)) + return !1; + var t = !0; + return e.buckets.forEach(function (e) { + e.max && e.increment || (t = !1); + }), t; + } + }, + 46: function (e, t) { + e.exports = function (e, t) { + return { + enumerable: !(1 & e), + configurable: !(2 & e), + writable: !(4 & e), + value: t + }; + }; + }, + 47: function (e, t, n) { + var r = n(72), i = n(49); + e.exports = function (e) { + return r(i(e)); + }; + }, + 48: function (e, t) { + var n = {}.toString; + e.exports = function (e) { + return n.call(e).slice(8, -1); + }; + }, + 49: function (e, t) { + e.exports = function (e) { + if (null == e) + throw TypeError('Can\'t call method on ' + e); + return e; + }; + }, + 5: function (e, t) { + e.exports = { + JSON_MAPPING: { + PL_CODE: 'code', + PL_SIZE: 'sizes', + PL_BIDS: 'bids', + BD_BIDDER: 'bidder', + BD_ID: 'paramsd', + BD_PL_ID: 'placementId', + ADSERVER_TARGETING: 'adserverTargeting', + BD_SETTING_STANDARD: 'standard' + }, + DEBUG_MODE: 'pbjs_debug', + STATUS: { + GOOD: 1, + NO_BID: 2 + }, + CB: { + TYPE: { + ALL_BIDS_BACK: 'allRequestedBidsBack', + AD_UNIT_BIDS_BACK: 'adUnitBidsBack', + BID_WON: 'bidWon', + REQUEST_BIDS: 'requestBids' + } + }, + EVENTS: { + AUCTION_INIT: 'auctionInit', + AUCTION_END: 'auctionEnd', + BID_ADJUSTMENT: 'bidAdjustment', + BID_TIMEOUT: 'bidTimeout', + BID_REQUESTED: 'bidRequested', + BID_RESPONSE: 'bidResponse', + NO_BID: 'noBid', + BID_WON: 'bidWon', + BIDDER_DONE: 'bidderDone', + SET_TARGETING: 'setTargeting', + BEFORE_REQUEST_BIDS: 'beforeRequestBids', + REQUEST_BIDS: 'requestBids', + ADD_AD_UNITS: 'addAdUnits', + AD_RENDER_FAILED: 'adRenderFailed', + TCF2_ENFORCEMENT: 'tcf2Enforcement', + AUCTION_DEBUG: 'auctionDebug', + BID_VIEWABLE: 'bidViewable' + }, + AD_RENDER_FAILED_REASON: { + PREVENT_WRITING_ON_MAIN_DOCUMENT: 'preventWritingOnMainDocument', + NO_AD: 'noAd', + EXCEPTION: 'exception', + CANNOT_FIND_AD: 'cannotFindAd', + MISSING_DOC_OR_ADID: 'missingDocOrAdid' + }, + EVENT_ID_PATHS: { bidWon: 'adUnitCode' }, + GRANULARITY_OPTIONS: { + LOW: 'low', + MEDIUM: 'medium', + HIGH: 'high', + AUTO: 'auto', + DENSE: 'dense', + CUSTOM: 'custom' + }, + TARGETING_KEYS: { + BIDDER: 'hb_bidder', + AD_ID: 'hb_adid', + PRICE_BUCKET: 'hb_pb', + SIZE: 'hb_size', + DEAL: 'hb_deal', + SOURCE: 'hb_source', + FORMAT: 'hb_format', + UUID: 'hb_uuid', + CACHE_ID: 'hb_cache_id', + CACHE_HOST: 'hb_cache_host', + ADOMAIN: 'hb_adomain' + }, + DEFAULT_TARGETING_KEYS: { + BIDDER: 'hb_bidder', + AD_ID: 'hb_adid', + PRICE_BUCKET: 'hb_pb', + SIZE: 'hb_size', + DEAL: 'hb_deal', + SOURCE: 'hb_source', + FORMAT: 'hb_format', + UUID: 'hb_uuid', + CACHE_ID: 'hb_cache_id', + CACHE_HOST: 'hb_cache_host' + }, + NATIVE_KEYS: { + title: 'hb_native_title', + body: 'hb_native_body', + body2: 'hb_native_body2', + privacyLink: 'hb_native_privacy', + privacyIcon: 'hb_native_privicon', + sponsoredBy: 'hb_native_brand', + image: 'hb_native_image', + icon: 'hb_native_icon', + clickUrl: 'hb_native_linkurl', + displayUrl: 'hb_native_displayurl', + cta: 'hb_native_cta', + rating: 'hb_native_rating', + address: 'hb_native_address', + downloads: 'hb_native_downloads', + likes: 'hb_native_likes', + phone: 'hb_native_phone', + price: 'hb_native_price', + salePrice: 'hb_native_saleprice', + rendererUrl: 'hb_renderer_url', + adTemplate: 'hb_adTemplate' + }, + S2S: { + SRC: 's2s', + DEFAULT_ENDPOINT: 'https://prebid.adnxs.com/pbs/v1/openrtb2/auction', + SYNCED_BIDDERS_KEY: 'pbjsSyncs' + }, + BID_STATUS: { + BID_TARGETING_SET: 'targetingSet', + RENDERED: 'rendered', + BID_REJECTED: 'bidRejected' + } + }; + }, + 50: function (e, t, n) { + var r = n(58), i = Math.min; + e.exports = function (e) { + return 0 < e ? i(r(e), 9007199254740991) : 0; + }; + }, + 51: function (e, t) { + e.exports = function () { + }; + }, + 52: function (e, t, n) { + var r = n(29); + e.exports = r; + }, + 53: function (e, t) { + e.exports = {}; + }, + 54: function (e, t, n) { + var r, i, o, a, c, u, s, d, f = n(115), l = n(26), p = n(27), g = n(32), b = n(28), v = n(65), y = n(53), h = l.WeakMap; + s = f ? (r = new h(), i = r.get, o = r.has, a = r.set, c = function (e, t) { + return a.call(r, e, t), t; + }, u = function (e) { + return i.call(r, e) || {}; + }, function (e) { + return o.call(r, e); + }) : (y[d = v('state')] = !0, c = function (e, t) { + return g(e, d, t), t; + }, u = function (e) { + return b(e, d) ? e[d] : {}; + }, function (e) { + return b(e, d); + }), e.exports = { + set: c, + get: u, + has: s, + enforce: function (e) { + return s(e) ? u(e) : c(e, {}); + }, + getterFor: function (n) { + return function (e) { + var t; + if (!p(e) || (t = u(e)).type !== n) + throw TypeError('Incompatible receiver, ' + n + ' required'); + return t; + }; + } + }; + }, + 541: function (e, t, n) { + var r = n(542); + e.exports = r; + }, + 542: function (e, t, n) { + n(543); + var r = n(43); + e.exports = r.Number.isInteger; + }, + 543: function (e, t, n) { + n(14)({ + target: 'Number', + stat: !0 + }, { isInteger: n(544) }); + }, + 544: function (e, t, n) { + var r = n(27), i = Math.floor; + e.exports = function (e) { + return !r(e) && isFinite(e) && i(e) === e; + }; + }, + 55: function (e, t, n) { + var i = n(27); + e.exports = function (e, t) { + if (!i(e)) + return e; + var n, r; + if (t && 'function' == typeof (n = e.toString) && !i(r = n.call(e))) + return r; + if ('function' == typeof (n = e.valueOf) && !i(r = n.call(e))) + return r; + if (!t && 'function' == typeof (n = e.toString) && !i(r = n.call(e))) + return r; + throw TypeError('Can\'t convert object to primitive value'); + }; + }, + 56: function (e, t, n) { + function r(p) { + var g = 1 == p, b = 2 == p, v = 3 == p, y = 4 == p, h = 6 == p, m = 5 == p || h; + return function (e, t, n, r) { + for (var i, o, a = E(e), c = A(a), u = S(t, n, 3), s = O(c.length), d = 0, f = r || T, l = g ? f(e, s) : b ? f(e, 0) : void 0; d < s; d++) + if ((m || d in c) && (o = u(i = c[d], d, a), p)) + if (g) + l[d] = o; + else if (o) + switch (p) { + case 3: + return !0; + case 5: + return i; + case 6: + return d; + case 2: + I.call(l, i); + } + else if (y) + return !1; + return h ? -1 : v || y ? y : l; + }; + } + var S = n(24), A = n(72), E = n(57), O = n(50), T = n(103), I = [].push; + e.exports = { + forEach: r(0), + map: r(1), + filter: r(2), + some: r(3), + every: r(4), + find: r(5), + findIndex: r(6) + }; + }, + 57: function (e, t, n) { + var r = n(49); + e.exports = function (e) { + return Object(r(e)); + }; + }, + 58: function (e, t) { + var n = Math.ceil, r = Math.floor; + e.exports = function (e) { + return isNaN(e = +e) ? 0 : (0 < e ? r : n)(e); + }; + }, + 59: function (e, t) { + var n = 0, r = Math.random(); + e.exports = function (e) { + return 'Symbol(' + String(void 0 === e ? '' : e) + ')_' + (++n + r).toString(36); + }; + }, + 60: function (e, t, n) { + function a(e) { + throw e; + } + var c = n(30), u = n(31), s = n(28), d = Object.defineProperty, f = {}; + e.exports = function (e, t) { + if (s(f, e)) + return f[e]; + var n = [][e], r = !!s(t = t || {}, 'ACCESSORS') && t.ACCESSORS, i = s(t, 0) ? t[0] : a, o = s(t, 1) ? t[1] : void 0; + return f[e] = !!n && !u(function () { + if (r && !c) + return !0; + var e = { length: -1 }; + r ? d(e, 1, { + enumerable: !0, + get: a + }) : e[1] = 1, n.call(e, i, o); + }); + }; + }, + 61: function (e, t, n) { + var r = n(62), i = n(40), o = n(22)('iterator'); + e.exports = function (e) { + if (null != e) + return e[o] || e['@@iterator'] || i[r(e)]; + }; + }, + 62: function (e, t, n) { + var r = n(63), i = n(48), o = n(22)('toStringTag'), a = 'Arguments' == i(function () { + return arguments; + }()); + e.exports = r ? i : function (e) { + var t, n, r; + return void 0 === e ? 'Undefined' : null === e ? 'Null' : 'string' == typeof (n = function (e, t) { + try { + return e[t]; + } catch (e) { + } + }(t = Object(e), o)) ? n : a ? i(t) : 'Object' == (r = i(t)) && 'function' == typeof t.callee ? 'Arguments' : r; + }; + }, + 63: function (e, t, n) { + var r = {}; + r[n(22)('toStringTag')] = 'z', e.exports = '[object z]' === String(r); + }, + 64: function (e, t, n) { + var o = n(63), a = n(33).f, c = n(32), u = n(28), s = n(114), d = n(22)('toStringTag'); + e.exports = function (e, t, n, r) { + var i; + e && (i = n ? e : e.prototype, u(i, d) || a(i, d, { + configurable: !0, + value: t + }), r && !o && c(i, 'toString', s)); + }; + }, + 65: function (e, t, n) { + var r = n(75), i = n(59), o = r('keys'); + e.exports = function (e) { + return o[e] || (o[e] = i(e)); + }; + }, + 66: function (e, t, n) { + 'use strict'; + function y() { + return this; + } + var h = n(14), m = n(123), S = n(88), A = n(125), E = n(64), O = n(32), T = n(86), r = n(22), I = n(16), j = n(40), i = n(87), C = i.IteratorPrototype, w = i.BUGGY_SAFARI_ITERATORS, _ = r('iterator'), x = 'values', B = 'entries'; + e.exports = function (e, t, n, r, i, o, a) { + m(n, t, r); + function c(e) { + if (e === i && b) + return b; + if (!w && e in p) + return p[e]; + switch (e) { + case 'keys': + case x: + case B: + return function () { + return new n(this, e); + }; + } + return function () { + return new n(this); + }; + } + var u, s, d, f = t + ' Iterator', l = !1, p = e.prototype, g = p[_] || p['@@iterator'] || i && p[i], b = !w && g || c(i), v = 'Array' == t && p.entries || g; + if (v && (u = S(v.call(new e())), C !== Object.prototype && u.next && (I || S(u) === C || (A ? A(u, C) : 'function' != typeof u[_] && O(u, _, y)), E(u, f, !0, !0), I && (j[f] = y))), i == x && g && g.name !== x && (l = !0, b = function () { + return g.call(this); + }), I && !a || p[_] === b || O(p, _, b), j[t] = b, i) + if (s = { + values: c(x), + keys: o ? b : c('keys'), + entries: c(B) + }, a) + for (d in s) + !w && !l && d in p || T(p, d, s[d]); + else + h({ + target: t, + proto: !0, + forced: w || l + }, s); + return s; + }; + }, + 67: function (e, t, n) { + 'use strict'; + n.d(t, 'a', function () { + return o; + }); + var r = n(0), c = {}; + function i(e, t, n) { + var r, i, o, a = (i = n, o = c[r = e] = c[r] || { bidders: {} }, i ? o.bidders[i] = o.bidders[i] || {} : o); + return a[t] = (a[t] || 0) + 1, a[t]; + } + var o = { + incrementRequestsCounter: function (e) { + return i(e, 'requestsCounter'); + }, + incrementBidderRequestsCounter: function (e, t) { + return i(e, 'requestsCounter', t); + }, + incrementBidderWinsCounter: function (e, t) { + return i(e, 'winsCounter', t); + }, + getRequestsCounter: function (e) { + return Object(r.deepAccess)(c, ''.concat(e, '.requestsCounter')) || 0; + }, + getBidderRequestsCounter: function (e, t) { + return Object(r.deepAccess)(c, ''.concat(e, '.bidders.').concat(t, '.requestsCounter')) || 0; + }, + getBidderWinsCounter: function (e, t) { + return Object(r.deepAccess)(c, ''.concat(e, '.bidders.').concat(t, '.winsCounter')) || 0; + } + }; + }, + 69: function (e, t, n) { + var r = n(230); + e.exports = r; + }, + 7: function (e, t, n) { + 'use strict'; + n.d(t, 'c', function () { + return l; + }), n.d(t, 'd', function () { + return p; + }), t.a = function (e) { + return o({ + moduleName: e, + moduleType: 'core' + }); + }, t.b = function (e, t) { + return o({ + gvlid: e, + moduleName: t + }); + }; + var r = n(11), u = n(0), i = n(13), d = n.n(i), f = [ + 'core', + 'prebid-module' + ], l = []; + function o(e) { + var t = 0 < arguments.length && void 0 !== e ? e : {}, i = t.gvlid, o = t.moduleName, a = t.moduleType; + function s(n) { + if (d()(f, a)) { + return n({ valid: !0 }); + } + var r; + return p(i, o, { hasEnforcementHook: !1 }, function (e) { + var t; + r = e && e.hasEnforcementHook ? n(e) : (t = { + hasEnforcementHook: !1, + valid: u.hasDeviceAccess() + }, n(t)); + }), r; + } + var c = function (t) { + function n(e) { + const $___old_7396e01b4b8313ed = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_7396e01b4b8313ed) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_16c53395a822db48.localStorage)); + return function () { + if (e && e.valid) + try { + return !!window.localStorage; + } catch (e) { + u.logError('Local storage api disabled'); + } + return !1; + }.apply(this, arguments); + } finally { + if ($___old_7396e01b4b8313ed) + ({}.constructor.defineProperty(window, 'localStorage', $___old_7396e01b4b8313ed)); + } + } + if (!t || 'function' != typeof t) + return s(n); + l.push(function () { + var e = s(n); + t(e); + }); + }; + return { + setCookie: function (i, o, a, c, u, t) { + function n(e) { + var t, n, r; + e && e.valid && (t = u && '' !== u ? ' ;domain='.concat(encodeURIComponent(u)) : '', n = a && '' !== a ? ' ;expires='.concat(a) : '', r = null != c && 'none' == c.toLowerCase() ? '; Secure' : '', document.cookie = ''.concat(i, '=').concat(encodeURIComponent(o)).concat(n, '; path=/').concat(t).concat(c ? '; SameSite='.concat(c) : '').concat(r)); + } + if (!t || 'function' != typeof t) + return s(n); + l.push(function () { + var e = s(n); + t(e); + }); + }, + getCookie: function (n, t) { + function r(e) { + if (e && e.valid) { + var t = window.document.cookie.match('(^|;)\\s*' + n + '\\s*=\\s*([^;]*)\\s*(;|$)'); + return t ? decodeURIComponent(t[2]) : null; + } + return null; + } + if (!t || 'function' != typeof t) + return s(r); + l.push(function () { + var e = s(r); + t(e); + }); + }, + localStorageIsEnabled: function (t) { + function n(e) { + const $___old_4bf12fe94f2ab496 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_4bf12fe94f2ab496) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_16c53395a822db48.localStorage)); + return function () { + if (e && e.valid) + try { + return localStorage.setItem('prebid.cookieTest', '1'), '1' === localStorage.getItem('prebid.cookieTest'); + } catch (e) { + } finally { + try { + localStorage.removeItem('prebid.cookieTest'); + } catch (e) { + } + } + return !1; + }.apply(this, arguments); + } finally { + if ($___old_4bf12fe94f2ab496) + ({}.constructor.defineProperty(window, 'localStorage', $___old_4bf12fe94f2ab496)); + } + } + if (!t || 'function' != typeof t) + return s(n); + l.push(function () { + var e = s(n); + t(e); + }); + }, + cookiesAreEnabled: function (t) { + function n(e) { + return !(!e || !e.valid) && (!!u.checkCookieSupport() || (window.document.cookie = 'prebid.cookieTest', -1 !== window.document.cookie.indexOf('prebid.cookieTest'))); + } + if (!t || 'function' != typeof t) + return s(n); + l.push(function () { + var e = s(n); + t(e); + }); + }, + setDataInLocalStorage: function (t, n, r) { + function i(e) { + e && e.valid && c() && window.localStorage.setItem(t, n); + } + if (!r || 'function' != typeof r) + return s(i); + l.push(function () { + var e = s(i); + r(e); + }); + }, + getDataFromLocalStorage: function (t, n) { + function r(e) { + const $___old_15b2d06520f8e766 = {}.constructor.getOwnPropertyDescriptor(window, 'localStorage'); + try { + if ($___old_15b2d06520f8e766) + ({}.constructor.defineProperty(window, 'localStorage', $___mock_16c53395a822db48.localStorage)); + return function () { + return e && e.valid && c() ? window.localStorage.getItem(t) : null; + }.apply(this, arguments); + } finally { + if ($___old_15b2d06520f8e766) + ({}.constructor.defineProperty(window, 'localStorage', $___old_15b2d06520f8e766)); + } + } + if (!n || 'function' != typeof n) + return s(r); + l.push(function () { + var e = s(r); + n(e); + }); + }, + removeDataFromLocalStorage: function (t, n) { + function r(e) { + e && e.valid && c() && window.localStorage.removeItem(t); + } + if (!n || 'function' != typeof n) + return s(r); + l.push(function () { + var e = s(r); + n(e); + }); + }, + hasLocalStorage: c, + findSimilarCookies: function (o, t) { + function n(e) { + if (e && e.valid) { + var t = []; + if (u.hasDeviceAccess()) + for (var n = document.cookie.split(';'); n.length;) { + var r = n.pop(), i = (i = r.indexOf('=')) < 0 ? r.length : i; + 0 <= decodeURIComponent(r.slice(0, i).replace(/^\s+/, '')).indexOf(o) && t.push(decodeURIComponent(r.slice(i + 1))); + } + return t; + } + } + if (!t || 'function' != typeof t) + return s(n); + l.push(function () { + var e = s(n); + t(e); + }); + } + }; + } + var p = Object(r.b)('async', function (e, t, n, r) { + r(n); + }, 'validateStorageEnforcement'); + }, + 70: function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), n.d(t, 'adUnitSetupChecks', function () { + return V; + }), n.d(t, 'checkAdUnitSetup', function () { + return H; + }), t.executeCallbacks = Y; + var r = n(17), i = n(0), o = n(238), a = n(44), l = n(3), m = n(23), p = n(42), c = n(11), u = n(239), s = n(13), g = n.n(s), b = n(67), S = n(12), d = n(34), f = n(7); + function v(e) { + return function (e) { + if (Array.isArray(e)) + return y(e); + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(e) || function (e, t) { + if (!e) + return; + if ('string' == typeof e) + return y(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === n && e.constructor && (n = e.constructor.name); + if ('Map' === n || 'Set' === n) + return Array.from(e); + if ('Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return y(e, t); + }(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function y(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function h() { + return (h = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + var A = Object(r.a)(), E = n(5), O = n(0), T = n(8).default, I = n(9), j = a.a.triggerUserSyncs, C = E.EVENTS, w = C.ADD_AD_UNITS, _ = C.BID_WON, x = C.REQUEST_BIDS, B = C.SET_TARGETING, U = C.AD_RENDER_FAILED, R = E.AD_RENDER_FAILED_REASON, k = R.PREVENT_WRITING_ON_MAIN_DOCUMENT, D = R.NO_AD, N = R.EXCEPTION, P = R.CANNOT_FIND_AD, M = R.MISSING_DOC_OR_ADID, q = { + bidWon: function (e) { + var t = m.a.getBidsRequested().map(function (e) { + return e.bids.map(function (e) { + return e.adUnitCode; + }); + }).reduce(i.flatten).filter(i.uniques); + return !!O.contains(t, e) || void O.logError('The "' + e + '" placement is not defined.'); + } + }; + function G(e, t, n) { + e.defaultView && e.defaultView.frameElement && (e.defaultView.frameElement.width = t, e.defaultView.frameElement.height = n); + } + function W(e, t) { + var n = []; + return O.isArray(e) && (t ? e.length === t : 0 < e.length) && (e.every(function (e) { + return Object(i.isArrayOfNums)(e, 2); + }) ? n = e : Object(i.isArrayOfNums)(e, 2) && n.push(e)), n; + } + function L(e) { + var t = O.deepClone(e), n = t.mediaTypes.banner, r = W(n.sizes); + return 0 < r.length ? (n.sizes = r, t.sizes = r) : (O.logError('Detected a mediaTypes.banner object without a proper sizes field. Please ensure the sizes are listed like: [[300, 250], ...]. Removing invalid mediaTypes.banner object from request.'), delete t.mediaTypes.banner), t; + } + function F(e) { + var t, n, r = O.deepClone(e), i = r.mediaTypes.video; + return i.playerSize && (t = 'number' == typeof i.playerSize[0] ? 2 : 1, 0 < (n = W(i.playerSize, t)).length ? (2 == t && O.logInfo('Transforming video.playerSize from [640,480] to [[640,480]] so it\'s in the proper format.'), i.playerSize = n, r.sizes = n) : (O.logError('Detected incorrect configuration of mediaTypes.video.playerSize. Please specify only one set of dimensions in a format like: [[640, 480]]. Removing invalid mediaTypes.video.playerSize property from request.'), delete r.mediaTypes.video.playerSize)), r; + } + function z(e) { + var t = O.deepClone(e), n = t.mediaTypes.native; + return n.image && n.image.sizes && !Array.isArray(n.image.sizes) && (O.logError('Please use an array of sizes for native.image.sizes field. Removing invalid mediaTypes.native.image.sizes property from request.'), delete t.mediaTypes.native.image.sizes), n.image && n.image.aspect_ratios && !Array.isArray(n.image.aspect_ratios) && (O.logError('Please use an array of sizes for native.image.aspect_ratios field. Removing invalid mediaTypes.native.image.aspect_ratios property from request.'), delete t.mediaTypes.native.image.aspect_ratios), n.icon && n.icon.sizes && !Array.isArray(n.icon.sizes) && (O.logError('Please use an array of sizes for native.icon.sizes field. Removing invalid mediaTypes.native.icon.sizes property from request.'), delete t.mediaTypes.native.icon.sizes), t; + } + Object(u.a)(), A.bidderSettings = A.bidderSettings || {}, A.libLoaded = !0, A.version = 'v4.36.0', O.logInfo('Prebid.js v4.36.0 loaded'), A.installedModules = [], A.adUnits = A.adUnits || [], A.triggerUserSyncs = j; + var V = { + validateBannerMediaType: L, + validateVideoMediaType: F, + validateNativeMediaType: z, + validateSizes: W + }, H = Object(c.b)('sync', function (e) { + var c = []; + return e.forEach(function (e) { + var t, n, r, i, o = e.mediaTypes, a = e.bids; + a && O.isArray(a) ? o && 0 !== Object.keys(o).length ? (o.banner && (t = L(e)), o.video && (n = F(t || e)), o.native && (r = z(n || (t || e))), i = h({}, t, n, r), c.push(i)) : O.logError('Detected adUnit.code \''.concat(e.code, '\' did not have a \'mediaTypes\' object defined. This is a required field for the auction, so this adUnit has been removed.')) : O.logError('Detected adUnit.code \''.concat(e.code, '\' did not have \'adUnit.bids\' defined or \'adUnit.bids\' is not an array. Removing adUnit from auction.')); + }), c; + }, 'checkAdUnitSetup'); + function K(e) { + var n = m.a[e]().filter(O.bind.call(i.adUnitsFilter, this, m.a.getAdUnitCodes())), r = m.a.getLastAuctionId(); + return n.map(function (e) { + return e.adUnitCode; + }).filter(i.uniques).map(function (t) { + return n.filter(function (e) { + return e.auctionId === r && e.adUnitCode === t; + }); + }).filter(function (e) { + return e && e[0] && e[0].adUnitCode; + }).map(function (e) { + return t = {}, n = e[0].adUnitCode, r = { bids: e }, n in t ? Object.defineProperty(t, n, { + value: r, + enumerable: !0, + configurable: !0, + writable: !0 + }) : t[n] = r, t; + var t, n, r; + }).reduce(function (e, t) { + return h(e, t); + }, {}); + } + function J(e) { + var t = e.reason, n = e.message, r = e.bid, i = e.id, o = { + reason: t, + message: n + }; + r && (o.bid = r), i && (o.adId = i), O.logError(n), I.emit(U, o); + } + function Y(e, t) { + function n(e) { + for (var t; t = e.shift();) + t(); + } + n(f.c), n(Q), e.call(this, t); + } + A.getAdserverTargetingForAdUnitCodeStr = function (e) { + if (O.logInfo('Invoking pbjs.getAdserverTargetingForAdUnitCodeStr', arguments), e) { + var t = A.getAdserverTargetingForAdUnitCode(e); + return O.transformAdServerTargetingObj(t); + } + O.logMessage('Need to call getAdserverTargetingForAdUnitCodeStr with adunitCode'); + }, A.getHighestUnusedBidResponseForAdUnitCode = function (e) { + if (e) { + var t = m.a.getAllBidsForAdUnitCode(e).filter(p.a.isUnusedBid).filter(p.a.isBidNotExpired); + return t.length ? t.reduce(i.getHighestCpm) : {}; + } + O.logMessage('Need to call getHighestUnusedBidResponseForAdUnitCode with adunitCode'); + }, A.getAdserverTargetingForAdUnitCode = function (e) { + return A.getAdserverTargeting(e)[e]; + }, A.getAdserverTargeting = function (e) { + return O.logInfo('Invoking pbjs.getAdserverTargeting', arguments), p.d.getAllTargeting(e); + }, A.getNoBids = function () { + return O.logInfo('Invoking pbjs.getNoBids', arguments), K('getNoBids'); + }, A.getNoBidsForAdUnitCode = function (t) { + return { + bids: m.a.getNoBids().filter(function (e) { + return e.adUnitCode === t; + }) + }; + }, A.getBidResponses = function () { + return O.logInfo('Invoking pbjs.getBidResponses', arguments), K('getBidsReceived'); + }, A.getBidResponsesForAdUnitCode = function (t) { + return { + bids: m.a.getBidsReceived().filter(function (e) { + return e.adUnitCode === t; + }) + }; + }, A.setTargetingForGPTAsync = function (e, t) { + var n; + O.logInfo('Invoking pbjs.setTargetingForGPTAsync', arguments), Object(i.isGptPubadsDefined)() ? (n = p.d.getAllTargeting(e), p.d.resetPresetTargeting(e, t), p.d.setTargetingForGPT(n, t), Object.keys(n).forEach(function (t) { + Object.keys(n[t]).forEach(function (e) { + 'hb_adid' === e && m.a.setStatusForBids(n[t][e], E.BID_STATUS.BID_TARGETING_SET); + }); + }), I.emit(B, n)) : O.logError('window.googletag is not defined on the page'); + }, A.setTargetingForAst = function (e) { + O.logInfo('Invoking pbjs.setTargetingForAn', arguments), p.d.isApntagDefined() ? (p.d.setTargetingForAst(e), I.emit(B, p.d.getAllTargeting())) : O.logError('window.apntag is not defined on the page'); + }, A.renderAd = function (e, t, n) { + if (O.logInfo('Invoking pbjs.renderAd', arguments), O.logMessage('Calling renderAd with adId :' + t), e && t) + try { + var r, i, o, a, c, u, s, d, f, l, p, g, b, v = m.a.findBidByAdId(t); + v ? (v.ad = O.replaceAuctionPrice(v.ad, v.cpm), v.adUrl = O.replaceAuctionPrice(v.adUrl, v.cpm), n && n.clickThrough && (r = n.clickThrough, v.ad = O.replaceClickThrough(v.ad, r), v.adUrl = O.replaceClickThrough(v.adUrl, r)), m.a.addWinningBid(v), I.emit(_, v), i = v.height, o = v.width, a = v.ad, c = v.mediaType, u = v.adUrl, s = v.renderer, d = document.createComment('Creative '.concat(v.creativeId, ' served by ').concat(v.bidder, ' Prebid.js Header Bidding')), O.insertElement(d, e, 'body'), Object(S.c)(s) ? Object(S.b)(s, v) : e === document && !O.inIframe() || 'video' === c ? (f = 'Error trying to write ad. Ad render call ad id '.concat(t, ' was prevented from writing to the main document.'), J({ + reason: k, + message: f, + bid: v, + id: t + })) : a ? (navigator.userAgent && -1 < navigator.userAgent.toLowerCase().indexOf('firefox/') && ((l = navigator.userAgent.toLowerCase().match(/firefox\/([\d\.]+)/)[1]) && parseInt(l, 10) < 67 && e.open('text/html', 'replace')), e.write(a), e.close(), G(e, o, i), O.callBurl(v)) : u ? ((p = O.createInvisibleIframe()).height = i, p.width = o, p.style.display = 'inline', p.style.overflow = 'hidden', p.src = u, O.insertElement(p, e, 'body'), G(e, o, i), O.callBurl(v)) : (g = 'Error trying to write ad. No ad for bid response id: '.concat(t), J({ + reason: D, + message: g, + bid: v, + id: t + }))) : (b = 'Error trying to write ad. Cannot find ad by given id : '.concat(t), J({ + reason: P, + message: b, + id: t + })); + } catch (e) { + var y = 'Error trying to write ad Id :'.concat(t, ' to the page:').concat(e.message); + J({ + reason: N, + message: y, + id: t + }); + } + else { + var h = 'Error trying to write ad Id :'.concat(t, ' to the page. Missing document or adId'); + J({ + reason: M, + message: h, + id: t + }); + } + }, A.removeAdUnit = function (e) { + O.logInfo('Invoking pbjs.removeAdUnit', arguments), e ? (O.isArray(e) ? e : [e]).forEach(function (e) { + for (var t = A.adUnits.length - 1; 0 <= t; t--) + A.adUnits[t].code === e && A.adUnits.splice(t, 1); + }) : A.adUnits = []; + }, A.requestBids = Object(c.b)('async', function () { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}, t = e.bidsBackHandler, n = e.timeout, r = e.adUnits, i = e.adUnitCodes, o = e.labels, a = e.auctionId; + I.emit(x); + var c = n || l.b.getConfig('bidderTimeout'), r = r && l.b.convertAdUnitFpd(O.isArray(r) ? r : [r]) || A.adUnits; + O.logInfo('Invoking pbjs.requestBids', arguments); + var u = [], s = []; + if (l.b.getConfig('s2sConfig', function (e) { + e && e.s2sConfig && (u = Array.isArray(e.s2sConfig) ? e.s2sConfig : [e.s2sConfig]); + }), u.forEach(function (e) { + s.push.apply(s, v(e.bidders)); + }), r = H(r), i && i.length ? r = r.filter(function (e) { + return g()(i, e.code); + }) : i = r && r.map(function (e) { + return e.code; + }), r.forEach(function (i) { + var o = Object.keys(i.mediaTypes || { banner: 'banner' }), e = i.bids.map(function (e) { + return e.bidder; + }), a = T.bidderRegistry, t = s ? e.filter(function (e) { + return !g()(s, e); + }) : e; + i.transactionId = O.generateUUID(), t.forEach(function (t) { + var e = a[t], n = e && e.getSpec && e.getSpec(), r = n && n.supportedMediaTypes || ['banner']; + o.some(function (e) { + return g()(r, e); + }) ? b.a.incrementBidderRequestsCounter(i.code, t) : (O.logWarn(O.unsupportedBidderMessage(i, t)), i.bids = i.bids.filter(function (e) { + return e.bidder !== t; + })); + }), b.a.incrementRequestsCounter(i.code); + }), r && 0 !== r.length) { + var d = m.a.createAuction({ + adUnits: r, + adUnitCodes: i, + callback: t, + cbTimeout: c, + labels: o, + auctionId: a + }), f = r.length; + 15 < f && O.logInfo('Current auction '.concat(d.getAuctionId(), ' contains ').concat(f, ' adUnits.'), r), i.forEach(function (e) { + return p.d.setLatestAuctionForAdUnit(e, d.getAuctionId()); + }), d.callBids(); + } else if (O.logMessage('No adUnits configured. No bids requested.'), 'function' == typeof t) + try { + t(); + } catch (e) { + O.logError('Error executing bidsBackHandler', null, e); + } + }), A.requestBids.before(Y, 49), A.addAdUnits = function (e) { + O.logInfo('Invoking pbjs.addAdUnits', arguments), A.adUnits.push.apply(A.adUnits, l.b.convertAdUnitFpd(O.isArray(e) ? e : [e])), I.emit(w); + }, A.onEvent = function (e, t, n) { + O.logInfo('Invoking pbjs.onEvent', arguments), O.isFn(t) ? !n || q[e].call(null, n) ? I.on(e, t, n) : O.logError('The id provided is not valid for event "' + e + '" and no handler was set.') : O.logError('The event handler provided is not a function and was not set on event "' + e + '".'); + }, A.offEvent = function (e, t, n) { + O.logInfo('Invoking pbjs.offEvent', arguments), n && !q[e].call(null, n) || I.off(e, t, n); + }, A.getEvents = function () { + return O.logInfo('Invoking pbjs.getEvents'), I.getEvents(); + }, A.registerBidAdapter = function (e, t) { + O.logInfo('Invoking pbjs.registerBidAdapter', arguments); + try { + T.registerBidAdapter(e(), t); + } catch (e) { + O.logError('Error registering bidder adapter : ' + e.message); + } + }, A.registerAnalyticsAdapter = function (e) { + O.logInfo('Invoking pbjs.registerAnalyticsAdapter', arguments); + try { + T.registerAnalyticsAdapter(e); + } catch (e) { + O.logError('Error registering analytics adapter : ' + e.message); + } + }, A.createBid = function (e) { + return O.logInfo('Invoking pbjs.createBid', arguments), Object(d.a)(e); + }; + var Q = [], $ = Object(c.b)('async', function (e) { + e && !O.isEmpty(e) ? (O.logInfo('Invoking pbjs.enableAnalytics for: ', e), T.enableAnalytics(e)) : O.logError('pbjs.enableAnalytics should be called with option {}'); + }, 'enableAnalyticsCb'); + function X(e) { + e.forEach(function (e) { + if (void 0 === e.called) + try { + e.call(), e.called = !0; + } catch (e) { + O.logError('Error processing command :', 'prebid.js', e); + } + }); + } + A.enableAnalytics = function (e) { + Q.push($.bind(this, e)); + }, A.aliasBidder = function (e, t, n) { + O.logInfo('Invoking pbjs.aliasBidder', arguments), e && t ? T.aliasBidAdapter(e, t, n) : O.logError('bidderCode and alias must be passed as arguments', 'pbjs.aliasBidder'); + }, A.getAllWinningBids = function () { + return m.a.getAllWinningBids(); + }, A.getAllPrebidWinningBids = function () { + return m.a.getBidsReceived().filter(function (e) { + return e.status === E.BID_STATUS.BID_TARGETING_SET; + }); + }, A.getHighestCpmBids = function (e) { + return p.d.getWinningBids(e); + }, A.markWinningBidAsUsed = function (t) { + var e = []; + t.adUnitCode && t.adId ? e = m.a.getBidsReceived().filter(function (e) { + return e.adId === t.adId && e.adUnitCode === t.adUnitCode; + }) : t.adUnitCode ? e = p.d.getWinningBids(t.adUnitCode) : t.adId ? e = m.a.getBidsReceived().filter(function (e) { + return e.adId === t.adId; + }) : O.logWarn('Improper use of markWinningBidAsUsed. It needs an adUnitCode or an adId to function.'), 0 < e.length && (e[0].status = E.BID_STATUS.RENDERED); + }, A.getConfig = l.b.getConfig, A.setConfig = l.b.setConfig, A.setBidderConfig = l.b.setBidderConfig, A.que.push(function () { + return Object(o.a)(); + }), A.cmd.push = function (e) { + if ('function' == typeof e) + try { + e.call(); + } catch (e) { + O.logError('Error processing command :', e.message, e.stack); + } + else + O.logError('Commands written into pbjs.cmd.push must be wrapped in a function'); + }, A.que.push = A.cmd.push, A.processQueue = function () { + c.b.ready(), X(A.que), X(A.cmd); + }, t.default = A; + }, + 71: function (e, t, n) { + 'use strict'; + t.a = function (t, n) { + o.adServers = o.adServers || {}, o.adServers[t] = o.adServers[t] || {}, Object.keys(n).forEach(function (e) { + o.adServers[t][e] ? Object(i.logWarn)('Attempting to add an already registered function property '.concat(e, ' for AdServer ').concat(t, '.')) : o.adServers[t][e] = n[e]; + }); + }; + var r = n(17), i = n(0), o = Object(r.a)(); + }, + 72: function (e, t, n) { + var r = n(31), i = n(48), o = ''.split; + e.exports = r(function () { + return !Object('z').propertyIsEnumerable(0); + }) ? function (e) { + return 'String' == i(e) ? o.call(e, '') : Object(e); + } : Object; + }, + 73: function (e, t, n) { + var r = n(30), i = n(31), o = n(74); + e.exports = !r && !i(function () { + return 7 != Object.defineProperty(o('div'), 'a', { + get: function () { + return 7; + } + }).a; + }); + }, + 74: function (e, t, n) { + var r = n(26), i = n(27), o = r.document, a = i(o) && i(o.createElement); + e.exports = function (e) { + return a ? o.createElement(e) : {}; + }; + }, + 75: function (e, t, n) { + var r = n(16), i = n(76); + (e.exports = function (e, t) { + return i[e] || (i[e] = void 0 !== t ? t : {}); + })('versions', []).push({ + version: '3.6.4', + mode: r ? 'pure' : 'global', + copyright: '\xA9 2020 Denis Pushkarev (zloirock.ru)' + }); + }, + 76: function (e, t, n) { + var r = n(26), i = n(105), o = '__core-js_shared__', a = r[o] || i(o, {}); + e.exports = a; + }, + 77: function (e, t, n) { + var r = n(31); + e.exports = !!Object.getOwnPropertySymbols && !r(function () { + return !String(Symbol()); + }); + }, + 78: function (e, t, n) { + function r(c) { + return function (e, t, n) { + var r, i = u(e), o = s(i.length), a = d(n, o); + if (c && t != t) { + for (; a < o;) + if ((r = i[a++]) != r) + return !0; + } else + for (; a < o; a++) + if ((c || a in i) && i[a] === t) + return c || a || 0; + return !c && -1; + }; + } + var u = n(47), s = n(50), d = n(109); + e.exports = { + includes: r(!0), + indexOf: r(!1) + }; + }, + 79: function (e, t, n) { + var r = n(110); + n(133), n(135), n(137), n(139), n(141), n(142), n(143), n(144), n(145), n(146), n(147), n(148), n(149), n(150), n(151), n(152), n(153), n(154), e.exports = r; + }, + 8: function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), n.d(t, 'gdprDataHandler', function () { + return B; + }), n.d(t, 'uspDataHandler', function () { + return U; + }), n.d(t, 'clientTestAdapters', function () { + return R; + }), n.d(t, 'allS2SBidders', function () { + return k; + }), t.getAllS2SBidders = D, t.setS2STestingModule = function (e) { + A = e; + }; + var h = n(0), p = n(93), g = n(38), l = n(1), y = n(4), a = n(3), r = n(11), i = n(13), m = n.n(i), o = n(10), S = n.n(o), b = n(67), c = n(20); + function u(e, t) { + return function (e) { + if (Array.isArray(e)) + return e; + }(e) || function (e, t) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) + return; + var n = [], r = !0, i = !1, o = void 0; + try { + for (var a, c = e[Symbol.iterator](); !(r = (a = c.next()).done) && (n.push(a.value), !t || n.length !== t); r = !0); + } catch (e) { + i = !0, o = e; + } finally { + try { + r || null == c.return || c.return(); + } finally { + if (i) + throw o; + } + } + return n; + }(e, t) || d(e, t) || function () { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function s(e) { + return function (e) { + if (Array.isArray(e)) + return f(e); + }(e) || function (e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) + return Array.from(e); + }(e) || d(e) || function () { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + function d(e, t) { + if (e) { + if ('string' == typeof e) + return f(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === n && e.constructor && (n = e.constructor.name), 'Map' === n || 'Set' === n ? Array.from(e) : 'Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n) ? f(e, t) : void 0; + } + } + function f(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + function v() { + return (v = Object.assign || function (e) { + for (var t = 1; t < arguments.length; t++) { + var n = arguments[t]; + for (var r in n) + Object.prototype.hasOwnProperty.call(n, r) && (e[r] = n[r]); + } + return e; + }).apply(this, arguments); + } + var A, E = n(0), O = n(5), T = n(9), I = {}, j = I.bidderRegistry = {}, C = I.aliasRegistry = {}, w = []; + a.b.getConfig('s2sConfig', function (e) { + e && e.s2sConfig && (w = Array.isArray(e.s2sConfig) ? e.s2sConfig : [e.s2sConfig]); + }); + var _ = {}; + var x = Object(r.b)('sync', function (e) { + var i = e.bidderCode, s = e.auctionId, d = e.bidderRequestId, t = e.adUnits, f = e.labels, l = e.src; + return t.reduce(function (e, c) { + var t = Object(p.b)(Object(p.a)(c, f), c.mediaTypes, c.sizes), n = t.active, u = t.mediaTypes, r = t.filterResults; + return n ? r && E.logInfo('Size mapping filtered adUnit "'.concat(c.code, '" banner sizes from '), r.before, 'to ', r.after) : E.logInfo('Size mapping disabled adUnit "'.concat(c.code, '"')), n && e.push(c.bids.filter(function (e) { + return e.bidder === i; + }).reduce(function (e, t) { + var n = c.nativeParams || E.deepAccess(c, 'mediaTypes.native'); + n && (t = v({}, t, { nativeParams: Object(g.h)(n) })), t = v({}, t, Object(h.getDefinedParams)(c, [ + 'ortb2Imp', + 'mediaType', + 'renderer', + 'storedAuctionResponse' + ])); + var r = Object(p.b)(Object(p.a)(t, f), u), i = r.active, o = r.mediaTypes, a = r.filterResults; + return i ? a && E.logInfo('Size mapping filtered adUnit "'.concat(c.code, '" bidder "').concat(t.bidder, '" banner sizes from '), a.before, 'to ', a.after) : E.logInfo('Size mapping deactivated adUnit "'.concat(c.code, '" bidder "').concat(t.bidder, '"')), E.isValidMediaTypes(o) ? t = v({}, t, { mediaTypes: o }) : E.logError('mediaTypes is not correctly configured for adunit '.concat(c.code)), i && e.push(v({}, t, { + adUnitCode: c.code, + transactionId: c.transactionId, + sizes: E.deepAccess(o, 'banner.sizes') || E.deepAccess(o, 'video.playerSize') || [], + bidId: t.bid_id || E.getUniqueIdentifierStr(), + bidderRequestId: d, + auctionId: s, + src: l, + bidRequestsCount: b.a.getRequestsCounter(c.code), + bidderRequestsCount: b.a.getBidderRequestsCounter(c.code, t.bidder), + bidderWinsCount: b.a.getBidderWinsCounter(c.code, t.bidder) + })), e; + }, [])), e; + }, []).reduce(h.flatten, []).filter(function (e) { + return '' !== e; + }); + }, 'getBids'); + var B = { + consentData: null, + setConsentData: function (e) { + B.consentData = e; + }, + getConsentData: function () { + return B.consentData; + } + }, U = { + consentData: null, + setConsentData: function (e) { + U.consentData = e; + }, + getConsentData: function () { + return U.consentData; + } + }, R = [], k = []; + function D() { + I.s2STestingEnabled = !1, w.forEach(function (e) { + e && e.enabled && e.bidders && e.bidders.length && k.push.apply(k, s(e.bidders)); + }); + } + function N(e) { + return e && e.enabled && e.testing && A; + } + function P(t, n, e) { + try { + var r = j[t].getSpec(); + r && r[n] && 'function' == typeof r[n] && (E.logInfo('Invoking '.concat(t, '.').concat(n)), a.b.runWithBidder(t, h.bind.call(r[n], r, e))); + } catch (e) { + E.logWarn('Error calling '.concat(n, ' of ').concat(t)); + } + } + I.makeBidRequests = Object(r.b)('sync', function (d, f, l, i, p) { + T.emit(O.EVENTS.BEFORE_REQUEST_BIDS, d); + var e = Object(h.getBidderCodes)(d); + a.b.getConfig('bidderSequence') === a.a && (e = Object(h.shuffle)(e)); + var g = Object(c.a)(), b = e, v = []; + 0 === k.length && D(), w.forEach(function (e) { + e && e.enabled && N(e) && (A.calculateBidSources(e), A.getSourceBidderMap(d, k)[A.CLIENT].forEach(function (e) { + m()(R, e) || R.push(e); + })); + }), b = e.filter(function (e) { + return !m()(k, e) || m()(R, e); + }); + var y = k; + w.forEach(function (r) { + var i, o, e, t, n, a, c, u, s; + r && r.enabled && (s = r, Boolean(N(s) && s.testServerOnly) && (c = d, u = r, Boolean(S()(c, function (e) { + return S()(e.bids, function (e) { + return (e.bidSource || u.bidderControl && u.bidderControl[e.bidder]) && e.finalSource === A.SERVER; + }); + }))) && (E.logWarn('testServerOnly: True. All client requests will be suppressed.'), b.length = 0), e = d, n = (t = r).bidders, (a = E.deepClone(e)).forEach(function (e) { + e.bids = e.bids.filter(function (e) { + return m()(n, e.bidder) && (!N(t) || e.finalSource !== A.CLIENT); + }).map(function (e) { + return e.bid_id = E.getUniqueIdentifierStr(), e; + }); + }), i = a = a.filter(function (e) { + return 0 !== e.bids.length; + }), o = E.generateUUID(), y.forEach(function (e) { + var t = E.getUniqueIdentifierStr(), n = { + bidderCode: e, + auctionId: l, + bidderRequestId: t, + tid: o, + bids: x({ + bidderCode: e, + auctionId: l, + bidderRequestId: t, + adUnits: E.deepClone(i), + labels: p, + src: O.S2S.SRC + }), + auctionStart: f, + timeout: r.timeout, + src: O.S2S.SRC, + refererInfo: g + }; + 0 !== n.bids.length && v.push(n); + }), i.forEach(function (e) { + var t = e.bids.filter(function (t) { + return S()(v, function (e) { + return S()(e.bids, function (e) { + return e.bidId === t.bid_id; + }); + }); + }); + e.bids = t; + }), v.forEach(function (e) { + void 0 === e.adUnitsS2SCopy && (e.adUnitsS2SCopy = i.filter(function (e) { + return 0 < e.bids.length; + })); + })); + }); + var t, n, o = (t = d, (n = E.deepClone(t)).forEach(function (e) { + e.bids = e.bids.filter(function (e) { + return !R.length || e.finalSource !== A.SERVER; + }); + }), n = n.filter(function (e) { + return 0 !== e.bids.length; + })); + return b.forEach(function (e) { + var t = E.getUniqueIdentifierStr(), n = { + bidderCode: e, + auctionId: l, + bidderRequestId: t, + bids: x({ + bidderCode: e, + auctionId: l, + bidderRequestId: t, + adUnits: E.deepClone(o), + labels: p, + src: 'client' + }), + auctionStart: f, + timeout: i, + refererInfo: g + }, r = j[e]; + r || E.logError('Trying to make a request for bidder that does not exist: '.concat(e)), r && n.bids && 0 !== n.bids.length && v.push(n); + }), B.getConsentData() && v.forEach(function (e) { + e.gdprConsent = B.getConsentData(); + }), U.getConsentData() && v.forEach(function (e) { + e.uspConsent = U.getConsentData(); + }), v; + }, 'makeBidRequests'), I.callBids = function (e, t, d, f, l, p, i) { + var n, r, g, b, v; + t.length ? (r = (n = u(t.reduce(function (e, t) { + return e[Number(void 0 !== t.src && t.src === O.S2S.SRC)].push(t), e; + }, [ + [], + [] + ]), 2))[0], g = n[1], b = [], g.forEach(function (e) { + for (var t = -1, n = 0; n < b.length; ++n) + if (e.tid === b[n].tid) { + t = n; + break; + } + t <= -1 && b.push(e); + }), v = 0, w.forEach(function (e) { + var t, n, r, i, o, a, c, u, s; + e && b[v] && m()(e.bidders, b[v].bidderCode) && (t = Object(y.b)(p, l ? { + request: l.request.bind(null, 's2s'), + done: l.done + } : void 0), n = e.bidders, r = j[e.adapter], i = b[v].tid, o = b[v].adUnitsS2SCopy, a = g.filter(function (e) { + return e.tid === i; + }), r ? (c = { + tid: i, + ad_units: o, + s2sConfig: e + }).ad_units.length && (u = a.map(function (e) { + return e.start = Object(h.timestamp)(), f.bind(e); + }), s = c.ad_units.reduce(function (e, t) { + return e.concat((t.bids || []).reduce(function (e, t) { + return e.concat(t.bidder); + }, [])); + }, []), E.logMessage('CALLING S2S HEADER BIDDERS ==== '.concat(n.filter(function (e) { + return m()(s, e); + }).join(','))), a.forEach(function (e) { + T.emit(O.EVENTS.BID_REQUESTED, e); + }), r.callBids(c, g, function (e, t) { + var n = Object(h.getBidderRequest)(g, t.bidderCode, e); + n && d.call(n, e, t); + }, function () { + return u.forEach(function (e) { + return e(); + }); + }, t)) : E.logError('missing ' + e.adapter), v++); + }), r.forEach(function (t) { + t.start = Object(h.timestamp)(); + var e = j[t.bidderCode]; + E.logMessage('CALLING BIDDER ======= '.concat(t.bidderCode)), T.emit(O.EVENTS.BID_REQUESTED, t); + var n = Object(y.b)(p, l ? { + request: l.request.bind(null, t.bidderCode), + done: l.done + } : void 0), r = f.bind(t); + try { + a.b.runWithBidder(t.bidderCode, h.bind.call(e.callBids, e, t, d.bind(t), r, n, i, a.b.callbackWithBidder(t.bidderCode))); + } catch (e) { + E.logError(''.concat(t.bidderCode, ' Bid Adapter emitted an uncaught error when parsing their bidRequest'), { + e: e, + bidRequest: t + }), r(); + } + })) : E.logWarn('callBids executed with no bidRequests. Were they filtered by labels or sizing?'); + }, I.videoAdapters = [], I.registerBidAdapter = function (e, t) { + var n = (2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : {}).supportedMediaTypes, r = void 0 === n ? [] : n; + e && t ? 'function' == typeof e.callBids ? (j[t] = e, m()(r, 'video') && I.videoAdapters.push(t), m()(r, 'native') && g.f.push(t)) : E.logError('Bidder adaptor error for bidder code: ' + t + 'bidder must implement a callBids() function') : E.logError('bidAdapter or bidderCode not specified'); + }, I.aliasBidAdapter = function (n, r, e) { + var t, i; + if (void 0 === j[r]) { + var o = j[n]; + if (void 0 === o) { + var a = []; + w.forEach(function (e) { + var t; + e.bidders && e.bidders.length && (t = e && e.bidders, e && m()(t, r) ? C[r] = n : a.push(n)); + }), a.forEach(function (e) { + E.logError('bidderCode "' + e + '" is not an existing bidder.', 'adapterManager.aliasBidAdapter'); + }); + } else + try { + var c, u, s, d, f = (t = n, i = [], m()(I.videoAdapters, t) && i.push('video'), m()(g.f, t) && i.push('native'), i); + o.constructor.prototype != Object.prototype ? (d = new o.constructor()).setBidderCode(r) : (c = o.getSpec(), u = e && e.gvlid, s = e && e.skipPbsAliasing, d = Object(l.newBidder)(v({}, c, { + code: r, + gvlid: u, + skipPbsAliasing: s + })), C[r] = n), I.registerBidAdapter(d, r, { supportedMediaTypes: f }); + } catch (e) { + E.logError(n + ' bidder does not currently support aliasing.', 'adapterManager.aliasBidAdapter'); + } + } else + E.logMessage('alias name "' + r + '" has been already specified.'); + }, I.registerAnalyticsAdapter = function (e) { + var t = e.adapter, n = e.code, r = e.gvlid; + t && n ? 'function' == typeof t.enableAnalytics ? (t.code = n, _[n] = { + adapter: t, + gvlid: r + }) : E.logError('Prebid Error: Analytics adaptor error for analytics "'.concat(n, '"\n analytics adapter must implement an enableAnalytics() function')) : E.logError('Prebid Error: analyticsAdapter or analyticsCode not specified'); + }, I.enableAnalytics = function (e) { + E.isArray(e) || (e = [e]), E._each(e, function (e) { + var t = _[e.provider].adapter; + t ? t.enableAnalytics(e) : E.logError('Prebid Error: no analytics adapter found in registry for\n '.concat(e.provider, '.')); + }); + }, I.getBidAdapter = function (e) { + return j[e]; + }, I.getAnalyticsAdapter = function (e) { + return _[e]; + }, I.callTimedOutBidders = function (t, n, r) { + n = n.map(function (e) { + return e.params = E.getUserConfiguredParams(t, e.adUnitCode, e.bidder), e.timeout = r, e; + }), n = E.groupBy(n, 'bidder'), Object.keys(n).forEach(function (e) { + P(e, 'onTimeout', n[e]); + }); + }, I.callBidWonBidder = function (e, t, n) { + t.params = E.getUserConfiguredParams(n, t.adUnitCode, t.bidder), b.a.incrementBidderWinsCounter(t.adUnitCode, t.bidder), P(e, 'onBidWon', t); + }, I.callSetTargetingBidder = function (e, t) { + P(e, 'onSetTargeting', t); + }, I.callBidViewableBidder = function (e, t) { + P(e, 'onBidViewable', t); + }, t.default = I; + }, + 80: function (e, t, n) { + function r(e) { + c(e, d, { + value: { + objectID: 'O' + ++f, + weakData: {} + } + }); + } + var i = n(53), o = n(27), a = n(28), c = n(33).f, u = n(59), s = n(113), d = u('meta'), f = 0, l = Object.isExtensible || function () { + return !0; + }, p = e.exports = { + REQUIRED: !1, + fastKey: function (e, t) { + if (!o(e)) + return 'symbol' == typeof e ? e : ('string' == typeof e ? 'S' : 'P') + e; + if (!a(e, d)) { + if (!l(e)) + return 'F'; + if (!t) + return 'E'; + r(e); + } + return e[d].objectID; + }, + getWeakData: function (e, t) { + if (!a(e, d)) { + if (!l(e)) + return !0; + if (!t) + return !1; + r(e); + } + return e[d].weakData; + }, + onFreeze: function (e) { + return s && p.REQUIRED && l(e) && !a(e, d) && r(e), e; + } + }; + i[d] = !0; + }, + 81: function (e, t, n) { + var r = n(22), i = n(40), o = r('iterator'), a = Array.prototype; + e.exports = function (e) { + return void 0 !== e && (i.Array === e || a[o] === e); + }; + }, + 82: function (e, t, n) { + var o = n(15); + e.exports = function (t, e, n, r) { + try { + return r ? e(o(n)[0], n[1]) : e(n); + } catch (e) { + var i = t.return; + throw void 0 !== i && o(i.call(t)), e; + } + }; + }, + 83: function (e, t) { + e.exports = function (e, t, n) { + if (!(e instanceof t)) + throw TypeError('Incorrect ' + (n ? n + ' ' : '') + 'invocation'); + return e; + }; + }, + 84: function (e, t, n) { + function r() { + } + function i(e) { + return '\n '); + t.strData.skipIframeBusting ? n += '' : n += '\n \n '); + return n; + }(r, t) + }]; + }, + getUserSyncs: function (e, t, r, n) { + var i = n ? '&us_privacy='.concat(n) : '', a = []; + return e.pixelEnabled && 0 < t.length && t[0].body && t[0].body.cookieSyncUrls && t[0].body.cookieSyncUrls.forEach(function (e) { + a.push({ + type: 'image', + url: e + i + }); + }), a; + }, + onTimeout: function () { + }, + onBidWon: function () { + }, + onSetTargeting: function () { + } + }; + function u(e) { + return btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, function (e, t) { + return String.fromCharCode('0x' + t); + })); + } + Object(n.registerBidder)(p); + } + }, [824]); + pbjsChunk([95], { + 920: function (e, n, t) { + e.exports = t(921); + }, + 921: function (e, n, t) { + 'use strict'; + Object.defineProperty(n, '__esModule', { value: !0 }), t.d(n, 'uid2IdSubmodule', function () { + return v; + }); + var r = t(0), o = t(11), i = t(7), u = 'uid2', a = '__uid2_advertising_token'; + var d, c = Object(i.b)(887, u), l = (d = 'UID2: ', function () { + for (var e = arguments.length, n = new Array(e), t = 0; t < e; t++) + n[t] = arguments[t]; + r.logInfo.apply(r, [d + ' '].concat(n)); + }); + var v = { + name: u, + gvlid: 887, + decode: function (e) { + return e ? function (e) { + var n = {}; + if (e) { + var t = { id: e }; + return n.uid2 = t, l('Decoded value ' + JSON.stringify(n)), n; + } + }(e) : void 0; + }, + getId: function () { + l('Creating UID 2.0'); + var e = (c.cookiesAreEnabled() ? c.getCookie(a) : null) || (c.localStorageIsEnabled() ? c.getDataFromLocalStorage(a) : null); + return l('The advertising token: ' + e), { id: e }; + } + }; + Object(o.e)('userId', v); + } + }, [920]); + pbjsChunk([91], { + 928: function (r, e, t) { + r.exports = t(929); + }, + 929: function (r, e, t) { + 'use strict'; + Object.defineProperty(e, '__esModule', { value: !0 }), t.d(e, 'unifiedIdSubmodule', function () { + return u; + }); + var o = t(0), i = t(4), n = t(11), d = 'unifiedId', u = { + name: d, + gvlid: 21, + decode: function (r) { + return r && 'string' == typeof r.TDID ? { tdid: r.TDID } : void 0; + }, + getId: function (r) { + var e = r && r.params || {}; + if (e && ('string' == typeof e.partner || 'string' == typeof e.url)) { + var n = e.url || 'https://match.adsrvr.org/track/rid?ttd_pid='.concat(e.partner, '&fmt=json'); + return { + callback: function (t) { + var r = { + success: function (r) { + var e; + if (r) + try { + e = JSON.parse(r); + } catch (r) { + o.logError(r); + } + t(e); + }, + error: function (r) { + o.logError(''.concat(d, ': ID fetch encountered an error'), r), t(); + } + }; + Object(i.a)(n, r, void 0, { + method: 'GET', + withCredentials: !0 + }); + } + }; + } + o.logError('User ID - unifiedId submodule requires either partner or url to be defined'); + } + }; + Object(n.e)('userId', u); + } + }, [928]); + pbjsChunk([6], { + 19: function (e, t, n) { + 'use strict'; + t.b = function (e) { + var t = []; + for (var n in e) { + var r; + e.hasOwnProperty(n) && ('pubProvidedId' === n ? t = t.concat(e.pubProvidedId) : (r = function (e, t) { + var n = s[t]; + if (n && e) { + var r = {}; + r.source = n.source; + var o = u.isFn(n.getValue) ? n.getValue(e) : e; + if (u.isStr(o)) { + var i, a, c = { + id: o, + atype: n.atype + }; + return !u.isFn(n.getUidExt) || (i = n.getUidExt(e)) && (c.ext = i), r.uids = [c], !u.isFn(n.getEidExt) || (a = n.getEidExt(e)) && (r.ext = a), r; + } + } + return null; + }(e[n], n)) && t.push(r)); + } + return t; + }, t.a = function (e) { + var n = []; + return e.filter(function (e) { + return u.isPlainObject(e.idObj) && Object.keys(e.idObj).length; + }).forEach(function (t) { + Object.keys(t.idObj).forEach(function (e) { + u.deepAccess(t, 'config.bidders') && Array.isArray(t.config.bidders) && u.deepAccess(s, e + '.source') && n.push({ + source: s[e].source, + bidders: t.config.bidders + }); + }); + }), n; + }; + var u = n(0), s = { + intentIqId: { + source: 'intentiq.com', + atype: 1 + }, + pubcid: { + source: 'pubcid.org', + atype: 1 + }, + tdid: { + source: 'adserver.org', + atype: 1, + getUidExt: function () { + return { rtiPartner: 'TDID' }; + } + }, + id5id: { + getValue: function (e) { + return e.uid; + }, + source: 'id5-sync.com', + atype: 1, + getUidExt: function (e) { + if (e.ext) + return e.ext; + } + }, + parrableId: { + source: 'parrable.com', + atype: 1, + getValue: function (e) { + return e.eid ? e.eid : e.ccpaOptout ? '' : null; + }, + getUidExt: function (e) { + var t = u.pick(e, [ + 'ibaOptout', + 'ccpaOptout' + ]); + if (Object.keys(t).length) + return t; + } + }, + idl_env: { + source: 'liveramp.com', + atype: 3 + }, + lipb: { + getValue: function (e) { + return e.lipbid; + }, + source: 'liveintent.com', + atype: 3, + getEidExt: function (e) { + if (Array.isArray(e.segments) && e.segments.length) + return { segments: e.segments }; + } + }, + britepoolid: { + source: 'britepool.com', + atype: 3 + }, + lotamePanoramaId: { + source: 'crwdcntrl.net', + atype: 1 + }, + criteoId: { + source: 'criteo.com', + atype: 1 + }, + merkleId: { + source: 'merkleinc.com', + atype: 3, + getValue: function (e) { + return e.id; + }, + getUidExt: function (e) { + return e && e.keyID ? { keyID: e.keyID } : void 0; + } + }, + netId: { + source: 'netid.de', + atype: 1 + }, + sharedid: { + source: 'sharedid.org', + atype: 1, + getValue: function (e) { + return e.id; + }, + getUidExt: function (e) { + return e && e.third ? { third: e.third } : void 0; + } + }, + IDP: { + source: 'zeotap.com', + atype: 1 + }, + haloId: { + source: 'audigent.com', + atype: 1 + }, + quantcastId: { + source: 'quantcast.com', + atype: 1 + }, + nextrollId: { + source: 'nextroll.com', + atype: 1 + }, + idx: { + source: 'idx.lat', + atype: 1 + }, + connectid: { + source: 'verizonmedia.com', + atype: 3 + }, + fabrickId: { + source: 'neustar.biz', + atype: 1 + }, + mwOpenLinkId: { + source: 'mediawallahscript.com', + atype: 1 + }, + tapadId: { + source: 'tapad.com', + atype: 1 + }, + novatiq: { + getValue: function (e) { + return e.snowflake; + }, + source: 'novatiq.com', + atype: 1 + }, + uid2: { + source: 'uidapi.com', + atype: 3, + getValue: function (e) { + return e.id; + } + }, + deepintentId: { + source: 'deepintent.com', + atype: 3 + }, + admixerId: { + source: 'admixer.net', + atype: 3 + } + }; + }, + 932: function (e, t, n) { + e.exports = n(933); + }, + 933: function (e, t, n) { + 'use strict'; + Object.defineProperty(t, '__esModule', { value: !0 }), n.d(t, 'PBJS_USER_ID_OPTOUT_NAME', function () { + return A; + }), n.d(t, 'coreStorage', function () { + return w; + }), n.d(t, 'syncDelay', function () { + return O; + }), n.d(t, 'auctionDelay', function () { + return I; + }), t.setSubmoduleRegistry = function (e) { + T = e; + }, t.setStoredValue = P, t.setStoredConsentData = q, t.findRootDomain = R, t.requestBidsHook = G, n.d(t, 'validateGdprEnforcement', function () { + return Q; + }), t.attachIdSystem = Z, t.init = ee; + var r = n(10), o = n.n(r), i = n(3), a = n(9), c = n.n(a), l = n(0), u = n(17), d = n(8), s = n(5), f = n.n(s), g = n(11), p = n(19), m = n(7); + function b(e, t) { + var n; + if ('undefined' == typeof Symbol || null == e[Symbol.iterator]) { + if (Array.isArray(e) || (n = function (e, t) { + if (!e) + return; + if ('string' == typeof e) + return y(e, t); + var n = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === n && e.constructor && (n = e.constructor.name); + if ('Map' === n || 'Set' === n) + return Array.from(e); + if ('Arguments' === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return y(e, t); + }(e)) || t && e && 'number' == typeof e.length) { + n && (e = n); + var r = 0, o = function () { + }; + return { + s: o, + n: function () { + return r >= e.length ? { done: !0 } : { + done: !1, + value: e[r++] + }; + }, + e: function (e) { + throw e; + }, + f: o + }; + } + throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + var i, a = !0, c = !1; + return { + s: function () { + n = e[Symbol.iterator](); + }, + n: function () { + var e = n.next(); + return a = e.done, e; + }, + e: function (e) { + c = !0, i = e; + }, + f: function () { + try { + a || null == n.return || n.return(); + } finally { + if (c) + throw i; + } + } + }; + } + function y(e, t) { + (null == t || t > e.length) && (t = e.length); + for (var n = 0, r = new Array(t); n < t; n++) + r[n] = e[n]; + return r; + } + var v, h, O, I, j = 'User ID', k = 'cookie', E = 'html5', S = 500, D = 0, x = { + name: '_pbjs_userid_consent_data', + expires: 30 + }, A = '_pbjs_id_optout', w = Object(m.a)('userid'), C = [], U = !1, _ = [], V = [], T = []; + function P(e, t) { + var n = e.config.storage, r = 'function' == typeof e.submodule.domainOverride ? e.submodule.domainOverride() : null; + try { + var o = l.isPlainObject(t) ? JSON.stringify(t) : t, i = new Date(Date.now() + 86400000 * n.expires).toUTCString(); + n.type === k ? (w.setCookie(n.name, o, i, 'Lax', r), 'number' == typeof n.refreshInSeconds && w.setCookie(''.concat(n.name, '_last'), new Date().toUTCString(), i, 'Lax', r)) : n.type === E && (w.setDataInLocalStorage(''.concat(n.name, '_exp'), i), w.setDataInLocalStorage(n.name, encodeURIComponent(o)), 'number' == typeof n.refreshInSeconds && w.setDataInLocalStorage(''.concat(n.name, '_last'), new Date().toUTCString())); + } catch (e) { + l.logError(e); + } + } + function L(e, t) { + var n, r, o = 1 < arguments.length && void 0 !== t ? t : void 0, i = o ? ''.concat(e.name, '_').concat(o) : e.name; + try { + e.type === k ? n = w.getCookie(i) : e.type === E && ('' === (r = w.getDataFromLocalStorage(''.concat(e.name, '_exp'))) ? n = w.getDataFromLocalStorage(i) : r && 0 < new Date(r).getTime() - Date.now() && (n = decodeURIComponent(w.getDataFromLocalStorage(i)))), 'string' == typeof n && '{' === n.trim().charAt(0) && (n = JSON.parse(n)); + } catch (e) { + l.logError(e); + } + return n; + } + function N(e) { + var t = { + consentString: '', + gdprApplies: !1, + apiVersion: 0 + }; + return e && (t.consentString = e.consentString, t.gdprApplies = e.gdprApplies, t.apiVersion = e.apiVersion), l.cyrb53Hash(JSON.stringify(t)); + } + function q(e) { + try { + var t = new Date(Date.now() + 86400000 * x.expires).toUTCString(); + w.setCookie(x.name, N(e), t, 'Lax'); + } catch (e) { + l.logError(e); + } + } + function F() { + try { + return w.getCookie(x.name); + } catch (e) { + l.logError(e); + } + } + function M(e) { + if (e && 'boolean' == typeof e.gdprApplies && e.gdprApplies) { + if (!e.consentString) + return; + if (1 === e.apiVersion && !1 === l.deepAccess(e, 'vendorData.purposeConsents.1')) + return; + if (2 === e.apiVersion && !1 === l.deepAccess(e, 'vendorData.purpose.consents.1')) + return; + } + return 1; + } + function R() { + var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : window.location.hostname; + if (!w.cookiesAreEnabled()) + return e; + var t, n, r = e.split('.'); + if (2 == r.length) + return e; + var o = -2, i = '_rdc'.concat(Date.now()), a = 'writeable'; + do { + t = r.slice(o).join('.'); + var c = new Date(l.timestamp() + 10000).toUTCString(); + w.setCookie(i, a, c, 'Lax', t, void 0), w.getCookie(i, void 0) === a ? (n = !1, w.setCookie(i, '', 'Thu, 01 Jan 1970 00:00:01 GMT', void 0, t, void 0)) : (o += -1, n = Math.abs(o) <= r.length); + } while (n); + return t; + } + function J(e, t) { + var n = function () { + }; + t && (n = l.delayExecution(function () { + clearTimeout(h), t(); + }, e.length)), e.forEach(function (t) { + t.callback(function (e) { + e ? (t.config.storage && P(t, e), t.idObj = t.submodule.decode(e, t.config)) : l.logInfo(''.concat(j, ': ').concat(t.submodule.name, ' - request id responded with an empty value')), n(); + }), t.callback = void 0; + }); + } + function H(e) { + return Array.isArray(e) && e.length ? e.filter(function (e) { + return l.isPlainObject(e.idObj) && Object.keys(e.idObj).length; + }).reduce(function (t, n) { + return Object.keys(n.idObj).forEach(function (e) { + t[e] = n.idObj[e]; + }), t; + }, {}) : {}; + } + function z(e, o) { + [e].some(function (e) { + return !Array.isArray(e) || !e.length; + }) || e.forEach(function (e) { + e.bids && l.isArray(e.bids) && e.bids.forEach(function (e) { + var t, n, r = (t = o, n = e.bidder, Array.isArray(t) && t.length && n ? t.filter(function (e) { + return !e.config.bidders || !l.isArray(e.config.bidders) || e.config.bidders.includes(n); + }).filter(function (e) { + return l.isPlainObject(e.idObj) && Object.keys(e.idObj).length; + }).reduce(function (t, n) { + return Object.keys(n.idObj).forEach(function (e) { + t[e] = n.idObj[e]; + }), t; + }, {}) : {}); + Object.keys(r).length && (e.userId = r, e.userIdAsEids = Object(p.b)(r)); + }); + }); + } + function B(e) { + var t, n, r, o, i, a = !1; + void 0 === v && (v = function (e, n) { + var r = F(); + q(n); + var t = Q(e, n), o = t.userIdModules; + return t.hasValidated || M(n) ? o.reduce(function (e, t) { + return X(t, n, r, !1), e.push(t), e; + }, []) : (l.logWarn(''.concat(j, ' - gdpr permission not valid for local storage or cookies, exit module')), []); + }(_, d.gdprDataHandler.getConsentData())).length && (o = v, 'function' == typeof (i = Object(l.getPrebidInternal)().setEidPermissions) && l.isArray(o) && i(Object(p.a)(o)), (t = v.filter(function (e) { + return l.isFn(e.callback); + })).length && (e && 0 < I ? (n = !(a = !0), r = function () { + n || (n = !0, e()); + }, l.logInfo(''.concat(j, ' - auction delayed by ').concat(I, ' at most to fetch ids')), h = setTimeout(r, I), J(t, r)) : c.a.on(f.a.EVENTS.AUCTION_END, function e() { + c.a.off(f.a.EVENTS.AUCTION_END, e), 0 < O ? setTimeout(function () { + J(t); + }, O) : J(t); + }))), e && !a && e(); + } + function G(e, t) { + B(function () { + z(t.adUnits || Object(u.a)().adUnits, v), e.call(this, t); + }); + } + function W() { + return B(), H(v); + } + function $() { + return B(), Object(p.b)(H(v)); + } + function K(e, u) { + var s = (s = e ? e.submoduleNames : null) || []; + B(function () { + var e = d.gdprDataHandler.getConsentData(), t = F(); + q(e); + var n = Q(_, e), r = n.userIdModules; + if (n.hasValidated || M(e)) { + var o, i = [], a = b(r); + try { + for (a.s(); !(o = a.n()).done;) { + var c = o.value; + 0 < s.length && -1 === s.indexOf(c.submodule.name) || (l.logInfo(''.concat(j, ' - refreshing ').concat(c.submodule.name)), X(c, e, t, !0), l.isFn(c.callback) && i.push(c)); + } + } catch (e) { + a.e(e); + } finally { + a.f(); + } + 0 < i.length && J(i), u && u(); + } else + l.logWarn(''.concat(j, ' - gdpr permission not valid for local storage or cookies, exit module')); + }); + } + var Q = Object(g.b)('sync', function (e, t) { + return { + userIdModules: e, + hasValidated: t && t.hasValidated + }; + }, 'validateGdprEnforcement'); + function X(e, t, n, r) { + var o, i, a, c, u, s, d; + e.config.storage ? (o = L(e.config.storage), c = !1, 'number' == typeof e.config.storage.refreshInSeconds && (c = (a = new Date(L(e.config.storage, 'last'))) && Date.now() - a.getTime() > 1000 * e.config.storage.refreshInSeconds), !o || c || r || (d = t, null != (s = n) && s !== N(d)) ? i = e.submodule.getId(e.config, t, o) : 'function' == typeof e.submodule.extendId && (i = e.submodule.extendId(e.config, t, o)), l.isPlainObject(i) && (i.id && (P(e, i.id), o = i.id), 'function' == typeof i.callback && (e.callback = i.callback)), o && (e.idObj = e.submodule.decode(o, e.config))) : e.config.value ? e.idObj = e.config.value : (u = e.submodule.getId(e.config, t, void 0), l.isPlainObject(u) && ('function' == typeof u.callback && (e.callback = u.callback), u.id && (e.idObj = e.submodule.decode(u.id, e.config)))); + } + function Y() { + var e, n, t, r = (e = V, n = C, Array.isArray(e) ? e.reduce(function (e, t) { + return !t || l.isEmptyStr(t.name) || (!t.storage || l.isEmptyStr(t.storage.type) || l.isEmptyStr(t.storage.name) || -1 === n.indexOf(t.storage.type)) && !l.isPlainObject(t.value) && (t.storage || t.value) || e.push(t), e; + }, []) : []); + r.length && (t = T.filter(function (t) { + return !o()(_, function (e) { + return e.name === t.name; + }); + }), _ = t.map(function (t) { + var e = o()(r, function (e) { + return e.name && e.name.toLowerCase() === t.name.toLowerCase(); + }); + return e && t.name !== e.name && (e.name = t.name), t.findRootDomain = R, e ? { + submodule: t, + config: e, + callback: void 0, + idObj: void 0 + } : null; + }).filter(function (e) { + return null !== e; + }), !U && _.length && (Object(u.a)().requestBids.before(G, 40), l.logInfo(''.concat(j, ' - usersync config updated for ').concat(_.length, ' submodules: '), _.map(function (e) { + return e.submodule.name; + })), U = !0)); + } + function Z(t) { + o()(T, function (e) { + return e.name === t.name; + }) || (T.push(t), Y()); + } + function ee(e) { + _ = [], U = !(V = []), v = void 0, -1 !== (C = [ + w.localStorageIsEnabled() ? E : null, + w.cookiesAreEnabled() ? k : null + ].filter(function (e) { + return null !== e; + })).indexOf(k) && w.getCookie(A) ? l.logInfo(''.concat(j, ' - opt-out cookie found, exit module')) : -1 !== C.indexOf(E) && w.getDataFromLocalStorage(A) ? l.logInfo(''.concat(j, ' - opt-out localStorage found, exit module')) : (e.getConfig(function (e) { + var t = e.userSync; + t && t.userIds && (V = t.userIds, O = l.isNumber(t.syncDelay) ? t.syncDelay : S, I = l.isNumber(t.auctionDelay) ? t.auctionDelay : D, Y()); + }), Object(u.a)().getUserIds = W, Object(u.a)().getUserIdsAsEids = $, Object(u.a)().refreshUserIds = K); + } + ee(i.b), Object(g.c)('userId', Z); + } + }, [932]); + pbjs.processQueue(); + }()) +} \ No newline at end of file